serve-sim 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/serve-sim-bin +0 -0
- package/dist/middleware.js +7 -7
- package/dist/serve-sim.js +14 -14
- package/package.json +1 -1
- package/src/middleware.ts +50 -5
package/bin/serve-sim-bin
CHANGED
|
Binary file
|
package/dist/middleware.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{readdirSync as y,readFileSync as x,existsSync as E}from"fs";import{spawn as U,exec as g,execFile as N}from"child_process";import{tmpdir as k}from"os";import{join as j}from"path";var B=j(k(),"serve-sim"),R=new Set(["host.exp.Exponent","dev.expo.Exponent"]),q=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],_=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;function I($){return!_.test($)}function v($,C){if(R.has(C))return Promise.resolve(!0);return new Promise((J)=>{N("xcrun",["simctl","get_app_container",$,C,"app"],{timeout:2000},(z,K)=>{if(z)return J(!1);let X=K.trim();if(!X)return J(!1);for(let W of q)if(E(j(X,W)))return J(!0);J(!1)})})}function O(){let $;try{$=y(B).filter((J)=>J.startsWith("server-")&&J.endsWith(".json"))}catch{return[]}let C=[];for(let J of $)try{let z=JSON.parse(x(j(B,J),"utf-8"));try{process.kill(z.pid,0),C.push(z)}catch{}}catch{}return C}var P=null;function p(){if(!P)P=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixSNCx4NSxQMCxUNCxqNCx2NCxLNCxtMCxUMCx5NCxONCwkNCx6NCxwNCxmMD17fSxhMD1bXSxoNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gRzQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZDAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBkMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK1I0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGQoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gYyhYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBtNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLFY0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLG00KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJmc0KFEpfX1mdW5jdGlvbiBnNChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSksZzQoWCl9ZnVuY3Rpb24gVzQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxUNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoVDQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fGo0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHY0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsbTUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIHg0KFgsWixKLFkscSxRLEssVyxHLHosUCl7dmFyICQsXyxPLEMsQSxrLEksTT1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1kNShKLFosTSxHLGgpLCQ9MDskPGg7JCsrKShPPUouX19rWyRdKSE9bnVsbCYmKF89Ty5fX2khPS0xJiZNW08uX19pXXx8ZjAsTy5fX2k9JCxrPVY0KFgsTyxfLHEsUSxLLFcsRyx6LFApLEM9Ty5fX2UsTy5yZWYmJl8ucmVmIT1PLnJlZiYmKF8ucmVmJiZINChfLnJlZixudWxsLE8pLFAucHVzaChPLnJlZixPLl9fY3x8QyxPKSksQT09bnVsbCYmQyE9bnVsbCYmKEE9QyksKEk9ISEoNCZPLl9fdSkpfHxfLl9faz09PU8uX19rPyhHPWg0KE8sRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBPLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOkMmJihHPUMubmV4dFNpYmxpbmcpLE8uX191Jj0tNyk7cmV0dXJuIEouX19lPUEsR31mdW5jdGlvbiBkNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosUD1KLmxlbmd0aCwkPVAsXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWQwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1kMChkLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWQwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWY1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+UD9fLS06cTxQJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8UDtRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksZjQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gaDQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPWg0KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGY1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxQPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8UCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihQPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBiNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGg1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8YjQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8YjQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UoeTQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1ONCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP3o0OiQ0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP3o0OiQ0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUzQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1ONCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIFY0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBQLCQsXyxPLEMsQSxrLEksTSxoLEUsbixRMCxnLEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChQPUIuX19iKSYmUChaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsTT1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KFA9cy5jb250ZXh0VHlwZSkmJllbUC5fX2NdLEU9UD9oP2gucHJvcHMudmFsdWU6UC5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihNP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgYyhJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1sNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksTSYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxNJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLE89JC5wcm9wcyxDPSQuc3RhdGUsJC5fX3Y9WixfKU0mJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxNJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoTSYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1PJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxNJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKE8sQyxBKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLG49Qi5fX3IsUTA9MCxNKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsbiYmbihaKSxQPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsbiYmbihaKSxQPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrUTA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxNJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKEE9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShPLEMpKSxnPVAhPW51bGwmJlAudHlwZT09PWQmJlAua2V5PT1udWxsP2Q0KFAucHJvcHMuY2hpbGRyZW4pOlAsVz14NChYLGIwKGcpP2c6W2ddLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspRzQoUVtLMF0pO0w0KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxMNChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWE1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKFA9Qi5kaWZmZWQpJiZQKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBMNChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKEw0KSl9ZnVuY3Rpb24gbTQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKUg0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGE1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixQLCQsXyxPLEMsQSxrPUoucHJvcHN8fGYwLEk9Wi5wcm9wcyxNPVoudHlwZTtpZihNPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6TT09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoTz1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBPPT0hIU0mJihNP08ubG9jYWxOYW1lPT1NOk8ubm9kZVR5cGU9PTMpKXtYPU8sUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihNPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLE0sSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihNPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhPPVguYXR0cmlidXRlc1t6XSkubmFtZV09Ty52YWx1ZTtmb3IoeiBpbiBrKU89a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9Tzp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsTyxxKTtmb3IoeiBpbiBJKU89SVt6XSx6PT0iY2hpbGRyZW4iP189Tzp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP1A9Tzp6PT0idmFsdWUiP0M9Tzp6PT0iY2hlY2tlZCI/QT1POlcmJnR5cGVvZiBPIT0iZnVuY3Rpb24ifHxrW3pdPT09T3x8aDAoWCx6LE8sa1t6XSxxKTtpZihQKVd8fCQmJihQLl9faHRtbD09JC5fX2h0bWx8fFAuX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1QLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLHg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxNPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylHNChRW3pdKTtXfHwoej0idmFsdWUiLE09PSJwcm9ncmVzcyImJkM9PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6QyE9bnVsbCYmKEMhPT1YW3pdfHxNPT0icHJvZ3Jlc3MiJiYhQ3x8TT09Im9wdGlvbiImJkMhPWtbel0pJiZoMChYLHosQyxrW3pdLHEpLHo9ImNoZWNrZWQiLEEhPW51bGwmJkEhPVhbel0mJmgwKFgseixBLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIEg0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGY0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8SDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZmNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8RzQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGw1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLFY0KFosWD0oIVkmJkp8fFopLl9faz1XMChkLG51bGwsW1hdKSxxfHxmMCxmMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxtNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLFc0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrcDQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LFI0PTAseDU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGMucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLFc0KHRoaXMpKX0sYy5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLFc0KHRoaXMpKX0sYy5wcm90b3R5cGUucmVuZGVyPWQsUDA9W10sajQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHY0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLEs0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrSzQsVDA9Il9fYSIrSzQseTQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksTjQ9MCwkND1TNCghMSksejQ9UzQoITApLHA0PTA7dmFyIEYwLHAsUDQsYTQsUzA9MCx0ND1bXSxmPUIsbDQ9Zi5fX2IsYzQ9Zi5fX3IsaTQ9Zi5kaWZmZWQsdTQ9Zi5fX2MsbzQ9Zi51bm1vdW50LHM0PWYuX187ZnVuY3Rpb24gbzAoWCxaKXtmLl9faCYmZi5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsTzQoZTQsWCl9ZnVuY3Rpb24gTzQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOmU0KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgUD1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKFAuZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIFAuc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIE89Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxPIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgUD1RO1E9dm9pZCAwLHEoVyxHLHopLFE9UH1LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIHgoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFmLl9fcyYmbjQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gbjQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiBjNSgpe2Zvcih2YXIgWDtYPXQ0LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShBNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZi5fX2UoSixYLl9fdil9fX1mLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsbDQmJmw0KFgpfSxmLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSksczQmJnM0KFgsWil9LGYuX19yPWZ1bmN0aW9uKFgpe2M0JiZjNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKFA0PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShBNCksWi5fX2g9W10sRjA9MCkpLFA0PXB9LGYuZGlmZmVkPWZ1bmN0aW9uKFgpe2k0JiZpNChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJih0NC5wdXNoKFopIT09MSYmYTQ9PT1mLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChhND1mLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fGk1KShjNSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLFA0PXA9bnVsbH0sZi5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8QTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGYuX19lKFksSi5fX3YpfX0pLHU0JiZ1NChYLFopfSxmLnVubW91bnQ9ZnVuY3Rpb24oWCl7bzQmJm80KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmYuX19lKFosSi5fX3YpKX07dmFyIHI0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gaTUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSxyNCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3I0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBBNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gbjQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIGU1KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFg1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KFo1LnByb3RvdHlwZT1uZXcgYykuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsWjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBYNSh0aGlzLnByb3BzLFgpfHxYNSh0aGlzLnN0YXRlLFopfTt2YXIgSjU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLEo1JiZKNShYKX07dmFyIFg2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9WDYoWCxaLEosWSl9O3ZhciBZNT1CLnVubW91bnQ7ZnVuY3Rpb24gVzUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1lNSh7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gVzUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBMNShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIFU0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIE41KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxZNSYmWTUoWCl9LChVNC5wcm90b3R5cGU9bmV3IGMpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPU41KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TDUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgUDtmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtQPVkuby5wb3AoKTspUC5fX1A9VyxQLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxVNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LFU0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPVc1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGQsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChkLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIHE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBjKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPU41KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxxNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtxNShYLEosWil9KX07dmFyIFo2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLEo2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxZNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLHE2PS9bQS1aMC05XS9nLFE2PXR5cGVvZiBkb2N1bWVudDwidSIsSzY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBHNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1jLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBRNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIFE1JiYoWD1RNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIFY1LCQ2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSxLNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHxRNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fEs2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpZNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJko2LnRlc3QoSyk/Sz1LLnJlcGxhY2UocTYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIiwkNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVo2LEs1JiZLNShYKX07dmFyICQ1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpeyQ1JiYkNShYKSxWNT1YLl9fY307dmFyIHo1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksVjU9bnVsbH07ZnVuY3Rpb24gSDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIFA1KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7RzUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe0g1KFgpfX19ZnVuY3Rpb24gTTUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gQTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBPNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oTzUucHJvdG90eXBlPW5ldyBjKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxPNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIEE1KHRoaXMucHJvcHMsWCl8fEE1KHRoaXMuc3RhdGUsWil9O3ZhciBVNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksVTUmJlU1KFgpfTt2YXIgejY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1NNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9ejYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgVzY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1XNihYLFosSixZKX07dmFyIEI1PUIudW5tb3VudDtmdW5jdGlvbiBDNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPU01KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBDNShZLFosSil9KSksWH1mdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIEU1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gXzQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gdzUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLEI1JiZCNShYKX0sKF80LnByb3RvdHlwZT1uZXcgYykuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9dzUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT1FNSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBQO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO1A9WS5vLnBvcCgpOylQLl9fUD1XLFAuZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LF80LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sXzQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09QzUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZCxudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGQsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgXzU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGMpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9dzUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLF81KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope181KFgsSixaKX0pfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsTjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEc2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sVjY9L1tBLVowLTldL2csSDY9dHlwZW9mIGRvY3VtZW50PCJ1IixQNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2MucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEY1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRjUmJihYPUY1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgVDUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LEQ1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fEg2JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8UDYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkc2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmTjYudGVzdChLKT9LPUsucmVwbGFjZShWNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9TDYsRDUmJkQ1KFgpfTt2YXIgazU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7azUmJms1KFgpLFQ1PVguX19jfTt2YXIgSTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7STUmJkk1KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxUNT1udWxsfTt2YXIgTzY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1PNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEY0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsVTY9MyxCNj00LF82PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOlAsc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6Tyxjb25uZWN0aW9uUXVhbGl0eTpDfSl7bGV0IEE9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksTT13KG51bGwpLFtoLEVdPVMoITEpLFtuLFEwXT1TKG51bGwpLFtnLEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixPMF09UyhudWxsKTt4KCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFU9TFswXT8uY29udGVudFJlY3Q7aWYoVSlPMCh7d2lkdGg6VS53aWR0aCxoZWlnaHQ6VS5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7eCgoKT0+e2lmKEM9PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtDXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoTyk7di5jdXJyZW50PU8seCgoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLHgoKCk9PntpZihBJiYkKUswKCQpfSxbQSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IGk9dyhudWxsKTt4KCgpPT57aWYoIUF8fCF6KXJldHVybjtyZXR1cm4geigoVik9PntHMC5jdXJyZW50KyssZS5jdXJyZW50PURhdGUubm93KCk7bGV0IEg9SS5jdXJyZW50O2lmKEgpe2lmKGkuY3VycmVudClVUkwucmV2b2tlT2JqZWN0VVJMKGkuY3VycmVudCk7aS5jdXJyZW50PVYsSC5zcmM9Vn1pZighVC5jdXJyZW50KUUoITApLFEwKG51bGwpfSl9LFtBLHpdKTtsZXQgbT1qKChWKT0+e2lmKEEpe0s/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxVPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1VbMF09VTYsVS5zZXQoTCwxKSxILnNlbmQoVSl9LFtBLEtdKSxaMD1qKChWKT0+e2lmKEEpe0c/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxVPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1VbMF09QjYsVS5zZXQoTCwxKSxILnNlbmQoVSl9LFtBLEddKSx5PWooKFYpPT57aWYoQSl7Vz8uKFYpO3JldHVybn1sZXQgSD1NLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFU9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7VVswXT1fNixVLnNldChMLDEpLEguc2VuZChVKX0sW0EsV10pO3goKCk9PntpZihBKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChEKT0+RC5qc29uKCkpLnRoZW4oKEQpPT57aWYoRC53aWR0aD4wJiZELmhlaWdodD4wKUswKEQpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsTS5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxRMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1EwKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixVPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKTtyZXR1cm4oYXN5bmMoKT0+e3RyeXtsZXQgYj0oYXdhaXQgZmV0Y2goUix7c2lnbmFsOkwuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFiKXJldHVybjtsZXQgbz1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIi0tZnJhbWUiKTt3aGlsZSghMCl7bGV0e2RvbmU6WDAsdmFsdWU6cTB9PWF3YWl0IGIucmVhZCgpO2lmKFgwKWJyZWFrO2lmKHEwKWZvcihsZXQgUTQ9MDtRNDw9cTAubGVuZ3RoLW8ubGVuZ3RoO1E0Kyspe2xldCB3ND0hMDtmb3IobGV0IHgwPTA7eDA8by5sZW5ndGg7eDArKylpZihxMFtRNCt4MF0hPT1vW3gwXSl7dzQ9ITE7YnJlYWt9aWYodzQpRzAuY3VycmVudCsrfX19Y2F0Y2h7fX0pKCksKCk9PntMLmFib3J0KCksY2xlYXJJbnRlcnZhbChVKSxILmNsb3NlKCksTS5jdXJyZW50PW51bGx9fSxbWCxSLEFdKTtsZXQgZT13KDApO3goKCk9PntpZighQSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9ZS5jdXJyZW50O2lmKCFEfHwhVC5jdXJyZW50KXJldHVybjtpZihEYXRlLm5vdygpLUQ+VilFKCExKX0sTD1zZXRJbnRlcnZhbCgoKT0+e3YwKEcwLmN1cnJlbnQpLEcwLmN1cnJlbnQ9MCxIKCl9LDEwMDApLFU9KCk9PntpZighZG9jdW1lbnQuaGlkZGVuKUgoKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLFUpLCgpPT57Y2xlYXJJbnRlcnZhbChMKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixVKX19LFtBXSk7bGV0IGE9aigoKT0+e3JldHVybiBBP0kuY3VycmVudDprLmN1cnJlbnR9LFtBXSksVjA9aigoVixIKT0+e2xldCBMPWEoKTtpZighTClyZXR1cm47bGV0IFU9TC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxEPShILmNsaWVudFgtVS5sZWZ0KS9VLndpZHRoLGI9KEguY2xpZW50WS1VLnRvcCkvVS5oZWlnaHQ7bSh7dHlwZTpWLHg6RCx5OmJ9KX0sW21dKSxKMD0zLGw9dyghMSksdT13KCExKSxVMD13KCExKSxNMD13KHtkeDowLGR5OjB9KSxDMD13KCExKSxbWTQsazRdPVMoITEpLEk0PXcoe3g6MC41LHk6MC41fSksW0gwLFkwXT1TKG51bGwpO3goKCk9PntsZXQgVj0oTCk9PntpZihMLmtleT09PSJBbHQiKWs0KCEwKX0sSD0oTCk9PntpZihMLmtleT09PSJBbHQiKXtpZihrNCghMSksIXUuY3VycmVudClZMChudWxsKX19O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixIKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixWKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLEgpfX0sW10pLHgoKCk9PntpZihZNCYmIXUuY3VycmVudCl7bGV0IFY9STQuY3VycmVudDtZMCh7eDE6Vi54LHkxOlYueSx4MjoxLVYueCx5MjoxLVYueX0pfWVsc2UgaWYoIVk0JiYhdS5jdXJyZW50KVkwKG51bGwpfSxbWTRdKTtsZXQgeTA9dyhudWxsKSxxND13KCExKSxFMD13KDApLE00PWooKFYsSCk9PntxNC5jdXJyZW50PSEwO2xldCBMPXkwLmN1cnJlbnQ7aWYoTCljYW5jZWxBbmltYXRpb25GcmFtZShFMC5jdXJyZW50KSxFMC5jdXJyZW50PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e0wuc3R5bGUubGVmdD1gJHtWKjEwMH0lYCxMLnN0eWxlLnRvcD1gJHtIKjEwMH0lYCxMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0pfSxbXSksQzQ9aigoVixIKT0+e2lmKCFxNC5jdXJyZW50KXJldHVybjtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWB9KX0sW10pLHAwPWooKCk9PntxNC5jdXJyZW50PSExO2xldCBWPXkwLmN1cnJlbnQ7aWYoViljYW5jZWxBbmltYXRpb25GcmFtZShFMC5jdXJyZW50KSxWLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxbXSksRTQ9dygwKSx3MD13KG51bGwpLGc1PWooKCk9PntsZXQgVj1EYXRlLm5vdygpLEg9Vi1FNC5jdXJyZW50O2lmKEU0LmN1cnJlbnQ9VixIPDMwMCl7aWYodzAuY3VycmVudCljbGVhclRpbWVvdXQodzAuY3VycmVudCksdzAuY3VycmVudD1udWxsO2lmKFEpUSgpO2Vsc2UgWjAoImFwcF9zd2l0Y2hlciIpfWVsc2UgdzAuY3VycmVudD1zZXRUaW1lb3V0KCgpPT57aWYoUSlRKCk7ZWxzZSBaMCgiaG9tZSIpO3cwLmN1cnJlbnQ9bnVsbH0sMzAwKX0sW1owLFFdKSxnMD0oKCk9PntpZighZ3x8IXIpcmV0dXJuIG51bGw7aWYoci53aWR0aD09PTB8fHIuaGVpZ2h0PT09MClyZXR1cm4gbnVsbDtsZXQgVj1NYXRoLm1pbihyLndpZHRoL2cud2lkdGgsci5oZWlnaHQvZy5oZWlnaHQpO3JldHVybnt3aWR0aDpnLndpZHRoKlYsaGVpZ2h0OmcuaGVpZ2h0KlZ9fSkoKTtyZXR1cm4gTigiZGl2Iix7c3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIsZmxleDoxLC4uLl8/e306e2JvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMikifSxvdmVyZmxvdzoiaGlkZGVuIixtaW5XaWR0aDowLG1pbkhlaWdodDowLC4uLkp9LGNsYXNzTmFtZTpxLGNoaWxkcmVuOltOKCJkaXYiLHtyZWY6cyxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsbWluSGVpZ2h0OjAsbWluV2lkdGg6MCxkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIifSxjaGlsZHJlbjpOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIix3aWR0aDpnMD9gJHtnMC53aWR0aH1weGA6IjEwMCUiLGhlaWdodDpnMD9gJHtnMC5oZWlnaHR9cHhgOiIxMDAlIn0sY2hpbGRyZW46W04oImltZyIse3JlZjprLHNyYzpBP3ZvaWQgMDpSLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOkE/e2Rpc3BsYXk6Im5vbmUifTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLGN1cnNvcjpGNCxkaXNwbGF5OiJibG9jayIsdXNlclNlbGVjdDoibm9uZSIsV2Via2l0VXNlclNlbGVjdDoibm9uZSIsdG91Y2hBY3Rpb246Im5vbmUiLC4uLll9fSksQSYmTigiaW1nIix7cmVmOkksZHJhZ2dhYmxlOiExLG9uTG9hZDooVik9PntsZXQgSD1WLmN1cnJlbnRUYXJnZXQ7aWYoSC5uYXR1cmFsV2lkdGg+MCYmSC5uYXR1cmFsSGVpZ2h0PjApSzAoKEwpPT5MJiZMLndpZHRoPT09SC5uYXR1cmFsV2lkdGgmJkwuaGVpZ2h0PT09SC5uYXR1cmFsSGVpZ2h0P0w6e3dpZHRoOkgubmF0dXJhbFdpZHRoLGhlaWdodDpILm5hdHVyYWxIZWlnaHR9KX0sc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RjQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLE4oImRpdiIse3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsY3Vyc29yOkY0LHRvdWNoQWN0aW9uOiJub25lIn0sb25Nb3VzZURvd246KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxVPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoVi5hbHRLZXkpe3UuY3VycmVudD0hMCxVMC5jdXJyZW50PVYuc2hpZnRLZXk7bGV0IGI9e3gxOlUseTE6RCx4MjoxLVUseTI6MS1EfTtNMC5jdXJyZW50PXtkeDoxLVUtVSxkeToxLUQtRH0sWTAoYikseSh7dHlwZToiYmVnaW4iLC4uLmJ9KTtyZXR1cm59aWYoTTQoVSxEKSxEPjAuODgpbC5jdXJyZW50PSEwLG0oe3R5cGU6ImJlZ2luIix4OlUseTpELGVkZ2U6SjB9KTtlbHNlIGwuY3VycmVudD0hMSxWMCgiYmVnaW4iLFYpfSxvbk1vdXNlTW92ZTooVik9PntsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksVT0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEk0LmN1cnJlbnQ9e3g6VSx5OkR9LFYuYnV0dG9ucz09PTApe2lmKFYuYWx0S2V5KVkwKHt4MTpVLHkxOkQseDI6MS1VLHkyOjEtRH0pO3JldHVybn1pZih1LmN1cnJlbnQpe2xldCBiO2lmKFUwLmN1cnJlbnQpe2xldCBvPU0wLmN1cnJlbnQ7Yj17eDE6VSx5MTpELHgyOlUrby5keCx5MjpEK28uZHl9fWVsc2UgYj17eDE6VSx5MTpELHgyOjEtVSx5MjoxLUR9O1kwKGIpLHkoe3R5cGU6Im1vdmUiLC4uLmJ9KTtyZXR1cm59aWYoQzQoVSxEKSxsLmN1cnJlbnQpbSh7dHlwZToibW92ZSIseDpVLHk6RCxlZGdlOkowfSk7ZWxzZSBWMCgibW92ZSIsVil9LG9uTW91c2VVcDooVik9PntpZih1LmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFU9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihVMC5jdXJyZW50KXtsZXQgYj1NMC5jdXJyZW50O3koe3R5cGU6ImVuZCIseDE6VSx5MTpELHgyOlUrYi5keCx5MjpEK2IuZHl9KX1lbHNlIHkoe3R5cGU6ImVuZCIseDE6VSx5MTpELHgyOjEtVSx5MjoxLUR9KX1pZih1LmN1cnJlbnQ9ITEsIVYuYWx0S2V5KVkwKG51bGwpO3JldHVybn1pZihwMCgpLGwuY3VycmVudCl7bGV0IEg9YSgpO2lmKEgpe2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksVT0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O20oe3R5cGU6ImVuZCIseDpVLHk6RCxlZGdlOkowfSl9bC5jdXJyZW50PSExO3JldHVybn1WMCgiZW5kIixWKX0sb25Nb3VzZUxlYXZlOihWKT0+e2lmKHUuY3VycmVudCl7aWYoSDApeSh7dHlwZToiZW5kIiwuLi5IMH0pO3UuY3VycmVudD0hMSxZMChudWxsKTtyZXR1cm59aWYocDAoKSxsLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFU9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6VSx5OkQsZWRnZTpKMH0pfWwuY3VycmVudD0hMTtyZXR1cm59aWYoVi5idXR0b25zPjApVjAoImVuZCIsVik7WTAobnVsbCl9LG9uVG91Y2hTdGFydDooVik9PntWLnByZXZlbnREZWZhdWx0KCk7bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKFYudG91Y2hlcy5sZW5ndGg+PTIpe3AwKCk7bGV0IG89Vi50b3VjaGVzWzBdLFgwPVYudG91Y2hlc1sxXSxxMD17eDE6KG8uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KG8uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KFgwLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihYMC5jbGllbnRZLUwudG9wKS9MLmhlaWdodH07aWYoIUMwLmN1cnJlbnQmJiFsLmN1cnJlbnQpbSh7dHlwZToiZW5kIix4OnEwLngxLHk6cTAueTF9KTtDMC5jdXJyZW50PSEwLHUuY3VycmVudD0hMCxsLmN1cnJlbnQ9ITEsWTAocTApLHkoe3R5cGU6ImJlZ2luIiwuLi5xMH0pO3JldHVybn1sZXQgVT1WLnRvdWNoZXNbMF07aWYoIVUpcmV0dXJuO2xldCBEPShVLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLGI9KFUuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoTTQoRCxiKSxiPjAuODgpbC5jdXJyZW50PSEwLG0oe3R5cGU6ImJlZ2luIix4OkQseTpiLGVkZ2U6SjB9KTtlbHNlIGwuY3VycmVudD0hMSxtKHt0eXBlOiJiZWdpbiIseDpELHk6Yn0pfSxvblRvdWNoTW92ZTooVik9PntWLnByZXZlbnREZWZhdWx0KCk7bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKEMwLmN1cnJlbnQmJlYudG91Y2hlcy5sZW5ndGg+PTIpe2xldCBvPVYudG91Y2hlc1swXSxYMD1WLnRvdWNoZXNbMV0scTA9e3gxOihvLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihvLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihYMC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCx5MjooWDAuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O1kwKHEwKSx5KHt0eXBlOiJtb3ZlIiwuLi5xMH0pO3JldHVybn1sZXQgVT1WLnRvdWNoZXNbMF07aWYoIVUpcmV0dXJuO2xldCBEPShVLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLGI9KFUuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQzQoRCxiKSxsLmN1cnJlbnQpbSh7dHlwZToibW92ZSIseDpELHk6YixlZGdlOkowfSk7ZWxzZSBtKHt0eXBlOiJtb3ZlIix4OkQseTpifSl9LG9uVG91Y2hFbmQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50KXtpZihWLnRvdWNoZXMubGVuZ3RoPDIpe2xldCBvPVYuY2hhbmdlZFRvdWNoZXNbMF0sWDA9SDA7aWYobyYmWDApeSh7dHlwZToiZW5kIix4MTooby5jbGllbnRYLUwubGVmdCkvTC53aWR0aCx5MTooby5jbGllbnRZLUwudG9wKS9MLmhlaWdodCx4MjpYMC54Mix5MjpYMC55Mn0pO2Vsc2UgaWYoWDApeSh7dHlwZToiZW5kIiwuLi5YMH0pO0MwLmN1cnJlbnQ9ITEsdS5jdXJyZW50PSExLFkwKG51bGwpfXJldHVybn1sZXQgVT1WLmNoYW5nZWRUb3VjaGVzWzBdO2lmKCFVKXJldHVybjtsZXQgRD0oVS5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShVLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKHAwKCksbC5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpELHk6YixlZGdlOkowfSksbC5jdXJyZW50PSExO2Vsc2UgbSh7dHlwZToiZW5kIix4OkQseTpifSl9fSksTigiZGl2Iix7cmVmOnkwLCJkYXRhLXRlc3RpZCI6InRvdWNoLWluZGljYXRvciIsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsZGlzcGxheToibm9uZSIsd2lkdGg6MjQsaGVpZ2h0OjI0LGJvcmRlclJhZGl1czoiNTAlIixiYWNrZ3JvdW5kOiJyZ2JhKDU5LDEzMCwyNDYsMC41KSIsYm94U2hhZG93OiIwIDAgOHB4IHJnYmEoNTksMTMwLDI0NiwwLjMpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fSksSDAmJk4oZCx7Y2hpbGRyZW46W04oImRpdiIseyJkYXRhLXRlc3RpZCI6ImZpbmdlci1kb3QiLHN0eWxlOlI1KEgwLngxLEgwLnkxKX0pLE4oImRpdiIseyJkYXRhLXRlc3RpZCI6ImZpbmdlci1kb3QiLHN0eWxlOlI1KEgwLngyLEgwLnkyKX0pXX0pLCFoJiYhbiYmTigiZGl2Iix7c3R5bGU6YjUsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiIzg4OCIsZm9udFNpemU6MTR9LGNoaWxkcmVuOiJDb25uZWN0aW5nLi4uIn0pfSksbiYmTigiZGl2Iix7c3R5bGU6YjUsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2Y0NCIsZm9udFNpemU6MTQscGFkZGluZzoyMCx0ZXh0QWxpZ246ImNlbnRlciJ9LGNoaWxkcmVuOm59KX0pLEo0JiZOKCJkaXYiLHtzdHlsZTpGNixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjZmJiZjI0Iixmb250U2l6ZToxMyxmb250RmFtaWx5OiJtb25vc3BhY2UifSxjaGlsZHJlbjoiU2xvdyBjb25uZWN0aW9uIn0pfSldfSl9KSwhXyYmTigiZGl2Iix7c3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6InNwYWNlLWJldHdlZW4iLHBhZGRpbmc6IjRweCA4cHgiLGJvcmRlclRvcDoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMikifSxjaGlsZHJlbjpbTigiYnV0dG9uIix7b25DbGljazpnNSxzdHlsZTp7YmFja2dyb3VuZDoibm9uZSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjIpIixjb2xvcjoiI2FhYSIsZm9udFNpemU6MTEsZm9udEZhbWlseToibW9ub3NwYWNlIixwYWRkaW5nOiIycHggMTBweCIsY3Vyc29yOiJwb2ludGVyIixib3JkZXJSYWRpdXM6NH0sY2hpbGRyZW46IkhvbWUifSksTigic3BhbiIse3N0eWxlOntjb2xvcjpqMD4wPyIjNGY0IjoiIzg4OCIsZm9udFNpemU6MTIsZm9udEZhbWlseToibW9ub3NwYWNlIixkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo2fSxjaGlsZHJlbjpbQyYmTigic3BhbiIseyJkYXRhLXRlc3RpZCI6InF1YWxpdHktZG90IixzdHlsZTp7d2lkdGg6OCxoZWlnaHQ6OCxib3JkZXJSYWRpdXM6IjUwJSIsZGlzcGxheToiaW5saW5lLWJsb2NrIixiYWNrZ3JvdW5kOkM9PT0iZ29vZCI/IiM0YWRlODAiOkM9PT0iZGVncmFkZWQiPyIjZmFjYzE1IjoiI2VmNDQ0NCJ9fSksajAsIiBmcHMiXX0pXX0pXX0pfXZhciBGNj17cG9zaXRpb246ImFic29sdXRlIix0b3A6OCxsZWZ0OiI1MCUiLHRyYW5zZm9ybToidHJhbnNsYXRlWCgtNTAlKSIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjcpIixib3JkZXJSYWRpdXM6NixwYWRkaW5nOiI0cHggMTJweCIscG9pbnRlckV2ZW50czoibm9uZSJ9LGI1PXtwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDAuOCkifSxTNT0yMDtmdW5jdGlvbiBSNShYLFope3JldHVybntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6YCR7WCoxMDB9JWAsdG9wOmAke1oqMTAwfSVgLHdpZHRoOlM1LGhlaWdodDpTNSxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjQpIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuNykiLHRyYW5zZm9ybToidHJhbnNsYXRlKC01MCUsIC01MCUpIixwb2ludGVyRXZlbnRzOiJub25lIn19ZnVuY3Rpb24gazAoWCl7aWYoIVgpcmV0dXJuImlwaG9uZSI7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouaW5jbHVkZXMoImlwYWQiKSlyZXR1cm4iaXBhZCI7aWYoWi5pbmNsdWRlcygid2F0Y2giKSlyZXR1cm4id2F0Y2giO2lmKFouaW5jbHVkZXMoInZpc2lvbiIpKXJldHVybiJ2aXNpb24iO3JldHVybiJpcGhvbmUifXZhciAkMD17aXBob25lOnt3aWR0aDo0MjcsaGVpZ2h0Ojg4MSxiZXplbFg6MTgsYmV6ZWxZOjE4LGlubmVyUmFkaXVzOjU1fSxpcGFkOnt3aWR0aDo0MzAsaGVpZ2h0OjYwNSxiZXplbFg6MTYsYmV6ZWxZOjE2LGlubmVyUmFkaXVzOjEyfSx3YXRjaDp7d2lkdGg6Mjc0LGhlaWdodDozMjIsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czo3OX0sdmlzaW9uOnt3aWR0aDo2NDAsaGVpZ2h0OjQwMCxiZXplbFg6MTIsYmV6ZWxZOjEyLGlubmVyUmFkaXVzOjMyfX0sdzc9JDAuaXBob25lLndpZHRoLFQ3PSQwLmlwaG9uZS5oZWlnaHQsYjc9JDAuaXBob25lLmJlemVsWCxTNz0kMC5pcGhvbmUuYmV6ZWxZLFI3PSQwLmlwaG9uZS5pbm5lclJhZGl1cztmdW5jdGlvbiBlMChYPSJpcGhvbmUiKXtsZXQgWj0kMFtYXSxKPVoud2lkdGgtMipaLmJlemVsWCxZPVouaGVpZ2h0LTIqWi5iZXplbFk7cmV0dXJuYCR7Wi5pbm5lclJhZGl1cy9KKjEwMH0lIC8gJHtaLmlubmVyUmFkaXVzL1kqMTAwfSVgfXZhciBEND1fMChudWxsKTtmdW5jdGlvbiBYNChYKXtsZXQgWj1SMChENCk7aWYoIVopdGhyb3cgRXJyb3IoYDxTaW11bGF0b3JUb29sYmFyLiR7WH0+IG11c3QgYmUgcmVuZGVyZWQgaW5zaWRlIDxTaW11bGF0b3JUb29sYmFyPmApO3JldHVybiBafXZhciBDNj17ZGlzcGxheToiZmxleCIsZmxleFdyYXA6IndyYXAiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6InNwYWNlLWJldHdlZW4iLGdhcDoiNHB4IDEycHgiLHBhZGRpbmc6IjhweCAxMnB4Iixib3JkZXJSYWRpdXM6MjQsYmFja2dyb3VuZDoiIzFjMWMxZSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEpIixib3hTaGFkb3c6IjAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMikiLG1pbldpZHRoOjI0MCx3aWR0aDoiMTAwJSJ9O2Z1bmN0aW9uIEU2KHtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksc3RyZWFtaW5nOnE9ITEsZGlzYWJsZWQ6UT0hMSxjaGlsZHJlbjpLLHN0eWxlOlcsLi4uR30pe2xldCB6PWswKEopLCQ9e2V4ZWM6WCxkZXZpY2VVZGlkOlosZGV2aWNlTmFtZTpKLGRldmljZVJ1bnRpbWU6WSxkZXZpY2VUeXBlOnosc3RyZWFtaW5nOnEsZGlzYWJsZWQ6UXx8IVp8fCFxfTtyZXR1cm4gTihENC5Qcm92aWRlcix7dmFsdWU6JCxjaGlsZHJlbjpOKCJkaXYiLHsiZGF0YS1zaW11bGF0b3ItdG9vbGJhciI6ITAsc3R5bGU6ey4uLkM2LC4uLld9LC4uLkcsY2hpbGRyZW46S30pfSl9dmFyIHc2PXtkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImZsZXgtc3RhcnQiLHRleHRBbGlnbjoibGVmdCIsYmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGJvcmRlcjoibm9uZSIsY29sb3I6IiNmZmYiLHBhZGRpbmc6IjJweCA0cHgiLG1hcmdpbjoiLTJweCAtNHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLG1pbldpZHRoOjAsbWF4V2lkdGg6IjEwMCUiLGxpbmVIZWlnaHQ6MS4yLGZvbnRGYW1pbHk6ImluaGVyaXQifSxUNj1EMChmdW5jdGlvbih7bmFtZTpaLHN1YnRpdGxlOkosaGlkZUNoZXZyb246WSxzdHlsZTpxLG9uTW91c2VFbnRlcjpRLG9uTW91c2VMZWF2ZTpLLC4uLld9LEcpe2xldCB6PVg0KCJUaXRsZSIpLFtQLCRdPVMoITEpLF89Wj8/ei5kZXZpY2VOYW1lPz8iTm8gc2ltdWxhdG9yIixPPUo/Pyh6LmRldmljZVJ1bnRpbWU/ei5kZXZpY2VSdW50aW1lLnJlcGxhY2UoL1wuLywiICIpOiLigJQiKTtyZXR1cm4gTigiYnV0dG9uIix7cmVmOkcsdHlwZToiYnV0dG9uIiwiZGF0YS1zaW11bGF0b3ItdG9vbGJhci10aXRsZSI6ITAsb25Nb3VzZUVudGVyOihDKT0+eyQoITApLFE/LihDKX0sb25Nb3VzZUxlYXZlOihDKT0+eyQoITEpLEs/LihDKX0sc3R5bGU6ey4uLnc2LGJhY2tncm91bmQ6UD8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLC4uLnF9LC4uLlcsY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp7ZGlzcGxheToiaW5saW5lLWZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZm9udFNpemU6MTIsZm9udFdlaWdodDo2MDAsY29sb3I6IiNmZmYiLG1heFdpZHRoOiIxMDAlIixvdmVyZmxvdzoiaGlkZGVuIix0ZXh0T3ZlcmZsb3c6ImVsbGlwc2lzIix3aGl0ZVNwYWNlOiJub3dyYXAifSxjaGlsZHJlbjpbXywhWSYmTigic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMi41IixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixzdHlsZTp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsZmxleFNocmluazowfSxjaGlsZHJlbjpOKCJwb2x5bGluZSIse3BvaW50czoiNiA5IDEyIDE1IDE4IDkifSl9KV19KSxOKCJzcGFuIix7c3R5bGU6e2ZvbnRTaXplOjEwLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNSkiLG1heFdpZHRoOiIxMDAlIixvdmVyZmxvdzoiaGlkZGVuIix0ZXh0T3ZlcmZsb3c6ImVsbGlwc2lzIix3aGl0ZVNwYWNlOiJub3dyYXAifSxjaGlsZHJlbjpPfSldfSl9KSxiNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6NCxmbGV4U2hyaW5rOjB9O2Z1bmN0aW9uIFM2KHtzdHlsZTpYLC4uLlp9KXtyZXR1cm4gTigiZGl2Iix7c3R5bGU6ey4uLmI2LC4uLlh9LC4uLlp9KX12YXIgUjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLHBhZGRpbmc6Nixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLGRpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuOCkiLHRyYW5zaXRpb246ImJhY2tncm91bmQtY29sb3IgMC4xNXMsIGNvbG9yIDAuMTVzIn0sWjQ9RDAoZnVuY3Rpb24oe2ZvcmNlRGlzYWJsZWQ6WixzdHlsZTpKLGRpc2FibGVkOlksb25Nb3VzZUVudGVyOnEsb25Nb3VzZUxlYXZlOlEsY2hpbGRyZW46SywuLi5XfSxHKXtsZXQgej1SMChENCksUD1ZfHxafHx6Py5kaXNhYmxlZCxbJCxfXT1TKCExKTtyZXR1cm4gTigiYnV0dG9uIix7cmVmOkcsdHlwZToiYnV0dG9uIixkaXNhYmxlZDpQLG9uTW91c2VFbnRlcjooTyk9PntfKCEwKSxxPy4oTyl9LG9uTW91c2VMZWF2ZTooTyk9PntfKCExKSxRPy4oTyl9LHN0eWxlOnsuLi5SNixjb2xvcjpQPyJyZ2JhKDI1NSwyNTUsMjU1LDAuMjUpIjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIixiYWNrZ3JvdW5kOiQmJiFQPyJyZ2JhKDI1NSwyNTUsMjU1LDAuMSkiOiJ0cmFuc3BhcmVudCIsY3Vyc29yOlA/Im5vdC1hbGxvd2VkIjoicG9pbnRlciIsLi4uSn0sLi4uVyxjaGlsZHJlbjpLfSl9KTtmdW5jdGlvbiBqNigpe3JldHVyblsndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIHNldCBmcm9udG1vc3QgdG8gdHJ1ZScsJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBwZXJmb3JtIGFjdGlvbiAiQVhSYWlzZSIgb2YgKGZpcnN0IHdpbmRvdyB3aG9zZSBuYW1lIGNvbnRhaW5zICJ3YXRjaE9TIiknLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gY2xpY2sgbWVudSBpdGVtICJIb21lIiBvZiBtZW51ICJEZXZpY2UiIG9mIG1lbnUgYmFyIGl0ZW0gIkRldmljZSIgb2YgbWVudSBiYXIgMSddLm1hcCgoWik9PmAtZSAnJHtafSdgKS5yZWR1Y2UoKFosSik9PmAke1p9ICR7Sn1gLCJvc2FzY3JpcHQiKX12YXIgdjY9Tigic3ZnIix7d2lkdGg6IjE4IixoZWlnaHQ6IjE4Iix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0zIDEwLjUgMTIgM2w5IDcuNVYyMGExIDEgMCAwIDEtMSAxaC01di03aC02djdINGExIDEgMCAwIDEtMS0xeiJ9KX0pLHk2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTE0LjUgNGgtNUw3IDdINGEyIDIgMCAwIDAtMiAydjlhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0yVjlhMiAyIDAgMCAwLTItMmgtM3oifSksTigiY2lyY2xlIix7Y3g6IjEyIixjeToiMTMiLHI6IjQifSldfSkscDY9Tigic3ZnIix7d2lkdGg6IjE4IixoZWlnaHQ6IjE4Iix2aWV3Qm94OiIwIDAgMTIgMTMiLGZpbGw6ImN1cnJlbnRDb2xvciIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpOKCJwYXRoIix7ZDoiTTEwLjIzMDUgMTIuODA3N0g0LjQyMzgzQzMuOTIzODMgMTIuODA3NyAzLjU0Njg4IDEyLjY4NDYgMy4yOTI5NyAxMi40Mzg1QzMuMDQyOTcgMTIuMTk2MyAyLjkxNzk3IDExLjgxOTQgMi45MTc5NyAxMS4zMDc3VjUuNTEyNzRDMi45MTc5NyA0Ljk5NzExIDMuMDQyOTcgNC42MTgyMSAzLjI5Mjk3IDQuMzc2MDJDMy41NDY4OCA0LjEyOTkzIDMuOTIzODMgNC4wMDY4OCA0LjQyMzgzIDQuMDA2ODhIMTAuMjMwNUMxMC43MzQ0IDQuMDA2ODggMTEuMTExMyA0LjEyOTkzIDExLjM2MTMgNC4zNzYwMkMxMS42MTEzIDQuNjE4MjEgMTEuNzM2MyA0Ljk5NzExIDExLjczNjMgNS41MTI3NFYxMS4zMDc3QzExLjczNjMgMTEuODE5NCAxMS42MTEzIDEyLjE5NjMgMTEuMzYxMyAxMi40Mzg1QzExLjExMTMgMTIuNjg0NiAxMC43MzQ0IDEyLjgwNzcgMTAuMjMwNSAxMi44MDc3Wk0xMC4yMTI5IDExLjg2NDNDMTAuNDE2IDExLjg2NDMgMTAuNTYyNSAxMS44MTk0IDEwLjY1MjMgMTEuNzI5NUMxMC43NDYxIDExLjY0MzYgMTAuNzkzIDExLjQ5NzEgMTAuNzkzIDExLjI5MDFWNS41MjQ0NkMxMC43OTMgNS4zMTc0MyAxMC43NDYxIDUuMTcwOTQgMTAuNjUyMyA1LjA4NTAxQzEwLjU2MjUgNC45OTUxNiAxMC40MTYgNC45NTAyNCAxMC4yMTI5IDQuOTUwMjRINC40NDE0MUM0LjI0MjE5IDQuOTUwMjQgNC4wOTU3IDQuOTk1MTYgNC4wMDE5NSA1LjA4NTAxQzMuOTA4MiA1LjE3MDk0IDMuODYxMzMgNS4zMTc0MyAzLjg2MTMzIDUuNTI0NDZWMTEuMjkwMUMzLjg2MTMzIDExLjQ5NzEgMy45MDgyIDExLjY0MzYgNC4wMDE5NSAxMS43Mjk1QzQuMDk1NyAxMS44MTk0IDQuMjQyMTkgMTEuODY0MyA0LjQ0MTQxIDExLjg2NDNIMTAuMjEyOVpNMi45MTc5NyAyLjU4MzA1VjAuNDE1MDgzQzIuOTE3OTcgMC4yMDAyNCAyLjk4NjMzIDAuMDY5MzgwMyAzLjEyMzA1IDAuMDIyNTA1M0MzLjI1OTc3IC0wLjAyODI3NTkgMy40MTAxNiAwLjAwNjg4MDMzIDMuNTc0MjIgMC4xMjc5NzRMNS4wNTA3OCAxLjIxMTk2QzUuMTc1NzggMS4zMDU3MSA1LjIzODI4IDEuNDAxNDEgNS4yMzgyOCAxLjQ5OTA3QzUuMjM4MjggMS41OTY3MiA1LjE3NTc4IDEuNjkyNDMgNS4wNTA3OCAxLjc4NjE4TDMuNTc0MjIgMi44NjQzQzMuNDEwMTYgMi45ODU0IDMuMjU5NzcgMy4wMjI1MSAzLjEyMzA1IDIuOTc1NjNDMi45ODYzMyAyLjkyNDg1IDIuOTE3OTcgMi43OTM5OSAyLjkxNzk3IDIuNTgzMDVaTTMuNTMzMiAxLjE1MzM2QzMuNjI2OTUgMS4xNTMzNiAzLjcwNzAzIDEuMTg2NTcgMy43NzM0NCAxLjI1Mjk3QzMuODQzNzUgMS4zMTkzOCAzLjg3ODkxIDEuMzk3NTEgMy44Nzg5MSAxLjQ4NzM1QzMuODc4OTEgMS41ODExIDMuODQzNzUgMS42NjMxMyAzLjc3MzQ0IDEuNzMzNDRDMy43MDcwMyAxLjc5OTg1IDMuNjI2OTUgMS44MzMwNSAzLjUzMzIgMS44MzMwNUgyLjgwNjY0QzIuMzgwODYgMS44MzMwNSAyLjAxMTcyIDEuOTI0ODUgMS42OTkyMiAyLjEwODQ0QzEuMzkwNjIgMi4yODgxMyAxLjE1MjM0IDIuNTM4MTMgMC45ODQzNzUgMi44NTg0NEMwLjgxNjQwNiAzLjE3ODc2IDAuNzMyNDIyIDMuNTQ1OTQgMC43MzI0MjIgMy45NjAwMVY0LjgzODkxQzAuNzMyNDIyIDQuOTM2NTcgMC42OTcyNjYgNS4wMjI1MSAwLjYyNjk1MyA1LjA5NjcyQzAuNTUyNzM0IDUuMTY3MDQgMC40NjQ4NDQgNS4yMDIxOSAwLjM2MzI4MSA1LjIwMjE5QzAuMjY1NjI1IDUuMjAyMTkgMC4xODE2NDEgNS4xNjcwNCAwLjExMTMyOCA1LjA5NjcyQzAuMDM3MTA5NCA1LjAyMjUxIDAgNC45MzY1NyAwIDQuODM4OTFWMy45NjAwMUMwIDMuNDAxNDEgMC4xMTcxODggMi45MTExOCAwLjM1MTU2MiAyLjQ4OTNDMC41ODIwMzEgMi4wNjc0MyAwLjkwODIwMyAxLjczOTMgMS4zMzAwOCAxLjUwNDkzQzEuNzQ4MDUgMS4yNzA1NSAyLjIzODI4IDEuMTUzMzYgMi44MDA3OCAxLjE1MzM2SDMuNTMzMloifSl9KSxnNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJIb21lQnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiSG9tZSIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVR5cGU9PT0id2F0Y2giKXEuZXhlYyhqNigpKTtlbHNlIHEuZXhlYygic2VydmUtc2ltIGJ1dHRvbiBob21lIil9LC4uLkosY2hpbGRyZW46djZ9KX0pLHg2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlNjcmVlbnNob3RCdXR0b24iKTtyZXR1cm4gTihaNCx7cmVmOlksImFyaWEtbGFiZWwiOiJTY3JlZW5zaG90IixvbkNsaWNrOihRKT0+e2lmKFo/LihRKSxRLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2lmKHEuZGV2aWNlVWRpZClxLmV4ZWMoYHhjcnVuIHNpbWN0bCBpbyAke3EuZGV2aWNlVWRpZH0gc2NyZWVuc2hvdCB+L0Rlc2t0b3AvaGF0Y2gtc2NyZWVuc2hvdC0kKGRhdGUgKyVzKS5wbmdgKX0sLi4uSixjaGlsZHJlbjp5Nn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiUm90YXRlQnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiUm90YXRlIGRldmljZSIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGBvc2FzY3JpcHQgLWUgJ3RlbGwgYXBwbGljYXRpb24gIlNpbXVsYXRvciIgdG8gYWN0aXZhdGUnIC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byBrZXkgY29kZSAxMjQgdXNpbmcge2NvbW1hbmQgZG93bn0nYCl9LC4uLkosY2hpbGRyZW46cDZ9KX0pLHQ9RTY7dC5UaXRsZT1UNjt0LkFjdGlvbnM9UzY7dC5CdXR0b249WjQ7dC5Ib21lQnV0dG9uPWc2O3QuU2NyZWVuc2hvdEJ1dHRvbj14Njt0LlJvdGF0ZUJ1dHRvbj1oNjtmdW5jdGlvbiBtNihYKXtsZXRbWixKXT1TKG51bGwpLFk9dyhuZXcgU2V0KSxbcSxRXT1TKG51bGwpLEs9aigoVyk9PntyZXR1cm4gWS5jdXJyZW50LmFkZChXKSwoKT0+e1kuY3VycmVudC5kZWxldGUoVyl9fSxbXSk7cmV0dXJuIHgoKCk9PntpZighWClyZXR1cm47bGV0IFc9bmV3IEFib3J0Q29udHJvbGxlcixHPVgucmVwbGFjZSgvXC9zdHJlYW1cLm1qcGVnJC8sIiIpO3JldHVybiBmZXRjaChgJHtHfS9jb25maWdgLHtzaWduYWw6Vy5zaWduYWx9KS50aGVuKCh6KT0+ei5qc29uKCkpLnRoZW4oKHopPT57aWYoei53aWR0aD4wJiZ6LmhlaWdodD4wKUooeil9KS5jYXRjaCgoKT0+e30pLChhc3luYygpPT57dHJ5e2xldCBQPShhd2FpdCBmZXRjaChYLHtzaWduYWw6Vy5zaWduYWx9KSkuYm9keT8uZ2V0UmVhZGVyKCk7aWYoIVApcmV0dXJuO2xldCAkPW5ldyBVaW50OEFycmF5KDApO3doaWxlKCEwKXtsZXR7ZG9uZTpfLHZhbHVlOk99PWF3YWl0IFAucmVhZCgpO2lmKF8pYnJlYWs7bGV0IEM9bmV3IFVpbnQ4QXJyYXkoJC5sZW5ndGgrTy5sZW5ndGgpO0Muc2V0KCQpLEMuc2V0KE8sJC5sZW5ndGgpLCQ9Qzt3aGlsZSghMCl7bGV0IEE9LTE7Zm9yKGxldCBFPTA7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTYpe0E9RTticmVha31pZihBPT09LTEpYnJlYWs7bGV0IGs9LTE7Zm9yKGxldCBFPUErMjtFPCQubGVuZ3RoLTE7RSsrKWlmKCRbRV09PT0yNTUmJiRbRSsxXT09PTIxNyl7az1FKzI7YnJlYWt9aWYoaz09PS0xKWJyZWFrO2xldCBJPSQuc2xpY2UoQSxrKTskPSQuc2xpY2Uoayk7bGV0IE09bmV3IEJsb2IoW0ldLHt0eXBlOiJpbWFnZS9qcGVnIn0pLGg9VVJMLmNyZWF0ZU9iamVjdFVSTChNKTtRKGgpO2ZvcihsZXQgRSBvZiBZLmN1cnJlbnQpRShoKX19fWNhdGNoe319KSgpLCgpPT5XLmFib3J0KCl9LFtYXSkse3N1YnNjcmliZUZyYW1lOkssZnJhbWU6cSxjb25maWc6Wn19dmFyIGQ2PXtLZXlBOjQsS2V5Qjo1LEtleUM6NixLZXlEOjcsS2V5RTo4LEtleUY6OSxLZXlHOjEwLEtleUg6MTEsS2V5SToxMixLZXlKOjEzLEtleUs6MTQsS2V5TDoxNSxLZXlNOjE2LEtleU46MTcsS2V5TzoxOCxLZXlQOjE5LEtleVE6MjAsS2V5UjoyMSxLZXlTOjIyLEtleVQ6MjMsS2V5VToyNCxLZXlWOjI1LEtleVc6MjYsS2V5WDoyNyxLZXlZOjI4LEtleVo6MjksRGlnaXQxOjMwLERpZ2l0MjozMSxEaWdpdDM6MzIsRGlnaXQ0OjMzLERpZ2l0NTozNCxEaWdpdDY6MzUsRGlnaXQ3OjM2LERpZ2l0ODozNyxEaWdpdDk6MzgsRGlnaXQwOjM5LEVudGVyOjQwLEVzY2FwZTo0MSxCYWNrc3BhY2U6NDIsVGFiOjQzLFNwYWNlOjQ0LE1pbnVzOjQ1LEVxdWFsOjQ2LEJyYWNrZXRMZWZ0OjQ3LEJyYWNrZXRSaWdodDo0OCxCYWNrc2xhc2g6NDksU2VtaWNvbG9uOjUxLFF1b3RlOjUyLEJhY2txdW90ZTo1MyxDb21tYTo1NCxQZXJpb2Q6NTUsU2xhc2g6NTYsQ2Fwc0xvY2s6NTcsRjE6NTgsRjI6NTksRjM6NjAsRjQ6NjEsRjU6NjIsRjY6NjMsRjc6NjQsRjg6NjUsRjk6NjYsRjEwOjY3LEYxMTo2OCxGMTI6NjksUHJpbnRTY3JlZW46NzAsU2Nyb2xsTG9jazo3MSxQYXVzZTo3MixJbnNlcnQ6NzMsSG9tZTo3NCxQYWdlVXA6NzUsRGVsZXRlOjc2LEVuZDo3NyxQYWdlRG93bjo3OCxBcnJvd1JpZ2h0Ojc5LEFycm93TGVmdDo4MCxBcnJvd0Rvd246ODEsQXJyb3dVcDo4MixOdW1Mb2NrOjgzLE51bXBhZERpdmlkZTo4NCxOdW1wYWRNdWx0aXBseTo4NSxOdW1wYWRTdWJ0cmFjdDo4NixOdW1wYWRBZGQ6ODcsTnVtcGFkRW50ZXI6ODgsTnVtcGFkMTo4OSxOdW1wYWQyOjkwLE51bXBhZDM6OTEsTnVtcGFkNDo5MixOdW1wYWQ1OjkzLE51bXBhZDY6OTQsTnVtcGFkNzo5NSxOdW1wYWQ4Ojk2LE51bXBhZDk6OTcsTnVtcGFkMDo5OCxOdW1wYWREZWNpbWFsOjk5LENvbnRyb2xMZWZ0OjIyNCxTaGlmdExlZnQ6MjI1LEFsdExlZnQ6MjI2LE1ldGFMZWZ0OjIyNyxDb250cm9sUmlnaHQ6MjI4LFNoaWZ0UmlnaHQ6MjI5LEFsdFJpZ2h0OjIzMCxNZXRhUmlnaHQ6MjMxfTtmdW5jdGlvbiBmNihYKXtyZXR1cm4gZDZbWF0/P251bGx9YXN5bmMgZnVuY3Rpb24gQTAoWCl7cmV0dXJuKGF3YWl0IGZldGNoKCIvZXhlYyIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHtjb21tYW5kOlh9KX0pKS5qc29uKCl9ZnVuY3Rpb24gYTYoWCl7dHJ5e2xldCBaPUpTT04ucGFyc2UoWCksSj1bXTtmb3IobGV0W1kscV1vZiBPYmplY3QuZW50cmllcyhaLmRldmljZXM/P3t9KSl7bGV0IFE9WS5yZXBsYWNlKC9eY29tXC5hcHBsZVwuQ29yZVNpbXVsYXRvclwuU2ltUnVudGltZVwuLywiIikucmVwbGFjZSgvLS9nLCIuIik7Zm9yKGxldCBLIG9mIHEpaWYoSy5pc0F2YWlsYWJsZSlKLnB1c2goe3VkaWQ6Sy51ZGlkLG5hbWU6Sy5uYW1lLHN0YXRlOksuc3RhdGUscnVudGltZTpRfSl9cmV0dXJuIEp9Y2F0Y2h7cmV0dXJuW119fWZ1bmN0aW9uIGo1KFgpe2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGhvbmUiKSlyZXR1cm4gMDtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuIDE7aWYoWi5pbmNsdWRlcygid2F0Y2giKSlyZXR1cm4gMjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4gMztyZXR1cm4gNH1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5zdGFydHNXaXRoKCJpb3MiKSlyZXR1cm4gMDtpZihaLnN0YXJ0c1dpdGgoImlwYWRvcyIpKXJldHVybiAxO2lmKFouc3RhcnRzV2l0aCgid2F0Y2hvcyIpKXJldHVybiAyO2lmKFouc3RhcnRzV2l0aCgidmlzaW9ub3MiKXx8Wi5zdGFydHNXaXRoKCJ4cm9zIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24gbDYoe2RldmljZXM6WCxzZWxlY3RlZFVkaWQ6Wixsb2FkaW5nOkosZXJyb3I6WSxzdG9wcGluZ1VkaWRzOnEsb25SZWZyZXNoOlEsb25TZWxlY3Q6SyxvblN0b3A6Vyx0cmlnZ2VyOkd9KXtsZXRbeixQXT1TKCExKSwkPXcobnVsbCk7eCgoKT0+e2lmKCF6KXJldHVybjtsZXQgQT0oayk9PntpZighJC5jdXJyZW50Py5jb250YWlucyhrLnRhcmdldCkpUCghMSl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSl9LFt6XSk7bGV0IF89bmV3IE1hcDtmb3IobGV0IEEgb2YgWCl7aWYoQS51ZGlkPT09Wiljb250aW51ZTtsZXQgaz1fLmdldChBLnJ1bnRpbWUpO2lmKCFrKWs9W10sXy5zZXQoQS5ydW50aW1lLGspO2sucHVzaChBKX1mb3IobGV0IEEgb2YgXy52YWx1ZXMoKSlBLnNvcnQoKGssSSk9Pmo1KGsubmFtZSktajUoSS5uYW1lKXx8ay5uYW1lLmxvY2FsZUNvbXBhcmUoSS5uYW1lKSk7bGV0IE89Wy4uLl8uZW50cmllcygpXS5zb3J0KChbQV0sW2tdKT0+djUoQSktdjUoayl8fEEubG9jYWxlQ29tcGFyZShrKSksQz1YLmZpbmQoKEEpPT5BLnVkaWQ9PT1aKT8/bnVsbDtyZXR1cm4gTigiZGl2Iix7cmVmOiQsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9LGNoaWxkcmVuOltOKCJkaXYiLHtvbkNsaWNrOigpPT57aWYoIXopUSgpO1AoKEEpPT4hQSl9LGNoaWxkcmVuOkd9KSx6JiZOKCJkaXYiLHtzdHlsZTppNixjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6dTYsY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp7Zm9udFdlaWdodDo2MDB9LGNoaWxkcmVuOiJTaW11bGF0b3JzIn0pLE4oImJ1dHRvbiIse29uQ2xpY2s6KEEpPT57QS5zdG9wUHJvcGFnYXRpb24oKSxRKCl9LGRpc2FibGVkOkosc3R5bGU6bzYsY2hpbGRyZW46Sj8iLi4uIjoiUmVmcmVzaCJ9KV19KSxZJiZOKCJkaXYiLHtzdHlsZTpzNixjaGlsZHJlbjpZfSksQyYmTihkLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6ey4uLnA1LGNvbG9yOiIjYTViNGZjIn0sY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp5NShDLnN0YXRlPT09IkJvb3RlZCI/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46Qy5uYW1lfSldfSksTigiZGl2Iix7c3R5bGU6cjZ9KV19KSxYLmxlbmd0aD09PTAmJiFKJiYhWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46Ik5vIGF2YWlsYWJsZSBzaW11bGF0b3JzIGZvdW5kIn0pLE8ubWFwKChbQSxrXSk9Pk4oImRpdiIse2NoaWxkcmVuOltOKCJkaXYiLHtzdHlsZTpuNixjaGlsZHJlbjpBfSksay5tYXAoKEkpPT57bGV0IE09cS5oYXMoSS51ZGlkKSxoPUkuc3RhdGU9PT0iQm9vdGVkIjtyZXR1cm4gTigiZGl2Iix7c3R5bGU6cDUsb25Nb3VzZUVudGVyOihFKT0+RS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMjU1LDI1NSwyNTUsMC4wOCkiLG9uTW91c2VMZWF2ZTooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJ0cmFuc3BhcmVudCIsb25DbGljazooKT0+e0soSSksUCghMSl9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6eTUoaD8iIzRhZGU4MCI6IiM0NDQiKX0pLE4oInNwYW4iLHtzdHlsZTp7ZmxleDoxfSxjaGlsZHJlbjpJLm5hbWV9KSxoJiZOKCJzcGFuIix7cm9sZToiYnV0dG9uIixvbkNsaWNrOihFKT0+e2lmKEUuc3RvcFByb3BhZ2F0aW9uKCksIU0pVyhJLnVkaWQpfSxzdHlsZTp7Zm9udFNpemU6MTAscGFkZGluZzoiMXB4IDZweCIsYm9yZGVyUmFkaXVzOjQsY29sb3I6TT8iIzg4OCI6IiNmODcxNzEiLGJhY2tncm91bmQ6TT8idHJhbnNwYXJlbnQiOiJyZ2JhKDI0OCwxMTMsMTEzLDAuMSkiLGN1cnNvcjpNPyJkZWZhdWx0IjoicG9pbnRlciJ9LGNoaWxkcmVuOk0/IlN0b3BwaW5nLi4uIjoiU3RvcCJ9KV19LEkudWRpZCl9KV19LEEpKV19KV19KX1mdW5jdGlvbiB5NShYKXtyZXR1cm57d2lkdGg6NixoZWlnaHQ6Nixib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDpYLGZsZXhTaHJpbms6MH19ZnVuY3Rpb24gYzYoKXtsZXQgWD13aW5kb3cuX19TSU1fUFJFVklFV19fLFtaLEpdPVMoITEpLFtZLHFdPVMoW10pLFtRLEtdPVMoITEpLFtXLEddPVMobnVsbCksW3osUF09UyhuZXcgU2V0KSxbJCxfXT1TKCExKSxPPWooYXN5bmMoKT0+e0soITApLEcobnVsbCk7dHJ5e2xldCBGPWF3YWl0IEEwKCJ4Y3J1biBzaW1jdGwgbGlzdCBkZXZpY2VzIGF2YWlsYWJsZSAtaiIpO2lmKEYuZXhpdENvZGUhPT0wKXRocm93IEVycm9yKEYuc3RkZXJyfHwic2ltY3RsIGxpc3QgZmFpbGVkIik7cShhNihGLnN0ZG91dCkpfWNhdGNoKEYpe0coRiBpbnN0YW5jZW9mIEVycm9yP0YubWVzc2FnZToiRmFpbGVkIHRvIGxpc3QgZGV2aWNlcyIpfWZpbmFsbHl7SyghMSl9fSxbXSk7aWYoeCgoKT0+e08oKX0sW09dKSx4KCgpPT57aWYoIVg/LmxvZ3NFbmRwb2ludClyZXR1cm47bGV0IEY9bmV3IEV2ZW50U291cmNlKFgubG9nc0VuZHBvaW50KSxSPW5ldyBNYXAsdj1bIiM4YmU5ZmQiLCIjNTBmYTdiIiwiI2ZmYjg2YyIsIiNmZjc5YzYiLCIjYmQ5M2Y5IiwiI2YxZmE4YyIsIiM2MjcyYTQiLCIjZmY1NTU1IiwiIzY5ZmY5NCIsIiNkNmFjZmYiLCIjZmZmZmE1IiwiI2E0ZmZmZiIsIiNmZjZlNmUiLCIjY2FhOWZhIiwiIzVhZjc4ZSJdO2Z1bmN0aW9uIFQoWjApe2xldCB5PVIuZ2V0KFowKTtpZigheSl7bGV0IGU9MDtmb3IobGV0IGE9MDthPFowLmxlbmd0aDthKyspZT0oZTw8NSktZStaMC5jaGFyQ29kZUF0KGEpfDA7eT12W01hdGguYWJzKGUpJXYubGVuZ3RoXSxSLnNldChaMCx5KX1yZXR1cm4geX1sZXQgaT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oWjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoWjAuZGF0YSksZT15LnByb2Nlc3NJbWFnZVBhdGg/LnNwbGl0KCIvIikucG9wKCk/P3kuc2VuZGVySW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz8iIixhPXkuc3Vic3lzdGVtPz8iIixWMD15LmNhdGVnb3J5Pz8iIixKMD15LmV2ZW50TWVzc2FnZT8/IiI7aWYoIUowKXJldHVybjtpZihlIT09aSl7aWYobSljb25zb2xlLmdyb3VwRW5kKCk7bGV0IE0wPVQoZSk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke2V9JHthP2AgJWMke2F9JHtWMD8iOiIrVjA6IiJ9YDoiIn1gLGBjb2xvcjoke00wfTtmb250LXdlaWdodDpib2xkYCwuLi5hP1siY29sb3I6Izg4ODtmb250LXdlaWdodDpub3JtYWwiXTpbXSksbT0hMCxpPWV9bGV0IGw9KHkubWVzc2FnZVR5cGU/PyIiKS50b0xvd2VyQ2FzZSgpLHU9YSYmZT09PWk/YCVjJHtWMHx8YX0lYyBgOiIiLFUwPXU/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGw9PT0iZmF1bHQifHxsPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihsPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBDPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbCxBPWswKEM/Lm5hbWUpLGs9JDBbQV0sST1rLndpZHRoLTIqay5iZXplbFgsTT1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoQSksRT1BPT09InZpc2lvbiI/NTgwOkE9PT0iaXBhZCI/NDAwOkE9PT0id2F0Y2giPzIwMDozMjAsbj1tNihYLnN0cmVhbVVybCksUTA9dyhudWxsKTt4KCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsUTAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFEwLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IGc9aigoRixSKT0+e2xldCB2PVEwLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLGk9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7aVswXT1GLGkuc2V0KFQsMSksdi5zZW5kKGkpfSxbXSksSzA9aigoRik9PmcoMyxGKSxbZ10pLHM9aigoRik9PmcoNSxGKSxbZ10pLHI9aigoRik9PmcoNCx7YnV0dG9uOkZ9KSxbZ10pLE8wPWooKEYsUik9PntnKDYse3R5cGU6Rix1c2FnZTpSfSl9LFtnXSksW2owLHYwXT1TKG51bGwpO3goKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgaT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksaSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e08wKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksTzAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLE8wKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksTzAoInVwIiwyMjcpfSxbTzBdKTt4KCgpPT57bGV0IEY9KFQsaSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLGk9PT0iZG93biImJiFULnJlcGVhdClnKDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSxpPT09ImRvd24iJiYhVC5yZXBlYXQpQTAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoWjApPT57bGV0IHk9WjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gQTAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWY2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLGcoNix7dHlwZTppLHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbZyxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgQTAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IEEwKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBBMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57UCgoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgQTAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgTygpfWZpbmFsbHl7UCgoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbT10pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6QTAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOkM/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpDPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihsNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOk8sb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtNfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOm4uc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6bi5mcmFtZSxzdHJlYW1Db25maWc6bi5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0saTY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSx1Nj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0sbzY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sczY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LHA1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxyNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LHQ2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sbjY9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtQNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTihjNix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return P}function b($){let C=($?.basePath??"/.sim").replace(/\/+$/,"");return(J,z,K)=>{let X=J.url??"";if(X===C||X===C+"/"){let Q=O()[0]??null,V=p();if(Q){let G=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...Q,logsEndpoint:C+"/logs"})}</script>`;V=V.replace("<!--__SIM_PREVIEW_CONFIG__-->",G)}z.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),z.end(V);return}if(X===C+"/api"){let W=O();z.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),z.end(JSON.stringify(W[0]||null));return}if((X===C+"/exec"||X===C+"/exec/")&&J.method==="POST"){let W="";J.on("data",(Q)=>{W+=typeof Q==="string"?Q:Q.toString()}),J.on("end",()=>{let Q="";try{Q=JSON.parse(W).command??""}catch{}if(!Q){z.writeHead(400,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}g(Q,{maxBuffer:16777216},(V,Y,G)=>{z.writeHead(200,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:Y.toString(),stderr:G.toString(),exitCode:V?V.code??1:0}))})});return}if(X===C+"/logs"||X.startsWith(C+"/logs?")){let W=O();if(W.length===0){z.writeHead(404),z.end("No serve-sim device");return}let Q=W[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
|
|
2
|
+
import{readdirSync as g,readFileSync as y,existsSync as N,unlinkSync as F}from"fs";import{execSync as R,spawn as U,exec as q,execFile as k}from"child_process";import{tmpdir as _}from"os";import{join as w}from"path";var B=w(_(),"serve-sim"),I=new Set(["host.exp.Exponent","dev.expo.Exponent"]),v=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],f=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;function m(Y){return!f.test(Y)}function p(Y,J){if(I.has(J))return Promise.resolve(!0);return new Promise((Q)=>{k("xcrun",["simctl","get_app_container",Y,J,"app"],{timeout:2000},(z,Z)=>{if(z)return Q(!1);let C=Z.trim();if(!C)return Q(!1);for(let X of v)if(N(w(C,X)))return Q(!0);Q(!1)})})}var O={at:0,booted:null};function S(){let Y=Date.now();if(O.booted&&Y-O.at<1500)return O.booted;try{let J=R("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),Q=JSON.parse(J),z=new Set;for(let Z of Object.values(Q.devices))for(let C of Z)if(C.state==="Booted")z.add(C.udid);return O={at:Y,booted:z},z}catch{return null}}function L(){let Y;try{Y=g(B).filter((z)=>z.startsWith("server-")&&z.endsWith(".json"))}catch{return[]}let J=S(),Q=[];for(let z of Y){let Z=w(B,z);try{let C=JSON.parse(y(Z,"utf-8"));try{process.kill(C.pid,0)}catch{try{F(Z)}catch{}continue}if(J&&!J.has(C.device)){try{process.kill(C.pid,"SIGTERM")}catch{}try{F(Z)}catch{}continue}Q.push(C)}catch{}}return Q}var A=null;function h(){if(!A)A=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixqNCxtNSxQMCxiNCx2NCx5NCwkNCxtMCxUMCxwNCxHNCx6NCxXNCxnNCxkMD17fSxhMD1bXSxmNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVjQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZjAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBmMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2o0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGYoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gaShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBkNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLEg0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLGY0KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJng0KFEpfX1mdW5jdGlvbiB4NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSkseDQoWCl9ZnVuY3Rpb24gTDQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxiNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoYjQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fHY0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHk0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsZDUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIGg0KFgsWixKLFkscSxRLEssVyxHLHosTyl7dmFyICQsXyxBLE0sVSxrLEksQz1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1hNShKLFosQyxHLGgpLCQ9MDskPGg7JCsrKShBPUouX19rWyRdKSE9bnVsbCYmKF89QS5fX2khPS0xJiZDW0EuX19pXXx8ZDAsQS5fX2k9JCxrPUg0KFgsQSxfLHEsUSxLLFcsRyx6LE8pLE09QS5fX2UsQS5yZWYmJl8ucmVmIT1BLnJlZiYmKF8ucmVmJiZQNChfLnJlZixudWxsLEEpLE8ucHVzaChBLnJlZixBLl9fY3x8TSxBKSksVT09bnVsbCYmTSE9bnVsbCYmKFU9TSksKEk9ISEoNCZBLl9fdSkpfHxfLl9faz09PUEuX19rPyhHPW00KEEsRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBBLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOk0mJihHPU0ubmV4dFNpYmxpbmcpLEEuX191Jj0tNyk7cmV0dXJuIEouX19lPVUsR31mdW5jdGlvbiBhNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosTz1KLmxlbmd0aCwkPU8sXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWYwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1mMChmLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWYwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWw1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+Tz9fLS06cTxPJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8TztRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksYTQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gbTQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPW00KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGw1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxPPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8TyYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihPPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGY1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8UzQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8UzQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UocDQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1HNCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUjQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1HNCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIEg0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBPLCQsXyxBLE0sVSxrLEksQyxoLEUsZSxaMCx4LEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChPPUIuX19iKSYmTyhaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsQz1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KE89cy5jb250ZXh0VHlwZSkmJllbTy5fX2NdLEU9Tz9oP2gucHJvcHMudmFsdWU6Ty5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihDP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgaShJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1pNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksQyYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxDJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLEE9JC5wcm9wcyxNPSQuc3RhdGUsJC5fX3Y9WixfKUMmJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxDJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoQyYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1BJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxDJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKEEsTSxVKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLGU9Qi5fX3IsWjA9MCxDKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrWjA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxDJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKFU9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShBLE0pKSx4PU8hPW51bGwmJk8udHlwZT09PWYmJk8ua2V5PT1udWxsP2Q0KE8ucHJvcHMuY2hpbGRyZW4pOk8sVz1oNChYLGIwKHgpP3g6W3hdLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspVjQoUVtLMF0pO040KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxONChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWM1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKE89Qi5kaWZmZWQpJiZPKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBONChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKE40KSl9ZnVuY3Rpb24gZjQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKVA0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGM1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixPLCQsXyxBLE0sVSxrPUoucHJvcHN8fGQwLEk9Wi5wcm9wcyxDPVoudHlwZTtpZihDPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6Qz09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoQT1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBBPT0hIUMmJihDP0EubG9jYWxOYW1lPT1DOkEubm9kZVR5cGU9PTMpKXtYPUEsUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihDPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLEMsSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihDPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhBPVguYXR0cmlidXRlc1t6XSkubmFtZV09QS52YWx1ZTtmb3IoeiBpbiBrKUE9a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9QTp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsQSxxKTtmb3IoeiBpbiBJKUE9SVt6XSx6PT0iY2hpbGRyZW4iP189QTp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP089QTp6PT0idmFsdWUiP009QTp6PT0iY2hlY2tlZCI/VT1BOlcmJnR5cGVvZiBBIT0iZnVuY3Rpb24ifHxrW3pdPT09QXx8aDAoWCx6LEEsa1t6XSxxKTtpZihPKVd8fCQmJihPLl9faHRtbD09JC5fX2h0bWx8fE8uX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1PLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLGg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxDPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylWNChRW3pdKTtXfHwoej0idmFsdWUiLEM9PSJwcm9ncmVzcyImJk09PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6TSE9bnVsbCYmKE0hPT1YW3pdfHxDPT0icHJvZ3Jlc3MiJiYhTXx8Qz09Im9wdGlvbiImJk0hPWtbel0pJiZoMChYLHosTSxrW3pdLHEpLHo9ImNoZWNrZWQiLFUhPW51bGwmJlUhPVhbel0mJmgwKFgseixVLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIFA0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGE0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8UDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZhNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8VjQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGk1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLEg0KFosWD0oIVkmJkp8fFopLl9faz1XMChmLG51bGwsW1hdKSxxfHxkMCxkMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxmNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLEw0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrZzQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LGo0PTAsbTU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGkucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLEw0KHRoaXMpKX0saS5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLEw0KHRoaXMpKX0saS5wcm90b3R5cGUucmVuZGVyPWYsUDA9W10sdjQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHk0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLCQ0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrJDQsVDA9Il9fYSIrJDQscDQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksRzQ9MCx6ND1SNCghMSksVzQ9UjQoITApLGc0PTA7dmFyIEYwLHAsTzQsbDQsUzA9MCxuND1bXSxkPUIsYzQ9ZC5fX2IsaTQ9ZC5fX3IsdTQ9ZC5kaWZmZWQsbzQ9ZC5fX2MsczQ9ZC51bm1vdW50LHI0PWQuX187ZnVuY3Rpb24gbzAoWCxaKXtkLl9faCYmZC5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsQTQoWDUsWCl9ZnVuY3Rpb24gQTQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOlg1KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgTz1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKE8uZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIE8uc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIEE9Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxBIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgTz1RO1E9dm9pZCAwLHEoVyxHLHopLFE9T31LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIGcoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFkLl9fcyYmZTQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gZTQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiB1NSgpe2Zvcih2YXIgWDtYPW40LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZC5fX2UoSixYLl9fdil9fX1kLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsYzQmJmM0KFgpfSxkLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSkscjQmJnI0KFgsWil9LGQuX19yPWZ1bmN0aW9uKFgpe2k0JiZpNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKE80PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W10sRjA9MCkpLE80PXB9LGQuZGlmZmVkPWZ1bmN0aW9uKFgpe3U0JiZ1NChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJihuNC5wdXNoKFopIT09MSYmbDQ9PT1kLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChsND1kLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fG81KSh1NSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLE80PXA9bnVsbH0sZC5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8VTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGQuX19lKFksSi5fX3YpfX0pLG80JiZvNChYLFopfSxkLnVubW91bnQ9ZnVuY3Rpb24oWCl7czQmJnM0KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmQuX19lKFosSi5fX3YpKX07dmFyIHQ0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gbzUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSx0NCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3Q0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBVNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gWDUoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIFo2KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFo1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KEo1LnByb3RvdHlwZT1uZXcgaSkuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsSjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBaNSh0aGlzLnByb3BzLFgpfHxaNSh0aGlzLnN0YXRlLFopfTt2YXIgWTU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLFk1JiZZNShYKX07dmFyIEo2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9SjYoWCxaLEosWSl9O3ZhciBxNT1CLnVubW91bnQ7ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1aNih7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gTDUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTjUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBONShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIEI0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIEc1KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxxNSYmcTUoWCl9LChCNC5wcm90b3R5cGU9bmV3IGkpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPUc1KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TjUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgTztmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtPPVkuby5wb3AoKTspTy5fX1A9VyxPLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxCNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LEI0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUw1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGYsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChmLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIFE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBpKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPUc1KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxRNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtRNShYLEosWil9KX07dmFyIFk2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLHE2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxRNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLEs2PS9bQS1aMC05XS9nLCQ2PXR5cGVvZiBkb2N1bWVudDwidSIsejY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBWNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1pLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBLNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIEs1JiYoWD1LNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIEg1LFc2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSwkNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHwkNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fHo2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpRNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJnE2LnRlc3QoSyk/Sz1LLnJlcGxhY2UoSzYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIixXNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVk2LCQ1JiYkNShYKX07dmFyIHo1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKSxINT1YLl9fY307dmFyIFc1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe1c1JiZXNShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksSDU9bnVsbH07ZnVuY3Rpb24gUDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIE81KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7VjUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe1A1KFgpfX19ZnVuY3Rpb24gQzUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBBNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oQTUucHJvdG90eXBlPW5ldyBpKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxBNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIFU1KHRoaXMucHJvcHMsWCl8fFU1KHRoaXMuc3RhdGUsWil9O3ZhciBCNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksQjUmJkI1KFgpfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1DNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9TDYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgTjY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1ONihYLFosSixZKX07dmFyIF81PUIudW5tb3VudDtmdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPUM1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBFNShZLFosSil9KSksWH1mdW5jdGlvbiB3NShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIHc1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gRjQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gVDUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLF81JiZfNShYKX0sKEY0LnByb3RvdHlwZT1uZXcgaSkuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9VDUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT13NSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBPO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO089WS5vLnBvcCgpOylPLl9fUD1XLE8uZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LEY0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRjQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09RTUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZixudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGYsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgRjU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGkpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9VDUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLEY1KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope0Y1KFgsSixaKX0pfTt2YXIgRzY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsVjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEg2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sUDY9L1tBLVowLTldL2csTzY9dHlwZW9mIGRvY3VtZW50PCJ1IixVNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2kucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEQ1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRDUmJihYPUQ1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgYjUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LGs1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fE82JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8VTYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkg2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmVjYudGVzdChLKT9LPUsucmVwbGFjZShQNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9RzYsazUmJms1KFgpfTt2YXIgSTU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7STUmJkk1KFgpLGI1PVguX19jfTt2YXIgTTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7TTUmJk01KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxiNT1udWxsfTt2YXIgQjY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1CNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEQ0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsXzY9MyxGNj00LEQ2PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOk8sc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6QSxjb25uZWN0aW9uUXVhbGl0eTpNfSl7bGV0IFU9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksQz13KG51bGwpLFtoLEVdPVMoITEpLFtlLFowXT1TKG51bGwpLFt4LEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixVMF09UyhudWxsKTtnKCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFA9TFswXT8uY29udGVudFJlY3Q7aWYoUClVMCh7d2lkdGg6UC53aWR0aCxoZWlnaHQ6UC5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7ZygoKT0+e2lmKE09PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtNXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoQSk7di5jdXJyZW50PUEsZygoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLGcoKCk9PntpZihVJiYkKUswKCQpfSxbVSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IHU9dyhudWxsKTtnKCgpPT57aWYoIVV8fCF6KXJldHVybjtsZXQgSD1zZXRUaW1lb3V0KCgpPT57aWYoIVQuY3VycmVudClaMCgiU3RyZWFtIGlzIG5vdCBwcm9kdWNpbmcgZnJhbWVzLiBUaGUgc2ltdWxhdG9yIG1heSBoYXZlIHN0b3BwZWQg4oCUIHRyeSByZWNvbm5lY3RpbmcuIil9LDYwMDApLEw9eigoUCk9PntHMC5jdXJyZW50KyssWDAuY3VycmVudD1EYXRlLm5vdygpO2xldCBEPUkuY3VycmVudDtpZihEKXtpZih1LmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTCh1LmN1cnJlbnQpO3UuY3VycmVudD1QLEQuc3JjPVB9aWYoIVQuY3VycmVudCljbGVhclRpbWVvdXQoSCksRSghMCksWjAobnVsbCl9KTtyZXR1cm4oKT0+e2NsZWFyVGltZW91dChIKSxMPy4oKX19LFtVLHpdKTtsZXQgbT1qKChWKT0+e2lmKFUpe0s/LihWKTtyZXR1cm59bGV0IEg9Qy5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09XzYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEtdKSxKMD1qKChWKT0+e2lmKFUpe0c/LihWKTtyZXR1cm59bGV0IEg9Qy5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09RjYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEddKSx5PWooKFYpPT57aWYoVSl7Vz8uKFYpO3JldHVybn1sZXQgSD1DLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFA9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7UFswXT1ENixQLnNldChMLDEpLEguc2VuZChQKX0sW1UsV10pO2coKCk9PntpZihVKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChsKT0+bC5qc29uKCkpLnRoZW4oKGwpPT57aWYobC53aWR0aD4wJiZsLmhlaWdodD4wKUswKGwpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsQy5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxaMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1owKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixQPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKSxEPSExLGI9c2V0VGltZW91dCgoKT0+e2lmKCFEKVowKCJTdHJlYW0gaXMgbm90IHByb2R1Y2luZyBmcmFtZXMuIFRoZSBzaW11bGF0b3IgbWF5IGhhdmUgc3RvcHBlZCDigJQgdHJ5IHJlY29ubmVjdGluZy4iKX0sNjAwMCk7cmV0dXJuKGFzeW5jKCk9Pnt0cnl7bGV0IG49KGF3YWl0IGZldGNoKFIse3NpZ25hbDpMLnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighbilyZXR1cm47bGV0IFEwPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiLS1mcmFtZSIpO3doaWxlKCEwKXtsZXR7ZG9uZTpoNSx2YWx1ZTpRNH09YXdhaXQgbi5yZWFkKCk7aWYoaDUpYnJlYWs7aWYoUTQpZm9yKGxldCBLND0wO0s0PD1RNC5sZW5ndGgtUTAubGVuZ3RoO0s0Kyspe2xldCBUND0hMDtmb3IobGV0IHgwPTA7eDA8UTAubGVuZ3RoO3gwKyspaWYoUTRbSzQreDBdIT09UTBbeDBdKXtUND0hMTticmVha31pZihUNCl7aWYoRzAuY3VycmVudCsrLCFEKUQ9ITAsY2xlYXJUaW1lb3V0KGIpfX19fWNhdGNoe319KSgpLCgpPT57TC5hYm9ydCgpLGNsZWFySW50ZXJ2YWwoUCksY2xlYXJUaW1lb3V0KGIpLEguY2xvc2UoKSxDLmN1cnJlbnQ9bnVsbH19LFtYLFIsVV0pO2xldCBYMD13KDApO2coKCk9PntpZighVSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9WDAuY3VycmVudDtpZighRHx8IVQuY3VycmVudClyZXR1cm47aWYoRGF0ZS5ub3coKS1EPlYpRSghMSl9LEw9c2V0SW50ZXJ2YWwoKCk9Pnt2MChHMC5jdXJyZW50KSxHMC5jdXJyZW50PTAsSCgpfSwxMDAwKSxQPSgpPT57aWYoIWRvY3VtZW50LmhpZGRlbilIKCl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixQKSwoKT0+e2NsZWFySW50ZXJ2YWwoTCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsUCl9fSxbVV0pO2xldCBhPWooKCk9PntyZXR1cm4gVT9JLmN1cnJlbnQ6ay5jdXJyZW50fSxbVV0pLFYwPWooKFYsSCk9PntsZXQgTD1hKCk7aWYoIUwpcmV0dXJuO2xldCBQPUwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD0oSC5jbGllbnRYLVAubGVmdCkvUC53aWR0aCxiPShILmNsaWVudFktUC50b3ApL1AuaGVpZ2h0O20oe3R5cGU6Vix4OkQseTpifSl9LFttXSksWTA9MyxjPXcoITEpLG89dyghMSksQTA9dyghMSksTTA9dyh7ZHg6MCxkeTowfSksQzA9dyghMSksW1k0LEk0XT1TKCExKSxNND13KHt4OjAuNSx5OjAuNX0pLFtIMCxxMF09UyhudWxsKTtnKCgpPT57bGV0IFY9KEwpPT57aWYoTC5rZXk9PT0iQWx0IilJNCghMCl9LEg9KEwpPT57aWYoTC5rZXk9PT0iQWx0Iil7aWYoSTQoITEpLCFvLmN1cnJlbnQpcTAobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSxnKCgpPT57aWYoWTQmJiFvLmN1cnJlbnQpe2xldCBWPU00LmN1cnJlbnQ7cTAoe3gxOlYueCx5MTpWLnkseDI6MS1WLngseTI6MS1WLnl9KX1lbHNlIGlmKCFZNCYmIW8uY3VycmVudClxMChudWxsKX0sW1k0XSk7bGV0IHkwPXcobnVsbCkscTQ9dyghMSksRTA9dygwKSxDND1qKChWLEgpPT57cTQuY3VycmVudD0hMDtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWAsTC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sW10pLEU0PWooKFYsSCk9PntpZighcTQuY3VycmVudClyZXR1cm47bGV0IEw9eTAuY3VycmVudDtpZihMKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEUwLmN1cnJlbnQpLEUwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57TC5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLEwuc3R5bGUudG9wPWAke0gqMTAwfSVgfSl9LFtdKSxwMD1qKCgpPT57cTQuY3VycmVudD0hMTtsZXQgVj15MC5jdXJyZW50O2lmKFYpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksVi5zdHlsZS5kaXNwbGF5PSJub25lIn0sW10pLHc0PXcoMCksdzA9dyhudWxsKSx4NT1qKCgpPT57bGV0IFY9RGF0ZS5ub3coKSxIPVYtdzQuY3VycmVudDtpZih3NC5jdXJyZW50PVYsSDwzMDApe2lmKHcwLmN1cnJlbnQpY2xlYXJUaW1lb3V0KHcwLmN1cnJlbnQpLHcwLmN1cnJlbnQ9bnVsbDtpZihRKVEoKTtlbHNlIEowKCJhcHBfc3dpdGNoZXIiKX1lbHNlIHcwLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e2lmKFEpUSgpO2Vsc2UgSjAoImhvbWUiKTt3MC5jdXJyZW50PW51bGx9LDMwMCl9LFtKMCxRXSksZzA9KCgpPT57aWYoIXh8fCFyKXJldHVybiBudWxsO2lmKHIud2lkdGg9PT0wfHxyLmhlaWdodD09PTApcmV0dXJuIG51bGw7bGV0IFY9TWF0aC5taW4oci53aWR0aC94LndpZHRoLHIuaGVpZ2h0L3guaGVpZ2h0KTtyZXR1cm57d2lkdGg6eC53aWR0aCpWLGhlaWdodDp4LmhlaWdodCpWfX0pKCk7cmV0dXJuIE4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXg6MSwuLi5fP3t9Ontib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sb3ZlcmZsb3c6ImhpZGRlbiIsbWluV2lkdGg6MCxtaW5IZWlnaHQ6MCwuLi5KfSxjbGFzc05hbWU6cSxjaGlsZHJlbjpbTigiZGl2Iix7cmVmOnMsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG1pbkhlaWdodDowLG1pbldpZHRoOjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsd2lkdGg6ZzA/YCR7ZzAud2lkdGh9cHhgOiIxMDAlIixoZWlnaHQ6ZzA/YCR7ZzAuaGVpZ2h0fXB4YDoiMTAwJSJ9LGNoaWxkcmVuOltOKCJpbWciLHtyZWY6ayxzcmM6VT92b2lkIDA6UixkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClLMCgoTCk9PkwmJkwud2lkdGg9PT1ILm5hdHVyYWxXaWR0aCYmTC5oZWlnaHQ9PT1ILm5hdHVyYWxIZWlnaHQ/TDp7d2lkdGg6SC5uYXR1cmFsV2lkdGgsaGVpZ2h0OkgubmF0dXJhbEhlaWdodH0pfSxzdHlsZTpVP3tkaXNwbGF5OiJub25lIn06e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RDQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLFUmJk4oImltZyIse3JlZjpJLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOkQ0LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uWX19KSxOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpENCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUD0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsQTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBiPXt4MTpQLHkxOkQseDI6MS1QLHkyOjEtRH07TTAuY3VycmVudD17ZHg6MS1QLVAsZHk6MS1ELUR9LHEwKGIpLHkoe3R5cGU6ImJlZ2luIiwuLi5ifSk7cmV0dXJufWlmKEM0KFAsRCksRD4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpQLHk6RCxlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsVjAoImJlZ2luIixWKX0sb25Nb3VzZU1vdmU6KFYpPT57bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihNNC5jdXJyZW50PXt4OlAseTpEfSxWLmJ1dHRvbnM9PT0wKXtpZihWLmFsdEtleSlxMCh7eDE6UCx5MTpELHgyOjEtUCx5MjoxLUR9KTtyZXR1cm59aWYoby5jdXJyZW50KXtsZXQgYjtpZihBMC5jdXJyZW50KXtsZXQgbD1NMC5jdXJyZW50O2I9e3gxOlAseTE6RCx4MjpQK2wuZHgseTI6RCtsLmR5fX1lbHNlIGI9e3gxOlAseTE6RCx4MjoxLVAseTI6MS1EfTtxMChiKSx5KHt0eXBlOiJtb3ZlIiwuLi5ifSk7cmV0dXJufWlmKEU0KFAsRCksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6UCx5OkQsZWRnZTpZMH0pO2Vsc2UgVjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQTAuY3VycmVudCl7bGV0IGI9TTAuY3VycmVudDt5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjpQK2IuZHgseTI6RCtiLmR5fSl9ZWxzZSB5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjoxLVAseTI6MS1EfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlxMChudWxsKTtyZXR1cm59aWYocDAoKSxjLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6UCx5OkQsZWRnZTpZMH0pfWMuY3VycmVudD0hMTtyZXR1cm59VjAoImVuZCIsVil9LG9uTW91c2VMZWF2ZTooVik9PntpZihvLmN1cnJlbnQpe2lmKEgwKXkoe3R5cGU6ImVuZCIsLi4uSDB9KTtvLmN1cnJlbnQ9ITEscTAobnVsbCk7cmV0dXJufWlmKHAwKCksYy5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7bSh7dHlwZToiZW5kIix4OlAseTpELGVkZ2U6WTB9KX1jLmN1cnJlbnQ9ITE7cmV0dXJufWlmKFYuYnV0dG9ucz4wKVYwKCJlbmQiLFYpO3EwKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtwMCgpO2xldCBsPVYudG91Y2hlc1swXSxuPVYudG91Y2hlc1sxXSxRMD17eDE6KGwuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KGwuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KG4uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTI6KG4uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O2lmKCFDMC5jdXJyZW50JiYhYy5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpRMC54MSx5OlEwLnkxfSk7QzAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYy5jdXJyZW50PSExLHEwKFEwKSx5KHt0eXBlOiJiZWdpbiIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEM0KEQsYiksYj4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpELHk6YixlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsbSh7dHlwZToiYmVnaW4iLHg6RCx5OmJ9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgbD1WLnRvdWNoZXNbMF0sbj1WLnRvdWNoZXNbMV0sUTA9e3gxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihuLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihuLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0fTtxMChRMCkseSh7dHlwZToibW92ZSIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEU0KEQsYiksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6RCx5OmIsZWRnZTpZMH0pO2Vsc2UgbSh7dHlwZToibW92ZSIseDpELHk6Yn0pfSxvblRvdWNoRW5kOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoQzAuY3VycmVudCl7aWYoVi50b3VjaGVzLmxlbmd0aDwyKXtsZXQgbD1WLmNoYW5nZWRUb3VjaGVzWzBdLG49SDA7aWYobCYmbil5KHt0eXBlOiJlbmQiLHgxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOm4ueDIseTI6bi55Mn0pO2Vsc2UgaWYobil5KHt0eXBlOiJlbmQiLC4uLm59KTtDMC5jdXJyZW50PSExLG8uY3VycmVudD0hMSxxMChudWxsKX1yZXR1cm59bGV0IFA9Vi5jaGFuZ2VkVG91Y2hlc1swXTtpZighUClyZXR1cm47bGV0IEQ9KFAuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsYj0oUC5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihwMCgpLGMuY3VycmVudCltKHt0eXBlOiJlbmQiLHg6RCx5OmIsZWRnZTpZMH0pLGMuY3VycmVudD0hMTtlbHNlIG0oe3R5cGU6ImVuZCIseDpELHk6Yn0pfX0pLE4oImRpdiIse3JlZjp5MCwiZGF0YS10ZXN0aWQiOiJ0b3VjaC1pbmRpY2F0b3IiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLHdpZHRoOjI0LGhlaWdodDoyNCxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSg1OSwxMzAsMjQ2LDAuNSkiLGJveFNoYWRvdzoiMCAwIDhweCByZ2JhKDU5LDEzMCwyNDYsMC4zKSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX0pLEgwJiZOKGYse2NoaWxkcmVuOltOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MSxIMC55MSl9KSxOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MixIMC55Mil9KV19KSwhaCYmIWUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiM4ODgiLGZvbnRTaXplOjE0fSxjaGlsZHJlbjoiQ29ubmVjdGluZy4uLiJ9KX0pLGUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmNDQiLGZvbnRTaXplOjE0LHBhZGRpbmc6MjAsdGV4dEFsaWduOiJjZW50ZXIifSxjaGlsZHJlbjplfSl9KSxKNCYmTigiZGl2Iix7c3R5bGU6azYsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2ZiYmYyNCIsZm9udFNpemU6MTMsZm9udEZhbWlseToibW9ub3NwYWNlIn0sY2hpbGRyZW46IlNsb3cgY29ubmVjdGlvbiJ9KX0pXX0pfSksIV8mJk4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiI0cHggOHB4Iixib3JkZXJUb3A6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sY2hpbGRyZW46W04oImJ1dHRvbiIse29uQ2xpY2s6eDUsc3R5bGU6e2JhY2tncm91bmQ6Im5vbmUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSIsY29sb3I6IiNhYWEiLGZvbnRTaXplOjExLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIscGFkZGluZzoiMnB4IDEwcHgiLGN1cnNvcjoicG9pbnRlciIsYm9yZGVyUmFkaXVzOjR9LGNoaWxkcmVuOiJIb21lIn0pLE4oInNwYW4iLHtzdHlsZTp7Y29sb3I6ajA+MD8iIzRmNCI6IiM4ODgiLGZvbnRTaXplOjEyLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6Nn0sY2hpbGRyZW46W00mJk4oInNwYW4iLHsiZGF0YS10ZXN0aWQiOiJxdWFsaXR5LWRvdCIsc3R5bGU6e3dpZHRoOjgsaGVpZ2h0OjgsYm9yZGVyUmFkaXVzOiI1MCUiLGRpc3BsYXk6ImlubGluZS1ibG9jayIsYmFja2dyb3VuZDpNPT09Imdvb2QiPyIjNGFkZTgwIjpNPT09ImRlZ3JhZGVkIj8iI2ZhY2MxNSI6IiNlZjQ0NDQifX0pLGowLCIgZnBzIl19KV19KV19KX12YXIgazY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjgsbGVmdDoiNTAlIix0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTUwJSkiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC43KSIsYm9yZGVyUmFkaXVzOjYscGFkZGluZzoiNHB4IDEycHgiLHBvaW50ZXJFdmVudHM6Im5vbmUifSxTNT17cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjgpIn0sUjU9MjA7ZnVuY3Rpb24gajUoWCxaKXtyZXR1cm57cG9zaXRpb246ImFic29sdXRlIixsZWZ0OmAke1gqMTAwfSVgLHRvcDpgJHtaKjEwMH0lYCx3aWR0aDpSNSxoZWlnaHQ6UjUsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjcpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fWZ1bmN0aW9uIGswKFgpe2lmKCFYKXJldHVybiJpcGhvbmUiO2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuImlwYWQiO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIndhdGNoIjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4idmlzaW9uIjtyZXR1cm4iaXBob25lIn12YXIgJDA9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LGI3PSQwLmlwaG9uZS53aWR0aCxTNz0kMC5pcGhvbmUuaGVpZ2h0LFI3PSQwLmlwaG9uZS5iZXplbFgsajc9JDAuaXBob25lLmJlemVsWSx2Nz0kMC5pcGhvbmUuaW5uZXJSYWRpdXM7ZnVuY3Rpb24gZTAoWD0iaXBob25lIil7bGV0IFo9JDBbWF0sSj1aLndpZHRoLTIqWi5iZXplbFgsWT1aLmhlaWdodC0yKlouYmV6ZWxZO3JldHVybmAke1ouaW5uZXJSYWRpdXMvSioxMDB9JSAvICR7Wi5pbm5lclJhZGl1cy9ZKjEwMH0lYH12YXIgazQ9XzAobnVsbCk7ZnVuY3Rpb24gWDQoWCl7bGV0IFo9UjAoazQpO2lmKCFaKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWn12YXIgdzY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBUNih7ZXhlYzpYLGRldmljZVVkaWQ6WixkZXZpY2VOYW1lOkosZGV2aWNlUnVudGltZTpZLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOlE9ITEsY2hpbGRyZW46SyxzdHlsZTpXLC4uLkd9KXtsZXQgej1rMChKKSwkPXtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksZGV2aWNlVHlwZTp6LHN0cmVhbWluZzpxLGRpc2FibGVkOlF8fCFafHwhcX07cmV0dXJuIE4oazQuUHJvdmlkZXIse3ZhbHVlOiQsY2hpbGRyZW46TigiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi53NiwuLi5XfSwuLi5HLGNoaWxkcmVuOkt9KX0pfXZhciBiNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sUzY9RDAoZnVuY3Rpb24oe25hbWU6WixzdWJ0aXRsZTpKLGhpZGVDaGV2cm9uOlksc3R5bGU6cSxvbk1vdXNlRW50ZXI6USxvbk1vdXNlTGVhdmU6SywuLi5XfSxHKXtsZXQgej1YNCgiVGl0bGUiKSxbTywkXT1TKCExKSxfPVo/P3ouZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsQT1KPz8oei5kZXZpY2VSdW50aW1lP3ouZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooTSk9PnskKCEwKSxRPy4oTSl9LG9uTW91c2VMZWF2ZTooTSk9PnskKCExKSxLPy4oTSl9LHN0eWxlOnsuLi5iNixiYWNrZ3JvdW5kOk8/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi5XLGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W18sIVkmJk4oInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46TigicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksTigic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46QX0pXX0pfSksUjY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBqNih7c3R5bGU6WCwuLi5afSl7cmV0dXJuIE4oImRpdiIse3N0eWxlOnsuLi5SNiwuLi5YfSwuLi5afSl9dmFyIHY2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LFo0PUQwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlosc3R5bGU6SixkaXNhYmxlZDpZLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpRLGNoaWxkcmVuOkssLi4uV30sRyl7bGV0IHo9UjAoazQpLE89WXx8Wnx8ej8uZGlzYWJsZWQsWyQsX109UyghMSk7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6Tyxvbk1vdXNlRW50ZXI6KEEpPT57XyghMCkscT8uKEEpfSxvbk1vdXNlTGVhdmU6KEEpPT57XyghMSksUT8uKEEpfSxzdHlsZTp7Li4udjYsY29sb3I6Tz8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDokJiYhTz8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpPPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLkp9LC4uLlcsY2hpbGRyZW46S30pfSk7ZnVuY3Rpb24geTYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFopPT5gLWUgJyR7Wn0nYCkucmVkdWNlKChaLEopPT5gJHtafSAke0p9YCwib3Nhc2NyaXB0Iil9dmFyIHA2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOk4oInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxnNj1OKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbTigicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLE4oImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLHg2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiSG9tZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMoeTYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5KLGNoaWxkcmVuOnA2fSl9KSxtNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLkosY2hpbGRyZW46ZzZ9KX0pLGY2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5KLGNoaWxkcmVuOng2fSl9KSx0PVQ2O3QuVGl0bGU9UzY7dC5BY3Rpb25zPWo2O3QuQnV0dG9uPVo0O3QuSG9tZUJ1dHRvbj1oNjt0LlNjcmVlbnNob3RCdXR0b249bTY7dC5Sb3RhdGVCdXR0b249ZjY7ZnVuY3Rpb24gZDYoWCl7bGV0W1osSl09UyhudWxsKSxZPXcobmV3IFNldCksW3EsUV09UyhudWxsKSxLPWooKFcpPT57cmV0dXJuIFkuY3VycmVudC5hZGQoVyksKCk9PntZLmN1cnJlbnQuZGVsZXRlKFcpfX0sW10pO3JldHVybiBnKCgpPT57aWYoIVgpcmV0dXJuO2xldCBXPW5ldyBBYm9ydENvbnRyb2xsZXIsRz1YLnJlcGxhY2UoL1wvc3RyZWFtXC5tanBlZyQvLCIiKTtyZXR1cm4gZmV0Y2goYCR7R30vY29uZmlnYCx7c2lnbmFsOlcuc2lnbmFsfSkudGhlbigoeik9PnouanNvbigpKS50aGVuKCh6KT0+e2lmKHoud2lkdGg+MCYmei5oZWlnaHQ+MClKKHopfSkuY2F0Y2goKCk9Pnt9KSwoYXN5bmMoKT0+e3RyeXtsZXQgTz0oYXdhaXQgZmV0Y2goWCx7c2lnbmFsOlcuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFPKXJldHVybjtsZXQgJD1uZXcgVWludDhBcnJheSgwKTt3aGlsZSghMCl7bGV0e2RvbmU6Xyx2YWx1ZTpBfT1hd2FpdCBPLnJlYWQoKTtpZihfKWJyZWFrO2xldCBNPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoK0EubGVuZ3RoKTtNLnNldCgkKSxNLnNldChBLCQubGVuZ3RoKSwkPU07d2hpbGUoITApe2xldCBVPS0xO2ZvcihsZXQgRT0wO0U8JC5sZW5ndGgtMTtFKyspaWYoJFtFXT09PTI1NSYmJFtFKzFdPT09MjE2KXtVPUU7YnJlYWt9aWYoVT09PS0xKWJyZWFrO2xldCBrPS0xO2ZvcihsZXQgRT1VKzI7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTcpe2s9RSsyO2JyZWFrfWlmKGs9PT0tMSlicmVhaztsZXQgST0kLnNsaWNlKFUsayk7JD0kLnNsaWNlKGspO2xldCBDPW5ldyBCbG9iKFtJXSx7dHlwZToiaW1hZ2UvanBlZyJ9KSxoPVVSTC5jcmVhdGVPYmplY3RVUkwoQyk7UShoKTtmb3IobGV0IEUgb2YgWS5jdXJyZW50KUUoaCl9fX1jYXRjaHt9fSkoKSwoKT0+Vy5hYm9ydCgpfSxbWF0pLHtzdWJzY3JpYmVGcmFtZTpLLGZyYW1lOnEsY29uZmlnOlp9fXZhciBhNj17S2V5QTo0LEtleUI6NSxLZXlDOjYsS2V5RDo3LEtleUU6OCxLZXlGOjksS2V5RzoxMCxLZXlIOjExLEtleUk6MTIsS2V5SjoxMyxLZXlLOjE0LEtleUw6MTUsS2V5TToxNixLZXlOOjE3LEtleU86MTgsS2V5UDoxOSxLZXlROjIwLEtleVI6MjEsS2V5UzoyMixLZXlUOjIzLEtleVU6MjQsS2V5VjoyNSxLZXlXOjI2LEtleVg6MjcsS2V5WToyOCxLZXlaOjI5LERpZ2l0MTozMCxEaWdpdDI6MzEsRGlnaXQzOjMyLERpZ2l0NDozMyxEaWdpdDU6MzQsRGlnaXQ2OjM1LERpZ2l0NzozNixEaWdpdDg6MzcsRGlnaXQ5OjM4LERpZ2l0MDozOSxFbnRlcjo0MCxFc2NhcGU6NDEsQmFja3NwYWNlOjQyLFRhYjo0MyxTcGFjZTo0NCxNaW51czo0NSxFcXVhbDo0NixCcmFja2V0TGVmdDo0NyxCcmFja2V0UmlnaHQ6NDgsQmFja3NsYXNoOjQ5LFNlbWljb2xvbjo1MSxRdW90ZTo1MixCYWNrcXVvdGU6NTMsQ29tbWE6NTQsUGVyaW9kOjU1LFNsYXNoOjU2LENhcHNMb2NrOjU3LEYxOjU4LEYyOjU5LEYzOjYwLEY0OjYxLEY1OjYyLEY2OjYzLEY3OjY0LEY4OjY1LEY5OjY2LEYxMDo2NyxGMTE6NjgsRjEyOjY5LFByaW50U2NyZWVuOjcwLFNjcm9sbExvY2s6NzEsUGF1c2U6NzIsSW5zZXJ0OjczLEhvbWU6NzQsUGFnZVVwOjc1LERlbGV0ZTo3NixFbmQ6NzcsUGFnZURvd246NzgsQXJyb3dSaWdodDo3OSxBcnJvd0xlZnQ6ODAsQXJyb3dEb3duOjgxLEFycm93VXA6ODIsTnVtTG9jazo4MyxOdW1wYWREaXZpZGU6ODQsTnVtcGFkTXVsdGlwbHk6ODUsTnVtcGFkU3VidHJhY3Q6ODYsTnVtcGFkQWRkOjg3LE51bXBhZEVudGVyOjg4LE51bXBhZDE6ODksTnVtcGFkMjo5MCxOdW1wYWQzOjkxLE51bXBhZDQ6OTIsTnVtcGFkNTo5MyxOdW1wYWQ2Ojk0LE51bXBhZDc6OTUsTnVtcGFkODo5NixOdW1wYWQ5Ojk3LE51bXBhZDA6OTgsTnVtcGFkRGVjaW1hbDo5OSxDb250cm9sTGVmdDoyMjQsU2hpZnRMZWZ0OjIyNSxBbHRMZWZ0OjIyNixNZXRhTGVmdDoyMjcsQ29udHJvbFJpZ2h0OjIyOCxTaGlmdFJpZ2h0OjIyOSxBbHRSaWdodDoyMzAsTWV0YVJpZ2h0OjIzMX07ZnVuY3Rpb24gbDYoWCl7cmV0dXJuIGE2W1hdPz9udWxsfWFzeW5jIGZ1bmN0aW9uIE8wKFgpe3JldHVybihhd2FpdCBmZXRjaCgiL2V4ZWMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7Y29tbWFuZDpYfSl9KSkuanNvbigpfWZ1bmN0aW9uIGM2KFgpe3RyeXtsZXQgWj1KU09OLnBhcnNlKFgpLEo9W107Zm9yKGxldFtZLHFdb2YgT2JqZWN0LmVudHJpZXMoWi5kZXZpY2VzPz97fSkpe2xldCBRPVkucmVwbGFjZSgvXmNvbVwuYXBwbGVcLkNvcmVTaW11bGF0b3JcLlNpbVJ1bnRpbWVcLi8sIiIpLnJlcGxhY2UoLy0vZywiLiIpO2ZvcihsZXQgSyBvZiBxKWlmKEsuaXNBdmFpbGFibGUpSi5wdXNoKHt1ZGlkOksudWRpZCxuYW1lOksubmFtZSxzdGF0ZTpLLnN0YXRlLHJ1bnRpbWU6UX0pfXJldHVybiBKfWNhdGNoe3JldHVybltdfX1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5pbmNsdWRlcygiaXBob25lIikpcmV0dXJuIDA7aWYoWi5pbmNsdWRlcygiaXBhZCIpKXJldHVybiAxO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIDI7aWYoWi5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24geTUoWCl7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouc3RhcnRzV2l0aCgiaW9zIikpcmV0dXJuIDA7aWYoWi5zdGFydHNXaXRoKCJpcGFkb3MiKSlyZXR1cm4gMTtpZihaLnN0YXJ0c1dpdGgoIndhdGNob3MiKSlyZXR1cm4gMjtpZihaLnN0YXJ0c1dpdGgoInZpc2lvbm9zIil8fFouc3RhcnRzV2l0aCgieHJvcyIpKXJldHVybiAzO3JldHVybiA0fWZ1bmN0aW9uIGk2KHtkZXZpY2VzOlgsc2VsZWN0ZWRVZGlkOlosbG9hZGluZzpKLGVycm9yOlksc3RvcHBpbmdVZGlkczpxLG9uUmVmcmVzaDpRLG9uU2VsZWN0Okssb25TdG9wOlcsdHJpZ2dlcjpHfSl7bGV0W3osT109UyghMSksJD13KG51bGwpO2coKCk9PntpZigheilyZXR1cm47bGV0IFU9KGspPT57aWYoISQuY3VycmVudD8uY29udGFpbnMoay50YXJnZXQpKU8oITEpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFUpfSxbel0pO2xldCBfPW5ldyBNYXA7Zm9yKGxldCBVIG9mIFgpe2lmKFUudWRpZD09PVopY29udGludWU7bGV0IGs9Xy5nZXQoVS5ydW50aW1lKTtpZighaylrPVtdLF8uc2V0KFUucnVudGltZSxrKTtrLnB1c2goVSl9Zm9yKGxldCBVIG9mIF8udmFsdWVzKCkpVS5zb3J0KChrLEkpPT52NShrLm5hbWUpLXY1KEkubmFtZSl8fGsubmFtZS5sb2NhbGVDb21wYXJlKEkubmFtZSkpO2xldCBBPVsuLi5fLmVudHJpZXMoKV0uc29ydCgoW1VdLFtrXSk9Pnk1KFUpLXk1KGspfHxVLmxvY2FsZUNvbXBhcmUoaykpLE09WC5maW5kKChVKT0+VS51ZGlkPT09Wik/P251bGw7cmV0dXJuIE4oImRpdiIse3JlZjokLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUifSxjaGlsZHJlbjpbTigiZGl2Iix7b25DbGljazooKT0+e2lmKCF6KVEoKTtPKChVKT0+IVUpfSxjaGlsZHJlbjpHfSkseiYmTigiZGl2Iix7c3R5bGU6bzYsY2hpbGRyZW46W04oImRpdiIse3N0eWxlOnM2LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2ZvbnRXZWlnaHQ6NjAwfSxjaGlsZHJlbjoiU2ltdWxhdG9ycyJ9KSxOKCJidXR0b24iLHtvbkNsaWNrOihVKT0+e1Uuc3RvcFByb3BhZ2F0aW9uKCksUSgpfSxkaXNhYmxlZDpKLHN0eWxlOnI2LGNoaWxkcmVuOko/Ii4uLiI6IlJlZnJlc2gifSldfSksWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46WX0pLE0mJk4oZix7Y2hpbGRyZW46W04oImRpdiIse3N0eWxlOnsuLi5nNSxjb2xvcjoiI2E1YjRmYyJ9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6cDUoTS5zdGF0ZT09PSJCb290ZWQiPyIjNGFkZTgwIjoiIzQ0NCIpfSksTigic3BhbiIse3N0eWxlOntmbGV4OjF9LGNoaWxkcmVuOk0ubmFtZX0pXX0pLE4oImRpdiIse3N0eWxlOm42fSldfSksWC5sZW5ndGg9PT0wJiYhSiYmIVkmJk4oImRpdiIse3N0eWxlOmU2LGNoaWxkcmVuOiJObyBhdmFpbGFibGUgc2ltdWxhdG9ycyBmb3VuZCJ9KSxBLm1hcCgoW1Usa10pPT5OKCJkaXYiLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6WDcsY2hpbGRyZW46VX0pLGsubWFwKChJKT0+e2xldCBDPXEuaGFzKEkudWRpZCksaD1JLnN0YXRlPT09IkJvb3RlZCI7cmV0dXJuIE4oImRpdiIse3N0eWxlOmc1LG9uTW91c2VFbnRlcjooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDI1NSwyNTUsMjU1LDAuMDgpIixvbk1vdXNlTGVhdmU6KEUpPT5FLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLG9uQ2xpY2s6KCk9PntLKEkpLE8oITEpfSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnA1KGg/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46SS5uYW1lfSksaCYmTigic3BhbiIse3JvbGU6ImJ1dHRvbiIsb25DbGljazooRSk9PntpZihFLnN0b3BQcm9wYWdhdGlvbigpLCFDKVcoSS51ZGlkKX0sc3R5bGU6e2ZvbnRTaXplOjEwLHBhZGRpbmc6IjFweCA2cHgiLGJvcmRlclJhZGl1czo0LGNvbG9yOkM/IiM4ODgiOiIjZjg3MTcxIixiYWNrZ3JvdW5kOkM/InRyYW5zcGFyZW50IjoicmdiYSgyNDgsMTEzLDExMywwLjEpIixjdXJzb3I6Qz8iZGVmYXVsdCI6InBvaW50ZXIifSxjaGlsZHJlbjpDPyJTdG9wcGluZy4uLiI6IlN0b3AifSldfSxJLnVkaWQpfSldfSxVKSldfSldfSl9ZnVuY3Rpb24gcDUoWCl7cmV0dXJue3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6WCxmbGV4U2hyaW5rOjB9fWZ1bmN0aW9uIHU2KCl7bGV0IFg9d2luZG93Ll9fU0lNX1BSRVZJRVdfXyxbWixKXT1TKCExKSxbWSxxXT1TKFtdKSxbUSxLXT1TKCExKSxbVyxHXT1TKG51bGwpLFt6LE9dPVMobmV3IFNldCksWyQsX109UyghMSksQT1qKGFzeW5jKCk9PntLKCEwKSxHKG51bGwpO3RyeXtsZXQgRj1hd2FpdCBPMCgieGNydW4gc2ltY3RsIGxpc3QgZGV2aWNlcyBhdmFpbGFibGUgLWoiKTtpZihGLmV4aXRDb2RlIT09MCl0aHJvdyBFcnJvcihGLnN0ZGVycnx8InNpbWN0bCBsaXN0IGZhaWxlZCIpO3EoYzYoRi5zdGRvdXQpKX1jYXRjaChGKXtHKEYgaW5zdGFuY2VvZiBFcnJvcj9GLm1lc3NhZ2U6IkZhaWxlZCB0byBsaXN0IGRldmljZXMiKX1maW5hbGx5e0soITEpfX0sW10pO2lmKGcoKCk9PntBKCl9LFtBXSksZygoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBGPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksUj1uZXcgTWFwLHY9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBUKEowKXtsZXQgeT1SLmdldChKMCk7aWYoIXkpe2xldCBYMD0wO2ZvcihsZXQgYT0wO2E8SjAubGVuZ3RoO2ErKylYMD0oWDA8PDUpLVgwK0owLmNoYXJDb2RlQXQoYSl8MDt5PXZbTWF0aC5hYnMoWDApJXYubGVuZ3RoXSxSLnNldChKMCx5KX1yZXR1cm4geX1sZXQgdT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oSjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoSjAuZGF0YSksWDA9eS5wcm9jZXNzSW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz95LnNlbmRlckltYWdlUGF0aD8uc3BsaXQoIi8iKS5wb3AoKT8/IiIsYT15LnN1YnN5c3RlbT8/IiIsVjA9eS5jYXRlZ29yeT8/IiIsWTA9eS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFZMClyZXR1cm47aWYoWDAhPT11KXtpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtsZXQgTTA9VChYMCk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke1gwfSR7YT9gICVjJHthfSR7VjA/IjoiK1YwOiIifWA6IiJ9YCxgY29sb3I6JHtNMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4uYT9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLG09ITAsdT1YMH1sZXQgYz0oeS5tZXNzYWdlVHlwZT8/IiIpLnRvTG93ZXJDYXNlKCksbz1hJiZYMD09PXU/YCVjJHtWMHx8YX0lYyBgOiIiLEEwPW8/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGM9PT0iZmF1bHQifHxjPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihjPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBNPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbDtnKCgpPT57ZG9jdW1lbnQudGl0bGU9TT8ubmFtZT9gU2ltdWxhdG9yIC0gJHtNLm5hbWV9YDoiU2ltdWxhdG9yIFByZXZpZXcifSxbTT8ubmFtZV0pO2xldCBVPWswKE0/Lm5hbWUpLGs9JDBbVV0sST1rLndpZHRoLTIqay5iZXplbFgsQz1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoVSksRT1VPT09InZpc2lvbiI/NTgwOlU9PT0iaXBhZCI/NDAwOlU9PT0id2F0Y2giPzIwMDozMjAsZT1kNihYLnN0cmVhbVVybCksWjA9dyhudWxsKTtnKCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsWjAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFowLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IHg9aigoRixSKT0+e2xldCB2PVowLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLHU9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7dVswXT1GLHUuc2V0KFQsMSksdi5zZW5kKHUpfSxbXSksSzA9aigoRik9PngoMyxGKSxbeF0pLHM9aigoRik9PngoNSxGKSxbeF0pLHI9aigoRik9PngoNCx7YnV0dG9uOkZ9KSxbeF0pLFUwPWooKEYsUik9Pnt4KDYse3R5cGU6Rix1c2FnZTpSfSl9LFt4XSksW2owLHYwXT1TKG51bGwpO2coKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgdT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksdSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e1UwKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLFUwKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoInVwIiwyMjcpfSxbVTBdKTtnKCgpPT57bGV0IEY9KFQsdSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLHU9PT0iZG93biImJiFULnJlcGVhdCl4KDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSx1PT09ImRvd24iJiYhVC5yZXBlYXQpTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoSjApPT57bGV0IHk9SjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWw2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLHgoNix7dHlwZTp1LHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbeCxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IE8wKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBPMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57TygoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgQSgpfWZpbmFsbHl7TygoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbQV0pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6TzAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOk0/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpNPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihpNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOkEsb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtDfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOmUuc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6ZS5mcmFtZSxzdHJlYW1Db25maWc6ZS5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0sbzY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSxzNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0scjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sdDY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LGc1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxuNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LGU2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sWDc9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtPNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTih1Nix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return A}function o(Y){let J=(Y?.basePath??"/.sim").replace(/\/+$/,"");return(Q,z,Z)=>{let C=Q.url??"";if(C===J||C===J+"/"){let V=L()[0]??null,W=h();if(V){let H=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...V,logsEndpoint:J+"/logs"})}</script>`;W=W.replace("<!--__SIM_PREVIEW_CONFIG__-->",H)}z.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),z.end(W);return}if(C===J+"/api"){let X=L();z.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),z.end(JSON.stringify(X[0]||null));return}if((C===J+"/exec"||C===J+"/exec/")&&Q.method==="POST"){let X="";Q.on("data",(V)=>{X+=typeof V==="string"?V:V.toString()}),Q.on("end",()=>{let V="";try{V=JSON.parse(X).command??""}catch{}if(!V){z.writeHead(400,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}q(V,{maxBuffer:16777216},(W,$,H)=>{z.writeHead(200,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:$.toString(),stderr:H.toString(),exitCode:W?W.code??1:0}))})});return}if(C===J+"/logs"||C.startsWith(J+"/logs?")){let X=L();if(X.length===0){z.writeHead(404),z.end("No serve-sim device");return}let V=X[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
|
|
3
3
|
|
|
4
|
-
`);let
|
|
5
|
-
`))!==-1){let M
|
|
4
|
+
`);let W=U("xcrun",["simctl","spawn",V,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),$="";W.stdout.on("data",(H)=>{$+=H.toString();let G;while((G=$.indexOf(`
|
|
5
|
+
`))!==-1){let M=$.slice(0,G).trim();if($=$.slice(G+1),M)z.write("data: "+M+`
|
|
6
6
|
|
|
7
|
-
`)}}),
|
|
7
|
+
`)}}),W.on("close",()=>z.end()),Q.on("close",()=>W.kill());return}if(C===J+"/appstate"||C.startsWith(J+"/appstate?")){let X=L();if(X.length===0){z.writeHead(404),z.end("No serve-sim device");return}let V=X[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
|
|
8
8
|
|
|
9
|
-
`);let
|
|
10
|
-
`))!==-1){let
|
|
9
|
+
`);let W=U("xcrun",["simctl","spawn",V,"log","stream","--style","ndjson","--level","info","--predicate",'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"'],{stdio:["ignore","pipe","ignore"]}),$=/\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/,H="",G="";W.stdout.on("data",(M)=>{G+=M.toString();let P;while((P=G.indexOf(`
|
|
10
|
+
`))!==-1){let T=G.slice(0,P).trim();if(G=G.slice(P+1),!T)continue;let D;try{D=JSON.parse(T).eventMessage??""}catch{continue}let j=$.exec(D);if(!j)continue;let K=j[1],E=parseInt(j[2],10);if(!m(K))continue;if(K===H)continue;H=K,p(V,K).then((x)=>{z.write("data: "+JSON.stringify({bundleId:K,pid:E,isReactNative:x})+`
|
|
11
11
|
|
|
12
|
-
`)})}}),
|
|
12
|
+
`)})}}),W.on("close",()=>z.end()),Q.on("close",()=>W.kill());return}if(Z)Z()}}export{o as simMiddleware};
|
package/dist/serve-sim.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var Be=Object.defineProperty;var fe=(e)=>e;function Te(e,_){this[e]=fe.bind(null,_)}var pe=(e,_)=>{for(var t in _)Be(e,t,{get:_[t],enumerable:!0,configurable:!0,set:Te.bind(_,t)})};var De=(e,_)=>()=>(e&&(_=e(e=0)),_);var X={};pe(X,{simMiddleware:()=>Le});import{readdirSync as Fe,readFileSync as ue,existsSync as ge}from"fs";import{spawn as U,exec as we,execFile as ve}from"child_process";import{tmpdir as be}from"os";import{join as V}from"path";function He(e){return!me.test(e)}function Ne(e,_){if(he.has(_))return Promise.resolve(!0);return new Promise((t)=>{ve("xcrun",["simctl","get_app_container",e,_,"app"],{timeout:2000},(s,r)=>{if(s)return t(!1);let C=r.trim();if(!C)return t(!1);for(let o of Oe)if(ge(V(C,o)))return t(!0);t(!1)})})}function b(){let e;try{e=Fe(k).filter((t)=>t.startsWith("server-")&&t.endsWith(".json"))}catch{return[]}let _=[];for(let t of e)try{let s=JSON.parse(ue(V(k,t),"utf-8"));try{process.kill(s.pid,0),_.push(s)}catch{}}catch{}return _}function Ve(){if(!N)N=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixSNCx4NSxQMCxUNCxqNCx2NCxLNCxtMCxUMCx5NCxONCwkNCx6NCxwNCxmMD17fSxhMD1bXSxoNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gRzQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZDAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBkMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK1I0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGQoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gYyhYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBtNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLFY0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLG00KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJmc0KFEpfX1mdW5jdGlvbiBnNChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSksZzQoWCl9ZnVuY3Rpb24gVzQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxUNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoVDQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fGo0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHY0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsbTUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIHg0KFgsWixKLFkscSxRLEssVyxHLHosUCl7dmFyICQsXyxPLEMsQSxrLEksTT1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1kNShKLFosTSxHLGgpLCQ9MDskPGg7JCsrKShPPUouX19rWyRdKSE9bnVsbCYmKF89Ty5fX2khPS0xJiZNW08uX19pXXx8ZjAsTy5fX2k9JCxrPVY0KFgsTyxfLHEsUSxLLFcsRyx6LFApLEM9Ty5fX2UsTy5yZWYmJl8ucmVmIT1PLnJlZiYmKF8ucmVmJiZINChfLnJlZixudWxsLE8pLFAucHVzaChPLnJlZixPLl9fY3x8QyxPKSksQT09bnVsbCYmQyE9bnVsbCYmKEE9QyksKEk9ISEoNCZPLl9fdSkpfHxfLl9faz09PU8uX19rPyhHPWg0KE8sRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBPLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOkMmJihHPUMubmV4dFNpYmxpbmcpLE8uX191Jj0tNyk7cmV0dXJuIEouX19lPUEsR31mdW5jdGlvbiBkNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosUD1KLmxlbmd0aCwkPVAsXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWQwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1kMChkLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWQwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWY1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+UD9fLS06cTxQJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8UDtRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksZjQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gaDQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPWg0KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGY1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxQPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8UCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihQPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBiNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGg1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8YjQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8YjQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UoeTQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1ONCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP3o0OiQ0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP3o0OiQ0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUzQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1ONCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIFY0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBQLCQsXyxPLEMsQSxrLEksTSxoLEUsbixRMCxnLEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChQPUIuX19iKSYmUChaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsTT1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KFA9cy5jb250ZXh0VHlwZSkmJllbUC5fX2NdLEU9UD9oP2gucHJvcHMudmFsdWU6UC5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihNP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgYyhJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1sNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksTSYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxNJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLE89JC5wcm9wcyxDPSQuc3RhdGUsJC5fX3Y9WixfKU0mJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxNJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoTSYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1PJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxNJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKE8sQyxBKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLG49Qi5fX3IsUTA9MCxNKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsbiYmbihaKSxQPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsbiYmbihaKSxQPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrUTA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxNJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKEE9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShPLEMpKSxnPVAhPW51bGwmJlAudHlwZT09PWQmJlAua2V5PT1udWxsP2Q0KFAucHJvcHMuY2hpbGRyZW4pOlAsVz14NChYLGIwKGcpP2c6W2ddLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspRzQoUVtLMF0pO0w0KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxMNChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWE1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKFA9Qi5kaWZmZWQpJiZQKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBMNChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKEw0KSl9ZnVuY3Rpb24gbTQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKUg0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGE1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixQLCQsXyxPLEMsQSxrPUoucHJvcHN8fGYwLEk9Wi5wcm9wcyxNPVoudHlwZTtpZihNPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6TT09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoTz1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBPPT0hIU0mJihNP08ubG9jYWxOYW1lPT1NOk8ubm9kZVR5cGU9PTMpKXtYPU8sUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihNPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLE0sSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihNPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhPPVguYXR0cmlidXRlc1t6XSkubmFtZV09Ty52YWx1ZTtmb3IoeiBpbiBrKU89a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9Tzp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsTyxxKTtmb3IoeiBpbiBJKU89SVt6XSx6PT0iY2hpbGRyZW4iP189Tzp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP1A9Tzp6PT0idmFsdWUiP0M9Tzp6PT0iY2hlY2tlZCI/QT1POlcmJnR5cGVvZiBPIT0iZnVuY3Rpb24ifHxrW3pdPT09T3x8aDAoWCx6LE8sa1t6XSxxKTtpZihQKVd8fCQmJihQLl9faHRtbD09JC5fX2h0bWx8fFAuX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1QLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLHg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxNPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylHNChRW3pdKTtXfHwoej0idmFsdWUiLE09PSJwcm9ncmVzcyImJkM9PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6QyE9bnVsbCYmKEMhPT1YW3pdfHxNPT0icHJvZ3Jlc3MiJiYhQ3x8TT09Im9wdGlvbiImJkMhPWtbel0pJiZoMChYLHosQyxrW3pdLHEpLHo9ImNoZWNrZWQiLEEhPW51bGwmJkEhPVhbel0mJmgwKFgseixBLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIEg0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGY0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8SDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZmNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8RzQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGw1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLFY0KFosWD0oIVkmJkp8fFopLl9faz1XMChkLG51bGwsW1hdKSxxfHxmMCxmMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxtNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLFc0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrcDQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LFI0PTAseDU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGMucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLFc0KHRoaXMpKX0sYy5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLFc0KHRoaXMpKX0sYy5wcm90b3R5cGUucmVuZGVyPWQsUDA9W10sajQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHY0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLEs0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrSzQsVDA9Il9fYSIrSzQseTQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksTjQ9MCwkND1TNCghMSksejQ9UzQoITApLHA0PTA7dmFyIEYwLHAsUDQsYTQsUzA9MCx0ND1bXSxmPUIsbDQ9Zi5fX2IsYzQ9Zi5fX3IsaTQ9Zi5kaWZmZWQsdTQ9Zi5fX2MsbzQ9Zi51bm1vdW50LHM0PWYuX187ZnVuY3Rpb24gbzAoWCxaKXtmLl9faCYmZi5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsTzQoZTQsWCl9ZnVuY3Rpb24gTzQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOmU0KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgUD1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKFAuZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIFAuc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIE89Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxPIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgUD1RO1E9dm9pZCAwLHEoVyxHLHopLFE9UH1LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIHgoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFmLl9fcyYmbjQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gbjQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiBjNSgpe2Zvcih2YXIgWDtYPXQ0LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShBNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZi5fX2UoSixYLl9fdil9fX1mLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsbDQmJmw0KFgpfSxmLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSksczQmJnM0KFgsWil9LGYuX19yPWZ1bmN0aW9uKFgpe2M0JiZjNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKFA0PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShBNCksWi5fX2g9W10sRjA9MCkpLFA0PXB9LGYuZGlmZmVkPWZ1bmN0aW9uKFgpe2k0JiZpNChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJih0NC5wdXNoKFopIT09MSYmYTQ9PT1mLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChhND1mLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fGk1KShjNSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLFA0PXA9bnVsbH0sZi5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8QTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGYuX19lKFksSi5fX3YpfX0pLHU0JiZ1NChYLFopfSxmLnVubW91bnQ9ZnVuY3Rpb24oWCl7bzQmJm80KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmYuX19lKFosSi5fX3YpKX07dmFyIHI0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gaTUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSxyNCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3I0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBBNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gbjQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIGU1KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFg1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KFo1LnByb3RvdHlwZT1uZXcgYykuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsWjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBYNSh0aGlzLnByb3BzLFgpfHxYNSh0aGlzLnN0YXRlLFopfTt2YXIgSjU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLEo1JiZKNShYKX07dmFyIFg2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9WDYoWCxaLEosWSl9O3ZhciBZNT1CLnVubW91bnQ7ZnVuY3Rpb24gVzUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1lNSh7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gVzUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBMNShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIFU0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIE41KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxZNSYmWTUoWCl9LChVNC5wcm90b3R5cGU9bmV3IGMpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPU41KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TDUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgUDtmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtQPVkuby5wb3AoKTspUC5fX1A9VyxQLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxVNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LFU0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPVc1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGQsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChkLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIHE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBjKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPU41KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxxNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtxNShYLEosWil9KX07dmFyIFo2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLEo2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxZNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLHE2PS9bQS1aMC05XS9nLFE2PXR5cGVvZiBkb2N1bWVudDwidSIsSzY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBHNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1jLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBRNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIFE1JiYoWD1RNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIFY1LCQ2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSxLNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHxRNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fEs2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpZNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJko2LnRlc3QoSyk/Sz1LLnJlcGxhY2UocTYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIiwkNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVo2LEs1JiZLNShYKX07dmFyICQ1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpeyQ1JiYkNShYKSxWNT1YLl9fY307dmFyIHo1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksVjU9bnVsbH07ZnVuY3Rpb24gSDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIFA1KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7RzUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe0g1KFgpfX19ZnVuY3Rpb24gTTUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gQTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBPNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oTzUucHJvdG90eXBlPW5ldyBjKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxPNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIEE1KHRoaXMucHJvcHMsWCl8fEE1KHRoaXMuc3RhdGUsWil9O3ZhciBVNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksVTUmJlU1KFgpfTt2YXIgejY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1NNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9ejYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgVzY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1XNihYLFosSixZKX07dmFyIEI1PUIudW5tb3VudDtmdW5jdGlvbiBDNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPU01KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBDNShZLFosSil9KSksWH1mdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIEU1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gXzQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gdzUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLEI1JiZCNShYKX0sKF80LnByb3RvdHlwZT1uZXcgYykuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9dzUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT1FNSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBQO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO1A9WS5vLnBvcCgpOylQLl9fUD1XLFAuZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LF80LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sXzQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09QzUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZCxudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGQsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgXzU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGMpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9dzUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLF81KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope181KFgsSixaKX0pfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsTjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEc2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sVjY9L1tBLVowLTldL2csSDY9dHlwZW9mIGRvY3VtZW50PCJ1IixQNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2MucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEY1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRjUmJihYPUY1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgVDUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LEQ1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fEg2JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8UDYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkc2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmTjYudGVzdChLKT9LPUsucmVwbGFjZShWNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9TDYsRDUmJkQ1KFgpfTt2YXIgazU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7azUmJms1KFgpLFQ1PVguX19jfTt2YXIgSTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7STUmJkk1KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxUNT1udWxsfTt2YXIgTzY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1PNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEY0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsVTY9MyxCNj00LF82PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOlAsc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6Tyxjb25uZWN0aW9uUXVhbGl0eTpDfSl7bGV0IEE9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksTT13KG51bGwpLFtoLEVdPVMoITEpLFtuLFEwXT1TKG51bGwpLFtnLEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixPMF09UyhudWxsKTt4KCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFU9TFswXT8uY29udGVudFJlY3Q7aWYoVSlPMCh7d2lkdGg6VS53aWR0aCxoZWlnaHQ6VS5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7eCgoKT0+e2lmKEM9PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtDXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoTyk7di5jdXJyZW50PU8seCgoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLHgoKCk9PntpZihBJiYkKUswKCQpfSxbQSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IGk9dyhudWxsKTt4KCgpPT57aWYoIUF8fCF6KXJldHVybjtyZXR1cm4geigoVik9PntHMC5jdXJyZW50KyssZS5jdXJyZW50PURhdGUubm93KCk7bGV0IEg9SS5jdXJyZW50O2lmKEgpe2lmKGkuY3VycmVudClVUkwucmV2b2tlT2JqZWN0VVJMKGkuY3VycmVudCk7aS5jdXJyZW50PVYsSC5zcmM9Vn1pZighVC5jdXJyZW50KUUoITApLFEwKG51bGwpfSl9LFtBLHpdKTtsZXQgbT1qKChWKT0+e2lmKEEpe0s/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxVPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1VbMF09VTYsVS5zZXQoTCwxKSxILnNlbmQoVSl9LFtBLEtdKSxaMD1qKChWKT0+e2lmKEEpe0c/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxVPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1VbMF09QjYsVS5zZXQoTCwxKSxILnNlbmQoVSl9LFtBLEddKSx5PWooKFYpPT57aWYoQSl7Vz8uKFYpO3JldHVybn1sZXQgSD1NLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFU9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7VVswXT1fNixVLnNldChMLDEpLEguc2VuZChVKX0sW0EsV10pO3goKCk9PntpZihBKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChEKT0+RC5qc29uKCkpLnRoZW4oKEQpPT57aWYoRC53aWR0aD4wJiZELmhlaWdodD4wKUswKEQpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsTS5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxRMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1EwKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixVPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKTtyZXR1cm4oYXN5bmMoKT0+e3RyeXtsZXQgYj0oYXdhaXQgZmV0Y2goUix7c2lnbmFsOkwuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFiKXJldHVybjtsZXQgbz1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIi0tZnJhbWUiKTt3aGlsZSghMCl7bGV0e2RvbmU6WDAsdmFsdWU6cTB9PWF3YWl0IGIucmVhZCgpO2lmKFgwKWJyZWFrO2lmKHEwKWZvcihsZXQgUTQ9MDtRNDw9cTAubGVuZ3RoLW8ubGVuZ3RoO1E0Kyspe2xldCB3ND0hMDtmb3IobGV0IHgwPTA7eDA8by5sZW5ndGg7eDArKylpZihxMFtRNCt4MF0hPT1vW3gwXSl7dzQ9ITE7YnJlYWt9aWYodzQpRzAuY3VycmVudCsrfX19Y2F0Y2h7fX0pKCksKCk9PntMLmFib3J0KCksY2xlYXJJbnRlcnZhbChVKSxILmNsb3NlKCksTS5jdXJyZW50PW51bGx9fSxbWCxSLEFdKTtsZXQgZT13KDApO3goKCk9PntpZighQSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9ZS5jdXJyZW50O2lmKCFEfHwhVC5jdXJyZW50KXJldHVybjtpZihEYXRlLm5vdygpLUQ+VilFKCExKX0sTD1zZXRJbnRlcnZhbCgoKT0+e3YwKEcwLmN1cnJlbnQpLEcwLmN1cnJlbnQ9MCxIKCl9LDEwMDApLFU9KCk9PntpZighZG9jdW1lbnQuaGlkZGVuKUgoKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLFUpLCgpPT57Y2xlYXJJbnRlcnZhbChMKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixVKX19LFtBXSk7bGV0IGE9aigoKT0+e3JldHVybiBBP0kuY3VycmVudDprLmN1cnJlbnR9LFtBXSksVjA9aigoVixIKT0+e2xldCBMPWEoKTtpZighTClyZXR1cm47bGV0IFU9TC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxEPShILmNsaWVudFgtVS5sZWZ0KS9VLndpZHRoLGI9KEguY2xpZW50WS1VLnRvcCkvVS5oZWlnaHQ7bSh7dHlwZTpWLHg6RCx5OmJ9KX0sW21dKSxKMD0zLGw9dyghMSksdT13KCExKSxVMD13KCExKSxNMD13KHtkeDowLGR5OjB9KSxDMD13KCExKSxbWTQsazRdPVMoITEpLEk0PXcoe3g6MC41LHk6MC41fSksW0gwLFkwXT1TKG51bGwpO3goKCk9PntsZXQgVj0oTCk9PntpZihMLmtleT09PSJBbHQiKWs0KCEwKX0sSD0oTCk9PntpZihMLmtleT09PSJBbHQiKXtpZihrNCghMSksIXUuY3VycmVudClZMChudWxsKX19O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixIKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixWKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLEgpfX0sW10pLHgoKCk9PntpZihZNCYmIXUuY3VycmVudCl7bGV0IFY9STQuY3VycmVudDtZMCh7eDE6Vi54LHkxOlYueSx4MjoxLVYueCx5MjoxLVYueX0pfWVsc2UgaWYoIVk0JiYhdS5jdXJyZW50KVkwKG51bGwpfSxbWTRdKTtsZXQgeTA9dyhudWxsKSxxND13KCExKSxFMD13KDApLE00PWooKFYsSCk9PntxNC5jdXJyZW50PSEwO2xldCBMPXkwLmN1cnJlbnQ7aWYoTCljYW5jZWxBbmltYXRpb25GcmFtZShFMC5jdXJyZW50KSxFMC5jdXJyZW50PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e0wuc3R5bGUubGVmdD1gJHtWKjEwMH0lYCxMLnN0eWxlLnRvcD1gJHtIKjEwMH0lYCxMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0pfSxbXSksQzQ9aigoVixIKT0+e2lmKCFxNC5jdXJyZW50KXJldHVybjtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWB9KX0sW10pLHAwPWooKCk9PntxNC5jdXJyZW50PSExO2xldCBWPXkwLmN1cnJlbnQ7aWYoViljYW5jZWxBbmltYXRpb25GcmFtZShFMC5jdXJyZW50KSxWLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxbXSksRTQ9dygwKSx3MD13KG51bGwpLGc1PWooKCk9PntsZXQgVj1EYXRlLm5vdygpLEg9Vi1FNC5jdXJyZW50O2lmKEU0LmN1cnJlbnQ9VixIPDMwMCl7aWYodzAuY3VycmVudCljbGVhclRpbWVvdXQodzAuY3VycmVudCksdzAuY3VycmVudD1udWxsO2lmKFEpUSgpO2Vsc2UgWjAoImFwcF9zd2l0Y2hlciIpfWVsc2UgdzAuY3VycmVudD1zZXRUaW1lb3V0KCgpPT57aWYoUSlRKCk7ZWxzZSBaMCgiaG9tZSIpO3cwLmN1cnJlbnQ9bnVsbH0sMzAwKX0sW1owLFFdKSxnMD0oKCk9PntpZighZ3x8IXIpcmV0dXJuIG51bGw7aWYoci53aWR0aD09PTB8fHIuaGVpZ2h0PT09MClyZXR1cm4gbnVsbDtsZXQgVj1NYXRoLm1pbihyLndpZHRoL2cud2lkdGgsci5oZWlnaHQvZy5oZWlnaHQpO3JldHVybnt3aWR0aDpnLndpZHRoKlYsaGVpZ2h0OmcuaGVpZ2h0KlZ9fSkoKTtyZXR1cm4gTigiZGl2Iix7c3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIsZmxleDoxLC4uLl8/e306e2JvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMikifSxvdmVyZmxvdzoiaGlkZGVuIixtaW5XaWR0aDowLG1pbkhlaWdodDowLC4uLkp9LGNsYXNzTmFtZTpxLGNoaWxkcmVuOltOKCJkaXYiLHtyZWY6cyxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsbWluSGVpZ2h0OjAsbWluV2lkdGg6MCxkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIifSxjaGlsZHJlbjpOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIix3aWR0aDpnMD9gJHtnMC53aWR0aH1weGA6IjEwMCUiLGhlaWdodDpnMD9gJHtnMC5oZWlnaHR9cHhgOiIxMDAlIn0sY2hpbGRyZW46W04oImltZyIse3JlZjprLHNyYzpBP3ZvaWQgMDpSLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOkE/e2Rpc3BsYXk6Im5vbmUifTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLGN1cnNvcjpGNCxkaXNwbGF5OiJibG9jayIsdXNlclNlbGVjdDoibm9uZSIsV2Via2l0VXNlclNlbGVjdDoibm9uZSIsdG91Y2hBY3Rpb246Im5vbmUiLC4uLll9fSksQSYmTigiaW1nIix7cmVmOkksZHJhZ2dhYmxlOiExLG9uTG9hZDooVik9PntsZXQgSD1WLmN1cnJlbnRUYXJnZXQ7aWYoSC5uYXR1cmFsV2lkdGg+MCYmSC5uYXR1cmFsSGVpZ2h0PjApSzAoKEwpPT5MJiZMLndpZHRoPT09SC5uYXR1cmFsV2lkdGgmJkwuaGVpZ2h0PT09SC5uYXR1cmFsSGVpZ2h0P0w6e3dpZHRoOkgubmF0dXJhbFdpZHRoLGhlaWdodDpILm5hdHVyYWxIZWlnaHR9KX0sc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RjQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLE4oImRpdiIse3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsY3Vyc29yOkY0LHRvdWNoQWN0aW9uOiJub25lIn0sb25Nb3VzZURvd246KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxVPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoVi5hbHRLZXkpe3UuY3VycmVudD0hMCxVMC5jdXJyZW50PVYuc2hpZnRLZXk7bGV0IGI9e3gxOlUseTE6RCx4MjoxLVUseTI6MS1EfTtNMC5jdXJyZW50PXtkeDoxLVUtVSxkeToxLUQtRH0sWTAoYikseSh7dHlwZToiYmVnaW4iLC4uLmJ9KTtyZXR1cm59aWYoTTQoVSxEKSxEPjAuODgpbC5jdXJyZW50PSEwLG0oe3R5cGU6ImJlZ2luIix4OlUseTpELGVkZ2U6SjB9KTtlbHNlIGwuY3VycmVudD0hMSxWMCgiYmVnaW4iLFYpfSxvbk1vdXNlTW92ZTooVik9PntsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksVT0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEk0LmN1cnJlbnQ9e3g6VSx5OkR9LFYuYnV0dG9ucz09PTApe2lmKFYuYWx0S2V5KVkwKHt4MTpVLHkxOkQseDI6MS1VLHkyOjEtRH0pO3JldHVybn1pZih1LmN1cnJlbnQpe2xldCBiO2lmKFUwLmN1cnJlbnQpe2xldCBvPU0wLmN1cnJlbnQ7Yj17eDE6VSx5MTpELHgyOlUrby5keCx5MjpEK28uZHl9fWVsc2UgYj17eDE6VSx5MTpELHgyOjEtVSx5MjoxLUR9O1kwKGIpLHkoe3R5cGU6Im1vdmUiLC4uLmJ9KTtyZXR1cm59aWYoQzQoVSxEKSxsLmN1cnJlbnQpbSh7dHlwZToibW92ZSIseDpVLHk6RCxlZGdlOkowfSk7ZWxzZSBWMCgibW92ZSIsVil9LG9uTW91c2VVcDooVik9PntpZih1LmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFU9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihVMC5jdXJyZW50KXtsZXQgYj1NMC5jdXJyZW50O3koe3R5cGU6ImVuZCIseDE6VSx5MTpELHgyOlUrYi5keCx5MjpEK2IuZHl9KX1lbHNlIHkoe3R5cGU6ImVuZCIseDE6VSx5MTpELHgyOjEtVSx5MjoxLUR9KX1pZih1LmN1cnJlbnQ9ITEsIVYuYWx0S2V5KVkwKG51bGwpO3JldHVybn1pZihwMCgpLGwuY3VycmVudCl7bGV0IEg9YSgpO2lmKEgpe2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksVT0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O20oe3R5cGU6ImVuZCIseDpVLHk6RCxlZGdlOkowfSl9bC5jdXJyZW50PSExO3JldHVybn1WMCgiZW5kIixWKX0sb25Nb3VzZUxlYXZlOihWKT0+e2lmKHUuY3VycmVudCl7aWYoSDApeSh7dHlwZToiZW5kIiwuLi5IMH0pO3UuY3VycmVudD0hMSxZMChudWxsKTtyZXR1cm59aWYocDAoKSxsLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFU9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6VSx5OkQsZWRnZTpKMH0pfWwuY3VycmVudD0hMTtyZXR1cm59aWYoVi5idXR0b25zPjApVjAoImVuZCIsVik7WTAobnVsbCl9LG9uVG91Y2hTdGFydDooVik9PntWLnByZXZlbnREZWZhdWx0KCk7bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKFYudG91Y2hlcy5sZW5ndGg+PTIpe3AwKCk7bGV0IG89Vi50b3VjaGVzWzBdLFgwPVYudG91Y2hlc1sxXSxxMD17eDE6KG8uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KG8uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KFgwLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihYMC5jbGllbnRZLUwudG9wKS9MLmhlaWdodH07aWYoIUMwLmN1cnJlbnQmJiFsLmN1cnJlbnQpbSh7dHlwZToiZW5kIix4OnEwLngxLHk6cTAueTF9KTtDMC5jdXJyZW50PSEwLHUuY3VycmVudD0hMCxsLmN1cnJlbnQ9ITEsWTAocTApLHkoe3R5cGU6ImJlZ2luIiwuLi5xMH0pO3JldHVybn1sZXQgVT1WLnRvdWNoZXNbMF07aWYoIVUpcmV0dXJuO2xldCBEPShVLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLGI9KFUuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoTTQoRCxiKSxiPjAuODgpbC5jdXJyZW50PSEwLG0oe3R5cGU6ImJlZ2luIix4OkQseTpiLGVkZ2U6SjB9KTtlbHNlIGwuY3VycmVudD0hMSxtKHt0eXBlOiJiZWdpbiIseDpELHk6Yn0pfSxvblRvdWNoTW92ZTooVik9PntWLnByZXZlbnREZWZhdWx0KCk7bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKEMwLmN1cnJlbnQmJlYudG91Y2hlcy5sZW5ndGg+PTIpe2xldCBvPVYudG91Y2hlc1swXSxYMD1WLnRvdWNoZXNbMV0scTA9e3gxOihvLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihvLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihYMC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCx5MjooWDAuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O1kwKHEwKSx5KHt0eXBlOiJtb3ZlIiwuLi5xMH0pO3JldHVybn1sZXQgVT1WLnRvdWNoZXNbMF07aWYoIVUpcmV0dXJuO2xldCBEPShVLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLGI9KFUuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQzQoRCxiKSxsLmN1cnJlbnQpbSh7dHlwZToibW92ZSIseDpELHk6YixlZGdlOkowfSk7ZWxzZSBtKHt0eXBlOiJtb3ZlIix4OkQseTpifSl9LG9uVG91Y2hFbmQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50KXtpZihWLnRvdWNoZXMubGVuZ3RoPDIpe2xldCBvPVYuY2hhbmdlZFRvdWNoZXNbMF0sWDA9SDA7aWYobyYmWDApeSh7dHlwZToiZW5kIix4MTooby5jbGllbnRYLUwubGVmdCkvTC53aWR0aCx5MTooby5jbGllbnRZLUwudG9wKS9MLmhlaWdodCx4MjpYMC54Mix5MjpYMC55Mn0pO2Vsc2UgaWYoWDApeSh7dHlwZToiZW5kIiwuLi5YMH0pO0MwLmN1cnJlbnQ9ITEsdS5jdXJyZW50PSExLFkwKG51bGwpfXJldHVybn1sZXQgVT1WLmNoYW5nZWRUb3VjaGVzWzBdO2lmKCFVKXJldHVybjtsZXQgRD0oVS5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShVLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKHAwKCksbC5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpELHk6YixlZGdlOkowfSksbC5jdXJyZW50PSExO2Vsc2UgbSh7dHlwZToiZW5kIix4OkQseTpifSl9fSksTigiZGl2Iix7cmVmOnkwLCJkYXRhLXRlc3RpZCI6InRvdWNoLWluZGljYXRvciIsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsZGlzcGxheToibm9uZSIsd2lkdGg6MjQsaGVpZ2h0OjI0LGJvcmRlclJhZGl1czoiNTAlIixiYWNrZ3JvdW5kOiJyZ2JhKDU5LDEzMCwyNDYsMC41KSIsYm94U2hhZG93OiIwIDAgOHB4IHJnYmEoNTksMTMwLDI0NiwwLjMpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fSksSDAmJk4oZCx7Y2hpbGRyZW46W04oImRpdiIseyJkYXRhLXRlc3RpZCI6ImZpbmdlci1kb3QiLHN0eWxlOlI1KEgwLngxLEgwLnkxKX0pLE4oImRpdiIseyJkYXRhLXRlc3RpZCI6ImZpbmdlci1kb3QiLHN0eWxlOlI1KEgwLngyLEgwLnkyKX0pXX0pLCFoJiYhbiYmTigiZGl2Iix7c3R5bGU6YjUsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiIzg4OCIsZm9udFNpemU6MTR9LGNoaWxkcmVuOiJDb25uZWN0aW5nLi4uIn0pfSksbiYmTigiZGl2Iix7c3R5bGU6YjUsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2Y0NCIsZm9udFNpemU6MTQscGFkZGluZzoyMCx0ZXh0QWxpZ246ImNlbnRlciJ9LGNoaWxkcmVuOm59KX0pLEo0JiZOKCJkaXYiLHtzdHlsZTpGNixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjZmJiZjI0Iixmb250U2l6ZToxMyxmb250RmFtaWx5OiJtb25vc3BhY2UifSxjaGlsZHJlbjoiU2xvdyBjb25uZWN0aW9uIn0pfSldfSl9KSwhXyYmTigiZGl2Iix7c3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6InNwYWNlLWJldHdlZW4iLHBhZGRpbmc6IjRweCA4cHgiLGJvcmRlclRvcDoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMikifSxjaGlsZHJlbjpbTigiYnV0dG9uIix7b25DbGljazpnNSxzdHlsZTp7YmFja2dyb3VuZDoibm9uZSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjIpIixjb2xvcjoiI2FhYSIsZm9udFNpemU6MTEsZm9udEZhbWlseToibW9ub3NwYWNlIixwYWRkaW5nOiIycHggMTBweCIsY3Vyc29yOiJwb2ludGVyIixib3JkZXJSYWRpdXM6NH0sY2hpbGRyZW46IkhvbWUifSksTigic3BhbiIse3N0eWxlOntjb2xvcjpqMD4wPyIjNGY0IjoiIzg4OCIsZm9udFNpemU6MTIsZm9udEZhbWlseToibW9ub3NwYWNlIixkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo2fSxjaGlsZHJlbjpbQyYmTigic3BhbiIseyJkYXRhLXRlc3RpZCI6InF1YWxpdHktZG90IixzdHlsZTp7d2lkdGg6OCxoZWlnaHQ6OCxib3JkZXJSYWRpdXM6IjUwJSIsZGlzcGxheToiaW5saW5lLWJsb2NrIixiYWNrZ3JvdW5kOkM9PT0iZ29vZCI/IiM0YWRlODAiOkM9PT0iZGVncmFkZWQiPyIjZmFjYzE1IjoiI2VmNDQ0NCJ9fSksajAsIiBmcHMiXX0pXX0pXX0pfXZhciBGNj17cG9zaXRpb246ImFic29sdXRlIix0b3A6OCxsZWZ0OiI1MCUiLHRyYW5zZm9ybToidHJhbnNsYXRlWCgtNTAlKSIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjcpIixib3JkZXJSYWRpdXM6NixwYWRkaW5nOiI0cHggMTJweCIscG9pbnRlckV2ZW50czoibm9uZSJ9LGI1PXtwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDAuOCkifSxTNT0yMDtmdW5jdGlvbiBSNShYLFope3JldHVybntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6YCR7WCoxMDB9JWAsdG9wOmAke1oqMTAwfSVgLHdpZHRoOlM1LGhlaWdodDpTNSxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjQpIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuNykiLHRyYW5zZm9ybToidHJhbnNsYXRlKC01MCUsIC01MCUpIixwb2ludGVyRXZlbnRzOiJub25lIn19ZnVuY3Rpb24gazAoWCl7aWYoIVgpcmV0dXJuImlwaG9uZSI7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouaW5jbHVkZXMoImlwYWQiKSlyZXR1cm4iaXBhZCI7aWYoWi5pbmNsdWRlcygid2F0Y2giKSlyZXR1cm4id2F0Y2giO2lmKFouaW5jbHVkZXMoInZpc2lvbiIpKXJldHVybiJ2aXNpb24iO3JldHVybiJpcGhvbmUifXZhciAkMD17aXBob25lOnt3aWR0aDo0MjcsaGVpZ2h0Ojg4MSxiZXplbFg6MTgsYmV6ZWxZOjE4LGlubmVyUmFkaXVzOjU1fSxpcGFkOnt3aWR0aDo0MzAsaGVpZ2h0OjYwNSxiZXplbFg6MTYsYmV6ZWxZOjE2LGlubmVyUmFkaXVzOjEyfSx3YXRjaDp7d2lkdGg6Mjc0LGhlaWdodDozMjIsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czo3OX0sdmlzaW9uOnt3aWR0aDo2NDAsaGVpZ2h0OjQwMCxiZXplbFg6MTIsYmV6ZWxZOjEyLGlubmVyUmFkaXVzOjMyfX0sdzc9JDAuaXBob25lLndpZHRoLFQ3PSQwLmlwaG9uZS5oZWlnaHQsYjc9JDAuaXBob25lLmJlemVsWCxTNz0kMC5pcGhvbmUuYmV6ZWxZLFI3PSQwLmlwaG9uZS5pbm5lclJhZGl1cztmdW5jdGlvbiBlMChYPSJpcGhvbmUiKXtsZXQgWj0kMFtYXSxKPVoud2lkdGgtMipaLmJlemVsWCxZPVouaGVpZ2h0LTIqWi5iZXplbFk7cmV0dXJuYCR7Wi5pbm5lclJhZGl1cy9KKjEwMH0lIC8gJHtaLmlubmVyUmFkaXVzL1kqMTAwfSVgfXZhciBEND1fMChudWxsKTtmdW5jdGlvbiBYNChYKXtsZXQgWj1SMChENCk7aWYoIVopdGhyb3cgRXJyb3IoYDxTaW11bGF0b3JUb29sYmFyLiR7WH0+IG11c3QgYmUgcmVuZGVyZWQgaW5zaWRlIDxTaW11bGF0b3JUb29sYmFyPmApO3JldHVybiBafXZhciBDNj17ZGlzcGxheToiZmxleCIsZmxleFdyYXA6IndyYXAiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6InNwYWNlLWJldHdlZW4iLGdhcDoiNHB4IDEycHgiLHBhZGRpbmc6IjhweCAxMnB4Iixib3JkZXJSYWRpdXM6MjQsYmFja2dyb3VuZDoiIzFjMWMxZSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEpIixib3hTaGFkb3c6IjAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMikiLG1pbldpZHRoOjI0MCx3aWR0aDoiMTAwJSJ9O2Z1bmN0aW9uIEU2KHtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksc3RyZWFtaW5nOnE9ITEsZGlzYWJsZWQ6UT0hMSxjaGlsZHJlbjpLLHN0eWxlOlcsLi4uR30pe2xldCB6PWswKEopLCQ9e2V4ZWM6WCxkZXZpY2VVZGlkOlosZGV2aWNlTmFtZTpKLGRldmljZVJ1bnRpbWU6WSxkZXZpY2VUeXBlOnosc3RyZWFtaW5nOnEsZGlzYWJsZWQ6UXx8IVp8fCFxfTtyZXR1cm4gTihENC5Qcm92aWRlcix7dmFsdWU6JCxjaGlsZHJlbjpOKCJkaXYiLHsiZGF0YS1zaW11bGF0b3ItdG9vbGJhciI6ITAsc3R5bGU6ey4uLkM2LC4uLld9LC4uLkcsY2hpbGRyZW46S30pfSl9dmFyIHc2PXtkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImZsZXgtc3RhcnQiLHRleHRBbGlnbjoibGVmdCIsYmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGJvcmRlcjoibm9uZSIsY29sb3I6IiNmZmYiLHBhZGRpbmc6IjJweCA0cHgiLG1hcmdpbjoiLTJweCAtNHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLG1pbldpZHRoOjAsbWF4V2lkdGg6IjEwMCUiLGxpbmVIZWlnaHQ6MS4yLGZvbnRGYW1pbHk6ImluaGVyaXQifSxUNj1EMChmdW5jdGlvbih7bmFtZTpaLHN1YnRpdGxlOkosaGlkZUNoZXZyb246WSxzdHlsZTpxLG9uTW91c2VFbnRlcjpRLG9uTW91c2VMZWF2ZTpLLC4uLld9LEcpe2xldCB6PVg0KCJUaXRsZSIpLFtQLCRdPVMoITEpLF89Wj8/ei5kZXZpY2VOYW1lPz8iTm8gc2ltdWxhdG9yIixPPUo/Pyh6LmRldmljZVJ1bnRpbWU/ei5kZXZpY2VSdW50aW1lLnJlcGxhY2UoL1wuLywiICIpOiLigJQiKTtyZXR1cm4gTigiYnV0dG9uIix7cmVmOkcsdHlwZToiYnV0dG9uIiwiZGF0YS1zaW11bGF0b3ItdG9vbGJhci10aXRsZSI6ITAsb25Nb3VzZUVudGVyOihDKT0+eyQoITApLFE/LihDKX0sb25Nb3VzZUxlYXZlOihDKT0+eyQoITEpLEs/LihDKX0sc3R5bGU6ey4uLnc2LGJhY2tncm91bmQ6UD8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLC4uLnF9LC4uLlcsY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp7ZGlzcGxheToiaW5saW5lLWZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZm9udFNpemU6MTIsZm9udFdlaWdodDo2MDAsY29sb3I6IiNmZmYiLG1heFdpZHRoOiIxMDAlIixvdmVyZmxvdzoiaGlkZGVuIix0ZXh0T3ZlcmZsb3c6ImVsbGlwc2lzIix3aGl0ZVNwYWNlOiJub3dyYXAifSxjaGlsZHJlbjpbXywhWSYmTigic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMi41IixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixzdHlsZTp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsZmxleFNocmluazowfSxjaGlsZHJlbjpOKCJwb2x5bGluZSIse3BvaW50czoiNiA5IDEyIDE1IDE4IDkifSl9KV19KSxOKCJzcGFuIix7c3R5bGU6e2ZvbnRTaXplOjEwLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNSkiLG1heFdpZHRoOiIxMDAlIixvdmVyZmxvdzoiaGlkZGVuIix0ZXh0T3ZlcmZsb3c6ImVsbGlwc2lzIix3aGl0ZVNwYWNlOiJub3dyYXAifSxjaGlsZHJlbjpPfSldfSl9KSxiNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6NCxmbGV4U2hyaW5rOjB9O2Z1bmN0aW9uIFM2KHtzdHlsZTpYLC4uLlp9KXtyZXR1cm4gTigiZGl2Iix7c3R5bGU6ey4uLmI2LC4uLlh9LC4uLlp9KX12YXIgUjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLHBhZGRpbmc6Nixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLGRpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuOCkiLHRyYW5zaXRpb246ImJhY2tncm91bmQtY29sb3IgMC4xNXMsIGNvbG9yIDAuMTVzIn0sWjQ9RDAoZnVuY3Rpb24oe2ZvcmNlRGlzYWJsZWQ6WixzdHlsZTpKLGRpc2FibGVkOlksb25Nb3VzZUVudGVyOnEsb25Nb3VzZUxlYXZlOlEsY2hpbGRyZW46SywuLi5XfSxHKXtsZXQgej1SMChENCksUD1ZfHxafHx6Py5kaXNhYmxlZCxbJCxfXT1TKCExKTtyZXR1cm4gTigiYnV0dG9uIix7cmVmOkcsdHlwZToiYnV0dG9uIixkaXNhYmxlZDpQLG9uTW91c2VFbnRlcjooTyk9PntfKCEwKSxxPy4oTyl9LG9uTW91c2VMZWF2ZTooTyk9PntfKCExKSxRPy4oTyl9LHN0eWxlOnsuLi5SNixjb2xvcjpQPyJyZ2JhKDI1NSwyNTUsMjU1LDAuMjUpIjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIixiYWNrZ3JvdW5kOiQmJiFQPyJyZ2JhKDI1NSwyNTUsMjU1LDAuMSkiOiJ0cmFuc3BhcmVudCIsY3Vyc29yOlA/Im5vdC1hbGxvd2VkIjoicG9pbnRlciIsLi4uSn0sLi4uVyxjaGlsZHJlbjpLfSl9KTtmdW5jdGlvbiBqNigpe3JldHVyblsndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIHNldCBmcm9udG1vc3QgdG8gdHJ1ZScsJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBwZXJmb3JtIGFjdGlvbiAiQVhSYWlzZSIgb2YgKGZpcnN0IHdpbmRvdyB3aG9zZSBuYW1lIGNvbnRhaW5zICJ3YXRjaE9TIiknLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gY2xpY2sgbWVudSBpdGVtICJIb21lIiBvZiBtZW51ICJEZXZpY2UiIG9mIG1lbnUgYmFyIGl0ZW0gIkRldmljZSIgb2YgbWVudSBiYXIgMSddLm1hcCgoWik9PmAtZSAnJHtafSdgKS5yZWR1Y2UoKFosSik9PmAke1p9ICR7Sn1gLCJvc2FzY3JpcHQiKX12YXIgdjY9Tigic3ZnIix7d2lkdGg6IjE4IixoZWlnaHQ6IjE4Iix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0zIDEwLjUgMTIgM2w5IDcuNVYyMGExIDEgMCAwIDEtMSAxaC01di03aC02djdINGExIDEgMCAwIDEtMS0xeiJ9KX0pLHk2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTE0LjUgNGgtNUw3IDdINGEyIDIgMCAwIDAtMiAydjlhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0yVjlhMiAyIDAgMCAwLTItMmgtM3oifSksTigiY2lyY2xlIix7Y3g6IjEyIixjeToiMTMiLHI6IjQifSldfSkscDY9Tigic3ZnIix7d2lkdGg6IjE4IixoZWlnaHQ6IjE4Iix2aWV3Qm94OiIwIDAgMTIgMTMiLGZpbGw6ImN1cnJlbnRDb2xvciIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpOKCJwYXRoIix7ZDoiTTEwLjIzMDUgMTIuODA3N0g0LjQyMzgzQzMuOTIzODMgMTIuODA3NyAzLjU0Njg4IDEyLjY4NDYgMy4yOTI5NyAxMi40Mzg1QzMuMDQyOTcgMTIuMTk2MyAyLjkxNzk3IDExLjgxOTQgMi45MTc5NyAxMS4zMDc3VjUuNTEyNzRDMi45MTc5NyA0Ljk5NzExIDMuMDQyOTcgNC42MTgyMSAzLjI5Mjk3IDQuMzc2MDJDMy41NDY4OCA0LjEyOTkzIDMuOTIzODMgNC4wMDY4OCA0LjQyMzgzIDQuMDA2ODhIMTAuMjMwNUMxMC43MzQ0IDQuMDA2ODggMTEuMTExMyA0LjEyOTkzIDExLjM2MTMgNC4zNzYwMkMxMS42MTEzIDQuNjE4MjEgMTEuNzM2MyA0Ljk5NzExIDExLjczNjMgNS41MTI3NFYxMS4zMDc3QzExLjczNjMgMTEuODE5NCAxMS42MTEzIDEyLjE5NjMgMTEuMzYxMyAxMi40Mzg1QzExLjExMTMgMTIuNjg0NiAxMC43MzQ0IDEyLjgwNzcgMTAuMjMwNSAxMi44MDc3Wk0xMC4yMTI5IDExLjg2NDNDMTAuNDE2IDExLjg2NDMgMTAuNTYyNSAxMS44MTk0IDEwLjY1MjMgMTEuNzI5NUMxMC43NDYxIDExLjY0MzYgMTAuNzkzIDExLjQ5NzEgMTAuNzkzIDExLjI5MDFWNS41MjQ0NkMxMC43OTMgNS4zMTc0MyAxMC43NDYxIDUuMTcwOTQgMTAuNjUyMyA1LjA4NTAxQzEwLjU2MjUgNC45OTUxNiAxMC40MTYgNC45NTAyNCAxMC4yMTI5IDQuOTUwMjRINC40NDE0MUM0LjI0MjE5IDQuOTUwMjQgNC4wOTU3IDQuOTk1MTYgNC4wMDE5NSA1LjA4NTAxQzMuOTA4MiA1LjE3MDk0IDMuODYxMzMgNS4zMTc0MyAzLjg2MTMzIDUuNTI0NDZWMTEuMjkwMUMzLjg2MTMzIDExLjQ5NzEgMy45MDgyIDExLjY0MzYgNC4wMDE5NSAxMS43Mjk1QzQuMDk1NyAxMS44MTk0IDQuMjQyMTkgMTEuODY0MyA0LjQ0MTQxIDExLjg2NDNIMTAuMjEyOVpNMi45MTc5NyAyLjU4MzA1VjAuNDE1MDgzQzIuOTE3OTcgMC4yMDAyNCAyLjk4NjMzIDAuMDY5MzgwMyAzLjEyMzA1IDAuMDIyNTA1M0MzLjI1OTc3IC0wLjAyODI3NTkgMy40MTAxNiAwLjAwNjg4MDMzIDMuNTc0MjIgMC4xMjc5NzRMNS4wNTA3OCAxLjIxMTk2QzUuMTc1NzggMS4zMDU3MSA1LjIzODI4IDEuNDAxNDEgNS4yMzgyOCAxLjQ5OTA3QzUuMjM4MjggMS41OTY3MiA1LjE3NTc4IDEuNjkyNDMgNS4wNTA3OCAxLjc4NjE4TDMuNTc0MjIgMi44NjQzQzMuNDEwMTYgMi45ODU0IDMuMjU5NzcgMy4wMjI1MSAzLjEyMzA1IDIuOTc1NjNDMi45ODYzMyAyLjkyNDg1IDIuOTE3OTcgMi43OTM5OSAyLjkxNzk3IDIuNTgzMDVaTTMuNTMzMiAxLjE1MzM2QzMuNjI2OTUgMS4xNTMzNiAzLjcwNzAzIDEuMTg2NTcgMy43NzM0NCAxLjI1Mjk3QzMuODQzNzUgMS4zMTkzOCAzLjg3ODkxIDEuMzk3NTEgMy44Nzg5MSAxLjQ4NzM1QzMuODc4OTEgMS41ODExIDMuODQzNzUgMS42NjMxMyAzLjc3MzQ0IDEuNzMzNDRDMy43MDcwMyAxLjc5OTg1IDMuNjI2OTUgMS44MzMwNSAzLjUzMzIgMS44MzMwNUgyLjgwNjY0QzIuMzgwODYgMS44MzMwNSAyLjAxMTcyIDEuOTI0ODUgMS42OTkyMiAyLjEwODQ0QzEuMzkwNjIgMi4yODgxMyAxLjE1MjM0IDIuNTM4MTMgMC45ODQzNzUgMi44NTg0NEMwLjgxNjQwNiAzLjE3ODc2IDAuNzMyNDIyIDMuNTQ1OTQgMC43MzI0MjIgMy45NjAwMVY0LjgzODkxQzAuNzMyNDIyIDQuOTM2NTcgMC42OTcyNjYgNS4wMjI1MSAwLjYyNjk1MyA1LjA5NjcyQzAuNTUyNzM0IDUuMTY3MDQgMC40NjQ4NDQgNS4yMDIxOSAwLjM2MzI4MSA1LjIwMjE5QzAuMjY1NjI1IDUuMjAyMTkgMC4xODE2NDEgNS4xNjcwNCAwLjExMTMyOCA1LjA5NjcyQzAuMDM3MTA5NCA1LjAyMjUxIDAgNC45MzY1NyAwIDQuODM4OTFWMy45NjAwMUMwIDMuNDAxNDEgMC4xMTcxODggMi45MTExOCAwLjM1MTU2MiAyLjQ4OTNDMC41ODIwMzEgMi4wNjc0MyAwLjkwODIwMyAxLjczOTMgMS4zMzAwOCAxLjUwNDkzQzEuNzQ4MDUgMS4yNzA1NSAyLjIzODI4IDEuMTUzMzYgMi44MDA3OCAxLjE1MzM2SDMuNTMzMloifSl9KSxnNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJIb21lQnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiSG9tZSIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVR5cGU9PT0id2F0Y2giKXEuZXhlYyhqNigpKTtlbHNlIHEuZXhlYygic2VydmUtc2ltIGJ1dHRvbiBob21lIil9LC4uLkosY2hpbGRyZW46djZ9KX0pLHg2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlNjcmVlbnNob3RCdXR0b24iKTtyZXR1cm4gTihaNCx7cmVmOlksImFyaWEtbGFiZWwiOiJTY3JlZW5zaG90IixvbkNsaWNrOihRKT0+e2lmKFo/LihRKSxRLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2lmKHEuZGV2aWNlVWRpZClxLmV4ZWMoYHhjcnVuIHNpbWN0bCBpbyAke3EuZGV2aWNlVWRpZH0gc2NyZWVuc2hvdCB+L0Rlc2t0b3AvaGF0Y2gtc2NyZWVuc2hvdC0kKGRhdGUgKyVzKS5wbmdgKX0sLi4uSixjaGlsZHJlbjp5Nn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiUm90YXRlQnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiUm90YXRlIGRldmljZSIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGBvc2FzY3JpcHQgLWUgJ3RlbGwgYXBwbGljYXRpb24gIlNpbXVsYXRvciIgdG8gYWN0aXZhdGUnIC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byBrZXkgY29kZSAxMjQgdXNpbmcge2NvbW1hbmQgZG93bn0nYCl9LC4uLkosY2hpbGRyZW46cDZ9KX0pLHQ9RTY7dC5UaXRsZT1UNjt0LkFjdGlvbnM9UzY7dC5CdXR0b249WjQ7dC5Ib21lQnV0dG9uPWc2O3QuU2NyZWVuc2hvdEJ1dHRvbj14Njt0LlJvdGF0ZUJ1dHRvbj1oNjtmdW5jdGlvbiBtNihYKXtsZXRbWixKXT1TKG51bGwpLFk9dyhuZXcgU2V0KSxbcSxRXT1TKG51bGwpLEs9aigoVyk9PntyZXR1cm4gWS5jdXJyZW50LmFkZChXKSwoKT0+e1kuY3VycmVudC5kZWxldGUoVyl9fSxbXSk7cmV0dXJuIHgoKCk9PntpZighWClyZXR1cm47bGV0IFc9bmV3IEFib3J0Q29udHJvbGxlcixHPVgucmVwbGFjZSgvXC9zdHJlYW1cLm1qcGVnJC8sIiIpO3JldHVybiBmZXRjaChgJHtHfS9jb25maWdgLHtzaWduYWw6Vy5zaWduYWx9KS50aGVuKCh6KT0+ei5qc29uKCkpLnRoZW4oKHopPT57aWYoei53aWR0aD4wJiZ6LmhlaWdodD4wKUooeil9KS5jYXRjaCgoKT0+e30pLChhc3luYygpPT57dHJ5e2xldCBQPShhd2FpdCBmZXRjaChYLHtzaWduYWw6Vy5zaWduYWx9KSkuYm9keT8uZ2V0UmVhZGVyKCk7aWYoIVApcmV0dXJuO2xldCAkPW5ldyBVaW50OEFycmF5KDApO3doaWxlKCEwKXtsZXR7ZG9uZTpfLHZhbHVlOk99PWF3YWl0IFAucmVhZCgpO2lmKF8pYnJlYWs7bGV0IEM9bmV3IFVpbnQ4QXJyYXkoJC5sZW5ndGgrTy5sZW5ndGgpO0Muc2V0KCQpLEMuc2V0KE8sJC5sZW5ndGgpLCQ9Qzt3aGlsZSghMCl7bGV0IEE9LTE7Zm9yKGxldCBFPTA7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTYpe0E9RTticmVha31pZihBPT09LTEpYnJlYWs7bGV0IGs9LTE7Zm9yKGxldCBFPUErMjtFPCQubGVuZ3RoLTE7RSsrKWlmKCRbRV09PT0yNTUmJiRbRSsxXT09PTIxNyl7az1FKzI7YnJlYWt9aWYoaz09PS0xKWJyZWFrO2xldCBJPSQuc2xpY2UoQSxrKTskPSQuc2xpY2Uoayk7bGV0IE09bmV3IEJsb2IoW0ldLHt0eXBlOiJpbWFnZS9qcGVnIn0pLGg9VVJMLmNyZWF0ZU9iamVjdFVSTChNKTtRKGgpO2ZvcihsZXQgRSBvZiBZLmN1cnJlbnQpRShoKX19fWNhdGNoe319KSgpLCgpPT5XLmFib3J0KCl9LFtYXSkse3N1YnNjcmliZUZyYW1lOkssZnJhbWU6cSxjb25maWc6Wn19dmFyIGQ2PXtLZXlBOjQsS2V5Qjo1LEtleUM6NixLZXlEOjcsS2V5RTo4LEtleUY6OSxLZXlHOjEwLEtleUg6MTEsS2V5SToxMixLZXlKOjEzLEtleUs6MTQsS2V5TDoxNSxLZXlNOjE2LEtleU46MTcsS2V5TzoxOCxLZXlQOjE5LEtleVE6MjAsS2V5UjoyMSxLZXlTOjIyLEtleVQ6MjMsS2V5VToyNCxLZXlWOjI1LEtleVc6MjYsS2V5WDoyNyxLZXlZOjI4LEtleVo6MjksRGlnaXQxOjMwLERpZ2l0MjozMSxEaWdpdDM6MzIsRGlnaXQ0OjMzLERpZ2l0NTozNCxEaWdpdDY6MzUsRGlnaXQ3OjM2LERpZ2l0ODozNyxEaWdpdDk6MzgsRGlnaXQwOjM5LEVudGVyOjQwLEVzY2FwZTo0MSxCYWNrc3BhY2U6NDIsVGFiOjQzLFNwYWNlOjQ0LE1pbnVzOjQ1LEVxdWFsOjQ2LEJyYWNrZXRMZWZ0OjQ3LEJyYWNrZXRSaWdodDo0OCxCYWNrc2xhc2g6NDksU2VtaWNvbG9uOjUxLFF1b3RlOjUyLEJhY2txdW90ZTo1MyxDb21tYTo1NCxQZXJpb2Q6NTUsU2xhc2g6NTYsQ2Fwc0xvY2s6NTcsRjE6NTgsRjI6NTksRjM6NjAsRjQ6NjEsRjU6NjIsRjY6NjMsRjc6NjQsRjg6NjUsRjk6NjYsRjEwOjY3LEYxMTo2OCxGMTI6NjksUHJpbnRTY3JlZW46NzAsU2Nyb2xsTG9jazo3MSxQYXVzZTo3MixJbnNlcnQ6NzMsSG9tZTo3NCxQYWdlVXA6NzUsRGVsZXRlOjc2LEVuZDo3NyxQYWdlRG93bjo3OCxBcnJvd1JpZ2h0Ojc5LEFycm93TGVmdDo4MCxBcnJvd0Rvd246ODEsQXJyb3dVcDo4MixOdW1Mb2NrOjgzLE51bXBhZERpdmlkZTo4NCxOdW1wYWRNdWx0aXBseTo4NSxOdW1wYWRTdWJ0cmFjdDo4NixOdW1wYWRBZGQ6ODcsTnVtcGFkRW50ZXI6ODgsTnVtcGFkMTo4OSxOdW1wYWQyOjkwLE51bXBhZDM6OTEsTnVtcGFkNDo5MixOdW1wYWQ1OjkzLE51bXBhZDY6OTQsTnVtcGFkNzo5NSxOdW1wYWQ4Ojk2LE51bXBhZDk6OTcsTnVtcGFkMDo5OCxOdW1wYWREZWNpbWFsOjk5LENvbnRyb2xMZWZ0OjIyNCxTaGlmdExlZnQ6MjI1LEFsdExlZnQ6MjI2LE1ldGFMZWZ0OjIyNyxDb250cm9sUmlnaHQ6MjI4LFNoaWZ0UmlnaHQ6MjI5LEFsdFJpZ2h0OjIzMCxNZXRhUmlnaHQ6MjMxfTtmdW5jdGlvbiBmNihYKXtyZXR1cm4gZDZbWF0/P251bGx9YXN5bmMgZnVuY3Rpb24gQTAoWCl7cmV0dXJuKGF3YWl0IGZldGNoKCIvZXhlYyIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHtjb21tYW5kOlh9KX0pKS5qc29uKCl9ZnVuY3Rpb24gYTYoWCl7dHJ5e2xldCBaPUpTT04ucGFyc2UoWCksSj1bXTtmb3IobGV0W1kscV1vZiBPYmplY3QuZW50cmllcyhaLmRldmljZXM/P3t9KSl7bGV0IFE9WS5yZXBsYWNlKC9eY29tXC5hcHBsZVwuQ29yZVNpbXVsYXRvclwuU2ltUnVudGltZVwuLywiIikucmVwbGFjZSgvLS9nLCIuIik7Zm9yKGxldCBLIG9mIHEpaWYoSy5pc0F2YWlsYWJsZSlKLnB1c2goe3VkaWQ6Sy51ZGlkLG5hbWU6Sy5uYW1lLHN0YXRlOksuc3RhdGUscnVudGltZTpRfSl9cmV0dXJuIEp9Y2F0Y2h7cmV0dXJuW119fWZ1bmN0aW9uIGo1KFgpe2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGhvbmUiKSlyZXR1cm4gMDtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuIDE7aWYoWi5pbmNsdWRlcygid2F0Y2giKSlyZXR1cm4gMjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4gMztyZXR1cm4gNH1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5zdGFydHNXaXRoKCJpb3MiKSlyZXR1cm4gMDtpZihaLnN0YXJ0c1dpdGgoImlwYWRvcyIpKXJldHVybiAxO2lmKFouc3RhcnRzV2l0aCgid2F0Y2hvcyIpKXJldHVybiAyO2lmKFouc3RhcnRzV2l0aCgidmlzaW9ub3MiKXx8Wi5zdGFydHNXaXRoKCJ4cm9zIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24gbDYoe2RldmljZXM6WCxzZWxlY3RlZFVkaWQ6Wixsb2FkaW5nOkosZXJyb3I6WSxzdG9wcGluZ1VkaWRzOnEsb25SZWZyZXNoOlEsb25TZWxlY3Q6SyxvblN0b3A6Vyx0cmlnZ2VyOkd9KXtsZXRbeixQXT1TKCExKSwkPXcobnVsbCk7eCgoKT0+e2lmKCF6KXJldHVybjtsZXQgQT0oayk9PntpZighJC5jdXJyZW50Py5jb250YWlucyhrLnRhcmdldCkpUCghMSl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSl9LFt6XSk7bGV0IF89bmV3IE1hcDtmb3IobGV0IEEgb2YgWCl7aWYoQS51ZGlkPT09Wiljb250aW51ZTtsZXQgaz1fLmdldChBLnJ1bnRpbWUpO2lmKCFrKWs9W10sXy5zZXQoQS5ydW50aW1lLGspO2sucHVzaChBKX1mb3IobGV0IEEgb2YgXy52YWx1ZXMoKSlBLnNvcnQoKGssSSk9Pmo1KGsubmFtZSktajUoSS5uYW1lKXx8ay5uYW1lLmxvY2FsZUNvbXBhcmUoSS5uYW1lKSk7bGV0IE89Wy4uLl8uZW50cmllcygpXS5zb3J0KChbQV0sW2tdKT0+djUoQSktdjUoayl8fEEubG9jYWxlQ29tcGFyZShrKSksQz1YLmZpbmQoKEEpPT5BLnVkaWQ9PT1aKT8/bnVsbDtyZXR1cm4gTigiZGl2Iix7cmVmOiQsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9LGNoaWxkcmVuOltOKCJkaXYiLHtvbkNsaWNrOigpPT57aWYoIXopUSgpO1AoKEEpPT4hQSl9LGNoaWxkcmVuOkd9KSx6JiZOKCJkaXYiLHtzdHlsZTppNixjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6dTYsY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp7Zm9udFdlaWdodDo2MDB9LGNoaWxkcmVuOiJTaW11bGF0b3JzIn0pLE4oImJ1dHRvbiIse29uQ2xpY2s6KEEpPT57QS5zdG9wUHJvcGFnYXRpb24oKSxRKCl9LGRpc2FibGVkOkosc3R5bGU6bzYsY2hpbGRyZW46Sj8iLi4uIjoiUmVmcmVzaCJ9KV19KSxZJiZOKCJkaXYiLHtzdHlsZTpzNixjaGlsZHJlbjpZfSksQyYmTihkLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6ey4uLnA1LGNvbG9yOiIjYTViNGZjIn0sY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp5NShDLnN0YXRlPT09IkJvb3RlZCI/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46Qy5uYW1lfSldfSksTigiZGl2Iix7c3R5bGU6cjZ9KV19KSxYLmxlbmd0aD09PTAmJiFKJiYhWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46Ik5vIGF2YWlsYWJsZSBzaW11bGF0b3JzIGZvdW5kIn0pLE8ubWFwKChbQSxrXSk9Pk4oImRpdiIse2NoaWxkcmVuOltOKCJkaXYiLHtzdHlsZTpuNixjaGlsZHJlbjpBfSksay5tYXAoKEkpPT57bGV0IE09cS5oYXMoSS51ZGlkKSxoPUkuc3RhdGU9PT0iQm9vdGVkIjtyZXR1cm4gTigiZGl2Iix7c3R5bGU6cDUsb25Nb3VzZUVudGVyOihFKT0+RS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMjU1LDI1NSwyNTUsMC4wOCkiLG9uTW91c2VMZWF2ZTooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJ0cmFuc3BhcmVudCIsb25DbGljazooKT0+e0soSSksUCghMSl9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6eTUoaD8iIzRhZGU4MCI6IiM0NDQiKX0pLE4oInNwYW4iLHtzdHlsZTp7ZmxleDoxfSxjaGlsZHJlbjpJLm5hbWV9KSxoJiZOKCJzcGFuIix7cm9sZToiYnV0dG9uIixvbkNsaWNrOihFKT0+e2lmKEUuc3RvcFByb3BhZ2F0aW9uKCksIU0pVyhJLnVkaWQpfSxzdHlsZTp7Zm9udFNpemU6MTAscGFkZGluZzoiMXB4IDZweCIsYm9yZGVyUmFkaXVzOjQsY29sb3I6TT8iIzg4OCI6IiNmODcxNzEiLGJhY2tncm91bmQ6TT8idHJhbnNwYXJlbnQiOiJyZ2JhKDI0OCwxMTMsMTEzLDAuMSkiLGN1cnNvcjpNPyJkZWZhdWx0IjoicG9pbnRlciJ9LGNoaWxkcmVuOk0/IlN0b3BwaW5nLi4uIjoiU3RvcCJ9KV19LEkudWRpZCl9KV19LEEpKV19KV19KX1mdW5jdGlvbiB5NShYKXtyZXR1cm57d2lkdGg6NixoZWlnaHQ6Nixib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDpYLGZsZXhTaHJpbms6MH19ZnVuY3Rpb24gYzYoKXtsZXQgWD13aW5kb3cuX19TSU1fUFJFVklFV19fLFtaLEpdPVMoITEpLFtZLHFdPVMoW10pLFtRLEtdPVMoITEpLFtXLEddPVMobnVsbCksW3osUF09UyhuZXcgU2V0KSxbJCxfXT1TKCExKSxPPWooYXN5bmMoKT0+e0soITApLEcobnVsbCk7dHJ5e2xldCBGPWF3YWl0IEEwKCJ4Y3J1biBzaW1jdGwgbGlzdCBkZXZpY2VzIGF2YWlsYWJsZSAtaiIpO2lmKEYuZXhpdENvZGUhPT0wKXRocm93IEVycm9yKEYuc3RkZXJyfHwic2ltY3RsIGxpc3QgZmFpbGVkIik7cShhNihGLnN0ZG91dCkpfWNhdGNoKEYpe0coRiBpbnN0YW5jZW9mIEVycm9yP0YubWVzc2FnZToiRmFpbGVkIHRvIGxpc3QgZGV2aWNlcyIpfWZpbmFsbHl7SyghMSl9fSxbXSk7aWYoeCgoKT0+e08oKX0sW09dKSx4KCgpPT57aWYoIVg/LmxvZ3NFbmRwb2ludClyZXR1cm47bGV0IEY9bmV3IEV2ZW50U291cmNlKFgubG9nc0VuZHBvaW50KSxSPW5ldyBNYXAsdj1bIiM4YmU5ZmQiLCIjNTBmYTdiIiwiI2ZmYjg2YyIsIiNmZjc5YzYiLCIjYmQ5M2Y5IiwiI2YxZmE4YyIsIiM2MjcyYTQiLCIjZmY1NTU1IiwiIzY5ZmY5NCIsIiNkNmFjZmYiLCIjZmZmZmE1IiwiI2E0ZmZmZiIsIiNmZjZlNmUiLCIjY2FhOWZhIiwiIzVhZjc4ZSJdO2Z1bmN0aW9uIFQoWjApe2xldCB5PVIuZ2V0KFowKTtpZigheSl7bGV0IGU9MDtmb3IobGV0IGE9MDthPFowLmxlbmd0aDthKyspZT0oZTw8NSktZStaMC5jaGFyQ29kZUF0KGEpfDA7eT12W01hdGguYWJzKGUpJXYubGVuZ3RoXSxSLnNldChaMCx5KX1yZXR1cm4geX1sZXQgaT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oWjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoWjAuZGF0YSksZT15LnByb2Nlc3NJbWFnZVBhdGg/LnNwbGl0KCIvIikucG9wKCk/P3kuc2VuZGVySW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz8iIixhPXkuc3Vic3lzdGVtPz8iIixWMD15LmNhdGVnb3J5Pz8iIixKMD15LmV2ZW50TWVzc2FnZT8/IiI7aWYoIUowKXJldHVybjtpZihlIT09aSl7aWYobSljb25zb2xlLmdyb3VwRW5kKCk7bGV0IE0wPVQoZSk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke2V9JHthP2AgJWMke2F9JHtWMD8iOiIrVjA6IiJ9YDoiIn1gLGBjb2xvcjoke00wfTtmb250LXdlaWdodDpib2xkYCwuLi5hP1siY29sb3I6Izg4ODtmb250LXdlaWdodDpub3JtYWwiXTpbXSksbT0hMCxpPWV9bGV0IGw9KHkubWVzc2FnZVR5cGU/PyIiKS50b0xvd2VyQ2FzZSgpLHU9YSYmZT09PWk/YCVjJHtWMHx8YX0lYyBgOiIiLFUwPXU/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGw9PT0iZmF1bHQifHxsPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihsPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBDPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbCxBPWswKEM/Lm5hbWUpLGs9JDBbQV0sST1rLndpZHRoLTIqay5iZXplbFgsTT1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoQSksRT1BPT09InZpc2lvbiI/NTgwOkE9PT0iaXBhZCI/NDAwOkE9PT0id2F0Y2giPzIwMDozMjAsbj1tNihYLnN0cmVhbVVybCksUTA9dyhudWxsKTt4KCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsUTAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFEwLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IGc9aigoRixSKT0+e2xldCB2PVEwLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLGk9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7aVswXT1GLGkuc2V0KFQsMSksdi5zZW5kKGkpfSxbXSksSzA9aigoRik9PmcoMyxGKSxbZ10pLHM9aigoRik9PmcoNSxGKSxbZ10pLHI9aigoRik9PmcoNCx7YnV0dG9uOkZ9KSxbZ10pLE8wPWooKEYsUik9PntnKDYse3R5cGU6Rix1c2FnZTpSfSl9LFtnXSksW2owLHYwXT1TKG51bGwpO3goKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgaT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksaSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e08wKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksTzAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLE8wKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksTzAoInVwIiwyMjcpfSxbTzBdKTt4KCgpPT57bGV0IEY9KFQsaSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLGk9PT0iZG93biImJiFULnJlcGVhdClnKDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSxpPT09ImRvd24iJiYhVC5yZXBlYXQpQTAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoWjApPT57bGV0IHk9WjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gQTAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWY2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLGcoNix7dHlwZTppLHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbZyxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgQTAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IEEwKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBBMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57UCgoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgQTAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgTygpfWZpbmFsbHl7UCgoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbT10pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6QTAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOkM/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpDPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihsNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOk8sb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtNfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOm4uc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6bi5mcmFtZSxzdHJlYW1Db25maWc6bi5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0saTY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSx1Nj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0sbzY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sczY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LHA1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxyNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LHQ2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sbjY9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtQNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTihjNix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return N}function Le(e){let _=(e?.basePath??"/.sim").replace(/\/+$/,"");return(t,s,r)=>{let C=t.url??"";if(C===_||C===_+"/"){let i=b()[0]??null,$=Ve();if(i){let a=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...i,logsEndpoint:_+"/logs"})}</script>`;$=$.replace("<!--__SIM_PREVIEW_CONFIG__-->",a)}s.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),s.end($);return}if(C===_+"/api"){let o=b();s.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),s.end(JSON.stringify(o[0]||null));return}if((C===_+"/exec"||C===_+"/exec/")&&t.method==="POST"){let o="";t.on("data",(i)=>{o+=typeof i==="string"?i:i.toString()}),t.on("end",()=>{let i="";try{i=JSON.parse(o).command??""}catch{}if(!i){s.writeHead(400,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}we(i,{maxBuffer:16777216},($,S,a)=>{s.writeHead(200,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:S.toString(),stderr:a.toString(),exitCode:$?$.code??1:0}))})});return}if(C===_+"/logs"||C.startsWith(_+"/logs?")){let o=b();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let i=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
|
|
3
|
+
var pe=Object.defineProperty;var De=(e)=>e;function Ee(e,_){this[e]=De.bind(null,_)}var de=(e,_)=>{for(var t in _)pe(e,t,{get:_[t],enumerable:!0,configurable:!0,set:Ee.bind(_,t)})};var Fe=(e,_)=>()=>(e&&(_=e(e=0)),_);var j={};de(j,{simMiddleware:()=>Ie});import{readdirSync as we,readFileSync as ve,existsSync as be,unlinkSync as G}from"fs";import{execSync as he,spawn as x,exec as Oe,execFile as me}from"child_process";import{tmpdir as He}from"os";import{join as q}from"path";function We(e){return!Le.test(e)}function Pe(e,_){if(Ne.has(_))return Promise.resolve(!0);return new Promise((t)=>{me("xcrun",["simctl","get_app_container",e,_,"app"],{timeout:2000},(s,r)=>{if(s)return t(!1);let S=r.trim();if(!S)return t(!1);for(let o of Ve)if(be(q(S,o)))return t(!0);t(!1)})})}function qe(){let e=Date.now();if(b.booted&&e-b.at<1500)return b.booted;try{let _=he("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),t=JSON.parse(_),s=new Set;for(let r of Object.values(t.devices))for(let S of r)if(S.state==="Booted")s.add(S.udid);return b={at:e,booted:s},s}catch{return null}}function h(){let e;try{e=we(K).filter((s)=>s.startsWith("server-")&&s.endsWith(".json"))}catch{return[]}let _=qe(),t=[];for(let s of e){let r=q(K,s);try{let S=JSON.parse(ve(r,"utf-8"));try{process.kill(S.pid,0)}catch{try{G(r)}catch{}continue}if(_&&!_.has(S.device)){try{process.kill(S.pid,"SIGTERM")}catch{}try{G(r)}catch{}continue}t.push(S)}catch{}}return t}function Me(){if(!P)P=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixqNCxtNSxQMCxiNCx2NCx5NCwkNCxtMCxUMCxwNCxHNCx6NCxXNCxnNCxkMD17fSxhMD1bXSxmNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVjQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZjAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBmMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2o0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGYoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gaShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBkNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLEg0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLGY0KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJng0KFEpfX1mdW5jdGlvbiB4NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSkseDQoWCl9ZnVuY3Rpb24gTDQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxiNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoYjQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fHY0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHk0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsZDUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIGg0KFgsWixKLFkscSxRLEssVyxHLHosTyl7dmFyICQsXyxBLE0sVSxrLEksQz1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1hNShKLFosQyxHLGgpLCQ9MDskPGg7JCsrKShBPUouX19rWyRdKSE9bnVsbCYmKF89QS5fX2khPS0xJiZDW0EuX19pXXx8ZDAsQS5fX2k9JCxrPUg0KFgsQSxfLHEsUSxLLFcsRyx6LE8pLE09QS5fX2UsQS5yZWYmJl8ucmVmIT1BLnJlZiYmKF8ucmVmJiZQNChfLnJlZixudWxsLEEpLE8ucHVzaChBLnJlZixBLl9fY3x8TSxBKSksVT09bnVsbCYmTSE9bnVsbCYmKFU9TSksKEk9ISEoNCZBLl9fdSkpfHxfLl9faz09PUEuX19rPyhHPW00KEEsRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBBLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOk0mJihHPU0ubmV4dFNpYmxpbmcpLEEuX191Jj0tNyk7cmV0dXJuIEouX19lPVUsR31mdW5jdGlvbiBhNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosTz1KLmxlbmd0aCwkPU8sXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWYwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1mMChmLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWYwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWw1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+Tz9fLS06cTxPJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8TztRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksYTQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gbTQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPW00KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGw1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxPPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8TyYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihPPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGY1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8UzQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8UzQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UocDQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1HNCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP1c0Ono0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUjQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1HNCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIEg0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBPLCQsXyxBLE0sVSxrLEksQyxoLEUsZSxaMCx4LEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChPPUIuX19iKSYmTyhaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsQz1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KE89cy5jb250ZXh0VHlwZSkmJllbTy5fX2NdLEU9Tz9oP2gucHJvcHMudmFsdWU6Ty5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihDP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgaShJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1pNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksQyYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxDJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLEE9JC5wcm9wcyxNPSQuc3RhdGUsJC5fX3Y9WixfKUMmJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxDJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoQyYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1BJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxDJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKEEsTSxVKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLGU9Qi5fX3IsWjA9MCxDKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsZSYmZShaKSxPPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrWjA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxDJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKFU9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShBLE0pKSx4PU8hPW51bGwmJk8udHlwZT09PWYmJk8ua2V5PT1udWxsP2Q0KE8ucHJvcHMuY2hpbGRyZW4pOk8sVz1oNChYLGIwKHgpP3g6W3hdLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspVjQoUVtLMF0pO040KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxONChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWM1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKE89Qi5kaWZmZWQpJiZPKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBONChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKE40KSl9ZnVuY3Rpb24gZjQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKVA0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGM1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixPLCQsXyxBLE0sVSxrPUoucHJvcHN8fGQwLEk9Wi5wcm9wcyxDPVoudHlwZTtpZihDPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6Qz09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoQT1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBBPT0hIUMmJihDP0EubG9jYWxOYW1lPT1DOkEubm9kZVR5cGU9PTMpKXtYPUEsUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihDPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLEMsSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihDPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhBPVguYXR0cmlidXRlc1t6XSkubmFtZV09QS52YWx1ZTtmb3IoeiBpbiBrKUE9a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9QTp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsQSxxKTtmb3IoeiBpbiBJKUE9SVt6XSx6PT0iY2hpbGRyZW4iP189QTp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP089QTp6PT0idmFsdWUiP009QTp6PT0iY2hlY2tlZCI/VT1BOlcmJnR5cGVvZiBBIT0iZnVuY3Rpb24ifHxrW3pdPT09QXx8aDAoWCx6LEEsa1t6XSxxKTtpZihPKVd8fCQmJihPLl9faHRtbD09JC5fX2h0bWx8fE8uX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1PLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLGg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxDPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylWNChRW3pdKTtXfHwoej0idmFsdWUiLEM9PSJwcm9ncmVzcyImJk09PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6TSE9bnVsbCYmKE0hPT1YW3pdfHxDPT0icHJvZ3Jlc3MiJiYhTXx8Qz09Im9wdGlvbiImJk0hPWtbel0pJiZoMChYLHosTSxrW3pdLHEpLHo9ImNoZWNrZWQiLFUhPW51bGwmJlUhPVhbel0mJmgwKFgseixVLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIFA0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGE0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8UDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZhNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8VjQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGk1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLEg0KFosWD0oIVkmJkp8fFopLl9faz1XMChmLG51bGwsW1hdKSxxfHxkMCxkMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxmNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLEw0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrZzQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LGo0PTAsbTU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGkucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLEw0KHRoaXMpKX0saS5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLEw0KHRoaXMpKX0saS5wcm90b3R5cGUucmVuZGVyPWYsUDA9W10sdjQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHk0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLCQ0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrJDQsVDA9Il9fYSIrJDQscDQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksRzQ9MCx6ND1SNCghMSksVzQ9UjQoITApLGc0PTA7dmFyIEYwLHAsTzQsbDQsUzA9MCxuND1bXSxkPUIsYzQ9ZC5fX2IsaTQ9ZC5fX3IsdTQ9ZC5kaWZmZWQsbzQ9ZC5fX2MsczQ9ZC51bm1vdW50LHI0PWQuX187ZnVuY3Rpb24gbzAoWCxaKXtkLl9faCYmZC5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsQTQoWDUsWCl9ZnVuY3Rpb24gQTQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOlg1KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgTz1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKE8uZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIE8uc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIEE9Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxBIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgTz1RO1E9dm9pZCAwLHEoVyxHLHopLFE9T31LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIGcoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFkLl9fcyYmZTQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gZTQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiB1NSgpe2Zvcih2YXIgWDtYPW40LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZC5fX2UoSixYLl9fdil9fX1kLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsYzQmJmM0KFgpfSxkLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSkscjQmJnI0KFgsWil9LGQuX19yPWZ1bmN0aW9uKFgpe2k0JiZpNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKE80PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShVNCksWi5fX2g9W10sRjA9MCkpLE80PXB9LGQuZGlmZmVkPWZ1bmN0aW9uKFgpe3U0JiZ1NChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJihuNC5wdXNoKFopIT09MSYmbDQ9PT1kLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChsND1kLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fG81KSh1NSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLE80PXA9bnVsbH0sZC5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8VTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGQuX19lKFksSi5fX3YpfX0pLG80JiZvNChYLFopfSxkLnVubW91bnQ9ZnVuY3Rpb24oWCl7czQmJnM0KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmQuX19lKFosSi5fX3YpKX07dmFyIHQ0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gbzUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSx0NCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3Q0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBVNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gWDUoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIFo2KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFo1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gSjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KEo1LnByb3RvdHlwZT1uZXcgaSkuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsSjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBaNSh0aGlzLnByb3BzLFgpfHxaNSh0aGlzLnN0YXRlLFopfTt2YXIgWTU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLFk1JiZZNShYKX07dmFyIEo2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9SjYoWCxaLEosWSl9O3ZhciBxNT1CLnVubW91bnQ7ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1aNih7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gTDUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTjUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBONShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIEI0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIEc1KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxxNSYmcTUoWCl9LChCNC5wcm90b3R5cGU9bmV3IGkpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPUc1KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TjUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgTztmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtPPVkuby5wb3AoKTspTy5fX1A9VyxPLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxCNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LEI0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUw1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGYsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChmLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIFE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBpKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPUc1KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxRNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtRNShYLEosWil9KX07dmFyIFk2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLHE2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxRNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLEs2PS9bQS1aMC05XS9nLCQ2PXR5cGVvZiBkb2N1bWVudDwidSIsejY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBWNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1pLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBLNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIEs1JiYoWD1LNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIEg1LFc2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSwkNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHwkNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fHo2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpRNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJnE2LnRlc3QoSyk/Sz1LLnJlcGxhY2UoSzYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIixXNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVk2LCQ1JiYkNShYKX07dmFyIHo1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKSxINT1YLl9fY307dmFyIFc1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe1c1JiZXNShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksSDU9bnVsbH07ZnVuY3Rpb24gUDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIE81KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7VjUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe1A1KFgpfX19ZnVuY3Rpb24gQzUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gVTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBBNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oQTUucHJvdG90eXBlPW5ldyBpKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxBNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIFU1KHRoaXMucHJvcHMsWCl8fFU1KHRoaXMuc3RhdGUsWil9O3ZhciBCNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksQjUmJkI1KFgpfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1DNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9TDYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgTjY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1ONihYLFosSixZKX07dmFyIF81PUIudW5tb3VudDtmdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPUM1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBFNShZLFosSil9KSksWH1mdW5jdGlvbiB3NShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIHc1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gRjQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gVDUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLF81JiZfNShYKX0sKEY0LnByb3RvdHlwZT1uZXcgaSkuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9VDUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT13NSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBPO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO089WS5vLnBvcCgpOylPLl9fUD1XLE8uZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LEY0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRjQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09RTUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZixudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGYsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgRjU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGkpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9VDUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLEY1KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope0Y1KFgsSixaKX0pfTt2YXIgRzY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsVjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEg2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sUDY9L1tBLVowLTldL2csTzY9dHlwZW9mIGRvY3VtZW50PCJ1IixVNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2kucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEQ1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRDUmJihYPUQ1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgYjUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LGs1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fE82JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8VTYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkg2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmVjYudGVzdChLKT9LPUsucmVwbGFjZShQNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9RzYsazUmJms1KFgpfTt2YXIgSTU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7STUmJkk1KFgpLGI1PVguX19jfTt2YXIgTTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7TTUmJk01KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxiNT1udWxsfTt2YXIgQjY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1CNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEQ0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsXzY9MyxGNj00LEQ2PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOk8sc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6QSxjb25uZWN0aW9uUXVhbGl0eTpNfSl7bGV0IFU9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksQz13KG51bGwpLFtoLEVdPVMoITEpLFtlLFowXT1TKG51bGwpLFt4LEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixVMF09UyhudWxsKTtnKCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFA9TFswXT8uY29udGVudFJlY3Q7aWYoUClVMCh7d2lkdGg6UC53aWR0aCxoZWlnaHQ6UC5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7ZygoKT0+e2lmKE09PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtNXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoQSk7di5jdXJyZW50PUEsZygoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLGcoKCk9PntpZihVJiYkKUswKCQpfSxbVSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IHU9dyhudWxsKTtnKCgpPT57aWYoIVV8fCF6KXJldHVybjtsZXQgSD1zZXRUaW1lb3V0KCgpPT57aWYoIVQuY3VycmVudClaMCgiU3RyZWFtIGlzIG5vdCBwcm9kdWNpbmcgZnJhbWVzLiBUaGUgc2ltdWxhdG9yIG1heSBoYXZlIHN0b3BwZWQg4oCUIHRyeSByZWNvbm5lY3RpbmcuIil9LDYwMDApLEw9eigoUCk9PntHMC5jdXJyZW50KyssWDAuY3VycmVudD1EYXRlLm5vdygpO2xldCBEPUkuY3VycmVudDtpZihEKXtpZih1LmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTCh1LmN1cnJlbnQpO3UuY3VycmVudD1QLEQuc3JjPVB9aWYoIVQuY3VycmVudCljbGVhclRpbWVvdXQoSCksRSghMCksWjAobnVsbCl9KTtyZXR1cm4oKT0+e2NsZWFyVGltZW91dChIKSxMPy4oKX19LFtVLHpdKTtsZXQgbT1qKChWKT0+e2lmKFUpe0s/LihWKTtyZXR1cm59bGV0IEg9Qy5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09XzYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEtdKSxKMD1qKChWKT0+e2lmKFUpe0c/LihWKTtyZXR1cm59bGV0IEg9Qy5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxQPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1BbMF09RjYsUC5zZXQoTCwxKSxILnNlbmQoUCl9LFtVLEddKSx5PWooKFYpPT57aWYoVSl7Vz8uKFYpO3JldHVybn1sZXQgSD1DLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFA9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7UFswXT1ENixQLnNldChMLDEpLEguc2VuZChQKX0sW1UsV10pO2coKCk9PntpZihVKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChsKT0+bC5qc29uKCkpLnRoZW4oKGwpPT57aWYobC53aWR0aD4wJiZsLmhlaWdodD4wKUswKGwpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsQy5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxaMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1owKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixQPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKSxEPSExLGI9c2V0VGltZW91dCgoKT0+e2lmKCFEKVowKCJTdHJlYW0gaXMgbm90IHByb2R1Y2luZyBmcmFtZXMuIFRoZSBzaW11bGF0b3IgbWF5IGhhdmUgc3RvcHBlZCDigJQgdHJ5IHJlY29ubmVjdGluZy4iKX0sNjAwMCk7cmV0dXJuKGFzeW5jKCk9Pnt0cnl7bGV0IG49KGF3YWl0IGZldGNoKFIse3NpZ25hbDpMLnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighbilyZXR1cm47bGV0IFEwPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiLS1mcmFtZSIpO3doaWxlKCEwKXtsZXR7ZG9uZTpoNSx2YWx1ZTpRNH09YXdhaXQgbi5yZWFkKCk7aWYoaDUpYnJlYWs7aWYoUTQpZm9yKGxldCBLND0wO0s0PD1RNC5sZW5ndGgtUTAubGVuZ3RoO0s0Kyspe2xldCBUND0hMDtmb3IobGV0IHgwPTA7eDA8UTAubGVuZ3RoO3gwKyspaWYoUTRbSzQreDBdIT09UTBbeDBdKXtUND0hMTticmVha31pZihUNCl7aWYoRzAuY3VycmVudCsrLCFEKUQ9ITAsY2xlYXJUaW1lb3V0KGIpfX19fWNhdGNoe319KSgpLCgpPT57TC5hYm9ydCgpLGNsZWFySW50ZXJ2YWwoUCksY2xlYXJUaW1lb3V0KGIpLEguY2xvc2UoKSxDLmN1cnJlbnQ9bnVsbH19LFtYLFIsVV0pO2xldCBYMD13KDApO2coKCk9PntpZighVSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9WDAuY3VycmVudDtpZighRHx8IVQuY3VycmVudClyZXR1cm47aWYoRGF0ZS5ub3coKS1EPlYpRSghMSl9LEw9c2V0SW50ZXJ2YWwoKCk9Pnt2MChHMC5jdXJyZW50KSxHMC5jdXJyZW50PTAsSCgpfSwxMDAwKSxQPSgpPT57aWYoIWRvY3VtZW50LmhpZGRlbilIKCl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixQKSwoKT0+e2NsZWFySW50ZXJ2YWwoTCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsUCl9fSxbVV0pO2xldCBhPWooKCk9PntyZXR1cm4gVT9JLmN1cnJlbnQ6ay5jdXJyZW50fSxbVV0pLFYwPWooKFYsSCk9PntsZXQgTD1hKCk7aWYoIUwpcmV0dXJuO2xldCBQPUwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD0oSC5jbGllbnRYLVAubGVmdCkvUC53aWR0aCxiPShILmNsaWVudFktUC50b3ApL1AuaGVpZ2h0O20oe3R5cGU6Vix4OkQseTpifSl9LFttXSksWTA9MyxjPXcoITEpLG89dyghMSksQTA9dyghMSksTTA9dyh7ZHg6MCxkeTowfSksQzA9dyghMSksW1k0LEk0XT1TKCExKSxNND13KHt4OjAuNSx5OjAuNX0pLFtIMCxxMF09UyhudWxsKTtnKCgpPT57bGV0IFY9KEwpPT57aWYoTC5rZXk9PT0iQWx0IilJNCghMCl9LEg9KEwpPT57aWYoTC5rZXk9PT0iQWx0Iil7aWYoSTQoITEpLCFvLmN1cnJlbnQpcTAobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSxnKCgpPT57aWYoWTQmJiFvLmN1cnJlbnQpe2xldCBWPU00LmN1cnJlbnQ7cTAoe3gxOlYueCx5MTpWLnkseDI6MS1WLngseTI6MS1WLnl9KX1lbHNlIGlmKCFZNCYmIW8uY3VycmVudClxMChudWxsKX0sW1k0XSk7bGV0IHkwPXcobnVsbCkscTQ9dyghMSksRTA9dygwKSxDND1qKChWLEgpPT57cTQuY3VycmVudD0hMDtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWAsTC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KX0sW10pLEU0PWooKFYsSCk9PntpZighcTQuY3VycmVudClyZXR1cm47bGV0IEw9eTAuY3VycmVudDtpZihMKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEUwLmN1cnJlbnQpLEUwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57TC5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLEwuc3R5bGUudG9wPWAke0gqMTAwfSVgfSl9LFtdKSxwMD1qKCgpPT57cTQuY3VycmVudD0hMTtsZXQgVj15MC5jdXJyZW50O2lmKFYpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksVi5zdHlsZS5kaXNwbGF5PSJub25lIn0sW10pLHc0PXcoMCksdzA9dyhudWxsKSx4NT1qKCgpPT57bGV0IFY9RGF0ZS5ub3coKSxIPVYtdzQuY3VycmVudDtpZih3NC5jdXJyZW50PVYsSDwzMDApe2lmKHcwLmN1cnJlbnQpY2xlYXJUaW1lb3V0KHcwLmN1cnJlbnQpLHcwLmN1cnJlbnQ9bnVsbDtpZihRKVEoKTtlbHNlIEowKCJhcHBfc3dpdGNoZXIiKX1lbHNlIHcwLmN1cnJlbnQ9c2V0VGltZW91dCgoKT0+e2lmKFEpUSgpO2Vsc2UgSjAoImhvbWUiKTt3MC5jdXJyZW50PW51bGx9LDMwMCl9LFtKMCxRXSksZzA9KCgpPT57aWYoIXh8fCFyKXJldHVybiBudWxsO2lmKHIud2lkdGg9PT0wfHxyLmhlaWdodD09PTApcmV0dXJuIG51bGw7bGV0IFY9TWF0aC5taW4oci53aWR0aC94LndpZHRoLHIuaGVpZ2h0L3guaGVpZ2h0KTtyZXR1cm57d2lkdGg6eC53aWR0aCpWLGhlaWdodDp4LmhlaWdodCpWfX0pKCk7cmV0dXJuIE4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXg6MSwuLi5fP3t9Ontib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sb3ZlcmZsb3c6ImhpZGRlbiIsbWluV2lkdGg6MCxtaW5IZWlnaHQ6MCwuLi5KfSxjbGFzc05hbWU6cSxjaGlsZHJlbjpbTigiZGl2Iix7cmVmOnMsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG1pbkhlaWdodDowLG1pbldpZHRoOjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIn0sY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsd2lkdGg6ZzA/YCR7ZzAud2lkdGh9cHhgOiIxMDAlIixoZWlnaHQ6ZzA/YCR7ZzAuaGVpZ2h0fXB4YDoiMTAwJSJ9LGNoaWxkcmVuOltOKCJpbWciLHtyZWY6ayxzcmM6VT92b2lkIDA6UixkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClLMCgoTCk9PkwmJkwud2lkdGg9PT1ILm5hdHVyYWxXaWR0aCYmTC5oZWlnaHQ9PT1ILm5hdHVyYWxIZWlnaHQ/TDp7d2lkdGg6SC5uYXR1cmFsV2lkdGgsaGVpZ2h0OkgubmF0dXJhbEhlaWdodH0pfSxzdHlsZTpVP3tkaXNwbGF5OiJub25lIn06e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RDQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLFUmJk4oImltZyIse3JlZjpJLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOkQ0LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uWX19KSxOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpENCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUD0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsQTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBiPXt4MTpQLHkxOkQseDI6MS1QLHkyOjEtRH07TTAuY3VycmVudD17ZHg6MS1QLVAsZHk6MS1ELUR9LHEwKGIpLHkoe3R5cGU6ImJlZ2luIiwuLi5ifSk7cmV0dXJufWlmKEM0KFAsRCksRD4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpQLHk6RCxlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsVjAoImJlZ2luIixWKX0sb25Nb3VzZU1vdmU6KFYpPT57bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihNNC5jdXJyZW50PXt4OlAseTpEfSxWLmJ1dHRvbnM9PT0wKXtpZihWLmFsdEtleSlxMCh7eDE6UCx5MTpELHgyOjEtUCx5MjoxLUR9KTtyZXR1cm59aWYoby5jdXJyZW50KXtsZXQgYjtpZihBMC5jdXJyZW50KXtsZXQgbD1NMC5jdXJyZW50O2I9e3gxOlAseTE6RCx4MjpQK2wuZHgseTI6RCtsLmR5fX1lbHNlIGI9e3gxOlAseTE6RCx4MjoxLVAseTI6MS1EfTtxMChiKSx5KHt0eXBlOiJtb3ZlIiwuLi5ifSk7cmV0dXJufWlmKEU0KFAsRCksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6UCx5OkQsZWRnZTpZMH0pO2Vsc2UgVjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQTAuY3VycmVudCl7bGV0IGI9TTAuY3VycmVudDt5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjpQK2IuZHgseTI6RCtiLmR5fSl9ZWxzZSB5KHt0eXBlOiJlbmQiLHgxOlAseTE6RCx4MjoxLVAseTI6MS1EfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlxMChudWxsKTtyZXR1cm59aWYocDAoKSxjLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFA9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6UCx5OkQsZWRnZTpZMH0pfWMuY3VycmVudD0hMTtyZXR1cm59VjAoImVuZCIsVil9LG9uTW91c2VMZWF2ZTooVik9PntpZihvLmN1cnJlbnQpe2lmKEgwKXkoe3R5cGU6ImVuZCIsLi4uSDB9KTtvLmN1cnJlbnQ9ITEscTAobnVsbCk7cmV0dXJufWlmKHAwKCksYy5jdXJyZW50KXtsZXQgSD1hKCk7aWYoSCl7bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxQPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7bSh7dHlwZToiZW5kIix4OlAseTpELGVkZ2U6WTB9KX1jLmN1cnJlbnQ9ITE7cmV0dXJufWlmKFYuYnV0dG9ucz4wKVYwKCJlbmQiLFYpO3EwKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtwMCgpO2xldCBsPVYudG91Y2hlc1swXSxuPVYudG91Y2hlc1sxXSxRMD17eDE6KGwuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KGwuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KG4uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTI6KG4uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O2lmKCFDMC5jdXJyZW50JiYhYy5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpRMC54MSx5OlEwLnkxfSk7QzAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYy5jdXJyZW50PSExLHEwKFEwKSx5KHt0eXBlOiJiZWdpbiIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEM0KEQsYiksYj4wLjg4KWMuY3VycmVudD0hMCxtKHt0eXBlOiJiZWdpbiIseDpELHk6YixlZGdlOlkwfSk7ZWxzZSBjLmN1cnJlbnQ9ITEsbSh7dHlwZToiYmVnaW4iLHg6RCx5OmJ9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgbD1WLnRvdWNoZXNbMF0sbj1WLnRvdWNoZXNbMV0sUTA9e3gxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihuLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihuLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0fTtxMChRMCkseSh7dHlwZToibW92ZSIsLi4uUTB9KTtyZXR1cm59bGV0IFA9Vi50b3VjaGVzWzBdO2lmKCFQKXJldHVybjtsZXQgRD0oUC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShQLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEU0KEQsYiksYy5jdXJyZW50KW0oe3R5cGU6Im1vdmUiLHg6RCx5OmIsZWRnZTpZMH0pO2Vsc2UgbSh7dHlwZToibW92ZSIseDpELHk6Yn0pfSxvblRvdWNoRW5kOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoQzAuY3VycmVudCl7aWYoVi50b3VjaGVzLmxlbmd0aDwyKXtsZXQgbD1WLmNoYW5nZWRUb3VjaGVzWzBdLG49SDA7aWYobCYmbil5KHt0eXBlOiJlbmQiLHgxOihsLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihsLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOm4ueDIseTI6bi55Mn0pO2Vsc2UgaWYobil5KHt0eXBlOiJlbmQiLC4uLm59KTtDMC5jdXJyZW50PSExLG8uY3VycmVudD0hMSxxMChudWxsKX1yZXR1cm59bGV0IFA9Vi5jaGFuZ2VkVG91Y2hlc1swXTtpZighUClyZXR1cm47bGV0IEQ9KFAuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsYj0oUC5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihwMCgpLGMuY3VycmVudCltKHt0eXBlOiJlbmQiLHg6RCx5OmIsZWRnZTpZMH0pLGMuY3VycmVudD0hMTtlbHNlIG0oe3R5cGU6ImVuZCIseDpELHk6Yn0pfX0pLE4oImRpdiIse3JlZjp5MCwiZGF0YS10ZXN0aWQiOiJ0b3VjaC1pbmRpY2F0b3IiLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLHdpZHRoOjI0LGhlaWdodDoyNCxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSg1OSwxMzAsMjQ2LDAuNSkiLGJveFNoYWRvdzoiMCAwIDhweCByZ2JhKDU5LDEzMCwyNDYsMC4zKSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX0pLEgwJiZOKGYse2NoaWxkcmVuOltOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MSxIMC55MSl9KSxOKCJkaXYiLHsiZGF0YS10ZXN0aWQiOiJmaW5nZXItZG90IixzdHlsZTpqNShIMC54MixIMC55Mil9KV19KSwhaCYmIWUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiM4ODgiLGZvbnRTaXplOjE0fSxjaGlsZHJlbjoiQ29ubmVjdGluZy4uLiJ9KX0pLGUmJk4oImRpdiIse3N0eWxlOlM1LGNoaWxkcmVuOk4oInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmNDQiLGZvbnRTaXplOjE0LHBhZGRpbmc6MjAsdGV4dEFsaWduOiJjZW50ZXIifSxjaGlsZHJlbjplfSl9KSxKNCYmTigiZGl2Iix7c3R5bGU6azYsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2ZiYmYyNCIsZm9udFNpemU6MTMsZm9udEZhbWlseToibW9ub3NwYWNlIn0sY2hpbGRyZW46IlNsb3cgY29ubmVjdGlvbiJ9KX0pXX0pfSksIV8mJk4oImRpdiIse3N0eWxlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixwYWRkaW5nOiI0cHggOHB4Iixib3JkZXJUb3A6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIn0sY2hpbGRyZW46W04oImJ1dHRvbiIse29uQ2xpY2s6eDUsc3R5bGU6e2JhY2tncm91bmQ6Im5vbmUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSIsY29sb3I6IiNhYWEiLGZvbnRTaXplOjExLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIscGFkZGluZzoiMnB4IDEwcHgiLGN1cnNvcjoicG9pbnRlciIsYm9yZGVyUmFkaXVzOjR9LGNoaWxkcmVuOiJIb21lIn0pLE4oInNwYW4iLHtzdHlsZTp7Y29sb3I6ajA+MD8iIzRmNCI6IiM4ODgiLGZvbnRTaXplOjEyLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSIsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6Nn0sY2hpbGRyZW46W00mJk4oInNwYW4iLHsiZGF0YS10ZXN0aWQiOiJxdWFsaXR5LWRvdCIsc3R5bGU6e3dpZHRoOjgsaGVpZ2h0OjgsYm9yZGVyUmFkaXVzOiI1MCUiLGRpc3BsYXk6ImlubGluZS1ibG9jayIsYmFja2dyb3VuZDpNPT09Imdvb2QiPyIjNGFkZTgwIjpNPT09ImRlZ3JhZGVkIj8iI2ZhY2MxNSI6IiNlZjQ0NDQifX0pLGowLCIgZnBzIl19KV19KV19KX12YXIgazY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjgsbGVmdDoiNTAlIix0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTUwJSkiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC43KSIsYm9yZGVyUmFkaXVzOjYscGFkZGluZzoiNHB4IDEycHgiLHBvaW50ZXJFdmVudHM6Im5vbmUifSxTNT17cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjgpIn0sUjU9MjA7ZnVuY3Rpb24gajUoWCxaKXtyZXR1cm57cG9zaXRpb246ImFic29sdXRlIixsZWZ0OmAke1gqMTAwfSVgLHRvcDpgJHtaKjEwMH0lYCx3aWR0aDpSNSxoZWlnaHQ6UjUsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjcpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fWZ1bmN0aW9uIGswKFgpe2lmKCFYKXJldHVybiJpcGhvbmUiO2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuImlwYWQiO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIndhdGNoIjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4idmlzaW9uIjtyZXR1cm4iaXBob25lIn12YXIgJDA9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LGI3PSQwLmlwaG9uZS53aWR0aCxTNz0kMC5pcGhvbmUuaGVpZ2h0LFI3PSQwLmlwaG9uZS5iZXplbFgsajc9JDAuaXBob25lLmJlemVsWSx2Nz0kMC5pcGhvbmUuaW5uZXJSYWRpdXM7ZnVuY3Rpb24gZTAoWD0iaXBob25lIil7bGV0IFo9JDBbWF0sSj1aLndpZHRoLTIqWi5iZXplbFgsWT1aLmhlaWdodC0yKlouYmV6ZWxZO3JldHVybmAke1ouaW5uZXJSYWRpdXMvSioxMDB9JSAvICR7Wi5pbm5lclJhZGl1cy9ZKjEwMH0lYH12YXIgazQ9XzAobnVsbCk7ZnVuY3Rpb24gWDQoWCl7bGV0IFo9UjAoazQpO2lmKCFaKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWn12YXIgdzY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBUNih7ZXhlYzpYLGRldmljZVVkaWQ6WixkZXZpY2VOYW1lOkosZGV2aWNlUnVudGltZTpZLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOlE9ITEsY2hpbGRyZW46SyxzdHlsZTpXLC4uLkd9KXtsZXQgej1rMChKKSwkPXtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksZGV2aWNlVHlwZTp6LHN0cmVhbWluZzpxLGRpc2FibGVkOlF8fCFafHwhcX07cmV0dXJuIE4oazQuUHJvdmlkZXIse3ZhbHVlOiQsY2hpbGRyZW46TigiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi53NiwuLi5XfSwuLi5HLGNoaWxkcmVuOkt9KX0pfXZhciBiNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sUzY9RDAoZnVuY3Rpb24oe25hbWU6WixzdWJ0aXRsZTpKLGhpZGVDaGV2cm9uOlksc3R5bGU6cSxvbk1vdXNlRW50ZXI6USxvbk1vdXNlTGVhdmU6SywuLi5XfSxHKXtsZXQgej1YNCgiVGl0bGUiKSxbTywkXT1TKCExKSxfPVo/P3ouZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsQT1KPz8oei5kZXZpY2VSdW50aW1lP3ouZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooTSk9PnskKCEwKSxRPy4oTSl9LG9uTW91c2VMZWF2ZTooTSk9PnskKCExKSxLPy4oTSl9LHN0eWxlOnsuLi5iNixiYWNrZ3JvdW5kOk8/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi5XLGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W18sIVkmJk4oInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46TigicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksTigic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46QX0pXX0pfSksUjY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBqNih7c3R5bGU6WCwuLi5afSl7cmV0dXJuIE4oImRpdiIse3N0eWxlOnsuLi5SNiwuLi5YfSwuLi5afSl9dmFyIHY2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LFo0PUQwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlosc3R5bGU6SixkaXNhYmxlZDpZLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpRLGNoaWxkcmVuOkssLi4uV30sRyl7bGV0IHo9UjAoazQpLE89WXx8Wnx8ej8uZGlzYWJsZWQsWyQsX109UyghMSk7cmV0dXJuIE4oImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6Tyxvbk1vdXNlRW50ZXI6KEEpPT57XyghMCkscT8uKEEpfSxvbk1vdXNlTGVhdmU6KEEpPT57XyghMSksUT8uKEEpfSxzdHlsZTp7Li4udjYsY29sb3I6Tz8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDokJiYhTz8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpPPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLkp9LC4uLlcsY2hpbGRyZW46S30pfSk7ZnVuY3Rpb24geTYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFopPT5gLWUgJyR7Wn0nYCkucmVkdWNlKChaLEopPT5gJHtafSAke0p9YCwib3Nhc2NyaXB0Iil9dmFyIHA2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOk4oInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxnNj1OKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbTigicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLE4oImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLHg2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiSG9tZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMoeTYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5KLGNoaWxkcmVuOnA2fSl9KSxtNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLkosY2hpbGRyZW46ZzZ9KX0pLGY2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiBOKFo0LHtyZWY6WSwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KFEpPT57aWYoWj8uKFEpLFEuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5KLGNoaWxkcmVuOng2fSl9KSx0PVQ2O3QuVGl0bGU9UzY7dC5BY3Rpb25zPWo2O3QuQnV0dG9uPVo0O3QuSG9tZUJ1dHRvbj1oNjt0LlNjcmVlbnNob3RCdXR0b249bTY7dC5Sb3RhdGVCdXR0b249ZjY7ZnVuY3Rpb24gZDYoWCl7bGV0W1osSl09UyhudWxsKSxZPXcobmV3IFNldCksW3EsUV09UyhudWxsKSxLPWooKFcpPT57cmV0dXJuIFkuY3VycmVudC5hZGQoVyksKCk9PntZLmN1cnJlbnQuZGVsZXRlKFcpfX0sW10pO3JldHVybiBnKCgpPT57aWYoIVgpcmV0dXJuO2xldCBXPW5ldyBBYm9ydENvbnRyb2xsZXIsRz1YLnJlcGxhY2UoL1wvc3RyZWFtXC5tanBlZyQvLCIiKTtyZXR1cm4gZmV0Y2goYCR7R30vY29uZmlnYCx7c2lnbmFsOlcuc2lnbmFsfSkudGhlbigoeik9PnouanNvbigpKS50aGVuKCh6KT0+e2lmKHoud2lkdGg+MCYmei5oZWlnaHQ+MClKKHopfSkuY2F0Y2goKCk9Pnt9KSwoYXN5bmMoKT0+e3RyeXtsZXQgTz0oYXdhaXQgZmV0Y2goWCx7c2lnbmFsOlcuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFPKXJldHVybjtsZXQgJD1uZXcgVWludDhBcnJheSgwKTt3aGlsZSghMCl7bGV0e2RvbmU6Xyx2YWx1ZTpBfT1hd2FpdCBPLnJlYWQoKTtpZihfKWJyZWFrO2xldCBNPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoK0EubGVuZ3RoKTtNLnNldCgkKSxNLnNldChBLCQubGVuZ3RoKSwkPU07d2hpbGUoITApe2xldCBVPS0xO2ZvcihsZXQgRT0wO0U8JC5sZW5ndGgtMTtFKyspaWYoJFtFXT09PTI1NSYmJFtFKzFdPT09MjE2KXtVPUU7YnJlYWt9aWYoVT09PS0xKWJyZWFrO2xldCBrPS0xO2ZvcihsZXQgRT1VKzI7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTcpe2s9RSsyO2JyZWFrfWlmKGs9PT0tMSlicmVhaztsZXQgST0kLnNsaWNlKFUsayk7JD0kLnNsaWNlKGspO2xldCBDPW5ldyBCbG9iKFtJXSx7dHlwZToiaW1hZ2UvanBlZyJ9KSxoPVVSTC5jcmVhdGVPYmplY3RVUkwoQyk7UShoKTtmb3IobGV0IEUgb2YgWS5jdXJyZW50KUUoaCl9fX1jYXRjaHt9fSkoKSwoKT0+Vy5hYm9ydCgpfSxbWF0pLHtzdWJzY3JpYmVGcmFtZTpLLGZyYW1lOnEsY29uZmlnOlp9fXZhciBhNj17S2V5QTo0LEtleUI6NSxLZXlDOjYsS2V5RDo3LEtleUU6OCxLZXlGOjksS2V5RzoxMCxLZXlIOjExLEtleUk6MTIsS2V5SjoxMyxLZXlLOjE0LEtleUw6MTUsS2V5TToxNixLZXlOOjE3LEtleU86MTgsS2V5UDoxOSxLZXlROjIwLEtleVI6MjEsS2V5UzoyMixLZXlUOjIzLEtleVU6MjQsS2V5VjoyNSxLZXlXOjI2LEtleVg6MjcsS2V5WToyOCxLZXlaOjI5LERpZ2l0MTozMCxEaWdpdDI6MzEsRGlnaXQzOjMyLERpZ2l0NDozMyxEaWdpdDU6MzQsRGlnaXQ2OjM1LERpZ2l0NzozNixEaWdpdDg6MzcsRGlnaXQ5OjM4LERpZ2l0MDozOSxFbnRlcjo0MCxFc2NhcGU6NDEsQmFja3NwYWNlOjQyLFRhYjo0MyxTcGFjZTo0NCxNaW51czo0NSxFcXVhbDo0NixCcmFja2V0TGVmdDo0NyxCcmFja2V0UmlnaHQ6NDgsQmFja3NsYXNoOjQ5LFNlbWljb2xvbjo1MSxRdW90ZTo1MixCYWNrcXVvdGU6NTMsQ29tbWE6NTQsUGVyaW9kOjU1LFNsYXNoOjU2LENhcHNMb2NrOjU3LEYxOjU4LEYyOjU5LEYzOjYwLEY0OjYxLEY1OjYyLEY2OjYzLEY3OjY0LEY4OjY1LEY5OjY2LEYxMDo2NyxGMTE6NjgsRjEyOjY5LFByaW50U2NyZWVuOjcwLFNjcm9sbExvY2s6NzEsUGF1c2U6NzIsSW5zZXJ0OjczLEhvbWU6NzQsUGFnZVVwOjc1LERlbGV0ZTo3NixFbmQ6NzcsUGFnZURvd246NzgsQXJyb3dSaWdodDo3OSxBcnJvd0xlZnQ6ODAsQXJyb3dEb3duOjgxLEFycm93VXA6ODIsTnVtTG9jazo4MyxOdW1wYWREaXZpZGU6ODQsTnVtcGFkTXVsdGlwbHk6ODUsTnVtcGFkU3VidHJhY3Q6ODYsTnVtcGFkQWRkOjg3LE51bXBhZEVudGVyOjg4LE51bXBhZDE6ODksTnVtcGFkMjo5MCxOdW1wYWQzOjkxLE51bXBhZDQ6OTIsTnVtcGFkNTo5MyxOdW1wYWQ2Ojk0LE51bXBhZDc6OTUsTnVtcGFkODo5NixOdW1wYWQ5Ojk3LE51bXBhZDA6OTgsTnVtcGFkRGVjaW1hbDo5OSxDb250cm9sTGVmdDoyMjQsU2hpZnRMZWZ0OjIyNSxBbHRMZWZ0OjIyNixNZXRhTGVmdDoyMjcsQ29udHJvbFJpZ2h0OjIyOCxTaGlmdFJpZ2h0OjIyOSxBbHRSaWdodDoyMzAsTWV0YVJpZ2h0OjIzMX07ZnVuY3Rpb24gbDYoWCl7cmV0dXJuIGE2W1hdPz9udWxsfWFzeW5jIGZ1bmN0aW9uIE8wKFgpe3JldHVybihhd2FpdCBmZXRjaCgiL2V4ZWMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7Y29tbWFuZDpYfSl9KSkuanNvbigpfWZ1bmN0aW9uIGM2KFgpe3RyeXtsZXQgWj1KU09OLnBhcnNlKFgpLEo9W107Zm9yKGxldFtZLHFdb2YgT2JqZWN0LmVudHJpZXMoWi5kZXZpY2VzPz97fSkpe2xldCBRPVkucmVwbGFjZSgvXmNvbVwuYXBwbGVcLkNvcmVTaW11bGF0b3JcLlNpbVJ1bnRpbWVcLi8sIiIpLnJlcGxhY2UoLy0vZywiLiIpO2ZvcihsZXQgSyBvZiBxKWlmKEsuaXNBdmFpbGFibGUpSi5wdXNoKHt1ZGlkOksudWRpZCxuYW1lOksubmFtZSxzdGF0ZTpLLnN0YXRlLHJ1bnRpbWU6UX0pfXJldHVybiBKfWNhdGNoe3JldHVybltdfX1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5pbmNsdWRlcygiaXBob25lIikpcmV0dXJuIDA7aWYoWi5pbmNsdWRlcygiaXBhZCIpKXJldHVybiAxO2lmKFouaW5jbHVkZXMoIndhdGNoIikpcmV0dXJuIDI7aWYoWi5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24geTUoWCl7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouc3RhcnRzV2l0aCgiaW9zIikpcmV0dXJuIDA7aWYoWi5zdGFydHNXaXRoKCJpcGFkb3MiKSlyZXR1cm4gMTtpZihaLnN0YXJ0c1dpdGgoIndhdGNob3MiKSlyZXR1cm4gMjtpZihaLnN0YXJ0c1dpdGgoInZpc2lvbm9zIil8fFouc3RhcnRzV2l0aCgieHJvcyIpKXJldHVybiAzO3JldHVybiA0fWZ1bmN0aW9uIGk2KHtkZXZpY2VzOlgsc2VsZWN0ZWRVZGlkOlosbG9hZGluZzpKLGVycm9yOlksc3RvcHBpbmdVZGlkczpxLG9uUmVmcmVzaDpRLG9uU2VsZWN0Okssb25TdG9wOlcsdHJpZ2dlcjpHfSl7bGV0W3osT109UyghMSksJD13KG51bGwpO2coKCk9PntpZigheilyZXR1cm47bGV0IFU9KGspPT57aWYoISQuY3VycmVudD8uY29udGFpbnMoay50YXJnZXQpKU8oITEpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFUpfSxbel0pO2xldCBfPW5ldyBNYXA7Zm9yKGxldCBVIG9mIFgpe2lmKFUudWRpZD09PVopY29udGludWU7bGV0IGs9Xy5nZXQoVS5ydW50aW1lKTtpZighaylrPVtdLF8uc2V0KFUucnVudGltZSxrKTtrLnB1c2goVSl9Zm9yKGxldCBVIG9mIF8udmFsdWVzKCkpVS5zb3J0KChrLEkpPT52NShrLm5hbWUpLXY1KEkubmFtZSl8fGsubmFtZS5sb2NhbGVDb21wYXJlKEkubmFtZSkpO2xldCBBPVsuLi5fLmVudHJpZXMoKV0uc29ydCgoW1VdLFtrXSk9Pnk1KFUpLXk1KGspfHxVLmxvY2FsZUNvbXBhcmUoaykpLE09WC5maW5kKChVKT0+VS51ZGlkPT09Wik/P251bGw7cmV0dXJuIE4oImRpdiIse3JlZjokLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUifSxjaGlsZHJlbjpbTigiZGl2Iix7b25DbGljazooKT0+e2lmKCF6KVEoKTtPKChVKT0+IVUpfSxjaGlsZHJlbjpHfSkseiYmTigiZGl2Iix7c3R5bGU6bzYsY2hpbGRyZW46W04oImRpdiIse3N0eWxlOnM2LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6e2ZvbnRXZWlnaHQ6NjAwfSxjaGlsZHJlbjoiU2ltdWxhdG9ycyJ9KSxOKCJidXR0b24iLHtvbkNsaWNrOihVKT0+e1Uuc3RvcFByb3BhZ2F0aW9uKCksUSgpfSxkaXNhYmxlZDpKLHN0eWxlOnI2LGNoaWxkcmVuOko/Ii4uLiI6IlJlZnJlc2gifSldfSksWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46WX0pLE0mJk4oZix7Y2hpbGRyZW46W04oImRpdiIse3N0eWxlOnsuLi5nNSxjb2xvcjoiI2E1YjRmYyJ9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6cDUoTS5zdGF0ZT09PSJCb290ZWQiPyIjNGFkZTgwIjoiIzQ0NCIpfSksTigic3BhbiIse3N0eWxlOntmbGV4OjF9LGNoaWxkcmVuOk0ubmFtZX0pXX0pLE4oImRpdiIse3N0eWxlOm42fSldfSksWC5sZW5ndGg9PT0wJiYhSiYmIVkmJk4oImRpdiIse3N0eWxlOmU2LGNoaWxkcmVuOiJObyBhdmFpbGFibGUgc2ltdWxhdG9ycyBmb3VuZCJ9KSxBLm1hcCgoW1Usa10pPT5OKCJkaXYiLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6WDcsY2hpbGRyZW46VX0pLGsubWFwKChJKT0+e2xldCBDPXEuaGFzKEkudWRpZCksaD1JLnN0YXRlPT09IkJvb3RlZCI7cmV0dXJuIE4oImRpdiIse3N0eWxlOmc1LG9uTW91c2VFbnRlcjooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDI1NSwyNTUsMjU1LDAuMDgpIixvbk1vdXNlTGVhdmU6KEUpPT5FLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZD0idHJhbnNwYXJlbnQiLG9uQ2xpY2s6KCk9PntLKEkpLE8oITEpfSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnA1KGg/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46SS5uYW1lfSksaCYmTigic3BhbiIse3JvbGU6ImJ1dHRvbiIsb25DbGljazooRSk9PntpZihFLnN0b3BQcm9wYWdhdGlvbigpLCFDKVcoSS51ZGlkKX0sc3R5bGU6e2ZvbnRTaXplOjEwLHBhZGRpbmc6IjFweCA2cHgiLGJvcmRlclJhZGl1czo0LGNvbG9yOkM/IiM4ODgiOiIjZjg3MTcxIixiYWNrZ3JvdW5kOkM/InRyYW5zcGFyZW50IjoicmdiYSgyNDgsMTEzLDExMywwLjEpIixjdXJzb3I6Qz8iZGVmYXVsdCI6InBvaW50ZXIifSxjaGlsZHJlbjpDPyJTdG9wcGluZy4uLiI6IlN0b3AifSldfSxJLnVkaWQpfSldfSxVKSldfSldfSl9ZnVuY3Rpb24gcDUoWCl7cmV0dXJue3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6WCxmbGV4U2hyaW5rOjB9fWZ1bmN0aW9uIHU2KCl7bGV0IFg9d2luZG93Ll9fU0lNX1BSRVZJRVdfXyxbWixKXT1TKCExKSxbWSxxXT1TKFtdKSxbUSxLXT1TKCExKSxbVyxHXT1TKG51bGwpLFt6LE9dPVMobmV3IFNldCksWyQsX109UyghMSksQT1qKGFzeW5jKCk9PntLKCEwKSxHKG51bGwpO3RyeXtsZXQgRj1hd2FpdCBPMCgieGNydW4gc2ltY3RsIGxpc3QgZGV2aWNlcyBhdmFpbGFibGUgLWoiKTtpZihGLmV4aXRDb2RlIT09MCl0aHJvdyBFcnJvcihGLnN0ZGVycnx8InNpbWN0bCBsaXN0IGZhaWxlZCIpO3EoYzYoRi5zdGRvdXQpKX1jYXRjaChGKXtHKEYgaW5zdGFuY2VvZiBFcnJvcj9GLm1lc3NhZ2U6IkZhaWxlZCB0byBsaXN0IGRldmljZXMiKX1maW5hbGx5e0soITEpfX0sW10pO2lmKGcoKCk9PntBKCl9LFtBXSksZygoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBGPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksUj1uZXcgTWFwLHY9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBUKEowKXtsZXQgeT1SLmdldChKMCk7aWYoIXkpe2xldCBYMD0wO2ZvcihsZXQgYT0wO2E8SjAubGVuZ3RoO2ErKylYMD0oWDA8PDUpLVgwK0owLmNoYXJDb2RlQXQoYSl8MDt5PXZbTWF0aC5hYnMoWDApJXYubGVuZ3RoXSxSLnNldChKMCx5KX1yZXR1cm4geX1sZXQgdT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oSjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoSjAuZGF0YSksWDA9eS5wcm9jZXNzSW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz95LnNlbmRlckltYWdlUGF0aD8uc3BsaXQoIi8iKS5wb3AoKT8/IiIsYT15LnN1YnN5c3RlbT8/IiIsVjA9eS5jYXRlZ29yeT8/IiIsWTA9eS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFZMClyZXR1cm47aWYoWDAhPT11KXtpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtsZXQgTTA9VChYMCk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke1gwfSR7YT9gICVjJHthfSR7VjA/IjoiK1YwOiIifWA6IiJ9YCxgY29sb3I6JHtNMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4uYT9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLG09ITAsdT1YMH1sZXQgYz0oeS5tZXNzYWdlVHlwZT8/IiIpLnRvTG93ZXJDYXNlKCksbz1hJiZYMD09PXU/YCVjJHtWMHx8YX0lYyBgOiIiLEEwPW8/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGM9PT0iZmF1bHQifHxjPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihjPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHtvfSVjJHtZMH1gLC4uLkEwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBNPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbDtnKCgpPT57ZG9jdW1lbnQudGl0bGU9TT8ubmFtZT9gU2ltdWxhdG9yIC0gJHtNLm5hbWV9YDoiU2ltdWxhdG9yIFByZXZpZXcifSxbTT8ubmFtZV0pO2xldCBVPWswKE0/Lm5hbWUpLGs9JDBbVV0sST1rLndpZHRoLTIqay5iZXplbFgsQz1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoVSksRT1VPT09InZpc2lvbiI/NTgwOlU9PT0iaXBhZCI/NDAwOlU9PT0id2F0Y2giPzIwMDozMjAsZT1kNihYLnN0cmVhbVVybCksWjA9dyhudWxsKTtnKCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsWjAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFowLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IHg9aigoRixSKT0+e2xldCB2PVowLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLHU9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7dVswXT1GLHUuc2V0KFQsMSksdi5zZW5kKHUpfSxbXSksSzA9aigoRik9PngoMyxGKSxbeF0pLHM9aigoRik9PngoNSxGKSxbeF0pLHI9aigoRik9PngoNCx7YnV0dG9uOkZ9KSxbeF0pLFUwPWooKEYsUik9Pnt4KDYse3R5cGU6Rix1c2FnZTpSfSl9LFt4XSksW2owLHYwXT1TKG51bGwpO2coKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgdT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksdSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e1UwKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLFUwKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksVTAoInVwIiwyMjcpfSxbVTBdKTtnKCgpPT57bGV0IEY9KFQsdSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLHU9PT0iZG93biImJiFULnJlcGVhdCl4KDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSx1PT09ImRvd24iJiYhVC5yZXBlYXQpTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoSjApPT57bGV0IHk9SjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gTzAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWw2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLHgoNix7dHlwZTp1LHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbeCxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IE8wKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBPMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57TygoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgTzAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgQSgpfWZpbmFsbHl7TygoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbQV0pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6TzAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOk0/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpNPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihpNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOkEsb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtDfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOmUuc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6ZS5mcmFtZSxzdHJlYW1Db25maWc6ZS5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0sbzY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSxzNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0scjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sdDY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LGc1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxuNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LGU2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sWDc9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtPNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTih1Nix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return P}function Ie(e){let _=(e?.basePath??"/.sim").replace(/\/+$/,"");return(t,s,r)=>{let S=t.url??"";if(S===_||S===_+"/"){let C=h()[0]??null,$=Me();if(C){let n=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...C,logsEndpoint:_+"/logs"})}</script>`;$=$.replace("<!--__SIM_PREVIEW_CONFIG__-->",n)}s.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),s.end($);return}if(S===_+"/api"){let o=h();s.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),s.end(JSON.stringify(o[0]||null));return}if((S===_+"/exec"||S===_+"/exec/")&&t.method==="POST"){let o="";t.on("data",(C)=>{o+=typeof C==="string"?C:C.toString()}),t.on("end",()=>{let C="";try{C=JSON.parse(o).command??""}catch{}if(!C){s.writeHead(400,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}Oe(C,{maxBuffer:16777216},($,i,n)=>{s.writeHead(200,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:i.toString(),stderr:n.toString(),exitCode:$?$.code??1:0}))})});return}if(S===_+"/logs"||S.startsWith(_+"/logs?")){let o=h();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let C=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
|
|
4
4
|
|
|
5
|
-
`);let $=
|
|
6
|
-
`))!==-1){let y=
|
|
5
|
+
`);let $=x("xcrun",["simctl","spawn",C,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),i="";$.stdout.on("data",(n)=>{i+=n.toString();let a;while((a=i.indexOf(`
|
|
6
|
+
`))!==-1){let y=i.slice(0,a).trim();if(i=i.slice(a+1),y)s.write("data: "+y+`
|
|
7
7
|
|
|
8
|
-
`)}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(
|
|
8
|
+
`)}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(S===_+"/appstate"||S.startsWith(_+"/appstate?")){let o=h();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let C=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
|
|
9
9
|
|
|
10
|
-
`);let $=
|
|
11
|
-
`))!==-1){let
|
|
10
|
+
`);let $=x("xcrun",["simctl","spawn",C,"log","stream","--style","ndjson","--level","info","--predicate",'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"'],{stdio:["ignore","pipe","ignore"]}),i=/\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/,n="",a="";$.stdout.on("data",(y)=>{a+=y.toString();let R;while((R=a.indexOf(`
|
|
11
|
+
`))!==-1){let D=a.slice(0,R).trim();if(a=a.slice(R+1),!D)continue;let A;try{A=JSON.parse(D).eventMessage??""}catch{continue}let c=i.exec(A);if(!c)continue;let B=c[1],W=parseInt(c[2],10);if(!We(B))continue;if(B===n)continue;n=B,Pe(C,B).then((Te)=>{s.write("data: "+JSON.stringify({bundleId:B,pid:W,isReactNative:Te})+`
|
|
12
12
|
|
|
13
|
-
`)})}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(r)r()}}var
|
|
14
|
-
Checked: ${
|
|
15
|
-
`).map((s)=>parseInt(s,10)).filter((s)=>Number.isFinite(s)&&s!==t)}catch{return[]}}function
|
|
16
|
-
${
|
|
17
|
-
==> ${
|
|
18
|
-
==> ${
|
|
19
|
-
Shutting down...`);for(let[a
|
|
13
|
+
`)})}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(r)r()}}var K,Ne,Ve,Le,b,P=null;var z=Fe(()=>{K=q(He(),"serve-sim"),Ne=new Set(["host.exp.Exponent","dev.expo.Exponent"]),Ve=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],Le=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;b={at:0,booted:null}});import{execSync as T,spawn as Z}from"child_process";import{chmodSync as Ue,existsSync as l,mkdirSync as Y,openSync as ee,closeSync as _e,readFileSync as H,unlinkSync as N,writeFileSync as te}from"fs";import{createHash as ke}from"crypto";import{homedir as Xe,networkInterfaces as Ge}from"os";import{join as xe,resolve as M}from"path";import{tmpdir as le}from"os";import{join as g}from"path";import{readdirSync as ue}from"fs";var p=g(le(),"serve-sim"),c_=g(p,"server.json");function w(e){return g(p,`server-${e}.json`)}function v(){try{return ue(p).filter((e)=>e.startsWith("server-")&&e.endsWith(".json")).map((e)=>g(p,e))}catch{return[]}}var d="./serve-sim-bin-jx3xe3v9.";function X(){if(!l(p))Y(p,{recursive:!0})}function E(e){if(e)return I(w(e));for(let _ of v()){let t=I(_);if(t)return t}return null}var O={at:0,booted:null};function Ke(){let e=Date.now();if(O.booted&&e-O.at<1000)return O.booted;try{let _=T("xcrun simctl list devices booted -j",{encoding:"utf-8",stdio:["ignore","pipe","pipe"],timeout:3000}),t=JSON.parse(_),s=new Set;for(let r of Object.values(t.devices))for(let S of r)if(S.state==="Booted")s.add(S.udid);return O={at:e,booted:s},s}catch{return null}}function I(e){try{if(!l(e))return null;let _=JSON.parse(H(e,"utf-8"));try{process.kill(_.pid,0)}catch{return N(e),null}let t=Ke();if(t&&!t.has(_.device)){console.error(`[serve-sim] Helper pid ${_.pid} is bound to device ${_.device} which is no longer booted \u2014 killing stale helper.`);try{process.kill(_.pid,"SIGTERM")}catch{}try{N(e)}catch{}return null}return _}catch{return null}}function V(){let e=[];for(let _ of v()){let t=I(_);if(t)e.push(t)}return e}function Q(e){X(),te(w(e.device),JSON.stringify(e,null,2))}function u(e){if(e)try{N(w(e))}catch{}else for(let _ of v())try{N(_)}catch{}}function je(){let e=d.startsWith("/$bunfs/");if(!e&&l(d))return d;if(!e){let S=M(import.meta.dir,"../bin/serve-sim-bin");if(l(S))return S;throw Error(`serve-sim-bin not found. Run 'bun run build:swift' first.
|
|
14
|
+
Checked: ${d}, ${S}`)}let _=H(d),t=ke("sha256").update(_).digest("hex").slice(0,16),s=M(Xe(),"Library/Caches/serve-sim");Y(s,{recursive:!0});let r=M(s,`serve-sim-bin-${t}`);if(!l(r)){te(r,_),Ue(r,493);try{T(`codesign -s - -f ${JSON.stringify(r)}`,{stdio:"ignore"})}catch{}}return r}function se(){try{let e=T("xcrun simctl list devices booted -j",{encoding:"utf-8"}),_=JSON.parse(e);for(let t of Object.values(_.devices))for(let s of t)if(s.state==="Booted")return s.udid}catch{}return null}function J(e){try{let _=T("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let r of s)if(r.udid===e)return r.name}catch{}return null}function L(e){if(/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(e))return e;try{let _=T("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let r of s)if(r.name.toLowerCase()===e.toLowerCase())return r.udid}catch{}console.error(`Could not resolve device: ${e}`),process.exit(1)}function Se(e){try{let _=T("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let r of s)if(r.udid===e)return r.state==="Booted"}catch{}return!1}function U(e){try{return process.kill(e,0),!0}catch{return!1}}function k(e){try{process.kill(e,"SIGTERM")}catch{return}let _=Date.now()+500;while(Date.now()<_)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}try{process.kill(e,"SIGKILL")}catch{}let t=Date.now()+500;while(Date.now()<t)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}}function ze(e){try{let _=T(`lsof -ti tcp:${e}`,{encoding:"utf-8",stdio:"pipe"}).trim();if(!_)return[];let t=process.pid;return _.split(`
|
|
15
|
+
`).map((s)=>parseInt(s,10)).filter((s)=>Number.isFinite(s)&&s!==t)}catch{return[]}}function Qe(e){let _=ze(e);if(_.length===0)return;console.log(`\x1B[90mPort ${e} busy, killing holder pid(s): ${_.join(", ")}\x1B[0m`);for(let t of _)try{process.kill(t,"SIGKILL")}catch{}Bun.sleepSync(100)}function Je(e){if(!Se(e))try{T(`xcrun simctl boot ${e}`,{encoding:"utf-8",stdio:"pipe"})}catch(_){let t=(_.stderr??_.message??"").toLowerCase();if(!t.includes("booted")&&!t.includes("current state"))throw Error(`Failed to boot device ${e}: ${_.stderr||_.message}`)}try{T("open -ga Simulator",{encoding:"utf-8",stdio:"pipe",timeout:3000})}catch{}}function Ze(){let e=Ge();for(let _ of Object.values(e))for(let t of _??[])if(t.family==="IPv4"&&!t.internal)return t.address;return null}async function ie(e){let _=new Set(V().map((t)=>t.port));for(let t=e;t<e+100;t++){if(_.has(t))continue;try{return Bun.serve({port:t,fetch:()=>new Response("ok")}).stop(!0),t}catch{continue}}throw Error(`No available port found in range ${e}-${e+99}`)}async function Ye(e){Je(e);try{T(`xcrun simctl bootstatus ${e} -b`,{encoding:"utf-8",stdio:"pipe",timeout:60000})}catch(_){if(!Se(e))console.error(`Device ${e} failed to reach booted state: ${_.stderr||_.message}`),process.exit(1)}}async function re(e,_,t,s){let r=!1;for(let o=0;o<30;o++){if(!s())break;try{if((await fetch(`${_}/health`)).ok){r=!0;break}}catch{}await new Promise((C)=>setTimeout(C,100))}if(r){let o=Date.now()+8000;while(Date.now()<o){if(await new Promise((C)=>setTimeout(C,200)),!s()){r=!1;break}try{if(H(t,"utf-8").includes("Capture started"))break}catch{}}}let S="";try{S=H(t,"utf-8").trim()}catch{}return{ready:r,log:S}}async function e_(e){let{helperPath:_,udid:t,port:s,host:r,logFile:S}=e,o=`http://${r}:${s}`;X();let C=ee(S,"w"),$=Z(_,[t,"--port",String(s)],{detached:!0,stdio:["ignore",C,C]});$.unref(),_e(C);let i=$.pid,n=!1;$.once("exit",()=>{n=!0});let{ready:a,log:y}=await re(i,o,S,()=>!n&&U(i));return{ready:a,pid:i,exited:n||!U(i),log:y}}async function __(e){let{helperPath:_,udid:t,port:s,host:r,logFile:S}=e,o=`http://${r}:${s}`;X();let C=ee(S,"w"),$=Z(_,[t,"--port",String(s)],{detached:!1,stdio:["ignore",C,C]});_e(C);let i=$.pid,n=!1;$.once("exit",()=>{n=!0});let{ready:a,log:y}=await re(i,o,S,()=>!n&&U(i));return{ready:a,child:$,log:y}}async function Ce(e,_,t){await Ye(e);let s="127.0.0.1",r=je(),S=xe(p,`server-${e}.log`),o={helperPath:r,udid:e,port:_,host:s,logFile:S},C="",$=2;for(let n=1;n<=$;n++){if(Qe(_),t.detach){let a=await e_(o);if(a.ready){let y={pid:a.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return Q(y),{pid:a.pid}}k(a.pid),C=a.log}else{let a=await __(o);if(a.ready){let y={pid:a.child.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return Q(y),{pid:a.child.pid,child:a.child}}k(a.child.pid),C=a.log}if(n<$)await new Promise((a)=>setTimeout(a,500))}let i=C?`Helper failed:
|
|
16
|
+
${C}`:"Helper process failed to start";console.error(i),process.exit(1)}async function t_(e,_,t){let s=e.length>0?e.map(L):(()=>{let i=se();if(!i)console.error("No device specified and no booted simulator found."),process.exit(1);return[i]})(),r=new Map,S=[],o=_;for(let i of s){let n=E(i);if(n){if(!t){let A=J(i)??i;if(s.length>1)console.log(`
|
|
17
|
+
==> ${A} (${i}) <==`);console.log(` Already running on port ${n.port}`),console.log(` Stream: ${n.streamUrl}`),console.log(` WebSocket: ${n.wsUrl}`)}S.push(n);continue}o=await ie(o);let{pid:a,child:y}=await Ce(i,o,{detach:!1});if(y)r.set(i,y);let R="127.0.0.1",D={pid:a,port:o,device:i,url:`http://${R}:${o}`,streamUrl:`http://${R}:${o}/stream.mjpeg`,wsUrl:`ws://${R}:${o}/ws`};if(S.push(D),!t){let A=J(i)??i;if(s.length>1)console.log(`
|
|
18
|
+
==> ${A} (${i}) <==`);console.log(` Stream: ${D.streamUrl}`),console.log(` WebSocket: ${D.wsUrl}`),console.log(` Port: ${o}`)}o++}if(S.length===1){let i=S[0];console.log(JSON.stringify({url:i.url,streamUrl:i.streamUrl,wsUrl:i.wsUrl,port:i.port,device:i.device}))}else console.log(JSON.stringify({devices:S.map((i)=>({url:i.url,streamUrl:i.streamUrl,wsUrl:i.wsUrl,port:i.port,device:i.device}))}));if(r.size===0)return;let C=!1,$=(i)=>{if(C)return;if(C=!0,!t)console.log(`
|
|
19
|
+
Shutting down...`);for(let[n,a]of r){let y=a.pid;if(y)k(y);u(n)}r.clear(),process.exit(i)};for(let[i,n]of r)n.on("exit",(a)=>{if(C)return;if(!t)console.error(`[${i}] Helper exited (code ${a})`);if(u(i),r.delete(i),r.size===0)$(a??1)});process.on("SIGINT",()=>$(0)),process.on("SIGTERM",()=>$(0)),process.on("SIGHUP",()=>$(0)),process.on("exit",()=>{for(let[i,n]of r){try{if(n.pid)process.kill(n.pid,"SIGTERM")}catch{}try{u(i)}catch{}}}),await new Promise(()=>{})}async function oe(e,_){let t=e.length>0?e.map(L):(()=>{let S=se();if(!S)console.error("No device specified and no booted simulator found."),process.exit(1);return[S]})(),s=[],r=_;for(let S of t){let o=E(S);if(o){s.push(o);continue}r=await ie(r),await Ce(S,r,{detach:!0});let C="127.0.0.1";s.push({pid:E(S).pid,port:r,device:S,url:`http://${C}:${r}`,streamUrl:`http://${C}:${r}/stream.mjpeg`,wsUrl:`ws://${C}:${r}/ws`}),r++}return s}function s_(e){if(e.length===1){let _=e[0];console.log(JSON.stringify({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}else console.log(JSON.stringify({devices:e.map((_)=>({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}))}function S_(e){if(e){let t=L(e),s=E(t);if(!s)console.log(JSON.stringify({running:!1,device:t}));else console.log(JSON.stringify({running:!0,url:s.url,streamUrl:s.streamUrl,wsUrl:s.wsUrl,port:s.port,device:s.device,pid:s.pid}));return}let _=V();if(_.length===0)console.log(JSON.stringify({running:!1}));else if(_.length===1){let t=_[0];console.log(JSON.stringify({running:!0,url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}else console.log(JSON.stringify({running:!0,streams:_.map((t)=>({url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}))}function i_(e){if(e){let _=L(e),t=E(_);if(!t){console.log(JSON.stringify({disconnected:!0,device:_}));return}try{process.kill(t.pid,"SIGTERM")}catch{}u(_),console.log(JSON.stringify({disconnected:!0,device:t.device}))}else{let _=V();if(_.length===0){console.log(JSON.stringify({disconnected:!0,devices:[]}));return}let t=[];for(let s of _){try{process.kill(s.pid,"SIGTERM")}catch{}t.push(s.device)}u(),console.log(JSON.stringify({disconnected:!0,devices:t}))}}async function r_(e){let _,t=[];for(let o=0;o<e.length;o++)if(e[o]==="--device"||e[o]==="-d")_=e[++o];else t.push(e[o]);let s=E(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let r=t[0];if(!r)console.error("Usage: serve-sim gesture '<json>'"),console.error(`Example: serve-sim gesture '{"type":"begin","x":0.5,"y":0.5}'`),process.exit(1);let S;try{S=JSON.parse(r)}catch{console.error("Invalid JSON:",r),process.exit(1)}return new Promise((o,C)=>{let $=new WebSocket(s.wsUrl);$.binaryType="arraybuffer",$.onopen=()=>{let i=new TextEncoder().encode(JSON.stringify(S)),n=new Uint8Array(1+i.length);n[0]=3,n.set(i,1),$.send(n),setTimeout(()=>{$.close(),o()},50)},$.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),C(Error("WebSocket connection failed"))}})}async function C_(e){let _,t=[];for(let S=0;S<e.length;S++)if(e[S]==="--device"||e[S]==="-d")_=e[++S];else t.push(e[S]);let s=E(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let r=t[0]??"home";return new Promise((S,o)=>{let C=new WebSocket(s.wsUrl);C.binaryType="arraybuffer",C.onopen=()=>{let $=new TextEncoder().encode(JSON.stringify({button:r})),i=new Uint8Array(1+$.length);i[0]=4,i.set($,1),C.send(i),setTimeout(()=>{C.close(),S()},50)},C.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),o(Error("WebSocket connection failed"))}})}async function o_(e,_,t){if(V().length===0)console.log("Starting simulator stream..."),await oe(_,3100);let{simMiddleware:r}=await Promise.resolve().then(() => (z(),j)),S=r({basePath:"/"}),o=t?1:50,C=e,$,i=!1;for(let a=0;a<o;a++){let y=e+a;try{$_(y,S),C=y,i=!0;break}catch(R){if($=R,R?.code!=="EADDRINUSE")break}}if(!i){if($?.code==="EADDRINUSE")if(t)console.error(`Port ${e} is already in use. Pass a different --port or stop the other process.`);else console.error(`No available port found in range ${e}-${e+o-1}.`);else console.error(`Failed to start preview server: ${$?.message??$}`);process.exit(1)}let n=Ze();if(console.log(""),console.log(` - Local: http://localhost:${C}`),n)console.log(` - Network: http://${n}:${C}`);console.log(""),process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0)),await new Promise(()=>{})}function $_(e,_){return Bun.serve({port:e,idleTimeout:255,async fetch(t){let r=t.method!=="GET"&&t.method!=="HEAD"?new Uint8Array(await t.arrayBuffer()):null;return new Promise((S)=>{let o=new URL(t.url),C={},$={url:o.pathname+o.search,method:t.method,headers:Object.fromEntries(t.headers.entries()),on(A,c){(C[A]??=[]).push(c)}};t.signal.addEventListener("abort",()=>{for(let A of C.close??[])A()});let i=200,n=new Headers,a=[],y=!1,R=null;_($,{writeHead(A,c){if(i=A,c)for(let[B,W]of Object.entries(c))n.set(B,W)},setHeader(A,c){n.set(A,c)},get statusCode(){return i},set statusCode(A){i=A},write(A){if(!y){y=!0;let c=new ReadableStream({start(B){R=B}});S(new Response(c,{status:i,headers:n}))}try{R?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}},end(A){if(y){if(A)try{R?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}try{R?.close()}catch{}}else{if(A)a.push(A);let c=a.map((B)=>typeof B==="string"?B:new TextDecoder().decode(B)).join("");S(new Response(c,{status:i,headers:n}))}}},()=>{S(new Response("Not found",{status:404}))}),queueMicrotask(()=>{if(r&&r.length>0){let A=Buffer.from(r);for(let c of C.data??[])c(A)}for(let A of C.end??[])A()})})}})}function $e(){console.log(`
|
|
20
20
|
serve-sim - Stream iOS Simulator to the browser
|
|
21
21
|
|
|
22
22
|
Usage:
|
|
@@ -42,4 +42,4 @@ Examples:
|
|
|
42
42
|
serve-sim --detach Start streaming in background (daemon)
|
|
43
43
|
serve-sim --list Show all running streams
|
|
44
44
|
serve-sim --kill Stop all streams
|
|
45
|
-
`)}var
|
|
45
|
+
`)}var f=process.argv.slice(2);if(f[0]==="gesture")await r_(f.slice(1)),process.exit(0);if(f[0]==="button")await C_(f.slice(1)),process.exit(0);var F,ne=!1,ae=!1,Ae=!1,ye=!1,ce=!1,Re=!1,m=[],Be,fe;for(let e=0;e<f.length;e++){let _=f[e];switch(_){case"--port":case"-p":F=parseInt(f[++e]??"3100",10);break;case"--detach":case"-d":ne=!0;break;case"--quiet":case"-q":ae=!0;break;case"--no-preview":Re=!0;break;case"--list":case"-l":if(Ae=!0,f[e+1]&&!f[e+1].startsWith("-"))Be=f[++e];break;case"--kill":case"-k":if(ye=!0,f[e+1]&&!f[e+1].startsWith("-"))fe=f[++e];break;case"--help":case"-h":case"help":ce=!0;break;default:if(!_.startsWith("-"))m.push(_);else console.error(`Unknown flag: ${_}`),$e(),process.exit(1)}}if(ce)$e(),process.exit(0);if(Ae)S_(Be),process.exit(0);if(ye)i_(fe),process.exit(0);if(ne){let e=await oe(m,F??3100);s_(e)}else if(Re)await t_(m,F??3100,ae);else await o_(F??3200,m,F!==void 0);
|
package/package.json
CHANGED
package/src/middleware.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { readdirSync, readFileSync, existsSync } from "fs";
|
|
2
|
-
import { spawn, exec, execFile, type ChildProcess } from "child_process";
|
|
1
|
+
import { readdirSync, readFileSync, existsSync, unlinkSync } from "fs";
|
|
2
|
+
import { execSync, spawn, exec, execFile, type ChildProcess } from "child_process";
|
|
3
3
|
import { tmpdir } from "os";
|
|
4
4
|
import { join } from "path";
|
|
5
5
|
|
|
@@ -58,6 +58,37 @@ function detectReactNative(udid: string, bundleId: string): Promise<boolean> {
|
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
// Cache simctl's booted-device set briefly so per-request cost stays bounded.
|
|
62
|
+
// The middleware runs inside the user's dev server (Metro etc.) and
|
|
63
|
+
// readServeSimStates() is called on every /api and every page load.
|
|
64
|
+
let bootedSnapshot: { at: number; booted: Set<string> | null } = { at: 0, booted: null };
|
|
65
|
+
function getBootedUdids(): Set<string> | null {
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
if (bootedSnapshot.booted && now - bootedSnapshot.at < 1500) {
|
|
68
|
+
return bootedSnapshot.booted;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const output = execSync("xcrun simctl list devices booted -j", {
|
|
72
|
+
encoding: "utf-8",
|
|
73
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
74
|
+
timeout: 3_000,
|
|
75
|
+
});
|
|
76
|
+
const data = JSON.parse(output) as {
|
|
77
|
+
devices: Record<string, Array<{ udid: string; state: string }>>;
|
|
78
|
+
};
|
|
79
|
+
const booted = new Set<string>();
|
|
80
|
+
for (const runtime of Object.values(data.devices)) {
|
|
81
|
+
for (const device of runtime) {
|
|
82
|
+
if (device.state === "Booted") booted.add(device.udid);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
bootedSnapshot = { at: now, booted };
|
|
86
|
+
return booted;
|
|
87
|
+
} catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
61
92
|
function readServeSimStates(): ServeSimState[] {
|
|
62
93
|
let files: string[];
|
|
63
94
|
try {
|
|
@@ -67,14 +98,28 @@ function readServeSimStates(): ServeSimState[] {
|
|
|
67
98
|
} catch {
|
|
68
99
|
return [];
|
|
69
100
|
}
|
|
101
|
+
const booted = getBootedUdids();
|
|
70
102
|
const states: ServeSimState[] = [];
|
|
71
103
|
for (const f of files) {
|
|
104
|
+
const path = join(STATE_DIR, f);
|
|
72
105
|
try {
|
|
73
|
-
const state: ServeSimState = JSON.parse(readFileSync(
|
|
106
|
+
const state: ServeSimState = JSON.parse(readFileSync(path, "utf-8"));
|
|
74
107
|
try {
|
|
75
108
|
process.kill(state.pid, 0);
|
|
76
|
-
|
|
77
|
-
|
|
109
|
+
} catch {
|
|
110
|
+
try { unlinkSync(path); } catch {}
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
// Helper alive but its simulator was shut down — the MJPEG stream
|
|
114
|
+
// would accept connections yet never produce frames, leaving the
|
|
115
|
+
// preview stuck on "Connecting...". Recycle the stale state so the
|
|
116
|
+
// caller can spawn a fresh helper bound to whatever is booted.
|
|
117
|
+
if (booted && !booted.has(state.device)) {
|
|
118
|
+
try { process.kill(state.pid, "SIGTERM"); } catch {}
|
|
119
|
+
try { unlinkSync(path); } catch {}
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
states.push(state);
|
|
78
123
|
} catch {}
|
|
79
124
|
}
|
|
80
125
|
return states;
|