diff --git a/package-lock.json b/package-lock.json index 6963351e..11722175 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "amazon-connect-streams", - "version": "2.6.0", + "version": "2.6.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "amazon-connect-streams", - "version": "2.6.0", + "version": "2.6.1", "license": "Apache-2.0", "devDependencies": { "chai": "^4.3.7", diff --git a/package.json b/package.json index 590935c0..381e3ccf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amazon-connect-streams", - "version": "2.6.0", + "version": "2.6.1", "description": "Amazon Connect Streams Library", "engines": { "node": ">=12.0.0" diff --git a/release/connect-streams-dr-min.js b/release/connect-streams-dr-min.js index 4fd00269..9303a92c 100644 --- a/release/connect-streams-dr-min.js +++ b/release/connect-streams-dr-min.js @@ -1 +1 @@ -(()=>{var l;(l={772:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezgyMTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuYWdlbnRBcHA9e307dmFyIG49ImNjcCI7dC5hZ2VudEFwcC5pbml0Q0NQPXQuY29yZS5pbml0Q0NQLHQuYWdlbnRBcHAuaXNJbml0aWFsaXplZD1mdW5jdGlvbihlKXt9LHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSxvPW5ldyB0LklGcmFtZUNvbmR1aXQobix3aW5kb3csciksaT1bdC5BZ2VudEV2ZW50cy5VUERBVEUsdC5Db250YWN0RXZlbnRzLlZJRVcsdC5FdmVudFR5cGUuQUNLTk9XTEVER0UsdC5FdmVudFR5cGUuVEVSTUlOQVRFRCx0LlRhc2tFdmVudHMuQ1JFQVRFRF07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oZSl7aS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGUsKGZ1bmN0aW9uKHQpe28uc2VuZFVwc3RyZWFtKGUsdCl9KSl9KSl9KSl9O3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiY2NwLXYyIik7cmV0dXJuIGUuc2xpY2UoMCx0LTEpfTt0LmFnZW50QXBwLmluaXRBcHA9ZnVuY3Rpb24oZSxvLGkscyl7cz1zfHx7fTt2YXIgYT1pLmVuZHNXaXRoKCIvIik/aTppKyIvIixjPXMub25Mb2FkP3Mub25Mb2FkOm51bGwsdT17ZW5kcG9pbnQ6YSxzdHlsZTpzLnN0eWxlLG9uTG9hZDpjfTt0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnJlZ2lzdGVyKGUsdSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvKSksdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5zdGFydChlLChmdW5jdGlvbihvKXt2YXIgaT1vLmVuZHBvaW50LGE9by5jb250YWluZXJET007cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZT09PW4/KHMuY2NwUGFyYW1zPXMuY2NwUGFyYW1zP3MuY2NwUGFyYW1zOnt9LHMuc3R5bGUmJihzLmNjcFBhcmFtcy5zdHlsZT1zLnN0eWxlKSxmdW5jdGlvbihlLG4sbyl7dmFyIGk9e2NjcFVybDplLGNjcExvYWRUaW1lb3V0OjFlNCxsb2dpblBvcHVwOiEwLGxvZ2luVXJsOnIoZSkrIi9sb2dpbiIsc29mdHBob25lOnthbGxvd0ZyYW1lZFNvZnRwaG9uZTohMCxkaXNhYmxlUmluZ3RvbmU6ITF9fSxzPXQubWVyZ2UoaSxvLmNjcFBhcmFtcyk7dC5jb3JlLmluaXRDQ1AobixzKX0oaSxhLHMpKTp0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uKGUsaSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4gZT09PW4/KG89cihpKSsiL2xvZ291dCIsdC5mZXRjaChvLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLlRFUk1JTkFURSksITB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldExvZygpLmVycm9yKCJBbiBlcnJvciBvY2N1cmVkIG9uIGxvZ291dC4iK2UpLndpdGhFeGNlcHRpb24oZSksd2luZG93LmxvY2F0aW9uLmhyZWY9bywhMX0pKSk6bnVsbDt2YXIgb319fSkpfSx0LmFnZW50QXBwLnN0b3BBcHA9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuc3RvcChlKX19KCl9LDUwMDooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10O3ZhciBuLHI9ImNjcCI7ZS5jb25uZWN0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5PShuPXt9LHtyZWdpc3RlcjpmdW5jdGlvbihlLHQscil7bltlXT17Y29udGFpbmVyRE9NOnIsZW5kcG9pbnQ6dC5lbmRwb2ludCxzdHlsZTp0LnN0eWxlLGluc3RhbmNlOnZvaWQgMCxvbkxvYWQ6dC5vbkxvYWR9fSxzdGFydDpmdW5jdGlvbihlLHQpe2lmKG5bZV0pe3ZhciBvPW5bZV0uY29udGFpbmVyRE9NLGk9bltlXS5lbmRwb2ludCxzPW5bZV0uc3R5bGUsYT1uW2VdLm9uTG9hZDtpZihlIT09cil7dmFyIGM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7cmV0dXJuIG8uc3JjPXQsby5zdHlsZT1ufHwid2lkdGg6IDEwMCU7IGhlaWdodDoxMDAlOyIsby5pZD1lLG9bImFyaWEtbGFiZWwiXT1lLG8ub25sb2FkPXIsby5zZXRBdHRyaWJ1dGUoInNhbmRib3giLCJhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IGFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXNjcmlwdHMiKSxvfShlLGkscyxhKTtvLmFwcGVuZENoaWxkKGMpfXJldHVybiBuW2VdLmluc3RhbmNlPXQobltlXSksbltlXS5pbnN0YW5jZS5pbml0KCl9fSxzdG9wOmZ1bmN0aW9uKGUpe2lmKG5bZV0pe3ZhciB0LHI9bltlXSxvPXIuY29udGFpbmVyRE9NLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO3JldHVybiByLmNvbnRhaW5lckRPTS5yZW1vdmVDaGlsZChvKSxyLmluc3RhbmNlJiYodD1yLmluc3RhbmNlLmRlc3Ryb3koKSxkZWxldGUgci5pbnN0YW5jZSksdH19fSl9KCl9LDk2NTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuQWdlbnRTdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJyb3V0YWJsZSIsIm5vdF9yb3V0YWJsZSIsIm9mZmxpbmUiXSksdC5BZ2VudFN0YXR1c1R5cGU9dC5BZ2VudFN0YXRlVHlwZSx0LkFnZW50QXZhaWxTdGF0ZXM9dC5tYWtlRW51bShbIkluaXQiLCJCdXN5IiwiQWZ0ZXJDYWxsV29yayIsIkNhbGxpbmdDdXN0b21lciIsIkRpYWxpbmciLCJKb2luaW5nIiwiUGVuZGluZ0F2YWlsYWJsZSIsIlBlbmRpbmdCdXN5Il0pLHQuQWdlbnRFcnJvclN0YXRlcz10Lm1ha2VFbnVtKFsiRXJyb3IiLCJBZ2VudEh1bmdVcCIsIkJhZEFkZHJlc3NBZ2VudCIsIkJhZEFkZHJlc3NDdXN0b21lciIsIkRlZmF1bHQiLCJGYWlsZWRDb25uZWN0QWdlbnQiLCJGYWlsZWRDb25uZWN0Q3VzdG9tZXIiLCJJbnZhbGlkTG9jYWxlIiwiTGluZUVuZ2FnZWRBZ2VudCIsIkxpbmVFbmdhZ2VkQ3VzdG9tZXIiLCJNaXNzZWRDYWxsQWdlbnQiLCJNaXNzZWRDYWxsQ3VzdG9tZXIiLCJNdWx0aXBsZUNjcFdpbmRvd3MiLCJSZWFsdGltZUNvbW11bmljYXRpb25FcnJvciJdKSx0LkVuZHBvaW50VHlwZT10Lm1ha2VFbnVtKFsicGhvbmVfbnVtYmVyIiwiYWdlbnQiLCJxdWV1ZSJdKSx0LkFkZHJlc3NUeXBlPXQuRW5kcG9pbnRUeXBlLHQuQ29ubmVjdGlvblR5cGU9dC5tYWtlRW51bShbImFnZW50IiwiaW5ib3VuZCIsIm91dGJvdW5kIiwibW9uaXRvcmluZyJdKSx0LkNvbm5lY3Rpb25TdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwiaG9sZCIsImRpc2Nvbm5lY3RlZCJdKSx0LkNvbm5lY3Rpb25TdGF0dXNUeXBlPXQuQ29ubmVjdGlvblN0YXRlVHlwZSx0LkNPTk5FQ1RJT05fQUNUSVZFX1NUQVRFUz10LnNldChbdC5Db25uZWN0aW9uU3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db25uZWN0aW9uU3RhdGVUeXBlLkNPTk5FQ1RFRCx0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuSE9MRF0pLHQuQ09OTkVDVElPTl9DT05ORUNURURfU1RBVEVTPXQuc2V0KFt0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVEVEXSksdC5Db250YWN0U3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0IiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsIm1pc3NlZCIsImVycm9yIiwiZW5kZWQiXSksdC5Db250YWN0U3RhdHVzVHlwZT10LkNvbnRhY3RTdGF0ZVR5cGUsdC5DT05UQUNUX0FDVElWRV9TVEFURVM9dC5tYWtlRW51bShbImluY29taW5nIiwicGVuZGluZyIsImNvbm5lY3RpbmciLCJjb25uZWN0ZWQiXSksdC5Db250YWN0VHlwZT10Lm1ha2VFbnVtKFsidm9pY2UiLCJxdWV1ZV9jYWxsYmFjayIsImNoYXQiLCJ0YXNrIl0pLHQuQ29udGFjdEluaXRpYXRpb25NZXRob2Q9dC5tYWtlRW51bShbImluYm91bmQiLCJvdXRib3VuZCIsInRyYW5zZmVyIiwicXVldWVfdHJhbnNmZXIiLCJjYWxsYmFjayIsImFwaSIsImRpc2Nvbm5lY3QiXSksdC5Nb25pdG9yaW5nTW9kZT10Lm1ha2VFbnVtKFsiU0lMRU5UX01PTklUT1IiLCJCQVJHRSJdKSx0Lk1vbml0b3JpbmdFcnJvclR5cGVzPXQubWFrZUVudW0oWyJpbnZhbGlkX3RhcmdldF9zdGF0ZSJdKSx0LkNoYW5uZWxUeXBlPXQubWFrZUVudW0oWyJWT0lDRSIsIkNIQVQiLCJUQVNLIl0pLHQuTWVkaWFUeXBlPXQubWFrZUVudW0oWyJzb2Z0cGhvbmUiLCJjaGF0IiwidGFzayJdKSx0LlNvZnRwaG9uZUNhbGxUeXBlPXQubWFrZUVudW0oWyJhdWRpb192aWRlbyIsInZpZGVvX29ubHkiLCJhdWRpb19vbmx5Iiwibm9uZSJdKSx0LlNvZnRwaG9uZUVycm9yVHlwZXM9dC5tYWtlRW51bShbInVuc3VwcG9ydGVkX2Jyb3dzZXIiLCJtaWNyb3Bob25lX25vdF9zaGFyZWQiLCJzaWduYWxsaW5nX2hhbmRzaGFrZV9mYWlsdXJlIiwic2lnbmFsbGluZ19jb25uZWN0aW9uX2ZhaWx1cmUiLCJpY2VfY29sbGVjdGlvbl90aW1lb3V0IiwidXNlcl9idXN5X2Vycm9yIiwid2VicnRjX2Vycm9yIiwicmVhbHRpbWVfY29tbXVuaWNhdGlvbl9lcnJvciIsIm90aGVyIl0pLHQuQ2xpY2tUeXBlPXQubWFrZUVudW0oWyJBY2NlcHQiLCJSZWplY3QiLCJIYW5ndXAiXSksdC5Wb2ljZUlkRXJyb3JUeXBlcz10Lm1ha2VFbnVtKFsibm9fc3BlYWtlcl9pZF9mb3VuZCIsInNwZWFrZXJfaWRfbm90X2Vucm9sbGVkIiwiZ2V0X3NwZWFrZXJfaWRfZmFpbGVkIiwiZ2V0X3NwZWFrZXJfc3RhdHVzX2ZhaWxlZCIsIm9wdF9vdXRfc3BlYWtlcl9mYWlsZWQiLCJvcHRfb3V0X3NwZWFrZXJfaW5fbGNtc19mYWlsZWQiLCJkZWxldGVfc3BlYWtlcl9mYWlsZWQiLCJzdGFydF9zZXNzaW9uX2ZhaWxlZCIsImV2YWx1YXRlX3NwZWFrZXJfZmFpbGVkIiwic2Vzc2lvbl9ub3RfZXhpc3RzIiwiZGVzY3JpYmVfc2Vzc2lvbl9mYWlsZWQiLCJlbnJvbGxfc3BlYWtlcl9mYWlsZWQiLCJ1cGRhdGVfc3BlYWtlcl9pZF9mYWlsZWQiLCJ1cGRhdGVfc3BlYWtlcl9pZF9pbl9sY21zX2ZhaWxlZCIsIm5vdF9zdXBwb3J0ZWRfb25fY29uZmVyZW5jZV9jYWxscyIsImVucm9sbF9zcGVha2VyX3RpbWVvdXQiLCJldmFsdWF0ZV9zcGVha2VyX3RpbWVvdXQiLCJnZXRfZG9tYWluX2lkX2ZhaWxlZCIsIm5vX2RvbWFpbl9pZF9mb3VuZCJdKSx0LkNUSUV4Y2VwdGlvbnM9dC5tYWtlRW51bShbIkFjY2Vzc0RlbmllZEV4Y2VwdGlvbiIsIkludmFsaWRTdGF0ZUV4Y2VwdGlvbiIsIkJhZEVuZHBvaW50RXhjZXB0aW9uIiwiSW52YWxpZEFnZW50QVJORXhjZXB0aW9uIiwiSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24iLCJJbnZhbGlkQ29udGFjdFR5cGVFeGNlcHRpb24iLCJQYWdpbmF0aW9uRXhjZXB0aW9uIiwiUmVmcmVzaFRva2VuRXhwaXJlZEV4Y2VwdGlvbiIsIlNlbmREYXRhRmFpbGVkRXhjZXB0aW9uIiwiVW5hdXRob3JpemVkRXhjZXB0aW9uIiwiUXVvdGFFeGNlZWRlZEV4Y2VwdGlvbiJdKSx0LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXM9dC5tYWtlRW51bShbIk9OR09JTkciLCJFTkRFRCIsIlBFTkRJTkdfQ09ORklHVVJBVElPTiJdKSx0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJBQ0NFUFQiLCJSRUpFQ1QiLCJOT1RfRU5PVUdIX1NQRUVDSCIsIlNQRUFLRVJfTk9UX0VOUk9MTEVEIiwiU1BFQUtFUl9PUFRFRF9PVVQiLCJTUEVBS0VSX0lEX05PVF9QUk9WSURFRCIsIlNQRUFLRVJfRVhQSVJFRCJdKSx0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJOT1RfRU5PVUdIX1NQRUVDSCIsIkhJR0hfUklTSyIsIkxPV19SSVNLIl0pLHQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJBdXRoZW50aWNhdGVkIiwiTm90QXV0aGVudGljYXRlZCIsIkluY29uY2x1c2l2ZSIsIk5vdEVucm9sbGVkIiwiT3B0ZWRPdXQiLCJOb3RFbmFibGVkIiwiRXJyb3IiXSksdC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb249dC5tYWtlRW51bShbIkhpZ2hSaXNrIiwiTG93UmlzayIsIkluY29uY2x1c2l2ZSIsIk5vdEVuYWJsZWQiLCJFcnJvciJdKSx0LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cz10Lm1ha2VFbnVtKFsiTk9UX0VOT1VHSF9TUEVFQ0giLCJJTl9QUk9HUkVTUyIsIkNPTVBMRVRFRCIsIkZBSUxFRCJdKSx0LlZvaWNlSWRTcGVha2VyU3RhdHVzPXQubWFrZUVudW0oWyJPUFRFRF9PVVQiLCJFTlJPTExFRCIsIlBFTkRJTkciXSksdC5Wb2ljZUlkQ29uc3RhbnRzPXtFVkFMVUFURV9TRVNTSU9OX0RFTEFZOjFlNCxFVkFMVUFUSU9OX01BWF9QT0xMX1RJTUVTOjI0LEVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTDo1ZTMsRU5ST0xMTUVOVF9NQVhfUE9MTF9USU1FUzoxMjAsRU5ST0xMTUVOVF9QT0xMSU5HX0lOVEVSVkFMOjVlMyxTVEFSVF9TRVNTSU9OX0RFTEFZOjhlM30sdC5BZ2VudFBlcm1pc3Npb25zPXtPVVRCT1VORF9DQUxMOiJvdXRib3VuZENhbGwiLFZPSUNFX0lEOiJ2b2ljZUlkIn07dmFyIG49ZnVuY3Rpb24oKXtpZighdC5hZ2VudC5pbml0aWFsaXplZCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgYWdlbnQgaXMgbm90IHlldCBpbml0aWFsaXplZCEiKX07bi5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QWdlbnREYXRhKCl9LG4ucHJvdG90eXBlLl9jcmVhdGVDb250YWN0QVBJPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5Db250YWN0KGUuY29udGFjdElkKX0sbi5wcm90b3R5cGUub25SZWZyZXNoPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlJFRlJFU0gsZSl9LG4ucHJvdG90eXBlLm9uUm91dGFibGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuUk9VVEFCTEUsZSl9LG4ucHJvdG90eXBlLm9uTm90Um91dGFibGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuTk9UX1JPVVRBQkxFLGUpfSxuLnByb3RvdHlwZS5vbk9mZmxpbmU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuT0ZGTElORSxlKX0sbi5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5FUlJPUixlKX0sbi5wcm90b3R5cGUub25Tb2Z0cGhvbmVFcnJvcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5TT0ZUUEhPTkVfRVJST1IsZSl9LG4ucHJvdG90eXBlLm9uV2ViU29ja2V0Q29ubmVjdGlvbkxvc3Q9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuV0VCU09DS0VUX0NPTk5FQ1RJT05fTE9TVCxlKX0sbi5wcm90b3R5cGUub25XZWJTb2NrZXRDb25uZWN0aW9uR2FpbmVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0dBSU5FRCxlKX0sbi5wcm90b3R5cGUub25BZnRlckNhbGxXb3JrPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLkFDVyxlKX0sbi5wcm90b3R5cGUub25TdGF0ZUNoYW5nZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5TVEFURV9DSEFOR0UsZSl9LG4ucHJvdG90eXBlLm9uTXV0ZVRvZ2dsZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZSl9LG4ucHJvdG90eXBlLm9uTG9jYWxNZWRpYVN0cmVhbUNyZWF0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkFnZW50RXZlbnRzLkxPQ0FMX01FRElBX1NUUkVBTV9DUkVBVEVELGUpfSxuLnByb3RvdHlwZS5vblNwZWFrZXJEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLlNQRUFLRVJfREVWSUNFX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm9uTWljcm9waG9uZURldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuTUlDUk9QSE9ORV9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUub25SaW5nZXJEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLlJJTkdFUl9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUubXV0ZT1mdW5jdGlvbigpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLk1VVEUsZGF0YTp7bXV0ZTohMH19KX0sbi5wcm90b3R5cGUudW5tdXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuTVVURSxkYXRhOnttdXRlOiExfX0pfSxuLnByb3RvdHlwZS5zZXRTcGVha2VyRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfU1BFQUtFUl9ERVZJQ0UsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0sbi5wcm90b3R5cGUuc2V0TWljcm9waG9uZURldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX01JQ1JPUEhPTkVfREVWSUNFLGRhdGE6e2RldmljZUlkOmV9fSl9LG4ucHJvdG90eXBlLnNldFJpbmdlckRldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1JJTkdFUl9ERVZJQ0UsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0sbi5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LnN0YXRlfSxuLnByb3RvdHlwZS5nZXROZXh0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90Lm5leHRTdGF0ZX0sbi5wcm90b3R5cGUuZ2V0QXZhaWxhYmlsaXR5U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LmFnZW50QXZhaWxhYmlsaXR5U3RhdGV9LG4ucHJvdG90eXBlLmdldFN0YXR1cz1uLnByb3RvdHlwZS5nZXRTdGF0ZSxuLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQubm93KCktdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LnN0YXRlLnN0YXJ0VGltZXN0YW1wLmdldFRpbWUoKSt0LmNvcmUuZ2V0U2tldygpfSxuLnByb3RvdHlwZS5nZXRTdGF0dXNEdXJhdGlvbj1uLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uLG4ucHJvdG90eXBlLmdldFBlcm1pc3Npb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnBlcm1pc3Npb25zfSxuLnByb3RvdHlwZS5nZXRDb250YWN0cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3QuY29udGFjdHMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdC5fY3JlYXRlQ29udGFjdEFQSShlKX0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiFlfHx0LmdldFR5cGUoKT09PWV9KSl9LG4ucHJvdG90eXBlLmdldENvbmZpZ3VyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbmZpZ3VyYXRpb259LG4ucHJvdG90eXBlLmdldEFnZW50U3RhdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmFnZW50U3RhdGVzfSxuLnByb3RvdHlwZS5nZXRSb3V0aW5nUHJvZmlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5yb3V0aW5nUHJvZmlsZX0sbi5wcm90b3R5cGUuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuZ2V0Um91dGluZ1Byb2ZpbGUoKS5jaGFubmVsQ29uY3VycmVuY3lNYXA7cmV0dXJuIG58fChuPU9iamVjdC5rZXlzKHQuQ2hhbm5lbFR5cGUpLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4iVEFTSyIhPT1uJiYoZVt0LkNoYW5uZWxUeXBlW25dXT0xKSxlfSkse30pKSxlP25bZV18fDA6bn0sbi5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5uYW1lfSxuLnByb3RvdHlwZS5nZXRFeHRlbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZXh0ZW5zaW9ufSxuLnByb3RvdHlwZS5nZXREaWFsYWJsZUNvdW50cmllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5kaWFsYWJsZUNvdW50cmllc30sbi5wcm90b3R5cGUuaXNTb2Z0cGhvbmVFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnNvZnRwaG9uZUVuYWJsZWR9LG4ucHJvdG90eXBlLnNldENvbmZpZ3VyYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCk7ZSYmZS5hZ2VudFByZWZlcmVuY2VzJiZlLmFnZW50UHJlZmVyZW5jZXMuTEFOR1VBR0UmJiFlLmFnZW50UHJlZmVyZW5jZXMubG9jYWxlJiYoZS5hZ2VudFByZWZlcmVuY2VzLmxvY2FsZT1lLmFnZW50UHJlZmVyZW5jZXMuTEFOR1VBR0UpLGUmJmUuYWdlbnRQcmVmZXJlbmNlcyYmIXQuaXNWYWxpZExvY2FsZShlLmFnZW50UHJlZmVyZW5jZXMubG9jYWxlKT9uJiZuLmZhaWx1cmUmJm4uZmFpbHVyZSh0LkFnZW50RXJyb3JTdGF0ZXMuSU5WQUxJRF9MT0NBTEUpOnIuY2FsbCh0LkNsaWVudE1ldGhvZHMuVVBEQVRFX0FHRU5UX0NPTkZJR1VSQVRJT04se2NvbmZpZ3VyYXRpb246dC5hc3NlcnROb3ROdWxsKGUsImNvbmZpZ3VyYXRpb24iKX0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlJFTE9BRF9BR0VOVF9DT05GSUdVUkFUSU9OKSxuLnN1Y2Nlc3MmJm4uc3VjY2VzcyhlKX0sZmFpbHVyZTpuJiZuLmZhaWx1cmV9KX0sbi5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSxuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5QVVRfQUdFTlRfU1RBVEUse3N0YXRlOnQuYXNzZXJ0Tm90TnVsbChlLCJzdGF0ZSIpLGVucXVldWVOZXh0U3RhdGU6ciYmISFyLmVucXVldWVOZXh0U3RhdGV9LG4pfSxuLnByb3RvdHlwZS5vbkVucXVldWVkTmV4dFN0YXRlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLkVOUVVFVUVEX05FWFRfU1RBVEUsZSl9LG4ucHJvdG90eXBlLnNldFN0YXR1cz1uLnByb3RvdHlwZS5zZXRTdGF0ZSxuLnByb3RvdHlwZS5jb25uZWN0PWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89bmV3IHQuRW5kcG9pbnQoZSk7ZGVsZXRlIG8uZW5kcG9pbnRJZCxyLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9PVVRCT1VORF9DT05UQUNULHtlbmRwb2ludDp0LmFzc2VydE5vdE51bGwobywiZW5kcG9pbnQiKSxxdWV1ZUFSTjpuJiYobi5xdWV1ZUFSTnx8bi5xdWV1ZUlkKXx8dGhpcy5nZXRSb3V0aW5nUHJvZmlsZSgpLmRlZmF1bHRPdXRib3VuZFF1ZXVlLnF1ZXVlQVJOfSxuJiZ7c3VjY2VzczpuLnN1Y2Nlc3MsZmFpbHVyZTpuLmZhaWx1cmV9KX0sbi5wcm90b3R5cGUuZ2V0QWxsUXVldWVBUk5zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnJvdXRpbmdQcm9maWxlLnF1ZXVlcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnF1ZXVlQVJOfSkpfSxuLnByb3RvdHlwZS5nZXRFbmRwb2ludHM9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT10LmNvcmUuZ2V0Q2xpZW50KCk7dC5hc3NlcnROb3ROdWxsKG4sImNhbGxiYWNrcyIpLHQuYXNzZXJ0Tm90TnVsbChuLnN1Y2Nlc3MsImNhbGxiYWNrcy5zdWNjZXNzIik7dmFyIHM9cnx8e307cy5lbmRwb2ludHM9cy5lbmRwb2ludHN8fFtdLHMubWF4UmVzdWx0cz1zLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHQuaXNBcnJheShlKXx8KGU9W2VdKSxpLmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9FTkRQT0lOVFMse3F1ZXVlQVJOczplLG5leHRUb2tlbjpzLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOnMubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24ocil7aWYoci5uZXh0VG9rZW4pby5nZXRFbmRwb2ludHMoZSxuLHtuZXh0VG9rZW46ci5uZXh0VG9rZW4sbWF4UmVzdWx0czpzLm1heFJlc3VsdHMsZW5kcG9pbnRzOnMuZW5kcG9pbnRzLmNvbmNhdChyLmVuZHBvaW50cyl9KTtlbHNle3MuZW5kcG9pbnRzPXMuZW5kcG9pbnRzLmNvbmNhdChyLmVuZHBvaW50cyk7dmFyIGk9cy5lbmRwb2ludHMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuRW5kcG9pbnQoZSl9KSk7bi5zdWNjZXNzKHtlbmRwb2ludHM6aSxhZGRyZXNzZXM6aX0pfX0sZmFpbHVyZTpuLmZhaWx1cmV9KX0sbi5wcm90b3R5cGUuZ2V0QWRkcmVzc2VzPW4ucHJvdG90eXBlLmdldEVuZHBvaW50cyxuLnByb3RvdHlwZS5fZ2V0UmVzb3VyY2VJZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QWxsUXVldWVBUk5zKCk7Zm9yKGxldCB0IG9mIGUpe2NvbnN0IGU9dC5tYXRjaCgvXC9hZ2VudFwvKFteL10rKS8pO2lmKGUpcmV0dXJuIGVbMV19cmV0dXJuIG5ldyBFcnJvcigiQWdlbnQucHJvdG90eXBlLl9nZXRSZXNvdXJjZUlkOiBxdWV1ZUFybnMgZGlkIG5vdCBjb250YWluIGFnZW50UmVzb3VyY2VJZDogIixlKX0sbi5wcm90b3R5cGUudG9TbmFwc2hvdD1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5BZ2VudFNuYXBzaG90KHRoaXMuX2dldERhdGEoKSl9O3ZhciByPWZ1bmN0aW9uKGUpe3QuQWdlbnQuY2FsbCh0aGlzKSx0aGlzLmFnZW50RGF0YT1lfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZ2VudERhdGF9LHIucHJvdG90eXBlLl9jcmVhdGVDb250YWN0QVBJPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5Db250YWN0U25hcHNob3QoZSl9O3ZhciBvPWZ1bmN0aW9uKGUpe3RoaXMuY29udGFjdElkPWV9O28ucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuZ2V0Q29udGFjdElkKCkpfSxvLnByb3RvdHlwZS5fY3JlYXRlQ29ubmVjdGlvbkFQST1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLkNIQVQ/bmV3IHQuQ2hhdENvbm5lY3Rpb24odGhpcy5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpOnRoaXMuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5UQVNLP25ldyB0LlRhc2tDb25uZWN0aW9uKHRoaXMuY29udGFjdElkLGUuY29ubmVjdGlvbklkKTpuZXcgdC5Wb2ljZUNvbm5lY3Rpb24odGhpcy5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpfSxvLnByb3RvdHlwZS5nZXRFdmVudE5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKGUsdGhpcy5nZXRDb250YWN0SWQoKSl9LG8ucHJvdG90eXBlLm9uUmVmcmVzaD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLlJFRlJFU0gpLGUpfSxvLnByb3RvdHlwZS5vbkluY29taW5nPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuSU5DT01JTkcpLGUpfSxvLnByb3RvdHlwZS5vbkNvbm5lY3Rpbmc9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5DT05ORUNUSU5HKSxlKX0sby5wcm90b3R5cGUub25QZW5kaW5nPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUEVORElORyksZSl9LG8ucHJvdG90eXBlLm9uQWNjZXB0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCksZSl9LG8ucHJvdG90eXBlLm9uTWlzc2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuTUlTU0VEKSxlKX0sby5wcm90b3R5cGUub25FbmRlZD1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuRU5ERUQpLGUpLG4uc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQpLGUpfSxvLnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQpLGUpfSxvLnByb3RvdHlwZS5vbkFDVz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDVyksZSl9LG8ucHJvdG90eXBlLm9uQ29ubmVjdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQ09OTkVDVEVEKSxlKX0sby5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkVSUk9SKSxlKX0sby5wcm90b3R5cGUuZ2V0Q29udGFjdElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFjdElkfSxvLnByb3RvdHlwZS5nZXRPcmlnaW5hbENvbnRhY3RJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuaW5pdGlhbENvbnRhY3RJZH0sby5wcm90b3R5cGUuZ2V0SW5pdGlhbENvbnRhY3RJZD1vLnByb3RvdHlwZS5nZXRPcmlnaW5hbENvbnRhY3RJZCxvLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS50eXBlfSxvLnByb3RvdHlwZS5nZXRDb250YWN0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbnRhY3REdXJhdGlvbn0sby5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnN0YXRlfSxvLnByb3RvdHlwZS5nZXRTdGF0dXM9by5wcm90b3R5cGUuZ2V0U3RhdGUsby5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0Lm5vdygpLXRoaXMuX2dldERhdGEoKS5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpK3QuY29yZS5nZXRTa2V3KCl9LG8ucHJvdG90eXBlLmdldFN0YXR1c0R1cmF0aW9uPW8ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb24sby5wcm90b3R5cGUuZ2V0UXVldWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnF1ZXVlfSxvLnByb3RvdHlwZS5nZXRRdWV1ZVRpbWVzdGFtcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucXVldWVUaW1lc3RhbXB9LG8ucHJvdG90eXBlLmdldENvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbm5lY3Rpb25zLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5DSEFUP25ldyB0LkNoYXRDb25uZWN0aW9uKGUuY29udGFjdElkLG4uY29ubmVjdGlvbklkKTplLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuVEFTSz9uZXcgdC5UYXNrQ29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCk6bmV3IHQuVm9pY2VDb25uZWN0aW9uKGUuY29udGFjdElkLG4uY29ubmVjdGlvbklkKX0pKX0sby5wcm90b3R5cGUuZ2V0SW5pdGlhbENvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNJbml0aWFsQ29ubmVjdGlvbigpfSkpfHxudWxsfSxvLnByb3RvdHlwZS5nZXRBY3RpdmVJbml0aWFsQ29ubmVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtyZXR1cm4gbnVsbCE9ZSYmZS5pc0FjdGl2ZSgpP2U6bnVsbH0sby5wcm90b3R5cGUuZ2V0VGhpcmRQYXJ0eUNvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFlLmlzSW5pdGlhbENvbm5lY3Rpb24oKSYmZS5nZXRUeXBlKCkhPT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UfSkpfSxvLnByb3RvdHlwZS5nZXRTaW5nbGVBY3RpdmVUaGlyZFBhcnR5Q29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRoaXJkUGFydHlDb25uZWN0aW9ucygpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNBY3RpdmUoKX0pKVswXXx8bnVsbH0sby5wcm90b3R5cGUuZ2V0QWdlbnRDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0VHlwZSgpO3JldHVybiBuPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8bj09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR30pKX0sby5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubmFtZX0sby5wcm90b3R5cGUuZ2V0Q29udGFjdE1ldGFkYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0TWV0YWRhdGF9LG8ucHJvdG90eXBlLmdldERlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5kZXNjcmlwdGlvbn0sby5wcm90b3R5cGUuZ2V0UmVmZXJlbmNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucmVmZXJlbmNlc30sby5wcm90b3R5cGUuZ2V0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuYXR0cmlidXRlc30sby5wcm90b3R5cGUuZ2V0Q29udGFjdEZlYXR1cmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0RmVhdHVyZXN9LG8ucHJvdG90eXBlLmdldENoYW5uZWxDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jaGFubmVsQ29udGV4dH0sby5wcm90b3R5cGUuaXNTb2Z0cGhvbmVDYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpfSkpfSxvLnByb3RvdHlwZS5faXNJbmJvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5pbml0aWF0aW9uTWV0aG9kIT09dC5Db250YWN0SW5pdGlhdGlvbk1ldGhvZC5PVVRCT1VORH0sby5wcm90b3R5cGUuaXNJbmJvdW5kPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRJbml0aWFsQ29ubmVjdGlvbigpO3JldHVybiBlLmdldE1lZGlhVHlwZSgpPT09dC5NZWRpYVR5cGUuVEFTSz90aGlzLl9pc0luYm91bmQoKTohIWUmJmUuZ2V0VHlwZSgpPT09dC5Db25uZWN0aW9uVHlwZS5JTkJPVU5EfSxvLnByb3RvdHlwZS5pc0Nvbm5lY3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVEVEfSxvLnByb3RvdHlwZS5hY2NlcHQ9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldENsaWVudCgpLHI9dGhpcyxvPXRoaXMuZ2V0Q29udGFjdElkKCk7dC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjbGlja1R5cGU6dC5DbGlja1R5cGUuQUNDRVBULGNsaWNrVGltZToobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9KSxuLmNhbGwodC5DbGllbnRNZXRob2RzLkFDQ0VQVF9DT05UQUNULHtjb250YWN0SWQ6b30se3N1Y2Nlc3M6ZnVuY3Rpb24obil7dmFyIGk9dC5jb3JlLmdldFVwc3RyZWFtKCk7aS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsZGF0YTpuZXcgdC5Db250YWN0KG8pfSksaS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsci5nZXRDb250YWN0SWQoKSksZGF0YTpuZXcgdC5Db250YWN0KG8pfSk7dmFyIHM9bmV3IHQuQ29udGFjdChvKTt0LmlzRmlyZWZveEJyb3dzZXIoKSYmcy5pc1NvZnRwaG9uZUNhbGwoKSYmdC5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQoKSxlJiZlLnN1Y2Nlc3MmJmUuc3VjY2VzcyhuKX0sZmFpbHVyZTpmdW5jdGlvbihuLHIpe3QuZ2V0TG9nKCkuZXJyb3IoIkFjY2VwdCBDb250YWN0IGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aEV4Y2VwdGlvbihuKS53aXRoT2JqZWN0KHtkYXRhOnJ9KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNvbnRhY3RBY2NlcHRGYWlsdXJlIixkYXRhOntjb3VudDoxfX0pLGUmJmUuZmFpbHVyZSYmZS5mYWlsdXJlKHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUil9fSl9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0LmdldExvZygpLndhcm4oImNvbnRhY3QuZGVzdHJveSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9LG8ucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7dC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjbGlja1R5cGU6dC5DbGlja1R5cGUuUkVKRUNULGNsaWNrVGltZToobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9KSxuLmNhbGwodC5DbGllbnRNZXRob2RzLlJFSkVDVF9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLmNvbXBsZXRlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DT01QTEVURV9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DTEVBUl9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLm5vdGlmeUlzc3VlPWZ1bmN0aW9uKGUsbixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuTk9USUZZX0NPTlRBQ1RfSVNTVUUse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGlzc3VlQ29kZTplLGRlc2NyaXB0aW9uOm59LHIpfSxvLnByb3RvdHlwZS5hZGRDb25uZWN0aW9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89bmV3IHQuRW5kcG9pbnQoZSk7ZGVsZXRlIG8uZW5kcG9pbnRJZCxyLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9BRERJVElPTkFMX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGVuZHBvaW50Om99LG4pfSxvLnByb3RvdHlwZS50b2dnbGVBY3RpdmVDb25uZWN0aW9ucz1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCkscj1udWxsLG89dC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29ubmVjdGlvblN0YXRlVHlwZS5IT0xEfSkpO2lmKG51bGwhPW8pcj1vLmdldENvbm5lY3Rpb25JZCgpO2Vsc2V7dmFyIGk9dGhpcy5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNBY3RpdmUoKX0pKTtpLmxlbmd0aD4wJiYocj1pWzBdLmdldENvbm5lY3Rpb25JZCgpKX1uLmNhbGwodC5DbGllbnRNZXRob2RzLlRPR0dMRV9BQ1RJVkVfQ09OTkVDVElPTlMse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDpyfSxlKX0sby5wcm90b3R5cGUuc2VuZFNvZnRwaG9uZU1ldHJpY3M9ZnVuY3Rpb24obixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9NRVRSSUNTLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOm59LHIpLHQucHVibGlzaFNvZnRwaG9uZVN0YXRzKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixzdGF0czpufSl9LG8ucHJvdG90eXBlLnNlbmRTb2Z0cGhvbmVSZXBvcnQ9ZnVuY3Rpb24obixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9SRVBPUlQse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNjcFZlcnNpb246ZS5jY3BWZXJzaW9uLHJlcG9ydDpufSxyKX0sby5wcm90b3R5cGUuY29uZmVyZW5jZUNvbm5lY3Rpb25zPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DT05GRVJFTkNFX0NPTk5FQ1RJT05TLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLnRvU25hcHNob3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuQ29udGFjdFNuYXBzaG90KHRoaXMuX2dldERhdGEoKSl9LG8ucHJvdG90eXBlLmlzTXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb250YWN0RmVhdHVyZXMoKTtyZXR1cm4hKCFlfHwhZS5tdWx0aVBhcnR5Q29uZmVyZW5jZUVuYWJsZWQpfSxvLnByb3RvdHlwZS51cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZT1mdW5jdGlvbihlLG4pe2UmJk9iamVjdC52YWx1ZXModC5Nb25pdG9yaW5nTW9kZSkuaW5jbHVkZXMoZS50b1VwcGVyQ2FzZSgpKT90LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuVVBEQVRFX01PTklUT1JfUEFSVElDSVBBTlRfU1RBVEUse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLHRhcmdldE1vbml0b3JNb2RlOmUudG9VcHBlckNhc2UoKX0sbik6KHQuZ2V0TG9nKCkuZXJyb3IoYEludmFsaWQgdGFyZ2V0IHN0YXRlIHdhcyBwcm92aWRlZDogJHtlfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbiYmbi5mYWlsdXJlJiZuLmZhaWx1cmUodC5Nb25pdG9yaW5nRXJyb3JUeXBlcy5JTlZBTElEX1RBUkdFVF9TVEFURSkpfSxvLnByb3RvdHlwZS5pc1VuZGVyU3VwZXJ2aXNpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChlPT5lLmdldFR5cGUoKSE9PXQuQ29ubmVjdGlvblR5cGUuQUdFTlQpKTtyZXR1cm4gdm9pZCAwIT09KGUmJmUuZmluZCgoZT0+ZS5pc0JhcmdlKCkmJmUuaXNBY3RpdmUoKSkpKX07dmFyIGk9ZnVuY3Rpb24oZSl7dC5Db250YWN0LmNhbGwodGhpcyxlLmNvbnRhY3RJZCksdGhpcy5jb250YWN0RGF0YT1lfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWN0RGF0YX0saS5wcm90b3R5cGUuX2NyZWF0ZUNvbm5lY3Rpb25BUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkNvbm5lY3Rpb25TbmFwc2hvdChlKX07dmFyIHM9ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbnRhY3RJZD1lLHRoaXMuY29ubmVjdGlvbklkPXQsdGhpcy5faW5pdE1lZGlhQ29udHJvbGxlcigpfTtzLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb25uZWN0aW9uRGF0YSh0aGlzLmdldENvbnRhY3RJZCgpLHRoaXMuZ2V0Q29ubmVjdGlvbklkKCkpfSxzLnByb3RvdHlwZS5nZXRDb250YWN0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWN0SWR9LHMucHJvdG90eXBlLmdldENvbm5lY3Rpb25JZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JZH0scy5wcm90b3R5cGUuZ2V0RW5kcG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuRW5kcG9pbnQodGhpcy5fZ2V0RGF0YSgpLmVuZHBvaW50KX0scy5wcm90b3R5cGUuZ2V0QWRkcmVzcz1zLnByb3RvdHlwZS5nZXRFbmRwb2ludCxzLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc3RhdGV9LHMucHJvdG90eXBlLmdldFN0YXR1cz1zLnByb3RvdHlwZS5nZXRTdGF0ZSxzLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQubm93KCktdGhpcy5fZ2V0RGF0YSgpLnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCkrdC5jb3JlLmdldFNrZXcoKX0scy5wcm90b3R5cGUuZ2V0U3RhdHVzRHVyYXRpb249cy5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbixzLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS50eXBlfSxzLnByb3RvdHlwZS5pc0luaXRpYWxDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5pbml0aWFsfSxzLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTLHRoaXMuZ2V0U3RhdHVzKCkudHlwZSl9LHMucHJvdG90eXBlLmlzQ29ubmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29udGFpbnModC5DT05ORUNUSU9OX0NPTk5FQ1RFRF9TVEFURVMsdGhpcy5nZXRTdGF0dXMoKS50eXBlKX0scy5wcm90b3R5cGUuaXNDb25uZWN0aW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNUSU5HfSxzLnByb3RvdHlwZS5pc09uSG9sZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuSE9MRH0scy5wcm90b3R5cGUuZ2V0U29mdHBob25lTWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LHMucHJvdG90eXBlLmdldE1vbml0b3JJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yaW5nSW5mb30scy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihlKXt0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGEoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNsaWNrVHlwZTp0LkNsaWNrVHlwZS5IQU5HVVAsY2xpY2tUaW1lOihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKX0pLHQuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5ERVNUUk9ZX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0scy5wcm90b3R5cGUuc2VuZERpZ2l0cz1mdW5jdGlvbihlLG4pe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX0RJR0lUUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCksZGlnaXRzOmV9LG4pfSxzLnByb3RvdHlwZS5ob2xkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5IT0xEX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0scy5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5SRVNVTUVfQ09OTkVDVElPTix7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxzLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkNvbm5lY3Rpb25TbmFwc2hvdCh0aGlzLl9nZXREYXRhKCkpfSxzLnByb3RvdHlwZS5faW5pdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3RoaXMuZ2V0TWVkaWFJbmZvKCkmJnQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpLmNhdGNoKChmdW5jdGlvbigpe30pKX0scy5wcm90b3R5cGUuX2lzQWdlbnRDb25uZWN0aW9uVHlwZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VHlwZSgpO3JldHVybiBlPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8ZT09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR30scy5wcm90b3R5cGUuX2lzQWdlbnRDb25uZWN0aW9uVHlwZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VHlwZSgpO3JldHVybiBlPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8ZT09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR307dmFyIGE9ZnVuY3Rpb24oZSl7dGhpcy5jb250YWN0SWQ9ZX07YS5wcm90b3R5cGUuZ2V0U3BlYWtlcklkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2NvbnN0IGk9e2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxhd3NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCl9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlcklkIGNhbGxlZCIpLndpdGhPYmplY3QoaSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuR0VUX0NPTlRBQ1QsaSx7c3VjY2VzczpmdW5jdGlvbihlKXtpZihlLmNvbnRhY3REYXRhLmN1c3RvbWVySWQpe3ZhciBuPXtzcGVha2VySWQ6ZS5jb250YWN0RGF0YS5jdXN0b21lcklkfTt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJJZCBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihuKX1lbHNle3ZhciBpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuTk9fU1BFQUtFUl9JRF9GT1VORCwiTm8gc3BlYWtlcklkIGFzc290aWF0ZWQgd2l0aCB0aGlzIGNhbGwiKTtvKGkpfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJHZXQgU3BlYWtlcklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9TUEVBS0VSX0lEX0ZBSUxFRCwiR2V0IFNwZWFrZXJJZCBmYWlsZWQiLGUpO28obil9fSl9KSl9LGEucHJvdG90eXBlLmdldFNwZWFrZXJTdGF0dXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcz17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChpLnNwZWFrZXJJZCwic3BlYWtlcklkIiksRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VyU3RhdHVzIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuREVTQ1JJQkVfU1BFQUtFUixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlclN0YXR1cyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt2YXIgbj1KU09OLnBhcnNlKGUpO3N3aXRjaChuLnN0YXR1cyl7Y2FzZSA0MDA6Y2FzZSA0MDQ6dmFyIGk9bjtpLnR5cGU9aS50eXBlP2kudHlwZTp0LlZvaWNlSWRFcnJvclR5cGVzLlNQRUFLRVJfSURfTk9UX0VOUk9MTEVELHQuZ2V0TG9nKCkuaW5mbygiU3BlYWtlciBpcyBub3QgZW5yb2xsZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKGkpO2JyZWFrO2RlZmF1bHQ6dC5nZXRMb2coKS5lcnJvcigiZ2V0U3BlYWtlclN0YXR1cyBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHM9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5HRVRfU1BFQUtFUl9TVEFUVVNfRkFJTEVELCJHZXQgU3BlYWtlclN0YXR1cyBmYWlsZWQiLGUpO28ocyl9fX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5fb3B0T3V0U3BlYWtlckluTGNtcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpe2NvbnN0IGE9e0NvbnRhY3RJZDpyLmNvbnRhY3RJZCxJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxBV1NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksQ3VzdG9tZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksVm9pY2VJZFJlc3VsdDp7U3BlYWtlck9wdGVkT3V0OiEwLGdlbmVyYXRlZFNwZWFrZXJJZDpufX07dC5nZXRMb2coKS5pbmZvKCJfb3B0T3V0U3BlYWtlckluTGNtcyBjYWxsZWQiKS53aXRoT2JqZWN0KGEpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksby5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlVQREFURV9WT0lDRV9JRF9EQVRBLGEse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJvcHRPdXRTcGVha2VySW5MY21zIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIm9wdE91dFNwZWFrZXJJbkxjbXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuT1BUX09VVF9TUEVBS0VSX0lOX0xDTVNfRkFJTEVELCJvcHRPdXRTcGVha2VySW5MY21zIGZhaWxlZCIsZSk7cyhuKX19KX0pKX0sYS5wcm90b3R5cGUub3B0T3V0U3BlYWtlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihzKXt2YXIgYT1pLnNwZWFrZXJJZDtjb25zdCBjPXtTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKGEsInNwZWFrZXJJZCIpLERvbWFpbklkOnN9O3QuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlciBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLk9QVF9PVVRfU1BFQUtFUixjLHtzdWNjZXNzOmZ1bmN0aW9uKG4pe2UuX29wdE91dFNwZWFrZXJJbkxjbXMoYSxuLmdlbmVyYXRlZFNwZWFrZXJJZCkuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpLHQuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihuKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJvcHRPdXRTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk9QVF9PVVRfU1BFQUtFUl9GQUlMRUQsIm9wdE91dFNwZWFrZXIgZmFpbGVkLiIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuZGVsZXRlU3BlYWtlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCBzPXtTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKGkuc3BlYWtlcklkLCJzcGVha2VySWQiKSxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImRlbGV0ZVNwZWFrZXIgY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5ERUxFVEVfU1BFQUtFUixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZGVsZXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJkZWxldGVTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkRFTEVURV9TUEVBS0VSX0ZBSUxFRCwiZGVsZXRlU3BlYWtlciBmYWlsZWQuIixlKTtvKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5zdGFydFNlc3Npb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2NvbnN0IHM9e2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxjdXN0b21lckFjY291bnRJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBV1NBY2NvdW50SWQoKSxjbGllbnRUb2tlbjpBV1MudXRpbC51dWlkLnY0KCksZG9tYWluSWQ6aX07dC5nZXRMb2coKS5pbmZvKCJzdGFydFNlc3Npb24gY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5TVEFSVF9WT0lDRV9JRF9TRVNTSU9OLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoZS5zZXNzaW9uSWQpcihlKTtlbHNle3QuZ2V0TG9nKCkuZXJyb3IoInN0YXJ0Vm9pY2VJZFNlc3Npb24gZmFpbGVkLCBubyBzZXNzaW9uIGlkIHJldHVybmVkIikud2l0aE9iamVjdCh7ZGF0YTplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNUQVJUX1NFU1NJT05fRkFJTEVELCJObyBzZXNzaW9uIGlkIHJldHVybmVkIGZyb20gc3RhcnQgc2Vzc2lvbiBhcGkiKTtvKG4pfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzdGFydFZvaWNlSWRTZXNzaW9uIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNUQVJUX1NFU1NJT05fRkFJTEVELCJzdGFydFZvaWNlSWRTZXNzaW9uIGZhaWxlZCIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuZXZhbHVhdGVTcGVha2VyPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7bi5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpLGk9MDtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHMsYSl7ZnVuY3Rpb24gYygpe24uZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCB1PXtTZXNzaW9uTmFtZU9ySWQ6by5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBjYWxsZWQiKS53aXRoT2JqZWN0KHUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkVWQUxVQVRFX1NFU1NJT04sdSx7c3VjY2VzczpmdW5jdGlvbihlKXtpZigrK2k8dC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fTUFYX1BPTExfVElNRVMpaWYoZS5TdHJlYW1pbmdTdGF0dXM9PT10LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXMuUEVORElOR19DT05GSUdVUkFUSU9OKXNldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVElPTl9QT0xMSU5HX0lOVEVSVkFMKTtlbHNle2lmKGUuQXV0aGVudGljYXRpb25SZXN1bHR8fChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0PXt9LGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUQpLGUuRnJhdWREZXRlY3Rpb25SZXN1bHR8fChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0PXt9LGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUQpLCFuLmlzQXV0aEVuYWJsZWQoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJiFuLmlzRnJhdWRFbmFibGVkKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBzKGUpO2lmKGUuU3RyZWFtaW5nU3RhdHVzPT09dC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzLkVOREVEJiYobi5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJihlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRSksbi5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pJiYoZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkUpKSxuLmlzQXV0aFJlc3VsdEluY29uY2x1c2l2ZShlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0ZyYXVkUmVzdWx0SW5jb25jbHVzaXZlKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBzKGUpO2lmKCFuLmlzQXV0aFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0F1dGhFbmFibGVkKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pKXN3aXRjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKXtjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uQUNDRVBUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uQVVUSEVOVElDQVRFRDticmVhaztjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uUkVKRUNUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0FVVEhFTlRJQ0FURUQ7YnJlYWs7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLlNQRUFLRVJfT1BURURfT1VUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uT1BURURfT1VUO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5TUEVBS0VSX05PVF9FTlJPTExFRDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTlJPTExFRDticmVhaztkZWZhdWx0OmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uRVJST1J9aWYoIW4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0ZyYXVkRW5hYmxlZChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlzd2l0Y2goZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbil7Y2FzZSB0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkhJR0hfUklTSzplLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkhJR0hfUklTSzticmVhaztjYXNlIHQuVm9pY2VJZEZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTE9XX1JJU0s6ZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5MT1dfUklTSzticmVhaztkZWZhdWx0OmUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uRVJST1J9aWYoIW4uaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYhbi5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBzKGUpO3NldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVElPTl9QT0xMSU5HX0lOVEVSVkFMKX1lbHNle3QuZ2V0TG9nKCkuZXJyb3IoImV2YWx1YXRlU3BlYWtlciB0aW1lb3V0Iikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVWQUxVQVRFX1NQRUFLRVJfVElNRU9VVCwiZXZhbHVhdGVTcGVha2VyIHRpbWVvdXQiKTthKHIpfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt2YXIgbjtzd2l0Y2goSlNPTi5wYXJzZShlKS5zdGF0dXMpe2Nhc2UgNDAwOmNhc2UgNDA0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TRVNTSU9OX05PVF9FWElTVFMsImV2YWx1YXRlU3BlYWtlciBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIsZSksdC5nZXRMb2coKS5lcnJvcigiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2JyZWFrO2RlZmF1bHQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVWQUxVQVRFX1NQRUFLRVJfRkFJTEVELCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkIixlKSx0LmdldExvZygpLmVycm9yKCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWEobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2EoZSl9KSl9ZT9uLnN0YXJ0U2Vzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe24uc3luY1NwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVEVfU0VTU0lPTl9ERUxBWSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN5bmNTcGVha2VySWQgZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz10cnVlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEoZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN0YXJ0U2Vzc2lvbiBmYWlsZWQgd2hlbiBzZXNzaW9uIHN0YXJ0TmV3PXRydWUiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksYShlKX0pKTpuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbigpe2MoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigic3luY1NwZWFrZXJJZCBmYWlsZWQgd2hlbiBzZXNzaW9uIHN0YXJ0TmV3PWZhbHNlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEoZSl9KSl9KSl9LGEucHJvdG90eXBlLmRlc2NyaWJlU2Vzc2lvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10LmNvcmUuZ2V0Q2xpZW50KCkscj10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCBzPXtTZXNzaW9uTmFtZU9ySWQ6ci5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImRlc2NyaWJlU2Vzc2lvbiBjYWxsZWQiKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkRFU0NSSUJFX1NFU1NJT04scyx7c3VjY2VzczpmdW5jdGlvbihlKXtvKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImRlc2NyaWJlU2Vzc2lvbiBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5ERVNDUklCRV9TRVNTSU9OX0ZBSUxFRCwiZGVzY3JpYmVTZXNzaW9uIGZhaWxlZCIsZSk7aShuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7aShlKX0pKX0pKX0sYS5wcm90b3R5cGUuY2hlY2tFbnJvbGxtZW50U3RhdHVzPWZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiY2hlY2tFbnJvbGxtZW50U3RhdHVzIGNhbGxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dGhpcyxyPTAsbz0hMTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscyl7IWZ1bmN0aW9uIGEoKXtpZigrK3I8dC5Wb2ljZUlkQ29uc3RhbnRzLkVOUk9MTE1FTlRfTUFYX1BPTExfVElNRVMpbi5kZXNjcmliZVNlc3Npb24oKS50aGVuKChmdW5jdGlvbihyKXtzd2l0Y2goci5TZXNzaW9uLkVucm9sbG1lbnRSZXF1ZXN0RGV0YWlscy5TdGF0dXMpe2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuQ09NUExFVEVEOmkocik7YnJlYWs7Y2FzZSB0LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cy5JTl9QUk9HUkVTUzpvfHwiZnVuY3Rpb24iIT10eXBlb2YgZXx8KGUociksbz0hMCksc2V0VGltZW91dChhLHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX1BPTExJTkdfSU5URVJWQUwpO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuTk9UX0VOT1VHSF9TUEVFQ0g6ci5TZXNzaW9uLlN0cmVhbWluZ1N0YXR1cyE9PXQuVm9pY2VJZFN0cmVhbWluZ1N0YXR1cy5FTkRFRD9zZXRUaW1lb3V0KGEsdC5Wb2ljZUlkQ29uc3RhbnRzLkVOUk9MTE1FTlRfUE9MTElOR19JTlRFUlZBTCk6c2V0VGltZW91dCgoZnVuY3Rpb24oKXtuLnN0YXJ0U2Vzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe2EoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSx0KXtzKGUpfSkpfSksdC5Wb2ljZUlkQ29uc3RhbnRzLlNUQVJUX1NFU1NJT05fREVMQVkpO2JyZWFrO2RlZmF1bHQ6dmFyIGM9ci5TZXNzaW9uLkVucm9sbG1lbnRSZXF1ZXN0RGV0YWlscy5NZXNzYWdlP3IuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuTWVzc2FnZToiZW5yb2xsU3BlYWtlciBmYWlsZWQuIFVua25vd24gZW5yb2xsbWVudCBzdGF0dXMgaGFzIGJlZW4gcmVjZWl2ZWQiO3QuZ2V0TG9nKCkuZXJyb3IoYykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgdT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVOUk9MTF9TUEVBS0VSX0ZBSUxFRCxjLHIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuU3RhdHVzKTtzKHUpfX0pKTtlbHNle3QuZ2V0TG9nKCkuZXJyb3IoImVucm9sbFNwZWFrZXIgdGltZW91dCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGM9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FTlJPTExfU1BFQUtFUl9USU1FT1VULCJlbnJvbGxTcGVha2VyIHRpbWVvdXQiKTtzKGMpfX0oKX0pKX0sYS5wcm90b3R5cGUuZW5yb2xsU3BlYWtlcj1mdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXIgY2FsbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10aGlzO3JldHVybiBuLmNoZWNrQ29uZmVyZW5jZUNhbGwoKSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbigpe24uZ2V0U3BlYWtlclN0YXR1cygpLnRoZW4oKGZ1bmN0aW9uKGkpe2kuU3BlYWtlciYmaS5TcGVha2VyLlN0YXR1cz09dC5Wb2ljZUlkU3BlYWtlclN0YXR1cy5PUFRFRF9PVVQ/bi5kZWxldGVTcGVha2VyKCkudGhlbigoZnVuY3Rpb24oKXtuLmVucm9sbFNwZWFrZXJIZWxwZXIocixvLGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpOm4uZW5yb2xsU3BlYWtlckhlbHBlcihyLG8sZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLmVucm9sbFNwZWFrZXJIZWxwZXI9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT10LmNvcmUuZ2V0Q2xpZW50KCkscz10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCk7by5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGEpe2NvbnN0IGM9e1Nlc3Npb25OYW1lT3JJZDpzLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLERvbWFpbklkOmF9O3QuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlckhlbHBlciBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkVOUk9MTF9CWV9TRVNTSU9OLGMse3N1Y2Nlc3M6ZnVuY3Rpb24oaSl7aS5TdGF0dXM9PT10LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cy5DT01QTEVURUQ/KHQuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZShpKSk6by5jaGVja0Vucm9sbG1lbnRTdGF0dXMocikudGhlbigoZnVuY3Rpb24obil7dC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3Qobikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlKG4pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImVucm9sbFNwZWFrZXIgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciByPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRU5ST0xMX1NQRUFLRVJfRkFJTEVELCJlbnJvbGxTcGVha2VyIGZhaWxlZCIsZSk7bihyKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7bihlKX0pKX0sYS5wcm90b3R5cGUuX3VwZGF0ZVNwZWFrZXJJZEluTGNtcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpe2NvbnN0IGE9e0NvbnRhY3RJZDpyLmNvbnRhY3RJZCxJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxBV1NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksQ3VzdG9tZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksVm9pY2VJZFJlc3VsdDp7Z2VuZXJhdGVkU3BlYWtlcklkOm59fTt0LmdldExvZygpLmluZm8oIl91cGRhdGVTcGVha2VySWRJbkxjbXMgY2FsbGVkIikud2l0aE9iamVjdChhKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfVk9JQ0VfSURfREFUQSxhLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidXBkYXRlU3BlYWtlcklkSW5MY21zIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5VUERBVEVfU1BFQUtFUl9JRF9JTl9MQ01TX0ZBSUxFRCwidXBkYXRlU3BlYWtlcklkSW5MY21zIGZhaWxlZCIsZSk7cyhuKX19KX0pKX0sYS5wcm90b3R5cGUudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7bi5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXtuLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oYSl7Y29uc3QgYz17U2Vzc2lvbk5hbWVPcklkOm8uaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsU3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChlLCJzcGVha2VySWQiKSxEb21haW5JZDphfTt0LmdldExvZygpLmluZm8oInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlVQREFURV9TRVNTSU9OLGMse3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dC5nZXRMb2coKS5pbmZvKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBvPXImJnIuU2Vzc2lvbiYmci5TZXNzaW9uLkdlbmVyYXRlZFNwZWFrZXJJZDtuLl91cGRhdGVTcGVha2VySWRJbkxjbXMoZSxvKS50aGVuKChmdW5jdGlvbigpe2kocil9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dmFyIG47c3dpdGNoKEpTT04ucGFyc2UoZSkuc3RhdHVzKXtjYXNlIDQwMDpjYXNlIDQwNDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU0VTU0lPTl9OT1RfRVhJU1RTLCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTticmVhaztkZWZhdWx0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5VUERBVEVfU1BFQUtFUl9JRF9GQUlMRUQsInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9cyhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cyhlKX0pKX0pKX0sYS5wcm90b3R5cGUuc3luY1NwZWFrZXJJZD1mdW5jdGlvbigpe3QuZ2V0TG9nKCkuaW5mbygic3luY1NwZWFrZXJJZCBjYWxsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe2UuZ2V0U3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24ocil7ZS51cGRhdGVTcGVha2VySWRJblZvaWNlSWQoci5zcGVha2VySWQpLnRoZW4oKGZ1bmN0aW9uKGUpe3QoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9KSl9LGEucHJvdG90eXBlLmdldERvbWFpbklkPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLG4pe2lmKChuZXcgdC5BZ2VudCkuZ2V0UGVybWlzc2lvbnMoKS5pbmNsdWRlcyh0LkFnZW50UGVybWlzc2lvbnMuVk9JQ0VfSUQpKWlmKHQuY29yZS52b2ljZUlkRG9tYWluSWQpZSh0LmNvcmUudm9pY2VJZERvbWFpbklkKTtlbHNle3ZhciByPXQuY29yZS5nZXRDbGllbnQoKTtjb25zdCBvPXtJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxJbnRlZ3JhdGlvblR5cGU6IlZPSUNFX0lEIn07dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZCBjYWxsZWQiKS53aXRoT2JqZWN0KG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkxJU1RfSU5URUdSQVRJT05fQVNTT0NJQVRJT05TLG8se3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dHJ5e3ZhciBvO2lmKHIuSW50ZWdyYXRpb25Bc3NvY2lhdGlvblN1bW1hcnlMaXN0Lmxlbmd0aD49MSYmKG89ci5JbnRlZ3JhdGlvbkFzc29jaWF0aW9uU3VtbWFyeUxpc3RbMF0uSW50ZWdyYXRpb25Bcm4ucmVwbGFjZSgvXi4qZG9tYWluXC8vaSwiIikpLCFvKXt0LmdldExvZygpLmluZm8oImdldERvbWFpbklkOiBubyBkb21haW5JZCBmb3VuZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGk9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5OT19ET01BSU5fSURfRk9VTkQpO3JldHVybiB2b2lkIG4oaSl9dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZCBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Wb2ljZUlkRXZlbnRzLlVQREFURV9ET01BSU5fSUQsZGF0YTp7ZG9tYWluSWQ6b319KSxlKG8pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImdldERvbWFpbklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX0RPTUFJTl9JRF9GQUlMRUQsImdldERvbWFpbklkIGZhaWxlZCIsZSksbihpKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZ2V0RG9tYWluSWQgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciByPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX0RPTUFJTl9JRF9GQUlMRUQsImdldERvbWFpbklkIGZhaWxlZCIsZSk7bihyKX19KX1lbHNlIG4obmV3IEVycm9yKCJBZ2VudCBkb2Vzbid0IGhhdmUgdGhlIHBlcm1pc3Npb24gZm9yIFZvaWNlIElEIikpfSkpfSxhLnByb3RvdHlwZS5jaGVja0NvbmZlcmVuY2VDYWxsPWZ1bmN0aW9uKCl7aWYodC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpLmNvbm5lY3Rpb25zLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29udGFpbnModC5DT05ORUNUSU9OX0FDVElWRV9TVEFURVMsZS5zdGF0ZS50eXBlKX0pKS5sZW5ndGg+Mil0aHJvdyBuZXcgdC5Ob3RJbXBsZW1lbnRlZEVycm9yKCJWb2ljZUlkIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbmZlcmVuY2UgY2FsbHMiKX0sYS5wcm90b3R5cGUuaXNBdXRoRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEfSxhLnByb3RvdHlwZS5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTk9VR0hfU1BFRUNIfSxhLnByb3RvdHlwZS5pc0F1dGhSZXN1bHRJbmNvbmNsdXNpdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkV9LGEucHJvdG90eXBlLmlzRnJhdWRFbmFibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUR9LGEucHJvdG90eXBlLmlzRnJhdWRSZXN1bHROb3RFbm91Z2hTcGVlY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTk9VR0hfU1BFRUNIfSxhLnByb3RvdHlwZS5pc0ZyYXVkUmVzdWx0SW5jb25jbHVzaXZlPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFfTt2YXIgYz1mdW5jdGlvbihlLHQpe3RoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yPW5ldyBhKGUpLHMuY2FsbCh0aGlzLGUsdCl9OyhjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YyxjLnByb3RvdHlwZS5nZXRTb2Z0cGhvbmVNZWRpYUluZm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNvZnRwaG9uZU1lZGlhSW5mb30sYy5wcm90b3R5cGUuZ2V0TWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LGMucHJvdG90eXBlLmdldE1lZGlhVHlwZT1mdW5jdGlvbigpe3JldHVybiB0Lk1lZGlhVHlwZS5TT0ZUUEhPTkV9LGMucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX0sYy5wcm90b3R5cGUuZ2V0Vm9pY2VJZFNwZWFrZXJJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5nZXRTcGVha2VySWQoKX0sYy5wcm90b3R5cGUuZ2V0Vm9pY2VJZFNwZWFrZXJTdGF0dXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZ2V0U3BlYWtlclN0YXR1cygpfSxjLnByb3RvdHlwZS5vcHRPdXRWb2ljZUlkU3BlYWtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5vcHRPdXRTcGVha2VyKCl9LGMucHJvdG90eXBlLmRlbGV0ZVZvaWNlSWRTcGVha2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmRlbGV0ZVNwZWFrZXIoKX0sYy5wcm90b3R5cGUuZXZhbHVhdGVTcGVha2VyV2l0aFZvaWNlSWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmV2YWx1YXRlU3BlYWtlcihlKX0sYy5wcm90b3R5cGUuZW5yb2xsU3BlYWtlckluVm9pY2VJZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZW5yb2xsU3BlYWtlcihlKX0sYy5wcm90b3R5cGUudXBkYXRlVm9pY2VJZFNwZWFrZXJJZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkKGUpfSxjLnByb3RvdHlwZS5nZXRRdWlja0Nvbm5lY3ROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5xdWlja0Nvbm5lY3ROYW1lfSxjLnByb3RvdHlwZS5pc1NpbGVudE1vbml0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNb25pdG9yU3RhdHVzKCk9PT10Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SfSxjLnByb3RvdHlwZS5pc0JhcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5CQVJHRX0sYy5wcm90b3R5cGUuaXNCYXJnZUVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFKX0sYy5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TW9uaXRvckNhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLmluY2x1ZGVzKHQuTW9uaXRvcmluZ01vZGUuU0lMRU5UX01PTklUT1IpfSxjLnByb3RvdHlwZS5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yQ2FwYWJpbGl0aWVzfSxjLnByb3RvdHlwZS5nZXRNb25pdG9yU3RhdHVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yU3RhdHVzfSxjLnByb3RvdHlwZS5pc011dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm11dGV9LGMucHJvdG90eXBlLmlzRm9yY2VkTXV0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuZm9yY2VkTXV0ZX0sYy5wcm90b3R5cGUubXV0ZVBhcnRpY2lwYW50PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5NVVRFX1BBUlRJQ0lQQU5ULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LGMucHJvdG90eXBlLnVubXV0ZVBhcnRpY2lwYW50PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5VTk1VVEVfUEFSVElDSVBBTlQse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX07dmFyIHU9ZnVuY3Rpb24oZSx0KXtzLmNhbGwodGhpcyxlLHQpfTsodS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXUsdS5wcm90b3R5cGUuZ2V0TWVkaWFJbmZvPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fZ2V0RGF0YSgpLmNoYXRNZWRpYUluZm87aWYoZSl7dmFyIG49dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpLHI9e2NvbnRhY3RJZDp0aGlzLmNvbnRhY3RJZCxpbml0aWFsQ29udGFjdElkOm4uaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQscGFydGljaXBhbnRJZDp0aGlzLmNvbm5lY3Rpb25JZCxnZXRDb25uZWN0aW9uVG9rZW46dC5oaXRjaCh0aGlzLHRoaXMuZ2V0Q29ubmVjdGlvblRva2VuKX07aWYoZS5jb25uZWN0aW9uRGF0YSl0cnl7ci5wYXJ0aWNpcGFudFRva2VuPUpTT04ucGFyc2UoZS5jb25uZWN0aW9uRGF0YSkuQ29ubmVjdGlvbkF1dGhlbnRpY2F0aW9uVG9rZW59Y2F0Y2gobil7dC5nZXRMb2coKS5lcnJvcih0LkxvZ0NvbXBvbmVudC5DSEFULCJDb25uZWN0aW9uIGRhdGEgaXMgaW52YWxpZCIpLndpdGhPYmplY3QoZSkud2l0aEV4Y2VwdGlvbihuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIucGFydGljaXBhbnRUb2tlbj1udWxsfXJldHVybiByLnBhcnRpY2lwYW50VG9rZW49ci5wYXJ0aWNpcGFudFRva2VufHxudWxsLHIub3JpZ2luYWxJbmZvPXRoaXMuX2dldERhdGEoKS5jaGF0TWVkaWFJbmZvLHJ9cmV0dXJuIG51bGx9LHUucHJvdG90eXBlLmdldENvbm5lY3Rpb25Ub2tlbj1mdW5jdGlvbigpe3ZhciBlPXQuY29yZS5nZXRDbGllbnQoKSxuPSh0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCkse3RyYW5zcG9ydFR5cGU6dC5UUkFOU1BPUlRfVFlQRVMuQ0hBVF9UT0tFTixwYXJ0aWNpcGFudElkOnRoaXMuY29ubmVjdGlvbklkLGNvbnRhY3RJZDp0aGlzLmNvbnRhY3RJZH0pO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9UUkFOU1BPUlQsbix7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImdldENvbm5lY3Rpb25Ub2tlbiBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJnZXRDb25uZWN0aW9uVG9rZW4gZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KSxvKEVycm9yKCJnZXRDb25uZWN0aW9uVG9rZW4gZmFpbGVkIikpfX0pfSkpfSx1LnByb3RvdHlwZS5nZXRNZWRpYVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5NZWRpYVR5cGUuQ0hBVH0sdS5wcm90b3R5cGUuZ2V0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpfSx1LnByb3RvdHlwZS5faW5pdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3RoaXMuX2lzQWdlbnRDb25uZWN0aW9uVHlwZSgpJiZ0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9O3ZhciBsPWZ1bmN0aW9uKGUsdCl7cy5jYWxsKHRoaXMsZSx0KX07KGwucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocy5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1sLGwucHJvdG90eXBlLmdldE1lZGlhVHlwZT1mdW5jdGlvbigpe3JldHVybiB0Lk1lZGlhVHlwZS5UQVNLfSxsLnByb3RvdHlwZS5nZXRNZWRpYUluZm89ZnVuY3Rpb24oKXt2YXIgZT10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCk7cmV0dXJue2NvbnRhY3RJZDp0aGlzLmNvbnRhY3RJZCxpbml0aWFsQ29udGFjdElkOmUuaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWR9fSxsLnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9O3ZhciBwPWZ1bmN0aW9uKGUpe3QuQ29ubmVjdGlvbi5jYWxsKHRoaXMsZS5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpLHRoaXMuY29ubmVjdGlvbkRhdGE9ZX07KHAucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocy5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1wLHAucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29ubmVjdGlvbkRhdGF9LHAucHJvdG90eXBlLl9pbml0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7fTt2YXIgZD1mdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0aGlzLmVuZHBvaW50QVJOPXQuZW5kcG9pbnRJZHx8dC5lbmRwb2ludEFSTnx8bnVsbCx0aGlzLmVuZHBvaW50SWQ9dGhpcy5lbmRwb2ludEFSTix0aGlzLnR5cGU9dC50eXBlfHxudWxsLHRoaXMubmFtZT10Lm5hbWV8fG51bGwsdGhpcy5waG9uZU51bWJlcj10LnBob25lTnVtYmVyfHxudWxsLHRoaXMuYWdlbnRMb2dpbj10LmFnZW50TG9naW58fG51bGwsdGhpcy5xdWV1ZT10LnF1ZXVlfHxudWxsfTtkLnByb3RvdHlwZS5zdHJpcFBob25lTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGhvbmVOdW1iZXI/dGhpcy5waG9uZU51bWJlci5yZXBsYWNlKC9zaXA6KFteQF0qKUAuKi8sIiQxIik6IiJ9LGQuYnlQaG9uZU51bWJlcj1mdW5jdGlvbihlLG4pe3JldHVybiBuZXcgZCh7dHlwZTp0LkVuZHBvaW50VHlwZS5QSE9ORV9OVU1CRVIscGhvbmVOdW1iZXI6ZSxuYW1lOm58fG51bGx9KX07dmFyIGg9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuZXJyb3JUeXBlPWUsdGhpcy5lcnJvck1lc3NhZ2U9dCx0aGlzLmVuZFBvaW50VXJsPW59O2gucHJvdG90eXBlLmdldEVycm9yVHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yVHlwZX0saC5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JNZXNzYWdlfSxoLnByb3RvdHlwZS5nZXRFbmRQb2ludFVybD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZFBvaW50VXJsfSx0LmFnZW50PWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLklOSVQsZSk7cmV0dXJuIHQuYWdlbnQuaW5pdGlhbGl6ZWQmJmUobmV3IHQuQWdlbnQpLG59LHQuYWdlbnQuaW5pdGlhbGl6ZWQ9ITEsdC5jb250YWN0PWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db250YWN0RXZlbnRzLklOSVQsZSl9LHQub25XZWJzb2NrZXRJbml0RmFpbHVyZT1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5XZWJTb2NrZXRFdmVudHMuSU5JVF9GQUlMVVJFLGUpO3JldHVybiB0LndlYlNvY2tldEluaXRGYWlsZWQmJmUoKSxufSx0LmlmTWFzdGVyPWZ1bmN0aW9uKGUsbixyLG8pe2lmKHQuYXNzZXJ0Tm90TnVsbChlLCJBIHRvcGljIG11c3QgYmUgcHJvdmlkZWQuIiksdC5hc3NlcnROb3ROdWxsKG4sIkEgdHJ1ZSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkLiIpLCF0LmNvcmUubWFzdGVyQ2xpZW50KXJldHVybiB0LmdldExvZygpLndhcm4oIldlIGNhbid0IGJlIHRoZSBtYXN0ZXIgZm9yIHRvcGljICclcycgYmVjYXVzZSB0aGVyZSBpcyBubyBtYXN0ZXIgY2xpZW50ISIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx2b2lkKHImJnIoKSk7dC5jb3JlLmdldE1hc3RlckNsaWVudCgpLmNhbGwodC5NYXN0ZXJNZXRob2RzLkNIRUNLX01BU1RFUix7dG9waWM6ZSxzaG91bGROb3RCZWNvbWVNYXN0ZXJJZk5vbmU6b30se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZS5pc01hc3Rlcj9uKCk6ciYmcigpfX0pfSx0LmJlY29tZU1hc3Rlcj1mdW5jdGlvbihlLG4scil7dC5hc3NlcnROb3ROdWxsKGUsIkEgdG9waWMgbXVzdCBiZSBwcm92aWRlZC4iKSx0LmNvcmUubWFzdGVyQ2xpZW50P3QuY29yZS5nZXRNYXN0ZXJDbGllbnQoKS5jYWxsKHQuTWFzdGVyTWV0aG9kcy5CRUNPTUVfTUFTVEVSLHt0b3BpYzplfSx7c3VjY2VzczpmdW5jdGlvbigpe24mJm4oKX19KToodC5nZXRMb2coKS53YXJuKCJXZSBjYW4ndCBiZSB0aGUgbWFzdGVyIGZvciB0b3BpYyAnJXMnIGJlY2F1c2UgdGhlcmUgaXMgbm8gbWFzdGVyIGNsaWVudCEiLGUpLHImJnIoKSl9LHQuQWdlbnQ9bix0LkFnZW50U25hcHNob3Q9cix0LkNvbnRhY3Q9byx0LkNvbnRhY3RTbmFwc2hvdD1pLHQuQ29ubmVjdGlvbj1jLHQuQmFzZUNvbm5lY3Rpb249cyx0LlZvaWNlQ29ubmVjdGlvbj1jLHQuQ2hhdENvbm5lY3Rpb249dSx0LlRhc2tDb25uZWN0aW9uPWwsdC5Db25uZWN0aW9uU25hcHNob3Q9cCx0LkVuZHBvaW50PWQsdC5BZGRyZXNzPWQsdC5Tb2Z0cGhvbmVFcnJvcj1oLHQuVm9pY2VJZD1hfSgpfSw4Mjc6KGUsdCxuKT0+e3ZhciByOyFmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBvKHMsYSl7aWYoIW5bc10pe2lmKCF0W3NdKXtpZihpKXJldHVybiBpKHMsITApO3ZhciBjPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK3MrIiciKTt0aHJvdyBjLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGN9dmFyIHU9bltzXT17ZXhwb3J0czp7fX07dFtzXVswXS5jYWxsKHUuZXhwb3J0cywoZnVuY3Rpb24oZSl7cmV0dXJuIG8odFtzXVsxXVtlXXx8ZSl9KSx1LHUuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltzXS5leHBvcnRzfWZvcih2YXIgaT12b2lkIDAscz0wO3M8ci5sZW5ndGg7cysrKW8ocltzXSk7cmV0dXJuIG99KHsxOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDE0LTA2LTMwIixlbmRwb2ludFByZWZpeDoiY29nbml0by1pZGVudGl0eSIsanNvblZlcnNpb246IjEuMSIscHJvdG9jb2w6Impzb24iLHNlcnZpY2VGdWxsTmFtZToiQW1hem9uIENvZ25pdG8gSWRlbnRpdHkiLHNlcnZpY2VJZDoiQ29nbml0byBJZGVudGl0eSIsc2lnbmF0dXJlVmVyc2lvbjoidjQiLHRhcmdldFByZWZpeDoiQVdTQ29nbml0b0lkZW50aXR5U2VydmljZSIsdWlkOiJjb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAifSxvcGVyYXRpb25zOntDcmVhdGVJZGVudGl0eVBvb2w6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sTmFtZSIsIkFsbG93VW5hdXRoZW50aWNhdGVkSWRlbnRpdGllcyJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbE5hbWU6e30sQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzOnt0eXBlOiJib29sZWFuIn0sQWxsb3dDbGFzc2ljRmxvdzp7dHlwZToiYm9vbGVhbiJ9LFN1cHBvcnRlZExvZ2luUHJvdmlkZXJzOntzaGFwZToiUzUifSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sT3BlbklkQ29ubmVjdFByb3ZpZGVyQVJOczp7c2hhcGU6IlM5In0sQ29nbml0b0lkZW50aXR5UHJvdmlkZXJzOntzaGFwZToiU2IifSxTYW1sUHJvdmlkZXJBUk5zOntzaGFwZToiU2cifSxJZGVudGl0eVBvb2xUYWdzOntzaGFwZToiU2gifX19LG91dHB1dDp7c2hhcGU6IlNrIn19LERlbGV0ZUlkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZHNUb0RlbGV0ZSJdLG1lbWJlcnM6e0lkZW50aXR5SWRzVG9EZWxldGU6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VW5wcm9jZXNzZWRJZGVudGl0eUlkczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sRXJyb3JDb2RlOnt9fX19fX19LERlbGV0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX19LERlc2NyaWJlSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e319fSxvdXRwdXQ6e3NoYXBlOiJTdiJ9fSxEZXNjcmliZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX0sb3V0cHV0OntzaGFwZToiU2sifX0sR2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxDdXN0b21Sb2xlQXJuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sQ3JlZGVudGlhbHM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7QWNjZXNzS2V5SWQ6e30sU2VjcmV0S2V5Ont9LFNlc3Npb25Ub2tlbjp7fSxFeHBpcmF0aW9uOnt0eXBlOiJ0aW1lc3RhbXAifX19fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRJZDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0FjY291bnRJZDp7fSxJZGVudGl0eVBvb2xJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRJZGVudGl0eVBvb2xSb2xlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LFJvbGVzOntzaGFwZToiUzFjIn0sUm9sZU1hcHBpbmdzOntzaGFwZToiUzFlIn19fX0sR2V0T3BlbklkVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxUb2tlbjp7fX19LGF1dGh0eXBlOiJub25lIn0sR2V0T3BlbklkVG9rZW5Gb3JEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIkxvZ2lucyJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9LFRva2VuRHVyYXRpb246e3R5cGU6ImxvbmcifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LFRva2VuOnt9fX19LEdldFByaW5jaXBhbFRhZ0F0dHJpYnV0ZU1hcDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UHJvdmlkZXJOYW1lIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fX0sTGlzdElkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJNYXhSZXN1bHRzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sTWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fSxIaWRlRGlzYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0aWVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTdiJ9fSxOZXh0VG9rZW46e319fX0sTGlzdElkZW50aXR5UG9vbHM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiTWF4UmVzdWx0cyJdLG1lbWJlcnM6e01heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifSxOZXh0VG9rZW46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UG9vbE5hbWU6e319fX0sTmV4dFRva2VuOnt9fX19LExpc3RUYWdzRm9yUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iXSxtZW1iZXJzOntSZXNvdXJjZUFybjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntUYWdzOntzaGFwZToiU2gifX19fSxMb29rdXBEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5SWQ6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXI6e30sTWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LERldmVsb3BlclVzZXJJZGVudGlmaWVyTGlzdDp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxOZXh0VG9rZW46e319fX0sTWVyZ2VEZXZlbG9wZXJJZGVudGl0aWVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlNvdXJjZVVzZXJJZGVudGlmaWVyIiwiRGVzdGluYXRpb25Vc2VySWRlbnRpZmllciIsIkRldmVsb3BlclByb3ZpZGVyTmFtZSIsIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7U291cmNlVXNlcklkZW50aWZpZXI6e30sRGVzdGluYXRpb25Vc2VySWRlbnRpZmllcjp7fSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sSWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fX19fSxTZXRJZGVudGl0eVBvb2xSb2xlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIlJvbGVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sUm9sZXM6e3NoYXBlOiJTMWMifSxSb2xlTWFwcGluZ3M6e3NoYXBlOiJTMWUifX19fSxTZXRQcmluY2lwYWxUYWdBdHRyaWJ1dGVNYXA6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJJZGVudGl0eVByb3ZpZGVyTmFtZSJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UHJvdmlkZXJOYW1lOnt9LFVzZURlZmF1bHRzOnt0eXBlOiJib29sZWFuIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UHJvdmlkZXJOYW1lOnt9LFVzZURlZmF1bHRzOnt0eXBlOiJib29sZWFuIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9fX19LFRhZ1Jlc291cmNlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJlc291cmNlQXJuIiwiVGFncyJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9LFRhZ3M6e3NoYXBlOiJTaCJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVbmxpbmtEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIiwiSWRlbnRpdHlQb29sSWQiLCJEZXZlbG9wZXJQcm92aWRlck5hbWUiLCJEZXZlbG9wZXJVc2VySWRlbnRpZmllciJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sSWRlbnRpdHlQb29sSWQ6e30sRGV2ZWxvcGVyUHJvdmlkZXJOYW1lOnt9LERldmVsb3BlclVzZXJJZGVudGlmaWVyOnt9fX19LFVubGlua0lkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiLCJMb2dpbnMiLCJMb2dpbnNUb1JlbW92ZSJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn0sTG9naW5zVG9SZW1vdmU6e3NoYXBlOiJTdyJ9fX0sYXV0aHR5cGU6Im5vbmUifSxVbnRhZ1Jlc291cmNlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJlc291cmNlQXJuIiwiVGFnS2V5cyJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9LFRhZ0tleXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3NoYXBlOiJTayJ9LG91dHB1dDp7c2hhcGU6IlNrIn19fSxzaGFwZXM6e1M1Ont0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sUzk6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sU2I6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntQcm92aWRlck5hbWU6e30sQ2xpZW50SWQ6e30sU2VydmVyU2lkZVRva2VuQ2hlY2s6e3R5cGU6ImJvb2xlYW4ifX19fSxTZzp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTaDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFNrOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJJZGVudGl0eVBvb2xOYW1lIiwiQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQb29sTmFtZTp7fSxBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXM6e3R5cGU6ImJvb2xlYW4ifSxBbGxvd0NsYXNzaWNGbG93Ont0eXBlOiJib29sZWFuIn0sU3VwcG9ydGVkTG9naW5Qcm92aWRlcnM6e3NoYXBlOiJTNSJ9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxPcGVuSWRDb25uZWN0UHJvdmlkZXJBUk5zOntzaGFwZToiUzkifSxDb2duaXRvSWRlbnRpdHlQcm92aWRlcnM6e3NoYXBlOiJTYiJ9LFNhbWxQcm92aWRlckFSTnM6e3NoYXBlOiJTZyJ9LElkZW50aXR5UG9vbFRhZ3M6e3NoYXBlOiJTaCJ9fX0sU3Y6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTdyJ9LENyZWF0aW9uRGF0ZTp7dHlwZToidGltZXN0YW1wIn0sTGFzdE1vZGlmaWVkRGF0ZTp7dHlwZToidGltZXN0YW1wIn19fSxTdzp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTMTA6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTMWM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTMWU6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiVHlwZSJdLG1lbWJlcnM6e1R5cGU6e30sQW1iaWd1b3VzUm9sZVJlc29sdXRpb246e30sUnVsZXNDb25maWd1cmF0aW9uOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUnVsZXMiXSxtZW1iZXJzOntSdWxlczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQ2xhaW0iLCJNYXRjaFR5cGUiLCJWYWx1ZSIsIlJvbGVBUk4iXSxtZW1iZXJzOntDbGFpbTp7fSxNYXRjaFR5cGU6e30sVmFsdWU6e30sUm9sZUFSTjp7fX19fX19fX19LFMxczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319fX19LHt9XSwyOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtwYWdpbmF0aW9uOntMaXN0SWRlbnRpdHlQb29sczp7aW5wdXRfdG9rZW46Ik5leHRUb2tlbiIsbGltaXRfa2V5OiJNYXhSZXN1bHRzIixvdXRwdXRfdG9rZW46Ik5leHRUb2tlbiIscmVzdWx0X2tleToiSWRlbnRpdHlQb29scyJ9fX19LHt9XSwzOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDE3LTAyLTE1IixlbmRwb2ludFByZWZpeDoiY29ubmVjdCIsanNvblZlcnNpb246IjEuMCIscHJvdG9jb2w6Impzb24iLHNlcnZpY2VBYmJyZXZpYXRpb246IkNvbm5lY3QiLHNlcnZpY2VGdWxsTmFtZToiQW1hem9uQ29ubmVjdENUSVNlcnZpY2UiLHNpZ25hdHVyZVZlcnNpb246IiIsdGFyZ2V0UHJlZml4OiJBbWF6b25Db25uZWN0Q1RJU2VydmljZSIsdWlkOiJjb25uZWN0LTIwMTctMDItMTUifSxvcGVyYXRpb25zOntBY2NlcHRDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ2xlYXJDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ29tcGxldGVDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ29uZmVyZW5jZUNvbm5lY3Rpb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ3JlYXRlQWRkaXRpb25hbENvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJlbmRwb2ludCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sZW5kcG9pbnQ6e3NoYXBlOiJTZSJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVPdXRib3VuZENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJlbmRwb2ludCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxlbmRwb2ludDp7c2hhcGU6IlNlIn0scXVldWVBUk46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LENyZWF0ZVRhc2tDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImVuZHBvaW50IiwibmFtZSJdLG1lbWJlcnM6e2VuZHBvaW50OntzaGFwZToiU2UifSxwcmV2aW91c0NvbnRhY3RJZDp7fSxuYW1lOnt9LGRlc2NyaXB0aW9uOnt9LHJlZmVyZW5jZXM6e3NoYXBlOiJTciJ9LGlkZW1wb3RlbmN5VG9rZW46e30sc2NoZWR1bGVkVGltZTp7dHlwZToibG9uZyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19fSxDcmVhdGVUcmFuc3BvcnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidHJhbnNwb3J0VHlwZSIsImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7dHJhbnNwb3J0VHlwZTp7fSxwYXJ0aWNpcGFudElkOnt9LGNvbnRhY3RJZDp7fSxzb2Z0cGhvbmVDbGllbnRJZDp7fSxhdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7d2ViU29ja2V0VHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidXJsIiwidHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHMiXSxtZW1iZXJzOnt1cmw6e30sdHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM6e3R5cGU6ImxvbmcifSxleHBpcnk6e319fSxjaGF0VG9rZW5UcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJwYXJ0aWNpcGFudFRva2VuIiwiZXhwaXJ5Il0sbWVtYmVyczp7cGFydGljaXBhbnRUb2tlbjp7fSxleHBpcnk6e319fSxzb2Z0cGhvbmVUcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzb2Z0cGhvbmVNZWRpYUNvbm5lY3Rpb25zIl0sbWVtYmVyczp7c29mdHBob25lTWVkaWFDb25uZWN0aW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidXNlcm5hbWUiLCJjcmVkZW50aWFsIiwidXJscyJdLG1lbWJlcnM6e3VzZXJuYW1lOnt9LGNyZWRlbnRpYWw6e30sdXJsczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19fX19LGFnZW50RGlzY292ZXJ5VHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicHJlc2lnbmVkVXJsIl0sbWVtYmVyczp7cHJlc2lnbmVkVXJsOnt9fX19fX0sRGVzdHJveUNvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sR2V0QWdlbnRDb25maWd1cmF0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29uZmlndXJhdGlvbiJdLG1lbWJlcnM6e2NvbmZpZ3VyYXRpb246e3NoYXBlOiJTMWkifX19fSxHZXRBZ2VudFBlcm1pc3Npb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJwZXJtaXNzaW9ucyJdLG1lbWJlcnM6e3Blcm1pc3Npb25zOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LG5leHRUb2tlbjp7fX19fSxHZXRBZ2VudFNuYXBzaG90OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSx0aW1lb3V0Ont0eXBlOiJsb25nIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzbmFwc2hvdCIsIm5leHRUb2tlbiJdLG1lbWJlcnM6e3NuYXBzaG90Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic3RhdGUiLCJjb250YWN0cyIsInNuYXBzaG90VGltZXN0YW1wIl0sbWVtYmVyczp7c3RhdGU6e3NoYXBlOiJTMjEifSxuZXh0U3RhdGU6e3NoYXBlOiJTMjEifSxhZ2VudEF2YWlsYWJpbGl0eVN0YXRlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3N0YXRlOnt9LHRpbWVTdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxjb250YWN0czp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIiwidHlwZSIsInN0YXRlIiwiY29ubmVjdGlvbnMiLCJhdHRyaWJ1dGVzIl0sbWVtYmVyczp7Y29udGFjdElkOnt9LGluaXRpYWxDb250YWN0SWQ6e30sdHlwZTp7fSxzdGF0ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJ0aW1lc3RhbXAiXSxtZW1iZXJzOnt0eXBlOnt9LHRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxxdWV1ZTp7c2hhcGU6IlNrIn0scXVldWVUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9LGNvbm5lY3Rpb25zOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb25uZWN0aW9uSWQiLCJzdGF0ZSIsInR5cGUiLCJpbml0aWFsIl0sbWVtYmVyczp7Y29ubmVjdGlvbklkOnt9LGVuZHBvaW50OntzaGFwZToiU2UifSxzdGF0ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJ0aW1lc3RhbXAiXSxtZW1iZXJzOnt0eXBlOnt9LHRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSx0eXBlOnt9LGluaXRpYWw6e3R5cGU6ImJvb2xlYW4ifSxzb2Z0cGhvbmVNZWRpYUluZm86e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Y2FsbFR5cGU6e30sYXV0b0FjY2VwdDp7dHlwZToiYm9vbGVhbiJ9LG1lZGlhTGVnQ29udGV4dFRva2VuOnt9LGNhbGxDb250ZXh0VG9rZW46e30sY2FsbENvbmZpZ0pzb246e319fSxjaGF0TWVkaWFJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NoYXRBdXRvQWNjZXB0Ont0eXBlOiJib29sZWFuIn0sY29ubmVjdGlvbkRhdGE6e30sY3VzdG9tZXJOYW1lOnt9fX0sbW9uaXRvcmluZ0luZm86e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnROYW1lOnt9fX0sam9pblRpbWVTdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxtdXRlOnt0eXBlOiJib29sZWFuIn0sZm9yY2VkTXV0ZTp7dHlwZToiYm9vbGVhbiJ9LHF1aWNrQ29ubmVjdE5hbWU6e30sbW9uaXRvckNhcGFiaWxpdGllczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxtb25pdG9yU3RhdHVzOnt9fX19LGF0dHJpYnV0ZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibmFtZSJdLG1lbWJlcnM6e25hbWU6e30sdmFsdWU6e319fX0sY29udGFjdER1cmF0aW9uOnt9LG5hbWU6e30sZGVzY3JpcHRpb246e30scmVmZXJlbmNlczp7c2hhcGU6IlNyIn0saW5pdGlhdGlvbk1ldGhvZDp7fSxjb250YWN0RmVhdHVyZXM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXR0YWNobWVudHNFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sbWVzc2FnaW5nTWFya2Rvd25FbmFibGVkOnt0eXBlOiJib29sZWFuIn0sbXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc2NyZWVuUmVjb3JkaW5nRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ1N0YXRlOnt9LHNjcmVlblJlY29yZGluZ0NvbmZpZzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzY3JlZW5SZWNvcmRpbmdFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc2NyZWVuUmVjb3JkaW5nU3RhdGU6e319fX19LGNoYW5uZWxDb250ZXh0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3NjaGVkdWxlZFRpbWU6e3R5cGU6ImxvbmcifSx0YXNrVGVtcGxhdGVJZDp7fSx0YXNrVGVtcGxhdGVWZXJzaW9uOnt0eXBlOiJpbnRlZ2VyIn19fSxzZWdtZW50QXR0cmlidXRlczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VmFsdWVTdHJpbmc6e319fX19fX0sc25hcHNob3RUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sbmV4dFRva2VuOnt9fX19LEdldEFnZW50U3RhdGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzdGF0ZXMiXSxtZW1iZXJzOntzdGF0ZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlMyMSJ9fSxuZXh0VG9rZW46e319fX0sR2V0RGlhbGFibGVDb3VudHJ5Q29kZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvdW50cnlDb2RlcyJdLG1lbWJlcnM6e2NvdW50cnlDb2Rlczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e319fX0sR2V0RW5kcG9pbnRzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwicXVldWVBUk5zIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LHF1ZXVlQVJOczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2VuZHBvaW50czp7dHlwZToibGlzdCIsbWVtYmVyOntzaGFwZToiU2UifX0sbmV4dFRva2VuOnt9fX19LEdldE5ld0F1dGhUb2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsInJlZnJlc2hUb2tlbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxyZWZyZXNoVG9rZW46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bmV3QXV0aFRva2VuOnt9LGV4cGlyYXRpb25EYXRlVGltZTp7dHlwZToidGltZXN0YW1wIn19fX0sR2V0Um91dGluZ1Byb2ZpbGVRdWV1ZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJyb3V0aW5nUHJvZmlsZUFSTiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxyb3V0aW5nUHJvZmlsZUFSTjp7fSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicXVldWVzIl0sbWVtYmVyczp7cXVldWVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTayJ9fSxuZXh0VG9rZW46e319fX0sSG9sZENvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sTXV0ZVBhcnRpY2lwYW50OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LE5vdGlmeUNvbnRhY3RJc3N1ZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30saXNzdWVDb2RlOnt9LGRlc2NyaXB0aW9uOnt9LGNsaWVudExvZ3M6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFB1dEFnZW50U3RhdGU6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJzdGF0ZSJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxzdGF0ZTp7c2hhcGU6IlMyMSJ9LGVucXVldWVOZXh0U3RhdGU6e3R5cGU6ImJvb2xlYW4ifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sUmVqZWN0Q29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlc3VtZUNvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sU2VuZENsaWVudExvZ3M6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJsb2dFdmVudHMiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sbG9nRXZlbnRzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7dGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifSxjb21wb25lbnQ6e30sbWVzc2FnZTp7fX19fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sU2VuZERpZ2l0czp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImNvbm5lY3Rpb25JZCIsImRpZ2l0cyJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY29ubmVjdGlvbklkOnt9LGRpZ2l0czp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sU2VuZFNvZnRwaG9uZUNhbGxNZXRyaWNzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwic29mdHBob25lU3RyZWFtU3RhdGlzdGljcyJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY2NwVmVyc2lvbjp7fSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOntzaGFwZToiUzQxIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmRTb2Z0cGhvbmVDYWxsUmVwb3J0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwicmVwb3J0Il0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjY3BWZXJzaW9uOnt9LHJlcG9ydDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntjYWxsU3RhcnRUaW1lOnt0eXBlOiJ0aW1lc3RhbXAifSxjYWxsRW5kVGltZTp7dHlwZToidGltZXN0YW1wIn0sc29mdHBob25lU3RyZWFtU3RhdGlzdGljczp7c2hhcGU6IlM0MSJ9LGd1bVRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxpbml0aWFsaXphdGlvblRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxpY2VDb2xsZWN0aW9uVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LHNpZ25hbGxpbmdDb25uZWN0VGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGhhbmRzaGFrZVRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxwcmVUYWxrVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LHRhbGtUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0sY2xlYW51cFRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxpY2VDb2xsZWN0aW9uRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LHNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGhhbmRzaGFrZUZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxndW1PdGhlckZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxndW1UaW1lb3V0RmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGNyZWF0ZU9mZmVyRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LHNldExvY2FsRGVzY3JpcHRpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sdXNlckJ1c3lGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0saW52YWxpZFJlbW90ZVNEUEZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxub1JlbW90ZUljZUNhbmRpZGF0ZUZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxzZXRSZW1vdGVEZXNjcmlwdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifX19fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxUb2dnbGVBY3RpdmVDb25uZWN0aW9uczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImNvbm5lY3Rpb25JZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY29ubmVjdGlvbklkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVbm11dGVQYXJ0aWNpcGFudDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImNvbm5lY3Rpb25JZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY29ubmVjdGlvbklkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVcGRhdGVBZ2VudENvbmZpZ3VyYXRpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb25maWd1cmF0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbmZpZ3VyYXRpb246e3NoYXBlOiJTMWkifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVXBkYXRlTW9uaXRvclBhcnRpY2lwYW50U3RhdGU6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIiwidGFyZ2V0TW9uaXRvck1vZGUiXSxtZW1iZXJzOntjb250YWN0SWQ6e30sdGFyZ2V0TW9uaXRvck1vZGU6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19fSxzaGFwZXM6e1MyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2FnZW50QVJOOnt9LGF1dGhUb2tlbjp7fX19LFNlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidHlwZSJdLG1lbWJlcnM6e2VuZHBvaW50QVJOOnt9LHR5cGU6e30sbmFtZTp7fSxwaG9uZU51bWJlcjp7fSxhZ2VudExvZ2luOnt9LHF1ZXVlOntzaGFwZToiU2sifX19LFNrOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3F1ZXVlQVJOOnt9LG5hbWU6e319fSxTcjp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ2YWx1ZSIsInR5cGUiXSxtZW1iZXJzOnt2YWx1ZTp7fSx0eXBlOnt9fX19LFMxaTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIm5hbWUiLCJzb2Z0cGhvbmVFbmFibGVkIiwic29mdHBob25lQXV0b0FjY2VwdCIsImV4dGVuc2lvbiIsInJvdXRpbmdQcm9maWxlIl0sbWVtYmVyczp7bmFtZTp7fSx1c2VybmFtZTp7fSxzb2Z0cGhvbmVFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc29mdHBob25lQXV0b0FjY2VwdDp7dHlwZToiYm9vbGVhbiJ9LGV4dGVuc2lvbjp7fSxyb3V0aW5nUHJvZmlsZTp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntuYW1lOnt9LHJvdXRpbmdQcm9maWxlQVJOOnt9LGRlZmF1bHRPdXRib3VuZFF1ZXVlOntzaGFwZToiU2sifSxjaGFubmVsQ29uY3VycmVuY3lNYXA6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJsb25nIn19fX0sYWdlbnRQcmVmZXJlbmNlczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LGFnZW50QVJOOnt9fX0sUzIxOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidHlwZSIsIm5hbWUiXSxtZW1iZXJzOnthZ2VudFN0YXRlQVJOOnt9LHR5cGU6e30sbmFtZTp7fSxzdGFydFRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxTNDE6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9LHNvZnRwaG9uZVN0cmVhbVR5cGU6e30scGFja2V0Q291bnQ6e3R5cGU6ImxvbmcifSxwYWNrZXRzTG9zdDp7dHlwZToibG9uZyJ9LGF1ZGlvTGV2ZWw6e3R5cGU6ImRvdWJsZSJ9LGppdHRlckJ1ZmZlck1pbGxpczp7dHlwZToibG9uZyJ9LHJvdW5kVHJpcFRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifX19fX19fSx7fV0sNDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17YWNtOntuYW1lOiJBQ00iLGNvcnM6ITB9LGFwaWdhdGV3YXk6e25hbWU6IkFQSUdhdGV3YXkiLGNvcnM6ITB9LGFwcGxpY2F0aW9uYXV0b3NjYWxpbmc6e3ByZWZpeDoiYXBwbGljYXRpb24tYXV0b3NjYWxpbmciLG5hbWU6IkFwcGxpY2F0aW9uQXV0b1NjYWxpbmciLGNvcnM6ITB9LGFwcHN0cmVhbTp7bmFtZToiQXBwU3RyZWFtIn0sYXV0b3NjYWxpbmc6e25hbWU6IkF1dG9TY2FsaW5nIixjb3JzOiEwfSxiYXRjaDp7bmFtZToiQmF0Y2gifSxidWRnZXRzOntuYW1lOiJCdWRnZXRzIn0sY2xvdWRkaXJlY3Rvcnk6e25hbWU6IkNsb3VkRGlyZWN0b3J5Iix2ZXJzaW9uczpbIjIwMTYtMDUtMTAqIl19LGNsb3VkZm9ybWF0aW9uOntuYW1lOiJDbG91ZEZvcm1hdGlvbiIsY29yczohMH0sY2xvdWRmcm9udDp7bmFtZToiQ2xvdWRGcm9udCIsdmVyc2lvbnM6WyIyMDEzLTA1LTEyKiIsIjIwMTMtMTEtMTEqIiwiMjAxNC0wNS0zMSoiLCIyMDE0LTEwLTIxKiIsIjIwMTQtMTEtMDYqIiwiMjAxNS0wNC0xNyoiLCIyMDE1LTA3LTI3KiIsIjIwMTUtMDktMTcqIiwiMjAxNi0wMS0xMyoiLCIyMDE2LTAxLTI4KiIsIjIwMTYtMDgtMDEqIiwiMjAxNi0wOC0yMCoiLCIyMDE2LTA5LTA3KiIsIjIwMTYtMDktMjkqIiwiMjAxNi0xMS0yNSoiLCIyMDE3LTAzLTI1KiIsIjIwMTctMTAtMzAqIiwiMjAxOC0wNi0xOCoiLCIyMDE4LTExLTA1KiIsIjIwMTktMDMtMjYqIl0sY29yczohMH0sY2xvdWRoc206e25hbWU6IkNsb3VkSFNNIixjb3JzOiEwfSxjbG91ZHNlYXJjaDp7bmFtZToiQ2xvdWRTZWFyY2gifSxjbG91ZHNlYXJjaGRvbWFpbjp7bmFtZToiQ2xvdWRTZWFyY2hEb21haW4ifSxjbG91ZHRyYWlsOntuYW1lOiJDbG91ZFRyYWlsIixjb3JzOiEwfSxjbG91ZHdhdGNoOntwcmVmaXg6Im1vbml0b3JpbmciLG5hbWU6IkNsb3VkV2F0Y2giLGNvcnM6ITB9LGNsb3Vkd2F0Y2hldmVudHM6e3ByZWZpeDoiZXZlbnRzIixuYW1lOiJDbG91ZFdhdGNoRXZlbnRzIix2ZXJzaW9uczpbIjIwMTQtMDItMDMqIl0sY29yczohMH0sY2xvdWR3YXRjaGxvZ3M6e3ByZWZpeDoibG9ncyIsbmFtZToiQ2xvdWRXYXRjaExvZ3MiLGNvcnM6ITB9LGNvZGVidWlsZDp7bmFtZToiQ29kZUJ1aWxkIixjb3JzOiEwfSxjb2RlY29tbWl0OntuYW1lOiJDb2RlQ29tbWl0Iixjb3JzOiEwfSxjb2RlZGVwbG95OntuYW1lOiJDb2RlRGVwbG95Iixjb3JzOiEwfSxjb2RlcGlwZWxpbmU6e25hbWU6IkNvZGVQaXBlbGluZSIsY29yczohMH0sY29nbml0b2lkZW50aXR5OntwcmVmaXg6ImNvZ25pdG8taWRlbnRpdHkiLG5hbWU6IkNvZ25pdG9JZGVudGl0eSIsY29yczohMH0sY29nbml0b2lkZW50aXR5c2VydmljZXByb3ZpZGVyOntwcmVmaXg6ImNvZ25pdG8taWRwIixuYW1lOiJDb2duaXRvSWRlbnRpdHlTZXJ2aWNlUHJvdmlkZXIiLGNvcnM6ITB9LGNvZ25pdG9zeW5jOntwcmVmaXg6ImNvZ25pdG8tc3luYyIsbmFtZToiQ29nbml0b1N5bmMiLGNvcnM6ITB9LGNvbmZpZ3NlcnZpY2U6e3ByZWZpeDoiY29uZmlnIixuYW1lOiJDb25maWdTZXJ2aWNlIixjb3JzOiEwfSxjb25uZWN0OntuYW1lOiJDb25uZWN0Iixjb3JzOiEwfSxjdXI6e25hbWU6IkNVUiIsY29yczohMH0sZGF0YXBpcGVsaW5lOntuYW1lOiJEYXRhUGlwZWxpbmUifSxkZXZpY2VmYXJtOntuYW1lOiJEZXZpY2VGYXJtIixjb3JzOiEwfSxkaXJlY3Rjb25uZWN0OntuYW1lOiJEaXJlY3RDb25uZWN0Iixjb3JzOiEwfSxkaXJlY3RvcnlzZXJ2aWNlOntwcmVmaXg6ImRzIixuYW1lOiJEaXJlY3RvcnlTZXJ2aWNlIn0sZGlzY292ZXJ5OntuYW1lOiJEaXNjb3ZlcnkifSxkbXM6e25hbWU6IkRNUyJ9LGR5bmFtb2RiOntuYW1lOiJEeW5hbW9EQiIsY29yczohMH0sZHluYW1vZGJzdHJlYW1zOntwcmVmaXg6InN0cmVhbXMuZHluYW1vZGIiLG5hbWU6IkR5bmFtb0RCU3RyZWFtcyIsY29yczohMH0sZWMyOntuYW1lOiJFQzIiLHZlcnNpb25zOlsiMjAxMy0wNi0xNSoiLCIyMDEzLTEwLTE1KiIsIjIwMTQtMDItMDEqIiwiMjAxNC0wNS0wMSoiLCIyMDE0LTA2LTE1KiIsIjIwMTQtMDktMDEqIiwiMjAxNC0xMC0wMSoiLCIyMDE1LTAzLTAxKiIsIjIwMTUtMDQtMTUqIiwiMjAxNS0xMC0wMSoiLCIyMDE2LTA0LTAxKiIsIjIwMTYtMDktMTUqIl0sY29yczohMH0sZWNyOntuYW1lOiJFQ1IiLGNvcnM6ITB9LGVjczp7bmFtZToiRUNTIixjb3JzOiEwfSxlZnM6e3ByZWZpeDoiZWxhc3RpY2ZpbGVzeXN0ZW0iLG5hbWU6IkVGUyIsY29yczohMH0sZWxhc3RpY2FjaGU6e25hbWU6IkVsYXN0aUNhY2hlIix2ZXJzaW9uczpbIjIwMTItMTEtMTUqIiwiMjAxNC0wMy0yNCoiLCIyMDE0LTA3LTE1KiIsIjIwMTQtMDktMzAqIl0sY29yczohMH0sZWxhc3RpY2JlYW5zdGFsazp7bmFtZToiRWxhc3RpY0JlYW5zdGFsayIsY29yczohMH0sZWxiOntwcmVmaXg6ImVsYXN0aWNsb2FkYmFsYW5jaW5nIixuYW1lOiJFTEIiLGNvcnM6ITB9LGVsYnYyOntwcmVmaXg6ImVsYXN0aWNsb2FkYmFsYW5jaW5ndjIiLG5hbWU6IkVMQnYyIixjb3JzOiEwfSxlbXI6e3ByZWZpeDoiZWxhc3RpY21hcHJlZHVjZSIsbmFtZToiRU1SIixjb3JzOiEwfSxlczp7bmFtZToiRVMifSxlbGFzdGljdHJhbnNjb2Rlcjp7bmFtZToiRWxhc3RpY1RyYW5zY29kZXIiLGNvcnM6ITB9LGZpcmVob3NlOntuYW1lOiJGaXJlaG9zZSIsY29yczohMH0sZ2FtZWxpZnQ6e25hbWU6IkdhbWVMaWZ0Iixjb3JzOiEwfSxnbGFjaWVyOntuYW1lOiJHbGFjaWVyIn0saGVhbHRoOntuYW1lOiJIZWFsdGgifSxpYW06e25hbWU6IklBTSIsY29yczohMH0saW1wb3J0ZXhwb3J0OntuYW1lOiJJbXBvcnRFeHBvcnQifSxpbnNwZWN0b3I6e25hbWU6Ikluc3BlY3RvciIsdmVyc2lvbnM6WyIyMDE1LTA4LTE4KiJdLGNvcnM6ITB9LGlvdDp7bmFtZToiSW90Iixjb3JzOiEwfSxpb3RkYXRhOntwcmVmaXg6ImlvdC1kYXRhIixuYW1lOiJJb3REYXRhIixjb3JzOiEwfSxraW5lc2lzOntuYW1lOiJLaW5lc2lzIixjb3JzOiEwfSxraW5lc2lzYW5hbHl0aWNzOntuYW1lOiJLaW5lc2lzQW5hbHl0aWNzIn0sa21zOntuYW1lOiJLTVMiLGNvcnM6ITB9LGxhbWJkYTp7bmFtZToiTGFtYmRhIixjb3JzOiEwfSxsZXhydW50aW1lOntwcmVmaXg6InJ1bnRpbWUubGV4IixuYW1lOiJMZXhSdW50aW1lIixjb3JzOiEwfSxsaWdodHNhaWw6e25hbWU6IkxpZ2h0c2FpbCJ9LG1hY2hpbmVsZWFybmluZzp7bmFtZToiTWFjaGluZUxlYXJuaW5nIixjb3JzOiEwfSxtYXJrZXRwbGFjZWNvbW1lcmNlYW5hbHl0aWNzOntuYW1lOiJNYXJrZXRwbGFjZUNvbW1lcmNlQW5hbHl0aWNzIixjb3JzOiEwfSxtYXJrZXRwbGFjZW1ldGVyaW5nOntwcmVmaXg6Im1ldGVyaW5nbWFya2V0cGxhY2UiLG5hbWU6Ik1hcmtldHBsYWNlTWV0ZXJpbmcifSxtdHVyazp7cHJlZml4OiJtdHVyay1yZXF1ZXN0ZXIiLG5hbWU6Ik1UdXJrIixjb3JzOiEwfSxtb2JpbGVhbmFseXRpY3M6e25hbWU6Ik1vYmlsZUFuYWx5dGljcyIsY29yczohMH0sb3Bzd29ya3M6e25hbWU6Ik9wc1dvcmtzIixjb3JzOiEwfSxvcHN3b3Jrc2NtOntuYW1lOiJPcHNXb3Jrc0NNIn0sb3JnYW5pemF0aW9uczp7bmFtZToiT3JnYW5pemF0aW9ucyJ9LHBpbnBvaW50OntuYW1lOiJQaW5wb2ludCJ9LHBvbGx5OntuYW1lOiJQb2xseSIsY29yczohMH0scmRzOntuYW1lOiJSRFMiLHZlcnNpb25zOlsiMjAxNC0wOS0wMSoiXSxjb3JzOiEwfSxyZWRzaGlmdDp7bmFtZToiUmVkc2hpZnQiLGNvcnM6ITB9LHJla29nbml0aW9uOntuYW1lOiJSZWtvZ25pdGlvbiIsY29yczohMH0scmVzb3VyY2Vncm91cHN0YWdnaW5nYXBpOntuYW1lOiJSZXNvdXJjZUdyb3Vwc1RhZ2dpbmdBUEkifSxyb3V0ZTUzOntuYW1lOiJSb3V0ZTUzIixjb3JzOiEwfSxyb3V0ZTUzZG9tYWluczp7bmFtZToiUm91dGU1M0RvbWFpbnMiLGNvcnM6ITB9LHMzOntuYW1lOiJTMyIsZHVhbHN0YWNrQXZhaWxhYmxlOiEwLGNvcnM6ITB9LHMzY29udHJvbDp7bmFtZToiUzNDb250cm9sIixkdWFsc3RhY2tBdmFpbGFibGU6ITAseG1sTm9EZWZhdWx0TGlzdHM6ITB9LHNlcnZpY2VjYXRhbG9nOntuYW1lOiJTZXJ2aWNlQ2F0YWxvZyIsY29yczohMH0sc2VzOntwcmVmaXg6ImVtYWlsIixuYW1lOiJTRVMiLGNvcnM6ITB9LHNoaWVsZDp7bmFtZToiU2hpZWxkIn0sc2ltcGxlZGI6e3ByZWZpeDoic2RiIixuYW1lOiJTaW1wbGVEQiJ9LHNtczp7bmFtZToiU01TIn0sc25vd2JhbGw6e25hbWU6IlNub3diYWxsIn0sc25zOntuYW1lOiJTTlMiLGNvcnM6ITB9LHNxczp7bmFtZToiU1FTIixjb3JzOiEwfSxzc206e25hbWU6IlNTTSIsY29yczohMH0sc3RvcmFnZWdhdGV3YXk6e25hbWU6IlN0b3JhZ2VHYXRld2F5Iixjb3JzOiEwfSxzdGVwZnVuY3Rpb25zOntwcmVmaXg6InN0YXRlcyIsbmFtZToiU3RlcEZ1bmN0aW9ucyJ9LHN0czp7bmFtZToiU1RTIixjb3JzOiEwfSxzdXBwb3J0OntuYW1lOiJTdXBwb3J0In0sc3dmOntuYW1lOiJTV0YifSx4cmF5OntuYW1lOiJYUmF5Iixjb3JzOiEwfSx3YWY6e25hbWU6IldBRiIsY29yczohMH0sd2FmcmVnaW9uYWw6e3ByZWZpeDoid2FmLXJlZ2lvbmFsIixuYW1lOiJXQUZSZWdpb25hbCJ9LHdvcmtkb2NzOntuYW1lOiJXb3JrRG9jcyIsY29yczohMH0sd29ya3NwYWNlczp7bmFtZToiV29ya1NwYWNlcyJ9LGNvZGVzdGFyOntuYW1lOiJDb2RlU3RhciJ9LGxleG1vZGVsYnVpbGRpbmdzZXJ2aWNlOntwcmVmaXg6ImxleC1tb2RlbHMiLG5hbWU6IkxleE1vZGVsQnVpbGRpbmdTZXJ2aWNlIixjb3JzOiEwfSxtYXJrZXRwbGFjZWVudGl0bGVtZW50c2VydmljZTp7cHJlZml4OiJlbnRpdGxlbWVudC5tYXJrZXRwbGFjZSIsbmFtZToiTWFya2V0cGxhY2VFbnRpdGxlbWVudFNlcnZpY2UifSxhdGhlbmE6e25hbWU6IkF0aGVuYSIsY29yczohMH0sZ3JlZW5ncmFzczp7bmFtZToiR3JlZW5ncmFzcyJ9LGRheDp7bmFtZToiREFYIn0sbWlncmF0aW9uaHViOntwcmVmaXg6IkFXU01pZ3JhdGlvbkh1YiIsbmFtZToiTWlncmF0aW9uSHViIn0sY2xvdWRoc212Mjp7bmFtZToiQ2xvdWRIU01WMiIsY29yczohMH0sZ2x1ZTp7bmFtZToiR2x1ZSJ9LG1vYmlsZTp7bmFtZToiTW9iaWxlIn0scHJpY2luZzp7bmFtZToiUHJpY2luZyIsY29yczohMH0sY29zdGV4cGxvcmVyOntwcmVmaXg6ImNlIixuYW1lOiJDb3N0RXhwbG9yZXIiLGNvcnM6ITB9LG1lZGlhY29udmVydDp7bmFtZToiTWVkaWFDb252ZXJ0In0sbWVkaWFsaXZlOntuYW1lOiJNZWRpYUxpdmUifSxtZWRpYXBhY2thZ2U6e25hbWU6Ik1lZGlhUGFja2FnZSJ9LG1lZGlhc3RvcmU6e25hbWU6Ik1lZGlhU3RvcmUifSxtZWRpYXN0b3JlZGF0YTp7cHJlZml4OiJtZWRpYXN0b3JlLWRhdGEiLG5hbWU6Ik1lZGlhU3RvcmVEYXRhIixjb3JzOiEwfSxhcHBzeW5jOntuYW1lOiJBcHBTeW5jIn0sZ3VhcmRkdXR5OntuYW1lOiJHdWFyZER1dHkifSxtcTp7bmFtZToiTVEifSxjb21wcmVoZW5kOntuYW1lOiJDb21wcmVoZW5kIixjb3JzOiEwfSxpb3Rqb2JzZGF0YXBsYW5lOntwcmVmaXg6ImlvdC1qb2JzLWRhdGEiLG5hbWU6IklvVEpvYnNEYXRhUGxhbmUifSxraW5lc2lzdmlkZW9hcmNoaXZlZG1lZGlhOntwcmVmaXg6ImtpbmVzaXMtdmlkZW8tYXJjaGl2ZWQtbWVkaWEiLG5hbWU6IktpbmVzaXNWaWRlb0FyY2hpdmVkTWVkaWEiLGNvcnM6ITB9LGtpbmVzaXN2aWRlb21lZGlhOntwcmVmaXg6ImtpbmVzaXMtdmlkZW8tbWVkaWEiLG5hbWU6IktpbmVzaXNWaWRlb01lZGlhIixjb3JzOiEwfSxraW5lc2lzdmlkZW86e25hbWU6IktpbmVzaXNWaWRlbyIsY29yczohMH0sc2FnZW1ha2VycnVudGltZTp7cHJlZml4OiJydW50aW1lLnNhZ2VtYWtlciIsbmFtZToiU2FnZU1ha2VyUnVudGltZSJ9LHNhZ2VtYWtlcjp7bmFtZToiU2FnZU1ha2VyIn0sdHJhbnNsYXRlOntuYW1lOiJUcmFuc2xhdGUiLGNvcnM6ITB9LHJlc291cmNlZ3JvdXBzOntwcmVmaXg6InJlc291cmNlLWdyb3VwcyIsbmFtZToiUmVzb3VyY2VHcm91cHMiLGNvcnM6ITB9LGFsZXhhZm9yYnVzaW5lc3M6e25hbWU6IkFsZXhhRm9yQnVzaW5lc3MifSxjbG91ZDk6e25hbWU6IkNsb3VkOSJ9LHNlcnZlcmxlc3NhcHBsaWNhdGlvbnJlcG9zaXRvcnk6e3ByZWZpeDoic2VydmVybGVzc3JlcG8iLG5hbWU6IlNlcnZlcmxlc3NBcHBsaWNhdGlvblJlcG9zaXRvcnkifSxzZXJ2aWNlZGlzY292ZXJ5OntuYW1lOiJTZXJ2aWNlRGlzY292ZXJ5In0sd29ya21haWw6e25hbWU6IldvcmtNYWlsIn0sYXV0b3NjYWxpbmdwbGFuczp7cHJlZml4OiJhdXRvc2NhbGluZy1wbGFucyIsbmFtZToiQXV0b1NjYWxpbmdQbGFucyJ9LHRyYW5zY3JpYmVzZXJ2aWNlOntwcmVmaXg6InRyYW5zY3JpYmUiLG5hbWU6IlRyYW5zY3JpYmVTZXJ2aWNlIn0sY29ubmVjdDp7bmFtZToiQ29ubmVjdCIsY29yczohMH0sYWNtcGNhOntwcmVmaXg6ImFjbS1wY2EiLG5hbWU6IkFDTVBDQSJ9LGZtczp7bmFtZToiRk1TIn0sc2VjcmV0c21hbmFnZXI6e25hbWU6IlNlY3JldHNNYW5hZ2VyIixjb3JzOiEwfSxpb3RhbmFseXRpY3M6e25hbWU6IklvVEFuYWx5dGljcyIsY29yczohMH0saW90MWNsaWNrZGV2aWNlc3NlcnZpY2U6e3ByZWZpeDoiaW90MWNsaWNrLWRldmljZXMiLG5hbWU6IklvVDFDbGlja0RldmljZXNTZXJ2aWNlIn0saW90MWNsaWNrcHJvamVjdHM6e3ByZWZpeDoiaW90MWNsaWNrLXByb2plY3RzIixuYW1lOiJJb1QxQ2xpY2tQcm9qZWN0cyJ9LHBpOntuYW1lOiJQSSJ9LG5lcHR1bmU6e25hbWU6Ik5lcHR1bmUifSxtZWRpYXRhaWxvcjp7bmFtZToiTWVkaWFUYWlsb3IifSxla3M6e25hbWU6IkVLUyJ9LG1hY2llOntuYW1lOiJNYWNpZSJ9LGRsbTp7bmFtZToiRExNIn0sc2lnbmVyOntuYW1lOiJTaWduZXIifSxjaGltZTp7bmFtZToiQ2hpbWUifSxwaW5wb2ludGVtYWlsOntwcmVmaXg6InBpbnBvaW50LWVtYWlsIixuYW1lOiJQaW5wb2ludEVtYWlsIn0scmFtOntuYW1lOiJSQU0ifSxyb3V0ZTUzcmVzb2x2ZXI6e25hbWU6IlJvdXRlNTNSZXNvbHZlciJ9LHBpbnBvaW50c21zdm9pY2U6e3ByZWZpeDoic21zLXZvaWNlIixuYW1lOiJQaW5wb2ludFNNU1ZvaWNlIn0scXVpY2tzaWdodDp7bmFtZToiUXVpY2tTaWdodCJ9LHJkc2RhdGFzZXJ2aWNlOntwcmVmaXg6InJkcy1kYXRhIixuYW1lOiJSRFNEYXRhU2VydmljZSJ9LGFtcGxpZnk6e25hbWU6IkFtcGxpZnkifSxkYXRhc3luYzp7bmFtZToiRGF0YVN5bmMifSxyb2JvbWFrZXI6e25hbWU6IlJvYm9NYWtlciJ9LHRyYW5zZmVyOntuYW1lOiJUcmFuc2ZlciJ9LGdsb2JhbGFjY2VsZXJhdG9yOntuYW1lOiJHbG9iYWxBY2NlbGVyYXRvciJ9LGNvbXByZWhlbmRtZWRpY2FsOntuYW1lOiJDb21wcmVoZW5kTWVkaWNhbCIsY29yczohMH0sa2luZXNpc2FuYWx5dGljc3YyOntuYW1lOiJLaW5lc2lzQW5hbHl0aWNzVjIifSxtZWRpYWNvbm5lY3Q6e25hbWU6Ik1lZGlhQ29ubmVjdCJ9LGZzeDp7bmFtZToiRlN4In0sc2VjdXJpdHlodWI6e25hbWU6IlNlY3VyaXR5SHViIn0sYXBwbWVzaDp7bmFtZToiQXBwTWVzaCIsdmVyc2lvbnM6WyIyMDE4LTEwLTAxKiJdfSxsaWNlbnNlbWFuYWdlcjp7cHJlZml4OiJsaWNlbnNlLW1hbmFnZXIiLG5hbWU6IkxpY2Vuc2VNYW5hZ2VyIn0sa2Fma2E6e25hbWU6IkthZmthIn0sYXBpZ2F0ZXdheW1hbmFnZW1lbnRhcGk6e25hbWU6IkFwaUdhdGV3YXlNYW5hZ2VtZW50QXBpIn0sYXBpZ2F0ZXdheXYyOntuYW1lOiJBcGlHYXRld2F5VjIifSxkb2NkYjp7bmFtZToiRG9jREIifSxiYWNrdXA6e25hbWU6IkJhY2t1cCJ9LHdvcmtsaW5rOntuYW1lOiJXb3JrTGluayJ9LHRleHRyYWN0OntuYW1lOiJUZXh0cmFjdCJ9LG1hbmFnZWRibG9ja2NoYWluOntuYW1lOiJNYW5hZ2VkQmxvY2tjaGFpbiJ9LG1lZGlhcGFja2FnZXZvZDp7cHJlZml4OiJtZWRpYXBhY2thZ2Utdm9kIixuYW1lOiJNZWRpYVBhY2thZ2VWb2QifSxncm91bmRzdGF0aW9uOntuYW1lOiJHcm91bmRTdGF0aW9uIn0saW90dGhpbmdzZ3JhcGg6e25hbWU6IklvVFRoaW5nc0dyYXBoIn0saW90ZXZlbnRzOntuYW1lOiJJb1RFdmVudHMifSxpb3RldmVudHNkYXRhOntwcmVmaXg6ImlvdGV2ZW50cy1kYXRhIixuYW1lOiJJb1RFdmVudHNEYXRhIn0scGVyc29uYWxpemU6e25hbWU6IlBlcnNvbmFsaXplIixjb3JzOiEwfSxwZXJzb25hbGl6ZWV2ZW50czp7cHJlZml4OiJwZXJzb25hbGl6ZS1ldmVudHMiLG5hbWU6IlBlcnNvbmFsaXplRXZlbnRzIixjb3JzOiEwfSxwZXJzb25hbGl6ZXJ1bnRpbWU6e3ByZWZpeDoicGVyc29uYWxpemUtcnVudGltZSIsbmFtZToiUGVyc29uYWxpemVSdW50aW1lIixjb3JzOiEwfSxhcHBsaWNhdGlvbmluc2lnaHRzOntwcmVmaXg6ImFwcGxpY2F0aW9uLWluc2lnaHRzIixuYW1lOiJBcHBsaWNhdGlvbkluc2lnaHRzIn0sc2VydmljZXF1b3Rhczp7cHJlZml4OiJzZXJ2aWNlLXF1b3RhcyIsbmFtZToiU2VydmljZVF1b3RhcyJ9LGVjMmluc3RhbmNlY29ubmVjdDp7cHJlZml4OiJlYzItaW5zdGFuY2UtY29ubmVjdCIsbmFtZToiRUMySW5zdGFuY2VDb25uZWN0In0sZXZlbnRicmlkZ2U6e25hbWU6IkV2ZW50QnJpZGdlIn0sbGFrZWZvcm1hdGlvbjp7bmFtZToiTGFrZUZvcm1hdGlvbiJ9LGZvcmVjYXN0c2VydmljZTp7cHJlZml4OiJmb3JlY2FzdCIsbmFtZToiRm9yZWNhc3RTZXJ2aWNlIixjb3JzOiEwfSxmb3JlY2FzdHF1ZXJ5c2VydmljZTp7cHJlZml4OiJmb3JlY2FzdHF1ZXJ5IixuYW1lOiJGb3JlY2FzdFF1ZXJ5U2VydmljZSIsY29yczohMH0scWxkYjp7bmFtZToiUUxEQiJ9LHFsZGJzZXNzaW9uOntwcmVmaXg6InFsZGItc2Vzc2lvbiIsbmFtZToiUUxEQlNlc3Npb24ifSx3b3JrbWFpbG1lc3NhZ2VmbG93OntuYW1lOiJXb3JrTWFpbE1lc3NhZ2VGbG93In0sY29kZXN0YXJub3RpZmljYXRpb25zOntwcmVmaXg6ImNvZGVzdGFyLW5vdGlmaWNhdGlvbnMiLG5hbWU6IkNvZGVTdGFyTm90aWZpY2F0aW9ucyJ9LHNhdmluZ3NwbGFuczp7bmFtZToiU2F2aW5nc1BsYW5zIn0sc3NvOntuYW1lOiJTU08ifSxzc29vaWRjOntwcmVmaXg6InNzby1vaWRjIixuYW1lOiJTU09PSURDIn0sbWFya2V0cGxhY2VjYXRhbG9nOntwcmVmaXg6Im1hcmtldHBsYWNlLWNhdGFsb2ciLG5hbWU6Ik1hcmtldHBsYWNlQ2F0YWxvZyIsY29yczohMH0sZGF0YWV4Y2hhbmdlOntuYW1lOiJEYXRhRXhjaGFuZ2UifSxzZXN2Mjp7bmFtZToiU0VTVjIifSxtaWdyYXRpb25odWJjb25maWc6e3ByZWZpeDoibWlncmF0aW9uaHViLWNvbmZpZyIsbmFtZToiTWlncmF0aW9uSHViQ29uZmlnIn0sY29ubmVjdHBhcnRpY2lwYW50OntuYW1lOiJDb25uZWN0UGFydGljaXBhbnQifSxhcHBjb25maWc6e25hbWU6IkFwcENvbmZpZyJ9LGlvdHNlY3VyZXR1bm5lbGluZzp7bmFtZToiSW9UU2VjdXJlVHVubmVsaW5nIn0sd2FmdjI6e25hbWU6IldBRlYyIn0sZWxhc3RpY2luZmVyZW5jZTp7cHJlZml4OiJlbGFzdGljLWluZmVyZW5jZSIsbmFtZToiRWxhc3RpY0luZmVyZW5jZSJ9LGltYWdlYnVpbGRlcjp7bmFtZToiSW1hZ2VidWlsZGVyIn0sc2NoZW1hczp7bmFtZToiU2NoZW1hcyJ9LGFjY2Vzc2FuYWx5emVyOntuYW1lOiJBY2Nlc3NBbmFseXplciJ9LGNvZGVndXJ1cmV2aWV3ZXI6e3ByZWZpeDoiY29kZWd1cnUtcmV2aWV3ZXIiLG5hbWU6IkNvZGVHdXJ1UmV2aWV3ZXIifSxjb2RlZ3VydXByb2ZpbGVyOntuYW1lOiJDb2RlR3VydVByb2ZpbGVyIn0sY29tcHV0ZW9wdGltaXplcjp7cHJlZml4OiJjb21wdXRlLW9wdGltaXplciIsbmFtZToiQ29tcHV0ZU9wdGltaXplciJ9LGZyYXVkZGV0ZWN0b3I6e25hbWU6IkZyYXVkRGV0ZWN0b3IifSxrZW5kcmE6e25hbWU6IktlbmRyYSJ9LG5ldHdvcmttYW5hZ2VyOntuYW1lOiJOZXR3b3JrTWFuYWdlciJ9LG91dHBvc3RzOntuYW1lOiJPdXRwb3N0cyJ9LGF1Z21lbnRlZGFpcnVudGltZTp7cHJlZml4OiJzYWdlbWFrZXItYTJpLXJ1bnRpbWUiLG5hbWU6IkF1Z21lbnRlZEFJUnVudGltZSJ9LGViczp7bmFtZToiRUJTIn0sa2luZXNpc3ZpZGVvc2lnbmFsaW5nY2hhbm5lbHM6e3ByZWZpeDoia2luZXNpcy12aWRlby1zaWduYWxpbmciLG5hbWU6IktpbmVzaXNWaWRlb1NpZ25hbGluZ0NoYW5uZWxzIixjb3JzOiEwfSxkZXRlY3RpdmU6e25hbWU6IkRldGVjdGl2ZSJ9LGNvZGVzdGFyY29ubmVjdGlvbnM6e3ByZWZpeDoiY29kZXN0YXItY29ubmVjdGlvbnMiLG5hbWU6IkNvZGVTdGFyY29ubmVjdGlvbnMifSxzeW50aGV0aWNzOntuYW1lOiJTeW50aGV0aWNzIn0saW90c2l0ZXdpc2U6e25hbWU6IklvVFNpdGVXaXNlIn0sbWFjaWUyOntuYW1lOiJNYWNpZTIifSxjb2RlYXJ0aWZhY3Q6e25hbWU6IkNvZGVBcnRpZmFjdCJ9LGhvbmV5Y29kZTp7bmFtZToiSG9uZXljb2RlIn0saXZzOntuYW1lOiJJVlMifSxicmFrZXQ6e25hbWU6IkJyYWtldCJ9LGlkZW50aXR5c3RvcmU6e25hbWU6IklkZW50aXR5U3RvcmUifSxhcHBmbG93OntuYW1lOiJBcHBmbG93In0scmVkc2hpZnRkYXRhOntwcmVmaXg6InJlZHNoaWZ0LWRhdGEiLG5hbWU6IlJlZHNoaWZ0RGF0YSJ9LHNzb2FkbWluOntwcmVmaXg6InNzby1hZG1pbiIsbmFtZToiU1NPQWRtaW4ifSx0aW1lc3RyZWFtcXVlcnk6e3ByZWZpeDoidGltZXN0cmVhbS1xdWVyeSIsbmFtZToiVGltZXN0cmVhbVF1ZXJ5In0sdGltZXN0cmVhbXdyaXRlOntwcmVmaXg6InRpbWVzdHJlYW0td3JpdGUiLG5hbWU6IlRpbWVzdHJlYW1Xcml0ZSJ9LHMzb3V0cG9zdHM6e25hbWU6IlMzT3V0cG9zdHMifSxkYXRhYnJldzp7bmFtZToiRGF0YUJyZXcifSxzZXJ2aWNlY2F0YWxvZ2FwcHJlZ2lzdHJ5OntwcmVmaXg6InNlcnZpY2VjYXRhbG9nLWFwcHJlZ2lzdHJ5IixuYW1lOiJTZXJ2aWNlQ2F0YWxvZ0FwcFJlZ2lzdHJ5In0sbmV0d29ya2ZpcmV3YWxsOntwcmVmaXg6Im5ldHdvcmstZmlyZXdhbGwiLG5hbWU6Ik5ldHdvcmtGaXJld2FsbCJ9LG13YWE6e25hbWU6Ik1XQUEifSxhbXBsaWZ5YmFja2VuZDp7bmFtZToiQW1wbGlmeUJhY2tlbmQifSxhcHBpbnRlZ3JhdGlvbnM6e25hbWU6IkFwcEludGVncmF0aW9ucyJ9LGNvbm5lY3Rjb250YWN0bGVuczp7cHJlZml4OiJjb25uZWN0LWNvbnRhY3QtbGVucyIsbmFtZToiQ29ubmVjdENvbnRhY3RMZW5zIn0sZGV2b3BzZ3VydTp7cHJlZml4OiJkZXZvcHMtZ3VydSIsbmFtZToiRGV2T3BzR3VydSJ9LGVjcnB1YmxpYzp7cHJlZml4OiJlY3ItcHVibGljIixuYW1lOiJFQ1JQVUJMSUMifSxsb29rb3V0dmlzaW9uOntuYW1lOiJMb29rb3V0VmlzaW9uIn0sc2FnZW1ha2VyZmVhdHVyZXN0b3JlcnVudGltZTp7cHJlZml4OiJzYWdlbWFrZXItZmVhdHVyZXN0b3JlLXJ1bnRpbWUiLG5hbWU6IlNhZ2VNYWtlckZlYXR1cmVTdG9yZVJ1bnRpbWUifSxjdXN0b21lcnByb2ZpbGVzOntwcmVmaXg6ImN1c3RvbWVyLXByb2ZpbGVzIixuYW1lOiJDdXN0b21lclByb2ZpbGVzIn0sYXVkaXRtYW5hZ2VyOntuYW1lOiJBdWRpdE1hbmFnZXIifSxlbXJjb250YWluZXJzOntwcmVmaXg6ImVtci1jb250YWluZXJzIixuYW1lOiJFTVJjb250YWluZXJzIn0saGVhbHRobGFrZTp7bmFtZToiSGVhbHRoTGFrZSJ9LHNhZ2VtYWtlcmVkZ2U6e3ByZWZpeDoic2FnZW1ha2VyLWVkZ2UiLG5hbWU6IlNhZ2VtYWtlckVkZ2UifSxhbXA6e25hbWU6IkFtcCJ9LGdyZWVuZ3Jhc3N2Mjp7bmFtZToiR3JlZW5ncmFzc1YyIn0saW90ZGV2aWNlYWR2aXNvcjp7bmFtZToiSW90RGV2aWNlQWR2aXNvciJ9LGlvdGZsZWV0aHViOntuYW1lOiJJb1RGbGVldEh1YiJ9LGlvdHdpcmVsZXNzOntuYW1lOiJJb1RXaXJlbGVzcyJ9LGxvY2F0aW9uOntuYW1lOiJMb2NhdGlvbiIsY29yczohMH0sd2VsbGFyY2hpdGVjdGVkOntuYW1lOiJXZWxsQXJjaGl0ZWN0ZWQifSxsZXhtb2RlbHN2Mjp7cHJlZml4OiJtb2RlbHMubGV4LnYyIixuYW1lOiJMZXhNb2RlbHNWMiJ9LGxleHJ1bnRpbWV2Mjp7cHJlZml4OiJydW50aW1lLmxleC52MiIsbmFtZToiTGV4UnVudGltZVYyIixjb3JzOiEwfSxmaXM6e25hbWU6IkZpcyJ9LGxvb2tvdXRtZXRyaWNzOntuYW1lOiJMb29rb3V0TWV0cmljcyJ9LG1nbjp7bmFtZToiTWduIn0sbG9va291dGVxdWlwbWVudDp7bmFtZToiTG9va291dEVxdWlwbWVudCJ9LG5pbWJsZTp7bmFtZToiTmltYmxlIn0sZmluc3BhY2U6e25hbWU6IkZpbnNwYWNlIn0sZmluc3BhY2VkYXRhOntwcmVmaXg6ImZpbnNwYWNlLWRhdGEiLG5hbWU6IkZpbnNwYWNlZGF0YSJ9LHNzbWNvbnRhY3RzOntwcmVmaXg6InNzbS1jb250YWN0cyIsbmFtZToiU1NNQ29udGFjdHMifSxzc21pbmNpZGVudHM6e3ByZWZpeDoic3NtLWluY2lkZW50cyIsbmFtZToiU1NNSW5jaWRlbnRzIn0sYXBwbGljYXRpb25jb3N0cHJvZmlsZXI6e25hbWU6IkFwcGxpY2F0aW9uQ29zdFByb2ZpbGVyIn0sYXBwcnVubmVyOntuYW1lOiJBcHBSdW5uZXIifSxwcm90b246e25hbWU6IlByb3RvbiJ9LHJvdXRlNTNyZWNvdmVyeWNsdXN0ZXI6e3ByZWZpeDoicm91dGU1My1yZWNvdmVyeS1jbHVzdGVyIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlDbHVzdGVyIn0scm91dGU1M3JlY292ZXJ5Y29udHJvbGNvbmZpZzp7cHJlZml4OiJyb3V0ZTUzLXJlY292ZXJ5LWNvbnRyb2wtY29uZmlnIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlDb250cm9sQ29uZmlnIn0scm91dGU1M3JlY292ZXJ5cmVhZGluZXNzOntwcmVmaXg6InJvdXRlNTMtcmVjb3ZlcnktcmVhZGluZXNzIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlSZWFkaW5lc3MifSxjaGltZXNka2lkZW50aXR5OntwcmVmaXg6ImNoaW1lLXNkay1pZGVudGl0eSIsbmFtZToiQ2hpbWVTREtJZGVudGl0eSJ9LGNoaW1lc2RrbWVzc2FnaW5nOntwcmVmaXg6ImNoaW1lLXNkay1tZXNzYWdpbmciLG5hbWU6IkNoaW1lU0RLTWVzc2FnaW5nIn0sc25vd2RldmljZW1hbmFnZW1lbnQ6e3ByZWZpeDoic25vdy1kZXZpY2UtbWFuYWdlbWVudCIsbmFtZToiU25vd0RldmljZU1hbmFnZW1lbnQifSxtZW1vcnlkYjp7bmFtZToiTWVtb3J5REIifSxvcGVuc2VhcmNoOntuYW1lOiJPcGVuU2VhcmNoIn0sa2Fma2Fjb25uZWN0OntuYW1lOiJLYWZrYUNvbm5lY3QifSx2b2ljZWlkOntwcmVmaXg6InZvaWNlLWlkIixuYW1lOiJWb2ljZUlEIn0sd2lzZG9tOntuYW1lOiJXaXNkb20ifSxhY2NvdW50OntuYW1lOiJBY2NvdW50In0sY2xvdWRjb250cm9sOntuYW1lOiJDbG91ZENvbnRyb2wifSxncmFmYW5hOntuYW1lOiJHcmFmYW5hIn0scGFub3JhbWE6e25hbWU6IlBhbm9yYW1hIn0sY2hpbWVzZGttZWV0aW5nczp7cHJlZml4OiJjaGltZS1zZGstbWVldGluZ3MiLG5hbWU6IkNoaW1lU0RLTWVldGluZ3MifSxyZXNpbGllbmNlaHViOntuYW1lOiJSZXNpbGllbmNlaHViIn0sbWlncmF0aW9uaHVic3RyYXRlZ3k6e25hbWU6Ik1pZ3JhdGlvbkh1YlN0cmF0ZWd5In0sYXBwY29uZmlnZGF0YTp7bmFtZToiQXBwQ29uZmlnRGF0YSJ9LGRyczp7bmFtZToiRHJzIn0sbWlncmF0aW9uaHVicmVmYWN0b3JzcGFjZXM6e3ByZWZpeDoibWlncmF0aW9uLWh1Yi1yZWZhY3Rvci1zcGFjZXMiLG5hbWU6Ik1pZ3JhdGlvbkh1YlJlZmFjdG9yU3BhY2VzIn0sZXZpZGVudGx5OntuYW1lOiJFdmlkZW50bHkifSxpbnNwZWN0b3IyOntuYW1lOiJJbnNwZWN0b3IyIn0scmJpbjp7bmFtZToiUmJpbiJ9LHJ1bTp7bmFtZToiUlVNIn0sYmFja3VwZ2F0ZXdheTp7cHJlZml4OiJiYWNrdXAtZ2F0ZXdheSIsbmFtZToiQmFja3VwR2F0ZXdheSJ9LGlvdHR3aW5tYWtlcjp7bmFtZToiSW9UVHdpbk1ha2VyIn0sd29ya3NwYWNlc3dlYjp7cHJlZml4OiJ3b3Jrc3BhY2VzLXdlYiIsbmFtZToiV29ya1NwYWNlc1dlYiJ9LGFtcGxpZnl1aWJ1aWxkZXI6e25hbWU6IkFtcGxpZnlVSUJ1aWxkZXIifSxrZXlzcGFjZXM6e25hbWU6IktleXNwYWNlcyJ9LGJpbGxpbmdjb25kdWN0b3I6e25hbWU6IkJpbGxpbmdjb25kdWN0b3IifSxnYW1lc3BhcmtzOntuYW1lOiJHYW1lU3BhcmtzIn0scGlucG9pbnRzbXN2b2ljZXYyOntwcmVmaXg6InBpbnBvaW50LXNtcy12b2ljZS12MiIsbmFtZToiUGlucG9pbnRTTVNWb2ljZVYyIn0saXZzY2hhdDp7bmFtZToiSXZzY2hhdCJ9LGNoaW1lc2RrbWVkaWFwaXBlbGluZXM6e3ByZWZpeDoiY2hpbWUtc2RrLW1lZGlhLXBpcGVsaW5lcyIsbmFtZToiQ2hpbWVTREtNZWRpYVBpcGVsaW5lcyJ9LGVtcnNlcnZlcmxlc3M6e3ByZWZpeDoiZW1yLXNlcnZlcmxlc3MiLG5hbWU6IkVNUlNlcnZlcmxlc3MifSxtMjp7bmFtZToiTTIifSxjb25uZWN0Y2FtcGFpZ25zOntuYW1lOiJDb25uZWN0Q2FtcGFpZ25zIn0scmVkc2hpZnRzZXJ2ZXJsZXNzOntwcmVmaXg6InJlZHNoaWZ0LXNlcnZlcmxlc3MiLG5hbWU6IlJlZHNoaWZ0U2VydmVybGVzcyJ9LHJvbGVzYW55d2hlcmU6e25hbWU6IlJvbGVzQW55d2hlcmUifSxsaWNlbnNlbWFuYWdlcnVzZXJzdWJzY3JpcHRpb25zOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlci11c2VyLXN1YnNjcmlwdGlvbnMiLG5hbWU6IkxpY2Vuc2VNYW5hZ2VyVXNlclN1YnNjcmlwdGlvbnMifSxiYWNrdXBzdG9yYWdlOntuYW1lOiJCYWNrdXBTdG9yYWdlIn0scHJpdmF0ZW5ldHdvcmtzOntuYW1lOiJQcml2YXRlTmV0d29ya3MifSxzdXBwb3J0YXBwOntwcmVmaXg6InN1cHBvcnQtYXBwIixuYW1lOiJTdXBwb3J0QXBwIn0sY29udHJvbHRvd2VyOntuYW1lOiJDb250cm9sVG93ZXIifSxpb3RmbGVldHdpc2U6e25hbWU6IklvVEZsZWV0V2lzZSJ9LG1pZ3JhdGlvbmh1Ym9yY2hlc3RyYXRvcjp7bmFtZToiTWlncmF0aW9uSHViT3JjaGVzdHJhdG9yIn0sY29ubmVjdGNhc2VzOntuYW1lOiJDb25uZWN0Q2FzZXMifSxyZXNvdXJjZWV4cGxvcmVyMjp7cHJlZml4OiJyZXNvdXJjZS1leHBsb3Jlci0yIixuYW1lOiJSZXNvdXJjZUV4cGxvcmVyMiJ9LHNjaGVkdWxlcjp7bmFtZToiU2NoZWR1bGVyIn0sY2hpbWVzZGt2b2ljZTp7cHJlZml4OiJjaGltZS1zZGstdm9pY2UiLG5hbWU6IkNoaW1lU0RLVm9pY2UifSxpb3Ryb2JvcnVubmVyOntwcmVmaXg6ImlvdC1yb2JvcnVubmVyIixuYW1lOiJJb1RSb2JvUnVubmVyIn0sc3Ntc2FwOntwcmVmaXg6InNzbS1zYXAiLG5hbWU6IlNzbVNhcCJ9LG9hbTp7bmFtZToiT0FNIn0sYXJjem9uYWxzaGlmdDp7cHJlZml4OiJhcmMtem9uYWwtc2hpZnQiLG5hbWU6IkFSQ1pvbmFsU2hpZnQifSxvbWljczp7bmFtZToiT21pY3MifSxvcGVuc2VhcmNoc2VydmVybGVzczp7bmFtZToiT3BlblNlYXJjaFNlcnZlcmxlc3MifSxzZWN1cml0eWxha2U6e25hbWU6IlNlY3VyaXR5TGFrZSJ9LHNpbXNwYWNld2VhdmVyOntuYW1lOiJTaW1TcGFjZVdlYXZlciJ9LGRvY2RiZWxhc3RpYzp7cHJlZml4OiJkb2NkYi1lbGFzdGljIixuYW1lOiJEb2NEQkVsYXN0aWMifSxzYWdlbWFrZXJnZW9zcGF0aWFsOntwcmVmaXg6InNhZ2VtYWtlci1nZW9zcGF0aWFsIixuYW1lOiJTYWdlTWFrZXJHZW9zcGF0aWFsIn0sY29kZWNhdGFseXN0OntuYW1lOiJDb2RlQ2F0YWx5c3QifSxwaXBlczp7bmFtZToiUGlwZXMifSxzYWdlbWFrZXJtZXRyaWNzOntwcmVmaXg6InNhZ2VtYWtlci1tZXRyaWNzIixuYW1lOiJTYWdlTWFrZXJNZXRyaWNzIn0sa2luZXNpc3ZpZGVvd2VicnRjc3RvcmFnZTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLXdlYnJ0Yy1zdG9yYWdlIixuYW1lOiJLaW5lc2lzVmlkZW9XZWJSVENTdG9yYWdlIn0sbGljZW5zZW1hbmFnZXJsaW51eHN1YnNjcmlwdGlvbnM6e3ByZWZpeDoibGljZW5zZS1tYW5hZ2VyLWxpbnV4LXN1YnNjcmlwdGlvbnMiLG5hbWU6IkxpY2Vuc2VNYW5hZ2VyTGludXhTdWJzY3JpcHRpb25zIn0sa2VuZHJhcmFua2luZzp7cHJlZml4OiJrZW5kcmEtcmFua2luZyIsbmFtZToiS2VuZHJhUmFua2luZyJ9LGNsZWFucm9vbXM6e25hbWU6IkNsZWFuUm9vbXMifSxjbG91ZHRyYWlsZGF0YTp7cHJlZml4OiJjbG91ZHRyYWlsLWRhdGEiLG5hbWU6IkNsb3VkVHJhaWxEYXRhIn0sdG5iOntuYW1lOiJUbmIifSxpbnRlcm5ldG1vbml0b3I6e25hbWU6IkludGVybmV0TW9uaXRvciJ9LGl2c3JlYWx0aW1lOntwcmVmaXg6Iml2cy1yZWFsdGltZSIsbmFtZToiSVZTUmVhbFRpbWUifSx2cGNsYXR0aWNlOntwcmVmaXg6InZwYy1sYXR0aWNlIixuYW1lOiJWUENMYXR0aWNlIn0sb3Npczp7bmFtZToiT1NJUyJ9fX0se31dLDU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTEtMDYtMTUiLGVuZHBvaW50UHJlZml4OiJzdHMiLGdsb2JhbEVuZHBvaW50OiJzdHMuYW1hem9uYXdzLmNvbSIscHJvdG9jb2w6InF1ZXJ5IixzZXJ2aWNlQWJicmV2aWF0aW9uOiJBV1MgU1RTIixzZXJ2aWNlRnVsbE5hbWU6IkFXUyBTZWN1cml0eSBUb2tlbiBTZXJ2aWNlIixzZXJ2aWNlSWQ6IlNUUyIsc2lnbmF0dXJlVmVyc2lvbjoidjQiLHVpZDoic3RzLTIwMTEtMDYtMTUiLHhtbE5hbWVzcGFjZToiaHR0cHM6Ly9zdHMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMS0wNi0xNS8ifSxvcGVyYXRpb25zOntBc3N1bWVSb2xlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJvbGVBcm4iLCJSb2xlU2Vzc2lvbk5hbWUiXSxtZW1iZXJzOntSb2xlQXJuOnt9LFJvbGVTZXNzaW9uTmFtZTp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxQb2xpY3k6e30sRHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn0sVGFnczp7c2hhcGU6IlM4In0sVHJhbnNpdGl2ZVRhZ0tleXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sRXh0ZXJuYWxJZDp7fSxTZXJpYWxOdW1iZXI6e30sVG9rZW5Db2RlOnt9LFNvdXJjZUlkZW50aXR5Ont9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJBc3N1bWVSb2xlUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2kifSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTbiJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxTb3VyY2VJZGVudGl0eTp7fX19fSxBc3N1bWVSb2xlV2l0aFNBTUw6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUm9sZUFybiIsIlByaW5jaXBhbEFybiIsIlNBTUxBc3NlcnRpb24iXSxtZW1iZXJzOntSb2xlQXJuOnt9LFByaW5jaXBhbEFybjp7fSxTQU1MQXNzZXJ0aW9uOnt9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LFBvbGljeTp7fSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVdpdGhTQU1MUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2kifSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTbiJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxTdWJqZWN0Ont9LFN1YmplY3RUeXBlOnt9LElzc3Vlcjp7fSxBdWRpZW5jZTp7fSxOYW1lUXVhbGlmaWVyOnt9LFNvdXJjZUlkZW50aXR5Ont9fX19LEFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUm9sZUFybiIsIlJvbGVTZXNzaW9uTmFtZSIsIldlYklkZW50aXR5VG9rZW4iXSxtZW1iZXJzOntSb2xlQXJuOnt9LFJvbGVTZXNzaW9uTmFtZTp7fSxXZWJJZGVudGl0eVRva2VuOnt9LFByb3ZpZGVySWQ6e30sUG9saWN5QXJuczp7c2hhcGU6IlM0In0sUG9saWN5Ont9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJBc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5UmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2kifSxTdWJqZWN0RnJvbVdlYklkZW50aXR5VG9rZW46e30sQXNzdW1lZFJvbGVVc2VyOntzaGFwZToiU24ifSxQYWNrZWRQb2xpY3lTaXplOnt0eXBlOiJpbnRlZ2VyIn0sUHJvdmlkZXI6e30sQXVkaWVuY2U6e30sU291cmNlSWRlbnRpdHk6e319fX0sRGVjb2RlQXV0aG9yaXphdGlvbk1lc3NhZ2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiRW5jb2RlZE1lc3NhZ2UiXSxtZW1iZXJzOntFbmNvZGVkTWVzc2FnZTp7fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiRGVjb2RlQXV0aG9yaXphdGlvbk1lc3NhZ2VSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7RGVjb2RlZE1lc3NhZ2U6e319fX0sR2V0QWNjZXNzS2V5SW5mbzp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJBY2Nlc3NLZXlJZCJdLG1lbWJlcnM6e0FjY2Vzc0tleUlkOnt9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJHZXRBY2Nlc3NLZXlJbmZvUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0FjY291bnQ6e319fX0sR2V0Q2FsbGVySWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0Q2FsbGVySWRlbnRpdHlSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VXNlcklkOnt9LEFjY291bnQ6e30sQXJuOnt9fX19LEdldEZlZGVyYXRpb25Ub2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJOYW1lIl0sbWVtYmVyczp7TmFtZTp7fSxQb2xpY3k6e30sUG9saWN5QXJuczp7c2hhcGU6IlM0In0sRHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn0sVGFnczp7c2hhcGU6IlM4In19fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldEZlZGVyYXRpb25Ub2tlblJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNpIn0sRmVkZXJhdGVkVXNlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkZlZGVyYXRlZFVzZXJJZCIsIkFybiJdLG1lbWJlcnM6e0ZlZGVyYXRlZFVzZXJJZDp7fSxBcm46e319fSxQYWNrZWRQb2xpY3lTaXplOnt0eXBlOiJpbnRlZ2VyIn19fX0sR2V0U2Vzc2lvblRva2VuOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifSxTZXJpYWxOdW1iZXI6e30sVG9rZW5Db2RlOnt9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJHZXRTZXNzaW9uVG9rZW5SZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTaSJ9fX19fSxzaGFwZXM6e1M0Ont0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXJuOnt9fX19LFM4Ont0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJLZXkiLCJWYWx1ZSJdLG1lbWJlcnM6e0tleTp7fSxWYWx1ZTp7fX19fSxTaTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkFjY2Vzc0tleUlkIiwiU2VjcmV0QWNjZXNzS2V5IiwiU2Vzc2lvblRva2VuIiwiRXhwaXJhdGlvbiJdLG1lbWJlcnM6e0FjY2Vzc0tleUlkOnt9LFNlY3JldEFjY2Vzc0tleTp7fSxTZXNzaW9uVG9rZW46e30sRXhwaXJhdGlvbjp7dHlwZToidGltZXN0YW1wIn19fSxTbjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkFzc3VtZWRSb2xlSWQiLCJBcm4iXSxtZW1iZXJzOntBc3N1bWVkUm9sZUlkOnt9LEFybjp7fX19fX19LHt9XSw2OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtwYWdpbmF0aW9uOnt9fX0se31dLDc6W2Z1bmN0aW9uKGUsdCxuKXtlKCIuLi9saWIvbm9kZV9sb2FkZXIiKTt2YXIgcj1lKCIuLi9saWIvY29yZSIpLG89ci5TZXJ2aWNlLGk9ci5hcGlMb2FkZXI7aS5zZXJ2aWNlcy5jb2duaXRvaWRlbnRpdHk9e30sci5Db2duaXRvSWRlbnRpdHk9by5kZWZpbmVTZXJ2aWNlKCJjb2duaXRvaWRlbnRpdHkiLFsiMjAxNC0wNi0zMCJdKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5zZXJ2aWNlcy5jb2duaXRvaWRlbnRpdHksIjIwMTQtMDYtMzAiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1lKCIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5taW4uanNvbiIpO3JldHVybiB0LnBhZ2luYXRvcnM9ZSgiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAucGFnaW5hdG9ycy5qc29uIikucGFnaW5hdGlvbix0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuZXhwb3J0cz1yLkNvZ25pdG9JZGVudGl0eX0seyIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5taW4uanNvbiI6MSwiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAucGFnaW5hdG9ycy5qc29uIjoyLCIuLi9saWIvY29yZSI6MTksIi4uL2xpYi9ub2RlX2xvYWRlciI6MTZ9XSw4OltmdW5jdGlvbihlLHQsbil7ZSgiLi4vbGliL25vZGVfbG9hZGVyIik7dmFyIHI9ZSgiLi4vbGliL2NvcmUiKSxvPXIuU2VydmljZSxpPXIuYXBpTG9hZGVyO2kuc2VydmljZXMuc3RzPXt9LHIuU1RTPW8uZGVmaW5lU2VydmljZSgic3RzIixbIjIwMTEtMDYtMTUiXSksZSgiLi4vbGliL3NlcnZpY2VzL3N0cyIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnNlcnZpY2VzLnN0cywiMjAxMS0wNi0xNSIse2dldDpmdW5jdGlvbigpe3ZhciB0PWUoIi4uL2FwaXMvc3RzLTIwMTEtMDYtMTUubWluLmpzb24iKTtyZXR1cm4gdC5wYWdpbmF0b3JzPWUoIi4uL2FwaXMvc3RzLTIwMTEtMDYtMTUucGFnaW5hdG9ycy5qc29uIikucGFnaW5hdGlvbix0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuZXhwb3J0cz1yLlNUU30seyIuLi9hcGlzL3N0cy0yMDExLTA2LTE1Lm1pbi5qc29uIjo1LCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1LnBhZ2luYXRvcnMuanNvbiI6NiwiLi4vbGliL2NvcmUiOjE5LCIuLi9saWIvbm9kZV9sb2FkZXIiOjE2LCIuLi9saWIvc2VydmljZXMvc3RzIjo2M31dLDk6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7aWYoIXIuc2VydmljZXMuaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkU2VydmljZTogRmFpbGVkIHRvIGxvYWQgYXBpIGZvciAiK2UpO3JldHVybiByLnNlcnZpY2VzW2VdW3RdfXIuc2VydmljZXM9e30sdC5leHBvcnRzPXJ9LHt9XSwxMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3NlckhtYWMiKSxvPWUoIi4vYnJvd3Nlck1kNSIpLGk9ZSgiLi9icm93c2VyU2hhMSIpLHM9ZSgiLi9icm93c2VyU2hhMjU2Iik7dC5leHBvcnRzPXtjcmVhdGVIYXNoOmZ1bmN0aW9uKGUpe2lmKCJtZDUiPT09KGU9ZS50b0xvd2VyQ2FzZSgpKSlyZXR1cm4gbmV3IG87aWYoInNoYTI1NiI9PT1lKXJldHVybiBuZXcgcztpZigic2hhMSI9PT1lKXJldHVybiBuZXcgaTt0aHJvdyBuZXcgRXJyb3IoIkhhc2ggYWxnb3JpdGhtICIrZSsiIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgU0RLIil9LGNyZWF0ZUhtYWM6ZnVuY3Rpb24oZSx0KXtpZigibWQ1Ij09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIG5ldyByKG8sdCk7aWYoInNoYTI1NiI9PT1lKXJldHVybiBuZXcgcihzLHQpO2lmKCJzaGExIj09PWUpcmV0dXJuIG5ldyByKGksdCk7dGhyb3cgbmV3IEVycm9yKCJITUFDIGFsZ29yaXRobSAiK2UrIiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIFNESyIpfSxjcmVhdGVTaWduOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJjcmVhdGVTaWduIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgYnJvd3NlciIpfX19LHsiLi9icm93c2VySG1hYyI6MTIsIi4vYnJvd3Nlck1kNSI6MTMsIi4vYnJvd3NlclNoYTEiOjE0LCIuL2Jyb3dzZXJTaGEyNTYiOjE1fV0sMTE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJidWZmZXIvIikuQnVmZmVyOyJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnZvaWQgMD09PUFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldz1mdW5jdGlvbihlKXtyZXR1cm4gby5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSk+LTF9KTt2YXIgbz1bIltvYmplY3QgSW50OEFycmF5XSIsIltvYmplY3QgVWludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsIltvYmplY3QgSW50MTZBcnJheV0iLCJbb2JqZWN0IFVpbnQxNkFycmF5XSIsIltvYmplY3QgSW50MzJBcnJheV0iLCJbb2JqZWN0IFVpbnQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQ2NEFycmF5XSIsIltvYmplY3QgRGF0YVZpZXddIl07dC5leHBvcnRzPXtpc0VtcHR5RGF0YTpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/MD09PWUubGVuZ3RoOjA9PT1lLmJ5dGVMZW5ndGh9LGNvbnZlcnRUb0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPW5ldyByKGUsInV0ZjgiKSksQXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgvVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk6bmV3IFVpbnQ4QXJyYXkoZSl9fX0seyJidWZmZXIvIjo4N31dLDEyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9icm93c2VySGFzaFV0aWxzIik7ZnVuY3Rpb24gbyhlLHQpe3RoaXMuaGFzaD1uZXcgZSx0aGlzLm91dGVyPW5ldyBlO3ZhciBuPWZ1bmN0aW9uKGUsdCl7dmFyIG49ci5jb252ZXJ0VG9CdWZmZXIodCk7aWYobi5ieXRlTGVuZ3RoPmUuQkxPQ0tfU0laRSl7dmFyIG89bmV3IGU7by51cGRhdGUobiksbj1vLmRpZ2VzdCgpfXZhciBpPW5ldyBVaW50OEFycmF5KGUuQkxPQ0tfU0laRSk7cmV0dXJuIGkuc2V0KG4pLGl9KGUsdCksbz1uZXcgVWludDhBcnJheShlLkJMT0NLX1NJWkUpO28uc2V0KG4pO2Zvcih2YXIgaT0wO2k8ZS5CTE9DS19TSVpFO2krKyluW2ldXj01NCxvW2ldXj05Mjtmb3IodGhpcy5oYXNoLnVwZGF0ZShuKSx0aGlzLm91dGVyLnVwZGF0ZShvKSxpPTA7aTxuLmJ5dGVMZW5ndGg7aSsrKW5baV09MH10LmV4cG9ydHM9byxvLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoci5pc0VtcHR5RGF0YShlKXx8dGhpcy5lcnJvcilyZXR1cm4gdGhpczt0cnl7dGhpcy5oYXNoLnVwZGF0ZShyLmNvbnZlcnRUb0J1ZmZlcihlKSl9Y2F0Y2goZSl7dGhpcy5lcnJvcj1lfXJldHVybiB0aGlzfSxvLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWR8fHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaGFzaC5kaWdlc3QoKSksdGhpcy5vdXRlci5kaWdlc3QoZSl9fSx7Ii4vYnJvd3Nlckhhc2hVdGlscyI6MTF9XSwxMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpLG89ZSgiYnVmZmVyLyIpLkJ1ZmZlcixpPTY0O2Z1bmN0aW9uIHMoKXt0aGlzLnN0YXRlPVsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzhdLHRoaXMuYnVmZmVyPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoaSkpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITF9ZnVuY3Rpb24gYShlLHQsbixyLG8saSl7cmV0dXJuKCh0PSh0K2UmNDI5NDk2NzI5NSkrKHIraSY0Mjk0OTY3Mjk1KSY0Mjk0OTY3Mjk1KTw8b3x0Pj4+MzItbykrbiY0Mjk0OTY3Mjk1fWZ1bmN0aW9uIGMoZSx0LG4scixvLGkscyl7cmV0dXJuIGEodCZufH50JnIsZSx0LG8saSxzKX1mdW5jdGlvbiB1KGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKHQmcnxuJn5yLGUsdCxvLGkscyl9ZnVuY3Rpb24gbChlLHQsbixyLG8saSxzKXtyZXR1cm4gYSh0Xm5ecixlLHQsbyxpLHMpfWZ1bmN0aW9uIHAoZSx0LG4scixvLGkscyl7cmV0dXJuIGEobl4odHx+ciksZSx0LG8saSxzKX10LmV4cG9ydHM9cyxzLkJMT0NLX1NJWkU9aSxzLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoci5pc0VtcHR5RGF0YShlKSlyZXR1cm4gdGhpcztpZih0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBhbHJlYWR5IGZpbmlzaGVkIGhhc2guIik7dmFyIHQ9ci5jb252ZXJ0VG9CdWZmZXIoZSksbj0wLG89dC5ieXRlTGVuZ3RoO2Zvcih0aGlzLmJ5dGVzSGFzaGVkKz1vO28+MDspdGhpcy5idWZmZXIuc2V0VWludDgodGhpcy5idWZmZXJMZW5ndGgrKyx0W24rK10pLG8tLSx0aGlzLmJ1ZmZlckxlbmd0aD09PWkmJih0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmJ1ZmZlckxlbmd0aD0wKTtyZXR1cm4gdGhpc30scy5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD10aGlzLG49dC5idWZmZXIscj10LmJ1ZmZlckxlbmd0aCxzPTgqdC5ieXRlc0hhc2hlZDtpZihuLnNldFVpbnQ4KHRoaXMuYnVmZmVyTGVuZ3RoKyssMTI4KSxyJWk+PTU2KXtmb3IodmFyIGE9dGhpcy5idWZmZXJMZW5ndGg7YTxpO2ErKyluLnNldFVpbnQ4KGEsMCk7dGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MH1mb3IoYT10aGlzLmJ1ZmZlckxlbmd0aDthPDU2O2ErKyluLnNldFVpbnQ4KGEsMCk7bi5zZXRVaW50MzIoNTYscz4+PjAsITApLG4uc2V0VWludDMyKDYwLE1hdGguZmxvb3Iocy80Mjk0OTY3Mjk2KSwhMCksdGhpcy5oYXNoQnVmZmVyKCksdGhpcy5maW5pc2hlZD0hMH12YXIgYz1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7Zm9yKGE9MDthPDQ7YSsrKWMuc2V0VWludDMyKDQqYSx0aGlzLnN0YXRlW2FdLCEwKTt2YXIgdT1uZXcgbyhjLmJ1ZmZlcixjLmJ5dGVPZmZzZXQsYy5ieXRlTGVuZ3RoKTtyZXR1cm4gZT91LnRvU3RyaW5nKGUpOnV9LHMucHJvdG90eXBlLmhhc2hCdWZmZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJ1ZmZlcix0PXRoaXMuc3RhdGUsbj10WzBdLHI9dFsxXSxvPXRbMl0saT10WzNdO249YyhuLHIsbyxpLGUuZ2V0VWludDMyKDAsITApLDcsMzYxNDA5MDM2MCksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoNCwhMCksMTIsMzkwNTQwMjcxMCksbz1jKG8saSxuLHIsZS5nZXRVaW50MzIoOCwhMCksMTcsNjA2MTA1ODE5KSxyPWMocixvLGksbixlLmdldFVpbnQzMigxMiwhMCksMjIsMzI1MDQ0MTk2Niksbj1jKG4scixvLGksZS5nZXRVaW50MzIoMTYsITApLDcsNDExODU0ODM5OSksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoMjAsITApLDEyLDEyMDAwODA0MjYpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDI0LCEwKSwxNywyODIxNzM1OTU1KSxyPWMocixvLGksbixlLmdldFVpbnQzMigyOCwhMCksMjIsNDI0OTI2MTMxMyksbj1jKG4scixvLGksZS5nZXRVaW50MzIoMzIsITApLDcsMTc3MDAzNTQxNiksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoMzYsITApLDEyLDIzMzY1NTI4NzkpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDQwLCEwKSwxNyw0Mjk0OTI1MjMzKSxyPWMocixvLGksbixlLmdldFVpbnQzMig0NCwhMCksMjIsMjMwNDU2MzEzNCksbj1jKG4scixvLGksZS5nZXRVaW50MzIoNDgsITApLDcsMTgwNDYwMzY4MiksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoNTIsITApLDEyLDQyNTQ2MjYxOTUpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDU2LCEwKSwxNywyNzkyOTY1MDA2KSxuPXUobixyPWMocixvLGksbixlLmdldFVpbnQzMig2MCwhMCksMjIsMTIzNjUzNTMyOSksbyxpLGUuZ2V0VWludDMyKDQsITApLDUsNDEyOTE3MDc4NiksaT11KGksbixyLG8sZS5nZXRVaW50MzIoMjQsITApLDksMzIyNTQ2NTY2NCksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoNDQsITApLDE0LDY0MzcxNzcxMykscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMCwhMCksMjAsMzkyMTA2OTk5NCksbj11KG4scixvLGksZS5nZXRVaW50MzIoMjAsITApLDUsMzU5MzQwODYwNSksaT11KGksbixyLG8sZS5nZXRVaW50MzIoNDAsITApLDksMzgwMTYwODMpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDYwLCEwKSwxNCwzNjM0NDg4OTYxKSxyPXUocixvLGksbixlLmdldFVpbnQzMigxNiwhMCksMjAsMzg4OTQyOTQ0OCksbj11KG4scixvLGksZS5nZXRVaW50MzIoMzYsITApLDUsNTY4NDQ2NDM4KSxpPXUoaSxuLHIsbyxlLmdldFVpbnQzMig1NiwhMCksOSwzMjc1MTYzNjA2KSxvPXUobyxpLG4scixlLmdldFVpbnQzMigxMiwhMCksMTQsNDEwNzYwMzMzNSkscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMzIsITApLDIwLDExNjM1MzE1MDEpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDUyLCEwKSw1LDI4NTAyODU4MjkpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDgsITApLDksNDI0MzU2MzUxMiksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoMjgsITApLDE0LDE3MzUzMjg0NzMpLG49bChuLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDQ4LCEwKSwyMCwyMzY4MzU5NTYyKSxvLGksZS5nZXRVaW50MzIoMjAsITApLDQsNDI5NDU4ODczOCksaT1sKGksbixyLG8sZS5nZXRVaW50MzIoMzIsITApLDExLDIyNzIzOTI4MzMpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDQ0LCEwKSwxNiwxODM5MDMwNTYyKSxyPWwocixvLGksbixlLmdldFVpbnQzMig1NiwhMCksMjMsNDI1OTY1Nzc0MCksbj1sKG4scixvLGksZS5nZXRVaW50MzIoNCwhMCksNCwyNzYzOTc1MjM2KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMigxNiwhMCksMTEsMTI3Mjg5MzM1Myksbz1sKG8saSxuLHIsZS5nZXRVaW50MzIoMjgsITApLDE2LDQxMzk0Njk2NjQpLHI9bChyLG8saSxuLGUuZ2V0VWludDMyKDQwLCEwKSwyMywzMjAwMjM2NjU2KSxuPWwobixyLG8saSxlLmdldFVpbnQzMig1MiwhMCksNCw2ODEyNzkxNzQpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDAsITApLDExLDM5MzY0MzAwNzQpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDEyLCEwKSwxNiwzNTcyNDQ1MzE3KSxyPWwocixvLGksbixlLmdldFVpbnQzMigyNCwhMCksMjMsNzYwMjkxODkpLG49bChuLHIsbyxpLGUuZ2V0VWludDMyKDM2LCEwKSw0LDM2NTQ2MDI4MDkpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDQ4LCEwKSwxMSwzODczMTUxNDYxKSxvPWwobyxpLG4scixlLmdldFVpbnQzMig2MCwhMCksMTYsNTMwNzQyNTIwKSxuPXAobixyPWwocixvLGksbixlLmdldFVpbnQzMig4LCEwKSwyMywzMjk5NjI4NjQ1KSxvLGksZS5nZXRVaW50MzIoMCwhMCksNiw0MDk2MzM2NDUyKSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMigyOCwhMCksMTAsMTEyNjg5MTQxNSksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoNTYsITApLDE1LDI4Nzg2MTIzOTEpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDIwLCEwKSwyMSw0MjM3NTMzMjQxKSxuPXAobixyLG8saSxlLmdldFVpbnQzMig0OCwhMCksNiwxNzAwNDg1NTcxKSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMigxMiwhMCksMTAsMjM5OTk4MDY5MCksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoNDAsITApLDE1LDQyOTM5MTU3NzMpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDQsITApLDIxLDIyNDAwNDQ0OTcpLG49cChuLHIsbyxpLGUuZ2V0VWludDMyKDMyLCEwKSw2LDE4NzMzMTMzNTkpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDYwLCEwKSwxMCw0MjY0MzU1NTUyKSxvPXAobyxpLG4scixlLmdldFVpbnQzMigyNCwhMCksMTUsMjczNDc2ODkxNikscj1wKHIsbyxpLG4sZS5nZXRVaW50MzIoNTIsITApLDIxLDEzMDkxNTE2NDkpLG49cChuLHIsbyxpLGUuZ2V0VWludDMyKDE2LCEwKSw2LDQxNDk0NDQyMjYpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDQ0LCEwKSwxMCwzMTc0NzU2OTE3KSxvPXAobyxpLG4scixlLmdldFVpbnQzMig4LCEwKSwxNSw3MTg3ODcyNTkpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDM2LCEwKSwyMSwzOTUxNDgxNzQ1KSx0WzBdPW4rdFswXSY0Mjk0OTY3Mjk1LHRbMV09cit0WzFdJjQyOTQ5NjcyOTUsdFsyXT1vK3RbMl0mNDI5NDk2NzI5NSx0WzNdPWkrdFszXSY0Mjk0OTY3Mjk1fX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExLCJidWZmZXIvIjo4N31dLDE0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcixvPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpO2Z1bmN0aW9uIGkoKXt0aGlzLmgwPTE3MzI1ODQxOTMsdGhpcy5oMT00MDIzMjMzNDE3LHRoaXMuaDI9MjU2MjM4MzEwMix0aGlzLmgzPTI3MTczMzg3OCx0aGlzLmg0PTMyODUzNzc1MjAsdGhpcy5ibG9jaz1uZXcgVWludDMyQXJyYXkoODApLHRoaXMub2Zmc2V0PTAsdGhpcy5zaGlmdD0yNCx0aGlzLnRvdGFsTGVuZ3RoPTB9bmV3IFVpbnQzMkFycmF5KFsxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsLTE4OTQwMDc1ODgsLTg5OTQ5NzUxNF0pLE1hdGgucG93KDIsNTMpLHQuZXhwb3J0cz1pLGkuQkxPQ0tfU0laRT02NCxpLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO2lmKG8uaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7dmFyIHQ9KGU9by5jb252ZXJ0VG9CdWZmZXIoZSkpLmxlbmd0aDt0aGlzLnRvdGFsTGVuZ3RoKz04KnQ7Zm9yKHZhciBuPTA7bjx0O24rKyl0aGlzLndyaXRlKGVbbl0pO3JldHVybiB0aGlzfSxpLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlKXt0aGlzLmJsb2NrW3RoaXMub2Zmc2V0XXw9KDI1NSZlKTw8dGhpcy5zaGlmdCx0aGlzLnNoaWZ0P3RoaXMuc2hpZnQtPTg6KHRoaXMub2Zmc2V0KyssdGhpcy5zaGlmdD0yNCksMTY9PT10aGlzLm9mZnNldCYmdGhpcy5wcm9jZXNzQmxvY2soKX0saS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoMTI4KSwodGhpcy5vZmZzZXQ+MTR8fDE0PT09dGhpcy5vZmZzZXQmJnRoaXMuc2hpZnQ8MjQpJiZ0aGlzLnByb2Nlc3NCbG9jaygpLHRoaXMub2Zmc2V0PTE0LHRoaXMuc2hpZnQ9MjQsdGhpcy53cml0ZSgwKSx0aGlzLndyaXRlKDApLHRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD4weGZmZmZmZmZmZmY/dGhpcy50b3RhbExlbmd0aC8xMDk5NTExNjI3Nzc2OjApLHRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD40Mjk0OTY3Mjk1P3RoaXMudG90YWxMZW5ndGgvNDI5NDk2NzI5NjowKTtmb3IodmFyIHQ9MjQ7dD49MDt0LT04KXRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD4+dCk7dmFyIG49bmV3IHIoMjApLG89bmV3IERhdGFWaWV3KG4uYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0aGlzLmgwLCExKSxvLnNldFVpbnQzMig0LHRoaXMuaDEsITEpLG8uc2V0VWludDMyKDgsdGhpcy5oMiwhMSksby5zZXRVaW50MzIoMTIsdGhpcy5oMywhMSksby5zZXRVaW50MzIoMTYsdGhpcy5oNCwhMSksZT9uLnRvU3RyaW5nKGUpOm59LGkucHJvdG90eXBlLnByb2Nlc3NCbG9jaz1mdW5jdGlvbigpe2Zvcih2YXIgZT0xNjtlPDgwO2UrKyl7dmFyIHQ9dGhpcy5ibG9ja1tlLTNdXnRoaXMuYmxvY2tbZS04XV50aGlzLmJsb2NrW2UtMTRdXnRoaXMuYmxvY2tbZS0xNl07dGhpcy5ibG9ja1tlXT10PDwxfHQ+Pj4zMX12YXIgbixyLG89dGhpcy5oMCxpPXRoaXMuaDEscz10aGlzLmgyLGE9dGhpcy5oMyxjPXRoaXMuaDQ7Zm9yKGU9MDtlPDgwO2UrKyl7ZTwyMD8obj1hXmkmKHNeYSkscj0xNTE4NTAwMjQ5KTplPDQwPyhuPWlec15hLHI9MTg1OTc3NTM5Myk6ZTw2MD8obj1pJnN8YSYoaXxzKSxyPTI0MDA5NTk3MDgpOihuPWlec15hLHI9MzM5NTQ2OTc4Mik7dmFyIHU9KG88PDV8bz4+PjI3KStuK2MrcisoMHx0aGlzLmJsb2NrW2VdKTtjPWEsYT1zLHM9aTw8MzB8aT4+PjIsaT1vLG89dX1mb3IodGhpcy5oMD10aGlzLmgwK298MCx0aGlzLmgxPXRoaXMuaDEraXwwLHRoaXMuaDI9dGhpcy5oMitzfDAsdGhpcy5oMz10aGlzLmgzK2F8MCx0aGlzLmg0PXRoaXMuaDQrY3wwLHRoaXMub2Zmc2V0PTAsZT0wO2U8MTY7ZSsrKXRoaXMuYmxvY2tbZV09MH19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODd9XSwxNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoImJ1ZmZlci8iKS5CdWZmZXIsbz1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKSxpPTY0LHM9bmV3IFVpbnQzMkFycmF5KFsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdKSxhPU1hdGgucG93KDIsNTMpLTE7ZnVuY3Rpb24gYygpe3RoaXMuc3RhdGU9WzE3NzkwMzM3MDMsMzE0NDEzNDI3NywxMDEzOTA0MjQyLDI3NzM0ODA3NjIsMTM1OTg5MzExOSwyNjAwODIyOTI0LDUyODczNDYzNSwxNTQxNDU5MjI1XSx0aGlzLnRlbXA9bmV3IEludDMyQXJyYXkoNjQpLHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExfXQuZXhwb3J0cz1jLGMuQkxPQ0tfU0laRT1pLGMucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZih0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBhbHJlYWR5IGZpbmlzaGVkIGhhc2guIik7aWYoby5pc0VtcHR5RGF0YShlKSlyZXR1cm4gdGhpczt2YXIgdD0wLG49KGU9by5jb252ZXJ0VG9CdWZmZXIoZSkpLmJ5dGVMZW5ndGg7aWYodGhpcy5ieXRlc0hhc2hlZCs9biw4KnRoaXMuYnl0ZXNIYXNoZWQ+YSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBoYXNoIG1vcmUgdGhhbiAyXjUzIC0gMSBiaXRzIik7Zm9yKDtuPjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbdCsrXSxuLS0sdGhpcy5idWZmZXJMZW5ndGg9PT1pJiYodGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MCk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9OCp0aGlzLmJ5dGVzSGFzaGVkLG49bmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyLmJ1ZmZlcix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0LHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpLG89dGhpcy5idWZmZXJMZW5ndGg7aWYobi5zZXRVaW50OCh0aGlzLmJ1ZmZlckxlbmd0aCsrLDEyOCksbyVpPj01Nil7Zm9yKHZhciBzPXRoaXMuYnVmZmVyTGVuZ3RoO3M8aTtzKyspbi5zZXRVaW50OChzLDApO3RoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTB9Zm9yKHM9dGhpcy5idWZmZXJMZW5ndGg7czw1NjtzKyspbi5zZXRVaW50OChzLDApO24uc2V0VWludDMyKDU2LE1hdGguZmxvb3IodC80Mjk0OTY3Mjk2KSwhMCksbi5zZXRVaW50MzIoNjAsdCksdGhpcy5oYXNoQnVmZmVyKCksdGhpcy5maW5pc2hlZD0hMH12YXIgYT1uZXcgcigzMik7Zm9yKHM9MDtzPDg7cysrKWFbNCpzXT10aGlzLnN0YXRlW3NdPj4+MjQmMjU1LGFbNCpzKzFdPXRoaXMuc3RhdGVbc10+Pj4xNiYyNTUsYVs0KnMrMl09dGhpcy5zdGF0ZVtzXT4+PjgmMjU1LGFbNCpzKzNdPXRoaXMuc3RhdGVbc10+Pj4wJjI1NTtyZXR1cm4gZT9hLnRvU3RyaW5nKGUpOmF9LGMucHJvdG90eXBlLmhhc2hCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5idWZmZXIsdD10aGlzLnN0YXRlLG49dFswXSxyPXRbMV0sbz10WzJdLGE9dFszXSxjPXRbNF0sdT10WzVdLGw9dFs2XSxwPXRbN10sZD0wO2Q8aTtkKyspe2lmKGQ8MTYpdGhpcy50ZW1wW2RdPSgyNTUmZVs0KmRdKTw8MjR8KDI1NSZlWzQqZCsxXSk8PDE2fCgyNTUmZVs0KmQrMl0pPDw4fDI1NSZlWzQqZCszXTtlbHNle3ZhciBoPXRoaXMudGVtcFtkLTJdLGY9KGg+Pj4xN3xoPDwxNSleKGg+Pj4xOXxoPDwxMyleaD4+PjEwLGc9KChoPXRoaXMudGVtcFtkLTE1XSk+Pj43fGg8PDI1KV4oaD4+PjE4fGg8PDE0KV5oPj4+Mzt0aGlzLnRlbXBbZF09KGYrdGhpcy50ZW1wW2QtN118MCkrKGcrdGhpcy50ZW1wW2QtMTZdfDApfXZhciBtPSgoKGM+Pj42fGM8PDI2KV4oYz4+PjExfGM8PDIxKV4oYz4+PjI1fGM8PDcpKSsoYyZ1Xn5jJmwpfDApKyhwKyhzW2RdK3RoaXMudGVtcFtkXXwwKXwwKXwwLHY9KChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpKyhuJnJebiZvXnImbyl8MDtwPWwsbD11LHU9YyxjPWErbXwwLGE9byxvPXIscj1uLG49bSt2fDB9dFswXSs9bix0WzFdKz1yLHRbMl0rPW8sdFszXSs9YSx0WzRdKz1jLHRbNV0rPXUsdFs2XSs9bCx0WzddKz1wfX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExLCJidWZmZXIvIjo4N31dLDE2OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciBuPWUoIi4vdXRpbCIpO24uY3J5cHRvLmxpYj1lKCIuL2Jyb3dzZXJDcnlwdG9MaWIiKSxuLkJ1ZmZlcj1lKCJidWZmZXIvIikuQnVmZmVyLG4udXJsPWUoInVybC8iKSxuLnF1ZXJ5c3RyaW5nPWUoInF1ZXJ5c3RyaW5nLyIpLG4ucmVhbENsb2NrPWUoIi4vcmVhbGNsb2NrL2Jyb3dzZXJDbG9jayIpLG4uZW52aXJvbm1lbnQ9ImpzIixuLmNyZWF0ZUV2ZW50U3RyZWFtPWUoIi4vZXZlbnQtc3RyZWFtL2J1ZmZlcmVkLWNyZWF0ZS1ldmVudC1zdHJlYW0iKS5jcmVhdGVFdmVudFN0cmVhbSxuLmlzQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybiEwfSxuLmlzTm9kZT1mdW5jdGlvbigpe3JldHVybiExfTt2YXIgcj1lKCIuL2NvcmUiKTtpZih0LmV4cG9ydHM9cixlKCIuL2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIiksZSgiLi9jcmVkZW50aWFscy90ZW1wb3JhcnlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL2NoYWluYWJsZV90ZW1wb3JhcnlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL3dlYl9pZGVudGl0eV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY29nbml0b19pZGVudGl0eV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvc2FtbF9jcmVkZW50aWFscyIpLHIuWE1MLlBhcnNlcj1lKCIuL3htbC9icm93c2VyX3BhcnNlciIpLGUoIi4vaHR0cC94aHIiKSx2b2lkIDA9PT1vKXZhciBvPXticm93c2VyOiEwfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9icm93c2VyQ3J5cHRvTGliIjoxMCwiLi9jb3JlIjoxOSwiLi9jcmVkZW50aWFscyI6MjAsIi4vY3JlZGVudGlhbHMvY2hhaW5hYmxlX3RlbXBvcmFyeV9jcmVkZW50aWFscyI6MjEsIi4vY3JlZGVudGlhbHMvY29nbml0b19pZGVudGl0eV9jcmVkZW50aWFscyI6MjIsIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiI6MjMsIi4vY3JlZGVudGlhbHMvc2FtbF9jcmVkZW50aWFscyI6MjQsIi4vY3JlZGVudGlhbHMvdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIjoyNSwiLi9jcmVkZW50aWFscy93ZWJfaWRlbnRpdHlfY3JlZGVudGlhbHMiOjI2LCIuL2V2ZW50LXN0cmVhbS9idWZmZXJlZC1jcmVhdGUtZXZlbnQtc3RyZWFtIjoyOCwiLi9odHRwL3hociI6MzYsIi4vcmVhbGNsb2NrL2Jyb3dzZXJDbG9jayI6NTQsIi4vdXRpbCI6NzQsIi4veG1sL2Jyb3dzZXJfcGFyc2VyIjo3NSxfcHJvY2Vzczo5MiwiYnVmZmVyLyI6ODcsInF1ZXJ5c3RyaW5nLyI6OTgsInVybC8iOjEwMH1dLDE3OltmdW5jdGlvbihlLHQsbil7dmFyIHIsbz1lKCIuL2NvcmUiKTtlKCIuL2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIiksby5Db25maWc9by51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KSxlPXRoaXMuZXh0cmFjdENyZWRlbnRpYWxzKGUpLG8udXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLmtleXMsKGZ1bmN0aW9uKHQsbil7dGhpcy5zZXQodCxlW3RdLG4pfSkpfSxnZXRDcmVkZW50aWFsczpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXM7ZnVuY3Rpb24gcih0KXtlKHQsdD9udWxsOm4uY3JlZGVudGlhbHMpfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gbmV3IG8udXRpbC5lcnJvcih0fHxuZXcgRXJyb3Ise2NvZGU6IkNyZWRlbnRpYWxzRXJyb3IiLG1lc3NhZ2U6ZSxuYW1lOiJDcmVkZW50aWFsc0Vycm9yIn0pfW4uY3JlZGVudGlhbHM/ImZ1bmN0aW9uIj09dHlwZW9mIG4uY3JlZGVudGlhbHMuZ2V0P24uY3JlZGVudGlhbHMuZ2V0KChmdW5jdGlvbihlKXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCBjcmVkZW50aWFscyBmcm9tICIrbi5jcmVkZW50aWFscy5jb25zdHJ1Y3Rvci5uYW1lLGUpKSxyKGUpfSkpOih0PW51bGwsbi5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmbi5jcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXl8fCh0PWkoIk1pc3NpbmcgY3JlZGVudGlhbHMiKSkscih0KSk6bi5jcmVkZW50aWFsUHJvdmlkZXI/bi5jcmVkZW50aWFsUHJvdmlkZXIucmVzb2x2ZSgoZnVuY3Rpb24oZSx0KXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCBjcmVkZW50aWFscyBmcm9tIGFueSBwcm92aWRlcnMiLGUpKSxuLmNyZWRlbnRpYWxzPXQscihlKX0pKTpyKGkoIk5vIGNyZWRlbnRpYWxzIHRvIGxvYWQiKSl9LGdldFRva2VuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcztmdW5jdGlvbiByKHQpe2UodCx0P251bGw6bi50b2tlbil9ZnVuY3Rpb24gaShlLHQpe3JldHVybiBuZXcgby51dGlsLmVycm9yKHR8fG5ldyBFcnJvcix7Y29kZToiVG9rZW5FcnJvciIsbWVzc2FnZTplLG5hbWU6IlRva2VuRXJyb3IifSl9bi50b2tlbj8iZnVuY3Rpb24iPT10eXBlb2Ygbi50b2tlbi5nZXQ/bi50b2tlbi5nZXQoKGZ1bmN0aW9uKGUpe2UmJihlPWkoIkNvdWxkIG5vdCBsb2FkIHRva2VuIGZyb20gIituLnRva2VuLmNvbnN0cnVjdG9yLm5hbWUsZSkpLHIoZSl9KSk6KHQ9bnVsbCxuLnRva2VuLnRva2VufHwodD1pKCJNaXNzaW5nIHRva2VuIikpLHIodCkpOm4udG9rZW5Qcm92aWRlcj9uLnRva2VuUHJvdmlkZXIucmVzb2x2ZSgoZnVuY3Rpb24oZSx0KXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCB0b2tlbiBmcm9tIGFueSBwcm92aWRlcnMiLGUpKSxuLnRva2VuPXQscihlKX0pKTpyKGkoIk5vIHRva2VuIHRvIGxvYWQiKSl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ITEsZT10aGlzLmV4dHJhY3RDcmVkZW50aWFscyhlKSxvLnV0aWwuZWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSxuKXsodHx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMua2V5cyxlKXx8by5TZXJ2aWNlLmhhc1NlcnZpY2UoZSkpJiZ0aGlzLnNldChlLG4pfSkpfSxsb2FkRnJvbVBhdGg6ZnVuY3Rpb24oZSl7dGhpcy5jbGVhcigpO3ZhciB0PUpTT04ucGFyc2Uoby51dGlsLnJlYWRGaWxlU3luYyhlKSksbj1uZXcgby5GaWxlU3lzdGVtQ3JlZGVudGlhbHMoZSkscj1uZXcgby5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbjtyZXR1cm4gci5wcm92aWRlcnMudW5zaGlmdChuKSxyLnJlc29sdmUoKGZ1bmN0aW9uKGUsbil7aWYoZSl0aHJvdyBlO3QuY3JlZGVudGlhbHM9bn0pKSx0aGlzLmNvbnN0cnVjdG9yKHQpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7by51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMua2V5cywoZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXNbZV19KSksdGhpcy5zZXQoImNyZWRlbnRpYWxzIix2b2lkIDApLHRoaXMuc2V0KCJjcmVkZW50aWFsUHJvdmlkZXIiLHZvaWQgMCl9LHNldDpmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09dD8odm9pZCAwPT09biYmKG49dGhpcy5rZXlzW2VdKSx0aGlzW2VdPSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbCh0aGlzKTpuKToiaHR0cE9wdGlvbnMiPT09ZSYmdGhpc1tlXT90aGlzW2VdPW8udXRpbC5tZXJnZSh0aGlzW2VdLHQpOnRoaXNbZV09dH0sa2V5czp7Y3JlZGVudGlhbHM6bnVsbCxjcmVkZW50aWFsUHJvdmlkZXI6bnVsbCxyZWdpb246bnVsbCxsb2dnZXI6bnVsbCxhcGlWZXJzaW9uczp7fSxhcGlWZXJzaW9uOm51bGwsZW5kcG9pbnQ6dm9pZCAwLGh0dHBPcHRpb25zOnt0aW1lb3V0OjEyZTR9LG1heFJldHJpZXM6dm9pZCAwLG1heFJlZGlyZWN0czoxMCxwYXJhbVZhbGlkYXRpb246ITAsc3NsRW5hYmxlZDohMCxzM0ZvcmNlUGF0aFN0eWxlOiExLHMzQnVja2V0RW5kcG9pbnQ6ITEsczNEaXNhYmxlQm9keVNpZ25pbmc6ITAsczNVc0Vhc3QxUmVnaW9uYWxFbmRwb2ludDoibGVnYWN5IixzM1VzZUFyblJlZ2lvbjp2b2lkIDAsY29tcHV0ZUNoZWNrc3VtczohMCxjb252ZXJ0UmVzcG9uc2VUeXBlczohMCxjb3JyZWN0Q2xvY2tTa2V3OiExLGN1c3RvbVVzZXJBZ2VudDpudWxsLGR5bmFtb0RiQ3JjMzI6ITAsc3lzdGVtQ2xvY2tPZmZzZXQ6MCxzaWduYXR1cmVWZXJzaW9uOm51bGwsc2lnbmF0dXJlQ2FjaGU6ITAscmV0cnlEZWxheU9wdGlvbnM6e30sdXNlQWNjZWxlcmF0ZUVuZHBvaW50OiExLGNsaWVudFNpZGVNb25pdG9yaW5nOiExLGVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZDp2b2lkIDAsZW5kcG9pbnRDYWNoZVNpemU6MWUzLGhvc3RQcmVmaXhFbmFibGVkOiEwLHN0c1JlZ2lvbmFsRW5kcG9pbnRzOiJsZWdhY3kiLHVzZUZpcHNFbmRwb2ludDohMSx1c2VEdWFsc3RhY2tFbmRwb2ludDohMSx0b2tlbjpudWxsfSxleHRyYWN0Q3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYWNjZXNzS2V5SWQmJmUuc2VjcmV0QWNjZXNzS2V5JiYoKGU9by51dGlsLmNvcHkoZSkpLmNyZWRlbnRpYWxzPW5ldyBvLkNyZWRlbnRpYWxzKGUpKSxlfSxzZXRQcm9taXNlc0RlcGVuZGVuY3k6ZnVuY3Rpb24oZSl7cj1lLG51bGw9PT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZSYmKHI9UHJvbWlzZSk7dmFyIHQ9W28uUmVxdWVzdCxvLkNyZWRlbnRpYWxzLG8uQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW5dO28uUzMmJih0LnB1c2goby5TMyksby5TMy5NYW5hZ2VkVXBsb2FkJiZ0LnB1c2goby5TMy5NYW5hZ2VkVXBsb2FkKSksby51dGlsLmFkZFByb21pc2VzKHQscil9LGdldFByb21pc2VzRGVwZW5kZW5jeTpmdW5jdGlvbigpe3JldHVybiByfX0pLG8uY29uZmlnPW5ldyBvLkNvbmZpZ30seyIuL2NvcmUiOjE5LCIuL2NyZWRlbnRpYWxzIjoyMCwiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIjoyM31dLDE4OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpO2Z1bmN0aW9uIG8oZSx0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKFsibGVnYWN5IiwicmVnaW9uYWwiXS5pbmRleE9mKGUudG9Mb3dlckNhc2UoKSk+PTApcmV0dXJuIGUudG9Mb3dlckNhc2UoKTt0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHQpfX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgaTtpZigoZT1lfHx7fSlbdC5jbGllbnRDb25maWddJiYoaT1vKGVbdC5jbGllbnRDb25maWddLHtjb2RlOiJJbnZhbGlkQ29uZmlndXJhdGlvbiIsbWVzc2FnZTonaW52YWxpZCAiJyt0LmNsaWVudENvbmZpZysnIiBjb25maWd1cmF0aW9uLiBFeHBlY3QgImxlZ2FjeSIgIG9yICJyZWdpb25hbCIuIEdvdCAiJytlW3QuY2xpZW50Q29uZmlnXSsnIi4nfSkpKXJldHVybiBpO2lmKCFyLnV0aWwuaXNOb2RlKCkpcmV0dXJuIGk7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4uZW52LHQuZW52KSYmKGk9byhuLmVudlt0LmVudl0se2NvZGU6IkludmFsaWRFbnZpcm9ubWVudGFsVmFyaWFibGUiLG1lc3NhZ2U6ImludmFsaWQgIit0LmVudisnIGVudmlyb25tZW50YWwgdmFyaWFibGUuIEV4cGVjdCAibGVnYWN5IiAgb3IgInJlZ2lvbmFsIi4gR290ICInK24uZW52W3QuZW52XSsnIi4nfSkpKXJldHVybiBpO3ZhciBzPXt9O3RyeXtzPXIudXRpbC5nZXRQcm9maWxlc0Zyb21TaGFyZWRDb25maWcoci51dGlsLmluaUxvYWRlcilbbi5lbnYuQVdTX1BST0ZJTEV8fHIudXRpbC5kZWZhdWx0UHJvZmlsZV19Y2F0Y2goZSl7fXJldHVybiBzJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyx0LnNoYXJlZENvbmZpZykmJihpPW8oc1t0LnNoYXJlZENvbmZpZ10se2NvZGU6IkludmFsaWRDb25maWd1cmF0aW9uIixtZXNzYWdlOiJpbnZhbGlkICIrdC5zaGFyZWRDb25maWcrJyBwcm9maWxlIGNvbmZpZy4gRXhwZWN0ICJsZWdhY3kiICBvciAicmVnaW9uYWwiLiBHb3QgIicrc1t0LnNoYXJlZENvbmZpZ10rJyIuJ30pKSxpfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSxfcHJvY2Vzczo5Mn1dLDE5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9e3V0aWw6ZSgiLi91dGlsIil9Oyh7fSkudG9TdHJpbmcoKSx0LmV4cG9ydHM9cixyLnV0aWwudXBkYXRlKHIse1ZFUlNJT046IjIuMTM3Ny4wIixTaWduZXJzOnt9LFByb3RvY29sOntKc29uOmUoIi4vcHJvdG9jb2wvanNvbiIpLFF1ZXJ5OmUoIi4vcHJvdG9jb2wvcXVlcnkiKSxSZXN0OmUoIi4vcHJvdG9jb2wvcmVzdCIpLFJlc3RKc29uOmUoIi4vcHJvdG9jb2wvcmVzdF9qc29uIiksUmVzdFhtbDplKCIuL3Byb3RvY29sL3Jlc3RfeG1sIil9LFhNTDp7QnVpbGRlcjplKCIuL3htbC9idWlsZGVyIiksUGFyc2VyOm51bGx9LEpTT046e0J1aWxkZXI6ZSgiLi9qc29uL2J1aWxkZXIiKSxQYXJzZXI6ZSgiLi9qc29uL3BhcnNlciIpfSxNb2RlbDp7QXBpOmUoIi4vbW9kZWwvYXBpIiksT3BlcmF0aW9uOmUoIi4vbW9kZWwvb3BlcmF0aW9uIiksU2hhcGU6ZSgiLi9tb2RlbC9zaGFwZSIpLFBhZ2luYXRvcjplKCIuL21vZGVsL3BhZ2luYXRvciIpLFJlc291cmNlV2FpdGVyOmUoIi4vbW9kZWwvcmVzb3VyY2Vfd2FpdGVyIil9LGFwaUxvYWRlcjplKCIuL2FwaV9sb2FkZXIiKSxFbmRwb2ludENhY2hlOmUoIi4uL3ZlbmRvci9lbmRwb2ludC1jYWNoZSIpLkVuZHBvaW50Q2FjaGV9KSxlKCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiKSxlKCIuL3NlcnZpY2UiKSxlKCIuL2NvbmZpZyIpLGUoIi4vaHR0cCIpLGUoIi4vZXZlbnRfbGlzdGVuZXJzIiksZSgiLi9yZXF1ZXN0IiksZSgiLi9yZXNwb25zZSIpLGUoIi4vcmVzb3VyY2Vfd2FpdGVyIiksZSgiLi9zaWduZXJzL3JlcXVlc3Rfc2lnbmVyIiksZSgiLi9wYXJhbV92YWxpZGF0b3IiKSxlKCIuL21haW50ZW5hbmNlX21vZGVfbWVzc2FnZSIpLHIuZXZlbnRzPW5ldyByLlNlcXVlbnRpYWxFeGVjdXRvcixyLnV0aWwubWVtb2l6ZWRQcm9wZXJ0eShyLCJlbmRwb2ludENhY2hlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIuRW5kcG9pbnRDYWNoZShyLmNvbmZpZy5lbmRwb2ludENhY2hlU2l6ZSl9KSwhMCl9LHsiLi4vdmVuZG9yL2VuZHBvaW50LWNhY2hlIjoxMTEsIi4vYXBpX2xvYWRlciI6OSwiLi9jb25maWciOjE3LCIuL2V2ZW50X2xpc3RlbmVycyI6MzQsIi4vaHR0cCI6MzUsIi4vanNvbi9idWlsZGVyIjozNywiLi9qc29uL3BhcnNlciI6MzgsIi4vbWFpbnRlbmFuY2VfbW9kZV9tZXNzYWdlIjozOSwiLi9tb2RlbC9hcGkiOjQwLCIuL21vZGVsL29wZXJhdGlvbiI6NDIsIi4vbW9kZWwvcGFnaW5hdG9yIjo0MywiLi9tb2RlbC9yZXNvdXJjZV93YWl0ZXIiOjQ0LCIuL21vZGVsL3NoYXBlIjo0NSwiLi9wYXJhbV92YWxpZGF0b3IiOjQ2LCIuL3Byb3RvY29sL2pzb24iOjQ4LCIuL3Byb3RvY29sL3F1ZXJ5Ijo0OSwiLi9wcm90b2NvbC9yZXN0Ijo1MCwiLi9wcm90b2NvbC9yZXN0X2pzb24iOjUxLCIuL3Byb3RvY29sL3Jlc3RfeG1sIjo1MiwiLi9yZXF1ZXN0Ijo1OCwiLi9yZXNvdXJjZV93YWl0ZXIiOjU5LCIuL3Jlc3BvbnNlIjo2MCwiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIjo2MSwiLi9zZXJ2aWNlIjo2MiwiLi9zaWduZXJzL3JlcXVlc3Rfc2lnbmVyIjo2NiwiLi91dGlsIjo3NCwiLi94bWwvYnVpbGRlciI6NzZ9XSwyMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpO3IuQ3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7aWYoci51dGlsLmhpZGVQcm9wZXJ0aWVzKHRoaXMsWyJzZWNyZXRBY2Nlc3NLZXkiXSksdGhpcy5leHBpcmVkPSExLHRoaXMuZXhwaXJlVGltZT1udWxsLHRoaXMucmVmcmVzaENhbGxiYWNrcz1bXSwxPT09YXJndW1lbnRzLmxlbmd0aCYmIm9iamVjdCI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXS5jcmVkZW50aWFsc3x8YXJndW1lbnRzWzBdO3RoaXMuYWNjZXNzS2V5SWQ9ZS5hY2Nlc3NLZXlJZCx0aGlzLnNlY3JldEFjY2Vzc0tleT1lLnNlY3JldEFjY2Vzc0tleSx0aGlzLnNlc3Npb25Ub2tlbj1lLnNlc3Npb25Ub2tlbn1lbHNlIHRoaXMuYWNjZXNzS2V5SWQ9YXJndW1lbnRzWzBdLHRoaXMuc2VjcmV0QWNjZXNzS2V5PWFyZ3VtZW50c1sxXSx0aGlzLnNlc3Npb25Ub2tlbj1hcmd1bWVudHNbMl19LGV4cGlyeVdpbmRvdzoxNSxuZWVkc1JlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgZT1yLnV0aWwuZGF0ZS5nZXREYXRlKCkuZ2V0VGltZSgpLHQ9bmV3IERhdGUoZSsxZTMqdGhpcy5leHBpcnlXaW5kb3cpO3JldHVybiEhKHRoaXMuZXhwaXJlVGltZSYmdD50aGlzLmV4cGlyZVRpbWUpfHx0aGlzLmV4cGlyZWR8fCF0aGlzLmFjY2Vzc0tleUlkfHwhdGhpcy5zZWNyZXRBY2Nlc3NLZXl9LGdldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMubmVlZHNSZWZyZXNoKCk/dGhpcy5yZWZyZXNoKChmdW5jdGlvbihuKXtufHwodC5leHBpcmVkPSExKSxlJiZlKG4pfSkpOmUmJmUoKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmV4cGlyZWQ9ITEsZSgpfSxjb2FsZXNjZVJlZnJlc2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzOzE9PT1uLnJlZnJlc2hDYWxsYmFja3MucHVzaChlKSYmbi5sb2FkKChmdW5jdGlvbihlKXtyLnV0aWwuYXJyYXlFYWNoKG4ucmVmcmVzaENhbGxiYWNrcywoZnVuY3Rpb24obil7dD9uKGUpOnIudXRpbC5kZWZlcigoZnVuY3Rpb24oKXtuKGUpfSkpfSkpLG4ucmVmcmVzaENhbGxiYWNrcy5sZW5ndGg9MH0pKX0sbG9hZDpmdW5jdGlvbihlKXtlKCl9fSksci5DcmVkZW50aWFscy5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUuZ2V0UHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJnZXQiLGUpLHRoaXMucHJvdG90eXBlLnJlZnJlc2hQcm9taXNlPXIudXRpbC5wcm9taXNpZnlNZXRob2QoInJlZnJlc2giLGUpfSxyLkNyZWRlbnRpYWxzLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMucHJvdG90eXBlLmdldFByb21pc2UsZGVsZXRlIHRoaXMucHJvdG90eXBlLnJlZnJlc2hQcm9taXNlfSxyLnV0aWwuYWRkUHJvbWlzZXMoci5DcmVkZW50aWFscyl9LHsiLi9jb3JlIjoxOX1dLDIxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLkNoYWluYWJsZVRlbXBvcmFyeUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSxlPWV8fHt9LHRoaXMuZXJyb3JDb2RlPSJDaGFpbmFibGVUZW1wb3JhcnlDcmVkZW50aWFsc1Byb3ZpZGVyRmFpbHVyZSIsdGhpcy5leHBpcmVkPSEwLHRoaXMudG9rZW5Db2RlRm49bnVsbDt2YXIgdD1yLnV0aWwuY29weShlLnBhcmFtcyl8fHt9O2lmKHQuUm9sZUFybiYmKHQuUm9sZVNlc3Npb25OYW1lPXQuUm9sZVNlc3Npb25OYW1lfHwidGVtcG9yYXJ5LWNyZWRlbnRpYWxzIiksdC5TZXJpYWxOdW1iZXIpe2lmKCFlLnRva2VuQ29kZUZufHwiZnVuY3Rpb24iIT10eXBlb2YgZS50b2tlbkNvZGVGbil0aHJvdyBuZXcgci51dGlsLmVycm9yKG5ldyBFcnJvcigidG9rZW5Db2RlRm4gbXVzdCBiZSBhIGZ1bmN0aW9uIHdoZW4gcGFyYW1zLlNlcmlhbE51bWJlciBpcyBnaXZlbiIpLHtjb2RlOnRoaXMuZXJyb3JDb2RlfSk7dGhpcy50b2tlbkNvZGVGbj1lLnRva2VuQ29kZUZufXZhciBuPXIudXRpbC5tZXJnZSh7cGFyYW1zOnQsY3JlZGVudGlhbHM6ZS5tYXN0ZXJDcmVkZW50aWFsc3x8ci5jb25maWcuY3JlZGVudGlhbHN9LGUuc3RzQ29uZmlnfHx7fSk7dGhpcy5zZXJ2aWNlPW5ldyBvKG4pfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXQuc2VydmljZS5jb25maWcucGFyYW1zLlJvbGVBcm4/ImFzc3VtZVJvbGUiOiJnZXRTZXNzaW9uVG9rZW4iO3RoaXMuZ2V0VG9rZW5Db2RlKChmdW5jdGlvbihyLG8pe3ZhciBpPXt9O3I/ZShyKToobyYmKGkuVG9rZW5Db2RlPW8pLHQuc2VydmljZVtuXShpLChmdW5jdGlvbihuLHIpe258fHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSxlKG4pfSkpKX0pKX0sZ2V0VG9rZW5Db2RlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy50b2tlbkNvZGVGbj90aGlzLnRva2VuQ29kZUZuKHRoaXMuc2VydmljZS5jb25maWcucGFyYW1zLlNlcmlhbE51bWJlciwoZnVuY3Rpb24obixvKXtpZihuKXt2YXIgaT1uO3JldHVybiBuIGluc3RhbmNlb2YgRXJyb3ImJihpPW4ubWVzc2FnZSksdm9pZCBlKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIkVycm9yIGZldGNoaW5nIE1GQSB0b2tlbjogIitpKSx7Y29kZTp0LmVycm9yQ29kZX0pKX1lKG51bGwsbyl9KSk6ZShudWxsKX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyMjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvY29nbml0b2lkZW50aXR5IiksaT1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuQ29nbml0b0lkZW50aXR5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7bG9jYWxTdG9yYWdlS2V5OntpZDoiYXdzLmNvZ25pdG8uaWRlbnRpdHktaWQuIixwcm92aWRlcnM6ImF3cy5jb2duaXRvLmlkZW50aXR5LXByb3ZpZGVycy4ifSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZSx0aGlzLmRhdGE9bnVsbCx0aGlzLl9pZGVudGl0eUlkPW51bGwsdGhpcy5fY2xpZW50Q29uZmlnPXIudXRpbC5jb3B5KHR8fHt9KSx0aGlzLmxvYWRDYWNoZWRJZCgpO3ZhciBuPXRoaXM7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkZW50aXR5SWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5sb2FkQ2FjaGVkSWQoKSxuLl9pZGVudGl0eUlkfHxuLnBhcmFtcy5JZGVudGl0eUlkfSxzZXQ6ZnVuY3Rpb24oZSl7bi5faWRlbnRpdHlJZD1lfX0pfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNyZWF0ZUNsaWVudHMoKSx0LmRhdGE9bnVsbCx0Ll9pZGVudGl0eUlkPW51bGwsdC5nZXRJZCgoZnVuY3Rpb24obil7bj8odC5jbGVhcklkT25Ob3RBdXRob3JpemVkKG4pLGUobikpOnQucGFyYW1zLlJvbGVBcm4/dC5nZXRDcmVkZW50aWFsc0Zyb21TVFMoZSk6dC5nZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5KGUpfSkpfSxjbGVhckNhY2hlZElkOmZ1bmN0aW9uKCl7dGhpcy5faWRlbnRpdHlJZD1udWxsLGRlbGV0ZSB0aGlzLnBhcmFtcy5JZGVudGl0eUlkO3ZhciBlPXRoaXMucGFyYW1zLklkZW50aXR5UG9vbElkLHQ9dGhpcy5wYXJhbXMuTG9naW5JZHx8IiI7ZGVsZXRlIHRoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleS5pZCtlK3RdLGRlbGV0ZSB0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXkucHJvdmlkZXJzK2UrdF19LGNsZWFySWRPbk5vdEF1dGhvcml6ZWQ6ZnVuY3Rpb24oZSl7Ik5vdEF1dGhvcml6ZWRFeGNlcHRpb24iPT1lLmNvZGUmJnRoaXMuY2xlYXJDYWNoZWRJZCgpfSxnZXRJZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgdC5wYXJhbXMuSWRlbnRpdHlJZClyZXR1cm4gZShudWxsLHQucGFyYW1zLklkZW50aXR5SWQpO3QuY29nbml0by5nZXRJZCgoZnVuY3Rpb24obixyKXshbiYmci5JZGVudGl0eUlkPyh0LnBhcmFtcy5JZGVudGl0eUlkPXIuSWRlbnRpdHlJZCxlKG51bGwsci5JZGVudGl0eUlkKSk6ZShuKX0pKX0sbG9hZENyZWRlbnRpYWxzOmZ1bmN0aW9uKGUsdCl7ZSYmdCYmKHQuZXhwaXJlZD0hMSx0LmFjY2Vzc0tleUlkPWUuQ3JlZGVudGlhbHMuQWNjZXNzS2V5SWQsdC5zZWNyZXRBY2Nlc3NLZXk9ZS5DcmVkZW50aWFscy5TZWNyZXRLZXksdC5zZXNzaW9uVG9rZW49ZS5DcmVkZW50aWFscy5TZXNzaW9uVG9rZW4sdC5leHBpcmVUaW1lPWUuQ3JlZGVudGlhbHMuRXhwaXJhdGlvbil9LGdldENyZWRlbnRpYWxzRm9ySWRlbnRpdHk6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNvZ25pdG8uZ2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eSgoZnVuY3Rpb24obixyKXtuP3QuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKToodC5jYWNoZUlkKHIpLHQuZGF0YT1yLHQubG9hZENyZWRlbnRpYWxzKHQuZGF0YSx0KSksZShuKX0pKX0sZ2V0Q3JlZGVudGlhbHNGcm9tU1RTOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jb2duaXRvLmdldE9wZW5JZFRva2VuKChmdW5jdGlvbihuLHIpe24/KHQuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKSxlKG4pKToodC5jYWNoZUlkKHIpLHQucGFyYW1zLldlYklkZW50aXR5VG9rZW49ci5Ub2tlbix0LndlYklkZW50aXR5Q3JlZGVudGlhbHMucmVmcmVzaCgoZnVuY3Rpb24obil7bnx8KHQuZGF0YT10LndlYklkZW50aXR5Q3JlZGVudGlhbHMuZGF0YSx0LnN0cy5jcmVkZW50aWFsc0Zyb20odC5kYXRhLHQpKSxlKG4pfSkpKX0pKX0sbG9hZENhY2hlZElkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZihyLnV0aWwuaXNCcm93c2VyKCkmJiFlLnBhcmFtcy5JZGVudGl0eUlkKXt2YXIgdD1lLmdldFN0b3JhZ2UoImlkIik7aWYodCYmZS5wYXJhbXMuTG9naW5zKXt2YXIgbj1PYmplY3Qua2V5cyhlLnBhcmFtcy5Mb2dpbnMpOzAhPT0oZS5nZXRTdG9yYWdlKCJwcm92aWRlcnMiKXx8IiIpLnNwbGl0KCIsIikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4tMSE9PW4uaW5kZXhPZihlKX0pKS5sZW5ndGgmJihlLnBhcmFtcy5JZGVudGl0eUlkPXQpfWVsc2UgdCYmKGUucGFyYW1zLklkZW50aXR5SWQ9dCl9fSxjcmVhdGVDbGllbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY2xpZW50Q29uZmlnO2lmKHRoaXMud2ViSWRlbnRpdHlDcmVkZW50aWFscz10aGlzLndlYklkZW50aXR5Q3JlZGVudGlhbHN8fG5ldyByLldlYklkZW50aXR5Q3JlZGVudGlhbHModGhpcy5wYXJhbXMsZSksIXRoaXMuY29nbml0byl7dmFyIHQ9ci51dGlsLm1lcmdlKHt9LGUpO3QucGFyYW1zPXRoaXMucGFyYW1zLHRoaXMuY29nbml0bz1uZXcgbyh0KX10aGlzLnN0cz10aGlzLnN0c3x8bmV3IGkoZSl9LGNhY2hlSWQ6ZnVuY3Rpb24oZSl7dGhpcy5faWRlbnRpdHlJZD1lLklkZW50aXR5SWQsdGhpcy5wYXJhbXMuSWRlbnRpdHlJZD10aGlzLl9pZGVudGl0eUlkLHIudXRpbC5pc0Jyb3dzZXIoKSYmKHRoaXMuc2V0U3RvcmFnZSgiaWQiLGUuSWRlbnRpdHlJZCksdGhpcy5wYXJhbXMuTG9naW5zJiZ0aGlzLnNldFN0b3JhZ2UoInByb3ZpZGVycyIsT2JqZWN0LmtleXModGhpcy5wYXJhbXMuTG9naW5zKS5qb2luKCIsIikpKX0sZ2V0U3RvcmFnZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdG9yYWdlW3RoaXMubG9jYWxTdG9yYWdlS2V5W2VdK3RoaXMucGFyYW1zLklkZW50aXR5UG9vbElkKyh0aGlzLnBhcmFtcy5Mb2dpbklkfHwiIildfSxzZXRTdG9yYWdlOmZ1bmN0aW9uKGUsdCl7dHJ5e3RoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleVtlXSt0aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCsodGhpcy5wYXJhbXMuTG9naW5JZHx8IiIpXT10fWNhdGNoKGUpe319LHN0b3JhZ2U6ZnVuY3Rpb24oKXt0cnl7dmFyIGU9ci51dGlsLmlzQnJvd3NlcigpJiZudWxsIT09d2luZG93LmxvY2FsU3RvcmFnZSYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlP3dpbmRvdy5sb2NhbFN0b3JhZ2U6e307cmV0dXJuIGVbImF3cy50ZXN0LXN0b3JhZ2UiXT0iZm9vYmFyIixkZWxldGUgZVsiYXdzLnRlc3Qtc3RvcmFnZSJdLGV9Y2F0Y2goZSl7cmV0dXJue319fSgpfSl9LHsiLi4vLi4vY2xpZW50cy9jb2duaXRvaWRlbnRpdHkiOjcsIi4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDIzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpO3IuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW49ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7dGhpcy5wcm92aWRlcnM9ZXx8ci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5kZWZhdWx0UHJvdmlkZXJzLnNsaWNlKDApLHRoaXMucmVzb2x2ZUNhbGxiYWNrcz1bXX0scmVzb2x2ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKDA9PT10LnByb3ZpZGVycy5sZW5ndGgpcmV0dXJuIGUobmV3IEVycm9yKCJObyBwcm92aWRlcnMiKSksdDtpZigxPT09dC5yZXNvbHZlQ2FsbGJhY2tzLnB1c2goZSkpe3ZhciBuPTAsbz10LnByb3ZpZGVycy5zbGljZSgwKTshZnVuY3Rpb24gZShpLHMpe2lmKCFpJiZzfHxuPT09by5sZW5ndGgpcmV0dXJuIHIudXRpbC5hcnJheUVhY2godC5yZXNvbHZlQ2FsbGJhY2tzLChmdW5jdGlvbihlKXtlKGkscyl9KSksdm9pZCh0LnJlc29sdmVDYWxsYmFja3MubGVuZ3RoPTApO3ZhciBhPW9bbisrXTsocz0iZnVuY3Rpb24iPT10eXBlb2YgYT9hLmNhbGwoKTphKS5nZXQ/cy5nZXQoKGZ1bmN0aW9uKHQpe2UodCx0P251bGw6cyl9KSk6ZShudWxsLHMpfSgpfXJldHVybiB0fX0pLHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVmYXVsdFByb3ZpZGVycz1bXSxyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluLmFkZFByb21pc2VzVG9DbGFzcz1mdW5jdGlvbihlKXt0aGlzLnByb3RvdHlwZS5yZXNvbHZlUHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJyZXNvbHZlIixlKX0sci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5kZWxldGVQcm9taXNlc0Zyb21DbGFzcz1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByb3RvdHlwZS5yZXNvbHZlUHJvbWlzZX0sci51dGlsLmFkZFByb21pc2VzKHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4pfSx7Ii4uL2NvcmUiOjE5fV0sMjQ6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuU0FNTENyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5zZXJ2aWNlLmFzc3VtZVJvbGVXaXRoU0FNTCgoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3RoaXMuc2VydmljZT10aGlzLnNlcnZpY2V8fG5ldyBvKHtwYXJhbXM6dGhpcy5wYXJhbXN9KX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5UZW1wb3JhcnlDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmxvYWRNYXN0ZXJDcmVkZW50aWFscyh0KSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZXx8e30sdGhpcy5wYXJhbXMuUm9sZUFybiYmKHRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZT10aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWV8fCJ0ZW1wb3JhcnktY3JlZGVudGlhbHMiKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5tYXN0ZXJDcmVkZW50aWFscy5nZXQoKGZ1bmN0aW9uKCl7dC5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscz10Lm1hc3RlckNyZWRlbnRpYWxzLCh0LnBhcmFtcy5Sb2xlQXJuP3Quc2VydmljZS5hc3N1bWVSb2xlOnQuc2VydmljZS5nZXRTZXNzaW9uVG9rZW4pLmNhbGwodC5zZXJ2aWNlLChmdW5jdGlvbihuLHIpe258fHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSxlKG4pfSkpfSkpfSxsb2FkTWFzdGVyQ3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7Zm9yKHRoaXMubWFzdGVyQ3JlZGVudGlhbHM9ZXx8ci5jb25maWcuY3JlZGVudGlhbHM7dGhpcy5tYXN0ZXJDcmVkZW50aWFscy5tYXN0ZXJDcmVkZW50aWFsczspdGhpcy5tYXN0ZXJDcmVkZW50aWFscz10aGlzLm1hc3RlckNyZWRlbnRpYWxzLm1hc3RlckNyZWRlbnRpYWxzOyJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLm1hc3RlckNyZWRlbnRpYWxzLmdldCYmKHRoaXMubWFzdGVyQ3JlZGVudGlhbHM9bmV3IHIuQ3JlZGVudGlhbHModGhpcy5tYXN0ZXJDcmVkZW50aWFscykpfSxjcmVhdGVDbGllbnRzOmZ1bmN0aW9uKCl7dGhpcy5zZXJ2aWNlPXRoaXMuc2VydmljZXx8bmV3IG8oe3BhcmFtczp0aGlzLnBhcmFtc30pfX0pfSx7Ii4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDI2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLldlYklkZW50aXR5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWUsdGhpcy5wYXJhbXMuUm9sZVNlc3Npb25OYW1lPXRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZXx8IndlYi1pZGVudGl0eSIsdGhpcy5kYXRhPW51bGwsdGhpcy5fY2xpZW50Q29uZmlnPXIudXRpbC5jb3B5KHR8fHt9KX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5zZXJ2aWNlLmFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHkoKGZ1bmN0aW9uKG4scil7dC5kYXRhPW51bGwsbnx8KHQuZGF0YT1yLHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSksZShuKX0pKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe2lmKCF0aGlzLnNlcnZpY2Upe3ZhciBlPXIudXRpbC5tZXJnZSh7fSx0aGlzLl9jbGllbnRDb25maWcpO2UucGFyYW1zPXRoaXMucGFyYW1zLHRoaXMuc2VydmljZT1uZXcgbyhlKX19fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjc6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7KGZ1bmN0aW9uKCl7dmFyIHI9ZSgiLi9jb3JlIiksbz1lKCIuL3V0aWwiKSxpPVsiQVdTX0VOQUJMRV9FTkRQT0lOVF9ESVNDT1ZFUlkiLCJBV1NfRU5EUE9JTlRfRElTQ09WRVJZX0VOQUJMRUQiXTtmdW5jdGlvbiBzKGUpe3ZhciB0PWUuc2VydmljZSxuPXQuYXBpfHx7fSxyPShuLm9wZXJhdGlvbnMse30pO3JldHVybiB0LmNvbmZpZy5yZWdpb24mJihyLnJlZ2lvbj10LmNvbmZpZy5yZWdpb24pLG4uc2VydmljZUlkJiYoci5zZXJ2aWNlSWQ9bi5zZXJ2aWNlSWQpLHQuY29uZmlnLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkJiYoci5hY2Nlc3NLZXlJZD10LmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCkscn1mdW5jdGlvbiBhKGUsdCxuKXtuJiZudWxsIT10JiYic3RydWN0dXJlIj09PW4udHlwZSYmbi5yZXF1aXJlZCYmbi5yZXF1aXJlZC5sZW5ndGg+MCYmby5hcnJheUVhY2gobi5yZXF1aXJlZCwoZnVuY3Rpb24ocil7dmFyIG89bi5tZW1iZXJzW3JdO2lmKCEwPT09by5lbmRwb2ludERpc2NvdmVyeUlkKXt2YXIgaT1vLmlzTG9jYXRpb25OYW1lP28ubmFtZTpyO2VbaV09U3RyaW5nKHRbcl0pfWVsc2UgYShlLHRbcl0sbyl9KSl9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPXt9O3JldHVybiBhKG4sZS5wYXJhbXMsdCksbn1mdW5jdGlvbiB1KGUpe3ZhciB0PWUuc2VydmljZSxuPXQuYXBpLGk9bi5vcGVyYXRpb25zP24ub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl06dm9pZCAwLGE9YyhlLGk/aS5pbnB1dDp2b2lkIDApLHU9cyhlKTtPYmplY3Qua2V5cyhhKS5sZW5ndGg+MCYmKHU9by51cGRhdGUodSxhKSxpJiYodS5vcGVyYXRpb249aS5uYW1lKSk7dmFyIGw9ci5lbmRwb2ludENhY2hlLmdldCh1KTtpZighbHx8MSE9PWwubGVuZ3RofHwiIiE9PWxbMF0uQWRkcmVzcylpZihsJiZsLmxlbmd0aD4wKWUuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQobFswXS5BZGRyZXNzKTtlbHNle3ZhciBwPXQubWFrZVJlcXVlc3Qobi5lbmRwb2ludE9wZXJhdGlvbix7T3BlcmF0aW9uOmkubmFtZSxJZGVudGlmaWVyczphfSk7ZChwKSxwLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsci5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX1BBUkFNRVRFUlMpLHAucmVtb3ZlTGlzdGVuZXIoInJldHJ5IixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuUkVUUllfQ0hFQ0spLHIuZW5kcG9pbnRDYWNoZS5wdXQodSxbe0FkZHJlc3M6IiIsQ2FjaGVQZXJpb2RJbk1pbnV0ZXM6MX1dKSxwLnNlbmQoKGZ1bmN0aW9uKGUsdCl7dCYmdC5FbmRwb2ludHM/ci5lbmRwb2ludENhY2hlLnB1dCh1LHQuRW5kcG9pbnRzKTplJiZyLmVuZHBvaW50Q2FjaGUucHV0KHUsW3tBZGRyZXNzOiIiLENhY2hlUGVyaW9kSW5NaW51dGVzOjF9XSl9KSl9fXZhciBsPXt9O2Z1bmN0aW9uIHAoZSx0KXt2YXIgbj1lLnNlcnZpY2UsaT1uLmFwaSxhPWkub3BlcmF0aW9ucz9pLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dOnZvaWQgMCx1PWE/YS5pbnB1dDp2b2lkIDAscD1jKGUsdSksaD1zKGUpO09iamVjdC5rZXlzKHApLmxlbmd0aD4wJiYoaD1vLnVwZGF0ZShoLHApLGEmJihoLm9wZXJhdGlvbj1hLm5hbWUpKTt2YXIgZj1yLkVuZHBvaW50Q2FjaGUuZ2V0S2V5U3RyaW5nKGgpLGc9ci5lbmRwb2ludENhY2hlLmdldChmKTtpZihnJiYxPT09Zy5sZW5ndGgmJiIiPT09Z1swXS5BZGRyZXNzKXJldHVybiBsW2ZdfHwobFtmXT1bXSksdm9pZCBsW2ZdLnB1c2goe3JlcXVlc3Q6ZSxjYWxsYmFjazp0fSk7aWYoZyYmZy5sZW5ndGg+MCllLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGdbMF0uQWRkcmVzcyksdCgpO2Vsc2V7dmFyIG09bi5tYWtlUmVxdWVzdChpLmVuZHBvaW50T3BlcmF0aW9uLHtPcGVyYXRpb246YS5uYW1lLElkZW50aWZpZXJzOnB9KTttLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsci5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX1BBUkFNRVRFUlMpLGQobSksci5lbmRwb2ludENhY2hlLnB1dChmLFt7QWRkcmVzczoiIixDYWNoZVBlcmlvZEluTWludXRlczo2MH1dKSxtLnNlbmQoKGZ1bmN0aW9uKG4saSl7aWYobil7aWYoZS5yZXNwb25zZS5lcnJvcj1vLmVycm9yKG4se3JldHJ5YWJsZTohMX0pLHIuZW5kcG9pbnRDYWNoZS5yZW1vdmUoaCksbFtmXSl7dmFyIHM9bFtmXTtvLmFycmF5RWFjaChzLChmdW5jdGlvbihlKXtlLnJlcXVlc3QucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuLHtyZXRyeWFibGU6ITF9KSxlLmNhbGxiYWNrKCl9KSksZGVsZXRlIGxbZl19fWVsc2UgaSYmKHIuZW5kcG9pbnRDYWNoZS5wdXQoZixpLkVuZHBvaW50cyksZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChpLkVuZHBvaW50c1swXS5BZGRyZXNzKSxsW2ZdKSYmKHM9bFtmXSxvLmFycmF5RWFjaChzLChmdW5jdGlvbihlKXtlLnJlcXVlc3QuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQoaS5FbmRwb2ludHNbMF0uQWRkcmVzcyksZS5jYWxsYmFjaygpfSkpLGRlbGV0ZSBsW2ZdKTt0KCl9KSl9fWZ1bmN0aW9uIGQoZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5hcGlWZXJzaW9uO3QmJiFlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LWFwaS12ZXJzaW9uIl0mJihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LWFwaS12ZXJzaW9uIl09dCl9ZnVuY3Rpb24gaChlKXt2YXIgdD1lLmVycm9yLG49ZS5odHRwUmVzcG9uc2U7aWYodCYmKCJJbnZhbGlkRW5kcG9pbnRFeGNlcHRpb24iPT09dC5jb2RlfHw0MjE9PT1uLnN0YXR1c0NvZGUpKXt2YXIgaT1lLnJlcXVlc3QsYT1pLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnN8fHt9LHU9YyhpLGFbaS5vcGVyYXRpb25dP2FbaS5vcGVyYXRpb25dLmlucHV0OnZvaWQgMCksbD1zKGkpO09iamVjdC5rZXlzKHUpLmxlbmd0aD4wJiYobD1vLnVwZGF0ZShsLHUpLGFbaS5vcGVyYXRpb25dJiYobC5vcGVyYXRpb249YVtpLm9wZXJhdGlvbl0ubmFtZSkpLHIuZW5kcG9pbnRDYWNoZS5yZW1vdmUobCl9fWZ1bmN0aW9uIGYoZSl7cmV0dXJuWyJmYWxzZSIsIjAiXS5pbmRleE9mKGUpPj0wfXQuZXhwb3J0cz17ZGlzY292ZXJFbmRwb2ludDpmdW5jdGlvbihlLHQpe3ZhciBzPWUuc2VydmljZXx8e307aWYoZnVuY3Rpb24oZSl7aWYoZS5fb3JpZ2luYWxDb25maWcmJmUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50JiYhMD09PWUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZCl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiQ3VzdG9tIGVuZHBvaW50IGlzIHN1cHBsaWVkOyBlbmRwb2ludERpc2NvdmVyeUVuYWJsZWQgbXVzdCBub3QgYmUgdHJ1ZS4ifSk7dmFyIHQ9ci5jb25maWdbZS5zZXJ2aWNlSWRlbnRpZmllcl18fHt9O3JldHVybiBCb29sZWFuKHIuY29uZmlnLmVuZHBvaW50fHx0LmVuZHBvaW50fHxlLl9vcmlnaW5hbENvbmZpZyYmZS5fb3JpZ2luYWxDb25maWcuZW5kcG9pbnQpfShzKXx8ZS5pc1ByZXNpZ25lZCgpKXJldHVybiB0KCk7dmFyIGE9KHMuYXBpLm9wZXJhdGlvbnN8fHt9KVtlLm9wZXJhdGlvbl0sYz1hP2EuZW5kcG9pbnREaXNjb3ZlcnlSZXF1aXJlZDoiTlVMTCIsbD1mdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2V8fHt9O2lmKHZvaWQgMCE9PXQuY29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZClyZXR1cm4gdC5jb25maWcuZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkO2lmKCFvLmlzQnJvd3NlcigpKXtmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGE9aVtzXTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobi5lbnYsYSkpe2lmKCIiPT09bi5lbnZbYV18fHZvaWQgMD09PW4uZW52W2FdKXRocm93IG8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJlbnZpcm9ubWVudGFsIHZhcmlhYmxlICIrYSsiIGNhbm5vdCBiZSBzZXQgdG8gbm90aGluZyJ9KTtyZXR1cm4hZihuLmVudlthXSl9fXZhciBjPXt9O3RyeXtjPXIudXRpbC5pbmlMb2FkZXI/ci51dGlsLmluaUxvYWRlci5sb2FkRnJvbSh7aXNDb25maWc6ITAsZmlsZW5hbWU6bi5lbnZbci51dGlsLnNoYXJlZENvbmZpZ0ZpbGVFbnZdfSk6e319Y2F0Y2goZSl7fXZhciB1PWNbbi5lbnYuQVdTX1BST0ZJTEV8fHIudXRpbC5kZWZhdWx0UHJvZmlsZV18fHt9O2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1LCJlbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCIpKXtpZih2b2lkIDA9PT11LmVuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkKXRocm93IG8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJjb25maWcgZmlsZSBlbnRyeSAnZW5kcG9pbnRfZGlzY292ZXJ5X2VuYWJsZWQnIGNhbm5vdCBiZSBzZXQgdG8gbm90aGluZyJ9KTtyZXR1cm4hZih1LmVuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkKX19fShlKSxkPXMuYXBpLmhhc1JlcXVpcmVkRW5kcG9pbnREaXNjb3Zlcnk7c3dpdGNoKChsfHxkKSYmZS5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCgiZW5kcG9pbnQtZGlzY292ZXJ5IiksYyl7Y2FzZSJPUFRJT05BTCI6KGx8fGQpJiYodShlKSxlLmFkZE5hbWVkTGlzdGVuZXIoIklOVkFMSURBVEVfQ0FDSEVEX0VORFBPSU5UUyIsImV4dHJhY3RFcnJvciIsaCkpLHQoKTticmVhaztjYXNlIlJFUVVJUkVEIjppZighMT09PWwpe2UucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLG1lc3NhZ2U6IkVuZHBvaW50IERpc2NvdmVyeSBpcyBkaXNhYmxlZCBidXQgIitzLmFwaS5jbGFzc05hbWUrIi4iK2Uub3BlcmF0aW9uKyIoKSByZXF1aXJlcyBpdC4gUGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbnMuIn0pLHQoKTticmVha31lLmFkZE5hbWVkTGlzdGVuZXIoIklOVkFMSURBVEVfQ0FDSEVEX0VORFBPSU5UUyIsImV4dHJhY3RFcnJvciIsaCkscChlLHQpO2JyZWFrO2RlZmF1bHQ6dCgpfX0scmVxdWlyZWREaXNjb3ZlckVuZHBvaW50OnAsb3B0aW9uYWxEaXNjb3ZlckVuZHBvaW50OnUsbWFyc2hhbGxDdXN0b21JZGVudGlmaWVyczpjLGdldENhY2hlS2V5OnMsaW52YWxpZGF0ZUNhY2hlZEVuZHBvaW50Omh9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL3V0aWwiOjc0LF9wcm9jZXNzOjkyfV0sMjg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9ldmVudC1zdHJlYW0vZXZlbnQtbWVzc2FnZS1jaHVua2VyIikuZXZlbnRNZXNzYWdlQ2h1bmtlcixvPWUoIi4vcGFyc2UtZXZlbnQiKS5wYXJzZUV2ZW50O3QuZXhwb3J0cz17Y3JlYXRlRXZlbnRTdHJlYW06ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgaT1yKGUpLHM9W10sYT0wO2E8aS5sZW5ndGg7YSsrKXMucHVzaChvKHQsaVthXSxuKSk7cmV0dXJuIHN9fX0seyIuLi9ldmVudC1zdHJlYW0vZXZlbnQtbWVzc2FnZS1jaHVua2VyIjoyOSwiLi9wYXJzZS1ldmVudCI6MzF9XSwyOTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17ZXZlbnRNZXNzYWdlQ2h1bmtlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7KXt2YXIgcj1lLnJlYWRJbnQzMkJFKG4pLG89ZS5zbGljZShuLHIrbik7bis9cix0LnB1c2gobyl9cmV0dXJuIHR9fX0se31dLDMwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLnV0aWwsbz1yLmJ1ZmZlci50b0J1ZmZlcjtmdW5jdGlvbiBpKGUpe2lmKDghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludDY0IGJ1ZmZlcnMgbXVzdCBiZSBleGFjdGx5IDggYnl0ZXMiKTtyLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9byhlKSksdGhpcy5ieXRlcz1lfWZ1bmN0aW9uIHMoZSl7Zm9yKHZhciB0PTA7dDw4O3QrKyllW3RdXj0yNTU7Zm9yKHQ9Nzt0Pi0xJiYoZVt0XSsrLDA9PT1lW3RdKTt0LS0pO31pLmZyb21OdW1iZXI9ZnVuY3Rpb24oZSl7aWYoZT4weDgwMDAwMDAwMDAwMDAwMDB8fGU8LTB4ODAwMDAwMDAwMDAwMDAwMCl0aHJvdyBuZXcgRXJyb3IoZSsiIGlzIHRvbyBsYXJnZSAob3IsIGlmIG5lZ2F0aXZlLCB0b28gc21hbGwpIHRvIHJlcHJlc2VudCBhcyBhbiBJbnQ2NCIpO2Zvcih2YXIgdD1uZXcgVWludDhBcnJheSg4KSxuPTcscj1NYXRoLmFicyhNYXRoLnJvdW5kKGUpKTtuPi0xJiZyPjA7bi0tLHIvPTI1Nil0W25dPXI7cmV0dXJuIGU8MCYmcyh0KSxuZXcgaSh0KX0saS5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYnl0ZXMuc2xpY2UoMCksdD0xMjgmZVswXTtyZXR1cm4gdCYmcyhlKSxwYXJzZUludChlLnRvU3RyaW5nKCJoZXgiKSwxNikqKHQ/LTE6MSl9LGkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlT2YoKSl9LHQuZXhwb3J0cz17SW50NjQ6aX19LHsiLi4vY29yZSI6MTl9XSwzMTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vcGFyc2UtbWVzc2FnZSIpLnBhcnNlTWVzc2FnZTt0LmV4cG9ydHM9e3BhcnNlRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXIodCksaT1vLmhlYWRlcnNbIjptZXNzYWdlLXR5cGUiXTtpZihpKXtpZigiZXJyb3IiPT09aS52YWx1ZSl0aHJvdyBmdW5jdGlvbihlKXt2YXIgdD1lLmhlYWRlcnNbIjplcnJvci1jb2RlIl0sbj1lLmhlYWRlcnNbIjplcnJvci1tZXNzYWdlIl0scj1uZXcgRXJyb3Iobi52YWx1ZXx8bik7cmV0dXJuIHIuY29kZT1yLm5hbWU9dC52YWx1ZXx8dCxyfShvKTtpZigiZXZlbnQiIT09aS52YWx1ZSlyZXR1cm59dmFyIHM9by5oZWFkZXJzWyI6ZXZlbnQtdHlwZSJdLGE9bi5tZW1iZXJzW3MudmFsdWVdO2lmKGEpe3ZhciBjPXt9LHU9YS5ldmVudFBheWxvYWRNZW1iZXJOYW1lO2lmKHUpe3ZhciBsPWEubWVtYmVyc1t1XTsiYmluYXJ5Ij09PWwudHlwZT9jW3VdPW8uYm9keTpjW3VdPWUucGFyc2Uoby5ib2R5LnRvU3RyaW5nKCksbCl9Zm9yKHZhciBwPWEuZXZlbnRIZWFkZXJNZW1iZXJOYW1lcyxkPTA7ZDxwLmxlbmd0aDtkKyspe3ZhciBoPXBbZF07by5oZWFkZXJzW2hdJiYoY1toXT1hLm1lbWJlcnNbaF0udG9UeXBlKG8uaGVhZGVyc1toXS52YWx1ZSkpfXZhciBmPXt9O3JldHVybiBmW3MudmFsdWVdPWMsZn19fX0seyIuL3BhcnNlLW1lc3NhZ2UiOjMyfV0sMzI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2ludDY0IikuSW50NjQsbz1lKCIuL3NwbGl0LW1lc3NhZ2UiKS5zcGxpdE1lc3NhZ2UsaT0iYm9vbGVhbiIscz0iYnl0ZSIsYT0ic2hvcnQiLGM9ImludGVnZXIiLHU9ImxvbmciLGw9ImJpbmFyeSIscD0ic3RyaW5nIixkPSJ0aW1lc3RhbXAiLGg9InV1aWQiO2Z1bmN0aW9uIGYoZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoOyl7dmFyIG89ZS5yZWFkVUludDgobisrKSxmPWUuc2xpY2UobixuK28pLnRvU3RyaW5nKCk7c3dpdGNoKG4rPW8sZS5yZWFkVUludDgobisrKSl7Y2FzZSAwOnRbZl09e3R5cGU6aSx2YWx1ZTohMH07YnJlYWs7Y2FzZSAxOnRbZl09e3R5cGU6aSx2YWx1ZTohMX07YnJlYWs7Y2FzZSAyOnRbZl09e3R5cGU6cyx2YWx1ZTplLnJlYWRJbnQ4KG4rKyl9O2JyZWFrO2Nhc2UgMzp0W2ZdPXt0eXBlOmEsdmFsdWU6ZS5yZWFkSW50MTZCRShuKX0sbis9MjticmVhaztjYXNlIDQ6dFtmXT17dHlwZTpjLHZhbHVlOmUucmVhZEludDMyQkUobil9LG4rPTQ7YnJlYWs7Y2FzZSA1OnRbZl09e3R5cGU6dSx2YWx1ZTpuZXcgcihlLnNsaWNlKG4sbis4KSl9LG4rPTg7YnJlYWs7Y2FzZSA2OnZhciBnPWUucmVhZFVJbnQxNkJFKG4pO24rPTIsdFtmXT17dHlwZTpsLHZhbHVlOmUuc2xpY2UobixuK2cpfSxuKz1nO2JyZWFrO2Nhc2UgNzp2YXIgbT1lLnJlYWRVSW50MTZCRShuKTtuKz0yLHRbZl09e3R5cGU6cCx2YWx1ZTplLnNsaWNlKG4sbittKS50b1N0cmluZygpfSxuKz1tO2JyZWFrO2Nhc2UgODp0W2ZdPXt0eXBlOmQsdmFsdWU6bmV3IERhdGUobmV3IHIoZS5zbGljZShuLG4rOCkpLnZhbHVlT2YoKSl9LG4rPTg7YnJlYWs7Y2FzZSA5OnZhciB2PWUuc2xpY2UobixuKzE2KS50b1N0cmluZygiaGV4Iik7bis9MTYsdFtmXT17dHlwZTpoLHZhbHVlOnYuc3Vic3RyKDAsOCkrIi0iK3Yuc3Vic3RyKDgsNCkrIi0iK3Yuc3Vic3RyKDEyLDQpKyItIit2LnN1YnN0cigxNiw0KSsiLSIrdi5zdWJzdHIoMjApfTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIGhlYWRlciB0eXBlIHRhZyIpfX1yZXR1cm4gdH10LmV4cG9ydHM9e3BhcnNlTWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgdD1vKGUpO3JldHVybntoZWFkZXJzOmYodC5oZWFkZXJzKSxib2R5OnQuYm9keX19fX0seyIuL2ludDY0IjozMCwiLi9zcGxpdC1tZXNzYWdlIjozM31dLDMzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLnV0aWwsbz1yLmJ1ZmZlci50b0J1ZmZlcjt0LmV4cG9ydHM9e3NwbGl0TWVzc2FnZTpmdW5jdGlvbihlKXtpZihyLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9byhlKSksZS5sZW5ndGg8MTYpdGhyb3cgbmV3IEVycm9yKCJQcm92aWRlZCBtZXNzYWdlIHRvbyBzaG9ydCB0byBhY2NvbW1vZGF0ZSBldmVudCBzdHJlYW0gbWVzc2FnZSBvdmVyaGVhZCIpO2lmKGUubGVuZ3RoIT09ZS5yZWFkVUludDMyQkUoMCkpdGhyb3cgbmV3IEVycm9yKCJSZXBvcnRlZCBtZXNzYWdlIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCByZWNlaXZlZCBtZXNzYWdlIGxlbmd0aCIpO3ZhciB0PWUucmVhZFVJbnQzMkJFKDgpO2lmKHQhPT1yLmNyeXB0by5jcmMzMihlLnNsaWNlKDAsOCkpKXRocm93IG5ldyBFcnJvcigiVGhlIHByZWx1ZGUgY2hlY2tzdW0gc3BlY2lmaWVkIGluIHRoZSBtZXNzYWdlICgiK3QrIikgZG9lcyBub3QgbWF0Y2ggdGhlIGNhbGN1bGF0ZWQgQ1JDMzIgY2hlY2tzdW0uIik7dmFyIG49ZS5yZWFkVUludDMyQkUoZS5sZW5ndGgtNCk7aWYobiE9PXIuY3J5cHRvLmNyYzMyKGUuc2xpY2UoMCxlLmxlbmd0aC00KSkpdGhyb3cgbmV3IEVycm9yKCJUaGUgbWVzc2FnZSBjaGVja3N1bSBkaWQgbm90IG1hdGNoIHRoZSBleHBlY3RlZCB2YWx1ZSBvZiAiK24pO3ZhciBpPTEyK2UucmVhZFVJbnQzMkJFKDQpO3JldHVybntoZWFkZXJzOmUuc2xpY2UoMTIsaSksYm9keTplLnNsaWNlKGksZS5sZW5ndGgtNCl9fX19LHsiLi4vY29yZSI6MTl9XSwzNDpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXsoZnVuY3Rpb24oKXt2YXIgbj1lKCIuL2NvcmUiKSxyPWUoIi4vc2VxdWVudGlhbF9leGVjdXRvciIpLG89ZSgiLi9kaXNjb3Zlcl9lbmRwb2ludCIpLmRpc2NvdmVyRW5kcG9pbnQ7ZnVuY3Rpb24gaShlKXtpZighZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXJldHVybiIiO3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07cmV0dXJuIHQ/dC5hdXRodHlwZToiIn1mdW5jdGlvbiBzKGUpe3ZhciB0PWUuc2VydmljZTtyZXR1cm4gdC5jb25maWcuc2lnbmF0dXJlVmVyc2lvbj90LmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uOnQuYXBpLnNpZ25hdHVyZVZlcnNpb24/dC5hcGkuc2lnbmF0dXJlVmVyc2lvbjppKGUpfW4uRXZlbnRMaXN0ZW5lcnM9e0NvcmU6e319LG4uRXZlbnRMaXN0ZW5lcnM9e0NvcmU6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSxyKXtyKCJWQUxJREFURV9DUkVERU5USUFMUyIsInZhbGlkYXRlIiwoZnVuY3Rpb24oZSx0KXtpZighZS5zZXJ2aWNlLmFwaS5zaWduYXR1cmVWZXJzaW9uJiYhZS5zZXJ2aWNlLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uKXJldHVybiB0KCk7ImJlYXJlciIhPT1zKGUpP2Uuc2VydmljZS5jb25maWcuZ2V0Q3JlZGVudGlhbHMoKGZ1bmN0aW9uKHIpe3ImJihlLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihyLHtjb2RlOiJDcmVkZW50aWFsc0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIGNyZWRlbnRpYWxzIGluIGNvbmZpZywgaWYgdXNpbmcgQVdTX0NPTkZJR19GSUxFLCBzZXQgQVdTX1NES19MT0FEX0NPTkZJRz0xIn0pKSx0KCl9KSk6ZS5zZXJ2aWNlLmNvbmZpZy5nZXRUb2tlbigoZnVuY3Rpb24ocil7ciYmKGUucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKHIse2NvZGU6IlRva2VuRXJyb3IifSkpLHQoKX0pKX0pKSxlKCJWQUxJREFURV9SRUdJT04iLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKCFlLnNlcnZpY2UuaXNHbG9iYWxFbmRwb2ludCl7dmFyIHQ9bmV3IFJlZ0V4cCgvXihbYS16QS1aMC05XXxbYS16QS1aMC05XVthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKSQvKTtlLnNlcnZpY2UuY29uZmlnLnJlZ2lvbj90LnRlc3QoZS5zZXJ2aWNlLmNvbmZpZy5yZWdpb24pfHwoZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWdFcnJvciIsbWVzc2FnZToiSW52YWxpZCByZWdpb24gaW4gY29uZmlnIn0pKTplLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIHJlZ2lvbiBpbiBjb25maWcifSl9fSkpLGUoIkJVSUxEX0lERU1QT1RFTkNZX1RPS0VOUyIsInZhbGlkYXRlIiwoZnVuY3Rpb24oZSl7aWYoZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO2lmKHQpe3ZhciByPXQuaWRlbXBvdGVudE1lbWJlcnM7aWYoci5sZW5ndGgpe2Zvcih2YXIgbz1uLnV0aWwuY29weShlLnBhcmFtcyksaT0wLHM9ci5sZW5ndGg7aTxzO2krKylvW3JbaV1dfHwob1tyW2ldXT1uLnV0aWwudXVpZC52NCgpKTtlLnBhcmFtcz1vfX19fSkpLGUoIlZBTElEQVRFX1BBUkFNRVRFUlMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dCxyPWUuc2VydmljZS5jb25maWcucGFyYW1WYWxpZGF0aW9uO25ldyBuLlBhcmFtVmFsaWRhdG9yKHIpLnZhbGlkYXRlKHQsZS5wYXJhbXMpfX0pKSxlKCJDT01QVVRFX0NIRUNLU1VNIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZih0KXt2YXIgcj1lLmh0dHBSZXF1ZXN0LmJvZHksbz1yJiYobi51dGlsLkJ1ZmZlci5pc0J1ZmZlcihyKXx8InN0cmluZyI9PXR5cGVvZiByKSxpPWUuaHR0cFJlcXVlc3QuaGVhZGVycztpZih0Lmh0dHBDaGVja3N1bVJlcXVpcmVkJiZlLnNlcnZpY2UuY29uZmlnLmNvbXB1dGVDaGVja3N1bXMmJm8mJiFpWyJDb250ZW50LU1ENSJdKXt2YXIgcz1uLnV0aWwuY3J5cHRvLm1kNShyLCJiYXNlNjQiKTtpWyJDb250ZW50LU1ENSJdPXN9fX19KSkscigiQ09NUFVURV9TSEEyNTYiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSx0KXtpZihlLmhhbHRIYW5kbGVyc09uRXJyb3IoKSxlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciByPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbz1yP3IuYXV0aHR5cGU6IiI7aWYoIWUuc2VydmljZS5hcGkuc2lnbmF0dXJlVmVyc2lvbiYmIW8mJiFlLnNlcnZpY2UuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24pcmV0dXJuIHQoKTtpZihlLnNlcnZpY2UuZ2V0U2lnbmVyQ2xhc3MoZSk9PT1uLlNpZ25lcnMuVjQpe3ZhciBpPWUuaHR0cFJlcXVlc3QuYm9keXx8IiI7aWYoby5pbmRleE9mKCJ1bnNpZ25lZC1ib2R5Iik+PTApcmV0dXJuIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotQ29udGVudC1TaGEyNTYiXT0iVU5TSUdORUQtUEFZTE9BRCIsdCgpO24udXRpbC5jb21wdXRlU2hhMjU2KGksKGZ1bmN0aW9uKG4scil7bj90KG4pOihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il09cix0KCkpfSkpfWVsc2UgdCgpfX0pKSxlKCJTRVRfQ09OVEVOVF9MRU5HVEgiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSl7dmFyIHQ9aShlKSxyPW4udXRpbC5nZXRSZXF1ZXN0UGF5bG9hZFNoYXBlKGUpO2lmKHZvaWQgMD09PWUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSl0cnl7dmFyIG89bi51dGlsLnN0cmluZy5ieXRlTGVuZ3RoKGUuaHR0cFJlcXVlc3QuYm9keSk7ZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdPW99Y2F0Y2gobil7aWYociYmci5pc1N0cmVhbWluZyl7aWYoci5yZXF1aXJlc0xlbmd0aCl0aHJvdyBuO2lmKHQuaW5kZXhPZigidW5zaWduZWQtYm9keSIpPj0wKXJldHVybiB2b2lkKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siVHJhbnNmZXItRW5jb2RpbmciXT0iY2h1bmtlZCIpO3Rocm93IG59dGhyb3cgbn19KSksZSgiU0VUX0hUVFBfSE9TVCIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0LmhlYWRlcnMuSG9zdD1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3R9KSksZSgiU0VUX1RSQUNFX0lEIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe3ZhciByPSJYLUFtem4tVHJhY2UtSWQiO2lmKG4udXRpbC5pc05vZGUoKSYmIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUuaHR0cFJlcXVlc3QuaGVhZGVycyxyKSl7dmFyIG89dC5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FLGk9dC5lbnYuX1hfQU1aTl9UUkFDRV9JRDsic3RyaW5nIj09dHlwZW9mIG8mJm8ubGVuZ3RoPjAmJiJzdHJpbmciPT10eXBlb2YgaSYmaS5sZW5ndGg+MCYmKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tyXT1pKX19KSksZSgiUkVTVEFSVCIsInJlc3RhcnQiLChmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVzcG9uc2UuZXJyb3I7ZSYmZS5yZXRyeWFibGUmJih0aGlzLmh0dHBSZXF1ZXN0PW5ldyBuLkh0dHBSZXF1ZXN0KHRoaXMuc2VydmljZS5lbmRwb2ludCx0aGlzLnNlcnZpY2UucmVnaW9uKSx0aGlzLnJlc3BvbnNlLnJldHJ5Q291bnQ8dGhpcy5zZXJ2aWNlLmNvbmZpZy5tYXhSZXRyaWVzP3RoaXMucmVzcG9uc2UucmV0cnlDb3VudCsrOnRoaXMucmVzcG9uc2UuZXJyb3I9bnVsbCl9KSkscigiRElTQ09WRVJfRU5EUE9JTlQiLCJzaWduIixvLCEwKSxyKCJTSUdOIiwic2lnbiIsKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zZXJ2aWNlLHI9cyhlKTtpZighcnx8MD09PXIubGVuZ3RoKXJldHVybiB0KCk7ImJlYXJlciI9PT1yP24uY29uZmlnLmdldFRva2VuKChmdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUucmVzcG9uc2UuZXJyb3I9cix0KCk7dHJ5e25ldyhuLmdldFNpZ25lckNsYXNzKGUpKShlLmh0dHBSZXF1ZXN0KS5hZGRBdXRob3JpemF0aW9uKG8pfWNhdGNoKHQpe2UucmVzcG9uc2UuZXJyb3I9dH10KCl9KSk6bi5jb25maWcuZ2V0Q3JlZGVudGlhbHMoKGZ1bmN0aW9uKHIsbyl7aWYocilyZXR1cm4gZS5yZXNwb25zZS5lcnJvcj1yLHQoKTt0cnl7dmFyIGk9bi5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLHM9bi5nZXRTaWduZXJDbGFzcyhlKSxhPShlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnN8fHt9KVtlLm9wZXJhdGlvbl0sYz1uZXcgcyhlLmh0dHBSZXF1ZXN0LG4uZ2V0U2lnbmluZ05hbWUoZSkse3NpZ25hdHVyZUNhY2hlOm4uY29uZmlnLnNpZ25hdHVyZUNhY2hlLG9wZXJhdGlvbjphLHNpZ25hdHVyZVZlcnNpb246bi5hcGkuc2lnbmF0dXJlVmVyc2lvbn0pO2Muc2V0U2VydmljZUNsaWVudElkKG4uX2NsaWVudElkKSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24sZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVycy5EYXRlLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXSxjLmFkZEF1dGhvcml6YXRpb24obyxpKSxlLnNpZ25lZEF0PWl9Y2F0Y2godCl7ZS5yZXNwb25zZS5lcnJvcj10fXQoKX0pKX0pKSxlKCJWQUxJREFURV9SRVNQT05TRSIsInZhbGlkYXRlUmVzcG9uc2UiLChmdW5jdGlvbihlKXt0aGlzLnNlcnZpY2Uuc3VjY2Vzc2Z1bFJlc3BvbnNlKGUsdGhpcyk/KGUuZGF0YT17fSxlLmVycm9yPW51bGwpOihlLmRhdGE9bnVsbCxlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlVua25vd25FcnJvciIsbWVzc2FnZToiQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4ifSkpfSkpLGUoIkVSUk9SIiwiZXJyb3IiLChmdW5jdGlvbihlLHQpe2lmKHQucmVxdWVzdC5zZXJ2aWNlLmFwaS5hd3NRdWVyeUNvbXBhdGlibGUpe3ZhciBuPXQuaHR0cFJlc3BvbnNlLmhlYWRlcnMscj1uP25bIngtYW16bi1xdWVyeS1lcnJvciJdOnZvaWQgMDtyJiZyLmluY2x1ZGVzKCI7IikmJih0LmVycm9yLmNvZGU9ci5zcGxpdCgiOyIpWzBdKX19KSwhMCkscigiU0VORCIsInNlbmQiLChmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHIocil7ZS5odHRwUmVzcG9uc2Uuc3RyZWFtPXI7dmFyIG89ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnN0cmVhbSxpPWUucmVxdWVzdC5zZXJ2aWNlLHM9aS5hcGksYT1lLnJlcXVlc3Qub3BlcmF0aW9uLGM9cy5vcGVyYXRpb25zW2FdfHx7fTtyLm9uKCJoZWFkZXJzIiwoZnVuY3Rpb24obyxzLGEpe2lmKGUucmVxdWVzdC5lbWl0KCJodHRwSGVhZGVycyIsW28scyxlLGFdKSwhZS5odHRwUmVzcG9uc2Uuc3RyZWFtaW5nKWlmKDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24pe2lmKGMuaGFzRXZlbnRPdXRwdXQmJmkuc3VjY2Vzc2Z1bFJlc3BvbnNlKGUpKXJldHVybiBlLnJlcXVlc3QuZW1pdCgiaHR0cERvbmUiKSx2b2lkIHQoKTtyLm9uKCJyZWFkYWJsZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9ci5yZWFkKCk7bnVsbCE9PXQmJmUucmVxdWVzdC5lbWl0KCJodHRwRGF0YSIsW3QsZV0pfSkpfWVsc2Ugci5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UucmVxdWVzdC5lbWl0KCJodHRwRGF0YSIsW3QsZV0pfSkpfSkpLHIub24oImVuZCIsKGZ1bmN0aW9uKCl7aWYoIW98fCFvLmRpZENhbGxiYWNrKXtpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uJiZjLmhhc0V2ZW50T3V0cHV0JiZpLnN1Y2Nlc3NmdWxSZXNwb25zZShlKSlyZXR1cm47ZS5yZXF1ZXN0LmVtaXQoImh0dHBEb25lIiksdCgpfX0pKX1mdW5jdGlvbiBvKHIpe2lmKCJSZXF1ZXN0QWJvcnRlZEVycm9yIiE9PXIuY29kZSl7dmFyIG89IlRpbWVvdXRFcnJvciI9PT1yLmNvZGU/ci5jb2RlOiJOZXR3b3JraW5nRXJyb3IiO3I9bi51dGlsLmVycm9yKHIse2NvZGU6byxyZWdpb246ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnJlZ2lvbixob3N0bmFtZTplLnJlcXVlc3QuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdG5hbWUscmV0cnlhYmxlOiEwfSl9ZS5lcnJvcj1yLGUucmVxdWVzdC5lbWl0KCJodHRwRXJyb3IiLFtlLmVycm9yLGVdLChmdW5jdGlvbigpe3QoKX0pKX1mdW5jdGlvbiBpKCl7dmFyIHQsaT1uLkh0dHBDbGllbnQuZ2V0SW5zdGFuY2UoKSxzPWUucmVxdWVzdC5zZXJ2aWNlLmNvbmZpZy5odHRwT3B0aW9uc3x8e307dHJ5e3ZhciBhPWkuaGFuZGxlUmVxdWVzdChlLnJlcXVlc3QuaHR0cFJlcXVlc3QscyxyLG8pOyh0PWEpLm9uKCJzZW5kUHJvZ3Jlc3MiLChmdW5jdGlvbih0KXtlLnJlcXVlc3QuZW1pdCgiaHR0cFVwbG9hZFByb2dyZXNzIixbdCxlXSl9KSksdC5vbigicmVjZWl2ZVByb2dyZXNzIiwoZnVuY3Rpb24odCl7ZS5yZXF1ZXN0LmVtaXQoImh0dHBEb3dubG9hZFByb2dyZXNzIixbdCxlXSl9KSl9Y2F0Y2goZSl7byhlKX19ZS5odHRwUmVzcG9uc2UuX2Fib3J0Q2FsbGJhY2s9dCxlLmVycm9yPW51bGwsZS5kYXRhPW51bGwsKGUucmVxdWVzdC5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCktdGhpcy5zaWduZWRBdCkvMWUzPj02MDA/dGhpcy5lbWl0KCJzaWduIixbdGhpc10sKGZ1bmN0aW9uKGUpe2U/dChlKTppKCl9KSk6aSgpfSkpLGUoIkhUVFBfSEVBREVSUyIsImh0dHBIZWFkZXJzIiwoZnVuY3Rpb24oZSx0LHIsbyl7ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZT1lLHIuaHR0cFJlc3BvbnNlLnN0YXR1c01lc3NhZ2U9byxyLmh0dHBSZXNwb25zZS5oZWFkZXJzPXQsci5odHRwUmVzcG9uc2UuYm9keT1uLnV0aWwuYnVmZmVyLnRvQnVmZmVyKCIiKSxyLmh0dHBSZXNwb25zZS5idWZmZXJzPVtdLHIuaHR0cFJlc3BvbnNlLm51bUJ5dGVzPTA7dmFyIGk9dC5kYXRlfHx0LkRhdGUscz1yLnJlcXVlc3Quc2VydmljZTtpZihpKXt2YXIgYT1EYXRlLnBhcnNlKGkpO3MuY29uZmlnLmNvcnJlY3RDbG9ja1NrZXcmJnMuaXNDbG9ja1NrZXdlZChhKSYmcy5hcHBseUNsb2NrT2Zmc2V0KGEpfX0pKSxlKCJIVFRQX0RBVEEiLCJodHRwRGF0YSIsKGZ1bmN0aW9uKGUsdCl7aWYoZSl7aWYobi51dGlsLmlzTm9kZSgpKXt0Lmh0dHBSZXNwb25zZS5udW1CeXRlcys9ZS5sZW5ndGg7dmFyIHI9dC5odHRwUmVzcG9uc2UuaGVhZGVyc1siY29udGVudC1sZW5ndGgiXSxvPXtsb2FkZWQ6dC5odHRwUmVzcG9uc2UubnVtQnl0ZXMsdG90YWw6cn07dC5yZXF1ZXN0LmVtaXQoImh0dHBEb3dubG9hZFByb2dyZXNzIixbbyx0XSl9dC5odHRwUmVzcG9uc2UuYnVmZmVycy5wdXNoKG4udXRpbC5idWZmZXIudG9CdWZmZXIoZSkpfX0pKSxlKCJIVFRQX0RPTkUiLCJodHRwRG9uZSIsKGZ1bmN0aW9uKGUpe2lmKGUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMmJmUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMubGVuZ3RoPjApe3ZhciB0PW4udXRpbC5idWZmZXIuY29uY2F0KGUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMpO2UuaHR0cFJlc3BvbnNlLmJvZHk9dH1kZWxldGUgZS5odHRwUmVzcG9uc2UubnVtQnl0ZXMsZGVsZXRlIGUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnN9KSksZSgiRklOQUxJWkVfRVJST1IiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihlLmVycm9yLnN0YXR1c0NvZGU9ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSx2b2lkIDA9PT1lLmVycm9yLnJldHJ5YWJsZSYmKGUuZXJyb3IucmV0cnlhYmxlPXRoaXMuc2VydmljZS5yZXRyeWFibGVFcnJvcihlLmVycm9yLHRoaXMpKSl9KSksZSgiSU5WQUxJREFURV9DUkVERU5USUFMUyIsInJldHJ5IiwoZnVuY3Rpb24oZSl7aWYoZS5lcnJvcilzd2l0Y2goZS5lcnJvci5jb2RlKXtjYXNlIlJlcXVlc3RFeHBpcmVkIjpjYXNlIkV4cGlyZWRUb2tlbkV4Y2VwdGlvbiI6Y2FzZSJFeHBpcmVkVG9rZW4iOmUuZXJyb3IucmV0cnlhYmxlPSEwLGUucmVxdWVzdC5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscy5leHBpcmVkPSEwfX0pKSxlKCJFWFBJUkVEX1NJR05BVFVSRSIsInJldHJ5IiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5lcnJvcjt0JiYic3RyaW5nIj09dHlwZW9mIHQuY29kZSYmInN0cmluZyI9PXR5cGVvZiB0Lm1lc3NhZ2UmJnQuY29kZS5tYXRjaCgvU2lnbmF0dXJlLykmJnQubWVzc2FnZS5tYXRjaCgvZXhwaXJlZC8pJiYoZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIkNMT0NLX1NLRVdFRCIsInJldHJ5IiwoZnVuY3Rpb24oZSl7ZS5lcnJvciYmdGhpcy5zZXJ2aWNlLmNsb2NrU2tld0Vycm9yKGUuZXJyb3IpJiZ0aGlzLnNlcnZpY2UuY29uZmlnLmNvcnJlY3RDbG9ja1NrZXcmJihlLmVycm9yLnJldHJ5YWJsZT0hMCl9KSksZSgiUkVESVJFQ1QiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJmUuZXJyb3Iuc3RhdHVzQ29kZT49MzAwJiZlLmVycm9yLnN0YXR1c0NvZGU8NDAwJiZlLmh0dHBSZXNwb25zZS5oZWFkZXJzLmxvY2F0aW9uJiYodGhpcy5odHRwUmVxdWVzdC5lbmRwb2ludD1uZXcgbi5FbmRwb2ludChlLmh0dHBSZXNwb25zZS5oZWFkZXJzLmxvY2F0aW9uKSx0aGlzLmh0dHBSZXF1ZXN0LmhlYWRlcnMuSG9zdD10aGlzLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3QsZS5lcnJvci5yZWRpcmVjdD0hMCxlLmVycm9yLnJldHJ5YWJsZT0hMCl9KSksZSgiUkVUUllfQ0hFQ0siLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJihlLmVycm9yLnJlZGlyZWN0JiZlLnJlZGlyZWN0Q291bnQ8ZS5tYXhSZWRpcmVjdHM/ZS5lcnJvci5yZXRyeURlbGF5PTA6ZS5yZXRyeUNvdW50PGUubWF4UmV0cmllcyYmKGUuZXJyb3IucmV0cnlEZWxheT10aGlzLnNlcnZpY2UucmV0cnlEZWxheXMoZS5yZXRyeUNvdW50LGUuZXJyb3IpfHwwKSl9KSkscigiUkVTRVRfUkVUUllfU1RBVEUiLCJhZnRlclJldHJ5IiwoZnVuY3Rpb24oZSx0KXt2YXIgbixyPSExO2UuZXJyb3ImJihuPWUuZXJyb3IucmV0cnlEZWxheXx8MCxlLmVycm9yLnJldHJ5YWJsZSYmZS5yZXRyeUNvdW50PGUubWF4UmV0cmllcz8oZS5yZXRyeUNvdW50Kysscj0hMCk6ZS5lcnJvci5yZWRpcmVjdCYmZS5yZWRpcmVjdENvdW50PGUubWF4UmVkaXJlY3RzJiYoZS5yZWRpcmVjdENvdW50Kysscj0hMCkpLHImJm4+PTA/KGUuZXJyb3I9bnVsbCxzZXRUaW1lb3V0KHQsbikpOnQoKX0pKX0pKSxDb3JlUG9zdDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbihlKXtlKCJFWFRSQUNUX1JFUVVFU1RfSUQiLCJleHRyYWN0RGF0YSIsbi51dGlsLmV4dHJhY3RSZXF1ZXN0SWQpLGUoIkVYVFJBQ1RfUkVRVUVTVF9JRCIsImV4dHJhY3RFcnJvciIsbi51dGlsLmV4dHJhY3RSZXF1ZXN0SWQpLGUoIkVOT1RGT1VORF9FUlJPUiIsImh0dHBFcnJvciIsKGZ1bmN0aW9uKGUpe2lmKCJOZXR3b3JraW5nRXJyb3IiPT09ZS5jb2RlJiZmdW5jdGlvbihlKXtyZXR1cm4iRU5PVEZPVU5EIj09PWUuZXJybm98fCJudW1iZXIiPT10eXBlb2YgZS5lcnJubyYmImZ1bmN0aW9uIj09dHlwZW9mIG4udXRpbC5nZXRTeXN0ZW1FcnJvck5hbWUmJlsiRUFJX05PTkFNRSIsIkVBSV9OT0RBVEEiXS5pbmRleE9mKG4udXRpbC5nZXRTeXN0ZW1FcnJvck5hbWUoZS5lcnJubyk+PTApfShlKSl7dmFyIHQ9IkluYWNjZXNzaWJsZSBob3N0OiBgIitlLmhvc3RuYW1lKyInIGF0IHBvcnQgYCIrZS5wb3J0KyInLiBUaGlzIHNlcnZpY2UgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gdGhlIGAiK2UucmVnaW9uKyInIHJlZ2lvbi4iO3RoaXMucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcih0KSx7Y29kZToiVW5rbm93bkVuZHBvaW50IixyZWdpb246ZS5yZWdpb24saG9zdG5hbWU6ZS5ob3N0bmFtZSxyZXRyeWFibGU6ITAsb3JpZ2luYWxFcnJvcjplfSl9fSkpfSkpLExvZ2dlcjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt0KCJMT0dfUkVRVUVTVCIsImNvbXBsZXRlIiwoZnVuY3Rpb24odCl7dmFyIHI9dC5yZXF1ZXN0LG89ci5zZXJ2aWNlLmNvbmZpZy5sb2dnZXI7aWYobyl7dmFyIGk9ZnVuY3Rpb24oKXt2YXIgaT0odC5yZXF1ZXN0LnNlcnZpY2UuZ2V0U2tld0NvcnJlY3RlZERhdGUoKS5nZXRUaW1lKCktci5zdGFydFRpbWUuZ2V0VGltZSgpKS8xZTMsYT0hIW8uaXNUVFksYz10Lmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLHU9ci5wYXJhbXM7ci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zJiZyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dJiZyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dLmlucHV0JiYodT1zKHIuc2VydmljZS5hcGkub3BlcmF0aW9uc1tyLm9wZXJhdGlvbl0uaW5wdXQsci5wYXJhbXMpKTt2YXIgbD1lKCJ1dGlsIikuaW5zcGVjdCh1LCEwLG51bGwpLHA9IiI7cmV0dXJuIGEmJihwKz0iG1szM20iKSxwKz0iW0FXUyAiK3Iuc2VydmljZS5zZXJ2aWNlSWRlbnRpZmllcisiICIrYyxwKz0iICIraS50b1N0cmluZygpKyJzICIrdC5yZXRyeUNvdW50KyIgcmV0cmllc10iLGEmJihwKz0iG1swOzFtIikscCs9IiAiK24udXRpbC5zdHJpbmcubG93ZXJGaXJzdChyLm9wZXJhdGlvbikscCs9IigiK2wrIikiLGEmJihwKz0iG1swbSIpLHB9KCk7ImZ1bmN0aW9uIj09dHlwZW9mIG8ubG9nP28ubG9nKGkpOiJmdW5jdGlvbiI9PXR5cGVvZiBvLndyaXRlJiZvLndyaXRlKGkrIlxuIil9ZnVuY3Rpb24gcyhlLHQpe2lmKCF0KXJldHVybiB0O2lmKGUuaXNTZW5zaXRpdmUpcmV0dXJuIioqKlNlbnNpdGl2ZUluZm9ybWF0aW9uKioqIjtzd2l0Y2goZS50eXBlKXtjYXNlInN0cnVjdHVyZSI6dmFyIHI9e307cmV0dXJuIG4udXRpbC5lYWNoKHQsKGZ1bmN0aW9uKHQsbil7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUubWVtYmVycyx0KT9yW3RdPXMoZS5tZW1iZXJzW3RdLG4pOnJbdF09bn0pKSxyO2Nhc2UibGlzdCI6dmFyIG89W107cmV0dXJuIG4udXRpbC5hcnJheUVhY2godCwoZnVuY3Rpb24odCxuKXtvLnB1c2gocyhlLm1lbWJlcix0KSl9KSksbztjYXNlIm1hcCI6dmFyIGk9e307cmV0dXJuIG4udXRpbC5lYWNoKHQsKGZ1bmN0aW9uKHQsbil7aVt0XT1zKGUudmFsdWUsbil9KSksaTtkZWZhdWx0OnJldHVybiB0fX19KSl9KSksSnNvbjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL2pzb24iKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKSxSZXN0OihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcmVzdCIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpLFJlc3RKc29uOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcmVzdF9qc29uIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvciksdCgiVU5TRVRfQ09OVEVOVF9MRU5HVEgiLCJhZnRlckJ1aWxkIixuLnVuc2V0Q29udGVudExlbmd0aCl9KSksUmVzdFhtbDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3RfeG1sIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvcil9KSksUXVlcnk6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9xdWVyeSIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9kaXNjb3Zlcl9lbmRwb2ludCI6MjcsIi4vcHJvdG9jb2wvanNvbiI6NDgsIi4vcHJvdG9jb2wvcXVlcnkiOjQ5LCIuL3Byb3RvY29sL3Jlc3QiOjUwLCIuL3Byb3RvY29sL3Jlc3RfanNvbiI6NTEsIi4vcHJvdG9jb2wvcmVzdF94bWwiOjUyLCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiOjYxLF9wcm9jZXNzOjkyLHV0aWw6ODZ9XSwzNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5FbmRwb2ludD1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe2lmKHIudXRpbC5oaWRlUHJvcGVydGllcyh0aGlzLFsic2xhc2hlcyIsImF1dGgiLCJoYXNoIiwic2VhcmNoIiwicXVlcnkiXSksbnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZW5kcG9pbnQ6ICIrZSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiByLnV0aWwuY29weShlKTtlLm1hdGNoKC9eaHR0cC8pfHwoZT0oKHQmJnZvaWQgMCE9PXQuc3NsRW5hYmxlZD90LnNzbEVuYWJsZWQ6ci5jb25maWcuc3NsRW5hYmxlZCk/Imh0dHBzIjoiaHR0cCIpKyI6Ly8iK2UpLHIudXRpbC51cGRhdGUodGhpcyxyLnV0aWwudXJsUGFyc2UoZSkpLHRoaXMucG9ydD90aGlzLnBvcnQ9cGFyc2VJbnQodGhpcy5wb3J0LDEwKTp0aGlzLnBvcnQ9Imh0dHBzOiI9PT10aGlzLnByb3RvY29sPzQ0Mzo4MH19KSxyLkh0dHBSZXF1ZXN0PW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7ZT1uZXcgci5FbmRwb2ludChlKSx0aGlzLm1ldGhvZD0iUE9TVCIsdGhpcy5wYXRoPWUucGF0aHx8Ii8iLHRoaXMuaGVhZGVycz17fSx0aGlzLmJvZHk9IiIsdGhpcy5lbmRwb2ludD1lLHRoaXMucmVnaW9uPXQsdGhpcy5fdXNlckFnZW50PSIiLHRoaXMuc2V0VXNlckFnZW50KCl9LHNldFVzZXJBZ2VudDpmdW5jdGlvbigpe3RoaXMuX3VzZXJBZ2VudD10aGlzLmhlYWRlcnNbdGhpcy5nZXRVc2VyQWdlbnRIZWFkZXJOYW1lKCldPXIudXRpbC51c2VyQWdlbnQoKX0sZ2V0VXNlckFnZW50SGVhZGVyTmFtZTpmdW5jdGlvbigpe3JldHVybihyLnV0aWwuaXNCcm93c2VyKCk/IlgtQW16LSI6IiIpKyJVc2VyLUFnZW50In0sYXBwZW5kVG9Vc2VyQWdlbnQ6ZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlJiZlJiYodGhpcy5fdXNlckFnZW50Kz0iICIrZSksdGhpcy5oZWFkZXJzW3RoaXMuZ2V0VXNlckFnZW50SGVhZGVyTmFtZSgpXT10aGlzLl91c2VyQWdlbnR9LGdldFVzZXJBZ2VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl91c2VyQWdlbnR9LHBhdGhuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGF0aC5zcGxpdCgiPyIsMSlbMF19LHNlYXJjaDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucGF0aC5zcGxpdCgiPyIsMilbMV07cmV0dXJuIGU/KGU9ci51dGlsLnF1ZXJ5U3RyaW5nUGFyc2UoZSksci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcoZSkpOiIifSx1cGRhdGVFbmRwb2ludDpmdW5jdGlvbihlKXt2YXIgdD1uZXcgci5FbmRwb2ludChlKTt0aGlzLmVuZHBvaW50PXQsdGhpcy5wYXRoPXQucGF0aHx8Ii8iLHRoaXMuaGVhZGVycy5Ib3N0JiYodGhpcy5oZWFkZXJzLkhvc3Q9dC5ob3N0KX19KSxyLkh0dHBSZXNwb25zZT1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzQ29kZT12b2lkIDAsdGhpcy5oZWFkZXJzPXt9LHRoaXMuYm9keT12b2lkIDAsdGhpcy5zdHJlYW1pbmc9ITEsdGhpcy5zdHJlYW09bnVsbH0sY3JlYXRlVW5idWZmZXJlZFN0cmVhbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmVhbWluZz0hMCx0aGlzLnN0cmVhbX19KSxyLkh0dHBDbGllbnQ9byh7fSksci5IdHRwQ2xpZW50LmdldEluc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuc2luZ2xldG9uJiYodGhpcy5zaW5nbGV0b249bmV3IHRoaXMpLHRoaXMuc2luZ2xldG9ufX0seyIuL2NvcmUiOjE5fV0sMzY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7ZSgiLi4vaHR0cCIpLHIuWEhSQ2xpZW50PXIudXRpbC5pbmhlcml0KHtoYW5kbGVSZXF1ZXN0OmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzPXRoaXMsYT1lLmVuZHBvaW50LGM9bmV3IG8sdT1hLnByb3RvY29sKyIvLyIrYS5ob3N0bmFtZTs4MCE9PWEucG9ydCYmNDQzIT09YS5wb3J0JiYodSs9IjoiK2EucG9ydCksdSs9ZS5wYXRoO3ZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdCxwPSExO2Uuc3RyZWFtPWwsbC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwoZnVuY3Rpb24oKXt0cnl7aWYoMD09PWwuc3RhdHVzKXJldHVybn1jYXRjaChlKXtyZXR1cm59dGhpcy5yZWFkeVN0YXRlPj10aGlzLkhFQURFUlNfUkVDRUlWRUQmJiFwJiYoYy5zdGF0dXNDb2RlPWwuc3RhdHVzLGMuaGVhZGVycz1zLnBhcnNlSGVhZGVycyhsLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxjLmVtaXQoImhlYWRlcnMiLGMuc3RhdHVzQ29kZSxjLmhlYWRlcnMsbC5zdGF0dXNUZXh0KSxwPSEwKSx0aGlzLnJlYWR5U3RhdGU9PT10aGlzLkRPTkUmJnMuZmluaXNoUmVxdWVzdChsLGMpfSksITEpLGwudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwoZnVuY3Rpb24oZSl7Yy5lbWl0KCJzZW5kUHJvZ3Jlc3MiLGUpfSkpLGwuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLChmdW5jdGlvbihlKXtjLmVtaXQoInJlY2VpdmVQcm9ncmVzcyIsZSl9KSwhMSksbC5hZGRFdmVudExpc3RlbmVyKCJ0aW1lb3V0IiwoZnVuY3Rpb24oKXtpKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIlRpbWVvdXQiKSx7Y29kZToiVGltZW91dEVycm9yIn0pKX0pLCExKSxsLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZnVuY3Rpb24oKXtpKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIk5ldHdvcmsgRmFpbHVyZSIpLHtjb2RlOiJOZXR3b3JraW5nRXJyb3IifSkpfSksITEpLGwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLChmdW5jdGlvbigpe2koci51dGlsLmVycm9yKG5ldyBFcnJvcigiUmVxdWVzdCBhYm9ydGVkIikse2NvZGU6IlJlcXVlc3RBYm9ydGVkRXJyb3IifSkpfSksITEpLG4oYyksbC5vcGVuKGUubWV0aG9kLHUsITEhPT10LnhockFzeW5jKSxyLnV0aWwuZWFjaChlLmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7IkNvbnRlbnQtTGVuZ3RoIiE9PWUmJiJVc2VyLUFnZW50IiE9PWUmJiJIb3N0IiE9PWUmJmwuc2V0UmVxdWVzdEhlYWRlcihlLHQpfSkpLHQudGltZW91dCYmITEhPT10LnhockFzeW5jJiYobC50aW1lb3V0PXQudGltZW91dCksdC54aHJXaXRoQ3JlZGVudGlhbHMmJihsLndpdGhDcmVkZW50aWFscz0hMCk7dHJ5e2wucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciJ9Y2F0Y2goZSl7fXRyeXtlLmJvZHk/bC5zZW5kKGUuYm9keSk6bC5zZW5kKCl9Y2F0Y2godCl7aWYoIWUuYm9keXx8Im9iamVjdCIhPXR5cGVvZiBlLmJvZHkuYnVmZmVyKXRocm93IHQ7bC5zZW5kKGUuYm9keS5idWZmZXIpfXJldHVybiBjfSxwYXJzZUhlYWRlcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHIudXRpbC5hcnJheUVhY2goZS5zcGxpdCgvXHI/XG4vKSwoZnVuY3Rpb24oZSl7dmFyIG49ZS5zcGxpdCgiOiIsMSlbMF0scj1lLnN1YnN0cmluZyhuLmxlbmd0aCsyKTtuLmxlbmd0aD4wJiYodFtuLnRvTG93ZXJDYXNlKCldPXIpfSkpLHR9LGZpbmlzaFJlcXVlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZigiYXJyYXlidWZmZXIiPT09ZS5yZXNwb25zZVR5cGUmJmUucmVzcG9uc2Upe3ZhciBvPWUucmVzcG9uc2U7bj1uZXcgci51dGlsLkJ1ZmZlcihvLmJ5dGVMZW5ndGgpO2Zvcih2YXIgaT1uZXcgVWludDhBcnJheShvKSxzPTA7czxuLmxlbmd0aDsrK3MpbltzXT1pW3NdfXRyeXtufHwic3RyaW5nIiE9dHlwZW9mIGUucmVzcG9uc2VUZXh0fHwobj1uZXcgci51dGlsLkJ1ZmZlcihlLnJlc3BvbnNlVGV4dCkpfWNhdGNoKGUpe31uJiZ0LmVtaXQoImRhdGEiLG4pLHQuZW1pdCgiZW5kIil9fSksci5IdHRwQ2xpZW50LnByb3RvdHlwZT1yLlhIUkNsaWVudC5wcm90b3R5cGUsci5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uPTF9LHsiLi4vY29yZSI6MTksIi4uL2h0dHAiOjM1LGV2ZW50czo4OH1dLDM3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIG8oKXt9ZnVuY3Rpb24gaShlLHQpe2lmKHQmJm51bGwhPWUpc3dpdGNoKHQudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKHQuaXNEb2N1bWVudClyZXR1cm4gZTt2YXIgbj17fTtyZXR1cm4gci5lYWNoKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89dC5tZW1iZXJzW2VdO2lmKG8pe2lmKCJib2R5IiE9PW8ubG9jYXRpb24pcmV0dXJuO3ZhciBzPW8uaXNMb2NhdGlvbk5hbWU/by5uYW1lOmUsYT1pKHIsbyk7dm9pZCAwIT09YSYmKG5bc109YSl9fSkpLG59KGUsdCk7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiByLmVhY2goZSwoZnVuY3Rpb24oZSxyKXt2YXIgbz1pKHIsdC52YWx1ZSk7dm9pZCAwIT09byYmKG5bZV09byl9KSksbn0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPVtdO3JldHVybiByLmFycmF5RWFjaChlLChmdW5jdGlvbihlKXt2YXIgcj1pKGUsdC5tZW1iZXIpO3ZvaWQgMCE9PXImJm4ucHVzaChyKX0pKSxufShlLHQpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9XaXJlRm9ybWF0KGUpfShlLHQpfX1vLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlLHQpe3JldHVybiBKU09OLnN0cmluZ2lmeShpKGUsdCkpfSx0LmV4cG9ydHM9b30seyIuLi91dGlsIjo3NH1dLDM4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIG8oKXt9ZnVuY3Rpb24gaShlLHQpe2lmKHQmJnZvaWQgMCE9PWUpc3dpdGNoKHQudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe2lmKHQuaXNEb2N1bWVudClyZXR1cm4gZTt2YXIgbj17fSxvPXQubWVtYmVycztyZXR1cm4gci5lYWNoKG8sKGZ1bmN0aW9uKHQscil7dmFyIG89ci5pc0xvY2F0aW9uTmFtZT9yLm5hbWU6dDtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSl7dmFyIHM9aShlW29dLHIpO3ZvaWQgMCE9PXMmJihuW3RdPXMpfX0pKSxufX0oZSx0KTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSl7dmFyIG49e307cmV0dXJuIHIuZWFjaChlLChmdW5jdGlvbihlLHIpe3ZhciBvPWkocix0LnZhbHVlKTtuW2VdPXZvaWQgMD09PW8/bnVsbDpvfSkpLG59fShlLHQpO2Nhc2UibGlzdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSl7dmFyIG49W107cmV0dXJuIHIuYXJyYXlFYWNoKGUsKGZ1bmN0aW9uKGUpe3ZhciByPWkoZSx0Lm1lbWJlcik7dm9pZCAwPT09cj9uLnB1c2gobnVsbCk6bi5wdXNoKHIpfSkpLG59fShlLHQpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9UeXBlKGUpfShlLHQpfX1vLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQpe3JldHVybiBpKEpTT04ucGFyc2UoZSksdCl9LHQuZXhwb3J0cz1vfSx7Ii4uL3V0aWwiOjc0fV0sMzk6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7dmFyIG49WyJXZSBhcmUgZm9ybWFsaXppbmcgb3VyIHBsYW5zIHRvIGVudGVyIEFXUyBTREsgZm9yIEphdmFTY3JpcHQgKHYyKSBpbnRvIG1haW50ZW5hbmNlIG1vZGUgaW4gMjAyMy5cbiIsIlBsZWFzZSBtaWdyYXRlIHlvdXIgY29kZSB0byB1c2UgQVdTIFNESyBmb3IgSmF2YVNjcmlwdCAodjMpLiIsIkZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjayB0aGUgbWlncmF0aW9uIGd1aWRlIGF0IGh0dHBzOi8vYS5jby83UHpNQ2N5Il0uam9pbigiXG4iKTt0LmV4cG9ydHM9e3N1cHByZXNzOiExfSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZXhwb3J0cy5zdXBwcmVzc3x8dm9pZCAwIT09ZSYmKCJvYmplY3QiPT10eXBlb2YgZS5lbnYmJnZvaWQgMCE9PWUuZW52LkFXU19FWEVDVVRJT05fRU5WJiYwPT09ZS5lbnYuQVdTX0VYRUNVVElPTl9FTlYuaW5kZXhPZigiQVdTX0xhbWJkYV8iKXx8Im9iamVjdCI9PXR5cGVvZiBlLmVudiYmdm9pZCAwIT09ZS5lbnYuQVdTX1NES19KU19TVVBQUkVTU19NQUlOVEVOQU5DRV9NT0RFX01FU1NBR0V8fCJmdW5jdGlvbiI9PXR5cGVvZiBlLmVtaXRXYXJuaW5nJiZlLmVtaXRXYXJuaW5nKG4se3R5cGU6Ik5PVEUifSkpfSksMCl9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7X3Byb2Nlc3M6OTJ9XSw0MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29sbGVjdGlvbiIpLG89ZSgiLi9vcGVyYXRpb24iKSxpPWUoIi4vc2hhcGUiKSxzPWUoIi4vcGFnaW5hdG9yIiksYT1lKCIuL3Jlc291cmNlX3dhaXRlciIpLGM9ZSgiLi4vLi4vYXBpcy9tZXRhZGF0YS5qc29uIiksdT1lKCIuLi91dGlsIiksbD11LnByb3BlcnR5LHA9dS5tZW1vaXplZFByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7ZT1lfHx7fSwodD10fHx7fSkuYXBpPXRoaXMsZS5tZXRhZGF0YT1lLm1ldGFkYXRhfHx7fTt2YXIgZD10LnNlcnZpY2VJZGVudGlmaWVyO2RlbGV0ZSB0LnNlcnZpY2VJZGVudGlmaWVyLGwodGhpcywiaXNBcGkiLCEwLCExKSxsKHRoaXMsImFwaVZlcnNpb24iLGUubWV0YWRhdGEuYXBpVmVyc2lvbiksbCh0aGlzLCJlbmRwb2ludFByZWZpeCIsZS5tZXRhZGF0YS5lbmRwb2ludFByZWZpeCksbCh0aGlzLCJzaWduaW5nTmFtZSIsZS5tZXRhZGF0YS5zaWduaW5nTmFtZSksbCh0aGlzLCJnbG9iYWxFbmRwb2ludCIsZS5tZXRhZGF0YS5nbG9iYWxFbmRwb2ludCksbCh0aGlzLCJzaWduYXR1cmVWZXJzaW9uIixlLm1ldGFkYXRhLnNpZ25hdHVyZVZlcnNpb24pLGwodGhpcywianNvblZlcnNpb24iLGUubWV0YWRhdGEuanNvblZlcnNpb24pLGwodGhpcywidGFyZ2V0UHJlZml4IixlLm1ldGFkYXRhLnRhcmdldFByZWZpeCksbCh0aGlzLCJwcm90b2NvbCIsZS5tZXRhZGF0YS5wcm90b2NvbCksbCh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLGUubWV0YWRhdGEudGltZXN0YW1wRm9ybWF0KSxsKHRoaXMsInhtbE5hbWVzcGFjZVVyaSIsZS5tZXRhZGF0YS54bWxOYW1lc3BhY2UpLGwodGhpcywiYWJicmV2aWF0aW9uIixlLm1ldGFkYXRhLnNlcnZpY2VBYmJyZXZpYXRpb24pLGwodGhpcywiZnVsbE5hbWUiLGUubWV0YWRhdGEuc2VydmljZUZ1bGxOYW1lKSxsKHRoaXMsInNlcnZpY2VJZCIsZS5tZXRhZGF0YS5zZXJ2aWNlSWQpLGQmJmNbZF0mJmwodGhpcywieG1sTm9EZWZhdWx0TGlzdHMiLGNbZF0ueG1sTm9EZWZhdWx0TGlzdHMsITEpLHAodGhpcywiY2xhc3NOYW1lIiwoZnVuY3Rpb24oKXt2YXIgdD1lLm1ldGFkYXRhLnNlcnZpY2VBYmJyZXZpYXRpb258fGUubWV0YWRhdGEuc2VydmljZUZ1bGxOYW1lO3JldHVybiB0PygiRWxhc3RpY0xvYWRCYWxhbmNpbmciPT09KHQ9dC5yZXBsYWNlKC9eQW1hem9ufEFXU1xzKnxcKC4qfFxzK3xcVysvZywiIikpJiYodD0iRUxCIiksdCk6bnVsbH0pKSxsKHRoaXMsIm9wZXJhdGlvbnMiLG5ldyByKGUub3BlcmF0aW9ucyx0LChmdW5jdGlvbihlLG4pe3JldHVybiBuZXcgbyhlLG4sdCl9KSx1LnN0cmluZy5sb3dlckZpcnN0LChmdW5jdGlvbihlLHQpeyEwPT09dC5lbmRwb2ludG9wZXJhdGlvbiYmbChuLCJlbmRwb2ludE9wZXJhdGlvbiIsdS5zdHJpbmcubG93ZXJGaXJzdChlKSksdC5lbmRwb2ludGRpc2NvdmVyeSYmIW4uaGFzUmVxdWlyZWRFbmRwb2ludERpc2NvdmVyeSYmbChuLCJoYXNSZXF1aXJlZEVuZHBvaW50RGlzY292ZXJ5IiwhMD09PXQuZW5kcG9pbnRkaXNjb3ZlcnkucmVxdWlyZWQpfSkpKSxsKHRoaXMsInNoYXBlcyIsbmV3IHIoZS5zaGFwZXMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gaS5jcmVhdGUobix0KX0pKSksbCh0aGlzLCJwYWdpbmF0b3JzIixuZXcgcihlLnBhZ2luYXRvcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IHMoZSxuLHQpfSkpKSxsKHRoaXMsIndhaXRlcnMiLG5ldyByKGUud2FpdGVycyx0LChmdW5jdGlvbihlLG4pe3JldHVybiBuZXcgYShlLG4sdCl9KSx1LnN0cmluZy5sb3dlckZpcnN0KSksdC5kb2N1bWVudGF0aW9uJiYobCh0aGlzLCJkb2N1bWVudGF0aW9uIixlLmRvY3VtZW50YXRpb24pLGwodGhpcywiZG9jdW1lbnRhdGlvblVybCIsZS5kb2N1bWVudGF0aW9uVXJsKSksbCh0aGlzLCJhd3NRdWVyeUNvbXBhdGlibGUiLGUubWV0YWRhdGEuYXdzUXVlcnlDb21wYXRpYmxlKX19LHsiLi4vLi4vYXBpcy9tZXRhZGF0YS5qc29uIjo0LCIuLi91dGlsIjo3NCwiLi9jb2xsZWN0aW9uIjo0MSwiLi9vcGVyYXRpb24iOjQyLCIuL3BhZ2luYXRvciI6NDMsIi4vcmVzb3VyY2Vfd2FpdGVyIjo0NCwiLi9zaGFwZSI6NDV9XSw0MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKS5tZW1vaXplZFByb3BlcnR5O2Z1bmN0aW9uIG8oZSx0LG4sbyl7cih0aGlzLG8oZSksKGZ1bmN0aW9uKCl7cmV0dXJuIG4oZSx0KX0pKX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIHMgaW4gcj1yfHxTdHJpbmcsZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxzKSYmKG8uY2FsbCh0aGlzLHMsZVtzXSxuLHIpLGkmJmkocyxlW3NdKSl9fSx7Ii4uL3V0aWwiOjc0fV0sNDI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3NoYXBlIiksbz1lKCIuLi91dGlsIiksaT1vLnByb3BlcnR5LHM9by5tZW1vaXplZFByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7dmFyIG89dGhpcztuPW58fHt9LGkodGhpcywibmFtZSIsdC5uYW1lfHxlKSxpKHRoaXMsImFwaSIsbi5hcGksITEpLHQuaHR0cD10Lmh0dHB8fHt9LGkodGhpcywiZW5kcG9pbnQiLHQuZW5kcG9pbnQpLGkodGhpcywiaHR0cE1ldGhvZCIsdC5odHRwLm1ldGhvZHx8IlBPU1QiKSxpKHRoaXMsImh0dHBQYXRoIix0Lmh0dHAucmVxdWVzdFVyaXx8Ii8iKSxpKHRoaXMsImF1dGh0eXBlIix0LmF1dGh0eXBlfHwiIiksaSh0aGlzLCJlbmRwb2ludERpc2NvdmVyeVJlcXVpcmVkIix0LmVuZHBvaW50ZGlzY292ZXJ5P3QuZW5kcG9pbnRkaXNjb3ZlcnkucmVxdWlyZWQ/IlJFUVVJUkVEIjoiT1BUSU9OQUwiOiJOVUxMIik7dmFyIGE9dC5odHRwQ2hlY2tzdW1SZXF1aXJlZHx8dC5odHRwQ2hlY2tzdW0mJnQuaHR0cENoZWNrc3VtLnJlcXVlc3RDaGVja3N1bVJlcXVpcmVkO2kodGhpcywiaHR0cENoZWNrc3VtUmVxdWlyZWQiLGEsITEpLHModGhpcywiaW5wdXQiLChmdW5jdGlvbigpe3JldHVybiB0LmlucHV0P3IuY3JlYXRlKHQuaW5wdXQsbik6bmV3IHIuY3JlYXRlKHt0eXBlOiJzdHJ1Y3R1cmUifSxuKX0pKSxzKHRoaXMsIm91dHB1dCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHQub3V0cHV0P3IuY3JlYXRlKHQub3V0cHV0LG4pOm5ldyByLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0sbil9KSkscyh0aGlzLCJlcnJvcnMiLChmdW5jdGlvbigpe3ZhciBlPVtdO2lmKCF0LmVycm9ycylyZXR1cm4gbnVsbDtmb3IodmFyIG89MDtvPHQuZXJyb3JzLmxlbmd0aDtvKyspZS5wdXNoKHIuY3JlYXRlKHQuZXJyb3JzW29dLG4pKTtyZXR1cm4gZX0pKSxzKHRoaXMsInBhZ2luYXRvciIsKGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBpLnBhZ2luYXRvcnNbZV19KSksbi5kb2N1bWVudGF0aW9uJiYoaSh0aGlzLCJkb2N1bWVudGF0aW9uIix0LmRvY3VtZW50YXRpb24pLGkodGhpcywiZG9jdW1lbnRhdGlvblVybCIsdC5kb2N1bWVudGF0aW9uVXJsKSkscyh0aGlzLCJpZGVtcG90ZW50TWVtYmVycyIsKGZ1bmN0aW9uKCl7dmFyIGU9W10sdD1vLmlucHV0LG49dC5tZW1iZXJzO2lmKCF0Lm1lbWJlcnMpcmV0dXJuIGU7Zm9yKHZhciByIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShyKSYmITA9PT1uW3JdLmlzSWRlbXBvdGVudCYmZS5wdXNoKHIpO3JldHVybiBlfSkpLHModGhpcywiaGFzRXZlbnRPdXRwdXQiLChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLm1lbWJlcnMsbj1lLnBheWxvYWQ7aWYoIWUubWVtYmVycylyZXR1cm4hMTtpZihuKXJldHVybiB0W25dLmlzRXZlbnRTdHJlYW07Zm9yKHZhciByIGluIHQpaWYoIXQuaGFzT3duUHJvcGVydHkocikmJiEwPT09dFtyXS5pc0V2ZW50U3RyZWFtKXJldHVybiEwO3JldHVybiExfShvLm91dHB1dCl9KSl9fSx7Ii4uL3V0aWwiOjc0LCIuL3NoYXBlIjo0NX1dLDQzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLnByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3IodGhpcywiaW5wdXRUb2tlbiIsdC5pbnB1dF90b2tlbikscih0aGlzLCJsaW1pdEtleSIsdC5saW1pdF9rZXkpLHIodGhpcywibW9yZVJlc3VsdHMiLHQubW9yZV9yZXN1bHRzKSxyKHRoaXMsIm91dHB1dFRva2VuIix0Lm91dHB1dF90b2tlbikscih0aGlzLCJyZXN1bHRLZXkiLHQucmVzdWx0X2tleSl9fSx7Ii4uL3V0aWwiOjc0fV0sNDQ6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1yLnByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7bj1ufHx7fSxvKHRoaXMsIm5hbWUiLGUpLG8odGhpcywiYXBpIixuLmFwaSwhMSksdC5vcGVyYXRpb24mJm8odGhpcywib3BlcmF0aW9uIixyLnN0cmluZy5sb3dlckZpcnN0KHQub3BlcmF0aW9uKSk7dmFyIGk9dGhpcztbInR5cGUiLCJkZXNjcmlwdGlvbiIsImRlbGF5IiwibWF4QXR0ZW1wdHMiLCJhY2NlcHRvcnMiXS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj10W2VdO24mJm8oaSxlLG4pfSkpfX0seyIuLi91dGlsIjo3NH1dLDQ1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb2xsZWN0aW9uIiksbz1lKCIuLi91dGlsIik7ZnVuY3Rpb24gaShlLHQsbil7bnVsbCE9biYmby5wcm9wZXJ0eS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcyhlLHQpe2UuY29uc3RydWN0b3IucHJvdG90eXBlW3RdfHxvLm1lbW9pemVkUHJvcGVydHkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGEoZSx0LG4pe3Q9dHx8e30saSh0aGlzLCJzaGFwZSIsZS5zaGFwZSksaSh0aGlzLCJhcGkiLHQuYXBpLCExKSxpKHRoaXMsInR5cGUiLGUudHlwZSksaSh0aGlzLCJlbnVtIixlLmVudW0pLGkodGhpcywibWluIixlLm1pbiksaSh0aGlzLCJtYXgiLGUubWF4KSxpKHRoaXMsInBhdHRlcm4iLGUucGF0dGVybiksaSh0aGlzLCJsb2NhdGlvbiIsZS5sb2NhdGlvbnx8dGhpcy5sb2NhdGlvbnx8ImJvZHkiKSxpKHRoaXMsIm5hbWUiLHRoaXMubmFtZXx8ZS54bWxOYW1lfHxlLnF1ZXJ5TmFtZXx8ZS5sb2NhdGlvbk5hbWV8fG4pLGkodGhpcywiaXNTdHJlYW1pbmciLGUuc3RyZWFtaW5nfHx0aGlzLmlzU3RyZWFtaW5nfHwhMSksaSh0aGlzLCJyZXF1aXJlc0xlbmd0aCIsZS5yZXF1aXJlc0xlbmd0aCwhMSksaSh0aGlzLCJpc0NvbXBvc2l0ZSIsZS5pc0NvbXBvc2l0ZXx8ITEpLGkodGhpcywiaXNTaGFwZSIsITAsITEpLGkodGhpcywiaXNRdWVyeU5hbWUiLEJvb2xlYW4oZS5xdWVyeU5hbWUpLCExKSxpKHRoaXMsImlzTG9jYXRpb25OYW1lIixCb29sZWFuKGUubG9jYXRpb25OYW1lKSwhMSksaSh0aGlzLCJpc0lkZW1wb3RlbnQiLCEwPT09ZS5pZGVtcG90ZW5jeVRva2VuKSxpKHRoaXMsImlzSnNvblZhbHVlIiwhMD09PWUuanNvbnZhbHVlKSxpKHRoaXMsImlzU2Vuc2l0aXZlIiwhMD09PWUuc2Vuc2l0aXZlfHxlLnByb3RvdHlwZSYmITA9PT1lLnByb3RvdHlwZS5zZW5zaXRpdmUpLGkodGhpcywiaXNFdmVudFN0cmVhbSIsQm9vbGVhbihlLmV2ZW50c3RyZWFtKSwhMSksaSh0aGlzLCJpc0V2ZW50IixCb29sZWFuKGUuZXZlbnQpLCExKSxpKHRoaXMsImlzRXZlbnRQYXlsb2FkIixCb29sZWFuKGUuZXZlbnRwYXlsb2FkKSwhMSksaSh0aGlzLCJpc0V2ZW50SGVhZGVyIixCb29sZWFuKGUuZXZlbnRoZWFkZXIpLCExKSxpKHRoaXMsImlzVGltZXN0YW1wRm9ybWF0U2V0IixCb29sZWFuKGUudGltZXN0YW1wRm9ybWF0KXx8ZS5wcm90b3R5cGUmJiEwPT09ZS5wcm90b3R5cGUuaXNUaW1lc3RhbXBGb3JtYXRTZXQsITEpLGkodGhpcywiZW5kcG9pbnREaXNjb3ZlcnlJZCIsQm9vbGVhbihlLmVuZHBvaW50ZGlzY292ZXJ5aWQpLCExKSxpKHRoaXMsImhvc3RMYWJlbCIsQm9vbGVhbihlLmhvc3RMYWJlbCksITEpLHQuZG9jdW1lbnRhdGlvbiYmKGkodGhpcywiZG9jdW1lbnRhdGlvbiIsZS5kb2N1bWVudGF0aW9uKSxpKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLGUuZG9jdW1lbnRhdGlvblVybCkpLGUueG1sQXR0cmlidXRlJiZpKHRoaXMsImlzWG1sQXR0cmlidXRlIixlLnhtbEF0dHJpYnV0ZXx8ITEpLGkodGhpcywiZGVmYXVsdFZhbHVlIixudWxsKSx0aGlzLnRvV2lyZUZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplfSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gZX19ZnVuY3Rpb24gYyhlKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpKHRoaXMsImlzQ29tcG9zaXRlIiwhMCksZS5mbGF0dGVuZWQmJmkodGhpcywiZmxhdHRlbmVkIixlLmZsYXR0ZW5lZHx8ITEpfWZ1bmN0aW9uIHUoZSx0KXt2YXIgbj10aGlzLG89bnVsbCx1PSF0aGlzLmlzU2hhcGU7Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdSYmKGkodGhpcywiZGVmYXVsdFZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm57fX0pKSxpKHRoaXMsIm1lbWJlcnMiLHt9KSxpKHRoaXMsIm1lbWJlck5hbWVzIixbXSksaSh0aGlzLCJyZXF1aXJlZCIsW10pLGkodGhpcywiaXNSZXF1aXJlZCIsKGZ1bmN0aW9uKCl7cmV0dXJuITF9KSksaSh0aGlzLCJpc0RvY3VtZW50IixCb29sZWFuKGUuZG9jdW1lbnQpKSksZS5tZW1iZXJzJiYoaSh0aGlzLCJtZW1iZXJzIixuZXcgcihlLm1lbWJlcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gYS5jcmVhdGUobix0LGUpfSkpKSxzKHRoaXMsIm1lbWJlck5hbWVzIiwoZnVuY3Rpb24oKXtyZXR1cm4gZS54bWxPcmRlcnx8T2JqZWN0LmtleXMoZS5tZW1iZXJzKX0pKSxlLmV2ZW50JiYocyh0aGlzLCJldmVudFBheWxvYWRNZW1iZXJOYW1lIiwoZnVuY3Rpb24oKXtmb3IodmFyIGU9bi5tZW1iZXJzLHQ9bi5tZW1iZXJOYW1lcyxyPTAsbz10Lmxlbmd0aDtyPG87cisrKWlmKGVbdFtyXV0uaXNFdmVudFBheWxvYWQpcmV0dXJuIHRbcl19KSkscyh0aGlzLCJldmVudEhlYWRlck1lbWJlck5hbWVzIiwoZnVuY3Rpb24oKXtmb3IodmFyIGU9bi5tZW1iZXJzLHQ9bi5tZW1iZXJOYW1lcyxyPVtdLG89MCxpPXQubGVuZ3RoO288aTtvKyspZVt0W29dXS5pc0V2ZW50SGVhZGVyJiZyLnB1c2godFtvXSk7cmV0dXJuIHJ9KSkpKSxlLnJlcXVpcmVkJiYoaSh0aGlzLCJyZXF1aXJlZCIsZS5yZXF1aXJlZCksaSh0aGlzLCJpc1JlcXVpcmVkIiwoZnVuY3Rpb24odCl7aWYoIW8pe289e307Zm9yKHZhciBuPTA7bjxlLnJlcXVpcmVkLmxlbmd0aDtuKyspb1tlLnJlcXVpcmVkW25dXT0hMH1yZXR1cm4gb1t0XX0pLCExLCEwKSksaSh0aGlzLCJyZXN1bHRXcmFwcGVyIixlLnJlc3VsdFdyYXBwZXJ8fG51bGwpLGUucGF5bG9hZCYmaSh0aGlzLCJwYXlsb2FkIixlLnBheWxvYWQpLCJzdHJpbmciPT10eXBlb2YgZS54bWxOYW1lc3BhY2U/aSh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUueG1sTmFtZXNwYWNlKToib2JqZWN0Ij09dHlwZW9mIGUueG1sTmFtZXNwYWNlJiYoaSh0aGlzLCJ4bWxOYW1lc3BhY2VQcmVmaXgiLGUueG1sTmFtZXNwYWNlLnByZWZpeCksaSh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUueG1sTmFtZXNwYWNlLnVyaSkpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbj10aGlzLHI9IXRoaXMuaXNTaGFwZTtpZihjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZpKHRoaXMsImRlZmF1bHRWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuW119KSksZS5tZW1iZXImJnModGhpcywibWVtYmVyIiwoZnVuY3Rpb24oKXtyZXR1cm4gYS5jcmVhdGUoZS5tZW1iZXIsdCl9KSksdGhpcy5mbGF0dGVuZWQpe3ZhciBvPXRoaXMubmFtZTtzKHRoaXMsIm5hbWUiLChmdW5jdGlvbigpe3JldHVybiBuLm1lbWJlci5uYW1lfHxvfSkpfX1mdW5jdGlvbiBwKGUsdCl7dmFyIG49IXRoaXMuaXNTaGFwZTtjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuJiYoaSh0aGlzLCJkZWZhdWx0VmFsdWUiLChmdW5jdGlvbigpe3JldHVybnt9fSkpLGkodGhpcywia2V5IixhLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0sdCkpLGkodGhpcywidmFsdWUiLGEuY3JlYXRlKHt0eXBlOiJzdHJpbmcifSx0KSkpLGUua2V5JiZzKHRoaXMsImtleSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY3JlYXRlKGUua2V5LHQpfSkpLGUudmFsdWUmJnModGhpcywidmFsdWUiLChmdW5jdGlvbigpe3JldHVybiBhLmNyZWF0ZShlLnZhbHVlLHQpfSkpfWZ1bmN0aW9uIGQoKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1bInJlc3QteG1sIiwicXVlcnkiLCJlYzIiXTt0aGlzLnRvVHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLmFwaSYmZS5pbmRleE9mKHRoaXMuYXBpLnByb3RvY29sKT4tMT90fHwiIjp0LHRoaXMuaXNKc29uVmFsdWU/SlNPTi5wYXJzZSh0KTp0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC50b1N0cmluZz90LnRvU3RyaW5nKCk6dH0sdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaXNKc29uVmFsdWU/SlNPTi5zdHJpbmdpZnkoZSk6ZX19ZnVuY3Rpb24gaCgpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3ZhciB0PW8uYmFzZTY0LmRlY29kZShlKTtpZih0aGlzLmlzU2Vuc2l0aXZlJiZvLmlzTm9kZSgpJiYiZnVuY3Rpb24iPT10eXBlb2Ygby5CdWZmZXIuYWxsb2Mpe3ZhciBuPW8uQnVmZmVyLmFsbG9jKHQubGVuZ3RoLHQpO3QuZmlsbCgwKSx0PW59cmV0dXJuIHR9LHRoaXMudG9XaXJlRm9ybWF0PW8uYmFzZTY0LmVuY29kZX1mdW5jdGlvbiBmKCl7aC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZygpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZTpudWxsPT1lP251bGw6InRydWUiPT09ZX19YS5ub3JtYWxpemVkVHlwZXM9e2NoYXJhY3Rlcjoic3RyaW5nIixkb3VibGU6ImZsb2F0Iixsb25nOiJpbnRlZ2VyIixzaG9ydDoiaW50ZWdlciIsYmlnaW50ZWdlcjoiaW50ZWdlciIsYmlnZGVjaW1hbDoiZmxvYXQiLGJsb2I6ImJpbmFyeSJ9LGEudHlwZXM9e3N0cnVjdHVyZTp1LGxpc3Q6bCxtYXA6cCxib29sZWFuOmcsdGltZXN0YW1wOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50aW1lc3RhbXBGb3JtYXQpaSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLGUudGltZXN0YW1wRm9ybWF0KTtlbHNlIGlmKHQuaXNUaW1lc3RhbXBGb3JtYXRTZXQmJnRoaXMudGltZXN0YW1wRm9ybWF0KWkodGhpcywidGltZXN0YW1wRm9ybWF0Iix0aGlzLnRpbWVzdGFtcEZvcm1hdCk7ZWxzZSBpZigiaGVhZGVyIj09PXRoaXMubG9jYXRpb24paSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJyZmM4MjIiKTtlbHNlIGlmKCJxdWVyeXN0cmluZyI9PT10aGlzLmxvY2F0aW9uKWkodGhpcywidGltZXN0YW1wRm9ybWF0IiwiaXNvODYwMSIpO2Vsc2UgaWYodGhpcy5hcGkpc3dpdGNoKHRoaXMuYXBpLnByb3RvY29sKXtjYXNlImpzb24iOmNhc2UicmVzdC1qc29uIjppKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsInVuaXhUaW1lc3RhbXAiKTticmVhaztjYXNlInJlc3QteG1sIjpjYXNlInF1ZXJ5IjpjYXNlImVjMiI6aSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJpc284NjAxIil9dGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgZS50b1VUQ1N0cmluZz9lOiJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlP28uZGF0ZS5wYXJzZVRpbWVzdGFtcChlKTpudWxsfSx0aGlzLnRvV2lyZUZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gby5kYXRlLmZvcm1hdChlLHQudGltZXN0YW1wRm9ybWF0KX19LGZsb2F0OmZ1bmN0aW9uKCl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bnVsbDpwYXJzZUZsb2F0KGUpfSx0aGlzLnRvV2lyZUZvcm1hdD10aGlzLnRvVHlwZX0saW50ZWdlcjpmdW5jdGlvbigpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6cGFyc2VJbnQoZSwxMCl9LHRoaXMudG9XaXJlRm9ybWF0PXRoaXMudG9UeXBlfSxzdHJpbmc6ZCxiYXNlNjQ6ZixiaW5hcnk6aH0sYS5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7aWYoZS5zaGFwZSl7dmFyIG49dC5hcGkuc2hhcGVzW2Uuc2hhcGVdO2lmKCFuKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgc2hhcGUgcmVmZXJlbmNlOiAiK2Uuc2hhcGUpO3JldHVybiBufXJldHVybiBudWxsfSxhLmNyZWF0ZT1mdW5jdGlvbihlLHQsbil7aWYoZS5pc1NoYXBlKXJldHVybiBlO3ZhciByPWEucmVzb2x2ZShlLHQpO2lmKHIpe3ZhciBvPU9iamVjdC5rZXlzKGUpO3QuZG9jdW1lbnRhdGlvbnx8KG89by5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFlLm1hdGNoKC9kb2N1bWVudGF0aW9uLyl9KSkpO3ZhciBpPWZ1bmN0aW9uKCl7ci5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZSx0LG4pfTtyZXR1cm4gaS5wcm90b3R5cGU9cixuZXcgaX1lLnR5cGV8fChlLm1lbWJlcnM/ZS50eXBlPSJzdHJ1Y3R1cmUiOmUubWVtYmVyP2UudHlwZT0ibGlzdCI6ZS5rZXk/ZS50eXBlPSJtYXAiOmUudHlwZT0ic3RyaW5nIik7dmFyIHM9ZS50eXBlO2lmKGEubm9ybWFsaXplZFR5cGVzW2UudHlwZV0mJihlLnR5cGU9YS5ub3JtYWxpemVkVHlwZXNbZS50eXBlXSksYS50eXBlc1tlLnR5cGVdKXJldHVybiBuZXcgYS50eXBlc1tlLnR5cGVdKGUsdCxuKTt0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBzaGFwZSB0eXBlOiAiK3MpfSxhLnNoYXBlcz17U3RydWN0dXJlU2hhcGU6dSxMaXN0U2hhcGU6bCxNYXBTaGFwZTpwLFN0cmluZ1NoYXBlOmQsQm9vbGVhblNoYXBlOmcsQmFzZTY0U2hhcGU6Zn0sdC5leHBvcnRzPWF9LHsiLi4vdXRpbCI6NzQsIi4vY29sbGVjdGlvbiI6NDF9XSw0NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpO3IuUGFyYW1WYWxpZGF0b3I9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpeyEwIT09ZSYmdm9pZCAwIT09ZXx8KGU9e21pbjohMH0pLHRoaXMudmFsaWRhdGlvbj1lfSx2YWxpZGF0ZTpmdW5jdGlvbihlLHQsbil7aWYodGhpcy5lcnJvcnM9W10sdGhpcy52YWxpZGF0ZU1lbWJlcihlLHR8fHt9LG58fCJwYXJhbXMiKSx0aGlzLmVycm9ycy5sZW5ndGg+MSl7dmFyIG89dGhpcy5lcnJvcnMuam9pbigiXG4qICIpO3Rocm93IG89IlRoZXJlIHdlcmUgIit0aGlzLmVycm9ycy5sZW5ndGgrIiB2YWxpZGF0aW9uIGVycm9yczpcbiogIitvLHIudXRpbC5lcnJvcihuZXcgRXJyb3Iobykse2NvZGU6Ik11bHRpcGxlVmFsaWRhdGlvbkVycm9ycyIsZXJyb3JzOnRoaXMuZXJyb3JzfSl9aWYoMT09PXRoaXMuZXJyb3JzLmxlbmd0aCl0aHJvdyB0aGlzLmVycm9yc1swXTtyZXR1cm4hMH0sZmFpbDpmdW5jdGlvbihlLHQpe3RoaXMuZXJyb3JzLnB1c2goci51dGlsLmVycm9yKG5ldyBFcnJvcih0KSx7Y29kZTplfSkpfSx2YWxpZGF0ZVN0cnVjdHVyZTpmdW5jdGlvbihlLHQsbil7aWYoZS5pc0RvY3VtZW50KXJldHVybiEwO3ZhciByO3RoaXMudmFsaWRhdGVUeXBlKHQsbixbIm9iamVjdCJdLCJzdHJ1Y3R1cmUiKTtmb3IodmFyIG89MDtlLnJlcXVpcmVkJiZvPGUucmVxdWlyZWQubGVuZ3RoO28rKyl7dmFyIGk9dFtyPWUucmVxdWlyZWRbb11dO251bGw9PWkmJnRoaXMuZmFpbCgiTWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyIiwiTWlzc2luZyByZXF1aXJlZCBrZXkgJyIrcisiJyBpbiAiK24pfWZvcihyIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikpe3ZhciBzPXRbcl0sYT1lLm1lbWJlcnNbcl07aWYodm9pZCAwIT09YSl7dmFyIGM9W24scl0uam9pbigiLiIpO3RoaXMudmFsaWRhdGVNZW1iZXIoYSxzLGMpfWVsc2UgbnVsbCE9cyYmdGhpcy5mYWlsKCJVbmV4cGVjdGVkUGFyYW1ldGVyIiwiVW5leHBlY3RlZCBrZXkgJyIrcisiJyBmb3VuZCBpbiAiK24pfXJldHVybiEwfSx2YWxpZGF0ZU1lbWJlcjpmdW5jdGlvbihlLHQsbil7c3dpdGNoKGUudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiB0aGlzLnZhbGlkYXRlU3RydWN0dXJlKGUsdCxuKTtjYXNlImxpc3QiOnJldHVybiB0aGlzLnZhbGlkYXRlTGlzdChlLHQsbik7Y2FzZSJtYXAiOnJldHVybiB0aGlzLnZhbGlkYXRlTWFwKGUsdCxuKTtkZWZhdWx0OnJldHVybiB0aGlzLnZhbGlkYXRlU2NhbGFyKGUsdCxuKX19LHZhbGlkYXRlTGlzdDpmdW5jdGlvbihlLHQsbil7aWYodGhpcy52YWxpZGF0ZVR5cGUodCxuLFtBcnJheV0pKXt0aGlzLnZhbGlkYXRlUmFuZ2UoZSx0Lmxlbmd0aCxuLCJsaXN0IG1lbWJlciBjb3VudCIpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRoaXMudmFsaWRhdGVNZW1iZXIoZS5tZW1iZXIsdFtyXSxuKyJbIityKyJdIil9fSx2YWxpZGF0ZU1hcDpmdW5jdGlvbihlLHQsbil7aWYodGhpcy52YWxpZGF0ZVR5cGUodCxuLFsib2JqZWN0Il0sIm1hcCIpKXt2YXIgcj0wO2Zvcih2YXIgbyBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiYodGhpcy52YWxpZGF0ZU1lbWJlcihlLmtleSxvLG4rIltrZXk9JyIrbysiJ10iKSx0aGlzLnZhbGlkYXRlTWVtYmVyKGUudmFsdWUsdFtvXSxuKyJbJyIrbysiJ10iKSxyKyspO3RoaXMudmFsaWRhdGVSYW5nZShlLHIsbiwibWFwIG1lbWJlciBjb3VudCIpfX0sdmFsaWRhdGVTY2FsYXI6ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaChlLnR5cGUpe2Nhc2UgbnVsbDpjYXNlIHZvaWQgMDpjYXNlInN0cmluZyI6cmV0dXJuIHRoaXMudmFsaWRhdGVTdHJpbmcoZSx0LG4pO2Nhc2UiYmFzZTY0IjpjYXNlImJpbmFyeSI6cmV0dXJuIHRoaXMudmFsaWRhdGVQYXlsb2FkKHQsbik7Y2FzZSJpbnRlZ2VyIjpjYXNlImZsb2F0IjpyZXR1cm4gdGhpcy52YWxpZGF0ZU51bWJlcihlLHQsbik7Y2FzZSJib29sZWFuIjpyZXR1cm4gdGhpcy52YWxpZGF0ZVR5cGUodCxuLFsiYm9vbGVhbiJdKTtjYXNlInRpbWVzdGFtcCI6cmV0dXJuIHRoaXMudmFsaWRhdGVUeXBlKHQsbixbRGF0ZSwvXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGQrKT9aJC8sIm51bWJlciJdLCJEYXRlIG9iamVjdCwgSVNPLTg2MDEgc3RyaW5nLCBvciBhIFVOSVggdGltZXN0YW1wIik7ZGVmYXVsdDpyZXR1cm4gdGhpcy5mYWlsKCJVbmtvd25UeXBlIiwiVW5oYW5kbGVkIHR5cGUgIitlLnR5cGUrIiBmb3IgIituKX19LHZhbGlkYXRlU3RyaW5nOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bInN0cmluZyJdO2UuaXNKc29uVmFsdWUmJihyPXIuY29uY2F0KFsibnVtYmVyIiwib2JqZWN0IiwiYm9vbGVhbiJdKSksbnVsbCE9PXQmJnRoaXMudmFsaWRhdGVUeXBlKHQsbixyKSYmKHRoaXMudmFsaWRhdGVFbnVtKGUsdCxuKSx0aGlzLnZhbGlkYXRlUmFuZ2UoZSx0Lmxlbmd0aCxuLCJzdHJpbmcgbGVuZ3RoIiksdGhpcy52YWxpZGF0ZVBhdHRlcm4oZSx0LG4pLHRoaXMudmFsaWRhdGVVcmkoZSx0LG4pKX0sdmFsaWRhdGVVcmk6ZnVuY3Rpb24oZSx0LG4peyJ1cmkiPT09ZS5sb2NhdGlvbiYmMD09PXQubGVuZ3RoJiZ0aGlzLmZhaWwoIlVyaVBhcmFtZXRlckVycm9yIiwnRXhwZWN0ZWQgdXJpIHBhcmFtZXRlciB0byBoYXZlIGxlbmd0aCA+PSAxLCBidXQgZm91bmQgIicrdCsnIiBmb3IgJytuKX0sdmFsaWRhdGVQYXR0ZXJuOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnZhbGlkYXRpb24ucGF0dGVybiYmdm9pZCAwIT09ZS5wYXR0ZXJuJiYobmV3IFJlZ0V4cChlLnBhdHRlcm4pLnRlc3QodCl8fHRoaXMuZmFpbCgiUGF0dGVybk1hdGNoRXJyb3IiLCdQcm92aWRlZCB2YWx1ZSAiJyt0KyciIGRvZXMgbm90IG1hdGNoIHJlZ2V4IHBhdHRlcm4gLycrZS5wYXR0ZXJuKyIvIGZvciAiK24pKX0sdmFsaWRhdGVSYW5nZTpmdW5jdGlvbihlLHQsbixyKXt0aGlzLnZhbGlkYXRpb24ubWluJiZ2b2lkIDAhPT1lLm1pbiYmdDxlLm1pbiYmdGhpcy5mYWlsKCJNaW5SYW5nZUVycm9yIiwiRXhwZWN0ZWQgIityKyIgPj0gIitlLm1pbisiLCBidXQgZm91bmQgIit0KyIgZm9yICIrbiksdGhpcy52YWxpZGF0aW9uLm1heCYmdm9pZCAwIT09ZS5tYXgmJnQ+ZS5tYXgmJnRoaXMuZmFpbCgiTWF4UmFuZ2VFcnJvciIsIkV4cGVjdGVkICIrcisiIDw9ICIrZS5tYXgrIiwgYnV0IGZvdW5kICIrdCsiIGZvciAiK24pfSx2YWxpZGF0ZUVudW06ZnVuY3Rpb24oZSx0LG4pe3RoaXMudmFsaWRhdGlvbi5lbnVtJiZ2b2lkIDAhPT1lLmVudW0mJi0xPT09ZS5lbnVtLmluZGV4T2YodCkmJnRoaXMuZmFpbCgiRW51bUVycm9yIiwiRm91bmQgc3RyaW5nIHZhbHVlIG9mICIrdCsiLCBidXQgZXhwZWN0ZWQgIitlLmVudW0uam9pbigifCIpKyIgZm9yICIrbil9LHZhbGlkYXRlVHlwZTpmdW5jdGlvbihlLHQsbixvKXtpZihudWxsPT1lKXJldHVybiExO2Zvcih2YXIgaT0hMSxzPTA7czxuLmxlbmd0aDtzKyspe2lmKCJzdHJpbmciPT10eXBlb2YgbltzXSl7aWYodHlwZW9mIGU9PT1uW3NdKXJldHVybiEwfWVsc2UgaWYobltzXWluc3RhbmNlb2YgUmVnRXhwKXtpZigoZXx8IiIpLnRvU3RyaW5nKCkubWF0Y2gobltzXSkpcmV0dXJuITB9ZWxzZXtpZihlIGluc3RhbmNlb2YgbltzXSlyZXR1cm4hMDtpZihyLnV0aWwuaXNUeXBlKGUsbltzXSkpcmV0dXJuITA7b3x8aXx8KG49bi5zbGljZSgpKSxuW3NdPXIudXRpbC50eXBlTmFtZShuW3NdKX1pPSEwfXZhciBhPW87YXx8KGE9bi5qb2luKCIsICIpLnJlcGxhY2UoLywoW14sXSspJC8sIiwgb3IkMSIpKTt2YXIgYz1hLm1hdGNoKC9eW2FlaW91XS9pKT8ibiI6IiI7cmV0dXJuIHRoaXMuZmFpbCgiSW52YWxpZFBhcmFtZXRlclR5cGUiLCJFeHBlY3RlZCAiK3QrIiB0byBiZSBhIitjKyIgIithKSwhMX0sdmFsaWRhdGVOdW1iZXI6ZnVuY3Rpb24oZSx0LG4pe2lmKG51bGwhPXQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHI9cGFyc2VGbG9hdCh0KTtyLnRvU3RyaW5nKCk9PT10JiYodD1yKX10aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJudW1iZXIiXSkmJnRoaXMudmFsaWRhdGVSYW5nZShlLHQsbiwibnVtZXJpYyB2YWx1ZSIpfX0sdmFsaWRhdGVQYXlsb2FkOmZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSYmInN0cmluZyIhPXR5cGVvZiBlJiYoIWV8fCJudW1iZXIiIT10eXBlb2YgZS5ieXRlTGVuZ3RoKSl7aWYoci51dGlsLmlzTm9kZSgpKXt2YXIgbj1yLnV0aWwuc3RyZWFtLlN0cmVhbTtpZihyLnV0aWwuQnVmZmVyLmlzQnVmZmVyKGUpfHxlIGluc3RhbmNlb2YgbilyZXR1cm59ZWxzZSBpZih2b2lkIDAhPT10eXBlb2YgQmxvYiYmZSBpbnN0YW5jZW9mIEJsb2IpcmV0dXJuO3ZhciBvPVsiQnVmZmVyIiwiU3RyZWFtIiwiRmlsZSIsIkJsb2IiLCJBcnJheUJ1ZmZlciIsIkRhdGFWaWV3Il07aWYoZSlmb3IodmFyIGk9MDtpPG8ubGVuZ3RoO2krKyl7aWYoci51dGlsLmlzVHlwZShlLG9baV0pKXJldHVybjtpZihyLnV0aWwudHlwZU5hbWUoZS5jb25zdHJ1Y3Rvcik9PT1vW2ldKXJldHVybn10aGlzLmZhaWwoIkludmFsaWRQYXJhbWV0ZXJUeXBlIiwiRXhwZWN0ZWQgIit0KyIgdG8gYmUgYSBzdHJpbmcsIEJ1ZmZlciwgU3RyZWFtLCBCbG9iLCBvciB0eXBlZCBhcnJheSBvYmplY3QiKX19fSl9LHsiLi9jb3JlIjoxOX1dLDQ3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vY29yZSIpO3QuZXhwb3J0cz17cG9wdWxhdGVIb3N0UHJlZml4OmZ1bmN0aW9uKGUpe2lmKCFlLnNlcnZpY2UuY29uZmlnLmhvc3RQcmVmaXhFbmFibGVkKXJldHVybiBlO3ZhciB0LG4saSxzLGEsYz1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO2lmKGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGksbj10Lm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG89dC5lbmRwb2ludE9wZXJhdGlvbiYmdC5lbmRwb2ludE9wZXJhdGlvbj09PXIuc3RyaW5nLmxvd2VyRmlyc3Qobi5uYW1lKTtyZXR1cm4iTlVMTCIhPT1uLmVuZHBvaW50RGlzY292ZXJ5UmVxdWlyZWR8fCEwPT09b30oZSkpcmV0dXJuIGU7aWYoYy5lbmRwb2ludCYmYy5lbmRwb2ludC5ob3N0UHJlZml4KXt2YXIgdT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuZWFjaChuLm1lbWJlcnMsKGZ1bmN0aW9uKG4sbyl7aWYoITA9PT1vLmhvc3RMYWJlbCl7aWYoInN0cmluZyIhPXR5cGVvZiB0W25dfHwiIj09PXRbbl0pdGhyb3cgci5lcnJvcihuZXcgRXJyb3Ise21lc3NhZ2U6IlBhcmFtZXRlciAiK24rIiBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLiIsY29kZToiSW52YWxpZFBhcmFtZXRlciJ9KTt2YXIgaT1uZXcgUmVnRXhwKCJcXHsiK24rIlxcfSIsImciKTtlPWUucmVwbGFjZShpLHRbbl0pfX0pKSxlfShjLmVuZHBvaW50Lmhvc3RQcmVmaXgsZS5wYXJhbXMsYy5pbnB1dCk7cz1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50LGE9dSxzLmhvc3QmJihzLmhvc3Q9YStzLmhvc3QpLHMuaG9zdG5hbWUmJihzLmhvc3RuYW1lPWErcy5ob3N0bmFtZSksdD1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLG49dC5zcGxpdCgiLiIpLGk9L15bYS16QS1aMC05XXsxfSR8XlthLXpBLVowLTldW2EtekEtWjAtOVwtXSpbYS16QS1aMC05XSQvLHIuYXJyYXlFYWNoKG4sKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aHx8ZS5sZW5ndGg8MXx8ZS5sZW5ndGg+NjMpdGhyb3cgci5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlZhbGlkYXRpb25FcnJvciIsbWVzc2FnZToiSG9zdG5hbWUgbGFiZWwgbGVuZ3RoIHNob3VsZCBiZSBiZXR3ZWVuIDEgdG8gNjMgY2hhcmFjdGVycywgaW5jbHVzaXZlLiJ9KTtpZighaS50ZXN0KGUpKXRocm93IG8udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlZhbGlkYXRpb25FcnJvciIsbWVzc2FnZTplKyIgaXMgbm90IGhvc3RuYW1lIGNvbXBhdGlibGUuIn0pfSkpfXJldHVybiBlfX19LHsiLi4vY29yZSI6MTksIi4uL3V0aWwiOjc0fV0sNDg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuLi9qc29uL2J1aWxkZXIiKSxpPWUoIi4uL2pzb24vcGFyc2VyIikscz1lKCIuL2hlbHBlcnMiKS5wb3B1bGF0ZUhvc3RQcmVmaXg7dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdCxuPWUuc2VydmljZS5hcGkscj1uLnRhcmdldFByZWZpeCsiLiIrbi5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5uYW1lLGk9bi5qc29uVmVyc2lvbnx8IjEuMCIsYT1uLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmlucHV0LGM9bmV3IG87MT09PWkmJihpPSIxLjAiKSxuLmF3c1F1ZXJ5Q29tcGF0aWJsZSYmKHQucGFyYW1zfHwodC5wYXJhbXM9e30pLE9iamVjdC5hc3NpZ24odC5wYXJhbXMsZS5wYXJhbXMpKSx0LmJvZHk9Yy5idWlsZChlLnBhcmFtc3x8e30sYSksdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24veC1hbXotanNvbi0iK2ksdC5oZWFkZXJzWyJYLUFtei1UYXJnZXQiXT1yLHMoZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXt2YXIgdD17fSxuPWUuaHR0cFJlc3BvbnNlO2lmKHQuY29kZT1uLmhlYWRlcnNbIngtYW16bi1lcnJvcnR5cGUiXXx8IlVua25vd25FcnJvciIsInN0cmluZyI9PXR5cGVvZiB0LmNvZGUmJih0LmNvZGU9dC5jb2RlLnNwbGl0KCI6IilbMF0pLG4uYm9keS5sZW5ndGg+MCl0cnl7dmFyIG89SlNPTi5wYXJzZShuLmJvZHkudG9TdHJpbmcoKSksaT1vLl9fdHlwZXx8by5jb2RlfHxvLkNvZGU7aSYmKHQuY29kZT1pLnNwbGl0KCIjIikucG9wKCkpLCJSZXF1ZXN0RW50aXR5VG9vTGFyZ2UiPT09dC5jb2RlP3QubWVzc2FnZT0iUmVxdWVzdCBib2R5IG11c3QgYmUgbGVzcyB0aGFuIDEgTUIiOnQubWVzc2FnZT1vLm1lc3NhZ2V8fG8uTWVzc2FnZXx8bnVsbH1jYXRjaChvKXt0LnN0YXR1c0NvZGU9bi5zdGF0dXNDb2RlLHQubWVzc2FnZT1uLnN0YXR1c01lc3NhZ2V9ZWxzZSB0LnN0YXR1c0NvZGU9bi5zdGF0dXNDb2RlLHQubWVzc2FnZT1uLnN0YXR1c0NvZGUudG9TdHJpbmcoKTtlLmVycm9yPXIuZXJyb3IobmV3IEVycm9yLHQpfSxleHRyYWN0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCl8fCJ7fSI7aWYoITE9PT1lLnJlcXVlc3Quc2VydmljZS5jb25maWcuY29udmVydFJlc3BvbnNlVHlwZXMpZS5kYXRhPUpTT04ucGFyc2UodCk7ZWxzZXt2YXIgbj1lLnJlcXVlc3Quc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLnJlcXVlc3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9LHI9bmV3IGk7ZS5kYXRhPXIucGFyc2UodCxuKX19fX0seyIuLi9qc29uL2J1aWxkZXIiOjM3LCIuLi9qc29uL3BhcnNlciI6MzgsIi4uL3V0aWwiOjc0LCIuL2hlbHBlcnMiOjQ3fV0sNDk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi91dGlsIiksaT1lKCIuLi9xdWVyeS9xdWVyeV9wYXJhbV9zZXJpYWxpemVyIikscz1lKCIuLi9tb2RlbC9zaGFwZSIpLGE9ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj1lLmh0dHBSZXF1ZXN0O24uaGVhZGVyc1siQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD11dGYtOCIsbi5wYXJhbXM9e1ZlcnNpb246ZS5zZXJ2aWNlLmFwaS5hcGlWZXJzaW9uLEFjdGlvbjp0Lm5hbWV9LChuZXcgaSkuc2VyaWFsaXplKGUucGFyYW1zLHQuaW5wdXQsKGZ1bmN0aW9uKGUsdCl7bi5wYXJhbXNbZV09dH0pKSxuLmJvZHk9by5xdWVyeVBhcmFtc1RvU3RyaW5nKG4ucGFyYW1zKSxhKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCk7aWYobi5tYXRjaCgiPFVua25vd25PcGVyYXRpb25FeGNlcHRpb24iKSl0PXtDb2RlOiJVbmtub3duT3BlcmF0aW9uIixNZXNzYWdlOiJVbmtub3duIG9wZXJhdGlvbiAiK2UucmVxdWVzdC5vcGVyYXRpb259O2Vsc2UgdHJ5e3Q9KG5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKG4pfWNhdGNoKG4pe3Q9e0NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxNZXNzYWdlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c01lc3NhZ2V9fXQucmVxdWVzdElkJiYhZS5yZXF1ZXN0SWQmJihlLnJlcXVlc3RJZD10LnJlcXVlc3RJZCksdC5FcnJvcnMmJih0PXQuRXJyb3JzKSx0LkVycm9yJiYodD10LkVycm9yKSx0LkNvZGU/ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTp0LkNvZGUsbWVzc2FnZTp0Lk1lc3NhZ2V9KTplLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsbWVzc2FnZTpudWxsfSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0fHx7fSxpPW47aWYoaS5yZXN1bHRXcmFwcGVyKXt2YXIgYT1zLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0pO2EubWVtYmVyc1tpLnJlc3VsdFdyYXBwZXJdPW4sYS5tZW1iZXJOYW1lcz1baS5yZXN1bHRXcmFwcGVyXSxvLnByb3BlcnR5KG4sIm5hbWUiLG4ucmVzdWx0V3JhcHBlciksbj1hfXZhciBjPW5ldyByLlhNTC5QYXJzZXI7aWYobiYmbi5tZW1iZXJzJiYhbi5tZW1iZXJzLl9YQU1aUmVxdWVzdElkKXt2YXIgdT1zLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0se2FwaTp7cHJvdG9jb2w6InF1ZXJ5In19LCJyZXF1ZXN0SWQiKTtuLm1lbWJlcnMuX1hBTVpSZXF1ZXN0SWQ9dX12YXIgbD1jLnBhcnNlKGUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSxuKTtlLnJlcXVlc3RJZD1sLl9YQU1aUmVxdWVzdElkfHxsLnJlcXVlc3RJZCxsLl9YQU1aUmVxdWVzdElkJiZkZWxldGUgbC5fWEFNWlJlcXVlc3RJZCxpLnJlc3VsdFdyYXBwZXImJmxbaS5yZXN1bHRXcmFwcGVyXSYmKG8udXBkYXRlKGwsbFtpLnJlc3VsdFdyYXBwZXJdKSxkZWxldGUgbFtpLnJlc3VsdFdyYXBwZXJdKSxlLmRhdGE9bH19fSx7Ii4uL2NvcmUiOjE5LCIuLi9tb2RlbC9zaGFwZSI6NDUsIi4uL3F1ZXJ5L3F1ZXJ5X3BhcmFtX3NlcmlhbGl6ZXIiOjUzLCIuLi91dGlsIjo3NCwiLi9oZWxwZXJzIjo0N31dLDUwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O2Z1bmN0aW9uIGkoZSx0LG4sbyl7dmFyIGk9W2UsdF0uam9pbigiLyIpO2k9aS5yZXBsYWNlKC9cLysvZywiLyIpO3ZhciBzPXt9LGE9ITE7aWYoci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24oZSx0KXt2YXIgbj1vW2VdO2lmKG51bGwhPW4paWYoInVyaSI9PT10LmxvY2F0aW9uKXt2YXIgYz1uZXcgUmVnRXhwKCJcXHsiK3QubmFtZSsiKFxcKyk/XFx9Iik7aT1pLnJlcGxhY2UoYywoZnVuY3Rpb24oZSx0KXtyZXR1cm4odD9yLnVyaUVzY2FwZVBhdGg6ci51cmlFc2NhcGUpKFN0cmluZyhuKSl9KSl9ZWxzZSJxdWVyeXN0cmluZyI9PT10LmxvY2F0aW9uJiYoYT0hMCwibGlzdCI9PT10LnR5cGU/c1t0Lm5hbWVdPW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gci51cmlFc2NhcGUodC5tZW1iZXIudG9XaXJlRm9ybWF0KGUpLnRvU3RyaW5nKCkpfSkpOiJtYXAiPT09dC50eXBlP3IuZWFjaChuLChmdW5jdGlvbihlLHQpe0FycmF5LmlzQXJyYXkodCk/c1tlXT10Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHIudXJpRXNjYXBlKFN0cmluZyhlKSl9KSk6c1tlXT1yLnVyaUVzY2FwZShTdHJpbmcodCkpfSkpOnNbdC5uYW1lXT1yLnVyaUVzY2FwZSh0LnRvV2lyZUZvcm1hdChuKS50b1N0cmluZygpKSl9KSksYSl7aSs9aS5pbmRleE9mKCI/Iik+PTA/IiYiOiI/Ijt2YXIgYz1bXTtyLmFycmF5RWFjaChPYmplY3Qua2V5cyhzKS5zb3J0KCksKGZ1bmN0aW9uKGUpe0FycmF5LmlzQXJyYXkoc1tlXSl8fChzW2VdPVtzW2VdXSk7Zm9yKHZhciB0PTA7dDxzW2VdLmxlbmd0aDt0KyspYy5wdXNoKHIudXJpRXNjYXBlKFN0cmluZyhlKSkrIj0iK3NbZV1bdF0pfSkpLGkrPWMuam9pbigiJiIpfXJldHVybiBpfXQuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0Lm1ldGhvZD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmh0dHBNZXRob2R9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj10LmlucHV0LHI9aShlLmh0dHBSZXF1ZXN0LmVuZHBvaW50LnBhdGgsdC5odHRwUGF0aCxuLGUucGFyYW1zKTtlLmh0dHBSZXF1ZXN0LnBhdGg9cn0oZSksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtyLmVhY2godC5pbnB1dC5tZW1iZXJzLChmdW5jdGlvbih0LG4pe3ZhciBvPWUucGFyYW1zW3RdO251bGwhPW8mJigiaGVhZGVycyI9PT1uLmxvY2F0aW9uJiYibWFwIj09PW4udHlwZT9yLmVhY2gobywoZnVuY3Rpb24odCxyKXtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbbi5uYW1lK3RdPXJ9KSk6ImhlYWRlciI9PT1uLmxvY2F0aW9uJiYobz1uLnRvV2lyZUZvcm1hdChvKS50b1N0cmluZygpLG4uaXNKc29uVmFsdWUmJihvPXIuYmFzZTY0LmVuY29kZShvKSksZS5odHRwUmVxdWVzdC5oZWFkZXJzW24ubmFtZV09bykpfSkpfShlKSxvKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oKXt9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXt9LG89ZS5odHRwUmVzcG9uc2UsaT10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbdC5vcGVyYXRpb25dLm91dHB1dCxzPXt9O3IuZWFjaChvLmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7c1tlLnRvTG93ZXJDYXNlKCldPXR9KSksci5lYWNoKGkubWVtYmVycywoZnVuY3Rpb24oZSx0KXt2YXIgaT0odC5uYW1lfHxlKS50b0xvd2VyQ2FzZSgpO2lmKCJoZWFkZXJzIj09PXQubG9jYXRpb24mJiJtYXAiPT09dC50eXBlKXtuW2VdPXt9O3ZhciBhPXQuaXNMb2NhdGlvbk5hbWU/dC5uYW1lOiIiLGM9bmV3IFJlZ0V4cCgiXiIrYSsiKC4rKSIsImkiKTtyLmVhY2goby5oZWFkZXJzLChmdW5jdGlvbih0LHIpe3ZhciBvPXQubWF0Y2goYyk7bnVsbCE9PW8mJihuW2VdW29bMV1dPXIpfSkpfWVsc2UgaWYoImhlYWRlciI9PT10LmxvY2F0aW9uKXtpZih2b2lkIDAhPT1zW2ldKXt2YXIgdT10LmlzSnNvblZhbHVlP3IuYmFzZTY0LmRlY29kZShzW2ldKTpzW2ldO25bZV09dC50b1R5cGUodSl9fWVsc2Uic3RhdHVzQ29kZSI9PT10LmxvY2F0aW9uJiYobltlXT1wYXJzZUludChvLnN0YXR1c0NvZGUsMTApKX0pKSxlLmRhdGE9bn0sZ2VuZXJhdGVVUkk6aX19LHsiLi4vdXRpbCI6NzQsIi4vaGVscGVycyI6NDd9XSw1MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4vcmVzdCIpLGk9ZSgiLi9qc29uIikscz1lKCIuLi9qc29uL2J1aWxkZXIiKSxhPWUoIi4uL2pzb24vcGFyc2VyIiksYz1bIkdFVCIsIkhFQUQiLCJERUxFVEUiXTtmdW5jdGlvbiB1KGUsdCl7aWYoIWUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pe3ZhciBuPXQ/ImJpbmFyeS9vY3RldC1zdHJlYW0iOiJhcHBsaWNhdGlvbi9qc29uIjtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPW59fXQuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe28uYnVpbGRSZXF1ZXN0KGUpLGMuaW5kZXhPZihlLmh0dHBSZXF1ZXN0Lm1ldGhvZCk8MCYmZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHMsbj1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmlucHV0O2lmKG4ucGF5bG9hZCl7dmFyIHIsbz1uLm1lbWJlcnNbbi5wYXlsb2FkXTtyPWUucGFyYW1zW24ucGF5bG9hZF0sInN0cnVjdHVyZSI9PT1vLnR5cGU/KGUuaHR0cFJlcXVlc3QuYm9keT10LmJ1aWxkKHJ8fHt9LG8pLHUoZSkpOnZvaWQgMCE9PXImJihlLmh0dHBSZXF1ZXN0LmJvZHk9ciwoImJpbmFyeSI9PT1vLnR5cGV8fG8uaXNTdHJlYW1pbmcpJiZ1KGUsITApKX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT10LmJ1aWxkKGUucGFyYW1zLG4pLHUoZSl9KGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7aS5leHRyYWN0RXJyb3IoZSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe28uZXh0cmFjdERhdGEoZSk7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXSxzPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0fHx7fTtpZihuLmhhc0V2ZW50T3V0cHV0LHMucGF5bG9hZCl7dmFyIGM9cy5tZW1iZXJzW3MucGF5bG9hZF0sdT1lLmh0dHBSZXNwb25zZS5ib2R5O2lmKGMuaXNFdmVudFN0cmVhbSlsPW5ldyBhLGUuZGF0YVtwYXlsb2FkXT1yLmNyZWF0ZUV2ZW50U3RyZWFtKDI9PT1BV1MuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9lLmh0dHBSZXNwb25zZS5zdHJlYW06dSxsLGMpO2Vsc2UgaWYoInN0cnVjdHVyZSI9PT1jLnR5cGV8fCJsaXN0Ij09PWMudHlwZSl7dmFyIGw9bmV3IGE7ZS5kYXRhW3MucGF5bG9hZF09bC5wYXJzZSh1LGMpfWVsc2UiYmluYXJ5Ij09PWMudHlwZXx8Yy5pc1N0cmVhbWluZz9lLmRhdGFbcy5wYXlsb2FkXT11OmUuZGF0YVtzLnBheWxvYWRdPWMudG9UeXBlKHUpfWVsc2V7dmFyIHA9ZS5kYXRhO2kuZXh0cmFjdERhdGEoZSksZS5kYXRhPXIubWVyZ2UocCxlLmRhdGEpfX0sdW5zZXRDb250ZW50TGVuZ3RoOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PXIuZ2V0UmVxdWVzdFBheWxvYWRTaGFwZShlKSYmYy5pbmRleE9mKGUuaHR0cFJlcXVlc3QubWV0aG9kKT49MCYmZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXX19fSx7Ii4uL2pzb24vYnVpbGRlciI6MzcsIi4uL2pzb24vcGFyc2VyIjozOCwiLi4vdXRpbCI6NzQsIi4vanNvbiI6NDgsIi4vcmVzdCI6NTB9XSw1MjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL3V0aWwiKSxpPWUoIi4vcmVzdCIpO3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe2kuYnVpbGRSZXF1ZXN0KGUpLFsiR0VUIiwiSEVBRCJdLmluZGV4T2YoZS5odHRwUmVxdWVzdC5tZXRob2QpPDAmJmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQsbj1uZXcgci5YTUwuQnVpbGRlcixpPWUucGFyYW1zLHM9dC5wYXlsb2FkO2lmKHMpe3ZhciBhPXQubWVtYmVyc1tzXTtpZih2b2lkIDA9PT0oaT1pW3NdKSlyZXR1cm47aWYoInN0cnVjdHVyZSI9PT1hLnR5cGUpe3ZhciBjPWEubmFtZTtlLmh0dHBSZXF1ZXN0LmJvZHk9bi50b1hNTChpLGEsYywhMCl9ZWxzZSBlLmh0dHBSZXF1ZXN0LmJvZHk9aX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT1uLnRvWE1MKGksdCx0Lm5hbWV8fHQuc2hhcGV8fG8uc3RyaW5nLnVwcGVyRmlyc3QoZS5vcGVyYXRpb24pKyJSZXF1ZXN0Iil9KGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ7aS5leHRyYWN0RXJyb3IoZSk7dHJ5e3Q9KG5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKGUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSl9Y2F0Y2gobil7dD17Q29kZTplLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLE1lc3NhZ2U6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZX19dC5FcnJvcnMmJih0PXQuRXJyb3JzKSx0LkVycm9yJiYodD10LkVycm9yKSx0LkNvZGU/ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTp0LkNvZGUsbWVzc2FnZTp0Lk1lc3NhZ2V9KTplLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsbWVzc2FnZTpudWxsfSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0O2kuZXh0cmFjdERhdGEoZSk7dmFyIG49ZS5yZXF1ZXN0LHM9ZS5odHRwUmVzcG9uc2UuYm9keSxhPW4uc2VydmljZS5hcGkub3BlcmF0aW9uc1tuLm9wZXJhdGlvbl0sYz1hLm91dHB1dCx1PShhLmhhc0V2ZW50T3V0cHV0LGMucGF5bG9hZCk7aWYodSl7dmFyIGw9Yy5tZW1iZXJzW3VdO2wuaXNFdmVudFN0cmVhbT8odD1uZXcgci5YTUwuUGFyc2VyLGUuZGF0YVt1XT1vLmNyZWF0ZUV2ZW50U3RyZWFtKDI9PT1yLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/ZS5odHRwUmVzcG9uc2Uuc3RyZWFtOmUuaHR0cFJlc3BvbnNlLmJvZHksdCxsKSk6InN0cnVjdHVyZSI9PT1sLnR5cGU/KHQ9bmV3IHIuWE1MLlBhcnNlcixlLmRhdGFbdV09dC5wYXJzZShzLnRvU3RyaW5nKCksbCkpOiJiaW5hcnkiPT09bC50eXBlfHxsLmlzU3RyZWFtaW5nP2UuZGF0YVt1XT1zOmUuZGF0YVt1XT1sLnRvVHlwZShzKX1lbHNlIGlmKHMubGVuZ3RoPjApe3ZhciBwPSh0PW5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKHMudG9TdHJpbmcoKSxjKTtvLnVwZGF0ZShlLmRhdGEscCl9fX19LHsiLi4vY29yZSI6MTksIi4uL3V0aWwiOjc0LCIuL3Jlc3QiOjUwfV0sNTM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIik7ZnVuY3Rpb24gbygpe31mdW5jdGlvbiBpKGUpe3JldHVybiBlLmlzUXVlcnlOYW1lfHwiZWMyIiE9PWUuYXBpLnByb3RvY29sP2UubmFtZTplLm5hbWVbMF0udG9VcHBlckNhc2UoKStlLm5hbWUuc3Vic3RyKDEpfWZ1bmN0aW9uIHMoZSx0LG4sbyl7ci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24obixyKXt2YXIgcz10W25dO2lmKG51bGwhPXMpe3ZhciBjPWkocik7YShjPWU/ZSsiLiIrYzpjLHMscixvKX19KSl9ZnVuY3Rpb24gYShlLHQsbixvKXtudWxsIT10JiYoInN0cnVjdHVyZSI9PT1uLnR5cGU/cyhlLHQsbixvKToibGlzdCI9PT1uLnR5cGU/ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHM9bi5tZW1iZXJ8fHt9OzAhPT10Lmxlbmd0aD9yLmFycmF5RWFjaCh0LChmdW5jdGlvbih0LHIpe3ZhciBjPSIuIisocisxKTtpZigiZWMyIj09PW4uYXBpLnByb3RvY29sKWMrPSIiO2Vsc2UgaWYobi5mbGF0dGVuZWQpe2lmKHMubmFtZSl7dmFyIHU9ZS5zcGxpdCgiLiIpO3UucG9wKCksdS5wdXNoKGkocykpLGU9dS5qb2luKCIuIil9fWVsc2UgYz0iLiIrKHMubmFtZT9zLm5hbWU6Im1lbWJlciIpK2M7YShlK2MsdCxzLG8pfSkpOm8uY2FsbCh0aGlzLGUsbnVsbCl9KGUsdCxuLG8pOiJtYXAiPT09bi50eXBlP2Z1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPTE7ci5lYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIHM9KG4uZmxhdHRlbmVkPyIuIjoiLmVudHJ5LiIpK2krKysiLiIsYz1zKyhuLmtleS5uYW1lfHwia2V5IiksdT1zKyhuLnZhbHVlLm5hbWV8fCJ2YWx1ZSIpO2EoZStjLHQsbi5rZXksbyksYShlK3UscixuLnZhbHVlLG8pfSkpfShlLHQsbixvKTpvKGUsbi50b1dpcmVGb3JtYXQodCkudG9TdHJpbmcoKSkpfW8ucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbihlLHQsbil7cygiIixlLHQsbil9LHQuZXhwb3J0cz1vfSx7Ii4uL3V0aWwiOjc0fV0sNTQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e25vdzpmdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgcGVyZm9ybWFuY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3coKX19fSx7fV0sNTU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2lzRmlwc1JlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlLnN0YXJ0c1dpdGgoImZpcHMtIil8fGUuZW5kc1dpdGgoIi1maXBzIikpfSxpc0dsb2JhbFJlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJlsiYXdzLWdsb2JhbCIsImF3cy11cy1nb3YtZ2xvYmFsIl0uaW5jbHVkZXMoZSl9LGdldFJlYWxSZWdpb246ZnVuY3Rpb24oZSl7cmV0dXJuWyJmaXBzLWF3cy1nbG9iYWwiLCJhd3MtZmlwcyIsImF3cy1nbG9iYWwiXS5pbmNsdWRlcyhlKT8idXMtZWFzdC0xIjpbImZpcHMtYXdzLXVzLWdvdi1nbG9iYWwiLCJhd3MtdXMtZ292LWdsb2JhbCJdLmluY2x1ZGVzKGUpPyJ1cy1nb3Ytd2VzdC0xIjplLnJlcGxhY2UoL2ZpcHMtKGRrci18cHJvZC0pP3wtZmlwcy8sIiIpfX19LHt9XSw1NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vdXRpbCIpLG89ZSgiLi9yZWdpb25fY29uZmlnX2RhdGEuanNvbiIpO2Z1bmN0aW9uIGkoZSx0KXtyLmVhY2godCwoZnVuY3Rpb24odCxuKXsiZ2xvYmFsRW5kcG9pbnQiIT09dCYmKHZvaWQgMCE9PWUuY29uZmlnW3RdJiZudWxsIT09ZS5jb25maWdbdF18fChlLmNvbmZpZ1t0XT1uKSl9KSl9dC5leHBvcnRzPXtjb25maWd1cmVFbmRwb2ludDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcucmVnaW9uLG49ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7dmFyIHQ9ZS5zcGxpdCgiLSIpO3JldHVybiB0Lmxlbmd0aDwzP251bGw6dC5zbGljZSgwLHQubGVuZ3RoLTIpLmpvaW4oIi0iKSsiLSoifSh0KSxyPWUuYXBpLmVuZHBvaW50UHJlZml4O3JldHVybltbdCxyXSxbbixyXSxbdCwiKiJdLFtuLCIqIl0sWyIqIixyXSxbIioiLCIqIl1dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0mJmVbMV0/ZS5qb2luKCIvIik6bnVsbH0pKX0oZSksbj1lLmNvbmZpZy51c2VGaXBzRW5kcG9pbnQscj1lLmNvbmZpZy51c2VEdWFsc3RhY2tFbmRwb2ludCxzPTA7czx0Lmxlbmd0aDtzKyspe3ZhciBhPXRbc107aWYoYSl7dmFyIGM9bj9yP28uZHVhbHN0YWNrRmlwc1J1bGVzOm8uZmlwc1J1bGVzOnI/by5kdWFsc3RhY2tSdWxlczpvLnJ1bGVzO2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjLGEpKXt2YXIgdT1jW2FdOyJzdHJpbmciPT10eXBlb2YgdSYmKHU9by5wYXR0ZXJuc1t1XSksZS5pc0dsb2JhbEVuZHBvaW50PSEhdS5nbG9iYWxFbmRwb2ludCx1LnNpZ25pbmdSZWdpb24mJihlLnNpZ25pbmdSZWdpb249dS5zaWduaW5nUmVnaW9uKSx1LnNpZ25hdHVyZVZlcnNpb258fCh1LnNpZ25hdHVyZVZlcnNpb249InY0Iik7dmFyIGw9ImJlYXJlciI9PT0oZS5hcGkmJmUuYXBpLnNpZ25hdHVyZVZlcnNpb24pO3JldHVybiB2b2lkIGkoZSxPYmplY3QuYXNzaWduKHt9LHUse3NpZ25hdHVyZVZlcnNpb246bD8iYmVhcmVyIjp1LnNpZ25hdHVyZVZlcnNpb259KSl9fX19LGdldEVuZHBvaW50U3VmZml4OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD17Il4odXN8ZXV8YXB8c2F8Y2F8bWUpXFwtXFx3K1xcLVxcZCskIjoiYW1hem9uYXdzLmNvbSIsIl5jblxcLVxcdytcXC1cXGQrJCI6ImFtYXpvbmF3cy5jb20uY24iLCJedXNcXC1nb3ZcXC1cXHcrXFwtXFxkKyQiOiJhbWF6b25hd3MuY29tIiwiXnVzXFwtaXNvXFwtXFx3K1xcLVxcZCskIjoiYzJzLmljLmdvdiIsIl51c1xcLWlzb2JcXC1cXHcrXFwtXFxkKyQiOiJzYzJzLnNnb3YuZ292In0sbj1PYmplY3Qua2V5cyh0KSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPVJlZ0V4cChuW3JdKSxpPXRbbltyXV07aWYoby50ZXN0KGUpKXJldHVybiBpfXJldHVybiJhbWF6b25hd3MuY29tIn19fSx7Ii4vcmVnaW9uX2NvbmZpZ19kYXRhLmpzb24iOjU3LCIuL3V0aWwiOjc0fV0sNTc6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3J1bGVzOnsiKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImNuLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LCJ1cy1pc28tKi8qIjoidXNJc28iLCJ1cy1pc29iLSovKiI6InVzSXNvYiIsIiovYnVkZ2V0cyI6Imdsb2JhbFNTTCIsIiovY2xvdWRmcm9udCI6Imdsb2JhbFNTTCIsIiovc3RzIjoiZ2xvYmFsU1NMIiwiKi9pbXBvcnRleHBvcnQiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InYyIixnbG9iYWxFbmRwb2ludDohMH0sIiovcm91dGU1MyI6Imdsb2JhbFNTTCIsImNuLSovcm91dGU1MyI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbS5jbiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoiY24tbm9ydGh3ZXN0LTEifSwidXMtZ292LSovcm91dGU1MyI6Imdsb2JhbEdvdkNsb3VkIiwidXMtaXNvLSovcm91dGU1MyI6e2VuZHBvaW50OiJ7c2VydmljZX0uYzJzLmljLmdvdiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtaXNvLWVhc3QtMSJ9LCJ1cy1pc29iLSovcm91dGU1MyI6e2VuZHBvaW50OiJ7c2VydmljZX0uc2Mycy5zZ292LmdvdiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtaXNvYi1lYXN0LTEifSwiKi93YWYiOiJnbG9iYWxTU0wiLCIqL2lhbSI6Imdsb2JhbFNTTCIsImNuLSovaWFtIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246ImNuLW5vcnRoLTEifSwidXMtZ292LSovaWFtIjoiZ2xvYmFsR292Q2xvdWQiLCJ1cy1nb3YtKi9zdHMiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwidXMtZ292LXdlc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwidXMtd2VzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJ1cy13ZXN0LTIvczMiOiJzM3NpZ25hdHVyZSIsImV1LXdlc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwiYXAtc291dGhlYXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsImFwLXNvdXRoZWFzdC0yL3MzIjoiczNzaWduYXR1cmUiLCJhcC1ub3J0aGVhc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwic2EtZWFzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJ1cy1lYXN0LTEvczMiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InMzIn0sInVzLWVhc3QtMS9zZGIiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InYyIn0sIiovc2RiIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJ2MiJ9LCIqL3Jlc291cmNlLWV4cGxvcmVyLTIiOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2tlbmRyYS1yYW5raW5nIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9pbnRlcm5ldG1vbml0b3IiOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2NvZGVjYXRhbHlzdCI6Imdsb2JhbER1YWxzdGFja0J5RGVmYXVsdCJ9LGZpcHNSdWxlczp7IiovKiI6ImZpcHNTdGFuZGFyZCIsInVzLWdvdi0qLyoiOiJmaXBzU3RhbmRhcmQiLCJ1cy1pc28tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmMycy5pYy5nb3YifSwidXMtaXNvLSovZG1zIjoidXNJc28iLCJ1cy1pc29iLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5zYzJzLnNnb3YuZ292In0sInVzLWlzb2ItKi9kbXMiOiJ1c0lzb2IiLCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LCIqL2FwaS5lY3IiOiJmaXBzLmFwaS5lY3IiLCIqL2FwaS5zYWdlbWFrZXIiOiJmaXBzLmFwaS5zYWdlbWFrZXIiLCIqL2JhdGNoIjoiZmlwc0RvdFByZWZpeCIsIiovZWtzIjoiZmlwc0RvdFByZWZpeCIsIiovbW9kZWxzLmxleCI6ImZpcHMubW9kZWxzLmxleCIsIiovcnVudGltZS5sZXgiOiJmaXBzLnJ1bnRpbWUubGV4IiwiKi9ydW50aW1lLnNhZ2VtYWtlciI6e2VuZHBvaW50OiJydW50aW1lLWZpcHMuc2FnZW1ha2VyLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiKi9pYW0iOiJmaXBzV2l0aG91dFJlZ2lvbiIsIiovcm91dGU1MyI6ImZpcHNXaXRob3V0UmVnaW9uIiwiKi90cmFuc2NyaWJlIjoiZmlwc0RvdFByZWZpeCIsIiovd2FmIjoiZmlwc1dpdGhvdXRSZWdpb24iLCJ1cy1nb3YtKi90cmFuc2NyaWJlIjoiZmlwc0RvdFByZWZpeCIsInVzLWdvdi0qL2FwaS5lY3IiOiJmaXBzLmFwaS5lY3IiLCJ1cy1nb3YtKi9hcGkuc2FnZW1ha2VyIjoiZmlwcy5hcGkuc2FnZW1ha2VyIiwidXMtZ292LSovbW9kZWxzLmxleCI6ImZpcHMubW9kZWxzLmxleCIsInVzLWdvdi0qL3J1bnRpbWUubGV4IjoiZmlwcy5ydW50aW1lLmxleCIsInVzLWdvdi0qL2FjbS1wY2EiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovYmF0Y2giOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovY2xvdWRmb3JtYXRpb24iOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovY29uZmlnIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2VrcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9lbGFzdGljbWFwcmVkdWNlIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2lkZW50aXR5c3RvcmUiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZHluYW1vZGIiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZWxhc3RpY2xvYWRiYWxhbmNpbmciOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZ3VhcmRkdXR5IjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL21vbml0b3JpbmciOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovcmVzb3VyY2UtZ3JvdXBzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3J1bnRpbWUuc2FnZW1ha2VyIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3NlcnZpY2VjYXRhbG9nLWFwcHJlZ2lzdHJ5IjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3NlcnZpY2VxdW90YXMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc3NtIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3N0cyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zdXBwb3J0IjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi13ZXN0LTEvc3RhdGVzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWlzby1lYXN0LTEvZWxhc3RpY2ZpbGVzeXN0ZW0iOntlbmRwb2ludDoiZWxhc3RpY2ZpbGVzeXN0ZW0tZmlwcy57cmVnaW9ufS5jMnMuaWMuZ292In0sInVzLWdvdi13ZXN0LTEvb3JnYW5pemF0aW9ucyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3Ytd2VzdC0xL3JvdXRlNTMiOntlbmRwb2ludDoicm91dGU1My51cy1nb3YuYW1hem9uYXdzLmNvbSJ9LCIqL3Jlc291cmNlLWV4cGxvcmVyLTIiOiJmaXBzRHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9rZW5kcmEtcmFua2luZyI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovaW50ZXJuZXRtb25pdG9yIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9jb2RlY2F0YWx5c3QiOiJmaXBzR2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0In0sZHVhbHN0YWNrUnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFwaS5hd3MifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hcGkuYW1hem9ud2Vic2VydmljZXMuY29tLmNuIn0sIiovczMiOiJkdWFsc3RhY2tMZWdhY3kiLCJjbi0qL3MzIjoiZHVhbHN0YWNrTGVnYWN5Q24iLCIqL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tMZWdhY3kiLCJjbi0qL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tMZWdhY3lDbiIsImFwLXNvdXRoLTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwiZXUtd2VzdC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInNhLWVhc3QtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJ1cy1lYXN0LTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwidXMtZWFzdC0yL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInVzLXdlc3QtMi9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIifSxkdWFsc3RhY2tGaXBzUnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYXBpLmF3cyJ9LCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYXBpLmFtYXpvbndlYnNlcnZpY2VzLmNvbS5jbiJ9LCIqL3MzIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeSIsImNuLSovczMiOiJkdWFsc3RhY2tGaXBzTGVnYWN5Q24iLCIqL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tGaXBzTGVnYWN5IiwiY24tKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeUNuIn0scGF0dGVybnM6e2dsb2JhbFNTTDp7ZW5kcG9pbnQ6Imh0dHBzOi8ve3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWVhc3QtMSJ9LGdsb2JhbEdvdkNsb3VkOntlbmRwb2ludDoie3NlcnZpY2V9LnVzLWdvdi5hbWF6b25hd3MuY29tIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1nb3Ytd2VzdC0xIn0sczNzaWduYXR1cmU6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoiczMifSx1c0lzbzp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5jMnMuaWMuZ292In0sdXNJc29iOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LnNjMnMuc2dvdi5nb3YifSxmaXBzU3RhbmRhcmQ6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZmlwc0RvdFByZWZpeDp7ZW5kcG9pbnQ6ImZpcHMue3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxmaXBzV2l0aG91dFJlZ2lvbjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmFtYXpvbmF3cy5jb20ifSwiZmlwcy5hcGkuZWNyIjp7ZW5kcG9pbnQ6ImVjci1maXBzLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiZmlwcy5hcGkuc2FnZW1ha2VyIjp7ZW5kcG9pbnQ6ImFwaS1maXBzLnNhZ2VtYWtlci57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImZpcHMubW9kZWxzLmxleCI6e2VuZHBvaW50OiJtb2RlbHMtZmlwcy5sZXgue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJmaXBzLnJ1bnRpbWUubGV4Ijp7ZW5kcG9pbnQ6InJ1bnRpbWUtZmlwcy5sZXgue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGZpcHNXaXRoU2VydmljZU9ubHk6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGR1YWxzdGFja0xlZ2FjeTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGR1YWxzdGFja0xlZ2FjeUNuOntlbmRwb2ludDoie3NlcnZpY2V9LmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sZHVhbHN0YWNrRmlwc0xlZ2FjeTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZHVhbHN0YWNrRmlwc0xlZ2FjeUNuOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSxkdWFsc3RhY2tMZWdhY3lFYzI6e2VuZHBvaW50OiJhcGkuZWMyLntyZWdpb259LmF3cyJ9LGR1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hcGkuYXdzIn0sZmlwc0R1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFwaS5hd3MifSxnbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0uZ2xvYmFsLmFwaS5hd3MifSxmaXBzR2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuZ2xvYmFsLmFwaS5hd3MifX19fSx7fV0sNTg6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7KGZ1bmN0aW9uKCl7dmFyIG49ZSgiLi9jb3JlIikscj1lKCIuL3N0YXRlX21hY2hpbmUiKSxvPW4udXRpbC5pbmhlcml0LGk9bi51dGlsLmRvbWFpbixzPWUoImptZXNwYXRoIiksYT17c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0sYz1uZXcgcjtjLnNldHVwU3RhdGVzPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO24uX2hhbHRIYW5kbGVyc09uRXJyb3I9ITEsbi5lbWl0KG4uX2FzbS5jdXJyZW50U3RhdGUsKGZ1bmN0aW9uKGUpe2lmKGUpaWYocj1uLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLHIuX2FzbS5jdXJyZW50U3RhdGUpKXtpZighKGkmJm4uZG9tYWluIGluc3RhbmNlb2YgaS5Eb21haW4pKXRocm93IGU7ZS5kb21haW5FbWl0dGVyPW4sZS5kb21haW49bi5kb21haW4sZS5kb21haW5UaHJvd249ITEsbi5kb21haW4uZW1pdCgiZXJyb3IiLGUpfWVsc2Ugbi5yZXNwb25zZS5lcnJvcj1lLHQoZSk7ZWxzZSB0KG4ucmVzcG9uc2UuZXJyb3IpO3ZhciByfSkpfTt0aGlzLmFkZFN0YXRlKCJ2YWxpZGF0ZSIsImJ1aWxkIiwiZXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoImJ1aWxkIiwiYWZ0ZXJCdWlsZCIsInJlc3RhcnQiLGUpLHRoaXMuYWRkU3RhdGUoImFmdGVyQnVpbGQiLCJzaWduIiwicmVzdGFydCIsZSksdGhpcy5hZGRTdGF0ZSgic2lnbiIsInNlbmQiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgicmV0cnkiLCJhZnRlclJldHJ5IiwiYWZ0ZXJSZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgiYWZ0ZXJSZXRyeSIsInNpZ24iLCJlcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgic2VuZCIsInZhbGlkYXRlUmVzcG9uc2UiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgidmFsaWRhdGVSZXNwb25zZSIsImV4dHJhY3REYXRhIiwiZXh0cmFjdEVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJleHRyYWN0RXJyb3IiLCJleHRyYWN0RGF0YSIsInJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJleHRyYWN0RGF0YSIsInN1Y2Nlc3MiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgicmVzdGFydCIsImJ1aWxkIiwiZXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoInN1Y2Nlc3MiLCJjb21wbGV0ZSIsImNvbXBsZXRlIixlKSx0aGlzLmFkZFN0YXRlKCJlcnJvciIsImNvbXBsZXRlIiwiY29tcGxldGUiLGUpLHRoaXMuYWRkU3RhdGUoImNvbXBsZXRlIixudWxsLG51bGwsZSl9LGMuc2V0dXBTdGF0ZXMoKSxuLlJlcXVlc3Q9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LG8pe3ZhciBzPWUuZW5kcG9pbnQsYT1lLmNvbmZpZy5yZWdpb24sdT1lLmNvbmZpZy5jdXN0b21Vc2VyQWdlbnQ7ZS5zaWduaW5nUmVnaW9uP2E9ZS5zaWduaW5nUmVnaW9uOmUuaXNHbG9iYWxFbmRwb2ludCYmKGE9InVzLWVhc3QtMSIpLHRoaXMuZG9tYWluPWkmJmkuYWN0aXZlLHRoaXMuc2VydmljZT1lLHRoaXMub3BlcmF0aW9uPXQsdGhpcy5wYXJhbXM9b3x8e30sdGhpcy5odHRwUmVxdWVzdD1uZXcgbi5IdHRwUmVxdWVzdChzLGEpLHRoaXMuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQodSksdGhpcy5zdGFydFRpbWU9ZS5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLHRoaXMucmVzcG9uc2U9bmV3IG4uUmVzcG9uc2UodGhpcyksdGhpcy5fYXNtPW5ldyByKGMuc3RhdGVzLCJ2YWxpZGF0ZSIpLHRoaXMuX2hhbHRIYW5kbGVyc09uRXJyb3I9ITEsbi5TZXF1ZW50aWFsRXhlY3V0b3IuY2FsbCh0aGlzKSx0aGlzLmVtaXQ9dGhpcy5lbWl0RXZlbnR9LHNlbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJih0aGlzLmh0dHBSZXF1ZXN0LmFwcGVuZFRvVXNlckFnZW50KCJjYWxsYmFjayIpLHRoaXMub24oImNvbXBsZXRlIiwoZnVuY3Rpb24odCl7ZS5jYWxsKHQsdC5lcnJvcix0LmRhdGEpfSkpKSx0aGlzLnJ1blRvKCksdGhpcy5yZXNwb25zZX0sYnVpbGQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucnVuVG8oInNlbmQiLGUpfSxydW5UbzpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9hc20ucnVuVG8oZSx0LHRoaXMpLHRoaXN9LGFib3J0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJ2YWxpZGF0ZVJlc3BvbnNlIiksdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoImV4dHJhY3RFcnJvciIpLHRoaXMub24oInZhbGlkYXRlUmVzcG9uc2UiLChmdW5jdGlvbihlKXtlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3IoIlJlcXVlc3QgYWJvcnRlZCBieSB1c2VyIikse2NvZGU6IlJlcXVlc3RBYm9ydGVkRXJyb3IiLHJldHJ5YWJsZTohMX0pfSkpLHRoaXMuaHR0cFJlcXVlc3Quc3RyZWFtJiYhdGhpcy5odHRwUmVxdWVzdC5zdHJlYW0uZGlkQ2FsbGJhY2smJih0aGlzLmh0dHBSZXF1ZXN0LnN0cmVhbS5hYm9ydCgpLHRoaXMuaHR0cFJlcXVlc3QuX2Fib3J0Q2FsbGJhY2s/dGhpcy5odHRwUmVxdWVzdC5fYWJvcnRDYWxsYmFjaygpOnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJzZW5kIikpLHRoaXN9LGVhY2hQYWdlOmZ1bmN0aW9uKGUpe2U9bi51dGlsLmZuLm1ha2VBc3luYyhlLDMpLHRoaXMub24oImNvbXBsZXRlIiwoZnVuY3Rpb24gdChyKXtlLmNhbGwocixyLmVycm9yLHIuZGF0YSwoZnVuY3Rpb24obyl7ITEhPT1vJiYoci5oYXNOZXh0UGFnZSgpP3IubmV4dFBhZ2UoKS5vbigiY29tcGxldGUiLHQpLnNlbmQoKTplLmNhbGwocixudWxsLG51bGwsbi51dGlsLmZuLm5vb3ApKX0pKX0pKS5zZW5kKCl9LGVhY2hJdGVtOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5lYWNoUGFnZSgoZnVuY3Rpb24ocixvKXtpZihyKXJldHVybiBlKHIsbnVsbCk7aWYobnVsbD09PW8pcmV0dXJuIGUobnVsbCxudWxsKTt2YXIgaT10LnNlcnZpY2UucGFnaW5hdGlvbkNvbmZpZyh0Lm9wZXJhdGlvbikucmVzdWx0S2V5O0FycmF5LmlzQXJyYXkoaSkmJihpPWlbMF0pO3ZhciBhPXMuc2VhcmNoKG8saSksYz0hMDtyZXR1cm4gbi51dGlsLmFycmF5RWFjaChhLChmdW5jdGlvbih0KXtpZighMT09PShjPWUobnVsbCx0KSkpcmV0dXJuIG4udXRpbC5hYm9ydH0pKSxjfSkpfSxpc1BhZ2VhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLnNlcnZpY2UucGFnaW5hdGlvbkNvbmZpZyh0aGlzLm9wZXJhdGlvbil9LGNyZWF0ZVJlYWRTdHJlYW06ZnVuY3Rpb24oKXt2YXIgZT1uLnV0aWwuc3RyZWFtLHI9dGhpcyxvPW51bGw7cmV0dXJuIDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/KG89bmV3IGUuUGFzc1Rocm91Z2gsdC5uZXh0VGljaygoZnVuY3Rpb24oKXtyLnNlbmQoKX0pKSk6KChvPW5ldyBlLlN0cmVhbSkucmVhZGFibGU9ITAsby5zZW50PSExLG8ub24oIm5ld0xpc3RlbmVyIiwoZnVuY3Rpb24oZSl7by5zZW50fHwiZGF0YSIhPT1lfHwoby5zZW50PSEwLHQubmV4dFRpY2soKGZ1bmN0aW9uKCl7ci5zZW5kKCl9KSkpfSkpKSx0aGlzLm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe28uZW1pdCgiZXJyb3IiLGUpfSkpLHRoaXMub24oImh0dHBIZWFkZXJzIiwoZnVuY3Rpb24odCxpLHMpe2lmKHQ8MzAwKXtyLnJlbW92ZUxpc3RlbmVyKCJodHRwRGF0YSIsbi5FdmVudExpc3RlbmVycy5Db3JlLkhUVFBfREFUQSksci5yZW1vdmVMaXN0ZW5lcigiaHR0cEVycm9yIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuSFRUUF9FUlJPUiksci5vbigiaHR0cEVycm9yIiwoZnVuY3Rpb24oZSl7cy5lcnJvcj1lLHMuZXJyb3IucmV0cnlhYmxlPSExfSkpO3ZhciBhLGM9ITE7aWYoIkhFQUQiIT09ci5odHRwUmVxdWVzdC5tZXRob2QmJihhPXBhcnNlSW50KGlbImNvbnRlbnQtbGVuZ3RoIl0sMTApKSx2b2lkIDAhPT1hJiYhaXNOYU4oYSkmJmE+PTApe2M9ITA7dmFyIHU9MH12YXIgbD1mdW5jdGlvbigpe2MmJnUhPT1hP28uZW1pdCgiZXJyb3IiLG4udXRpbC5lcnJvcihuZXcgRXJyb3IoIlN0cmVhbSBjb250ZW50IGxlbmd0aCBtaXNtYXRjaC4gUmVjZWl2ZWQgIit1KyIgb2YgIithKyIgYnl0ZXMuIikse2NvZGU6IlN0cmVhbUNvbnRlbnRMZW5ndGhNaXNtYXRjaCJ9KSk6Mj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9vLmVuZCgpOm8uZW1pdCgiZW5kIil9LHA9cy5odHRwUmVzcG9uc2UuY3JlYXRlVW5idWZmZXJlZFN0cmVhbSgpO2lmKDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24paWYoYyl7dmFyIGQ9bmV3IGUuUGFzc1Rocm91Z2g7ZC5fd3JpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoJiYodSs9dC5sZW5ndGgpLGUuUGFzc1Rocm91Z2gucHJvdG90eXBlLl93cml0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGQub24oImVuZCIsbCksby5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtjPSExLHAudW5waXBlKGQpLGQuZW1pdCgiZW5kIiksZC5lbmQoKX0pKSxwLnBpcGUoZCkucGlwZShvLHtlbmQ6ITF9KX1lbHNlIHAucGlwZShvKTtlbHNlIGMmJnAub24oImRhdGEiLChmdW5jdGlvbihlKXtlJiZlLmxlbmd0aCYmKHUrPWUubGVuZ3RoKX0pKSxwLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7by5lbWl0KCJkYXRhIixlKX0pKSxwLm9uKCJlbmQiLGwpO3Aub24oImVycm9yIiwoZnVuY3Rpb24oZSl7Yz0hMSxvLmVtaXQoImVycm9yIixlKX0pKX19KSksb30sZW1pdEV2ZW50OmZ1bmN0aW9uKGUsdCxyKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCx0PW51bGwpLHJ8fChyPWZ1bmN0aW9uKCl7fSksdHx8KHQ9dGhpcy5ldmVudFBhcmFtZXRlcnMoZSx0aGlzLnJlc3BvbnNlKSksbi5TZXF1ZW50aWFsRXhlY3V0b3IucHJvdG90eXBlLmVtaXQuY2FsbCh0aGlzLGUsdCwoZnVuY3Rpb24oZSl7ZSYmKHRoaXMucmVzcG9uc2UuZXJyb3I9ZSksci5jYWxsKHRoaXMsZSl9KSl9LGV2ZW50UGFyYW1ldGVyczpmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJyZXN0YXJ0IjpjYXNlInZhbGlkYXRlIjpjYXNlInNpZ24iOmNhc2UiYnVpbGQiOmNhc2UiYWZ0ZXJWYWxpZGF0ZSI6Y2FzZSJhZnRlckJ1aWxkIjpyZXR1cm5bdGhpc107Y2FzZSJlcnJvciI6cmV0dXJuW3RoaXMucmVzcG9uc2UuZXJyb3IsdGhpcy5yZXNwb25zZV07ZGVmYXVsdDpyZXR1cm5bdGhpcy5yZXNwb25zZV19fSxwcmVzaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCJmdW5jdGlvbiIhPXR5cGVvZiBlfHwodD1lLGU9bnVsbCksKG5ldyBuLlNpZ25lcnMuUHJlc2lnbikuc2lnbih0aGlzLnRvR2V0KCksZSx0KX0saXNQcmVzaWduZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuaHR0cFJlcXVlc3QuaGVhZGVycywicHJlc2lnbmVkLWV4cGlyZXMiKX0sdG9VbmF1dGhlbnRpY2F0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW5BdXRoZW50aWNhdGVkPSEwLHRoaXMucmVtb3ZlTGlzdGVuZXIoInZhbGlkYXRlIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuVkFMSURBVEVfQ1JFREVOVElBTFMpLHRoaXMucmVtb3ZlTGlzdGVuZXIoInNpZ24iLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5TSUdOKSx0aGlzfSx0b0dldDpmdW5jdGlvbigpe3JldHVybiJxdWVyeSIhPT10aGlzLnNlcnZpY2UuYXBpLnByb3RvY29sJiYiZWMyIiE9PXRoaXMuc2VydmljZS5hcGkucHJvdG9jb2x8fCh0aGlzLnJlbW92ZUxpc3RlbmVyKCJidWlsZCIsdGhpcy5idWlsZEFzR2V0KSx0aGlzLmFkZExpc3RlbmVyKCJidWlsZCIsdGhpcy5idWlsZEFzR2V0KSksdGhpc30sYnVpbGRBc0dldDpmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0Lm1ldGhvZD0iR0VUIixlLmh0dHBSZXF1ZXN0LnBhdGg9ZS5zZXJ2aWNlLmVuZHBvaW50LnBhdGgrIj8iK2UuaHR0cFJlcXVlc3QuYm9keSxlLmh0dHBSZXF1ZXN0LmJvZHk9IiIsZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXX0saGFsdEhhbmRsZXJzT25FcnJvcjpmdW5jdGlvbigpe3RoaXMuX2hhbHRIYW5kbGVyc09uRXJyb3I9ITB9fSksbi5SZXF1ZXN0LmFkZFByb21pc2VzVG9DbGFzcz1mdW5jdGlvbihlKXt0aGlzLnByb3RvdHlwZS5wcm9taXNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCgicHJvbWlzZSIpLG5ldyBlKChmdW5jdGlvbihlLG4pe3Qub24oImNvbXBsZXRlIiwoZnVuY3Rpb24odCl7dC5lcnJvcj9uKHQuZXJyb3IpOmUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuZGF0YXx8e30sIiRyZXNwb25zZSIse3ZhbHVlOnR9KSl9KSksdC5ydW5UbygpfSkpfX0sbi5SZXF1ZXN0LmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMucHJvdG90eXBlLnByb21pc2V9LG4udXRpbC5hZGRQcm9taXNlcyhuLlJlcXVlc3QpLG4udXRpbC5taXhpbihuLlJlcXVlc3Qsbi5TZXF1ZW50aWFsRXhlY3V0b3IpfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL3N0YXRlX21hY2hpbmUiOjczLF9wcm9jZXNzOjkyLGptZXNwYXRoOjkxfV0sNTk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0LGk9ZSgiam1lc3BhdGgiKTtmdW5jdGlvbiBzKGUpe3ZhciB0PWUucmVxdWVzdC5fd2FpdGVyLG49dC5jb25maWcuYWNjZXB0b3JzLHI9ITEsbz0icmV0cnkiO24uZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIXIpe3ZhciBpPXQubWF0Y2hlcnNbbi5tYXRjaGVyXTtpJiZpKGUsbi5leHBlY3RlZCxuLmFyZ3VtZW50KSYmKHI9ITAsbz1uLnN0YXRlKX19KSksIXImJmUuZXJyb3ImJihvPSJmYWlsdXJlIiksInN1Y2Nlc3MiPT09bz90LnNldFN1Y2Nlc3MoZSk6dC5zZXRFcnJvcihlLCJyZXRyeSI9PT1vKX1yLlJlc291cmNlV2FpdGVyPW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7dGhpcy5zZXJ2aWNlPWUsdGhpcy5zdGF0ZT10LHRoaXMubG9hZFdhaXRlckNvbmZpZyh0aGlzLnN0YXRlKX0sc2VydmljZTpudWxsLHN0YXRlOm51bGwsY29uZmlnOm51bGwsbWF0Y2hlcnM6e3BhdGg6ZnVuY3Rpb24oZSx0LG4pe3RyeXt2YXIgcj1pLnNlYXJjaChlLmRhdGEsbil9Y2F0Y2goZSl7cmV0dXJuITF9cmV0dXJuIGkuc3RyaWN0RGVlcEVxdWFsKHIsdCl9LHBhdGhBbGw6ZnVuY3Rpb24oZSx0LG4pe3RyeXt2YXIgcj1pLnNlYXJjaChlLmRhdGEsbil9Y2F0Y2goZSl7cmV0dXJuITF9QXJyYXkuaXNBcnJheShyKXx8KHI9W3JdKTt2YXIgbz1yLmxlbmd0aDtpZighbylyZXR1cm4hMTtmb3IodmFyIHM9MDtzPG87cysrKWlmKCFpLnN0cmljdERlZXBFcXVhbChyW3NdLHQpKXJldHVybiExO3JldHVybiEwfSxwYXRoQW55OmZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5zZWFyY2goZS5kYXRhLG4pfWNhdGNoKGUpe3JldHVybiExfUFycmF5LmlzQXJyYXkocil8fChyPVtyXSk7Zm9yKHZhciBvPXIubGVuZ3RoLHM9MDtzPG87cysrKWlmKGkuc3RyaWN0RGVlcEVxdWFsKHJbc10sdCkpcmV0dXJuITA7cmV0dXJuITF9LHN0YXR1czpmdW5jdGlvbihlLHQpe3ZhciBuPWUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBuJiZuPT09dH0sZXJyb3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJmUuZXJyb3I/dD09PWUuZXJyb3IuY29kZTp0PT09ISFlLmVycm9yfX0sbGlzdGVuZXJzOihuZXcgci5TZXF1ZW50aWFsRXhlY3V0b3IpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbihlKXtlKCJSRVRSWV9DSEVDSyIsInJldHJ5IiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0Ll93YWl0ZXI7ZS5lcnJvciYmIlJlc291cmNlTm90UmVhZHkiPT09ZS5lcnJvci5jb2RlJiYoZS5lcnJvci5yZXRyeURlbGF5PTFlMyoodC5jb25maWcuZGVsYXl8fDApKX0pKSxlKCJDSEVDS19PVVRQVVQiLCJleHRyYWN0RGF0YSIscyksZSgiQ0hFQ0tfRVJST1IiLCJleHRyYWN0RXJyb3IiLHMpfSkpLHdhaXQ6ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZSYmZS4kd2FpdGVyJiYoIm51bWJlciI9PXR5cGVvZihlPXIudXRpbC5jb3B5KGUpKS4kd2FpdGVyLmRlbGF5JiYodGhpcy5jb25maWcuZGVsYXk9ZS4kd2FpdGVyLmRlbGF5KSwibnVtYmVyIj09dHlwZW9mIGUuJHdhaXRlci5tYXhBdHRlbXB0cyYmKHRoaXMuY29uZmlnLm1heEF0dGVtcHRzPWUuJHdhaXRlci5tYXhBdHRlbXB0cyksZGVsZXRlIGUuJHdhaXRlcik7dmFyIG49dGhpcy5zZXJ2aWNlLm1ha2VSZXF1ZXN0KHRoaXMuY29uZmlnLm9wZXJhdGlvbixlKTtyZXR1cm4gbi5fd2FpdGVyPXRoaXMsbi5yZXNwb25zZS5tYXhSZXRyaWVzPXRoaXMuY29uZmlnLm1heEF0dGVtcHRzLG4uYWRkTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKSx0JiZuLnNlbmQodCksbn0sc2V0U3VjY2VzczpmdW5jdGlvbihlKXtlLmVycm9yPW51bGwsZS5kYXRhPWUuZGF0YXx8e30sZS5yZXF1ZXN0LnJlbW92ZUFsbExpc3RlbmVycygiZXh0cmFjdERhdGEiKX0sc2V0RXJyb3I6ZnVuY3Rpb24oZSx0KXtlLmRhdGE9bnVsbCxlLmVycm9yPXIudXRpbC5lcnJvcihlLmVycm9yfHxuZXcgRXJyb3Ise2NvZGU6IlJlc291cmNlTm90UmVhZHkiLG1lc3NhZ2U6IlJlc291cmNlIGlzIG5vdCBpbiB0aGUgc3RhdGUgIit0aGlzLnN0YXRlLHJldHJ5YWJsZTp0fSl9LGxvYWRXYWl0ZXJDb25maWc6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc2VydmljZS5hcGkud2FpdGVyc1tlXSl0aHJvdyBuZXcgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiU3RhdGVOb3RGb3VuZEVycm9yIixtZXNzYWdlOiJTdGF0ZSAiK2UrIiBub3QgZm91bmQuIn0pO3RoaXMuY29uZmlnPXIudXRpbC5jb3B5KHRoaXMuc2VydmljZS5hcGkud2FpdGVyc1tlXSl9fSl9LHsiLi9jb3JlIjoxOSxqbWVzcGF0aDo5MX1dLDYwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdCxpPWUoImptZXNwYXRoIik7ci5SZXNwb25zZT1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3Q9ZSx0aGlzLmRhdGE9bnVsbCx0aGlzLmVycm9yPW51bGwsdGhpcy5yZXRyeUNvdW50PTAsdGhpcy5yZWRpcmVjdENvdW50PTAsdGhpcy5odHRwUmVzcG9uc2U9bmV3IHIuSHR0cFJlc3BvbnNlLGUmJih0aGlzLm1heFJldHJpZXM9ZS5zZXJ2aWNlLm51bVJldHJpZXMoKSx0aGlzLm1heFJlZGlyZWN0cz1lLnNlcnZpY2UuY29uZmlnLm1heFJlZGlyZWN0cyl9LG5leHRQYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5yZXF1ZXN0LnNlcnZpY2Usbz10aGlzLnJlcXVlc3Qub3BlcmF0aW9uO3RyeXt0PW4ucGFnaW5hdGlvbkNvbmZpZyhvLCEwKX1jYXRjaChlKXt0aGlzLmVycm9yPWV9aWYoIXRoaXMuaGFzTmV4dFBhZ2UoKSl7aWYoZSllKHRoaXMuZXJyb3IsbnVsbCk7ZWxzZSBpZih0aGlzLmVycm9yKXRocm93IHRoaXMuZXJyb3I7cmV0dXJuIG51bGx9dmFyIGk9ci51dGlsLmNvcHkodGhpcy5yZXF1ZXN0LnBhcmFtcyk7aWYodGhpcy5uZXh0UGFnZVRva2Vucyl7dmFyIHM9dC5pbnB1dFRva2VuOyJzdHJpbmciPT10eXBlb2YgcyYmKHM9W3NdKTtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKylpW3NbYV1dPXRoaXMubmV4dFBhZ2VUb2tlbnNbYV07cmV0dXJuIG4ubWFrZVJlcXVlc3QodGhpcy5yZXF1ZXN0Lm9wZXJhdGlvbixpLGUpfXJldHVybiBlP2UobnVsbCxudWxsKTpudWxsfSxoYXNOZXh0UGFnZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlTmV4dFBhZ2VUb2tlbnMoKSwhIXRoaXMubmV4dFBhZ2VUb2tlbnN8fHZvaWQgMD09PXRoaXMubmV4dFBhZ2VUb2tlbnMmJnZvaWQgMH0sY2FjaGVOZXh0UGFnZVRva2VuczpmdW5jdGlvbigpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCJuZXh0UGFnZVRva2VucyIpKXJldHVybiB0aGlzLm5leHRQYWdlVG9rZW5zO3RoaXMubmV4dFBhZ2VUb2tlbnM9dm9pZCAwO3ZhciBlPXRoaXMucmVxdWVzdC5zZXJ2aWNlLnBhZ2luYXRpb25Db25maWcodGhpcy5yZXF1ZXN0Lm9wZXJhdGlvbik7aWYoIWUpcmV0dXJuIHRoaXMubmV4dFBhZ2VUb2tlbnM7aWYodGhpcy5uZXh0UGFnZVRva2Vucz1udWxsLGUubW9yZVJlc3VsdHMmJiFpLnNlYXJjaCh0aGlzLmRhdGEsZS5tb3JlUmVzdWx0cykpcmV0dXJuIHRoaXMubmV4dFBhZ2VUb2tlbnM7dmFyIHQ9ZS5vdXRwdXRUb2tlbjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsdCwoZnVuY3Rpb24oZSl7dmFyIHQ9aS5zZWFyY2godGhpcy5kYXRhLGUpO3QmJih0aGlzLm5leHRQYWdlVG9rZW5zPXRoaXMubmV4dFBhZ2VUb2tlbnN8fFtdLHRoaXMubmV4dFBhZ2VUb2tlbnMucHVzaCh0KSl9KSksdGhpcy5uZXh0UGFnZVRva2Vuc319KX0seyIuL2NvcmUiOjE5LGptZXNwYXRoOjkxfV0sNjE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLlNlcXVlbnRpYWxFeGVjdXRvcj1yLnV0aWwuaW5oZXJpdCh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl9ldmVudHM9e319LGxpc3RlbmVyczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZXZlbnRzW2VdP3RoaXMuX2V2ZW50c1tlXS5zbGljZSgwKTpbXX0sb246ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9ldmVudHNbZV0/bj90aGlzLl9ldmVudHNbZV0udW5zaGlmdCh0KTp0aGlzLl9ldmVudHNbZV0ucHVzaCh0KTp0aGlzLl9ldmVudHNbZV09W3RdLHRoaXN9LG9uQXN5bmM6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0Ll9pc0FzeW5jPSEwLHRoaXMub24oZSx0LG4pfSxyZW1vdmVMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2V2ZW50c1tlXTtpZihuKXtmb3IodmFyIHI9bi5sZW5ndGgsbz0tMSxpPTA7aTxyOysraSluW2ldPT09dCYmKG89aSk7bz4tMSYmbi5zcGxpY2UobywxKX1yZXR1cm4gdGhpc30scmVtb3ZlQWxsTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3JldHVybiBlP2RlbGV0ZSB0aGlzLl9ldmVudHNbZV06dGhpcy5fZXZlbnRzPXt9LHRoaXN9LGVtaXQ6ZnVuY3Rpb24oZSx0LG4pe258fChuPWZ1bmN0aW9uKCl7fSk7dmFyIHI9dGhpcy5saXN0ZW5lcnMoZSksbz1yLmxlbmd0aDtyZXR1cm4gdGhpcy5jYWxsTGlzdGVuZXJzKHIsdCxuKSxvPjB9LGNhbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIGk9dGhpcyxzPW98fG51bGw7ZnVuY3Rpb24gYShvKXtpZihvJiYocz1yLnV0aWwuZXJyb3Ioc3x8bmV3IEVycm9yLG8pLGkuX2hhbHRIYW5kbGVyc09uRXJyb3IpKXJldHVybiBuLmNhbGwoaSxzKTtpLmNhbGxMaXN0ZW5lcnMoZSx0LG4scyl9Zm9yKDtlLmxlbmd0aD4wOyl7dmFyIGM9ZS5zaGlmdCgpO2lmKGMuX2lzQXN5bmMpcmV0dXJuIHZvaWQgYy5hcHBseShpLHQuY29uY2F0KFthXSkpO3RyeXtjLmFwcGx5KGksdCl9Y2F0Y2goZSl7cz1yLnV0aWwuZXJyb3Ioc3x8bmV3IEVycm9yLGUpfWlmKHMmJmkuX2hhbHRIYW5kbGVyc09uRXJyb3IpcmV0dXJuIHZvaWQgbi5jYWxsKGkscyl9bi5jYWxsKGkscyl9LGFkZExpc3RlbmVyczpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBlLl9ldmVudHMmJihlPWUuX2V2ZW50cyksci51dGlsLmVhY2goZSwoZnVuY3Rpb24oZSxuKXsiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49W25dKSxyLnV0aWwuYXJyYXlFYWNoKG4sKGZ1bmN0aW9uKG4pe3Qub24oZSxuKX0pKX0pKSx0fSxhZGROYW1lZExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzW2VdPW4sdGhpcy5hZGRMaXN0ZW5lcih0LG4sciksdGhpc30sYWRkTmFtZWRBc3luY0xpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuLl9pc0FzeW5jPSEwLHRoaXMuYWRkTmFtZWRMaXN0ZW5lcihlLHQsbixyKX0sYWRkTmFtZWRMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgoZnVuY3Rpb24oKXt0LmFkZE5hbWVkTGlzdGVuZXIuYXBwbHkodCxhcmd1bWVudHMpfSksKGZ1bmN0aW9uKCl7dC5hZGROYW1lZEFzeW5jTGlzdGVuZXIuYXBwbHkodCxhcmd1bWVudHMpfSkpLHRoaXN9fSksci5TZXF1ZW50aWFsRXhlY3V0b3IucHJvdG90eXBlLmFkZExpc3RlbmVyPXIuU2VxdWVudGlhbEV4ZWN1dG9yLnByb3RvdHlwZS5vbix0LmV4cG9ydHM9ci5TZXF1ZW50aWFsRXhlY3V0b3J9LHsiLi9jb3JlIjoxOX1dLDYyOltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpLG89ZSgiLi9tb2RlbC9hcGkiKSxpPWUoIi4vcmVnaW9uX2NvbmZpZyIpLHM9ci51dGlsLmluaGVyaXQsYT0wLGM9ZSgiLi9yZWdpb24vdXRpbHMiKTtyLlNlcnZpY2U9cyh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7aWYoIXRoaXMubG9hZFNlcnZpY2VDbGFzcyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLCJTZXJ2aWNlIG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCBgbmV3JyBvcGVyYXRvciIpO2lmKGUpe2lmKGUucmVnaW9uKXt2YXIgdD1lLnJlZ2lvbjtjLmlzRmlwc1JlZ2lvbih0KSYmKGUucmVnaW9uPWMuZ2V0UmVhbFJlZ2lvbih0KSxlLnVzZUZpcHNFbmRwb2ludD0hMCksYy5pc0dsb2JhbFJlZ2lvbih0KSYmKGUucmVnaW9uPWMuZ2V0UmVhbFJlZ2lvbih0KSl9ImJvb2xlYW4iPT10eXBlb2YgZS51c2VEdWFsc3RhY2smJiJib29sZWFuIiE9dHlwZW9mIGUudXNlRHVhbHN0YWNrRW5kcG9pbnQmJihlLnVzZUR1YWxzdGFja0VuZHBvaW50PWUudXNlRHVhbHN0YWNrKX12YXIgbj10aGlzLmxvYWRTZXJ2aWNlQ2xhc3MoZXx8e30pO2lmKG4pe3ZhciBvPXIudXRpbC5jb3B5KGUpLGk9bmV3IG4oZSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJfb3JpZ2luYWxDb25maWciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb30sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxpLl9jbGllbnRJZD0rK2EsaX10aGlzLmluaXRpYWxpemUoZSl9LGluaXRpYWxpemU6ZnVuY3Rpb24oZSl7dmFyIHQ9ci5jb25maWdbdGhpcy5zZXJ2aWNlSWRlbnRpZmllcl07aWYodGhpcy5jb25maWc9bmV3IHIuQ29uZmlnKHIuY29uZmlnKSx0JiZ0aGlzLmNvbmZpZy51cGRhdGUodCwhMCksZSYmdGhpcy5jb25maWcudXBkYXRlKGUsITApLHRoaXMudmFsaWRhdGVTZXJ2aWNlKCksdGhpcy5jb25maWcuZW5kcG9pbnR8fGkuY29uZmlndXJlRW5kcG9pbnQodGhpcyksdGhpcy5jb25maWcuZW5kcG9pbnQ9dGhpcy5lbmRwb2ludEZyb21UZW1wbGF0ZSh0aGlzLmNvbmZpZy5lbmRwb2ludCksdGhpcy5zZXRFbmRwb2ludCh0aGlzLmNvbmZpZy5lbmRwb2ludCksci5TZXF1ZW50aWFsRXhlY3V0b3IuY2FsbCh0aGlzKSxyLlNlcnZpY2UuYWRkRGVmYXVsdE1vbml0b3JpbmdMaXN0ZW5lcnModGhpcyksKHRoaXMuY29uZmlnLmNsaWVudFNpZGVNb25pdG9yaW5nfHxyLlNlcnZpY2UuX2NsaWVudFNpZGVNb25pdG9yaW5nKSYmdGhpcy5wdWJsaXNoZXIpe3ZhciBvPXRoaXMucHVibGlzaGVyO3RoaXMuYWRkTmFtZWRMaXN0ZW5lcigiUFVCTElTSF9BUElfQ0FMTCIsImFwaUNhbGwiLChmdW5jdGlvbihlKXtuLm5leHRUaWNrKChmdW5jdGlvbigpe28uZXZlbnRIYW5kbGVyKGUpfSkpfSkpLHRoaXMuYWRkTmFtZWRMaXN0ZW5lcigiUFVCTElTSF9BUElfQVRURU1QVCIsImFwaUNhbGxBdHRlbXB0IiwoZnVuY3Rpb24oZSl7bi5uZXh0VGljaygoZnVuY3Rpb24oKXtvLmV2ZW50SGFuZGxlcihlKX0pKX0pKX19LHZhbGlkYXRlU2VydmljZTpmdW5jdGlvbigpe30sbG9hZFNlcnZpY2VDbGFzczpmdW5jdGlvbihlKXt2YXIgdD1lO2lmKHIudXRpbC5pc0VtcHR5KHRoaXMuYXBpKSl7aWYodC5hcGlDb25maWcpcmV0dXJuIHIuU2VydmljZS5kZWZpbmVTZXJ2aWNlQXBpKHRoaXMuY29uc3RydWN0b3IsdC5hcGlDb25maWcpO2lmKHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXMpeyh0PW5ldyByLkNvbmZpZyhyLmNvbmZpZykpLnVwZGF0ZShlLCEwKTt2YXIgbj10LmFwaVZlcnNpb25zW3RoaXMuY29uc3RydWN0b3Iuc2VydmljZUlkZW50aWZpZXJdO3JldHVybiBuPW58fHQuYXBpVmVyc2lvbix0aGlzLmdldExhdGVzdFNlcnZpY2VDbGFzcyhuKX1yZXR1cm4gbnVsbH1yZXR1cm4gbnVsbH0sZ2V0TGF0ZXN0U2VydmljZUNsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMuZ2V0TGF0ZXN0U2VydmljZVZlcnNpb24oZSksbnVsbD09PXRoaXMuY29uc3RydWN0b3Iuc2VydmljZXNbZV0mJnIuU2VydmljZS5kZWZpbmVTZXJ2aWNlQXBpKHRoaXMuY29uc3RydWN0b3IsZSksdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlc1tlXX0sZ2V0TGF0ZXN0U2VydmljZVZlcnNpb246ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29uc3RydWN0b3Iuc2VydmljZXN8fDA9PT10aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk5vIHNlcnZpY2VzIGRlZmluZWQgb24gIit0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VJZGVudGlmaWVyKTtpZihlP3IudXRpbC5pc1R5cGUoZSxEYXRlKSYmKGU9ci51dGlsLmRhdGUuaXNvODYwMShlKS5zcGxpdCgiVCIpWzBdKTplPSJsYXRlc3QiLE9iamVjdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzLGUpKXJldHVybiBlO2Zvcih2YXIgdD1PYmplY3Qua2V5cyh0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzKS5zb3J0KCksbj1udWxsLG89dC5sZW5ndGgtMTtvPj0wO28tLSlpZigiKiIhPT10W29dW3Rbb10ubGVuZ3RoLTFdJiYobj10W29dKSx0W29dLnN1YnN0cigwLDEwKTw9ZSlyZXR1cm4gbjt0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBmaW5kICIrdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlSWRlbnRpZmllcisiIEFQSSB0byBzYXRpc2Z5IHZlcnNpb24gY29uc3RyYWludCBgIitlKyInIil9LGFwaTp7fSxkZWZhdWx0UmV0cnlDb3VudDozLGN1c3RvbWl6ZVJlcXVlc3RzOmZ1bmN0aW9uKGUpe2lmKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjYWxsYmFjayB0eXBlICciK3R5cGVvZiBlKyInIHByb3ZpZGVkIGluIGN1c3RvbWl6ZVJlcXVlc3RzIik7dGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcj1lfWVsc2UgdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcj1udWxsfSxtYWtlUmVxdWVzdDpmdW5jdGlvbihlLHQsbil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQsdD1udWxsKSx0PXR8fHt9LHRoaXMuY29uZmlnLnBhcmFtcyl7dmFyIG89dGhpcy5hcGkub3BlcmF0aW9uc1tlXTtvJiYodD1yLnV0aWwuY29weSh0KSxyLnV0aWwuZWFjaCh0aGlzLmNvbmZpZy5wYXJhbXMsKGZ1bmN0aW9uKGUsbil7by5pbnB1dC5tZW1iZXJzW2VdJiYodm9pZCAwIT09dFtlXSYmbnVsbCE9PXRbZV18fCh0W2VdPW4pKX0pKSl9dmFyIGk9bmV3IHIuUmVxdWVzdCh0aGlzLGUsdCk7cmV0dXJuIHRoaXMuYWRkQWxsUmVxdWVzdExpc3RlbmVycyhpKSx0aGlzLmF0dGFjaE1vbml0b3JpbmdFbWl0dGVyKGkpLG4mJmkuc2VuZChuKSxpfSxtYWtlVW5hdXRoZW50aWNhdGVkUmVxdWVzdDpmdW5jdGlvbihlLHQsbil7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQsdD17fSk7dmFyIHI9dGhpcy5tYWtlUmVxdWVzdChlLHQpLnRvVW5hdXRoZW50aWNhdGVkKCk7cmV0dXJuIG4/ci5zZW5kKG4pOnJ9LHdhaXRGb3I6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuZXcgci5SZXNvdXJjZVdhaXRlcih0aGlzLGUpLndhaXQodCxuKX0sYWRkQWxsUmVxdWVzdExpc3RlbmVyczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W3IuZXZlbnRzLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZSx0aGlzLnNlcnZpY2VJbnRlcmZhY2UoKSxyLkV2ZW50TGlzdGVuZXJzLkNvcmVQb3N0XSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXSYmZS5hZGRMaXN0ZW5lcnModFtuXSk7dGhpcy5jb25maWcucGFyYW1WYWxpZGF0aW9ufHxlLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsci5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX1BBUkFNRVRFUlMpLHRoaXMuY29uZmlnLmxvZ2dlciYmZS5hZGRMaXN0ZW5lcnMoci5FdmVudExpc3RlbmVycy5Mb2dnZXIpLHRoaXMuc2V0dXBSZXF1ZXN0TGlzdGVuZXJzKGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jdXN0b21SZXF1ZXN0SGFuZGxlciYmdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY3VzdG9tUmVxdWVzdEhhbmRsZXIoZSksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsImN1c3RvbVJlcXVlc3RIYW5kbGVyIikmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmN1c3RvbVJlcXVlc3RIYW5kbGVyJiZ0aGlzLmN1c3RvbVJlcXVlc3RIYW5kbGVyKGUpfSxhcGlDYWxsRXZlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPXtUeXBlOiJBcGlDYWxsIixBcGk6dD90Lm5hbWU6ZS5vcGVyYXRpb24sVmVyc2lvbjoxLFNlcnZpY2U6ZS5zZXJ2aWNlLmFwaS5zZXJ2aWNlSWR8fGUuc2VydmljZS5hcGkuZW5kcG9pbnRQcmVmaXgsUmVnaW9uOmUuaHR0cFJlcXVlc3QucmVnaW9uLE1heFJldHJpZXNFeGNlZWRlZDowLFVzZXJBZ2VudDplLmh0dHBSZXF1ZXN0LmdldFVzZXJBZ2VudCgpfSxyPWUucmVzcG9uc2U7aWYoci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSYmKG4uRmluYWxIdHRwU3RhdHVzQ29kZT1yLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKSxyLmVycm9yKXt2YXIgbz1yLmVycm9yO3IuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU+Mjk5PyhvLmNvZGUmJihuLkZpbmFsQXdzRXhjZXB0aW9uPW8uY29kZSksby5tZXNzYWdlJiYobi5GaW5hbEF3c0V4Y2VwdGlvbk1lc3NhZ2U9by5tZXNzYWdlKSk6KChvLmNvZGV8fG8ubmFtZSkmJihuLkZpbmFsU2RrRXhjZXB0aW9uPW8uY29kZXx8by5uYW1lKSxvLm1lc3NhZ2UmJihuLkZpbmFsU2RrRXhjZXB0aW9uTWVzc2FnZT1vLm1lc3NhZ2UpKX1yZXR1cm4gbn0sYXBpQXR0ZW1wdEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj17VHlwZToiQXBpQ2FsbEF0dGVtcHQiLEFwaTp0P3QubmFtZTplLm9wZXJhdGlvbixWZXJzaW9uOjEsU2VydmljZTplLnNlcnZpY2UuYXBpLnNlcnZpY2VJZHx8ZS5zZXJ2aWNlLmFwaS5lbmRwb2ludFByZWZpeCxGcWRuOmUuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdG5hbWUsVXNlckFnZW50OmUuaHR0cFJlcXVlc3QuZ2V0VXNlckFnZW50KCl9LHI9ZS5yZXNwb25zZTtyZXR1cm4gci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSYmKG4uSHR0cFN0YXR1c0NvZGU9ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSksIWUuX3VuQXV0aGVudGljYXRlZCYmZS5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscyYmZS5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmKG4uQWNjZXNzS2V5PWUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQpLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnM/KGUuaHR0cFJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXSYmKG4uU2Vzc2lvblRva2VuPWUuaHR0cFJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXSksci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXpuLXJlcXVlc3RpZCJdJiYobi5YQW16blJlcXVlc3RJZD1yLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtem4tcmVxdWVzdGlkIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16LXJlcXVlc3QtaWQiXSYmKG4uWEFtelJlcXVlc3RJZD1yLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16LWlkLTIiXSYmKG4uWEFteklkMj1yLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1pZC0yIl0pLG4pOm59LGF0dGVtcHRGYWlsRXZlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5hcGlBdHRlbXB0RXZlbnQoZSksbj1lLnJlc3BvbnNlLHI9bi5lcnJvcjtyZXR1cm4gbi5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZT4yOTk/KHIuY29kZSYmKHQuQXdzRXhjZXB0aW9uPXIuY29kZSksci5tZXNzYWdlJiYodC5Bd3NFeGNlcHRpb25NZXNzYWdlPXIubWVzc2FnZSkpOigoci5jb2RlfHxyLm5hbWUpJiYodC5TZGtFeGNlcHRpb249ci5jb2RlfHxyLm5hbWUpLHIubWVzc2FnZSYmKHQuU2RrRXhjZXB0aW9uTWVzc2FnZT1yLm1lc3NhZ2UpKSx0fSxhdHRhY2hNb25pdG9yaW5nRW1pdHRlcjpmdW5jdGlvbihlKXt2YXIgdCxuLG8saSxzLGEsYz0wLHU9dGhpcztlLm9uKCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKCl7aT1yLnV0aWwucmVhbENsb2NrLm5vdygpLGE9RGF0ZS5ub3coKX0pLCEwKSxlLm9uKCJzaWduIiwoZnVuY3Rpb24oKXtuPXIudXRpbC5yZWFsQ2xvY2subm93KCksdD1EYXRlLm5vdygpLHM9ZS5odHRwUmVxdWVzdC5yZWdpb24sYysrfSksITApLGUub24oInZhbGlkYXRlUmVzcG9uc2UiLChmdW5jdGlvbigpe289TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLW4pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTExfQVRURU1QVCIsInN1Y2Nlc3MiLChmdW5jdGlvbigpe3ZhciBuPXUuYXBpQXR0ZW1wdEV2ZW50KGUpO24uVGltZXN0YW1wPXQsbi5BdHRlbXB0TGF0ZW5jeT1vPj0wP286MCxuLlJlZ2lvbj1zLHUuZW1pdCgiYXBpQ2FsbEF0dGVtcHQiLFtuXSl9KSksZS5hZGROYW1lZExpc3RlbmVyKCJBUElfQ0FMTF9BVFRFTVBUX1JFVFJZIiwicmV0cnkiLChmdW5jdGlvbigpe3ZhciBpPXUuYXR0ZW1wdEZhaWxFdmVudChlKTtpLlRpbWVzdGFtcD10LG89b3x8TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLW4pLGkuQXR0ZW1wdExhdGVuY3k9bz49MD9vOjAsaS5SZWdpb249cyx1LmVtaXQoImFwaUNhbGxBdHRlbXB0IixbaV0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTEwiLCJjb21wbGV0ZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9dS5hcGlDYWxsRXZlbnQoZSk7aWYodC5BdHRlbXB0Q291bnQ9YywhKHQuQXR0ZW1wdENvdW50PD0wKSl7dC5UaW1lc3RhbXA9YTt2YXIgbj1NYXRoLnJvdW5kKHIudXRpbC5yZWFsQ2xvY2subm93KCktaSk7dC5MYXRlbmN5PW4+PTA/bjowO3ZhciBvPWUucmVzcG9uc2U7by5lcnJvciYmby5lcnJvci5yZXRyeWFibGUmJiJudW1iZXIiPT10eXBlb2Ygby5yZXRyeUNvdW50JiYibnVtYmVyIj09dHlwZW9mIG8ubWF4UmV0cmllcyYmby5yZXRyeUNvdW50Pj1vLm1heFJldHJpZXMmJih0Lk1heFJldHJpZXNFeGNlZWRlZD0xKSx1LmVtaXQoImFwaUNhbGwiLFt0XSl9fSkpfSxzZXR1cFJlcXVlc3RMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7fSxnZXRTaWduaW5nTmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwaS5zaWduaW5nTmFtZXx8dGhpcy5hcGkuZW5kcG9pbnRQcmVmaXh9LGdldFNpZ25lckNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG49bnVsbCxvPSIiO3JldHVybiBlJiYobz0obj0oZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dfHxudWxsKT9uLmF1dGh0eXBlOiIiKSx0PXRoaXMuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24/dGhpcy5jb25maWcuc2lnbmF0dXJlVmVyc2lvbjoidjQiPT09b3x8InY0LXVuc2lnbmVkLWJvZHkiPT09bz8idjQiOiJiZWFyZXIiPT09bz8iYmVhcmVyIjp0aGlzLmFwaS5zaWduYXR1cmVWZXJzaW9uLHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmdldFZlcnNpb24odCl9LHNlcnZpY2VJbnRlcmZhY2U6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5hcGkucHJvdG9jb2wpe2Nhc2UiZWMyIjpjYXNlInF1ZXJ5IjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5RdWVyeTtjYXNlImpzb24iOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLkpzb247Y2FzZSJyZXN0LWpzb24iOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLlJlc3RKc29uO2Nhc2UicmVzdC14bWwiOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLlJlc3RYbWx9aWYodGhpcy5hcGkucHJvdG9jb2wpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHNlcnZpY2UgYHByb3RvY29sJyAiK3RoaXMuYXBpLnByb3RvY29sKyIgaW4gQVBJIGNvbmZpZyIpfSxzdWNjZXNzZnVsUmVzcG9uc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU8MzAwfSxudW1SZXRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuY29uZmlnLm1heFJldHJpZXM/dGhpcy5jb25maWcubWF4UmV0cmllczp0aGlzLmRlZmF1bHRSZXRyeUNvdW50fSxyZXRyeURlbGF5czpmdW5jdGlvbihlLHQpe3JldHVybiByLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheShlLHRoaXMuY29uZmlnLnJldHJ5RGVsYXlPcHRpb25zLHQpfSxyZXRyeWFibGVFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMudGltZW91dEVycm9yKGUpfHwhIXRoaXMubmV0d29ya2luZ0Vycm9yKGUpfHwhIXRoaXMuZXhwaXJlZENyZWRlbnRpYWxzRXJyb3IoZSl8fCEhdGhpcy50aHJvdHRsZWRFcnJvcihlKXx8ZS5zdGF0dXNDb2RlPj01MDB9LG5ldHdvcmtpbmdFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iTmV0d29ya2luZ0Vycm9yIj09PWUuY29kZX0sdGltZW91dEVycm9yOmZ1bmN0aW9uKGUpe3JldHVybiJUaW1lb3V0RXJyb3IiPT09ZS5jb2RlfSxleHBpcmVkQ3JlZGVudGlhbHNFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iRXhwaXJlZFRva2VuRXhjZXB0aW9uIj09PWUuY29kZX0sY2xvY2tTa2V3RXJyb3I6ZnVuY3Rpb24oZSl7c3dpdGNoKGUuY29kZSl7Y2FzZSJSZXF1ZXN0VGltZVRvb1NrZXdlZCI6Y2FzZSJSZXF1ZXN0RXhwaXJlZCI6Y2FzZSJJbnZhbGlkU2lnbmF0dXJlRXhjZXB0aW9uIjpjYXNlIlNpZ25hdHVyZURvZXNOb3RNYXRjaCI6Y2FzZSJBdXRoRmFpbHVyZSI6Y2FzZSJSZXF1ZXN0SW5UaGVGdXR1cmUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxnZXRTa2V3Q29ycmVjdGVkRGF0ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpK3RoaXMuY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0KX0sYXBwbHlDbG9ja09mZnNldDpmdW5jdGlvbihlKXtlJiYodGhpcy5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQ9ZS1EYXRlLm5vdygpKX0saXNDbG9ja1NrZXdlZDpmdW5jdGlvbihlKXtpZihlKXJldHVybiBNYXRoLmFicyh0aGlzLmdldFNrZXdDb3JyZWN0ZWREYXRlKCkuZ2V0VGltZSgpLWUpPj0zZTV9LHRocm90dGxlZEVycm9yOmZ1bmN0aW9uKGUpe2lmKDQyOT09PWUuc3RhdHVzQ29kZSlyZXR1cm4hMDtzd2l0Y2goZS5jb2RlKXtjYXNlIlByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkRXhjZXB0aW9uIjpjYXNlIlRocm90dGxpbmciOmNhc2UiVGhyb3R0bGluZ0V4Y2VwdGlvbiI6Y2FzZSJSZXF1ZXN0TGltaXRFeGNlZWRlZCI6Y2FzZSJSZXF1ZXN0VGhyb3R0bGVkIjpjYXNlIlJlcXVlc3RUaHJvdHRsZWRFeGNlcHRpb24iOmNhc2UiVG9vTWFueVJlcXVlc3RzRXhjZXB0aW9uIjpjYXNlIlRyYW5zYWN0aW9uSW5Qcm9ncmVzc0V4Y2VwdGlvbiI6Y2FzZSJFQzJUaHJvdHRsZWRFeGNlcHRpb24iOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxlbmRwb2ludEZyb21UZW1wbGF0ZTpmdW5jdGlvbihlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIGU7dmFyIHQ9ZTtyZXR1cm4gdD0odD0odD10LnJlcGxhY2UoL1x7c2VydmljZVx9L2csdGhpcy5hcGkuZW5kcG9pbnRQcmVmaXgpKS5yZXBsYWNlKC9ce3JlZ2lvblx9L2csdGhpcy5jb25maWcucmVnaW9uKSkucmVwbGFjZSgvXHtzY2hlbWVcfS9nLHRoaXMuY29uZmlnLnNzbEVuYWJsZWQ/Imh0dHBzIjoiaHR0cCIpfSxzZXRFbmRwb2ludDpmdW5jdGlvbihlKXt0aGlzLmVuZHBvaW50PW5ldyByLkVuZHBvaW50KGUsdGhpcy5jb25maWcpfSxwYWdpbmF0aW9uQ29uZmlnOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5hcGkub3BlcmF0aW9uc1tlXS5wYWdpbmF0b3I7aWYoIW4pe2lmKHQpe3ZhciBvPW5ldyBFcnJvcjt0aHJvdyByLnV0aWwuZXJyb3IobywiTm8gcGFnaW5hdGlvbiBjb25maWd1cmF0aW9uIGZvciAiK2UpfXJldHVybiBudWxsfXJldHVybiBufX0pLHIudXRpbC51cGRhdGUoci5TZXJ2aWNlLHtkZWZpbmVNZXRob2RzOmZ1bmN0aW9uKGUpe3IudXRpbC5lYWNoKGUucHJvdG90eXBlLmFwaS5vcGVyYXRpb25zLChmdW5jdGlvbih0KXtlLnByb3RvdHlwZVt0XXx8KCJub25lIj09PWUucHJvdG90eXBlLmFwaS5vcGVyYXRpb25zW3RdLmF1dGh0eXBlP2UucHJvdG90eXBlW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QodCxlLG4pfTplLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHQsZSxuKX0pfSkpfSxkZWZpbmVTZXJ2aWNlOmZ1bmN0aW9uKGUsdCxuKXtyLlNlcnZpY2UuX3NlcnZpY2VNYXBbZV09ITAsQXJyYXkuaXNBcnJheSh0KXx8KG49dCx0PVtdKTt2YXIgbz1zKHIuU2VydmljZSxufHx7fSk7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtyLlNlcnZpY2UuYWRkVmVyc2lvbnMobyx0KTt2YXIgaT1vLnNlcnZpY2VJZGVudGlmaWVyfHxlO28uc2VydmljZUlkZW50aWZpZXI9aX1lbHNlIG8ucHJvdG90eXBlLmFwaT1lLHIuU2VydmljZS5kZWZpbmVNZXRob2RzKG8pO2lmKHIuU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwodGhpcy5wcm90b3R5cGUpLCF0aGlzLnByb3RvdHlwZS5wdWJsaXNoZXImJnIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZyl7dmFyIGE9ci51dGlsLmNsaWVudFNpZGVNb25pdG9yaW5nLlB1Ymxpc2hlcixjPSgwLHIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZy5jb25maWdQcm92aWRlcikoKTt0aGlzLnByb3RvdHlwZS5wdWJsaXNoZXI9bmV3IGEoYyksYy5lbmFibGVkJiYoci5TZXJ2aWNlLl9jbGllbnRTaWRlTW9uaXRvcmluZz0hMCl9cmV0dXJuIHIuU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwoby5wcm90b3R5cGUpLHIuU2VydmljZS5hZGREZWZhdWx0TW9uaXRvcmluZ0xpc3RlbmVycyhvLnByb3RvdHlwZSksb30sYWRkVmVyc2lvbnM6ZnVuY3Rpb24oZSx0KXtBcnJheS5pc0FycmF5KHQpfHwodD1bdF0pLGUuc2VydmljZXM9ZS5zZXJ2aWNlc3x8e307Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdm9pZCAwPT09ZS5zZXJ2aWNlc1t0W25dXSYmKGUuc2VydmljZXNbdFtuXV09bnVsbCk7ZS5hcGlWZXJzaW9ucz1PYmplY3Qua2V5cyhlLnNlcnZpY2VzKS5zb3J0KCl9LGRlZmluZVNlcnZpY2VBcGk6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXMoZSx7c2VydmljZUlkZW50aWZpZXI6ZS5zZXJ2aWNlSWRlbnRpZmllcn0pO2Z1bmN0aW9uIGEodCl7dC5pc0FwaT9pLnByb3RvdHlwZS5hcGk9dDppLnByb3RvdHlwZS5hcGk9bmV3IG8odCx7c2VydmljZUlkZW50aWZpZXI6ZS5zZXJ2aWNlSWRlbnRpZmllcn0pfWlmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYobilhKG4pO2Vsc2UgdHJ5e2Eoci5hcGlMb2FkZXIoZS5zZXJ2aWNlSWRlbnRpZmllcix0KSl9Y2F0Y2gobil7dGhyb3cgci51dGlsLmVycm9yKG4se21lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIEFQSSBjb25maWd1cmF0aW9uICIrZS5zZXJ2aWNlSWRlbnRpZmllcisiLSIrdH0pfU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLnNlcnZpY2VzLHQpfHwoZS5hcGlWZXJzaW9ucz1lLmFwaVZlcnNpb25zLmNvbmNhdCh0KS5zb3J0KCkpLGUuc2VydmljZXNbdF09aX1lbHNlIGEodCk7cmV0dXJuIHIuU2VydmljZS5kZWZpbmVNZXRob2RzKGkpLGl9LGhhc1NlcnZpY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLlNlcnZpY2UuX3NlcnZpY2VNYXAsZSl9LGFkZERlZmF1bHRNb25pdG9yaW5nTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe2UuYWRkTmFtZWRMaXN0ZW5lcigiTU9OSVRPUl9FVkVOVFNfQlVCQkxFIiwiYXBpQ2FsbEF0dGVtcHQiLChmdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7bi5fZXZlbnRzJiZuLmVtaXQoImFwaUNhbGxBdHRlbXB0IixbdF0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQ0FMTF9FVkVOVFNfQlVCQkxFIiwiYXBpQ2FsbCIsKGZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtuLl9ldmVudHMmJm4uZW1pdCgiYXBpQ2FsbCIsW3RdKX0pKX0sX3NlcnZpY2VNYXA6e319KSxyLnV0aWwubWl4aW4oci5TZXJ2aWNlLHIuU2VxdWVudGlhbEV4ZWN1dG9yKSx0LmV4cG9ydHM9ci5TZXJ2aWNlfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL21vZGVsL2FwaSI6NDAsIi4vcmVnaW9uL3V0aWxzIjo1NSwiLi9yZWdpb25fY29uZmlnIjo1NixfcHJvY2Vzczo5Mn1dLDYzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vY29uZmlnX3JlZ2lvbmFsX2VuZHBvaW50Iik7ci51dGlsLnVwZGF0ZShyLlNUUy5wcm90b3R5cGUse2NyZWRlbnRpYWxzRnJvbTpmdW5jdGlvbihlLHQpe3JldHVybiBlPyh0fHwodD1uZXcgci5UZW1wb3JhcnlDcmVkZW50aWFscyksdC5leHBpcmVkPSExLHQuYWNjZXNzS2V5SWQ9ZS5DcmVkZW50aWFscy5BY2Nlc3NLZXlJZCx0LnNlY3JldEFjY2Vzc0tleT1lLkNyZWRlbnRpYWxzLlNlY3JldEFjY2Vzc0tleSx0LnNlc3Npb25Ub2tlbj1lLkNyZWRlbnRpYWxzLlNlc3Npb25Ub2tlbix0LmV4cGlyZVRpbWU9ZS5DcmVkZW50aWFscy5FeHBpcmF0aW9uLHQpOm51bGx9LGFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tYWtlVW5hdXRoZW50aWNhdGVkUmVxdWVzdCgiYXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eSIsZSx0KX0sYXNzdW1lUm9sZVdpdGhTQU1MOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QoImFzc3VtZVJvbGVXaXRoU0FNTCIsZSx0KX0sc2V0dXBSZXF1ZXN0TGlzdGVuZXJzOmZ1bmN0aW9uKGUpe2UuYWRkTGlzdGVuZXIoInZhbGlkYXRlIix0aGlzLm9wdEluUmVnaW9uYWxFbmRwb2ludCwhMCl9LG9wdEluUmVnaW9uYWxFbmRwb2ludDpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmNvbmZpZztpZihuLnN0c1JlZ2lvbmFsRW5kcG9pbnRzPW8odC5fb3JpZ2luYWxDb25maWcse2VudjoiQVdTX1NUU19SRUdJT05BTF9FTkRQT0lOVFMiLHNoYXJlZENvbmZpZzoic3RzX3JlZ2lvbmFsX2VuZHBvaW50cyIsY2xpZW50Q29uZmlnOiJzdHNSZWdpb25hbEVuZHBvaW50cyJ9KSwicmVnaW9uYWwiPT09bi5zdHNSZWdpb25hbEVuZHBvaW50cyYmdC5pc0dsb2JhbEVuZHBvaW50KXtpZighbi5yZWdpb24pdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlnRXJyb3IiLG1lc3NhZ2U6Ik1pc3NpbmcgcmVnaW9uIGluIGNvbmZpZyJ9KTt2YXIgaT1uLmVuZHBvaW50LmluZGV4T2YoIi5hbWF6b25hd3MuY29tIikscz1uLmVuZHBvaW50LnN1YnN0cmluZygwLGkpKyIuIituLnJlZ2lvbituLmVuZHBvaW50LnN1YnN0cmluZyhpKTtlLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KHMpLGUuaHR0cFJlcXVlc3QucmVnaW9uPW4ucmVnaW9ufX19KX0seyIuLi9jb25maWdfcmVnaW9uYWxfZW5kcG9pbnQiOjE4LCIuLi9jb3JlIjoxOX1dLDY0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpO3IuU2lnbmVycy5CZWFyZXI9ci51dGlsLmluaGVyaXQoci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmNhbGwodGhpcyxlKX0sYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPSJCZWFyZXIgIitlLnRva2VufX0pfSx7Ii4uL2NvcmUiOjE5fV0sNjU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdCxpPSJwcmVzaWduZWQtZXhwaXJlcyI7ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbaV0sbj1lLnNlcnZpY2UuZ2V0U2lnbmVyQ2xhc3MoZSk7aWYoZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siVXNlci1BZ2VudCJdLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LVVzZXItQWdlbnQiXSxuPT09ci5TaWduZXJzLlY0KXtpZih0PjYwNDgwMCl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJJbnZhbGlkRXhwaXJ5VGltZSIsbWVzc2FnZToiUHJlc2lnbmluZyBkb2VzIG5vdCBzdXBwb3J0IGV4cGlyeSB0aW1lIGdyZWF0ZXIgdGhhbiBhIHdlZWsgd2l0aCBTaWdWNCBzaWduaW5nLiIscmV0cnlhYmxlOiExfSk7ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldPXR9ZWxzZXtpZihuIT09ci5TaWduZXJzLlMzKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise21lc3NhZ2U6IlByZXNpZ25pbmcgb25seSBzdXBwb3J0cyBTMyBvciBTaWdWNCBzaWduaW5nLiIsY29kZToiVW5zdXBwb3J0ZWRTaWduZXIiLHJldHJ5YWJsZTohMX0pO3ZhciBvPWUuc2VydmljZT9lLnNlcnZpY2UuZ2V0U2tld0NvcnJlY3RlZERhdGUoKTpyLnV0aWwuZGF0ZS5nZXREYXRlKCk7ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldPXBhcnNlSW50KHIudXRpbC5kYXRlLnVuaXhUaW1lc3RhbXAobykrdCwxMCkudG9TdHJpbmcoKX19ZnVuY3Rpb24gYShlKXt2YXIgdD1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50LG49ci51dGlsLnVybFBhcnNlKGUuaHR0cFJlcXVlc3QucGF0aCksbz17fTtuLnNlYXJjaCYmKG89ci51dGlsLnF1ZXJ5U3RyaW5nUGFyc2Uobi5zZWFyY2guc3Vic3RyKDEpKSk7dmFyIHM9ZS5odHRwUmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24uc3BsaXQoIiAiKTtpZigiQVdTIj09PXNbMF0pcz1zWzFdLnNwbGl0KCI6Iiksby5TaWduYXR1cmU9cy5wb3AoKSxvLkFXU0FjY2Vzc0tleUlkPXMuam9pbigiOiIpLHIudXRpbC5lYWNoKGUuaHR0cFJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24oZSx0KXtlPT09aSYmKGU9IkV4cGlyZXMiKSwwPT09ZS5pbmRleE9mKCJ4LWFtei1tZXRhLSIpJiYoZGVsZXRlIG9bZV0sZT1lLnRvTG93ZXJDYXNlKCkpLG9bZV09dH0pKSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldLGRlbGV0ZSBvLkF1dGhvcml6YXRpb24sZGVsZXRlIG8uSG9zdDtlbHNlIGlmKCJBV1M0LUhNQUMtU0hBMjU2Ij09PXNbMF0pe3Muc2hpZnQoKTt2YXIgYT1zLmpvaW4oIiAiKS5tYXRjaCgvU2lnbmF0dXJlPSguKj8pKD86LHxcc3xccj9cbnwkKS8pWzFdO29bIlgtQW16LVNpZ25hdHVyZSJdPWEsZGVsZXRlIG8uRXhwaXJlc310LnBhdGhuYW1lPW4ucGF0aG5hbWUsdC5zZWFyY2g9ci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobyl9ci5TaWduZXJzLlByZXNpZ249byh7c2lnbjpmdW5jdGlvbihlLHQsbil7aWYoZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldPXR8fDM2MDAsZS5vbigiYnVpbGQiLHMpLGUub24oInNpZ24iLGEpLGUucmVtb3ZlTGlzdGVuZXIoImFmdGVyQnVpbGQiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5TRVRfQ09OVEVOVF9MRU5HVEgpLGUucmVtb3ZlTGlzdGVuZXIoImFmdGVyQnVpbGQiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5DT01QVVRFX1NIQTI1NiksZS5lbWl0KCJiZWZvcmVQcmVzaWduIixbZV0pLCFuKXtpZihlLmJ1aWxkKCksZS5yZXNwb25zZS5lcnJvcil0aHJvdyBlLnJlc3BvbnNlLmVycm9yO3JldHVybiByLnV0aWwudXJsRm9ybWF0KGUuaHR0cFJlcXVlc3QuZW5kcG9pbnQpfWUuYnVpbGQoKGZ1bmN0aW9uKCl7dGhpcy5yZXNwb25zZS5lcnJvcj9uKHRoaXMucmVzcG9uc2UuZXJyb3IpOm4obnVsbCxyLnV0aWwudXJsRm9ybWF0KGUuaHR0cFJlcXVlc3QuZW5kcG9pbnQpKX0pKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlByZXNpZ259LHsiLi4vY29yZSI6MTl9XSw2NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5SZXF1ZXN0U2lnbmVyPW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMucmVxdWVzdD1lfSxzZXRTZXJ2aWNlQ2xpZW50SWQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXJ2aWNlQ2xpZW50SWQ9ZX0sZ2V0U2VydmljZUNsaWVudElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VydmljZUNsaWVudElkfX0pLHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmdldFZlcnNpb249ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UidjIiOnJldHVybiByLlNpZ25lcnMuVjI7Y2FzZSJ2MyI6cmV0dXJuIHIuU2lnbmVycy5WMztjYXNlInMzdjQiOmNhc2UidjQiOnJldHVybiByLlNpZ25lcnMuVjQ7Y2FzZSJzMyI6cmV0dXJuIHIuU2lnbmVycy5TMztjYXNlInYzaHR0cHMiOnJldHVybiByLlNpZ25lcnMuVjNIdHRwcztjYXNlImJlYXJlciI6cmV0dXJuIHIuU2lnbmVycy5CZWFyZXJ9dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHNpZ25pbmcgdmVyc2lvbiAiK2UpfSxlKCIuL3YyIiksZSgiLi92MyIpLGUoIi4vdjNodHRwcyIpLGUoIi4vdjQiKSxlKCIuL3MzIiksZSgiLi9wcmVzaWduIiksZSgiLi9iZWFyZXIiKX0seyIuLi9jb3JlIjoxOSwiLi9iZWFyZXIiOjY0LCIuL3ByZXNpZ24iOjY1LCIuL3MzIjo2NywiLi92MiI6NjgsIi4vdjMiOjY5LCIuL3YzaHR0cHMiOjcwLCIuL3Y0Ijo3MX1dLDY3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5TaWduZXJzLlMzPW8oci5TaWduZXJzLlJlcXVlc3RTaWduZXIse3N1YlJlc291cmNlczp7YWNsOjEsYWNjZWxlcmF0ZToxLGFuYWx5dGljczoxLGNvcnM6MSxsaWZlY3ljbGU6MSxkZWxldGU6MSxpbnZlbnRvcnk6MSxsb2NhdGlvbjoxLGxvZ2dpbmc6MSxtZXRyaWNzOjEsbm90aWZpY2F0aW9uOjEscGFydE51bWJlcjoxLHBvbGljeToxLHJlcXVlc3RQYXltZW50OjEscmVwbGljYXRpb246MSxyZXN0b3JlOjEsdGFnZ2luZzoxLHRvcnJlbnQ6MSx1cGxvYWRJZDoxLHVwbG9hZHM6MSx2ZXJzaW9uSWQ6MSx2ZXJzaW9uaW5nOjEsdmVyc2lvbnM6MSx3ZWJzaXRlOjF9LHJlc3BvbnNlSGVhZGVyczp7InJlc3BvbnNlLWNvbnRlbnQtdHlwZSI6MSwicmVzcG9uc2UtY29udGVudC1sYW5ndWFnZSI6MSwicmVzcG9uc2UtZXhwaXJlcyI6MSwicmVzcG9uc2UtY2FjaGUtY29udHJvbCI6MSwicmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbiI6MSwicmVzcG9uc2UtY29udGVudC1lbmNvZGluZyI6MX0sYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMucmVxdWVzdC5oZWFkZXJzWyJwcmVzaWduZWQtZXhwaXJlcyJdfHwodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT1yLnV0aWwuZGF0ZS5yZmM4MjIodCkpLGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pO3ZhciBuPXRoaXMuc2lnbihlLnNlY3JldEFjY2Vzc0tleSx0aGlzLnN0cmluZ1RvU2lnbigpKSxvPSJBV1MgIitlLmFjY2Vzc0tleUlkKyI6IituO3RoaXMucmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb249b30sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZXF1ZXN0LHQ9W107dC5wdXNoKGUubWV0aG9kKSx0LnB1c2goZS5oZWFkZXJzWyJDb250ZW50LU1ENSJdfHwiIiksdC5wdXNoKGUuaGVhZGVyc1siQ29udGVudC1UeXBlIl18fCIiKSx0LnB1c2goZS5oZWFkZXJzWyJwcmVzaWduZWQtZXhwaXJlcyJdfHwiIik7dmFyIG49dGhpcy5jYW5vbmljYWxpemVkQW16SGVhZGVycygpO3JldHVybiBuJiZ0LnB1c2gobiksdC5wdXNoKHRoaXMuY2Fub25pY2FsaXplZFJlc291cmNlKCkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsaXplZEFtekhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyLnV0aWwuZWFjaCh0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24odCl7dC5tYXRjaCgvXngtYW16LS9pKSYmZS5wdXNoKHQpfSkpLGUuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPHQudG9Mb3dlckNhc2UoKT8tMToxfSkpO3ZhciB0PVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyxlLChmdW5jdGlvbihlKXt0LnB1c2goZS50b0xvd2VyQ2FzZSgpKyI6IitTdHJpbmcodGhpcy5yZXF1ZXN0LmhlYWRlcnNbZV0pKX0pKSx0LmpvaW4oIlxuIil9LGNhbm9uaWNhbGl6ZWRSZXNvdXJjZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdCx0PWUucGF0aC5zcGxpdCgiPyIpLG49dFswXSxvPXRbMV0saT0iIjtpZihlLnZpcnR1YWxIb3N0ZWRCdWNrZXQmJihpKz0iLyIrZS52aXJ0dWFsSG9zdGVkQnVja2V0KSxpKz1uLG8pe3ZhciBzPVtdO3IudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLG8uc3BsaXQoIiYiKSwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcGxpdCgiPSIpWzBdLG49ZS5zcGxpdCgiPSIpWzFdO2lmKHRoaXMuc3ViUmVzb3VyY2VzW3RdfHx0aGlzLnJlc3BvbnNlSGVhZGVyc1t0XSl7dmFyIHI9e25hbWU6dH07dm9pZCAwIT09biYmKHRoaXMuc3ViUmVzb3VyY2VzW3RdP3IudmFsdWU9bjpyLnZhbHVlPWRlY29kZVVSSUNvbXBvbmVudChuKSkscy5wdXNoKHIpfX0pKSxzLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubmFtZTx0Lm5hbWU/LTE6MX0pKSxzLmxlbmd0aCYmKG89W10sci51dGlsLmFycmF5RWFjaChzLChmdW5jdGlvbihlKXt2b2lkIDA9PT1lLnZhbHVlP28ucHVzaChlLm5hbWUpOm8ucHVzaChlLm5hbWUrIj0iK2UudmFsdWUpfSkpLGkrPSI/IitvLmpvaW4oIiYiKSl9cmV0dXJuIGl9LHNpZ246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUsdCwiYmFzZTY0Iiwic2hhMSIpfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuUzN9LHsiLi4vY29yZSI6MTl9XSw2ODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5WMj1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHthZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dHx8KHQ9ci51dGlsLmRhdGUuZ2V0RGF0ZSgpKTt2YXIgbj10aGlzLnJlcXVlc3Q7bi5wYXJhbXMuVGltZXN0YW1wPXIudXRpbC5kYXRlLmlzbzg2MDEodCksbi5wYXJhbXMuU2lnbmF0dXJlVmVyc2lvbj0iMiIsbi5wYXJhbXMuU2lnbmF0dXJlTWV0aG9kPSJIbWFjU0hBMjU2IixuLnBhcmFtcy5BV1NBY2Nlc3NLZXlJZD1lLmFjY2Vzc0tleUlkLGUuc2Vzc2lvblRva2VuJiYobi5wYXJhbXMuU2VjdXJpdHlUb2tlbj1lLnNlc3Npb25Ub2tlbiksZGVsZXRlIG4ucGFyYW1zLlNpZ25hdHVyZSxuLnBhcmFtcy5TaWduYXR1cmU9dGhpcy5zaWduYXR1cmUoZSksbi5ib2R5PXIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKG4ucGFyYW1zKSxuLmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl09bi5ib2R5Lmxlbmd0aH0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUpe3JldHVybiByLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSwiYmFzZTY0Iil9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlLnB1c2godGhpcy5yZXF1ZXN0Lm1ldGhvZCksZS5wdXNoKHRoaXMucmVxdWVzdC5lbmRwb2ludC5ob3N0LnRvTG93ZXJDYXNlKCkpLGUucHVzaCh0aGlzLnJlcXVlc3QucGF0aG5hbWUoKSksZS5wdXNoKHIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKHRoaXMucmVxdWVzdC5wYXJhbXMpKSxlLmpvaW4oIlxuIil9fSksdC5leHBvcnRzPXIuU2lnbmVycy5WMn0seyIuLi9jb3JlIjoxOX1dLDY5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5TaWduZXJzLlYzPW8oci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2FkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1yLnV0aWwuZGF0ZS5yZmM4MjIodCk7dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT1uLGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtem4tQXV0aG9yaXphdGlvbiJdPXRoaXMuYXV0aG9yaXphdGlvbihlLG4pfSxhdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJBV1MzIEFXU0FjY2Vzc0tleUlkPSIrZS5hY2Nlc3NLZXlJZCsiLEFsZ29yaXRobT1IbWFjU0hBMjU2LFNpZ25lZEhlYWRlcnM9Iit0aGlzLnNpZ25lZEhlYWRlcnMoKSsiLFNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUpfSxzaWduZWRIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2godGhpcy5oZWFkZXJzVG9TaWduKCksKGZ1bmN0aW9uKHQpe2UucHVzaCh0LnRvTG93ZXJDYXNlKCkpfSkpLGUuc29ydCgpLmpvaW4oIjsiKX0sY2Fub25pY2FsSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdC5oZWFkZXJzLHQ9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2godGhpcy5oZWFkZXJzVG9TaWduKCksKGZ1bmN0aW9uKG4pe3QucHVzaChuLnRvTG93ZXJDYXNlKCkudHJpbSgpKyI6IitTdHJpbmcoZVtuXSkudHJpbSgpKX0pKSx0LnNvcnQoKS5qb2luKCJcbiIpKyJcbiJ9LGhlYWRlcnNUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gci51dGlsLmVhY2godGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQpeygiSG9zdCI9PT10fHwiQ29udGVudC1FbmNvZGluZyI9PT10fHx0Lm1hdGNoKC9eWC1BbXovaSkpJiZlLnB1c2godCl9KSksZX0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUpe3JldHVybiByLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSwiYmFzZTY0Iil9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlLnB1c2godGhpcy5yZXF1ZXN0Lm1ldGhvZCksZS5wdXNoKCIvIiksZS5wdXNoKCIiKSxlLnB1c2godGhpcy5jYW5vbmljYWxIZWFkZXJzKCkpLGUucHVzaCh0aGlzLnJlcXVlc3QuYm9keSksci51dGlsLmNyeXB0by5zaGEyNTYoZS5qb2luKCJcbiIpKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlYzfSx7Ii4uL2NvcmUiOjE5fV0sNzA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtlKCIuL3YzIiksci5TaWduZXJzLlYzSHR0cHM9byhyLlNpZ25lcnMuVjMse2F1dGhvcml6YXRpb246ZnVuY3Rpb24oZSl7cmV0dXJuIkFXUzMtSFRUUFMgQVdTQWNjZXNzS2V5SWQ9IitlLmFjY2Vzc0tleUlkKyIsQWxnb3JpdGhtPUhtYWNTSEEyNTYsU2lnbmF0dXJlPSIrdGhpcy5zaWduYXR1cmUoZSl9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXotRGF0ZSJdfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjNIdHRwc30seyIuLi9jb3JlIjoxOSwiLi92MyI6Njl9XSw3MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4vdjRfY3JlZGVudGlhbHMiKSxpPXIudXRpbC5pbmhlcml0LHM9InByZXNpZ25lZC1leHBpcmVzIjtyLlNpZ25lcnMuVjQ9aShyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LG4pe3IuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmNhbGwodGhpcyxlKSx0aGlzLnNlcnZpY2VOYW1lPXQsbj1ufHx7fSx0aGlzLnNpZ25hdHVyZUNhY2hlPSJib29sZWFuIiE9dHlwZW9mIG4uc2lnbmF0dXJlQ2FjaGV8fG4uc2lnbmF0dXJlQ2FjaGUsdGhpcy5vcGVyYXRpb249bi5vcGVyYXRpb24sdGhpcy5zaWduYXR1cmVWZXJzaW9uPW4uc2lnbmF0dXJlVmVyc2lvbn0sYWxnb3JpdGhtOiJBV1M0LUhNQUMtU0hBMjU2IixhZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ci51dGlsLmRhdGUuaXNvODYwMSh0KS5yZXBsYWNlKC9bOlwtXXxcLlxkezN9L2csIiIpO3RoaXMuaXNQcmVzaWduZWQoKT90aGlzLnVwZGF0ZUZvclByZXNpZ25lZChlLG4pOnRoaXMuYWRkSGVhZGVycyhlLG4pLHRoaXMucmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb249dGhpcy5hdXRob3JpemF0aW9uKGUsbil9LGFkZEhlYWRlcnM6ZnVuY3Rpb24oZSx0KXt0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXotRGF0ZSJdPXQsZS5zZXNzaW9uVG9rZW4mJih0aGlzLnJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXT1lLnNlc3Npb25Ub2tlbil9LHVwZGF0ZUZvclByZXNpZ25lZDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlZGVudGlhbFN0cmluZyh0KSxvPXsiWC1BbXotRGF0ZSI6dCwiWC1BbXotQWxnb3JpdGhtIjp0aGlzLmFsZ29yaXRobSwiWC1BbXotQ3JlZGVudGlhbCI6ZS5hY2Nlc3NLZXlJZCsiLyIrbiwiWC1BbXotRXhwaXJlcyI6dGhpcy5yZXF1ZXN0LmhlYWRlcnNbc10sIlgtQW16LVNpZ25lZEhlYWRlcnMiOnRoaXMuc2lnbmVkSGVhZGVycygpfTtlLnNlc3Npb25Ub2tlbiYmKG9bIlgtQW16LVNlY3VyaXR5LVRva2VuIl09ZS5zZXNzaW9uVG9rZW4pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSYmKG9bIkNvbnRlbnQtVHlwZSJdPXRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSksdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTUQ1Il0mJihvWyJDb250ZW50LU1ENSJdPXRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LU1ENSJdKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siQ2FjaGUtQ29udHJvbCJdJiYob1siQ2FjaGUtQ29udHJvbCJdPXRoaXMucmVxdWVzdC5oZWFkZXJzWyJDYWNoZS1Db250cm9sIl0pLHIudXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24oZSx0KXtpZihlIT09cyYmdGhpcy5pc1NpZ25hYmxlSGVhZGVyKGUpKXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7MD09PW4uaW5kZXhPZigieC1hbXotbWV0YS0iKT9vW25dPXQ6MD09PW4uaW5kZXhPZigieC1hbXotIikmJihvW2VdPXQpfX0pKTt2YXIgaT10aGlzLnJlcXVlc3QucGF0aC5pbmRleE9mKCI/Iik+PTA/IiYiOiI/Ijt0aGlzLnJlcXVlc3QucGF0aCs9aStyLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyhvKX0sYXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPVtdLHI9dGhpcy5jcmVkZW50aWFsU3RyaW5nKHQpO3JldHVybiBuLnB1c2godGhpcy5hbGdvcml0aG0rIiBDcmVkZW50aWFsPSIrZS5hY2Nlc3NLZXlJZCsiLyIrciksbi5wdXNoKCJTaWduZWRIZWFkZXJzPSIrdGhpcy5zaWduZWRIZWFkZXJzKCkpLG4ucHVzaCgiU2lnbmF0dXJlPSIrdGhpcy5zaWduYXR1cmUoZSx0KSksbi5qb2luKCIsICIpfSxzaWduYXR1cmU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1vLmdldFNpZ25pbmdLZXkoZSx0LnN1YnN0cigwLDgpLHRoaXMucmVxdWVzdC5yZWdpb24sdGhpcy5zZXJ2aWNlTmFtZSx0aGlzLnNpZ25hdHVyZUNhY2hlKTtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKG4sdGhpcy5zdHJpbmdUb1NpZ24odCksImhleCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIHQucHVzaCgiQVdTNC1ITUFDLVNIQTI1NiIpLHQucHVzaChlKSx0LnB1c2godGhpcy5jcmVkZW50aWFsU3RyaW5nKGUpKSx0LnB1c2godGhpcy5oZXhFbmNvZGVkSGFzaCh0aGlzLmNhbm9uaWNhbFN0cmluZygpKSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXRoaXMucmVxdWVzdC5wYXRobmFtZSgpO3JldHVybiJzMyIhPT10aGlzLnNlcnZpY2VOYW1lJiYiczN2NCIhPT10aGlzLnNpZ25hdHVyZVZlcnNpb24mJih0PXIudXRpbC51cmlFc2NhcGVQYXRoKHQpKSxlLnB1c2godGhpcy5yZXF1ZXN0Lm1ldGhvZCksZS5wdXNoKHQpLGUucHVzaCh0aGlzLnJlcXVlc3Quc2VhcmNoKCkpLGUucHVzaCh0aGlzLmNhbm9uaWNhbEhlYWRlcnMoKSsiXG4iKSxlLnB1c2godGhpcy5zaWduZWRIZWFkZXJzKCkpLGUucHVzaCh0aGlzLmhleEVuY29kZWRCb2R5SGFzaCgpKSxlLmpvaW4oIlxuIil9LGNhbm9uaWNhbEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQsbil7ZS5wdXNoKFt0LG5dKX0pKSxlLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF0udG9Mb3dlckNhc2UoKTx0WzBdLnRvTG93ZXJDYXNlKCk/LTE6MX0pKTt2YXIgdD1bXTtyZXR1cm4gci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSl7dmFyIG49ZVswXS50b0xvd2VyQ2FzZSgpO2lmKHRoaXMuaXNTaWduYWJsZUhlYWRlcihuKSl7dmFyIG89ZVsxXTtpZihudWxsPT1vfHwiZnVuY3Rpb24iIT10eXBlb2Ygby50b1N0cmluZyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yKCJIZWFkZXIgIituKyIgY29udGFpbnMgaW52YWxpZCB2YWx1ZSIpLHtjb2RlOiJJbnZhbGlkSGVhZGVyIn0pO3QucHVzaChuKyI6Iit0aGlzLmNhbm9uaWNhbEhlYWRlclZhbHVlcyhvLnRvU3RyaW5nKCkpKX19KSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxIZWFkZXJWYWx1ZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXHMrL2csIiAiKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9LHNpZ25lZEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gci51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0KXt0PXQudG9Mb3dlckNhc2UoKSx0aGlzLmlzU2lnbmFibGVIZWFkZXIodCkmJmUucHVzaCh0KX0pKSxlLnNvcnQoKS5qb2luKCI7Iil9LGNyZWRlbnRpYWxTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIG8uY3JlYXRlU2NvcGUoZS5zdWJzdHIoMCw4KSx0aGlzLnJlcXVlc3QucmVnaW9uLHRoaXMuc2VydmljZU5hbWUpfSxoZXhFbmNvZGVkSGFzaDpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5zaGEyNTYoZSwiaGV4Iil9LGhleEVuY29kZWRCb2R5SGFzaDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdDtyZXR1cm4gdGhpcy5pc1ByZXNpZ25lZCgpJiZbInMzIiwiczMtb2JqZWN0LWxhbWJkYSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlTmFtZSk+LTEmJiFlLmJvZHk/IlVOU0lHTkVELVBBWUxPQUQiOmUuaGVhZGVyc1siWC1BbXotQ29udGVudC1TaGEyNTYiXT9lLmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il06dGhpcy5oZXhFbmNvZGVkSGFzaCh0aGlzLnJlcXVlc3QuYm9keXx8IiIpfSx1bnNpZ25hYmxlSGVhZGVyczpbImF1dGhvcml6YXRpb24iLCJjb250ZW50LXR5cGUiLCJjb250ZW50LWxlbmd0aCIsInVzZXItYWdlbnQiLHMsImV4cGVjdCIsIngtYW16bi10cmFjZS1pZCJdLGlzU2lnbmFibGVIZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigieC1hbXotIil8fHRoaXMudW5zaWduYWJsZUhlYWRlcnMuaW5kZXhPZihlKTwwfSxpc1ByZXNpZ25lZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5yZXF1ZXN0LmhlYWRlcnNbc119fSksdC5leHBvcnRzPXIuU2lnbmVycy5WNH0seyIuLi9jb3JlIjoxOSwiLi92NF9jcmVkZW50aWFscyI6NzJ9XSw3MjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXt9LGk9W10scz0iYXdzNF9yZXF1ZXN0Ijt0LmV4cG9ydHM9e2NyZWF0ZVNjb3BlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bZS5zdWJzdHIoMCw4KSx0LG4sc10uam9pbigiLyIpfSxnZXRTaWduaW5nS2V5OmZ1bmN0aW9uKGUsdCxuLGEsYyl7dmFyIHU9W3IudXRpbC5jcnlwdG8uaG1hYyhlLnNlY3JldEFjY2Vzc0tleSxlLmFjY2Vzc0tleUlkLCJiYXNlNjQiKSx0LG4sYV0uam9pbigiXyIpO2lmKChjPSExIT09YykmJnUgaW4gbylyZXR1cm4gb1t1XTt2YXIgbD1yLnV0aWwuY3J5cHRvLmhtYWMoIkFXUzQiK2Uuc2VjcmV0QWNjZXNzS2V5LHQsImJ1ZmZlciIpLHA9ci51dGlsLmNyeXB0by5obWFjKGwsbiwiYnVmZmVyIiksZD1yLnV0aWwuY3J5cHRvLmhtYWMocCxhLCJidWZmZXIiKSxoPXIudXRpbC5jcnlwdG8uaG1hYyhkLHMsImJ1ZmZlciIpO3JldHVybiBjJiYob1t1XT1oLGkucHVzaCh1KSxpLmxlbmd0aD41MCYmZGVsZXRlIG9baS5zaGlmdCgpXSksaH0sZW1wdHlDYWNoZTpmdW5jdGlvbigpe289e30saT1bXX19fSx7Ii4uL2NvcmUiOjE5fV0sNzM6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7dGhpcy5jdXJyZW50U3RhdGU9dHx8bnVsbCx0aGlzLnN0YXRlcz1lfHx7fX1yLnByb3RvdHlwZS5ydW5Ubz1mdW5jdGlvbihlLHQsbixyKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9bixuPXQsdD1lLGU9bnVsbCk7dmFyIG89dGhpcyxpPW8uc3RhdGVzW28uY3VycmVudFN0YXRlXTtpLmZuLmNhbGwobnx8byxyLChmdW5jdGlvbihyKXtpZihyKXtpZighaS5mYWlsKXJldHVybiB0P3QuY2FsbChuLHIpOm51bGw7by5jdXJyZW50U3RhdGU9aS5mYWlsfWVsc2V7aWYoIWkuYWNjZXB0KXJldHVybiB0P3QuY2FsbChuKTpudWxsO28uY3VycmVudFN0YXRlPWkuYWNjZXB0fWlmKG8uY3VycmVudFN0YXRlPT09ZSlyZXR1cm4gdD90LmNhbGwobixyKTpudWxsO28ucnVuVG8oZSx0LG4scil9KSl9LHIucHJvdG90eXBlLmFkZFN0YXRlPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLG49bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIG4mJihyPW4sbj1udWxsKSx0aGlzLmN1cnJlbnRTdGF0ZXx8KHRoaXMuY3VycmVudFN0YXRlPWUpLHRoaXMuc3RhdGVzW2VdPXthY2NlcHQ6dCxmYWlsOm4sZm46cn0sdGhpc30sdC5leHBvcnRzPXJ9LHt9XSw3NDpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuLHIpeyhmdW5jdGlvbigpe3ZhciBvLGk9e2Vudmlyb25tZW50OiJub2RlanMiLGVuZ2luZTpmdW5jdGlvbigpe2lmKGkuaXNCcm93c2VyKCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yKXJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O3ZhciBlPW4ucGxhdGZvcm0rIi8iK24udmVyc2lvbjtyZXR1cm4gbi5lbnYuQVdTX0VYRUNVVElPTl9FTlYmJihlKz0iIGV4ZWMtZW52LyIrbi5lbnYuQVdTX0VYRUNVVElPTl9FTlYpLGV9LHVzZXJBZ2VudDpmdW5jdGlvbigpe3ZhciB0PWkuZW52aXJvbm1lbnQsbj0iYXdzLXNkay0iK3QrIi8iK2UoIi4vY29yZSIpLlZFUlNJT047cmV0dXJuIm5vZGVqcyI9PT10JiYobis9IiAiK2kuZW5naW5lKCkpLG59LHVyaUVzY2FwZTpmdW5jdGlvbihlKXt2YXIgdD1lbmNvZGVVUklDb21wb25lbnQoZSk7cmV0dXJuIHQ9KHQ9dC5yZXBsYWNlKC9bXkEtWmEtejAtOV8uflwtJV0rL2csZXNjYXBlKSkucmVwbGFjZSgvWypdL2csKGZ1bmN0aW9uKGUpe3JldHVybiIlIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9KSl9LHVyaUVzY2FwZVBhdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIGkuYXJyYXlFYWNoKGUuc3BsaXQoIi8iKSwoZnVuY3Rpb24oZSl7dC5wdXNoKGkudXJpRXNjYXBlKGUpKX0pKSx0LmpvaW4oIi8iKX0sdXJsUGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGkudXJsLnBhcnNlKGUpfSx1cmxGb3JtYXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGkudXJsLmZvcm1hdChlKX0scXVlcnlTdHJpbmdQYXJzZTpmdW5jdGlvbihlKXtyZXR1cm4gaS5xdWVyeXN0cmluZy5wYXJzZShlKX0scXVlcnlQYXJhbXNUb1N0cmluZzpmdW5jdGlvbihlKXt2YXIgdD1bXSxuPWkudXJpRXNjYXBlLHI9T2JqZWN0LmtleXMoZSkuc29ydCgpO3JldHVybiBpLmFycmF5RWFjaChyLChmdW5jdGlvbihyKXt2YXIgbz1lW3JdLHM9bihyKSxhPXMrIj0iO2lmKEFycmF5LmlzQXJyYXkobykpe3ZhciBjPVtdO2kuYXJyYXlFYWNoKG8sKGZ1bmN0aW9uKGUpe2MucHVzaChuKGUpKX0pKSxhPXMrIj0iK2Muc29ydCgpLmpvaW4oIiYiK3MrIj0iKX1lbHNlIG51bGwhPW8mJihhPXMrIj0iK24obykpO3QucHVzaChhKX0pKSx0LmpvaW4oIiYiKX0scmVhZEZpbGVTeW5jOmZ1bmN0aW9uKHQpe3JldHVybiBpLmlzQnJvd3NlcigpP251bGw6ZSgiZnMiKS5yZWFkRmlsZVN5bmModCwidXRmLTgiKX0sYmFzZTY0OntlbmNvZGU6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgYmFzZTY0IGVuY29kZSBudW1iZXIgIitlKSk7cmV0dXJuIG51bGw9PWU/ZTppLmJ1ZmZlci50b0J1ZmZlcihlKS50b1N0cmluZygiYmFzZTY0Iil9LGRlY29kZTpmdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBiYXNlNjQgZGVjb2RlIG51bWJlciAiK2UpKTtyZXR1cm4gbnVsbD09ZT9lOmkuYnVmZmVyLnRvQnVmZmVyKGUsImJhc2U2NCIpfX0sYnVmZmVyOnt0b0J1ZmZlcjpmdW5jdGlvbihlLHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpLkJ1ZmZlci5mcm9tJiZpLkJ1ZmZlci5mcm9tIT09VWludDhBcnJheS5mcm9tP2kuQnVmZmVyLmZyb20oZSx0KTpuZXcgaS5CdWZmZXIoZSx0KX0sYWxsb2M6ZnVuY3Rpb24oZSx0LG4pe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInNpemUgcGFzc2VkIHRvIGFsbG9jIG11c3QgYmUgYSBudW1iZXIuIik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGkuQnVmZmVyLmFsbG9jKXJldHVybiBpLkJ1ZmZlci5hbGxvYyhlLHQsbik7dmFyIHI9bmV3IGkuQnVmZmVyKGUpO3JldHVybiB2b2lkIDAhPT10JiYiZnVuY3Rpb24iPT10eXBlb2Ygci5maWxsJiZyLmZpbGwodCx2b2lkIDAsdm9pZCAwLG4pLHJ9LHRvU3RyZWFtOmZ1bmN0aW9uKGUpe2kuQnVmZmVyLmlzQnVmZmVyKGUpfHwoZT1pLmJ1ZmZlci50b0J1ZmZlcihlKSk7dmFyIHQ9bmV3IGkuc3RyZWFtLlJlYWRhYmxlLG49MDtyZXR1cm4gdC5fcmVhZD1mdW5jdGlvbihyKXtpZihuPj1lLmxlbmd0aClyZXR1cm4gdC5wdXNoKG51bGwpO3ZhciBvPW4rcjtvPmUubGVuZ3RoJiYobz1lLmxlbmd0aCksdC5wdXNoKGUuc2xpY2UobixvKSksbj1vfSx0fSxjb25jYXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTAsbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspcis9ZVtuXS5sZW5ndGg7Zm9yKHQ9aS5idWZmZXIuYWxsb2Mociksbj0wO248ZS5sZW5ndGg7bisrKWVbbl0uY29weSh0LG8pLG8rPWVbbl0ubGVuZ3RoO3JldHVybiB0fX0sc3RyaW5nOntieXRlTGVuZ3RoOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1pLmJ1ZmZlci50b0J1ZmZlcih0KSksIm51bWJlciI9PXR5cGVvZiB0LmJ5dGVMZW5ndGgpcmV0dXJuIHQuYnl0ZUxlbmd0aDtpZigibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXJldHVybiB0Lmxlbmd0aDtpZigibnVtYmVyIj09dHlwZW9mIHQuc2l6ZSlyZXR1cm4gdC5zaXplO2lmKCJzdHJpbmciPT10eXBlb2YgdC5wYXRoKXJldHVybiBlKCJmcyIpLmxzdGF0U3luYyh0LnBhdGgpLnNpemU7dGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBkZXRlcm1pbmUgbGVuZ3RoIG9mICIrdCkse29iamVjdDp0fSl9LHVwcGVyRmlyc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0udG9VcHBlckNhc2UoKStlLnN1YnN0cigxKX0sbG93ZXJGaXJzdDpmdW5jdGlvbihlKXtyZXR1cm4gZVswXS50b0xvd2VyQ2FzZSgpK2Uuc3Vic3RyKDEpfX0saW5pOntwYXJzZTpmdW5jdGlvbihlKXt2YXIgdCxuPXt9O3JldHVybiBpLmFycmF5RWFjaChlLnNwbGl0KC9ccj9cbi8pLChmdW5jdGlvbihlKXtpZigiWyI9PT0oZT1lLnNwbGl0KC8oXnxccylbOyNdLylbMF0udHJpbSgpKVswXSYmIl0iPT09ZVtlLmxlbmd0aC0xXSl7aWYoIl9fcHJvdG9fXyI9PT0odD1lLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpKXx8Il9fcHJvdG9fXyI9PT10LnNwbGl0KC9ccy8pWzFdKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgbG9hZCBwcm9maWxlIG5hbWUgJyIrdCsiJyBmcm9tIHNoYXJlZCBpbmkgZmlsZS4iKSl9ZWxzZSBpZih0KXt2YXIgcj1lLmluZGV4T2YoIj0iKSxvPWUubGVuZ3RoLTE7aWYoLTEhPT1yJiYwIT09ciYmciE9PW8pe3ZhciBzPWUuc3Vic3RyaW5nKDAscikudHJpbSgpLGE9ZS5zdWJzdHJpbmcocisxKS50cmltKCk7blt0XT1uW3RdfHx7fSxuW3RdW3NdPWF9fX0pKSxufX0sZm46e25vb3A6ZnVuY3Rpb24oKXt9LGNhbGxiYWNrOmZ1bmN0aW9uKGUpe2lmKGUpdGhyb3cgZX0sbWFrZUFzeW5jOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJnQ8PWUubGVuZ3RoP2U6ZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7dC5wb3AoKShlLmFwcGx5KG51bGwsdCkpfX19LGRhdGU6e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gb3x8KG89ZSgiLi9jb3JlIikpLG8uY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0P25ldyBEYXRlKChuZXcgRGF0ZSkuZ2V0VGltZSgpK28uY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0KTpuZXcgRGF0ZX0saXNvODYwMTpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9aS5kYXRlLmdldERhdGUoKSksZS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuXGR7M31aJC8sIloiKX0scmZjODIyOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1pLmRhdGUuZ2V0RGF0ZSgpKSxlLnRvVVRDU3RyaW5nKCl9LHVuaXhUaW1lc3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWkuZGF0ZS5nZXREYXRlKCkpLGUuZ2V0VGltZSgpLzFlM30sZnJvbTpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/bmV3IERhdGUoMWUzKmUpOm5ldyBEYXRlKGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9Imlzbzg2MDEiKSxpLmRhdGVbdF0oaS5kYXRlLmZyb20oZSkpfSxwYXJzZVRpbWVzdGFtcDpmdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIG5ldyBEYXRlKDFlMyplKTtpZihlLm1hdGNoKC9eXGQrJC8pKXJldHVybiBuZXcgRGF0ZSgxZTMqZSk7aWYoZS5tYXRjaCgvXlxkezR9LykpcmV0dXJuIG5ldyBEYXRlKGUpO2lmKGUubWF0Y2goL15cd3szfSwvKSlyZXR1cm4gbmV3IERhdGUoZSk7dGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoInVuaGFuZGxlZCB0aW1lc3RhbXAgZm9ybWF0OiAiK2UpLHtjb2RlOiJUaW1lc3RhbXBQYXJzZXJFcnJvciJ9KX19LGNyeXB0bzp7Y3JjMzJUYWJsZTpbMCwxOTk2OTU5ODk0LDM5OTM5MTk3ODgsMjU2NzUyNDc5NCwxMjQ2MzQxMzcsMTg4NjA1NzYxNSwzOTE1NjIxNjg1LDI2NTczOTIwMzUsMjQ5MjY4Mjc0LDIwNDQ1MDgzMjQsMzc3MjExNTIzMCwyNTQ3MTc3ODY0LDE2Mjk0MTk5NSwyMTI1NTYxMDIxLDM4ODc2MDcwNDcsMjQyODQ0NDA0OSw0OTg1MzY1NDgsMTc4OTkyNzY2Niw0MDg5MDE2NjQ4LDIyMjcwNjEyMTQsNDUwNTQ4ODYxLDE4NDMyNTg2MDMsNDEwNzU4MDc1MywyMjExNjc3NjM5LDMyNTg4Mzk5MCwxNjg0Nzc3MTUyLDQyNTExMjIwNDIsMjMyMTkyNjYzNiwzMzU2MzM0ODcsMTY2MTM2NTQ2NSw0MTk1MzAyNzU1LDIzNjYxMTUzMTcsOTk3MDczMDk2LDEyODE5NTM4ODYsMzU3OTg1NTMzMiwyNzI0Njg4MjQyLDEwMDY4ODgxNDUsMTI1ODYwNzY4NywzNTI0MTAxNjI5LDI3Njg5NDI0NDMsOTAxMDk3NzIyLDExMTkwMDA2ODQsMzY4NjUxNzIwNiwyODk4MDY1NzI4LDg1MzA0NDQ1MSwxMTcyMjY2MTAxLDM3MDUwMTU3NTksMjg4MjYxNjY2NSw2NTE3Njc5ODAsMTM3MzUwMzU0NiwzMzY5NTU0MzA0LDMyMTgxMDQ1OTgsNTY1NTA3MjUzLDE0NTQ2MjE3MzEsMzQ4NTExMTcwNSwzMDk5NDM2MzAzLDY3MTI2Njk3NCwxNTk0MTk4MDI0LDMzMjI3MzA5MzAsMjk3MDM0NzgxMiw3OTU4MzU1MjcsMTQ4MzIzMDIyNSwzMjQ0MzY3Mjc1LDMwNjAxNDk1NjUsMTk5NDE0NjE5MiwzMTE1ODUzNCwyNTYzOTA3NzcyLDQwMjM3MTc5MzAsMTkwNzQ1OTQ2NSwxMTI2MzcyMTUsMjY4MDE1MzI1MywzOTA0NDI3MDU5LDIwMTM3NzYyOTAsMjUxNzIyMDM2LDI1MTcyMTUzNzQsMzc3NTgzMDA0MCwyMTM3NjU2NzYzLDE0MTM3NjgxMywyNDM5Mjc3NzE5LDM4NjUyNzEyOTcsMTgwMjE5NTQ0NCw0NzY4NjQ4NjYsMjIzODAwMTM2OCw0MDY2NTA4ODc4LDE4MTIzNzA5MjUsNDUzMDkyNzMxLDIxODE2MjUwMjUsNDExMTQ1MTIyMywxNzA2MDg4OTAyLDMxNDA0MjcwNCwyMzQ0NTMyMjAyLDQyNDAwMTc1MzIsMTY1ODY1ODI3MSwzNjY2MTk5NzcsMjM2MjY3MDMyMyw0MjI0OTk0NDA1LDEzMDM1MzU5NjAsOTg0OTYxNDg2LDI3NDcwMDcwOTIsMzU2OTAzNzUzOCwxMjU2MTcwODE3LDEwMzc2MDQzMTEsMjc2NTIxMDczMywzNTU0MDc5OTk1LDExMzEwMTQ1MDYsODc5Njc5OTk2LDI5MDkyNDM0NjIsMzY2Mzc3MTg1NiwxMTQxMTI0NDY3LDg1NTg0MjI3NywyODUyODAxNjMxLDM3MDg2NDg2NDksMTM0MjUzMzk0OCw2NTQ0NTkzMDYsMzE4ODM5NjA0OCwzMzczMDE1MTc0LDE0NjY0Nzk5MDksNTQ0MTc5NjM1LDMxMTA1MjM5MTMsMzQ2MjUyMjAxNSwxNTkxNjcxMDU0LDcwMjEzODc3NiwyOTY2NDYwNDUwLDMzNTI3OTk0MTIsMTUwNDkxODgwNyw3ODM1NTE4NzMsMzA4MjY0MDQ0MywzMjMzNDQyOTg5LDM5ODgyOTIzODQsMjU5NjI1NDY0Niw2MjMxNzA2OCwxOTU3ODEwODQyLDM5Mzk4NDU5NDUsMjY0NzgxNjExMSw4MTQ3MDk5NywxOTQzODAzNTIzLDM4MTQ5MTg5MzAsMjQ4OTU5NjgwNCwyMjUyNzQ0MzAsMjA1Mzc5MDM3NiwzODI2MTc1NzU1LDI0NjY5MDYwMTMsMTY3ODE2NzQzLDIwOTc2NTEzNzcsNDAyNzU1MjU4MCwyMjY1NDkwMzg2LDUwMzQ0NDA3MiwxNzYyMDUwODE0LDQxNTA0MTcyNDUsMjE1NDEyOTM1NSw0MjY1MjIyMjUsMTg1MjUwNzg3OSw0Mjc1MzEzNTI2LDIzMTIzMTc5MjAsMjgyNzUzNjI2LDE3NDI1NTU4NTIsNDE4OTcwODE0MywyMzk0ODc3OTQ1LDM5NzkxNzc2MywxNjIyMTgzNjM3LDM2MDQzOTA4ODgsMjcxNDg2NjU1OCw5NTM3Mjk3MzIsMTM0MDA3NjYyNiwzNTE4NzE5OTg1LDI3OTczNjA5OTksMTA2ODgyODM4MSwxMjE5NjM4ODU5LDM2MjQ3NDE4NTAsMjkzNjY3NTE0OCw5MDYxODU0NjIsMTA5MDgxMjUxMiwzNzQ3NjcyMDAzLDI4MjUzNzk2NjksODI5MzI5MTM1LDExODEzMzUxNjEsMzQxMjE3NzgwNCwzMTYwODM0ODQyLDYyODA4NTQwOCwxMzgyNjA1MzY2LDM0MjMzNjkxMDksMzEzODA3ODQ2Nyw1NzA1NjIyMzMsMTQyNjQwMDgxNSwzMzE3MzE2NTQyLDI5OTg3MzM2MDgsNzMzMjM5OTU0LDE1NTUyNjE5NTYsMzI2ODkzNTU5MSwzMDUwMzYwNjI1LDc1MjQ1OTQwMywxNTQxMzIwMjIxLDI2MDcwNzE5MjAsMzk2NTk3MzAzMCwxOTY5OTIyOTcyLDQwNzM1NDk4LDI2MTc4MzcyMjUsMzk0MzU3NzE1MSwxOTEzMDg3ODc3LDgzOTA4MzcxLDI1MTIzNDE2MzQsMzgwMzc0MDY5MiwyMDc1MjA4NjIyLDIxMzI2MTExMiwyNDYzMjcyNjAzLDM4NTU5OTAyODUsMjA5NDg1NDA3MSwxOTg5NTg4ODEsMjI2MjAyOTAxMiw0MDU3MjYwNjEwLDE3NTkzNTk5OTIsNTM0NDE0MTkwLDIxNzY3MTg1NDEsNDEzOTMyOTExNSwxODczODM2MDAxLDQxNDY2NDU2NywyMjgyMjQ4OTM0LDQyNzkyMDAzNjgsMTcxMTY4NDU1NCwyODUyODExMTYsMjQwNTgwMTcyNyw0MTY3MjE2NzQ1LDE2MzQ0Njc3OTUsMzc2MjI5NzAxLDI2ODUwNjc4OTYsMzYwODAwNzQwNiwxMzA4OTE4NjEyLDk1NjU0MzkzOCwyODA4NTU1MTA1LDM0OTU5NTgyNjMsMTIzMTYzNjMwMSwxMDQ3NDI3MDM1LDI5MzI5NTk4MTgsMzY1NDcwMzgzNiwxMDg4MzU5MjcwLDkzNjkxOGUzLDI4NDc3MTQ4OTksMzczNjgzNzgyOSwxMjAyOTAwODYzLDgxNzIzMzg5NywzMTgzMzQyMTA4LDM0MDEyMzcxMzAsMTQwNDI3NzU1Miw2MTU4MTgxNTAsMzEzNDIwNzQ5MywzNDUzNDIxMjAzLDE0MjM4NTc0NDksNjAxNDUwNDMxLDMwMDk4Mzc2MTQsMzI5NDcxMDQ1NiwxNTY3MTAzNzQ2LDcxMTkyODcyNCwzMDIwNjY4NDcxLDMyNzIzODAwNjUsMTUxMDMzNDIzNSw3NTUxNjcxMTddLGNyYzMyOmZ1bmN0aW9uKGUpe3ZhciB0PWkuY3J5cHRvLmNyYzMyVGFibGUsbj0tMTsic3RyaW5nIj09dHlwZW9mIGUmJihlPWkuYnVmZmVyLnRvQnVmZmVyKGUpKTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyluPW4+Pj44XnRbMjU1JihuXmUucmVhZFVJbnQ4KHIpKV07cmV0dXJuKC0xXm4pPj4+MH0saG1hYzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbnx8KG49ImJpbmFyeSIpLCJidWZmZXIiPT09biYmKG49dm9pZCAwKSxyfHwocj0ic2hhMjU2IiksInN0cmluZyI9PXR5cGVvZiB0JiYodD1pLmJ1ZmZlci50b0J1ZmZlcih0KSksaS5jcnlwdG8ubGliLmNyZWF0ZUhtYWMocixlKS51cGRhdGUodCkuZGlnZXN0KG4pfSxtZDU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBpLmNyeXB0by5oYXNoKCJtZDUiLGUsdCxuKX0sc2hhMjU2OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaS5jcnlwdG8uaGFzaCgic2hhMjU2IixlLHQsbil9LGhhc2g6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89aS5jcnlwdG8uY3JlYXRlSGFzaChlKTtufHwobj0iYmluYXJ5IiksImJ1ZmZlciI9PT1uJiYobj12b2lkIDApLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5idWZmZXIudG9CdWZmZXIodCkpO3ZhciBzPWkuYXJyYXlTbGljZUZuKHQpLGE9aS5CdWZmZXIuaXNCdWZmZXIodCk7aWYoaS5pc0Jyb3dzZXIoKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmKGE9ITApLHImJiJvYmplY3QiPT10eXBlb2YgdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQub24mJiFhKXQub24oImRhdGEiLChmdW5jdGlvbihlKXtvLnVwZGF0ZShlKX0pKSx0Lm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe3IoZSl9KSksdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtyKG51bGwsby5kaWdlc3QobikpfSkpO2Vsc2V7aWYoIXJ8fCFzfHxhfHwidW5kZWZpbmVkIj09dHlwZW9mIEZpbGVSZWFkZXIpe2kuaXNCcm93c2VyKCkmJiJvYmplY3QiPT10eXBlb2YgdCYmIWEmJih0PW5ldyBpLkJ1ZmZlcihuZXcgVWludDhBcnJheSh0KSkpO3ZhciBjPW8udXBkYXRlKHQpLmRpZ2VzdChuKTtyZXR1cm4gciYmcihudWxsLGMpLGN9dmFyIHU9MCxsPW5ldyBGaWxlUmVhZGVyO2wub25lcnJvcj1mdW5jdGlvbigpe3IobmV3IEVycm9yKCJGYWlsZWQgdG8gcmVhZCBkYXRhLiIpKX0sbC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgaS5CdWZmZXIobmV3IFVpbnQ4QXJyYXkobC5yZXN1bHQpKTtvLnVwZGF0ZShlKSx1Kz1lLmxlbmd0aCxsLl9jb250aW51ZVJlYWRpbmcoKX0sbC5fY29udGludWVSZWFkaW5nPWZ1bmN0aW9uKCl7aWYodT49dC5zaXplKXIobnVsbCxvLmRpZ2VzdChuKSk7ZWxzZXt2YXIgZT11KzUyNDI4ODtlPnQuc2l6ZSYmKGU9dC5zaXplKSxsLnJlYWRBc0FycmF5QnVmZmVyKHMuY2FsbCh0LHUsZSkpfX0sbC5fY29udGludWVSZWFkaW5nKCl9fSx0b0hleDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaCgoIjAiK2UuY2hhckNvZGVBdChuKS50b1N0cmluZygxNikpLnN1YnN0cigtMiwyKSk7cmV0dXJuIHQuam9pbigiIil9LGNyZWF0ZUhhc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY3J5cHRvLmxpYi5jcmVhdGVIYXNoKGUpfX0sYWJvcnQ6e30sZWFjaDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LmNhbGwodGhpcyxuLGVbbl0pPT09aS5hYm9ydClicmVha30sYXJyYXlFYWNoOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnQuY2FsbCh0aGlzLGVbbl0scGFyc2VJbnQobiwxMCkpPT09aS5hYm9ydClicmVha30sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkuZWFjaCh0LChmdW5jdGlvbih0LG4pe2VbdF09bn0pKSxlfSxtZXJnZTpmdW5jdGlvbihlLHQpe3JldHVybiBpLnVwZGF0ZShpLmNvcHkoZSksdCl9LGNvcHk6ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSl0W25dPWVbbl07cmV0dXJuIHR9LGlzRW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkpcmV0dXJuITE7cmV0dXJuITB9LGFycmF5U2xpY2VGbjpmdW5jdGlvbihlKXt2YXIgdD1lLnNsaWNlfHxlLndlYmtpdFNsaWNlfHxlLm1velNsaWNlO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbH0saXNUeXBlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PWkudHlwZU5hbWUodCkpLE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKT09PSJbb2JqZWN0ICIrdCsiXSJ9LHR5cGVOYW1lOmZ1bmN0aW9uKGUpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikpcmV0dXJuIGUubmFtZTt2YXIgdD1lLnRvU3RyaW5nKCksbj10Lm1hdGNoKC9eXHMqZnVuY3Rpb24gKC4rKVwoLyk7cmV0dXJuIG4/blsxXTp0fSxlcnJvcjpmdW5jdGlvbihlLHQpe3ZhciBuPW51bGw7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlLm1lc3NhZ2UmJiIiIT09ZS5tZXNzYWdlJiYoInN0cmluZyI9PXR5cGVvZiB0fHx0JiZ0Lm1lc3NhZ2UpJiYoKG49aS5jb3B5KGUpKS5tZXNzYWdlPWUubWVzc2FnZSksZS5tZXNzYWdlPWUubWVzc2FnZXx8bnVsbCwic3RyaW5nIj09dHlwZW9mIHQ/ZS5tZXNzYWdlPXQ6Im9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dCYmKGkudXBkYXRlKGUsdCksdC5tZXNzYWdlJiYoZS5tZXNzYWdlPXQubWVzc2FnZSksKHQuY29kZXx8dC5uYW1lKSYmKGUuY29kZT10LmNvZGV8fHQubmFtZSksdC5zdGFjayYmKGUuc3RhY2s9dC5zdGFjaykpLCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkmJihPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibmFtZSIse3dyaXRhYmxlOiEwLGVudW1lcmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibWVzc2FnZSIse2VudW1lcmFibGU6ITB9KSksZS5uYW1lPVN0cmluZyh0JiZ0Lm5hbWV8fGUubmFtZXx8ZS5jb2RlfHwiRXJyb3IiKSxlLnRpbWU9bmV3IERhdGUsbiYmKGUub3JpZ2luYWxFcnJvcj1uKSxlfSxpbmhlcml0OmZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbDtpZih2b2lkIDA9PT10KXQ9ZSxlPU9iamVjdCxuPXt9O2Vsc2V7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLG49bmV3IHJ9cmV0dXJuIHQuY29uc3RydWN0b3I9PT1PYmplY3QmJih0LmNvbnN0cnVjdG9yPWZ1bmN0aW9uKCl7aWYoZSE9PU9iamVjdClyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSx0LmNvbnN0cnVjdG9yLnByb3RvdHlwZT1uLGkudXBkYXRlKHQuY29uc3RydWN0b3IucHJvdG90eXBlLHQpLHQuY29uc3RydWN0b3IuX19zdXBlcl9fPWUsdC5jb25zdHJ1Y3Rvcn0sbWl4aW46ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWZvcih2YXIgbiBpbiBhcmd1bWVudHNbdF0ucHJvdG90eXBlKXt2YXIgcj1hcmd1bWVudHNbdF0ucHJvdG90eXBlW25dOyJjb25zdHJ1Y3RvciIhPT1uJiYoZS5wcm90b3R5cGVbbl09cil9cmV0dXJuIGV9LGhpZGVQcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSYmaS5hcnJheUVhY2godCwoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX0pKX0scHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6dm9pZCAwPT09cnx8cn07ImZ1bmN0aW9uIiE9dHlwZW9mIG58fG8/KGkudmFsdWU9bixpLndyaXRhYmxlPSEwKTppLmdldD1uLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsaSl9LG1lbW9pemVkUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89bnVsbDtpLnByb3BlcnR5KGUsdCwoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PW8mJihvPW4oKSksb30pLHIpfSxob2lzdFBheWxvYWRNZW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5vcGVyYXRpb24scj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbbl0sbz1yLm91dHB1dDtpZihvLnBheWxvYWQmJiFyLmhhc0V2ZW50T3V0cHV0KXt2YXIgcz1vLm1lbWJlcnNbby5wYXlsb2FkXSxhPWUuZGF0YVtvLnBheWxvYWRdOyJzdHJ1Y3R1cmUiPT09cy50eXBlJiZpLmVhY2goYSwoZnVuY3Rpb24odCxuKXtpLnByb3BlcnR5KGUuZGF0YSx0LG4sITEpfSkpfX0sY29tcHV0ZVNoYTI1NjpmdW5jdGlvbih0LG4pe2lmKGkuaXNOb2RlKCkpe3ZhciByPWkuc3RyZWFtLlN0cmVhbSxvPWUoImZzIik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHImJnQgaW5zdGFuY2VvZiByKXtpZigic3RyaW5nIiE9dHlwZW9mIHQucGF0aClyZXR1cm4gbihuZXcgRXJyb3IoIk5vbi1maWxlIHN0cmVhbSBvYmplY3RzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggU2lnVjQiKSk7dmFyIHM9e307Im51bWJlciI9PXR5cGVvZiB0LnN0YXJ0JiYocy5zdGFydD10LnN0YXJ0KSwibnVtYmVyIj09dHlwZW9mIHQuZW5kJiYocy5lbmQ9dC5lbmQpLHQ9by5jcmVhdGVSZWFkU3RyZWFtKHQucGF0aCxzKX19aS5jcnlwdG8uc2hhMjU2KHQsImhleCIsKGZ1bmN0aW9uKGUsdCl7ZT9uKGUpOm4obnVsbCx0KX0pKX0saXNDbG9ja1NrZXdlZDpmdW5jdGlvbihlKXtpZihlKXJldHVybiBpLnByb3BlcnR5KG8uY29uZmlnLCJpc0Nsb2NrU2tld2VkIixNYXRoLmFicygobmV3IERhdGUpLmdldFRpbWUoKS1lKT49M2U1LCExKSxvLmNvbmZpZy5pc0Nsb2NrU2tld2VkfSxhcHBseUNsb2NrT2Zmc2V0OmZ1bmN0aW9uKGUpe2UmJihvLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldD1lLShuZXcgRGF0ZSkuZ2V0VGltZSgpKX0sZXh0cmFjdFJlcXVlc3RJZDpmdW5jdGlvbihlKXt2YXIgdD1lLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl18fGUuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16bi1yZXF1ZXN0aWQiXTshdCYmZS5kYXRhJiZlLmRhdGEuUmVzcG9uc2VNZXRhZGF0YSYmKHQ9ZS5kYXRhLlJlc3BvbnNlTWV0YWRhdGEuUmVxdWVzdElkKSx0JiYoZS5yZXF1ZXN0SWQ9dCksZS5lcnJvciYmKGUuZXJyb3IucmVxdWVzdElkPXQpfSxhZGRQcm9taXNlczpmdW5jdGlvbihlLHQpe3ZhciBuPSExO3ZvaWQgMD09PXQmJm8mJm8uY29uZmlnJiYodD1vLmNvbmZpZy5nZXRQcm9taXNlc0RlcGVuZGVuY3koKSksdm9pZCAwPT09dCYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlJiYodD1Qcm9taXNlKSwiZnVuY3Rpb24iIT10eXBlb2YgdCYmKG49ITApLEFycmF5LmlzQXJyYXkoZSl8fChlPVtlXSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07bj9pLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzJiZpLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzKCk6aS5hZGRQcm9taXNlc1RvQ2xhc3MmJmkuYWRkUHJvbWlzZXNUb0NsYXNzKHQpfX0scHJvbWlzaWZ5TWV0aG9kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIG5ldyB0KChmdW5jdGlvbih0LG8pe3IucHVzaCgoZnVuY3Rpb24oZSxuKXtlP28oZSk6dChuKX0pKSxuW2VdLmFwcGx5KG4scil9KSl9fSxpc0R1YWxzdGFja0F2YWlsYWJsZTpmdW5jdGlvbih0KXtpZighdClyZXR1cm4hMTt2YXIgbj1lKCIuLi9hcGlzL21ldGFkYXRhLmpzb24iKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJih0PXQuc2VydmljZUlkZW50aWZpZXIpLCEoInN0cmluZyIhPXR5cGVvZiB0fHwhbi5oYXNPd25Qcm9wZXJ0eSh0KXx8IW5bdF0uZHVhbHN0YWNrQXZhaWxhYmxlKX0sY2FsY3VsYXRlUmV0cnlEZWxheTpmdW5jdGlvbihlLHQsbil7dHx8KHQ9e30pO3ZhciByPXQuY3VzdG9tQmFja29mZnx8bnVsbDtpZigiZnVuY3Rpb24iPT10eXBlb2YgcilyZXR1cm4gcihlLG4pO3ZhciBvPSJudW1iZXIiPT10eXBlb2YgdC5iYXNlP3QuYmFzZToxMDA7cmV0dXJuIE1hdGgucmFuZG9tKCkqKE1hdGgucG93KDIsZSkqbyl9LGhhbmRsZVJlcXVlc3RXaXRoUmV0cmllczpmdW5jdGlvbihlLHQsbil7dHx8KHQ9e30pO3ZhciByPW8uSHR0cENsaWVudC5nZXRJbnN0YW5jZSgpLHM9dC5odHRwT3B0aW9uc3x8e30sYT0wLGM9ZnVuY3Rpb24oZSl7dmFyIHI9dC5tYXhSZXRyaWVzfHwwO2lmKGUmJiJUaW1lb3V0RXJyb3IiPT09ZS5jb2RlJiYoZS5yZXRyeWFibGU9ITApLGUmJmUucmV0cnlhYmxlJiZhPHIpe3ZhciBvPWkuY2FsY3VsYXRlUmV0cnlEZWxheShhLHQucmV0cnlEZWxheU9wdGlvbnMsZSk7aWYobz49MClyZXR1cm4gYSsrLHZvaWQgc2V0VGltZW91dCh1LG8rKGUucmV0cnlBZnRlcnx8MCkpfW4oZSl9LHU9ZnVuY3Rpb24oKXt2YXIgdD0iIjtyLmhhbmRsZVJlcXVlc3QoZSxzLChmdW5jdGlvbihlKXtlLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7dCs9ZS50b1N0cmluZygpfSkpLGUub24oImVuZCIsKGZ1bmN0aW9uKCl7dmFyIHI9ZS5zdGF0dXNDb2RlO2lmKHI8MzAwKW4obnVsbCx0KTtlbHNle3ZhciBvPTFlMypwYXJzZUludChlLmhlYWRlcnNbInJldHJ5LWFmdGVyIl0sMTApfHwwLHM9aS5lcnJvcihuZXcgRXJyb3Ise3N0YXR1c0NvZGU6cixyZXRyeWFibGU6cj49NTAwfHw0Mjk9PT1yfSk7byYmcy5yZXRyeWFibGUmJihzLnJldHJ5QWZ0ZXI9byksYyhzKX19KSl9KSxjKX07by51dGlsLmRlZmVyKHUpfSx1dWlkOnt2NDpmdW5jdGlvbigpe3JldHVybiBlKCJ1dWlkIikudjQoKX19LGNvbnZlcnRQYXlsb2FkVG9TdHJpbmc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5vcGVyYXRpb24scj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbbl0ub3V0cHV0fHx7fTtyLnBheWxvYWQmJmUuZGF0YVtyLnBheWxvYWRdJiYoZS5kYXRhW3IucGF5bG9hZF09ZS5kYXRhW3IucGF5bG9hZF0udG9TdHJpbmcoKSl9LGRlZmVyOmZ1bmN0aW9uKGUpeyJvYmplY3QiPT10eXBlb2YgbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4ubmV4dFRpY2s/bi5uZXh0VGljayhlKToiZnVuY3Rpb24iPT10eXBlb2Ygcj9yKGUpOnNldFRpbWVvdXQoZSwwKX0sZ2V0UmVxdWVzdFBheWxvYWRTaGFwZTpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnM7aWYodCl7dmFyIG49KHR8fHt9KVtlLm9wZXJhdGlvbl07aWYobiYmbi5pbnB1dCYmbi5pbnB1dC5wYXlsb2FkKXJldHVybiBuLmlucHV0Lm1lbWJlcnNbbi5pbnB1dC5wYXlsb2FkXX19LGdldFByb2ZpbGVzRnJvbVNoYXJlZENvbmZpZzpmdW5jdGlvbihlLHQpe3ZhciByPXt9LG89e307bi5lbnZbaS5jb25maWdPcHRJbkVudl0mJihvPWUubG9hZEZyb20oe2lzQ29uZmlnOiEwLGZpbGVuYW1lOm4uZW52W2kuc2hhcmVkQ29uZmlnRmlsZUVudl19KSk7dmFyIHM9e307dHJ5e3M9ZS5sb2FkRnJvbSh7ZmlsZW5hbWU6dHx8bi5lbnZbaS5jb25maWdPcHRJbkVudl0mJm4uZW52W2kuc2hhcmVkQ3JlZGVudGlhbHNGaWxlRW52XX0pfWNhdGNoKGUpe2lmKCFuLmVudltpLmNvbmZpZ09wdEluRW52XSl0aHJvdyBlfWZvcih2YXIgYT0wLGM9T2JqZWN0LmtleXMobyk7YTxjLmxlbmd0aDthKyspcltjW2FdXT11KHJbY1thXV18fHt9LG9bY1thXV0pO2ZvcihhPTAsYz1PYmplY3Qua2V5cyhzKTthPGMubGVuZ3RoO2ErKylyW2NbYV1dPXUocltjW2FdXXx8e30sc1tjW2FdXSk7cmV0dXJuIHI7ZnVuY3Rpb24gdShlLHQpe2Zvcih2YXIgbj0wLHI9T2JqZWN0LmtleXModCk7bjxyLmxlbmd0aDtuKyspZVtyW25dXT10W3Jbbl1dO3JldHVybiBlfX0sQVJOOnt2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmMD09PWUuaW5kZXhPZigiYXJuOiIpJiZlLnNwbGl0KCI6IikubGVuZ3RoPj02fSxwYXJzZTpmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCI6Iik7cmV0dXJue3BhcnRpdGlvbjp0WzFdLHNlcnZpY2U6dFsyXSxyZWdpb246dFszXSxhY2NvdW50SWQ6dFs0XSxyZXNvdXJjZTp0LnNsaWNlKDUpLmpvaW4oIjoiKX19LGJ1aWxkOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUuc2VydmljZXx8dm9pZCAwPT09ZS5yZWdpb258fHZvaWQgMD09PWUuYWNjb3VudElkfHx2b2lkIDA9PT1lLnJlc291cmNlKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJJbnB1dCBBUk4gb2JqZWN0IGlzIGludmFsaWQiKSk7cmV0dXJuImFybjoiKyhlLnBhcnRpdGlvbnx8ImF3cyIpKyI6IitlLnNlcnZpY2UrIjoiK2UucmVnaW9uKyI6IitlLmFjY291bnRJZCsiOiIrZS5yZXNvdXJjZX19LGRlZmF1bHRQcm9maWxlOiJkZWZhdWx0Iixjb25maWdPcHRJbkVudjoiQVdTX1NES19MT0FEX0NPTkZJRyIsc2hhcmVkQ3JlZGVudGlhbHNGaWxlRW52OiJBV1NfU0hBUkVEX0NSRURFTlRJQUxTX0ZJTEUiLHNoYXJlZENvbmZpZ0ZpbGVFbnY6IkFXU19DT05GSUdfRklMRSIsaW1kc0Rpc2FibGVkRW52OiJBV1NfRUMyX01FVEFEQVRBX0RJU0FCTEVEIn07dC5leHBvcnRzPWl9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIiksZSgidGltZXJzIikuc2V0SW1tZWRpYXRlKX0seyIuLi9hcGlzL21ldGFkYXRhLmpzb24iOjQsIi4vY29yZSI6MTksX3Byb2Nlc3M6OTIsZnM6ODIsdGltZXJzOjk5LHV1aWQ6MTAyfV0sNzU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuLi9tb2RlbC9zaGFwZSIpO2Z1bmN0aW9uIGkoKXt9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgbj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpLHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspaWYobltyXS5wYXJlbnROb2RlPT09ZSlyZXR1cm4gbltyXX1mdW5jdGlvbiBhKGUsdCl7c3dpdGNoKHR8fCh0PXt9KSx0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gYyhlLHQpO2Nhc2UibWFwIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49e30scj10LmtleS5uYW1lfHwia2V5IixvPXQudmFsdWUubmFtZXx8InZhbHVlIixpPXQuZmxhdHRlbmVkP3QubmFtZToiZW50cnkiLGM9ZS5maXJzdEVsZW1lbnRDaGlsZDtjOyl7aWYoYy5ub2RlTmFtZT09PWkpe3ZhciB1PXMoYyxyKS50ZXh0Q29udGVudCxsPXMoYyxvKTtuW3VdPWEobCx0LnZhbHVlKX1jPWMubmV4dEVsZW1lbnRTaWJsaW5nfXJldHVybiBufShlLHQpO2Nhc2UibGlzdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9dC5mbGF0dGVuZWQ/dC5uYW1lOnQubWVtYmVyLm5hbWV8fCJtZW1iZXIiLG89ZS5maXJzdEVsZW1lbnRDaGlsZDtvOylvLm5vZGVOYW1lPT09ciYmbi5wdXNoKGEobyx0Lm1lbWJlcikpLG89by5uZXh0RWxlbWVudFNpYmxpbmc7cmV0dXJuIG59KGUsdCk7Y2FzZSB2b2lkIDA6Y2FzZSBudWxsOnJldHVybiBmdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiIiO2lmKCFlLmZpcnN0RWxlbWVudENoaWxkKXJldHVybiBudWxsPT09ZS5wYXJlbnROb2RlLnBhcmVudE5vZGU/e306MD09PWUuY2hpbGROb2Rlcy5sZW5ndGg/IiI6ZS50ZXh0Q29udGVudDtmb3IodmFyIHQ9e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX0sbj1lLmZpcnN0RWxlbWVudENoaWxkO247KXt2YXIgcj1uLm5vZGVOYW1lO09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0Lm1lbWJlcnMscik/dC5tZW1iZXJzW3JdLnR5cGU9Imxpc3QiOnQubWVtYmVyc1tyXT17bmFtZTpyfSxuPW4ubmV4dEVsZW1lbnRTaWJsaW5nfXJldHVybiBjKGUsdCl9KGUpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoZS5nZXRBdHRyaWJ1dGUpe3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJlbmNvZGluZyIpOyJiYXNlNjQiPT09biYmKHQ9bmV3IG8uY3JlYXRlKHt0eXBlOm59KSl9dmFyIHI9ZS50ZXh0Q29udGVudDtyZXR1cm4iIj09PXImJihyPW51bGwpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRvVHlwZT90LnRvVHlwZShyKTpyfShlLHQpfX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49e307cmV0dXJuIG51bGw9PT1lfHxyLmVhY2godC5tZW1iZXJzLChmdW5jdGlvbihyLG8pe2lmKG8uaXNYbWxBdHRyaWJ1dGUpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLmF0dHJpYnV0ZXMsby5uYW1lKSl7dmFyIGk9ZS5hdHRyaWJ1dGVzW28ubmFtZV0udmFsdWU7bltyXT1hKHt0ZXh0Q29udGVudDppfSxvKX19ZWxzZXt2YXIgYz1vLmZsYXR0ZW5lZD9lOnMoZSxvLm5hbWUpO2M/bltyXT1hKGMsbyk6by5mbGF0dGVuZWR8fCJsaXN0IiE9PW8udHlwZXx8dC5hcGkueG1sTm9EZWZhdWx0TGlzdHN8fChuW3JdPW8uZGVmYXVsdFZhbHVlKX19KSksbn1pLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQpe2lmKCIiPT09ZS5yZXBsYWNlKC9eXHMrLywiIikpcmV0dXJue307dmFyIG4sbzt0cnl7aWYod2luZG93LkRPTVBhcnNlcil7dHJ5e249KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L3htbCIpfWNhdGNoKGUpe3Rocm93IHIuZXJyb3IobmV3IEVycm9yKCJQYXJzZSBlcnJvciBpbiBkb2N1bWVudCIpLHtvcmlnaW5hbEVycm9yOmUsY29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfWlmKG51bGw9PT1uLmRvY3VtZW50RWxlbWVudCl0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IHBhcnNlIGVtcHR5IGRvY3VtZW50LiIpLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSk7dmFyIGk9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKVswXTtpZihpJiYoaS5wYXJlbnROb2RlPT09bnx8ImJvZHkiPT09aS5wYXJlbnROb2RlLm5vZGVOYW1lfHxpLnBhcmVudE5vZGUucGFyZW50Tm9kZT09PW58fCJib2R5Ij09PWkucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSl7dmFyIGM9aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2IilbMF18fGk7dGhyb3cgci5lcnJvcihuZXcgRXJyb3IoYy50ZXh0Q29udGVudHx8IlBhcnNlciBlcnJvciBpbiBkb2N1bWVudCIpLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSl9fWVsc2V7aWYoIXdpbmRvdy5BY3RpdmVYT2JqZWN0KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgWE1MIHBhcnNlciIpO2lmKChuPW5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpKS5hc3luYz0hMSwhbi5sb2FkWE1MKGUpKXRocm93IHIuZXJyb3IobmV3IEVycm9yKCJQYXJzZSBlcnJvciBpbiBkb2N1bWVudCIpLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSl9fWNhdGNoKGUpe289ZX1pZihuJiZuLmRvY3VtZW50RWxlbWVudCYmIW8pe3ZhciB1PWEobi5kb2N1bWVudEVsZW1lbnQsdCksbD1zKG4uZG9jdW1lbnRFbGVtZW50LCJSZXNwb25zZU1ldGFkYXRhIik7cmV0dXJuIGwmJih1LlJlc3BvbnNlTWV0YWRhdGE9YShsLHt9KSksdX1pZihvKXRocm93IHIuZXJyb3Iob3x8bmV3IEVycm9yLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSk7cmV0dXJue319LHQuZXhwb3J0cz1pfSx7Ii4uL21vZGVsL3NoYXBlIjo0NSwiLi4vdXRpbCI6NzR9XSw3NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4veG1sLW5vZGUiKS5YbWxOb2RlLGk9ZSgiLi94bWwtdGV4dCIpLlhtbFRleHQ7ZnVuY3Rpb24gcygpe31mdW5jdGlvbiBhKGUsdCxuKXtzd2l0Y2gobi50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtyLmFycmF5RWFjaChuLm1lbWJlck5hbWVzLChmdW5jdGlvbihyKXt2YXIgaT1uLm1lbWJlcnNbcl07aWYoImJvZHkiPT09aS5sb2NhdGlvbil7dmFyIHM9dFtyXSx1PWkubmFtZTtpZihudWxsIT1zKWlmKGkuaXNYbWxBdHRyaWJ1dGUpZS5hZGRBdHRyaWJ1dGUodSxzKTtlbHNlIGlmKGkuZmxhdHRlbmVkKWEoZSxzLGkpO2Vsc2V7dmFyIGw9bmV3IG8odSk7ZS5hZGRDaGlsZE5vZGUobCksYyhsLGkpLGEobCxzLGkpfX19KSl9KGUsdCxuKTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uLmtleS5uYW1lfHwia2V5IixzPW4udmFsdWUubmFtZXx8InZhbHVlIjtyLmVhY2godCwoZnVuY3Rpb24odCxyKXt2YXIgYz1uZXcgbyhuLmZsYXR0ZW5lZD9uLm5hbWU6ImVudHJ5Iik7ZS5hZGRDaGlsZE5vZGUoYyk7dmFyIHU9bmV3IG8oaSksbD1uZXcgbyhzKTtjLmFkZENoaWxkTm9kZSh1KSxjLmFkZENoaWxkTm9kZShsKSxhKHUsdCxuLmtleSksYShsLHIsbi52YWx1ZSl9KSl9KGUsdCxuKTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQsbil7bi5mbGF0dGVuZWQ/ci5hcnJheUVhY2godCwoZnVuY3Rpb24odCl7dmFyIHI9bi5tZW1iZXIubmFtZXx8bi5uYW1lLGk9bmV3IG8ocik7ZS5hZGRDaGlsZE5vZGUoaSksYShpLHQsbi5tZW1iZXIpfSkpOnIuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciByPW4ubWVtYmVyLm5hbWV8fCJtZW1iZXIiLGk9bmV3IG8ocik7ZS5hZGRDaGlsZE5vZGUoaSksYShpLHQsbi5tZW1iZXIpfSkpfShlLHQsbik7ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe2UuYWRkQ2hpbGROb2RlKG5ldyBpKG4udG9XaXJlRm9ybWF0KHQpKSl9KGUsdCxuKX19ZnVuY3Rpb24gYyhlLHQsbil7dmFyIHIsbz0ieG1sbnMiO3QueG1sTmFtZXNwYWNlVXJpPyhyPXQueG1sTmFtZXNwYWNlVXJpLHQueG1sTmFtZXNwYWNlUHJlZml4JiYobys9IjoiK3QueG1sTmFtZXNwYWNlUHJlZml4KSk6biYmdC5hcGkueG1sTmFtZXNwYWNlVXJpJiYocj10LmFwaS54bWxOYW1lc3BhY2VVcmkpLHImJmUuYWRkQXR0cmlidXRlKG8scil9cy5wcm90b3R5cGUudG9YTUw9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9bmV3IG8obik7cmV0dXJuIGMoaSx0LCEwKSxhKGksZSx0KSxpLmNoaWxkcmVuLmxlbmd0aD4wfHxyP2kudG9TdHJpbmcoKToiIn0sdC5leHBvcnRzPXN9LHsiLi4vdXRpbCI6NzQsIi4veG1sLW5vZGUiOjc5LCIuL3htbC10ZXh0Ijo4MH1dLDc3OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtlc2NhcGVBdHRyaWJ1dGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLycvZywiJmFwb3M7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKX19fSx7fV0sNzg6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2VzY2FwZUVsZW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoL1xyL2csIiYjeDBEOyIpLnJlcGxhY2UoL1xuL2csIiYjeDBBOyIpLnJlcGxhY2UoL1x1MDA4NS9nLCImI3g4NTsiKS5yZXBsYWNlKC9cdTIwMjgvLCImI3gyMDI4OyIpfX19LHt9XSw3OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vZXNjYXBlLWF0dHJpYnV0ZSIpLmVzY2FwZUF0dHJpYnV0ZTtmdW5jdGlvbiBvKGUsdCl7dm9pZCAwPT09dCYmKHQ9W10pLHRoaXMubmFtZT1lLHRoaXMuY2hpbGRyZW49dCx0aGlzLmF0dHJpYnV0ZXM9e319by5wcm90b3R5cGUuYWRkQXR0cmlidXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1tlXT10LHRoaXN9LG8ucHJvdG90eXBlLmFkZENoaWxkTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5wdXNoKGUpLHRoaXN9LG8ucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihlKXtyZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1tlXSx0aGlzfSxvLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgZT1Cb29sZWFuKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSx0PSI8Iit0aGlzLm5hbWUsbj10aGlzLmF0dHJpYnV0ZXMsbz0wLGk9T2JqZWN0LmtleXMobik7bzxpLmxlbmd0aDtvKyspe3ZhciBzPWlbb10sYT1uW3NdO251bGwhPWEmJih0Kz0iICIrcysnPSInK3IoIiIrYSkrJyInKX1yZXR1cm4gdCsoZT8iPiIrdGhpcy5jaGlsZHJlbi5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9KSkuam9pbigiIikrIjwvIit0aGlzLm5hbWUrIj4iOiIvPiIpfSx0LmV4cG9ydHM9e1htbE5vZGU6b319LHsiLi9lc2NhcGUtYXR0cmlidXRlIjo3N31dLDgwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9lc2NhcGUtZWxlbWVudCIpLmVzY2FwZUVsZW1lbnQ7ZnVuY3Rpb24gbyhlKXt0aGlzLnZhbHVlPWV9by5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcigiIit0aGlzLnZhbHVlKX0sdC5leHBvcnRzPXtYbWxUZXh0Om99fSx7Ii4vZXNjYXBlLWVsZW1lbnQiOjc4fV0sODE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5ieXRlTGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciB0PWMoZSksbj10WzBdLHI9dFsxXTtyZXR1cm4gMyoobityKS80LXJ9LG4udG9CeXRlQXJyYXk9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWMoZSkscz1yWzBdLGE9clsxXSx1PW5ldyBpKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMyoodCtuKS80LW59KDAscyxhKSksbD0wLHA9YT4wP3MtNDpzO2ZvcihuPTA7bjxwO24rPTQpdD1vW2UuY2hhckNvZGVBdChuKV08PDE4fG9bZS5jaGFyQ29kZUF0KG4rMSldPDwxMnxvW2UuY2hhckNvZGVBdChuKzIpXTw8NnxvW2UuY2hhckNvZGVBdChuKzMpXSx1W2wrK109dD4+MTYmMjU1LHVbbCsrXT10Pj44JjI1NSx1W2wrK109MjU1JnQ7cmV0dXJuIDI9PT1hJiYodD1vW2UuY2hhckNvZGVBdChuKV08PDJ8b1tlLmNoYXJDb2RlQXQobisxKV0+PjQsdVtsKytdPTI1NSZ0KSwxPT09YSYmKHQ9b1tlLmNoYXJDb2RlQXQobildPDwxMHxvW2UuY2hhckNvZGVBdChuKzEpXTw8NHxvW2UuY2hhckNvZGVBdChuKzIpXT4+Mix1W2wrK109dD4+OCYyNTUsdVtsKytdPTI1NSZ0KSx1fSxuLmZyb21CeXRlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49ZS5sZW5ndGgsbz1uJTMsaT1bXSxzPTE2MzgzLGE9MCxjPW4tbzthPGM7YSs9cylpLnB1c2godShlLGEsYStzPmM/YzphK3MpKTtyZXR1cm4gMT09PW8/KHQ9ZVtuLTFdLGkucHVzaChyW3Q+PjJdK3JbdDw8NCY2M10rIj09IikpOjI9PT1vJiYodD0oZVtuLTJdPDw4KStlW24tMV0saS5wdXNoKHJbdD4+MTBdK3JbdD4+NCY2M10rclt0PDwyJjYzXSsiPSIpKSxpLmpvaW4oIiIpfTtmb3IodmFyIHI9W10sbz1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LHM9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGE9MDthPDY0OysrYSlyW2FdPXNbYV0sb1tzLmNoYXJDb2RlQXQoYSldPWE7ZnVuY3Rpb24gYyhlKXt2YXIgdD1lLmxlbmd0aDtpZih0JTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgbj1lLmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PW4mJihuPXQpLFtuLG49PT10PzA6NC1uJTRdfWZ1bmN0aW9uIHUoZSx0LG4pe2Zvcih2YXIgbyxpLHM9W10sYT10O2E8bjthKz0zKW89KGVbYV08PDE2JjE2NzExNjgwKSsoZVthKzFdPDw4JjY1MjgwKSsoMjU1JmVbYSsyXSkscy5wdXNoKHJbKGk9byk+PjE4JjYzXStyW2k+PjEyJjYzXStyW2k+PjYmNjNdK3JbNjMmaV0pO3JldHVybiBzLmpvaW4oIiIpfW9bIi0iLmNoYXJDb2RlQXQoMCldPTYyLG9bIl8iLmNoYXJDb2RlQXQoMCldPTYzfSx7fV0sODI6W2Z1bmN0aW9uKGUsdCxuKXt9LHt9XSw4MzpbZnVuY3Rpb24oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Uuc3VwZXJfPXQsZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OnQuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Uuc3VwZXJfPXQ7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyBuLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWV9fSx7fV0sODQ6W2Z1bmN0aW9uKGUsdCxvKXsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGkpeyJvYmplY3QiPT10eXBlb2YgbyYmbyYmby5ub2RlVHlwZSwib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQubm9kZVR5cGU7dmFyIHM9Im9iamVjdCI9PXR5cGVvZiBlJiZlO3MuZ2xvYmFsIT09cyYmcy53aW5kb3chPT1zJiZzLnNlbGY7dmFyIGEsYz0yMTQ3NDgzNjQ3LHU9MzYsbD0xLHA9MjYsZD0zOCxoPTcwMCxmPTcyLGc9MTI4LG09Ii0iLHY9L154bi0tLyx5PS9bXlx4MjAtXHg3RV0vLEU9L1tceDJFXHUzMDAyXHVGRjBFXHVGRjYxXS9nLFM9e292ZXJmbG93OiJPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcyIsIm5vdC1iYXNpYyI6IklsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCkiLCJpbnZhbGlkLWlucHV0IjoiSW52YWxpZCBpbnB1dCJ9LGI9dS1sLFQ9TWF0aC5mbG9vcixDPVN0cmluZy5mcm9tQ2hhckNvZGU7ZnVuY3Rpb24gSShlKXt0aHJvdyBSYW5nZUVycm9yKFNbZV0pfWZ1bmN0aW9uIEEoZSx0KXtmb3IodmFyIG49ZS5sZW5ndGgscj1bXTtuLS07KXJbbl09dChlW25dKTtyZXR1cm4gcn1mdW5jdGlvbiBfKGUsdCl7dmFyIG49ZS5zcGxpdCgiQCIpLHI9IiI7cmV0dXJuIG4ubGVuZ3RoPjEmJihyPW5bMF0rIkAiLGU9blsxXSkscitBKChlPWUucmVwbGFjZShFLCIuIikpLnNwbGl0KCIuIiksdCkuam9pbigiLiIpfWZ1bmN0aW9uIHcoZSl7Zm9yKHZhciB0LG4scj1bXSxvPTAsaT1lLmxlbmd0aDtvPGk7KSh0PWUuY2hhckNvZGVBdChvKyspKT49NTUyOTYmJnQ8PTU2MzE5JiZvPGk/NTYzMjA9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQobysrKSkpP3IucHVzaCgoKDEwMjMmdCk8PDEwKSsoMTAyMyZuKSs2NTUzNik6KHIucHVzaCh0KSxvLS0pOnIucHVzaCh0KTtyZXR1cm4gcn1mdW5jdGlvbiBSKGUpe3JldHVybiBBKGUsKGZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlPjY1NTM1JiYodCs9QygoZS09NjU1MzYpPj4+MTAmMTAyM3w1NTI5NiksZT01NjMyMHwxMDIzJmUpLHQrPUMoZSl9KSkuam9pbigiIil9ZnVuY3Rpb24gayhlLHQpe3JldHVybiBlKzIyKzc1KihlPDI2KS0oKDAhPXQpPDw1KX1mdW5jdGlvbiBMKGUsdCxuKXt2YXIgcj0wO2ZvcihlPW4/VChlL2gpOmU+PjEsZSs9VChlL3QpO2U+YipwPj4xO3IrPXUpZT1UKGUvYik7cmV0dXJuIFQocisoYisxKSplLyhlK2QpKX1mdW5jdGlvbiBOKGUpe3ZhciB0LG4scixvLGkscyxhLGQsaCx2LHksRT1bXSxTPWUubGVuZ3RoLGI9MCxDPWcsQT1mO2Zvcigobj1lLmxhc3RJbmRleE9mKG0pKTwwJiYobj0wKSxyPTA7cjxuOysrcillLmNoYXJDb2RlQXQocik+PTEyOCYmSSgibm90LWJhc2ljIiksRS5wdXNoKGUuY2hhckNvZGVBdChyKSk7Zm9yKG89bj4wP24rMTowO288Uzspe2ZvcihpPWIscz0xLGE9dTtvPj1TJiZJKCJpbnZhbGlkLWlucHV0IiksKChkPSh5PWUuY2hhckNvZGVBdChvKyspKS00ODwxMD95LTIyOnktNjU8MjY/eS02NTp5LTk3PDI2P3ktOTc6dSk+PXV8fGQ+VCgoYy1iKS9zKSkmJkkoIm92ZXJmbG93IiksYis9ZCpzLCEoZDwoaD1hPD1BP2w6YT49QStwP3A6YS1BKSk7YSs9dSlzPlQoYy8odj11LWgpKSYmSSgib3ZlcmZsb3ciKSxzKj12O0E9TChiLWksdD1FLmxlbmd0aCsxLDA9PWkpLFQoYi90KT5jLUMmJkkoIm92ZXJmbG93IiksQys9VChiL3QpLGIlPXQsRS5zcGxpY2UoYisrLDAsQyl9cmV0dXJuIFIoRSl9ZnVuY3Rpb24gTyhlKXt2YXIgdCxuLHIsbyxpLHMsYSxkLGgsdix5LEUsUyxiLEEsXz1bXTtmb3IoRT0oZT13KGUpKS5sZW5ndGgsdD1nLG49MCxpPWYscz0wO3M8RTsrK3MpKHk9ZVtzXSk8MTI4JiZfLnB1c2goQyh5KSk7Zm9yKHI9bz1fLmxlbmd0aCxvJiZfLnB1c2gobSk7cjxFOyl7Zm9yKGE9YyxzPTA7czxFOysrcykoeT1lW3NdKT49dCYmeTxhJiYoYT15KTtmb3IoYS10PlQoKGMtbikvKFM9cisxKSkmJkkoIm92ZXJmbG93Iiksbis9KGEtdCkqUyx0PWEscz0wO3M8RTsrK3MpaWYoKHk9ZVtzXSk8dCYmKytuPmMmJkkoIm92ZXJmbG93IikseT09dCl7Zm9yKGQ9bixoPXU7IShkPCh2PWg8PWk/bDpoPj1pK3A/cDpoLWkpKTtoKz11KUE9ZC12LGI9dS12LF8ucHVzaChDKGsoditBJWIsMCkpKSxkPVQoQS9iKTtfLnB1c2goQyhrKGQsMCkpKSxpPUwobixTLHI9PW8pLG49MCwrK3J9KytuLCsrdH1yZXR1cm4gXy5qb2luKCIiKX1hPXt2ZXJzaW9uOiIxLjMuMiIsdWNzMjp7ZGVjb2RlOncsZW5jb2RlOlJ9LGRlY29kZTpOLGVuY29kZTpPLHRvQVNDSUk6ZnVuY3Rpb24oZSl7cmV0dXJuIF8oZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHkudGVzdChlKT8ieG4tLSIrTyhlKTplfSkpfSx0b1VuaWNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIF8oZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHYudGVzdChlKT9OKGUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSk6ZX0pKX19LHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LmNhbGwobyxuLG8sdCkpfHwodC5leHBvcnRzPXIpfSgpfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyx2b2lkIDAhPT1uLmc/bi5nOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHt9XSw4NTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jb3B5JiYiZnVuY3Rpb24iPT10eXBlb2YgZS5maWxsJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkVUludDh9fSx7fV0sODY6W2Z1bmN0aW9uKGUsdCxyKXsoZnVuY3Rpb24odCxuKXsoZnVuY3Rpb24oKXt2YXIgbz0vJVtzZGolXS9nO3IuZm9ybWF0PWZ1bmN0aW9uKGUpe2lmKCF2KGUpKXtmb3IodmFyIHQ9W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5wdXNoKGEoYXJndW1lbnRzW25dKSk7cmV0dXJuIHQuam9pbigiICIpfW49MTtmb3IodmFyIHI9YXJndW1lbnRzLGk9ci5sZW5ndGgscz1TdHJpbmcoZSkucmVwbGFjZShvLChmdW5jdGlvbihlKXtpZigiJSUiPT09ZSlyZXR1cm4iJSI7aWYobj49aSlyZXR1cm4gZTtzd2l0Y2goZSl7Y2FzZSIlcyI6cmV0dXJuIFN0cmluZyhyW24rK10pO2Nhc2UiJWQiOnJldHVybiBOdW1iZXIocltuKytdKTtjYXNlIiVqIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHJbbisrXSl9Y2F0Y2goZSl7cmV0dXJuIltDaXJjdWxhcl0ifWRlZmF1bHQ6cmV0dXJuIGV9fSkpLGM9cltuXTtuPGk7Yz1yWysrbl0pZyhjKXx8IVMoYyk/cys9IiAiK2M6cys9IiAiK2EoYyk7cmV0dXJuIHN9LHIuZGVwcmVjYXRlPWZ1bmN0aW9uKGUsbyl7aWYoeShuLnByb2Nlc3MpKXJldHVybiBmdW5jdGlvbigpe3JldHVybiByLmRlcHJlY2F0ZShlLG8pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoITA9PT10Lm5vRGVwcmVjYXRpb24pcmV0dXJuIGU7dmFyIGk9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWkpe2lmKHQudGhyb3dEZXByZWNhdGlvbil0aHJvdyBuZXcgRXJyb3Iobyk7dC50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2Uobyk6Y29uc29sZS5lcnJvcihvKSxpPSEwfXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19O3ZhciBpLHM9e307ZnVuY3Rpb24gYShlLHQpe3ZhciBuPXtzZWVuOltdLHN0eWxpemU6dX07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTMmJihuLmRlcHRoPWFyZ3VtZW50c1syXSksYXJndW1lbnRzLmxlbmd0aD49NCYmKG4uY29sb3JzPWFyZ3VtZW50c1szXSksZih0KT9uLnNob3dIaWRkZW49dDp0JiZyLl9leHRlbmQobix0KSx5KG4uc2hvd0hpZGRlbikmJihuLnNob3dIaWRkZW49ITEpLHkobi5kZXB0aCkmJihuLmRlcHRoPTIpLHkobi5jb2xvcnMpJiYobi5jb2xvcnM9ITEpLHkobi5jdXN0b21JbnNwZWN0KSYmKG4uY3VzdG9tSW5zcGVjdD0hMCksbi5jb2xvcnMmJihuLnN0eWxpemU9YyksbChuLGUsbi5kZXB0aCl9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPWEuc3R5bGVzW3RdO3JldHVybiBuPyIbWyIrYS5jb2xvcnNbbl1bMF0rIm0iK2UrIhtbIithLmNvbG9yc1tuXVsxXSsibSI6ZX1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIGV9ZnVuY3Rpb24gbChlLHQsbil7aWYoZS5jdXN0b21JbnNwZWN0JiZ0JiZDKHQuaW5zcGVjdCkmJnQuaW5zcGVjdCE9PXIuaW5zcGVjdCYmKCF0LmNvbnN0cnVjdG9yfHx0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PXQpKXt2YXIgbz10Lmluc3BlY3QobixlKTtyZXR1cm4gdihvKXx8KG89bChlLG8sbikpLG99dmFyIGk9ZnVuY3Rpb24oZSx0KXtpZih5KHQpKXJldHVybiBlLnN0eWxpemUoInVuZGVmaW5lZCIsInVuZGVmaW5lZCIpO2lmKHYodCkpe3ZhciBuPSInIitKU09OLnN0cmluZ2lmeSh0KS5yZXBsYWNlKC9eInwiJC9nLCIiKS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykrIiciO3JldHVybiBlLnN0eWxpemUobiwic3RyaW5nIil9cmV0dXJuIG0odCk/ZS5zdHlsaXplKCIiK3QsIm51bWJlciIpOmYodCk/ZS5zdHlsaXplKCIiK3QsImJvb2xlYW4iKTpnKHQpP2Uuc3R5bGl6ZSgibnVsbCIsIm51bGwiKTp2b2lkIDB9KGUsdCk7aWYoaSlyZXR1cm4gaTt2YXIgcz1PYmplY3Qua2V5cyh0KSxhPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7dFtlXT0hMH0pKSx0fShzKTtpZihlLnNob3dIaWRkZW4mJihzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpKSxUKHQpJiYocy5pbmRleE9mKCJtZXNzYWdlIik+PTB8fHMuaW5kZXhPZigiZGVzY3JpcHRpb24iKT49MCkpcmV0dXJuIHAodCk7aWYoMD09PXMubGVuZ3RoKXtpZihDKHQpKXt2YXIgYz10Lm5hbWU/IjogIit0Lm5hbWU6IiI7cmV0dXJuIGUuc3R5bGl6ZSgiW0Z1bmN0aW9uIitjKyJdIiwic3BlY2lhbCIpfWlmKEUodCkpcmV0dXJuIGUuc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksInJlZ2V4cCIpO2lmKGIodCkpcmV0dXJuIGUuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJkYXRlIik7aWYoVCh0KSlyZXR1cm4gcCh0KX12YXIgdSxTPSIiLEk9ITEsQT1bInsiLCJ9Il07cmV0dXJuIGgodCkmJihJPSEwLEE9WyJbIiwiXSJdKSxDKHQpJiYoUz0iIFtGdW5jdGlvbiIrKHQubmFtZT8iOiAiK3QubmFtZToiIikrIl0iKSxFKHQpJiYoUz0iICIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKSxiKHQpJiYoUz0iICIrRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh0KSksVCh0KSYmKFM9IiAiK3AodCkpLDAhPT1zLmxlbmd0aHx8SSYmMCE9dC5sZW5ndGg/bjwwP0UodCk/ZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSwicmVnZXhwIik6ZS5zdHlsaXplKCJbT2JqZWN0XSIsInNwZWNpYWwiKTooZS5zZWVuLnB1c2godCksdT1JP2Z1bmN0aW9uKGUsdCxuLHIsbyl7Zm9yKHZhciBpPVtdLHM9MCxhPXQubGVuZ3RoO3M8YTsrK3Mpdyh0LFN0cmluZyhzKSk/aS5wdXNoKGQoZSx0LG4scixTdHJpbmcocyksITApKTppLnB1c2goIiIpO3JldHVybiBvLmZvckVhY2goKGZ1bmN0aW9uKG8pe28ubWF0Y2goL15cZCskLyl8fGkucHVzaChkKGUsdCxuLHIsbywhMCkpfSkpLGl9KGUsdCxuLGEscyk6cy5tYXAoKGZ1bmN0aW9uKHIpe3JldHVybiBkKGUsdCxuLGEscixJKX0pKSxlLnNlZW4ucG9wKCksZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiB0LmluZGV4T2YoIlxuIiksZSt0LnJlcGxhY2UoL1x1MDAxYlxbXGRcZD9tL2csIiIpLmxlbmd0aCsxfSksMCk7cmV0dXJuIHI+NjA/blswXSsoIiI9PT10PyIiOnQrIlxuICIpKyIgIitlLmpvaW4oIixcbiAgIikrIiAiK25bMV06blswXSt0KyIgIitlLmpvaW4oIiwgIikrIiAiK25bMV19KHUsUyxBKSk6QVswXStTK0FbMV19ZnVuY3Rpb24gcChlKXtyZXR1cm4iWyIrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkrIl0ifWZ1bmN0aW9uIGQoZSx0LG4scixvLGkpe3ZhciBzLGEsYztpZigoYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbyl8fHt2YWx1ZTp0W29dfSkuZ2V0P2E9Yy5zZXQ/ZS5zdHlsaXplKCJbR2V0dGVyL1NldHRlcl0iLCJzcGVjaWFsIik6ZS5zdHlsaXplKCJbR2V0dGVyXSIsInNwZWNpYWwiKTpjLnNldCYmKGE9ZS5zdHlsaXplKCJbU2V0dGVyXSIsInNwZWNpYWwiKSksdyhyLG8pfHwocz0iWyIrbysiXSIpLGF8fChlLnNlZW4uaW5kZXhPZihjLnZhbHVlKTwwPyhhPWcobik/bChlLGMudmFsdWUsbnVsbCk6bChlLGMudmFsdWUsbi0xKSkuaW5kZXhPZigiXG4iKT4tMSYmKGE9aT9hLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIiAgIitlfSkpLmpvaW4oIlxuIikuc3Vic3RyKDIpOiJcbiIrYS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiIgICAiK2V9KSkuam9pbigiXG4iKSk6YT1lLnN0eWxpemUoIltDaXJjdWxhcl0iLCJzcGVjaWFsIikpLHkocykpe2lmKGkmJm8ubWF0Y2goL15cZCskLykpcmV0dXJuIGE7KHM9SlNPTi5zdHJpbmdpZnkoIiIrbykpLm1hdGNoKC9eIihbYS16QS1aX11bYS16QS1aXzAtOV0qKSIkLyk/KHM9cy5zdWJzdHIoMSxzLmxlbmd0aC0yKSxzPWUuc3R5bGl6ZShzLCJuYW1lIikpOihzPXMucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpLnJlcGxhY2UoLyheInwiJCkvZywiJyIpLHM9ZS5zdHlsaXplKHMsInN0cmluZyIpKX1yZXR1cm4gcysiOiAiK2F9ZnVuY3Rpb24gaChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBmKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGV9ZnVuY3Rpb24gZyhlKXtyZXR1cm4gbnVsbD09PWV9ZnVuY3Rpb24gbShlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9ZnVuY3Rpb24gdihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9ZnVuY3Rpb24geShlKXtyZXR1cm4gdm9pZCAwPT09ZX1mdW5jdGlvbiBFKGUpe3JldHVybiBTKGUpJiYiW29iamVjdCBSZWdFeHBdIj09PUkoZSl9ZnVuY3Rpb24gUyhlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIGIoZSl7cmV0dXJuIFMoZSkmJiJbb2JqZWN0IERhdGVdIj09PUkoZSl9ZnVuY3Rpb24gVChlKXtyZXR1cm4gUyhlKSYmKCJbb2JqZWN0IEVycm9yXSI9PT1JKGUpfHxlIGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIEMoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9ZnVuY3Rpb24gSShlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIEEoZSl7cmV0dXJuIGU8MTA/IjAiK2UudG9TdHJpbmcoMTApOmUudG9TdHJpbmcoMTApfXIuZGVidWdsb2c9ZnVuY3Rpb24oZSl7aWYoeShpKSYmKGk9dC5lbnYuTk9ERV9ERUJVR3x8IiIpLGU9ZS50b1VwcGVyQ2FzZSgpLCFzW2VdKWlmKG5ldyBSZWdFeHAoIlxcYiIrZSsiXFxiIiwiaSIpLnRlc3QoaSkpe3ZhciBuPXQucGlkO3NbZV09ZnVuY3Rpb24oKXt2YXIgdD1yLmZvcm1hdC5hcHBseShyLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcigiJXMgJWQ6ICVzIixlLG4sdCl9fWVsc2Ugc1tlXT1mdW5jdGlvbigpe307cmV0dXJuIHNbZV19LHIuaW5zcGVjdD1hLGEuY29sb3JzPXtib2xkOlsxLDIyXSxpdGFsaWM6WzMsMjNdLHVuZGVybGluZTpbNCwyNF0saW52ZXJzZTpbNywyN10sd2hpdGU6WzM3LDM5XSxncmV5Ols5MCwzOV0sYmxhY2s6WzMwLDM5XSxibHVlOlszNCwzOV0sY3lhbjpbMzYsMzldLGdyZWVuOlszMiwzOV0sbWFnZW50YTpbMzUsMzldLHJlZDpbMzEsMzldLHllbGxvdzpbMzMsMzldfSxhLnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9LHIuaXNBcnJheT1oLHIuaXNCb29sZWFuPWYsci5pc051bGw9ZyxyLmlzTnVsbE9yVW5kZWZpbmVkPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lfSxyLmlzTnVtYmVyPW0sci5pc1N0cmluZz12LHIuaXNTeW1ib2w9ZnVuY3Rpb24oZSl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiBlfSxyLmlzVW5kZWZpbmVkPXksci5pc1JlZ0V4cD1FLHIuaXNPYmplY3Q9UyxyLmlzRGF0ZT1iLHIuaXNFcnJvcj1ULHIuaXNGdW5jdGlvbj1DLHIuaXNQcmltaXRpdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lfHwiYm9vbGVhbiI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGV8fCJzdHJpbmciPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHx2b2lkIDA9PT1lfSxyLmlzQnVmZmVyPWUoIi4vc3VwcG9ydC9pc0J1ZmZlciIpO3ZhciBfPVsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl07ZnVuY3Rpb24gdyhlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX1yLmxvZz1mdW5jdGlvbigpe3ZhciBlLHQ7Y29uc29sZS5sb2coIiVzIC0gJXMiLChlPW5ldyBEYXRlLHQ9W0EoZS5nZXRIb3VycygpKSxBKGUuZ2V0TWludXRlcygpKSxBKGUuZ2V0U2Vjb25kcygpKV0uam9pbigiOiIpLFtlLmdldERhdGUoKSxfW2UuZ2V0TW9udGgoKV0sdF0uam9pbigiICIpKSxyLmZvcm1hdC5hcHBseShyLGFyZ3VtZW50cykpfSxyLmluaGVyaXRzPWUoImluaGVyaXRzIiksci5fZXh0ZW5kPWZ1bmN0aW9uKGUsdCl7aWYoIXR8fCFTKHQpKXJldHVybiBlO2Zvcih2YXIgbj1PYmplY3Qua2V5cyh0KSxyPW4ubGVuZ3RoO3ItLTspZVtuW3JdXT10W25bcl1dO3JldHVybiBlfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSx2b2lkIDAhPT1uLmc/bi5nOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHsiLi9zdXBwb3J0L2lzQnVmZmVyIjo4NSxfcHJvY2Vzczo5Mixpbmhlcml0czo4M31dLDg3OltmdW5jdGlvbihlLHQscil7KGZ1bmN0aW9uKHQsbil7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBuPWUoImJhc2U2NC1qcyIpLG89ZSgiaWVlZTc1NCIpLGk9ZSgiaXNhcnJheSIpO2Z1bmN0aW9uIHMoKXtyZXR1cm4gYy5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBhKGUsdCl7aWYocygpPHQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIGMuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT1uZXcgVWludDhBcnJheSh0KSkuX19wcm90b19fPWMucHJvdG90eXBlOihudWxsPT09ZSYmKGU9bmV3IGModCkpLGUubGVuZ3RoPXQpLGV9ZnVuY3Rpb24gYyhlLHQsbil7aWYoIShjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBjKSlyZXR1cm4gbmV3IGMoZSx0LG4pO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gcCh0aGlzLGUpfXJldHVybiB1KHRoaXMsZSx0LG4pfWZ1bmN0aW9uIHUoZSx0LG4scil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24oZSx0LG4scil7aWYodC5ieXRlTGVuZ3RoLG48MHx8dC5ieXRlTGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZih0LmJ5dGVMZW5ndGg8bisocnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtyZXR1cm4gdD12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCxuKTpuZXcgVWludDhBcnJheSh0LG4sciksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPXQpLl9fcHJvdG9fXz1jLnByb3RvdHlwZTplPWQoZSx0KSxlfShlLHQsbixyKToic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0LG4pe2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIiIhPT1ufHwobj0idXRmOCIpLCFjLmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIHI9MHxmKHQsbiksbz0oZT1hKGUscikpLndyaXRlKHQsbik7cmV0dXJuIG8hPT1yJiYoZT1lLnNsaWNlKDAsbykpLGV9KGUsdCxuKTpmdW5jdGlvbihlLHQpe2lmKGMuaXNCdWZmZXIodCkpe3ZhciBuPTB8aCh0Lmxlbmd0aCk7cmV0dXJuIDA9PT0oZT1hKGUsbikpLmxlbmd0aHx8dC5jb3B5KGUsMCwwLG4pLGV9aWYodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiB0KXJldHVybiJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGh8fChyPXQubGVuZ3RoKSE9cj9hKGUsMCk6ZChlLHQpO2lmKCJCdWZmZXIiPT09dC50eXBlJiZpKHQuZGF0YSkpcmV0dXJuIGQoZSx0LmRhdGEpfXZhciByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0oZSx0KX1mdW5jdGlvbiBsKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gcChlLHQpe2lmKGwodCksZT1hKGUsdDwwPzA6MHxoKHQpKSwhYy5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248dDsrK24pZVtuXT0wO3JldHVybiBlfWZ1bmN0aW9uIGQoZSx0KXt2YXIgbj10Lmxlbmd0aDwwPzA6MHxoKHQubGVuZ3RoKTtlPWEoZSxuKTtmb3IodmFyIHI9MDtyPG47cis9MSllW3JdPTI1NSZ0W3JdO3JldHVybiBlfWZ1bmN0aW9uIGgoZSl7aWYoZT49cygpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitzKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHxlfWZ1bmN0aW9uIGYoZSx0KXtpZihjLmlzQnVmZmVyKGUpKXJldHVybiBlLmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiBlLmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiBlJiYoZT0iIitlKTt2YXIgbj1lLmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIHI9ITE7Oylzd2l0Y2godCl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBqKGUpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gQihlKS5sZW5ndGg7ZGVmYXVsdDppZihyKXJldHVybiBqKGUpLmxlbmd0aDt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIGcoZSx0LG4pe3ZhciByPSExO2lmKCh2b2lkIDA9PT10fHx0PDApJiYodD0wKSx0PnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PSh0Pj4+PTApKXJldHVybiIiO2ZvcihlfHwoZT0idXRmOCIpOzspc3dpdGNoKGUpe2Nhc2UiaGV4IjpyZXR1cm4gTCh0aGlzLHQsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gXyh0aGlzLHQsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIFIodGhpcyx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyx0LG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gQSh0aGlzLHQsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBOKHRoaXMsdCxuKTtkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitlKTtlPShlKyIiKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIG0oZSx0LG4pe3ZhciByPWVbdF07ZVt0XT1lW25dLGVbbl09cn1mdW5jdGlvbiB2KGUsdCxuLHIsbyl7aWYoMD09PWUubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8ocj1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49bz8wOmUubGVuZ3RoLTEpLG48MCYmKG49ZS5sZW5ndGgrbiksbj49ZS5sZW5ndGgpe2lmKG8pcmV0dXJuLTE7bj1lLmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighbylyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1jLmZyb20odCxyKSksYy5pc0J1ZmZlcih0KSlyZXR1cm4gMD09PXQubGVuZ3RoPy0xOnkoZSx0LG4scixvKTtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQmPTI1NSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP28/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGUsdCxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGUsdCxuKTp5KGUsW3RdLG4scixvKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiB5KGUsdCxuLHIsbyl7dmFyIGkscz0xLGE9ZS5sZW5ndGgsYz10Lmxlbmd0aDtpZih2b2lkIDAhPT1yJiYoInVjczIiPT09KHI9U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09cnx8InV0ZjE2bGUiPT09cnx8InV0Zi0xNmxlIj09PXIpKXtpZihlLmxlbmd0aDwyfHx0Lmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLGMvPTIsbi89Mn1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIDE9PT1zP2VbdF06ZS5yZWFkVUludDE2QkUodCpzKX1pZihvKXt2YXIgbD0tMTtmb3IoaT1uO2k8YTtpKyspaWYodShlLGkpPT09dSh0LC0xPT09bD8wOmktbCkpe2lmKC0xPT09bCYmKGw9aSksaS1sKzE9PT1jKXJldHVybiBsKnN9ZWxzZS0xIT09bCYmKGktPWktbCksbD0tMX1lbHNlIGZvcihuK2M+YSYmKG49YS1jKSxpPW47aT49MDtpLS0pe2Zvcih2YXIgcD0hMCxkPTA7ZDxjO2QrKylpZih1KGUsaStkKSE9PXUodCxkKSl7cD0hMTticmVha31pZihwKXJldHVybiBpfXJldHVybi0xfWZ1bmN0aW9uIEUoZSx0LG4scil7bj1OdW1iZXIobil8fDA7dmFyIG89ZS5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSk+byYmKHI9byk6cj1vO3ZhciBpPXQubGVuZ3RoO2lmKGklMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtyPmkvMiYmKHI9aS8yKTtmb3IodmFyIHM9MDtzPHI7KytzKXt2YXIgYT1wYXJzZUludCh0LnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO2VbbitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIFMoZSx0LG4scil7cmV0dXJuIFYoaih0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiBiKGUsdCxuLHIpe3JldHVybiBWKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDsrK24pdC5wdXNoKDI1NSZlLmNoYXJDb2RlQXQobikpO3JldHVybiB0fSh0KSxlLG4scil9ZnVuY3Rpb24gVChlLHQsbixyKXtyZXR1cm4gYihlLHQsbixyKX1mdW5jdGlvbiBDKGUsdCxuLHIpe3JldHVybiBWKEIodCksZSxuLHIpfWZ1bmN0aW9uIEkoZSx0LG4scil7cmV0dXJuIFYoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scixvLGk9W10scz0wO3M8ZS5sZW5ndGgmJiEoKHQtPTIpPDApOysrcylyPShuPWUuY2hhckNvZGVBdChzKSk+Pjgsbz1uJTI1NixpLnB1c2gobyksaS5wdXNoKHIpO3JldHVybiBpfSh0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiBBKGUsdCxyKXtyZXR1cm4gMD09PXQmJnI9PT1lLmxlbmd0aD9uLmZyb21CeXRlQXJyYXkoZSk6bi5mcm9tQnl0ZUFycmF5KGUuc2xpY2UodCxyKSl9ZnVuY3Rpb24gXyhlLHQsbil7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIHI9W10sbz10O288bjspe3ZhciBpLHMsYSxjLHU9ZVtvXSxsPW51bGwscD11PjIzOT80OnU+MjIzPzM6dT4xOTE/MjoxO2lmKG8rcDw9bilzd2l0Y2gocCl7Y2FzZSAxOnU8MTI4JiYobD11KTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihpPWVbbysxXSkpJiYoYz0oMzEmdSk8PDZ8NjMmaSk+MTI3JiYobD1jKTticmVhaztjYXNlIDM6aT1lW28rMV0scz1lW28rMl0sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImcykmJihjPSgxNSZ1KTw8MTJ8KDYzJmkpPDw2fDYzJnMpPjIwNDcmJihjPDU1Mjk2fHxjPjU3MzQzKSYmKGw9Yyk7YnJlYWs7Y2FzZSA0Omk9ZVtvKzFdLHM9ZVtvKzJdLGE9ZVtvKzNdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJihjPSgxNSZ1KTw8MTh8KDYzJmkpPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJmM8MTExNDExMiYmKGw9Yyl9bnVsbD09PWw/KGw9NjU1MzMscD0xKTpsPjY1NTM1JiYobC09NjU1MzYsci5wdXNoKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCksci5wdXNoKGwpLG8rPXB9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQ8PXcpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUpO2Zvcih2YXIgbj0iIixyPTA7cjx0OyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKHIscis9dykpO3JldHVybiBufShyKX1yLkJ1ZmZlcj1jLHIuU2xvd0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksYy5hbGxvYygrZSl9LHIuSU5TUEVDVF9NQVhfQllURVM9NTAsYy5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMCE9PXQuVFlQRURfQVJSQVlfU1VQUE9SVD90LlRZUEVEX0FSUkFZX1NVUFBPUlQ6ZnVuY3Rpb24oKXt0cnl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIGUuX19wcm90b19fPXtfX3Byb3RvX186VWludDhBcnJheS5wcm90b3R5cGUsZm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX0sNDI9PT1lLmZvbygpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zdWJhcnJheSYmMD09PWUuc3ViYXJyYXkoMSwxKS5ieXRlTGVuZ3RofWNhdGNoKGUpe3JldHVybiExfX0oKSxyLmtNYXhMZW5ndGg9cygpLGMucG9vbFNpemU9ODE5MixjLl9hdWdtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fXz1jLnByb3RvdHlwZSxlfSxjLmZyb209ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB1KG51bGwsZSx0LG4pfSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihjLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsYy5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJmNbU3ltYm9sLnNwZWNpZXNdPT09YyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGMsU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfSkpLGMuYWxsb2M9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbCh0KSx0PD0wP2EoZSx0KTp2b2lkIDAhPT1uPyJzdHJpbmciPT10eXBlb2Ygcj9hKGUsdCkuZmlsbChuLHIpOmEoZSx0KS5maWxsKG4pOmEoZSx0KX0obnVsbCxlLHQsbil9LGMuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHAobnVsbCxlKX0sYy5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIHAobnVsbCxlKX0sYy5pc0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9LGMuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFjLmlzQnVmZmVyKGUpfHwhYy5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dC5sZW5ndGgsbz0wLGk9TWF0aC5taW4obixyKTtvPGk7KytvKWlmKGVbb10hPT10W29dKXtuPWVbb10scj10W29dO2JyZWFrfXJldHVybiBuPHI/LTE6cjxuPzE6MH0sYy5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxjLmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFpKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGMuYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09dClmb3IodD0wLG49MDtuPGUubGVuZ3RoOysrbil0Kz1lW25dLmxlbmd0aDt2YXIgcj1jLmFsbG9jVW5zYWZlKHQpLG89MDtmb3Iobj0wO248ZS5sZW5ndGg7KytuKXt2YXIgcz1lW25dO2lmKCFjLmlzQnVmZmVyKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtzLmNvcHkocixvKSxvKz1zLmxlbmd0aH1yZXR1cm4gcn0sYy5ieXRlTGVuZ3RoPWYsYy5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGMucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9MiltKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfSxjLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpbSh0aGlzLHQsdCszKSxtKHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OCltKHRoaXMsdCx0KzcpLG0odGhpcyx0KzEsdCs2KSxtKHRoaXMsdCsyLHQrNSksbSh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxjLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT1lPyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP18odGhpcywwLGUpOmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PWMuY29tcGFyZSh0aGlzLGUpfSxjLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIGU9IiIsdD1yLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiB0aGlzLmxlbmd0aD4wJiYoZT10aGlzLnRvU3RyaW5nKCJoZXgiLDAsdCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPnQmJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0sYy5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQsbixyLG8pe2lmKCFjLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT10JiYodD0wKSx2b2lkIDA9PT1uJiYobj1lP2UubGVuZ3RoOjApLHZvaWQgMD09PXImJihyPTApLHZvaWQgMD09PW8mJihvPXRoaXMubGVuZ3RoKSx0PDB8fG4+ZS5sZW5ndGh8fHI8MHx8bz50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocj49byYmdD49bilyZXR1cm4gMDtpZihyPj1vKXJldHVybi0xO2lmKHQ+PW4pcmV0dXJuIDE7aWYodGhpcz09PWUpcmV0dXJuIDA7Zm9yKHZhciBpPShvPj4+PTApLShyPj4+PTApLHM9KG4+Pj49MCktKHQ+Pj49MCksYT1NYXRoLm1pbihpLHMpLHU9dGhpcy5zbGljZShyLG8pLGw9ZS5zbGljZSh0LG4pLHA9MDtwPGE7KytwKWlmKHVbcF0hPT1sW3BdKXtpPXVbcF0scz1sW3BdO2JyZWFrfXJldHVybiBpPHM/LTE6czxpPzE6MH0sYy5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxuKX0sYy5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHYodGhpcyxlLHQsbiwhMCl9LGMucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdih0aGlzLGUsdCxuLCExKX0sYy5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSx0LG4scil7aWYodm9pZCAwPT09dClyPSJ1dGY4IixuPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKHZvaWQgMD09PW4mJiJzdHJpbmciPT10eXBlb2YgdClyPXQsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZXtpZighaXNGaW5pdGUodCkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO3R8PTAsaXNGaW5pdGUobik/KG58PTAsdm9pZCAwPT09ciYmKHI9InV0ZjgiKSk6KHI9bixuPXZvaWQgMCl9dmFyIG89dGhpcy5sZW5ndGgtdDtpZigodm9pZCAwPT09bnx8bj5vKSYmKG49byksZS5sZW5ndGg+MCYmKG48MHx8dDwwKXx8dD50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtyfHwocj0idXRmOCIpO2Zvcih2YXIgaT0hMTs7KXN3aXRjaChyKXtjYXNlImhleCI6cmV0dXJuIEUodGhpcyxlLHQsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gUyh0aGlzLGUsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gYih0aGlzLGUsdCxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBUKHRoaXMsZSx0LG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gQyh0aGlzLGUsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEkodGhpcyxlLHQsbik7ZGVmYXVsdDppZihpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcik7cj0oIiIrcikudG9Mb3dlckNhc2UoKSxpPSEwfX0sYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgdz00MDk2O2Z1bmN0aW9uIFIoZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBvPXQ7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZlW29dKTtyZXR1cm4gcn1mdW5jdGlvbiBrKGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgbz10O288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZShlW29dKTtyZXR1cm4gcn1mdW5jdGlvbiBMKGUsdCxuKXt2YXIgcixvPWUubGVuZ3RoOyghdHx8dDwwKSYmKHQ9MCksKCFufHxuPDB8fG4+bykmJihuPW8pO2Zvcih2YXIgaT0iIixzPXQ7czxuOysrcylpKz0ocj1lW3NdKTwxNj8iMCIrci50b1N0cmluZygxNik6ci50b1N0cmluZygxNik7cmV0dXJuIGl9ZnVuY3Rpb24gTihlLHQsbil7Zm9yKHZhciByPWUuc2xpY2UodCxuKSxvPSIiLGk9MDtpPHIubGVuZ3RoO2krPTIpbys9U3RyaW5nLmZyb21DaGFyQ29kZShyW2ldKzI1NipyW2krMV0pO3JldHVybiBvfWZ1bmN0aW9uIE8oZSx0LG4pe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIEQoZSx0LG4scixvLGkpe2lmKCFjLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZih0Pm98fHQ8aSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBQKGUsdCxuLHIpe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKGUubGVuZ3RoLW4sMik7bzxpOysrbyllW24rb109KHQmMjU1PDw4KihyP286MS1vKSk+Pj44KihyP286MS1vKX1mdW5jdGlvbiB4KGUsdCxuLHIpe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4oZS5sZW5ndGgtbiw0KTtvPGk7KytvKWVbbitvXT10Pj4+OCoocj9vOjMtbykmMjU1fWZ1bmN0aW9uIE0oZSx0LG4scixvLGkpe2lmKG4rcj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBVKGUsdCxuLHIsaSl7cmV0dXJuIGl8fE0oZSwwLG4sNCksby53cml0ZShlLHQsbixyLDIzLDQpLG4rNH1mdW5jdGlvbiBGKGUsdCxuLHIsaSl7cmV0dXJuIGl8fE0oZSwwLG4sOCksby53cml0ZShlLHQsbixyLDUyLDgpLG4rOH1jLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1yKTwwJiYoZT0wKTplPnImJihlPXIpLCh0PXZvaWQgMD09PXQ/cjp+fnQpPDA/KHQrPXIpPDAmJih0PTApOnQ+ciYmKHQ9ciksdDxlJiYodD1lKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQpKG49dGhpcy5zdWJhcnJheShlLHQpKS5fX3Byb3RvX189Yy5wcm90b3R5cGU7ZWxzZXt2YXIgbz10LWU7bj1uZXcgYyhvLHZvaWQgMCk7Zm9yKHZhciBpPTA7aTxvOysraSluW2ldPXRoaXNbaStlXX1yZXR1cm4gbn0sYy5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlXSxvPTEsaT0wOysraTx0JiYobyo9MjU2KTspcis9dGhpc1tlK2ldKm87cmV0dXJuIHJ9LGMucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxPKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZSstLXRdLG89MTt0PjAmJihvKj0yNTYpOylyKz10aGlzW2UrLS10XSpvO3JldHVybiByfSxjLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LGMucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LGMucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LGMucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sYy5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxjLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxPKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0sbz0xLGk9MDsrK2k8dCYmKG8qPTI1Nik7KXIrPXRoaXNbZStpXSpvO3JldHVybiByPj0obyo9MTI4KSYmKHItPU1hdGgucG93KDIsOCp0KSkscn0sYy5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TyhlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10LG89MSxpPXRoaXNbZSstLXJdO3I+MCYmKG8qPTI1Nik7KWkrPXRoaXNbZSstLXJdKm87cmV0dXJuIGk+PShvKj0xMjgpJiYoaS09TWF0aC5wb3coMiw4KnQpKSxpfSxjLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LGMucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8TyhlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxjLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fE8oZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sYy5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sYy5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sYy5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITAsMjMsNCl9LGMucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCExLDIzLDQpfSxjLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITAsNTIsOCl9LGMucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMSw1Miw4KX0sYy5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7ZT0rZSx0fD0wLG58PTAscnx8RCh0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPTEsaT0wO2Zvcih0aGlzW3RdPTI1NSZlOysraTxuJiYobyo9MjU2KTspdGhpc1t0K2ldPWUvbyYyNTU7cmV0dXJuIHQrbn0sYy5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7ZT0rZSx0fD0wLG58PTAscnx8RCh0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPW4tMSxpPTE7Zm9yKHRoaXNbdCtvXT0yNTUmZTstLW8+PTAmJihpKj0yNTYpOyl0aGlzW3Qrb109ZS9pJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMSwyNTUsMCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSx0aGlzW3RdPTI1NSZlLHQrMX0sYy5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsNjU1MzUsMCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6UCh0aGlzLGUsdCwhMCksdCsyfSxjLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMiw2NTUzNSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpQKHRoaXMsZSx0LCExKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOngodGhpcyxlLHQsITApLHQrNH0sYy5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6eCh0aGlzLGUsdCwhMSksdCs0fSxjLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7RCh0aGlzLGUsdCxuLG8tMSwtbyl9dmFyIGk9MCxzPTEsYT0wO2Zvcih0aGlzW3RdPTI1NSZlOysraTxuJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtpLTFdJiYoYT0xKSx0aGlzW3QraV09KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn0sYy5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbihlLHQsbixyKXtpZihlPStlLHR8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO0QodGhpcyxlLHQsbixvLTEsLW8pfXZhciBpPW4tMSxzPTEsYT0wO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtpKzFdJiYoYT0xKSx0aGlzW3QraV09KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn0sYy5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMSwxMjcsLTEyOCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSxjLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6UCh0aGlzLGUsdCwhMCksdCsyfSxjLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6UCh0aGlzLGUsdCwhMSksdCsyfSxjLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrM109ZT4+PjI0KTp4KHRoaXMsZSx0LCEwKSx0KzR9LGMucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOngodGhpcyxlLHQsITEpLHQrNH0sYy5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVSh0aGlzLGUsdCwhMCxuKX0sYy5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVSh0aGlzLGUsdCwhMSxuKX0sYy5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEYodGhpcyxlLHQsITAsbil9LGMucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBGKHRoaXMsZSx0LCExLG4pfSxjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxyLW4mJihyPWUubGVuZ3RoLXQrbik7dmFyIG8saT1yLW47aWYodGhpcz09PWUmJm48dCYmdDxyKWZvcihvPWktMTtvPj0wOy0tbyllW28rdF09dGhpc1tvK25dO2Vsc2UgaWYoaTwxZTN8fCFjLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKG89MDtvPGk7KytvKWVbbyt0XT10aGlzW28rbl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChlLHRoaXMuc3ViYXJyYXkobixuK2kpLHQpO3JldHVybiBpfSxjLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhyPXQsdD0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBvPWUuY2hhckNvZGVBdCgwKTtvPDI1NiYmKGU9byl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiFjLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiBlJiYoZSY9MjU1KTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PXQpcmV0dXJuIHRoaXM7dmFyIGk7aWYodD4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCxlfHwoZT0wKSwibnVtYmVyIj09dHlwZW9mIGUpZm9yKGk9dDtpPG47KytpKXRoaXNbaV09ZTtlbHNle3ZhciBzPWMuaXNCdWZmZXIoZSk/ZTpqKG5ldyBjKGUscikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3IoaT0wO2k8bi10OysraSl0aGlzW2krdF09c1tpJWFdfXJldHVybiB0aGlzfTt2YXIgcT0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBqKGUsdCl7dmFyIG47dD10fHwxLzA7Zm9yKHZhciByPWUubGVuZ3RoLG89bnVsbCxpPVtdLHM9MDtzPHI7KytzKXtpZigobj1lLmNoYXJDb2RlQXQocykpPjU1Mjk1JiZuPDU3MzQ0KXtpZighbyl7aWYobj41NjMxOSl7KHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHMrMT09PXIpeyh0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1vPW47Y29udGludWV9aWYobjw1NjMyMCl7KHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpLG89bjtjb250aW51ZX1uPTY1NTM2KyhvLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIG8mJih0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtpZihvPW51bGwsbjwxMjgpe2lmKCh0LT0xKTwwKWJyZWFrO2kucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKHQtPTIpPDApYnJlYWs7aS5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKCh0LT0zKTwwKWJyZWFrO2kucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKHQtPTQpPDApYnJlYWs7aS5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gaX1mdW5jdGlvbiBCKGUpe3JldHVybiBuLnRvQnl0ZUFycmF5KGZ1bmN0aW9uKGUpe2lmKChlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0/ZS50cmltKCk6ZS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KGUpLnJlcGxhY2UocSwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7ZS5sZW5ndGglNCE9MDspZSs9Ij0iO3JldHVybiBlfShlKSl9ZnVuY3Rpb24gVihlLHQsbixyKXtmb3IodmFyIG89MDtvPHImJiEobytuPj10Lmxlbmd0aHx8bz49ZS5sZW5ndGgpOysrbyl0W28rbl09ZVtvXTtyZXR1cm4gb319KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLHZvaWQgMCE9PW4uZz9uLmc6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9LGUoImJ1ZmZlciIpLkJ1ZmZlcil9LHsiYmFzZTY0LWpzIjo4MSxidWZmZXI6ODcsaWVlZTc1NDo4OSxpc2FycmF5OjkwfV0sODg6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKCl7dGhpcy5fZXZlbnRzPXRoaXMuX2V2ZW50c3x8e30sdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfWZ1bmN0aW9uIG8oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9ZnVuY3Rpb24gaShlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIHZvaWQgMD09PWV9dC5leHBvcnRzPXIsci5FdmVudEVtaXR0ZXI9cixyLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMCxyLmRlZmF1bHRNYXhMaXN0ZW5lcnM9MTAsci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZXx8ZTwwfHxpc05hTihlKSl0aHJvdyBUeXBlRXJyb3IoIm4gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9ZSx0aGlzfSxyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGUpe3ZhciB0LG4scixhLGMsdTtpZih0aGlzLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9e30pLCJlcnJvciI9PT1lJiYoIXRoaXMuX2V2ZW50cy5lcnJvcnx8aSh0aGlzLl9ldmVudHMuZXJyb3IpJiYhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpe2lmKCh0PWFyZ3VtZW50c1sxXSlpbnN0YW5jZW9mIEVycm9yKXRocm93IHQ7dmFyIGw9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrdCsiKSIpO3Rocm93IGwuY29udGV4dD10LGx9aWYocyhuPXRoaXMuX2V2ZW50c1tlXSkpcmV0dXJuITE7aWYobyhuKSlzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOm4uY2FsbCh0aGlzKTticmVhaztjYXNlIDI6bi5jYWxsKHRoaXMsYXJndW1lbnRzWzFdKTticmVhaztjYXNlIDM6bi5jYWxsKHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7ZGVmYXVsdDphPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxuLmFwcGx5KHRoaXMsYSl9ZWxzZSBpZihpKG4pKWZvcihhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxyPSh1PW4uc2xpY2UoKSkubGVuZ3RoLGM9MDtjPHI7YysrKXVbY10uYXBwbHkodGhpcyxhKTtyZXR1cm4hMH0sci5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZighbyh0KSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3JldHVybiB0aGlzLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9e30pLHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lciYmdGhpcy5lbWl0KCJuZXdMaXN0ZW5lciIsZSxvKHQubGlzdGVuZXIpP3QubGlzdGVuZXI6dCksdGhpcy5fZXZlbnRzW2VdP2kodGhpcy5fZXZlbnRzW2VdKT90aGlzLl9ldmVudHNbZV0ucHVzaCh0KTp0aGlzLl9ldmVudHNbZV09W3RoaXMuX2V2ZW50c1tlXSx0XTp0aGlzLl9ldmVudHNbZV09dCxpKHRoaXMuX2V2ZW50c1tlXSkmJiF0aGlzLl9ldmVudHNbZV0ud2FybmVkJiYobj1zKHRoaXMuX21heExpc3RlbmVycyk/ci5kZWZhdWx0TWF4TGlzdGVuZXJzOnRoaXMuX21heExpc3RlbmVycykmJm4+MCYmdGhpcy5fZXZlbnRzW2VdLmxlbmd0aD5uJiYodGhpcy5fZXZlbnRzW2VdLndhcm5lZD0hMCxjb25zb2xlLmVycm9yKCIobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LiIsdGhpcy5fZXZlbnRzW2VdLmxlbmd0aCksImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUudHJhY2UmJmNvbnNvbGUudHJhY2UoKSksdGhpc30sci5wcm90b3R5cGUub249ci5wcm90b3R5cGUuYWRkTGlzdGVuZXIsci5wcm90b3R5cGUub25jZT1mdW5jdGlvbihlLHQpe2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7dmFyIG49ITE7ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlTGlzdGVuZXIoZSxyKSxufHwobj0hMCx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuIHIubGlzdGVuZXI9dCx0aGlzLm9uKGUsciksdGhpc30sci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLHMsYTtpZighbyh0KSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO2lmKCF0aGlzLl9ldmVudHN8fCF0aGlzLl9ldmVudHNbZV0pcmV0dXJuIHRoaXM7aWYocz0obj10aGlzLl9ldmVudHNbZV0pLmxlbmd0aCxyPS0xLG49PT10fHxvKG4ubGlzdGVuZXIpJiZuLmxpc3RlbmVyPT09dClkZWxldGUgdGhpcy5fZXZlbnRzW2VdLHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSx0KTtlbHNlIGlmKGkobikpe2ZvcihhPXM7YS0tID4wOylpZihuW2FdPT09dHx8blthXS5saXN0ZW5lciYmblthXS5saXN0ZW5lcj09PXQpe3I9YTticmVha31pZihyPDApcmV0dXJuIHRoaXM7MT09PW4ubGVuZ3RoPyhuLmxlbmd0aD0wLGRlbGV0ZSB0aGlzLl9ldmVudHNbZV0pOm4uc3BsaWNlKHIsMSksdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLHQpfXJldHVybiB0aGlzfSxyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dmFyIHQsbjtpZighdGhpcy5fZXZlbnRzKXJldHVybiB0aGlzO2lmKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuX2V2ZW50cz17fTp0aGlzLl9ldmVudHNbZV0mJmRlbGV0ZSB0aGlzLl9ldmVudHNbZV0sdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHQgaW4gdGhpcy5fZXZlbnRzKSJyZW1vdmVMaXN0ZW5lciIhPT10JiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyh0KTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInJlbW92ZUxpc3RlbmVyIiksdGhpcy5fZXZlbnRzPXt9LHRoaXN9aWYobyhuPXRoaXMuX2V2ZW50c1tlXSkpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLG4pO2Vsc2UgaWYobilmb3IoO24ubGVuZ3RoOyl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsbltuLmxlbmd0aC0xXSk7cmV0dXJuIGRlbGV0ZSB0aGlzLl9ldmVudHNbZV0sdGhpc30sci5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50c1tlXT9vKHRoaXMuX2V2ZW50c1tlXSk/W3RoaXMuX2V2ZW50c1tlXV06dGhpcy5fZXZlbnRzW2VdLnNsaWNlKCk6W119LHIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5fZXZlbnRzKXt2YXIgdD10aGlzLl9ldmVudHNbZV07aWYobyh0KSlyZXR1cm4gMTtpZih0KXJldHVybiB0Lmxlbmd0aH1yZXR1cm4gMH0sci5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubGlzdGVuZXJDb3VudCh0KX19LHt9XSw4OTpbZnVuY3Rpb24oZSx0LG4pe24ucmVhZD1mdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLHMsYT04Km8tci0xLGM9KDE8PGEpLTEsdT1jPj4xLGw9LTcscD1uP28tMTowLGQ9bj8tMToxLGg9ZVt0K3BdO2ZvcihwKz1kLGk9aCYoMTw8LWwpLTEsaD4+PS1sLGwrPWE7bD4wO2k9MjU2KmkrZVt0K3BdLHArPWQsbC09OCk7Zm9yKHM9aSYoMTw8LWwpLTEsaT4+PS1sLGwrPXI7bD4wO3M9MjU2KnMrZVt0K3BdLHArPWQsbC09OCk7aWYoMD09PWkpaT0xLXU7ZWxzZXtpZihpPT09YylyZXR1cm4gcz9OYU46MS8wKihoPy0xOjEpO3MrPU1hdGgucG93KDIsciksaS09dX1yZXR1cm4oaD8tMToxKSpzKk1hdGgucG93KDIsaS1yKX0sbi53cml0ZT1mdW5jdGlvbihlLHQsbixyLG8saSl7dmFyIHMsYSxjLHU9OCppLW8tMSxsPSgxPDx1KS0xLHA9bD4+MSxkPTIzPT09bz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsaD1yPzA6aS0xLGY9cj8xOi0xLGc9dDwwfHwwPT09dCYmMS90PDA/MTowO2Zvcih0PU1hdGguYWJzKHQpLGlzTmFOKHQpfHx0PT09MS8wPyhhPWlzTmFOKHQpPzE6MCxzPWwpOihzPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLHQqKGM9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sYyo9MiksKHQrPXMrcD49MT9kL2M6ZCpNYXRoLnBvdygyLDEtcCkpKmM+PTImJihzKyssYy89MikscytwPj1sPyhhPTAscz1sKTpzK3A+PTE/KGE9KHQqYy0xKSpNYXRoLnBvdygyLG8pLHMrPXApOihhPXQqTWF0aC5wb3coMixwLTEpKk1hdGgucG93KDIsbykscz0wKSk7bz49ODtlW24raF09MjU1JmEsaCs9ZixhLz0yNTYsby09OCk7Zm9yKHM9czw8b3xhLHUrPW87dT4wO2VbbitoXT0yNTUmcyxoKz1mLHMvPTI1Nix1LT04KTtlW24raC1mXXw9MTI4Kmd9fSx7fV0sOTA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj17fS50b1N0cmluZzt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09ci5jYWxsKGUpfX0se31dLDkxOltmdW5jdGlvbihlLHQsbil7IWZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUpe3JldHVybiBudWxsIT09ZSYmIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBuKGUpe3JldHVybiBudWxsIT09ZSYmIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gcihlLG8pe2lmKGU9PT1vKXJldHVybiEwO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSlyZXR1cm4hMTtpZighMD09PXQoZSkpe2lmKGUubGVuZ3RoIT09by5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspaWYoITE9PT1yKGVbaV0sb1tpXSkpcmV0dXJuITE7cmV0dXJuITB9aWYoITA9PT1uKGUpKXt2YXIgcz17fTtmb3IodmFyIGEgaW4gZSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKGUsYSkpe2lmKCExPT09cihlW2FdLG9bYV0pKXJldHVybiExO3NbYV09ITB9Zm9yKHZhciBjIGluIG8paWYoaGFzT3duUHJvcGVydHkuY2FsbChvLGMpJiYhMCE9PXNbY10pcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gbyhlKXtpZigiIj09PWV8fCExPT09ZXx8bnVsbD09PWUpcmV0dXJuITA7aWYodChlKSYmMD09PWUubGVuZ3RoKXJldHVybiEwO2lmKG4oZSkpe2Zvcih2YXIgciBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkocikpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9dmFyIGk7aT0iZnVuY3Rpb24iPT10eXBlb2YgU3RyaW5nLnByb3RvdHlwZS50cmltTGVmdD9mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltTGVmdCgpfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaCgvXlxzKiguKikvKVsxXX07dmFyIHM9MCxhPTEsYz0yLHU9MyxsPTQscD02LGQ9OCxoPTksZj17MDoibnVtYmVyIiwxOiJhbnkiLDI6InN0cmluZyIsMzoiYXJyYXkiLDQ6Im9iamVjdCIsNToiYm9vbGVhbiIsNjoiZXhwcmVzc2lvbiIsNzoibnVsbCIsODoiQXJyYXk8bnVtYmVyPiIsOToiQXJyYXk8c3RyaW5nPiJ9LGc9IkVPRiIsbT0iVW5xdW90ZWRJZGVudGlmaWVyIix2PSJRdW90ZWRJZGVudGlmaWVyIix5PSJSYnJhY2tldCIsRT0iUnBhcmVuIixTPSJDb21tYSIsYj0iQ29sb24iLFQ9IlJicmFjZSIsQz0iTnVtYmVyIixJPSJDdXJyZW50IixBPSJFeHByZWYiLF89IlBpcGUiLHc9Ik9yIixSPSJBbmQiLGs9IkVRIixMPSJHVCIsTj0iTFQiLE89IkdURSIsRD0iTFRFIixQPSJORSIseD0iRmxhdHRlbiIsTT0iU3RhciIsVT0iRmlsdGVyIixGPSJEb3QiLHE9Ik5vdCIsaj0iTGJyYWNlIixCPSJMYnJhY2tldCIsVj0iTHBhcmVuIixXPSJMaXRlcmFsIixIPXsiLiI6RiwiKiI6TSwiLCI6UywiOiI6YiwieyI6aiwifSI6VCwiXSI6eSwiKCI6ViwiKSI6RSwiQCI6SX0sej17IjwiOiEwLCI+IjohMCwiPSI6ITAsIiEiOiEwfSxHPXsiICI6ITAsIlx0IjohMCwiXG4iOiEwfTtmdW5jdGlvbiBLKGUpe3JldHVybiBlPj0iMCImJmU8PSI5Inx8Ii0iPT09ZX1mdW5jdGlvbiBYKCl7fVgucHJvdG90eXBlPXt0b2tlbml6ZTpmdW5jdGlvbihlKXt2YXIgdCxuLHIsbyxpPVtdO2Zvcih0aGlzLl9jdXJyZW50PTA7dGhpcy5fY3VycmVudDxlLmxlbmd0aDspaWYoKG89ZVt0aGlzLl9jdXJyZW50XSk+PSJhIiYmbzw9InoifHxvPj0iQSImJm88PSJaInx8Il8iPT09byl0PXRoaXMuX2N1cnJlbnQsbj10aGlzLl9jb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyKGUpLGkucHVzaCh7dHlwZTptLHZhbHVlOm4sc3RhcnQ6dH0pO2Vsc2UgaWYodm9pZCAwIT09SFtlW3RoaXMuX2N1cnJlbnRdXSlpLnB1c2goe3R5cGU6SFtlW3RoaXMuX2N1cnJlbnRdXSx2YWx1ZTplW3RoaXMuX2N1cnJlbnRdLHN0YXJ0OnRoaXMuX2N1cnJlbnR9KSx0aGlzLl9jdXJyZW50Kys7ZWxzZSBpZihLKGVbdGhpcy5fY3VycmVudF0pKXI9dGhpcy5fY29uc3VtZU51bWJlcihlKSxpLnB1c2gocik7ZWxzZSBpZigiWyI9PT1lW3RoaXMuX2N1cnJlbnRdKXI9dGhpcy5fY29uc3VtZUxCcmFja2V0KGUpLGkucHVzaChyKTtlbHNlIGlmKCciJz09PWVbdGhpcy5fY3VycmVudF0pdD10aGlzLl9jdXJyZW50LG49dGhpcy5fY29uc3VtZVF1b3RlZElkZW50aWZpZXIoZSksaS5wdXNoKHt0eXBlOnYsdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZigiJyI9PT1lW3RoaXMuX2N1cnJlbnRdKXQ9dGhpcy5fY3VycmVudCxuPXRoaXMuX2NvbnN1bWVSYXdTdHJpbmdMaXRlcmFsKGUpLGkucHVzaCh7dHlwZTpXLHZhbHVlOm4sc3RhcnQ6dH0pO2Vsc2UgaWYoImAiPT09ZVt0aGlzLl9jdXJyZW50XSl7dD10aGlzLl9jdXJyZW50O3ZhciBzPXRoaXMuX2NvbnN1bWVMaXRlcmFsKGUpO2kucHVzaCh7dHlwZTpXLHZhbHVlOnMsc3RhcnQ6dH0pfWVsc2UgaWYodm9pZCAwIT09eltlW3RoaXMuX2N1cnJlbnRdXSlpLnB1c2godGhpcy5fY29uc3VtZU9wZXJhdG9yKGUpKTtlbHNlIGlmKHZvaWQgMCE9PUdbZVt0aGlzLl9jdXJyZW50XV0pdGhpcy5fY3VycmVudCsrO2Vsc2UgaWYoIiYiPT09ZVt0aGlzLl9jdXJyZW50XSl0PXRoaXMuX2N1cnJlbnQsdGhpcy5fY3VycmVudCsrLCImIj09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyxpLnB1c2goe3R5cGU6Uix2YWx1ZToiJiYiLHN0YXJ0OnR9KSk6aS5wdXNoKHt0eXBlOkEsdmFsdWU6IiYiLHN0YXJ0OnR9KTtlbHNle2lmKCJ8IiE9PWVbdGhpcy5fY3VycmVudF0pe3ZhciBhPW5ldyBFcnJvcigiVW5rbm93biBjaGFyYWN0ZXI6IitlW3RoaXMuX2N1cnJlbnRdKTt0aHJvdyBhLm5hbWU9IkxleGVyRXJyb3IiLGF9dD10aGlzLl9jdXJyZW50LHRoaXMuX2N1cnJlbnQrKywifCI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50KyssaS5wdXNoKHt0eXBlOncsdmFsdWU6Inx8IixzdGFydDp0fSkpOmkucHVzaCh7dHlwZTpfLHZhbHVlOiJ8IixzdGFydDp0fSl9cmV0dXJuIGl9LF9jb25zdW1lVW5xdW90ZWRJZGVudGlmaWVyOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5fY3VycmVudDtmb3IodGhpcy5fY3VycmVudCsrO3RoaXMuX2N1cnJlbnQ8ZS5sZW5ndGgmJigodD1lW3RoaXMuX2N1cnJlbnRdKT49ImEiJiZ0PD0ieiJ8fHQ+PSJBIiYmdDw9IloifHx0Pj0iMCImJnQ8PSI5Inx8Il8iPT09dCk7KXRoaXMuX2N1cnJlbnQrKztyZXR1cm4gZS5zbGljZShuLHRoaXMuX2N1cnJlbnQpfSxfY29uc3VtZVF1b3RlZElkZW50aWZpZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudDt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciBuPWUubGVuZ3RoOyciJyE9PWVbdGhpcy5fY3VycmVudF0mJnRoaXMuX2N1cnJlbnQ8bjspe3ZhciByPXRoaXMuX2N1cnJlbnQ7IlxcIiE9PWVbcl18fCJcXCIhPT1lW3IrMV0mJiciJyE9PWVbcisxXT9yKys6cis9Mix0aGlzLl9jdXJyZW50PXJ9cmV0dXJuIHRoaXMuX2N1cnJlbnQrKyxKU09OLnBhcnNlKGUuc2xpY2UodCx0aGlzLl9jdXJyZW50KSl9LF9jb25zdW1lUmF3U3RyaW5nTGl0ZXJhbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3RoaXMuX2N1cnJlbnQrKztmb3IodmFyIG49ZS5sZW5ndGg7IiciIT09ZVt0aGlzLl9jdXJyZW50XSYmdGhpcy5fY3VycmVudDxuOyl7dmFyIHI9dGhpcy5fY3VycmVudDsiXFwiIT09ZVtyXXx8IlxcIiE9PWVbcisxXSYmIiciIT09ZVtyKzFdP3IrKzpyKz0yLHRoaXMuX2N1cnJlbnQ9cn1yZXR1cm4gdGhpcy5fY3VycmVudCsrLGUuc2xpY2UodCsxLHRoaXMuX2N1cnJlbnQtMSkucmVwbGFjZSgiXFwnIiwiJyIpfSxfY29uc3VtZU51bWJlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3RoaXMuX2N1cnJlbnQrKztmb3IodmFyIG49ZS5sZW5ndGg7SyhlW3RoaXMuX2N1cnJlbnRdKSYmdGhpcy5fY3VycmVudDxuOyl0aGlzLl9jdXJyZW50Kys7dmFyIHI9cGFyc2VJbnQoZS5zbGljZSh0LHRoaXMuX2N1cnJlbnQpKTtyZXR1cm57dHlwZTpDLHZhbHVlOnIsc3RhcnQ6dH19LF9jb25zdW1lTEJyYWNrZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudDtyZXR1cm4gdGhpcy5fY3VycmVudCsrLCI/Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTpVLHZhbHVlOiJbPyIsc3RhcnQ6dH0pOiJdIj09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTp4LHZhbHVlOiJbXSIsc3RhcnQ6dH0pOnt0eXBlOkIsdmFsdWU6IlsiLHN0YXJ0OnR9fSxfY29uc3VtZU9wZXJhdG9yOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQsbj1lW3RdO3JldHVybiB0aGlzLl9jdXJyZW50KyssIiEiPT09bj8iPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6UCx2YWx1ZToiIT0iLHN0YXJ0OnR9KTp7dHlwZTpxLHZhbHVlOiIhIixzdGFydDp0fToiPCI9PT1uPyI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTpELHZhbHVlOiI8PSIsc3RhcnQ6dH0pOnt0eXBlOk4sdmFsdWU6IjwiLHN0YXJ0OnR9OiI+Ij09PW4/Ij0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOk8sdmFsdWU6Ij49IixzdGFydDp0fSk6e3R5cGU6TCx2YWx1ZToiPiIsc3RhcnQ6dH06Ij0iPT09biYmIj0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOmssdmFsdWU6Ij09IixzdGFydDp0fSk6dm9pZCAwfSxfY29uc3VtZUxpdGVyYWw6ZnVuY3Rpb24oZSl7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgdCxuPXRoaXMuX2N1cnJlbnQscj1lLmxlbmd0aDsiYCIhPT1lW3RoaXMuX2N1cnJlbnRdJiZ0aGlzLl9jdXJyZW50PHI7KXt2YXIgbz10aGlzLl9jdXJyZW50OyJcXCIhPT1lW29dfHwiXFwiIT09ZVtvKzFdJiYiYCIhPT1lW28rMV0/bysrOm8rPTIsdGhpcy5fY3VycmVudD1vfXZhciBzPWkoZS5zbGljZShuLHRoaXMuX2N1cnJlbnQpKTtyZXR1cm4gcz1zLnJlcGxhY2UoIlxcYCIsImAiKSx0PXRoaXMuX2xvb2tzTGlrZUpTT04ocyk/SlNPTi5wYXJzZShzKTpKU09OLnBhcnNlKCciJytzKyciJyksdGhpcy5fY3VycmVudCsrLHR9LF9sb29rc0xpa2VKU09OOmZ1bmN0aW9uKGUpe2lmKCIiPT09ZSlyZXR1cm4hMTtpZignW3siJy5pbmRleE9mKGVbMF0pPj0wKXJldHVybiEwO2lmKFsidHJ1ZSIsImZhbHNlIiwibnVsbCJdLmluZGV4T2YoZSk+PTApcmV0dXJuITA7aWYoISgiLTAxMjM0NTY3ODkiLmluZGV4T2YoZVswXSk+PTApKXJldHVybiExO3RyeXtyZXR1cm4gSlNPTi5wYXJzZShlKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19fTt2YXIgWT17fTtmdW5jdGlvbiAkKCl7fWZ1bmN0aW9uIEooZSl7dGhpcy5ydW50aW1lPWV9ZnVuY3Rpb24gUShlKXt0aGlzLl9pbnRlcnByZXRlcj1lLHRoaXMuZnVuY3Rpb25UYWJsZT17YWJzOntfZnVuYzp0aGlzLl9mdW5jdGlvbkFicyxfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LGF2Zzp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25BdmcsX3NpZ25hdHVyZTpbe3R5cGVzOltkXX1dfSxjZWlsOntfZnVuYzp0aGlzLl9mdW5jdGlvbkNlaWwsX3NpZ25hdHVyZTpbe3R5cGVzOltzXX1dfSxjb250YWluczp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Db250YWlucyxfc2lnbmF0dXJlOlt7dHlwZXM6W2MsdV19LHt0eXBlczpbYV19XX0sZW5kc193aXRoOntfZnVuYzp0aGlzLl9mdW5jdGlvbkVuZHNXaXRoLF9zaWduYXR1cmU6W3t0eXBlczpbY119LHt0eXBlczpbY119XX0sZmxvb3I6e19mdW5jOnRoaXMuX2Z1bmN0aW9uRmxvb3IsX3NpZ25hdHVyZTpbe3R5cGVzOltzXX1dfSxsZW5ndGg6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTGVuZ3RoLF9zaWduYXR1cmU6W3t0eXBlczpbYyx1LGxdfV19LG1hcDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NYXAsX3NpZ25hdHVyZTpbe3R5cGVzOltwXX0se3R5cGVzOlt1XX1dfSxtYXg6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWF4LF9zaWduYXR1cmU6W3t0eXBlczpbZCxoXX1dfSxtZXJnZTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NZXJnZSxfc2lnbmF0dXJlOlt7dHlwZXM6W2xdLHZhcmlhZGljOiEwfV19LG1heF9ieTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NYXhCeSxfc2lnbmF0dXJlOlt7dHlwZXM6W3VdfSx7dHlwZXM6W3BdfV19LHN1bTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25TdW0sX3NpZ25hdHVyZTpbe3R5cGVzOltkXX1dfSxzdGFydHNfd2l0aDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25TdGFydHNXaXRoLF9zaWduYXR1cmU6W3t0eXBlczpbY119LHt0eXBlczpbY119XX0sbWluOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1pbixfc2lnbmF0dXJlOlt7dHlwZXM6W2QsaF19XX0sbWluX2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvbk1pbkJ5LF9zaWduYXR1cmU6W3t0eXBlczpbdV19LHt0eXBlczpbcF19XX0sdHlwZTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25UeXBlLF9zaWduYXR1cmU6W3t0eXBlczpbYV19XX0sa2V5czp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25LZXlzLF9zaWduYXR1cmU6W3t0eXBlczpbbF19XX0sdmFsdWVzOntfZnVuYzp0aGlzLl9mdW5jdGlvblZhbHVlcyxfc2lnbmF0dXJlOlt7dHlwZXM6W2xdfV19LHNvcnQ6e19mdW5jOnRoaXMuX2Z1bmN0aW9uU29ydCxfc2lnbmF0dXJlOlt7dHlwZXM6W2gsZF19XX0sc29ydF9ieTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Tb3J0QnksX3NpZ25hdHVyZTpbe3R5cGVzOlt1XX0se3R5cGVzOltwXX1dfSxqb2luOntfZnVuYzp0aGlzLl9mdW5jdGlvbkpvaW4sX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltoXX1dfSxyZXZlcnNlOntfZnVuYzp0aGlzLl9mdW5jdGlvblJldmVyc2UsX3NpZ25hdHVyZTpbe3R5cGVzOltjLHVdfV19LHRvX2FycmF5OntfZnVuYzp0aGlzLl9mdW5jdGlvblRvQXJyYXksX3NpZ25hdHVyZTpbe3R5cGVzOlthXX1dfSx0b19zdHJpbmc6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVG9TdHJpbmcsX3NpZ25hdHVyZTpbe3R5cGVzOlthXX1dfSx0b19udW1iZXI6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVG9OdW1iZXIsX3NpZ25hdHVyZTpbe3R5cGVzOlthXX1dfSxub3RfbnVsbDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ob3ROdWxsLF9zaWduYXR1cmU6W3t0eXBlczpbYV0sdmFyaWFkaWM6ITB9XX19fVlbZ109MCxZW21dPTAsWVt2XT0wLFlbeV09MCxZW0VdPTAsWVtTXT0wLFlbVF09MCxZW0NdPTAsWVtJXT0wLFlbQV09MCxZW19dPTEsWVt3XT0yLFlbUl09MyxZW2tdPTUsWVtMXT01LFlbTl09NSxZW09dPTUsWVtEXT01LFlbUF09NSxZW3hdPTksWVtNXT0yMCxZW1VdPTIxLFlbRl09NDAsWVtxXT00NSxZW2pdPTUwLFlbQl09NTUsWVtWXT02MCwkLnByb3RvdHlwZT17cGFyc2U6ZnVuY3Rpb24oZSl7dGhpcy5fbG9hZFRva2VucyhlKSx0aGlzLmluZGV4PTA7dmFyIHQ9dGhpcy5leHByZXNzaW9uKDApO2lmKHRoaXMuX2xvb2thaGVhZCgwKSE9PWcpe3ZhciBuPXRoaXMuX2xvb2thaGVhZFRva2VuKDApLHI9bmV3IEVycm9yKCJVbmV4cGVjdGVkIHRva2VuIHR5cGU6ICIrbi50eXBlKyIsIHZhbHVlOiAiK24udmFsdWUpO3Rocm93IHIubmFtZT0iUGFyc2VyRXJyb3IiLHJ9cmV0dXJuIHR9LF9sb2FkVG9rZW5zOmZ1bmN0aW9uKGUpe3ZhciB0PShuZXcgWCkudG9rZW5pemUoZSk7dC5wdXNoKHt0eXBlOmcsdmFsdWU6IiIsc3RhcnQ6ZS5sZW5ndGh9KSx0aGlzLnRva2Vucz10fSxleHByZXNzaW9uOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xvb2thaGVhZFRva2VuKDApO3RoaXMuX2FkdmFuY2UoKTtmb3IodmFyIG49dGhpcy5udWQodCkscj10aGlzLl9sb29rYWhlYWQoMCk7ZTxZW3JdOyl0aGlzLl9hZHZhbmNlKCksbj10aGlzLmxlZChyLG4pLHI9dGhpcy5fbG9va2FoZWFkKDApO3JldHVybiBufSxfbG9va2FoZWFkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRva2Vuc1t0aGlzLmluZGV4K2VdLnR5cGV9LF9sb29rYWhlYWRUb2tlbjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5pbmRleCtlXX0sX2FkdmFuY2U6ZnVuY3Rpb24oKXt0aGlzLmluZGV4Kyt9LG51ZDpmdW5jdGlvbihlKXt2YXIgdCxuO3N3aXRjaChlLnR5cGUpe2Nhc2UgVzpyZXR1cm57dHlwZToiTGl0ZXJhbCIsdmFsdWU6ZS52YWx1ZX07Y2FzZSBtOnJldHVybnt0eXBlOiJGaWVsZCIsbmFtZTplLnZhbHVlfTtjYXNlIHY6dmFyIHI9e3R5cGU6IkZpZWxkIixuYW1lOmUudmFsdWV9O2lmKHRoaXMuX2xvb2thaGVhZCgwKT09PVYpdGhyb3cgbmV3IEVycm9yKCJRdW90ZWQgaWRlbnRpZmllciBub3QgYWxsb3dlZCBmb3IgZnVuY3Rpb24gbmFtZXMuIik7cmV0dXJuIHI7Y2FzZSBxOnJldHVybnt0eXBlOiJOb3RFeHByZXNzaW9uIixjaGlsZHJlbjpbdD10aGlzLmV4cHJlc3Npb24oWS5Ob3QpXX07Y2FzZSBNOnJldHVybiB0PW51bGwse3R5cGU6IlZhbHVlUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOiJJZGVudGl0eSJ9LHQ9dGhpcy5fbG9va2FoZWFkKDApPT09eT97dHlwZToiSWRlbnRpdHkifTp0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5TdGFyKV19O2Nhc2UgVTpyZXR1cm4gdGhpcy5sZWQoZS50eXBlLHt0eXBlOiJJZGVudGl0eSJ9KTtjYXNlIGo6cmV0dXJuIHRoaXMuX3BhcnNlTXVsdGlzZWxlY3RIYXNoKCk7Y2FzZSB4OnJldHVybnt0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6eCxjaGlsZHJlbjpbe3R5cGU6IklkZW50aXR5In1dfSx0PXRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLkZsYXR0ZW4pXX07Y2FzZSBCOnJldHVybiB0aGlzLl9sb29rYWhlYWQoMCk9PT1DfHx0aGlzLl9sb29rYWhlYWQoMCk9PT1iPyh0PXRoaXMuX3BhcnNlSW5kZXhFeHByZXNzaW9uKCksdGhpcy5fcHJvamVjdElmU2xpY2Uoe3R5cGU6IklkZW50aXR5In0sdCkpOnRoaXMuX2xvb2thaGVhZCgwKT09PU0mJnRoaXMuX2xvb2thaGVhZCgxKT09PXk/KHRoaXMuX2FkdmFuY2UoKSx0aGlzLl9hZHZhbmNlKCkse3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt7dHlwZToiSWRlbnRpdHkifSx0PXRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLlN0YXIpXX0pOnRoaXMuX3BhcnNlTXVsdGlzZWxlY3RMaXN0KCk7Y2FzZSBJOnJldHVybnt0eXBlOkl9O2Nhc2UgQTpyZXR1cm57dHlwZToiRXhwcmVzc2lvblJlZmVyZW5jZSIsY2hpbGRyZW46W249dGhpcy5leHByZXNzaW9uKFkuRXhwcmVmKV19O2Nhc2UgVjpmb3IodmFyIG89W107dGhpcy5fbG9va2FoZWFkKDApIT09RTspdGhpcy5fbG9va2FoZWFkKDApPT09ST8obj17dHlwZTpJfSx0aGlzLl9hZHZhbmNlKCkpOm49dGhpcy5leHByZXNzaW9uKDApLG8ucHVzaChuKTtyZXR1cm4gdGhpcy5fbWF0Y2goRSksb1swXTtkZWZhdWx0OnRoaXMuX2Vycm9yVG9rZW4oZSl9fSxsZWQ6ZnVuY3Rpb24oZSx0KXt2YXIgbjtzd2l0Y2goZSl7Y2FzZSBGOnZhciByPVkuRG90O3JldHVybiB0aGlzLl9sb29rYWhlYWQoMCkhPT1NP3t0eXBlOiJTdWJleHByZXNzaW9uIixjaGlsZHJlbjpbdCxuPXRoaXMuX3BhcnNlRG90UkhTKHIpXX06KHRoaXMuX2FkdmFuY2UoKSx7dHlwZToiVmFsdWVQcm9qZWN0aW9uIixjaGlsZHJlbjpbdCxuPXRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhyKV19KTtjYXNlIF86cmV0dXJuIG49dGhpcy5leHByZXNzaW9uKFkuUGlwZSkse3R5cGU6XyxjaGlsZHJlbjpbdCxuXX07Y2FzZSB3OnJldHVybnt0eXBlOiJPckV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5leHByZXNzaW9uKFkuT3IpXX07Y2FzZSBSOnJldHVybnt0eXBlOiJBbmRFeHByZXNzaW9uIixjaGlsZHJlbjpbdCxuPXRoaXMuZXhwcmVzc2lvbihZLkFuZCldfTtjYXNlIFY6Zm9yKHZhciBvLGk9dC5uYW1lLHM9W107dGhpcy5fbG9va2FoZWFkKDApIT09RTspdGhpcy5fbG9va2FoZWFkKDApPT09ST8obz17dHlwZTpJfSx0aGlzLl9hZHZhbmNlKCkpOm89dGhpcy5leHByZXNzaW9uKDApLHRoaXMuX2xvb2thaGVhZCgwKT09PVMmJnRoaXMuX21hdGNoKFMpLHMucHVzaChvKTtyZXR1cm4gdGhpcy5fbWF0Y2goRSkse3R5cGU6IkZ1bmN0aW9uIixuYW1lOmksY2hpbGRyZW46c307Y2FzZSBVOnZhciBhPXRoaXMuZXhwcmVzc2lvbigwKTtyZXR1cm4gdGhpcy5fbWF0Y2goeSkse3R5cGU6IkZpbHRlclByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fbG9va2FoZWFkKDApPT09eD97dHlwZToiSWRlbnRpdHkifTp0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5GaWx0ZXIpLGFdfTtjYXNlIHg6cmV0dXJue3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt7dHlwZTp4LGNoaWxkcmVuOlt0XX0sdGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuRmxhdHRlbildfTtjYXNlIGs6Y2FzZSBQOmNhc2UgTDpjYXNlIE86Y2FzZSBOOmNhc2UgRDpyZXR1cm4gdGhpcy5fcGFyc2VDb21wYXJhdG9yKHQsZSk7Y2FzZSBCOnZhciBjPXRoaXMuX2xvb2thaGVhZFRva2VuKDApO3JldHVybiBjLnR5cGU9PT1DfHxjLnR5cGU9PT1iPyhuPXRoaXMuX3BhcnNlSW5kZXhFeHByZXNzaW9uKCksdGhpcy5fcHJvamVjdElmU2xpY2UodCxuKSk6KHRoaXMuX21hdGNoKE0pLHRoaXMuX21hdGNoKHkpLHt0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbdCxuPXRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLlN0YXIpXX0pO2RlZmF1bHQ6dGhpcy5fZXJyb3JUb2tlbih0aGlzLl9sb29rYWhlYWRUb2tlbigwKSl9fSxfbWF0Y2g6ZnVuY3Rpb24oZSl7aWYodGhpcy5fbG9va2FoZWFkKDApIT09ZSl7dmFyIHQ9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCksbj1uZXcgRXJyb3IoIkV4cGVjdGVkICIrZSsiLCBnb3Q6ICIrdC50eXBlKTt0aHJvdyBuLm5hbWU9IlBhcnNlckVycm9yIixufXRoaXMuX2FkdmFuY2UoKX0sX2Vycm9yVG9rZW46ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEVycm9yKCJJbnZhbGlkIHRva2VuICgiK2UudHlwZSsnKTogIicrZS52YWx1ZSsnIicpO3Rocm93IHQubmFtZT0iUGFyc2VyRXJyb3IiLHR9LF9wYXJzZUluZGV4RXhwcmVzc2lvbjpmdW5jdGlvbigpe2lmKHRoaXMuX2xvb2thaGVhZCgwKT09PWJ8fHRoaXMuX2xvb2thaGVhZCgxKT09PWIpcmV0dXJuIHRoaXMuX3BhcnNlU2xpY2VFeHByZXNzaW9uKCk7dmFyIGU9e3R5cGU6IkluZGV4Iix2YWx1ZTp0aGlzLl9sb29rYWhlYWRUb2tlbigwKS52YWx1ZX07cmV0dXJuIHRoaXMuX2FkdmFuY2UoKSx0aGlzLl9tYXRjaCh5KSxlfSxfcHJvamVjdElmU2xpY2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj17dHlwZToiSW5kZXhFeHByZXNzaW9uIixjaGlsZHJlbjpbZSx0XX07cmV0dXJuIlNsaWNlIj09PXQudHlwZT97dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W24sdGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfTpufSxfcGFyc2VTbGljZUV4cHJlc3Npb246ZnVuY3Rpb24oKXtmb3IodmFyIGU9W251bGwsbnVsbCxudWxsXSx0PTAsbj10aGlzLl9sb29rYWhlYWQoMCk7biE9PXkmJnQ8Mzspe2lmKG49PT1iKXQrKyx0aGlzLl9hZHZhbmNlKCk7ZWxzZXtpZihuIT09Qyl7dmFyIHI9dGhpcy5fbG9va2FoZWFkKDApLG89bmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgdG9rZW46ICIrci52YWx1ZSsiKCIrci50eXBlKyIpIik7dGhyb3cgby5uYW1lPSJQYXJzZXJlcnJvciIsb31lW3RdPXRoaXMuX2xvb2thaGVhZFRva2VuKDApLnZhbHVlLHRoaXMuX2FkdmFuY2UoKX1uPXRoaXMuX2xvb2thaGVhZCgwKX1yZXR1cm4gdGhpcy5fbWF0Y2goeSkse3R5cGU6IlNsaWNlIixjaGlsZHJlbjplfX0sX3BhcnNlQ29tcGFyYXRvcjpmdW5jdGlvbihlLHQpe3JldHVybnt0eXBlOiJDb21wYXJhdG9yIixuYW1lOnQsY2hpbGRyZW46W2UsdGhpcy5leHByZXNzaW9uKFlbdF0pXX19LF9wYXJzZURvdFJIUzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9sb29rYWhlYWQoMCk7cmV0dXJuW20sdixNXS5pbmRleE9mKHQpPj0wP3RoaXMuZXhwcmVzc2lvbihlKTp0PT09Qj8odGhpcy5fbWF0Y2goQiksdGhpcy5fcGFyc2VNdWx0aXNlbGVjdExpc3QoKSk6dD09PWo/KHRoaXMuX21hdGNoKGopLHRoaXMuX3BhcnNlTXVsdGlzZWxlY3RIYXNoKCkpOnZvaWQgMH0sX3BhcnNlUHJvamVjdGlvblJIUzpmdW5jdGlvbihlKXt2YXIgdDtpZihZW3RoaXMuX2xvb2thaGVhZCgwKV08MTApdD17dHlwZToiSWRlbnRpdHkifTtlbHNlIGlmKHRoaXMuX2xvb2thaGVhZCgwKT09PUIpdD10aGlzLmV4cHJlc3Npb24oZSk7ZWxzZSBpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1VKXQ9dGhpcy5leHByZXNzaW9uKGUpO2Vsc2V7aWYodGhpcy5fbG9va2FoZWFkKDApIT09Ril7dmFyIG49dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkscj1uZXcgRXJyb3IoIlN5dGFueCBlcnJvciwgdW5leHBlY3RlZCB0b2tlbjogIituLnZhbHVlKyIoIituLnR5cGUrIikiKTt0aHJvdyByLm5hbWU9IlBhcnNlckVycm9yIixyfXRoaXMuX21hdGNoKEYpLHQ9dGhpcy5fcGFyc2VEb3RSSFMoZSl9cmV0dXJuIHR9LF9wYXJzZU11bHRpc2VsZWN0TGlzdDpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT15Oyl7dmFyIHQ9dGhpcy5leHByZXNzaW9uKDApO2lmKGUucHVzaCh0KSx0aGlzLl9sb29rYWhlYWQoMCk9PT1TJiYodGhpcy5fbWF0Y2goUyksdGhpcy5fbG9va2FoZWFkKDApPT09eSkpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHRva2VuIFJicmFja2V0Iil9cmV0dXJuIHRoaXMuX21hdGNoKHkpLHt0eXBlOiJNdWx0aVNlbGVjdExpc3QiLGNoaWxkcmVuOmV9fSxfcGFyc2VNdWx0aXNlbGVjdEhhc2g6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdCxuLHI9W10sbz1bbSx2XTs7KXtpZihlPXRoaXMuX2xvb2thaGVhZFRva2VuKDApLG8uaW5kZXhPZihlLnR5cGUpPDApdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RpbmcgYW4gaWRlbnRpZmllciB0b2tlbiwgZ290OiAiK2UudHlwZSk7aWYodD1lLnZhbHVlLHRoaXMuX2FkdmFuY2UoKSx0aGlzLl9tYXRjaChiKSxuPXt0eXBlOiJLZXlWYWx1ZVBhaXIiLG5hbWU6dCx2YWx1ZTp0aGlzLmV4cHJlc3Npb24oMCl9LHIucHVzaChuKSx0aGlzLl9sb29rYWhlYWQoMCk9PT1TKXRoaXMuX21hdGNoKFMpO2Vsc2UgaWYodGhpcy5fbG9va2FoZWFkKDApPT09VCl7dGhpcy5fbWF0Y2goVCk7YnJlYWt9fXJldHVybnt0eXBlOiJNdWx0aVNlbGVjdEhhc2giLGNoaWxkcmVuOnJ9fX0sSi5wcm90b3R5cGU9e3NlYXJjaDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnZpc2l0KGUsdCl9LHZpc2l0OmZ1bmN0aW9uKGUsaSl7dmFyIHMsYSxjLHUsbCxwLGQsaCxmO3N3aXRjaChlLnR5cGUpe2Nhc2UiRmllbGQiOnJldHVybiBudWxsIT09aSYmbihpKT92b2lkIDA9PT0ocD1pW2UubmFtZV0pP251bGw6cDpudWxsO2Nhc2UiU3ViZXhwcmVzc2lvbiI6Zm9yKGM9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpLGY9MTtmPGUuY2hpbGRyZW4ubGVuZ3RoO2YrKylpZihudWxsPT09KGM9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGMpKSlyZXR1cm4gbnVsbDtyZXR1cm4gYztjYXNlIkluZGV4RXhwcmVzc2lvbiI6cmV0dXJuIGQ9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpLHRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxkKTtjYXNlIkluZGV4IjppZighdChpKSlyZXR1cm4gbnVsbDt2YXIgZz1lLnZhbHVlO3JldHVybiBnPDAmJihnPWkubGVuZ3RoK2cpLHZvaWQgMD09PShjPWlbZ10pJiYoYz1udWxsKSxjO2Nhc2UiU2xpY2UiOmlmKCF0KGkpKXJldHVybiBudWxsO3ZhciBtPWUuY2hpbGRyZW4uc2xpY2UoMCksdj10aGlzLmNvbXB1dGVTbGljZVBhcmFtcyhpLmxlbmd0aCxtKSx5PXZbMF0sRT12WzFdLFM9dlsyXTtpZihjPVtdLFM+MClmb3IoZj15O2Y8RTtmKz1TKWMucHVzaChpW2ZdKTtlbHNlIGZvcihmPXk7Zj5FO2YrPVMpYy5wdXNoKGlbZl0pO3JldHVybiBjO2Nhc2UiUHJvamVjdGlvbiI6dmFyIGI9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpO2lmKCF0KGIpKXJldHVybiBudWxsO2ZvcihoPVtdLGY9MDtmPGIubGVuZ3RoO2YrKyludWxsIT09KGE9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGJbZl0pKSYmaC5wdXNoKGEpO3JldHVybiBoO2Nhc2UiVmFsdWVQcm9qZWN0aW9uIjppZighbihiPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSkpcmV0dXJuIG51bGw7aD1bXTt2YXIgVD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj1bXSxyPTA7cjx0Lmxlbmd0aDtyKyspbi5wdXNoKGVbdFtyXV0pO3JldHVybiBufShiKTtmb3IoZj0wO2Y8VC5sZW5ndGg7ZisrKW51bGwhPT0oYT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sVFtmXSkpJiZoLnB1c2goYSk7cmV0dXJuIGg7Y2FzZSJGaWx0ZXJQcm9qZWN0aW9uIjppZighdChiPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSkpcmV0dXJuIG51bGw7dmFyIEM9W10sdz1bXTtmb3IoZj0wO2Y8Yi5sZW5ndGg7ZisrKW8ocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMl0sYltmXSkpfHxDLnB1c2goYltmXSk7Zm9yKHZhciBSPTA7UjxDLmxlbmd0aDtSKyspbnVsbCE9PShhPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxDW1JdKSkmJncucHVzaChhKTtyZXR1cm4gdztjYXNlIkNvbXBhcmF0b3IiOnN3aXRjaCh1PXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSxsPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxpKSxlLm5hbWUpe2Nhc2UgazpjPXIodSxsKTticmVhaztjYXNlIFA6Yz0hcih1LGwpO2JyZWFrO2Nhc2UgTDpjPXU+bDticmVhaztjYXNlIE86Yz11Pj1sO2JyZWFrO2Nhc2UgTjpjPXU8bDticmVhaztjYXNlIEQ6Yz11PD1sO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbXBhcmF0b3I6ICIrZS5uYW1lKX1yZXR1cm4gYztjYXNlIHg6dmFyIE09dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpO2lmKCF0KE0pKXJldHVybiBudWxsO3ZhciBVPVtdO2ZvcihmPTA7ZjxNLmxlbmd0aDtmKyspdChhPU1bZl0pP1UucHVzaC5hcHBseShVLGEpOlUucHVzaChhKTtyZXR1cm4gVTtjYXNlIklkZW50aXR5IjpyZXR1cm4gaTtjYXNlIk11bHRpU2VsZWN0TGlzdCI6aWYobnVsbD09PWkpcmV0dXJuIG51bGw7Zm9yKGg9W10sZj0wO2Y8ZS5jaGlsZHJlbi5sZW5ndGg7ZisrKWgucHVzaCh0aGlzLnZpc2l0KGUuY2hpbGRyZW5bZl0saSkpO3JldHVybiBoO2Nhc2UiTXVsdGlTZWxlY3RIYXNoIjppZihudWxsPT09aSlyZXR1cm4gbnVsbDt2YXIgRjtmb3IoaD17fSxmPTA7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspaFsoRj1lLmNoaWxkcmVuW2ZdKS5uYW1lXT10aGlzLnZpc2l0KEYudmFsdWUsaSk7cmV0dXJuIGg7Y2FzZSJPckV4cHJlc3Npb24iOnJldHVybiBvKHM9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSYmKHM9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpKSxzO2Nhc2UiQW5kRXhwcmVzc2lvbiI6cmV0dXJuITA9PT1vKHU9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKT91OnRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxpKTtjYXNlIk5vdEV4cHJlc3Npb24iOnJldHVybiBvKHU9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKTtjYXNlIkxpdGVyYWwiOnJldHVybiBlLnZhbHVlO2Nhc2UgXzpyZXR1cm4gZD10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksdGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGQpO2Nhc2UgSTpyZXR1cm4gaTtjYXNlIkZ1bmN0aW9uIjp2YXIgcT1bXTtmb3IoZj0wO2Y8ZS5jaGlsZHJlbi5sZW5ndGg7ZisrKXEucHVzaCh0aGlzLnZpc2l0KGUuY2hpbGRyZW5bZl0saSkpO3JldHVybiB0aGlzLnJ1bnRpbWUuY2FsbEZ1bmN0aW9uKGUubmFtZSxxKTtjYXNlIkV4cHJlc3Npb25SZWZlcmVuY2UiOnZhciBqPWUuY2hpbGRyZW5bMF07cmV0dXJuIGouam1lc3BhdGhUeXBlPUEsajtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBub2RlIHR5cGU6ICIrZS50eXBlKX19LGNvbXB1dGVTbGljZVBhcmFtczpmdW5jdGlvbihlLHQpe3ZhciBuPXRbMF0scj10WzFdLG89dFsyXSxpPVtudWxsLG51bGwsbnVsbF07aWYobnVsbD09PW8pbz0xO2Vsc2UgaWYoMD09PW8pe3ZhciBzPW5ldyBFcnJvcigiSW52YWxpZCBzbGljZSwgc3RlcCBjYW5ub3QgYmUgMCIpO3Rocm93IHMubmFtZT0iUnVudGltZUVycm9yIixzfXZhciBhPW88MDtyZXR1cm4gbj1udWxsPT09bj9hP2UtMTowOnRoaXMuY2FwU2xpY2VSYW5nZShlLG4sbykscj1udWxsPT09cj9hPy0xOmU6dGhpcy5jYXBTbGljZVJhbmdlKGUscixvKSxpWzBdPW4saVsxXT1yLGlbMl09byxpfSxjYXBTbGljZVJhbmdlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdDwwPyh0Kz1lKTwwJiYodD1uPDA/LTE6MCk6dD49ZSYmKHQ9bjwwP2UtMTplKSx0fX0sUS5wcm90b3R5cGU9e2NhbGxGdW5jdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZnVuY3Rpb25UYWJsZVtlXTtpZih2b2lkIDA9PT1uKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBmdW5jdGlvbjogIitlKyIoKSIpO3JldHVybiB0aGlzLl92YWxpZGF0ZUFyZ3MoZSx0LG4uX3NpZ25hdHVyZSksbi5fZnVuYy5jYWxsKHRoaXMsdCl9LF92YWxpZGF0ZUFyZ3M6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8saSxzO2lmKG5bbi5sZW5ndGgtMV0udmFyaWFkaWMpe2lmKHQubGVuZ3RoPG4ubGVuZ3RoKXRocm93IHI9MT09PW4ubGVuZ3RoPyIgYXJndW1lbnQiOiIgYXJndW1lbnRzIixuZXcgRXJyb3IoIkFyZ3VtZW50RXJyb3I6ICIrZSsiKCkgdGFrZXMgYXQgbGVhc3QiK24ubGVuZ3RoK3IrIiBidXQgcmVjZWl2ZWQgIit0Lmxlbmd0aCl9ZWxzZSBpZih0Lmxlbmd0aCE9PW4ubGVuZ3RoKXRocm93IHI9MT09PW4ubGVuZ3RoPyIgYXJndW1lbnQiOiIgYXJndW1lbnRzIixuZXcgRXJyb3IoIkFyZ3VtZW50RXJyb3I6ICIrZSsiKCkgdGFrZXMgIituLmxlbmd0aCtyKyIgYnV0IHJlY2VpdmVkICIrdC5sZW5ndGgpO2Zvcih2YXIgYT0wO2E8bi5sZW5ndGg7YSsrKXtzPSExLG89blthXS50eXBlcyxpPXRoaXMuX2dldFR5cGVOYW1lKHRbYV0pO2Zvcih2YXIgYz0wO2M8by5sZW5ndGg7YysrKWlmKHRoaXMuX3R5cGVNYXRjaGVzKGksb1tjXSx0W2FdKSl7cz0hMDticmVha31pZighcyl7dmFyIHU9by5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBmW2VdfSkpLmpvaW4oIiwiKTt0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogIitlKyIoKSBleHBlY3RlZCBhcmd1bWVudCAiKyhhKzEpKyIgdG8gYmUgdHlwZSAiK3UrIiBidXQgcmVjZWl2ZWQgdHlwZSAiK2ZbaV0rIiBpbnN0ZWFkLiIpfX19LF90eXBlTWF0Y2hlczpmdW5jdGlvbihlLHQsbil7aWYodD09PWEpcmV0dXJuITA7aWYodCE9PWgmJnQhPT1kJiZ0IT09dSlyZXR1cm4gZT09PXQ7aWYodD09PXUpcmV0dXJuIGU9PT11O2lmKGU9PT11KXt2YXIgcjt0PT09ZD9yPXM6dD09PWgmJihyPWMpO2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKWlmKCF0aGlzLl90eXBlTWF0Y2hlcyh0aGlzLl9nZXRUeXBlTmFtZShuW29dKSxyLG5bb10pKXJldHVybiExO3JldHVybiEwfX0sX2dldFR5cGVOYW1lOmZ1bmN0aW9uKGUpe3N3aXRjaChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpe2Nhc2UiW29iamVjdCBTdHJpbmddIjpyZXR1cm4gYztjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIHM7Y2FzZSJbb2JqZWN0IEFycmF5XSI6cmV0dXJuIHU7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpyZXR1cm4gNTtjYXNlIltvYmplY3QgTnVsbF0iOnJldHVybiA3O2Nhc2UiW29iamVjdCBPYmplY3RdIjpyZXR1cm4gZS5qbWVzcGF0aFR5cGU9PT1BP3A6bH19LF9mdW5jdGlvblN0YXJ0c1dpdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lWzBdLmxhc3RJbmRleE9mKGVbMV0pfSxfZnVuY3Rpb25FbmRzV2l0aDpmdW5jdGlvbihlKXt2YXIgdD1lWzBdLG49ZVsxXTtyZXR1cm4tMSE9PXQuaW5kZXhPZihuLHQubGVuZ3RoLW4ubGVuZ3RoKX0sX2Z1bmN0aW9uUmV2ZXJzZTpmdW5jdGlvbihlKXtpZih0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PWMpe2Zvcih2YXIgdD1lWzBdLG49IiIscj10Lmxlbmd0aC0xO3I+PTA7ci0tKW4rPXRbcl07cmV0dXJuIG59dmFyIG89ZVswXS5zbGljZSgwKTtyZXR1cm4gby5yZXZlcnNlKCksb30sX2Z1bmN0aW9uQWJzOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFicyhlWzBdKX0sX2Z1bmN0aW9uQ2VpbDpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5jZWlsKGVbMF0pfSxfZnVuY3Rpb25Bdmc6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lWzBdLHI9MDtyPG4ubGVuZ3RoO3IrKyl0Kz1uW3JdO3JldHVybiB0L24ubGVuZ3RofSxfZnVuY3Rpb25Db250YWluczpmdW5jdGlvbihlKXtyZXR1cm4gZVswXS5pbmRleE9mKGVbMV0pPj0wfSxfZnVuY3Rpb25GbG9vcjpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5mbG9vcihlWzBdKX0sX2Z1bmN0aW9uTGVuZ3RoOmZ1bmN0aW9uKGUpe3JldHVybiBuKGVbMF0pP09iamVjdC5rZXlzKGVbMF0pLmxlbmd0aDplWzBdLmxlbmd0aH0sX2Z1bmN0aW9uTWFwOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPXRoaXMuX2ludGVycHJldGVyLHI9ZVswXSxvPWVbMV0saT0wO2k8by5sZW5ndGg7aSsrKXQucHVzaChuLnZpc2l0KHIsb1tpXSkpO3JldHVybiB0fSxfZnVuY3Rpb25NZXJnZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO2Zvcih2YXIgbyBpbiByKXRbb109cltvXX1yZXR1cm4gdH0sX2Z1bmN0aW9uTWF4OmZ1bmN0aW9uKGUpe2lmKGVbMF0ubGVuZ3RoPjApe2lmKHRoaXMuX2dldFR5cGVOYW1lKGVbMF1bMF0pPT09cylyZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCxlWzBdKTtmb3IodmFyIHQ9ZVswXSxuPXRbMF0scj0xO3I8dC5sZW5ndGg7cisrKW4ubG9jYWxlQ29tcGFyZSh0W3JdKTwwJiYobj10W3JdKTtyZXR1cm4gbn1yZXR1cm4gbnVsbH0sX2Z1bmN0aW9uTWluOmZ1bmN0aW9uKGUpe2lmKGVbMF0ubGVuZ3RoPjApe2lmKHRoaXMuX2dldFR5cGVOYW1lKGVbMF1bMF0pPT09cylyZXR1cm4gTWF0aC5taW4uYXBwbHkoTWF0aCxlWzBdKTtmb3IodmFyIHQ9ZVswXSxuPXRbMF0scj0xO3I8dC5sZW5ndGg7cisrKXRbcl0ubG9jYWxlQ29tcGFyZShuKTwwJiYobj10W3JdKTtyZXR1cm4gbn1yZXR1cm4gbnVsbH0sX2Z1bmN0aW9uU3VtOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ZVswXSxyPTA7cjxuLmxlbmd0aDtyKyspdCs9bltyXTtyZXR1cm4gdH0sX2Z1bmN0aW9uVHlwZTpmdW5jdGlvbihlKXtzd2l0Y2godGhpcy5fZ2V0VHlwZU5hbWUoZVswXSkpe2Nhc2UgczpyZXR1cm4ibnVtYmVyIjtjYXNlIGM6cmV0dXJuInN0cmluZyI7Y2FzZSB1OnJldHVybiJhcnJheSI7Y2FzZSBsOnJldHVybiJvYmplY3QiO2Nhc2UgNTpyZXR1cm4iYm9vbGVhbiI7Y2FzZSBwOnJldHVybiJleHByZWYiO2Nhc2UgNzpyZXR1cm4ibnVsbCJ9fSxfZnVuY3Rpb25LZXlzOmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhlWzBdKX0sX2Z1bmN0aW9uVmFsdWVzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lWzBdLG49T2JqZWN0LmtleXModCkscj1bXSxvPTA7bzxuLmxlbmd0aDtvKyspci5wdXNoKHRbbltvXV0pO3JldHVybiByfSxfZnVuY3Rpb25Kb2luOmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF07cmV0dXJuIGVbMV0uam9pbih0KX0sX2Z1bmN0aW9uVG9BcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZ2V0VHlwZU5hbWUoZVswXSk9PT11P2VbMF06W2VbMF1dfSxfZnVuY3Rpb25Ub1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZ2V0VHlwZU5hbWUoZVswXSk9PT1jP2VbMF06SlNPTi5zdHJpbmdpZnkoZVswXSl9LF9mdW5jdGlvblRvTnVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5fZ2V0VHlwZU5hbWUoZVswXSk7cmV0dXJuIG49PT1zP2VbMF06biE9PWN8fCh0PStlWzBdLGlzTmFOKHQpKT9udWxsOnR9LF9mdW5jdGlvbk5vdE51bGw6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoNyE9PXRoaXMuX2dldFR5cGVOYW1lKGVbdF0pKXJldHVybiBlW3RdO3JldHVybiBudWxsfSxfZnVuY3Rpb25Tb3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0uc2xpY2UoMCk7cmV0dXJuIHQuc29ydCgpLHR9LF9mdW5jdGlvblNvcnRCeTpmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnNsaWNlKDApO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdDt2YXIgbj10aGlzLl9pbnRlcnByZXRlcixyPWVbMV0sbz10aGlzLl9nZXRUeXBlTmFtZShuLnZpc2l0KHIsdFswXSkpO2lmKFtzLGNdLmluZGV4T2Yobyk8MCl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvciIpO2Zvcih2YXIgaT10aGlzLGE9W10sdT0wO3U8dC5sZW5ndGg7dSsrKWEucHVzaChbdSx0W3VdXSk7YS5zb3J0KChmdW5jdGlvbihlLHQpe3ZhciBzPW4udmlzaXQocixlWzFdKSxhPW4udmlzaXQocix0WzFdKTtpZihpLl9nZXRUeXBlTmFtZShzKSE9PW8pdGhyb3cgbmV3IEVycm9yKCJUeXBlRXJyb3I6IGV4cGVjdGVkICIrbysiLCByZWNlaXZlZCAiK2kuX2dldFR5cGVOYW1lKHMpKTtpZihpLl9nZXRUeXBlTmFtZShhKSE9PW8pdGhyb3cgbmV3IEVycm9yKCJUeXBlRXJyb3I6IGV4cGVjdGVkICIrbysiLCByZWNlaXZlZCAiK2kuX2dldFR5cGVOYW1lKGEpKTtyZXR1cm4gcz5hPzE6czxhPy0xOmVbMF0tdFswXX0pKTtmb3IodmFyIGw9MDtsPGEubGVuZ3RoO2wrKyl0W2xdPWFbbF1bMV07cmV0dXJuIHR9LF9mdW5jdGlvbk1heEJ5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9ZVsxXSxvPWVbMF0saT10aGlzLmNyZWF0ZUtleUZ1bmN0aW9uKHIsW3MsY10pLGE9LTEvMCx1PTA7dTxvLmxlbmd0aDt1KyspKG49aShvW3VdKSk+YSYmKGE9bix0PW9bdV0pO3JldHVybiB0fSxfZnVuY3Rpb25NaW5CeTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyPWVbMV0sbz1lWzBdLGk9dGhpcy5jcmVhdGVLZXlGdW5jdGlvbihyLFtzLGNdKSxhPTEvMCx1PTA7dTxvLmxlbmd0aDt1KyspKG49aShvW3VdKSk8YSYmKGE9bix0PW9bdV0pO3JldHVybiB0fSxjcmVhdGVLZXlGdW5jdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMscj10aGlzLl9pbnRlcnByZXRlcjtyZXR1cm4gZnVuY3Rpb24obyl7dmFyIGk9ci52aXNpdChlLG8pO2lmKHQuaW5kZXhPZihuLl9nZXRUeXBlTmFtZShpKSk8MCl7dmFyIHM9IlR5cGVFcnJvcjogZXhwZWN0ZWQgb25lIG9mICIrdCsiLCByZWNlaXZlZCAiK24uX2dldFR5cGVOYW1lKGkpO3Rocm93IG5ldyBFcnJvcihzKX1yZXR1cm4gaX19fSxlLnRva2VuaXplPWZ1bmN0aW9uKGUpe3JldHVybihuZXcgWCkudG9rZW5pemUoZSl9LGUuY29tcGlsZT1mdW5jdGlvbihlKXtyZXR1cm4obmV3ICQpLnBhcnNlKGUpfSxlLnNlYXJjaD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyAkLHI9bmV3IFEsbz1uZXcgSihyKTtyLl9pbnRlcnByZXRlcj1vO3ZhciBpPW4ucGFyc2UodCk7cmV0dXJuIG8uc2VhcmNoKGksZSl9LGUuc3RyaWN0RGVlcEVxdWFsPXJ9KHZvaWQgMD09PW4/dGhpcy5qbWVzcGF0aD17fTpuKX0se31dLDkyOltmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpPXQuZXhwb3J0cz17fTtmdW5jdGlvbiBzKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gYSgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gYyhlKXtpZihyPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChyPT09c3x8IXIpJiZzZXRUaW1lb3V0KXJldHVybiByPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gcihlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gci5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gci5jYWxsKHRoaXMsZSwwKX19fSFmdW5jdGlvbigpe3RyeXtyPSJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6c31jYXRjaChlKXtyPXN9dHJ5e289ImZ1bmN0aW9uIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6YX1jYXRjaChlKXtvPWF9fSgpO3ZhciB1LGw9W10scD0hMSxkPS0xO2Z1bmN0aW9uIGgoKXtwJiZ1JiYocD0hMSx1Lmxlbmd0aD9sPXUuY29uY2F0KGwpOmQ9LTEsbC5sZW5ndGgmJmYoKSl9ZnVuY3Rpb24gZigpe2lmKCFwKXt2YXIgZT1jKGgpO3A9ITA7Zm9yKHZhciB0PWwubGVuZ3RoO3Q7KXtmb3IodT1sLGw9W107KytkPHQ7KXUmJnVbZF0ucnVuKCk7ZD0tMSx0PWwubGVuZ3RofXU9bnVsbCxwPSExLGZ1bmN0aW9uKGUpe2lmKG89PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigobz09PWF8fCFvKSYmY2xlYXJUaW1lb3V0KXJldHVybiBvPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoZSk7dHJ5e3JldHVybiBvKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gby5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIG8uY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBnKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9ZnVuY3Rpb24gbSgpe31pLm5leHRUaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07bC5wdXNoKG5ldyBnKGUsdCkpLDEhPT1sLmxlbmd0aHx8cHx8YyhmKX0sZy5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0saS50aXRsZT0iYnJvd3NlciIsaS5icm93c2VyPSEwLGkuZW52PXt9LGkuYXJndj1bXSxpLnZlcnNpb249IiIsaS52ZXJzaW9ucz17fSxpLm9uPW0saS5hZGRMaXN0ZW5lcj1tLGkub25jZT1tLGkub2ZmPW0saS5yZW1vdmVMaXN0ZW5lcj1tLGkucmVtb3ZlQWxsTGlzdGVuZXJzPW0saS5lbWl0PW0saS5wcmVwZW5kTGlzdGVuZXI9bSxpLnByZXBlbmRPbmNlTGlzdGVuZXI9bSxpLmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm5bXX0saS5iaW5kaW5nPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0saS5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGkuY2hkaXI9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0saS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDkzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLGkpe3Q9dHx8IiYiLG49bnx8Ij0iO3ZhciBzPXt9O2lmKCJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKXJldHVybiBzO3ZhciBhPS9cKy9nO2U9ZS5zcGxpdCh0KTt2YXIgYz0xZTM7aSYmIm51bWJlciI9PXR5cGVvZiBpLm1heEtleXMmJihjPWkubWF4S2V5cyk7dmFyIHU9ZS5sZW5ndGg7Yz4wJiZ1PmMmJih1PWMpO2Zvcih2YXIgbD0wO2w8dTsrK2wpe3ZhciBwLGQsaCxmLGc9ZVtsXS5yZXBsYWNlKGEsIiUyMCIpLG09Zy5pbmRleE9mKG4pO20+PTA/KHA9Zy5zdWJzdHIoMCxtKSxkPWcuc3Vic3RyKG0rMSkpOihwPWcsZD0iIiksaD1kZWNvZGVVUklDb21wb25lbnQocCksZj1kZWNvZGVVUklDb21wb25lbnQoZCkscihzLGgpP28oc1toXSk/c1toXS5wdXNoKGYpOnNbaF09W3NbaF0sZl06c1toXT1mfXJldHVybiBzfTt2YXIgbz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfX0se31dLDk0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJzdHJpbmciOnJldHVybiBlO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGU/InRydWUiOiJmYWxzZSI7Y2FzZSJudW1iZXIiOnJldHVybiBpc0Zpbml0ZShlKT9lOiIiO2RlZmF1bHQ6cmV0dXJuIiJ9fTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4sYSl7cmV0dXJuIHQ9dHx8IiYiLG49bnx8Ij0iLG51bGw9PT1lJiYoZT12b2lkIDApLCJvYmplY3QiPT10eXBlb2YgZT9pKHMoZSksKGZ1bmN0aW9uKHMpe3ZhciBhPWVuY29kZVVSSUNvbXBvbmVudChyKHMpKStuO3JldHVybiBvKGVbc10pP2koZVtzXSwoZnVuY3Rpb24oZSl7cmV0dXJuIGErZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpfSkpLmpvaW4odCk6YStlbmNvZGVVUklDb21wb25lbnQocihlW3NdKSl9KSkuam9pbih0KTphP2VuY29kZVVSSUNvbXBvbmVudChyKGEpKStuK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKToiIn07dmFyIG89QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX07ZnVuY3Rpb24gaShlLHQpe2lmKGUubWFwKXJldHVybiBlLm1hcCh0KTtmb3IodmFyIG49W10scj0wO3I8ZS5sZW5ndGg7cisrKW4ucHVzaCh0KGVbcl0scikpO3JldHVybiBufXZhciBzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmdC5wdXNoKG4pO3JldHVybiB0fX0se31dLDk1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24uZGVjb2RlPW4ucGFyc2U9ZSgiLi9kZWNvZGUiKSxuLmVuY29kZT1uLnN0cmluZ2lmeT1lKCIuL2VuY29kZSIpfSx7Ii4vZGVjb2RlIjo5MywiLi9lbmNvZGUiOjk0fV0sOTY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4sbyl7dD10fHwiJiIsbj1ufHwiPSI7dmFyIGk9e307aWYoInN0cmluZyIhPXR5cGVvZiBlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIGk7dmFyIHM9L1wrL2c7ZT1lLnNwbGl0KHQpO3ZhciBhPTFlMztvJiYibnVtYmVyIj09dHlwZW9mIG8ubWF4S2V5cyYmKGE9by5tYXhLZXlzKTt2YXIgYz1lLmxlbmd0aDthPjAmJmM+YSYmKGM9YSk7Zm9yKHZhciB1PTA7dTxjOysrdSl7dmFyIGwscCxkLGgsZj1lW3VdLnJlcGxhY2UocywiJTIwIiksZz1mLmluZGV4T2Yobik7Zz49MD8obD1mLnN1YnN0cigwLGcpLHA9Zi5zdWJzdHIoZysxKSk6KGw9ZixwPSIiKSxkPWRlY29kZVVSSUNvbXBvbmVudChsKSxoPWRlY29kZVVSSUNvbXBvbmVudChwKSxyKGksZCk/QXJyYXkuaXNBcnJheShpW2RdKT9pW2RdLnB1c2goaCk6aVtkXT1baVtkXSxoXTppW2RdPWh9cmV0dXJuIGl9fSx7fV0sOTc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlInN0cmluZyI6cmV0dXJuIGU7Y2FzZSJib29sZWFuIjpyZXR1cm4gZT8idHJ1ZSI6ImZhbHNlIjtjYXNlIm51bWJlciI6cmV0dXJuIGlzRmluaXRlKGUpP2U6IiI7ZGVmYXVsdDpyZXR1cm4iIn19O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdD10fHwiJiIsbj1ufHwiPSIsbnVsbD09PWUmJihlPXZvaWQgMCksIm9iamVjdCI9PXR5cGVvZiBlP09iamVjdC5rZXlzKGUpLm1hcCgoZnVuY3Rpb24obyl7dmFyIGk9ZW5jb2RlVVJJQ29tcG9uZW50KHIobykpK247cmV0dXJuIEFycmF5LmlzQXJyYXkoZVtvXSk/ZVtvXS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBpK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKX0pKS5qb2luKHQpOmkrZW5jb2RlVVJJQ29tcG9uZW50KHIoZVtvXSkpfSkpLmpvaW4odCk6bz9lbmNvZGVVUklDb21wb25lbnQocihvKSkrbitlbmNvZGVVUklDb21wb25lbnQocihlKSk6IiJ9fSx7fV0sOTg6W2Z1bmN0aW9uKGUsdCxuKXthcmd1bWVudHNbNF1bOTVdWzBdLmFwcGx5KG4sYXJndW1lbnRzKX0seyIuL2RlY29kZSI6OTYsIi4vZW5jb2RlIjo5NyxkdXA6OTV9XSw5OTpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0LHIpeyhmdW5jdGlvbigpe3ZhciBvPWUoInByb2Nlc3MvYnJvd3Nlci5qcyIpLm5leHRUaWNrLGk9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLGE9e30sYz0wO2Z1bmN0aW9uIHUoZSx0KXt0aGlzLl9pZD1lLHRoaXMuX2NsZWFyRm49dH1uLnNldFRpbWVvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHUoaS5jYWxsKHNldFRpbWVvdXQsd2luZG93LGFyZ3VtZW50cyksY2xlYXJUaW1lb3V0KX0sbi5zZXRJbnRlcnZhbD1mdW5jdGlvbigpe3JldHVybiBuZXcgdShpLmNhbGwoc2V0SW50ZXJ2YWwsd2luZG93LGFyZ3VtZW50cyksY2xlYXJJbnRlcnZhbCl9LG4uY2xlYXJUaW1lb3V0PW4uY2xlYXJJbnRlcnZhbD1mdW5jdGlvbihlKXtlLmNsb3NlKCl9LHUucHJvdG90eXBlLnVucmVmPXUucHJvdG90eXBlLnJlZj1mdW5jdGlvbigpe30sdS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckZuLmNhbGwod2luZG93LHRoaXMuX2lkKX0sbi5lbnJvbGw9ZnVuY3Rpb24oZSx0KXtjbGVhclRpbWVvdXQoZS5faWRsZVRpbWVvdXRJZCksZS5faWRsZVRpbWVvdXQ9dH0sbi51bmVucm9sbD1mdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoZS5faWRsZVRpbWVvdXRJZCksZS5faWRsZVRpbWVvdXQ9LTF9LG4uX3VucmVmQWN0aXZlPW4uYWN0aXZlPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKTt2YXIgdD1lLl9pZGxlVGltZW91dDt0Pj0wJiYoZS5faWRsZVRpbWVvdXRJZD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2UuX29uVGltZW91dCYmZS5fb25UaW1lb3V0KCl9KSx0KSl9LG4uc2V0SW1tZWRpYXRlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9YysrLHI9IShhcmd1bWVudHMubGVuZ3RoPDIpJiZzLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBhW3RdPSEwLG8oKGZ1bmN0aW9uKCl7YVt0XSYmKHI/ZS5hcHBseShudWxsLHIpOmUuY2FsbChudWxsKSxuLmNsZWFySW1tZWRpYXRlKHQpKX0pKSx0fSxuLmNsZWFySW1tZWRpYXRlPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6ZnVuY3Rpb24oZSl7ZGVsZXRlIGFbZV19fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJ0aW1lcnMiKS5zZXRJbW1lZGlhdGUsZSgidGltZXJzIikuY2xlYXJJbW1lZGlhdGUpfSx7InByb2Nlc3MvYnJvd3Nlci5qcyI6OTIsdGltZXJzOjk5fV0sMTAwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgicHVueWNvZGUiKTtmdW5jdGlvbiBvKCl7dGhpcy5wcm90b2NvbD1udWxsLHRoaXMuc2xhc2hlcz1udWxsLHRoaXMuYXV0aD1udWxsLHRoaXMuaG9zdD1udWxsLHRoaXMucG9ydD1udWxsLHRoaXMuaG9zdG5hbWU9bnVsbCx0aGlzLmhhc2g9bnVsbCx0aGlzLnNlYXJjaD1udWxsLHRoaXMucXVlcnk9bnVsbCx0aGlzLnBhdGhuYW1lPW51bGwsdGhpcy5wYXRoPW51bGwsdGhpcy5ocmVmPW51bGx9bi5wYXJzZT12LG4ucmVzb2x2ZT1mdW5jdGlvbihlLHQpe3JldHVybiB2KGUsITEsITApLnJlc29sdmUodCl9LG4ucmVzb2x2ZU9iamVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBlP3YoZSwhMSwhMCkucmVzb2x2ZU9iamVjdCh0KTp0fSxuLmZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4geShlKSYmKGU9dihlKSksZSBpbnN0YW5jZW9mIG8/ZS5mb3JtYXQoKTpvLnByb3RvdHlwZS5mb3JtYXQuY2FsbChlKX0sbi5Vcmw9bzt2YXIgaT0vXihbYS16MC05ListXSs6KS9pLHM9LzpbMC05XSokLyxhPVsieyIsIn0iLCJ8IiwiXFwiLCJeIiwiYCJdLmNvbmNhdChbIjwiLCI+IiwnIicsImAiLCIgIiwiXHIiLCJcbiIsIlx0Il0pLGM9WyInIl0uY29uY2F0KGEpLHU9WyIlIiwiLyIsIj8iLCI7IiwiIyJdLmNvbmNhdChjKSxsPVsiLyIsIj8iLCIjIl0scD0vXlthLXowLTlBLVpfLV17MCw2M30kLyxkPS9eKFthLXowLTlBLVpfLV17MCw2M30pKC4qKSQvLGg9e2phdmFzY3JpcHQ6ITAsImphdmFzY3JpcHQ6IjohMH0sZj17amF2YXNjcmlwdDohMCwiamF2YXNjcmlwdDoiOiEwfSxnPXtodHRwOiEwLGh0dHBzOiEwLGZ0cDohMCxnb3BoZXI6ITAsZmlsZTohMCwiaHR0cDoiOiEwLCJodHRwczoiOiEwLCJmdHA6IjohMCwiZ29waGVyOiI6ITAsImZpbGU6IjohMH0sbT1lKCJxdWVyeXN0cmluZyIpO2Z1bmN0aW9uIHYoZSx0LG4pe2lmKGUmJkUoZSkmJmUgaW5zdGFuY2VvZiBvKXJldHVybiBlO3ZhciByPW5ldyBvO3JldHVybiByLnBhcnNlKGUsdCxuKSxyfWZ1bmN0aW9uIHkoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfWZ1bmN0aW9uIEUoZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZX1mdW5jdGlvbiBTKGUpe3JldHVybiBudWxsPT09ZX1vLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQsbil7aWYoIXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUGFyYW1ldGVyICd1cmwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCAiK3R5cGVvZiBlKTt2YXIgbz1lO289by50cmltKCk7dmFyIHM9aS5leGVjKG8pO2lmKHMpe3ZhciBhPShzPXNbMF0pLnRvTG93ZXJDYXNlKCk7dGhpcy5wcm90b2NvbD1hLG89by5zdWJzdHIocy5sZW5ndGgpfWlmKG58fHN8fG8ubWF0Y2goL15cL1wvW15AXC9dK0BbXkBcL10rLykpe3ZhciB2PSIvLyI9PT1vLnN1YnN0cigwLDIpOyF2fHxzJiZmW3NdfHwobz1vLnN1YnN0cigyKSx0aGlzLnNsYXNoZXM9ITApfWlmKCFmW3NdJiYodnx8cyYmIWdbc10pKXtmb3IodmFyIEUsUyxiPS0xLFQ9MDtUPGwubGVuZ3RoO1QrKyktMSE9PShDPW8uaW5kZXhPZihsW1RdKSkmJigtMT09PWJ8fEM8YikmJihiPUMpO2ZvcigtMSE9PShTPS0xPT09Yj9vLmxhc3RJbmRleE9mKCJAIik6by5sYXN0SW5kZXhPZigiQCIsYikpJiYoRT1vLnNsaWNlKDAsUyksbz1vLnNsaWNlKFMrMSksdGhpcy5hdXRoPWRlY29kZVVSSUNvbXBvbmVudChFKSksYj0tMSxUPTA7VDx1Lmxlbmd0aDtUKyspe3ZhciBDOy0xIT09KEM9by5pbmRleE9mKHVbVF0pKSYmKC0xPT09Ynx8QzxiKSYmKGI9Qyl9LTE9PT1iJiYoYj1vLmxlbmd0aCksdGhpcy5ob3N0PW8uc2xpY2UoMCxiKSxvPW8uc2xpY2UoYiksdGhpcy5wYXJzZUhvc3QoKSx0aGlzLmhvc3RuYW1lPXRoaXMuaG9zdG5hbWV8fCIiO3ZhciBJPSJbIj09PXRoaXMuaG9zdG5hbWVbMF0mJiJdIj09PXRoaXMuaG9zdG5hbWVbdGhpcy5ob3N0bmFtZS5sZW5ndGgtMV07aWYoIUkpZm9yKHZhciBBPXRoaXMuaG9zdG5hbWUuc3BsaXQoL1wuLyksXz0oVD0wLEEubGVuZ3RoKTtUPF87VCsrKXt2YXIgdz1BW1RdO2lmKHcmJiF3Lm1hdGNoKHApKXtmb3IodmFyIFI9IiIsaz0wLEw9dy5sZW5ndGg7azxMO2srKyl3LmNoYXJDb2RlQXQoayk+MTI3P1IrPSJ4IjpSKz13W2tdO2lmKCFSLm1hdGNoKHApKXt2YXIgTj1BLnNsaWNlKDAsVCksTz1BLnNsaWNlKFQrMSksRD13Lm1hdGNoKGQpO0QmJihOLnB1c2goRFsxXSksTy51bnNoaWZ0KERbMl0pKSxPLmxlbmd0aCYmKG89Ii8iK08uam9pbigiLiIpK28pLHRoaXMuaG9zdG5hbWU9Ti5qb2luKCIuIik7YnJlYWt9fX1pZih0aGlzLmhvc3RuYW1lLmxlbmd0aD4yNTU/dGhpcy5ob3N0bmFtZT0iIjp0aGlzLmhvc3RuYW1lPXRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKSwhSSl7dmFyIFA9dGhpcy5ob3N0bmFtZS5zcGxpdCgiLiIpLHg9W107Zm9yKFQ9MDtUPFAubGVuZ3RoOysrVCl7dmFyIE09UFtUXTt4LnB1c2goTS5tYXRjaCgvW15BLVphLXowLTlfLV0vKT8ieG4tLSIrci5lbmNvZGUoTSk6TSl9dGhpcy5ob3N0bmFtZT14LmpvaW4oIi4iKX12YXIgVT10aGlzLnBvcnQ/IjoiK3RoaXMucG9ydDoiIixGPXRoaXMuaG9zdG5hbWV8fCIiO3RoaXMuaG9zdD1GK1UsdGhpcy5ocmVmKz10aGlzLmhvc3QsSSYmKHRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZS5zdWJzdHIoMSx0aGlzLmhvc3RuYW1lLmxlbmd0aC0yKSwiLyIhPT1vWzBdJiYobz0iLyIrbykpfWlmKCFoW2FdKWZvcihUPTAsXz1jLmxlbmd0aDtUPF87VCsrKXt2YXIgcT1jW1RdLGo9ZW5jb2RlVVJJQ29tcG9uZW50KHEpO2o9PT1xJiYoaj1lc2NhcGUocSkpLG89by5zcGxpdChxKS5qb2luKGopfXZhciBCPW8uaW5kZXhPZigiIyIpOy0xIT09QiYmKHRoaXMuaGFzaD1vLnN1YnN0cihCKSxvPW8uc2xpY2UoMCxCKSk7dmFyIFY9by5pbmRleE9mKCI/Iik7cmV0dXJuLTEhPT1WPyh0aGlzLnNlYXJjaD1vLnN1YnN0cihWKSx0aGlzLnF1ZXJ5PW8uc3Vic3RyKFYrMSksdCYmKHRoaXMucXVlcnk9bS5wYXJzZSh0aGlzLnF1ZXJ5KSksbz1vLnNsaWNlKDAsVikpOnQmJih0aGlzLnNlYXJjaD0iIix0aGlzLnF1ZXJ5PXt9KSxvJiYodGhpcy5wYXRobmFtZT1vKSxnW2FdJiZ0aGlzLmhvc3RuYW1lJiYhdGhpcy5wYXRobmFtZSYmKHRoaXMucGF0aG5hbWU9Ii8iKSwodGhpcy5wYXRobmFtZXx8dGhpcy5zZWFyY2gpJiYoVT10aGlzLnBhdGhuYW1lfHwiIixNPXRoaXMuc2VhcmNofHwiIix0aGlzLnBhdGg9VStNKSx0aGlzLmhyZWY9dGhpcy5mb3JtYXQoKSx0aGlzfSxvLnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmF1dGh8fCIiO2UmJihlPShlPWVuY29kZVVSSUNvbXBvbmVudChlKSkucmVwbGFjZSgvJTNBL2ksIjoiKSxlKz0iQCIpO3ZhciB0PXRoaXMucHJvdG9jb2x8fCIiLG49dGhpcy5wYXRobmFtZXx8IiIscj10aGlzLmhhc2h8fCIiLG89ITEsaT0iIjt0aGlzLmhvc3Q/bz1lK3RoaXMuaG9zdDp0aGlzLmhvc3RuYW1lJiYobz1lKygtMT09PXRoaXMuaG9zdG5hbWUuaW5kZXhPZigiOiIpP3RoaXMuaG9zdG5hbWU6IlsiK3RoaXMuaG9zdG5hbWUrIl0iKSx0aGlzLnBvcnQmJihvKz0iOiIrdGhpcy5wb3J0KSksdGhpcy5xdWVyeSYmRSh0aGlzLnF1ZXJ5KSYmT2JqZWN0LmtleXModGhpcy5xdWVyeSkubGVuZ3RoJiYoaT1tLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KSk7dmFyIHM9dGhpcy5zZWFyY2h8fGkmJiI/IitpfHwiIjtyZXR1cm4gdCYmIjoiIT09dC5zdWJzdHIoLTEpJiYodCs9IjoiKSx0aGlzLnNsYXNoZXN8fCghdHx8Z1t0XSkmJiExIT09bz8obz0iLy8iKyhvfHwiIiksbiYmIi8iIT09bi5jaGFyQXQoMCkmJihuPSIvIituKSk6b3x8KG89IiIpLHImJiIjIiE9PXIuY2hhckF0KDApJiYocj0iIyIrcikscyYmIj8iIT09cy5jaGFyQXQoMCkmJihzPSI/IitzKSx0K28rKG49bi5yZXBsYWNlKC9bPyNdL2csKGZ1bmN0aW9uKGUpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSl9KSkpKyhzPXMucmVwbGFjZSgiIyIsIiUyMyIpKStyfSxvLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlc29sdmVPYmplY3QodihlLCExLCEwKSkuZm9ybWF0KCl9LG8ucHJvdG90eXBlLnJlc29sdmVPYmplY3Q9ZnVuY3Rpb24oZSl7aWYoeShlKSl7dmFyIHQ9bmV3IG87dC5wYXJzZShlLCExLCEwKSxlPXR9dmFyIG49bmV3IG87aWYoT2JqZWN0LmtleXModGhpcykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bltlXT10aGlzW2VdfSksdGhpcyksbi5oYXNoPWUuaGFzaCwiIj09PWUuaHJlZilyZXR1cm4gbi5ocmVmPW4uZm9ybWF0KCksbjtpZihlLnNsYXNoZXMmJiFlLnByb3RvY29sKXJldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbih0KXsicHJvdG9jb2wiIT09dCYmKG5bdF09ZVt0XSl9KSksZ1tuLnByb3RvY29sXSYmbi5ob3N0bmFtZSYmIW4ucGF0aG5hbWUmJihuLnBhdGg9bi5wYXRobmFtZT0iLyIpLG4uaHJlZj1uLmZvcm1hdCgpLG47aWYoZS5wcm90b2NvbCYmZS5wcm90b2NvbCE9PW4ucHJvdG9jb2wpe2lmKCFnW2UucHJvdG9jb2xdKXJldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbih0KXtuW3RdPWVbdF19KSksbi5ocmVmPW4uZm9ybWF0KCksbjtpZihuLnByb3RvY29sPWUucHJvdG9jb2wsZS5ob3N0fHxmW2UucHJvdG9jb2xdKW4ucGF0aG5hbWU9ZS5wYXRobmFtZTtlbHNle2Zvcih2YXIgcj0oZS5wYXRobmFtZXx8IiIpLnNwbGl0KCIvIik7ci5sZW5ndGgmJiEoZS5ob3N0PXIuc2hpZnQoKSk7KTtlLmhvc3R8fChlLmhvc3Q9IiIpLGUuaG9zdG5hbWV8fChlLmhvc3RuYW1lPSIiKSwiIiE9PXJbMF0mJnIudW5zaGlmdCgiIiksci5sZW5ndGg8MiYmci51bnNoaWZ0KCIiKSxuLnBhdGhuYW1lPXIuam9pbigiLyIpfWlmKG4uc2VhcmNoPWUuc2VhcmNoLG4ucXVlcnk9ZS5xdWVyeSxuLmhvc3Q9ZS5ob3N0fHwiIixuLmF1dGg9ZS5hdXRoLG4uaG9zdG5hbWU9ZS5ob3N0bmFtZXx8ZS5ob3N0LG4ucG9ydD1lLnBvcnQsbi5wYXRobmFtZXx8bi5zZWFyY2gpe3ZhciBpPW4ucGF0aG5hbWV8fCIiLHM9bi5zZWFyY2h8fCIiO24ucGF0aD1pK3N9cmV0dXJuIG4uc2xhc2hlcz1uLnNsYXNoZXN8fGUuc2xhc2hlcyxuLmhyZWY9bi5mb3JtYXQoKSxufXZhciBhPW4ucGF0aG5hbWUmJiIvIj09PW4ucGF0aG5hbWUuY2hhckF0KDApLGM9ZS5ob3N0fHxlLnBhdGhuYW1lJiYiLyI9PT1lLnBhdGhuYW1lLmNoYXJBdCgwKSx1PWN8fGF8fG4uaG9zdCYmZS5wYXRobmFtZSxsPXUscD1uLnBhdGhuYW1lJiZuLnBhdGhuYW1lLnNwbGl0KCIvIil8fFtdLGQ9KHI9ZS5wYXRobmFtZSYmZS5wYXRobmFtZS5zcGxpdCgiLyIpfHxbXSxuLnByb3RvY29sJiYhZ1tuLnByb3RvY29sXSk7aWYoZCYmKG4uaG9zdG5hbWU9IiIsbi5wb3J0PW51bGwsbi5ob3N0JiYoIiI9PT1wWzBdP3BbMF09bi5ob3N0OnAudW5zaGlmdChuLmhvc3QpKSxuLmhvc3Q9IiIsZS5wcm90b2NvbCYmKGUuaG9zdG5hbWU9bnVsbCxlLnBvcnQ9bnVsbCxlLmhvc3QmJigiIj09PXJbMF0/clswXT1lLmhvc3Q6ci51bnNoaWZ0KGUuaG9zdCkpLGUuaG9zdD1udWxsKSx1PXUmJigiIj09PXJbMF18fCIiPT09cFswXSkpLGMpbi5ob3N0PWUuaG9zdHx8IiI9PT1lLmhvc3Q/ZS5ob3N0Om4uaG9zdCxuLmhvc3RuYW1lPWUuaG9zdG5hbWV8fCIiPT09ZS5ob3N0bmFtZT9lLmhvc3RuYW1lOm4uaG9zdG5hbWUsbi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LHA9cjtlbHNlIGlmKHIubGVuZ3RoKXB8fChwPVtdKSxwLnBvcCgpLHA9cC5jb25jYXQociksbi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5O2Vsc2UgaWYobnVsbCE9ZS5zZWFyY2gpcmV0dXJuIGQmJihuLmhvc3RuYW1lPW4uaG9zdD1wLnNoaWZ0KCksKGI9ISEobi5ob3N0JiZuLmhvc3QuaW5kZXhPZigiQCIpPjApJiZuLmhvc3Quc3BsaXQoIkAiKSkmJihuLmF1dGg9Yi5zaGlmdCgpLG4uaG9zdD1uLmhvc3RuYW1lPWIuc2hpZnQoKSkpLG4uc2VhcmNoPWUuc2VhcmNoLG4ucXVlcnk9ZS5xdWVyeSxTKG4ucGF0aG5hbWUpJiZTKG4uc2VhcmNoKXx8KG4ucGF0aD0obi5wYXRobmFtZT9uLnBhdGhuYW1lOiIiKSsobi5zZWFyY2g/bi5zZWFyY2g6IiIpKSxuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKCFwLmxlbmd0aClyZXR1cm4gbi5wYXRobmFtZT1udWxsLG4uc2VhcmNoP24ucGF0aD0iLyIrbi5zZWFyY2g6bi5wYXRoPW51bGwsbi5ocmVmPW4uZm9ybWF0KCksbjtmb3IodmFyIGg9cC5zbGljZSgtMSlbMF0sbT0obi5ob3N0fHxlLmhvc3QpJiYoIi4iPT09aHx8Ii4uIj09PWgpfHwiIj09PWgsdj0wLEU9cC5sZW5ndGg7RT49MDtFLS0pIi4iPT0oaD1wW0VdKT9wLnNwbGljZShFLDEpOiIuLiI9PT1oPyhwLnNwbGljZShFLDEpLHYrKyk6diYmKHAuc3BsaWNlKEUsMSksdi0tKTtpZighdSYmIWwpZm9yKDt2LS07dilwLnVuc2hpZnQoIi4uIik7IXV8fCIiPT09cFswXXx8cFswXSYmIi8iPT09cFswXS5jaGFyQXQoMCl8fHAudW5zaGlmdCgiIiksbSYmIi8iIT09cC5qb2luKCIvIikuc3Vic3RyKC0xKSYmcC5wdXNoKCIiKTt2YXIgYixUPSIiPT09cFswXXx8cFswXSYmIi8iPT09cFswXS5jaGFyQXQoMCk7cmV0dXJuIGQmJihuLmhvc3RuYW1lPW4uaG9zdD1UPyIiOnAubGVuZ3RoP3Auc2hpZnQoKToiIiwoYj0hIShuLmhvc3QmJm4uaG9zdC5pbmRleE9mKCJAIik+MCkmJm4uaG9zdC5zcGxpdCgiQCIpKSYmKG4uYXV0aD1iLnNoaWZ0KCksbi5ob3N0PW4uaG9zdG5hbWU9Yi5zaGlmdCgpKSksKHU9dXx8bi5ob3N0JiZwLmxlbmd0aCkmJiFUJiZwLnVuc2hpZnQoIiIpLHAubGVuZ3RoP24ucGF0aG5hbWU9cC5qb2luKCIvIik6KG4ucGF0aG5hbWU9bnVsbCxuLnBhdGg9bnVsbCksUyhuLnBhdGhuYW1lKSYmUyhuLnNlYXJjaCl8fChuLnBhdGg9KG4ucGF0aG5hbWU/bi5wYXRobmFtZToiIikrKG4uc2VhcmNoP24uc2VhcmNoOiIiKSksbi5hdXRoPWUuYXV0aHx8bi5hdXRoLG4uc2xhc2hlcz1uLnNsYXNoZXN8fGUuc2xhc2hlcyxuLmhyZWY9bi5mb3JtYXQoKSxufSxvLnByb3RvdHlwZS5wYXJzZUhvc3Q9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmhvc3QsdD1zLmV4ZWMoZSk7dCYmKCI6IiE9PSh0PXRbMF0pJiYodGhpcy5wb3J0PXQuc3Vic3RyKDEpKSxlPWUuc3Vic3RyKDAsZS5sZW5ndGgtdC5sZW5ndGgpKSxlJiYodGhpcy5ob3N0bmFtZT1lKX19LHtwdW55Y29kZTo4NCxxdWVyeXN0cmluZzo5NX1dLDEwMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDtmb3IodmFyIHI9W10sbz0wO288MjU2OysrbylyW29dPShvKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKTt2YXIgaT1mdW5jdGlvbihlLHQpe3ZhciBuPXR8fDAsbz1yO3JldHVybltvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sIi0iLG9bZVtuKytdXSxvW2VbbisrXV0sIi0iLG9bZVtuKytdXSxvW2VbbisrXV0sIi0iLG9bZVtuKytdXSxvW2VbbisrXV0sIi0iLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dXS5qb2luKCIiKX07bi5kZWZhdWx0PWl9LHt9XSwxMDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJ2MSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHIuZGVmYXVsdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvLmRlZmF1bHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInY0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWZhdWx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJ2NSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHMuZGVmYXVsdH19KTt2YXIgcj1hKGUoIi4vdjEuanMiKSksbz1hKGUoIi4vdjMuanMiKSksaT1hKGUoIi4vdjQuanMiKSkscz1hKGUoIi4vdjUuanMiKSk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19fSx7Ii4vdjEuanMiOjEwNiwiLi92My5qcyI6MTA3LCIuL3Y0LmpzIjoxMDksIi4vdjUuanMiOjExMH1dLDEwMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dmFyIG49KDY1NTM1JmUpKyg2NTUzNSZ0KTtyZXR1cm4oZT4+MTYpKyh0Pj4xNikrKG4+PjE2KTw8MTZ8NjU1MzUmbn1mdW5jdGlvbiBvKGUsdCxuLG8saSxzKXtyZXR1cm4gcigoYT1yKHIodCxlKSxyKG8scykpKTw8KGM9aSl8YT4+PjMyLWMsbik7dmFyIGEsY31mdW5jdGlvbiBpKGUsdCxuLHIsaSxzLGEpe3JldHVybiBvKHQmbnx+dCZyLGUsdCxpLHMsYSl9ZnVuY3Rpb24gcyhlLHQsbixyLGkscyxhKXtyZXR1cm4gbyh0JnJ8biZ+cixlLHQsaSxzLGEpfWZ1bmN0aW9uIGEoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8odF5uXnIsZSx0LGkscyxhKX1mdW5jdGlvbiBjKGUsdCxuLHIsaSxzLGEpe3JldHVybiBvKG5eKHR8fnIpLGUsdCxpLHMsYSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHU9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXt2YXIgdD11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2U9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllW25dPXQuY2hhckNvZGVBdChuKX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQsbixyLG89W10saT0zMiplLmxlbmd0aCxzPSIwMTIzNDU2Nzg5YWJjZGVmIjtmb3IodD0wO3Q8aTt0Kz04KW49ZVt0Pj41XT4+PnQlMzImMjU1LHI9cGFyc2VJbnQocy5jaGFyQXQobj4+PjQmMTUpK3MuY2hhckF0KDE1Jm4pLDE2KSxvLnB1c2gocik7cmV0dXJuIG99KGZ1bmN0aW9uKGUsdCl7dmFyIG4sbyx1LGwscDtlW3Q+PjVdfD0xMjg8PHQlMzIsZVsxNCsodCs2ND4+Pjk8PDQpXT10O3ZhciBkPTE3MzI1ODQxOTMsaD0tMjcxNzMzODc5LGY9LTE3MzI1ODQxOTQsZz0yNzE3MzM4Nzg7Zm9yKG49MDtuPGUubGVuZ3RoO24rPTE2KW89ZCx1PWgsbD1mLHA9ZyxkPWkoZCxoLGYsZyxlW25dLDcsLTY4MDg3NjkzNiksZz1pKGcsZCxoLGYsZVtuKzFdLDEyLC0zODk1NjQ1ODYpLGY9aShmLGcsZCxoLGVbbisyXSwxNyw2MDYxMDU4MTkpLGg9aShoLGYsZyxkLGVbbiszXSwyMiwtMTA0NDUyNTMzMCksZD1pKGQsaCxmLGcsZVtuKzRdLDcsLTE3NjQxODg5NyksZz1pKGcsZCxoLGYsZVtuKzVdLDEyLDEyMDAwODA0MjYpLGY9aShmLGcsZCxoLGVbbis2XSwxNywtMTQ3MzIzMTM0MSksaD1pKGgsZixnLGQsZVtuKzddLDIyLC00NTcwNTk4MyksZD1pKGQsaCxmLGcsZVtuKzhdLDcsMTc3MDAzNTQxNiksZz1pKGcsZCxoLGYsZVtuKzldLDEyLC0xOTU4NDE0NDE3KSxmPWkoZixnLGQsaCxlW24rMTBdLDE3LC00MjA2MyksaD1pKGgsZixnLGQsZVtuKzExXSwyMiwtMTk5MDQwNDE2MiksZD1pKGQsaCxmLGcsZVtuKzEyXSw3LDE4MDQ2MDM2ODIpLGc9aShnLGQsaCxmLGVbbisxM10sMTIsLTQwMzQxMTAxKSxmPWkoZixnLGQsaCxlW24rMTRdLDE3LC0xNTAyMDAyMjkwKSxkPXMoZCxoPWkoaCxmLGcsZCxlW24rMTVdLDIyLDEyMzY1MzUzMjkpLGYsZyxlW24rMV0sNSwtMTY1Nzk2NTEwKSxnPXMoZyxkLGgsZixlW24rNl0sOSwtMTA2OTUwMTYzMiksZj1zKGYsZyxkLGgsZVtuKzExXSwxNCw2NDM3MTc3MTMpLGg9cyhoLGYsZyxkLGVbbl0sMjAsLTM3Mzg5NzMwMiksZD1zKGQsaCxmLGcsZVtuKzVdLDUsLTcwMTU1ODY5MSksZz1zKGcsZCxoLGYsZVtuKzEwXSw5LDM4MDE2MDgzKSxmPXMoZixnLGQsaCxlW24rMTVdLDE0LC02NjA0NzgzMzUpLGg9cyhoLGYsZyxkLGVbbis0XSwyMCwtNDA1NTM3ODQ4KSxkPXMoZCxoLGYsZyxlW24rOV0sNSw1Njg0NDY0MzgpLGc9cyhnLGQsaCxmLGVbbisxNF0sOSwtMTAxOTgwMzY5MCksZj1zKGYsZyxkLGgsZVtuKzNdLDE0LC0xODczNjM5NjEpLGg9cyhoLGYsZyxkLGVbbis4XSwyMCwxMTYzNTMxNTAxKSxkPXMoZCxoLGYsZyxlW24rMTNdLDUsLTE0NDQ2ODE0NjcpLGc9cyhnLGQsaCxmLGVbbisyXSw5LC01MTQwMzc4NCksZj1zKGYsZyxkLGgsZVtuKzddLDE0LDE3MzUzMjg0NzMpLGQ9YShkLGg9cyhoLGYsZyxkLGVbbisxMl0sMjAsLTE5MjY2MDc3MzQpLGYsZyxlW24rNV0sNCwtMzc4NTU4KSxnPWEoZyxkLGgsZixlW24rOF0sMTEsLTIwMjI1NzQ0NjMpLGY9YShmLGcsZCxoLGVbbisxMV0sMTYsMTgzOTAzMDU2MiksaD1hKGgsZixnLGQsZVtuKzE0XSwyMywtMzUzMDk1NTYpLGQ9YShkLGgsZixnLGVbbisxXSw0LC0xNTMwOTkyMDYwKSxnPWEoZyxkLGgsZixlW24rNF0sMTEsMTI3Mjg5MzM1MyksZj1hKGYsZyxkLGgsZVtuKzddLDE2LC0xNTU0OTc2MzIpLGg9YShoLGYsZyxkLGVbbisxMF0sMjMsLTEwOTQ3MzA2NDApLGQ9YShkLGgsZixnLGVbbisxM10sNCw2ODEyNzkxNzQpLGc9YShnLGQsaCxmLGVbbl0sMTEsLTM1ODUzNzIyMiksZj1hKGYsZyxkLGgsZVtuKzNdLDE2LC03MjI1MjE5NzkpLGg9YShoLGYsZyxkLGVbbis2XSwyMyw3NjAyOTE4OSksZD1hKGQsaCxmLGcsZVtuKzldLDQsLTY0MDM2NDQ4NyksZz1hKGcsZCxoLGYsZVtuKzEyXSwxMSwtNDIxODE1ODM1KSxmPWEoZixnLGQsaCxlW24rMTVdLDE2LDUzMDc0MjUyMCksZD1jKGQsaD1hKGgsZixnLGQsZVtuKzJdLDIzLC05OTUzMzg2NTEpLGYsZyxlW25dLDYsLTE5ODYzMDg0NCksZz1jKGcsZCxoLGYsZVtuKzddLDEwLDExMjY4OTE0MTUpLGY9YyhmLGcsZCxoLGVbbisxNF0sMTUsLTE0MTYzNTQ5MDUpLGg9YyhoLGYsZyxkLGVbbis1XSwyMSwtNTc0MzQwNTUpLGQ9YyhkLGgsZixnLGVbbisxMl0sNiwxNzAwNDg1NTcxKSxnPWMoZyxkLGgsZixlW24rM10sMTAsLTE4OTQ5ODY2MDYpLGY9YyhmLGcsZCxoLGVbbisxMF0sMTUsLTEwNTE1MjMpLGg9YyhoLGYsZyxkLGVbbisxXSwyMSwtMjA1NDkyMjc5OSksZD1jKGQsaCxmLGcsZVtuKzhdLDYsMTg3MzMxMzM1OSksZz1jKGcsZCxoLGYsZVtuKzE1XSwxMCwtMzA2MTE3NDQpLGY9YyhmLGcsZCxoLGVbbis2XSwxNSwtMTU2MDE5ODM4MCksaD1jKGgsZixnLGQsZVtuKzEzXSwyMSwxMzA5MTUxNjQ5KSxkPWMoZCxoLGYsZyxlW24rNF0sNiwtMTQ1NTIzMDcwKSxnPWMoZyxkLGgsZixlW24rMTFdLDEwLC0xMTIwMjEwMzc5KSxmPWMoZixnLGQsaCxlW24rMl0sMTUsNzE4Nzg3MjU5KSxoPWMoaCxmLGcsZCxlW24rOV0sMjEsLTM0MzQ4NTU1MSksZD1yKGQsbyksaD1yKGgsdSksZj1yKGYsbCksZz1yKGcscCk7cmV0dXJuW2QsaCxmLGddfShmdW5jdGlvbihlKXt2YXIgdCxuPVtdO2ZvcihuWyhlLmxlbmd0aD4+MiktMV09dm9pZCAwLHQ9MDt0PG4ubGVuZ3RoO3QrPTEpblt0XT0wO3ZhciByPTgqZS5sZW5ndGg7Zm9yKHQ9MDt0PHI7dCs9OCluW3Q+PjVdfD0oMjU1JmVbdC84XSk8PHQlMzI7cmV0dXJuIG59KGUpLDgqZS5sZW5ndGgpKX07bi5kZWZhdWx0PXV9LHt9XSwxMDQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD1mdW5jdGlvbigpe2lmKCFyKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gcihvKX07dmFyIHI9InVuZGVmaW5lZCIhPXR5cGVvZiBjcnlwdG8mJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHwidW5kZWZpbmVkIiE9dHlwZW9mIG1zQ3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksbz1uZXcgVWludDhBcnJheSgxNil9LHt9XSwxMDU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiB0Jm5efnQmcjtjYXNlIDE6Y2FzZSAzOnJldHVybiB0Xm5ecjtjYXNlIDI6cmV0dXJuIHQmbl50JnJebiZyfX1mdW5jdGlvbiBvKGUsdCl7cmV0dXJuIGU8PHR8ZT4+PjMyLXR9T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIGk9ZnVuY3Rpb24oZSl7dmFyIHQ9WzE1MTg1MDAyNDksMTg1OTc3NTM5MywyNDAwOTU5NzA4LDMzOTU0Njk3ODJdLG49WzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OCwzMjg1Mzc3NTIwXTtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciBpPXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7ZT1uZXcgQXJyYXkoaS5sZW5ndGgpO2Zvcih2YXIgcz0wO3M8aS5sZW5ndGg7cysrKWVbc109aS5jaGFyQ29kZUF0KHMpfWUucHVzaCgxMjgpO3ZhciBhPWUubGVuZ3RoLzQrMixjPU1hdGguY2VpbChhLzE2KSx1PW5ldyBBcnJheShjKTtmb3Iocz0wO3M8YztzKyspe3Vbc109bmV3IEFycmF5KDE2KTtmb3IodmFyIGw9MDtsPDE2O2wrKyl1W3NdW2xdPWVbNjQqcys0KmxdPDwyNHxlWzY0KnMrNCpsKzFdPDwxNnxlWzY0KnMrNCpsKzJdPDw4fGVbNjQqcys0KmwrM119Zm9yKHVbYy0xXVsxNF09OCooZS5sZW5ndGgtMSkvTWF0aC5wb3coMiwzMiksdVtjLTFdWzE0XT1NYXRoLmZsb29yKHVbYy0xXVsxNF0pLHVbYy0xXVsxNV09OCooZS5sZW5ndGgtMSkmNDI5NDk2NzI5NSxzPTA7czxjO3MrKyl7Zm9yKHZhciBwPW5ldyBBcnJheSg4MCksZD0wO2Q8MTY7ZCsrKXBbZF09dVtzXVtkXTtmb3IoZD0xNjtkPDgwO2QrKylwW2RdPW8ocFtkLTNdXnBbZC04XV5wW2QtMTRdXnBbZC0xNl0sMSk7dmFyIGg9blswXSxmPW5bMV0sZz1uWzJdLG09blszXSx2PW5bNF07Zm9yKGQ9MDtkPDgwO2QrKyl7dmFyIHk9TWF0aC5mbG9vcihkLzIwKSxFPW8oaCw1KStyKHksZixnLG0pK3YrdFt5XStwW2RdPj4+MDt2PW0sbT1nLGc9byhmLDMwKT4+PjAsZj1oLGg9RX1uWzBdPW5bMF0raD4+PjAsblsxXT1uWzFdK2Y+Pj4wLG5bMl09blsyXStnPj4+MCxuWzNdPW5bM10rbT4+PjAsbls0XT1uWzRdK3Y+Pj4wfXJldHVybltuWzBdPj4yNCYyNTUsblswXT4+MTYmMjU1LG5bMF0+PjgmMjU1LDI1NSZuWzBdLG5bMV0+PjI0JjI1NSxuWzFdPj4xNiYyNTUsblsxXT4+OCYyNTUsMjU1Jm5bMV0sblsyXT4+MjQmMjU1LG5bMl0+PjE2JjI1NSxuWzJdPj44JjI1NSwyNTUmblsyXSxuWzNdPj4yNCYyNTUsblszXT4+MTYmMjU1LG5bM10+PjgmMjU1LDI1NSZuWzNdLG5bNF0+PjI0JjI1NSxuWzRdPj4xNiYyNTUsbls0XT4+OCYyNTUsMjU1Jm5bNF1dfTtuLmRlZmF1bHQ9aX0se31dLDEwNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcixvLGk9YShlKCIuL3JuZy5qcyIpKSxzPWEoZSgiLi9ieXRlc1RvVXVpZC5qcyIpKTtmdW5jdGlvbiBhKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgYz0wLHU9MCxsPWZ1bmN0aW9uKGUsdCxuKXt2YXIgYT10JiZufHwwLGw9dHx8W10scD0oZT1lfHx7fSkubm9kZXx8cixkPXZvaWQgMCE9PWUuY2xvY2tzZXE/ZS5jbG9ja3NlcTpvO2lmKG51bGw9PXB8fG51bGw9PWQpe3ZhciBoPWUucmFuZG9tfHwoZS5ybmd8fGkuZGVmYXVsdCkoKTtudWxsPT1wJiYocD1yPVsxfGhbMF0saFsxXSxoWzJdLGhbM10saFs0XSxoWzVdXSksbnVsbD09ZCYmKGQ9bz0xNjM4MyYoaFs2XTw8OHxoWzddKSl9dmFyIGY9dm9pZCAwIT09ZS5tc2Vjcz9lLm1zZWNzOihuZXcgRGF0ZSkuZ2V0VGltZSgpLGc9dm9pZCAwIT09ZS5uc2Vjcz9lLm5zZWNzOnUrMSxtPWYtYysoZy11KS8xZTQ7aWYobTwwJiZ2b2lkIDA9PT1lLmNsb2Nrc2VxJiYoZD1kKzEmMTYzODMpLChtPDB8fGY+YykmJnZvaWQgMD09PWUubnNlY3MmJihnPTApLGc+PTFlNCl0aHJvdyBuZXcgRXJyb3IoInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjIik7Yz1mLHU9ZyxvPWQ7dmFyIHY9KDFlNCooMjY4NDM1NDU1JihmKz0xMjIxOTI5MjhlNSkpK2cpJTQyOTQ5NjcyOTY7bFthKytdPXY+Pj4yNCYyNTUsbFthKytdPXY+Pj4xNiYyNTUsbFthKytdPXY+Pj44JjI1NSxsW2ErK109MjU1JnY7dmFyIHk9Zi80Mjk0OTY3Mjk2KjFlNCYyNjg0MzU0NTU7bFthKytdPXk+Pj44JjI1NSxsW2ErK109MjU1JnksbFthKytdPXk+Pj4yNCYxNXwxNixsW2ErK109eT4+PjE2JjI1NSxsW2ErK109ZD4+Pjh8MTI4LGxbYSsrXT0yNTUmZDtmb3IodmFyIEU9MDtFPDY7KytFKWxbYStFXT1wW0VdO3JldHVybiB0fHwoMCxzLmRlZmF1bHQpKGwpfTtuLmRlZmF1bHQ9bH0seyIuL2J5dGVzVG9VdWlkLmpzIjoxMDEsIi4vcm5nLmpzIjoxMDR9XSwxMDc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHI9aShlKCIuL3YzNS5qcyIpKSxvPWkoZSgiLi9tZDUuanMiKSk7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19dmFyIHM9KDAsci5kZWZhdWx0KSgidjMiLDQ4LG8uZGVmYXVsdCk7bi5kZWZhdWx0PXN9LHsiLi9tZDUuanMiOjEwMywiLi92MzUuanMiOjEwOH1dLDEwODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlLHIsaSxzKXt2YXIgYT1pJiZzfHwwO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9ZnVuY3Rpb24oZSl7ZT11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2Zvcih2YXIgdD1uZXcgQXJyYXkoZS5sZW5ndGgpLG49MDtuPGUubGVuZ3RoO24rKyl0W25dPWUuY2hhckNvZGVBdChuKTtyZXR1cm4gdH0oZSkpLCJzdHJpbmciPT10eXBlb2YgciYmKHI9ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIGUucmVwbGFjZSgvW2EtZkEtRjAtOV17Mn0vZywoZnVuY3Rpb24oZSl7dC5wdXNoKHBhcnNlSW50KGUsMTYpKX0pKSx0fShyKSksIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgVHlwZUVycm9yKCJ2YWx1ZSBtdXN0IGJlIGFuIGFycmF5IG9mIGJ5dGVzIik7aWYoIUFycmF5LmlzQXJyYXkocil8fDE2IT09ci5sZW5ndGgpdGhyb3cgVHlwZUVycm9yKCJuYW1lc3BhY2UgbXVzdCBiZSB1dWlkIHN0cmluZyBvciBhbiBBcnJheSBvZiAxNiBieXRlIHZhbHVlcyIpO3ZhciBjPW4oci5jb25jYXQoZSkpO2lmKGNbNl09MTUmY1s2XXx0LGNbOF09NjMmY1s4XXwxMjgsaSlmb3IodmFyIHU9MDt1PDE2OysrdSlpW2ErdV09Y1t1XTtyZXR1cm4gaXx8KDAsby5kZWZhdWx0KShjKX07dHJ5e3IubmFtZT1lfWNhdGNoKGUpe31yZXR1cm4gci5ETlM9aSxyLlVSTD1zLHJ9LG4uVVJMPW4uRE5TPXZvaWQgMDt2YXIgcixvPShyPWUoIi4vYnl0ZXNUb1V1aWQuanMiKSkmJnIuX19lc01vZHVsZT9yOntkZWZhdWx0OnJ9O2NvbnN0IGk9IjZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCI7bi5ETlM9aTtjb25zdCBzPSI2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgiO24uVVJMPXN9LHsiLi9ieXRlc1RvVXVpZC5qcyI6MTAxfV0sMTA5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByPWkoZSgiLi9ybmcuanMiKSksbz1pKGUoIi4vYnl0ZXNUb1V1aWQuanMiKSk7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19dmFyIHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXQmJm58fDA7InN0cmluZyI9PXR5cGVvZiBlJiYodD0iYmluYXJ5Ij09PWU/bmV3IEFycmF5KDE2KTpudWxsLGU9bnVsbCk7dmFyIHM9KGU9ZXx8e30pLnJhbmRvbXx8KGUucm5nfHxyLmRlZmF1bHQpKCk7aWYoc1s2XT0xNSZzWzZdfDY0LHNbOF09NjMmc1s4XXwxMjgsdClmb3IodmFyIGE9MDthPDE2OysrYSl0W2krYV09c1thXTtyZXR1cm4gdHx8KDAsby5kZWZhdWx0KShzKX07bi5kZWZhdWx0PXN9LHsiLi9ieXRlc1RvVXVpZC5qcyI6MTAxLCIuL3JuZy5qcyI6MTA0fV0sMTEwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByPWkoZSgiLi92MzUuanMiKSksbz1pKGUoIi4vc2hhMS5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgcz0oMCxyLmRlZmF1bHQpKCJ2NSIsODAsby5kZWZhdWx0KTtuLmRlZmF1bHQ9c30seyIuL3NoYTEuanMiOjEwNSwiLi92MzUuanMiOjEwOH1dLDExMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZSgiLi91dGlscy9MUlUiKSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT0xZTMpLHRoaXMubWF4U2l6ZT1lLHRoaXMuY2FjaGU9bmV3IHIuTFJVQ2FjaGUoZSl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwic2l6ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlLmxlbmd0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24odCxuKXt2YXIgcj0ic3RyaW5nIiE9dHlwZW9mIHQ/ZS5nZXRLZXlTdHJpbmcodCk6dCxvPXRoaXMucG9wdWxhdGVWYWx1ZShuKTt0aGlzLmNhY2hlLnB1dChyLG8pfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIG49InN0cmluZyIhPXR5cGVvZiB0P2UuZ2V0S2V5U3RyaW5nKHQpOnQscj1EYXRlLm5vdygpLG89dGhpcy5jYWNoZS5nZXQobik7aWYobyl7Zm9yKHZhciBpPW8ubGVuZ3RoLTE7aT49MDtpLS0pb1tpXS5FeHBpcmU8ciYmby5zcGxpY2UoaSwxKTtpZigwPT09by5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5jYWNoZS5yZW1vdmUobil9cmV0dXJuIG99LGUuZ2V0S2V5U3RyaW5nPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPU9iamVjdC5rZXlzKGUpLnNvcnQoKSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07dm9pZCAwIT09ZVtvXSYmdC5wdXNoKGVbb10pfXJldHVybiB0LmpvaW4oIiAiKX0sZS5wcm90b3R5cGUucG9wdWxhdGVWYWx1ZT1mdW5jdGlvbihlKXt2YXIgdD1EYXRlLm5vdygpO3JldHVybiBlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJue0FkZHJlc3M6ZS5BZGRyZXNzfHwiIixFeHBpcmU6dCs2MCooZS5DYWNoZVBlcmlvZEluTWludXRlc3x8MSkqMWUzfX0pKX0sZS5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlLmVtcHR5KCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgbj0ic3RyaW5nIiE9dHlwZW9mIHQ/ZS5nZXRLZXlTdHJpbmcodCk6dDt0aGlzLmNhY2hlLnJlbW92ZShuKX0sZX0oKTtuLkVuZHBvaW50Q2FjaGU9b30seyIuL3V0aWxzL0xSVSI6MTEyfV0sMTEyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbihlLHQpe3RoaXMua2V5PWUsdGhpcy52YWx1ZT10fSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLm5vZGVNYXA9e30sdGhpcy5zaXplPTAsIm51bWJlciIhPXR5cGVvZiBlfHxlPDEpdGhyb3cgbmV3IEVycm9yKCJDYWNoZSBzaXplIGNhbiBvbmx5IGJlIHBvc2l0aXZlIG51bWJlciIpO3RoaXMuc2l6ZUxpbWl0PWV9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwibGVuZ3RoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2l6ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5wcmVwZW5kVG9MaXN0PWZ1bmN0aW9uKGUpe3RoaXMuaGVhZGVyTm9kZT8odGhpcy5oZWFkZXJOb2RlLnByZXY9ZSxlLm5leHQ9dGhpcy5oZWFkZXJOb2RlKTp0aGlzLnRhaWxOb2RlPWUsdGhpcy5oZWFkZXJOb2RlPWUsdGhpcy5zaXplKyt9LGUucHJvdG90eXBlLnJlbW92ZUZyb21UYWlsPWZ1bmN0aW9uKCl7aWYodGhpcy50YWlsTm9kZSl7dmFyIGU9dGhpcy50YWlsTm9kZSx0PWUucHJldjtyZXR1cm4gdCYmKHQubmV4dD12b2lkIDApLGUucHJldj12b2lkIDAsdGhpcy50YWlsTm9kZT10LHRoaXMuc2l6ZS0tLGV9fSxlLnByb3RvdHlwZS5kZXRhY2hGcm9tTGlzdD1mdW5jdGlvbihlKXt0aGlzLmhlYWRlck5vZGU9PT1lJiYodGhpcy5oZWFkZXJOb2RlPWUubmV4dCksdGhpcy50YWlsTm9kZT09PWUmJih0aGlzLnRhaWxOb2RlPWUucHJldiksZS5wcmV2JiYoZS5wcmV2Lm5leHQ9ZS5uZXh0KSxlLm5leHQmJihlLm5leHQucHJldj1lLnByZXYpLGUubmV4dD12b2lkIDAsZS5wcmV2PXZvaWQgMCx0aGlzLnNpemUtLX0sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe2lmKHRoaXMubm9kZU1hcFtlXSl7dmFyIHQ9dGhpcy5ub2RlTWFwW2VdO3JldHVybiB0aGlzLmRldGFjaEZyb21MaXN0KHQpLHRoaXMucHJlcGVuZFRvTGlzdCh0KSx0LnZhbHVlfX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGUpe2lmKHRoaXMubm9kZU1hcFtlXSl7dmFyIHQ9dGhpcy5ub2RlTWFwW2VdO3RoaXMuZGV0YWNoRnJvbUxpc3QodCksZGVsZXRlIHRoaXMubm9kZU1hcFtlXX19LGUucHJvdG90eXBlLnB1dD1mdW5jdGlvbihlLHQpe2lmKHRoaXMubm9kZU1hcFtlXSl0aGlzLnJlbW92ZShlKTtlbHNlIGlmKHRoaXMuc2l6ZT09PXRoaXMuc2l6ZUxpbWl0KXt2YXIgbj10aGlzLnJlbW92ZUZyb21UYWlsKCkua2V5O2RlbGV0ZSB0aGlzLm5vZGVNYXBbbl19dmFyIG89bmV3IHIoZSx0KTt0aGlzLm5vZGVNYXBbZV09byx0aGlzLnByZXBlbmRUb0xpc3Qobyl9LGUucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHRoaXMubm9kZU1hcCksdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdLHI9dGhpcy5ub2RlTWFwW25dO3RoaXMuZGV0YWNoRnJvbUxpc3QociksZGVsZXRlIHRoaXMubm9kZU1hcFtuXX19LGV9KCk7bi5MUlVDYWNoZT1vfSx7fV0sMTEzOltmdW5jdGlvbihlLHQsbil7ZSgiLi9icm93c2VyX2xvYWRlciIpO3ZhciByPWUoIi4vY29yZSIpOyJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LkFXUz1yKSx2b2lkIDAhPT10JiYodC5leHBvcnRzPXIpLCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmKHNlbGYuQVdTPXIpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCJDb25uZWN0Iil8fChyLmFwaUxvYWRlci5zZXJ2aWNlcy5jb25uZWN0PXt9LHIuQ29ubmVjdD1yLlNlcnZpY2UuZGVmaW5lU2VydmljZSgiY29ubmVjdCIsWyIyMDE3LTAyLTE1Il0pKSxyLmFwaUxvYWRlci5zZXJ2aWNlcy5jb25uZWN0WyIyMDE3LTAyLTE1Il09ZSgiLi4vYXBpcy9jb25uZWN0LTIwMTctMDItMTUubWluIil9LHsiLi4vYXBpcy9jb25uZWN0LTIwMTctMDItMTUubWluIjozLCIuL2Jyb3dzZXJfbG9hZGVyIjoxNiwiLi9jb3JlIjoxOX1dfSx7fSxbMTEzXSl9LDc1NDooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuQ2xpZW50TWV0aG9kcz10Lm1ha2VFbnVtKFsiZ2V0QWdlbnRTbmFwc2hvdCIsInB1dEFnZW50U3RhdGUiLCJnZXRBZ2VudFN0YXRlcyIsImdldERpYWxhYmxlQ291bnRyeUNvZGVzIiwiZ2V0Um91dGluZ1Byb2ZpbGVRdWV1ZXMiLCJnZXRBZ2VudFBlcm1pc3Npb25zIiwiZ2V0QWdlbnRDb25maWd1cmF0aW9uIiwidXBkYXRlQWdlbnRDb25maWd1cmF0aW9uIiwiYWNjZXB0Q29udGFjdCIsImNyZWF0ZU91dGJvdW5kQ29udGFjdCIsImNyZWF0ZVRhc2tDb250YWN0IiwiY2xlYXJDb250YWN0IiwiY29tcGxldGVDb250YWN0IiwiZGVzdHJveUNvbnRhY3QiLCJyZWplY3RDb250YWN0Iiwibm90aWZ5Q29udGFjdElzc3VlIiwidXBkYXRlQ29udGFjdEF0dHJpYnV0ZXMiLCJjcmVhdGVBZGRpdGlvbmFsQ29ubmVjdGlvbiIsImRlc3Ryb3lDb25uZWN0aW9uIiwiaG9sZENvbm5lY3Rpb24iLCJyZXN1bWVDb25uZWN0aW9uIiwidG9nZ2xlQWN0aXZlQ29ubmVjdGlvbnMiLCJjb25mZXJlbmNlQ29ubmVjdGlvbnMiLCJzZW5kQ2xpZW50TG9ncyIsInNlbmREaWdpdHMiLCJzZW5kU29mdHBob25lQ2FsbFJlcG9ydCIsInNlbmRTb2Z0cGhvbmVDYWxsTWV0cmljcyIsImdldEVuZHBvaW50cyIsImdldE5ld0F1dGhUb2tlbiIsImNyZWF0ZVRyYW5zcG9ydCIsIm11dGVQYXJ0aWNpcGFudCIsInVubXV0ZVBhcnRpY2lwYW50IiwidXBkYXRlTW9uaXRvclBhcnRpY2lwYW50U3RhdGUiXSksdC5BZ2VudEFwcENsaWVudE1ldGhvZHM9e0dFVF9DT05UQUNUOiJBZ2VudEFwcFNlcnZpY2UuTGNtcy5nZXRDb250YWN0IixERUxFVEVfU1BFQUtFUjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZGVsZXRlU3BlYWtlciIsRU5ST0xMX0JZX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmVucm9sbEJ5U2Vzc2lvbiIsRVZBTFVBVEVfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZXZhbHVhdGVTZXNzaW9uIixERVNDUklCRV9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZXNjcmliZVNwZWFrZXIiLE9QVF9PVVRfU1BFQUtFUjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQub3B0T3V0U3BlYWtlciIsVVBEQVRFX1ZPSUNFX0lEX0RBVEE6IkFnZW50QXBwU2VydmljZS5MY21zLnVwZGF0ZVZvaWNlSWREYXRhIixERVNDUklCRV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZXNjcmliZVNlc3Npb24iLFVQREFURV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC51cGRhdGVTZXNzaW9uIixTVEFSVF9WT0lDRV9JRF9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuTmFzYS5zdGFydFZvaWNlSWRTZXNzaW9uIixMSVNUX0lOVEVHUkFUSU9OX0FTU09DSUFUSU9OUzoiQWdlbnRBcHBTZXJ2aWNlLkFjcy5saXN0SW50ZWdyYXRpb25Bc3NvY2lhdGlvbnMifSx0Lk1hc3Rlck1ldGhvZHM9dC5tYWtlRW51bShbImJlY29tZU1hc3RlciIsImNoZWNrTWFzdGVyIl0pLHQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHM9dC5tYWtlRW51bShbImxpc3RUYXNrVGVtcGxhdGVzIiwiZ2V0VGFza1RlbXBsYXRlIiwiY3JlYXRlVGVtcGxhdGVkVGFzayIsInVwZGF0ZUNvbnRhY3QiXSksdC5SZXRyeWFibGVDbGllbnRNZXRob2RzTGlzdD1bdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TTkFQU0hPVCx0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX0NPTkZJR1VSQVRJT04sdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9QRVJNSVNTSU9OUyx0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1NUQVRFUyx0LkNsaWVudE1ldGhvZHMuR0VUX0RJQUxBQkxFX0NPVU5UUllfQ09ERVMsdC5DbGllbnRNZXRob2RzLkdFVF9ST1VUSU5HX1BST0ZJTEVfUVVFVUVTXSx0LlJldHJ5YWJsZUVycm9ycz10Lm1ha2VFbnVtKFsidW5hdXRob3JpemVkIiwiYWNjZXNzRGVuaWVkIl0pLHQuUmV0cnlTdGF0dXM9dC5tYWtlRW51bShbInJldHJ5aW5nIiwiZXhoYXVzdGVkIiwibm9uZSJdKTt2YXIgbj1mdW5jdGlvbigpe307bi5FTVBUWV9DQUxMQkFDS1M9e3N1Y2Nlc3M6ZnVuY3Rpb24oKXt9LGZhaWx1cmU6ZnVuY3Rpb24oKXt9fSxuLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwibWV0aG9kIik7dmFyIGk9cnx8e30scz1vfHxuLkVNUFRZX0NBTExCQUNLUzt0aGlzLl9jYWxsSW1wbChlLGkscyl9LG4ucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcn07dmFyIHI9ZnVuY3Rpb24oKXtuLmNhbGwodGhpcyl9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe2lmKHImJnIuZmFpbHVyZSl7dmFyIG89dC5zcHJpbnRmKCJObyBzdWNoIG1ldGhvZCBleGlzdHMgb24gTlVMTCBjbGllbnQ6ICVzIixlKTtyLmZhaWx1cmUobmV3IHQuVmFsdWVFcnJvcihvKSx7bWVzc2FnZTpvfSl9fTt2YXIgbz1mdW5jdGlvbihlLHIsbyl7bi5jYWxsKHRoaXMpLHRoaXMuY29uZHVpdD1lLHRoaXMucmVxdWVzdEV2ZW50PXIsdGhpcy5yZXNwb25zZUV2ZW50PW8sdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwPXt9LHRoaXMuY29uZHVpdC5vblVwc3RyZWFtKG8sdC5oaXRjaCh0aGlzLHRoaXMuX2hhbmRsZVJlc3BvbnNlKSl9OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlcXVlc3QodGhpcy5yZXF1ZXN0RXZlbnQsZSxuKTt0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbby5yZXF1ZXN0SWRdPXI7Y29uc3QgaT1bdC5DbGllbnRNZXRob2RzLlNFTkRfQ0xJRU5UX0xPR1MsdC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfTUVUUklDUyx0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9SRVBPUlRdO3RyeXtvLmV2ZW50IT09dC5FdmVudFR5cGUuQVBJX1JFUVVFU1R8fGkuaW5jbHVkZXMoby5tZXRob2QpfHx0LmdldExvZygpLnRyYWNlKGBTZW5kaW5nIEFQSV9SRVFVRVNUIGV2ZW50IGZvciAke28ubWV0aG9kfSB0byB1cHN0cmVhbWApLndpdGhPYmplY3Qoe21ldGhvZDpvLm1ldGhvZCxwYXJhbXM6by5wYXJhbXMsc3RhY2s6KG5ldyBFcnJvcikuc3RhY2t9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIlN0YWNrIHRyYWNlIExvZyBGYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9dGhpcy5jb25kdWl0LnNlbmRVcHN0cmVhbShvLmV2ZW50LG8pfSxvLnByb3RvdHlwZS5fZ2V0Q2FsbGJhY2tzRm9yUmVxdWVzdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbZV18fG51bGw7cmV0dXJuIG51bGwhPXQmJmRlbGV0ZSB0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbZV0sdH0sby5wcm90b3R5cGUuX2hhbmRsZVJlc3BvbnNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldENhbGxiYWNrc0ZvclJlcXVlc3QoZS5yZXF1ZXN0SWQpO251bGwhPXQmJihlLmVyciYmdC5mYWlsdXJlP3QuZmFpbHVyZShlLmVycixlLmRhdGEpOnQuc3VjY2VzcyYmdC5zdWNjZXNzKGUuZGF0YSkpfTt2YXIgaT1mdW5jdGlvbihlKXtvLmNhbGwodGhpcyxlLHQuRXZlbnRUeXBlLkFQSV9SRVFVRVNULHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSl9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aTt2YXIgcz1mdW5jdGlvbihlKXtvLmNhbGwodGhpcyxlLHQuRXZlbnRUeXBlLk1BU1RFUl9SRVFVRVNULHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSl9OyhzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9czt2YXIgYT1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsImF1dGhDb29raWVOYW1lIiksdC5hc3NlcnROb3ROdWxsKHIsImF1dGhUb2tlbiIpLHQuYXNzZXJ0Tm90TnVsbChvLCJlbmRwb2ludCIpLG4uY2FsbCh0aGlzKSx0aGlzLmVuZHBvaW50VXJsPXQuZ2V0VXJsV2l0aFByb3RvY29sKG8pLHRoaXMuYXV0aFRva2VuPXIsdGhpcy5hdXRoQ29va2llTmFtZT1lfTsoYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWEsYS5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9e307aVtvLmF1dGhDb29raWVOYW1lXT1vLmF1dGhUb2tlbjt2YXIgcz17bWV0aG9kOiJwb3N0Iixib2R5OkpTT04uc3RyaW5naWZ5KG58fHt9KSxoZWFkZXJzOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24iLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIiwiWC1BbXotdGFyZ2V0IjplLCJYLUFtei1CZWFyZXIiOkpTT04uc3RyaW5naWZ5KGkpfX07dC5mZXRjaChvLmVuZHBvaW50VXJsLHMpLnRoZW4oKGZ1bmN0aW9uKGUpe3Iuc3VjY2VzcyhlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmJvZHkuZ2V0UmVhZGVyKCk7bGV0IG49IiI7Y29uc3Qgbz1uZXcgVGV4dERlY29kZXI7dC5yZWFkKCkudGhlbigoZnVuY3Rpb24gaSh7ZG9uZTpzLHZhbHVlOmF9KXtpZihzKXt2YXIgYz1KU09OLnBhcnNlKG4pO3JldHVybiBjLnN0YXR1cz1lLnN0YXR1cyx2b2lkIHIuZmFpbHVyZShjKX1yZXR1cm4gbis9by5kZWNvZGUoYSksdC5yZWFkKCkudGhlbihpKX0pKX0pKX07dmFyIGM9ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJhdXRoVG9rZW4iKSx0LmFzc2VydE5vdE51bGwociwicmVnaW9uIiksbi5jYWxsKHRoaXMpLEFXUy5jb25maWcuY3JlZGVudGlhbHM9bmV3IEFXUy5DcmVkZW50aWFscyh7fSksQVdTLmNvbmZpZy5yZWdpb249cix0aGlzLmF1dGhUb2tlbj1lO3ZhciBpPXQuZ2V0QmFzZVVybCgpLHM9b3x8KGkuaW5jbHVkZXMoIi5hd3NhcHBzLmNvbSIpP2krIi9jb25uZWN0L2FwaSI6aSsiL2FwaSIpLGE9bmV3IEFXUy5FbmRwb2ludChzKTt0aGlzLmNsaWVudD1uZXcgQVdTLkNvbm5lY3Qoe2VuZHBvaW50OmF9KSx0aGlzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsdGhpcy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wfTsoYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWMsYy5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9dC5nZXRMb2coKTtpZih0LmNvbnRhaW5zKHRoaXMuY2xpZW50LGUpKW49dGhpcy5fdHJhbnNsYXRlUGFyYW1zKGUsbiksaS50cmFjZSgiQVdTQ2xpZW50OiAtLVx4M2UgQ2FsbGluZyBvcGVyYXRpb24gJyVzJyIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLmNsaWVudFtlXShuKS5vbigiYnVpbGQiLChmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LUJlYXJlciJdPW8uYXV0aFRva2VufSkpLnNlbmQoKGZ1bmN0aW9uKG4scyl7dHJ5e2lmKG4pbi5jb2RlPT09dC5DVElFeGNlcHRpb25zLlVOQVVUSE9SSVpFRF9FWENFUFRJT058fDQwMT09PW4uc3RhdHVzQ29kZT9vLl9yZXRyeU1ldGhvZChlLHIsbixzLHQuUmV0cnlhYmxlRXJyb3JzLlVOQVVUSE9SSVpFRCk6bi5jb2RlPT09dC5DVElFeGNlcHRpb25zLkFDQ0VTU19ERU5JRURfRVhDRVBUSU9OfHw0MDM9PT1uLnN0YXR1c0NvZGU/by5fcmV0cnlNZXRob2QoZSxyLG4scyx0LlJldHJ5YWJsZUVycm9ycy5BQ0NFU1NfREVOSUVEKTooby51bmF1dGhvcml6ZWRGYWlsQ291bnRlcj0wLG8uYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MCxyLmZhaWx1cmUoby5fZm9ybWF0Q2FsbEVycm9yKG8uX2FkZFN0YXR1c0NvZGVUb0Vycm9yKG4pKSxzKSksaS50cmFjZSgiQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICclcycgZmFpbGVkOiAlcyIsZSxKU09OLnN0cmluZ2lmeShuKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTtlbHNle2xldCB0PXt9O2kudHJhY2UoIkFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAnJXMnIHN1Y2NlZWRlZC4iLGUpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxvLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsby5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wLHRoaXMuaHR0cFJlc3BvbnNlJiZ0aGlzLmh0dHBSZXNwb25zZS5oYXNPd25Qcm9wZXJ0eSgiYm9keSIpJiYodC5jb250ZW50TGVuZ3RoPXRoaXMuaHR0cFJlc3BvbnNlLmJvZHkubGVuZ3RoKSxyLnN1Y2Nlc3Mocyx0KX19Y2F0Y2gobil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGhhbmRsZSBBV1MgQVBJIHJlcXVlc3QgZm9yIG1ldGhvZCAlcyIsZSkud2l0aEV4Y2VwdGlvbihuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKTtlbHNle3ZhciBzPXQuc3ByaW50ZigiTm8gc3VjaCBtZXRob2QgZXhpc3RzIG9uIEFXUyBjbGllbnQ6ICVzIixlKTtyLmZhaWx1cmUobmV3IHQuVmFsdWVFcnJvcihzKSx7bWVzc2FnZTpzfSl9fSxjLnByb3RvdHlwZS5faXNSZXRyeWFibGVNZXRob2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuUmV0cnlhYmxlQ2xpZW50TWV0aG9kc0xpc3QuaW5jbHVkZXMoZSl9LGMucHJvdG90eXBlLl9yZXRyeU1ldGhvZD1mdW5jdGlvbihlLG4scixvLGkpe3ZhciBzPXRoaXMsYT10LmdldExvZygpO2NvbnN0IGM9ZT0+cy5fZm9ybWF0Q2FsbEVycm9yKHMuX2FkZFN0YXR1c0NvZGVUb0Vycm9yKGUpKTtsZXQgdT17bWF4Q291bnQ6dC5jb3JlLk1BWF9VTkFVVEhPUklaRURfUkVUUllfQ09VTlQsZmFpbENvdW50ZXI6cy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcixpbmNyZWFzZUNvdW50ZXI6KCk9PnMudW5hdXRob3JpemVkRmFpbENvdW50ZXIrPTEscmVzZXRDb3VudGVyOigpPT5zLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsZXJyb3JNZXNzYWdlOiJ1bmF1dGhvcml6ZWQiLGV4aGF1c3RlZFJldHJpZXM6cy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcj49dC5jb3JlLk1BWF9VTkFVVEhPUklaRURfUkVUUllfQ09VTlQscmV0cnlDYWxsYmFjazooZSx0KT0+bi5mYWlsdXJlKGMoZSksdCksZGVmYXVsdENhbGxiYWNrOihlLHQpPT5uLmF1dGhGYWlsdXJlKGMoZSksdCl9O3N3aXRjaChpKXtjYXNlIHQuUmV0cnlhYmxlRXJyb3JzLlVOQVVUSE9SSVpFRDpicmVhaztjYXNlIHQuUmV0cnlhYmxlRXJyb3JzLkFDQ0VTU19ERU5JRUQ6dT17Li4udSxtYXhDb3VudDp0LmNvcmUuTUFYX0FDQ0VTU19ERU5JRURfUkVUUllfQ09VTlQsZmFpbENvdW50ZXI6cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcixpbmNyZWFzZUNvdW50ZXI6KCk9PnMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXIrPTEscmVzZXRDb3VudGVyOigpPT5zLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTAsZXJyb3JNZXNzYWdlOiJhY2Nlc3MgZGVuaWVkIixleGhhdXN0ZWRSZXRyaWVzOnMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI+PXQuY29yZS5NQVhfQUNDRVNTX0RFTklFRF9SRVRSWV9DT1VOVCxkZWZhdWx0Q2FsbGJhY2s6KGUsdCk9Pm4uYWNjZXNzRGVuaWVkKGMoZSksdCl9fWxldCBsPXsuLi5yLHJldHJ5U3RhdHVzOnQuUmV0cnlTdGF0dXMuTk9ORX07aWYocy5faXNSZXRyeWFibGVNZXRob2QoZSkpe2lmKCF1LmV4aGF1c3RlZFJldHJpZXMpcmV0dXJuIGEudHJhY2UoYEFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAke2V9IGZhaWxlZCB3aXRoICR7dS5lcnJvck1lc3NhZ2V9IGVycm9yLiBSZXRyeWluZyBjYWxsIGZvciBhICR7dS5mYWlsQ291bnRlcisxfSB0aW1lYCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx1LmluY3JlYXNlQ291bnRlcigpLGw9ey4uLmwscmV0cnlTdGF0dXM6dC5SZXRyeVN0YXR1cy5SRVRSWUlOR30sdm9pZCB1LnJldHJ5Q2FsbGJhY2sobCxvKTthLnRyYWNlKGBBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJHtlfSBleGhhdXN0ZWQgbWF4ICR7dS5tYXhDb3VudH0gbnVtYmVyIG9mIHJldHJpZXMgZm9yICR7dS5lcnJvck1lc3NhZ2V9IGVycm9yYCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx1LnJlc2V0Q291bnRlcigpLGw9ey4uLmwscmV0cnlTdGF0dXM6dC5SZXRyeVN0YXR1cy5FWEhBVVNURUR9fWVsc2UgYS50cmFjZShgQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICR7ZX0gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHIpfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dS5kZWZhdWx0Q2FsbGJhY2sobCxvKX0sYy5wcm90b3R5cGUuX2Zvcm1hdENhbGxFcnJvcj1mdW5jdGlvbihlKXtjb25zdCBuPXt0eXBlOmUuY29kZSxtZXNzYWdlOmUubWVzc2FnZSxzdGFjazpbXSxyZXRyeVN0YXR1czplLnJldHJ5U3RhdHVzfHx0LlJldHJ5U3RhdHVzLk5PTkUsLi4uZS5zdGF0dXNDb2RlJiZ7c3RhdHVzQ29kZTplLnN0YXR1c0NvZGV9fTtpZihlLnN0YWNrKXRyeXtBcnJheS5pc0FycmF5KGUuc3RhY2spP24uc3RhY2s9ZS5zdGFjazoib2JqZWN0Ij09dHlwZW9mIGUuc3RhY2s/bi5zdGFjaz1bSlNPTi5zdHJpbmdpZnkoZS5zdGFjayldOiJzdHJpbmciPT10eXBlb2YgZS5zdGFjayYmKG4uc3RhY2s9ZS5zdGFjay5zcGxpdCgiXG4iKSl9ZmluYWxseXt9cmV0dXJuIG59LGMucHJvdG90eXBlLl9hZGRTdGF0dXNDb2RlVG9FcnJvcj1mdW5jdGlvbihlKXtpZihlLnN0YXR1c0NvZGUpcmV0dXJuIGU7Y29uc3Qgbj17Li4uZX07aWYoZS5jb2RlKXN3aXRjaChuLmNvZGUpe2Nhc2UgdC5DVElFeGNlcHRpb25zLlVOQVVUSE9SSVpFRF9FWENFUFRJT046bi5zdGF0dXNDb2RlPTQwMTticmVhaztjYXNlIHQuQ1RJRXhjZXB0aW9ucy5BQ0NFU1NfREVOSUVEX0VYQ0VQVElPTjpuLnN0YXR1c0NvZGU9NDAzfWVsc2Ugbi5zdGF0dXNDb2RlPTQwMDtyZXR1cm4gbn0sYy5wcm90b3R5cGUuX3JlcXVpcmVzQXV0aGVudGljYXRpb25QYXJhbT1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQuQ2xpZW50TWV0aG9kcy5DT01QTEVURV9DT05UQUNUJiZlIT09dC5DbGllbnRNZXRob2RzLkNMRUFSX0NPTlRBQ1QmJmUhPT10LkNsaWVudE1ldGhvZHMuUkVKRUNUX0NPTlRBQ1QmJmUhPT10LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RBU0tfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5VUERBVEVfTU9OSVRPUl9QQVJUSUNJUEFOVF9TVEFURX0sYy5wcm90b3R5cGUuX3RyYW5zbGF0ZVBhcmFtcz1mdW5jdGlvbihlLG4pe3N3aXRjaChlKXtjYXNlIHQuQ2xpZW50TWV0aG9kcy5VUERBVEVfQUdFTlRfQ09ORklHVVJBVElPTjpuLmNvbmZpZ3VyYXRpb249dGhpcy5fdHJhbnNsYXRlQWdlbnRDb25maWd1cmF0aW9uKG4uY29uZmlndXJhdGlvbik7YnJlYWs7Y2FzZSB0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9NRVRSSUNTOm4uc29mdHBob25lU3RyZWFtU3RhdGlzdGljcz10aGlzLl90cmFuc2xhdGVTb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKG4uc29mdHBob25lU3RyZWFtU3RhdGlzdGljcyk7YnJlYWs7Y2FzZSB0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9SRVBPUlQ6bi5yZXBvcnQ9dGhpcy5fdHJhbnNsYXRlU29mdHBob25lQ2FsbFJlcG9ydChuLnJlcG9ydCl9cmV0dXJuIHRoaXMuX3JlcXVpcmVzQXV0aGVudGljYXRpb25QYXJhbShlKSYmKG4uYXV0aGVudGljYXRpb249e2F1dGhUb2tlbjp0aGlzLmF1dGhUb2tlbn0pLG59LGMucHJvdG90eXBlLl90cmFuc2xhdGVBZ2VudENvbmZpZ3VyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6ZS5uYW1lLHNvZnRwaG9uZUVuYWJsZWQ6ZS5zb2Z0cGhvbmVFbmFibGVkLHNvZnRwaG9uZUF1dG9BY2NlcHQ6ZS5zb2Z0cGhvbmVBdXRvQWNjZXB0LGV4dGVuc2lvbjplLmV4dGVuc2lvbixyb3V0aW5nUHJvZmlsZTp0aGlzLl90cmFuc2xhdGVSb3V0aW5nUHJvZmlsZShlLnJvdXRpbmdQcm9maWxlKSxhZ2VudFByZWZlcmVuY2VzOmUuYWdlbnRQcmVmZXJlbmNlc319LGMucHJvdG90eXBlLl90cmFuc2xhdGVSb3V0aW5nUHJvZmlsZT1mdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUscm91dGluZ1Byb2ZpbGVBUk46ZS5yb3V0aW5nUHJvZmlsZUFSTixkZWZhdWx0T3V0Ym91bmRRdWV1ZTp0aGlzLl90cmFuc2xhdGVRdWV1ZShlLmRlZmF1bHRPdXRib3VuZFF1ZXVlKX19LGMucHJvdG90eXBlLl90cmFuc2xhdGVRdWV1ZT1mdW5jdGlvbihlKXtyZXR1cm57cXVldWVBUk46ZS5xdWV1ZUFSTixuYW1lOmUubmFtZX19LGMucHJvdG90eXBlLl90cmFuc2xhdGVTb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPWZ1bmN0aW9uKGUpe3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJwYWNrZXRzQ291bnQiaW4gZSYmKGUucGFja2V0Q291bnQ9ZS5wYWNrZXRzQ291bnQsZGVsZXRlIGUucGFja2V0c0NvdW50KX0pKSxlfSxjLnByb3RvdHlwZS5fdHJhbnNsYXRlU29mdHBob25lQ2FsbFJlcG9ydD1mdW5jdGlvbihlKXtyZXR1cm4iaGFuZHNoYWtpbmdUaW1lTWlsbGlzImluIGUmJihlLmhhbmRzaGFrZVRpbWVNaWxsaXM9ZS5oYW5kc2hha2luZ1RpbWVNaWxsaXMsZGVsZXRlIGUuaGFuZHNoYWtpbmdUaW1lTWlsbGlzKSwicHJlVGFsa2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUucHJlVGFsa1RpbWVNaWxsaXM9ZS5wcmVUYWxraW5nVGltZU1pbGxpcyxkZWxldGUgZS5wcmVUYWxraW5nVGltZU1pbGxpcyksImhhbmRzaGFraW5nRmFpbHVyZSJpbiBlJiYoZS5oYW5kc2hha2VGYWlsdXJlPWUuaGFuZHNoYWtpbmdGYWlsdXJlLGRlbGV0ZSBlLmhhbmRzaGFraW5nRmFpbHVyZSksInRhbGtpbmdUaW1lTWlsbGlzImluIGUmJihlLnRhbGtUaW1lTWlsbGlzPWUudGFsa2luZ1RpbWVNaWxsaXMsZGVsZXRlIGUudGFsa2luZ1RpbWVNaWxsaXMpLGUuc29mdHBob25lU3RyZWFtU3RhdGlzdGljcz10aGlzLl90cmFuc2xhdGVTb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKGUuc29mdHBob25lU3RyZWFtU3RhdGlzdGljcyksZX07dmFyIHU9ZnVuY3Rpb24oZSl7aWYodC5hc3NlcnROb3ROdWxsKGUsImVuZHBvaW50Iiksbi5jYWxsKHRoaXMpLGUuaW5jbHVkZXMoIi90YXNrLXRlbXBsYXRlcyIpKXRoaXMuZW5kcG9pbnRVcmw9dC5nZXRVcmxXaXRoUHJvdG9jb2woZSk7ZWxzZXt2YXIgcj1uZXcgQVdTLkVuZHBvaW50KGUpLG89ZS5pbmNsdWRlcygiLmF3c2FwcHMuY29tIik/Ii9jb25uZWN0IjoiIjt0aGlzLmVuZHBvaW50VXJsPXQuZ2V0VXJsV2l0aFByb3RvY29sKGAke3IuaG9zdH0ke299L3Rhc2stdGVtcGxhdGVzL2FwaS9jY3BgKX19Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx1LnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3QuYXNzZXJ0Tm90TnVsbChlLCJtZXRob2QiKSx0LmFzc2VydE5vdE51bGwobiwicGFyYW1zIik7dmFyIG89e2NyZWRlbnRpYWxzOiJpbmNsdWRlIixtZXRob2Q6IkdFVCIsaGVhZGVyczp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIngtY3NyZi10b2tlbiI6ImNzcmYifX0saT1uLmluc3RhbmNlSWQscz10aGlzLmVuZHBvaW50VXJsLGE9dC5UYXNrVGVtcGxhdGVzQ2xpZW50TWV0aG9kcztzd2l0Y2goZSl7Y2FzZSBhLkxJU1RfVEFTS19URU1QTEFURVM6aWYocys9YC9wcm94eS9pbnN0YW5jZS8ke2l9L3Rhc2svdGVtcGxhdGVgLG4ucXVlcnlQYXJhbXMpe2NvbnN0IGU9bmV3IFVSTFNlYXJjaFBhcmFtcyhuLnF1ZXJ5UGFyYW1zKS50b1N0cmluZygpO2UmJihzKz1gPyR7ZX1gKX1icmVhaztjYXNlIGEuR0VUX1RBU0tfVEVNUExBVEU6dC5hc3NlcnROb3ROdWxsKG4udGVtcGxhdGVQYXJhbXMsInBhcmFtcy50ZW1wbGF0ZVBhcmFtcyIpO2NvbnN0IHI9dC5hc3NlcnROb3ROdWxsKG4udGVtcGxhdGVQYXJhbXMuaWQsInBhcmFtcy50ZW1wbGF0ZVBhcmFtcy5pZCIpLGM9bi50ZW1wbGF0ZVBhcmFtcy52ZXJzaW9uO3MrPWAvcHJveHkvaW5zdGFuY2UvJHtpfS90YXNrL3RlbXBsYXRlLyR7cn1gLGMmJihzKz1gP3NuYXBzaG90VmVyc2lvbj0ke2N9YCk7YnJlYWs7Y2FzZSBhLkNSRUFURV9URU1QTEFURURfVEFTSzpzKz1gLyR7ZX1gLG8uYm9keT1KU09OLnN0cmluZ2lmeShuKSxvLm1ldGhvZD0iUFVUIjticmVhaztjYXNlIGEuVVBEQVRFX0NPTlRBQ1Q6cys9YC8ke2V9YCxvLmJvZHk9SlNPTi5zdHJpbmdpZnkobiksby5tZXRob2Q9IlBPU1QifXQuZmV0Y2gocyxvKS50aGVuKChmdW5jdGlvbihlKXtyLnN1Y2Nlc3MoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5ib2R5LmdldFJlYWRlcigpO2xldCBuPSIiO2NvbnN0IG89bmV3IFRleHREZWNvZGVyO3QucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIGkoe2RvbmU6cyx2YWx1ZTphfSl7aWYocyl7dmFyIGM9SlNPTi5wYXJzZShuKTtyZXR1cm4gYy5zdGF0dXM9ZS5zdGF0dXMsdm9pZCByLmZhaWx1cmUoYyl9cmV0dXJuIG4rPW8uZGVjb2RlKGEpLHQucmVhZCgpLnRoZW4oaSl9KSl9KSl9LHQuQ2xpZW50QmFzZT1uLHQuTnVsbENsaWVudD1yLHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50PWksdC5VcHN0cmVhbUNvbmR1aXRNYXN0ZXJDbGllbnQ9cyx0LkFXU0NsaWVudD1jLHQuQWdlbnRBcHBDbGllbnQ9YSx0LlRhc2tUZW1wbGF0ZXNDbGllbnQ9dX0oKX0sODk1OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsdC5jb3JlPXt9LHQuY29yZS5pbml0aWFsaXplZD0hMSx0LnZlcnNpb249IjIuNi4wIix0Lm91dGVyQ29udGV4dFN0cmVhbXNWZXJzaW9uPW51bGwsdC5ERUZBVUxUX0JBVENIX1NJWkU9NTAwO3ZhciBuPSJBbWF6b24gQ29ubmVjdCBDQ1AiLHI9Imh0dHBzOi8ve2FsaWFzfS5hd3NhcHBzLmNvbS9hdXRoLz9jbGllbnRfaWQ9e2NsaWVudF9pZH0mcmVkaXJlY3RfdXJpPXtyZWRpcmVjdH0iLG89IjA2OTE5ZjRmZDhlZDMyNGUiLGk9Ii9hdXRoL2F1dGhvcml6ZSIscz0iL2Nvbm5lY3QvYXV0aC9hdXRob3JpemUiLGE9IklmcmFtZVJlZnJlc2hBdHRlbXB0cyIsYz0iSWZyYW1lUmVmcmVzaEF0dGVtcHRzRHIiLHU9IklmcmFtZUluaXRpYWxpemF0aW9uU3VjY2VzcyIsbD0iSWZyYW1lSW5pdGlhbGl6YXRpb25TdWNjZXNzRHIiO2NvbnN0IHA9eyIwLTEwMCI6WzAsMTAwXSwiMTAxLTUwMCI6WzEwMSw1MDBdLCI1MDEtMTAwMCI6WzUwMSwxZTNdLCIxMDAwLTMwMDAiOlsxMDAxLDNlM10sIjMwMDEtNTAwMCI6WzMwMDEsNWUzXSwiNTAwMS0xMDAwMCI6WzUwMDEsMWU0XSwiMTAwMDEtMjAwMDAiOlsxMDAwMSwyZTRdLCIyMDAwMCsiOlsyMDAwMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUl19O3QubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPTAsdC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWI9MCx0LmNvcmUuTUFYX0FVVEhPUklaRV9SRVRSWV9DT1VOVF9GT1JfU0VTU0lPTj0zLHQuY29yZS5NQVhfQ1RJX0FVVEhfUkVUUllfQ09VTlQ9MTAsdC5jb3JlLmN0aUF1dGhSZXRyeUNvdW50PTAsdC5jb3JlLmF1dGhvcml6ZVRpbWVvdXRJZD1udWxsLHQuY29yZS5jdGlUaW1lb3V0SWQ9bnVsbCx0LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVD0yMCx0LmNvcmUuTUFYX0FDQ0VTU19ERU5JRURfUkVUUllfQ09VTlQ9MTAsdC5TZXNzaW9uU3RvcmFnZUtleXM9dC5tYWtlRW51bShbInRhYl9pZCIsImF1dGhvcml6ZV9yZXRyeV9jb3VudCJdKTtjbGFzcyBke2NvbnN0cnVjdG9yKHQpe3RoaXMua2V5PWAke3R9UGFyYW1zU3RvcmFnZTo6JHtlLmxvY2F0aW9uLm9yaWdpbn1gfWdldCgpe3RyeXtjb25zdCB0PWUubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5rZXkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoYCR7dGhpcy5rZXl9OjogRmFpbGVkIHRvIGdldCBzb2Z0cGhvbmUgcGFyYW1zIGZyb20gbG9jYWwgc3RvcmFnZSFgKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9cmV0dXJuIG51bGx9c2V0KG4pe3RyeXtuJiZlLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMua2V5LEpTT04uc3RyaW5naWZ5KG4pKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKGAke3RoaXMua2V5fTo6IEZhaWxlZCB0byBzZXQgc29mdHBob25lIHBhcmFtcyB0byBsb2NhbCBzdG9yYWdlIWApLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19Y2xlYW4oKXtlLmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMua2V5KX19Y29uc3QgaD1uZXcgY2xhc3MgZXh0ZW5kcyBke2NvbnN0cnVjdG9yKCl7c3VwZXIoIlNvZnRwaG9uZSIpfX0sZj1uZXcgY2xhc3MgZXh0ZW5kcyBke2NvbnN0cnVjdG9yKCl7c3VwZXIoIlJpbmd0b25lIil9fTtmdW5jdGlvbiBnKGUpe3ZhciB0PWUubWF0Y2goL14oPzpodHRwcz86XC9cLyk/KD86W15AXG5dK0ApPyg/Ond3d1wuKT8oW146XC9cbj9dKykvZ2kpO3JldHVybiB0Lmxlbmd0aD90WzBdOiIifXQuY29yZS5jaGVja05vdEluaXRpYWxpemVkPWZ1bmN0aW9uKCl7dC5jb3JlLmluaXRpYWxpemVkJiZ0LmdldExvZygpLndhcm4oIkNvbm5lY3QgY29yZSBhbHJlYWR5IGluaXRpYWxpemVkLCBvbmx5IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIG9uY2UuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX07dmFyIG09ZnVuY3Rpb24oZSxuKXt2YXIgcj1lLmdldEFnZW50U3RhdGVzKCkuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PXQuQWdlbnRTdGF0ZVR5cGUuT0ZGTElORX0pKTtlLnNldFN0YXRlKHIsbil9LHY9ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFNpZ25hbCBzaGFyZWR3b3JrZXIgdG8gc2V0IGNvbnRhY3RzIHN1cHByZXNzb3IgdG8gJXMgZm9yIGluc3RhbmNlICVzLiIsZSx0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuU1VQUFJFU1Mse3N1cHByZXNzOmUsc2hvdWxkU2VuZEZhaWxvdmVyRG93bnN0cmVhbTohMX0pfSx5PWZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5pbmZvKCJbRElTQVNURVIgUkVDT1ZFUlldIFNpZ25hbCBzaGFyZWR3b3JrZXIgdG8gc2V0IGZvcmNlT2ZmbGluZSB0byAlcyBmb3IgaW5zdGFuY2UgJXMuIixlLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GT1JDRV9PRkZMSU5FLHtvZmZsaW5lOmUsbmV4dEFjdGl2ZUFybjpufSl9LEU9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmdldExvZygpO2NvbnN0IG89dC5hZ2VudC5pbml0aWFsaXplZD90LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCk6dC5jb3JlLnJlZ2lvbjtyLmluZm8oYFtEaXNhc3RlciBSZWNvdmVyeV0gQXR0ZW1wdGluZyB0byBmb3JjZSBpbnN0YW5jZSAke299IG9mZmxpbmUgdXNpbmcgJHtlPyJzb2Z0IjoiaGFyZCJ9IGZhaWxvdmVyYCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmFnZW50KChmdW5jdGlvbihvKXt2YXIgaT0wLHM9by5nZXRDb250YWN0cygpLGE9ITE7aWYocy5sZW5ndGgpZm9yKGxldCBjIG9mIHMpe2lmKGEpYnJlYWs7IWV8fGMuZ2V0VHlwZSgpIT09dC5Db250YWN0VHlwZS5RVUVVRV9DQUxMQkFDSyYmYy5nZXRUeXBlKCkhPXQuQ29udGFjdFR5cGUuVk9JQ0U/Yy5nZXRBZ2VudENvbm5lY3Rpb24oKS5kZXN0cm95KHtzdWNjZXNzOmZ1bmN0aW9uKCl7KytpPT09cy5sZW5ndGgmJih5KCExLG4pLG0obyksci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICVzIGlzIG5vdyBvZmZsaW5lIix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0sZmFpbHVyZTpmdW5jdGlvbihlKXtyLndhcm4oIltEaXNhc3RlciBSZWNvdmVyeV0gQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZvcmNlIHRoaXMgaW5zdGFuY2UgdG8gb2ZmbGluZSBpbiByZWdpb24gJXMiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci53YXJuKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkseSghMCxuKSxhPSEwfX0pOihyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gV2lsbCB3YWl0IHRvIGNvbXBsZXRlIGZhaWxvdmVyIG9mIGluc3RhbmNlICVzIHVudGlsIHZvaWNlIGNvbnRhY3Qgd2l0aCBJRCAlcyBpcyBkZXN0cm95ZWQiLHQuY29yZS5yZWdpb24sYy5nZXRDb250YWN0SWQoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVJfUEVORElORyx7bmV4dEFjdGl2ZUFybjpufSksYy5vbkRlc3Ryb3koKGZ1bmN0aW9uKGUpe3IuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBWb2ljZSBjb250YWN0IHdpdGggSUQgJXMgZGVzdHJveWVkLCBjb250aW51aW5nIHdpdGggZmFpbG92ZXIgaW4gaW5zdGFuY2UgJXMiLGUuZ2V0Q29udGFjdElkKCksdC5jb3JlLnJlZ2lvbiksRSghMCxuKX0pKSl9ZWxzZSB5KCExLG4pLG0obyksci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICVzIGlzIG5vdyBvZmZsaW5lIix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpfTt0LmNvcmUuaW5pdERpc2FzdGVyUmVjb3Zlcnk9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQuZ2V0TG9nKCk7dC5jb3JlLnJlZ2lvbj1lLnJlZ2lvbix0LmNvcmUuc3VwcHJlc3NDb250YWN0cz1ufHx2LHQuY29yZS5mb3JjZU9mZmxpbmU9cnx8RSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNFVF9PRkZMSU5FLChmdW5jdGlvbihlKXt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLkZBSUxPVkVSLChmdW5jdGlvbigpe3QuY29yZS5mb3JjZU9mZmxpbmUoZSYmZS5zb2Z0RmFpbG92ZXIpfSkpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7dC5jb3JlLmZvcmNlT2ZmbGluZShlJiZlLnNvZnRGYWlsb3ZlcixlJiZlLm5leHRBY3RpdmVBcm4pfSkpfSkpLHQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7by5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluaXRpYWxpemluZyByZWdpb24gJXMgYXMgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSksKGZ1bmN0aW9uKCl7by5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldICVzIGFscmVhZHkgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLGUucG9sbEZvckZhaWxvdmVyJiZ0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HP3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HLHtpbnN0YW5jZUFybjplLmluc3RhbmNlQXJuLG90aGVyQXJuOmUub3RoZXJBcm4sYXV0aFRva2VuOmUuYXV0aFRva2VufSk6ZS5pc1ByaW1hcnk/KHQuY29yZS5zdXBwcmVzc0NvbnRhY3RzKCExKSxvLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gJXMgaW5zdGFuY2UgaXMgc2V0IHRvIHByaW1hcnkiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOih0LmNvcmUuc3VwcHJlc3NDb250YWN0cyghMCksdC5jb3JlLmZvcmNlT2ZmbGluZSgpLG8uaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSAlcyBpbnN0YW5jZSBpcyBzZXQgdG8gc3RhbmQtYnkiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSx0LmNvcmUuaW5pdD1mdW5jdGlvbihlKXt0LmNvcmUuZXZlbnRCdXM9bmV3IHQuRXZlbnRCdXMsdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBJKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUuaW5pdENsaWVudChlKSx0LmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50KGUpLHQuY29yZS5pbml0VGFza1RlbXBsYXRlc0NsaWVudChlKSx0LmNvcmUuaW5pdGlhbGl6ZWQ9ITB9LHQuY29yZS5pbml0Q2xpZW50PWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJwYXJhbXMiKTt2YXIgbj10LmFzc2VydE5vdE51bGwoZS5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxyPXQuYXNzZXJ0Tm90TnVsbChlLnJlZ2lvbiwicGFyYW1zLnJlZ2lvbiIpLG89ZS5lbmRwb2ludHx8bnVsbDt0LmNvcmUuY2xpZW50PW5ldyB0LkFXU0NsaWVudChuLHIsbyl9LHQuY29yZS5pbml0QWdlbnRBcHBDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPXQuYXNzZXJ0Tm90TnVsbChlLmF1dGhUb2tlbiwicGFyYW1zLmF1dGhUb2tlbiIpLHI9dC5hc3NlcnROb3ROdWxsKGUuYXV0aENvb2tpZU5hbWUsInBhcmFtcy5hdXRoQ29va2llTmFtZSIpLG89dC5hc3NlcnROb3ROdWxsKGUuYWdlbnRBcHBFbmRwb2ludCwicGFyYW1zLmFnZW50QXBwRW5kcG9pbnQiKTt0LmNvcmUuYWdlbnRBcHBDbGllbnQ9bmV3IHQuQWdlbnRBcHBDbGllbnQocixuLG8pfSx0LmNvcmUuaW5pdFRhc2tUZW1wbGF0ZXNDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPWUudGFza1RlbXBsYXRlc0VuZHBvaW50fHxlLmVuZHBvaW50O3QuYXNzZXJ0Tm90TnVsbChuLCJ0YXNrVGVtcGxhdGVzRW5kcG9pbnQiKSx0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudD1uZXcgdC5UYXNrVGVtcGxhdGVzQ2xpZW50KG4pfSx0LmNvcmUudGVybWluYXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmNsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS5hZ2VudEFwcENsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW5ldyB0Lk51bGxDbGllbnQsdC5jb3JlLm1hc3RlckNsaWVudD1uZXcgdC5OdWxsQ2xpZW50O3ZhciBlPXQuY29yZS5nZXRFdmVudEJ1cygpO2UmJmUudW5zdWJzY3JpYmVBbGwoKSx0LmNvcmUuYnVzPW5ldyB0LkV2ZW50QnVzLHQuY29yZS5hZ2VudERhdGFQcm92aWRlcj1udWxsLHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW51bGwsdC5jb3JlLnVwc3RyZWFtPW51bGwsdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXI9bnVsbCx0LmFnZW50LmluaXRpYWxpemVkPSExLHQuY29yZS5pbml0aWFsaXplZD0hMX0sdC5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1udWxsLHQuY29yZS5zZXRTb2Z0cGhvbmVVc2VyTWVkaWFTdHJlYW09ZnVuY3Rpb24oZSl7dC5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1lfSx0LmNvcmUuaW5pdFJpbmd0b25lRW5naW5lcz1mdW5jdGlvbihuLHIpe3QuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gaW5pdFJpbmd0b25lRW5naW5lIHN0YXJ0ZWQiKS53aXRoT2JqZWN0KHtwYXJhbXM6bn0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5hc3NlcnROb3ROdWxsKG4sInBhcmFtcyIpO2NvbnN0IG89cnx8Yjt2YXIgaT1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwicmluZ3RvbmVTZXR0aW5ncyIpLHQuYXNzZXJ0Tm90TnVsbChlLnZvaWNlLCJyaW5ndG9uZVNldHRpbmdzLnZvaWNlIiksdC5hc3NlcnRUcnVlKGUudm9pY2UucmluZ3RvbmVVcmx8fGUudm9pY2UuZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnZvaWNlLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLHQuYXNzZXJ0Tm90TnVsbChlLnF1ZXVlX2NhbGxiYWNrLCJyaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrIiksdC5hc3NlcnRUcnVlKGUucXVldWVfY2FsbGJhY2sucmluZ3RvbmVVcmx8fGUucXVldWVfY2FsbGJhY2suZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLHQuY29yZS5yaW5ndG9uZUVuZ2luZXM9e30sdC5hZ2VudCgoZnVuY3Rpb24obil7bi5vblJlZnJlc2goKGZ1bmN0aW9uKCl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5SSU5HVE9ORSwoZnVuY3Rpb24oKXtsZXQgbj0hMTtlLnZvaWNlLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnZvaWNlfHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy52b2ljZT1uZXcgdC5Wb2ljZVJpbmd0b25lRW5naW5lKGUudm9pY2UpLG49ITAsdC5nZXRMb2coKS5pbmZvKCJWb2ljZVJpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLGUuY2hhdC5kaXNhYmxlZHx8dC5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0fHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0PW5ldyB0LkNoYXRSaW5ndG9uZUVuZ2luZShlLmNoYXQpLG49ITAsdC5nZXRMb2coKS5pbmZvKCJDaGF0UmluZ3RvbmVFbmdpbmUgaW5pdGlhbGl6ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksZS50YXNrLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2t8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2s9bmV3IHQuVGFza1Jpbmd0b25lRW5naW5lKGUudGFzayksbj0hMCx0LmdldExvZygpLmluZm8oIlRhc2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxlLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnF1ZXVlX2NhbGxiYWNrfHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy5xdWV1ZV9jYWxsYmFjaz1uZXcgdC5RdWV1ZUNhbGxiYWNrUmluZ3RvbmVFbmdpbmUoZS5xdWV1ZV9jYWxsYmFjayksbj0hMCx0LmdldExvZygpLmluZm8oIlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxuJiZ0LmNvcmUuX3JpbmdlckRldmljZUlkJiZvKHtkZXZpY2VJZDp0LmNvcmUuX3JpbmdlckRldmljZUlkfSl9KSl9KSl9KSksUygpfSxzPWZ1bmN0aW9uKGUsbil7ZS5yaW5ndG9uZT1lLnJpbmd0b25lfHx7fSxlLnJpbmd0b25lLnZvaWNlPWUucmluZ3RvbmUudm9pY2V8fHt9LGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2s9ZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFja3x8e30sZS5yaW5ndG9uZS5jaGF0PWUucmluZ3RvbmUuY2hhdHx8e2Rpc2FibGVkOiEwfSxlLnJpbmd0b25lLnRhc2s9ZS5yaW5ndG9uZS50YXNrfHx7ZGlzYWJsZWQ6ITB9LG4uc29mdHBob25lJiYobi5zb2Z0cGhvbmUuZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS52b2ljZS5kaXNhYmxlZD0hMCxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkPSEwKSxuLnNvZnRwaG9uZS5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUudm9pY2UucmluZ3RvbmVVcmw9bi5zb2Z0cGhvbmUucmluZ3RvbmVVcmwsZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjay5yaW5ndG9uZVVybD1uLnNvZnRwaG9uZS5yaW5ndG9uZVVybCkpLG4uY2hhdCYmKG4uY2hhdC5kaXNhYmxlUmluZ3RvbmUmJihlLnJpbmd0b25lLmNoYXQuZGlzYWJsZWQ9ITApLG4uY2hhdC5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUuY2hhdC5yaW5ndG9uZVVybD1uLmNoYXQucmluZ3RvbmVVcmwpKSxuLnJpbmd0b25lJiYoZS5yaW5ndG9uZS52b2ljZT10Lm1lcmdlKGUucmluZ3RvbmUudm9pY2Usbi5yaW5ndG9uZS52b2ljZXx8e30pLGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2s9dC5tZXJnZShlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrLG4ucmluZ3RvbmUudm9pY2V8fHt9KSxlLnJpbmd0b25lLmNoYXQ9dC5tZXJnZShlLnJpbmd0b25lLmNoYXQsbi5yaW5ndG9uZS5jaGF0fHx7fSkpfTtpZihzKG4sbiksdC5pc0ZyYW1lZCgpKXtsZXQgcjt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQ09ORklHVVJFLChmdW5jdGlvbihvKXtlLmNsZWFyVGltZW91dChyKSx0LmdldExvZygpLmluZm8oIltSaW5ndG9uZSBFbmdpbmVdIENvbmZpZ3VyZSBldmVudCBoYW5kbGVyIGV4ZWN1dGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnVuc3Vic2NyaWJlKCkscyhuLG8pLGYuc2V0KG4ucmluZ3RvbmUpLGkobi5yaW5ndG9uZSl9KSk7Y29uc3Qgbz1mLmdldCgpO28mJnQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKG4pe24mJm4uaWQmJih0LmdldExvZygpLmluZm8oIltSaW5ndG9uZUVuZ2luZV0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHdhaXRpbmcgZm9yIGNvbmZpZ3VyZSBNZXNzYWdlIGhhbmRsZXIgdG8gZXhlY3V0ZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy51bnN1YnNjcmliZSgpLHI9ZS5zZXRUaW1lb3V0KCgoKT0+e3QuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lRW5naW5lXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHdpdGhvdXQgY29uZmlndXJlIG1lc3NhZ2UgJiBJbml0aWFsaXppbmcgc2V0dXBSaW5ndG9uZUVuZ2luZXMgKFJpbmd0b25lIEVuZ2luZSkgZnJvbSBsb2NhbFN0b3JhZ2UgcmluZ3RvbmUgcGFyYW1zLiAiKS53aXRoT2JqZWN0KHtyaW5ndG9uZTpvfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKG8pfSksMTAwKSl9KSl9ZWxzZSBpKG4ucmluZ3RvbmUpfTt2YXIgUz1mdW5jdGlvbigpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1JJTkdFUl9ERVZJQ0UsYil9LGI9ZnVuY3Rpb24oZT17fSl7Y29uc3Qgbj1lLmRldmljZUlkfHwiIjtpZih0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEF0dGVtcHRpbmcgdG8gc2V0IHJpbmdlciBkZXZpY2UgJHtufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksMD09PXQua2V5cyh0LmNvcmUucmluZ3RvbmVFbmdpbmVzKS5sZW5ndGgpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbygiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gc2V0UmluZ2VyRGV2aWNlIGNhbGxlZCBiZWZvcmUgcmluZ3RvbmUgZW5naW5lIGlzIGluaXRpYWxpemVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx2b2lkKG4mJih0LmNvcmUuX3JpbmdlckRldmljZUlkPW4sdC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBzdG9yZWQgZGV2aWNlIElkIGZvciBsYXRlciB1c2UsIG9uY2UgcmluZ3RvbmUgZW5naW5lIGlzIHVwLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJTZXRSaW5nZXJEZXZpY2VCZWZvcmVJbml0UmluZ3RvbmVFbmdpbmUiLGRhdGE6e2NvdW50OjF9fSkpKTtpZihuKXtmb3IobGV0IGUgaW4gdC5jb3JlLnJpbmd0b25lRW5naW5lcyl0LmNvcmUucmluZ3RvbmVFbmdpbmVzW2VdLnNldE91dHB1dERldmljZShuKS50aGVuKChmdW5jdGlvbihuKXt0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIHJpbmd0b25lVHlwZSAke2V9IHN1Y2Nlc3NmdWxseSBzZXQgdG8gZGV2aWNlaWQgJHtufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoZSl9KSk7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlJJTkdFUl9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDpufX0pfWVsc2UgdC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHJpbmdlciBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIGRldmljZUlkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX07dC5jb3JlLmluaXRTb2Z0cGhvbmVNYW5hZ2VyPWZ1bmN0aW9uKG4pe3ZhciByPW58fHt9O3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBpbml0U29mdHBob25lTWFuYWdlciBzdGFydGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbz1mdW5jdGlvbihlKXt2YXIgbj10Lm1lcmdlKHIuc29mdHBob25lfHx7fSxlKTt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gY29tcGV0ZUZvck1hc3Rlck9uQWdlbnRVcGRhdGUgZXhlY3V0ZWQiKS53aXRoT2JqZWN0KHtzb2Z0cGhvbmVQYXJhbXM6bn0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5hZ2VudCgoZnVuY3Rpb24oZSl7ZS5nZXRDaGFubmVsQ29uY3VycmVuY3kodC5DaGFubmVsVHlwZS5WT0lDRSkmJmUub25SZWZyZXNoKChmdW5jdGlvbigpe3ZhciByPXRoaXM7dC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGFnZW50IHJlZnJlc2ggaGFuZGxlciBleGVjdXRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUsKGZ1bmN0aW9uKCl7dC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGNvbmZpcm1lZCBhcyBzb2Z0cGhvbmUgbWFzdGVyIHRvcGljIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSwhdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJmUuaXNTb2Z0cGhvbmVFbmFibGVkKCkmJih0LmJlY29tZU1hc3Rlcih0Lk1hc3RlclRvcGljcy5TRU5EX0xPR1MpLHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW5ldyB0LlNvZnRwaG9uZU1hbmFnZXIobiksci51bnN1YnNjcmliZSgpKX0pKX0pKX0pKX07aWYodC5pc0ZyYW1lZCgpJiZ0LmlzQ0NQKCkpe2xldCBuO3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKHIpe2UuY2xlYXJUaW1lb3V0KG4pLHQuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBDb25maWd1cmUgZXZlbnQgaGFuZGxlciBleGVjdXRlZCIpLndpdGhPYmplY3Qoe2RhdGE6cn0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaC5zZXQoci5zb2Z0cGhvbmUpLHIuc29mdHBob25lJiZyLnNvZnRwaG9uZS5hbGxvd0ZyYW1lZFNvZnRwaG9uZSYmKHRoaXMudW5zdWJzY3JpYmUoKSxvKHIuc29mdHBob25lKSksaShyLnNvZnRwaG9uZSl9KSk7bGV0IHI9aC5nZXQoKTtyJiZ0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbihzKXtzJiZzLmlkJiYodC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIEVtYmVkZGVkIENDUCBpcyByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5IGFuZCB3YWl0aW5nIGZvciBjb25maWd1cmUgTWVzc2FnZSBoYW5kbGVyIHRvIGV4ZWN1dGUiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMudW5zdWJzY3JpYmUoKSxuPWUuc2V0VGltZW91dCgoKCk9Pnt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCB3aXRob3V0IGNvbmZpZ3VyZSBtZXNzYWdlIGhhbmRsZXIgZXhlY3V0aW9uIikud2l0aE9iamVjdCh7c29mdHBob25lUGFyYW1zRnJvbUxvY2FsU3RvcmFnZTpyfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkVtYmVkZGVkQ0NQUmVmcmVzaGVkV2l0aG91dEluaXRDQ1AiLGRhdGE6e2NvdW50OjF9fSksaShyKSxyLmFsbG93RnJhbWVkU29mdHBob25lJiYodC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIEVtYmVkZGVkIENDUCBpcyByZWZyZXNoZWQgJiBJbml0aWFsaXppbmcgY29tcGV0ZUZvck1hc3Rlck9uQWdlbnRVcGRhdGUgKFNvZnRwaG9uZSBtYW5hZ2VyKSBmcm9tIGxvY2FsU3RvcmFnZSBzb2Z0cGhvbmUgcGFyYW1zIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxvKHIpKX0pLDEwMCkpfSkpfWVsc2UgbyhyKSxpKHIpO2Z1bmN0aW9uIGkoZSl7dmFyIG49dC5tZXJnZShyLnNvZnRwaG9uZXx8e30sZSk7dC5jb3JlLnNvZnRwaG9uZVBhcmFtcz1uLHQuaXNGaXJlZm94QnJvd3NlcigpJiYodC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0UsKGZ1bmN0aW9uKGUpe2UuZGF0YSYmZS5kYXRhLnRvcGljPT09dC5NYXN0ZXJUb3BpY3MuU09GVFBIT05FJiZlLmRhdGEudGFrZU92ZXImJmUuZGF0YS5tYXN0ZXJJZCE9PXQuY29yZS5wb3J0U3RyZWFtSWQmJnQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyJiYodC5jb3JlLnNvZnRwaG9uZU1hbmFnZXIub25Jbml0Q29udGFjdFN1Yi51bnN1YnNjcmliZSgpLGRlbGV0ZSB0LmNvcmUuc29mdHBob25lTWFuYWdlcil9KSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OLChmdW5jdGlvbigpe3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe3QuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyJiZ0LmNvcmUuc29mdHBob25lTWFuYWdlci5zdGFydFNlc3Npb24oKX0pLChmdW5jdGlvbigpe3QuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNPRlRQSE9ORSwoZnVuY3Rpb24oKXt0LmFnZW50KChmdW5jdGlvbihlKXshdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJmUuaXNTb2Z0cGhvbmVFbmFibGVkKCkmJih0LmJlY29tZU1hc3Rlcih0Lk1hc3RlclRvcGljcy5TRU5EX0xPR1MpLHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW5ldyB0LlNvZnRwaG9uZU1hbmFnZXIobiksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXIuc3RhcnRTZXNzaW9uKCkpfSkpfSkpfSkpfSkpLHQuY29udGFjdCgoZnVuY3Rpb24oZSl7dC5hZ2VudCgoZnVuY3Rpb24obil7ZS5vblJlZnJlc2goKGZ1bmN0aW9uKGUpe2lmKHQuaGFzT3RoZXJDb25uZWN0ZWRDQ1BzKCkmJiJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmKGUuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElOR3x8ZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5JTkNPTUlORykpe3ZhciByPWUuaXNTb2Z0cGhvbmVDYWxsKCkmJiFlLmlzSW5ib3VuZCgpLG89ZS5pc1NvZnRwaG9uZUNhbGwoKSYmbi5nZXRDb25maWd1cmF0aW9uKCkuc29mdHBob25lQXV0b0FjY2VwdCxpPWUuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5RVUVVRV9DQUxMQkFDSzsocnx8b3x8aSkmJnQuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50KCl9fSkpfSkpfSkpKX10LmFnZW50KChmdW5jdGlvbihlKXtlLmlzU29mdHBob25lRW5hYmxlZCgpJiZlLmdldENoYW5uZWxDb25jdXJyZW5jeSh0LkNoYW5uZWxUeXBlLlZPSUNFKSYmdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuTVVURX0pfSkpfSx0LmNvcmUudHJpZ2dlclJlYWR5VG9TdGFydFNlc3Npb25FdmVudD1mdW5jdGlvbigpe3ZhciBlPXQuY29yZS5zb2Z0cGhvbmVQYXJhbXMmJnQuY29yZS5zb2Z0cGhvbmVQYXJhbXMuYWxsb3dGcmFtZWRTb2Z0cGhvbmU7dC5pc0NDUCgpP2U/dC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkNvbm5lY3Rpb25FdmVudHMuUkVBRFlfVE9fU1RBUlRfU0VTU0lPTik6dC5pc0ZyYW1lZCgpP3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTplP3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkNvbm5lY3Rpb25FdmVudHMuUkVBRFlfVE9fU1RBUlRfU0VTU0lPTik6dC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkNvbm5lY3Rpb25FdmVudHMuUkVBRFlfVE9fU1RBUlRfU0VTU0lPTil9LHQuY29yZS5pbml0UGFnZU9wdGlvbnM9ZnVuY3Rpb24oZSl7aWYodC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpLHQuaXNGcmFtZWQoKSl7dmFyIG49dC5jb3JlLmdldEV2ZW50QnVzKCk7bi5zdWJzY3JpYmUodC5FdmVudFR5cGUuQ09ORklHVVJFLChmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuQ09ORklHVVJFLGRhdGE6ZX0pfSkpLG4uc3Vic2NyaWJlKHQuRXZlbnRUeXBlLk1FRElBX0RFVklDRV9SRVFVRVNULChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFU1BPTlNFLGUpfW5hdmlnYXRvciYmbmF2aWdhdG9yLm1lZGlhRGV2aWNlcz9uYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKS50aGVuKChmdW5jdGlvbih0KXtkZXZpY2VzPXR8fFtdLGRldmljZXM9ZGV2aWNlcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvSlNPTigpfSkpLGUoZGV2aWNlcyl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2Uoe2Vycm9yOnQubWVzc2FnZX0pfSkpOmUoe2Vycm9yOiJObyBuYXZpZ2F0b3Igb3IgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyBvYmplY3QgZm91bmQifSl9KSl9fSx0LmNvcmUuZ2V0RnJhbWVNZWRpYURldmljZXM9ZnVuY3Rpb24oZSl7dmFyIG49bnVsbCxyPWV8fDFlMyxvPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dChuZXcgRXJyb3IoIlRpbWVvdXQgZXhjZWVkZWQiKSl9KSxyKX0pKSxpPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2lmKHQuaXNGcmFtZWQoKXx8dC5pc0NDUCgpKW5hdmlnYXRvciYmbmF2aWdhdG9yLm1lZGlhRGV2aWNlcz9uYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKS50aGVuKChmdW5jdGlvbih0KXtkZXZpY2VzPXR8fFtdLGRldmljZXM9ZGV2aWNlcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvSlNPTigpfSkpLGUoZGV2aWNlcyl9KSk6cihuZXcgRXJyb3IoIk5vIG5hdmlnYXRvciBvciBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIG9iamVjdCBmb3VuZCIpKTtlbHNle3ZhciBvPXQuY29yZS5nZXRFdmVudEJ1cygpO249by5zdWJzY3JpYmUodC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFU1BPTlNFLChmdW5jdGlvbih0KXt0LmVycm9yP3IobmV3IEVycm9yKHQuZXJyb3IpKTplKHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVRVUVTVCl9fSkpO3JldHVybiBQcm9taXNlLnJhY2UoW2ksb10pLmZpbmFsbHkoKGZ1bmN0aW9uKCl7biYmbi51bnN1YnNjcmliZSgpfSkpfSx0LmNvcmUuYXV0aG9yaXplPWZ1bmN0aW9uKGUpe3ZhciBuPWU7cmV0dXJuIG58fChuPXQuY29yZS5pc0xlZ2FjeURvbWFpbigpP3M6aSksdC5mZXRjaChuLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9LDJlMyw1KX0sdC5jb3JlLnZlcmlmeURvbWFpbkFjY2Vzcz1mdW5jdGlvbihlLG4pe2lmKHQuZ2V0TG9nKCkud2FybigiVGhpcyBBUEkgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gcmVsZWFzZSIpLCF0LmlzRnJhbWVkKCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciByPXtoZWFkZXJzOnsiWC1BbXotQmVhcmVyIjplfX0sbz1udWxsO3JldHVybiBvPW58fCh0LmNvcmUuaXNMZWdhY3lEb21haW4oKT8iL2Nvbm5lY3Qvd2hpdGVsaXN0ZWQtb3JpZ2lucyI6Ii93aGl0ZWxpc3RlZC1vcmlnaW5zIiksdC5mZXRjaChvLHIsMmUzLDUpLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciB0PWcod2luZG93LmRvY3VtZW50LnJlZmVycmVyKTtyZXR1cm4gZS53aGl0ZWxpc3RlZE9yaWdpbnMuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIHQ9PT1nKGUpfSkpP1Byb21pc2UucmVzb2x2ZSgpOlByb21pc2UucmVqZWN0KCl9KSl9LHQuY29yZS5pc0xlZ2FjeURvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4oZT1lfHx3aW5kb3cubG9jYXRpb24uaHJlZikuaW5jbHVkZXMoIi5hd3NhcHBzLmNvbSIpfSx0LmNvcmUuaW5pdFNoYXJlZFdvcmtlcj1mdW5jdGlvbihuKXtpZih0LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZCgpLCF0LmNvcmUuaW5pdGlhbGl6ZWQpe3QuYXNzZXJ0Tm90TnVsbChuLCJwYXJhbXMiKTt2YXIgcj10LmFzc2VydE5vdE51bGwobi5zaGFyZWRXb3JrZXJVcmwsInBhcmFtcy5zaGFyZWRXb3JrZXJVcmwiKSxvPXQuYXNzZXJ0Tm90TnVsbChuLmF1dGhUb2tlbiwicGFyYW1zLmF1dGhUb2tlbiIpLGE9dC5hc3NlcnROb3ROdWxsKG4ucmVmcmVzaFRva2VuLCJwYXJhbXMucmVmcmVzaFRva2VuIiksYz10LmFzc2VydE5vdE51bGwobi5hdXRoVG9rZW5FeHBpcmF0aW9uLCJwYXJhbXMuYXV0aFRva2VuRXhwaXJhdGlvbiIpLHU9dC5hc3NlcnROb3ROdWxsKG4ucmVnaW9uLCJwYXJhbXMucmVnaW9uIiksbD1uLmVuZHBvaW50fHxudWxsLHA9bi5hdXRob3JpemVFbmRwb2ludDtwfHwocD10LmNvcmUuaXNMZWdhY3lEb21haW4oKT9zOmkpO3ZhciBkPW4uYWdlbnRBcHBFbmRwb2ludHx8bnVsbCxoPW4udGFza1RlbXBsYXRlc0VuZHBvaW50fHxudWxsLGY9bi5hdXRoQ29va2llTmFtZXx8bnVsbDt0cnl7dC5jb3JlLmV2ZW50QnVzPW5ldyB0LkV2ZW50QnVzKHtsb2dFdmVudHM6ITB9KSx0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXI9bmV3IEkodC5jb3JlLmdldEV2ZW50QnVzKCkpLHQuY29yZS5tZWRpYUZhY3Rvcnk9bmV3IHQuTWVkaWFGYWN0b3J5KG4pO3ZhciBnPW5ldyBTaGFyZWRXb3JrZXIociwiQ29ubmVjdFNoYXJlZFdvcmtlciIpLG09bmV3IHQuQ29uZHVpdCgiQ29ubmVjdFNoYXJlZFdvcmtlckNvbmR1aXQiLG5ldyB0LlBvcnRTdHJlYW0oZy5wb3J0KSxuZXcgdC5XaW5kb3dJT1N0cmVhbSh3aW5kb3cscGFyZW50KSk7dC5jb3JlLnVwc3RyZWFtPW0sdC5jb3JlLndlYlNvY2tldFByb3ZpZGVyPW5ldyBDLGUub251bmxvYWQ9ZnVuY3Rpb24oKXttLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5DTE9TRSksZy5wb3J0LmNsb3NlKCl9LHQuZ2V0TG9nKCkuc2NoZWR1bGVVcHN0cmVhbUxvZ1B1c2gobSksdC5nZXRMb2coKS5zY2hlZHVsZURvd25zdHJlYW1DbGllbnRTaWRlTG9nc1B1c2goKSxtLm9uQWxsVXBzdHJlYW0odC5jb3JlLmdldEV2ZW50QnVzKCkuYnJpZGdlKCkpLG0ub25BbGxVcHN0cmVhbShtLnBhc3NEb3duc3RyZWFtKCkpLHQuaXNGcmFtZWQoKSYmKG0ub25BbGxEb3duc3RyZWFtKHQuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSxtLm9uQWxsRG93bnN0cmVhbShtLnBhc3NVcHN0cmVhbSgpKSksbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ09ORklHVVJFLHthdXRoVG9rZW46byxhdXRoVG9rZW5FeHBpcmF0aW9uOmMsZW5kcG9pbnQ6bCxyZWZyZXNoVG9rZW46YSxyZWdpb246dSxhdXRob3JpemVFbmRwb2ludDpwLGFnZW50QXBwRW5kcG9pbnQ6ZCx0YXNrVGVtcGxhdGVzRW5kcG9pbnQ6aCxhdXRoQ29va2llTmFtZTpmLGxvbmdQb2xsaW5nT3B0aW9uczpuLmxvbmdQb2xsaW5nT3B0aW9uc3x8dm9pZCAwfSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIkFja25vd2xlZGdlZCBieSB0aGUgQ29ubmVjdFNoYXJlZFdvcmtlciEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5pbml0aWFsaXplZD0hMCx0LmNvcmUuX3NldFRhYklkKCksdC5jb3JlLnBvcnRTdHJlYW1JZD1lLmlkLHRoaXMudW5zdWJzY3JpYmUoKX0pKSxtLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuTE9HLChmdW5jdGlvbihlKXtlLmxvZ2dlcklkIT09dC5nZXRMb2coKS5nZXRMb2dnZXJJZCgpJiZ0LmdldExvZygpLmFkZExvZ0VudHJ5KHQuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuc2VuZEludGVybmFsTG9nRW50cnlUb1NlcnZlcih0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLG0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmQXJyYXkuaXNBcnJheShlKSYmZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLnNlbmRJbnRlcm5hbExvZ0VudHJ5VG9TZXJ2ZXIodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKX0pKSxtLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmZS5sb2dnZXJJZCE9PXQuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmdC5nZXRMb2coKS5hZGRMb2dFbnRyeSh0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLHQuY29yZS5vbkF1dGhGYWlsKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aEZhaWwsbi5sb2dpbkVuZHBvaW50fHxudWxsLHApKSx0LmNvcmUub25BdXRob3JpemVTdWNjZXNzKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aG9yaXplU3VjY2VzcykpLHQuZ2V0TG9nKCkuaW5mbygiVXNlciBBZ2VudDogIituYXZpZ2F0b3IudXNlckFnZW50KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbygiaXNDQ1B2MjogIishMCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oImlzRnJhbWVkOiAiK3QuaXNGcmFtZWQoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUudXBzdHJlYW0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTywoZnVuY3Rpb24oZSl7dmFyIG49ZS5zdHJlYW1zVmVyc2lvbnx8bnVsbDt0LmdldExvZygpLmluZm8oIlN0cmVhbXNKUyBWZXJzaW9uOiAiK24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5vdXRlckNvbnRleHRTdHJlYW1zVmVyc2lvbj1ufSkpLG0ub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiTnVtYmVyIG9mIGNvbm5lY3RlZCBDQ1BzIHVwZGF0ZWQ6ICIrZS5sZW5ndGgpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5udW1iZXJPZkNvbm5lY3RlZENDUHM9ZS5sZW5ndGgsZVt0LmNvcmUudGFiSWRdJiYhaXNOYU4oZVt0LmNvcmUudGFiSWRdLmxlbmd0aCkmJnQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiIT09ZVt0LmNvcmUudGFiSWRdLmxlbmd0aCYmKHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPWVbdC5jb3JlLnRhYklkXS5sZW5ndGgsdC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWI+MSYmdC5nZXRMb2coKS53YXJuKCJUaGVyZSBhcmUgIit0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYisiIGNvbm5lY3RlZCBDQ1BzIGluIHRoaXMgdGFiLiBQbGVhc2UgYWRqdXN0IHlvdXIgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4gSWYgeW91IGFyZSBlbWJlZGRpbmcgQ0NQLCBwbGVhc2UgZG8gc28gZXhjbHVzaXZlbHkgd2l0aCBpbml0Q0NQLiBJbml0Q0NQIHdpbGwgbm90IGxldCB5b3UgZW1iZWQgbW9yZSB0aGFuIG9uZSBDQ1AuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNvbm5lY3RlZENDUFNpbmdsZVRhYkNvdW50IixkYXRhOntjb3VudDp0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYn19KSksZS50YWJJZCYmZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXImJnQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuTUVUUklDUywoKCk9PnQuYWdlbnQoKCgpPT50LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNDUFRhYnNBY3Jvc3NCcm93c2VyQ291bnQiLGRhdGE6e3RhYklkOmUudGFiSWQsY291bnQ6ZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXJ9fSkpKSkpfSkpLHQuY29yZS5jbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50KG0pLHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KG0pLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5URVJNSU5BVEUsbS5wYXNzVXBzdHJlYW0oKSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLlRFUk1JTkFURUQsKGZ1bmN0aW9uKCl7d2luZG93LmxvY2F0aW9uLnJlbG9hZCghMCl9KSksZy5wb3J0LnN0YXJ0KCksbS5vblVwc3RyZWFtKHQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELChmdW5jdGlvbihlKXtlJiZlLmRvbWFpbklkJiYodC5jb3JlLnZvaWNlSWREb21haW5JZD1lLmRvbWFpbklkKX0pKSx0LmFnZW50KChmdW5jdGlvbigpeyhuZXcgdC5Wb2ljZUlkKS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidm9pY2VJZCBkb21haW5JZCBzdWNjZXNzZnVsbHkgZmV0Y2hlZCBhdCBhZ2VudCBpbml0aWFsaXphdGlvbjogIitlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInZvaWNlSWQgZG9tYWluSWQgbm90IGZldGNoZWQgYXQgYWdlbnQgaW5pdGlhbGl6YXRpb24iKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSksdC5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXIoKS5yZXF1ZXN0UGVybWlzc2lvbigpLG0ub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RJU0FTVEVSX1JFQ09WRVJZLChmdW5jdGlvbihlKXt0LmNvcmUuaW5pdERpc2FzdGVyUmVjb3ZlcnkoZSl9KSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIEFQSSBzaGFyZWQgd29ya2VyLCB3ZSdyZSBkZWFkISIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19fSx0LmNvcmUuX3NldFRhYklkPWZ1bmN0aW9uKCl7dHJ5e3QuY29yZS50YWJJZD13aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5UQUJfSUQpLHQuY29yZS50YWJJZHx8KHQuY29yZS50YWJJZD10LnJhbmRvbUlkKCksd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuVEFCX0lELHQuY29yZS50YWJJZCkpLHQuY29yZS51cHN0cmVhbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuVEFCX0lELHt0YWJJZDp0LmNvcmUudGFiSWR9KX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkXSBUaGVyZSB3YXMgYW4gaXNzdWUgc2V0dGluZyB0aGUgdGFiIElkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0sdC5jb3JlLmluaXRDQ1A9ZnVuY3Rpb24obixpKXtpZih0LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZCgpLCF0LmNvcmUuaW5pdGlhbGl6ZWQpe3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBzPURhdGUubm93KCk7dHJ5e2lmKHQuY29yZS5fZ2V0Q0NQSWZyYW1lKCkpcmV0dXJuIHZvaWQgdC5nZXRMb2coKS5lcnJvcigiQXR0ZW1wdGVkIHRvIGNhbGwgaW5pdENDUCB3aGVuIGFuIGlmcmFtZSBnZW5lcmF0ZWQgYnkgaW5pdENDUCBhbHJlYWR5IGV4aXN0cyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgaW5pdENDUCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX12YXIgcD17fTsic3RyaW5nIj09dHlwZW9mIGk/cC5jY3BVcmw9aTpwPWksdC5hc3NlcnROb3ROdWxsKG4sImNvbnRhaW5lckRpdiIpLHQuYXNzZXJ0Tm90TnVsbChwLmNjcFVybCwicGFyYW1zLmNjcFVybCIpLGguY2xlYW4oKSxmLmNsZWFuKCk7dmFyIGQ9dC5jb3JlLl9jcmVhdGVDQ1BJZnJhbWUobixwKTt0LmNvcmUuZXZlbnRCdXM9bmV3IHQuRXZlbnRCdXMoe2xvZ0V2ZW50czohMX0pLHQuY29yZS5hZ2VudERhdGFQcm92aWRlcj1uZXcgSSh0LmNvcmUuZ2V0RXZlbnRCdXMoKSksdC5jb3JlLm1lZGlhRmFjdG9yeT1uZXcgdC5NZWRpYUZhY3RvcnkocCk7dmFyIGc9bmV3IHQuSUZyYW1lQ29uZHVpdChwLmNjcFVybCx3aW5kb3csZCk7dC5jb3JlLl9zZW5kSWZyYW1lU3R5bGVEYXRhVXBzdHJlYW1BZnRlclJlYXNvbmFibGVXYWl0VGltZShkLGcpLHQuY29yZS51cHN0cmVhbT1nLHQuY29yZS53ZWJTb2NrZXRQcm92aWRlcj1uZXcgQyxnLm9uQWxsVXBzdHJlYW0odC5jb3JlLmdldEV2ZW50QnVzKCkuYnJpZGdlKCkpLHQuY29yZS5rZWVwYWxpdmVNYW5hZ2VyPW5ldyBUKGcsdC5jb3JlLmdldEV2ZW50QnVzKCkscC5jY3BTeW5UaW1lb3V0fHwxZTMscC5jY3BBY2tUaW1lb3V0fHwzZTMpLHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dD1udWxsLHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlPWUuc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZT1udWxsLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQUNLX1RJTUVPVVQpLHQuZ2V0TG9nKCkuaW5mbygiQ0NQIExvYWRUaW1lb3V0IHRyaWdnZXJlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSxwLmNjcExvYWRUaW1lb3V0fHw1ZTMpLHQuZ2V0TG9nKCkuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUExvZ3NQdXNoKGcpLHQuZ2V0TG9nKCkuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1B1c2goZyksZy5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbihuKXtpZih0LmdldExvZygpLmluZm8oIkFja25vd2xlZGdlZCBieSB0aGUgQ0NQISIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmNsaWVudD1uZXcgdC5VcHN0cmVhbUNvbmR1aXRDbGllbnQoZyksdC5jb3JlLm1hc3RlckNsaWVudD1uZXcgdC5VcHN0cmVhbUNvbmR1aXRNYXN0ZXJDbGllbnQoZyksdC5jb3JlLnBvcnRTdHJlYW1JZD1uLmlkLChwLnNvZnRwaG9uZXx8cC5jaGF0fHxwLnBhZ2VPcHRpb25zfHxwLnNob3VsZEFkZE5hbWVzcGFjZVRvTG9nc3x8cC5kaXNhc3RlclJlY292ZXJ5T24pJiZnLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5DT05GSUdVUkUse3NvZnRwaG9uZTpwLnNvZnRwaG9uZSxjaGF0OnAuY2hhdCxwYWdlT3B0aW9uczpwLnBhZ2VPcHRpb25zLHNob3VsZEFkZE5hbWVzcGFjZVRvTG9nczpwLnNob3VsZEFkZE5hbWVzcGFjZVRvTG9ncyxkaXNhc3RlclJlY292ZXJ5T246cC5kaXNhc3RlclJlY292ZXJ5T259KSxwLmRpc2FzdGVyUmVjb3ZlcnlPbiYmKHQuY29yZS5yZWdpb249cC5yZWdpb24sdC5jb3JlLnN1cHByZXNzQ29udGFjdHM9dix0LmNvcmUuZm9yY2VPZmZsaW5lPWZ1bmN0aW9uKGUpe2cuc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5TRVRfT0ZGTElORSxlKX0sZy5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRElTQVNURVJfUkVDT1ZFUlkscCkpLHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlJiYoZS5jbGVhclRpbWVvdXQodC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2UpLHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlPW51bGwpLGcuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTyx7c3RyZWFtc1ZlcnNpb246dC52ZXJzaW9ufSksdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXIuc3RhcnQoKSx0aGlzLnVuc3Vic2NyaWJlKCksdC5jb3JlLmluaXRpYWxpemVkPSEwLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuSU5JVCkscyl7dmFyIHI9RGF0ZS5ub3coKS1zLG89dC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0fHwwO3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5nZXRMb2coKS5pbmZvKGBJZnJhbWUgaW5pdGlhbGl6YXRpb24gdGltZSAke3J9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oYElmcmFtZSByZWZyZXNoIGF0dGVtcHRzICR7b31gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHNldFRpbWVvdXQoKCgpPT57dC5wdWJsaXNoTWV0cmljKHtuYW1lOmEsZGF0YTp7Y291bnQ6b319KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6dSxkYXRhOntjb3VudDoxfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiSWZyYW1lSW5pdGlhbGl6YXRpb25UaW1lIixkYXRhOntjb3VudDpyfX0pLHAuZGlzYXN0ZXJSZWNvdmVyeU9uJiYodC5wdWJsaXNoTWV0cmljKHtuYW1lOmMsZGF0YTp7Y291bnQ6b319KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bCxkYXRhOntjb3VudDoxfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiSWZyYW1lSW5pdGlhbGl6YXRpb25UaW1lRHIiLGRhdGE6e2NvdW50OnJ9fSkpLHM9bnVsbH0pLDFlMyl9fSkpLGcub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe2UubG9nZ2VySWQhPT10LmdldExvZygpLmdldExvZ2dlcklkKCkmJnQuZ2V0TG9nKCkuYWRkTG9nRW50cnkodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQUNLX1RJTUVPVVQsKGZ1bmN0aW9uKCl7aWYoITEhPT1wLmxvZ2luUG9wdXApdHJ5e3ZhciBpPWZ1bmN0aW9uKG4pe3ZhciBpPSJodHRwczovL2xpbHkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vdGF3L2F1dGgvY29kZSI7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChpKSxuLmxvZ2luVXJsP24ubG9naW5Vcmw6bi5hbGlhcz8obG9nLndhcm4oIlRoZSBgYWxpYXNgIHBhcmFtIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgZXhwZWN0ZWQgdG8gZnVuY3Rpb24gcHJvcGVybHkuIFBsZWFzZSB1c2UgYGNjcFVybGAgb3IgYGxvZ2luVXJsYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbWF6b24tY29ubmVjdC9hbWF6b24tY29ubmVjdC1zdHJlYW1zL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNjb25uZWN0Y29yZWluaXRjY3AgZm9yIHZhbGlkIHBhcmFtZXRlcnMuIiksci5yZXBsYWNlKCJ7YWxpYXN9IixuLmFsaWFzKS5yZXBsYWNlKCJ7Y2xpZW50X2lkfSIsbykucmVwbGFjZSgie3JlZGlyZWN0fSIsZS5lbmNvZGVVUklDb21wb25lbnQoaSkpKTpuLmNjcFVybH0ocCk7dC5nZXRMb2coKS53YXJuKCJBQ0tfVElNRU9VVCBvY2N1cnJlZCwgYXR0ZW1wdGluZyB0byBwb3AgdGhlIGxvZ2luIHBhZ2UgaWYgbm90IGFscmVhZHkgb3Blbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHAubG9naW5VcmwmJnQuY29yZS5nZXRQb3B1cE1hbmFnZXIoKS5jbGVhcih0Lk1hc3RlclRvcGljcy5MT0dJTl9QT1BVUCksdC5jb3JlLmxvZ2luV2luZG93PXQuY29yZS5nZXRQb3B1cE1hbmFnZXIoKS5vcGVuKGksdC5NYXN0ZXJUb3BpY3MuTE9HSU5fUE9QVVAscC5sb2dpbk9wdGlvbnMpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkFDS19USU1FT1VUIG9jY3VycmVkIGJ1dCB3ZSBhcmUgdW5hYmxlIHRvIG9wZW4gdGhlIGxvZ2luIHBvcHVwLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1pZihudWxsPT10LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpdHJ5e2cub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24oKXt0aGlzLnVuc3Vic2NyaWJlKCksZS5jbGVhclRpbWVvdXQodC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0KSx0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQ9bnVsbCx0LmNvcmUuZ2V0UG9wdXBNYW5hZ2VyKCkuY2xlYXIodC5NYXN0ZXJUb3BpY3MuTE9HSU5fUE9QVVApLChwLmxvZ2luUG9wdXBBdXRvQ2xvc2V8fHAubG9naW5PcHRpb25zJiZwLmxvZ2luT3B0aW9ucy5hdXRvQ2xvc2UpJiZ0LmNvcmUubG9naW5XaW5kb3cmJih0LmNvcmUubG9naW5XaW5kb3cuY2xvc2UoKSx0LmNvcmUubG9naW5XaW5kb3c9bnVsbCl9KSksdC5jb3JlLl9yZWZyZXNoSWZyYW1lT25UaW1lb3V0KHAsbil9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVmcmVzaGluZyBpZnJhbWUiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpLHAub25WaWV3Q29udGFjdCYmdC5jb3JlLm9uVmlld0NvbnRhY3QocC5vblZpZXdDb250YWN0KSxnLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLChmdW5jdGlvbihlKXt0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz1lLmxlbmd0aH0pKSxnLm9uVXBzdHJlYW0odC5Wb2ljZUlkRXZlbnRzLlVQREFURV9ET01BSU5fSUQsKGZ1bmN0aW9uKGUpe2UmJmUuZG9tYWluSWQmJih0LmNvcmUudm9pY2VJZERvbWFpbklkPWUuZG9tYWluSWQpfSkpLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQsKGZ1bmN0aW9uKCl7aWYocyl7dmFyIGU9dC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0LTE7dC5nZXRMb2coKS5pbmZvKCJJZnJhbWUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oIlRpbWUgYWZ0ZXIgaWZyYW1lIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQgIisoRGF0ZS5ub3coKS1zKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oYElmcmFtZSByZWZyZXNoIGF0dGVtcHRzICR7ZX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZTphLGRhdGE6e2NvdW50OmV9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOnUsZGF0YTp7Y291bnQ6MH19KSxwLmRpc2FzdGVyUmVjb3ZlcnlPbiYmKHQucHVibGlzaE1ldHJpYyh7bmFtZTpjLGRhdGE6e2NvdW50OmV9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOmwsZGF0YTp7Y291bnQ6MH19KSkscz1udWxsfX0pKSx0LmNvcmUuc29mdHBob25lUGFyYW1zPXAuc29mdHBob25lfX0sdC5jb3JlLm9uSWZyYW1lUmV0cmllc0V4aGF1c3RlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuSUZSQU1FX1JFVFJJRVNfRVhIQVVTVEVELGUpfSx0LmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQ9ZnVuY3Rpb24obixyKXt0LmFzc2VydE5vdE51bGwobiwiaW5pdENDUFBhcmFtcyIpLHQuYXNzZXJ0Tm90TnVsbChyLCJjb250YWluZXJEaXYiKTt2YXIgbz0oKG4uZGlzYXN0ZXJSZWNvdmVyeU9uPzFlNDo1ZTMpK0FXUy51dGlsLmNhbGN1bGF0ZVJldHJ5RGVsYXkodC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0LTF8fDAse2Jhc2U6MmUzfSkpKk1hdGguY2VpbCgodC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0fHwwKS82KTtlLmNsZWFyVGltZW91dCh0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpLHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dD1lLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYodC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0PSh0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHR8fDApKzEsdC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0PD02KXt0cnl7dmFyIG89dC5jb3JlLl9nZXRDQ1BJZnJhbWUoKTtvJiZvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyk7dmFyIGk9dC5jb3JlLl9jcmVhdGVDQ1BJZnJhbWUocixuKTt0LmNvcmUudXBzdHJlYW0udXBzdHJlYW0ub3V0cHV0PWkuY29udGVudFdpbmRvdyx0LmNvcmUuX3NlbmRJZnJhbWVTdHlsZURhdGFVcHN0cmVhbUFmdGVyUmVhc29uYWJsZVdhaXRUaW1lKGksdC5jb3JlLnVwc3RyZWFtKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJFcnJvciB3aGlsZSBjaGVja2luZyBmb3IsIGFuZCByZWNyZWF0aW5nLCB0aGUgQ0NQIElGcmFtZSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX10LmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQobixyKX1lbHNlIHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuSUZSQU1FX1JFVFJJRVNfRVhIQVVTVEVEKSxlLmNsZWFyVGltZW91dCh0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpfSksbyl9LHQuY29yZS5fZ2V0Q0NQSWZyYW1lPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIG9mIHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIikpaWYoZS5uYW1lPT09bilyZXR1cm4gZTtyZXR1cm4gbnVsbH0sdC5jb3JlLl9jcmVhdGVDQ1BJZnJhbWU9ZnVuY3Rpb24oZSxyKXt0LmFzc2VydE5vdE51bGwociwiaW5pdENDUFBhcmFtcyIpLHQuYXNzZXJ0Tm90TnVsbChlLCJjb250YWluZXJEaXYiKTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtyZXR1cm4gby5zcmM9ci5jY3BVcmwsby5hbGxvdz0ibWljcm9waG9uZTsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZSIsby5zdHlsZT1yLnN0eWxlfHwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJSIsby50aXRsZT1yLmlmcmFtZVRpdGxlfHxuLG8ubmFtZT1uLGUuYXBwZW5kQ2hpbGQobyksb30sdC5jb3JlLl9zZW5kSWZyYW1lU3R5bGVEYXRhVXBzdHJlYW1BZnRlclJlYXNvbmFibGVXYWl0VGltZT1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJpZnJhbWUiKSx0LmFzc2VydE5vdE51bGwobiwiY29uZHVpdCIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHI9e2Rpc3BsYXk6d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSxudWxsKS5kaXNwbGF5LG9mZnNldFdpZHRoOmUub2Zmc2V0V2lkdGgsb2Zmc2V0SGVpZ2h0OmUub2Zmc2V0SGVpZ2h0LGNsaWVudFJlY3RzTGVuZ3RoOmUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGh9O24uc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLklGUkFNRV9TVFlMRSxyKX0pLDFlNCl9O3ZhciBUPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuY29uZHVpdD1lLHRoaXMuZXZlbnRCdXM9dCx0aGlzLnN5blRpbWVvdXQ9bix0aGlzLmFja1RpbWVvdXQ9cix0aGlzLmFja1RpbWVyPW51bGwsdGhpcy5zeW5UaW1lcj1udWxsLHRoaXMuYWNrU3ViPW51bGx9O1QucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7dmFyIG49dGhpczt0aGlzLmNvbmR1aXQuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlNZTkNIUk9OSVpFKSx0aGlzLmFja1N1Yj10aGlzLmNvbmR1aXQub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24oKXt0aGlzLnVuc3Vic2NyaWJlKCksZS5jbGVhclRpbWVvdXQobi5hY2tUaW1lciksbi5fZGVmZXJTdGFydCgpfSkpLHRoaXMuYWNrVGltZXI9ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe24uYWNrU3ViLnVuc3Vic2NyaWJlKCksbi5ldmVudEJ1cy50cmlnZ2VyKHQuRXZlbnRUeXBlLkFDS19USU1FT1VUKSxuLl9kZWZlclN0YXJ0KCl9KSx0aGlzLmFja1RpbWVvdXQpfSxULnByb3RvdHlwZS5fZGVmZXJTdGFydD1mdW5jdGlvbigpe3RoaXMuc3luVGltZXI9ZS5zZXRUaW1lb3V0KHQuaGl0Y2godGhpcyx0aGlzLnN0YXJ0KSx0aGlzLnN5blRpbWVvdXQpfSxULnByb3RvdHlwZS5kZWZlclN0YXJ0PWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5zeW5UaW1lciYmKHRoaXMuc3luVGltZXI9ZS5zZXRUaW1lb3V0KHQuaGl0Y2godGhpcyx0aGlzLnN0YXJ0KSx0aGlzLnN5blRpbWVvdXQpKX07dmFyIEM9ZnVuY3Rpb24oKXt2YXIgZT17aW5pdEZhaWx1cmU6bmV3IFNldCxzdWJzY3JpcHRpb25VcGRhdGU6bmV3IFNldCxzdWJzY3JpcHRpb25GYWlsdXJlOm5ldyBTZXQsdG9waWM6bmV3IE1hcCxhbGxNZXNzYWdlOm5ldyBTZXQsY29ubmVjdGlvbkdhaW46bmV3IFNldCxjb25uZWN0aW9uTG9zdDpuZXcgU2V0LGNvbm5lY3Rpb25PcGVuOm5ldyBTZXQsY29ubmVjdGlvbkNsb3NlOm5ldyBTZXR9LG49ZnVuY3Rpb24oZSx0KXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UodCl9KSl9O3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuSU5JVF9GQUlMVVJFLChmdW5jdGlvbigpe24oZS5pbml0RmFpbHVyZSl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX09QRU4sKGZ1bmN0aW9uKHQpe24oZS5jb25uZWN0aW9uT3Blbix0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fQ0xPU0UsKGZ1bmN0aW9uKHQpe24oZS5jb25uZWN0aW9uQ2xvc2UsdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0dBSU4sKGZ1bmN0aW9uKCl7bihlLmNvbm5lY3Rpb25HYWluKX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fTE9TVCwoZnVuY3Rpb24odCl7bihlLmNvbm5lY3Rpb25Mb3N0LHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX1VQREFURSwoZnVuY3Rpb24odCl7bihlLnN1YnNjcmlwdGlvblVwZGF0ZSx0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklQVElPTl9GQUlMVVJFLChmdW5jdGlvbih0KXtuKGUuc3Vic2NyaXB0aW9uRmFpbHVyZSx0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkFMTF9NRVNTQUdFLChmdW5jdGlvbih0KXtuKGUuYWxsTWVzc2FnZSx0KSxlLnRvcGljLmhhcyh0LnRvcGljKSYmbihlLnRvcGljLmdldCh0LnRvcGljKSx0KX0pKSx0aGlzLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TRU5ELGUpfSx0aGlzLm9uSW5pdEZhaWx1cmU9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmluaXRGYWlsdXJlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmluaXRGYWlsdXJlLmRlbGV0ZShuKX19LHRoaXMub25Db25uZWN0aW9uT3Blbj1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbk9wZW4uYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbk9wZW4uZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25DbG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbkNsb3NlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmNvbm5lY3Rpb25DbG9zZS5kZWxldGUobil9fSx0aGlzLm9uQ29ubmVjdGlvbkdhaW49ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmNvbm5lY3Rpb25HYWluLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmNvbm5lY3Rpb25HYWluLmRlbGV0ZShuKX19LHRoaXMub25Db25uZWN0aW9uTG9zdD1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbkxvc3QuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkxvc3QuZGVsZXRlKG4pfX0sdGhpcy5vblN1YnNjcmlwdGlvblVwZGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuc3Vic2NyaXB0aW9uVXBkYXRlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLnN1YnNjcmlwdGlvblVwZGF0ZS5kZWxldGUobil9fSx0aGlzLm9uU3Vic2NyaXB0aW9uRmFpbHVyZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuc3Vic2NyaXB0aW9uRmFpbHVyZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5zdWJzY3JpcHRpb25GYWlsdXJlLmRlbGV0ZShuKX19LHRoaXMuc3Vic2NyaWJlVG9waWNzPWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJ0b3BpY3MiKSx0LmFzc2VydFRydWUodC5pc0FycmF5KGUpLCJ0b3BpY3MgbXVzdCBiZSBhIGFycmF5IiksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklCRSxlKX0sdGhpcy5vbk1lc3NhZ2U9ZnVuY3Rpb24obixyKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKG4sInRvcGljTmFtZSIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24ociksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLnRvcGljLmhhcyhuKT9lLnRvcGljLmdldChuKS5hZGQocik6ZS50b3BpYy5zZXQobixuZXcgU2V0KFtyXSkpLGZ1bmN0aW9uKCl7cmV0dXJuIGUudG9waWMuZ2V0KG4pLmRlbGV0ZShyKX19LHRoaXMub25BbGxNZXNzYWdlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5hbGxNZXNzYWdlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmFsbE1lc3NhZ2UuZGVsZXRlKG4pfX19LEk9ZnVuY3Rpb24oZSl7dGhpcy5idXM9ZSx0aGlzLmJ1cy5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5VUERBVEUsdC5oaXRjaCh0aGlzLHRoaXMudXBkYXRlQWdlbnREYXRhKSl9O0kucHJvdG90eXBlLnVwZGF0ZUFnZW50RGF0YT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLmFnZW50RGF0YTt0aGlzLmFnZW50RGF0YT1lO3RyeXtjb25zdCByPURhdGUucGFyc2UoZS5zbmFwc2hvdC5zbmFwc2hvdFRpbWVzdGFtcCk7aWYoIW58fHIhPT1EYXRlLnBhcnNlKG4uc25hcHNob3Quc25hcHNob3RUaW1lc3RhbXApKXtjb25zdCBuPShuZXcgRGF0ZSkuZ2V0VGltZSgpLXI7QSgiU25hcHNob3RSZWNlaXZlZEJ5Q2xpZW50IixuLHtDb250ZW50TGVuZ3RoSW5CeXRlczp0LmNvcmUuX2NhbGN1bGF0ZVNuYXBzaG90U2l6aW5nQnVja2V0KGUuc25hcHNob3QpLElzQ0NQTGF5ZXI6dC5pc0NDUCgpfSl9fWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltNZXRyaWNzXSBGYWlsZWQgdG8gc2VuZCBtZXRyaWNzLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1udWxsPT1uJiYodC5hZ2VudC5pbml0aWFsaXplZD0hMCx0aGlzLmJ1cy50cmlnZ2VyKHQuQWdlbnRFdmVudHMuSU5JVCxuZXcgdC5BZ2VudCkpLHRoaXMuYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5SRUZSRVNILG5ldyB0LkFnZW50KSx0aGlzLl9maXJlQWdlbnRVcGRhdGVFdmVudHMobil9LEkucHJvdG90eXBlLmdldEFnZW50RGF0YT1mdW5jdGlvbigpe2lmKG51bGw9PXRoaXMuYWdlbnREYXRhKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIk5vIGFnZW50IGRhdGEgaXMgYXZhaWxhYmxlIHlldCEiKTtyZXR1cm4gdGhpcy5hZ2VudERhdGF9LEkucHJvdG90eXBlLmdldENvbnRhY3REYXRhPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuZ2V0QWdlbnREYXRhKCkscj10LmZpbmQobi5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24odCl7cmV0dXJuIHQuY29udGFjdElkPT09ZX0pKTtpZihudWxsPT1yKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIkNvbnRhY3QgJXMgbm8gbG9uZ2VyIGV4aXN0cy4iLGUpO3JldHVybiByfSxJLnByb3RvdHlwZS5nZXRDb25uZWN0aW9uRGF0YT1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMuZ2V0Q29udGFjdERhdGEoZSksbz10LmZpbmQoci5jb25uZWN0aW9ucywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29ubmVjdGlvbklkPT09bn0pKTtpZihudWxsPT1vKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIkNvbm5lY3Rpb24gJXMgZm9yIGNvbnRhY3QgJXMgbm8gbG9uZ2VyIGV4aXN0cy4iLG4sZSk7cmV0dXJuIG99LEkucHJvdG90eXBlLmdldEluc3RhbmNlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBZ2VudERhdGEoKS5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlSWQubWF0Y2goL2luc3RhbmNlXC8oWzAtOWEtZkEtRnwtXSspXC8vKVsxXX0sSS5wcm90b3R5cGUuZ2V0QVdTQWNjb3VudElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QWdlbnREYXRhKCkuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5yb3V0aW5nUHJvZmlsZUlkLm1hdGNoKC86KFswLTldKyk6aW5zdGFuY2UvKVsxXX0sSS5wcm90b3R5cGUuX2RpZmZDb250YWN0cz1mdW5jdGlvbihlKXt2YXIgbj17YWRkZWQ6e30scmVtb3ZlZDp7fSxjb21tb246e30sb2xkTWFwOnQuaW5kZXgobnVsbD09ZT9bXTplLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSksbmV3TWFwOnQuaW5kZXgodGhpcy5hZ2VudERhdGEuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxlbmRUaW1lOjB9O3JldHVybiB0LmtleXMobi5vbGRNYXApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY29udGFpbnMobi5uZXdNYXAsZSk/bi5jb21tb25bZV09bi5uZXdNYXBbZV06bi5yZW1vdmVkW2VdPW4ub2xkTWFwW2VdfSkpLHQua2V5cyhuLm5ld01hcCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jb250YWlucyhuLm9sZE1hcCxlKXx8KG4uYWRkZWRbZV09bi5uZXdNYXBbZV0pfSkpLG4uZW5kVGltZT1wZXJmb3JtYW5jZS5ub3coKSxufSxJLnByb3RvdHlwZS5fZmlyZUFnZW50VXBkYXRlRXZlbnRzPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMscj1udWxsLG89bnVsbD09ZT90LkFnZW50QXZhaWxTdGF0ZXMuSU5JVDplLnNuYXBzaG90LnN0YXRlLm5hbWUsaT10aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5zdGF0ZS5uYW1lLHM9bnVsbD09ZT90LkFnZW50U3RhdGVUeXBlLklOSVQ6ZS5zbmFwc2hvdC5zdGF0ZS50eXBlLGE9dGhpcy5hZ2VudERhdGEuc25hcHNob3Quc3RhdGUudHlwZTtzIT09YSYmdC5jb3JlLmdldEFnZW50Um91dGluZ0V2ZW50R3JhcGgoKS5nZXRBc3NvY2lhdGlvbnModGhpcyxzLGEpLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uYnVzLnRyaWdnZXIoZSxuZXcgdC5BZ2VudCl9KSksbyE9PWkmJih0aGlzLmJ1cy50cmlnZ2VyKHQuQWdlbnRFdmVudHMuU1RBVEVfQ0hBTkdFLHthZ2VudDpuZXcgdC5BZ2VudCxvbGRTdGF0ZTpvLG5ld1N0YXRlOml9KSx0LmNvcmUuZ2V0QWdlbnRTdGF0ZUV2ZW50R3JhcGgoKS5nZXRBc3NvY2lhdGlvbnModGhpcyxvLGkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uYnVzLnRyaWdnZXIoZSxuZXcgdC5BZ2VudCl9KSkpO3ZhciBjPWUmJmUuc25hcHNob3QubmV4dFN0YXRlP2Uuc25hcHNob3QubmV4dFN0YXRlLm5hbWU6bnVsbCx1PXRoaXMuYWdlbnREYXRhLnNuYXBzaG90Lm5leHRTdGF0ZT90aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5uZXh0U3RhdGUubmFtZTpudWxsO2MhPT11JiZ1JiZuLmJ1cy50cmlnZ2VyKHQuQWdlbnRFdmVudHMuRU5RVUVVRURfTkVYVF9TVEFURSxuZXcgdC5BZ2VudCk7Y29uc3QgbD1wZXJmb3JtYW5jZS5ub3coKTtyPW51bGwhPT1lP3RoaXMuX2RpZmZDb250YWN0cyhlKTp7YWRkZWQ6dC5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLHJlbW92ZWQ6e30sY29tbW9uOnt9LG9sZE1hcDp7fSxuZXdNYXA6dC5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLGVuZFRpbWU6cGVyZm9ybWFuY2Uubm93KCl9O2NvbnN0IHA9cGVyZm9ybWFuY2Uubm93KCk7dC52YWx1ZXMoci5hZGRlZCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcih0LkNvbnRhY3RFdmVudHMuSU5JVCxuZXcgdC5Db250YWN0KGUuY29udGFjdElkKSksbi5fZmlyZUNvbnRhY3RVcGRhdGVFdmVudHMoZS5jb250YWN0SWQsdC5Db250YWN0U3RhdGVUeXBlLklOSVQsZS5zdGF0ZS50eXBlKX0pKSx0LnZhbHVlcyhyLnJlbW92ZWQpLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uYnVzLnRyaWdnZXIodC5Db250YWN0RXZlbnRzLkRFU1RST1lFRCxuZXcgdC5Db250YWN0U25hcHNob3QoZSkpLG4uYnVzLnRyaWdnZXIodC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkRFU1RST1lFRCxlLmNvbnRhY3RJZCksbmV3IHQuQ29udGFjdFNuYXBzaG90KGUpKSxuLl91bnN1YkFsbENvbnRhY3RFdmVudHNGb3JDb250YWN0KGUuY29udGFjdElkKX0pKSx0LmtleXMoci5jb21tb24pLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uX2ZpcmVDb250YWN0VXBkYXRlRXZlbnRzKGUsci5vbGRNYXBbZV0uc3RhdGUudHlwZSxyLm5ld01hcFtlXS5zdGF0ZS50eXBlKX0pKTtjb25zdCBkPXBlcmZvcm1hbmNlLm5vdygpLGg9e0NvbnRlbnRMZW5ndGhJbkJ5dGVzOnQuY29yZS5fY2FsY3VsYXRlU25hcHNob3RTaXppbmdCdWNrZXQodGhpcy5hZ2VudERhdGEuc25hcHNob3QpLElzQ0NQTGF5ZXI6dC5pc0NDUCgpfTt0cnl7QSgiU25hcHNob3RDb21wYXJpc29uU3RlcFRpbWUiLHIuZW5kVGltZS1sLGgpLEEoIlNuYXBzaG90RXZlbnRUcmlnZ2VyU3RlcFRpbWUiLGQtcCxoKSxBKCJTbmFwc2hvdFRvdGFsUHJvY2Vzc2luZ1RpbWUiLGQtbCxoKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbTWV0cmljc10gRmFpbGVkIHRvIHNlbmQgbWV0cmljcy4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fTtsZXQgQT0oZSxuLHIpPT57dC5wdWJsaXNoTWV0cmljKHtuYW1lOmUsZGF0YTp7bGF0ZW5jeTpuLG9wdGlvbmFsRGltZW5zaW9uczpyfX0pfTt0LmNvcmUuX2NhbGN1bGF0ZVNuYXBzaG90U2l6aW5nQnVja2V0PWZ1bmN0aW9uKGUpe2lmKGUmJmUuaGFzT3duUHJvcGVydHkoImNvbnRlbnRMZW5ndGgiKSl7Y29uc3QgdD1wYXJzZUludChlLmNvbnRlbnRMZW5ndGgpO2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKHApKXtjb25zdFtuLHJdPXBbZV07aWYodD49biYmdDw9cilyZXR1cm4gZX19cmV0dXJuInVuZGVmaW5lZCJ9LEkucHJvdG90eXBlLl9maXJlQ29udGFjdFVwZGF0ZUV2ZW50cz1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcztuIT09ciYmdC5jb3JlLmdldENvbnRhY3RFdmVudEdyYXBoKCkuZ2V0QXNzb2NpYXRpb25zKHRoaXMsbixyKS5mb3JFYWNoKChmdW5jdGlvbihuKXtvLmJ1cy50cmlnZ2VyKG4sbmV3IHQuQ29udGFjdChlKSksby5idXMudHJpZ2dlcih0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZShuLGUpLG5ldyB0LkNvbnRhY3QoZSkpfSkpLG8uYnVzLnRyaWdnZXIodC5Db250YWN0RXZlbnRzLlJFRlJFU0gsbmV3IHQuQ29udGFjdChlKSksby5idXMudHJpZ2dlcih0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCxlKSxuZXcgdC5Db250YWN0KGUpKX0sSS5wcm90b3R5cGUuX3Vuc3ViQWxsQ29udGFjdEV2ZW50c0ZvckNvbnRhY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LnZhbHVlcyh0LkNvbnRhY3RFdmVudHMpLmZvckVhY2goKGZ1bmN0aW9uKHIpe24uYnVzLmdldFN1YnNjcmlwdGlvbnModC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUocixlKSkubWFwKChmdW5jdGlvbihlKXtlLnVuc3Vic2NyaWJlKCl9KSl9KSl9LHQuY29yZS5vblZpZXdDb250YWN0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db250YWN0RXZlbnRzLlZJRVcsZSl9LHQuY29yZS52aWV3Q29udGFjdD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbnRhY3RFdmVudHMuVklFVyxkYXRhOntjb250YWN0SWQ6ZX19KX0sdC5jb3JlLm9uQWN0aXZhdGVDaGFubmVsV2l0aFZpZXdUeXBlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5DaGFubmVsVmlld0V2ZW50cy5BQ1RJVkFURV9DSEFOTkVMX1dJVEhfVklFV19UWVBFLGUpfSx0LmNvcmUuYWN0aXZhdGVDaGFubmVsV2l0aFZpZXdUeXBlPWZ1bmN0aW9uKGUsbixyLG8pe2NvbnN0IGk9e3ZpZXdUeXBlOmUsbWVkaWFUeXBlOm59O3ImJihpLnNvdXJjZT1yKSxvJiYoaS5jYXNlSWQ9byksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5DaGFubmVsVmlld0V2ZW50cy5BQ1RJVkFURV9DSEFOTkVMX1dJVEhfVklFV19UWVBFLGRhdGE6aX0pfSx0LmNvcmUudHJpZ2dlclRhc2tDcmVhdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnVwc3RyZWFtQnVzLnRyaWdnZXIodC5UYXNrRXZlbnRzLkNSRUFURUQsZSl9LHQuY29yZS5vbkFjY2Vzc0RlbmllZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDQ0VTU19ERU5JRUQsZSl9LHQuY29yZS5vbkF1dGhGYWlsPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQVVUSF9GQUlMLGUpfSx0LmNvcmUub25BdXRob3JpemVTdWNjZXNzPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQVVUSE9SSVpFX1NVQ0NFU1MsZSl9LHQuY29yZS5faGFuZGxlQXV0aG9yaXplU3VjY2Vzcz1mdW5jdGlvbigpe3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCwwKX0sdC5jb3JlLl9oYW5kbGVBdXRoRmFpbD1mdW5jdGlvbihlLG4scil7ciYmci5hdXRob3JpemU/dC5jb3JlLl9oYW5kbGVBdXRob3JpemVGYWlsKGUpOnQuY29yZS5faGFuZGxlQ1RJQXV0aEZhaWwobil9LHQuY29yZS5faGFuZGxlQXV0aG9yaXplRmFpbD1mdW5jdGlvbihlKXtsZXQgbj10LmNvcmUuX2dldEF1dGhSZXRyeUNvdW50KCk7aWYoIXQuY29yZS5hdXRob3JpemVUaW1lb3V0SWQpaWYobjx0LmNvcmUuTUFYX0FVVEhPUklaRV9SRVRSWV9DT1VOVF9GT1JfU0VTU0lPTil7dC5jb3JlLl9pbmNyZW1lbnRBdXRoUmV0cnlDb3VudCgpO2xldCByPUFXUy51dGlsLmNhbGN1bGF0ZVJldHJ5RGVsYXkobisxfHwwLHtiYXNlOjJlM30pO3QuY29yZS5hdXRob3JpemVUaW1lb3V0SWQ9c2V0VGltZW91dCgoKCk9Pnt0LmNvcmUuX3JlZGlyZWN0VG9Mb2dpbihlKX0pLHIpfWVsc2UgdC5nZXRMb2coKS53YXJuKCJXZSBoYXZlIGV4aGF1c3RlZCBvdXIgYXV0aG9yaXphdGlvbiByZXRyaWVzIGR1ZSB0byA0MDFzIGZyb20gdGhlIGF1dGhvcml6ZSBhcGkuIE5vIG1vcmUgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZCBpbiB0aGlzIHNlc3Npb24gdW50aWwgdGhlIGF1dGhvcml6ZSBhcGkgcmV0dXJucyAyMDAuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkFVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCl9LHQuY29yZS5fcmVkaXJlY3RUb0xvZ2luPWZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZT9sb2NhdGlvbi5hc3NpZ24oZSk6bG9jYXRpb24ucmVsb2FkKCl9LHQuY29yZS5faGFuZGxlQ1RJQXV0aEZhaWw9ZnVuY3Rpb24oZSl7aWYoIXQuY29yZS5jdGlUaW1lb3V0SWQpaWYodC5jb3JlLmN0aUF1dGhSZXRyeUNvdW50PHQuY29yZS5NQVhfQ1RJX0FVVEhfUkVUUllfQ09VTlQpe3QuY29yZS5jdGlBdXRoUmV0cnlDb3VudCsrO2xldCBuPUFXUy51dGlsLmNhbGN1bGF0ZVJldHJ5RGVsYXkodC5jb3JlLmN0aUF1dGhSZXRyeUNvdW50fHwwLHtiYXNlOjUwMH0pO3QuY29yZS5jdGlUaW1lb3V0SWQ9c2V0VGltZW91dCgoKCk9Pnt0LmNvcmUuYXV0aG9yaXplKGUpLnRoZW4odC5jb3JlLl90cmlnZ2VyQXV0aG9yaXplU3VjY2Vzcy5iaW5kKHQuY29yZSkpLmNhdGNoKHQuY29yZS5fdHJpZ2dlckF1dGhGYWlsLmJpbmQodC5jb3JlLHthdXRob3JpemU6ITB9KSksdC5jb3JlLmN0aVRpbWVvdXRJZD1udWxsfSksbil9ZWxzZSB0LmdldExvZygpLndhcm4oIldlIGhhdmUgZXhoYXVzdGVkIG91ciBhdXRob3JpemF0aW9uIHJldHJpZXMgZHVlIHRvIDQwMXMgZnJvbSB0aGUgQ1RJIHNlcnZpY2UuIE5vIG1vcmUgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZCB1bnRpbCB0aGUgcGFnZSBpcyByZWZyZXNoZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkNUSV9BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQpfSx0LmNvcmUuX3RyaWdnZXJBdXRob3JpemVTdWNjZXNzPWZ1bmN0aW9uKCl7dC5jb3JlLmdldFVwc3RyZWFtKCkudXBzdHJlYW1CdXMudHJpZ2dlcih0LkV2ZW50VHlwZS5BVVRIT1JJWkVfU1VDQ0VTUyl9LHQuY29yZS5fdHJpZ2dlckF1dGhGYWlsPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnVwc3RyZWFtQnVzLnRyaWdnZXIodC5FdmVudFR5cGUuQVVUSF9GQUlMLGUpfSx0LmNvcmUuX2dldEF1dGhSZXRyeUNvdW50PWZ1bmN0aW9uKCl7bGV0IGU9d2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5UKTtpZihudWxsIT09ZSl7aWYoaXNOYU4ocGFyc2VJbnQoZSkpKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBzZXNzaW9uIHN0b3JhZ2UgdmFsdWUgZm9yIGF1dGggcmV0cnkgY291bnQgd2FzIE5hTiIpO3JldHVybiBwYXJzZUludChlKX1yZXR1cm4gd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5ULDApLDB9LHQuY29yZS5faW5jcmVtZW50QXV0aFJldHJ5Q291bnQ9ZnVuY3Rpb24oKXt3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQsKHQuY29yZS5fZ2V0QXV0aFJldHJ5Q291bnQoKSsxKS50b1N0cmluZygpKX0sdC5jb3JlLm9uQXV0aG9yaXplUmV0cmllc0V4aGF1c3RlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVELGUpfSx0LmNvcmUub25DVElBdXRob3JpemVSZXRyaWVzRXhoYXVzdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DVElfQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVELGUpfSx0LmNvcmUub25Tb2Z0cGhvbmVTZXNzaW9uSW5pdD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29ubmVjdGlvbkV2ZW50cy5TRVNTSU9OX0lOSVQsZSl9LHQuY29yZS5vbkNvbmZpZ3VyZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5DT05GSUdVUkUsZSl9LHQuY29yZS5vbkluaXRpYWxpemVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5JTklULGUpfSx0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZT1mdW5jdGlvbihlLG4pe2lmKHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiY29udGFjdElkIiksIXQuY29udGFpbnModC52YWx1ZXModC5Db250YWN0RXZlbnRzKSxlKSl0aHJvdyBuZXcgdC5WYWx1ZUVycm9yKCIlcyBpcyBub3QgYSB2YWxpZCBjb250YWN0IGV2ZW50LiIsZSk7cmV0dXJuIHQuc3ByaW50ZigiJXM6OiVzIixlLG4pfSx0LmNvcmUuZ2V0RXZlbnRCdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmV2ZW50QnVzfSx0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUud2ViU29ja2V0UHJvdmlkZXJ9LHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXJ9LHQuY29yZS5nZXRMb2NhbFRpbWVzdGFtcD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBZ2VudERhdGEoKS5zbmFwc2hvdC5sb2NhbFRpbWVzdGFtcH0sdC5jb3JlLmdldFNrZXc9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QWdlbnREYXRhKCkuc25hcHNob3Quc2tld30sdC5jb3JlLmdldEFnZW50Um91dGluZ0V2ZW50R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmFnZW50Um91dGluZ0V2ZW50R3JhcGh9LHQuY29yZS5hZ2VudFJvdXRpbmdFdmVudEdyYXBoPShuZXcgdC5FdmVudEdyYXBoKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRTdGF0ZVR5cGUuUk9VVEFCTEUsdC5BZ2VudEV2ZW50cy5ST1VUQUJMRSkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkFnZW50U3RhdGVUeXBlLk5PVF9ST1VUQUJMRSx0LkFnZW50RXZlbnRzLk5PVF9ST1VUQUJMRSkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkFnZW50U3RhdGVUeXBlLk9GRkxJTkUsdC5BZ2VudEV2ZW50cy5PRkZMSU5FKSx0LmNvcmUuZ2V0QWdlbnRTdGF0ZUV2ZW50R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmFnZW50U3RhdGVFdmVudEdyYXBofSx0LmNvcmUuYWdlbnRTdGF0ZUV2ZW50R3JhcGg9KG5ldyB0LkV2ZW50R3JhcGgpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC52YWx1ZXModC5BZ2VudEVycm9yU3RhdGVzKSx0LkFnZW50RXZlbnRzLkVSUk9SKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRBdmFpbFN0YXRlcy5BRlRFUl9DQUxMX1dPUkssdC5BZ2VudEV2ZW50cy5BQ1cpLHQuY29yZS5nZXRDb250YWN0RXZlbnRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuY29udGFjdEV2ZW50R3JhcGh9LHQuY29yZS5jb250YWN0RXZlbnRHcmFwaD0obmV3IHQuRXZlbnRHcmFwaCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuSU5DT01JTkcsdC5Db250YWN0RXZlbnRzLklOQ09NSU5HKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5QRU5ESU5HLHQuQ29udGFjdEV2ZW50cy5QRU5ESU5HKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29udGFjdEV2ZW50cy5DT05ORUNUSU5HKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNURUQsdC5Db250YWN0RXZlbnRzLkNPTk5FQ1RFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db250YWN0U3RhdGVUeXBlLkVSUk9SLHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5JTkNPTUlORyx0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuRU5ERUQsdC5Db250YWN0RXZlbnRzLkFDVykuYXNzb2ModC52YWx1ZXModC5DT05UQUNUX0FDVElWRV9TVEFURVMpLHQudmFsdWVzKHQucmVsYXRpdmVDb21wbGVtZW50KHQuQ09OVEFDVF9BQ1RJVkVfU1RBVEVTLHQuQ29udGFjdFN0YXRlVHlwZSkpLHQuQ29udGFjdEV2ZW50cy5FTkRFRCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IsdC5Db250YWN0RXZlbnRzLkVSUk9SKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbnRhY3RTdGF0ZVR5cGUuTUlTU0VELHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLHQuY29yZS5nZXRDbGllbnQ9ZnVuY3Rpb24oKXtpZighdC5jb3JlLmNsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBjb3JlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLmNsaWVudH0sdC5jb3JlLmNsaWVudD1udWxsLHQuY29yZS5nZXRBZ2VudEFwcENsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUuYWdlbnRBcHBDbGllbnQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGNvbm5lY3QgQWdlbnRBcHAgQ2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLmFnZW50QXBwQ2xpZW50fSx0LmNvcmUuYWdlbnRBcHBDbGllbnQ9bnVsbCx0LmNvcmUuZ2V0VGFza1RlbXBsYXRlc0NsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBUYXNrVGVtcGxhdGVzIENsaWVudCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50fSx0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudD1udWxsLHQuY29yZS5nZXRNYXN0ZXJDbGllbnQ9ZnVuY3Rpb24oKXtpZighdC5jb3JlLm1hc3RlckNsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBtYXN0ZXIgY2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLm1hc3RlckNsaWVudH0sdC5jb3JlLm1hc3RlckNsaWVudD1udWxsLHQuY29yZS5nZXRTb2Z0cGhvbmVNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyfSx0LmNvcmUuc29mdHBob25lTWFuYWdlcj1udWxsLHQuY29yZS5nZXROb3RpZmljYXRpb25NYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5ub3RpZmljYXRpb25NYW5hZ2VyfHwodC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXI9bmV3IHQuTm90aWZpY2F0aW9uTWFuYWdlciksdC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXJ9LHQuY29yZS5ub3RpZmljYXRpb25NYW5hZ2VyPW51bGwsdC5jb3JlLmdldFBvcHVwTWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUucG9wdXBNYW5hZ2VyfSx0LmNvcmUucG9wdXBNYW5hZ2VyPW5ldyB0LlBvcHVwTWFuYWdlcix0LmNvcmUuZ2V0VXBzdHJlYW09ZnVuY3Rpb24oKXtpZighdC5jb3JlLnVwc3RyZWFtKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZXJlIGlzIG5vIHVwc3RyZWFtIGNvbmR1aXQhIik7cmV0dXJuIHQuY29yZS51cHN0cmVhbX0sdC5jb3JlLnVwc3RyZWFtPW51bGwsdC5jb3JlLkFnZW50RGF0YVByb3ZpZGVyPUl9KCl9LDU5MjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10O3ZhciBuPSI8PGFsbD4+IixyPXQubWFrZUVudW0oWyJhY2tub3dsZWRnZSIsImFja190aW1lb3V0IiwiaW5pdCIsImFwaV9yZXF1ZXN0IiwiYXBpX3Jlc3BvbnNlIiwiYXV0aF9mYWlsIiwiYWNjZXNzX2RlbmllZCIsImNsb3NlIiwiY29uZmlndXJlIiwibG9nIiwibWFzdGVyX3JlcXVlc3QiLCJtYXN0ZXJfcmVzcG9uc2UiLCJzeW5jaHJvbml6ZSIsInRlcm1pbmF0ZSIsInRlcm1pbmF0ZWQiLCJzZW5kX2xvZ3MiLCJyZWxvYWRfYWdlbnRfY29uZmlndXJhdGlvbiIsImJyb2FkY2FzdCIsImFwaV9tZXRyaWMiLCJjbGllbnRfbWV0cmljIiwic29mdHBob25lX3N0YXRzIiwic29mdHBob25lX3JlcG9ydCIsImNsaWVudF9zaWRlX2xvZ3MiLCJzZXJ2ZXJfYm91bmRfaW50ZXJuYWxfbG9nIiwibXV0ZSIsImlmcmFtZV9zdHlsZSIsImlmcmFtZV9yZXRyaWVzX2V4aGF1c3RlZCIsInVwZGF0ZV9jb25uZWN0ZWRfY2NwcyIsIm91dGVyX2NvbnRleHRfaW5mbyIsIm1lZGlhX2RldmljZV9yZXF1ZXN0IiwibWVkaWFfZGV2aWNlX3Jlc3BvbnNlIiwidGFiX2lkIiwiYXV0aG9yaXplX3N1Y2Nlc3MiLCJhdXRob3JpemVfcmV0cmllc19leGhhdXN0ZWQiLCJjdGlfYXV0aG9yaXplX3JldHJpZXNfZXhoYXVzdGVkIiwiY2xpY2tfc3RyZWFtX2RhdGEiXSksbz10Lm1ha2VOYW1lc3BhY2VkRW51bSgiY29ubmVjdCIsWyJsb2dpblBvcHVwIiwic2VuZExvZ3MiLCJzb2Z0cGhvbmUiLCJyaW5ndG9uZSIsIm1ldHJpY3MiLCJmYWlsb3ZlciJdKSxpPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJhZ2VudCIsWyJpbml0IiwidXBkYXRlIiwicmVmcmVzaCIsInJvdXRhYmxlIiwibm90X3JvdXRhYmxlIiwicGVuZGluZyIsImNvbnRhY3RfcGVuZGluZyIsIm9mZmxpbmUiLCJlcnJvciIsInNvZnRwaG9uZV9lcnJvciIsIndlYnNvY2tldF9jb25uZWN0aW9uX2xvc3QiLCJ3ZWJzb2NrZXRfY29ubmVjdGlvbl9nYWluZWQiLCJzdGF0ZV9jaGFuZ2UiLCJhY3ciLCJtdXRlX3RvZ2dsZSIsImxvY2FsX21lZGlhX3N0cmVhbV9jcmVhdGVkIiwiZW5xdWV1ZWRfbmV4dF9zdGF0ZSJdKSxzPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJ3ZWJTb2NrZXQiLFsiaW5pdF9mYWlsdXJlIiwiY29ubmVjdGlvbl9vcGVuIiwiY29ubmVjdGlvbl9jbG9zZSIsImNvbm5lY3Rpb25fZXJyb3IiLCJjb25uZWN0aW9uX2dhaW4iLCJjb25uZWN0aW9uX2xvc3QiLCJzdWJzY3JpcHRpb25fdXBkYXRlIiwic3Vic2NyaXB0aW9uX2ZhaWx1cmUiLCJhbGxfbWVzc2FnZSIsInNlbmQiLCJzdWJzY3JpYmUiXSksYT10Lm1ha2VOYW1lc3BhY2VkRW51bSgiY29udGFjdCIsWyJpbml0IiwicmVmcmVzaCIsImRlc3Ryb3llZCIsImluY29taW5nIiwicGVuZGluZyIsImNvbm5lY3RpbmciLCJjb25uZWN0ZWQiLCJtaXNzZWQiLCJhY3ciLCJ2aWV3IiwiZW5kZWQiLCJlcnJvciIsImFjY2VwdGVkIl0pLGM9dC5tYWtlTmFtZXNwYWNlZEVudW0oInRhc2tMaXN0IixbImFjdGl2YXRlX2NoYW5uZWxfd2l0aF92aWV3X3R5cGUiXSksdT10Lm1ha2VOYW1lc3BhY2VkRW51bSgidGFzayIsWyJjcmVhdGVkIl0pLGw9dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbm5lY3Rpb24iLFsic2Vzc2lvbl9pbml0IiwicmVhZHlfdG9fc3RhcnRfc2Vzc2lvbiJdKSxwPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb25maWd1cmF0aW9uIixbImNvbmZpZ3VyZSIsInNldF9zcGVha2VyX2RldmljZSIsInNldF9taWNyb3Bob25lX2RldmljZSIsInNldF9yaW5nZXJfZGV2aWNlIiwic3BlYWtlcl9kZXZpY2VfY2hhbmdlZCIsIm1pY3JvcGhvbmVfZGV2aWNlX2NoYW5nZWQiLCJyaW5nZXJfZGV2aWNlX2NoYW5nZWQiXSksZD10Lm1ha2VOYW1lc3BhY2VkRW51bSgiZGlzYXN0ZXJSZWNvdmVyeSIsWyJzdXBwcmVzcyIsImZvcmNlX29mZmxpbmUiLCJzZXRfb2ZmbGluZSIsImluaXRfZGlzYXN0ZXJfcmVjb3ZlcnkiLCJmYWlsb3ZlciIsImZhaWxvdmVyX3BlbmRpbmciLCJpbml0X2RyX3BvbGxpbmciXSksaD10Lm1ha2VOYW1lc3BhY2VkRW51bSgidm9pY2VJZCIsWyJ1cGRhdGVfZG9tYWluX2lkIl0pLGY9ZnVuY3Rpb24oKXt9O2YuY3JlYXRlUmVxdWVzdD1mdW5jdGlvbihlLG4scil7cmV0dXJue2V2ZW50OmUscmVxdWVzdElkOnQucmFuZG9tSWQoKSxtZXRob2Q6bixwYXJhbXM6cn19LGYuY3JlYXRlUmVzcG9uc2U9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJue2V2ZW50OmUscmVxdWVzdElkOnQucmVxdWVzdElkLGRhdGE6bixlcnI6cnx8bnVsbH19O3ZhciBnPWZ1bmN0aW9uKGUsbixyKXt0aGlzLnN1Yk1hcD1lLHRoaXMuaWQ9dC5yYW5kb21JZCgpLHRoaXMuZXZlbnROYW1lPW4sdGhpcy5mPXJ9O2cucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dGhpcy5zdWJNYXAudW5zdWJzY3JpYmUodGhpcy5ldmVudE5hbWUsdGhpcy5pZCl9O3ZhciBtPWZ1bmN0aW9uKCl7dGhpcy5zdWJJZE1hcD17fSx0aGlzLnN1YkV2ZW50TmFtZU1hcD17fX07bS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGcodGhpcyxlLHQpO3RoaXMuc3ViSWRNYXBbbi5pZF09bjt2YXIgcj10aGlzLnN1YkV2ZW50TmFtZU1hcFtlXXx8W107cmV0dXJuIHIucHVzaChuKSx0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXT1yLG59LG0ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsbil7dC5jb250YWlucyh0aGlzLnN1YkV2ZW50TmFtZU1hcCxlKSYmKHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdPXRoaXMuc3ViRXZlbnROYW1lTWFwW2VdLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWQhPT1ufSkpLHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdLmxlbmd0aDwxJiZkZWxldGUgdGhpcy5zdWJFdmVudE5hbWVNYXBbZV0pLHQuY29udGFpbnModGhpcy5zdWJJZE1hcCxuKSYmZGVsZXRlIHRoaXMuc3ViSWRNYXBbbl19LG0ucHJvdG90eXBlLmdldEFsbFN1YnNjcmlwdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdC52YWx1ZXModGhpcy5zdWJFdmVudE5hbWVNYXApLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb25jYXQodCl9KSxbXSl9LG0ucHJvdG90eXBlLmdldFN1YnNjcmlwdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdfHxbXX07dmFyIHY9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e307dGhpcy5zdWJNYXA9bmV3IG0sdGhpcy5sb2dFdmVudHM9dC5sb2dFdmVudHN8fCExfTt2LnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLnN1Yk1hcC5zdWJzY3JpYmUoZSxuKX0sdi5wcm90b3R5cGUuc3Vic2NyaWJlQWxsPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24oZSksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5zdWJNYXAuc3Vic2NyaWJlKG4sZSl9LHYucHJvdG90eXBlLmdldFN1YnNjcmlwdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3ViTWFwLmdldFN1YnNjcmlwdGlvbnMoZSl9LHYucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24oZSxyKXt0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIik7dmFyIG89dGhpcyxpPXRoaXMuc3ViTWFwLmdldFN1YnNjcmlwdGlvbnMobikscz10aGlzLnN1Yk1hcC5nZXRTdWJzY3JpcHRpb25zKGUpO3RoaXMubG9nRXZlbnRzJiZlIT09dC5FdmVudFR5cGUuTE9HJiZlIT09dC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFJiZlIT09dC5FdmVudFR5cGUuQVBJX01FVFJJQyYmZSE9PXQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0cmJnQuZ2V0TG9nKCkudHJhY2UoIlB1Ymxpc2hpbmcgZXZlbnQ6ICVzIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuc3RhcnRzV2l0aCh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQpJiZyJiZyLmNvbnRhY3RJZCYmIShyIGluc3RhbmNlb2YgdC5Db250YWN0KSYmKHI9bmV3IHQuQ29udGFjdChyLmNvbnRhY3RJZCkpLGkuY29uY2F0KHMpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3RyeXtuLmYocnx8bnVsbCxlLG8pfWNhdGNoKG4pe3QuZ2V0TG9nKCkuZXJyb3IoIiclcycgZXZlbnQgaGFuZGxlciBmYWlsZWQuIixlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpfSx2LnByb3RvdHlwZS5icmlkZ2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0LG4pe2UudHJpZ2dlcihuLHQpfX0sdi5wcm90b3R5cGUudW5zdWJzY3JpYmVBbGw9ZnVuY3Rpb24oKXt0aGlzLnN1Yk1hcC5nZXRBbGxTdWJzY3JpcHRpb25zKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS51bnN1YnNjcmliZSgpfSkpfSx0LkV2ZW50QnVzPXYsdC5FdmVudEZhY3Rvcnk9Zix0LkV2ZW50VHlwZT1yLHQuQWdlbnRFdmVudHM9aSx0LkNvbmZpZ3VyYXRpb25FdmVudHM9cCx0LkNvbm5lY3Rpb25FdmVudHM9bCx0LkNvbm5uZWN0aW9uRXZlbnRzPWwsdC5Db250YWN0RXZlbnRzPWEsdC5DaGFubmVsVmlld0V2ZW50cz1jLHQuVGFza0V2ZW50cz11LHQuVm9pY2VJZEV2ZW50cz1oLHQuV2ViU29ja2V0RXZlbnRzPXMsdC5NYXN0ZXJUb3BpY3M9byx0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHM9ZH0oKX0sMjg2OigpPT57IWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBvPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxyKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKGUsdCl7aWYoMSZ0JiYoZT1uKGUpKSw4JnQpcmV0dXJuIGU7aWYoNCZ0JiYib2JqZWN0Ij09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZX0pLDImdCYmInN0cmluZyIhPXR5cGVvZiBlKWZvcih2YXIgbyBpbiBlKW4uZChyLG8sZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gbi5kKHQsImEiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPSIiLG4obi5zPTIpfShbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpLG89IkRFQlVHIixpPSJBTVpfV0VCX1NPQ0tFVF9NQU5BR0VSOiIscz0iTmV0d29yayBvZmZsaW5lIixhPSJOZXR3b3JrIG9ubGluZSwgY29ubmVjdGluZyB0byBXZWJTb2NrZXQgc2VydmVyIixjPSJOZXR3b3JrIG9mZmxpbmUsIGlnbm9yaW5nIHRoaXMgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0Iix1PSJIZWFydGJlYXQgcmVzcG9uc2Ugbm90IHJlY2VpdmVkIixsPSJGYWlsZWQgdG8gc2VuZCBoZWFydGJlYXQgc2luY2UgV2ViU29ja2V0IGlzIG5vdCBvcGVuIixwPSJXZWJTb2NrZXQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCEiLGQ9IldlYlNvY2tldCBjb25uZWN0aW9uIGlzIGNsb3NlZCIsaD0iV2ViU29ja2V0TWFuYWdlciBFcnJvciwgZXJyb3JfZXZlbnQ6ICIsZj0iU2NoZWR1bGluZyBXZWJTb2NrZXQgcmVpbml0aWFsaXphdGlvbiwgYWZ0ZXIgZGVsYXkgIixnPSJXZWJTb2NrZXQgVVJMIGNhbm5vdCBiZSB1c2VkIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIixtPSJXZWJTb2NrZXQgSW5pdGlhbGl6YXRpb24gZmFpbGVkIC0gVGVybWluYXRpbmcgYW5kIGNsZWFuaW5nIHN1YnNjcmlwdGlvbnMiLHY9IkZldGNoaW5nIG5ldyBXZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIix5PSJTdWNjZXNzZnVsbHkgZmV0Y2hlZCB3ZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixFPSJGYWlsZWQgdG8gZmV0Y2ggd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIsUz0iUmV0cnlpbmcgZmV0Y2hpbmcgbmV3IFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLGI9IkluaXRpYWxpemluZyBXZWJzb2NrZXQgTWFuYWdlciIsVD0iV2ViU29ja2V0TWFuYWdlciBNZXNzYWdlIEVycm9yIixDPSJNZXNzYWdlIHJlY2VpdmVkIGZvciB0b3BpYyAiLEk9IkludmFsaWQgaW5jb21pbmcgbWVzc2FnZSIsQT0iYXdzL3N1YnNjcmliZSIsXz0iYXdzL2hlYXJ0YmVhdCIsdz0iZGlzY29ubmVjdGVkIjtmdW5jdGlvbiBSKGUpe3JldHVybihSPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSkoZSl9dmFyIGs9e2Fzc2VydFRydWU6ZnVuY3Rpb24oZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IodCl9LGFzc2VydE5vdE51bGw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gay5hc3NlcnRUcnVlKG51bGwhPT1lJiZ2b2lkIDAhPT1SKGUpLE9iamVjdChyLnNwcmludGYpKCIlcyBtdXN0IGJlIHByb3ZpZGVkIix0fHwiQSB2YWx1ZSIpKSxlfSxpc05vbkVtcHR5U3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmZS5sZW5ndGg+MH0sYXNzZXJ0SXNMaXN0OmZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBub3QgYW4gYXJyYXkiKX0saXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLmNvbnN0cnVjdG9yJiZlLmNhbGwmJmUuYXBwbHkpfSxpc09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4hKCJvYmplY3QiIT09UihlKXx8bnVsbD09PWUpfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LGlzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX19LEw9bmV3IFJlZ0V4cCgiXih3c3M6Ly8pXFx3KiIpO2sudmFsaWRXU1VybD1mdW5jdGlvbihlKXtyZXR1cm4gTC50ZXN0KGUpfSxrLmdldFN1YnNjcmlwdGlvblJlc3BvbnNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm57dG9waWM6ZSxjb250ZW50OntzdGF0dXM6dD8ic3VjY2VzcyI6ImZhaWx1cmUiLHRvcGljczpufX19LGsuYXNzZXJ0SXNPYmplY3Q9ZnVuY3Rpb24oZSx0KXtpZighay5pc09iamVjdChlKSl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhbiBvYmplY3QhIil9LGsuYWRkSml0dGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxO3Q9TWF0aC5taW4odCwxKTt2YXIgbj1NYXRoLnJhbmRvbSgpPi41PzE6LTE7cmV0dXJuIE1hdGguZmxvb3IoZStuKmUqTWF0aC5yYW5kb20oKSp0KX0say5pc05ldHdvcmtPbmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLm9uTGluZX0say5pc05ldHdvcmtGYWlsdXJlPWZ1bmN0aW9uKGUpe3JldHVybiEoIWUuX2RlYnVnfHwhZS5fZGVidWcudHlwZSkmJiJOZXR3b3JraW5nRXJyb3IiPT09ZS5fZGVidWcudHlwZX07dmFyIE49aztmdW5jdGlvbiBPKGUpe3JldHVybihPPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9KShlKX1mdW5jdGlvbiBEKGUsdCl7cmV0dXJuKEQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihlLHQpe3JldHVybiBlLl9fcHJvdG9fXz10LGV9KShlLHQpfWZ1bmN0aW9uIFAoZSl7cmV0dXJuKFA9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiB4KGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gTShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fWZ1bmN0aW9uIFUoZSx0LG4pe3JldHVybiB0JiZNKGUucHJvdG90eXBlLHQpLG4mJk0oZSxuKSxlfXZhciBGPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3godGhpcyxlKX1yZXR1cm4gVShlLFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbihlKXt9fV0pLGV9KCkscT1pLGo9e0RFQlVHOjEwLElORk86MjAsV0FSTjozMCxFUlJPUjo0MCxBRFZBTkNFRF9MT0c6NTB9LEI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7eCh0aGlzLGUpLHRoaXMudXBkYXRlTG9nZ2VyQ29uZmlnKCksdGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcj1IKCl9cmV0dXJuIFUoZSxbe2tleToid3JpdGVUb0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmhhc0NsaWVudExvZ2dlcigpKXN3aXRjaChlKXtjYXNlIGouREVCVUc6cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5kZWJ1Zyh0KXx8dDtjYXNlIGouSU5GTzpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmluZm8odCl8fHQ7Y2FzZSBqLldBUk46cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci53YXJuKHQpfHx0O2Nhc2Ugai5FUlJPUjpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmVycm9yKHQpfHx0O2Nhc2Ugai5BRFZBTkNFRF9MT0c6cmV0dXJuIHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyP3RoaXMuX2NsaWVudExvZ2dlclt0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcl0odCl8fHQ6IiJ9fX0se2tleToiaXNMZXZlbEVuYWJsZWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLl9sZXZlbH19LHtrZXk6Imhhc0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2NsaWVudExvZ2dlcn19LHtrZXk6ImdldExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcmVmaXh8fHE7cmV0dXJuIHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj09PW8/dGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcjpuZXcgVyh0KX19LHtrZXk6InVwZGF0ZUxvZ2dlckNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e307dGhpcy5fbGV2ZWw9dC5sZXZlbHx8ai5JTkZPLHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyPSJ3YXJuIix0LmFkdmFuY2VkTG9nV3JpdGVyJiYodGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI9dC5hZHZhbmNlZExvZ1dyaXRlciksdC5jdXN0b21pemVkTG9nZ2VyJiYib2JqZWN0Ij09PVAodC5jdXN0b21pemVkTG9nZ2VyKSYmKHRoaXMudXNlQ2xpZW50TG9nZ2VyPSEwKSx0aGlzLl9jbGllbnRMb2dnZXI9dC5sb2dnZXJ8fHRoaXMuc2VsZWN0TG9nZ2VyKHQpLHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj0iTlVMTCIsdC5kZWJ1ZyYmKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj1vKSx0LmxvZ2dlciYmKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj0iQ0xJRU5UX0xPR0dFUiIpfX0se2tleToic2VsZWN0TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5jdXN0b21pemVkTG9nZ2VyJiYib2JqZWN0Ij09PVAoZS5jdXN0b21pemVkTG9nZ2VyKT9lLmN1c3RvbWl6ZWRMb2dnZXI6ZS51c2VEZWZhdWx0TG9nZ2VyPyh0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyPUgoKSx0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyKTpudWxsfX1dKSxlfSgpLFY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7eCh0aGlzLGUpfXJldHVybiBVKGUsW3trZXk6ImRlYnVnIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJlcnJvciIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJhZHZhbmNlZExvZyIsdmFsdWU6ZnVuY3Rpb24oKXt9fV0pLGV9KCksVz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3ZhciBuO3JldHVybiB4KHRoaXMsdCksKG49ZnVuY3Rpb24oZSx0KXtyZXR1cm4hdHx8Im9iamVjdCIhPT1QKHQpJiYiZnVuY3Rpb24iIT10eXBlb2YgdD9mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIGV9KGUpOnR9KHRoaXMsTyh0KS5jYWxsKHRoaXMpKSkucHJlZml4PWV8fHEsbn1yZXR1cm4gZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmRChlLHQpfSh0LFYpLFUodCxbe2tleToiZGVidWciLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhqLkRFQlVHLHQpfX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKGouSU5GTyx0KX19LHtrZXk6Indhcm4iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhqLldBUk4sdCl9fSx7a2V5OiJlcnJvciIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKGouRVJST1IsdCl9fSx7a2V5OiJhZHZhbmNlZExvZyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKGouQURWQU5DRURfTE9HLHQpfX0se2tleToiX3Nob3VsZExvZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHouaGFzQ2xpZW50TG9nZ2VyKCkmJnouaXNMZXZlbEVuYWJsZWQoZSl9fSx7a2V5OiJfd3JpdGVUb0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gei53cml0ZVRvQ2xpZW50TG9nZ2VyKGUsdCl9fSx7a2V5OiJfbG9nIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuX3Nob3VsZExvZyhlKSl7dmFyIG49ei51c2VDbGllbnRMb2dnZXI/dDp0aGlzLl9jb252ZXJ0VG9TaW5nbGVTdGF0ZW1lbnQodCxlKTtyZXR1cm4gdGhpcy5fd3JpdGVUb0NsaWVudExvZ2dlcihlLG4pfX19LHtrZXk6Il9jb252ZXJ0VG9TaW5nbGVTdGF0ZW1lbnQiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxyPXRoaXMuX2dldExvZ0xldmVsQnlWYWx1ZSh0KSxvPSJbIi5jb25jYXQobiwiXVsiKS5jb25jYXQociwiXSIpO3RoaXMucHJlZml4JiYobys9dGhpcy5wcmVmaXgrIiAiKSx0aGlzLm9wdGlvbnMmJih0aGlzLm9wdGlvbnMucHJlZml4P28rPSIgIit0aGlzLm9wdGlvbnMucHJlZml4KyI6IjpvKz0iIix0aGlzLm9wdGlvbnMubG9nTWV0YURhdGE/bys9IiBNZXRhIGRhdGE6ICIrSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLmxvZ01ldGFEYXRhKTpvKz0iIik7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBzPWVbaV07bys9dGhpcy5fY29udmVydFRvU3RyaW5nKHMpKyIgIn1yZXR1cm4gb319LHtrZXk6Il9nZXRMb2dMZXZlbEJ5VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIDEwOnJldHVybiJERUJVRyI7Y2FzZSAyMDpyZXR1cm4iSU5GTyI7Y2FzZSAzMDpyZXR1cm4iV0FSTiI7Y2FzZSA0MDpyZXR1cm4iRVJST1IiO2Nhc2UgNTA6cmV0dXJuIkFEVkFOQ0VEX0xPRyJ9fX0se2tleToiX2NvbnZlcnRUb1N0cmluZyIsdmFsdWU6ZnVuY3Rpb24oZSl7dHJ5e2lmKCFlKXJldHVybiIiO2lmKE4uaXNTdHJpbmcoZSkpcmV0dXJuIGU7aWYoTi5pc09iamVjdChlKSYmTi5pc0Z1bmN0aW9uKGUudG9TdHJpbmcpKXt2YXIgdD1lLnRvU3RyaW5nKCk7aWYoIltvYmplY3QgT2JqZWN0XSIhPT10KXJldHVybiB0fXJldHVybiBKU09OLnN0cmluZ2lmeShlKX1jYXRjaCh0KXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3Igd2hpbGUgY29udmVydGluZyBhcmd1bWVudCB0byBzdHJpbmciLGUsdCksIiJ9fX1dKSx0fSgpLEg9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVjtyZXR1cm4gZS5kZWJ1Zz1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLmRlYnVnLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGUuaW5mbz1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLmluZm8uYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZS53YXJuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUud2Fybi5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlLmVycm9yPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUuZXJyb3IuYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZX0sej1uZXcgQjtmdW5jdGlvbiBHKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19dmFyIEs9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToyZTM7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5udW1BdHRlbXB0cz0wLHRoaXMuZXhlY3V0b3I9dCx0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbj0hMSx0aGlzLmRlZmF1bHRSZXRyeT1ufXZhciB0LG47cmV0dXJuIHQ9ZSwobj1be2tleToicmV0cnkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbnx8KHRoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9uPSEwLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5fZXhlY3V0ZSgpfSksdGhpcy5fZ2V0RGVsYXkoKSkpfX0se2tleToiX2V4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb249ITEsdGhpcy5leGVjdXRvcigpLHRoaXMubnVtQXR0ZW1wdHMrK319LHtrZXk6ImNvbm5lY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm51bUF0dGVtcHRzPTB9fSx7a2V5OiJfZ2V0RGVsYXkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9TWF0aC5wb3coMix0aGlzLm51bUF0dGVtcHRzKSp0aGlzLmRlZmF1bHRSZXRyeTtyZXR1cm4gZTw9M2U0P2U6M2U0fX0se2tleToiZ2V0SXNDb25uZWN0ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubnVtQXR0ZW1wdHN9fV0pJiZHKHQucHJvdG90eXBlLG4pLGV9KCk7bi5kKHQsImEiLChmdW5jdGlvbigpe3JldHVybiBZfSkpO3ZhciBYPWZ1bmN0aW9uKCl7dmFyIGU9ei5nZXRMb2dnZXIoe3ByZWZpeDppfSksdD1OLmlzTmV0d29ya09ubGluZSgpLG49e3ByaW1hcnk6bnVsbCxzZWNvbmRhcnk6bnVsbH0scj17cmVjb25uZWN0V2ViU29ja2V0OiEwLHdlYnNvY2tldEluaXRGYWlsZWQ6ITEsZXhwb25lbnRpYWxCYWNrT2ZmVGltZToxZTMsZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlOm51bGwsbGlmZVRpbWVUaW1lb3V0SGFuZGxlOm51bGwsd2ViU29ja2V0SW5pdENoZWNrZXJUaW1lb3V0SWQ6bnVsbCxjb25uU3RhdGU6bnVsbH0sbz17Y29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ6MCxjb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZTpudWxsLG5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wOm51bGx9LFI9e3BlbmRpbmdSZXNwb25zZTohMSxpbnRlcnZhbEhhbmRsZTpudWxsfSxrPXtpbml0RmFpbHVyZTpuZXcgU2V0LGdldFdlYlNvY2tldFRyYW5zcG9ydDpudWxsLHN1YnNjcmlwdGlvblVwZGF0ZTpuZXcgU2V0LHN1YnNjcmlwdGlvbkZhaWx1cmU6bmV3IFNldCx0b3BpYzpuZXcgTWFwLGFsbE1lc3NhZ2U6bmV3IFNldCxjb25uZWN0aW9uR2FpbjpuZXcgU2V0LGNvbm5lY3Rpb25Mb3N0Om5ldyBTZXQsY29ubmVjdGlvbk9wZW46bmV3IFNldCxjb25uZWN0aW9uQ2xvc2U6bmV3IFNldH0sTD17Y29ubkNvbmZpZzpudWxsLHByb21pc2VIYW5kbGU6bnVsbCxwcm9taXNlQ29tcGxldGVkOiEwfSxPPXtzdWJzY3JpYmVkOm5ldyBTZXQscGVuZGluZzpuZXcgU2V0LHN1YnNjcmlwdGlvbkhpc3Rvcnk6bmV3IFNldH0sRD17cmVzcG9uc2VDaGVja0ludGVydmFsSWQ6bnVsbCxyZXF1ZXN0Q29tcGxldGVkOiEwLHJlU3Vic2NyaWJlSW50ZXJ2YWxJZDpudWxsLGNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM6MCxjb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0OjB9LFA9bmV3IEsoKGZ1bmN0aW9uKCl7c2UoKX0pKSx4PW5ldyBTZXQoW0EsImF3cy91bnN1YnNjcmliZSIsX10pLE09c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aWYodCE9PU4uaXNOZXR3b3JrT25saW5lKCkpe2lmKCEodD1OLmlzTmV0d29ya09ubGluZSgpKSlyZXR1cm4gZS5hZHZhbmNlZExvZyhzKSx2b2lkIHVlKGUuaW5mbyhzKSk7dmFyIG49VygpO3QmJighbnx8aihuLFdlYlNvY2tldC5DTE9TSU5HKXx8aihuLFdlYlNvY2tldC5DTE9TRUQpKSYmKGUuYWR2YW5jZWRMb2coYSksdWUoZS5pbmZvKGEpKSxzZSgpKX19KSwyNTApLFU9ZnVuY3Rpb24odCxuKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3RyeXt0KG4pfWNhdGNoKHQpe3VlKGUuZXJyb3IoIkVycm9yIGV4ZWN1dGluZyBjYWxsYmFjayIsdCkpfX0pKX0sRj1mdW5jdGlvbihlKXtpZihudWxsPT09ZSlyZXR1cm4iTlVMTCI7c3dpdGNoKGUucmVhZHlTdGF0ZSl7Y2FzZSBXZWJTb2NrZXQuQ09OTkVDVElORzpyZXR1cm4iQ09OTkVDVElORyI7Y2FzZSBXZWJTb2NrZXQuT1BFTjpyZXR1cm4iT1BFTiI7Y2FzZSBXZWJTb2NrZXQuQ0xPU0lORzpyZXR1cm4iQ0xPU0lORyI7Y2FzZSBXZWJTb2NrZXQuQ0xPU0VEOnJldHVybiJDTE9TRUQiO2RlZmF1bHQ6cmV0dXJuIlVOREVGSU5FRCJ9fSxxPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiO3VlKGUuZGVidWcoIlsiK3QrIl0gUHJpbWFyeSBXZWJTb2NrZXQ6ICIrRihuLnByaW1hcnkpKyIgfCBTZWNvbmRhcnkgV2ViU29ja2V0OiAiK0Yobi5zZWNvbmRhcnkpKSl9LGo9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5yZWFkeVN0YXRlPT09dH0sQj1mdW5jdGlvbihlKXtyZXR1cm4gaihlLFdlYlNvY2tldC5PUEVOKX0sVj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV8fHZvaWQgMD09PWUucmVhZHlTdGF0ZXx8aihlLFdlYlNvY2tldC5DTE9TRUQpfSxXPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT1uLnNlY29uZGFyeT9uLnNlY29uZGFyeTpuLnByaW1hcnl9LEg9ZnVuY3Rpb24oKXtyZXR1cm4gQihXKCkpfSxHPWZ1bmN0aW9uKCl7aWYoUi5wZW5kaW5nUmVzcG9uc2UpcmV0dXJuIGUuYWR2YW5jZWRMb2codSksdWUoZS53YXJuKHUpKSxjbGVhckludGVydmFsKFIuaW50ZXJ2YWxIYW5kbGUpLFIucGVuZGluZ1Jlc3BvbnNlPSExLHZvaWQgc2UoKTtIKCk/KHVlKGUuZGVidWcoIlNlbmRpbmcgaGVhcnRiZWF0IikpLFcoKS5zZW5kKG9lKF8pKSxSLnBlbmRpbmdSZXNwb25zZT0hMCk6KGUuYWR2YW5jZWRMb2cobCksdWUoZS53YXJuKGwpKSxxKCJzZW5kSGVhcnRCZWF0Iiksc2UoKSl9LFg9ZnVuY3Rpb24oKXtlLmFkdmFuY2VkTG9nKCJSZXNldCBXZWJzb2NrZXQgc3RhdGUiKSxyLmV4cG9uZW50aWFsQmFja09mZlRpbWU9MWUzLFIucGVuZGluZ1Jlc3BvbnNlPSExLHIucmVjb25uZWN0V2ViU29ja2V0PSEwLGNsZWFyVGltZW91dChyLmxpZmVUaW1lVGltZW91dEhhbmRsZSksY2xlYXJJbnRlcnZhbChSLmludGVydmFsSGFuZGxlKSxjbGVhclRpbWVvdXQoci5leHBvbmVudGlhbFRpbWVvdXRIYW5kbGUpLGNsZWFyVGltZW91dChyLndlYlNvY2tldEluaXRDaGVja2VyVGltZW91dElkKX0sWT1mdW5jdGlvbigpe0QuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cz0wLEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD0wLGNsZWFySW50ZXJ2YWwoRC5yZXNwb25zZUNoZWNrSW50ZXJ2YWxJZCksY2xlYXJJbnRlcnZhbChELnJlU3Vic2NyaWJlSW50ZXJ2YWxJZCl9LCQ9ZnVuY3Rpb24oKXtvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50PTAsby5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZT1udWxsLG8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA9bnVsbH0sSj1mdW5jdGlvbigpe1AuY29ubmVjdGVkKCk7dHJ5e2UuYWR2YW5jZWRMb2cocCksdWUoZS5pbmZvKHApKSxxKCJ3ZWJTb2NrZXRPbk9wZW4iKSxudWxsIT09ci5jb25uU3RhdGUmJnIuY29ublN0YXRlIT09d3x8VShrLmNvbm5lY3Rpb25HYWluKSxyLmNvbm5TdGF0ZT0iY29ubmVjdGVkIjt2YXIgdD1EYXRlLm5vdygpO1Uoay5jb25uZWN0aW9uT3Blbix7Y29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ6by5jb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudCxjb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZTpvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lLG5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wOm8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXAsY29ubmVjdGlvbkVzdGFibGlzaGVkVGltZTp0LHRpbWVUb0Nvbm5lY3Q6dC1vLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lLHRpbWVXaXRob3V0Q29ubmVjdGlvbjpvLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wP3Qtby5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcDpudWxsfSksJCgpLFgoKSxXKCkub3BlblRpbWVzdGFtcD1EYXRlLm5vdygpLDA9PT1PLnN1YnNjcmliZWQuc2l6ZSYmQihuLnNlY29uZGFyeSkmJnRlKG4ucHJpbWFyeSwiW1ByaW1hcnkgV2ViU29ja2V0XSBDbG9zaW5nIFdlYlNvY2tldCIpLChPLnN1YnNjcmliZWQuc2l6ZT4wfHxPLnBlbmRpbmcuc2l6ZT4wKSYmKEIobi5zZWNvbmRhcnkpJiZ1ZShlLmluZm8oIlN1YnNjcmliaW5nIHNlY29uZGFyeSB3ZWJzb2NrZXQgdG8gdG9waWNzIG9mIHByaW1hcnkgd2Vic29ja2V0IikpLE8uc3Vic2NyaWJlZC5mb3JFYWNoKChmdW5jdGlvbihlKXtPLnN1YnNjcmlwdGlvbkhpc3RvcnkuYWRkKGUpLE8ucGVuZGluZy5hZGQoZSl9KSksTy5zdWJzY3JpYmVkLmNsZWFyKCksZWUoKSksRygpLFIuaW50ZXJ2YWxIYW5kbGU9c2V0SW50ZXJ2YWwoRywxZTQpO3ZhciBpPTFlMypMLmNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzO3VlKGUuZGVidWcoIlNjaGVkdWxpbmcgV2ViU29ja2V0IG1hbmFnZXIgcmVjb25uZWN0aW9uLCBhZnRlciBkZWxheSAiK2krIiBtcyIpKSxyLmxpZmVUaW1lVGltZW91dEhhbmRsZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3VlKGUuZGVidWcoIlN0YXJ0aW5nIHNjaGVkdWxlZCBXZWJTb2NrZXQgbWFuYWdlciByZWNvbm5lY3Rpb24iKSksc2UoKX0pLGkpfWNhdGNoKHQpe3VlKGUuZXJyb3IoIkVycm9yIGFmdGVyIGVzdGFibGlzaGluZyBXZWJTb2NrZXQgY29ubmVjdGlvbiIsdCkpfX0sUT1mdW5jdGlvbih0KXtxKCJ3ZWJTb2NrZXRPbkVycm9yIiksZS5hZHZhbmNlZExvZyhoLEpTT04uc3RyaW5naWZ5KHQpKSx1ZShlLmVycm9yKGgsSlNPTi5zdHJpbmdpZnkodCkpKSxQLmdldElzQ29ubmVjdGVkKCk/c2UoKTpQLnJldHJ5KCl9LFo9ZnVuY3Rpb24odCl7dmFyIHI9SlNPTi5wYXJzZSh0LmRhdGEpO3N3aXRjaChyLnRvcGljKXtjYXNlIEE6aWYodWUoZS5kZWJ1ZygiU3Vic2NyaXB0aW9uIE1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB3ZWJTb2NrZXQgc2VydmVyIix0LmRhdGEpKSxELnJlcXVlc3RDb21wbGV0ZWQ9ITAsRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PTAsInN1Y2Nlc3MiPT09ci5jb250ZW50LnN0YXR1cylELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM9MCxyLmNvbnRlbnQudG9waWNzLmZvckVhY2goKGZ1bmN0aW9uKGUpe08uc3Vic2NyaXB0aW9uSGlzdG9yeS5kZWxldGUoZSksTy5wZW5kaW5nLmRlbGV0ZShlKSxPLnN1YnNjcmliZWQuYWRkKGUpfSkpLDA9PT1PLnN1YnNjcmlwdGlvbkhpc3Rvcnkuc2l6ZT9CKG4uc2Vjb25kYXJ5KSYmKHVlKGUuaW5mbygiU3VjY2Vzc2Z1bGx5IHN1YnNjcmliZWQgc2Vjb25kYXJ5IHdlYnNvY2tldCB0byBhbGwgdG9waWNzIG9mIHByaW1hcnkgd2Vic29ja2V0IikpLHRlKG4ucHJpbWFyeSwiW1ByaW1hcnkgV2ViU29ja2V0XSBDbG9zaW5nIFdlYlNvY2tldCIpKTplZSgpLFUoay5zdWJzY3JpcHRpb25VcGRhdGUscik7ZWxzZXtpZihjbGVhckludGVydmFsKEQucmVTdWJzY3JpYmVJbnRlcnZhbElkKSwrK0QuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cyw1PT09RC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzKXJldHVybiBVKGsuc3Vic2NyaXB0aW9uRmFpbHVyZSxyKSx2b2lkKEQuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cz0wKTtELnJlU3Vic2NyaWJlSW50ZXJ2YWxJZD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtlZSgpfSksNTAwKX1icmVhaztjYXNlIF86dWUoZS5kZWJ1ZygiSGVhcnRiZWF0IHJlc3BvbnNlIHJlY2VpdmVkIikpLFIucGVuZGluZ1Jlc3BvbnNlPSExO2JyZWFrO2RlZmF1bHQ6aWYoci50b3BpYyl7aWYoZS5hZHZhbmNlZExvZyhDLHIudG9waWMpLHVlKGUuZGVidWcoQytyLnRvcGljKSksQihuLnByaW1hcnkpJiZCKG4uc2Vjb25kYXJ5KSYmMD09PU8uc3Vic2NyaXB0aW9uSGlzdG9yeS5zaXplJiZ0aGlzPT09bi5wcmltYXJ5KXJldHVybiB2b2lkIHVlKGUud2FybigiSWdub3JpbmcgTWVzc2FnZSBmb3IgVG9waWMgIityLnRvcGljKyIsIHRvIGF2b2lkIGR1cGxpY2F0ZXMiKSk7aWYoMD09PWsuYWxsTWVzc2FnZS5zaXplJiYwPT09ay50b3BpYy5zaXplKXJldHVybiB2b2lkIHVlKGUud2FybigiTm8gcmVnaXN0ZXJlZCBjYWxsYmFjayBsaXN0ZW5lciBmb3IgVG9waWMiLHIudG9waWMpKTtlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXRNYW5hZ2VyIGludm9rZSBjYWxsYmFja3MgZm9yIHRvcGljIHN1Y2Nlc3MgIixyLnRvcGljKSxVKGsuYWxsTWVzc2FnZSxyKSxrLnRvcGljLmhhcyhyLnRvcGljKSYmVShrLnRvcGljLmdldChyLnRvcGljKSxyKX1lbHNlIHIubWVzc2FnZT8oZS5hZHZhbmNlZExvZyhULHIpLHVlKGUud2FybihULHIpKSk6KGUuYWR2YW5jZWRMb2coSSxyKSx1ZShlLndhcm4oSSxyKSkpfX0sZWU9ZnVuY3Rpb24gdCgpe2lmKEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD4zKXJldHVybiB1ZShlLndhcm4oIklnbm9yaW5nIHN1YnNjcmliZVBlbmRpbmdUb3BpY3Mgc2luY2Ugd2UgaGF2ZSBleGhhdXN0ZWQgbWF4IHN1YnNjcmlwdGlvbiByZXRyaWVzIHdpdGggbm8gcmVzcG9uc2UiKSksdm9pZCBVKGsuc3Vic2NyaXB0aW9uRmFpbHVyZSxOLmdldFN1YnNjcmlwdGlvblJlc3BvbnNlKEEsITEsQXJyYXkuZnJvbShPLnBlbmRpbmcpKSk7SCgpPzAhPT1BcnJheS5mcm9tKE8ucGVuZGluZykubGVuZ3RoJiYoY2xlYXJJbnRlcnZhbChELnJlc3BvbnNlQ2hlY2tJbnRlcnZhbElkKSxXKCkuc2VuZChvZShBLHt0b3BpY3M6QXJyYXkuZnJvbShPLnBlbmRpbmcpfSkpLEQucmVxdWVzdENvbXBsZXRlZD0hMSxELnJlc3BvbnNlQ2hlY2tJbnRlcnZhbElkPXNldEludGVydmFsKChmdW5jdGlvbigpe0QucmVxdWVzdENvbXBsZXRlZHx8KCsrRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0LHQoKSl9KSwxZTMpKTp1ZShlLndhcm4oIklnbm9yaW5nIHN1YnNjcmliZVBlbmRpbmdUb3BpY3MgY2FsbCBzaW5jZSBEZWZhdWx0IFdlYlNvY2tldCBpcyBub3Qgb3BlbiIpKX0sdGU9ZnVuY3Rpb24odCxuKXtqKHQsV2ViU29ja2V0LkNPTk5FQ1RJTkcpfHxqKHQsV2ViU29ja2V0Lk9QRU4pP3QuY2xvc2UoMWUzLG4pOnVlKGUud2FybigiSWdub3JpbmcgV2ViU29ja2V0IENsb3NlIHJlcXVlc3QsIFdlYlNvY2tldCBTdGF0ZTogIitGKHQpKSl9LG5lPWZ1bmN0aW9uKGUpe3RlKG4ucHJpbWFyeSwiW1ByaW1hcnldIFdlYlNvY2tldCAiK2UpLHRlKG4uc2Vjb25kYXJ5LCJbU2Vjb25kYXJ5XSBXZWJTb2NrZXQgIitlKX0scmU9ZnVuY3Rpb24odCl7WCgpLFkoKSxlLmFkdmFuY2VkTG9nKG0sdCksdWUoZS5lcnJvcihtKSksci53ZWJzb2NrZXRJbml0RmFpbGVkPSEwLG5lKCJUZXJtaW5hdGluZyBXZWJTb2NrZXQgTWFuYWdlciIpLGNsZWFySW50ZXJ2YWwoTSksVShrLmluaXRGYWlsdXJlLHtjb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudDpvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50LGNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lOm8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWUscmVhc29uOnR9KSwkKCl9LG9lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHt0b3BpYzplLGNvbnRlbnQ6dH0pfSxpZT1mdW5jdGlvbih0KXtyZXR1cm4hIShOLmlzT2JqZWN0KHQpJiZOLmlzT2JqZWN0KHQud2ViU29ja2V0VHJhbnNwb3J0KSYmTi5pc05vbkVtcHR5U3RyaW5nKHQud2ViU29ja2V0VHJhbnNwb3J0LnVybCkmJk4udmFsaWRXU1VybCh0LndlYlNvY2tldFRyYW5zcG9ydC51cmwpJiYxZTMqdC53ZWJTb2NrZXRUcmFuc3BvcnQudHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM+PTNlNSl8fCh1ZShlLmVycm9yKCJJbnZhbGlkIFdlYlNvY2tldCBDb25uZWN0aW9uIENvbmZpZ3VyYXRpb24iLHQpKSwhMSl9LHNlPWZ1bmN0aW9uKCl7aWYoIU4uaXNOZXR3b3JrT25saW5lKCkpcmV0dXJuIGUuYWR2YW5jZWRMb2coYyksdm9pZCB1ZShlLmluZm8oYykpO2lmKHIud2Vic29ja2V0SW5pdEZhaWxlZCl1ZShlLmRlYnVnKCJXZWJTb2NrZXQgSW5pdCBoYWQgZmFpbGVkLCBpZ25vcmluZyB0aGlzIGdldFdlYlNvY2tldENvbm5Db25maWcgcmVxdWVzdCIpKTtlbHNle2lmKEwucHJvbWlzZUNvbXBsZXRlZClyZXR1cm4gWCgpLGUuYWR2YW5jZWRMb2codiksdWUoZS5pbmZvKHYpKSxvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lPW8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWV8fERhdGUubm93KCksTC5wcm9taXNlQ29tcGxldGVkPSExLEwucHJvbWlzZUhhbmRsZT1rLmdldFdlYlNvY2tldFRyYW5zcG9ydCgpLEwucHJvbWlzZUhhbmRsZS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gTC5wcm9taXNlQ29tcGxldGVkPSEwLGUuYWR2YW5jZWRMb2coeSksdWUoZS5kZWJ1Zyh5LHQpKSxpZSh0KT8oTC5jb25uQ29uZmlnPXQsTC5jb25uQ29uZmlnLnVybENvbm5WYWxpZFRpbWU9RGF0ZS5ub3coKSs4NWUzLGFlKCkpOihyZSgiSW52YWxpZCBXZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uOiAiK3QpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIEwucHJvbWlzZUNvbXBsZXRlZD0hMCxlLmFkdmFuY2VkTG9nKEUpLHVlKGUuZXJyb3IoRSx0KSksTi5pc05ldHdvcmtGYWlsdXJlKHQpPyhlLmFkdmFuY2VkTG9nKFMrSlNPTi5zdHJpbmdpZnkodCkpLHVlKGUuaW5mbyhTK0pTT04uc3RyaW5naWZ5KHQpKSksUC5yZXRyeSgpKTpyZSgiRmFpbGVkIHRvIGZldGNoIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb246ICIrSlNPTi5zdHJpbmdpZnkodCkpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfX0pKTt1ZShlLmRlYnVnKCJUaGVyZSBpcyBhbiBvbmdvaW5nIGdldFdlYlNvY2tldENvbm5Db25maWcgcmVxdWVzdCwgdGhpcyByZXF1ZXN0IHdpbGwgYmUgaWdub3JlZCIpKX19LGFlPWZ1bmN0aW9uKCl7aWYoci53ZWJzb2NrZXRJbml0RmFpbGVkKXJldHVybiB1ZShlLmluZm8oIndlYi1zb2NrZXQgaW5pdGlhbGl6aW5nIGhhZCBmYWlsZWQsIGFib3J0aW5nIHJlLWluaXQiKSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9O2lmKCFOLmlzTmV0d29ya09ubGluZSgpKXJldHVybiB1ZShlLndhcm4oIlN5c3RlbSBpcyBvZmZsaW5lIGFib3J0aW5nIHdlYi1zb2NrZXQgaW5pdCIpKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH07ZS5hZHZhbmNlZExvZyhiKSx1ZShlLmluZm8oYikpLHEoImluaXRXZWJTb2NrZXQiKTt0cnl7aWYoaWUoTC5jb25uQ29uZmlnKSl7dmFyIHQ9bnVsbDtyZXR1cm4gQihuLnByaW1hcnkpPyh1ZShlLmRlYnVnKCJQcmltYXJ5IFNvY2tldCBjb25uZWN0aW9uIGlzIGFscmVhZHkgb3BlbiIpKSxqKG4uc2Vjb25kYXJ5LFdlYlNvY2tldC5DT05ORUNUSU5HKXx8KHVlKGUuZGVidWcoIkVzdGFibGlzaGluZyBhIHNlY29uZGFyeSB3ZWItc29ja2V0IGNvbm5lY3Rpb24iKSksUC5udW1BdHRlbXB0cz0wLG4uc2Vjb25kYXJ5PWNlKCkpLHQ9bi5zZWNvbmRhcnkpOihqKG4ucHJpbWFyeSxXZWJTb2NrZXQuQ09OTkVDVElORyl8fCh1ZShlLmRlYnVnKCJFc3RhYmxpc2hpbmcgYSBwcmltYXJ5IHdlYi1zb2NrZXQgY29ubmVjdGlvbiIpKSxuLnByaW1hcnk9Y2UoKSksdD1uLnByaW1hcnkpLHIud2ViU29ja2V0SW5pdENoZWNrZXJUaW1lb3V0SWQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtCKHQpfHxmdW5jdGlvbigpe28uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQrKzt2YXIgdD1OLmFkZEppdHRlcihyLmV4cG9uZW50aWFsQmFja09mZlRpbWUsLjMpO0RhdGUubm93KCkrdDw9TC5jb25uQ29uZmlnLnVybENvbm5WYWxpZFRpbWU/KGUuYWR2YW5jZWRMb2coZiksdWUoZS5kZWJ1ZyhmK3QrIiBtcyIpKSxyLmV4cG9uZW50aWFsVGltZW91dEhhbmRsZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBhZSgpfSksdCksci5leHBvbmVudGlhbEJhY2tPZmZUaW1lKj0yKTooZS5hZHZhbmNlZExvZyhnKSx1ZShlLndhcm4oZykpLHNlKCkpfSgpfSksMWUzKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMX19fWNhdGNoKHQpe3JldHVybiB1ZShlLmVycm9yKCJFcnJvciBJbml0aWFsaXppbmcgd2ViLXNvY2tldC1tYW5hZ2VyIix0KSkscmUoIkZhaWxlZCB0byBpbml0aWFsaXplIG5ldyBXZWJTb2NrZXQ6ICIrdC5tZXNzYWdlKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH19fSxjZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBXZWJTb2NrZXQoTC5jb25uQ29uZmlnLndlYlNvY2tldFRyYW5zcG9ydC51cmwpO3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLEopLHQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsWiksdC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsUSksdC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKGZ1bmN0aW9uKGkpe3JldHVybiBmdW5jdGlvbih0LGkpe2UuYWR2YW5jZWRMb2coZCxKU09OLnN0cmluZ2lmeSh0KSksdWUoZS5pbmZvKGQsSlNPTi5zdHJpbmdpZnkodCkpKSxxKCJ3ZWJTb2NrZXRPbkNsb3NlIGJlZm9yZS1jbGVhbnVwIiksVShrLmNvbm5lY3Rpb25DbG9zZSx7b3BlblRpbWVzdGFtcDppLm9wZW5UaW1lc3RhbXAsY2xvc2VUaW1lc3RhbXA6RGF0ZS5ub3coKSxjb25uZWN0aW9uRHVyYXRpb246RGF0ZS5ub3coKS1pLm9wZW5UaW1lc3RhbXAsY29kZTp0LmNvZGUscmVhc29uOnQucmVhc29ufSksVihuLnByaW1hcnkpJiYobi5wcmltYXJ5PW51bGwpLFYobi5zZWNvbmRhcnkpJiYobi5zZWNvbmRhcnk9bnVsbCksci5yZWNvbm5lY3RXZWJTb2NrZXQmJihCKG4ucHJpbWFyeSl8fEIobi5zZWNvbmRhcnkpP1Yobi5wcmltYXJ5KSYmQihuLnNlY29uZGFyeSkmJih1ZShlLmluZm8oIltQcmltYXJ5XSBXZWJTb2NrZXQgQ2xlYW5seSBDbG9zZWQiKSksbi5wcmltYXJ5PW4uc2Vjb25kYXJ5LG4uc2Vjb25kYXJ5PW51bGwpOih1ZShlLndhcm4oIk5laXRoZXIgcHJpbWFyeSB3ZWJzb2NrZXQgYW5kIG5vciBzZWNvbmRhcnkgd2Vic29ja2V0IGhhdmUgb3BlbiBjb25uZWN0aW9ucywgYXR0ZW1wdGluZyB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvbiIpKSxyLmNvbm5TdGF0ZT09PXc/dWUoZS5pbmZvKCJJZ25vcmluZyBjb25uZWN0aW9uTG9zdCBjYWxsYmFjayBpbnZvY2F0aW9uIikpOihVKGsuY29ubmVjdGlvbkxvc3Qse29wZW5UaW1lc3RhbXA6aS5vcGVuVGltZXN0YW1wLGNsb3NlVGltZXN0YW1wOkRhdGUubm93KCksY29ubmVjdGlvbkR1cmF0aW9uOkRhdGUubm93KCktaS5vcGVuVGltZXN0YW1wLGNvZGU6dC5jb2RlLHJlYXNvbjp0LnJlYXNvbn0pLG8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA9RGF0ZS5ub3coKSksci5jb25uU3RhdGU9dyxzZSgpKSxxKCJ3ZWJTb2NrZXRPbkNsb3NlIGFmdGVyLWNsZWFudXAiKSl9KGksdCl9KSksdH0sdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyJiZlLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZX07dGhpcy5pbml0PWZ1bmN0aW9uKHQpe2lmKE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksInRyYW5zcG9ydEhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24iKSxudWxsPT09ay5nZXRXZWJTb2NrZXRUcmFuc3BvcnQpcmV0dXJuIGsuZ2V0V2ViU29ja2V0VHJhbnNwb3J0PXQsc2UoKTt1ZShlLndhcm4oIldlYiBTb2NrZXQgTWFuYWdlciB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCIpKX0sdGhpcy5vbkluaXRGYWlsdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJJbml0aWFsaXppbmcgV2Vic29ja2V0IE1hbmFnZXIgRmFpbGVkISIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuaW5pdEZhaWx1cmUuYWRkKHQpLHIud2Vic29ja2V0SW5pdEZhaWxlZCYmdCgpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuaW5pdEZhaWx1cmUuZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25PcGVuPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBvcGVuIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5jb25uZWN0aW9uT3Blbi5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gay5jb25uZWN0aW9uT3Blbi5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbkNsb3NlPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBjbG9zZSIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbkNsb3NlLmFkZCh0KSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25DbG9zZS5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbkdhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIGdhaW4iKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmNvbm5lY3Rpb25HYWluLmFkZCh0KSxIKCkmJnQoKSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25HYWluLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uTG9zdD1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gbG9zdCIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbkxvc3QuYWRkKHQpLHIuY29ublN0YXRlPT09dyYmdCgpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuY29ubmVjdGlvbkxvc3QuZGVsZXRlKHQpfX0sdGhpcy5vblN1YnNjcmlwdGlvblVwZGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbihlKSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5zdWJzY3JpcHRpb25VcGRhdGUuYWRkKGUpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuc3Vic2NyaXB0aW9uVXBkYXRlLmRlbGV0ZShlKX19LHRoaXMub25TdWJzY3JpcHRpb25GYWlsdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgc3Vic2NyaXB0aW9uIGZhaWx1cmUiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLnN1YnNjcmlwdGlvbkZhaWx1cmUuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuc3Vic2NyaXB0aW9uRmFpbHVyZS5kZWxldGUodCl9fSx0aGlzLm9uTWVzc2FnZT1mdW5jdGlvbihlLHQpe3JldHVybiBOLmFzc2VydE5vdE51bGwoZSwidG9waWNOYW1lIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay50b3BpYy5oYXMoZSk/ay50b3BpYy5nZXQoZSkuYWRkKHQpOmsudG9waWMuc2V0KGUsbmV3IFNldChbdF0pKSxmdW5jdGlvbigpe3JldHVybiBrLnRvcGljLmdldChlKS5kZWxldGUodCl9fSx0aGlzLm9uQWxsTWVzc2FnZT1mdW5jdGlvbihlKXtyZXR1cm4gTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbihlKSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5hbGxNZXNzYWdlLmFkZChlKSxmdW5jdGlvbigpe3JldHVybiBrLmFsbE1lc3NhZ2UuZGVsZXRlKGUpfX0sdGhpcy5zdWJzY3JpYmVUb3BpY3M9ZnVuY3Rpb24oZSl7Ti5hc3NlcnROb3ROdWxsKGUsInRvcGljcyIpLE4uYXNzZXJ0SXNMaXN0KGUpLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Ty5zdWJzY3JpYmVkLmhhcyhlKXx8Ty5wZW5kaW5nLmFkZChlKX0pKSxELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q9MCxlZSgpfSx0aGlzLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKHQpe2lmKE4uYXNzZXJ0SXNPYmplY3QodCwicGF5bG9hZCIpLHZvaWQgMD09PXQudG9waWN8fHguaGFzKHQudG9waWMpKXVlKGUud2FybigiQ2Fubm90IHNlbmQgbWVzc2FnZSwgSW52YWxpZCB0b3BpYyIsdCkpO2Vsc2V7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2gobil7cmV0dXJuIHZvaWQgdWUoZS53YXJuKCJFcnJvciBzdHJpbmdpZnkgbWVzc2FnZSIsdCkpfUgoKT9XKCkuc2VuZCh0KTp1ZShlLndhcm4oIkNhbm5vdCBzZW5kIG1lc3NhZ2UsIHdlYiBzb2NrZXQgY29ubmVjdGlvbiBpcyBub3Qgb3BlbiIpKX19LHRoaXMuY2xvc2VXZWJTb2NrZXQ9ZnVuY3Rpb24oKXtYKCksWSgpLHIucmVjb25uZWN0V2ViU29ja2V0PSExLGNsZWFySW50ZXJ2YWwoTSksbmUoIlVzZXIgcmVxdWVzdCB0byBjbG9zZSBXZWJTb2NrZXQiKX0sdGhpcy50ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyPXJlfSxZPXtjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFh9LHNldEdsb2JhbENvbmZpZzpmdW5jdGlvbihlKXt2YXIgdD1lJiZlLmxvZ2dlckNvbmZpZzt6LnVwZGF0ZUxvZ2dlckNvbmZpZyh0KX0sTG9nTGV2ZWw6aixMb2dnZXI6Rn19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjshZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIG89e25vdF9zdHJpbmc6L1tec10vLG5vdF9ib29sOi9bXnRdLyxub3RfdHlwZTovW15UXS8sbm90X3ByaW1pdGl2ZTovW152XS8sbnVtYmVyOi9bZGllZmddLyxudW1lcmljX2FyZzovW2JjZGllZmd1eFhdLyxqc29uOi9bal0vLG5vdF9qc29uOi9bXmpdLyx0ZXh0Oi9eW15ceDI1XSsvLG1vZHVsbzovXlx4MjV7Mn0vLHBsYWNlaG9sZGVyOi9eXHgyNSg/OihbMS05XVxkKilcJHxcKChbXildKylcKSk/KFwrKT8oMHwnW14kXSk/KC0pPyhcZCspPyg/OlwuKFxkKykpPyhbYi1naWpvc3RUdXZ4WF0pLyxrZXk6L14oW2Etel9dW2Etel9cZF0qKS9pLGtleV9hY2Nlc3M6L15cLihbYS16X11bYS16X1xkXSopL2ksaW5kZXhfYWNjZXNzOi9eXFsoXGQrKVxdLyxzaWduOi9eWystXS99O2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG4scixzLGEsYyx1LGwscCxkLGg9MSxmPWUubGVuZ3RoLGc9IiI7Zm9yKHI9MDtyPGY7cisrKWlmKCJzdHJpbmciPT10eXBlb2YgZVtyXSlnKz1lW3JdO2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBlW3JdKXtpZigoYT1lW3JdKS5rZXlzKWZvcihuPXRbaF0scz0wO3M8YS5rZXlzLmxlbmd0aDtzKyspe2lmKG51bGw9PW4pdGhyb3cgbmV3IEVycm9yKGkoJ1tzcHJpbnRmXSBDYW5ub3QgYWNjZXNzIHByb3BlcnR5ICIlcyIgb2YgdW5kZWZpbmVkIHZhbHVlICIlcyInLGEua2V5c1tzXSxhLmtleXNbcy0xXSkpO249blthLmtleXNbc11dfWVsc2Ugbj1hLnBhcmFtX25vP3RbYS5wYXJhbV9ub106dFtoKytdO2lmKG8ubm90X3R5cGUudGVzdChhLnR5cGUpJiZvLm5vdF9wcmltaXRpdmUudGVzdChhLnR5cGUpJiZuIGluc3RhbmNlb2YgRnVuY3Rpb24mJihuPW4oKSksby5udW1lcmljX2FyZy50ZXN0KGEudHlwZSkmJiJudW1iZXIiIT10eXBlb2YgbiYmaXNOYU4obikpdGhyb3cgbmV3IFR5cGVFcnJvcihpKCJbc3ByaW50Zl0gZXhwZWN0aW5nIG51bWJlciBidXQgZm91bmQgJVQiLG4pKTtzd2l0Y2goby5udW1iZXIudGVzdChhLnR5cGUpJiYocD1uPj0wKSxhLnR5cGUpe2Nhc2UiYiI6bj1wYXJzZUludChuLDEwKS50b1N0cmluZygyKTticmVhaztjYXNlImMiOm49U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLDEwKSk7YnJlYWs7Y2FzZSJkIjpjYXNlImkiOm49cGFyc2VJbnQobiwxMCk7YnJlYWs7Y2FzZSJqIjpuPUpTT04uc3RyaW5naWZ5KG4sbnVsbCxhLndpZHRoP3BhcnNlSW50KGEud2lkdGgpOjApO2JyZWFrO2Nhc2UiZSI6bj1hLnByZWNpc2lvbj9wYXJzZUZsb2F0KG4pLnRvRXhwb25lbnRpYWwoYS5wcmVjaXNpb24pOnBhcnNlRmxvYXQobikudG9FeHBvbmVudGlhbCgpO2JyZWFrO2Nhc2UiZiI6bj1hLnByZWNpc2lvbj9wYXJzZUZsb2F0KG4pLnRvRml4ZWQoYS5wcmVjaXNpb24pOnBhcnNlRmxvYXQobik7YnJlYWs7Y2FzZSJnIjpuPWEucHJlY2lzaW9uP1N0cmluZyhOdW1iZXIobi50b1ByZWNpc2lvbihhLnByZWNpc2lvbikpKTpwYXJzZUZsb2F0KG4pO2JyZWFrO2Nhc2UibyI6bj0ocGFyc2VJbnQobiwxMCk+Pj4wKS50b1N0cmluZyg4KTticmVhaztjYXNlInMiOm49U3RyaW5nKG4pLG49YS5wcmVjaXNpb24/bi5zdWJzdHJpbmcoMCxhLnByZWNpc2lvbik6bjticmVhaztjYXNlInQiOm49U3RyaW5nKCEhbiksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UiVCI6bj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobikuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKSxuPWEucHJlY2lzaW9uP24uc3Vic3RyaW5nKDAsYS5wcmVjaXNpb24pOm47YnJlYWs7Y2FzZSJ1IjpuPXBhcnNlSW50KG4sMTApPj4+MDticmVhaztjYXNlInYiOm49bi52YWx1ZU9mKCksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UieCI6bj0ocGFyc2VJbnQobiwxMCk+Pj4wKS50b1N0cmluZygxNik7YnJlYWs7Y2FzZSJYIjpuPShwYXJzZUludChuLDEwKT4+PjApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfW8uanNvbi50ZXN0KGEudHlwZSk/Zys9bjooIW8ubnVtYmVyLnRlc3QoYS50eXBlKXx8cCYmIWEuc2lnbj9kPSIiOihkPXA/IisiOiItIixuPW4udG9TdHJpbmcoKS5yZXBsYWNlKG8uc2lnbiwiIikpLHU9YS5wYWRfY2hhcj8iMCI9PT1hLnBhZF9jaGFyPyIwIjphLnBhZF9jaGFyLmNoYXJBdCgxKToiICIsbD1hLndpZHRoLShkK24pLmxlbmd0aCxjPWEud2lkdGgmJmw+MD91LnJlcGVhdChsKToiIixnKz1hLmFsaWduP2QrbitjOiIwIj09PXU/ZCtjK246YytkK24pfXJldHVybiBnfShmdW5jdGlvbihlKXtpZihhW2VdKXJldHVybiBhW2VdO2Zvcih2YXIgdCxuPWUscj1bXSxpPTA7bjspe2lmKG51bGwhPT0odD1vLnRleHQuZXhlYyhuKSkpci5wdXNoKHRbMF0pO2Vsc2UgaWYobnVsbCE9PSh0PW8ubW9kdWxvLmV4ZWMobikpKXIucHVzaCgiJSIpO2Vsc2V7aWYobnVsbD09PSh0PW8ucGxhY2Vob2xkZXIuZXhlYyhuKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJbc3ByaW50Zl0gdW5leHBlY3RlZCBwbGFjZWhvbGRlciIpO2lmKHRbMl0pe2l8PTE7dmFyIHM9W10sYz10WzJdLHU9W107aWYobnVsbD09PSh1PW8ua2V5LmV4ZWMoYykpKXRocm93IG5ldyBTeW50YXhFcnJvcigiW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXkiKTtmb3Iocy5wdXNoKHVbMV0pOyIiIT09KGM9Yy5zdWJzdHJpbmcodVswXS5sZW5ndGgpKTspaWYobnVsbCE9PSh1PW8ua2V5X2FjY2Vzcy5leGVjKGMpKSlzLnB1c2godVsxXSk7ZWxzZXtpZihudWxsPT09KHU9by5pbmRleF9hY2Nlc3MuZXhlYyhjKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleSIpO3MucHVzaCh1WzFdKX10WzJdPXN9ZWxzZSBpfD0yO2lmKDM9PT1pKXRocm93IG5ldyBFcnJvcigiW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCIpO3IucHVzaCh7cGxhY2Vob2xkZXI6dFswXSxwYXJhbV9ubzp0WzFdLGtleXM6dFsyXSxzaWduOnRbM10scGFkX2NoYXI6dFs0XSxhbGlnbjp0WzVdLHdpZHRoOnRbNl0scHJlY2lzaW9uOnRbN10sdHlwZTp0WzhdfSl9bj1uLnN1YnN0cmluZyh0WzBdLmxlbmd0aCl9cmV0dXJuIGFbZV09cn0oZSksYXJndW1lbnRzKX1mdW5jdGlvbiBzKGUsdCl7cmV0dXJuIGkuYXBwbHkobnVsbCxbZV0uY29uY2F0KHR8fFtdKSl9dmFyIGE9T2JqZWN0LmNyZWF0ZShudWxsKTt0LnNwcmludGY9aSx0LnZzcHJpbnRmPXMsInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuc3ByaW50Zj1pLHdpbmRvdy52c3ByaW50Zj1zLHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJue3NwcmludGY6aSx2c3ByaW50ZjpzfX0uY2FsbCh0LG4sdCxlKSl8fChlLmV4cG9ydHM9cikpfSgpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxmdW5jdGlvbihlKXtuLmQodCwiV2ViU29ja2V0TWFuYWdlciIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSk7dmFyIHI9bigwKTtlLmNvbm5lY3Q9ZS5jb25uZWN0fHx7fSxjb25uZWN0LldlYlNvY2tldE1hbmFnZXI9ci5hO3ZhciBvPXIuYX0uY2FsbCh0aGlzLG4oMykpfSxmdW5jdGlvbihlLHQpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaChlKXsib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKG49d2luZG93KX1lLmV4cG9ydHM9bn1dKX0sMTUxOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49e1RFU1Q6IlRFU1QiLFRSQUNFOiJUUkFDRSIsREVCVUc6IkRFQlVHIixJTkZPOiJJTkZPIixMT0c6IkxPRyIsV0FSTjoiV0FSTiIsRVJST1I6IkVSUk9SIixDUklUSUNBTDoiQ1JJVElDQUwifSxyPXtDQ1A6ImNjcCIsU09GVFBIT05FOiJzb2Z0cGhvbmUiLENIQVQ6ImNoYXQiLFRBU0s6InRhc2sifSxvPXtURVNUOjAsVFJBQ0U6MTAsREVCVUc6MjAsSU5GTzozMCxMT0c6NDAsV0FSTjo1MCxFUlJPUjoxMDAsQ1JJVElDQUw6MjAwfSxpPSJDQ1AiLHM9IlNoYXJlZFdvcmtlciIsYT0iQ1JNIixjPXtUUkFDRTpmdW5jdGlvbihlKXtjb25zb2xlLmluZm8oZSl9LERFQlVHOmZ1bmN0aW9uKGUpe2NvbnNvbGUuaW5mbyhlKX0sSU5GTzpmdW5jdGlvbihlKXtjb25zb2xlLmluZm8oZSl9LExPRzpmdW5jdGlvbihlKXtjb25zb2xlLmxvZyhlKX0sVEVTVDpmdW5jdGlvbihlKXtjb25zb2xlLmxvZyhlKX0sV0FSTjpmdW5jdGlvbihlKXtjb25zb2xlLndhcm4oZSl9LEVSUk9SOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9LENSSVRJQ0FMOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9fSx1PWZ1bmN0aW9uKGUpe3ZhciB0LG4sbz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLDApLGk9by5zaGlmdCgpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4tMSE9PU9iamVjdC52YWx1ZXMocikuaW5kZXhPZihlKX0oaSk/KG49aSx0PW8uc2hpZnQoKSk6KHQ9aSxuPXIuQ0NQKSx7Zm9ybWF0OnQsY29tcG9uZW50Om4sYXJnczpvfX0sbD1mdW5jdGlvbihlLG4scixvLGMsdSl7dGhpcy5jb21wb25lbnQ9ZSx0aGlzLmxldmVsPW4sdGhpcy50ZXh0PXIsdGhpcy50aW1lPW5ldyBEYXRlLHRoaXMudGFiSWQ9bnVsbD09PWM/bnVsbDpjfHx0LmNvcmUudGFiSWQsdGhpcy5leGNlcHRpb249bnVsbCx0aGlzLm9iamVjdHM9W10sdGhpcy5saW5lPTAsdGhpcy5hZ2VudFJlc291cmNlSWQ9bnVsbDt0cnl7dC5hZ2VudC5pbml0aWFsaXplZCYmKHRoaXMuYWdlbnRSZXNvdXJjZUlkPShuZXcgdC5BZ2VudCkuX2dldFJlc291cmNlSWQoKSl9Y2F0Y2goZSl7Y29uc29sZS5sb2coIklzc3VlIGZpbmRpbmcgYWdlbnRSZXNvdXJjZUlkOiAiLGUpfXRoaXMubG9nZ2VySWQ9byx1P3RoaXMuY29udGV4dExheWVyPXU6dC5pc1NoYXJlZFdvcmtlcigpP3RoaXMuY29udGV4dExheWVyPXM6dC5pc0NSTSgpP3RoaXMuY29udGV4dExheWVyPWE6dC5pc0NDUCgpJiYodGhpcy5jb250ZXh0TGF5ZXI9aSl9O2wuZnJvbU9iamVjdD1mdW5jdGlvbihlKXt2YXIgdD1lLnRhYklkfHxudWxsLG49ZS5jb250ZXh0TGF5ZXJ8fG51bGwsbz1uZXcgbChyLkNDUCxlLmxldmVsLGUudGV4dCxlLmxvZ2dlcklkLHQsbik7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUudGltZSk/by50aW1lPW5ldyBEYXRlKGUudGltZS5nZXRUaW1lKCkpOiJudW1iZXIiPT10eXBlb2YgZS50aW1lP28udGltZT1uZXcgRGF0ZShlLnRpbWUpOiJzdHJpbmciPT10eXBlb2YgZS50aW1lP28udGltZT1EYXRlLnBhcnNlKGUudGltZSk6by50aW1lPW5ldyBEYXRlLG8uZXhjZXB0aW9uPWUuZXhjZXB0aW9uLG8ub2JqZWN0cz1lLm9iamVjdHMsb307dmFyIHA9ZnVuY3Rpb24oZSl7dmFyIHQ9L0F1dGhUb2tlbi4qXD0vZztlJiYib2JqZWN0Ij09dHlwZW9mIGUmJk9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4peyJvYmplY3QiPT10eXBlb2YgZVtuXT9wKGVbbl0pOiJzdHJpbmciPT10eXBlb2YgZVtuXSYmKCJ1cmwiPT09bnx8InRleHQiPT09bj9lW25dPWVbbl0ucmVwbGFjZSh0LCJbcmVkYWN0ZWRdIik6WyJxdWlja0Nvbm5lY3ROYW1lIl0uaW5jbHVkZXMobik/ZVtuXT0iW3JlZGFjdGVkXSI6WyJjdXN0b21lcklkIiwiQ3VzdG9tZXJJZCIsIlNwZWFrZXJJZCIsIkN1c3RvbWVyU3BlYWtlcklkIl0uaW5jbHVkZXMobikmJihlW25dPWBbb2JmdXNjYXRlZCB2YWx1ZV0gJHttZDUoZVtuXSl9YCkpfSkpfSxkPWZ1bmN0aW9uKGUpe2lmKHRoaXMudHlwZT1lIGluc3RhbmNlb2YgRXJyb3I/ZS5uYW1lOmUuY29kZXx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLHRoaXMubWVzc2FnZT1lLm1lc3NhZ2UsdGhpcy5zdGFjaz1bXSxlLnN0YWNrKXRyeXtBcnJheS5pc0FycmF5KGUuc3RhY2spP3RoaXMuc3RhY2s9ZS5zdGFjazoib2JqZWN0Ij09dHlwZW9mIGUuc3RhY2s/dGhpcy5zdGFjaz1bSlNPTi5zdHJpbmdpZnkoZS5zdGFjayldOiJzdHJpbmciPT10eXBlb2YgZS5zdGFjayYmKHRoaXMuc3RhY2s9ZS5zdGFjay5zcGxpdCgiXG4iKSl9Y2F0Y2h7fX07bC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdC5zcHJpbnRmKCJbJXNdIFslc10gWyVzXTogJXMiLHRoaXMuZ2V0VGltZSgpJiZ0aGlzLmdldFRpbWUoKS50b0lTT1N0cmluZz90aGlzLmdldFRpbWUoKS50b0lTT1N0cmluZygpOiI/Pz8iLHRoaXMuZ2V0TGV2ZWwoKSx0aGlzLmdldEFnZW50UmVzb3VyY2VJZCgpLHRoaXMuZ2V0VGV4dCgpKX0sbC5wcm90b3R5cGUuZ2V0VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWV9LGwucHJvdG90eXBlLmdldEFnZW50UmVzb3VyY2VJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFnZW50UmVzb3VyY2VJZH0sbC5wcm90b3R5cGUuZ2V0VGFiSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWJJZH0sbC5wcm90b3R5cGUuZ2V0Q29udGV4dExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dExheWVyfSxsLnByb3RvdHlwZS5nZXRMZXZlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxldmVsfSxsLnByb3RvdHlwZS5nZXRUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dH0sbC5wcm90b3R5cGUuZ2V0Q29tcG9uZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50fSxsLnByb3RvdHlwZS53aXRoRXhjZXB0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmV4Y2VwdGlvbj1uZXcgZChlKSx0aGlzfSxsLnByb3RvdHlwZS53aXRoT2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuZGVlcGNvcHkoZSk7cmV0dXJuIHAobiksdGhpcy5vYmplY3RzLnB1c2gobiksdGhpc30sbC5wcm90b3R5cGUud2l0aENyb3NzT3JpZ2luRXZlbnRPYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dC5kZWVwY29weUNyb3NzT3JpZ2luRXZlbnQoZSk7cmV0dXJuIHAobiksdGhpcy5vYmplY3RzLnB1c2gobiksdGhpc30sbC5wcm90b3R5cGUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5nZXRMb2coKS5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MucHVzaCh0aGlzKSx0aGlzfTt2YXIgaD1mdW5jdGlvbigpe3RoaXMuX2xvZ3M9W10sdGhpcy5fcm9sbGVkTG9ncz1bXSx0aGlzLl9sb2dzVG9QdXNoPVtdLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdLHRoaXMuX2VjaG9MZXZlbD1vLklORk8sdGhpcy5fbG9nTGV2ZWw9by5JTkZPLHRoaXMuX2xpbmVDb3VudD0wLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbD0wLHRoaXMuX2xvZ1JvbGxUaW1lcj1udWxsLHRoaXMuX2xvZ2dlcklkPShuZXcgRGF0ZSkuZ2V0VGltZSgpKyItIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSx0aGlzLnNldExvZ1JvbGxJbnRlcnZhbCgxOGU1KSx0aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoPTB9O2gucHJvdG90eXBlLnNldExvZ1JvbGxJbnRlcnZhbD1mdW5jdGlvbih0KXt2YXIgbj10aGlzO3RoaXMuX2xvZ1JvbGxUaW1lciYmdD09PXRoaXMuX2xvZ1JvbGxJbnRlcnZhbD90aGlzLndhcm4oIkxvZ2dlciBpcyBhbHJlYWR5IHNldCB0byB0aGUgZ2l2ZW4gaW50ZXJ2YWw6ICVkIix0aGlzLl9sb2dSb2xsSW50ZXJ2YWwpOih0aGlzLl9sb2dSb2xsVGltZXImJmUuY2xlYXJJbnRlcnZhbCh0aGlzLl9sb2dSb2xsVGltZXIpLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbD10LHRoaXMuX2xvZ1JvbGxUaW1lcj1lLnNldEludGVydmFsKChmdW5jdGlvbigpe24uX3JvbGxlZExvZ3M9bi5fbG9ncyxuLl9sb2dzPVtdLG4uX3N0YXJ0TG9nSW5kZXhUb1B1c2g9MCxuLmluZm8oIkxvZyByb2xsIGludGVydmFsIG9jY3VycmVkLiIpfSksdGhpcy5fbG9nUm9sbEludGVydmFsKSl9LGgucHJvdG90eXBlLnNldExvZ0xldmVsPWZ1bmN0aW9uKGUpe2lmKCEoZSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbG9nZ2luZyBsZXZlbDogIitlKTt0aGlzLl9sb2dMZXZlbD1vW2VdfSxoLnByb3RvdHlwZS5zZXRFY2hvTGV2ZWw9ZnVuY3Rpb24oZSl7aWYoIShlIGluIG8pKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBsb2dnaW5nIGxldmVsOiAiK2UpO3RoaXMuX2VjaG9MZXZlbD1vW2VdfSxoLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IGwoZSx0LG4sdGhpcy5nZXRMb2dnZXJJZCgpKTtyZXR1cm4gcChyKSx0aGlzLmFkZExvZ0VudHJ5KHIpLHJ9LGgucHJvdG90eXBlLmFkZExvZ0VudHJ5PWZ1bmN0aW9uKGUpe3AoZSksdGhpcy5fbG9ncy5wdXNoKGUpLHIuU09GVFBIT05FPT09ZS5jb21wb25lbnQmJnRoaXMuX2xvZ3NUb1B1c2gucHVzaChlKSxlLmxldmVsIGluIG8mJm9bZS5sZXZlbF0+PXRoaXMuX2xvZ0xldmVsJiYob1tlLmxldmVsXT49dGhpcy5fZWNob0xldmVsJiZjW2UuZ2V0TGV2ZWwoKV0oZS50b1N0cmluZygpKSxlLmxpbmU9dGhpcy5fbGluZUNvdW50KyspfSxoLnByb3RvdHlwZS5zZW5kSW50ZXJuYWxMb2dFbnRyeVRvU2VydmVyPWZ1bmN0aW9uKGUpe3RoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLnB1c2goZSksZS5sZXZlbCBpbiBvJiZvW2UubGV2ZWxdPj10aGlzLl9sb2dMZXZlbCYmKG9bZS5sZXZlbF0+PXRoaXMuX2VjaG9MZXZlbCYmY1tlLmdldExldmVsKCldKGUudG9TdHJpbmcoKSksZS5saW5lPXRoaXMuX2xpbmVDb3VudCsrKX0saC5wcm90b3R5cGUuY2xlYXJPYmplY3RzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9sb2dzLmxlbmd0aDtlKyspdGhpcy5fbG9nc1tlXS5vYmplY3RzJiZkZWxldGUgdGhpcy5fbG9nc1tlXS5vYmplY3RzfSxoLnByb3RvdHlwZS5jbGVhckV4Y2VwdGlvbnM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuX2xvZ3MubGVuZ3RoO2UrKyl0aGlzLl9sb2dzW2VdLmV4Y2VwdGlvbiYmZGVsZXRlIHRoaXMuX2xvZ3NbZV0uZXhjZXB0aW9ufSxoLnByb3RvdHlwZS50cmFjZT1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLlRSQUNFLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmRlYnVnPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uREVCVUcsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLklORk8sdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uTE9HLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5URVNULHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLndhcm49ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5XQVJOLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uRVJST1IsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuY3JpdGljYWw9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5FUlJPUix0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDx0aGlzLl9sb2dzLmxlbmd0aDt0KyspZS5wdXNoKHRoaXMuX2xvZ3NbdF0udG9TdHJpbmcoKSk7cmV0dXJuIGUuam9pbigiXG4iKX0saC5wcm90b3R5cGUuZG93bmxvYWQ9ZnVuY3Rpb24odCl7dmFyIG49ImFnZW50LWxvZyIscj0hMTsib2JqZWN0Ij09dHlwZW9mIHQ/KG49dC5sb2dOYW1lfHxuLHI9dC5maWx0ZXJCeUxvZ0xldmVsfHxyKToic3RyaW5nIj09dHlwZW9mIHQmJihuPXR8fG4pO3ZhciBpPXRoaXMscz10aGlzLl9yb2xsZWRMb2dzLmNvbmNhdCh0aGlzLl9sb2dzKTtyJiYocz1zLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIG9bZS5sZXZlbF0+PWkuX2xvZ0xldmVsfSkpKTt2YXIgYT1uZXcgZS5CbG9iKFtKU09OLnN0cmluZ2lmeShzLHZvaWQgMCw0KV0sWyJ0ZXh0L3BsYWluIl0pLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO249bnx8ImFnZW50LWxvZyIsYy5ocmVmPWUuVVJMLmNyZWF0ZU9iamVjdFVSTChhKSxjLmRvd25sb2FkPW4rIi50eHQiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYyksYy5jbGljaygpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYyl9LGgucHJvdG90eXBlLnNjaGVkdWxlVXBzdHJlYW1Mb2dQdXNoPWZ1bmN0aW9uKG4pe3QudXBzdHJlYW1Mb2dQdXNoU2NoZWR1bGVkfHwodC51cHN0cmVhbUxvZ1B1c2hTY2hlZHVsZWQ9ITAsZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5yZXBvcnRNYXN0ZXJMb2dzVXBTdHJlYW0sbiksNWUzKSl9LGgucHJvdG90eXBlLnJlcG9ydE1hc3RlckxvZ3NVcFN0cmVhbT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl9sb2dzVG9QdXNoLnNsaWNlKCk7dGhpcy5fbG9nc1RvUHVzaD1bXSx0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUywoZnVuY3Rpb24oKXtuLmxlbmd0aD4wJiZlLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5TRU5EX0xPR1Msbil9KSl9LGgucHJvdG90eXBlLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NQdXNoPWZ1bmN0aW9uKG4pe2Uuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMucHVzaE91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1Vwc3RyZWFtLG4pLDFlMyl9LGgucHJvdG90eXBlLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BMb2dzUHVzaD1mdW5jdGlvbihuKXtlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLnB1c2hPdXRlckNvbnRleHRDQ1BMb2dzVXBzdHJlYW0sbiksMWUzKX0saC5wcm90b3R5cGUucHVzaE91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1Vwc3RyZWFtPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aD4wKXtmb3IodmFyIG49MDtuPHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aDtuKyspdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Nbbl0udGV4dD10aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9nc1tuXS50ZXh0O2Uuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MpLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdfX0saC5wcm90b3R5cGUucHVzaE91dGVyQ29udGV4dENDUExvZ3NVcHN0cmVhbT1mdW5jdGlvbihlKXtmb3IodmFyIG49dGhpcy5fc3RhcnRMb2dJbmRleFRvUHVzaDtuPHRoaXMuX2xvZ3MubGVuZ3RoO24rKyl0aGlzLl9sb2dzW25dLmxvZ2dlcklkPT09dGhpcy5fbG9nZ2VySWQmJmUuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkxPRyx0aGlzLl9sb2dzW25dKTt0aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoPXRoaXMuX2xvZ3MubGVuZ3RofSxoLnByb3RvdHlwZS5nZXRMb2dnZXJJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2dnZXJJZH0saC5wcm90b3R5cGUuc2NoZWR1bGVEb3duc3RyZWFtQ2xpZW50U2lkZUxvZ3NQdXNoPWZ1bmN0aW9uKCl7ZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5wdXNoQ2xpZW50U2lkZUxvZ3NEb3duc3RyZWFtKSw1ZTMpfSxoLnByb3RvdHlwZS5wdXNoQ2xpZW50U2lkZUxvZ3NEb3duc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9W107dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoPDUwfHwodGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoPjUwMD9lPXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLnNwbGljZSgwLDUwMCk6KGU9dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MsdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W10pLHQucHVibGlzaENsaWVudFNpZGVMb2dzKGUpKX07dmFyIGY9ZnVuY3Rpb24obil7aC5jYWxsKHRoaXMpLHRoaXMuY29uZHVpdD1uLGUuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMuX3B1c2hMb2dzRG93bnN0cmVhbSksZi5MT0dfUFVTSF9JTlRFUlZBTCksZS5jbGVhckludGVydmFsKHRoaXMuX2xvZ1JvbGxUaW1lciksdGhpcy5fbG9nUm9sbFRpbWVyPW51bGx9O2YuTE9HX1BVU0hfSU5URVJWQUw9MWUzLGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaC5wcm90b3R5cGUpLGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWYsZi5wcm90b3R5cGUucHVzaExvZ3NEb3duc3RyZWFtPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuTE9HLGUpfSkpfSxmLnByb3RvdHlwZS5fcHVzaExvZ3NEb3duc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9sb2dzLmZvckVhY2goKGZ1bmN0aW9uKG4pe2UuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csbil9KSksdGhpcy5fbG9ncz1bXTtmb3IodmFyIG49MDtuPHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aDtuKyspdGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Nbbl0pO3RoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdfTt2YXIgZz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKGUpe2MuRVJST1IoZSl9fX07dC5yb290TG9nZ2VyPW5ldyBoLGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKSJmdW5jdGlvbiI9PXR5cGVvZiBlW3RdJiYoZVt0XT1nKGVbdF0pKX0odC5yb290TG9nZ2VyKSwodD10fHx7fSkuZ2V0TG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHQucm9vdExvZ2dlcn0sdC5Mb2dFbnRyeT1sLHQuTG9nZ2VyPWgsdC5Mb2dMZXZlbD1uLHQuTG9nQ29tcG9uZW50PXIsdC5Eb3duc3RyZWFtQ29uZHVpdExvZ2dlcj1mfSgpfSwxNjM6ZnVuY3Rpb24oKXshZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3ZhciBuPSg2NTUzNSZlKSsoNjU1MzUmdCk7cmV0dXJuKGU+PjE2KSsodD4+MTYpKyhuPj4xNik8PDE2fDY1NTM1Jm59ZnVuY3Rpb24gbihlLG4scixvLGkscyl7cmV0dXJuIHQoKGE9dCh0KG4sZSksdChvLHMpKSk8PChjPWkpfGE+Pj4zMi1jLHIpO3ZhciBhLGN9ZnVuY3Rpb24gcihlLHQscixvLGkscyxhKXtyZXR1cm4gbih0JnJ8fnQmbyxlLHQsaSxzLGEpfWZ1bmN0aW9uIG8oZSx0LHIsbyxpLHMsYSl7cmV0dXJuIG4odCZvfHImfm8sZSx0LGkscyxhKX1mdW5jdGlvbiBpKGUsdCxyLG8saSxzLGEpe3JldHVybiBuKHRecl5vLGUsdCxpLHMsYSl9ZnVuY3Rpb24gcyhlLHQscixvLGkscyxhKXtyZXR1cm4gbihyXih0fH5vKSxlLHQsaSxzLGEpfWZ1bmN0aW9uIGEoZSxuKXt2YXIgYSxjLHUsbCxwO2Vbbj4+NV18PTEyODw8biUzMixlWzE0KyhuKzY0Pj4+OTw8NCldPW47dmFyIGQ9MTczMjU4NDE5MyxoPS0yNzE3MzM4NzksZj0tMTczMjU4NDE5NCxnPTI3MTczMzg3ODtmb3IoYT0wO2E8ZS5sZW5ndGg7YSs9MTYpYz1kLHU9aCxsPWYscD1nLGQ9cihkLGgsZixnLGVbYV0sNywtNjgwODc2OTM2KSxnPXIoZyxkLGgsZixlW2ErMV0sMTIsLTM4OTU2NDU4NiksZj1yKGYsZyxkLGgsZVthKzJdLDE3LDYwNjEwNTgxOSksaD1yKGgsZixnLGQsZVthKzNdLDIyLC0xMDQ0NTI1MzMwKSxkPXIoZCxoLGYsZyxlW2ErNF0sNywtMTc2NDE4ODk3KSxnPXIoZyxkLGgsZixlW2ErNV0sMTIsMTIwMDA4MDQyNiksZj1yKGYsZyxkLGgsZVthKzZdLDE3LC0xNDczMjMxMzQxKSxoPXIoaCxmLGcsZCxlW2ErN10sMjIsLTQ1NzA1OTgzKSxkPXIoZCxoLGYsZyxlW2ErOF0sNywxNzcwMDM1NDE2KSxnPXIoZyxkLGgsZixlW2ErOV0sMTIsLTE5NTg0MTQ0MTcpLGY9cihmLGcsZCxoLGVbYSsxMF0sMTcsLTQyMDYzKSxoPXIoaCxmLGcsZCxlW2ErMTFdLDIyLC0xOTkwNDA0MTYyKSxkPXIoZCxoLGYsZyxlW2ErMTJdLDcsMTgwNDYwMzY4MiksZz1yKGcsZCxoLGYsZVthKzEzXSwxMiwtNDAzNDExMDEpLGY9cihmLGcsZCxoLGVbYSsxNF0sMTcsLTE1MDIwMDIyOTApLGQ9byhkLGg9cihoLGYsZyxkLGVbYSsxNV0sMjIsMTIzNjUzNTMyOSksZixnLGVbYSsxXSw1LC0xNjU3OTY1MTApLGc9byhnLGQsaCxmLGVbYSs2XSw5LC0xMDY5NTAxNjMyKSxmPW8oZixnLGQsaCxlW2ErMTFdLDE0LDY0MzcxNzcxMyksaD1vKGgsZixnLGQsZVthXSwyMCwtMzczODk3MzAyKSxkPW8oZCxoLGYsZyxlW2ErNV0sNSwtNzAxNTU4NjkxKSxnPW8oZyxkLGgsZixlW2ErMTBdLDksMzgwMTYwODMpLGY9byhmLGcsZCxoLGVbYSsxNV0sMTQsLTY2MDQ3ODMzNSksaD1vKGgsZixnLGQsZVthKzRdLDIwLC00MDU1Mzc4NDgpLGQ9byhkLGgsZixnLGVbYSs5XSw1LDU2ODQ0NjQzOCksZz1vKGcsZCxoLGYsZVthKzE0XSw5LC0xMDE5ODAzNjkwKSxmPW8oZixnLGQsaCxlW2ErM10sMTQsLTE4NzM2Mzk2MSksaD1vKGgsZixnLGQsZVthKzhdLDIwLDExNjM1MzE1MDEpLGQ9byhkLGgsZixnLGVbYSsxM10sNSwtMTQ0NDY4MTQ2NyksZz1vKGcsZCxoLGYsZVthKzJdLDksLTUxNDAzNzg0KSxmPW8oZixnLGQsaCxlW2ErN10sMTQsMTczNTMyODQ3MyksZD1pKGQsaD1vKGgsZixnLGQsZVthKzEyXSwyMCwtMTkyNjYwNzczNCksZixnLGVbYSs1XSw0LC0zNzg1NTgpLGc9aShnLGQsaCxmLGVbYSs4XSwxMSwtMjAyMjU3NDQ2MyksZj1pKGYsZyxkLGgsZVthKzExXSwxNiwxODM5MDMwNTYyKSxoPWkoaCxmLGcsZCxlW2ErMTRdLDIzLC0zNTMwOTU1NiksZD1pKGQsaCxmLGcsZVthKzFdLDQsLTE1MzA5OTIwNjApLGc9aShnLGQsaCxmLGVbYSs0XSwxMSwxMjcyODkzMzUzKSxmPWkoZixnLGQsaCxlW2ErN10sMTYsLTE1NTQ5NzYzMiksaD1pKGgsZixnLGQsZVthKzEwXSwyMywtMTA5NDczMDY0MCksZD1pKGQsaCxmLGcsZVthKzEzXSw0LDY4MTI3OTE3NCksZz1pKGcsZCxoLGYsZVthXSwxMSwtMzU4NTM3MjIyKSxmPWkoZixnLGQsaCxlW2ErM10sMTYsLTcyMjUyMTk3OSksaD1pKGgsZixnLGQsZVthKzZdLDIzLDc2MDI5MTg5KSxkPWkoZCxoLGYsZyxlW2ErOV0sNCwtNjQwMzY0NDg3KSxnPWkoZyxkLGgsZixlW2ErMTJdLDExLC00MjE4MTU4MzUpLGY9aShmLGcsZCxoLGVbYSsxNV0sMTYsNTMwNzQyNTIwKSxkPXMoZCxoPWkoaCxmLGcsZCxlW2ErMl0sMjMsLTk5NTMzODY1MSksZixnLGVbYV0sNiwtMTk4NjMwODQ0KSxnPXMoZyxkLGgsZixlW2ErN10sMTAsMTEyNjg5MTQxNSksZj1zKGYsZyxkLGgsZVthKzE0XSwxNSwtMTQxNjM1NDkwNSksaD1zKGgsZixnLGQsZVthKzVdLDIxLC01NzQzNDA1NSksZD1zKGQsaCxmLGcsZVthKzEyXSw2LDE3MDA0ODU1NzEpLGc9cyhnLGQsaCxmLGVbYSszXSwxMCwtMTg5NDk4NjYwNiksZj1zKGYsZyxkLGgsZVthKzEwXSwxNSwtMTA1MTUyMyksaD1zKGgsZixnLGQsZVthKzFdLDIxLC0yMDU0OTIyNzk5KSxkPXMoZCxoLGYsZyxlW2ErOF0sNiwxODczMzEzMzU5KSxnPXMoZyxkLGgsZixlW2ErMTVdLDEwLC0zMDYxMTc0NCksZj1zKGYsZyxkLGgsZVthKzZdLDE1LC0xNTYwMTk4MzgwKSxoPXMoaCxmLGcsZCxlW2ErMTNdLDIxLDEzMDkxNTE2NDkpLGQ9cyhkLGgsZixnLGVbYSs0XSw2LC0xNDU1MjMwNzApLGc9cyhnLGQsaCxmLGVbYSsxMV0sMTAsLTExMjAyMTAzNzkpLGY9cyhmLGcsZCxoLGVbYSsyXSwxNSw3MTg3ODcyNTkpLGg9cyhoLGYsZyxkLGVbYSs5XSwyMSwtMzQzNDg1NTUxKSxkPXQoZCxjKSxoPXQoaCx1KSxmPXQoZixsKSxnPXQoZyxwKTtyZXR1cm5bZCxoLGYsZ119ZnVuY3Rpb24gYyhlKXt2YXIgdCxuPSIiLHI9MzIqZS5sZW5ndGg7Zm9yKHQ9MDt0PHI7dCs9OCluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbdD4+NV0+Pj50JTMyJjI1NSk7cmV0dXJuIG59ZnVuY3Rpb24gdShlKXt2YXIgdCxuPVtdO2ZvcihuWyhlLmxlbmd0aD4+MiktMV09dm9pZCAwLHQ9MDt0PG4ubGVuZ3RoO3QrPTEpblt0XT0wO3ZhciByPTgqZS5sZW5ndGg7Zm9yKHQ9MDt0PHI7dCs9OCluW3Q+PjVdfD0oMjU1JmUuY2hhckNvZGVBdCh0LzgpKTw8dCUzMjtyZXR1cm4gbn1mdW5jdGlvbiBsKGUpe3ZhciB0LG4scj0iMDEyMzQ1Njc4OWFiY2RlZiIsbz0iIjtmb3Iobj0wO248ZS5sZW5ndGg7bis9MSl0PWUuY2hhckNvZGVBdChuKSxvKz1yLmNoYXJBdCh0Pj4+NCYxNSkrci5jaGFyQXQoMTUmdCk7cmV0dXJuIG99ZnVuY3Rpb24gcChlKXtyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKX1mdW5jdGlvbiBkKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gYyhhKHUoZSksOCplLmxlbmd0aCkpfShwKGUpKX1mdW5jdGlvbiBoKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvPXUoZSksaT1bXSxzPVtdO2ZvcihpWzE1XT1zWzE1XT12b2lkIDAsby5sZW5ndGg+MTYmJihvPWEobyw4KmUubGVuZ3RoKSksbj0wO248MTY7bis9MSlpW25dPTkwOTUyMjQ4Nl5vW25dLHNbbl09MTU0OTU1NjgyOF5vW25dO3JldHVybiByPWEoaS5jb25jYXQodSh0KSksNTEyKzgqdC5sZW5ndGgpLGMoYShzLmNvbmNhdChyKSw2NDApKX0ocChlKSxwKHQpKX0odGhpc3x8Z2xvYmFsVGhpcykubWQ1PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD9uP2godCxlKTpsKGgodCxlKSk6bj9kKGUpOmwoZChlKSl9fSgpfSw0Mzk6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0LkNoYXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmdldExvZygpLG89dC5Mb2dDb21wb25lbnQuQ0hBVCxpPWZ1bmN0aW9uKG4scil7dC5wdWJsaXNoTWV0cmljKHtuYW1lOm4sY29udGFjdElkOmUuY29udGFjdElkLGRhdGE6cnx8ZX0pfSxzPWZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW9uQnJva2VuKChmdW5jdGlvbihlKXtyLmVycm9yKG8sIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iLGUpfSkpLGUub25Db25uZWN0aW9uRXN0YWJsaXNoZWQoKGZ1bmN0aW9uKGUpe3IuaW5mbyhvLCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIsZSl9KSl9O3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtpKCJDaGF0IG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIsZS5jb250YWN0SWQpLHIuaW5mbyhvLCJDaGF0IG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LkNoYXRTZXNzaW9uLnNldEdsb2JhbENvbmZpZyh7bG9nZ2VyQ29uZmlnOntsb2dnZXI6cn0scmVnaW9uOm4ucmVnaW9ufSk7dmFyIGE9dC5DaGF0U2Vzc2lvbi5jcmVhdGUoe2NoYXREZXRhaWxzOmUsdHlwZToiQUdFTlQiLHdlYnNvY2tldE1hbmFnZXI6dC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKX0pO3JldHVybiBzKGEpLGEuY29ubmVjdCgpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiByLmluZm8obywiQ2hhdCBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCBmb3IgY29udGFjdElkICVzIixlLmNvbnRhY3RJZCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIixlLmNvbnRhY3RJZCksYX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7dGhyb3cgci5lcnJvcihvLCJDaGF0IFNlc3Npb24gZXN0YWJsaXNoZW1lbnQgZmFpbGVkIGZvciBjb250YWN0ICVzIixlLmNvbnRhY3RJZCkud2l0aEV4Y2VwdGlvbih0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQiLGUuY29udGFjdElkLHQpLHR9KSl9KCl9fX19KCl9LDI3OTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuTWVkaWFGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9bmV3IFNldCxvPXQuZ2V0TG9nKCksaT10LkxvZ0NvbXBvbmVudC5DSEFULHM9dC5tZXJnZSh7fSxlKXx8e307cy5yZWdpb249cy5yZWdpb258fCJ1cy13ZXN0LTIiO3ZhciBhPWZ1bmN0aW9uKGUpe25bZV0mJiFyLmhhcyhlKSYmKG8uaW5mbyhpLCJEZXN0cm95aW5nIG1lZGlhQ29udHJvbGxlciBmb3IgJXMiLGUpLHIuYWRkKGUpLG5bZV0udGhlbigoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgY29udHJvbGxlci5jbGVhblVwJiZjb250cm9sbGVyLmNsZWFuVXAoKSxkZWxldGUgbltlXSxyLmRlbGV0ZShlKX0pKS5jYXRjaCgoZnVuY3Rpb24oKXtkZWxldGUgbltlXSxyLmRlbGV0ZShlKX0pKSl9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KGUpP2Z1bmN0aW9uKGUpe3ZhciByPWUuZ2V0Q29ubmVjdGlvbklkKCk7aWYoIWUuZ2V0TWVkaWFJbmZvKCkpcmV0dXJuIG8uZXJyb3IoaSwiTWVkaWEgaW5mbyBkb2VzIG5vdCBleGlzdCBmb3IgYSBtZWRpYSB0eXBlICVzIixlLmdldE1lZGlhVHlwZSgpKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksUHJvbWlzZS5yZWplY3QoIk1lZGlhIGluZm8gZG9lcyBub3QgZXhpc3QgZm9yIHRoaXMgY29ubmVjdGlvbiIpO2lmKG5bcl0pcmV0dXJuIG5bcl07c3dpdGNoKG8uaW5mbyhpLCJtZWRpYSBjb250cm9sbGVyIG9mIHR5cGUgJXMgaW5pdCIsZS5nZXRNZWRpYVR5cGUoKSkud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuZ2V0TWVkaWFUeXBlKCkpe2Nhc2UgdC5NZWRpYVR5cGUuQ0hBVDpyZXR1cm4gbltyXT1uZXcgdC5DaGF0TWVkaWFDb250cm9sbGVyKGUuZ2V0TWVkaWFJbmZvKCkscykuZ2V0KCk7Y2FzZSB0Lk1lZGlhVHlwZS5TT0ZUUEhPTkU6cmV0dXJuIG5bcl09bmV3IHQuU29mdHBob25lTWVkaWFDb250cm9sbGVyKGUuZ2V0TWVkaWFJbmZvKCkpLmdldCgpO2Nhc2UgdC5NZWRpYVR5cGUuVEFTSzpyZXR1cm4gbltyXT1uZXcgdC5UYXNrTWVkaWFDb250cm9sbGVyKGUuZ2V0TWVkaWFJbmZvKCkpLmdldCgpO2RlZmF1bHQ6cmV0dXJuIG8uZXJyb3IoaSwiVW5yZWNvZ25pemVkIG1lZGlhIHR5cGUgJXMgIixlLmdldE1lZGlhVHlwZSgpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLFByb21pc2UucmVqZWN0KCl9fShlKTooYShlLmdldENvbm5lY3Rpb25JZCgpKSxQcm9taXNlLnJlamVjdCgiTWVkaWEgQ29udHJvbGxlciBpcyBubyBsb25nZXIgYXZhaWxhYmxlIGZvciB0aGlzIGNvbm5lY3Rpb24iKSl9LGRlc3Ryb3k6YX19fSgpfSw0MTg6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0LlNvZnRwaG9uZU1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbihlKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX19fX0oKX0sMTg3OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsdC5UYXNrTWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKGUpe3ZhciBuPXQuZ2V0TG9nKCkscj10LkxvZ0NvbXBvbmVudC5UQVNLLG89ZnVuY3Rpb24obixyKXt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bixjb250YWN0SWQ6ZS5jb250YWN0SWQsZGF0YTpyfHxlfSl9LGk9ZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpb25Ccm9rZW4oKGZ1bmN0aW9uKGUpe24uZXJyb3IociwiVGFzayBTZXNzaW9uIGNvbm5lY3Rpb24gYnJva2VuIikud2l0aEV4Y2VwdGlvbihlKSxvKCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iLGUpfSkpLGUub25Db25uZWN0aW9uRXN0YWJsaXNoZWQoKGZ1bmN0aW9uKGUpe24uaW5mbyhyLCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpLndpdGhPYmplY3QoZSksbygiVGFzayBTZXNzaW9uIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiLGUpfSkpfTtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7bygiVGFzayBtZWRpYSBjb250cm9sbGVyIGluaXQiLGUuY29udGFjdElkKSxuLmluZm8ociwiVGFzayBtZWRpYSBjb250cm9sbGVyIGluaXQiKS53aXRoT2JqZWN0KGUpO3ZhciBzPXQuVGFza1Nlc3Npb24uY3JlYXRlKHtjb250YWN0SWQ6ZS5jb250YWN0SWQsaW5pdGlhbENvbnRhY3RJZDplLmluaXRpYWxDb250YWN0SWQsd2Vic29ja2V0TWFuYWdlcjp0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpfSk7cmV0dXJuIGkocykscy5jb25uZWN0KCkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gbi5pbmZvKHIsIlRhc2sgU2Vzc2lvbiBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQgZm9yIGNvbnRhY3RJZCAlcyIsZS5jb250YWN0SWQpLG8oIlRhc2sgU2Vzc2lvbiBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQiLGUuY29udGFjdElkKSxzfSkpLmNhdGNoKChmdW5jdGlvbih0KXt0aHJvdyBuLmVycm9yKHIsIlRhc2sgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQgZm9yIGNvbnRhY3QgJXMiLGUuY29udGFjdElkKS53aXRoRXhjZXB0aW9uKHQpLG8oIkNoYXQgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQiLGUuY29udGFjdElkLHQpLHR9KSl9KCl9fX19KCl9LDc0MzooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPWZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7aWYodGhpcy5fcHJldkNvbnRhY3RJZD1udWxsLHQuYXNzZXJ0Tm90TnVsbChuLCJyaW5ndG9uZUNvbmZpZyIpLCFuLnJpbmd0b25lVXJsKXRocm93IG5ldyBFcnJvcigicmluZ3RvbmVVcmwgaXMgcmVxdWlyZWQhIik7ZS5BdWRpbyYmdm9pZCAwIT09ZS5Qcm9taXNlP3RoaXMuX3BsYXlhYmxlQXVkaW9Qcm9taXNlPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLG8pe3IuX2F1ZGlvPW5ldyBBdWRpbyhuLnJpbmd0b25lVXJsKSxyLl9hdWRpby5sb29wPSEwLHIuX2F1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoImNhbnBsYXkiLChmdW5jdGlvbigpe3QuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgaXMgcmVhZHkgdG8gcGxheTogIiwrbi5yaW5ndG9uZVVybCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLl9hdWRpb1BsYXlhYmxlPSEwLGUoci5fYXVkaW8pfSkpfSkpOih0aGlzLl9hdWRpbz1udWxsLHQuZ2V0TG9nKCkuZXJyb3IoIlVuYWJsZSB0byBwcm92aWRlIGEgcmluZ3RvbmUuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksci5fZHJpdmVSaW5ndG9uZSgpfTtuLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkLiIpfSxuLnByb3RvdHlwZS5fc3RhcnRSaW5ndG9uZT1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3RoaXMuX2F1ZGlvJiYodGhpcy5fYXVkaW8ucGxheSgpLnRoZW4oKGZ1bmN0aW9uKCl7bi5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBTdGFydCIsZSksdC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBTdGFydCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHIpe24uX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgUGxheWJhY2sgRmFpbHVyZSIsZSksdC5nZXRMb2coKS5lcnJvcigiUmluZ3RvbmUgUGxheWJhY2sgRmFpbHVyZSIpLndpdGhFeGNlcHRpb24ocikud2l0aE9iamVjdCh7Y3VycmVudFNyYzpuLl9hdWRpby5jdXJyZW50U3JjLHNpbmtJZDpuLl9hdWRpby5zaW5rSWQsdm9sdW1lOm4uX2F1ZGlvLnZvbHVtZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSksdC5nZXRMb2coKS5pbmZvKGBBdHRlbXB0aW5nIHRvIHN0YXJ0IHJpbmd0b25lIHRvIGRldmljZSAke3RoaXMuX2F1ZGlvLnNpbmtJZHx8IicnIn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0sbi5wcm90b3R5cGUuX3N0b3BSaW5ndG9uZT1mdW5jdGlvbihlKXt0aGlzLl9hdWRpbyYmKHRoaXMuX2F1ZGlvLnBhdXNlKCksdGhpcy5fYXVkaW8uY3VycmVudFRpbWU9MCx0aGlzLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIFN0b3AiLGUpLHQuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgU3RvcCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSxuLnByb3RvdHlwZS5zdG9wUmluZ3RvbmU9ZnVuY3Rpb24oKXt0aGlzLl9zdG9wUmluZ3RvbmUoKX0sbi5wcm90b3R5cGUuX3Jpbmd0b25lU2V0dXA9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlJJTkdUT05FLChmdW5jdGlvbigpe24uX3N0YXJ0UmluZ3RvbmUoZSksbi5fcHJldkNvbnRhY3RJZD1lLmdldENvbnRhY3RJZCgpLGUub25Db25uZWN0ZWQobGlseS5oaXRjaChuLG4uX3N0b3BSaW5ndG9uZSkpLGUub25BY2NlcHRlZChsaWx5LmhpdGNoKG4sbi5fc3RvcFJpbmd0b25lKSksZS5vbkVuZGVkKGxpbHkuaGl0Y2gobixuLl9zdG9wUmluZ3RvbmUpKSxlLm9uUmVmcmVzaCgoZnVuY3Rpb24oZSl7ZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZlLmdldFN0YXR1cygpLnR5cGUhPT10LkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HJiZuLl9zdG9wUmluZ3RvbmUoKX0pKX0pKX0sbi5wcm90b3R5cGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudD1mdW5jdGlvbihlLG4pe24mJm4uZ2V0Q29udGFjdElkKCkmJnQucHVibGlzaE1ldHJpYyh7bmFtZTplLGNvbnRhY3RJZDpuLmdldENvbnRhY3RJZCgpfSl9LG4ucHJvdG90eXBlLnNldE91dHB1dERldmljZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGxheWFibGVBdWRpb1Byb21pc2U/UHJvbWlzZS5yYWNlKFt0aGlzLl9wbGF5YWJsZUF1ZGlvUHJvbWlzZSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtlLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHBsYXlhYmxlIGF1ZGlvIil9KSwzZTMpfSkpXSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuc2V0U2lua0lkP2Uuc2V0U2lua0lkKHQpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGBSaW5ndG9uZUVuZ2luZUJhc2Uuc2V0T3V0cHV0RGV2aWNlIGZhaWxlZDogYXVkaW8uc2V0U2lua0lkKCkgZmFpbGVkIHdpdGggZXJyb3IgJHtlfWApfSkpOlByb21pc2UucmVqZWN0KGBSaW5ndG9uZUVuZ2luZUJhc2Uuc2V0T3V0cHV0RGV2aWNlIGZhaWxlZDogJHtlPyJhdWRpbyI6ImF1ZGlvLnNldFNpbmtJZCJ9IG5vdCBmb3VuZC5gKX0pKTplLlByb21pc2U/UHJvbWlzZS5yZWplY3QoIk5vdCBlbGlnaWJsZSByaW5ndG9uZSBvd25lciIpOnZvaWQgMH07dmFyIHI9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1mdW5jdGlvbihuKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuVk9JQ0UmJm4uaXNTb2Z0cGhvbmVDYWxsKCkmJm4uaXNJbmJvdW5kKCkmJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9O3QuY29udGFjdCgoZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpbmcobil9KSksKG5ldyB0LkFnZW50KS5nZXRDb250YWN0cygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmbihlKX0pKX07dmFyIG89ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1mdW5jdGlvbihuKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuQ0hBVCYmbi5pc0luYm91bmQoKSYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJDaGF0IFJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiQ2hhdCBSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9O3QuY29udGFjdCgoZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpbmcobil9KSl9O3ZhciBpPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49ZnVuY3Rpb24obil7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLlRBU0smJm4uaXNJbmJvdW5kKCkmJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiVGFzayBSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIlRhc2sgUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfTt0LmNvbnRhY3QoKGZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW5nKG4pfSkpfTt2YXIgcz1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1zLHMucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LmNvbnRhY3QoKGZ1bmN0aW9uKG4pe24ub25JbmNvbWluZygoZnVuY3Rpb24oKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuUVVFVUVfQ0FMTEJBQ0smJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiQ2FsbGJhY2sgUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJDYWxsYmFjayBSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9KSl9KSl9LHQuVm9pY2VSaW5ndG9uZUVuZ2luZT1yLHQuQ2hhdFJpbmd0b25lRW5naW5lPW8sdC5UYXNrUmluZ3RvbmVFbmdpbmU9aSx0LlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZT1zfSgpfSw2NDI6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCxlLmNjcFZlcnNpb249IlYyIjt2YXIgbj17fTtuW3QuU29mdHBob25lQ2FsbFR5cGUuQVVESU9fT05MWV09IkF1ZGlvIixuW3QuU29mdHBob25lQ2FsbFR5cGUuVklERU9fT05MWV09IlZpZGVvIixuW3QuU29mdHBob25lQ2FsbFR5cGUuQVVESU9fVklERU9dPSJBdWRpb1ZpZGVvIixuW3QuU29mdHBob25lQ2FsbFR5cGUuTk9ORV09Ik5vbmUiO3ZhciByPSJhdWRpb19pbnB1dCIsbz0iYXVkaW9fb3V0cHV0Ijsoe30pW3QuQ29udGFjdFR5cGUuVk9JQ0VdPSJWb2ljZSI7dmFyIGk9W10scz1bXSxhPVtdLGM9e30sdT17fSxsPTAscD0wLGQ9MCxoPTAsZj0wLGc9bnVsbCxtPW51bGwsdj1udWxsLHk9dC5Tb2Z0cGhvbmVFcnJvclR5cGVzLEU9e30sUz10LnJhbmRvbUlkKCksYj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9UUkFOU1BPUlQsZSx7c3VjY2VzczpmdW5jdGlvbihlKXtuKGUuc29mdHBob25lVHJhbnNwb3J0LnNvZnRwaG9uZU1lZGlhQ29ubmVjdGlvbnMpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe2UubWVzc2FnZSYmZS5tZXNzYWdlLmluY2x1ZGVzKCJTb2Z0cGhvbmVDb25uZWN0aW9uTGltaXRCcmVhY2hlZEV4Y2VwdGlvbiIpJiZ4KCJtdWx0aXBsZV9zb2Z0cGhvbmVfYWN0aXZlX3Nlc3Npb25zIiwiTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBhcmUgbW9yZSB0aGVuIGFsbG93ZWQgbGltaXQuIiwiIikscihFcnJvcigicmVxdWVzdEljZUFjY2VzcyBmYWlsZWQiKSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7cihFcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIHJlcXVlc3RJY2VBY2Nlc3MiKSl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbigpe3IoRXJyb3IoIkFjY2VzcyBEZW5pZWQgd2hpbGUgcmVxdWVzdEljZUFjY2VzcyIpKX19KX0pKX0sVD1mdW5jdGlvbihlPXt9KXt2YXIgbixyPXRoaXM7KHY9bmV3IEoodC5nZXRMb2coKSkpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gc29mdHBob25lIG1hbmFnZXIgaW5pdGlhbGl6YXRpb24gaGFzIGJlZ3VuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LlJ0Y1BlZXJDb25uZWN0aW9uRmFjdG9yeSYmKG49bmV3IHQuUnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5KHYsdC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSxTLHQuaGl0Y2gocixiLHt0cmFuc3BvcnRUeXBlOiJzb2Z0cGhvbmUiLHNvZnRwaG9uZUNsaWVudElkOlN9KSx0LmhpdGNoKHIseCkpKSxULmlzQnJvd3NlclNvZnRQaG9uZVN1cHBvcnRlZCgpfHx4KHkuVU5TVVBQT1JURURfQlJPV1NFUiwiQ29ubmVjdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYnJvd3Nlci4gU29tZSBmdW5jdGlvbmFsaXR5IG1heSBub3Qgd29yay4gIiwiIiksUCh7c3VjY2VzczpmdW5jdGlvbihlKXtVKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOiJncmFudGVkIn0pfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3goZSwiWW91ciBtaWNyb3Bob25lIGlzIG5vdCBlbmFibGVkIGluIHlvdXIgYnJvd3Nlci4gIiwiIiksVSgiQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQiLG51bGwse2Nvbm5lY3Rpdml0eUNoZWNrVHlwZToiTWljcm9waG9uZVBlcm1pc3Npb24iLHN0YXR1czoiZGVuaWVkIn0pfX0pO2NvbnN0IG89SSgpLGk9QSgpLHM9XyghZS5kaXNhYmxlRWNob0NhbmNlbGxhdGlvbik7dygpLHRoaXMucmluZ3RvbmVFbmdpbmU9bnVsbDt2YXIgYT17fSxjPXt9LHU9ITEsbD1udWxsLHA9bnVsbCxkPWZ1bmN0aW9uKCl7dT0hMSxsPW51bGwscD1udWxsfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFbZV19LHRoaXMucmVwbGFjZUxvY2FsTWVkaWFUcmFjaz1mdW5jdGlvbihlLHQpe3ZhciBuPUVbZV0uc3RyZWFtO2lmKG4pe3ZhciByPW4uZ2V0QXVkaW9UcmFja3MoKVswXTt0LmVuYWJsZWQ9ci5lbmFibGVkLHIuZW5hYmxlZD0hMSxuLnJlbW92ZVRyYWNrKHIpLG4uYWRkVHJhY2sodCl9fTt2YXIgaD1mdW5jdGlvbihlKXtpZihhLmhhc093blByb3BlcnR5KGUpKXt2YXIgdD1hW2VdO25ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe2RlbGV0ZSBhW2VdLGRlbGV0ZSBjW2VdLHQuaGFuZ3VwKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2xpbHkuZ2V0TG9nKCkud2FybigiQ2xlYW4gdXAgdGhlIHNlc3Npb24gbG9jYWxseSAiK2UsdC5tZXNzYWdlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpfX07dGhpcy5zdGFydFNlc3Npb249ZnVuY3Rpb24ocixvKXt2YXIgaT11P2w6cixzPXU/cDpvO2lmKGkmJnMpe2QoKSxjW3NdPSEwLHYuaW5mbygiU29mdHBob25lIGNhbGwgZGV0ZWN0ZWQ6IiwiY29udGFjdElkICIraS5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrcykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxmdW5jdGlvbihlKXtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCl7Zm9yKHZhciB0IGluIGUpZS5oYXNPd25Qcm9wZXJ0eSh0KSYmKEYoIk11bHRpU2Vzc2lvbkhhbmdVcCIsZVt0XS5jYWxsSWQsdCksaCh0KSk7dGhyb3cgbmV3IEVycm9yKCJkdXBsaWNhdGUgc2Vzc2lvbiBkZXRlY3RlZCwgcmVmdXNpbmcgdG8gc2V0dXAgbmV3IGNvbm5lY3Rpb24iKX19KGEpLGkuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmVSgiU29mdHBob25lIENvbm5lY3RpbmciLGkuZ2V0Q29udGFjdElkKCkpLFYoKTt2YXIgZixnPWkuZ2V0QWdlbnRDb25uZWN0aW9uKCkuZ2V0U29mdHBob25lTWVkaWFJbmZvKCksbT1EKGcuY2FsbENvbmZpZ0pzb24pO20udXNlV2ViU29ja2V0UHJvdmlkZXImJihmPXQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyKCkpO3ZhciB5PW5ldyB0LlJUQ1Nlc3Npb24obS5zaWduYWxpbmdFbmRwb2ludCxtLmljZVNlcnZlcnMsZy5jYWxsQ29udGV4dFRva2VuLHYsaS5nZXRDb250YWN0SWQoKSxzLGYpO3kuZWNob0NhbmNlbGxhdGlvbj0hZS5kaXNhYmxlRWNob0NhbmNlbGxhdGlvbixhW3NdPXksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25uZWN0aW9uRXZlbnRzLlNFU1NJT05fSU5JVCxkYXRhOntjb25uZWN0aW9uSWQ6c319KSx5Lm9uU2Vzc2lvbkZhaWxlZD1mdW5jdGlvbihlLHQpe2RlbGV0ZSBhW3NdLGRlbGV0ZSBjW3NdLE8oZSx0KSxNKGkuZ2V0Q29udGFjdElkKCksdCksWChpLGUuc2Vzc2lvblJlcG9ydCl9LHkub25TZXNzaW9uQ29ubmVjdGVkPWZ1bmN0aW9uKGUpe1UoIlNvZnRwaG9uZSBTZXNzaW9uIENvbm5lY3RlZCIsaS5nZXRDb250YWN0SWQoKSksdC5iZWNvbWVNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU0VORF9MT0dTKSxqKGUpLEIoaSksQyhpKX0seS5vblNlc3Npb25Db21wbGV0ZWQ9ZnVuY3Rpb24oZSl7VSgiU29mdHBob25lIFNlc3Npb24gQ29tcGxldGVkIixpLmdldENvbnRhY3RJZCgpKSxkZWxldGUgYVtzXSxkZWxldGUgY1tzXSxYKGksZS5zZXNzaW9uUmVwb3J0KSxSKHMpfSx5Lm9uTG9jYWxTdHJlYW1BZGRlZD1mdW5jdGlvbihlLG4pe0Vbc109e3N0cmVhbTpufSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkFnZW50RXZlbnRzLkxPQ0FMX01FRElBX1NUUkVBTV9DUkVBVEVELGRhdGE6e2Nvbm5lY3Rpb25JZDpzfX0pfSx5LnJlbW90ZUF1ZGlvRWxlbWVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3RlLWF1ZGlvIiksbj95LmNvbm5lY3Qobi5nZXQobS5pY2VTZXJ2ZXJzKSk6eS5jb25uZWN0KCl9fTt2YXIgZj1mdW5jdGlvbihlLG4pe2Fbbl0mJmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkVOREVEfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkVSUk9SfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLk1JU1NFRH0oZSkmJihoKG4pLGQoKSksIWUuaXNTb2Z0cGhvbmVDYWxsKCl8fGNbbl18fGUuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5JTkNPTUlOR3x8KHQuaXNGaXJlZm94QnJvd3NlcigpJiZ0Lmhhc090aGVyQ29ubmVjdGVkQ0NQcygpP2Z1bmN0aW9uKGUsdCl7dT0hMCxsPWUscD10fShlLG4pOnIuc3RhcnRTZXNzaW9uKGUsbikpfSxnPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QWdlbnRDb25uZWN0aW9uKCkuY29ubmVjdGlvbklkO3YuaW5mbygiQ29udGFjdCBkZXRlY3RlZDoiLCJjb250YWN0SWQgIitlLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIit0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGNbdF18fChlLm9uUmVmcmVzaCgoZnVuY3Rpb24oKXtmKGUsdCl9KSksZS5vbkRlc3Ryb3koKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUpe2FbZV0mJmgoZSl9KHQpfSkpKX07ci5vbkluaXRDb250YWN0U3ViPXQuY29udGFjdChnKSwobmV3IHQuQWdlbnQpLmdldENvbnRhY3RzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBZ2VudENvbm5lY3Rpb24oKS5jb25uZWN0aW9uSWQ7di5pbmZvKCJDb250YWN0IGV4aXN0IGluIHRoZSBzbmFwc2hvdC4gUmVpbml0aWF0ZSB0aGUgQ29udGFjdCBhbmQgUlRDIHNlc3Npb24gY3JlYXRpb24gZm9yIGNvbnRhY3RJZCIrZS5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrdCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxnKGUpLGYoZSx0KX0pKSx0aGlzLnRlcm1pbmF0ZT0oKT0+e3Iub25Jbml0Q29udGFjdFN1YiYmci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlJiZyLm9uSW5pdENvbnRhY3RTdWIudW5zdWJzY3JpYmUoKSxvJiZvLnVuc3Vic2NyaWJlJiZvLnVuc3Vic2NyaWJlKCksaSYmaS51bnN1YnNjcmliZSYmaS51bnN1YnNjcmliZSgpLHMmJnMudW5zdWJzY3JpYmUmJnMudW5zdWJzY3JpYmUoKSxuLmNsZWFySWRsZVJ0Y1BlZXJDb25uZWN0aW9uVGltZXJJZCYmbi5jbGVhcklkbGVSdGNQZWVyQ29ubmVjdGlvblRpbWVySWQoKSxuPW51bGx9fSxDPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRVcHN0cmVhbSgpLHI9ZS5nZXRBZ2VudENvbm5lY3Rpb24oKTtpZihyKXt2YXIgbz1yLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpO28/ITA9PT1vLmF1dG9BY2NlcHQ/KHYuaW5mbygiQXV0by1hY2NlcHQgaXMgZW5hYmxlZCwgc2VuZGluZyBvdXQgQWNjZXB0ZWQgZXZlbnQgdG8gc3RvcCByaW5ndG9uZS4uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxkYXRhOm5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpfSksbi5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsZS5jb250YWN0SWQpLGRhdGE6bmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCl9KSk6di5pbmZvKCJBdXRvLWFjY2VwdCBpcyBkaXNhYmxlZCwgcmluZ3RvbmUgd2lsbCBiZSBzdG9wcGVkIGJ5IHVzZXIgYWN0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6di5pbmZvKCJOb3QgYWJsZSB0byByZXRyaWV2ZSB0aGUgYXV0by1hY2NlcHQgc2V0dGluZyBmcm9tIG51bGwgU29mdHBob25lTWVkaWFJbmZvLCBpZ25vcmluZyBldmVudCBwdWJsaXNoLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2Ugdi5pbmZvKCJOb3QgYWJsZSB0byByZXRyaWV2ZSB0aGUgYXV0by1hY2NlcHQgc2V0dGluZyBmcm9tIG51bGwgQWdlbnRDb25uZWN0aW9uLCBpZ25vcmluZyBldmVudCBwdWJsaXNoLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxJPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5NVVRFLGspfSxBPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1NQRUFLRVJfREVWSUNFLEwpfSxfPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9NSUNST1BIT05FX0RFVklDRSwodD0+Tih7Li4udCxlbmFibGVFY2hvQ2FuY2VsbGF0aW9uOmV9KSkpfSx3PWZ1bmN0aW9uKCl7dHJ5e3QuaXNDaHJvbWVCcm93c2VyKCkmJnQuZ2V0Q2hyb21lQnJvd3NlclZlcnNpb24oKT40MyYmbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtuYW1lOiJtaWNyb3Bob25lIn0pLnRoZW4oKGZ1bmN0aW9uKGUpe2Uub25jaGFuZ2U9ZnVuY3Rpb24oKXt2LmluZm8oIk1pY3JvcGhvbmUgUGVybWlzc2lvbjogIitlLnN0YXRlKSxVKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOmUuc3RhdGV9KSwiZGVuaWVkIj09PWUuc3RhdGUmJngoeS5NSUNST1BIT05FX05PVF9TSEFSRUQsIllvdXIgbWljcm9waG9uZSBpcyBub3QgZW5hYmxlZCBpbiB5b3VyIGJyb3dzZXIuICIsIiIpfX0pKX1jYXRjaChlKXt2LmVycm9yKCJGYWlsZWQgaW4gZGV0ZWN0aW5nIG1pY3JvcGhvbmUgcGVybWlzc2lvbiBzdGF0dXM6ICIrZSl9fSxSPWZ1bmN0aW9uKGUpe2RlbGV0ZSBFW2VdLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZGF0YTp7bXV0ZWQ6ITF9fSl9LGs9ZnVuY3Rpb24oZSl7dmFyIG47aWYoMCE9PXQua2V5cyhFKS5sZW5ndGgpe2Zvcih2YXIgciBpbiBlJiZ2b2lkIDAhPT1lLm11dGUmJihuPWUubXV0ZSksRSlpZihFLmhhc093blByb3BlcnR5KHIpKXt2YXIgbz1FW3JdLnN0cmVhbTtpZihvKXt2YXIgaT1vLmdldEF1ZGlvVHJhY2tzKClbMF07dm9pZCAwIT09bj8oaS5lbmFibGVkPSFuLEVbcl0ubXV0ZWQ9bixuP3YuaW5mbygiQWdlbnQgaGFzIG11dGVkIHRoZSBjb250YWN0LCBjb25uZWN0aW9uSWQgLSAgIityKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnYuaW5mbygiQWdlbnQgaGFzIHVubXV0ZWQgdGhlIGNvbnRhY3QsIGNvbm5lY3Rpb25JZCAtICIrcikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSk6bj1FW3JdLm11dGVkfHwhMX19dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5BZ2VudEV2ZW50cy5NVVRFX1RPR0dMRSxkYXRhOnttdXRlZDpufX0pfX0sTD1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgc3BlYWtlciBkZXZpY2UgJHtufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbil7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpO3ImJiJmdW5jdGlvbiI9PXR5cGVvZiByLnNldFNpbmtJZD9yLnNldFNpbmtJZChuKS50aGVuKCgoKT0+e3QuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU3BlYWtlciBkZXZpY2UgJHtufSBzdWNjZXNzZnVsbHkgc2V0IHRvIHNwZWFrZXIgYXVkaW8gZWxlbWVudGApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNQRUFLRVJfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6bn19KX0pKS5jYXRjaCgoZT0+e3QuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgc3BlYWtlciBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSk6dC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyByZW1vdGVBdWRpb0VsZW1lbnQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2UgdC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBkZXZpY2VJZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LE49ZnVuY3Rpb24oZT17fSl7Y29uc3Qgbj1lLmRldmljZUlkfHwiIjtpZih0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEF0dGVtcHRpbmcgdG8gc2V0IG1pY3JvcGhvbmUgZGV2aWNlICR7bn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDAhPT10LmtleXMoRSkubGVuZ3RoKWlmKG4pe3ZhciByPXQuY29yZS5nZXRTb2Z0cGhvbmVNYW5hZ2VyKCksbz17YXVkaW86e2RldmljZUlkOntleGFjdDpufX19O2UuZW5hYmxlRWNob0NhbmNlbGxhdGlvbnx8KG8uYXVkaW8uZWNob0NhbmNlbGxhdGlvbj0hMSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOkVDSE9fQ0FOQ0VMTEFUSU9OX0NIRUNLLGRhdGE6e2NvdW50OjEsZGlzYWJsZUVjaG9DYW5jZWxsYXRpb246IWUuZW5hYmxlRWNob0NhbmNlbGxhdGlvbn19KSxuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShvKS50aGVuKChlPT57dHJ5e3ZhciBvPWUuZ2V0QXVkaW9UcmFja3MoKVswXTtmb3IodmFyIGkgaW4gRSlFLmhhc093blByb3BlcnR5KGkpJiYoRVtpXS5zdHJlYW0sci5nZXRTZXNzaW9uKGkpLl9wYy5nZXRTZW5kZXJzKClbMF0ucmVwbGFjZVRyYWNrKG8pLnRoZW4oKGZ1bmN0aW9uKCl7ci5yZXBsYWNlTG9jYWxNZWRpYVRyYWNrKGksbyksdC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBNaWNyb3Bob25lIGRldmljZSAke259IHN1Y2Nlc3NmdWxseSBzZXQgdG8gbG9jYWwgbWVkaWEgc3RyZWFtIGluIFJUQ1J0cFNlbmRlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkpfWNhdGNoKGUpe3JldHVybiB2b2lkIHQuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLk1JQ1JPUEhPTkVfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6bn19KX0pKS5jYXRjaCgoZT0+e3QuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgIituKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgbWljcm9waG9uZSBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIGRldmljZUlkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTtlbHNlIHQuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU2V0dGluZyBtaWNyb3Bob25lIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgbG9jYWxNZWRpYVN0cmVhbSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LE89ZnVuY3Rpb24oZSxuKXtpZihuPT09dC5SVENFcnJvcnMuSUNFX0NPTExFQ1RJT05fVElNRU9VVCl7Zm9yKHZhciByPSJcbiIsbz0wO288ZS5faWNlU2VydmVycy5sZW5ndGg7bysrKWZvcih2YXIgaT0wO2k8ZS5faWNlU2VydmVyc1tvXS51cmxzLmxlbmd0aDtpKyspcj1yK2UuX2ljZVNlcnZlcnNbb10udXJsc1tpXSsiXG4iO3goeS5JQ0VfQ09MTEVDVElPTl9USU1FT1VULCJJY2UgY29sbGVjdGlvbiB0aW1lZG91dC4gIixyKX1lbHNlIG49PT10LlJUQ0Vycm9ycy5VU0VSX0JVU1k/eCh5LlVTRVJfQlVTWV9FUlJPUiwiU29mdHBob25lIGNhbGwgVXNlckJ1c3kgZXJyb3IuICIsIiIpOm49PT10LlJUQ0Vycm9ycy5TSUdOQUxMSU5HX0hBTkRTSEFLRV9GQUlMVVJFP3goeS5TSUdOQUxMSU5HX0hBTkRTSEFLRV9GQUlMVVJFLCJIYW5kc2hha2luZyB3aXRoIFNpZ25hbGxpbmcgU2VydmVyICIrZS5fc2lnbmFsaW5nVXJpKyIgZmFpbGVkLiAiLGUuX3NpZ25hbGluZ1VyaSk6bj09PXQuUlRDRXJyb3JzLkdVTV9USU1FT1VUX0ZBSUxVUkV8fG49PT10LlJUQ0Vycm9ycy5HVU1fT1RIRVJfRkFJTFVSRT94KHkuTUlDUk9QSE9ORV9OT1RfU0hBUkVELCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKTpuPT09dC5SVENFcnJvcnMuU0lHTkFMTElOR19DT05ORUNUSU9OX0ZBSUxVUkU/eCh5LlNJR05BTExJTkdfQ09OTkVDVElPTl9GQUlMVVJFLCJVUkwgIitlLl9zaWduYWxpbmdVcmkrIiBjYW5ub3QgYmUgcmVhY2hlZC4gIixlLl9zaWduYWxpbmdVcmkpOm49PT10LlJUQ0Vycm9ycy5DQUxMX05PVF9GT1VORD92LmVycm9yKCJTb2Z0cGhvbmUgY2FsbCBmYWlsZWQgZHVlIHRvIENhbGxOb3RGb3VuZEV4Y2VwdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOngoeS5XRUJSVENfRVJST1IsIndlYnJ0YyBzeXN0ZW0gZXJyb3IuICIsIiIpfSxEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvJnF1b3Q7L2csJyInKTtyZXR1cm4gSlNPTi5wYXJzZSh0KX0sUD1mdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0LnN1Y2Nlc3M9dC5zdWNjZXNzfHxmdW5jdGlvbigpe30sdC5mYWlsdXJlPXQuZmFpbHVyZXx8ZnVuY3Rpb24oKXt9O3ZhciBuPXthdWRpbzohMH0scj1udWxsO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlKXtpZigib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMmJiJmdW5jdGlvbiI9PXR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSlyPW5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG4pO2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEpcmV0dXJuIHZvaWQgdC5mYWlsdXJlKHkuVU5TVVBQT1JURURfQlJPV1NFUik7cj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSx0KXtuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhKG4sZSx0KX0pKX1yZXR1cm4gci50aGVuKChmdW5jdGlvbihlKXt2YXIgbj1lLmdldEF1ZGlvVHJhY2tzKCk7biYmbi5sZW5ndGg+MD90LnN1Y2Nlc3MoZSk6dC5mYWlsdXJlKHkuTUlDUk9QSE9ORV9OT1RfU0hBUkVEKX0pLChmdW5jdGlvbihlKXt0LmZhaWx1cmUoeS5NSUNST1BIT05FX05PVF9TSEFSRUQpfSkpLHJ9dC5mYWlsdXJlKHkuVU5TVVBQT1JURURfQlJPV1NFUil9LHg9ZnVuY3Rpb24oZSxuLHIpe3YuZXJyb3IoIlNvZnRwaG9uZSBlcnJvciBvY2N1cnJlZCA6ICIsZSxufHwiIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkFnZW50RXZlbnRzLlNPRlRQSE9ORV9FUlJPUixkYXRhOm5ldyB0LlNvZnRwaG9uZUVycm9yKGUsbixyKX0pfSxNPWZ1bmN0aW9uKGUsdCl7VSgiU29mdHBob25lIFNlc3Npb24gRmFpbGVkIixlLHtmYWlsZWRSZWFzb246dH0pfSxVPWZ1bmN0aW9uKGUsbixyKXt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxjb250YWN0SWQ6bixkYXRhOnJ9KX0sRj1mdW5jdGlvbihlLHQsbil7VShlLHQsW3tuYW1lOiJBZ2VudENvbm5lY3Rpb25JZCIsdmFsdWU6bn1dKSx2LmluZm8oIlB1Ymxpc2ggbXVsdGlwbGUgc2Vzc2lvbiBlcnJvciBtZXRyaWNzIixlLCJjb250YWN0SWQgIit0LCJhZ2VudCBjb25uZWN0aW9uSWQgIituKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTtULmlzQnJvd3NlclNvZnRQaG9uZVN1cHBvcnRlZD1mdW5jdGlvbigpe3JldHVybiEhKHQuaXNPcGVyYUJyb3dzZXIoKSYmdC5nZXRPcGVyYUJyb3dzZXJWZXJzaW9uKCk+MTcpfHwhISh0LmlzQ2hyb21lQnJvd3NlcigpJiZ0LmdldENocm9tZUJyb3dzZXJWZXJzaW9uKCk+MjIpfHwhISh0LmlzRmlyZWZveEJyb3dzZXIoKSYmdC5nZXRGaXJlZm94QnJvd3NlclZlcnNpb24oKT4yMSl9O3ZhciBxPWZ1bmN0aW9uKGUpe3ZhciB0PWkuc2xpY2UoKTtpPVtdLHQubGVuZ3RoPjAmJmUuc2VuZFNvZnRwaG9uZU1ldHJpY3ModCx7c3VjY2VzczpmdW5jdGlvbigpe3YuaW5mbygic2VuZFNvZnRwaG9uZU1ldHJpY3Mgc3VjY2VzcyIrSlNPTi5zdHJpbmdpZnkodCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7di5lcnJvcigic2VuZFNvZnRwaG9uZU1ldHJpY3MgZmFpbGVkLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KX0saj1mdW5jdGlvbihlKXtnPXdpbmRvdy5zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtlLmdldFVzZXJBdWRpb1N0YXRzKCkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9YyxuPVcoYz1lLHQscik7aS5wdXNoKG4pLEgobil9KSwoZnVuY3Rpb24oZSl7di5kZWJ1ZygiRmFpbGVkIHRvIGdldCB1c2VyIGF1ZGlvIHN0YXRzLiIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSxlLmdldFJlbW90ZUF1ZGlvU3RhdHMoKS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD11LG49Vyh1PWUsdCxvKTtpLnB1c2gobiksSChuKX0pLChmdW5jdGlvbihlKXt2LmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHJlbW90ZSBhdWRpbyBzdGF0cy4iLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSwxZTMpfSxCPWZ1bmN0aW9uKGUpe209d2luZG93LnNldEludGVydmFsKChmdW5jdGlvbigpe3EoZSl9KSwzZTQpfSxWPWZ1bmN0aW9uKCl7Yz1udWxsLHU9bnVsbCxpPVtdLHM9W10sYT1bXSxnPW51bGwsbT1udWxsLGw9MCxwPTAsZD0wLGg9MCxmPTB9LFc9ZnVuY3Rpb24oZSx0LG4pe2lmKHQmJmUpe3ZhciByPWUucGFja2V0c0xvc3Q+dC5wYWNrZXRzTG9zdD9lLnBhY2tldHNMb3N0LXQucGFja2V0c0xvc3Q6MCxvPWUucGFja2V0c0NvdW50PnQucGFja2V0c0NvdW50P2UucGFja2V0c0NvdW50LXQucGFja2V0c0NvdW50OjA7cmV0dXJuIHoobyxuKSxHKGUuYXVkaW9MZXZlbCxuKSxuZXcgWShlLnRpbWVzdGFtcCxyLG8sbixlLmF1ZGlvTGV2ZWwsZS5qYk1pbGxpc2Vjb25kcyxlLnJ0dE1pbGxpc2Vjb25kcyl9cmV0dXJuIG5ldyBZKGUudGltZXN0YW1wLGUucGFja2V0c0xvc3QsZS5wYWNrZXRzQ291bnQsbixlLmF1ZGlvTGV2ZWwsZS5qYk1pbGxpc2Vjb25kcyxlLnJ0dE1pbGxpc2Vjb25kcyl9LEg9ZnVuY3Rpb24oZSl7aWYoZS5zb2Z0cGhvbmVTdHJlYW1UeXBlPT09cil7Zm9yKDtzLmxlbmd0aD49MTA4MDA7KXMuc2hpZnQoKTtzLnB1c2goZSl9ZWxzZSBpZihlLnNvZnRwaG9uZVN0cmVhbVR5cGU9PT1vKXtmb3IoO2EubGVuZ3RoPj0xMDgwMDspYS5zaGlmdCgpO2EucHVzaChlKX19LHo9ZnVuY3Rpb24oZSx0KXt0PT09cj8oZisrLGU8PTA/bCsrOmw9MCk6dD09PW8mJihlPD0wP2QrKzpkPTApfSxHPWZ1bmN0aW9uKGUsdCl7dD09PXI/bnVsbCE9PWUmJmU8PTE/cCsrOnA9MDp0PT09byYmKG51bGwhPT1lJiZlPD0xP2grKzpoPTApfSxLPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwoZSksbnVsbH0sWD1mdW5jdGlvbihuLGkpe2c9SyhnKSxtPUsobSksZnVuY3Rpb24obixpLGMsdSl7aS5zdHJlYW1TdGF0cz1bJChjLHIpLCQodSxvKV07dmFyIGc9e2NhbGxTdGFydFRpbWU6aS5zZXNzaW9uU3RhcnRUaW1lLGNhbGxFbmRUaW1lOmkuc2Vzc2lvbkVuZFRpbWUsZ3VtVGltZU1pbGxpczppLmd1bVRpbWVNaWxsaXMsaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzOmkuaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzLGljZUNvbGxlY3Rpb25UaW1lTWlsbGlzOmkuaWNlQ29sbGVjdGlvblRpbWVNaWxsaXMsc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzOmkuc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzLGhhbmRzaGFraW5nVGltZU1pbGxpczppLmhhbmRzaGFraW5nVGltZU1pbGxpcyxwcmVUYWxraW5nVGltZU1pbGxpczppLnByZVRhbGtpbmdUaW1lTWlsbGlzLHRhbGtpbmdUaW1lTWlsbGlzOmkudGFsa2luZ1RpbWVNaWxsaXMsY2xlYW51cFRpbWVNaWxsaXM6aS5jbGVhbnVwVGltZU1pbGxpcyxpY2VDb2xsZWN0aW9uRmFpbHVyZTppLmljZUNvbGxlY3Rpb25GYWlsdXJlLHNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZTppLnNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZSxoYW5kc2hha2luZ0ZhaWx1cmU6aS5oYW5kc2hha2luZ0ZhaWx1cmUsZ3VtT3RoZXJGYWlsdXJlOmkuZ3VtT3RoZXJGYWlsdXJlLGd1bVRpbWVvdXRGYWlsdXJlOmkuZ3VtVGltZW91dEZhaWx1cmUsY3JlYXRlT2ZmZXJGYWlsdXJlOmkuY3JlYXRlT2ZmZXJGYWlsdXJlLHNldExvY2FsRGVzY3JpcHRpb25GYWlsdXJlOmkuc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmUsdXNlckJ1c3lGYWlsdXJlOmkudXNlckJ1c3lGYWlsdXJlLGludmFsaWRSZW1vdGVTRFBGYWlsdXJlOmkuaW52YWxpZFJlbW90ZVNEUEZhaWx1cmUsbm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlOmkubm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlLHNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZTppLnNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOmkuc3RyZWFtU3RhdHN9O24uc2VuZFNvZnRwaG9uZVJlcG9ydChnLHtzdWNjZXNzOmZ1bmN0aW9uKCl7di5pbmZvKCJzZW5kU29mdHBob25lUmVwb3J0IHN1Y2Nlc3MiK0pTT04uc3RyaW5naWZ5KGcpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3YuZXJyb3IoInNlbmRTb2Z0cGhvbmVSZXBvcnQgZmFpbGVkLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KTt2YXIgbT17QVVESU9fSU5QVVQ6e3BhY2tldHNDb3VudDpzLm1hcCgoZT0+ZS5wYWNrZXRzQ291bnQpKSxwYWNrZXRzTG9zdDpzLm1hcCgoZT0+ZS5wYWNrZXRzTG9zdCkpLGF1ZGlvTGV2ZWw6cy5tYXAoKGU9PmUuYXVkaW9MZXZlbCkpLGppdHRlckJ1ZmZlck1pbGxpczpzLm1hcCgoZT0+ZS5qaXR0ZXJCdWZmZXJNaWxsaXMpKX0sQVVESU9fT1VUUFVUOntwYWNrZXRzQ291bnQ6YS5tYXAoKGU9PmUucGFja2V0c0NvdW50KSkscGFja2V0c0xvc3Q6YS5tYXAoKGU9PmUucGFja2V0c0xvc3QpKSxhdWRpb0xldmVsOmEubWFwKChlPT5lLmF1ZGlvTGV2ZWwpKSxqaXR0ZXJCdWZmZXJNaWxsaXM6YS5tYXAoKGU9PmUuaml0dGVyQnVmZmVyTWlsbGlzKSkscm91bmRUcmlwVGltZU1pbGxpczphLm1hcCgoZT0+ZS5yb3VuZFRyaXBUaW1lTWlsbGlzKSl9fSx5PXsuLi5nLHNvZnRwaG9uZVN0cmVhbVBlclNlY29uZFN0YXRpc3RpY3M6bSxpY2VDb25uZWN0aW9uc0xvc3Q6aS5pY2VDb25uZWN0aW9uc0xvc3QsaWNlQ29ubmVjdGlvbnNGYWlsZWQ6aS5pY2VDb25uZWN0aW9uc0ZhaWxlZHx8bnVsbCxwZWVyQ29ubmVjdGlvbkZhaWxlZDppLnBlZXJDb25uZWN0aW9uRmFpbGVkfHxudWxsLHJ0Y0pzVmVyc2lvbjppLnJ0Y0pzVmVyc2lvbnx8bnVsbCxjb25zZWN1dGl2ZU5vQXVkaW9JbnB1dFBhY2tldHM6bCxjb25zZWN1dGl2ZUxvd0lucHV0QXVkaW9MZXZlbDpwLGNvbnNlY3V0aXZlTm9BdWRpb091dHB1dFBhY2tldHM6ZCxjb25zZWN1dGl2ZUxvd091dHB1dEF1ZGlvTGV2ZWw6aCxhdWRpb0lucHV0Q29ubmVjdGVkRHVyYXRpb25TZWNvbmRzOmZ9O3QucHVibGlzaFNvZnRwaG9uZVJlcG9ydCh7Y29udGFjdElkOm4uZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24scmVwb3J0Onl9KSx2LmluZm8oInNlbnQgVGVsZW1ldHJ5Q2FsbFJlcG9ydCAiK0pTT04uc3RyaW5naWZ5KHkpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfShuLGksJChjLHIpLCQodSxvKSkscShuKX0sWT1mdW5jdGlvbihlLHQsbixyLG8saSxzKXt0aGlzLnNvZnRwaG9uZVN0cmVhbVR5cGU9cix0aGlzLnRpbWVzdGFtcD1lLHRoaXMucGFja2V0c0xvc3Q9dCx0aGlzLnBhY2tldHNDb3VudD1uLHRoaXMuYXVkaW9MZXZlbD1vLHRoaXMuaml0dGVyQnVmZmVyTWlsbGlzPWksdGhpcy5yb3VuZFRyaXBUaW1lTWlsbGlzPXN9LCQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IFkoKGU9ZXx8e30pLnRpbWVzdGFtcCxlLnBhY2tldHNMb3N0LGUucGFja2V0c0NvdW50LHQsZS5hdWRpb0xldmVsKX0sSj1mdW5jdGlvbihlKXt0aGlzLl9vcmlnaW5hbExvZ2dlcj1lO3ZhciBuPXRoaXM7dGhpcy5fdGVlPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzWzBdKSxvPSIiO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKCl7bys9IiAlcyJ9KSksci5hcHBseShuLl9vcmlnaW5hbExvZ2dlcixbdC5Mb2dDb21wb25lbnQuU09GVFBIT05FLG9dLmNvbmNhdChlKSl9fX07Si5wcm90b3R5cGUuZGVidWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDEsdGhpcy5fb3JpZ2luYWxMb2dnZXIuZGVidWcpKGFyZ3VtZW50cyl9LEoucHJvdG90eXBlLmluZm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDIsdGhpcy5fb3JpZ2luYWxMb2dnZXIuaW5mbykoYXJndW1lbnRzKX0sSi5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSgzLHRoaXMuX29yaWdpbmFsTG9nZ2VyLmxvZykoYXJndW1lbnRzKX0sSi5wcm90b3R5cGUud2Fybj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoNCx0aGlzLl9vcmlnaW5hbExvZ2dlci53YXJuKShhcmd1bWVudHMpfSxKLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoNSx0aGlzLl9vcmlnaW5hbExvZ2dlci5lcnJvcikoYXJndW1lbnRzKX0sdC5Tb2Z0cGhvbmVNYW5hZ2VyPVR9KCl9LDk0NDooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1mdW5jdGlvbigpe3JldHVybiB0LmNhY2hlLmhhc093blByb3BlcnR5KGFyZ3VtZW50c1swXSl8fCh0LmNhY2hlW2FyZ3VtZW50c1swXV09dC5wYXJzZShhcmd1bWVudHNbMF0pKSx0LmZvcm1hdC5jYWxsKG51bGwsdC5jYWNoZVthcmd1bWVudHNbMF1dLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHIoZSx0KXtmb3IodmFyIG49W107dD4wO25bLS10XT1lKTtyZXR1cm4gbi5qb2luKCIiKX10LmZvcm1hdD1mdW5jdGlvbihlLG8pe3ZhciBpLHMsYSxjLHUsbCxwLGQ9MSxoPWUubGVuZ3RoLGY9IiIsZz1bXTtmb3Iocz0wO3M8aDtzKyspaWYoInN0cmluZyI9PT0oZj1uKGVbc10pKSlnLnB1c2goZVtzXSk7ZWxzZSBpZigiYXJyYXkiPT09Zil7aWYoKGM9ZVtzXSlbMl0pZm9yKGk9b1tkXSxhPTA7YTxjWzJdLmxlbmd0aDthKyspe2lmKCFpLmhhc093blByb3BlcnR5KGNbMl1bYV0pKXRocm93IHQoJ1tzcHJpbnRmXSBwcm9wZXJ0eSAiJXMiIGRvZXMgbm90IGV4aXN0JyxjWzJdW2FdKTtpPWlbY1syXVthXV19ZWxzZSBpPWNbMV0/b1tjWzFdXTpvW2QrK107aWYoL1tec10vLnRlc3QoY1s4XSkmJiJudW1iZXIiIT1uKGkpKXRocm93IHQoIltzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlcyIsbihpKSk7c3dpdGNoKGNbOF0pe2Nhc2UiYiI6aT1pLnRvU3RyaW5nKDIpO2JyZWFrO2Nhc2UiYyI6aT1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpO2JyZWFrO2Nhc2UiZCI6aT1wYXJzZUludChpLDEwKTticmVhaztjYXNlImUiOmk9Y1s3XT9pLnRvRXhwb25lbnRpYWwoY1s3XSk6aS50b0V4cG9uZW50aWFsKCk7YnJlYWs7Y2FzZSJmIjppPWNbN10/cGFyc2VGbG9hdChpKS50b0ZpeGVkKGNbN10pOnBhcnNlRmxvYXQoaSk7YnJlYWs7Y2FzZSJvIjppPWkudG9TdHJpbmcoOCk7YnJlYWs7Y2FzZSJzIjppPShpPVN0cmluZyhpKSkmJmNbN10/aS5zdWJzdHJpbmcoMCxjWzddKTppO2JyZWFrO2Nhc2UidSI6aT4+Pj0wO2JyZWFrO2Nhc2UieCI6aT1pLnRvU3RyaW5nKDE2KTticmVhaztjYXNlIlgiOmk9aS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1pPS9bZGVmXS8udGVzdChjWzhdKSYmY1szXSYmaT49MD8iKyIraTppLGw9Y1s0XT8iMCI9PWNbNF0/IjAiOmNbNF0uY2hhckF0KDEpOiIgIixwPWNbNl0tU3RyaW5nKGkpLmxlbmd0aCx1PWNbNl0/cihsLHApOiIiLGcucHVzaChjWzVdP2krdTp1K2kpfXJldHVybiBnLmpvaW4oIiIpfSx0LmNhY2hlPXt9LHQucGFyc2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUsbj1bXSxyPVtdLG89MDt0Oyl7aWYobnVsbCE9PShuPS9eW15ceDI1XSsvLmV4ZWModCkpKXIucHVzaChuWzBdKTtlbHNlIGlmKG51bGwhPT0obj0vXlx4MjV7Mn0vLmV4ZWModCkpKXIucHVzaCgiJSIpO2Vsc2V7aWYobnVsbD09PShuPS9eXHgyNSg/OihbMS05XVxkKilcJHxcKChbXlwpXSspXCkpPyhcKyk/KDB8J1teJF0pPygtKT8oXGQrKT8oPzpcLihcZCspKT8oW2ItZm9zdXhYXSkvLmV4ZWModCkpKXRocm93IltzcHJpbnRmXSBodWg/IjtpZihuWzJdKXtvfD0xO3ZhciBpPVtdLHM9blsyXSxhPVtdO2lmKG51bGw9PT0oYT0vXihbYS16X11bYS16X1xkXSopL2kuZXhlYyhzKSkpdGhyb3ciW3NwcmludGZdIGh1aD8iO2ZvcihpLnB1c2goYVsxXSk7IiIhPT0ocz1zLnN1YnN0cmluZyhhWzBdLmxlbmd0aCkpOylpZihudWxsIT09KGE9L15cLihbYS16X11bYS16X1xkXSopL2kuZXhlYyhzKSkpaS5wdXNoKGFbMV0pO2Vsc2V7aWYobnVsbD09PShhPS9eXFsoXGQrKVxdLy5leGVjKHMpKSl0aHJvdyJbc3ByaW50Zl0gaHVoPyI7aS5wdXNoKGFbMV0pfW5bMl09aX1lbHNlIG98PTI7aWYoMz09PW8pdGhyb3ciW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCI7ci5wdXNoKG4pfXQ9dC5zdWJzdHJpbmcoblswXS5sZW5ndGgpfXJldHVybiByfSxlLnNwcmludGY9dCxlLnZzcHJpbnRmPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4ocj1uLnNsaWNlKDApKS5zcGxpY2UoMCwwLGUpLHQuYXBwbHkobnVsbCxyKX19KCl9LDgyOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcn0sbi5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyB0Lk5vdEltcGxlbWVudGVkRXJyb3J9O3ZhciByPWZ1bmN0aW9uKCl7bi5jYWxsKHRoaXMpfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe30sci5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt9O3ZhciBvPWZ1bmN0aW9uKGUsdCl7bi5jYWxsKHRoaXMpLHRoaXMud2luZG93PWUsdGhpcy5kb21haW49dHx8IioifTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLndpbmRvdy5wb3N0TWVzc2FnZShlLHRoaXMuZG9tYWluKX0sby5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGUpfTt2YXIgaT1mdW5jdGlvbihlLHQscil7bi5jYWxsKHRoaXMpLHRoaXMuaW5wdXQ9ZSx0aGlzLm91dHB1dD10LHRoaXMuZG9tYWluPXJ8fCIqIn07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhpcy5vdXRwdXQucG9zdE1lc3NhZ2UoZSx0aGlzLmRvbWFpbil9LGkucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCh0PT57dC5zb3VyY2U9PT10aGlzLm91dHB1dCYmZSh0KX0pKX07dmFyIHM9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMpLHRoaXMucG9ydD1lLHRoaXMuaWQ9dC5yYW5kb21JZCgpfTsocy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXMscy5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnBvcnQucG9zdE1lc3NhZ2UoZSl9LHMucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSl9LHMucHJvdG90eXBlLmdldElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9O3ZhciBhPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzKSx0aGlzLnN0cmVhbU1hcD1lP3QuaW5kZXgoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SWQoKX0pKTp7fSx0aGlzLm1lc3NhZ2VMaXN0ZW5lcnM9W119OyhhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMuZ2V0U3RyZWFtcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RyeXt0LnNlbmQoZSl9Y2F0Y2goZSl7fX0pKX0sYS5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMubWVzc2FnZUxpc3RlbmVycy5wdXNoKGUpLHRoaXMuZ2V0U3RyZWFtcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Qub25NZXNzYWdlKGUpfSkpfSxhLnByb3RvdHlwZS5hZGRTdHJlYW09ZnVuY3Rpb24oZSl7dGhpcy5zdHJlYW1NYXBbZS5nZXRJZCgpXT1lLHRoaXMubWVzc2FnZUxpc3RlbmVycy5mb3JFYWNoKChmdW5jdGlvbih0KXtlLm9uTWVzc2FnZSh0KX0pKX0sYS5wcm90b3R5cGUucmVtb3ZlU3RyZWFtPWZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzLnN0cmVhbU1hcFtlLmdldElkKCldfSxhLnByb3RvdHlwZS5nZXRTdHJlYW1zPWZ1bmN0aW9uKGUpe3JldHVybiB0LnZhbHVlcyh0aGlzLnN0cmVhbU1hcCl9LGEucHJvdG90eXBlLmdldFN0cmVhbUZvclBvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZmluZCh0aGlzLmdldFN0cmVhbXMoKSwoZnVuY3Rpb24odCl7cmV0dXJuIHQucG9ydD09PWV9KSl9O3ZhciBjPWZ1bmN0aW9uKGUsbixvKXt0aGlzLm5hbWU9ZSx0aGlzLnVwc3RyZWFtPW58fG5ldyByLHRoaXMuZG93bnN0cmVhbT1vfHxuZXcgcix0aGlzLmRvd25zdHJlYW1CdXM9bmV3IHQuRXZlbnRCdXMsdGhpcy51cHN0cmVhbUJ1cz1uZXcgdC5FdmVudEJ1cyx0aGlzLnVwc3RyZWFtLm9uTWVzc2FnZSh0LmhpdGNoKHRoaXMsdGhpcy5fZGlzcGF0Y2hFdmVudCx0aGlzLnVwc3RyZWFtQnVzKSksdGhpcy5kb3duc3RyZWFtLm9uTWVzc2FnZSh0LmhpdGNoKHRoaXMsdGhpcy5fZGlzcGF0Y2hFdmVudCx0aGlzLmRvd25zdHJlYW1CdXMpKX07Yy5wcm90b3R5cGUub25VcHN0cmVhbT1mdW5jdGlvbihlLG4pe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMudXBzdHJlYW1CdXMuc3Vic2NyaWJlKGUsbil9LGMucHJvdG90eXBlLm9uQWxsVXBzdHJlYW09ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihlKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLnVwc3RyZWFtQnVzLnN1YnNjcmliZUFsbChlKX0sYy5wcm90b3R5cGUub25Eb3duc3RyZWFtPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5kb3duc3RyZWFtQnVzLnN1YnNjcmliZShlLG4pfSxjLnByb3RvdHlwZS5vbkFsbERvd25zdHJlYW09ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihlKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLmRvd25zdHJlYW1CdXMuc3Vic2NyaWJlQWxsKGUpfSxjLnByb3RvdHlwZS5zZW5kVXBzdHJlYW09ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdGhpcy51cHN0cmVhbS5zZW5kKHtldmVudDplLGRhdGE6bn0pfSxjLnByb3RvdHlwZS5zZW5kRG93bnN0cmVhbT1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0aGlzLmRvd25zdHJlYW0uc2VuZCh7ZXZlbnQ6ZSxkYXRhOm59KX0sYy5wcm90b3R5cGUuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmRhdGE7bi5ldmVudCYmZS50cmlnZ2VyKG4uZXZlbnQsbi5kYXRhKX0sYy5wcm90b3R5cGUucGFzc1Vwc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtlLnVwc3RyZWFtLnNlbmQoe2V2ZW50Om4sZGF0YTp0fSl9fSxjLnByb3RvdHlwZS5wYXNzRG93bnN0cmVhbT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZS5kb3duc3RyZWFtLnNlbmQoe2V2ZW50Om4sZGF0YTp0fSl9fSxjLnByb3RvdHlwZS5zaHV0ZG93bj1mdW5jdGlvbigpe3RoaXMudXBzdHJlYW1CdXMudW5zdWJzY3JpYmVBbGwoKSx0aGlzLmRvd25zdHJlYW1CdXMudW5zdWJzY3JpYmVBbGwoKX07dmFyIHU9ZnVuY3Rpb24oZSx0LG4scil7Yy5jYWxsKHRoaXMsZSxuZXcgaSh0LG4uY29udGVudFdpbmRvdyxyfHwiKiIpLG51bGwpfTsodS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXUsdC5TdHJlYW09bix0Lk51bGxTdHJlYW09cix0LldpbmRvd1N0cmVhbT1vLHQuV2luZG93SU9TdHJlYW09aSx0LlBvcnRTdHJlYW09cyx0LlN0cmVhbU11bHRpcGxleGVyPWEsdC5Db25kdWl0PWMsdC5JRnJhbWVDb25kdWl0PXV9KCl9LDgzMzooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJ0b1N0YXRlIiksdGhpcy5mcm9tU3RhdGU9ZSx0aGlzLnRvU3RhdGU9bn07bi5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUpe3Rocm93IHQuTm90SW1wbGVtZW50ZWRFcnJvcigpfSxuLnByb3RvdHlwZS5nZXRGcm9tU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mcm9tU3RhdGV9LG4ucHJvdG90eXBlLmdldFRvU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0YXRlfTt2YXIgcj1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJ0b1N0YXRlIiksdC5hc3NlcnROb3ROdWxsKG8sImFzc29jaWF0aW9ucyIpLG4uY2FsbCh0aGlzLGUsciksdGhpcy5hc3NvY2lhdGlvbnM9b307KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbnN9O3ZhciBvPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKHIsInRvU3RhdGUiKSx0LmFzc2VydE5vdE51bGwobywiY2xvc3VyZSIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obyksImNsb3N1cmUgbXVzdCBiZSBhIGZ1bmN0aW9uIiksbi5jYWxsKHRoaXMsZSxyKSx0aGlzLmNsb3N1cmU9b307KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zdXJlKGUsdGhpcy5nZXRGcm9tU3RhdGUoKSx0aGlzLmdldFRvU3RhdGUoKSl9O3ZhciBpPWZ1bmN0aW9uKCl7dGhpcy5mcm9tTWFwPXt9fTtpLkFOWT0iPDxhbnk+PiIsaS5wcm90b3R5cGUuYXNzb2M9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXM7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJmcm9tU3RhdGVPYmogaXMgbm90IGRlZmluZWQuIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJ0b1N0YXRlT2JqIGlzIG5vdCBkZWZpbmVkLiIpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiYXNzb2NPYmogaXMgbm90IGRlZmluZWQuIik7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheT9lLmZvckVhY2goKGZ1bmN0aW9uKGUpe2kuYXNzb2MoZSx0LG4pfSkpOnQgaW5zdGFuY2VvZiBBcnJheT90LmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuYXNzb2MoZSx0LG4pfSkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP3RoaXMuX2FkZEFzc29jaWF0aW9uKG5ldyBvKGUsdCxuKSk6biBpbnN0YW5jZW9mIEFycmF5P3RoaXMuX2FkZEFzc29jaWF0aW9uKG5ldyByKGUsdCxuKSk6dGhpcy5fYWRkQXNzb2NpYXRpb24obmV3IHIoZSx0LFtuXSkpLHRoaXN9LGkucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlLG4scil7dC5hc3NlcnROb3ROdWxsKG4sImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJ0b1N0YXRlIik7dmFyIG89W10scz10aGlzLmZyb21NYXBbaS5BTlldfHx7fSxhPXRoaXMuZnJvbU1hcFtuXXx8e307cmV0dXJuIG89KG89by5jb25jYXQodGhpcy5fZ2V0QXNzb2NpYXRpb25zRnJvbU1hcChzLGUsbixyKSkpLmNvbmNhdCh0aGlzLl9nZXRBc3NvY2lhdGlvbnNGcm9tTWFwKGEsZSxuLHIpKX0saS5wcm90b3R5cGUuX2FkZEFzc29jaWF0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZnJvbU1hcFtlLmdldEZyb21TdGF0ZSgpXTt0fHwodD10aGlzLmZyb21NYXBbZS5nZXRGcm9tU3RhdGUoKV09e30pO3ZhciBuPXRbZS5nZXRUb1N0YXRlKCldO258fChuPXRbZS5nZXRUb1N0YXRlKCldPVtdKSxuLnB1c2goZSl9LGkucHJvdG90eXBlLl9nZXRBc3NvY2lhdGlvbnNGcm9tTWFwPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybihlW2kuQU5ZXXx8W10pLmNvbmNhdChlW3JdfHxbXSkucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiBlLmNvbmNhdChuLmdldEFzc29jaWF0aW9ucyh0KSl9KSxbXSl9LHQuRXZlbnRHcmFwaD1pfSgpfSw4OTE6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1uYXZpZ2F0b3IudXNlckFnZW50LHI9WyJidWJibGVzIiwiY2FuY2VsQnViYmxlIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwiZGF0YSIsImRlZmF1bHRQcmV2ZW50ZWQiLCJldmVudFBoYXNlIiwiaXNUcnVzdGVkIiwibGFzdEV2ZW50SWQiLCJvcmlnaW4iLCJyZXR1cm5WYWx1ZSIsInRpbWVTdGFtcCIsInR5cGUiXTt0LnNwcmludGY9ZS5zcHJpbnRmLHQudnNwcmludGY9ZS52c3ByaW50ZixkZWxldGUgZS5zcHJpbnRmLGRlbGV0ZSBlLnZzcHJpbnRmLHQuSFRUUF9TVEFUVVNfQ09ERVM9e1NVQ0NFU1M6MjAwLFVOQVVUSE9SSVpFRDo0MDEsQUNDRVNTX0RFTklFRDo0MDMsVE9PX01BTllfUkVRVUVTVFM6NDI5LElOVEVSTkFMX1NFUlZFUl9FUlJPUjo1MDB9LHQuVFJBTlNQT1JUX1RZUEVTPXtDSEFUX1RPS0VOOiJjaGF0X3Rva2VuIixXRUJfU09DS0VUOiJ3ZWJfc29ja2V0IixBR0VOVF9ESVNDT1ZFUlk6ImFnZW50X2Rpc2NvdmVyeSJ9LHQuaGl0Y2g9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLG49ZS5zaGlmdCgpLHI9ZS5zaGlmdCgpO3JldHVybiB0LmFzc2VydE5vdE51bGwobiwic2NvcGUiKSx0LmFzc2VydE5vdE51bGwociwibWV0aG9kIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihyKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gci5hcHBseShuLGUuY29uY2F0KHQpKX19LHQuaXNGdW5jdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLmNvbnN0cnVjdG9yJiZlLmNhbGwmJmUuYXBwbHkpfSx0LmlzQXJyYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX0sdC5rZXlzPWZ1bmN0aW9uKGUpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiB0LmFzc2VydE5vdE51bGwoZSwibWFwIiksZSluLnB1c2gocik7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKGUpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiB0LmFzc2VydE5vdE51bGwoZSwibWFwIiksZSluLnB1c2goZVtyXSk7cmV0dXJuIG59LHQuZW50cmllcz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gZSl0LnB1c2goe2tleTpuLHZhbHVlOmVbbl19KTtyZXR1cm4gdH0sdC5tZXJnZT1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuZW50cmllcyhlKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW2Uua2V5XT1lLnZhbHVlfSkpfSkpLG59LHQubm93PWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHQuZmluZD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKHQoZVtuXSkpcmV0dXJuIGVbbl07cmV0dXJuIG51bGx9LHQuY29udGFpbnM9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P251bGwhPXQuZmluZChlLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW59KSk6biBpbiBlfSx0LmNvbnRhaW5zVmFsdWU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P251bGwhPXQuZmluZChlLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW59KSk6bnVsbCE9dC5maW5kKHQudmFsdWVzKGUpLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW59KSl9LHQucmFuZG9tSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdC5zcHJpbnRmKCIlcy0lcyIsdC5ub3coKSxNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSl9LHQubWFrZUVudW09ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKC9cLj8oW2Etel0rKV8/L2csKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKSsiXyJ9KSkucmVwbGFjZSgvXyQvLCIiKTt0W25dPWV9KSksdH0sdC5tYWtlTmFtZXNwYWNlZEVudW09ZnVuY3Rpb24oZSxuKXt2YXIgcj10Lm1ha2VFbnVtKG4pO3JldHVybiB0LmtleXMocikuZm9yRWFjaCgoZnVuY3Rpb24obil7cltuXT10LnNwcmludGYoIiVzOjolcyIsZSxyW25dKX0pKSxyfSx0Lm1ha2VHZW5lcmljTmFtZXNwYWNlZEVudW09ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQubWFrZUVudW0obik7cmV0dXJuIHQua2V5cyhvKS5mb3JFYWNoKChmdW5jdGlvbihuKXtvW25dPXQuc3ByaW50ZigiJXMiK3IrIiVzIixlLG9bbl0pfSkpLG99LHQuaXNDaHJvbWVCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIkNocm9tZSIpfSx0LmlzRmlyZWZveEJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiRmlyZWZveCIpfSx0LmlzT3BlcmFCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIk9wZXJhIil9LHQuaXNFZGdlQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09bi5pbmRleE9mKCJFZGciKX0sdC5nZXRDaHJvbWVCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW4uc3Vic3RyaW5nKG4uaW5kZXhPZigiQ2hyb21lIikrNyk7cmV0dXJuIGU/cGFyc2VGbG9hdChlKTotMX0sdC5nZXRGaXJlZm94QnJvd3NlclZlcnNpb249ZnVuY3Rpb24oKXt2YXIgZT1uLnN1YnN0cmluZyhuLmluZGV4T2YoIkZpcmVmb3giKSs4KTtyZXR1cm4gZT9wYXJzZUZsb2F0KGUpOi0xfSx0LmlzVmFsaWRMb2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuW3tpZDoiZW5fVVMiLGxhYmVsOiJFbmdsaXNoIn0se2lkOiJkZV9ERSIsbGFiZWw6IkRldXRzY2gifSx7aWQ6ImVzX0VTIixsYWJlbDoiRXNwYcOxb2wifSx7aWQ6ImZyX0ZSIixsYWJlbDoiRnJhbsOnYWlzIn0se2lkOiJqYV9KUCIsbGFiZWw6IuaXpeacrOiqniJ9LHtpZDoiaXRfSVQiLGxhYmVsOiJJdGFsaWFubyJ9LHtpZDoia29fS1IiLGxhYmVsOiLtlZzqta3slrQifSx7aWQ6InB0X0JSIixsYWJlbDoiUG9ydHVndcOqcyJ9LHtpZDoiemhfQ04iLGxhYmVsOiLkuK3mloco566A5L2TKSJ9LHtpZDoiemhfVFciLGxhYmVsOiLkuK3mloco57mB6auUKSJ9XS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkfSkpLmluY2x1ZGVzKGUpfSx0LmdldE9wZXJhQnJvd3NlclZlcnNpb249ZnVuY3Rpb24oKXt2YXIgZT1uLmluZGV4T2YoIk9wZXJhIiksdD0tMSE9PW4uaW5kZXhPZigiVmVyc2lvbiIpP24uc3Vic3RyaW5nKGUrOCk6bi5zdWJzdHJpbmcoZSs2KTtyZXR1cm4gdD9wYXJzZUZsb2F0KHQpOi0xfSx0LmluZGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7blt0KGUpXT1lfSkpLG59LHQuc2V0PWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbZV09MX0pKSx0fSx0LnJlbGF0aXZlQ29tcGxlbWVudD1mdW5jdGlvbihlLG4pe3ZhciByPXt9O3JldHVybiB0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dCBpbiBlfHwoclt0XT1uW3RdKX0pKSxyfSx0LmFzc2VydFRydWU9ZnVuY3Rpb24oZSxuKXtpZighZSl0aHJvdyBuZXcgdC5WYWx1ZUVycm9yKG4pfSx0LmFzc2VydE5vdE51bGw9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKG51bGwhPWUmJnZvaWQgMCE9PXR5cGVvZiBlLHQuc3ByaW50ZigiJXMgbXVzdCBiZSBwcm92aWRlZCIsbnx8IkEgdmFsdWUiKSksZX0sdC5kZWVwY29weT1mdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSl9LHQuZGVlcGNvcHlDcm9zc09yaWdpbkV2ZW50PWZ1bmN0aW9uKGUpe2NvbnN0IG49e307cmV0dXJuIHIuZm9yRWFjaCgocj0+e3RyeXtuW3JdPWVbcl19Y2F0Y2goZSl7dC5nZXRMb2coKS5pbmZvKCJkZWVwY29weUNyb3NzT3JpZ2luRXZlbnQgZmFpbGVkIG9uIGtleTogIixyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSx0LmRlZXBjb3B5KG4pfSx0LmdldEJhc2VVcmw9ZnVuY3Rpb24oKXt2YXIgbj1lLmxvY2F0aW9uO3JldHVybiB0LnNwcmludGYoIiVzLy8lczolcyIsbi5wcm90b2NvbCxuLmhvc3RuYW1lLG4ucG9ydCl9LHQuZ2V0VXJsV2l0aFByb3RvY29sPWZ1bmN0aW9uKG4pe3ZhciByPWUubG9jYXRpb24ucHJvdG9jb2w7cmV0dXJuIG4uc3Vic3RyKDAsci5sZW5ndGgpIT09cj90LnNwcmludGYoIiVzLy8lcyIscixuKTpufSx0LmlzRnJhbWVkPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB3aW5kb3cuc2VsZiE9PXdpbmRvdy50b3B9Y2F0Y2goZSl7cmV0dXJuITB9fSx0Lmhhc090aGVyQ29ubmVjdGVkQ0NQcz1mdW5jdGlvbigpe3JldHVybiB0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz4xfSx0LmZldGNoPWZ1bmN0aW9uKGUsbixyLG8pe3JldHVybiBvPW98fDUscj1yfHwxZTMsbj1ufHx7fSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXshZnVuY3Rpb24gbyhhKXtmZXRjaChlLG4pLnRoZW4oKGZ1bmN0aW9uKGUpe2Uuc3RhdHVzPT09dC5IVFRQX1NUQVRVU19DT0RFUy5TVUNDRVNTP2UuanNvbigpLnRoZW4oKGU9PmkoZSkpKS5jYXRjaCgoKCk9Pmkoe30pKSk6MSE9PWEmJihlLnN0YXR1cz49dC5IVFRQX1NUQVRVU19DT0RFUy5JTlRFUk5BTF9TRVJWRVJfRVJST1J8fGUuc3RhdHVzPT09dC5IVFRQX1NUQVRVU19DT0RFUy5UT09fTUFOWV9SRVFVRVNUUyk/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKC0tYSl9KSxyKTpzKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtzKGUpfSkpfShvKX0pKX0sdC5mZXRjaFdpdGhUaW1lb3V0PWFzeW5jIGZ1bmN0aW9uKGUsbixyLG8saSl7aWYocj1yfHx7fSwhbilyZXR1cm4gdC5mZXRjaChlLHIsbyxpKTtjb25zdCBzPW5ldyBBYm9ydENvbnRyb2xsZXIsYT1zZXRUaW1lb3V0KCgoKT0+cy5hYm9ydCgpKSxuKSxjPWF3YWl0IHQuZmV0Y2goZSx7Li4ucixzaWduYWw6cy5zaWduYWx9LG8saSk7cmV0dXJuIGNsZWFyVGltZW91dChhKSxjfSx0LmJhY2tvZmY9ZnVuY3Rpb24obixyLG8saSl7dC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZnVuYyBtdXN0IGJlIGEgRnVuY3Rpb24iKTt2YXIgcz10aGlzO24oe3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aSYmaS5zdWNjZXNzJiZpLnN1Y2Nlc3MoZSl9LGZhaWx1cmU6ZnVuY3Rpb24odCxhKXtpZihvPjApe3ZhciBjPTIqcipNYXRoLnJhbmRvbSgpO2Uuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzLmJhY2tvZmYobiwyKmMsLS1vLGkpfSksYyl9ZWxzZSBpJiZpLmZhaWx1cmUmJmkuZmFpbHVyZSh0LGEpfX0pfSx0LnB1Ymxpc2hNZXRyaWM9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuQ0xJRU5UX01FVFJJQyxkYXRhOmV9KX0sdC5wdWJsaXNoU29mdHBob25lU3RhdHM9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuU09GVFBIT05FX1NUQVRTLGRhdGE6ZX0pfSx0LnB1Ymxpc2hTb2Z0cGhvbmVSZXBvcnQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuU09GVFBIT05FX1JFUE9SVCxkYXRhOmV9KX0sdC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLkNMSUNLX1NUUkVBTV9EQVRBLGRhdGE6ZX0pfSx0LnB1Ymxpc2hDbGllbnRTaWRlTG9ncz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkNMSUVOVF9TSURFX0xPR1MsZSl9LHQuYWRkTmFtZXNwYWNlVG9Mb2dzPWZ1bmN0aW9uKGUpe1sibG9nIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImRlYnVnIl0uZm9yRWFjaCgodD0+e2NvbnN0IG49d2luZG93LmNvbnNvbGVbdF07d2luZG93LmNvbnNvbGVbdF09ZnVuY3Rpb24oKXtjb25zdCB0PUFycmF5LmZyb20oYXJndW1lbnRzKTt0LnVuc2hpZnQoYFske2V9XWApLG4uYXBwbHkod2luZG93LmNvbnNvbGUsdCl9fSkpfSx0LlBvcHVwTWFuYWdlcj1mdW5jdGlvbigpe30sdC5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX2dldExhc3RPcGVuZWRUaW1lc3RhbXAodCksbz0obmV3IERhdGUpLmdldFRpbWUoKSxpPW51bGw7aWYoby1yPjg2NGU1KXtpZihuKXt2YXIgcz1uLmhlaWdodHx8NTc4LGE9bi53aWR0aHx8NDMzLGM9bi50b3B8fDAsdT1uLmxlZnR8fDA7KGk9d2luZG93Lm9wZW4oIiIsdCwid2lkdGg9IithKyIsIGhlaWdodD0iK3MrIiwgdG9wPSIrYysiLCBsZWZ0PSIrdSkpLmxvY2F0aW9uIT09ZSYmKGk9d2luZG93Lm9wZW4oZSx0LCJ3aWR0aD0iK2ErIiwgaGVpZ2h0PSIrcysiLCB0b3A9IitjKyIsIGxlZnQ9Iit1KSl9ZWxzZShpPXdpbmRvdy5vcGVuKCIiLHQpKS5sb2NhdGlvbiE9PWUmJihpPXdpbmRvdy5vcGVuKGUsdCkpO3RoaXMuX3NldExhc3RPcGVuZWRUaW1lc3RhbXAodCxvKX1yZXR1cm4gaX0sdC5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2dldExvY2FsU3RvcmFnZUtleSh0KTtlLmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG4pfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuX2dldExhc3RPcGVuZWRUaW1lc3RhbXA9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZ2V0TG9jYWxTdG9yYWdlS2V5KHQpLHI9ZS5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShuKTtyZXR1cm4gcj9wYXJzZUludChyLDEwKTowfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuX3NldExhc3RPcGVuZWRUaW1lc3RhbXA9ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzLl9nZXRMb2NhbFN0b3JhZ2VLZXkodCk7ZS5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShyLCIiK24pfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuX2dldExvY2FsU3RvcmFnZUtleT1mdW5jdGlvbihlKXtyZXR1cm4iY29ubmVjdFBvcHVwTWFuYWdlcjo6IitlfTt2YXIgbz10Lm1ha2VFbnVtKFsiZ3JhbnRlZCIsImRlbmllZCIsImRlZmF1bHQiXSk7dC5Ob3RpZmljYXRpb25NYW5hZ2VyPWZ1bmN0aW9uKCl7dGhpcy5xdWV1ZT1bXSx0aGlzLnBlcm1pc3Npb249by5ERUZBVUxUfSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLnJlcXVlc3RQZXJtaXNzaW9uPWZ1bmN0aW9uKCl7dmFyIG49dGhpczsiTm90aWZpY2F0aW9uImluIGU/ZS5Ob3RpZmljYXRpb24ucGVybWlzc2lvbj09PW8uREVOSUVEPyh0LmdldExvZygpLndhcm4oIlRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgdG8gbm90IHJlY2VpdmUgbm90aWZpY2F0aW9ucy4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMucGVybWlzc2lvbj1vLkRFTklFRCk6dGhpcy5wZXJtaXNzaW9uIT09by5HUkFOVEVEJiZlLk5vdGlmaWNhdGlvbi5yZXF1ZXN0UGVybWlzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe24ucGVybWlzc2lvbj1lLGU9PT1vLkdSQU5URUQ/bi5fc2hvd1F1ZXVlZCgpOm4ucXVldWU9W119KSk6KHQuZ2V0TG9nKCkud2FybigiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBub3RpZmljYXRpb25zLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5wZXJtaXNzaW9uPW8uREVOSUVEKX0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKGUsbil7aWYodGhpcy5wZXJtaXNzaW9uPT09by5HUkFOVEVEKXJldHVybiB0aGlzLl9zaG93SW1wbCh7dGl0bGU6ZSxvcHRpb25zOm59KTtpZih0aGlzLnBlcm1pc3Npb249PT1vLkRFTklFRCl0LmdldExvZygpLndhcm4oIlVuYWJsZSB0byBzaG93IG5vdGlmaWNhdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe3RpdGxlOmUsb3B0aW9uczpufSk7ZWxzZXt2YXIgcj17dGl0bGU6ZSxvcHRpb25zOm59O3QuZ2V0TG9nKCkud2FybigiRGVmZXJyaW5nIG5vdGlmaWNhdGlvbiB1bnRpbCB1c2VyIGRlY2lkZXMgdG8gYWxsb3cgb3IgZGVueS4iKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5xdWV1ZS5wdXNoKHIpfX0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5fc2hvd1F1ZXVlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnF1ZXVlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX3Nob3dJbXBsKHQpfSkpO3JldHVybiB0aGlzLnF1ZXVlPVtdLHR9LHQuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUuX3Nob3dJbXBsPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBlLk5vdGlmaWNhdGlvbih0LnRpdGxlLHQub3B0aW9ucyk7cmV0dXJuIHQub3B0aW9ucy5jbGlja2VkJiYobi5vbmNsaWNrPWZ1bmN0aW9uKCl7dC5vcHRpb25zLmNsaWNrZWQuY2FsbChuKX0pLG59LHQuVmFsdWVFcnJvcj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPWUuc2hpZnQoKSxyPW5ldyBFcnJvcih0LnZzcHJpbnRmKG4sZSkpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yocix0LlZhbHVlRXJyb3IucHJvdG90eXBlKSxyfSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5WYWx1ZUVycm9yLnByb3RvdHlwZSxFcnJvci5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlZhbHVlRXJyb3IsRXJyb3IpLHQuVmFsdWVFcnJvci5wcm90b3R5cGUubmFtZT0iVmFsdWVFcnJvciIsdC5Ob3RJbXBsZW1lbnRlZEVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49ZS5zaGlmdCgpLHI9bmV3IEVycm9yKHQudnNwcmludGYobixlKSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLHQuTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUpLHJ9LE9iamVjdC5zZXRQcm90b3R5cGVPZih0Lk5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlLEVycm9yLnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuTm90SW1wbGVtZW50ZWRFcnJvcixFcnJvciksdC5Ob3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZS5uYW1lPSJOb3RJbXBsZW1lbnRlZEVycm9yIix0LlN0YXRlRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksbj1lLnNoaWZ0KCkscj1uZXcgRXJyb3IodC52c3ByaW50ZihuLGUpKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsdC5TdGF0ZUVycm9yLnByb3RvdHlwZSkscn0sT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuU3RhdGVFcnJvci5wcm90b3R5cGUsRXJyb3IucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5TdGF0ZUVycm9yLEVycm9yKSx0LlN0YXRlRXJyb3IucHJvdG90eXBlLm5hbWU9IlN0YXRlRXJyb3IiLHQuVm9pY2VJZEVycm9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyZXR1cm4gci50eXBlPWUsci5tZXNzYWdlPXQsci5zdGFjaz1FcnJvcih0KS5zdGFjayxyLmVycj1uLHJ9LHQuaXNDQ1A9ZnVuY3Rpb24oKXtyZXR1cm4hIXQuY29yZS51cHN0cmVhbSYmIkNvbm5lY3RTaGFyZWRXb3JrZXJDb25kdWl0Ij09PXQuY29yZS5nZXRVcHN0cmVhbSgpLm5hbWV9LHQuaXNTaGFyZWRXb3JrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC53b3JrZXImJiEhdC53b3JrZXIuY2xpZW50RW5naW5lfSx0LmlzQ1JNPWZ1bmN0aW9uKCl7cmV0dXJuISF0LmNvcmUudXBzdHJlYW0mJnQuY29yZS5nZXRVcHN0cmVhbSgpaW5zdGFuY2VvZiB0LklGcmFtZUNvbmR1aXR9fSgpfSw3MzY6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0Lndvcmtlcj17fTt2YXIgbj0iTEFEUy5HZXRBZ2VudEZhaWxvdmVyQ29uZmlndXJhdGlvbiIscj1mdW5jdGlvbigpe3RoaXMudG9waWNNYXN0ZXJNYXA9e319O3IucHJvdG90eXBlLmdldE1hc3Rlcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsInRvcGljIiksdGhpcy50b3BpY01hc3Rlck1hcFtlXXx8bnVsbH0sci5wcm90b3R5cGUuc2V0TWFzdGVyPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsInRvcGljIiksdC5hc3NlcnROb3ROdWxsKG4sImlkIiksdGhpcy50b3BpY01hc3Rlck1hcFtlXT1ufSxyLnByb3RvdHlwZS5yZW1vdmVNYXN0ZXI9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsImlkIik7dmFyIG49dGhpczt0LmVudHJpZXModGhpcy50b3BpY01hc3Rlck1hcCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZT09PWV9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZGVsZXRlIG4udG9waWNNYXN0ZXJNYXBbZS5rZXldfSkpfTt2YXIgbz1mdW5jdGlvbihlKXt0LkNsaWVudEJhc2UuY2FsbCh0aGlzKSx0aGlzLmNvbmR1aXQ9ZX07KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5DbGllbnRCYXNlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dC5jb250YWluc1ZhbHVlKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLGUpP3QuY29yZS5nZXRBZ2VudEFwcENsaWVudCgpLl9jYWxsSW1wbChlLG4se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGkpLHIuc3VjY2Vzcyh0KX0sZmFpbHVyZTpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSx0KSxyLmZhaWx1cmUodCl9fSk6dC5jb250YWluc1ZhbHVlKHQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHMsZSk/dC5jb3JlLmdldFRhc2tUZW1wbGF0ZXNDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpKSxyLnN1Y2Nlc3ModCl9LGZhaWx1cmU6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksdCksci5mYWlsdXJlKHQpfX0pOnQuY29yZS5nZXRDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQsbil7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGkpLHIuc3VjY2Vzcyh0LG4pfSxmYWlsdXJlOmZ1bmN0aW9uKHQsbil7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksdCksci5mYWlsdXJlKHQsbil9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKHQsbil7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksdCksci5hdXRoRmFpbHVyZSgpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24odCxuKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSx0KSxyLmFjY2Vzc0RlbmllZCYmci5hY2Nlc3NEZW5pZWQoKX19KX0sby5wcm90b3R5cGUuX3JlY29yZEFQSUxhdGVuY3k9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPShuZXcgRGF0ZSkuZ2V0VGltZSgpLXQ7dGhpcy5fc2VuZEFQSU1ldHJpY3MoZSxyLG4pfSxvLnByb3RvdHlwZS5fc2VuZEFQSU1ldHJpY3M9ZnVuY3Rpb24oZSxuLHIpe2NvbnN0IG89e25hbWU6ZSx0aW1lOm4sZXJyb3I6cixlcnJvcjV4eDowfSxpPXImJnIuc3RhdHVzQ29kZXx8MjAwLHM9ciYmci5yZXRyeVN0YXR1c3x8dC5SZXRyeVN0YXR1cy5OT05FLGE9W3tuYW1lOiJIdHRwU3RhdHVzQ29kZSIsdmFsdWU6aX0se25hbWU6Ikh0dHBHZW5lcmljU3RhdHVzQ29kZSIsdmFsdWU6YCR7aS50b1N0cmluZygpLmNoYXJBdCgwKX1YWGB9LHtuYW1lOiJSZXRyeVN0YXR1cyIsdmFsdWU6c31dOyI1Ij09PWkudG9TdHJpbmcoKS5jaGFyQXQoMCkmJihvLmVycm9yNXh4PTEpLHRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BUElfTUVUUklDLHsuLi5vLGRpbWVuc2lvbnM6W3tuYW1lOiJDYXRlZ29yeSIsdmFsdWU6IkFQSSJ9XSxvcHRpb25hbERpbWVuc2lvbnM6YX0pfTt2YXIgaT1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5tdWx0aXBsZXhlcj1uZXcgdC5TdHJlYW1NdWx0aXBsZXhlcix0aGlzLmNvbmR1aXQ9bmV3IHQuQ29uZHVpdCgiQW1hem9uQ29ubmVjdFNoYXJlZFdvcmtlciIsbnVsbCx0aGlzLm11bHRpcGxleGVyKSx0aGlzLmNsaWVudD1uZXcgbyh0aGlzLmNvbmR1aXQpLHRoaXMudGltZW91dD1udWxsLHRoaXMuYWdlbnQ9bnVsbCx0aGlzLm5leHRUb2tlbj1udWxsLHRoaXMuaW5pdERhdGE9e30sdGhpcy5wb3J0Q29uZHVpdE1hcD17fSx0aGlzLnN0cmVhbU1hcEJ5VGFiSWQ9e30sdGhpcy5tYXN0ZXJDb29yZD1uZXcgcix0aGlzLmxvZ3NCdWZmZXI9W10sdGhpcy5zdXBwcmVzcz0hMSx0aGlzLmZvcmNlT2ZmbGluZT0hMSx0aGlzLmxvbmdQb2xsaW5nT3B0aW9ucz17YWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGU6ITEsYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlOiExfSx0aGlzLmRyUG9sbGluZ1VybD1udWxsLHRoaXMudGhpc0Fybj1udWxsLHRoaXMub3RoZXJBcm49bnVsbCx0aGlzLnBlbmRpbmdGYWlsb3Zlcj1udWxsO3ZhciBpPW51bGw7dC5yb290TG9nZ2VyPW5ldyB0LkRvd25zdHJlYW1Db25kdWl0TG9nZ2VyKHRoaXMuY29uZHVpdCksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5TRU5EX0xPR1MsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkucHVzaExvZ3NEb3duc3RyZWFtKGUpLG4ubG9nc0J1ZmZlcj1uLmxvZ3NCdWZmZXIuY29uY2F0KGUpLG4ubG9nc0J1ZmZlci5sZW5ndGg+NDAwJiZuLmhhbmRsZVNlbmRMb2dzUmVxdWVzdChuLmxvZ3NCdWZmZXIpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNVUFBSRVNTLChmdW5jdGlvbihlKXt0LmdldExvZygpLmRlYnVnKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFNldHRpbmcgU3VwcHJlc3MgdG8gJXMiLGUuc3VwcHJlc3MpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5zdXBwcmVzcz1lLnN1cHByZXNzfHwhMSxuLnN1cHByZXNzfHwobi5mb3JjZU9mZmxpbmU9ITEpLCh2b2lkIDA9PT1lLnNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW18fGUuc2hvdWxkU2VuZEZhaWxvdmVyRG93bnN0cmVhbSkmJm4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse2lzUHJpbWFyeTohbi5zdXBwcmVzc30pfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gU2V0dGluZyBGT1JDRV9PRkZMSU5FIHRvICVzIixlLm9mZmxpbmUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5mb3JjZU9mZmxpbmV8fChuLnBlbmRpbmdGYWlsb3Zlcj0hMSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtpc1ByaW1hcnk6ITEsbmV4dEFjdGl2ZUFybjplLm5leHRBY3RpdmVBcm59KSksbi5mb3JjZU9mZmxpbmU9ZS5vZmZsaW5lfHwhMX0pKSx0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HJiZ0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkcsKGZ1bmN0aW9uKGUpe3ZhciByPXQuZ2V0TG9nKCk7bi5kclBvbGxpbmdVcmw/KHIuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gQWRkaW5nIG5ldyBDQ1AgdG8gYWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZvciBpbnN0YW5jZSAke2UuaW5zdGFuY2VBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnBvbGxGb3JBY3RpdmVSZWdpb24oITAsITEpKTooci5pbmZvKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEluaXRpYWxpemluZyBhY3RpdmUgcmVnaW9uIHBvbGxpbmcgZm9yIGluc3RhbmNlICR7ZS5pbnN0YW5jZUFybn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4udGhpc0Fybj1lLmluc3RhbmNlQXJuLG4ub3RoZXJBcm49ZS5vdGhlckFybixuLmdldFByZXNpZ25lZERpc2NvdmVyeVVybCgpLnRoZW4oKGU9PntuLmRyUG9sbGluZ1VybD1lLG4ucG9sbEZvckFjdGl2ZVJlZ2lvbighMCwhMCl9KSwodD0+e3IuZXJyb3IoYFtEaXNhc3RlciBSZWNvdmVyeV0gRmFpbGVkIHRvIGdldCBwcmVzaWduZWQgVVJMIGZvciBpbnN0YW5jZSAke2UuaW5zdGFuY2VBcm59OyBzdXBwcmVzc2luZyBjb250YWN0c2ApLndpdGhFeGNlcHRpb24odCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnN1cHByZXNzPSEwfSkpKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24ocil7Y29uc29sZS5sb2coIkBAQCBjb25maWd1cmUgZXZlbnQgaGFuZGxlciIscik7dHJ5e3IuYXV0aFRva2VuJiZyLmF1dGhUb2tlbiE9PW4uaW5pdERhdGEuYXV0aFRva2VuJiYobi5pbml0RGF0YT1yLHQuY29yZS5pbml0KHIpLHIubG9uZ1BvbGxpbmdPcHRpb25zJiYoImJvb2xlYW4iPT10eXBlb2Ygci5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGUmJihuLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZT1yLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZSksImJvb2xlYW4iPT10eXBlb2Ygci5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlJiYobi5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlPXIubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdXZWJzb2NrZXRPbmx5TW9kZSkpLGk/dC5nZXRMb2coKS5pbmZvKCJOb3QgSW5pdGlhbGl6aW5nIGEgbmV3IFdlYnNvY2tldE1hbmFnZXIgaW5zdGFuY2UsIHNpbmNlIG9uZSBhbHJlYWR5IGV4aXN0cyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6KHQuZ2V0TG9nKCkuaW5mbygiQ3JlYXRpbmcgYSBuZXcgV2Vic29ja2V0IGNvbm5lY3Rpb24gZm9yIENDUCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5XZWJTb2NrZXRNYW5hZ2VyLnNldEdsb2JhbENvbmZpZyh7bG9nZ2VyQ29uZmlnOntsb2dnZXI6dC5nZXRMb2coKX19KSwoaT10LldlYlNvY2tldE1hbmFnZXIuY3JlYXRlKCkpLm9uSW5pdEZhaWx1cmUoKGZ1bmN0aW9uKCl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRSl9KSksaS5vbkNvbm5lY3Rpb25PcGVuKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9PUEVOLGUpfSkpLGkub25Db25uZWN0aW9uQ2xvc2UoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0NMT1NFLGUpfSkpLGkub25Db25uZWN0aW9uR2FpbigoZnVuY3Rpb24oKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9HQUlORUQpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0dBSU4pfSkpLGkub25Db25uZWN0aW9uTG9zdCgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuQWdlbnRFdmVudHMuV0VCU09DS0VUX0NPTk5FQ1RJT05fTE9TVCxlKSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9MT1NULGUpfSkpLGkub25TdWJzY3JpcHRpb25VcGRhdGUoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fVVBEQVRFLGUpfSkpLGkub25TdWJzY3JpcHRpb25GYWlsdXJlKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX0ZBSUxVUkUsZSl9KSksaS5vbkFsbE1lc3NhZ2UoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5BTExfTUVTU0FHRSxlKX0pKSxuLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNFTkQsKGZ1bmN0aW9uKGUpe2kuc2VuZE1lc3NhZ2UoZSl9KSksbi5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJQkUsKGZ1bmN0aW9uKGUpe2kuc3Vic2NyaWJlVG9waWNzKGUpfSkpLGkuaW5pdCh0LmhpdGNoKG4sbi5nZXRXZWJTb2NrZXRVcmwpKS50aGVuKChmdW5jdGlvbihyKXt0cnl7aWYociYmIXIud2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZCl0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGFnZW50IHBvbGxpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4ucG9sbEZvckFnZW50KCksdC5nZXRMb2coKS5pbmZvKCJLaWNraW5nIG9mZiBjb25maWcgcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uKHtyZXBlYXRGb3JldmVyOiEwfSksdC5nZXRMb2coKS5pbmZvKCJLaWNraW5nIG9mZiBhdXRoIHRva2VuIHBvbGxpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuc2V0SW50ZXJ2YWwodC5oaXRjaChuLG4uY2hlY2tBdXRoVG9rZW4pLDNlNSk7ZWxzZSBpZighdC53ZWJTb2NrZXRJbml0RmFpbGVkKXtjb25zdCBlPXQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRTt0aHJvdyBuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0oZSksdC53ZWJTb2NrZXRJbml0RmFpbGVkPSEwLG5ldyBFcnJvcihlKX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiV2ViU29ja2V0IGZhaWxlZCB0byBpbml0aWFsaXplIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSkpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIkBAQCBlcnJvciIsZSl9fSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuVEVSTUlOQVRFLChmdW5jdGlvbigpe24uaGFuZGxlU2VuZExvZ3NSZXF1ZXN0KG4ubG9nc0J1ZmZlciksdC5jb3JlLnRlcm1pbmF0ZSgpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5URVJNSU5BVEVEKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNZTkNIUk9OSVpFLChmdW5jdGlvbigpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1QsKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbShlLmV2ZW50LGUuZGF0YSl9KSksZS5vbmNvbm5lY3Q9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5wb3J0c1swXSxvPW5ldyB0LlBvcnRTdHJlYW0ocik7bi5tdWx0aXBsZXhlci5hZGRTdHJlYW0obyksci5zdGFydCgpO3ZhciBpPW5ldyB0LkNvbmR1aXQoby5nZXRJZCgpLG51bGwsbyk7aS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSx7aWQ6by5nZXRJZCgpfSksbi5wb3J0Q29uZHVpdE1hcFtvLmdldElkKCldPWksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyx7bGVuZ3RoOk9iamVjdC5rZXlzKG4ucG9ydENvbmR1aXRNYXApLmxlbmd0aH0pLG51bGwhPT1uLmFnZW50JiZuLnVwZGF0ZUFnZW50KCksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQVBJX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlQVBJUmVxdWVzdCxpKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuTUFTVEVSX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlTWFzdGVyUmVxdWVzdCxpLG8uZ2V0SWQoKSkpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlJFTE9BRF9BR0VOVF9DT05GSUdVUkFUSU9OLHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24pKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5UQUJfSUQsdC5oaXRjaChuLG4uaGFuZGxlVGFiSWRFdmVudCxvKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQ0xPU0UsdC5oaXRjaChuLG4uaGFuZGxlQ2xvc2VFdmVudCxvKSl9fTtpLnByb3RvdHlwZS5wb2xsRm9yQWN0aXZlUmVnaW9uPWZ1bmN0aW9uKHIsbyl7dmFyIGk9dGhpcyxzPXQuZ2V0TG9nKCk7aWYoIWkuZHJQb2xsaW5nVXJsKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gVHJpZWQgdG8gcG9sbCBmb3IgYWN0aXZlIHJlZ2lvbiB3aXRob3V0IGZpcnN0IGluaXRpYWxpemluZyBEUiBwb2xsaW5nIGluIHRoZSB3b3JrZXIuIik7cy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBQb2xsaW5nIGZvciBmYWlsb3ZlciB3aXRoIHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIHQuZmV0Y2hXaXRoVGltZW91dChpLmRyUG9sbGluZ1VybCwxZTQpLmNhdGNoKChlPT57aWYoZS5zdGF0dXMpe2lmKGkuY2xpZW50Ll9yZWNvcmRBUElMYXRlbmN5KG4sYSx7c3RhdHVzQ29kZTplLnN0YXR1c30pLFt0LkhUVFBfU1RBVFVTX0NPREVTLkFDQ0VTU19ERU5JRUQsdC5IVFRQX1NUQVRVU19DT0RFUy5VTkFVVEhPUklaRURdLmluY2x1ZGVzKGUuc3RhdHVzKSlyZXR1cm4gcy5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEFjdGl2ZSByZWdpb24gcG9sbGluZyBmYWlsZWQ7IHRyeWluZyB0byBnZXQgYSBuZXcgVVJMIGZvciBwb2xsaW5nLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmdldFByZXNpZ25lZERpc2NvdmVyeVVybCgpLnRoZW4oKGU9PntpLmRyUG9sbGluZ1VybD1lfSkpLnRoZW4oKCgpPT4oYT0obmV3IERhdGUpLmdldFRpbWUoKSx0LmZldGNoV2l0aFRpbWVvdXQoaS5kclBvbGxpbmdVcmwsMWU0KSkpKTt2YXIgcj1gW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gcG9sbCBmb3IgZmFpbG92ZXIgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufSwgcmVjZWl2ZWQgdW5leHBlY3RlZCByZXNwb25zZSBjb2RlICR7ZS5zdGF0dXN9YDt0aHJvdyBzLmVycm9yKHIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuZXcgRXJyb3Iocil9dGhyb3cgcj1gW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gcG9sbCBmb3IgZmFpbG92ZXIgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufSwgcmVxdWVzdCB0aW1lZCBvdXQgb3IgYWJvcnRlZGAsaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHtzdGF0dXNDb2RlOi0xfSkscy5lcnJvcihyKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbmV3IEVycm9yKHIpfSkpLnRoZW4oKGU9PntpZihpLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShuLGEpLCJib29sZWFuIj09dHlwZW9mIGUuVGVybWluYXRlQWN0aXZlQ29udGFjdHMpe3ZhciBjPSFlLlRlcm1pbmF0ZUFjdGl2ZUNvbnRhY3RzO2lmKGUuSW5zdGFuY2VBcm4paWYocy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBTdWNjZXNzZnVsbHkgcG9sbGVkIGZvciBhY3RpdmUgcmVnaW9uLiBQcmltYXJ5IGluc3RhbmNlIEFSTiBpcyAke2UuSW5zdGFuY2VBcm59IGFuZCBzb2Z0IGZhaWxvdmVyIGlzIGArKGM/ImVuYWJsZWQiOiJkaXNhYmxlZCIpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkudGhpc0Fybj09PWUuSW5zdGFuY2VBcm4mJiFpLnN1cHByZXNzJiZyKXMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IGlzIGJlaW5nIHNldCB0byBwcmltYXJ5YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtuZXh0QWN0aXZlQXJuOmUuSW5zdGFuY2VBcm59KTtlbHNlIGlmKGkub3RoZXJBcm49PT1lLkluc3RhbmNlQXJuKXtpZighY3x8b3x8IXJ8fGkuc3VwcHJlc3MmJiFpLnBlbmRpbmdGYWlsb3Zlcnx8aS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7bmV4dEFjdGl2ZUFybjppLnRoaXNBcm59KSwhaS5zdXBwcmVzcyl7aS5zdXBwcmVzcz0hMDtjb25zdCBuPWMmJiFvO24/KGkucGVuZGluZ0ZhaWxvdmVyPSEwLHMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IHdpbGwgYmUgc2V0IHRvIHN0YW5kLWJ5IHVzaW5nIHNvZnQgZmFpbG92ZXJgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKTpzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICR7aS50aGlzQXJufSBpcyBiZWluZyBzZXQgdG8gc3RhbmQtYnkgaW1tZWRpYXRlbHlgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSx7c29mdEZhaWxvdmVyOm4sbmV4dEFjdGl2ZUFybjplLkluc3RhbmNlQXJufSl9fWVsc2VbaS50aGlzQXJuLGkub3RoZXJBcm5dLmluY2x1ZGVzKGUuSW5zdGFuY2VBcm4pfHxzLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIFRoZSBjdXJyZW50IHByaW1hcnkgaW5zdGFuY2UgaW4gdGhpcyBhZ2VudCdzIGZhaWxvdmVyIGdyb3VwICR7ZS5JbnN0YW5jZUFybn0gZG9lc24ndCBtYXRjaCB0aGlzIGluc3RhbmNlICR7aS50aGlzQXJufSBvciB0aGUgb3RoZXIgaW5zdGFuY2UgJHtpLm90aGVyQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7ZWxzZSBzLmVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIERSIHBvbGxpbmcgcmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGEgdHJ1dGh5IGFjdGl2ZSBpbnN0YW5jZSBBUk4uIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2Ugcy5lcnJvcigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBEUiBwb2xsaW5nIHJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBhIHZhbGlkIHZhbHVlIGZvciBUZXJtaW5hdGVBY3RpdmVDb250YWN0cy4iKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuY2F0Y2goKGU9PntlLnN0YXR1cyYmaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHsuLi5lLHN0YXR1c0NvZGU6ZS5zdGF0dXN9KSxzLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEFjdGl2ZSByZWdpb24gcG9sbGluZyBmYWlsZWQgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufS5gKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuZmluYWxseSgoKCk9PnshbyYmcnx8ZS5zZXRUaW1lb3V0KHQuaGl0Y2goaSxpLnBvbGxGb3JBY3RpdmVSZWdpb24pLDZlNCl9KSl9LGkucHJvdG90eXBlLmdldFByZXNpZ25lZERpc2NvdmVyeVVybD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKCgobixyKT0+e3QuZ2V0TG9nKCkuaW5mbyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBHZXR0aW5nIHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS50aGlzQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5BR0VOVF9ESVNDT1ZFUll9LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2UmJmUuYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQmJmUuYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQucHJlc2lnbmVkVXJsPyh0LmdldExvZygpLmluZm8oImdldFByZXNpZ25lZERpc2NvdmVyeVVybCBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4oZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydC5wcmVzaWduZWRVcmwpKToodC5nZXRMb2coKS5pbmZvKCJnZXRQcmVzaWduZWREaXNjb3ZlcnlVcmwgcmVjZWl2ZWQgZW1wdHkvaW52YWxpZCBkYXRhIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoRXJyb3IoImdldFByZXNpZ25lZERpc2NvdmVyeVVybCByZWNlaXZlZCBlbXB0eS9pbnZhbGlkIGRhdGEiKSkpfSxmYWlsdXJlOmZ1bmN0aW9uKG4sbyl7dC5nZXRMb2coKS5lcnJvcihgW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS50aGlzQXJufWApLndpdGhFeGNlcHRpb24obikud2l0aE9iamVjdChvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobmV3IEVycm9yKCJGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwiKSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpKCkscihuZXcgRXJyb3IoIkVuY291bnRlcmVkIGF1dGggZmFpbHVyZSB3aGVuIGdldHRpbmcgcHJlc2lnbmVkIFVSTCIpKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKCl7dC5oaXRjaChlLGUuaGFuZGxlQWNjZXNzRGVuaWVkKSgpLHIobmV3IEVycm9yKCJFbmNvdW50ZXJlZCBhY2Nlc3MgZGVuaWVkIHdoZW4gZ2V0dGluZyBwcmVzaWduZWQgVVJMIikpfX0pfSkpfSxpLnByb3RvdHlwZS5wb2xsRm9yQWdlbnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9dC5oaXRjaChuLG4uaGFuZGxlUG9sbGluZ0F1dGhGYWlsKTt0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU05BUFNIT1Qse25leHRUb2tlbjpuLm5leHRUb2tlbix0aW1lb3V0OjNlNH0se3N1Y2Nlc3M6ZnVuY3Rpb24ocixvKXt0cnl7bi5hZ2VudD1uLmFnZW50fHx7fSxuLmFnZW50LnNuYXBzaG90PXIuc25hcHNob3Qsbi5hZ2VudC5zbmFwc2hvdC5sb2NhbFRpbWVzdGFtcD10Lm5vdygpLG4uYWdlbnQuc25hcHNob3Quc2tldz1uLmFnZW50LnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wLW4uYWdlbnQuc25hcHNob3QubG9jYWxUaW1lc3RhbXAsbi5uZXh0VG9rZW49ci5uZXh0VG9rZW4sbyYmby5oYXNPd25Qcm9wZXJ0eSgiY29udGVudExlbmd0aCIpJiYobi5hZ2VudC5zbmFwc2hvdC5jb250ZW50TGVuZ3RoPW8uY29udGVudExlbmd0aCksdC5nZXRMb2coKS50cmFjZSgiR0VUX0FHRU5UX1NOQVBTSE9UIHN1Y2NlZWRlZC4iKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi51cGRhdGVBZ2VudCgpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkxvbmcgcG9sbCBmYWlsZWQgdG8gdXBkYXRlIGFnZW50LiIpLndpdGhPYmplY3Qocikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWZpbmFsbHl7ZS5zZXRUaW1lb3V0KHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudCksMTAwKX19LGZhaWx1cmU6ZnVuY3Rpb24ocixvKXt0cnl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGdldCBhZ2VudCBkYXRhLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOnIsZGF0YTpvfSl9ZmluYWxseXtlLnNldFRpbWVvdXQodC5oaXRjaChuLG4ucG9sbEZvckFnZW50KSw1ZTMpfX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXtyKCl9LGFjY2Vzc0RlbmllZDp0LmhpdGNoKG4sbi5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LGkucHJvdG90eXBlLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb249ZnVuY3Rpb24obil7dmFyIHI9dGhpcyxvPW58fHt9LGk9dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKTt0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfQ09ORklHVVJBVElPTix7fSx7c3VjY2VzczpmdW5jdGlvbihuKXt2YXIgaT1uLmNvbmZpZ3VyYXRpb247ci5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucyhpKSxyLnBvbGxGb3JBZ2VudFN0YXRlcyhpKSxyLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2RlcyhpKSxyLnBvbGxGb3JSb3V0aW5nUHJvZmlsZVF1ZXVlcyhpKSxvLnJlcGVhdEZvcmV2ZXImJmUuc2V0VGltZW91dCh0LmhpdGNoKHIsci5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uLG8pLDNlNCl9LGZhaWx1cmU6ZnVuY3Rpb24obixpKXt0cnl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IGNvbmZpZ3VyYXRpb24gZGF0YS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjpuLGRhdGE6aX0pfWZpbmFsbHl7by5yZXBlYXRGb3JldmVyJiZlLnNldFRpbWVvdXQodC5oaXRjaChyLHIucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbiksM2U0LG8pfX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXtpKCl9LGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LGkucHJvdG90eXBlLnBvbGxGb3JBZ2VudFN0YXRlcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU1RBVEVTLHtuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvckFnZW50U3RhdGVzKGUse3N0YXRlczooby5zdGF0ZXN8fFtdKS5jb25jYXQodC5zdGF0ZXMpLG5leHRUb2tlbjp0Lm5leHRUb2tlbixtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30pOihlLmFnZW50U3RhdGVzPShvLnN0YXRlc3x8W10pLmNvbmNhdCh0LnN0YXRlcyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IHN0YXRlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0saS5wcm90b3R5cGUucG9sbEZvckFnZW50UGVybWlzc2lvbnM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1BFUk1JU1NJT05TLHtuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvckFnZW50UGVybWlzc2lvbnMoZSx7cGVybWlzc2lvbnM6KG8ucGVybWlzc2lvbnN8fFtdKS5jb25jYXQodC5wZXJtaXNzaW9ucyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUucGVybWlzc2lvbnM9KG8ucGVybWlzc2lvbnN8fFtdKS5jb25jYXQodC5wZXJtaXNzaW9ucyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IHBlcm1pc3Npb25zIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxpLnByb3RvdHlwZS5wb2xsRm9yRGlhbGFibGVDb3VudHJ5Q29kZXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0RJQUxBQkxFX0NPVU5UUllfQ09ERVMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yRGlhbGFibGVDb3VudHJ5Q29kZXMoZSx7Y291bnRyeUNvZGVzOihvLmNvdW50cnlDb2Rlc3x8W10pLmNvbmNhdCh0LmNvdW50cnlDb2RlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUuZGlhbGFibGVDb3VudHJpZXM9KG8uY291bnRyeUNvZGVzfHxbXSkuY29uY2F0KHQuY291bnRyeUNvZGVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggZGlhbGFibGUgY291bnRyeSBjb2RlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0saS5wcm90b3R5cGUucG9sbEZvclJvdXRpbmdQcm9maWxlUXVldWVzPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPW58fHt9O28ubWF4UmVzdWx0cz1vLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9ST1VUSU5HX1BST0ZJTEVfUVVFVUVTLHtyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlQVJOLG5leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yUm91dGluZ1Byb2ZpbGVRdWV1ZXMoZSx7Y291bnRyeUNvZGVzOihvLnF1ZXVlc3x8W10pLmNvbmNhdCh0LnF1ZXVlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUucm91dGluZ1Byb2ZpbGUucXVldWVzPShvLnF1ZXVlc3x8W10pLmNvbmNhdCh0LnF1ZXVlcyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHJvdXRpbmcgcHJvZmlsZSBxdWV1ZXMgbGlzdC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpLGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LGkucHJvdG90eXBlLmhhbmRsZUFQSVJlcXVlc3Q9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO3RoaXMuY2xpZW50LmNhbGwobi5tZXRob2Qsbi5wYXJhbXMse3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dmFyIG89dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLG4scik7ZS5zZW5kRG93bnN0cmVhbShvLmV2ZW50LG8pfSxmYWlsdXJlOmZ1bmN0aW9uKG8saSl7dmFyIHM9dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLG4saSxKU09OLnN0cmluZ2lmeShvKSk7ZS5zZW5kRG93bnN0cmVhbShzLmV2ZW50LHMpLHQuZ2V0TG9nKCkuZXJyb3IoIiclcycgQVBJIHJlcXVlc3QgZmFpbGVkIixuLm1ldGhvZCkud2l0aE9iamVjdCh7cmVxdWVzdDpyLmZpbHRlckF1dGhUb2tlbihuKSxyZXNwb25zZTpzfSkud2l0aEV4Y2VwdGlvbihvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVBdXRoRmFpbCx7YXV0aG9yaXplOiEwfSl9KX0saS5wcm90b3R5cGUuaGFuZGxlTWFzdGVyUmVxdWVzdD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcy5jb25kdWl0LGk9bnVsbDtzd2l0Y2goci5tZXRob2Qpe2Nhc2UgdC5NYXN0ZXJNZXRob2RzLkJFQ09NRV9NQVNURVI6dmFyIHM9dGhpcy5tYXN0ZXJDb29yZC5nZXRNYXN0ZXIoci5wYXJhbXMudG9waWMpLGE9Qm9vbGVhbihzKSYmcyE9PW47dGhpcy5tYXN0ZXJDb29yZC5zZXRNYXN0ZXIoci5wYXJhbXMudG9waWMsbiksaT10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0Uscix7bWFzdGVySWQ6bix0YWtlT3ZlcjphLHRvcGljOnIucGFyYW1zLnRvcGljfSksYSYmby5zZW5kRG93bnN0cmVhbShpLmV2ZW50LGkpO2JyZWFrO2Nhc2UgdC5NYXN0ZXJNZXRob2RzLkNIRUNLX01BU1RFUjoocz10aGlzLm1hc3RlckNvb3JkLmdldE1hc3RlcihyLnBhcmFtcy50b3BpYykpfHxyLnBhcmFtcy5zaG91bGROb3RCZWNvbWVNYXN0ZXJJZk5vbmV8fCh0aGlzLm1hc3RlckNvb3JkLnNldE1hc3RlcihyLnBhcmFtcy50b3BpYyxuKSxzPW4pLGk9dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFLHIse21hc3RlcklkOnMsaXNNYXN0ZXI6bj09PXMsdG9waWM6ci5wYXJhbXMudG9waWN9KTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBtYXN0ZXIgbWV0aG9kOiAiK3IubWV0aG9kKX1lLnNlbmREb3duc3RyZWFtKGkuZXZlbnQsaSl9LGkucHJvdG90eXBlLmhhbmRsZVRhYklkRXZlbnQ9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO3RyeXtsZXQgbz1uLnRhYklkLGk9ci5zdHJlYW1NYXBCeVRhYklkW29dLHM9ZS5nZXRJZCgpLGE9T2JqZWN0LmtleXMoci5zdHJlYW1NYXBCeVRhYklkKS5maWx0ZXIoKGU9PnIuc3RyZWFtTWFwQnlUYWJJZFtlXS5sZW5ndGg+MCkpLmxlbmd0aDtpZihpJiZpLmxlbmd0aD4wKXtpZighaS5pbmNsdWRlcyhzKSl7ci5zdHJlYW1NYXBCeVRhYklkW29dLnB1c2gocyk7bGV0IGU9e2xlbmd0aDpPYmplY3Qua2V5cyhyLnBvcnRDb25kdWl0TWFwKS5sZW5ndGgsdGFiSWQ6byxzdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI6YX07ZVtvXT17bGVuZ3RoOmkubGVuZ3RofSxyLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLGUpfX1lbHNle3Iuc3RyZWFtTWFwQnlUYWJJZFtvXT1bZS5nZXRJZCgpXTtsZXQgbj17bGVuZ3RoOk9iamVjdC5rZXlzKHIucG9ydENvbmR1aXRNYXApLmxlbmd0aCx0YWJJZDpvLHN0cmVhbXNUYWJzQWNyb3NzQnJvd3NlcjphKzF9O25bb109e2xlbmd0aDpyLnN0cmVhbU1hcEJ5VGFiSWRbb10ubGVuZ3RofSxyLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLG4pfX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkc10gSXNzdWUgdXBkYXRpbmcgY29ubmVjdGVkIENDUHMgd2l0aGluIHRoZSBzYW1lIHRhYiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19LGkucHJvdG90eXBlLmhhbmRsZUNsb3NlRXZlbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztuLm11bHRpcGxleGVyLnJlbW92ZVN0cmVhbShlKSxkZWxldGUgbi5wb3J0Q29uZHVpdE1hcFtlLmdldElkKCldLG4ubWFzdGVyQ29vcmQucmVtb3ZlTWFzdGVyKGUuZ2V0SWQoKSk7bGV0IHI9e2xlbmd0aDpPYmplY3Qua2V5cyhuLnBvcnRDb25kdWl0TWFwKS5sZW5ndGh9LG89T2JqZWN0LmtleXMobi5zdHJlYW1NYXBCeVRhYklkKTt0cnl7bGV0IHQ9by5maW5kKCh0PT5uLnN0cmVhbU1hcEJ5VGFiSWRbdF0uaW5jbHVkZXMoZS5nZXRJZCgpKSkpO2lmKHQpe2xldCBvPW4uc3RyZWFtTWFwQnlUYWJJZFt0XS5maW5kSW5kZXgoKHQ9PmUuZ2V0SWQoKT09PXQpKTtuLnN0cmVhbU1hcEJ5VGFiSWRbdF0uc3BsaWNlKG8sMSk7bGV0IGk9bi5zdHJlYW1NYXBCeVRhYklkW3RdP24uc3RyZWFtTWFwQnlUYWJJZFt0XS5sZW5ndGg6MDtyW3RdPXtsZW5ndGg6aX0sci50YWJJZD10fWxldCBpPW8uZmlsdGVyKChlPT5uLnN0cmVhbU1hcEJ5VGFiSWRbZV0ubGVuZ3RoPjApKS5sZW5ndGg7ci5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI9aX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkc10gSXNzdWUgdXBkYXRpbmcgdGFiSWQtc3BlY2lmaWMgc3RyZWFtIGRhdGEiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyxyKX0saS5wcm90b3R5cGUudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKGUpe2UucGVybWlzc2lvbnMmJmUuZGlhbGFibGVDb3VudHJpZXMmJmUuYWdlbnRTdGF0ZXMmJmUucm91dGluZ1Byb2ZpbGUucXVldWVzPyh0aGlzLmFnZW50PXRoaXMuYWdlbnR8fHt9LHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbj1lLHRoaXMudXBkYXRlQWdlbnQoKSk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgY29uZmlndXJhdGlvbiB1bnRpbCBhbGwgY29uZmlnIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxpLnByb3RvdHlwZS51cGRhdGVBZ2VudD1mdW5jdGlvbigpe3RoaXMuYWdlbnQ/dGhpcy5hZ2VudC5zbmFwc2hvdD90aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24/KHRoaXMuYWdlbnQuc25hcHNob3Quc3RhdHVzPXRoaXMuYWdlbnQuc3RhdGUsdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cyYmdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5sZW5ndGg+MSYmdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCktdC5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpfSkpLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5zdGF0dXM9ZS5zdGF0ZSxlLmNvbm5lY3Rpb25zLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYWRkcmVzcz1lLmVuZHBvaW50fSkpfSkpLHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5kZWZhdWx0T3V0Ym91bmRRdWV1ZS5xdWV1ZUlkPXRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5kZWZhdWx0T3V0Ym91bmRRdWV1ZS5xdWV1ZUFSTix0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucXVldWVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UucXVldWVJZD1lLnF1ZXVlQVJOfSkpLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5xdWV1ZSYmKGUucXVldWUucXVldWVJZD1lLnF1ZXVlLnF1ZXVlQVJOKX0pKSx0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZD10aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVBUk4sdGhpcy5zdXBwcmVzcyYmKHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHM9dGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXRlLnR5cGU9PXQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNURUR8fGUuc3RhdGUudHlwZT09dC5Db250YWN0U3RhdGVUeXBlLkVOREVEfSkpLHRoaXMuZm9yY2VPZmZsaW5lJiZ0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUpKSx0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5VUERBVEUsdGhpcy5hZ2VudCkpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBzbmFwc2hvdCBpcyBhdmFpbGFibGUuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCB1bnRpbCB0aGUgYWdlbnQgaGFzIGJlZW4gZnVsbHkgY29uc3RydWN0ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0saS5wcm90b3R5cGUuZ2V0V2ViU29ja2V0VXJsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQuY29yZS5nZXRDbGllbnQoKSxyPXQuaGl0Y2goZSxlLmhhbmRsZUF1dGhGYWlsKSxvPXQuaGl0Y2goZSxlLmhhbmRsZUFjY2Vzc0RlbmllZCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLGkpe24uY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5XRUJfU09DS0VUfSx7c3VjY2VzczpmdW5jdGlvbihuKXt0LmdldExvZygpLmluZm8oImdldFdlYlNvY2tldFVybCBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUobil9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJnZXRXZWJTb2NrZXRVcmwgZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KSxpKHtyZWFzb246ImdldFdlYlNvY2tldFVybCBmYWlsZWQiLF9kZWJ1ZzplfSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIEF1dGggRmFpbHVyZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShFcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIGdldHRpbmcgZ2V0V2ViU29ja2V0VXJsIikpLHIoKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKCl7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIEFjY2VzcyBEZW5pZWQgRmFpbHVyZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShFcnJvcigiQWNjZXNzIERlbmllZCBGYWlsdXJlIHdoaWxlIGdldHRpbmcgZ2V0V2ViU29ja2V0VXJsIikpLG8oKX19KX0pKX0saS5wcm90b3R5cGUuaGFuZGxlU2VuZExvZ3NSZXF1ZXN0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPVtdLHI9ZS5sb2dzQnVmZmVyLnNsaWNlKCk7ZS5sb2dzQnVmZmVyPVtdLHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5wdXNoKHt0aW1lc3RhbXA6ZS50aW1lLGNvbXBvbmVudDplLmNvbXBvbmVudCxtZXNzYWdlOmUudGV4dH0pfSkpLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfQ0xJRU5UX0xPR1Mse2xvZ0V2ZW50czpufSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIlNlbmRMb2dzIHJlcXVlc3Qgc3VjY2VlZGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJTZW5kTG9ncyByZXF1ZXN0IGZhaWxlZC4iKS53aXRoT2JqZWN0KG4pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sYXV0aEZhaWx1cmU6dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpfSl9LGkucHJvdG90eXBlLmhhbmRsZUF1dGhGYWlsPWZ1bmN0aW9uKGUpe2U/dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKTp0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVVUSF9GQUlMKX0saS5wcm90b3R5cGUuaGFuZGxlUG9sbGluZ0F1dGhGYWlsPWZ1bmN0aW9uKCl7dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkNUSV9BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQpfSxpLnByb3RvdHlwZS5oYW5kbGVBY2Nlc3NEZW5pZWQ9ZnVuY3Rpb24oKXt0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQUNDRVNTX0RFTklFRCl9LGkucHJvdG90eXBlLmNoZWNrQXV0aFRva2VuPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPW5ldyBEYXRlKGUuaW5pdERhdGEuYXV0aFRva2VuRXhwaXJhdGlvbikscj0obmV3IERhdGUpLmdldFRpbWUoKTtuLmdldFRpbWUoKTxyKzE4ZTUmJih0LmdldExvZygpLmluZm8oIkF1dGggdG9rZW4gZXhwaXJlcyBhdCAiK24rIiBTdGFydCByZWZyZXNoaW5nIHRva2VuIHdpdGggcmV0cnkuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmJhY2tvZmYodC5oaXRjaChlLGUuYXV0aG9yaXplKSwxZTQsNCkpfSxpLnByb3RvdHlwZS5hdXRob3JpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LmNvcmUuYXV0aG9yaXplKHRoaXMuaW5pdERhdGEuYXV0aG9yaXplRW5kcG9pbnQpLnRoZW4oKGZ1bmN0aW9uKHIpe3ZhciBvPW5ldyBEYXRlKHIuZXhwaXJhdGlvbik7dC5nZXRMb2coKS5pbmZvKCJBdXRob3JpemF0aW9uIHN1Y2NlZWRlZCBhbmQgdGhlIHRva2VuIGV4cGlyZXMgYXQgJXMiLG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5pbml0RGF0YS5hdXRoVG9rZW49ci5hY2Nlc3NUb2tlbixuLmluaXREYXRhLmF1dGhUb2tlbkV4cGlyYXRpb249byx0LmNvcmUuaW5pdENsaWVudChuLmluaXREYXRhKSx0LmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50KG4uaW5pdERhdGEpLGUuc3VjY2VzcygpfSkpLmNhdGNoKChmdW5jdGlvbihyKXt0LmdldExvZygpLmVycm9yKCJBdXRob3JpemF0aW9uIGZhaWxlZCB3aXRoIGNvZGUgJXMiLHIuc3RhdHVzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDQwMT09PXIuc3RhdHVzP24uaGFuZGxlQXV0aEZhaWwoKTplLmZhaWx1cmUoKX0pKX0saS5wcm90b3R5cGUuZmlsdGVyQXV0aFRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKWlmKCJwYXJhbXMiPT09bil7dmFyIHI9e307Zm9yKHZhciBvIGluIGUucGFyYW1zKSJhdXRoZW50aWNhdGlvbiIhPT1vJiYocltvXT1lLnBhcmFtc1tvXSk7dC5wYXJhbXM9cn1lbHNlIHRbbl09ZVtuXTtyZXR1cm4gdH0sdC53b3JrZXIubWFpbj1mdW5jdGlvbigpe3Qud29ya2VyLmNsaWVudEVuZ2luZT1uZXcgaX19KCl9fSx0PXt9O2Z1bmN0aW9uIG4ocil7dmFyIG89dFtyXTtpZih2b2lkIDAhPT1vKXJldHVybiBvLmV4cG9ydHM7dmFyIGk9dFtyXT17ZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5leHBvcnRzfW4uZz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpczt0cnl7cmV0dXJuIHRoaXN8fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKGUpe2lmKCJvYmplY3QiPT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3d9fSgpLG4oODI3KSxuKDE2Myksbig5NDQpLG4oMTUxKSxuKDg5MSksbig1OTIpLG4oODIpLG4oNzU0KSxuKDgzMyksbig5NjUpLG4oMjg2KSxuKDg5NSksbig3NDMpLG4oNjQyKSxuKDczNiksbig0MzkpLG4oMjc5KSxuKDQxOCksbigxODcpLG4oODIxKSxuKDUwMCl9KSgpOw=="),d=function(l){this.id=l.region,l.region=this._normalizeRegionString(l.region),this.height=l.height,this.style=l.iframe_style,this.ccp=this._createFramedCcp(l)};d.prototype._createFramedCcp=function(l){var Z=Z||"microphone; autoplay; clipboard-write",b=this.style||"margin: 0; border: 0; padding: 0px; width: 0px; height: 0px",d=document.createElement("iframe");return d.srcdoc=this.getContent(l),d.allow=Z,d.id=this.id,d.style=b,d.scrolling="no",d},d.prototype.getContent=function(l){return["","","","
","