1 |
- {"remainingRequest":"E:\\boman-framwork\\ruoyi-ui\\node_modules\\thread-loader\\dist\\cjs.js!E:\\boman-framwork\\ruoyi-ui\\node_modules\\babel-loader\\lib\\index.js!E:\\boman-framwork\\ruoyi-ui\\src\\utils\\go.js","dependencies":[{"path":"E:\\boman-framwork\\ruoyi-ui\\src\\utils\\go.js","mtime":1619607677293},{"path":"E:\\boman-framwork\\ruoyi-ui\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\boman-framwork\\ruoyi-ui\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\boman-framwork\\ruoyi-ui\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:dmFyIF90eXBlb2Y9cmVxdWlyZSgiRTovYm9tYW4tZnJhbXdvcmsvcnVveWktdWkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mIikuZGVmYXVsdDtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvci5qcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3Rvci5qcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UuanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbi5qcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmZyZWV6ZS5qcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5pcy1mcm96ZW4uanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZC5qcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyIpO3JlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWxsLmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5saW5rLmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiKTtyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIik7cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL3dlYi51cmwudG8tanNvbi5qcyIpOy8qDQogKiBHb0pTIHYyLjAuOSBKYXZhU2NyaXB0IExpYnJhcnkgZm9yIEhUTUwgRGlhZ3JhbXMNCiAqIE5vcnRod29vZHMgU29mdHdhcmUsIGh0dHBzOi8vd3d3Lm53b29kcy5jb20vDQogKiBHb0pTIGFuZCBOb3J0aHdvb2RzIFNvZnR3YXJlIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgTm9ydGh3b29kcyBTb2Z0d2FyZSBDb3Jwb3JhdGlvbi4NCiAqIENvcHlyaWdodCAoQykgMTk5OC0yMDE5IGJ5IE5vcnRod29vZHMgU29mdHdhcmUgQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KICogVEhJUyBTT0ZUV0FSRSBJUyBMSUNFTlNFRC4gIFRIRSBMSUNFTlNFIEFHUkVFTUVOVCBJUyBBVDogaHR0cHM6Ly9nb2pzLm5ldC8yLjAuOS9saWNlbnNlLmh0bWwuDQogKi8oZnVuY3Rpb24oKXt2YXIgdDtmdW5jdGlvbiBhYShhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9O307fWZ1bmN0aW9uIGJhKGEpe3ZhciBiPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6e25leHQ6YWEoYSl9O31mdW5jdGlvbiBjYShhKXtmb3IodmFyIGIsYz1bXTshKGI9YS5uZXh0KCkpLmRvbmU7KXtjLnB1c2goYi52YWx1ZSk7fXJldHVybiBjO312YXIgZGE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/T2JqZWN0LmNyZWF0ZTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7fWIucHJvdG90eXBlPWE7cmV0dXJuIG5ldyBiKCk7fSxoYTtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LnNldFByb3RvdHlwZU9mKWhhPU9iamVjdC5zZXRQcm90b3R5cGVPZjtlbHNle3ZhciBrYTthOnt2YXIgbGE9e2E6ITB9LG1hPXt9O3RyeXttYS5fX3Byb3RvX189bGE7a2E9bWEuYTticmVhayBhO31jYXRjaChhKXt9a2E9ITE7fWhhPWthP2Z1bmN0aW9uKGEsYil7YS5fX3Byb3RvX189YjtpZihhLl9fcHJvdG9fXyE9PWIpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGV4dGVuc2libGUiKTtyZXR1cm4gYTt9Om51bGw7fXZhciBuYT1oYTtmdW5jdGlvbiBvYShhLGIpe2EucHJvdG90eXBlPWRhKGIucHJvdG90eXBlKTthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2lmKG5hKW5hKGEsYik7ZWxzZSBmb3IodmFyIGMgaW4gYil7aWYoInByb3RvdHlwZSIhPWMpaWYoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpe3ZhciBkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYixjKTtkJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxjLGQpO31lbHNlIGFbY109YltjXTt9YS5rQT1iLnByb3RvdHlwZTt9dmFyIHBhPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c9PT1zZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJm51bGwhPWdsb2JhbD9nbG9iYWw6c2VsZixxYT0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGEsYixjKXthIT1BcnJheS5wcm90b3R5cGUmJmEhPU9iamVjdC5wcm90b3R5cGUmJihhW2JdPWMudmFsdWUpO307ZnVuY3Rpb24gcmEoYSl7aWYoYSl7Zm9yKHZhciBiPXBhLGM9WyJBcnJheSIsInByb3RvdHlwZSIsImZpbGwiXSxkPTA7ZDxjLmxlbmd0aC0xO2QrKyl7dmFyIGU9Y1tkXTtlIGluIGJ8fChiW2VdPXt9KTtiPWJbZV07fWM9Y1tjLmxlbmd0aC0xXTtkPWJbY107YT1hKGQpO2EhPWQmJm51bGwhPWEmJnFhKGIsYyx7d3JpdGFibGU6ITAsdmFsdWU6YX0pO319cmEoZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihhLGMsZCl7dmFyIGI9dGhpcy5sZW5ndGh8fDA7MD5jJiYoYz1NYXRoLm1heCgwLGIrYykpO2lmKG51bGw9PWR8fGQ+YilkPWI7ZD1OdW1iZXIoZCk7MD5kJiYoZD1NYXRoLm1heCgwLGIrZCkpO2ZvcihjPU51bWJlcihjfHwwKTtjPGQ7YysrKXt0aGlzW2NdPWE7fXJldHVybiB0aGlzO307fSk7dmFyIHc9Im9iamVjdCI9PT0odHlwZW9mIHNlbGY9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHNlbGYpKSYmc2VsZi5zZWxmPT09c2VsZiYmc2VsZnx8Im9iamVjdCI9PT0odHlwZW9mIGdsb2JhbD09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YoZ2xvYmFsKSkmJmdsb2JhbC5nbG9iYWw9PT1nbG9iYWwmJmdsb2JhbHx8Im9iamVjdCI9PT0odHlwZW9mIHdpbmRvdz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yod2luZG93KSkmJndpbmRvdy53aW5kb3c9PT13aW5kb3cmJndpbmRvd3x8e307dm9pZCAwPT09dy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJih3LnJlcXVlc3RBbmltYXRpb25GcmFtZT13LnNldEltbWVkaWF0ZSk7ZnVuY3Rpb24gc2EoKXt9ZnVuY3Rpb24gdGEoYSxiKXt2YXIgYz0tMTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLGU9YXJndW1lbnRzOy0xIT09YyYmdy5jbGVhclRpbWVvdXQoYyk7Yz11YShmdW5jdGlvbigpe2M9LTE7YS5hcHBseShkLGUpO30sYik7fTt9ZnVuY3Rpb24gdWEoYSxiKXtyZXR1cm4gdy5zZXRUaW1lb3V0KGEsYik7fWZ1bmN0aW9uIHZhKGEpe3JldHVybiB3LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7fWZ1bmN0aW9uIEEoYSl7dGhyb3cgRXJyb3IoYSk7fWZ1bmN0aW9uIHdhKGEsYil7YT0iVGhlIG9iamVjdCBpcyBmcm96ZW4sIHNvIGl0cyBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBzZXQ6ICIrYS50b1N0cmluZygpO3ZvaWQgMCE9PWImJihhKz0iICB0byB2YWx1ZTogIitiKTtBKGEpO31mdW5jdGlvbiB4YShhLGIsYyxkKXtjPW51bGw9PT1jPyIqIjoic3RyaW5nIj09PXR5cGVvZiBjP2M6ImZ1bmN0aW9uIj09PXR5cGVvZiBjJiYic3RyaW5nIj09PXR5cGVvZiBjLmNsYXNzTmFtZT9jLmNsYXNzTmFtZToiIjt2b2lkIDAhPT1kJiYoYys9Ii4iK2QpO0EoYysiIGlzIG5vdCBpbiB0aGUgcmFuZ2UgIitiKyI6ICIrYSk7fWZ1bmN0aW9uIHlhKGEpe3cuY29uc29sZSYmdy5jb25zb2xlLmxvZyhhKTt9ZnVuY3Rpb24gemEoKXt3LmNvbnNvbGUmJncuY29uc29sZS5sb2coIldhcm5pbmc6IExpc3QvTWFwL1NldCBjb25zdHJ1Y3RvcnMgbm8gbG9uZ2VyIHRha2UgYW4gYXJndW1lbnQgdGhhdCBlbmZvcmNlcyB0eXBlLkluc3RlYWQgdGhleSB0YWtlIGFuIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2YgVmFsdWVzIHRvIGFkZCB0byB0aGUgY29sbGVjdGlvbi4gU2VlIDIuMCBjaGFuZ2Vsb2cgZm9yIGRldGFpbHMuIik7fWZ1bmN0aW9uIENhKGEpe3JldHVybiJvYmplY3QiPT09X3R5cGVvZihhKSYmbnVsbCE9PWE7fWZ1bmN0aW9uIEVhKGEpe3JldHVybiBBcnJheS5pc0FycmF5KGEpfHx3Lk5vZGVMaXN0JiZhIGluc3RhbmNlb2Ygdy5Ob2RlTGlzdHx8dy5IVE1MQ29sbGVjdGlvbiYmYSBpbnN0YW5jZW9mIHcuSFRNTENvbGxlY3Rpb247fWZ1bmN0aW9uIEdhKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTt9ZnVuY3Rpb24gSWEoYSxiLGMpe0FycmF5LmlzQXJyYXkoYSk/Yj49YS5sZW5ndGg/YS5wdXNoKGMpOmEuc3BsaWNlKGIsMCxjKTpBKCJDYW5ub3QgaW5zZXJ0IGFuIG9iamVjdCBpbnRvIGFuIEhUTUxDb2xsZWN0aW9uIG9yIE5vZGVMaXN0OiAiK2MrIiBhdCAiK2IpO31mdW5jdGlvbiBKYShhLGIpe0FycmF5LmlzQXJyYXkoYSk/Yj49YS5sZW5ndGg/YS5wb3AoKTphLnNwbGljZShiLDEpOkEoIkNhbm5vdCByZW1vdmUgYW4gb2JqZWN0IGZyb20gYW4gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QgYXQgIitiKTt9ZnVuY3Rpb24gS2EoKXt2YXIgYT1MYS5wb3AoKTtyZXR1cm4gdm9pZCAwPT09YT9bXTphO31mdW5jdGlvbiBPYShhKXthLmxlbmd0aD0wO0xhLnB1c2goYSk7fWZ1bmN0aW9uIFBhKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7aWYoYS5jbGFzc05hbWUpcmV0dXJuIGEuY2xhc3NOYW1lO2lmKGEubmFtZSlyZXR1cm4gYS5uYW1lO3ZhciBiPWEudG9TdHJpbmcoKTtiPWIuc3Vic3RyaW5nKDksYi5pbmRleE9mKCIoIikpLnRyaW0oKTtpZigiIiE9PWIpcmV0dXJuIGEuX2NsYXNzTmFtZT1iO31lbHNlIGlmKENhKGEpJiZhLmNvbnN0cnVjdG9yKXJldHVybiBQYShhLmNvbnN0cnVjdG9yKTtyZXR1cm4gX3R5cGVvZihhKTt9ZnVuY3Rpb24gUWEoYSl7dmFyIGI9YTtDYShhKSYmKGEudGV4dD9iPWEudGV4dDphLm5hbWU/Yj1hLm5hbWU6dm9pZCAwIT09YS5rZXk/Yj1hLmtleTp2b2lkIDAhPT1hLmlkP2I9YS5pZDphLmNvbnN0cnVjdG9yPT09T2JqZWN0JiYoYS5UZXh0P2I9YS5UZXh0OmEuTmFtZT9iPWEuTmFtZTp2b2lkIDAhPT1hLktleT9iPWEuS2V5OnZvaWQgMCE9PWEuSWQ/Yj1hLklkOnZvaWQgMCE9PWEuSUQmJihiPWEuSUQpKSk7cmV0dXJuIHZvaWQgMD09PWI/InVuZGVmaW5lZCI6bnVsbD09PWI/Im51bGwiOmIudG9TdHJpbmcoKTt9ZnVuY3Rpb24gU2EoYSxiKXtpZihhLmhhc093blByb3BlcnR5KGIpKXJldHVybiEwO2ZvcihhPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTthJiZhIT09RnVuY3Rpb247KXtpZihhLmhhc093blByb3BlcnR5KGIpKXJldHVybiEwO3ZhciBjPWEuYkE7aWYoYyYmY1tiXSlyZXR1cm4hMDthPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTt9cmV0dXJuITE7fWZ1bmN0aW9uIFRhKGEsYixjKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoVWEucHJvdG90eXBlLGEse2dldDpiLHNldDpjfSk7fWZ1bmN0aW9uIFZhKCl7dmFyIGE9V2E7aWYoMD09PWEubGVuZ3RoKWZvcih2YXIgYj13LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjYW52YXMiKSxjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXt2YXIgZT1iW2RdO2UucGFyZW50RWxlbWVudCYmZS5wYXJlbnRFbGVtZW50LkMmJmEucHVzaChlLnBhcmVudEVsZW1lbnQuQyk7fXJldHVybiBhO31mdW5jdGlvbiBaYShhKXtmb3IodmFyIGI9W10sYz0wOzI1Nj5jO2MrKyl7YlsiMDEyMzQ1Njc4OWFiY2RlZiIuY2hhckF0KGM+PjQpKyIwMTIzNDU2Nzg5YWJjZGVmIi5jaGFyQXQoYyYxNSldPVN0cmluZy5mcm9tQ2hhckNvZGUoYyk7fWEubGVuZ3RoJTImJihhPSIwIithKTtjPVtdO2Zvcih2YXIgZD0wLGU9MDtlPGEubGVuZ3RoO2UrPTIpe2NbZCsrXT1iW2Euc3Vic3RyKGUsMildO31hPWMuam9pbigiIik7YT0iIj09PWE/IjAiOmE7Yj1bXTtmb3IoYz0wOzI1Nj5jO2MrKyl7YltjXT1jO31mb3IoYz1kPTA7MjU2PmM7YysrKXtkPShkK2JbY10rMTE5KSUyNTYsZT1iW2NdLGJbY109YltkXSxiW2RdPWU7fWQ9Yz0wO2Zvcih2YXIgZj0iIixnPTA7ZzxhLmxlbmd0aDtnKyspe2M9KGMrMSklMjU2LGQ9KGQrYltjXSklMjU2LGU9YltjXSxiW2NdPWJbZF0sYltkXT1lLGYrPVN0cmluZy5mcm9tQ2hhckNvZGUoYS5jaGFyQ29kZUF0KGcpXmJbKGJbY10rYltkXSklMjU2XSk7fXJldHVybiBmO312YXIgYmI9dm9pZCAwIT09dy5uYXZpZ2F0b3ImJjA8dy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUgOS4wIiksY2I9dm9pZCAwIT09dy5uYXZpZ2F0b3ImJjA8dy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUgMTAuMCIpLGRiPXZvaWQgMCE9PXcubmF2aWdhdG9yJiYwPHcubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJUcmlkZW50LzciKSxnYj12b2lkIDAhPT13Lm5hdmlnYXRvciYmMDx3Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZS8iKSxpYj12b2lkIDAhPT13Lm5hdmlnYXRvciYmdm9pZCAwIT09dy5uYXZpZ2F0b3IucGxhdGZvcm0mJjA8PXcubmF2aWdhdG9yLnBsYXRmb3JtLnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiTUFDIiksbGI9dm9pZCAwIT09dy5uYXZpZ2F0b3ImJnZvaWQgMCE9PXcubmF2aWdhdG9yLnBsYXRmb3JtJiZudWxsIT09dy5uYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goLyhpUGhvbmV8aVBvZHxpUGFkKS9pKSxMYT1bXTtPYmplY3QuZnJlZXplKFtdKTt2YXIgV2E9W107c2EuY2xhc3NOYW1lPSJVdGlsIjtzYS5EeD0iMzJhYjVmZjNiMjZmNDJkYzBlZDkwZjIyNGQyOTEzYjUiO3NhLmFkeW09ImdvanMubmV0IjtzYS52Zm89IjI4ZTY0NmZkYmEiO3NhLmNsYXNzTmFtZT0iVXRpbCI7ZnVuY3Rpb24gRChhLGIsYyl7bWIodGhpcyk7dGhpcy5sPWE7dGhpcy5VYT1iO3RoaXMudT1jO31ELnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJFbnVtVmFsdWUuIit0aGlzLlVhO307ZnVuY3Rpb24gcWIoYSxiKXtyZXR1cm4gdm9pZCAwPT09Ynx8bnVsbD09PWJ8fCIiPT09Yj9udWxsOmFbYl07fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEQucHJvdG90eXBlLHtjbGFzc1R5cGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO319LG5hbWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5VYTt9fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnU7fX19KTtELmNsYXNzTmFtZT0iRW51bVZhbHVlIjtmdW5jdGlvbiBzYigpe3RoaXMubXc9W107fXNiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm13LmpvaW4oIiIpO307c2IucHJvdG90eXBlLmFkZD1mdW5jdGlvbihhKXsiIiE9PWEmJnRoaXMubXcucHVzaChhKTt9O3NiLmNsYXNzTmFtZT0iU3RyaW5nQnVpbGRlciI7ZnVuY3Rpb24gdGIoKXt9dGIuY2xhc3NOYW1lPSJQcm9wZXJ0eUNvbGxlY3Rpb24iO2Z1bmN0aW9uIHViKCl7fXViLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe307dWIucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMTt9O3ViLnByb3RvdHlwZS5kZD1mdW5jdGlvbigpe3JldHVybiExO307dWIucHJvdG90eXBlLmZpcnN0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw7fTt1Yi5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKCl7cmV0dXJuITE7fTt1Yi5wcm90b3R5cGUuYWxsPWZ1bmN0aW9uKCl7cmV0dXJuITA7fTt1Yi5wcm90b3R5cGUuZWFjaD1mdW5jdGlvbigpe3JldHVybiB0aGlzO307dWIucHJvdG90eXBlLm1hcD1mdW5jdGlvbigpe3JldHVybiB0aGlzO307dWIucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzO307dWIucHJvdG90eXBlLnhkPWZ1bmN0aW9uKCl7fTt1Yi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iRW1wdHlJdGVyYXRvciI7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyh1Yi5wcm90b3R5cGUse2l0ZXJhdG9yOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXM7fX0sY291bnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMDt9fX0pO3ViLnByb3RvdHlwZS5maXJzdD11Yi5wcm90b3R5cGUuZmlyc3Q7dWIucHJvdG90eXBlLmhhc05leHQ9dWIucHJvdG90eXBlLmRkO3ViLnByb3RvdHlwZS5uZXh0PXViLnByb3RvdHlwZS5uZXh0O3ViLnByb3RvdHlwZS5yZXNldD11Yi5wcm90b3R5cGUucmVzZXQ7dmFyIHhiPW51bGw7dWIuY2xhc3NOYW1lPSJFbXB0eUl0ZXJhdG9yIjt4Yj1uZXcgdWIoKTtmdW5jdGlvbiB5YihhKXt0aGlzLmtleT0tMTt0aGlzLnZhbHVlPWE7fXliLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMua2V5PS0xO307eWIucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4tMT09PXRoaXMua2V5Pyh0aGlzLmtleT0wLCEwKTohMTt9O3liLnByb3RvdHlwZS5kZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5leHQoKTt9O3liLnByb3RvdHlwZS5maXJzdD1mdW5jdGlvbigpe3RoaXMua2V5PTA7cmV0dXJuIHRoaXMudmFsdWU7fTt5Yi5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKGEpe3RoaXMua2V5PS0xO3JldHVybiBhKHRoaXMudmFsdWUpO307eWIucHJvdG90eXBlLmFsbD1mdW5jdGlvbihhKXt0aGlzLmtleT0tMTtyZXR1cm4gYSh0aGlzLnZhbHVlKTt9O3liLnByb3RvdHlwZS5lYWNoPWZ1bmN0aW9uKGEpe3RoaXMua2V5PS0xO2EodGhpcy52YWx1ZSk7cmV0dXJuIHRoaXM7fTt5Yi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgeWIoYSh0aGlzLnZhbHVlKSk7fTt5Yi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKGEpe3JldHVybiBhKHRoaXMudmFsdWUpP25ldyB5Yih0aGlzLnZhbHVlKTp4Yjt9O3liLnByb3RvdHlwZS54ZD1mdW5jdGlvbigpe3RoaXMudmFsdWU9bnVsbDt9O3liLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJTaW5nbGV0b25JdGVyYXRvcigiK3RoaXMudmFsdWUrIikiO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeWIucHJvdG90eXBlLHtpdGVyYXRvcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzO319LGNvdW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDE7fX19KTt5Yi5wcm90b3R5cGUuZmlyc3Q9eWIucHJvdG90eXBlLmZpcnN0O3liLnByb3RvdHlwZS5oYXNOZXh0PXliLnByb3RvdHlwZS5kZDt5Yi5wcm90b3R5cGUubmV4dD15Yi5wcm90b3R5cGUubmV4dDt5Yi5wcm90b3R5cGUucmVzZXQ9eWIucHJvdG90eXBlLnJlc2V0O3liLmNsYXNzTmFtZT0iU2luZ2xldG9uSXRlcmF0b3IiO2Z1bmN0aW9uIHpiKGEpe3RoaXMucGI9YTt0aGlzLldlPW51bGw7YS5KYT1udWxsO3RoaXMubGE9YS5CYTt0aGlzLlNhPS0xO316Yi5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBiO2EuSmE9bnVsbDt0aGlzLmxhPWEuQmE7dGhpcy5TYT0tMTt9O3piLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYjtpZihhLkJhIT09dGhpcy5sYSYmMD50aGlzLmtleSlyZXR1cm4hMTthPWEuajt2YXIgYj1hLmxlbmd0aCxjPSsrdGhpcy5TYSxkPXRoaXMuV2U7aWYobnVsbCE9PWQpZm9yKDtjPGI7KXt2YXIgZT1hW2NdO2lmKGQoZSkpcmV0dXJuIHRoaXMua2V5PXRoaXMuU2E9Yyx0aGlzLnZhbHVlPWUsITA7YysrO31lbHNle2lmKGM8YilyZXR1cm4gdGhpcy5rZXk9Yyx0aGlzLnZhbHVlPWFbY10sITA7dGhpcy54ZCgpO31yZXR1cm4hMTt9O3piLnByb3RvdHlwZS5kZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5leHQoKTt9O3piLnByb3RvdHlwZS5maXJzdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGI7dGhpcy5sYT1hLkJhO3RoaXMuU2E9MDthPWEuajt2YXIgYj1hLmxlbmd0aCxjPXRoaXMuV2U7aWYobnVsbCE9PWMpe2Zvcih2YXIgZD0wO2Q8Yjspe3ZhciBlPWFbZF07aWYoYyhlKSlyZXR1cm4gdGhpcy5rZXk9dGhpcy5TYT1kLHRoaXMudmFsdWU9ZTtkKys7fXJldHVybiBudWxsO31yZXR1cm4gMDxiPyhhPWFbMF0sdGhpcy5rZXk9MCx0aGlzLnZhbHVlPWEpOm51bGw7fTt6Yi5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGI7Yi5KYT1udWxsO3RoaXMuU2E9LTE7Yj1iLmo7Zm9yKHZhciBjPWIubGVuZ3RoLGQ9dGhpcy5XZSxlPTA7ZTxjO2UrKyl7dmFyIGY9YltlXTtpZigobnVsbD09PWR8fGQoZikpJiZhKGYpKXJldHVybiEwO31yZXR1cm4hMTt9O3piLnByb3RvdHlwZS5hbGw9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wYjtiLkphPW51bGw7dGhpcy5TYT0tMTtiPWIuajtmb3IodmFyIGM9Yi5sZW5ndGgsZD10aGlzLldlLGU9MDtlPGM7ZSsrKXt2YXIgZj1iW2VdO2lmKChudWxsPT09ZHx8ZChmKSkmJiFhKGYpKXJldHVybiExO31yZXR1cm4hMDt9O3piLnByb3RvdHlwZS5lYWNoPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGI7Yi5KYT1udWxsO3RoaXMuU2E9LTE7Yj1iLmo7Zm9yKHZhciBjPWIubGVuZ3RoLGQ9dGhpcy5XZSxlPTA7ZTxjO2UrKyl7dmFyIGY9YltlXTsobnVsbD09PWR8fGQoZikpJiZhKGYpO31yZXR1cm4gdGhpczt9O3piLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wYjtiLkphPW51bGw7dGhpcy5TYT0tMTt2YXIgYz1bXTtiPWIuajtmb3IodmFyIGQ9Yi5sZW5ndGgsZT10aGlzLldlLGY9MDtmPGQ7ZisrKXt2YXIgZz1iW2ZdOyhudWxsPT09ZXx8ZShnKSkmJmMucHVzaChhKGcpKTt9YT1uZXcgRSgpO2Euaj1jO2Eua2IoKTtyZXR1cm4gYS5pdGVyYXRvcjt9O3piLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wYjtiLkphPW51bGw7dGhpcy5TYT0tMTt2YXIgYz1bXTtiPWIuajtmb3IodmFyIGQ9Yi5sZW5ndGgsZT10aGlzLldlLGY9MDtmPGQ7ZisrKXt2YXIgZz1iW2ZdOyhudWxsPT09ZXx8ZShnKSkmJmEoZykmJmMucHVzaChnKTt9YT1uZXcgRSgpO2Euaj1jO2Eua2IoKTtyZXR1cm4gYS5pdGVyYXRvcjt9O3piLnByb3RvdHlwZS54ZD1mdW5jdGlvbigpe3RoaXMua2V5PS0xO3RoaXMudmFsdWU9bnVsbDt0aGlzLmxhPS0xO3RoaXMuV2U9bnVsbDt0aGlzLnBiLkphPXRoaXM7fTt6Yi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iTGlzdEl0ZXJhdG9yQCIrdGhpcy5TYSsiLyIrdGhpcy5wYi5jb3VudDt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHpiLnByb3RvdHlwZSx7aXRlcmF0b3I6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpczt9fSxwcmVkaWNhdGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5XZT1hO319LGNvdW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIGE9dGhpcy5XZTtpZihudWxsIT09YSl7Zm9yKHZhciBiPTAsYz10aGlzLnBiLmosZD1jLmxlbmd0aCxlPTA7ZTxkO2UrKyl7YShjW2VdKSYmYisrO31yZXR1cm4gYjt9cmV0dXJuIHRoaXMucGIuai5sZW5ndGg7fX19KTt6Yi5wcm90b3R5cGUuZmlyc3Q9emIucHJvdG90eXBlLmZpcnN0O3piLnByb3RvdHlwZS5oYXNOZXh0PXpiLnByb3RvdHlwZS5kZDt6Yi5wcm90b3R5cGUubmV4dD16Yi5wcm90b3R5cGUubmV4dDt6Yi5wcm90b3R5cGUucmVzZXQ9emIucHJvdG90eXBlLnJlc2V0O3piLmNsYXNzTmFtZT0iTGlzdEl0ZXJhdG9yIjtmdW5jdGlvbiBBYihhKXt0aGlzLnBiPWE7YS5RZz1udWxsO3RoaXMubGE9YS5CYTt0aGlzLlNhPWEuai5sZW5ndGg7fUFiLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGI7YS5RZz1udWxsO3RoaXMubGE9YS5CYTt0aGlzLlNhPWEuai5sZW5ndGg7fTtBYi5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGI7aWYoYS5CYSE9PXRoaXMubGEmJjA+dGhpcy5rZXkpcmV0dXJuITE7dmFyIGI9LS10aGlzLlNhO2lmKDA8PWIpcmV0dXJuIHRoaXMua2V5PWIsdGhpcy52YWx1ZT1hLmpbYl0sITA7dGhpcy54ZCgpO3JldHVybiExO307QWIucHJvdG90eXBlLmRkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmV4dCgpO307QWIucHJvdG90eXBlLmZpcnN0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYjt0aGlzLmxhPWEuQmE7dmFyIGI9YS5qO3RoaXMuU2E9YT1iLmxlbmd0aC0xO3JldHVybiAwPD1hPyhiPWJbYV0sdGhpcy5rZXk9YSx0aGlzLnZhbHVlPWIpOm51bGw7fTtBYi5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGI7Yi5RZz1udWxsO2I9Yi5qO3ZhciBjPWIubGVuZ3RoO3RoaXMuU2E9Yztmb3IoLS1jOzA8PWM7Yy0tKXtpZihhKGJbY10pKXJldHVybiEwO31yZXR1cm4hMTt9O0FiLnByb3RvdHlwZS5hbGw9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wYjtiLlFnPW51bGw7Yj1iLmo7dmFyIGM9Yi5sZW5ndGg7dGhpcy5TYT1jO2ZvcigtLWM7MDw9YztjLS0pe2lmKCFhKGJbY10pKXJldHVybiExO31yZXR1cm4hMDt9O0FiLnByb3RvdHlwZS5lYWNoPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGI7Yi5RZz1udWxsO2I9Yi5qO3ZhciBjPWIubGVuZ3RoO3RoaXMuU2E9Yztmb3IoLS1jOzA8PWM7Yy0tKXthKGJbY10pO31yZXR1cm4gdGhpczt9O0FiLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wYjtiLlFnPW51bGw7dmFyIGM9W107Yj1iLmo7dmFyIGQ9Yi5sZW5ndGg7dGhpcy5TYT1kO2ZvcigtLWQ7MDw9ZDtkLS0pe2MucHVzaChhKGJbZF0pKTt9YT1uZXcgRSgpO2Euaj1jO2Eua2IoKTtyZXR1cm4gYS5pdGVyYXRvcjt9O0FiLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wYjtiLlFnPW51bGw7dmFyIGM9W107Yj1iLmo7dmFyIGQ9Yi5sZW5ndGg7dGhpcy5TYT1kO2ZvcigtLWQ7MDw9ZDtkLS0pe3ZhciBlPWJbZF07YShlKSYmYy5wdXNoKGUpO31hPW5ldyBFKCk7YS5qPWM7YS5rYigpO3JldHVybiBhLml0ZXJhdG9yO307QWIucHJvdG90eXBlLnhkPWZ1bmN0aW9uKCl7dGhpcy5rZXk9LTE7dGhpcy52YWx1ZT1udWxsO3RoaXMubGE9LTE7dGhpcy5wYi5RZz10aGlzO307QWIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkxpc3RJdGVyYXRvckJhY2t3YXJkcygiK3RoaXMuU2ErIi8iK3RoaXMucGIuY291bnQrIikiO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWIucHJvdG90eXBlLHtpdGVyYXRvcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzO319LGNvdW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucGIuai5sZW5ndGg7fX19KTtBYi5wcm90b3R5cGUuZmlyc3Q9QWIucHJvdG90eXBlLmZpcnN0O0FiLnByb3RvdHlwZS5oYXNOZXh0PUFiLnByb3RvdHlwZS5kZDtBYi5wcm90b3R5cGUubmV4dD1BYi5wcm90b3R5cGUubmV4dDtBYi5wcm90b3R5cGUucmVzZXQ9QWIucHJvdG90eXBlLnJlc2V0O0FiLmNsYXNzTmFtZT0iTGlzdEl0ZXJhdG9yQmFja3dhcmRzIjtmdW5jdGlvbiBFKGEpe21iKHRoaXMpO3RoaXMudj0hMTt0aGlzLmo9W107dGhpcy5CYT0wO3RoaXMuUWc9dGhpcy5KYT1udWxsO3ZvaWQgMCE9PWEmJigiZnVuY3Rpb24iPT09dHlwZW9mIGF8fCJzdHJpbmciPT09dHlwZW9mIGE/emEoKTp0aGlzLmFkZEFsbChhKSk7fXQ9RS5wcm90b3R5cGU7dC5rYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuQmE7YSsrOzk5OTk5OTk5OTxhJiYoYT0wKTt0aGlzLkJhPWE7fTt0LmZyZWV6ZT1mdW5jdGlvbigpe3RoaXMudj0hMDtyZXR1cm4gdGhpczt9O3QuaGE9ZnVuY3Rpb24oKXt0aGlzLnY9ITE7cmV0dXJuIHRoaXM7fTt0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkxpc3QoKSMiK0JiKHRoaXMpO307dC5hZGQ9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEpcmV0dXJuIHRoaXM7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMuai5wdXNoKGEpO3RoaXMua2IoKTtyZXR1cm4gdGhpczt9O3QucHVzaD1mdW5jdGlvbihhKXt0aGlzLmFkZChhKTt9O3QuYWRkQWxsPWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiB0aGlzO3RoaXMudiYmd2EodGhpcyk7dmFyIGI9dGhpcy5qO2lmKEVhKGEpKWZvcih2YXIgYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7Yi5wdXNoKGFbZF0pO31lbHNlIGZvcihhPWEuaXRlcmF0b3I7YS5uZXh0KCk7KXtiLnB1c2goYS52YWx1ZSk7fXRoaXMua2IoKTtyZXR1cm4gdGhpczt9O3QuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnYmJndhKHRoaXMpO3RoaXMuai5sZW5ndGg9MDt0aGlzLmtiKCk7fTt0LmNvbnRhaW5zPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YT8hMTotMSE9PXRoaXMuai5pbmRleE9mKGEpO307dC5oYXM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29udGFpbnMoYSk7fTt0LmluZGV4T2Y9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hPy0xOnRoaXMuai5pbmRleE9mKGEpO307dC5OPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuajsoMD5hfHxhPj1iLmxlbmd0aCkmJnhhKGEsIjAgPD0gaSA8IGxlbmd0aCIsRSwiZWx0OmkiKTtyZXR1cm4gYlthXTt9O3QuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk4oYSk7fTt0LmdkPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5qOygwPmF8fGE+PWMubGVuZ3RoKSYmeGEoYSwiMCA8PSBpIDwgbGVuZ3RoIixFLCJzZXRFbHQ6aSIpO3RoaXMudiYmd2EodGhpcyxhKTtjW2FdPWI7fTt0LnNldD1mdW5jdGlvbihhLGIpe3RoaXMuZ2QoYSxiKTt9O3QuZmlyc3Q9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmo7cmV0dXJuIDA9PT1hLmxlbmd0aD9udWxsOmFbMF07fTt0LlRiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qLGI9YS5sZW5ndGg7cmV0dXJuIDA8Yj9hW2ItMV06bnVsbDt9O3QucG9wPWZ1bmN0aW9uKCl7dGhpcy52JiZ3YSh0aGlzKTt2YXIgYT10aGlzLmo7cmV0dXJuIDA8YS5sZW5ndGg/YS5wb3AoKTpudWxsO307RS5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmosYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYShiW2RdKSlyZXR1cm4hMDt9cmV0dXJuITE7fTtFLnByb3RvdHlwZS5hbGw9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuaixjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZighYShiW2RdKSlyZXR1cm4hMTt9cmV0dXJuITA7fTtFLnByb3RvdHlwZS5lYWNoPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmosYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7YShiW2RdKTt9cmV0dXJuIHRoaXM7fTtFLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPW5ldyBFKCksYz1bXSxkPXRoaXMuaixlPWQubGVuZ3RoLGY9MDtmPGU7ZisrKXtjLnB1c2goYShkW2ZdKSk7fWIuaj1jO2Iua2IoKTtyZXR1cm4gYjt9O0UucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbihhKXtmb3IodmFyIGI9bmV3IEUoKSxjPVtdLGQ9dGhpcy5qLGU9ZC5sZW5ndGgsZj0wO2Y8ZTtmKyspe3ZhciBnPWRbZl07YShnKSYmYy5wdXNoKGcpO31iLmo9YztiLmtiKCk7cmV0dXJuIGI7fTt0PUUucHJvdG90eXBlO3QuSWI9ZnVuY3Rpb24oYSxiKXswPmEmJnhhKGEsIj49IDAiLEUsImluc2VydEF0OmkiKTt0aGlzLnYmJndhKHRoaXMsYSk7dmFyIGM9dGhpcy5qO2E+PWMubGVuZ3RoP2MucHVzaChiKTpjLnNwbGljZShhLDAsYik7dGhpcy5rYigpO307dC5yZW1vdmU9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEpcmV0dXJuITE7dGhpcy52JiZ3YSh0aGlzLGEpO3ZhciBiPXRoaXMuajthPWIuaW5kZXhPZihhKTtpZigtMT09PWEpcmV0dXJuITE7YT09PWIubGVuZ3RoLTE/Yi5wb3AoKTpiLnNwbGljZShhLDEpO3RoaXMua2IoKTtyZXR1cm4hMDt9O3QuZGVsZXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhKTt9O3QubWI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qOygwPmF8fGE+PWIubGVuZ3RoKSYmeGEoYSwiMCA8PSBpIDwgbGVuZ3RoIixFLCJyZW1vdmVBdDppIik7dGhpcy52JiZ3YSh0aGlzLGEpO2E9PT1iLmxlbmd0aC0xP2IucG9wKCk6Yi5zcGxpY2UoYSwxKTt0aGlzLmtiKCk7fTt0LnJlbW92ZVJhbmdlPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5qLGQ9Yy5sZW5ndGg7aWYoMD5hKWE9MDtlbHNlIGlmKGE+PWQpcmV0dXJuIHRoaXM7aWYoMD5iKXJldHVybiB0aGlzO2I+PWQmJihiPWQtMSk7aWYoYT5iKXJldHVybiB0aGlzO3RoaXMudiYmd2EodGhpcyk7Zm9yKHZhciBlPWEsZj1iKzE7ZjxkOyl7Y1tlKytdPWNbZisrXTt9Yy5sZW5ndGg9ZC0oYi1hKzEpO3RoaXMua2IoKTtyZXR1cm4gdGhpczt9O0UucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRSgpLGI9dGhpcy5qOzA8Yi5sZW5ndGgmJihhLmo9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYikpO3JldHVybiBhO307dD1FLnByb3RvdHlwZTt0Lk5hPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuaixiPXRoaXMuY291bnQsYz1BcnJheShiKSxkPTA7ZDxiO2QrKyl7Y1tkXT1hW2RdO31yZXR1cm4gYzt9O3QuUXY9ZnVuY3Rpb24oKXtmb3IodmFyIGE9bmV3IEYoKSxiPXRoaXMuaixjPXRoaXMuY291bnQsZD0wO2Q8YztkKyspe2EuYWRkKGJbZF0pO31yZXR1cm4gYTt9O3Quc29ydD1mdW5jdGlvbihhKXt0aGlzLnYmJndhKHRoaXMpO3RoaXMuai5zb3J0KGEpO3RoaXMua2IoKTtyZXR1cm4gdGhpczt9O3QuVmk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuaixlPWQubGVuZ3RoO3ZvaWQgMD09PWImJihiPTApO3ZvaWQgMD09PWMmJihjPWUpO3RoaXMudiYmd2EodGhpcyk7dmFyIGY9Yy1iO2lmKDE+PWYpcmV0dXJuIHRoaXM7KDA+Ynx8Yj49ZS0xKSYmeGEoYiwiMCA8PSBmcm9tIDwgbGVuZ3RoIixFLCJzb3J0UmFuZ2U6ZnJvbSIpO2lmKDI9PT1mKXJldHVybiBjPWRbYl0sZT1kW2IrMV0sMDxhKGMsZSkmJihkW2JdPWUsZFtiKzFdPWMsdGhpcy5rYigpKSx0aGlzO2lmKDA9PT1iKXtpZihjPj1lKWQuc29ydChhKTtlbHNlIGZvcihiPWQuc2xpY2UoMCxjKSxiLnNvcnQoYSksYT0wO2E8YzthKyspe2RbYV09YlthXTt9fWVsc2UgaWYoYz49ZSlmb3IoYz1kLnNsaWNlKGIpLGMuc29ydChhKSxhPWI7YTxlO2ErKyl7ZFthXT1jW2EtYl07fWVsc2UgZm9yKGU9ZC5zbGljZShiLGMpLGUuc29ydChhKSxhPWI7YTxjO2ErKyl7ZFthXT1lW2EtYl07fXRoaXMua2IoKTtyZXR1cm4gdGhpczt9O3QucmV2ZXJzZT1mdW5jdGlvbigpe3RoaXMudiYmd2EodGhpcyk7dGhpcy5qLnJldmVyc2UoKTt0aGlzLmtiKCk7cmV0dXJuIHRoaXM7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhFLnByb3RvdHlwZSx7X2RhdGFBcnJheTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmo7fX0sY291bnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5qLmxlbmd0aDt9fSxzaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuai5sZW5ndGg7fX0sbGVuZ3RoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuai5sZW5ndGg7fX0saXRlcmF0b3I6e2dldDpmdW5jdGlvbiBnZXQoKXtpZigwPj10aGlzLmoubGVuZ3RoKXJldHVybiB4Yjt2YXIgYT10aGlzLkphO3JldHVybiBudWxsIT09YT8oYS5yZXNldCgpLGEpOm5ldyB6Yih0aGlzKTt9fSxpdGVyYXRvckJhY2t3YXJkczp7Z2V0OmZ1bmN0aW9uIGdldCgpe2lmKDA+PXRoaXMuai5sZW5ndGgpcmV0dXJuIHhiO3ZhciBhPXRoaXMuUWc7cmV0dXJuIG51bGwhPT1hPyhhLnJlc2V0KCksYSk6bmV3IEFiKHRoaXMpO319fSk7RS5wcm90b3R5cGUucmV2ZXJzZT1FLnByb3RvdHlwZS5yZXZlcnNlO0UucHJvdG90eXBlLnNvcnRSYW5nZT1FLnByb3RvdHlwZS5WaTtFLnByb3RvdHlwZS5zb3J0PUUucHJvdG90eXBlLnNvcnQ7RS5wcm90b3R5cGUudG9TZXQ9RS5wcm90b3R5cGUuUXY7RS5wcm90b3R5cGUudG9BcnJheT1FLnByb3RvdHlwZS5OYTtFLnByb3RvdHlwZS5yZW1vdmVSYW5nZT1FLnByb3RvdHlwZS5yZW1vdmVSYW5nZTtFLnByb3RvdHlwZS5yZW1vdmVBdD1FLnByb3RvdHlwZS5tYjtFLnByb3RvdHlwZVsiZGVsZXRlIl09RS5wcm90b3R5cGUuZGVsZXRlO0UucHJvdG90eXBlLnJlbW92ZT1FLnByb3RvdHlwZS5yZW1vdmU7RS5wcm90b3R5cGUuaW5zZXJ0QXQ9RS5wcm90b3R5cGUuSWI7RS5wcm90b3R5cGUucG9wPUUucHJvdG90eXBlLnBvcDtFLnByb3RvdHlwZS5sYXN0PUUucHJvdG90eXBlLlRiO0UucHJvdG90eXBlLmZpcnN0PUUucHJvdG90eXBlLmZpcnN0O0UucHJvdG90eXBlLnNldD1FLnByb3RvdHlwZS5zZXQ7RS5wcm90b3R5cGUuc2V0RWx0PUUucHJvdG90eXBlLmdkO0UucHJvdG90eXBlLmdldD1FLnByb3RvdHlwZS5nZXQ7RS5wcm90b3R5cGUuZWx0PUUucHJvdG90eXBlLk47RS5wcm90b3R5cGUuaW5kZXhPZj1FLnByb3RvdHlwZS5pbmRleE9mO0UucHJvdG90eXBlLmhhcz1FLnByb3RvdHlwZS5oYXM7RS5wcm90b3R5cGUuY29udGFpbnM9RS5wcm90b3R5cGUuY29udGFpbnM7RS5wcm90b3R5cGUuY2xlYXI9RS5wcm90b3R5cGUuY2xlYXI7RS5wcm90b3R5cGUuYWRkQWxsPUUucHJvdG90eXBlLmFkZEFsbDtFLnByb3RvdHlwZS5wdXNoPUUucHJvdG90eXBlLnB1c2g7RS5wcm90b3R5cGUuYWRkPUUucHJvdG90eXBlLmFkZDtFLnByb3RvdHlwZS50aGF3PUUucHJvdG90eXBlLmhhO0UucHJvdG90eXBlLmZyZWV6ZT1FLnByb3RvdHlwZS5mcmVlemU7RS5jbGFzc05hbWU9Ikxpc3QiO2Z1bmN0aW9uIENiKGEpe3RoaXMuZWc9YTthLkphPW51bGw7dGhpcy5sYT1hLkJhO3RoaXMubmE9bnVsbDt9Q2IucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lZzthLkphPW51bGw7dGhpcy5sYT1hLkJhO3RoaXMubmE9bnVsbDt9O0NiLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lZztpZihhLkJhIT09dGhpcy5sYSYmbnVsbD09PXRoaXMua2V5KXJldHVybiExO3ZhciBiPXRoaXMubmE7Yj1udWxsPT09Yj9hLmZhOmIub2E7aWYobnVsbCE9PWIpcmV0dXJuIHRoaXMubmE9Yix0aGlzLnZhbHVlPWIudmFsdWUsdGhpcy5rZXk9Yi5rZXksITA7dGhpcy54ZCgpO3JldHVybiExO307Q2IucHJvdG90eXBlLmRkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmV4dCgpO307Q2IucHJvdG90eXBlLmZpcnN0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lZzt0aGlzLmxhPWEuQmE7YT1hLmZhO2lmKG51bGwhPT1hKXt0aGlzLm5hPWE7dmFyIGI9YS52YWx1ZTt0aGlzLmtleT1hLmtleTtyZXR1cm4gdGhpcy52YWx1ZT1iO31yZXR1cm4gbnVsbDt9O0NiLnByb3RvdHlwZS5hbnk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZzt0aGlzLm5hPWIuSmE9bnVsbDtmb3IoYj1iLmZhO251bGwhPT1iOyl7aWYoYShiLnZhbHVlKSlyZXR1cm4hMDtiPWIub2E7fXJldHVybiExO307Q2IucHJvdG90eXBlLmFsbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmVnO3RoaXMubmE9Yi5KYT1udWxsO2ZvcihiPWIuZmE7bnVsbCE9PWI7KXtpZighYShiLnZhbHVlKSlyZXR1cm4hMTtiPWIub2E7fXJldHVybiEwO307Q2IucHJvdG90eXBlLmVhY2g9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lZzt0aGlzLm5hPWIuSmE9bnVsbDtmb3IoYj1iLmZhO251bGwhPT1iOyl7YShiLnZhbHVlKSxiPWIub2E7fXJldHVybiB0aGlzO307Q2IucHJvdG90eXBlLm1hcD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmVnO2IuSmE9bnVsbDt2YXIgYz1uZXcgRSgpO2ZvcihiPWIuZmE7bnVsbCE9PWI7KXtjLmFkZChhKGIudmFsdWUpKSxiPWIub2E7fXJldHVybiBjLml0ZXJhdG9yO307Q2IucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmVnO2IuSmE9bnVsbDt2YXIgYz1uZXcgRSgpO2ZvcihiPWIuZmE7bnVsbCE9PWI7KXt2YXIgZD1iLnZhbHVlO2EoZCkmJmMuYWRkKGQpO2I9Yi5vYTt9cmV0dXJuIGMuaXRlcmF0b3I7fTtDYi5wcm90b3R5cGUueGQ9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMua2V5PW51bGw7dGhpcy5sYT0tMTt0aGlzLmVnLkphPXRoaXM7fTtDYi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMubmE/IlNldEl0ZXJhdG9yQCIrdGhpcy5uYS52YWx1ZToiU2V0SXRlcmF0b3IiO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ2IucHJvdG90eXBlLHtpdGVyYXRvcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzO319LGNvdW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZWcuQ2I7fX19KTtDYi5wcm90b3R5cGUuZmlyc3Q9Q2IucHJvdG90eXBlLmZpcnN0O0NiLnByb3RvdHlwZS5oYXNOZXh0PUNiLnByb3RvdHlwZS5kZDtDYi5wcm90b3R5cGUubmV4dD1DYi5wcm90b3R5cGUubmV4dDtDYi5wcm90b3R5cGUucmVzZXQ9Q2IucHJvdG90eXBlLnJlc2V0O0NiLmNsYXNzTmFtZT0iU2V0SXRlcmF0b3IiO2Z1bmN0aW9uIEYoYSl7bWIodGhpcyk7dGhpcy52PSExO3RoaXMuRGI9e307dGhpcy5DYj0wO3RoaXMuSmE9bnVsbDt0aGlzLkJhPTA7dGhpcy5TZT10aGlzLmZhPW51bGw7dm9pZCAwIT09YSYmKCJmdW5jdGlvbiI9PT10eXBlb2YgYXx8InN0cmluZyI9PT10eXBlb2YgYT96YSgpOnRoaXMuYWRkQWxsKGEpKTt9dD1GLnByb3RvdHlwZTt0LmtiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYTthKys7OTk5OTk5OTk5PGEmJihhPTApO3RoaXMuQmE9YTt9O3QuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy52PSEwO3JldHVybiB0aGlzO307dC5oYT1mdW5jdGlvbigpe3RoaXMudj0hMTtyZXR1cm4gdGhpczt9O3QudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iU2V0KCkjIitCYih0aGlzKTt9O3QuYWRkPWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiB0aGlzO3RoaXMudiYmd2EodGhpcyxhKTt2YXIgYj1hO0NhKGEpJiYoYj1EYihhKSk7dm9pZCAwPT09dGhpcy5EYltiXSYmKHRoaXMuQ2IrKyxhPW5ldyBGYihhLGEpLHRoaXMuRGJbYl09YSxiPXRoaXMuU2UsbnVsbD09PWI/dGhpcy5mYT1hOihhLndsPWIsYi5vYT1hKSx0aGlzLlNlPWEsdGhpcy5rYigpKTtyZXR1cm4gdGhpczt9O3QuYWRkQWxsPWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiB0aGlzO3RoaXMudiYmd2EodGhpcyk7aWYoRWEoYSkpZm9yKHZhciBiPWEubGVuZ3RoLGM9MDtjPGI7YysrKXt0aGlzLmFkZChhW2NdKTt9ZWxzZSBmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7dGhpcy5hZGQoYS52YWx1ZSk7fXJldHVybiB0aGlzO307dC5jb250YWlucz1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4hMTt2YXIgYj1hO3JldHVybiBDYShhKSYmKGI9QmIoYSksdm9pZCAwPT09Yik/ITE6dm9pZCAwIT09dGhpcy5EYltiXTt9O3QuaGFzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbnRhaW5zKGEpO307dC52eT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4hMDtmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7aWYoIXRoaXMuY29udGFpbnMoYS52YWx1ZSkpcmV0dXJuITE7fXJldHVybiEwO307dC53eT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4hMDtmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7aWYodGhpcy5jb250YWlucyhhLnZhbHVlKSlyZXR1cm4hMDt9cmV0dXJuITE7fTt0LmZpcnN0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mYTtyZXR1cm4gbnVsbD09PWE/bnVsbDphLnZhbHVlO307Ri5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmZhO251bGwhPT1iOyl7aWYoYShiLnZhbHVlKSlyZXR1cm4hMDtiPWIub2E7fXJldHVybiExO307Ri5wcm90b3R5cGUuYWxsPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmZhO251bGwhPT1iOyl7aWYoIWEoYi52YWx1ZSkpcmV0dXJuITE7Yj1iLm9hO31yZXR1cm4hMDt9O0YucHJvdG90eXBlLmVhY2g9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZmE7bnVsbCE9PWI7KXthKGIudmFsdWUpLGI9Yi5vYTt9cmV0dXJuIHRoaXM7fTtGLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPW5ldyBGKCksYz10aGlzLmZhO251bGwhPT1jOyl7Yi5hZGQoYShjLnZhbHVlKSksYz1jLm9hO31yZXR1cm4gYjt9O0YucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbihhKXtmb3IodmFyIGI9bmV3IEYoKSxjPXRoaXMuZmE7bnVsbCE9PWM7KXt2YXIgZD1jLnZhbHVlO2EoZCkmJmIuYWRkKGQpO2M9Yy5vYTt9cmV0dXJuIGI7fTt0PUYucHJvdG90eXBlO3QucmVtb3ZlPWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiExO3RoaXMudiYmd2EodGhpcyxhKTt2YXIgYj1hO2lmKENhKGEpJiYoYj1CYihhKSx2b2lkIDA9PT1iKSlyZXR1cm4hMTthPXRoaXMuRGJbYl07aWYodm9pZCAwPT09YSlyZXR1cm4hMTt2YXIgYz1hLm9hLGQ9YS53bDtudWxsIT09YyYmKGMud2w9ZCk7bnVsbCE9PWQmJihkLm9hPWMpO3RoaXMuZmE9PT1hJiYodGhpcy5mYT1jKTt0aGlzLlNlPT09YSYmKHRoaXMuU2U9ZCk7ZGVsZXRlIHRoaXMuRGJbYl07dGhpcy5DYi0tO3RoaXMua2IoKTtyZXR1cm4hMDt9O3QuZGVsZXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhKTt9O3QubHE9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEpcmV0dXJuIHRoaXM7dGhpcy52JiZ3YSh0aGlzKTtpZihFYShhKSlmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe3RoaXMucmVtb3ZlKGFbY10pO31lbHNlIGZvcihhPWEuaXRlcmF0b3I7YS5uZXh0KCk7KXt0aGlzLnJlbW92ZShhLnZhbHVlKTt9cmV0dXJuIHRoaXM7fTt0LlB6PWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hfHwwPT09dGhpcy5jb3VudClyZXR1cm4gdGhpczt0aGlzLnYmJndhKHRoaXMpO3ZhciBiPW5ldyBGKCk7Yi5hZGRBbGwoYSk7YT1bXTtmb3IodmFyIGM9dGhpcy5pdGVyYXRvcjtjLm5leHQoKTspe3ZhciBkPWMudmFsdWU7Yi5jb250YWlucyhkKXx8YS5wdXNoKGQpO310aGlzLmxxKGEpO3JldHVybiB0aGlzO307dC5jbGVhcj1mdW5jdGlvbigpe3RoaXMudiYmd2EodGhpcyk7dGhpcy5EYj17fTt0aGlzLkNiPTA7bnVsbCE9PXRoaXMuSmEmJnRoaXMuSmEucmVzZXQoKTt0aGlzLlNlPXRoaXMuZmE9bnVsbDt0aGlzLmtiKCk7fTtGLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IEYoKSxiPXRoaXMuRGIsYztmb3IoYyBpbiBiKXthLmFkZChiW2NdLnZhbHVlKTt9cmV0dXJuIGE7fTtGLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe3ZhciBhPUFycmF5KHRoaXMuQ2IpLGI9dGhpcy5EYixjPTAsZDtmb3IoZCBpbiBiKXthW2NdPWJbZF0udmFsdWUsYysrO31yZXR1cm4gYTt9O0YucHJvdG90eXBlLlB2PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IEUoKSxiPXRoaXMuRGIsYztmb3IoYyBpbiBiKXthLmFkZChiW2NdLnZhbHVlKTt9cmV0dXJuIGE7fTtmdW5jdGlvbiBtYihhKXthLl9fZ29oYXNoaWQ9R2IrKzt9ZnVuY3Rpb24gRGIoYSl7dmFyIGI9YS5fX2dvaGFzaGlkO3ZvaWQgMD09PWImJihiPUdiKyssYS5fX2dvaGFzaGlkPWIpO3JldHVybiBiO31mdW5jdGlvbiBCYihhKXtyZXR1cm4gYS5fX2dvaGFzaGlkO31wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhGLnByb3RvdHlwZSx7Y291bnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DYjt9fSxzaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ2I7fX0saXRlcmF0b3I6e2dldDpmdW5jdGlvbiBnZXQoKXtpZigwPj10aGlzLkNiKXJldHVybiB4Yjt2YXIgYT10aGlzLkphO3JldHVybiBudWxsIT09YT8oYS5yZXNldCgpLGEpOm5ldyBDYih0aGlzKTt9fX0pO0YucHJvdG90eXBlLnRvTGlzdD1GLnByb3RvdHlwZS5QdjtGLnByb3RvdHlwZS50b0FycmF5PUYucHJvdG90eXBlLk5hO0YucHJvdG90eXBlLmNsZWFyPUYucHJvdG90eXBlLmNsZWFyO0YucHJvdG90eXBlLnJldGFpbkFsbD1GLnByb3RvdHlwZS5QejtGLnByb3RvdHlwZS5yZW1vdmVBbGw9Ri5wcm90b3R5cGUubHE7Ri5wcm90b3R5cGVbImRlbGV0ZSJdPUYucHJvdG90eXBlLmRlbGV0ZTtGLnByb3RvdHlwZS5yZW1vdmU9Ri5wcm90b3R5cGUucmVtb3ZlO0YucHJvdG90eXBlLmZpcnN0PUYucHJvdG90eXBlLmZpcnN0O0YucHJvdG90eXBlLmNvbnRhaW5zQW55PUYucHJvdG90eXBlLnd5O0YucHJvdG90eXBlLmNvbnRhaW5zQWxsPUYucHJvdG90eXBlLnZ5O0YucHJvdG90eXBlLmhhcz1GLnByb3RvdHlwZS5oYXM7Ri5wcm90b3R5cGUuY29udGFpbnM9Ri5wcm90b3R5cGUuY29udGFpbnM7Ri5wcm90b3R5cGUuYWRkQWxsPUYucHJvdG90eXBlLmFkZEFsbDtGLnByb3RvdHlwZS5hZGQ9Ri5wcm90b3R5cGUuYWRkO0YucHJvdG90eXBlLnRoYXc9Ri5wcm90b3R5cGUuaGE7Ri5wcm90b3R5cGUuZnJlZXplPUYucHJvdG90eXBlLmZyZWV6ZTt2YXIgR2I9MTtGLmNsYXNzTmFtZT0iU2V0IjtGLnVuaXF1ZUhhc2g9bWI7Ri5oYXNoSWRVbmlxdWU9RGI7Ri5oYXNoSWQ9QmI7ZnVuY3Rpb24gSGIoYSl7dGhpcy5qYT1hO3RoaXMubGE9YS5CYTt0aGlzLm5hPW51bGw7fUhiLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMubGE9dGhpcy5qYS5CYTt0aGlzLm5hPW51bGw7fTtIYi5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuamE7aWYoYS5CYSE9PXRoaXMubGEmJm51bGw9PT10aGlzLmtleSlyZXR1cm4hMTt2YXIgYj10aGlzLm5hO2I9bnVsbD09PWI/YS5mYTpiLm9hO2lmKG51bGwhPT1iKXJldHVybiB0aGlzLm5hPWIsdGhpcy52YWx1ZT10aGlzLmtleT1hPWIua2V5LCEwO3RoaXMueGQoKTtyZXR1cm4hMTt9O0hiLnByb3RvdHlwZS5kZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5leHQoKTt9O0hiLnByb3RvdHlwZS5maXJzdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuamE7dGhpcy5sYT1hLkJhO2E9YS5mYTtyZXR1cm4gbnVsbCE9PWE/KHRoaXMubmE9YSx0aGlzLnZhbHVlPXRoaXMua2V5PWE9YS5rZXkpOm51bGw7fTtIYi5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamE7dGhpcy5uYT1udWxsO2ZvcihiPWIuZmE7bnVsbCE9PWI7KXtpZihhKGIua2V5KSlyZXR1cm4hMDtiPWIub2E7fXJldHVybiExO307SGIucHJvdG90eXBlLmFsbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmphO3RoaXMubmE9bnVsbDtmb3IoYj1iLmZhO251bGwhPT1iOyl7aWYoIWEoYi5rZXkpKXJldHVybiExO2I9Yi5vYTt9cmV0dXJuITA7fTtIYi5wcm90b3R5cGUuZWFjaD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmphO3RoaXMubmE9bnVsbDtmb3IoYj1iLmZhO251bGwhPT1iOyl7YShiLmtleSksYj1iLm9hO31yZXR1cm4gdGhpczt9O0hiLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qYTt0aGlzLm5hPW51bGw7dmFyIGM9bmV3IEUoKTtmb3IoYj1iLmZhO251bGwhPT1iOyl7Yy5hZGQoYShiLmtleSkpLGI9Yi5vYTt9cmV0dXJuIGMuaXRlcmF0b3I7fTtIYi5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamE7dGhpcy5uYT1udWxsO3ZhciBjPW5ldyBFKCk7Zm9yKGI9Yi5mYTtudWxsIT09Yjspe3ZhciBkPWIua2V5O2EoZCkmJmMuYWRkKGQpO2I9Yi5vYTt9cmV0dXJuIGMuaXRlcmF0b3I7fTtIYi5wcm90b3R5cGUueGQ9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMua2V5PW51bGw7dGhpcy5sYT0tMTt9O0hiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5uYT8iTWFwS2V5U2V0SXRlcmF0b3JAIit0aGlzLm5hLnZhbHVlOiJNYXBLZXlTZXRJdGVyYXRvciI7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhIYi5wcm90b3R5cGUse2l0ZXJhdG9yOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXM7fX0sY291bnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5qYS5DYjt9fX0pO0hiLnByb3RvdHlwZS5maXJzdD1IYi5wcm90b3R5cGUuZmlyc3Q7SGIucHJvdG90eXBlLmhhc05leHQ9SGIucHJvdG90eXBlLmRkO0hiLnByb3RvdHlwZS5uZXh0PUhiLnByb3RvdHlwZS5uZXh0O0hiLnByb3RvdHlwZS5yZXNldD1IYi5wcm90b3R5cGUucmVzZXQ7SGIuY2xhc3NOYW1lPSJNYXBLZXlTZXRJdGVyYXRvciI7ZnVuY3Rpb24gSWIoYSl7Ri5jYWxsKHRoaXMpO21iKHRoaXMpO3RoaXMudj0hMDt0aGlzLmphPWE7fW9hKEliLEYpO3Q9SWIucHJvdG90eXBlO3QuZnJlZXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fTt0LmhhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fTt0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIk1hcEtleVNldCgiK3RoaXMuamEudG9TdHJpbmcoKSsiKSI7fTt0LmFkZD1mdW5jdGlvbigpe0EoIlRoaXMgU2V0IGlzIHJlYWQtb25seTogIit0aGlzLnRvU3RyaW5nKCkpO3JldHVybiB0aGlzO307dC5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5qYS5jb250YWlucyhhKTt9O3QuaGFzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbnRhaW5zKGEpO307dC5yZW1vdmU9ZnVuY3Rpb24oKXtBKCJUaGlzIFNldCBpcyByZWFkLW9ubHk6ICIrdGhpcy50b1N0cmluZygpKTtyZXR1cm4hMTt9O3QuZGVsZXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhKTt9O3QuY2xlYXI9ZnVuY3Rpb24oKXtBKCJUaGlzIFNldCBpcyByZWFkLW9ubHk6ICIrdGhpcy50b1N0cmluZygpKTt9O3QuZmlyc3Q9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmphLmZhO3JldHVybiBudWxsIT09YT9hLmtleTpudWxsO307SWIucHJvdG90eXBlLmFueT1mdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5qYS5mYTtudWxsIT09Yjspe2lmKGEoYi5rZXkpKXJldHVybiEwO2I9Yi5vYTt9cmV0dXJuITE7fTtJYi5wcm90b3R5cGUuYWxsPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmphLmZhO251bGwhPT1iOyl7aWYoIWEoYi5rZXkpKXJldHVybiExO2I9Yi5vYTt9cmV0dXJuITA7fTtJYi5wcm90b3R5cGUuZWFjaD1mdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5qYS5mYTtudWxsIT09Yjspe2EoYi5rZXkpLGI9Yi5vYTt9cmV0dXJuIHRoaXM7fTtJYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1uZXcgRigpLGM9dGhpcy5qYS5mYTtudWxsIT09Yzspe2IuYWRkKGEoYy5rZXkpKSxjPWMub2E7fXJldHVybiBiO307SWIucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbihhKXtmb3IodmFyIGI9bmV3IEYoKSxjPXRoaXMuamEuZmE7bnVsbCE9PWM7KXt2YXIgZD1jLmtleTthKGQpJiZiLmFkZChkKTtjPWMub2E7fXJldHVybiBiO307SWIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEliKHRoaXMuamEpO307SWIucHJvdG90eXBlLlF2PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IEYoKSxiPXRoaXMuamEuRGIsYztmb3IoYyBpbiBiKXthLmFkZChiW2NdLmtleSk7fXJldHVybiBhO307SWIucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qYS5EYixiPUFycmF5KHRoaXMuamEuQ2IpLGM9MCxkO2ZvcihkIGluIGEpe2JbY109YVtkXS5rZXksYysrO31yZXR1cm4gYjt9O0liLnByb3RvdHlwZS5Qdj1mdW5jdGlvbigpe3ZhciBhPW5ldyBFKCksYj10aGlzLmphLkRiLGM7Zm9yKGMgaW4gYil7YS5hZGQoYltjXS5rZXkpO31yZXR1cm4gYTt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEliLnByb3RvdHlwZSx7Y291bnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5qYS5DYjt9fSxzaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuamEuQ2I7fX0saXRlcmF0b3I6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMD49dGhpcy5qYS5DYj94YjpuZXcgSGIodGhpcy5qYSk7fX19KTtJYi5wcm90b3R5cGUudG9MaXN0PUliLnByb3RvdHlwZS5QdjtJYi5wcm90b3R5cGUudG9BcnJheT1JYi5wcm90b3R5cGUuTmE7SWIucHJvdG90eXBlLnRvU2V0PUliLnByb3RvdHlwZS5RdjtJYi5wcm90b3R5cGUuZmlyc3Q9SWIucHJvdG90eXBlLmZpcnN0O0liLnByb3RvdHlwZS5jbGVhcj1JYi5wcm90b3R5cGUuY2xlYXI7SWIucHJvdG90eXBlWyJkZWxldGUiXT1JYi5wcm90b3R5cGUuZGVsZXRlO0liLnByb3RvdHlwZS5yZW1vdmU9SWIucHJvdG90eXBlLnJlbW92ZTtJYi5wcm90b3R5cGUuaGFzPUliLnByb3RvdHlwZS5oYXM7SWIucHJvdG90eXBlLmNvbnRhaW5zPUliLnByb3RvdHlwZS5jb250YWlucztJYi5wcm90b3R5cGUuYWRkPUliLnByb3RvdHlwZS5hZGQ7SWIucHJvdG90eXBlLnRoYXc9SWIucHJvdG90eXBlLmhhO0liLnByb3RvdHlwZS5mcmVlemU9SWIucHJvdG90eXBlLmZyZWV6ZTtJYi5jbGFzc05hbWU9Ik1hcEtleVNldCI7ZnVuY3Rpb24gSmIoYSl7dGhpcy5qYT1hO2EuUmU9bnVsbDt0aGlzLmxhPWEuQmE7dGhpcy5uYT1udWxsO31KYi5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmphO2EuUmU9bnVsbDt0aGlzLmxhPWEuQmE7dGhpcy5uYT1udWxsO307SmIucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmphO2lmKGEuQmEhPT10aGlzLmxhJiZudWxsPT09dGhpcy5rZXkpcmV0dXJuITE7dmFyIGI9dGhpcy5uYTtiPW51bGw9PT1iP2EuZmE6Yi5vYTtpZihudWxsIT09YilyZXR1cm4gdGhpcy5uYT1iLHRoaXMudmFsdWU9Yi52YWx1ZSx0aGlzLmtleT1iLmtleSwhMDt0aGlzLnhkKCk7cmV0dXJuITE7fTtKYi5wcm90b3R5cGUuZGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uZXh0KCk7fTtKYi5wcm90b3R5cGUuZmlyc3Q9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmphO3RoaXMubGE9YS5CYTthPWEuZmE7aWYobnVsbCE9PWEpe3RoaXMubmE9YTt2YXIgYj1hLnZhbHVlO3RoaXMua2V5PWEua2V5O3JldHVybiB0aGlzLnZhbHVlPWI7fXJldHVybiBudWxsO307SmIucHJvdG90eXBlLmFueT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmphO3RoaXMubmE9Yi5SZT1udWxsO2ZvcihiPWIuZmE7bnVsbCE9PWI7KXtpZihhKGIudmFsdWUpKXJldHVybiEwO2I9Yi5vYTt9cmV0dXJuITE7fTtKYi5wcm90b3R5cGUuYWxsPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamE7dGhpcy5uYT1iLlJlPW51bGw7Zm9yKGI9Yi5mYTtudWxsIT09Yjspe2lmKCFhKGIudmFsdWUpKXJldHVybiExO2I9Yi5vYTt9cmV0dXJuITA7fTtKYi5wcm90b3R5cGUuZWFjaD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmphO3RoaXMubmE9Yi5SZT1udWxsO2ZvcihiPWIuZmE7bnVsbCE9PWI7KXthKGIudmFsdWUpLGI9Yi5vYTt9cmV0dXJuIHRoaXM7fTtKYi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamE7dGhpcy5uYT1iLlJlPW51bGw7dmFyIGM9bmV3IEUoKTtmb3IoYj1iLmZhO251bGwhPT1iOyl7Yy5hZGQoYShiLnZhbHVlKSksYj1iLm9hO31yZXR1cm4gYy5pdGVyYXRvcjt9O0piLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qYTt0aGlzLm5hPWIuUmU9bnVsbDt2YXIgYz1uZXcgRSgpO2ZvcihiPWIuZmE7bnVsbCE9PWI7KXt2YXIgZD1iLnZhbHVlO2EoZCkmJmMuYWRkKGQpO2I9Yi5vYTt9cmV0dXJuIGMuaXRlcmF0b3I7fTtKYi5wcm90b3R5cGUueGQ9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMua2V5PW51bGw7dGhpcy5sYT0tMTt0aGlzLmphLlJlPXRoaXM7fTtKYi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMubmE/Ik1hcFZhbHVlU2V0SXRlcmF0b3JAIit0aGlzLm5hLnZhbHVlOiJNYXBWYWx1ZVNldEl0ZXJhdG9yIjt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEpiLnByb3RvdHlwZSx7aXRlcmF0b3I6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpczt9fSxjb3VudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmphLkNiO319fSk7SmIucHJvdG90eXBlLmZpcnN0PUpiLnByb3RvdHlwZS5maXJzdDtKYi5wcm90b3R5cGUuaGFzTmV4dD1KYi5wcm90b3R5cGUuZGQ7SmIucHJvdG90eXBlLm5leHQ9SmIucHJvdG90eXBlLm5leHQ7SmIucHJvdG90eXBlLnJlc2V0PUpiLnByb3RvdHlwZS5yZXNldDtKYi5jbGFzc05hbWU9Ik1hcFZhbHVlU2V0SXRlcmF0b3IiO2Z1bmN0aW9uIEZiKGEsYil7dGhpcy5rZXk9YTt0aGlzLnZhbHVlPWI7dGhpcy53bD10aGlzLm9hPW51bGw7fUZiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJ7Iit0aGlzLmtleSsiOiIrdGhpcy52YWx1ZSsifSI7fTtGYi5jbGFzc05hbWU9IktleVZhbHVlUGFpciI7ZnVuY3Rpb24gS2IoYSl7dGhpcy5qYT1hO2EuSmE9bnVsbDt0aGlzLmxhPWEuQmE7dGhpcy5uYT1udWxsO31LYi5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmphO2EuSmE9bnVsbDt0aGlzLmxhPWEuQmE7dGhpcy5uYT1udWxsO307S2IucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmphO2lmKGEuQmEhPT10aGlzLmxhJiZudWxsPT09dGhpcy5rZXkpcmV0dXJuITE7dmFyIGI9dGhpcy5uYTtiPW51bGw9PT1iP2EuZmE6Yi5vYTtpZihudWxsIT09YilyZXR1cm4gdGhpcy5uYT1iLHRoaXMua2V5PWIua2V5LHRoaXMudmFsdWU9Yi52YWx1ZSwhMDt0aGlzLnhkKCk7cmV0dXJuITE7fTtLYi5wcm90b3R5cGUuZGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uZXh0KCk7fTtLYi5wcm90b3R5cGUuZmlyc3Q9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmphO3RoaXMubGE9YS5CYTthPWEuZmE7cmV0dXJuIG51bGwhPT1hPyh0aGlzLm5hPWEsdGhpcy5rZXk9YS5rZXksdGhpcy52YWx1ZT1hLnZhbHVlLGEpOm51bGw7fTtLYi5wcm90b3R5cGUuYW55PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamE7dGhpcy5uYT1iLkphPW51bGw7Zm9yKGI9Yi5mYTtudWxsIT09Yjspe2lmKGEoYikpcmV0dXJuITA7Yj1iLm9hO31yZXR1cm4hMTt9O0tiLnByb3RvdHlwZS5hbGw9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qYTt0aGlzLm5hPWIuSmE9bnVsbDtmb3IoYj1iLmZhO251bGwhPT1iOyl7aWYoIWEoYikpcmV0dXJuITE7Yj1iLm9hO31yZXR1cm4hMDt9O0tiLnByb3RvdHlwZS5lYWNoPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamE7dGhpcy5uYT1iLkphPW51bGw7Zm9yKGI9Yi5mYTtudWxsIT09Yjspe2EoYiksYj1iLm9hO31yZXR1cm4gdGhpczt9O0tiLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qYTt0aGlzLm5hPWIuSmE9bnVsbDt2YXIgYz1uZXcgRSgpO2ZvcihiPWIuZmE7bnVsbCE9PWI7KXtjLmFkZChhKGIpKSxiPWIub2E7fXJldHVybiBjLml0ZXJhdG9yO307S2IucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmphO3RoaXMubmE9Yi5KYT1udWxsO3ZhciBjPW5ldyBFKCk7Zm9yKGI9Yi5mYTtudWxsIT09Yjspe2EoYikmJmMuYWRkKGIpLGI9Yi5vYTt9cmV0dXJuIGMuaXRlcmF0b3I7fTtLYi5wcm90b3R5cGUueGQ9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMua2V5PW51bGw7dGhpcy5sYT0tMTt0aGlzLmphLkphPXRoaXM7fTtLYi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMubmE/Ik1hcEl0ZXJhdG9yQCIrdGhpcy5uYToiTWFwSXRlcmF0b3IiO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoS2IucHJvdG90eXBlLHtpdGVyYXRvcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzO319LGNvdW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuamEuQ2I7fX19KTtLYi5wcm90b3R5cGUuZmlyc3Q9S2IucHJvdG90eXBlLmZpcnN0O0tiLnByb3RvdHlwZS5oYXNOZXh0PUtiLnByb3RvdHlwZS5kZDtLYi5wcm90b3R5cGUubmV4dD1LYi5wcm90b3R5cGUubmV4dDtLYi5wcm90b3R5cGUucmVzZXQ9S2IucHJvdG90eXBlLnJlc2V0O0tiLmNsYXNzTmFtZT0iTWFwSXRlcmF0b3IiO2Z1bmN0aW9uIExiKGEpe21iKHRoaXMpO3RoaXMudj0hMTt0aGlzLkRiPXt9O3RoaXMuQ2I9MDt0aGlzLlJlPXRoaXMuSmE9bnVsbDt0aGlzLkJhPTA7dGhpcy5TZT10aGlzLmZhPW51bGw7dm9pZCAwIT09YSYmKCJmdW5jdGlvbiI9PT10eXBlb2YgYXx8InN0cmluZyI9PT10eXBlb2YgYT96YSgpOnRoaXMuYWRkQWxsKGEpKTt9dD1MYi5wcm90b3R5cGU7dC5rYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuQmE7YSsrOzk5OTk5OTk5OTxhJiYoYT0wKTt0aGlzLkJhPWE7fTt0LmZyZWV6ZT1mdW5jdGlvbigpe3RoaXMudj0hMDtyZXR1cm4gdGhpczt9O3QuaGE9ZnVuY3Rpb24oKXt0aGlzLnY9ITE7cmV0dXJuIHRoaXM7fTt0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIk1hcCgpIyIrQmIodGhpcyk7fTt0LmFkZD1mdW5jdGlvbihhLGIpe3RoaXMudiYmd2EodGhpcyxhKTt2YXIgYz1hO0NhKGEpJiYoYz1EYihhKSk7dmFyIGQ9dGhpcy5EYltjXTt2b2lkIDA9PT1kPyh0aGlzLkNiKyssYT1uZXcgRmIoYSxiKSx0aGlzLkRiW2NdPWEsYz10aGlzLlNlLG51bGw9PT1jP3RoaXMuZmE9YTooYS53bD1jLGMub2E9YSksdGhpcy5TZT1hLHRoaXMua2IoKSk6ZC52YWx1ZT1iO3JldHVybiB0aGlzO307dC5zZXQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hZGQoYSxiKTt9O3QuYWRkQWxsPWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiB0aGlzO2lmKEVhKGEpKWZvcih2YXIgYj1hLmxlbmd0aCxjPTA7YzxiO2MrKyl7dmFyIGQ9YVtjXTt0aGlzLmFkZChkLmtleSxkLnZhbHVlKTt9ZWxzZSBmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7Yj1hLnZhbHVlLHRoaXMuYWRkKGIua2V5LGIudmFsdWUpO31yZXR1cm4gdGhpczt9O3QuZmlyc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mYTt9O0xiLnByb3RvdHlwZS5hbnk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuZmE7bnVsbCE9PWI7KXtpZihhKGIpKXJldHVybiEwO2I9Yi5vYTt9cmV0dXJuITE7fTtMYi5wcm90b3R5cGUuYWxsPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmZhO251bGwhPT1iOyl7aWYoIWEoYikpcmV0dXJuITE7Yj1iLm9hO31yZXR1cm4hMDt9O0xiLnByb3RvdHlwZS5lYWNoPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmZhO251bGwhPT1iOyl7YShiKSxiPWIub2E7fXJldHVybiB0aGlzO307TGIucHJvdG90eXBlLm1hcD1mdW5jdGlvbihhKXtmb3IodmFyIGI9bmV3IExiKCksYz10aGlzLmZhO251bGwhPT1jOyl7Yi5hZGQoYy5rZXksYShjKSksYz1jLm9hO31yZXR1cm4gYjt9O0xiLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPW5ldyBMYigpLGM9dGhpcy5mYTtudWxsIT09Yzspe2EoYykmJmIuYWRkKGMua2V5LGMudmFsdWUpLGM9Yy5vYTt9cmV0dXJuIGI7fTt0PUxiLnByb3RvdHlwZTt0LmNvbnRhaW5zPWZ1bmN0aW9uKGEpe3ZhciBiPWE7cmV0dXJuIENhKGEpJiYoYj1CYihhKSx2b2lkIDA9PT1iKT8hMTp2b2lkIDAhPT10aGlzLkRiW2JdO307dC5oYXM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29udGFpbnMoYSk7fTt0Lko9ZnVuY3Rpb24oYSl7dmFyIGI9YTtpZihDYShhKSYmKGI9QmIoYSksdm9pZCAwPT09YikpcmV0dXJuIG51bGw7YT10aGlzLkRiW2JdO3JldHVybiB2b2lkIDA9PT1hP251bGw6YS52YWx1ZTt9O3QuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkooYSk7fTt0LnJlbW92ZT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4hMTt0aGlzLnYmJndhKHRoaXMsYSk7dmFyIGI9YTtpZihDYShhKSYmKGI9QmIoYSksdm9pZCAwPT09YikpcmV0dXJuITE7YT10aGlzLkRiW2JdO2lmKHZvaWQgMD09PWEpcmV0dXJuITE7dmFyIGM9YS5vYSxkPWEud2w7bnVsbCE9PWMmJihjLndsPWQpO251bGwhPT1kJiYoZC5vYT1jKTt0aGlzLmZhPT09YSYmKHRoaXMuZmE9Yyk7dGhpcy5TZT09PWEmJih0aGlzLlNlPWQpO2RlbGV0ZSB0aGlzLkRiW2JdO3RoaXMuQ2ItLTt0aGlzLmtiKCk7cmV0dXJuITA7fTt0LmRlbGV0ZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSk7fTt0LmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy52JiZ3YSh0aGlzKTt0aGlzLkRiPXt9O3RoaXMuQ2I9MDtudWxsIT09dGhpcy5KYSYmdGhpcy5KYS5yZXNldCgpO251bGwhPT10aGlzLlJlJiZ0aGlzLlJlLnJlc2V0KCk7dGhpcy5TZT10aGlzLmZhPW51bGw7dGhpcy5rYigpO307TGIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgTGIoKSxiPXRoaXMuRGIsYztmb3IoYyBpbiBiKXt2YXIgZD1iW2NdO2EuYWRkKGQua2V5LGQudmFsdWUpO31yZXR1cm4gYTt9O0xiLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuRGIsYj1BcnJheSh0aGlzLkNiKSxjPTAsZDtmb3IoZCBpbiBhKXt2YXIgZT1hW2RdO2JbY109bmV3IEZiKGUua2V5LGUudmFsdWUpO2MrKzt9cmV0dXJuIGI7fTtMYi5wcm90b3R5cGUuWWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEliKHRoaXMpO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTGIucHJvdG90eXBlLHtjb3VudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkNiO319LHNpemU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DYjt9fSxpdGVyYXRvcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe2lmKDA+PXRoaXMuY291bnQpcmV0dXJuIHhiO3ZhciBhPXRoaXMuSmE7cmV0dXJuIG51bGwhPT1hPyhhLnJlc2V0KCksYSk6bmV3IEtiKHRoaXMpO319LGl0ZXJhdG9yS2V5czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwPj10aGlzLmNvdW50P3hiOm5ldyBIYih0aGlzKTt9fSxpdGVyYXRvclZhbHVlczp7Z2V0OmZ1bmN0aW9uIGdldCgpe2lmKDA+PXRoaXMuY291bnQpcmV0dXJuIHhiO3ZhciBhPXRoaXMuUmU7cmV0dXJuIG51bGwhPT1hPyhhLnJlc2V0KCksYSk6bmV3IEpiKHRoaXMpO319fSk7TGIucHJvdG90eXBlLnRvS2V5U2V0PUxiLnByb3RvdHlwZS5ZZDtMYi5wcm90b3R5cGUudG9BcnJheT1MYi5wcm90b3R5cGUuTmE7TGIucHJvdG90eXBlLmNsZWFyPUxiLnByb3RvdHlwZS5jbGVhcjtMYi5wcm90b3R5cGVbImRlbGV0ZSJdPUxiLnByb3RvdHlwZS5kZWxldGU7TGIucHJvdG90eXBlLnJlbW92ZT1MYi5wcm90b3R5cGUucmVtb3ZlO0xiLnByb3RvdHlwZS5nZXQ9TGIucHJvdG90eXBlLmdldDtMYi5wcm90b3R5cGUuZ2V0VmFsdWU9TGIucHJvdG90eXBlLko7TGIucHJvdG90eXBlLmhhcz1MYi5wcm90b3R5cGUuaGFzO0xiLnByb3RvdHlwZS5jb250YWlucz1MYi5wcm90b3R5cGUuY29udGFpbnM7TGIucHJvdG90eXBlLmZpcnN0PUxiLnByb3RvdHlwZS5maXJzdDtMYi5wcm90b3R5cGUuYWRkQWxsPUxiLnByb3RvdHlwZS5hZGRBbGw7TGIucHJvdG90eXBlLnNldD1MYi5wcm90b3R5cGUuc2V0O0xiLnByb3RvdHlwZS5hZGQ9TGIucHJvdG90eXBlLmFkZDtMYi5wcm90b3R5cGUudGhhdz1MYi5wcm90b3R5cGUuaGE7TGIucHJvdG90eXBlLmZyZWV6ZT1MYi5wcm90b3R5cGUuZnJlZXplO0xiLmNsYXNzTmFtZT0iTWFwIjtmdW5jdGlvbiBHKGEsYil7dm9pZCAwPT09YT90aGlzLkc9dGhpcy5GPTA6Im51bWJlciI9PT10eXBlb2YgYSYmIm51bWJlciI9PT10eXBlb2YgYj8odGhpcy5GPWEsdGhpcy5HPWIpOkEoIkludmFsaWQgYXJndW1lbnRzIHRvIFBvaW50IGNvbnN0cnVjdG9yOiAiK2ErIiwgIitiKTt0aGlzLnY9ITE7fUcucHJvdG90eXBlLmFzc2lnbj1mdW5jdGlvbihhKXt0aGlzLkY9YS5GO3RoaXMuRz1hLkc7cmV0dXJuIHRoaXM7fTtHLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEsYil7dGhpcy5GPWE7dGhpcy5HPWI7cmV0dXJuIHRoaXM7fTtHLnByb3RvdHlwZS50Zz1mdW5jdGlvbihhLGIpe3RoaXMuRj1hO3RoaXMuRz1iO3JldHVybiB0aGlzO307Ry5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEpe3RoaXMuRj1hLkY7dGhpcy5HPWEuRztyZXR1cm4gdGhpczt9O0cucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRygpO2EuRj10aGlzLkY7YS5HPXRoaXMuRztyZXR1cm4gYTt9O3Q9Ry5wcm90b3R5cGU7dC5nYT1mdW5jdGlvbigpe3RoaXMudj0hMDtPYmplY3QuZnJlZXplKHRoaXMpO3JldHVybiB0aGlzO307dC5JPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5pc0Zyb3plbih0aGlzKT90aGlzOnRoaXMuY29weSgpLmZyZWV6ZSgpO307dC5mcmVlemU9ZnVuY3Rpb24oKXt0aGlzLnY9ITA7cmV0dXJuIHRoaXM7fTt0LmhhPWZ1bmN0aW9uKCl7T2JqZWN0LmlzRnJvemVuKHRoaXMpJiZBKCJjYW5ub3QgdGhhdyBjb25zdGFudDogIit0aGlzKTt0aGlzLnY9ITE7cmV0dXJuIHRoaXM7fTtmdW5jdGlvbiBOYihhKXtpZigic3RyaW5nIj09PXR5cGVvZiBhKXthPWEuc3BsaXQoIiAiKTtmb3IodmFyIGI9MCxjPTA7IiI9PT1hW2JdOyl7YisrO312YXIgZD1hW2IrK107ZCYmKGM9cGFyc2VGbG9hdChkKSk7Zm9yKHZhciBlPTA7IiI9PT1hW2JdOyl7YisrO30oZD1hW2IrK10pJiYoZT1wYXJzZUZsb2F0KGQpKTtyZXR1cm4gbmV3IEcoYyxlKTt9cmV0dXJuIG5ldyBHKCk7fWZ1bmN0aW9uIE9iKGEpe3JldHVybiBhLngudG9TdHJpbmcoKSsiICIrYS55LnRvU3RyaW5nKCk7fXQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUG9pbnQoIit0aGlzLngrIiwiK3RoaXMueSsiKSI7fTt0LkE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBHP3RoaXMuRj09PWEueCYmdGhpcy5HPT09YS55OiExO307dC5EaT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkY9PT1hJiZ0aGlzLkc9PT1iO307dC5RYT1mdW5jdGlvbihhKXtyZXR1cm4gSC53KHRoaXMuRixhLngpJiZILncodGhpcy5HLGEueSk7fTt0LmFkZD1mdW5jdGlvbihhKXt0aGlzLkYrPWEueDt0aGlzLkcrPWEueTtyZXR1cm4gdGhpczt9O3QuWGQ9ZnVuY3Rpb24oYSl7dGhpcy5GLT1hLng7dGhpcy5HLT1hLnk7cmV0dXJuIHRoaXM7fTt0Lm9mZnNldD1mdW5jdGlvbihhLGIpe3RoaXMuRis9YTt0aGlzLkcrPWI7cmV0dXJuIHRoaXM7fTtHLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24oYSl7aWYoMD09PWEpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5GLGM9dGhpcy5HO2lmKDA9PT1iJiYwPT09YylyZXR1cm4gdGhpczszNjA8PWE/YS09MzYwOjA+YSYmKGErPTM2MCk7aWYoOTA9PT1hKXthPTA7dmFyIGQ9MTt9ZWxzZSAxODA9PT1hPyhhPS0xLGQ9MCk6MjcwPT09YT8oYT0wLGQ9LTEpOihkPWEqTWF0aC5QSS8xODAsYT1NYXRoLmNvcyhkKSxkPU1hdGguc2luKGQpKTt0aGlzLkY9YSpiLWQqYzt0aGlzLkc9ZCpiK2EqYztyZXR1cm4gdGhpczt9O3Q9Ry5wcm90b3R5cGU7dC5zY2FsZT1mdW5jdGlvbihhLGIpe3RoaXMuRio9YTt0aGlzLkcqPWI7cmV0dXJuIHRoaXM7fTt0LkJlPWZ1bmN0aW9uKGEpe3ZhciBiPWEueC10aGlzLkY7YT1hLnktdGhpcy5HO3JldHVybiBiKmIrYSphO307dC5jZD1mdW5jdGlvbihhLGIpe2EtPXRoaXMuRjtiLT10aGlzLkc7cmV0dXJuIGEqYStiKmI7fTt0Lm5vcm1hbGl6ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuRixiPXRoaXMuRyxjPU1hdGguc3FydChhKmErYipiKTswPGMmJih0aGlzLkY9YS9jLHRoaXMuRz1iL2MpO3JldHVybiB0aGlzO307dC5XYT1mdW5jdGlvbihhKXtyZXR1cm4gUGIoYS54LXRoaXMuRixhLnktdGhpcy5HKTt9O3QuZGlyZWN0aW9uPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFBiKGEtdGhpcy5GLGItdGhpcy5HKTt9O2Z1bmN0aW9uIFBiKGEsYil7aWYoMD09PWEpcmV0dXJuIDA8Yj85MDowPmI/MjcwOjA7aWYoMD09PWIpcmV0dXJuIDA8YT8wOjE4MDtpZihpc05hTihhKXx8aXNOYU4oYikpcmV0dXJuIDA7dmFyIGM9MTgwKk1hdGguYXRhbihNYXRoLmFicyhiL2EpKS9NYXRoLlBJOzA+YT9jPTA+Yj9jKzE4MDoxODAtYzowPmImJihjPTM2MC1jKTtyZXR1cm4gYzt9dC5Jej1mdW5jdGlvbihhLGIsYyxkKXtILlFpKGEsYixjLGQsdGhpcy5GLHRoaXMuRyx0aGlzKTtyZXR1cm4gdGhpczt9O3QuSno9ZnVuY3Rpb24oYSxiKXtILlFpKGEueCxhLnksYi54LGIueSx0aGlzLkYsdGhpcy5HLHRoaXMpO3JldHVybiB0aGlzO307dC5Vej1mdW5jdGlvbihhLGIsYyxkKXtILlRwKHRoaXMuRix0aGlzLkcsYSxiLGMsZCx0aGlzKTtyZXR1cm4gdGhpczt9O3QuVno9ZnVuY3Rpb24oYSxiKXtILlRwKHRoaXMuRix0aGlzLkcsYS54LGEueSxiLndpZHRoLGIuaGVpZ2h0LHRoaXMpO3JldHVybiB0aGlzO307dC5UaT1mdW5jdGlvbihhLGIpe3RoaXMuRj1hLngrYi54KmEud2lkdGgrYi5vZmZzZXRYO3RoaXMuRz1hLnkrYi55KmEuaGVpZ2h0K2Iub2Zmc2V0WTtyZXR1cm4gdGhpczt9O3QucWs9ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aGlzLkY9YStlLngqYytlLm9mZnNldFg7dGhpcy5HPWIrZS55KmQrZS5vZmZzZXRZO3JldHVybiB0aGlzO307dC50cmFuc2Zvcm09ZnVuY3Rpb24oYSl7YS50YSh0aGlzKTtyZXR1cm4gdGhpczt9O2Z1bmN0aW9uIFFiKGEsYil7Yi5VZChhKTtyZXR1cm4gYTt9ZnVuY3Rpb24gUmIoYSxiLGMsZCxlLGYpe3ZhciBnPWUtYyxoPWYtZCxrPWcqZytoKmg7Yy09YTtkLT1iO3ZhciBsPS1jKmctZCpoO2lmKDA+PWx8fGw+PWspcmV0dXJuIGc9ZS1hLGg9Zi1iLE1hdGgubWluKGMqYytkKmQsZypnK2gqaCk7YT1nKmQtaCpjO3JldHVybiBhKmEvazt9ZnVuY3Rpb24gU2IoYSxiLGMsZCl7YT1jLWE7Yj1kLWI7cmV0dXJuIGEqYStiKmI7fWZ1bmN0aW9uIFRiKGEsYixjLGQpe2E9Yy1hO2I9ZC1iO2lmKDA9PT1hKXJldHVybiAwPGI/OTA6MD5iPzI3MDowO2lmKDA9PT1iKXJldHVybiAwPGE/MDoxODA7aWYoaXNOYU4oYSl8fGlzTmFOKGIpKXJldHVybiAwO2Q9MTgwKk1hdGguYXRhbihNYXRoLmFicyhiL2EpKS9NYXRoLlBJOzA+YT9kPTA+Yj9kKzE4MDoxODAtZDowPmImJihkPTM2MC1kKTtyZXR1cm4gZDt9dC5vPWZ1bmN0aW9uKCl7cmV0dXJuIGlzRmluaXRlKHRoaXMueCkmJmlzRmluaXRlKHRoaXMueSk7fTtHLmFsbG9jPWZ1bmN0aW9uKCl7dmFyIGE9JGIucG9wKCk7cmV0dXJuIHZvaWQgMD09PWE/bmV3IEcoKTphO307Ry5hbGxvY0F0PWZ1bmN0aW9uKGEsYil7dmFyIGM9JGIucG9wKCk7aWYodm9pZCAwPT09YylyZXR1cm4gbmV3IEcoYSxiKTtjLng9YTtjLnk9YjtyZXR1cm4gYzt9O0cuZnJlZT1mdW5jdGlvbihhKXskYi5wdXNoKGEpO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRy5wcm90b3R5cGUse3g6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5GO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkY9YTt9fSx5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5HPWE7fX19KTtHLnByb3RvdHlwZS5pc1JlYWw9Ry5wcm90b3R5cGUubztHLnByb3RvdHlwZS5zZXRTcG90PUcucHJvdG90eXBlLnFrO0cucHJvdG90eXBlLnNldFJlY3RTcG90PUcucHJvdG90eXBlLlRpO0cucHJvdG90eXBlLnNuYXBUb0dyaWRQb2ludD1HLnByb3RvdHlwZS5WejtHLnByb3RvdHlwZS5zbmFwVG9HcmlkPUcucHJvdG90eXBlLlV6O0cucHJvdG90eXBlLnByb2plY3RPbnRvTGluZVNlZ21lbnRQb2ludD1HLnByb3RvdHlwZS5KejtHLnByb3RvdHlwZS5wcm9qZWN0T250b0xpbmVTZWdtZW50PUcucHJvdG90eXBlLkl6O0cucHJvdG90eXBlLmRpcmVjdGlvbj1HLnByb3RvdHlwZS5kaXJlY3Rpb247Ry5wcm90b3R5cGUuZGlyZWN0aW9uUG9pbnQ9Ry5wcm90b3R5cGUuV2E7Ry5wcm90b3R5cGUubm9ybWFsaXplPUcucHJvdG90eXBlLm5vcm1hbGl6ZTtHLnByb3RvdHlwZS5kaXN0YW5jZVNxdWFyZWQ9Ry5wcm90b3R5cGUuY2Q7Ry5wcm90b3R5cGUuZGlzdGFuY2VTcXVhcmVkUG9pbnQ9Ry5wcm90b3R5cGUuQmU7Ry5wcm90b3R5cGUuc2NhbGU9Ry5wcm90b3R5cGUuc2NhbGU7Ry5wcm90b3R5cGUucm90YXRlPUcucHJvdG90eXBlLnJvdGF0ZTtHLnByb3RvdHlwZS5vZmZzZXQ9Ry5wcm90b3R5cGUub2Zmc2V0O0cucHJvdG90eXBlLnN1YnRyYWN0PUcucHJvdG90eXBlLlhkO0cucHJvdG90eXBlLmFkZD1HLnByb3RvdHlwZS5hZGQ7Ry5wcm90b3R5cGUuZXF1YWxzQXBwcm94PUcucHJvdG90eXBlLlFhO0cucHJvdG90eXBlLmVxdWFsVG89Ry5wcm90b3R5cGUuRGk7Ry5wcm90b3R5cGUuZXF1YWxzPUcucHJvdG90eXBlLkE7Ry5wcm90b3R5cGUuc2V0PUcucHJvdG90eXBlLnNldDtHLnByb3RvdHlwZS5zZXRUbz1HLnByb3RvdHlwZS50Zzt2YXIgYWM9bnVsbCxiYz1udWxsLGNjPW51bGwsZGM9bnVsbCxlYz1udWxsLCRiPVtdO0cuY2xhc3NOYW1lPSJQb2ludCI7Ry5wYXJzZT1OYjtHLnN0cmluZ2lmeT1PYjtHLmRpc3RhbmNlTGluZVNlZ21lbnRTcXVhcmVkPVJiO0cuZGlzdGFuY2VTcXVhcmVkPVNiO0cuZGlyZWN0aW9uPVRiO0cuT3JpZ2luPWFjPW5ldyBHKDAsMCkuZ2EoKTtHLkluZmluaXRlVG9wTGVmdD1iYz1uZXcgRygtSW5maW5pdHksLUluZmluaXR5KS5nYSgpO0cuSW5maW5pdGVCb3R0b21SaWdodD1jYz1uZXcgRyhJbmZpbml0eSxJbmZpbml0eSkuZ2EoKTtHLlNpeFBvaW50PWRjPW5ldyBHKDYsNikuZ2EoKTtHLk5vUG9pbnQ9ZWM9bmV3IEcoTmFOLE5hTikuZ2EoKTtHLnBhcnNlPU5iO0cuc3RyaW5naWZ5PU9iO0cuZGlzdGFuY2VMaW5lU2VnbWVudFNxdWFyZWQ9UmI7Ry5kaXN0YW5jZVNxdWFyZWQ9U2I7Ry5kaXJlY3Rpb249VGI7ZnVuY3Rpb24gSyhhLGIpe3ZvaWQgMD09PWE/dGhpcy5aPXRoaXMuJD0wOiJudW1iZXIiPT09dHlwZW9mIGEmJigwPD1hfHxpc05hTihhKSkmJiJudW1iZXIiPT09dHlwZW9mIGImJigwPD1ifHxpc05hTihiKSk/KHRoaXMuJD1hLHRoaXMuWj1iKTpBKCJJbnZhbGlkIGFyZ3VtZW50cyB0byBTaXplIGNvbnN0cnVjdG9yOiAiK2ErIiwgIitiKTt0aGlzLnY9ITE7fXZhciBmYyxnYyxoYyxpYyxrYyxsYyxtYztLLnByb3RvdHlwZS5hc3NpZ249ZnVuY3Rpb24oYSl7dGhpcy4kPWEuJDt0aGlzLlo9YS5aO3JldHVybiB0aGlzO307Sy5wcm90b3R5cGUuaD1mdW5jdGlvbihhLGIpe3RoaXMuJD1hO3RoaXMuWj1iO3JldHVybiB0aGlzO307Sy5wcm90b3R5cGUudGc9ZnVuY3Rpb24oYSxiKXt0aGlzLiQ9YTt0aGlzLlo9YjtyZXR1cm4gdGhpczt9O0sucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXt0aGlzLiQ9YS4kO3RoaXMuWj1hLlo7cmV0dXJuIHRoaXM7fTtLLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IEsoKTthLiQ9dGhpcy4kO2EuWj10aGlzLlo7cmV0dXJuIGE7fTt0PUsucHJvdG90eXBlO3QuZ2E9ZnVuY3Rpb24oKXt0aGlzLnY9ITA7T2JqZWN0LmZyZWV6ZSh0aGlzKTtyZXR1cm4gdGhpczt9O3QuST1mdW5jdGlvbigpe3JldHVybiBPYmplY3QuaXNGcm96ZW4odGhpcyk/dGhpczp0aGlzLmNvcHkoKS5mcmVlemUoKTt9O3QuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy52PSEwO3JldHVybiB0aGlzO307dC5oYT1mdW5jdGlvbigpe09iamVjdC5pc0Zyb3plbih0aGlzKSYmQSgiY2Fubm90IHRoYXcgY29uc3RhbnQ6ICIrdGhpcyk7dGhpcy52PSExO3JldHVybiB0aGlzO307ZnVuY3Rpb24gbmMoYSl7aWYoInN0cmluZyI9PT10eXBlb2YgYSl7YT1hLnNwbGl0KCIgIik7Zm9yKHZhciBiPTAsYz0wOyIiPT09YVtiXTspe2IrKzt9dmFyIGQ9YVtiKytdO2QmJihjPXBhcnNlRmxvYXQoZCkpO2Zvcih2YXIgZT0wOyIiPT09YVtiXTspe2IrKzt9KGQ9YVtiKytdKSYmKGU9cGFyc2VGbG9hdChkKSk7cmV0dXJuIG5ldyBLKGMsZSk7fXJldHVybiBuZXcgSygpO31mdW5jdGlvbiBvYyhhKXtyZXR1cm4gYS53aWR0aC50b1N0cmluZygpKyIgIithLmhlaWdodC50b1N0cmluZygpO310LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlNpemUoIit0aGlzLndpZHRoKyIsIit0aGlzLmhlaWdodCsiKSI7fTt0LkE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBLP3RoaXMuJD09PWEud2lkdGgmJnRoaXMuWj09PWEuaGVpZ2h0OiExO307dC5EaT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLiQ9PT1hJiZ0aGlzLlo9PT1iO307dC5RYT1mdW5jdGlvbihhKXtyZXR1cm4gSC53KHRoaXMuJCxhLndpZHRoKSYmSC53KHRoaXMuWixhLmhlaWdodCk7fTt0Lm89ZnVuY3Rpb24oKXtyZXR1cm4gaXNGaW5pdGUodGhpcy53aWR0aCkmJmlzRmluaXRlKHRoaXMuaGVpZ2h0KTt9O0suYWxsb2M9ZnVuY3Rpb24oKXt2YXIgYT1wYy5wb3AoKTtyZXR1cm4gdm9pZCAwPT09YT9uZXcgSygpOmE7fTtLLmZyZWU9ZnVuY3Rpb24oYSl7cGMucHVzaChhKTt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEsucHJvdG90eXBlLHt3aWR0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLiQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpezA+YSYmeGEoYSwiPj0gMCIsSywid2lkdGgiKTt0aGlzLiQ9YTt9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5aO30sc2V0OmZ1bmN0aW9uIHNldChhKXswPmEmJnhhKGEsIj49IDAiLEssImhlaWdodCIpO3RoaXMuWj1hO319fSk7Sy5wcm90b3R5cGUuaXNSZWFsPUsucHJvdG90eXBlLm87Sy5wcm90b3R5cGUuZXF1YWxzQXBwcm94PUsucHJvdG90eXBlLlFhO0sucHJvdG90eXBlLmVxdWFsVG89Sy5wcm90b3R5cGUuRGk7Sy5wcm90b3R5cGUuZXF1YWxzPUsucHJvdG90eXBlLkE7Sy5wcm90b3R5cGUuc2V0PUsucHJvdG90eXBlLnNldDtLLnByb3RvdHlwZS5zZXRUbz1LLnByb3RvdHlwZS50Zzt2YXIgcGM9W107Sy5jbGFzc05hbWU9IlNpemUiO0sucGFyc2U9bmM7Sy5zdHJpbmdpZnk9b2M7Sy5aZXJvU2l6ZT1mYz1uZXcgSygwLDApLmdhKCk7Sy5PbmVTaXplPWdjPW5ldyBLKDEsMSkuZ2EoKTtLLlNpeFNpemU9aGM9bmV3IEsoNiw2KS5nYSgpO0suRWlnaHRTaXplPWljPW5ldyBLKDgsOCkuZ2EoKTtLLlRlblNpemU9a2M9bmV3IEsoMTAsMTApLmdhKCk7Sy5JbmZpbml0ZVNpemU9bGM9bmV3IEsoSW5maW5pdHksSW5maW5pdHkpLmdhKCk7Sy5Ob1NpemU9bWM9bmV3IEsoTmFOLE5hTikuZ2EoKTtLLnBhcnNlPW5jO0suc3RyaW5naWZ5PW9jO2Z1bmN0aW9uIE4oYSxiLGMsZCl7dm9pZCAwPT09YT90aGlzLlo9dGhpcy4kPXRoaXMuRz10aGlzLkY9MDphIGluc3RhbmNlb2YgRz8oYz1hLngsYT1hLnksYiBpbnN0YW5jZW9mIEc/KGQ9Yi54LGI9Yi55LHRoaXMuRj1NYXRoLm1pbihjLGQpLHRoaXMuRz1NYXRoLm1pbihhLGIpLHRoaXMuJD1NYXRoLmFicyhjLWQpLHRoaXMuWj1NYXRoLmFicyhhLWIpKTpiIGluc3RhbmNlb2YgSz8odGhpcy5GPWMsdGhpcy5HPWEsdGhpcy4kPWIuJCx0aGlzLlo9Yi5aKTpBKCJJbmNvcnJlY3QgYXJndW1lbnRzIHN1cHBsaWVkIHRvIFJlY3QgY29uc3RydWN0b3IiKSk6Im51bWJlciI9PT10eXBlb2YgYSYmIm51bWJlciI9PT10eXBlb2YgYiYmIm51bWJlciI9PT10eXBlb2YgYyYmKDA8PWN8fGlzTmFOKGMpKSYmIm51bWJlciI9PT10eXBlb2YgZCYmKDA8PWR8fGlzTmFOKGQpKT8odGhpcy5GPWEsdGhpcy5HPWIsdGhpcy4kPWMsdGhpcy5aPWQpOkEoIkludmFsaWQgYXJndW1lbnRzIHRvIFJlY3QgY29uc3RydWN0b3I6ICIrYSsiLCAiK2IrIiwgIitjKyIsICIrZCk7dGhpcy52PSExO310PU4ucHJvdG90eXBlO3QuYXNzaWduPWZ1bmN0aW9uKGEpe3RoaXMuRj1hLkY7dGhpcy5HPWEuRzt0aGlzLiQ9YS4kO3RoaXMuWj1hLlo7cmV0dXJuIHRoaXM7fTt0Lmg9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5GPWE7dGhpcy5HPWI7dGhpcy4kPWM7dGhpcy5aPWQ7cmV0dXJuIHRoaXM7fTtmdW5jdGlvbiBzYyhhLGIsYyl7YS4kPWI7YS5aPWM7fXQudGc9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5GPWE7dGhpcy5HPWI7dGhpcy4kPWM7dGhpcy5aPWQ7cmV0dXJuIHRoaXM7fTt0LnNldD1mdW5jdGlvbihhKXt0aGlzLkY9YS5GO3RoaXMuRz1hLkc7dGhpcy4kPWEuJDt0aGlzLlo9YS5aO3JldHVybiB0aGlzO307dC5qZD1mdW5jdGlvbihhKXt0aGlzLkY9YS54O3RoaXMuRz1hLnk7cmV0dXJuIHRoaXM7fTt0LlN6PWZ1bmN0aW9uKGEpe3RoaXMuJD1hLiQ7dGhpcy5aPWEuWjtyZXR1cm4gdGhpczt9O04ucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgTigpO2EuRj10aGlzLkY7YS5HPXRoaXMuRzthLiQ9dGhpcy4kO2EuWj10aGlzLlo7cmV0dXJuIGE7fTt0PU4ucHJvdG90eXBlO3QuZ2E9ZnVuY3Rpb24oKXt0aGlzLnY9ITA7T2JqZWN0LmZyZWV6ZSh0aGlzKTtyZXR1cm4gdGhpczt9O3QuST1mdW5jdGlvbigpe3JldHVybiBPYmplY3QuaXNGcm96ZW4odGhpcyk/dGhpczp0aGlzLmNvcHkoKS5mcmVlemUoKTt9O3QuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy52PSEwO3JldHVybiB0aGlzO307dC5oYT1mdW5jdGlvbigpe09iamVjdC5pc0Zyb3plbih0aGlzKSYmQSgiY2Fubm90IHRoYXcgY29uc3RhbnQ6ICIrdGhpcyk7dGhpcy52PSExO3JldHVybiB0aGlzO307ZnVuY3Rpb24gdGMoYSl7aWYoInN0cmluZyI9PT10eXBlb2YgYSl7YT1hLnNwbGl0KCIgIik7Zm9yKHZhciBiPTAsYz0wOyIiPT09YVtiXTspe2IrKzt9dmFyIGQ9YVtiKytdO2QmJihjPXBhcnNlRmxvYXQoZCkpO2Zvcih2YXIgZT0wOyIiPT09YVtiXTspe2IrKzt9KGQ9YVtiKytdKSYmKGU9cGFyc2VGbG9hdChkKSk7Zm9yKHZhciBmPTA7IiI9PT1hW2JdOyl7YisrO30oZD1hW2IrK10pJiYoZj1wYXJzZUZsb2F0KGQpKTtmb3IodmFyIGc9MDsiIj09PWFbYl07KXtiKys7fShkPWFbYisrXSkmJihnPXBhcnNlRmxvYXQoZCkpO3JldHVybiBuZXcgTihjLGUsZixnKTt9cmV0dXJuIG5ldyBOKCk7fWZ1bmN0aW9uIHVjKGEpe3JldHVybiBhLngudG9TdHJpbmcoKSsiICIrYS55LnRvU3RyaW5nKCkrIiAiK2Eud2lkdGgudG9TdHJpbmcoKSsiICIrYS5oZWlnaHQudG9TdHJpbmcoKTt9dC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSZWN0KCIrdGhpcy54KyIsIit0aGlzLnkrIiwiK3RoaXMud2lkdGgrIiwiK3RoaXMuaGVpZ2h0KyIpIjt9O3QuQT1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE4/dGhpcy5GPT09YS54JiZ0aGlzLkc9PT1hLnkmJnRoaXMuJD09PWEud2lkdGgmJnRoaXMuWj09PWEuaGVpZ2h0OiExO307dC5EaT1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5GPT09YSYmdGhpcy5HPT09YiYmdGhpcy4kPT09YyYmdGhpcy5aPT09ZDt9O3QuUWE9ZnVuY3Rpb24oYSl7cmV0dXJuIEgudyh0aGlzLkYsYS54KSYmSC53KHRoaXMuRyxhLnkpJiZILncodGhpcy4kLGEud2lkdGgpJiZILncodGhpcy5aLGEuaGVpZ2h0KTt9O2Z1bmN0aW9uIHhjKGEsYil7cmV0dXJuIEguY2EoYS5GLGIueCkmJkguY2EoYS5HLGIueSkmJkguY2EoYS4kLGIud2lkdGgpJiZILmNhKGEuWixiLmhlaWdodCk7fXQuZWE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRjw9YS54JiZ0aGlzLkYrdGhpcy4kPj1hLngmJnRoaXMuRzw9YS55JiZ0aGlzLkcrdGhpcy5aPj1hLnk7fTt0LmxmPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkY8PWEueCYmYS54K2Eud2lkdGg8PXRoaXMuRit0aGlzLiQmJnRoaXMuRzw9YS55JiZhLnkrYS5oZWlnaHQ8PXRoaXMuRyt0aGlzLlo7fTt0LmNvbnRhaW5zPWZ1bmN0aW9uKGEsYixjLGQpe3ZvaWQgMD09PWMmJihjPTApO3ZvaWQgMD09PWQmJihkPTApO3JldHVybiB0aGlzLkY8PWEmJmErYzw9dGhpcy5GK3RoaXMuJCYmdGhpcy5HPD1iJiZiK2Q8PXRoaXMuRyt0aGlzLlo7fTt0LnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5aPXRoaXMuJD10aGlzLkc9dGhpcy5GPTA7fTt0Lm9mZnNldD1mdW5jdGlvbihhLGIpe3RoaXMuRis9YTt0aGlzLkcrPWI7cmV0dXJuIHRoaXM7fTt0LlVjPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHljKHRoaXMsYixhLGIsYSk7fTt0LkxwPWZ1bmN0aW9uKGEpe3JldHVybiB5Yyh0aGlzLGEudG9wLGEucmlnaHQsYS5ib3R0b20sYS5sZWZ0KTt9O3QuT3Y9ZnVuY3Rpb24oYSl7cmV0dXJuIHljKHRoaXMsLWEudG9wLC1hLnJpZ2h0LC1hLmJvdHRvbSwtYS5sZWZ0KTt9O3QubHo9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHljKHRoaXMsYSxiLGMsZCk7fTtmdW5jdGlvbiB5YyhhLGIsYyxkLGUpe3ZhciBmPWEuJDtjK2U8PS1mPyhhLkYrPWYvMixhLiQ9MCk6KGEuRi09ZSxhLiQrPWMrZSk7Yz1hLlo7YitkPD0tYz8oYS5HKz1jLzIsYS5aPTApOihhLkctPWIsYS5aKz1iK2QpO3JldHVybiBhO310LnB6PWZ1bmN0aW9uKGEpe3JldHVybiB6Yyh0aGlzLGEueCxhLnksYS53aWR0aCxhLmhlaWdodCk7fTt0Lmd2PWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB6Yyh0aGlzLGEsYixjLGQpO307ZnVuY3Rpb24gemMoYSxiLGMsZCxlKXt2YXIgZj1NYXRoLm1heChhLkYsYiksZz1NYXRoLm1heChhLkcsYyk7Yj1NYXRoLm1pbihhLkYrYS4kLGIrZCk7Yz1NYXRoLm1pbihhLkcrYS5aLGMrZSk7YS5GPWY7YS5HPWc7YS4kPU1hdGgubWF4KDAsYi1mKTthLlo9TWF0aC5tYXgoMCxjLWcpO3JldHVybiBhO310LkljPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmh2KGEueCxhLnksYS53aWR0aCxhLmhlaWdodCk7fTt0Lmh2PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuJCxmPXRoaXMuRjtpZihJbmZpbml0eSE9PWUmJkluZmluaXR5IT09YyYmKGUrPWYsYys9YSxpc05hTihjKXx8aXNOYU4oZSl8fGY+Y3x8YT5lKSlyZXR1cm4hMTthPXRoaXMuWjtjPXRoaXMuRztyZXR1cm4gSW5maW5pdHkhPT1hJiZJbmZpbml0eSE9PWQmJihhKz1jLGQrPWIsaXNOYU4oZCl8fGlzTmFOKGEpfHxjPmR8fGI+YSk/ITE6ITA7fTtmdW5jdGlvbiBBYyhhLGIsYyl7dmFyIGQ9YS4kLGU9YS5GLGY9Yi54LWM7aWYoZT5iLndpZHRoK2MrYytmfHxmPmQrZSlyZXR1cm4hMTtkPWEuWjthPWEuRztlPWIueS1jO3JldHVybiBhPmIuaGVpZ2h0K2MrYytlfHxlPmQrYT8hMTohMDt9dC5JZT1mdW5jdGlvbihhKXtyZXR1cm4gQmModGhpcyxhLngsYS55LDAsMCk7fTt0LkpjPWZ1bmN0aW9uKGEpe3JldHVybiBCYyh0aGlzLGEuRixhLkcsYS4kLGEuWik7fTt0LlZ2PWZ1bmN0aW9uKGEsYixjLGQpe3ZvaWQgMD09PWMmJihjPTApO3ZvaWQgMD09PWQmJihkPTApO3JldHVybiBCYyh0aGlzLGEsYixjLGQpO307ZnVuY3Rpb24gQmMoYSxiLGMsZCxlKXt2YXIgZj1NYXRoLm1pbihhLkYsYiksZz1NYXRoLm1pbihhLkcsYyk7Yj1NYXRoLm1heChhLkYrYS4kLGIrZCk7Yz1NYXRoLm1heChhLkcrYS5aLGMrZSk7YS5GPWY7YS5HPWc7YS4kPWItZjthLlo9Yy1nO3JldHVybiBhO310LnFrPWZ1bmN0aW9uKGEsYixjKXt0aGlzLkY9YS1jLm9mZnNldFgtYy54KnRoaXMuJDt0aGlzLkc9Yi1jLm9mZnNldFktYy55KnRoaXMuWjtyZXR1cm4gdGhpczt9O2Z1bmN0aW9uIENjKGEsYixjLGQsZSxmLGcsaCl7dm9pZCAwPT09ZyYmKGc9MCk7dm9pZCAwPT09aCYmKGg9MCk7cmV0dXJuIGE8PWUmJmUrZzw9YStjJiZiPD1mJiZmK2g8PWIrZDt9ZnVuY3Rpb24gRGMoYSxiLGMsZCxlLGYsZyxoKXtyZXR1cm4gYT5nK2V8fGU+YythPyExOmI+aCtmfHxmPmQrYj8hMTohMDt9dC5vPWZ1bmN0aW9uKCl7cmV0dXJuIGlzRmluaXRlKHRoaXMueCkmJmlzRmluaXRlKHRoaXMueSkmJmlzRmluaXRlKHRoaXMud2lkdGgpJiZpc0Zpbml0ZSh0aGlzLmhlaWdodCk7fTt0LnJ6PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLndpZHRoJiYwPT09dGhpcy5oZWlnaHQ7fTtOLmFsbG9jPWZ1bmN0aW9uKCl7dmFyIGE9RmMucG9wKCk7cmV0dXJuIHZvaWQgMD09PWE/bmV3IE4oKTphO307Ti5hbGxvY0F0PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPUZjLnBvcCgpO3JldHVybiB2b2lkIDA9PT1lP25ldyBOKGEsYixjLGQpOmUuaChhLGIsYyxkKTt9O04uZnJlZT1mdW5jdGlvbihhKXtGYy5wdXNoKGEpO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTi5wcm90b3R5cGUse3g6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5GO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkY9YTt9fSx5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5HPWE7fX0sd2lkdGg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy4kO30sc2V0OmZ1bmN0aW9uIHNldChhKXswPmEmJnhhKGEsIj49IDAiLE4sIndpZHRoIik7dGhpcy4kPWE7fX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7MD5hJiZ4YShhLCI+PSAwIixOLCJoZWlnaHQiKTt0aGlzLlo9YTt9fSxsZWZ0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5GPWE7fX0sdG9wOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5HPWE7fX0scmlnaHQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5GK3RoaXMuJDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5GKz1hLSh0aGlzLkYrdGhpcy4kKTt9fSxib3R0b206e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5HK3RoaXMuWjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5HKz1hLSh0aGlzLkcrdGhpcy5aKTt9fSxwb3NpdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBuZXcgRyh0aGlzLkYsdGhpcy5HKTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5GPWEueDt0aGlzLkc9YS55O319LHNpemU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbmV3IEsodGhpcy4kLHRoaXMuWik7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuJD1hLndpZHRoO3RoaXMuWj1hLmhlaWdodDt9fSxjZW50ZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbmV3IEcodGhpcy5GK3RoaXMuJC8yLHRoaXMuRyt0aGlzLlovMik7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuRj1hLngtdGhpcy4kLzI7dGhpcy5HPWEueS10aGlzLlovMjt9fSxjZW50ZXJYOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRit0aGlzLiQvMjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5GPWEtdGhpcy4kLzI7fX0sY2VudGVyWTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkcrdGhpcy5aLzI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuRz1hLXRoaXMuWi8yO319fSk7Ti5wcm90b3R5cGUuaXNFbXB0eT1OLnByb3RvdHlwZS5yejtOLnByb3RvdHlwZS5pc1JlYWw9Ti5wcm90b3R5cGUubztOLnByb3RvdHlwZS5zZXRTcG90PU4ucHJvdG90eXBlLnFrO04ucHJvdG90eXBlLnVuaW9uPU4ucHJvdG90eXBlLlZ2O04ucHJvdG90eXBlLnVuaW9uUmVjdD1OLnByb3RvdHlwZS5KYztOLnByb3RvdHlwZS51bmlvblBvaW50PU4ucHJvdG90eXBlLkllO04ucHJvdG90eXBlLmludGVyc2VjdHM9Ti5wcm90b3R5cGUuaHY7Ti5wcm90b3R5cGUuaW50ZXJzZWN0c1JlY3Q9Ti5wcm90b3R5cGUuSWM7Ti5wcm90b3R5cGUuaW50ZXJzZWN0PU4ucHJvdG90eXBlLmd2O04ucHJvdG90eXBlLmludGVyc2VjdFJlY3Q9Ti5wcm90b3R5cGUucHo7Ti5wcm90b3R5cGUuZ3Jvdz1OLnByb3RvdHlwZS5sejtOLnByb3RvdHlwZS5zdWJ0cmFjdE1hcmdpbj1OLnByb3RvdHlwZS5PdjtOLnByb3RvdHlwZS5hZGRNYXJnaW49Ti5wcm90b3R5cGUuTHA7Ti5wcm90b3R5cGUuaW5mbGF0ZT1OLnByb3RvdHlwZS5VYztOLnByb3RvdHlwZS5vZmZzZXQ9Ti5wcm90b3R5cGUub2Zmc2V0O04ucHJvdG90eXBlLmNvbnRhaW5zPU4ucHJvdG90eXBlLmNvbnRhaW5zO04ucHJvdG90eXBlLmNvbnRhaW5zUmVjdD1OLnByb3RvdHlwZS5sZjtOLnByb3RvdHlwZS5jb250YWluc1BvaW50PU4ucHJvdG90eXBlLmVhO04ucHJvdG90eXBlLmVxdWFsc0FwcHJveD1OLnByb3RvdHlwZS5RYTtOLnByb3RvdHlwZS5lcXVhbFRvPU4ucHJvdG90eXBlLkRpO04ucHJvdG90eXBlLmVxdWFscz1OLnByb3RvdHlwZS5BO04ucHJvdG90eXBlLnNldFNpemU9Ti5wcm90b3R5cGUuU3o7Ti5wcm90b3R5cGUuc2V0UG9pbnQ9Ti5wcm90b3R5cGUuamQ7Ti5wcm90b3R5cGUuc2V0PU4ucHJvdG90eXBlLnNldDtOLnByb3RvdHlwZS5zZXRUbz1OLnByb3RvdHlwZS50Zzt2YXIgR2M9bnVsbCxIYz1udWxsLEZjPVtdO04uY2xhc3NOYW1lPSJSZWN0IjtOLnBhcnNlPXRjO04uc3RyaW5naWZ5PXVjO04uY29udGFpbnM9Q2M7Ti5pbnRlcnNlY3RzPURjO04uWmVyb1JlY3Q9R2M9bmV3IE4oMCwwLDAsMCkuZ2EoKTtOLk5vUmVjdD1IYz1uZXcgTihOYU4sTmFOLE5hTixOYU4pLmdhKCk7Ti5wYXJzZT10YztOLnN0cmluZ2lmeT11YztOLmNvbnRhaW5zPUNjO04uaW50ZXJzZWN0cz1EYztmdW5jdGlvbiBJYyhhLGIsYyxkKXt2b2lkIDA9PT1hP3RoaXMubGU9dGhpcy5hZT10aGlzLnRlPXRoaXMudmU9MDp2b2lkIDA9PT1iP3RoaXMubGVmdD10aGlzLmJvdHRvbT10aGlzLnJpZ2h0PXRoaXMudG9wPWE6dm9pZCAwPT09Yz8odGhpcy50b3A9YSx0aGlzLnJpZ2h0PWIsdGhpcy5ib3R0b209YSx0aGlzLmxlZnQ9Yik6dm9pZCAwIT09ZD8odGhpcy50b3A9YSx0aGlzLnJpZ2h0PWIsdGhpcy5ib3R0b209Yyx0aGlzLmxlZnQ9ZCk6QSgiSW52YWxpZCBhcmd1bWVudHMgdG8gTWFyZ2luIGNvbnN0cnVjdG9yOiAiK2ErIiwgIitiKyIsICIrYysiLCAiK2QpO3RoaXMudj0hMTt9SWMucHJvdG90eXBlLmFzc2lnbj1mdW5jdGlvbihhKXt0aGlzLnZlPWEudmU7dGhpcy50ZT1hLnRlO3RoaXMuYWU9YS5hZTt0aGlzLmxlPWEubGU7cmV0dXJuIHRoaXM7fTtJYy5wcm90b3R5cGUudGc9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy52ZT1hO3RoaXMudGU9Yjt0aGlzLmFlPWM7dGhpcy5sZT1kO3JldHVybiB0aGlzO307SWMucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXt0aGlzLnZlPWEudmU7dGhpcy50ZT1hLnRlO3RoaXMuYWU9YS5hZTt0aGlzLmxlPWEubGU7cmV0dXJuIHRoaXM7fTtJYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3ZhciBhPW5ldyBJYygpO2EudmU9dGhpcy52ZTthLnRlPXRoaXMudGU7YS5hZT10aGlzLmFlO2EubGU9dGhpcy5sZTtyZXR1cm4gYTt9O3Q9SWMucHJvdG90eXBlO3QuZ2E9ZnVuY3Rpb24oKXt0aGlzLnY9ITA7T2JqZWN0LmZyZWV6ZSh0aGlzKTtyZXR1cm4gdGhpczt9O3QuST1mdW5jdGlvbigpe3JldHVybiBPYmplY3QuaXNGcm96ZW4odGhpcyk/dGhpczp0aGlzLmNvcHkoKS5mcmVlemUoKTt9O3QuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy52PSEwO3JldHVybiB0aGlzO307dC5oYT1mdW5jdGlvbigpe09iamVjdC5pc0Zyb3plbih0aGlzKSYmQSgiY2Fubm90IHRoYXcgY29uc3RhbnQ6ICIrdGhpcyk7dGhpcy52PSExO3JldHVybiB0aGlzO307ZnVuY3Rpb24gSmMoYSl7aWYoInN0cmluZyI9PT10eXBlb2YgYSl7YT1hLnNwbGl0KCIgIik7Zm9yKHZhciBiPTAsYz1OYU47IiI9PT1hW2JdOyl7YisrO312YXIgZD1hW2IrK107ZCYmKGM9cGFyc2VGbG9hdChkKSk7aWYoaXNOYU4oYykpcmV0dXJuIG5ldyBJYygpO2Zvcih2YXIgZT1OYU47IiI9PT1hW2JdOyl7YisrO30oZD1hW2IrK10pJiYoZT1wYXJzZUZsb2F0KGQpKTtpZihpc05hTihlKSlyZXR1cm4gbmV3IEljKGMpO2Zvcih2YXIgZj1OYU47IiI9PT1hW2JdOyl7YisrO30oZD1hW2IrK10pJiYoZj1wYXJzZUZsb2F0KGQpKTtpZihpc05hTihmKSlyZXR1cm4gbmV3IEljKGMsZSk7Zm9yKHZhciBnPU5hTjsiIj09PWFbYl07KXtiKys7fShkPWFbYisrXSkmJihnPXBhcnNlRmxvYXQoZCkpO3JldHVybiBpc05hTihnKT9uZXcgSWMoYyxlKTpuZXcgSWMoYyxlLGYsZyk7fXJldHVybiBuZXcgSWMoKTt9ZnVuY3Rpb24gS2MoYSl7cmV0dXJuIGEudG9wLnRvU3RyaW5nKCkrIiAiK2EucmlnaHQudG9TdHJpbmcoKSsiICIrYS5ib3R0b20udG9TdHJpbmcoKSsiICIrYS5sZWZ0LnRvU3RyaW5nKCk7fXQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iTWFyZ2luKCIrdGhpcy50b3ArIiwiK3RoaXMucmlnaHQrIiwiK3RoaXMuYm90dG9tKyIsIit0aGlzLmxlZnQrIikiO307dC5BPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgSWM/dGhpcy52ZT09PWEudG9wJiZ0aGlzLnRlPT09YS5yaWdodCYmdGhpcy5hZT09PWEuYm90dG9tJiZ0aGlzLmxlPT09YS5sZWZ0OiExO307dC5EaT1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy52ZT09PWEmJnRoaXMudGU9PT1iJiZ0aGlzLmFlPT09YyYmdGhpcy5sZT09PWQ7fTt0LlFhPWZ1bmN0aW9uKGEpe3JldHVybiBILncodGhpcy52ZSxhLnRvcCkmJkgudyh0aGlzLnRlLGEucmlnaHQpJiZILncodGhpcy5hZSxhLmJvdHRvbSkmJkgudyh0aGlzLmxlLGEubGVmdCk7fTt0Lm89ZnVuY3Rpb24oKXtyZXR1cm4gaXNGaW5pdGUodGhpcy50b3ApJiZpc0Zpbml0ZSh0aGlzLnJpZ2h0KSYmaXNGaW5pdGUodGhpcy5ib3R0b20pJiZpc0Zpbml0ZSh0aGlzLmxlZnQpO307SWMuYWxsb2M9ZnVuY3Rpb24oKXt2YXIgYT1OYy5wb3AoKTtyZXR1cm4gdm9pZCAwPT09YT9uZXcgSWMoKTphO307SWMuZnJlZT1mdW5jdGlvbihhKXtOYy5wdXNoKGEpO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSWMucHJvdG90eXBlLHt0b3A6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy52ZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52ZT1hO319LHJpZ2h0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudGU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudGU9YTt9fSxib3R0b206e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5hZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5hZT1hO319LGxlZnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5sZT1hO319fSk7SWMucHJvdG90eXBlLmlzUmVhbD1JYy5wcm90b3R5cGUubztJYy5wcm90b3R5cGUuZXF1YWxzQXBwcm94PUljLnByb3RvdHlwZS5RYTtJYy5wcm90b3R5cGUuZXF1YWxUbz1JYy5wcm90b3R5cGUuRGk7SWMucHJvdG90eXBlLmVxdWFscz1JYy5wcm90b3R5cGUuQTtJYy5wcm90b3R5cGUuc2V0PUljLnByb3RvdHlwZS5zZXQ7SWMucHJvdG90eXBlLnNldFRvPUljLnByb3RvdHlwZS50Zzt2YXIgT2M9bnVsbCxQYz1udWxsLE5jPVtdO0ljLmNsYXNzTmFtZT0iTWFyZ2luIjtJYy5wYXJzZT1KYztJYy5zdHJpbmdpZnk9S2M7SWMuWmVyb01hcmdpbj1PYz1uZXcgSWMoMCwwLDAsMCkuZ2EoKTtJYy5Ud29NYXJnaW49UGM9bmV3IEljKDIsMiwyLDIpLmdhKCk7SWMucGFyc2U9SmM7SWMuc3RyaW5naWZ5PUtjO2Z1bmN0aW9uIFFjKCl7dGhpcy5tMTE9MTt0aGlzLm0yMT10aGlzLm0xMj0wO3RoaXMubTIyPTE7dGhpcy5keT10aGlzLmR4PTA7fVFjLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSl7dGhpcy5tMTE9YS5tMTE7dGhpcy5tMTI9YS5tMTI7dGhpcy5tMjE9YS5tMjE7dGhpcy5tMjI9YS5tMjI7dGhpcy5keD1hLmR4O3RoaXMuZHk9YS5keTtyZXR1cm4gdGhpczt9O1FjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IFFjKCk7YS5tMTE9dGhpcy5tMTE7YS5tMTI9dGhpcy5tMTI7YS5tMjE9dGhpcy5tMjE7YS5tMjI9dGhpcy5tMjI7YS5keD10aGlzLmR4O2EuZHk9dGhpcy5keTtyZXR1cm4gYTt9O3Q9UWMucHJvdG90eXBlO3QudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iVHJhbnNmb3JtKCIrdGhpcy5tMTErIiwiK3RoaXMubTEyKyIsIit0aGlzLm0yMSsiLCIrdGhpcy5tMjIrIiwiK3RoaXMuZHgrIiwiK3RoaXMuZHkrIikiO307dC5BPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgUWM/dGhpcy5tMTE9PT1hLm0xMSYmdGhpcy5tMTI9PT1hLm0xMiYmdGhpcy5tMjE9PT1hLm0yMSYmdGhpcy5tMjI9PT1hLm0yMiYmdGhpcy5keD09PWEuZHgmJnRoaXMuZHk9PT1hLmR5OiExO307dC5jdD1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5keCYmMD09PXRoaXMuZHkmJjE9PT10aGlzLm0xMSYmMD09PXRoaXMubTEyJiYwPT09dGhpcy5tMjEmJjE9PT10aGlzLm0yMjt9O3QucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLm0xMT0xO3RoaXMubTIxPXRoaXMubTEyPTA7dGhpcy5tMjI9MTt0aGlzLmR5PXRoaXMuZHg9MDtyZXR1cm4gdGhpczt9O3QubXVsdGlwbHk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5tMTIqYS5tMTErdGhpcy5tMjIqYS5tMTIsYz10aGlzLm0xMSphLm0yMSt0aGlzLm0yMSphLm0yMixkPXRoaXMubTEyKmEubTIxK3RoaXMubTIyKmEubTIyLGU9dGhpcy5tMTEqYS5keCt0aGlzLm0yMSphLmR5K3RoaXMuZHgsZj10aGlzLm0xMiphLmR4K3RoaXMubTIyKmEuZHkrdGhpcy5keTt0aGlzLm0xMT10aGlzLm0xMSphLm0xMSt0aGlzLm0yMSphLm0xMjt0aGlzLm0xMj1iO3RoaXMubTIxPWM7dGhpcy5tMjI9ZDt0aGlzLmR4PWU7dGhpcy5keT1mO3JldHVybiB0aGlzO307dC5udj1mdW5jdGlvbihhKXt2YXIgYj0xLyhhLm0xMSphLm0yMi1hLm0xMiphLm0yMSksYz1hLm0yMipiLGQ9LWEubTEyKmIsZT0tYS5tMjEqYixmPWEubTExKmIsZz1iKihhLm0yMSphLmR5LWEubTIyKmEuZHgpO2E9YiooYS5tMTIqYS5keC1hLm0xMSphLmR5KTtiPXRoaXMubTExKmMrdGhpcy5tMjEqZDtjPXRoaXMubTEyKmMrdGhpcy5tMjIqZDtkPXRoaXMubTExKmUrdGhpcy5tMjEqZjtlPXRoaXMubTEyKmUrdGhpcy5tMjIqZjt0aGlzLmR4PXRoaXMubTExKmcrdGhpcy5tMjEqYSt0aGlzLmR4O3RoaXMuZHk9dGhpcy5tMTIqZyt0aGlzLm0yMiphK3RoaXMuZHk7dGhpcy5tMTE9Yjt0aGlzLm0xMj1jO3RoaXMubTIxPWQ7dGhpcy5tMjI9ZTtyZXR1cm4gdGhpczt9O3QuYnQ9ZnVuY3Rpb24oKXt2YXIgYT0xLyh0aGlzLm0xMSp0aGlzLm0yMi10aGlzLm0xMip0aGlzLm0yMSksYj0tdGhpcy5tMTIqYSxjPS10aGlzLm0yMSphLGQ9dGhpcy5tMTEqYSxlPWEqKHRoaXMubTIxKnRoaXMuZHktdGhpcy5tMjIqdGhpcy5keCksZj1hKih0aGlzLm0xMip0aGlzLmR4LXRoaXMubTExKnRoaXMuZHkpO3RoaXMubTExPXRoaXMubTIyKmE7dGhpcy5tMTI9Yjt0aGlzLm0yMT1jO3RoaXMubTIyPWQ7dGhpcy5keD1lO3RoaXMuZHk9ZjtyZXR1cm4gdGhpczt9O1FjLnByb3RvdHlwZS5yb3RhdGU9ZnVuY3Rpb24oYSxiLGMpezM2MDw9YT9hLT0zNjA6MD5hJiYoYSs9MzYwKTtpZigwPT09YSlyZXR1cm4gdGhpczt0aGlzLnRyYW5zbGF0ZShiLGMpO2lmKDkwPT09YSl7YT0wO3ZhciBkPTE7fWVsc2UgMTgwPT09YT8oYT0tMSxkPTApOjI3MD09PWE/KGE9MCxkPS0xKTooZD1hKk1hdGguUEkvMTgwLGE9TWF0aC5jb3MoZCksZD1NYXRoLnNpbihkKSk7dmFyIGU9dGhpcy5tMTIqYSt0aGlzLm0yMipkLGY9dGhpcy5tMTEqLWQrdGhpcy5tMjEqYSxnPXRoaXMubTEyKi1kK3RoaXMubTIyKmE7dGhpcy5tMTE9dGhpcy5tMTEqYSt0aGlzLm0yMSpkO3RoaXMubTEyPWU7dGhpcy5tMjE9Zjt0aGlzLm0yMj1nO3RoaXMudHJhbnNsYXRlKC1iLC1jKTtyZXR1cm4gdGhpczt9O3Q9UWMucHJvdG90eXBlO3QudHJhbnNsYXRlPWZ1bmN0aW9uKGEsYil7dGhpcy5keCs9dGhpcy5tMTEqYSt0aGlzLm0yMSpiO3RoaXMuZHkrPXRoaXMubTEyKmErdGhpcy5tMjIqYjtyZXR1cm4gdGhpczt9O3Quc2NhbGU9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj1hKTt0aGlzLm0xMSo9YTt0aGlzLm0xMio9YTt0aGlzLm0yMSo9Yjt0aGlzLm0yMio9YjtyZXR1cm4gdGhpczt9O3QudGE9ZnVuY3Rpb24oYSl7dmFyIGI9YS54LGM9YS55O3JldHVybiBhLmgoYip0aGlzLm0xMStjKnRoaXMubTIxK3RoaXMuZHgsYip0aGlzLm0xMitjKnRoaXMubTIyK3RoaXMuZHkpO307dC5VZD1mdW5jdGlvbihhKXt2YXIgYj0xLyh0aGlzLm0xMSp0aGlzLm0yMi10aGlzLm0xMip0aGlzLm0yMSksYz1hLngsZD1hLnk7cmV0dXJuIGEuaChjKnRoaXMubTIyKmIrZCotdGhpcy5tMjEqYitiKih0aGlzLm0yMSp0aGlzLmR5LXRoaXMubTIyKnRoaXMuZHgpLGMqLXRoaXMubTEyKmIrZCp0aGlzLm0xMSpiK2IqKHRoaXMubTEyKnRoaXMuZHgtdGhpcy5tMTEqdGhpcy5keSkpO307dC5Vdj1mdW5jdGlvbihhKXt2YXIgYj1hLkYsYz1hLkcsZD1iK2EuJCxlPWMrYS5aLGY9dGhpcy5tMTEsZz10aGlzLm0xMixoPXRoaXMubTIxLGs9dGhpcy5tMjIsbD10aGlzLmR4LG09dGhpcy5keSxuPWIqZitjKmgrbCxwPWIqZytjKmsrbSxxPWQqZitjKmgrbCxyPWQqZytjKmsrbTtjPWIqZitlKmgrbDtiPWIqZytlKmsrbTtmPWQqZitlKmgrbDtkPWQqZytlKmsrbTtlPU1hdGgubWluKG4scSk7bj1NYXRoLm1heChuLHEpO3E9TWF0aC5taW4ocCxyKTtwPU1hdGgubWF4KHAscik7ZT1NYXRoLm1pbihlLGMpO249TWF0aC5tYXgobixjKTtxPU1hdGgubWluKHEsYik7cD1NYXRoLm1heChwLGIpO2U9TWF0aC5taW4oZSxmKTtuPU1hdGgubWF4KG4sZik7cT1NYXRoLm1pbihxLGQpO3A9TWF0aC5tYXgocCxkKTthLkY9ZTthLkc9cTthLiQ9bi1lO2EuWj1wLXE7cmV0dXJuIGE7fTtRYy5hbGxvYz1mdW5jdGlvbigpe3ZhciBhPVJjLnBvcCgpO3JldHVybiB2b2lkIDA9PT1hP25ldyBRYygpOmE7fTtRYy5mcmVlPWZ1bmN0aW9uKGEpe1JjLnB1c2goYSk7fTtRYy5wcm90b3R5cGUudHJhbnNmb3JtUmVjdD1RYy5wcm90b3R5cGUuVXY7UWMucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtUG9pbnQ9UWMucHJvdG90eXBlLlVkO1FjLnByb3RvdHlwZS50cmFuc2Zvcm1Qb2ludD1RYy5wcm90b3R5cGUudGE7UWMucHJvdG90eXBlLnNjYWxlPVFjLnByb3RvdHlwZS5zY2FsZTtRYy5wcm90b3R5cGUudHJhbnNsYXRlPVFjLnByb3RvdHlwZS50cmFuc2xhdGU7UWMucHJvdG90eXBlLnJvdGF0ZT1RYy5wcm90b3R5cGUucm90YXRlO1FjLnByb3RvdHlwZS5pbnZlcnQ9UWMucHJvdG90eXBlLmJ0O1FjLnByb3RvdHlwZS5tdWx0aXBseUludmVydGVkPVFjLnByb3RvdHlwZS5udjtRYy5wcm90b3R5cGUubXVsdGlwbHk9UWMucHJvdG90eXBlLm11bHRpcGx5O1FjLnByb3RvdHlwZS5yZXNldD1RYy5wcm90b3R5cGUucmVzZXQ7UWMucHJvdG90eXBlLmlzSWRlbnRpdHk9UWMucHJvdG90eXBlLmN0O1FjLnByb3RvdHlwZS5lcXVhbHM9UWMucHJvdG90eXBlLkE7UWMucHJvdG90eXBlLnNldD1RYy5wcm90b3R5cGUuc2V0O3ZhciBSYz1bXTtRYy5jbGFzc05hbWU9IlRyYW5zZm9ybSI7UWMueEY9IjU0YTcwMmYzZTUzOTA5YzQ0NzgyNGM2NzA2NjAzZmFmNGMiO2Z1bmN0aW9uIE8oYSxiLGMsZCl7dm9pZCAwPT09YT90aGlzLk5kPXRoaXMuTWQ9dGhpcy5HPXRoaXMuRj0wOih2b2lkIDA9PT1iJiYoYj0wKSx2b2lkIDA9PT1jJiYoYz0wKSx2b2lkIDA9PT1kJiYoZD0wKSx0aGlzLng9YSx0aGlzLnk9Yix0aGlzLm9mZnNldFg9Yyx0aGlzLm9mZnNldFk9ZCk7dGhpcy52PSExO312YXIgU2MsVGMsVWMsVmMsY2QsZGQsZWQsZmQsZ2QsaGQsaWQsamQscGQscWQscmQsc2QsdGQsdWQsdmQsd2QsemQsQWQsQmQsQ2QsRGQsRWQsRmQsR2QsSGQsSWQsSmQsS2QsU2QsVGQsVWQsVmQ7Ty5wcm90b3R5cGUuYXNzaWduPWZ1bmN0aW9uKGEpe3RoaXMuRj1hLkY7dGhpcy5HPWEuRzt0aGlzLk1kPWEuTWQ7dGhpcy5OZD1hLk5kO3JldHVybiB0aGlzO307Ty5wcm90b3R5cGUudGc9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5GPWE7dGhpcy5HPWI7dGhpcy5NZD1jO3RoaXMuTmQ9ZDtyZXR1cm4gdGhpczt9O08ucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXt0aGlzLkY9YS5GO3RoaXMuRz1hLkc7dGhpcy5NZD1hLk1kO3RoaXMuTmQ9YS5OZDtyZXR1cm4gdGhpczt9O08ucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgTygpO2EuRj10aGlzLkY7YS5HPXRoaXMuRzthLk1kPXRoaXMuTWQ7YS5OZD10aGlzLk5kO3JldHVybiBhO307dD1PLnByb3RvdHlwZTt0LmdhPWZ1bmN0aW9uKCl7dGhpcy52PSEwO09iamVjdC5mcmVlemUodGhpcyk7cmV0dXJuIHRoaXM7fTt0Lkk9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmlzRnJvemVuKHRoaXMpP3RoaXM6dGhpcy5jb3B5KCkuZnJlZXplKCk7fTt0LmZyZWV6ZT1mdW5jdGlvbigpe3RoaXMudj0hMDtyZXR1cm4gdGhpczt9O3QuaGE9ZnVuY3Rpb24oKXtPYmplY3QuaXNGcm96ZW4odGhpcykmJkEoImNhbm5vdCB0aGF3IGNvbnN0YW50OiAiK3RoaXMpO3RoaXMudj0hMTtyZXR1cm4gdGhpczt9O2Z1bmN0aW9uIFdkKGEsYil7YS5GPU5hTjthLkc9TmFOO2EuTWQ9YjtyZXR1cm4gYTt9ZnVuY3Rpb24gWGQoYSl7aWYoInN0cmluZyI9PT10eXBlb2YgYSl7YT1hLnRyaW0oKTtpZigiTm9uZSI9PT1hKXJldHVybiBTYztpZigiVG9wTGVmdCI9PT1hKXJldHVybiBUYztpZigiVG9wIj09PWF8fCJUb3BDZW50ZXIiPT09YXx8Ik1pZGRsZVRvcCI9PT1hKXJldHVybiBVYztpZigiVG9wUmlnaHQiPT09YSlyZXR1cm4gVmM7aWYoIkxlZnQiPT09YXx8IkxlZnRDZW50ZXIiPT09YXx8Ik1pZGRsZUxlZnQiPT09YSlyZXR1cm4gY2Q7aWYoIkNlbnRlciI9PT1hKXJldHVybiBkZDtpZigiUmlnaHQiPT09YXx8IlJpZ2h0Q2VudGVyIj09PWF8fCJNaWRkbGVSaWdodCI9PT1hKXJldHVybiBlZDtpZigiQm90dG9tTGVmdCI9PT1hKXJldHVybiBmZDtpZigiQm90dG9tIj09PWF8fCJCb3R0b21DZW50ZXIiPT09YXx8Ik1pZGRsZUJvdHRvbSI9PT1hKXJldHVybiBnZDtpZigiQm90dG9tUmlnaHQiPT09YSlyZXR1cm4gaGQ7aWYoIlRvcFNpZGUiPT09YSlyZXR1cm4gaWQ7aWYoIkxlZnRTaWRlIj09PWEpcmV0dXJuIGpkO2lmKCJSaWdodFNpZGUiPT09YSlyZXR1cm4gcGQ7aWYoIkJvdHRvbVNpZGUiPT09YSlyZXR1cm4gcWQ7aWYoIlRvcEJvdHRvbVNpZGVzIj09PWEpcmV0dXJuIHJkO2lmKCJMZWZ0UmlnaHRTaWRlcyI9PT1hKXJldHVybiBzZDtpZigiVG9wTGVmdFNpZGVzIj09PWEpcmV0dXJuIHRkO2lmKCJUb3BSaWdodFNpZGVzIj09PWEpcmV0dXJuIHVkO2lmKCJCb3R0b21MZWZ0U2lkZXMiPT09YSlyZXR1cm4gdmQ7aWYoIkJvdHRvbVJpZ2h0U2lkZXMiPT09YSlyZXR1cm4gd2Q7aWYoIk5vdFRvcFNpZGUiPT09YSlyZXR1cm4gemQ7aWYoIk5vdExlZnRTaWRlIj09PWEpcmV0dXJuIEFkO2lmKCJOb3RSaWdodFNpZGUiPT09YSlyZXR1cm4gQmQ7aWYoIk5vdEJvdHRvbVNpZGUiPT09YSlyZXR1cm4gQ2Q7aWYoIkFsbFNpZGVzIj09PWEpcmV0dXJuIERkO2lmKCJEZWZhdWx0Ij09PWEpcmV0dXJuIEVkO2E9YS5zcGxpdCgiICIpO2Zvcih2YXIgYj0wLGM9MDsiIj09PWFbYl07KXtiKys7fXZhciBkPWFbYisrXTt2b2lkIDAhPT1kJiYwPGQubGVuZ3RoJiYoYz1wYXJzZUZsb2F0KGQpKTtmb3IodmFyIGU9MDsiIj09PWFbYl07KXtiKys7fWQ9YVtiKytdO3ZvaWQgMCE9PWQmJjA8ZC5sZW5ndGgmJihlPXBhcnNlRmxvYXQoZCkpO2Zvcih2YXIgZj0wOyIiPT09YVtiXTspe2IrKzt9ZD1hW2IrK107dm9pZCAwIT09ZCYmMDxkLmxlbmd0aCYmKGY9cGFyc2VGbG9hdChkKSk7Zm9yKHZhciBnPTA7IiI9PT1hW2JdOyl7YisrO31kPWFbYisrXTt2b2lkIDAhPT1kJiYwPGQubGVuZ3RoJiYoZz1wYXJzZUZsb2F0KGQpKTtyZXR1cm4gbmV3IE8oYyxlLGYsZyk7fXJldHVybiBuZXcgTygpO31mdW5jdGlvbiBZZChhKXtyZXR1cm4gYS5nYigpP2EueC50b1N0cmluZygpKyIgIithLnkudG9TdHJpbmcoKSsiICIrYS5vZmZzZXRYLnRvU3RyaW5nKCkrIiAiK2Eub2Zmc2V0WS50b1N0cmluZygpOmEudG9TdHJpbmcoKTt9dC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdiKCk/MD09PXRoaXMuTWQmJjA9PT10aGlzLk5kPyJTcG90KCIrdGhpcy54KyIsIit0aGlzLnkrIikiOiJTcG90KCIrdGhpcy54KyIsIit0aGlzLnkrIiwiK3RoaXMub2Zmc2V0WCsiLCIrdGhpcy5vZmZzZXRZKyIpIjp0aGlzLkEoU2MpPyJOb25lIjp0aGlzLkEoVGMpPyJUb3BMZWZ0Ijp0aGlzLkEoVWMpPyJUb3AiOnRoaXMuQShWYyk/IlRvcFJpZ2h0Ijp0aGlzLkEoY2QpPyJMZWZ0Ijp0aGlzLkEoZGQpPyJDZW50ZXIiOnRoaXMuQShlZCk/IlJpZ2h0Ijp0aGlzLkEoZmQpPyJCb3R0b21MZWZ0Ijp0aGlzLkEoZ2QpPyJCb3R0b20iOnRoaXMuQShoZCk/IkJvdHRvbVJpZ2h0Ijp0aGlzLkEoaWQpPyJUb3BTaWRlIjp0aGlzLkEoamQpPyJMZWZ0U2lkZSI6dGhpcy5BKHBkKT8iUmlnaHRTaWRlIjp0aGlzLkEocWQpPyJCb3R0b21TaWRlIjp0aGlzLkEocmQpPyJUb3BCb3R0b21TaWRlcyI6dGhpcy5BKHNkKT8iTGVmdFJpZ2h0U2lkZXMiOnRoaXMuQSh0ZCk/IlRvcExlZnRTaWRlcyI6dGhpcy5BKHVkKT8iVG9wUmlnaHRTaWRlcyI6dGhpcy5BKHZkKT8iQm90dG9tTGVmdFNpZGVzIjp0aGlzLkEod2QpPyJCb3R0b21SaWdodFNpZGVzIjp0aGlzLkEoemQpPyJOb3RUb3BTaWRlIjp0aGlzLkEoQWQpPyJOb3RMZWZ0U2lkZSI6dGhpcy5BKEJkKT8iTm90UmlnaHRTaWRlIjp0aGlzLkEoQ2QpPyJOb3RCb3R0b21TaWRlIjp0aGlzLkEoRGQpPyJBbGxTaWRlcyI6dGhpcy5BKEVkKT8iRGVmYXVsdCI6Ik5vbmUiO307dC5BPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgTz8odGhpcy5GPT09YS54fHxpc05hTih0aGlzLkYpJiZpc05hTihhLngpKSYmKHRoaXMuRz09PWEueXx8aXNOYU4odGhpcy5HKSYmaXNOYU4oYS55KSkmJnRoaXMuTWQ9PT1hLm9mZnNldFgmJnRoaXMuTmQ9PT1hLm9mZnNldFk6ITE7fTt0LnJ2PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBPKC41LSh0aGlzLkYtLjUpLC41LSh0aGlzLkctLjUpLC10aGlzLk1kLC10aGlzLk5kKTt9O3QucGY9ZnVuY3Rpb24oYSl7aWYoIXRoaXMucWYoKSlyZXR1cm4hMTtpZighYS5xZigpKWlmKGEuQShGZCkpYT1qZDtlbHNlIGlmKGEuQShHZCkpYT1wZDtlbHNlIGlmKGEuQShIZCkpYT1pZDtlbHNlIGlmKGEuQShJZCkpYT1xZDtlbHNlIHJldHVybiExO2E9YS5vZmZzZXRZO3JldHVybih0aGlzLk5kJmEpPT09YTt9O3QuZ2I9ZnVuY3Rpb24oKXtyZXR1cm4haXNOYU4odGhpcy54KSYmIWlzTmFOKHRoaXMueSk7fTt0LmpjPWZ1bmN0aW9uKCl7cmV0dXJuIGlzTmFOKHRoaXMueCl8fGlzTmFOKHRoaXMueSk7fTt0LnFmPWZ1bmN0aW9uKCl7cmV0dXJuIGlzTmFOKHRoaXMueCkmJmlzTmFOKHRoaXMueSkmJjE9PT10aGlzLm9mZnNldFgmJjAhPT10aGlzLm9mZnNldFk7fTt0LmV0PWZ1bmN0aW9uKCl7cmV0dXJuIGlzTmFOKHRoaXMueCkmJmlzTmFOKHRoaXMueSkmJjA9PT10aGlzLm9mZnNldFgmJjA9PT10aGlzLm9mZnNldFk7fTt0LktiPWZ1bmN0aW9uKCl7cmV0dXJuIGlzTmFOKHRoaXMueCkmJmlzTmFOKHRoaXMueSkmJi0xPT09dGhpcy5vZmZzZXRYJiYwPT09dGhpcy5vZmZzZXRZO307Ty5hbGxvYz1mdW5jdGlvbigpe3ZhciBhPVpkLnBvcCgpO3JldHVybiB2b2lkIDA9PT1hP25ldyBPKCk6YTt9O08uZnJlZT1mdW5jdGlvbihhKXtaZC5wdXNoKGEpO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTy5wcm90b3R5cGUse3g6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5GO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkY9YTt9fSx5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5HPWE7fX0sb2Zmc2V0WDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1kO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk1kPWE7fX0sb2Zmc2V0WTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk5kO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk5kPWE7fX19KTtPLnByb3RvdHlwZS5pc0RlZmF1bHQ9Ty5wcm90b3R5cGUuS2I7Ty5wcm90b3R5cGUuaXNOb25lPU8ucHJvdG90eXBlLmV0O08ucHJvdG90eXBlLmlzU2lkZT1PLnByb3RvdHlwZS5xZjtPLnByb3RvdHlwZS5pc05vU3BvdD1PLnByb3RvdHlwZS5qYztPLnByb3RvdHlwZS5pc1Nwb3Q9Ty5wcm90b3R5cGUuZ2I7Ty5wcm90b3R5cGUuaW5jbHVkZXNTaWRlPU8ucHJvdG90eXBlLnBmO08ucHJvdG90eXBlLm9wcG9zaXRlPU8ucHJvdG90eXBlLnJ2O08ucHJvdG90eXBlLmVxdWFscz1PLnByb3RvdHlwZS5BO08ucHJvdG90eXBlLnNldD1PLnByb3RvdHlwZS5zZXQ7Ty5wcm90b3R5cGUuc2V0VG89Ty5wcm90b3R5cGUudGc7dmFyIFpkPVtdO08uY2xhc3NOYW1lPSJTcG90IjtPLnBhcnNlPVhkO08uc3RyaW5naWZ5PVlkO08uTm9uZT1TYz1XZChuZXcgTygwLDAsMCwwKSwwKS5nYSgpO08uRGVmYXVsdD1FZD1XZChuZXcgTygwLDAsLTEsMCksLTEpLmdhKCk7Ty5Ub3BMZWZ0PVRjPW5ldyBPKDAsMCwwLDApLmdhKCk7Ty5Ub3BDZW50ZXI9VWM9bmV3IE8oLjUsMCwwLDApLmdhKCk7Ty5Ub3BSaWdodD1WYz1uZXcgTygxLDAsMCwwKS5nYSgpO08uTGVmdENlbnRlcj1jZD1uZXcgTygwLC41LDAsMCkuZ2EoKTtPLkNlbnRlcj1kZD1uZXcgTyguNSwuNSwwLDApLmdhKCk7Ty5SaWdodENlbnRlcj1lZD1uZXcgTygxLC41LDAsMCkuZ2EoKTtPLkJvdHRvbUxlZnQ9ZmQ9bmV3IE8oMCwxLDAsMCkuZ2EoKTtPLkJvdHRvbUNlbnRlcj1nZD1uZXcgTyguNSwxLDAsMCkuZ2EoKTtPLkJvdHRvbVJpZ2h0PWhkPW5ldyBPKDEsMSwwLDApLmdhKCk7Ty5NaWRkbGVUb3A9SmQ9VWM7Ty5NaWRkbGVMZWZ0PUtkPWNkO08uTWlkZGxlUmlnaHQ9U2Q9ZWQ7Ty5NaWRkbGVCb3R0b209VGQ9Z2Q7Ty5Ub3A9SGQ9VWM7Ty5MZWZ0PUZkPWNkO08uUmlnaHQ9R2Q9ZWQ7Ty5Cb3R0b209SWQ9Z2Q7Ty5Ub3BTaWRlPWlkPVdkKG5ldyBPKDAsMCwxLDEpLDEpLmdhKCk7Ty5MZWZ0U2lkZT1qZD1XZChuZXcgTygwLDAsMSwyKSwxKS5nYSgpO08uUmlnaHRTaWRlPXBkPVdkKG5ldyBPKDAsMCwxLDQpLDEpLmdhKCk7Ty5Cb3R0b21TaWRlPXFkPVdkKG5ldyBPKDAsMCwxLDgpLDEpLmdhKCk7Ty5Ub3BCb3R0b21TaWRlcz1yZD1XZChuZXcgTygwLDAsMSw5KSwxKS5nYSgpO08uTGVmdFJpZ2h0U2lkZXM9c2Q9V2QobmV3IE8oMCwwLDEsNiksMSkuZ2EoKTtPLlRvcExlZnRTaWRlcz10ZD1XZChuZXcgTygwLDAsMSwzKSwxKS5nYSgpO08uVG9wUmlnaHRTaWRlcz11ZD1XZChuZXcgTygwLDAsMSw1KSwxKS5nYSgpO08uQm90dG9tTGVmdFNpZGVzPXZkPVdkKG5ldyBPKDAsMCwxLDEwKSwxKS5nYSgpO08uQm90dG9tUmlnaHRTaWRlcz13ZD1XZChuZXcgTygwLDAsMSwxMiksMSkuZ2EoKTtPLk5vdFRvcFNpZGU9emQ9V2QobmV3IE8oMCwwLDEsMTQpLDEpLmdhKCk7Ty5Ob3RMZWZ0U2lkZT1BZD1XZChuZXcgTygwLDAsMSwxMyksMSkuZ2EoKTtPLk5vdFJpZ2h0U2lkZT1CZD1XZChuZXcgTygwLDAsMSwxMSksMSkuZ2EoKTtPLk5vdEJvdHRvbVNpZGU9Q2Q9V2QobmV3IE8oMCwwLDEsNyksMSkuZ2EoKTtPLkFsbFNpZGVzPURkPVdkKG5ldyBPKDAsMCwxLDE1KSwxKS5nYSgpO1VkPW5ldyBPKC4xNTYsLjE1NikuZ2EoKTtWZD1uZXcgTyguODQ0LC44NDQpLmdhKCk7Ty5wYXJzZT1YZDtPLnN0cmluZ2lmeT1ZZDt2YXIgSD17JHo6IjdkYTcxY2EwYWQzODFlOTAiLHhnOihNYXRoLnNxcnQoMiktMSkvMyo0LGV3Om51bGwsc3FydDpmdW5jdGlvbiBzcXJ0KGEpe2lmKDA+PWEpcmV0dXJuIDA7dmFyIGI9SC5ldztpZihudWxsPT09Yil7Yj1bXTtmb3IodmFyIGM9MDsyRTM+PWM7YysrKXtiW2NdPU1hdGguc3FydChjKTt9SC5ldz1iO31yZXR1cm4gMT5hPyhjPTEvYSwyRTM+PWM/MS9iW2N8MF06TWF0aC5zcXJ0KGEpKToyRTM+PWE/YlthfDBdOk1hdGguc3FydChhKTt9LHc6ZnVuY3Rpb24gdyhhLGIpe2EtPWI7cmV0dXJuIC41PmEmJi0uNTxhO30sY2E6ZnVuY3Rpb24gY2EoYSxiKXthLT1iO3JldHVybiA1RS04PmEmJi01RS04PGE7fSxVYjpmdW5jdGlvbiBVYihhLGIsYyxkLGUsZixnKXswPj1lJiYoZT0xRS02KTtpZihhPGMpe3ZhciBoPWE7dmFyIGs9Yzt9ZWxzZSBoPWMsaz1hO2lmKGI8ZCl7dmFyIGw9Yjt2YXIgbT1kO31lbHNlIGw9ZCxtPWI7aWYoYT09PWMpcmV0dXJuIGw8PWcmJmc8PW0mJmEtZTw9ZiYmZjw9YStlO2lmKGI9PT1kKXJldHVybiBoPD1mJiZmPD1rJiZiLWU8PWcmJmc8PWIrZTtrKz1lO2gtPWU7aWYoaDw9ZiYmZjw9ayYmKG0rPWUsbC09ZSxsPD1nJiZnPD1tKSlpZihrLWg+bS1sKXtpZihhLWM+ZXx8Yy1hPmUpe2lmKGY9KGQtYikvKGMtYSkqKGYtYSkrYixmLWU8PWcmJmc8PWYrZSlyZXR1cm4hMDt9ZWxzZSByZXR1cm4hMDt9ZWxzZSBpZihiLWQ+ZXx8ZC1iPmUpe2lmKGc9KGMtYSkvKGQtYikqKGctYikrYSxnLWU8PWYmJmY8PWcrZSlyZXR1cm4hMDt9ZWxzZSByZXR1cm4hMDtyZXR1cm4hMTt9LEpzOmZ1bmN0aW9uIEpzKGEsYixjLGQsZSxmLGcsaCxrLGwsbSxuKXtpZihILlViKGEsYixnLGgsbixjLGQpJiZILlViKGEsYixnLGgsbixlLGYpKXJldHVybiBILlViKGEsYixnLGgsbixsLG0pO3ZhciBwPShhK2MpLzIscT0oYitkKS8yLHI9KGMrZSkvMix1PShkK2YpLzI7ZT0oZStnKS8yO2Y9KGYraCkvMjtkPShwK3IpLzI7Yz0ocSt1KS8yO3I9KHIrZSkvMjt1PSh1K2YpLzI7dmFyIHg9KGQrcikvMix2PShjK3UpLzI7cmV0dXJuIEguSnMoYSxiLHAscSxkLGMseCx2LGssbCxtLG4pfHxILkpzKHgsdixyLHUsZSxmLGcsaCxrLGwsbSxuKTt9LHF5OmZ1bmN0aW9uIHF5KGEsYixjLGQsZSxmLGcsaCxrKXt2YXIgbD0oYytlKS8yLG09KGQrZikvMjtrLmgoKCgoYStjKS8yK2wpLzIrKGwrKGUrZykvMikvMikvMiwoKChiK2QpLzIrbSkvMisobSsoZitoKS8yKS8yKS8yKTtyZXR1cm4gazt9LHB5OmZ1bmN0aW9uIHB5KGEsYixjLGQsZSxmLGcsaCl7dmFyIGs9KGMrZSkvMixsPShkK2YpLzI7cmV0dXJuIFRiKCgoYStjKS8yK2spLzIsKChiK2QpLzIrbCkvMiwoaysoZStnKS8yKS8yLChsKyhmK2gpLzIpLzIpO30sU2w6ZnVuY3Rpb24gU2woYSxiLGMsZCxlLGYsZyxoLGssbCl7aWYoSC5VYihhLGIsZyxoLGssYyxkKSYmSC5VYihhLGIsZyxoLGssZSxmKSlCYyhsLGEsYiwwLDApLEJjKGwsZyxoLDAsMCk7ZWxzZXt2YXIgbT0oYStjKS8yLG49KGIrZCkvMixwPShjK2UpLzIscT0oZCtmKS8yO2U9KGUrZykvMjtmPShmK2gpLzI7ZD0obStwKS8yO2M9KG4rcSkvMjtwPShwK2UpLzI7cT0ocStmKS8yO3ZhciByPShkK3ApLzIsdT0oYytxKS8yO0guU2woYSxiLG0sbixkLGMscix1LGssbCk7SC5TbChyLHUscCxxLGUsZixnLGgsayxsKTt9cmV0dXJuIGw7fSx6ZTpmdW5jdGlvbiB6ZShhLGIsYyxkLGUsZixnLGgsayxsKXtpZihILlViKGEsYixnLGgsayxjLGQpJiZILlViKGEsYixnLGgsayxlLGYpKTA9PT1sLmxlbmd0aCYmKGwucHVzaChhKSxsLnB1c2goYikpLGwucHVzaChnKSxsLnB1c2goaCk7ZWxzZXt2YXIgbT0oYStjKS8yLG49KGIrZCkvMixwPShjK2UpLzIscT0oZCtmKS8yO2U9KGUrZykvMjtmPShmK2gpLzI7ZD0obStwKS8yO2M9KG4rcSkvMjtwPShwK2UpLzI7cT0ocStmKS8yO3ZhciByPShkK3ApLzIsdT0oYytxKS8yO0guemUoYSxiLG0sbixkLGMscix1LGssbCk7SC56ZShyLHUscCxxLGUsZixnLGgsayxsKTt9cmV0dXJuIGw7fSx1djpmdW5jdGlvbiB1dihhLGIsYyxkLGUsZixnLGgsayxsKXtpZihILlViKGEsYixlLGYsbCxjLGQpKXJldHVybiBILlViKGEsYixlLGYsbCxoLGspO3ZhciBtPShhK2MpLzIsbj0oYitkKS8yO2M9KGMrZSkvMjtkPShkK2YpLzI7dmFyIHA9KG0rYykvMixxPShuK2QpLzI7cmV0dXJuIEgudXYoYSxiLG0sbixwLHEsZyxoLGssbCl8fEgudXYocCxxLGMsZCxlLGYsZyxoLGssbCk7fSxpQTpmdW5jdGlvbiBpQShhLGIsYyxkLGUsZixnKXtnLmgoKChhK2MpLzIrKGMrZSkvMikvMiwoKGIrZCkvMisoZCtmKS8yKS8yKTtyZXR1cm4gZzt9LHR2OmZ1bmN0aW9uIHR2KGEsYixjLGQsZSxmLGcsaCl7aWYoSC5VYihhLGIsZSxmLGcsYyxkKSlCYyhoLGEsYiwwLDApLEJjKGgsZSxmLDAsMCk7ZWxzZXt2YXIgaz0oYStjKS8yLGw9KGIrZCkvMjtjPShjK2UpLzI7ZD0oZCtmKS8yO3ZhciBtPShrK2MpLzIsbj0obCtkKS8yO0gudHYoYSxiLGssbCxtLG4sZyxoKTtILnR2KG0sbixjLGQsZSxmLGcsaCk7fXJldHVybiBoO30sanE6ZnVuY3Rpb24ganEoYSxiLGMsZCxlLGYsZyxoKXtpZihILlViKGEsYixlLGYsZyxjLGQpKTA9PT1oLmxlbmd0aCYmKGgucHVzaChhKSxoLnB1c2goYikpLGgucHVzaChlKSxoLnB1c2goZik7ZWxzZXt2YXIgaz0oYStjKS8yLGw9KGIrZCkvMjtjPShjK2UpLzI7ZD0oZCtmKS8yO3ZhciBtPShrK2MpLzIsbj0obCtkKS8yO0guanEoYSxiLGssbCxtLG4sZyxoKTtILmpxKG0sbixjLGQsZSxmLGcsaCk7fXJldHVybiBoO30sTXA6ZnVuY3Rpb24gTXAoYSxiLGMsZCxlLGYsZyxoLGssbCxtLG4scCxxKXtpZihILlViKGEsYixnLGgscCxjLGQpJiZILlViKGEsYixnLGgscCxlLGYpKXt2YXIgcj0oYS1nKSoobC1uKS0oYi1oKSooay1tKTtpZigwPT09cilyZXR1cm4hMTtwPSgoYSpoLWIqZykqKGstbSktKGEtZykqKGsqbi1sKm0pKS9yO3I9KChhKmgtYipnKSoobC1uKS0oYi1oKSooaypuLWwqbSkpL3I7aWYoKGs+bT9rLW06bS1rKTwobD5uP2wtbjpuLWwpKXtpZihiPGg/Zz1iOihnPWgsaD1iKSxyPGd8fHI+aClyZXR1cm4hMTt9ZWxzZSBpZihhPGc/aD1hOihoPWcsZz1hKSxwPGh8fHA+ZylyZXR1cm4hMTtxLmgocCxyKTtyZXR1cm4hMDt9cj0oYStjKS8yO3ZhciB1PShiK2QpLzI7Yz0oYytlKS8yO2Q9KGQrZikvMjtlPShlK2cpLzI7Zj0oZitoKS8yO3ZhciB4PShyK2MpLzIsdj0odStkKS8yO2M9KGMrZSkvMjtkPShkK2YpLzI7dmFyIHk9KHgrYykvMix6PSh2K2QpLzIsQj0obS1rKSoobS1rKSsobi1sKSoobi1sKSxDPSExO0guTXAoYSxiLHIsdSx4LHYseSx6LGssbCxtLG4scCxxKSYmKGE9KHEueC1rKSoocS54LWspKyhxLnktbCkqKHEueS1sKSxhPEImJihCPWEsQz0hMCkpO2E9cS54O2I9cS55O0guTXAoeSx6LGMsZCxlLGYsZyxoLGssbCxtLG4scCxxKSYmKChxLngtaykqKHEueC1rKSsocS55LWwpKihxLnktbCk8Qj9DPSEwOnEuaChhLGIpKTtyZXR1cm4gQzt9LE5wOmZ1bmN0aW9uIE5wKGEsYixjLGQsZSxmLGcsaCxrLGwsbSxuLHApe3ZhciBxPTA7aWYoSC5VYihhLGIsZyxoLHAsYyxkKSYmSC5VYihhLGIsZyxoLHAsZSxmKSl7cD0oYS1nKSoobC1uKS0oYi1oKSooay1tKTtpZigwPT09cClyZXR1cm4gcTt2YXIgcj0oKGEqaC1iKmcpKihrLW0pLShhLWcpKihrKm4tbCptKSkvcCx1PSgoYSpoLWIqZykqKGwtbiktKGItaCkqKGsqbi1sKm0pKS9wO2lmKHI+PW0pcmV0dXJuIHE7aWYoKGs+bT9rLW06bS1rKTwobD5uP2wtbjpuLWwpKXtpZihiPGg/KGE9YixiPWgpOmE9aCx1PGF8fHU+YilyZXR1cm4gcTt9ZWxzZSBpZihhPGc/KGI9YSxhPWcpOmI9ZyxyPGJ8fHI+YSlyZXR1cm4gcTswPHA/cSsrOjA+cCYmcS0tO31lbHNle3I9KGErYykvMjt1PShiK2QpLzI7dmFyIHg9KGMrZSkvMix2PShkK2YpLzI7ZT0oZStnKS8yO2Y9KGYraCkvMjtkPShyK3gpLzI7Yz0odSt2KS8yO3g9KHgrZSkvMjt2PSh2K2YpLzI7dmFyIHk9KGQreCkvMix6PShjK3YpLzI7cSs9SC5OcChhLGIscix1LGQsYyx5LHosayxsLG0sbixwKTtxKz1ILk5wKHkseix4LHYsZSxmLGcsaCxrLGwsbSxuLHApO31yZXR1cm4gcTt9LFFpOmZ1bmN0aW9uIFFpKGEsYixjLGQsZSxmLGcpe2lmKEguY2EoYSxjKSl7YjxkPyhjPWIsYj1kKTpjPWQ7aWYoZjxjKXJldHVybiBnLmgoYSxjKSwhMTtpZihmPmIpcmV0dXJuIGcuaChhLGIpLCExO2cuaChhLGYpO3JldHVybiEwO31pZihILmNhKGIsZCkpe2E8Yz8oZD1hLGE9Yyk6ZD1jO2lmKGU8ZClyZXR1cm4gZy5oKGQsYiksITE7aWYoZT5hKXJldHVybiBnLmgoYSxiKSwhMTtnLmgoZSxiKTtyZXR1cm4hMDt9ZT0oKGEtZSkqKGEtYykrKGItZikqKGItZCkpLygoYy1hKSooYy1hKSsoZC1iKSooZC1iKSk7aWYoLTVFLTY+ZSlyZXR1cm4gZy5oKGEsYiksITE7aWYoMS4wMDAwMDU8ZSlyZXR1cm4gZy5oKGMsZCksITE7Zy5oKGErZSooYy1hKSxiK2UqKGQtYikpO3JldHVybiEwO30sRmU6ZnVuY3Rpb24gRmUoYSxiLGMsZCxlLGYsZyxoLGspe2lmKEgudyhhLGMpJiZILncoYixkKSlyZXR1cm4gay5oKGEsYiksITE7aWYoSC5jYShlLGcpKXJldHVybiBILmNhKGEsYyk/KEguUWkoYSxiLGMsZCxlLGYsayksITEpOkguUWkoYSxiLGMsZCxlLChkLWIpLyhjLWEpKihlLWEpK2Isayk7aD0oaC1mKS8oZy1lKTtpZihILmNhKGEsYykpe2M9aCooYS1lKStmO2I8ZD8oZT1iLGI9ZCk6ZT1kO2lmKGM8ZSlyZXR1cm4gay5oKGEsZSksITE7aWYoYz5iKXJldHVybiBrLmgoYSxiKSwhMTtrLmgoYSxjKTtyZXR1cm4hMDt9Zz0oZC1iKS8oYy1hKTtpZihILmNhKGgsZykpcmV0dXJuIEguUWkoYSxiLGMsZCxlLGYsayksITE7ZT0oZyphLWgqZStmLWIpLyhnLWgpO2lmKEguY2EoZywwKSl7YTxjPyhkPWEsYT1jKTpkPWM7aWYoZTxkKXJldHVybiBrLmgoZCxiKSwhMTtpZihlPmEpcmV0dXJuIGsuaChhLGIpLCExO2suaChlLGIpO3JldHVybiEwO31yZXR1cm4gSC5RaShhLGIsYyxkLGUsZyooZS1hKStiLGspO30sZkE6ZnVuY3Rpb24gZkEoYSxiLGMsZCxlKXtyZXR1cm4gSC5GZShjLngsYy55LGQueCxkLnksYS54LGEueSxiLngsYi55LGUpO30sZUE6ZnVuY3Rpb24gZUEoYSxiLGMsZCxlLGYsZyxoLGssbCl7ZnVuY3Rpb24gbShjLGQpe3ZhciBlPShjLWEpKihjLWEpKyhkLWIpKihkLWIpO2U8biYmKG49ZSxrLmgoYyxkKSk7fXZhciBuPUluZmluaXR5O20oay54LGsueSk7dmFyIHA9MCxxPTAscj0wLHU9MDtlPGc/KHA9ZSxxPWcpOihwPWcscT1lKTtmPGg/KHI9ZSx1PWcpOihyPWcsdT1lKTtwPShxLXApLzIrbDtsPSh1LXIpLzIrbDtlPShlK2cpLzI7Zj0oZitoKS8yO2lmKDA9PT1wfHwwPT09bClyZXR1cm4gaztpZiguNT4oYz5hP2MtYTphLWMpKXtwPTEtKGMtZSkqKGMtZSkvKHAqcCk7aWYoMD5wKXJldHVybiBrO3A9TWF0aC5zcXJ0KHApO2Q9LWwqcCtmO20oYyxsKnArZik7bShjLGQpO31lbHNle2M9KGQtYikvKGMtYSk7ZD0xLyhwKnApK2MqYy8obCpsKTtoPTIqYyooYi1jKmEpLyhsKmwpLTIqYypmLyhsKmwpLTIqZS8ocCpwKTtwPWgqaC00KmQqKDIqYyphKmYvKGwqbCktMipiKmYvKGwqbCkrZipmLyhsKmwpK2UqZS8ocCpwKS0xKyhiLWMqYSkqKGItYyphKS8obCpsKSk7aWYoMD5wKXJldHVybiBrO3A9TWF0aC5zcXJ0KHApO2w9KC1oK3ApLygyKmQpO20obCxjKmwtYyphK2IpO3A9KC1oLXApLygyKmQpO20ocCxjKnAtYyphK2IpO31yZXR1cm4gazt9LFRjOmZ1bmN0aW9uIFRjKGEsYixjLGQsZSxmLGcsaCxrKXt2YXIgbD0xRTIxLG09YSxuPWI7aWYoSC5GZShhLGIsYSxkLGUsZixnLGgsaykpe3ZhciBwPShrLngtZSkqKGsueC1lKSsoay55LWYpKihrLnktZik7cDxsJiYobD1wLG09ay54LG49ay55KTt9SC5GZShjLGIsYyxkLGUsZixnLGgsaykmJihwPShrLngtZSkqKGsueC1lKSsoay55LWYpKihrLnktZikscDxsJiYobD1wLG09ay54LG49ay55KSk7SC5GZShhLGIsYyxiLGUsZixnLGgsaykmJihiPShrLngtZSkqKGsueC1lKSsoay55LWYpKihrLnktZiksYjxsJiYobD1iLG09ay54LG49ay55KSk7SC5GZShhLGQsYyxkLGUsZixnLGgsaykmJihhPShrLngtZSkqKGsueC1lKSsoay55LWYpKihrLnktZiksYTxsJiYobD1hLG09ay54LG49ay55KSk7ay5oKG0sbik7cmV0dXJuIDFFMjE+bDt9LGRBOmZ1bmN0aW9uIGRBKGEsYixjLGQsZSxmLGcsaCxrKXtjPWEtYztnPWUtZzswPT09Y3x8MD09PWc/MD09PWM/KGI9KGYtaCkvZyxoPWEsZT1iKmgrKGYtYiplKSk6KGY9KGItZCkvYyxoPWUsZT1mKmgrKGItZiphKSk6KGQ9KGItZCkvYyxoPShmLWgpL2csYT1iLWQqYSxoPShmLWgqZS1hKS8oZC1oKSxlPWQqaCthKTtrLmgoaCxlKTtyZXR1cm4gazt9LCRzOmZ1bmN0aW9uICRzKGEsYixjKXt2YXIgZD1iLngsZT1iLnksZj1jLngsZz1jLnksaD1hLmxlZnQsaz1hLnJpZ2h0LGw9YS50b3AsbT1hLmJvdHRvbTtyZXR1cm4gZD09PWY/KGU8Zz8oZj1lLGU9Zyk6Zj1nLGg8PWQmJmQ8PWsmJmY8PW0mJmU+PWwpOmU9PT1nPyhkPGY/KGc9ZCxkPWYpOmc9ZixsPD1lJiZlPD1tJiZnPD1rJiZkPj1oKTphLmVhKGIpfHxhLmVhKGMpfHxILlpzKGgsbCxrLGwsZCxlLGYsZyl8fEguWnMoayxsLGssbSxkLGUsZixnKXx8SC5acyhrLG0saCxtLGQsZSxmLGcpfHxILlpzKGgsbSxoLGwsZCxlLGYsZyk/ITA6ITE7fSxaczpmdW5jdGlvbiBacyhhLGIsYyxkLGUsZixnLGgpe3JldHVybiAwPj1ILk1zKGEsYixjLGQsZSxmKSpILk1zKGEsYixjLGQsZyxoKSYmMD49SC5NcyhlLGYsZyxoLGEsYikqSC5NcyhlLGYsZyxoLGMsZCk7fSxNczpmdW5jdGlvbiBNcyhhLGIsYyxkLGUsZil7Yy09YTtkLT1iO2E9ZS1hO2I9Zi1iO2Y9YSpkLWIqYzswPT09ZiYmKGY9YSpjK2IqZCwwPGYmJihmPShhLWMpKmMrKGItZCkqZCwwPmYmJihmPTApKSk7cmV0dXJuIDA+Zj8tMTowPGY/MTowO30sZ3E6ZnVuY3Rpb24gZ3EoYSl7MD5hJiYoYSs9MzYwKTszNjA8PWEmJihhLT0zNjApO3JldHVybiBhO30sYXg6ZnVuY3Rpb24gYXgoYSxiLGMsZCxlLGYpe3ZhciBnPU1hdGguUEk7Znx8KGQqPWcvMTgwLGUqPWcvMTgwKTt2YXIgaD1kPmU/LTE6MTtmPVtdO3ZhciBrPWcvMixsPWQ7ZD1NYXRoLm1pbigyKmcsTWF0aC5hYnMoZS1kKSk7aWYoMUUtNT5kKXJldHVybiBrPWwraCpNYXRoLm1pbihkLGspLGg9YStjKk1hdGguY29zKGwpLGw9YitjKk1hdGguc2luKGwpLGErPWMqTWF0aC5jb3MoayksYis9YypNYXRoLnNpbihrKSxjPShoK2EpLzIsaz0obCtiKS8yLGYucHVzaChbaCxsLGMsayxjLGssYSxiXSksZjtmb3IoOzFFLTU8ZDspe2U9bCtoKk1hdGgubWluKGQsayksZi5wdXNoKEgueXkoYyxsLGUsYSxiKSksZC09TWF0aC5hYnMoZS1sKSxsPWU7fXJldHVybiBmO30seXk6ZnVuY3Rpb24geXkoYSxiLGMsZCxlKXt2YXIgZj0oYy1iKS8yLGc9YSpNYXRoLmNvcyhmKSxoPWEqTWF0aC5zaW4oZiksaz0taCxsPWcqZytrKmssbT1sK2cqZytrKmg7bD00LzMqKE1hdGguc3FydCgyKmwqbSktbSkvKGcqaC1rKmcpO2g9Zy1sKms7Zz1rK2wqZztrPS1nO2w9ZitiO2Y9TWF0aC5jb3MobCk7bD1NYXRoLnNpbihsKTtyZXR1cm5bZCthKk1hdGguY29zKGIpLGUrYSpNYXRoLnNpbihiKSxkK2gqZi1nKmwsZStoKmwrZypmLGQraCpmLWsqbCxlK2gqbCtrKmYsZCthKk1hdGguY29zKGMpLGUrYSpNYXRoLnNpbihjKV07fSxUcDpmdW5jdGlvbiBUcChhLGIsYyxkLGUsZixnKXtjPU1hdGguZmxvb3IoKGEtYykvZSkqZStjO2Q9TWF0aC5mbG9vcigoYi1kKS9mKSpmK2Q7dmFyIGg9YztjK2UtYTxlLzImJihoPWMrZSk7YT1kO2QrZi1iPGYvMiYmKGE9ZCtmKTtnLmgoaCxhKTtyZXR1cm4gZzt9LGx4OmZ1bmN0aW9uIGx4KGEsYil7dmFyIGM9TWF0aC5tYXgoYSxiKTthPU1hdGgubWluKGEsYik7dmFyIGQ7ZG97Yj1jJWEsYz1kPWEsYT1iO313aGlsZSgwPGIpO3JldHVybiBkO30sRHk6ZnVuY3Rpb24gRHkoYSxiLGMsZCl7dmFyIGU9MD5jLGY9MD5kO2lmKGE8Yil7dmFyIGc9MTt2YXIgaD0wO31lbHNlIGc9MCxoPTE7dmFyIGs9MD09PWc/YTpiO3ZhciBsPTA9PT1nP2M6ZDtpZigwPT09Zz9lOmYpbD0tbDtnPWg7Yz0wPT09Zz9jOmQ7aWYoMD09PWc/ZTpmKWM9LWM7cmV0dXJuIEguRXkoaywwPT09Zz9hOmIsbCxjLDAsMCk7fSxFeTpmdW5jdGlvbiBFeShhLGIsYyxkLGUsZil7aWYoMDxkKXtpZigwPGMpe2U9YSphO2Y9YipiO2EqPWM7dmFyIGc9YipkLGg9LWYrZyxrPS1mK01hdGguc3FydChhKmErZypnKTtiPWg7Zm9yKHZhciBsPTA7OTk5OTk5OTk5OT5sOysrbCl7Yj0uNSooaCtrKTtpZihiPT09aHx8Yj09PWspYnJlYWs7dmFyIG09YS8oYitlKSxuPWcvKGIrZik7bT1tKm0rbipuLTE7aWYoMDxtKWg9YjtlbHNlIGlmKDA+bSlrPWI7ZWxzZSBicmVhazt9Yz1lKmMvKGIrZSktYztkPWYqZC8oYitmKS1kO2M9TWF0aC5zcXJ0KGMqYytkKmQpO31lbHNlIGM9TWF0aC5hYnMoZC1iKTt9ZWxzZSBkPWEqYS1iKmIsZj1hKmMsZjxkPyhkPWYvZCxmPWIqTWF0aC5zcXJ0KE1hdGguYWJzKDEtZCpkKSksYz1hKmQtYyxjPU1hdGguc3FydChjKmMrZipmKSk6Yz1NYXRoLmFicyhjLWEpO3JldHVybiBjO30sSmU6bmV3IHRiKCksQm06bmV3IHRiKCl9O0guemE9SC4kejtmdW5jdGlvbiAkZChhKXttYih0aGlzKTt0aGlzLnY9ITE7dm9pZCAwPT09YSYmKGE9YWUpO3RoaXMudmE9YTt0aGlzLkJjPXRoaXMubWM9dGhpcy5iZD10aGlzLmFkPTA7dGhpcy5naj1uZXcgRSgpO3RoaXMuaHI9dGhpcy5nai5CYTt0aGlzLlFxPW5ldyBOKCkuZnJlZXplKCk7dGhpcy5yYT0hMDt0aGlzLk5tPXRoaXMueGs9bnVsbDt0aGlzLk9tPU5hTjt0aGlzLmJmPVRjO3RoaXMuY2Y9aGQ7dGhpcy5jbD10aGlzLmVsPU5hTjt0aGlzLkRmPWJlO30kZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3ZhciBhPW5ldyAkZCgpO2EudmE9dGhpcy52YTthLmFkPXRoaXMuYWQ7YS5iZD10aGlzLmJkO2EubWM9dGhpcy5tYzthLkJjPXRoaXMuQmM7Zm9yKHZhciBiPXRoaXMuZ2ouaixjPWIubGVuZ3RoLGQ9YS5naixlPTA7ZTxjO2UrKyl7dmFyIGY9YltlXS5jb3B5KCk7ZC5hZGQoZik7fWEuaHI9dGhpcy5ocjthLlFxLmFzc2lnbih0aGlzLlFxKTthLnJhPXRoaXMucmE7YS54az10aGlzLnhrO2EuTm09dGhpcy5ObTthLk9tPXRoaXMuT207YS5iZj10aGlzLmJmLkkoKTthLmNmPXRoaXMuY2YuSSgpO2EuZWw9dGhpcy5lbDthLmNsPXRoaXMuY2w7YS5EZj10aGlzLkRmO3JldHVybiBhO307dD0kZC5wcm90b3R5cGU7dC5nYT1mdW5jdGlvbigpe3RoaXMuZnJlZXplKCk7T2JqZWN0LmZyZWV6ZSh0aGlzKTtyZXR1cm4gdGhpczt9O3QuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy52PSEwO3ZhciBhPXRoaXMuZmlndXJlczthLmZyZWV6ZSgpO2E9YS5qO2Zvcih2YXIgYj1hLmxlbmd0aCxjPTA7YzxiO2MrKyl7YVtjXS5mcmVlemUoKTt9cmV0dXJuIHRoaXM7fTt0LmhhPWZ1bmN0aW9uKCl7T2JqZWN0LmlzRnJvemVuKHRoaXMpJiZBKCJjYW5ub3QgdGhhdyBjb25zdGFudDogIit0aGlzKTt0aGlzLnY9ITE7dmFyIGE9dGhpcy5maWd1cmVzO2EuaGEoKTthPWEuajtmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe2FbY10uaGEoKTt9cmV0dXJuIHRoaXM7fTt0LlFhPWZ1bmN0aW9uKGEpe2lmKCEoYSBpbnN0YW5jZW9mICRkKSlyZXR1cm4hMTtpZih0aGlzLnR5cGUhPT1hLnR5cGUpcmV0dXJuIHRoaXMudHlwZT09PWNlJiZhLnR5cGU9PT1hZT9kZSh0aGlzLGEpOmEudHlwZT09PWNlJiZ0aGlzLnR5cGU9PT1hZT9kZShhLHRoaXMpOiExO2lmKHRoaXMudHlwZT09PWFlKXt2YXIgYj10aGlzLmZpZ3VyZXMuajthPWEuZmlndXJlcy5qO3ZhciBjPWIubGVuZ3RoO2lmKGMhPT1hLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGQ9MDtkPGM7ZCsrKXtpZighYltkXS5RYShhW2RdKSlyZXR1cm4hMTt9cmV0dXJuITA7fXJldHVybiBILncodGhpcy5zdGFydFgsYS5zdGFydFgpJiZILncodGhpcy5zdGFydFksYS5zdGFydFkpJiZILncodGhpcy5lbmRYLGEuZW5kWCkmJkgudyh0aGlzLmVuZFksYS5lbmRZKTt9O2Z1bmN0aW9uIGRlKGEsYil7cmV0dXJuIGEudHlwZSE9PWNlfHxiLnR5cGUhPT1hZT8hMToxPT09Yi5maWd1cmVzLmNvdW50JiYoYj1iLmZpZ3VyZXMuTigwKSwxPT09Yi5zZWdtZW50cy5jb3VudCYmSC53KGEuc3RhcnRYLGIuc3RhcnRYKSYmSC53KGEuc3RhcnRZLGIuc3RhcnRZKSYmKGI9Yi5zZWdtZW50cy5OKDApLGIudHlwZT09PWllJiZILncoYS5lbmRYLGIuZW5kWCkmJkgudyhhLmVuZFksYi5lbmRZKSkpPyEwOiExO31mdW5jdGlvbiBqZShhKXtyZXR1cm4gYS50b1N0cmluZygpO310LmZiPWZ1bmN0aW9uKGEpe2EuY2xhc3NUeXBlPT09JGQmJih0aGlzLnR5cGU9YSk7fTt0LnRvU3RyaW5nPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPS0xKTtzd2l0Y2godGhpcy50eXBlKXtjYXNlIGNlOnJldHVybiAwPmE/Ik0iK3RoaXMuc3RhcnRYLnRvU3RyaW5nKCkrIiAiK3RoaXMuc3RhcnRZLnRvU3RyaW5nKCkrIkwiK3RoaXMuZW5kWC50b1N0cmluZygpKyIgIit0aGlzLmVuZFkudG9TdHJpbmcoKToiTSIrdGhpcy5zdGFydFgudG9GaXhlZChhKSsiICIrdGhpcy5zdGFydFkudG9GaXhlZChhKSsiTCIrdGhpcy5lbmRYLnRvRml4ZWQoYSkrIiAiK3RoaXMuZW5kWS50b0ZpeGVkKGEpO2Nhc2Uga2U6dmFyIGI9bmV3IE4odGhpcy5zdGFydFgsdGhpcy5zdGFydFksMCwwKTtiLlZ2KHRoaXMuZW5kWCx0aGlzLmVuZFksMCwwKTtyZXR1cm4gMD5hPyJNIitiLngudG9TdHJpbmcoKSsiICIrYi55LnRvU3RyaW5nKCkrIkgiK2IucmlnaHQudG9TdHJpbmcoKSsiViIrYi5ib3R0b20udG9TdHJpbmcoKSsiSCIrYi5sZWZ0LnRvU3RyaW5nKCkrInoiOiJNIitiLngudG9GaXhlZChhKSsiICIrYi55LnRvRml4ZWQoYSkrIkgiK2IucmlnaHQudG9GaXhlZChhKSsiViIrYi5ib3R0b20udG9GaXhlZChhKSsiSCIrYi5sZWZ0LnRvRml4ZWQoYSkrInoiO2Nhc2UgbGU6Yj1uZXcgTih0aGlzLnN0YXJ0WCx0aGlzLnN0YXJ0WSwwLDApO2IuVnYodGhpcy5lbmRYLHRoaXMuZW5kWSwwLDApO2lmKDA+YSlyZXR1cm4gYT1iLmxlZnQudG9TdHJpbmcoKSsiICIrKGIueStiLmhlaWdodC8yKS50b1N0cmluZygpLCJNIithKyJBIisoYi53aWR0aC8yKS50b1N0cmluZygpKyIgIisoYi5oZWlnaHQvMikudG9TdHJpbmcoKSsiIDAgMCAxICIrKGIucmlnaHQudG9TdHJpbmcoKSsiICIrKGIueStiLmhlaWdodC8yKS50b1N0cmluZygpKSsiQSIrKGIud2lkdGgvMikudG9TdHJpbmcoKSsiICIrKGIuaGVpZ2h0LzIpLnRvU3RyaW5nKCkrIiAwIDAgMSAiK2E7dmFyIGM9Yi5sZWZ0LnRvRml4ZWQoYSkrIiAiKyhiLnkrYi5oZWlnaHQvMikudG9GaXhlZChhKTtyZXR1cm4iTSIrYysiQSIrKGIud2lkdGgvMikudG9GaXhlZChhKSsiICIrKGIuaGVpZ2h0LzIpLnRvRml4ZWQoYSkrIiAwIDAgMSAiKyhiLnJpZ2h0LnRvRml4ZWQoYSkrIiAiKyhiLnkrYi5oZWlnaHQvMikudG9GaXhlZChhKSkrIkEiKyhiLndpZHRoLzIpLnRvRml4ZWQoYSkrIiAiKyhiLmhlaWdodC8yKS50b0ZpeGVkKGEpKyIgMCAwIDEgIitjO2Nhc2UgYWU6Yj0iIjtjPXRoaXMuZmlndXJlcy5qO2Zvcih2YXIgZD1jLmxlbmd0aCxlPTA7ZTxkO2UrKyl7dmFyIGY9Y1tlXTswPGUmJihiKz0iIHggIik7Zi5pc0ZpbGxlZCYmKGIrPSJGICIpO2IrPWYudG9TdHJpbmcoYSk7fXJldHVybiBiO2RlZmF1bHQ6cmV0dXJuIHRoaXMudHlwZS50b1N0cmluZygpO319O2Z1bmN0aW9uIG1lKGEsYil7ZnVuY3Rpb24gYygpe3JldHVybiB1Pj1CLTE/ITA6bnVsbCE9PWtbdSsxXS5tYXRjaCgvW1V1QmJNbVp6TGxIaFZ2Q2NTc1FxVHRBYUZmWHhdLyk7fWZ1bmN0aW9uIGQoKXt1Kys7cmV0dXJuIGtbdV07fWZ1bmN0aW9uIGUoKXt2YXIgYT1uZXcgRyhwYXJzZUZsb2F0KGQoKSkscGFyc2VGbG9hdChkKCkpKTt4PT09eC50b0xvd2VyQ2FzZSgpJiYoYS54PXoueCthLngsYS55PXoueSthLnkpO3JldHVybiBhO31mdW5jdGlvbiBmKCl7cmV0dXJuIHo9ZSgpO31mdW5jdGlvbiBnKCl7cmV0dXJuIHk9ZSgpO31mdW5jdGlvbiBoKCl7dmFyIGE9di50b0xvd2VyQ2FzZSgpO3JldHVybiJjIiE9PWEmJiJzIiE9PWEmJiJxIiE9PWEmJiJ0IiE9PWE/ejpuZXcgRygyKnoueC15LngsMip6LnkteS55KTt9dm9pZCAwPT09YiYmKGI9ITEpO2E9YS5yZXBsYWNlKC8sL2dtLCIgIik7YT1hLnJlcGxhY2UoLyhbVXVCYk1tWnpMbEhoVnZDY1NzUXFUdEFhRmZYeF0pKFtVdUJiTW1aekxsSGhWdkNjU3NRcVR0QWFGZlh4XSkvZ20sIiQxICQyIik7YT1hLnJlcGxhY2UoLyhbVXVCYk1tWnpMbEhoVnZDY1NzUXFUdEFhRmZYeF0pKFtVdUJiTW1aekxsSGhWdkNjU3NRcVR0QWFGZlh4XSkvZ20sIiQxICQyIik7YT1hLnJlcGxhY2UoLyhbVXVCYk1tWnpMbEhoVnZDY1NzUXFUdEFhRmZYeF0pKFteXHNdKS9nbSwiJDEgJDIiKTthPWEucmVwbGFjZSgvKFteXHNdKShbVXVCYk1tWnpMbEhoVnZDY1NzUXFUdEFhRmZYeF0pL2dtLCIkMSAkMiIpO2E9YS5yZXBsYWNlKC8oWzAtOV0pKFsrXC1dKS9nbSwiJDEgJDIiKTthPWEucmVwbGFjZSgvKFtBYV0oXHMrWzAtOV0rKXszfSlccysoWzAxXSlccyooWzAxXSkvZ20sIiQxICQzICQ0ICIpO2E9YS5yZXBsYWNlKC9bXHNcclx0XG5dKy9nbSwiICIpO2E9YS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7dmFyIGs9YS5zcGxpdCgiICIpO2ZvcihhPTA7YTxrLmxlbmd0aDthKyspe3ZhciBsPWtbYV07aWYobnVsbCE9PWwubWF0Y2goLyhcLlswLTldKikoXC4pL2dtKSl7Zm9yKHZhciBtPUthKCksbj0iIixwPSExLHE9MDtxPGwubGVuZ3RoO3ErKyl7dmFyIHI9bFtxXTsiLiIhPT1yfHxwPyIuIj09PXI/KG0ucHVzaChuKSxuPSIuIik6bis9cjoocD0hMCxuKz1yKTt9bS5wdXNoKG4pO2suc3BsaWNlKGEsMSk7Zm9yKGw9MDtsPG0ubGVuZ3RoO2wrKyl7ay5zcGxpY2UoYStsLDAsbVtsXSk7fWErPW0ubGVuZ3RoLTE7T2EobSk7fX12YXIgdT0tMSx4PSIiLHY9IiI7bT1uZXcgRygwLDApO3ZhciB5PW5ldyBHKDAsMCksej1uZXcgRygwLDApLEI9ay5sZW5ndGg7YT1uZShudWxsKTtuPWw9ITE7cD0hMDtmb3IocT1udWxsOyEodT49Qi0xKTspe2lmKHY9eCx4PWQoKSwiIiE9PXgpc3dpdGNoKHgudG9VcHBlckNhc2UoKSl7Y2FzZSJYIjpwPSEwO249bD0hMTticmVhaztjYXNlIk0iOnE9ZigpO251bGw9PT1hLmVjfHwhMD09PXA/KG9lKGEscS54LHEueSxsLCFuKSxwPSExKTphLm1vdmVUbyhxLngscS55KTtmb3IobT16OyFjKCk7KXtxPWYoKSxhLmxpbmVUbyhxLngscS55KTt9YnJlYWs7Y2FzZSJMIjpmb3IoOyFjKCk7KXtxPWYoKSxhLmxpbmVUbyhxLngscS55KTt9YnJlYWs7Y2FzZSJIIjpmb3IoOyFjKCk7KXt6PW5ldyBHKCh4PT09eC50b0xvd2VyQ2FzZSgpP3oueDowKStwYXJzZUZsb2F0KGQoKSksei55KSxhLmxpbmVUbyh6Lngsei55KTt9YnJlYWs7Y2FzZSJWIjpmb3IoOyFjKCk7KXt6PW5ldyBHKHoueCwoeD09PXgudG9Mb3dlckNhc2UoKT96Lnk6MCkrcGFyc2VGbG9hdChkKCkpKSxhLmxpbmVUbyh6Lngsei55KTt9YnJlYWs7Y2FzZSJDIjpmb3IoOyFjKCk7KXtxPWUoKTtyPWcoKTt2YXIgQz1mKCk7cGUoYSxxLngscS55LHIueCxyLnksQy54LEMueSk7fWJyZWFrO2Nhc2UiUyI6Zm9yKDshYygpOyl7cT1oKCkscj1nKCksQz1mKCkscGUoYSxxLngscS55LHIueCxyLnksQy54LEMueSk7fWJyZWFrO2Nhc2UiUSI6Zm9yKDshYygpOyl7cT1nKCkscj1mKCksdGUoYSxxLngscS55LHIueCxyLnkpO31icmVhaztjYXNlIlQiOmZvcig7IWMoKTspe3k9cT1oKCkscj1mKCksdGUoYSxxLngscS55LHIueCxyLnkpO31icmVhaztjYXNlIkIiOmZvcig7IWMoKTspe3E9cGFyc2VGbG9hdChkKCkpO3I9cGFyc2VGbG9hdChkKCkpO0M9cGFyc2VGbG9hdChkKCkpO3ZhciBJPXBhcnNlRmxvYXQoZCgpKSxKPXBhcnNlRmxvYXQoZCgpKSxMPUosVT0hMTtjKCl8fChMPXBhcnNlRmxvYXQoZCgpKSxjKCl8fChVPTAhPT1wYXJzZUZsb2F0KGQoKSkpKTt4PT09eC50b0xvd2VyQ2FzZSgpJiYoQys9ei54LEkrPXoueSk7YS5hcmNUbyhxLHIsQyxJLEosTCxVKTt9YnJlYWs7Y2FzZSJBIjpmb3IoOyFjKCk7KXtxPU1hdGguYWJzKHBhcnNlRmxvYXQoZCgpKSkscj1NYXRoLmFicyhwYXJzZUZsb2F0KGQoKSkpLEM9cGFyc2VGbG9hdChkKCkpLEk9ISFwYXJzZUZsb2F0KGQoKSksSj0hIXBhcnNlRmxvYXQoZCgpKSxMPWYoKSx1ZShhLHEscixDLEksSixMLngsTC55KTt9YnJlYWs7Y2FzZSJaIjp2ZShhKTt6PW07YnJlYWs7Y2FzZSJGIjpxPSIiO2ZvcihyPTE7a1t1K3JdOyl7aWYobnVsbCE9PWtbdStyXS5tYXRjaCgvW1V1XS8pKXIrKztlbHNlIGlmKG51bGw9PT1rW3Urcl0ubWF0Y2goL1tVdUJiTW1aekxsSGhWdkNjU3NRcVR0QWFGZlh4XS8pKXIrKztlbHNle3E9a1t1K3JdO2JyZWFrO319cS5tYXRjaCgvW01tXS8pP2w9ITA6MDxhLmVjLnNlZ21lbnRzLmxlbmd0aCYmKGEuZWMuaXNGaWxsZWQ9ITApO2JyZWFrO2Nhc2UiVSI6cT0iIjtmb3Iocj0xO2tbdStyXTspe2lmKG51bGwhPT1rW3Urcl0ubWF0Y2goL1tGZl0vKSlyKys7ZWxzZSBpZihudWxsPT09a1t1K3JdLm1hdGNoKC9bVXVCYk1tWnpMbEhoVnZDY1NzUXFUdEFhRmZYeF0vKSlyKys7ZWxzZXtxPWtbdStyXTticmVhazt9fXEubWF0Y2goL1tNbV0vKT9uPSEwOmEucXEoITEpO319bT1hLlVzO3dlPWE7aWYoYilmb3IoYj1tLmZpZ3VyZXMuaXRlcmF0b3I7Yi5uZXh0KCk7KXtiLnZhbHVlLmlzRmlsbGVkPSEwO31yZXR1cm4gbTt9ZnVuY3Rpb24geGUoYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD1HLmFsbG9jKCksZT0wO2U8YztlKyspe3ZhciBmPWFbZV07ZC54PWZbMF07ZC55PWZbMV07Yi50YShkKTtmWzBdPWQueDtmWzFdPWQueTtkLng9ZlsyXTtkLnk9ZlszXTtiLnRhKGQpO2ZbMl09ZC54O2ZbM109ZC55O2QueD1mWzRdO2QueT1mWzVdO2IudGEoZCk7Zls0XT1kLng7Zls1XT1kLnk7ZC54PWZbNl07ZC55PWZbN107Yi50YShkKTtmWzZdPWQueDtmWzddPWQueTt9Ry5mcmVlKGQpO310Lmx2PWZ1bmN0aW9uKCl7aWYodGhpcy5yYXx8dGhpcy5ociE9PXRoaXMuZmlndXJlcy5CYSlyZXR1cm4hMDtmb3IodmFyIGE9dGhpcy5maWd1cmVzLmosYj1hLmxlbmd0aCxjPTA7YzxiO2MrKyl7aWYoYVtjXS5sdigpKXJldHVybiEwO31yZXR1cm4hMTt9OyRkLnByb3RvdHlwZS5jb21wdXRlQm91bmRzPWZ1bmN0aW9uKCl7dGhpcy5yYT0hMTt0aGlzLk5tPXRoaXMueGs9bnVsbDt0aGlzLk9tPU5hTjt0aGlzLmhyPXRoaXMuZmlndXJlcy5CYTtmb3IodmFyIGE9dGhpcy5maWd1cmVzLmosYj1hLmxlbmd0aCxjPTA7YzxiO2MrKyl7dmFyIGQ9YVtjXTtkLnJhPSExO3ZhciBlPWQuc2VnbWVudHM7ZC5zcz1lLkJhO2Q9ZS5qO2U9ZC5sZW5ndGg7Zm9yKHZhciBmPTA7ZjxlO2YrKyl7dmFyIGc9ZFtmXTtnLnJhPSExO2cuS2U9bnVsbDt9fWE9dGhpcy5RcTthLmhhKCk7aXNOYU4odGhpcy5lbCl8fGlzTmFOKHRoaXMuY2wpP2EuaCgwLDAsMCwwKTphLmgoMCwwLHRoaXMuZWwsdGhpcy5jbCk7eWUodGhpcyxhLCExKTtCYyhhLDAsMCwwLDApO2EuZnJlZXplKCk7fTskZC5wcm90b3R5cGUuJHc9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgTigpO3llKHRoaXMsYSwhMCk7cmV0dXJuIGE7fTtmdW5jdGlvbiB5ZShhLGIsYyl7c3dpdGNoKGEudHlwZSl7Y2FzZSBjZTpjYXNlIGtlOmNhc2UgbGU6Yz9iLmgoYS5hZCxhLmJkLDAsMCk6QmMoYixhLmFkLGEuYmQsMCwwKTtCYyhiLGEubWMsYS5CYywwLDApO2JyZWFrO2Nhc2UgYWU6dmFyIGQ9YS5maWd1cmVzO2E9ZC5qO2Q9ZC5sZW5ndGg7Zm9yKHZhciBlPTA7ZTxkO2UrKyl7dmFyIGY9YVtlXTtjJiYwPT09ZT9iLmgoZi5zdGFydFgsZi5zdGFydFksMCwwKTpCYyhiLGYuc3RhcnRYLGYuc3RhcnRZLDAsMCk7Zm9yKHZhciBnPWYuc2VnbWVudHMuaixoPWcubGVuZ3RoLGs9Zi5zdGFydFgsbD1mLnN0YXJ0WSxtPTA7bTxoO20rKyl7dmFyIG49Z1ttXTtzd2l0Y2gobi50eXBlKXtjYXNlIGllOmNhc2UgemU6az1uLmVuZFg7bD1uLmVuZFk7QmMoYixrLGwsMCwwKTticmVhaztjYXNlIEFlOkguU2woayxsLG4ucG9pbnQxWCxuLnBvaW50MVksbi5wb2ludDJYLG4ucG9pbnQyWSxuLmVuZFgsbi5lbmRZLC41LGIpO2s9bi5lbmRYO2w9bi5lbmRZO2JyZWFrO2Nhc2UgQmU6SC50dihrLGwsbi5wb2ludDFYLG4ucG9pbnQxWSxuLmVuZFgsbi5lbmRZLC41LGIpO2s9bi5lbmRYO2w9bi5lbmRZO2JyZWFrO2Nhc2UgQ2U6Y2FzZSBEZTp2YXIgcD1uLnR5cGU9PT1DZT9FZShuLGYpOkZlKG4sZixrLGwpLHE9cC5sZW5ndGg7aWYoMD09PXEpe2s9bi5jZW50ZXJYO2w9bi5jZW50ZXJZO0JjKGIsayxsLDAsMCk7YnJlYWs7fW49bnVsbDtmb3IodmFyIHI9MDtyPHE7cisrKXtuPXBbcl0sSC5TbChuWzBdLG5bMV0sblsyXSxuWzNdLG5bNF0sbls1XSxuWzZdLG5bN10sLjUsYik7fW51bGwhPT1uJiYoaz1uWzZdLGw9bls3XSk7YnJlYWs7ZGVmYXVsdDpBKCJVbmtub3duIFNlZ21lbnQgdHlwZTogIituLnR5cGUpO319fWJyZWFrO2RlZmF1bHQ6QSgiVW5rbm93biBHZW9tZXRyeSB0eXBlOiAiK2EudHlwZSk7fX0kZC5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7dGhpcy52JiZ3YSh0aGlzKTt2YXIgYT10aGlzLiR3KCk7dGhpcy5vZmZzZXQoLWEueCwtYS55KTtyZXR1cm4gbmV3IEcoLWEueCwtYS55KTt9OyRkLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLnYmJndhKHRoaXMpO3RoaXMudHJhbnNmb3JtKDEsMCwwLDEsYSxiKTtyZXR1cm4gdGhpczt9OyRkLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihhLGIpe3RoaXMudiYmd2EodGhpcyk7dGhpcy50cmFuc2Zvcm0oYSwwLDAsYiwwLDApO3JldHVybiB0aGlzO307JGQucHJvdG90eXBlLnJvdGF0ZT1mdW5jdGlvbihhLGIsYyl7dGhpcy52JiZ3YSh0aGlzKTt2b2lkIDA9PT1iJiYoYj0wKTt2b2lkIDA9PT1jJiYoYz0wKTt2YXIgZD1RYy5hbGxvYygpO2QucmVzZXQoKTtkLnJvdGF0ZShhLGIsYyk7dGhpcy50cmFuc2Zvcm0oZC5tMTEsZC5tMTIsZC5tMjEsZC5tMjIsZC5keCxkLmR5KTtRYy5mcmVlKGQpO3JldHVybiB0aGlzO307dD0kZC5wcm90b3R5cGU7dC50cmFuc2Zvcm09ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgY2U6Y2FzZSBrZTpjYXNlIGxlOnZhciBnPXRoaXMuYWQ7dmFyIGg9dGhpcy5iZDt0aGlzLmFkPWcqYStoKmMrZTt0aGlzLmJkPWcqYitoKmQrZjtnPXRoaXMubWM7aD10aGlzLkJjO3RoaXMubWM9ZyphK2gqYytlO3RoaXMuQmM9ZypiK2gqZCtmO2JyZWFrO2Nhc2UgYWU6Zm9yKHZhciBrPXRoaXMuZmlndXJlcy5qLGw9ay5sZW5ndGgsbT0wO208bDttKyspe3ZhciBuPWtbbV07Zz1uLnN0YXJ0WDtoPW4uc3RhcnRZO24uc3RhcnRYPWcqYStoKmMrZTtuLnN0YXJ0WT1nKmIraCpkK2Y7bj1uLnNlZ21lbnRzLmo7Zm9yKHZhciBwPW4ubGVuZ3RoLHE9MDtxPHA7cSsrKXt2YXIgcj1uW3FdO3N3aXRjaChyLnR5cGUpe2Nhc2UgaWU6Y2FzZSB6ZTpnPXIuZW5kWDtoPXIuZW5kWTtyLmVuZFg9ZyphK2gqYytlO3IuZW5kWT1nKmIraCpkK2Y7YnJlYWs7Y2FzZSBBZTpnPXIucG9pbnQxWDtoPXIucG9pbnQxWTtyLnBvaW50MVg9ZyphK2gqYytlO3IucG9pbnQxWT1nKmIraCpkK2Y7Zz1yLnBvaW50Mlg7aD1yLnBvaW50Mlk7ci5wb2ludDJYPWcqYStoKmMrZTtyLnBvaW50Mlk9ZypiK2gqZCtmO2c9ci5lbmRYO2g9ci5lbmRZO3IuZW5kWD1nKmEraCpjK2U7ci5lbmRZPWcqYitoKmQrZjticmVhaztjYXNlIEJlOmc9ci5wb2ludDFYO2g9ci5wb2ludDFZO3IucG9pbnQxWD1nKmEraCpjK2U7ci5wb2ludDFZPWcqYitoKmQrZjtnPXIuZW5kWDtoPXIuZW5kWTtyLmVuZFg9ZyphK2gqYytlO3IuZW5kWT1nKmIraCpkK2Y7YnJlYWs7Y2FzZSBDZTpnPXIuY2VudGVyWDtoPXIuY2VudGVyWTtyLmNlbnRlclg9ZyphK2gqYytlO3IuY2VudGVyWT1nKmIraCpkK2Y7MCE9PWImJihnPTE4MCpNYXRoLmF0YW4yKGIsYSkvTWF0aC5QSSwwPmcmJihnKz0zNjApLHIuc3RhcnRBbmdsZSs9Zyk7MD5hJiYoci5zdGFydEFuZ2xlPTE4MC1yLnN0YXJ0QW5nbGUsci5zd2VlcEFuZ2xlPS1yLnN3ZWVwQW5nbGUpOzA+ZCYmKHIuc3RhcnRBbmdsZT0tci5zdGFydEFuZ2xlLHIuc3dlZXBBbmdsZT0tci5zd2VlcEFuZ2xlKTtyLnJhZGl1c1gqPU1hdGguc3FydChhKmErYypjKTt2b2lkIDAhPT1yLnJhZGl1c1kmJihyLnJhZGl1c1kqPU1hdGguc3FydChiKmIrZCpkKSk7YnJlYWs7Y2FzZSBEZTpnPXIuZW5kWDtoPXIuZW5kWTtyLmVuZFg9ZyphK2gqYytlO3IuZW5kWT1nKmIraCpkK2Y7MCE9PWImJihnPTE4MCpNYXRoLmF0YW4yKGIsYSkvTWF0aC5QSSwwPmcmJihnKz0zNjApLHIueEF4aXNSb3RhdGlvbis9Zyk7MD5hJiYoci54QXhpc1JvdGF0aW9uPTE4MC1yLnhBeGlzUm90YXRpb24sci5pc0Nsb2Nrd2lzZUFyYz0hci5pc0Nsb2Nrd2lzZUFyYyk7MD5kJiYoci54QXhpc1JvdGF0aW9uPS1yLnhBeGlzUm90YXRpb24sci5pc0Nsb2Nrd2lzZUFyYz0hci5pc0Nsb2Nrd2lzZUFyYyk7ci5yYWRpdXNYKj1NYXRoLnNxcnQoYSphK2MqYyk7ci5yYWRpdXNZKj1NYXRoLnNxcnQoYipiK2QqZCk7YnJlYWs7ZGVmYXVsdDpBKCJVbmtub3duIFNlZ21lbnQgdHlwZTogIityLnR5cGUpO319fX10aGlzLnJhPSEwO3JldHVybiB0aGlzO307dC5lYT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1hLng7YT1hLnk7Zm9yKHZhciBmPXRoaXMuYm91bmRzLngtMjAsZz0wLGgsayxsLG0sbixwPXRoaXMuZmlndXJlcy5qLHE9cC5sZW5ndGgscj0wO3I8cTtyKyspe3ZhciB1PXBbcl07aWYodS5pc0ZpbGxlZCl7aWYoYyYmdS5lYShlLGEsYikpcmV0dXJuITA7dmFyIHg9dS5zZWdtZW50cztoPXUuc3RhcnRYO2s9dS5zdGFydFk7Zm9yKHZhciB2PWgseT1rLHo9eC5qLEI9MDtCPD14Lmxlbmd0aDtCKyspe3ZhciBDPXZvaWQgMDtpZihCIT09eC5sZW5ndGgpe0M9eltCXTt2YXIgST1DLnR5cGU7bT1DLmVuZFg7bj1DLmVuZFk7fWVsc2UgST1pZSxtPXYsbj15O3N3aXRjaChJKXtjYXNlIHplOnY9R2UoZSxhLGYsYSxoLGssdix5KTtpZihpc05hTih2KSlyZXR1cm4hMDtnKz12O3Y9bTt5PW47YnJlYWs7Y2FzZSBpZTpoPUdlKGUsYSxmLGEsaCxrLG0sbik7aWYoaXNOYU4oaCkpcmV0dXJuITA7Zys9aDticmVhaztjYXNlIEFlOmw9SC5OcChoLGssQy5wb2ludDFYLEMucG9pbnQxWSxDLnBvaW50MlgsQy5wb2ludDJZLG0sbixmLGEsZSxhLC41KTtnKz1sO2JyZWFrO2Nhc2UgQmU6bD1ILk5wKGgsaywoaCsyKkMucG9pbnQxWCkvMywoaysyKkMucG9pbnQxWSkvMywoMipDLnBvaW50MVgrbSkvMywoMipDLnBvaW50MVkrbikvMyxtLG4sZixhLGUsYSwuNSk7Zys9bDticmVhaztjYXNlIENlOmNhc2UgRGU6ST1DLnR5cGU9PT1DZT9FZShDLHUpOkZlKEMsdSxoLGspO3ZhciBKPUkubGVuZ3RoO2lmKDA9PT1KKXtoPUdlKGUsYSxmLGEsaCxrLEMuY2VudGVyWCxDLmNlbnRlclkpO2lmKGlzTmFOKGgpKXJldHVybiEwO2crPWg7YnJlYWs7fUM9bnVsbDtmb3IodmFyIEw9MDtMPEo7TCsrKXtDPUlbTF07aWYoMD09PUwpe2w9R2UoZSxhLGYsYSxoLGssQ1swXSxDWzFdKTtpZihpc05hTihsKSlyZXR1cm4hMDtnKz1sO31sPUguTnAoQ1swXSxDWzFdLENbMl0sQ1szXSxDWzRdLENbNV0sQ1s2XSxDWzddLGYsYSxlLGEsLjUpO2crPWw7fW51bGwhPT1DJiYobT1DWzZdLG49Q1s3XSk7YnJlYWs7ZGVmYXVsdDpBKCJVbmtub3duIFNlZ21lbnQgdHlwZTogIitDLnR5cGUpO31oPW07az1uO31pZigwIT09ZylyZXR1cm4hMDtnPTA7fWVsc2UgaWYodS5lYShlLGEsZD9iOmIrMikpcmV0dXJuITA7fXJldHVybiAwIT09Zzt9O2Z1bmN0aW9uIEdlKGEsYixjLGQsZSxmLGcsaCl7aWYoSC5VYihlLGYsZyxoLC4wNSxhLGIpKXJldHVybiBOYU47dmFyIGs9KGEtYykqKGYtaCk7aWYoMD09PWspcmV0dXJuIDA7dmFyIGw9KChhKmQtYipjKSooZS1nKS0oYS1jKSooZSpoLWYqZykpL2s7Yj0oYSpkLWIqYykqKGYtaCkvaztpZihsPj1hKXJldHVybiAwO2lmKChlPmc/ZS1nOmctZSk8KGY+aD9mLWg6aC1mKSl7aWYoZjxoKXtpZihiPGZ8fGI+aClyZXR1cm4gMDt9ZWxzZXtpZihiPGh8fGI+ZilyZXR1cm4gMDt9fWVsc2UgaWYoZTxnKXtpZihsPGV8fGw+ZylyZXR1cm4gMDt9ZWxzZSBpZihsPGd8fGw+ZSlyZXR1cm4gMDtyZXR1cm4gMDxrPzE6LTE7fWZ1bmN0aW9uIEhlKGEsYixjLGQpe2E9YS5maWd1cmVzLmo7Zm9yKHZhciBlPWEubGVuZ3RoLGY9MDtmPGU7ZisrKXtpZihhW2ZdLmVhKGIsYyxkKSlyZXR1cm4hMDt9cmV0dXJuITE7fXQuY3Y9ZnVuY3Rpb24oYSxiKXswPmE/YT0wOjE8YSYmKGE9MSk7dm9pZCAwPT09YiYmKGI9bmV3IEcoKSk7aWYodGhpcy50eXBlPT09Y2UpcmV0dXJuIGIuaCh0aGlzLnN0YXJ0WCthKih0aGlzLmVuZFgtdGhpcy5zdGFydFgpLHRoaXMuc3RhcnRZK2EqKHRoaXMuZW5kWS10aGlzLnN0YXJ0WSkpLGI7Zm9yKHZhciBjPXRoaXMuZmxhdHRlbmVkU2VnbWVudHMsZD10aGlzLmZsYXR0ZW5lZExlbmd0aHMsZT1jLmxlbmd0aCxmPXRoaXMuZmxhdHRlbmVkVG90YWxMZW5ndGgqYSxnPTAsaD0wO2g8ZTtoKyspe3ZhciBrPWRbaF0sbD1rLmxlbmd0aDtmb3IoYT0wO2E8bDthKyspe3ZhciBtPWtbYV07aWYoZyttPj1mKXJldHVybiBkPShmLWcpL20sYz1jW2hdLGU9Y1syKmFdLGg9Y1syKmErMV0sYi5oKGUrKGNbMiphKzJdLWUpKmQsaCsoY1syKmErM10taCkqZCksYjtnKz1tO319Yi5oKE5hTixOYU4pO3JldHVybiBiO307dC5teD1mdW5jdGlvbihhKXtpZih0aGlzLnR5cGU9PT1jZSl7dmFyIGI9dGhpcy5zdGFydFgsYz10aGlzLnN0YXJ0WSxkPXRoaXMuZW5kWCxlPXRoaXMuZW5kWTtpZihiIT09ZHx8YyE9PWUpe3ZhciBmPWEueDthPWEueTtpZihiPT09ZCl7aWYoYzxlKXt2YXIgZz1jO2Q9ZTt9ZWxzZSBnPWUsZD1jO3JldHVybiBhPD1nP2c9PT1jPzA6MTphPj1kP2Q9PT1jPzA6MTpNYXRoLmFicyhhLWMpLyhkLWcpO31yZXR1cm4gYz09PWU/KGI8ZD9nPWI6KGc9ZCxkPWIpLGY8PWc/Zz09PWI/MDoxOmY+PWQ/ZD09PWI/MDoxOk1hdGguYWJzKGYtYikvKGQtZykpOigoZi1iKSooZi1iKSsoYS1jKSooYS1jKSkvKChkLWIpKihkLWIpKyhlLWMpKihlLWMpKTt9fWVsc2UgaWYodGhpcy50eXBlPT09a2Upe2c9dGhpcy5zdGFydFg7dmFyIGg9dGhpcy5zdGFydFksaz10aGlzLmVuZFg7ZT10aGlzLmVuZFk7aWYoZyE9PWt8fGghPT1lKXtiPWstZztjPWUtaDtmPTIqYisyKmM7ZD1hLng7YT1hLnk7ZD1NYXRoLm1pbihNYXRoLm1heChkLGcpLGspO2E9TWF0aC5taW4oTWF0aC5tYXgoYSxoKSxlKTtnPU1hdGguYWJzKGQtZyk7az1NYXRoLmFicyhkLWspO2g9TWF0aC5hYnMoYS1oKTtlPU1hdGguYWJzKGEtZSk7dmFyIGw9TWF0aC5taW4oZyxrLGgsZSk7aWYobD09PWgpcmV0dXJuIGQvZjtpZihsPT09aylyZXR1cm4oYithKS9mO2lmKGw9PT1lKXJldHVybigyKmIrYy1kKS9mO2lmKGw9PT1nKXJldHVybigyKmIrMipjLWEpL2Y7fX1lbHNle2I9dGhpcy5mbGF0dGVuZWRTZWdtZW50cztjPXRoaXMuZmxhdHRlbmVkTGVuZ3RocztmPXRoaXMuZmxhdHRlbmVkVG90YWxMZW5ndGg7ZD1HLmFsbG9jKCk7ZT1JbmZpbml0eTtoPWc9MDtrPWIubGVuZ3RoO2Zvcih2YXIgbT1sPTAsbj0wO248aztuKyspe2Zvcih2YXIgcD1iW25dLHE9Y1tuXSxyPXAubGVuZ3RoLHU9MDt1PHI7dSs9Mil7dmFyIHg9cFt1XSx2PXBbdSsxXTtpZigwIT09dSl7SC5RaShsLG0seCx2LGEueCxhLnksZCk7dmFyIHk9KGQueC1hLngpKihkLngtYS54KSsoZC55LWEueSkqKGQueS1hLnkpO3k8ZSYmKGU9eSxnPWgsZys9TWF0aC5zcXJ0KChkLngtbCkqKGQueC1sKSsoZC55LW0pKihkLnktbSkpKTtoKz1xWyh1LTIpLzJdO31sPXg7bT12O319Ry5mcmVlKGQpO2E9Zy9mO3JldHVybiAwPmE/MDoxPGE/MTphO31yZXR1cm4gMDt9O2Z1bmN0aW9uIFRlKGEpe2lmKG51bGw9PT1hLnhrKXt2YXIgYj1hLnhrPVtdLGM9YS5ObT1bXSxkPVtdLGU9W107aWYoYS50eXBlPT09Y2UpZC5wdXNoKGEuc3RhcnRYKSxkLnB1c2goYS5zdGFydFkpLGQucHVzaChhLmVuZFgpLGQucHVzaChhLmVuZFkpLGIucHVzaChkKSxlLnB1c2goTWF0aC5zcXJ0KChhLnN0YXJ0WC1hLmVuZFgpKihhLnN0YXJ0WC1hLmVuZFgpKyhhLnN0YXJ0WS1hLmVuZFkpKihhLnN0YXJ0WS1hLmVuZFkpKSksYy5wdXNoKGUpO2Vsc2UgaWYoYS50eXBlPT09a2UpZC5wdXNoKGEuc3RhcnRYKSxkLnB1c2goYS5zdGFydFkpLGQucHVzaChhLmVuZFgpLGQucHVzaChhLnN0YXJ0WSksZC5wdXNoKGEuZW5kWCksZC5wdXNoKGEuZW5kWSksZC5wdXNoKGEuc3RhcnRYKSxkLnB1c2goYS5lbmRZKSxkLnB1c2goYS5zdGFydFgpLGQucHVzaChhLnN0YXJ0WSksYi5wdXNoKGQpLGUucHVzaChNYXRoLmFicyhhLnN0YXJ0WC1hLmVuZFgpKSxlLnB1c2goTWF0aC5hYnMoYS5zdGFydFktYS5lbmRZKSksZS5wdXNoKE1hdGguYWJzKGEuc3RhcnRYLWEuZW5kWCkpLGUucHVzaChNYXRoLmFicyhhLnN0YXJ0WS1hLmVuZFkpKSxjLnB1c2goZSk7ZWxzZSBpZihhLnR5cGU9PT1sZSl7dmFyIGY9bmV3IFVlKCk7Zi5zdGFydFg9YS5lbmRYO2Yuc3RhcnRZPShhLnN0YXJ0WSthLmVuZFkpLzI7dmFyIGc9bmV3IFZlKENlKTtnLnN0YXJ0QW5nbGU9MDtnLnN3ZWVwQW5nbGU9MzYwO2cuY2VudGVyWD0oYS5zdGFydFgrYS5lbmRYKS8yO2cuY2VudGVyWT0oYS5zdGFydFkrYS5lbmRZKS8yO2cucmFkaXVzWD1NYXRoLmFicyhhLnN0YXJ0WC1hLmVuZFgpLzI7Zy5yYWRpdXNZPU1hdGguYWJzKGEuc3RhcnRZLWEuZW5kWSkvMjtmLmFkZChnKTthPUVlKGcsZik7ZT1hLmxlbmd0aDtpZigwPT09ZSlkLnB1c2goZy5jZW50ZXJYKSxkLnB1c2goZy5jZW50ZXJZKTtlbHNle2c9Zi5zdGFydFg7Zj1mLnN0YXJ0WTtmb3IodmFyIGg9MDtoPGU7aCsrKXt2YXIgaz1hW2hdO0guemUoZyxmLGtbMl0sa1szXSxrWzRdLGtbNV0sa1s2XSxrWzddLC41LGQpO2c9a1s2XTtmPWtbN107fX1iLnB1c2goZCk7Yy5wdXNoKFdlKGQpKTt9ZWxzZSBmb3IoYT1hLmZpZ3VyZXMuaXRlcmF0b3I7YS5uZXh0KCk7KXtlPWEudmFsdWU7ZD1bXTtkLnB1c2goZS5zdGFydFgpO2QucHVzaChlLnN0YXJ0WSk7Zz1lLnN0YXJ0WDtmPWUuc3RhcnRZO2g9ZztrPWY7Zm9yKHZhciBsPWUuc2VnbWVudHMuaixtPWwubGVuZ3RoLG49MDtuPG07bisrKXt2YXIgcD1sW25dO3N3aXRjaChwLnR5cGUpe2Nhc2UgemU6NDw9ZC5sZW5ndGgmJihiLnB1c2goZCksYy5wdXNoKFdlKGQpKSk7ZD1bXTtkLnB1c2gocC5lbmRYKTtkLnB1c2gocC5lbmRZKTtnPXAuZW5kWDtmPXAuZW5kWTtoPWc7az1mO2JyZWFrO2Nhc2UgaWU6ZC5wdXNoKHAuZW5kWCk7ZC5wdXNoKHAuZW5kWSk7Zz1wLmVuZFg7Zj1wLmVuZFk7YnJlYWs7Y2FzZSBBZTpILnplKGcsZixwLnBvaW50MVgscC5wb2ludDFZLHAucG9pbnQyWCxwLnBvaW50MlkscC5lbmRYLHAuZW5kWSwuNSxkKTtnPXAuZW5kWDtmPXAuZW5kWTticmVhaztjYXNlIEJlOkguanEoZyxmLHAucG9pbnQxWCxwLnBvaW50MVkscC5lbmRYLHAuZW5kWSwuNSxkKTtnPXAuZW5kWDtmPXAuZW5kWTticmVhaztjYXNlIENlOnZhciBxPUVlKHAsZSkscj1xLmxlbmd0aDtpZigwPT09cil7ZC5wdXNoKHAuY2VudGVyWCk7ZC5wdXNoKHAuY2VudGVyWSk7Zz1wLmNlbnRlclg7Zj1wLmNlbnRlclk7YnJlYWs7fWZvcih2YXIgdT0wO3U8cjt1Kyspe3ZhciB4PXFbdV07SC56ZShnLGYseFsyXSx4WzNdLHhbNF0seFs1XSx4WzZdLHhbN10sLjUsZCk7Zz14WzZdO2Y9eFs3XTt9YnJlYWs7Y2FzZSBEZTpxPUZlKHAsZSxnLGYpO3I9cS5sZW5ndGg7aWYoMD09PXIpe2QucHVzaChwLmNlbnRlclgpO2QucHVzaChwLmNlbnRlclkpO2c9cC5jZW50ZXJYO2Y9cC5jZW50ZXJZO2JyZWFrO31mb3IodT0wO3U8cjt1Kyspe3g9cVt1XSxILnplKGcsZix4WzJdLHhbM10seFs0XSx4WzVdLHhbNl0seFs3XSwuNSxkKSxnPXhbNl0sZj14WzddO31icmVhaztkZWZhdWx0OkEoIlNlZ21lbnQgbm90IG9mIHZhbGlkIHR5cGU6ICIrcC50eXBlKTt9cC5pc0Nsb3NlZCYmKGQucHVzaChoKSxkLnB1c2goaykpO300PD1kLmxlbmd0aCYmKGIucHVzaChkKSxjLnB1c2goV2UoZCkpKTt9fX1mdW5jdGlvbiBXZShhKXtmb3IodmFyIGI9W10sYz0wLGQ9MCxlPWEubGVuZ3RoLGY9MDtmPGU7Zis9Mil7dmFyIGc9YVtmXSxoPWFbZisxXTswIT09ZiYmYi5wdXNoKE1hdGguc3FydChTYihjLGQsZyxoKSkpO2M9ZztkPWg7fXJldHVybiBiO310LmFkZD1mdW5jdGlvbihhKXt0aGlzLmdqLmFkZChhKTtyZXR1cm4gdGhpczt9O3QueG09ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXt0aGlzLnYmJndhKHRoaXMpO3RoaXMuYmY9bmV3IE8oYSxiLGUsZikuZnJlZXplKCk7dGhpcy5jZj1uZXcgTyhjLGQsZyxoKS5mcmVlemUoKTtyZXR1cm4gdGhpczt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCRkLnByb3RvdHlwZSx7ZmxhdHRlbmVkU2VnbWVudHM6e2dldDpmdW5jdGlvbiBnZXQoKXtUZSh0aGlzKTtyZXR1cm4gdGhpcy54azt9fSxmbGF0dGVuZWRMZW5ndGhzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7VGUodGhpcyk7cmV0dXJuIHRoaXMuTm07fX0sZmxhdHRlbmVkVG90YWxMZW5ndGg6e2dldDpmdW5jdGlvbiBnZXQoKXt2YXIgYT10aGlzLk9tO2lmKGlzTmFOKGEpKXtpZih0aGlzLnR5cGU9PT1jZSl7YT1NYXRoLmFicyh0aGlzLmVuZFgtdGhpcy5zdGFydFgpO3ZhciBiPU1hdGguYWJzKHRoaXMuZW5kWS10aGlzLnN0YXJ0WSk7YT1NYXRoLnNxcnQoYSphK2IqYik7fWVsc2UgaWYodGhpcy50eXBlPT09a2UpYT0yKk1hdGguYWJzKHRoaXMuZW5kWC10aGlzLnN0YXJ0WCkrMipNYXRoLmFicyh0aGlzLmVuZFktdGhpcy5zdGFydFkpO2Vsc2V7Yj10aGlzLmZsYXR0ZW5lZExlbmd0aHM7Zm9yKHZhciBjPWIubGVuZ3RoLGQ9YT0wO2Q8YztkKyspe2Zvcih2YXIgZT1iW2RdLGY9ZS5sZW5ndGgsZz0wO2c8ZjtnKyspe2ErPWVbZ107fX19dGhpcy5PbT1hO31yZXR1cm4gYTt9fSx0eXBlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudmE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudmEhPT1hJiYodGhpcy52JiZ3YSh0aGlzLGEpLHRoaXMudmE9YSx0aGlzLnJhPSEwKTt9fSxzdGFydFg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5hZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5hZCE9PWEmJih0aGlzLnYmJndhKHRoaXMsYSksdGhpcy5hZD1hLHRoaXMucmE9ITApO319LHN0YXJ0WTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmJkO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmJkIT09YSYmKHRoaXMudiYmd2EodGhpcyxhKSx0aGlzLmJkPWEsdGhpcy5yYT0hMCk7fX0sZW5kWDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLm1jO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLm1jIT09YSYmKHRoaXMudiYmd2EodGhpcyxhKSx0aGlzLm1jPWEsdGhpcy5yYT0hMCk7fX0sZW5kWTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkJjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkJjIT09YSYmKHRoaXMudiYmd2EodGhpcyxhKSx0aGlzLkJjPWEsdGhpcy5yYT0hMCk7fX0sZmlndXJlczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmdqO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmdqIT09YSYmKHRoaXMudiYmd2EodGhpcyxhKSx0aGlzLmdqPWEsdGhpcy5yYT0hMCk7fX0sc3BvdDE6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5iZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMuYmY9YS5JKCk7fX0sc3BvdDI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5jZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMuY2Y9YS5JKCk7fX0sZGVmYXVsdFN0cmV0Y2g6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5EZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMuRGY9YTt9fSxib3VuZHM6e2dldDpmdW5jdGlvbiBnZXQoKXt0aGlzLmx2KCkmJnRoaXMuY29tcHV0ZUJvdW5kcygpO3JldHVybiB0aGlzLlFxO319fSk7JGQucHJvdG90eXBlLnNldFNwb3RzPSRkLnByb3RvdHlwZS54bTskZC5wcm90b3R5cGUuYWRkPSRkLnByb3RvdHlwZS5hZGQ7JGQucHJvdG90eXBlLmdldEZyYWN0aW9uRm9yUG9pbnQ9JGQucHJvdG90eXBlLm14OyRkLnByb3RvdHlwZS5nZXRQb2ludEFsb25nUGF0aD0kZC5wcm90b3R5cGUuY3Y7JGQucHJvdG90eXBlLnRyYW5zZm9ybT0kZC5wcm90b3R5cGUudHJhbnNmb3JtOyRkLnByb3RvdHlwZS5yb3RhdGU9JGQucHJvdG90eXBlLnJvdGF0ZTskZC5wcm90b3R5cGUuc2NhbGU9JGQucHJvdG90eXBlLnNjYWxlOyRkLnByb3RvdHlwZS5vZmZzZXQ9JGQucHJvdG90eXBlLm9mZnNldDskZC5wcm90b3R5cGUubm9ybWFsaXplPSRkLnByb3RvdHlwZS5ub3JtYWxpemU7JGQucHJvdG90eXBlLmNvbXB1dGVCb3VuZHNXaXRob3V0T3JpZ2luPSRkLnByb3RvdHlwZS4kdzskZC5wcm90b3R5cGUuZXF1YWxzQXBwcm94PSRkLnByb3RvdHlwZS5RYTt2YXIgY2U9bmV3IEQoJGQsIkxpbmUiLDApLGtlPW5ldyBEKCRkLCJSZWN0YW5nbGUiLDEpLGxlPW5ldyBEKCRkLCJFbGxpcHNlIiwyKSxhZT1uZXcgRCgkZCwiUGF0aCIsMyk7JGQuY2xhc3NOYW1lPSJHZW9tZXRyeSI7JGQuc3RyaW5naWZ5PWplOyRkLmZpbGxQYXRoPWZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgvW1h4XS8pO2Zvcih2YXIgYj1hLmxlbmd0aCxjPSIiLGQ9MDtkPGI7ZCsrKXt2YXIgZT1hW2RdO2M9bnVsbCE9PWUubWF0Y2goL1tGZl0vKT8wPT09ZD9jK2U6YysoIlgiKygiICI9PT1lWzBdPyIiOiIgIikrZSk6YysoKDA9PT1kPyIiOiJYICIpKyJGIisoIiAiPT09ZVswXT8iIjoiICIpK2UpO31yZXR1cm4gYzt9OyRkLnBhcnNlPW1lOyRkLkxpbmU9Y2U7JGQuUmVjdGFuZ2xlPWtlOyRkLkVsbGlwc2U9bGU7JGQuUGF0aD1hZTtmdW5jdGlvbiBVZShhLGIsYyxkKXttYih0aGlzKTt0aGlzLnY9ITE7dm9pZCAwPT09YyYmKGM9ITApO3RoaXMueXI9Yzt2b2lkIDA9PT1kJiYoZD0hMCk7dGhpcy5Dcj1kO3ZvaWQgMCE9PWE/dGhpcy5hZD1hOnRoaXMuYWQ9MDt2b2lkIDAhPT1iP3RoaXMuYmQ9Yjp0aGlzLmJkPTA7dGhpcy5CbD1uZXcgRSgpO3RoaXMuc3M9dGhpcy5CbC5CYTt0aGlzLnJhPSEwO31VZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3ZhciBhPW5ldyBVZSgpO2EueXI9dGhpcy55cjthLkNyPXRoaXMuQ3I7YS5hZD10aGlzLmFkO2EuYmQ9dGhpcy5iZDtmb3IodmFyIGI9dGhpcy5CbC5qLGM9Yi5sZW5ndGgsZD1hLkJsLGU9MDtlPGM7ZSsrKXt2YXIgZj1iW2VdLmNvcHkoKTtkLmFkZChmKTt9YS5zcz10aGlzLnNzO2EucmE9dGhpcy5yYTtyZXR1cm4gYTt9O3Q9VWUucHJvdG90eXBlO3QuUWE9ZnVuY3Rpb24oYSl7aWYoIShhIGluc3RhbmNlb2YgVWUmJkgudyh0aGlzLnN0YXJ0WCxhLnN0YXJ0WCkmJkgudyh0aGlzLnN0YXJ0WSxhLnN0YXJ0WSkpKXJldHVybiExO3ZhciBiPXRoaXMuc2VnbWVudHMuajthPWEuc2VnbWVudHMuajt2YXIgYz1iLmxlbmd0aDtpZihjIT09YS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBkPTA7ZDxjO2QrKyl7aWYoIWJbZF0uUWEoYVtkXSkpcmV0dXJuITE7fXJldHVybiEwO307dC50b1N0cmluZz1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT0tMSk7dmFyIGI9MD5hPyJNIit0aGlzLnN0YXJ0WC50b1N0cmluZygpKyIgIit0aGlzLnN0YXJ0WS50b1N0cmluZygpOiJNIit0aGlzLnN0YXJ0WC50b0ZpeGVkKGEpKyIgIit0aGlzLnN0YXJ0WS50b0ZpeGVkKGEpO2Zvcih2YXIgYz10aGlzLnNlZ21lbnRzLmosZD1jLmxlbmd0aCxlPTA7ZTxkO2UrKyl7Yis9IiAiK2NbZV0udG9TdHJpbmcoYSk7fXJldHVybiBiO307dC5mcmVlemU9ZnVuY3Rpb24oKXt0aGlzLnY9ITA7dmFyIGE9dGhpcy5zZWdtZW50czthLmZyZWV6ZSgpO3ZhciBiPWEuajthPWEubGVuZ3RoO2Zvcih2YXIgYz0wO2M8YTtjKyspe2JbY10uZnJlZXplKCk7fXJldHVybiB0aGlzO307dC5oYT1mdW5jdGlvbigpe3RoaXMudj0hMTt2YXIgYT10aGlzLnNlZ21lbnRzO2EuaGEoKTthPWEuajtmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe2FbY10uaGEoKTt9cmV0dXJuIHRoaXM7fTt0Lmx2PWZ1bmN0aW9uKCl7aWYodGhpcy5yYSlyZXR1cm4hMDt2YXIgYT10aGlzLnNlZ21lbnRzO2lmKHRoaXMuc3MhPT1hLkJhKXJldHVybiEwO2E9YS5qO2Zvcih2YXIgYj1hLmxlbmd0aCxjPTA7YzxiO2MrKyl7aWYoYVtjXS5yYSlyZXR1cm4hMDt9cmV0dXJuITE7fTt0LmFkZD1mdW5jdGlvbihhKXt0aGlzLkJsLmFkZChhKTtyZXR1cm4gdGhpczt9O3QuZWE9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD10aGlzLnN0YXJ0WCxlPXRoaXMuc3RhcnRZLGY9ZCxnPWUsaD10aGlzLnNlZ21lbnRzLmosaz1oLmxlbmd0aCxsPTA7bDxrO2wrKyl7dmFyIG09aFtsXTtzd2l0Y2gobS50eXBlKXtjYXNlIHplOmY9bS5lbmRYO2c9bS5lbmRZO2Q9bS5lbmRYO2U9bS5lbmRZO2JyZWFrO2Nhc2UgaWU6aWYoSC5VYihkLGUsbS5lbmRYLG0uZW5kWSxjLGEsYikpcmV0dXJuITA7ZD1tLmVuZFg7ZT1tLmVuZFk7YnJlYWs7Y2FzZSBBZTppZihILkpzKGQsZSxtLnBvaW50MVgsbS5wb2ludDFZLG0ucG9pbnQyWCxtLnBvaW50MlksbS5lbmRYLG0uZW5kWSwuNSxhLGIsYykpcmV0dXJuITA7ZD1tLmVuZFg7ZT1tLmVuZFk7YnJlYWs7Y2FzZSBCZTppZihILnV2KGQsZSxtLnBvaW50MVgsbS5wb2ludDFZLG0uZW5kWCxtLmVuZFksLjUsYSxiLGMpKXJldHVybiEwO2Q9bS5lbmRYO2U9bS5lbmRZO2JyZWFrO2Nhc2UgQ2U6Y2FzZSBEZTp2YXIgbj1tLnR5cGU9PT1DZT9FZShtLHRoaXMpOkZlKG0sdGhpcyxkLGUpLHA9bi5sZW5ndGg7aWYoMD09PXApe2lmKEguVWIoZCxlLG0uY2VudGVyWCxtLmNlbnRlclksYyxhLGIpKXJldHVybiEwO2Q9bS5jZW50ZXJYO2U9bS5jZW50ZXJZO2JyZWFrO31mb3IodmFyIHE9bnVsbCxyPTA7cjxwO3IrKyl7aWYocT1uW3JdLDA9PT1yJiZILlViKGQsZSxxWzBdLHFbMV0sYyxhLGIpfHxILkpzKHFbMF0scVsxXSxxWzJdLHFbM10scVs0XSxxWzVdLHFbNl0scVs3XSwuNSxhLGIsYykpcmV0dXJuITA7fW51bGwhPT1xJiYoZD1xWzZdLGU9cVs3XSk7YnJlYWs7ZGVmYXVsdDpBKCJVbmtub3duIFNlZ21lbnQgdHlwZTogIittLnR5cGUpO31pZihtLmlzQ2xvc2VkJiYoZCE9PWZ8fGUhPT1nKSYmSC5VYihkLGUsZixnLGMsYSxiKSlyZXR1cm4hMDt9cmV0dXJuITE7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhVZS5wcm90b3R5cGUse2lzRmlsbGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMueXI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLnlyPWE7fX0saXNTaGFkb3dlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkNyO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnYmJndhKHRoaXMsYSk7dGhpcy5Dcj1hO319LHN0YXJ0WDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmFkO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnYmJndhKHRoaXMsYSk7dGhpcy5hZD1hO3RoaXMucmE9ITA7fX0sc3RhcnRZOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYmQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLmJkPWE7dGhpcy5yYT0hMDt9fSxzZWdtZW50czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkJsO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnYmJndhKHRoaXMsYSk7dGhpcy5CbD1hO3RoaXMucmE9ITA7fX19KTtVZS5wcm90b3R5cGUuYWRkPVVlLnByb3RvdHlwZS5hZGQ7VWUucHJvdG90eXBlLmVxdWFsc0FwcHJveD1VZS5wcm90b3R5cGUuUWE7VWUuY2xhc3NOYW1lPSJQYXRoRmlndXJlIjtmdW5jdGlvbiBWZShhLGIsYyxkLGUsZixnLGgpe21iKHRoaXMpO3RoaXMudj0hMTt2b2lkIDA9PT1hJiYoYT1pZSk7dGhpcy52YT1hO3ZvaWQgMCE9PWI/dGhpcy5tYz1iOnRoaXMubWM9MDt2b2lkIDAhPT1jP3RoaXMuQmM9Yzp0aGlzLkJjPTA7dm9pZCAwPT09ZCYmKGQ9MCk7dm9pZCAwPT09ZSYmKGU9MCk7dm9pZCAwPT09ZiYmKGY9MCk7dm9pZCAwPT09ZyYmKGc9MCk7YT09PURlPyhhPWYlMzYwLDA+YSYmKGErPTM2MCksdGhpcy5zZT1hLHRoaXMubWk9MCx0aGlzLm5pPU1hdGgubWF4KGQsMCksdGhpcy5aZz1NYXRoLm1heChlLDApLHRoaXMuaWw9ImJvb2xlYW4iPT09dHlwZW9mIGc/ISFnOiExLHRoaXMuRWs9ISFoKToodGhpcy5zZT1kLHRoaXMubWk9ZSxhPT09Q2UmJihmPU1hdGgubWF4KGYsMCkpLHRoaXMubmk9ZiwibnVtYmVyIj09PXR5cGVvZiBnPyhhPT09Q2UmJihnPU1hdGgubWF4KGcsMCkpLHRoaXMuWmc9Zyk6dGhpcy5aZz0wLHRoaXMuRWs9dGhpcy5pbD0hMSk7dGhpcy5saj0hMTt0aGlzLnJhPSEwO3RoaXMuS2U9bnVsbDt9VmUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVmUoKTthLnZhPXRoaXMudmE7YS5tYz10aGlzLm1jO2EuQmM9dGhpcy5CYzthLnNlPXRoaXMuc2U7YS5taT10aGlzLm1pO2Eubmk9dGhpcy5uaTthLlpnPXRoaXMuWmc7YS5pbD10aGlzLmlsO2EuRWs9dGhpcy5FazthLmxqPXRoaXMubGo7YS5yYT10aGlzLnJhO3JldHVybiBhO307dD1WZS5wcm90b3R5cGU7dC5RYT1mdW5jdGlvbihhKXtpZighKGEgaW5zdGFuY2VvZiBWZSl8fHRoaXMudHlwZSE9PWEudHlwZXx8dGhpcy5pc0Nsb3NlZCE9PWEuaXNDbG9zZWQpcmV0dXJuITE7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSB6ZTpjYXNlIGllOnJldHVybiBILncodGhpcy5lbmRYLGEuZW5kWCkmJkgudyh0aGlzLmVuZFksYS5lbmRZKTtjYXNlIEFlOnJldHVybiBILncodGhpcy5lbmRYLGEuZW5kWCkmJkgudyh0aGlzLmVuZFksYS5lbmRZKSYmSC53KHRoaXMucG9pbnQxWCxhLnBvaW50MVgpJiZILncodGhpcy5wb2ludDFZLGEucG9pbnQxWSkmJkgudyh0aGlzLnBvaW50MlgsYS5wb2ludDJYKSYmSC53KHRoaXMucG9pbnQyWSxhLnBvaW50MlkpO2Nhc2UgQmU6cmV0dXJuIEgudyh0aGlzLmVuZFgsYS5lbmRYKSYmSC53KHRoaXMuZW5kWSxhLmVuZFkpJiZILncodGhpcy5wb2ludDFYLGEucG9pbnQxWCkmJkgudyh0aGlzLnBvaW50MVksYS5wb2ludDFZKTtjYXNlIENlOnJldHVybiBILncodGhpcy5zdGFydEFuZ2xlLGEuc3RhcnRBbmdsZSkmJkgudyh0aGlzLnN3ZWVwQW5nbGUsYS5zd2VlcEFuZ2xlKSYmSC53KHRoaXMuY2VudGVyWCxhLmNlbnRlclgpJiZILncodGhpcy5jZW50ZXJZLGEuY2VudGVyWSkmJkgudyh0aGlzLnJhZGl1c1gsYS5yYWRpdXNYKSYmSC53KHRoaXMucmFkaXVzWSxhLnJhZGl1c1kpO2Nhc2UgRGU6cmV0dXJuIHRoaXMuaXNDbG9ja3dpc2VBcmM9PT1hLmlzQ2xvY2t3aXNlQXJjJiZ0aGlzLmlzTGFyZ2VBcmM9PT1hLmlzTGFyZ2VBcmMmJkgudyh0aGlzLnhBeGlzUm90YXRpb24sYS54QXhpc1JvdGF0aW9uKSYmSC53KHRoaXMuZW5kWCxhLmVuZFgpJiZILncodGhpcy5lbmRZLGEuZW5kWSkmJkgudyh0aGlzLnJhZGl1c1gsYS5yYWRpdXNYKSYmSC53KHRoaXMucmFkaXVzWSxhLnJhZGl1c1kpO2RlZmF1bHQ6cmV0dXJuITE7fX07dC5mYj1mdW5jdGlvbihhKXthLmNsYXNzVHlwZT09PVZlJiYodGhpcy50eXBlPWEpO307dC50b1N0cmluZz1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT0tMSk7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSB6ZTphPTA+YT8iTSIrdGhpcy5lbmRYLnRvU3RyaW5nKCkrIiAiK3RoaXMuZW5kWS50b1N0cmluZygpOiJNIit0aGlzLmVuZFgudG9GaXhlZChhKSsiICIrdGhpcy5lbmRZLnRvRml4ZWQoYSk7YnJlYWs7Y2FzZSBpZTphPTA+YT8iTCIrdGhpcy5lbmRYLnRvU3RyaW5nKCkrIiAiK3RoaXMuZW5kWS50b1N0cmluZygpOiJMIit0aGlzLmVuZFgudG9GaXhlZChhKSsiICIrdGhpcy5lbmRZLnRvRml4ZWQoYSk7YnJlYWs7Y2FzZSBBZTphPTA+YT8iQyIrdGhpcy5wb2ludDFYLnRvU3RyaW5nKCkrIiAiK3RoaXMucG9pbnQxWS50b1N0cmluZygpKyIgIit0aGlzLnBvaW50MlgudG9TdHJpbmcoKSsiICIrdGhpcy5wb2ludDJZLnRvU3RyaW5nKCkrIiAiK3RoaXMuZW5kWC50b1N0cmluZygpKyIgIit0aGlzLmVuZFkudG9TdHJpbmcoKToiQyIrdGhpcy5wb2ludDFYLnRvRml4ZWQoYSkrIiAiK3RoaXMucG9pbnQxWS50b0ZpeGVkKGEpKyIgIit0aGlzLnBvaW50MlgudG9GaXhlZChhKSsiICIrdGhpcy5wb2ludDJZLnRvRml4ZWQoYSkrIiAiK3RoaXMuZW5kWC50b0ZpeGVkKGEpKyIgIit0aGlzLmVuZFkudG9GaXhlZChhKTticmVhaztjYXNlIEJlOmE9MD5hPyJRIit0aGlzLnBvaW50MVgudG9TdHJpbmcoKSsiICIrdGhpcy5wb2ludDFZLnRvU3RyaW5nKCkrIiAiK3RoaXMuZW5kWC50b1N0cmluZygpKyIgIit0aGlzLmVuZFkudG9TdHJpbmcoKToiUSIrdGhpcy5wb2ludDFYLnRvRml4ZWQoYSkrIiAiK3RoaXMucG9pbnQxWS50b0ZpeGVkKGEpKyIgIit0aGlzLmVuZFgudG9GaXhlZChhKSsiICIrdGhpcy5lbmRZLnRvRml4ZWQoYSk7YnJlYWs7Y2FzZSBDZTphPTA+YT8iQiIrdGhpcy5zdGFydEFuZ2xlLnRvU3RyaW5nKCkrIiAiK3RoaXMuc3dlZXBBbmdsZS50b1N0cmluZygpKyIgIit0aGlzLmNlbnRlclgudG9TdHJpbmcoKSsiICIrdGhpcy5jZW50ZXJZLnRvU3RyaW5nKCkrIiAiK3RoaXMucmFkaXVzWC50b1N0cmluZygpKyIgIit0aGlzLnJhZGl1c1kudG9TdHJpbmcoKToiQiIrdGhpcy5zdGFydEFuZ2xlLnRvRml4ZWQoYSkrIiAiK3RoaXMuc3dlZXBBbmdsZS50b0ZpeGVkKGEpKyIgIit0aGlzLmNlbnRlclgudG9GaXhlZChhKSsiICIrdGhpcy5jZW50ZXJZLnRvRml4ZWQoYSkrIiAiK3RoaXMucmFkaXVzWC50b0ZpeGVkKGEpKyIgIit0aGlzLnJhZGl1c1kudG9GaXhlZChhKTticmVhaztjYXNlIERlOmE9MD5hPyJBIit0aGlzLnJhZGl1c1gudG9TdHJpbmcoKSsiICIrdGhpcy5yYWRpdXNZLnRvU3RyaW5nKCkrIiAiK3RoaXMueEF4aXNSb3RhdGlvbi50b1N0cmluZygpKyIgIisodGhpcy5pc0xhcmdlQXJjPzE6MCkrIiAiKyh0aGlzLmlzQ2xvY2t3aXNlQXJjPzE6MCkrIiAiK3RoaXMuZW5kWC50b1N0cmluZygpKyIgIit0aGlzLmVuZFkudG9TdHJpbmcoKToiQSIrdGhpcy5yYWRpdXNYLnRvRml4ZWQoYSkrIiAiK3RoaXMucmFkaXVzWS50b0ZpeGVkKGEpKyIgIit0aGlzLnhBeGlzUm90YXRpb24udG9GaXhlZChhKSsiICIrKHRoaXMuaXNMYXJnZUFyYz8xOjApKyIgIisodGhpcy5pc0Nsb2Nrd2lzZUFyYz8xOjApKyIgIit0aGlzLmVuZFgudG9GaXhlZChhKSsiICIrdGhpcy5lbmRZLnRvRml4ZWQoYSk7YnJlYWs7ZGVmYXVsdDphPXRoaXMudHlwZS50b1N0cmluZygpO31yZXR1cm4gYSsodGhpcy5saj8ieiI6IiIpO307dC5mcmVlemU9ZnVuY3Rpb24oKXt0aGlzLnY9ITA7cmV0dXJuIHRoaXM7fTt0LmhhPWZ1bmN0aW9uKCl7dGhpcy52PSExO3JldHVybiB0aGlzO307dC5jbG9zZT1mdW5jdGlvbigpe3RoaXMubGo9ITA7cmV0dXJuIHRoaXM7fTtmdW5jdGlvbiBFZShhLGIpe2lmKG51bGwhPT1hLktlJiYhMT09PWIucmEpcmV0dXJuIGEuS2U7dmFyIGM9YS5yYWRpdXNYLGQ9YS5yYWRpdXNZO3ZvaWQgMD09PWQmJihkPWMpO2lmKDA9PT1jfHwwPT09ZClyZXR1cm4gYS5LZT1bXSxhLktlO2I9YS5zZTt2YXIgZT1hLm1pLGY9SC5heCgwLDAsYzxkP2M6ZCxhLnN0YXJ0QW5nbGUsYS5zdGFydEFuZ2xlK2Euc3dlZXBBbmdsZSwhMSk7aWYoYyE9PWQpe3ZhciBnPVFjLmFsbG9jKCk7Zy5yZXNldCgpO2M8ZD9nLnNjYWxlKDEsZC9jKTpnLnNjYWxlKGMvZCwxKTt4ZShmLGcpO1FjLmZyZWUoZyk7fWM9Zi5sZW5ndGg7Zm9yKGQ9MDtkPGM7ZCsrKXtnPWZbZF0sZ1swXSs9YixnWzFdKz1lLGdbMl0rPWIsZ1szXSs9ZSxnWzRdKz1iLGdbNV0rPWUsZ1s2XSs9YixnWzddKz1lO31hLktlPWY7cmV0dXJuIGEuS2U7fWZ1bmN0aW9uIEZlKGEsYixjLGQpe2Z1bmN0aW9uIGUoYSxiLGMsZCl7cmV0dXJuKGEqZDxiKmM/LTE6MSkqTWF0aC5hY29zKChhKmMrYipkKS8oTWF0aC5zcXJ0KGEqYStiKmIpKk1hdGguc3FydChjKmMrZCpkKSkpO31pZihudWxsIT09YS5LZSYmITE9PT1iLnJhKXJldHVybiBhLktlO2I9YS5uaTt2YXIgZj1hLlpnOzA9PT1iJiYoYj0xRS00KTswPT09ZiYmKGY9MUUtNCk7dmFyIGc9TWF0aC5QSS8xODAqYS5zZSxoPWEuaWwsaz1hLkVrLGw9YS5tYyxtPWEuQmMsbj1NYXRoLmNvcyhnKSxwPU1hdGguc2luKGcpLHE9biooYy1sKS8yK3AqKGQtbSkvMjtnPS1wKihjLWwpLzIrbiooZC1tKS8yO3ZhciByPXEqcS8oYipiKStnKmcvKGYqZik7MTxyJiYoYio9TWF0aC5zcXJ0KHIpLGYqPU1hdGguc3FydChyKSk7cj0oaD09PWs/LTE6MSkqTWF0aC5zcXJ0KChiKmIqZipmLWIqYipnKmctZipmKnEqcSkvKGIqYipnKmcrZipmKnEqcSkpO2lzTmFOKHIpJiYocj0wKTtoPXIqYipnL2Y7cj1yKi1mKnEvYjtpc05hTihoKSYmKGg9MCk7aXNOYU4ocikmJihyPTApO2M9KGMrbCkvMituKmgtcCpyO2Q9KGQrbSkvMitwKmgrbipyO209ZSgxLDAsKHEtaCkvYiwoZy1yKS9mKTtuPShxLWgpL2I7bD0oZy1yKS9mO3E9KC1xLWgpL2I7aD0oLWctcikvZjtnPWUobixsLHEsaCk7cT0obipxK2wqaCkvKE1hdGguc3FydChuKm4rbCpsKSpNYXRoLnNxcnQocSpxK2gqaCkpOy0xPj1xP2c9TWF0aC5QSToxPD1xJiYoZz0wKTshayYmMDxnJiYoZy09MipNYXRoLlBJKTtrJiYwPmcmJihnKz0yKk1hdGguUEkpO2s9Yj5mPzE6Yi9mO3E9Yj5mP2YvYjoxO2I9SC5heCgwLDAsYj5mP2I6ZixtLG0rZywhMCk7Zj1RYy5hbGxvYygpO2YucmVzZXQoKTtmLnRyYW5zbGF0ZShjLGQpO2Yucm90YXRlKGEuc2UsMCwwKTtmLnNjYWxlKGsscSk7eGUoYixmKTtRYy5mcmVlKGYpO2EuS2U9YjtyZXR1cm4gYS5LZTt9cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVmUucHJvdG90eXBlLHtpc0Nsb3NlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmxqO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmxqIT09YSYmKHRoaXMubGo9YSx0aGlzLnJhPSEwKTt9fSx0eXBlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudmE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLnZhPWE7dGhpcy5yYT0hMDt9fSxlbmRYOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubWM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLm1jPWE7dGhpcy5yYT0hMDt9fSxlbmRZOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQmM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLkJjPWE7dGhpcy5yYT0hMDt9fSxwb2ludDFYOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuc2U7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLnNlPWE7dGhpcy5yYT0hMDt9fSxwb2ludDFZOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubWk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLm1pPWE7dGhpcy5yYT0hMDt9fSxwb2ludDJYOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubmk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLm5pPWE7dGhpcy5yYT0hMDt9fSxwb2ludDJZOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWmc7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLlpnPWE7dGhpcy5yYT0hMDt9fSxjZW50ZXJYOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuc2U7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLnNlPWE7dGhpcy5yYT0hMDt9fSxjZW50ZXJZOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubWk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLm1pPWE7dGhpcy5yYT0hMDt9fSxyYWRpdXNYOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubmk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpezA+YSYmeGEoYSwiPj0gemVybyIsVmUsInJhZGl1c1giKTt0aGlzLnYmJndhKHRoaXMsYSk7dGhpcy5uaT1hO3RoaXMucmE9ITA7fX0scmFkaXVzWTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlpnO30sc2V0OmZ1bmN0aW9uIHNldChhKXswPmEmJnhhKGEsIj49IHplcm8iLFZlLCJyYWRpdXNZIik7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMuWmc9YTt0aGlzLnJhPSEwO319LHN0YXJ0QW5nbGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5tYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5tYyE9PWEmJih0aGlzLnYmJndhKHRoaXMsYSksYSU9MzYwLDA+YSYmKGErPTM2MCksdGhpcy5tYz1hLHRoaXMucmE9ITApO319LHN3ZWVwQW5nbGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5CYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzLGEpOzM2MDxhJiYoYT0zNjApOy0zNjA+YSYmKGE9LTM2MCk7dGhpcy5CYz1hO3RoaXMucmE9ITA7fX0saXNDbG9ja3dpc2VBcmM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Fazt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMuRWs9YTt0aGlzLnJhPSEwO319LGlzTGFyZ2VBcmM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5pbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMuaWw9YTt0aGlzLnJhPSEwO319LHhBeGlzUm90YXRpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5zZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7YSU9MzYwOzA+YSYmKGErPTM2MCk7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMuc2U9YTt0aGlzLnJhPSEwO319fSk7VmUucHJvdG90eXBlLmVxdWFsc0FwcHJveD1WZS5wcm90b3R5cGUuUWE7dmFyIHplPW5ldyBEKFZlLCJNb3ZlIiwwKSxpZT1uZXcgRChWZSwiTGluZSIsMSksQWU9bmV3IEQoVmUsIkJlemllciIsMiksQmU9bmV3IEQoVmUsIlF1YWRyYXRpY0JlemllciIsMyksQ2U9bmV3IEQoVmUsIkFyYyIsNCksRGU9bmV3IEQoVmUsIlN2Z0FyYyIsNCk7VmUuY2xhc3NOYW1lPSJQYXRoU2VnbWVudCI7VmUuTW92ZT16ZTtWZS5MaW5lPWllO1ZlLkJlemllcj1BZTtWZS5RdWFkcmF0aWNCZXppZXI9QmU7VmUuQXJjPUNlO1ZlLlN2Z0FyYz1EZTtmdW5jdGlvbiBYZSgpe3RoaXMuQz1udWxsO3RoaXMuQ3U9bmV3IEcoMCwwKS5mcmVlemUoKTt0aGlzLlR0PW5ldyBHKDAsMCkuZnJlZXplKCk7dGhpcy5KcT10aGlzLlJyPTA7dGhpcy5LcT0xO3RoaXMuR3I9IiI7dGhpcy5Fcz10aGlzLmFyPSExO3RoaXMuJHE9dGhpcy5NcT0wO3RoaXMuQWc9dGhpcy5ucj10aGlzLkFyPSExO3RoaXMuZ3I9bnVsbDt0aGlzLkNzPTA7dGhpcy5RZD10aGlzLkJzPW51bGw7fVhlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IFhlKCk7cmV0dXJuIHRoaXMuY2xvbmUoYSk7fTtYZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oYSl7YS5DPXRoaXMuQzthLkN1LmFzc2lnbih0aGlzLnZpZXdQb2ludCk7YS5UdC5hc3NpZ24odGhpcy5kb2N1bWVudFBvaW50KTthLlJyPXRoaXMuUnI7YS5KcT10aGlzLkpxO2EuS3E9dGhpcy5LcTthLkdyPXRoaXMuR3I7YS5hcj10aGlzLmFyO2EuRXM9dGhpcy5FczthLk1xPXRoaXMuTXE7YS4kcT10aGlzLiRxO2EuQXI9dGhpcy5BcjthLm5yPXRoaXMubnI7YS5BZz10aGlzLkFnO2EuZ3I9dGhpcy5ncjthLkNzPXRoaXMuQ3M7YS5Ccz10aGlzLkJzO2EuUWQ9dGhpcy5RZDtyZXR1cm4gYTt9O1hlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPSJeIjswIT09dGhpcy5tb2RpZmllcnMmJihhKz0iTToiK3RoaXMubW9kaWZpZXJzKTswIT09dGhpcy5idXR0b24mJihhKz0iQjoiK3RoaXMuYnV0dG9uKTsiIiE9PXRoaXMua2V5JiYoYSs9Iks6Iit0aGlzLmtleSk7MCE9PXRoaXMuY2xpY2tDb3VudCYmKGErPSJDOiIrdGhpcy5jbGlja0NvdW50KTswIT09dGhpcy5kZWx0YSYmKGErPSJEOiIrdGhpcy5kZWx0YSk7dGhpcy5oYW5kbGVkJiYoYSs9ImgiKTt0aGlzLmJ1YmJsZXMmJihhKz0iYiIpO251bGwhPT10aGlzLmRvY3VtZW50UG9pbnQmJihhKz0iQCIrdGhpcy5kb2N1bWVudFBvaW50LnRvU3RyaW5nKCkpO3JldHVybiBhO307WGUucHJvdG90eXBlLldwPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5kaWFncmFtO2lmKG51bGw9PT1jKXJldHVybiBiO1llKGMsdGhpcy5ldmVudCxhLGIpO3JldHVybiBiO307WGUucHJvdG90eXBlLmR6PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5kaWFncmFtO2lmKG51bGw9PT1jKXJldHVybiBiO1llKGMsdGhpcy5ldmVudCxhLGIpO2IuYXNzaWduKGMueXQoYikpO3JldHVybiBiO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoWGUucHJvdG90eXBlLHtkaWFncmFtOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5DPWE7fX0sdmlld1BvaW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ3U7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuQ3UuYXNzaWduKGEpO319LGRvY3VtZW50UG9pbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5UdDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5UdC5hc3NpZ24oYSk7fX0sbW9kaWZpZXJzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUnI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuUnI9YTt9fSxidXR0b246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5KcTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5KcT1hO2lmKG51bGw9PT10aGlzLmV2ZW50KXN3aXRjaChhKXtjYXNlIDA6dGhpcy5idXR0b25zPTE7YnJlYWs7Y2FzZSAxOnRoaXMuYnV0dG9ucz00O2JyZWFrO2Nhc2UgMjp0aGlzLmJ1dHRvbnM9Mjt9fX0sYnV0dG9uczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLktxO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLktxPWE7fX0sa2V5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuR3I7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuR3I9YTt9fSxkb3duOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYXI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuYXI9YTt9fSx1cDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkVzO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkVzPWE7fX0sY2xpY2tDb3VudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1xO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk1xPWE7fX0sZGVsdGE6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy4kcTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy4kcT1hO319LGlzTXVsdGlUb3VjaDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkFyO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkFyPWE7fX0saGFuZGxlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLm5yO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLm5yPWE7fX0sYnViYmxlczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkFnO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkFnPWE7fX0sZXZlbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ncjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5ncj1hO319LGlzVG91Y2hFdmVudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXcuVG91Y2hFdmVudCxiPXRoaXMuZXZlbnQ7cmV0dXJuIGEmJmIgaW5zdGFuY2VvZiBhPyEwOihhPXcuUG9pbnRlckV2ZW50KSYmYiBpbnN0YW5jZW9mIGEmJigidG91Y2giPT09Yi5wb2ludGVyVHlwZXx8InBlbiI9PT1iLnBvaW50ZXJUeXBlKTt9fSx0aW1lc3RhbXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Dczt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5Dcz1hO319LHRhcmdldERpYWdyYW06e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Cczt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5Ccz1hO319LHRhcmdldE9iamVjdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlFkO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlFkPWE7fX0sY29udHJvbDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMubW9kaWZpZXJzJjEpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLm1vZGlmaWVycz1hP3RoaXMubW9kaWZpZXJzfDE6dGhpcy5tb2RpZmllcnMmLTI7fX0sc2hpZnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLm1vZGlmaWVycyY0KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5tb2RpZmllcnM9YT90aGlzLm1vZGlmaWVyc3w0OnRoaXMubW9kaWZpZXJzJi01O319LGFsdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMubW9kaWZpZXJzJjIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLm1vZGlmaWVycz1hP3RoaXMubW9kaWZpZXJzfDI6dGhpcy5tb2RpZmllcnMmLTM7fX0sbWV0YTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMubW9kaWZpZXJzJjgpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLm1vZGlmaWVycz1hP3RoaXMubW9kaWZpZXJzfDg6dGhpcy5tb2RpZmllcnMmLTk7fX0sbGVmdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMuZXZlbnQ7cmV0dXJuIG51bGw9PT1hfHwibW91c2Vkb3duIiE9PWEudHlwZSYmIm1vdXNldXAiIT09YS50eXBlJiYicG9pbnRlcmRvd24iIT09YS50eXBlJiYicG9pbnRlcnVwIiE9PWEudHlwZT8wIT09KHRoaXMuYnV0dG9ucyYxKTowPT09dGhpcy5idXR0b247fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuYnV0dG9ucz1hP3RoaXMuYnV0dG9uc3wxOnRoaXMuYnV0dG9ucyYtMjt9fSxyaWdodDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMuZXZlbnQ7cmV0dXJuIG51bGw9PT1hfHwibW91c2Vkb3duIiE9PWEudHlwZSYmIm1vdXNldXAiIT09YS50eXBlJiYicG9pbnRlcmRvd24iIT09YS50eXBlJiYicG9pbnRlcnVwIiE9PWEudHlwZT8wIT09KHRoaXMuYnV0dG9ucyYyKToyPT09dGhpcy5idXR0b247fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuYnV0dG9ucz1hP3RoaXMuYnV0dG9uc3wyOnRoaXMuYnV0dG9ucyYtMzt9fSxtaWRkbGU6e2dldDpmdW5jdGlvbiBnZXQoKXt2YXIgYT10aGlzLmV2ZW50O3JldHVybiBudWxsPT09YXx8Im1vdXNlZG93biIhPT1hLnR5cGUmJiJtb3VzZXVwIiE9PWEudHlwZSYmInBvaW50ZXJkb3duIiE9PWEudHlwZSYmInBvaW50ZXJ1cCIhPT1hLnR5cGU/MCE9PSh0aGlzLmJ1dHRvbnMmNCk6MT09PXRoaXMuYnV0dG9uO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmJ1dHRvbnM9YT90aGlzLmJ1dHRvbnN8NDp0aGlzLmJ1dHRvbnMmLTU7fX19KTtYZS5wcm90b3R5cGUuZ2V0TXVsdGlUb3VjaERvY3VtZW50UG9pbnQ9WGUucHJvdG90eXBlLmR6O1hlLnByb3RvdHlwZS5nZXRNdWx0aVRvdWNoVmlld1BvaW50PVhlLnByb3RvdHlwZS5XcDtYZS5jbGFzc05hbWU9IklucHV0RXZlbnQiO2Z1bmN0aW9uIFplKCl7dGhpcy5DPW51bGw7dGhpcy5VYT0iIjt0aGlzLmVzPXRoaXMuenM9bnVsbDt9WmUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgWmUoKTthLkM9dGhpcy5DO2EuVWE9dGhpcy5VYTthLnpzPXRoaXMuenM7YS5lcz10aGlzLmVzO3JldHVybiBhO307WmUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9IioiK3RoaXMubmFtZTtudWxsIT09dGhpcy5zdWJqZWN0JiYoYSs9IjoiK3RoaXMuc3ViamVjdC50b1N0cmluZygpKTtudWxsIT09dGhpcy5wYXJhbWV0ZXImJihhKz0iKCIrdGhpcy5wYXJhbWV0ZXIudG9TdHJpbmcoKSsiKSIpO3JldHVybiBhO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoWmUucHJvdG90eXBlLHtkaWFncmFtOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5DPWE7fX0sbmFtZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlVhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlVhPWE7fX0sc3ViamVjdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnpzO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnpzPWE7fX0scGFyYW1ldGVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZXM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuZXM9YTt9fX0pO1plLmNsYXNzTmFtZT0iRGlhZ3JhbUV2ZW50IjtmdW5jdGlvbiAkZSgpe3RoaXMuV209YWY7dGhpcy5Eaj10aGlzLlFyPSIiO3RoaXMuem89dGhpcy5Bbz10aGlzLkZvPXRoaXMuR289dGhpcy5Fbz10aGlzLkM9dGhpcy4kYj1udWxsO30kZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnpvPXRoaXMuQW89dGhpcy5Gbz10aGlzLkdvPXRoaXMuRW89dGhpcy5DPXRoaXMuJGI9bnVsbDt9OyRlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3ICRlKCk7YS5XbT10aGlzLldtO2EuUXI9dGhpcy5RcjthLkRqPXRoaXMuRGo7YS4kYj10aGlzLiRiO2EuQz10aGlzLkM7YS5Fbz10aGlzLkVvO3ZhciBiPXRoaXMuR287YS5Hbz1DYShiKSYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLkk/Yi5JKCk6YjtiPXRoaXMuRm87YS5Gbz1DYShiKSYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLkk/Yi5JKCk6YjtiPXRoaXMuQW87YS5Bbz1DYShiKSYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLkk/Yi5JKCk6YjtiPXRoaXMuem87YS56bz1DYShiKSYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLkk/Yi5JKCk6YjtyZXR1cm4gYTt9OyRlLnByb3RvdHlwZS5mYj1mdW5jdGlvbihhKXthLmNsYXNzVHlwZT09PSRlJiYodGhpcy5jaGFuZ2U9YSk7fTskZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT0iIjthPXRoaXMuY2hhbmdlPT09YmY/YSsiKiAiOnRoaXMuY2hhbmdlPT09YWY/YSsobnVsbCE9PXRoaXMubW9kZWw/IiFtIjoiIWQiKTphKygobnVsbCE9PXRoaXMubW9kZWw/IiFtIjoiIWQiKSt0aGlzLmNoYW5nZSk7dGhpcy5wcm9wZXJ0eU5hbWUmJiJzdHJpbmciPT09dHlwZW9mIHRoaXMucHJvcGVydHlOYW1lJiYoYSs9IiAiK3RoaXMucHJvcGVydHlOYW1lKTt0aGlzLm1vZGVsQ2hhbmdlJiZ0aGlzLm1vZGVsQ2hhbmdlIT09dGhpcy5wcm9wZXJ0eU5hbWUmJihhKz0iICIrdGhpcy5tb2RlbENoYW5nZSk7YSs9IjogIjt0aGlzLmNoYW5nZT09PWJmP251bGwhPT10aGlzLm9sZFZhbHVlJiYoYSs9IiAiK3RoaXMub2xkVmFsdWUpOihudWxsIT09dGhpcy5vYmplY3QmJihhKz1RYSh0aGlzLm9iamVjdCkpLG51bGwhPT10aGlzLm9sZFZhbHVlJiYoYSs9IiAgb2xkOiAiK1FhKHRoaXMub2xkVmFsdWUpKSxudWxsIT09dGhpcy5vbGRQYXJhbSYmKGErPSIgIit0aGlzLm9sZFBhcmFtKSxudWxsIT09dGhpcy5uZXdWYWx1ZSYmKGErPSIgIG5ldzogIitRYSh0aGlzLm5ld1ZhbHVlKSksbnVsbCE9PXRoaXMubmV3UGFyYW0mJihhKz0iICIrdGhpcy5uZXdQYXJhbSkpO3JldHVybiBhO307JGUucHJvdG90eXBlLko9ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vbGRWYWx1ZTp0aGlzLm5ld1ZhbHVlO307JGUucHJvdG90eXBlLmZ6PWZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMub2xkUGFyYW06dGhpcy5uZXdQYXJhbTt9OyRlLnByb3RvdHlwZS5jYW5VbmRvPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLm1vZGVsfHxudWxsIT09dGhpcy5kaWFncmFtPyEwOiExO307JGUucHJvdG90eXBlLnVuZG89ZnVuY3Rpb24oKXt0aGlzLmNhblVuZG8oKSYmKG51bGwhPT10aGlzLm1vZGVsP3RoaXMubW9kZWwuUmoodGhpcywhMCk6bnVsbCE9PXRoaXMuZGlhZ3JhbSYmdGhpcy5kaWFncmFtLlJqKHRoaXMsITApKTt9OyRlLnByb3RvdHlwZS5jYW5SZWRvPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLm1vZGVsfHxudWxsIT09dGhpcy5kaWFncmFtPyEwOiExO307JGUucHJvdG90eXBlLnJlZG89ZnVuY3Rpb24oKXt0aGlzLmNhblJlZG8oKSYmKG51bGwhPT10aGlzLm1vZGVsP3RoaXMubW9kZWwuUmoodGhpcywhMSk6bnVsbCE9PXRoaXMuZGlhZ3JhbSYmdGhpcy5kaWFncmFtLlJqKHRoaXMsITEpKTt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCRlLnByb3RvdHlwZSx7bW9kZWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy4kYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy4kYj1hO319LGRpYWdyYW06e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkM9YTt9fSxjaGFuZ2U6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XbTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5XbT1hO319LG1vZGVsQ2hhbmdlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUXI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuUXI9YTt9fSxwcm9wZXJ0eU5hbWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Eajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5Eaj1hO319LGlzVHJhbnNhY3Rpb25GaW5pc2hlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLldtPT09YmYmJigiQ29tbWl0dGVkVHJhbnNhY3Rpb24iPT09dGhpcy5Eanx8IkZpbmlzaGVkVW5kbyI9PT10aGlzLkRqfHwiRmluaXNoZWRSZWRvIj09PXRoaXMuRGopO319LG9iamVjdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkVvO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkVvPWE7fX0sb2xkVmFsdWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Hbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5Hbz1hO319LG9sZFBhcmFtOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRm87fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuRm89YTt9fSxuZXdWYWx1ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkFvO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkFvPWE7fX0sbmV3UGFyYW06e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy56bzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy56bz1hO319fSk7JGUucHJvdG90eXBlLnJlZG89JGUucHJvdG90eXBlLnJlZG87JGUucHJvdG90eXBlLmNhblJlZG89JGUucHJvdG90eXBlLmNhblJlZG87JGUucHJvdG90eXBlLnVuZG89JGUucHJvdG90eXBlLnVuZG87JGUucHJvdG90eXBlLmNhblVuZG89JGUucHJvdG90eXBlLmNhblVuZG87JGUucHJvdG90eXBlLmdldFBhcmFtPSRlLnByb3RvdHlwZS5mejskZS5wcm90b3R5cGUuZ2V0VmFsdWU9JGUucHJvdG90eXBlLko7JGUucHJvdG90eXBlLmNsZWFyPSRlLnByb3RvdHlwZS5jbGVhcjt2YXIgYmY9bmV3IEQoJGUsIlRyYW5zYWN0aW9uIiwtMSksYWY9bmV3IEQoJGUsIlByb3BlcnR5IiwwKSxjZj1uZXcgRCgkZSwiSW5zZXJ0IiwxKSxkZj1uZXcgRCgkZSwiUmVtb3ZlIiwyKTskZS5jbGFzc05hbWU9IkNoYW5nZWRFdmVudCI7JGUuVHJhbnNhY3Rpb249YmY7JGUuUHJvcGVydHk9YWY7JGUuSW5zZXJ0PWNmOyRlLlJlbW92ZT1kZjtmdW5jdGlvbiBlZigpe3RoaXMudT1uZXcgRSgpLmZyZWV6ZSgpO3RoaXMuVWE9IiI7dGhpcy5sPSExO31lZi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oYSl7dmFyIGI9IlRyYW5zYWN0aW9uOiAiK3RoaXMubmFtZSsiICIrdGhpcy5jaGFuZ2VzLmNvdW50LnRvU3RyaW5nKCkrKHRoaXMuaXNDb21wbGV0ZT8iIjoiLCBpbmNvbXBsZXRlIik7aWYodm9pZCAwIT09YSYmMDxhKXthPXRoaXMuY2hhbmdlcy5jb3VudDtmb3IodmFyIGM9MDtjPGE7YysrKXt2YXIgZD10aGlzLmNoYW5nZXMuTihjKTtudWxsIT09ZCYmKGIrPSJcbiAgIitkLnRvU3RyaW5nKCkpO319cmV0dXJuIGI7fTtlZi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYW5nZXM7YS5oYSgpO2Zvcih2YXIgYj1hLmNvdW50LTE7MDw9YjtiLS0pe3ZhciBjPWEuTihiKTtudWxsIT09YyYmYy5jbGVhcigpO31hLmNsZWFyKCk7YS5mcmVlemUoKTt9O2VmLnByb3RvdHlwZS5jYW5VbmRvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNDb21wbGV0ZTt9O2VmLnByb3RvdHlwZS51bmRvPWZ1bmN0aW9uKCl7aWYodGhpcy5jYW5VbmRvKCkpZm9yKHZhciBhPXRoaXMuY2hhbmdlcy5jb3VudC0xOzA8PWE7YS0tKXt2YXIgYj10aGlzLmNoYW5nZXMuTihhKTtudWxsIT09YiYmYi51bmRvKCk7fX07ZWYucHJvdG90eXBlLmNhblJlZG89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0NvbXBsZXRlO307ZWYucHJvdG90eXBlLnJlZG89ZnVuY3Rpb24oKXtpZih0aGlzLmNhblJlZG8oKSlmb3IodmFyIGE9dGhpcy5jaGFuZ2VzLmNvdW50LGI9MDtiPGE7YisrKXt2YXIgYz10aGlzLmNoYW5nZXMuTihiKTtudWxsIT09YyYmYy5yZWRvKCk7fX07cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZWYucHJvdG90eXBlLHtjaGFuZ2VzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9fSxuYW1lOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVWE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVWE9YTt9fSxpc0NvbXBsZXRlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5sPWE7fX19KTtlZi5wcm90b3R5cGUucmVkbz1lZi5wcm90b3R5cGUucmVkbztlZi5wcm90b3R5cGUuY2FuUmVkbz1lZi5wcm90b3R5cGUuY2FuUmVkbztlZi5wcm90b3R5cGUudW5kbz1lZi5wcm90b3R5cGUudW5kbztlZi5wcm90b3R5cGUuY2FuVW5kbz1lZi5wcm90b3R5cGUuY2FuVW5kbztlZi5wcm90b3R5cGUuY2xlYXI9ZWYucHJvdG90eXBlLmNsZWFyO2VmLmNsYXNzTmFtZT0iVHJhbnNhY3Rpb24iO2Z1bmN0aW9uIGZmKCl7dGhpcy5qdT1uZXcgRigpO3RoaXMuRGM9ITE7dGhpcy5LPW5ldyBFKCkuZnJlZXplKCk7dGhpcy5mZT0tMTt0aGlzLnU9OTk5O3RoaXMuaWU9ITE7dGhpcy5ZcT1udWxsO3RoaXMueWk9MDt0aGlzLmw9ITE7dGhpcy5wZT1uZXcgRSgpLmZyZWV6ZSgpO3RoaXMuc2w9bmV3IEUoKTt0aGlzLiR0PSEwO3RoaXMuZHU9ITE7fWZmLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihhKXt2YXIgYj0iVW5kb01hbmFnZXIgIit0aGlzLmhpc3RvcnlJbmRleCsiPCIrdGhpcy5oaXN0b3J5LmNvdW50KyI8PSIrdGhpcy5tYXhIaXN0b3J5TGVuZ3RoO2IrPSJbIjtmb3IodmFyIGM9dGhpcy5uZXN0ZWRUcmFuc2FjdGlvbk5hbWVzLmNvdW50LGQ9MDtkPGM7ZCsrKXswPGQmJihiKz0iICIpLGIrPXRoaXMubmVzdGVkVHJhbnNhY3Rpb25OYW1lcy5OKGQpO31iKz0iXSI7aWYodm9pZCAwIT09YSYmMDxhKWZvcihjPXRoaXMuaGlzdG9yeS5jb3VudCxkPTA7ZDxjO2QrKyl7Yis9IlxuICIrdGhpcy5oaXN0b3J5Lk4oZCkudG9TdHJpbmcoYS0xKTt9cmV0dXJuIGI7fTtmZi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmhpc3Rvcnk7YS5oYSgpO2Zvcih2YXIgYj1hLmNvdW50LTE7MDw9YjtiLS0pe3ZhciBjPWEuTihiKTtudWxsIT09YyYmYy5jbGVhcigpO31hLmNsZWFyKCk7dGhpcy5mZT0tMTthLmZyZWV6ZSgpO3RoaXMuaWU9ITE7dGhpcy5ZcT1udWxsO3RoaXMueWk9MDt0aGlzLnBlLmhhKCk7dGhpcy5wZS5jbGVhcigpO3RoaXMucGUuZnJlZXplKCk7dGhpcy5zbC5jbGVhcigpO307ZmYucHJvdG90eXBlLmNvcHlQcm9wZXJ0aWVzPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkPWEuaXNFbmFibGVkO3RoaXMubWF4SGlzdG9yeUxlbmd0aD1hLm1heEhpc3RvcnlMZW5ndGg7dGhpcy5jaGVja3NUcmFuc2FjdGlvbkxldmVsPWEuY2hlY2tzVHJhbnNhY3Rpb25MZXZlbDt9O3Q9ZmYucHJvdG90eXBlO3QuU3c9ZnVuY3Rpb24oYSl7dGhpcy5qdS5hZGQoYSk7fTt0LkJ4PWZ1bmN0aW9uKGEpe3RoaXMuanUucmVtb3ZlKGEpO307dC5BYT1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT0iIik7bnVsbD09PWEmJihhPSIiKTtpZih0aGlzLmlzVW5kb2luZ1JlZG9pbmcpcmV0dXJuITE7ITA9PT10aGlzLiR0JiYodGhpcy4kdD0hMSx0aGlzLnlpKyssdGhpcy55YigiU3RhcnRpbmdGaXJzdFRyYW5zYWN0aW9uIixhLHRoaXMuY3VycmVudFRyYW5zYWN0aW9uKSwwPHRoaXMueWkmJnRoaXMueWktLSk7dGhpcy5pc0VuYWJsZWQmJih0aGlzLnBlLmhhKCksdGhpcy5wZS5hZGQoYSksdGhpcy5wZS5mcmVlemUoKSxudWxsPT09dGhpcy5jdXJyZW50VHJhbnNhY3Rpb24/dGhpcy5zbC5hZGQoMCk6dGhpcy5zbC5hZGQodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24uY2hhbmdlcy5jb3VudCkpO3RoaXMueWkrKzt2YXIgYj0xPT09dGhpcy50cmFuc2FjdGlvbkxldmVsO2ImJnRoaXMueWIoIlN0YXJ0ZWRUcmFuc2FjdGlvbiIsYSx0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbik7cmV0dXJuIGI7fTt0LlphPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPSIiKTtyZXR1cm4gamYodGhpcywhMCxhKTt9O3QudWY9ZnVuY3Rpb24oKXtyZXR1cm4gamYodGhpcywhMSwiIik7fTtmdW5jdGlvbiBqZihhLGIsYyl7aWYoYS5pc1VuZG9pbmdSZWRvaW5nKXJldHVybiExO2EuY2hlY2tzVHJhbnNhY3Rpb25MZXZlbCYmMT5hLnRyYW5zYWN0aW9uTGV2ZWwmJnlhKCJFbmRpbmcgdHJhbnNhY3Rpb24gd2l0aG91dCBoYXZpbmcgc3RhcnRlZCBhIHRyYW5zYWN0aW9uOiAiK2MpO3ZhciBkPTE9PT1hLnRyYW5zYWN0aW9uTGV2ZWw7ZCYmYiYmYS55YigiQ29tbWl0dGluZ1RyYW5zYWN0aW9uIixjLGEuY3VycmVudFRyYW5zYWN0aW9uKTt2YXIgZT0wO2lmKDA8YS50cmFuc2FjdGlvbkxldmVsJiYoYS55aS0tLGEuaXNFbmFibGVkKSl7dmFyIGY9YS5wZS5jb3VudDswPGYmJigiIj09PWMmJihjPWEucGUuTigwKSksYS5wZS5oYSgpLGEucGUubWIoZi0xKSxhLnBlLmZyZWV6ZSgpKTtmPWEuc2wuY291bnQ7MDxmJiYoZT1hLnNsLk4oZi0xKSxhLnNsLm1iKGYtMSkpO31mPWEuY3VycmVudFRyYW5zYWN0aW9uO2lmKGQpe2lmKGIpe2EuZHU9ITE7aWYoYS5pc0VuYWJsZWQmJm51bGwhPT1mKXtiPWY7Yi5pc0NvbXBsZXRlPSEwO2IubmFtZT1jO2Q9YS5oaXN0b3J5O2QuaGEoKTtmb3IoZT1kLmNvdW50LTE7ZT5hLmhpc3RvcnlJbmRleDtlLS0pe2Y9ZC5OKGUpLG51bGwhPT1mJiZmLmNsZWFyKCksZC5tYihlKSxhLmR1PSEwO31lPWEubWF4SGlzdG9yeUxlbmd0aDswPD1lJiYoMD09PWU/ZC5jbGVhcigpOmQuY291bnQ+PWUmJihmPWQuTigwKSxudWxsIT09ZiYmZi5jbGVhcigpLGQubWIoMCksYS5mZS0tKSk7MCE9PWUmJihkLmFkZChiKSxhLmZlKyspO2QuZnJlZXplKCk7Zj1iO31hLnliKCJDb21taXR0ZWRUcmFuc2FjdGlvbiIsYyxmKTt9ZWxzZXthLmllPSEwO3RyeXthLmlzRW5hYmxlZCYmbnVsbCE9PWYmJihmLmlzQ29tcGxldGU9ITAsZi51bmRvKCkpO31maW5hbGx5e2EueWIoIlJvbGxlZEJhY2tUcmFuc2FjdGlvbiIsYyxmKSxhLmllPSExO31udWxsIT09ZiYmZi5jbGVhcigpO31hLllxPW51bGw7cmV0dXJuITA7fWlmKGEuaXNFbmFibGVkJiYhYiYmbnVsbCE9PWYpe2E9ZTtjPWYuY2hhbmdlcztmb3IoYj1jLmNvdW50LTE7Yj49YTtiLS0pe2Q9Yy5OKGIpLG51bGwhPT1kJiZkLnVuZG8oKSxjLmhhKCksYy5tYihiKTt9Yy5mcmVlemUoKTt9cmV0dXJuITE7fWZmLnByb3RvdHlwZS5jYW5VbmRvPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbmFibGVkfHwwPHRoaXMudHJhbnNhY3Rpb25MZXZlbClyZXR1cm4hMTt2YXIgYT10aGlzLnRyYW5zYWN0aW9uVG9VbmRvO3JldHVybiBudWxsIT09YSYmYS5jYW5VbmRvKCk/ITA6ITE7fTtmZi5wcm90b3R5cGUudW5kbz1mdW5jdGlvbigpe2lmKHRoaXMuY2FuVW5kbygpKXt2YXIgYT10aGlzLnRyYW5zYWN0aW9uVG9VbmRvO3RyeXt0aGlzLmllPSEwLHRoaXMueWIoIlN0YXJ0aW5nVW5kbyIsIlVuZG8iLGEpLHRoaXMuZmUtLSxhLnVuZG8oKTt9Y2F0Y2goYil7eWEoInVuZG8gZXJyb3I6ICIrYi50b1N0cmluZygpKTt9ZmluYWxseXt0aGlzLnliKCJGaW5pc2hlZFVuZG8iLCJVbmRvIixhKSx0aGlzLmllPSExO319fTtmZi5wcm90b3R5cGUuY2FuUmVkbz1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZHx8MDx0aGlzLnRyYW5zYWN0aW9uTGV2ZWwpcmV0dXJuITE7dmFyIGE9dGhpcy50cmFuc2FjdGlvblRvUmVkbztyZXR1cm4gbnVsbCE9PWEmJmEuY2FuUmVkbygpPyEwOiExO307ZmYucHJvdG90eXBlLnJlZG89ZnVuY3Rpb24oKXtpZih0aGlzLmNhblJlZG8oKSl7dmFyIGE9dGhpcy50cmFuc2FjdGlvblRvUmVkbzt0cnl7dGhpcy5pZT0hMCx0aGlzLnliKCJTdGFydGluZ1JlZG8iLCJSZWRvIixhKSx0aGlzLmZlKyssYS5yZWRvKCk7fWNhdGNoKGIpe3lhKCJyZWRvIGVycm9yOiAiK2IudG9TdHJpbmcoKSk7fWZpbmFsbHl7dGhpcy55YigiRmluaXNoZWRSZWRvIiwiUmVkbyIsYSksdGhpcy5pZT0hMTt9fX07ZmYucHJvdG90eXBlLnliPWZ1bmN0aW9uKGEsYixjKXt2b2lkIDA9PT1jJiYoYz1udWxsKTt2YXIgZD1uZXcgJGUoKTtkLmNoYW5nZT1iZjtkLnByb3BlcnR5TmFtZT1hO2Qub2JqZWN0PWM7ZC5vbGRWYWx1ZT1iO2ZvcihhPXRoaXMubW9kZWxzO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGQubW9kZWw9YixiLktzKGQpO319O2ZmLnByb3RvdHlwZS5mdj1mdW5jdGlvbihhKXtpZih0aGlzLmlzRW5hYmxlZCYmIXRoaXMuaXNVbmRvaW5nUmVkb2luZyYmIXRoaXMuc2tpcHNFdmVudChhKSl7dmFyIGI9dGhpcy5jdXJyZW50VHJhbnNhY3Rpb247bnVsbD09PWImJih0aGlzLllxPWI9bmV3IGVmKCkpO3ZhciBjPWEuY29weSgpO2I9Yi5jaGFuZ2VzO2IuaGEoKTtiLmFkZChjKTtiLmZyZWV6ZSgpO3RoaXMuY2hlY2tzVHJhbnNhY3Rpb25MZXZlbCYmMD49dGhpcy50cmFuc2FjdGlvbkxldmVsJiYhdGhpcy4kdCYmKGE9YS5kaWFncmFtLG51bGwhPT1hJiYhMT09PWEuT2l8fHlhKCJDaGFuZ2Ugbm90IHdpdGhpbiBhIHRyYW5zYWN0aW9uOiAiK2MudG9TdHJpbmcoKSkpO319O2ZmLnByb3RvdHlwZS5za2lwc0V2ZW50PWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hfHwwPmEuY2hhbmdlLnZhbHVlKXJldHVybiEwO2E9YS5vYmplY3Q7aWYodm9pZCAwIT09YS5sYXllcil7aWYoYT1hLmxheWVyLG51bGwhPT1hJiZhLmlzVGVtcG9yYXJ5KXJldHVybiEwO31lbHNlIGlmKGEuaXNUZW1wb3JhcnkpcmV0dXJuITA7cmV0dXJuITE7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhmZi5wcm90b3R5cGUse21vZGVsczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmp1Lml0ZXJhdG9yO319LGlzRW5hYmxlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkRjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkRjPWE7fX0sdHJhbnNhY3Rpb25Ub1VuZG86e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMDw9dGhpcy5oaXN0b3J5SW5kZXgmJnRoaXMuaGlzdG9yeUluZGV4PD10aGlzLmhpc3RvcnkuY291bnQtMT90aGlzLmhpc3RvcnkuTih0aGlzLmhpc3RvcnlJbmRleCk6bnVsbDt9fSx0cmFuc2FjdGlvblRvUmVkbzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmhpc3RvcnlJbmRleDx0aGlzLmhpc3RvcnkuY291bnQtMT90aGlzLmhpc3RvcnkuTih0aGlzLmhpc3RvcnlJbmRleCsxKTpudWxsO319LGlzVW5kb2luZ1JlZG9pbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5pZTt9fSxoaXN0b3J5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9fSxtYXhIaXN0b3J5TGVuZ3RoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy51PWE7fX0saGlzdG9yeUluZGV4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZmU7fX0sY3VycmVudFRyYW5zYWN0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWXE7fX0sdHJhbnNhY3Rpb25MZXZlbDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnlpO319LGlzSW5UcmFuc2FjdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwPHRoaXMueWk7fX0sY2hlY2tzVHJhbnNhY3Rpb25MZXZlbDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMubD1hO319LG5lc3RlZFRyYW5zYWN0aW9uTmFtZXM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5wZTt9fX0pO2ZmLnByb3RvdHlwZS5oYW5kbGVDaGFuZ2VkPWZmLnByb3RvdHlwZS5mdjtmZi5wcm90b3R5cGUucmVkbz1mZi5wcm90b3R5cGUucmVkbztmZi5wcm90b3R5cGUudW5kbz1mZi5wcm90b3R5cGUudW5kbztmZi5wcm90b3R5cGUuY2FuVW5kbz1mZi5wcm90b3R5cGUuY2FuVW5kbztmZi5wcm90b3R5cGUucm9sbGJhY2tUcmFuc2FjdGlvbj1mZi5wcm90b3R5cGUudWY7ZmYucHJvdG90eXBlLmNvbW1pdFRyYW5zYWN0aW9uPWZmLnByb3RvdHlwZS5aYTtmZi5wcm90b3R5cGUuc3RhcnRUcmFuc2FjdGlvbj1mZi5wcm90b3R5cGUuQWE7ZmYucHJvdG90eXBlLnJlbW92ZU1vZGVsPWZmLnByb3RvdHlwZS5CeDtmZi5wcm90b3R5cGUuYWRkTW9kZWw9ZmYucHJvdG90eXBlLlN3O2ZmLnByb3RvdHlwZS5jbGVhcj1mZi5wcm90b3R5cGUuY2xlYXI7ZmYuY2xhc3NOYW1lPSJVbmRvTWFuYWdlciI7ZnVuY3Rpb24ga2YoKXttYih0aGlzKTt0aGlzLkM9bGY7dGhpcy5VYT0iIjt0aGlzLkRjPSEwO3RoaXMuVmI9ITE7dGhpcy5kdz1udWxsO3RoaXMuZXk9bmV3IFhlKCk7dGhpcy5Icz0tMTt9a2YucHJvdG90eXBlLmhiPWZ1bmN0aW9uKGEpe3RoaXMuQz1hO307a2YucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIiIhPT10aGlzLm5hbWU/dGhpcy5uYW1lKyIgVG9vbCI6UGEodGhpcy5jb25zdHJ1Y3Rvcik7fTtrZi5wcm90b3R5cGUudXBkYXRlQWRvcm5tZW50cz1mdW5jdGlvbigpe307a2YucHJvdG90eXBlLmNhblN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbmFibGVkO307a2YucHJvdG90eXBlLmRvU3RhcnQ9ZnVuY3Rpb24oKXt9O2tmLnByb3RvdHlwZS5kb0FjdGl2YXRlPWZ1bmN0aW9uKCl7dGhpcy5pc0FjdGl2ZT0hMDt9O2tmLnByb3RvdHlwZS5kb0RlYWN0aXZhdGU9ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlPSExO307a2YucHJvdG90eXBlLmRvU3RvcD1mdW5jdGlvbigpe307a2YucHJvdG90eXBlLmRvQ2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy50cmFuc2FjdGlvblJlc3VsdD1udWxsO3RoaXMuc3RvcFRvb2woKTt9O2tmLnByb3RvdHlwZS5zdG9wVG9vbD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTthLmN1cnJlbnRUb29sPT09dGhpcyYmKGEuY3VycmVudFRvb2w9bnVsbCxhLmN1cnJlbnRDdXJzb3I9IiIpO307a2YucHJvdG90eXBlLmRvTW91c2VEb3duPWZ1bmN0aW9uKCl7IXRoaXMuaXNBY3RpdmUmJnRoaXMuY2FuU3RhcnQoKSYmdGhpcy5kb0FjdGl2YXRlKCk7fTtrZi5wcm90b3R5cGUuZG9Nb3VzZU1vdmU9ZnVuY3Rpb24oKXt9O2tmLnByb3RvdHlwZS5kb01vdXNlVXA9ZnVuY3Rpb24oKXt0aGlzLnN0b3BUb29sKCk7fTtrZi5wcm90b3R5cGUuZG9Nb3VzZVdoZWVsPWZ1bmN0aW9uKCl7fTtrZi5wcm90b3R5cGUuY2FuU3RhcnRNdWx0aVRvdWNoPWZ1bmN0aW9uKCl7cmV0dXJuITA7fTtrZi5wcm90b3R5cGUuc3RhbmRhcmRQaW5jaFpvb21TdGFydD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbSxiPWEubGFzdElucHV0LGM9Yi5XcCgwLEcuYWxsb2NBdChOYU4sTmFOKSksZD1iLldwKDEsRy5hbGxvY0F0KE5hTixOYU4pKTtpZihjLm8oKSYmZC5vKCkmJih0aGlzLmRvQ2FuY2VsKCksYS5ibSgiaGFzR2VzdHVyZVpvb20iKSkpe2EuSG89YS5zY2FsZTt2YXIgZT1kLngtYy54LGY9ZC55LWMueTthLkl3PU1hdGguc3FydChlKmUrZipmKTtiLmJ1YmJsZXM9ITE7fUcuZnJlZShjKTtHLmZyZWUoZCk7fTtrZi5wcm90b3R5cGUuc3RhbmRhcmRQaW5jaFpvb21Nb3ZlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLGI9YS5sYXN0SW5wdXQsYz1iLldwKDAsRy5hbGxvY0F0KE5hTixOYU4pKSxkPWIuV3AoMSxHLmFsbG9jQXQoTmFOLE5hTikpO2lmKGMubygpJiZkLm8oKSYmKHRoaXMuZG9DYW5jZWwoKSxhLmJtKCJoYXNHZXN0dXJlWm9vbSIpKSl7dmFyIGU9ZC54LWMueCxmPWQueS1jLnk7Zj1NYXRoLnNxcnQoZSplK2YqZikvYS5JdztlPW5ldyBHKChNYXRoLm1pbihkLngsYy54KStNYXRoLm1heChkLngsYy54KSkvMiwoTWF0aC5taW4oZC55LGMueSkrTWF0aC5tYXgoZC55LGMueSkpLzIpO2YqPWEuSG87dmFyIGc9YS5jb21tYW5kSGFuZGxlcjtpZihmIT09YS5zY2FsZSYmZy5jYW5SZXNldFpvb20oZikpe3ZhciBoPWEuem9vbVBvaW50O2Euem9vbVBvaW50PWU7Zy5yZXNldFpvb20oZik7YS56b29tUG9pbnQ9aDt9Yi5idWJibGVzPSExO31HLmZyZWUoYyk7Ry5mcmVlKGQpO307a2YucHJvdG90eXBlLmRvS2V5RG93bj1mdW5jdGlvbigpeyJFc2MiPT09dGhpcy5kaWFncmFtLmxhc3RJbnB1dC5rZXkmJnRoaXMuZG9DYW5jZWwoKTt9O2tmLnByb3RvdHlwZS5kb0tleVVwPWZ1bmN0aW9uKCl7fTtrZi5wcm90b3R5cGUuQWE9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9dGhpcy5uYW1lKTt0aGlzLnRyYW5zYWN0aW9uUmVzdWx0PW51bGw7cmV0dXJuIHRoaXMuZGlhZ3JhbS5BYShhKTt9O2tmLnByb3RvdHlwZS52Zz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtyZXR1cm4gbnVsbD09PXRoaXMudHJhbnNhY3Rpb25SZXN1bHQ/YS51ZigpOmEuWmEodGhpcy50cmFuc2FjdGlvblJlc3VsdCk7fTtrZi5wcm90b3R5cGUuc3RhbmRhcmRNb3VzZVNlbGVjdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtpZihhLmFsbG93U2VsZWN0KXt2YXIgYj1hLmxhc3RJbnB1dCxjPWEuJGwoYi5kb2N1bWVudFBvaW50LCExKTtpZihudWxsIT09Yyl7aWYoaWI/Yi5tZXRhOmIuY29udHJvbCl7YS5hYSgiQ2hhbmdpbmdTZWxlY3Rpb24iLGEuc2VsZWN0aW9uKTtmb3IoYj1jO251bGwhPT1iJiYhYi5jYW5TZWxlY3QoKTspe2I9Yi5jb250YWluaW5nR3JvdXA7fW51bGwhPT1iJiYoYi5pc1NlbGVjdGVkPSFiLmlzU2VsZWN0ZWQpO2EuYWEoIkNoYW5nZWRTZWxlY3Rpb24iLGEuc2VsZWN0aW9uKTt9ZWxzZSBpZihiLnNoaWZ0KXtpZighYy5pc1NlbGVjdGVkKXthLmFhKCJDaGFuZ2luZ1NlbGVjdGlvbiIsYS5zZWxlY3Rpb24pO2ZvcihiPWM7bnVsbCE9PWImJiFiLmNhblNlbGVjdCgpOyl7Yj1iLmNvbnRhaW5pbmdHcm91cDt9bnVsbCE9PWImJihiLmlzU2VsZWN0ZWQ9ITApO2EuYWEoIkNoYW5nZWRTZWxlY3Rpb24iLGEuc2VsZWN0aW9uKTt9fWVsc2V7aWYoIWMuaXNTZWxlY3RlZCl7Zm9yKGI9YztudWxsIT09YiYmIWIuY2FuU2VsZWN0KCk7KXtiPWIuY29udGFpbmluZ0dyb3VwO31udWxsIT09YiYmYS5zZWxlY3QoYik7fX19ZWxzZSFiLmxlZnR8fChpYj9iLm1ldGE6Yi5jb250cm9sKXx8Yi5zaGlmdHx8YS5McygpO319O2tmLnByb3RvdHlwZS5zdGFuZGFyZE1vdXNlQ2xpY2s9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1hJiYoYT1udWxsKTt2b2lkIDA9PT1iJiYoYj1mdW5jdGlvbiBiKGEpe3JldHVybiFhLmxheWVyLmlzVGVtcG9yYXJ5O30pO3ZhciBjPXRoaXMuZGlhZ3JhbSxkPWMubGFzdElucHV0O2E9Yy5TYihkLmRvY3VtZW50UG9pbnQsYSxiKTtkLnRhcmdldE9iamVjdD1hO21mKGEsZCxjKTtyZXR1cm4gZC5oYW5kbGVkO307ZnVuY3Rpb24gbWYoYSxiLGMpe2IuaGFuZGxlZD0hMTtpZihudWxsPT09YXx8YS5yZygpKXt2YXIgZD0wO2IubGVmdD9kPTE9PT1iLmNsaWNrQ291bnQ/MToyPT09Yi5jbGlja0NvdW50PzI6MTpiLnJpZ2h0JiYxPT09Yi5jbGlja0NvdW50JiYoZD0zKTt2YXIgZT0iT2JqZWN0U2luZ2xlQ2xpY2tlZCI7aWYobnVsbCE9PWEpe3N3aXRjaChkKXtjYXNlIDE6ZT0iT2JqZWN0U2luZ2xlQ2xpY2tlZCI7YnJlYWs7Y2FzZSAyOmU9Ik9iamVjdERvdWJsZUNsaWNrZWQiO2JyZWFrO2Nhc2UgMzplPSJPYmplY3RDb250ZXh0Q2xpY2tlZCI7fTAhPT1kJiZjLmFhKGUsYSk7fWVsc2V7c3dpdGNoKGQpe2Nhc2UgMTplPSJCYWNrZ3JvdW5kU2luZ2xlQ2xpY2tlZCI7YnJlYWs7Y2FzZSAyOmU9IkJhY2tncm91bmREb3VibGVDbGlja2VkIjticmVhaztjYXNlIDM6ZT0iQmFja2dyb3VuZENvbnRleHRDbGlja2VkIjt9MCE9PWQmJmMuYWEoZSk7fWlmKG51bGwhPT1hKWZvcig7bnVsbCE9PWE7KXtjPW51bGw7c3dpdGNoKGQpe2Nhc2UgMTpjPWEuY2xpY2s7YnJlYWs7Y2FzZSAyOmM9YS5kb3VibGVDbGljaz9hLmRvdWJsZUNsaWNrOmEuY2xpY2s7YnJlYWs7Y2FzZSAzOmM9YS5jb250ZXh0Q2xpY2s7fWlmKG51bGwhPT1jJiYoYyhiLGEpLGIuaGFuZGxlZCkpYnJlYWs7YT1hLnBhbmVsO31lbHNle2E9bnVsbDtzd2l0Y2goZCl7Y2FzZSAxOmE9Yy5jbGljazticmVhaztjYXNlIDI6YT1jLmRvdWJsZUNsaWNrP2MuZG91YmxlQ2xpY2s6Yy5jbGljazticmVhaztjYXNlIDM6YT1jLmNvbnRleHRDbGljazt9bnVsbCE9PWEmJmEoYik7fX19a2YucHJvdG90eXBlLnN0YW5kYXJkTW91c2VPdmVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLGI9YS5sYXN0SW5wdXQ7aWYoITAhPT1hLmFuaW1hdGlvbk1hbmFnZXIucmIpe3ZhciBjPWEuc2tpcHNVbmRvTWFuYWdlcjthLnNraXBzVW5kb01hbmFnZXI9ITA7dmFyIGQ9YS5oZT9hLlNiKGIuZG9jdW1lbnRQb2ludCxudWxsLG51bGwpOm51bGw7Yi50YXJnZXRPYmplY3Q9ZDt2YXIgZT0hMTtpZihkIT09YS5Kayl7dmFyIGY9YS5KayxnPWY7YS5Kaz1kO3RoaXMuZG9DdXJyZW50T2JqZWN0Q2hhbmdlZChmLGQpO2ZvcihiLmhhbmRsZWQ9ITE7bnVsbCE9PWY7KXt2YXIgaD1mLm1vdXNlTGVhdmU7aWYobnVsbCE9PWgpe2lmKGQ9PT1mKWJyZWFrO2lmKG51bGwhPT1kJiZkLnFnKGYpKWJyZWFrO2goYixmLGQpO2U9ITA7aWYoYi5oYW5kbGVkKWJyZWFrO31mPWYucGFuZWw7fWY9Zztmb3IoYi5oYW5kbGVkPSExO251bGwhPT1kOyl7Zz1kLm1vdXNlRW50ZXI7aWYobnVsbCE9PWcpe2lmKGY9PT1kKWJyZWFrO2lmKG51bGwhPT1mJiZmLnFnKGQpKWJyZWFrO2coYixkLGYpO2U9ITA7aWYoYi5oYW5kbGVkKWJyZWFrO31kPWQucGFuZWw7fWQ9YS5Kazt9aWYobnVsbCE9PWQpe2Y9ZDtmb3IoZz0iIjtudWxsIT09Zjspe2c9Zi5jdXJzb3I7aWYoIiIhPT1nKWJyZWFrO2Y9Zi5wYW5lbDt9YS5jdXJyZW50Q3Vyc29yPWc7Yi5oYW5kbGVkPSExO2ZvcihmPWQ7bnVsbCE9PWY7KXtkPWYubW91c2VPdmVyO2lmKG51bGwhPT1kJiYoZChiLGYpLGU9ITAsYi5oYW5kbGVkKSlicmVhaztmPWYucGFuZWw7fX1lbHNlIGEuY3VycmVudEN1cnNvcj0iIixkPWEubW91c2VPdmVyLG51bGwhPT1kJiYoZChiKSxlPSEwKTtlJiZhLmNjKCk7YS5za2lwc1VuZG9NYW5hZ2VyPWM7fX07a2YucHJvdG90eXBlLmRvQ3VycmVudE9iamVjdENoYW5nZWQ9ZnVuY3Rpb24oKXt9O2tmLnByb3RvdHlwZS5zdGFuZGFyZE1vdXNlV2hlZWw9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW0sYj1hLmxhc3RJbnB1dCxjPWIuZGVsdGE7aWYoMCE9PWMmJmEuZG9jdW1lbnRCb3VuZHMubygpKXt2YXIgZD1hLmNvbW1hbmRIYW5kbGVyLGU9YS50b29sTWFuYWdlci5tb3VzZVdoZWVsQmVoYXZpb3I7aWYobnVsbCE9PWQmJihlPT09bmYmJiFiLnNoaWZ0fHxlPT09b2YmJmIuY29udHJvbCkmJigwPGM/ZC5jYW5JbmNyZWFzZVpvb20oKTpkLmNhbkRlY3JlYXNlWm9vbSgpKSllPWEuem9vbVBvaW50LGEuem9vbVBvaW50PWIudmlld1BvaW50LDA8Yz9kLmluY3JlYXNlWm9vbSgpOmQuZGVjcmVhc2Vab29tKCksYS56b29tUG9pbnQ9ZSxiLmJ1YmJsZXM9ITE7ZWxzZSBpZihlPT09bmYmJmIuc2hpZnR8fGU9PT1vZiYmIWIuY29udHJvbCl7ZD1hLnBvc2l0aW9uLmNvcHkoKTt2YXIgZj0wPGM/YzotYyxnPWIuZXZlbnQsaD1nLmRlbHRhTW9kZTtlPWcuZGVsdGFYO2c9Zy5kZWx0YVk7aWYoY2J8fGRifHxnYiloPTEsMDxlJiYoZT0zKSwwPmUmJihlPS0zKSwwPGcmJihnPTMpLDA+ZyYmKGc9LTMpO2lmKHZvaWQgMD09PWh8fHZvaWQgMD09PWV8fHZvaWQgMD09PWd8fDA9PT1lJiYwPT09Z3x8Yi5zaGlmdCkhYi5zaGlmdCYmYS5hbGxvd1ZlcnRpY2FsU2Nyb2xsPyhmPTMqZiphLnNjcm9sbFZlcnRpY2FsTGluZUNoYW5nZSwwPGM/YS5zY3JvbGwoInBpeGVsIiwidXAiLGYpOmEuc2Nyb2xsKCJwaXhlbCIsImRvd24iLGYpKTpiLnNoaWZ0JiZhLmFsbG93SG9yaXpvbnRhbFNjcm9sbCYmKGY9MypmKmEuc2Nyb2xsSG9yaXpvbnRhbExpbmVDaGFuZ2UsMDxjP2Euc2Nyb2xsKCJwaXhlbCIsImxlZnQiLGYpOmEuc2Nyb2xsKCJwaXhlbCIsInJpZ2h0IixmKSk7ZWxzZXtzd2l0Y2goaCl7Y2FzZSAwOmM9InBpeGVsIjticmVhaztjYXNlIDE6Yz0ibGluZSI7YnJlYWs7Y2FzZSAyOmM9InBhZ2UiO2JyZWFrO2RlZmF1bHQ6Yz0icGl4ZWwiO30wIT09ZSYmYS5hbGxvd0hvcml6b250YWxTY3JvbGwmJigwPGU/YS5zY3JvbGwoYywibGVmdCIsLWUpOmEuc2Nyb2xsKGMsInJpZ2h0IixlKSk7MCE9PWcmJmEuYWxsb3dWZXJ0aWNhbFNjcm9sbCYmKDA8Zz9hLnNjcm9sbChjLCJ1cCIsLWcpOmEuc2Nyb2xsKGMsImRvd24iLGcpKTt9YS5wb3NpdGlvbi5BKGQpfHwoYi5idWJibGVzPSExKTt9fX07a2YucHJvdG90eXBlLnN0YW5kYXJkV2FpdEFmdGVyPWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9dGhpcy5kaWFncmFtLmxhc3RJbnB1dCk7dGhpcy5jYW5jZWxXYWl0QWZ0ZXIoKTt2YXIgYz10aGlzLGQ9Yi5jbG9uZSh0aGlzLmV5KTt0aGlzLkhzPXVhKGZ1bmN0aW9uKCl7Yy5kb1dhaXRBZnRlcihkKTt9LGEpO307a2YucHJvdG90eXBlLmNhbmNlbFdhaXRBZnRlcj1mdW5jdGlvbigpey0xIT09dGhpcy5IcyYmdy5jbGVhclRpbWVvdXQodGhpcy5Icyk7dGhpcy5Icz0tMTt9O2tmLnByb3RvdHlwZS5kb1dhaXRBZnRlcj1mdW5jdGlvbigpe307a2YucHJvdG90eXBlLmZpbmRUb29sSGFuZGxlQXQ9ZnVuY3Rpb24oYSxiKXthPXRoaXMuZGlhZ3JhbS5TYihhLGZ1bmN0aW9uKGEpe2Zvcig7bnVsbCE9PWEmJiEoYS5wYW5lbCBpbnN0YW5jZW9mIHBmKTspe2E9YS5wYW5lbDt9cmV0dXJuIGE7fSk7cmV0dXJuIG51bGw9PT1hP251bGw6YS5wYXJ0LmNhdGVnb3J5PT09Yj9hOm51bGw7fTtrZi5wcm90b3R5cGUuaXNCZXlvbmREcmFnU2l6ZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZGlhZ3JhbTt2b2lkIDA9PT1hJiYoYT1jLmZpcnN0SW5wdXQudmlld1BvaW50KTt2b2lkIDA9PT1iJiYoYj1jLmxhc3RJbnB1dC52aWV3UG9pbnQpO3ZhciBkPWMudG9vbE1hbmFnZXIuZHJhZ1NpemUsZT1kLndpZHRoO2Q9ZC5oZWlnaHQ7Yy5maXJzdElucHV0LmlzVG91Y2hFdmVudCYmKGUrPTYsZCs9Nik7cmV0dXJuIE1hdGguYWJzKGIueC1hLngpPmV8fE1hdGguYWJzKGIueS1hLnkpPmQ7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhrZi5wcm90b3R5cGUse2RpYWdyYW06e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DO30sc2V0OmZ1bmN0aW9uIHNldChhKXthIGluc3RhbmNlb2YgUCYmKHRoaXMuQz1hKTt9fSxuYW1lOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVWE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVWE9YTt9fSxpc0VuYWJsZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5EYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5EYz1hO319LGlzQWN0aXZlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVmI9YTt9fSx0cmFuc2FjdGlvblJlc3VsdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmR3O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmR3PWE7fX19KTtrZi5wcm90b3R5cGUuc3RvcFRyYW5zYWN0aW9uPWtmLnByb3RvdHlwZS52ZztrZi5wcm90b3R5cGUuc3RhcnRUcmFuc2FjdGlvbj1rZi5wcm90b3R5cGUuQWE7a2YuY2xhc3NOYW1lPSJUb29sIjtmdW5jdGlvbiBVYSgpe2tmLmNhbGwodGhpcyk7dGhpcy5uYW1lPSJUb29sTWFuYWdlciI7dGhpcy5LYz1uZXcgRSgpO3RoaXMuVmM9bmV3IEUoKTt0aGlzLndnPW5ldyBFKCk7dGhpcy5iYT10aGlzLkxhPTg1MDt0aGlzLnU9bmV3IEsoMiwyKS5nYSgpO3RoaXMuV2I9NUUzO3RoaXMuTWE9b2Y7dGhpcy5LPXFmO3RoaXMuWHE9dGhpcy5sPW51bGw7dGhpcy5Laj0tMTt9b2EoVWEsa2YpO1VhLnByb3RvdHlwZS5pbml0aWFsaXplU3RhbmRhcmRUb29scz1mdW5jdGlvbigpe307VWEucHJvdG90eXBlLnVwZGF0ZUFkb3JubWVudHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdXJyZW50VG9vbFRpcDtpZihiIGluc3RhbmNlb2YgcGYmJnRoaXMuWHE9PT1hKXt2YXIgYz1iLmFkb3JuZWRPYmplY3Q7KG51bGwhPT1hP2MucGFydD09PWE6bnVsbD09PWMpP3RoaXMuc2hvd1Rvb2xUaXAoYixjKTp0aGlzLmhpZGVUb29sVGlwKCk7fX07VWEucHJvdG90eXBlLmRvTW91c2VEb3duPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLGI9YS5sYXN0SW5wdXQ7Yi5pc1RvdWNoRXZlbnQmJnRoaXMuZ2VzdHVyZUJlaGF2aW9yPT09cmYmJihiLmJ1YmJsZXM9ITEpO2lmKGIuaXNNdWx0aVRvdWNoKXt0aGlzLmNhbmNlbFdhaXRBZnRlcigpO2lmKHRoaXMuZ2VzdHVyZUJlaGF2aW9yPT09c2Ype2IuYnViYmxlcz0hMDtyZXR1cm47fWlmKHRoaXMuZ2VzdHVyZUJlaGF2aW9yPT09cmYpcmV0dXJuO2lmKGEuY3VycmVudFRvb2wuY2FuU3RhcnRNdWx0aVRvdWNoKCkpe2EuY3VycmVudFRvb2wuc3RhbmRhcmRQaW5jaFpvb21TdGFydCgpO3JldHVybjt9fWZvcih2YXIgYz10aGlzLm1vdXNlRG93blRvb2xzLmxlbmd0aCxkPTA7ZDxjO2QrKyl7dmFyIGU9dGhpcy5tb3VzZURvd25Ub29scy5OKGQpO2UuaGIodGhpcy5kaWFncmFtKTtpZihlLmNhblN0YXJ0KCkpe2EuZG9Gb2N1cygpO2EuY3VycmVudFRvb2w9ZTthLmN1cnJlbnRUb29sPT09ZSYmKGUuaXNBY3RpdmV8fGUuZG9BY3RpdmF0ZSgpLGUuZG9Nb3VzZURvd24oKSk7cmV0dXJuO319MT09PWEubGFzdElucHV0LmJ1dHRvbiYmKHRoaXMubW91c2VXaGVlbEJlaGF2aW9yPT09b2Y/dGhpcy5tb3VzZVdoZWVsQmVoYXZpb3I9bmY6dGhpcy5tb3VzZVdoZWVsQmVoYXZpb3I9PT1uZiYmKHRoaXMubW91c2VXaGVlbEJlaGF2aW9yPW9mKSk7dGhpcy5kb0FjdGl2YXRlKCk7dGhpcy5zdGFuZGFyZFdhaXRBZnRlcih0aGlzLmhvbGREZWxheSxiKTt9O1VhLnByb3RvdHlwZS5kb01vdXNlTW92ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbSxiPWEubGFzdElucHV0O2lmKGIuaXNNdWx0aVRvdWNoKXtpZih0aGlzLmdlc3R1cmVCZWhhdmlvcj09PXNmKXtiLmJ1YmJsZXM9ITA7cmV0dXJuO31pZih0aGlzLmdlc3R1cmVCZWhhdmlvcj09PXJmKXJldHVybjtpZihhLmN1cnJlbnRUb29sLmNhblN0YXJ0TXVsdGlUb3VjaCgpKXthLmN1cnJlbnRUb29sLnN0YW5kYXJkUGluY2hab29tTW92ZSgpO3JldHVybjt9fWlmKHRoaXMuaXNBY3RpdmUpZm9yKHZhciBjPXRoaXMubW91c2VNb3ZlVG9vbHMubGVuZ3RoLGQ9MDtkPGM7ZCsrKXt2YXIgZT10aGlzLm1vdXNlTW92ZVRvb2xzLk4oZCk7ZS5oYih0aGlzLmRpYWdyYW0pO2lmKGUuY2FuU3RhcnQoKSl7YS5kb0ZvY3VzKCk7YS5jdXJyZW50VG9vbD1lO2EuY3VycmVudFRvb2w9PT1lJiYoZS5pc0FjdGl2ZXx8ZS5kb0FjdGl2YXRlKCksZS5kb01vdXNlTW92ZSgpKTtyZXR1cm47fX10Zih0aGlzLGEpO2E9Yi5ldmVudDtudWxsPT09YXx8Im1vdXNlbW92ZSIhPT1hLnR5cGUmJiJwb2ludGVybW92ZSIhPT1hLnR5cGUmJmEuY2FuY2VsYWJsZXx8KGIuYnViYmxlcz0hMCk7fTtmdW5jdGlvbiB0ZihhLGIpe2Euc3RhbmRhcmRNb3VzZU92ZXIoKTthLmlzQmV5b25kRHJhZ1NpemUoKSYmYS5zdGFuZGFyZFdhaXRBZnRlcihhLmlzQWN0aXZlP2EuaG9sZERlbGF5OmEuaG92ZXJEZWxheSxiLmxhc3RJbnB1dCk7fVVhLnByb3RvdHlwZS5kb0N1cnJlbnRPYmplY3RDaGFuZ2VkPWZ1bmN0aW9uKGEsYil7YT10aGlzLmN1cnJlbnRUb29sVGlwO251bGw9PT1hfHxudWxsIT09YiYmYSBpbnN0YW5jZW9mIHBmJiYoYj09PWF8fGIucWcoYSkpfHx0aGlzLmhpZGVUb29sVGlwKCk7fTtVYS5wcm90b3R5cGUuZG9XYWl0QWZ0ZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kaWFncmFtO2IuRGEmJih0aGlzLmRvTW91c2VIb3ZlcigpLHRoaXMuaXNBY3RpdmV8fHRoaXMuZG9Ub29sVGlwKCksYS5pc1RvdWNoRXZlbnQmJiFiLmxhc3RJbnB1dC5oYW5kbGVkJiYoYT1hLmNvcHkoKSxhLmJ1dHRvbj0yLGEuYnV0dG9ucz0yLGIubGFzdElucHV0PWEsYi5NbD0hMCxiLmRvTW91c2VVcCgpKSk7fTtVYS5wcm90b3R5cGUuZG9Nb3VzZUhvdmVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLGI9YS5sYXN0SW5wdXQ7bnVsbD09PWIudGFyZ2V0T2JqZWN0JiYoYi50YXJnZXRPYmplY3Q9YS5TYihiLmRvY3VtZW50UG9pbnQsbnVsbCxudWxsKSk7dmFyIGM9Yi50YXJnZXRPYmplY3Q7aWYobnVsbCE9PWMpZm9yKGIuaGFuZGxlZD0hMTtudWxsIT09Yzspe2E9dGhpcy5pc0FjdGl2ZT9jLm1vdXNlSG9sZDpjLm1vdXNlSG92ZXI7aWYobnVsbCE9PWEmJihhKGIsYyksYi5oYW5kbGVkKSlicmVhaztjPWMucGFuZWw7fWVsc2UgYz10aGlzLmlzQWN0aXZlP2EubW91c2VIb2xkOmEubW91c2VIb3ZlcixudWxsIT09YyYmYyhiKTt9O1VhLnByb3RvdHlwZS5kb1Rvb2xUaXA9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW0sYj1hLmxhc3RJbnB1dDtudWxsPT09Yi50YXJnZXRPYmplY3QmJihiLnRhcmdldE9iamVjdD1hLlNiKGIuZG9jdW1lbnRQb2ludCxudWxsLG51bGwpKTtiPWIudGFyZ2V0T2JqZWN0O2lmKG51bGwhPT1iKXtpZihhPXRoaXMuY3VycmVudFRvb2xUaXAsIShhIGluc3RhbmNlb2YgcGYpfHxiIT09YSYmIWIucWcoYSkpe2Zvcig7bnVsbCE9PWI7KXthPWIudG9vbFRpcDtpZihudWxsIT09YSl7dGhpcy5zaG93VG9vbFRpcChhLGIpO3JldHVybjt9Yj1iLnBhbmVsO310aGlzLmhpZGVUb29sVGlwKCk7fX1lbHNlIGI9YS50b29sVGlwLG51bGwhPT1iP3RoaXMuc2hvd1Rvb2xUaXAoYixudWxsKTp0aGlzLmhpZGVUb29sVGlwKCk7fTtVYS5wcm90b3R5cGUuc2hvd1Rvb2xUaXA9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmRpYWdyYW07YSE9PXRoaXMuY3VycmVudFRvb2xUaXAmJnRoaXMuaGlkZVRvb2xUaXAoKTtpZihhIGluc3RhbmNlb2YgcGYpe2EubGF5ZXJOYW1lPSJUb29sIjthLnNlbGVjdGFibGU9ITE7YS5zY2FsZT0xL2Muc2NhbGU7YS5jYXRlZ29yeT0iVG9vbFRpcCI7bnVsbCE9PWEucGxhY2Vob2xkZXImJihhLnBsYWNlaG9sZGVyLnNjYWxlPWMuc2NhbGUpO3ZhciBkPWEuZGlhZ3JhbTtudWxsIT09ZCYmZCE9PWMmJmQucmVtb3ZlKGEpO2MuYWRkKGEpO251bGwhPT1iP2EuYWRvcm5lZE9iamVjdD1iOmEuZGF0YT1jLm1vZGVsO2EuYWMoKTt0aGlzLnBvc2l0aW9uVG9vbFRpcChhLGIpO31lbHNlIGEgaW5zdGFuY2VvZiB1ZiYmYSE9PXRoaXMuY3VycmVudFRvb2xUaXAmJmEuc2hvdyhiLGMsdGhpcyk7dGhpcy5jdXJyZW50VG9vbFRpcD1hOy0xIT09dGhpcy5LaiYmKHcuY2xlYXJUaW1lb3V0KHRoaXMuS2opLHRoaXMuS2o9LTEpO2E9dGhpcy50b29sVGlwRHVyYXRpb247aWYoMDxhJiZJbmZpbml0eSE9PWEpe3ZhciBlPXRoaXM7dGhpcy5Laj11YShmdW5jdGlvbigpe2UuaGlkZVRvb2xUaXAoKTt9LGEpO319O1VhLnByb3RvdHlwZS5wb3NpdGlvblRvb2xUaXA9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEucGxhY2Vob2xkZXIpe3ZhciBiPXRoaXMuZGlhZ3JhbSxjPWIubGFzdElucHV0LmRvY3VtZW50UG9pbnQuY29weSgpLGQ9YS5tZWFzdXJlZEJvdW5kcyxlPWIudmlld3BvcnRCb3VuZHM7Yi5sYXN0SW5wdXQuaXNUb3VjaEV2ZW50JiYoYy54LT1kLndpZHRoKTtjLngrZC53aWR0aD5lLnJpZ2h0JiYoYy54LT1kLndpZHRoKzUvYi5zY2FsZSk7Yy54PGUueCYmKGMueD1lLngpO2MueT1jLnkrMjAvYi5zY2FsZStkLmhlaWdodD5lLmJvdHRvbT9jLnktKGQuaGVpZ2h0KzUvYi5zY2FsZSk6Yy55KzIwL2Iuc2NhbGU7Yy55PGUueSYmKGMueT1lLnkpO2EucG9zaXRpb249Yzt9fTtVYS5wcm90b3R5cGUuaGlkZVRvb2xUaXA9ZnVuY3Rpb24oKXstMSE9PXRoaXMuS2omJih3LmNsZWFyVGltZW91dCh0aGlzLktqKSx0aGlzLktqPS0xKTt2YXIgYT10aGlzLmRpYWdyYW0sYj10aGlzLmN1cnJlbnRUb29sVGlwO251bGwhPT1iJiYoYiBpbnN0YW5jZW9mIHBmPyhhLnJlbW92ZShiKSxudWxsIT09dGhpcy5YcSYmdGhpcy5YcS50ZihiLmNhdGVnb3J5KSxiLmRhdGE9bnVsbCxiLmFkb3JuZWRPYmplY3Q9bnVsbCk6YiBpbnN0YW5jZW9mIHVmJiZudWxsIT09Yi5oaWRlJiZiLmhpZGUoYSx0aGlzKSx0aGlzLmN1cnJlbnRUb29sVGlwPW51bGwpO307VWEucHJvdG90eXBlLmRvTW91c2VVcD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsV2FpdEFmdGVyKCk7dmFyIGE9dGhpcy5kaWFncmFtO2lmKHRoaXMuaXNBY3RpdmUpZm9yKHZhciBiPXRoaXMubW91c2VVcFRvb2xzLmxlbmd0aCxjPTA7YzxiO2MrKyl7dmFyIGQ9dGhpcy5tb3VzZVVwVG9vbHMuTihjKTtkLmhiKHRoaXMuZGlhZ3JhbSk7aWYoZC5jYW5TdGFydCgpKXthLmRvRm9jdXMoKTthLmN1cnJlbnRUb29sPWQ7YS5jdXJyZW50VG9vbD09PWQmJihkLmlzQWN0aXZlfHxkLmRvQWN0aXZhdGUoKSxkLmRvTW91c2VVcCgpKTtyZXR1cm47fX1hLmRvRm9jdXMoKTt0aGlzLmRvRGVhY3RpdmF0ZSgpO307VWEucHJvdG90eXBlLmRvTW91c2VXaGVlbD1mdW5jdGlvbigpe3RoaXMuc3RhbmRhcmRNb3VzZVdoZWVsKCk7fTtVYS5wcm90b3R5cGUuZG9LZXlEb3duPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO251bGwhPT1hLmNvbW1hbmRIYW5kbGVyJiZhLmNvbW1hbmRIYW5kbGVyLmRvS2V5RG93bigpO307VWEucHJvdG90eXBlLmRvS2V5VXA9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07bnVsbCE9PWEuY29tbWFuZEhhbmRsZXImJmEuY29tbWFuZEhhbmRsZXIuZG9LZXlVcCgpO307VWEucHJvdG90eXBlLmZpbmRUb29sPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLm1vdXNlRG93blRvb2xzLmxlbmd0aCxjPTA7YzxiO2MrKyl7dmFyIGQ9dGhpcy5tb3VzZURvd25Ub29scy5OKGMpO2lmKGQubmFtZT09PWEpcmV0dXJuIGQ7fWI9dGhpcy5tb3VzZU1vdmVUb29scy5sZW5ndGg7Zm9yKGM9MDtjPGI7YysrKXtpZihkPXRoaXMubW91c2VNb3ZlVG9vbHMuTihjKSxkLm5hbWU9PT1hKXJldHVybiBkO31iPXRoaXMubW91c2VVcFRvb2xzLmxlbmd0aDtmb3IoYz0wO2M8YjtjKyspe2lmKGQ9dGhpcy5tb3VzZVVwVG9vbHMuTihjKSxkLm5hbWU9PT1hKXJldHVybiBkO31yZXR1cm4gbnVsbDt9O1VhLnByb3RvdHlwZS5yZXBsYWNlVG9vbD1mdW5jdGlvbihhLGIpe251bGwhPT1iJiZiLmhiKHRoaXMuZGlhZ3JhbSk7Zm9yKHZhciBjPXRoaXMubW91c2VEb3duVG9vbHMubGVuZ3RoLGQ9MDtkPGM7ZCsrKXt2YXIgZT10aGlzLm1vdXNlRG93blRvb2xzLk4oZCk7aWYoZS5uYW1lPT09YSlyZXR1cm4gbnVsbCE9PWI/dGhpcy5tb3VzZURvd25Ub29scy5nZChkLGIpOnRoaXMubW91c2VEb3duVG9vbHMubWIoZCksZTt9Yz10aGlzLm1vdXNlTW92ZVRvb2xzLmxlbmd0aDtmb3IoZD0wO2Q8YztkKyspe2lmKGU9dGhpcy5tb3VzZU1vdmVUb29scy5OKGQpLGUubmFtZT09PWEpcmV0dXJuIG51bGwhPT1iP3RoaXMubW91c2VNb3ZlVG9vbHMuZ2QoZCxiKTp0aGlzLm1vdXNlTW92ZVRvb2xzLm1iKGQpLGU7fWM9dGhpcy5tb3VzZVVwVG9vbHMubGVuZ3RoO2ZvcihkPTA7ZDxjO2QrKyl7aWYoZT10aGlzLm1vdXNlVXBUb29scy5OKGQpLGUubmFtZT09PWEpcmV0dXJuIG51bGwhPT1iP3RoaXMubW91c2VVcFRvb2xzLmdkKGQsYik6dGhpcy5tb3VzZVVwVG9vbHMubWIoZCksZTt9cmV0dXJuIG51bGw7fTtmdW5jdGlvbiB2ZihhLGIsYyxkKXtudWxsIT09YyYmKGMubmFtZT1iLGMuaGIoYS5kaWFncmFtKSk7YS5maW5kVG9vbChiKT9hLnJlcGxhY2VUb29sKGIsYyk6bnVsbCE9PWMmJmQuYWRkKGMpO31wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhVYS5wcm90b3R5cGUse21vdXNlV2hlZWxCZWhhdmlvcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1hO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk1hPWE7fX0sZ2VzdHVyZUJlaGF2aW9yOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LPWE7fX0sY3VycmVudFRvb2xUaXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmw9YTt0aGlzLlhxPW51bGwhPT1hJiZhIGluc3RhbmNlb2YgcGY/YS5hZG9ybmVkUGFydDpudWxsO319LG1vdXNlRG93blRvb2xzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuS2M7fX0sbW91c2VNb3ZlVG9vbHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5WYzt9fSxtb3VzZVVwVG9vbHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53Zzt9fSxob3ZlckRlbGF5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTGE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTGE9YTt9fSxob2xkRGVsYXk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5iYTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5iYT1hO319LGRyYWdTaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy51PWEuSSgpO319LHRvb2xUaXBEdXJhdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLldiO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLldiPWE7fX19KTt2YXIgb2Y9bmV3IEQoVWEsIldoZWVsU2Nyb2xsIiwwKSxuZj1uZXcgRChVYSwiV2hlZWxab29tIiwxKSx3Zj1uZXcgRChVYSwiV2hlZWxOb25lIiwyKSxxZj1uZXcgRChVYSwiR2VzdHVyZVpvb20iLDMpLHJmPW5ldyBEKFVhLCJHZXN0dXJlQ2FuY2VsIiw0KSxzZj1uZXcgRChVYSwiR2VzdHVyZU5vbmUiLDUpO1VhLmNsYXNzTmFtZT0iVG9vbE1hbmFnZXIiO1VhLldoZWVsU2Nyb2xsPW9mO1VhLldoZWVsWm9vbT1uZjtVYS5XaGVlbE5vbmU9d2Y7VWEuR2VzdHVyZVpvb209cWY7VWEuR2VzdHVyZUNhbmNlbD1yZjtVYS5HZXN0dXJlTm9uZT1zZjtmdW5jdGlvbiB4Zigpe2tmLmNhbGwodGhpcyk7dGhpcy5uYW1lPSJEcmFnZ2luZyI7dGhpcy5LPXRoaXMuS2M9ITA7dGhpcy51PXRoaXMuTWE9dGhpcy5iYT10aGlzLmJnPW51bGw7dGhpcy55bj10aGlzLlZjPSExO3RoaXMuSGw9bmV3IEcoTmFOLE5hTik7dGhpcy54cz1uZXcgRygpO3RoaXMuV2I9ITA7dGhpcy5Raz0xMDA7dGhpcy5IZz1bXTt0aGlzLndnPW5ldyBGKCkuZnJlZXplKCk7dGhpcy5MYT1uZXcgeWYoKTt9b2EoeGYsa2YpO3hmLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07aWYoYS5pc1JlYWRPbmx5JiYhYS5hbGxvd0RyYWdPdXR8fCFhLmFsbG93TW92ZSYmIWEuYWxsb3dDb3B5JiYhYS5hbGxvd0RyYWdPdXR8fCFhLmFsbG93U2VsZWN0KXJldHVybiExO3ZhciBiPWEubGFzdElucHV0O3JldHVybiFiLmxlZnR8fGEuY3VycmVudFRvb2whPT10aGlzJiYoIXRoaXMuaXNCZXlvbmREcmFnU2l6ZSgpfHxiLmlzVG91Y2hFdmVudCYmYi50aW1lc3RhbXAtYS5maXJzdElucHV0LnRpbWVzdGFtcDx0aGlzLlFrKT8hMTpudWxsIT09dGhpcy5maW5kRHJhZ2dhYmxlUGFydCgpO307eGYucHJvdG90eXBlLmZpbmREcmFnZ2FibGVQYXJ0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2E9YS4kbChhLmZpcnN0SW5wdXQuZG9jdW1lbnRQb2ludCwhMSk7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7Zm9yKDtudWxsIT09YSYmIWEuY2FuU2VsZWN0KCk7KXthPWEuY29udGFpbmluZ0dyb3VwO31yZXR1cm4gbnVsbCE9PWEmJihhLmNhbk1vdmUoKXx8YS5jYW5Db3B5KCkpP2E6bnVsbDt9O3hmLnByb3RvdHlwZS5zdGFuZGFyZE1vdXNlU2VsZWN0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKGEuYWxsb3dTZWxlY3Qpe3ZhciBiPWEuJGwoYS5maXJzdElucHV0LmRvY3VtZW50UG9pbnQsITEpO2lmKG51bGwhPT1iKXtmb3IoO251bGwhPT1iJiYhYi5jYW5TZWxlY3QoKTspe2I9Yi5jb250YWluaW5nR3JvdXA7fXRoaXMuY3VycmVudFBhcnQ9YjtudWxsPT09dGhpcy5jdXJyZW50UGFydHx8dGhpcy5jdXJyZW50UGFydC5pc1NlbGVjdGVkfHwoYS5hYSgiQ2hhbmdpbmdTZWxlY3Rpb24iLGEuc2VsZWN0aW9uKSxiPWEubGFzdElucHV0LChpYj9iLm1ldGE6Yi5jb250cm9sKXx8Yi5zaGlmdHx8SGYoYSksdGhpcy5jdXJyZW50UGFydC5pc1NlbGVjdGVkPSEwLGEuYWEoIkNoYW5nZWRTZWxlY3Rpb24iLGEuc2VsZWN0aW9uKSk7fX19O3hmLnByb3RvdHlwZS5kb0FjdGl2YXRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO251bGw9PT10aGlzLmN1cnJlbnRQYXJ0JiZ0aGlzLnN0YW5kYXJkTW91c2VTZWxlY3QoKTt2YXIgYj10aGlzLmN1cnJlbnRQYXJ0O251bGwhPT1iJiYoYi5jYW5Nb3ZlKCl8fGIuY2FuQ29weSgpKSYmKElmPW51bGwsdGhpcy5pc0FjdGl2ZT0hMCx0aGlzLkhsLnNldChhLnBvc2l0aW9uKSxKZih0aGlzLGEuc2VsZWN0aW9uKSx0aGlzLkhnLmxlbmd0aD0wLHRoaXMuZHJhZ2dlZFBhcnRzPXRoaXMuY29tcHV0ZUVmZmVjdGl2ZUNvbGxlY3Rpb24oYS5zZWxlY3Rpb24sdGhpcy5kcmFnT3B0aW9ucyksYS5VaT0hMCwhMD09PWEuRGUoInRlbXBvcmFyeVBpeGVsUmF0aW8iKSYmMzA8YS5WdyYmS2YoYSksTGYoYSx0aGlzLmRyYWdnZWRQYXJ0cyksdGhpcy5BYSgiRHJhZyIpLHRoaXMuc3RhcnRQb2ludD1hLmZpcnN0SW5wdXQuZG9jdW1lbnRQb2ludCxhLmlzTW91c2VDYXB0dXJlZD0hMCxhLmFsbG93RHJhZ091dCYmKHRoaXMuaXNEcmFnT3V0U3RhcnRlZD0hMCx0aGlzLnluPSExLElmPXRoaXMsTWY9dGhpcy5kaWFncmFtLHRoaXMuZG9TaW11bGF0ZWREcmFnT3V0KCkpKTt9O2Z1bmN0aW9uIEpmKGEsYil7aWYoYS5kcmFnc0xpbmspe3ZhciBjPWEuZGlhZ3JhbTtjLmFsbG93UmVsaW5rJiYoYy5tb2RlbC5jaygpJiYxPT09Yi5jb3VudCYmYi5maXJzdCgpaW5zdGFuY2VvZiBTPyhhLmRyYWdnZWRMaW5rPWIuZmlyc3QoKSxhLmRyYWdnZWRMaW5rLmNhblJlbGlua0Zyb20oKSYmYS5kcmFnZ2VkTGluay5jYW5SZWxpbmtUbygpJiZhLmRyYWdnZWRMaW5rLlNqKCksYS5iZz1jLnRvb2xNYW5hZ2VyLmZpbmRUb29sKCJSZWxpbmtpbmciKSxudWxsPT09YS5iZyYmKGEuYmc9bmV3IE5mKCksYS5iZy5oYihjKSkpOihhLmRyYWdnZWRMaW5rPW51bGwsYS5iZz1udWxsKSk7fX14Zi5wcm90b3R5cGUuY29tcHV0ZUVmZmVjdGl2ZUNvbGxlY3Rpb249ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5kaWFncmFtLmNvbW1hbmRIYW5kbGVyLmNvbXB1dGVFZmZlY3RpdmVDb2xsZWN0aW9uKGEsYik7fTt4Zi5wcm90b3R5cGUucGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/bmV3IE9mKGFjKTp0aGlzLmlzR3JpZFNuYXBFbmFibGVkP25ldyBPZihuZXcgRyhNYXRoLnJvdW5kKGEueCksTWF0aC5yb3VuZChhLnkpKSk6bmV3IE9mKGEuY29weSgpKTt9O3hmLnByb3RvdHlwZS5kb0RlYWN0aXZhdGU9ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlPSExO3ZhciBhPXRoaXMuZGlhZ3JhbTthLnZmKCk7UGYodGhpcyk7UWYoYSx0aGlzLmRyYWdnZWRQYXJ0cyk7dGhpcy5kcmFnZ2VkUGFydHM9dGhpcy5jdXJyZW50UGFydD1udWxsO3RoaXMueW49dGhpcy5pc0RyYWdPdXRTdGFydGVkPSExO2lmKDA8UmYuY291bnQpe2Zvcih2YXIgYj1SZixjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXt2YXIgZT1iLk4oZCk7U2YoZSk7VGYoZSk7UGYoZSk7ZS5kaWFncmFtLnZmKCk7fWIuY2xlYXIoKTt9U2YodGhpcyk7dGhpcy5IbC5oKE5hTixOYU4pO0lmPU1mPW51bGw7VGYodGhpcyk7YS5pc01vdXNlQ2FwdHVyZWQ9ITE7YS5jdXJyZW50Q3Vyc29yPSIiO2EuVWk9ITE7dGhpcy52ZygpO1VmKGEsITApO307ZnVuY3Rpb24gUGYoYSl7dmFyIGI9YS5kaWFncmFtLGM9Yi5za2lwc1VuZG9NYW5hZ2VyO2Iuc2tpcHNVbmRvTWFuYWdlcj0hMDtWZihhLGIubGFzdElucHV0LG51bGwpO2Iuc2tpcHNVbmRvTWFuYWdlcj1jO2EuSGcubGVuZ3RoPTA7fWZ1bmN0aW9uIFdmKCl7dmFyIGE9SWY7VGYoYSk7WGYoYSk7dmFyIGI9YS5kaWFncmFtO2EuSGwubygpJiYoYi5wb3NpdGlvbj1hLkhsKTtiLnZmKCk7fXhmLnByb3RvdHlwZS5kb0NhbmNlbD1mdW5jdGlvbigpe1RmKHRoaXMpO1hmKHRoaXMpO3ZhciBhPXRoaXMuZGlhZ3JhbTt0aGlzLkhsLm8oKSYmKGEucG9zaXRpb249dGhpcy5IbCk7dGhpcy5zdG9wVG9vbCgpO307eGYucHJvdG90eXBlLmRvS2V5RG93bj1mdW5jdGlvbigpe3RoaXMuaXNBY3RpdmUmJigiRXNjIj09PXRoaXMuZGlhZ3JhbS5sYXN0SW5wdXQua2V5P3RoaXMuZG9DYW5jZWwoKTp0aGlzLmRvTW91c2VNb3ZlKCkpO307eGYucHJvdG90eXBlLmRvS2V5VXA9ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlJiZ0aGlzLmRvTW91c2VNb3ZlKCk7fTtmdW5jdGlvbiBZZihhLGIpe3ZhciBjPUluZmluaXR5LGQ9SW5maW5pdHksZT0tSW5maW5pdHksZj0tSW5maW5pdHk7Zm9yKGE9YS5pdGVyYXRvcjthLm5leHQoKTspe3ZhciBnPWEudmFsdWU7aWYoZy5MYigpJiZnLmlzVmlzaWJsZSgpKXt2YXIgaD1nLmxvY2F0aW9uO2c9aC54O2g9aC55O2lzTmFOKGcpfHxpc05hTihoKXx8KGc8YyYmKGM9ZyksaDxkJiYoZD1oKSxnPmUmJihlPWcpLGg+ZiYmKGY9aCkpO319SW5maW5pdHk9PT1jP2IuaCgwLDAsMCwwKTpiLmgoYyxkLGUtYyxmLWQpO31mdW5jdGlvbiBaZihhLGIpe2lmKG51bGw9PT1hLmNvcGllZFBhcnRzKXt2YXIgYz1hLmRpYWdyYW07aWYoKCFifHwhYy5pc1JlYWRPbmx5JiYhYy5pc01vZGVsUmVhZE9ubHkpJiZudWxsIT09YS5kcmFnZ2VkUGFydHMpe3ZhciBkPWMudW5kb01hbmFnZXI7ZC5pc0VuYWJsZWQmJmQuaXNJblRyYW5zYWN0aW9uP251bGwhPT1kLmN1cnJlbnRUcmFuc2FjdGlvbiYmMDxkLmN1cnJlbnRUcmFuc2FjdGlvbi5jaGFuZ2VzLmNvdW50JiYoYy51bmRvTWFuYWdlci51ZigpLGMuQWEoIkRyYWciKSk6WGYoYSk7Yy5za2lwc1VuZG9NYW5hZ2VyPSFiO2MucGFydE1hbmFnZXIuYWRkc1RvVGVtcG9yYXJ5TGF5ZXI9IWI7YS5zdGFydFBvaW50PWMuZmlyc3RJbnB1dC5kb2N1bWVudFBvaW50O2I9YS5jb3BpZXNFZmZlY3RpdmVDb2xsZWN0aW9uP2EuZHJhZ2dlZFBhcnRzLllkKCk6Yy5zZWxlY3Rpb247Yz1jLlhqKGIsYywhMCk7Zm9yKGI9Yy5pdGVyYXRvcjtiLm5leHQoKTspe2IudmFsdWUubG9jYXRpb249Yi5rZXkubG9jYXRpb247fWI9Ti5hbGxvYygpO1lmKGMsYik7Ti5mcmVlKGIpO2I9bmV3IExiKCk7Zm9yKGQ9YS5kcmFnZ2VkUGFydHMuaXRlcmF0b3I7ZC5uZXh0KCk7KXt2YXIgZT1kLmtleTtlLkxiKCkmJmUuY2FuQ29weSgpJiYoZT1jLkooZSksbnVsbCE9PWUmJihlLmFjKCksYi5hZGQoZSxhLnBkKGUubG9jYXRpb24pKSkpO31mb3IoYz1jLml0ZXJhdG9yO2MubmV4dCgpOyl7ZD1jLnZhbHVlLGQgaW5zdGFuY2VvZiBTJiZkLmNhbkNvcHkoKSYmYi5hZGQoZCxhLnBkKCkpO31hLmNvcGllZFBhcnRzPWI7SmYoYSxiLllkKCkpO251bGwhPT1hLmRyYWdnZWRMaW5rJiYoYz1hLmRyYWdnZWRMaW5rLGI9Yy5yb3V0ZUJvdW5kcywkZihjLGEuc3RhcnRQb2ludC54LShiLngrYi53aWR0aC8yKSxhLnN0YXJ0UG9pbnQueS0oYi55K2IuaGVpZ2h0LzIpKSk7fX19ZnVuY3Rpb24gVGYoYSl7dmFyIGI9YS5kaWFncmFtO2lmKG51bGwhPT1hLmNvcGllZFBhcnRzJiYoYi5ydChhLmNvcGllZFBhcnRzLllkKCksITEpLGEuY29waWVkUGFydHM9bnVsbCxudWxsIT09YS5kcmFnZ2VkUGFydHMpKWZvcih2YXIgYz1hLmRyYWdnZWRQYXJ0cy5pdGVyYXRvcjtjLm5leHQoKTspe2Mua2V5IGluc3RhbmNlb2YgUyYmKGMudmFsdWUucG9pbnQ9bmV3IEcoMCwwKSk7fWIuc2tpcHNVbmRvTWFuYWdlcj0hMTtiLnBhcnRNYW5hZ2VyLmFkZHNUb1RlbXBvcmFyeUxheWVyPSExO2Euc3RhcnRQb2ludD1iLmZpcnN0SW5wdXQuZG9jdW1lbnRQb2ludDt9ZnVuY3Rpb24gU2YoYSl7aWYobnVsbCE9PWEuZHJhZ2dlZExpbmspe2lmKGEuZHJhZ3NMaW5rJiZudWxsIT09YS5iZyl7dmFyIGI9YS5iZztiLmRpYWdyYW0ucmVtb3ZlKGIudGVtcG9yYXJ5RnJvbU5vZGUpO2IuZGlhZ3JhbS5yZW1vdmUoYi50ZW1wb3JhcnlUb05vZGUpO31hLmRyYWdnZWRMaW5rPW51bGw7YS5iZz1udWxsO319ZnVuY3Rpb24gYWcoYSxiLGMpe3ZhciBkPWEuZGlhZ3JhbSxlPWEuc3RhcnRQb2ludCxmPUcuYWxsb2MoKTtmLmFzc2lnbihkLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50KTthLm1vdmVQYXJ0cyhiLGYuWGQoZSksYyk7Ry5mcmVlKGYpOyEwPT09ZC5EZSgidGVtcG9yYXJ5UGl4ZWxSYXRpbyIpJiZudWxsPT09ZC5qaCYmMzA8ZC5WdyYmKEtmKGQpLGQub3QoKSk7fXhmLnByb3RvdHlwZS5tb3ZlUGFydHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZGlhZ3JhbTtudWxsIT09ZCYmYmcoZCxhLGIsdGhpcy5kcmFnT3B0aW9ucyxjKTt9O2Z1bmN0aW9uIFhmKGEpe2lmKG51bGwhPT1hLmRyYWdnZWRQYXJ0cyl7Zm9yKHZhciBiPWEuZGlhZ3JhbSxjPWEuZHJhZ2dlZFBhcnRzLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGQ9Yy5rZXk7ZC5MYigpJiYoZC5sb2NhdGlvbj1jLnZhbHVlLnBvaW50KTt9Zm9yKGM9YS5kcmFnZ2VkUGFydHMuaXRlcmF0b3I7Yy5uZXh0KCk7KXtpZihkPWMua2V5LGQgaW5zdGFuY2VvZiBTJiZkLnN1c3BlbmRzUm91dGluZyl7dmFyIGU9Yy52YWx1ZS5wb2ludDthLmRyYWdnZWRQYXJ0cy5hZGQoZCxhLnBkKCkpOyRmKGQsLWUueCwtZS55KTt9fWIuZmQoKTt9fWZ1bmN0aW9uIGRnKGEsYil7aWYobnVsbD09PWIpcmV0dXJuITA7Yj1iLnBhcnQ7cmV0dXJuIG51bGw9PT1ifHxiIGluc3RhbmNlb2YgcGZ8fGIubGF5ZXIuaXNUZW1wb3Jhcnl8fGEuZHJhZ2dlZFBhcnRzJiZhLmRyYWdnZWRQYXJ0cy5jb250YWlucyhiKXx8YS5jb3BpZWRQYXJ0cyYmYS5jb3BpZWRQYXJ0cy5jb250YWlucyhiKT8hMDohMTt9ZnVuY3Rpb24gZWcoYSxiKXt2YXIgYz1hLmRpYWdyYW07YS5kcmFnc0xpbmsmJihudWxsIT09YS5kcmFnZ2VkTGluayYmKGEuZHJhZ2dlZExpbmsuZnJvbU5vZGU9bnVsbCxhLmRyYWdnZWRMaW5rLnRvTm9kZT1udWxsKSxmZyhhLCExKSk7dmFyIGQ9Z2coYyxiLG51bGwsZnVuY3Rpb24oYil7cmV0dXJuIWRnKGEsYik7fSksZT1jLmxhc3RJbnB1dDtlLnRhcmdldE9iamVjdD1kO3ZhciBmPWMuc2tpcHNVbmRvTWFuYWdlcixnPSExO3RyeXtjLnNraXBzVW5kb01hbmFnZXI9ITA7Zz1WZihhLGUsZCk7aWYoIWEuaXNBY3RpdmUmJm51bGw9PT1JZilyZXR1cm47aWYobnVsbD09PWR8fGMuaGFuZGxlc0RyYWdEcm9wRm9yVG9wTGV2ZWxQYXJ0cyl7dmFyIGg9Yy5tb3VzZURyYWdPdmVyO251bGwhPT1oJiYoaChlKSxnPSEwKTt9aWYoIWEuaXNBY3RpdmUmJm51bGw9PT1JZilyZXR1cm47YS5kb0RyYWdPdmVyKGIsZCk7aWYoIWEuaXNBY3RpdmUmJm51bGw9PT1JZilyZXR1cm47fWZpbmFsbHl7Yy5za2lwc1VuZG9NYW5hZ2VyPWYsZyYmYy5mZCgpO30oYy5hbGxvd0hvcml6b250YWxTY3JvbGx8fGMuYWxsb3dWZXJ0aWNhbFNjcm9sbCkmJmMuT3MoZS52aWV3UG9pbnQpO31mdW5jdGlvbiBWZihhLGIsYyl7dmFyIGQ9ITEsZT1hLkhnLmxlbmd0aCxmPTA8ZT9hLkhnWzBdOm51bGw7aWYoYz09PWYpcmV0dXJuITE7Yi5oYW5kbGVkPSExO2Zvcih2YXIgZz0wO2c8ZTtnKyspe3ZhciBoPWEuSGdbZ10saz1oLm1vdXNlRHJhZ0xlYXZlO2lmKG51bGwhPT1rJiYoayhiLGgsYyksZD0hMCxiLmhhbmRsZWQpKWJyZWFrO31hLkhnLmxlbmd0aD0wO2lmKCFhLmlzQWN0aXZlJiZudWxsPT09SWZ8fG51bGw9PT1jKXJldHVybiBkO2IuaGFuZGxlZD0hMTtmb3IoZT1jO251bGwhPT1lOyl7YS5IZy5wdXNoKGUpLGU9aGcoZSk7fWU9YS5IZy5sZW5ndGg7Zm9yKGM9MDtjPGUmJihnPWEuSGdbY10saD1nLm1vdXNlRHJhZ0VudGVyLG51bGw9PT1ofHwoaChiLGcsZiksZD0hMCwhYi5oYW5kbGVkKSk7YysrKXs7fXJldHVybiBkO31mdW5jdGlvbiBoZyhhKXt2YXIgYj1hLnBhbmVsO3JldHVybiBudWxsIT09Yj9iOmEgaW5zdGFuY2VvZiBUJiYhKGEgaW5zdGFuY2VvZiBpZykmJihhPWEuY29udGFpbmluZ0dyb3VwLG51bGwhPT1hJiZhLmhhbmRsZXNEcmFnRHJvcEZvck1lbWJlcnMpP2E6bnVsbDt9ZnVuY3Rpb24gamcoYSxiLGMpe3ZhciBkPWEuYmc7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7dmFyIGU9YS5kaWFncmFtLm5nKGIsZC5wb3J0R3Jhdml0eSxmdW5jdGlvbihhKXtyZXR1cm4gZC5maW5kVmFsaWRMaW5rYWJsZVBvcnQoYSxjKTt9KTthPUcuYWxsb2MoKTt2YXIgZj1JbmZpbml0eSxnPW51bGw7Zm9yKGU9ZS5pdGVyYXRvcjtlLm5leHQoKTspe3ZhciBoPWUudmFsdWU7aWYobnVsbCE9PWgucGFydCl7dmFyIGs9aC5tYShkZCxhKTtrPWIuQmUoayk7azxmJiYoZz1oLGY9ayk7fX1HLmZyZWUoYSk7cmV0dXJuIGc7fWZ1bmN0aW9uIGZnKGEsYil7dmFyIGM9YS5kcmFnZ2VkTGluaztpZihudWxsIT09YyYmISgyPmMucG9pbnRzQ291bnQpKXt2YXIgZD1hLmRpYWdyYW07aWYoIWQuaXNSZWFkT25seSl7dmFyIGU9YS5iZztpZihudWxsIT09ZSl7dmFyIGY9bnVsbCxnPW51bGw7bnVsbD09PWMuZnJvbU5vZGUmJihmPWpnKGEsYy5pKDApLCExKSxudWxsIT09ZiYmKGc9Zi5wYXJ0KSk7dmFyIGg9bnVsbCxrPW51bGw7bnVsbD09PWMudG9Ob2RlJiYoaD1qZyhhLGMuaShjLnBvaW50c0NvdW50LTEpLCEwKSxudWxsIT09aCYmKGs9aC5wYXJ0KSk7ZS5pc1ZhbGlkTGluayhnLGYsayxoKT9iPyhjLmRlZmF1bHRGcm9tUG9pbnQ9Yy5pKDApLGMuZGVmYXVsdFRvUG9pbnQ9Yy5pKGMucG9pbnRzQ291bnQtMSksYy5zdXNwZW5kc1JvdXRpbmc9ITEsYy5mcm9tTm9kZT1nLG51bGwhPT1mJiYoYy5mcm9tUG9ydElkPWYucG9ydElkKSxjLnRvTm9kZT1rLG51bGwhPT1oJiYoYy50b1BvcnRJZD1oLnBvcnRJZCksYy5mcm9tUG9ydCE9PWQudngmJmQuYWEoIkxpbmtSZWxpbmtlZCIsYyxkLnZ4KSxjLnRvUG9ydCE9PWQud3gmJmQuYWEoIkxpbmtSZWxpbmtlZCIsYyxkLnd4KSk6a2coZSxnLGYsayxoKTprZyhlLG51bGwsbnVsbCxudWxsLG51bGwpO319fX14Zi5wcm90b3R5cGUuZG9EcmFnT3Zlcj1mdW5jdGlvbigpe307ZnVuY3Rpb24gbGcoYSxiKXt2YXIgYz1hLmRpYWdyYW07YS5kcmFnc0xpbmsmJmZnKGEsITApO1BmKGEpO3ZhciBkPWdnKGMsYixudWxsLGZ1bmN0aW9uKGIpe3JldHVybiFkZyhhLGIpO30pLGU9Yy5sYXN0SW5wdXQ7ZS50YXJnZXRPYmplY3Q9ZDtpZihudWxsIT09ZCl7ZS5oYW5kbGVkPSExO2Zvcih2YXIgZj1kO251bGwhPT1mOyl7dmFyIGc9Zi5tb3VzZURyb3A7aWYobnVsbCE9PWcmJihnKGUsZiksZS5oYW5kbGVkKSlicmVhazttZyhhLGUsZik7Zj1oZyhmKTt9fWVsc2UgZj1jLm1vdXNlRHJvcCxudWxsIT09ZiYmZihlKTtpZihhLmlzQWN0aXZlfHxudWxsIT09SWYpe2ZvcihlPShhLmNvcGllZFBhcnRzfHxhLmRyYWdnZWRQYXJ0cykuaXRlcmF0b3I7ZS5uZXh0KCk7KXtmPWUua2V5LGYgaW5zdGFuY2VvZiBWJiZmLmxpbmtzQ29ubmVjdGVkLmVhY2goZnVuY3Rpb24oYSl7YS5zdXNwZW5kc1JvdXRpbmc9ITE7fSk7fWEuZG9Ecm9wT250byhiLGQpO2lmKGEuaXNBY3RpdmV8fG51bGwhPT1JZil7Yj1OLmFsbG9jKCk7Zm9yKGQ9Yy5zZWxlY3Rpb24uaXRlcmF0b3I7ZC5uZXh0KCk7KXtlPWQudmFsdWUsZSBpbnN0YW5jZW9mIFYmJm5nKGEsYyxlLGIpO31OLmZyZWUoYik7fX19ZnVuY3Rpb24gbWcoYSxiLGMpe2E9YS5kaWFncmFtO2MgaW5zdGFuY2VvZiBUJiZudWxsPT09Yy5jb250YWluaW5nR3JvdXAmJiEoYyBpbnN0YW5jZW9mIGlnKSYmYS5oYW5kbGVzRHJhZ0Ryb3BGb3JUb3BMZXZlbFBhcnRzJiYoYz1hLm1vdXNlRHJvcCxudWxsIT09YyYmYyhiKSk7fWZ1bmN0aW9uIG5nKGEsYixjLGQpe3ZhciBlPSExO2MuZ2V0QXZvaWRhYmxlUmVjdChkKTtiLnZpZXdwb3J0Qm91bmRzLmxmKGQpJiYoZT0hMCk7Yj1iLmxpbmtzO2ZvcihhPWEuY29waWVkUGFydHN8fGEuZHJhZ2dlZFBhcnRzO2IubmV4dCgpOyl7dmFyIGY9Yi52YWx1ZTtpZighZXx8b2coZikpYS5jb250YWlucyhmKSYmYS5jb250YWlucyhjKXx8IWYuVmQoYykmJmYuaXNBdm9pZGluZyYmQWMoZi5hY3R1YWxCb3VuZHMsZCwwKSYmZi5SYSgpO319eGYucHJvdG90eXBlLmRvRHJvcE9udG89ZnVuY3Rpb24oKXt9O3hmLnByb3RvdHlwZS5kb01vdXNlTW92ZT1mdW5jdGlvbigpe2lmKHRoaXMuaXNBY3RpdmUpe3ZhciBhPXRoaXMuZGlhZ3JhbSxiPWEubGFzdElucHV0O3RoaXMuc2ltdWxhdGVkTW91c2VNb3ZlKGIuZXZlbnQsbnVsbCxiLnRhcmdldERpYWdyYW18fG51bGwpfHxudWxsPT09dGhpcy5jdXJyZW50UGFydHx8bnVsbD09PXRoaXMuZHJhZ2dlZFBhcnRzfHwodGhpcy5tYXlDb3B5KCk/KGEuY3VycmVudEN1cnNvcj0iY29weSIsWmYodGhpcywhMSksTGYoYSx0aGlzLmNvcGllZFBhcnRzKSxhZyh0aGlzLHRoaXMuY29waWVkUGFydHMsITEpLFFmKGEsdGhpcy5jb3BpZWRQYXJ0cykpOnRoaXMubWF5TW92ZSgpPyhUZih0aGlzKSxhZyh0aGlzLHRoaXMuZHJhZ2dlZFBhcnRzLCEwKSk6dGhpcy5tYXlEcmFnT3V0KCk/KGEuY3VycmVudEN1cnNvcj0ibm8tZHJvcCIsWmYodGhpcywhMSksYWcodGhpcyx0aGlzLmNvcGllZFBhcnRzLCExKSk6VGYodGhpcyksZWcodGhpcyxhLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50KSk7fX07eGYucHJvdG90eXBlLmRvTW91c2VVcD1mdW5jdGlvbigpe2lmKHRoaXMuaXNBY3RpdmUpe3ZhciBhPXRoaXMuZGlhZ3JhbSxiPWEubGFzdElucHV0O2lmKCF0aGlzLnNpbXVsYXRlZE1vdXNlVXAoYi5ldmVudCxudWxsLGIuZG9jdW1lbnRQb2ludCxiLnRhcmdldERpYWdyYW0pKXt2YXIgYz0hMTsoYj10aGlzLm1heUNvcHkoKSkmJm51bGwhPT10aGlzLmNvcGllZFBhcnRzPyhUZih0aGlzKSxaZih0aGlzLCEwKSxMZihhLHRoaXMuY29waWVkUGFydHMpLGFnKHRoaXMsdGhpcy5jb3BpZWRQYXJ0cywhMSksUWYoYSx0aGlzLmNvcGllZFBhcnRzKSxudWxsIT09dGhpcy5jb3BpZWRQYXJ0cyYmYS5Hdih0aGlzLmNvcGllZFBhcnRzLllkKCkpKTooYz0hMCxUZih0aGlzKSx0aGlzLm1heU1vdmUoKSYmKGFnKHRoaXMsdGhpcy5kcmFnZ2VkUGFydHMsITApLGVnKHRoaXMsYS5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludCkpKTt0aGlzLnluPSEwO2xnKHRoaXMsYS5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludCk7aWYodGhpcy5pc0FjdGl2ZSl7dmFyIGQ9Yj90aGlzLmNvcGllZFBhcnRzLllkKCk6dGhpcy5kcmFnZ2VkUGFydHMuWWQoKTt0aGlzLmNvcGllZFBhcnRzPW51bGw7aWYoYyYmbnVsbCE9PXRoaXMuZHJhZ2dlZFBhcnRzKWZvcihjPXRoaXMuZHJhZ2dlZFBhcnRzLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGU9Yy5rZXk7ZSBpbnN0YW5jZW9mIFYmJihlPWUuY29udGFpbmluZ0dyb3VwLG51bGw9PT1lfHxudWxsPT09ZS5wbGFjZWhvbGRlcnx8dGhpcy5kcmFnZ2VkUGFydHMuY29udGFpbnMoZSl8fGUucGxhY2Vob2xkZXIucygpKTt9YS5YYSgpO1FmKGEsdGhpcy5kcmFnZ2VkUGFydHMpO3RoaXMudHJhbnNhY3Rpb25SZXN1bHQ9Yj8iQ29weSI6Ik1vdmUiO2EuYWEoYj8iU2VsZWN0aW9uQ29waWVkIjoiU2VsZWN0aW9uTW92ZWQiLGQpO310aGlzLnN0b3BUb29sKCk7fX19O3hmLnByb3RvdHlwZS5zaW11bGF0ZWRNb3VzZU1vdmU9ZnVuY3Rpb24oYSxiLGMpe2lmKG51bGw9PT1JZilyZXR1cm4hMTt2YXIgZD1JZi5kaWFncmFtO2MgaW5zdGFuY2VvZiBQfHwoYz1udWxsKTt2YXIgZT1NZjtjIT09ZSYmKG51bGwhPT1lJiZlIT09ZCYmKGUudmYoKSxJZi5pc0RyYWdPdXRTdGFydGVkPSExLGU9ZS50b29sTWFuYWdlci5maW5kVG9vbCgiRHJhZ2dpbmciKSxudWxsIT09ZSYmZS5kb1NpbXVsYXRlZERyYWdMZWF2ZSgpKSxNZj1jLG51bGwhPT1jJiZjIT09ZCYmKFdmKCksZT1jLnRvb2xNYW5hZ2VyLmZpbmRUb29sKCJEcmFnZ2luZyIpLG51bGwhPT1lJiYoUmYuY29udGFpbnMoZSl8fFJmLmFkZChlKSxlLmRvU2ltdWxhdGVkRHJhZ0VudGVyKCkpKSk7aWYobnVsbD09PWN8fGM9PT1kfHwhYy5hbGxvd0Ryb3B8fGMuaXNSZWFkT25seXx8IWMuYWxsb3dJbnNlcnQpcmV0dXJuITE7ZD1jLnRvb2xNYW5hZ2VyLmZpbmRUb29sKCJEcmFnZ2luZyIpO251bGwhPT1kJiYobnVsbCE9PWE/KHZvaWQgMCE9PWEudGFyZ2V0VG91Y2hlcyYmKDA8YS50YXJnZXRUb3VjaGVzLmxlbmd0aD9hPWEudGFyZ2V0VG91Y2hlc1swXTowPGEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoJiYoYT1hLmNoYW5nZWRUb3VjaGVzWzBdKSksYj1jLmdldE1vdXNlKGEpKTpudWxsPT09YiYmKGI9bmV3IEcoKSksYy5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludD1iLGMubGFzdElucHV0LnZpZXdQb2ludD1jLnh0KGIpLGMubGFzdElucHV0LmRvd249ITEsYy5sYXN0SW5wdXQudXA9ITEsZC5kb1NpbXVsYXRlZERyYWdPdmVyKCkpO3JldHVybiEwO307eGYucHJvdG90eXBlLnNpbXVsYXRlZE1vdXNlVXA9ZnVuY3Rpb24oYSxiLGMsZCl7aWYobnVsbD09PUlmKXJldHVybiExO251bGw9PT1kJiYoZD1iKTtiPU1mO3ZhciBlPUlmLmRpYWdyYW07aWYoZCE9PWIpe3ZhciBmPWIudG9vbE1hbmFnZXIuZmluZFRvb2woIkRyYWdnaW5nIik7aWYobnVsbCE9PWImJmIhPT1lJiZudWxsIT09ZilyZXR1cm4gYi52ZigpLElmLmlzRHJhZ091dFN0YXJ0ZWQ9ITEsZi5kb1NpbXVsYXRlZERyYWdMZWF2ZSgpLCExO01mPWQ7Yj1kLnRvb2xNYW5hZ2VyLmZpbmRUb29sKCJEcmFnZ2luZyIpO251bGwhPT1kJiZudWxsIT09YiYmKFdmKCksUmYuY29udGFpbnMoYil8fFJmLmFkZChiKSxiLmRvU2ltdWxhdGVkRHJhZ0VudGVyKCkpO31yZXR1cm4gbnVsbD09PWQ/KElmLmRvQ2FuY2VsKCksITApOmQhPT10aGlzLmRpYWdyYW0/KG51bGwhPT1hPyh2b2lkIDAhPT1hLnRhcmdldFRvdWNoZXMmJigwPGEudGFyZ2V0VG91Y2hlcy5sZW5ndGg/YT1hLnRhcmdldFRvdWNoZXNbMF06MDxhLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCYmKGE9YS5jaGFuZ2VkVG91Y2hlc1swXSkpLGM9ZC5nZXRNb3VzZShhKSk6bnVsbD09PWMmJihjPW5ldyBHKCkpLGQubGFzdElucHV0LmRvY3VtZW50UG9pbnQ9YyxkLmxhc3RJbnB1dC52aWV3UG9pbnQ9ZC54dChjKSxkLmxhc3RJbnB1dC5kb3duPSExLGQubGFzdElucHV0LnVwPSEwLGE9ZC50b29sTWFuYWdlci5maW5kVG9vbCgiRHJhZ2dpbmciKSxudWxsIT09YSYmYS5kb1NpbXVsYXRlZERyb3AoKSxhPUlmLG51bGwhPT1hJiYoZD1hLm1heUNvcHkoKSxhLnRyYW5zYWN0aW9uUmVzdWx0PWQ/IkNvcHkiOiJNb3ZlIixhLnN0b3BUb29sKCkpLCEwKTohMTt9O3hmLnByb3RvdHlwZS5tYXlDb3B5PWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNDb3B5RW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07aWYoYS5pc1JlYWRPbmx5fHxhLmlzTW9kZWxSZWFkT25seXx8IWEuYWxsb3dJbnNlcnR8fCFhLmFsbG93Q29weXx8KGliPyFhLmxhc3RJbnB1dC5hbHQ6IWEubGFzdElucHV0LmNvbnRyb2wpKXJldHVybiExO2ZvcihhPWEuc2VsZWN0aW9uLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGI9YS52YWx1ZTtpZihiLkxiKCkmJmIuY2FuQ29weSgpKXJldHVybiEwO31yZXR1cm4gbnVsbCE9PXRoaXMuZHJhZ2dlZExpbmsmJnRoaXMuZHJhZ3NMaW5rJiZ0aGlzLmRyYWdnZWRMaW5rLmNhbkNvcHkoKT8hMDohMTt9O3hmLnByb3RvdHlwZS5tYXlEcmFnT3V0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNDb3B5RW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07aWYoIWEuYWxsb3dEcmFnT3V0fHwhYS5hbGxvd0NvcHl8fGEuYWxsb3dNb3ZlKXJldHVybiExO2ZvcihhPWEuc2VsZWN0aW9uLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGI9YS52YWx1ZTtpZihiLkxiKCkmJmIuY2FuQ29weSgpKXJldHVybiEwO31yZXR1cm4gbnVsbCE9PXRoaXMuZHJhZ2dlZExpbmsmJnRoaXMuZHJhZ3NMaW5rJiZ0aGlzLmRyYWdnZWRMaW5rLmNhbkNvcHkoKT8hMDohMTt9O3hmLnByb3RvdHlwZS5tYXlNb3ZlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKGEuaXNSZWFkT25seXx8IWEuYWxsb3dNb3ZlKXJldHVybiExO2ZvcihhPWEuc2VsZWN0aW9uLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGI9YS52YWx1ZTtpZihiLkxiKCkmJmIuY2FuTW92ZSgpKXJldHVybiEwO31yZXR1cm4gbnVsbCE9PXRoaXMuZHJhZ2dlZExpbmsmJnRoaXMuZHJhZ3NMaW5rJiZ0aGlzLmRyYWdnZWRMaW5rLmNhbk1vdmUoKT8hMDohMTt9O3hmLnByb3RvdHlwZS5jb21wdXRlQm9yZGVyPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy55bnx8bnVsbD09PXRoaXMuZHJhZ2dlZFBhcnRzfHx0aGlzLmRyYWdnZWRQYXJ0cy5jb250YWlucyhhKT9udWxsOmMuYXNzaWduKGIpO307eGYucHJvdG90eXBlLmF6PWZ1bmN0aW9uKCl7cmV0dXJuIElmO307eGYucHJvdG90eXBlLm1heURyYWdJbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtpZighYS5hbGxvd0Ryb3B8fGEuaXNSZWFkT25seXx8YS5pc01vZGVsUmVhZE9ubHl8fCFhLmFsbG93SW5zZXJ0KXJldHVybiExO3ZhciBiPUlmO3JldHVybiBudWxsPT09Ynx8Yi5kaWFncmFtLm1vZGVsLmRhdGFGb3JtYXQhPT1hLm1vZGVsLmRhdGFGb3JtYXQ/ITE6ITA7fTt4Zi5wcm90b3R5cGUuZG9TaW11bGF0ZWREcmFnRW50ZXI9ZnVuY3Rpb24oKXtpZih0aGlzLm1heURyYWdJbigpKXt2YXIgYT10aGlzLmRpYWdyYW07YS5hbmltYXRpb25NYW5hZ2VyLnZkKCk7cGcoYSk7YS5hbmltYXRpb25NYW5hZ2VyLnZkKCk7YT1JZjtudWxsIT09YSYmKGEuZGlhZ3JhbS5jdXJyZW50Q3Vyc29yPSJjb3B5IixhLmRpYWdyYW0uVWk9ITEpO319O3hmLnByb3RvdHlwZS5kb1NpbXVsYXRlZERyYWdMZWF2ZT1mdW5jdGlvbigpe3ZhciBhPUlmO251bGwhPT1hJiZhLmRvU2ltdWxhdGVkRHJhZ091dCgpO3RoaXMuZG9DYW5jZWwoKTt9O3hmLnByb3RvdHlwZS5kb1NpbXVsYXRlZERyYWdPdmVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLGI9SWY7bnVsbCE9PWImJm51bGwhPT1iLmRyYWdnZWRQYXJ0cyYmdGhpcy5tYXlEcmFnSW4oKSYmKGEuY3VycmVudEN1cnNvcj0iY29weSIscWcodGhpcyxiLmRyYWdnZWRQYXJ0cy5ZZCgpLCExLGEuZmlyc3RJbnB1dCksYWcodGhpcyx0aGlzLmNvcGllZFBhcnRzLCExKSxlZyh0aGlzLGEubGFzdElucHV0LmRvY3VtZW50UG9pbnQpKTt9O3hmLnByb3RvdHlwZS5kb1NpbXVsYXRlZERyb3A9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW0sYj1JZjtpZihudWxsIT09Yil7dmFyIGM9Yi5kaWFncmFtO2IueW49ITA7VGYodGhpcyk7dGhpcy5tYXlEcmFnSW4oKSYmKHRoaXMuQWEoIkRyb3AiKSxxZyh0aGlzLGIuZHJhZ2dlZFBhcnRzLllkKCksITAsYS5sYXN0SW5wdXQpLGFnKHRoaXMsdGhpcy5jb3BpZWRQYXJ0cywhMSksbnVsbCE9PXRoaXMuY29waWVkUGFydHMmJmEuR3YodGhpcy5jb3BpZWRQYXJ0cy5ZZCgpKSxsZyh0aGlzLGEubGFzdElucHV0LmRvY3VtZW50UG9pbnQpLGEuWGEoKSxiPWEuc2VsZWN0aW9uLG51bGwhPT10aGlzLmNvcGllZFBhcnRzP3RoaXMudHJhbnNhY3Rpb25SZXN1bHQ9IkV4dGVybmFsQ29weSI6Yj1uZXcgRigpLHRoaXMuY29waWVkUGFydHM9bnVsbCxhLmRvRm9jdXMoKSxhLmFhKCJFeHRlcm5hbE9iamVjdHNEcm9wcGVkIixiLGMpLHRoaXMudmcoKSk7fX07ZnVuY3Rpb24gcWcoYSxiLGMsZCl7aWYobnVsbD09PWEuY29waWVkUGFydHMpe3ZhciBlPWEuZGlhZ3JhbTtpZighZS5pc1JlYWRPbmx5JiYhZS5pc01vZGVsUmVhZE9ubHkpe2Uuc2tpcHNVbmRvTWFuYWdlcj0hYztlLnBhcnRNYW5hZ2VyLmFkZHNUb1RlbXBvcmFyeUxheWVyPSFjO2Euc3RhcnRQb2ludD1kLmRvY3VtZW50UG9pbnQ7Yz1lLlhqKGIsZSwhMCk7dmFyIGY9Ti5hbGxvYygpO1lmKGIsZik7ZD1mLngrZi53aWR0aC8yO2U9Zi55K2YuaGVpZ2h0LzI7Ti5mcmVlKGYpO2Y9YS54czt2YXIgZz1uZXcgTGIoKSxoPUcuYWxsb2MoKTtmb3IoYj1iLml0ZXJhdG9yO2IubmV4dCgpOyl7dmFyIGs9Yi52YWx1ZSxsPWMuSihrKTtrLkxiKCkmJmsuY2FuQ29weSgpPyhrPWsubG9jYXRpb24saC5oKGYueC0oZC1rLngpLGYueS0oZS1rLnkpKSxsLmxvY2F0aW9uPWgsbC5hYygpLGcuYWRkKGwsYS5wZChoKSkpOmwgaW5zdGFuY2VvZiBTJiZrLmNhbkNvcHkoKSYmKCRmKGwsZi54LWQsZi55LWUpLGcuYWRkKGwsYS5wZCgpKSk7fUcuZnJlZShoKTthLmNvcGllZFBhcnRzPWc7SmYoYSxnLllkKCkpO251bGwhPT1hLmRyYWdnZWRMaW5rJiYoYz1hLmRyYWdnZWRMaW5rLGQ9Yy5yb3V0ZUJvdW5kcywkZihjLGEuc3RhcnRQb2ludC54LShkLngrZC53aWR0aC8yKSxhLnN0YXJ0UG9pbnQueS0oZC55K2QuaGVpZ2h0LzIpKSk7fX19eGYucHJvdG90eXBlLmRvU2ltdWxhdGVkRHJhZ091dD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTthLlVpPSExO3RoaXMubWF5Q29weSgpfHx0aGlzLm1heU1vdmUoKT9hLmN1cnJlbnRDdXJzb3I9IiI6YS5jdXJyZW50Q3Vyc29yPSJuby1kcm9wIjt9O3hmLnByb3RvdHlwZS5jb21wdXRlTW92ZT1mdW5jdGlvbihhLGIsYyxkKXtjPXRoaXMuZGlhZ3JhbTtyZXR1cm4gbnVsbCE9PWM/Yy5jb21wdXRlTW92ZShhLGIsdGhpcy5kcmFnT3B0aW9ucyxkKTpuZXcgRygpO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGYucHJvdG90eXBlLHtpc0NvcHlFbmFibGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuS2M7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuS2M9YTt9fSxjb3BpZXNFZmZlY3RpdmVDb2xsZWN0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LPWE7fX0sZHJhZ09wdGlvbnM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5MYTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5MYT1hO319LGlzR3JpZFNuYXBFbmFibGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZHJhZ09wdGlvbnMuaXNHcmlkU25hcEVuYWJsZWQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuZHJhZ09wdGlvbnMuaXNHcmlkU25hcEVuYWJsZWQ9YTt9fSxpc0NvbXBsZXhSb3V0aW5nUmVhbHRpbWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5XYj1hO319LGlzR3JpZFNuYXBSZWFsdGltZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmRyYWdPcHRpb25zLmlzR3JpZFNuYXBSZWFsdGltZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5kcmFnT3B0aW9ucy5pc0dyaWRTbmFwUmVhbHRpbWU9YTt9fSxncmlkU25hcENlbGxTaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZHJhZ09wdGlvbnMuZ3JpZFNuYXBDZWxsU2l6ZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7bnVsbD09PXRoaXMuZGlhZ3JhbXx8dGhpcy5kcmFnT3B0aW9ucy5ncmlkU25hcENlbGxTaXplLkEoYSl8fChhPWEuSSgpLHRoaXMuZHJhZ09wdGlvbnMuZ3JpZFNuYXBDZWxsU2l6ZT1hKTt9fSxncmlkU25hcENlbGxTcG90OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZHJhZ09wdGlvbnMuZ3JpZFNuYXBDZWxsU3BvdDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5kcmFnT3B0aW9ucy5ncmlkU25hcENlbGxTcG90LkEoYSl8fChhPWEuSSgpLHRoaXMuZHJhZ09wdGlvbnMuZ3JpZFNuYXBDZWxsU3BvdD1hKTt9fSxncmlkU25hcE9yaWdpbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmRyYWdPcHRpb25zLmdyaWRTbmFwT3JpZ2luO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmRyYWdPcHRpb25zLmdyaWRTbmFwT3JpZ2luLkEoYSl8fChhPWEuSSgpLHRoaXMuZHJhZ09wdGlvbnMuZ3JpZFNuYXBPcmlnaW49YSk7fX0sZHJhZ3NMaW5rOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZHJhZ09wdGlvbnMuZHJhZ3NMaW5rO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmRyYWdPcHRpb25zLmRyYWdzTGluaz1hO319LGRyYWdzVHJlZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmRyYWdPcHRpb25zLmRyYWdzVHJlZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5kcmFnT3B0aW9ucy5kcmFnc1RyZWU9YTt9fSxjdXJyZW50UGFydDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmJhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmJhPWE7fX0sY29waWVkUGFydHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy51O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnU9YTt9fSxkcmFnZ2VkUGFydHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5NYTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5NYT1hO319LGRyYWdnaW5nUGFydHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29waWVkUGFydHM/dGhpcy5jb3BpZWRQYXJ0cy5ZZCgpOm51bGwhPT10aGlzLmRyYWdnZWRQYXJ0cz90aGlzLmRyYWdnZWRQYXJ0cy5ZZCgpOnRoaXMud2c7fX0sZHJhZ2dlZExpbms6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5kaWFncmFtLmRyYWdnZWRMaW5rO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmRpYWdyYW0uZHJhZ2dlZExpbms9YTt9fSxpc0RyYWdPdXRTdGFydGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVmM9YTt9fSxzdGFydFBvaW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMueHM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMueHMuQShhKXx8dGhpcy54cy5hc3NpZ24oYSk7fX0sZGVsYXk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Razt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5Raz1hO319fSk7eGYucHJvdG90eXBlLmdldERyYWdnaW5nU291cmNlPXhmLnByb3RvdHlwZS5hejt2YXIgUmY9bnVsbCxJZj1udWxsLE1mPW51bGw7eGYuY2xhc3NOYW1lPSJEcmFnZ2luZ1Rvb2wiO1JmPW5ldyBFKCk7VGEoImRyYWdnaW5nVG9vbCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kVG9vbCgiRHJhZ2dpbmciKTt9LGZ1bmN0aW9uKGEpe3ZmKHRoaXMsIkRyYWdnaW5nIixhLHRoaXMubW91c2VNb3ZlVG9vbHMpO30pO1VhLnByb3RvdHlwZS5kb0NhbmNlbD1mdW5jdGlvbigpe251bGwhPT1JZiYmSWYuZG9DYW5jZWwoKTtrZi5wcm90b3R5cGUuZG9DYW5jZWwuY2FsbCh0aGlzKTt9O2Z1bmN0aW9uIHJnKCl7a2YuY2FsbCh0aGlzKTt0aGlzLndnPTEwMDt0aGlzLmJhPSExO3ZhciBhPW5ldyBTKCksYj1uZXcgVygpO2IuaXNQYW5lbE1haW49ITA7Yi5zdHJva2U9ImJsdWUiO2EuYWRkKGIpO2I9bmV3IFcoKTtiLnRvQXJyb3c9IlN0YW5kYXJkIjtiLmZpbGw9ImJsdWUiO2Iuc3Ryb2tlPSJibHVlIjthLmFkZChiKTthLmxheWVyTmFtZT0iVG9vbCI7dGhpcy5HbT1hO2E9bmV3IFYoKTtiPW5ldyBXKCk7Yi5wb3J0SWQ9IiI7Yi5maWd1cmU9IlJlY3RhbmdsZSI7Yi5maWxsPW51bGw7Yi5zdHJva2U9Im1hZ2VudGEiO2Iuc3Ryb2tlV2lkdGg9MjtiLmRlc2lyZWRTaXplPWdjO2EuYWRkKGIpO2Euc2VsZWN0YWJsZT0hMTthLmxheWVyTmFtZT0iVG9vbCI7dGhpcy5FbT1hO3RoaXMuRm09YjthPW5ldyBWKCk7Yj1uZXcgVygpO2IucG9ydElkPSIiO2IuZmlndXJlPSJSZWN0YW5nbGUiO2IuZmlsbD1udWxsO2Iuc3Ryb2tlPSJtYWdlbnRhIjtiLnN0cm9rZVdpZHRoPTI7Yi5kZXNpcmVkU2l6ZT1nYzthLmFkZChiKTthLnNlbGVjdGFibGU9ITE7YS5sYXllck5hbWU9IlRvb2wiO3RoaXMud3E9YTt0aGlzLmN3PWI7dGhpcy5WYz10aGlzLktjPXRoaXMuTWE9dGhpcy5MYT10aGlzLldiPW51bGw7dGhpcy5LPSEwO3RoaXMuU3g9bmV3IExiKCk7dGhpcy5DbT10aGlzLmlpPXRoaXMuRG09bnVsbDt9b2Eocmcsa2YpO3JnLnByb3RvdHlwZS5kb1N0b3A9ZnVuY3Rpb24oKXt0aGlzLmRpYWdyYW0udmYoKTt0aGlzLm9yaWdpbmFsVG9Qb3J0PXRoaXMub3JpZ2luYWxUb05vZGU9dGhpcy5vcmlnaW5hbEZyb21Qb3J0PXRoaXMub3JpZ2luYWxGcm9tTm9kZT10aGlzLm9yaWdpbmFsTGluaz1udWxsO3RoaXMudmFsaWRQb3J0c0NhY2hlLmNsZWFyKCk7dGhpcy50YXJnZXRQb3J0PW51bGw7fTtyZy5wcm90b3R5cGUuY29weVBvcnRQcm9wZXJ0aWVzPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYobnVsbCE9PWEmJm51bGwhPT1iJiZudWxsIT09YyYmbnVsbCE9PWQpe3ZhciBmPWIuQ2UoKSxnPUsuYWxsb2MoKTtnLndpZHRoPWIubmF0dXJhbEJvdW5kcy53aWR0aCpmO2cuaGVpZ2h0PWIubmF0dXJhbEJvdW5kcy5oZWlnaHQqZjtkLmRlc2lyZWRTaXplPWc7Sy5mcmVlKGcpO2U/KGQudG9TcG90PWIudG9TcG90LGQudG9FbmRTZWdtZW50TGVuZ3RoPWIudG9FbmRTZWdtZW50TGVuZ3RoKTooZC5mcm9tU3BvdD1iLmZyb21TcG90LGQuZnJvbUVuZFNlZ21lbnRMZW5ndGg9Yi5mcm9tRW5kU2VnbWVudExlbmd0aCk7Yy5sb2NhdGlvblNwb3Q9ZGQ7Zj1HLmFsbG9jKCk7Yy5sb2NhdGlvbj1iLm1hKGRkLGYpO0cuZnJlZShmKTtkLmFuZ2xlPWIuSmkoKTtudWxsIT09dGhpcy5wb3J0VGFyZ2V0ZWQmJnRoaXMucG9ydFRhcmdldGVkKGEsYixjLGQsZSk7fX07cmcucHJvdG90eXBlLnNldE5vVGFyZ2V0UG9ydFByb3BlcnRpZXM9ZnVuY3Rpb24oYSxiLGMpe251bGwhPT1iJiYoYi5kZXNpcmVkU2l6ZT1nYyxiLmZyb21TcG90PVNjLGIudG9TcG90PVNjKTtudWxsIT09YSYmKGEubG9jYXRpb249dGhpcy5kaWFncmFtLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50KTtudWxsIT09dGhpcy5wb3J0VGFyZ2V0ZWQmJnRoaXMucG9ydFRhcmdldGVkKG51bGwsbnVsbCxhLGIsYyk7fTtyZy5wcm90b3R5cGUuZG9Nb3VzZURvd249ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlJiZ0aGlzLmRvTW91c2VNb3ZlKCk7fTtyZy5wcm90b3R5cGUuZG9Nb3VzZU1vdmU9ZnVuY3Rpb24oKXtpZih0aGlzLmlzQWN0aXZlKXt2YXIgYT10aGlzLmRpYWdyYW07dGhpcy50YXJnZXRQb3J0PXRoaXMuZmluZFRhcmdldFBvcnQodGhpcy5pc0ZvcndhcmRzKTtpZihudWxsIT09dGhpcy50YXJnZXRQb3J0JiZ0aGlzLnRhcmdldFBvcnQucGFydCBpbnN0YW5jZW9mIFYpe3ZhciBiPXRoaXMudGFyZ2V0UG9ydC5wYXJ0O3RoaXMuaXNGb3J3YXJkcz90aGlzLmNvcHlQb3J0UHJvcGVydGllcyhiLHRoaXMudGFyZ2V0UG9ydCx0aGlzLnRlbXBvcmFyeVRvTm9kZSx0aGlzLnRlbXBvcmFyeVRvUG9ydCwhMCk6dGhpcy5jb3B5UG9ydFByb3BlcnRpZXMoYix0aGlzLnRhcmdldFBvcnQsdGhpcy50ZW1wb3JhcnlGcm9tTm9kZSx0aGlzLnRlbXBvcmFyeUZyb21Qb3J0LCExKTt9ZWxzZSB0aGlzLmlzRm9yd2FyZHM/dGhpcy5zZXROb1RhcmdldFBvcnRQcm9wZXJ0aWVzKHRoaXMudGVtcG9yYXJ5VG9Ob2RlLHRoaXMudGVtcG9yYXJ5VG9Qb3J0LCEwKTp0aGlzLnNldE5vVGFyZ2V0UG9ydFByb3BlcnRpZXModGhpcy50ZW1wb3JhcnlGcm9tTm9kZSx0aGlzLnRlbXBvcmFyeUZyb21Qb3J0LCExKTsoYS5hbGxvd0hvcml6b250YWxTY3JvbGx8fGEuYWxsb3dWZXJ0aWNhbFNjcm9sbCkmJmEuT3MoYS5sYXN0SW5wdXQudmlld1BvaW50KTt9fTtyZy5wcm90b3R5cGUuZmluZFZhbGlkTGlua2FibGVQb3J0PWZ1bmN0aW9uKGEsYil7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7dmFyIGM9YS5wYXJ0O2lmKCEoYyBpbnN0YW5jZW9mIFYpKXJldHVybiBudWxsO2Zvcig7bnVsbCE9PWE7KXt2YXIgZD1iP2EudG9MaW5rYWJsZTphLmZyb21MaW5rYWJsZTtpZighMD09PWQmJihudWxsIT09YS5wb3J0SWR8fGEgaW5zdGFuY2VvZiBWKSYmKGI/dGhpcy5pc1ZhbGlkVG8oYyxhKTp0aGlzLmlzVmFsaWRGcm9tKGMsYSkpKXJldHVybiBhO2lmKCExPT09ZClicmVhazthPWEucGFuZWw7fXJldHVybiBudWxsO307cmcucHJvdG90eXBlLmZpbmRUYXJnZXRQb3J0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZGlhZ3JhbSxjPWIubGFzdElucHV0LmRvY3VtZW50UG9pbnQsZD10aGlzLnBvcnRHcmF2aXR5OzA+PWQmJihkPS4xKTt2YXIgZT10aGlzLGY9Yi5uZyhjLGQsZnVuY3Rpb24oYil7cmV0dXJuIGUuZmluZFZhbGlkTGlua2FibGVQb3J0KGIsYSk7fSxudWxsLCEwKTtkPUluZmluaXR5O2I9bnVsbDtmb3IoZj1mLml0ZXJhdG9yO2YubmV4dCgpOyl7dmFyIGc9Zi52YWx1ZSxoPWcucGFydDtpZihoIGluc3RhbmNlb2YgVil7dmFyIGs9Zy5tYShkZCxHLmFsbG9jKCkpLGw9Yy54LWsueCxtPWMueS1rLnk7Ry5mcmVlKGspO2s9bCpsK20qbTtrPGQmJihsPXRoaXMudmFsaWRQb3J0c0NhY2hlLkooZyksbnVsbCE9PWw/bCYmKGI9ZyxkPWspOmEmJnRoaXMuaXNWYWxpZExpbmsodGhpcy5vcmlnaW5hbEZyb21Ob2RlLHRoaXMub3JpZ2luYWxGcm9tUG9ydCxoLGcpfHwhYSYmdGhpcy5pc1ZhbGlkTGluayhoLGcsdGhpcy5vcmlnaW5hbFRvTm9kZSx0aGlzLm9yaWdpbmFsVG9Qb3J0KT8odGhpcy52YWxpZFBvcnRzQ2FjaGUuYWRkKGcsITApLGI9ZyxkPWspOnRoaXMudmFsaWRQb3J0c0NhY2hlLmFkZChnLCExKSk7fX1yZXR1cm4gbnVsbCE9PWImJihjPWIucGFydCxjIGluc3RhbmNlb2YgViYmKG51bGw9PT1jLmxheWVyfHxjLmxheWVyLmFsbG93TGluaykpP2I6bnVsbDt9O3JnLnByb3RvdHlwZS5pc1ZhbGlkRnJvbT1mdW5jdGlvbihhLGIpe2lmKG51bGw9PT1hfHxudWxsPT09YilyZXR1cm4gdGhpcy5pc1VuY29ubmVjdGVkTGlua1ZhbGlkO2lmKHRoaXMuZGlhZ3JhbS5jdXJyZW50VG9vbD09PXRoaXMmJihudWxsIT09YS5sYXllciYmIWEubGF5ZXIuYWxsb3dMaW5rfHwhMCE9PWIuZnJvbUxpbmthYmxlKSlyZXR1cm4hMTt2YXIgYz1iLmZyb21NYXhMaW5rcztpZihJbmZpbml0eT5jKXtpZihudWxsIT09dGhpcy5vcmlnaW5hbExpbmsmJmE9PT10aGlzLm9yaWdpbmFsRnJvbU5vZGUmJmI9PT10aGlzLm9yaWdpbmFsRnJvbVBvcnQpcmV0dXJuITA7Yj1iLnBvcnRJZDtudWxsPT09YiYmKGI9IiIpO2lmKGEuU3AoYikuY291bnQ+PWMpcmV0dXJuITE7fXJldHVybiEwO307cmcucHJvdG90eXBlLmlzVmFsaWRUbz1mdW5jdGlvbihhLGIpe2lmKG51bGw9PT1hfHxudWxsPT09YilyZXR1cm4gdGhpcy5pc1VuY29ubmVjdGVkTGlua1ZhbGlkO2lmKHRoaXMuZGlhZ3JhbS5jdXJyZW50VG9vbD09PXRoaXMmJihudWxsIT09YS5sYXllciYmIWEubGF5ZXIuYWxsb3dMaW5rfHwhMCE9PWIudG9MaW5rYWJsZSkpcmV0dXJuITE7dmFyIGM9Yi50b01heExpbmtzO2lmKEluZmluaXR5PmMpe2lmKG51bGwhPT10aGlzLm9yaWdpbmFsTGluayYmYT09PXRoaXMub3JpZ2luYWxUb05vZGUmJmI9PT10aGlzLm9yaWdpbmFsVG9Qb3J0KXJldHVybiEwO2I9Yi5wb3J0SWQ7bnVsbD09PWImJihiPSIiKTtpZihhLnNkKGIpLmNvdW50Pj1jKXJldHVybiExO31yZXR1cm4hMDt9O3JnLnByb3RvdHlwZS5pc0luU2FtZU5vZGU9ZnVuY3Rpb24oYSxiKXtpZihudWxsPT09YXx8bnVsbD09PWIpcmV0dXJuITE7aWYoYT09PWIpcmV0dXJuITA7YT1hLnBhcnQ7Yj1iLnBhcnQ7cmV0dXJuIG51bGwhPT1hJiZhPT09Yjt9O3JnLnByb3RvdHlwZS5pc0xpbmtlZD1mdW5jdGlvbihhLGIpe2lmKG51bGw9PT1hfHxudWxsPT09YilyZXR1cm4hMTt2YXIgYz1hLnBhcnQ7aWYoIShjIGluc3RhbmNlb2YgVikpcmV0dXJuITE7YT1hLnBvcnRJZDtudWxsPT09YSYmKGE9IiIpO3ZhciBkPWIucGFydDtpZighKGQgaW5zdGFuY2VvZiBWKSlyZXR1cm4hMTtiPWIucG9ydElkO251bGw9PT1iJiYoYj0iIik7Zm9yKGI9ZC5zZChiKTtiLm5leHQoKTspe2lmKGQ9Yi52YWx1ZSxkLmZyb21Ob2RlPT09YyYmZC5mcm9tUG9ydElkPT09YSlyZXR1cm4hMDt9cmV0dXJuITE7fTtyZy5wcm90b3R5cGUuaXNWYWxpZExpbms9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIXRoaXMuaXNWYWxpZEZyb20oYSxiKXx8IXRoaXMuaXNWYWxpZFRvKGMsZCl8fCEobnVsbD09PWJ8fG51bGw9PT1kfHwoYi5mcm9tTGlua2FibGVTZWxmTm9kZSYmZC50b0xpbmthYmxlU2VsZk5vZGV8fCF0aGlzLmlzSW5TYW1lTm9kZShiLGQpKSYmKGIuZnJvbUxpbmthYmxlRHVwbGljYXRlcyYmZC50b0xpbmthYmxlRHVwbGljYXRlc3x8IXRoaXMuaXNMaW5rZWQoYixkKSkpfHxudWxsIT09dGhpcy5vcmlnaW5hbExpbmsmJihudWxsIT09YSYmdGhpcy5pc0xhYmVsRGVwZW5kZW50T25MaW5rKGEsdGhpcy5vcmlnaW5hbExpbmspfHxudWxsIT09YyYmdGhpcy5pc0xhYmVsRGVwZW5kZW50T25MaW5rKGMsdGhpcy5vcmlnaW5hbExpbmspKXx8bnVsbCE9PWEmJm51bGwhPT1jJiYobnVsbD09PWEuZGF0YSYmbnVsbCE9PWMuZGF0YXx8bnVsbCE9PWEuZGF0YSYmbnVsbD09PWMuZGF0YSl8fCF0aGlzLmlzVmFsaWRDeWNsZShhLGMsdGhpcy5vcmlnaW5hbExpbmspKXJldHVybiExO2lmKG51bGwhPT1hKXt2YXIgZT1hLmxpbmtWYWxpZGF0aW9uO2lmKG51bGwhPT1lJiYhZShhLGIsYyxkLHRoaXMub3JpZ2luYWxMaW5rKSlyZXR1cm4hMTt9aWYobnVsbCE9PWMmJihlPWMubGlua1ZhbGlkYXRpb24sbnVsbCE9PWUmJiFlKGEsYixjLGQsdGhpcy5vcmlnaW5hbExpbmspKSlyZXR1cm4hMTtlPXRoaXMubGlua1ZhbGlkYXRpb247cmV0dXJuIG51bGwhPT1lP2UoYSxiLGMsZCx0aGlzLm9yaWdpbmFsTGluayk6ITA7fTtyZy5wcm90b3R5cGUuaXNMYWJlbERlcGVuZGVudE9uTGluaz1mdW5jdGlvbihhLGIpe2lmKG51bGw9PT1hKXJldHVybiExO3ZhciBjPWEubGFiZWxlZExpbms7aWYobnVsbD09PWMpcmV0dXJuITE7aWYoYz09PWIpcmV0dXJuITA7dmFyIGQ9bmV3IEYoKTtkLmFkZChhKTtyZXR1cm4gc2codGhpcyxjLGIsZCk7fTtmdW5jdGlvbiBzZyhhLGIsYyxkKXtpZihiPT09YylyZXR1cm4hMDt2YXIgZT1iLmZyb21Ob2RlO2lmKG51bGwhPT1lJiZlLmlzTGlua0xhYmVsJiYoZC5hZGQoZSksc2coYSxlLmxhYmVsZWRMaW5rLGMsZCkpKXJldHVybiEwO2I9Yi50b05vZGU7cmV0dXJuIG51bGwhPT1iJiZiLmlzTGlua0xhYmVsJiYoZC5hZGQoYiksc2coYSxiLmxhYmVsZWRMaW5rLGMsZCkpPyEwOiExO31yZy5wcm90b3R5cGUuaXNWYWxpZEN5Y2xlPWZ1bmN0aW9uKGEsYixjKXt2b2lkIDA9PT1jJiYoYz1udWxsKTtpZihudWxsPT09YXx8bnVsbD09PWIpcmV0dXJuIHRoaXMuaXNVbmNvbm5lY3RlZExpbmtWYWxpZDt2YXIgZD10aGlzLmRpYWdyYW0udmFsaWRDeWNsZTtpZihkIT09dGcpe2lmKGQ9PT11Zyl7ZD1jfHx0aGlzLnRlbXBvcmFyeUxpbms7aWYobnVsbCE9PWQmJiFkLmlzVHJlZUxpbmspcmV0dXJuITA7Zm9yKGQ9Yi5saW5rc0Nvbm5lY3RlZDtkLm5leHQoKTspe3ZhciBlPWQudmFsdWU7aWYoZSE9PWMmJmUuaXNUcmVlTGluayYmZS50b05vZGU9PT1iKXJldHVybiExO31yZXR1cm4hdmcodGhpcyxhLGIsYywhMCk7fWlmKGQ9PT13Zyl7ZD1jfHx0aGlzLnRlbXBvcmFyeUxpbms7aWYobnVsbCE9PWQmJiFkLmlzVHJlZUxpbmspcmV0dXJuITA7Zm9yKGQ9YS5saW5rc0Nvbm5lY3RlZDtkLm5leHQoKTspe2lmKGU9ZC52YWx1ZSxlIT09YyYmZS5pc1RyZWVMaW5rJiZlLmZyb21Ob2RlPT09YSlyZXR1cm4hMTt9cmV0dXJuIXZnKHRoaXMsYSxiLGMsITApO31pZihkPT09eGcpcmV0dXJuIGE9PT1iP2E9ITA6KGQ9bmV3IEYoKSxkLmFkZChiKSxhPXlnKHRoaXMsZCxhLGIsYykpLCFhO2lmKGQ9PT16ZylyZXR1cm4hdmcodGhpcyxhLGIsYywhMSk7aWYoZD09PUdnKXJldHVybiBhPT09Yj9hPSEwOihkPW5ldyBGKCksZC5hZGQoYiksYT1IZyh0aGlzLGQsYSxiLGMpKSwhYTt9cmV0dXJuITA7fTtmdW5jdGlvbiB2ZyhhLGIsYyxkLGUpe2lmKGI9PT1jKXJldHVybiEwO2lmKG51bGw9PT1ifHxudWxsPT09YylyZXR1cm4hMTtmb3IodmFyIGY9Yi5saW5rc0Nvbm5lY3RlZDtmLm5leHQoKTspe3ZhciBnPWYudmFsdWU7aWYoZyE9PWQmJighZXx8Zy5pc1RyZWVMaW5rKSYmZy50b05vZGU9PT1iJiYoZz1nLmZyb21Ob2RlLGchPT1iJiZ2ZyhhLGcsYyxkLGUpKSlyZXR1cm4hMDt9cmV0dXJuITE7fWZ1bmN0aW9uIHlnKGEsYixjLGQsZSl7aWYoYz09PWQpcmV0dXJuITA7aWYobnVsbD09PWN8fG51bGw9PT1kfHxiLmNvbnRhaW5zKGMpKXJldHVybiExO2IuYWRkKGMpO2Zvcih2YXIgZj1jLmxpbmtzQ29ubmVjdGVkO2YubmV4dCgpOyl7dmFyIGc9Zi52YWx1ZTtpZihnIT09ZSYmZy50b05vZGU9PT1jJiYoZz1nLmZyb21Ob2RlLGchPT1jJiZ5ZyhhLGIsZyxkLGUpKSlyZXR1cm4hMDt9cmV0dXJuITE7fWZ1bmN0aW9uIEhnKGEsYixjLGQsZSl7aWYoYz09PWQpcmV0dXJuITA7aWYobnVsbD09PWN8fG51bGw9PT1kfHxiLmNvbnRhaW5zKGMpKXJldHVybiExO2IuYWRkKGMpO2Zvcih2YXIgZj1jLmxpbmtzQ29ubmVjdGVkO2YubmV4dCgpOyl7dmFyIGc9Zi52YWx1ZTtpZihnIT09ZSl7dmFyIGg9Zy5mcm9tTm9kZTtnPWcudG9Ob2RlO2g9aD09PWM/ZzpoO2lmKGghPT1jJiZIZyhhLGIsaCxkLGUpKXJldHVybiEwO319cmV0dXJuITE7fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJnLnByb3RvdHlwZSx7cG9ydEdyYXZpdHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53Zzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7MDw9YSYmKHRoaXMud2c9YSk7fX0saXNVbmNvbm5lY3RlZExpbmtWYWxpZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmJhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmJhPWE7fX0sdGVtcG9yYXJ5TGluazp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkdtO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkdtPWE7fX0sdGVtcG9yYXJ5RnJvbU5vZGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5FbTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5FbT1hO319LHRlbXBvcmFyeUZyb21Qb3J0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRm07fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuRm09YTt9fSx0ZW1wb3JhcnlUb05vZGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53cTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy53cT1hO319LHRlbXBvcmFyeVRvUG9ydDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmN3O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmN3PWE7fX0sb3JpZ2luYWxMaW5rOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuV2I7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuV2I9YTt9fSxvcmlnaW5hbEZyb21Ob2RlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTGE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTGE9YTt9fSxvcmlnaW5hbEZyb21Qb3J0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTWE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTWE9YTt9fSxvcmlnaW5hbFRvTm9kZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLktjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLktjPWE7fX0sb3JpZ2luYWxUb1BvcnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5WYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5WYz1hO319LGlzRm9yd2FyZHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5LO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLks9YTt9fSx2YWxpZFBvcnRzQ2FjaGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5TeDt9fSx0YXJnZXRQb3J0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRG07fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuRG09YTt9fSxsaW5rVmFsaWRhdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmlpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmlpPWE7fX0scG9ydFRhcmdldGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ207fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuQ209YTt9fX0pO3JnLmNsYXNzTmFtZT0iTGlua2luZ0Jhc2VUb29sIjtmdW5jdGlvbiBJZygpe3JnLmNhbGwodGhpcyk7dGhpcy5uYW1lPSJMaW5raW5nIjt0aGlzLnU9e307dGhpcy5sPW51bGw7dGhpcy5MPUpnO3RoaXMuQ2g9bnVsbDt9b2EoSWcscmcpO0lnLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07cmV0dXJuIGEuaXNSZWFkT25seXx8YS5pc01vZGVsUmVhZE9ubHl8fCFhLmFsbG93TGlua3x8IWEubW9kZWwuZHQoKXx8IWEubGFzdElucHV0LmxlZnR8fGEuY3VycmVudFRvb2whPT10aGlzJiYhdGhpcy5pc0JleW9uZERyYWdTaXplKCk/ITE6bnVsbCE9PXRoaXMuZmluZExpbmthYmxlUG9ydCgpO307SWcucHJvdG90eXBlLmZpbmRMaW5rYWJsZVBvcnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW0sYj10aGlzLnN0YXJ0T2JqZWN0O251bGw9PT1iJiYoYj1hLlNiKGEuZmlyc3RJbnB1dC5kb2N1bWVudFBvaW50LG51bGwsbnVsbCkpO2lmKG51bGw9PT1ifHwhKGIucGFydCBpbnN0YW5jZW9mIFYpKXJldHVybiBudWxsO2E9dGhpcy5kaXJlY3Rpb247aWYoYT09PUpnfHxhPT09S2cpe3ZhciBjPXRoaXMuZmluZFZhbGlkTGlua2FibGVQb3J0KGIsITEpO2lmKG51bGwhPT1jKXJldHVybiB0aGlzLmlzRm9yd2FyZHM9ITAsYzt9aWYoYT09PUpnfHxhPT09TGcpaWYoYj10aGlzLmZpbmRWYWxpZExpbmthYmxlUG9ydChiLCEwKSxudWxsIT09YilyZXR1cm4gdGhpcy5pc0ZvcndhcmRzPSExLGI7cmV0dXJuIG51bGw7fTtJZy5wcm90b3R5cGUuZG9BY3RpdmF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbSxiPXRoaXMuZmluZExpbmthYmxlUG9ydCgpO251bGwhPT1iJiYodGhpcy5BYSh0aGlzLm5hbWUpLGEuaXNNb3VzZUNhcHR1cmVkPSEwLGEuY3VycmVudEN1cnNvcj0icG9pbnRlciIsdGhpcy5pc0ZvcndhcmRzPyhudWxsPT09dGhpcy50ZW1wb3JhcnlUb05vZGV8fHRoaXMudGVtcG9yYXJ5VG9Ob2RlLmxvY2F0aW9uLm8oKXx8KHRoaXMudGVtcG9yYXJ5VG9Ob2RlLmxvY2F0aW9uPWEubGFzdElucHV0LmRvY3VtZW50UG9pbnQpLHRoaXMub3JpZ2luYWxGcm9tUG9ydD1iLGI9dGhpcy5vcmlnaW5hbEZyb21Qb3J0LnBhcnQsYiBpbnN0YW5jZW9mIFYmJih0aGlzLm9yaWdpbmFsRnJvbU5vZGU9YiksdGhpcy5jb3B5UG9ydFByb3BlcnRpZXModGhpcy5vcmlnaW5hbEZyb21Ob2RlLHRoaXMub3JpZ2luYWxGcm9tUG9ydCx0aGlzLnRlbXBvcmFyeUZyb21Ob2RlLHRoaXMudGVtcG9yYXJ5RnJvbVBvcnQsITEpKToobnVsbD09PXRoaXMudGVtcG9yYXJ5RnJvbU5vZGV8fHRoaXMudGVtcG9yYXJ5RnJvbU5vZGUubG9jYXRpb24ubygpfHwodGhpcy50ZW1wb3JhcnlGcm9tTm9kZS5sb2NhdGlvbj1hLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50KSx0aGlzLm9yaWdpbmFsVG9Qb3J0PWIsYj10aGlzLm9yaWdpbmFsVG9Qb3J0LnBhcnQsYiBpbnN0YW5jZW9mIFYmJih0aGlzLm9yaWdpbmFsVG9Ob2RlPWIpLHRoaXMuY29weVBvcnRQcm9wZXJ0aWVzKHRoaXMub3JpZ2luYWxUb05vZGUsdGhpcy5vcmlnaW5hbFRvUG9ydCx0aGlzLnRlbXBvcmFyeVRvTm9kZSx0aGlzLnRlbXBvcmFyeVRvUG9ydCwhMCkpLGEuYWRkKHRoaXMudGVtcG9yYXJ5RnJvbU5vZGUpLGEuYWRkKHRoaXMudGVtcG9yYXJ5VG9Ob2RlKSxudWxsIT09dGhpcy50ZW1wb3JhcnlMaW5rJiYobnVsbCE9PXRoaXMudGVtcG9yYXJ5RnJvbU5vZGUmJih0aGlzLnRlbXBvcmFyeUxpbmsuZnJvbU5vZGU9dGhpcy50ZW1wb3JhcnlGcm9tTm9kZSksbnVsbCE9PXRoaXMudGVtcG9yYXJ5VG9Ob2RlJiYodGhpcy50ZW1wb3JhcnlMaW5rLnRvTm9kZT10aGlzLnRlbXBvcmFyeVRvTm9kZSksdGhpcy50ZW1wb3JhcnlMaW5rLmlzVHJlZUxpbms9dGhpcy5pc05ld1RyZWVMaW5rKCksdGhpcy50ZW1wb3JhcnlMaW5rLlJhKCksYS5hZGQodGhpcy50ZW1wb3JhcnlMaW5rKSksdGhpcy5pc0FjdGl2ZT0hMCk7fTtJZy5wcm90b3R5cGUuZG9EZWFjdGl2YXRlPWZ1bmN0aW9uKCl7dGhpcy5pc0FjdGl2ZT0hMTt2YXIgYT10aGlzLmRpYWdyYW07YS5yZW1vdmUodGhpcy50ZW1wb3JhcnlMaW5rKTthLnJlbW92ZSh0aGlzLnRlbXBvcmFyeUZyb21Ob2RlKTthLnJlbW92ZSh0aGlzLnRlbXBvcmFyeVRvTm9kZSk7YS5pc01vdXNlQ2FwdHVyZWQ9ITE7YS5jdXJyZW50Q3Vyc29yPSIiO3RoaXMudmcoKTt9O0lnLnByb3RvdHlwZS5kb1N0b3A9ZnVuY3Rpb24oKXtyZy5wcm90b3R5cGUuZG9TdG9wLmNhbGwodGhpcyk7dGhpcy5zdGFydE9iamVjdD1udWxsO307SWcucHJvdG90eXBlLmRvTW91c2VVcD1mdW5jdGlvbigpe2lmKHRoaXMuaXNBY3RpdmUpe3ZhciBhPXRoaXMuZGlhZ3JhbSxiPXRoaXMudHJhbnNhY3Rpb25SZXN1bHQ9bnVsbCxjPW51bGwsZD1udWxsLGU9bnVsbCxmPXRoaXMudGFyZ2V0UG9ydD10aGlzLmZpbmRUYXJnZXRQb3J0KHRoaXMuaXNGb3J3YXJkcyk7aWYobnVsbCE9PWYpe3ZhciBnPWYucGFydDtnIGluc3RhbmNlb2YgViYmKHRoaXMuaXNGb3J3YXJkcz8obnVsbCE9PXRoaXMub3JpZ2luYWxGcm9tTm9kZSYmKGI9dGhpcy5vcmlnaW5hbEZyb21Ob2RlLGM9dGhpcy5vcmlnaW5hbEZyb21Qb3J0KSxkPWcsZT1mKTooYj1nLGM9ZixudWxsIT09dGhpcy5vcmlnaW5hbFRvTm9kZSYmKGQ9dGhpcy5vcmlnaW5hbFRvTm9kZSxlPXRoaXMub3JpZ2luYWxUb1BvcnQpKSk7fWVsc2UgdGhpcy5pc0ZvcndhcmRzP251bGwhPT10aGlzLm9yaWdpbmFsRnJvbU5vZGUmJnRoaXMuaXNVbmNvbm5lY3RlZExpbmtWYWxpZCYmKGI9dGhpcy5vcmlnaW5hbEZyb21Ob2RlLGM9dGhpcy5vcmlnaW5hbEZyb21Qb3J0KTpudWxsIT09dGhpcy5vcmlnaW5hbFRvTm9kZSYmdGhpcy5pc1VuY29ubmVjdGVkTGlua1ZhbGlkJiYoZD10aGlzLm9yaWdpbmFsVG9Ob2RlLGU9dGhpcy5vcmlnaW5hbFRvUG9ydCk7bnVsbCE9PWJ8fG51bGwhPT1kPyhnPXRoaXMuaW5zZXJ0TGluayhiLGMsZCxlKSxudWxsIT09Zz8obnVsbD09PWYmJih0aGlzLmlzRm9yd2FyZHM/Zy5kZWZhdWx0VG9Qb2ludD1hLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50OmcuZGVmYXVsdEZyb21Qb2ludD1hLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50KSxhLmFsbG93U2VsZWN0JiZhLnNlbGVjdChnKSx0aGlzLnRyYW5zYWN0aW9uUmVzdWx0PXRoaXMubmFtZSxhLmFhKCJMaW5rRHJhd24iLGcpKTooYS5tb2RlbC5MdSgpLHRoaXMuZG9Ob0xpbmsoYixjLGQsZSkpKTp0aGlzLmlzRm9yd2FyZHM/dGhpcy5kb05vTGluayh0aGlzLm9yaWdpbmFsRnJvbU5vZGUsdGhpcy5vcmlnaW5hbEZyb21Qb3J0LG51bGwsbnVsbCk6dGhpcy5kb05vTGluayhudWxsLG51bGwsdGhpcy5vcmlnaW5hbFRvTm9kZSx0aGlzLm9yaWdpbmFsVG9Qb3J0KTt9dGhpcy5zdG9wVG9vbCgpO307SWcucHJvdG90eXBlLmlzTmV3VHJlZUxpbms9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmFyY2hldHlwZUxpbmtEYXRhO2lmKG51bGw9PT1hKXJldHVybiEwO2lmKGEgaW5zdGFuY2VvZiBTKXJldHVybiBhLmlzVHJlZUxpbms7dmFyIGI9dGhpcy5kaWFncmFtO2lmKG51bGw9PT1iKXJldHVybiEwO2E9Yi5wYXJ0TWFuYWdlci5nZXRMaW5rQ2F0ZWdvcnlGb3JEYXRhKGEpO2I9Yi5wYXJ0TWFuYWdlci5maW5kTGlua1RlbXBsYXRlRm9yQ2F0ZWdvcnkoYSk7cmV0dXJuIG51bGwhPT1iP2IuaXNUcmVlTGluazohMDt9O0lnLnByb3RvdHlwZS5pbnNlcnRMaW5rPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmRpYWdyYW0ucGFydE1hbmFnZXIuaW5zZXJ0TGluayhhLGIsYyxkKTt9O0lnLnByb3RvdHlwZS5kb05vTGluaz1mdW5jdGlvbigpe307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSWcucHJvdG90eXBlLHthcmNoZXR5cGVMaW5rRGF0YTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudT1hO319LGFyY2hldHlwZUxhYmVsTm9kZURhdGE6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmw9YTt9fSxkaXJlY3Rpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5MO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkw9YTt9fSxzdGFydE9iamVjdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkNoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkNoPWE7fX19KTt2YXIgSmc9bmV3IEQoSWcsIkVpdGhlciIsMCksS2c9bmV3IEQoSWcsIkZvcndhcmRzT25seSIsMCksTGc9bmV3IEQoSWcsIkJhY2t3YXJkc09ubHkiLDApO0lnLmNsYXNzTmFtZT0iTGlua2luZ1Rvb2wiO0lnLkVpdGhlcj1KZztJZy5Gb3J3YXJkc09ubHk9S2c7SWcuQmFja3dhcmRzT25seT1MZztmdW5jdGlvbiBOZigpe3JnLmNhbGwodGhpcyk7dGhpcy5uYW1lPSJSZWxpbmtpbmciO3ZhciBhPW5ldyBXKCk7YS5maWd1cmU9IkRpYW1vbmQiO2EuZGVzaXJlZFNpemU9aWM7YS5maWxsPSJsaWdodGJsdWUiO2Euc3Ryb2tlPSJkb2RnZXJibHVlIjthLmN1cnNvcj0icG9pbnRlciI7YS5zZWdtZW50SW5kZXg9MDt0aGlzLnU9YTthPW5ldyBXKCk7YS5maWd1cmU9IkRpYW1vbmQiO2EuZGVzaXJlZFNpemU9aWM7YS5maWxsPSJsaWdodGJsdWUiO2Euc3Ryb2tlPSJkb2RnZXJibHVlIjthLmN1cnNvcj0icG9pbnRlciI7YS5zZWdtZW50SW5kZXg9LTE7dGhpcy5DaD1hO3RoaXMubD1udWxsO3RoaXMuSHc9bmV3IE4oKTt9b2EoTmYscmcpO05mLnByb3RvdHlwZS51cGRhdGVBZG9ybm1lbnRzPWZ1bmN0aW9uKGEpe2lmKG51bGwhPT1hJiZhIGluc3RhbmNlb2YgUyl7dmFyIGI9IlJlbGlua0Zyb20iLGM9bnVsbDtpZihhLmlzU2VsZWN0ZWQmJiF0aGlzLmRpYWdyYW0uaXNSZWFkT25seSl7dmFyIGQ9YS5zZWxlY3Rpb25PYmplY3Q7bnVsbCE9PWQmJmEuY2FuUmVsaW5rRnJvbSgpJiZhLmFjdHVhbEJvdW5kcy5vKCkmJmEuaXNWaXNpYmxlKCkmJmQuYWN0dWFsQm91bmRzLm8oKSYmZC5yZigpJiYoYz1hLiRqKGIpLG51bGw9PT1jJiYoYz10aGlzLm1ha2VBZG9ybm1lbnQoZCwhMSksYS5xaChiLGMpKSk7fW51bGw9PT1jJiZhLnRmKGIpO2I9IlJlbGlua1RvIjtjPW51bGw7YS5pc1NlbGVjdGVkJiYhdGhpcy5kaWFncmFtLmlzUmVhZE9ubHkmJihkPWEuc2VsZWN0aW9uT2JqZWN0LG51bGwhPT1kJiZhLmNhblJlbGlua1RvKCkmJmEuYWN0dWFsQm91bmRzLm8oKSYmYS5pc1Zpc2libGUoKSYmZC5hY3R1YWxCb3VuZHMubygpJiZkLnJmKCkmJihjPWEuJGooYiksbnVsbD09PWM/KGM9dGhpcy5tYWtlQWRvcm5tZW50KGQsITApLGEucWgoYixjKSk6Yy5zKCkpKTtudWxsPT09YyYmYS50ZihiKTt9fTtOZi5wcm90b3R5cGUubWFrZUFkb3JubWVudD1mdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBwZigpO2MudHlwZT1YLkxpbms7Yj1iP3RoaXMudG9IYW5kbGVBcmNoZXR5cGU6dGhpcy5mcm9tSGFuZGxlQXJjaGV0eXBlO251bGwhPT1iJiZjLmFkZChiLmNvcHkoKSk7Yy5hZG9ybmVkT2JqZWN0PWE7cmV0dXJuIGM7fTtOZi5wcm90b3R5cGUuY2FuU3RhcnQ9ZnVuY3Rpb24oKXtpZighdGhpcy5pc0VuYWJsZWQpcmV0dXJuITE7dmFyIGE9dGhpcy5kaWFncmFtO2lmKGEuaXNSZWFkT25seXx8YS5pc01vZGVsUmVhZE9ubHl8fCFhLmFsbG93UmVsaW5rfHwhYS5tb2RlbC5kdCgpfHwhYS5sYXN0SW5wdXQubGVmdClyZXR1cm4hMTt2YXIgYj10aGlzLmZpbmRUb29sSGFuZGxlQXQoYS5maXJzdElucHV0LmRvY3VtZW50UG9pbnQsIlJlbGlua0Zyb20iKTtudWxsPT09YiYmKGI9dGhpcy5maW5kVG9vbEhhbmRsZUF0KGEuZmlyc3RJbnB1dC5kb2N1bWVudFBvaW50LCJSZWxpbmtUbyIpKTtyZXR1cm4gbnVsbCE9PWI7fTtOZi5wcm90b3R5cGUuZG9BY3RpdmF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtpZihudWxsPT09dGhpcy5vcmlnaW5hbExpbmspe3ZhciBiPXRoaXMuaGFuZGxlO251bGw9PT1iJiYoYj10aGlzLmZpbmRUb29sSGFuZGxlQXQoYS5maXJzdElucHV0LmRvY3VtZW50UG9pbnQsIlJlbGlua0Zyb20iKSxudWxsPT09YiYmKGI9dGhpcy5maW5kVG9vbEhhbmRsZUF0KGEuZmlyc3RJbnB1dC5kb2N1bWVudFBvaW50LCJSZWxpbmtUbyIpKSk7aWYobnVsbD09PWIpcmV0dXJuO3ZhciBjPWIucGFydDtpZighKGMgaW5zdGFuY2VvZiBwZiYmYy5hZG9ybmVkUGFydCBpbnN0YW5jZW9mIFMpKXJldHVybjt0aGlzLmhhbmRsZT1iO3RoaXMuaXNGb3J3YXJkcz1udWxsPT09Y3x8IlJlbGlua1RvIj09PWMuY2F0ZWdvcnk7dGhpcy5vcmlnaW5hbExpbms9Yy5hZG9ybmVkUGFydDt9dGhpcy5BYSh0aGlzLm5hbWUpO2EuaXNNb3VzZUNhcHR1cmVkPSEwO2EuY3VycmVudEN1cnNvcj0icG9pbnRlciI7dGhpcy5vcmlnaW5hbEZyb21Qb3J0PXRoaXMub3JpZ2luYWxMaW5rLmZyb21Qb3J0O3RoaXMub3JpZ2luYWxGcm9tTm9kZT10aGlzLm9yaWdpbmFsTGluay5mcm9tTm9kZTt0aGlzLm9yaWdpbmFsVG9Qb3J0PXRoaXMub3JpZ2luYWxMaW5rLnRvUG9ydDt0aGlzLm9yaWdpbmFsVG9Ob2RlPXRoaXMub3JpZ2luYWxMaW5rLnRvTm9kZTt0aGlzLkh3LnNldCh0aGlzLm9yaWdpbmFsTGluay5hY3R1YWxCb3VuZHMpO251bGwhPT10aGlzLm9yaWdpbmFsTGluayYmMDx0aGlzLm9yaWdpbmFsTGluay5wb2ludHNDb3VudCYmKG51bGw9PT10aGlzLm9yaWdpbmFsTGluay5mcm9tTm9kZSYmKG51bGwhPT10aGlzLnRlbXBvcmFyeUZyb21Qb3J0JiYodGhpcy50ZW1wb3JhcnlGcm9tUG9ydC5kZXNpcmVkU2l6ZT1mYyksbnVsbCE9PXRoaXMudGVtcG9yYXJ5RnJvbU5vZGUmJih0aGlzLnRlbXBvcmFyeUZyb21Ob2RlLmxvY2F0aW9uPXRoaXMub3JpZ2luYWxMaW5rLmkoMCkpKSxudWxsPT09dGhpcy5vcmlnaW5hbExpbmsudG9Ob2RlJiYobnVsbCE9PXRoaXMudGVtcG9yYXJ5VG9Qb3J0JiYodGhpcy50ZW1wb3JhcnlUb1BvcnQuZGVzaXJlZFNpemU9ZmMpLG51bGwhPT10aGlzLnRlbXBvcmFyeVRvTm9kZSYmKHRoaXMudGVtcG9yYXJ5VG9Ob2RlLmxvY2F0aW9uPXRoaXMub3JpZ2luYWxMaW5rLmkodGhpcy5vcmlnaW5hbExpbmsucG9pbnRzQ291bnQtMSkpKSk7dGhpcy5jb3B5UG9ydFByb3BlcnRpZXModGhpcy5vcmlnaW5hbEZyb21Ob2RlLHRoaXMub3JpZ2luYWxGcm9tUG9ydCx0aGlzLnRlbXBvcmFyeUZyb21Ob2RlLHRoaXMudGVtcG9yYXJ5RnJvbVBvcnQsITEpO3RoaXMuY29weVBvcnRQcm9wZXJ0aWVzKHRoaXMub3JpZ2luYWxUb05vZGUsdGhpcy5vcmlnaW5hbFRvUG9ydCx0aGlzLnRlbXBvcmFyeVRvTm9kZSx0aGlzLnRlbXBvcmFyeVRvUG9ydCwhMCk7YS5hZGQodGhpcy50ZW1wb3JhcnlGcm9tTm9kZSk7YS5hZGQodGhpcy50ZW1wb3JhcnlUb05vZGUpO251bGwhPT10aGlzLnRlbXBvcmFyeUxpbmsmJihudWxsIT09dGhpcy50ZW1wb3JhcnlGcm9tTm9kZSYmKHRoaXMudGVtcG9yYXJ5TGluay5mcm9tTm9kZT10aGlzLnRlbXBvcmFyeUZyb21Ob2RlKSxudWxsIT09dGhpcy50ZW1wb3JhcnlUb05vZGUmJih0aGlzLnRlbXBvcmFyeUxpbmsudG9Ob2RlPXRoaXMudGVtcG9yYXJ5VG9Ob2RlKSx0aGlzLmNvcHlMaW5rUHJvcGVydGllcyh0aGlzLm9yaWdpbmFsTGluayx0aGlzLnRlbXBvcmFyeUxpbmspLHRoaXMudGVtcG9yYXJ5TGluay5SYSgpLGEuYWRkKHRoaXMudGVtcG9yYXJ5TGluaykpO3RoaXMuaXNBY3RpdmU9ITA7fTtOZi5wcm90b3R5cGUuY29weUxpbmtQcm9wZXJ0aWVzPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9PWEmJm51bGwhPT1iKXtiLmFkanVzdGluZz1hLmFkanVzdGluZztiLmNvcm5lcj1hLmNvcm5lcjt2YXIgYz1hLmN1cnZlO2lmKGM9PT1NZ3x8Yz09PU5nKWM9T2c7Yi5jdXJ2ZT1jO2IuY3VydmluZXNzPWEuY3VydmluZXNzO2IuaXNUcmVlTGluaz1hLmlzVHJlZUxpbms7Yi5wb2ludHM9YS5wb2ludHM7Yi5yb3V0aW5nPWEucm91dGluZztiLnNtb290aG5lc3M9YS5zbW9vdGhuZXNzO2IuZnJvbVNwb3Q9YS5mcm9tU3BvdDtiLmZyb21FbmRTZWdtZW50TGVuZ3RoPWEuZnJvbUVuZFNlZ21lbnRMZW5ndGg7Yi5mcm9tU2hvcnRMZW5ndGg9YS5mcm9tU2hvcnRMZW5ndGg7Yi50b1Nwb3Q9YS50b1Nwb3Q7Yi50b0VuZFNlZ21lbnRMZW5ndGg9YS50b0VuZFNlZ21lbnRMZW5ndGg7Yi50b1Nob3J0TGVuZ3RoPWEudG9TaG9ydExlbmd0aDt9fTtOZi5wcm90b3R5cGUuZG9EZWFjdGl2YXRlPWZ1bmN0aW9uKCl7dGhpcy5pc0FjdGl2ZT0hMTt2YXIgYT10aGlzLmRpYWdyYW07YS5yZW1vdmUodGhpcy50ZW1wb3JhcnlMaW5rKTthLnJlbW92ZSh0aGlzLnRlbXBvcmFyeUZyb21Ob2RlKTthLnJlbW92ZSh0aGlzLnRlbXBvcmFyeVRvTm9kZSk7YS5pc01vdXNlQ2FwdHVyZWQ9ITE7YS5jdXJyZW50Q3Vyc29yPSIiO3RoaXMudmcoKTt9O05mLnByb3RvdHlwZS5kb1N0b3A9ZnVuY3Rpb24oKXtyZy5wcm90b3R5cGUuZG9TdG9wLmNhbGwodGhpcyk7dGhpcy5oYW5kbGU9bnVsbDt9O05mLnByb3RvdHlwZS5kb01vdXNlVXA9ZnVuY3Rpb24oKXtpZih0aGlzLmlzQWN0aXZlKXt2YXIgYT10aGlzLmRpYWdyYW07dGhpcy50cmFuc2FjdGlvblJlc3VsdD1udWxsO3ZhciBiPXRoaXMub3JpZ2luYWxGcm9tTm9kZSxjPXRoaXMub3JpZ2luYWxGcm9tUG9ydCxkPXRoaXMub3JpZ2luYWxUb05vZGUsZT10aGlzLm9yaWdpbmFsVG9Qb3J0LGY9dGhpcy5vcmlnaW5hbExpbms7dGhpcy50YXJnZXRQb3J0PXRoaXMuZmluZFRhcmdldFBvcnQodGhpcy5pc0ZvcndhcmRzKTtpZihudWxsIT09dGhpcy50YXJnZXRQb3J0KXt2YXIgZz10aGlzLnRhcmdldFBvcnQucGFydDtnIGluc3RhbmNlb2YgViYmKHRoaXMuaXNGb3J3YXJkcz8oZD1nLGU9dGhpcy50YXJnZXRQb3J0KTooYj1nLGM9dGhpcy50YXJnZXRQb3J0KSk7fWVsc2UgdGhpcy5pc1VuY29ubmVjdGVkTGlua1ZhbGlkP3RoaXMuaXNGb3J3YXJkcz9lPWQ9bnVsbDpjPWI9bnVsbDpmPW51bGw7bnVsbCE9PWY/KHRoaXMucmVjb25uZWN0TGluayhmLHRoaXMuaXNGb3J3YXJkcz9kOmIsdGhpcy5pc0ZvcndhcmRzP2U6Yyx0aGlzLmlzRm9yd2FyZHMpLG51bGw9PT10aGlzLnRhcmdldFBvcnQmJih0aGlzLmlzRm9yd2FyZHM/Zi5kZWZhdWx0VG9Qb2ludD1hLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50OmYuZGVmYXVsdEZyb21Qb2ludD1hLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50LGYuUmEoKSksYS5hbGxvd1NlbGVjdCYmKGYuaXNTZWxlY3RlZD0hMCksdGhpcy50cmFuc2FjdGlvblJlc3VsdD10aGlzLm5hbWUsYS5hYSgiTGlua1JlbGlua2VkIixmLHRoaXMuaXNGb3J3YXJkcz90aGlzLm9yaWdpbmFsVG9Qb3J0OnRoaXMub3JpZ2luYWxGcm9tUG9ydCkpOnRoaXMuZG9Ob1JlbGluayh0aGlzLm9yaWdpbmFsTGluayx0aGlzLmlzRm9yd2FyZHMpO3RoaXMub3JpZ2luYWxMaW5rLiRwKHRoaXMuSHcpO310aGlzLnN0b3BUb29sKCk7fTtOZi5wcm90b3R5cGUucmVjb25uZWN0TGluaz1mdW5jdGlvbihhLGIsYyxkKXtjPW51bGwhPT1jJiZudWxsIT09Yy5wb3J0SWQ/Yy5wb3J0SWQ6IiI7ZD8oYS50b05vZGU9YixhLnRvUG9ydElkPWMpOihhLmZyb21Ob2RlPWIsYS5mcm9tUG9ydElkPWMpO3JldHVybiEwO307TmYucHJvdG90eXBlLmRvTm9SZWxpbms9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIGtnKGEsYixjLGQsZSl7bnVsbCE9PWI/KGEuY29weVBvcnRQcm9wZXJ0aWVzKGIsYyxhLnRlbXBvcmFyeUZyb21Ob2RlLGEudGVtcG9yYXJ5RnJvbVBvcnQsITEpLGEuZGlhZ3JhbS5hZGQoYS50ZW1wb3JhcnlGcm9tTm9kZSkpOmEuZGlhZ3JhbS5yZW1vdmUoYS50ZW1wb3JhcnlGcm9tTm9kZSk7bnVsbCE9PWQ/KGEuY29weVBvcnRQcm9wZXJ0aWVzKGQsZSxhLnRlbXBvcmFyeVRvTm9kZSxhLnRlbXBvcmFyeVRvUG9ydCwhMCksYS5kaWFncmFtLmFkZChhLnRlbXBvcmFyeVRvTm9kZSkpOmEuZGlhZ3JhbS5yZW1vdmUoYS50ZW1wb3JhcnlUb05vZGUpO31wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhOZi5wcm90b3R5cGUse2Zyb21IYW5kbGVBcmNoZXR5cGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy51O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnU9YTt9fSx0b0hhbmRsZUFyY2hldHlwZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkNoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkNoPWE7fX0saGFuZGxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYobnVsbCE9PWEmJiEoYS5wYXJ0IGluc3RhbmNlb2YgcGYpKXRocm93IEVycm9yKCJuZXcgaGFuZGxlIGlzIG5vdCBpbiBhbiBBZG9ybm1lbnQ6ICIrYSk7dGhpcy5sPWE7fX19KTtOZi5jbGFzc05hbWU9IlJlbGlua2luZ1Rvb2wiO1RhKCJsaW5raW5nVG9vbCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kVG9vbCgiTGlua2luZyIpO30sZnVuY3Rpb24oYSl7dmYodGhpcywiTGlua2luZyIsYSx0aGlzLm1vdXNlTW92ZVRvb2xzKTt9KTtUYSgicmVsaW5raW5nVG9vbCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kVG9vbCgiUmVsaW5raW5nIik7fSxmdW5jdGlvbihhKXt2Zih0aGlzLCJSZWxpbmtpbmciLGEsdGhpcy5tb3VzZURvd25Ub29scyk7fSk7ZnVuY3Rpb24gUGcoKXtrZi5jYWxsKHRoaXMpO3RoaXMubmFtZT0iTGlua1Jlc2hhcGluZyI7dmFyIGE9bmV3IFcoKTthLmZpZ3VyZT0iUmVjdGFuZ2xlIjthLmRlc2lyZWRTaXplPWhjO2EuZmlsbD0ibGlnaHRibHVlIjthLnN0cm9rZT0iZG9kZ2VyYmx1ZSI7dGhpcy51PWE7YT1uZXcgVygpO2EuZmlndXJlPSJEaWFtb25kIjthLmRlc2lyZWRTaXplPWljO2EuZmlsbD0ibGlnaHRibHVlIjthLnN0cm9rZT0iZG9kZ2VyYmx1ZSI7YS5jdXJzb3I9Im1vdmUiO3RoaXMuSz1hO3RoaXMuYmE9Mzt0aGlzLkh0PXRoaXMubD1udWxsO3RoaXMudWw9bmV3IEcoKTt0aGlzLmRzPW5ldyBFKCk7fW9hKFBnLGtmKTtQZy5wcm90b3R5cGUuZHY9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuanMmJjAhPT1hLmpzLnZhbHVlP2EuanM6UWc7fTtQZy5wcm90b3R5cGUud209ZnVuY3Rpb24oYSxiKXthLmpzPWI7fTtQZy5wcm90b3R5cGUudXBkYXRlQWRvcm5tZW50cz1mdW5jdGlvbihhKXtpZihudWxsIT09YSYmYSBpbnN0YW5jZW9mIFMpe3ZhciBiPW51bGw7aWYoYS5pc1NlbGVjdGVkJiYhdGhpcy5kaWFncmFtLmlzUmVhZE9ubHkpe3ZhciBjPWEucGF0aDtudWxsIT09YyYmYS5jYW5SZXNoYXBlKCkmJmEuYWN0dWFsQm91bmRzLm8oKSYmYS5pc1Zpc2libGUoKSYmYy5hY3R1YWxCb3VuZHMubygpJiZjLnJmKCkmJihiPWEuJGoodGhpcy5uYW1lKSxudWxsPT09Ynx8Yi5FdyE9PWEucG9pbnRzQ291bnR8fGIuUHchPT1hLnJlc2VnbWVudGFibGUpJiYoYj10aGlzLm1ha2VBZG9ybm1lbnQoYyksbnVsbCE9PWImJihiLkV3PWEucG9pbnRzQ291bnQsYi5Qdz1hLnJlc2VnbWVudGFibGUsYS5xaCh0aGlzLm5hbWUsYikpKTt9bnVsbD09PWImJmEudGYodGhpcy5uYW1lKTt9fTtQZy5wcm90b3R5cGUubWFrZUFkb3JubWVudD1mdW5jdGlvbihhKXt2YXIgYj1hLnBhcnQsYz1iLnBvaW50c0NvdW50LGQ9Yi5pc09ydGhvZ29uYWwsZT1udWxsO2lmKG51bGwhPT1iLnBvaW50cyYmMTxjKXtlPW5ldyBwZigpO2UudHlwZT1YLkxpbms7Yz1iLmZpcnN0UGlja0luZGV4O3ZhciBmPWIubGFzdFBpY2tJbmRleCxnPWQ/MTowO2lmKGIucmVzZWdtZW50YWJsZSYmYi5jb21wdXRlQ3VydmUoKSE9PVJnKWZvcih2YXIgaD1jK2c7aDxmLWc7aCsrKXt2YXIgaz10aGlzLm1ha2VSZXNlZ21lbnRIYW5kbGUoYSxoKTtudWxsIT09ayYmKGsuc2VnbWVudEluZGV4PWgsay5zZWdtZW50RnJhY3Rpb249LjUsay5mcm9tTWF4TGlua3M9OTk5LGUuYWRkKGspKTt9Zm9yKGc9YysxO2c8ZjtnKyspe2lmKGg9dGhpcy5tYWtlSGFuZGxlKGEsZyksbnVsbCE9PWgpe2guc2VnbWVudEluZGV4PWc7aWYoZyE9PWMpaWYoZz09PWMrMSYmZCl7az1iLmkoYyk7dmFyIGw9Yi5pKGMrMSk7SC53KGsueCxsLngpJiZILncoay55LGwueSkmJihsPWIuaShjLTEpKTtILncoay54LGwueCk/KHRoaXMud20oaCxTZyksaC5jdXJzb3I9Im4tcmVzaXplIik6SC53KGsueSxsLnkpJiYodGhpcy53bShoLFRnKSxoLmN1cnNvcj0idy1yZXNpemUiKTt9ZWxzZSBnPT09Zi0xJiZkPyhrPWIuaShmLTEpLGw9Yi5pKGYpLEgudyhrLngsbC54KSYmSC53KGsueSxsLnkpJiYoaz1iLmkoZisxKSksSC53KGsueCxsLngpPyh0aGlzLndtKGgsU2cpLGguY3Vyc29yPSJuLXJlc2l6ZSIpOkgudyhrLnksbC55KSYmKHRoaXMud20oaCxUZyksaC5jdXJzb3I9InctcmVzaXplIikpOmchPT1mJiYodGhpcy53bShoLFVnKSxoLmN1cnNvcj0ibW92ZSIpO2UuYWRkKGgpO319ZS5hZG9ybmVkT2JqZWN0PWE7fXJldHVybiBlO307UGcucHJvdG90eXBlLm1ha2VIYW5kbGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmhhbmRsZUFyY2hldHlwZTtyZXR1cm4gbnVsbD09PWE/bnVsbDphLmNvcHkoKTt9O1BnLnByb3RvdHlwZS5tYWtlUmVzZWdtZW50SGFuZGxlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5taWRIYW5kbGVBcmNoZXR5cGU7cmV0dXJuIG51bGw9PT1hP251bGw6YS5jb3B5KCk7fTtQZy5wcm90b3R5cGUuY2FuU3RhcnQ9ZnVuY3Rpb24oKXtpZighdGhpcy5pc0VuYWJsZWQpcmV0dXJuITE7dmFyIGE9dGhpcy5kaWFncmFtO3JldHVybiFhLmlzUmVhZE9ubHkmJmEuYWxsb3dSZXNoYXBlJiZhLmxhc3RJbnB1dC5sZWZ0P251bGwhPT10aGlzLmZpbmRUb29sSGFuZGxlQXQoYS5maXJzdElucHV0LmRvY3VtZW50UG9pbnQsdGhpcy5uYW1lKTohMTt9O1BnLnByb3RvdHlwZS5kb0FjdGl2YXRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO251bGw9PT10aGlzLmhhbmRsZSYmKHRoaXMuaGFuZGxlPXRoaXMuZmluZFRvb2xIYW5kbGVBdChhLmZpcnN0SW5wdXQuZG9jdW1lbnRQb2ludCx0aGlzLm5hbWUpKTtpZihudWxsIT09dGhpcy5oYW5kbGUpe3ZhciBiPXRoaXMuaGFuZGxlLnBhcnQuYWRvcm5lZFBhcnQ7aWYoYiBpbnN0YW5jZW9mIFMpe3RoaXMuSHQ9YjthLmlzTW91c2VDYXB0dXJlZD0hMDt0aGlzLkFhKHRoaXMubmFtZSk7aWYoYi5yZXNlZ21lbnRhYmxlJiY5OTk9PT10aGlzLmhhbmRsZS5mcm9tTWF4TGlua3Mpe3ZhciBjPWIucG9pbnRzLmNvcHkoKSxkPXRoaXMuZ2V0UmVzZWdtZW50aW5nUG9pbnQoKTtjLkliKHRoaXMuaGFuZGxlLnNlZ21lbnRJbmRleCsxLGQpO2IuaXNPcnRob2dvbmFsJiZjLkliKHRoaXMuaGFuZGxlLnNlZ21lbnRJbmRleCsxLGQpO2IucG9pbnRzPWM7Yi5KYigpO2IudXBkYXRlQWRvcm5tZW50cygpO3RoaXMuaGFuZGxlPXRoaXMuZmluZFRvb2xIYW5kbGVBdChhLmZpcnN0SW5wdXQuZG9jdW1lbnRQb2ludCx0aGlzLm5hbWUpO2lmKG51bGw9PT10aGlzLmhhbmRsZSl7dGhpcy5kb0RlYWN0aXZhdGUoKTtyZXR1cm47fX10aGlzLnVsPWIuaSh0aGlzLmhhbmRsZS5zZWdtZW50SW5kZXgpO3RoaXMuZHM9Yi5wb2ludHMuY29weSgpO3RoaXMuaXNBY3RpdmU9ITA7fX19O1BnLnByb3RvdHlwZS5kb0RlYWN0aXZhdGU9ZnVuY3Rpb24oKXt0aGlzLnZnKCk7dGhpcy5IdD10aGlzLmhhbmRsZT1udWxsO3RoaXMuaXNBY3RpdmU9dGhpcy5kaWFncmFtLmlzTW91c2VDYXB0dXJlZD0hMTt9O1BnLnByb3RvdHlwZS5kb0NhbmNlbD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYWRvcm5lZExpbms7bnVsbCE9PWEmJihhLnBvaW50cz10aGlzLmRzKTt0aGlzLnN0b3BUb29sKCk7fTtQZy5wcm90b3R5cGUuZ2V0UmVzZWdtZW50aW5nUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYW5kbGUubWEoZGQpO307UGcucHJvdG90eXBlLmRvTW91c2VNb3ZlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO3RoaXMuaXNBY3RpdmUmJihhPXRoaXMuY29tcHV0ZVJlc2hhcGUoYS5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludCksdGhpcy5yZXNoYXBlKGEpKTt9O1BnLnByb3RvdHlwZS5kb01vdXNlVXA9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07aWYodGhpcy5pc0FjdGl2ZSl7dmFyIGI9dGhpcy5jb21wdXRlUmVzaGFwZShhLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50KTt0aGlzLnJlc2hhcGUoYik7Yj10aGlzLmFkb3JuZWRMaW5rO2lmKG51bGwhPT1iJiZiLnJlc2VnbWVudGFibGUpe3ZhciBjPXRoaXMuaGFuZGxlLnNlZ21lbnRJbmRleCxkPWIuaShjLTEpLGU9Yi5pKGMpLGY9Yi5pKGMrMSk7aWYoYi5pc09ydGhvZ29uYWwpe2lmKGM+Yi5maXJzdFBpY2tJbmRleCsxJiZjPGIubGFzdFBpY2tJbmRleC0xKXt2YXIgZz1iLmkoYy0yKTtpZihNYXRoLmFicyhkLngtZS54KTx0aGlzLnJlc2VnbWVudGluZ0Rpc3RhbmNlJiZNYXRoLmFicyhkLnktZS55KTx0aGlzLnJlc2VnbWVudGluZ0Rpc3RhbmNlJiYoVmcodGhpcyxnLGQsZSxmLCEwKXx8VmcodGhpcyxnLGQsZSxmLCExKSkpe3ZhciBoPWIucG9pbnRzLmNvcHkoKTtWZyh0aGlzLGcsZCxlLGYsITApPyhoLmdkKGMtMixuZXcgRyhnLngsKGYueStnLnkpLzIpKSxoLmdkKGMrMSxuZXcgRyhmLngsKGYueStnLnkpLzIpKSk6KGguZ2QoYy0yLG5ldyBHKChmLngrZy54KS8yLGcueSkpLGguZ2QoYysxLG5ldyBHKChmLngrZy54KS8yLGYueSkpKTtoLm1iKGMpO2gubWIoYy0xKTtiLnBvaW50cz1oO2IuSmIoKTt9ZWxzZSBnPWIuaShjKzIpLE1hdGguYWJzKGUueC1mLngpPHRoaXMucmVzZWdtZW50aW5nRGlzdGFuY2UmJk1hdGguYWJzKGUueS1mLnkpPHRoaXMucmVzZWdtZW50aW5nRGlzdGFuY2UmJihWZyh0aGlzLGQsZSxmLGcsITApfHxWZyh0aGlzLGQsZSxmLGcsITEpKSYmKGg9Yi5wb2ludHMuY29weSgpLFZnKHRoaXMsZCxlLGYsZywhMCk/KGguZ2QoYy0xLG5ldyBHKGQueCwoZC55K2cueSkvMikpLGguZ2QoYysyLG5ldyBHKGcueCwoZC55K2cueSkvMikpKTooaC5nZChjLTEsbmV3IEcoKGQueCtnLngpLzIsZC55KSksaC5nZChjKzIsbmV3IEcoKGQueCtnLngpLzIsZy55KSkpLGgubWIoYysxKSxoLm1iKGMpLGIucG9pbnRzPWgsYi5KYigpKTt9fWVsc2UgZz1HLmFsbG9jKCksSC5RaShkLngsZC55LGYueCxmLnksZS54LGUueSxnKSYmZy5CZShlKTx0aGlzLnJlc2VnbWVudGluZ0Rpc3RhbmNlKnRoaXMucmVzZWdtZW50aW5nRGlzdGFuY2UmJihkPWIucG9pbnRzLmNvcHkoKSxkLm1iKGMpLGIucG9pbnRzPWQsYi5KYigpKSxHLmZyZWUoZyk7fWEuWGEoKTt0aGlzLnRyYW5zYWN0aW9uUmVzdWx0PXRoaXMubmFtZTthLmFhKCJMaW5rUmVzaGFwZWQiLHRoaXMuYWRvcm5lZExpbmssdGhpcy5kcyk7fXRoaXMuc3RvcFRvb2woKTt9O2Z1bmN0aW9uIFZnKGEsYixjLGQsZSxmKXtyZXR1cm4gZj9NYXRoLmFicyhiLnktYy55KTxhLnJlc2VnbWVudGluZ0Rpc3RhbmNlJiZNYXRoLmFicyhjLnktZC55KTxhLnJlc2VnbWVudGluZ0Rpc3RhbmNlJiZNYXRoLmFicyhkLnktZS55KTxhLnJlc2VnbWVudGluZ0Rpc3RhbmNlOk1hdGguYWJzKGIueC1jLngpPGEucmVzZWdtZW50aW5nRGlzdGFuY2UmJk1hdGguYWJzKGMueC1kLngpPGEucmVzZWdtZW50aW5nRGlzdGFuY2UmJk1hdGguYWJzKGQueC1lLngpPGEucmVzZWdtZW50aW5nRGlzdGFuY2U7fVBnLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYWRvcm5lZExpbms7Yi5CaCgpO3ZhciBjPXRoaXMuaGFuZGxlLnNlZ21lbnRJbmRleCxkPXRoaXMuZHYodGhpcy5oYW5kbGUpO2lmKGIuaXNPcnRob2dvbmFsKXtpZihjPT09Yi5maXJzdFBpY2tJbmRleCsxKWM9Yi5maXJzdFBpY2tJbmRleCsxLGQ9PT1TZz8oYi5NKGMsYi5pKGMtMSkueCxhLnkpLGIuTShjKzEsYi5pKGMrMikueCxhLnkpKTpkPT09VGcmJihiLk0oYyxhLngsYi5pKGMtMSkueSksYi5NKGMrMSxhLngsYi5pKGMrMikueSkpO2Vsc2UgaWYoYz09PWIubGFzdFBpY2tJbmRleC0xKWM9Yi5sYXN0UGlja0luZGV4LTEsZD09PVNnPyhiLk0oYy0xLGIuaShjLTIpLngsYS55KSxiLk0oYyxiLmkoYysxKS54LGEueSkpOmQ9PT1UZyYmKGIuTShjLTEsYS54LGIuaShjLTIpLnkpLGIuTShjLGEueCxiLmkoYysxKS55KSk7ZWxzZXtkPWM7dmFyIGU9Yi5pKGQpLGY9Yi5pKGQtMSksZz1iLmkoZCsxKTtILncoZi54LGUueCkmJkgudyhlLnksZy55KT8oSC53KGYueCxiLmkoZC0yKS54KSYmIUgudyhmLnksYi5pKGQtMikueSk/KGIubShkLGEueCxmLnkpLGMrKyxkKyspOmIuTShkLTEsYS54LGYueSksSC53KGcueSxiLmkoZCsyKS55KSYmIUgudyhnLngsYi5pKGQrMikueCk/Yi5tKGQrMSxnLngsYS55KTpiLk0oZCsxLGcueCxhLnkpKTpILncoZi55LGUueSkmJkgudyhlLngsZy54KT8oSC53KGYueSxiLmkoZC0yKS55KSYmIUgudyhmLngsYi5pKGQtMikueCk/KGIubShkLGYueCxhLnkpLGMrKyxkKyspOmIuTShkLTEsZi54LGEueSksSC53KGcueCxiLmkoZCsyKS54KSYmIUgudyhnLnksYi5pKGQrMikueSk/Yi5tKGQrMSxhLngsZy55KTpiLk0oZCsxLGEueCxnLnkpKTpILncoZi54LGUueCkmJkgudyhlLngsZy54KT8oSC53KGYueCxiLmkoZC0yKS54KSYmIUgudyhmLnksYi5pKGQtMikueSk/KGIubShkLGEueCxmLnkpLGMrKyxkKyspOmIuTShkLTEsYS54LGYueSksSC53KGcueCxiLmkoZCsyKS54KSYmIUgudyhnLnksYi5pKGQrMikueSk/Yi5tKGQrMSxhLngsZy55KTpiLk0oZCsxLGEueCxnLnkpKTpILncoZi55LGUueSkmJkgudyhlLnksZy55KSYmKEgudyhmLnksYi5pKGQtMikueSkmJiFILncoZi54LGIuaShkLTIpLngpPyhiLm0oZCxmLngsYS55KSxjKyssZCsrKTpiLk0oZC0xLGYueCxhLnkpLEgudyhnLnksYi5pKGQrMikueSkmJiFILncoZy54LGIuaShkKzIpLngpP2IubShkKzEsZy54LGEueSk6Yi5NKGQrMSxnLngsYS55KSk7Yi5NKGMsYS54LGEueSk7fX1lbHNlIGIuTShjLGEueCxhLnkpLGQ9Yi5mcm9tTm9kZSxlPWIuZnJvbVBvcnQsbnVsbCE9PWQmJihmPWQuZmluZFZpc2libGVOb2RlKCksbnVsbCE9PWYmJmYhPT1kJiYoZD1mLGU9ZC5wb3J0KSksMT09PWMmJmIuY29tcHV0ZVNwb3QoITAsZSkuamMoKSYmKGY9ZS5tYShkZCxHLmFsbG9jKCkpLGQ9Yi5nZXRMaW5rUG9pbnRGcm9tUG9pbnQoZCxlLGYsYSwhMCxHLmFsbG9jKCkpLGIuTSgwLGQueCxkLnkpLEcuZnJlZShmKSxHLmZyZWUoZCkpLGQ9Yi50b05vZGUsZT1iLnRvUG9ydCxudWxsIT09ZCYmKGY9ZC5maW5kVmlzaWJsZU5vZGUoKSxudWxsIT09ZiYmZiE9PWQmJihkPWYsZT1kLnBvcnQpKSxjPT09Yi5wb2ludHNDb3VudC0yJiZiLmNvbXB1dGVTcG90KCExLGUpLmpjKCkmJihjPWUubWEoZGQsRy5hbGxvYygpKSxhPWIuZ2V0TGlua1BvaW50RnJvbVBvaW50KGQsZSxjLGEsITEsRy5hbGxvYygpKSxiLk0oYi5wb2ludHNDb3VudC0xLGEueCxhLnkpLEcuZnJlZShjKSxHLmZyZWUoYSkpO2Iua2YoKTt9O1BnLnByb3RvdHlwZS5jb21wdXRlUmVzaGFwZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmFkb3JuZWRMaW5rLGM9dGhpcy5oYW5kbGUuc2VnbWVudEluZGV4O3N3aXRjaCh0aGlzLmR2KHRoaXMuaGFuZGxlKSl7Y2FzZSBVZzpyZXR1cm4gYTtjYXNlIFNnOnJldHVybiBuZXcgRyhiLmkoYykueCxhLnkpO2Nhc2UgVGc6cmV0dXJuIG5ldyBHKGEueCxiLmkoYykueSk7ZGVmYXVsdDpjYXNlIFFnOnJldHVybiBiLmkoYyk7fX07cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUGcucHJvdG90eXBlLHtoYW5kbGVBcmNoZXR5cGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy51O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnU9YTt9fSxtaWRIYW5kbGVBcmNoZXR5cGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5LO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLks9YTt9fSxoYW5kbGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO30sc2V0OmZ1bmN0aW9uIHNldChhKXtpZihudWxsIT09YSYmIShhLnBhcnQgaW5zdGFuY2VvZiBwZikpdGhyb3cgRXJyb3IoIm5ldyBoYW5kbGUgaXMgbm90IGluIGFuIEFkb3JubWVudDogIithKTt0aGlzLmw9YTt9fSxhZG9ybmVkTGluazp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkh0O319LHJlc2VnbWVudGluZ0Rpc3RhbmNlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYmE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuYmE9YTt9fSxvcmlnaW5hbFBvaW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudWw7fX0sb3JpZ2luYWxQb2ludHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5kczt9fX0pO1BnLnByb3RvdHlwZS5zZXRSZXNoYXBpbmdCZWhhdmlvcj1QZy5wcm90b3R5cGUud207UGcucHJvdG90eXBlLmdldFJlc2hhcGluZ0JlaGF2aW9yPVBnLnByb3RvdHlwZS5kdjt2YXIgUWc9bmV3IEQoUGcsIk5vbmUiLDApLFRnPW5ldyBEKFBnLCJIb3Jpem9udGFsIiwxKSxTZz1uZXcgRChQZywiVmVydGljYWwiLDIpLFVnPW5ldyBEKFBnLCJBbGwiLDMpO1BnLmNsYXNzTmFtZT0iTGlua1Jlc2hhcGluZ1Rvb2wiO1BnLk5vbmU9UWc7UGcuSG9yaXpvbnRhbD1UZztQZy5WZXJ0aWNhbD1TZztQZy5BbGw9VWc7VGEoImxpbmtSZXNoYXBpbmdUb29sIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbmRUb29sKCJMaW5rUmVzaGFwaW5nIik7fSxmdW5jdGlvbihhKXt2Zih0aGlzLCJMaW5rUmVzaGFwaW5nIixhLHRoaXMubW91c2VEb3duVG9vbHMpO30pO2Z1bmN0aW9uIFdnKCl7a2YuY2FsbCh0aGlzKTt0aGlzLm5hbWU9IlJlc2l6aW5nIjt0aGlzLlFmPW5ldyBLKDEsMSkuZnJlZXplKCk7dGhpcy5QZj1uZXcgSyg5OTk5LDk5OTkpLmZyZWV6ZSgpO3RoaXMuQmc9bmV3IEsoTmFOLE5hTikuZnJlZXplKCk7dGhpcy5LPSExO3RoaXMuJGQ9bnVsbDt2YXIgYT1uZXcgVygpO2EuYWxpZ25tZW50Rm9jdXM9ZGQ7YS5maWd1cmU9IlJlY3RhbmdsZSI7YS5kZXNpcmVkU2l6ZT1oYzthLmZpbGw9ImxpZ2h0Ymx1ZSI7YS5zdHJva2U9ImRvZGdlcmJsdWUiO2Euc3Ryb2tlV2lkdGg9MTthLmN1cnNvcj0icG9pbnRlciI7dGhpcy51PWE7dGhpcy5sPW51bGw7dGhpcy51bD1uZXcgRygpO3RoaXMuR3c9bmV3IEsoKTt0aGlzLklvPW5ldyBHKCk7dGhpcy5ZdD1uZXcgSygwLDApO3RoaXMuWHQ9bmV3IEsoSW5maW5pdHksSW5maW5pdHkpO3RoaXMuV3Q9bmV3IEsoMSwxKTt0aGlzLkR3PSEwO31vYShXZyxrZik7V2cucHJvdG90eXBlLnVwZGF0ZUFkb3JubWVudHM9ZnVuY3Rpb24oYSl7aWYoIShudWxsPT09YXx8YSBpbnN0YW5jZW9mIFMpKXtpZihhLmlzU2VsZWN0ZWQmJiF0aGlzLmRpYWdyYW0uaXNSZWFkT25seSl7dmFyIGI9YS5yZXNpemVPYmplY3QsYz1hLiRqKHRoaXMubmFtZSk7aWYobnVsbCE9PWImJmEuY2FuUmVzaXplKCkmJmEuYWN0dWFsQm91bmRzLm8oKSYmYS5pc1Zpc2libGUoKSYmYi5hY3R1YWxCb3VuZHMubygpJiZiLnJmKCkpe2lmKG51bGw9PT1jfHxjLmFkb3JuZWRPYmplY3QhPT1iKWM9dGhpcy5tYWtlQWRvcm5tZW50KGIpO2lmKG51bGwhPT1jKXtiPWIuSmkoKTtvZyhhKSYmdGhpcy51cGRhdGVSZXNpemVIYW5kbGVzKGMsYik7YS5xaCh0aGlzLm5hbWUsYyk7cmV0dXJuO319fWEudGYodGhpcy5uYW1lKTt9fTtXZy5wcm90b3R5cGUubWFrZUFkb3JubWVudD1mdW5jdGlvbihhKXt2YXIgYj1hLnBhcnQucmVzaXplQWRvcm5tZW50VGVtcGxhdGU7aWYobnVsbD09PWIpe2I9bmV3IHBmKCk7Yi50eXBlPVguU3BvdDtiLmxvY2F0aW9uU3BvdD1kZDt2YXIgYz1uZXcgWGcoKTtjLmlzUGFuZWxNYWluPSEwO2IuYWRkKGMpO2IuYWRkKHRoaXMubWFrZUhhbmRsZShhLFRjKSk7Yi5hZGQodGhpcy5tYWtlSGFuZGxlKGEsVmMpKTtiLmFkZCh0aGlzLm1ha2VIYW5kbGUoYSxoZCkpO2IuYWRkKHRoaXMubWFrZUhhbmRsZShhLGZkKSk7Yi5hZGQodGhpcy5tYWtlSGFuZGxlKGEsSmQpKTtiLmFkZCh0aGlzLm1ha2VIYW5kbGUoYSxTZCkpO2IuYWRkKHRoaXMubWFrZUhhbmRsZShhLFRkKSk7Yi5hZGQodGhpcy5tYWtlSGFuZGxlKGEsS2QpKTt9ZWxzZSBpZihZZyhiKSxiPWIuY29weSgpLG51bGw9PT1iKXJldHVybiBudWxsO2IuYWRvcm5lZE9iamVjdD1hO3JldHVybiBiO307V2cucHJvdG90eXBlLm1ha2VIYW5kbGU9ZnVuY3Rpb24oYSxiKXthPXRoaXMuaGFuZGxlQXJjaGV0eXBlO2lmKG51bGw9PT1hKXJldHVybiBudWxsO2E9YS5jb3B5KCk7YS5hbGlnbm1lbnQ9YjtyZXR1cm4gYTt9O1dnLnByb3RvdHlwZS51cGRhdGVSZXNpemVIYW5kbGVzPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9PWEpaWYoIWEuYWxpZ25tZW50LktiKCkmJigicG9pbnRlciI9PT1hLmN1cnNvcnx8MDxhLmN1cnNvci5pbmRleE9mKCJyZXNpemUiKSkpYTp7dmFyIGM9YS5hbGlnbm1lbnQ7Yy5qYygpJiYoYz1kZCk7aWYoMD49Yy54KWI9MD49Yy55P2IrMjI1OjE8PWMueT9iKzEzNTpiKzE4MDtlbHNlIGlmKDE8PWMueCkwPj1jLnk/Yis9MzE1OjE8PWMueSYmKGIrPTQ1KTtlbHNlIGlmKDA+PWMueSliKz0yNzA7ZWxzZSBpZigxPD1jLnkpYis9OTA7ZWxzZSBicmVhayBhOzA+Yj9iKz0zNjA6MzYwPD1iJiYoYi09MzYwKTthLmN1cnNvcj0yMi41PmI/ImUtcmVzaXplIjo2Ny41PmI/InNlLXJlc2l6ZSI6MTEyLjU+Yj8icy1yZXNpemUiOjE1Ny41PmI/InN3LXJlc2l6ZSI6MjAyLjU+Yj8idy1yZXNpemUiOjI0Ny41PmI/Im53LXJlc2l6ZSI6MjkyLjU+Yj8ibi1yZXNpemUiOjMzNy41PmI/Im5lLXJlc2l6ZSI6ImUtcmVzaXplIjt9ZWxzZSBpZihhIGluc3RhbmNlb2YgWClmb3IoYT1hLmVsZW1lbnRzO2EubmV4dCgpOyl7dGhpcy51cGRhdGVSZXNpemVIYW5kbGVzKGEudmFsdWUsYik7fX07V2cucHJvdG90eXBlLmNhblN0YXJ0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbmFibGVkKXJldHVybiExO3ZhciBhPXRoaXMuZGlhZ3JhbTtyZXR1cm4hYS5pc1JlYWRPbmx5JiZhLmFsbG93UmVzaXplJiZhLmxhc3RJbnB1dC5sZWZ0P251bGwhPT10aGlzLmZpbmRUb29sSGFuZGxlQXQoYS5maXJzdElucHV0LmRvY3VtZW50UG9pbnQsdGhpcy5uYW1lKTohMTt9O1dnLnByb3RvdHlwZS5kb0FjdGl2YXRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO251bGw9PT10aGlzLmhhbmRsZSYmKHRoaXMuaGFuZGxlPXRoaXMuZmluZFRvb2xIYW5kbGVBdChhLmZpcnN0SW5wdXQuZG9jdW1lbnRQb2ludCx0aGlzLm5hbWUpKTtudWxsIT09dGhpcy5oYW5kbGUmJih0aGlzLmFkb3JuZWRPYmplY3Q9dGhpcy5oYW5kbGUucGFydC5hZG9ybmVkT2JqZWN0LG51bGwhPT10aGlzLmFkb3JuZWRPYmplY3QmJih0aGlzLnVsLnNldCh0aGlzLmFkb3JuZWRPYmplY3QubWEodGhpcy5oYW5kbGUuYWxpZ25tZW50LnJ2KCkpKSx0aGlzLklvLnNldCh0aGlzLmFkb3JuZWRPYmplY3QucGFydC5sb2NhdGlvbiksdGhpcy5Hdy5zZXQodGhpcy5hZG9ybmVkT2JqZWN0LmRlc2lyZWRTaXplKSx0aGlzLld0PXRoaXMuY29tcHV0ZUNlbGxTaXplKCksdGhpcy5ZdD10aGlzLmNvbXB1dGVNaW5TaXplKCksdGhpcy5YdD10aGlzLmNvbXB1dGVNYXhTaXplKCksYS5pc01vdXNlQ2FwdHVyZWQ9ITAsdGhpcy5Edz1hLmFuaW1hdGlvbk1hbmFnZXIuaXNFbmFibGVkLGEuYW5pbWF0aW9uTWFuYWdlci5pc0VuYWJsZWQ9ITEsdGhpcy5BYSh0aGlzLm5hbWUpLHRoaXMuaXNBY3RpdmU9ITApKTt9O1dnLnByb3RvdHlwZS5kb0RlYWN0aXZhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07dGhpcy52ZygpO3RoaXMuJGQ9dGhpcy5oYW5kbGU9bnVsbDt0aGlzLmlzQWN0aXZlPWEuaXNNb3VzZUNhcHR1cmVkPSExO2EuYW5pbWF0aW9uTWFuYWdlci5pc0VuYWJsZWQ9dGhpcy5Edzt9O1dnLnByb3RvdHlwZS5kb0NhbmNlbD1mdW5jdGlvbigpe251bGwhPT10aGlzLmFkb3JuZWRPYmplY3QmJih0aGlzLmFkb3JuZWRPYmplY3QuZGVzaXJlZFNpemU9dGhpcy5vcmlnaW5hbERlc2lyZWRTaXplLHRoaXMuYWRvcm5lZE9iamVjdC5wYXJ0LmxvY2F0aW9uPXRoaXMub3JpZ2luYWxMb2NhdGlvbik7dGhpcy5zdG9wVG9vbCgpO307V2cucHJvdG90eXBlLmRvTW91c2VNb3ZlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKHRoaXMuaXNBY3RpdmUpe3ZhciBiPXRoaXMuWXQsYz10aGlzLlh0LGQ9dGhpcy5XdCxlPXRoaXMuYWRvcm5lZE9iamVjdC5XcyhhLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50LEcuYWxsb2MoKSksZj10aGlzLmNvbXB1dGVSZXNoYXBlKCk7Yj10aGlzLmNvbXB1dGVSZXNpemUoZSx0aGlzLmhhbmRsZS5hbGlnbm1lbnQsYixjLGQsZik7dGhpcy5yZXNpemUoYik7YS5mZCgpO0cuZnJlZShlKTt9fTtXZy5wcm90b3R5cGUuZG9Nb3VzZVVwPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKHRoaXMuaXNBY3RpdmUpe3ZhciBiPXRoaXMuWXQsYz10aGlzLlh0LGQ9dGhpcy5XdCxlPXRoaXMuYWRvcm5lZE9iamVjdC5XcyhhLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50LEcuYWxsb2MoKSksZj10aGlzLmNvbXB1dGVSZXNoYXBlKCk7Yj10aGlzLmNvbXB1dGVSZXNpemUoZSx0aGlzLmhhbmRsZS5hbGlnbm1lbnQsYixjLGQsZik7dGhpcy5yZXNpemUoYik7Ry5mcmVlKGUpO2EuWGEoKTt0aGlzLnRyYW5zYWN0aW9uUmVzdWx0PXRoaXMubmFtZTthLmFhKCJQYXJ0UmVzaXplZCIsdGhpcy5hZG9ybmVkT2JqZWN0LHRoaXMub3JpZ2luYWxEZXNpcmVkU2l6ZSk7fXRoaXMuc3RvcFRvb2woKTt9O1dnLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kaWFncmFtLGM9dGhpcy5hZG9ybmVkT2JqZWN0LGQ9Yy5wYXJ0O2MuZGVzaXJlZFNpemU9YS5zaXplO2QuYWMoKTthPXRoaXMuYWRvcm5lZE9iamVjdC5tYSh0aGlzLmhhbmRsZS5hbGlnbm1lbnQucnYoKSk7ZCBpbnN0YW5jZW9mIGlnPyhjPW5ldyBFKCksYy5hZGQoZCksYi5tb3ZlUGFydHMoYyx0aGlzLnVsLmNvcHkoKS5YZChhKSwhMCkpOmQubG9jYXRpb249ZC5sb2NhdGlvbi5jb3B5KCkuWGQoYSkuYWRkKHRoaXMudWwpO307V2cucHJvdG90eXBlLmNvbXB1dGVSZXNpemU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2IuamMoKSYmKGI9ZGQpO3ZhciBnPXRoaXMuYWRvcm5lZE9iamVjdC5uYXR1cmFsQm91bmRzLGg9Zy54LGs9Zy55LGw9Zy54K2cud2lkdGgsbT1nLnkrZy5oZWlnaHQsbj0xO2lmKCFmKXtuPWcud2lkdGg7dmFyIHA9Zy5oZWlnaHQ7MD49biYmKG49MSk7MD49cCYmKHA9MSk7bj1wL247fXA9Ry5hbGxvYygpO0guVHAoYS54LGEueSxoLGssZS53aWR0aCxlLmhlaWdodCxwKTthPWcuY29weSgpOzA+PWIueD8wPj1iLnk/KGEueD1NYXRoLm1heChwLngsbC1kLndpZHRoKSxhLng9TWF0aC5taW4oYS54LGwtYy53aWR0aCksYS53aWR0aD1NYXRoLm1heChsLWEueCxjLndpZHRoKSxhLnk9TWF0aC5tYXgocC55LG0tZC5oZWlnaHQpLGEueT1NYXRoLm1pbihhLnksbS1jLmhlaWdodCksYS5oZWlnaHQ9TWF0aC5tYXgobS1hLnksYy5oZWlnaHQpLGZ8fCgxPD1hLmhlaWdodC9hLndpZHRoPyhhLmhlaWdodD1NYXRoLm1heChNYXRoLm1pbihuKmEud2lkdGgsZC5oZWlnaHQpLGMuaGVpZ2h0KSxhLndpZHRoPWEuaGVpZ2h0L24pOihhLndpZHRoPU1hdGgubWF4KE1hdGgubWluKGEuaGVpZ2h0L24sZC53aWR0aCksYy53aWR0aCksYS5oZWlnaHQ9biphLndpZHRoKSxhLng9bC1hLndpZHRoLGEueT1tLWEuaGVpZ2h0KSk6MTw9Yi55PyhhLng9TWF0aC5tYXgocC54LGwtZC53aWR0aCksYS54PU1hdGgubWluKGEueCxsLWMud2lkdGgpLGEud2lkdGg9TWF0aC5tYXgobC1hLngsYy53aWR0aCksYS5oZWlnaHQ9TWF0aC5tYXgoTWF0aC5taW4ocC55LWssZC5oZWlnaHQpLGMuaGVpZ2h0KSxmfHwoMTw9YS5oZWlnaHQvYS53aWR0aD8oYS5oZWlnaHQ9TWF0aC5tYXgoTWF0aC5taW4obiphLndpZHRoLGQuaGVpZ2h0KSxjLmhlaWdodCksYS53aWR0aD1hLmhlaWdodC9uKTooYS53aWR0aD1NYXRoLm1heChNYXRoLm1pbihhLmhlaWdodC9uLGQud2lkdGgpLGMud2lkdGgpLGEuaGVpZ2h0PW4qYS53aWR0aCksYS54PWwtYS53aWR0aCkpOihhLng9TWF0aC5tYXgocC54LGwtZC53aWR0aCksYS54PU1hdGgubWluKGEueCxsLWMud2lkdGgpLGEud2lkdGg9bC1hLngsZnx8KGEuaGVpZ2h0PU1hdGgubWF4KE1hdGgubWluKG4qYS53aWR0aCxkLmhlaWdodCksYy5oZWlnaHQpLGEud2lkdGg9YS5oZWlnaHQvbixhLnk9aysuNSoobS1rLWEuaGVpZ2h0KSkpOjE8PWIueD8wPj1iLnk/KGEud2lkdGg9TWF0aC5tYXgoTWF0aC5taW4ocC54LWgsZC53aWR0aCksYy53aWR0aCksYS55PU1hdGgubWF4KHAueSxtLWQuaGVpZ2h0KSxhLnk9TWF0aC5taW4oYS55LG0tYy5oZWlnaHQpLGEuaGVpZ2h0PU1hdGgubWF4KG0tYS55LGMuaGVpZ2h0KSxmfHwoMTw9YS5oZWlnaHQvYS53aWR0aD8oYS5oZWlnaHQ9TWF0aC5tYXgoTWF0aC5taW4obiphLndpZHRoLGQuaGVpZ2h0KSxjLmhlaWdodCksYS53aWR0aD1hLmhlaWdodC9uKTooYS53aWR0aD1NYXRoLm1heChNYXRoLm1pbihhLmhlaWdodC9uLGQud2lkdGgpLGMud2lkdGgpLGEuaGVpZ2h0PW4qYS53aWR0aCksYS55PW0tYS5oZWlnaHQpKToxPD1iLnk/KGEud2lkdGg9TWF0aC5tYXgoTWF0aC5taW4ocC54LWgsZC53aWR0aCksYy53aWR0aCksYS5oZWlnaHQ9TWF0aC5tYXgoTWF0aC5taW4ocC55LWssZC5oZWlnaHQpLGMuaGVpZ2h0KSxmfHwoMTw9YS5oZWlnaHQvYS53aWR0aD8oYS5oZWlnaHQ9TWF0aC5tYXgoTWF0aC5taW4obiphLndpZHRoLGQuaGVpZ2h0KSxjLmhlaWdodCksYS53aWR0aD1hLmhlaWdodC9uKTooYS53aWR0aD1NYXRoLm1heChNYXRoLm1pbihhLmhlaWdodC9uLGQud2lkdGgpLGMud2lkdGgpLGEuaGVpZ2h0PW4qYS53aWR0aCkpKTooYS53aWR0aD1NYXRoLm1heChNYXRoLm1pbihwLngtaCxkLndpZHRoKSxjLndpZHRoKSxmfHwoYS5oZWlnaHQ9TWF0aC5tYXgoTWF0aC5taW4obiphLndpZHRoLGQuaGVpZ2h0KSxjLmhlaWdodCksYS53aWR0aD1hLmhlaWdodC9uLGEueT1rKy41KihtLWstYS5oZWlnaHQpKSk6MD49Yi55PyhhLnk9TWF0aC5tYXgocC55LG0tZC5oZWlnaHQpLGEueT1NYXRoLm1pbihhLnksbS1jLmhlaWdodCksYS5oZWlnaHQ9bS1hLnksZnx8KGEud2lkdGg9TWF0aC5tYXgoTWF0aC5taW4oYS5oZWlnaHQvbixkLndpZHRoKSxjLndpZHRoKSxhLmhlaWdodD1uKmEud2lkdGgsYS54PWgrLjUqKGwtaC1hLndpZHRoKSkpOjE8PWIueSYmKGEuaGVpZ2h0PU1hdGgubWF4KE1hdGgubWluKHAueS1rLGQuaGVpZ2h0KSxjLmhlaWdodCksZnx8KGEud2lkdGg9TWF0aC5tYXgoTWF0aC5taW4oYS5oZWlnaHQvbixkLndpZHRoKSxjLndpZHRoKSxhLmhlaWdodD1uKmEud2lkdGgsYS54PWgrLjUqKGwtaC1hLndpZHRoKSkpO0cuZnJlZShwKTtyZXR1cm4gYTt9O1dnLnByb3RvdHlwZS5jb21wdXRlUmVzaGFwZT1mdW5jdGlvbigpe3ZhciBhPVpnO3RoaXMuYWRvcm5lZE9iamVjdCBpbnN0YW5jZW9mIFcmJihhPSRnKHRoaXMuYWRvcm5lZE9iamVjdCkpO3JldHVybiEoYT09PWFofHx0aGlzLmRpYWdyYW0ubGFzdElucHV0LnNoaWZ0KTt9O1dnLnByb3RvdHlwZS5jb21wdXRlTWluU2l6ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYWRvcm5lZE9iamVjdC5taW5TaXplLmNvcHkoKSxiPXRoaXMubWluU2l6ZTshaXNOYU4oYi53aWR0aCkmJmIud2lkdGg+YS53aWR0aCYmKGEud2lkdGg9Yi53aWR0aCk7IWlzTmFOKGIuaGVpZ2h0KSYmYi5oZWlnaHQ+YS5oZWlnaHQmJihhLmhlaWdodD1iLmhlaWdodCk7cmV0dXJuIGE7fTtXZy5wcm90b3R5cGUuY29tcHV0ZU1heFNpemU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmFkb3JuZWRPYmplY3QubWF4U2l6ZS5jb3B5KCksYj10aGlzLm1heFNpemU7IWlzTmFOKGIud2lkdGgpJiZiLndpZHRoPGEud2lkdGgmJihhLndpZHRoPWIud2lkdGgpOyFpc05hTihiLmhlaWdodCkmJmIuaGVpZ2h0PGEuaGVpZ2h0JiYoYS5oZWlnaHQ9Yi5oZWlnaHQpO3JldHVybiBhO307V2cucHJvdG90eXBlLmNvbXB1dGVDZWxsU2l6ZT1mdW5jdGlvbigpe3ZhciBhPW5ldyBLKE5hTixOYU4pLGI9dGhpcy5hZG9ybmVkT2JqZWN0LnBhcnQ7bnVsbCE9PWImJihiPWIucmVzaXplQ2VsbFNpemUsIWlzTmFOKGIud2lkdGgpJiYwPGIud2lkdGgmJihhLndpZHRoPWIud2lkdGgpLCFpc05hTihiLmhlaWdodCkmJjA8Yi5oZWlnaHQmJihhLmhlaWdodD1iLmhlaWdodCkpO2I9dGhpcy5jZWxsU2l6ZTtpc05hTihhLndpZHRoKSYmIWlzTmFOKGIud2lkdGgpJiYwPGIud2lkdGgmJihhLndpZHRoPWIud2lkdGgpO2lzTmFOKGEuaGVpZ2h0KSYmIWlzTmFOKGIuaGVpZ2h0KSYmMDxiLmhlaWdodCYmKGEuaGVpZ2h0PWIuaGVpZ2h0KTtiPXRoaXMuZGlhZ3JhbTsoaXNOYU4oYS53aWR0aCl8fGlzTmFOKGEuaGVpZ2h0KSkmJmImJihiPWIuZ3JpZCxudWxsIT09YiYmYi52aXNpYmxlJiZ0aGlzLmlzR3JpZFNuYXBFbmFibGVkJiYoYj1iLmdyaWRDZWxsU2l6ZSxpc05hTihhLndpZHRoKSYmIWlzTmFOKGIud2lkdGgpJiYwPGIud2lkdGgmJihhLndpZHRoPWIud2lkdGgpLGlzTmFOKGEuaGVpZ2h0KSYmIWlzTmFOKGIuaGVpZ2h0KSYmMDxiLmhlaWdodCYmKGEuaGVpZ2h0PWIuaGVpZ2h0KSkpO2lmKGlzTmFOKGEud2lkdGgpfHwwPT09YS53aWR0aHx8SW5maW5pdHk9PT1hLndpZHRoKWEud2lkdGg9MTtpZihpc05hTihhLmhlaWdodCl8fDA9PT1hLmhlaWdodHx8SW5maW5pdHk9PT1hLmhlaWdodClhLmhlaWdodD0xO3JldHVybiBhO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV2cucHJvdG90eXBlLHtoYW5kbGVBcmNoZXR5cGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy51O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnU9YTt9fSxoYW5kbGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO30sc2V0OmZ1bmN0aW9uIHNldChhKXtpZihudWxsIT09YSYmIShhLnBhcnQgaW5zdGFuY2VvZiBwZikpdGhyb3cgRXJyb3IoIm5ldyBoYW5kbGUgaXMgbm90IGluIGFuIEFkb3JubWVudDogIithKTt0aGlzLmw9YTt9fSxhZG9ybmVkT2JqZWN0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuJGQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe2lmKG51bGwhPT1hJiZhLnBhcnQgaW5zdGFuY2VvZiBwZil0aHJvdyBFcnJvcigibmV3IGhhbmRsZSBtdXN0IG5vdCBiZSBpbiBhbiBBZG9ybm1lbnQ6ICIrYSk7dGhpcy4kZD1hO319LG1pblNpemU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5RZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYoIXRoaXMuUWYuQShhKSl7dmFyIGI9YS53aWR0aDtpc05hTihiKSYmKGI9MCk7YT1hLmhlaWdodDtpc05hTihhKSYmKGE9MCk7dGhpcy5RZi5oKGIsYSk7fX19LG1heFNpemU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYoIXRoaXMuUGYuQShhKSl7dmFyIGI9YS53aWR0aDtpc05hTihiKSYmKGI9SW5maW5pdHkpO2E9YS5oZWlnaHQ7aXNOYU4oYSkmJihhPUluZmluaXR5KTt0aGlzLlBmLmgoYixhKTt9fX0sY2VsbFNpemU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5CZzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5CZy5BKGEpfHx0aGlzLkJnLmFzc2lnbihhKTt9fSxpc0dyaWRTbmFwRW5hYmxlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLks7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSz1hO319LG9yaWdpbmFsRGVzaXJlZFNpemU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Hdzt9fSxvcmlnaW5hbExvY2F0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSW87fX19KTtXZy5jbGFzc05hbWU9IlJlc2l6aW5nVG9vbCI7VGEoInJlc2l6aW5nVG9vbCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kVG9vbCgiUmVzaXppbmciKTt9LGZ1bmN0aW9uKGEpe3ZmKHRoaXMsIlJlc2l6aW5nIixhLHRoaXMubW91c2VEb3duVG9vbHMpO30pO2Z1bmN0aW9uIGJoKCl7a2YuY2FsbCh0aGlzKTt0aGlzLm5hbWU9IlJvdGF0aW5nIjt0aGlzLk1hPTQ1O3RoaXMuTGE9Mjt0aGlzLklvPW5ldyBHKCk7dGhpcy4kZD1udWxsO3ZhciBhPW5ldyBXKCk7YS5maWd1cmU9IkVsbGlwc2UiO2EuZGVzaXJlZFNpemU9aWM7YS5maWxsPSJsaWdodGJsdWUiO2Euc3Ryb2tlPSJkb2RnZXJibHVlIjthLnN0cm9rZVdpZHRoPTE7YS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudT1hO3RoaXMubD1udWxsO3RoaXMuRnc9MDt0aGlzLnF1PW5ldyBHKE5hTixOYU4pO3RoaXMuSz0wO3RoaXMuYmE9NTA7fW9hKGJoLGtmKTtiaC5wcm90b3R5cGUudXBkYXRlQWRvcm5tZW50cz1mdW5jdGlvbihhKXtpZihudWxsIT09YSl7aWYoYS56aCgpKXt2YXIgYj1hLnJvdGF0ZU9iamVjdDtpZihiPT09YXx8Yj09PWEucGF0aHx8Yi5pc1BhbmVsTWFpbilyZXR1cm47fWlmKGEuaXNTZWxlY3RlZCYmIXRoaXMuZGlhZ3JhbS5pc1JlYWRPbmx5JiYoYj1hLnJvdGF0ZU9iamVjdCxudWxsIT09YiYmYS5jYW5Sb3RhdGUoKSYmYS5hY3R1YWxCb3VuZHMubygpJiZhLmlzVmlzaWJsZSgpJiZiLmFjdHVhbEJvdW5kcy5vKCkmJmIucmYoKSkpe3ZhciBjPWEuJGoodGhpcy5uYW1lKTtpZihudWxsPT09Y3x8Yy5hZG9ybmVkT2JqZWN0IT09YiljPXRoaXMubWFrZUFkb3JubWVudChiKTtpZihudWxsIT09Yyl7Yy5hbmdsZT1iLkppKCk7bnVsbD09PWMucGxhY2Vob2xkZXImJihjLmxvY2F0aW9uPXRoaXMuY29tcHV0ZUFkb3JubWVudExvY2F0aW9uKGIpKTthLnFoKHRoaXMubmFtZSxjKTtyZXR1cm47fX1hLnRmKHRoaXMubmFtZSk7fX07YmgucHJvdG90eXBlLm1ha2VBZG9ybm1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJ0LnJvdGF0ZUFkb3JubWVudFRlbXBsYXRlO2lmKG51bGw9PT1iKXtiPW5ldyBwZigpO2IudHlwZT1YLlBvc2l0aW9uO2IubG9jYXRpb25TcG90PWRkO3ZhciBjPXRoaXMuaGFuZGxlQXJjaGV0eXBlO251bGwhPT1jJiZiLmFkZChjLmNvcHkoKSk7fWVsc2UgaWYoWWcoYiksYj1iLmNvcHkoKSxudWxsPT09YilyZXR1cm4gbnVsbDtiLmFkb3JuZWRPYmplY3Q9YTtyZXR1cm4gYjt9O2JoLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07cmV0dXJuIWEuaXNSZWFkT25seSYmYS5hbGxvd1JvdGF0ZSYmYS5sYXN0SW5wdXQubGVmdD9udWxsIT09dGhpcy5maW5kVG9vbEhhbmRsZUF0KGEuZmlyc3RJbnB1dC5kb2N1bWVudFBvaW50LHRoaXMubmFtZSk6ITE7fTtiaC5wcm90b3R5cGUuZG9BY3RpdmF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtpZihudWxsPT09dGhpcy5hZG9ybmVkT2JqZWN0KXtudWxsPT09dGhpcy5oYW5kbGUmJih0aGlzLmhhbmRsZT10aGlzLmZpbmRUb29sSGFuZGxlQXQoYS5maXJzdElucHV0LmRvY3VtZW50UG9pbnQsdGhpcy5uYW1lKSk7aWYobnVsbD09PXRoaXMuaGFuZGxlKXJldHVybjt0aGlzLmFkb3JuZWRPYmplY3Q9dGhpcy5oYW5kbGUucGFydC5hZG9ybmVkT2JqZWN0O31udWxsIT09dGhpcy5hZG9ybmVkT2JqZWN0JiYodGhpcy5Gdz10aGlzLmFkb3JuZWRPYmplY3QuYW5nbGUsdGhpcy5xdT10aGlzLmNvbXB1dGVSb3RhdGlvblBvaW50KHRoaXMuYWRvcm5lZE9iamVjdCksdGhpcy5Jbz10aGlzLmFkb3JuZWRPYmplY3QucGFydC5sb2NhdGlvbi5jb3B5KCksYS5pc01vdXNlQ2FwdHVyZWQ9ITAsYS5kZWxheXNMYXlvdXQ9ITAsdGhpcy5BYSh0aGlzLm5hbWUpLHRoaXMuaXNBY3RpdmU9ITApO307YmgucHJvdG90eXBlLmNvbXB1dGVSb3RhdGlvblBvaW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEucGFydCxjPWIubG9jYXRpb25PYmplY3Q7cmV0dXJuIGIucm90YXRpb25TcG90LmdiKCk/YS5tYShiLnJvdGF0aW9uU3BvdCk6YT09PWJ8fGE9PT1jP2MubWEoYi5sb2NhdGlvblNwb3QpOmEubWEoZGQpO307YmgucHJvdG90eXBlLmNvbXB1dGVBZG9ybm1lbnRMb2NhdGlvbj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnJvdGF0aW9uUG9pbnQ7Yi5vKCl8fChiPXRoaXMuY29tcHV0ZVJvdGF0aW9uUG9pbnQoYSkpO2I9YS5XcyhiKTt2YXIgYz10aGlzLmhhbmRsZUFuZ2xlOzA+Yz9jKz0zNjA6MzYwPD1jJiYoYy09MzYwKTtjPU1hdGgucm91bmQoNDUqTWF0aC5yb3VuZChjLzQ1KSk7dmFyIGQ9dGhpcy5oYW5kbGVEaXN0YW5jZTswPT09Yz9iLng9YS5uYXR1cmFsQm91bmRzLndpZHRoK2Q6NDU9PT1jPyhiLng9YS5uYXR1cmFsQm91bmRzLndpZHRoK2QsYi55PWEubmF0dXJhbEJvdW5kcy5oZWlnaHQrZCk6OTA9PT1jP2IueT1hLm5hdHVyYWxCb3VuZHMuaGVpZ2h0K2Q6MTM1PT09Yz8oYi54PS1kLGIueT1hLm5hdHVyYWxCb3VuZHMuaGVpZ2h0K2QpOjE4MD09PWM/Yi54PS1kOjIyNT09PWM/KGIueD0tZCxiLnk9LWQpOjI3MD09PWM/Yi55PS1kOjMxNT09PWMmJihiLng9YS5uYXR1cmFsQm91bmRzLndpZHRoK2QsYi55PS1kKTtyZXR1cm4gYS5tYShiKTt9O2JoLnByb3RvdHlwZS5kb0RlYWN0aXZhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07dGhpcy52ZygpO3RoaXMuJGQ9dGhpcy5oYW5kbGU9bnVsbDt0aGlzLnF1PW5ldyBHKE5hTixOYU4pO3RoaXMuaXNBY3RpdmU9YS5pc01vdXNlQ2FwdHVyZWQ9ITE7fTtiaC5wcm90b3R5cGUuZG9DYW5jZWw9ZnVuY3Rpb24oKXt0aGlzLmRpYWdyYW0uZGVsYXlzTGF5b3V0PSExO3RoaXMucm90YXRlKHRoaXMub3JpZ2luYWxBbmdsZSk7dGhpcy5zdG9wVG9vbCgpO307YmgucHJvdG90eXBlLmRvTW91c2VNb3ZlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO3RoaXMuaXNBY3RpdmUmJihhPXRoaXMuY29tcHV0ZVJvdGF0ZShhLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50KSx0aGlzLnJvdGF0ZShhKSk7fTtiaC5wcm90b3R5cGUuZG9Nb3VzZVVwPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKHRoaXMuaXNBY3RpdmUpe2EuZGVsYXlzTGF5b3V0PSExO3ZhciBiPXRoaXMuY29tcHV0ZVJvdGF0ZShhLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50KTt0aGlzLnJvdGF0ZShiKTthLlhhKCk7dGhpcy50cmFuc2FjdGlvblJlc3VsdD10aGlzLm5hbWU7YS5hYSgiUGFydFJvdGF0ZWQiLHRoaXMuYWRvcm5lZE9iamVjdCx0aGlzLm9yaWdpbmFsQW5nbGUpO310aGlzLnN0b3BUb29sKCk7fTtiaC5wcm90b3R5cGUucm90YXRlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYWRvcm5lZE9iamVjdDtpZihudWxsIT09Yil7Yi5hbmdsZT1hO2I9Yi5wYXJ0O2IuYWMoKTt2YXIgYz1iLmxvY2F0aW9uT2JqZWN0LGQ9Yi5yb3RhdGVPYmplY3Q7aWYoYz09PWR8fGMucWcoZCkpYz10aGlzLklvLmNvcHkoKSxiLmxvY2F0aW9uPWMuWGQodGhpcy5yb3RhdGlvblBvaW50KS5yb3RhdGUoYS10aGlzLm9yaWdpbmFsQW5nbGUpLmFkZCh0aGlzLnJvdGF0aW9uUG9pbnQpO319O2JoLnByb3RvdHlwZS5jb21wdXRlUm90YXRlPWZ1bmN0aW9uKGEpe2E9dGhpcy5yb3RhdGlvblBvaW50LldhKGEpLXRoaXMuaGFuZGxlQW5nbGU7dmFyIGI9dGhpcy5hZG9ybmVkT2JqZWN0LnBhbmVsO251bGwhPT1iJiYoYS09Yi5KaSgpKTszNjA8PWE/YS09MzYwOjA+YSYmKGErPTM2MCk7Yj1NYXRoLm1pbihNYXRoLmFicyh0aGlzLnNuYXBBbmdsZU11bHRpcGxlKSwxODApO3ZhciBjPU1hdGgubWluKE1hdGguYWJzKHRoaXMuc25hcEFuZ2xlRXBzaWxvbiksYi8yKTshdGhpcy5kaWFncmFtLmxhc3RJbnB1dC5zaGlmdCYmMDxiJiYwPGMmJihhJWI8Yz9hPU1hdGguZmxvb3IoYS9iKSpiOmElYj5iLWMmJihhPShNYXRoLmZsb29yKGEvYikrMSkqYikpOzM2MDw9YT9hLT0zNjA6MD5hJiYoYSs9MzYwKTtyZXR1cm4gYTt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJoLnByb3RvdHlwZSx7aGFuZGxlQXJjaGV0eXBlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy51PWE7fX0saGFuZGxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYobnVsbCE9PWEmJiEoYS5wYXJ0IGluc3RhbmNlb2YgcGYpKXRocm93IEVycm9yKCJuZXcgaGFuZGxlIGlzIG5vdCBpbiBhbiBBZG9ybm1lbnQ6ICIrYSk7dGhpcy5sPWE7fX0sYWRvcm5lZE9iamVjdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLiRkO30sc2V0OmZ1bmN0aW9uIHNldChhKXtpZihudWxsIT09YSYmYS5wYXJ0IGluc3RhbmNlb2YgcGYpdGhyb3cgRXJyb3IoIm5ldyBoYW5kbGUgbXVzdCBub3QgYmUgaW4gYW4gQWRvcm5tZW50OiAiK2EpO3RoaXMuJGQ9YTt9fSxzbmFwQW5nbGVNdWx0aXBsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1hO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk1hPWE7fX0sc25hcEFuZ2xlRXBzaWxvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkxhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkxhPWE7fX0sb3JpZ2luYWxBbmdsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkZ3O319LHJvdGF0aW9uUG9pbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5xdTt9fSxoYW5kbGVBbmdsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLks7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSz1hO319LGhhbmRsZURpc3RhbmNlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYmE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuYmE9YTt9fX0pO2JoLmNsYXNzTmFtZT0iUm90YXRpbmdUb29sIjtUYSgicm90YXRpbmdUb29sIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbmRUb29sKCJSb3RhdGluZyIpO30sZnVuY3Rpb24oYSl7dmYodGhpcywiUm90YXRpbmciLGEsdGhpcy5tb3VzZURvd25Ub29scyk7fSk7ZnVuY3Rpb24gY2goKXtrZi5jYWxsKHRoaXMpO3RoaXMubmFtZT0iQ2xpY2tTZWxlY3RpbmciO31vYShjaCxrZik7Y2gucHJvdG90eXBlLmNhblN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNFbmFibGVkfHx0aGlzLmlzQmV5b25kRHJhZ1NpemUoKT8hMTohMDt9O2NoLnByb3RvdHlwZS5kb01vdXNlVXA9ZnVuY3Rpb24oKXt0aGlzLmlzQWN0aXZlJiYodGhpcy5zdGFuZGFyZE1vdXNlU2VsZWN0KCksIXRoaXMuc3RhbmRhcmRNb3VzZUNsaWNrKCkmJnRoaXMuZGlhZ3JhbS5sYXN0SW5wdXQuaXNUb3VjaEV2ZW50JiZ0aGlzLmRpYWdyYW0udG9vbE1hbmFnZXIuZG9Ub29sVGlwKCkpO3RoaXMuc3RvcFRvb2woKTt9O2NoLmNsYXNzTmFtZT0iQ2xpY2tTZWxlY3RpbmdUb29sIjtmdW5jdGlvbiBkaCgpe2tmLmNhbGwodGhpcyk7dGhpcy5uYW1lPSJBY3Rpb24iO3RoaXMudWs9bnVsbDt9b2EoZGgsa2YpO2RoLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW0sYj1hLmxhc3RJbnB1dCxjPWEuU2IoYi5kb2N1bWVudFBvaW50LGZ1bmN0aW9uKGEpe2Zvcig7bnVsbCE9PWEucGFuZWwmJiFhLmlzQWN0aW9uYWJsZTspe2E9YS5wYW5lbDt9cmV0dXJuIGE7fSk7aWYobnVsbCE9PWMpe2lmKCFjLmlzQWN0aW9uYWJsZSlyZXR1cm4hMTt0aGlzLnVrPWM7YS5Kaz1hLlNiKGIuZG9jdW1lbnRQb2ludCxudWxsLG51bGwpO3JldHVybiEwO31yZXR1cm4hMTt9O2RoLnByb3RvdHlwZS5kb01vdXNlRG93bj1mdW5jdGlvbigpe2lmKHRoaXMuaXNBY3RpdmUpe3ZhciBhPXRoaXMuZGlhZ3JhbS5sYXN0SW5wdXQsYj10aGlzLnVrO251bGwhPT1iJiYoYS50YXJnZXRPYmplY3Q9YixudWxsIT09Yi5hY3Rpb25Eb3duJiZiLmFjdGlvbkRvd24oYSxiKSk7fWVsc2UgdGhpcy5jYW5TdGFydCgpJiZ0aGlzLmRvQWN0aXZhdGUoKTt9O2RoLnByb3RvdHlwZS5kb01vdXNlTW92ZT1mdW5jdGlvbigpe2lmKHRoaXMuaXNBY3RpdmUpe3ZhciBhPXRoaXMuZGlhZ3JhbS5sYXN0SW5wdXQsYj10aGlzLnVrO251bGwhPT1iJiYoYS50YXJnZXRPYmplY3Q9YixudWxsIT09Yi5hY3Rpb25Nb3ZlJiZiLmFjdGlvbk1vdmUoYSxiKSk7fX07ZGgucHJvdG90eXBlLmRvTW91c2VVcD1mdW5jdGlvbigpe2lmKHRoaXMuaXNBY3RpdmUpe3ZhciBhPXRoaXMuZGlhZ3JhbS5sYXN0SW5wdXQsYj10aGlzLnVrO2lmKG51bGw9PT1iKXJldHVybjthLnRhcmdldE9iamVjdD1iO251bGwhPT1iLmFjdGlvblVwJiZiLmFjdGlvblVwKGEsYik7dGhpcy5zdGFuZGFyZE1vdXNlQ2xpY2soZnVuY3Rpb24oYSl7Zm9yKDtudWxsIT09YS5wYW5lbCYmKCFhLmlzQWN0aW9uYWJsZXx8YSE9PWIpOyl7YT1hLnBhbmVsO31yZXR1cm4gYTt9LGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yjt9KTt9dGhpcy5zdG9wVG9vbCgpO307ZGgucHJvdG90eXBlLmRvQ2FuY2VsPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLmxhc3RJbnB1dCxiPXRoaXMudWs7bnVsbCE9PWImJihhLnRhcmdldE9iamVjdD1iLG51bGwhPT1iLmFjdGlvbkNhbmNlbCYmYi5hY3Rpb25DYW5jZWwoYSxiKSx0aGlzLnN0b3BUb29sKCkpO307ZGgucHJvdG90eXBlLmRvU3RvcD1mdW5jdGlvbigpe3RoaXMudWs9bnVsbDt9O2RoLmNsYXNzTmFtZT0iQWN0aW9uVG9vbCI7ZnVuY3Rpb24gZWgoKXtrZi5jYWxsKHRoaXMpO3RoaXMubmFtZT0iQ2xpY2tDcmVhdGluZyI7dGhpcy4kaT1udWxsO3RoaXMudT0hMDt0aGlzLmw9ITE7dGhpcy54dz1uZXcgRygwLDApO31vYShlaCxrZik7ZWgucHJvdG90eXBlLmNhblN0YXJ0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbmFibGVkfHxudWxsPT09dGhpcy5hcmNoZXR5cGVOb2RlRGF0YSlyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07aWYoYS5pc1JlYWRPbmx5fHxhLmlzTW9kZWxSZWFkT25seXx8IWEuYWxsb3dJbnNlcnR8fCFhLmxhc3RJbnB1dC5sZWZ0fHx0aGlzLmlzQmV5b25kRHJhZ1NpemUoKSlyZXR1cm4hMTtpZih0aGlzLmlzRG91YmxlQ2xpY2spe2lmKDE9PT1hLmxhc3RJbnB1dC5jbGlja0NvdW50JiYodGhpcy54dz1hLmxhc3RJbnB1dC52aWV3UG9pbnQuY29weSgpKSwyIT09YS5sYXN0SW5wdXQuY2xpY2tDb3VudHx8dGhpcy5pc0JleW9uZERyYWdTaXplKHRoaXMueHcpKXJldHVybiExO31lbHNlIGlmKDEhPT1hLmxhc3RJbnB1dC5jbGlja0NvdW50KXJldHVybiExO3JldHVybiBhLmN1cnJlbnRUb29sIT09dGhpcyYmbnVsbCE9PWEuJGwoYS5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludCwhMCk/ITE6ITA7fTtlaC5wcm90b3R5cGUuZG9Nb3VzZVVwPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO3RoaXMuaXNBY3RpdmUmJnRoaXMuaW5zZXJ0UGFydChhLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50KTt0aGlzLnN0b3BUb29sKCk7fTtlaC5wcm90b3R5cGUuaW5zZXJ0UGFydD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmRpYWdyYW0sYz10aGlzLmFyY2hldHlwZU5vZGVEYXRhO2lmKG51bGw9PT1jKXJldHVybiBudWxsO3RoaXMuQWEodGhpcy5uYW1lKTt2YXIgZD1udWxsO2MgaW5zdGFuY2VvZiBUP2MuTGIoKSYmKFlnKGMpLGQ9Yy5jb3B5KCksbnVsbCE9PWQmJmIuYWRkKGQpKTpudWxsIT09YyYmKGM9Yi5tb2RlbC5jb3B5Tm9kZURhdGEoYyksQ2EoYykmJihiLm1vZGVsLmhmKGMpLGQ9Yi52YyhjKSkpO251bGwhPT1kJiYoYz1HLmFsbG9jQXQoYS54LGEueSksdGhpcy5pc0dyaWRTbmFwRW5hYmxlZCYmZmgodGhpcy5kaWFncmFtLGQsYSxjKSxkLmxvY2F0aW9uPWMsYi5hbGxvd1NlbGVjdCYmYi5zZWxlY3QoZCksRy5mcmVlKGMpKTtiLlhhKCk7dGhpcy50cmFuc2FjdGlvblJlc3VsdD10aGlzLm5hbWU7Yi5hYSgiUGFydENyZWF0ZWQiLGQpO3RoaXMudmcoKTtyZXR1cm4gZDt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVoLnByb3RvdHlwZSx7YXJjaGV0eXBlTm9kZURhdGE6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy4kaTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy4kaT1hO319LGlzRG91YmxlQ2xpY2s6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy51O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnU9YTt9fSxpc0dyaWRTbmFwRW5hYmxlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMubD1hO319fSk7ZWguY2xhc3NOYW1lPSJDbGlja0NyZWF0aW5nVG9vbCI7ZnVuY3Rpb24gZ2goKXtrZi5jYWxsKHRoaXMpO3RoaXMubmFtZT0iRHJhZ1NlbGVjdGluZyI7dGhpcy5Raz0xNzU7dGhpcy51PSExO3ZhciBhPW5ldyBUKCk7YS5sYXllck5hbWU9IlRvb2wiO2Euc2VsZWN0YWJsZT0hMTt2YXIgYj1uZXcgVygpO2IubmFtZT0iU0hBUEUiO2IuZmlndXJlPSJSZWN0YW5nbGUiO2IuZmlsbD1udWxsO2Iuc3Ryb2tlPSJtYWdlbnRhIjthLmFkZChiKTt0aGlzLmw9YTt9b2EoZ2gsa2YpO2doLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07aWYoIWEuYWxsb3dTZWxlY3QpcmV0dXJuITE7dmFyIGI9YS5sYXN0SW5wdXQ7cmV0dXJuIWIubGVmdHx8YS5jdXJyZW50VG9vbCE9PXRoaXMmJighdGhpcy5pc0JleW9uZERyYWdTaXplKCl8fGIudGltZXN0YW1wLWEuZmlyc3RJbnB1dC50aW1lc3RhbXA8dGhpcy5kZWxheXx8bnVsbCE9PWEuJGwoYi5kb2N1bWVudFBvaW50LCEwKSk/ITE6ITA7fTtnaC5wcm90b3R5cGUuZG9BY3RpdmF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTt0aGlzLmlzQWN0aXZlPSEwO2EuaXNNb3VzZUNhcHR1cmVkPSEwO2Euc2tpcHNVbmRvTWFuYWdlcj0hMDthLmFkZCh0aGlzLmJveCk7dGhpcy5kb01vdXNlTW92ZSgpO307Z2gucHJvdG90eXBlLmRvRGVhY3RpdmF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTthLnZmKCk7YS5yZW1vdmUodGhpcy5ib3gpO2Euc2tpcHNVbmRvTWFuYWdlcj0hMTt0aGlzLmlzQWN0aXZlPWEuaXNNb3VzZUNhcHR1cmVkPSExO307Z2gucHJvdG90eXBlLmRvTW91c2VNb3ZlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKHRoaXMuaXNBY3RpdmUmJm51bGwhPT10aGlzLmJveCl7dmFyIGI9dGhpcy5jb21wdXRlQm94Qm91bmRzKCksYz10aGlzLmJveC4kYSgiU0hBUEUiKTtudWxsPT09YyYmKGM9dGhpcy5ib3guemIoKSk7dmFyIGQ9Sy5hbGxvYygpLmgoYi53aWR0aCxiLmhlaWdodCk7Yj1HLmFsbG9jKCkuaChiLngsYi55KTtjLmRlc2lyZWRTaXplPWQ7dGhpcy5ib3gucG9zaXRpb249YjtLLmZyZWUoZCk7Ry5mcmVlKGIpOyhhLmFsbG93SG9yaXpvbnRhbFNjcm9sbHx8YS5hbGxvd1ZlcnRpY2FsU2Nyb2xsKSYmYS5PcyhhLmxhc3RJbnB1dC52aWV3UG9pbnQpO319O2doLnByb3RvdHlwZS5kb01vdXNlVXA9ZnVuY3Rpb24oKXtpZih0aGlzLmlzQWN0aXZlKXt2YXIgYT10aGlzLmRpYWdyYW07YS5yZW1vdmUodGhpcy5ib3gpO3RyeXthLmN1cnJlbnRDdXJzb3I9IndhaXQiLGEuYWEoIkNoYW5naW5nU2VsZWN0aW9uIixhLnNlbGVjdGlvbiksdGhpcy5zZWxlY3RJblJlY3QodGhpcy5jb21wdXRlQm94Qm91bmRzKCkpLGEuYWEoIkNoYW5nZWRTZWxlY3Rpb24iLGEuc2VsZWN0aW9uKTt9ZmluYWxseXthLmN1cnJlbnRDdXJzb3I9IiI7fX10aGlzLnN0b3BUb29sKCk7fTtnaC5wcm90b3R5cGUuY29tcHV0ZUJveEJvdW5kcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtyZXR1cm4gbmV3IE4oYS5maXJzdElucHV0LmRvY3VtZW50UG9pbnQsYS5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludCk7fTtnaC5wcm90b3R5cGUuc2VsZWN0SW5SZWN0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZGlhZ3JhbSxjPWIubGFzdElucHV0O2E9Yi5reChhLHRoaXMuaXNQYXJ0aWFsSW5jbHVzaW9uKTtpZihpYj9jLm1ldGE6Yy5jb250cm9sKXtpZihjLnNoaWZ0KWZvcihhPWEuaXRlcmF0b3I7YS5uZXh0KCk7KXtiPWEudmFsdWUsYi5pc1NlbGVjdGVkJiYoYi5pc1NlbGVjdGVkPSExKTt9ZWxzZSBmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGIuaXNTZWxlY3RlZD0hYi5pc1NlbGVjdGVkO319ZWxzZSBpZihjLnNoaWZ0KWZvcihhPWEuaXRlcmF0b3I7YS5uZXh0KCk7KXtiPWEudmFsdWUsYi5pc1NlbGVjdGVkfHwoYi5pc1NlbGVjdGVkPSEwKTt9ZWxzZXtjPW5ldyBFKCk7Zm9yKGI9Yi5zZWxlY3Rpb24uaXRlcmF0b3I7Yi5uZXh0KCk7KXt2YXIgZD1iLnZhbHVlO2EuY29udGFpbnMoZCl8fGMuYWRkKGQpO31mb3IoYj1jLml0ZXJhdG9yO2IubmV4dCgpOyl7Yi52YWx1ZS5pc1NlbGVjdGVkPSExO31mb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGIuaXNTZWxlY3RlZHx8KGIuaXNTZWxlY3RlZD0hMCk7fX19O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGdoLnByb3RvdHlwZSx7ZGVsYXk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Razt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5Raz1hO319LGlzUGFydGlhbEluY2x1c2lvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudT1hO319LGJveDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMubD1hO319fSk7Z2guY2xhc3NOYW1lPSJEcmFnU2VsZWN0aW5nVG9vbCI7ZnVuY3Rpb24gaGgoKXtrZi5jYWxsKHRoaXMpO3RoaXMubmFtZT0iUGFubmluZyI7dGhpcy5sdT1uZXcgRygpO3RoaXMuYnk9bmV3IEcoKTt0aGlzLkFnPSExO3ZhciBhPXRoaXM7dGhpcy5Kdz1mdW5jdGlvbigpe3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixhLkp3LCExKTthLnN0b3BUb29sKCk7fTt9b2EoaGgsa2YpO2hoLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07cmV0dXJuIWEuYWxsb3dIb3Jpem9udGFsU2Nyb2xsJiYhYS5hbGxvd1ZlcnRpY2FsU2Nyb2xsfHwhYS5sYXN0SW5wdXQubGVmdHx8YS5jdXJyZW50VG9vbCE9PXRoaXMmJiF0aGlzLmlzQmV5b25kRHJhZ1NpemUoKT8hMTohMDt9O2hoLnByb3RvdHlwZS5kb0FjdGl2YXRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO3RoaXMuQWc/KGEubGFzdElucHV0LmJ1YmJsZXM9ITAsdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuSncsITEpKTooYS5jdXJyZW50Q3Vyc29yPSJtb3ZlIixhLmlzTW91c2VDYXB0dXJlZD0hMCx0aGlzLmx1LmFzc2lnbihhLnBvc2l0aW9uKSk7dGhpcy5pc0FjdGl2ZT0hMDt9O2hoLnByb3RvdHlwZS5kb0RlYWN0aXZhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07YS5jdXJyZW50Q3Vyc29yPSIiO3RoaXMuaXNBY3RpdmU9YS5pc01vdXNlQ2FwdHVyZWQ9ITE7fTtoaC5wcm90b3R5cGUuZG9DYW5jZWw9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07YS5wb3NpdGlvbj10aGlzLmx1O2EuaXNNb3VzZUNhcHR1cmVkPSExO3RoaXMuc3RvcFRvb2woKTt9O2hoLnByb3RvdHlwZS5kb01vdXNlTW92ZT1mdW5jdGlvbigpe3RoaXMubW92ZSgpO307aGgucHJvdG90eXBlLmRvTW91c2VVcD1mdW5jdGlvbigpe3RoaXMubW92ZSgpO3RoaXMuc3RvcFRvb2woKTt9O2hoLnByb3RvdHlwZS5tb3ZlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKHRoaXMuaXNBY3RpdmUmJmEpaWYodGhpcy5BZylhLmxhc3RJbnB1dC5idWJibGVzPSEwO2Vsc2V7dmFyIGI9YS5wb3NpdGlvbixjPWEuZmlyc3RJbnB1dC5kb2N1bWVudFBvaW50LGQ9YS5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludCxlPWIueCtjLngtZC54O2M9Yi55K2MueS1kLnk7YS5hbGxvd0hvcml6b250YWxTY3JvbGx8fChlPWIueCk7YS5hbGxvd1ZlcnRpY2FsU2Nyb2xsfHwoYz1iLnkpO2EucG9zaXRpb249dGhpcy5ieS5oKGUsYyk7fX07cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaGgucHJvdG90eXBlLHtidWJibGVzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQWc7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuQWc9YTt9fSxvcmlnaW5hbFBvc2l0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubHU7fX19KTtoaC5jbGFzc05hbWU9IlBhbm5pbmdUb29sIjtUYSgiY2xpY2tDcmVhdGluZ1Rvb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmluZFRvb2woIkNsaWNrQ3JlYXRpbmciKTt9LGZ1bmN0aW9uKGEpe3ZmKHRoaXMsIkNsaWNrQ3JlYXRpbmciLGEsdGhpcy5tb3VzZVVwVG9vbHMpO30pO1RhKCJjbGlja1NlbGVjdGluZ1Rvb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmluZFRvb2woIkNsaWNrU2VsZWN0aW5nIik7fSxmdW5jdGlvbihhKXt2Zih0aGlzLCJDbGlja1NlbGVjdGluZyIsYSx0aGlzLm1vdXNlVXBUb29scyk7fSk7VGEoInBhbm5pbmdUb29sIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbmRUb29sKCJQYW5uaW5nIik7fSxmdW5jdGlvbihhKXt2Zih0aGlzLCJQYW5uaW5nIixhLHRoaXMubW91c2VNb3ZlVG9vbHMpO30pO1RhKCJkcmFnU2VsZWN0aW5nVG9vbCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kVG9vbCgiRHJhZ1NlbGVjdGluZyIpO30sZnVuY3Rpb24oYSl7dmYodGhpcywiRHJhZ1NlbGVjdGluZyIsYSx0aGlzLm1vdXNlTW92ZVRvb2xzKTt9KTtUYSgiYWN0aW9uVG9vbCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kVG9vbCgiQWN0aW9uIik7fSxmdW5jdGlvbihhKXt2Zih0aGlzLCJBY3Rpb24iLGEsdGhpcy5tb3VzZURvd25Ub29scyk7fSk7ZnVuY3Rpb24gdWYoKXt0aGlzLmJhPXRoaXMuSz10aGlzLmw9dGhpcy51PW51bGw7fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVmLnByb3RvdHlwZSx7bWFpbkVsZW1lbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5LO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLks9YTt9fSxzaG93OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy51IT09YSYmKHRoaXMudT1hKTt9fSxoaWRlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5sIT09YSYmKHRoaXMubD1hKTt9fSx2YWx1ZUZ1bmN0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYmE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuYmE9YTt9fX0pO3VmLmNsYXNzTmFtZT0iSFRNTEluZm8iO2Z1bmN0aW9uIGloKGEsYixjKXt0aGlzLnRleHQ9YTt0aGlzLlp3PWI7dGhpcy52aXNpYmxlPWM7fWloLmNsYXNzTmFtZT0iQ29udGV4dE1lbnVCdXR0b25JbmZvIjtmdW5jdGlvbiBqaCgpe2tmLmNhbGwodGhpcyk7dGhpcy5uYW1lPSJDb250ZXh0TWVudSI7dGhpcy51PXRoaXMuTnQ9dGhpcy5sPW51bGw7dGhpcy5Ddz1uZXcgRygpO3RoaXMuT3Q9bnVsbDt2YXIgYT10aGlzO3RoaXMuQXU9ZnVuY3Rpb24oKXthLnN0b3BUb29sKCk7fTt9b2Eoamgsa2YpO2Z1bmN0aW9uIGtoKGEpe3ZhciBiPW5ldyB1ZigpO2Iuc2hvdz1mdW5jdGlvbihhLGIsYyl7Yy5zaG93RGVmYXVsdENvbnRleHRNZW51KCk7fTtiLmhpZGU9ZnVuY3Rpb24oYSxiKXtiLmhpZGVEZWZhdWx0Q29udGV4dE1lbnUoKTt9O2xoPWI7YS5BdT1mdW5jdGlvbigpe2Euc3RvcFRvb2woKTt9O2I9dmEoImRpdiIpO3ZhciBjPXZhKCJkaXYiKTtiLnN0eWxlLmNzc1RleHQ9InRvcDogMHB4O3otaW5kZXg6MTAwMDI7cG9zaXRpb246IGZpeGVkO2Rpc3BsYXk6IG5vbmU7dGV4dC1hbGlnbjogY2VudGVyO2xlZnQ6IDI1JTt3aWR0aDogNTAlO2JhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7cGFkZGluZzogMTZweDtib3JkZXI6IDE2cHggc29saWQgIzQ0NDtib3JkZXItcmFkaXVzOiAxMHB4O21hcmdpbi10b3A6IDEwcHgiO2Muc3R5bGUuY3NzVGV4dD0iei1pbmRleDoxMDAwMTtwb3NpdGlvbjogZml4ZWQ7ZGlzcGxheTogbm9uZTt0b3A6IDA7bGVmdDogMDt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7YmFja2dyb3VuZC1jb2xvcjogYmxhY2s7b3BhY2l0eTogMC44OyI7dmFyIGQ9dmEoInN0eWxlIik7dy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGQpO2Quc2hlZXQuaW5zZXJ0UnVsZSgiLmdvQ1h1bCB7IGxpc3Qtc3R5bGU6IG5vbmU7IH0iLDApO2Quc2hlZXQuaW5zZXJ0UnVsZSgiLmdvQ1hsaSB7Zm9udDo3MDAgMS41ZW0gSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtwb3NpdGlvbjogcmVsYXRpdmU7bWluLXdpZHRoOiA2MHB4OyB9IiwwKTtkLnNoZWV0Lmluc2VydFJ1bGUoIi5nb0NYYSB7Y29sb3I6ICM0NDQ7ZGlzcGxheTogaW5saW5lLWJsb2NrO3BhZGRpbmc6IDRweDt0ZXh0LWRlY29yYXRpb246IG5vbmU7bWFyZ2luOiAycHg7Ym9yZGVyOiAxcHggc29saWQgZ3JheTtib3JkZXItcmFkaXVzOiAxMHB4OyB9IiwwKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixtaCwhMSk7Yi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RzdGFydCIsbWgsITEpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLG1oLCExKTtiLmNsYXNzTmFtZT0iZ29DWGZvcmVncm91bmQiO2MuY2xhc3NOYW1lPSJnb0NYYmFja2dyb3VuZCI7dy5kb2N1bWVudC5ib2R5JiYody5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpLHcuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKSk7bmg9YjtvaD1jO3BoPSEwO31mdW5jdGlvbiBtaChhKXthLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuITE7fWpoLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07cmV0dXJuIHRoaXMuaXNCZXlvbmREcmFnU2l6ZSgpfHwhYS5sYXN0SW5wdXQucmlnaHQ/ITE6YS5sYXN0SW5wdXQuaXNUb3VjaEV2ZW50JiZudWxsIT09dGhpcy5kZWZhdWx0VG91Y2hDb250ZXh0TWVudXx8bnVsbCE9PXRoaXMuZmluZE9iamVjdFdpdGhDb250ZXh0TWVudSgpPyEwOiExO307amgucHJvdG90eXBlLmRvU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLkN3LnNldCh0aGlzLmRpYWdyYW0uZmlyc3RJbnB1dC5kb2N1bWVudFBvaW50KTt9O2poLnByb3RvdHlwZS5kb1N0b3A9ZnVuY3Rpb24oKXt0aGlzLmhpZGVDb250ZXh0TWVudSgpO3RoaXMuY3VycmVudE9iamVjdD1udWxsO307amgucHJvdG90eXBlLmZpbmRPYmplY3RXaXRoQ29udGV4dE1lbnU9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9bnVsbCk7dmFyIGI9dGhpcy5kaWFncmFtLGM9Yi5sYXN0SW5wdXQsZD1udWxsO2EgaW5zdGFuY2VvZiBQfHwoYSBpbnN0YW5jZW9mIFk/ZD1hOmQ9Yi5TYihjLmRvY3VtZW50UG9pbnQsbnVsbCxmdW5jdGlvbihhKXtyZXR1cm4hYS5sYXllci5pc1RlbXBvcmFyeTt9KSk7aWYobnVsbCE9PWQpe2ZvcihhPWQ7bnVsbCE9PWE7KXtpZihudWxsIT09YS5jb250ZXh0TWVudSlyZXR1cm4gYTthPWEucGFuZWw7fWlmKGIubGFzdElucHV0LmlzVG91Y2hFdmVudCYmdGhpcy5kZWZhdWx0VG91Y2hDb250ZXh0TWVudSlyZXR1cm4gZC5wYXJ0O31lbHNlIGlmKG51bGwhPT1iLmNvbnRleHRNZW51KXJldHVybiBiO3JldHVybiBudWxsO307amgucHJvdG90eXBlLmRvQWN0aXZhdGU9ZnVuY3Rpb24oKXt9O2poLnByb3RvdHlwZS5kb01vdXNlRG93bj1mdW5jdGlvbigpe2tmLnByb3RvdHlwZS5kb01vdXNlRG93bi5jYWxsKHRoaXMpO2lmKHRoaXMuaXNBY3RpdmUmJnRoaXMuY3VycmVudENvbnRleHRNZW51IGluc3RhbmNlb2YgcGYpe3ZhciBhPXRoaXMuZGlhZ3JhbS50b29sTWFuYWdlci5maW5kVG9vbCgiQWN0aW9uIik7bnVsbCE9PWEmJmEuY2FuU3RhcnQoKSYmKGEuZG9BY3RpdmF0ZSgpLGEuZG9Nb3VzZURvd24oKSxhLmRvRGVhY3RpdmF0ZSgpKTt9dGhpcy5kaWFncmFtLnRvb2xNYW5hZ2VyLm1vdXNlRG93blRvb2xzLmNvbnRhaW5zKHRoaXMpJiZxaCh0aGlzKTt9O2poLnByb3RvdHlwZS5kb01vdXNlVXA9ZnVuY3Rpb24oKXtpZih0aGlzLmlzQWN0aXZlJiZ0aGlzLmN1cnJlbnRDb250ZXh0TWVudSBpbnN0YW5jZW9mIHBmKXt2YXIgYT10aGlzLmRpYWdyYW0udG9vbE1hbmFnZXIuZmluZFRvb2woIkFjdGlvbiIpO251bGwhPT1hJiZhLmNhblN0YXJ0KCkmJihhLmRvQWN0aXZhdGUoKSxhLmRvQ2FuY2VsKCksYS5kb0RlYWN0aXZhdGUoKSk7fXFoKHRoaXMpO307ZnVuY3Rpb24gcWgoYSl7dmFyIGI9YS5kaWFncmFtO2lmKGEuaXNBY3RpdmUpe3ZhciBjPWEuY3VycmVudENvbnRleHRNZW51O2lmKG51bGwhPT1jKXtpZighKGMgaW5zdGFuY2VvZiB1Zikpe3ZhciBkPWIuU2IoYi5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludCxudWxsLG51bGwpO251bGwhPT1kJiZkLnFnKGMpJiZhLnN0YW5kYXJkTW91c2VDbGljayhudWxsLG51bGwpO31hLnN0b3BUb29sKCk7YS5jYW5TdGFydCgpJiYoYi5jdXJyZW50VG9vbD1hLGEuZG9Nb3VzZVVwKCkpO319ZWxzZSBhLmNhblN0YXJ0KCkmJihyaChhLCEwKSxhLmlzQWN0aXZlfHxhLnN0b3BUb29sKCkpO31mdW5jdGlvbiByaChhLGIsYyl7dm9pZCAwPT09YyYmKGM9bnVsbCk7YiYmYS5zdGFuZGFyZE1vdXNlU2VsZWN0KCk7aWYoIWEuc3RhbmRhcmRNb3VzZUNsaWNrKCkpaWYoYS5pc0FjdGl2ZT0hMCxiPWxoLG51bGw9PT1jJiYoYz1hLmZpbmRPYmplY3RXaXRoQ29udGV4dE1lbnUoKSksbnVsbCE9PWMpe3ZhciBkPWMuY29udGV4dE1lbnU7bnVsbCE9PWQ/KGEuY3VycmVudE9iamVjdD1jIGluc3RhbmNlb2YgWT9jOm51bGwsYS5zaG93Q29udGV4dE1lbnUoZCxhLmN1cnJlbnRPYmplY3QpKTpudWxsIT09YiYmYS5zaG93Q29udGV4dE1lbnUoYixhLmN1cnJlbnRPYmplY3QpO31lbHNlIG51bGwhPT1iJiZhLnNob3dDb250ZXh0TWVudShiLG51bGwpO31qaC5wcm90b3R5cGUuZG9Nb3VzZU1vdmU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW0udG9vbE1hbmFnZXIuZmluZFRvb2woIkFjdGlvbiIpO251bGwhPT1hJiZhLmRvTW91c2VNb3ZlKCk7dGhpcy5pc0FjdGl2ZSYmdGhpcy5kaWFncmFtLnRvb2xNYW5hZ2VyLmRvTW91c2VNb3ZlKCk7fTtqaC5wcm90b3R5cGUuc2hvd0NvbnRleHRNZW51PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5kaWFncmFtO2EhPT10aGlzLmN1cnJlbnRDb250ZXh0TWVudSYmdGhpcy5oaWRlQ29udGV4dE1lbnUoKTtpZihhIGluc3RhbmNlb2YgcGYpe2EubGF5ZXJOYW1lPSJUb29sIjthLnNlbGVjdGFibGU9ITE7YS5zY2FsZT0xL2Muc2NhbGU7YS5jYXRlZ29yeT10aGlzLm5hbWU7bnVsbCE9PWEucGxhY2Vob2xkZXImJihhLnBsYWNlaG9sZGVyLnNjYWxlPWMuc2NhbGUpO3ZhciBkPWEuZGlhZ3JhbTtudWxsIT09ZCYmZCE9PWMmJmQucmVtb3ZlKGEpO2MuYWRkKGEpO251bGwhPT1iP2EuYWRvcm5lZE9iamVjdD1iOmEuZGF0YT1jLm1vZGVsO2EuYWMoKTt0aGlzLnBvc2l0aW9uQ29udGV4dE1lbnUoYSxiKTt9ZWxzZSBhIGluc3RhbmNlb2YgdWYmJmEuc2hvdyhiLGMsdGhpcyk7dGhpcy5jdXJyZW50Q29udGV4dE1lbnU9YTt9O2poLnByb3RvdHlwZS5wb3NpdGlvbkNvbnRleHRNZW51PWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hLnBsYWNlaG9sZGVyKXt2YXIgYj10aGlzLmRpYWdyYW0sYz1iLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50LmNvcHkoKSxkPWEubWVhc3VyZWRCb3VuZHMsZT1iLnZpZXdwb3J0Qm91bmRzO2IubGFzdElucHV0LmlzVG91Y2hFdmVudCYmKGMueC09ZC53aWR0aCk7Yy54K2Qud2lkdGg+ZS5yaWdodCYmKGMueC09ZC53aWR0aCs1L2Iuc2NhbGUpO2MueDxlLngmJihjLng9ZS54KTtjLnkrZC5oZWlnaHQ+ZS5ib3R0b20mJihjLnktPWQuaGVpZ2h0KzUvYi5zY2FsZSk7Yy55PGUueSYmKGMueT1lLnkpO2EucG9zaXRpb249Yzt9fTtqaC5wcm90b3R5cGUuaGlkZUNvbnRleHRNZW51PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLGI9dGhpcy5jdXJyZW50Q29udGV4dE1lbnU7bnVsbCE9PWImJihiIGluc3RhbmNlb2YgcGY/KGEucmVtb3ZlKGIpLG51bGwhPT10aGlzLk50JiZ0aGlzLk50LnRmKGIuY2F0ZWdvcnkpLGIuZGF0YT1udWxsLGIuYWRvcm5lZE9iamVjdD1udWxsKTpiIGluc3RhbmNlb2YgdWYmJihudWxsIT09Yi5oaWRlP2IuaGlkZShhLHRoaXMpOm51bGwhPT1iLm1haW5FbGVtZW50JiYoYi5tYWluRWxlbWVudC5zdHlsZS5kaXNwbGF5PSJub25lIikpLHRoaXMuY3VycmVudENvbnRleHRNZW51PW51bGwsdGhpcy5zdGFuZGFyZE1vdXNlT3ZlcigpKTt9O2Z1bmN0aW9uIHNoKCl7dmFyIGE9bmV3IEUoKTthLmFkZChuZXcgaWgoIkNvcHkiLGZ1bmN0aW9uKGEpe2EuY29tbWFuZEhhbmRsZXIuY29weVNlbGVjdGlvbigpO30sZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tbWFuZEhhbmRsZXIuY2FuQ29weVNlbGVjdGlvbigpO30pKTthLmFkZChuZXcgaWgoIkN1dCIsZnVuY3Rpb24oYSl7YS5jb21tYW5kSGFuZGxlci5jdXRTZWxlY3Rpb24oKTt9LGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbW1hbmRIYW5kbGVyLmNhbkN1dFNlbGVjdGlvbigpO30pKTthLmFkZChuZXcgaWgoIkRlbGV0ZSIsZnVuY3Rpb24oYSl7YS5jb21tYW5kSGFuZGxlci5kZWxldGVTZWxlY3Rpb24oKTt9LGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbW1hbmRIYW5kbGVyLmNhbkRlbGV0ZVNlbGVjdGlvbigpO30pKTthLmFkZChuZXcgaWgoIlBhc3RlIixmdW5jdGlvbihhKXthLmNvbW1hbmRIYW5kbGVyLnBhc3RlU2VsZWN0aW9uKGEubGFzdElucHV0LmRvY3VtZW50UG9pbnQpO30sZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tbWFuZEhhbmRsZXIuY2FuUGFzdGVTZWxlY3Rpb24oKTt9KSk7YS5hZGQobmV3IGloKCJTZWxlY3QgQWxsIixmdW5jdGlvbihhKXthLmNvbW1hbmRIYW5kbGVyLnNlbGVjdEFsbCgpO30sZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tbWFuZEhhbmRsZXIuY2FuU2VsZWN0QWxsKCk7fSkpO2EuYWRkKG5ldyBpaCgiVW5kbyIsZnVuY3Rpb24oYSl7YS5jb21tYW5kSGFuZGxlci51bmRvKCk7fSxmdW5jdGlvbihhKXtyZXR1cm4gYS5jb21tYW5kSGFuZGxlci5jYW5VbmRvKCk7fSkpO2EuYWRkKG5ldyBpaCgiUmVkbyIsZnVuY3Rpb24oYSl7YS5jb21tYW5kSGFuZGxlci5yZWRvKCk7fSxmdW5jdGlvbihhKXtyZXR1cm4gYS5jb21tYW5kSGFuZGxlci5jYW5SZWRvKCk7fSkpO2EuYWRkKG5ldyBpaCgiU2Nyb2xsIFRvIFBhcnQiLGZ1bmN0aW9uKGEpe2EuY29tbWFuZEhhbmRsZXIuc2Nyb2xsVG9QYXJ0KCk7fSxmdW5jdGlvbihhKXtyZXR1cm4gYS5jb21tYW5kSGFuZGxlci5jYW5TY3JvbGxUb1BhcnQoKTt9KSk7YS5hZGQobmV3IGloKCJab29tIFRvIEZpdCIsZnVuY3Rpb24oYSl7YS5jb21tYW5kSGFuZGxlci56b29tVG9GaXQoKTt9LGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbW1hbmRIYW5kbGVyLmNhblpvb21Ub0ZpdCgpO30pKTthLmFkZChuZXcgaWgoIlJlc2V0IFpvb20iLGZ1bmN0aW9uKGEpe2EuY29tbWFuZEhhbmRsZXIucmVzZXRab29tKCk7fSxmdW5jdGlvbihhKXtyZXR1cm4gYS5jb21tYW5kSGFuZGxlci5jYW5SZXNldFpvb20oKTt9KSk7YS5hZGQobmV3IGloKCJHcm91cCBTZWxlY3Rpb24iLGZ1bmN0aW9uKGEpe2EuY29tbWFuZEhhbmRsZXIuZ3JvdXBTZWxlY3Rpb24oKTt9LGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbW1hbmRIYW5kbGVyLmNhbkdyb3VwU2VsZWN0aW9uKCk7fSkpO2EuYWRkKG5ldyBpaCgiVW5ncm91cCBTZWxlY3Rpb24iLGZ1bmN0aW9uKGEpe2EuY29tbWFuZEhhbmRsZXIudW5ncm91cFNlbGVjdGlvbigpO30sZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tbWFuZEhhbmRsZXIuY2FuVW5ncm91cFNlbGVjdGlvbigpO30pKTthLmFkZChuZXcgaWgoIkVkaXQgVGV4dCIsZnVuY3Rpb24oYSl7YS5jb21tYW5kSGFuZGxlci5lZGl0VGV4dEJsb2NrKCk7fSxmdW5jdGlvbihhKXtyZXR1cm4gYS5jb21tYW5kSGFuZGxlci5jYW5FZGl0VGV4dEJsb2NrKCk7fSkpO3JldHVybiBhO31qaC5wcm90b3R5cGUuc2hvd0RlZmF1bHRDb250ZXh0TWVudT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtudWxsPT09dGhpcy5PdCYmKHRoaXMuT3Q9c2goKSk7bmguaW5uZXJIVE1MPSIiO29oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF1LCExKTt2YXIgYj10aGlzLGM9dmEoInVsIik7Yy5jbGFzc05hbWU9ImdvQ1h1bCI7bmguYXBwZW5kQ2hpbGQoYyk7Yy5pbm5lckhUTUw9IiI7Zm9yKHZhciBkPXRoaXMuT3QuaXRlcmF0b3I7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlLGY9ZS52aXNpYmxlO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgZS5adyYmKCJmdW5jdGlvbiIhPT10eXBlb2YgZnx8ZihhKSkpe2Y9dmEoImxpIik7Zi5jbGFzc05hbWU9ImdvQ1hsaSI7dmFyIGc9dmEoImEiKTtnLmNsYXNzTmFtZT0iZ29DWGEiO2cuaHJlZj0iIyI7Zy5VeD1lLlp3O2cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGMpe3RoaXMuVXgoYSk7Yi5zdG9wVG9vbCgpO2MucHJldmVudERlZmF1bHQoKTtyZXR1cm4hMTt9LCExKTtnLnRleHRDb250ZW50PWUudGV4dDtmLmFwcGVuZENoaWxkKGcpO2MuYXBwZW5kQ2hpbGQoZik7fX1uaC5zdHlsZS5kaXNwbGF5PSJibG9jayI7b2guc3R5bGUuZGlzcGxheT0iYmxvY2siO307amgucHJvdG90eXBlLmhpZGVEZWZhdWx0Q29udGV4dE1lbnU9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5jdXJyZW50Q29udGV4dE1lbnUmJnRoaXMuY3VycmVudENvbnRleHRNZW51PT09bGgmJihuaC5zdHlsZS5kaXNwbGF5PSJub25lIixvaC5zdHlsZS5kaXNwbGF5PSJub25lIixvaC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5BdSwhMSksdGhpcy5jdXJyZW50Q29udGV4dE1lbnU9bnVsbCk7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhqaC5wcm90b3R5cGUse2N1cnJlbnRDb250ZXh0TWVudTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMubD1hO3RoaXMuTnQ9YSBpbnN0YW5jZW9mIHBmP2EuYWRvcm5lZFBhcnQ6bnVsbDt9fSxkZWZhdWx0VG91Y2hDb250ZXh0TWVudTp7Z2V0OmZ1bmN0aW9uIGdldCgpeyExPT09cGgmJm51bGw9PT1saCYmdGgmJmtoKHRoaXMpO3JldHVybiBsaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7bnVsbD09PWEmJihwaD0hMCk7bGg9YTt9fSxjdXJyZW50T2JqZWN0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy51PWE7fX0sbW91c2VEb3duUG9pbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Ddzt9fX0pO3ZhciBsaD1udWxsLHBoPSExLG9oPW51bGwsbmg9bnVsbDtqaC5jbGFzc05hbWU9IkNvbnRleHRNZW51VG9vbCI7VGEoImNvbnRleHRNZW51VG9vbCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kVG9vbCgiQ29udGV4dE1lbnUiKTt9LGZ1bmN0aW9uKGEpe3ZmKHRoaXMsIkNvbnRleHRNZW51IixhLHRoaXMubW91c2VVcFRvb2xzKTt9KTtmdW5jdGlvbiB1aCgpe2tmLmNhbGwodGhpcyk7dGhpcy5uYW1lPSJUZXh0RWRpdGluZyI7dGhpcy5raD1uZXcgdmgoKTt0aGlzLk1hPW51bGw7dGhpcy5MYT13aDt0aGlzLnZpPW51bGw7dGhpcy5sYT14aDt0aGlzLks9MTt0aGlzLmJhPSEwO3RoaXMudT1udWxsO3RoaXMubD1uZXcgdWYoKTt0aGlzLlB0PW51bGw7eWgodGhpcyx0aGlzLmwpO31vYSh1aCxrZik7ZnVuY3Rpb24geWgoYSxiKXtpZih0aCl7dmFyIGM9dmEoInRleHRhcmVhIik7YS5QdD1jO2MuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKCl7aWYobnVsbCE9PWEudGV4dEJsb2NrKXt2YXIgYj1hLnV4KHRoaXMudmFsdWUpO3RoaXMuc3R5bGUud2lkdGg9MjArYi5tZWFzdXJlZEJvdW5kcy53aWR0aCp0aGlzLld6KyJweCI7dGhpcy5yb3dzPWIubGluZUNvdW50O319LCExKTtjLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGIpe2lmKG51bGwhPT1hLnRleHRCbG9jayl7dmFyIGM9Yi53aGljaDsxMz09PWM/KCExPT09YS50ZXh0QmxvY2suaXNNdWx0aWxpbmUmJmIucHJldmVudERlZmF1bHQoKSxhLmFjY2VwdFRleHQoemgpKTo5PT09Yz8oYS5hY2NlcHRUZXh0KEFoKSxiLnByZXZlbnREZWZhdWx0KCkpOjI3PT09YyYmKGEuZG9DYW5jZWwoKSxudWxsIT09YS5kaWFncmFtJiZhLmRpYWdyYW0uZG9Gb2N1cygpKTt9fSwhMSk7Yy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsZnVuY3Rpb24oKXtpZihudWxsIT09YS5jdXJyZW50VGV4dEVkaXRvciYmYS5zdGF0ZSE9PXhoKXt2YXIgYj1hLlB0O2EubGE9PT1CaCYmKGEubGE9RmgpOyJmdW5jdGlvbiI9PT10eXBlb2YgYi5zZWxlY3QmJmEuc2VsZWN0c1RleHRPbkFjdGl2YXRlJiYoYi5zZWxlY3QoKSxiLnNldFNlbGVjdGlvblJhbmdlKDAsOTk5OSkpO319LCExKTtjLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLGZ1bmN0aW9uKCl7aWYobnVsbCE9PWEuY3VycmVudFRleHRFZGl0b3ImJmEuc3RhdGUhPT14aCl7dmFyIGI9YS5QdDsiZnVuY3Rpb24iPT09dHlwZW9mIGIuZm9jdXMmJmIuZm9jdXMoKTsiZnVuY3Rpb24iPT09dHlwZW9mIGIuc2VsZWN0JiZhLnNlbGVjdHNUZXh0T25BY3RpdmF0ZSYmKGIuc2VsZWN0KCksYi5zZXRTZWxlY3Rpb25SYW5nZSgwLDk5OTkpKTt9fSwhMSk7Yi52YWx1ZUZ1bmN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGMudmFsdWU7fTtiLm1haW5FbGVtZW50PWM7Yi5zaG93PWZ1bmN0aW9uKGEsYixmKXtpZihhIGluc3RhbmNlb2YgdmgmJmYgaW5zdGFuY2VvZiB1aClpZihmLnN0YXRlPT09R2gpYy5zdHlsZS5ib3JkZXI9IjNweCBzb2xpZCByZWQiLGMuZm9jdXMoKTtlbHNle3ZhciBkPWEubWEoZGQpLGU9Yi5wb3NpdGlvbixrPWIuc2NhbGUsbD1hLkNlKCkqaztsPGYubWluaW11bUVkaXRvclNjYWxlJiYobD1mLm1pbmltdW1FZGl0b3JTY2FsZSk7dmFyIG09YS5uYXR1cmFsQm91bmRzLndpZHRoKmwrNixuPWEubmF0dXJhbEJvdW5kcy5oZWlnaHQqbCsyLHA9KGQueC1lLngpKms7ZD0oZC55LWUueSkqaztjLnZhbHVlPWEudGV4dDtiLmRpdi5zdHlsZS5mb250PWEuZm9udDtjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy5zdHlsZS56SW5kZXg9IjEwMCI7Yy5zdHlsZS5mb250PSJpbmhlcml0IjtjLnN0eWxlLmZvbnRTaXplPTEwMCpsKyIlIjtjLnN0eWxlLmxpbmVIZWlnaHQ9Im5vcm1hbCI7Yy5zdHlsZS53aWR0aD1tKyJweCI7Yy5zdHlsZS5sZWZ0PShwLW0vMnwwKS0xKyJweCI7Yy5zdHlsZS50b3A9KGQtbi8yfDApLTErInB4IjtjLnN0eWxlLnRleHRBbGlnbj1hLnRleHRBbGlnbjtjLnN0eWxlLm1hcmdpbj0iMCI7Yy5zdHlsZS5wYWRkaW5nPSIxcHgiO2Muc3R5bGUuYm9yZGVyPSIwIjtjLnN0eWxlLm91dGxpbmU9Im5vbmUiO2Muc3R5bGUud2hpdGVTcGFjZT0icHJlLXdyYXAiO2Muc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7Yy5yb3dzPWEubGluZUNvdW50O2MuV3o9bDtjLmNsYXNzTmFtZT0iZ29UWGFyZWEiO2IuZGl2LmFwcGVuZENoaWxkKGMpO2MuZm9jdXMoKTtmLnNlbGVjdHNUZXh0T25BY3RpdmF0ZSYmKGMuc2VsZWN0KCksYy5zZXRTZWxlY3Rpb25SYW5nZSgwLDk5OTkpKTt9fTtiLmhpZGU9ZnVuY3Rpb24oYSl7YS5kaXYucmVtb3ZlQ2hpbGQoYyk7fTt9fXVoLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07aWYobnVsbD09PWF8fGEuaXNSZWFkT25seXx8IWEubGFzdElucHV0LmxlZnR8fHRoaXMuaXNCZXlvbmREcmFnU2l6ZSgpKXJldHVybiExO3ZhciBiPWEuU2IoYS5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludCk7aWYoIShudWxsIT09YiYmYiBpbnN0YW5jZW9mIHZoJiZiLmVkaXRhYmxlJiZiLnBhcnQuY2FuRWRpdCgpKSlyZXR1cm4hMTtiPWIucGFydDtyZXR1cm4gbnVsbD09PWJ8fHRoaXMuc3RhcnRpbmc9PT13aCYmIWIuaXNTZWxlY3RlZHx8dGhpcy5zdGFydGluZz09PUhoJiYyPmEubGFzdElucHV0LmNsaWNrQ291bnQ/ITE6ITA7fTt1aC5wcm90b3R5cGUuZG9TdGFydD1mdW5jdGlvbigpe3RoaXMuaXNBY3RpdmV8fG51bGw9PT10aGlzLnRleHRCbG9ja3x8dGhpcy5kb0FjdGl2YXRlKCk7fTt1aC5wcm90b3R5cGUuZG9BY3RpdmF0ZT1mdW5jdGlvbigpe2lmKCF0aGlzLmlzQWN0aXZlKXt2YXIgYT10aGlzLmRpYWdyYW07aWYobnVsbCE9PWEpe3ZhciBiPXRoaXMudGV4dEJsb2NrO251bGw9PT1iJiYoYj1hLlNiKGEubGFzdElucHV0LmRvY3VtZW50UG9pbnQpKTtpZihudWxsIT09YiYmYiBpbnN0YW5jZW9mIHZoJiYodGhpcy50ZXh0QmxvY2s9YixudWxsIT09Yi5wYXJ0KSl7dGhpcy5pc0FjdGl2ZT0hMDt0aGlzLmxhPUJoO3ZhciBjPXRoaXMuZGVmYXVsdFRleHRFZGl0b3I7bnVsbCE9PWIudGV4dEVkaXRvciYmKGM9Yi50ZXh0RWRpdG9yKTt0aGlzLmtoPXRoaXMudGV4dEJsb2NrLmNvcHkoKTt2YXIgZD1uZXcgTih0aGlzLnRleHRCbG9jay5tYShUYyksdGhpcy50ZXh0QmxvY2subWEoaGQpKTthLkZ2KGQpO2Muc2hvdyhiLGEsdGhpcyk7dGhpcy5jdXJyZW50VGV4dEVkaXRvcj1jO319fX07dWgucHJvdG90eXBlLmRvQ2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy5zdG9wVG9vbCgpO307dWgucHJvdG90eXBlLmRvTW91c2VVcD1mdW5jdGlvbigpeyF0aGlzLmlzQWN0aXZlJiZ0aGlzLmNhblN0YXJ0KCkmJnRoaXMuZG9BY3RpdmF0ZSgpO307dWgucHJvdG90eXBlLmRvTW91c2VEb3duPWZ1bmN0aW9uKCl7dGhpcy5pc0FjdGl2ZSYmdGhpcy5hY2NlcHRUZXh0KEloKTt9O3VoLnByb3RvdHlwZS5hY2NlcHRUZXh0PWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIEloOmlmKHRoaXMubGE9PT1KaCl0aGlzLmN1cnJlbnRUZXh0RWRpdG9yIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJnRoaXMuY3VycmVudFRleHRFZGl0b3IuZm9jdXMoKTtlbHNlIGlmKHRoaXMubGE9PT1CaHx8dGhpcy5sYT09PUdofHx0aGlzLmxhPT09RmgpdGhpcy5sYT1LaCxMaCh0aGlzKTticmVhaztjYXNlIE1oOmNhc2Ugemg6Y2FzZSBBaDppZih6aCE9PWF8fCEwIT09dGhpcy50ZXh0QmxvY2suaXNNdWx0aWxpbmUpaWYodGhpcy5sYT09PUJofHx0aGlzLmxhPT09R2h8fHRoaXMubGE9PT1GaCl0aGlzLmxhPUtoLExoKHRoaXMpO319O2Z1bmN0aW9uIExoKGEpe3ZhciBiPWEudGV4dEJsb2NrLGM9YS5kaWFncmFtLGQ9YS5jdXJyZW50VGV4dEVkaXRvcjtpZihudWxsIT09YiYmbnVsbCE9PWQpe3ZhciBlPWIudGV4dCxmPSIiO251bGwhPT1kLnZhbHVlRnVuY3Rpb24mJihmPWQudmFsdWVGdW5jdGlvbigpKTthLmlzVmFsaWRUZXh0KGIsZSxmKT8oYS5BYShhLm5hbWUpLGEubGE9SmgsYS50cmFuc2FjdGlvblJlc3VsdD1hLm5hbWUsYi50ZXh0PWYsbnVsbCE9PWIudGV4dEVkaXRlZCYmYi50ZXh0RWRpdGVkKGIsZSxmKSxudWxsIT09YyYmYy5hYSgiVGV4dEVkaXRlZCIsYixlKSxhLnZnKCksYS5zdG9wVG9vbCgpLG51bGwhPT1jJiZjLmRvRm9jdXMoKSk6KGEubGE9R2gsbnVsbCE9PWIuZXJyb3JGdW5jdGlvbiYmYi5lcnJvckZ1bmN0aW9uKGEsZSxmKSxkLnNob3coYixjLGEpKTt9fXVoLnByb3RvdHlwZS5kb0RlYWN0aXZhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07bnVsbCE9PWEmJih0aGlzLmxhPXhoLHRoaXMudGV4dEJsb2NrPW51bGwsbnVsbCE9PXRoaXMuY3VycmVudFRleHRFZGl0b3ImJnRoaXMuY3VycmVudFRleHRFZGl0b3IuaGlkZShhLHRoaXMpLHRoaXMuaXNBY3RpdmU9ITEpO307dWgucHJvdG90eXBlLmlzVmFsaWRUZXh0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLnRleHRWYWxpZGF0aW9uO2lmKG51bGwhPT1kJiYhZChhLGIsYykpcmV0dXJuITE7ZD1hLnRleHRWYWxpZGF0aW9uO3JldHVybiBudWxsPT09ZHx8ZChhLGIsYyk/ITA6ITE7fTt1aC5wcm90b3R5cGUudXg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5raDtiLnRleHQ9YTtiLm1lYXN1cmUodGhpcy50ZXh0QmxvY2suamwsSW5maW5pdHkpO3JldHVybiBiO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModWgucHJvdG90eXBlLHt0ZXh0QmxvY2s6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5NYTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5NYT1hO319LGN1cnJlbnRUZXh0RWRpdG9yOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy51PWE7fX0sZGVmYXVsdFRleHRFZGl0b3I6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmw9YTt9fSxzdGFydGluZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkxhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkxhPWE7fX0sdGV4dFZhbGlkYXRpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy52aTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52aT1hO319LG1pbmltdW1FZGl0b3JTY2FsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLks7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSz1hO319LHNlbGVjdHNUZXh0T25BY3RpdmF0ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmJhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmJhPWE7fX0sc3RhdGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sYTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5sYSE9PWEmJih0aGlzLmxhPWEpO319fSk7dWgucHJvdG90eXBlLm1lYXN1cmVUZW1wb3JhcnlUZXh0QmxvY2s9dWgucHJvdG90eXBlLnV4O3ZhciBNaD1uZXcgRCh1aCwiTG9zdEZvY3VzIiwwKSxJaD1uZXcgRCh1aCwiTW91c2VEb3duIiwxKSxBaD1uZXcgRCh1aCwiVGFiIiwyKSx6aD1uZXcgRCh1aCwiRW50ZXIiLDMpLE5oPW5ldyBEKHVoLCJTaW5nbGVDbGljayIsMCksd2g9bmV3IEQodWgsIlNpbmdsZUNsaWNrU2VsZWN0ZWQiLDEpLEhoPW5ldyBEKHVoLCJEb3VibGVDbGljayIsMikseGg9bmV3IEQodWgsIlN0YXRlTm9uZSIsMCksQmg9bmV3IEQodWgsIlN0YXRlQWN0aXZlIiwxKSxGaD1uZXcgRCh1aCwiU3RhdGVFZGl0aW5nIiwyKSxLaD1uZXcgRCh1aCwiU3RhdGVWYWxpZGF0aW5nIiwzKSxHaD1uZXcgRCh1aCwiU3RhdGVJbnZhbGlkIiw0KSxKaD1uZXcgRCh1aCwiU3RhdGVWYWxpZGF0ZWQiLDUpO3VoLmNsYXNzTmFtZT0iVGV4dEVkaXRpbmdUb29sIjt1aC5Mb3N0Rm9jdXM9TWg7dWguTW91c2VEb3duPUloO3VoLlRhYj1BaDt1aC5FbnRlcj16aDt1aC5TaW5nbGVDbGljaz1OaDt1aC5TaW5nbGVDbGlja1NlbGVjdGVkPXdoO3VoLkRvdWJsZUNsaWNrPUhoO3VoLlN0YXRlTm9uZT14aDt1aC5TdGF0ZUFjdGl2ZT1CaDt1aC5TdGF0ZUVkaXRpbmc9Rmg7dWguU3RhdGVWYWxpZGF0aW5nPUtoO3VoLlN0YXRlSW52YWxpZD1HaDt1aC5TdGF0ZVZhbGlkYXRlZD1KaDtUYSgidGV4dEVkaXRpbmdUb29sIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbmRUb29sKCJUZXh0RWRpdGluZyIpO30sZnVuY3Rpb24oYSl7dmYodGhpcywiVGV4dEVkaXRpbmciLGEsdGhpcy5tb3VzZVVwVG9vbHMpO30pO2Z1bmN0aW9uIE9oKCl7UGh8fChRaCgpLFBoPSEwKTt0aGlzLnB3PVJoO3RoaXMuQz1sZjt0aGlzLnJuPXRoaXMuc249bnVsbDt0aGlzLlppPXRoaXMudG49dGhpcy51bj0wO3RoaXMuQWs9dGhpcy5ZZz10aGlzLnJiPXRoaXMuRHI9dGhpcy5LZj0hMTt0aGlzLlBnPXRoaXMuRGM9ITA7dGhpcy5VcT10aGlzLlRxPXRoaXMub3c9bnVsbDt0aGlzLm53PTA7dGhpcy5XcT1uZXcgTGIoKTt0aGlzLlZ0PTYwMDt0aGlzLld4PW5ldyBHKDAsMCk7dGhpcy5sdz10aGlzLmt3PXRoaXMuTXc9ITE7dGhpcy56az1uZXcgRigpO3RoaXMueGo9bmV3IExiKCk7dGhpcy5Vaz1uZXcgTGIoKTt0aGlzLiRyPW5ldyBGKCk7dGhpcy5WcT1udWxsO31PaC5wcm90b3R5cGUuaGI9ZnVuY3Rpb24oYSl7dGhpcy5DPWE7fTtmdW5jdGlvbiBSaChhLGIsYyxkKXthLz1kLzI7cmV0dXJuIDE+YT9jLzIqYSphK2I6LWMvMiooLS1hKihhLTIpLTEpK2I7fU9oLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe3JldHVybiEwO307dD1PaC5wcm90b3R5cGU7dC5SaT1mdW5jdGlvbihhLGIpe3RoaXMuRGMmJih2b2lkIDAhPT1iJiYodGhpcy5WcT1iKSx0aGlzLlBnfHx0aGlzLkMuT2kpJiYodGhpcy56ay5hZGQoYSksdGhpcy5jYW5TdGFydChhKSYmKHRoaXMuS2YmJnRoaXMudmQoKSx0aGlzLllnPXRoaXMucmI9ITApKTt9O3Queng9ZnVuY3Rpb24oYSxiKXt0aGlzLkRjJiYodm9pZCAwIT09YiYmKHRoaXMuVnE9YiksdGhpcy5QZ3x8dGhpcy5DLk9pKSYmKHRoaXMuemsuYWRkKGEpLHRoaXMuY2FuU3RhcnQoYSkmJih0aGlzLktmJiZ0aGlzLnZkKCksdGhpcy5yYj0hMCkpO307ZnVuY3Rpb24gU2goYSl7aWYoYS5EYyYmKGEuemsuY2xlYXIoKSxhLnJiKSlpZighYS5BaylhLnJiPSExLGEuWWc9ITE7ZWxzZSBpZigwPT09YS5aaSl7dmFyIGI9K25ldyBEYXRlKCk7YS5aaT1iO3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoITEhPT1hLnJiJiYhYS5LZiYmYS5aaT09PWIpe3ZhciBjPWEuQztjLkRlKCJ0ZW1wb3JhcnlQaXhlbFJhdGlvIikmJktmKGMpO1RoKGMpO2EucmI9ITE7YS5ZZz0hMTtjLmFhKCJBbmltYXRpb25TdGFydGluZyIpO1VoKGEsYik7fX0pO319dC55ZT1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoISghdGhpcy5yYnx8InBvc2l0aW9uIj09PWImJmMuQShkKXx8YSBpbnN0YW5jZW9mIFQmJiFhLmlzQW5pbWF0ZWQpKXtpZih0aGlzLnprLmNvbnRhaW5zKCJSZW1vdmUiKSYmYSBpbnN0YW5jZW9mIFQmJmEuTGIoKSl7dmFyIGc9dGhpcy5DLGg9YS5rZXk7dGhpcy5Vay5jb250YWlucyhoKT9hPXRoaXMuVWsuZ2V0KGgpOihhPWEuY29weSgpLGEuZGF0YT1udWxsLGcuYWRkKGEpLHRoaXMuVWsuYWRkKGgsYSkpO31nPXRoaXMueGo7aWYoZy5jb250YWlucyhhKSl7aD1nLkooYSk7Zz1oLnN0YXJ0O3ZhciBrPWguZW5kO3ZvaWQgMD09PWdbYl0mJihnW2JdPVZoKGMpKTtlfHwoaC5VdVtiXT1WaChkKSk7a1tiXT1WaChkKTt9ZWxzZSBoPXt9LGs9e30saFtiXT1WaChjKSxrW2JdPVZoKGQpLGM9aC5wb3NpdGlvbixjIGluc3RhbmNlb2YgRyYmIWMubygpJiZ0aGlzLnprLmNvbnRhaW5zKCJFeHBhbmQgU3ViR3JhcGgiKSYmYy5hc3NpZ24oay5wb3NpdGlvbiksaD1uZXcgV2goaCxrLGUpLGcuYWRkKGEsaCk7ZSYmMD09PWIuaW5kZXhPZigicG9zaXRpb246IikmJmEgaW5zdGFuY2VvZiBUJiYoaC5VdS5sb2NhdGlvbj1WaChhLmxvY2F0aW9uKSk7ZiYmKGgucHQ9ITApO3RoaXMuQWs9ITA7fX07ZnVuY3Rpb24gVmgoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBHP2EuY29weSgpOmEgaW5zdGFuY2VvZiBLP2EuY29weSgpOmE7fWZ1bmN0aW9uIFhoKGEsYil7aWYoIWEuS2YpcmV0dXJuITE7YT1hLnhqLkooYik7cmV0dXJuIG51bGwhPT1hJiZhLnB0O31mdW5jdGlvbiBVaChhLGIpe2Z1bmN0aW9uIGMoKXtpZighMSE9PWUuS2YmJmUuWmk9PT1iKXt2YXIgYT0rbmV3IERhdGUoKSxmPWE+cj9sOmEtcTtZaChlKTtaaChlLGQscCxnLGYsbCk7ZS5UcSYmZS5UcSgpO3BnKGQpOyRoKGUpO2E+cj9haShlKTp3LnJlcXVlc3RBbmltYXRpb25GcmFtZShjKTt9fXZhciBkPWEuQztpZihudWxsIT09ZCl7dmFyIGU9YSxmPWEuVnF8fHt9LGc9Zi5jQXx8YS5wdyxoPWYuZ0F8fG51bGwsaz1mLmhBfHxudWxsLGw9Zi5kdXJhdGlvbnx8YS5WdCxtPWEuV3g7Zm9yKGY9YS54ai5pdGVyYXRvcjtmLm5leHQoKTspe3ZhciBuPWYudmFsdWUuc3RhcnQucG9zaXRpb247biBpbnN0YW5jZW9mIEcmJihuLm8oKXx8bi5hc3NpZ24obSkpO31hLm93PWc7YS5UcT1oO2EuVXE9azthLm53PWw7YS5XcT1hLnhqO3ZhciBwPWEuV3E7Zm9yKGY9cC5pdGVyYXRvcjtmLm5leHQoKTspe2g9Zi52YWx1ZS5lbmQsaFsicG9zaXRpb246cGxhY2Vob2xkZXIiXSYmKGs9Zi5rZXkuZmluZFZpc2libGVOb2RlKCksayBpbnN0YW5jZW9mIGlnJiZudWxsIT09ay5wbGFjZWhvbGRlciYmKG09ay5wbGFjZWhvbGRlcixrPW0ubWEoVGMpLG09bS5wYWRkaW5nLGsueCs9bS5sZWZ0LGsueSs9bS50b3AsaFsicG9zaXRpb246cGxhY2Vob2xkZXIiXT1rKSk7fWEuS2Y9ITA7WWgoYSk7WmgoYSxkLHAsZywwLGwpO3BnKGEuQywhMCk7JGgoYSk7dmFyIHE9K25ldyBEYXRlKCkscj1xK2w7ZS5aaT09PWImJncucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7YygpO30pO319ZnVuY3Rpb24gWWgoYSl7aWYoIWEuRHIpe3ZhciBiPWEuQzthLk13PWIuc2tpcHNVbmRvTWFuYWdlcjthLmt3PWIuc2tpcHNNb2RlbFNvdXJjZUJpbmRpbmdzO2EubHc9Yi5VaTtiLnNraXBzVW5kb01hbmFnZXI9ITA7Yi5za2lwc01vZGVsU291cmNlQmluZGluZ3M9ITA7Yi5VaT0hMDthLkRyPSEwO319ZnVuY3Rpb24gJGgoYSl7dmFyIGI9YS5DO2Iuc2tpcHNVbmRvTWFuYWdlcj1hLk13O2Iuc2tpcHNNb2RlbFNvdXJjZUJpbmRpbmdzPWEua3c7Yi5VaT1hLmx3O2EuRHI9ITE7fWZ1bmN0aW9uIFpoKGEsYixjLGQsZSxmKXtmb3IoYz1jLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGc9Yy5rZXksaD1jLnZhbHVlLGs9aC5zdGFydCxsPWguZW5kLG09Ymk7Zm9yKG4gaW4gbCl7InBvc2l0aW9uIj09PW4mJihsWyJwb3NpdGlvbjpwbGFjZWhvbGRlciJdfHxsWyJwb3NpdGlvbjpub2RlIl0pfHxudWxsPT09bS5nZXQobil8fG0uZ2V0KG4pKGcsa1tuXSxsW25dLGQsZSxmLGgpO319ZD1iLmp2O2IuanY9ITA7dmFyIG49YS5wdzswIT09YS51biYmMCE9PWEudG4mJihjPWEudW4sYi5DYT1uKGUsYyxhLnRuLWMsZikpO251bGwhPT1hLnNuJiZudWxsIT09YS5ybiYmKGM9YS5zbixhPWEucm4sYi5zYT1uZXcgRyhuKGUsYy54LGEueC1jLngsZiksbihlLGMueSxhLnktYy55LGYpKSk7Yi5qdj1kO310LnZkPWZ1bmN0aW9uKCl7ITA9PT10aGlzLnJiJiYodGhpcy5ZZz10aGlzLnJiPSExLHRoaXMuWmk9MCx0aGlzLkFrJiZ0aGlzLkMuY2MoKSk7dGhpcy5LZiYmdGhpcy5EYyYmYWkodGhpcyk7fTtmdW5jdGlvbiBhaShhKXthLktmPSExO2EuQWs9ITE7WWgoYSk7Zm9yKHZhciBiPWEuQyxjPWEub3csZD1hLm53LGU9YS5XcSxmPWEuVWsuaXRlcmF0b3I7Zi5uZXh0KCk7KXtiLnJlbW92ZShmLnZhbHVlKTt9Zm9yKGY9YS4kci5pdGVyYXRvcjtmLm5leHQoKTspe2YudmFsdWUucygpO31lPWUuaXRlcmF0b3I7Zm9yKGY9Ymk7ZS5uZXh0KCk7KXt2YXIgZz1lLmtleSxoPWUudmFsdWUsaz1oLnN0YXJ0LGw9aC5lbmQsbT1oLlV1LG47Zm9yKG4gaW4gbCl7aWYobnVsbCE9PWYuZ2V0KG4pKXt2YXIgcD1uOyFoLlB1fHwicG9zaXRpb246bm9kZSIhPT1wJiYicG9zaXRpb246cGxhY2Vob2xkZXIiIT09cHx8KHA9InBvc2l0aW9uIik7Zi5nZXQocCkoZyxrW25dLHZvaWQgMCE9PW1bbl0/bVtuXTpoLlB1P2tbbl06bFtuXSxjLGQsZCk7fX1oLlB1JiZ2b2lkIDAhPT1tLmxvY2F0aW9uJiZnIGluc3RhbmNlb2YgVCYmKGcubG9jYXRpb249bS5sb2NhdGlvbik7aC5wdCYmZyBpbnN0YW5jZW9mIFQmJmcuTWIoITEpO31mb3IoYz1hLkMubGlua3M7Yy5uZXh0KCk7KXtkPWMudmFsdWUsbnVsbCE9PWQuYmgmJihkLnBvaW50cz1kLmJoLGQuYmg9bnVsbCk7fWIuZ3QuY2xlYXIoKTtVZihiLCExKTtiLlhhKCk7Yi5SKCk7Yi5mZCgpO2NpKGIpOyRoKGEpO2EuVXEmJmEuVXEoKTthLlppPTA7YS5XcS5jbGVhcigpO2EuVXE9bnVsbDthLlRxPW51bGw7YS5zbj1udWxsO2Eucm49bnVsbDthLnVuPTA7YS50bj0wO2EueGouY2xlYXIoKTswPGEuVWsuY291bnQmJmEuVWsuY2xlYXIoKTswPGEuJHIuY291bnQmJmEuJHIuY2xlYXIoKTthLlZxPW51bGw7Yi5hYSgiQW5pbWF0aW9uRmluaXNoZWQiKTtiLmNjKCk7fXQuS3A9ZnVuY3Rpb24oYSxiKXtpZih0aGlzLllnKXt2YXIgYz1iLmFjdHVhbEJvdW5kcyxkPW51bGw7YiBpbnN0YW5jZW9mIGlnJiYoZD1iLnBsYWNlaG9sZGVyKTtudWxsIT09ZD8oYz1kLm1hKFRjKSxkPWQucGFkZGluZyxjLngrPWQubGVmdCxjLnkrPWQudG9wLHRoaXMueWUoYSwicG9zaXRpb24iLGMsYS5wb3NpdGlvbiwhMSkpOnRoaXMueWUoYSwicG9zaXRpb24iLG5ldyBHKGMueCtjLndpZHRoLzIsYy55K2MuaGVpZ2h0LzIpLGEucG9zaXRpb24sITEpO3RoaXMueWUoYSwic2NhbGUiLC4wMSxhLnNjYWxlLCExKTtpZihhIGluc3RhbmNlb2YgaWcpZm9yKGE9YS5tZW1iZXJQYXJ0czthLm5leHQoKTspe2Q9YS52YWx1ZSxkIGluc3RhbmNlb2YgViYmdGhpcy5LcChkLGIpO319fTt0LkpwPWZ1bmN0aW9uKGEsYil7aWYoYS5pc1Zpc2libGUoKSYmdGhpcy5ZZyl7dmFyIGM9bnVsbDtiIGluc3RhbmNlb2YgaWcmJihjPWIucGxhY2Vob2xkZXIpO251bGwhPT1jP3RoaXMueWUoYSwicG9zaXRpb246cGxhY2Vob2xkZXIiLGEucG9zaXRpb24sYywhMCk6dGhpcy55ZShhLCJwb3NpdGlvbjpub2RlIixhLnBvc2l0aW9uLGIsITApO3RoaXMueWUoYSwic2NhbGUiLGEuc2NhbGUsLjAxLCEwKTt0aGlzLnJiJiYoYz10aGlzLnhqLGMuY29udGFpbnMoYSkmJihjLkooYSkucHQ9ITApKTtpZihhIGluc3RhbmNlb2YgaWcpZm9yKGE9YS5tZW1iZXJQYXJ0czthLm5leHQoKTspe2M9YS52YWx1ZSxjIGluc3RhbmNlb2YgViYmdGhpcy5KcChjLGIpO319fTtmdW5jdGlvbiBkaShhLGIsYyl7YS5yYiYmIWIuQShjKSYmKG51bGw9PT1hLnNuJiZiLm8oKSYmbnVsbD09PWEucm4mJihhLnNuPWIuY29weSgpKSxhLnJuPWMuY29weSgpLGEuQWs9ITApO31mdW5jdGlvbiBlaShhLGIsYyl7YS5yYiYmYS5DLk9pJiYoMD09PWEudW4mJjA9PT1hLnRuJiYoYS51bj1iKSxhLnRuPWMsYS5Baz0hMCk7fWZ1bmN0aW9uIFFoKCl7dmFyIGE9bmV3IExiKCk7YS5hZGQoInBvc2l0aW9uIixmdW5jdGlvbihhLGMsZCxlLGYsZyl7ZiE9PWc/YS53dChlKGYsYy54LGQueC1jLngsZyksZShmLGMueSxkLnktYy55LGcpKTphLnBvc2l0aW9uPW5ldyBHKGUoZixjLngsZC54LWMueCxnKSxlKGYsYy55LGQueS1jLnksZykpO30pO2EuYWRkKCJwb3NpdGlvbjpwbGFjZWhvbGRlciIsZnVuY3Rpb24oYSxjLGQsZSxmLGcpe2YhPT1nP2Eud3QoZShmLGMueCxkLngtYy54LGcpLGUoZixjLnksZC55LWMueSxnKSk6YS5wb3NpdGlvbj1uZXcgRyhlKGYsYy54LGQueC1jLngsZyksZShmLGMueSxkLnktYy55LGcpKTt9KTthLmFkZCgicG9zaXRpb246bm9kZSIsZnVuY3Rpb24oYSxjLGQsZSxmLGcpe3ZhciBiPWEuYWN0dWFsQm91bmRzLGs9ZC5hY3R1YWxCb3VuZHM7ZD1rLngray53aWR0aC8yLWIud2lkdGgvMjtiPWsueStrLmhlaWdodC8yLWIuaGVpZ2h0LzI7ZiE9PWc/YS53dChlKGYsYy54LGQtYy54LGcpLGUoZixjLnksYi1jLnksZykpOmEucG9zaXRpb249bmV3IEcoZShmLGMueCxkLWMueCxnKSxlKGYsYy55LGItYy55LGcpKTt9KTthLmFkZCgib3BhY2l0eSIsZnVuY3Rpb24oYSxjLGQsZSxmLGcpe2Eub3BhY2l0eT1lKGYsYyxkLWMsZyk7fSk7YS5hZGQoInNjYWxlIixmdW5jdGlvbihhLGMsZCxlLGYsZyl7YS5zY2FsZT1lKGYsYyxkLWMsZyk7fSk7YS5hZGQoImFuZ2xlIixmdW5jdGlvbihhLGMsZCxlLGYsZyl7YS5hbmdsZT1lKGYsYyxkLWMsZyk7fSk7YS5hZGQoInZpc2libGUiLGZ1bmN0aW9uKGEsYyxkLGUsZixnKXthLnZpc2libGU9ZiE9PWc/YzpkO30pO2JpPWE7fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE9oLnByb3RvdHlwZSx7YW5pbWF0aW9uUmVhc29uczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnprO319LGlzRW5hYmxlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkRjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkRjPWE7fX0sZHVyYXRpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5WdDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7MT5hJiZ4YShhLCI+PSAxIixPaCwiZHVyYXRpb24iKTt0aGlzLlZ0PWE7fX0saXNBbmltYXRpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5LZjt9fSxpc1RpY2tpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Ecjt9fSxpc0luaXRpYWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QZzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5QZz1hO319fSk7T2gucHJvdG90eXBlLnN0b3BBbmltYXRpb249T2gucHJvdG90eXBlLnZkO09oLnByb3RvdHlwZS5hZGRUb0FuaW1hdGlvbj1PaC5wcm90b3R5cGUueWU7T2gucHJvdG90eXBlLnByZXBhcmVBbmltYXRpb249T2gucHJvdG90eXBlLnp4O09oLnByb3RvdHlwZS5wcmVwYXJlQXV0b21hdGljQW5pbWF0aW9uPU9oLnByb3RvdHlwZS5SaTt2YXIgYmk9bnVsbCxQaD0hMTtPaC5jbGFzc05hbWU9IkFuaW1hdGlvbk1hbmFnZXIiO2Z1bmN0aW9uIFdoKGEsYixjKXt0aGlzLnN0YXJ0PWE7dGhpcy5lbmQ9Yjt0aGlzLlV1PXt9O3RoaXMuUHU9Yzt0aGlzLnB0PSExO31XaC5jbGFzc05hbWU9IkFuaW1hdGlvblN0YXRlcyI7ZnVuY3Rpb24gZmkoKXttYih0aGlzKTt0aGlzLkM9bnVsbDt0aGlzLkZhPW5ldyBFKCk7dGhpcy5VYT0iIjt0aGlzLmxiPTE7dGhpcy51PSExO3RoaXMuQmo9dGhpcy5LPXRoaXMuTmg9dGhpcy5NaD10aGlzLkxoPXRoaXMuS2g9dGhpcy5JaD10aGlzLkpoPXRoaXMuSGg9dGhpcy5QaD10aGlzLkdoPXRoaXMuT2g9dGhpcy5GaD10aGlzLkVoPSEwO3RoaXMubD0hMTt0aGlzLkpvPVtdO310PWZpLnByb3RvdHlwZTt0LmhiPWZ1bmN0aW9uKGEpe3RoaXMuQz1hO307dC50b1N0cmluZz1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT0wKTt2YXIgYj0nTGF5ZXIgIicrdGhpcy5uYW1lKyciJztpZigwPj1hKXJldHVybiBiO2Zvcih2YXIgYz0wLGQ9MCxlPTAsZj0wLGc9MCxoPXRoaXMuRmEuaXRlcmF0b3I7aC5uZXh0KCk7KXt2YXIgaz1oLnZhbHVlO2sgaW5zdGFuY2VvZiBpZz9lKys6ayBpbnN0YW5jZW9mIFY/ZCsrOmsgaW5zdGFuY2VvZiBTP2YrKzprIGluc3RhbmNlb2YgcGY/ZysrOmMrKzt9aD0iIjswPGMmJihoKz1jKyIgUGFydHMgIik7MDxkJiYoaCs9ZCsiIE5vZGVzICIpOzA8ZSYmKGgrPWUrIiBHcm91cHMgIik7MDxmJiYoaCs9ZisiIExpbmtzICIpOzA8ZyYmKGgrPWcrIiBBZG9ybm1lbnRzICIpO2lmKDE8YSlmb3IoYT10aGlzLkZhLml0ZXJhdG9yO2EubmV4dCgpOyl7Yz1hLnZhbHVlLGgrPSJcbiAgICAiK2MudG9TdHJpbmcoKSxkPWMuZGF0YSxudWxsIT09ZCYmQmIoZCkmJihoKz0iICMiK0JiKGQpKSxjIGluc3RhbmNlb2YgVj9oKz0iICIrUWEoZCk6YyBpbnN0YW5jZW9mIFMmJihoKz0iICIrUWEoYy5mcm9tTm9kZSkrIiAiK1FhKGMudG9Ob2RlKSk7fXJldHVybiBiKyIgIit0aGlzLkZhLmNvdW50KyI6ICIraDt9O3QuU2I9ZnVuY3Rpb24oYSxiLGMpe3ZvaWQgMD09PWImJihiPW51bGwpO3ZvaWQgMD09PWMmJihjPW51bGwpO2lmKCExPT09dGhpcy5CailyZXR1cm4gbnVsbDt2YXIgZD0hMTtudWxsIT09dGhpcy5kaWFncmFtJiZ0aGlzLmRpYWdyYW0udmlld3BvcnRCb3VuZHMuZWEoYSkmJihkPSEwKTtmb3IodmFyIGU9Ry5hbGxvYygpLGY9dGhpcy5GYS5qLGc9Zi5sZW5ndGg7Zy0tOyl7dmFyIGg9ZltnXTtpZigoITAhPT1kfHwhMSE9PW9nKGgpKSYmaC5pc1Zpc2libGUoKSYmKGUuYXNzaWduKGEpLFFiKGUsaC5yZCksaD1oLlNiKGUsYixjKSxudWxsIT09aCYmKG51bGwhPT1iJiYoaD1iKGgpKSxudWxsIT09aCYmKG51bGw9PT1jfHxjKGgpKSkpKXJldHVybiBHLmZyZWUoZSksaDt9Ry5mcmVlKGUpO3JldHVybiBudWxsO307dC5GaT1mdW5jdGlvbihhLGIsYyxkKXt2b2lkIDA9PT1iJiYoYj1udWxsKTt2b2lkIDA9PT1jJiYoYz1udWxsKTtkIGluc3RhbmNlb2YgRXx8ZCBpbnN0YW5jZW9mIEZ8fChkPW5ldyBGKCkpO2lmKCExPT09dGhpcy5CailyZXR1cm4gZDt2YXIgZT0hMTtudWxsIT09dGhpcy5kaWFncmFtJiZ0aGlzLmRpYWdyYW0udmlld3BvcnRCb3VuZHMuZWEoYSkmJihlPSEwKTtmb3IodmFyIGY9Ry5hbGxvYygpLGc9dGhpcy5GYS5qLGg9Zy5sZW5ndGg7aC0tOyl7dmFyIGs9Z1toXTtpZigoITAhPT1lfHwhMSE9PW9nKGspKSYmay5pc1Zpc2libGUoKSl7Zi5hc3NpZ24oYSk7UWIoZixrLnJkKTt2YXIgbD1rO2suRmkoZixiLGMsZCkmJihudWxsIT09YiYmKGw9YihsKSksbnVsbD09PWx8fG51bGwhPT1jJiYhYyhsKXx8ZC5hZGQobCkpO319Ry5mcmVlKGYpO3JldHVybiBkO307dC5tZz1mdW5jdGlvbihhLGIsYyxkLGUpe3ZvaWQgMD09PWImJihiPW51bGwpO3ZvaWQgMD09PWMmJihjPW51bGwpO3ZvaWQgMD09PWQmJihkPSExKTtlIGluc3RhbmNlb2YgRXx8ZSBpbnN0YW5jZW9mIEZ8fChlPW5ldyBGKCkpO2lmKCExPT09dGhpcy5CailyZXR1cm4gZTt2YXIgZj0hMTtudWxsIT09dGhpcy5kaWFncmFtJiZ0aGlzLmRpYWdyYW0udmlld3BvcnRCb3VuZHMubGYoYSkmJihmPSEwKTtmb3IodmFyIGc9dGhpcy5GYS5qLGg9Zy5sZW5ndGg7aC0tOyl7dmFyIGs9Z1toXTtpZigoITAhPT1mfHwhMSE9PW9nKGspKSYmay5pc1Zpc2libGUoKSl7dmFyIGw9aztrLm1nKGEsYixjLGQsZSkmJihudWxsIT09YiYmKGw9YihsKSksbnVsbD09PWx8fG51bGwhPT1jJiYhYyhsKXx8ZS5hZGQobCkpO319cmV0dXJuIGU7fTt0Lm5nPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2b2lkIDA9PT1jJiYoYz1udWxsKTt2b2lkIDA9PT1kJiYoZD1udWxsKTt2b2lkIDA9PT1lJiYoZT0hMCk7aWYoITEhPT1lJiYhMCE9PWUpe2lmKGUgaW5zdGFuY2VvZiBFfHxlIGluc3RhbmNlb2YgRilmPWU7ZT0hMDt9ZiBpbnN0YW5jZW9mIEV8fGYgaW5zdGFuY2VvZiBGfHwoZj1uZXcgRigpKTtpZighMT09PXRoaXMuQmopcmV0dXJuIGY7dmFyIGc9ITE7bnVsbCE9PXRoaXMuZGlhZ3JhbSYmdGhpcy5kaWFncmFtLnZpZXdwb3J0Qm91bmRzLmVhKGEpJiYoZz0hMCk7Zm9yKHZhciBoPUcuYWxsb2MoKSxrPUcuYWxsb2MoKSxsPXRoaXMuRmEuaixtPWwubGVuZ3RoO20tLTspe3ZhciBuPWxbbV07aWYoKCEwIT09Z3x8ITEhPT1vZyhuKSkmJm4uaXNWaXNpYmxlKCkpe2guYXNzaWduKGEpO1FiKGgsbi5yZCk7ay5oKGEueCtiLGEueSk7UWIoayxuLnJkKTt2YXIgcD1uO24ubmcoaCxrLGMsZCxlLGYpJiYobnVsbCE9PWMmJihwPWMocCkpLG51bGw9PT1wfHxudWxsIT09ZCYmIWQocCl8fGYuYWRkKHApKTt9fUcuZnJlZShoKTtHLmZyZWUoayk7cmV0dXJuIGY7fTt0LmhkPWZ1bmN0aW9uKGEsYil7aWYodGhpcy52aXNpYmxlKXt2YXIgYz12b2lkIDA9PT1iP2Eudmlld3BvcnRCb3VuZHM6Yjt2YXIgZD10aGlzLkZhLmosZT1kLmxlbmd0aDthPUthKCk7Yj1LYSgpO2Zvcih2YXIgZj0wO2Y8ZTtmKyspe3ZhciBnPWRbZl07Zy5Cdz1mO2cgaW5zdGFuY2VvZiBTJiYhMT09PWcuTGN8fGcgaW5zdGFuY2VvZiBwZiYmbnVsbCE9PWcuYWRvcm5lZFBhcnR8fChBYyhnLmFjdHVhbEJvdW5kcyxjLDEwKT8oZy5oZCghMCksYS5wdXNoKGcpKTooZy5oZCghMSksbnVsbCE9PWcuYWRvcm5tZW50cyYmMDxnLmFkb3JubWVudHMuY291bnQmJmIucHVzaChnKSkpO31mb3IoYz0wO2M8YS5sZW5ndGg7YysrKXtmb3IoZD1hW2NdLGdpKGQpLGQ9ZC5hZG9ybm1lbnRzO2QubmV4dCgpOyl7ZT1kLnZhbHVlLGUubWVhc3VyZShJbmZpbml0eSxJbmZpbml0eSksZS5hcnJhbmdlKCksZS5oZCghMCk7fX1mb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWJbY10sZC51cGRhdGVBZG9ybm1lbnRzKCksaGkoZCwhMCk7fU9hKGEpO09hKGIpO319O3QuaGM9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMudmlzaWJsZSYmMCE9PXRoaXMubGImJih2b2lkIDA9PT1jJiYoYz0hMCksY3x8IXRoaXMuaXNUZW1wb3JhcnkpKXtjPXRoaXMuRmEuajt2YXIgZD1jLmxlbmd0aDtpZigwIT09ZCl7MSE9PXRoaXMubGImJihhLmdsb2JhbEFscGhhPXRoaXMubGIpO3ZhciBlPXRoaXMuSm87ZS5sZW5ndGg9MDtmb3IodmFyIGY9Yi5zY2FsZSxnPTA7ZzxkO2crKyl7dmFyIGg9Y1tnXTtpZihvZyhoKSl7aWYoaCBpbnN0YW5jZW9mIFMmJihoLmlzT3J0aG9nb25hbCYmZS5wdXNoKGgpLCExPT09aC5MYykpY29udGludWU7dmFyIGs9aC5hY3R1YWxCb3VuZHM7MTxrLndpZHRoKmZ8fDE8ay5oZWlnaHQqZj9oLmhjKGEsYik6aWkoYSxoKTt9fWEuZ2xvYmFsQWxwaGE9MTt9fX07ZnVuY3Rpb24gaWkoYSxiKXt2YXIgYz1iLmFjdHVhbEJvdW5kcyxkPWIubmF0dXJhbEJvdW5kcztpZigwIT09Yy53aWR0aCYmMCE9PWMuaGVpZ2h0JiYhaXNOYU4oYy54KSYmIWlzTmFOKGMueSkmJmIuaXNWaXNpYmxlKCkpe3ZhciBlPWIudHJhbnNmb3JtO251bGwhPT1iLmFyZWFCYWNrZ3JvdW5kJiYoamkoYixhLGIuYXJlYUJhY2tncm91bmQsITAsITAsZCxjKSxhLmZpbGxSZWN0KGMueCxjLnksYy53aWR0aCxjLmhlaWdodCkpO251bGw9PT1iLmFyZWFCYWNrZ3JvdW5kJiZudWxsPT09Yi5iYWNrZ3JvdW5kJiYoamkoYixhLCJyZ2JhKDAsMCwwLDAuNCkiLCEwLCExLGQsYyksYS5maWxsUmVjdChjLngsYy55LGMud2lkdGgsYy5oZWlnaHQpKTtudWxsIT09Yi5iYWNrZ3JvdW5kJiYoYS50cmFuc2Zvcm0oZS5tMTEsZS5tMTIsZS5tMjEsZS5tMjIsZS5keCxlLmR5KSxqaShiLGEsYi5iYWNrZ3JvdW5kLCEwLCExLGQsYyksYS5maWxsUmVjdCgwLDAsZC53aWR0aCxkLmhlaWdodCksZS5jdCgpfHwoYj0xLyhlLm0xMSplLm0yMi1lLm0xMiplLm0yMSksYS50cmFuc2Zvcm0oZS5tMjIqYiwtZS5tMTIqYiwtZS5tMjEqYixlLm0xMSpiLGIqKGUubTIxKmUuZHktZS5tMjIqZS5keCksYiooZS5tMTIqZS5keC1lLm0xMSplLmR5KSkpKTt9fXQuZz1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXRoaXMuZGlhZ3JhbTtudWxsIT09ZiYmZi5hYihhZixhLHRoaXMsYixjLGQsZSk7fTt0Lk5pPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLkZhO2IuZmk9dGhpcztpZihhPj1kLmNvdW50KWE9ZC5jb3VudDtlbHNlIGlmKGQuTihhKT09PWIpcmV0dXJuLTE7ZC5JYihhLGIpO2IuWXAoYyk7ZD10aGlzLmRpYWdyYW07bnVsbCE9PWQmJihjP2QuUigpOmQuTmkoYikpO2tpKHRoaXMsYSxiKTtyZXR1cm4gYTt9O3QueGM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFjJiZiLmxheWVyIT09dGhpcyYmbnVsbCE9PWIubGF5ZXIpcmV0dXJuIGIubGF5ZXIueGMoYSxiLGMpO3ZhciBkPXRoaXMuRmE7aWYoMD5hfHxhPj1kLmxlbmd0aCl7aWYoYT1kLmluZGV4T2YoYiksMD5hKXJldHVybi0xO31lbHNlIGlmKGQuTihhKSE9PWImJihhPWQuaW5kZXhPZihiKSwwPmEpKXJldHVybi0xO2IuWnAoYyk7ZC5tYihhKTtkPXRoaXMuZGlhZ3JhbTtudWxsIT09ZCYmKGM/ZC5SKCk6ZC54YyhiKSk7Yi5maT1udWxsO3JldHVybiBhO307ZnVuY3Rpb24ga2koYSxiLGMpe2I9bGkoYSxiLGMpO2lmKGMgaW5zdGFuY2VvZiBpZyYmbnVsbCE9PWMmJmlzTmFOKGMuek9yZGVyKSl7aWYoMCE9PWMubWVtYmVyUGFydHMuY291bnQpe2Zvcih2YXIgZD0tMSxlPWEuRmEuaixmPWUubGVuZ3RoLGc9MDtnPGY7ZysrKXt2YXIgaD1lW2ddO2lmKGg9PT1jJiYoYj1nLDA8PWQpKWJyZWFrO2lmKDA+ZCYmaC5jb250YWluaW5nR3JvdXA9PT1jJiYoZD1nLDA8PWIpKWJyZWFrO30hKDA+ZCkmJmQ8YiYmKGU9YS5GYSxlLm1iKGIpLGUuSWIoZCxjKSk7fWM9Yy5jb250YWluaW5nR3JvdXA7bnVsbCE9PWMmJmtpKGEsLTEsYyk7fX1mdW5jdGlvbiBsaShhLGIsYyl7dmFyIGQ9Yy56T3JkZXI7aWYoaXNOYU4oZCkpcmV0dXJuIGI7YT1hLkZhO3ZhciBlPWEuY291bnQ7aWYoMT49ZSlyZXR1cm4gYjswPmImJihiPWEuaW5kZXhPZihjKSk7aWYoMD5iKXJldHVybi0xO2Zvcih2YXIgZj1iLTEsZz1OYU47MDw9Zjspe2c9YS5OKGYpLnpPcmRlcjtpZighaXNOYU4oZykpYnJlYWs7Zi0tO31mb3IodmFyIGg9YisxLGs9TmFOO2g8ZTspe2s9YS5OKGgpLnpPcmRlcjtpZighaXNOYU4oaykpYnJlYWs7aCsrO31pZighaXNOYU4oZykmJmc+ZClmb3IoOzspe2lmKC0xPT09Znx8Zzw9ZCl7ZisrO2lmKGY9PT1iKWJyZWFrO2EubWIoYik7YS5JYihmLGMpO3JldHVybiBmO31mb3IoZz1OYU47MDw9LS1mJiYoZz1hLk4oZikuek9yZGVyLGlzTmFOKGcpKTspezt9fWVsc2UgaWYoIWlzTmFOKGspJiZrPGQpZm9yKDs7KXtpZihoPT09ZXx8az49ZCl7aC0tO2lmKGg9PT1iKWJyZWFrO2EubWIoYik7YS5JYihoLGMpO3JldHVybiBoO31mb3Ioaz1OYU47KytoPGUmJihrPWEuTihoKS56T3JkZXIsaXNOYU4oaykpOyl7O319cmV0dXJuIGI7fXQuY2xlYXI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GYS5OYSgpLGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe2FbY10uaGQoITEpLHRoaXMueGMoLTEsYVtjXSwhMSk7fXRoaXMuSm8ubGVuZ3RoPTA7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhmaS5wcm90b3R5cGUse3BhcnRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRmEuaXRlcmF0b3I7fX0scGFydHNCYWNrd2FyZHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5GYS5pdGVyYXRvckJhY2t3YXJkczt9fSxkaWFncmFtOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQzt9fSxuYW1lOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVWE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuVWE7aWYoYiE9PWEpe3ZhciBjPXRoaXMuZGlhZ3JhbTtpZihudWxsIT09Yylmb3IoIiI9PT1iJiZBKCJDYW5ub3QgcmVuYW1lIGRlZmF1bHQgTGF5ZXIgdG86ICIrYSksYz1jLmxheWVycztjLm5leHQoKTspe2MudmFsdWUubmFtZT09PWEmJkEoIkxheWVyLm5hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgZGlhZ3JhbTogIithKTt9dGhpcy5VYT1hO3RoaXMuZygibmFtZSIsYixhKTtmb3IoYT10aGlzLkZhLml0ZXJhdG9yO2EubmV4dCgpOyl7YS52YWx1ZS5sYXllck5hbWU9dGhpcy5VYTt9fX19LG9wYWNpdHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5sYjtiIT09YSYmKCgwPmF8fDE8YSkmJnhhKGEsIjAgPD0gdmFsdWUgPD0gMSIsZmksIm9wYWNpdHkiKSx0aGlzLmxiPWEsdGhpcy5nKCJvcGFjaXR5IixiLGEpLGE9dGhpcy5kaWFncmFtLG51bGwhPT1hJiZhLlIoKSk7fX0saXNUZW1wb3Jhcnk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy51O30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnU7YiE9PWEmJih0aGlzLnU9YSx0aGlzLmcoImlzVGVtcG9yYXJ5IixiLGEpKTt9fSx2aXNpYmxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5LO2lmKGIhPT1hKXt0aGlzLks9YTt0aGlzLmcoInZpc2libGUiLGIsYSk7Zm9yKGI9dGhpcy5GYS5pdGVyYXRvcjtiLm5leHQoKTspe2IudmFsdWUuTWIoYSk7fWE9dGhpcy5kaWFncmFtO251bGwhPT1hJiZhLlIoKTt9fX0scGlja2FibGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Cajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5CajtiIT09YSYmKHRoaXMuQmo9YSx0aGlzLmcoInBpY2thYmxlIixiLGEpKTt9fSxpc0JvdW5kc0luY2x1ZGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5sIT09YSYmKHRoaXMubD1hLG51bGwhPT10aGlzLmRpYWdyYW0mJnRoaXMuZGlhZ3JhbS5YYSgpKTt9fSxhbGxvd0NvcHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5FaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5FaDtiIT09YSYmKHRoaXMuRWg9YSx0aGlzLmcoImFsbG93Q29weSIsYixhKSk7fX0sYWxsb3dEZWxldGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5GaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5GaDtiIT09YSYmKHRoaXMuRmg9YSx0aGlzLmcoImFsbG93RGVsZXRlIixiLGEpKTt9fSxhbGxvd1RleHRFZGl0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuT2g7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuT2g7YiE9PWEmJih0aGlzLk9oPWEsdGhpcy5nKCJhbGxvd1RleHRFZGl0IixiLGEpKTt9fSxhbGxvd0dyb3VwOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuR2g7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuR2g7YiE9PWEmJih0aGlzLkdoPWEsdGhpcy5nKCJhbGxvd0dyb3VwIixiLGEpKTt9fSxhbGxvd1VuZ3JvdXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5QaDtiIT09YSYmKHRoaXMuUGg9YSx0aGlzLmcoImFsbG93VW5ncm91cCIsYixhKSk7fX0sYWxsb3dMaW5rOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSGg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuSGg7YiE9PWEmJih0aGlzLkhoPWEsdGhpcy5nKCJhbGxvd0xpbmsiLGIsYSkpO319LGFsbG93UmVsaW5rOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSmg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuSmg7YiE9PWEmJih0aGlzLkpoPWEsdGhpcy5nKCJhbGxvd1JlbGluayIsYixhKSk7fX0sYWxsb3dNb3ZlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSWg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuSWg7YiE9PWEmJih0aGlzLkloPWEsdGhpcy5nKCJhbGxvd01vdmUiLGIsYSkpO319LGFsbG93UmVzaGFwZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLktoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLktoO2IhPT1hJiYodGhpcy5LaD1hLHRoaXMuZygiYWxsb3dSZXNoYXBlIixiLGEpKTt9fSxhbGxvd1Jlc2l6ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkxoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkxoO2IhPT1hJiYodGhpcy5MaD1hLHRoaXMuZygiYWxsb3dSZXNpemUiLGIsYSkpO319LGFsbG93Um90YXRlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTWg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuTWg7YiE9PWEmJih0aGlzLk1oPWEsdGhpcy5nKCJhbGxvd1JvdGF0ZSIsYixhKSk7fX0sYWxsb3dTZWxlY3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5OaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5OaDtiIT09YSYmKHRoaXMuTmg9YSx0aGlzLmcoImFsbG93U2VsZWN0IixiLGEpKTt9fX0pO2ZpLnByb3RvdHlwZS5maW5kT2JqZWN0c05lYXI9ZmkucHJvdG90eXBlLm5nO2ZpLnByb3RvdHlwZS5maW5kT2JqZWN0c0luPWZpLnByb3RvdHlwZS5tZztmaS5wcm90b3R5cGUuZmluZE9iamVjdHNBdD1maS5wcm90b3R5cGUuRmk7ZmkucHJvdG90eXBlLmZpbmRPYmplY3RBdD1maS5wcm90b3R5cGUuU2I7ZmkuY2xhc3NOYW1lPSJMYXllciI7ZnVuY3Rpb24gUChhKXtmdW5jdGlvbiBiKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKHcuZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLGIsITEpO2Muc2V0UlRMKCk7fTE8YXJndW1lbnRzLmxlbmd0aCYmQSgiRGlhZ3JhbSBjb25zdHJ1Y3RvciBjYW4gb25seSB0YWtlIG9uZSBvcHRpb25hbCBhcmd1bWVudCwgdGhlIERJViBIVE1MIGVsZW1lbnQgb3IgaXRzIGlkLiIpO21pfHwobmkoKSxtaT0hMCk7bWIodGhpcyk7bGY9dGhpcztXYT1bXTt0aGlzLm9iPSEwO3RoaXMueWs9bmV3IE9oKCk7dGhpcy55ay5oYih0aGlzKTt0aGlzLkdiPTE3O3RoaXMuVG49ITE7dGhpcy5ydT0iZGVmYXVsdCI7dGhpcy5JYT1udWxsO3ZhciBjPXRoaXM7dGgmJihudWxsIT09dy5kb2N1bWVudC5ib2R5P3RoaXMuc2V0UlRMKCk6Yy5hZGRFdmVudExpc3RlbmVyKHcuZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLGIsITEpKTt0aGlzLlBhPW5ldyBFKCk7dGhpcy53YT10aGlzLnhhPTA7dGhpcy5EYT1udWxsO3RoaXMucHU9bmV3IExiKCk7dGhpcy4kZz10aGlzLlljPW51bGw7dGhpcy5EdigpO3RoaXMuZGw9bnVsbDt0aGlzLkN2KCk7dGhpcy5zYT1uZXcgRyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLlpxPXRoaXMuQ2E9MTt0aGlzLnVyPW5ldyBHKE5hTixOYU4pLmZyZWV6ZSgpO3RoaXMudnI9TmFOO3RoaXMuUHI9MUUtNDt0aGlzLk5yPTEwMDt0aGlzLnRiPW5ldyBRYygpO3RoaXMuSXM9bmV3IEcoTmFOLE5hTikuZnJlZXplKCk7dGhpcy5qcj1uZXcgTihOYU4sTmFOLE5hTixOYU4pLmZyZWV6ZSgpO3RoaXMucmk9bmV3IEljKDAsMCwwLDApLmZyZWV6ZSgpO3RoaXMuR2o9b2k7dGhpcy5ycz0hMTt0aGlzLm1zPXRoaXMuaHM9bnVsbDt0aGlzLmFqPXBpO3RoaXMuY2o9RWQ7dGhpcy5haT1waTt0aGlzLk9uPUVkO3RoaXMud3I9dGhpcy50cj1UYzt0aGlzLm5jPSEwO3RoaXMuUG49ITE7dGhpcy5EZD1uZXcgRigpO3RoaXMuV2g9bmV3IExiKCk7dGhpcy54bj0hMDt0aGlzLlRtPTI1MDt0aGlzLkJrPS0xO3RoaXMuVW09bmV3IEljKDE2LDE2LDE2LDE2KS5mcmVlemUoKTt0aGlzLlJrPXRoaXMucWQ9ITE7dGhpcy5Yaz0hMDt0aGlzLlhoPW5ldyBYZSgpO3RoaXMuWGguZGlhZ3JhbT10aGlzO3RoaXMuWGU9bmV3IFhlKCk7dGhpcy5YZS5kaWFncmFtPXRoaXM7dGhpcy5xaj1uZXcgWGUoKTt0aGlzLnFqLmRpYWdyYW09dGhpczt0aGlzLm5lPXRoaXMuemY9bnVsbDt0aGlzLk1sPSExO3RoaXMuUnQ9dGhpcy5TdD1udWxsO3RoaXMuR3E9dy5Qb2ludGVyRXZlbnQmJihjYnx8ZGJ8fGdiKSYmdy5uYXZpZ2F0b3ImJiExIT09dy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZDtxaSh0aGlzKTt0aGlzLnhpPW5ldyBGKCk7dGhpcy5Fcj0hMDt0aGlzLkRzPXJpO3RoaXMuV2I9ITE7dGhpcy5Gcz10Zzt0aGlzLk1hPW51bGw7c2kuYWRkKCJNb2RlbCIsdGkpO3RoaXMuYmE9dGhpcy5MYT10aGlzLlZiPW51bGw7dGhpcy5TcT0iIjt0aGlzLnFuPSJhdXRvIjt0aGlzLlJmPXRoaXMuU3I9dGhpcy5UZj10aGlzLlVmPXRoaXMuV2Y9dGhpcy5CZj10aGlzLkZmPXRoaXMuQWY9bnVsbDt0aGlzLnByPSExO3RoaXMuQ2Y9dGhpcy5nZz10aGlzLlZmPXRoaXMuU2Y9bnVsbDt0aGlzLmt1PSExO3RoaXMubnU9e307dGhpcy52bD1bbnVsbCxudWxsXTt0aGlzLks9bnVsbDt0aGlzLlF0PXRoaXMud3U9dGhpcy5DaD10aGlzLmVoPSExO3RoaXMuVmM9ITA7dGhpcy5taj10aGlzLlpiPSExO3RoaXMuJGI9bnVsbDt2YXIgZD10aGlzO3RoaXMud2c9ZnVuY3Rpb24oYSl7dmFyIGI9ZC5wYXJ0TWFuYWdlcjtpZihhLm1vZGVsPT09Yi5kaWFncmFtLm1vZGVsJiZiLmRpYWdyYW0uZGEpe2IuZGlhZ3JhbS5kYT0hMTt0cnl7dmFyIGM9YS5jaGFuZ2U7IiI9PT1hLm1vZGVsQ2hhbmdlJiZjPT09YWYmJmIudXBkYXRlRGF0YUJpbmRpbmdzKGEub2JqZWN0LGEucHJvcGVydHlOYW1lKTt9ZmluYWxseXtiLmRpYWdyYW0uZGE9ITA7fX19O3RoaXMuQ209ZnVuY3Rpb24oYSl7ZC5wYXJ0TWFuYWdlci5kb01vZGVsQ2hhbmdlZChhKTt9O3RoaXMuT3c9ITA7dGhpcy5mZT0tMjt0aGlzLkNqPW5ldyBMYigpO3RoaXMubXU9bmV3IEUoKTt0aGlzLkxmPSExO3RoaXMuRmg9dGhpcy5FaD10aGlzLnlxPXRoaXMuRGM9ITA7dGhpcy56cT0hMTt0aGlzLkZxPXRoaXMuRHE9dGhpcy5OaD10aGlzLk1oPXRoaXMuTGg9dGhpcy5LaD10aGlzLkloPXRoaXMuSmg9dGhpcy5IaD10aGlzLkNxPXRoaXMuUGg9dGhpcy5HaD10aGlzLk9oPXRoaXMuQXE9ITA7dGhpcy5oZT10aGlzLktjPSExO3RoaXMuRXE9dGhpcy5CcT10aGlzLnJyPXRoaXMucXI9ITA7dGhpcy5xcz10aGlzLm9zPTE2O3RoaXMudHU9dGhpcy5ucz0hMTt0aGlzLmZwPXRoaXMucHM9bnVsbDt0aGlzLnV1PXRoaXMudnU9MDt0aGlzLmViPW5ldyBJYyg1KS5mcmVlemUoKTt0aGlzLnRzPW5ldyBGKCkuZnJlZXplKCk7dGhpcy5Pcj05OTk5OTk5OTk7dGhpcy5zcj1uZXcgRigpLmZyZWV6ZSgpO3RoaXMuYmk9dGhpcy5raj10aGlzLk9nPSEwO3RoaXMuWmg9dGhpcy5OZz0hMTt0aGlzLmdjPW51bGw7dGhpcy56Zz0hMDt0aGlzLmdlPSExO3RoaXMud3E9bmV3IEYoKTt0aGlzLnp3PW5ldyBGKCk7dGhpcy5PYj1udWxsO3RoaXMuSG89MTt0aGlzLkl3PTA7dGhpcy53ZT17c2NhbGU6MSxwb3NpdGlvbjpuZXcgRygpLGJvdW5kczpuZXcgTigpLHF4OiExfTt0aGlzLk53PW5ldyBOKE5hTixOYU4sTmFOLE5hTikuZnJlZXplKCk7dGhpcy5FcD1uZXcgSyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLnZuPW5ldyBOKE5hTixOYU4sTmFOLE5hTikuZnJlZXplKCk7dGhpcy5Gcj0hMTt0aGlzLmNyPW51bGw7dWkodGhpcyk7dGhpcy5Lcj10aGlzLm1yPXRoaXMuWXI9dGhpcy5ydz10aGlzLnF3PXRoaXMuc3c9dGhpcy5TZz10aGlzLlloPXRoaXMuWGY9bnVsbDt2aSh0aGlzKTt0aGlzLkViPW51bGw7dGhpcy5scj0hMTt0aGlzLkprPW51bGw7dGhpcy5wYXJ0TWFuYWdlcj1uZXcgdGkoKTt0aGlzLnRvb2xNYW5hZ2VyPW5ldyBVYSgpO3RoaXMudG9vbE1hbmFnZXIuaW5pdGlhbGl6ZVN0YW5kYXJkVG9vbHMoKTt0aGlzLmN1cnJlbnRUb29sPXRoaXMuZGVmYXVsdFRvb2w9dGhpcy50b29sTWFuYWdlcjt0aGlzLmJyPW51bGw7dGhpcy5Maz1uZXcgeWYoKTt0aGlzLmNzPXRoaXMuYnM9bnVsbDt0aGlzLnZwPSExO3RoaXMuY29tbWFuZEhhbmRsZXI9d2koKTt0aGlzLm1vZGVsPXhpKCk7dGhpcy5laD0hMDt0aGlzLmxheW91dD1uZXcgeWkoKTt0aGlzLmVoPSExO3RoaXMudXc9dGhpcy5VdD1udWxsO3RoaXMuTmI9MTt0aGlzLmpoPW51bGw7dGhpcy5Ucj0wO3RoaXMuVXI9WzAsMCwwLDAsMF07dGhpcy5Wcj0wO3RoaXMuRmQ9MTt0aGlzLmtsPTA7dGhpcy5Icj1uZXcgRygpO3RoaXMuQnU9NTAwO3RoaXMuSHE9bmV3IEcoKTt0aGlzLlFlPSExO3RoaXMucHJldmVudERlZmF1bHQ9dGhpcy5vdD10aGlzLmttPXRoaXMubG09dGhpcy5qbT10aGlzLmltPXRoaXMuams9dGhpcy5saz10aGlzLmtrPXRoaXMuaGs9dGhpcy5paz10aGlzLlp2PXRoaXMuUnY9dGhpcy5Tdj10aGlzLlR2PXRoaXMucGk9dGhpcy4kbz10aGlzLm9pPXRoaXMuWm89bnVsbDt0aGlzLnU9ITE7dGhpcy4kaD1uZXcgemkoKTt0aGlzLkFzPSExO3ZvaWQgMCE9PWEmJkFpKHRoaXMsYSk7dGhpcy5vYj0hMTt9UC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLm1vZGVsLmNsZWFyKCk7Qmk9bnVsbDtDaT0iIjtEaSh0aGlzLCExKTt0aGlzLnZuPW5ldyBOKE5hTixOYU4sTmFOLE5hTikuZnJlZXplKCk7dGhpcy5SKCk7fTtmdW5jdGlvbiBEaShhLGIpe3ZhciBjPW51bGw7bnVsbCE9PWEuRWImJihjPWEuRWIucGFydCk7YS5hbmltYXRpb25NYW5hZ2VyLnZkKCk7Zm9yKHZhciBkPVtdLGU9YS5QYS5sZW5ndGgsZj0wO2Y8ZTtmKyspe3ZhciBnPWEuUGEualtmXTtpZihiKWZvcih2YXIgaD1nLnBhcnRzO2gubmV4dCgpOyl7dmFyIGs9aC52YWx1ZTtrIT09YyYmbnVsbD09PWsuZGF0YSYmZC5wdXNoKGspO31nLmNsZWFyKCk7fWEucGFydE1hbmFnZXIuY2xlYXIoKTthLkRkLmNsZWFyKCk7YS5XaC5jbGVhcigpO2EueGkuY2xlYXIoKTthLnRzLmhhKCk7YS50cy5jbGVhcigpO2EudHMuZnJlZXplKCk7YS5zci5oYSgpO2Euc3IuY2xlYXIoKTthLnNyLmZyZWV6ZSgpO2EuSms9bnVsbDtMYT1bXTtudWxsIT09YyYmKGEuYWRkKGMpLGEucGFydE1hbmFnZXIucGFydHMucmVtb3ZlKGMpKTtpZihiKWZvcihiPTA7YjxkLmxlbmd0aDtiKyspe2EuYWRkKGRbYl0pO319ZnVuY3Rpb24gd2koKXtyZXR1cm4gbnVsbDt9UC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLm9iPSEwO3RoaXMuY2xlYXIoKTt0aGlzLnlrPW5ldyBPaCgpO3RoaXMueWsuaGIodGhpcyk7dGhpcy5QYT1uZXcgRSgpO3RoaXMuRHYoKTt0aGlzLkN2KCk7dGhpcy5zYT1uZXcgRyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLkNhPTE7dGhpcy51cj1uZXcgRyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLnZyPU5hTjt0aGlzLlByPTFFLTQ7dGhpcy5Ocj0xMDA7dGhpcy5Jcz1uZXcgRyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLmpyPW5ldyBOKE5hTixOYU4sTmFOLE5hTikuZnJlZXplKCk7dGhpcy5yaT1uZXcgSWMoMCwwLDAsMCkuZnJlZXplKCk7dGhpcy5Haj1vaTt0aGlzLnJzPSExO3RoaXMubXM9dGhpcy5ocz1udWxsO3RoaXMuYWo9cGk7dGhpcy5jaj1FZDt0aGlzLmFpPXBpO3RoaXMuT249RWQ7dGhpcy53cj10aGlzLnRyPVRjO3RoaXMuVG09MjUwO3RoaXMuVW09bmV3IEljKDE2LDE2LDE2LDE2KS5mcmVlemUoKTt0aGlzLkVyPSEwO3RoaXMuRHM9cmk7dGhpcy5Gcz10Zzt0aGlzLnFuPSJhdXRvIjt0aGlzLlJmPXRoaXMuU3I9dGhpcy5UZj10aGlzLlVmPXRoaXMuV2Y9dGhpcy5CZj10aGlzLkZmPXRoaXMuQWY9bnVsbDt0aGlzLnByPSExO3RoaXMuQ2Y9dGhpcy5nZz10aGlzLlZmPXRoaXMuU2Y9bnVsbDt0aGlzLkxmPSExO3RoaXMuRmg9dGhpcy5FaD10aGlzLnlxPXRoaXMuRGM9ITA7dGhpcy56cT0hMTt0aGlzLkVxPXRoaXMuQnE9dGhpcy5ycj10aGlzLnFyPXRoaXMuRnE9dGhpcy5EcT10aGlzLk5oPXRoaXMuTWg9dGhpcy5MaD10aGlzLktoPXRoaXMuSWg9dGhpcy5KaD10aGlzLkhoPXRoaXMuQ3E9dGhpcy5QaD10aGlzLkdoPXRoaXMuT2g9dGhpcy5BcT0hMDt0aGlzLnFzPXRoaXMub3M9MTY7dGhpcy5lYj1uZXcgSWMoNSkuZnJlZXplKCk7dGhpcy5Pcj05OTk5OTk5OTk7dGhpcy5nYz1udWxsO3RoaXMuRnI9ITE7dGhpcy5OYj0xO3RoaXMuamg9bnVsbDt0aGlzLlRyPTA7dGhpcy5Vcj1bMCwwLDAsMCwwXTt0aGlzLlZyPTA7dmkodGhpcyk7dGhpcy5FYj1udWxsO3RoaXMucGFydE1hbmFnZXI9bmV3IHRpKCk7dGhpcy50b29sTWFuYWdlcj1uZXcgVWEoKTt0aGlzLnRvb2xNYW5hZ2VyLmluaXRpYWxpemVTdGFuZGFyZFRvb2xzKCk7dGhpcy5jcz10aGlzLmJzPXRoaXMuYnI9bnVsbDt0aGlzLnZwPSExO3RoaXMuTGsucmVzZXQoKTt0aGlzLnB1PW5ldyBMYigpO3RoaXMucHUuY2xlYXIoKTt0aGlzLmN1cnJlbnRUb29sPXRoaXMuZGVmYXVsdFRvb2w9dGhpcy50b29sTWFuYWdlcjt0aGlzLmNvbW1hbmRIYW5kbGVyPXdpKCk7dGhpcy5laD0hMDt1aSh0aGlzKTt0aGlzLmxheW91dD1uZXcgeWkoKTt0aGlzLmVoPSExO3RoaXMubW9kZWw9eGkoKTt0aGlzLm1vZGVsLnVuZG9NYW5hZ2VyPW5ldyBmZigpO3RoaXMuZ2U9ITE7dGhpcy5Yaz0hMDt0aGlzLm9iPXRoaXMucWQ9ITE7dGhpcy5SKCk7dGhpcy5uZT10aGlzLnpmPW51bGw7cWkodGhpcyk7dGhpcy5TcT0iIjt9O2Z1bmN0aW9uIHZpKGEpe2EuWGY9bmV3IExiKCk7dmFyIGI9bmV3IFYoKSxjPW5ldyB2aCgpO2MuYmluZChuZXcgSGkoInRleHQiLCIiLFFhKSk7Yi5hZGQoYyk7YS5zdz1iO2EuWGYuYWRkKCIiLGIpO2I9bmV3IFYoKTtjPW5ldyB2aCgpO2Muc3Ryb2tlPSJicm93biI7Yy5iaW5kKG5ldyBIaSgidGV4dCIsIiIsUWEpKTtiLmFkZChjKTthLlhmLmFkZCgiQ29tbWVudCIsYik7Yj1uZXcgVigpO2Iuc2VsZWN0YWJsZT0hMTtiLmF2b2lkYWJsZT0hMTtjPW5ldyBXKCk7Yy5maWd1cmU9IkVsbGlwc2UiO2MuZmlsbD0iYmxhY2siO2Muc3Ryb2tlPW51bGw7Yy5kZXNpcmVkU2l6ZT1uZXcgSygzLDMpLmdhKCk7Yi5hZGQoYyk7YS5YZi5hZGQoIkxpbmtMYWJlbCIsYik7YS5ZaD1uZXcgTGIoKTtiPW5ldyBpZygpO2Iuc2VsZWN0aW9uT2JqZWN0TmFtZT0iR1JPVVBQQU5FTCI7Yi50eXBlPVguVmVydGljYWw7Yz1uZXcgdmgoKTtjLmZvbnQ9ImJvbGQgMTJwdCBzYW5zLXNlcmlmIjtjLmJpbmQobmV3IEhpKCJ0ZXh0IiwiIixRYSkpO2IuYWRkKGMpO2M9bmV3IFgoWC5BdXRvKTtjLm5hbWU9IkdST1VQUEFORUwiO3ZhciBkPW5ldyBXKCk7ZC5maWd1cmU9IlJlY3RhbmdsZSI7ZC5maWxsPSJyZ2JhKDEyOCwxMjgsMTI4LDAuMikiO2Quc3Ryb2tlPSJibGFjayI7Yy5hZGQoZCk7ZD1uZXcgWGcoKTtkLnBhZGRpbmc9bmV3IEljKDUsNSw1LDUpLmdhKCk7Yy5hZGQoZCk7Yi5hZGQoYyk7YS5xdz1iO2EuWWguYWRkKCIiLGIpO2EuU2c9bmV3IExiKCk7Yj1uZXcgUygpO2M9bmV3IFcoKTtjLmlzUGFuZWxNYWluPSEwO2IuYWRkKGMpO2M9bmV3IFcoKTtjLnRvQXJyb3c9IlN0YW5kYXJkIjtjLmZpbGw9ImJsYWNrIjtjLnN0cm9rZT1udWxsO2Muc3Ryb2tlV2lkdGg9MDtiLmFkZChjKTthLnJ3PWI7YS5TZy5hZGQoIiIsYik7Yj1uZXcgUygpO2M9bmV3IFcoKTtjLmlzUGFuZWxNYWluPSEwO2Muc3Ryb2tlPSJicm93biI7Yi5hZGQoYyk7YS5TZy5hZGQoIkNvbW1lbnQiLGIpO2I9bmV3IHBmKCk7Yi50eXBlPVguQXV0bztjPW5ldyBXKCk7Yy5maWxsPW51bGw7Yy5zdHJva2U9ImRvZGdlcmJsdWUiO2Muc3Ryb2tlV2lkdGg9MztiLmFkZChjKTtjPW5ldyBYZygpO2MubWFyZ2luPW5ldyBJYygxLjUsMS41LDEuNSwxLjUpLmdhKCk7Yi5hZGQoYyk7YS5Zcj1iO2EubXI9YjtiPW5ldyBwZigpO2IudHlwZT1YLkxpbms7Yz1uZXcgVygpO2MuaXNQYW5lbE1haW49ITA7Yy5maWxsPW51bGw7Yy5zdHJva2U9ImRvZGdlcmJsdWUiO2Muc3Ryb2tlV2lkdGg9MztiLmFkZChjKTthLktyPWI7fVAucHJvdG90eXBlLnNldFJUTD1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/dGhpcy5kaXY6YTtudWxsPT09YSYmKGE9dy5kb2N1bWVudC5ib2R5KTt2YXIgYj12YSgiZGl2Iik7Yi5kaXI9InJ0bCI7Yi5zdHlsZS5jc3NUZXh0PSJmb250LXNpemU6IDE0cHg7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMDBweDsgb3ZlcmZsb3c6IHNjcm9sbDsiO2IudGV4dENvbnRlbnQ9IkEiO2EuYXBwZW5kQ2hpbGQoYik7dmFyIGM9InJldmVyc2UiOzA8Yi5zY3JvbGxMZWZ0P2M9ImRlZmF1bHQiOihiLnNjcm9sbExlZnQ9MSwwPT09Yi5zY3JvbGxMZWZ0JiYoYz0ibmVnYXRpdmUiKSk7YS5yZW1vdmVDaGlsZChiKTt0aGlzLnJ1PWM7fTtQLnByb3RvdHlwZS5zZXRTY3JvbGxXaWR0aD1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/dGhpcy5kaXY6YTtudWxsPT09YSYmKGE9dy5kb2N1bWVudC5ib2R5KTt2YXIgYj0wO2lmKHRoKXt2YXIgYz1JaTtiPUppO251bGw9PT1jJiYoYz1JaT12YSgicCIpLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuaGVpZ2h0PSIyMDBweCIsYy5zdHlsZS5ib3hTaXppbmc9ImNvbnRlbnQtYm94IixiPUppPXZhKCJkaXYiKSxiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLGIuc3R5bGUud2lkdGg9IjIwMHB4IixiLnN0eWxlLmhlaWdodD0iMTUwcHgiLGIuc3R5bGUuYm94U2l6aW5nPSJjb250ZW50LWJveCIsYi5hcHBlbmRDaGlsZChjKSk7Yi5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjthLmFwcGVuZENoaWxkKGIpO3ZhciBkPWMub2Zmc2V0V2lkdGg7Yi5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIjtjPWMub2Zmc2V0V2lkdGg7ZD09PWMmJihjPWIuY2xpZW50V2lkdGgpO2EucmVtb3ZlQ2hpbGQoYik7Yj1kLWM7MCE9PWJ8fGxifHwoYj0xMSk7fXRoaXMuR2I9Yjt9O1AucHJvdG90eXBlLmZiPWZ1bmN0aW9uKGEpe2EuY2xhc3NUeXBlPT09UCYmKHRoaXMuYXV0b1NjYWxlPWEpO307UC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9MCk7dmFyIGI9IiI7dGhpcy5kaXYmJnRoaXMuZGl2LmlkJiYoYj10aGlzLmRpdi5pZCk7Yj0nRGlhZ3JhbSAiJytiKyciJztpZigwPj1hKXJldHVybiBiO2Zvcih2YXIgYz10aGlzLlBhLml0ZXJhdG9yO2MubmV4dCgpOyl7Yis9IlxuICAiK2MudmFsdWUudG9TdHJpbmcoYS0xKTt9cmV0dXJuIGI7fTtQLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsZCk7fTtQLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsZCk7fTtmdW5jdGlvbiBLaShhKXt2YXIgYj1hLkRhLkdhO2IgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCYmKGEuR3E/KGEuYWRkRXZlbnRMaXN0ZW5lcihiLCJwb2ludGVyZG93biIsYS5pbSwhMSksYS5hZGRFdmVudExpc3RlbmVyKGIsInBvaW50ZXJtb3ZlIixhLmptLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYiwicG9pbnRlcnVwIixhLmxtLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYiwicG9pbnRlcm91dCIsYS5rbSwhMSkpOihhLmFkZEV2ZW50TGlzdGVuZXIoYiwidG91Y2hzdGFydCIsYS5UdiwhMSksYS5hZGRFdmVudExpc3RlbmVyKGIsInRvdWNobW92ZSIsYS5TdiwhMSksYS5hZGRFdmVudExpc3RlbmVyKGIsInRvdWNoZW5kIixhLlJ2LCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYiwibW91c2Vtb3ZlIixhLmlrLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYiwibW91c2Vkb3duIixhLmhrLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYiwibW91c2V1cCIsYS5raywhMSksYS5hZGRFdmVudExpc3RlbmVyKGIsIm1vdXNlb3V0IixhLmprLCExKSksYS5hZGRFdmVudExpc3RlbmVyKGIsIm1vdXNlZW50ZXIiLGEuRnksITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLCJtb3VzZWxlYXZlIixhLkd5LCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYiwid2hlZWwiLGEubGssITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLCJrZXlkb3duIixhLnZ6LCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYiwia2V5dXAiLGEud3osITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLCJibHVyIixhLnN5LCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYiwiZm9jdXMiLGEudHksITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLCJzZWxlY3RzdGFydCIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiExO30sITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLCJjb250ZXh0bWVudSIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiExO30sITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLCJnZXN0dXJlc3RhcnQiLGZ1bmN0aW9uKGIpe2EudG9vbE1hbmFnZXIuZ2VzdHVyZUJlaGF2aW9yIT09c2YmJihhLnRvb2xNYW5hZ2VyLmdlc3R1cmVCZWhhdmlvcj09PXJmP2IucHJldmVudERlZmF1bHQoKTphLlFlJiZhLmxhc3RJbnB1dC5oYW5kbGVkfHwoYi5wcmV2ZW50RGVmYXVsdCgpLGEuSG89YS5zY2FsZSxhLmN1cnJlbnRUb29sLmRvQ2FuY2VsKCkpKTt9LCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYiwiZ2VzdHVyZWNoYW5nZSIsZnVuY3Rpb24oYil7aWYoYS50b29sTWFuYWdlci5nZXN0dXJlQmVoYXZpb3IhPT1zZilpZihhLnRvb2xNYW5hZ2VyLmdlc3R1cmVCZWhhdmlvcj09PXJmKWIucHJldmVudERlZmF1bHQoKTtlbHNlIGlmKCFhLlFlfHwhYS5sYXN0SW5wdXQuaGFuZGxlZCl7Yi5wcmV2ZW50RGVmYXVsdCgpO3ZhciBjPWIuc2NhbGU7aWYobnVsbCE9PWEuSG8pe3ZhciBlPWEuRGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Yj1uZXcgRyhiLnBhZ2VYLXdpbmRvdy5zY3JvbGxYLWEueGEvZS53aWR0aCplLmxlZnQsYi5wYWdlWS13aW5kb3cuc2Nyb2xsWS1hLndhL2UuaGVpZ2h0KmUudG9wKTtjPWEuSG8qYztlPWEuY29tbWFuZEhhbmRsZXI7aWYoYyE9PWEuc2NhbGUmJmUuY2FuUmVzZXRab29tKGMpKXt2YXIgZj1hLnpvb21Qb2ludDthLnpvb21Qb2ludD1iO2UucmVzZXRab29tKGMpO2Euem9vbVBvaW50PWY7fX19fSwhMSksYS5hZGRFdmVudExpc3RlbmVyKHcsInJlc2l6ZSIsYS5adiwhMSkpO31mdW5jdGlvbiBLZihhKXszMDxhLlRyJiYoYS5qaD0xKTt9ZnVuY3Rpb24gVWYoYSxiKXtudWxsIT09YS5qaCYmKGEuamg9bnVsbCxiJiZhLm90KCkpO31QLnByb3RvdHlwZS5jb21wdXRlUGl4ZWxSYXRpbz1mdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5qaD90aGlzLmpoOncuZGV2aWNlUGl4ZWxSYXRpb3x8MTt9O1AucHJvdG90eXBlLmRvTW91c2VNb3ZlPWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50VG9vbC5kb01vdXNlTW92ZSgpO307UC5wcm90b3R5cGUuZG9Nb3VzZURvd249ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRUb29sLmRvTW91c2VEb3duKCk7fTtQLnByb3RvdHlwZS5kb01vdXNlVXA9ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRUb29sLmRvTW91c2VVcCgpO307UC5wcm90b3R5cGUuZG9Nb3VzZVdoZWVsPWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50VG9vbC5kb01vdXNlV2hlZWwoKTt9O1AucHJvdG90eXBlLmRvS2V5RG93bj1mdW5jdGlvbigpe3RoaXMuY3VycmVudFRvb2wuZG9LZXlEb3duKCk7fTtQLnByb3RvdHlwZS5kb0tleVVwPWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50VG9vbC5kb0tleVVwKCk7fTtQLnByb3RvdHlwZS5kb0ZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5mb2N1cygpO307UC5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24oKXtpZih0aGlzLkRhKWlmKHRoaXMuc2Nyb2xsc1BhZ2VPbkZvY3VzKXRoaXMuRGEuZm9jdXMoKTtlbHNle3ZhciBhPXcuc2Nyb2xsWHx8dy5wYWdlWE9mZnNldCxiPXcuc2Nyb2xsWXx8dy5wYWdlWU9mZnNldDt0aGlzLkRhLmZvY3VzKCk7dy5zY3JvbGxUbyhhLGIpO319O1AucHJvdG90eXBlLnR5PWZ1bmN0aW9uKCl7dGhpcy5DLmFhKCJHYWluZWRGb2N1cyIpO307UC5wcm90b3R5cGUuc3k9ZnVuY3Rpb24oKXt0aGlzLkMuYWEoIkxvc3RGb2N1cyIpO307ZnVuY3Rpb24gVGgoYSl7aWYobnVsbCE9PWEuRGEpe3ZhciBiPWEuSWE7aWYoMCE9PWIuY2xpZW50V2lkdGgmJjAhPT1iLmNsaWVudEhlaWdodCl7YS5zZXRTY3JvbGxXaWR0aCgpO3ZhciBjPWEuWmg/YS5HYjowLGQ9YS5OZz9hLkdiOjAsZT1hLk5iO2EuTmI9YS5jb21wdXRlUGl4ZWxSYXRpbygpO2EuTmIhPT1lJiYoYS5Qbj0hMCxhLmNjKCkpO2lmKGIuY2xpZW50V2lkdGghPT1hLnhhK2N8fGIuY2xpZW50SGVpZ2h0IT09YS53YStkKWEua2o9ITAsYS5uYz0hMCxiPWEubGF5b3V0LG51bGwhPT1iJiZiLmlzVmlld3BvcnRTaXplZCYmYS5hdXRvU2NhbGU9PT1waSYmKGEuUms9ITAsYi5CKCkpLGEuWmJ8fGEuY2MoKTt9fX1mdW5jdGlvbiB1aShhKXt2YXIgYj1uZXcgZmkoKTtiLm5hbWU9IkJhY2tncm91bmQiO2EuUWwoYik7Yj1uZXcgZmkoKTtiLm5hbWU9IiI7YS5RbChiKTtiPW5ldyBmaSgpO2IubmFtZT0iRm9yZWdyb3VuZCI7YS5RbChiKTtiPW5ldyBmaSgpO2IubmFtZT0iQWRvcm5tZW50IjtiLmlzVGVtcG9yYXJ5PSEwO2EuUWwoYik7Yj1uZXcgZmkoKTtiLm5hbWU9IlRvb2wiO2IuaXNUZW1wb3Jhcnk9ITA7Yi5pc0JvdW5kc0luY2x1ZGVkPSEwO2EuUWwoYik7Yj1uZXcgZmkoKTtiLm5hbWU9IkdyaWQiO2IuYWxsb3dTZWxlY3Q9ITE7Yi5waWNrYWJsZT0hMTtiLmlzVGVtcG9yYXJ5PSEwO2EuUncoYixhLlpsKCJCYWNrZ3JvdW5kIikpO31mdW5jdGlvbiBMaShhKXthLkViPW5ldyBYKFguR3JpZCk7YS5FYi5uYW1lPSJHUklEIjt2YXIgYj1uZXcgVygpO2IuZmlndXJlPSJMaW5lSCI7Yi5zdHJva2U9ImxpZ2h0Z3JheSI7Yi5zdHJva2VXaWR0aD0uNTtiLmludGVydmFsPTE7YS5FYi5hZGQoYik7Yj1uZXcgVygpO2IuZmlndXJlPSJMaW5lSCI7Yi5zdHJva2U9ImdyYXkiO2Iuc3Ryb2tlV2lkdGg9LjU7Yi5pbnRlcnZhbD01O2EuRWIuYWRkKGIpO2I9bmV3IFcoKTtiLmZpZ3VyZT0iTGluZUgiO2Iuc3Ryb2tlPSJncmF5IjtiLnN0cm9rZVdpZHRoPTE7Yi5pbnRlcnZhbD0xMDthLkViLmFkZChiKTtiPW5ldyBXKCk7Yi5maWd1cmU9IkxpbmVWIjtiLnN0cm9rZT0ibGlnaHRncmF5IjtiLnN0cm9rZVdpZHRoPS41O2IuaW50ZXJ2YWw9MTthLkViLmFkZChiKTtiPW5ldyBXKCk7Yi5maWd1cmU9IkxpbmVWIjtiLnN0cm9rZT0iZ3JheSI7Yi5zdHJva2VXaWR0aD0uNTtiLmludGVydmFsPTU7YS5FYi5hZGQoYik7Yj1uZXcgVygpO2IuZmlndXJlPSJMaW5lViI7Yi5zdHJva2U9ImdyYXkiO2Iuc3Ryb2tlV2lkdGg9MTtiLmludGVydmFsPTEwO2EuRWIuYWRkKGIpO2I9bmV3IFQoKTtiLmFkZChhLkViKTtiLmxheWVyTmFtZT0iR3JpZCI7Yi56T3JkZXI9MDtiLmlzSW5Eb2N1bWVudEJvdW5kcz0hMTtiLmlzQW5pbWF0ZWQ9ITE7Yi5waWNrYWJsZT0hMTtiLmxvY2F0aW9uT2JqZWN0TmFtZT0iR1JJRCI7YS5hZGQoYik7YS5wYXJ0TWFuYWdlci5wYXJ0cy5yZW1vdmUoYik7YS5FYi52aXNpYmxlPSExO31mdW5jdGlvbiBNaSgpe3RoaXMuQy50dT90aGlzLkMudHU9ITE6dGhpcy5DLmlzRW5hYmxlZD90aGlzLkMuYngodGhpcyk6TmkodGhpcy5DKTt9ZnVuY3Rpb24gT2koYSl7dGhpcy5DLmlzRW5hYmxlZD8odGhpcy5DLnZ1PWEudGFyZ2V0LnNjcm9sbFRvcCx0aGlzLkMudXU9YS50YXJnZXQuc2Nyb2xsTGVmdCk6TmkodGhpcy5DKTt9UC5wcm90b3R5cGUuYng9ZnVuY3Rpb24oYSl7aWYobnVsbCE9PXRoaXMuRGEpe3RoaXMubnM9ITA7dmFyIGI9dGhpcy5kb2N1bWVudEJvdW5kcyxjPXRoaXMudmlld3BvcnRCb3VuZHMsZD10aGlzLnJpLGU9Yi54LWQubGVmdCxmPWIueS1kLnRvcCxnPWIud2lkdGgrZC5sZWZ0K2QucmlnaHQsaD1iLmhlaWdodCtkLnRvcCtkLmJvdHRvbSxrPWIucmlnaHQrZC5yaWdodDtkPWIuYm90dG9tK2QuYm90dG9tO3ZhciBsPWMueDtiPWMueTt2YXIgbT1jLndpZHRoLG49Yy5oZWlnaHQscD1jLnJpZ2h0LHE9Yy5ib3R0b207Yz10aGlzLnNjYWxlO3ZhciByPWEuc2Nyb2xsTGVmdDtpZih0aGlzLlRuKXN3aXRjaCh0aGlzLnJ1KXtjYXNlIm5lZ2F0aXZlIjpyPXIrYS5zY3JvbGxXaWR0aC1hLmNsaWVudFdpZHRoO2JyZWFrO2Nhc2UicmV2ZXJzZSI6cj1hLnNjcm9sbFdpZHRoLXItYS5jbGllbnRXaWR0aDt9dmFyIHU9cjttPGd8fG48aD8ocj1HLmFsbG9jQXQodGhpcy5wb3NpdGlvbi54LHRoaXMucG9zaXRpb24ueSksdGhpcy5hbGxvd0hvcml6b250YWxTY3JvbGwmJnRoaXMudXUhPT11JiYoci54PXUvYytlLHRoaXMudXU9dSksdGhpcy5hbGxvd1ZlcnRpY2FsU2Nyb2xsJiZ0aGlzLnZ1IT09YS5zY3JvbGxUb3AmJihyLnk9YS5zY3JvbGxUb3AvYytmLHRoaXMudnU9YS5zY3JvbGxUb3ApLHRoaXMucG9zaXRpb249cixHLmZyZWUociksdGhpcy5raj10aGlzLm5zPSExKToocj1HLmFsbG9jKCksYS5ZeCYmdGhpcy5hbGxvd0hvcml6b250YWxTY3JvbGwmJihlPGwmJih0aGlzLnBvc2l0aW9uPXIuaCh1K2UsdGhpcy5wb3NpdGlvbi55KSksaz5wJiYodGhpcy5wb3NpdGlvbj1yLmgoLSh0aGlzLnBzLnNjcm9sbFdpZHRoLXRoaXMueGEpK3UtdGhpcy54YS9jK2ssdGhpcy5wb3NpdGlvbi55KSkpLGEuWngmJnRoaXMuYWxsb3dWZXJ0aWNhbFNjcm9sbCYmKGY8YiYmKHRoaXMucG9zaXRpb249ci5oKHRoaXMucG9zaXRpb24ueCxhLnNjcm9sbFRvcCtmKSksZD5xJiYodGhpcy5wb3NpdGlvbj1yLmgodGhpcy5wb3NpdGlvbi54LC0odGhpcy5wcy5zY3JvbGxIZWlnaHQtdGhpcy53YSkrYS5zY3JvbGxUb3AtdGhpcy53YS9jK2QpKSksRy5mcmVlKHIpLFBpKHRoaXMpLHRoaXMua2o9dGhpcy5ucz0hMSxiPXRoaXMuZG9jdW1lbnRCb3VuZHMsYz10aGlzLnZpZXdwb3J0Qm91bmRzLGs9Yi5yaWdodCxwPWMucmlnaHQsZD1iLmJvdHRvbSxxPWMuYm90dG9tLGU9Yi54LGw9Yy54LGY9Yi55LGI9Yy55LG0+PWcmJmU+PWwmJms8PXAmJih0aGlzLmZwLnN0eWxlLndpZHRoPSIxcHgiKSxuPj1oJiZmPj1iJiZkPD1xJiYodGhpcy5mcC5zdHlsZS5oZWlnaHQ9IjFweCIpKTt9fTtQLnByb3RvdHlwZS5jb21wdXRlQm91bmRzPWZ1bmN0aW9uKCl7MDx0aGlzLkRkLmNvdW50JiZRaSh0aGlzKTtyZXR1cm4gUmkodGhpcyk7fTtmdW5jdGlvbiBSaShhKXtpZihhLmZpeGVkQm91bmRzLm8oKSl7dmFyIGI9YS5maXhlZEJvdW5kcy5jb3B5KCk7Yi5McChhLmViKTtyZXR1cm4gYjt9Zm9yKHZhciBjPSEwLGQ9YS5QYS5qLGU9ZC5sZW5ndGgsZj0wO2Y8ZTtmKyspe3ZhciBnPWRbZl07aWYoZy52aXNpYmxlJiYoIWcuaXNUZW1wb3Jhcnl8fGcuaXNCb3VuZHNJbmNsdWRlZCkpe2c9Zy5GYS5qO2Zvcih2YXIgaD1nLmxlbmd0aCxrPTA7azxoO2srKyl7dmFyIGw9Z1trXTtsLmlzSW5Eb2N1bWVudEJvdW5kcyYmbC5pc1Zpc2libGUoKSYmKGw9bC5hY3R1YWxCb3VuZHMsbC5vKCkmJihjPyhjPSExLGI9bC5jb3B5KCkpOmIuSmMobCkpKTt9fX1jJiYoYj1uZXcgTigwLDAsMCwwKSk7Yi5McChhLmViKTtyZXR1cm4gYjt9UC5wcm90b3R5cGUuY29tcHV0ZVBhcnRzQm91bmRzPWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9ITEpO3ZhciBjPW51bGw7aWYoRWEoYSkpZm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWFbZF07IWImJmUgaW5zdGFuY2VvZiBTfHwoZS5hYygpLG51bGw9PT1jP2M9ZS5hY3R1YWxCb3VuZHMuY29weSgpOmMuSmMoZS5hY3R1YWxCb3VuZHMpKTt9ZWxzZSBmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7ZD1hLnZhbHVlLCFiJiZkIGluc3RhbmNlb2YgU3x8KGQuYWMoKSxudWxsPT09Yz9jPWQuYWN0dWFsQm91bmRzLmNvcHkoKTpjLkpjKGQuYWN0dWFsQm91bmRzKSk7fXJldHVybiBudWxsPT09Yz9uZXcgTihOYU4sTmFOLDAsMCk6Yzt9O2Z1bmN0aW9uIFNpKGEsYil7aWYoKGJ8fGEuZ2UpJiYhYS5vYiYmbnVsbCE9PWEuRGEmJiFhLmFuaW1hdGlvbk1hbmFnZXIuaXNBbmltYXRpbmcmJmEuZG9jdW1lbnRCb3VuZHMubygpKXthLm9iPSEwO3ZhciBjPWEuYWo7YiYmYS5haSE9PXBpJiYoYz1hLmFpKTt2YXIgZD1jIT09cGk/VGkoYSxjKTphLnNjYWxlO2M9YS52aWV3cG9ydEJvdW5kcy5jb3B5KCk7dmFyIGU9YS54YS9kLGY9YS53YS9kLGc9bnVsbCxoPWEuYW5pbWF0aW9uTWFuYWdlcjtoLnJiJiYoZz1hLnNhLmNvcHkoKSk7dmFyIGs9YS5jaixsPWEuT247YiYmIWsuZ2IoKSYmKGwuZ2IoKXx8bC5LYigpKSYmKGs9bC5LYigpP2RkOmwpO1VpKGEsYS5kb2N1bWVudEJvdW5kcyxlLGYsayxiKTtudWxsIT09ZyYmZGkoaCxnLGEuc2EpO2I9YS5zY2FsZTthLnNjYWxlPWQ7YS5vYj0hMTtkPWEudmlld3BvcnRCb3VuZHM7ZC5RYShjKXx8YS5pcShjLGQsYiwhMSk7fX1mdW5jdGlvbiBUaShhLGIpe3ZhciBjPWEuWnE7aWYobnVsbD09PWEuRGEpcmV0dXJuIGM7YS5PZyYmVmkoYSxhLmNvbXB1dGVCb3VuZHMoKSk7dmFyIGQ9YS5kb2N1bWVudEJvdW5kcztpZighZC5vKCkpcmV0dXJuIGM7dmFyIGU9ZC53aWR0aDtkPWQuaGVpZ2h0O3ZhciBmPWEueGEsZz1hLndhLGg9Zi9lLGs9Zy9kO3JldHVybiBiPT09V2k/KGI9TWF0aC5taW4oayxoKSxiPmMmJihiPWMpLGI8YS5taW5TY2FsZSYmKGI9YS5taW5TY2FsZSksYj5hLm1heFNjYWxlJiYoYj1hLm1heFNjYWxlKSxiKTpiPT09WGk/KGI9az5oPyhnLWEuR2IpL2Q6KGYtYS5HYikvZSxiPmMmJihiPWMpLGI8YS5taW5TY2FsZSYmKGI9YS5taW5TY2FsZSksYj5hLm1heFNjYWxlJiYoYj1hLm1heFNjYWxlKSxiKTphLnNjYWxlO31QLnByb3RvdHlwZS56b29tVG9GaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdqO3RoaXMuR2o9b2k7dGhpcy5zY2FsZT1UaSh0aGlzLFdpKTthIT09b2kmJihTaSh0aGlzLCExKSxVaSh0aGlzLHRoaXMuZG9jdW1lbnRCb3VuZHMsdGhpcy54YS90aGlzLkNhLHRoaXMud2EvdGhpcy5DYSx0aGlzLmNqLCExKSk7dGhpcy5Haj1hO307dD1QLnByb3RvdHlwZTt0LmFBPWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9V2kpO3ZhciBjPWEud2lkdGgsZD1hLmhlaWdodDtpZighKDA9PT1jfHwwPT09ZHx8aXNOYU4oYykmJmlzTmFOKGQpKSl7dmFyIGU9MTtpZihiPT09V2l8fGI9PT1YaSlpZihpc05hTihjKSllPXRoaXMudmlld3BvcnRCb3VuZHMuaGVpZ2h0KnRoaXMuc2NhbGUvZDtlbHNlIGlmKGlzTmFOKGQpKWU9dGhpcy52aWV3cG9ydEJvdW5kcy53aWR0aCp0aGlzLnNjYWxlL2M7ZWxzZXtlPXRoaXMueGE7dmFyIGY9dGhpcy53YTtlPWI9PT1YaT9mL2Q+ZS9jPyhmLSh0aGlzLk5nP3RoaXMuR2I6MCkpL2Q6KGUtKHRoaXMuWmg/dGhpcy5HYjowKSkvYzpNYXRoLm1pbihmL2QsZS9jKTt9dGhpcy5zY2FsZT1lO3RoaXMucG9zaXRpb249bmV3IEcoYS54LGEueSk7fX07dC5teT1mdW5jdGlvbihhLGIpe3RoaXMuT2cmJlZpKHRoaXMsdGhpcy5jb21wdXRlQm91bmRzKCkpO3ZhciBjPXRoaXMuZG9jdW1lbnRCb3VuZHMsZD10aGlzLnZpZXdwb3J0Qm91bmRzO3RoaXMucG9zaXRpb249bmV3IEcoYy54KyhhLngqYy53aWR0aCthLm9mZnNldFgpLShiLngqZC53aWR0aC1iLm9mZnNldFgpLGMueSsoYS55KmMuaGVpZ2h0K2Eub2Zmc2V0WSktKGIueSpkLmhlaWdodC1iLm9mZnNldFkpKTt9O2Z1bmN0aW9uIFVpKGEsYixjLGQsZSxmKXthLnNhLmhhKCk7dmFyIGc9YS5zYSxoPWcueCxrPWcueTtpZihmfHxhLnNjcm9sbE1vZGU9PT1vaSllLmdiKCkmJihjPmIud2lkdGgmJihoPWIueCsoZS54KmIud2lkdGgrZS5vZmZzZXRYKS0oZS54KmMtZS5vZmZzZXRYKSksZD5iLmhlaWdodCYmKGs9Yi55KyhlLnkqYi5oZWlnaHQrZS5vZmZzZXRZKS0oZS55KmQtZS5vZmZzZXRZKSkpLGU9YS5yaSxmPWMtYi53aWR0aCxjPGIud2lkdGgrZS5sZWZ0K2UucmlnaHQ/KGg9TWF0aC5taW4oaCtjLzIsYi5yaWdodCtNYXRoLm1heChmLGUucmlnaHQpLWMvMiksaD1NYXRoLm1heChoLGIubGVmdC1NYXRoLm1heChmLGUubGVmdCkrYy8yKSxoLT1jLzIpOmg+Yi5sZWZ0P2g9Yi5sZWZ0Omg8Yi5yaWdodC1jJiYoaD1iLnJpZ2h0LWMpLGM9ZC1iLmhlaWdodCxkPGIuaGVpZ2h0K2UudG9wK2UuYm90dG9tPyhrPU1hdGgubWluKGsrZC8yLGIuYm90dG9tK01hdGgubWF4KGMsZS5ib3R0b20pLWQvMiksaz1NYXRoLm1heChrLGIudG9wLU1hdGgubWF4KGMsZS50b3ApK2QvMiksay09ZC8yKTprPmIudG9wP2s9Yi50b3A6azxiLmJvdHRvbS1kJiYoaz1iLmJvdHRvbS1kKTtnLng9aXNGaW5pdGUoaCk/aDotYS5lYi5sZWZ0O2cueT1pc0Zpbml0ZShrKT9rOi1hLmViLnRvcDtudWxsIT09YS5wb3NpdGlvbkNvbXB1dGF0aW9uJiYoYj1hLnBvc2l0aW9uQ29tcHV0YXRpb24oYSxnKSxnLng9Yi54LGcueT1iLnkpO2Euc2EuZnJlZXplKCk7fXQuJGw9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj0hMCk7aWYoYil7aWYoYT1nZyh0aGlzLGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFydDt9LGZ1bmN0aW9uKGEpe3JldHVybiBhLmNhblNlbGVjdCgpO30pLGEgaW5zdGFuY2VvZiBUKXJldHVybiBhO31lbHNlIGlmKGE9Z2codGhpcyxhLGZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcnQ7fSksYSBpbnN0YW5jZW9mIFQpcmV0dXJuIGE7cmV0dXJuIG51bGw7fTt0LlNiPWZ1bmN0aW9uKGEsYixjKXt2b2lkIDA9PT1iJiYoYj1udWxsKTt2b2lkIDA9PT1jJiYoYz1udWxsKTtRaSh0aGlzKTtmb3IodmFyIGQ9dGhpcy5QYS5pdGVyYXRvckJhY2t3YXJkcztkLm5leHQoKTspe3ZhciBlPWQudmFsdWU7aWYoZS52aXNpYmxlJiYoZT1lLlNiKGEsYixjKSxudWxsIT09ZSkpcmV0dXJuIGU7fXJldHVybiBudWxsO307ZnVuY3Rpb24gZ2coYSxiLGMsZCl7dm9pZCAwPT09YyYmKGM9bnVsbCk7dm9pZCAwPT09ZCYmKGQ9bnVsbCk7UWkoYSk7Zm9yKGE9YS5QYS5pdGVyYXRvckJhY2t3YXJkczthLm5leHQoKTspe3ZhciBlPWEudmFsdWU7aWYoZS52aXNpYmxlJiYhZS5pc1RlbXBvcmFyeSYmKGU9ZS5TYihiLGMsZCksbnVsbCE9PWUpKXJldHVybiBlO31yZXR1cm4gbnVsbDt9dC5QeT1mdW5jdGlvbihhLGIsYyl7dm9pZCAwPT09YiYmKGI9ITApO3JldHVybiBZaSh0aGlzLGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFydDt9LGI/ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBUJiZhLmNhblNlbGVjdCgpO306bnVsbCxjKTt9O2Z1bmN0aW9uIFlpKGEsYixjLGQsZSl7dm9pZCAwPT09YyYmKGM9bnVsbCk7dm9pZCAwPT09ZCYmKGQ9bnVsbCk7ZSBpbnN0YW5jZW9mIEV8fGUgaW5zdGFuY2VvZiBGfHwoZT1uZXcgRigpKTtRaShhKTtmb3IoYT1hLlBhLml0ZXJhdG9yQmFja3dhcmRzO2EubmV4dCgpOyl7dmFyIGY9YS52YWx1ZTtmLnZpc2libGUmJiFmLmlzVGVtcG9yYXJ5JiZmLkZpKGIsYyxkLGUpO31yZXR1cm4gZTt9dC5GaT1mdW5jdGlvbihhLGIsYyxkKXt2b2lkIDA9PT1iJiYoYj1udWxsKTt2b2lkIDA9PT1jJiYoYz1udWxsKTtkIGluc3RhbmNlb2YgRXx8ZCBpbnN0YW5jZW9mIEZ8fChkPW5ldyBGKCkpO1FpKHRoaXMpO2Zvcih2YXIgZT10aGlzLlBhLml0ZXJhdG9yQmFja3dhcmRzO2UubmV4dCgpOyl7dmFyIGY9ZS52YWx1ZTtmLnZpc2libGUmJmYuRmkoYSxiLGMsZCk7fXJldHVybiBkO307dC5reD1mdW5jdGlvbihhLGIsYyxkKXt2b2lkIDA9PT1iJiYoYj0hMSk7dm9pZCAwPT09YyYmKGM9ITApO3JldHVybiBaaSh0aGlzLGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBUJiYoIWN8fGEuY2FuU2VsZWN0KCkpO30sYixkKTt9O3QubWc9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2b2lkIDA9PT1iJiYoYj1udWxsKTt2b2lkIDA9PT1jJiYoYz1udWxsKTt2b2lkIDA9PT1kJiYoZD0hMSk7ZSBpbnN0YW5jZW9mIEV8fGUgaW5zdGFuY2VvZiBGfHwoZT1uZXcgRigpKTtRaSh0aGlzKTtmb3IodmFyIGY9dGhpcy5QYS5pdGVyYXRvckJhY2t3YXJkcztmLm5leHQoKTspe3ZhciBnPWYudmFsdWU7Zy52aXNpYmxlJiZnLm1nKGEsYixjLGQsZSk7fXJldHVybiBlO307ZnVuY3Rpb24gWmkoYSxiLGMsZCxlKXt2YXIgZj1udWxsO3ZvaWQgMD09PWYmJihmPW51bGwpO3ZvaWQgMD09PWMmJihjPW51bGwpO3ZvaWQgMD09PWQmJihkPSExKTtlIGluc3RhbmNlb2YgRXx8ZSBpbnN0YW5jZW9mIEZ8fChlPW5ldyBGKCkpO1FpKGEpO2ZvcihhPWEuUGEuaXRlcmF0b3JCYWNrd2FyZHM7YS5uZXh0KCk7KXt2YXIgZz1hLnZhbHVlO2cudmlzaWJsZSYmIWcuaXNUZW1wb3JhcnkmJmcubWcoYixmLGMsZCxlKTt9cmV0dXJuIGU7fXQuUXk9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2b2lkIDA9PT1jJiYoYz0hMCk7dm9pZCAwPT09ZCYmKGQ9ITApO3JldHVybiAkaSh0aGlzLGEsYixmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFQmJighZHx8YS5jYW5TZWxlY3QoKSk7fSxjLGUpO307dC5uZz1mdW5jdGlvbihhLGIsYyxkLGUsZil7dm9pZCAwPT09YyYmKGM9bnVsbCk7dm9pZCAwPT09ZCYmKGQ9bnVsbCk7dm9pZCAwPT09ZSYmKGU9ITApO2lmKCExIT09ZSYmITAhPT1lKXtpZihlIGluc3RhbmNlb2YgRXx8ZSBpbnN0YW5jZW9mIEYpZj1lO2U9ITA7fWYgaW5zdGFuY2VvZiBFfHxmIGluc3RhbmNlb2YgRnx8KGY9bmV3IEYoKSk7UWkodGhpcyk7Zm9yKHZhciBnPXRoaXMuUGEuaXRlcmF0b3JCYWNrd2FyZHM7Zy5uZXh0KCk7KXt2YXIgaD1nLnZhbHVlO2gudmlzaWJsZSYmaC5uZyhhLGIsYyxkLGUsZik7fXJldHVybiBmO307ZnVuY3Rpb24gJGkoYSxiLGMsZCxlLGYpe3ZhciBnPW51bGw7dm9pZCAwPT09ZyYmKGc9bnVsbCk7dm9pZCAwPT09ZCYmKGQ9bnVsbCk7dm9pZCAwPT09ZSYmKGU9ITApO2lmKCExIT09ZSYmITAhPT1lKXtpZihlIGluc3RhbmNlb2YgRXx8ZSBpbnN0YW5jZW9mIEYpZj1lO2U9ITA7fWYgaW5zdGFuY2VvZiBFfHxmIGluc3RhbmNlb2YgRnx8KGY9bmV3IEYoKSk7UWkoYSk7Zm9yKGE9YS5QYS5pdGVyYXRvckJhY2t3YXJkczthLm5leHQoKTspe3ZhciBoPWEudmFsdWU7aC52aXNpYmxlJiYhaC5pc1RlbXBvcmFyeSYmaC5uZyhiLGMsZyxkLGUsZik7fXJldHVybiBmO31QLnByb3RvdHlwZS5hY2NlcHRFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gYWoodGhpcyxhLGEgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KTt9O2Z1bmN0aW9uIGFqKGEsYixjKXt2YXIgZD1hLlhlO2EuWGU9YS5xajthLnFqPWQ7ZC5kaWFncmFtPWE7ZC5ldmVudD1iO2M/YmooYSxiLGQpOihkLnZpZXdQb2ludD1hLlhlLnZpZXdQb2ludCxkLmRvY3VtZW50UG9pbnQ9YS5YZS5kb2N1bWVudFBvaW50KTthPTA7Yi5jdHJsS2V5JiYoYSs9MSk7Yi5hbHRLZXkmJihhKz0yKTtiLnNoaWZ0S2V5JiYoYSs9NCk7Yi5tZXRhS2V5JiYoYSs9OCk7ZC5tb2RpZmllcnM9YTtkLmJ1dHRvbj1iLmJ1dHRvbjt2b2lkIDA9PT1iLmJ1dHRvbnN8fGJifHwoZC5idXR0b25zPWIuYnV0dG9ucyk7aWImJjA9PT1iLmJ1dHRvbiYmYi5jdHJsS2V5JiYoZC5idXR0b249Mik7ZC5kb3duPSExO2QudXA9ITE7ZC5jbGlja0NvdW50PTE7ZC5kZWx0YT0wO2QuaGFuZGxlZD0hMTtkLmJ1YmJsZXM9ITE7ZC50aW1lc3RhbXA9Yi50aW1lU3RhbXA7ZC5pc011bHRpVG91Y2g9ITE7ZC50YXJnZXREaWFncmFtPWNqKGIpO2QudGFyZ2V0T2JqZWN0PW51bGw7cmV0dXJuIGQ7fWZ1bmN0aW9uIGNqKGEpe3ZhciBiPWEudGFyZ2V0LkM7aWYoIWIpe3ZhciBjPWEucGF0aDtjfHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuY29tcG9zZWRQYXRofHwoYz1hLmNvbXBvc2VkUGF0aCgpKTtjJiZjWzBdJiYoYj1jWzBdLkMpO31yZXR1cm4gYj9iOm51bGw7fWZ1bmN0aW9uIGRqKGEsYixjLGQpe3ZhciBlPWVqKGEsYiwhMCwhMSwhMCxkKTtiaihhLGMsZSk7ZS50YXJnZXREaWFncmFtPWNqKGIpO2UudGFyZ2V0T2JqZWN0PW51bGw7ZHx8ZS5jbG9uZShhLlhoKTtyZXR1cm4gZTt9ZnVuY3Rpb24gZmooYSxiLGMsZCl7dmFyIGU7ZD1laihhLGIsITEsITEsITEsZCk7bnVsbCE9PWM/KChlPXcuZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjLmNsaWVudFgsYy5jbGllbnRZKSkmJmUuQz8oYj1jLGM9ZS5DKTooYj12b2lkIDAhPT1iLnRhcmdldFRvdWNoZXM/Yi50YXJnZXRUb3VjaGVzWzBdOmIsYz1hKSxkLnRhcmdldERpYWdyYW09YyxiaihhLGIsZCkpOm51bGwhPT1hLlhlPyhkLmRvY3VtZW50UG9pbnQ9YS5YZS5kb2N1bWVudFBvaW50LGQudmlld1BvaW50PWEuWGUudmlld1BvaW50LGQudGFyZ2V0RGlhZ3JhbT1hLlhlLnRhcmdldERpYWdyYW0pOm51bGwhPT1hLlhoJiYoZC5kb2N1bWVudFBvaW50PWEuWGguZG9jdW1lbnRQb2ludCxkLnZpZXdQb2ludD1hLlhoLnZpZXdQb2ludCxkLnRhcmdldERpYWdyYW09YS5YaC50YXJnZXREaWFncmFtKTtkLnRhcmdldE9iamVjdD1udWxsO3JldHVybiBkO31mdW5jdGlvbiBlaihhLGIsYyxkLGUsZil7dmFyIGc9YS5YZTthLlhlPWEucWo7YS5xaj1nO2cuZGlhZ3JhbT1hO2cuY2xpY2tDb3VudD0xO3ZhciBoPWcuZGVsdGE9MDtiLmN0cmxLZXkmJihoKz0xKTtiLmFsdEtleSYmKGgrPTIpO2Iuc2hpZnRLZXkmJihoKz00KTtiLm1ldGFLZXkmJihoKz04KTtnLm1vZGlmaWVycz1oO2cuYnV0dG9uPTA7Zy5idXR0b25zPTE7Zy5ldmVudD1iO2cudGltZXN0YW1wPWIudGltZVN0YW1wO2EuR3EmJmIgaW5zdGFuY2VvZiB3LlBvaW50ZXJFdmVudCYmInRvdWNoIiE9PWIucG9pbnRlclR5cGUmJihnLmJ1dHRvbj1iLmJ1dHRvbix2b2lkIDA9PT1iLmJ1dHRvbnN8fGJifHwoZy5idXR0b25zPWIuYnV0dG9ucyksaWImJjA9PT1iLmJ1dHRvbiYmYi5jdHJsS2V5JiYoZy5idXR0b249MikpO2cuZG93bj1jO2cudXA9ZDtnLmhhbmRsZWQ9ITE7Zy5idWJibGVzPWU7Zy5pc011bHRpVG91Y2g9ZjtyZXR1cm4gZzt9ZnVuY3Rpb24gZ2ooYSxiKXtpZihhLmJ1YmJsZXMpcmV0dXJuITA7dm9pZCAwIT09Yi5zdG9wUHJvcGFnYXRpb24mJmIuc3RvcFByb3BhZ2F0aW9uKCk7ITEhPT1iLmNhbmNlbGFibGUmJmIucHJldmVudERlZmF1bHQoKTtiLmNhbmNlbEJ1YmJsZT0hMDtyZXR1cm4hMTt9UC5wcm90b3R5cGUudno9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DO2lmKCF0aGlzLkMuaXNFbmFibGVkKXJldHVybiExO3ZhciBjPWFqKGIsYSwhMSk7Yy5rZXk9U3RyaW5nLmZyb21DaGFyQ29kZShhLndoaWNoKTtjLmRvd249ITA7c3dpdGNoKGEud2hpY2gpe2Nhc2UgODpjLmtleT0iQmFja3NwYWNlIjticmVhaztjYXNlIDMzOmMua2V5PSJQYWdlVXAiO2JyZWFrO2Nhc2UgMzQ6Yy5rZXk9IlBhZ2VEb3duIjticmVhaztjYXNlIDM1OmMua2V5PSJFbmQiO2JyZWFrO2Nhc2UgMzY6Yy5rZXk9IkhvbWUiO2JyZWFrO2Nhc2UgMzc6Yy5rZXk9IkxlZnQiO2JyZWFrO2Nhc2UgMzg6Yy5rZXk9IlVwIjticmVhaztjYXNlIDM5OmMua2V5PSJSaWdodCI7YnJlYWs7Y2FzZSA0MDpjLmtleT0iRG93biI7YnJlYWs7Y2FzZSA0NTpjLmtleT0iSW5zZXJ0IjticmVhaztjYXNlIDQ2OmMua2V5PSJEZWwiO2JyZWFrO2Nhc2UgNDg6Yy5rZXk9IjAiO2JyZWFrO2Nhc2UgMTg3OmNhc2UgNjE6Y2FzZSAxMDc6Yy5rZXk9IkFkZCI7YnJlYWs7Y2FzZSAxODk6Y2FzZSAxNzM6Y2FzZSAxMDk6Yy5rZXk9IlN1YnRyYWN0IjticmVhaztjYXNlIDI3OmMua2V5PSJFc2MiO31iLmRvS2V5RG93bigpO3JldHVybiBnaihjLGEpO307UC5wcm90b3R5cGUud3o9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DO2lmKCFiLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYz1haihiLGEsITEpO2Mua2V5PVN0cmluZy5mcm9tQ2hhckNvZGUoYS53aGljaCk7Yy51cD0hMDtzd2l0Y2goYS53aGljaCl7Y2FzZSA4OmMua2V5PSJCYWNrc3BhY2UiO2JyZWFrO2Nhc2UgMzM6Yy5rZXk9IlBhZ2VVcCI7YnJlYWs7Y2FzZSAzNDpjLmtleT0iUGFnZURvd24iO2JyZWFrO2Nhc2UgMzU6Yy5rZXk9IkVuZCI7YnJlYWs7Y2FzZSAzNjpjLmtleT0iSG9tZSI7YnJlYWs7Y2FzZSAzNzpjLmtleT0iTGVmdCI7YnJlYWs7Y2FzZSAzODpjLmtleT0iVXAiO2JyZWFrO2Nhc2UgMzk6Yy5rZXk9IlJpZ2h0IjticmVhaztjYXNlIDQwOmMua2V5PSJEb3duIjticmVhaztjYXNlIDQ1OmMua2V5PSJJbnNlcnQiO2JyZWFrO2Nhc2UgNDY6Yy5rZXk9IkRlbCI7fWIuZG9LZXlVcCgpO3JldHVybiBnaihjLGEpO307UC5wcm90b3R5cGUuRnk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DO2lmKCFiLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYz1haihiLGEsITApO251bGwhPT1iLm1vdXNlRW50ZXImJmIubW91c2VFbnRlcihjKTtyZXR1cm4gZ2ooYyxhKTt9O1AucHJvdG90eXBlLkd5PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQztpZighYi5pc0VuYWJsZWQpcmV0dXJuITE7dmFyIGM9YWooYixhLCEwKTtudWxsIT09Yi5tb3VzZUxlYXZlJiZiLm1vdXNlTGVhdmUoYyk7cmV0dXJuIGdqKGMsYSk7fTtQLnByb3RvdHlwZS5nZXRNb3VzZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLkRhO2lmKG51bGw9PT1iKXJldHVybiBuZXcgRygwLDApO3ZhciBjPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Yj1hLmNsaWVudFgtdGhpcy54YS9jLndpZHRoKmMubGVmdDthPWEuY2xpZW50WS10aGlzLndhL2MuaGVpZ2h0KmMudG9wO3JldHVybiBudWxsIT09dGhpcy50Yj9RYihuZXcgRyhiLGEpLHRoaXMudGIpOm5ldyBHKGIsYSk7fTtmdW5jdGlvbiBiaihhLGIsYyl7dmFyIGQ9YS5EYSxlPWEueGEsZj1hLndhLGc9MCxoPTA7bnVsbCE9PWQmJihkPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZz1iLmNsaWVudFgtZS9kLndpZHRoKmQubGVmdCxoPWIuY2xpZW50WS1mL2QuaGVpZ2h0KmQudG9wKTtjLnZpZXdQb2ludC5oKGcsaCk7bnVsbCE9PWEudGI/KGI9Ry5hbGxvY0F0KGcsaCksYS50Yi5VZChiKSxjLmRvY3VtZW50UG9pbnQuYXNzaWduKGIpLEcuZnJlZShiKSk6Yy5kb2N1bWVudFBvaW50LmgoZyxoKTt9ZnVuY3Rpb24gWWUoYSxiLGMsZCl7aWYodm9pZCAwIT09Yi50YXJnZXRUb3VjaGVzKXtpZigyPmIudGFyZ2V0VG91Y2hlcy5sZW5ndGgpcmV0dXJuO2I9Yi50YXJnZXRUb3VjaGVzW2NdO31lbHNlIGlmKG51bGwhPT1hLnZsWzBdKWI9YS52bFtjXTtlbHNlIHJldHVybjtjPWEuRGE7bnVsbCE9PWMmJihjPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZC5oKGIuY2xpZW50WC1hLnhhL2Mud2lkdGgqYy5sZWZ0LGIuY2xpZW50WS1hLndhL2MuaGVpZ2h0KmMudG9wKSk7fXQ9UC5wcm90b3R5cGU7dC5YYT1mdW5jdGlvbigpe3RoaXMuT2d8fCh0aGlzLk9nPSEwLHRoaXMuY2MoITApKTt9O2Z1bmN0aW9uIGNpKGEpe2EuWmJ8fFFpKGEpO2EuT2cmJlZpKGEsYS5jb21wdXRlQm91bmRzKCkpO310LnNmPWZ1bmN0aW9uKCl7dGhpcy5vYnx8dGhpcy5aYnx8KHRoaXMuUigpLGhqKHRoaXMpLFBpKHRoaXMpLHRoaXMuWGEoKSx0aGlzLmZkKCkpO307dC51ej1mdW5jdGlvbigpe3JldHVybiB0aGlzLnFkO307dC5BeT1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTt2YXIgYj10aGlzLmFuaW1hdGlvbk1hbmFnZXIsYz1iLmlzRW5hYmxlZDtiLnZkKCk7Yi5pc0VuYWJsZWQ9ITE7cGcodGhpcyk7dGhpcy5nZT0hMTtiLmlzRW5hYmxlZD1jO251bGwhPT1hJiZ1YShhLDEpO307dC5jYz1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT0hMSk7aWYoITAhPT10aGlzLnFkJiYhKHRoaXMub2J8fCExPT09YSYmdGhpcy5aYikpe3RoaXMucWQ9ITA7dmFyIGI9dGhpczt3LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2IucWQmJmIuZmQoKTt9KTt9fTt0LmZkPWZ1bmN0aW9uKCl7aWYoIXRoaXMuWGt8fHRoaXMucWQpdGhpcy5YayYmKHRoaXMuWGs9ITEpLHBnKHRoaXMpO307ZnVuY3Rpb24gaWooYSxiKXthLmFuaW1hdGlvbk1hbmFnZXIuaXNBbmltYXRpbmd8fGEub2J8fCFhLmtqfHxOaShhKXx8KGImJlFpKGEpLFNpKGEsITEpKTt9ZnVuY3Rpb24gcGcoYSxiKXtpZighYS5aYiYmKGEucWQ9ITEsbnVsbCE9PWEuSWF8fGEuRXAubygpKSl7YS5aYj0hMDt2YXIgYz1hLmFuaW1hdGlvbk1hbmFnZXIsZD1hLm11O2lmKCFjLmlzVGlja2luZyYmMCE9PWQubGVuZ3RoKXtmb3IodmFyIGU9ZC5qLGY9ZS5sZW5ndGgsZz0wO2c8ZjtnKyspe3ZhciBoPWVbZ107amooaCwhMSk7aC5zKCk7fWQuY2xlYXIoKTt9ZD1hLnp3OzA8ZC5jb3VudCYmKGQuZWFjaChmdW5jdGlvbihhKXthLll2KCk7fSksZC5jbGVhcigpKTtlPWQ9ITE7Yy5pc0FuaW1hdGluZyYmKGU9ITAsZD1hLnNraXBzVW5kb01hbmFnZXIsYS5za2lwc1VuZG9NYW5hZ2VyPSEwKTtjLnJifHxUaChhKTtpaihhLCExKTtudWxsIT09YS5FYiYmKGEuRWIudmlzaWJsZSYmIWEubHImJihraihhKSxhLmxyPSEwKSwhYS5FYi52aXNpYmxlJiZhLmxyJiYoYS5scj0hMSkpO1FpKGEpO2Y9ITE7aWYoIWEuZ2V8fGEuemcpYS5nZT9saihhLCFhLlJrKTooYS5BYSgiSW5pdGlhbCBMYXlvdXQiKSwhMT09PWMuaXNFbmFibGVkJiZjLnZkKCksbGooYSwhMSkpLGY9ITA7YS5Saz0hMTtRaShhKTthLnd1fHxjLmlzQW5pbWF0aW5nfHxjaShhKTtpaihhLCEwKTtmJiYoYS5nZXx8bWooYSksYS5hYSgiTGF5b3V0Q29tcGxldGVkIikpO1FpKGEpO2YmJiFhLmdlJiYoYS5nZT0hMCxhLlphKCJJbml0aWFsIExheW91dCIpLGEuc2tpcHNVbmRvTWFuYWdlcnx8YS51bmRvTWFuYWdlci5jbGVhcigpLHVhKGZ1bmN0aW9uKCl7YS5pc01vZGlmaWVkPSExO30sMSkpO2EuS3UoKTtTaChjKTtifHxhLmhjKGEuWWMpO2UmJihhLnNraXBzVW5kb01hbmFnZXI9ZCk7YS5aYj0hMTt9fWZ1bmN0aW9uIG1qKGEpe3ZhciBiPWEuUGEuajthLmhkKGIsYi5sZW5ndGgsYSk7YS5haSE9PXBpP2Euc2NhbGU9VGkoYSxhLmFpKTphLmFqIT09cGk/YS5zY2FsZT1UaShhLGEuYWopOihiPWEuaW5pdGlhbFNjYWxlLGlzRmluaXRlKGIpJiYwPGImJihhLnNjYWxlPWIpKTtiPWEuaW5pdGlhbFBvc2l0aW9uO2lmKGIubygpKWEucG9zaXRpb249YjtlbHNle2I9Ry5hbGxvYygpO2IuVGkoYS5kb2N1bWVudEJvdW5kcyxhLmluaXRpYWxEb2N1bWVudFNwb3QpO3ZhciBjPWEudmlld3BvcnRCb3VuZHM7Yz1OLmFsbG9jQXQoMCwwLGMud2lkdGgsYy5oZWlnaHQpO3ZhciBkPUcuYWxsb2MoKTtkLlRpKGMsYS5pbml0aWFsVmlld3BvcnRTcG90KTtkLmgoYi54LWQueCxiLnktZC55KTthLnBvc2l0aW9uPWQ7Ti5mcmVlKGMpO0cuZnJlZShkKTtHLmZyZWUoYik7aGooYSk7aWooYSwhMCk7U2koYSwhMCk7fWEuYWEoIkluaXRpYWxMYXlvdXRDb21wbGV0ZWQiKTtraihhKTt9ZnVuY3Rpb24gUWkoYSl7aWYoKGEuWmJ8fCFhLmFuaW1hdGlvbk1hbmFnZXIuaXNBbmltYXRpbmcpJiYwIT09YS5EZC5jb3VudCl7Zm9yKHZhciBiPTA7MjM+YjtiKyspe3ZhciBjPWEuRGQuaXRlcmF0b3I7aWYobnVsbD09PWN8fDA9PT1hLkRkLmNvdW50KWJyZWFrO2EuRGQ9bmV3IEYoKTthLll2KGMsYS5EZCk7fWEubm9kZXMuZWFjaChmdW5jdGlvbihhKXthIGluc3RhbmNlb2YgaWcmJjAhPT0oYS5TJjY1NTM2KSE9PSExJiYoYS5TPWEuU142NTUzNik7fSk7fX10Lll2PWZ1bmN0aW9uKGEsYil7Zm9yKGEucmVzZXQoKTthLm5leHQoKTspe3ZhciBjPWEudmFsdWU7IWMuTGIoKXx8YyBpbnN0YW5jZW9mIGlnfHwoYy5QaSgpPyhjLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHkpLGMuYXJyYW5nZSgpKTpiLmFkZChjKSk7fWZvcihhLnJlc2V0KCk7YS5uZXh0KCk7KXtjPWEudmFsdWUsYyBpbnN0YW5jZW9mIGlnJiZjLmlzVmlzaWJsZSgpJiZuaih0aGlzLGMpO31mb3IoYS5yZXNldCgpO2EubmV4dCgpOyl7Yz1hLnZhbHVlLGMgaW5zdGFuY2VvZiBTJiZjLmlzVmlzaWJsZSgpJiYoYy5QaSgpPyhjLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHkpLGMuYXJyYW5nZSgpKTpiLmFkZChjKSk7fWZvcihhLnJlc2V0KCk7YS5uZXh0KCk7KXtjPWEudmFsdWUsYyBpbnN0YW5jZW9mIHBmJiZjLmlzVmlzaWJsZSgpJiYoYy5QaSgpPyhjLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHkpLGMuYXJyYW5nZSgpKTpiLmFkZChjKSk7fX07ZnVuY3Rpb24gbmooYSxiKXtmb3IodmFyIGM9S2EoKSxkPUthKCksZT1iLm1lbWJlclBhcnRzO2UubmV4dCgpOyl7dmFyIGY9ZS52YWx1ZTtmLmlzVmlzaWJsZSgpJiYoZiBpbnN0YW5jZW9mIGlnPyhvaihmKXx8cGooZil8fHFqKGYpKSYmbmooYSxmKTpmIGluc3RhbmNlb2YgUz9mLmZyb21Ob2RlPT09Ynx8Zi50b05vZGU9PT1iP2QucHVzaChmKTpjLnB1c2goZik6KGYubWVhc3VyZShJbmZpbml0eSxJbmZpbml0eSksZi5hcnJhbmdlKCkpKTt9YT1jLmxlbmd0aDtmb3IoZT0wO2U8YTtlKyspe2Y9Y1tlXSxmLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHkpLGYuYXJyYW5nZSgpO31PYShjKTtiLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHkpO2IuYXJyYW5nZSgpO2E9ZC5sZW5ndGg7Zm9yKGI9MDtiPGE7YisrKXtjPWRbYl0sYy5tZWFzdXJlKEluZmluaXR5LEluZmluaXR5KSxjLmFycmFuZ2UoKTt9T2EoZCk7fXQuaGQ9ZnVuY3Rpb24oYSxiLGMsZCl7aWYodGhpcy5iaXx8dGhpcy5hbmltYXRpb25NYW5hZ2VyLmlzQW5pbWF0aW5nKWZvcih2YXIgZT0wO2U8YjtlKyspe2FbZV0uaGQoYyxkKTt9fTt0LmhjPWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9bnVsbCk7aWYobnVsbCE9PXRoaXMuSWEpe251bGw9PT10aGlzLkRhJiZBKCJObyBjYW52YXMgc3BlY2lmaWVkIik7dmFyIGM9dGhpcy5hbmltYXRpb25NYW5hZ2VyO2lmKCFjLnJiKXt2YXIgZD1uZXcgRGF0ZSgpO3JqKHRoaXMpO2lmKCIwIiE9PXRoaXMuSWEuc3R5bGUub3BhY2l0eSl7dmFyIGU9YSE9PXRoaXMuWWMsZj10aGlzLlBhLmosZz1mLmxlbmd0aCxoPXRoaXM7dGhpcy5oZChmLGcsaCk7aWYoZSlhLlJjKCEwKSxQaSh0aGlzKTtlbHNlIGlmKCF0aGlzLm5jJiZudWxsPT09YiYmIWMuaXNBbmltYXRpbmcpcmV0dXJuO2c9dGhpcy5zYTt2YXIgaz10aGlzLkNhLGw9TWF0aC5yb3VuZChnLngqaykvayxtPU1hdGgucm91bmQoZy55KmspL2s7Yz10aGlzLnRiO2MucmVzZXQoKTsxIT09ayYmYy5zY2FsZShrKTswPT09Zy54JiYwPT09Zy55fHxjLnRyYW5zbGF0ZSgtbCwtbSk7az10aGlzLk5iO2Euc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTthLnNjYWxlKGssayk7YS5jbGVhclJlY3QoMCwwLHRoaXMueGEsdGhpcy53YSk7YS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApO2Euc2NhbGUoayxrKTthLnRyYW5zZm9ybShjLm0xMSxjLm0xMixjLm0yMSxjLm0yMixjLmR4LGMuZHkpO2w9bnVsbCE9PWI/ZnVuY3Rpb24oYyl7dmFyIGQ9YjtpZihjLnZpc2libGUmJjAhPT1jLmxiKXt2YXIgZT1jLkZhLmosZj1lLmxlbmd0aDtpZigwIT09Zil7MSE9PWMubGImJihhLmdsb2JhbEFscGhhPWMubGIpO2M9Yy5KbztjLmxlbmd0aD0wO2Zvcih2YXIgZz1oLnNjYWxlLGs9MDtrPGY7aysrKXt2YXIgbD1lW2tdO2lmKG9nKGwpJiYhZC5jb250YWlucyhsKSl7aWYobCBpbnN0YW5jZW9mIFMmJihsLmlzT3J0aG9nb25hbCYmYy5wdXNoKGwpLCExPT09bC5MYykpY29udGludWU7dmFyIG09bC5hY3R1YWxCb3VuZHM7MTxtLndpZHRoKmd8fDE8bS5oZWlnaHQqZz9sLmhjKGEsaCk6aWkoYSxsKTt9fWEuZ2xvYmFsQWxwaGE9MTt9fX06ZnVuY3Rpb24oYil7Yi5oYyhhLGgpO307c2oodGhpcyxhKTtnPWYubGVuZ3RoO2ZvcihtPTA7bTxnO20rKyl7YS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGEuc2NhbGUoayxrKSxhLnRyYW5zZm9ybShjLm0xMSxjLm0xMixjLm0yMSxjLm0yMixjLmR4LGMuZHkpLGwoZlttXSk7fXRoaXMuJGgmJnRqKHRoaXMuJGgsdGhpcykmJnRoaXMuY3IoKTtlPyh0aGlzLlljLlJjKCEwKSxQaSh0aGlzKSk6dGhpcy5uYz10aGlzLmJpPSExO2U9K25ldyBEYXRlKCktK2Q7aWYobnVsbD09PXRoaXMuamgpe2Q9dGhpcy5VcjtkW3RoaXMuVnJdPWU7dGhpcy5Wcj0odGhpcy5WcisxKSVkLmxlbmd0aDtmb3IoZj1lPTA7Zjx0aGlzLlVyLmxlbmd0aDtmKyspe2UrPXRoaXMuVXJbZl07fXRoaXMuVHI9ZS9kLmxlbmd0aDt9fX19fTtmdW5jdGlvbiB1aihhLGIsYyxkLGUsZixnLGgsayxsKXtpZihudWxsIT09YS5JYSl7bnVsbD09PWEuRGEmJkEoIk5vIGNhbnZhcyBzcGVjaWZpZWQiKTt2b2lkIDA9PT1nJiYoZz1udWxsKTt2b2lkIDA9PT1oJiYoaD1udWxsKTt2b2lkIDA9PT1rJiYoaz0hMSk7dm9pZCAwPT09bCYmKGw9ITEpO3JqKGEpO2EuWWMuUmMoITApO1BpKGEpO2EubWo9ITA7dmFyIG09YS5DYTthLkNhPWU7dmFyIG49YS5QYS5qLHA9bi5sZW5ndGg7dHJ5e3ZhciBxPW5ldyBOKGYueCxmLnksZC53aWR0aC9lLGQuaGVpZ2h0L2UpLHI9cS5jb3B5KCk7ci5McChjKTtraihhLHIpO1FpKGEpO2EuaGQobixwLGEscSk7dmFyIHU9YS5OYjtiLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7Yi5zY2FsZSh1LHUpO2IuY2xlYXJSZWN0KDAsMCxkLndpZHRoLGQuaGVpZ2h0KTtudWxsIT09aCYmIiIhPT1oJiYoYi5maWxsU3R5bGU9aCxiLmZpbGxSZWN0KDAsMCxkLndpZHRoLGQuaGVpZ2h0KSk7dmFyIHg9UWMuYWxsb2MoKTt4LnJlc2V0KCk7eC50cmFuc2xhdGUoYy5sZWZ0LGMudG9wKTt4LnNjYWxlKGUpOzA9PT1mLngmJjA9PT1mLnl8fHgudHJhbnNsYXRlKC1mLngsLWYueSk7Yi5zZXRUcmFuc2Zvcm0oeC5tMTEseC5tMTIseC5tMjEseC5tMjIseC5keCx4LmR5KTtRYy5mcmVlKHgpO3NqKGEsYik7aWYobnVsbCE9PWcpe3ZhciB2PW5ldyBGKCkseT1nLml0ZXJhdG9yO2Zvcih5LnJlc2V0KCk7eS5uZXh0KCk7KXt2YXIgej15LnZhbHVlOyExPT09bCYmIkdyaWQiPT09ei5sYXllci5uYW1lfHxudWxsPT09enx8di5hZGQoeik7fXZhciBCPWZ1bmN0aW9uIEIoYyl7dmFyIGQ9aztpZihjLnZpc2libGUmJjAhPT1jLmxiJiYodm9pZCAwPT09ZCYmKGQ9ITApLGR8fCFjLmlzVGVtcG9yYXJ5KSl7ZD1jLkZhLmo7dmFyIGU9ZC5sZW5ndGg7aWYoMCE9PWUpezEhPT1jLmxiJiYoYi5nbG9iYWxBbHBoYT1jLmxiKTtjPWMuSm87Yy5sZW5ndGg9MDtmb3IodmFyIGY9YS5zY2FsZSxnPTA7ZzxlO2crKyl7dmFyIGg9ZFtnXTtpZihvZyhoKSYmdi5jb250YWlucyhoKSl7aWYoaCBpbnN0YW5jZW9mIFMmJihoLmlzT3J0aG9nb25hbCYmYy5wdXNoKGgpLCExPT09aC5MYykpY29udGludWU7dmFyIGw9aC5hY3R1YWxCb3VuZHM7MTxsLndpZHRoKmZ8fDE8bC5oZWlnaHQqZj9oLmhjKGIsYSk6aWkoYixoKTt9fWIuZ2xvYmFsQWxwaGE9MTt9fX07fWVsc2UgaWYoIWsmJmwpe3ZhciBDPWEuZ3JpZC5wYXJ0LEk9Qy5sYXllcjtCPWZ1bmN0aW9uIEIoYyl7Yz09PUk/Qy5oYyhiLGEpOmMuaGMoYixhLGspO307fWVsc2UgQj1mdW5jdGlvbiBCKGMpe2MuaGMoYixhLGspO307Zm9yKGM9MDtjPHA7YysrKXtCKG5bY10pO31hLm1qPSExO2EuJGgmJnRqKGEuJGgsYSkmJmEuY3IoKTt9ZmluYWxseXthLkNhPW0sYS5ZYy5SYyghMCksUGkoYSksYS5oZChuLHAsYSksa2ooYSk7fX19dC5EZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kZ1thXTt9O3QuSng9ZnVuY3Rpb24oYSxiKXt0aGlzLiRnW2FdPWI7dGhpcy5zZigpO307dC5Edj1mdW5jdGlvbigpe3RoaXMuJGc9bmV3IHRiKCk7dGhpcy4kZy5kcmF3U2hhZG93cz0hMDt0aGlzLiRnLnRleHRHcmVla2luZz0hMDt0aGlzLiRnLnZpZXdwb3J0T3B0aW1pemF0aW9ucz1sYnx8Y2J8fGRiPyExOiEwO3RoaXMuJGcudGVtcG9yYXJ5UGl4ZWxSYXRpbz0hMDt0aGlzLiRnLnBpY3R1cmVSYXRpb09wdGltaXphdGlvbj0hMDt9O2Z1bmN0aW9uIHNqKGEsYil7YT1hLiRnO251bGwhPT1hJiYodm9pZCAwIT09YS5pbWFnZVNtb290aGluZ0VuYWJsZWQmJmIuSXgoISFhLmltYWdlU21vb3RoaW5nRW5hYmxlZCksYT1hLmRlZmF1bHRGb250LHZvaWQgMCE9PWEmJm51bGwhPT1hJiYoYi5mb250PWEpKTt9dC5ibT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kbFthXTt9O3QuUno9ZnVuY3Rpb24oYSxiKXt0aGlzLmRsW2FdPWI7fTt0LkN2PWZ1bmN0aW9uKCl7dGhpcy5kbD1uZXcgdGIoKTt0aGlzLmRsLmV4dHJhVG91Y2hBcmVhPTEwO3RoaXMuZGwuZXh0cmFUb3VjaFRocmVzaG9sZD0xMDt0aGlzLmRsLmhhc0dlc3R1cmVab29tPSEwO307dC5Ndj1mdW5jdGlvbihhKXt2aih0aGlzLGEpO307ZnVuY3Rpb24gdmooYSxiKXt2YXIgYz1hIGluc3RhbmNlb2YgWCxkPWEgaW5zdGFuY2VvZiBQLGU7Zm9yKGUgaW4gYil7IiI9PT1lJiZBKCJTZXR0aW5nIHByb3BlcnRpZXMgcmVxdWlyZXMgbm9uLWVtcHR5IHByb3BlcnR5IG5hbWVzIik7dmFyIGY9YSxnPWU7aWYoY3x8ZCl7dmFyIGg9ZS5pbmRleE9mKCIuIik7aWYoMDxoKXt2YXIgaz1lLnN1YnN0cmluZygwLGgpO2lmKGMpZj1hLiRhKGspO2Vsc2UgaWYoZj1hW2tdLHZvaWQgMD09PWZ8fG51bGw9PT1mKWY9YS50b29sTWFuYWdlcltrXTtDYShmKT9nPWUuc3Vic3RyKGgrMSk6QSgiVW5hYmxlIHRvIGZpbmQgb2JqZWN0IG5hbWVkOiAiK2srIiBpbiAiK2EudG9TdHJpbmcoKSsiIHdoZW4gdHJ5aW5nIHRvIHNldCBwcm9wZXJ0eTogIitlKTt9fWlmKCJfIiE9PWdbMF0mJiFTYShmLGcpKWlmKGQmJiJNb2RlbENoYW5nZWQiPT09Zyl7YS5UdyhiW2ddKTtjb250aW51ZTt9ZWxzZSBpZihkJiYiQ2hhbmdlZCI9PT1nKXthLnJoKGJbZ10pO2NvbnRpbnVlO31lbHNlIGlmKGQmJlNhKGEudG9vbE1hbmFnZXIsZykpZj1hLnRvb2xNYW5hZ2VyO2Vsc2UgaWYoZCYmd2ooYSxnKSl7YS5OaihnLGJbZ10pO2NvbnRpbnVlO31lbHNlIGlmKGEgaW5zdGFuY2VvZiBaJiYiQ2hhbmdlZCI9PT1nKXthLnJoKGJbZ10pO2NvbnRpbnVlO31lbHNlIEEoJ1RyeWluZyB0byBzZXQgdW5kZWZpbmVkIHByb3BlcnR5ICInK2crJyIgb24gb2JqZWN0OiAnK2YudG9TdHJpbmcoKSk7ZltnXT1iW2VdOyJfIj09PWdbMF0mJmYgaW5zdGFuY2VvZiBZJiZmLlF3KGcpO319dC5LdT1mdW5jdGlvbigpe2lmKDA9PT10aGlzLnVuZG9NYW5hZ2VyLnRyYW5zYWN0aW9uTGV2ZWwmJjAhPT10aGlzLldoLmNvdW50KXtmb3IoOzA8dGhpcy5XaC5jb3VudDspe3ZhciBhPXRoaXMuV2g7dGhpcy5XaD1uZXcgTGIoKTtmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGI9YS5rZXk7Yi4kcChhLnZhbHVlKTtiLmJjKCk7fX10aGlzLlIoKTt9fTt0LlI9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9bnVsbCk7aWYobnVsbD09PWEpdGhpcy5uYz0hMCx0aGlzLmNjKCk7ZWxzZXt2YXIgYj10aGlzLnZpZXdwb3J0Qm91bmRzO251bGwhPT1hJiZhLm8oKSYmYi5JYyhhKSYmKHRoaXMubmM9ITAsdGhpcy5jYygpKTt9dGhpcy5hYSgiSW52YWxpZGF0ZURyYXciKTt9O3Qub3g9ZnVuY3Rpb24oYSxiKXtpZighMCE9PXRoaXMubmMpe3RoaXMubmM9ITA7dmFyIGM9ITA9PT10aGlzLkRlKCJ0ZW1wb3JhcnlQaXhlbFJhdGlvIik7aWYoITA9PT10aGlzLkRlKCJ2aWV3cG9ydE9wdGltaXphdGlvbnMiKSYmdGhpcy5zY3JvbGxNb2RlIT09eGomJnRoaXMucmkuRGkoMCwwLDAsMCkmJmIud2lkdGg9PT1hLndpZHRoJiZiLmhlaWdodD09PWEuaGVpZ2h0KXt2YXIgZD10aGlzLnNjYWxlLGU9TWF0aC5tYXgoYS54LGIueCksZj1NYXRoLm1heChhLnksYi55KTtkPU4uYWxsb2NBdChlLGYsTWF0aC5tYXgoMCxNYXRoLm1pbihhLngrYS53aWR0aCxiLngrYi53aWR0aCktZSkqZCxNYXRoLm1heCgwLE1hdGgubWluKGEueSthLmhlaWdodCxiLnkrYi5oZWlnaHQpLWYpKmQpO2lmKCF0aGlzLkFzJiYwPGQud2lkdGgmJjA8ZC5oZWlnaHQpe2lmKCEodGhpcy5aYnx8KHRoaXMucWQ9ITEsbnVsbD09PXRoaXMuSWF8fCh0aGlzLlpiPSEwLHRoaXMuS3UoKSx0aGlzLmRvY3VtZW50Qm91bmRzLm8oKXx8VmkodGhpcyx0aGlzLmNvbXB1dGVCb3VuZHMoKSksZT10aGlzLkRhLG51bGw9PT1lfHxlIGluc3RhbmNlb2YgeWopKSkpe3ZhciBnPXRoaXMuTmI7Zj10aGlzLnhhKmc7dmFyIGg9dGhpcy53YSpnLGs9dGhpcy5zY2FsZSpnLGw9TWF0aC5yb3VuZChNYXRoLnJvdW5kKGIueCprKS1NYXRoLnJvdW5kKGEueCprKSk7Yj1NYXRoLnJvdW5kKE1hdGgucm91bmQoYi55KmspLU1hdGgucm91bmQoYS55KmspKTtrPXRoaXMuVXQ7YT10aGlzLnV3O2sud2lkdGghPT1mJiYoay53aWR0aD1mKTtrLmhlaWdodCE9PWgmJihrLmhlaWdodD1oKTthLmNsZWFyUmVjdCgwLDAsZixoKTtrPTE5MCpnO3ZhciBtPTcwKmcsbj1NYXRoLm1heChsLDApLHA9TWF0aC5tYXgoYiwwKSxxPU1hdGguZmxvb3IoZi1uKSxyPU1hdGguZmxvb3IoaC1wKTthLmRyYXdJbWFnZShlLkdhLG4scCxxLHIsMCwwLHEscik7dGoodGhpcy4kaCx0aGlzKSYmYS5jbGVhclJlY3QoMCwwLGssbSk7ZT1LYSgpO2E9S2EoKTtyPU1hdGguYWJzKGwpO3E9TWF0aC5hYnMoYik7dmFyIHU9MD09PW4/MDpmLXI7bj1HLmFsbG9jQXQodSwwKTtyPUcuYWxsb2NBdChyK3UsaCk7YS5wdXNoKG5ldyBOKE1hdGgubWluKG4ueCxyLngpLE1hdGgubWluKG4ueSxyLnkpLE1hdGguYWJzKG4ueC1yLngpLE1hdGguYWJzKG4ueS1yLnkpKSk7dmFyIHg9dGhpcy50Yjt4LnJlc2V0KCk7eC5zY2FsZShnLGcpOzEhPT10aGlzLkNhJiZ4LnNjYWxlKHRoaXMuQ2EpO2c9dGhpcy5zYTsoMCE9PWcueHx8MCE9PWcueSkmJmlzRmluaXRlKGcueCkmJmlzRmluaXRlKGcueSkmJngudHJhbnNsYXRlKC1nLngsLWcueSk7UWIobix4KTtRYihyLHgpO2UucHVzaChuZXcgTihNYXRoLm1pbihuLngsci54KSxNYXRoLm1pbihuLnksci55KSxNYXRoLmFicyhuLngtci54KSxNYXRoLmFicyhuLnktci55KSkpO3U9MD09PXA/MDpoLXE7bi5oKDAsdSk7ci5oKGYscSt1KTthLnB1c2gobmV3IE4oTWF0aC5taW4obi54LHIueCksTWF0aC5taW4obi55LHIueSksTWF0aC5hYnMobi54LXIueCksTWF0aC5hYnMobi55LXIueSkpKTtRYihuLHgpO1FiKHIseCk7ZS5wdXNoKG5ldyBOKE1hdGgubWluKG4ueCxyLngpLE1hdGgubWluKG4ueSxyLnkpLE1hdGguYWJzKG4ueC1yLngpLE1hdGguYWJzKG4ueS1yLnkpKSk7dGoodGhpcy4kaCx0aGlzKSYmKGY9MDxsPzA6LWwsaD0wPGI/MDotYixuLmgoZixoKSxyLmgoaytmLG0raCksYS5wdXNoKG5ldyBOKE1hdGgubWluKG4ueCxyLngpLE1hdGgubWluKG4ueSxyLnkpLE1hdGguYWJzKG4ueC1yLngpLE1hdGguYWJzKG4ueS1yLnkpKSksUWIobix4KSxRYihyLHgpLGUucHVzaChuZXcgTihNYXRoLm1pbihuLngsci54KSxNYXRoLm1pbihuLnksci55KSxNYXRoLmFicyhuLngtci54KSxNYXRoLmFicyhuLnktci55KSkpKTtHLmZyZWUobik7Ry5mcmVlKHIpO2lqKHRoaXMsITEpO251bGw9PT10aGlzLklhJiZBKCJObyBkaXYgc3BlY2lmaWVkIik7bnVsbD09PXRoaXMuRGEmJkEoIk5vIGNhbnZhcyBzcGVjaWZpZWQiKTtpZighdGhpcy5hbmltYXRpb25NYW5hZ2VyLnJiJiYoZj10aGlzLlljLHRoaXMubmMpKXtyaih0aGlzKTtoPXRoaXMuTmI7Zi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApO2YuY2xlYXJSZWN0KDAsMCx0aGlzLnhhKmgsdGhpcy53YSpoKTtmLmRyYXdJbWFnZSh0aGlzLlV0LkdhLDA8bD8wOk1hdGgucm91bmQoLWwpLDA8Yj8wOk1hdGgucm91bmQoLWIpKTtsPXRoaXMuc2E7Zz10aGlzLkNhO2s9TWF0aC5yb3VuZChsLngqZykvZzttPU1hdGgucm91bmQobC55KmcpL2c7Yj10aGlzLnRiO2IucmVzZXQoKTsxIT09ZyYmYi5zY2FsZShnKTswPT09bC54JiYwPT09bC55fHxiLnRyYW5zbGF0ZSgtaywtbSk7Zi5zYXZlKCk7Zi5iZWdpblBhdGgoKTtsPWEubGVuZ3RoO2ZvcihnPTA7ZzxsO2crKyl7az1hW2ddLDAhPT1rLndpZHRoJiYwIT09ay5oZWlnaHQmJmYucmVjdChNYXRoLmZsb29yKGsueCksTWF0aC5mbG9vcihrLnkpLE1hdGguY2VpbChrLndpZHRoKSxNYXRoLmNlaWwoay5oZWlnaHQpKTt9Zi5jbGlwKCk7Zi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApO2Yuc2NhbGUoaCxoKTtmLnRyYW5zZm9ybShiLm0xMSxiLm0xMixiLm0yMSxiLm0yMixiLmR4LGIuZHkpO2I9dGhpcy5QYS5qO2w9Yi5sZW5ndGg7dGhpcy5oZChiLGwsdGhpcyk7c2oodGhpcyxmKTtmb3IoaD0wO2g8bDtoKyspe2lmKHA9YltoXSxnPWUscC52aXNpYmxlJiYwIT09cC5sYil7MSE9PXAubGImJihmLmdsb2JhbEFscGhhPXAubGIpO2s9cC5KbztrLmxlbmd0aD0wO209dGhpcy5zY2FsZTtwPXAuRmEuajtuPXAubGVuZ3RoO3E9Zy5sZW5ndGg7Zm9yKHI9MDtyPG47cisrKXtpZih4PXBbcl0sb2coeCkpe2lmKHggaW5zdGFuY2VvZiBTJiYoeC5pc09ydGhvZ29uYWwmJmsucHVzaCh4KSwhMT09PXguTGMpKWNvbnRpbnVlO3U9emooeCx4LmFjdHVhbEJvdW5kcyk7YTp7dmFyIHY9Mi9tO2Zvcih2YXIgeT00L20sej0wO3o8cTt6Kyspe3ZhciBCPWdbel07aWYoMCE9PUIud2lkdGgmJjAhPT1CLmhlaWdodCYmdS5odihCLngtdixCLnktdixCLndpZHRoK3ksQi5oZWlnaHQreSkpe3Y9ITA7YnJlYWsgYTt9fXY9ITE7fXYmJigxPHUud2lkdGgqbXx8MTx1LmhlaWdodCptP3guaGMoZix0aGlzKTppaShmLHgpKTt9fWYuZ2xvYmFsQWxwaGE9MTt9fWYucmVzdG9yZSgpO2YuUmMoITApO3RoaXMuJGgmJnRqKHRoaXMuJGgsdGhpcykmJnRoaXMuY3IoKTt0aGlzLm5jPXRoaXMuYmk9ITE7dGhpcy5vdCgpO31PYShlKTtPYShhKTt0aGlzLlpiPSExO319ZWxzZSB0aGlzLmZkKCk7Ti5mcmVlKGQpO2MmJihLZih0aGlzKSx0aGlzLmZkKCksVWYodGhpcywhMCkpO31lbHNlIGM/KEtmKHRoaXMpLHRoaXMuZmQoKSxVZih0aGlzLCEwKSk6dGhpcy5mZCgpO319O2Z1bmN0aW9uIGhqKGEpeyExPT09YS5raiYmKGEua2o9ITApO31mdW5jdGlvbiBQaShhKXshMT09PWEuYmkmJihhLmJpPSEwKTt9ZnVuY3Rpb24gcmooYSl7ITEhPT1hLlBuJiYoYS5Qbj0hMSxBaihhLGEueGEsYS53YSkpO31mdW5jdGlvbiBBaihhLGIsYyl7dmFyIGQ9YS5OYjthLkRhLnJlc2l6ZShiKmQsYypkLGIsYykmJihhLm5jPSEwLGEuWWMuUmMoITApKTt9ZnVuY3Rpb24gTmkoYSl7dmFyIGI9YS5EYTtpZihudWxsPT09YilyZXR1cm4hMDt2YXIgYz1hLklhLGQ9YS54YSxlPWEud2EsZj1hLk53LmNvcHkoKTtpZighZi5vKCkpcmV0dXJuITA7dmFyIGc9ITEsaD1hLlpoP2EuR2I6MCxrPWEuTmc/YS5HYjowLGw9Yy5jbGllbnRXaWR0aHx8ZCtoO2M9Yy5jbGllbnRIZWlnaHR8fGUraztpZihsIT09ZCtofHxjIT09ZStrKWEuWmg9ITEsYS5OZz0hMSxrPWg9MCxhLnhhPWwsYS53YT1jLGc9YS5Qbj0hMDthLmtqPSExO3ZhciBtPWEuZG9jdW1lbnRCb3VuZHMsbj0wLHA9MCxxPTAscj0wO2w9Zi53aWR0aDtjPWYuaGVpZ2h0O3ZhciB1PWEucmk7YS5jb250ZW50QWxpZ25tZW50LmdiKCk/KG0ud2lkdGg+bCYmKG49dS5sZWZ0LHA9dS5yaWdodCksbS5oZWlnaHQ+YyYmKHE9dS50b3Ascj11LmJvdHRvbSkpOihuPXUubGVmdCxwPXUucmlnaHQscT11LnRvcCxyPXUuYm90dG9tKTt1PW0ud2lkdGgrbitwO3ZhciB4PW0uaGVpZ2h0K3ErcjtuPW0ueC1uO3ZhciB2PWYueDtwPW0ucmlnaHQrcDt2YXIgeT1mLnJpZ2h0K2g7cT1tLnktcTt2YXIgej1mLnk7cj1tLmJvdHRvbStyO3ZhciBCPWYuYm90dG9tK2ssQz0iMXB4IixJPSIxcHgiO209YS5zY2FsZTt2YXIgSj0hKHU8bCtoKSxMPSEoeDxjK2spO2Euc2Nyb2xsTW9kZT09PW9pJiYoSnx8TCkmJihKJiZhLmhhc0hvcml6b250YWxTY3JvbGxiYXImJmEuYWxsb3dIb3Jpem9udGFsU2Nyb2xsJiYoQz0xLG4rMTx2JiYoQz1NYXRoLm1heCgodi1uKSptK2EueGEsQykpLHA+eSsxJiYoQz1NYXRoLm1heCgocC15KSptK2EueGEsQykpLGwraCsxPHUmJihDPU1hdGgubWF4KCh1LWwraCkqbSthLnhhLEMpKSxDPUMudG9TdHJpbmcoKSsicHgiKSxMJiZhLmhhc1ZlcnRpY2FsU2Nyb2xsYmFyJiZhLmFsbG93VmVydGljYWxTY3JvbGwmJihJPTEscSsxPHomJihJPU1hdGgubWF4KCh6LXEpKm0rYS53YSxJKSkscj5CKzEmJihJPU1hdGgubWF4KChyLUIpKm0rYS53YSxJKSksYytrKzE8eCYmKEk9TWF0aC5tYXgoKHgtYytrKSptK2Eud2EsSSkpLEk9SS50b1N0cmluZygpKyJweCIpKTtMPSIxcHgiIT09QztKPSIxcHgiIT09STtMJiZKfHwhTCYmIUp8fChKJiYoeS09YS5HYiksTCYmKEItPWEuR2IpLHU8bCtofHwhYS5oYXNIb3Jpem9udGFsU2Nyb2xsYmFyfHwhYS5hbGxvd0hvcml6b250YWxTY3JvbGx8fChoPTEsbisxPHYmJihoPU1hdGgubWF4KCh2LW4pKm0rYS54YSxoKSkscD55KzEmJihoPU1hdGgubWF4KChwLXkpKm0rYS54YSxoKSksbCsxPHUmJihoPU1hdGgubWF4KCh1LWwpKm0rYS54YSxoKSksQz1oLnRvU3RyaW5nKCkrInB4IiksTD0iMXB4IiE9PUMsaD1hLndhLEwhPT1hLk5nJiYoaD1MP2Eud2EtYS5HYjphLndhK2EuR2IpLHg8YytrfHwhYS5oYXNWZXJ0aWNhbFNjcm9sbGJhcnx8IWEuYWxsb3dWZXJ0aWNhbFNjcm9sbHx8KGs9MSxxKzE8eiYmKGs9TWF0aC5tYXgoKHotcSkqbStoLGspKSxyPkIrMSYmKGs9TWF0aC5tYXgoKHItQikqbStoLGspKSxjKzE8eCYmKGs9TWF0aC5tYXgoKHgtYykqbStoLGspKSxJPWsudG9TdHJpbmcoKSsicHgiKSxKPSIxcHgiIT09SSk7aWYoYS5ucyYmTD09PWEuTmcmJko9PT1hLlpoKXJldHVybiBkPT09YS54YSYmZT09PWEud2F8fGEuZmQoKSwhMTtMIT09YS5OZyYmKCIxcHgiPT09Qz9hLndhPWEud2ErYS5HYjphLndhPU1hdGgubWF4KGEud2EtYS5HYiwxKSxnPSEwKTthLk5nPUw7YS5mcC5zdHlsZS53aWR0aD1DO0ohPT1hLlpoJiYoIjFweCI9PT1JP2EueGE9YS54YSthLkdiOmEueGE9TWF0aC5tYXgoYS54YS1hLkdiLDEpLGc9ITAsYS5UbiYmKGs9Ry5hbGxvYygpLEo/KGIuc3R5bGUubGVmdD1hLkdiKyJweCIsYS5wb3NpdGlvbj1rLmgoYS5zYS54K2EuR2IvYS5zY2FsZSxhLnNhLnkpKTooYi5zdHlsZS5sZWZ0PSIwcHgiLGEucG9zaXRpb249ay5oKGEuc2EueC1hLkdiL2Euc2NhbGUsYS5zYS55KSksRy5mcmVlKGspKSk7YS5aaD1KO2EuZnAuc3R5bGUuaGVpZ2h0PUk7YS50dT0hMDtnJiYoYS5Qbj0hMCk7Yj1hLnBzO2s9Yi5zY3JvbGxMZWZ0O2EuaGFzSG9yaXpvbnRhbFNjcm9sbGJhciYmYS5hbGxvd0hvcml6b250YWxTY3JvbGwmJihsKzE8dT9rPShhLnBvc2l0aW9uLngtbikqbTpuKzE8dj9rPWIuc2Nyb2xsV2lkdGgtYi5jbGllbnRXaWR0aDpwPnkrMSYmKGs9YS5wb3NpdGlvbi54Km0pKTtpZihhLlRuKXN3aXRjaChhLnJ1KXtjYXNlIm5lZ2F0aXZlIjprPS0oYi5zY3JvbGxXaWR0aC1rLWIuY2xpZW50V2lkdGgpO2JyZWFrO2Nhc2UicmV2ZXJzZSI6az1iLnNjcm9sbFdpZHRoLWstYi5jbGllbnRXaWR0aDt9Yi5zY3JvbGxMZWZ0PWs7YS5oYXNWZXJ0aWNhbFNjcm9sbGJhciYmYS5hbGxvd1ZlcnRpY2FsU2Nyb2xsJiYoYysxPHg/Yi5zY3JvbGxUb3A9KGEucG9zaXRpb24ueS1xKSptOnErMTx6P2Iuc2Nyb2xsVG9wPWIuc2Nyb2xsSGVpZ2h0LWIuY2xpZW50SGVpZ2h0OnI+QisxJiYoYi5zY3JvbGxUb3A9YS5wb3NpdGlvbi55Km0pKTtsPWEueGE7Yz1hLndhO2Iuc3R5bGUud2lkdGg9bCsoYS5aaD9hLkdiOjApKyJweCI7Yi5zdHlsZS5oZWlnaHQ9YysoYS5OZz9hLkdiOjApKyJweCI7cmV0dXJuIGQhPT1sfHxlIT09Y3x8YS5hbmltYXRpb25NYW5hZ2VyLnJiPyhhLmlxKGYsYS52aWV3cG9ydEJvdW5kcyxtLGcpLCExKTohMDt9dC5hZGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kaWFncmFtO2lmKGIhPT10aGlzJiYobnVsbCE9PWImJkEoIkNhbm5vdCBhZGQgcGFydCAiK2EudG9TdHJpbmcoKSsiIHRvICIrdGhpcy50b1N0cmluZygpKyIuIEl0IGlzIGFscmVhZHkgYSBwYXJ0IG9mICIrYi50b1N0cmluZygpKSxiPXRoaXMuWmwoYS5sYXllck5hbWUpLG51bGw9PT1iJiYoYj10aGlzLlpsKCIiKSksbnVsbD09PWImJkEoJ0Nhbm5vdCBhZGQgYSBQYXJ0IHdoZW4gdW5hYmxlIGZpbmQgYSBMYXllciBuYW1lZCAiJythLmxheWVyTmFtZSsnIiBhbmQgdGhlcmUgaXMgbm8gZGVmYXVsdCBMYXllcicpLGEubGF5ZXIhPT1iKSl7dmFyIGM9Yi5OaSg5OTk5OTk5OSxhLGEuZGlhZ3JhbT09PXRoaXMpOzA8PWMmJnRoaXMuYWIoY2YsInBhcnRzIixiLG51bGwsYSxudWxsLGMpO2IuaXNUZW1wb3Jhcnl8fHRoaXMuWGEoKTthLkIoMSk7Yz1hLmxheWVyQ2hhbmdlZDtudWxsIT09YyYmYyhhLG51bGwsYik7fX07dC5OaT1mdW5jdGlvbihhKXt0aGlzLnBhcnRNYW5hZ2VyLk5pKGEpO3ZhciBiPXRoaXM7QmooYSxmdW5jdGlvbihhKXtDaihiLGEpO30pOyhhIGluc3RhbmNlb2YgcGZ8fGEgaW5zdGFuY2VvZiBpZyYmbnVsbCE9PWEucGxhY2Vob2xkZXIpJiZhLnMoKTtudWxsIT09YS5kYXRhJiZCaihhLGZ1bmN0aW9uKGEpe0RqKGIucGFydE1hbmFnZXIsYSk7fSk7ITAhPT1waihhKSYmITAhPT1xaihhKXx8dGhpcy5EZC5hZGQoYSk7RWooYSwhMCx0aGlzKTtGaihhKT8oYS5hY3R1YWxCb3VuZHMubygpJiZ0aGlzLlIoemooYSxhLmFjdHVhbEJvdW5kcykpLHRoaXMuWGEoKSk6YS5pc1Zpc2libGUoKSYmYS5hY3R1YWxCb3VuZHMubygpJiZ0aGlzLlIoemooYSxhLmFjdHVhbEJvdW5kcykpO3RoaXMuY2MoKTt9O3QueGM9ZnVuY3Rpb24oYSl7YS5TaigpO3RoaXMucGFydE1hbmFnZXIueGMoYSk7dmFyIGI9dGhpcztCaihhLGZ1bmN0aW9uKGEpe0dqKGIsYSk7fSk7bnVsbCE9PWEuZGF0YSYmQmooYSxmdW5jdGlvbihhKXtIaihiLnBhcnRNYW5hZ2VyLGEpO30pO3RoaXMuRGQucmVtb3ZlKGEpO0ZqKGEpPyhhLmFjdHVhbEJvdW5kcy5vKCkmJnRoaXMuUih6aihhLGEuYWN0dWFsQm91bmRzKSksdGhpcy5YYSgpKTphLmlzVmlzaWJsZSgpJiZhLmFjdHVhbEJvdW5kcy5vKCkmJnRoaXMuUih6aihhLGEuYWN0dWFsQm91bmRzKSk7dGhpcy5jYygpO307dC5yZW1vdmU9ZnVuY3Rpb24oYSl7SWoodGhpcyxhLCEwKTt9O2Z1bmN0aW9uIElqKGEsYixjKXt2YXIgZD1iLmxheWVyO2lmKG51bGwhPT1kJiZkLmRpYWdyYW09PT1hKXtiLmlzU2VsZWN0ZWQ9ITE7Yi5pc0hpZ2hsaWdodGVkPSExO3ZhciBlPWEuYW5pbWF0aW9uTWFuYWdlcjtlLllnJiZiLkxiKCkmJmUuYW5pbWF0aW9uUmVhc29ucy5jb250YWlucygiUmVtb3ZlIikmJihlLnllKGIsInNjYWxlIixiLnNjYWxlLC4wMSwhMSksZS55ZShiLCJhbmdsZSIsYi5hbmdsZSwxODAsITEpKTtiLkIoMik7YyYmYi5ZaigpO2M9ZC54YygtMSxiLCExKTswPD1jJiZhLmFiKGRmLCJwYXJ0cyIsZCxiLG51bGwsYyxudWxsKTthPWIubGF5ZXJDaGFuZ2VkO251bGwhPT1hJiZhKGIsZCxudWxsKTt9fXQucnQ9ZnVuY3Rpb24oYSxiKXtpZihFYShhKSlmb3IodmFyIGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe3ZhciBlPWFbZF07YiYmIWUuY2FuRGVsZXRlKCl8fHRoaXMucmVtb3ZlKGUpO31lbHNlIGZvcihjPW5ldyBGKCksYy5hZGRBbGwoYSksYT1jLml0ZXJhdG9yO2EubmV4dCgpOyl7Yz1hLnZhbHVlLGImJiFjLmNhbkRlbGV0ZSgpfHx0aGlzLnJlbW92ZShjKTt9fTt0LlhqPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5wYXJ0TWFuYWdlci5YaihhLGIsYyk7fTtQLnByb3RvdHlwZS5tb3ZlUGFydHM9ZnVuY3Rpb24oYSxiLGMsZCl7dm9pZCAwPT09ZCYmKGQ9SmoodGhpcykpO2lmKG51bGwhPT10aGlzLnRvb2xNYW5hZ2VyKXt2YXIgZT1uZXcgTGIoKTtpZihudWxsIT09YSl7aWYoRWEoYSkpZm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspe0tqKHRoaXMsZSxhW2ZdLGMsZCk7fWVsc2UgZm9yKGE9YS5pdGVyYXRvcjthLm5leHQoKTspe0tqKHRoaXMsZSxhLnZhbHVlLGMsZCk7fX1lbHNle2ZvcihhPXRoaXMucGFydHM7YS5uZXh0KCk7KXtLaih0aGlzLGUsYS52YWx1ZSxjLGQpO31mb3IoYT10aGlzLm5vZGVzO2EubmV4dCgpOyl7S2oodGhpcyxlLGEudmFsdWUsYyxkKTt9Zm9yKGE9dGhpcy5saW5rczthLm5leHQoKTspe0tqKHRoaXMsZSxhLnZhbHVlLGMsZCk7fX1iZyh0aGlzLGUsYixkLGMpO319O2Z1bmN0aW9uIEtqKGEsYixjLGQsZSl7dm9pZCAwPT09ZSYmKGU9SmooYSkpO2lmKCFiLmNvbnRhaW5zKGMpJiYoIWR8fGMuY2FuTW92ZSgpfHxjLmNhbkNvcHkoKSkpaWYoYyBpbnN0YW5jZW9mIFYpe2IuYWRkKGMsYS5wZChlLGMsYy5sb2NhdGlvbikpO2lmKGMgaW5zdGFuY2VvZiBpZylmb3IodmFyIGY9Yy5tZW1iZXJQYXJ0cztmLm5leHQoKTspe0tqKGEsYixmLnZhbHVlLGQsZSk7fWZvcihmPWMubGlua3NDb25uZWN0ZWQ7Zi5uZXh0KCk7KXt2YXIgZz1mLnZhbHVlO2lmKCFiLmNvbnRhaW5zKGcpKXt2YXIgaD1nLmZyb21Ob2RlLGs9Zy50b05vZGU7bnVsbCE9PWgmJmIuY29udGFpbnMoaCkmJm51bGwhPT1rJiZiLmNvbnRhaW5zKGspJiZLaihhLGIsZyxkLGUpO319aWYoZS5kcmFnc1RyZWUpZm9yKGM9Yy4kdSgpO2MubmV4dCgpOyl7S2ooYSxiLGMudmFsdWUsZCxlKTt9fWVsc2UgaWYoYyBpbnN0YW5jZW9mIFMpZm9yKGIuYWRkKGMsYS5wZChlLGMpKSxjPWMubGFiZWxOb2RlcztjLm5leHQoKTspe0tqKGEsYixjLnZhbHVlLGQsZSk7fWVsc2UgYyBpbnN0YW5jZW9mIHBmfHxiLmFkZChjLGEucGQoZSxjLGMubG9jYXRpb24pKTt9ZnVuY3Rpb24gYmcoYSxiLGMsZCxlKXtpZihudWxsIT09YiYmMCE9PWIuY291bnQpe3ZhciBmPUcuYWxsb2MoKSxnPUcuYWxsb2MoKTtnLmFzc2lnbihjKTtpc05hTihnLngpJiYoZy54PTApO2lzTmFOKGcueSkmJihnLnk9MCk7KGM9YS52cCl8fExmKGEsYik7Zm9yKHZhciBoPUthKCksaz1LYSgpLGw9Yi5pdGVyYXRvcixtPUcuYWxsb2MoKTtsLm5leHQoKTspe3ZhciBuPWwua2V5LHA9bC52YWx1ZTtpZihuLkxiKCkpe3ZhciBxPUxqKGEsbixiKTtpZihudWxsIT09cSloLnB1c2gobmV3IE1qKG4scCxxKSk7ZWxzZSBpZighZXx8bi5jYW5Nb3ZlKCkpcT1wLnBvaW50LGYuYXNzaWduKHEpLGEuY29tcHV0ZU1vdmUobixmLmFkZChnKSxkLG0pLG4ubG9jYXRpb249bSx2b2lkIDA9PT1wLnNoaWZ0ZWQmJihwLnNoaWZ0ZWQ9bmV3IEcoKSkscC5zaGlmdGVkLmFzc2lnbihtLlhkKHEpKTt9ZWxzZSBsLmtleSBpbnN0YW5jZW9mIFMmJmsucHVzaChsLm5hKTt9Ry5mcmVlKG0pO2U9aC5sZW5ndGg7Zm9yKGw9MDtsPGU7bCsrKXtuPWhbbF0sZi5hc3NpZ24obi5pbmZvLnBvaW50KSx2b2lkIDA9PT1uLmV2LnNoaWZ0ZWQmJihuLmV2LnNoaWZ0ZWQ9bmV3IEcoKSksbi5ub2RlLmxvY2F0aW9uPWYuYWRkKG4uZXYuc2hpZnRlZCk7fWU9Ry5hbGxvYygpO2w9Ry5hbGxvYygpO249ay5sZW5ndGg7Zm9yKHA9MDtwPG47cCsrKXt2YXIgcj1rW3BdO3E9ci5rZXk7aWYocSBpbnN0YW5jZW9mIFMpaWYocS5zdXNwZW5kc1JvdXRpbmcpe3EuYmg9bnVsbDttPXEuZnJvbU5vZGU7dmFyIHU9cS50b05vZGU7aWYobnVsbCE9PWEuZHJhZ2dlZExpbmsmJmQuZHJhZ3NMaW5rKXtpZih1PXIudmFsdWUucG9pbnQsbnVsbD09PXEuZHJhZ0NvbXB1dGF0aW9uKWIuYWRkKHEsYS5wZChkLHEsZykpLCRmKHEsZy54LXUueCxnLnktdS55KTtlbHNle3I9Ry5hbGxvY0F0KDAsMCk7KG09cS5pKDApKSYmbS5vKCkmJnIuYXNzaWduKG0pO3ZhciB4PW09Ry5hbGxvYygpLmFzc2lnbihyKS5hZGQoZyk7ZC5pc0dyaWRTbmFwRW5hYmxlZCYmKGQuaXNHcmlkU25hcFJlYWx0aW1lfHxhLmxhc3RJbnB1dC51cCkmJih4PUcuYWxsb2MoKSxmaChhLHEsbSx4LGQpKTttLmFzc2lnbihxLmRyYWdDb21wdXRhdGlvbihxLG0seCkpLlhkKHIpO2IuYWRkKHEsYS5wZChkLHEsbSkpOyRmKHEsbS54LXUueCxtLnktdS55KTtHLmZyZWUocik7Ry5mcmVlKG0pO3ghPT1tJiZHLmZyZWUoeCk7fX1lbHNlIG51bGwhPT1tJiYoZS5hc3NpZ24obS5sb2NhdGlvbikseD1iLkoobSksbnVsbCE9PXgmJmUuWGQoeC5wb2ludCkpLG51bGwhPT11JiYobC5hc3NpZ24odS5sb2NhdGlvbikseD1iLkoodSksbnVsbCE9PXgmJmwuWGQoeC5wb2ludCkpLG51bGwhPT1tJiZudWxsIT09dT9lLlFhKGwpPyhtPXIudmFsdWUucG9pbnQsdT1mLHUuYXNzaWduKGUpLHUuWGQobSksYi5hZGQocSxhLnBkKGQscSxlKSksJGYocSx1LngsdS55KSk6KHEuc3VzcGVuZHNSb3V0aW5nPSExLHEuUmEoKSk6KHI9ci52YWx1ZS5wb2ludCxtPW51bGwhPT1tP2U6bnVsbCE9PXU/bDpnLGIuYWRkKHEsYS5wZChkLHEsbSkpLCRmKHEsbS54LXIueCxtLnktci55KSk7fWVsc2UgaWYobnVsbD09PXEuZnJvbU5vZGV8fG51bGw9PT1xLnRvTm9kZSltPXIudmFsdWUucG9pbnQsYi5hZGQocSxhLnBkKGQscSxnKSksJGYocSxnLngtbS54LGcueS1tLnkpO31HLmZyZWUoZik7Ry5mcmVlKGcpO0cuZnJlZShlKTtHLmZyZWUobCk7T2EoaCk7T2Eoayk7Y3x8KFFpKGEpLFFmKGEsYikpO319UC5wcm90b3R5cGUuY29tcHV0ZU1vdmU9ZnVuY3Rpb24oYSxiLGMsZCl7dm9pZCAwPT09ZCYmKGQ9bmV3IEcoKSk7ZC5hc3NpZ24oYik7aWYobnVsbD09PWEpcmV0dXJuIGQ7dmFyIGU9YixmPWMuaXNHcmlkU25hcEVuYWJsZWQ7ZiYmKGMuaXNHcmlkU25hcFJlYWx0aW1lfHx0aGlzLmxhc3RJbnB1dC51cCkmJihlPUcuYWxsb2MoKSxmaCh0aGlzLGEsYixlLGMpKTtjPW51bGwhPT1hLmRyYWdDb21wdXRhdGlvbj9hLmRyYWdDb21wdXRhdGlvbihhLGIsZSk6ZTt2YXIgZz1hLm1pbkxvY2F0aW9uLGg9Zy54O2lzTmFOKGgpJiYoaD1mP01hdGgucm91bmQoYS5sb2NhdGlvbi54KTphLmxvY2F0aW9uLngpO2c9Zy55O2lzTmFOKGcpJiYoZz1mP01hdGgucm91bmQoYS5sb2NhdGlvbi55KTphLmxvY2F0aW9uLnkpO3ZhciBrPWEubWF4TG9jYXRpb24sbD1rLng7aXNOYU4obCkmJihsPWY/TWF0aC5yb3VuZChhLmxvY2F0aW9uLngpOmEubG9jYXRpb24ueCk7az1rLnk7aXNOYU4oaykmJihrPWY/TWF0aC5yb3VuZChhLmxvY2F0aW9uLnkpOmEubG9jYXRpb24ueSk7ZC5oKE1hdGgubWF4KGgsTWF0aC5taW4oYy54LGwpKSxNYXRoLm1heChnLE1hdGgubWluKGMueSxrKSkpO2UhPT1iJiZHLmZyZWUoZSk7cmV0dXJuIGQ7fTtmdW5jdGlvbiBKaihhKXt2YXIgYj1hLnRvb2xNYW5hZ2VyLmZpbmRUb29sKCJEcmFnZ2luZyIpO3JldHVybiBudWxsIT09Yj9iLmRyYWdPcHRpb25zOmEuTGs7fWZ1bmN0aW9uIGZoKGEsYixjLGQsZSl7dm9pZCAwPT09ZSYmKGU9SmooYSkpO2QuYXNzaWduKGMpO2lmKG51bGwhPT1iKXt2YXIgZj1hLmdyaWQ7Yj1lLmdyaWRTbmFwQ2VsbFNpemU7YT1iLndpZHRoO2I9Yi5oZWlnaHQ7dmFyIGc9ZS5ncmlkU25hcE9yaWdpbixoPWcueDtnPWcueTtlPWUuZ3JpZFNuYXBDZWxsU3BvdDtpZihudWxsIT09Zil7dmFyIGs9Zi5ncmlkQ2VsbFNpemU7aXNOYU4oYSkmJihhPWsud2lkdGgpO2lzTmFOKGIpJiYoYj1rLmhlaWdodCk7Zj1mLmdyaWRPcmlnaW47aXNOYU4oaCkmJihoPWYueCk7aXNOYU4oZykmJihnPWYueSk7fWY9Ry5hbGxvY0F0KDAsMCk7Zi5xaygwLDAsYSxiLGUpO0guVHAoYy54LGMueSxoK2YueCxnK2YueSxhLGIsZCk7Ry5mcmVlKGYpO319ZnVuY3Rpb24gTGYoYSxiKXtpZihudWxsIT09Yilmb3IoYS52cD0hMCxhPWIuaXRlcmF0b3I7YS5uZXh0KCk7KXtiPWEua2V5LGIgaW5zdGFuY2VvZiBTJiYoYi5zdXNwZW5kc1JvdXRpbmc9ITApO319ZnVuY3Rpb24gUWYoYSxiKXtpZihudWxsIT09Yil7Zm9yKGI9Yi5pdGVyYXRvcjtiLm5leHQoKTspe3ZhciBjPWIua2V5O2MgaW5zdGFuY2VvZiBTJiYoYy5zdXNwZW5kc1JvdXRpbmc9ITEsTmooYykmJmMuUmEoKSk7fWEudnA9ITE7fX1mdW5jdGlvbiBMaihhLGIsYyl7Yj1iLmNvbnRhaW5pbmdHcm91cDtpZihudWxsIT09Yil7YT1MaihhLGIsYyk7aWYobnVsbCE9PWEpcmV0dXJuIGE7YT1jLkooYik7aWYobnVsbCE9PWEpcmV0dXJuIGE7fXJldHVybiBudWxsO310PVAucHJvdG90eXBlO3QucGQ9ZnVuY3Rpb24oYSxiLGMpe2lmKHZvaWQgMD09PWMpcmV0dXJuIG5ldyBPZihhYyk7dmFyIGQ9YS5pc0dyaWRTbmFwRW5hYmxlZDthLmt6fHxudWxsPT09Yi5jb250YWluaW5nR3JvdXB8fChkPSExKTtyZXR1cm4gZD9uZXcgT2YobmV3IEcoTWF0aC5yb3VuZChjLngpLE1hdGgucm91bmQoYy55KSkpOm5ldyBPZihjLmNvcHkoKSk7fTtmdW5jdGlvbiBPaihhLGIsYyl7bnVsbCE9PWIuZGlhZ3JhbSYmYi5kaWFncmFtIT09YSYmQSgiQ2Fubm90IHNoYXJlIGEgTGF5ZXIgd2l0aCBhbm90aGVyIERpYWdyYW06ICIrYisiIG9mICIrYi5kaWFncmFtKTtudWxsPT09Yz9udWxsIT09Yi5kaWFncmFtJiZBKCJDYW5ub3QgYWRkIGFuIGV4aXN0aW5nIExheWVyIHRvIHRoaXMgRGlhZ3JhbSBhZ2FpbjogIitiKTooYy5kaWFncmFtIT09YSYmQSgiRXhpc3RpbmcgTGF5ZXIgbXVzdCBiZSBpbiB0aGlzIERpYWdyYW06ICIrYysiIG5vdCBpbiAiK2MuZGlhZ3JhbSksYj09PWMmJkEoIkNhbm5vdCBtb3ZlIGEgTGF5ZXIgYmVmb3JlIG9yIGFmdGVyIGl0c2VsZjogIitiKSk7aWYoYi5kaWFncmFtIT09YSl7Yj1iLm5hbWU7YT1hLlBhO2M9YS5jb3VudDtmb3IodmFyIGQ9MDtkPGM7ZCsrKXthLk4oZCkubmFtZT09PWImJkEoIkNhbm5vdCBhZGQgTGF5ZXIgd2l0aCB0aGUgbmFtZSAnIitiKyInOyBhIExheWVyIHdpdGggdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBEaWFncmFtLiIpO319fXQuUWw9ZnVuY3Rpb24oYSl7T2oodGhpcyxhLG51bGwpO2EuaGIodGhpcyk7dmFyIGI9dGhpcy5QYSxjPWIuY291bnQtMTtpZighYS5pc1RlbXBvcmFyeSlmb3IoOzA8PWMmJmIuTihjKS5pc1RlbXBvcmFyeTspe2MtLTt9Yi5JYihjKzEsYSk7bnVsbCE9PXRoaXMuJGImJnRoaXMuYWIoY2YsImxheWVycyIsdGhpcyxudWxsLGEsbnVsbCxjKzEpO3RoaXMuUigpO3RoaXMuWGEoKTt9O3QuUnc9ZnVuY3Rpb24oYSxiKXtPaih0aGlzLGEsYik7YS5oYih0aGlzKTt2YXIgYz10aGlzLlBhLGQ9Yy5pbmRleE9mKGEpOzA8PWQmJihjLnJlbW92ZShhKSxudWxsIT09dGhpcy4kYiYmdGhpcy5hYihkZiwibGF5ZXJzIix0aGlzLGEsbnVsbCxkLG51bGwpKTt2YXIgZT1jLmNvdW50LGY7Zm9yKGY9MDtmPGU7ZisrKXtpZihjLk4oZik9PT1iKXtjLkliKGYsYSk7YnJlYWs7fX1udWxsIT09dGhpcy4kYiYmdGhpcy5hYihjZiwibGF5ZXJzIix0aGlzLG51bGwsYSxudWxsLGYpO3RoaXMuUigpOzA+ZCYmdGhpcy5YYSgpO307dC5oeT1mdW5jdGlvbihhLGIpe09qKHRoaXMsYSxiKTthLmhiKHRoaXMpO3ZhciBjPXRoaXMuUGEsZD1jLmluZGV4T2YoYSk7MDw9ZCYmKGMucmVtb3ZlKGEpLG51bGwhPT10aGlzLiRiJiZ0aGlzLmFiKGRmLCJsYXllcnMiLHRoaXMsYSxudWxsLGQsbnVsbCkpO3ZhciBlPWMuY291bnQsZjtmb3IoZj0wO2Y8ZTtmKyspe2lmKGMuTihmKT09PWIpe2MuSWIoZisxLGEpO2JyZWFrO319bnVsbCE9PXRoaXMuJGImJnRoaXMuYWIoY2YsImxheWVycyIsdGhpcyxudWxsLGEsbnVsbCxmKzEpO3RoaXMuUigpOzA+ZCYmdGhpcy5YYSgpO307dC5Mej1mdW5jdGlvbihhKXthLmRpYWdyYW0hPT10aGlzJiZBKCJDYW5ub3QgcmVtb3ZlIGEgTGF5ZXIgZnJvbSBhbm90aGVyIERpYWdyYW06ICIrYSsiIG9mICIrYS5kaWFncmFtKTtpZigiIiE9PWEubmFtZSl7dmFyIGI9dGhpcy5QYSxjPWIuaW5kZXhPZihhKTtpZihiLnJlbW92ZShhKSl7Zm9yKGI9YS5GYS5jb3B5KCkuaXRlcmF0b3I7Yi5uZXh0KCk7KXt2YXIgZD1iLnZhbHVlLGU9ZC5sYXllck5hbWU7ZSE9PWEubmFtZT9kLmxheWVyTmFtZT1lOmQubGF5ZXJOYW1lPSIiO31udWxsIT09dGhpcy4kYiYmdGhpcy5hYihkZiwibGF5ZXJzIix0aGlzLGEsbnVsbCxjLG51bGwpO3RoaXMuUigpO3RoaXMuWGEoKTt9fX07dC5abD1mdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5sYXllcnM7Yi5uZXh0KCk7KXt2YXIgYz1iLnZhbHVlO2lmKGMubmFtZT09PWEpcmV0dXJuIGM7fXJldHVybiBudWxsO307dC5Udz1mdW5jdGlvbihhKXtudWxsPT09dGhpcy5uZSYmKHRoaXMubmU9bmV3IEUoKSk7dGhpcy5uZS5hZGQoYSk7dGhpcy5tb2RlbC5yaChhKTt9O3QuTno9ZnVuY3Rpb24oYSl7bnVsbCE9PXRoaXMubmUmJih0aGlzLm5lLnJlbW92ZShhKSwwPT09dGhpcy5uZS5jb3VudCYmKHRoaXMubmU9bnVsbCkpO3RoaXMubW9kZWwucGsoYSk7fTt0LnJoPWZ1bmN0aW9uKGEpe251bGw9PT10aGlzLnpmJiYodGhpcy56Zj1uZXcgRSgpKTt0aGlzLnpmLmFkZChhKTt9O3QucGs9ZnVuY3Rpb24oYSl7bnVsbCE9PXRoaXMuemYmJih0aGlzLnpmLnJlbW92ZShhKSwwPT09dGhpcy56Zi5jb3VudCYmKHRoaXMuemY9bnVsbCkpO307dC5Lcz1mdW5jdGlvbihhKXt0aGlzLnNraXBzVW5kb01hbmFnZXJ8fHRoaXMubW9kZWwuc2tpcHNVbmRvTWFuYWdlcnx8dGhpcy5tb2RlbC51bmRvTWFuYWdlci5mdihhKTthLmNoYW5nZSE9PWJmJiYodGhpcy5pc01vZGlmaWVkPSEwKTtpZihudWxsIT09dGhpcy56Zilmb3IodmFyIGI9dGhpcy56ZixjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtiLk4oZCkoYSk7fX07dC5hYj1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2b2lkIDA9PT1mJiYoZj1udWxsKTt2b2lkIDA9PT1nJiYoZz1udWxsKTt2YXIgaD1uZXcgJGUoKTtoLmRpYWdyYW09dGhpcztoLmNoYW5nZT1hO2gucHJvcGVydHlOYW1lPWI7aC5vYmplY3Q9YztoLm9sZFZhbHVlPWQ7aC5vbGRQYXJhbT1mO2gubmV3VmFsdWU9ZTtoLm5ld1BhcmFtPWc7dGhpcy5LcyhoKTt9O3QuZz1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMuYWIoYWYsYSx0aGlzLGIsYyxkLGUpO307dC5Saj1mdW5jdGlvbihhLGIpe2lmKG51bGwhPT1hJiZhLmRpYWdyYW09PT10aGlzKXt2YXIgYz10aGlzLnNraXBzTW9kZWxTb3VyY2VCaW5kaW5nczt0cnl7dGhpcy5za2lwc01vZGVsU291cmNlQmluZGluZ3M9ITA7dmFyIGQ9YS5jaGFuZ2U7aWYoZD09PWFmKXt2YXIgZT1hLm9iamVjdDtQaihlLGEucHJvcGVydHlOYW1lLGEuSihiKSk7aWYoZSBpbnN0YW5jZW9mIFkpe3ZhciBmPWUucGFydDtudWxsIT09ZiYmZi5KYigpO310aGlzLmlzTW9kaWZpZWQ9ITA7fWVsc2UgaWYoZD09PWNmKXt2YXIgZz1hLm9iamVjdCxoPWEubmV3UGFyYW0saz1hLm5ld1ZhbHVlO2lmKGcgaW5zdGFuY2VvZiBYKXtpZigibnVtYmVyIj09PXR5cGVvZiBoJiZrIGluc3RhbmNlb2YgWSl7Yj9nLnhjKGgpOmcuSWIoaCxrKTt2YXIgbD1nLnBhcnQ7bnVsbCE9PWwmJmwuSmIoKTt9ZWxzZXtpZigibnVtYmVyIj09PXR5cGVvZiBoJiZrIGluc3RhbmNlb2YgUWopaWYoYilrLmlzUm93P2cuQXYoaCk6Zy55dihoKTtlbHNle3ZhciBtPWsuaXNSb3c/Zy5nZXRSb3dEZWZpbml0aW9uKGsuaW5kZXgpOmcuZ2V0Q29sdW1uRGVmaW5pdGlvbihrLmluZGV4KTttLlZsKGspO319fWVsc2UgaWYoZyBpbnN0YW5jZW9mIGZpKXt2YXIgbj0hMD09PWEub2xkUGFyYW07Im51bWJlciI9PT10eXBlb2YgaCYmayBpbnN0YW5jZW9mIFQmJihiPyhrLmlzU2VsZWN0ZWQ9ITEsay5pc0hpZ2hsaWdodGVkPSExLGsuSmIoKSxnLnhjKG4/aDotMSxrLG4pKTpnLk5pKGgsayxuKSk7fWVsc2UgZyBpbnN0YW5jZW9mIFA/Im51bWJlciI9PT10eXBlb2YgaCYmayBpbnN0YW5jZW9mIGZpJiYoYj90aGlzLlBhLm1iKGgpOihrLmhiKHRoaXMpLHRoaXMuUGEuSWIoaCxrKSkpOkEoInVua25vd24gQ2hhbmdlZEV2ZW50Lkluc2VydCBvYmplY3Q6ICIrYS50b1N0cmluZygpKTt0aGlzLmlzTW9kaWZpZWQ9ITA7fWVsc2UgaWYoZD09PWRmKXt2YXIgcD1hLm9iamVjdCxxPWEub2xkUGFyYW0scj1hLm9sZFZhbHVlO2lmKHAgaW5zdGFuY2VvZiBYKSJudW1iZXIiPT09dHlwZW9mIHEmJnIgaW5zdGFuY2VvZiBZP2I/cC5JYihxLHIpOnAueGMocSk6Im51bWJlciI9PT10eXBlb2YgcSYmciBpbnN0YW5jZW9mIFFqJiYoYj8obT1yLmlzUm93P3AuZ2V0Um93RGVmaW5pdGlvbihyLmluZGV4KTpwLmdldENvbHVtbkRlZmluaXRpb24oci5pbmRleCksbS5WbChyKSk6ci5pc1Jvdz9wLkF2KHEpOnAueXYocSkpO2Vsc2UgaWYocCBpbnN0YW5jZW9mIGZpKXt2YXIgdT0hMD09PWEubmV3UGFyYW07Im51bWJlciI9PT10eXBlb2YgcSYmciBpbnN0YW5jZW9mIFQmJihiPzA+cC5GYS5pbmRleE9mKHIpJiZwLk5pKHEscix1KTooci5pc1NlbGVjdGVkPSExLHIuaXNIaWdobGlnaHRlZD0hMSxyLkpiKCkscC54Yyh1P3E6LTEscix1KSkpO31lbHNlIHAgaW5zdGFuY2VvZiBQPyJudW1iZXIiPT09dHlwZW9mIHEmJnIgaW5zdGFuY2VvZiBmaSYmKGI/KHIuaGIodGhpcyksdGhpcy5QYS5JYihxLHIpKTp0aGlzLlBhLm1iKHEpKTpBKCJ1bmtub3duIENoYW5nZWRFdmVudC5SZW1vdmUgb2JqZWN0OiAiK2EudG9TdHJpbmcoKSk7dGhpcy5pc01vZGlmaWVkPSEwO31lbHNlIGQhPT1iZiYmQSgidW5rbm93biBDaGFuZ2VkRXZlbnQ6ICIrYS50b1N0cmluZygpKTt9ZmluYWxseXt0aGlzLnNraXBzTW9kZWxTb3VyY2VCaW5kaW5ncz1jO319fTt0LkFhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVuZG9NYW5hZ2VyLkFhKGEpO307dC5aYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51bmRvTWFuYWdlci5aYShhKTt9O3QudWY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmRvTWFuYWdlci51ZigpO307UC5wcm90b3R5cGUuY29tbWl0PWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9IiIpO3ZhciBjPXRoaXMuc2tpcHNVbmRvTWFuYWdlcjtudWxsPT09YiYmKHRoaXMuc2tpcHNVbmRvTWFuYWdlcj0hMCxiPSIiKTt0aGlzLnVuZG9NYW5hZ2VyLkFhKGIpO3ZhciBkPSExO3RyeXthKHRoaXMpLGQ9ITA7fWZpbmFsbHl7ZD90aGlzLnVuZG9NYW5hZ2VyLlphKGIpOnRoaXMudW5kb01hbmFnZXIudWYoKSx0aGlzLnNraXBzVW5kb01hbmFnZXI9Yzt9fTtQLnByb3RvdHlwZS51cGRhdGVBbGxUYXJnZXRCaW5kaW5ncz1mdW5jdGlvbihhKXt0aGlzLnBhcnRNYW5hZ2VyLnVwZGF0ZUFsbFRhcmdldEJpbmRpbmdzKGEpO307dD1QLnByb3RvdHlwZTt0LnRxPWZ1bmN0aW9uKCl7dGhpcy5wYXJ0TWFuYWdlci50cSgpO307ZnVuY3Rpb24gUmooYSxiLGMpe3ZhciBkPWEuYW5pbWF0aW9uTWFuYWdlcjtpZihhLm9ifHxhLlpiKWEuQ2E9YyxlaShkLGIsYS5DYSk7ZWxzZSBpZihhLm9iPSEwLG51bGw9PT1hLkRhKWEuQ2E9YztlbHNle3ZhciBlPWEudmlld3BvcnRCb3VuZHMuY29weSgpLGY9YS54YSxnPWEud2E7ZS53aWR0aD1hLnhhL2I7ZS5oZWlnaHQ9YS53YS9iO3ZhciBoPWEuem9vbVBvaW50Lngsaz1hLnpvb21Qb2ludC55LGw9YS5jb250ZW50QWxpZ25tZW50O2lzTmFOKGgpJiYobC5xZigpP2wucGYoamQpP2g9MDpsLnBmKHBkKSYmKGg9Zi0xKTpoPWwuZ2IoKT9sLngqKGYtMSk6Zi8yKTtpc05hTihrKSYmKGwucWYoKT9sLnBmKGlkKT9rPTA6bC5wZihxZCkmJihrPWctMSk6az1sLmdiKCk/bC55KihnLTEpOmcvMik7bnVsbCE9PWEuc2NhbGVDb21wdXRhdGlvbiYmKGM9YS5zY2FsZUNvbXB1dGF0aW9uKGEsYykpO2M8YS5taW5TY2FsZSYmKGM9YS5taW5TY2FsZSk7Yz5hLm1heFNjYWxlJiYoYz1hLm1heFNjYWxlKTtmPUcuYWxsb2NBdChhLnNhLngraC9iLWgvYyxhLnNhLnkray9iLWsvYyk7YS5wb3NpdGlvbj1mO0cuZnJlZShmKTthLkNhPWM7YS5pcShlLGEudmlld3BvcnRCb3VuZHMsYiwhMSk7YS5vYj0hMTtTaShhLCExKTtlaShkLGIsYS5DYSk7YS5SKCk7aGooYSk7fX10LmlxPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFhLkEoYikpe3ZvaWQgMD09PWQmJihkPSExKTtkfHxoaih0aGlzKTtQaSh0aGlzKTt2YXIgZT10aGlzLmxheW91dDtudWxsPT09ZXx8IWUuaXNWaWV3cG9ydFNpemVkfHx0aGlzLmF1dG9TY2FsZSE9PXBpfHxkfHxhLndpZHRoPT09Yi53aWR0aCYmYS5oZWlnaHQ9PT1iLmhlaWdodHx8ZS5CKCk7ZT10aGlzLmN1cnJlbnRUb29sOyEwPT09dGhpcy5oZSYmZSBpbnN0YW5jZW9mIFVhJiYodGhpcy5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludD10aGlzLnl0KHRoaXMubGFzdElucHV0LnZpZXdQb2ludCksdGYoZSx0aGlzKSk7dGhpcy5vYnx8dGhpcy5veChhLGIpO2tqKHRoaXMpO3RoaXMud2Uuc2NhbGU9Yzt0aGlzLndlLnBvc2l0aW9uLng9YS54O3RoaXMud2UucG9zaXRpb24ueT1hLnk7dGhpcy53ZS5ib3VuZHMuYXNzaWduKGEpO3RoaXMud2UucXg9ZDt0aGlzLmFhKCJWaWV3cG9ydEJvdW5kc0NoYW5nZWQiLHRoaXMud2UsYSk7dGhpcy5pc1ZpcnR1YWxpemVkJiZ0aGlzLmxpbmtzLmVhY2goZnVuY3Rpb24oYSl7YS5pc0F2b2lkaW5nJiZhLmFjdHVhbEJvdW5kcy5JYyhiKSYmYS5SYSgpO30pO319O2Z1bmN0aW9uIGtqKGEsYil7dm9pZCAwPT09YiYmKGI9bnVsbCk7dmFyIGM9YS5FYjtpZihudWxsIT09YyYmYy52aXNpYmxlKXtmb3IodmFyIGQ9Sy5hbGxvYygpLGU9MSxmPTEsZz1jLlkuaixoPWcubGVuZ3RoLGs9MDtrPGg7aysrKXt2YXIgbD1nW2tdLG09bC5pbnRlcnZhbDsyPm18fChTaihsLmZpZ3VyZSk/Zj1mKm0vSC5seChmLG0pOmU9ZSptL0gubHgoZSxtKSk7fWc9Yy5ncmlkQ2VsbFNpemU7ZC5oKGYqZy53aWR0aCxlKmcuaGVpZ2h0KTtpZihudWxsIT09YillPWIud2lkdGgsZj1iLmhlaWdodCxhPWIueCxnPWIueTtlbHNle2I9Ti5hbGxvYygpO2E9YS52aWV3cG9ydEJvdW5kcztiLmgoYS54LGEueSxhLndpZHRoLGEuaGVpZ2h0KTtpZighYi5vKCkpe04uZnJlZShiKTtyZXR1cm47fWU9Yi53aWR0aDtmPWIuaGVpZ2h0O2E9Yi54O2c9Yi55O04uZnJlZShiKTt9Yy53aWR0aD1lKzIqZC53aWR0aDtjLmhlaWdodD1mKzIqZC5oZWlnaHQ7Yj1HLmFsbG9jKCk7SC5UcChhLGcsMCwwLGQud2lkdGgsZC5oZWlnaHQsYik7Yi5vZmZzZXQoLWQud2lkdGgsLWQuaGVpZ2h0KTtLLmZyZWUoZCk7Yy5wYXJ0LmxvY2F0aW9uPWI7Ry5mcmVlKGIpO319dC5Mcz1mdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5zZWxlY3Rpb24uY291bnQ7YSYmdGhpcy5hYSgiQ2hhbmdpbmdTZWxlY3Rpb24iLHRoaXMuc2VsZWN0aW9uKTtIZih0aGlzKTthJiZ0aGlzLmFhKCJDaGFuZ2VkU2VsZWN0aW9uIix0aGlzLnNlbGVjdGlvbik7fTtmdW5jdGlvbiBIZihhKXthPWEuc2VsZWN0aW9uO2lmKDA8YS5jb3VudCl7Zm9yKHZhciBiPWEuTmEoKSxjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtiW2RdLmlzU2VsZWN0ZWQ9ITE7fWEuaGEoKTthLmNsZWFyKCk7YS5mcmVlemUoKTt9fXQuc2VsZWN0PWZ1bmN0aW9uKGEpe251bGwhPT1hJiZhLmxheWVyLmRpYWdyYW09PT10aGlzJiYoIWEuaXNTZWxlY3RlZHx8MTx0aGlzLnNlbGVjdGlvbi5jb3VudCkmJih0aGlzLmFhKCJDaGFuZ2luZ1NlbGVjdGlvbiIsdGhpcy5zZWxlY3Rpb24pLEhmKHRoaXMpLGEuaXNTZWxlY3RlZD0hMCx0aGlzLmFhKCJDaGFuZ2VkU2VsZWN0aW9uIix0aGlzLnNlbGVjdGlvbikpO307dC5Hdj1mdW5jdGlvbihhKXt0aGlzLmFhKCJDaGFuZ2luZ1NlbGVjdGlvbiIsdGhpcy5zZWxlY3Rpb24pO0hmKHRoaXMpO2lmKEVhKGEpKWZvcih2YXIgYj1hLmxlbmd0aCxjPTA7YzxiO2MrKyl7dmFyIGQ9YVtjXTtkIGluc3RhbmNlb2YgVHx8QSgiRGlhZ3JhbS5zZWxlY3RDb2xsZWN0aW9uIGdpdmVuIHNvbWV0aGluZyB0aGF0IGlzIG5vdCBhIFBhcnQ6ICIrZCk7ZC5pc1NlbGVjdGVkPSEwO31lbHNlIGZvcihhPWEuaXRlcmF0b3I7YS5uZXh0KCk7KXtiPWEudmFsdWUsYiBpbnN0YW5jZW9mIFR8fEEoIkRpYWdyYW0uc2VsZWN0Q29sbGVjdGlvbiBnaXZlbiBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBQYXJ0OiAiK2IpLGIuaXNTZWxlY3RlZD0hMDt9dGhpcy5hYSgiQ2hhbmdlZFNlbGVjdGlvbiIsdGhpcy5zZWxlY3Rpb24pO307dC5Xdz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuaGlnaGxpZ2h0ZWRzO2lmKDA8YS5jb3VudCl7Zm9yKHZhciBiPWEuTmEoKSxjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtiW2RdLmlzSGlnaGxpZ2h0ZWQ9ITE7fWEuaGEoKTthLmNsZWFyKCk7YS5mcmVlemUoKTt9fTt0Lm16PWZ1bmN0aW9uKGEpe251bGwhPT1hJiZhLmxheWVyLmRpYWdyYW09PT10aGlzJiYoIWEuaXNIaWdobGlnaHRlZHx8MTx0aGlzLmhpZ2hsaWdodGVkcy5jb3VudCkmJih0aGlzLld3KCksYS5pc0hpZ2hsaWdodGVkPSEwKTt9O3Qubno9ZnVuY3Rpb24oYSl7YT1uZXcgRigpLmFkZEFsbChhKTtmb3IodmFyIGI9dGhpcy5oaWdobGlnaHRlZHMuY29weSgpLmxxKGEpLml0ZXJhdG9yO2IubmV4dCgpOyl7Yi52YWx1ZS5pc0hpZ2hsaWdodGVkPSExO31mb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGIgaW5zdGFuY2VvZiBUfHxBKCJEaWFncmFtLmhpZ2hsaWdodENvbGxlY3Rpb24gZ2l2ZW4gc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgUGFydDogIitiKSxiLmlzSGlnaGxpZ2h0ZWQ9ITA7fX07dC5zY3JvbGw9ZnVuY3Rpb24oYSxiLGMpe3ZvaWQgMD09PWMmJihjPTEpO3ZhciBkPSJ1cCI9PT1ifHwiZG93biI9PT1iLGU9MDtpZigicGl4ZWwiPT09YSllPWM7ZWxzZSBpZigibGluZSI9PT1hKWU9YyooZD90aGlzLnNjcm9sbFZlcnRpY2FsTGluZUNoYW5nZTp0aGlzLnNjcm9sbEhvcml6b250YWxMaW5lQ2hhbmdlKTtlbHNlIGlmKCJwYWdlIj09PWEpYT1kP3RoaXMudmlld3BvcnRCb3VuZHMuaGVpZ2h0OnRoaXMudmlld3BvcnRCb3VuZHMud2lkdGgsYSo9dGhpcy5zY2FsZSwwIT09YSYmKGU9YypNYXRoLm1heChhLShkP3RoaXMuc2Nyb2xsVmVydGljYWxMaW5lQ2hhbmdlOnRoaXMuc2Nyb2xsSG9yaXpvbnRhbExpbmVDaGFuZ2UpLDApKTtlbHNle2lmKCJkb2N1bWVudCI9PT1hKXtlPXRoaXMuZG9jdW1lbnRCb3VuZHM7Yz10aGlzLnZpZXdwb3J0Qm91bmRzO2Q9Ry5hbGxvYygpOyJ1cCI9PT1iP3RoaXMucG9zaXRpb249ZC5oKGMueCxlLnkpOiJsZWZ0Ij09PWI/dGhpcy5wb3NpdGlvbj1kLmgoZS54LGMueSk6ImRvd24iPT09Yj90aGlzLnBvc2l0aW9uPWQuaChjLngsZS5ib3R0b20tYy5oZWlnaHQpOiJyaWdodCI9PT1iJiYodGhpcy5wb3NpdGlvbj1kLmgoZS5yaWdodC1jLndpZHRoLGMueSkpO0cuZnJlZShkKTtyZXR1cm47fUEoInNjcm9sbGluZyB1bml0IG11c3QgYmUgJ3BpeGVsJywgJ2xpbmUnLCAncGFnZScsIG9yICdkb2N1bWVudCcsIG5vdDogIithKTt9ZS89dGhpcy5zY2FsZTtjPXRoaXMucG9zaXRpb24uY29weSgpOyJ1cCI9PT1iP2MueT10aGlzLnBvc2l0aW9uLnktZToiZG93biI9PT1iP2MueT10aGlzLnBvc2l0aW9uLnkrZToibGVmdCI9PT1iP2MueD10aGlzLnBvc2l0aW9uLngtZToicmlnaHQiPT09Yj9jLng9dGhpcy5wb3NpdGlvbi54K2U6QSgic2Nyb2xsaW5nIGRpcmVjdGlvbiBtdXN0IGJlICd1cCcsICdkb3duJywgJ2xlZnQnLCBvciAncmlnaHQnLCBub3Q6ICIrYik7dGhpcy5wb3NpdGlvbj1jO307dC5Gdj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZXdwb3J0Qm91bmRzO2IubGYoYSl8fChhPWEuY2VudGVyLGEueC09Yi53aWR0aC8yLGEueS09Yi5oZWlnaHQvMix0aGlzLnBvc2l0aW9uPWEpO307dC5KdT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZpZXdwb3J0Qm91bmRzO2E9YS5jZW50ZXI7YS54LT1iLndpZHRoLzI7YS55LT1iLmhlaWdodC8yO3RoaXMucG9zaXRpb249YTt9O3QueHQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50YjtiLnJlc2V0KCk7MSE9PXRoaXMuQ2EmJmIuc2NhbGUodGhpcy5DYSk7dmFyIGM9dGhpcy5zYTsoMCE9PWMueHx8MCE9PWMueSkmJmlzRmluaXRlKGMueCkmJmlzRmluaXRlKGMueSkmJmIudHJhbnNsYXRlKC1jLngsLWMueSk7cmV0dXJuIGEuY29weSgpLnRyYW5zZm9ybSh0aGlzLnRiKTt9O3QuWXo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50YixjPWEueCxkPWEueSxlPWMrYS53aWR0aCxmPWQrYS5oZWlnaHQsZz1iLm0xMSxoPWIubTEyLGs9Yi5tMjEsbD1iLm0yMixtPWIuZHgsbj1iLmR5LHA9YypnK2QqayttO2I9YypoK2QqbCtuO3ZhciBxPWUqZytkKmsrbTthPWUqaCtkKmwrbjtkPWMqZytmKmsrbTtjPWMqaCtmKmwrbjtnPWUqZytmKmsrbTtlPWUqaCtmKmwrbjtmPU1hdGgubWluKHAscSk7cD1NYXRoLm1heChwLHEpO3E9TWF0aC5taW4oYixhKTtiPU1hdGgubWF4KGIsYSk7Zj1NYXRoLm1pbihmLGQpO3A9TWF0aC5tYXgocCxkKTtxPU1hdGgubWluKHEsYyk7Yj1NYXRoLm1heChiLGMpO2Y9TWF0aC5taW4oZixnKTtwPU1hdGgubWF4KHAsZyk7cT1NYXRoLm1pbihxLGUpO2I9TWF0aC5tYXgoYixlKTtyZXR1cm4gbmV3IE4oZixxLHAtZixiLXEpO307dC55dD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRiO2IucmVzZXQoKTsxIT09dGhpcy5DYSYmYi5zY2FsZSh0aGlzLkNhKTt2YXIgYz10aGlzLnNhOygwIT09Yy54fHwwIT09Yy55KSYmaXNGaW5pdGUoYy54KSYmaXNGaW5pdGUoYy55KSYmYi50cmFuc2xhdGUoLWMueCwtYy55KTtyZXR1cm4gUWIoYS5jb3B5KCksdGhpcy50Yik7fTtmdW5jdGlvbiBUaihhKXt2YXIgYj1hLmlzTW9kaWZpZWQ7YS5PdyE9PWImJihhLk93PWIsYS5hYSgiTW9kaWZpZWQiKSk7fWZ1bmN0aW9uIFhqKGEpe2E9c2kuZ2V0KGEpO3JldHVybiBudWxsIT09YT9uZXcgYSgpOm5ldyB0aSgpO31QLnByb3RvdHlwZS5kb01vZGVsQ2hhbmdlZD1mdW5jdGlvbihhKXtpZihhLm1vZGVsPT09dGhpcy5tb2RlbCl7dmFyIGI9YS5jaGFuZ2UsYz1hLnByb3BlcnR5TmFtZTtpZihiPT09YmYmJiJTIj09PWNbMF0pe2lmKCJTdGFydGluZ0ZpcnN0VHJhbnNhY3Rpb24iPT09Yyl7dmFyIGQ9dGhpczthPXRoaXMudG9vbE1hbmFnZXI7YS5tb3VzZURvd25Ub29scy5lYWNoKGZ1bmN0aW9uKGEpe2EuaGIoZCk7fSk7YS5tb3VzZU1vdmVUb29scy5lYWNoKGZ1bmN0aW9uKGEpe2EuaGIoZCk7fSk7YS5tb3VzZVVwVG9vbHMuZWFjaChmdW5jdGlvbihhKXthLmhiKGQpO30pO3RoaXMuWmJ8fHRoaXMuZ2V8fCh0aGlzLlJrPSEwLHRoaXMuWGsmJih0aGlzLnFkPSEwKSk7fWVsc2UiU3RhcnRpbmdVbmRvIj09PWN8fCJTdGFydGluZ1JlZG8iPT09Yz8oYT10aGlzLmFuaW1hdGlvbk1hbmFnZXIsYS5pc0FuaW1hdGluZyYmIXRoaXMuc2tpcHNVbmRvTWFuYWdlciYmYS52ZCgpLHRoaXMuYWEoIkNoYW5naW5nU2VsZWN0aW9uIix0aGlzLnNlbGVjdGlvbikpOiJTdGFydGVkVHJhbnNhY3Rpb24iPT09YyYmKGE9dGhpcy5hbmltYXRpb25NYW5hZ2VyLGEuaXNBbmltYXRpbmcmJiF0aGlzLnNraXBzVW5kb01hbmFnZXImJmEudmQoKSk7fWVsc2UgaWYodGhpcy5kYSl7dGhpcy5kYT0hMTt0cnl7aWYoIiI9PT1hLm1vZGVsQ2hhbmdlJiZiPT09YmYpe2lmKCJGaW5pc2hlZFVuZG8iPT09Y3x8IkZpbmlzaGVkUmVkbyI9PT1jKXRoaXMuYWEoIkNoYW5nZWRTZWxlY3Rpb24iLHRoaXMuc2VsZWN0aW9uKSxRaSh0aGlzKTt2YXIgZT10aGlzLmFuaW1hdGlvbk1hbmFnZXI7IlJvbGxlZEJhY2tUcmFuc2FjdGlvbiI9PT1jJiZlLnZkKCk7dGhpcy5Saz0hMDt0aGlzLmZkKCk7MD09PXRoaXMudW5kb01hbmFnZXIudHJhbnNhY3Rpb25MZXZlbCYmU2goZSk7IkNvbW1pdHRlZFRyYW5zYWN0aW9uIj09PWMmJnRoaXMudW5kb01hbmFnZXIuZHUmJih0aGlzLmZlPU1hdGgubWluKHRoaXMuZmUsdGhpcy51bmRvTWFuYWdlci5oaXN0b3J5SW5kZXgtMSkpO3ZhciBmPWEuaXNUcmFuc2FjdGlvbkZpbmlzaGVkO2YmJihUaih0aGlzKSx0aGlzLmd0LmNsZWFyKCkpO2lmKCF0aGlzLmt1JiZmKXt0aGlzLmt1PSEwO3ZhciBnPXRoaXM7dWEoZnVuY3Rpb24oKXtnLmN1cnJlbnRUb29sLnN0YW5kYXJkTW91c2VPdmVyKCk7Zy5rdT0hMTt9LDEwKTt9fX1maW5hbGx5e3RoaXMuZGE9ITA7fX19fTtmdW5jdGlvbiBDaihhLGIpe2I9Yi5ZLmo7Zm9yKHZhciBjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtiayhhLGJbZF0pO319ZnVuY3Rpb24gYmsoYSxiKXtpZihiIGluc3RhbmNlb2YgY2spe3ZhciBjPWIuZWxlbWVudDtpZihudWxsIT09YyYmYyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpe3ZhciBkPWIuSWc7bnVsbCE9PWQmJihkLlprIGluc3RhbmNlb2YgRXZlbnQmJm51bGwhPT1iLkNjJiZiLkNjKGIsZC5aayksITA9PT1kLnpyJiYobnVsbCE9PWIuZGYmJmIuZGYoYixkLnN1KSxudWxsIT09Yi5kaWFncmFtJiZiLmRpYWdyYW0ubXUuYWRkKGIpKSk7Yz1jLnNyYztkPWEuQ2ouSihjKTtpZihudWxsPT09ZClkPVtdLGQucHVzaChiKSxhLkNqLmFkZChjLGQpO2Vsc2V7Zm9yKGE9MDthPGQubGVuZ3RoO2ErKyl7aWYoZFthXT09PWIpcmV0dXJuO31kLnB1c2goYik7fX19fWZ1bmN0aW9uIEdqKGEsYil7Yj1iLlkuajtmb3IodmFyIGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2RrKGEsYltkXSk7fX1mdW5jdGlvbiBkayhhLGIpe2lmKGIgaW5zdGFuY2VvZiBjayl7dmFyIGM9Yi5lbGVtZW50O2lmKG51bGwhPT1jJiZjIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCl7Yz1jLnNyYzt2YXIgZD1hLkNqLkooYyk7aWYobnVsbCE9PWQpZm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe2lmKGRbZV09PT1iKXtkLnNwbGljZShlLDEpOzA9PT1kLmxlbmd0aCYmKGEuQ2oucmVtb3ZlKGMpLGVrKGMpKTticmVhazt9fX19fVAucHJvdG90eXBlLnVkPWZ1bmN0aW9uKCl7dGhpcy5wYXJ0TWFuYWdlci51ZCgpO307UC5wcm90b3R5cGUuSnA9ZnVuY3Rpb24oYSxiKXt0aGlzLnlrLkpwKGEsYik7fTtQLnByb3RvdHlwZS5LcD1mdW5jdGlvbihhLGIpe3RoaXMueWsuS3AoYSxiKTt9O1AucHJvdG90eXBlLmZpbmRQYXJ0Rm9yS2V5PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcnRNYW5hZ2VyLmZpbmRQYXJ0Rm9yS2V5KGEpO307dD1QLnByb3RvdHlwZTt0LkhiPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcnRNYW5hZ2VyLkhiKGEpO307dC52Yz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wYXJ0TWFuYWdlci52YyhhKTt9O3QuRWk9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucGFydE1hbmFnZXIuRWkoYSk7fTt0LnVjPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcnRNYW5hZ2VyLnVjKGEpO307dC5Tcz1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2Mpe2JbY109YXJndW1lbnRzW2NdO31yZXR1cm4gdGhpcy5wYXJ0TWFuYWdlci5Tcy5hcHBseSh0aGlzLnBhcnRNYW5hZ2VyLGIgaW5zdGFuY2VvZiBBcnJheT9iOmNhKGJhKGIpKSk7fTt0LlJzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyl7YltjXT1hcmd1bWVudHNbY107fXJldHVybiB0aGlzLnBhcnRNYW5hZ2VyLlJzLmFwcGx5KHRoaXMucGFydE1hbmFnZXIsYiBpbnN0YW5jZW9mIEFycmF5P2I6Y2EoYmEoYikpKTt9O2Z1bmN0aW9uIFZpKGEsYil7YS5PZz0hMTt2YXIgYz1hLnZuO2MuQShiKXx8KGI9Yi5JKCksYS52bj1iLFNpKGEsITEpLGEuYWEoIkRvY3VtZW50Qm91bmRzQ2hhbmdlZCIsbnVsbCxjLmNvcHkoKSksaGooYSkpO310LlV5PWZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBGKCksYj10aGlzLm5vZGVzO2IubmV4dCgpOyl7dmFyIGM9Yi52YWx1ZTtjLmlzVG9wTGV2ZWwmJmEuYWRkKGMpO31mb3IoYj10aGlzLmxpbmtzO2IubmV4dCgpOyl7Yz1iLnZhbHVlLGMuaXNUb3BMZXZlbCYmYS5hZGQoYyk7fXJldHVybiBhLml0ZXJhdG9yO307dC5UeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnhpLml0ZXJhdG9yO307dC55ej1mdW5jdGlvbihhKXtRaSh0aGlzKTthJiZmayh0aGlzLCEwKTt0aGlzLlJrPSEwO3BnKHRoaXMpO307ZnVuY3Rpb24gZmsoYSxiKXtmb3IodmFyIGM9YS54aS5pdGVyYXRvcjtjLm5leHQoKTspe2drKGEsYy52YWx1ZSxiKTt9bnVsbCE9PWEubGF5b3V0JiYoYj9hLmxheW91dC5pc1ZhbGlkTGF5b3V0PSExOmEubGF5b3V0LkIoKSk7fWZ1bmN0aW9uIGdrKGEsYixjKXtpZihudWxsIT09Yil7Zm9yKHZhciBkPWIucmwuaXRlcmF0b3I7ZC5uZXh0KCk7KXtnayhhLGQudmFsdWUsYyk7fW51bGwhPT1iLmxheW91dCYmKGM/Yi5sYXlvdXQuaXNWYWxpZExheW91dD0hMTpiLmxheW91dC5CKCkpO319ZnVuY3Rpb24gbGooYSxiKXtpZihhLnpnJiYhYS5RdCl7dmFyIGM9YS5kYTthLmRhPSEwO3ZhciBkPWEudW5kb01hbmFnZXIudHJhbnNhY3Rpb25MZXZlbCxlPWEubGF5b3V0O3RyeXswPT09ZCYmYS5BYSgiTGF5b3V0Iik7dmFyIGY9YS5hbmltYXRpb25NYW5hZ2VyOzE+PWQmJiFmLmlzQW5pbWF0aW5nJiYhZi5yYiYmKGJ8fGYuUmkoIkxheW91dCIpKTthLnpnPSExO2Zvcih2YXIgZz1hLnhpLml0ZXJhdG9yO2cubmV4dCgpOyl7aGsoYSxnLnZhbHVlLGIsZCk7fWUuaXNWYWxpZExheW91dHx8KCFifHxlLmlzUmVhbHRpbWV8fG51bGw9PT1lLmlzUmVhbHRpbWV8fDA9PT1kPyhlLmRvTGF5b3V0KGEpLFFpKGEpLGUuaXNWYWxpZExheW91dD0hMCk6YS56Zz0hMCk7fWZpbmFsbHl7MD09PWQmJmEuWmEoIkxheW91dCIpLGEuemc9IWUuaXNWYWxpZExheW91dCxhLmRhPWM7fX19ZnVuY3Rpb24gaGsoYSxiLGMsZCl7aWYobnVsbCE9PWIpe2Zvcih2YXIgZT1iLnJsLml0ZXJhdG9yO2UubmV4dCgpOyl7aGsoYSxlLnZhbHVlLGMsZCk7fWU9Yi5sYXlvdXQ7bnVsbD09PWV8fGUuaXNWYWxpZExheW91dHx8KCFjfHxlLmlzUmVhbHRpbWV8fDA9PT1kPyhiLm1rPSFiLmxvY2F0aW9uLm8oKSxlLmRvTGF5b3V0KGIpLGIuQigzMiksbmooYSxiKSxlLmlzVmFsaWRMYXlvdXQ9ITApOmEuemc9ITApO319dC4keT1mdW5jdGlvbigpe2Zvcih2YXIgYT1uZXcgRSgpLGI9dGhpcy5ub2RlcztiLm5leHQoKTspe3ZhciBjPWIudmFsdWU7Yy5pc1RvcExldmVsJiZudWxsPT09Yy5IaSgpJiZhLmFkZChjKTt9cmV0dXJuIGEuaXRlcmF0b3I7fTtmdW5jdGlvbiBxaShhKXtmdW5jdGlvbiBiKGEpe3ZhciBiPWEudG9Mb3dlckNhc2UoKSxlPW5ldyBFKCk7Yy5hZGQoYSxlKTtjLmFkZChiLGUpO2QuYWRkKGEsYSk7ZC5hZGQoYixhKTt9dmFyIGM9bmV3IExiKCksZD1uZXcgTGIoKTtiKCJBbmltYXRpb25TdGFydGluZyIpO2IoIkFuaW1hdGlvbkZpbmlzaGVkIik7YigiQmFja2dyb3VuZFNpbmdsZUNsaWNrZWQiKTtiKCJCYWNrZ3JvdW5kRG91YmxlQ2xpY2tlZCIpO2IoIkJhY2tncm91bmRDb250ZXh0Q2xpY2tlZCIpO2IoIkNsaXBib2FyZENoYW5nZWQiKTtiKCJDbGlwYm9hcmRQYXN0ZWQiKTtiKCJEb2N1bWVudEJvdW5kc0NoYW5nZWQiKTtiKCJFeHRlcm5hbE9iamVjdHNEcm9wcGVkIik7YigiR2FpbmVkRm9jdXMiKTtiKCJJbml0aWFsTGF5b3V0Q29tcGxldGVkIik7YigiTGF5b3V0Q29tcGxldGVkIik7YigiTGlua0RyYXduIik7YigiTGlua1JlbGlua2VkIik7YigiTGlua1Jlc2hhcGVkIik7YigiTG9zdEZvY3VzIik7YigiTW9kaWZpZWQiKTtiKCJPYmplY3RTaW5nbGVDbGlja2VkIik7YigiT2JqZWN0RG91YmxlQ2xpY2tlZCIpO2IoIk9iamVjdENvbnRleHRDbGlja2VkIik7YigiUGFydENyZWF0ZWQiKTtiKCJQYXJ0UmVzaXplZCIpO2IoIlBhcnRSb3RhdGVkIik7YigiU2VsZWN0aW9uTW92ZWQiKTtiKCJTZWxlY3Rpb25Db3BpZWQiKTtiKCJTZWxlY3Rpb25EZWxldGluZyIpO2IoIlNlbGVjdGlvbkRlbGV0ZWQiKTtiKCJTZWxlY3Rpb25Hcm91cGVkIik7YigiU2VsZWN0aW9uVW5ncm91cGVkIik7YigiQ2hhbmdpbmdTZWxlY3Rpb24iKTtiKCJDaGFuZ2VkU2VsZWN0aW9uIik7YigiU3ViR3JhcGhDb2xsYXBzZWQiKTtiKCJTdWJHcmFwaEV4cGFuZGVkIik7YigiVGV4dEVkaXRlZCIpO2IoIlRyZWVDb2xsYXBzZWQiKTtiKCJUcmVlRXhwYW5kZWQiKTtiKCJWaWV3cG9ydEJvdW5kc0NoYW5nZWQiKTtiKCJJbnZhbGlkYXRlRHJhdyIpO2EuU3Q9YzthLlJ0PWQ7fWZ1bmN0aW9uIHdqKGEsYil7dmFyIGM9YS5SdC5KKGIpO3JldHVybiBudWxsIT09Yz9jOmEuUnQuSihiLnRvTG93ZXJDYXNlKCkpO31mdW5jdGlvbiBpayhhLGIpe3ZhciBjPWEuU3QuSihiKTtpZihudWxsIT09YylyZXR1cm4gYztjPWEuU3QuSihiLnRvTG93ZXJDYXNlKCkpO2lmKG51bGwhPT1jKXJldHVybiBjO0EoIlVua25vd24gRGlhZ3JhbUV2ZW50IG5hbWU6ICIrYik7cmV0dXJuIG51bGw7fXQuTmo9ZnVuY3Rpb24oYSxiKXthPWlrKHRoaXMsYSk7bnVsbCE9PWEmJmEuYWRkKGIpO307dC5tbT1mdW5jdGlvbihhLGIpe2E9aWsodGhpcyxhKTtudWxsIT09YSYmYS5yZW1vdmUoYik7fTt0LmFhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1payh0aGlzLGEpLGU9bmV3IFplKCk7ZS5kaWFncmFtPXRoaXM7YT13aih0aGlzLGEpO251bGwhPT1hJiYoZS5uYW1lPWEpO3ZvaWQgMCE9PWImJihlLnN1YmplY3Q9Yik7dm9pZCAwIT09YyYmKGUucGFyYW1ldGVyPWMpO2I9ZC5sZW5ndGg7aWYoMT09PWIpZC5OKDApKGUpO2Vsc2UgaWYoMCE9PWIpZm9yKGQ9ZC5OYSgpLGM9MDtjPGI7YysrKXsoMCxkW2NdKShlKTt9fTtmdW5jdGlvbiBqayhhKXtpZihhLmFuaW1hdGlvbk1hbmFnZXIuaXNBbmltYXRpbmcpcmV0dXJuITE7dmFyIGI9YS5jdXJyZW50VG9vbDtyZXR1cm4gYj09PWEudG9vbE1hbmFnZXIuZmluZFRvb2woIkRyYWdnaW5nIik/IWEudnB8fGIuaXNDb21wbGV4Um91dGluZ1JlYWx0aW1lOiEwO310LmVrPWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9bnVsbCk7cmV0dXJuIGtrKHRoaXMsITEsbnVsbCxiKS5layhhLngsYS55LGEud2lkdGgsYS5oZWlnaHQpO307UC5wcm90b3R5cGUuY29tcHV0ZU9jY3VwaWVkQXJlYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVmlydHVhbGl6ZWQ/dGhpcy52aWV3cG9ydEJvdW5kcy5jb3B5KCk6dGhpcy5PZz9SaSh0aGlzKTp0aGlzLmRvY3VtZW50Qm91bmRzLmNvcHkoKTt9O2Z1bmN0aW9uIGtrKGEsYixjLGQpe251bGw9PT1hLk9iJiYoYS5PYj1uZXcgbGsoKSk7aWYoYS5PYi5hdHx8YS5PYi5ncm91cCE9PWN8fGEuT2IuTXghPT1kKXtpZihudWxsPT09Yyl7Yj1hLmNvbXB1dGVPY2N1cGllZEFyZWEoKTtiLlVjKDEwMCwxMDApO2EuT2IuaW5pdGlhbGl6ZShiKTtiPU4uYWxsb2MoKTtmb3IodmFyIGU9YS5ub2RlcztlLm5leHQoKTspe3ZhciBmPWUudmFsdWUsZz1mLmxheWVyO251bGwhPT1nJiZnLnZpc2libGUmJiFnLmlzVGVtcG9yYXJ5JiZtayhhLGYsZCxiKTt9Ti5mcmVlKGIpO31lbHNlezA8Yy5tZW1iZXJQYXJ0cy5jb3VudCYmKGI9YS5jb21wdXRlUGFydHNCb3VuZHMoYy5tZW1iZXJQYXJ0cywhMSksYi5VYygyMCwyMCksYS5PYi5pbml0aWFsaXplKGIpKTtiPU4uYWxsb2MoKTtmb3IoZT1jLm1lbWJlclBhcnRzO2UubmV4dCgpOyl7Zj1lLnZhbHVlLGYgaW5zdGFuY2VvZiBWJiZtayhhLGYsZCxiKTt9Ti5mcmVlKGIpO31hLk9iLmdyb3VwPWM7YS5PYi5NeD1kO2EuT2IuYXQ9ITE7fWVsc2UgYiYmbmsoYS5PYik7cmV0dXJuIGEuT2I7fWZ1bmN0aW9uIG1rKGEsYixjLGQpe2lmKGIhPT1jKWlmKGIuaXNWaXNpYmxlKCkmJmIuYXZvaWRhYmxlJiYhYi5pc0xpbmtMYWJlbCl7dmFyIGU9Yi5nZXRBdm9pZGFibGVSZWN0KGQpLGY9YS5PYi5VbDtjPWEuT2IuVGw7ZD1lLngrZS53aWR0aDtiPWUueStlLmhlaWdodDtmb3IodmFyIGc9ZS54O2c8ZDtnKz1mKXtmb3IodmFyIGg9ZS55O2g8YjtoKz1jKXtvayhhLk9iLGcsaCk7fW9rKGEuT2IsZyxiKTt9Zm9yKGU9ZS55O2U8YjtlKz1jKXtvayhhLk9iLGQsZSk7fW9rKGEuT2IsZCxiKTt9ZWxzZSBpZihiIGluc3RhbmNlb2YgaWcpZm9yKGI9Yi5tZW1iZXJQYXJ0cztiLm5leHQoKTspe2U9Yi52YWx1ZSxlIGluc3RhbmNlb2YgViYmbWsoYSxlLGMsZCk7fX1mdW5jdGlvbiBwayhhLGIpe251bGwhPT1hLk9iJiYhYS5PYi5hdCYmKHZvaWQgMD09PWImJihiPW51bGwpLG51bGw9PT1ifHxiLmF2b2lkYWJsZSYmIWIuaXNMaW5rTGFiZWwpJiYoYS5PYi5hdD0hMCk7fXQ9UC5wcm90b3R5cGU7dC5Pcz1mdW5jdGlvbihhKXt0aGlzLkhxLmFzc2lnbihhKTtxayh0aGlzLHRoaXMuSHEpLlFhKHRoaXMucG9zaXRpb24pP3RoaXMudmYoKTpyayh0aGlzKTt9O2Z1bmN0aW9uIHJrKGEpey0xPT09YS5CayYmKGEuQms9dWEoZnVuY3Rpb24oKXtpZigtMSE9PWEuQmsmJihhLnZmKCksbnVsbCE9PWEubGFzdElucHV0LmV2ZW50KSl7dmFyIGI9cWsoYSxhLkhxKTtiLlFhKGEucG9zaXRpb24pfHwoYS5wb3NpdGlvbj1iLGEubGFzdElucHV0LmRvY3VtZW50UG9pbnQ9YS55dChhLkhxKSxhLmRvTW91c2VNb3ZlKCksYS5PZz0hMCxWaShhLGEuZG9jdW1lbnRCb3VuZHMuY29weSgpLkpjKGEuY29tcHV0ZUJvdW5kcygpKSksYS5uYz0hMCxhLmZkKCkscmsoYSkpO319LGEuVG0pKTt9dC52Zj1mdW5jdGlvbigpey0xIT09dGhpcy5CayYmKHcuY2xlYXJUaW1lb3V0KHRoaXMuQmspLHRoaXMuQms9LTEpO307ZnVuY3Rpb24gcWsoYSxiKXt2YXIgYz1hLnBvc2l0aW9uLGQ9YS5VbTtpZigwPj1kLnRvcCYmMD49ZC5sZWZ0JiYwPj1kLnJpZ2h0JiYwPj1kLmJvdHRvbSlyZXR1cm4gYzt2YXIgZT1hLnZpZXdwb3J0Qm91bmRzLGY9YS5zY2FsZTtlPU4uYWxsb2NBdCgwLDAsZS53aWR0aCpmLGUuaGVpZ2h0KmYpO3ZhciBnPUcuYWxsb2NBdCgwLDApO2lmKGIueD49ZS54JiZiLng8ZS54K2QubGVmdCl7dmFyIGg9TWF0aC5tYXgoYS5zY3JvbGxIb3Jpem9udGFsTGluZUNoYW5nZSwxKTtofD0wO2cueC09aDtiLng8ZS54K2QubGVmdC8yJiYoZy54LT1oKTtiLng8ZS54K2QubGVmdC80JiYoZy54LT00KmgpO31lbHNlIGIueDw9ZS54K2Uud2lkdGgmJmIueD5lLngrZS53aWR0aC1kLnJpZ2h0JiYoaD1NYXRoLm1heChhLnNjcm9sbEhvcml6b250YWxMaW5lQ2hhbmdlLDEpLGh8PTAsZy54Kz1oLGIueD5lLngrZS53aWR0aC1kLnJpZ2h0LzImJihnLngrPWgpLGIueD5lLngrZS53aWR0aC1kLnJpZ2h0LzQmJihnLngrPTQqaCkpO2IueT49ZS55JiZiLnk8ZS55K2QudG9wPyhhPU1hdGgubWF4KGEuc2Nyb2xsVmVydGljYWxMaW5lQ2hhbmdlLDEpLGF8PTAsZy55LT1hLGIueTxlLnkrZC50b3AvMiYmKGcueS09YSksYi55PGUueStkLnRvcC80JiYoZy55LT00KmEpKTpiLnk8PWUueStlLmhlaWdodCYmYi55PmUueStlLmhlaWdodC1kLmJvdHRvbSYmKGE9TWF0aC5tYXgoYS5zY3JvbGxWZXJ0aWNhbExpbmVDaGFuZ2UsMSksYXw9MCxnLnkrPWEsYi55PmUueStlLmhlaWdodC1kLmJvdHRvbS8yJiYoZy55Kz1hKSxiLnk+ZS55K2UuaGVpZ2h0LWQuYm90dG9tLzQmJihnLnkrPTQqYSkpO2cuUWEoYWMpfHwoYz1uZXcgRyhjLngrZy54L2YsYy55K2cueS9mKSk7Ti5mcmVlKGUpO0cuZnJlZShnKTtyZXR1cm4gYzt9dC5pdD1mdW5jdGlvbigpe3JldHVybiBudWxsO307dC5tdj1mdW5jdGlvbigpe3JldHVybiBudWxsO307dC5seT1mdW5jdGlvbihhLGIpe3RoaXMucHUuYWRkKGEsYik7fTtmdW5jdGlvbiBzayhhLGIsYyl7ZnVuY3Rpb24gZCgpe3ZhciBhPStuZXcgRGF0ZSgpO2Y9ITA7Zm9yKGcucmVzZXQoKTtnLm5leHQoKTspe2lmKCFnLnZhbHVlWzBdLm5sKXtmPSExO2JyZWFrO319Znx8YS1sPms/YihjLGUsaCk6dy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7fWZvcih2YXIgZT1jLmNhbGxiYWNrLGY9ITAsZz1hLkNqLml0ZXJhdG9yO2cubmV4dCgpOyl7aWYoIWcudmFsdWVbMF0ubmwpe2Y9ITE7YnJlYWs7fX1pZigiZnVuY3Rpb24iIT09dHlwZW9mIGV8fGYpcmV0dXJuIGIoYyxlLGEpO3ZhciBoPWEsaz1jLmNhbGxiYWNrVGltZW91dHx8MzAwLGw9K25ldyBEYXRlKCk7dy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtkKCk7fSk7cmV0dXJuIG51bGw7fXQuQXo9ZnVuY3Rpb24oYSl7aWYoIXRoKXJldHVybiBudWxsO3ZvaWQgMD09PWEmJihhPW5ldyB0YigpKTthLnJldHVyblR5cGU9IkltYWdlIjtyZXR1cm4gdGhpcy5zeChhKTt9O3Quc3g9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9bmV3IHRiKCkpO3JldHVybiBzayh0aGlzLHRoaXMuQnosYSk7fTt0LkJ6PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10ayhjLGEsImNhbnZhcyIsbnVsbCk7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7Yz1kLlcuY2FudmFzO3ZhciBlPW51bGw7aWYobnVsbCE9PWMpc3dpdGNoKGU9YS5yZXR1cm5UeXBlLHZvaWQgMD09PWU/ZT0ic3RyaW5nIjplPWUudG9Mb3dlckNhc2UoKSxlKXtjYXNlImltYWdlZGF0YSI6ZT1kLmdldEltYWdlRGF0YSgwLDAsYy53aWR0aCxjLmhlaWdodCk7YnJlYWs7Y2FzZSJpbWFnZSI6ZD0oYS5kb2N1bWVudHx8ZG9jdW1lbnQpLmNyZWF0ZUVsZW1lbnQoImltZyIpO2Quc3JjPWMudG9EYXRhVVJMKGEudHlwZSxhLmRldGFpbHMpO2U9ZDticmVhaztjYXNlImJsb2IiOiJmdW5jdGlvbiIhPT10eXBlb2YgYiYmQSgnRXJyb3I6IERpYWdyYW0ubWFrZUltYWdlRGF0YSBjYWxsZWQgd2l0aCAicmV0dXJuVHlwZTogdG9CbG9iIiwgYnV0IG5vIHJlcXVpcmVkICJjYWxsYmFjayIgZnVuY3Rpb24gcHJvcGVydHkgZGVmaW5lZC4nKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGMudG9CbG9iKXJldHVybiBjLnRvQmxvYihiLGEudHlwZSxhLmRldGFpbHMpLCJ0b0Jsb2IiO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYy5tc1RvQmxvYilyZXR1cm4gYihjLm1zVG9CbG9iKCkpLCJtc1RvQmxvYiI7YihudWxsKTtyZXR1cm4gbnVsbDtkZWZhdWx0OmU9Yy50b0RhdGFVUkwoYS50eXBlLGEuZGV0YWlscyk7fXJldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgYj8oYihlKSxudWxsKTplO307ZnVuY3Rpb24gdGsoYSxiLGMsZCl7YS5hbmltYXRpb25NYW5hZ2VyLnZkKCk7YS5mZCgpO2lmKG51bGw9PT1hLkRhKXJldHVybiBudWxsOyJvYmplY3QiIT09X3R5cGVvZihiKSYmQSgicHJvcGVydGllcyBhcmd1bWVudCBtdXN0IGJlIGFuIE9iamVjdC4iKTt2YXIgZT1iLnNpemV8fG51bGwsZj1iLnNjYWxlfHxudWxsO3ZvaWQgMCE9PWIuc2NhbGUmJmlzTmFOKGIuc2NhbGUpJiYoZj0iTmFOIik7dmFyIGc9Yi5tYXhTaXplO3ZvaWQgMD09PWIubWF4U2l6ZSYmKGc9IlNWRyI9PT1jP25ldyBLKEluZmluaXR5LEluZmluaXR5KTpuZXcgSygyRTMsMkUzKSk7dmFyIGg9Yi5wb3NpdGlvbnx8bnVsbCxrPWIucGFydHN8fG51bGwsbD12b2lkIDA9PT1iLnBhZGRpbmc/MTpiLnBhZGRpbmcsbT1iLmJhY2tncm91bmR8fG51bGwsbj1iLm9taXRUZW1wb3Jhcnk7dm9pZCAwPT09biYmKG49ITApO3ZhciBwPWIuZG9jdW1lbnR8fGRvY3VtZW50LHE9Yi5lbGVtZW50RmluaXNoZWR8fG51bGwscj1iLnNob3dUZW1wb3Jhcnk7dm9pZCAwPT09ciYmKHI9IW4pO2I9Yi5zaG93R3JpZDt2b2lkIDA9PT1iJiYoYj1yKTtudWxsIT09ZSYmaXNOYU4oZS53aWR0aCkmJmlzTmFOKGUuaGVpZ2h0KSYmKGU9bnVsbCk7Im51bWJlciI9PT10eXBlb2YgbD9sPW5ldyBJYyhsKTpsIGluc3RhbmNlb2YgSWN8fEEoIk1ha2VJbWFnZSBwYWRkaW5nIG11c3QgYmUgYSBNYXJnaW4gb3IgYSBudW1iZXIuIik7bC5sZWZ0PU1hdGgubWF4KGwubGVmdCwwKTtsLnJpZ2h0PU1hdGgubWF4KGwucmlnaHQsMCk7bC50b3A9TWF0aC5tYXgobC50b3AsMCk7bC5ib3R0b209TWF0aC5tYXgobC5ib3R0b20sMCk7YS5ZYy5SYyghMCk7bj1uZXcgdWsobnVsbCxwKTt2YXIgdT1uLmNvbnRleHQ7aWYoIShlfHxmfHxrfHxoKSl7bi53aWR0aD1hLnhhK01hdGguY2VpbChsLmxlZnQrbC5yaWdodCk7bi5oZWlnaHQ9YS53YStNYXRoLmNlaWwobC50b3ArbC5ib3R0b20pO2lmKCJTVkciPT09Yyl7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7ZC5yZXNpemUobi53aWR0aCxuLmhlaWdodCxuLndpZHRoLG4uaGVpZ2h0KTtkLm93bmVyRG9jdW1lbnQ9cDtkLlFwPXE7dWooYSxkLmNvbnRleHQsbCxuZXcgSyhuLndpZHRoLG4uaGVpZ2h0KSxhLkNhLGEuc2EsayxtLHIsYik7cmV0dXJuIGQuY29udGV4dDt9YS54bj0hMTt1aihhLHUsbCxuZXcgSyhuLndpZHRoLG4uaGVpZ2h0KSxhLkNhLGEuc2EsayxtLHIsYik7YS54bj0hMDtyZXR1cm4gbi5jb250ZXh0O312YXIgeD1hLlpxLHY9YS5kb2N1bWVudEJvdW5kcy5jb3B5KCk7di5PdihhLmViKTtpZihyKWZvcih2YXIgeT1hLlBhLmosej15Lmxlbmd0aCxCPTA7Qjx6O0IrKyl7dmFyIEM9eVtCXTtpZihDLnZpc2libGUmJkMuaXNUZW1wb3Jhcnkpe0M9Qy5GYS5qO2Zvcih2YXIgST1DLmxlbmd0aCxKPTA7SjxJO0orKyl7dmFyIEw9Q1tKXTtMLmlzSW5Eb2N1bWVudEJvdW5kcyYmTC5pc1Zpc2libGUoKSYmKEw9TC5hY3R1YWxCb3VuZHMsTC5vKCkmJnYuSmMoTCkpO319fXk9bmV3IEcodi54LHYueSk7aWYobnVsbCE9PWspe3o9ITA7Qj1rLml0ZXJhdG9yO2ZvcihCLnJlc2V0KCk7Qi5uZXh0KCk7KXtpZihDPUIudmFsdWUsQyBpbnN0YW5jZW9mIFQmJihJPUMubGF5ZXIsKG51bGw9PT1JfHxJLnZpc2libGUpJiYobnVsbD09PUl8fHJ8fCFJLmlzVGVtcG9yYXJ5KSYmQy5pc1Zpc2libGUoKSYmKEM9Qy5hY3R1YWxCb3VuZHMsQy5vKCkpKSlpZih6KXt6PSExO3ZhciBVPUMuY29weSgpO31lbHNlIFUuSmMoQyk7fXomJihVPW5ldyBOKDAsMCwwLDApKTt2LndpZHRoPVUud2lkdGg7di5oZWlnaHQ9VS5oZWlnaHQ7eS54PVUueDt5Lnk9VS55O31udWxsIT09aCYmaC5vKCkmJih5PWgsZnx8KGY9eCkpO1U9aD0wO251bGwhPT1sJiYoaD1sLmxlZnQrbC5yaWdodCxVPWwudG9wK2wuYm90dG9tKTt6PUI9MDtudWxsIT09ZSYmKEI9ZS53aWR0aCx6PWUuaGVpZ2h0LGlzRmluaXRlKEIpJiYoQj1NYXRoLm1heCgwLEItaCkpLGlzRmluaXRlKHopJiYoej1NYXRoLm1heCgwLHotVSkpKTtudWxsIT09ZSYmbnVsbCE9PWY/KCJOYU4iPT09ZiYmKGY9eCksZS5vKCk/KGU9Qix2PXopOmlzTmFOKHopPyhlPUIsdj12LmhlaWdodCpmKTooZT12LndpZHRoKmYsdj16KSk6bnVsbCE9PWU/ZS5vKCk/KGY9TWF0aC5taW4oQi92LndpZHRoLHovdi5oZWlnaHQpLGU9Qix2PXopOmlzTmFOKHopPyhmPUIvdi53aWR0aCxlPUIsdj12LmhlaWdodCpmKTooZj16L3YuaGVpZ2h0LGU9di53aWR0aCpmLHY9eik6bnVsbCE9PWY/Ik5hTiI9PT1mJiZnLm8oKT8oZj1NYXRoLm1pbigoZy53aWR0aC1oKS92LndpZHRoLChnLmhlaWdodC1VKS92LmhlaWdodCksZj54PyhmPXgsZT12LndpZHRoLHY9di5oZWlnaHQpOihlPWcud2lkdGgsdj1nLmhlaWdodCkpOihlPXYud2lkdGgqZix2PXYuaGVpZ2h0KmYpOihmPXgsZT12LndpZHRoLHY9di5oZWlnaHQpO251bGwhPT1sPyhlKz1oLHYrPVUpOmw9bmV3IEljKDApO251bGwhPT1nJiYoeD1nLndpZHRoLGc9Zy5oZWlnaHQsaXNOYU4oeCkmJih4PTJFMyksaXNOYU4oZykmJihnPTJFMyksaXNGaW5pdGUoeCkmJihlPU1hdGgubWluKGUseCkpLGlzRmluaXRlKGcpJiYodj1NYXRoLm1pbih2LGcpKSk7bi53aWR0aD1NYXRoLmNlaWwoZSk7bi5oZWlnaHQ9TWF0aC5jZWlsKHYpO2lmKCJTVkciPT09Yyl7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7ZC5yZXNpemUobi53aWR0aCxuLmhlaWdodCxuLndpZHRoLG4uaGVpZ2h0KTtkLm93bmVyRG9jdW1lbnQ9cDtkLlFwPXE7dWooYSxkLmNvbnRleHQsbCxuZXcgSyhNYXRoLmNlaWwoZSksTWF0aC5jZWlsKHYpKSxmLHksayxtLHIsYik7cmV0dXJuIGQuY29udGV4dDt9YS54bj0hMTt1aihhLHUsbCxuZXcgSyhNYXRoLmNlaWwoZSksTWF0aC5jZWlsKHYpKSxmLHksayxtLHIsYik7YS54bj0hMDtyZXR1cm4gbi5jb250ZXh0O31wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhQLnByb3RvdHlwZSx7ZGl2OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSWE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe2lmKHRoaXMuSWEhPT1hKXtXYT1bXTt2YXIgYj10aGlzLklhO251bGwhPT1iPyhiLkM9dm9pZCAwLGIuaW5uZXJIVE1MPSIiLG51bGwhPT10aGlzLkRhJiYoYj10aGlzLkRhLkdhLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLCJ0b3VjaHN0YXJ0Iix0aGlzLlR2LCExKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYiwidG91Y2htb3ZlIix0aGlzLlN2LCExKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYiwidG91Y2hlbmQiLHRoaXMuUnYsITEpLHRoaXMuRGEuZXgoKSksYj10aGlzLnRvb2xNYW5hZ2VyLG51bGwhPT1iJiYoYi5tb3VzZURvd25Ub29scy5lYWNoKGZ1bmN0aW9uKGEpe2EuY2FuY2VsV2FpdEFmdGVyKCk7fSksYi5tb3VzZU1vdmVUb29scy5lYWNoKGZ1bmN0aW9uKGEpe2EuY2FuY2VsV2FpdEFmdGVyKCk7fSksYi5tb3VzZVVwVG9vbHMuZWFjaChmdW5jdGlvbihhKXthLmNhbmNlbFdhaXRBZnRlcigpO30pKSxiLmNhbmNlbFdhaXRBZnRlcigpLHRoaXMuY3VycmVudFRvb2wuZG9DYW5jZWwoKSx0aGlzLlljPXRoaXMuRGE9bnVsbCx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywicmVzaXplIix0aGlzLlp2LCExKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywibW91c2Vtb3ZlIix0aGlzLmlrLCEwKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywibW91c2Vkb3duIix0aGlzLmhrLCEwKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywibW91c2V1cCIsdGhpcy5raywhMCksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHcsIndoZWVsIix0aGlzLmxrLCEwKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywibW91c2VvdXQiLHRoaXMuamssITApLGxmPT09dGhpcyYmKGxmPW51bGwpKTp0aGlzLmdlPSExO3RoaXMuSWE9bnVsbDtpZihudWxsIT09YSl7aWYoYj1hLkMpYi5kaXY9bnVsbDtBaSh0aGlzLGEpO3RoaXMuc2YoKTt9fX19LFZ3OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVHI7fX0sanY6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5vYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5vYj1hO319LE9pOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZ2U7fX0sZHJhZ2dlZExpbms6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5icjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5iciE9PWEmJih0aGlzLmJyPWEsbnVsbCE9PWEmJih0aGlzLmJzPWEuZnJvbVBvcnQsdGhpcy5jcz1hLnRvUG9ydCkpO319LHZ4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYnM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuYnM9YTt9fSx3eDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmNzO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmNzPWE7fX0sYW5pbWF0aW9uTWFuYWdlcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnlrO319LHVuZG9NYW5hZ2VyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuJGIudW5kb01hbmFnZXI7fX0sc2tpcHNVbmRvTWFuYWdlcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmVoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmVoPWE7dGhpcy4kYi5za2lwc1VuZG9NYW5hZ2VyPWE7fX0sZGVsYXlzTGF5b3V0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUXQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuUXQ9YTt9fSx2YWxpZEN5Y2xlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRnM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuRnM7YiE9PWEmJih0aGlzLkZzPWEsdGhpcy5nKCJ2YWxpZEN5Y2xlIixiLGEpKTt9fSxsYXllcnM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QYS5pdGVyYXRvcjt9fSxpc01vZGVsUmVhZE9ubHk6e2dldDpmdW5jdGlvbiBnZXQoKXt2YXIgYT10aGlzLiRiO3JldHVybiBudWxsPT09YT8hMTphLmlzUmVhZE9ubHk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuJGI7bnVsbCE9PWImJihiLmlzUmVhZE9ubHk9YSk7fX0saXNSZWFkT25seTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkxmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkxmO2IhPT1hJiYodGhpcy5MZj1hLHRoaXMuZygiaXNSZWFkT25seSIsYixhKSk7fX0saXNFbmFibGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRGM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuRGM7YiE9PWEmJih0aGlzLkRjPWEsdGhpcy5nKCJpc0VuYWJsZWQiLGIsYSkpO319LGFsbG93Q2xpcGJvYXJkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMueXE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMueXE7YiE9PWEmJih0aGlzLnlxPWEsdGhpcy5nKCJhbGxvd0NsaXBib2FyZCIsYixhKSk7fX0sYWxsb3dDb3B5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRWg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuRWg7YiE9PWEmJih0aGlzLkVoPWEsdGhpcy5nKCJhbGxvd0NvcHkiLGIsYSkpO319LGFsbG93RGVsZXRlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRmg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuRmg7YiE9PWEmJih0aGlzLkZoPWEsdGhpcy5nKCJhbGxvd0RlbGV0ZSIsYixhKSk7fX0sYWxsb3dEcmFnT3V0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuenE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuenE7YiE9PWEmJih0aGlzLnpxPWEsdGhpcy5nKCJhbGxvd0RyYWdPdXQiLGIsYSkpO319LGFsbG93RHJvcDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkFxO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkFxO2IhPT1hJiYodGhpcy5BcT1hLHRoaXMuZygiYWxsb3dEcm9wIixiLGEpKTt9fSxhbGxvd1RleHRFZGl0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuT2g7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuT2g7YiE9PWEmJih0aGlzLk9oPWEsdGhpcy5nKCJhbGxvd1RleHRFZGl0IixiLGEpKTt9fSxhbGxvd0dyb3VwOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuR2g7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuR2g7YiE9PWEmJih0aGlzLkdoPWEsdGhpcy5nKCJhbGxvd0dyb3VwIixiLGEpKTt9fSxhbGxvd1VuZ3JvdXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5QaDtiIT09YSYmKHRoaXMuUGg9YSx0aGlzLmcoImFsbG93VW5ncm91cCIsYixhKSk7fX0sYWxsb3dJbnNlcnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DcTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5DcTtiIT09YSYmKHRoaXMuQ3E9YSx0aGlzLmcoImFsbG93SW5zZXJ0IixiLGEpKTt9fSxhbGxvd0xpbms6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5IaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5IaDtiIT09YSYmKHRoaXMuSGg9YSx0aGlzLmcoImFsbG93TGluayIsYixhKSk7fX0sYWxsb3dSZWxpbms6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5KaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5KaDtiIT09YSYmKHRoaXMuSmg9YSx0aGlzLmcoImFsbG93UmVsaW5rIixiLGEpKTt9fSxhbGxvd01vdmU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5JaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5JaDtiIT09YSYmKHRoaXMuSWg9YSx0aGlzLmcoImFsbG93TW92ZSIsYixhKSk7fX0sYWxsb3dSZXNoYXBlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuS2g7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuS2g7YiE9PWEmJih0aGlzLktoPWEsdGhpcy5nKCJhbGxvd1Jlc2hhcGUiLGIsYSkpO319LGFsbG93UmVzaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTGg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuTGg7YiE9PWEmJih0aGlzLkxoPWEsdGhpcy5nKCJhbGxvd1Jlc2l6ZSIsYixhKSk7fX0sYWxsb3dSb3RhdGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5NaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5NaDtiIT09YSYmKHRoaXMuTWg9YSx0aGlzLmcoImFsbG93Um90YXRlIixiLGEpKTt9fSxhbGxvd1NlbGVjdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk5oO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLk5oO2IhPT1hJiYodGhpcy5OaD1hLHRoaXMuZygiYWxsb3dTZWxlY3QiLGIsYSkpO319LGFsbG93VW5kbzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkRxO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkRxO2IhPT1hJiYodGhpcy5EcT1hLHRoaXMuZygiYWxsb3dVbmRvIixiLGEpKTt9fSxhbGxvd1pvb206e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5GcTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5GcTtiIT09YSYmKHRoaXMuRnE9YSx0aGlzLmcoImFsbG93Wm9vbSIsYixhKSk7fX0saGFzVmVydGljYWxTY3JvbGxiYXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ycjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ycjtiIT09YSYmKHRoaXMucnI9YSxoaih0aGlzKSx0aGlzLlIoKSx0aGlzLmcoImhhc1ZlcnRpY2FsU2Nyb2xsYmFyIixiLGEpLFNpKHRoaXMsITEpKTt9fSxoYXNIb3Jpem9udGFsU2Nyb2xsYmFyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucXI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMucXI7YiE9PWEmJih0aGlzLnFyPWEsaGoodGhpcyksdGhpcy5SKCksdGhpcy5nKCJoYXNIb3Jpem9udGFsU2Nyb2xsYmFyIixiLGEpLFNpKHRoaXMsITEpKTt9fSxhbGxvd0hvcml6b250YWxTY3JvbGw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5CcTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5CcTtiIT09YSYmKHRoaXMuQnE9YSx0aGlzLmcoImFsbG93SG9yaXpvbnRhbFNjcm9sbCIsYixhKSxTaSh0aGlzLCExKSk7fX0sYWxsb3dWZXJ0aWNhbFNjcm9sbDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkVxO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkVxO2IhPT1hJiYodGhpcy5FcT1hLHRoaXMuZygiYWxsb3dWZXJ0aWNhbFNjcm9sbCIsYixhKSxTaSh0aGlzLCExKSk7fX0sc2Nyb2xsSG9yaXpvbnRhbExpbmVDaGFuZ2U6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5vczt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5vcztiIT09YSYmKDA+YSYmeGEoYSwiPj0gMCIsUCwic2Nyb2xsSG9yaXpvbnRhbExpbmVDaGFuZ2UiKSx0aGlzLm9zPWEsdGhpcy5nKCJzY3JvbGxIb3Jpem9udGFsTGluZUNoYW5nZSIsYixhKSk7fX0sc2Nyb2xsVmVydGljYWxMaW5lQ2hhbmdlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucXM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMucXM7YiE9PWEmJigwPmEmJnhhKGEsIj49IDAiLFAsInNjcm9sbFZlcnRpY2FsTGluZUNoYW5nZSIpLHRoaXMucXM9YSx0aGlzLmcoInNjcm9sbFZlcnRpY2FsTGluZUNoYW5nZSIsYixhKSk7fX0sbGFzdElucHV0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucWo7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMucWo9YTt9fSxmaXJzdElucHV0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWGg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuWGg9YTt9fSxjdXJyZW50Q3Vyc29yOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuU3E7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpeyIiPT09YSYmKGE9dGhpcy5xbik7aWYodGhpcy5TcSE9PWEpe3ZhciBiPXRoaXMuRGEsYz10aGlzLklhO2lmKG51bGwhPT1iKXt0aGlzLlNxPWE7dmFyIGQ9Yi5zdHlsZS5jdXJzb3I7Yi5zdHlsZS5jdXJzb3I9YTtjLnN0eWxlLmN1cnNvcj1hO2Iuc3R5bGUuY3Vyc29yPT09ZCYmKGIuc3R5bGUuY3Vyc29yPSItd2Via2l0LSIrYSxjLnN0eWxlLmN1cnNvcj0iLXdlYmtpdC0iK2EsYi5zdHlsZS5jdXJzb3I9PT1kJiYoYi5zdHlsZS5jdXJzb3I9Ii1tb3otIithLGMuc3R5bGUuY3Vyc29yPSItbW96LSIrYSxiLnN0eWxlLmN1cnNvcj09PWQmJihiLnN0eWxlLmN1cnNvcj1hLGMuc3R5bGUuY3Vyc29yPWEpKSk7fX19fSxkZWZhdWx0Q3Vyc29yOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucW47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpeyIiPT09YSYmKGE9ImF1dG8iKTt2YXIgYj10aGlzLnFuO2IhPT1hJiYodGhpcy5xbj1hLHRoaXMuZygiZGVmYXVsdEN1cnNvciIsYixhKSk7fX0sY2xpY2s6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5BZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5BZjtiIT09YSYmKHRoaXMuQWY9YSx0aGlzLmcoImNsaWNrIixiLGEpKTt9fSxkb3VibGVDbGljazp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkZmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkZmO2IhPT1hJiYodGhpcy5GZj1hLHRoaXMuZygiZG91YmxlQ2xpY2siLGIsYSkpO319LGNvbnRleHRDbGljazp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkJmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkJmO2IhPT1hJiYodGhpcy5CZj1hLHRoaXMuZygiY29udGV4dENsaWNrIixiLGEpKTt9fSxtb3VzZU92ZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5XZjtiIT09YSYmKHRoaXMuV2Y9YSx0aGlzLmcoIm1vdXNlT3ZlciIsYixhKSk7fX0sbW91c2VIb3Zlcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlVmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlVmO2IhPT1hJiYodGhpcy5VZj1hLHRoaXMuZygibW91c2VIb3ZlciIsYixhKSk7fX0sbW91c2VIb2xkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVGY7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuVGY7YiE9PWEmJih0aGlzLlRmPWEsdGhpcy5nKCJtb3VzZUhvbGQiLGIsYSkpO319LG1vdXNlRHJhZ092ZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Tcjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5TcjtiIT09YSYmKHRoaXMuU3I9YSx0aGlzLmcoIm1vdXNlRHJhZ092ZXIiLGIsYSkpO319LG1vdXNlRHJvcDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlJmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlJmO2IhPT1hJiYodGhpcy5SZj1hLHRoaXMuZygibW91c2VEcm9wIixiLGEpKTt9fSxoYW5kbGVzRHJhZ0Ryb3BGb3JUb3BMZXZlbFBhcnRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucHI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMucHI7YiE9PWEmJih0aGlzLnByPWEsdGhpcy5nKCJoYW5kbGVzRHJhZ0Ryb3BGb3JUb3BMZXZlbFBhcnRzIixiLGEpKTt9fSxtb3VzZUVudGVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuU2Y7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuU2Y7YiE9PWEmJih0aGlzLlNmPWEsdGhpcy5nKCJtb3VzZUVudGVyIixiLGEpKTt9fSxtb3VzZUxlYXZlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmY7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuVmY7YiE9PWEmJih0aGlzLlZmPWEsdGhpcy5nKCJtb3VzZUxlYXZlIixiLGEpKTt9fSx0b29sVGlwOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZ2c7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuZ2c7YiE9PWEmJih0aGlzLmdnPWEsdGhpcy5nKCJ0b29sVGlwIixiLGEpKTt9fSxjb250ZXh0TWVudTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkNmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkNmO2IhPT1hJiYodGhpcy5DZj1hLHRoaXMuZygiY29udGV4dE1lbnUiLGIsYSkpO319LGNvbW1hbmRIYW5kbGVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LIT09YSYmKHRoaXMuSz1hLGEuaGIodGhpcykpO319LHRvb2xNYW5hZ2VyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVmIhPT1hJiYodGhpcy5WYj1hLGEuaGIodGhpcykpO319LGRlZmF1bHRUb29sOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTGE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuTGE7YiE9PWEmJih0aGlzLkxhPWEsYS5oYih0aGlzKSx0aGlzLmN1cnJlbnRUb29sPT09YiYmKHRoaXMuY3VycmVudFRvb2w9YSkpO319LGN1cnJlbnRUb29sOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYmE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuYmE7bnVsbCE9PWImJihiLmlzQWN0aXZlJiZiLmRvRGVhY3RpdmF0ZSgpLGIuY2FuY2VsV2FpdEFmdGVyKCksYi5kb1N0b3AoKSk7bnVsbD09PWEmJihhPXRoaXMuZGVmYXVsdFRvb2wpO251bGwhPT1hJiYodGhpcy5iYT1hLGEuaGIodGhpcyksYS5kb1N0YXJ0KCkpO319LHNlbGVjdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnRzO319LG1heFNlbGVjdGlvbkNvdW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuT3I7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuT3I7aWYoYiE9PWEpaWYoMDw9YSYmIWlzTmFOKGEpKXtpZih0aGlzLk9yPWEsdGhpcy5nKCJtYXhTZWxlY3Rpb25Db3VudCIsYixhKSwhdGhpcy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nJiYoYT10aGlzLnNlbGVjdGlvbi5jb3VudC1hLDA8YSkpe3RoaXMuYWEoIkNoYW5naW5nU2VsZWN0aW9uIix0aGlzLnNlbGVjdGlvbik7Yj10aGlzLnNlbGVjdGlvbi5OYSgpO2Zvcih2YXIgYz0wO2M8YTtjKyspe2JbY10uaXNTZWxlY3RlZD0hMTt9dGhpcy5hYSgiQ2hhbmdlZFNlbGVjdGlvbiIsdGhpcy5zZWxlY3Rpb24pO319ZWxzZSB4YShhLCI+PSAwIixQLCJtYXhTZWxlY3Rpb25Db3VudCIpO319LG5vZGVTZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLllyO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLllyO2IhPT1hJiYodGhpcy5Zcj1hLHRoaXMuZygibm9kZVNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlIixiLGEpKTt9fSxncm91cFNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubXI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMubXI7YiE9PWEmJih0aGlzLm1yPWEsdGhpcy5nKCJncm91cFNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlIixiLGEpKTt9fSxsaW5rU2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Lcjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5LcjtiIT09YSYmKHRoaXMuS3I9YSx0aGlzLmcoImxpbmtTZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZSIsYixhKSk7fX0saGlnaGxpZ2h0ZWRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuc3I7fX0saXNNb2RpZmllZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMudW5kb01hbmFnZXI7cmV0dXJuIGEuaXNFbmFibGVkP251bGwhPT1hLmN1cnJlbnRUcmFuc2FjdGlvbj8hMDp0aGlzLnUmJnRoaXMuZmUhPT1hLmhpc3RvcnlJbmRleDp0aGlzLnU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe2lmKHRoaXMudSE9PWEpe3RoaXMudT1hO3ZhciBiPXRoaXMudW5kb01hbmFnZXI7IWEmJmIuaXNFbmFibGVkJiYodGhpcy5mZT1iLmhpc3RvcnlJbmRleCk7YXx8VGoodGhpcyk7fX19LG1vZGVsOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuJGI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuJGI7aWYoYiE9PWEpe3RoaXMuY3VycmVudFRvb2wuZG9DYW5jZWwoKTtudWxsIT09YiYmYi51bmRvTWFuYWdlciE9PWEudW5kb01hbmFnZXImJmIudW5kb01hbmFnZXIuaXNJblRyYW5zYWN0aW9uJiZBKCJEbyBub3QgcmVwbGFjZSBhIERpYWdyYW0ubW9kZWwgd2hpbGUgYSB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcy4iKTtEaSh0aGlzLCEwKTt0aGlzLmdlPSExO3RoaXMuWGs9ITA7dGhpcy5mZT0tMjt0aGlzLnFkPSExO3ZhciBjPXRoaXMuWmI7dGhpcy5aYj0hMDt0aGlzLmFuaW1hdGlvbk1hbmFnZXIuUmkoIk1vZGVsIik7bnVsbCE9PWImJihudWxsIT09dGhpcy5uZSYmdGhpcy5uZS5lYWNoKGZ1bmN0aW9uKGEpe2IucGsoYSk7fSksYi5wayh0aGlzLkNtKSk7dGhpcy4kYj1hO3RoaXMucGFydE1hbmFnZXI9WGoodGhpcy4kYi5jb25zdHJ1Y3Rvci50eXBlKTthLnJoKHRoaXMud2cpO3RoaXMucGFydE1hbmFnZXIuYWRkQWxsTW9kZWxlZFBhcnRzKCk7YS5wayh0aGlzLndnKTthLnJoKHRoaXMuQ20pO251bGwhPT10aGlzLm5lJiZ0aGlzLm5lLmVhY2goZnVuY3Rpb24oYil7YS5yaChiKTt9KTt0aGlzLlpiPWM7dGhpcy5vYnx8dGhpcy5SKCk7bnVsbCE9PWImJmEudW5kb01hbmFnZXIuY29weVByb3BlcnRpZXMoYi51bmRvTWFuYWdlcik7fX19LGRhOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVmM9YTt9fSxndDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLndxO319LHNraXBzTW9kZWxTb3VyY2VCaW5kaW5nczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkNoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkNoPWE7fX0sVWk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53dTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy53dT1hO319LG5vZGVUZW1wbGF0ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlhmLkooIiIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlhmLkooIiIpO2IhPT1hJiYodGhpcy5YZi5hZGQoIiIsYSksdGhpcy5nKCJub2RlVGVtcGxhdGUiLGIsYSksdGhpcy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHx0aGlzLnVkKCkpO319LG5vZGVUZW1wbGF0ZU1hcDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlhmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlhmO2IhPT1hJiYodGhpcy5YZj1hLHRoaXMuZygibm9kZVRlbXBsYXRlTWFwIixiLGEpLHRoaXMudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8dGhpcy51ZCgpKTt9fSxncm91cFRlbXBsYXRlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWWguSigiIik7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuWWguSigiIik7YiE9PWEmJih0aGlzLlloLmFkZCgiIixhKSx0aGlzLmcoImdyb3VwVGVtcGxhdGUiLGIsYSksdGhpcy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHx0aGlzLnVkKCkpO319LGdyb3VwVGVtcGxhdGVNYXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ZaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ZaDtiIT09YSYmKHRoaXMuWWg9YSx0aGlzLmcoImdyb3VwVGVtcGxhdGVNYXAiLGIsYSksdGhpcy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHx0aGlzLnVkKCkpO319LGxpbmtUZW1wbGF0ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlNnLkooIiIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlNnLkooIiIpO2IhPT1hJiYodGhpcy5TZy5hZGQoIiIsYSksdGhpcy5nKCJsaW5rVGVtcGxhdGUiLGIsYSksdGhpcy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHx0aGlzLnVkKCkpO319LGxpbmtUZW1wbGF0ZU1hcDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlNnO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlNnO2IhPT1hJiYodGhpcy5TZz1hLHRoaXMuZygibGlua1RlbXBsYXRlTWFwIixiLGEpLHRoaXMudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8dGhpcy51ZCgpKTt9fSxpc01vdXNlT3ZlckRpYWdyYW06e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5oZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5oZT1hO319LGlzTW91c2VDYXB0dXJlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLktjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkRhO251bGwhPT1iJiYoYj1iLkdhLGIgaW5zdGFuY2VvZiBTVkdFbGVtZW50fHwoYT8odGhpcy5sYXN0SW5wdXQuYnViYmxlcz0hMSx0aGlzLkdxPyh0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYiwicG9pbnRlcm1vdmUiLHRoaXMuam0sITEpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLCJwb2ludGVyZG93biIsdGhpcy5pbSwhMSksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGIsInBvaW50ZXJ1cCIsdGhpcy5sbSwhMSksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGIsInBvaW50ZXJvdXQiLHRoaXMua20sITEpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih3LCJwb2ludGVybW92ZSIsdGhpcy5qbSwhMCksdGhpcy5hZGRFdmVudExpc3RlbmVyKHcsInBvaW50ZXJkb3duIix0aGlzLmltLCEwKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodywicG9pbnRlcnVwIix0aGlzLmxtLCEwKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodywicG9pbnRlcm91dCIsdGhpcy5rbSwhMCkpOih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYiwibW91c2Vtb3ZlIix0aGlzLmlrLCExKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYiwibW91c2Vkb3duIix0aGlzLmhrLCExKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYiwibW91c2V1cCIsdGhpcy5raywhMSksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGIsIm1vdXNlb3V0Iix0aGlzLmprLCExKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodywibW91c2Vtb3ZlIix0aGlzLmlrLCEwKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodywibW91c2Vkb3duIix0aGlzLmhrLCEwKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodywibW91c2V1cCIsdGhpcy5raywhMCksdGhpcy5hZGRFdmVudExpc3RlbmVyKHcsIm1vdXNlb3V0Iix0aGlzLmprLCEwKSksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGIsIndoZWVsIix0aGlzLmxrLCExKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodywid2hlZWwiLHRoaXMubGssITApLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih3LCJzZWxlY3RzdGFydCIsdGhpcy5wcmV2ZW50RGVmYXVsdCwhMSkpOih0aGlzLkdxPyh0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywicG9pbnRlcm1vdmUiLHRoaXMuam0sITApLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih3LCJwb2ludGVyZG93biIsdGhpcy5pbSwhMCksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHcsInBvaW50ZXJ1cCIsdGhpcy5sbSwhMCksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHcsInBvaW50ZXJvdXQiLHRoaXMua20sITApLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihiLCJwb2ludGVybW92ZSIsdGhpcy5qbSwhMSksdGhpcy5hZGRFdmVudExpc3RlbmVyKGIsInBvaW50ZXJkb3duIix0aGlzLmltLCExKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYiwicG9pbnRlcnVwIix0aGlzLmxtLCExKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYiwicG9pbnRlcm91dCIsdGhpcy5rbSwhMSkpOih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywibW91c2Vtb3ZlIix0aGlzLmlrLCEwKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywibW91c2Vkb3duIix0aGlzLmhrLCEwKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywibW91c2V1cCIsdGhpcy5raywhMCksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHcsIm1vdXNlb3V0Iix0aGlzLmprLCEwKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYiwibW91c2Vtb3ZlIix0aGlzLmlrLCExKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYiwibW91c2Vkb3duIix0aGlzLmhrLCExKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYiwibW91c2V1cCIsdGhpcy5raywhMSksdGhpcy5hZGRFdmVudExpc3RlbmVyKGIsIm1vdXNlb3V0Iix0aGlzLmprLCExKSksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHcsIndoZWVsIix0aGlzLmxrLCEwKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodywic2VsZWN0c3RhcnQiLHRoaXMucHJldmVudERlZmF1bHQsITEpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihiLCJ3aGVlbCIsdGhpcy5saywhMSkpLHRoaXMuS2M9YSkpO319LHBvc2l0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuc2E7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPUcuYWxsb2MoKS5hc3NpZ24odGhpcy5zYSk7aWYoIWIuQShhKSl7dmFyIGM9dGhpcy52aWV3cG9ydEJvdW5kcy5jb3B5KCk7dGhpcy5zYS5hc3NpZ24oYSk7dGhpcy5vYnx8bnVsbD09PXRoaXMuRGEmJiF0aGlzLkVwLm8oKXx8KHRoaXMub2I9ITAsYT10aGlzLnNjYWxlLFVpKHRoaXMsdGhpcy52bix0aGlzLnhhL2EsdGhpcy53YS9hLHRoaXMuY2osITEpLHRoaXMub2I9ITEpO2RpKHRoaXMuYW5pbWF0aW9uTWFuYWdlcixiLHRoaXMuc2EpO3RoaXMub2J8fHRoaXMuaXEoYyx0aGlzLnZpZXdwb3J0Qm91bmRzLHRoaXMuQ2EsITEpO31HLmZyZWUoYik7fX0saW5pdGlhbFBvc2l0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudXI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudXIuQShhKXx8KHRoaXMudXI9YS5JKCkpO319LGluaXRpYWxTY2FsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnZyO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnZyIT09YSYmKHRoaXMudnI9YSk7fX0sZ3JpZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe251bGw9PT10aGlzLkViJiZMaSh0aGlzKTtyZXR1cm4gdGhpcy5FYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5FYjtpZihiIT09YSl7bnVsbD09PWImJihMaSh0aGlzKSxiPXRoaXMuRWIpO2EudHlwZSE9PVguR3JpZCYmQSgiRGlhZ3JhbS5ncmlkIG11c3QgYmUgYSBQYW5lbCBvZiB0eXBlIFBhbmVsLkdyaWQiKTt2YXIgYz1iLnBhbmVsO251bGwhPT1jJiZjLnJlbW92ZShiKTt0aGlzLkViPWE7YS5uYW1lPSJHUklEIjtudWxsIT09YyYmYy5hZGQoYSk7a2oodGhpcyk7dGhpcy5SKCk7dGhpcy5nKCJncmlkIixiLGEpO319fSx2aWV3cG9ydEJvdW5kczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMuTncsYj10aGlzLnNhLGM9dGhpcy5DYTtpZihudWxsPT09dGhpcy5EYSlyZXR1cm4gdGhpcy5FcC5vKCkmJmEuaChiLngsYi55LHRoaXMueGEvYyx0aGlzLndhL2MpLGE7YS5oKGIueCxiLnksTWF0aC5tYXgodGhpcy54YSwwKS9jLE1hdGgubWF4KHRoaXMud2EsMCkvYyk7cmV0dXJuIGE7fX0sdmlld1NpemU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5FcDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy52aWV3U2l6ZTtiLkEoYSl8fCh0aGlzLkVwPWE9YS5JKCksdGhpcy54YT1hLndpZHRoLHRoaXMud2E9YS5oZWlnaHQsdGhpcy5YYSgpLHRoaXMuZygidmlld1NpemUiLGIsYSkpO319LGZpeGVkQm91bmRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuanI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuanI7Yi5BKGEpfHwoLUluZmluaXR5IT09YS53aWR0aCYmSW5maW5pdHkhPT1hLmhlaWdodCYmLUluZmluaXR5IT09YS5oZWlnaHR8fEEoImZpeGVkQm91bmRzIHdpZHRoL2hlaWdodCBtdXN0IG5vdCBiZSBJbmZpbml0eSIpLHRoaXMuanI9YT1hLkkoKSx0aGlzLlhhKCksdGhpcy5nKCJmaXhlZEJvdW5kcyIsYixhKSk7fX0sc2Nyb2xsTWFyZ2luOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucmk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpeyJudW1iZXIiPT09dHlwZW9mIGEmJihhPW5ldyBJYyhhKSk7dmFyIGI9dGhpcy5yaTtiLkEoYSl8fCh0aGlzLnJpPWE9YS5JKCksdGhpcy5nKCJzY3JvbGxNYXJnaW4iLGIsYSksdGhpcy5zZigpKTt9fSxzY3JvbGxNb2RlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuR2o7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuR2o7YiE9PWEmJih0aGlzLkdqPWEsYT09PW9pJiZTaSh0aGlzLCExKSx0aGlzLmcoInNjcm9sbE1vZGUiLGIsYSksdGhpcy5zZigpKTt9fSxzY3JvbGxzUGFnZU9uRm9jdXM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5yczt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ycztiIT09YSYmKHRoaXMucnM9YSx0aGlzLmcoInNjcm9sbHNQYWdlT25Gb2N1cyIsYixhKSk7fX0scG9zaXRpb25Db21wdXRhdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmhzO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmhzO2IhPT1hJiYodGhpcy5ocz1hLFNpKHRoaXMsITEpLHRoaXMuZygicG9zaXRpb25Db21wdXRhdGlvbiIsYixhKSk7fX0sc2NhbGVDb21wdXRhdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLm1zO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLm1zO2IhPT1hJiYodGhpcy5tcz1hLFJqKHRoaXMsdGhpcy5zY2FsZSx0aGlzLnNjYWxlKSx0aGlzLmcoInNjYWxlQ29tcHV0YXRpb24iLGIsYSkpO319LGRvY3VtZW50Qm91bmRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudm47fX0saXNWaXJ0dWFsaXplZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkZyO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkZyO2IhPT1hJiYodGhpcy5Gcj1hLHRoaXMuZygiaXNWaXJ0dWFsaXplZCIsYixhKSk7fX0sc2NhbGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DYTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5DYTtiIT09YSYmUmoodGhpcyxiLGEpO319LGRlZmF1bHRTY2FsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlpxO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlpxPWE7fX0sYXV0b1NjYWxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYWo7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuYWo7YiE9PWEmJih0aGlzLmFqPWEsdGhpcy5nKCJhdXRvU2NhbGUiLGIsYSksYSE9PXBpJiZTaSh0aGlzLCExKSk7fX0saW5pdGlhbEF1dG9TY2FsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmFpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmFpO2IhPT1hJiYodGhpcy5haT1hLHRoaXMuZygiaW5pdGlhbEF1dG9TY2FsZSIsYixhKSk7fX0saW5pdGlhbFZpZXdwb3J0U3BvdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLndyO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLndyO2IhPT1hJiYoYS5nYigpfHxBKCJpbml0aWFsVmlld3BvcnRTcG90IG11c3QgYmUgYSBzcGVjaWZpYyBTcG90OiAiK2EpLHRoaXMud3I9YSx0aGlzLmcoImluaXRpYWxWaWV3cG9ydFNwb3QiLGIsYSkpO319LGluaXRpYWxEb2N1bWVudFNwb3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy50cjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy50cjtiIT09YSYmKGEuZ2IoKXx8QSgiaW5pdGlhbFZpZXdwb3J0U3BvdCBtdXN0IGJlIGEgc3BlY2lmaWMgU3BvdDogIithKSx0aGlzLnRyPWEsdGhpcy5nKCJpbml0aWFsRG9jdW1lbnRTcG90IixiLGEpKTt9fSxtaW5TY2FsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlByO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlByO2IhPT1hJiYoMDxhPyh0aGlzLlByPWEsdGhpcy5nKCJtaW5TY2FsZSIsYixhKSxhPnRoaXMuc2NhbGUmJih0aGlzLnNjYWxlPWEpKTp4YShhLCI+IDAiLFAsIm1pblNjYWxlIikpO319LG1heFNjYWxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTnI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuTnI7YiE9PWEmJigwPGE/KHRoaXMuTnI9YSx0aGlzLmcoIm1heFNjYWxlIixiLGEpLGE8dGhpcy5zY2FsZSYmKHRoaXMuc2NhbGU9YSkpOnhhKGEsIj4gMCIsUCwibWF4U2NhbGUiKSk7fX0sem9vbVBvaW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSXM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSXMuQShhKXx8KHRoaXMuSXM9YT1hLkkoKSk7fX0sY29udGVudEFsaWdubWVudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmNqO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmNqO2IuQShhKXx8KHRoaXMuY2o9YT1hLkkoKSx0aGlzLmcoImNvbnRlbnRBbGlnbm1lbnQiLGIsYSksU2kodGhpcywhMSkpO319LGluaXRpYWxDb250ZW50QWxpZ25tZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuT247fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuT247Yi5BKGEpfHwodGhpcy5Pbj1hPWEuSSgpLHRoaXMuZygiaW5pdGlhbENvbnRlbnRBbGlnbm1lbnQiLGIsYSkpO319LHBhZGRpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5lYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7Im51bWJlciI9PT10eXBlb2YgYSYmKGE9bmV3IEljKGEpKTt2YXIgYj10aGlzLmViO2IuQShhKXx8KHRoaXMuZWI9YT1hLkkoKSx0aGlzLlhhKCksdGhpcy5nKCJwYWRkaW5nIixiLGEpKTt9fSxwYXJ0TWFuYWdlcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1hO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLk1hO2IhPT1hJiYobnVsbCE9PWEuZGlhZ3JhbSYmQSgiQ2Fubm90IHNoYXJlIFBhcnRNYW5hZ2VycyBiZXR3ZWVuIERpYWdyYW1zOiAiK2EudG9TdHJpbmcoKSksbnVsbCE9PWImJmIuaGIobnVsbCksdGhpcy5NYT1hLGEuaGIodGhpcykpO319LG5vZGVzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucGFydE1hbmFnZXIubm9kZXMuaXRlcmF0b3I7fX0sbGlua3M6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5wYXJ0TWFuYWdlci5saW5rcy5pdGVyYXRvcjt9fSxwYXJ0czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnBhcnRNYW5hZ2VyLnBhcnRzLml0ZXJhdG9yO319LGxheW91dDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmdjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmdjO2IhPT1hJiYodGhpcy5nYz1hLGEuZGlhZ3JhbT10aGlzLGEuZ3JvdXA9bnVsbCx0aGlzLnpnPSEwLHRoaXMuZygibGF5b3V0IixiLGEpLHRoaXMuY2MoKSk7fX0saXNUcmVlUGF0aFRvQ2hpbGRyZW46e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Fcjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5FcjtpZihiIT09YSYmKHRoaXMuRXI9YSx0aGlzLmcoImlzVHJlZVBhdGhUb0NoaWxkcmVuIixiLGEpLCF0aGlzLnVuZG9NYW5hZ2VyLmlzVW5kb2luZ1JlZG9pbmcpKWZvcihhPXRoaXMubm9kZXM7YS5uZXh0KCk7KXt2ayhhLnZhbHVlKTt9fX0sdHJlZUNvbGxhcHNlUG9saWN5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRHM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuRHM7YiE9PWEmJihhIT09cmkmJmEhPT13ayYmYSE9PXhrJiZBKCJVbmtub3duIERpYWdyYW0udHJlZUNvbGxhcHNlUG9saWN5OiAiK2EpLHRoaXMuRHM9YSx0aGlzLmcoInRyZWVDb2xsYXBzZVBvbGljeSIsYixhKSk7fX0sRWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5XYj1hO319LGF1dG9TY3JvbGxJbnRlcnZhbDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlRtO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlRtO2IhPT1hJiYodGhpcy5UbT1hLHRoaXMuZygiYXV0b1Njcm9sbEludGVydmFsIixiLGEpKTt9fSxhdXRvU2Nyb2xsUmVnaW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVW07fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpeyJudW1iZXIiPT09dHlwZW9mIGEmJihhPW5ldyBJYyhhKSk7dmFyIGI9dGhpcy5VbTtiLkEoYSl8fCh0aGlzLlVtPWE9YS5JKCksdGhpcy5YYSgpLHRoaXMuZygiYXV0b1Njcm9sbFJlZ2lvbiIsYixhKSk7fX19KTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhQLHtsaWNlbnNlS2V5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHlrLlRiKCk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3lrLmFkZChhKTt9fSx2ZXJzaW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHprO319fSk7UC5wcm90b3R5cGUubWFrZUltYWdlRGF0YT1QLnByb3RvdHlwZS5zeDtQLnByb3RvdHlwZS5tYWtlSW1hZ2U9UC5wcm90b3R5cGUuQXo7UC5wcm90b3R5cGUuYWRkUmVuZGVyZXI9UC5wcm90b3R5cGUubHk7UC5wcm90b3R5cGUubWFrZVNWRz1QLnByb3RvdHlwZS5tdjtQLnByb3RvdHlwZS5tYWtlU3ZnPVAucHJvdG90eXBlLml0O1AucHJvdG90eXBlLnN0b3BBdXRvU2Nyb2xsPVAucHJvdG90eXBlLnZmO1AucHJvdG90eXBlLmRvQXV0b1Njcm9sbD1QLnByb3RvdHlwZS5PcztQLnByb3RvdHlwZS5pc1Vub2NjdXBpZWQ9UC5wcm90b3R5cGUuZWs7UC5wcm90b3R5cGUucmFpc2VEaWFncmFtRXZlbnQ9UC5wcm90b3R5cGUuYWE7UC5wcm90b3R5cGUucmVtb3ZlRGlhZ3JhbUxpc3RlbmVyPVAucHJvdG90eXBlLm1tO1AucHJvdG90eXBlLmFkZERpYWdyYW1MaXN0ZW5lcj1QLnByb3RvdHlwZS5OajtQLnByb3RvdHlwZS5maW5kVHJlZVJvb3RzPVAucHJvdG90eXBlLiR5O1AucHJvdG90eXBlLmxheW91dERpYWdyYW09UC5wcm90b3R5cGUueXo7UC5wcm90b3R5cGUuZmluZFRvcExldmVsR3JvdXBzPVAucHJvdG90eXBlLlR5O1AucHJvdG90eXBlLmZpbmRUb3BMZXZlbE5vZGVzQW5kTGlua3M9UC5wcm90b3R5cGUuVXk7UC5wcm90b3R5cGUuZmluZExpbmtzQnlFeGFtcGxlPVAucHJvdG90eXBlLlJzO1AucHJvdG90eXBlLmZpbmROb2Rlc0J5RXhhbXBsZT1QLnByb3RvdHlwZS5TcztQLnByb3RvdHlwZS5maW5kTGlua0ZvckRhdGE9UC5wcm90b3R5cGUudWM7UC5wcm90b3R5cGUuZmluZE5vZGVGb3JEYXRhPVAucHJvdG90eXBlLkVpO1AucHJvdG90eXBlLmZpbmRQYXJ0Rm9yRGF0YT1QLnByb3RvdHlwZS52YztQLnByb3RvdHlwZS5maW5kTm9kZUZvcktleT1QLnByb3RvdHlwZS5IYjtQLnByb3RvdHlwZS5maW5kUGFydEZvcktleT1QLnByb3RvdHlwZS5maW5kUGFydEZvcktleTtQLnByb3RvdHlwZS5yZWJ1aWxkUGFydHM9UC5wcm90b3R5cGUudWQ7UC5wcm90b3R5cGUudHJhbnNmb3JtVmlld1RvRG9jPVAucHJvdG90eXBlLnl0O1AucHJvdG90eXBlLnRyYW5zZm9ybVJlY3REb2NUb1ZpZXc9UC5wcm90b3R5cGUuWXo7UC5wcm90b3R5cGUudHJhbnNmb3JtRG9jVG9WaWV3PVAucHJvdG90eXBlLnh0O1AucHJvdG90eXBlLmNlbnRlclJlY3Q9UC5wcm90b3R5cGUuSnU7UC5wcm90b3R5cGUuc2Nyb2xsVG9SZWN0PVAucHJvdG90eXBlLkZ2O1AucHJvdG90eXBlLnNjcm9sbD1QLnByb3RvdHlwZS5zY3JvbGw7UC5wcm90b3R5cGUuaGlnaGxpZ2h0Q29sbGVjdGlvbj1QLnByb3RvdHlwZS5uejtQLnByb3RvdHlwZS5oaWdobGlnaHQ9UC5wcm90b3R5cGUubXo7UC5wcm90b3R5cGUuY2xlYXJIaWdobGlnaHRlZHM9UC5wcm90b3R5cGUuV3c7UC5wcm90b3R5cGUuc2VsZWN0Q29sbGVjdGlvbj1QLnByb3RvdHlwZS5HdjtQLnByb3RvdHlwZS5zZWxlY3Q9UC5wcm90b3R5cGUuc2VsZWN0O1AucHJvdG90eXBlLmNsZWFyU2VsZWN0aW9uPVAucHJvdG90eXBlLkxzO1AucHJvdG90eXBlLnVwZGF0ZUFsbFJlbGF0aW9uc2hpcHNGcm9tRGF0YT1QLnByb3RvdHlwZS50cTtQLnByb3RvdHlwZS51cGRhdGVBbGxUYXJnZXRCaW5kaW5ncz1QLnByb3RvdHlwZS51cGRhdGVBbGxUYXJnZXRCaW5kaW5ncztQLnByb3RvdHlwZS5jb21taXQ9UC5wcm90b3R5cGUuY29tbWl0O1AucHJvdG90eXBlLnJvbGxiYWNrVHJhbnNhY3Rpb249UC5wcm90b3R5cGUudWY7UC5wcm90b3R5cGUuY29tbWl0VHJhbnNhY3Rpb249UC5wcm90b3R5cGUuWmE7UC5wcm90b3R5cGUuc3RhcnRUcmFuc2FjdGlvbj1QLnByb3RvdHlwZS5BYTtQLnByb3RvdHlwZS5yYWlzZUNoYW5nZWQ9UC5wcm90b3R5cGUuZztQLnByb3RvdHlwZS5yYWlzZUNoYW5nZWRFdmVudD1QLnByb3RvdHlwZS5hYjtQLnByb3RvdHlwZS5yZW1vdmVDaGFuZ2VkTGlzdGVuZXI9UC5wcm90b3R5cGUucGs7UC5wcm90b3R5cGUuYWRkQ2hhbmdlZExpc3RlbmVyPVAucHJvdG90eXBlLnJoO1AucHJvdG90eXBlLnJlbW92ZU1vZGVsQ2hhbmdlZExpc3RlbmVyPVAucHJvdG90eXBlLk56O1AucHJvdG90eXBlLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyPVAucHJvdG90eXBlLlR3O1AucHJvdG90eXBlLmZpbmRMYXllcj1QLnByb3RvdHlwZS5abDtQLnByb3RvdHlwZS5yZW1vdmVMYXllcj1QLnByb3RvdHlwZS5MejtQLnByb3RvdHlwZS5hZGRMYXllckFmdGVyPVAucHJvdG90eXBlLmh5O1AucHJvdG90eXBlLmFkZExheWVyQmVmb3JlPVAucHJvdG90eXBlLlJ3O1AucHJvdG90eXBlLmFkZExheWVyPVAucHJvdG90eXBlLlFsO1AucHJvdG90eXBlLm1vdmVQYXJ0cz1QLnByb3RvdHlwZS5tb3ZlUGFydHM7UC5wcm90b3R5cGUuY29weVBhcnRzPVAucHJvdG90eXBlLlhqO1AucHJvdG90eXBlLnJlbW92ZVBhcnRzPVAucHJvdG90eXBlLnJ0O1AucHJvdG90eXBlLnJlbW92ZT1QLnByb3RvdHlwZS5yZW1vdmU7UC5wcm90b3R5cGUuYWRkPVAucHJvdG90eXBlLmFkZDtQLnByb3RvdHlwZS5jbGVhckRlbGF5ZWRHZW9tZXRyaWVzPVAucHJvdG90eXBlLkt1O1AucHJvdG90eXBlLnNldFByb3BlcnRpZXM9UC5wcm90b3R5cGUuTXY7UC5wcm90b3R5cGUucmVzZXRJbnB1dE9wdGlvbnM9UC5wcm90b3R5cGUuQ3Y7UC5wcm90b3R5cGUuc2V0SW5wdXRPcHRpb249UC5wcm90b3R5cGUuUno7UC5wcm90b3R5cGUuZ2V0SW5wdXRPcHRpb249UC5wcm90b3R5cGUuYm07UC5wcm90b3R5cGUucmVzZXRSZW5kZXJpbmdIaW50cz1QLnByb3RvdHlwZS5EdjtQLnByb3RvdHlwZS5zZXRSZW5kZXJpbmdIaW50PVAucHJvdG90eXBlLkp4O1AucHJvdG90eXBlLmdldFJlbmRlcmluZ0hpbnQ9UC5wcm90b3R5cGUuRGU7UC5wcm90b3R5cGUubWF5YmVVcGRhdGU9UC5wcm90b3R5cGUuZmQ7UC5wcm90b3R5cGUucmVxdWVzdFVwZGF0ZT1QLnByb3RvdHlwZS5jYztQLnByb3RvdHlwZS5kZWxheUluaXRpYWxpemF0aW9uPVAucHJvdG90eXBlLkF5O1AucHJvdG90eXBlLmlzVXBkYXRlUmVxdWVzdGVkPVAucHJvdG90eXBlLnV6O1AucHJvdG90eXBlLnJlZHJhdz1QLnByb3RvdHlwZS5zZjtQLnByb3RvdHlwZS5pbnZhbGlkYXRlRG9jdW1lbnRCb3VuZHM9UC5wcm90b3R5cGUuWGE7UC5wcm90b3R5cGUuZmluZE9iamVjdHNOZWFyPVAucHJvdG90eXBlLm5nO1AucHJvdG90eXBlLmZpbmRQYXJ0c05lYXI9UC5wcm90b3R5cGUuUXk7UC5wcm90b3R5cGUuZmluZE9iamVjdHNJbj1QLnByb3RvdHlwZS5tZztQLnByb3RvdHlwZS5maW5kUGFydHNJbj1QLnByb3RvdHlwZS5reDtQLnByb3RvdHlwZS5maW5kT2JqZWN0c0F0PVAucHJvdG90eXBlLkZpO1AucHJvdG90eXBlLmZpbmRQYXJ0c0F0PVAucHJvdG90eXBlLlB5O1AucHJvdG90eXBlLmZpbmRPYmplY3RBdD1QLnByb3RvdHlwZS5TYjtQLnByb3RvdHlwZS5maW5kUGFydEF0PVAucHJvdG90eXBlLiRsO1AucHJvdG90eXBlLmFsaWduRG9jdW1lbnQ9UC5wcm90b3R5cGUubXk7UC5wcm90b3R5cGUuem9vbVRvUmVjdD1QLnByb3RvdHlwZS5hQTtQLnByb3RvdHlwZS56b29tVG9GaXQ9UC5wcm90b3R5cGUuem9vbVRvRml0O1AucHJvdG90eXBlLmRpYWdyYW1TY3JvbGw9UC5wcm90b3R5cGUuYng7UC5wcm90b3R5cGUuZm9jdXM9UC5wcm90b3R5cGUuZm9jdXM7UC5wcm90b3R5cGUucmVzZXQ9UC5wcm90b3R5cGUucmVzZXQ7UC51c2VET009ZnVuY3Rpb24oYSl7dGg9YT92b2lkIDAhPT13LmRvY3VtZW50OiExO307UC5pc1VzaW5nRE9NPWZ1bmN0aW9uKCl7cmV0dXJuIHRoO307dmFyIGxmPW51bGwsc2k9bmV3IExiKCksSmk9bnVsbCxJaT1udWxsLHRoPXZvaWQgMCE9PXcuZG9jdW1lbnQsQmk9bnVsbCxDaT0iIixwaT1uZXcgRChQLCJOb25lIiwwKSxXaT1uZXcgRChQLCJVbmlmb3JtIiwxKSxYaT1uZXcgRChQLCJVbmlmb3JtVG9GaWxsIiwyKSx0Zz1uZXcgRChQLCJDeWNsZUFsbCIsMTApLHhnPW5ldyBEKFAsIkN5Y2xlTm90RGlyZWN0ZWQiLDExKSx6Zz1uZXcgRChQLCJDeWNsZU5vdERpcmVjdGVkRmFzdCIsMTIpLEdnPW5ldyBEKFAsIkN5Y2xlTm90VW5kaXJlY3RlZCIsMTMpLHVnPW5ldyBEKFAsIkN5Y2xlRGVzdGluYXRpb25UcmVlIiwxNCksd2c9bmV3IEQoUCwiQ3ljbGVTb3VyY2VUcmVlIiwxNSksb2k9bmV3IEQoUCwiRG9jdW1lbnRTY3JvbGwiLDEpLHhqPW5ldyBEKFAsIkluZmluaXRlU2Nyb2xsIiwyKSxyaT1uZXcgRChQLCJUcmVlUGFyZW50Q29sbGFwc2VkIiwyMSksd2s9bmV3IEQoUCwiQWxsUGFyZW50c0NvbGxhcHNlZCIsMjIpLHhrPW5ldyBEKFAsIkFueVBhcmVudHNDb2xsYXBzZWQiLDIzKSx5az1uZXcgRSgpLHprPSIyLjAuOSIsQWs9bnVsbCxtaT0hMTtmdW5jdGlvbiBuaSgpe2lmKHRoKXt2YXIgYT13LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGI9YS5nZXRDb250ZXh0KCIyZCIpLGM9WmEoIjdjYTExYWJmZDAyMjAyODg0NiIpO2JbY109WmEoIjM5OGMzNTk3YzAxMjM4Iik7Zm9yKHZhciBkPVsiNWRhNzNjODBhMzY0NTVkNDAzOGU0OTcyMTg3YzNjYWU1MWZkMjIiLHNhLkR4KyI0YWU2MjQ3NTkwZGE0YmIyMWMzMjRiYTNhODRlMzg1Nzc2IixRYy54RisiZmIyMzZjZGZkYTVkZTE0YzEzNGJhMWE5NWEyZDRjN2NjNmY5M2MxMzg3IixILnphXSxlPTE7NT5lO2UrKyl7YltaYSgiN2NhMTFhYmZkNzMzMDM5MCIpXShaYShkW2UtMV0pLDEwLDE1KmUpO31iW2NdPVphKCIzOWYwNDZlYmIzNmU0YiIpO2ZvcihjPTE7NT5jO2MrKyl7YltaYSgiN2NhMTFhYmZkNzMzMDM5MCIpXShaYShkW2MtMV0pLDEwLDE1KmMpO31Baz1hO319UC5jbGFzc05hbWU9IkRpYWdyYW0iO1AuZnJvbURpdj1mdW5jdGlvbihhKXt2YXIgYj1hOyJzdHJpbmciPT09dHlwZW9mIGEmJihiPXcuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3JldHVybiBiIGluc3RhbmNlb2YgSFRNTERpdkVsZW1lbnQmJmIuQyBpbnN0YW5jZW9mIFA/Yi5DOm51bGw7fTtQLmluaGVyaXQ9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7fWlmKE9iamVjdC5nZXRQcm90b3R5cGVPZihhKS5wcm90b3R5cGUpdGhyb3cgRXJyb3IoIlVzZWQgZ28uRGlhZ3JhbS5pbmhlcml0IGRlZmluaW5nIGFscmVhZHkgZGVmaW5lZCBjbGFzcyBcbiIrYSk7Yy5wcm90b3R5cGU9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGMoKTthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO307UC5Ob25lPXBpO1AuVW5pZm9ybT1XaTtQLlVuaWZvcm1Ub0ZpbGw9WGk7UC5DeWNsZUFsbD10ZztQLkN5Y2xlTm90RGlyZWN0ZWQ9eGc7UC5DeWNsZU5vdERpcmVjdGVkRmFzdD16ZztQLkN5Y2xlTm90VW5kaXJlY3RlZD1HZztQLkN5Y2xlRGVzdGluYXRpb25UcmVlPXVnO1AuQ3ljbGVTb3VyY2VUcmVlPXdnO1AuRG9jdW1lbnRTY3JvbGw9b2k7UC5JbmZpbml0ZVNjcm9sbD14ajtQLlRyZWVQYXJlbnRDb2xsYXBzZWQ9cmk7UC5BbGxQYXJlbnRzQ29sbGFwc2VkPXdrO1AuQW55UGFyZW50c0NvbGxhcHNlZD14aztmdW5jdGlvbiB6aSgpe3RoaXMuJHg9bnVsbDt0aGlzLmw9Inp6QG9yZGVyTnVtIjsiNjNhZDA1YmJlMjNhMTc4NjQ2OGE0Yzc0MWI2ZDIiPT09dGhpcy5fdGs/dGhpcy5OZT10aGlzLmw9ITA6dGhpcy5OZT1udWxsO31mdW5jdGlvbiB0aihhLGIpe2IuWWMuc2V0VHJhbnNmb3JtKGIuTmIsMCwwLGIuTmIsMCwwKTtpZihudWxsPT09YS5OZSl7Yj0iZiI7dmFyIGM9d1taYSgiNzZhNzE1YjJmNzNmMTQ4YSIpXVtaYSgiNzJiYTEzYjUiKV07YS5OZT0hMDtpZih0aCl7dmFyIGQ9UFtaYSgiNzZhMTE1YjZlZDI1MWVhZjQ2OTIiKV07aWYoZClmb3IodmFyIGU9eWsuaXRlcmF0b3I7ZS5uZXh0KCk7KXtkPWUudmFsdWU7ZD1aYShkKS5zcGxpdChaYSgiMzllOSIpKTtpZig2PmQubGVuZ3RoKWJyZWFrO3ZhciBmPVphKGRbMV0pLnNwbGl0KCIuIik7aWYoIjdkYTcxY2EwIiE9PWRbNF0pYnJlYWs7dmFyIGc9WmEoc2FbWmEoIjZjYWUxOSIpXSkuc3BsaXQoIi4iKTtpZihmWzBdPmdbMF18fGZbMF09PT1nWzBdJiZmWzFdPj1nWzFdKXtmPWNbWmEoIjc2YWQxOGI0ZjczZSIpXTtmb3IoZz1jW1phKCI3M2E2MTJiNmZiMTkxZCIpXShaYSgiMzVlNyIpKSsyO2c8ZjtnKyspe2IrPWNbZ107fWY9YltaYSgiNzNhNjEyYjZmYjE5MWQiKV0oWmEoZFsyXSkpOzA+ZiYmWmEoZFsyXSkhPT1aYSgiN2RhNzFjYTBhZDM4MWU5MCIpJiYoZj1iW1phKCI3M2E2MTJiNmZiMTkxZCIpXShaYSgiNzZhNzE1YjJlZjNlMTQ5NzU3IikpKTswPmYmJihmPWJbWmEoIjczYTYxMmI2ZmIxOTFkIildKFphKCI3NmE3MTViMmVmM2UxNDk3NTciKSkpO2EuTmU9ISgwPD1mJiZmPGJbWmEoIjczYTYxMmI2ZmIxOTFkIildKFphKCIzNSIpKSk7aWYoIWEuTmUpYnJlYWs7Zj1aYShkWzJdKTtpZigiIyIhPT1mWzBdKWJyZWFrO2c9dy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IodmFyIGg9ZFswXS5yZXBsYWNlKC9bQS1aYS16XS9nLCIiKTs0PmgubGVuZ3RoOyl7aCs9IjkiO31oPWguc3Vic3RyKGgubGVuZ3RoLTQpO2Q9IiI7ZCs9WyJnc2giLCJnc2YiXVtwYXJzZUludChoLnN1YnN0cigwLDEpLDEwKSUyXTtkKz1bIkhlYWRlciIsIkJhY2tncm91bmQiLCJEaXNwbGF5IiwiRmVlZGJhY2siXVtwYXJzZUludChoLnN1YnN0cigwLDEpLDEwKSU0XTtnW1phKCI3OWE0MTdhMGYwMTgxYTg5NDYiKV09ZDtpZih3LmRvY3VtZW50W1phKCI3OGE3MTJhYSIpXSl7dy5kb2N1bWVudFtaYSgiNzhhNzEyYWEiKV1bWmEoIjdiYjgwNmI2ZWQzMjM4OGM0YTg3NWIiKV0oZyk7aD13LmdldENvbXB1dGVkU3R5bGUoZykuZ2V0UHJvcGVydHlWYWx1ZShaYSgiNzhhNzA0YjdlNjI0NTY5MDRjOWIxMjcwMWI2NTMyYTgiKSk7dy5kb2N1bWVudFtaYSgiNzhhNzEyYWEiKV1bWmEoIjY4YWQxYmJjZjUzMzM4OGM0YTg3NWIiKV0oZyk7aWYoIWgpYnJlYWs7aWYoLTEhPT1oLmluZGV4T2YocGFyc2VJbnQoZlsxXStmWzJdLDE2KSkmJi0xIT09aC5pbmRleE9mKHBhcnNlSW50KGZbM10rZls0XSwxNikpKXthLk5lPSExO2JyZWFrO31lbHNlIGlmKGJifHxjYnx8ZGJ8fGdiKWZvcihkPSIuIitkLGY9MDtmPGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDtmKyspe2c9ZG9jdW1lbnQuc3R5bGVTaGVldHNbZl0ucnVsZXN8fGRvY3VtZW50LnN0eWxlU2hlZXRzW2ZdLmNzc1J1bGVzO2Zvcih2YXIgayBpbiBnKXtpZihkPT09Z1trXS5zZWxlY3RvclRleHQpe2EuTmU9ITE7YnJlYWs7fX19fWVsc2UgYS5OZT1udWxsLGEuTmU9ITE7fX1lbHNle2s9Y1taYSgiNzZhZDE4YjRmNzNlIildO2ZvcihlPWNbWmEoIjczYTYxMmI2ZmIxOTFkIildKFphKCIzNWU3IikpKzI7ZTxrO2UrKyl7Yis9Y1tlXTt9Yz1iW1phKCI3M2E2MTJiNmZiMTkxZCIpXShaYSgiN2RhNzFjYTBhZDM4MWU5MCIpKTthLk5lPSEoMDw9YyYmYzxiW1phKCI3M2E2MTJiNmZiMTkxZCIpXShaYSgiMzUiKSkpO319fXJldHVybiAwPGEuTmUmJmEhPT1hLiR4PyEwOiExO31mdW5jdGlvbiBBaShhLGIpe2lmKHRoKXt2b2lkIDAhPT1iJiZudWxsIT09Ynx8QSgiRGlhZ3JhbSBzZXR1cCByZXF1aXJlcyBhbiBhcmd1bWVudCBESVYuIik7bnVsbCE9PWEuSWEmJkEoIkRpYWdyYW0gaGFzIGFscmVhZHkgY29tcGxldGVkIHNldHVwLiIpOyJzdHJpbmciPT09dHlwZW9mIGI/YS5JYT13LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOmIgaW5zdGFuY2VvZiBIVE1MRGl2RWxlbWVudD9hLklhPWI6QSgiTm8gRElWIG9yIERJViBpZCBzdXBwbGllZDogIitiKTtudWxsPT09YS5JYSYmQSgiSW52YWxpZCBESVYgaWQ7IGNvdWxkIG5vdCBnZXQgZWxlbWVudCB3aXRoIGlkOiAiK2IpO3ZvaWQgMCE9PWEuSWEuQyYmQSgiSW52YWxpZCBkaXYgaWQ7IGRpdiBhbHJlYWR5IGhhcyBhIERpYWdyYW0gYXNzb2NpYXRlZCB3aXRoIGl0LiIpOyJzdGF0aWMiPT09dy5nZXRDb21wdXRlZFN0eWxlKGEuSWEsbnVsbCkucG9zaXRpb24mJihhLklhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO2EuSWEuc3R5bGVbIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciJdPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDApIjthLklhLnN0eWxlWyItbXMtdG91Y2gtYWN0aW9uIl09Im5vbmUiO2EuSWEuaW5uZXJIVE1MPSIiO2EuSWEuQz1hO3ZhciBjPWEuQXM/bmV3IHlqKGEpOm5ldyB1ayhhKTt2b2lkIDAhPT1jLnN0eWxlJiYoYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUudG9wPSIwcHgiLGMuc3R5bGUubGVmdD0iMHB4IiwicnRsIj09PXcuZ2V0Q29tcHV0ZWRTdHlsZShhLklhLG51bGwpLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpJiYoYS5Ubj0hMCksYy5zdHlsZS56SW5kZXg9IjIiLGMuc3R5bGUudXNlclNlbGVjdD0ibm9uZSIsYy5zdHlsZS53ZWJraXRVc2VyU2VsZWN0PSJub25lIixjLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKTthLkRhPWM7YS5ZYz1jLmNvbnRleHQ7Yj1hLlljO2EuTmI9YS5jb21wdXRlUGl4ZWxSYXRpbygpO2EueGE9YS5JYS5jbGllbnRXaWR0aHx8MTthLndhPWEuSWEuY2xpZW50SGVpZ2h0fHwxO0FqKGEsYS54YSxhLndhKTthLmNyPWZ1bmN0aW9uKCl7cmV0dXJuIHRydWU7fTthLklhLmluc2VydEJlZm9yZShjLkdhLGEuSWEuZmlyc3RDaGlsZCk7Yz1uZXcgdWsobnVsbCk7Yy53aWR0aD0xO2MuaGVpZ2h0PTE7YS5VdD1jO2EudXc9Yy5jb250ZXh0O2lmKHRoKXtjPXZhKCJkaXYiKTt2YXIgZD12YSgiZGl2Iik7Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Muc3R5bGUub3ZlcmZsb3c9ImF1dG8iO2Muc3R5bGUud2lkdGg9YS54YSsicHgiO2Muc3R5bGUuaGVpZ2h0PWEud2ErInB4IjtjLnN0eWxlLnpJbmRleD0iMSI7ZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Quc3R5bGUud2lkdGg9IjFweCI7ZC5zdHlsZS5oZWlnaHQ9IjFweCI7YS5JYS5hcHBlbmRDaGlsZChjKTtjLmFwcGVuZENoaWxkKGQpO2Mub25zY3JvbGw9TWk7Yy5vbm1vdXNlZG93bj1PaTtjLm9udG91Y2hzdGFydD1PaTtjLkM9YTtjLll4PSEwO2MuWng9ITA7YS5wcz1jO2EuZnA9ZDt9YS5vdD10YShmdW5jdGlvbigpe2Euamg9bnVsbDthLlIoKTt9LDMwMCk7YS5adj10YShmdW5jdGlvbigpe1RoKGEpO30sMjUwKTthLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTtyZXR1cm4hMTt9O2EuaWs9ZnVuY3Rpb24oYil7aWYoYS5pc0VuYWJsZWQpe2EuaGU9ITA7dmFyIGM9YWooYSxiLCEwKTthLmRvTW91c2VNb3ZlKCk7YS5jdXJyZW50VG9vbC5pc0JleW9uZERyYWdTaXplKCkmJihhLkZkPTApO2dqKGMsYik7fX07YS5oaz1mdW5jdGlvbihiKXtpZihhLmlzRW5hYmxlZClpZihhLmhlPSEwLGEuUWUpYi5wcmV2ZW50RGVmYXVsdCgpO2Vsc2V7dmFyIGM9YWooYSxiLCEwKTtjLmRvd249ITA7Yy5jbGlja0NvdW50PWIuZGV0YWlsO2lmKGNifHxkYiliLnRpbWVTdGFtcC1hLmtsPGEuQnUmJiFhLmN1cnJlbnRUb29sLmlzQmV5b25kRHJhZ1NpemUoKT9hLkZkKys6YS5GZD0xLGEua2w9Yi50aW1lU3RhbXAsYy5jbGlja0NvdW50PWEuRmQ7Yy5jbG9uZShhLmZpcnN0SW5wdXQpO2EuZG9Nb3VzZURvd24oKTsxPT09Yi5idXR0b24/Yi5wcmV2ZW50RGVmYXVsdCgpOmdqKGMsYik7fX07YS5raz1mdW5jdGlvbihiKXtpZihhLmlzRW5hYmxlZClpZihhLlFlJiYyPT09Yi5idXR0b24pYi5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoYS5RZSYmMD09PWIuYnV0dG9uJiYoYS5RZT0hMSksYS5NbCliLnByZXZlbnREZWZhdWx0KCk7ZWxzZXthLmhlPSEwO3ZhciBjPWFqKGEsYiwhMCk7Yy51cD0hMDtjLmNsaWNrQ291bnQ9Yi5kZXRhaWw7aWYoY2J8fGRiKWMuY2xpY2tDb3VudD1hLkZkO2MuYnViYmxlcz1iLmJ1YmJsZXM7Yy50YXJnZXREaWFncmFtPWNqKGIpO2EuZG9Nb3VzZVVwKCk7YS52ZigpO2dqKGMsYik7fX07YS5saz1mdW5jdGlvbihiKXtpZihhLmlzRW5hYmxlZCl7dmFyIGM9YWooYSxiLCEwKTtjLmJ1YmJsZXM9ITA7dmFyIGQ9MCxlPTA7Yy5kZWx0YT0wO3ZvaWQgMCE9PWIuZGVsdGFYPygwIT09Yi5kZWx0YVgmJihkPTA8Yi5kZWx0YVg/MTotMSksMCE9PWIuZGVsdGFZJiYoZT0wPGIuZGVsdGFZPzE6LTEpLGMuZGVsdGE9TWF0aC5hYnMoYi5kZWx0YVgpPk1hdGguYWJzKGIuZGVsdGFZKT8tZDotZSk6dm9pZCAwIT09Yi53aGVlbERlbHRhWD8oMCE9PWIud2hlZWxEZWx0YVgmJihkPTA8Yi53aGVlbERlbHRhWD8tMToxKSwwIT09Yi53aGVlbERlbHRhWSYmKGU9MDxiLndoZWVsRGVsdGFZPy0xOjEpLGMuZGVsdGE9TWF0aC5hYnMoYi53aGVlbERlbHRhWCk+TWF0aC5hYnMoYi53aGVlbERlbHRhWSk/LWQ6LWUpOnZvaWQgMCE9PWIud2hlZWxEZWx0YSYmMCE9PWIud2hlZWxEZWx0YSYmKGMuZGVsdGE9MDxiLndoZWVsRGVsdGE/MTotMSk7YS5kb01vdXNlV2hlZWwoKTtnaihjLGIpO319O2Euams9ZnVuY3Rpb24oYil7YS5pc0VuYWJsZWQmJihhLmhlPSExLGFqKGEsYiwhMCksYj1hLmN1cnJlbnRUb29sLGIuY2FuY2VsV2FpdEFmdGVyKCksYi5zdGFuZGFyZE1vdXNlT3ZlcigpKTt9O2EuVHY9ZnVuY3Rpb24oYil7aWYoYS5pc0VuYWJsZWQpe2EuTWw9ITE7YS5RZT0hMDt2YXIgYz1kaihhLGIsYi50YXJnZXRUb3VjaGVzWzBdLDE8Yi50b3VjaGVzLmxlbmd0aCksZD1udWxsOzA8Yi50YXJnZXRUb3VjaGVzLmxlbmd0aD9kPWIudGFyZ2V0VG91Y2hlc1swXTowPGIuY2hhbmdlZFRvdWNoZXMubGVuZ3RoJiYoZD1iLmNoYW5nZWRUb3VjaGVzWzBdKTtpZihudWxsIT09ZCl7dmFyIGU9ZC5zY3JlZW5YO2Q9ZC5zY3JlZW5ZO3ZhciBrPWEuSHI7Yi50aW1lU3RhbXAtYS5rbDxhLkJ1JiYhKDI1PE1hdGguYWJzKGsueC1lKXx8MjU8TWF0aC5hYnMoay55LWQpKT9hLkZkKys6YS5GZD0xO2MuY2xpY2tDb3VudD1hLkZkO2Eua2w9Yi50aW1lU3RhbXA7YS5Ici5oKGUsZCk7fWEuZG9Nb3VzZURvd24oKTtnaihjLGIpO319O2EuU3Y9ZnVuY3Rpb24oYil7aWYoYS5pc0VuYWJsZWQpe3ZhciBjPW51bGw7MDxiLnRhcmdldFRvdWNoZXMubGVuZ3RoP2M9Yi50YXJnZXRUb3VjaGVzWzBdOjA8Yi5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJihjPWIuY2hhbmdlZFRvdWNoZXNbMF0pO2M9ZmooYSxiLGMsMTxiLnRvdWNoZXMubGVuZ3RoKTthLmRvTW91c2VNb3ZlKCk7Z2ooYyxiKTt9fTthLlJ2PWZ1bmN0aW9uKGIpe2lmKGEuaXNFbmFibGVkKWlmKGEuTWwpYi5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYoISgxPGIudG91Y2hlcy5sZW5ndGgpKXt2YXIgYz1udWxsLGQ9bnVsbDswPGIudGFyZ2V0VG91Y2hlcy5sZW5ndGg/ZD1iLnRhcmdldFRvdWNoZXNbMF06MDxiLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCYmKGQ9Yi5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIGU9ZWooYSxiLCExLCEwLCExLCExKTtudWxsIT09ZCYmKGM9dy5kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGQuY2xpZW50WCxkLmNsaWVudFkpLG51bGwhPT1jJiZjLkMgaW5zdGFuY2VvZiBQJiZjLkMhPT1hJiZiaihjLkMsZCxlKSxiaihhLGQsZSksZS5jbGlja0NvdW50PWEuRmQpO251bGw9PT1jP2UudGFyZ2V0RGlhZ3JhbT1jaihiKTpjLkM/ZS50YXJnZXREaWFncmFtPWMuQzplLnRhcmdldERpYWdyYW09bnVsbDtlLnRhcmdldE9iamVjdD1udWxsO2EuZG9Nb3VzZVVwKCk7Z2ooZSxiKTthLlFlPSExO319O2EuaW09ZnVuY3Rpb24oYil7aWYoYS5pc0VuYWJsZWQpe2EuaGU9ITA7dmFyIGM9YS5udTt2b2lkIDA9PT1jW2IucG9pbnRlcklkXSYmKGNbYi5wb2ludGVySWRdPWIpO2M9YS52bDt2YXIgZD0hMTtpZihudWxsIT09Y1swXSYmY1swXS5wb2ludGVySWQ9PT1iLnBvaW50ZXJJZCljWzBdPWI7ZWxzZSBpZihudWxsIT09Y1sxXSYmY1sxXS5wb2ludGVySWQ9PT1iLnBvaW50ZXJJZCljWzFdPWIsZD0hMDtlbHNlIGlmKG51bGw9PT1jWzBdKWNbMF09YjtlbHNlIGlmKG51bGw9PT1jWzFdKWNbMV09YixkPSEwO2Vsc2V7Yi5wcmV2ZW50RGVmYXVsdCgpO3JldHVybjt9aWYoInRvdWNoIj09PWIucG9pbnRlclR5cGV8fCJwZW4iPT09Yi5wb2ludGVyVHlwZSlhLk1sPSExLGEuUWU9ITA7Yz1kaihhLGIsYixkKTtkPWEuSHI7dmFyIGU9InRvdWNoIj09PWIucG9pbnRlclR5cGV8fCJwZW4iPT09Yi5wb2ludGVyVHlwZT8yNToxMDtiLnRpbWVTdGFtcC1hLmtsPGEuQnUmJiEoTWF0aC5hYnMoZC54LWIuc2NyZWVuWCk+ZXx8TWF0aC5hYnMoZC55LWIuc2NyZWVuWSk+ZSk/YS5GZCsrOmEuRmQ9MTtjLmNsaWNrQ291bnQ9YS5GZDthLmtsPWIudGltZVN0YW1wO2EuSHIudGcoYi5zY3JlZW5YLGIuc2NyZWVuWSk7YS5kb01vdXNlRG93bigpOzE9PT1iLmJ1dHRvbj9iLnByZXZlbnREZWZhdWx0KCk6Z2ooYyxiKTt9fTthLmptPWZ1bmN0aW9uKGIpe2lmKGEuaXNFbmFibGVkKXthLmhlPSEwO3ZhciBjPWEudmw7aWYobnVsbCE9PWNbMF0mJmNbMF0ucG9pbnRlcklkPT09Yi5wb2ludGVySWQpY1swXT1iO2Vsc2V7aWYobnVsbCE9PWNbMV0mJmNbMV0ucG9pbnRlcklkPT09Yi5wb2ludGVySWQpe2NbMV09YjtyZXR1cm47fWlmKG51bGw9PT1jWzBdKWNbMF09YjtlbHNlIHJldHVybjt9Y1swXS5wb2ludGVySWQ9PT1iLnBvaW50ZXJJZCYmKGM9ZmooYSxiLGIsbnVsbCE9PWNbMV0pLGEuZG9Nb3VzZU1vdmUoKSxnaihjLGIpKTt9fTthLmxtPWZ1bmN0aW9uKGIpe2lmKGEuaXNFbmFibGVkKXthLmhlPSEwO3ZhciBjPSJ0b3VjaCI9PT1iLnBvaW50ZXJUeXBlfHwicGVuIj09PWIucG9pbnRlclR5cGUsZD1hLm51O2lmKGMmJmEuTWwpZGVsZXRlIGRbYi5wb2ludGVySWRdLGIucHJldmVudERlZmF1bHQoKTtlbHNlIGlmKGQ9YS52bCxudWxsIT09ZFswXSYmZFswXS5wb2ludGVySWQ9PT1iLnBvaW50ZXJJZCl7ZFswXT1udWxsO2Q9ZWooYSxiLCExLCEwLCEwLCExKTt2YXIgZT13LmRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoYi5jbGllbnRYLGIuY2xpZW50WSk7bnVsbCE9PWUmJmUuQyBpbnN0YW5jZW9mIFAmJmUuQyE9PWEmJmJqKGUuQyxiLGQpO2JqKGEsYixkKTtkLmNsaWNrQ291bnQ9YS5GZDtudWxsPT09ZT9kLnRhcmdldERpYWdyYW09Y2ooYik6ZS5DP2QudGFyZ2V0RGlhZ3JhbT1lLkM6ZC50YXJnZXREaWFncmFtPW51bGw7ZC50YXJnZXRPYmplY3Q9bnVsbDthLmRvTW91c2VVcCgpO2dqKGQsYik7YyYmKGEuUWU9ITEpO31lbHNlIG51bGwhPT1kWzFdJiZkWzFdLnBvaW50ZXJJZD09PWIucG9pbnRlcklkJiYoZFsxXT1udWxsKTt9fTthLmttPWZ1bmN0aW9uKGIpe2lmKGEuaXNFbmFibGVkKXthLmhlPSExO3ZhciBjPWEubnU7Y1tiLnBvaW50ZXJJZF0mJmRlbGV0ZSBjW2IucG9pbnRlcklkXTtjPWEudmw7bnVsbCE9PWNbMF0mJmNbMF0ucG9pbnRlcklkPT09Yi5wb2ludGVySWQmJihjWzBdPW51bGwpO251bGwhPT1jWzFdJiZjWzFdLnBvaW50ZXJJZD09PWIucG9pbnRlcklkJiYoY1sxXT1udWxsKTsidG91Y2giIT09Yi5wb2ludGVyVHlwZSYmInBlbiIhPT1iLnBvaW50ZXJUeXBlJiYoYj1hLmN1cnJlbnRUb29sLGIuY2FuY2VsV2FpdEFmdGVyKCksYi5zdGFuZGFyZE1vdXNlT3ZlcigpKTt9fTtiLlJjKCEwKTtLaShhKTt9fXppLmNsYXNzTmFtZT0iRGlhZ3JhbUhlbHBlciI7ZnVuY3Rpb24gT2YoYSl7dGhpcy5sPXZvaWQgMD09PWE/bmV3IEcoKTphO3RoaXMudT1uZXcgRygpO31wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhPZi5wcm90b3R5cGUse3BvaW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5sPWE7fX0sc2hpZnRlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudT1hO319fSk7T2YuY2xhc3NOYW1lPSJEcmFnZ2luZ0luZm8iO2Z1bmN0aW9uIE1qKGEsYixjKXt0aGlzLm5vZGU9YTt0aGlzLmluZm89Yjt0aGlzLmV2PWM7fU1qLmNsYXNzTmFtZT0iRHJhZ2dpbmdOb2RlSW5mb1BhaXIiO2Z1bmN0aW9uIHlmKCl7dGhpcy5yZXNldCgpO315Zi5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmlzR3JpZFNuYXBFbmFibGVkPSExO3RoaXMuaXNHcmlkU25hcFJlYWx0aW1lPSEwO3RoaXMuZ3JpZFNuYXBDZWxsU2l6ZT1uZXcgSyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLmdyaWRTbmFwQ2VsbFNwb3Q9VGM7dGhpcy5ncmlkU25hcE9yaWdpbj1uZXcgRyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLmt6PXRoaXMuZHJhZ3NUcmVlPXRoaXMuZHJhZ3NMaW5rPSExO307ZnVuY3Rpb24gQmsoYSl7MTxhcmd1bWVudHMubGVuZ3RoJiZBKCJQYWxldHRlIGNvbnN0cnVjdG9yIGNhbiBvbmx5IHRha2Ugb25lIG9wdGlvbmFsIGFyZ3VtZW50LCB0aGUgRElWIEhUTUwgZWxlbWVudCBvciBpdHMgaWQuIik7UC5jYWxsKHRoaXMsYSk7dGhpcy5hbGxvd0RyYWdPdXQ9ITA7dGhpcy5hbGxvd01vdmU9ITE7dGhpcy5pc1JlYWRPbmx5PSEwO3RoaXMuY29udGVudEFsaWdubWVudD1VYzt0aGlzLmxheW91dD1uZXcgQ2soKTt9b2EoQmssUCk7QmsuY2xhc3NOYW1lPSJQYWxldHRlIjtmdW5jdGlvbiBEayhhKXsxPGFyZ3VtZW50cy5sZW5ndGgmJkEoIk92ZXJ2aWV3IGNvbnN0cnVjdG9yIGNhbiBvbmx5IHRha2Ugb25lIG9wdGlvbmFsIGFyZ3VtZW50LCB0aGUgRElWIEhUTUwgZWxlbWVudCBvciBpdHMgaWQuIik7UC5jYWxsKHRoaXMsYSk7dGhpcy5hbmltYXRpb25NYW5hZ2VyLmlzRW5hYmxlZD0hMTt0aGlzLm9iPSEwO3RoaXMuWWY9bnVsbDt0aGlzLmRyPSEwO3RoaXMuSngoImRyYXdTaGFkb3dzIiwhMSk7dmFyIGI9bmV3IFQoKSxjPW5ldyBXKCk7Yy5zdHJva2U9Im1hZ2VudGEiO2Muc3Ryb2tlV2lkdGg9MjtjLmZpbGw9InRyYW5zcGFyZW50IjtjLm5hbWU9IkJPWFNIQVBFIjtiLnNlbGVjdGFibGU9ITA7Yi5zZWxlY3Rpb25BZG9ybmVkPSExO2Iuc2VsZWN0aW9uT2JqZWN0TmFtZT0iQk9YU0hBUEUiO2IubG9jYXRpb25PYmplY3ROYW1lPSJCT1hTSEFQRSI7Yi5yZXNpemVPYmplY3ROYW1lPSJCT1hTSEFQRSI7Yi5jdXJzb3I9Im1vdmUiO2IuYWRkKGMpO3RoaXMubD1iO3RoaXMuYWxsb3dEZWxldGU9dGhpcy5hbGxvd0NvcHk9ITE7dGhpcy5hbGxvd1NlbGVjdD0hMDt0aGlzLmF1dG9TY3JvbGxSZWdpb249bmV3IEljKDAsMCwwLDApO3RoaXMueXU9bmV3IHVrKG51bGwpO3RoaXMuYXk9dGhpcy55dS5jb250ZXh0O3ZmKHRoaXMudG9vbE1hbmFnZXIsIkRyYWdnaW5nIixuZXcgRWsoKSx0aGlzLnRvb2xNYW5hZ2VyLm1vdXNlTW92ZVRvb2xzKTt2YXIgZD10aGlzO3RoaXMuY2xpY2s9ZnVuY3Rpb24oKXt2YXIgYT1kLllmO2lmKG51bGwhPT1hKXt2YXIgYj1hLnZpZXdwb3J0Qm91bmRzLGM9ZC5sYXN0SW5wdXQuZG9jdW1lbnRQb2ludDthLnBvc2l0aW9uPW5ldyBHKGMueC1iLndpZHRoLzIsYy55LWIuaGVpZ2h0LzIpO319O3RoaXMuR209ZnVuY3Rpb24oKXtkLlhhKCk7RmsoZCk7fTt0aGlzLkVtPWZ1bmN0aW9uKCl7bnVsbCE9PWQuWWYmJihkLlhhKCksZC5SKCkpO307dGhpcy5GbT1mdW5jdGlvbigpe2QuUigpO307dGhpcy5EbT1mdW5jdGlvbigpe251bGwhPT1kLllmJiZGayhkKTt9O3RoaXMuYXV0b1NjYWxlPVdpO3RoaXMub2I9ITE7fW9hKERrLFApO2Z1bmN0aW9uIEdrKGEpe2Eub2J8fGEuWmJ8fCExIT09YS5xZHx8KGEucWQ9ITAsdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtpZihhLnFkJiYhYS5aYiYmKGEucWQ9ITEsbnVsbCE9PWEuSWEpKXthLlpiPSEwO1FpKGEpO2EuZG9jdW1lbnRCb3VuZHMubygpfHxWaShhLGEuY29tcHV0ZUJvdW5kcygpKTtudWxsPT09YS5JYSYmQSgiTm8gZGl2IHNwZWNpZmllZCIpO251bGw9PT1hLkRhJiZBKCJObyBjYW52YXMgc3BlY2lmaWVkIik7Z2koYS5ib3gpO2lmKGEubmMpe3ZhciBiPWEuWWY7aWYobnVsbCE9PWImJiFiLmFuaW1hdGlvbk1hbmFnZXIuaXNBbmltYXRpbmcmJiFiLmFuaW1hdGlvbk1hbmFnZXIucmIpe2I9YS5ZYzt2YXIgYz1hLnl1O2Iuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtiLmNsZWFyUmVjdCgwLDAsYS5EYS53aWR0aCxhLkRhLmhlaWdodCk7Yi5kcmF3SW1hZ2UoYy5HYSwwLDApO2M9YS50YjtjLnJlc2V0KCk7MSE9PWEuc2NhbGUmJmMuc2NhbGUoYS5zY2FsZSk7MD09PWEucG9zaXRpb24ueCYmMD09PWEucG9zaXRpb24ueXx8Yy50cmFuc2xhdGUoLWEucG9zaXRpb24ueCwtYS5wb3NpdGlvbi55KTtiLnNjYWxlKGEuTmIsYS5OYik7Yi50cmFuc2Zvcm0oYy5tMTEsYy5tMTIsYy5tMjEsYy5tMjIsYy5keCxjLmR5KTtjPWEuUGEuajtmb3IodmFyIGQ9Yy5sZW5ndGgsZT0wO2U8ZDtlKyspe2NbZV0uaGMoYixhKTt9YS5iaT0hMTthLm5jPSExO319YS5aYj0hMTt9fSkpO31Eay5wcm90b3R5cGUuY29tcHV0ZVBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gMTt9O0RrLnByb3RvdHlwZS5oYz1mdW5jdGlvbigpe251bGw9PT10aGlzLklhJiZBKCJObyBkaXYgc3BlY2lmaWVkIik7bnVsbD09PXRoaXMuRGEmJkEoIk5vIGNhbnZhcyBzcGVjaWZpZWQiKTtpZighKHRoaXMuRGEgaW5zdGFuY2VvZiB5aikmJihnaSh0aGlzLmJveCksdGhpcy5uYykpe3ZhciBhPXRoaXMuWWY7aWYobnVsbCE9PWEmJiFhLmFuaW1hdGlvbk1hbmFnZXIuaXNBbmltYXRpbmcpe3JqKHRoaXMpO3ZhciBiPWEuZ3JpZDtudWxsPT09Ynx8IWIudmlzaWJsZXx8aXNOYU4oYi53aWR0aCl8fGlzTmFOKGIuaGVpZ2h0KXx8KGI9Ti5hbGxvYygpLmFzc2lnbih0aGlzLnZpZXdwb3J0Qm91bmRzKS5KYyhhLnZpZXdwb3J0Qm91bmRzKSxraihhLGIpLE4uZnJlZShiKSxRaShhKSk7dmFyIGM9dGhpcy5EYTtiPXRoaXMuWWM7dmFyIGQ9dGhpcy55dSxlPXRoaXMuYXk7ZC53aWR0aD1jLndpZHRoO2QuaGVpZ2h0PWMuaGVpZ2h0O2IuUmMoITApO2Iuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtiLmNsZWFyUmVjdCgwLDAsYy53aWR0aCxjLmhlaWdodCk7ZD10aGlzLnRiO2QucmVzZXQoKTsxIT09dGhpcy5zY2FsZSYmZC5zY2FsZSh0aGlzLnNjYWxlKTswPT09dGhpcy5wb3NpdGlvbi54JiYwPT09dGhpcy5wb3NpdGlvbi55fHxkLnRyYW5zbGF0ZSgtdGhpcy5wb3NpdGlvbi54LC10aGlzLnBvc2l0aW9uLnkpO2Iuc2NhbGUodGhpcy5OYix0aGlzLk5iKTtiLnRyYW5zZm9ybShkLm0xMSxkLm0xMixkLm0yMSxkLm0yMixkLmR4LGQuZHkpO2Q9dGhpcy5kcjt2YXIgZj10aGlzLnZpZXdwb3J0Qm91bmRzO2E9YS5QYS5qO2Zvcih2YXIgZz1hLmxlbmd0aCxoPTA7aDxnO2grKyl7dmFyIGs9YVtoXSxsPWQ7aWYoay52aXNpYmxlJiYwIT09ay5sYiYmKHZvaWQgMD09PWwmJihsPSEwKSxsfHwhay5pc1RlbXBvcmFyeSkpezEhPT1rLmxiJiYoYi5nbG9iYWxBbHBoYT1rLmxiKTtsPXRoaXMuc2NhbGU7az1rLkZhLmo7Zm9yKHZhciBtPWsubGVuZ3RoLG49MDtuPG07bisrKXt2YXIgcD1rW25dLHE9cC5hY3R1YWxCb3VuZHM7cS5JYyhmKSYmKDE8cS53aWR0aCpsfHwxPHEuaGVpZ2h0Kmw/cC5oYyhiLHRoaXMpOmlpKGIscCkpO31iLmdsb2JhbEFscGhhPTE7fX1lLmRyYXdJbWFnZShjLkdhLDAsMCk7Yz10aGlzLlBhLmo7ZT1jLmxlbmd0aDtmb3IoZD0wO2Q8ZTtkKyspe2NbZF0uaGMoYix0aGlzKTt9dGhpcy5uYz10aGlzLmJpPSExO319fTtmdW5jdGlvbiBGayhhKXt2YXIgYj1hLmJveDtpZihudWxsIT09Yil7dmFyIGM9YS5ZZjtpZihudWxsIT09Yyl7YS5uYz0hMDtjPWMudmlld3BvcnRCb3VuZHM7dmFyIGQ9Yi5zZWxlY3Rpb25PYmplY3QsZT1LLmFsbG9jKCk7ZS5oKGMud2lkdGgsYy5oZWlnaHQpO2QuZGVzaXJlZFNpemU9ZTtLLmZyZWUoZSk7YT0yL2Euc2NhbGU7ZCBpbnN0YW5jZW9mIFcmJihkLnN0cm9rZVdpZHRoPWEpO2IubG9jYXRpb249bmV3IEcoYy54LWEvMixjLnktYS8yKTtiLmlzU2VsZWN0ZWQ9ITA7fX19RGsucHJvdG90eXBlLmNvbXB1dGVCb3VuZHM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLllmO2lmKG51bGw9PT1hKXJldHVybiBHYzt2YXIgYj1hLmRvY3VtZW50Qm91bmRzLmNvcHkoKTtiLkpjKGEudmlld3BvcnRCb3VuZHMpO3JldHVybiBiO307RGsucHJvdG90eXBlLm94PWZ1bmN0aW9uKCl7ITAhPT10aGlzLm5jJiYodGhpcy5uYz0hMCxHayh0aGlzKSk7fTtEay5wcm90b3R5cGUuaXE9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5vYnx8KFBpKHRoaXMpLHRoaXMuUigpLGhqKHRoaXMpLHRoaXMuWGEoKSxGayh0aGlzKSx0aGlzLndlLnNjYWxlPWMsdGhpcy53ZS5wb3NpdGlvbi54PWEueCx0aGlzLndlLnBvc2l0aW9uLnk9YS55LHRoaXMud2UuYm91bmRzLmFzc2lnbihhKSx0aGlzLndlLnF4PWQsdGhpcy5hYSgiVmlld3BvcnRCb3VuZHNDaGFuZ2VkIix0aGlzLndlLGEpKTt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERrLnByb3RvdHlwZSx7b2JzZXJ2ZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ZZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ZZjthIGluc3RhbmNlb2YgRGsmJkEoIk92ZXJ2aWV3Lm9ic2VydmVkIERpYWdyYW0gbWF5IG5vdCBiZSBhbiBPdmVydmlldyBpdHNlbGY6ICIrYSk7YiE9PWEmJihudWxsIT09YiYmKHRoaXMucmVtb3ZlKHRoaXMuYm94KSxiLm1tKCJWaWV3cG9ydEJvdW5kc0NoYW5nZWQiLHRoaXMuR20pLGIubW0oIkRvY3VtZW50Qm91bmRzQ2hhbmdlZCIsdGhpcy5FbSksYi5tbSgiSW52YWxpZGF0ZURyYXciLHRoaXMuRm0pLGIubW0oIkFuaW1hdGlvbkZpbmlzaGVkIix0aGlzLkRtKSksdGhpcy5ZZj1hLG51bGwhPT1hJiYoYS5OaigiVmlld3BvcnRCb3VuZHNDaGFuZ2VkIix0aGlzLkdtKSxhLk5qKCJEb2N1bWVudEJvdW5kc0NoYW5nZWQiLHRoaXMuRW0pLGEuTmooIkludmFsaWRhdGVEcmF3Iix0aGlzLkZtKSxhLk5qKCJBbmltYXRpb25GaW5pc2hlZCIsdGhpcy5EbSksdGhpcy5hZGQodGhpcy5ib3gpLEZrKHRoaXMpKSx0aGlzLlhhKCksdGhpcy5nKCJvYnNlcnZlZCIsYixhKSk7fX0sYm94OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5sO2IhPT1hJiYodGhpcy5sPWEsdGhpcy5yZW1vdmUoYiksdGhpcy5hZGQodGhpcy5sKSxGayh0aGlzKSx0aGlzLmcoImJveCIsYixhKSk7fX0sZHJhd3NUZW1wb3JhcnlMYXllcnM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5kcjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5kciE9PWEmJih0aGlzLmRyPWEsdGhpcy5zZigpKTt9fX0pO0RrLmNsYXNzTmFtZT0iT3ZlcnZpZXciO2Z1bmN0aW9uIEVrKCl7eGYuY2FsbCh0aGlzKTt0aGlzLmw9bnVsbDt9b2EoRWsseGYpO0VrLnByb3RvdHlwZS5jYW5TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW5hYmxlZClyZXR1cm4hMTt2YXIgYT10aGlzLmRpYWdyYW07aWYobnVsbD09PWF8fCFhLmFsbG93TW92ZXx8IWEuYWxsb3dTZWxlY3QpcmV0dXJuITE7dmFyIGI9YS5vYnNlcnZlZDtpZihudWxsPT09YilyZXR1cm4hMTt2YXIgYz1hLmxhc3RJbnB1dDtpZighYy5sZWZ0fHxhLmN1cnJlbnRUb29sIT09dGhpcyYmKCF0aGlzLmlzQmV5b25kRHJhZ1NpemUoKXx8Yy5pc1RvdWNoRXZlbnQmJmMudGltZXN0YW1wLWEuZmlyc3RJbnB1dC50aW1lc3RhbXA8dGhpcy5kZWxheSkpcmV0dXJuITE7bnVsbD09PXRoaXMuZmluZERyYWdnYWJsZVBhcnQoKSYmKGM9Yi52aWV3cG9ydEJvdW5kcyx0aGlzLmw9bmV3IEcoYy53aWR0aC8yLGMuaGVpZ2h0LzIpLGE9YS5maXJzdElucHV0LmRvY3VtZW50UG9pbnQsYi5wb3NpdGlvbj1uZXcgRyhhLngtdGhpcy5sLngsYS55LXRoaXMubC55KSk7cmV0dXJuITA7fTtFay5wcm90b3R5cGUuZG9BY3RpdmF0ZT1mdW5jdGlvbigpe3RoaXMubD1udWxsO3hmLnByb3RvdHlwZS5kb0FjdGl2YXRlLmNhbGwodGhpcyk7fTtFay5wcm90b3R5cGUubW92ZVBhcnRzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLGI9YS5vYnNlcnZlZDtpZihudWxsIT09Yil7dmFyIGM9YS5ib3g7aWYobnVsbCE9PWMpe2lmKG51bGw9PT10aGlzLmwpe3ZhciBkPWEuZmlyc3RJbnB1dC5kb2N1bWVudFBvaW50O2M9Yy5sb2NhdGlvbjt0aGlzLmw9bmV3IEcoZC54LWMueCxkLnktYy55KTt9YT1hLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50O2IucG9zaXRpb249bmV3IEcoYS54LXRoaXMubC54LGEueS10aGlzLmwueSk7fX19O0VrLmNsYXNzTmFtZT0iT3ZlcnZpZXdEcmFnZ2luZ1Rvb2wiO2Z1bmN0aW9uIEhrKCl7bWIodGhpcyk7dGhpcy5DPWxmO3RoaXMuVmI9dGhpcy5LPXRoaXMudT0hMDt0aGlzLmJhPXRoaXMuTGE9dGhpcy5XYj10aGlzLk1hPSExO3RoaXMuamk9dGhpcy5sPW51bGw7dGhpcy5WYz0xLjA1O3RoaXMuZXU9TmFOO3RoaXMuQXc9bnVsbDt0aGlzLkV1PU5hTjt0aGlzLkR1PUdjO3RoaXMuY2c9bnVsbDt0aGlzLktjPTIwMDt9SGsucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkNvbW1hbmRIYW5kbGVyIjt9O0hrLnByb3RvdHlwZS5oYj1mdW5jdGlvbihhKXt0aGlzLkM9YTt9O0hrLnByb3RvdHlwZS5kb0tleURvd249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW0sYj1hLmxhc3RJbnB1dCxjPWliP2IubWV0YTpiLmNvbnRyb2wsZD1iLnNoaWZ0LGU9Yi5hbHQsZj1iLmtleTshY3x8IkMiIT09ZiYmIkluc2VydCIhPT1mP2MmJiJYIj09PWZ8fGQmJiJEZWwiPT09Zj90aGlzLmNhbkN1dFNlbGVjdGlvbigpJiZ0aGlzLmN1dFNlbGVjdGlvbigpOmMmJiJWIj09PWZ8fGQmJiJJbnNlcnQiPT09Zj90aGlzLmNhblBhc3RlU2VsZWN0aW9uKCkmJnRoaXMucGFzdGVTZWxlY3Rpb24oKTpjJiYiWSI9PT1mfHxlJiZkJiYiQmFja3NwYWNlIj09PWY/dGhpcy5jYW5SZWRvKCkmJnRoaXMucmVkbygpOmMmJiJaIj09PWZ8fGUmJiJCYWNrc3BhY2UiPT09Zj90aGlzLmNhblVuZG8oKSYmdGhpcy51bmRvKCk6IkRlbCI9PT1mfHwiQmFja3NwYWNlIj09PWY/dGhpcy5jYW5EZWxldGVTZWxlY3Rpb24oKSYmdGhpcy5kZWxldGVTZWxlY3Rpb24oKTpjJiYiQSI9PT1mP3RoaXMuY2FuU2VsZWN0QWxsKCkmJnRoaXMuc2VsZWN0QWxsKCk6IkVzYyI9PT1mP3RoaXMuY2FuU3RvcENvbW1hbmQoKSYmdGhpcy5zdG9wQ29tbWFuZCgpOiJVcCI9PT1mP2EuYWxsb3dWZXJ0aWNhbFNjcm9sbCYmKGM/YS5zY3JvbGwoInBpeGVsIiwidXAiKTphLnNjcm9sbCgibGluZSIsInVwIikpOiJEb3duIj09PWY/YS5hbGxvd1ZlcnRpY2FsU2Nyb2xsJiYoYz9hLnNjcm9sbCgicGl4ZWwiLCJkb3duIik6YS5zY3JvbGwoImxpbmUiLCJkb3duIikpOiJMZWZ0Ij09PWY/YS5hbGxvd0hvcml6b250YWxTY3JvbGwmJihjP2Euc2Nyb2xsKCJwaXhlbCIsImxlZnQiKTphLnNjcm9sbCgibGluZSIsImxlZnQiKSk6IlJpZ2h0Ij09PWY/YS5hbGxvd0hvcml6b250YWxTY3JvbGwmJihjP2Euc2Nyb2xsKCJwaXhlbCIsInJpZ2h0Iik6YS5zY3JvbGwoImxpbmUiLCJyaWdodCIpKToiUGFnZVVwIj09PWY/ZCYmYS5hbGxvd0hvcml6b250YWxTY3JvbGw/YS5zY3JvbGwoInBhZ2UiLCJsZWZ0Iik6YS5hbGxvd1ZlcnRpY2FsU2Nyb2xsJiZhLnNjcm9sbCgicGFnZSIsInVwIik6IlBhZ2VEb3duIj09PWY/ZCYmYS5hbGxvd0hvcml6b250YWxTY3JvbGw/YS5zY3JvbGwoInBhZ2UiLCJyaWdodCIpOmEuYWxsb3dWZXJ0aWNhbFNjcm9sbCYmYS5zY3JvbGwoInBhZ2UiLCJkb3duIik6IkhvbWUiPT09Zj9jJiZhLmFsbG93VmVydGljYWxTY3JvbGw/YS5zY3JvbGwoImRvY3VtZW50IiwidXAiKTohYyYmYS5hbGxvd0hvcml6b250YWxTY3JvbGwmJmEuc2Nyb2xsKCJkb2N1bWVudCIsImxlZnQiKToiRW5kIj09PWY/YyYmYS5hbGxvd1ZlcnRpY2FsU2Nyb2xsP2Euc2Nyb2xsKCJkb2N1bWVudCIsImRvd24iKTohYyYmYS5hbGxvd0hvcml6b250YWxTY3JvbGwmJmEuc2Nyb2xsKCJkb2N1bWVudCIsInJpZ2h0Iik6IiAiPT09Zj90aGlzLmNhblNjcm9sbFRvUGFydCgpJiZ0aGlzLnNjcm9sbFRvUGFydCgpOiJTdWJ0cmFjdCI9PT1mP3RoaXMuY2FuRGVjcmVhc2Vab29tKCkmJnRoaXMuZGVjcmVhc2Vab29tKCk6IkFkZCI9PT1mP3RoaXMuY2FuSW5jcmVhc2Vab29tKCkmJnRoaXMuaW5jcmVhc2Vab29tKCk6YyYmIjAiPT09Zj90aGlzLmNhblJlc2V0Wm9vbSgpJiZ0aGlzLnJlc2V0Wm9vbSgpOmQmJiJaIj09PWY/dGhpcy5jYW5ab29tVG9GaXQoKSYmdGhpcy56b29tVG9GaXQoKTpjJiYhZCYmIkciPT09Zj90aGlzLmNhbkdyb3VwU2VsZWN0aW9uKCkmJnRoaXMuZ3JvdXBTZWxlY3Rpb24oKTpjJiZkJiYiRyI9PT1mP3RoaXMuY2FuVW5ncm91cFNlbGVjdGlvbigpJiZ0aGlzLnVuZ3JvdXBTZWxlY3Rpb24oKTpiLmV2ZW50JiYxMTM9PT1iLmV2ZW50LndoaWNoP3RoaXMuY2FuRWRpdFRleHRCbG9jaygpJiZ0aGlzLmVkaXRUZXh0QmxvY2soKTpiLmV2ZW50JiY5Mz09PWIuZXZlbnQud2hpY2g/dGhpcy5jYW5TaG93Q29udGV4dE1lbnUoKSYmdGhpcy5zaG93Q29udGV4dE1lbnUoKTpiLmJ1YmJsZXM9ITA6dGhpcy5jYW5Db3B5U2VsZWN0aW9uKCkmJnRoaXMuY29weVNlbGVjdGlvbigpO307SGsucHJvdG90eXBlLmRvS2V5VXA9ZnVuY3Rpb24oKXt0aGlzLmRpYWdyYW0ubGFzdElucHV0LmJ1YmJsZXM9ITA7fTtIay5wcm90b3R5cGUuc3RvcENvbW1hbmQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW0sYj1hLmN1cnJlbnRUb29sO2IgaW5zdGFuY2VvZiBVYSYmYS5hbGxvd1NlbGVjdCYmYS5McygpO251bGwhPT1iJiZiLmRvQ2FuY2VsKCk7fTtIay5wcm90b3R5cGUuY2FuU3RvcENvbW1hbmQ9ZnVuY3Rpb24oKXtyZXR1cm4hMDt9O0hrLnByb3RvdHlwZS5zZWxlY3RBbGw9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07YS5SKCk7dHJ5e2EuY3VycmVudEN1cnNvcj0id2FpdCI7YS5hYSgiQ2hhbmdpbmdTZWxlY3Rpb24iLGEuc2VsZWN0aW9uKTtmb3IodmFyIGI9YS5wYXJ0cztiLm5leHQoKTspe2IudmFsdWUuaXNTZWxlY3RlZD0hMDt9Zm9yKHZhciBjPWEubm9kZXM7Yy5uZXh0KCk7KXtjLnZhbHVlLmlzU2VsZWN0ZWQ9ITA7fWZvcih2YXIgZD1hLmxpbmtzO2QubmV4dCgpOyl7ZC52YWx1ZS5pc1NlbGVjdGVkPSEwO319ZmluYWxseXthLmFhKCJDaGFuZ2VkU2VsZWN0aW9uIixhLnNlbGVjdGlvbiksYS5jdXJyZW50Q3Vyc29yPSIiO319O0hrLnByb3RvdHlwZS5jYW5TZWxlY3RBbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaWFncmFtLmFsbG93U2VsZWN0O307SGsucHJvdG90eXBlLmRlbGV0ZVNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTt0cnl7YS5jdXJyZW50Q3Vyc29yPSJ3YWl0IjthLkFhKCJEZWxldGUiKTthLmFhKCJDaGFuZ2luZ1NlbGVjdGlvbiIsYS5zZWxlY3Rpb24pO2EuYWEoIlNlbGVjdGlvbkRlbGV0aW5nIixhLnNlbGVjdGlvbik7Zm9yKHZhciBiPW5ldyBGKCksYz1hLnNlbGVjdGlvbi5pdGVyYXRvcjtjLm5leHQoKTspe0lrKGIsYy52YWx1ZSwhMCx0aGlzLmRlbGV0ZXNUcmVlP0luZmluaXR5OjAsdGhpcy5kZWxldGVzQ29ubmVjdGVkTGlua3M/bnVsbDohMSxmdW5jdGlvbihhKXtyZXR1cm4gYS5jYW5EZWxldGUoKTt9KTt9YS5ydChiLCEwKTthLmFhKCJTZWxlY3Rpb25EZWxldGVkIixiKTt9ZmluYWxseXthLmFhKCJDaGFuZ2VkU2VsZWN0aW9uIixhLnNlbGVjdGlvbiksYS5aYSgiRGVsZXRlIiksYS5jdXJyZW50Q3Vyc29yPSIiO319O0hrLnByb3RvdHlwZS5jYW5EZWxldGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07cmV0dXJuIGEuaXNSZWFkT25seXx8YS5pc01vZGVsUmVhZE9ubHl8fCFhLmFsbG93RGVsZXRlfHwwPT09YS5zZWxlY3Rpb24uY291bnQ/ITE6ITA7fTtIay5wcm90b3R5cGUuY29weVNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbSxiPW5ldyBGKCk7Zm9yKGE9YS5zZWxlY3Rpb24uaXRlcmF0b3I7YS5uZXh0KCk7KXtJayhiLGEudmFsdWUsITAsdGhpcy5jb3BpZXNUcmVlP0luZmluaXR5OjAsdGhpcy5jb3BpZXNDb25uZWN0ZWRMaW5rcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5jYW5Db3B5KCk7fSk7fXRoaXMuY29weVRvQ2xpcGJvYXJkKGIpO307SGsucHJvdG90eXBlLmNhbkNvcHlTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07cmV0dXJuIGEuYWxsb3dDb3B5JiZhLmFsbG93Q2xpcGJvYXJkJiYwIT09YS5zZWxlY3Rpb24uY291bnQ/ITA6ITE7fTtIay5wcm90b3R5cGUuY3V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy5jb3B5U2VsZWN0aW9uKCk7dGhpcy5kZWxldGVTZWxlY3Rpb24oKTt9O0hrLnByb3RvdHlwZS5jYW5DdXRTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07cmV0dXJuIWEuaXNSZWFkT25seSYmIWEuaXNNb2RlbFJlYWRPbmx5JiZhLmFsbG93Q29weSYmYS5hbGxvd0RlbGV0ZSYmYS5hbGxvd0NsaXBib2FyZCYmMCE9PWEuc2VsZWN0aW9uLmNvdW50PyEwOiExO307SGsucHJvdG90eXBlLmNvcHlUb0NsaXBib2FyZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmRpYWdyYW0sYz1udWxsO2lmKG51bGw9PT1hKUJpPW51bGwsQ2k9IiI7ZWxzZXtjPWIubW9kZWw7dmFyIGQ9ITEsZT0hMSxmPW51bGw7dHJ5e2MuZm0oKSYmKGQ9Yy5XaixjLldqPXRoaXMuY29waWVzUGFyZW50S2V5KSxjLmNrKCkmJihlPWMuVmosYy5Waj10aGlzLmNvcGllc0dyb3VwS2V5KSxmPWIuWGooYSxudWxsLCEwKTt9ZmluYWxseXtjLmZtKCkmJihjLldqPWQpLGMuY2soKSYmKGMuVmo9ZSksYz1uZXcgRSgpLGMuYWRkQWxsKGYpLEJpPWMsQ2k9Yi5tb2RlbC5kYXRhRm9ybWF0O319Yi5hYSgiQ2xpcGJvYXJkQ2hhbmdlZCIsYyk7fTtIay5wcm90b3R5cGUucGFzdGVGcm9tQ2xpcGJvYXJkPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IEYoKSxiPUJpO2lmKG51bGw9PT1iKXJldHVybiBhO3ZhciBjPXRoaXMuZGlhZ3JhbTtpZihDaSE9PWMubW9kZWwuZGF0YUZvcm1hdClyZXR1cm4gYTt2YXIgZD1jLm1vZGVsLGU9ITEsZj0hMSxnPW51bGw7dHJ5e2QuZm0oKSYmKGU9ZC5XaixkLldqPXRoaXMuY29waWVzUGFyZW50S2V5KSxkLmNrKCkmJihmPWQuVmosZC5Waj10aGlzLmNvcGllc0dyb3VwS2V5KSxnPWMuWGooYixjLCExKTt9ZmluYWxseXtmb3IoZC5mbSgpJiYoZC5Xaj1lKSxkLmNrKCkmJihkLlZqPWYpLGI9Zy5pdGVyYXRvcjtiLm5leHQoKTspe2M9Yi52YWx1ZSxkPWIua2V5LGMubG9jYXRpb24ubygpfHwoZC5sb2NhdGlvbi5vKCk/Yy5sb2NhdGlvbj1kLmxvY2F0aW9uOiFjLnBvc2l0aW9uLm8oKSYmZC5wb3NpdGlvbi5vKCkmJihjLnBvc2l0aW9uPWQucG9zaXRpb24pKSxhLmFkZChjKTt9fXJldHVybiBhO307SGsucHJvdG90eXBlLnBhc3RlU2VsZWN0aW9uPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO3ZhciBiPXRoaXMuZGlhZ3JhbTt0cnl7Yi5jdXJyZW50Q3Vyc29yPSJ3YWl0IjtiLkFhKCJQYXN0ZSIpO2IuYWEoIkNoYW5naW5nU2VsZWN0aW9uIixiLnNlbGVjdGlvbik7dmFyIGM9dGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQoKTswPGMuY291bnQmJkhmKGIpO2Zvcih2YXIgZD1jLml0ZXJhdG9yO2QubmV4dCgpOyl7ZC52YWx1ZS5pc1NlbGVjdGVkPSEwO31iLmFhKCJDaGFuZ2VkU2VsZWN0aW9uIixiLnNlbGVjdGlvbik7aWYobnVsbCE9PWEpe3ZhciBlPWIuY29tcHV0ZVBhcnRzQm91bmRzKGIuc2VsZWN0aW9uKTtpZihlLm8oKSl7dmFyIGY9dGhpcy5jb21wdXRlRWZmZWN0aXZlQ29sbGVjdGlvbihiLnNlbGVjdGlvbixiLkxrKTtiZyhiLGYsbmV3IEcoYS54LWUuY2VudGVyWCxhLnktZS5jZW50ZXJZKSxiLkxrLCExKTt9fWIuYWEoIkNsaXBib2FyZFBhc3RlZCIsYyk7fWZpbmFsbHl7Yi5aYSgiUGFzdGUiKSxiLmN1cnJlbnRDdXJzb3I9IiI7fX07SGsucHJvdG90eXBlLmNhblBhc3RlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO3JldHVybiBhLmlzUmVhZE9ubHl8fGEuaXNNb2RlbFJlYWRPbmx5fHwhYS5hbGxvd0luc2VydHx8IWEuYWxsb3dDbGlwYm9hcmR8fG51bGw9PT1CaXx8MD09PUJpLmNvdW50fHxDaSE9PWEubW9kZWwuZGF0YUZvcm1hdD8hMTohMDt9O0hrLnByb3RvdHlwZS51bmRvPWZ1bmN0aW9uKCl7dGhpcy5kaWFncmFtLnVuZG9NYW5hZ2VyLnVuZG8oKTt9O0hrLnByb3RvdHlwZS5jYW5VbmRvPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO3JldHVybiBhLmlzUmVhZE9ubHl8fGEuaXNNb2RlbFJlYWRPbmx5PyExOmEuYWxsb3dVbmRvJiZhLnVuZG9NYW5hZ2VyLmNhblVuZG8oKTt9O0hrLnByb3RvdHlwZS5yZWRvPWZ1bmN0aW9uKCl7dGhpcy5kaWFncmFtLnVuZG9NYW5hZ2VyLnJlZG8oKTt9O0hrLnByb3RvdHlwZS5jYW5SZWRvPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO3JldHVybiBhLmlzUmVhZE9ubHl8fGEuaXNNb2RlbFJlYWRPbmx5PyExOmEuYWxsb3dVbmRvJiZhLnVuZG9NYW5hZ2VyLmNhblJlZG8oKTt9O0hrLnByb3RvdHlwZS5kZWNyZWFzZVpvb209ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9MS90aGlzLnpvb21GYWN0b3IpO3ZhciBiPXRoaXMuZGlhZ3JhbTtiLmF1dG9TY2FsZT09PXBpJiYoYT1iLnNjYWxlKmEsYTxiLm1pblNjYWxlfHxhPmIubWF4U2NhbGV8fChiLnNjYWxlPWEpKTt9O0hrLnByb3RvdHlwZS5jYW5EZWNyZWFzZVpvb209ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9MS90aGlzLnpvb21GYWN0b3IpO3ZhciBiPXRoaXMuZGlhZ3JhbTtpZihiLmF1dG9TY2FsZSE9PXBpKXJldHVybiExO2E9Yi5zY2FsZSphO3JldHVybiBhPGIubWluU2NhbGV8fGE+Yi5tYXhTY2FsZT8hMTpiLmFsbG93Wm9vbTt9O0hrLnByb3RvdHlwZS5pbmNyZWFzZVpvb209ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9dGhpcy56b29tRmFjdG9yKTt2YXIgYj10aGlzLmRpYWdyYW07Yi5hdXRvU2NhbGU9PT1waSYmKGE9Yi5zY2FsZSphLGE8Yi5taW5TY2FsZXx8YT5iLm1heFNjYWxlfHwoYi5zY2FsZT1hKSk7fTtIay5wcm90b3R5cGUuY2FuSW5jcmVhc2Vab29tPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPXRoaXMuem9vbUZhY3Rvcik7dmFyIGI9dGhpcy5kaWFncmFtO2lmKGIuYXV0b1NjYWxlIT09cGkpcmV0dXJuITE7YT1iLnNjYWxlKmE7cmV0dXJuIGE8Yi5taW5TY2FsZXx8YT5iLm1heFNjYWxlPyExOmIuYWxsb3dab29tO307SGsucHJvdG90eXBlLnJlc2V0Wm9vbT1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT10aGlzLmRlZmF1bHRTY2FsZSk7dmFyIGI9dGhpcy5kaWFncmFtO2E8Yi5taW5TY2FsZXx8YT5iLm1heFNjYWxlfHwoYi5zY2FsZT1hKTt9O0hrLnByb3RvdHlwZS5jYW5SZXNldFpvb209ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9dGhpcy5kZWZhdWx0U2NhbGUpO3ZhciBiPXRoaXMuZGlhZ3JhbTtyZXR1cm4gYTxiLm1pblNjYWxlfHxhPmIubWF4U2NhbGU/ITE6Yi5hbGxvd1pvb207fTtIay5wcm90b3R5cGUuem9vbVRvRml0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLGI9YS5zY2FsZSxjPWEucG9zaXRpb247Yj09PXRoaXMuRXUmJiFpc05hTih0aGlzLmV1KSYmYS5kb2N1bWVudEJvdW5kcy5BKHRoaXMuRHUpPyhhLnNjYWxlPXRoaXMuZXUsYS5wb3NpdGlvbj10aGlzLkF3LHRoaXMuRXU9TmFOLHRoaXMuRHU9R2MpOih0aGlzLmV1PWIsdGhpcy5Bdz1jLmNvcHkoKSxhLnpvb21Ub0ZpdCgpLHRoaXMuRXU9YS5zY2FsZSx0aGlzLkR1PWEuZG9jdW1lbnRCb3VuZHMuY29weSgpKTt9O0hrLnByb3RvdHlwZS5jYW5ab29tVG9GaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaWFncmFtLmFsbG93Wm9vbTt9O0hrLnByb3RvdHlwZS5zY3JvbGxUb1BhcnQ9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9bnVsbCk7dmFyIGI9dGhpcy5kaWFncmFtO2lmKG51bGw9PT1hKXt0cnl7bnVsbCE9PXRoaXMuY2cmJih0aGlzLmNnLm5leHQoKT9hPXRoaXMuY2cudmFsdWU6dGhpcy5jZz1udWxsKTt9Y2F0Y2goayl7dGhpcy5jZz1udWxsO31udWxsPT09YSYmKDA8Yi5oaWdobGlnaHRlZHMuY291bnQ/dGhpcy5jZz1iLmhpZ2hsaWdodGVkcy5pdGVyYXRvcjowPGIuc2VsZWN0aW9uLmNvdW50JiYodGhpcy5jZz1iLnNlbGVjdGlvbi5pdGVyYXRvciksbnVsbCE9PXRoaXMuY2cmJnRoaXMuY2cubmV4dCgpJiYoYT10aGlzLmNnLnZhbHVlKSk7fWlmKG51bGwhPT1hKXt2YXIgYz1iLmFuaW1hdGlvbk1hbmFnZXI7Yy5SaSgiU2Nyb2xsIFRvIFBhcnQiKTt2YXIgZD10aGlzLnNjcm9sbFRvUGFydFBhdXNlO2lmKDA8ZCl7dmFyIGU9SmsodGhpcyxhLFthXSksZj1mdW5jdGlvbiBmKCl7Yi5BYSgpO2Zvcih2YXIgYT1lLnBvcCgpOzA8ZS5sZW5ndGgmJmEgaW5zdGFuY2VvZiBWJiZhLmlzVHJlZUV4cGFuZGVkJiYoIShhIGluc3RhbmNlb2YgaWcpfHxhLmlzU3ViR3JhcGhFeHBhbmRlZCk7KXthPWUucG9wKCk7fTA8ZS5sZW5ndGg/KGEgaW5zdGFuY2VvZiBUJiZiLkZ2KGEuYWN0dWFsQm91bmRzKSxhIGluc3RhbmNlb2YgViYmIWEuaXNUcmVlRXhwYW5kZWQmJihhLmlzVHJlZUV4cGFuZGVkPSEwKSxhIGluc3RhbmNlb2YgaWcmJiFhLmlzU3ViR3JhcGhFeHBhbmRlZCYmKGEuaXNTdWJHcmFwaEV4cGFuZGVkPSEwKSk6KGEgaW5zdGFuY2VvZiBUJiZiLkp1KGEuYWN0dWFsQm91bmRzKSxiLm1tKCJMYXlvdXRDb21wbGV0ZWQiLGcpKTtiLlphKCJTY3JvbGwgVG8gUGFydCIpO30sZz1mdW5jdGlvbiBnKCl7dWEoZiwoYy5pc0VuYWJsZWQ/Yy5kdXJhdGlvbjowKStkKTt9O2IuTmooIkxheW91dENvbXBsZXRlZCIsZyk7ZigpO31lbHNle3ZhciBoPWIucG9zaXRpb24uY29weSgpO2IuSnUoYS5hY3R1YWxCb3VuZHMpO2guUWEoYi5wb3NpdGlvbikmJmMudmQoKTt9fX07ZnVuY3Rpb24gSmsoYSxiLGMpe2lmKGIuaXNWaXNpYmxlKCkpcmV0dXJuIGM7aWYoYiBpbnN0YW5jZW9mIHBmKUprKGEsYi5hZG9ybmVkUGFydCxjKTtlbHNlIGlmKGIgaW5zdGFuY2VvZiBTKXt2YXIgZD1iLmZyb21Ob2RlO251bGwhPT1kJiZKayhhLGQsYyk7Yj1iLnRvTm9kZTtudWxsIT09YiYmSmsoYSxiLGMpO31lbHNlIGIgaW5zdGFuY2VvZiBWJiYoZD1iLmxhYmVsZWRMaW5rLG51bGwhPT1kJiZKayhhLGQsYyksZD1iLm9nKCksbnVsbCE9PWQmJihkLmlzVHJlZUV4cGFuZGVkfHxkLndhc1RyZWVFeHBhbmRlZHx8Yy5wdXNoKGQpLEprKGEsZCxjKSkpLGI9Yi5jb250YWluaW5nR3JvdXAsbnVsbCE9PWImJihiLmlzU3ViR3JhcGhFeHBhbmRlZHx8Yi53YXNTdWJHcmFwaEV4cGFuZGVkfHxjLnB1c2goYiksSmsoYSxiLGMpKTtyZXR1cm4gYzt9SGsucHJvdG90eXBlLmNhblNjcm9sbFRvUGFydD1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTtpZihudWxsIT09YSYmIShhIGluc3RhbmNlb2YgVCkpcmV0dXJuITE7YT10aGlzLmRpYWdyYW07cmV0dXJuIDA9PT1hLnNlbGVjdGlvbi5jb3VudCYmMD09PWEuaGlnaGxpZ2h0ZWRzLmNvdW50PyExOmEuYWxsb3dIb3Jpem9udGFsU2Nyb2xsJiZhLmFsbG93VmVydGljYWxTY3JvbGw7fTtIay5wcm90b3R5cGUuY29sbGFwc2VUcmVlPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO3ZhciBiPXRoaXMuZGlhZ3JhbTt0cnl7Yi5BYSgiQ29sbGFwc2UgVHJlZSIpO2IuYW5pbWF0aW9uTWFuYWdlci5SaSgiQ29sbGFwc2UgVHJlZSIpO3ZhciBjPW5ldyBFKCk7aWYobnVsbCE9PWEmJmEuaXNUcmVlRXhwYW5kZWQpYS5jb2xsYXBzZVRyZWUoKSxjLmFkZChhKTtlbHNlIGlmKG51bGw9PT1hKWZvcih2YXIgZD1iLnNlbGVjdGlvbi5pdGVyYXRvcjtkLm5leHQoKTspe3ZhciBlPWQudmFsdWU7ZSBpbnN0YW5jZW9mIFYmJmUuaXNUcmVlRXhwYW5kZWQmJihlLmNvbGxhcHNlVHJlZSgpLGMuYWRkKGUpKTt9Yi5hYSgiVHJlZUNvbGxhcHNlZCIsYyk7fWZpbmFsbHl7Yi5aYSgiQ29sbGFwc2UgVHJlZSIpO319O0hrLnByb3RvdHlwZS5jYW5Db2xsYXBzZVRyZWU9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9bnVsbCk7dmFyIGI9dGhpcy5kaWFncmFtO2lmKGIuaXNSZWFkT25seSlyZXR1cm4hMTtpZihudWxsIT09YSl7aWYoIShhIGluc3RhbmNlb2YgViYmYS5pc1RyZWVFeHBhbmRlZCkpcmV0dXJuITE7aWYoMDxhLlVwKCkuY291bnQpcmV0dXJuITA7fWVsc2UgZm9yKGE9Yi5zZWxlY3Rpb24uaXRlcmF0b3I7YS5uZXh0KCk7KXtpZihiPWEudmFsdWUsYiBpbnN0YW5jZW9mIFYmJmIuaXNUcmVlRXhwYW5kZWQmJjA8Yi5VcCgpLmNvdW50KXJldHVybiEwO31yZXR1cm4hMTt9O0hrLnByb3RvdHlwZS5leHBhbmRUcmVlPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO3ZhciBiPXRoaXMuZGlhZ3JhbTt0cnl7Yi5BYSgiRXhwYW5kIFRyZWUiKTtiLmFuaW1hdGlvbk1hbmFnZXIuUmkoIkV4cGFuZCBUcmVlIik7dmFyIGM9bmV3IEUoKTtpZihudWxsIT09YSYmIWEuaXNUcmVlRXhwYW5kZWQpYS5leHBhbmRUcmVlKCksYy5hZGQoYSk7ZWxzZSBpZihudWxsPT09YSlmb3IodmFyIGQ9Yi5zZWxlY3Rpb24uaXRlcmF0b3I7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlO2UgaW5zdGFuY2VvZiBWJiYhZS5pc1RyZWVFeHBhbmRlZCYmKGUuZXhwYW5kVHJlZSgpLGMuYWRkKGUpKTt9Yi5hYSgiVHJlZUV4cGFuZGVkIixjKTt9ZmluYWxseXtiLlphKCJFeHBhbmQgVHJlZSIpO319O0hrLnByb3RvdHlwZS5jYW5FeHBhbmRUcmVlPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO3ZhciBiPXRoaXMuZGlhZ3JhbTtpZihiLmlzUmVhZE9ubHkpcmV0dXJuITE7aWYobnVsbCE9PWEpe2lmKCEoYSBpbnN0YW5jZW9mIFYpfHxhLmlzVHJlZUV4cGFuZGVkKXJldHVybiExO2lmKDA8YS5VcCgpLmNvdW50KXJldHVybiEwO31lbHNlIGZvcihhPWIuc2VsZWN0aW9uLml0ZXJhdG9yO2EubmV4dCgpOyl7aWYoYj1hLnZhbHVlLGIgaW5zdGFuY2VvZiBWJiYhYi5pc1RyZWVFeHBhbmRlZCYmMDxiLlVwKCkuY291bnQpcmV0dXJuITA7fXJldHVybiExO307SGsucHJvdG90eXBlLmdyb3VwU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtLGI9YS5tb2RlbDtpZihiLmRrKCkpe3ZhciBjPXRoaXMuYXJjaGV0eXBlR3JvdXBEYXRhO2lmKG51bGwhPT1jKXt2YXIgZD1udWxsO3RyeXthLmN1cnJlbnRDdXJzb3I9IndhaXQiO2EuQWEoIkdyb3VwIik7YS5hYSgiQ2hhbmdpbmdTZWxlY3Rpb24iLGEuc2VsZWN0aW9uKTtmb3IodmFyIGU9bmV3IEUoKSxmPWEuc2VsZWN0aW9uLml0ZXJhdG9yO2YubmV4dCgpOyl7dmFyIGc9Zi52YWx1ZTtnLkxiKCkmJmcuY2FuR3JvdXAoKSYmZS5hZGQoZyk7fWZvcih2YXIgaD1uZXcgRSgpLGs9ZS5pdGVyYXRvcjtrLm5leHQoKTspe3ZhciBsPWsudmFsdWU7Zj0hMTtmb3IodmFyIG09ZS5pdGVyYXRvcjttLm5leHQoKTspe2lmKGwuVmQobS52YWx1ZSkpe2Y9ITA7YnJlYWs7fX1mfHxoLmFkZChsKTt9aWYoMDxoLmNvdW50KXt2YXIgbj1oLmZpcnN0KCkuY29udGFpbmluZ0dyb3VwO2lmKG51bGwhPT1uKWZvcig7bnVsbCE9PW47KXtlPSExO2Zvcih2YXIgcD1oLml0ZXJhdG9yO3AubmV4dCgpOyl7aWYoIXAudmFsdWUuVmQobikpe2U9ITA7YnJlYWs7fX1pZihlKW49bi5jb250YWluaW5nR3JvdXA7ZWxzZSBicmVhazt9aWYoYyBpbnN0YW5jZW9mIGlnKVlnKGMpLGQ9Yy5jb3B5KCksbnVsbCE9PWQmJmEuYWRkKGQpO2Vsc2UgaWYoYi5rdihjKSl7dmFyIHE9Yi5jb3B5Tm9kZURhdGEoYyk7Q2EocSkmJihiLmhmKHEpLGQ9YS5FaShxKSk7fWlmKG51bGwhPT1kKXtudWxsIT09biYmdGhpcy5pc1ZhbGlkTWVtYmVyKG4sZCkmJihkLmNvbnRhaW5pbmdHcm91cD1uKTtmb3IodmFyIHI9aC5pdGVyYXRvcjtyLm5leHQoKTspe3ZhciB1PXIudmFsdWU7dGhpcy5pc1ZhbGlkTWVtYmVyKGQsdSkmJih1LmNvbnRhaW5pbmdHcm91cD1kKTt9YS5zZWxlY3QoZCk7fX1hLmFhKCJDaGFuZ2VkU2VsZWN0aW9uIixhLnNlbGVjdGlvbik7YS5hYSgiU2VsZWN0aW9uR3JvdXBlZCIsZCk7fWZpbmFsbHl7YS5aYSgiR3JvdXAiKSxhLmN1cnJlbnRDdXJzb3I9IiI7fX19fTtIay5wcm90b3R5cGUuY2FuR3JvdXBTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07aWYoYS5pc1JlYWRPbmx5fHxhLmlzTW9kZWxSZWFkT25seXx8IWEuYWxsb3dJbnNlcnR8fCFhLmFsbG93R3JvdXB8fCFhLm1vZGVsLmRrKCl8fG51bGw9PT10aGlzLmFyY2hldHlwZUdyb3VwRGF0YSlyZXR1cm4hMTtmb3IoYT1hLnNlbGVjdGlvbi5pdGVyYXRvcjthLm5leHQoKTspe3ZhciBiPWEudmFsdWU7aWYoYi5MYigpJiZiLmNhbkdyb3VwKCkpcmV0dXJuITA7fXJldHVybiExO307ZnVuY3Rpb24gS2soYSl7dmFyIGI9S2EoKTtmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGM9YS52YWx1ZTtjIGluc3RhbmNlb2YgU3x8Yi5wdXNoKGMpO31hPW5ldyBGKCk7Yz1iLmxlbmd0aDtmb3IodmFyIGQ9MDtkPGM7ZCsrKXtmb3IodmFyIGU9YltkXSxmPSEwLGc9MDtnPGM7ZysrKXtpZihlLlZkKGJbZ10pKXtmPSExO2JyZWFrO319ZiYmYS5hZGQoZSk7fU9hKGIpO3JldHVybiBhO31Iay5wcm90b3R5cGUuaXNWYWxpZE1lbWJlcj1mdW5jdGlvbihhLGIpe2lmKG51bGw9PT1ifHxhPT09Ynx8YiBpbnN0YW5jZW9mIFMpcmV0dXJuITE7aWYobnVsbCE9PWEpe2lmKGE9PT1ifHxhLlZkKGIpKXJldHVybiExO3ZhciBjPWEubWVtYmVyVmFsaWRhdGlvbjtpZihudWxsIT09YyYmIWMoYSxiKXx8bnVsbD09PWEuZGF0YSYmbnVsbCE9PWIuZGF0YXx8bnVsbCE9PWEuZGF0YSYmbnVsbD09PWIuZGF0YSlyZXR1cm4hMTt9Yz10aGlzLm1lbWJlclZhbGlkYXRpb247cmV0dXJuIG51bGwhPT1jP2MoYSxiKTohMDt9O0hrLnByb3RvdHlwZS51bmdyb3VwU2VsZWN0aW9uPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO3ZhciBiPXRoaXMuZGlhZ3JhbSxjPWIubW9kZWw7aWYoYy5kaygpKXRyeXtiLmN1cnJlbnRDdXJzb3I9IndhaXQiO2IuQWEoIlVuZ3JvdXAiKTtiLmFhKCJDaGFuZ2luZ1NlbGVjdGlvbiIsYi5zZWxlY3Rpb24pO3ZhciBkPW5ldyBFKCk7aWYobnVsbCE9PWEpZC5hZGQoYSk7ZWxzZSBmb3IodmFyIGU9Yi5zZWxlY3Rpb24uaXRlcmF0b3I7ZS5uZXh0KCk7KXt2YXIgZj1lLnZhbHVlO2YgaW5zdGFuY2VvZiBpZyYmZi5jYW5Vbmdyb3VwKCkmJmQuYWRkKGYpO312YXIgZz1uZXcgRSgpO2lmKDA8ZC5jb3VudCl7Yi5McygpO2Zvcih2YXIgaD1kLml0ZXJhdG9yO2gubmV4dCgpOyl7dmFyIGs9aC52YWx1ZTtrLmV4cGFuZFN1YkdyYXBoKCk7dmFyIGw9ay5jb250YWluaW5nR3JvdXAsbT1udWxsIT09bCYmbnVsbCE9PWwuZGF0YT9jLnBhKGwuZGF0YSk6dm9pZCAwO2cuYWRkQWxsKGsubWVtYmVyUGFydHMpO2Zvcih2YXIgbj1nLml0ZXJhdG9yO24ubmV4dCgpOyl7dmFyIHA9bi52YWx1ZTtwLmlzU2VsZWN0ZWQ9ITA7aWYoIShwIGluc3RhbmNlb2YgUykpe3ZhciBxPXAuZGF0YTtudWxsIT09cT9jLnV0KHEsbSk6cC5jb250YWluaW5nR3JvdXA9bDt9fWIucmVtb3ZlKGspO319Yi5hYSgiQ2hhbmdlZFNlbGVjdGlvbiIsYi5zZWxlY3Rpb24pO2IuYWEoIlNlbGVjdGlvblVuZ3JvdXBlZCIsZCxnKTt9ZmluYWxseXtiLlphKCJVbmdyb3VwIiksYi5jdXJyZW50Q3Vyc29yPSIiO319O0hrLnByb3RvdHlwZS5jYW5Vbmdyb3VwU2VsZWN0aW9uPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO3ZhciBiPXRoaXMuZGlhZ3JhbTtpZihiLmlzUmVhZE9ubHl8fGIuaXNNb2RlbFJlYWRPbmx5fHwhYi5hbGxvd0RlbGV0ZXx8IWIuYWxsb3dVbmdyb3VwfHwhYi5tb2RlbC5kaygpKXJldHVybiExO2lmKG51bGwhPT1hKXtpZighKGEgaW5zdGFuY2VvZiBpZykpcmV0dXJuITE7aWYoYS5jYW5Vbmdyb3VwKCkpcmV0dXJuITA7fWVsc2UgZm9yKGE9Yi5zZWxlY3Rpb24uaXRlcmF0b3I7YS5uZXh0KCk7KXtpZihiPWEudmFsdWUsYiBpbnN0YW5jZW9mIGlnJiZiLmNhblVuZ3JvdXAoKSlyZXR1cm4hMDt9cmV0dXJuITE7fTtIay5wcm90b3R5cGUuYWRkVG9wTGV2ZWxQYXJ0cz1mdW5jdGlvbihhLGIpe3ZhciBjPSEwO2ZvcihhPUtrKGEpLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGQ9YS52YWx1ZTtudWxsIT09ZC5jb250YWluaW5nR3JvdXAmJighYnx8dGhpcy5pc1ZhbGlkTWVtYmVyKG51bGwsZCk/ZC5jb250YWluaW5nR3JvdXA9bnVsbDpjPSExKTt9cmV0dXJuIGM7fTtIay5wcm90b3R5cGUuY29sbGFwc2VTdWJHcmFwaD1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTt2YXIgYj10aGlzLmRpYWdyYW07dHJ5e2IuQWEoIkNvbGxhcHNlIFN1YkdyYXBoIik7Yi5hbmltYXRpb25NYW5hZ2VyLlJpKCJDb2xsYXBzZSBTdWJHcmFwaCIpO3ZhciBjPW5ldyBFKCk7aWYobnVsbCE9PWEmJmEuaXNTdWJHcmFwaEV4cGFuZGVkKWEuY29sbGFwc2VTdWJHcmFwaCgpLGMuYWRkKGEpO2Vsc2UgaWYobnVsbD09PWEpZm9yKHZhciBkPWIuc2VsZWN0aW9uLml0ZXJhdG9yO2QubmV4dCgpOyl7dmFyIGU9ZC52YWx1ZTtlIGluc3RhbmNlb2YgaWcmJmUuaXNTdWJHcmFwaEV4cGFuZGVkJiYoZS5jb2xsYXBzZVN1YkdyYXBoKCksYy5hZGQoZSkpO31iLmFhKCJTdWJHcmFwaENvbGxhcHNlZCIsYyk7fWZpbmFsbHl7Yi5aYSgiQ29sbGFwc2UgU3ViR3JhcGgiKTt9fTtIay5wcm90b3R5cGUuY2FuQ29sbGFwc2VTdWJHcmFwaD1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTt2YXIgYj10aGlzLmRpYWdyYW07aWYoYi5pc1JlYWRPbmx5KXJldHVybiExO2lmKG51bGwhPT1hKXJldHVybiBhIGluc3RhbmNlb2YgaWcmJmEuaXNTdWJHcmFwaEV4cGFuZGVkPyEwOiExO2ZvcihhPWIuc2VsZWN0aW9uLml0ZXJhdG9yO2EubmV4dCgpOyl7aWYoYj1hLnZhbHVlLGIgaW5zdGFuY2VvZiBpZyYmYi5pc1N1YkdyYXBoRXhwYW5kZWQpcmV0dXJuITA7fXJldHVybiExO307SGsucHJvdG90eXBlLmV4cGFuZFN1YkdyYXBoPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO3ZhciBiPXRoaXMuZGlhZ3JhbTt0cnl7Yi5BYSgiRXhwYW5kIFN1YkdyYXBoIik7Yi5hbmltYXRpb25NYW5hZ2VyLlJpKCJFeHBhbmQgU3ViR3JhcGgiKTt2YXIgYz1uZXcgRSgpO2lmKG51bGwhPT1hJiYhYS5pc1N1YkdyYXBoRXhwYW5kZWQpYS5leHBhbmRTdWJHcmFwaCgpLGMuYWRkKGEpO2Vsc2UgaWYobnVsbD09PWEpZm9yKHZhciBkPWIuc2VsZWN0aW9uLml0ZXJhdG9yO2QubmV4dCgpOyl7dmFyIGU9ZC52YWx1ZTtlIGluc3RhbmNlb2YgaWcmJiFlLmlzU3ViR3JhcGhFeHBhbmRlZCYmKGUuZXhwYW5kU3ViR3JhcGgoKSxjLmFkZChlKSk7fWIuYWEoIlN1YkdyYXBoRXhwYW5kZWQiLGMpO31maW5hbGx5e2IuWmEoIkV4cGFuZCBTdWJHcmFwaCIpO319O0hrLnByb3RvdHlwZS5jYW5FeHBhbmRTdWJHcmFwaD1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTt2YXIgYj10aGlzLmRpYWdyYW07aWYoYi5pc1JlYWRPbmx5KXJldHVybiExO2lmKG51bGwhPT1hKXJldHVybiBhIGluc3RhbmNlb2YgaWcmJiFhLmlzU3ViR3JhcGhFeHBhbmRlZD8hMDohMTtmb3IoYT1iLnNlbGVjdGlvbi5pdGVyYXRvcjthLm5leHQoKTspe2lmKGI9YS52YWx1ZSxiIGluc3RhbmNlb2YgaWcmJiFiLmlzU3ViR3JhcGhFeHBhbmRlZClyZXR1cm4hMDt9cmV0dXJuITE7fTtIay5wcm90b3R5cGUuZWRpdFRleHRCbG9jaz1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTt2YXIgYj10aGlzLmRpYWdyYW0sYz1iLnRvb2xNYW5hZ2VyLmZpbmRUb29sKCJUZXh0RWRpdGluZyIpO2lmKG51bGwhPT1jKXtpZihudWxsPT09YSl7YT1udWxsO2Zvcih2YXIgZD1iLnNlbGVjdGlvbi5pdGVyYXRvcjtkLm5leHQoKTspe3ZhciBlPWQudmFsdWU7aWYoZS5jYW5FZGl0KCkpe2E9ZTticmVhazt9fWlmKG51bGw9PT1hKXJldHVybjthPWEuWWwoZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB2aCYmYS5lZGl0YWJsZTt9KTt9bnVsbCE9PWEmJihiLmN1cnJlbnRUb29sPW51bGwsYy50ZXh0QmxvY2s9YSxiLmN1cnJlbnRUb29sPWMpO319O0hrLnByb3RvdHlwZS5jYW5FZGl0VGV4dEJsb2NrPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO3ZhciBiPXRoaXMuZGlhZ3JhbTtpZihiLmlzUmVhZE9ubHl8fGIuaXNNb2RlbFJlYWRPbmx5fHwhYi5hbGxvd1RleHRFZGl0fHxudWxsPT09Yi50b29sTWFuYWdlci5maW5kVG9vbCgiVGV4dEVkaXRpbmciKSlyZXR1cm4hMTtpZihudWxsIT09YSl7aWYoIShhIGluc3RhbmNlb2YgdmgpKXJldHVybiExO2E9YS5wYXJ0O2lmKG51bGwhPT1hJiZhLmNhbkVkaXQoKSlyZXR1cm4hMDt9ZWxzZSBmb3IoYj1iLnNlbGVjdGlvbi5pdGVyYXRvcjtiLm5leHQoKTspe2lmKGE9Yi52YWx1ZSxhLmNhbkVkaXQoKSYmKGE9YS5ZbChmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHZoJiZhLmVkaXRhYmxlO30pLG51bGwhPT1hKSlyZXR1cm4hMDt9cmV0dXJuITE7fTtIay5wcm90b3R5cGUuc2hvd0NvbnRleHRNZW51PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZGlhZ3JhbSxjPWIudG9vbE1hbmFnZXIuZmluZFRvb2woIkNvbnRleHRNZW51Iik7aWYobnVsbCE9PWMmJih2b2lkIDA9PT1hJiYoYT0wPGIuc2VsZWN0aW9uLmNvdW50P2Iuc2VsZWN0aW9uLmZpcnN0KCk6YiksYT1jLmZpbmRPYmplY3RXaXRoQ29udGV4dE1lbnUoYSksbnVsbCE9PWEpKXt2YXIgZD1iLmxhc3RJbnB1dCxlPW51bGw7YSBpbnN0YW5jZW9mIFk/ZT1hLm1hKGRkKTpiLmlzTW91c2VPdmVyRGlhZ3JhbXx8KGU9Yi52aWV3cG9ydEJvdW5kcyxlPW5ldyBHKGUueCtlLndpZHRoLzIsZS55K2UuaGVpZ2h0LzIpKTtudWxsIT09ZSYmKGQudmlld1BvaW50PWIueHQoZSksZC5kb2N1bWVudFBvaW50PWUsZC5sZWZ0PSExLGQucmlnaHQ9ITAsZC51cD0hMCk7Yi5jdXJyZW50VG9vbD1jO3JoKGMsITEsYSk7fX07SGsucHJvdG90eXBlLmNhblNob3dDb250ZXh0TWVudT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmRpYWdyYW0sYz1iLnRvb2xNYW5hZ2VyLmZpbmRUb29sKCJDb250ZXh0TWVudSIpO2lmKG51bGw9PT1jKXJldHVybiExO3ZvaWQgMD09PWEmJihhPTA8Yi5zZWxlY3Rpb24uY291bnQ/Yi5zZWxlY3Rpb24uZmlyc3QoKTpiKTtyZXR1cm4gbnVsbD09PWMuZmluZE9iamVjdFdpdGhDb250ZXh0TWVudShhKT8hMTohMDt9O0hrLnByb3RvdHlwZS5jb21wdXRlRWZmZWN0aXZlQ29sbGVjdGlvbj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZGlhZ3JhbSxkPWMudG9vbE1hbmFnZXIuZmluZFRvb2woIkRyYWdnaW5nIiksZT1jLmN1cnJlbnRUb29sPT09ZDt2b2lkIDA9PT1iJiYoYj1lP2QuZHJhZ09wdGlvbnM6Yy5Mayk7ZD1uZXcgTGIoKTtpZihudWxsPT09YSlyZXR1cm4gZDtmb3IodmFyIGY9YS5pdGVyYXRvcjtmLm5leHQoKTspe0tqKGMsZCxmLnZhbHVlLGUsYik7fWlmKG51bGwhPT1jLmRyYWdnZWRMaW5rJiZiLmRyYWdzTGluaylyZXR1cm4gZDtmb3IoZj1hLml0ZXJhdG9yO2YubmV4dCgpOyl7YT1mLnZhbHVlLGEgaW5zdGFuY2VvZiBTJiYoYj1hLmZyb21Ob2RlLG51bGw9PT1ifHxkLmNvbnRhaW5zKGIpPyhiPWEudG9Ob2RlLG51bGw9PT1ifHxkLmNvbnRhaW5zKGIpfHxkLnJlbW92ZShhKSk6ZC5yZW1vdmUoYSkpO31yZXR1cm4gZDt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEhrLnByb3RvdHlwZSx7ZGlhZ3JhbTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkM7fX0sY29waWVzQ2xpcGJvYXJkRGF0YTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudT1hO319LGNvcGllc0Nvbm5lY3RlZExpbmtzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LPWE7fX0sZGVsZXRlc0Nvbm5lY3RlZExpbmtzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVmI9YTt9fSxjb3BpZXNUcmVlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTWE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTWE9YTt9fSxkZWxldGVzVHJlZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLldiO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLldiPWE7fX0sY29waWVzUGFyZW50S2V5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTGE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTGE9YTt9fSxjb3BpZXNHcm91cEtleTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmJhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmJhPWE7fX0sYXJjaGV0eXBlR3JvdXBEYXRhOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5sPWE7fX0sbWVtYmVyVmFsaWRhdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmppO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmppPWE7fX0sZGVmYXVsdFNjYWxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZGlhZ3JhbS5kZWZhdWx0U2NhbGU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuZGlhZ3JhbS5kZWZhdWx0U2NhbGU9YTt9fSx6b29tRmFjdG9yOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpezE8YXx8QSgiem9vbUZhY3RvciBtdXN0IGJlIGxhcmdlciB0aGFuIDEuMCwgbm90OiAiK2EpO3RoaXMuVmM9YTt9fSxzY3JvbGxUb1BhcnRQYXVzZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLktjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLktjPWE7fX19KTtIay5jbGFzc05hbWU9IkNvbW1hbmRIYW5kbGVyIjt3aT1mdW5jdGlvbiB3aSgpe3JldHVybiBuZXcgSGsoKTt9O2Z1bmN0aW9uIFkoKXttYih0aGlzKTt0aGlzLkg9NDIyNTAyNzt0aGlzLmxiPTE7dGhpcy5hZz1udWxsO3RoaXMuVWE9IiI7dGhpcy5kYz10aGlzLmliPW51bGw7dGhpcy5zYT1uZXcgRyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLk5jPW1jO3RoaXMuUWY9ZmM7dGhpcy5QZj1sYzt0aGlzLnRiPW5ldyBRYygpO3RoaXMuRGg9bmV3IFFjKCk7dGhpcy5OZj1uZXcgUWMoKTt0aGlzLkNhPXRoaXMuU2s9MTt0aGlzLnpjPTA7dGhpcy51ZT1Mazt0aGlzLlRnPU9jO3RoaXMucGM9bmV3IE4oTmFOLE5hTixOYU4sTmFOKS5mcmVlemUoKTt0aGlzLnZiPW5ldyBOKE5hTixOYU4sTmFOLE5hTikuZnJlZXplKCk7dGhpcy5xYz1uZXcgTigwLDAsTmFOLE5hTikuZnJlZXplKCk7dGhpcy5QPXRoaXMuT289dGhpcy5Qbz1udWxsO3RoaXMud2s9dGhpcy53Yj1FZDt0aGlzLmFwPTA7dGhpcy5icD0xO3RoaXMuQ2c9MDt0aGlzLlptPTE7dGhpcy5ycD1udWxsO3RoaXMuZ3A9LUluZmluaXR5O3RoaXMueWw9MDt0aGlzLnpsPWFjO3RoaXMuQWw9T2c7dGhpcy5qbj0iIjt0aGlzLmJiPXRoaXMuTz1udWxsO3RoaXMuRGs9LTE7dGhpcy5DbD10aGlzLmtkPXRoaXMuU2g9dGhpcy5GbD1udWxsO3RoaXMuanM9Wmc7dGhpcy5QbT10aGlzLkFqPW51bGw7fXZhciBiZSxaZyxhaCxMayxNayxOayxPayxQayxRayxSaztZLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZD1mdW5jdGlvbihhKXthLkg9dGhpcy5IfDYxNDQ7YS5sYj10aGlzLmxiO2EuVWE9dGhpcy5VYTthLmliPXRoaXMuaWI7YS5kYz10aGlzLmRjO2EuUG09dGhpcy5QbTthLnNhLmFzc2lnbih0aGlzLnNhKTthLk5jPXRoaXMuTmMuSSgpO2EuUWY9dGhpcy5RZi5JKCk7YS5QZj10aGlzLlBmLkkoKTthLk5mPXRoaXMuTmYuY29weSgpO2EuQ2E9dGhpcy5DYTthLnpjPXRoaXMuemM7YS51ZT10aGlzLnVlO2EuVGc9dGhpcy5UZy5JKCk7YS5wYy5hc3NpZ24odGhpcy5wYyk7YS52Yi5hc3NpZ24odGhpcy52Yik7YS5xYy5hc3NpZ24odGhpcy5xYyk7YS5Pbz10aGlzLk9vO251bGwhPT10aGlzLlAmJihhLlA9dGhpcy5QLmNvcHkoKSk7YS53Yj10aGlzLndiLkkoKTthLndrPXRoaXMud2suSSgpO2EuYXA9dGhpcy5hcDthLmJwPXRoaXMuYnA7YS5DZz10aGlzLkNnO2EuWm09dGhpcy5abTthLnJwPXRoaXMucnA7YS5ncD10aGlzLmdwO2EueWw9dGhpcy55bDthLnpsPXRoaXMuemwuSSgpO2EuQWw9dGhpcy5BbDthLmpuPXRoaXMuam47bnVsbCE9PXRoaXMuTyYmKGEuTz10aGlzLk8uY29weSgpKTthLmJiPXRoaXMuYmI7YS5Eaz10aGlzLkRrO251bGwhPT10aGlzLlNoJiYoYS5TaD1HYSh0aGlzLlNoKSk7bnVsbCE9PXRoaXMua2QmJihhLmtkPXRoaXMua2QuY29weSgpKTthLkNsPXRoaXMuQ2w7fTtZLnByb3RvdHlwZS5Rdz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLlNoO2lmKEVhKGIpKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtpZihiW2NdPT09YSlyZXR1cm47fWVsc2UgdGhpcy5TaD1iPVtdO2IucHVzaChhKTt9O1kucHJvdG90eXBlLm1mPWZ1bmN0aW9uKGEpe2EuUG89bnVsbDthLkFqPW51bGw7YS5zKCk7fTtZLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPW5ldyB0aGlzLmNvbnN0cnVjdG9yKCk7dGhpcy5jbG9uZVByb3RlY3RlZChhKTtpZihudWxsIT09dGhpcy5TaClmb3IodmFyIGI9MDtiPHRoaXMuU2gubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5TaFtiXTthW2NdPXRoaXNbY107fXJldHVybiBhO307WS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCk7fTt0PVkucHJvdG90eXBlO3QuZmI9ZnVuY3Rpb24oYSl7YS5jbGFzc1R5cGU9PT1TPzA9PT1hLm5hbWUuaW5kZXhPZigiT3JpZW50Iik/dGhpcy5zZWdtZW50T3JpZW50YXRpb249YTpBKCJVbmtub3duIExpbmsgZW51bSB2YWx1ZSBmb3IgR3JhcGhPYmplY3Quc2VnbWVudE9yaWVudGF0aW9uIHByb3BlcnR5OiAiK2EpOmEuY2xhc3NUeXBlPT09WSYmKHRoaXMuc3RyZXRjaD1hKTt9O3QudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gUGEodGhpcy5jb25zdHJ1Y3RvcikrIiMiK0JiKHRoaXMpO307ZnVuY3Rpb24gU2soYSl7bnVsbD09PWEuTyYmKGEuTz1uZXcgVGsoKSk7fXQuSGM9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5QKXt2YXIgYT1uZXcgVWsoKTthLkxnPVNjO2Eubmg9U2M7YS5KZz0xMDthLmxoPTEwO2EuS2c9MDthLm1oPTA7dGhpcy5QPWE7fX07dC5hYj1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD10aGlzLnBhcnQ7aWYobnVsbCE9PWgmJihoLm5rKGEsYixjLGQsZSxmLGcpLGM9PT10aGlzJiZhPT09YWYmJihWayh0aGlzKSYmV2sodGhpcyxoLGIpLFhrKHRoaXMsaCxiLGQsZSkpLHRoaXMgaW5zdGFuY2VvZiBYJiZjPT09aCYmMCE9PShoLkgmMTY3NzcyMTYpJiZudWxsIT09aC5kYXRhKSlmb3IoYT10aGlzLlkuaixjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtlPWFbZF0sZSBpbnN0YW5jZW9mIFgmJkJqKGUsZnVuY3Rpb24oYSl7bnVsbCE9PWEuZGF0YSYmMCE9PShhLkgmMTY3NzcyMTYpJiZhLkVhKGIpO30pO319O2Z1bmN0aW9uIFdrKGEsYixjKXt2YXIgZD1hLkdpKCk7aWYobnVsbCE9PWQpZm9yKHZhciBlPWEuYmIuaXRlcmF0b3I7ZS5uZXh0KCk7KXt2YXIgZj1lLnZhbHVlLGc9bnVsbDtpZihudWxsIT09Zi5zb3VyY2VOYW1lKXtnPVlrKGYsZCxhKTtpZihudWxsPT09Zyljb250aW51ZTtmLnVxKGEsZyxjLG51bGwpO31lbHNlIGlmKGYuaXNUb01vZGVsKXt2YXIgaD1iLmRpYWdyYW07bnVsbD09PWh8fGguc2tpcHNNb2RlbFNvdXJjZUJpbmRpbmdzfHxmLnVxKGEsaC5tb2RlbC5tb2RlbERhdGEsYyxkKTt9ZWxzZXtoPWQuZGF0YTtpZihudWxsPT09aCljb250aW51ZTt2YXIgaz1iLmRpYWdyYW07bnVsbD09PWt8fGsuc2tpcHNNb2RlbFNvdXJjZUJpbmRpbmdzfHxmLnVxKGEsaCxjLGQpO31nPT09YSYmKGg9ZC5RcyhmLlhpKSxudWxsIT09aCYmZi5YdihoLGcsYykpO319ZnVuY3Rpb24gWGsoYSxiLGMsZCxlKXtudWxsIT09YS5hbmltYXRpb25zJiYtMSE9PWEuYW5pbWF0aW9ucy5pbmRleE9mKGMpJiYoYj1iLmRpYWdyYW0sbnVsbD09PWJ8fGIuY3VycmVudFRvb2wuaXNBY3RpdmV8fChiPWIuYW5pbWF0aW9uTWFuYWdlciwhMT09PWIuaXNFbmFibGVkfHxiLmlzQW5pbWF0aW5nfHxiLmlzVGlja2luZ3x8KGIuengoYyksYi55ZShhLGMsZCxlKSkpKTt9dC5Rcz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5Eaz09PWE/dGhpczpudWxsO307dC5nPWZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiKGFmLGEsdGhpcyxiLGMpO307ZnVuY3Rpb24gWmsoYSxiLGMsZCxlKXt2YXIgZj1hLnBjLGc9YS5OZjtnLnJlc2V0KCk7JGsoYSxnLGIsYyxkLGUpO2EuTmY9ZztmLmgoYixjLGQsZSk7Zy5jdCgpfHxnLlV2KGYpO31mdW5jdGlvbiBhbChhLGIsYyxkKXtpZighMT09PWEucGlja2FibGUpcmV0dXJuITE7ZC5tdWx0aXBseShhLnRyYW5zZm9ybSk7cmV0dXJuIGM/YS5JYyhiLGQpOmEudWgoYixkKTt9dC5qeD1mdW5jdGlvbihhLGIsYyl7aWYoITE9PT10aGlzLnBpY2thYmxlKXJldHVybiExO3ZhciBkPXRoaXMubmF0dXJhbEJvdW5kcztiPWEuQmUoYik7cmV0dXJuIGM/UmIoYS54LGEueSwwLDAsMCxkLmhlaWdodCk8PWJ8fFJiKGEueCxhLnksMCxkLmhlaWdodCxkLndpZHRoLGQuaGVpZ2h0KTw9Ynx8UmIoYS54LGEueSxkLndpZHRoLGQuaGVpZ2h0LGQud2lkdGgsMCk8PWJ8fFJiKGEueCxhLnksZC53aWR0aCwwLDAsMCk8PWI6YS5jZCgwLDApPD1iJiZhLmNkKDAsZC5oZWlnaHQpPD1iJiZhLmNkKGQud2lkdGgsMCk8PWImJmEuY2QoZC53aWR0aCxkLmhlaWdodCk8PWI7fTt0LlpkPWZ1bmN0aW9uKCl7cmV0dXJuITA7fTt0LmVhPWZ1bmN0aW9uKGEpe3ZhciBiPUcuYWxsb2MoKTtiLmFzc2lnbihhKTt0aGlzLnRyYW5zZm9ybS50YShiKTt2YXIgYz10aGlzLmFjdHVhbEJvdW5kcztpZighYy5vKCkpcmV0dXJuIEcuZnJlZShiKSwhMTt2YXIgZD10aGlzLmRpYWdyYW07aWYobnVsbCE9PWQmJmQuUWUpe3ZhciBlPWQuYm0oImV4dHJhVG91Y2hUaHJlc2hvbGQiKSxmPWQuYm0oImV4dHJhVG91Y2hBcmVhIiksZz1mLzIsaD10aGlzLm5hdHVyYWxCb3VuZHM7ZD10aGlzLkNlKCkqZC5zY2FsZTt2YXIgaz0xL2Q7aWYoaC53aWR0aCpkPGUmJmguaGVpZ2h0KmQ8ZSlyZXR1cm4gYT1DYyhjLngtZyprLGMueS1nKmssYy53aWR0aCtmKmssYy5oZWlnaHQrZiprLGIueCxiLnkpLEcuZnJlZShiKSxhO31lPSExO2lmKHRoaXMgaW5zdGFuY2VvZiBwZnx8dGhpcyBpbnN0YW5jZW9mIFc/Q2MoYy54LTUsYy55LTUsYy53aWR0aCsxMCxjLmhlaWdodCsxMCxiLngsYi55KTpjLmVhKGIpKXRoaXMua2QmJiF0aGlzLmtkLmVhKGIpP2U9ITE6bnVsbCE9PXRoaXMuZGMmJmMuZWEoYik/ZT0hMDpudWxsIT09dGhpcy5pYiYmdGhpcy5xYy5lYShhKT9lPSEwOmU9dGhpcy52aChhKTtHLmZyZWUoYik7cmV0dXJuIGU7fTt0LnZoPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmF0dXJhbEJvdW5kcztyZXR1cm4gQ2MoMCwwLGIud2lkdGgsYi5oZWlnaHQsYS54LGEueSk7fTt0LmxmPWZ1bmN0aW9uKGEpe2lmKDA9PT10aGlzLmFuZ2xlKXJldHVybiB0aGlzLmFjdHVhbEJvdW5kcy5sZihhKTt2YXIgYj10aGlzLm5hdHVyYWxCb3VuZHM7Yj1OLmFsbG9jQXQoMCwwLGIud2lkdGgsYi5oZWlnaHQpO3ZhciBjPXRoaXMudHJhbnNmb3JtLGQ9ITEsZT1HLmFsbG9jQXQoYS54LGEueSk7Yi5lYShjLlVkKGUpKSYmKGUuaChhLngsYS5ib3R0b20pLGIuZWEoYy5VZChlKSkmJihlLmgoYS5yaWdodCxhLmJvdHRvbSksYi5lYShjLlVkKGUpKSYmKGUuaChhLnJpZ2h0LGEueSksYi5lYShjLlVkKGUpKSYmKGQ9ITApKSkpO0cuZnJlZShlKTtOLmZyZWUoYik7cmV0dXJuIGQ7fTt0LnVoPWZ1bmN0aW9uKGEsYil7aWYodm9pZCAwPT09YilyZXR1cm4gYS5sZih0aGlzLmFjdHVhbEJvdW5kcyk7dmFyIGM9dGhpcy5uYXR1cmFsQm91bmRzLGQ9ITEsZT1HLmFsbG9jQXQoMCwwKTthLmVhKGIudGEoZSkpJiYoZS5oKDAsYy5oZWlnaHQpLGEuZWEoYi50YShlKSkmJihlLmgoYy53aWR0aCxjLmhlaWdodCksYS5lYShiLnRhKGUpKSYmKGUuaChjLndpZHRoLDApLGEuZWEoYi50YShlKSkmJihkPSEwKSkpKTtHLmZyZWUoZSk7cmV0dXJuIGQ7fTt0LkljPWZ1bmN0aW9uKGEsYil7aWYodm9pZCAwPT09YiYmKGI9dGhpcy50cmFuc2Zvcm0sMD09PXRoaXMuYW5nbGUpKXJldHVybiBhLkljKHRoaXMuYWN0dWFsQm91bmRzKTt2YXIgYz10aGlzLm5hdHVyYWxCb3VuZHMsZD1HLmFsbG9jQXQoMCwwKSxlPUcuYWxsb2NBdCgwLGMuaGVpZ2h0KSxmPUcuYWxsb2NBdChjLndpZHRoLGMuaGVpZ2h0KSxnPUcuYWxsb2NBdChjLndpZHRoLDApLGg9ITE7aWYoYS5lYShiLnRhKGQpKXx8YS5lYShiLnRhKGUpKXx8YS5lYShiLnRhKGYpKXx8YS5lYShiLnRhKGcpKSloPSEwO2Vsc2V7Yz1OLmFsbG9jQXQoMCwwLGMud2lkdGgsYy5oZWlnaHQpO3ZhciBrPUcuYWxsb2NBdChhLngsYS55KTtjLmVhKGIuVWQoaykpP2g9ITA6KGsuaChhLngsYS5ib3R0b20pLGMuZWEoYi5VZChrKSk/aD0hMDooay5oKGEucmlnaHQsYS5ib3R0b20pLGMuZWEoYi5VZChrKSk/aD0hMDooay5oKGEucmlnaHQsYS55KSxjLmVhKGIuVWQoaykpJiYoaD0hMCkpKSk7Ry5mcmVlKGspO04uZnJlZShjKTshaCYmKEguJHMoYSxkLGUpfHxILiRzKGEsZSxmKXx8SC4kcyhhLGYsZyl8fEguJHMoYSxnLGQpKSYmKGg9ITApO31HLmZyZWUoZCk7Ry5mcmVlKGUpO0cuZnJlZShmKTtHLmZyZWUoZyk7cmV0dXJuIGg7fTt0Lm1hPWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9bmV3IEcoKSk7aWYoYSBpbnN0YW5jZW9mIE8pe3ZhciBjPXRoaXMubmF0dXJhbEJvdW5kcztiLmgoYS54KmMud2lkdGgrYS5vZmZzZXRYLGEueSpjLmhlaWdodCthLm9mZnNldFkpO31lbHNlIGIuc2V0KGEpO3RoaXMucmQudGEoYik7cmV0dXJuIGI7fTt0LlZwPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW5ldyBOKCkpO3ZhciBiPXRoaXMubmF0dXJhbEJvdW5kcyxjPXRoaXMucmQsZD1HLmFsbG9jQXQoMCwwKS50cmFuc2Zvcm0oYyk7YS5oKGQueCxkLnksMCwwKTtkLmgoYi53aWR0aCwwKS50cmFuc2Zvcm0oYyk7QmMoYSxkLngsZC55LDAsMCk7ZC5oKGIud2lkdGgsYi5oZWlnaHQpLnRyYW5zZm9ybShjKTtCYyhhLGQueCxkLnksMCwwKTtkLmgoMCxiLmhlaWdodCkudHJhbnNmb3JtKGMpO0JjKGEsZC54LGQueSwwLDApO0cuZnJlZShkKTtyZXR1cm4gYTt9O3QuSmk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJkOzE9PT1hLm0xMSYmMD09PWEubTEyP2E9MDooYT0xODAqTWF0aC5hdGFuMihhLm0xMixhLm0xMSkvTWF0aC5QSSwwPmEmJihhKz0zNjApKTtyZXR1cm4gYTt9O3QuQ2U9ZnVuY3Rpb24oKXtpZigwIT09KHRoaXMuSCY0MDk2KT09PSExKXJldHVybiB0aGlzLlNrO3ZhciBhPXRoaXMuQ2E7cmV0dXJuIG51bGwhPT10aGlzLnBhbmVsP2EqdGhpcy5wYW5lbC5DZSgpOmE7fTt0LldzPWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9bmV3IEcoKSk7Yi5hc3NpZ24oYSk7dGhpcy5yZC5VZChiKTtyZXR1cm4gYjt9O3QuVGM9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLmJrKGEueCxhLnksYi54LGIueSxjKTt9O3QuYms9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj10aGlzLnRyYW5zZm9ybSxnPTEvKGYubTExKmYubTIyLWYubTEyKmYubTIxKSxoPWYubTIyKmcsaz0tZi5tMTIqZyxsPS1mLm0yMSpnLG09Zi5tMTEqZyxuPWcqKGYubTIxKmYuZHktZi5tMjIqZi5keCkscD1nKihmLm0xMipmLmR4LWYubTExKmYuZHkpO2lmKG51bGwhPT10aGlzLmFyZWFCYWNrZ3JvdW5kKXJldHVybiBmPXRoaXMuYWN0dWFsQm91bmRzLEguVGMoZi5sZWZ0LGYudG9wLGYucmlnaHQsZi5ib3R0b20sYSxiLGMsZCxlKTtnPWEqaCtiKmwrbjthPWEqaytiKm0rcDtiPWMqaCtkKmwrbjtjPWMqaytkKm0rcDtlLmgoMCwwKTtkPXRoaXMubmF0dXJhbEJvdW5kcztjPUguVGMoMCwwLGQud2lkdGgsZC5oZWlnaHQsZyxhLGIsYyxlKTtlLnRyYW5zZm9ybShmKTtyZXR1cm4gYzt9O1kucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoITEhPT1vaih0aGlzKSl7dmFyIGU9dGhpcy5UZyxmPWUucmlnaHQrZS5sZWZ0O2U9ZS50b3ArZS5ib3R0b207YT1NYXRoLm1heChhLWYsMCk7Yj1NYXRoLm1heChiLWUsMCk7Yz1NYXRoLm1heCgoY3x8MCktZiwwKTtkPU1hdGgubWF4KChkfHwwKS1lLDApO2Y9dGhpcy5hbmdsZTtlPXRoaXMuZGVzaXJlZFNpemU7dmFyIGc9MDt0aGlzIGluc3RhbmNlb2YgVyYmKGc9dGhpcy5zdHJva2VXaWR0aCk7OTA9PT1mfHwyNzA9PT1mPyhhPWlzRmluaXRlKGUuaGVpZ2h0KT9lLmhlaWdodCtnOmEsYj1pc0Zpbml0ZShlLndpZHRoKT9lLndpZHRoK2c6Yik6KGE9aXNGaW5pdGUoZS53aWR0aCk/ZS53aWR0aCtnOmEsYj1pc0Zpbml0ZShlLmhlaWdodCk/ZS5oZWlnaHQrZzpiKTtlPWN8fDA7Zz1kfHwwO3ZhciBoPXRoaXMgaW5zdGFuY2VvZiBYO3N3aXRjaChibCh0aGlzLCEwKSl7Y2FzZSBaZzpnPWU9MDtoJiYoYj1hPUluZmluaXR5KTticmVhaztjYXNlIGJlOmlzRmluaXRlKGEpJiZhPmMmJihlPWEpO2lzRmluaXRlKGIpJiZiPmQmJihnPWIpO2JyZWFrO2Nhc2UgTWs6aXNGaW5pdGUoYSkmJmE+YyYmKGU9YSk7Zz0wO2gmJihiPUluZmluaXR5KTticmVhaztjYXNlIE5rOmlzRmluaXRlKGIpJiZiPmQmJihnPWIpLGU9MCxoJiYoYT1JbmZpbml0eSk7fWg9dGhpcy5tYXhTaXplO3ZhciBrPXRoaXMubWluU2l6ZTtlPmgud2lkdGgmJmsud2lkdGg8aC53aWR0aCYmKGU9aC53aWR0aCk7Zz5oLmhlaWdodCYmay5oZWlnaHQ8aC5oZWlnaHQmJihnPWguaGVpZ2h0KTtjPU1hdGgubWF4KGUvdGhpcy5zY2FsZSxrLndpZHRoKTtkPU1hdGgubWF4KGcvdGhpcy5zY2FsZSxrLmhlaWdodCk7aC53aWR0aDxjJiYoYz1NYXRoLm1pbihrLndpZHRoLGMpKTtoLmhlaWdodDxkJiYoZD1NYXRoLm1pbihrLmhlaWdodCxkKSk7YT1NYXRoLm1pbihoLndpZHRoLGEpO2I9TWF0aC5taW4oaC5oZWlnaHQsYik7YT1NYXRoLm1heChjLGEpO2I9TWF0aC5tYXgoZCxiKTtpZig5MD09PWZ8fDI3MD09PWYpZj1hLGE9YixiPWYsZj1jLGM9ZCxkPWY7dGhpcy5wYy5oYSgpO3RoaXMuaG0oYSxiLGMsZCk7dGhpcy5wYy5mcmVlemUoKTt0aGlzLnBjLm8oKXx8QSgiTm9uLXJlYWwgbWVhc3VyZWRCb3VuZHMgaGFzIGJlZW4gc2V0LiBPYmplY3QgIit0aGlzKyIsIG1lYXN1cmVkQm91bmRzOiAiK3RoaXMucGMudG9TdHJpbmcoKSk7amoodGhpcywhMSk7fX07WS5wcm90b3R5cGUuaG09ZnVuY3Rpb24oKXt9O1kucHJvdG90eXBlLnNnPWZ1bmN0aW9uKCl7cmV0dXJuITE7fTtZLnByb3RvdHlwZS5hcnJhbmdlPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5mbCgpO3ZhciBmPU4uYWxsb2MoKTtmLmFzc2lnbih0aGlzLnZiKTt0aGlzLnZiLmhhKCk7ITE9PT1waih0aGlzKT90aGlzLnZiLmgoYSxiLGMsZCk6dGhpcy50aChhLGIsYyxkKTt0aGlzLnZiLmZyZWV6ZSgpO3ZvaWQgMD09PWU/dGhpcy5rZD1udWxsOnRoaXMua2Q9ZTtjPSExO2lmKHZvaWQgMCE9PWUpYz0hMDtlbHNlIGlmKGU9dGhpcy5wYW5lbCxudWxsPT09ZXx8ZS50eXBlIT09WC5UYWJsZVJvdyYmZS50eXBlIT09WC5UYWJsZUNvbHVtbnx8KGU9ZS5wYW5lbCksbnVsbCE9PWUmJihlPWUucWMsZD10aGlzLm1lYXN1cmVkQm91bmRzLG51bGwhPT10aGlzLmFyZWFCYWNrZ3JvdW5kJiYoZD10aGlzLnZiKSxjPWIrZC5oZWlnaHQsZD1hK2Qud2lkdGgsYz0hKDA8PWErLjA1JiZkPD1lLndpZHRoKy4wNSYmMDw9YisuMDUmJmM8PWUuaGVpZ2h0Ky4wNSksdGhpcyBpbnN0YW5jZW9mIHZoJiYoYT10aGlzLm5hdHVyYWxCb3VuZHMsdGhpcy5Ncj5hLmhlaWdodHx8dGhpcy5tZXRyaWNzLm1heExpbmVXaWR0aD5hLndpZHRoKSkpYz0hMDt0aGlzLkg9Yz90aGlzLkh8MjU2OnRoaXMuSCYtMjU3O3RoaXMudmIubygpfHxBKCJOb24tcmVhbCBhY3R1YWxCb3VuZHMgaGFzIGJlZW4gc2V0LiBPYmplY3QgIit0aGlzKyIsIGFjdHVhbEJvdW5kczogIit0aGlzLnZiLnRvU3RyaW5nKCkpO3RoaXMubHQoZix0aGlzLnZiKTtjbCh0aGlzLCExKTtOLmZyZWUoZik7fTt0PVkucHJvdG90eXBlO3QudGg9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIGRsKGEsYixjLGQsZSl7YS52Yi5oKGIsYyxkLGUpO2lmKCFhLmRlc2lyZWRTaXplLm8oKSl7dmFyIGY9YS5wYztjPWEuVGc7Yj1jLnJpZ2h0K2MubGVmdDt2YXIgZz1jLnRvcCtjLmJvdHRvbTtjPWYud2lkdGgrYjtmPWYuaGVpZ2h0K2c7ZCs9YjtlKz1nO2I9YmwoYSwhMCk7Yz09PWQmJmY9PT1lJiYoYj1aZyk7c3dpdGNoKGIpe2Nhc2UgWmc6aWYoYz5kfHxmPmUpamooYSwhMCksYS5tZWFzdXJlKGM+ZD9kOmMsZj5lP2U6ZiwwLDApO2JyZWFrO2Nhc2UgYmU6amooYSwhMCk7YS5tZWFzdXJlKGQsZSwwLDApO2JyZWFrO2Nhc2UgTWs6amooYSwhMCk7YS5tZWFzdXJlKGQsZiwwLDApO2JyZWFrO2Nhc2UgTms6amooYSwhMCksYS5tZWFzdXJlKGMsZSwwLDApO319fXQubHQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLnBhcnQ7bnVsbCE9PWMmJm51bGwhPT1jLmRpYWdyYW0mJihjLnNlbGVjdGlvbk9iamVjdCE9PXRoaXMmJmMucmVzaXplT2JqZWN0IT09dGhpcyYmYy5yb3RhdGVPYmplY3QhPT10aGlzfHxlbChjLCEwKSx0aGlzLlIoKSx4YyhhLGIpfHwoYy55aCgpLHRoaXMuRG8oYykpKTt9O3QuRG89ZnVuY3Rpb24oYSl7bnVsbCE9PXRoaXMucG9ydElkJiYoZWwoYSwhMCksYSBpbnN0YW5jZW9mIFYmJmZsKGEsdGhpcykpO307dC5oYz1mdW5jdGlvbihhLGIpe2lmKHRoaXMudmlzaWJsZSl7dmFyIGM9dGhpcyBpbnN0YW5jZW9mIFgmJih0aGlzLnR5cGU9PT1YLlRhYmxlUm93fHx0aGlzLnR5cGU9PT1YLlRhYmxlQ29sdW1uKSxkPXRoaXMudmI7aWYoY3x8MCE9PWQud2lkdGgmJjAhPT1kLmhlaWdodCYmIWlzTmFOKGQueCkmJiFpc05hTihkLnkpKXt2YXIgZT10aGlzLm9wYWNpdHk7aWYoMCE9PWUpe3ZhciBmPTE7MSE9PWUmJihmPWEuZ2xvYmFsQWxwaGEsYS5nbG9iYWxBbHBoYT1mKmUpO2lmKCF0aGlzLmd4KGEsYikpaWYoYylnbCh0aGlzLGEsYik7ZWxzZXt0aGlzIGluc3RhbmNlb2YgUyYmdGhpcy5nayghMSk7Yz10aGlzLnRyYW5zZm9ybTt2YXIgZz10aGlzLnBhbmVsOzAhPT0odGhpcy5IJjQwOTYpPT09ITAmJmhsKHRoaXMpO3ZhciBoPXRoaXMucGFydCxrPSExLGw9MDtpZihoJiZiLkRlKCJkcmF3U2hhZG93cyIpJiYoaz1oLmlzU2hhZG93ZWQpKXt2YXIgbT1oLnNpO2w9TWF0aC5tYXgobS55LG0ueCkqYi5zY2FsZSpiLk5iO31pZighKG09Yi5taikpe3ZhciBuPXRoaXMubmF0dXJhbEJvdW5kczttPXRoaXMuRGg7dmFyIHA9bS5tMTEscT1tLm0yMSxyPW0uZHgsdT1tLm0xMix4PW0ubTIyLHY9bS5keSx5LHo9eT0wO209eSpwK3oqcStyO3ZhciBCPXkqdSt6Kngrdjt5PW4ud2lkdGgrbDt6PTA7dmFyIEM9eSpwK3oqcStyO3k9eSp1K3oqeCt2O209TWF0aC5taW4obSxDKTtCPU1hdGgubWluKEIseSk7dmFyIEk9TWF0aC5tYXgobSxDKS1tO3ZhciBKPU1hdGgubWF4KEIseSktQjt5PW4ud2lkdGgrbDt6PW4uaGVpZ2h0K2w7Qz15KnAreipxK3I7eT15KnUreip4K3Y7bT1NYXRoLm1pbihtLEMpO0I9TWF0aC5taW4oQix5KTtJPU1hdGgubWF4KG0rSSxDKS1tO0o9TWF0aC5tYXgoQitKLHkpLUI7eT0wO3o9bi5oZWlnaHQrbDtDPXkqcCt6KnErcjt5PXkqdSt6KngrdjttPU1hdGgubWluKG0sQyk7Qj1NYXRoLm1pbihCLHkpO0k9TWF0aC5tYXgobStJLEMpLW07Sj1NYXRoLm1heChCK0oseSktQjtsPWIudmlld3BvcnRCb3VuZHM7bj1sLng7cD1sLnk7bT0hKG0+bC4kK258fG4+SSttfHxCPmwuWitwfHxwPkorQik7fWlmKG0pe209MCE9PSh0aGlzLkgmMjU2KTthLmNsaXBJbnN0ZWFkT2ZGaWxsJiYobT0hMSk7dGhpcyBpbnN0YW5jZW9mIHZoJiYoYS5mb250PXRoaXMuZm9udCk7aWYobSl7Qj1nLlpkKCk/Zy5uYXR1cmFsQm91bmRzOmcuYWN0dWFsQm91bmRzO251bGwhPT10aGlzLmtkPyhuPXRoaXMua2QsST1uLngsSj1uLnksbD1uLndpZHRoLG49bi5oZWlnaHQpOihJPU1hdGgubWF4KGQueCxCLngpLEo9TWF0aC5tYXgoZC55LEIueSksbD1NYXRoLm1pbihkLnJpZ2h0LEIucmlnaHQpLUksbj1NYXRoLm1pbihkLmJvdHRvbSxCLmJvdHRvbSktSik7aWYoST5kLndpZHRoK2QueHx8ZC54PkIud2lkdGgrQi54KXsxIT09ZSYmKGEuZ2xvYmFsQWxwaGE9Zik7cmV0dXJuO31hLnNhdmUoKTthLmJlZ2luUGF0aCgpO2EucmVjdChJLEosbCxuKTthLmNsaXAoKTt9aWYodGhpcy5zZygpKXtpZighaC5pc1Zpc2libGUoKSl7MSE9PWUmJihhLmdsb2JhbEFscGhhPWYpO3JldHVybjt9ayYmKEI9aC5zaSxhLk52KEIueCpiLnNjYWxlKmIuTmIsQi55KmIuc2NhbGUqYi5OYixoLk9kKSxpbChhKSxhLnNoYWRvd0NvbG9yPWguSWopO30hMD09PXRoaXMuc2hhZG93VmlzaWJsZT9pbChhKTohMT09PXRoaXMuc2hhZG93VmlzaWJsZSYmamwoYSk7aD10aGlzLm5hdHVyYWxCb3VuZHM7bnVsbCE9PXRoaXMuZGMmJihqaSh0aGlzLGEsdGhpcy5kYywhMCwhMCxoLGQpLHRoaXMuZGMgaW5zdGFuY2VvZiBrbCYmdGhpcy5kYy50eXBlPT09bGw/KGEuYmVnaW5QYXRoKCksYS5yZWN0KGQueCxkLnksZC53aWR0aCxkLmhlaWdodCksYS5UZCh0aGlzLmRjKSk6YS5maWxsUmVjdChkLngsZC55LGQud2lkdGgsZC5oZWlnaHQpKTthLnRyYW5zZm9ybShjLm0xMSxjLm0xMixjLm0yMSxjLm0yMixjLmR4LGMuZHkpO2smJihudWxsIT09ZyYmMCE9PShnLkgmNTEyKXx8bnVsbCE9PWcmJihnLnR5cGU9PT1YLkF1dG98fGcudHlwZT09PVguU3BvdCkmJmcuemIoKSE9PXRoaXMpJiZudWxsPT09dGhpcy5zaGFkb3dWaXNpYmxlJiZqbChhKTtudWxsIT09dGhpcy5pYiYmKGw9dGhpcy5uYXR1cmFsQm91bmRzLEk9Qj0wLEo9bC53aWR0aCxsPWwuaGVpZ2h0LG49MCx0aGlzIGluc3RhbmNlb2YgVyYmKGw9dGhpcy5xYS5ib3VuZHMsQj1sLngsST1sLnksSj1sLndpZHRoLGw9bC5oZWlnaHQsbj10aGlzLnN0cm9rZVdpZHRoKSxqaSh0aGlzLGEsdGhpcy5pYiwhMCwhMSxoLGQpLHRoaXMuaWIgaW5zdGFuY2VvZiBrbCYmdGhpcy5pYi50eXBlPT09bGw/KGEuYmVnaW5QYXRoKCksYS5yZWN0KEItbi8yLEktbi8yLEorbixsK24pLGEuVGQodGhpcy5pYikpOmEuZmlsbFJlY3QoQi1uLzIsSS1uLzIsSituLGwrbikpO2smJihudWxsIT09dGhpcy5pYnx8bnVsbCE9PXRoaXMuZGN8fG51bGwhPT1nJiYwIT09KGcuSCY1MTIpfHxudWxsIT09ZyYmKGcudHlwZT09PVguQXV0b3x8Zy50eXBlPT09WC5TcG90KSYmZy56YigpIT09dGhpcyk/KG1sKHRoaXMsITApLG51bGw9PT10aGlzLnNoYWRvd1Zpc2libGUmJmpsKGEpKTptbCh0aGlzLCExKTt0aGlzLkNpKGEsYik7ayYmMCE9PSh0aGlzLkgmNTEyKT09PSEwJiZpbChhKTt0aGlzLnNnKCkmJmsmJmpsKGEpO20/KGEucmVzdG9yZSgpLHRoaXMgaW5zdGFuY2VvZiBYP2EuUmMoITApOmEuUmMoITEpKTpjLmN0KCl8fChiPTEvKGMubTExKmMubTIyLWMubTEyKmMubTIxKSxhLnRyYW5zZm9ybShjLm0yMipiLC1jLm0xMipiLC1jLm0yMSpiLGMubTExKmIsYiooYy5tMjEqYy5keS1jLm0yMipjLmR4KSxiKihjLm0xMipjLmR4LWMubTExKmMuZHkpKSk7fX0xIT09ZSYmKGEuZ2xvYmFsQWxwaGE9Zik7fX19fTt0Lmd4PWZ1bmN0aW9uKCl7cmV0dXJuITE7fTtmdW5jdGlvbiBnbChhLGIsYyl7dmFyIGQ9YS52YixlPWEucWM7bnVsbCE9PWEuZGMmJihqaShhLGIsYS5kYywhMCwhMCxlLGQpLGEuZGMgaW5zdGFuY2VvZiBrbCYmYS5kYy50eXBlPT09bGw/KGIuYmVnaW5QYXRoKCksYi5yZWN0KGQueCxkLnksZC53aWR0aCxkLmhlaWdodCksYi5UZChhLmRjKSk6Yi5maWxsUmVjdChkLngsZC55LGQud2lkdGgsZC5oZWlnaHQpKTtudWxsIT09YS5pYiYmKGppKGEsYixhLmliLCEwLCExLGUsZCksYS5pYiBpbnN0YW5jZW9mIGtsJiZhLmliLnR5cGU9PT1sbD8oYi5iZWdpblBhdGgoKSxiLnJlY3QoZC54LGQueSxkLndpZHRoLGQuaGVpZ2h0KSxiLlRkKGEuaWIpKTpiLmZpbGxSZWN0KGQueCxkLnksZC53aWR0aCxkLmhlaWdodCkpO2EuQ2koYixjKTt9dC5DaT1mdW5jdGlvbigpe307ZnVuY3Rpb24gamkoYSxiLGMsZCxlLGYsZyl7aWYobnVsbCE9PWMpe3ZhciBoPTEsaz0xO2lmKCJzdHJpbmciPT09dHlwZW9mIGMpZD9iLmZpbGxTdHlsZT1jOmIuc3Ryb2tlU3R5bGU9YztlbHNlIGlmKGMudHlwZT09PW5sKWQ/Yi5maWxsU3R5bGU9Yy5jb2xvcjpiLnN0cm9rZVN0eWxlPWMuY29sb3I7ZWxzZXtoPWYud2lkdGg7az1mLmhlaWdodDtlJiYoaD1nLndpZHRoLGs9Zy5oZWlnaHQpO2lmKChmPWIgaW5zdGFuY2VvZiBvbCkmJmMuY2UmJihjLnR5cGU9PT1wbHx8Yy5Haz09PWgmJmMuTHQ9PT1rKSl2YXIgbD1jLmNlO2Vsc2V7dmFyIG09MCxuPTAscD0wLHE9MCxyPTAsdT0wO3U9cj0wO2UmJihyPWcueCx1PWcueSk7bT1jLnN0YXJ0LngqaCtjLnN0YXJ0Lm9mZnNldFg7bj1jLnN0YXJ0LnkqaytjLnN0YXJ0Lm9mZnNldFk7cD1jLmVuZC54KmgrYy5lbmQub2Zmc2V0WDtxPWMuZW5kLnkqaytjLmVuZC5vZmZzZXRZO20rPXI7cCs9cjtuKz11O3ErPXU7aWYoYy50eXBlPT09cWwpbD1iLmNyZWF0ZUxpbmVhckdyYWRpZW50KG0sbixwLHEpO2Vsc2UgaWYoYy50eXBlPT09bGwpdT1pc05hTihjLmVuZFJhZGl1cyk/TWF0aC5tYXgoaCxrKS8yOmMuZW5kUmFkaXVzLGlzTmFOKGMuc3RhcnRSYWRpdXMpPyhyPTAsdT1NYXRoLm1heChoLGspLzIpOnI9Yy5zdGFydFJhZGl1cyxsPWIuY3JlYXRlUmFkaWFsR3JhZGllbnQobSxuLHIscCxxLHUpO2Vsc2UgaWYoYy50eXBlPT09cGwpdHJ5e2w9Yi5jcmVhdGVQYXR0ZXJuKGMucGF0dGVybiwicmVwZWF0Iik7fWNhdGNoKHYpe2w9bnVsbDt9aWYoYy50eXBlIT09cGwmJihlPWMuY29sb3JTdG9wcyxudWxsIT09ZSkpZm9yKGU9ZS5pdGVyYXRvcjtlLm5leHQoKTspe2wuYWRkQ29sb3JTdG9wKGUua2V5LGUudmFsdWUpO31pZihmJiYoYy5jZT1sLG51bGwhPT1sJiYoYy5Haz1oLGMuTHQ9ayksbnVsbD09PWwmJmMudHlwZT09PXBsJiYtMSE9PWMuR2spKXtjLkdrPS0xO3ZhciB4PWEuZGlhZ3JhbTtudWxsIT09eCYmLTE9PT1jLkdrJiZ1YShmdW5jdGlvbigpe3guc2YoKTt9LDYwMCk7fX1kP2IuZmlsbFN0eWxlPWw6Yi5zdHJva2VTdHlsZT1sO319fXQucWc9ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIFgpYTp7aWYodGhpcyE9PWEmJm51bGwhPT1hKWZvcih2YXIgYj10aGlzLnBhbmVsO251bGwhPT1iOyl7aWYoYj09PWEpe2E9ITA7YnJlYWsgYTt9Yj1iLnBhbmVsO31hPSExO31lbHNlIGE9ITE7cmV0dXJuIGE7fTt0LnJmPWZ1bmN0aW9uKCl7aWYoIXRoaXMudmlzaWJsZSlyZXR1cm4hMTt2YXIgYT10aGlzLnBhbmVsO3JldHVybiBudWxsIT09YT9hLnJmKCk6ITA7fTt0LnJnPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMgaW5zdGFuY2VvZiBYP3RoaXM6dGhpcy5wYW5lbDtudWxsIT09YSYmYS5pc0VuYWJsZWQ7KXthPWEucGFuZWw7fXJldHVybiBudWxsPT09YTt9O2Z1bmN0aW9uIGhsKGEpe2lmKDAhPT0oYS5IJjIwNDgpPT09ITApe3ZhciBiPWEudGI7Yi5yZXNldCgpO2lmKCFhLnZiLm8oKXx8IWEucGMubygpKXtybChhLCExKTtyZXR1cm47fWIudHJhbnNsYXRlKGEudmIueC1hLnBjLngsYS52Yi55LWEucGMueSk7aWYoMSE9PWEuc2NhbGV8fDAhPT1hLmFuZ2xlKXt2YXIgYz1hLm5hdHVyYWxCb3VuZHM7JGsoYSxiLGMueCxjLnksYy53aWR0aCxjLmhlaWdodCk7fXJsKGEsITEpO3NsKGEsITApO30wIT09KGEuSCY0MDk2KT09PSEwJiYoYj1hLnBhbmVsLG51bGw9PT1iPyhhLkRoLnNldChhLnRiKSxhLlNrPWEuc2NhbGUsc2woYSwhMSkpOm51bGwhPT1iLnJkJiYoYz1hLkRoLGMucmVzZXQoKSxiLlpkKCk/Yy5tdWx0aXBseShiLkRoKTpudWxsIT09Yi5wYW5lbCYmYy5tdWx0aXBseShiLnBhbmVsLkRoKSxjLm11bHRpcGx5KGEudGIpLGEuU2s9YS5zY2FsZSpiLlNrLHNsKGEsITEpKSk7fWZ1bmN0aW9uICRrKGEsYixjLGQsZSxmKXsxIT09YS5zY2FsZSYmYi5zY2FsZShhLnNjYWxlKTtpZigwIT09YS5hbmdsZSl7dmFyIGc9ZGQ7YS5zZygpJiZhLmxvY2F0aW9uU3BvdC5nYigpJiYoZz1hLmxvY2F0aW9uU3BvdCk7dmFyIGg9Ry5hbGxvYygpO2lmKGEgaW5zdGFuY2VvZiBUJiZhLmxvY2F0aW9uT2JqZWN0IT09YSlmb3IoYz1hLmxvY2F0aW9uT2JqZWN0LGQ9Yy5uYXR1cmFsQm91bmRzLGgucWsoZC54LGQueSxkLndpZHRoLGQuaGVpZ2h0LGcpLGMuTmYudGEoaCksaC5vZmZzZXQoLWMubWVhc3VyZWRCb3VuZHMueCwtYy5tZWFzdXJlZEJvdW5kcy55KSxnPWMucGFuZWw7bnVsbCE9PWcmJmchPT1hOyl7Zy5OZi50YShoKSxoLm9mZnNldCgtZy5tZWFzdXJlZEJvdW5kcy54LC1nLm1lYXN1cmVkQm91bmRzLnkpLGc9Zy5wYW5lbDt9ZWxzZSBoLnFrKGMsZCxlLGYsZyk7Yi5yb3RhdGUoYS5hbmdsZSxoLngsaC55KTtHLmZyZWUoaCk7fX10LnM9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9ITEpO2lmKCEwIT09b2oodGhpcykpe2pqKHRoaXMsITApO2NsKHRoaXMsITApO3ZhciBiPXRoaXMucGFuZWw7bnVsbD09PWJ8fGF8fGIucygpO319O3QuZG09ZnVuY3Rpb24oKXshMCE9PW9qKHRoaXMpJiYoamoodGhpcywhMCksY2wodGhpcywhMCkpO307ZnVuY3Rpb24gdGwoYSl7aWYoITE9PT1waihhKSl7dmFyIGI9YS5wYW5lbDtudWxsIT09Yj9iLnMoKTphLnNnKCkmJihiPWEuZGlhZ3JhbSxudWxsIT09YiYmKGIuRGQuYWRkKGEpLGEgaW5zdGFuY2VvZiBWJiZhLmVkKCksYi5jYygpKSk7Y2woYSwhMCk7fX10LmZsPWZ1bmN0aW9uKCl7MCE9PSh0aGlzLkgmMjA0OCk9PT0hMSYmKHJsKHRoaXMsITApLHNsKHRoaXMsITApKTt9O3QuaXY9ZnVuY3Rpb24oKXtzbCh0aGlzLCEwKTt9O3QuUj1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGFydDtudWxsIT09YSYmYS5SKCk7fTtmdW5jdGlvbiBibChhLGIpe3ZhciBjPWEuc3RyZXRjaCxkPWEucGFuZWw7aWYobnVsbCE9PWQmJmQudHlwZT09PVguVGFibGUpcmV0dXJuIHVsKGEsZC5nZXRSb3dEZWZpbml0aW9uKGEucm93KSxkLmdldENvbHVtbkRlZmluaXRpb24oYS5jb2x1bW4pLGIpO2lmKG51bGwhPT1kJiZkLnR5cGU9PT1YLkF1dG8mJmQuemIoKT09PWEpcmV0dXJuIHZsKGEsYmUsYik7aWYoYz09PUxrKXtpZihudWxsIT09ZCl7aWYoZC50eXBlPT09WC5TcG90JiZkLnpiKCk9PT1hKXJldHVybiB2bChhLGJlLGIpO2M9ZC5kZWZhdWx0U3RyZXRjaDtyZXR1cm4gYz09PUxrP3ZsKGEsWmcsYik6dmwoYSxjLGIpO31yZXR1cm4gdmwoYSxaZyxiKTt9cmV0dXJuIHZsKGEsYyxiKTt9ZnVuY3Rpb24gdWwoYSxiLGMsZCl7dmFyIGU9YS5zdHJldGNoO2lmKGUhPT1MaylyZXR1cm4gdmwoYSxlLGQpO3ZhciBmPWU9bnVsbDtzd2l0Y2goYi5zdHJldGNoKXtjYXNlIE5rOmY9ITA7YnJlYWs7Y2FzZSBiZTpmPSEwO31zd2l0Y2goYy5zdHJldGNoKXtjYXNlIE1rOmU9ITA7YnJlYWs7Y2FzZSBiZTplPSEwO31iPWEucGFuZWwuZGVmYXVsdFN0cmV0Y2g7bnVsbD09PWUmJihlPWI9PT1Na3x8Yj09PWJlKTtudWxsPT09ZiYmKGY9Yj09PU5rfHxiPT09YmUpO3JldHVybiEwPT09ZSYmITA9PT1mP3ZsKGEsYmUsZCk6ITA9PT1lP3ZsKGEsTWssZCk6ITA9PT1mP3ZsKGEsTmssZCk6dmwoYSxaZyxkKTt9ZnVuY3Rpb24gdmwoYSxiLGMpe2lmKGMpcmV0dXJuIGI7aWYoYj09PVpnKXJldHVybiBaZztjPWEuZGVzaXJlZFNpemU7aWYoYy5vKCkpcmV0dXJuIFpnO2E9YS5hbmdsZTtpZighaXNOYU4oYy53aWR0aCkpaWYoOTAhPT1hJiYyNzAhPT1hKXtpZihiPT09TWspcmV0dXJuIFpnO2lmKGI9PT1iZSlyZXR1cm4gTms7fWVsc2V7aWYoYj09PU5rKXJldHVybiBaZztpZihiPT09YmUpcmV0dXJuIE1rO31pZighaXNOYU4oYy5oZWlnaHQpKWlmKDkwIT09YSYmMjcwIT09YSl7aWYoYj09PU5rKXJldHVybiBaZztpZihiPT09YmUpcmV0dXJuIE1rO31lbHNle2lmKGI9PT1NaylyZXR1cm4gWmc7aWYoYj09PWJlKXJldHVybiBOazt9cmV0dXJuIGI7fWZ1bmN0aW9uIG1sKGEsYil7YS5IPWI/YS5IfDUxMjphLkgmLTUxMzt9ZnVuY3Rpb24gVmsoYSl7cmV0dXJuIDAhPT0oYS5IJjEwMjQpO31mdW5jdGlvbiB3bChhLGIpe2EuSD1iP2EuSHwxMDI0OmEuSCYtMTAyNTt9ZnVuY3Rpb24gcmwoYSxiKXthLkg9Yj9hLkh8MjA0ODphLkgmLTIwNDk7fWZ1bmN0aW9uIHNsKGEsYil7YS5IPWI/YS5IfDQwOTY6YS5IJi00MDk3O31mdW5jdGlvbiBvaihhKXtyZXR1cm4gMCE9PShhLkgmODE5Mik7fWZ1bmN0aW9uIGpqKGEsYil7YS5IPWI/YS5IfDgxOTI6YS5IJi04MTkzO31mdW5jdGlvbiBwaihhKXtyZXR1cm4gMCE9PShhLkgmMTYzODQpO31mdW5jdGlvbiBjbChhLGIpe2EuSD1iP2EuSHwxNjM4NDphLkgmLTE2Mzg1O310LlNpPWZ1bmN0aW9uKGEpe3RoaXMuYWc9YTt9O3QuTHY9ZnVuY3Rpb24oKXt9O3QuS3Y9ZnVuY3Rpb24oYSl7dGhpcy5zYT1hO3RsKHRoaXMpO3JldHVybiEwO307dC53dD1mdW5jdGlvbihhLGIpe3RoaXMuc2EuaChhLGIpO3RoaXMuZmwoKTt9O2Z1bmN0aW9uIHhsKGEpe3ZhciBiPWEucGFydDtpZihiIGluc3RhbmNlb2YgViYmKG51bGwhPT1hLnBvcnRJZHx8YT09PWIucG9ydCkpe3ZhciBjPWIuZGlhZ3JhbTtudWxsPT09Y3x8Yy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHxmbChiLGEpO319ZnVuY3Rpb24geWwoYSl7dmFyIGI9YS5kaWFncmFtO251bGw9PT1ifHxiLnVuZG9NYW5hZ2VyLmlzVW5kb2luZ1JlZG9pbmd8fChhIGluc3RhbmNlb2YgWD9hIGluc3RhbmNlb2YgVj9hLmVkKCk6YS55bShhLGZ1bmN0aW9uKGEpe3hsKGEpO30pOnhsKGEpKTt9dC5iaW5kPWZ1bmN0aW9uKGEpe2EuUWQ9dGhpczt2YXIgYj10aGlzLkdpKCk7bnVsbCE9PWImJnpsKGIpJiZBKCJDYW5ub3QgYWRkIGEgQmluZGluZyB0byBhIHRlbXBsYXRlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjb3BpZWQ6ICIrYSk7bnVsbD09PXRoaXMuYmImJih0aGlzLmJiPW5ldyBFKCkpO3RoaXMuYmIuYWRkKGEpO307dC5HaT1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzIGluc3RhbmNlb2YgWD90aGlzOnRoaXMucGFuZWw7bnVsbCE9PWE7KXtpZihudWxsIT09YS5RaClyZXR1cm4gYTthPWEucGFuZWw7fXJldHVybiBudWxsO307dC5Ndj1mdW5jdGlvbihhKXt2aih0aGlzLGEpO307ZnVuY3Rpb24gQWwoYSxiKXtmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKXs7fWM9YXJndW1lbnRzO3ZhciBkPW51bGwsZT1udWxsO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSllPWE7ZWxzZSBpZigic3RyaW5nIj09PXR5cGVvZiBhKXt2YXIgZj1CbC5KKGEpOyJmdW5jdGlvbiI9PT10eXBlb2YgZj8oYz1HYShhcmd1bWVudHMpLGQ9ZihjKSxDYShkKXx8QSgnR3JhcGhPYmplY3QubWFrZSBpbnZva2VkIG9iamVjdCBidWlsZGVyICInK2ErJyIsIGJ1dCBpdCBkaWQgbm90IHJldHVybiBhbiBPYmplY3QnKSk6ZT13LmdvW2FdO31udWxsPT09ZCYmKHZvaWQgMCE9PWUmJm51bGwhPT1lJiZlLmNvbnN0cnVjdG9yfHxBKCJHcmFwaE9iamVjdC5tYWtlIHJlcXVpcmVzIGEgY2xhc3MgZnVuY3Rpb24gb3IgR29KUyBjbGFzcyBuYW1lIG9yIG5hbWUgb2YgYW4gb2JqZWN0IGJ1aWxkZXIsIG5vdDogIithKSxkPW5ldyBlKCkpO2U9MTtpZihkIGluc3RhbmNlb2YgUCYmMTxjLmxlbmd0aCl7Zj1kO3ZhciBnPWNbMV07aWYoInN0cmluZyI9PT10eXBlb2YgZ3x8ZyBpbnN0YW5jZW9mIEhUTUxEaXZFbGVtZW50KUFpKGYsZyksZSsrO31mb3IoO2U8Yy5sZW5ndGg7ZSsrKXtmPWNbZV0sdm9pZCAwPT09Zj9BKCJVbmRlZmluZWQgdmFsdWUgYXQgYXJndW1lbnQgIitlKyIgZm9yIG9iamVjdCBiZWluZyBjb25zdHJ1Y3RlZCBieSBHcmFwaE9iamVjdC5tYWtlOiAiK2QpOkNsKGQsZik7fXJldHVybiBkO31mdW5jdGlvbiBDbChhLGIpe2lmKCJzdHJpbmciPT09dHlwZW9mIGIpe2lmKGEgaW5zdGFuY2VvZiB2aClhLnRleHQ9YjtlbHNlIGlmKGEgaW5zdGFuY2VvZiBXKWEuZmlndXJlPWI7ZWxzZSBpZihhIGluc3RhbmNlb2YgY2spYS5zb3VyY2U9YjtlbHNlIGlmKGEgaW5zdGFuY2VvZiBYKWI9RGwuSihiKSxudWxsIT09YiYmKGEudHlwZT1iKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBrbCl7dmFyIGM9cWIoa2wsYik7bnVsbCE9PWM/YS50eXBlPWM6QSgiVW5rbm93biBCcnVzaCB0eXBlIGFzIGFuIGFyZ3VtZW50IHRvIEdyYXBoT2JqZWN0Lm1ha2U6ICIrYik7fWVsc2UgYSBpbnN0YW5jZW9mICRkPyhiPXFiKCRkLGIpLG51bGwhPT1iJiYoYS50eXBlPWIpKTphIGluc3RhbmNlb2YgVmUmJihiPXFiKFZlLGIpLG51bGwhPT1iJiYoYS50eXBlPWIpKTt9ZWxzZSBpZihiIGluc3RhbmNlb2YgWSlhIGluc3RhbmNlb2YgWHx8QSgiQSBHcmFwaE9iamVjdCBjYW4gb25seSBiZSBhZGRlZCB0byBhIFBhbmVsLCBub3QgdG86ICIrYSksYS5hZGQoYik7ZWxzZSBpZihiIGluc3RhbmNlb2YgUWope3ZhciBkO2IuaXNSb3cmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRSb3dEZWZpbml0aW9uP2Q9YS5nZXRSb3dEZWZpbml0aW9uKGIuaW5kZXgpOmIuaXNSb3d8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRDb2x1bW5EZWZpbml0aW9ufHwoZD1hLmdldENvbHVtbkRlZmluaXRpb24oYi5pbmRleCkpO2QgaW5zdGFuY2VvZiBRaj9kLlZsKGIpOkEoIkEgUm93Q29sdW1uRGVmaW5pdGlvbiBjYW4gb25seSBiZSBhZGRlZCB0byBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGdldFJvd0RlZmluaXRpb24vZ2V0Q29sdW1uRGVmaW5pdGlvbiwgbm90IHRvOiAiK2EpO31lbHNlIGlmKGIgaW5zdGFuY2VvZiBEKSJmdW5jdGlvbiI9PT10eXBlb2YgYS5mYiYmYS5mYihiKTtlbHNlIGlmKGIgaW5zdGFuY2VvZiBFbClhLnR5cGU9YjtlbHNlIGlmKGIgaW5zdGFuY2VvZiBIaSlhIGluc3RhbmNlb2YgWT9hLmJpbmQoYik6YSBpbnN0YW5jZW9mIFFqP2EuYmluZChiKTpBKCJBIEJpbmRpbmcgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIEdyYXBoT2JqZWN0IG9yIFJvd0NvbHVtbkRlZmluaXRpb24sIG5vdCB0bzogIithKTtlbHNlIGlmKGIgaW5zdGFuY2VvZiBVZSlhIGluc3RhbmNlb2YgJGQ/YS5maWd1cmVzLmFkZChiKTpBKCJBIFBhdGhGaWd1cmUgY2FuIG9ubHkgYmUgYWRkZWQgdG8gYSBHZW9tZXRyeSwgbm90IHRvOiAiK2EpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIFZlKWEgaW5zdGFuY2VvZiBVZT9hLnNlZ21lbnRzLmFkZChiKTpBKCJBIFBhdGhTZWdtZW50IGNhbiBvbmx5IGJlIGFkZGVkIHRvIGEgUGF0aEZpZ3VyZSwgbm90IHRvOiAiK2EpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIHlpKWEgaW5zdGFuY2VvZiBQP2EubGF5b3V0PWI6YSBpbnN0YW5jZW9mIGlnP2EubGF5b3V0PWI6QSgiQSBMYXlvdXQgY2FuIG9ubHkgYmUgYXNzaWduZWQgdG8gYSBEaWFncmFtIG9yIGEgR3JvdXAsIG5vdCB0bzogIithKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoYikpZm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl7Q2woYSxiW2NdKTt9ZWxzZSBpZigib2JqZWN0Ij09PV90eXBlb2YoYikmJm51bGwhPT1iKXtpZihhIGluc3RhbmNlb2Yga2wpe2M9bmV3IHRiKCk7Zm9yKHZhciBlIGluIGIpe2Q9cGFyc2VGbG9hdChlKSxpc05hTihkKT9jW2VdPWJbZV06YS5hZGRDb2xvclN0b3AoZCxiW2VdKTt9dmooYSxjKTt9ZWxzZSBpZihhIGluc3RhbmNlb2YgUWope3ZvaWQgMCE9PWIucm93PyhlPWIucm93LCh2b2lkIDA9PT1lfHxudWxsPT09ZXx8SW5maW5pdHk9PT1lfHxpc05hTihlKXx8MD5lKSYmQSgiTXVzdCBzcGVjaWZ5IG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHJvdyBmb3IgUm93Q29sdW1uRGVmaW5pdGlvbiAiK2IrIiwgbm90OiAiK2UpLGEuaXNSb3c9ITAsYS5pbmRleD1lKTp2b2lkIDAhPT1iLmNvbHVtbiYmKGU9Yi5jb2x1bW4sKHZvaWQgMD09PWV8fG51bGw9PT1lfHxJbmZpbml0eT09PWV8fGlzTmFOKGUpfHwwPmUpJiZBKCJNdXN0IHNwZWNpZnkgbm9uLW5lZ2F0aXZlIGludGVnZXIgY29sdW1uIGZvciBSb3dDb2x1bW5EZWZpbml0aW9uICIrYisiLCBub3Q6ICIrZSksYS5pc1Jvdz0hMSxhLmluZGV4PWUpO2U9bmV3IHRiKCk7Zm9yKGMgaW4gYil7InJvdyIhPT1jJiYiY29sdW1uIiE9PWMmJihlW2NdPWJbY10pO312aihhLGUpO31lbHNlIHZqKGEsYik7fWVsc2UgQSgnVW5rbm93biBpbml0aWFsaXplciAiJytiKyciIGZvciBvYmplY3QgYmVpbmcgY29uc3RydWN0ZWQgYnkgR3JhcGhPYmplY3QubWFrZTogJythKTt9ZnVuY3Rpb24gRmwoYSxiKXtCbC5hZGQoYSxiKTt9ZnVuY3Rpb24gR2woYSxiLGMpe3ZvaWQgMD09PWMmJihjPW51bGwpO3ZhciBkPWFbMV07aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBjP2MoZCk6InN0cmluZyI9PT10eXBlb2YgZClyZXR1cm4gYS5zcGxpY2UoMSwxKSxkO2lmKHZvaWQgMD09PWIpdGhyb3cgRXJyb3IoIm5vICIrKCJmdW5jdGlvbiI9PT10eXBlb2YgYz8ic2F0aXNmYWN0b3J5Ijoic3RyaW5nIikrIiBhcmd1bWVudCBmb3IgR3JhcGhPYmplY3QgYnVpbGRlciAiK2FbMF0pO3JldHVybiBiO31wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhZLnByb3RvdHlwZSx7c2hhZG93VmlzaWJsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkNsO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkNsO2IhPT1hJiYodGhpcy5DbD1hLHRoaXMuUigpLHRoaXMuZygic2hhZG93VmlzaWJsZSIsYixhKSk7fX0sZW5hYmxlZENoYW5nZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuTz90aGlzLk8uQm46bnVsbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7U2sodGhpcyk7dmFyIGI9dGhpcy5PLkJuO2IhPT1hJiYodGhpcy5PLkJuPWEsdGhpcy5nKCJlbmFibGVkQ2hhbmdlZCIsYixhKSk7fX0sc2VnbWVudE9yaWVudGF0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQWw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuQWw7YiE9PWEmJih0aGlzLkFsPWEsdGhpcy5zKCksdGhpcy5nKCJzZWdtZW50T3JpZW50YXRpb24iLGIsYSksYT09PU9nJiYodGhpcy5hbmdsZT0wKSk7fX0sc2VnbWVudEluZGV4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZ3A7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj10aGlzLmdwO2IhPT1hJiYodGhpcy5ncD1hLHRoaXMucygpLHRoaXMuZygic2VnbWVudEluZGV4IixiLGEpKTt9fSxzZWdtZW50RnJhY3Rpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy55bDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aXNOYU4oYSk/YT0wOjA+YT9hPTA6MTxhJiYoYT0xKTt2YXIgYj10aGlzLnlsO2IhPT1hJiYodGhpcy55bD1hLHRoaXMucygpLHRoaXMuZygic2VnbWVudEZyYWN0aW9uIixiLGEpKTt9fSxzZWdtZW50T2Zmc2V0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuemw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuemw7Yi5BKGEpfHwodGhpcy56bD1hPWEuSSgpLHRoaXMucygpLHRoaXMuZygic2VnbWVudE9mZnNldCIsYixhKSk7fX0sc3RyZXRjaDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnVlO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnVlO2IhPT1hJiYodGhpcy51ZT1hLHRoaXMucygpLHRoaXMuZygic3RyZXRjaCIsYixhKSk7fX0sbmFtZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlVhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlVhO2IhPT1hJiYodGhpcy5VYT1hLG51bGwhPT10aGlzLnBhcnQmJih0aGlzLnBhcnQudmo9bnVsbCksdGhpcy5nKCJuYW1lIixiLGEpKTt9fSxvcGFjaXR5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubGI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMubGI7YiE9PWEmJigoMD5hfHwxPGEpJiZ4YShhLCIwIDw9IHZhbHVlIDw9IDEiLFksIm9wYWNpdHkiKSx0aGlzLmxiPWEsdGhpcy5nKCJvcGFjaXR5IixiLGEpLGE9dGhpcy5kaWFncmFtLGI9dGhpcy5wYXJ0LG51bGwhPT1hJiZudWxsIT09YiYmYS5SKHpqKGIsYi5hY3R1YWxCb3VuZHMpKSk7fX0sdmlzaWJsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuSCYxKTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkgmMSk7YiE9PWEmJih0aGlzLkhePTEsdGhpcy5nKCJ2aXNpYmxlIixiLGEpLGI9dGhpcy5wYW5lbCxudWxsIT09Yj9iLnMoKTp0aGlzLnNnKCkmJnRoaXMuTWIoYSksdGhpcy5SKCkseWwodGhpcykpO319LHBpY2thYmxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5IJjIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuSCYyKTtiIT09YSYmKHRoaXMuSF49Mix0aGlzLmcoInBpY2thYmxlIixiLGEpKTt9fSxmcm9tTGlua2FibGVEdXBsaWNhdGVzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5IJjQpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuSCY0KTtiIT09YSYmKHRoaXMuSF49NCx0aGlzLmcoImZyb21MaW5rYWJsZUR1cGxpY2F0ZXMiLGIsYSkpO319LGZyb21MaW5rYWJsZVNlbGZOb2RlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5IJjgpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuSCY4KTtiIT09YSYmKHRoaXMuSF49OCx0aGlzLmcoImZyb21MaW5rYWJsZVNlbGZOb2RlIixiLGEpKTt9fSx0b0xpbmthYmxlRHVwbGljYXRlczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuSCYxNik7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPTAhPT0odGhpcy5IJjE2KTtiIT09YSYmKHRoaXMuSF49MTYsdGhpcy5nKCJ0b0xpbmthYmxlRHVwbGljYXRlcyIsYixhKSk7fX0sdG9MaW5rYWJsZVNlbGZOb2RlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5IJjMyKTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkgmMzIpO2IhPT1hJiYodGhpcy5IXj0zMix0aGlzLmcoInRvTGlua2FibGVTZWxmTm9kZSIsYixhKSk7fX0saXNQYW5lbE1haW46e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLkgmNjQpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuSCY2NCk7YiE9PWEmJih0aGlzLkhePTY0LHRoaXMucygpLHRoaXMuZygiaXNQYW5lbE1haW4iLGIsYSkpO319LGlzQWN0aW9uYWJsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuSCYxMjgpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuSCYxMjgpO2IhPT1hJiYodGhpcy5IXj0xMjgsdGhpcy5nKCJpc0FjdGlvbmFibGUiLGIsYSkpO319LGFyZWFCYWNrZ3JvdW5kOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZGM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuZGM7YiE9PWEmJihhIGluc3RhbmNlb2Yga2wmJmEuZnJlZXplKCksdGhpcy5kYz1hLHRoaXMuUigpLHRoaXMuZygiYXJlYUJhY2tncm91bmQiLGIsYSkpO319LGJhY2tncm91bmQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5pYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5pYjtiIT09YSYmKGEgaW5zdGFuY2VvZiBrbCYmYS5mcmVlemUoKSx0aGlzLmliPWEsdGhpcy5SKCksdGhpcy5nKCJiYWNrZ3JvdW5kIixiLGEpKTt9fSxwYXJ0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7aWYodGhpcy5zZygpKXJldHVybiB0aGlzO2lmKG51bGwhPT10aGlzLkFqKXJldHVybiB0aGlzLkFqO3ZhciBhO2ZvcihhPXRoaXMucGFuZWw7YTspe2lmKGEgaW5zdGFuY2VvZiBUKXJldHVybiB0aGlzLkFqPWE7YT1hLnBhbmVsO31yZXR1cm4gbnVsbDt9fSxzdmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Bczt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5Bcz1hO319LHBhbmVsOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYWc7fX0sbGF5ZXI6e2dldDpmdW5jdGlvbiBnZXQoKXt2YXIgYT10aGlzLnBhcnQ7cmV0dXJuIG51bGwhPT1hP2EubGF5ZXI6bnVsbDt9fSxkaWFncmFtOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIGE9dGhpcy5wYXJ0O3JldHVybiBudWxsIT09YT9hLmRpYWdyYW06bnVsbDt9fSxwb3NpdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnNhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj1hLngsYz1hLnksZD10aGlzLnNhLGU9ZC54LGY9ZC55OyhlPT09Ynx8aXNOYU4oZSkmJmlzTmFOKGIpKSYmKGY9PT1jfHxpc05hTihmKSYmaXNOYU4oYykpP3RoaXMuTHYoKTooYT1hLkkoKSx0aGlzLkt2KGEsZCkmJnRoaXMuZygicG9zaXRpb24iLGQsYSkpO319LGFjdHVhbEJvdW5kczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnZiO319LHNjYWxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ2E7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuQ2E7YiE9PWEmJigwPj1hJiZBKCJHcmFwaE9iamVjdC5zY2FsZSBmb3IgIit0aGlzKyIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybywgbm90OiAiK2EpLHRoaXMuQ2E9YSx0aGlzLnMoKSx0aGlzLmcoInNjYWxlIixiLGEpKTt9fSxhbmdsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnpjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnpjO2IhPT1hJiYoYSU9MzYwLDA+YSYmKGErPTM2MCksYiE9PWEmJih0aGlzLnpjPWEseWwodGhpcyksdGhpcy5zKCksdGhpcy5nKCJhbmdsZSIsYixhKSkpO319LGRlc2lyZWRTaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTmM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPWEud2lkdGgsYz1hLmhlaWdodCxkPXRoaXMuTmMsZT1kLndpZHRoLGY9ZC5oZWlnaHQ7KGU9PT1ifHxpc05hTihlKSYmaXNOYU4oYikpJiYoZj09PWN8fGlzTmFOKGYpJiZpc05hTihjKSl8fCh0aGlzLk5jPWE9YS5JKCksdGhpcy5zKCksdGhpcyBpbnN0YW5jZW9mIFcmJnRoaXMuYmMoKSx0aGlzLmcoImRlc2lyZWRTaXplIixkLGEpLFZrKHRoaXMpJiYoYT10aGlzLnBhcnQsbnVsbCE9PWEmJihXayh0aGlzLGEsIndpZHRoIiksV2sodGhpcyxhLCJoZWlnaHQiKSkpKTt9fSx3aWR0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk5jLndpZHRoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLk5jLndpZHRoO2I9PT1hfHxpc05hTihiKSYmaXNOYU4oYSl8fChiPXRoaXMuTmMsdGhpcy5OYz1hPW5ldyBLKGEsdGhpcy5OYy5oZWlnaHQpLmZyZWV6ZSgpLHRoaXMucygpLHRoaXMgaW5zdGFuY2VvZiBXJiZ0aGlzLmJjKCksdGhpcy5nKCJkZXNpcmVkU2l6ZSIsYixhKSxWayh0aGlzKSYmKGE9dGhpcy5wYXJ0LG51bGwhPT1hJiZXayh0aGlzLGEsIndpZHRoIikpKTt9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5OYy5oZWlnaHQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuTmMuaGVpZ2h0O2I9PT1hfHxpc05hTihiKSYmaXNOYU4oYSl8fChiPXRoaXMuTmMsdGhpcy5OYz1hPW5ldyBLKHRoaXMuTmMud2lkdGgsYSkuZnJlZXplKCksdGhpcy5zKCksdGhpcyBpbnN0YW5jZW9mIFcmJnRoaXMuYmMoKSx0aGlzLmcoImRlc2lyZWRTaXplIixiLGEpLFZrKHRoaXMpJiYoYT10aGlzLnBhcnQsbnVsbCE9PWEmJldrKHRoaXMsYSwiaGVpZ2h0IikpKTt9fSxtaW5TaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUWY7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuUWY7Yi5BKGEpfHwoYT1hLmNvcHkoKSxpc05hTihhLndpZHRoKSYmKGEud2lkdGg9MCksaXNOYU4oYS5oZWlnaHQpJiYoYS5oZWlnaHQ9MCksYS5mcmVlemUoKSx0aGlzLlFmPWEsdGhpcy5zKCksdGhpcy5nKCJtaW5TaXplIixiLGEpKTt9fSxtYXhTaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUGY7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuUGY7Yi5BKGEpfHwoYT1hLmNvcHkoKSxpc05hTihhLndpZHRoKSYmKGEud2lkdGg9SW5maW5pdHkpLGlzTmFOKGEuaGVpZ2h0KSYmKGEuaGVpZ2h0PUluZmluaXR5KSxhLmZyZWV6ZSgpLHRoaXMuUGY9YSx0aGlzLnMoKSx0aGlzLmcoIm1heFNpemUiLGIsYSkpO319LG1lYXN1cmVkQm91bmRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucGM7fX0sbmF0dXJhbEJvdW5kczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnFjO319LG1hcmdpbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlRnO30sc2V0OmZ1bmN0aW9uIHNldChhKXsibnVtYmVyIj09PXR5cGVvZiBhJiYoYT1uZXcgSWMoYSkpO3ZhciBiPXRoaXMuVGc7Yi5BKGEpfHwodGhpcy5UZz1hPWEuSSgpLHRoaXMucygpLHRoaXMuZygibWFyZ2luIixiLGEpKTt9fSx0cmFuc2Zvcm06e2dldDpmdW5jdGlvbiBnZXQoKXswIT09KHRoaXMuSCYyMDQ4KT09PSEwJiZobCh0aGlzKTtyZXR1cm4gdGhpcy50Yjt9fSxyZDp7Z2V0OmZ1bmN0aW9uIGdldCgpezAhPT0odGhpcy5IJjQwOTYpPT09ITAmJmhsKHRoaXMpO3JldHVybiB0aGlzLkRoO319LGFuaW1hdGlvbnM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QbTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5QbTtiIT09YSYmKHRoaXMuUG09YSx0aGlzLmcoImFuaW1hdGlvbnMiLGIsYSkpO319LGFsaWdubWVudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLndiO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLndiO2IuQShhKXx8KGEuamMoKSYmIWEuS2IoKSYmQSgiR3JhcGhPYmplY3QuYWxpZ25tZW50IGZvciAiK3RoaXMrIiBtdXN0IGJlIGEgcmVhbCBTcG90IG9yIFNwb3QuRGVmYXVsdCwgbm90OiAiK2EpLHRoaXMud2I9YT1hLkkoKSx0bCh0aGlzKSx0aGlzLmcoImFsaWdubWVudCIsYixhKSk7fX0sY29sdW1uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ2c7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj10aGlzLkNnO2IhPT1hJiYoMD5hJiZ4YShhLCI+PSAwIixZLCJjb2x1bW4iKSx0aGlzLkNnPWEsdGhpcy5zKCksdGhpcy5nKCJjb2x1bW4iLGIsYSkpO319LGNvbHVtblNwYW46e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5abTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPXRoaXMuWm07YiE9PWEmJigxPmEmJnhhKGEsIj49IDEiLFksImNvbHVtblNwYW4iKSx0aGlzLlptPWEsdGhpcy5zKCksdGhpcy5nKCJjb2x1bW5TcGFuIixiLGEpKTt9fSxyb3c6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5hcDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPXRoaXMuYXA7YiE9PWEmJigwPmEmJnhhKGEsIj49IDAiLFksInJvdyIpLHRoaXMuYXA9YSx0aGlzLnMoKSx0aGlzLmcoInJvdyIsYixhKSk7fX0scm93U3Bhbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmJwO30sc2V0OmZ1bmN0aW9uIHNldChhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9dGhpcy5icDtiIT09YSYmKDE+YSYmeGEoYSwiPj0gMSIsWSwicm93U3BhbiIpLHRoaXMuYnA9YSx0aGlzLnMoKSx0aGlzLmcoInJvd1NwYW4iLGIsYSkpO319LHNwYW5BbGxvY2F0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucnA7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMucnA7YiE9PWEmJih0aGlzLnJwPWEsdGhpcy5zKCksdGhpcy5nKCJzcGFuQWxsb2NhdGlvbiIsYixhKSk7fX0sYWxpZ25tZW50Rm9jdXM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53azt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy53aztiLkEoYSl8fCh0aGlzLndrPWE9YS5JKCksdGhpcy5zKCksdGhpcy5nKCJhbGlnbm1lbnRGb2N1cyIsYixhKSk7fX0scG9ydElkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuT287fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuT287aWYoYiE9PWEpe3ZhciBjPXRoaXMucGFydDtudWxsPT09Y3x8YyBpbnN0YW5jZW9mIFZ8fChBKCJDYW5ub3Qgc2V0IHBvcnRJRCBvbiBhIExpbms6ICIrYSksYz1udWxsKTtudWxsIT09YiYmbnVsbCE9PWMmJkhsKGMsdGhpcyk7dGhpcy5Pbz1hO251bGwhPT1hJiZudWxsIT09YyYmKGMueGg9ITAsSWwoYyx0aGlzKSk7dGhpcy5nKCJwb3J0SWQiLGIsYSk7fX19LHRvU3BvdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5QP3RoaXMuUC5uaDpTYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5uaDtiLkEoYSl8fChhPWEuSSgpLHRoaXMuUC5uaD1hLHRoaXMuZygidG9TcG90IixiLGEpLHhsKHRoaXMpKTt9fSx0b0VuZFNlZ21lbnRMZW5ndGg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuUD90aGlzLlAubGg6MTA7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSGMoKTt2YXIgYj10aGlzLlAubGg7YiE9PWEmJigwPmEmJnhhKGEsIj49IDAiLFksInRvRW5kU2VnbWVudExlbmd0aCIpLHRoaXMuUC5saD1hLHRoaXMuZygidG9FbmRTZWdtZW50TGVuZ3RoIixiLGEpLHhsKHRoaXMpKTt9fSx0b1Nob3J0TGVuZ3RoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLlA/dGhpcy5QLm1oOjA7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSGMoKTt2YXIgYj10aGlzLlAubWg7YiE9PWEmJih0aGlzLlAubWg9YSx0aGlzLmcoInRvU2hvcnRMZW5ndGgiLGIsYSkseGwodGhpcykpO319LHRvTGlua2FibGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuUD90aGlzLlAuenA6bnVsbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC56cDtiIT09YSYmKHRoaXMuUC56cD1hLHRoaXMuZygidG9MaW5rYWJsZSIsYixhKSk7fX0sdG9NYXhMaW5rczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5QP3RoaXMuUC5BcDpJbmZpbml0eTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5BcDtiIT09YSYmKDA+YSYmeGEoYSwiPj0gMCIsWSwidG9NYXhMaW5rcyIpLHRoaXMuUC5BcD1hLHRoaXMuZygidG9NYXhMaW5rcyIsYixhKSk7fX0sZnJvbVNwb3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuUD90aGlzLlAuTGc6U2M7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSGMoKTt2YXIgYj10aGlzLlAuTGc7Yi5BKGEpfHwoYT1hLkkoKSx0aGlzLlAuTGc9YSx0aGlzLmcoImZyb21TcG90IixiLGEpLHhsKHRoaXMpKTt9fSxmcm9tRW5kU2VnbWVudExlbmd0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5QP3RoaXMuUC5KZzoxMDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5KZztiIT09YSYmKDA+YSYmeGEoYSwiPj0gMCIsWSwiZnJvbUVuZFNlZ21lbnRMZW5ndGgiKSx0aGlzLlAuSmc9YSx0aGlzLmcoImZyb21FbmRTZWdtZW50TGVuZ3RoIixiLGEpLHhsKHRoaXMpKTt9fSxmcm9tU2hvcnRMZW5ndGg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuUD90aGlzLlAuS2c6MDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5LZztiIT09YSYmKHRoaXMuUC5LZz1hLHRoaXMuZygiZnJvbVNob3J0TGVuZ3RoIixiLGEpLHhsKHRoaXMpKTt9fSxmcm9tTGlua2FibGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuUD90aGlzLlAuRG46bnVsbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5EbjtiIT09YSYmKHRoaXMuUC5Ebj1hLHRoaXMuZygiZnJvbUxpbmthYmxlIixiLGEpKTt9fSxmcm9tTWF4TGlua3M6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuUD90aGlzLlAuRW46SW5maW5pdHk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSGMoKTt2YXIgYj10aGlzLlAuRW47YiE9PWEmJigwPmEmJnhhKGEsIj49IDAiLFksImZyb21NYXhMaW5rcyIpLHRoaXMuUC5Fbj1hLHRoaXMuZygiZnJvbU1heExpbmtzIixiLGEpKTt9fSxjdXJzb3I6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5qbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5qbjtiIT09YSYmKHRoaXMuam49YSx0aGlzLmcoImN1cnNvciIsYixhKSk7fX0sY2xpY2s6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuTz90aGlzLk8uQWY6bnVsbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7U2sodGhpcyk7dmFyIGI9dGhpcy5PLkFmO2IhPT1hJiYodGhpcy5PLkFmPWEsdGhpcy5nKCJjbGljayIsYixhKSk7fX0sZG91YmxlQ2xpY2s6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuTz90aGlzLk8uRmY6bnVsbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7U2sodGhpcyk7dmFyIGI9dGhpcy5PLkZmO2IhPT1hJiYodGhpcy5PLkZmPWEsdGhpcy5nKCJkb3VibGVDbGljayIsYixhKSk7fX0sY29udGV4dENsaWNrOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLk8/dGhpcy5PLkJmOm51bGw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe1NrKHRoaXMpO3ZhciBiPXRoaXMuTy5CZjtiIT09YSYmKHRoaXMuTy5CZj1hLHRoaXMuZygiY29udGV4dENsaWNrIixiLGEpKTt9fSxtb3VzZUVudGVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLk8/dGhpcy5PLlNmOm51bGw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe1NrKHRoaXMpO3ZhciBiPXRoaXMuTy5TZjtiIT09YSYmKHRoaXMuTy5TZj1hLHRoaXMuZygibW91c2VFbnRlciIsYixhKSk7fX0sbW91c2VMZWF2ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5PP3RoaXMuTy5WZjpudWxsO30sc2V0OmZ1bmN0aW9uIHNldChhKXtTayh0aGlzKTt2YXIgYj10aGlzLk8uVmY7YiE9PWEmJih0aGlzLk8uVmY9YSx0aGlzLmcoIm1vdXNlTGVhdmUiLGIsYSkpO319LG1vdXNlT3Zlcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5PP3RoaXMuTy5XZjpudWxsO30sc2V0OmZ1bmN0aW9uIHNldChhKXtTayh0aGlzKTt2YXIgYj10aGlzLk8uV2Y7YiE9PWEmJih0aGlzLk8uV2Y9YSx0aGlzLmcoIm1vdXNlT3ZlciIsYixhKSk7fX0sbW91c2VIb3Zlcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5PP3RoaXMuTy5VZjpudWxsO30sc2V0OmZ1bmN0aW9uIHNldChhKXtTayh0aGlzKTt2YXIgYj10aGlzLk8uVWY7YiE9PWEmJih0aGlzLk8uVWY9YSx0aGlzLmcoIm1vdXNlSG92ZXIiLGIsYSkpO319LG1vdXNlSG9sZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5PP3RoaXMuTy5UZjpudWxsO30sc2V0OmZ1bmN0aW9uIHNldChhKXtTayh0aGlzKTt2YXIgYj10aGlzLk8uVGY7YiE9PWEmJih0aGlzLk8uVGY9YSx0aGlzLmcoIm1vdXNlSG9sZCIsYixhKSk7fX0sbW91c2VEcmFnRW50ZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuTz90aGlzLk8udG86bnVsbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7U2sodGhpcyk7dmFyIGI9dGhpcy5PLnRvO2IhPT1hJiYodGhpcy5PLnRvPWEsdGhpcy5nKCJtb3VzZURyYWdFbnRlciIsYixhKSk7fX0sbW91c2VEcmFnTGVhdmU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuTz90aGlzLk8udW86bnVsbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7U2sodGhpcyk7dmFyIGI9dGhpcy5PLnVvO2IhPT1hJiYodGhpcy5PLnVvPWEsdGhpcy5nKCJtb3VzZURyYWdMZWF2ZSIsYixhKSk7fX0sbW91c2VEcm9wOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLk8/dGhpcy5PLlJmOm51bGw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe1NrKHRoaXMpO3ZhciBiPXRoaXMuTy5SZjtiIT09YSYmKHRoaXMuTy5SZj1hLHRoaXMuZygibW91c2VEcm9wIixiLGEpKTt9fSxhY3Rpb25Eb3duOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLk8/dGhpcy5PLkltOm51bGw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe1NrKHRoaXMpO3ZhciBiPXRoaXMuTy5JbTtiIT09YSYmKHRoaXMuTy5JbT1hLHRoaXMuZygiYWN0aW9uRG93biIsYixhKSk7fX0sYWN0aW9uTW92ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5PP3RoaXMuTy5KbTpudWxsO30sc2V0OmZ1bmN0aW9uIHNldChhKXtTayh0aGlzKTt2YXIgYj10aGlzLk8uSm07YiE9PWEmJih0aGlzLk8uSm09YSx0aGlzLmcoImFjdGlvbk1vdmUiLGIsYSkpO319LGFjdGlvblVwOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLk8/dGhpcy5PLkttOm51bGw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe1NrKHRoaXMpO3ZhciBiPXRoaXMuTy5LbTtiIT09YSYmKHRoaXMuTy5LbT1hLHRoaXMuZygiYWN0aW9uVXAiLGIsYSkpO319LGFjdGlvbkNhbmNlbDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5PP3RoaXMuTy5IbTpudWxsO30sc2V0OmZ1bmN0aW9uIHNldChhKXtTayh0aGlzKTt2YXIgYj10aGlzLk8uSG07YiE9PWEmJih0aGlzLk8uSG09YSx0aGlzLmcoImFjdGlvbkNhbmNlbCIsYixhKSk7fX0sdG9vbFRpcDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5PP3RoaXMuTy5nZzpudWxsO30sc2V0OmZ1bmN0aW9uIHNldChhKXtTayh0aGlzKTt2YXIgYj10aGlzLk8uZ2c7YiE9PWEmJih0aGlzLk8uZ2c9YSx0aGlzLmcoInRvb2xUaXAiLGIsYSkpO319LGNvbnRleHRNZW51OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLk8/dGhpcy5PLkNmOm51bGw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe1NrKHRoaXMpO3ZhciBiPXRoaXMuTy5DZjtiIT09YSYmKHRoaXMuTy5DZj1hLHRoaXMuZygiY29udGV4dE1lbnUiLGIsYSkpO319fSk7WS5wcm90b3R5cGUuc2V0UHJvcGVydGllcz1ZLnByb3RvdHlwZS5NdjtZLnByb3RvdHlwZS5maW5kVGVtcGxhdGVCaW5kZXI9WS5wcm90b3R5cGUuR2k7WS5wcm90b3R5cGUuYmluZD1ZLnByb3RvdHlwZS5iaW5kO1kucHJvdG90eXBlLmlzRW5hYmxlZE9iamVjdD1ZLnByb3RvdHlwZS5yZztZLnByb3RvdHlwZS5pc1Zpc2libGVPYmplY3Q9WS5wcm90b3R5cGUucmY7WS5wcm90b3R5cGUuaXNDb250YWluZWRCeT1ZLnByb3RvdHlwZS5xZztZLnByb3RvdHlwZS5nZXROZWFyZXN0SW50ZXJzZWN0aW9uUG9pbnQ9WS5wcm90b3R5cGUuVGM7WS5wcm90b3R5cGUuZ2V0TG9jYWxQb2ludD1ZLnByb3RvdHlwZS5XcztZLnByb3RvdHlwZS5nZXREb2N1bWVudFNjYWxlPVkucHJvdG90eXBlLkNlO1kucHJvdG90eXBlLmdldERvY3VtZW50QW5nbGU9WS5wcm90b3R5cGUuSmk7WS5wcm90b3R5cGUuZ2V0RG9jdW1lbnRCb3VuZHM9WS5wcm90b3R5cGUuVnA7WS5wcm90b3R5cGUuZ2V0RG9jdW1lbnRQb2ludD1ZLnByb3RvdHlwZS5tYTtZLnByb3RvdHlwZS5pbnRlcnNlY3RzUmVjdD1ZLnByb3RvdHlwZS5JYztZLnByb3RvdHlwZS5jb250YWluZWRJblJlY3Q9WS5wcm90b3R5cGUudWg7WS5wcm90b3R5cGUuY29udGFpbnNSZWN0PVkucHJvdG90eXBlLmxmO1kucHJvdG90eXBlLmNvbnRhaW5zUG9pbnQ9WS5wcm90b3R5cGUuZWE7WS5wcm90b3R5cGUucmFpc2VDaGFuZ2VkPVkucHJvdG90eXBlLmc7WS5wcm90b3R5cGUucmFpc2VDaGFuZ2VkRXZlbnQ9WS5wcm90b3R5cGUuYWI7WS5wcm90b3R5cGUuYWRkQ29weVByb3BlcnR5PVkucHJvdG90eXBlLlF3O3ZhciBCbD1udWxsO1kuY2xhc3NOYW1lPSJHcmFwaE9iamVjdCI7Qmw9bmV3IExiKCk7RmwoIkJ1dHRvbiIsZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7cmV0dXJuIG51bGwhPT1hLmRpYWdyYW0uU2IoYS5kb2N1bWVudFBvaW50LGZ1bmN0aW9uKGEpe2Zvcig7bnVsbCE9PWEucGFuZWwmJiFhLmlzQWN0aW9uYWJsZTspe2E9YS5wYW5lbDt9cmV0dXJuIGE7fSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWI7fSk7fXZhciBiPUFsKFgsWC5BdXRvLHtpc0FjdGlvbmFibGU6ITAsZW5hYmxlZENoYW5nZWQ6ZnVuY3Rpb24gZW5hYmxlZENoYW5nZWQoYSxiKXtpZihhIGluc3RhbmNlb2YgWCl7dmFyIGM9YS4kYSgiQnV0dG9uQm9yZGVyIik7bnVsbCE9PWMmJihjLmZpbGw9Yj9hLl9idXR0b25GaWxsTm9ybWFsOmEuX2J1dHRvbkZpbGxEaXNhYmxlZCk7fX0sY3Vyc29yOiJwb2ludGVyIixfYnV0dG9uRmlsbE5vcm1hbDoiI0Y1RjVGNSIsX2J1dHRvblN0cm9rZU5vcm1hbDoiI0JEQkRCRCIsX2J1dHRvbkZpbGxPdmVyOiIjRTBFMEUwIixfYnV0dG9uU3Ryb2tlT3ZlcjoiIzlFOUU5RSIsX2J1dHRvbkZpbGxQcmVzc2VkOiIjQkRCREJEIixfYnV0dG9uU3Ryb2tlUHJlc3NlZDoiIzlFOUU5RSIsX2J1dHRvbkZpbGxEaXNhYmxlZDoiI0U1RTVFNSJ9LEFsKFcse25hbWU6IkJ1dHRvbkJvcmRlciIsZmlndXJlOiJSb3VuZGVkUmVjdGFuZ2xlIixzcG90MTpuZXcgTygwLDAsMi43NjE0MjM3NDkxNTM5NywyLjc2MTQyMzc0OTE1Mzk2OSksc3BvdDI6bmV3IE8oMSwxLC0yLjc2MTQyMzc0OTE1Mzk3LC0yLjc2MTQyMzc0OTE1Mzk2OSkscGFyYW1ldGVyMToyLHBhcmFtZXRlcjI6MixmaWxsOiIjRjVGNUY1IixzdHJva2U6IiNCREJEQkQifSkpO2IubW91c2VFbnRlcj1mdW5jdGlvbihhLGIpe2lmKGIucmcoKSYmYiBpbnN0YW5jZW9mIFgmJihhPWIuJGEoIkJ1dHRvbkJvcmRlciIpLGEgaW5zdGFuY2VvZiBXKSl7dmFyIGM9Yi5fYnV0dG9uRmlsbE92ZXI7Yi5fYnV0dG9uRmlsbE5vcm1hbD1hLmZpbGw7YS5maWxsPWM7Yz1iLl9idXR0b25TdHJva2VPdmVyO2IuX2J1dHRvblN0cm9rZU5vcm1hbD1hLnN0cm9rZTthLnN0cm9rZT1jO319O2IubW91c2VMZWF2ZT1mdW5jdGlvbihhLGIpe2IucmcoKSYmYiBpbnN0YW5jZW9mIFgmJihhPWIuJGEoIkJ1dHRvbkJvcmRlciIpLGEgaW5zdGFuY2VvZiBXJiYoYS5maWxsPWIuX2J1dHRvbkZpbGxOb3JtYWwsYS5zdHJva2U9Yi5fYnV0dG9uU3Ryb2tlTm9ybWFsKSk7fTtiLmFjdGlvbkRvd249ZnVuY3Rpb24oYSxiKXtpZihiLnJnKCkmJmIgaW5zdGFuY2VvZiBYJiZudWxsIT09Yi5fYnV0dG9uRmlsbFByZXNzZWQmJjA9PT1hLmJ1dHRvbil7dmFyIGM9Yi4kYSgiQnV0dG9uQm9yZGVyIik7aWYoYyBpbnN0YW5jZW9mIFcpe2E9YS5kaWFncmFtO3ZhciBkPWEuc2tpcHNVbmRvTWFuYWdlcjthLnNraXBzVW5kb01hbmFnZXI9ITA7dmFyIGc9Yi5fYnV0dG9uRmlsbFByZXNzZWQ7Yi5fYnV0dG9uRmlsbE92ZXI9Yy5maWxsO2MuZmlsbD1nO2c9Yi5fYnV0dG9uU3Ryb2tlUHJlc3NlZDtiLl9idXR0b25TdHJva2VPdmVyPWMuc3Ryb2tlO2Muc3Ryb2tlPWc7YS5za2lwc1VuZG9NYW5hZ2VyPWQ7fX19O2IuYWN0aW9uVXA9ZnVuY3Rpb24oYixkKXtpZihkLnJnKCkmJmQgaW5zdGFuY2VvZiBYJiZudWxsIT09ZC5fYnV0dG9uRmlsbFByZXNzZWQmJjA9PT1iLmJ1dHRvbil7dmFyIGM9ZC4kYSgiQnV0dG9uQm9yZGVyIik7aWYoYyBpbnN0YW5jZW9mIFcpe3ZhciBmPWIuZGlhZ3JhbSxnPWYuc2tpcHNVbmRvTWFuYWdlcjtmLnNraXBzVW5kb01hbmFnZXI9ITA7YShiLGQpPyhjLmZpbGw9ZC5fYnV0dG9uRmlsbE92ZXIsYy5zdHJva2U9ZC5fYnV0dG9uU3Ryb2tlT3Zlcik6KGMuZmlsbD1kLl9idXR0b25GaWxsTm9ybWFsLGMuc3Ryb2tlPWQuX2J1dHRvblN0cm9rZU5vcm1hbCk7Zi5za2lwc1VuZG9NYW5hZ2VyPWc7fX19O2IuYWN0aW9uQ2FuY2VsPWZ1bmN0aW9uKGIsZCl7aWYoZC5yZygpJiZkIGluc3RhbmNlb2YgWCYmbnVsbCE9PWQuX2J1dHRvbkZpbGxQcmVzc2VkKXt2YXIgYz1kLiRhKCJCdXR0b25Cb3JkZXIiKTtpZihjIGluc3RhbmNlb2YgVyl7dmFyIGY9Yi5kaWFncmFtLGc9Zi5za2lwc1VuZG9NYW5hZ2VyO2Yuc2tpcHNVbmRvTWFuYWdlcj0hMDthKGIsZCk/KGMuZmlsbD1kLl9idXR0b25GaWxsT3ZlcixjLnN0cm9rZT1kLl9idXR0b25TdHJva2VPdmVyKTooYy5maWxsPWQuX2J1dHRvbkZpbGxOb3JtYWwsYy5zdHJva2U9ZC5fYnV0dG9uU3Ryb2tlTm9ybWFsKTtmLnNraXBzVW5kb01hbmFnZXI9Zzt9fX07Yi5hY3Rpb25Nb3ZlPWZ1bmN0aW9uKGIsZCl7aWYoZC5yZygpJiZkIGluc3RhbmNlb2YgWCYmbnVsbCE9PWQuX2J1dHRvbkZpbGxQcmVzc2VkKXt2YXIgYz1iLmRpYWdyYW07aWYoMD09PWMuZmlyc3RJbnB1dC5idXR0b24mJihjLmN1cnJlbnRUb29sLnN0YW5kYXJkTW91c2VPdmVyKCksYShiLGQpJiYoYj1kLiRhKCJCdXR0b25Cb3JkZXIiKSxiIGluc3RhbmNlb2YgVykpKXt2YXIgZj1jLnNraXBzVW5kb01hbmFnZXI7Yy5za2lwc1VuZG9NYW5hZ2VyPSEwO3ZhciBnPWQuX2J1dHRvbkZpbGxQcmVzc2VkO2IuZmlsbCE9PWcmJihiLmZpbGw9Zyk7Zz1kLl9idXR0b25TdHJva2VQcmVzc2VkO2Iuc3Ryb2tlIT09ZyYmKGIuc3Ryb2tlPWcpO2Muc2tpcHNVbmRvTWFuYWdlcj1mO319fTtyZXR1cm4gYjt9KTtGbCgiVHJlZUV4cGFuZGVyQnV0dG9uIixmdW5jdGlvbigpe3ZhciBhPUFsKCJCdXR0b24iLHtfdHJlZUV4cGFuZGVkRmlndXJlOiJNaW51c0xpbmUiLF90cmVlQ29sbGFwc2VkRmlndXJlOiJQbHVzTGluZSJ9LEFsKFcse25hbWU6IkJ1dHRvbkljb24iLGZpZ3VyZToiTWludXNMaW5lIixzdHJva2U6IiM0MjQyNDIiLHN0cm9rZVdpZHRoOjIsZGVzaXJlZFNpemU6aWN9LG5ldyBIaSgiZmlndXJlIiwiaXNUcmVlRXhwYW5kZWQiLGZ1bmN0aW9uKGEsYyl7Yz1jLnBhbmVsO3JldHVybiBhP2MuX3RyZWVFeHBhbmRlZEZpZ3VyZTpjLl90cmVlQ29sbGFwc2VkRmlndXJlO30pLmhxKCkpLHt2aXNpYmxlOiExfSxuZXcgSGkoInZpc2libGUiLCJpc1RyZWVMZWFmIixmdW5jdGlvbihhKXtyZXR1cm4hYTt9KS5ocSgpKTthLmNsaWNrPWZ1bmN0aW9uKGEsYyl7Yz1jLnBhcnQ7YyBpbnN0YW5jZW9mIHBmJiYoYz1jLmFkb3JuZWRQYXJ0KTtpZihjIGluc3RhbmNlb2YgVil7dmFyIGI9Yy5kaWFncmFtO2lmKG51bGwhPT1iKXtiPWIuY29tbWFuZEhhbmRsZXI7aWYoYy5pc1RyZWVFeHBhbmRlZCl7aWYoIWIuY2FuQ29sbGFwc2VUcmVlKGMpKXJldHVybjt9ZWxzZSBpZighYi5jYW5FeHBhbmRUcmVlKGMpKXJldHVybjthLmhhbmRsZWQ9ITA7Yy5pc1RyZWVFeHBhbmRlZD9iLmNvbGxhcHNlVHJlZShjKTpiLmV4cGFuZFRyZWUoYyk7fX19O3JldHVybiBhO30pO0ZsKCJTdWJHcmFwaEV4cGFuZGVyQnV0dG9uIixmdW5jdGlvbigpe3ZhciBhPUFsKCJCdXR0b24iLHtfc3ViR3JhcGhFeHBhbmRlZEZpZ3VyZToiTWludXNMaW5lIixfc3ViR3JhcGhDb2xsYXBzZWRGaWd1cmU6IlBsdXNMaW5lIn0sQWwoVyx7bmFtZToiQnV0dG9uSWNvbiIsZmlndXJlOiJNaW51c0xpbmUiLHN0cm9rZToiIzQyNDI0MiIsc3Ryb2tlV2lkdGg6MixkZXNpcmVkU2l6ZTppY30sbmV3IEhpKCJmaWd1cmUiLCJpc1N1YkdyYXBoRXhwYW5kZWQiLGZ1bmN0aW9uKGEsYyl7Yz1jLnBhbmVsO3JldHVybiBhP2MuX3N1YkdyYXBoRXhwYW5kZWRGaWd1cmU6Yy5fc3ViR3JhcGhDb2xsYXBzZWRGaWd1cmU7fSkuaHEoKSkpO2EuY2xpY2s9ZnVuY3Rpb24oYSxjKXtjPWMucGFydDtjIGluc3RhbmNlb2YgcGYmJihjPWMuYWRvcm5lZFBhcnQpO2lmKGMgaW5zdGFuY2VvZiBpZyl7dmFyIGI9Yy5kaWFncmFtO2lmKG51bGwhPT1iKXtiPWIuY29tbWFuZEhhbmRsZXI7aWYoYy5pc1N1YkdyYXBoRXhwYW5kZWQpe2lmKCFiLmNhbkNvbGxhcHNlU3ViR3JhcGgoYykpcmV0dXJuO31lbHNlIGlmKCFiLmNhbkV4cGFuZFN1YkdyYXBoKGMpKXJldHVybjthLmhhbmRsZWQ9ITA7Yy5pc1N1YkdyYXBoRXhwYW5kZWQ/Yi5jb2xsYXBzZVN1YkdyYXBoKGMpOmIuZXhwYW5kU3ViR3JhcGgoYyk7fX19O3JldHVybiBhO30pO0ZsKCJUb29sVGlwIixmdW5jdGlvbigpe3JldHVybiBBbChwZixYLkF1dG8se2lzU2hhZG93ZWQ6ITAsc2hhZG93Q29sb3I6InJnYmEoMCwgMCwgMCwgLjQpIixzaGFkb3dPZmZzZXQ6bmV3IEcoMCwzKSxzaGFkb3dCbHVyOjV9LEFsKFcse25hbWU6IkJvcmRlciIsZmlndXJlOiJSb3VuZGVkUmVjdGFuZ2xlIixwYXJhbWV0ZXIxOjEscGFyYW1ldGVyMjoxLGZpbGw6IiNGNUY1RjUiLHN0cm9rZToiI0YwRjBGMCIsc3BvdDE6bmV3IE8oMCwwLDQsNiksc3BvdDI6bmV3IE8oMSwxLC00LC00KX0pKTt9KTtGbCgiQ29udGV4dE1lbnUiLGZ1bmN0aW9uKCl7cmV0dXJuIEFsKHBmLFguVmVydGljYWwse2JhY2tncm91bmQ6IiNGNUY1RjUiLGlzU2hhZG93ZWQ6ITAsc2hhZG93Q29sb3I6InJnYmEoMCwgMCwgMCwgLjQpIixzaGFkb3dPZmZzZXQ6bmV3IEcoMCwzKSxzaGFkb3dCbHVyOjV9LG5ldyBIaSgiYmFja2dyb3VuZCIsIiIsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hLmFkb3JuZWRQYXJ0JiZudWxsIT09YS5wbGFjZWhvbGRlcj9udWxsOiIjRjVGNUY1Ijt9KSk7fSk7RmwoIkNvbnRleHRNZW51QnV0dG9uIixmdW5jdGlvbigpe3ZhciBhPUFsKCJCdXR0b24iKTthLnN0cmV0Y2g9TWs7dmFyIGI9YS4kYSgiQnV0dG9uQm9yZGVyIik7YiBpbnN0YW5jZW9mIFcmJihiLmZpZ3VyZT0iUmVjdGFuZ2xlIixiLnN0cm9rZVdpZHRoPTAsYi5zcG90MT1uZXcgTygwLDAsMiwzKSxiLnNwb3QyPW5ldyBPKDEsMSwtMiwtMikpO3JldHVybiBhO30pO0ZsKCJQYW5lbEV4cGFuZGVyQnV0dG9uIixmdW5jdGlvbihhKXt2YXIgYj1HbChhLCJDT0xMQVBTSUJMRSIpLGM9QWwoIkJ1dHRvbiIse19idXR0b25FeHBhbmRlZEZpZ3VyZToiTTAgMCBNMCA2IEw0IDIgOCA2IE04IDgiLF9idXR0b25Db2xsYXBzZWRGaWd1cmU6Ik0wIDAgTTAgMiBMNCA2IDggMiBNOCA4IixfYnV0dG9uRmlsbE5vcm1hbDoicmdiYSgwLCAwLCAwLCAwKSIsX2J1dHRvblN0cm9rZU5vcm1hbDpudWxsLF9idXR0b25GaWxsT3ZlcjoicmdiYSgwLCAwLCAwLCAuMikiLF9idXR0b25TdHJva2VPdmVyOm51bGwsX2J1dHRvbkZpbGxQcmVzc2VkOiJyZ2JhKDAsIDAsIDAsIC40KSIsX2J1dHRvblN0cm9rZVByZXNzZWQ6bnVsbH0sQWwoVyx7bmFtZToiQnV0dG9uSWNvbiIsc3Ryb2tlV2lkdGg6Mn0sbmV3IEhpKCJnZW9tZXRyeVN0cmluZyIsInZpc2libGUiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2MuX2J1dHRvbkV4cGFuZGVkRmlndXJlOmMuX2J1dHRvbkNvbGxhcHNlZEZpZ3VyZTt9KS5ocShiKSkpO2E9Yy4kYSgiQnV0dG9uQm9yZGVyIik7YSBpbnN0YW5jZW9mIFcmJihhLnN0cm9rZT1udWxsLGEuZmlsbD0icmdiYSgwLCAwLCAwLCAwKSIpO2MuY2xpY2s9ZnVuY3Rpb24oYSxjKXthPWMuZGlhZ3JhbTtpZihudWxsIT09YSYmIWEuaXNSZWFkT25seSl7dmFyIGQ9Yy5HaSgpO251bGw9PT1kJiYoZD1jLnBhcnQpO251bGwhPT1kJiYoYz1kLiRhKGIpLG51bGwhPT1jJiYoYS5BYSgiQ29sbGFwc2UvRXhwYW5kIFBhbmVsIiksYy52aXNpYmxlPSFjLnZpc2libGUsYS5aYSgiQ29sbGFwc2UvRXhwYW5kIFBhbmVsIikpKTt9fTtyZXR1cm4gYzt9KTtGbCgiQ2hlY2tCb3hCdXR0b24iLGZ1bmN0aW9uKGEpe3ZhciBiPUdsKGEpO2E9QWwoIkJ1dHRvbiIse2Rlc2lyZWRTaXplOm5ldyBLKDE0LDE0KX0sQWwoVyx7bmFtZToiQnV0dG9uSWNvbiIsZ2VvbWV0cnlTdHJpbmc6Ik0wIDAgTTAgOC44NSBMNC45IDEzLjc1IDE2LjIgMi40NSBNMTYuMiAxNi4yIixzdHJva2VXaWR0aDoyLHN0cmV0Y2g6YmUsZ2VvbWV0cnlTdHJldGNoOmFoLHZpc2libGU6ITF9LCIiIT09Yj9uZXcgSGkoInZpc2libGUiLGIpLnR4KCk6W10pKTthLmNsaWNrPWZ1bmN0aW9uKGEsZCl7aWYoZCBpbnN0YW5jZW9mIFgpe3ZhciBjPWEuZGlhZ3JhbTtpZighKG51bGw9PT1jfHxjLmlzUmVhZE9ubHl8fCIiIT09YiYmYy5tb2RlbC5pc1JlYWRPbmx5KSl7YS5oYW5kbGVkPSEwO3ZhciBmPWQuJGEoIkJ1dHRvbkljb24iKTtjLkFhKCJjaGVja2JveCIpO2YudmlzaWJsZT0hZi52aXNpYmxlOyJmdW5jdGlvbiI9PT10eXBlb2YgZC5fZG9DbGljayYmZC5fZG9DbGljayhhLGQpO2MuWmEoImNoZWNrYm94Iik7fX19O3JldHVybiBhO30pO0ZsKCJDaGVja0JveCIsZnVuY3Rpb24oYSl7YT1HbChhKTthPUFsKCJDaGVja0JveEJ1dHRvbiIsYSx7bmFtZToiQnV0dG9uIixpc0FjdGlvbmFibGU6ITEsbWFyZ2luOm5ldyBJYygwLDEsMCwwKX0pO3ZhciBiPUFsKFgsIkhvcml6b250YWwiLGEse2lzQWN0aW9uYWJsZTohMCxjdXJzb3I6YS5jdXJzb3IsbWFyZ2luOjEsX2J1dHRvbkZpbGxOb3JtYWw6YS5fYnV0dG9uRmlsbE5vcm1hbCxfYnV0dG9uU3Ryb2tlTm9ybWFsOmEuX2J1dHRvblN0cm9rZU5vcm1hbCxfYnV0dG9uRmlsbE92ZXI6YS5fYnV0dG9uRmlsbE92ZXIsX2J1dHRvblN0cm9rZU92ZXI6YS5fYnV0dG9uU3Ryb2tlT3ZlcixfYnV0dG9uRmlsbFByZXNzZWQ6YS5fYnV0dG9uRmlsbFByZXNzZWQsX2J1dHRvblN0cm9rZVByZXNzZWQ6YS5fYnV0dG9uU3Ryb2tlUHJlc3NlZCxfYnV0dG9uRmlsbERpc2FibGVkOmEuX2J1dHRvbkZpbGxEaXNhYmxlZCxtb3VzZUVudGVyOmEubW91c2VFbnRlcixtb3VzZUxlYXZlOmEubW91c2VMZWF2ZSxhY3Rpb25Eb3duOmEuYWN0aW9uRG93bixhY3Rpb25VcDphLmFjdGlvblVwLGFjdGlvbkNhbmNlbDphLmFjdGlvbkNhbmNlbCxhY3Rpb25Nb3ZlOmEuYWN0aW9uTW92ZSxjbGljazphLmNsaWNrLF9idXR0b25DbGljazphLmNsaWNrfSk7YS5tb3VzZUVudGVyPW51bGw7YS5tb3VzZUxlYXZlPW51bGw7YS5hY3Rpb25Eb3duPW51bGw7YS5hY3Rpb25VcD1udWxsO2EuYWN0aW9uQ2FuY2VsPW51bGw7YS5hY3Rpb25Nb3ZlPW51bGw7YS5jbGljaz1udWxsO3JldHVybiBiO30pO1kuTm9uZT1aZz1uZXcgRChZLCJOb25lIiwwKTtZLkRlZmF1bHQ9TGs9bmV3IEQoWSwiRGVmYXVsdCIsMCk7WS5WZXJ0aWNhbD1Oaz1uZXcgRChZLCJWZXJ0aWNhbCIsNCk7WS5Ib3Jpem9udGFsPU1rPW5ldyBEKFksIkhvcml6b250YWwiLDUpO1kuRmlsbD1iZT1uZXcgRChZLCJGaWxsIiwzKTtZLlVuaWZvcm09YWg9bmV3IEQoWSwiVW5pZm9ybSIsMSk7WS5Vbmlmb3JtVG9GaWxsPU9rPW5ldyBEKFksIlVuaWZvcm1Ub0ZpbGwiLDIpO1kuRmxpcFZlcnRpY2FsPVBrPW5ldyBEKFksIkZsaXBWZXJ0aWNhbCIsMSk7WS5GbGlwSG9yaXpvbnRhbD1Raz1uZXcgRChZLCJGbGlwSG9yaXpvbnRhbCIsMik7WS5GbGlwQm90aD1Saz1uZXcgRChZLCJGbGlwQm90aCIsMyk7WS5tYWtlPUFsO1kuZ2V0QnVpbGRlcnM9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgTGIoKSxiO2ZvcihiIGluIEJsKXtpZihiIT09Yi50b0xvd2VyQ2FzZSgpKXt2YXIgYz1CbC5KKGIpOyJmdW5jdGlvbiI9PT10eXBlb2YgYyYmYS5hZGQoYixjKTt9fWEuZnJlZXplKCk7cmV0dXJuIGE7fTtZLmRlZmluZUJ1aWxkZXI9Rmw7WS50YWtlQnVpbGRlckFyZ3VtZW50PUdsO2Z1bmN0aW9uIFRrKCl7dGhpcy5Cbj10aGlzLkNmPXRoaXMuZ2c9dGhpcy5IbT10aGlzLkttPXRoaXMuSm09dGhpcy5JbT10aGlzLlJmPXRoaXMudW89dGhpcy50bz10aGlzLlRmPXRoaXMuVWY9dGhpcy5XZj10aGlzLlZmPXRoaXMuU2Y9dGhpcy5CZj10aGlzLkZmPXRoaXMuQWY9bnVsbDt9VGsucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVGsoKTthLkFmPXRoaXMuQWY7YS5GZj10aGlzLkZmO2EuQmY9dGhpcy5CZjthLlNmPXRoaXMuU2Y7YS5WZj10aGlzLlZmO2EuV2Y9dGhpcy5XZjthLlVmPXRoaXMuVWY7YS5UZj10aGlzLlRmO2EudG89dGhpcy50bzthLnVvPXRoaXMudW87YS5SZj10aGlzLlJmO2EuSW09dGhpcy5JbTthLkptPXRoaXMuSm07YS5LbT10aGlzLkttO2EuSG09dGhpcy5IbTthLmdnPXRoaXMuZ2c7YS5DZj10aGlzLkNmO2EuQm49dGhpcy5CbjtyZXR1cm4gYTt9O1RrLmNsYXNzTmFtZT0iR3JhcGhPYmplY3RFdmVudEhhbmRsZXJzIjtmdW5jdGlvbiBKbCgpe3RoaXMuT2E9WzEsMCwwLDEsMCwwXTt9SmwucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgSmwoKTthLk9hWzBdPXRoaXMuT2FbMF07YS5PYVsxXT10aGlzLk9hWzFdO2EuT2FbMl09dGhpcy5PYVsyXTthLk9hWzNdPXRoaXMuT2FbM107YS5PYVs0XT10aGlzLk9hWzRdO2EuT2FbNV09dGhpcy5PYVs1XTtyZXR1cm4gYTt9O0psLnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24oYSxiKXt0aGlzLk9hWzRdKz10aGlzLk9hWzBdKmErdGhpcy5PYVsyXSpiO3RoaXMuT2FbNV0rPXRoaXMuT2FbMV0qYSt0aGlzLk9hWzNdKmI7fTtKbC5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24oYSxiKXt0aGlzLk9hWzBdKj1hO3RoaXMuT2FbMV0qPWE7dGhpcy5PYVsyXSo9Yjt0aGlzLk9hWzNdKj1iO307SmwuY2xhc3NOYW1lPSJTVHJhbnNmb3JtIjtmdW5jdGlvbiBLbChhKXt0aGlzLnR5cGU9YTt0aGlzLnIyPXRoaXMueTI9dGhpcy54Mj10aGlzLnIxPXRoaXMueTE9dGhpcy54MT0wO3RoaXMuWXc9W107dGhpcy5wYXR0ZXJuPW51bGw7fUtsLnByb3RvdHlwZS5hZGRDb2xvclN0b3A9ZnVuY3Rpb24oYSxiKXt0aGlzLll3LnB1c2goe29mZnNldDphLGNvbG9yOmJ9KTt9O0tsLmNsYXNzTmFtZT0iU0dyYWRpZW50IjtmdW5jdGlvbiB5aihhLGIpe3RoaXMub3duZXJEb2N1bWVudD1hPXZvaWQgMD09PWI/dy5kb2N1bWVudDpiO3RoaXMuRno9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjt2b2lkIDAhPT1hJiYodGhpcy5HYT10aGlzLnViKCJzdmciLHt3aWR0aDoiMXB4IixoZWlnaHQ6IjFweCIsdmlld0JveDoiMCAwIDEgMSJ9KSx0aGlzLkdhLnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKSx0aGlzLkdhLnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsInhtbG5zOnhsaW5rIiwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIpKTt0aGlzLlFwPW51bGw7dGhpcy5jb250ZXh0PW5ldyBMbCh0aGlzKTt9eWoucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy53aWR0aCE9PWF8fHRoaXMuaGVpZ2h0IT09Yj8odGhpcy5zdHlsZS53aWR0aD1jKyJweCIsdGhpcy5zdHlsZS5oZWlnaHQ9ZCsicHgiLHRoaXMuR2Euc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgiLGMrInB4IiksdGhpcy5HYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLGQrInB4IiksdGhpcy5HYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ2aWV3Qm94IiwiMCAwICIrYysiICIrZCksdGhpcy5jb250ZXh0Lmd1LmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIixjKyJweCIpLHRoaXMuY29udGV4dC5ndS5maXJzdEVsZW1lbnRDaGlsZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLGQrInB4IiksITApOiExO307eWoucHJvdG90eXBlLnViPWZ1bmN0aW9uKGEsYixjKXthPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy5GeixhKTtpZihDYShiKSlmb3IodmFyIGQgaW4gYil7YS5zZXRBdHRyaWJ1dGVOUygiaHJlZiI9PT1kPyJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIjoiIixkLGJbZF0pO312b2lkIDAhPT1jJiYoYS50ZXh0Q29udGVudD1jKTtyZXR1cm4gYTt9O3lqLnByb3RvdHlwZS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt9O3lqLnByb3RvdHlwZS5mb2N1cz1mdW5jdGlvbigpe3RoaXMuR2EuZm9jdXMoKTt9O3lqLnByb3RvdHlwZS5leD1mdW5jdGlvbigpe3RoaXMub3duZXJEb2N1bWVudD1udWxsO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeWoucHJvdG90eXBlLHt3aWR0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkdhLndpZHRoLmJhc2VWYWwudmFsdWU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuR2Eud2lkdGg9YTt9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5HYS5oZWlnaHQuYmFzZVZhbC52YWx1ZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5HYS5oZWlnaHQ9YTt9fSxzdHlsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkdhLnN0eWxlO319fSk7eWouY2xhc3NOYW1lPSJTVkdTdXJmYWNlIjtmdW5jdGlvbiBMbChhKXt0aGlzLnJrPWE7dGhpcy5zdmc9YS5HYTt0aGlzLnN0YWNrPVtdO3RoaXMud2M9W107dGhpcy5maWxsU3R5bGU9IiMwMDAwMDAiO3RoaXMuZm9udD0iMTBweCBzYW5zLXNlcmlmIjt0aGlzLmdsb2JhbEFscGhhPTE7dGhpcy5saW5lQ2FwPSJidXR0Ijt0aGlzLmxpbmVEYXNoT2Zmc2V0PTA7dGhpcy5saW5lSm9pbj0ibWl0ZXIiO3RoaXMubGluZVdpZHRoPTE7dGhpcy5taXRlckxpbWl0PTEwO3RoaXMuc2hhZG93Qmx1cj0wO3RoaXMuc2hhZG93Q29sb3I9InJnYmEoMCwgMCwgMCwgMCkiO3RoaXMuc2hhZG93T2Zmc2V0WT10aGlzLnNoYWRvd09mZnNldFg9MDt0aGlzLnN0cm9rZVN0eWxlPSIjMDAwMDAwIjt0aGlzLnRleHRBbGlnbj0ic3RhcnQiO3RoaXMuY2xpcEluc3RlYWRPZkZpbGw9ITE7dGhpcy5PZD10aGlzLm5wPXRoaXMubXA9MDt0aGlzLmFxPW51bGw7dGhpcy5wYXRoPVtdO3RoaXMuY3U9ITE7dGhpcy5naD1udWxsO3RoaXMuaGg9MDt0aGlzLlNkPW5ldyBKbCgpO01sKHRoaXMsMSwwLDAsMSwwLDApO3ZhciBiPUdiKyssYz10aGlzLnViKCJjbGlwUGF0aCIse2lkOiJtYWluQ2xpcCIrYn0pO2MuYXBwZW5kQ2hpbGQodGhpcy51YigicmVjdCIse3g6MCx5OjAsd2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHR9KSk7dGhpcy5ndT1jO3RoaXMucmsuR2EuYXBwZW5kQ2hpbGQoYyk7dGhpcy53Y1swXS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGlwLXBhdGgiLCJ1cmwoI21haW5DbGlwIitiKyIpIik7dGhpcy5Iej17fTt9dD1MbC5wcm90b3R5cGU7dC5yZXNldD1mdW5jdGlvbigpe3RoaXMuc3RhY2s9W107dGhpcy53Yz1bXTt0aGlzLmZpbGxTdHlsZT0iIzAwMDAwMCI7dGhpcy5mb250PSIxMHB4IHNhbnMtc2VyaWYiO3RoaXMuZ2xvYmFsQWxwaGE9MTt0aGlzLmxpbmVDYXA9ImJ1dHQiO3RoaXMubGluZURhc2hPZmZzZXQ9MDt0aGlzLmxpbmVKb2luPSJtaXRlciI7dGhpcy5saW5lV2lkdGg9MTt0aGlzLm1pdGVyTGltaXQ9MTA7dGhpcy5zaGFkb3dCbHVyPTA7dGhpcy5zaGFkb3dDb2xvcj0icmdiYSgwLCAwLCAwLCAwKSI7dGhpcy5zaGFkb3dPZmZzZXRZPXRoaXMuc2hhZG93T2Zmc2V0WD0wO3RoaXMuc3Ryb2tlU3R5bGU9IiMwMDAwMDAiO3RoaXMudGV4dEFsaWduPSJzdGFydCI7dGhpcy5jbGlwSW5zdGVhZE9mRmlsbD0hMTt0aGlzLk9kPXRoaXMubnA9dGhpcy5tcD0wO3RoaXMuYXE9bnVsbDt0aGlzLnBhdGg9W107dGhpcy5TZD1uZXcgSmwoKTtNbCh0aGlzLDEsMCwwLDEsMCwwKTt2YXIgYT1HYisrLGI9dGhpcy51YigiY2xpcFBhdGgiLHtpZDoibWFpbkNsaXAiK2F9KTtiLmFwcGVuZENoaWxkKHRoaXMudWIoInJlY3QiLHt4OjAseTowLHdpZHRoOnRoaXMucmsud2lkdGgsaGVpZ2h0OnRoaXMucmsuaGVpZ2h0fSkpO3RoaXMuZ3U9Yjt0aGlzLnJrLkdhLmFwcGVuZENoaWxkKGIpO3RoaXMud2NbMF0uc2V0QXR0cmlidXRlTlMobnVsbCwiY2xpcC1wYXRoIiwidXJsKCNtYWluQ2xpcCIrYSsiKSIpO307dC5hcmM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXt2YXIgaz0yKk1hdGguUEksbD1rLTFFLTYsbT1jKk1hdGguY29zKGQpLG49YypNYXRoLnNpbihkKSxwPWErbSxxPWIrbixyPWY/MDoxO2Q9Zj9kLWU6ZS1kOygxRS02PE1hdGguYWJzKGctcCl8fDFFLTY8TWF0aC5hYnMoaC1xKSkmJnRoaXMucGF0aC5wdXNoKFsiTCIscCwrcV0pOzA+ZCYmKGQ9ZCVrK2spO2Q+bD8odGhpcy5wYXRoLnB1c2goWyJBIixjLGMsMCwxLHIsYS1tLGItbl0pLHRoaXMucGF0aC5wdXNoKFsiQSIsYyxjLDAsMSxyLHAscV0pKToxRS02PGQmJnRoaXMucGF0aC5wdXNoKFsiQSIsYyxjLDAsKyhkPj1NYXRoLlBJKSxyLGErYypNYXRoLmNvcyhlKSxiK2MqTWF0aC5zaW4oZSldKTt9O3QuYmVnaW5QYXRoPWZ1bmN0aW9uKCl7dGhpcy5wYXRoPVtdO307dC5iZXppZXJDdXJ2ZVRvPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLnBhdGgucHVzaChbIkMiLGEsYixjLGQsZSxmXSk7fTt0LmNsZWFyUmVjdD1mdW5jdGlvbigpe307dC5jbGlwPWZ1bmN0aW9uKCl7dGhpcy5hZGRQYXRoKCJjbGlwUGF0aCIsdGhpcy5wYXRoLHRoaXMuU2QpO3RoaXMuYWRkUGF0aCgiY2xpcFBhdGgiLHRoaXMucGF0aCxuZXcgSmwoKSk7fTt0LmNsb3NlUGF0aD1mdW5jdGlvbigpe3RoaXMucGF0aC5wdXNoKFsieiJdKTt9O3QuY3JlYXRlTGluZWFyR3JhZGllbnQ9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bmV3IEtsKCJsaW5lYXIiKTtlLngxPWE7ZS55MT1iO2UueDI9YztlLnkyPWQ7cmV0dXJuIGU7fTt0LmNyZWF0ZVBhdHRlcm49ZnVuY3Rpb24oYSl7dmFyIGI9IiI7YSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50JiYoYj1hLnRvRGF0YVVSTCgpKTthIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCYmKGI9YS5zcmMpO3ZhciBjPXRoaXMuSHo7aWYoY1tiXSlyZXR1cm4idXJsKCMiK2NbYl0rIikiO3ZhciBkPSJQQVRURVJOIitHYisrLGU9e3g6MCx5OjAsd2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHQsaHJlZjpifTthPXRoaXMudWIoInBhdHRlcm4iLHt3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodCxpZDpkLHBhdHRlcm5Vbml0czoidXNlclNwYWNlT25Vc2UifSk7YS5hcHBlbmRDaGlsZCh0aGlzLnViKCJpbWFnZSIsZSkpO3RoaXMuc3ZnLmFwcGVuZENoaWxkKGEpO2NbYl09ZDtyZXR1cm4idXJsKCMiK2QrIikiO307dC5jcmVhdGVSYWRpYWxHcmFkaWVudD1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9bmV3IEtsKCJyYWRpYWwiKTtnLngxPWE7Zy55MT1iO2cucjE9YztnLngyPWQ7Zy55Mj1lO2cucjI9ZjtyZXR1cm4gZzt9O3QuZHJhd0ltYWdlPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxrKXt2YXIgbD0iIjthIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQmJihsPWEudG9EYXRhVVJMKCkpO2EgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50JiYobD1hLnNyYyk7dmFyIG09YSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/YS5uYXR1cmFsV2lkdGg6YS53aWR0aCxuPWEgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50P2EubmF0dXJhbEhlaWdodDphLmhlaWdodDt2b2lkIDA9PT1kJiYoZj1iLGc9YyxoPWQ9bSxrPWU9bik7ZD1kfHwwO2U9ZXx8MDtmPWZ8fDA7Zz1nfHwwO2g9aHx8MDtrPWt8fDA7bD17eDowLHk6MCx3aWR0aDptfHxkLGhlaWdodDpufHxlLGhyZWY6bCxwcmVzZXJ2ZUFzcGVjdFJhdGlvOiJ4TWlkWU1pZCBzbGljZSJ9O0guY2EoZCxoKSYmSC5jYShlLGspfHwobC5wcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIik7YT0iIjtoLz1kO2svPWU7aWYoMCE9PWZ8fDAhPT1nKWErPSIgdHJhbnNsYXRlKCIrZisiLCAiK2crIikiO2lmKDEhPT1ofHwxIT09aylhKz0iIHNjYWxlKCIraCsiLCAiK2srIikiO2lmKDAhPT1ifHwwIT09YylhKz0iIHRyYW5zbGF0ZSgiKy1iKyIsICIrLWMrIikiO2lmKDAhPT1ifHwwIT09Y3x8ZCE9PW18fGUhPT1uKWY9IkNMSVAiK0diKyssZz10aGlzLnViKCJjbGlwUGF0aCIse2lkOmZ9KSxnLmFwcGVuZENoaWxkKHRoaXMudWIoInJlY3QiLHt4OmIseTpjLHdpZHRoOmQsaGVpZ2h0OmV9KSksdGhpcy5zdmcuYXBwZW5kQ2hpbGQoZyksbFsiY2xpcC1wYXRoIl09InVybCgjIitmKyIpIjtObCh0aGlzLCJpbWFnZSIsbCx0aGlzLlNkLGEpO3RoaXMuYWRkRWxlbWVudCgiaW1hZ2UiLGwpO307dC5maWxsPWZ1bmN0aW9uKCl7dGhpcy5hZGRQYXRoKCJmaWxsIix0aGlzLnBhdGgsdGhpcy5TZCk7fTt0LlRkPWZ1bmN0aW9uKCl7dGhpcy5jbGlwSW5zdGVhZE9mRmlsbD90aGlzLmNsaXAoKTp0aGlzLmZpbGwoKTt9O3QuZmlsbFJlY3Q9ZnVuY3Rpb24oYSxiLGMsZCl7YT1bYSxiLGMsZF07YT17eDphWzBdLHk6YVsxXSx3aWR0aDphWzJdLGhlaWdodDphWzNdfTtObCh0aGlzLCJmaWxsIixhLHRoaXMuU2QpO3RoaXMuYWRkRWxlbWVudCgicmVjdCIsYSk7fTt0LmZpbGxUZXh0PWZ1bmN0aW9uKGEsYixjKXthPVthLGIsY107Yj10aGlzLnRleHRBbGlnbjsibGVmdCI9PT1iP2I9InN0YXJ0IjoicmlnaHQiPT09Yj9iPSJlbmQiOiJjZW50ZXIiPT09YiYmKGI9Im1pZGRsZSIpO2I9e3g6YVsxXSx5OmFbMl0sc3R5bGU6ImZvbnQ6ICIrdGhpcy5mb250LCJ0ZXh0LWFuY2hvciI6Yn07TmwodGhpcywiZmlsbCIsYix0aGlzLlNkKTt0aGlzLmFkZEVsZW1lbnQoInRleHQiLGIsYVswXSk7fTt0LmxpbmVUbz1mdW5jdGlvbihhLGIpe3RoaXMucGF0aC5wdXNoKFsiTCIsYSxiXSk7fTt0Lm1vdmVUbz1mdW5jdGlvbihhLGIpe3RoaXMucGF0aC5wdXNoKFsiTSIsYSxiXSk7fTt0LnF1YWRyYXRpY0N1cnZlVG89ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5wYXRoLnB1c2goWyJRIixhLGIsYyxkXSk7fTt0LnJlY3Q9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5wYXRoLnB1c2goWyJNIixhLGJdLFsiTCIsYStjLGJdLFsiTCIsYStjLGIrZF0sWyJMIixhLGIrZF0sWyJ6Il0pO307dC5yZXN0b3JlPWZ1bmN0aW9uKCl7dGhpcy5TZD10aGlzLnN0YWNrLnBvcCgpO3RoaXMucGF0aD10aGlzLnN0YWNrLnBvcCgpO3ZhciBhPXRoaXMuc3RhY2sucG9wKCk7dGhpcy5maWxsU3R5bGU9YS5maWxsU3R5bGU7dGhpcy5mb250PWEuZm9udDt0aGlzLmdsb2JhbEFscGhhPWEuZ2xvYmFsQWxwaGE7dGhpcy5saW5lQ2FwPWEubGluZUNhcDt0aGlzLmxpbmVEYXNoT2Zmc2V0PWEubGluZURhc2hPZmZzZXQ7dGhpcy5saW5lSm9pbj1hLmxpbmVKb2luO3RoaXMubGluZVdpZHRoPWEubGluZVdpZHRoO3RoaXMubWl0ZXJMaW1pdD1hLm1pdGVyTGltaXQ7dGhpcy5zaGFkb3dCbHVyPWEuc2hhZG93Qmx1cjt0aGlzLnNoYWRvd0NvbG9yPWEuc2hhZG93Q29sb3I7dGhpcy5zaGFkb3dPZmZzZXRYPWEuc2hhZG93T2Zmc2V0WDt0aGlzLnNoYWRvd09mZnNldFk9YS5zaGFkb3dPZmZzZXRZO3RoaXMuc3Ryb2tlU3R5bGU9YS5zdHJva2VTdHlsZTt0aGlzLnRleHRBbGlnbj1hLnRleHRBbGlnbjt9O3Quc2F2ZT1mdW5jdGlvbigpe3RoaXMuc3RhY2sucHVzaCh7ZmlsbFN0eWxlOnRoaXMuZmlsbFN0eWxlLGZvbnQ6dGhpcy5mb250LGdsb2JhbEFscGhhOnRoaXMuZ2xvYmFsQWxwaGEsbGluZUNhcDp0aGlzLmxpbmVDYXAsbGluZURhc2hPZmZzZXQ6dGhpcy5saW5lRGFzaE9mZnNldCxsaW5lSm9pbjp0aGlzLmxpbmVKb2luLGxpbmVXaWR0aDp0aGlzLmxpbmVXaWR0aCxtaXRlckxpbWl0OnRoaXMubWl0ZXJMaW1pdCxzaGFkb3dCbHVyOnRoaXMuc2hhZG93Qmx1cixzaGFkb3dDb2xvcjp0aGlzLnNoYWRvd0NvbG9yLHNoYWRvd09mZnNldFg6dGhpcy5zaGFkb3dPZmZzZXRYLHNoYWRvd09mZnNldFk6dGhpcy5zaGFkb3dPZmZzZXRZLHN0cm9rZVN0eWxlOnRoaXMuc3Ryb2tlU3R5bGUsdGV4dEFsaWduOnRoaXMudGV4dEFsaWdufSk7Zm9yKHZhciBhPVtdLGI9MDtiPHRoaXMucGF0aC5sZW5ndGg7YisrKXthLnB1c2godGhpcy5wYXRoW2JdKTt9dGhpcy5zdGFjay5wdXNoKGEpO3RoaXMuc3RhY2sucHVzaCh0aGlzLlNkLmNvcHkoKSk7fTt0LnNldFRyYW5zZm9ybT1mdW5jdGlvbihhLGIsYyxkLGUsZil7MT09PWEmJjA9PT1iJiYwPT09YyYmMT09PWQmJjA9PT1lJiYwPT09Znx8TWwodGhpcyxhLGIsYyxkLGUsZik7fTt0LnNjYWxlPWZ1bmN0aW9uKGEsYil7dGhpcy5TZC5zY2FsZShhLGIpO307dC50cmFuc2xhdGU9ZnVuY3Rpb24oYSxiKXt0aGlzLlNkLnRyYW5zbGF0ZShhLGIpO307dC50cmFuc2Zvcm09ZnVuY3Rpb24oKXt9O3Quc3Ryb2tlPWZ1bmN0aW9uKCl7dGhpcy5hZGRQYXRoKCJzdHJva2UiLHRoaXMucGF0aCx0aGlzLlNkKTt9O3QuV2k9ZnVuY3Rpb24oKXt0aGlzLmNsaXBJbnN0ZWFkT2ZGaWxsfHx0aGlzLnN0cm9rZSgpO307dC51Yj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMucmsudWIoYSxiLGMpO307dC5hZGRFbGVtZW50PWZ1bmN0aW9uKGEsYixjKXthPXRoaXMudWIoYSxiLGMpOzA8dGhpcy53Yy5sZW5ndGg/dGhpcy53Y1t0aGlzLndjLmxlbmd0aC0xXS5hcHBlbmRDaGlsZChhKTp0aGlzLnN2Zy5hcHBlbmRDaGlsZChhKTtyZXR1cm4gdGhpcy5hcT1hO307ZnVuY3Rpb24gTmwoYSxiLGMsZCxlKXsxIT09YS5nbG9iYWxBbHBoYSYmKGMub3BhY2l0eT1hLmdsb2JhbEFscGhhKTsiZmlsbCI9PT1iPyhhLmZpbGxTdHlsZSBpbnN0YW5jZW9mIEtsP2MuZmlsbD1PbChhLGEuZmlsbFN0eWxlKTooL15yZ2JhXCgvLnRlc3QoYS5maWxsU3R5bGUpJiYoYj0vXlxzKnJnYmFccypcKChbXixcc10rKVxzKixccyooW14sXHNdKylccyosXHMqKFteLFxzXSspXHMqLFxzKihbXixcc10rKVwpXHMqJC9pLmV4ZWMoYS5maWxsU3R5bGUpLGMuZmlsbD0icmdiKCIrYlsxXSsiLCIrYlsyXSsiLCIrYlszXSsiKSIsY1siZmlsbC1vcGFjaXR5Il09Yls0XSksYy5maWxsPWEuZmlsbFN0eWxlKSxjLnN0cm9rZT0ibm9uZSIpOiJzdHJva2UiPT09YiYmKGMuZmlsbD0ibm9uZSIsYS5zdHJva2VTdHlsZSBpbnN0YW5jZW9mIEtsP2Muc3Ryb2tlPU9sKGEsYS5zdHJva2VTdHlsZSk6KC9ecmdiYVwoLy50ZXN0KGEuc3Ryb2tlU3R5bGUpJiYoYj0vXlxzKnJnYmFccypcKChbXixcc10rKVxzKixccyooW14sXHNdKylccyosXHMqKFteLFxzXSspXHMqLFxzKihbXixcc10rKVwpXHMqJC9pLmV4ZWMoYS5zdHJva2VTdHlsZSksYy5zdHJva2U9InJnYigiK2JbMV0rIiwiK2JbMl0rIiwiK2JbM10rIikiLGNbInN0cm9rZS1vcGFjaXR5Il09Yls0XSksYy5zdHJva2U9YS5zdHJva2VTdHlsZSksY1sic3Ryb2tlLXdpZHRoIl09YS5saW5lV2lkdGgsY1sic3Ryb2tlLWxpbmVjYXAiXT1hLmxpbmVDYXAsY1sic3Ryb2tlLWxpbmVqb2luIl09YS5saW5lSm9pbixjWyJzdHJva2UtbWl0ZXJsaW1pdCJdPWEubWl0ZXJMaW1pdCk7YT1kLk9hO2E9Im1hdHJpeCgiK2FbMF0rIiwgIithWzFdKyIsICIrYVsyXSsiLCAiK2FbM10rIiwgIithWzRdKyIsICIrYVs1XSsiKSI7dm9pZCAwIT09ZSYmKGErPWUpO2MudHJhbnNmb3JtPWE7fWZ1bmN0aW9uIE9sKGEsYil7dmFyIGM9IkdSQUQiK0diKys7aWYoImxpbmVhciI9PT1iLnR5cGUpdmFyIGQ9YS51YigibGluZWFyR3JhZGllbnQiLHt4MTpiLngxLHgyOmIueDIseTE6Yi55MSx5MjpiLnkyLGlkOmMsZ3JhZGllbnRVbml0czoidXNlclNwYWNlT25Vc2UifSk7ZWxzZSBpZigicmFkaWFsIj09PWIudHlwZSlkPWEudWIoInJhZGlhbEdyYWRpZW50Iix7eDE6Yi54MSx4MjpiLngyLHkxOmIueTEseTI6Yi55MixyMTpiLnIxLHIyOmIucjIsaWQ6Y30pO2Vsc2UgdGhyb3cgRXJyb3IoImludmFsaWQgZ3JhZGllbnQiKTt2YXIgZT1iLll3O2I9ZS5sZW5ndGg7Zm9yKHZhciBmPVtdLGc9MDtnPGI7ZysrKXt2YXIgaD1lW2ddLGs9aC5jb2xvcjtoPXtvZmZzZXQ6aC5vZmZzZXQsInN0b3AtY29sb3IiOmt9Oy9ecmdiYVwoLy50ZXN0KGspJiYoaz0vXlxzKnJnYmFccypcKChbXixcc10rKVxzKixccyooW14sXHNdKylccyosXHMqKFteLFxzXSspXHMqLFxzKihbXixcc10rKVwpXHMqJC9pLmV4ZWMoayksaFsic3RvcC1jb2xvciJdPSJyZ2IoIitrWzFdKyIsIitrWzJdKyIsIitrWzNdKyIpIixoWyJzdG9wLW9wYWNpdHkiXT1rWzRdKTtmLnB1c2goaCk7fWYuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLm9mZnNldD5iLm9mZnNldD8xOi0xO30pO2ZvcihlPTA7ZTxiO2UrKyl7ZC5hcHBlbmRDaGlsZChhLnViKCJzdG9wIixmW2VdKSk7fWEuc3ZnLmFwcGVuZENoaWxkKGQpO3JldHVybiJ1cmwoIyIrYysiKSI7fXQuYWRkUGF0aD1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGIubGVuZ3RoO2UrKyl7dmFyIGY9R2EoYltlXSksZz1bZi5zaGlmdCgpXTtpZigiQSI9PT1nWzBdKWcucHVzaChmLnNoaWZ0KCkrIiwiK2Yuc2hpZnQoKSxmLnNoaWZ0KCksZi5zaGlmdCgpKyIsIitmLnNoaWZ0KCksZi5zaGlmdCgpKyIsIitmLnNoaWZ0KCkpO2Vsc2UgZm9yKDtmLmxlbmd0aDspe2cucHVzaChmLnNoaWZ0KCkrIiwiK2Yuc2hpZnQoKSk7fWQucHVzaChnLmpvaW4oIiAiKSk7fWI9e2Q6ZC5qb2luKCIgIil9OyJzdHJva2UiPT09YSYmdGhpcy5jdSYmKGJbInN0cm9rZS1kYXNoYXJyYXkiXT10aGlzLmdoLnRvU3RyaW5nKCksYlsic3Ryb2tlLWRhc2hvZmZzZXQiXT10aGlzLmhoKTtObCh0aGlzLGEsYixjKTsiY2xpcFBhdGgiPT09YT8oYT0iQ0xJUCIrR2IrKyxjPXRoaXMudWIoImNsaXBQYXRoIix7aWQ6YX0pLGMuYXBwZW5kQ2hpbGQodGhpcy51YigicGF0aCIsYikpLHRoaXMuc3ZnLmFwcGVuZENoaWxkKGMpLDA8dGhpcy53Yy5sZW5ndGgmJnRoaXMud2NbdGhpcy53Yy5sZW5ndGgtMV0uc2V0QXR0cmlidXRlTlMobnVsbCwiY2xpcC1wYXRoIiwidXJsKCMiK2ErIikiKSk6dGhpcy5hZGRFbGVtZW50KCJwYXRoIixiKTt9O2Z1bmN0aW9uIE1sKGEsYixjLGQsZSxmLGcpe3ZhciBoPW5ldyBKbCgpO2guT2E9W2IsYyxkLGUsZixnXTtiPXt9O05sKGEsImciLGIsaCk7aD1hLmFkZEVsZW1lbnQoImciLGIpO2Eud2MucHVzaChoKTt9dC5xcT1mdW5jdGlvbigpe2lmKDAhPT10aGlzLnNoYWRvd09mZnNldFh8fDAhPT10aGlzLnNoYWRvd09mZnNldFl8fDAhPT10aGlzLnNoYWRvd0JsdXIpe3ZhciBhPSJTSEFET1ciK0diKyssYj10aGlzLmFkZEVsZW1lbnQoImZpbHRlciIse2lkOmEseDoiLTEwMCUiLHk6Ii0xMDAlIix3aWR0aDoiMzAwJSIsaGVpZ2h0OiIzMDAlIn0sbnVsbCk7dmFyIGM9dGhpcy51YigiZmVHYXVzc2lhbkJsdXIiLHsiaW4iOiJTb3VyY2VBbHBoYSIscmVzdWx0OiJibHVyIixqQTp0aGlzLnNoYWRvd0JsdXIvMn0pO3ZhciBkPXRoaXMudWIoImZlRmxvb2QiLHsiaW4iOiJibHVyIixyZXN1bHQ6ImZsb29kIiwiZmxvb2QtY29sb3IiOnRoaXMuc2hhZG93Q29sb3J9KTt2YXIgZT10aGlzLnViKCJmZUNvbXBvc2l0ZSIseyJpbiI6ImZsb29kIixpbjI6ImJsdXIiLG9wZXJhdG9yOiJpbiIscmVzdWx0OiJjb21wIn0pO3ZhciBmPXRoaXMudWIoImZlT2Zmc2V0Iix7ImluIjoiY29tcCIscmVzdWx0OiJvZmZzZXRCbHVyIixkeDp0aGlzLnNoYWRvd09mZnNldFgsZHk6dGhpcy5zaGFkb3dPZmZzZXRZfSk7dmFyIGc9dGhpcy51YigiZmVNZXJnZSIse30pO2cuYXBwZW5kQ2hpbGQodGhpcy51YigiZmVNZXJnZU5vZGUiLHsiaW4iOiJvZmZzZXRCbHVyIn0pKTtnLmFwcGVuZENoaWxkKHRoaXMudWIoImZlTWVyZ2VOb2RlIix7ImluIjoiU291cmNlR3JhcGhpYyJ9KSk7Yi5hcHBlbmRDaGlsZChjKTtiLmFwcGVuZENoaWxkKGQpO2IuYXBwZW5kQ2hpbGQoZSk7Yi5hcHBlbmRDaGlsZChmKTtiLmFwcGVuZENoaWxkKGcpOzA8dGhpcy53Yy5sZW5ndGgmJnRoaXMud2NbdGhpcy53Yy5sZW5ndGgtMV0uc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsdGVyIiwidXJsKCMiK2ErIikiKTt9fTt0Lk52PWZ1bmN0aW9uKGEsYixjKXt0aGlzLm1wPWE7dGhpcy5ucD1iO3RoaXMuT2Q9Yzt9O2Z1bmN0aW9uIGpsKGEpe2Euc2hhZG93T2Zmc2V0WD0wO2Euc2hhZG93T2Zmc2V0WT0wO2Euc2hhZG93Qmx1cj0wO31mdW5jdGlvbiBpbChhKXthLnNoYWRvd09mZnNldFg9YS5tcDthLnNoYWRvd09mZnNldFk9YS5ucDthLnNoYWRvd0JsdXI9YS5PZDt9dC5Qcz1mdW5jdGlvbihhLGIpe3RoaXMuY3U9ITA7dGhpcy5naD1hO3RoaXMuaGg9Yjt9O3QuTnM9ZnVuY3Rpb24oKXt0aGlzLmN1PSExO307dC5SYz1mdW5jdGlvbigpe307dC5JeD1mdW5jdGlvbigpe307TGwucHJvdG90eXBlLnJvdGF0ZT1mdW5jdGlvbigpe307TGwucHJvdG90eXBlLmdldEltYWdlRGF0YT1mdW5jdGlvbigpe3JldHVybiBudWxsO307TGwucHJvdG90eXBlLm1lYXN1cmVUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw7fTtMbC5jbGFzc05hbWU9IlNWR0NvbnRleHQiO1AucHJvdG90eXBlLml0PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyB5aih0aGlzLHcuZG9jdW1lbnQpO3ZvaWQgMD09PWEmJihhPW5ldyB0YigpKTt2YXIgYz10aGlzO3JldHVybiBzayh0aGlzLGZ1bmN0aW9uKGEsZSl7YT10ayhjLGEsIlNWRyIsYik7YT1udWxsIT09YT9hLnN2ZzpudWxsO3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgZT8oZShhKSxudWxsKTphO30sYSk7fTtQLnByb3RvdHlwZS5tYWtlU3ZnPVAucHJvdG90eXBlLml0O1AucHJvdG90eXBlLm12PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLml0KGEpO307UC5wcm90b3R5cGUubWFrZVNWRz1QLnByb3RvdHlwZS5tdjtZLnByb3RvdHlwZS5neD1mdW5jdGlvbihhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIExsKSlyZXR1cm4hMTtpZighdGhpcy52aXNpYmxlKXJldHVybiEwO3ZhciBjPW51bGwsZD1hLmFxO2lmKHRoaXMgaW5zdGFuY2VvZiBYJiYodGhpcy50eXBlPT09WC5UYWJsZVJvd3x8dGhpcy50eXBlPT09WC5UYWJsZUNvbHVtbikpcmV0dXJuIGdsKHRoaXMsYSxiKSwhMDt2YXIgZT10aGlzLnZiO2lmKDA9PT1lLndpZHRofHwwPT09ZS5oZWlnaHR8fGlzTmFOKGUueCl8fGlzTmFOKGUueSkpcmV0dXJuITA7dmFyIGY9dGhpcy50cmFuc2Zvcm0sZz10aGlzLnBhbmVsOzAhPT0odGhpcy5IJjQwOTYpPT09ITAmJmhsKHRoaXMpO3ZhciBoPTAhPT0odGhpcy5IJjI1Niksaz0hMTt0aGlzIGluc3RhbmNlb2YgdmgmJihhLmZvbnQ9dGhpcy5mb250KTtpZihoKXtrPWcuWmQoKT9nLm5hdHVyYWxCb3VuZHM6Zy5hY3R1YWxCb3VuZHM7aWYobnVsbCE9PXRoaXMua2Qpe3ZhciBsPXRoaXMua2Q7dmFyIG09bC54O3ZhciBuPWwueTt2YXIgcD1sLndpZHRoO2w9bC5oZWlnaHQ7fWVsc2UgbT1NYXRoLm1heChlLngsay54KSxuPU1hdGgubWF4KGUueSxrLnkpLHA9TWF0aC5taW4oZS5yaWdodCxrLnJpZ2h0KS1tLGw9TWF0aC5taW4oZS5ib3R0b20say5ib3R0b20pLW47aWYobT5lLndpZHRoK2UueHx8ZS54Pmsud2lkdGgray54fHxuPmUuaGVpZ2h0K2UueXx8ZS55PmsuaGVpZ2h0K2sueSlyZXR1cm4hMDtrPSEwO01sKGEsMSwwLDAsMSwwLDApO2Euc2F2ZSgpO2EuYmVnaW5QYXRoKCk7YS5yZWN0KG0sbixwLGwpO2EuY2xpcCgpO31pZih0aGlzLnNnKCkmJiF0aGlzLmlzVmlzaWJsZSgpKXJldHVybiEwO2EuU2QuT2E9WzEsMCwwLDEsMCwwXTt0aGlzIGluc3RhbmNlb2YgdmgmJjE8dGhpcy5saW5lQ291bnQmJk1sKGEsMSwwLDAsMSwwLDApO209ITE7dGhpcy5zZygpJiZ0aGlzLmlzU2hhZG93ZWQmJmIuRGUoImRyYXdTaGFkb3dzIikmJihuPXRoaXMuc2ksYS5OdihuLngqYi5zY2FsZSpiLk5iLG4ueSpiLnNjYWxlKmIuTmIsdGhpcy5PZCksaWwoYSksYS5zaGFkb3dDb2xvcj10aGlzLklqKTtuPSExO3RoaXMucGFydCYmYi5EZSgiZHJhd1NoYWRvd3MiKSYmKG49dGhpcy5wYXJ0LmlzU2hhZG93ZWQpOyEwPT09dGhpcy5zaGFkb3dWaXNpYmxlPyhpbChhKSwhMT09PW0mJm4mJihNbChhLDEsMCwwLDEsMCwwKSxhLnFxKCksbT0hMCkpOiExPT09dGhpcy5zaGFkb3dWaXNpYmxlJiZqbChhKTtwPXRoaXMubmF0dXJhbEJvdW5kcztudWxsIT09dGhpcy5hcmVhQmFja2dyb3VuZCYmKGppKHRoaXMsYSx0aGlzLmFyZWFCYWNrZ3JvdW5kLCEwLCEwLHAsZSksITE9PT1tJiZuJiYoTWwoYSwxLDAsMCwxLDAsMCksYS5xcSgpLG09ITApLHRoaXMuYXJlYUJhY2tncm91bmQgaW5zdGFuY2VvZiBrbCYmdGhpcy5hcmVhQmFja2dyb3VuZC50eXBlPT09bGw/KGEuYmVnaW5QYXRoKCksYS5yZWN0KGUueCxlLnksZS53aWR0aCxlLmhlaWdodCksYS5UZCh0aGlzLmFyZWFCYWNrZ3JvdW5kKSk6YS5maWxsUmVjdChlLngsZS55LGUud2lkdGgsZS5oZWlnaHQpKTt0aGlzIGluc3RhbmNlb2YgWD9NbChhLGYubTExLGYubTEyLGYubTIxLGYubTIyLGYuZHgsZi5keSk6YS5TZC5PYT1bZi5tMTEsZi5tMTIsZi5tMjEsZi5tMjIsZi5keCxmLmR5XTtpZihudWxsIT09dGhpcy5iYWNrZ3JvdW5kKXshMT09PW0mJm4mJihNbChhLDEsMCwwLDEsMCwwKSxhLnFxKCksbT0hMCk7dmFyIHE9dGhpcy5uYXR1cmFsQm91bmRzO2w9Zj0wO3ZhciByPXEud2lkdGg7cT1xLmhlaWdodDt2YXIgdT0wO3RoaXMgaW5zdGFuY2VvZiBXJiYocT10aGlzLmdlb21ldHJ5LmJvdW5kcyxmPXEueCxsPXEueSxyPXEud2lkdGgscT1xLmhlaWdodCx1PXRoaXMuc3Ryb2tlV2lkdGgpO2ppKHRoaXMsYSx0aGlzLmJhY2tncm91bmQsITAsITEscCxlKTt0aGlzLmJhY2tncm91bmQgaW5zdGFuY2VvZiBrbCYmdGhpcy5iYWNrZ3JvdW5kLnR5cGU9PT1sbD8oYS5iZWdpblBhdGgoKSxhLnJlY3QoZi11LzIsbC11LzIscit1LHErdSksYS5UZCh0aGlzLmJhY2tncm91bmQpKTphLmZpbGxSZWN0KGYtdS8yLGwtdS8yLHIrdSxxK3UpO31uJiYobnVsbCE9PXRoaXMuYmFja2dyb3VuZHx8bnVsbCE9PXRoaXMuYXJlYUJhY2tncm91bmR8fG51bGwhPT1nJiYwIT09KGcuSCY1MTIpfHxudWxsIT09ZyYmKGcudHlwZT09PVguQXV0b3x8Zy50eXBlPT09WC5TcG90KSYmZy56YigpIT09dGhpcyk/KG1sKHRoaXMsITApLG51bGw9PT10aGlzLnNoYWRvd1Zpc2libGUmJmpsKGEpKTptbCh0aGlzLCExKTt0aGlzLkNpKGEsYik7biYmMCE9PSh0aGlzLkgmNTEyKT09PSEwJiZpbChhKTt0aGlzLnNnKCkmJm4mJmpsKGEpO2gmJihhLnJlc3RvcmUoKSxrJiZhLndjLnBvcCgpKTt0aGlzIGluc3RhbmNlb2YgWCYmKGM9YS53Yy5wb3AoKSk7ITA9PT1tJiZhLndjLnBvcCgpO3RoaXMgaW5zdGFuY2VvZiB2aCYmMTx0aGlzLmxpbmVDb3VudCYmKGM9YS53Yy5wb3AoKSk7bnVsbCE9PWEucmsuUXAmJihudWxsPT09YyYmKGQ9PT1hLmFxPyhNbChhLDEsMCwwLDEsMCwwKSxjPWEud2MucG9wKCkpOmM9YS5hcSksYS5yay5RcCh0aGlzLGMpKTt0aGlzLnN2Zz1jO3JldHVybiEwO307ZnVuY3Rpb24gdWsoYSxiKXt0aGlzLm93bmVyRG9jdW1lbnQ9Yj12b2lkIDA9PT1iP3cuZG9jdW1lbnQ6Yjt0aGlzLlFwPW51bGw7Yj1iLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2IudGFiSW5kZXg9MDt0aGlzLkdhPWI7dGhpcy5HYS5pbm5lckhUTUw9IlRoaXMgdGV4dCBpcyBkaXNwbGF5ZWQgaWYgeW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIENhbnZhcyBIVE1MIGVsZW1lbnQuIjt0aGlzLmNvbnRleHQ9bmV3IG9sKGIpO2IuQz1hO311ay5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLndpZHRoIT09YXx8dGhpcy5oZWlnaHQhPT1iPyh0aGlzLndpZHRoPWEsdGhpcy5oZWlnaHQ9Yix0aGlzLnN0eWxlLndpZHRoPWMrInB4Iix0aGlzLnN0eWxlLmhlaWdodD1kKyJweCIsITApOiExO307dWsucHJvdG90eXBlLnRvRGF0YVVSTD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkdhLnRvRGF0YVVSTChhLGIpO307dWsucHJvdG90eXBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLkdhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO307dWsucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5HYS5mb2N1cygpO307dWsucHJvdG90eXBlLmV4PWZ1bmN0aW9uKCl7dGhpcy5vd25lckRvY3VtZW50PXRoaXMuR2EuQz1udWxsO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModWsucHJvdG90eXBlLHt3aWR0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkdhLndpZHRoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkdhLndpZHRoPWE7fX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuR2EuaGVpZ2h0O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkdhLmhlaWdodD1hO319LHN0eWxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuR2Euc3R5bGU7fX19KTt1ay5jbGFzc05hbWU9IkNhbnZhc1N1cmZhY2UiO2Z1bmN0aW9uIG9sKGEpe2EuZ2V0Q29udGV4dCYmYS5nZXRDb250ZXh0KCIyZCIpfHxBKCJCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgSFRNTCBDYW52YXMgRWxlbWVudCIpO3RoaXMuVz1hLmdldENvbnRleHQoIjJkIik7dGhpcy5JdD10aGlzLkt0PXRoaXMuSnQ9IiI7dGhpcy5ZbT0hMTt0aGlzLk9kPXRoaXMubnA9dGhpcy5tcD0wO310PW9sLnByb3RvdHlwZTt0Lkl4PWZ1bmN0aW9uKGEpe3RoaXMuVy5pbWFnZVNtb290aGluZ0VuYWJsZWQ9YTt9O3QuYXJjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLlcuYXJjKGEsYixjLGQsZSxmKTt9O3QuYmVnaW5QYXRoPWZ1bmN0aW9uKCl7dGhpcy5XLmJlZ2luUGF0aCgpO307dC5iZXppZXJDdXJ2ZVRvPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLlcuYmV6aWVyQ3VydmVUbyhhLGIsYyxkLGUsZik7fTt0LmNsZWFyUmVjdD1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLlcuY2xlYXJSZWN0KGEsYixjLGQpO307dC5jbGlwPWZ1bmN0aW9uKCl7dGhpcy5XLmNsaXAoKTt9O3QuY2xvc2VQYXRoPWZ1bmN0aW9uKCl7dGhpcy5XLmNsb3NlUGF0aCgpO307dC5jcmVhdGVMaW5lYXJHcmFkaWVudD1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5XLmNyZWF0ZUxpbmVhckdyYWRpZW50KGEsYixjLGQpO307dC5jcmVhdGVQYXR0ZXJuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuVy5jcmVhdGVQYXR0ZXJuKGEsYik7fTt0LmNyZWF0ZVJhZGlhbEdyYWRpZW50PWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtyZXR1cm4gdGhpcy5XLmNyZWF0ZVJhZGlhbEdyYWRpZW50KGEsYixjLGQsZSxmKTt9O3QuZHJhd0ltYWdlPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxrKXt2b2lkIDA9PT1kP3RoaXMuVy5kcmF3SW1hZ2UoYSxiLGMpOnRoaXMuVy5kcmF3SW1hZ2UoYSxiLGMsZCxlLGYsZyxoLGspO307dC5maWxsPWZ1bmN0aW9uKCl7dGhpcy5XLmZpbGwoKTt9O3QuZmlsbFJlY3Q9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5XLmZpbGxSZWN0KGEsYixjLGQpO307dC5maWxsVGV4dD1mdW5jdGlvbihhLGIsYyl7dGhpcy5XLmZpbGxUZXh0KGEsYixjKTt9O3QuZ2V0SW1hZ2VEYXRhPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLlcuZ2V0SW1hZ2VEYXRhKGEsYixjLGQpO307dC5saW5lVG89ZnVuY3Rpb24oYSxiKXt0aGlzLlcubGluZVRvKGEsYik7fTt0Lm1lYXN1cmVUZXh0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlcubWVhc3VyZVRleHQoYSk7fTt0Lm1vdmVUbz1mdW5jdGlvbihhLGIpe3RoaXMuVy5tb3ZlVG8oYSxiKTt9O3QucXVhZHJhdGljQ3VydmVUbz1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLlcucXVhZHJhdGljQ3VydmVUbyhhLGIsYyxkKTt9O3QucmVjdD1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLlcucmVjdChhLGIsYyxkKTt9O3QucmVzdG9yZT1mdW5jdGlvbigpe3RoaXMuVy5yZXN0b3JlKCk7fTtvbC5wcm90b3R5cGUucm90YXRlPWZ1bmN0aW9uKGEpe3RoaXMuVy5yb3RhdGUoYSk7fTt0PW9sLnByb3RvdHlwZTt0LnNhdmU9ZnVuY3Rpb24oKXt0aGlzLlcuc2F2ZSgpO307dC5zZXRUcmFuc2Zvcm09ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuVy5zZXRUcmFuc2Zvcm0oYSxiLGMsZCxlLGYpO307dC5zY2FsZT1mdW5jdGlvbihhLGIpe3RoaXMuVy5zY2FsZShhLGIpO307dC5zdHJva2U9ZnVuY3Rpb24oKXt0aGlzLlcuc3Ryb2tlKCk7fTt0LnRyYW5zZm9ybT1mdW5jdGlvbihhLGIsYyxkLGUsZil7MT09PWEmJjA9PT1iJiYwPT09YyYmMT09PWQmJjA9PT1lJiYwPT09Znx8dGhpcy5XLnRyYW5zZm9ybShhLGIsYyxkLGUsZik7fTt0LnRyYW5zbGF0ZT1mdW5jdGlvbihhLGIpe3RoaXMuVy50cmFuc2xhdGUoYSxiKTt9O3QuVGQ9ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIGtsJiZhLnR5cGU9PT1sbCl7dmFyIGI9YS5HazthPWEuTHQ7YT5iPyh0aGlzLnNjYWxlKGIvYSwxKSx0aGlzLnRyYW5zbGF0ZSgoYS1iKS8yLDApKTpiPmEmJih0aGlzLnNjYWxlKDEsYS9iKSx0aGlzLnRyYW5zbGF0ZSgwLChiLWEpLzIpKTt0aGlzLlltP3RoaXMuY2xpcCgpOnRoaXMuZmlsbCgpO2E+Yj8odGhpcy50cmFuc2xhdGUoLShhLWIpLzIsMCksdGhpcy5zY2FsZSgxLyhiL2EpLDEpKTpiPmEmJih0aGlzLnRyYW5zbGF0ZSgwLC0oYi1hKS8yKSx0aGlzLnNjYWxlKDEsMS8oYS9iKSkpO31lbHNlIHRoaXMuWW0/dGhpcy5jbGlwKCk6dGhpcy5maWxsKCk7fTt0LldpPWZ1bmN0aW9uKCl7dGhpcy5ZbXx8dGhpcy5zdHJva2UoKTt9O3QuTnY9ZnVuY3Rpb24oYSxiLGMpe3RoaXMubXA9YTt0aGlzLm5wPWI7dGhpcy5PZD1jO307dC5Qcz1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuVzt2b2lkIDAhPT1jLnNldExpbmVEYXNoJiYoYy5zZXRMaW5lRGFzaChhKSxjLmxpbmVEYXNoT2Zmc2V0PWIpO307dC5Ocz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuVzt2b2lkIDAhPT1hLnNldExpbmVEYXNoJiYoYS5zZXRMaW5lRGFzaChQbCksYS5saW5lRGFzaE9mZnNldD0wKTt9O3QuUmM9ZnVuY3Rpb24oYSl7YSYmKHRoaXMuSnQ9IiIpO3RoaXMuSXQ9dGhpcy5LdD0iIjt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG9sLnByb3RvdHlwZSx7ZmlsbFN0eWxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVy5maWxsU3R5bGU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSXQhPT1hJiYodGhpcy5JdD10aGlzLlcuZmlsbFN0eWxlPWEpO319LGZvbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XLmZvbnQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSnQhPT1hJiYodGhpcy5KdD10aGlzLlcuZm9udD1hKTt9fSxnbG9iYWxBbHBoYTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlcuZ2xvYmFsQWxwaGE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVy5nbG9iYWxBbHBoYT1hO319LGxpbmVDYXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XLmxpbmVDYXA7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVy5saW5lQ2FwPWE7fX0sbGluZURhc2hPZmZzZXQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XLmxpbmVEYXNoT2Zmc2V0O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlcubGluZURhc2hPZmZzZXQ9YTt9fSxsaW5lSm9pbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlcubGluZUpvaW47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVy5saW5lSm9pbj1hO319LGxpbmVXaWR0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlcubGluZVdpZHRoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlcubGluZVdpZHRoPWE7fX0sbWl0ZXJMaW1pdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlcubWl0ZXJMaW1pdDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5XLm1pdGVyTGltaXQ9YTt9fSxzaGFkb3dCbHVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVy5zaGFkb3dCbHVyO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlcuc2hhZG93Qmx1cj1hO319LHNoYWRvd0NvbG9yOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVy5zaGFkb3dDb2xvcjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5XLnNoYWRvd0NvbG9yPWE7fX0sc2hhZG93T2Zmc2V0WDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlcuc2hhZG93T2Zmc2V0WDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5XLnNoYWRvd09mZnNldFg9YTt9fSxzaGFkb3dPZmZzZXRZOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVy5zaGFkb3dPZmZzZXRZO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlcuc2hhZG93T2Zmc2V0WT1hO319LHN0cm9rZVN0eWxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVy5zdHJva2VTdHlsZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LdCE9PWEmJih0aGlzLkt0PXRoaXMuVy5zdHJva2VTdHlsZT1hKTt9fSx0ZXh0QWxpZ246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XLnRleHRBbGlnbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5XLnRleHRBbGlnbj1hO319LGltYWdlU21vb3RoaW5nRW5hYmxlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlcuaW1hZ2VTbW9vdGhpbmdFbmFibGVkO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlcuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPWE7fX0sY2xpcEluc3RlYWRPZkZpbGw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ZbTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5ZbT1hO319fSk7dmFyIFBsPU9iamVjdC5mcmVlemUoW10pO29sLmNsYXNzTmFtZT0iQ2FudmFzU3VyZmFjZUNvbnRleHQiO2Z1bmN0aW9uIFFsKCl7dGhpcy5iYT10aGlzLnU9dGhpcy5LPXRoaXMubD0wO31RbC5jbGFzc05hbWU9IkNvbG9yTnVtYmVycyI7ZnVuY3Rpb24ga2woYSl7Umx8fChTbCgpLFJsPSEwKTttYih0aGlzKTt0aGlzLnY9ITE7dm9pZCAwPT09YT8odGhpcy52YT1ubCx0aGlzLkZrPSJibGFjayIpOiJzdHJpbmciPT09dHlwZW9mIGE/KHRoaXMudmE9bmwsdGhpcy5Gaz1hKToodGhpcy52YT1hLHRoaXMuRms9ImJsYWNrIik7YT10aGlzLnZhO2E9PT1xbD8odGhpcy5HbD1VYyx0aGlzLlRrPWdkKTp0aGlzLlRrPWE9PT1sbD90aGlzLkdsPWRkOnRoaXMuR2w9U2M7dGhpcy55cz0wO3RoaXMuZnI9TmFOO3RoaXMuY2U9dGhpcy5mcz10aGlzLmJlPW51bGw7dGhpcy5MdD10aGlzLkdrPTA7fWtsLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGtsKCk7YS52YT10aGlzLnZhO2EuRms9dGhpcy5GazthLkdsPXRoaXMuR2wuSSgpO2EuVGs9dGhpcy5Uay5JKCk7YS55cz10aGlzLnlzO2EuZnI9dGhpcy5mcjtudWxsIT09dGhpcy5iZSYmKGEuYmU9dGhpcy5iZS5jb3B5KCkpO2EuZnM9dGhpcy5mcztyZXR1cm4gYTt9O3Q9a2wucHJvdG90eXBlO3QuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy52PSEwO251bGwhPT10aGlzLmJlJiZ0aGlzLmJlLmZyZWV6ZSgpO3JldHVybiB0aGlzO307dC5oYT1mdW5jdGlvbigpe09iamVjdC5pc0Zyb3plbih0aGlzKSYmQSgiY2Fubm90IHRoYXcgY29uc3RhbnQ6ICIrdGhpcyk7dGhpcy52PSExO251bGwhPT10aGlzLmJlJiZ0aGlzLmJlLmhhKCk7cmV0dXJuIHRoaXM7fTt0LmZiPWZ1bmN0aW9uKGEpe2EuY2xhc3NUeXBlPT09a2wmJih0aGlzLnR5cGU9YSk7fTt0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9IkJydXNoKCI7aWYodGhpcy50eXBlPT09bmwpYSs9dGhpcy5jb2xvcjtlbHNlIGlmKGE9dGhpcy50eXBlPT09cWw/YSsiTGluZWFyICI6dGhpcy50eXBlPT09bGw/YSsiUmFkaWFsICI6dGhpcy50eXBlPT09cGw/YSsiUGF0dGVybiAiOmErIih1bmtub3duKSAiLGErPXRoaXMuc3RhcnQrIiAiK3RoaXMuZW5kLG51bGwhPT10aGlzLmNvbG9yU3RvcHMpZm9yKHZhciBiPXRoaXMuY29sb3JTdG9wcy5pdGVyYXRvcjtiLm5leHQoKTspe2ErPSIgIitiLmtleSsiOiIrYi52YWx1ZTt9cmV0dXJuIGErIikiO307dC5hZGRDb2xvclN0b3A9ZnVuY3Rpb24oYSxiKXt0aGlzLnYmJndhKHRoaXMpOygibnVtYmVyIiE9PXR5cGVvZiBhfHwhaXNGaW5pdGUoYSl8fDE8YXx8MD5hKSYmeGEoYSwiMCA8PSBsb2MgPD0gMSIsa2wsImFkZENvbG9yU3RvcDpsb2MiKTtudWxsPT09dGhpcy5iZSYmKHRoaXMuYmU9bmV3IExiKCkpO3RoaXMuYmUuYWRkKGEsYik7dGhpcy52YT09PW5sJiYodGhpcy50eXBlPXFsKTt0aGlzLmNlPW51bGw7cmV0dXJuIHRoaXM7fTt0Lnp6PWZ1bmN0aW9uKGEsYil7dGhpcy52JiZ3YSh0aGlzKTthPXZvaWQgMD09PWF8fCJudW1iZXIiIT09dHlwZW9mIGE/LjI6YTtiPXZvaWQgMD09PWI/VGw6YjtpZih0aGlzLnR5cGU9PT1ubClVbCh0aGlzLmNvbG9yKSx0aGlzLmNvbG9yPVZsKGEsYik7ZWxzZSBpZigodGhpcy50eXBlPT09cWx8fHRoaXMudHlwZT09PWxsKSYmbnVsbCE9PXRoaXMuY29sb3JTdG9wcylmb3IodmFyIGM9dGhpcy5jb2xvclN0b3BzLml0ZXJhdG9yO2MubmV4dCgpOyl7VWwoYy52YWx1ZSksdGhpcy5hZGRDb2xvclN0b3AoYy5rZXksVmwoYSxiKSk7fXJldHVybiB0aGlzO307ZnVuY3Rpb24gV2woYSxiLGMpe2I9dm9pZCAwPT09Ynx8Im51bWJlciIhPT10eXBlb2YgYj8uMjpiO2M9dm9pZCAwPT09Yz9UbDpjO1VsKGEpO3JldHVybiBWbChiLGMpO310Lnp5PWZ1bmN0aW9uKGEsYil7dGhpcy52JiZ3YSh0aGlzKTthPXZvaWQgMD09PWF8fCJudW1iZXIiIT09dHlwZW9mIGE/LjI6YTtiPXZvaWQgMD09PWI/VGw6YjtpZih0aGlzLnR5cGU9PT1ubClVbCh0aGlzLmNvbG9yKSx0aGlzLmNvbG9yPVZsKC1hLGIpO2Vsc2UgaWYoKHRoaXMudHlwZT09PXFsfHx0aGlzLnR5cGU9PT1sbCkmJm51bGwhPT10aGlzLmNvbG9yU3RvcHMpZm9yKHZhciBjPXRoaXMuY29sb3JTdG9wcy5pdGVyYXRvcjtjLm5leHQoKTspe1VsKGMudmFsdWUpLHRoaXMuYWRkQ29sb3JTdG9wKGMua2V5LFZsKC1hLGIpKTt9cmV0dXJuIHRoaXM7fTtmdW5jdGlvbiBYbChhLGIsYyl7Yj12b2lkIDA9PT1ifHwibnVtYmVyIiE9PXR5cGVvZiBiPy4yOmI7Yz12b2lkIDA9PT1jP1RsOmM7VWwoYSk7cmV0dXJuIFZsKC1iLGMpO31mdW5jdGlvbiBZbChhLGIsYyl7VWwoYSk7YT1abC5sO3ZhciBkPVpsLkssZT1abC51LGY9WmwuYmE7VWwoYik7dm9pZCAwPT09YyYmKGM9LjUpO3JldHVybiJyZ2JhKCIrTWF0aC5yb3VuZCgoWmwubC1hKSpjK2EpKyIsICIrTWF0aC5yb3VuZCgoWmwuSy1kKSpjK2QpKyIsICIrTWF0aC5yb3VuZCgoWmwudS1lKSpjK2UpKyIsICIrTWF0aC5yb3VuZCgoWmwuYmEtZikqYytmKSsiKSI7fXQucHg9ZnVuY3Rpb24oKXtpZih0aGlzLnR5cGU9PT1ubClyZXR1cm4gJGwodGhpcy5jb2xvcik7aWYoKHRoaXMudHlwZT09PXFsfHx0aGlzLnR5cGU9PT1sbCkmJm51bGwhPT10aGlzLmNvbG9yU3RvcHMpe3ZhciBhPXRoaXMuY29sb3JTdG9wcztpZih0aGlzLnR5cGU9PT1sbClyZXR1cm4gJGwoYS5maXJzdCgpLnZhbHVlKTtpZihudWxsIT09YS5nZXQoLjUpKXJldHVybiAkbChhLmdldCguNSkpO2lmKDI9PT1hLmNvdW50KXJldHVybiBhPWEuTmEoKSwkbChZbChhWzBdLnZhbHVlLGFbMV0udmFsdWUpKTtmb3IodmFyIGI9YS5pdGVyYXRvcixjPS0xLGQ9LTEsZT0xLGY9MTtiLm5leHQoKTspe3ZhciBnPWIua2V5LGg9TWF0aC5hYnMoLjUtYi5rZXkpO2U+ZiYmaDxlPyhjPWcsZT1oKTpmPj1lJiZoPGYmJihkPWcsZj1oKTt9Yz5kJiYoYz1bZCxkPWNdWzBdKTtiPWQtYztyZXR1cm4gJGwoWWwoYS5nZXQoYyksYS5nZXQoZCksMS1lL2IpKTt9cmV0dXJuITE7fTtmdW5jdGlvbiAkbChhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDtpZihhIGluc3RhbmNlb2Yga2wpcmV0dXJuIGEucHgoKTtVbChhKTtyZXR1cm4gMTI4PigyOTkqWmwubCs1ODcqWmwuSysxMTQqWmwudSkvMUUzO31mdW5jdGlvbiBWbChhLGIpe3N3aXRjaChiKXtjYXNlIFRsOnZhciBjPTEwMCphbShabC5sKTtiPTEwMCphbShabC5LKTt2YXIgZD0xMDAqYW0oWmwudSk7Ym0ubD0uNDEyNDU2NCpjKy4zNTc1NzYxKmIrLjE4MDQzNzUqZDtibS5LPS4yMTI2NzI5KmMrLjcxNTE1MjIqYisuMDcyMTc1KmQ7Ym0udT0uMDE5MzMzOSpjKy4xMTkxOTIqYisuOTUwMzA0MSpkO2JtLmJhPVpsLmJhO2M9Y20oYm0ubC9kbVswXSk7Yj1jbShibS5LL2RtWzFdKTtkPWNtKGJtLnUvZG1bMl0pO2VtLmw9MTE2KmItMTY7ZW0uSz01MDAqKGMtYik7ZW0udT0yMDAqKGItZCk7ZW0uYmE9Ym0uYmE7ZW0ubD1NYXRoLm1pbigxMDAsTWF0aC5tYXgoMCxlbS5sKzEwMCphKSk7YT0oZW0ubCsxNikvMTE2O2M9YS1lbS51LzIwMDtibS5sPWRtWzBdKmZtKGVtLksvNTAwK2EpO2JtLks9ZG1bMV0qKGVtLmw+Z20qaG0/TWF0aC5wb3coYSwzKTplbS5sL2dtKTtibS51PWRtWzJdKmZtKGMpO2JtLmJhPWVtLmJhO2E9LS45NjkyNjYqYm0ubCsxLjg3NjAxMDgqYm0uSysuMDQxNTU2KmJtLnU7Yz0uMDU1NjQzNCpibS5sKy0uMjA0MDI1OSpibS5LKzEuMDU3MjI1MipibS51O1psLmw9MjU1KmltKCgzLjI0MDQ1NDIqYm0ubCstMS41MzcxMzg1KmJtLksrLS40OTg1MzE0KmJtLnUpLzEwMCk7WmwuSz0yNTUqaW0oYS8xMDApO1psLnU9MjU1KmltKGMvMTAwKTtabC5iYT1ibS5iYTtabC5sPU1hdGgucm91bmQoWmwubCk7MjU1PFpsLmw/WmwubD0yNTU6MD5abC5sJiYoWmwubD0wKTtabC5LPU1hdGgucm91bmQoWmwuSyk7MjU1PFpsLks/WmwuSz0yNTU6MD5abC5LJiYoWmwuSz0wKTtabC51PU1hdGgucm91bmQoWmwudSk7MjU1PFpsLnU/WmwudT0yNTU6MD5abC51JiYoWmwudT0wKTtyZXR1cm4icmdiYSgiK1psLmwrIiwgIitabC5LKyIsICIrWmwudSsiLCAiK1psLmJhKyIpIjtjYXNlIGptOmI9WmwubC8yNTU7ZD1abC5LLzI1NTt2YXIgZT1abC51LzI1NSxmPU1hdGgubWF4KGIsZCxlKSxnPU1hdGgubWluKGIsZCxlKSxoPWYtZztnPShmK2cpLzI7aWYoMD09PWgpYz1iPTA7ZWxzZXtzd2l0Y2goZil7Y2FzZSBiOmM9KGQtZSkvaCU2O2JyZWFrO2Nhc2UgZDpjPShlLWIpL2grMjticmVhaztjYXNlIGU6Yz0oYi1kKS9oKzQ7fWMqPTYwOzA+YyYmKGMrPTM2MCk7Yj1oLygxLU1hdGguYWJzKDIqZy0xKSk7fWttLmw9TWF0aC5yb3VuZChjKTtrbS5LPU1hdGgucm91bmQoMTAwKmIpO2ttLnU9TWF0aC5yb3VuZCgxMDAqZyk7a20uYmE9WmwuYmE7a20udT1NYXRoLm1pbigxMDAsTWF0aC5tYXgoMCxrbS51KzEwMCphKSk7cmV0dXJuImhzbGEoIitrbS5sKyIsICIra20uSysiJSwgIitrbS51KyIlLCAiK2ttLmJhKyIpIjtkZWZhdWx0OnJldHVybiBBKCJVbmtub3duIGNvbG9yIHNwYWNlOiAiK2IpLCJyZ2JhKDAsIDAsIDAsIDEpIjt9fWZ1bmN0aW9uIFVsKGEpe1JsfHwoU2woKSxSbD0hMCk7dmFyIGI9bG07aWYobnVsbCE9PWIpe2IuY2xlYXJSZWN0KDAsMCwxLDEpO2IuZmlsbFN0eWxlPSIjMDAwMDAwIjt2YXIgYz1iLmZpbGxTdHlsZTtiLmZpbGxTdHlsZT1hO2IuZmlsbFN0eWxlIT09Yz8oYi5maWxsUmVjdCgwLDAsMSwxKSxhPWIuZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGEsWmwubD1hWzBdLFpsLks9YVsxXSxabC51PWFbMl0sWmwuYmE9YVszXS8yNTUpOihiLmZpbGxTdHlsZT0iI0ZGRkZGRiIsYi5maWxsU3R5bGU9YSxabC5sPTAsWmwuSz0wLFpsLnU9MCxabC5iYT0xKTt9fWZ1bmN0aW9uIGFtKGEpe2EvPTI1NTtyZXR1cm4gLjA0MDQ1Pj1hP2EvMTIuOTI6TWF0aC5wb3coKGErLjA1NSkvMS4wNTUsMi40KTt9ZnVuY3Rpb24gaW0oYSl7cmV0dXJuIC4wMDMxMzA4Pj1hPzEyLjkyKmE6MS4wNTUqTWF0aC5wb3coYSwxLzIuNCktLjA1NTt9ZnVuY3Rpb24gY20oYSl7cmV0dXJuIGE+aG0/TWF0aC5wb3coYSwxLzMpOihnbSphKzE2KS8xMTY7fWZ1bmN0aW9uIGZtKGEpe3ZhciBiPWEqYSphO3JldHVybiBiPmhtP2I6KDExNiphLTE2KS9nbTt9ZnVuY3Rpb24gU2woKXtsbT10aD9uZXcgdWsobnVsbCkuY29udGV4dDpudWxsO31wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhrbC5wcm90b3R5cGUse3R5cGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy52YTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMudmE9YTt0aGlzLnN0YXJ0LmpjKCkmJihhPT09cWw/dGhpcy5zdGFydD1VYzphPT09bGwmJih0aGlzLnN0YXJ0PWRkKSk7dGhpcy5lbmQuamMoKSYmKGE9PT1xbD90aGlzLmVuZD1nZDphPT09bGwmJih0aGlzLmVuZD1kZCkpO3RoaXMuY2U9bnVsbDt9fSxjb2xvcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkZrO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnYmJndhKHRoaXMsYSk7dGhpcy5Gaz1hO3RoaXMuY2U9bnVsbDt9fSxzdGFydDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkdsO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnYmJndhKHRoaXMsYSk7dGhpcy5HbD1hLkkoKTt0aGlzLmNlPW51bGw7fX0sZW5kOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVGs7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLlRrPWEuSSgpO3RoaXMuY2U9bnVsbDt9fSxzdGFydFJhZGl1czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnlzO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnYmJndhKHRoaXMsYSk7MD5hJiZ4YShhLCI+PSB6ZXJvIixrbCwic3RhcnRSYWRpdXMiKTt0aGlzLnlzPWE7dGhpcy5jZT1udWxsO319LGVuZFJhZGl1czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmZyO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnYmJndhKHRoaXMsYSk7MD5hJiZ4YShhLCI+PSB6ZXJvIixrbCwiZW5kUmFkaXVzIik7dGhpcy5mcj1hO3RoaXMuY2U9bnVsbDt9fSxjb2xvclN0b3BzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYmU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyxhKTt0aGlzLmJlPWE7dGhpcy5jZT1udWxsO319LHBhdHRlcm46e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5mczt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzLGEpO3RoaXMuZnM9YTt0aGlzLmNlPW51bGw7fX19KTtrbC5wcm90b3R5cGUuaXNEYXJrPWtsLnByb3RvdHlwZS5weDtrbC5wcm90b3R5cGUuZGFya2VuQnk9a2wucHJvdG90eXBlLnp5O2tsLnByb3RvdHlwZS5saWdodGVuQnk9a2wucHJvdG90eXBlLnp6O2tsLnByb3RvdHlwZS5hZGRDb2xvclN0b3A9a2wucHJvdG90eXBlLmFkZENvbG9yU3RvcDt2YXIgaG09MjE2LzI0Mzg5LGdtPTI0Mzg5LzI3LGRtPVs5NS4wNDcsMTAwLDEwOC44ODNdLGxtPW51bGwsWmw9bmV3IFFsKCksa209bmV3IFFsKCksYm09bmV3IFFsKCksZW09bmV3IFFsKCksUmw9ITE7a2wuY2xhc3NOYW1lPSJCcnVzaCI7dmFyIG5sO2tsLlNvbGlkPW5sPW5ldyBEKGtsLCJTb2xpZCIsMCk7dmFyIHFsO2tsLkxpbmVhcj1xbD1uZXcgRChrbCwiTGluZWFyIiwxKTt2YXIgbGw7a2wuUmFkaWFsPWxsPW5ldyBEKGtsLCJSYWRpYWwiLDIpO3ZhciBwbDtrbC5QYXR0ZXJuPXBsPW5ldyBEKGtsLCJQYXR0ZXJuIiw0KTt2YXIgVGw7a2wuTGFiPVRsPW5ldyBEKGtsLCJMYWIiLDUpO3ZhciBqbTtrbC5IU0w9am09bmV3IEQoa2wsIkhTTCIsNik7a2wucmFuZG9tQ29sb3I9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1hJiYoYT0xMjgpO3ZvaWQgMD09PWImJihiPU1hdGgubWF4KGEsMjU1KSk7dmFyIGM9TWF0aC5hYnMoYi1hKTtiPU1hdGguZmxvb3IoYStNYXRoLnJhbmRvbSgpKmMpLnRvU3RyaW5nKDE2KTt2YXIgZD1NYXRoLmZsb29yKGErTWF0aC5yYW5kb20oKSpjKS50b1N0cmluZygxNik7YT1NYXRoLmZsb29yKGErTWF0aC5yYW5kb20oKSpjKS50b1N0cmluZygxNik7Mj5iLmxlbmd0aCYmKGI9IjAiK2IpOzI+ZC5sZW5ndGgmJihkPSIwIitkKTsyPmEubGVuZ3RoJiYoYT0iMCIrYSk7cmV0dXJuIiMiK2IrZCthO307a2wuaXNWYWxpZENvbG9yPWZ1bmN0aW9uKGEpe2lmKCJibGFjayI9PT1hKXJldHVybiEwO2lmKCIiPT09YSlyZXR1cm4hMTtSbHx8KFNsKCksUmw9ITApO3ZhciBiPWxtO2lmKG51bGw9PT1iKXJldHVybiEwO2IuZmlsbFN0eWxlPSIjMDAwMDAwIjt2YXIgYz1iLmZpbGxTdHlsZTtiLmZpbGxTdHlsZT1hO2lmKGIuZmlsbFN0eWxlIT09YylyZXR1cm4hMDtiLmZpbGxTdHlsZT0iI0ZGRkZGRiI7Yz1iLmZpbGxTdHlsZTtiLmZpbGxTdHlsZT1hO3JldHVybiBiLmZpbGxTdHlsZSE9PWM7fTtrbC5saWdodGVuPWZ1bmN0aW9uKGEpe3JldHVybiBXbChhKTt9O2tsLmxpZ2h0ZW5CeT1XbDtrbC5kYXJrZW49ZnVuY3Rpb24oYSl7cmV0dXJuIFhsKGEpO307a2wuZGFya2VuQnk9WGw7a2wubWl4PVlsO2tsLmlzRGFyaz0kbDtmdW5jdGlvbiBFbCgpe3RoaXMubmFtZT0iQmFzZSI7fUVsLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKCl7fTtFbC5wcm90b3R5cGUuQ3o9ZnVuY3Rpb24oYSxiLGMsZCxlKXthLm1lYXN1cmUoYixjLGQsZSk7fTtFbC5wcm90b3R5cGUuYXJyYW5nZT1mdW5jdGlvbigpe307RWwucHJvdG90eXBlLm95PWZ1bmN0aW9uKGEsYixjLGQsZSxmKXthLmFycmFuZ2UoYixjLGQsZSxmKTt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEVsLnByb3RvdHlwZSx7Y2xhc3NUeXBlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIFg7fX19KTtFbC5wcm90b3R5cGUuYXJyYW5nZUVsZW1lbnQ9RWwucHJvdG90eXBlLm95O0VsLnByb3RvdHlwZS5tZWFzdXJlRWxlbWVudD1FbC5wcm90b3R5cGUuQ3o7RWwuY2xhc3NOYW1lPSJQYW5lbExheW91dCI7ZnVuY3Rpb24gbW0oKXt0aGlzLm5hbWU9IkJhc2UiO3RoaXMubmFtZT0iUG9zaXRpb24iO31vYShtbSxFbCk7bW0ucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9ZC5sZW5ndGg7YT1ubShhKTtmb3IodmFyIGs9MDtrPGg7aysrKXt2YXIgbD1kW2tdO2lmKGwudmlzaWJsZXx8bD09PWEpe3ZhciBtPWwubWFyZ2luLG49bS5yaWdodCttLmxlZnQ7bT1tLnRvcCttLmJvdHRvbTtsLm1lYXN1cmUoYixjLGYsZyk7dmFyIHA9bC5tZWFzdXJlZEJvdW5kcztuPU1hdGgubWF4KHAud2lkdGgrbiwwKTttPU1hdGgubWF4KHAuaGVpZ2h0K20sMCk7cD1sLnBvc2l0aW9uLng7dmFyIHE9bC5wb3NpdGlvbi55O2lzRmluaXRlKHApfHwocD0wKTtpc0Zpbml0ZShxKXx8KHE9MCk7bCBpbnN0YW5jZW9mIFcmJmwuaXNHZW9tZXRyeVBvc2l0aW9uZWQmJihsPWwuc3Ryb2tlV2lkdGgvMixwLT1sLHEtPWwpO0JjKGUscCxxLG4sbSk7fX19O21tLnByb3RvdHlwZS5hcnJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iLmxlbmd0aCxlPWEucGFkZGluZzthPWMueC1lLmxlZnQ7Yz1jLnktZS50b3A7Zm9yKGU9MDtlPGQ7ZSsrKXt2YXIgZj1iW2VdLGc9Zi5tZWFzdXJlZEJvdW5kcyxoPWYubWFyZ2luLGs9Zi5wb3NpdGlvbi54LGw9Zi5wb3NpdGlvbi55O2s9aXNOYU4oayk/LWE6ay1hO2w9aXNOYU4obCk/LWM6bC1jO2lmKGYgaW5zdGFuY2VvZiBXJiZmLmlzR2VvbWV0cnlQb3NpdGlvbmVkKXt2YXIgbT1mLnN0cm9rZVdpZHRoLzI7ay09bTtsLT1tO31mLnZpc2libGUmJmYuYXJyYW5nZShrK2gubGVmdCxsK2gudG9wLGcud2lkdGgsZy5oZWlnaHQpO319O2Z1bmN0aW9uIG9tKCl7dGhpcy5uYW1lPSJCYXNlIjt0aGlzLm5hbWU9Ikhvcml6b250YWwiO31vYShvbSxFbCk7b20ucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9ZC5sZW5ndGg7Yj1LYSgpO2Y9bm0oYSk7Zm9yKHZhciBrPTA7azxoO2srKyl7dmFyIGw9ZFtrXTtpZihsLnZpc2libGV8fGw9PT1mKXt2YXIgbT1ibChsLCExKTtpZihtIT09WmcmJm0hPT1NayliLnB1c2gobCk7ZWxzZXtsLm1lYXN1cmUoSW5maW5pdHksYywwLGcpO209bC5tYXJnaW47bD1sLm1lYXN1cmVkQm91bmRzO3ZhciBuPU1hdGgubWF4KGwuaGVpZ2h0K20udG9wK20uYm90dG9tLDApO2Uud2lkdGgrPU1hdGgubWF4KGwud2lkdGgrbS5yaWdodCttLmxlZnQsMCk7ZS5oZWlnaHQ9TWF0aC5tYXgoZS5oZWlnaHQsbik7fX19ZD1iLmxlbmd0aDthLmRlc2lyZWRTaXplLmhlaWdodD9jPU1hdGgubWluKGEuZGVzaXJlZFNpemUuaGVpZ2h0LGEubWF4U2l6ZS5oZWlnaHQpOjAhPT1lLmhlaWdodCYmKGM9TWF0aC5taW4oZS5oZWlnaHQsYS5tYXhTaXplLmhlaWdodCkpO2ZvcihhPTA7YTxkO2ErKyl7aWYoaz1iW2FdLGsudmlzaWJsZXx8az09PWYpbT1rLm1hcmdpbixoPW0ucmlnaHQrbS5sZWZ0LG09bS50b3ArbS5ib3R0b20say5tZWFzdXJlKEluZmluaXR5LGMsMCxnKSxrPWsubWVhc3VyZWRCb3VuZHMsbT1NYXRoLm1heChrLmhlaWdodCttLDApLGUud2lkdGgrPU1hdGgubWF4KGsud2lkdGgraCwwKSxlLmhlaWdodD1NYXRoLm1heChlLmhlaWdodCxtKTt9T2EoYik7fTtvbS5wcm90b3R5cGUuYXJyYW5nZT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWIubGVuZ3RoLGU9YS5wYWRkaW5nLGY9ZS50b3AsZz1hLmlzT3Bwb3NpdGUsaD1nP2Mud2lkdGg6ZS5sZWZ0LGs9MDtrPGQ7aysrKXt2YXIgbD1mLG09YltrXTtpZihtLnZpc2libGUpe3ZhciBuPW0ubWVhc3VyZWRCb3VuZHMscD1tLm1hcmdpbixxPXAudG9wK3AuYm90dG9tLHI9ZitlLmJvdHRvbSx1PW4uaGVpZ2h0LHg9YmwobSwhMSk7aWYoaXNOYU4obS5kZXNpcmVkU2l6ZS5oZWlnaHQpJiZ4PT09YmV8fHg9PT1Oayl1PU1hdGgubWF4KGMuaGVpZ2h0LXEtciwwKTtxPXUrcStyO3I9bS5hbGlnbm1lbnQ7ci5LYigpJiYocj1hLmRlZmF1bHRBbGlnbm1lbnQpO3IuZ2IoKXx8KHI9ZGQpO2cmJihoLT1uLndpZHRoK3AubGVmdCtwLnJpZ2h0KTttLmFycmFuZ2UoaCtyLm9mZnNldFgrcC5sZWZ0LGwrci5vZmZzZXRZK3AudG9wKyhjLmhlaWdodCpyLnktcSpyLnkpLG4ud2lkdGgsdSk7Z3x8KGgrPW4ud2lkdGgrcC5sZWZ0K3AucmlnaHQpO319fTtmdW5jdGlvbiBwbSgpe3RoaXMubmFtZT0iQmFzZSI7dGhpcy5uYW1lPSJWZXJ0aWNhbCI7fW9hKHBtLEVsKTtwbS5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9ZC5sZW5ndGg7Yz1LYSgpO2Zvcih2YXIgaD1ubShhKSxrPTA7azxnO2srKyl7dmFyIGw9ZFtrXTtpZihsLnZpc2libGV8fGw9PT1oKXt2YXIgbT1ibChsLCExKTtpZihtIT09WmcmJm0hPT1OayljLnB1c2gobCk7ZWxzZXt2YXIgbj1sLm1hcmdpbjttPW4ucmlnaHQrbi5sZWZ0O249bi50b3Arbi5ib3R0b207bC5tZWFzdXJlKGIsSW5maW5pdHksZiwwKTtsPWwubWVhc3VyZWRCb3VuZHM7c2MoZSxNYXRoLm1heChlLndpZHRoLE1hdGgubWF4KGwud2lkdGgrbSwwKSksZS5oZWlnaHQrTWF0aC5tYXgobC5oZWlnaHQrbiwwKSk7fX19ZD1jLmxlbmd0aDtpZigwIT09ZCl7YS5kZXNpcmVkU2l6ZS53aWR0aD9iPU1hdGgubWluKGEuZGVzaXJlZFNpemUud2lkdGgsYS5tYXhTaXplLndpZHRoKTowIT09ZS53aWR0aCYmKGI9TWF0aC5taW4oZS53aWR0aCxhLm1heFNpemUud2lkdGgpKTtmb3IoYT0wO2E8ZDthKyspe2lmKGs9Y1thXSxrLnZpc2libGV8fGs9PT1oKWw9ay5tYXJnaW4sZz1sLnJpZ2h0K2wubGVmdCxsPWwudG9wK2wuYm90dG9tLGsubWVhc3VyZShiLEluZmluaXR5LGYsMCksaz1rLm1lYXN1cmVkQm91bmRzLGw9TWF0aC5tYXgoay5oZWlnaHQrbCwwKSxlLndpZHRoPU1hdGgubWF4KGUud2lkdGgsTWF0aC5tYXgoay53aWR0aCtnLDApKSxlLmhlaWdodCs9bDt9T2EoYyk7fX07cG0ucHJvdG90eXBlLmFycmFuZ2U9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1iLmxlbmd0aCxlPWEucGFkZGluZyxmPWUubGVmdCxnPWEuaXNPcHBvc2l0ZSxoPWc/Yy5oZWlnaHQ6ZS50b3Asaz0wO2s8ZDtrKyspe3ZhciBsPWYsbT1iW2tdO2lmKG0udmlzaWJsZSl7dmFyIG49bS5tZWFzdXJlZEJvdW5kcyxwPW0ubWFyZ2luLHE9cC5sZWZ0K3AucmlnaHQscj1mK2UucmlnaHQsdT1uLndpZHRoLHg9YmwobSwhMSk7aWYoaXNOYU4obS5kZXNpcmVkU2l6ZS53aWR0aCkmJng9PT1iZXx8eD09PU1rKXU9TWF0aC5tYXgoYy53aWR0aC1xLXIsMCk7cT11K3ErcjtyPW0uYWxpZ25tZW50O3IuS2IoKSYmKHI9YS5kZWZhdWx0QWxpZ25tZW50KTtyLmdiKCl8fChyPWRkKTtnJiYoaC09bi5oZWlnaHQrcC5ib3R0b20rcC50b3ApO20uYXJyYW5nZShsK3Iub2Zmc2V0WCtwLmxlZnQrKGMud2lkdGgqci54LXEqci54KSxoK3Iub2Zmc2V0WStwLnRvcCx1LG4uaGVpZ2h0KTtnfHwoaCs9bi5oZWlnaHQrcC5ib3R0b20rcC50b3ApO319fTtmdW5jdGlvbiBxbSgpe3RoaXMubmFtZT0iQmFzZSI7dGhpcy5uYW1lPSJTcG90Ijt9b2EocW0sRWwpO3FtLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPWQubGVuZ3RoLGs9YS56YigpLGw9ay5tYXJnaW4sbT1sLnJpZ2h0K2wubGVmdCxuPWwudG9wK2wuYm90dG9tO2subWVhc3VyZShiLGMsZixnKTt2YXIgcD1rLm1lYXN1cmVkQm91bmRzO2Y9cC53aWR0aDtnPXAuaGVpZ2h0O3ZhciBxPU1hdGgubWF4KGYrbSwwKTt2YXIgcj1NYXRoLm1heChnK24sMCk7Zm9yKHZhciB1PWEuaXNDbGlwcGluZyx4PU4uYWxsb2NBdCgtbC5sZWZ0LC1sLnRvcCxxLHIpLHY9ITAseT1ubShhKSx6PTA7ejxoO3orKyl7dmFyIEI9ZFt6XTtpZihCIT09ayYmKEIudmlzaWJsZXx8Qj09PXkpKXtsPUIubWFyZ2luO3E9bC5yaWdodCtsLmxlZnQ7cj1sLnRvcCtsLmJvdHRvbTtwPWJsKEIsITEpO3N3aXRjaChwKXtjYXNlIGJlOmI9ZjtjPWc7YnJlYWs7Y2FzZSBNazpiPWY7YnJlYWs7Y2FzZSBOazpjPWc7fUIubWVhc3VyZShiLGMsMCwwKTtwPUIubWVhc3VyZWRCb3VuZHM7cT1NYXRoLm1heChwLndpZHRoK3EsMCk7cj1NYXRoLm1heChwLmhlaWdodCtyLDApO3ZhciBDPUIuYWxpZ25tZW50O0MuS2IoKSYmKEM9YS5kZWZhdWx0QWxpZ25tZW50KTtDLmdiKCl8fChDPWRkKTt2YXIgST1CLmFsaWdubWVudEZvY3VzO0kuS2IoKSYmKEk9ZGQpO3ZhciBKPW51bGw7QiBpbnN0YW5jZW9mIFgmJiIiIT09Qi55ZyYmKEIuYXJyYW5nZSgwLDAscC53aWR0aCxwLmhlaWdodCksSj1CLiRhKEIueWcpLEo9PT1CJiYoSj1udWxsKSk7aWYobnVsbCE9PUope2w9Si5uYXR1cmFsQm91bmRzO3A9Si5tYXJnaW47Zm9yKGw9Ry5hbGxvY0F0KEkueCpsLndpZHRoLUkub2Zmc2V0WC1wLmxlZnQsSS55KmwuaGVpZ2h0LUkub2Zmc2V0WS1wLnRvcCk7SiE9PUI7KXtKLnRyYW5zZm9ybS50YShsKSxKPUoucGFuZWw7fUI9Qy54KmYrQy5vZmZzZXRYLWwueDtwPUMueSpnK0Mub2Zmc2V0WS1sLnk7Ry5mcmVlKGwpO31lbHNlIEI9Qy54KmYrQy5vZmZzZXRYLShJLngqcC53aWR0aCtJLm9mZnNldFgpLWwubGVmdCxwPUMueSpnK0Mub2Zmc2V0WS0oSS55KnAuaGVpZ2h0K0kub2Zmc2V0WSktbC50b3A7dj8odj0hMSxlLmgoQixwLHEscikpOkJjKGUsQixwLHEscik7fX12P2UuYXNzaWduKHgpOnU/ZS5ndih4LngseC55LHgud2lkdGgseC5oZWlnaHQpOkJjKGUseC54LHgueSx4LndpZHRoLHguaGVpZ2h0KTtOLmZyZWUoeCk7cD1rLnN0cmV0Y2g7cD09PUxrJiYocD1ibChrLCExKSk7c3dpdGNoKHApe2Nhc2UgWmc6cmV0dXJuO2Nhc2UgYmU6aWYoIWlzRmluaXRlKGIpJiYhaXNGaW5pdGUoYykpcmV0dXJuO2JyZWFrO2Nhc2UgTWs6aWYoIWlzRmluaXRlKGIpKXJldHVybjticmVhaztjYXNlIE5rOmlmKCFpc0Zpbml0ZShjKSlyZXR1cm47fXA9ay5tZWFzdXJlZEJvdW5kcztmPXAud2lkdGg7Zz1wLmhlaWdodDtxPU1hdGgubWF4KGYrbSwwKTtyPU1hdGgubWF4KGcrbiwwKTtsPWsubWFyZ2luO3g9Ti5hbGxvY0F0KC1sLmxlZnQsLWwudG9wLHEscik7Zm9yKGI9MDtiPGg7YisrKXtjPWRbYl0sYz09PWt8fCFjLnZpc2libGUmJmMhPT15fHwobD1jLm1hcmdpbixxPWwucmlnaHQrbC5sZWZ0LHI9bC50b3ArbC5ib3R0b20scD1jLm1lYXN1cmVkQm91bmRzLHE9TWF0aC5tYXgocC53aWR0aCtxLDApLHI9TWF0aC5tYXgocC5oZWlnaHQrciwwKSxtPWMuYWxpZ25tZW50LG0uS2IoKSYmKG09YS5kZWZhdWx0QWxpZ25tZW50KSxtLmdiKCl8fChtPWRkKSxjPWMuYWxpZ25tZW50Rm9jdXMsYy5LYigpJiYoYz1kZCksdj8odj0hMSxlLmgobS54KmYrbS5vZmZzZXRYLShjLngqcC53aWR0aCtjLm9mZnNldFgpLWwubGVmdCxtLnkqZyttLm9mZnNldFktKGMueSpwLmhlaWdodCtjLm9mZnNldFkpLWwudG9wLHEscikpOkJjKGUsbS54KmYrbS5vZmZzZXRYLShjLngqcC53aWR0aCtjLm9mZnNldFgpLWwubGVmdCxtLnkqZyttLm9mZnNldFktKGMueSpwLmhlaWdodCtjLm9mZnNldFkpLWwudG9wLHEscikpO312P2UuYXNzaWduKHgpOnU/ZS5ndih4LngseC55LHgud2lkdGgseC5oZWlnaHQpOkJjKGUseC54LHgueSx4LndpZHRoLHguaGVpZ2h0KTtOLmZyZWUoeCk7fTtxbS5wcm90b3R5cGUuYXJyYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9Yi5sZW5ndGgsZT1hLnpiKCksZj1lLm1lYXN1cmVkQm91bmRzLGc9Zi53aWR0aDtmPWYuaGVpZ2h0O3ZhciBoPWEucGFkZGluZyxrPWgubGVmdDtoPWgudG9wO3ZhciBsPWstYy54LG09aC1jLnk7ZS5hcnJhbmdlKGwsbSxnLGYpO2Zvcih2YXIgbj0wO248ZDtuKyspe3ZhciBwPWJbbl07aWYocCE9PWUpe3ZhciBxPXAubWVhc3VyZWRCb3VuZHMscj1xLndpZHRoO3E9cS5oZWlnaHQ7bT1wLmFsaWdubWVudDttLktiKCkmJihtPWEuZGVmYXVsdEFsaWdubWVudCk7bS5nYigpfHwobT1kZCk7dmFyIHU9cC5hbGlnbm1lbnRGb2N1czt1LktiKCkmJih1PWRkKTtsPW51bGw7cCBpbnN0YW5jZW9mIFgmJiIiIT09cC55ZyYmKGw9cC4kYShwLnlnKSxsPT09cCYmKGw9bnVsbCkpO2lmKG51bGwhPT1sKXt2YXIgeD1sLm5hdHVyYWxCb3VuZHM7Zm9yKHU9Ry5hbGxvY0F0KHUueCp4LndpZHRoLXUub2Zmc2V0WCx1LnkqeC5oZWlnaHQtdS5vZmZzZXRZKTtsIT09cDspe2wudHJhbnNmb3JtLnRhKHUpLGw9bC5wYW5lbDt9bD1tLngqZyttLm9mZnNldFgtdS54O209bS55KmYrbS5vZmZzZXRZLXUueTtHLmZyZWUodSk7fWVsc2UgbD1tLngqZyttLm9mZnNldFgtKHUueCpyK3Uub2Zmc2V0WCksbT1tLnkqZittLm9mZnNldFktKHUueSpxK3Uub2Zmc2V0WSk7bC09Yy54O20tPWMueTtwLnZpc2libGUmJnAuYXJyYW5nZShrK2wsaCttLHIscSk7fX19O2Z1bmN0aW9uIHJtKCl7dGhpcy5uYW1lPSJCYXNlIjt0aGlzLm5hbWU9IkF1dG8iO31vYShybSxFbCk7cm0ucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9ZC5sZW5ndGgsaz1hLnpiKCksbD1rLm1hcmdpbixtPWIsbj1jLHA9bC5yaWdodCtsLmxlZnQscT1sLnRvcCtsLmJvdHRvbTtrLm1lYXN1cmUoYixjLGYsZyk7bD1rLm1lYXN1cmVkQm91bmRzO3ZhciByPTAsdT1udWxsO2sgaW5zdGFuY2VvZiBXJiYodT1rLHI9dS5zdHJva2VXaWR0aCp1LnNjYWxlKTt2YXIgeD1NYXRoLm1heChsLndpZHRoK3AsMCk7bD1NYXRoLm1heChsLmhlaWdodCtxLDApO3ZhciB2PXNtKGspLHk9di54Kngrdi5vZmZzZXRYO3Y9di55Kmwrdi5vZmZzZXRZO3ZhciB6PXRtKGspLEI9ei54Kngrei5vZmZzZXRYO3o9ei55Kmwrei5vZmZzZXRZO2lzRmluaXRlKGIpJiYobT1NYXRoLm1heChNYXRoLmFicyh5LUIpLXIsMCkpO2lzRmluaXRlKGMpJiYobj1NYXRoLm1heChNYXRoLmFicyh2LXopLXIsMCkpO3I9Sy5hbGxvYygpO3IuaCgwLDApO2E9bm0oYSk7Zm9yKHo9MDt6PGg7eisrKXt2PWRbel0sdj09PWt8fCF2LnZpc2libGUmJnYhPT1hfHwobD12Lm1hcmdpbix4PWwucmlnaHQrbC5sZWZ0LHk9bC50b3ArbC5ib3R0b20sdi5tZWFzdXJlKG0sbiwwLDApLGw9di5tZWFzdXJlZEJvdW5kcyx4PU1hdGgubWF4KGwud2lkdGgreCwwKSxsPU1hdGgubWF4KGwuaGVpZ2h0K3ksMCksci5oKE1hdGgubWF4KHgsci53aWR0aCksTWF0aC5tYXgobCxyLmhlaWdodCkpKTt9aWYoMT09PWgpZS53aWR0aD14LGUuaGVpZ2h0PWwsSy5mcmVlKHIpO2Vsc2V7dj1zbShrKTt6PXRtKGspO2g9ZD0wO3oueCE9PXYueCYmei55IT09di55JiYoZD1yLndpZHRoL01hdGguYWJzKHoueC12LngpLGg9ci5oZWlnaHQvTWF0aC5hYnMoei55LXYueSkpO0suZnJlZShyKTtyPTA7bnVsbCE9PXUmJihyPXUuc3Ryb2tlV2lkdGgqdS5zY2FsZSwkZyh1KT09PWFoJiYoZD1oPU1hdGgubWF4KGQsaCkpKTtkKz1NYXRoLmFicyh2Lm9mZnNldFgpK01hdGguYWJzKHoub2Zmc2V0WCkrcjtoKz1NYXRoLmFicyh2Lm9mZnNldFkpK01hdGguYWJzKHoub2Zmc2V0WSkrcjt1PWsuc3RyZXRjaDt1PT09TGsmJih1PWJsKGssITEpKTtzd2l0Y2godSl7Y2FzZSBaZzpnPWY9MDticmVhaztjYXNlIGJlOmlzRmluaXRlKGIpJiYoZD1iKTtpc0Zpbml0ZShjKSYmKGg9Yyk7YnJlYWs7Y2FzZSBNazppc0Zpbml0ZShiKSYmKGQ9Yik7Zz0wO2JyZWFrO2Nhc2UgTms6Zj0wLGlzRmluaXRlKGMpJiYoaD1jKTt9ay5kbSgpO2subWVhc3VyZShkLGgsZixnKTtlLndpZHRoPWsubWVhc3VyZWRCb3VuZHMud2lkdGgrcDtlLmhlaWdodD1rLm1lYXN1cmVkQm91bmRzLmhlaWdodCtxO319O3JtLnByb3RvdHlwZS5hcnJhbmdlPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5sZW5ndGgsZD1hLnpiKCksZT1kLm1lYXN1cmVkQm91bmRzLGY9Ti5hbGxvYygpO2YuaCgwLDAsMSwxKTt2YXIgZz1kLm1hcmdpbixoPWcubGVmdDtnPWcudG9wO3ZhciBrPWEucGFkZGluZyxsPWsubGVmdDtrPWsudG9wO2QuYXJyYW5nZShsK2gsaytnLGUud2lkdGgsZS5oZWlnaHQpO3ZhciBtPXNtKGQpLG49dG0oZCkscD1tLnkqZS5oZWlnaHQrbS5vZmZzZXRZLHE9bi54KmUud2lkdGgrbi5vZmZzZXRYO249bi55KmUuaGVpZ2h0K24ub2Zmc2V0WTtmLng9bS54KmUud2lkdGgrbS5vZmZzZXRYO2YueT1wO0JjKGYscSxuLDAsMCk7Zi54Kz1oK2w7Zi55Kz1nK2s7Zm9yKGU9MDtlPGM7ZSsrKXtoPWJbZV0saCE9PWQmJihsPWgubWVhc3VyZWRCb3VuZHMsZz1oLm1hcmdpbixrPU1hdGgubWF4KGwud2lkdGgrZy5yaWdodCtnLmxlZnQsMCksbT1NYXRoLm1heChsLmhlaWdodCtnLnRvcCtnLmJvdHRvbSwwKSxwPWguYWxpZ25tZW50LHAuS2IoKSYmKHA9YS5kZWZhdWx0QWxpZ25tZW50KSxwLmdiKCl8fChwPWRkKSxrPWYud2lkdGgqcC54K3Aub2Zmc2V0WC1rKnAueCtnLmxlZnQrZi54LGc9Zi5oZWlnaHQqcC55K3Aub2Zmc2V0WS1tKnAueStnLnRvcCtmLnksaC52aXNpYmxlJiYoQ2MoZi54LGYueSxmLndpZHRoLGYuaGVpZ2h0LGssZyxsLndpZHRoLGwuaGVpZ2h0KT9oLmFycmFuZ2UoayxnLGwud2lkdGgsbC5oZWlnaHQpOmguYXJyYW5nZShrLGcsbC53aWR0aCxsLmhlaWdodCxuZXcgTihmLngsZi55LGYud2lkdGgsZi5oZWlnaHQpKSkpO31OLmZyZWUoZik7fTtmdW5jdGlvbiB1bSgpe3RoaXMubmFtZT0iQmFzZSI7dGhpcy5uYW1lPSJUYWJsZSI7fW9hKHVtLEVsKTt1bS5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXtmb3IodmFyIGg9ZC5sZW5ndGgsaz1LYSgpLGw9S2EoKSxtPTA7bTxoO20rKyl7dmFyIG49ZFttXSxwPW4gaW5zdGFuY2VvZiBYP246bnVsbDtpZihudWxsPT09cHx8cC50eXBlIT09WC5UYWJsZVJvdyYmcC50eXBlIT09WC5UYWJsZUNvbHVtbnx8IW4udmlzaWJsZSlrLnB1c2gobik7ZWxzZXtsLnB1c2gocCk7Zm9yKHZhciBxPXAuWS5qLHI9cS5sZW5ndGgsdT0wO3U8cjt1Kyspe3ZhciB4PXFbdV07cC50eXBlPT09WC5UYWJsZVJvdz94LnJvdz1uLnJvdzpwLnR5cGU9PT1YLlRhYmxlQ29sdW1uJiYoeC5jb2x1bW49bi5jb2x1bW4pO2sucHVzaCh4KTt9fX1oPWsubGVuZ3RoOzA9PT1oJiYoYS5nZXRSb3dEZWZpbml0aW9uKDApLGEuZ2V0Q29sdW1uRGVmaW5pdGlvbigwKSk7Zm9yKHZhciB2PVtdLHk9MDt5PGg7eSsrKXt2YXIgej1rW3ldO2pqKHosITApO2NsKHosITApO3Zbei5yb3ddfHwodlt6LnJvd109W10pO3Zbei5yb3ddW3ouY29sdW1uXXx8KHZbei5yb3ddW3ouY29sdW1uXT1bXSk7dlt6LnJvd11bei5jb2x1bW5dLnB1c2goeik7fU9hKGspO3ZhciBCPUthKCksQz1LYSgpLEk9S2EoKSxKPXtjb3VudDowfSxMPXtjb3VudDowfSxVPWIsUT1jLGlhPWEuc2I7aD1pYS5sZW5ndGg7Zm9yKHZhciBqYT0wO2phPGg7amErKyl7dmFyIE09aWFbamFdO3ZvaWQgMCE9PU0mJihNLmFjdHVhbD0wKTt9aWE9YS5uYjtoPWlhLmxlbmd0aDtmb3IodmFyIFI9MDtSPGg7UisrKXtNPWlhW1JdLHZvaWQgMCE9PU0mJihNLmFjdHVhbD0wKTt9Zm9yKHZhciBBYT12Lmxlbmd0aCxvYj0wLEhhPTA7SGE8QWE7SGErKyl7dltIYV0mJihvYj1NYXRoLm1heChvYix2W0hhXS5sZW5ndGgpKTt9dmFyIERhPU1hdGgubWluKGEudG9wSW5kZXgsQWEtMSksRmE9TWF0aC5taW4oYS5sZWZ0SW5kZXgsb2ItMSksUmE9MDtBYT12Lmxlbmd0aDtmb3IodmFyIFViPW5tKGEpLCRhPTA7JGE8QWE7JGErKyl7aWYodlskYV0pe29iPXZbJGFdLmxlbmd0aDtmb3IodmFyIFhhPWEuZ2V0Um93RGVmaW5pdGlvbigkYSksTWE9WGEuYWN0dWFsPTA7TWE8b2I7TWErKyl7aWYodlskYV1bTWFdKXt2YXIgZmE9YS5nZXRDb2x1bW5EZWZpbml0aW9uKE1hKTt2b2lkIDA9PT1CW01hXSYmKGZhLmFjdHVhbD0wLEJbTWFdPSEwKTtmb3IodmFyIGVhPXZbJGFdW01hXSxoYj1lYS5sZW5ndGgsamI9MDtqYjxoYjtqYisrKXt2YXIgTmE9ZWFbamJdO2lmKE5hLnZpc2libGV8fE5hPT09VWIpe3ZhciBlZT0xPE5hLnJvd1NwYW58fDE8TmEuY29sdW1uU3BhbjtlZSYmKCRhPERhfHxNYTxGYXx8Qy5wdXNoKE5hKSk7dmFyIExkPU5hLm1hcmdpbix2Yj1MZC5yaWdodCtMZC5sZWZ0LHpmPUxkLnRvcCtMZC5ib3R0b207dmFyIEViPXVsKE5hLFhhLGZhLCExKTt2YXIgcWU9TmEuZGVzaXJlZFNpemUsV2M9IWlzTmFOKHFlLmhlaWdodCksVmI9IWlzTmFOKHFlLndpZHRoKSYmV2M7ZWV8fEViPT09Wmd8fFZifHwkYTxEYXx8TWE8RmF8fCh2b2lkIDAhPT1KW01hXXx8RWIhPT1iZSYmRWIhPT1Na3x8KEpbTWFdPS0xLEouY291bnQrKyksdm9pZCAwIT09TFskYV18fEViIT09YmUmJkViIT09Tmt8fChMWyRhXT0tMSxMLmNvdW50KyspLEkucHVzaChOYSkpO05hLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHksMCwwKTtpZighKCRhPERhfHxNYTxGYSkpe3ZhciBNZD1OYS5tZWFzdXJlZEJvdW5kcyxFYz1NYXRoLm1heChNZC53aWR0aCt2YiwwKSxJZT1NYXRoLm1heChNZC5oZWlnaHQremYsMCk7aWYoMT09PU5hLnJvd1NwYW4mJihFYj09PVpnfHxFYj09PU1rKSl7TT1hLmdldFJvd0RlZmluaXRpb24oJGEpO3ZhciBKZT1NLnRjKCk7UmE9TWF0aC5tYXgoSWUtTS5hY3R1YWwsMCk7UmErSmU+USYmKFJhPU1hdGgubWF4KFEtSmUsMCkpO3ZhciBBZj0wPT09TS5hY3R1YWw7TS5hY3R1YWw9TS5hY3R1YWwrUmE7UT1NYXRoLm1heChRLShSYSsoQWY/SmU6MCkpLDApO31pZigxPT09TmEuY29sdW1uU3BhbiYmKEViPT09Wmd8fEViPT09TmspKXtNPWEuZ2V0Q29sdW1uRGVmaW5pdGlvbihNYSk7dmFyIGdmPU0udGMoKTtSYT1NYXRoLm1heChFYy1NLmFjdHVhbCwwKTtSYStnZj5VJiYoUmE9TWF0aC5tYXgoVS1nZiwwKSk7dmFyIEJmPTA9PT1NLmFjdHVhbDtNLmFjdHVhbD1NLmFjdHVhbCtSYTtVPU1hdGgubWF4KFUtKFJhKyhCZj9nZjowKSksMCk7fWVlJiZOYS5kbSgpO319fX19fX1PYShCKTt2YXIgV2I9MCxZYT0wO2g9YS5jb2x1bW5Db3VudDtmb3IodmFyIGFiPTA7YWI8aDthYisrKXt2YXIgTGM9YS5uYlthYl07dm9pZCAwIT09TGMmJihXYis9TGMua2EsMCE9PUxjLmthJiYoV2IrPUxjLnRjKCkpKTt9aD1hLnJvd0NvdW50O2Zvcih2YXIgQ2Y9MDtDZjxoO0NmKyspe3ZhciBqYz1hLnNiW0NmXTt2b2lkIDAhPT1qYyYmKFlhKz1qYy5rYSwwIT09amMua2EmJihZYSs9amMudGMoKSkpO31VPU1hdGgubWF4KGItV2IsMCk7dmFyIE5kPVE9TWF0aC5tYXgoYy1ZYSwwKSxxYz1VO2g9SS5sZW5ndGg7Zm9yKHZhciBPZD0wO09kPGg7T2QrKyl7dmFyIFhiPUlbT2RdLENoPWEuZ2V0Um93RGVmaW5pdGlvbihYYi5yb3cpLERoPWEuZ2V0Q29sdW1uRGVmaW5pdGlvbihYYi5jb2x1bW4pLEtlPVhiLm1lYXN1cmVkQm91bmRzLHBiPVhiLm1hcmdpbixEZj1wYi5yaWdodCtwYi5sZWZ0LExlPXBiLnRvcCtwYi5ib3R0b207SltYYi5jb2x1bW5dPTA9PT1EaC5hY3R1YWwmJnZvaWQgMCE9PUpbWGIuY29sdW1uXT9NYXRoLm1heChLZS53aWR0aCtEZixKW1hiLmNvbHVtbl0pOm51bGw7TFtYYi5yb3ddPTA9PT1DaC5hY3R1YWwmJnZvaWQgMCE9PUxbWGIucm93XT9NYXRoLm1heChLZS5oZWlnaHQrTGUsTFtYYi5yb3ddKTpudWxsO312YXIgWWI9MCxNZT0wLE1jO2ZvcihNYyBpbiBMKXsiY291bnQiIT09TWMmJihZYis9TFtNY10pO31mb3IoTWMgaW4gSil7ImNvdW50IiE9PU1jJiYoTWUrPUpbTWNdKTt9Zm9yKHZhciBlYj1LLmFsbG9jKCksTmU9MDtOZTxoO05lKyspe3ZhciByYj1JW05lXTtpZihyYi52aXNpYmxlfHxyYj09PVViKXt2YXIgcmM9YS5nZXRSb3dEZWZpbml0aW9uKHJiLnJvdyksa2I9YS5nZXRDb2x1bW5EZWZpbml0aW9uKHJiLmNvbHVtbiksWGM9MDtpc0Zpbml0ZShrYi53aWR0aCk/WGM9a2Iud2lkdGg6KGlzRmluaXRlKFUpJiZudWxsIT09SltyYi5jb2x1bW5dPzA9PT1NZT9YYz1rYi5hY3R1YWwrVTpYYz1KW3JiLmNvbHVtbl0vTWUqcWM6bnVsbCE9PUpbcmIuY29sdW1uXT9YYz1VOlhjPWtiLmFjdHVhbHx8VSxYYz1NYXRoLm1heCgwLFhjLWtiLnRjKCkpKTt2YXIgWWM9MDtpc0Zpbml0ZShyYy5oZWlnaHQpP1ljPXJjLmhlaWdodDooaXNGaW5pdGUoUSkmJm51bGwhPT1MW3JiLnJvd10/MD09PVliP1ljPXJjLmFjdHVhbCtROlljPUxbcmIucm93XS9ZYipOZDpudWxsIT09TFtyYi5yb3ddP1ljPVE6WWM9cmMuYWN0dWFsfHxRLFljPU1hdGgubWF4KDAsWWMtcmMudGMoKSkpO2ViLmgoTWF0aC5tYXgoa2IubWluaW11bSxNYXRoLm1pbihYYyxrYi5tYXhpbXVtKSksTWF0aC5tYXgocmMubWluaW11bSxNYXRoLm1pbihZYyxyYy5tYXhpbXVtKSkpO0ViPXVsKHJiLHJjLGtiLCExKTtzd2l0Y2goRWIpe2Nhc2UgTWs6ZWIuaGVpZ2h0PU1hdGgubWF4KGViLmhlaWdodCxyYy5hY3R1YWwrUSk7YnJlYWs7Y2FzZSBOazplYi53aWR0aD1NYXRoLm1heChlYi53aWR0aCxrYi5hY3R1YWwrVSk7fXZhciB4ZD1yYi5tYXJnaW4sQWc9eGQucmlnaHQreGQubGVmdCxFZj14ZC50b3AreGQuYm90dG9tO3JiLmRtKCk7cmIubWVhc3VyZShlYi53aWR0aCxlYi5oZWlnaHQsa2IubWluaW11bSxyYy5taW5pbXVtKTt2YXIgRmY9cmIubWVhc3VyZWRCb3VuZHMsaGY9TWF0aC5tYXgoRmYud2lkdGgrQWcsMCksa2Q9TWF0aC5tYXgoRmYuaGVpZ2h0K0VmLDApO2lzRmluaXRlKFUpJiYoaGY9TWF0aC5taW4oaGYsZWIud2lkdGgpKTtpc0Zpbml0ZShRKSYmKGtkPU1hdGgubWluKGtkLGViLmhlaWdodCkpO3ZhciBQZD0wO1BkPXJjLmFjdHVhbDtyYy5hY3R1YWw9TWF0aC5tYXgocmMuYWN0dWFsLGtkKTtSYT1yYy5hY3R1YWwtUGQ7UT1NYXRoLm1heChRLVJhLDApO1BkPWtiLmFjdHVhbDtrYi5hY3R1YWw9TWF0aC5tYXgoa2IuYWN0dWFsLGhmKTtSYT1rYi5hY3R1YWwtUGQ7VT1NYXRoLm1heChVLVJhLDApO319T2EoSSk7dmFyIGxkPUsuYWxsb2MoKSxtZD1LYSgpLG5iPUthKCk7aD1DLmxlbmd0aDtpZigwIT09aClmb3IodmFyIGZiPTA7ZmI8QWE7ZmIrKyl7aWYodltmYl0pe29iPXZbZmJdLmxlbmd0aDt2YXIgbmQ9YS5nZXRSb3dEZWZpbml0aW9uKGZiKTttZFtmYl09bmQuYWN0dWFsO2Zvcih2YXIgWmM9MDtaYzxvYjtaYysrKXtpZih2W2ZiXVtaY10pe3ZhciBvZD1hLmdldENvbHVtbkRlZmluaXRpb24oWmMpO25iW1pjXT1vZC5hY3R1YWw7fX19fWZvcih2YXIgdmM9MDt2YzxoO3ZjKyspe3ZhciBCYT1DW3ZjXTtpZihCYS52aXNpYmxlfHxCYT09PVViKXt2YXIgJGM9YS5nZXRSb3dEZWZpbml0aW9uKEJhLnJvdyksWmI9YS5nZXRDb2x1bW5EZWZpbml0aW9uKEJhLmNvbHVtbik7ZWIuaChNYXRoLm1heChaYi5taW5pbXVtLE1hdGgubWluKGIsWmIubWF4aW11bSkpLE1hdGgubWF4KCRjLm1pbmltdW0sTWF0aC5taW4oYywkYy5tYXhpbXVtKSkpO0ViPXVsKEJhLCRjLFpiLCExKTtzd2l0Y2goRWIpe2Nhc2UgYmU6MCE9PW5iW1piLmluZGV4XSYmKGViLndpZHRoPU1hdGgubWluKGViLndpZHRoLG5iW1piLmluZGV4XSkpOzAhPT1tZFskYy5pbmRleF0mJihlYi5oZWlnaHQ9TWF0aC5taW4oZWIuaGVpZ2h0LG1kWyRjLmluZGV4XSkpO2JyZWFrO2Nhc2UgTWs6MCE9PW5iW1piLmluZGV4XSYmKGViLndpZHRoPU1hdGgubWluKGViLndpZHRoLG5iW1piLmluZGV4XSkpO2JyZWFrO2Nhc2UgTms6MCE9PW1kWyRjLmluZGV4XSYmKGViLmhlaWdodD1NYXRoLm1pbihlYi5oZWlnaHQsbWRbJGMuaW5kZXhdKSk7fWlzRmluaXRlKFpiLndpZHRoKSYmKGViLndpZHRoPVpiLndpZHRoKTtpc0Zpbml0ZSgkYy5oZWlnaHQpJiYoZWIuaGVpZ2h0PSRjLmhlaWdodCk7bGQuaCgwLDApO2Zvcih2YXIgZmU9MTtmZTxCYS5yb3dTcGFuJiYhKEJhLnJvdytmZT49YS5yb3dDb3VudCk7ZmUrKyl7TT1hLmdldFJvd0RlZmluaXRpb24oQmEucm93K2ZlKSxSYT0wLFJhPUViPT09YmV8fEViPT09Tms/TWF0aC5tYXgoTS5taW5pbXVtLDA9PT1tZFtCYS5yb3crZmVdP00ubWF4aW11bTpNYXRoLm1pbihtZFtCYS5yb3crZmVdLE0ubWF4aW11bSkpOk1hdGgubWF4KE0ubWluaW11bSxpc05hTihNLlBjKT9NLm1heGltdW06TWF0aC5taW4oTS5QYyxNLm1heGltdW0pKSxsZC5oZWlnaHQrPVJhO31mb3IodmFyIE9lPTE7T2U8QmEuY29sdW1uU3BhbiYmIShCYS5jb2x1bW4rT2U+PWEuY29sdW1uQ291bnQpO09lKyspe009YS5nZXRDb2x1bW5EZWZpbml0aW9uKEJhLmNvbHVtbitPZSksUmE9MCxSYT1FYj09PWJlfHxFYj09PU1rP01hdGgubWF4KE0ubWluaW11bSwwPT09bmJbQmEuY29sdW1uK09lXT9NLm1heGltdW06TWF0aC5taW4obmJbQmEuY29sdW1uK09lXSxNLm1heGltdW0pKTpNYXRoLm1heChNLm1pbmltdW0saXNOYU4oTS5QYyk/TS5tYXhpbXVtOk1hdGgubWluKE0uUGMsTS5tYXhpbXVtKSksbGQud2lkdGgrPVJhO31lYi53aWR0aCs9bGQud2lkdGg7ZWIuaGVpZ2h0Kz1sZC5oZWlnaHQ7dmFyIGdlPUJhLm1hcmdpbix3Yz1nZS5yaWdodCtnZS5sZWZ0LHJlPWdlLnRvcCtnZS5ib3R0b207QmEubWVhc3VyZShlYi53aWR0aCxlYi5oZWlnaHQsZixnKTtmb3IodmFyIGFkPUJhLm1lYXN1cmVkQm91bmRzLHdiPU1hdGgubWF4KGFkLndpZHRoK3djLDApLFFkPU1hdGgubWF4KGFkLmhlaWdodCtyZSwwKSxNYj0wLHNlPTA7c2U8QmEucm93U3BhbiYmIShCYS5yb3crc2U+PWEucm93Q291bnQpO3NlKyspe009YS5nZXRSb3dEZWZpbml0aW9uKEJhLnJvdytzZSksTWIrPU0udG90YWx8fDA7fWlmKE1iPFFkKXt2YXIgeWQ9UWQtTWIsaGU9UWQtTWI7aWYobnVsbCE9PUJhLnNwYW5BbGxvY2F0aW9uKWZvcih2YXIgQmc9QmEuc3BhbkFsbG9jYXRpb24sYmQ9MDtiZDxCYS5yb3dTcGFuJiYhKDA+PXlkKSYmIShCYS5yb3crYmQ+PWEucm93Q291bnQpO2JkKyspe009YS5nZXRSb3dEZWZpbml0aW9uKEJhLnJvdytiZCk7dmFyIFBlPU0ua2F8fDAsQ2c9QmcoQmEsTSxoZSk7TS5hY3R1YWw9TWF0aC5taW4oTS5tYXhpbXVtLFBlK0NnKTtNLmthIT09UGUmJih5ZC09TS5rYS1QZSk7fWZvcig7MDx5ZDspe3ZhciBHZj1NLmthfHwwO2lzTmFOKE0uaGVpZ2h0KSYmTS5tYXhpbXVtPkdmJiYoTS5hY3R1YWw9TWF0aC5taW4oTS5tYXhpbXVtLEdmK3lkKSxNLmthIT09R2YmJih5ZC09TS5rYS1HZikpO2lmKDA9PT1NLmluZGV4KWJyZWFrO009YS5nZXRSb3dEZWZpbml0aW9uKE0uaW5kZXgtMSk7fX1mb3IodmFyIFFlPTAsRGc9MDtEZzxCYS5jb2x1bW5TcGFuJiYhKEJhLmNvbHVtbitEZz49YS5jb2x1bW5Db3VudCk7RGcrKyl7TT1hLmdldENvbHVtbkRlZmluaXRpb24oQmEuY29sdW1uK0RnKSxRZSs9TS50b3RhbHx8MDt9aWYoUWU8d2Ipe3ZhciBjZz13Yi1RZSxFaT13Yi1RZTtpZihudWxsIT09QmEuc3BhbkFsbG9jYXRpb24pZm9yKHZhciBSZT1CYS5zcGFuQWxsb2NhdGlvbixTZT0wO1NlPEJhLmNvbHVtblNwYW4mJiEoMD49Y2cpJiYhKEJhLmNvbHVtbitTZT49YS5jb2x1bW5Db3VudCk7U2UrKyl7TT1hLmdldENvbHVtbkRlZmluaXRpb24oQmEuY29sdW1uK1NlKTt2YXIgRWg9TS5rYXx8MCxudD1SZShCYSxNLEVpKTtNLmFjdHVhbD1NYXRoLm1pbihNLm1heGltdW0sRWgrbnQpO00ua2EhPT1FaCYmKGNnLT1NLmthLUVoKTt9Zm9yKDswPGNnOyl7dmFyIFVqPU0ua2F8fDA7aXNOYU4oTS53aWR0aCkmJk0ubWF4aW11bT5VaiYmKE0uYWN0dWFsPU1hdGgubWluKE0ubWF4aW11bSxVaitjZyksTS5rYSE9PVVqJiYoY2ctPU0ua2EtVWopKTtpZigwPT09TS5pbmRleClicmVhaztNPWEuZ2V0Q29sdW1uRGVmaW5pdGlvbihNLmluZGV4LTEpO319fX1PYShDKTtLLmZyZWUobGQpO0suZnJlZShlYik7dm9pZCAwIT09bWQmJk9hKG1kKTt2b2lkIDAhPT1uYiYmT2EobmIpO3ZhciBFZz0wLEZnPTAsVmo9YS5kZXNpcmVkU2l6ZSxPcT1hLm1heFNpemU7RWI9YmwoYSwhMCk7dmFyIEZpPVlhPVdiPTAsR2k9MDtoPWEuY29sdW1uQ291bnQ7Zm9yKHZhciBXaj0wO1dqPGg7V2orKyl7dm9pZCAwIT09YS5uYltXal0mJihNPWEuZ2V0Q29sdW1uRGVmaW5pdGlvbihXaiksaXNGaW5pdGUoTS53aWR0aCk/KEZpKz1NLndpZHRoLEZpKz1NLnRjKCkpOnZtKE0pPT09d20/KEZpKz1NLmthLEZpKz1NLnRjKCkpOjAhPT1NLmthJiYoV2IrPU0ua2EsV2IrPU0udGMoKSkpO31pc0Zpbml0ZShWai53aWR0aCk/RWc9TWF0aC5taW4oVmoud2lkdGgsT3Eud2lkdGgpOkVnPUViIT09WmcmJmlzRmluaXRlKGIpP2I6V2I7RWc9TWF0aC5tYXgoRWcsYS5taW5TaXplLndpZHRoKTtFZz1NYXRoLm1heChFZy1GaSwwKTtmb3IodmFyIG90PTA9PT1XYj8xOk1hdGgubWF4KEVnL1diLDEpLFlqPTA7WWo8aDtZaisrKXt2b2lkIDAhPT1hLm5iW1lqXSYmKE09YS5nZXRDb2x1bW5EZWZpbml0aW9uKFlqKSxpc0Zpbml0ZShNLndpZHRoKXx8dm0oTSk9PT13bXx8KE0uYWN0dWFsPU0ua2Eqb3QpLE0ucG9zaXRpb249ZS53aWR0aCwwIT09TS5rYSYmKGUud2lkdGgrPU0ua2EsZS53aWR0aCs9TS50YygpKSk7fWg9YS5yb3dDb3VudDtmb3IodmFyIFpqPTA7Wmo8aDtaaisrKXt2b2lkIDAhPT1hLnNiW1pqXSYmKE09YS5nZXRSb3dEZWZpbml0aW9uKFpqKSxpc0Zpbml0ZShNLmhlaWdodCk/KEdpKz1NLmhlaWdodCxHaSs9TS50YygpKTp2bShNKT09PXdtPyhHaSs9TS5rYSxHaSs9TS50YygpKTowIT09TS5rYSYmKFlhKz1NLmthLDAhPT1NLmthJiYoWWErPU0udGMoKSkpKTt9aXNGaW5pdGUoVmouaGVpZ2h0KT9GZz1NYXRoLm1pbihWai5oZWlnaHQsT3EuaGVpZ2h0KTpGZz1FYiE9PVpnJiZpc0Zpbml0ZShjKT9jOllhO0ZnPU1hdGgubWF4KEZnLGEubWluU2l6ZS5oZWlnaHQpO0ZnPU1hdGgubWF4KEZnLUdpLDApO2Zvcih2YXIgcHQ9MD09PVlhPzE6TWF0aC5tYXgoRmcvWWEsMSksYWs9MDthazxoO2FrKyspe3ZvaWQgMCE9PWEuc2JbYWtdJiYoTT1hLmdldFJvd0RlZmluaXRpb24oYWspLGlzRmluaXRlKE0uaGVpZ2h0KXx8dm0oTSk9PT13bXx8KE0uYWN0dWFsPU0ua2EqcHQpLE0ucG9zaXRpb249ZS5oZWlnaHQsMCE9PU0ua2EmJihlLmhlaWdodCs9TS5rYSwwIT09TS5rYSYmKGUuaGVpZ2h0Kz1NLnRjKCkpKSk7fWg9bC5sZW5ndGg7Zm9yKHZhciBqbj0wO2puPGg7am4rKyl7dmFyIFJkPWxbam5dLGtuPTAsbG49MDtSZC50eXBlPT09WC5UYWJsZVJvdz8oa249ZS53aWR0aCxNPWEuZ2V0Um93RGVmaW5pdGlvbihSZC5yb3cpLGxuPU0uYWN0dWFsKTooTT1hLmdldENvbHVtbkRlZmluaXRpb24oUmQuY29sdW1uKSxrbj1NLmFjdHVhbCxsbj1lLmhlaWdodCk7UmQubWVhc3VyZWRCb3VuZHMuaCgwLDAsa24sbG4pO2pqKFJkLCExKTt2W1JkLnJvd118fCh2W1JkLnJvd109W10pO3ZbUmQucm93XVtSZC5jb2x1bW5dfHwodltSZC5yb3ddW1JkLmNvbHVtbl09W10pO3ZbUmQucm93XVtSZC5jb2x1bW5dLnB1c2goUmQpO31PYShsKTthLmNwPXY7fTt1bS5wcm90b3R5cGUuYXJyYW5nZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9Yi5sZW5ndGgsZT1hLnBhZGRpbmcsZj1lLmxlZnQ7ZT1lLnRvcDtmb3IodmFyIGc9YS5jcCxoLGssbD1nLmxlbmd0aCxtPTAsbj0wO248bDtuKyspe2dbbl0mJihtPU1hdGgubWF4KG0sZ1tuXS5sZW5ndGgpKTt9Zm9yKG49TWF0aC5taW4oYS50b3BJbmRleCxsLTEpO24hPT1sJiYodm9pZCAwPT09YS5zYltuXXx8MD09PWEuc2Jbbl0ua2EpOyl7bisrO31uPU1hdGgubWluKG4sbC0xKTtuPS1hLnNiW25dLnBvc2l0aW9uO2ZvcihoPU1hdGgubWluKGEubGVmdEluZGV4LG0tMSk7aCE9PW0mJih2b2lkIDA9PT1hLm5iW2hdfHwwPT09YS5uYltoXS5rYSk7KXtoKys7fWg9TWF0aC5taW4oaCxtLTEpO2Zvcih2YXIgcD0tYS5uYltoXS5wb3NpdGlvbixxPUsuYWxsb2MoKSxyPTA7cjxsO3IrKyl7aWYoZ1tyXSl7bT1nW3JdLmxlbmd0aDt2YXIgdT1hLmdldFJvd0RlZmluaXRpb24ocik7az11LnBvc2l0aW9uK24rZTswIT09dS5rYSYmKGsrPXUuTnUoKSk7Zm9yKHZhciB4PTA7eDxtO3grKyl7aWYoZ1tyXVt4XSl7dmFyIHY9YS5nZXRDb2x1bW5EZWZpbml0aW9uKHgpO2g9di5wb3NpdGlvbitwK2Y7MCE9PXYua2EmJihoKz12Lk51KCkpO2Zvcih2YXIgeT1nW3JdW3hdLHo9eS5sZW5ndGgsQj0wO0I8ejtCKyspe3ZhciBDPXlbQl0sST1DLm1lYXN1cmVkQm91bmRzLEo9QyBpbnN0YW5jZW9mIFg/QzpudWxsO2lmKG51bGw9PT1KfHxKLnR5cGUhPT1YLlRhYmxlUm93JiZKLnR5cGUhPT1YLlRhYmxlQ29sdW1uKXtxLmgoMCwwKTtmb3IodmFyIEw9MTtMPEMucm93U3BhbiYmIShyK0w+PWEucm93Q291bnQpO0wrKyl7Sj1hLmdldFJvd0RlZmluaXRpb24ocitMKSxxLmhlaWdodCs9Si50b3RhbDt9Zm9yKEw9MTtMPEMuY29sdW1uU3BhbiYmISh4K0w+PWEuY29sdW1uQ291bnQpO0wrKyl7Sj1hLmdldENvbHVtbkRlZmluaXRpb24oeCtMKSxxLndpZHRoKz1KLnRvdGFsO312YXIgVT12LmthK3Eud2lkdGgsUT11LmthK3EuaGVpZ2h0O0w9aDtKPWs7dmFyIGlhPVUsamE9USxNPWgsUj1rLEFhPVUsb2I9UTtoK1U+Yy53aWR0aCYmKEFhPU1hdGgubWF4KGMud2lkdGgtaCwwKSk7aytRPmMuaGVpZ2h0JiYob2I9TWF0aC5tYXgoYy5oZWlnaHQtaywwKSk7dmFyIEhhPUMuYWxpZ25tZW50O2lmKEhhLktiKCkpe0hhPWEuZGVmYXVsdEFsaWdubWVudDtIYS5nYigpfHwoSGE9ZGQpO3ZhciBEYT1IYS54O3ZhciBGYT1IYS55O3ZhciBSYT1IYS5vZmZzZXRYO0hhPUhhLm9mZnNldFk7dmFyIFViPXYuYWxpZ25tZW50LCRhPXUuYWxpZ25tZW50O1ViLmdiKCkmJihEYT1VYi54LFJhPVViLm9mZnNldFgpOyRhLmdiKCkmJihGYT0kYS55LEhhPSRhLm9mZnNldFkpO31lbHNlIERhPUhhLngsRmE9SGEueSxSYT1IYS5vZmZzZXRYLEhhPUhhLm9mZnNldFk7aWYoaXNOYU4oRGEpfHxpc05hTihGYSkpRmE9RGE9LjUsSGE9UmE9MDtVYj1JLndpZHRoOyRhPUkuaGVpZ2h0O3ZhciBYYT1DLm1hcmdpbixNYT1YYS5sZWZ0K1hhLnJpZ2h0LGZhPVhhLnRvcCtYYS5ib3R0b20sZWE9dWwoQyx1LHYsITEpOyFpc05hTihDLmRlc2lyZWRTaXplLndpZHRoKXx8ZWEhPT1iZSYmZWEhPT1Na3x8KFViPU1hdGgubWF4KFUtTWEsMCkpOyFpc05hTihDLmRlc2lyZWRTaXplLmhlaWdodCl8fGVhIT09YmUmJmVhIT09Tmt8fCgkYT1NYXRoLm1heChRLWZhLDApKTtVPUMubWF4U2l6ZTtRPUMubWluU2l6ZTtVYj1NYXRoLm1pbihVLndpZHRoLFViKTskYT1NYXRoLm1pbihVLmhlaWdodCwkYSk7VWI9TWF0aC5tYXgoUS53aWR0aCxVYik7JGE9TWF0aC5tYXgoUS5oZWlnaHQsJGEpO1U9JGErZmE7TCs9aWEqRGEtKFViK01hKSpEYStSYStYYS5sZWZ0O0orPWphKkZhLVUqRmErSGErWGEudG9wO0MudmlzaWJsZSYmKENjKE0sUixBYSxvYixMLEosSS53aWR0aCxJLmhlaWdodCk/Qy5hcnJhbmdlKEwsSixVYiwkYSk6Qy5hcnJhbmdlKEwsSixVYiwkYSxuZXcgTihNLFIsQWEsb2IpKSk7fWVsc2UgQy5mbCgpLEMuYWN0dWFsQm91bmRzLmhhKCksaWE9Qy5hY3R1YWxCb3VuZHMsTD1OLmFsbG9jQXQoaWEueCxpYS55LGlhLndpZHRoLGlhLmhlaWdodCksaWEueD1KLnR5cGU9PT1YLlRhYmxlUm93P2Y6aCxpYS55PUoudHlwZT09PVguVGFibGVDb2x1bW4/ZTprLGlhLndpZHRoPUkud2lkdGgsaWEuaGVpZ2h0PUkuaGVpZ2h0LEMuYWN0dWFsQm91bmRzLmZyZWV6ZSgpLGNsKEMsITEpLHhjKEwsaWEpfHwoST1DLnBhcnQsbnVsbCE9PUkmJihJLnloKCksQy5EbyhJKSkpLE4uZnJlZShMKTt9fX19fUsuZnJlZShxKTtmb3IoYT0wO2E8ZDthKyspe2M9YlthXSxmPWMgaW5zdGFuY2VvZiBYP2M6bnVsbCxudWxsPT09Znx8Zi50eXBlIT09WC5UYWJsZVJvdyYmZi50eXBlIT09WC5UYWJsZUNvbHVtbnx8KGY9Yy5hY3R1YWxCb3VuZHMsYy5uYXR1cmFsQm91bmRzLmhhKCksYy5uYXR1cmFsQm91bmRzLmgoMCwwLGYud2lkdGgsZi5oZWlnaHQpLGMubmF0dXJhbEJvdW5kcy5mcmVlemUoKSk7fX07ZnVuY3Rpb24geG0oKXt0aGlzLm5hbWU9IkJhc2UiO3RoaXMubmFtZT0iVGFibGVSb3ciO31vYSh4bSxFbCk7eG0ucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24oKXt9O3htLnByb3RvdHlwZS5hcnJhbmdlPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiB5bSgpe3RoaXMubmFtZT0iQmFzZSI7dGhpcy5uYW1lPSJUYWJsZUNvbHVtbiI7fW9hKHltLEVsKTt5bS5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbigpe307eW0ucHJvdG90eXBlLmFycmFuZ2U9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIHptKCl7dGhpcy5uYW1lPSJCYXNlIjt0aGlzLm5hbWU9IlZpZXdib3giO31vYSh6bSxFbCk7em0ucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7MTxkLmxlbmd0aCYmQSgiVmlld2JveCBQYW5lbCBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIEdyYXBoT2JqZWN0LiIpO2Q9ZFswXTtkLkNhPTE7ZC5kbSgpO2QubWVhc3VyZShJbmZpbml0eSxJbmZpbml0eSxmLGcpO3ZhciBoPWQubWVhc3VyZWRCb3VuZHMsaz1kLm1hcmdpbixsPWsucmlnaHQray5sZWZ0O2s9ay50b3Aray5ib3R0b207aWYoaXNGaW5pdGUoYil8fGlzRmluaXRlKGMpKXt2YXIgbT1kLnNjYWxlLG49aC53aWR0aDtoPWguaGVpZ2h0O3ZhciBwPU1hdGgubWF4KGItbCwwKSxxPU1hdGgubWF4KGMtaywwKSxyPTE7YS52aWV3Ym94U3RyZXRjaD09PWFoPzAhPT1uJiYwIT09aCYmKHI9TWF0aC5taW4ocC9uLHEvaCkpOjAhPT1uJiYwIT09aCYmKHI9TWF0aC5tYXgocC9uLHEvaCkpOzA9PT1yJiYocj0xRS00KTtkLkNhKj1yO20hPT1kLnNjYWxlJiYoamooZCwhMCksZC5tZWFzdXJlKEluZmluaXR5LEluZmluaXR5LGYsZykpO31oPWQubWVhc3VyZWRCb3VuZHM7ZS53aWR0aD1pc0Zpbml0ZShiKT9iOk1hdGgubWF4KGgud2lkdGgrbCwwKTtlLmhlaWdodD1pc0Zpbml0ZShjKT9jOk1hdGgubWF4KGguaGVpZ2h0K2ssMCk7fTt6bS5wcm90b3R5cGUuYXJyYW5nZT1mdW5jdGlvbihhLGIsYyl7Yj1iWzBdO3ZhciBkPWIubWVhc3VyZWRCb3VuZHMsZT1iLm1hcmdpbixmPU1hdGgubWF4KGQud2lkdGgrKGUucmlnaHQrZS5sZWZ0KSwwKTtlPU1hdGgubWF4KGQuaGVpZ2h0KyhlLnRvcCtlLmJvdHRvbSksMCk7dmFyIGc9Yi5hbGlnbm1lbnQ7Zy5LYigpJiYoZz1hLmRlZmF1bHRBbGlnbm1lbnQpO2cuZ2IoKXx8KGc9ZGQpO2IuYXJyYW5nZShjLndpZHRoKmcueC1mKmcueCtnLm9mZnNldFgsYy5oZWlnaHQqZy55LWUqZy55K2cub2Zmc2V0WSxkLndpZHRoLGQuaGVpZ2h0KTt9O2Z1bmN0aW9uIEFtKCl7dGhpcy5uYW1lPSJCYXNlIjt0aGlzLm5hbWU9IkdyaWQiO31vYShBbSxFbCk7QW0ucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24oKXt9O0FtLnByb3RvdHlwZS5hcnJhbmdlPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBCbSgpe3RoaXMubmFtZT0iQmFzZSI7dGhpcy5uYW1lPSJMaW5rIjt9b2EoQm0sRWwpO0JtLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKGEsYixjLGQsZSl7Yz1kLmxlbmd0aDtpZihhIGluc3RhbmNlb2YgcGZ8fGEgaW5zdGFuY2VvZiBTKXt2YXIgZj1udWxsLGc9bnVsbCxoPW51bGw7YSBpbnN0YW5jZW9mIFMmJihnPWY9YSk7YSBpbnN0YW5jZW9mIHBmJiYoaD1hLGY9aC5hZG9ybmVkUGFydCk7aWYoZiBpbnN0YW5jZW9mIFMpe3ZhciBrPWY7aWYoMD09PWMpc2MoYS5uYXR1cmFsQm91bmRzLDAsMCksYS5tZWFzdXJlZEJvdW5kcy5oKDAsMCwwLDApO2Vsc2V7dmFyIGw9YSBpbnN0YW5jZW9mIHBmP251bGw6Zi5wYXRoLG09Zi5yb3V0ZUJvdW5kcztiPWEuaGc7Yi5oKDAsMCxtLndpZHRoLG0uaGVpZ2h0KTt2YXIgbj1rLnBvaW50cztmPWYucG9pbnRzQ291bnQ7bnVsbCE9PWg/aC5nayghMSk6bnVsbCE9PWcmJmcuZ2soITEpO3ZhciBwPW0ud2lkdGgscT1tLmhlaWdodDthLmxvY2F0aW9uLmgobS54LG0ueSk7YS5sLmxlbmd0aD0wO251bGwhPT1sJiYoQ20oYSxwLHEsbCksaD1sLm1lYXN1cmVkQm91bmRzLGIuSmMoaCksYS5sLnB1c2goaCkpO2g9UWMuYWxsb2MoKTtmb3IodmFyIHI9Ry5hbGxvYygpLHU9Ry5hbGxvYygpLHg9MDt4PGM7eCsrKXt2YXIgdj1kW3hdO2lmKHYhPT1sKWlmKHYuaXNQYW5lbE1haW4mJnYgaW5zdGFuY2VvZiBXKXtDbShhLHAscSx2KTt2YXIgeT12Lm1lYXN1cmVkQm91bmRzO2IuSmMoeSk7YS5sLnB1c2goeSk7fWVsc2UgaWYoMj5mKXYubWVhc3VyZShJbmZpbml0eSxJbmZpbml0eSwwLDApLHk9di5tZWFzdXJlZEJvdW5kcyxiLkpjKHkpLGEubC5wdXNoKHkpO2Vsc2V7dmFyIHo9di5zZWdtZW50SW5kZXg7eT12LnNlZ21lbnRGcmFjdGlvbjt2YXIgQj12LmFsaWdubWVudEZvY3VzO0IuamMoKSYmKEI9ZGQpO3ZhciBDPXYuc2VnbWVudE9yaWVudGF0aW9uLEk9di5zZWdtZW50T2Zmc2V0O2lmKHo8LWZ8fHo+PWYpe3k9ay5taWRQb2ludDt2YXIgSj1rLm1pZEFuZ2xlO2lmKEMhPT1PZyl7dmFyIEw9ay5jb21wdXRlQW5nbGUodixDLEopO3YuemM9TDt9TD15LngtbS54O3ZhciBVPXkueS1tLnk7fWVsc2V7TD0wO2lmKDA8PXope1U9bi5OKHopO3ZhciBRPXo8Zi0xP24uTih6KzEpOlU7fWVsc2UgTD1mK3osVT1uLk4oTCksUT0wPEw/bi5OKEwtMSk6VTtpZihVLlFhKFEpKXswPD16PyhKPTA8ej9uLk4oei0xKTpVLEw9ejxmLTI/bi5OKHorMik6USk6KEo9TDxmLTE/bi5OKEwrMSk6VSxMPTE8TD9uLk4oTC0yKTpRKTt2YXIgaWE9Si5CZShVKSxqYT1RLkJlKEwpO0o9aWE+amErMTA/MDw9ej9KLldhKFUpOlUuV2EoSik6amE+aWErMTA/MDw9ej9RLldhKEwpOkwuV2EoUSk6MDw9ej9KLldhKEwpOkwuV2EoSik7fWVsc2UgSj0wPD16P1UuV2EoUSk6US5XYShVKTtDIT09T2cmJihMPWsuY29tcHV0ZUFuZ2xlKHYsQyxKKSx2LnpjPUwpO0w9VS54KyhRLngtVS54KSp5LW0ueDtVPVUueSsoUS55LVUueSkqeS1tLnk7fXYubWVhc3VyZShJbmZpbml0eSxJbmZpbml0eSwwLDApO3k9di5tZWFzdXJlZEJvdW5kcztqYT12Lm5hdHVyYWxCb3VuZHM7aWE9MDt2IGluc3RhbmNlb2YgVyYmKGlhPXYuc3Ryb2tlV2lkdGgpO1E9amEud2lkdGgraWE7amE9amEuaGVpZ2h0K2lhO2gucmVzZXQoKTtoLnRyYW5zbGF0ZSgteS54LC15LnkpO2guc2NhbGUodi5zY2FsZSx2LnNjYWxlKTtoLnJvdGF0ZShDPT09T2c/di5hbmdsZTpKLFEvMixqYS8yKTtDIT09RG0mJkMhPT1FbXx8aC5yb3RhdGUoOTAsUS8yLGphLzIpO0MhPT1GbSYmQyE9PUdtfHxoLnJvdGF0ZSgtOTAsUS8yLGphLzIpO0M9PT1IbSYmKDQ1PEomJjEzNT5KfHwyMjU8SiYmMzE1PkopJiZoLnJvdGF0ZSgtSixRLzIsamEvMik7Qz1uZXcgTigwLDAsUSxqYSk7ci5UaShDLEIpO2gudGEocik7Qj0tci54K2lhLzIqdi5zY2FsZTt2PS1yLnkraWEvMip2LnNjYWxlO3UuYXNzaWduKEkpO2lzTmFOKHUueCkmJih1Lng9MDw9ej9RLzIrMzotKFEvMiszKSk7aXNOYU4odS55KSYmKHUueT0tKGphLzIrMykpO3Uucm90YXRlKEopO0wrPXUueDtVKz11Lnk7Qy5zZXQoeSk7Qy5oKEwrQixVK3YseS53aWR0aCx5LmhlaWdodCk7YS5sLnB1c2goQyk7Yi5KYyhDKTt9fWlmKG51bGwhPT1nKWZvcihkPWcubGFiZWxOb2RlcztkLm5leHQoKTspe2QudmFsdWUubWVhc3VyZShJbmZpbml0eSxJbmZpbml0eSk7fWEuaGc9YjthPWEubG9jYXRpb247YS5oKGEueCtiLngsYS55K2IueSk7c2MoZSxiLndpZHRofHwwLGIuaGVpZ2h0fHwwKTtRYy5mcmVlKGgpO0cuZnJlZShyKTtHLmZyZWUodSk7fX19fTtCbS5wcm90b3R5cGUuYXJyYW5nZT1mdW5jdGlvbihhLGIpe3ZhciBjPWIubGVuZ3RoO2lmKGEgaW5zdGFuY2VvZiBwZnx8YSBpbnN0YW5jZW9mIFMpe3ZhciBkPW51bGwsZT1udWxsLGY9bnVsbDthIGluc3RhbmNlb2YgUyYmKGU9ZD1hKTthIGluc3RhbmNlb2YgcGYmJihmPWEsZD1mLmFkb3JuZWRQYXJ0KTt2YXIgZz1hIGluc3RhbmNlb2YgcGY/bnVsbDpkLnBhdGg7aWYoMCE9PWEubC5sZW5ndGgpe3ZhciBoPWEubCxrPTA7aWYobnVsbCE9PWcmJms8YS5sLmxlbmd0aCl7dmFyIGw9aFtrXTtrKys7Zy5hcnJhbmdlKGwueC1hLmhnLngsbC55LWEuaGcueSxsLndpZHRoLGwuaGVpZ2h0KTt9Zm9yKGw9MDtsPGM7bCsrKXt2YXIgbT1iW2xdO2lmKG0hPT1nJiZrPGEubC5sZW5ndGgpe3ZhciBuPWhba107aysrO20uYXJyYW5nZShuLngtYS5oZy54LG4ueS1hLmhnLnksbi53aWR0aCxuLmhlaWdodCk7fX19Yj1kLnBvaW50cztjPWIuY291bnQ7aWYoMjw9YyYmYSBpbnN0YW5jZW9mIFMpZm9yKGQ9YS5sYWJlbE5vZGVzO2QubmV4dCgpOyl7bj1hO2c9ZC52YWx1ZTtoPWcuc2VnbWVudEluZGV4O3ZhciBwPWcuc2VnbWVudEZyYWN0aW9uO2w9Zy5hbGlnbm1lbnRGb2N1czt2YXIgcT1nLnNlZ21lbnRPcmllbnRhdGlvbjtrPWcuc2VnbWVudE9mZnNldDtpZihoPC1jfHxoPj1jKXt2YXIgcj1uLm1pZFBvaW50O209bi5taWRBbmdsZTtxIT09T2cmJihuPW4uY29tcHV0ZUFuZ2xlKGcscSxtKSxnLmFuZ2xlPW4pO249ci54O3ZhciB1PXIueTt9ZWxzZXt2YXIgeD0wOzA8PWg/KHU9Yi5qW2hdLHI9aDxjLTE/Yi5qW2grMV06dSk6KHg9YytoLHU9Yi5qW3hdLHI9MDx4P2Iualt4LTFdOnUpO2lmKHUuUWEocikpezA8PWg/KG09MDxoP2IualtoLTFdOnUseD1oPGMtMj9iLmpbaCsyXTpyKToobT14PGMtMT9iLmpbeCsxXTp1LHg9MTx4P2Iualt4LTJdOnIpO3ZhciB2PW0uQmUodSkseT1yLkJlKHgpO209dj55KzEwPzA8PWg/bS5XYSh1KTp1LldhKG0pOnk+disxMD8wPD1oP3IuV2EoeCk6eC5XYShyKTowPD1oP20uV2EoeCk6eC5XYShtKTt9ZWxzZSBtPTA8PWg/dS5XYShyKTpyLldhKHUpO3EhPT1PZyYmKG49bi5jb21wdXRlQW5nbGUoZyxxLG0pLGcuYW5nbGU9bik7bj11LngrKHIueC11LngpKnA7dT11LnkrKHIueS11LnkpKnA7fWwuZXQoKT9nLmxvY2F0aW9uPW5ldyBHKG4sdSk6KGwuamMoKSYmKGw9ZGQpLHI9UWMuYWxsb2MoKSxyLnJlc2V0KCksci5zY2FsZShnLnNjYWxlLGcuc2NhbGUpLHIucm90YXRlKGcuYW5nbGUsMCwwKSxwPWcubmF0dXJhbEJvdW5kcyxwPU4uYWxsb2NBdCgwLDAscC53aWR0aCxwLmhlaWdodCkscT1HLmFsbG9jKCkscS5UaShwLGwpLHIudGEocSksbD0tcS54LHg9LXEueSxrPWsuY29weSgpLGlzTmFOKGsueCkmJigwPD1oP2sueD1xLngrMzprLng9LShxLngrMykpLGlzTmFOKGsueSkmJihrLnk9LShxLnkrMykpLGsucm90YXRlKG0pLG4rPWsueCx1Kz1rLnksci5VdihwKSxsKz1wLngseCs9cC55LGg9Ry5hbGxvY0F0KG4rbCx1K3gpLGcubW92ZShoKSxHLmZyZWUoaCksRy5mcmVlKHEpLE4uZnJlZShwKSxRYy5mcmVlKHIpKTt9bnVsbCE9PWY/Zi5nayghMSk6bnVsbCE9PWUmJmUuZ2soITEpO319O2Z1bmN0aW9uIENtKGEsYixjLGQpe2lmKCExIT09b2ooZCkpe3ZhciBlPWQuc3Ryb2tlV2lkdGg7MD09PWUmJmEgaW5zdGFuY2VvZiBwZiYmYS50eXBlPT09WC5MaW5rJiZhLmFkb3JuZWRPYmplY3QgaW5zdGFuY2VvZiBXJiYoZT1hLmFkb3JuZWRPYmplY3Quc3Ryb2tlV2lkdGgpO2UqPWQuQ2E7YSBpbnN0YW5jZW9mIFMmJm51bGwhPT1hLnFhPyhhPWEucWEuYm91bmRzLFprKGQsYS54LWUvMixhLnktZS8yLGEud2lkdGgrZSxhLmhlaWdodCtlKSk6YSBpbnN0YW5jZW9mIHBmJiZudWxsIT09YS5hZG9ybmVkUGFydC5xYT8oYT1hLmFkb3JuZWRQYXJ0LnFhLmJvdW5kcyxaayhkLGEueC1lLzIsYS55LWUvMixhLndpZHRoK2UsYS5oZWlnaHQrZSkpOlprKGQsLShlLzIpLC0oZS8yKSxiK2UsYytlKTtqaihkLCExKTt9fWZ1bmN0aW9uIEltKCl7dGhpcy5uYW1lPSJCYXNlIjt0aGlzLm5hbWU9IkdyYWR1YXRlZCI7fW9hKEltLEVsKTtJbS5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD1hLnpiKCk7YS5oaj1bXTt2YXIgaz1oLm1hcmdpbixsPWsucmlnaHQray5sZWZ0LG09ay50b3Aray5ib3R0b207aC5tZWFzdXJlKGIsYyxmLGcpO3ZhciBuPWgubWVhc3VyZWRCb3VuZHMscD1uZXcgTigtay5sZWZ0LC1rLnRvcCxNYXRoLm1heChuLndpZHRoK2wsMCksTWF0aC5tYXgobi5oZWlnaHQrbSwwKSk7YS5oai5wdXNoKHApO2UuYXNzaWduKHApO2Zvcih2YXIgcT1oLmdlb21ldHJ5LHI9aC5zdHJva2VXaWR0aCx1PXEuZmxhdHRlbmVkU2VnbWVudHMseD1xLmZsYXR0ZW5lZExlbmd0aHMsdj1xLmZsYXR0ZW5lZFRvdGFsTGVuZ3RoLHk9dS5sZW5ndGgsej0wLEI9MCxDPUthKCksST0wO0k8eTtJKyspe3ZhciBKPXVbSV0sTD1bXTtCPXo9MDtmb3IodmFyIFU9Si5sZW5ndGgsUT0wO1E8VTtRKz0yKXt2YXIgaWE9SltRXSxqYT1KW1ErMV07aWYoMCE9PVEpe3ZhciBNPTE4MCpNYXRoLmF0YW4yKGphLUIsaWEteikvTWF0aC5QSTswPk0mJihNKz0zNjApO0wucHVzaChNKTt9ej1pYTtCPWphO31DLnB1c2goTCk7fWlmKG51bGw9PT1hLk1nKXtmb3IodmFyIFI9W10sQWE9YS5ZLmosb2I9QWEubGVuZ3RoLEhhPTA7SGE8b2I7SGErKyl7dmFyIERhPUFhW0hhXSxGYT1bXTtSLnB1c2goRmEpO2lmKERhLnZpc2libGUpZm9yKHZhciBSYT1EYS5pbnRlcnZhbCxVYj0wO1ViPG9iO1ViKyspe3ZhciAkYT1BYVtVYl07aWYoJGEudmlzaWJsZSYmRGEhPT0kYSYmIShEYSBpbnN0YW5jZW9mIFcmJiEoJGEgaW5zdGFuY2VvZiBXKXx8RGEgaW5zdGFuY2VvZiB2aCYmISgkYSBpbnN0YW5jZW9mIHZoKSkpe3ZhciBYYT0kYS5pbnRlcnZhbDtYYT5SYSYmRmEucHVzaChYYSk7fX19YS5NZz1SO312YXIgTWE9YS5NZzt2YXIgZmE9YS5ZLmosZWE9ZmEubGVuZ3RoLGhiPTAsamI9MCxOYT12O2Euamo9W107Zm9yKHZhciBlZSxMZD0wO0xkPGVhO0xkKyspe3ZhciB2Yj1mYVtMZF07ZWU9W107aWYodmIudmlzaWJsZSYmdmIhPT1oKXt2YXIgemY9dmIuaW50ZXJ2YWwsRWI9YS5ncmFkdWF0ZWRUaWNrVW5pdDtpZighKDI+RWIqemYqdi9hLmdyYWR1YXRlZFJhbmdlKSl7dmFyIHFlPXhbMF1bMF0sV2M9MCxWYj0wO2piPXYqdmIuZ3JhZHVhdGVkU3RhcnQtMUUtNDtOYT12KnZiLmdyYWR1YXRlZEVuZCsxRS00O3ZhciBNZD1FYip6ZixFYz1hLmdyYWR1YXRlZFRpY2tCYXNlO2lmKEVjPGEuZ3JhZHVhdGVkTWluKXt2YXIgSWU9KGEuZ3JhZHVhdGVkTWluLUVjKS9NZDtJZT0wPT09SWUlMT9JZTpNYXRoLmZsb29yKEllKzEpO0VjKz1JZSpNZDt9ZWxzZSBFYz5hLmdyYWR1YXRlZE1pbitNZCYmKEVjLT1NYXRoLmZsb29yKChFYy1hLmdyYWR1YXRlZE1pbikvTWQpKk1kKTtmb3IodmFyIEplPU1hW0xkXTtFYzw9YS5ncmFkdWF0ZWRNYXg7KXthOntmb3IodmFyIEFmPUplLmxlbmd0aCxnZj0wO2dmPEFmO2dmKyspe2lmKEguY2EoKEVjLWEuZ3JhZHVhdGVkVGlja0Jhc2UpJShKZVtnZl0qYS5ncmFkdWF0ZWRUaWNrVW5pdCksMCkpe3ZhciBCZj0hMTticmVhayBhO319QmY9ITA7fWlmKEJmJiYobnVsbD09PXZiLmdyYWR1YXRlZFNraXB8fCF2Yi5ncmFkdWF0ZWRTa2lwKEVjKSkmJihoYj0oRWMtYS5ncmFkdWF0ZWRNaW4pKnYvYS5ncmFkdWF0ZWRSYW5nZSxoYj52JiYoaGI9diksamI8PWhiJiZoYjw9TmEpKXtmb3IodmFyIFdiPUNbV2NdW1ZiXSxZYT14W1djXVtWYl07V2M8eC5sZW5ndGg7KXtmb3IoO2hiPnFlJiZWYjx4W1djXS5sZW5ndGgtMTspe1ZiKyssV2I9Q1tXY11bVmJdLFlhPXhbV2NdW1ZiXSxxZSs9WWE7fWlmKGhiPD1xZSlicmVhaztXYysrO1ZiPTA7V2I9Q1tXY11bVmJdO1lhPXhbV2NdW1ZiXTtxZSs9WWE7fXZhciBhYj11W1djXSxMYz1hYlsyKlZiXSxDZj1hYlsyKlZiKzFdLGpjPShoYi0ocWUtWWEpKS9ZYSxOZD1uZXcgRyhMYysoYWJbMipWYisyXS1MYykqamMrci8yLXEuYm91bmRzLngsQ2YrKGFiWzIqVmIrM10tQ2YpKmpjK3IvMi1xLmJvdW5kcy55KTtOZC5zY2FsZShoLnNjYWxlLGguc2NhbGUpO3ZhciBxYz1XYixPZD1DW1djXTsxRS00PmpjPzA8VmI/cWM9T2RbVmItMV06SC5jYShhYlswXSxhYlthYi5sZW5ndGgtMl0pJiZILmNhKGFiWzFdLGFiW2FiLmxlbmd0aC0xXSkmJihxYz1PZFtPZC5sZW5ndGgtMV0pOi45OTk5PGpjJiYoVmIrMTxPZC5sZW5ndGg/cWM9T2RbVmIrMV06SC5jYShhYlswXSxhYlthYi5sZW5ndGgtMl0pJiZILmNhKGFiWzFdLGFiW2FiLmxlbmd0aC0xXSkmJihxYz1PZFswXSkpO1diIT09cWMmJigxODA8TWF0aC5hYnMoV2ItcWMpJiYoV2I8cWM/V2IrPTM2MDpxYys9MzYwKSxXYj0oV2IrcWMpLzIlMzYwKTtpZih2YiBpbnN0YW5jZW9mIHZoKXt2YXIgWGI9IiI7bnVsbCE9PXZiLmdyYWR1YXRlZEZ1bmN0aW9uPyhYYj12Yi5ncmFkdWF0ZWRGdW5jdGlvbihFYyksWGI9bnVsbCE9PVhiJiZ2b2lkIDAhPT1YYj9YYi50b1N0cmluZygpOiIiKTpYYj0oK0VjLnRvRml4ZWQoMikpLnRvU3RyaW5nKCk7IiIhPT1YYiYmZWUucHVzaChbTmQsV2IsWGJdKTt9ZWxzZSBlZS5wdXNoKFtOZCxXYl0pO31FYys9TWQ7fX19YS5qai5wdXNoKGVlKTt9T2EoQyk7Zm9yKHZhciBDaD1hLmpqLERoPWQubGVuZ3RoLEtlPTA7S2U8RGg7S2UrKyl7dmFyIHBiPWRbS2VdLERmPUNoW0tlXTtpZihwYi52aXNpYmxlJiZwYiE9PWgmJjAhPT1EZi5sZW5ndGgpe2lmKHBiIGluc3RhbmNlb2YgVyl7dmFyIExlPWEsWWI9ZSxNZT1wYi5hbGlnbm1lbnRGb2N1cztNZS5qYygpJiYoTWU9VWMpO3ZhciBNYz1wYi5hbmdsZTtwYi56Yz0wO3BiLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHksMCwwKTtwYi56Yz1NYzt2YXIgZWI9cGIubWVhc3VyZWRCb3VuZHMsTmU9ZWIud2lkdGgscmI9ZWIuaGVpZ2h0LHJjPU4uYWxsb2NBdCgwLDAsTmUscmIpLGtiPUcuYWxsb2MoKTtrYi5UaShyYyxNZSk7Ti5mcmVlKHJjKTtmb3IodmFyIFhjPS1rYi54LFljPS1rYi55LHhkPW5ldyBOKCksQWc9RGYubGVuZ3RoLEVmPTA7RWY8QWc7RWYrKyl7Zm9yKHZhciBGZj1EZltFZl0saGY9RmZbMF0ueCxrZD1GZlswXS55LFBkPUZmWzFdLGxkPTA7ND5sZDtsZCsrKXtzd2l0Y2gobGQpe2Nhc2UgMDprYi5oKFhjLFljKTticmVhaztjYXNlIDE6a2IuaChYYytOZSxZYyk7YnJlYWs7Y2FzZSAyOmtiLmgoWGMsWWMrcmIpO2JyZWFrO2Nhc2UgMzprYi5oKFhjK05lLFljK3JiKTt9a2Iucm90YXRlKFBkK3BiLmFuZ2xlKTtrYi5vZmZzZXQoaGYsa2QpOzA9PT1FZiYmMD09PWxkP3hkLmgoa2IueCxrYi55LDAsMCk6eGQuSWUoa2IpO2tiLm9mZnNldCgtaGYsLWtkKTtrYi5yb3RhdGUoLVBkLXBiLmFuZ2xlKTt9fUcuZnJlZShrYik7TGUuaGoucHVzaCh4ZCk7QmMoWWIseGQueCx4ZC55LHhkLndpZHRoLHhkLmhlaWdodCk7fWVsc2UgaWYocGIgaW5zdGFuY2VvZiB2aCl7dmFyIG1kPWEsbmI9ZTtudWxsPT09bWQua2gmJihtZC5raD1uZXcgdmgoKSk7dmFyIGZiPW1kLmtoO0ptKGZiLHBiKTt2YXIgbmQ9cGIuYWxpZ25tZW50Rm9jdXM7bmQuamMoKSYmKG5kPVVjKTtmb3IodmFyIFpjPXBiLnNlZ21lbnRPcmllbnRhdGlvbixvZD1wYi5zZWdtZW50T2Zmc2V0LHZjPW51bGwsQmE9MCwkYz0wLFpiPTAsZmU9MCxPZT1EZi5sZW5ndGgsZ2U9MDtnZTxPZTtnZSsrKXt2YXIgd2M9RGZbZ2VdO0JhPXdjWzBdLng7JGM9d2NbMF0ueTtaYj13Y1sxXTtaYyE9PU9nJiYoZmU9Uy5jb21wdXRlQW5nbGUoWmMsWmIpLGZiLnpjPWZlKTtmYi50ZXh0PXdjWzJdO2ZiLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHksMCwwKTt2YXIgcmU9ZmIubWVhc3VyZWRCb3VuZHMsYWQ9ZmIubmF0dXJhbEJvdW5kcyx3Yj1hZC53aWR0aCxRZD1hZC5oZWlnaHQsTWI9UWMuYWxsb2MoKTtNYi5yZXNldCgpO01iLnRyYW5zbGF0ZSgtcmUueCwtcmUueSk7TWIuc2NhbGUoZmIuc2NhbGUsZmIuc2NhbGUpO01iLnJvdGF0ZShaYz09PU9nP2ZiLmFuZ2xlOlpiLHdiLzIsUWQvMik7WmMhPT1EbSYmWmMhPT1FbXx8TWIucm90YXRlKDkwLHdiLzIsUWQvMik7WmMhPT1GbSYmWmMhPT1HbXx8TWIucm90YXRlKC05MCx3Yi8yLFFkLzIpO1pjPT09SG0mJig0NTxaYiYmMTM1PlpifHwyMjU8WmImJjMxNT5aYikmJk1iLnJvdGF0ZSgtWmIsd2IvMixRZC8yKTt2YXIgc2U9Ti5hbGxvY0F0KDAsMCx3YixRZCkseWQ9Ry5hbGxvYygpO3lkLlRpKHNlLG5kKTtNYi50YSh5ZCk7dmFyIGhlPS15ZC54LEJnPS15ZC55LGJkPUcuYWxsb2MoKTtiZC5hc3NpZ24ob2QpO2lzTmFOKGJkLngpJiYoYmQueD13Yi8yKzMpO2lzTmFOKGJkLnkpJiYoYmQueT0tKFFkLzIrMykpO2JkLnJvdGF0ZShaYik7QmErPWJkLngraGU7JGMrPWJkLnkrQmc7dmFyIFBlPW5ldyBOKEJhLCRjLHJlLndpZHRoLHJlLmhlaWdodCksQ2c9bmV3IE4ocmUueCxyZS55LHJlLndpZHRoLHJlLmhlaWdodCksR2Y9bmV3IE4oYWQueCxhZC55LGFkLndpZHRoLGFkLmhlaWdodCksUWU9bmV3IEttKCk7UWUuVmwoZmIubWV0cmljcyk7d2MucHVzaChmZSk7d2MucHVzaChmYi5saW5lQ291bnQpO3djLnB1c2goUWUpO3djLnB1c2goUGUpO3djLnB1c2goQ2cpO3djLnB1c2goR2YpOzA9PT1nZT92Yz1QZS5jb3B5KCk6dmMuSmMoUGUpO0cuZnJlZShiZCk7Ry5mcmVlKHlkKTtOLmZyZWUoc2UpO1FjLmZyZWUoTWIpO31tZC5oai5wdXNoKHZjKTtCYyhuYix2Yy54LHZjLnksdmMud2lkdGgsdmMuaGVpZ2h0KTt9amoocGIsITEpO319fTtJbS5wcm90b3R5cGUuYXJyYW5nZT1mdW5jdGlvbihhLGIsYyl7aWYobnVsbCE9PWEuaGope3ZhciBkPWEuemIoKSxlPWEuamosZj1hLmhqLGc9MCxoPWZbZ107ZysrO2QuYXJyYW5nZShoLngtYy54LGgueS1jLnksaC53aWR0aCxoLmhlaWdodCk7Zm9yKHZhciBrPWIubGVuZ3RoLGw9MDtsPGs7bCsrKXt2YXIgbT1iW2xdO2g9ZVtsXTttLnZpc2libGUmJm0hPT1kJiYwIT09aC5sZW5ndGgmJihoPWZbZ10sZysrLG0uYXJyYW5nZShoLngtYy54LGgueS1jLnksaC53aWR0aCxoLmhlaWdodCkpO31hLmhqPW51bGw7fX07ZnVuY3Rpb24gWChhKXtZLmNhbGwodGhpcyk7dGhpcy52YT12b2lkIDA9PT1hP1guUG9zaXRpb246YTtudWxsPT09dGhpcy52YSYmQSgiUGFuZWwgdHlwZSBub3Qgc3BlY2lmaWVkIG9yIFBhbmVsTGF5b3V0IG5vdCBsb2FkZWQ6ICIrYSk7dGhpcy5ZPW5ldyBFKCk7dGhpcy5lYj1PYzt0aGlzLnZhPT09WC5HcmlkJiYodGhpcy5pc0F0b21pYz0hMCk7dGhpcy5ubj1FZDt0aGlzLkRmPUxrO3RoaXMudmE9PT1YLlRhYmxlJiZMbSh0aGlzKTt0aGlzLkZwPWFoO3RoaXMuTG49a2M7dGhpcy5Nbj1hYzt0aGlzLkluPTA7dGhpcy5Ibj0xMDA7dGhpcy5Lbj0xMDt0aGlzLkpuPTA7dGhpcy5RaD10aGlzLmpiPXRoaXMuTWc9dGhpcy5oaj10aGlzLmpqPW51bGw7dGhpcy5abj1OYU47dGhpcy5qZT10aGlzLmVpPW51bGw7dGhpcy5nbD0iY2F0ZWdvcnkiO3RoaXMuRWQ9bnVsbDt0aGlzLmhnPW5ldyBOKE5hTixOYU4sTmFOLE5hTik7dGhpcy5raD10aGlzLmNwPXRoaXMudGk9bnVsbDt0aGlzLnlnPSIiO31vYShYLFkpO2Z1bmN0aW9uIExtKGEpe2EuZGo9T2M7YS5HZz0xO2EuVmg9bnVsbDthLlVoPW51bGw7YS5GZz0xO2EuRWc9bnVsbDthLlRoPW51bGw7YS5zYj1bXTthLm5iPVtdO2EuRmo9TW07YS5iaj1NbTthLndpPTA7YS5naT0wO31YLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZD1mdW5jdGlvbihhKXtZLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZC5jYWxsKHRoaXMsYSk7YS52YT10aGlzLnZhO2EuZWI9dGhpcy5lYi5JKCk7YS5ubj10aGlzLm5uLkkoKTthLkRmPXRoaXMuRGY7aWYoYS52YT09PVguVGFibGUpe2EuZGo9dGhpcy5kai5JKCk7YS5HZz10aGlzLkdnO2EuVmg9dGhpcy5WaDthLlVoPXRoaXMuVWg7YS5GZz10aGlzLkZnO2EuRWc9dGhpcy5FZzthLlRoPXRoaXMuVGg7dmFyIGI9W107aWYoMDx0aGlzLnNiLmxlbmd0aClmb3IodmFyIGM9dGhpcy5zYixkPWMubGVuZ3RoLGU9MDtlPGQ7ZSsrKXtpZih2b2lkIDAhPT1jW2VdKXt2YXIgZj1jW2VdLmNvcHkoKTtmLlNpKGEpO2JbZV09Zjt9fWEuc2I9YjtiPVtdO2lmKDA8dGhpcy5uYi5sZW5ndGgpZm9yKGM9dGhpcy5uYixkPWMubGVuZ3RoLGU9MDtlPGQ7ZSsrKXt2b2lkIDAhPT1jW2VdJiYoZj1jW2VdLmNvcHkoKSxmLlNpKGEpLGJbZV09Zik7fWEubmI9YjthLkZqPXRoaXMuRmo7YS5iaj10aGlzLmJqO2Eud2k9dGhpcy53aTthLmdpPXRoaXMuZ2k7fWEuRnA9dGhpcy5GcDthLkxuPXRoaXMuTG4uSSgpO2EuTW49dGhpcy5Nbi5JKCk7YS5Jbj10aGlzLkluO2EuSG49dGhpcy5IbjthLktuPXRoaXMuS247YS5Kbj10aGlzLkpuO2Euamo9dGhpcy5qajthLk1nPXRoaXMuTWc7YS5qYj10aGlzLmpiO2EuUWg9dGhpcy5RaDthLlpuPXRoaXMuWm47YS5laT10aGlzLmVpO2EuamU9dGhpcy5qZTthLmdsPXRoaXMuZ2w7YS5oZy5hc3NpZ24odGhpcy5oZyk7YS55Zz10aGlzLnlnO251bGwhPT10aGlzLmNwJiYoYS5jcD10aGlzLmNwKTt9O1gucHJvdG90eXBlLm1mPWZ1bmN0aW9uKGEpe1kucHJvdG90eXBlLm1mLmNhbGwodGhpcyxhKTthLlk9dGhpcy5ZO2Zvcih2YXIgYj1hLlkuaixjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtiW2RdLmFnPWE7fWEudGk9bnVsbDt9O1gucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1ZLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyk7aWYobnVsbCE9PWEpe2Zvcih2YXIgYj10aGlzLlkuaixjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXt2YXIgZT1iW2RdLmNvcHkoKTtlLlNpKGEpO2UuQWo9bnVsbDt2YXIgZj1hLlksZz1mLmNvdW50O2YuSWIoZyxlKTtmPWEucGFydDtpZihudWxsIT09Zil7Zi52aj1udWxsO251bGwhPT1lLnBvcnRJZCYmZiBpbnN0YW5jZW9mIFYmJihmLnhoPSEwKTt2YXIgaD1hLmRpYWdyYW07bnVsbCE9PWgmJmgudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8Zi5hYihjZiwiZWxlbWVudHMiLGEsbnVsbCxlLG51bGwsZyk7fX1yZXR1cm4gYTt9cmV0dXJuIG51bGw7fTt0PVgucHJvdG90eXBlO3QudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUGFuZWwoIit0aGlzLnR5cGUrIikjIitCYih0aGlzKTt9O3QuRG89ZnVuY3Rpb24oYSl7WS5wcm90b3R5cGUuRG8uY2FsbCh0aGlzLGEpO2Zvcih2YXIgYj10aGlzLlkuaixjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtiW2RdLkRvKGEpO319O3QuQ2k9ZnVuY3Rpb24oYSxiKXtpZih0aGlzLnZhPT09WC5HcmlkKXtiPXRoaXMuQ2UoKSpiLnNjYWxlOzA+PWImJihiPTEpO3ZhciBjPXRoaXMuZ3JpZENlbGxTaXplLGQ9Yy53aWR0aDtjPWMuaGVpZ2h0O3ZhciBlPXRoaXMubmF0dXJhbEJvdW5kcyxmPXRoaXMuYWN0dWFsQm91bmRzLGc9ZS53aWR0aCxoPWUuaGVpZ2h0LGs9TWF0aC5jZWlsKGcvZCksbD1NYXRoLmNlaWwoaC9jKSxtPXRoaXMuZ3JpZE9yaWdpbjthLnNhdmUoKTthLmJlZ2luUGF0aCgpO2EucmVjdCgwLDAsZyxoKTthLmNsaXAoKTtmb3IodmFyIG49W10scD10aGlzLlkuaixxPXAubGVuZ3RoLHI9MDtyPHE7cisrKXt2YXIgdT1wW3JdLHg9W107bi5wdXNoKHgpO2lmKHUudmlzaWJsZSl7dT1Taih1LmZpZ3VyZSk7Zm9yKHZhciB2PXIrMTt2PHE7disrKXt2YXIgeT1wW3ZdO3kudmlzaWJsZSYmU2ooeS5maWd1cmUpPT09dSYmKHk9eS5pbnRlcnZhbCwyPD15JiZ4LnB1c2goeSkpO319fXA9dGhpcy5ZLmo7cT1wLmxlbmd0aDtmb3Iocj0wO3I8cTtyKyspe3ZhciB6PXBbcl07aWYoei52aXNpYmxlJiYoeD16LmludGVydmFsLCEoMj5kKngqYikpKXt1PXoub3BhY2l0eTt2PTE7aWYoMSE9PXUpe2lmKDA9PT11KWNvbnRpbnVlO3Y9YS5nbG9iYWxBbHBoYTthLmdsb2JhbEFscGhhPXYqdTt9eT1uW3JdO3ZhciBCPSExLEM9ei5zdHJva2VEYXNoQXJyYXk7bnVsbCE9PUMmJihCPSEwLGEuUHMoQyx6LnN0cm9rZURhc2hPZmZzZXQpKTtpZigiTGluZVYiPT09ei5maWd1cmUmJm51bGwhPT16LnN0cm9rZSl7YS5saW5lV2lkdGg9ei5zdHJva2VXaWR0aDtqaSh0aGlzLGEsei5zdHJva2UsITEsITEsZSxmKTthLmJlZ2luUGF0aCgpO2ZvcihDPXo9TWF0aC5mbG9vcigtbS54L2QpO0M8PXoraztDKyspe3ZhciBJPUMqZCttLng7MDw9SSYmSTw9ZyYmTm0oQyx4LHkpJiYoYS5tb3ZlVG8oSSwwKSxhLmxpbmVUbyhJLGgpKTt9YS5zdHJva2UoKTt9ZWxzZSBpZigiTGluZUgiPT09ei5maWd1cmUmJm51bGwhPT16LnN0cm9rZSl7YS5saW5lV2lkdGg9ei5zdHJva2VXaWR0aDtqaSh0aGlzLGEsei5zdHJva2UsITEsITEsZSxmKTthLmJlZ2luUGF0aCgpO2ZvcihDPXo9TWF0aC5mbG9vcigtbS55L2MpO0M8PXorbDtDKyspe0k9QypjK20ueSwwPD1JJiZJPD1oJiZObShDLHgseSkmJihhLm1vdmVUbygwLEkpLGEubGluZVRvKGcsSSkpO31hLnN0cm9rZSgpO31lbHNlIGlmKCJCYXJWIj09PXouZmlndXJlJiZudWxsIT09ei5maWxsKWZvcihqaSh0aGlzLGEsei5maWxsLCEwLCExLGUsZiksej16LndpZHRoLGlzTmFOKHopJiYoej1kKSxJPUM9TWF0aC5mbG9vcigtbS54L2QpO0k8PUMraztJKyspe3ZhciBKPUkqZCttLng7MDw9SiYmSjw9ZyYmTm0oSSx4LHkpJiZhLmZpbGxSZWN0KEosMCx6LGgpO31lbHNlIGlmKCJCYXJIIj09PXouZmlndXJlJiZudWxsIT09ei5maWxsKWZvcihqaSh0aGlzLGEsei5maWxsLCEwLCExLGUsZiksej16LmhlaWdodCxpc05hTih6KSYmKHo9YyksST1DPU1hdGguZmxvb3IoLW0ueS9jKTtJPD1DK2w7SSsrKXtKPUkqYyttLnksMDw9SiYmSjw9aCYmTm0oSSx4LHkpJiZhLmZpbGxSZWN0KDAsSixnLHopO31CJiZhLk5zKCk7MSE9PXUmJihhLmdsb2JhbEFscGhhPXYpO319YS5yZXN0b3JlKCk7YS5SYyghMSk7fWVsc2UgaWYodGhpcy52YT09PVguR3JhZHVhdGVkKXtkPWIubWo7Yi5taj0hMDtlPXRoaXMubmF0dXJhbEJvdW5kcztjPWUud2lkdGg7ZT1lLmhlaWdodDthLnNhdmUoKTthLmJlZ2luUGF0aCgpO2EucmVjdCgtMSwtMSxjKzEsZSsxKTthLmNsaXAoKTtjPXRoaXMuemIoKTtjLmhjKGEsYik7ZT10aGlzLkNlKCkqYi5zY2FsZTswPj1lJiYoZT0xKTtmPWMuYWN0dWFsQm91bmRzO2c9dGhpcy5ZLmo7aD10aGlzLmpqO2s9Zy5sZW5ndGg7Zm9yKGw9MDtsPGs7bCsrKXtpZihwPWdbbF0sbT1oW2xdLG49bS5sZW5ndGgscC52aXNpYmxlJiZwIT09YyYmMCE9PW0ubGVuZ3RoKWlmKHAgaW5zdGFuY2VvZiBXKXtpZighKDI+dGhpcy5ncmFkdWF0ZWRUaWNrVW5pdCpwLmludGVydmFsKmUpKWZvcihxPXAubWVhc3VyZWRCb3VuZHMscj1wLnN0cm9rZVdpZHRoKnAuc2NhbGUseD1wLmFsaWdubWVudEZvY3VzLHguamMoKSYmKHg9VWMpLHU9MDt1PG47dSsrKXt2PW1bdV1bMF0seT1tW3VdWzFdLEI9eCx6PXAudGIsei5yZXNldCgpLHoudHJhbnNsYXRlKHYueCtmLngsdi55K2YueSksei5yb3RhdGUoeStwLmFuZ2xlLDAsMCksei50cmFuc2xhdGUoLXEud2lkdGgqQi54K0Iub2Zmc2V0WCtyLzIsLXEuaGVpZ2h0KkIueStCLm9mZnNldFkrci8yKSx6LnNjYWxlKHAuc2NhbGUscC5zY2FsZSkscmwocCwhMSkscC5EaC5zZXQocC50YikscC5Taz1wLnNjYWxlLHNsKHAsITEpLHAuaGMoYSxiKSxwLnRiLnJlc2V0KCk7fX1lbHNlIGlmKHAgaW5zdGFuY2VvZiB2aClmb3IobnVsbD09PXRoaXMua2gmJih0aGlzLmtoPW5ldyB2aCgpKSxxPXRoaXMua2gsSm0ocSxwKSxwPTA7cDxuO3ArKyl7dT1tW3BdLDM8dS5sZW5ndGgmJihyPXVbNl0scS5QYj11WzJdLHEuemM9dVszXSxxLm9jPXVbNF0scS5uZD11WzVdLHEucWM9dVs4XSxxLmFycmFuZ2Uoci54LHIueSxyLndpZHRoLHIuaGVpZ2h0KSxyPXVbNl0scS5hcnJhbmdlKHIueCxyLnksci53aWR0aCxyLmhlaWdodCkseD11WzddLHU9dVs4XSx2PXEudGIsdi5yZXNldCgpLHYudHJhbnNsYXRlKHIueCtmLngsci55K2YueSksdi50cmFuc2xhdGUoLXgueCwteC55KSwkayhxLHYsdS54LHUueSx1LndpZHRoLHUuaGVpZ2h0KSxybChxLCExKSxxLkRoLnNldChxLnRiKSxxLlNrPXEuc2NhbGUsc2wocSwhMSkscS5oYyhhLGIpKTt9fWIubWo9ZDthLnJlc3RvcmUoKTthLlJjKCEwKTt9ZWxzZXt0aGlzLnZhPT09WC5UYWJsZSYmKGEubGluZUNhcD0iYnV0dCIsT20odGhpcyxhLCEwLHRoaXMuc2IsITApLE9tKHRoaXMsYSwhMSx0aGlzLm5iLCEwKSxQbSh0aGlzLGEsITAsdGhpcy5zYiksUG0odGhpcyxhLCExLHRoaXMubmIpLE9tKHRoaXMsYSwhMCx0aGlzLnNiLCExKSxPbSh0aGlzLGEsITEsdGhpcy5uYiwhMSkpOyhkPXRoaXMuaXNDbGlwcGluZykmJmEuc2F2ZSgpO2M9dGhpcy56YigpO2U9dGhpcy5ZLmo7Zj1lLmxlbmd0aDtmb3IoZz0wO2c8ZjtnKyspe2g9ZVtnXSxkJiZoPT09YyYmKGEuY2xpcEluc3RlYWRPZkZpbGw9ITApLGguaGMoYSxiKSxkJiZoPT09YyYmKGEuY2xpcEluc3RlYWRPZkZpbGw9ITEpO31kJiYoYS5yZXN0b3JlKCksYS5SYyghMCkpO319O2Z1bmN0aW9uIFBtKGEsYixjLGQpe2Zvcih2YXIgZT1kLmxlbmd0aCxmPWEuYWN0dWFsQm91bmRzLGc9YS5uYXR1cmFsQm91bmRzLGg9ITAsaz0wO2s8ZTtrKyspe3ZhciBsPWRba107aWYodm9pZCAwIT09bClpZihoKWg9ITE7ZWxzZSBpZigwIT09bC5hY3R1YWwpe2lmKGMpe2lmKGwucG9zaXRpb24+Zi5oZWlnaHQpY29udGludWU7fWVsc2UgaWYobC5wb3NpdGlvbj5mLndpZHRoKWNvbnRpbnVlO3ZhciBtPWwuc2VwYXJhdG9yU3Ryb2tlV2lkdGg7aXNOYU4obSkmJihtPWM/YS5HZzphLkZnKTt2YXIgbj1sLnNlcGFyYXRvclN0cm9rZTtudWxsPT09biYmKG49Yz9hLlZoOmEuRWcpO2lmKDAhPT1tJiZudWxsIT09bil7amkoYSxiLG4sITEsITEsZyxmKTtuPSExO3ZhciBwPWwuc2VwYXJhdG9yRGFzaEFycmF5O251bGw9PT1wJiYocD1jP2EuVWg6YS5UaCk7bnVsbCE9PXAmJihuPSEwLGIuUHMocCwwKSk7Yi5iZWdpblBhdGgoKTtwPWwucG9zaXRpb24rbTtjP3A+Zi5oZWlnaHQmJihtLT1wLWYuaGVpZ2h0KTpwPmYud2lkdGgmJihtLT1wLWYud2lkdGgpO2w9bC5wb3NpdGlvbittLzI7Yi5saW5lV2lkdGg9bTttPWEuZWI7Yz8obCs9bS50b3AscD1mLndpZHRoLW0ucmlnaHQsYi5tb3ZlVG8obS5sZWZ0LGwpLGIubGluZVRvKHAsbCkpOihsKz1tLmxlZnQscD1mLmhlaWdodC1tLmJvdHRvbSxiLm1vdmVUbyhsLG0udG9wKSxiLmxpbmVUbyhsLHApKTtiLnN0cm9rZSgpO24mJmIuTnMoKTt9fX19ZnVuY3Rpb24gT20oYSxiLGMsZCxlKXtmb3IodmFyIGY9ZC5sZW5ndGgsZz1hLmFjdHVhbEJvdW5kcyxoPWEubmF0dXJhbEJvdW5kcyxrPTA7azxmO2srKyl7dmFyIGw9ZFtrXTtpZih2b2lkIDAhPT1sJiZudWxsIT09bC5iYWNrZ3JvdW5kJiZsLmNvdmVyc1NlcGFyYXRvcnMhPT1lJiYwIT09bC5hY3R1YWwpe3ZhciBtPWM/Zy5oZWlnaHQ6Zy53aWR0aDtpZighKGwucG9zaXRpb24+bSkpe3ZhciBuPWwudGMoKSxwPWwuc2VwYXJhdG9yU3Ryb2tlV2lkdGg7aXNOYU4ocCkmJihwPWM/YS5HZzphLkZnKTt2YXIgcT1sLnNlcGFyYXRvclN0cm9rZTtudWxsPT09cSYmKHE9Yz9hLlZoOmEuRWcpO251bGw9PT1xJiYocD0wKTtuLT1wO3A9bC5wb3NpdGlvbitwO24rPWwuYWN0dWFsO3Arbj5tJiYobj1tLXApOzA+PW58fChtPWEuZWIsamkoYSxiLGwuYmFja2dyb3VuZCwhMCwhMSxoLGcpLGM/Yi5maWxsUmVjdChtLmxlZnQscCttLnRvcCxnLndpZHRoLShtLmxlZnQrbS5yaWdodCksbik6Yi5maWxsUmVjdChwK20ubGVmdCxtLnRvcCxuLGcuaGVpZ2h0LShtLnRvcCttLmJvdHRvbSkpKTt9fX19ZnVuY3Rpb24gTm0oYSxiLGMpe2lmKDAhPT1hJWIpcmV0dXJuITE7Yj1jLmxlbmd0aDtmb3IodmFyIGQ9MDtkPGI7ZCsrKXtpZigwPT09YSVjW2RdKXJldHVybiExO31yZXR1cm4hMDt9ZnVuY3Rpb24gU2ooYSl7cmV0dXJuIkxpbmVWIj09PWF8fCJCYXJWIj09PWE7fXQuYms9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj10aGlzLlpkKCksZz10aGlzLnRyYW5zZm9ybSxoPTEvKGcubTExKmcubTIyLWcubTEyKmcubTIxKSxrPWcubTIyKmgsbD0tZy5tMTIqaCxtPS1nLm0yMSpoLG49Zy5tMTEqaCxwPWgqKGcubTIxKmcuZHktZy5tMjIqZy5keCkscT1oKihnLm0xMipnLmR4LWcubTExKmcuZHkpO2lmKG51bGwhPT10aGlzLmFyZWFCYWNrZ3JvdW5kKXJldHVybiBnPXRoaXMuYWN0dWFsQm91bmRzLEguVGMoZy5sZWZ0LGcudG9wLGcucmlnaHQsZy5ib3R0b20sYSxiLGMsZCxlKTtpZihudWxsIT09dGhpcy5iYWNrZ3JvdW5kKXJldHVybiBmPWEqaytiKm0rcCxoPWEqbCtiKm4rcSxhPWMqaytkKm0rcCxrPWMqbCtkKm4rcSxlLmgoMCwwKSxjPXRoaXMubmF0dXJhbEJvdW5kcyxmPUguVGMoMCwwLGMud2lkdGgsYy5oZWlnaHQsZixoLGEsayxlKSxlLnRyYW5zZm9ybShnKSxmO2Z8fChrPTEsbT1sPTAsbj0xLHE9cD0wKTtoPWEqaytiKm0rcDthPWEqbCtiKm4rcTtrPWMqaytkKm0rcDtjPWMqbCtkKm4rcTtlLmgoayxjKTtkPShrLWgpKihrLWgpKyhjLWEpKihjLWEpO2w9ITE7bj10aGlzLlkuajtxPW4ubGVuZ3RoO209Ry5hbGxvYygpO3A9bnVsbDtiPUluZmluaXR5O3ZhciByPW51bGw7dGhpcy5pc0NsaXBwaW5nJiYocj1HLmFsbG9jKCkscD10aGlzLnpiKCksKGw9cC5iayhoLGEsayxjLHIpKSYmKGI9KGgtci54KSooaC1yLngpKyhhLXIueSkqKGEtci55KSkpO2Zvcih2YXIgdT0wO3U8cTt1Kyspe3ZhciB4PW5bdV07eC52aXNpYmxlJiZ4IT09cCYmeC5iayhoLGEsayxjLG0pJiYobD0hMCx4PShoLW0ueCkqKGgtbS54KSsoYS1tLnkpKihhLW0ueSkseDxkJiYoZD14LGUuc2V0KG0pKSk7fXRoaXMuaXNDbGlwcGluZyYmKGI+ZCYmZS5zZXQociksRy5mcmVlKHIpKTtHLmZyZWUobSk7ZiYmZS50cmFuc2Zvcm0oZyk7cmV0dXJuIGw7fTt0LnM9ZnVuY3Rpb24oYSl7WS5wcm90b3R5cGUucy5jYWxsKHRoaXMsYSk7YT1udWxsO2lmKHRoaXMudmE9PT1YLkF1dG98fHRoaXMudmE9PT1YLkxpbmspYT10aGlzLnpiKCk7Zm9yKHZhciBiPXRoaXMuWS5qLGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe3ZhciBlPWJbZF07KGU9PT1hfHxlLmlzUGFuZWxNYWluKSYmZS5zKCEwKTtpZighZS5kZXNpcmVkU2l6ZS5vKCkpe3ZhciBmPWJsKGUsITEpOyhlIGluc3RhbmNlb2YgWGd8fGUgaW5zdGFuY2VvZiBYfHxlIGluc3RhbmNlb2Ygdmh8fGYhPT1aZykmJmUucyghMCk7fX19O3QuZG09ZnVuY3Rpb24oKXtpZighMT09PW9qKHRoaXMpKXtqaih0aGlzLCEwKTtjbCh0aGlzLCEwKTtmb3IodmFyIGE9dGhpcy5ZLmosYj1hLmxlbmd0aCxjPTA7YzxiO2MrKyl7YVtjXS5kbSgpO319fTt0LmZsPWZ1bmN0aW9uKCl7aWYoMCE9PSh0aGlzLkgmMjA0OCk9PT0hMSl7cmwodGhpcywhMCk7c2wodGhpcywhMCk7Zm9yKHZhciBhPXRoaXMuWS5qLGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe2FbY10uaXYoKTt9fX07dC5pdj1mdW5jdGlvbigpe3NsKHRoaXMsITApO2Zvcih2YXIgYT10aGlzLlkuaixiPWEubGVuZ3RoLGM9MDtjPGI7YysrKXthW2NdLml2KCk7fX07dC5obT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLmhnO2UuaCgwLDAsMCwwKTt2YXIgZj10aGlzLmRlc2lyZWRTaXplLGc9dGhpcy5taW5TaXplO3ZvaWQgMD09PWMmJihjPWcud2lkdGgsZD1nLmhlaWdodCk7Yz1NYXRoLm1heChjLGcud2lkdGgpO2Q9TWF0aC5tYXgoZCxnLmhlaWdodCk7dmFyIGg9dGhpcy5tYXhTaXplO2lzTmFOKGYud2lkdGgpfHwoYT1NYXRoLm1pbihmLndpZHRoLGgud2lkdGgpKTtpc05hTihmLmhlaWdodCl8fChiPU1hdGgubWluKGYuaGVpZ2h0LGguaGVpZ2h0KSk7YT1NYXRoLm1heChjLGEpO2I9TWF0aC5tYXgoZCxiKTt2YXIgaz10aGlzLmViO2E9TWF0aC5tYXgoYS1rLmxlZnQtay5yaWdodCwwKTtiPU1hdGgubWF4KGItay50b3Atay5ib3R0b20sMCk7dmFyIGw9dGhpcy5ZLmo7MCE9PWwubGVuZ3RoJiZ0aGlzLnZhLm1lYXN1cmUodGhpcyxhLGIsbCxlLGMsZCk7YT1lLndpZHRoK2subGVmdCtrLnJpZ2h0O2s9ZS5oZWlnaHQray50b3Aray5ib3R0b207aXNGaW5pdGUoZi53aWR0aCkmJihhPWYud2lkdGgpO2lzRmluaXRlKGYuaGVpZ2h0KSYmKGs9Zi5oZWlnaHQpO2E9TWF0aC5taW4oaC53aWR0aCxhKTtrPU1hdGgubWluKGguaGVpZ2h0LGspO2E9TWF0aC5tYXgoZy53aWR0aCxhKTtrPU1hdGgubWF4KGcuaGVpZ2h0LGspO2E9TWF0aC5tYXgoYyxhKTtrPU1hdGgubWF4KGQsayk7c2MoZSxhLGspO3NjKHRoaXMubmF0dXJhbEJvdW5kcyxhLGspO1prKHRoaXMsMCwwLGEsayk7fTt0LnpiPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMudGkpe3ZhciBhPXRoaXMuWS5qLGI9YS5sZW5ndGg7aWYoMD09PWIpcmV0dXJuIG51bGw7Zm9yKHZhciBjPTA7YzxiO2MrKyl7dmFyIGQ9YVtjXTtpZighMD09PWQuaXNQYW5lbE1haW4pcmV0dXJuIHRoaXMudGk9ZDt9dGhpcy50aT1hWzBdO31yZXR1cm4gdGhpcy50aTt9O2Z1bmN0aW9uIG5tKGEpe3JldHVybiBudWxsIT09YS5wYXJ0P2EucGFydC5sb2NhdGlvbk9iamVjdDpudWxsO310LnRoPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuWS5qO3RoaXMuYWN0dWFsQm91bmRzLmgoYSxiLGMsZCk7aWYoMCE9PWUubGVuZ3RoKXtpZighdGhpcy5kZXNpcmVkU2l6ZS5vKCkpe2E9YmwodGhpcywhMCk7dmFyIGY9dGhpcy5tZWFzdXJlZEJvdW5kcztiPWYud2lkdGg7Zj1mLmhlaWdodDt2YXIgZz10aGlzLlRnLGg9Zy5sZWZ0K2cucmlnaHQ7Zz1nLnRvcCtnLmJvdHRvbTtiPT09YyYmZj09PWQmJihhPVpnKTtzd2l0Y2goYSl7Y2FzZSBaZzppZihiPmN8fGY+ZCl0aGlzLnMoKSx0aGlzLm1lYXN1cmUoYj5jP2M6YixmPmQ/ZDpmLDAsMCk7YnJlYWs7Y2FzZSBiZTp0aGlzLnMoITApO3RoaXMubWVhc3VyZShjK2gsZCtnLDAsMCk7YnJlYWs7Y2FzZSBNazp0aGlzLnMoITApO3RoaXMubWVhc3VyZShjK2gsZitnLDAsMCk7YnJlYWs7Y2FzZSBOazp0aGlzLnMoITApLHRoaXMubWVhc3VyZShiK2gsZCtnLDAsMCk7fX10aGlzLnZhLmFycmFuZ2UodGhpcyxlLHRoaXMuaGcpO319O3Qudmg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5uYXR1cmFsQm91bmRzLGM9bm0odGhpcyk7aWYoQ2MoMCwwLGIud2lkdGgsYi5oZWlnaHQsYS54LGEueSkpe2I9dGhpcy5ZLmo7Zm9yKHZhciBkPWIubGVuZ3RoLGU9Ry5hbGxvY0F0KDAsMCk7ZC0tOyl7dmFyIGY9YltkXTtpZihmLnZpc2libGV8fGY9PT1jKWlmKFFiKGUuc2V0KGEpLGYudHJhbnNmb3JtKSxmLmVhKGUpKXJldHVybiBHLmZyZWUoZSksITA7fUcuZnJlZShlKTtyZXR1cm4gbnVsbD09PXRoaXMuaWImJm51bGw9PT10aGlzLmRjPyExOiEwO31yZXR1cm4hMTt9O3QuUXM9ZnVuY3Rpb24oYSl7aWYodGhpcy5Eaz09PWEpcmV0dXJuIHRoaXM7Zm9yKHZhciBiPXRoaXMuWS5qLGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe3ZhciBlPWJbZF0uUXMoYSk7aWYobnVsbCE9PWUpcmV0dXJuIGU7fXJldHVybiBudWxsO307dC55bT1mdW5jdGlvbihhLGIpe2IodGhpcyxhKTtpZihhIGluc3RhbmNlb2YgWCl7YT1hLlkuajtmb3IodmFyIGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe3RoaXMueW0oYVtkXSxiKTt9fX07ZnVuY3Rpb24gQmooYSxiKXtRbShhLGEsYik7fWZ1bmN0aW9uIFFtKGEsYixjKXtjKGIpO2I9Yi5ZLmo7Zm9yKHZhciBkPWIubGVuZ3RoLGU9MDtlPGQ7ZSsrKXt2YXIgZj1iW2VdO2YgaW5zdGFuY2VvZiBYJiZRbShhLGYsYyk7fX1mdW5jdGlvbiBSbShhLGIpe1NtKGEsYSxiKTt9ZnVuY3Rpb24gU20oYSxiLGMpe2MoYik7aWYoYiBpbnN0YW5jZW9mIFgpe2I9Yi5ZLmo7Zm9yKHZhciBkPWIubGVuZ3RoLGU9MDtlPGQ7ZSsrKXtTbShhLGJbZV0sYyk7fX19dC5ZbD1mdW5jdGlvbihhKXtyZXR1cm4gVG0odGhpcyx0aGlzLGEpO307ZnVuY3Rpb24gVG0oYSxiLGMpe2lmKGMoYikpcmV0dXJuIGI7aWYoYiBpbnN0YW5jZW9mIFgpe2I9Yi5ZLmo7Zm9yKHZhciBkPWIubGVuZ3RoLGU9MDtlPGQ7ZSsrKXt2YXIgZj1UbShhLGJbZV0sYyk7aWYobnVsbCE9PWYpcmV0dXJuIGY7fX1yZXR1cm4gbnVsbDt9dC4kYT1mdW5jdGlvbihhKXtpZih0aGlzLm5hbWU9PT1hKXJldHVybiB0aGlzO3ZhciBiPXRoaXMuWS5qLGM9Yi5sZW5ndGg7bnVsbD09PXRoaXMuZWkmJm51bGw9PT10aGlzLmplfHwoYz1VbSh0aGlzKSk7Zm9yKHZhciBkPTA7ZDxjO2QrKyl7dmFyIGU9YltkXTtpZihlIGluc3RhbmNlb2YgWCl7dmFyIGY9ZS4kYShhKTtpZihudWxsIT09ZilyZXR1cm4gZjt9aWYoZS5uYW1lPT09YSlyZXR1cm4gZTt9cmV0dXJuIG51bGw7fTtmdW5jdGlvbiBWbShhKXthPWEuWS5qO2Zvcih2YXIgYj1hLmxlbmd0aCxjPTAsZD0wO2Q8YjtkKyspe3ZhciBlPWFbZF07aWYoZSBpbnN0YW5jZW9mIFgpYz1NYXRoLm1heChjLFZtKGUpKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBXKXthOntzd2l0Y2goZS5Wayl7Y2FzZSJOb25lIjpjYXNlIlNxdWFyZSI6Y2FzZSJFbGxpcHNlIjpjYXNlIkNpcmNsZSI6Y2FzZSJMaW5lSCI6Y2FzZSJMaW5lViI6Y2FzZSJGcmFtZWRSZWN0YW5nbGUiOmNhc2UiUm91bmRlZFJlY3RhbmdsZSI6Y2FzZSJMaW5lMSI6Y2FzZSJMaW5lMiI6Y2FzZSJCb3JkZXIiOmNhc2UiQ3ViZTEiOmNhc2UiQ3ViZTIiOmNhc2UiSnVuY3Rpb24iOmNhc2UiQ3lsaW5kZXIxIjpjYXNlIkN5bGluZGVyMiI6Y2FzZSJDeWxpbmRlcjMiOmNhc2UiQ3lsaW5kZXI0IjpjYXNlIlBsdXNMaW5lIjpjYXNlIlhMaW5lIjpjYXNlIlRoaW5Dcm9zcyI6Y2FzZSJUaGlja0Nyb3NzIjplPTA7YnJlYWsgYTt9ZT1lLmloLzIqZS5KaiplLkNlKCk7fWM9TWF0aC5tYXgoYyxlKTt9fXJldHVybiBjO310LlpkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLnR5cGU9PT1YLlRhYmxlUm93fHx0aGlzLnR5cGU9PT1YLlRhYmxlQ29sdW1uKTt9O3QuU2I9ZnVuY3Rpb24oYSxiLGMpe2lmKCExPT09dGhpcy5waWNrYWJsZSlyZXR1cm4gbnVsbDt2b2lkIDA9PT1iJiYoYj1udWxsKTt2b2lkIDA9PT1jJiYoYz1udWxsKTtpZihwaih0aGlzKSlyZXR1cm4gbnVsbDt2YXIgZD10aGlzLm5hdHVyYWxCb3VuZHMsZT0xL3RoaXMuQ2UoKSxmPXRoaXMuWmQoKSxnPWY/YTpRYihHLmFsbG9jQXQoYS54LGEueSksdGhpcy50cmFuc2Zvcm0pLGg9dGhpcy5kaWFncmFtLGs9MTAsbD01O251bGwhPT1oJiYoaz1oLmJtKCJleHRyYVRvdWNoQXJlYSIpLGw9ay8yKTtpZihDYygtKGwqZSksLShsKmUpLGQud2lkdGgrayplLGQuaGVpZ2h0K2sqZSxnLngsZy55KSl7aWYoIXRoaXMuaXNBdG9taWMpe2U9dGhpcy5ZLmo7dmFyIG09ZS5sZW5ndGg7aD1HLmFsbG9jKCk7bD0oaz10aGlzLmlzQ2xpcHBpbmcpP3RoaXMuemIoKTpudWxsO2lmKGsmJihsLlpkKCk/UWIoaC5zZXQoYSksbC50cmFuc2Zvcm0pOmguc2V0KGEpLCFsLmVhKGgpKSlyZXR1cm4gRy5mcmVlKGgpLGZ8fEcuZnJlZShnKSxudWxsO2Zvcih2YXIgbj1ubSh0aGlzKTttLS07KXt2YXIgcD1lW21dO2lmKHAudmlzaWJsZXx8cD09PW4paWYocC5aZCgpP1FiKGguc2V0KGEpLHAudHJhbnNmb3JtKTpoLnNldChhKSwha3x8cCE9PWwpe3ZhciBxPW51bGw7cCBpbnN0YW5jZW9mIFg/cT1wLlNiKGgsYixjKTohMD09PXAucGlja2FibGUmJnAuZWEoaCkmJihxPXApO2lmKG51bGwhPT1xJiYobnVsbCE9PWImJihxPWIocSkpLG51bGwhPT1xJiYobnVsbD09PWN8fGMocSkpKSlyZXR1cm4gRy5mcmVlKGgpLGZ8fEcuZnJlZShnKSxxO319Ry5mcmVlKGgpO31pZihudWxsPT09dGhpcy5iYWNrZ3JvdW5kJiZudWxsPT09dGhpcy5hcmVhQmFja2dyb3VuZClyZXR1cm4gZnx8Ry5mcmVlKGcpLG51bGw7YT1DYygwLDAsZC53aWR0aCxkLmhlaWdodCxnLngsZy55KT90aGlzOm51bGw7Znx8Ry5mcmVlKGcpO3JldHVybiBhO31mfHxHLmZyZWUoZyk7cmV0dXJuIG51bGw7fTt0LkZpPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCExPT09dGhpcy5waWNrYWJsZSlyZXR1cm4hMTt2b2lkIDA9PT1iJiYoYj1udWxsKTt2b2lkIDA9PT1jJiYoYz1udWxsKTt2YXIgZT10aGlzLm5hdHVyYWxCb3VuZHMsZj10aGlzLlpkKCksZz1mP2E6UWIoRy5hbGxvY0F0KGEueCxhLnkpLHRoaXMudHJhbnNmb3JtKTtlPUNjKDAsMCxlLndpZHRoLGUuaGVpZ2h0LGcueCxnLnkpO2lmKHRoaXMudHlwZT09PVguVGFibGVSb3d8fHRoaXMudHlwZT09PVguVGFibGVDb2x1bW58fGUpe2lmKCF0aGlzLmlzQXRvbWljKXtmb3IodmFyIGg9dGhpcy5ZLmosaz1oLmxlbmd0aCxsPUcuYWxsb2MoKSxtPW5tKHRoaXMpO2stLTspe3ZhciBuPWhba107aWYobi52aXNpYmxlfHxuPT09bSl7bi5aZCgpP1FiKGwuc2V0KGEpLG4udHJhbnNmb3JtKTpsLnNldChhKTt2YXIgcD1uO249biBpbnN0YW5jZW9mIFg/bjpudWxsOyhudWxsIT09bj9uLkZpKGwsYixjLGQpOnAuZWEobCkpJiYhMSE9PXAucGlja2FibGUmJihudWxsIT09YiYmKHA9YihwKSksbnVsbD09PXB8fG51bGwhPT1jJiYhYyhwKXx8ZC5hZGQocCkpO319Ry5mcmVlKGwpO31mfHxHLmZyZWUoZyk7cmV0dXJuIGUmJihudWxsIT09dGhpcy5iYWNrZ3JvdW5kfHxudWxsIT09dGhpcy5hcmVhQmFja2dyb3VuZCk7fWZ8fEcuZnJlZShnKTtyZXR1cm4hMTt9O3QubWc9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKCExPT09dGhpcy5waWNrYWJsZSlyZXR1cm4hMTt2b2lkIDA9PT1iJiYoYj1udWxsKTt2b2lkIDA9PT1jJiYoYz1udWxsKTt2YXIgZz1mO3ZvaWQgMD09PWYmJihnPVFjLmFsbG9jKCksZy5yZXNldCgpKTtnLm11bHRpcGx5KHRoaXMudHJhbnNmb3JtKTtpZih0aGlzLnVoKGEsZykpcmV0dXJuIFdtKHRoaXMsYixjLGUpLHZvaWQgMD09PWYmJlFjLmZyZWUoZyksITA7aWYodGhpcy5JYyhhLGcpKXtpZighdGhpcy5pc0F0b21pYylmb3IodmFyIGg9bm0odGhpcyksaz10aGlzLlkuaixsPWsubGVuZ3RoO2wtLTspe3ZhciBtPWtbbF07aWYobS52aXNpYmxlfHxtPT09aCl7dmFyIG49bS5hY3R1YWxCb3VuZHMscD10aGlzLm5hdHVyYWxCb3VuZHM7aWYoIShuLng+cC53aWR0aHx8bi55PnAuaGVpZ2h0fHwwPm4ueCtuLndpZHRofHwwPm4ueStuLmhlaWdodCkpe249bTttPW0gaW5zdGFuY2VvZiBYP206bnVsbDtwPVFjLmFsbG9jKCk7cC5zZXQoZyk7aWYobnVsbCE9PW0/bS5tZyhhLGIsYyxkLGUscCk6YWwobixhLGQscCkpbnVsbCE9PWImJihuPWIobikpLG51bGw9PT1ufHxudWxsIT09YyYmIWMobil8fGUuYWRkKG4pO1FjLmZyZWUocCk7fX19dm9pZCAwPT09ZiYmUWMuZnJlZShnKTtyZXR1cm4gZDt9dm9pZCAwPT09ZiYmUWMuZnJlZShnKTtyZXR1cm4hMTt9O2Z1bmN0aW9uIFdtKGEsYixjLGQpe2Zvcih2YXIgZT1hLlkuaixmPWUubGVuZ3RoO2YtLTspe3ZhciBnPWVbZl07aWYoZy52aXNpYmxlKXt2YXIgaD1nLmFjdHVhbEJvdW5kcyxrPWEubmF0dXJhbEJvdW5kcztoLng+ay53aWR0aHx8aC55PmsuaGVpZ2h0fHwwPmgueCtoLndpZHRofHwwPmgueStoLmhlaWdodHx8KGcgaW5zdGFuY2VvZiBYJiZXbShnLGIsYyxkKSxudWxsIT09YiYmKGc9YihnKSksbnVsbD09PWd8fG51bGwhPT1jJiYhYyhnKXx8ZC5hZGQoZykpO319fXQubmc9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKCExPT09dGhpcy5waWNrYWJsZSlyZXR1cm4hMTt2b2lkIDA9PT1jJiYoYz1udWxsKTt2b2lkIDA9PT1kJiYoZD1udWxsKTt2YXIgZz10aGlzLm5hdHVyYWxCb3VuZHMsaD10aGlzLlpkKCksaz1oP2E6UWIoRy5hbGxvY0F0KGEueCxhLnkpLHRoaXMudHJhbnNmb3JtKSxsPWg/YjpRYihHLmFsbG9jQXQoYi54LGIueSksdGhpcy50cmFuc2Zvcm0pLG09ay5CZShsKSxuPTA8ay54JiZrLng8Zy53aWR0aCYmMDxrLnkmJmsueTxnLmhlaWdodHx8UmIoay54LGsueSwwLDAsMCxnLmhlaWdodCk8PW18fFJiKGsueCxrLnksMCxnLmhlaWdodCxnLndpZHRoLGcuaGVpZ2h0KTw9bXx8UmIoay54LGsueSxnLndpZHRoLGcuaGVpZ2h0LGcud2lkdGgsMCk8PW18fFJiKGsueCxrLnksZy53aWR0aCwwLDAsMCk8PW07Zz1rLmNkKDAsMCk8PW0mJmsuY2QoMCxnLmhlaWdodCk8PW0mJmsuY2QoZy53aWR0aCwwKTw9bSYmay5jZChnLndpZHRoLGcuaGVpZ2h0KTw9bTtofHwoRy5mcmVlKGspLEcuZnJlZShsKSk7aWYobil7aWYoIXRoaXMuaXNBdG9taWMpe2s9Ry5hbGxvYygpO2w9Ry5hbGxvYygpO209bm0odGhpcyk7Zm9yKHZhciBwPXRoaXMuWS5qLHE9cC5sZW5ndGg7cS0tOyl7dmFyIHI9cFtxXTtpZihyLnZpc2libGV8fHI9PT1tKXt2YXIgdT1yLmFjdHVhbEJvdW5kcyx4PXRoaXMubmF0dXJhbEJvdW5kcztpZighaHx8ISh1Lng+eC53aWR0aHx8dS55PnguaGVpZ2h0fHwwPnUueCt1LndpZHRofHwwPnUueSt1LmhlaWdodCkpaWYoci5aZCgpPyh1PXIudHJhbnNmb3JtLFFiKGsuc2V0KGEpLHUpLFFiKGwuc2V0KGIpLHUpKTooay5zZXQoYSksbC5zZXQoYikpLHU9cixyPXIgaW5zdGFuY2VvZiBYP3I6bnVsbCxudWxsIT09cj9yLm5nKGssbCxjLGQsZSxmKTp1Lmp4KGssbCxlKSludWxsIT09YyYmKHU9Yyh1KSksbnVsbD09PXV8fG51bGwhPT1kJiYhZCh1KXx8Zi5hZGQodSk7fX1HLmZyZWUoayk7Ry5mcmVlKGwpO31yZXR1cm4gZT9uOmc7fXJldHVybiExO307ZnVuY3Rpb24gc20oYSl7dmFyIGI9bnVsbDthIGluc3RhbmNlb2YgVyYmKGI9YS5zcG90MSxiPT09RWQmJihiPW51bGwpLGE9YS5nZW9tZXRyeSxudWxsIT09YSYmbnVsbD09PWImJihiPWEuc3BvdDEpKTtudWxsPT09YiYmKGI9VGMpO3JldHVybiBiO31mdW5jdGlvbiB0bShhKXt2YXIgYj1udWxsO2EgaW5zdGFuY2VvZiBXJiYoYj1hLnNwb3QyLGI9PT1FZCYmKGI9bnVsbCksYT1hLmdlb21ldHJ5LG51bGwhPT1hJiZudWxsPT09YiYmKGI9YS5zcG90MikpO251bGw9PT1iJiYoYj1oZCk7cmV0dXJuIGI7fXQuYWRkPWZ1bmN0aW9uKGEpe3RoaXMuSWIodGhpcy5ZLmNvdW50LGEpO307dC5OPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlkuTihhKTt9O3QuSWI9ZnVuY3Rpb24oYSxiKXtiIGluc3RhbmNlb2YgVCYmQSgiQ2Fubm90IGFkZCBhIFBhcnQgdG8gYSBQYW5lbDogIitiKyI7IHVzZSBhIFBhbmVsIGluc3RlYWQiKTtpZih0aGlzPT09Ynx8dGhpcy5xZyhiKSl0aGlzPT09YiYmQSgiQ2Fubm90IG1ha2UgYSBQYW5lbCBjb250YWluIGl0c2VsZjogIit0aGlzLnRvU3RyaW5nKCkpLEEoIkNhbm5vdCBtYWtlIGEgUGFuZWwgaW5kaXJlY3RseSBjb250YWluIGl0c2VsZjogIit0aGlzLnRvU3RyaW5nKCkrIiBhbHJlYWR5IGNvbnRhaW5zICIrYi50b1N0cmluZygpKTt2YXIgYz1iLnBhbmVsO251bGwhPT1jJiZjIT09dGhpcyYmQSgiQ2Fubm90IGFkZCBhIEdyYXBoT2JqZWN0IHRoYXQgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIgUGFuZWwgdG8gdGhpcyBQYW5lbDogIitiLnRvU3RyaW5nKCkrIiwgYWxyZWFkeSBjb250YWluZWQgYnkgIitjLnRvU3RyaW5nKCkrIiwgY2Fubm90IGJlIHNoYXJlZCBieSB0aGlzIFBhbmVsOiAiK3RoaXMudG9TdHJpbmcoKSk7dGhpcy52YSE9PVguR3JpZHx8YiBpbnN0YW5jZW9mIFd8fEEoIkNhbiBvbmx5IGFkZCBTaGFwZXMgdG8gYSBHcmlkIFBhbmVsLCBub3Q6ICIrYik7dGhpcy52YSE9PVguR3JhZHVhdGVkfHxiIGluc3RhbmNlb2YgV3x8YiBpbnN0YW5jZW9mIHZofHxBKCJDYW4gb25seSBhZGQgU2hhcGVzIG9yIFRleHRCbG9ja3MgdG8gYSBHcmFkdWF0ZWQgUGFuZWwsIG5vdDogIitiKTtiLlNpKHRoaXMpO2IuQWo9bnVsbDtpZihudWxsIT09dGhpcy5pdGVtQXJyYXkpe3ZhciBkPWIuZGF0YTtudWxsIT09ZCYmIm9iamVjdCI9PT1fdHlwZW9mKGQpJiYobnVsbD09PXRoaXMuRWQmJih0aGlzLkVkPW5ldyBMYigpKSx0aGlzLkVkLmFkZChkLGIpKTt9dmFyIGU9dGhpcy5ZO2Q9LTE7aWYoYz09PXRoaXMpe2Zvcih2YXIgZj0tMSxnPXRoaXMuWS5qLGg9Zy5sZW5ndGgsaz0wO2s8aDtrKyspe2lmKGdba109PT1iKXtmPWs7YnJlYWs7fX1pZigtMSE9PWYpe2lmKGY9PT1hfHxmKzE+PWUuY291bnQmJmE+PWUuY291bnQpcmV0dXJuO2UubWIoZik7ZD1mO31lbHNlIEEoImVsZW1lbnQgIitiLnRvU3RyaW5nKCkrIiBoYXMgcGFuZWwgIitjLnRvU3RyaW5nKCkrIiBidXQgaXMgbm90IGNvbnRhaW5lZCBieSBpdC4iKTt9aWYoMD5hfHxhPmUuY291bnQpYT1lLmNvdW50O2UuSWIoYSxiKTtpZigwPT09YXx8Yi5pc1BhbmVsTWFpbil0aGlzLnRpPW51bGw7b2oodGhpcyl8fHRoaXMucygpO2IucyghMSk7bnVsbCE9PWIucG9ydElkP3RoaXMueGg9ITA6YiBpbnN0YW5jZW9mIFgmJiEwPT09Yi54aCYmKHRoaXMueGg9ITApO3RoaXMuTWc9bnVsbDtjPXRoaXMucGFydDtudWxsIT09YyYmKGMudmo9bnVsbCxjLlVnPU5hTix0aGlzLnhoJiZjIGluc3RhbmNlb2YgViYmKGMueGg9ITApLGMueGgmJmMgaW5zdGFuY2VvZiBWJiYoYy5yYz1udWxsKSxlPXRoaXMuZGlhZ3JhbSxudWxsIT09ZSYmZS51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHwoLTEhPT1kJiZjLmFiKGRmLCJlbGVtZW50cyIsdGhpcyxiLG51bGwsZCxudWxsKSxjLmFiKGNmLCJlbGVtZW50cyIsdGhpcyxudWxsLGIsbnVsbCxhKSx0aGlzLnJnKCl8fFhtKHRoaXMsYiwhMSkpKTt9O2Z1bmN0aW9uIFltKGEsYil7YS5IPWI/YS5IfDE2Nzc3MjE2OmEuSCYtMTY3NzcyMTc7fXQucmVtb3ZlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLlkuaixjPWIubGVuZ3RoLGQ9LTEsZT0wO2U8YztlKyspe2lmKGJbZV09PT1hKXtkPWU7YnJlYWs7fX0tMSE9PWQmJnRoaXMueGMoZCwhMCk7fTt0Lm1iPWZ1bmN0aW9uKGEpezA8PWEmJnRoaXMueGMoYSwhMCk7fTt0LnhjPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5ZLGQ9Yy5OKGEpO2QuQWo9bnVsbDtkLlNpKG51bGwpO2lmKG51bGwhPT10aGlzLkVkKXt2YXIgZT1kLmRhdGE7Im9iamVjdCI9PT1fdHlwZW9mKGUpJiZ0aGlzLkVkLnJlbW92ZShlKTt9Yy5tYihhKTtqaih0aGlzLCExKTt0aGlzLnMoKTt0aGlzLnRpPT09ZCYmKHRoaXMudGk9bnVsbCk7dGhpcy5NZz1udWxsO3ZhciBmPXRoaXMucGFydDtudWxsIT09ZiYmKGYudmo9bnVsbCxmLlVnPU5hTixmLkpiKCksZiBpbnN0YW5jZW9mIFYmJihkIGluc3RhbmNlb2YgWD9kLnltKGQsZnVuY3Rpb24oYSxjKXtIbChmLGMsYik7fSk6SGwoZixkLGIpKSxjPXRoaXMuZGlhZ3JhbSxudWxsIT09YyYmYy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHxmLmFiKGRmLCJlbGVtZW50cyIsdGhpcyxkLG51bGwsYSxudWxsKSk7fTtYLnByb3RvdHlwZS5nZXRSb3dEZWZpbml0aW9uPWZ1bmN0aW9uKGEpezA+YSYmeGEoYSwiPj0gMCIsWCwiZ2V0Um93RGVmaW5pdGlvbjppZHgiKTthPU1hdGgucm91bmQoYSk7dmFyIGI9dGhpcy5zYjtpZih2b2lkIDA9PT1iKXJldHVybiBudWxsO2lmKHZvaWQgMD09PWJbYV0pe3ZhciBjPW5ldyBRaigpO2MuU2kodGhpcyk7Yy5pc1Jvdz0hMDtjLmluZGV4PWE7YlthXT1jO31yZXR1cm4gYlthXTt9O1gucHJvdG90eXBlLkF2PWZ1bmN0aW9uKGEpezA+YSYmeGEoYSwiPj0gMCIsWCwicmVtb3ZlUm93RGVmaW5pdGlvbjppZHgiKTthPU1hdGgucm91bmQoYSk7dmFyIGI9dGhpcy5zYjt2b2lkIDAhPT1iJiYodGhpcy5hYihkZiwiY29sZGVmcyIsdGhpcyxiW2FdLG51bGwsYSxudWxsKSxiW2FdJiZkZWxldGUgYlthXSx0aGlzLnMoKSk7fTtYLnByb3RvdHlwZS5nZXRDb2x1bW5EZWZpbml0aW9uPWZ1bmN0aW9uKGEpezA+YSYmeGEoYSwiPj0gMCIsWCwiZ2V0Q29sdW1uRGVmaW5pdGlvbjppZHgiKTthPU1hdGgucm91bmQoYSk7dmFyIGI9dGhpcy5uYjtpZih2b2lkIDA9PT1iKXJldHVybiBudWxsO2lmKHZvaWQgMD09PWJbYV0pe3ZhciBjPW5ldyBRaigpO2MuU2kodGhpcyk7Yy5pc1Jvdz0hMTtjLmluZGV4PWE7YlthXT1jO31yZXR1cm4gYlthXTt9O3Q9WC5wcm90b3R5cGU7dC55dj1mdW5jdGlvbihhKXswPmEmJnhhKGEsIj49IDAiLFgsInJlbW92ZUNvbHVtbkRlZmluaXRpb246aWR4Iik7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPXRoaXMubmI7dm9pZCAwIT09YiYmKHRoaXMuYWIoZGYsImNvbGRlZnMiLHRoaXMsYlthXSxudWxsLGEsbnVsbCksYlthXSYmZGVsZXRlIGJbYV0sdGhpcy5zKCkpO307dC5SeT1mdW5jdGlvbihhKXtpZigwPmF8fHRoaXMudHlwZSE9PVguVGFibGUpcmV0dXJuLTE7Zm9yKHZhciBiPTAsYz10aGlzLnNiLGQ9Yy5sZW5ndGgsZT10aGlzLndpO2U8ZDtlKyspe3ZhciBmPWNbZV07aWYodm9pZCAwIT09ZiYmKGIrPWYudG90YWwsYTxiKSlicmVhazt9cmV0dXJuIGU7fTt0Lkp5PWZ1bmN0aW9uKGEpe2lmKDA+YXx8dGhpcy50eXBlIT09WC5UYWJsZSlyZXR1cm4tMTtmb3IodmFyIGI9MCxjPXRoaXMubmIsZD1jLmxlbmd0aCxlPXRoaXMuZ2k7ZTxkO2UrKyl7dmFyIGY9Y1tlXTtpZih2b2lkIDAhPT1mJiYoYis9Zi50b3RhbCxhPGIpKWJyZWFrO31yZXR1cm4gZTt9O3QuaXo9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj1uZXcgRyhOYU4sTmFOKSk7aWYodGhpcy50eXBlIT09WC5HcmFkdWF0ZWQpcmV0dXJuIGIuaChOYU4sTmFOKSxiO2E9TWF0aC5taW4oTWF0aC5tYXgoYSx0aGlzLmdyYWR1YXRlZE1pbiksdGhpcy5ncmFkdWF0ZWRNYXgpO3ZhciBjPXRoaXMuemIoKTtjLmdlb21ldHJ5LmN2KChhLXRoaXMuZ3JhZHVhdGVkTWluKS90aGlzLmdyYWR1YXRlZFJhbmdlLGIpO3JldHVybiBjLnRyYW5zZm9ybS50YShiKTt9O3Quano9ZnVuY3Rpb24oYSl7aWYodGhpcy50eXBlIT09WC5HcmFkdWF0ZWQpcmV0dXJuIE5hTjt2YXIgYj10aGlzLnpiKCk7Yi50cmFuc2Zvcm0uVWQoYSk7cmV0dXJuIGIuZ2VvbWV0cnkubXgoYSkqdGhpcy5ncmFkdWF0ZWRSYW5nZSt0aGlzLmdyYWR1YXRlZE1pbjt9O2Z1bmN0aW9uIHpsKGEpe2E9YS5RaDtyZXR1cm4gbnVsbCE9PWEmJmEudjt9ZnVuY3Rpb24gWWcoYSl7dmFyIGI9YS5RaDtpZihudWxsPT09YiludWxsIT09YS5kYXRhJiZBKCJUZW1wbGF0ZSBjYW5ub3QgaGF2ZSAuZGF0YSBiZSBub24tbnVsbDogIithKSxhLlFoPWI9bmV3IEUoKTtlbHNlIGlmKGIudilyZXR1cm47dmFyIGM9bmV3IEUoKTtZbShhLCExKTthLnltKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT1kLmJiO2lmKG51bGwhPT1lKWZvcih3bChkLCExKSxlPWUuaXRlcmF0b3I7ZS5uZXh0KCk7KXt2YXIgZj1lLnZhbHVlO2YubW9kZT09PVptJiZ3bChkLCEwKTt2YXIgZz1mLnNvdXJjZU5hbWU7bnVsbCE9PWcmJigiLyI9PT1nJiZZbShhLCEwKSxnPVlrKGYsYSxkKSxudWxsIT09ZyYmKGMuYWRkKGcpLG51bGw9PT1nLkZsJiYoZy5GbD1uZXcgRSgpKSxnLkZsLmFkZChmKSkpO2IuYWRkKGYpO31pZihkIGluc3RhbmNlb2YgWCYmZC50eXBlPT09WC5UYWJsZSl7aWYoMDxkLnNiLmxlbmd0aClmb3IoYT1kLnNiLGU9YS5sZW5ndGgsZj0wO2Y8ZTtmKyspe2lmKGc9YVtmXSx2b2lkIDAhPT1nJiZudWxsIT09Zy5iYilmb3IodmFyIGg9Zy5iYi5pdGVyYXRvcjtoLm5leHQoKTspe3ZhciBrPWgudmFsdWU7ay5RZD1nO2sud3A9MjtrLk5sPWcuaW5kZXg7Yi5hZGQoayk7fX1pZigwPGQubmIubGVuZ3RoKWZvcihkPWQubmIsYT1kLmxlbmd0aCxlPTA7ZTxhO2UrKyl7aWYoZj1kW2VdLHZvaWQgMCE9PWYmJm51bGwhPT1mLmJiKWZvcihnPWYuYmIuaXRlcmF0b3I7Zy5uZXh0KCk7KXtoPWcudmFsdWUsaC5RZD1mLGgud3A9MSxoLk5sPWYuaW5kZXgsYi5hZGQoaCk7fX19fSk7Zm9yKHZhciBkPWMuaXRlcmF0b3I7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlO2lmKG51bGwhPT1lLkZsKXt3bChlLCEwKTtmb3IodmFyIGY9ZS5GbC5pdGVyYXRvcjtmLm5leHQoKTspe3ZhciBnPWYudmFsdWU7bnVsbD09PWUuYmImJihlLmJiPW5ldyBFKCkpO2UuYmIuYWRkKGcpO319ZS5GbD1udWxsO31mb3IoZD1iLml0ZXJhdG9yO2QubmV4dCgpOyl7aWYoZT1kLnZhbHVlLGY9ZS5RZCxudWxsIT09Zil7ZS5RZD1udWxsO3ZhciBoPWUudGFyZ2V0UHJvcGVydHksaz1oLmluZGV4T2YoIi4iKTswPGsmJmYgaW5zdGFuY2VvZiBYJiYoZz1oLnN1YnN0cmluZygwLGspLGg9aC5zdWJzdHIoaysxKSxrPWYuJGEoZyksbnVsbCE9PWs/KGY9ayxlLnRhcmdldFByb3BlcnR5PWgpOnlhKCdXYXJuaW5nOiB1bmFibGUgdG8gZmluZCBHcmFwaE9iamVjdCBuYW1lZCAiJytnKyciIGZvciBCaW5kaW5nOiAnK2UudG9TdHJpbmcoKSkpO2YgaW5zdGFuY2VvZiBRaj8oZz1CYihmLnBhbmVsKSxlLlhpPXZvaWQgMD09PWc/LTE6ZyxmLnBhbmVsLkRrPWUuWGkpOmYgaW5zdGFuY2VvZiBZPyhnPUJiKGYpLGUuWGk9dm9pZCAwPT09Zz8tMTpnLGYuRGs9ZS5YaSk6QSgiVW5rbm93biB0eXBlIG9mIGJpbmRpbmcgdGFyZ2V0OiAiK2YpO319Yi5mcmVlemUoKTthIGluc3RhbmNlb2YgVCYmYS5MYigpJiZhLmFjKCk7fXQueHk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvcHkoKTtSbShhLGZ1bmN0aW9uKGEpe2EgaW5zdGFuY2VvZiBYJiYoYS5RaD1udWxsLGEuamI9bnVsbCk7dmFyIGI9YS5iYjtudWxsIT09YiYmKGEuYmI9bnVsbCxiLmVhY2goZnVuY3Rpb24oYil7YS5iaW5kKGIuY29weSgpKTt9KSk7fSk7cmV0dXJuIGE7fTt0LkVhPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUWg7aWYobnVsbCE9PWIpZm9yKHZvaWQgMD09PWEmJihhPSIiKSxiPWIuaXRlcmF0b3I7Yi5uZXh0KCk7KXt2YXIgYz1iLnZhbHVlLGQ9Yy5zb3VyY2VQcm9wZXJ0eTtpZigiIj09PWF8fCIiPT09ZHx8ZD09PWEpaWYoZD1jLnRhcmdldFByb3BlcnR5LG51bGwhPT1jLmNvbnZlcnRlcnx8IiIhPT1kKXtkPXRoaXMuZGF0YTt2YXIgZT1jLnNvdXJjZU5hbWU7aWYobnVsbCE9PWUpZD0iIj09PWU/dGhpczoiLyI9PT1lP3RoaXM6Ii4iPT09ZT90aGlzOiIuLiI9PT1lP3RoaXM6dGhpcy4kYShlKTtlbHNle3ZhciBmPXRoaXMuZGlhZ3JhbTtudWxsIT09ZiYmYy5pc1RvTW9kZWwmJihkPWYubW9kZWwubW9kZWxEYXRhKTt9aWYobnVsbCE9PWQpe2Y9dGhpczt2YXIgZz1jLlhpO2lmKC0xIT09Zyl7aWYoZj10aGlzLlFzKGcpLG51bGw9PT1mKWNvbnRpbnVlO31lbHNlIG51bGwhPT1jLlFkJiYoZj1jLlFkKTsiLyI9PT1lP2Q9Zi5wYXJ0OiIuIj09PWU/ZD1mOiIuLiI9PT1lJiYoZD1mLnBhbmVsKTtlPWMud3A7aWYoMCE9PWUpe2lmKCEoZiBpbnN0YW5jZW9mIFgpKWNvbnRpbnVlOzE9PT1lP2Y9Zi5nZXRDb2x1bW5EZWZpbml0aW9uKGMuTmwpOjI9PT1lJiYoZj1mLmdldFJvd0RlZmluaXRpb24oYy5ObCkpO312b2lkIDAhPT1mJiZjLlh2KGYsZCk7fX19fTtmdW5jdGlvbiAkbShhLGIpe2E9YS5ZLmo7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9Yi5sZW5ndGgsZT0wLGY9bnVsbDtlPGMmJiEoZj1hW2VdLGYgaW5zdGFuY2VvZiBYJiZudWxsIT09Zi5kYXRhKTspe2UrKyxmPWFbZV07fWlmKGMtZSE9PWQpcmV0dXJuITA7aWYobnVsbD09PWYpcmV0dXJuIDA8ZDtmb3IodmFyIGc9MDtlPGMmJmc8ZDspe2Y9YVtlXTtpZighKGYgaW5zdGFuY2VvZiBYKXx8Zi5kYXRhIT09YltnXSlyZXR1cm4hMDtlKys7ZysrO31yZXR1cm4hMTt9ZnVuY3Rpb24gVW0oYSl7aWYoYS50eXBlPT09WC5TcG90fHxhLnR5cGU9PT1YLkF1dG8pcmV0dXJuIE1hdGgubWluKGEuWS5sZW5ndGgsMSk7aWYoYS50eXBlPT09WC5MaW5rKXthPWEuWTtmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe3ZhciBkPWEuTihjKTtpZighKGQgaW5zdGFuY2VvZiBXJiZkLmlzUGFuZWxNYWluKSlicmVhazt9cmV0dXJuIGM7fXJldHVybiBhLnR5cGU9PT1YLlRhYmxlJiYwPGEuWS5sZW5ndGgmJihhPWEuWS5OKDApLGEuaXNQYW5lbE1haW4mJmEgaW5zdGFuY2VvZiBYJiYoYS50eXBlPT09WC5UYWJsZVJvd3x8YS50eXBlPT09WC5UYWJsZUNvbHVtbikpPzE6MDt9dC5udD1mdW5jdGlvbigpe2Zvcih2YXIgYT1VbSh0aGlzKTt0aGlzLlkubGVuZ3RoPmE7KXt0aGlzLnhjKHRoaXMuWS5sZW5ndGgtMSwhMSk7fWE9dGhpcy5pdGVtQXJyYXk7aWYobnVsbCE9PWEpZm9yKHZhciBiPWEubGVuZ3RoLGM9MDtjPGI7YysrKXthbih0aGlzLGFbY10sYyk7fX07dC5peD1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09PWF8fG51bGw9PT10aGlzLkVkP251bGw6dGhpcy5FZC5KKGEpO307ZnVuY3Rpb24gYW4oYSxiLGMpe2lmKCEodm9pZCAwPT09Ynx8bnVsbD09PWJ8fDA+Yykpe3ZhciBkPWJuKGEsYiksZT1hLml0ZW1UZW1wbGF0ZU1hcCxmPW51bGw7bnVsbCE9PWUmJihmPWUuSihkKSk7bnVsbD09PWYmJihjbnx8KGNuPSEwLHlhKCdObyBpdGVtIHRlbXBsYXRlIFBhbmVsIGZvdW5kIGZvciBjYXRlZ29yeSAiJytkKyciIG9uICcrYSkseWEoIiAgVXNpbmcgZGVmYXVsdCBpdGVtIHRlbXBsYXRlLiIpLGQ9bmV3IFgoKSxlPW5ldyB2aCgpLGUuYmluZChuZXcgSGkoInRleHQiLCIiLFFhKSksZC5hZGQoZSksZG49ZCksZj1kbik7ZD1mO251bGwhPT1kJiYoWWcoZCksZD1kLmNvcHkoKSwwIT09KGQuSCYxNjc3NzIxNikmJihlPWEuR2koKSxudWxsIT09ZSYmWW0oZSwhMCkpLCJvYmplY3QiPT09X3R5cGVvZihiKSYmKG51bGw9PT1hLkVkJiYoYS5FZD1uZXcgTGIoKSksYS5FZC5hZGQoYixkKSksZT1jK1VtKGEpLGEuSWIoZSxkKSxkLmpiPWIsZW4oYSxlLGMpLGQuamI9bnVsbCxkLmRhdGE9Yik7fX1mdW5jdGlvbiBlbihhLGIsYyl7Zm9yKGE9YS5ZO2I8YS5sZW5ndGg7KXt2YXIgZD1hLk4oYik7aWYoZCBpbnN0YW5jZW9mIFgpe3ZhciBlPWIsZj1jO2QudHlwZT09PVguVGFibGVSb3c/ZC5yb3c9ZTpkLnR5cGU9PT1YLlRhYmxlQ29sdW1uJiYoZC5jb2x1bW49ZSk7ZC5pdGVtSW5kZXg9Zjt9YisrO2MrKzt9fWZ1bmN0aW9uIGJuKGEsYil7aWYobnVsbD09PWIpcmV0dXJuIiI7YT1hLmdsO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSlhPWEoYik7ZWxzZSBpZigic3RyaW5nIj09PXR5cGVvZiBhJiYib2JqZWN0Ij09PV90eXBlb2YoYikpe2lmKCIiPT09YSlyZXR1cm4iIjthPWZuKGIsYSk7fWVsc2UgcmV0dXJuIiI7aWYodm9pZCAwPT09YSlyZXR1cm4iIjtpZigic3RyaW5nIj09PXR5cGVvZiBhKXJldHVybiBhO0EoIlBhbmVsLmdldENhdGVnb3J5Rm9ySXRlbURhdGEgZm91bmQgYSBub24tc3RyaW5nIGNhdGVnb3J5IGZvciAiK2IrIjogIithKTtyZXR1cm4iIjt9ZnVuY3Rpb24gWG0oYSxiLGMpe3ZhciBkPWIuZW5hYmxlZENoYW5nZWQ7bnVsbCE9PWQmJmQoYixjKTtpZihiIGluc3RhbmNlb2YgWCl7Yj1iLlkuajtkPWIubGVuZ3RoO2Zvcih2YXIgZT0wO2U8ZDtlKyspe3ZhciBmPWJbZV07YyYmZiBpbnN0YW5jZW9mIFgmJiFmLmlzRW5hYmxlZHx8WG0oYSxmLGMpO319fWZ1bmN0aW9uIGduKGEsYil7RGwuYWRkKGEsYik7fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFgucHJvdG90eXBlLHt0eXBlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudmE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMudmE7YiE9PWEmJih0aGlzLnZhPWEsdGhpcy52YT09PVguR3JpZD90aGlzLmlzQXRvbWljPSEwOnRoaXMudmE9PT1YLlRhYmxlJiZMbSh0aGlzKSx0aGlzLnMoKSx0aGlzLmcoInR5cGUiLGIsYSkpO319LGVsZW1lbnRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWS5pdGVyYXRvcjt9fSxuYXR1cmFsQm91bmRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucWM7fX0scGFkZGluZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmViO30sc2V0OmZ1bmN0aW9uIHNldChhKXsibnVtYmVyIj09PXR5cGVvZiBhPygwPmEmJnhhKGEsIj49IDAiLFgsInBhZGRpbmciKSxhPW5ldyBJYyhhKSk6KDA+YS5sZWZ0JiZ4YShhLmxlZnQsIj49IDAiLFgsInBhZGRpbmc6dmFsdWUubGVmdCIpLDA+YS5yaWdodCYmeGEoYS5yaWdodCwiPj0gMCIsWCwicGFkZGluZzp2YWx1ZS5yaWdodCIpLDA+YS50b3AmJnhhKGEudG9wLCI+PSAwIixYLCJwYWRkaW5nOnZhbHVlLnRvcCIpLDA+YS5ib3R0b20mJnhhKGEuYm90dG9tLCI+PSAwIixYLCJwYWRkaW5nOnZhbHVlLmJvdHRvbSIpKTt2YXIgYj10aGlzLmViO2IuQShhKXx8KHRoaXMuZWI9YT1hLkkoKSx0aGlzLnMoKSx0aGlzLmcoInBhZGRpbmciLGIsYSkpO319LGRlZmF1bHRBbGlnbm1lbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ubjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ubjtiLkEoYSl8fCh0aGlzLm5uPWE9YS5JKCksdGhpcy5zKCksdGhpcy5nKCJkZWZhdWx0QWxpZ25tZW50IixiLGEpKTt9fSxkZWZhdWx0U3RyZXRjaDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkRmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkRmO2IhPT1hJiYodGhpcy5EZj1hLHRoaXMucygpLHRoaXMuZygiZGVmYXVsdFN0cmV0Y2giLGIsYSkpO319LGRlZmF1bHRTZXBhcmF0b3JQYWRkaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuZGo/T2M6dGhpcy5kajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYodm9pZCAwIT09dGhpcy5kail7Im51bWJlciI9PT10eXBlb2YgYSYmKGE9bmV3IEljKGEpKTt2YXIgYj10aGlzLmRqO2IuQShhKXx8KHRoaXMuZGo9YT1hLkkoKSx0aGlzLnMoKSx0aGlzLmcoImRlZmF1bHRTZXBhcmF0b3JQYWRkaW5nIixiLGEpKTt9fX0sZGVmYXVsdFJvd1NlcGFyYXRvclN0cm9rZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB2b2lkIDA9PT10aGlzLlZoP251bGw6dGhpcy5WaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5WaDtiIT09YSYmKG51bGw9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2Yga2wpJiYoYSBpbnN0YW5jZW9mIGtsJiZhLmZyZWV6ZSgpLHRoaXMuVmg9YSx0aGlzLlIoKSx0aGlzLmcoImRlZmF1bHRSb3dTZXBhcmF0b3JTdHJva2UiLGIsYSkpO319LGRlZmF1bHRSb3dTZXBhcmF0b3JTdHJva2VXaWR0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB2b2lkIDA9PT10aGlzLkdnPzE6dGhpcy5HZzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYodm9pZCAwIT09dGhpcy5HZyl7dmFyIGI9dGhpcy5HZztiIT09YSYmaXNGaW5pdGUoYSkmJjA8PWEmJih0aGlzLkdnPWEsdGhpcy5zKCksdGhpcy5nKCJkZWZhdWx0Um93U2VwYXJhdG9yU3Ryb2tlV2lkdGgiLGIsYSkpO319fSxkZWZhdWx0Um93U2VwYXJhdG9yRGFzaEFycmF5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuVWg/bnVsbDp0aGlzLlVoO30sc2V0OmZ1bmN0aW9uIHNldChhKXtpZih2b2lkIDAhPT10aGlzLlVoKXt2YXIgYj10aGlzLlVoO2lmKGIhPT1hKXtpZihudWxsIT09YSl7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9MCxlPTA7ZTxjO2UrKyl7dmFyIGY9YVtlXTsibnVtYmVyIj09PXR5cGVvZiBmJiYwPD1mJiZpc0Zpbml0ZShmKXx8QSgiZGVmYXVsdFJvd1NlcGFyYXRvckRhc2hBcnJheSB2YWx1ZSAiK2YrIiBhdCBpbmRleCAiK2UrIiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIHplcm8uIik7ZCs9Zjt9aWYoMD09PWQpe2lmKG51bGw9PT1iKXJldHVybjthPW51bGw7fX10aGlzLlVoPWE7dGhpcy5SKCk7dGhpcy5nKCJkZWZhdWx0Um93U2VwYXJhdG9yRGFzaEFycmF5IixiLGEpO319fX0sZGVmYXVsdENvbHVtblNlcGFyYXRvclN0cm9rZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB2b2lkIDA9PT10aGlzLkVnP251bGw6dGhpcy5FZzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYodm9pZCAwIT09dGhpcy5FZyl7dmFyIGI9dGhpcy5FZztiIT09YSYmKG51bGw9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2Yga2wpJiYoYSBpbnN0YW5jZW9mIGtsJiZhLmZyZWV6ZSgpLHRoaXMuRWc9YSx0aGlzLlIoKSx0aGlzLmcoImRlZmF1bHRDb2x1bW5TZXBhcmF0b3JTdHJva2UiLGIsYSkpO319fSxkZWZhdWx0Q29sdW1uU2VwYXJhdG9yU3Ryb2tlV2lkdGg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5GZz8xOnRoaXMuRmc7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe2lmKHZvaWQgMCE9PXRoaXMuRmcpe3ZhciBiPXRoaXMuRmc7YiE9PWEmJmlzRmluaXRlKGEpJiYwPD1hJiYodGhpcy5GZz1hLHRoaXMucygpLHRoaXMuZygiZGVmYXVsdENvbHVtblNlcGFyYXRvclN0cm9rZVdpZHRoIixiLGEpKTt9fX0sZGVmYXVsdENvbHVtblNlcGFyYXRvckRhc2hBcnJheTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB2b2lkIDA9PT10aGlzLlRoP251bGw6dGhpcy5UaDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYodm9pZCAwIT09dGhpcy5UaCl7dmFyIGI9dGhpcy5UaDtpZihiIT09YSl7aWYobnVsbCE9PWEpe2Zvcih2YXIgYz1hLmxlbmd0aCxkPTAsZT0wO2U8YztlKyspe3ZhciBmPWFbZV07Im51bWJlciI9PT10eXBlb2YgZiYmMDw9ZiYmaXNGaW5pdGUoZil8fEEoImRlZmF1bHRDb2x1bW5TZXBhcmF0b3JEYXNoQXJyYXkgdmFsdWUgIitmKyIgYXQgaW5kZXggIitlKyIgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciB6ZXJvLiIpO2QrPWY7fWlmKDA9PT1kKXtpZihudWxsPT09YilyZXR1cm47YT1udWxsO319dGhpcy5UaD1hO3RoaXMuUigpO3RoaXMuZygiZGVmYXVsdENvbHVtblNlcGFyYXRvckRhc2hBcnJheSIsYixhKTt9fX19LHZpZXdib3hTdHJldGNoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRnA7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuRnA7YiE9PWEmJih0aGlzLkZwPWEsdGhpcy5zKCksdGhpcy5nKCJ2aWV3Ym94U3RyZXRjaCIsYixhKSk7fX0sZ3JpZENlbGxTaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTG47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuTG47aWYoIWIuQShhKSl7YS5vKCkmJjAhPT1hLndpZHRoJiYwIT09YS5oZWlnaHR8fEEoIkludmFsaWQgUGFuZWwuZ3JpZENlbGxTaXplOiAiK2EpO3RoaXMuTG49YS5JKCk7dmFyIGM9dGhpcy5kaWFncmFtO251bGwhPT1jJiZ0aGlzPT09Yy5ncmlkJiZraihjKTt0aGlzLlIoKTt0aGlzLmcoImdyaWRDZWxsU2l6ZSIsYixhKTt9fX0sZ3JpZE9yaWdpbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1uO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLk1uO2lmKCFiLkEoYSkpe2EubygpfHxBKCJJbnZhbGlkIFBhbmVsLmdyaWRPcmlnaW46ICIrYSk7dGhpcy5Nbj1hLkkoKTt2YXIgYz10aGlzLmRpYWdyYW07bnVsbCE9PWMmJnRoaXM9PT1jLmdyaWQmJmtqKGMpO3RoaXMuUigpO3RoaXMuZygiZ3JpZE9yaWdpbiIsYixhKTt9fX0sZ3JhZHVhdGVkTWluOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSW47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuSW47YiE9PWEmJih0aGlzLkluPWEsdGhpcy5zKCksdGhpcy5nKCJncmFkdWF0ZWRNaW4iLGIsYSksVmsodGhpcykmJihhPXRoaXMucGFydCxudWxsIT09YSYmV2sodGhpcyxhLCJncmFkdWF0ZWRSYW5nZSIpKSk7fX0sZ3JhZHVhdGVkTWF4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSG47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuSG47YiE9PWEmJih0aGlzLkhuPWEsdGhpcy5zKCksdGhpcy5nKCJncmFkdWF0ZWRNYXgiLGIsYSksVmsodGhpcykmJihhPXRoaXMucGFydCxudWxsIT09YSYmV2sodGhpcyxhLCJncmFkdWF0ZWRSYW5nZSIpKSk7fX0sZ3JhZHVhdGVkUmFuZ2U6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ncmFkdWF0ZWRNYXgtdGhpcy5ncmFkdWF0ZWRNaW47fX0sZ3JhZHVhdGVkVGlja1VuaXQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Lbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5LbjtiIT09YSYmMDxhJiYodGhpcy5Lbj1hLHRoaXMucygpLHRoaXMuZygiZ3JhZHVhdGVkVGlja1VuaXQiLGIsYSkpO319LGdyYWR1YXRlZFRpY2tCYXNlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSm47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuSm47YiE9PWEmJih0aGlzLkpuPWEsdGhpcy5zKCksdGhpcy5nKCJncmFkdWF0ZWRUaWNrQmFzZSIsYixhKSk7fX0seGg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLkgmODM4ODYwOCk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpezAhPT0odGhpcy5IJjgzODg2MDgpIT09YSYmKHRoaXMuSF49ODM4ODYwOCk7fX0scm93Q291bnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5zYj8wOnRoaXMuc2IubGVuZ3RoO319LGNvbHVtbkNvdW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHZvaWQgMD09PXRoaXMubmI/MDp0aGlzLm5iLmxlbmd0aDt9fSxyb3dTaXppbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5Gaj9NbTp0aGlzLkZqO30sc2V0OmZ1bmN0aW9uIHNldChhKXtpZih2b2lkIDAhPT10aGlzLkZqKXt2YXIgYj10aGlzLkZqO2IhPT1hJiYodGhpcy5Gaj1hLHRoaXMucygpLHRoaXMuZygicm93U2l6aW5nIixiLGEpKTt9fX0sY29sdW1uU2l6aW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuYmo/TW06dGhpcy5iajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYodm9pZCAwIT09dGhpcy5iail7dmFyIGI9dGhpcy5iajtiIT09YSYmKHRoaXMuYmo9YSx0aGlzLnMoKSx0aGlzLmcoImNvbHVtblNpemluZyIsYixhKSk7fX19LHRvcEluZGV4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHZvaWQgMD09PXRoaXMud2k/MDp0aGlzLndpO30sc2V0OmZ1bmN0aW9uIHNldChhKXtpZih2b2lkIDAhPT10aGlzLndpKXt2YXIgYj10aGlzLndpO2IhPT1hJiYoKCFpc0Zpbml0ZShhKXx8MD5hKSYmQSgiUGFuZWwudG9wSW5kZXggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyBhbmQgYSByZWFsIG51bWJlciwgbm90OiAiK2EpLHRoaXMud2k9YSx0aGlzLnMoKSx0aGlzLmcoInRvcEluZGV4IixiLGEpKTt9fX0sbGVmdEluZGV4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuZ2k/MDp0aGlzLmdpO30sc2V0OmZ1bmN0aW9uIHNldChhKXtpZih2b2lkIDAhPT10aGlzLmdpKXt2YXIgYj10aGlzLmdpO2IhPT1hJiYoKCFpc0Zpbml0ZShhKXx8MD5hKSYmQSgiUGFuZWwubGVmdEluZGV4IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGEgcmVhbCBudW1iZXIsIG5vdDogIithKSx0aGlzLmdpPWEsdGhpcy5zKCksdGhpcy5nKCJsZWZ0SW5kZXgiLGIsYSkpO319fSxkYXRhOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuamI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuamI7aWYoYiE9PWEpe3ZhciBjPXRoaXMgaW5zdGFuY2VvZiBUJiYhKHRoaXMgaW5zdGFuY2VvZiBwZik7WWcodGhpcyk7dGhpcy5qYj1hO3ZhciBkPXRoaXMuZGlhZ3JhbTtudWxsIT09ZCYmKGM/KGM9ZC5wYXJ0TWFuYWdlcix0aGlzIGluc3RhbmNlb2YgUz8obnVsbCE9PWImJmMuRGcucmVtb3ZlKGIpLG51bGwhPT1hJiZjLkRnLmFkZChhLHRoaXMpKTp0aGlzIGluc3RhbmNlb2YgVCYmKG51bGwhPT1iJiZjLk1lLnJlbW92ZShiKSxudWxsIT09YSYmYy5NZS5hZGQoYSx0aGlzKSkpOihjPXRoaXMucGFuZWwsbnVsbCE9PWMmJm51bGwhPT1jLkVkJiYobnVsbCE9PWImJmMuRWQucmVtb3ZlKGIpLG51bGwhPT1hJiZjLkVkLmFkZChhLHRoaXMpKSkpO3RoaXMuZygiZGF0YSIsYixhKTtudWxsIT09ZCYmZC51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHxudWxsIT09YSYmdGhpcy5FYSgpO319fSxpdGVtSW5kZXg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5abjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5abjtiIT09YSYmKHRoaXMuWm49YSx0aGlzLmcoIml0ZW1JbmRleCIsYixhKSk7fX0saXRlbUFycmF5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZWk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuZWk7aWYoYiE9PWF8fG51bGwhPT1hJiYkbSh0aGlzLGEpKXt2YXIgYz10aGlzLmRpYWdyYW07YiE9PWEmJihudWxsIT09YyYmbnVsbCE9PWImJkhqKGMucGFydE1hbmFnZXIsdGhpcyksdGhpcy5laT1hLG51bGwhPT1jJiZudWxsIT09YSYmRGooYy5wYXJ0TWFuYWdlcix0aGlzKSk7dGhpcy5nKCJpdGVtQXJyYXkiLGIsYSk7bnVsbCE9PWMmJmMudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8dGhpcy5udCgpO319fSxpdGVtVGVtcGxhdGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbD09PXRoaXMuamU/bnVsbDp0aGlzLmplLkooIiIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXtpZihudWxsPT09dGhpcy5qZSl7aWYobnVsbD09PWEpcmV0dXJuO3RoaXMuamU9bmV3IExiKCk7fXZhciBiPXRoaXMuamUuSigiIik7YiE9PWEmJigoYSBpbnN0YW5jZW9mIFR8fGEuaXNQYW5lbE1haW4pJiZBKCJQYW5lbC5pdGVtVGVtcGxhdGUgbXVzdCBub3QgYmUgYSBQYXJ0IG9yIGJlIFBhbmVsLmlzUGFuZWxNYWluOiAiK2EpLHRoaXMuamUuYWRkKCIiLGEpLHRoaXMuZygiaXRlbVRlbXBsYXRlIixiLGEpLGE9dGhpcy5kaWFncmFtLG51bGwhPT1hJiZhLnVuZG9NYW5hZ2VyLmlzVW5kb2luZ1JlZG9pbmd8fHRoaXMubnQoKSk7fX0saXRlbVRlbXBsYXRlTWFwOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuamU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuamU7aWYoYiE9PWEpe2Zvcih2YXIgYz1hLml0ZXJhdG9yO2MubmV4dCgpOyl7O310aGlzLmplPWE7dGhpcy5nKCJpdGVtVGVtcGxhdGVNYXAiLGIsYSk7YT10aGlzLmRpYWdyYW07bnVsbCE9PWEmJmEudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8dGhpcy5udCgpO319fSxpdGVtQ2F0ZWdvcnlQcm9wZXJ0eTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmdsO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmdsO2IhPT1hJiYodGhpcy5nbD1hLHRoaXMuZygiaXRlbUNhdGVnb3J5UHJvcGVydHkiLGIsYSkpO319LGlzQXRvbWljOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5IJjEwNDg1NzYpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuSCYxMDQ4NTc2KTtiIT09YSYmKHRoaXMuSF49MTA0ODU3Nix0aGlzLmcoImlzQXRvbWljIixiLGEpKTt9fSxpc0NsaXBwaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5IJjIwOTcxNTIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuSCYyMDk3MTUyKTtiIT09YSYmKHRoaXMuSF49MjA5NzE1Mix0aGlzLnMoKSx0aGlzLmcoImlzQ2xpcHBpbmciLGIsYSkpO319LGlzT3Bwb3NpdGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLkgmMzM1NTQ0MzIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuSCYzMzU1NDQzMik7YiE9PWEmJih0aGlzLkhePTMzNTU0NDMyLHRoaXMucygpLHRoaXMuZygiaXNPcHBvc2l0ZSIsYixhKSk7fX0saXNFbmFibGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5IJjQxOTQzMDQpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuSCY0MTk0MzA0KTtpZihiIT09YSl7dmFyIGM9bnVsbD09PXRoaXMucGFuZWx8fHRoaXMucGFuZWwucmcoKTt0aGlzLkhePTQxOTQzMDQ7dGhpcy5nKCJpc0VuYWJsZWQiLGIsYSk7Yj10aGlzLmRpYWdyYW07bnVsbCE9PWImJmIudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8YyYmWG0odGhpcyx0aGlzLGEpO319fSxhbGlnbm1lbnRGb2N1c05hbWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy55Zzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy55ZztiIT09YSYmKHRoaXMueWc9YSx0aGlzLnMoKSx0aGlzLmcoImFsaWdubWVudEZvY3VzTmFtZSIsYixhKSk7fX19KTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhYLHtQb3NpdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBEbC5KKCJQb3NpdGlvbiIpO319LEhvcml6b250YWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gRGwuSigiSG9yaXpvbnRhbCIpO319LFZlcnRpY2FsOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIERsLkooIlZlcnRpY2FsIik7fX0sU3BvdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBEbC5KKCJTcG90Iik7fX0sQXV0bzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBEbC5KKCJBdXRvIik7fX0sVGFibGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gRGwuSigiVGFibGUiKTt9fSxWaWV3Ym94OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIERsLkooIlZpZXdib3giKTt9fSxUYWJsZVJvdzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBEbC5KKCJUYWJsZVJvdyIpO319LFRhYmxlQ29sdW1uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIERsLkooIlRhYmxlQ29sdW1uIik7fX0sTGluazp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBEbC5KKCJMaW5rIik7fX0sR3JpZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBEbC5KKCJHcmlkIik7fX0sR3JhZHVhdGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIERsLkooIkdyYWR1YXRlZCIpO319fSk7WC5wcm90b3R5cGUuZmluZEl0ZW1QYW5lbEZvckRhdGE9WC5wcm90b3R5cGUuaXg7WC5wcm90b3R5cGUucmVidWlsZEl0ZW1FbGVtZW50cz1YLnByb3RvdHlwZS5udDtYLnByb3RvdHlwZS51cGRhdGVUYXJnZXRCaW5kaW5ncz1YLnByb3RvdHlwZS5FYTtYLnByb3RvdHlwZS5jb3B5VGVtcGxhdGU9WC5wcm90b3R5cGUueHk7WC5wcm90b3R5cGUuZ3JhZHVhdGVkVmFsdWVGb3JQb2ludD1YLnByb3RvdHlwZS5qejtYLnByb3RvdHlwZS5ncmFkdWF0ZWRQb2ludEZvclZhbHVlPVgucHJvdG90eXBlLml6O1gucHJvdG90eXBlLmZpbmRDb2x1bW5Gb3JMb2NhbFg9WC5wcm90b3R5cGUuSnk7WC5wcm90b3R5cGUuZmluZFJvd0ZvckxvY2FsWT1YLnByb3RvdHlwZS5SeTtYLnByb3RvdHlwZS5yZW1vdmVDb2x1bW5EZWZpbml0aW9uPVgucHJvdG90eXBlLnl2O1gucHJvdG90eXBlLnJlbW92ZVJvd0RlZmluaXRpb249WC5wcm90b3R5cGUuQXY7WC5wcm90b3R5cGUucmVtb3ZlQXQ9WC5wcm90b3R5cGUubWI7WC5wcm90b3R5cGUucmVtb3ZlPVgucHJvdG90eXBlLnJlbW92ZTtYLnByb3RvdHlwZS5pbnNlcnRBdD1YLnByb3RvdHlwZS5JYjtYLnByb3RvdHlwZS5lbHQ9WC5wcm90b3R5cGUuTjtYLnByb3RvdHlwZS5hZGQ9WC5wcm90b3R5cGUuYWRkO1gucHJvdG90eXBlLmZpbmRPYmplY3Q9WC5wcm90b3R5cGUuJGE7WC5wcm90b3R5cGUuZmluZEluVmlzdWFsVHJlZT1YLnByb3RvdHlwZS5ZbDtYLnByb3RvdHlwZS53YWxrVmlzdWFsVHJlZUZyb209WC5wcm90b3R5cGUueW07WC5wcm90b3R5cGUuZmluZE1haW5FbGVtZW50PVgucHJvdG90eXBlLnpiO3ZhciBjbj0hMSxkbj1udWxsLERsPW5ldyBMYigpO1guY2xhc3NOYW1lPSJQYW5lbCI7WC5kZWZpbmVQYW5lbExheW91dD1nbjtnbigiUG9zaXRpb24iLG5ldyBtbSgpKTtnbigiVmVydGljYWwiLG5ldyBwbSgpKTtnbigiQXV0byIsbmV3IHJtKCkpO2duKCJMaW5rIixuZXcgQm0oKSk7Z24oIkdyaWQiLG5ldyBBbSgpKTtmdW5jdGlvbiBRaigpe21iKHRoaXMpO3RoaXMuYWc9bnVsbDt0aGlzLkJyPSEwO3RoaXMuU2E9MDt0aGlzLlBjPU5hTjt0aGlzLldnPTA7dGhpcy5WZz1JbmZpbml0eTt0aGlzLndiPUVkO3RoaXMuc2E9dGhpcy5rYT0wO3RoaXMuYmI9bnVsbDt0aGlzLm9wPWhuO3RoaXMudWU9TGs7dGhpcy5rcD10aGlzLmRnPW51bGw7dGhpcy5scD1OYU47dGhpcy5pYj10aGlzLkhqPW51bGw7dGhpcy5obj0hMTt9UWoucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUWooKTthLkJyPXRoaXMuQnI7YS5TYT10aGlzLlNhO2EuUGM9dGhpcy5QYzthLldnPXRoaXMuV2c7YS5WZz10aGlzLlZnO2Eud2I9dGhpcy53YjthLmthPXRoaXMua2E7YS5zYT10aGlzLnNhO2EudWU9dGhpcy51ZTthLm9wPXRoaXMub3A7bnVsbD09PXRoaXMuZGc/YS5kZz1udWxsOmEuZGc9dGhpcy5kZy5JKCk7YS5rcD10aGlzLmtwO2EubHA9dGhpcy5scDthLkhqPW51bGw7bnVsbCE9PXRoaXMuSGomJihhLnNlcGFyYXRvckRhc2hBcnJheT1HYSh0aGlzLnNlcGFyYXRvckRhc2hBcnJheSkpO2EuaWI9dGhpcy5pYjthLmhuPXRoaXMuaG47YS5iYj10aGlzLmJiO3JldHVybiBhO307dD1Rai5wcm90b3R5cGU7dC5WbD1mdW5jdGlvbihhKXthLmlzUm93P3RoaXMuaGVpZ2h0PWEuaGVpZ2h0OnRoaXMud2lkdGg9YS53aWR0aDt0aGlzLm1pbmltdW09YS5taW5pbXVtO3RoaXMubWF4aW11bT1hLm1heGltdW07dGhpcy5hbGlnbm1lbnQ9YS5hbGlnbm1lbnQ7dGhpcy5zdHJldGNoPWEuc3RyZXRjaDt0aGlzLnNpemluZz1hLnNpemluZzt0aGlzLmRnPW51bGw9PT1hLnNlcGFyYXRvclBhZGRpbmc/bnVsbDphLnNlcGFyYXRvclBhZGRpbmcuSSgpO3RoaXMuc2VwYXJhdG9yU3Ryb2tlPWEuc2VwYXJhdG9yU3Ryb2tlO3RoaXMuc2VwYXJhdG9yU3Ryb2tlV2lkdGg9YS5zZXBhcmF0b3JTdHJva2VXaWR0aDt0aGlzLkhqPW51bGw7YS5zZXBhcmF0b3JEYXNoQXJyYXkmJih0aGlzLkhqPUdhKGEuc2VwYXJhdG9yRGFzaEFycmF5KSk7dGhpcy5iYWNrZ3JvdW5kPWEuYmFja2dyb3VuZDt0aGlzLmNvdmVyc1NlcGFyYXRvcnM9YS5jb3ZlcnNTZXBhcmF0b3JzO3RoaXMuYmI9YS5iYjt9O3QuZmI9ZnVuY3Rpb24oYSl7YS5jbGFzc1R5cGU9PT1RaiYmKHRoaXMuc2l6aW5nPWEpO307dC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSb3dDb2x1bW5EZWZpbml0aW9uICIrKHRoaXMuaXNSb3c/IihSb3cgIjoiKENvbHVtbiAiKSt0aGlzLmluZGV4KyIpICMiK0JiKHRoaXMpO307dC5TaT1mdW5jdGlvbihhKXt0aGlzLmFnPWE7fTt0Lk51PWZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz10aGlzLmFnLGQ9dGhpcy5pc1JvdztpZihudWxsIT09YyYmYy50eXBlPT09WC5UYWJsZSlmb3IodmFyIGU9ZD9jLnNiLmxlbmd0aDpjLm5iLmxlbmd0aCxmPTA7ZjxlO2YrKyl7dmFyIGc9ZD9jLnNiW2ZdOmMubmJbZl07aWYodm9pZCAwIT09Zyl7Yj1nLmluZGV4O2JyZWFrO319dGhpcy5pbmRleCE9PWImJihiPXRoaXMuc2VwYXJhdG9yU3Ryb2tlLG51bGw9PT1iJiZudWxsIT09YyYmKGI9dGhpcy5pc1Jvdz9jLmRlZmF1bHRSb3dTZXBhcmF0b3JTdHJva2U6Yy5kZWZhdWx0Q29sdW1uU2VwYXJhdG9yU3Ryb2tlKSxudWxsIT09YiYmKGE9dGhpcy5zZXBhcmF0b3JTdHJva2VXaWR0aCxpc05hTihhKSYmKG51bGwhPT1jP2E9dGhpcy5pc1Jvdz9jLmRlZmF1bHRSb3dTZXBhcmF0b3JTdHJva2VXaWR0aDpjLmRlZmF1bHRDb2x1bW5TZXBhcmF0b3JTdHJva2VXaWR0aDphPTApKSk7Yj10aGlzLmRnO2lmKG51bGw9PT1iKWlmKG51bGwhPT1jKWI9Yy5kZWZhdWx0U2VwYXJhdG9yUGFkZGluZztlbHNlIHJldHVybiBhO3JldHVybiBhKyh0aGlzLmlzUm93P2IudG9wOmIubGVmdCk7fTt0LnRjPWZ1bmN0aW9uKCl7dmFyIGE9MCxiPXRoaXMuYWcsYz0wLGQ9dGhpcy5pc1JvdztpZihudWxsIT09YiYmYi50eXBlPT09WC5UYWJsZSlmb3IodmFyIGU9ZD9iLnNiLmxlbmd0aDpiLm5iLmxlbmd0aCxmPTA7ZjxlO2YrKyl7dmFyIGc9ZD9iLnNiW2ZdOmIubmJbZl07aWYodm9pZCAwIT09Zyl7Yz1nLmluZGV4O2JyZWFrO319dGhpcy5pbmRleCE9PWMmJihjPXRoaXMuc2VwYXJhdG9yU3Ryb2tlLG51bGw9PT1jJiZudWxsIT09YiYmKGM9ZD9iLmRlZmF1bHRSb3dTZXBhcmF0b3JTdHJva2U6Yi5kZWZhdWx0Q29sdW1uU2VwYXJhdG9yU3Ryb2tlKSxudWxsIT09YyYmKGE9dGhpcy5zZXBhcmF0b3JTdHJva2VXaWR0aCxpc05hTihhKSYmKG51bGwhPT1iP2E9ZD9iLmRlZmF1bHRSb3dTZXBhcmF0b3JTdHJva2VXaWR0aDpiLmRlZmF1bHRDb2x1bW5TZXBhcmF0b3JTdHJva2VXaWR0aDphPTApKSk7ZD10aGlzLmRnO2lmKG51bGw9PT1kKWlmKG51bGwhPT1iKWQ9Yi5kZWZhdWx0U2VwYXJhdG9yUGFkZGluZztlbHNlIHJldHVybiBhO3JldHVybiBhKyh0aGlzLmlzUm93P2QudG9wK2QuYm90dG9tOmQubGVmdCtkLnJpZ2h0KTt9O3QueWI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYWc7aWYobnVsbCE9PWQmJihkLmFiKGFmLGEsdGhpcyxiLGMsdm9pZCAwLHZvaWQgMCksbnVsbCE9PXRoaXMuYmImJihiPWQuZGlhZ3JhbSxudWxsIT09YiYmIWIuc2tpcHNNb2RlbFNvdXJjZUJpbmRpbmdzJiYoZD1kLkdpKCksbnVsbCE9PWQmJihiPWQuZGF0YSxudWxsIT09YikpKSkpZm9yKGM9dGhpcy5iYi5pdGVyYXRvcjtjLm5leHQoKTspe2MudmFsdWUudXEodGhpcyxiLGEsZCk7fX07ZnVuY3Rpb24gdm0oYSl7aWYoYS5zaXppbmc9PT1obil7dmFyIGI9YS5hZztyZXR1cm4gYS5pc1Jvdz9iLnJvd1NpemluZzpiLmNvbHVtblNpemluZzt9cmV0dXJuIGEuc2l6aW5nO310LmJpbmQ9ZnVuY3Rpb24oYSl7YS5RZD10aGlzO3ZhciBiPXRoaXMucGFuZWw7aWYobnVsbCE9PWIpe3ZhciBjPWIuR2koKTtudWxsIT09YyYmemwoYykmJkEoIkNhbm5vdCBhZGQgYSBCaW5kaW5nIHRvIGEgUm93Q29sdW1uRGVmaW5pdGlvbiB0aGF0IGlzIGFscmVhZHkgZnJvemVuOiAiK2ErIiBvbiAiK2IpO31udWxsPT09dGhpcy5iYiYmKHRoaXMuYmI9bmV3IEUoKSk7dGhpcy5iYi5hZGQoYSk7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhRai5wcm90b3R5cGUse3BhbmVsOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYWc7fX0saXNSb3c6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Ccjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5Ccj1hO319LGluZGV4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuU2E7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuU2E9YTt9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5QYztiIT09YSYmKDA+YSYmeGEoYSwiPj0gMCIsUWosImhlaWdodCIpLHRoaXMuUGM9YSx0aGlzLmFjdHVhbD10aGlzLmthLG51bGwhPT10aGlzLnBhbmVsJiZ0aGlzLnBhbmVsLnMoKSx0aGlzLnliKCJoZWlnaHQiLGIsYSkpO319LHdpZHRoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUGM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuUGM7YiE9PWEmJigwPmEmJnhhKGEsIj49IDAiLFFqLCJ3aWR0aCIpLHRoaXMuUGM9YSx0aGlzLmFjdHVhbD10aGlzLmthLG51bGwhPT10aGlzLnBhbmVsJiZ0aGlzLnBhbmVsLnMoKSx0aGlzLnliKCJ3aWR0aCIsYixhKSk7fX0sbWluaW11bTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLldnO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLldnO2IhPT1hJiYoKDA+YXx8IWlzRmluaXRlKGEpKSYmeGEoYSwiPj0gMCIsUWosIm1pbmltdW0iKSx0aGlzLldnPWEsdGhpcy5hY3R1YWw9dGhpcy5rYSxudWxsIT09dGhpcy5wYW5lbCYmdGhpcy5wYW5lbC5zKCksdGhpcy55YigibWluaW11bSIsYixhKSk7fX0sbWF4aW11bTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlZnO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlZnO2IhPT1hJiYoMD5hJiZ4YShhLCI+PSAwIixRaiwibWF4aW11bSIpLHRoaXMuVmc9YSx0aGlzLmFjdHVhbD10aGlzLmthLG51bGwhPT10aGlzLnBhbmVsJiZ0aGlzLnBhbmVsLnMoKSx0aGlzLnliKCJtYXhpbXVtIixiLGEpKTt9fSxhbGlnbm1lbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53Yjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy53YjtiLkEoYSl8fCh0aGlzLndiPWEuSSgpLG51bGwhPT10aGlzLnBhbmVsJiZ0aGlzLnBhbmVsLnMoKSx0aGlzLnliKCJhbGlnbm1lbnQiLGIsYSkpO319LHN0cmV0Y2g6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy51ZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy51ZTtiIT09YSYmKHRoaXMudWU9YSxudWxsIT09dGhpcy5wYW5lbCYmdGhpcy5wYW5lbC5zKCksdGhpcy55Yigic3RyZXRjaCIsYixhKSk7fX0sc2VwYXJhdG9yUGFkZGluZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmRnO30sc2V0OmZ1bmN0aW9uIHNldChhKXsibnVtYmVyIj09PXR5cGVvZiBhJiYoYT1uZXcgSWMoYSkpO3ZhciBiPXRoaXMuZGc7bnVsbCE9PWEmJm51bGwhPT1iJiZiLkEoYSl8fChudWxsIT09YSYmKGE9YS5JKCkpLHRoaXMuZGc9YSxudWxsIT09dGhpcy5wYW5lbCYmdGhpcy5wYW5lbC5zKCksdGhpcy55Yigic2VwYXJhdG9yUGFkZGluZyIsYixhKSk7fX0sc2VwYXJhdG9yU3Ryb2tlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMua3A7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMua3A7YiE9PWEmJihudWxsPT09YXx8InN0cmluZyI9PT10eXBlb2YgYXx8YSBpbnN0YW5jZW9mIGtsKSYmKGEgaW5zdGFuY2VvZiBrbCYmYS5mcmVlemUoKSx0aGlzLmtwPWEsbnVsbCE9PXRoaXMucGFuZWwmJnRoaXMucGFuZWwucygpLHRoaXMueWIoInNlcGFyYXRvclN0cm9rZSIsYixhKSk7fX0sc2VwYXJhdG9yU3Ryb2tlV2lkdGg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5scDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5scDtiIT09YSYmKHRoaXMubHA9YSxudWxsIT09dGhpcy5wYW5lbCYmdGhpcy5wYW5lbC5zKCksdGhpcy55Yigic2VwYXJhdG9yU3Ryb2tlV2lkdGgiLGIsYSkpO319LHNlcGFyYXRvckRhc2hBcnJheTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkhqO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkhqO2lmKGIhPT1hKXtpZihudWxsIT09YSl7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9MCxlPTA7ZTxjO2UrKyl7dmFyIGY9YVtlXTsibnVtYmVyIj09PXR5cGVvZiBmJiYwPD1mJiZpc0Zpbml0ZShmKXx8QSgic2VwYXJhdG9yRGFzaEFycmF5IHZhbHVlICIrZisiIGF0IGluZGV4ICIrZSsiIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgb3IgemVyby4iKTtkKz1mO31pZigwPT09ZCl7aWYobnVsbD09PWIpcmV0dXJuO2E9bnVsbDt9fXRoaXMuSGo9YTtudWxsIT09dGhpcy5wYW5lbCYmdGhpcy5wYW5lbC5SKCk7dGhpcy55Yigic2VwYXJhdG9yRGFzaEFycmF5IixiLGEpO319fSxiYWNrZ3JvdW5kOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuaWI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuaWI7YiE9PWEmJihudWxsPT09YXx8InN0cmluZyI9PT10eXBlb2YgYXx8YSBpbnN0YW5jZW9mIGtsKSYmKGEgaW5zdGFuY2VvZiBrbCYmYS5mcmVlemUoKSx0aGlzLmliPWEsbnVsbCE9PXRoaXMucGFuZWwmJnRoaXMucGFuZWwuUigpLHRoaXMueWIoImJhY2tncm91bmQiLGIsYSkpO319LGNvdmVyc1NlcGFyYXRvcnM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5objt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5objtiIT09YSYmKHRoaXMuaG49YSxudWxsIT09dGhpcy5wYW5lbCYmdGhpcy5wYW5lbC5SKCksdGhpcy55YigiY292ZXJzU2VwYXJhdG9ycyIsYixhKSk7fX0sc2l6aW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMub3A7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMub3A7YiE9PWEmJih0aGlzLm9wPWEsbnVsbCE9PXRoaXMucGFuZWwmJnRoaXMucGFuZWwucygpLHRoaXMueWIoInNpemluZyIsYixhKSk7fX0sYWN0dWFsOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMua2E7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMua2E9aXNOYU4odGhpcy5QYyk/TWF0aC5tYXgoTWF0aC5taW4odGhpcy5WZyxhKSx0aGlzLldnKTpNYXRoLm1heChNYXRoLm1pbih0aGlzLlZnLHRoaXMuUGMpLHRoaXMuV2cpO319LHRvdGFsOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMua2ErdGhpcy50YygpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmthPWlzTmFOKHRoaXMuUGMpP01hdGgubWF4KE1hdGgubWluKHRoaXMuVmcsYSksdGhpcy5XZyk6TWF0aC5tYXgoTWF0aC5taW4odGhpcy5WZyx0aGlzLlBjKSx0aGlzLldnKTt0aGlzLmthPU1hdGgubWF4KDAsdGhpcy5rYS10aGlzLnRjKCkpO319LHBvc2l0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuc2E7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuc2E9YTt9fX0pO1FqLnByb3RvdHlwZS5iaW5kPVFqLnByb3RvdHlwZS5iaW5kO1FqLnByb3RvdHlwZS5jb21wdXRlRWZmZWN0aXZlU3BhY2luZz1Rai5wcm90b3R5cGUudGM7UWoucHJvdG90eXBlLmNvbXB1dGVFZmZlY3RpdmVTcGFjaW5nVG9wPVFqLnByb3RvdHlwZS5OdTt2YXIgaG49bmV3IEQoUWosIkRlZmF1bHQiLDApLHdtPW5ldyBEKFFqLCJOb25lIiwxKSxNbT1uZXcgRChRaiwiUHJvcG9ydGlvbmFsRXh0cmEiLDIpO1FqLmNsYXNzTmFtZT0iUm93Q29sdW1uRGVmaW5pdGlvbiI7UWouRGVmYXVsdD1objtRai5Ob25lPXdtO1FqLlByb3BvcnRpb25hbEV4dHJhPU1tO2Z1bmN0aW9uIFcoKXtZLmNhbGwodGhpcyk7dGhpcy5QZD10aGlzLnFhPW51bGw7dGhpcy5Waz0iTm9uZSI7dGhpcy5Hbj1Mazt0aGlzLkdjPXRoaXMuV2s9ImJsYWNrIjt0aGlzLmloPTE7dGhpcy5JbD0iYnV0dCI7dGhpcy5KbD0ibWl0ZXIiO3RoaXMuSmo9MTA7dGhpcy5naD1udWxsO3RoaXMuaGg9MDt0aGlzLmNmPXRoaXMuYmY9RWQ7dGhpcy5Mbz10aGlzLktvPU5hTjt0aGlzLlJuPSExO3RoaXMuTm89bnVsbDt0aGlzLllrPXRoaXMuUGw9Ik5vbmUiO3RoaXMuQ2Q9MTt0aGlzLkJkPTA7dGhpcy56ZD0xO3RoaXMuQWQ9bnVsbDt9b2EoVyxZKTtXLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZD1mdW5jdGlvbihhKXtZLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZC5jYWxsKHRoaXMsYSk7YS5xYT10aGlzLnFhO2EuVms9dGhpcy5WazthLkduPXRoaXMuR247YS5QZD10aGlzLlBkO2EuV2s9dGhpcy5XazthLkdjPXRoaXMuR2M7YS5paD10aGlzLmloO2EuSWw9dGhpcy5JbDthLkpsPXRoaXMuSmw7YS5Kaj10aGlzLkpqO251bGwhPT10aGlzLmdoJiYoYS5naD1HYSh0aGlzLmdoKSk7YS5oaD10aGlzLmhoO2EuYmY9dGhpcy5iZi5JKCk7YS5jZj10aGlzLmNmLkkoKTthLktvPXRoaXMuS287YS5Mbz10aGlzLkxvO2EuUm49dGhpcy5SbjthLk5vPXRoaXMuTm87YS5QbD10aGlzLlBsO2EuWWs9dGhpcy5ZazthLkNkPXRoaXMuQ2Q7YS5CZD10aGlzLkJkO2EuemQ9dGhpcy56ZDthLkFkPXRoaXMuQWQ7fTt0PVcucHJvdG90eXBlO3QuZmI9ZnVuY3Rpb24oYSl7YT09PVpnfHxhPT09YWh8fGE9PT1Pa3x8YT09PUxrP3RoaXMuZ2VvbWV0cnlTdHJldGNoPWE6WS5wcm90b3R5cGUuZmIuY2FsbCh0aGlzLGEpO307dC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJTaGFwZSgiKygiTm9uZSIhPT10aGlzLmZpZ3VyZT90aGlzLmZpZ3VyZToiTm9uZSIhPT10aGlzLnRvQXJyb3c/dGhpcy50b0Fycm93OnRoaXMuZnJvbUFycm93KSsiKSMiK0JiKHRoaXMpO307ZnVuY3Rpb24gbW4oYSxiLGMsZCl7dmFyIGU9Yy5sZW5ndGg7aWYoISg0PmUpKXt2YXIgZj1kLm1lYXN1cmVkQm91bmRzLGc9TWF0aC5tYXgoMSxmLndpZHRoKTtmPWYuaGVpZ2h0O2Zvcih2YXIgaD1jWzBdLGs9Y1sxXSxsLG0sbixwLHEscix1PTAseD1LYSgpLHY9Mjt2PGU7dis9Mil7bD1jW3ZdLG09Y1t2KzFdLG49bC1oLGg9bS1rLDA9PT1uJiYobj0uMDAxKSxwPWgvbixxPU1hdGguYXRhbjIoaCxuKSxyPU1hdGguc3FydChuKm4raCpoKSx4LnB1c2goW24scSxwLHJdKSx1Kz1yLGg9bCxrPW07fWg9Y1swXTtrPWNbMV07bj1kLm1lYXN1cmVkQm91bmRzLndpZHRoO2QgaW5zdGFuY2VvZiBXJiYobi09ZC5zdHJva2VXaWR0aCk7MT5uJiYobj0xKTtlPWM9bjtsPWcvMjttPTA9PT1sPyExOiEwO3Y9MDtyPXhbdl07bj1yWzBdO3E9clsxXTtwPXJbMl07cj1yWzNdO2Zvcih2YXIgeT0wOy4xPD11Oyl7MD09PXkmJihtPyhlPWMsZS09bCx1LT1sLG09ITEpOmU9YywwPT09ZSYmKGU9MSkpO2lmKGU+dSl7T2EoeCk7cmV0dXJuO31lPnI/KHk9ZS1yLGU9cik6eT0wO3ZhciB6PU1hdGguc3FydChlKmUvKDErcCpwKSk7MD5uJiYoej0teik7aCs9ejtrKz1wKno7YS50cmFuc2xhdGUoaCxrKTthLnJvdGF0ZShxKTthLnRyYW5zbGF0ZSgtKGcvMiksLShmLzIpKTswPT09eSYmZC5DaShhLGIpO2EudHJhbnNsYXRlKGcvMixmLzIpO2Eucm90YXRlKC1xKTthLnRyYW5zbGF0ZSgtaCwtayk7dS09ZTtyLT1lO2lmKDAhPT15KXt2Kys7aWYodj09PXgubGVuZ3RoKXtPYSh4KTtyZXR1cm47fXI9eFt2XTtuPXJbMF07cT1yWzFdO3A9clsyXTtyPXJbM107ZT15O319T2EoeCk7fX10LkNpPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5HYyxkPXRoaXMuV2s7aWYobnVsbCE9PWN8fG51bGwhPT1kKXt2YXIgZT10aGlzLmFjdHVhbEJvdW5kcyxmPXRoaXMubmF0dXJhbEJvdW5kcztudWxsIT09ZCYmamkodGhpcyxhLGQsITAsITEsZixlKTtudWxsIT09YyYmamkodGhpcyxhLGMsITEsITEsZixlKTtlPXRoaXMucGFydDtmPXRoaXMuaWg7MD09PWYmJm51bGwhPT1lJiYoZj1lIGluc3RhbmNlb2YgcGYmJmUudHlwZT09PVguTGluayYmIlNlbGVjdGlvbiI9PT1lLmNhdGVnb3J5JiZlLmFkb3JuZWRPYmplY3QgaW5zdGFuY2VvZiBXJiZlLmFkb3JuZWRQYXJ0LnpiKCk9PT1lLmFkb3JuZWRPYmplY3Q/ZS5hZG9ybmVkT2JqZWN0LnN0cm9rZVdpZHRoOjApO2EubGluZVdpZHRoPWY7YS5saW5lSm9pbj10aGlzLkpsO2EubGluZUNhcD10aGlzLklsO2EubWl0ZXJMaW1pdD10aGlzLkpqO3ZhciBnPSExO2UmJmIuRGUoImRyYXdTaGFkb3dzIikmJihnPWUuaXNTaGFkb3dlZCk7dmFyIGg9ITA7bnVsbCE9PWMmJm51bGw9PT1kJiYoaD0hMSk7ZT0hMTt2YXIgaz10aGlzLnN0cm9rZURhc2hBcnJheTtudWxsIT09ayYmKGU9ITAsYS5QcyhrLHRoaXMuaGgpKTt2YXIgbD10aGlzLnFhO2lmKG51bGwhPT1sKXtpZihsLnR5cGU9PT1jZSlhLmJlZ2luUGF0aCgpLGEubW92ZVRvKGwuc3RhcnRYLGwuc3RhcnRZKSxhLmxpbmVUbyhsLmVuZFgsbC5lbmRZKSxudWxsIT09ZCYmYS5UZChkKSwwIT09ZiYmbnVsbCE9PWMmJmEuV2koKTtlbHNlIGlmKGwudHlwZT09PWtlKXt2YXIgbT1sLnN0YXJ0WCxuPWwuc3RhcnRZLHA9bC5lbmRYLHE9bC5lbmRZO2s9TWF0aC5taW4obSxwKTtsPU1hdGgubWluKG4scSk7bT1NYXRoLmFicyhwLW0pO249TWF0aC5hYnMocS1uKTtudWxsIT09ZCYmKGEuYmVnaW5QYXRoKCksYS5yZWN0KGssbCxtLG4pLGEuVGQoZCkpO251bGwhPT1jJiYocD1kPWM9MCxoJiZnJiYoYz1hLnNoYWRvd09mZnNldFgsZD1hLnNoYWRvd09mZnNldFkscD1hLnNoYWRvd0JsdXIsYS5zaGFkb3dPZmZzZXRYPTAsYS5zaGFkb3dPZmZzZXRZPTAsYS5zaGFkb3dCbHVyPTApLDAhPT1mJiYoYS5iZWdpblBhdGgoKSxhLnJlY3QoayxsLG0sbiksYS5XaSgpKSxoJiZnJiYoYS5zaGFkb3dPZmZzZXRYPWMsYS5zaGFkb3dPZmZzZXRZPWQsYS5zaGFkb3dCbHVyPXApKTt9ZWxzZSBpZihsLnR5cGU9PT1sZSluPWwuc3RhcnRYLGs9bC5zdGFydFkscD1sLmVuZFgscT1sLmVuZFksbD1NYXRoLmFicyhwLW4pLzIsbT1NYXRoLmFicyhxLWspLzIsbj1NYXRoLm1pbihuLHApK2wsaz1NYXRoLm1pbihrLHEpK20sYS5iZWdpblBhdGgoKSxhLm1vdmVUbyhuLGstbSksYS5iZXppZXJDdXJ2ZVRvKG4rSC54ZypsLGstbSxuK2wsay1ILnhnKm0sbitsLGspLGEuYmV6aWVyQ3VydmVUbyhuK2wsaytILnhnKm0sbitILnhnKmwsayttLG4sayttKSxhLmJlemllckN1cnZlVG8obi1ILnhnKmwsayttLG4tbCxrK0gueGcqbSxuLWwsayksYS5iZXppZXJDdXJ2ZVRvKG4tbCxrLUgueGcqbSxuLUgueGcqbCxrLW0sbixrLW0pLGEuY2xvc2VQYXRoKCksbnVsbCE9PWQmJmEuVGQoZCksMCE9PWYmJm51bGwhPT1jJiYoaCYmZz8oZj1hLnNoYWRvd09mZnNldFgsZz1hLnNoYWRvd09mZnNldFksYz1hLnNoYWRvd0JsdXIsYS5zaGFkb3dPZmZzZXRYPTAsYS5zaGFkb3dPZmZzZXRZPTAsYS5zaGFkb3dCbHVyPTAsYS5XaSgpLGEuc2hhZG93T2Zmc2V0WD1mLGEuc2hhZG93T2Zmc2V0WT1nLGEuc2hhZG93Qmx1cj1jKTphLldpKCkpO2Vsc2UgaWYobC50eXBlPT09YWUpZm9yKGs9bC5maWd1cmVzLGw9ay5sZW5ndGgsbT0wO208bDttKyspe249ay5qW21dO2EuYmVnaW5QYXRoKCk7YS5tb3ZlVG8obi5zdGFydFgsbi5zdGFydFkpO3A9bi5zZWdtZW50cy5qO3E9cC5sZW5ndGg7Zm9yKHZhciByPW51bGwsdT0wO3U8cTt1Kyspe3ZhciB4PXBbdV07c3dpdGNoKHgudHlwZSl7Y2FzZSB6ZTphLm1vdmVUbyh4LmVuZFgseC5lbmRZKTticmVhaztjYXNlIGllOmEubGluZVRvKHguZW5kWCx4LmVuZFkpO2JyZWFrO2Nhc2UgQWU6YS5iZXppZXJDdXJ2ZVRvKHgucG9pbnQxWCx4LnBvaW50MVkseC5wb2ludDJYLHgucG9pbnQyWSx4LmVuZFgseC5lbmRZKTticmVhaztjYXNlIEJlOmEucXVhZHJhdGljQ3VydmVUbyh4LnBvaW50MVgseC5wb2ludDFZLHguZW5kWCx4LmVuZFkpO2JyZWFrO2Nhc2UgQ2U6aWYoeC5yYWRpdXNYPT09eC5yYWRpdXNZKXt2YXIgdj1NYXRoLlBJLzE4MDthLmFyYyh4LnBvaW50MVgseC5wb2ludDFZLHgucmFkaXVzWCx4LnN0YXJ0QW5nbGUqdiwoeC5zdGFydEFuZ2xlK3guc3dlZXBBbmdsZSkqdiwwPnguc3dlZXBBbmdsZSxudWxsIT09cj9yLmVuZFg6bi5zdGFydFgsbnVsbCE9PXI/ci5lbmRZOm4uc3RhcnRZKTt9ZWxzZSBpZihyPUVlKHgsbiksdj1yLmxlbmd0aCwwPT09dilhLmxpbmVUbyh4LmNlbnRlclgseC5jZW50ZXJZKTtlbHNlIGZvcih2YXIgeT0wO3k8djt5Kyspe3ZhciB6PXJbeV07MD09PXkmJmEubGluZVRvKHpbMF0selsxXSk7YS5iZXppZXJDdXJ2ZVRvKHpbMl0selszXSx6WzRdLHpbNV0sels2XSx6WzddKTt9YnJlYWs7Y2FzZSBEZTp5PXY9MDtpZihudWxsIT09ciYmci50eXBlPT09Q2Upe3I9RWUocixuKTt6PXIubGVuZ3RoO2lmKDA9PT16KXthLmxpbmVUbyh4LmNlbnRlclgseC5jZW50ZXJZKTticmVhazt9cj1yW3otMV18fG51bGw7bnVsbCE9PXImJih2PXJbNl0seT1yWzddKTt9ZWxzZSB2PW51bGwhPT1yP3IuZW5kWDpuLnN0YXJ0WCx5PW51bGwhPT1yP3IuZW5kWTpuLnN0YXJ0WTtyPUZlKHgsbix2LHkpO3Y9ci5sZW5ndGg7aWYoMD09PXYpe2EubGluZVRvKHguY2VudGVyWCx4LmNlbnRlclkpO2JyZWFrO31mb3IoeT0wO3k8djt5Kyspe3o9clt5XSxhLmJlemllckN1cnZlVG8oelsyXSx6WzNdLHpbNF0sels1XSx6WzZdLHpbN10pO31icmVhaztkZWZhdWx0OkEoIlNlZ21lbnQgbm90IG9mIHZhbGlkIHR5cGU6ICIreC50eXBlKTt9eC5pc0Nsb3NlZCYmYS5jbG9zZVBhdGgoKTtyPXg7fWc/KHU9cT1wPTAsbi5pc1NoYWRvd2VkPyghMD09PW4uaXNGaWxsZWQmJm51bGwhPT1kPyhhLlRkKGQpLGg9ITApOmg9ITEsMCE9PWYmJm51bGwhPT1jJiYoaCYmKHA9YS5zaGFkb3dPZmZzZXRYLHE9YS5zaGFkb3dPZmZzZXRZLHU9YS5zaGFkb3dCbHVyLGEuc2hhZG93T2Zmc2V0WD0wLGEuc2hhZG93T2Zmc2V0WT0wLGEuc2hhZG93Qmx1cj0wKSxhLldpKCksaCYmKGEuc2hhZG93T2Zmc2V0WD1wLGEuc2hhZG93T2Zmc2V0WT1xLGEuc2hhZG93Qmx1cj11KSkpOihoJiYocD1hLnNoYWRvd09mZnNldFgscT1hLnNoYWRvd09mZnNldFksdT1hLnNoYWRvd0JsdXIsYS5zaGFkb3dPZmZzZXRYPTAsYS5zaGFkb3dPZmZzZXRZPTAsYS5zaGFkb3dCbHVyPTApLCEwPT09bi5pc0ZpbGxlZCYmbnVsbCE9PWQmJmEuVGQoZCksMCE9PWYmJm51bGwhPT1jJiZhLldpKCksaCYmKGEuc2hhZG93T2Zmc2V0WD1wLGEuc2hhZG93T2Zmc2V0WT1xLGEuc2hhZG93Qmx1cj11KSkpOighMD09PW4uaXNGaWxsZWQmJm51bGwhPT1kJiZhLlRkKGQpLDAhPT1mJiZudWxsIT09YyYmYS5XaSgpKTt9ZSYmYS5OcygpO2lmKG51bGwhPT10aGlzLnBhdGhQYXR0ZXJuKXtlPXRoaXMucGF0aFBhdHRlcm47ZS5tZWFzdXJlKEluZmluaXR5LEluZmluaXR5KTtmPWUubWVhc3VyZWRCb3VuZHM7ZS5hcnJhbmdlKDAsMCxmLndpZHRoLGYuaGVpZ2h0KTtnPXRoaXMuZ2VvbWV0cnk7YS5zYXZlKCk7YS5iZWdpblBhdGgoKTtmPUthKCk7aWYoZy50eXBlPT09Y2UpZi5wdXNoKGcuc3RhcnRYKSxmLnB1c2goZy5zdGFydFkpLGYucHVzaChnLmVuZFgpLGYucHVzaChnLmVuZFkpLG1uKGEsYixmLGUpO2Vsc2UgaWYoZy50eXBlPT09YWUpZm9yKGc9Zy5maWd1cmVzLml0ZXJhdG9yO2cubmV4dCgpOyl7Yz1nLnZhbHVlO2YubGVuZ3RoPTA7Zi5wdXNoKGMuc3RhcnRYKTtmLnB1c2goYy5zdGFydFkpO2Q9Yy5zdGFydFg7aD1jLnN0YXJ0WTtrPWQ7bD1oO209Yy5zZWdtZW50cy5qO249bS5sZW5ndGg7Zm9yKHA9MDtwPG47cCsrKXtxPW1bcF07c3dpdGNoKHEudHlwZSl7Y2FzZSB6ZTptbihhLGIsZixlKTtmLmxlbmd0aD0wO2YucHVzaChxLmVuZFgpO2YucHVzaChxLmVuZFkpO2Q9cS5lbmRYO2g9cS5lbmRZO2s9ZDtsPWg7YnJlYWs7Y2FzZSBpZTpmLnB1c2gocS5lbmRYKTtmLnB1c2gocS5lbmRZKTtkPXEuZW5kWDtoPXEuZW5kWTticmVhaztjYXNlIEFlOkguemUoZCxoLHEucG9pbnQxWCxxLnBvaW50MVkscS5wb2ludDJYLHEucG9pbnQyWSxxLmVuZFgscS5lbmRZLC41LGYpO2Q9cS5lbmRYO2g9cS5lbmRZO2JyZWFrO2Nhc2UgQmU6SC5qcShkLGgscS5wb2ludDFYLHEucG9pbnQxWSxxLmVuZFgscS5lbmRZLC41LGYpO2Q9cS5lbmRYO2g9cS5lbmRZO2JyZWFrO2Nhc2UgQ2U6dT1FZShxLGMpO3g9dS5sZW5ndGg7aWYoMD09PXgpe2YucHVzaChxLmNlbnRlclgpO2YucHVzaChxLmNlbnRlclkpO2Q9cS5jZW50ZXJYO2g9cS5jZW50ZXJZO2JyZWFrO31mb3Iocj0wO3I8eDtyKyspe3Y9dVtyXSxILnplKGQsaCx2WzJdLHZbM10sdls0XSx2WzVdLHZbNl0sdls3XSwuNSxmKSxkPXZbNl0saD12WzddO31icmVhaztjYXNlIERlOnU9RmUocSxjLGQsaCk7eD11Lmxlbmd0aDtpZigwPT09eCl7Zi5wdXNoKHEuY2VudGVyWCk7Zi5wdXNoKHEuY2VudGVyWSk7ZD1xLmNlbnRlclg7aD1xLmNlbnRlclk7YnJlYWs7fWZvcihyPTA7cjx4O3IrKyl7dj11W3JdLEguemUoZCxoLHZbMl0sdlszXSx2WzRdLHZbNV0sdls2XSx2WzddLC41LGYpLGQ9dls2XSxoPXZbN107fWJyZWFrO2RlZmF1bHQ6QSgiU2VnbWVudCBub3Qgb2YgdmFsaWQgdHlwZTogIitxLnR5cGUpO31xLmlzQ2xvc2VkJiYoZi5wdXNoKGspLGYucHVzaChsKSxtbihhLGIsZixlKSk7fW1uKGEsYixmLGUpO31lbHNlIGlmKGcudHlwZT09PWtlKWYucHVzaChnLnN0YXJ0WCksZi5wdXNoKGcuc3RhcnRZKSxmLnB1c2goZy5lbmRYKSxmLnB1c2goZy5zdGFydFkpLGYucHVzaChnLmVuZFgpLGYucHVzaChnLmVuZFkpLGYucHVzaChnLnN0YXJ0WCksZi5wdXNoKGcuZW5kWSksZi5wdXNoKGcuc3RhcnRYKSxmLnB1c2goZy5zdGFydFkpLG1uKGEsYixmLGUpO2Vsc2UgaWYoZy50eXBlPT09bGUpe2g9bmV3IFVlKCk7aC5zdGFydFg9Zy5lbmRYO2guc3RhcnRZPShnLnN0YXJ0WStnLmVuZFkpLzI7ZD1uZXcgVmUoQ2UpO2Quc3RhcnRBbmdsZT0wO2Quc3dlZXBBbmdsZT0zNjA7ZC5jZW50ZXJYPShnLnN0YXJ0WCtnLmVuZFgpLzI7ZC5jZW50ZXJZPShnLnN0YXJ0WStnLmVuZFkpLzI7ZC5yYWRpdXNYPU1hdGguYWJzKGcuc3RhcnRYLWcuZW5kWCkvMjtkLnJhZGl1c1k9TWF0aC5hYnMoZy5zdGFydFktZy5lbmRZKS8yO2guYWRkKGQpO2c9RWUoZCxoKTtjPWcubGVuZ3RoO2lmKDA9PT1jKWYucHVzaChkLmNlbnRlclgpLGYucHVzaChkLmNlbnRlclkpO2Vsc2UgZm9yKGQ9aC5zdGFydFgsaD1oLnN0YXJ0WSxrPTA7azxjO2srKyl7bD1nW2tdLEguemUoZCxoLGxbMl0sbFszXSxsWzRdLGxbNV0sbFs2XSxsWzddLC41LGYpLGQ9bFs2XSxoPWxbN107fW1uKGEsYixmLGUpO31PYShmKTthLnJlc3RvcmUoKTthLlJjKCExKTt9fX19O3QubWE9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj1uZXcgRygpKTtpZihhIGluc3RhbmNlb2YgTyl7YS5qYygpJiZBKCJnZXREb2N1bWVudFBvaW50IFNwb3QgbXVzdCBiZSBhIHJlYWwsIHNwZWNpZmljIFNwb3QsIG5vdDogIithLnRvU3RyaW5nKCkpO3ZhciBjPXRoaXMubmF0dXJhbEJvdW5kcyxkPXRoaXMuc3Ryb2tlV2lkdGg7Yi5oKGEueCooYy53aWR0aCtkKS1kLzIrYy54K2Eub2Zmc2V0WCxhLnkqKGMuaGVpZ2h0K2QpLWQvMitjLnkrYS5vZmZzZXRZKTt9ZWxzZSBiLnNldChhKTt0aGlzLnJkLnRhKGIpO3JldHVybiBiO307dC5WcD1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1uZXcgTigpKTt2YXIgYj10aGlzLm5hdHVyYWxCb3VuZHMsYz10aGlzLnJkO2I9Ti5hbGxvY0F0KGIueCxiLnksYi53aWR0aCxiLmhlaWdodCk7dmFyIGQ9dGhpcy5zdHJva2VXaWR0aDtiLlVjKGQvMixkLzIpO2Q9Ry5hbGxvY0F0KGIueCxiLnkpLnRyYW5zZm9ybShjKTthLmgoZC54LGQueSwwLDApO2QuaChiLnJpZ2h0LGIueSkudHJhbnNmb3JtKGMpO0JjKGEsZC54LGQueSwwLDApO2QuaChiLnJpZ2h0LGIuYm90dG9tKS50cmFuc2Zvcm0oYyk7QmMoYSxkLngsZC55LDAsMCk7ZC5oKGIueCxiLmJvdHRvbSkudHJhbnNmb3JtKGMpO0JjKGEsZC54LGQueSwwLDApO04uZnJlZShiKTtHLmZyZWUoZCk7cmV0dXJuIGE7fTt0LnZoPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5nZW9tZXRyeTtpZihudWxsPT09Y3x8bnVsbD09PXRoaXMuZmlsbCYmbnVsbD09PXRoaXMuc3Ryb2tlKXJldHVybiExO3ZhciBkPWMuYm91bmRzLGU9dGhpcy5zdHJva2VXaWR0aC8yO2MudHlwZSE9PWNlfHxifHwoZSs9Mik7dmFyIGY9Ti5hbGxvYygpO2YuYXNzaWduKGQpO2YuVWMoZSsyLGUrMik7aWYoIWYuZWEoYSkpcmV0dXJuIE4uZnJlZShmKSwhMTtkPWUrMUUtNDtpZihjLnR5cGU9PT1jZSl7aWYobnVsbD09PXRoaXMuc3Ryb2tlKXJldHVybiExO2Q9KGMuZW5kWC1jLnN0YXJ0WCkqKGEueC1jLnN0YXJ0WCkrKGMuZW5kWS1jLnN0YXJ0WSkqKGEueS1jLnN0YXJ0WSk7aWYoMD4oYy5zdGFydFgtYy5lbmRYKSooYS54LWMuZW5kWCkrKGMuc3RhcnRZLWMuZW5kWSkqKGEueS1jLmVuZFkpfHwwPmQpcmV0dXJuITE7Ti5mcmVlKGYpO3JldHVybiBILlViKGMuc3RhcnRYLGMuc3RhcnRZLGMuZW5kWCxjLmVuZFksZSxhLngsYS55KTt9aWYoYy50eXBlPT09a2Upe2I9Yy5zdGFydFg7dmFyIGc9Yy5zdGFydFksaD1jLmVuZFg7Yz1jLmVuZFk7Zi54PU1hdGgubWluKGIsaCk7Zi55PU1hdGgubWluKGcsYyk7Zi53aWR0aD1NYXRoLmFicyhoLWIpO2YuaGVpZ2h0PU1hdGguYWJzKGMtZyk7aWYobnVsbD09PXRoaXMuZmlsbCl7Zi5VYygtZCwtZCk7aWYoZi5lYShhKSlyZXR1cm4gTi5mcmVlKGYpLCExO2YuVWMoZCxkKTt9bnVsbCE9PXRoaXMuc3Ryb2tlJiZmLlVjKGUsZSk7YT1mLmVhKGEpO04uZnJlZShmKTtyZXR1cm4gYTt9aWYoYy50eXBlPT09bGUpe2c9Yy5zdGFydFg7ZT1jLnN0YXJ0WTtoPWMuZW5kWDt2YXIgaz1jLmVuZFk7Yz1NYXRoLm1pbihnLGgpO2I9TWF0aC5taW4oZSxrKTtnPU1hdGguYWJzKGgtZykvMjtlPU1hdGguYWJzKGstZSkvMjtjPWEueC0oYytnKTtiPWEueS0oYitlKTtpZihudWxsPT09dGhpcy5maWxsKXtnLT1kO2UtPWQ7aWYoMD49Z3x8MD49ZXx8MT49YypjLyhnKmcpK2IqYi8oZSplKSlyZXR1cm4gTi5mcmVlKGYpLCExO2crPWQ7ZSs9ZDt9bnVsbCE9PXRoaXMuc3Ryb2tlJiYoZys9ZCxlKz1kKTtOLmZyZWUoZik7cmV0dXJuIDA+PWd8fDA+PWU/ITE6MT49YypjLyhnKmcpK2IqYi8oZSplKTt9aWYoYy50eXBlPT09YWUpcmV0dXJuIE4uZnJlZShmKSxudWxsPT09dGhpcy5maWxsP0hlKGMsYS54LGEueSxlKTpjLmVhKGEsZSwxPHRoaXMuc3Ryb2tlV2lkdGgsYik7QSgiVW5rbm93biBHZW9tZXRyeSB0eXBlOiAiK2MudHlwZSk7cmV0dXJuITE7fTt0LmhtPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuZGVzaXJlZFNpemUsZj10aGlzLmloO2E9TWF0aC5tYXgoYSwwKTtiPU1hdGgubWF4KGIsMCk7aWYobnVsbCE9PXRoaXMuUGQpdmFyIGc9dGhpcy5nZW9tZXRyeS5ib3VuZHM7ZWxzZXt2YXIgaD10aGlzLmZpZ3VyZSxrPW5uW2hdO2lmKHZvaWQgMD09PWspe3ZhciBsPUguSmVbaF07InN0cmluZyI9PT10eXBlb2YgbCYmKGw9SC5KZVtsXSk7ImZ1bmN0aW9uIj09PXR5cGVvZiBsPyhrPWwobnVsbCwxMDAsMTAwKSxubltoXT1rKTpBKCJVbnN1cHBvcnRlZCBGaWd1cmU6ICIraCk7fWc9ay5ib3VuZHM7fWg9Zy53aWR0aDtrPWcuaGVpZ2h0O2w9Zy53aWR0aDt2YXIgbT1nLmhlaWdodDtzd2l0Y2goYmwodGhpcywhMCkpe2Nhc2UgWmc6ZD1jPTA7YnJlYWs7Y2FzZSBiZTpsPU1hdGgubWF4KGEtZiwwKTttPU1hdGgubWF4KGItZiwwKTticmVhaztjYXNlIE1rOmw9TWF0aC5tYXgoYS1mLDApO2Q9MDticmVhaztjYXNlIE5rOmM9MCxtPU1hdGgubWF4KGItZiwwKTt9aXNGaW5pdGUoZS53aWR0aCkmJihsPWUud2lkdGgpO2lzRmluaXRlKGUuaGVpZ2h0KSYmKG09ZS5oZWlnaHQpO2U9dGhpcy5tYXhTaXplO2c9dGhpcy5taW5TaXplO2M9TWF0aC5tYXgoYy1mLGcud2lkdGgpO2Q9TWF0aC5tYXgoZC1mLGcuaGVpZ2h0KTtsPU1hdGgubWluKGUud2lkdGgsbCk7bT1NYXRoLm1pbihlLmhlaWdodCxtKTtsPWlzRmluaXRlKGwpP01hdGgubWF4KGMsbCk6TWF0aC5tYXgoaCxjKTttPWlzRmluaXRlKG0pP01hdGgubWF4KGQsbSk6TWF0aC5tYXgoayxkKTtjPSRnKHRoaXMpO3N3aXRjaChjKXtjYXNlIFpnOmJyZWFrO2Nhc2UgYmU6aD1sO2s9bTticmVhaztjYXNlIGFoOmM9TWF0aC5taW4obC9oLG0vayk7aXNGaW5pdGUoYyl8fChjPTEpO2gqPWM7ayo9YzticmVhaztkZWZhdWx0OkEoYysiIGlzIG5vdCBhIHZhbGlkIGdlb21ldHJ5U3RyZXRjaC4iKTt9bnVsbCE9PXRoaXMuUGQ/KGg9TWF0aC5tYXgoaCwuMDEpLGs9TWF0aC5tYXgoaywuMDEpLGc9bnVsbCE9PXRoaXMuUGQ/dGhpcy5QZDp0aGlzLnFhLGU9aCxkPWssYz1nLmNvcHkoKSxnPWcuYm91bmRzLGUvPWcud2lkdGgsZC89Zy5oZWlnaHQsaXNGaW5pdGUoZSl8fChlPTEpLGlzRmluaXRlKGQpfHwoZD0xKSwxPT09ZSYmMT09PWR8fGMuc2NhbGUoZSxkKSx0aGlzLnFhPWMpOm51bGwhPT10aGlzLnFhJiZILmNhKHRoaXMucWEuZWwsYS1mKSYmSC5jYSh0aGlzLnFhLmNsLGItZil8fCh0aGlzLnFhPVcubWFrZUdlb21ldHJ5KHRoaXMsaCxrKSk7Zz10aGlzLnFhLmJvdW5kcztJbmZpbml0eT09PWF8fEluZmluaXR5PT09Yj9aayh0aGlzLGcueC1mLzIsZy55LWYvMiwwPT09YSYmMD09PWg/MDpnLndpZHRoK2YsMD09PWImJjA9PT1rPzA6Zy5oZWlnaHQrZik6WmsodGhpcywtKGYvMiksLShmLzIpLGwrZixtK2YpO307ZnVuY3Rpb24gJGcoYSl7dmFyIGI9YS5nZW9tZXRyeVN0cmV0Y2g7cmV0dXJuIG51bGwhPT1hLlBkP2I9PT1Maz9iZTpiOmI9PT1Maz9ublthLmZpZ3VyZV0uZGVmYXVsdFN0cmV0Y2g6Yjt9dC50aD1mdW5jdGlvbihhLGIsYyxkKXtkbCh0aGlzLGEsYixjLGQpO307dC5UYz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuYmsoYS54LGEueSxiLngsYi55LGMpO307dC5iaz1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXRoaXMudHJhbnNmb3JtLGc9MS8oZi5tMTEqZi5tMjItZi5tMTIqZi5tMjEpLGg9Zi5tMjIqZyxrPS1mLm0xMipnLGw9LWYubTIxKmcsbT1mLm0xMSpnLG49ZyooZi5tMjEqZi5keS1mLm0yMipmLmR4KSxwPWcqKGYubTEyKmYuZHgtZi5tMTEqZi5keSk7Zj1hKmgrYipsK247Zz1hKmsrYiptK3A7aD1jKmgrZCpsK247az1jKmsrZCptK3A7bj10aGlzLmloLzI7bD10aGlzLnFhO251bGw9PT1sJiYodGhpcy5tZWFzdXJlKEluZmluaXR5LEluZmluaXR5KSxsPXRoaXMucWEpO3A9bC5ib3VuZHM7bT0hMTtpZihsLnR5cGU9PT1jZSl7aWYoMS41Pj10aGlzLnN0cm9rZVdpZHRoKW09SC5GZShsLnN0YXJ0WCxsLnN0YXJ0WSxsLmVuZFgsbC5lbmRZLGYsZyxoLGssZSk7ZWxzZXtsLnN0YXJ0WD09PWwuZW5kWD8oZD1uLG09MCk6KGI9KGwuZW5kWS1sLnN0YXJ0WSkvKGwuZW5kWC1sLnN0YXJ0WCksbT1uL01hdGguc3FydCgxK2IqYiksZD1tKmIpO2I9S2EoKTthPW5ldyBHKCk7SC5GZShsLnN0YXJ0WCtkLGwuc3RhcnRZK20sbC5lbmRYK2QsbC5lbmRZK20sZixnLGgsayxhKSYmYi5wdXNoKGEpO2E9bmV3IEcoKTtILkZlKGwuc3RhcnRYLWQsbC5zdGFydFktbSxsLmVuZFgtZCxsLmVuZFktbSxmLGcsaCxrLGEpJiZiLnB1c2goYSk7YT1uZXcgRygpO0guRmUobC5zdGFydFgrZCxsLnN0YXJ0WSttLGwuc3RhcnRYLWQsbC5zdGFydFktbSxmLGcsaCxrLGEpJiZiLnB1c2goYSk7YT1uZXcgRygpO0guRmUobC5lbmRYK2QsbC5lbmRZK20sbC5lbmRYLWQsbC5lbmRZLW0sZixnLGgsayxhKSYmYi5wdXNoKGEpO2g9Yi5sZW5ndGg7aWYoMD09PWgpcmV0dXJuIE9hKGIpLCExO209ITA7az1JbmZpbml0eTtmb3IoZD0wO2Q8aDtkKyspe2E9YltkXSxjPShhLngtZikqKGEueC1mKSsoYS55LWcpKihhLnktZyksYzxrJiYoaz1jLGUueD1hLngsZS55PWEueSk7fU9hKGIpO319ZWxzZSBpZihsLnR5cGU9PT1rZSltPUguVGMocC54LW4scC55LW4scC54K3Aud2lkdGgrbixwLnkrcC5oZWlnaHQrbixmLGcsaCxrLGUpO2Vsc2UgaWYobC50eXBlPT09bGUpe2I9Ti5hbGxvY0F0KHAueCxwLnkscC53aWR0aCxwLmhlaWdodCkuVWMobixuKTthOmlmKDA9PT1iLndpZHRoKW09SC5GZShiLngsYi55LGIueCxiLnkrYi5oZWlnaHQsZixnLGgsayxlKTtlbHNlIGlmKDA9PT1iLmhlaWdodCltPUguRmUoYi54LGIueSxiLngrYi53aWR0aCxiLnksZixnLGgsayxlKTtlbHNle2E9Yi53aWR0aC8yO2w9Yi5oZWlnaHQvMjtkPWIueCthO209Yi55K2w7Yz05OTk5O2YhPT1oJiYoYz0oZy1rKS8oZi1oKSk7aWYoOTk5OT5NYXRoLmFicyhjKSl7az1nLW0tYyooZi1kKTtpZigwPmEqYSpjKmMrbCpsLWsqayl7ZS54PU5hTjtlLnk9TmFOO209ITE7YnJlYWsgYTt9bj1NYXRoLnNxcnQoYSphKmMqYytsKmwtayprKTtoPSgtKGEqYSpjKmspK2EqbCpuKS8obCpsK2EqYSpjKmMpK2Q7YT0oLShhKmEqYyprKS1hKmwqbikvKGwqbCthKmEqYypjKStkO2w9YyooaC1kKStrK207az1jKihhLWQpK2srbTtNYXRoLmFicygoZi1oKSooZi1oKSkrTWF0aC5hYnMoKGctbCkqKGctbCkpPE1hdGguYWJzKChmLWEpKihmLWEpKStNYXRoLmFicygoZy1rKSooZy1rKSk/KGUueD1oLGUueT1sKTooZS54PWEsZS55PWspO31lbHNle2g9bCpsO2s9Zi1kO2gtPWgvKGEqYSkqayprO2lmKDA+aCl7ZS54PU5hTjtlLnk9TmFOO209ITE7YnJlYWsgYTt9az1NYXRoLnNxcnQoaCk7aD1tK2s7az1tLWs7TWF0aC5hYnMoaC1nKTxNYXRoLmFicyhrLWcpPyhlLng9ZixlLnk9aCk6KGUueD1mLGUueT1rKTt9bT0hMDt9Ti5mcmVlKGIpO31lbHNlIGlmKGwudHlwZT09PWFlKXtwPUcuYWxsb2MoKTt2YXIgcT1oLWY7dmFyIHI9ay1nO3ZhciB1PXEqcStyKnI7ZS54PWg7ZS55PWs7Zm9yKHZhciB4PTA7eDxsLmZpZ3VyZXMuY291bnQ7eCsrKXt2YXIgdj1sLmZpZ3VyZXMualt4XSx5PXYuc2VnbWVudHM7cT12LnN0YXJ0WDtyPXYuc3RhcnRZO2Zvcih2YXIgej1xLEI9cixDPTA7Qzx5LmNvdW50O0MrKyl7dmFyIEk9eS5qW0NdLEo9SS50eXBlO3ZhciBMPUkuZW5kWDt2YXIgVT1JLmVuZFk7dmFyIFE9ITE7c3dpdGNoKEope2Nhc2UgemU6ej1MO0I9VTticmVhaztjYXNlIGllOlE9b24ocSxyLEwsVSxmLGcsaCxrLHApO2JyZWFrO2Nhc2UgQWU6UT1ILk1wKHEscixJLnBvaW50MVgsSS5wb2ludDFZLEkucG9pbnQyWCxJLnBvaW50MlksTCxVLGYsZyxoLGssLjYscCk7YnJlYWs7Y2FzZSBCZTpRPUguTXAocSxyLChxKzIqSS5wb2ludDFYKS8zLChyKzIqSS5wb2ludDFZKS8zLCgyKkkucG9pbnQxWCtMKS8zLCgyKkkucG9pbnQxWCtMKS8zLEwsVSxmLGcsaCxrLC42LHApO2JyZWFrO2Nhc2UgQ2U6Y2FzZSBEZTpKPUkudHlwZT09PUNlP0VlKEksdik6RmUoSSx2LHEscik7dmFyIGlhPUoubGVuZ3RoO2lmKDA9PT1pYSl7UT1vbihxLHIsSS5jZW50ZXJYLEkuY2VudGVyWSxmLGcsaCxrLHApO2JyZWFrO31VPW51bGw7Zm9yKEw9MDtMPGlhO0wrKyl7VT1KW0xdO2lmKDA9PT1MJiZvbihxLHIsVVswXSxVWzFdLGYsZyxoLGsscCkpe3ZhciBqYT1wbihmLGcscCx1LGUpO2phPHUmJih1PWphLG09ITApO31ILk1wKFVbMF0sVVsxXSxVWzJdLFVbM10sVVs0XSxVWzVdLFVbNl0sVVs3XSxmLGcsaCxrLC42LHApJiYoamE9cG4oZixnLHAsdSxlKSxqYTx1JiYodT1qYSxtPSEwKSk7fUw9VVs2XTtVPVVbN107YnJlYWs7ZGVmYXVsdDpBKCJVbmtub3duIFNlZ21lbnQgdHlwZTogIitKKTt9cT1MO3I9VTtRJiYoUT1wbihmLGcscCx1LGUpLFE8dSYmKHU9USxtPSEwKSk7SS5pc0Nsb3NlZCYmKEw9eixVPUIsb24ocSxyLEwsVSxmLGcsaCxrLHApJiYoST1wbihmLGcscCx1LGUpLEk8dSYmKHU9SSxtPSEwKSkpO319Zj1jLWE7Zz1kLWI7aD1NYXRoLnNxcnQoZipmK2cqZyk7MCE9PWgmJihmLz1oLGcvPWgpO2UueC09ZipuO2UueS09ZypuO0cuZnJlZShwKTt9ZWxzZSBBKCJVbmtub3duIEdlb21ldHJ5IHR5cGU6ICIrbC50eXBlKTtpZighbSlyZXR1cm4hMTt0aGlzLnRyYW5zZm9ybS50YShlKTtyZXR1cm4hMDt9O2Z1bmN0aW9uIHBuKGEsYixjLGQsZSl7YT1jLngtYTtiPWMueS1iO2I9YSphK2IqYjtyZXR1cm4gYjxkPyhlLng9Yy54LGUueT1jLnksYik6ZDt9ZnVuY3Rpb24gb24oYSxiLGMsZCxlLGYsZyxoLGspe3ZhciBsPSExLG09KGUtZykqKGItZCktKGYtaCkqKGEtYyk7aWYoMD09PW0pcmV0dXJuITE7ay54PSgoZSpoLWYqZykqKGEtYyktKGUtZykqKGEqZC1iKmMpKS9tO2sueT0oKGUqaC1mKmcpKihiLWQpLShmLWgpKihhKmQtYipjKSkvbTsoYT5jP2EtYzpjLWEpPChiPmQ/Yi1kOmQtYik/KGE9YjxkP2I6ZCxiPWI8ZD9kOmIsKGsueT5hfHxILmNhKGsueSxhKSkmJihrLnk8Ynx8SC5jYShrLnksYikpJiYobD0hMCkpOihiPWE8Yz9hOmMsYT1hPGM/YzphLChrLng+Ynx8SC5jYShrLngsYikpJiYoay54PGF8fEguY2Eoay54LGEpKSYmKGw9ITApKTtyZXR1cm4gbDt9dC51aD1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMD09PWIpcmV0dXJuIGEubGYodGhpcy5hY3R1YWxCb3VuZHMpO3ZhciBjPXRoaXMucWE7bnVsbD09PWMmJih0aGlzLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHkpLGM9dGhpcy5xYSk7Yz1jLmJvdW5kczt2YXIgZD10aGlzLnN0cm9rZVdpZHRoLzIsZT0hMSxmPUcuYWxsb2MoKTtmLmgoYy54LWQsYy55LWQpO2EuZWEoYi50YShmKSkmJihmLmgoYy54LWQsYy5ib3R0b20rZCksYS5lYShiLnRhKGYpKSYmKGYuaChjLnJpZ2h0K2QsYy5ib3R0b20rZCksYS5lYShiLnRhKGYpKSYmKGYuaChjLnJpZ2h0K2QsYy55LWQpLGEuZWEoYi50YShmKSkmJihlPSEwKSkpKTtHLmZyZWUoZik7cmV0dXJuIGU7fTt0LkljPWZ1bmN0aW9uKGEsYil7aWYodGhpcy51aChhLGIpfHx2b2lkIDA9PT1iJiYoYj10aGlzLnRyYW5zZm9ybSxhLmxmKHRoaXMuYWN0dWFsQm91bmRzKSkpcmV0dXJuITA7dmFyIGM9UWMuYWxsb2MoKTtjLnNldChiKTtjLmJ0KCk7dmFyIGQ9YS5sZWZ0LGU9YS5yaWdodCxmPWEudG9wO2E9YS5ib3R0b207dmFyIGc9Ry5hbGxvYygpO2cuaChkLGYpO2MudGEoZyk7aWYodGhpcy52aChnLCEwKSlyZXR1cm4gRy5mcmVlKGcpLCEwO2cuaChlLGYpO2MudGEoZyk7aWYodGhpcy52aChnLCEwKSlyZXR1cm4gRy5mcmVlKGcpLCEwO2cuaChkLGEpO2MudGEoZyk7aWYodGhpcy52aChnLCEwKSlyZXR1cm4gRy5mcmVlKGcpLCEwO2cuaChlLGEpO2MudGEoZyk7aWYodGhpcy52aChnLCEwKSlyZXR1cm4gRy5mcmVlKGcpLCEwO3ZhciBoPUcuYWxsb2MoKSxrPUcuYWxsb2MoKTtjLnNldChiKTtjLm52KHRoaXMudHJhbnNmb3JtKTtjLmJ0KCk7aC54PWU7aC55PWY7aC50cmFuc2Zvcm0oYyk7Zy54PWQ7Zy55PWY7Zy50cmFuc2Zvcm0oYyk7Yj0hMTtxbih0aGlzLGcsaCxrKT9iPSEwOihnLng9ZSxnLnk9YSxnLnRyYW5zZm9ybShjKSxxbih0aGlzLGcsaCxrKT9iPSEwOihoLng9ZCxoLnk9YSxoLnRyYW5zZm9ybShjKSxxbih0aGlzLGcsaCxrKT9iPSEwOihnLng9ZCxnLnk9ZixnLnRyYW5zZm9ybShjKSxxbih0aGlzLGcsaCxrKSYmKGI9ITApKSkpO0cuZnJlZShnKTtRYy5mcmVlKGMpO0cuZnJlZShoKTtHLmZyZWUoayk7cmV0dXJuIGI7fTtmdW5jdGlvbiBxbihhLGIsYyxkKXtpZighYS5UYyhiLGMsZCkpcmV0dXJuITE7YT1iLng7Yj1iLnk7dmFyIGU9Yy54LGY9Yy55O2M9ZC54O2Q9ZC55O2lmKGE9PT1lKXJldHVybiBiPGY/KGE9YixiPWYpOmE9ZixkPj1hJiZkPD1iO2E8ZT8oZD1hLGE9ZSk6ZD1lO3JldHVybiBjPj1kJiZjPD1hO310Lmp4PWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9MDtkPGM7ZCs9Mil7aWYoYi5jZChhW2RdLGFbZCsxXSk+ZSlyZXR1cm4hMDt9cmV0dXJuITE7fWlmKGMmJm51bGwhPT10aGlzLmZpbGwmJnRoaXMudmgoYSwhMCkpcmV0dXJuITA7dmFyIGU9YS5CZShiKSxmPWU7MS41PHRoaXMuc3Ryb2tlV2lkdGgmJihlPXRoaXMuc3Ryb2tlV2lkdGgvMitNYXRoLnNxcnQoZSksZSo9ZSk7Yj10aGlzLnFhO2lmKG51bGw9PT1iJiYodGhpcy5tZWFzdXJlKEluZmluaXR5LEluZmluaXR5KSxiPXRoaXMucWEsbnVsbD09PWIpKXJldHVybiExO2lmKCFjKXt2YXIgZz1iLmJvdW5kcyxoPWcueCxrPWcueSxsPWcueCtnLndpZHRoO2c9Zy55K2cuaGVpZ2h0O2lmKFNiKGEueCxhLnksaCxrKTw9ZSYmU2IoYS54LGEueSxsLGspPD1lJiZTYihhLngsYS55LGgsZyk8PWUmJlNiKGEueCxhLnksbCxnKTw9ZSlyZXR1cm4hMDt9aD1iLnN0YXJ0WDtrPWIuc3RhcnRZO2w9Yi5lbmRYO2c9Yi5lbmRZO2lmKGIudHlwZT09PWNlKXtpZihjPShoLWwpKihhLngtbCkrKGstZykqKGEueS1nKSxSYihhLngsYS55LGgsayxsLGcpPD0oMDw9KGwtaCkqKGEueC1oKSsoZy1rKSooYS55LWspJiYwPD1jP2U6ZikpcmV0dXJuITA7fWVsc2V7aWYoYi50eXBlPT09a2UpcmV0dXJuIGI9ITEsYyYmKGI9UmIoYS54LGEueSxoLGssaCxnKTw9ZXx8UmIoYS54LGEueSxoLGssbCxrKTw9ZXx8UmIoYS54LGEueSxsLGssbCxnKTw9ZXx8UmIoYS54LGEueSxoLGcsbCxnKTw9ZSksYjtpZihiLnR5cGU9PT1sZSl7Yj1hLngtKGgrbCkvMjtmPWEueS0oaytnKS8yO3ZhciBtPU1hdGguYWJzKGwtaCkvMixuPU1hdGguYWJzKGctaykvMjtpZigwPT09bXx8MD09PW4pcmV0dXJuIFJiKGEueCxhLnksaCxrLGwsZyk8PWU/ITA6ITE7aWYoYyl7aWYoYT1ILkR5KG0sbixiLGYpLGEqYTw9ZSlyZXR1cm4hMDt9ZWxzZSByZXR1cm4gU2IoYixmLC1tLDApPj1lfHxTYihiLGYsMCwtbik+PWV8fFNiKGIsZiwwLG4pPj1lfHxTYihiLGYsbSwwKT49ZT8hMTohMDt9ZWxzZSBpZihiLnR5cGU9PT1hZSl7bD1iLmJvdW5kcztmPWwueDtoPWwueTtrPWwueCtsLndpZHRoO2w9bC55K2wuaGVpZ2h0O2lmKGEueD5rJiZhLng8ZiYmYS55PmwmJmEueTxoJiZSYihhLngsYS55LGYsaCxmLGwpPmUmJlJiKGEueCxhLnksZixoLGssaCk+ZSYmUmIoYS54LGEueSxrLGwsZixsKT5lJiZSYihhLngsYS55LGssbCxrLGgpPmUpcmV0dXJuITE7Zj1NYXRoLnNxcnQoZSk7aWYoYyl7aWYobnVsbD09PXRoaXMuZmlsbD9IZShiLGEueCxhLnksZik6Yi5lYShhLGYsITApKXJldHVybiEwO31lbHNle2M9Yi5maWd1cmVzO2ZvcihiPTA7YjxjLmNvdW50O2IrKyl7Zj1jLmpbYl07Zz1mLnN0YXJ0WDttPWYuc3RhcnRZO2lmKGEuY2QoZyxtKT5lKXJldHVybiExO2g9Zi5zZWdtZW50cy5qO2s9aC5sZW5ndGg7Zm9yKGw9MDtsPGs7bCsrKXtzd2l0Y2gobj1oW2xdLG4udHlwZSl7Y2FzZSB6ZTpjYXNlIGllOmc9bi5lbmRYO209bi5lbmRZO2lmKGEuY2QoZyxtKT5lKXJldHVybiExO2JyZWFrO2Nhc2UgQWU6dmFyIHA9S2EoKTtILnplKGcsbSxuLnBvaW50MVgsbi5wb2ludDFZLG4ucG9pbnQyWCxuLnBvaW50Mlksbi5lbmRYLG4uZW5kWSwuOCxwKTtnPWQocCxhKTtPYShwKTtpZihnKXJldHVybiExO2c9bi5lbmRYO209bi5lbmRZO2lmKGEuY2QoZyxtKT5lKXJldHVybiExO2JyZWFrO2Nhc2UgQmU6cD1LYSgpO0guanEoZyxtLG4ucG9pbnQxWCxuLnBvaW50MVksbi5lbmRYLG4uZW5kWSwuOCxwKTtnPWQocCxhKTtPYShwKTtpZihnKXJldHVybiExO2c9bi5lbmRYO209bi5lbmRZO2lmKGEuY2QoZyxtKT5lKXJldHVybiExO2JyZWFrO2Nhc2UgQ2U6Y2FzZSBEZTpwPW4udHlwZT09PUNlP0VlKG4sZik6RmUobixmLGcsbSk7dmFyIHE9cC5sZW5ndGg7aWYoMD09PXEpe2c9bi5jZW50ZXJYO209bi5jZW50ZXJZO2lmKGEuY2QoZyxtKT5lKXJldHVybiExO2JyZWFrO31uPW51bGw7Zm9yKHZhciByPUthKCksdT0wO3U8cTt1Kyspe2lmKG49cFt1XSxyLmxlbmd0aD0wLEguemUoblswXSxuWzFdLG5bMl0sblszXSxuWzRdLG5bNV0sbls2XSxuWzddLC44LHIpLGQocixhKSlyZXR1cm4gT2EociksITE7fU9hKHIpO251bGwhPT1uJiYoZz1uWzZdLG09bls3XSk7YnJlYWs7ZGVmYXVsdDpBKCJVbmtub3duIFNlZ21lbnQgdHlwZTogIituLnR5cGUpO319fXJldHVybiEwO319fXJldHVybiExO307dC5iYz1mdW5jdGlvbigpe3RoaXMucWE9bnVsbDt9O2Z1bmN0aW9uIHJuKGEpe3ZhciBiPWEuZGlhZ3JhbTtudWxsIT09YiYmYi51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHwoYS5zZWdtZW50T3JpZW50YXRpb249c24sIk5vbmUiIT09YS5QbD8oYS5zZWdtZW50SW5kZXg9LTEsYS5hbGlnbm1lbnRGb2N1cz1TZCk6Ik5vbmUiIT09YS5ZayYmKGEuc2VnbWVudEluZGV4PTAsYS5hbGlnbm1lbnRGb2N1cz1uZXcgTygxLVNkLngsU2QueSkpKTt9Vy5tYWtlR2VvbWV0cnk9ZnVuY3Rpb24oYSxiLGMpe2lmKCJOb25lIiE9PWEudG9BcnJvdyl2YXIgZD10blthLnRvQXJyb3ddO2Vsc2UiTm9uZSIhPT1hLmZyb21BcnJvdz9kPXRuW2EuZnJvbUFycm93XTooZD1ILkplW2EuZmlndXJlXSwic3RyaW5nIj09PXR5cGVvZiBkJiYoZD1ILkplW2RdKSx2b2lkIDA9PT1kJiZBKCJVbmtub3duIFNoYXBlLmZpZ3VyZTogIithLmZpZ3VyZSksZD1kKGEsYixjKSxkLmVsPWIsZC5jbD1jKTtpZihudWxsPT09ZCl7dmFyIGU9SC5KZS5SZWN0YW5nbGU7ImZ1bmN0aW9uIj09PXR5cGVvZiBlJiYoZD1lKGEsYixjKSk7fXJldHVybiBkO307ZnVuY3Rpb24gdW4oYSl7dmFyIGI9dG5bYV07aWYodm9pZCAwPT09Yil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO2lmKCJub25lIj09PWMpcmV0dXJuIk5vbmUiO2I9dG5bY107aWYodm9pZCAwPT09Yil7dmFyIGQ9bnVsbCxlO2ZvcihlIGluIEguQm0pe2lmKGUudG9Mb3dlckNhc2UoKT09PWMpe2Q9ZTticmVhazt9fWlmKG51bGwhPT1kKXJldHVybiBhPW1lKEguQm1bZF0sITEpLHRuW2RdPWEsYyE9PWQmJih0bltjXT1kKSxkO319cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYj9iOmIgaW5zdGFuY2VvZiAkZD9hOm51bGw7fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFcucHJvdG90eXBlLHtnZW9tZXRyeTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5xYT90aGlzLnFhOnRoaXMuUGQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMucWE7aWYoYiE9PWEpe251bGwhPT1hP3RoaXMuUGQ9dGhpcy5xYT1hLmZyZWV6ZSgpOnRoaXMuUGQ9dGhpcy5xYT1udWxsO3ZhciBjPXRoaXMucGFydDtudWxsIT09YyYmKGMuVWc9TmFOKTt0aGlzLnMoKTt0aGlzLmcoImdlb21ldHJ5IixiLGEpO1ZrKHRoaXMpJiYoYT10aGlzLnBhcnQsbnVsbCE9PWEmJldrKHRoaXMsYSwiZ2VvbWV0cnlTdHJpbmciKSk7fX19LGdlb21ldHJ5U3RyaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGw9PT10aGlzLmdlb21ldHJ5PyIiOnRoaXMuZ2VvbWV0cnkudG9TdHJpbmcoKTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7YT1tZShhKTt2YXIgYj1hLm5vcm1hbGl6ZSgpO3RoaXMuZ2VvbWV0cnk9YTt0aGlzLnBvc2l0aW9uPWE9Ry5hbGxvY0F0KC1iLngsLWIueSk7Ry5mcmVlKGEpO319LGlzR2VvbWV0cnlQb3NpdGlvbmVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUm47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuUm47YiE9PWEmJih0aGlzLlJuPWEsdGhpcy5zKCksdGhpcy5nKCJpc0dlb21ldHJ5UG9zaXRpb25lZCIsYixhKSk7fX0sZmlsbDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLldrO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLldrO2IhPT1hJiYoYSBpbnN0YW5jZW9mIGtsJiZhLmZyZWV6ZSgpLHRoaXMuV2s9YSx0aGlzLlIoKSx0aGlzLmcoImZpbGwiLGIsYSkpO319LHN0cm9rZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkdjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkdjO2IhPT1hJiYoYSBpbnN0YW5jZW9mIGtsJiZhLmZyZWV6ZSgpLHRoaXMuR2M9YSx0aGlzLlIoKSx0aGlzLmcoInN0cm9rZSIsYixhKSk7fX0sc3Ryb2tlV2lkdGg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5paDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5paDtpZihiIT09YSlpZigwPD1hKXt0aGlzLmloPWE7dGhpcy5zKCk7dmFyIGM9dGhpcy5wYXJ0O251bGwhPT1jJiYoYy5VZz1OYU4pO3RoaXMuZygic3Ryb2tlV2lkdGgiLGIsYSk7fWVsc2UgeGEoYSwidmFsdWUgPj0gMCIsVywic3Ryb2tlV2lkdGg6dmFsdWUiKTt9fSxzdHJva2VDYXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5JbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5JbDtiIT09YSYmKCJzdHJpbmciIT09dHlwZW9mIGF8fCJidXR0IiE9PWEmJiJyb3VuZCIhPT1hJiYic3F1YXJlIiE9PWE/eGEoYSwnImJ1dHQiLCAicm91bmQiLCBvciAic3F1YXJlIicsVywic3Ryb2tlQ2FwIik6KHRoaXMuSWw9YSx0aGlzLlIoKSx0aGlzLmcoInN0cm9rZUNhcCIsYixhKSkpO319LHN0cm9rZUpvaW46e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5KbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5KbDtiIT09YSYmKCJzdHJpbmciIT09dHlwZW9mIGF8fCJtaXRlciIhPT1hJiYiYmV2ZWwiIT09YSYmInJvdW5kIiE9PWE/eGEoYSwnIm1pdGVyIiwgImJldmVsIiwgb3IgInJvdW5kIicsVywic3Ryb2tlSm9pbiIpOih0aGlzLkpsPWEsdGhpcy5SKCksdGhpcy5nKCJzdHJva2VKb2luIixiLGEpKSk7fX0sc3Ryb2tlTWl0ZXJMaW1pdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkpqO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkpqO2lmKGIhPT1hJiYxPD1hKXt0aGlzLkpqPWE7dGhpcy5SKCk7dmFyIGM9dGhpcy5wYXJ0O251bGwhPT1jJiYoYy5VZz1OYU4pO3RoaXMuZygic3Ryb2tlTWl0ZXJMaW1pdCIsYixhKTt9fX0sc3Ryb2tlRGFzaEFycmF5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZ2g7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuZ2g7aWYoYiE9PWEpe2lmKG51bGwhPT1hKXtmb3IodmFyIGM9YS5sZW5ndGgsZD0wLGU9MDtlPGM7ZSsrKXt2YXIgZj1hW2VdOzA8PWYmJmlzRmluaXRlKGYpfHxBKCJzdHJva2VEYXNoQXJyYXk6dmFsdWUgIitmKyIgYXQgaW5kZXggIitlKyIgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciB6ZXJvLiIpO2QrPWY7fWlmKDA9PT1kKXtpZihudWxsPT09YilyZXR1cm47YT1udWxsO319dGhpcy5naD1hO3RoaXMuUigpO3RoaXMuZygic3Ryb2tlRGFzaEFycmF5IixiLGEpO319fSxzdHJva2VEYXNoT2Zmc2V0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuaGg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuaGg7YiE9PWEmJjA8PWEmJih0aGlzLmhoPWEsdGhpcy5SKCksdGhpcy5nKCJzdHJva2VEYXNoT2Zmc2V0IixiLGEpKTt9fSxmaWd1cmU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Wazt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5WaztpZihiIT09YSl7dmFyIGM9SC5KZVthXTsiZnVuY3Rpb24iPT09dHlwZW9mIGM/Yz1hOihjPUguSmVbYS50b0xvd2VyQ2FzZSgpXSl8fEEoIlVua25vd24gU2hhcGUuZmlndXJlOiAiK2EpO2IhPT1jJiYoYT10aGlzLnBhcnQsbnVsbCE9PWEmJihhLlVnPU5hTiksdGhpcy5Waz1jLHRoaXMuUGQ9bnVsbCx0aGlzLmJjKCksdGhpcy5zKCksdGhpcy5nKCJmaWd1cmUiLGIsYykpO319fSx0b0Fycm93OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUGw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuUGw7ITA9PT1hP2E9IlN0YW5kYXJkIjohMT09PWEmJihhPSIiKTtpZihiIT09YSl7dmFyIGM9dW4oYSk7bnVsbD09PWM/QSgiVW5rbm93biBTaGFwZS50b0Fycm93OiAiK2EpOmIhPT1jJiYodGhpcy5QbD1jLHRoaXMuUGQ9bnVsbCx0aGlzLmJjKCksdGhpcy5zKCkscm4odGhpcyksdGhpcy5nKCJ0b0Fycm93IixiLGMpKTt9fX0sZnJvbUFycm93OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWWs7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuWWs7ITA9PT1hP2E9IlN0YW5kYXJkIjohMT09PWEmJihhPSIiKTtpZihiIT09YSl7dmFyIGM9dW4oYSk7bnVsbD09PWM/QSgiVW5rbm93biBTaGFwZS5mcm9tQXJyb3c6ICIrYSk6YiE9PWMmJih0aGlzLllrPWMsdGhpcy5QZD1udWxsLHRoaXMuYmMoKSx0aGlzLnMoKSxybih0aGlzKSx0aGlzLmcoImZyb21BcnJvdyIsYixjKSk7fX19LHNwb3QxOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYmY7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuYmY7Yi5BKGEpfHwodGhpcy5iZj1hPWEuSSgpLHRoaXMucygpLHRoaXMuZygic3BvdDEiLGIsYSkpO319LHNwb3QyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuY2Y7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuY2Y7Yi5BKGEpfHwodGhpcy5jZj1hPWEuSSgpLHRoaXMucygpLHRoaXMuZygic3BvdDIiLGIsYSkpO319LHBhcmFtZXRlcjE6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Lbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5LbztiIT09YSYmKHRoaXMuS289YSx0aGlzLmJjKCksdGhpcy5zKCksdGhpcy5nKCJwYXJhbWV0ZXIxIixiLGEpKTt9fSxwYXJhbWV0ZXIyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTG87fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuTG87YiE9PWEmJih0aGlzLkxvPWEsdGhpcy5iYygpLHRoaXMucygpLHRoaXMuZygicGFyYW1ldGVyMiIsYixhKSk7fX0sbmF0dXJhbEJvdW5kczp7Z2V0OmZ1bmN0aW9uIGdldCgpe2lmKG51bGwhPT10aGlzLnFhKXJldHVybiB0aGlzLnFjLmFzc2lnbih0aGlzLnFhLmJvdW5kcyksdGhpcy5xYzt2YXIgYT10aGlzLmRlc2lyZWRTaXplO3JldHVybiBuZXcgTigwLDAsYS53aWR0aCxhLmhlaWdodCk7fX0scGF0aFBhdHRlcm46e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Obzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ObztiIT09YSYmKHRoaXMuTm89YSx0aGlzLlIoKSx0aGlzLmcoInBhdGhQYXR0ZXJuIixiLGEpKTt9fSxnZW9tZXRyeVN0cmV0Y2g6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Hbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5HbjtiIT09YSYmKHRoaXMuR249YSx0aGlzLmcoImdlb21ldHJ5U3RyZXRjaCIsYixhKSk7fX0saW50ZXJ2YWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5DZDthPU1hdGguZmxvb3IoYSk7aWYoYiE9PWEmJjA8PWEpe3RoaXMuQ2Q9YTt2YXIgYz10aGlzLmRpYWdyYW07bnVsbCE9PWMmJnRoaXMucGFuZWw9PT1jLmdyaWQmJmtqKGMpO3RoaXMucygpO2M9dGhpcy5wYW5lbDtudWxsIT09YyYmKGMuTWc9bnVsbCk7dGhpcy5nKCJpbnRlcnZhbCIsYixhKTt9fX0sZ3JhZHVhdGVkU3RhcnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5CZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5CZDtiIT09YSYmKDA+YT9hPTA6MTxhJiYoYT0xKSx0aGlzLkJkPWEsdGhpcy5zKCksdGhpcy5nKCJncmFkdWF0ZWRTdGFydCIsYixhKSk7fX0sZ3JhZHVhdGVkRW5kOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuemQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuemQ7YiE9PWEmJigwPmE/YT0wOjE8YSYmKGE9MSksdGhpcy56ZD1hLHRoaXMucygpLHRoaXMuZygiZ3JhZHVhdGVkRW5kIixiLGEpKTt9fSxncmFkdWF0ZWRTa2lwOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQWQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuQWQ7YiE9PWEmJih0aGlzLkFkPWEsdGhpcy5zKCksdGhpcy5nKCJncmFkdWF0ZWRTa2lwIixiLGEpKTt9fX0pO1cucHJvdG90eXBlLmludGVyc2VjdHNSZWN0PVcucHJvdG90eXBlLkljO1cucHJvdG90eXBlLmNvbnRhaW5lZEluUmVjdD1XLnByb3RvdHlwZS51aDtXLnByb3RvdHlwZS5nZXROZWFyZXN0SW50ZXJzZWN0aW9uUG9pbnQ9Vy5wcm90b3R5cGUuVGM7Vy5wcm90b3R5cGUuZ2V0RG9jdW1lbnRCb3VuZHM9Vy5wcm90b3R5cGUuVnA7Vy5wcm90b3R5cGUuZ2V0RG9jdW1lbnRQb2ludD1XLnByb3RvdHlwZS5tYTt2YXIgdG49bmV3IHRiKCksbm49bmV3IHRiKCk7Vy5jbGFzc05hbWU9IlNoYXBlIjtXLmdldEZpZ3VyZUdlbmVyYXRvcnM9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgTGIoKSxiO2ZvcihiIGluIEguSmUpe2IhPT1iLnRvTG93ZXJDYXNlKCkmJmEuYWRkKGIsSC5KZVtiXSk7fWEuZnJlZXplKCk7cmV0dXJuIGE7fTtXLmRlZmluZUZpZ3VyZUdlbmVyYXRvcj1mdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKSxkPUguSmU7ZFthXT1iO2RbY109YTt9O1cuZ2V0QXJyb3doZWFkR2VvbWV0cmllcz1mdW5jdGlvbigpe3ZhciBhPW5ldyBMYigpO2ZvcihkIGluIEguQm0pe2lmKHZvaWQgMD09PXRuW2RdKXt2YXIgYj1tZShILkJtW2RdLCExKTt0bltkXT1iO2I9ZC50b0xvd2VyQ2FzZSgpO2IhPT1kJiYodG5bYl09ZCk7fX1mb3IodmFyIGMgaW4gdG4pe2lmKGMhPT1jLnRvTG93ZXJDYXNlKCkpe3ZhciBkPXRuW2NdO2QgaW5zdGFuY2VvZiAkZCYmYS5hZGQoYyxkKTt9fWEuZnJlZXplKCk7cmV0dXJuIGE7fTtXLmRlZmluZUFycm93aGVhZEdlb21ldHJ5PWZ1bmN0aW9uKGEsYil7dmFyIGM9bnVsbDsic3RyaW5nIj09PXR5cGVvZiBiP2M9bWUoYiwhMSk6Yz1iO2I9YS50b0xvd2VyQ2FzZSgpOyJub25lIiE9PWImJmEhPT1ifHxBKCJTaGFwZS5kZWZpbmVBcnJvd2hlYWRHZW9tZXRyeSBuYW1lIG11c3Qgbm90IGJlIGVtcHR5IG9yIE5vbmUgb3IgYWxsLWxvd2VyLWNhc2U6ICIrYSk7dmFyIGQ9dG47ZFthXT1jO2RbYl09YTt9O2Z1bmN0aW9uIHZoKCl7WS5jYWxsKHRoaXMpO3ZufHwod24oKSx2bj0hMCk7dGhpcy5QYj0iIjt0aGlzLkdjPSJibGFjayI7dGhpcy5lZT0iMTNweCBzYW5zLXNlcmlmIjt0aGlzLnVpPSJzdGFydCI7dGhpcy55ZD1aZzt0aGlzLnppPUhkO3RoaXMubmo9ITA7dGhpcy5jaT10aGlzLmRpPSExO3RoaXMuWmY9eG47dGhpcy5qZz15bjt0aGlzLk1yPXRoaXMub2M9MDt0aGlzLmh1PXRoaXMuaXU9bnVsbDt0aGlzLm5kPW5ldyBLbSgpO3RoaXMuQW49ITE7dGhpcy5DYz10aGlzLlhtPXRoaXMueHA9dGhpcy52aT10aGlzLnlwPW51bGw7dGhpcy5hZj10aGlzLiRlPTA7dGhpcy5tZT1JbmZpbml0eTt0aGlzLmpsPTA7dGhpcy5DZD0xO3RoaXMuQmQ9MDt0aGlzLnpkPTE7dGhpcy5BZD10aGlzLmlqPW51bGw7fW9hKHZoLFkpO3ZoLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZD1mdW5jdGlvbihhKXtZLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZC5jYWxsKHRoaXMsYSk7YS5QYj10aGlzLlBiO2EuR2M9dGhpcy5HYzthLmVlPXRoaXMuZWU7YS51aT10aGlzLnVpO2EueWQ9dGhpcy55ZDthLnppPXRoaXMuemk7YS5uaj10aGlzLm5qO2EuZGk9dGhpcy5kaTthLmNpPXRoaXMuY2k7YS5aZj10aGlzLlpmO2Euamc9dGhpcy5qZzthLm9jPXRoaXMub2M7YS5Ncj10aGlzLk1yO2EuaXU9dGhpcy5pdTthLmh1PXRoaXMuaHU7YS5uZC5WbCh0aGlzLm5kKTthLkFuPXRoaXMuQW47YS55cD10aGlzLnlwO2Eudmk9dGhpcy52aTthLnhwPXRoaXMueHA7YS5YbT10aGlzLlhtO2EuQ2M9dGhpcy5DYzthLiRlPXRoaXMuJGU7YS5hZj10aGlzLmFmO2EubWU9dGhpcy5tZTthLmpsPXRoaXMuamw7YS5DZD10aGlzLkNkO2EuQmQ9dGhpcy5CZDthLnpkPXRoaXMuemQ7YS5paj10aGlzLmlqO2EuQWQ9dGhpcy5BZDt9O2Z1bmN0aW9uIEptKGEsYil7YS5IPWIuSHw2MTQ0O2EubGI9Yi5vcGFjaXR5O2EuaWI9Yi5iYWNrZ3JvdW5kO2EuZGM9Yi5hcmVhQmFja2dyb3VuZDthLk5jPWIuZGVzaXJlZFNpemUuSSgpO2EuUWY9Yi5taW5TaXplLkkoKTthLlBmPWIubWF4U2l6ZS5JKCk7YS5OZj1iLk5mLmNvcHkoKTthLkNhPWIuc2NhbGU7YS56Yz1iLmFuZ2xlO2EudWU9Yi5zdHJldGNoO2EuVGc9Yi5tYXJnaW4uSSgpO2Eud2I9Yi5hbGlnbm1lbnQuSSgpO2Eud2s9Yi5hbGlnbm1lbnRGb2N1cy5JKCk7YS55bD1iLnNlZ21lbnRGcmFjdGlvbjthLnpsPWIuc2VnbWVudE9mZnNldC5JKCk7YS5BbD1iLnNlZ21lbnRPcmllbnRhdGlvbjtudWxsIT09Yi5rZCYmKGEua2Q9Yi5rZC5jb3B5KCkpO2EuQ2w9Yi5zaGFkb3dWaXNpYmxlO2IgaW5zdGFuY2VvZiB2aCYmKGEuUGI9Yi5QYixhLkdjPWIuR2MsYS5lZT1iLmVlLGEudWk9Yi51aSxhLnlkPWIueWQsYS56aT1iLnppLGEubmo9Yi5uaixhLmRpPWIuZGksYS5jaT1iLmNpLGEuWmY9Yi5aZixhLmpnPWIuamcsYS5uZC5IZj1udWxsLGEuJGU9Yi4kZSxhLmFmPWIuYWYsYS5tZT1iLm1lLGEuamw9Yi5qbCxhLkNkPWIuQ2QsYS5CZD1iLkJkLGEuemQ9Yi56ZCxhLmlqPWIuaWosYS5BZD1iLkFkKTt9dD12aC5wcm90b3R5cGU7dC5mYj1mdW5jdGlvbihhKXthLmNsYXNzVHlwZT09PXZoP3RoaXMud3JhcD1hOlkucHJvdG90eXBlLmZiLmNhbGwodGhpcyxhKTt9O3QudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMjI8dGhpcy5QYi5sZW5ndGg/J1RleHRCbG9jaygiJyt0aGlzLlBiLnN1YnN0cmluZygwLDIwKSsnIi4uLiknOidUZXh0QmxvY2soIicrdGhpcy5QYisnIiknO307dC5zPWZ1bmN0aW9uKCl7WS5wcm90b3R5cGUucy5jYWxsKHRoaXMpO3RoaXMuaHU9dGhpcy5pdT1udWxsO307dC5DaT1mdW5jdGlvbihhLGIpe2lmKG51bGwhPT10aGlzLkdjJiYwIT09dGhpcy5QYi5sZW5ndGgmJm51bGwhPT10aGlzLmVlKXt2YXIgYz10aGlzLm5hdHVyYWxCb3VuZHMsZD10aGlzLmFjdHVhbEJvdW5kcyxlPWMud2lkdGgsZj1jLmhlaWdodCxnPXpuKHRoaXMpLGg9YS50ZXh0QWxpZ249dGhpcy51aSxrPWIuVG47InN0YXJ0Ij09PWg/aD1rPyJyaWdodCI6ImxlZnQiOiJlbmQiPT09aCYmKGg9az8ibGVmdCI6InJpZ2h0Iik7az10aGlzLmRpO3ZhciBsPXRoaXMuY2k7amkodGhpcyxhLHRoaXMuR2MsITAsITEsYyxkKTsoa3x8bCkmJmppKHRoaXMsYSx0aGlzLkdjLCExLCExLGMsZCk7ZD0wO2M9ITE7dmFyIG09Ry5hbGxvY0F0KDAsMCk7dGhpcy5yZC50YShtKTt2YXIgbj1HLmFsbG9jQXQoMCxnKTt0aGlzLnJkLnRhKG4pO3ZhciBwPW0uQmUobik7Ry5mcmVlKG0pO0cuZnJlZShuKTttPWIuc2NhbGU7OD5wKm0qbSYmKGM9ITApO2IuWWMhPT1hJiYoYz0hMSk7ITE9PT1iLkRlKCJ0ZXh0R3JlZWtpbmciKSYmKGM9ITEpO2I9dGhpcy4kZTtwPXRoaXMuYWY7c3dpdGNoKHRoaXMuZmxpcCl7Y2FzZSBRazphLnRyYW5zbGF0ZShlLDApO2Euc2NhbGUoLTEsMSk7YnJlYWs7Y2FzZSBQazphLnRyYW5zbGF0ZSgwLGYpO2Euc2NhbGUoMSwtMSk7YnJlYWs7Y2FzZSBSazphLnRyYW5zbGF0ZShlLGYpLGEuc2NhbGUoLTEsLTEpO31tPXRoaXMub2M7bj0oYitnK3ApKm07Zj5uJiYoZD10aGlzLnppLGQ9ZC55KmYtZC55Km4rZC5vZmZzZXRZKTtuPXRoaXMubmQ7Zm9yKHZhciBxPTA7cTxtO3ErKyl7dmFyIHI9bi5XY1txXTtyPmUmJihyPWUpO2QrPWI7dmFyIHU9bi5BY1txXSx4PWEsdj1kLHk9aCx6PTA7aWYoYykibGVmdCI9PT15P3o9MDoicmlnaHQiPT09eT96PWUtcjoiY2VudGVyIj09PXkmJih6PShlLXIpLzIpLHguZmlsbFJlY3QoMCt6LHYrLjI1KmcsciwxKTtlbHNleyJsZWZ0Ij09PXk/ej0wOiJyaWdodCI9PT15P3o9ZToiY2VudGVyIj09PXkmJih6PWUvMik7dmFyIEI9bnVsbCE9PUFuP0FuKHRoaXMsZyk6Ljc1Kmc7eC5maWxsVGV4dCh1LDAreix2K0IpO3U9Zy8yMHwwOzA9PT11JiYodT0xKTsicmlnaHQiPT09eT96LT1yOiJjZW50ZXIiPT09eSYmKHotPXIvMik7ayYmKHk9bnVsbCE9PUJuP0JuKHRoaXMsZyk6LjgqZyx4LmJlZ2luUGF0aCgpLHgubGluZVdpZHRoPXUseC5tb3ZlVG8oMCt6LHYreSkseC5saW5lVG8oMCt6K3Isdit5KSx4LnN0cm9rZSgpKTtsJiYoeC5iZWdpblBhdGgoKSx4LmxpbmVXaWR0aD11LHY9ditnLWcvMi4yfDAsMCE9PXUlMiYmKHYrPS41KSx4Lm1vdmVUbygwK3osdikseC5saW5lVG8oMCt6K3IsdikseC5zdHJva2UoKSk7fWQrPWcrcDt9c3dpdGNoKHRoaXMuZmxpcCl7Y2FzZSBRazphLnNjYWxlKC0xLDEpO2EudHJhbnNsYXRlKC1lLDApO2JyZWFrO2Nhc2UgUGs6YS5zY2FsZSgxLC0xKTthLnRyYW5zbGF0ZSgwLC1mKTticmVhaztjYXNlIFJrOmEuc2NhbGUoLTEsLTEpLGEudHJhbnNsYXRlKC1lLC1mKTt9fX07dC5obT1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLmpsPWE7dmFyIGU9dGhpcy5lZTtudWxsIT09Q24mJkRuIT09ZSYmKERuPUNuLmZvbnQ9ZSk7ZT10aGlzLm5kO2UucmVzZXQoKTt2YXIgZjtpZihpc05hTih0aGlzLmRlc2lyZWRTaXplLndpZHRoKSl7dmFyIGc9dGhpcy5QYi5yZXBsYWNlKC9cclxuL2csIlxuIikucmVwbGFjZSgvXHIvZywiXG4iKTtpZigwPT09Zy5sZW5ndGgpZz0wO2Vsc2UgaWYodGhpcy5pc011bHRpbGluZSl7Zm9yKHZhciBoPWY9MCxrPSExOyFrOyl7dmFyIGw9Zy5pbmRleE9mKCJcbiIsaCk7LTE9PT1sJiYobD1nLmxlbmd0aCxrPSEwKTtmPU1hdGgubWF4KGYsRW4oZy5zdWJzdHIoaCxsLWgpLnRyaW0oKSkpO2g9bCsxO31nPWY7fWVsc2UgZj1nLmluZGV4T2YoIlxuIiwwKSwwPD1mJiYoZz1nLnN1YnN0cigwLGYpKSxnPUVuKGcpO2c9TWF0aC5taW4oZyxhL3RoaXMuc2NhbGUpO2c9TWF0aC5tYXgoOCxnKTt9ZWxzZSBnPXRoaXMuZGVzaXJlZFNpemUud2lkdGg7bnVsbCE9PXRoaXMucGFuZWwmJihnPU1hdGgubWluKGcsdGhpcy5wYW5lbC5tYXhTaXplLndpZHRoKSk7Zj1Gbih0aGlzLGcsZSk7aXNOYU4odGhpcy5kZXNpcmVkU2l6ZS5oZWlnaHQpP2Y9TWF0aC5taW4oZixiL3RoaXMuc2NhbGUpOmY9dGhpcy5kZXNpcmVkU2l6ZS5oZWlnaHQ7aD1mO2lmKDAhPT1lLkVjJiYxIT09ZS5BYy5sZW5ndGgmJnRoaXMuWmY9PT1HbiYmKGI9dGhpcy5lZSxiPXRoaXMuWmY9PT1Hbj9IbihiKTowLGs9dGhpcy4kZSt0aGlzLmFmLGs9TWF0aC5tYXgoMCx6bih0aGlzKStrKSxoPU1hdGgubWluKHRoaXMubWF4TGluZXMtMSxNYXRoLm1heChNYXRoLmZsb29yKGgvaysuMDEpLTEsMCkpLCEoaCsxPj1lLkFjLmxlbmd0aCkpKXtrPWUuQWNbaF07Zm9yKGI9TWF0aC5tYXgoMSxhLWIpO0VuKGspPmImJjE8ay5sZW5ndGg7KXtrPWsuc3Vic3RyKDAsay5sZW5ndGgtMSk7fWsrPUluO2I9RW4oayk7ZS5BY1toXT1rO2UuQWM9ZS5BYy5zbGljZSgwLGgrMSk7ZS5XY1toXT1iO2UuV2M9ZS5XYy5zbGljZSgwLGgrMSk7ZS5pZz1lLkFjLmxlbmd0aDtlLkVjPU1hdGgubWF4KGUuRWMsYik7dGhpcy5vYz1lLmlnO31pZih0aGlzLndyYXA9PT1Kbnx8aXNOYU4odGhpcy5kZXNpcmVkU2l6ZS53aWR0aCkpZz1pc05hTihhKT9lLkVjOk1hdGgubWluKGEsZS5FYyksaXNOYU4odGhpcy5kZXNpcmVkU2l6ZS53aWR0aCkmJihnPU1hdGgubWF4KDgsZykpO2c9TWF0aC5tYXgoYyxnKTtmPU1hdGgubWF4KGQsZik7c2ModGhpcy5xYyxnLGYpO1prKHRoaXMsMCwwLGcsZik7fTt0LnRoPWZ1bmN0aW9uKGEsYixjLGQpe2RsKHRoaXMsYSxiLGMsZCk7fTtmdW5jdGlvbiBLbihhLGIsYyxkLGUpe2I9Yi50cmltKCk7dmFyIGY9MDt2YXIgZz1hLmVlO3ZhciBoPWEuJGUrYS5hZjtoPU1hdGgubWF4KDAsem4oYSkraCk7dmFyIGs9YS5aZj09PUduP0huKGcpOjA7aWYoYS5vYz49YS5tZSludWxsIT09ZSYmZS5oKDAsaCk7ZWxzZXt2YXIgbD1iO2lmKGEuamc9PT1Mbil7aWYoYy5pZz0xLGc9RW4oYiksMD09PWt8fGc8PWQpYy5FYz1NYXRoLm1heChjLkVjLGcpLGMuV2MucHVzaChjLkVjKSxjLkFjLnB1c2goYiksbnVsbCE9PWUmJmUuaChnLGgpO2Vsc2V7Zj1NbihhLGwpO2w9bC5zdWJzdHIoZi5sZW5ndGgpO2I9TW4oYSxsKTtmb3IoZz1FbihmK2IpOzA8Yi5sZW5ndGgmJmc8PWQ7KXtmKz1iLGw9bC5zdWJzdHIoYi5sZW5ndGgpLGI9TW4oYSxsKSxnPUVuKChmK2IpLnRyaW0oKSk7fWYrPWIudHJpbSgpO2ZvcihkPU1hdGgubWF4KDEsZC1rKTtFbihmKT5kJiYxPGYubGVuZ3RoOyl7Zj1mLnN1YnN0cigwLGYubGVuZ3RoLTEpO31mKz1JbjtiPUVuKGYpO2MuV2MucHVzaChiKTtjLkVjPWI7Yy5BYy5wdXNoKGYpO251bGwhPT1lJiZlLmgoYixoKTt9fWVsc2V7az0wOzA9PT1sLmxlbmd0aCYmKGs9MSxjLldjLnB1c2goMCksYy5BYy5wdXNoKGwpKTtmb3IoOzA8bC5sZW5ndGg7KXt2YXIgbT1NbihhLGwpO2ZvcihsPWwuc3Vic3RyKG0ubGVuZ3RoKTtFbihtKT5kOyl7dmFyIG49MTtnPUVuKG0uc3Vic3RyKDAsbikpO2ZvcihiPTA7Zzw9ZDspe24rKyxiPWcsZz1FbihtLnN1YnN0cigwLG4pKTt9MT09PW4/KGMuV2NbYS5vYytrXT1nLGY9TWF0aC5tYXgoZixnKSk6KGMuV2NbYS5vYytrXT1iLGY9TWF0aC5tYXgoZixiKSk7bi0tOzE+biYmKG49MSk7Yy5BY1thLm9jK2tdPW0uc3Vic3RyKDAsbik7aysrO209bS5zdWJzdHIobik7aWYoYS5vYytrPmEubWUpYnJlYWs7fWI9TW4oYSxsKTtmb3IoZz1FbihtK2IpOzA8Yi5sZW5ndGgmJmc8PWQ7KXttKz1iLGw9bC5zdWJzdHIoYi5sZW5ndGgpLGI9TW4oYSxsKSxnPUVuKChtK2IpLnRyaW0oKSk7fW09bS50cmltKCk7aWYoIiIhPT1tJiYoIlx4QUQiPT09bVttLmxlbmd0aC0xXSYmKG09bS5zdWJzdHJpbmcoMCxtLmxlbmd0aC0xKSsiXHUyMDEwIiksMD09PWIubGVuZ3RoPyhjLldjLnB1c2goZyksZj1NYXRoLm1heChmLGcpKTooYj1FbihtKSxjLldjLnB1c2goYiksZj1NYXRoLm1heChmLGIpKSxjLkFjLnB1c2gobSksaysrLGEub2Mraz5hLm1lKSlicmVhazt9Yy5pZz1NYXRoLm1pbihhLm1lLGspO2MuRWM9TWF0aC5tYXgoYy5FYyxmKTtudWxsIT09ZSYmZS5oKGMuRWMsaCpjLmlnKTt9fX1mdW5jdGlvbiBNbihhLGIpe2lmKGEuamc9PT1ObilyZXR1cm4gYi5zdWJzdHIoMCwxKTthPWIubGVuZ3RoO2Zvcih2YXIgYz0wLGQ9T247YzxhJiYhZC50ZXN0KGIuY2hhckF0KGMpKTspe2MrKzt9Zm9yKDtjPGEmJmQudGVzdChiLmNoYXJBdChjKSk7KXtjKys7fXJldHVybiBjPj1hP2I6Yi5zdWJzdHIoMCxjKTt9ZnVuY3Rpb24gRW4oYSl7cmV0dXJuIG51bGw9PT1Dbj84KmEubGVuZ3RoOkNuLm1lYXN1cmVUZXh0KGEpLndpZHRoO31mdW5jdGlvbiB6bihhKXtpZihudWxsIT09YS5uZC5IZilyZXR1cm4gYS5uZC5IZjt2YXIgYj1hLmVlO2lmKG51bGw9PT1Dbil7dmFyIGM9MTY7cmV0dXJuIGEubmQuSGY9Yzt9dm9pZCAwIT09UG5bYl0mJjVFMz5Rbj9jPVBuW2JdOihjPTEuMypDbi5tZWFzdXJlVGV4dCgiTSIpLndpZHRoLFBuW2JdPWMsUW4rKyk7cmV0dXJuIGEubmQuSGY9Yzt9ZnVuY3Rpb24gSG4oYSl7aWYobnVsbD09PUNuKXJldHVybiA2O2lmKHZvaWQgMCE9PVJuW2FdJiY1RTM+U24pdmFyIGI9Um5bYV07ZWxzZSBiPUNuLm1lYXN1cmVUZXh0KEluKS53aWR0aCxSblthXT1iLFNuKys7cmV0dXJuIGI7fWZ1bmN0aW9uIEZuKGEsYixjKXt2YXIgZD1hLlBiLnJlcGxhY2UoL1xyXG4vZywiXG4iKS5yZXBsYWNlKC9cci9nLCJcbiIpLGU9YS4kZSthLmFmO2U9TWF0aC5tYXgoMCx6bihhKStlKTtpZigwPT09ZC5sZW5ndGgpcmV0dXJuIGMuRWM9MCxhLm9jPTEsZTtpZighYS5pc011bHRpbGluZSl7dmFyIGY9ZC5pbmRleE9mKCJcbiIsMCk7MDw9ZiYmKGQ9ZC5zdWJzdHIoMCxmKSk7fWY9MDtmb3IodmFyIGc9YS5vYz0wLGgsaz0hMTshazspe2g9ZC5pbmRleE9mKCJcbiIsZyk7LTE9PT1oJiYoaD1kLmxlbmd0aCxrPSEwKTtpZihnPD1oKXtnPWQuc3Vic3RyKGcsaC1nKTtpZihhLmpnIT09TG4pe2MuaWc9MDt2YXIgbD1LLmFsbG9jKCk7S24oYSxnLGMsYixsKTtmKz1sLmhlaWdodDtLLmZyZWUobCk7YS5vYys9Yy5pZzt9ZWxzZSBLbihhLGcsYyxiLG51bGwpLGYrPWUsYS5vYysrO2Eub2M9PT1hLm1lJiYoaz0hMCk7fWc9aCsxO31yZXR1cm4gYS5Ncj1mO31mdW5jdGlvbiB3bigpe09uPS9bIFx1MjAwYlx1MDBhZF0vO1BuPW5ldyB0YigpO1JuPW5ldyB0YigpO0NuPXRoP25ldyB1ayhudWxsKS5jb250ZXh0Om51bGw7fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZoLnByb3RvdHlwZSx7Zm9udDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmVlO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmVlO2IhPT1hJiYodGhpcy5lZT1hLHRoaXMubmQuSGY9bnVsbCx0aGlzLnMoKSx0aGlzLmcoImZvbnQiLGIsYSkpO319LHRleHQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5QYjtudWxsIT09YSYmdm9pZCAwIT09YT9hPWEudG9TdHJpbmcoKTphPSIiO2IhPT1hJiYodGhpcy5QYj1hLHRoaXMucygpLHRoaXMuZygidGV4dCIsYixhKSk7fX0sdGV4dEFsaWduOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudWk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMudWk7Yj09PWF8fCJzdGFydCIhPT1hJiYiZW5kIiE9PWEmJiJsZWZ0IiE9PWEmJiJyaWdodCIhPT1hJiYiY2VudGVyIiE9PWF8fCh0aGlzLnVpPWEsdGhpcy5SKCksdGhpcy5nKCJ0ZXh0QWxpZ24iLGIsYSkpO319LGZsaXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy55ZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy55ZDtiIT09YSYmKHRoaXMueWQ9YSx0aGlzLlIoKSx0aGlzLmcoImZsaXAiLGIsYSkpO319LHZlcnRpY2FsQWxpZ25tZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuemk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuemk7Yi5BKGEpfHwodGhpcy56aT1hPWEuSSgpLHRsKHRoaXMpLHRoaXMuZygidmVydGljYWxBbGlnbm1lbnQiLGIsYSkpO319LG5hdHVyYWxCb3VuZHM6e2dldDpmdW5jdGlvbiBnZXQoKXtpZighdGhpcy5xYy5vKCkpe3ZhciBhPUsuYWxsb2MoKTtLbih0aGlzLHRoaXMuUGIsdGhpcy5uZCw5OTk5OTksYSk7dmFyIGI9YS53aWR0aDtLLmZyZWUoYSk7YT1Gbih0aGlzLGIsdGhpcy5uZCk7dmFyIGM9dGhpcy5kZXNpcmVkU2l6ZTtpc05hTihjLndpZHRoKXx8KGI9Yy53aWR0aCk7aXNOYU4oYy5oZWlnaHQpfHwoYT1jLmhlaWdodCk7c2ModGhpcy5xYyxiLGEpO31yZXR1cm4gdGhpcy5xYzt9fSxpc011bHRpbGluZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLm5qO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLm5qO2IhPT1hJiYodGhpcy5uaj1hLHRoaXMucygpLHRoaXMuZygiaXNNdWx0aWxpbmUiLGIsYSkpO319LGlzVW5kZXJsaW5lOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZGk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuZGk7YiE9PWEmJih0aGlzLmRpPWEsdGhpcy5SKCksdGhpcy5nKCJpc1VuZGVybGluZSIsYixhKSk7fX0saXNTdHJpa2V0aHJvdWdoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuY2k7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuY2k7YiE9PWEmJih0aGlzLmNpPWEsdGhpcy5SKCksdGhpcy5nKCJpc1N0cmlrZXRocm91Z2giLGIsYSkpO319LHdyYXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5qZzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5qZztiIT09YSYmKHRoaXMuamc9YSx0aGlzLnMoKSx0aGlzLmcoIndyYXAiLGIsYSkpO319LG92ZXJmbG93OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWmY7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuWmY7YiE9PWEmJih0aGlzLlpmPWEsdGhpcy5zKCksdGhpcy5nKCJvdmVyZmxvdyIsYixhKSk7fX0sc3Ryb2tlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuR2M7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuR2M7YiE9PWEmJihhIGluc3RhbmNlb2Yga2wmJmEuZnJlZXplKCksdGhpcy5HYz1hLHRoaXMuUigpLHRoaXMuZygic3Ryb2tlIixiLGEpKTt9fSxsaW5lQ291bnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5vYzt9fSxlZGl0YWJsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkFuO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkFuO2IhPT1hJiYodGhpcy5Bbj1hLHRoaXMuZygiZWRpdGFibGUiLGIsYSkpO319LHRleHRFZGl0b3I6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy55cDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy55cDtiIT09YSYmKHRoaXMueXA9YSx0aGlzLmcoInRleHRFZGl0b3IiLGIsYSkpO319LGVycm9yRnVuY3Rpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5DYztiIT09YSYmKHRoaXMuQ2M9YSx0aGlzLmcoImVycm9yRnVuY3Rpb24iLGIsYSkpO319LGludGVydmFsOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ2Q7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuQ2Q7YT1NYXRoLmZsb29yKGEpO2lmKGIhPT1hJiYwPD1hKXt0aGlzLkNkPWE7dGhpcy5zKCk7dmFyIGM9dGhpcy5wYW5lbDtudWxsIT09YyYmKGMuTWc9bnVsbCk7dGhpcy5nKCJpbnRlcnZhbCIsYixhKTt9fX0sZ3JhZHVhdGVkU3RhcnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5CZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5CZDtiIT09YSYmKDA+YT9hPTA6MTxhJiYoYT0xKSx0aGlzLkJkPWEsdGhpcy5zKCksdGhpcy5nKCJncmFkdWF0ZWRTdGFydCIsYixhKSk7fX0sZ3JhZHVhdGVkRW5kOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuemQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuemQ7YiE9PWEmJigwPmE/YT0wOjE8YSYmKGE9MSksdGhpcy56ZD1hLHRoaXMucygpLHRoaXMuZygiZ3JhZHVhdGVkRW5kIixiLGEpKTt9fSxncmFkdWF0ZWRGdW5jdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmlqO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmlqO2IhPT1hJiYodGhpcy5paj1hLHRoaXMucygpLHRoaXMuZygiZ3JhZHVhdGVkRnVuY3Rpb24iLGIsYSkpO319LGdyYWR1YXRlZFNraXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5BZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5BZDtiIT09YSYmKHRoaXMuQWQ9YSx0aGlzLnMoKSx0aGlzLmcoImdyYWR1YXRlZFNraXAiLGIsYSkpO319LHRleHRWYWxpZGF0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudmk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMudmk7YiE9PWEmJih0aGlzLnZpPWEsdGhpcy5nKCJ0ZXh0VmFsaWRhdGlvbiIsYixhKSk7fX0sdGV4dEVkaXRlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnhwO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnhwO2IhPT1hJiYodGhpcy54cD1hLHRoaXMuZygidGV4dEVkaXRlZCIsYixhKSk7fX0sc3BhY2luZ0Fib3ZlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuJGU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuJGU7YiE9PWEmJih0aGlzLiRlPWEsdGhpcy5nKCJzcGFjaW5nQWJvdmUiLGIsYSkpO319LHNwYWNpbmdCZWxvdzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmFmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmFmO2IhPT1hJiYodGhpcy5hZj1hLHRoaXMuZygic3BhY2luZ0JlbG93IixiLGEpKTt9fSxtYXhMaW5lczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLm1lO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLm1lO2IhPT1hJiYoYT1NYXRoLmZsb29yKGEpLDA+PWEmJnhhKGEsIj4gMCIsdmgsIm1heExpbmVzIiksdGhpcy5tZT1hLHRoaXMuZygibWF4TGluZXMiLGIsYSksdGhpcy5zKCkpO319LG1ldHJpY3M6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5uZDt9fSxjaG9pY2VzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWG07fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuWG07YiE9PWEmJih0aGlzLlhtPWEsdGhpcy5nKCJjaG9pY2VzIixiLGEpKTt9fX0pO3ZhciBBbj1udWxsLEJuPW51bGwsTG49bmV3IEQodmgsIk5vbmUiLDApLEpuPW5ldyBEKHZoLCJXcmFwRml0IiwxKSx5bj1uZXcgRCh2aCwiV3JhcERlc2lyZWRTaXplIiwyKSxObj1uZXcgRCh2aCwiV3JhcEJyZWFrQWxsIiwzKSx4bj1uZXcgRCh2aCwiT3ZlcmZsb3dDbGlwIiwwKSxHbj1uZXcgRCh2aCwiT3ZlcmZsb3dFbGxpcHNpcyIsMSksT249bnVsbCxQbj1udWxsLFFuPTAsUm49bnVsbCxTbj0wLEluPSIuLi4iLERuPSIiLENuPW51bGwsdm49ITE7dmguY2xhc3NOYW1lPSJUZXh0QmxvY2siO3ZoLmdldEVsbGlwc2lzPWZ1bmN0aW9uKCl7cmV0dXJuIEluO307dmguc2V0RWxsaXBzaXM9ZnVuY3Rpb24oYSl7SW49YTtSbj1uZXcgdGIoKTtTbj0wO307dmguZ2V0QmFzZWxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gQW47fTt2aC5zZXRCYXNlbGluZT1mdW5jdGlvbihhKXtBbj1hO2E9VmEoKTtmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe2FbY10uc2YoKTt9fTt2aC5nZXRVbmRlcmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gQm47fTt2aC5zZXRVbmRlcmxpbmU9ZnVuY3Rpb24oYSl7Qm49YTthPVZhKCk7Zm9yKHZhciBiPWEubGVuZ3RoLGM9MDtjPGI7YysrKXthW2NdLnNmKCk7fX07dmguaXNWYWxpZEZvbnQ9ZnVuY3Rpb24oYSl7dm58fCh3bigpLHZuPSEwKTtpZihudWxsPT09Q24pcmV0dXJuITA7dmFyIGI9Q24uZm9udDtpZihhPT09Ynx8IjEwcHggc2Fucy1zZXJpZiI9PT1hKXJldHVybiEwO0NuLmZvbnQ9IjEwcHggc2Fucy1zZXJpZiI7Q24uZm9udD1hO3ZhciBjPUNuLmZvbnQ7aWYoIjEwcHggc2Fucy1zZXJpZiIhPT1jKXJldHVybiBDbi5mb250PWIsITA7Q24uZm9udD0iMTlweCBzZXJpZiI7dmFyIGQ9Q24uZm9udDtDbi5mb250PWE7Yz1Dbi5mb250O0NuLmZvbnQ9YjtyZXR1cm4gYyE9PWQ7fTt2aC5Ob25lPUxuO3ZoLldyYXBGaXQ9Sm47dmguV3JhcERlc2lyZWRTaXplPXluO3ZoLldyYXBCcmVha0FsbD1Objt2aC5PdmVyZmxvd0NsaXA9eG47dmguT3ZlcmZsb3dFbGxpcHNpcz1HbjtmdW5jdGlvbiBLbSgpe3RoaXMuRWM9dGhpcy5pZz0wO3RoaXMuV2M9W107dGhpcy5BYz1bXTt0aGlzLkhmPW51bGw7fUttLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuRWM9dGhpcy5pZz0wO3RoaXMuSGY9bnVsbDt0aGlzLldjPVtdO3RoaXMuQWM9W107fTtLbS5wcm90b3R5cGUuVmw9ZnVuY3Rpb24oYSl7dGhpcy5pZz1hLmlnO3RoaXMuSGY9YS5IZjt0aGlzLkVjPWEuRWM7dGhpcy5XYz1HYShhLldjKTt0aGlzLkFjPUdhKGEuQWMpO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoS20ucHJvdG90eXBlLHthcnJTaXplOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuV2M7fX0sYXJyVGV4dDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkFjO319LG1heExpbmVXaWR0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkVjO319LGZvbnRIZWlnaHQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5IZjt9fX0pO0ttLmNsYXNzTmFtZT0iVGV4dEJsb2NrTWV0cmljcyI7ZnVuY3Rpb24gY2soKXtZLmNhbGwodGhpcyk7dGhpcy5JZz1udWxsO3RoaXMucXA9IiI7dGhpcy5maD1IYzt0aGlzLmFsPWJlO3RoaXMuZGY9dGhpcy5DYz1udWxsO3RoaXMuJGs9ZGQ7dGhpcy55ZD1aZzt0aGlzLkxsPW51bGw7dGhpcy5idT0hMTt0aGlzLmlyPSEwO3RoaXMubmw9ITE7dGhpcy5EbD1udWxsO31vYShjayxZKTtjay5wcm90b3R5cGUuY2xvbmVQcm90ZWN0ZWQ9ZnVuY3Rpb24oYSl7WS5wcm90b3R5cGUuY2xvbmVQcm90ZWN0ZWQuY2FsbCh0aGlzLGEpO2EuZWxlbWVudD10aGlzLklnO2EucXA9dGhpcy5xcDthLmZoPXRoaXMuZmguSSgpO2EuYWw9dGhpcy5hbDthLnlkPXRoaXMueWQ7YS5DYz10aGlzLkNjO2EuZGY9dGhpcy5kZjthLiRrPXRoaXMuJGsuSSgpO2EuaXI9dGhpcy5pcjthLkRsPXRoaXMuRGw7fTt0PWNrLnByb3RvdHlwZTt0LmZiPWZ1bmN0aW9uKGEpe2E9PT1aZ3x8YT09PWFofHxhPT09T2s/dGhpcy5pbWFnZVN0cmV0Y2g9YTpZLnByb3RvdHlwZS5mYi5jYWxsKHRoaXMsYSk7fTt0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlBpY3R1cmUoIit0aGlzLnNvdXJjZSsiKSMiK0JiKHRoaXMpO307ZnVuY3Rpb24gZWsoYSl7dm9pZCAwPT09YSYmKGE9IiIpOyIiIT09YT9UblthXSYmKGRlbGV0ZSBUblthXSxVbi0tKTooVG49bmV3IHRiKCksVW49MCk7fWZ1bmN0aW9uIFZuKGEsYil7YS56cj0hMDthLlprPSExO2Zvcih2YXIgYyxkPVZhKCksZT1kLmxlbmd0aCxmPTA7ZjxlO2YrKyl7dmFyIGc9ZFtmXSxoPWcuQ2ouSihhLnNyYyk7aWYobnVsbCE9PWgpZm9yKHZhciBrPWgubGVuZ3RoLGw9MDtsPGs7bCsrKXtjPWhbbF0sZy5tdS5hZGQoYyksZy5jYygpLG51bGw9PT1hLnN1JiYoYS5zdT1iLG51bGwhPT1jLmRmJiZjLmRmKGMsYikpO319fWZ1bmN0aW9uIFduKGEsYil7YS5aaz1iO2Zvcih2YXIgYyxkPVZhKCksZT1kLmxlbmd0aCxmPTA7ZjxlO2YrKyl7aWYoYz1kW2ZdLkNqLkooYS5zcmMpLG51bGwhPT1jKXtmb3IodmFyIGc9Yy5sZW5ndGgsaD1LYSgpLGs9MDtrPGc7aysrKXtoLnB1c2goY1trXSk7fWZvcihrPTA7azxnO2srKyl7Yz1oW2tdLG51bGwhPT1jLkNjJiZjLkNjKGMsYik7fU9hKGgpO319fXQuS3o9ZnVuY3Rpb24oKXtpZigiIiE9PXRoaXMuc291cmNlKXtlayh0aGlzLnNvdXJjZSk7dmFyIGE9dGhpcy5zb3VyY2U7dGhpcy5zb3VyY2U9IiI7dGhpcy5zb3VyY2U9YTt9fTt0LnNmPWZ1bmN0aW9uKCl7dGhpcy5SKCk7fTt0LkNpPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5JZztpZihudWxsIT09Yyl7dmFyIGQ9Yy5zcmM7bnVsbCE9PWQmJiIiIT09ZHx8QSgnRWxlbWVudCBoYXMgbm8gc291cmNlICgic3JjIikgYXR0cmlidXRlOiAnK2MpO2lmKCEoYy5aayBpbnN0YW5jZW9mIEV2ZW50KSl7ZD10aGlzLm5hdHVyYWxCb3VuZHM7dmFyIGU9MCxmPTAsZz10aGlzLmJ1LGg9Zz8rYy53aWR0aDpjLm5hdHVyYWxXaWR0aDtnPWc/K2MuaGVpZ2h0OmMubmF0dXJhbEhlaWdodDt2b2lkIDA9PT1oJiZjLnZpZGVvV2lkdGgmJihoPWMudmlkZW9XaWR0aCk7dm9pZCAwPT09ZyYmYy52aWRlb0hlaWdodCYmKGc9Yy52aWRlb0hlaWdodCk7aD1ofHxkLndpZHRoO2c9Z3x8ZC5oZWlnaHQ7aWYoMCE9PWgmJjAhPT1nKXt2YXIgaz1oLGw9Zzt0aGlzLnNvdXJjZVJlY3QubygpJiYoZT10aGlzLmZoLngsZj10aGlzLmZoLnksaD10aGlzLmZoLndpZHRoLGc9dGhpcy5maC5oZWlnaHQpO3ZhciBtPWgsbj1nLHA9dGhpcy5hbCxxPXRoaXMuJGs7c3dpdGNoKHApe2Nhc2UgWmc6aWYodGhpcy5zb3VyY2VSZWN0Lm8oKSlicmVhazttPj1kLndpZHRoJiYoZT1lK3Eub2Zmc2V0WCsobSpxLngtZC53aWR0aCpxLngpKTtuPj1kLmhlaWdodCYmKGY9ZitxLm9mZnNldFkrKG4qcS55LWQuaGVpZ2h0KnEueSkpO2g9TWF0aC5taW4oZC53aWR0aCxtKTtnPU1hdGgubWluKGQuaGVpZ2h0LG4pO2JyZWFrO2Nhc2UgYmU6bT1kLndpZHRoO249ZC5oZWlnaHQ7YnJlYWs7Y2FzZSBhaDpjYXNlIE9rOnA9PT1haD8ocD1NYXRoLm1pbihkLmhlaWdodC9uLGQud2lkdGgvbSksbSo9cCxuKj1wKTpwPT09T2smJihwPU1hdGgubWF4KGQuaGVpZ2h0L24sZC53aWR0aC9tKSxtKj1wLG4qPXAsbT49ZC53aWR0aCYmKGU9KGUrcS5vZmZzZXRYKyhtKnEueC1kLndpZHRoKnEueCkvbSkqaCksbj49ZC5oZWlnaHQmJihmPShmK3Eub2Zmc2V0WSsobipxLnktZC5oZWlnaHQqcS55KS9uKSpnKSxoKj0xLyhtL2Qud2lkdGgpLGcqPTEvKG4vZC5oZWlnaHQpLG09ZC53aWR0aCxuPWQuaGVpZ2h0KTt9cD10aGlzLkNlKCkqYi5zY2FsZTt2YXIgcj1oKmcvKG0qcCpuKnApLHU9Yy5fX2dvQ2FjaGU7cD1udWxsO3ZhciB4PVhuO2lmKGMuenImJnZvaWQgMCE9PXUmJnI+eCp4KWZvcihudWxsPT09dS5CaSYmKFluKHUsNCxrLGwsYyksWW4odSwxNixrLGwsYykpLGs9dS5CaSxsPWsubGVuZ3RoLHA9a1swXSx4PTA7eDxsO3grKyl7aWYoa1t4XS5yYXRpbyprW3hdLnJhdGlvPHIpcD1rW3hdO2Vsc2UgYnJlYWs7fWlmKCFiLnhuKXtpZihudWxsPT09dGhpcy5MbClpZihudWxsPT09dGhpcy5JZyl0aGlzLkxsPSExO2Vsc2V7az1uZXcgdWsobnVsbCkuY29udGV4dDtrLmRyYXdJbWFnZSh0aGlzLklnLDAsMCk7dHJ5e2suZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGFbM10mJih0aGlzLkxsPSExKSx0aGlzLkxsPSExO31jYXRjaCh2KXt0aGlzLkxsPSEwO319aWYodGhpcy5MbClyZXR1cm47fWs9MDttPGQud2lkdGgmJihrPXEub2Zmc2V0WCsoZC53aWR0aCpxLngtbSpxLngpKTtsPTA7bjxkLmhlaWdodCYmKGw9cS5vZmZzZXRZKyhkLmhlaWdodCpxLnktbipxLnkpKTtzd2l0Y2godGhpcy5mbGlwKXtjYXNlIFFrOmEudHJhbnNsYXRlKE1hdGgubWluKGQud2lkdGgsbSksMCk7YS5zY2FsZSgtMSwxKTticmVhaztjYXNlIFBrOmEudHJhbnNsYXRlKDAsTWF0aC5taW4oZC5oZWlnaHQsbikpO2Euc2NhbGUoMSwtMSk7YnJlYWs7Y2FzZSBSazphLnRyYW5zbGF0ZShNYXRoLm1pbihkLndpZHRoLG0pLE1hdGgubWluKGQuaGVpZ2h0LG4pKSxhLnNjYWxlKC0xLC0xKTt9aWYoYi5EZSgicGljdHVyZVJhdGlvT3B0aW1pemF0aW9uIikmJiFiLm1qJiZ2b2lkIDAhPT11JiZudWxsIT09cCYmMSE9PXAucmF0aW8pe2Euc2F2ZSgpO2I9cC5yYXRpbzt0cnl7YS5kcmF3SW1hZ2UocC5zb3VyY2UsZS9iLGYvYixNYXRoLm1pbihwLnNvdXJjZS53aWR0aCxoL2IpLE1hdGgubWluKHAuc291cmNlLmhlaWdodCxnL2IpLGssbCxNYXRoLm1pbihkLndpZHRoLG0pLE1hdGgubWluKGQuaGVpZ2h0LG4pKTt9Y2F0Y2godil7dGhpcy5pcj0hMTt9YS5yZXN0b3JlKCk7fWVsc2UgdHJ5e2EuZHJhd0ltYWdlKGMsZSxmLGgsZyxrLGwsTWF0aC5taW4oZC53aWR0aCxtKSxNYXRoLm1pbihkLmhlaWdodCxuKSk7fWNhdGNoKHYpe3RoaXMuaXI9ITE7fXN3aXRjaCh0aGlzLmZsaXApe2Nhc2UgUWs6YS5zY2FsZSgtMSwxKTthLnRyYW5zbGF0ZSgtTWF0aC5taW4oZC53aWR0aCxtKSwwKTticmVhaztjYXNlIFBrOmEuc2NhbGUoMSwtMSk7YS50cmFuc2xhdGUoMCwtTWF0aC5taW4oZC5oZWlnaHQsbikpO2JyZWFrO2Nhc2UgUms6YS5zY2FsZSgtMSwtMSksYS50cmFuc2xhdGUoLU1hdGgubWluKGQud2lkdGgsbSksLU1hdGgubWluKGQuaGVpZ2h0LG4pKTt9fX19fTt0LmhtPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuZGVzaXJlZFNpemUsZj1ibCh0aGlzLCEwKSxnPXRoaXMuSWcsaD10aGlzLmJ1O2lmKGh8fCF0aGlzLm5sJiZnJiZnLmNvbXBsZXRlKXRoaXMubmw9ITA7bnVsbD09PWcmJihpc0Zpbml0ZShlLndpZHRoKXx8KGE9MCksaXNGaW5pdGUoZS5oZWlnaHQpfHwoYj0wKSk7aXNGaW5pdGUoZS53aWR0aCl8fGY9PT1iZXx8Zj09PU1rPyhpc0Zpbml0ZShhKXx8KGE9dGhpcy5zb3VyY2VSZWN0Lm8oKT90aGlzLnNvdXJjZVJlY3Qud2lkdGg6aD8rZy53aWR0aDpnLm5hdHVyYWxXaWR0aCksYz0wKTpudWxsIT09ZyYmITEhPT10aGlzLm5sJiYoYT10aGlzLnNvdXJjZVJlY3QubygpP3RoaXMuc291cmNlUmVjdC53aWR0aDpoPytnLndpZHRoOmcubmF0dXJhbFdpZHRoKTtpc0Zpbml0ZShlLmhlaWdodCl8fGY9PT1iZXx8Zj09PU5rPyhpc0Zpbml0ZShiKXx8KGI9dGhpcy5zb3VyY2VSZWN0Lm8oKT90aGlzLnNvdXJjZVJlY3QuaGVpZ2h0Omg/K2cuaGVpZ2h0OmcubmF0dXJhbEhlaWdodCksZD0wKTpudWxsIT09ZyYmITEhPT10aGlzLm5sJiYoYj10aGlzLnNvdXJjZVJlY3QubygpP3RoaXMuc291cmNlUmVjdC5oZWlnaHQ6aD8rZy5oZWlnaHQ6Zy5uYXR1cmFsSGVpZ2h0KTtpc0Zpbml0ZShlLndpZHRoKSYmKGE9ZS53aWR0aCk7aXNGaW5pdGUoZS5oZWlnaHQpJiYoYj1lLmhlaWdodCk7ZT10aGlzLm1heFNpemU7Zj10aGlzLm1pblNpemU7Yz1NYXRoLm1heChjLGYud2lkdGgpO2Q9TWF0aC5tYXgoZCxmLmhlaWdodCk7YT1NYXRoLm1pbihlLndpZHRoLGEpO2I9TWF0aC5taW4oZS5oZWlnaHQsYik7YT1NYXRoLm1heChjLGEpO2I9TWF0aC5tYXgoZCxiKTtudWxsPT09Z3x8Zy5jb21wbGV0ZXx8KGlzRmluaXRlKGEpfHwoYT0wKSxpc0Zpbml0ZShiKXx8KGI9MCkpO3NjKHRoaXMucWMsYSxiKTtaayh0aGlzLDAsMCxhLGIpO307dC50aD1mdW5jdGlvbihhLGIsYyxkKXtkbCh0aGlzLGEsYixjLGQpO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2sucHJvdG90eXBlLHtlbGVtZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSWc7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuSWc7aWYoYiE9PWEpe251bGw9PT1hfHxhIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8YSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnR8fGEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8QSgiUGljdHVyZS5lbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSW1hZ2UsIENhbnZhcywgb3IgVmlkZW8sIG5vdDogIithKTt0aGlzLmJ1PWEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudDt0aGlzLklnPWE7aWYobnVsbCE9PWEpaWYoYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwhMD09PWEuY29tcGxldGUpYS5aayBpbnN0YW5jZW9mIEV2ZW50JiZudWxsIT09dGhpcy5DYyYmdGhpcy5DYyh0aGlzLGEuWmspLCEwPT09YS56ciYmbnVsbCE9PXRoaXMuZGYmJnRoaXMuZGYodGhpcyxhLnN1KSxhLnpyPSEwLHRoaXMuZGVzaXJlZFNpemUubygpfHwoamoodGhpcywhMSksdGhpcy5zKCkpO2Vsc2V7dmFyIGM9dGhpczthLnl3fHwoYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbihiKXtWbihhLGIpO2MuZGVzaXJlZFNpemUubygpfHwoamooYywhMSksYy5zKCkpO30pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGIpe1duKGEsYik7fSksYS55dz0hMCk7fXRoaXMuZygiZWxlbWVudCIsYixhKTt0aGlzLlIoKTt9fX0sc291cmNlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucXA7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMucXA7aWYoYiE9PWEpe3RoaXMucXA9YTt2YXIgYz1UbixkPXRoaXMuZGlhZ3JhbSxlPW51bGw7aWYodm9pZCAwIT09Y1thXSllPWNbYV07ZWxzZXszMDxVbiYmKGVrKCksYz1Ubik7ZT12YSgiaW1nIik7dmFyIGY9dGhpcztlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKGEpe1ZuKGUsYSk7Zi5kZXNpcmVkU2l6ZS5vKCl8fChqaihmLCExKSxmLnMoKSk7fSk7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYSl7V24oZSxhKTt9KTtlLnl3PSEwO3ZhciBnPXRoaXMuRGw7bnVsbCE9PWcmJihlLmNyb3NzT3JpZ2luPWcodGhpcykpO2Uuc3JjPWE7Y1tlLnNyY109ZTtVbisrO31udWxsIT09ZCYmZGsoZCx0aGlzKTt0aGlzLmVsZW1lbnQ9ZTtudWxsIT09ZCYmYmsoZCx0aGlzKTt2b2lkIDA9PT1lLl9fZ29DYWNoZSYmKGUuX19nb0NhY2hlPW5ldyBabigpKTt0aGlzLnMoKTt0aGlzLlIoKTt0aGlzLmcoInNvdXJjZSIsYixhKTt9fX0sc291cmNlQ3Jvc3NPcmlnaW46e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5EbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYodGhpcy5EbCE9PWEmJih0aGlzLkRsPWEsbnVsbCE9PXRoaXMuZWxlbWVudCkpe3ZhciBiPXRoaXMuZWxlbWVudC5zcmM7bnVsbD09PWEmJiJzdHJpbmciPT09dHlwZW9mIGI/dGhpcy5lbGVtZW50LmNyb3NzT3JpZ2luPW51bGw6bnVsbCE9PWEmJih0aGlzLmVsZW1lbnQuY3Jvc3NPcmlnaW49YSh0aGlzKSk7dGhpcy5lbGVtZW50LnNyYz1iO319fSxzb3VyY2VSZWN0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZmg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuZmg7Yi5BKGEpfHwodGhpcy5maD1hPWEuSSgpLHRoaXMuUigpLHRoaXMuZygic291cmNlUmVjdCIsYixhKSk7fX0saW1hZ2VTdHJldGNoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYWw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuYWw7YiE9PWEmJih0aGlzLmFsPWEsdGhpcy5SKCksdGhpcy5nKCJpbWFnZVN0cmV0Y2giLGIsYSkpO319LGZsaXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy55ZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy55ZDtiIT09YSYmKHRoaXMueWQ9YSx0aGlzLlIoKSx0aGlzLmcoImZsaXAiLGIsYSkpO319LGltYWdlQWxpZ25tZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuJGs7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuJGs7Yi5BKGEpfHwodGhpcy4kaz1hPWEuSSgpLHRoaXMucygpLHRoaXMuZygiaW1hZ2VBbGlnbm1lbnQiLGIsYSkpO319LGVycm9yRnVuY3Rpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5DYztiIT09YSYmKHRoaXMuQ2M9YSx0aGlzLmcoImVycm9yRnVuY3Rpb24iLGIsYSkpO319LHN1Y2Nlc3NGdW5jdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmRmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmRmO2IhPT1hJiYodGhpcy5kZj1hLHRoaXMuZygic3VjY2Vzc0Z1bmN0aW9uIixiLGEpKTt9fSxuYXR1cmFsQm91bmRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucWM7fX19KTtjay5wcm90b3R5cGUucmVkcmF3PWNrLnByb3RvdHlwZS5zZjtjay5wcm90b3R5cGUucmVsb2FkU291cmNlPWNrLnByb3RvdHlwZS5Lejt2YXIgVG49bnVsbCxVbj0wLFhuPTQ7Y2suY2xhc3NOYW1lPSJQaWN0dXJlIjtUbj1uZXcgdGIoKTtjay5jbGVhckNhY2hlPWVrO2Z1bmN0aW9uIFpuKCl7dGhpcy5CaT1udWxsO31mdW5jdGlvbiBZbihhLGIsYyxkLGUpe251bGw9PT1hLkJpJiYoYS5CaT1bXSk7dmFyIGY9bmV3IHVrKG51bGwpLGc9Zi5jb250ZXh0LGg9MS9iO2Yud2lkdGg9Yy9iO2YuaGVpZ2h0PWQvYjtiPW5ldyAkbihmLkdhLGIpO2M9MTswPGEuQmkubGVuZ3RoJiYoYz1hLkJpW2EuQmkubGVuZ3RoLTFdLGU9Yy5zb3VyY2UsYz1jLnJhdGlvKTtnLnNldFRyYW5zZm9ybShoKmMsMCwwLGgqYywwLDApO2cuZHJhd0ltYWdlKGUsMCwwKTthLkJpLnB1c2goYik7fVpuLmNsYXNzTmFtZT0iUGljdHVyZUNhY2hlQXJyYXkiO2Z1bmN0aW9uICRuKGEsYil7dGhpcy5zb3VyY2U9YTt0aGlzLnJhdGlvPWI7fSRuLmNsYXNzTmFtZT0iUGljdHVyZUNhY2hlSW5zdGFuY2UiO2Z1bmN0aW9uIGFvKCl7dGhpcy5Vcz1uZXcgJGQoKTt0aGlzLmVjPW51bGw7fXQ9YW8ucHJvdG90eXBlO3QucmVzZXQ9ZnVuY3Rpb24oYSl7bnVsbCE9PWE/KGEuaGEoKSx0aGlzLlVzPWEsYS5maWd1cmVzLmNsZWFyKCkpOnRoaXMuVXM9bmV3ICRkKCk7dGhpcy5lYz1udWxsO307ZnVuY3Rpb24gb2UoYSxiLGMsZCxlKXthLmVjPW5ldyBVZSgpO2EuZWMuc3RhcnRYPWI7YS5lYy5zdGFydFk9YzthLmVjLmlzRmlsbGVkPWQ7YS5Vcy5maWd1cmVzLmFkZChhLmVjKTt2b2lkIDAhPT1lJiYoYS5lYy5pc1NoYWRvd2VkPWUpO31mdW5jdGlvbiB2ZShhKXt2YXIgYj1hLmVjLnNlZ21lbnRzLmxlbmd0aDswPGImJmEuZWMuc2VnbWVudHMuTihiLTEpLmNsb3NlKCk7fXQucXE9ZnVuY3Rpb24oYSl7dGhpcy5lYy5pc1NoYWRvd2VkPWE7fTt0Lm1vdmVUbz1mdW5jdGlvbihhLGIsYyl7dm9pZCAwPT09YyYmKGM9ITEpO3ZhciBkPW5ldyBWZSh6ZSk7ZC5lbmRYPWE7ZC5lbmRZPWI7YyYmZC5jbG9zZSgpO3RoaXMuZWMuc2VnbWVudHMuYWRkKGQpO307dC5saW5lVG89ZnVuY3Rpb24oYSxiLGMpe3ZvaWQgMD09PWMmJihjPSExKTt2YXIgZD1uZXcgVmUoaWUpO2QuZW5kWD1hO2QuZW5kWT1iO2MmJmQuY2xvc2UoKTt0aGlzLmVjLnNlZ21lbnRzLmFkZChkKTt9O2Z1bmN0aW9uIHBlKGEsYixjLGQsZSxmLGcpe3ZhciBoO3ZvaWQgMD09PWgmJihoPSExKTt2YXIgaz1uZXcgVmUoQWUpO2sucG9pbnQxWD1iO2sucG9pbnQxWT1jO2sucG9pbnQyWD1kO2sucG9pbnQyWT1lO2suZW5kWD1mO2suZW5kWT1nO2gmJmsuY2xvc2UoKTthLmVjLnNlZ21lbnRzLmFkZChrKTt9ZnVuY3Rpb24gdGUoYSxiLGMsZCxlKXt2YXIgZjt2b2lkIDA9PT1mJiYoZj0hMSk7dmFyIGc9bmV3IFZlKEJlKTtnLnBvaW50MVg9YjtnLnBvaW50MVk9YztnLmVuZFg9ZDtnLmVuZFk9ZTtmJiZnLmNsb3NlKCk7YS5lYy5zZWdtZW50cy5hZGQoZyk7fXQuYXJjVG89ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dm9pZCAwPT09ZiYmKGY9MCk7dm9pZCAwPT09ZyYmKGc9ITEpO3ZhciBoPW5ldyBWZShDZSk7aC5zdGFydEFuZ2xlPWE7aC5zd2VlcEFuZ2xlPWI7aC5jZW50ZXJYPWM7aC5jZW50ZXJZPWQ7aC5yYWRpdXNYPWU7aC5yYWRpdXNZPTAhPT1mP2Y6ZTtnJiZoLmNsb3NlKCk7dGhpcy5lYy5zZWdtZW50cy5hZGQoaCk7fTtmdW5jdGlvbiB1ZShhLGIsYyxkLGUsZixnLGgpe3ZhciBrO3ZvaWQgMD09PWsmJihrPSExKTtiPW5ldyBWZShEZSxnLGgsYixjLGQsZSxmKTtrJiZiLmNsb3NlKCk7YS5lYy5zZWdtZW50cy5hZGQoYik7fWZ1bmN0aW9uIG5lKGEpe3ZhciBiPXdlO2lmKG51bGwhPT1iKXJldHVybiB3ZT1udWxsLGIucmVzZXQoYSksYjtiPW5ldyBhbygpO2IucmVzZXQoYSk7cmV0dXJuIGI7fXZhciB3ZT1udWxsO2FvLmNsYXNzTmFtZT0iU3RyZWFtR2VvbWV0cnlDb250ZXh0IjtmdW5jdGlvbiBibyhhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKSxkPUguSmU7ZFthXT1iO2RbY109YTt9Ym8oIlJlY3RhbmdsZSIsZnVuY3Rpb24oYSxiLGMpe2E9bmV3ICRkKGtlKTthLnN0YXJ0WD0wO2Euc3RhcnRZPTA7YS5lbmRYPWI7YS5lbmRZPWM7cmV0dXJuIGE7fSk7Ym8oIlNxdWFyZSIsZnVuY3Rpb24oYSxiLGMpe2E9bmV3ICRkKGtlKTthLnN0YXJ0WD0wO2Euc3RhcnRZPTA7YS5lbmRYPWI7YS5lbmRZPWM7YS5kZWZhdWx0U3RyZXRjaD1haDtyZXR1cm4gYTt9KTtibygiUm91bmRlZFJlY3RhbmdsZSIsZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWE/YS5wYXJhbWV0ZXIxOk5hTjtpZihpc05hTihkKXx8MD49ZClkPTU7ZD1NYXRoLm1pbihkLGIvMyk7ZD1NYXRoLm1pbihkLGMvMyk7YT1kKkgueGc7Yj1uZXcgJGQoKS5hZGQobmV3IFVlKGQsMCwhMCkuYWRkKG5ldyBWZShpZSxiLWQsMCkpLmFkZChuZXcgVmUoQWUsYixkLGItYSwwLGIsYSkpLmFkZChuZXcgVmUoaWUsYixjLWQpKS5hZGQobmV3IFZlKEFlLGItZCxjLGIsYy1hLGItYSxjKSkuYWRkKG5ldyBWZShpZSxkLGMpKS5hZGQobmV3IFZlKEFlLDAsYy1kLGEsYywwLGMtYSkpLmFkZChuZXcgVmUoaWUsMCxkKSkuYWRkKG5ldyBWZShBZSxkLDAsMCxhLGEsMCkuY2xvc2UoKSkpOzE8YSYmKGIuc3BvdDE9bmV3IE8oMCwwLGEsYSksYi5zcG90Mj1uZXcgTygxLDEsLWEsLWEpKTtyZXR1cm4gYjt9KTtibygiQm9yZGVyIiwiUm91bmRlZFJlY3RhbmdsZSIpO2JvKCJFbGxpcHNlIixmdW5jdGlvbihhLGIsYyl7YT1uZXcgJGQobGUpO2Euc3RhcnRYPTA7YS5zdGFydFk9MDthLmVuZFg9YjthLmVuZFk9YzthLnNwb3QxPVVkO2Euc3BvdDI9VmQ7cmV0dXJuIGE7fSk7Ym8oIkNpcmNsZSIsZnVuY3Rpb24oYSxiLGMpe2E9bmV3ICRkKGxlKTthLnN0YXJ0WD0wO2Euc3RhcnRZPTA7YS5lbmRYPWI7YS5lbmRZPWM7YS5zcG90MT1VZDthLnNwb3QyPVZkO2EuZGVmYXVsdFN0cmV0Y2g9YWg7cmV0dXJuIGE7fSk7Ym8oIlRyaWFuZ2xlUmlnaHQiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3ICRkKCkuYWRkKG5ldyBVZSgwLDApLmFkZChuZXcgVmUoaWUsYiwuNSpjKSkuYWRkKG5ldyBWZShpZSwwLGMpLmNsb3NlKCkpKS54bSgwLC4yNSwuNSwuNzUpO30pO2JvKCJUcmlhbmdsZURvd24iLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3ICRkKCkuYWRkKG5ldyBVZSgwLDApLmFkZChuZXcgVmUoaWUsYiwwKSkuYWRkKG5ldyBWZShpZSwuNSpiLGMpLmNsb3NlKCkpKS54bSguMjUsMCwuNzUsLjUpO30pO2JvKCJUcmlhbmdsZUxlZnQiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3ICRkKCkuYWRkKG5ldyBVZShiLGMpLmFkZChuZXcgVmUoaWUsMCwuNSpjKSkuYWRkKG5ldyBWZShpZSxiLDApLmNsb3NlKCkpKS54bSguNSwuMjUsMSwuNzUpO30pO2JvKCJUcmlhbmdsZVVwIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyAkZCgpLmFkZChuZXcgVWUoYixjKS5hZGQobmV3IFZlKGllLDAsYykpLmFkZChuZXcgVmUoaWUsLjUqYiwwKS5jbG9zZSgpKSkueG0oLjI1LC41LC43NSwxKTt9KTtibygiVHJpYW5nbGUiLCJUcmlhbmdsZVVwIik7Ym8oIkRpYW1vbmQiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3ICRkKCkuYWRkKG5ldyBVZSguNSpiLDApLmFkZChuZXcgVmUoaWUsMCwuNSpjKSkuYWRkKG5ldyBWZShpZSwuNSpiLGMpKS5hZGQobmV3IFZlKGllLGIsLjUqYykuY2xvc2UoKSkpLnhtKC4yNSwuMjUsLjc1LC43NSk7fSk7Ym8oIkxpbmVIIixmdW5jdGlvbihhLGIsYyl7YT1uZXcgJGQoY2UpO2Euc3RhcnRYPTA7YS5zdGFydFk9Yy8yO2EuZW5kWD1iO2EuZW5kWT1jLzI7cmV0dXJuIGE7fSk7Ym8oIkxpbmVWIixmdW5jdGlvbihhLGIsYyl7YT1uZXcgJGQoY2UpO2Euc3RhcnRYPWIvMjthLnN0YXJ0WT0wO2EuZW5kWD1iLzI7YS5lbmRZPWM7cmV0dXJuIGE7fSk7Ym8oIk5vbmUiLCJSZWN0YW5nbGUiKTtibygiQmFySCIsIlJlY3RhbmdsZSIpO2JvKCJCYXJWIiwiUmVjdGFuZ2xlIik7Ym8oIk1pbnVzTGluZSIsIkxpbmVIIik7Ym8oIlBsdXNMaW5lIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyAkZCgpLmFkZChuZXcgVWUoMCxjLzIsITEpLmFkZChuZXcgVmUoaWUsYixjLzIpKS5hZGQobmV3IFZlKHplLGIvMiwwKSkuYWRkKG5ldyBWZShpZSxiLzIsYykpKTt9KTtibygiWExpbmUiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3ICRkKCkuYWRkKG5ldyBVZSgwLGMsITEpLmFkZChuZXcgVmUoaWUsYiwwKSkuYWRkKG5ldyBWZSh6ZSwwLDApKS5hZGQobmV3IFZlKGllLGIsYykpKTt9KTtILkJtPXsiIjoiIixTdGFuZGFyZDoiRjEgbSAwLDAgbCA4LDQgLTgsNCAyLC00IHoiLEJhY2t3YXJkOiJGMSBtIDgsMCBsIC0yLDQgMiw0IC04LC00IHoiLFRyaWFuZ2xlOiJGMSBtIDAsMCBsIDgsNC42MiAtOCw0LjYyIHoiLEJhY2t3YXJkVHJpYW5nbGU6IkYxIG0gOCw0IGwgMCw0IC04LC00IDgsLTQgMCw0IHoiLEJvb21lcmFuZzoiRjEgbSAwLDAgbCA4LDQgLTgsNCA0LC00IC00LC00IHoiLEJhY2t3YXJkQm9vbWVyYW5nOiJGMSBtIDgsMCBsIC04LDQgOCw0IC00LC00IDQsLTQgeiIsU2lkZXdheXNWOiJtIDAsMCBsIDgsNCAtOCw0IDAsLTEgNiwtMyAtNiwtMyAwLC0xIHoiLEJhY2t3YXJkVjoibSA4LDAgbCAtOCw0IDgsNCAwLC0xIC02LC0zIDYsLTMgMCwtMSB6IixPcGVuVHJpYW5nbGU6Im0gMCwwIGwgOCw0IC04LDQiLEJhY2t3YXJkT3BlblRyaWFuZ2xlOiJtIDgsMCBsIC04LDQgOCw0IixPcGVuVHJpYW5nbGVMaW5lOiJtIDAsMCBsIDgsNCAtOCw0IG0gOC41LDAgbCAwLC04IixCYWNrd2FyZE9wZW5UcmlhbmdsZUxpbmU6Im0gOCwwIGwgIC04LDQgOCw0IG0gLTguNSwwIGwgMCwtOCIsT3BlblRyaWFuZ2xlVG9wOiJtIDAsMCBsIDgsNCBtIDAsNCIsQmFja3dhcmRPcGVuVHJpYW5nbGVUb3A6Im0gOCwwIGwgLTgsNCBtIDAsNCIsT3BlblRyaWFuZ2xlQm90dG9tOiJtIDAsOCBsIDgsLTQiLEJhY2t3YXJkT3BlblRyaWFuZ2xlQm90dG9tOiJtIDAsNCBsIDgsNCIsSGFsZlRyaWFuZ2xlVG9wOiJGMSBtIDAsMCBsIDAsNCA4LDAgeiBtIDAsOCIsQmFja3dhcmRIYWxmVHJpYW5nbGVUb3A6IkYxIG0gOCwwIGwgMCw0IC04LDAgeiBtIDAsOCIsSGFsZlRyaWFuZ2xlQm90dG9tOiJGMSBtIDAsNCBsIDAsNCA4LC00IHoiLEJhY2t3YXJkSGFsZlRyaWFuZ2xlQm90dG9tOiJGMSBtIDgsNCBsIDAsNCAtOCwtNCB6IixGb3J3YXJkU2VtaUNpcmNsZToibSA0LDAgYiAyNzAgMTgwIDAgNCA0IixCYWNrd2FyZFNlbWlDaXJjbGU6Im0gNCw4IGIgOTAgMTgwIDAgLTQgNCIsRmVhdGhlcjoibSAwLDAgbCAzLDQgLTMsNCIsQmFja3dhcmRGZWF0aGVyOiJtIDMsMCBsIC0zLDQgMyw0IixEb3VibGVGZWF0aGVyczoibSAwLDAgbCAzLDQgLTMsNCBtIDMsLTggbCAzLDQgLTMsNCIsQmFja3dhcmREb3VibGVGZWF0aGVyczoibSAzLDAgbCAtMyw0IDMsNCBtIDMsLTggbCAtMyw0IDMsNCIsVHJpcGxlRmVhdGhlcnM6Im0gMCwwIGwgMyw0IC0zLDQgbSAzLC04IGwgMyw0IC0zLDQgbSAzLC04IGwgMyw0IC0zLDQiLEJhY2t3YXJkVHJpcGxlRmVhdGhlcnM6Im0gMywwIGwgLTMsNCAzLDQgbSAzLC04IGwgLTMsNCAzLDQgbSAzLC04IGwgLTMsNCAzLDQiLEZvcndhcmRTbGFzaDoibSAwLDggbCA1LC04IixCYWNrU2xhc2g6Im0gMCwwIGwgNSw4IixEb3VibGVGb3J3YXJkU2xhc2g6Im0gMCw4IGwgNCwtOCBtIC0yLDggbCA0LC04IixEb3VibGVCYWNrU2xhc2g6Im0gMCwwIGwgNCw4IG0gLTIsLTggbCA0LDgiLFRyaXBsZUZvcndhcmRTbGFzaDoibSAwLDggbCA0LC04IG0gLTIsOCBsIDQsLTggbSAtMiw4IGwgNCwtOCIsVHJpcGxlQmFja1NsYXNoOiJtIDAsMCBsIDQsOCBtIC0yLC04IGwgNCw4IG0gLTIsLTggbCA0LDgiLEZvcms6Im0gMCw0IGwgOCwwIG0gLTgsMCBsIDgsLTQgbSAtOCw0IGwgOCw0IixCYWNrd2FyZEZvcms6Im0gOCw0IGwgLTgsMCBtIDgsMCBsIC04LC00IG0gOCw0IGwgLTgsNCIsTGluZUZvcms6Im0gMCwwIGwgMCw4IG0gMCwtNCBsIDgsMCBtIC04LDAgbCA4LC00IG0gLTgsNCBsIDgsNCIsQmFja3dhcmRMaW5lRm9yazoibSA4LDQgbCAtOCwwIG0gOCwwIGwgLTgsLTQgbSA4LDQgbCAtOCw0IG0gOCwtOCBsIDAsOCIsQ2lyY2xlRm9yazoiRjEgbSA2LDQgYiAwIDM2MCAtMyAwIDMgeiBtIDAsMCBsIDYsMCBtIC02LDAgbCA2LC00IG0gLTYsNCBsIDYsNCIsQmFja3dhcmRDaXJjbGVGb3JrOiJGMSBtIDAsNCBsIDYsMCBtIC02LC00IGwgNiw0IG0gLTYsNCBsIDYsLTQgbSA2LDAgYiAwIDM2MCAtMyAwIDMiLENpcmNsZUxpbmVGb3JrOiJGMSBtIDYsNCBiIDAgMzYwIC0zIDAgMyB6IG0gMSwtNCBsIDAsOCBtIDAsLTQgbCA2LDAgbSAtNiwwIGwgNiwtNCBtIC02LDQgbCA2LDQiLEJhY2t3YXJkQ2lyY2xlTGluZUZvcms6IkYxIG0gMCw0IGwgNiwwIG0gLTYsLTQgbCA2LDQgbSAtNiw0IGwgNiwtNCBtIDAsLTQgbCAwLDggbSA3LC00IGIgMCAzNjAgLTMgMCAzIixDaXJjbGU6IkYxIG0gOCw0IGIgMCAzNjAgLTQgMCA0IHoiLEJsb2NrOiJGMSBtIDAsMCBsIDAsOCA4LDAgMCwtOCB6IixTdHJldGNoZWREaWFtb25kOiJGMSBtIDAsMyBsIDUsLTMgNSwzIC01LDMgLTUsLTMgeiIsRGlhbW9uZDoiRjEgbSAwLDQgbCA0LC00IDQsNCAtNCw0IC00LC00IHoiLENoZXZyb246IkYxIG0gMCwwIGwgNSwwIDMsNCAtMyw0IC01LDAgMywtNCAtMywtNCB6IixTdHJldGNoZWRDaGV2cm9uOiJGMSBtIDAsMCBsIDgsMCAzLDQgLTMsNCAtOCwwIDMsLTQgLTMsLTQgeiIsTm9ybWFsQXJyb3c6IkYxIG0gMCwyIGwgNCwwIDAsLTIgNCw0IC00LDQgMCwtMiAtNCwwIHoiLFg6Im0gMCwwIGwgOCw4IG0gMCwtOCBsIC04LDgiLFRhaWxlZE5vcm1hbEFycm93OiJGMSBtIDAsMCBsIDIsMCAxLDIgMywwIDAsLTIgMiw0IC0yLDQgMCwtMiAtMywwIC0xLDIgLTIsMCAxLC00IC0xLC00IHoiLERvdWJsZVRyaWFuZ2xlOiJGMSBtIDAsMCBsIDQsNCAtNCw0IDAsLTggeiAgbSA0LDAgbCA0LDQgLTQsNCAwLC04IHoiLEJpZ0VuZEFycm93OiJGMSBtIDAsMCBsIDUsMiAwLC0yIDMsNCAtMyw0IDAsLTIgLTUsMiAwLC04IHoiLENvbmNhdmVUYWlsQXJyb3c6IkYxIG0gMCwyIGggNCB2IC0yIGwgNCw0IC00LDQgdiAtMiBoIC00IGwgMiwtMiAtMiwtMiB6IixSb3VuZGVkVHJpYW5nbGU6IkYxIG0gMCwxIGEgMSwxIDAgMCAxIDEsLTEgbCA3LDMgYSAwLjUsMSAwIDAgMSAwLDIgbCAtNywzIGEgMSwxIDAgMCAxIC0xLC0xIGwgMCwtNiB6IixTaW1wbGVBcnJvdzoiRjEgbSAxLDIgbCAtMSwtMiAyLDAgMSwyIC0xLDIgLTIsMCAxLC0yIDUsMCAwLC0yIDIsMiAtMiwyIDAsLTIgeiIsQWNjZWxlcmF0aW9uQXJyb3c6IkYxIG0gMCwwIGwgMCw4IDAuMiwwIDAsLTggLTAuMiwwIHogbSAyLDAgbCAwLDggMSwwIDAsLTggLTEsMCB6IG0gMywwIGwgMiwwIDIsNCAtMiw0IC0yLDAgMCwtOCB6IixCb3hBcnJvdzoiRjEgbSAwLDAgbCA0LDAgMCwyIDIsMCAwLC0yIDIsNCAtMiw0IDAsLTIgLTIsMCAwLDIgLTQsMCAwLC04IHoiLFRyaWFuZ2xlTGluZToiRjEgbSA4LDQgbCAtOCwtNCAwLDggOCwtNCB6IG0gMC41LDQgbCAwLC04IixDaXJjbGVFbmRlZEFycm93OiJGMSBtIDEwLDQgbCAtMiwtMyAwLDIgLTIsMCAwLDIgMiwwIDAsMiAyLC0zIHogbSAtNCwwIGIgMCAzNjAgLTMgMCAzIHoiLER5bmFtaWNXaWR0aEFycm93OiJGMSBtIDAsMyBsIDIsMCAyLC0xIDIsLTIgMiw0IC0yLDQgLTIsLTIgLTIsLTEgLTIsMCAwLC0yIHoiLEVxdWlsaWJyaXVtQXJyb3c6Im0gMCwzIGwgOCwwIC0zLC0zIG0gMyw1IGwgLTgsMCAzLDMiLEZhc3RGb3J3YXJkOiJGMSBtIDAsMCBsIDMuNSw0IDAsLTQgMy41LDQgMCwtNCAxLDAgMCw4IC0xLDAgMCwtNCAtMy41LDQgMCwtNCAtMy41LDQgMCwtOCB6IixLaXRlOiJGMSBtIDAsNCBsIDIsLTQgNiw0IC02LDQgLTIsLTQgeiIsSGFsZkFycm93VG9wOiJGMSBtIDAsMCBsIDQsNCA0LDAgLTgsLTQgeiBtIDAsOCIsSGFsZkFycm93Qm90dG9tOiJGMSBtIDAsOCBsIDQsLTQgNCwwIC04LDQgeiIsT3Bwb3NpbmdEaXJlY3Rpb25Eb3VibGVBcnJvdzoiRjEgbSAwLDQgbCAyLC00IDAsMiA0LDAgMCwtMiAyLDQgLTIsNCAwLC0yIC00LDAgMCwyIC0yLC00IHoiLFBhcnRpYWxEb3VibGVUcmlhbmdsZToiRjEgbSAwLDAgNCwzIDAsLTMgNCw0IC00LDQgMCwtMyAtNCwzIDAsLTggeiIsTGluZUNpcmNsZToiRjEgbSAwLDAgbCAwLDggbSA3IC00IGIgMCAzNjAgLTMgMCAzIHoiLERvdWJsZUxpbmVDaXJjbGU6IkYxIG0gMCwwIGwgMCw4IG0gMiwtOCBsIDAsOCBtIDcgLTQgYiAwIDM2MCAtMyAwIDMgeiIsVHJpcGxlTGluZUNpcmNsZToiRjEgbSAwLDAgbCAwLDggbSAyLC04IGwgMCw4IG0gMiwtOCBsIDAsOCBtIDcgLTQgYiAwIDM2MCAtMyAwIDMgeiIsQ2lyY2xlTGluZToiRjEgbSA2IDQgYiAwIDM2MCAtMyAwIDMgeiBtIDEsLTQgbCAwLDgiLERpYW1vbmRDaXJjbGU6IkYxIG0gOCw0IGwgLTQsNCAtNCwtNCA0LC00IDQsNCBtIDgsMCBiIDAgMzYwIC00IDAgNCB6IixQbHVzQ2lyY2xlOiJGMSBtIDgsNCBiIDAgMzYwIC00IDAgNCBsIC04IDAgeiBtIC00IC00IGwgMCA4IixPcGVuUmlnaHRUcmlhbmdsZVRvcDoibSA4LDAgbCAwLDQgLTgsMCBtIDAsNCIsT3BlblJpZ2h0VHJpYW5nbGVCb3R0b206Im0gOCw4IGwgMCwtNCAtOCwwIixMaW5lOiJtIDAsMCBsIDAsOCIsRG91YmxlTGluZToibSAwLDAgbCAwLDggbSAyLDAgbCAwLC04IixUcmlwbGVMaW5lOiJtIDAsMCBsIDAsOCBtIDIsMCBsIDAsLTggbSAyLDAgbCAwLDgiLFBlbnRhZ29uQXJyb3c6IkYxIG0gOCw0IGwgLTQsLTQgLTQsMCAwLDggNCwwIDQsLTQgeiJ9O2Z1bmN0aW9uIFQoYSl7WC5jYWxsKHRoaXMsYSk7dGhpcy5EPTI0MDg5NTk7dGhpcy5SZz10aGlzLnlmPSIiO3RoaXMuV289dGhpcy5Ubz10aGlzLmhwPXRoaXMuYW89bnVsbDt0aGlzLmpwPSIiO3RoaXMud2Y9dGhpcy5Obj10aGlzLmlwPXRoaXMuZGg9bnVsbDt0aGlzLlZvPSIiO3RoaXMuVW89bWM7dGhpcy5QYj10aGlzLlhvPSIiO3RoaXMuZmk9dGhpcy4kbT10aGlzLlJoPW51bGw7dGhpcy5PZj1uZXcgRyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLmlvPSIiO3RoaXMuVmU9bnVsbDt0aGlzLmpvPVRjO3RoaXMuWW89RWQ7dGhpcy5ybz1iYzt0aGlzLmtvPWNjO3RoaXMud249bnVsbDt0aGlzLmJvPTEyNzt0aGlzLnNpPWRjO3RoaXMuSWo9ImdyYXkiO3RoaXMuT2Q9NDt0aGlzLkJ3PS0xO3RoaXMuSXA9TmFOO3RoaXMuVng9bmV3IE4oKTt0aGlzLnZqPW51bGw7dGhpcy5VZz1OYU47fW9hKFQsWCk7VC5wcm90b3R5cGUuY2xvbmVQcm90ZWN0ZWQ9ZnVuY3Rpb24oYSl7WC5wcm90b3R5cGUuY2xvbmVQcm90ZWN0ZWQuY2FsbCh0aGlzLGEpO2EuRD10aGlzLkQmLTQwOTd8NDkxNTI7YS55Zj10aGlzLnlmO2EuUmc9dGhpcy5SZzthLmFvPXRoaXMuYW87YS5ocD10aGlzLmhwO2EuVG89dGhpcy5UbzthLldvPXRoaXMuV287YS5qcD10aGlzLmpwO2EuaXA9dGhpcy5pcDthLk5uPXRoaXMuTm47YS53Zj1udWxsO2EuVm89dGhpcy5WbzthLlVvPXRoaXMuVW8uSSgpO2EuWG89dGhpcy5YbzthLllvPXRoaXMuWW8uSSgpO2EuUGI9dGhpcy5QYjthLiRtPXRoaXMuJG07YS5PZi5hc3NpZ24odGhpcy5PZik7YS5pbz10aGlzLmlvO2Euam89dGhpcy5qby5JKCk7YS5ybz10aGlzLnJvLkkoKTthLmtvPXRoaXMua28uSSgpO2Eud249dGhpcy53bjthLmJvPXRoaXMuYm87YS5zaT10aGlzLnNpLkkoKTthLklqPXRoaXMuSWo7YS5PZD10aGlzLk9kO2EuSXA9dGhpcy5JcDt9O1QucHJvdG90eXBlLm1mPWZ1bmN0aW9uKGEpe1gucHJvdG90eXBlLm1mLmNhbGwodGhpcyxhKTthLnloKCk7YS5kaD1udWxsO2EuVmU9bnVsbDthLnZqPW51bGw7fTtULnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPVBhKHRoaXMuY29uc3RydWN0b3IpKyIjIitCYih0aGlzKTtudWxsIT09dGhpcy5kYXRhJiYoYSs9IigiK1FhKHRoaXMuZGF0YSkrIikiKTtyZXR1cm4gYTt9O1QucHJvdG90eXBlLm5rPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPXRoaXMuZGlhZ3JhbTtudWxsIT09aCYmKGE9PT1jZiYmImVsZW1lbnRzIj09PWI/ZSBpbnN0YW5jZW9mIFg/QmooZSxmdW5jdGlvbihhKXtEaihoLnBhcnRNYW5hZ2VyLGEpO0NqKGgsYSk7fSk6YmsoaCxlKTphPT09ZGYmJiJlbGVtZW50cyI9PT1iJiYoZSBpbnN0YW5jZW9mIFg/QmooZSxmdW5jdGlvbihhKXtIaihoLnBhcnRNYW5hZ2VyLGEpO0dqKGgsYSk7fSk6ZGsoaCxlKSksaC5hYihhLGIsYyxkLGUsZixnKSk7fTtULnByb3RvdHlwZS5FYT1mdW5jdGlvbihhKXtYLnByb3RvdHlwZS5FYS5jYWxsKHRoaXMsYSk7aWYobnVsbCE9PXRoaXMuZGF0YSl7YT10aGlzLlkuajtmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe3ZhciBkPWFbY107ZCBpbnN0YW5jZW9mIFgmJkJqKGQsZnVuY3Rpb24oYSl7bnVsbCE9PWEuZGF0YSYmYS5FYSgpO30pO319fTtULnByb3RvdHlwZS51cGRhdGVSZWxhdGlvbnNoaXBzRnJvbURhdGE9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5kYXRhJiZ0aGlzLmRpYWdyYW0ucGFydE1hbmFnZXIudXBkYXRlUmVsYXRpb25zaGlwc0Zyb21EYXRhKHRoaXMpO307VC5wcm90b3R5cGUuJGo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53ZjtyZXR1cm4gbnVsbD09PWI/bnVsbDpiLkooYSk7fTtULnByb3RvdHlwZS5xaD1mdW5jdGlvbihhLGIpe2lmKG51bGwhPT1iKXt2YXIgYz1udWxsLGQ9dGhpcy53ZjtudWxsIT09ZCYmKGM9ZC5KKGEpKTtpZihjIT09Yil7aWYobnVsbCE9PWMpe3ZhciBlPWMuZGlhZ3JhbTtudWxsIT09ZSYmZS5yZW1vdmUoYyk7fW51bGw9PT1kJiYodGhpcy53Zj1kPW5ldyBMYigpKTtiLnlmIT09YSYmKGIuY2F0ZWdvcnk9YSk7ZC5hZGQoYSxiKTthPXRoaXMuZGlhZ3JhbTtudWxsIT09YSYmKGEuYWRkKGIpLGE9Yi5hZG9ybmVkT2JqZWN0LG51bGwhPT1hJiYoYT1hLkdpKCksbnVsbCE9PWEmJihiLmRhdGE9YS5kYXRhKSkpO319fTtULnByb3RvdHlwZS50Zj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLndmO2lmKG51bGwhPT1iKXt2YXIgYz1iLkooYSk7aWYobnVsbCE9PWMpe3ZhciBkPWMuZGlhZ3JhbTtudWxsIT09ZCYmZC5yZW1vdmUoYyk7fWIucmVtb3ZlKGEpOzA9PT1iLmNvdW50JiYodGhpcy53Zj1udWxsKTt9fTtULnByb3RvdHlwZS5Taj1mdW5jdGlvbigpe3ZhciBhPXRoaXMud2Y7aWYobnVsbCE9PWEpe3ZhciBiPUthKCk7Zm9yKGE9YS5pdGVyYXRvcjthLm5leHQoKTspe2IucHVzaChhLmtleSk7fWE9Yi5sZW5ndGg7Zm9yKHZhciBjPTA7YzxhO2MrKyl7dGhpcy50ZihiW2NdKTt9T2EoYik7fX07VC5wcm90b3R5cGUudXBkYXRlQWRvcm5tZW50cz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtpZihudWxsIT09YSl7Zm9yKHZhciBiPXRoaXMuYWRvcm5tZW50cztiLm5leHQoKTspe3ZhciBjPWIudmFsdWU7Yy5zKCk7Yy5wbGFjZWhvbGRlciYmYy5wbGFjZWhvbGRlci5zKCk7fWE6e2lmKHRoaXMuaXNTZWxlY3RlZCYmdGhpcy5zZWxlY3Rpb25BZG9ybmVkJiYoYj10aGlzLnNlbGVjdGlvbk9iamVjdCxudWxsIT09YiYmdGhpcy5hY3R1YWxCb3VuZHMubygpJiZ0aGlzLmlzVmlzaWJsZSgpJiZiLnJmKCkmJmIuYWN0dWFsQm91bmRzLm8oKSkpe2M9dGhpcy4kaigiU2VsZWN0aW9uIik7aWYobnVsbD09PWMpe2M9dGhpcy5zZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTtudWxsPT09YyYmKGM9dGhpcy56aCgpP2EubGlua1NlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlOnRoaXMgaW5zdGFuY2VvZiBpZz9hLmdyb3VwU2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6YS5ub2RlU2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGUpO2lmKCEoYyBpbnN0YW5jZW9mIHBmKSlicmVhayBhO1lnKGMpO2M9Yy5jb3B5KCk7bnVsbCE9PWMmJih0aGlzLnpoKCkmJnRoaXMuc2VsZWN0aW9uT2JqZWN0PT09dGhpcy5wYXRoJiYoYy50eXBlPVguTGluayksYy5hZG9ybmVkT2JqZWN0PWIpO31pZihudWxsIT09Yyl7aWYobnVsbCE9PWMucGxhY2Vob2xkZXIpe3ZhciBkPWIuQ2UoKSxlPTA7YiBpbnN0YW5jZW9mIFcmJihlPWIuc3Ryb2tlV2lkdGgpO3ZhciBmPUsuYWxsb2MoKTtmLmgoKGIubmF0dXJhbEJvdW5kcy53aWR0aCtlKSpkLChiLm5hdHVyYWxCb3VuZHMuaGVpZ2h0K2UpKmQpO0suZnJlZShmKTt9Yy50eXBlPT09WC5MaW5rP2MucygpOihiPUcuYWxsb2MoKSxHLmZyZWUoYikpO3RoaXMucWgoIlNlbGVjdGlvbiIsYyk7YnJlYWsgYTt9fXRoaXMudGYoIlNlbGVjdGlvbiIpO31jbyh0aGlzLGEpO2ZvcihiPXRoaXMuYWRvcm5tZW50cztiLm5leHQoKTspe2IudmFsdWUuRWEoKTt9fX07VC5wcm90b3R5cGUuSmI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07bnVsbCE9PWEmJihQaShhKSwwIT09KHRoaXMuRCYxNjM4NCkhPT0hMCYmKGhpKHRoaXMsITApLGEuY2MoKSkpO307ZnVuY3Rpb24gZ2koYSl7MCE9PShhLkQmMTYzODQpIT09ITEmJihhLnVwZGF0ZUFkb3JubWVudHMoKSxoaShhLCExKSk7fWZ1bmN0aW9uIGNvKGEsYil7Yi50b29sTWFuYWdlci5tb3VzZURvd25Ub29scy5lYWNoKGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkJiZiLnVwZGF0ZUFkb3JubWVudHMoYSk7fSk7Yi50b29sTWFuYWdlci51cGRhdGVBZG9ybm1lbnRzKGEpO31mdW5jdGlvbiBlbyhhKXtpZighMT09PXFqKGEpKXtmbyhhLCEwKTthLmZsKCk7dmFyIGI9YS5kaWFncmFtO251bGwhPT1iJiYoYi5EZC5hZGQoYSksYi5jYygpKTt9fWZ1bmN0aW9uIGdvKGEpe2EuRHw9MjA5NzE1MjtpZighMSE9PXFqKGEpKXt2YXIgYj1hLnBvc2l0aW9uLGM9YS5sb2NhdGlvbjtjLm8oKSYmYi5vKCl8fGhvKGEsYixjKTtjPWEudmI7dmFyIGQ9Ti5hbGxvYygpLmFzc2lnbihjKTtjLmhhKCk7Yy54PWIueDtjLnk9Yi55O2MuZnJlZXplKCk7YS5sdChkLGMpO04uZnJlZShkKTtmbyhhLCExKTt9fVQucHJvdG90eXBlLm1vdmU9ZnVuY3Rpb24oYSxiKXshMD09PWI/dGhpcy5sb2NhdGlvbj1hOnRoaXMucG9zaXRpb249YTt9O1QucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbihhLGIsYyl7YT1HLmFsbG9jQXQoYSxiKTt0aGlzLm1vdmUoYSxjKTtHLmZyZWUoYSk7fTtULnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtpZighdGhpcy52aXNpYmxlKXJldHVybiExO3ZhciBhPXRoaXMubGF5ZXI7aWYobnVsbCE9PWEmJiFhLnZpc2libGUpcmV0dXJuITE7YT10aGlzLmRpYWdyYW07aWYobnVsbCE9PWEmJlhoKGEuYW5pbWF0aW9uTWFuYWdlcix0aGlzKSlyZXR1cm4hMDthPXRoaXMuY29udGFpbmluZ0dyb3VwO3JldHVybiBudWxsPT09YXx8YS5pc1N1YkdyYXBoRXhwYW5kZWQmJmEuaXNWaXNpYmxlKCk/ITA6ITE7fTt0PVQucHJvdG90eXBlO3QuTWI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kaWFncmFtO2E/KHRoaXMuQig0KSx0aGlzLkpiKCksbnVsbCE9PWImJmIuRGQuYWRkKHRoaXMpKToodGhpcy5CKDgpLHRoaXMuU2ooKSk7dGhpcy55aCgpO251bGwhPT1iJiYoYi5YYSgpLGIuUigpKTt9O3QuJGE9ZnVuY3Rpb24oYSl7aWYodGhpcy5uYW1lPT09YSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLnZqO251bGw9PT1iJiYodGhpcy52aj1iPW5ldyBMYigpKTtpZihudWxsIT09Yi5KKGEpKXJldHVybiBiLkooYSk7dmFyIGM9WC5wcm90b3R5cGUuJGEuY2FsbCh0aGlzLGEpO2lmKG51bGwhPT1jKXJldHVybiBiLnNldChhLGMpLGM7Yi5zZXQoYSxudWxsKTtyZXR1cm4gbnVsbDt9O3QubmY9ZnVuY3Rpb24oYSxiLGMpe3ZvaWQgMD09PWMmJihjPW5ldyBHKCkpO2I9Yi5qYygpP2RkOmI7dmFyIGQ9YS5uYXR1cmFsQm91bmRzO2MuaChkLndpZHRoKmIueCtiLm9mZnNldFgsZC5oZWlnaHQqYi55K2Iub2Zmc2V0WSk7aWYobnVsbD09PWF8fGE9PT10aGlzKXJldHVybiBjO2EudHJhbnNmb3JtLnRhKGMpO2ZvcihhPWEucGFuZWw7bnVsbCE9PWEmJmEhPT10aGlzOyl7YS50cmFuc2Zvcm0udGEoYyksYT1hLnBhbmVsO310aGlzLk5mLnRhKGMpO2Mub2Zmc2V0KC10aGlzLnBjLngsLXRoaXMucGMueSk7cmV0dXJuIGM7fTt0LlZwPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW5ldyBOKCkpO3JldHVybiBhLmFzc2lnbih0aGlzLmFjdHVhbEJvdW5kcyk7fTt0LmFjPWZ1bmN0aW9uKCl7ITA9PT1vaih0aGlzKSYmKHRoaXMgaW5zdGFuY2VvZiBpZyYmdGhpcy5tZW1iZXJQYXJ0cy5lYWNoKGZ1bmN0aW9uKGEpe2EuYWMoKTt9KSx0aGlzLm1lYXN1cmUoSW5maW5pdHksSW5maW5pdHkpKTt0aGlzLmFycmFuZ2UoKTt9O2Z1bmN0aW9uIHpqKGEsYil7dmFyIGM9YS5WeDtpc05hTihhLlVnKSYmKGEuVWc9Vm0oYSkpO3ZhciBkPWEuVWc7dmFyIGU9MipkO2lmKCFhLmlzU2hhZG93ZWQpcmV0dXJuIGMuaChiLngtMS1kLGIueS0xLWQsYi53aWR0aCsyK2UsYi5oZWlnaHQrMitlKSxjO2Q9Yi54O2U9Yi55O3ZhciBmPWIud2lkdGg7Yj1iLmhlaWdodDt2YXIgZz1hLnNoYWRvd0JsdXI7YT1hLnNoYWRvd09mZnNldDtmKz1nO2IrPWc7ZC09Zy8yO2UtPWcvMjswPGEueD9mKz1hLng6KGQrPWEueCxmLT1hLngpOzA8YS55P2IrPWEueTooZSs9YS55LGItPWEueSk7Yy5oKGQtMSxlLTEsZisyLGIrMik7cmV0dXJuIGM7fVQucHJvdG90eXBlLmFycmFuZ2U9ZnVuY3Rpb24oKXtpZighMT09PXBqKHRoaXMpKWdvKHRoaXMpO2Vsc2V7dmFyIGE9dGhpcy52YixiPU4uYWxsb2MoKTtiLmFzc2lnbihhKTthLmhhKCk7dmFyIGM9b2codGhpcyk7dGhpcy50aCgwLDAsdGhpcy5wYy53aWR0aCx0aGlzLnBjLmhlaWdodCk7dmFyIGQ9dGhpcy5wb3NpdGlvbjtobyh0aGlzLGQsdGhpcy5sb2NhdGlvbik7YS54PWQueDthLnk9ZC55O2EuZnJlZXplKCk7dGhpcy5sdChiLGEpO2NsKHRoaXMsITEpO2IuQShhKT90aGlzLmhkKGMpOiF0aGlzLkxiKCl8fEgudyhiLndpZHRoLGEud2lkdGgpJiZILncoYi5oZWlnaHQsYS5oZWlnaHQpfHwwPD10aGlzLkJ3JiZ0aGlzLkIoMTYpO04uZnJlZShiKTtmbyh0aGlzLCExKTt9fTt0PVQucHJvdG90eXBlO3QubHQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmRpYWdyYW07aWYobnVsbCE9PWMpe3ZhciBkPSExO2lmKCExPT09Yy5PZyYmYS5vKCkpe3ZhciBlPU4uYWxsb2MoKTtlLmFzc2lnbihjLmRvY3VtZW50Qm91bmRzKTtlLk92KGMucGFkZGluZyk7YS54PmUueCYmYS55PmUueSYmYS5yaWdodDxlLnJpZ2h0JiZhLmJvdHRvbTxlLmJvdHRvbSYmYi54PmUueCYmYi55PmUueSYmYi5yaWdodDxlLnJpZ2h0JiZiLmJvdHRvbTxlLmJvdHRvbSYmKGQ9ITApO04uZnJlZShlKTt9MCE9PSh0aGlzLkQmNjU1MzYpIT09ITAmJmEuQShiKXx8RWoodGhpcyxkLGMpO2MuUigpO3hjKGEsYil8fCh0aGlzIGluc3RhbmNlb2YgViYmIWMudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZyYmdGhpcy5lZCgpLHRoaXMueWgoKSk7fX07dC5Ldj1mdW5jdGlvbihhLGIpe2lmKHRoaXMuemgoKXx8IWEubygpKXJldHVybiExO3ZhciBjPXRoaXMuZGlhZ3JhbTtpZihudWxsIT09YyYmKGlvKHRoaXMsYyxhLGIpLCEwPT09Yy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nKSlyZXR1cm4hMDt0aGlzLnNhPWE7dGhpcy5EJj0tMjA5NzE1MztjPXRoaXMuT2Y7aWYoYy5vKCkpe3ZhciBkPWMuY29weSgpO2MuaChjLngrKGEueC1iLngpLGMueSsoYS55LWIueSkpO3RoaXMuZygibG9jYXRpb24iLGQsYyk7fSExPT09cWoodGhpcykmJiExPT09cGoodGhpcykmJihlbyh0aGlzKSxnbyh0aGlzKSk7cmV0dXJuITA7fTtmdW5jdGlvbiBpbyhhLGIsYyxkKXtudWxsPT09Ynx8YSBpbnN0YW5jZW9mIHBmfHwoYj1iLmFuaW1hdGlvbk1hbmFnZXIsYi5ZZyYmYi55ZShhLCJwb3NpdGlvbiIsZC5jb3B5KCksYy5jb3B5KCksITEpKTt9dC53dD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuT2YsZD10aGlzLnNhO3FqKHRoaXMpfHxwaih0aGlzKT9jLmgoTmFOLE5hTik6Yy5oKGMueCthLWQueCxjLnkrYi1kLnkpO2QuaChhLGIpO2VvKHRoaXMpO307dC5Mdj1mdW5jdGlvbigpe3RoaXMuRCY9LTIwOTcxNTM7ZW8odGhpcyk7fTtmdW5jdGlvbiBobyhhLGIsYyl7dmFyIGQ9Ry5hbGxvYygpLGU9YS5sb2NhdGlvblNwb3QsZj1hLmxvY2F0aW9uT2JqZWN0O2UuamMoKSYmQSgiZGV0ZXJtaW5lT2Zmc2V0OiBQYXJ0J3MgbG9jYXRpb25TcG90IG11c3QgYmUgcmVhbDogIitlLnRvU3RyaW5nKCkpO3ZhciBnPWYubmF0dXJhbEJvdW5kcyxoPWYgaW5zdGFuY2VvZiBXP2Yuc3Ryb2tlV2lkdGg6MDtkLnFrKDAsMCxnLndpZHRoK2gsZy5oZWlnaHQraCxlKTtpZihmIT09YSlmb3IoZC5vZmZzZXQoLWgvMiwtaC8yKSxmLnRyYW5zZm9ybS50YShkKSxlPWYucGFuZWw7bnVsbCE9PWUmJmUhPT1hOyl7ZS50cmFuc2Zvcm0udGEoZCksZT1lLnBhbmVsO31hLk5mLnRhKGQpO2Qub2Zmc2V0KC1hLnBjLngsLWEucGMueSk7ZT1hLmRpYWdyYW07Zj1jLm8oKTtnPWIubygpO2YmJmc/MCE9PShhLkQmMjA5NzE1Mik/am8oYSxiLGMsZSxkKTprbyhhLGIsYyxlLGQpOmY/am8oYSxiLGMsZSxkKTpnJiZrbyhhLGIsYyxlLGQpO2EuRHw9MjA5NzE1MjtHLmZyZWUoZCk7YS5mbCgpO31mdW5jdGlvbiBqbyhhLGIsYyxkLGUpe3ZhciBmPWIueCxnPWIueTtiLmgoYy54LWUueCxjLnktZS55KTtudWxsIT09ZCYmKGM9ZC5hbmltYXRpb25NYW5hZ2VyLChlPWMuaXNBbmltYXRpbmcpfHwhYy5ZZ3x8YSBpbnN0YW5jZW9mIHBmfHxjLnllKGEsInBvc2l0aW9uIixuZXcgRyhmLGcpLGIsITEpLGV8fGIueD09PWYmJmIueT09PWd8fChjPWQuc2tpcHNVbmRvTWFuYWdlcixkLnNraXBzVW5kb01hbmFnZXI9ITAsYS5nKCJwb3NpdGlvbiIsbmV3IEcoZixnKSxiKSxkLnNraXBzVW5kb01hbmFnZXI9YykpO31mdW5jdGlvbiBrbyhhLGIsYyxkLGUpe3ZhciBmPWMuY29weSgpO2MuaChiLngrZS54LGIueStlLnkpO2MuQShmKXx8bnVsbD09PWR8fChiPWQuc2tpcHNVbmRvTWFuYWdlcixkLnNraXBzVW5kb01hbmFnZXI9ITAsYS5nKCJsb2NhdGlvbiIsZixjKSxkLnNraXBzVW5kb01hbmFnZXI9Yik7fWZ1bmN0aW9uIEVqKGEsYixjKXtlbChhLCExKTthIGluc3RhbmNlb2YgViYmcGsoYyxhKTthLmxheWVyLmlzVGVtcG9yYXJ5fHxifHxjLlhhKCk7Yj1hLnZiO3ZhciBkPWMudmlld3BvcnRCb3VuZHM7ZC5vKCk/b2coYSk/KEFjKGIsZCwxMCl8fGEuaGQoITEpLGEudXBkYXRlQWRvcm5tZW50cygpKTpiLkljKGQpPyhhLmhkKCEwKSxhLnVwZGF0ZUFkb3JubWVudHMoKSk6YS5KYigpOmMuYmk9ITA7fXQuUGk9ZnVuY3Rpb24oKXtyZXR1cm4hMDt9O3QuTGI9ZnVuY3Rpb24oKXtyZXR1cm4hMDt9O3Quemg9ZnVuY3Rpb24oKXtyZXR1cm4hMTt9O3Quc2c9ZnVuY3Rpb24oKXtyZXR1cm4hMDt9O2Z1bmN0aW9uIGxvKGEsYixjLGQpe2IuY29uc3RydWN0b3I9PT1hLmNvbnN0cnVjdG9yfHxtb3x8KG1vPSEwLHlhKCdTaG91bGQgbm90IGNoYW5nZSB0aGUgY2xhc3Mgb2YgdGhlIFBhcnQgd2hlbiBjaGFuZ2luZyBjYXRlZ29yeSBmcm9tICInK2MrJyIgdG8gIicrZCsnIicpLHlhKCIgIE9sZCBjbGFzczogIitQYShhLmNvbnN0cnVjdG9yKSsiLCBuZXcgY2xhc3M6ICIrUGEoYi5jb25zdHJ1Y3RvcikrIiwgcGFydDogIithLnRvU3RyaW5nKCkpKTthLlNqKCk7dmFyIGU9YS5kYXRhO2M9YS5sYXllck5hbWU7dmFyIGY9YS5pc1NlbGVjdGVkLGc9YS5pc0hpZ2hsaWdodGVkLGg9ITAsaz0hMCxsPSExO2EgaW5zdGFuY2VvZiBWJiYoaD1hLmlzVHJlZUxlYWYsaz1hLmlzVHJlZUV4cGFuZGVkLGw9YS53YXNUcmVlRXhwYW5kZWQpO2IubWYoYSk7Yi5jbG9uZVByb3RlY3RlZChhKTthLnlmPWQ7YS5zKCk7YS5SKCk7Yj1hLmRpYWdyYW07ZD0hMDtudWxsIT09YiYmKGQ9Yi5za2lwc1VuZG9NYW5hZ2VyLGIuc2tpcHNVbmRvTWFuYWdlcj0hMCk7YS5qYj1lO2EuRD1mP2EuRHw0MDk2OmEuRCYtNDA5NzthLkQ9Zz9hLkR8NTI0Mjg4OmEuRCYtNTI0Mjg5O2EgaW5zdGFuY2VvZiBWJiYoYS5TPWg/YS5TfDQ6YS5TJi01LGEuUz1rP2EuU3wxOmEuUyYtMixhLlM9bD9hLlN8MjphLlMmLTMpO251bGwhPT1lJiZhLkVhKCk7ZT1hLmxheWVyTmFtZTtlIT09YyYmKGEuUmc9YyxhLmxheWVyTmFtZT1lKTtudWxsIT09YiYmKGIuc2tpcHNVbmRvTWFuYWdlcj1kKTthLkxiKCkmJmEuQig2NCk7fVQucHJvdG90eXBlLmNhbkNvcHk9ZnVuY3Rpb24oKXtpZighdGhpcy5jb3B5YWJsZSlyZXR1cm4hMTt2YXIgYT10aGlzLmxheWVyO2lmKG51bGw9PT1hKXJldHVybiEwO2lmKCFhLmFsbG93Q29weSlyZXR1cm4hMTthPWEuZGlhZ3JhbTtyZXR1cm4gbnVsbD09PWE/ITA6YS5hbGxvd0NvcHk/ITA6ITE7fTtULnByb3RvdHlwZS5jYW5EZWxldGU9ZnVuY3Rpb24oKXtpZighdGhpcy5kZWxldGFibGUpcmV0dXJuITE7dmFyIGE9dGhpcy5sYXllcjtpZihudWxsPT09YSlyZXR1cm4hMDtpZighYS5hbGxvd0RlbGV0ZSlyZXR1cm4hMTthPWEuZGlhZ3JhbTtyZXR1cm4gbnVsbD09PWE/ITA6YS5hbGxvd0RlbGV0ZT8hMDohMTt9O1QucHJvdG90eXBlLmNhbkVkaXQ9ZnVuY3Rpb24oKXtpZighdGhpcy50ZXh0RWRpdGFibGUpcmV0dXJuITE7dmFyIGE9dGhpcy5sYXllcjtpZihudWxsPT09YSlyZXR1cm4hMDtpZighYS5hbGxvd1RleHRFZGl0KXJldHVybiExO2E9YS5kaWFncmFtO3JldHVybiBudWxsPT09YT8hMDphLmFsbG93VGV4dEVkaXQ/ITA6ITE7fTtULnByb3RvdHlwZS5jYW5Hcm91cD1mdW5jdGlvbigpe2lmKCF0aGlzLmdyb3VwYWJsZSlyZXR1cm4hMTt2YXIgYT10aGlzLmxheWVyO2lmKG51bGw9PT1hKXJldHVybiEwO2lmKCFhLmFsbG93R3JvdXApcmV0dXJuITE7YT1hLmRpYWdyYW07cmV0dXJuIG51bGw9PT1hPyEwOmEuYWxsb3dHcm91cD8hMDohMTt9O1QucHJvdG90eXBlLmNhbk1vdmU9ZnVuY3Rpb24oKXtpZighdGhpcy5tb3ZhYmxlKXJldHVybiExO3ZhciBhPXRoaXMubGF5ZXI7aWYobnVsbD09PWEpcmV0dXJuITA7aWYoIWEuYWxsb3dNb3ZlKXJldHVybiExO2E9YS5kaWFncmFtO3JldHVybiBudWxsPT09YT8hMDphLmFsbG93TW92ZT8hMDohMTt9O1QucHJvdG90eXBlLmNhblJlc2hhcGU9ZnVuY3Rpb24oKXtpZighdGhpcy5yZXNoYXBhYmxlKXJldHVybiExO3ZhciBhPXRoaXMubGF5ZXI7aWYobnVsbD09PWEpcmV0dXJuITA7aWYoIWEuYWxsb3dSZXNoYXBlKXJldHVybiExO2E9YS5kaWFncmFtO3JldHVybiBudWxsPT09YT8hMDphLmFsbG93UmVzaGFwZT8hMDohMTt9O1QucHJvdG90eXBlLmNhblJlc2l6ZT1mdW5jdGlvbigpe2lmKCF0aGlzLnJlc2l6YWJsZSlyZXR1cm4hMTt2YXIgYT10aGlzLmxheWVyO2lmKG51bGw9PT1hKXJldHVybiEwO2lmKCFhLmFsbG93UmVzaXplKXJldHVybiExO2E9YS5kaWFncmFtO3JldHVybiBudWxsPT09YT8hMDphLmFsbG93UmVzaXplPyEwOiExO307VC5wcm90b3R5cGUuY2FuUm90YXRlPWZ1bmN0aW9uKCl7aWYoIXRoaXMucm90YXRhYmxlKXJldHVybiExO3ZhciBhPXRoaXMubGF5ZXI7aWYobnVsbD09PWEpcmV0dXJuITA7aWYoIWEuYWxsb3dSb3RhdGUpcmV0dXJuITE7YT1hLmRpYWdyYW07cmV0dXJuIG51bGw9PT1hPyEwOmEuYWxsb3dSb3RhdGU/ITA6ITE7fTtULnByb3RvdHlwZS5jYW5TZWxlY3Q9ZnVuY3Rpb24oKXtpZighdGhpcy5zZWxlY3RhYmxlKXJldHVybiExO3ZhciBhPXRoaXMubGF5ZXI7aWYobnVsbD09PWEpcmV0dXJuITA7aWYoIWEuYWxsb3dTZWxlY3QpcmV0dXJuITE7YT1hLmRpYWdyYW07cmV0dXJuIG51bGw9PT1hPyEwOmEuYWxsb3dTZWxlY3Q/ITA6ITE7fTtmdW5jdGlvbiBoaShhLGIpe2EuRD1iP2EuRHwxNjM4NDphLkQmLTE2Mzg1O31mdW5jdGlvbiBxaihhKXtyZXR1cm4gMCE9PShhLkQmMzI3NjgpO31mdW5jdGlvbiBmbyhhLGIpe2EuRD1iP2EuRHwzMjc2ODphLkQmLTMyNzY5O31mdW5jdGlvbiBlbChhLGIpe2EuRD1iP2EuRHw2NTUzNjphLkQmLTY1NTM3O31mdW5jdGlvbiBvZyhhKXtyZXR1cm4gMCE9PShhLkQmMTMxMDcyKTt9dD1ULnByb3RvdHlwZTt0LmhkPWZ1bmN0aW9uKGEpe3RoaXMuRD1hP3RoaXMuRHwxMzEwNzI6dGhpcy5EJi0xMzEwNzM7fTtmdW5jdGlvbiBubyhhLGIpe2EuRD1iP2EuRHwxMDQ4NTc2OmEuRCYtMTA0ODU3Nzt9dC55aD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY29udGFpbmluZ0dyb3VwO251bGwhPT1hJiYoYS5zKCksbnVsbCE9PWEucGxhY2Vob2xkZXImJmEucGxhY2Vob2xkZXIucygpLGEuZWQoKSk7fTt0LlI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07bnVsbCE9PWEmJiFwaih0aGlzKSYmIXFqKHRoaXMpJiZ0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLnZiLm8oKSYmYS5SKHpqKHRoaXMsdGhpcy52YikpO307dC5zPWZ1bmN0aW9uKCl7WC5wcm90b3R5cGUucy5jYWxsKHRoaXMpO3ZhciBhPXRoaXMuZGlhZ3JhbTtudWxsIT09YSYmKGEuRGQuYWRkKHRoaXMpLHRoaXMgaW5zdGFuY2VvZiBWJiZudWxsIT09dGhpcy5sYWJlbGVkTGluayYmdGwodGhpcy5sYWJlbGVkTGluayksYS5jYyghMCkpO307dC5ZcD1mdW5jdGlvbihhKXthfHwoYT10aGlzLlJoLG51bGwhPT1hJiZvbyhhLHRoaXMpKTt9O3QuWnA9ZnVuY3Rpb24oYSl7YXx8KGE9dGhpcy5SaCxudWxsIT09YSYmcG8oYSx0aGlzKSk7fTt0LllqPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kYXRhO2lmKG51bGwhPT1hKXt2YXIgYj10aGlzLmRpYWdyYW07bnVsbCE9PWImJihiPWIubW9kZWwsbnVsbCE9PWImJmIub20oYSkpO319O3QuU3k9ZnVuY3Rpb24oKXtyZXR1cm4gcW8odGhpcyx0aGlzKTt9O2Z1bmN0aW9uIHFvKGEsYil7dmFyIGM9Yi5jb250YWluaW5nR3JvdXA7cmV0dXJuIG51bGwhPT1jPzErcW8oYSxjKTpiIGluc3RhbmNlb2YgViYmKGI9Yi5sYWJlbGVkTGluayxudWxsIT09Yik/cW8oYSxiKTowO310LlZ5PWZ1bmN0aW9uKCl7cmV0dXJuIHJvKHRoaXMsdGhpcyk7fTtmdW5jdGlvbiBybyhhLGIpe3ZhciBjPWIuY29udGFpbmluZ0dyb3VwO3JldHVybiBudWxsIT09Y3x8YiBpbnN0YW5jZW9mIFYmJihjPWIubGFiZWxlZExpbmssbnVsbCE9PWMpP3JvKGEsYyk6Yjt9dC5WZD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIGlnP3NvKHRoaXMsdGhpcyxhKTohMTt9O2Z1bmN0aW9uIHNvKGEsYixjKXtpZihiPT09Y3x8bnVsbD09PWMpcmV0dXJuITE7dmFyIGQ9Yi5jb250YWluaW5nR3JvdXA7cmV0dXJuIG51bGw9PT1kfHxkIT09YyYmIXNvKGEsZCxjKT9iIGluc3RhbmNlb2YgViYmKGI9Yi5sYWJlbGVkTGluayxudWxsIT09Yik/c28oYSxiLGMpOiExOiEwO310Lmh4PWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiBudWxsO2lmKHRoaXM9PT1hKXJldHVybiB0aGlzLmNvbnRhaW5pbmdHcm91cDtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2IgaW5zdGFuY2VvZiBpZyYmbm8oYiwhMCk7aWYoYiBpbnN0YW5jZW9mIFYpe3ZhciBjPWIubGFiZWxlZExpbms7bnVsbCE9PWMmJihiPWMpO31iPWIuY29udGFpbmluZ0dyb3VwO31jPW51bGw7Zm9yKGI9YTtudWxsIT09Yjspe2lmKDAhPT0oYi5EJjEwNDg1NzYpKXtjPWI7YnJlYWs7fWIgaW5zdGFuY2VvZiBWJiYoYT1iLmxhYmVsZWRMaW5rLG51bGwhPT1hJiYoYj1hKSk7Yj1iLmNvbnRhaW5pbmdHcm91cDt9Zm9yKGI9dGhpcztudWxsIT09Yjspe2IgaW5zdGFuY2VvZiBpZyYmbm8oYiwhMSksYiBpbnN0YW5jZW9mIFYmJihhPWIubGFiZWxlZExpbmssbnVsbCE9PWEmJihiPWEpKSxiPWIuY29udGFpbmluZ0dyb3VwO31yZXR1cm4gYzt9O1QucHJvdG90eXBlLmNhbkxheW91dD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzTGF5b3V0UG9zaXRpb25lZHx8IXRoaXMuaXNWaXNpYmxlKCkpcmV0dXJuITE7dmFyIGE9dGhpcy5sYXllcjtyZXR1cm4gbnVsbCE9PWEmJmEuaXNUZW1wb3Jhcnl8fHRoaXMgaW5zdGFuY2VvZiBWJiZ0aGlzLmlzTGlua0xhYmVsPyExOiEwO307VC5wcm90b3R5cGUuQj1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT0xNjc3NzIxNSk7aWYodGhpcy5pc0xheW91dFBvc2l0aW9uZWQmJjAhPT0oYSZ0aGlzLmxheW91dENvbmRpdGlvbnMpKXt2YXIgYj10aGlzLmxheWVyO251bGwhPT1iJiZiLmlzVGVtcG9yYXJ5fHx0aGlzIGluc3RhbmNlb2YgViYmdGhpcy5pc0xpbmtMYWJlbD9iPSExOihiPXRoaXMuZGlhZ3JhbSxiPW51bGwhPT1iJiZiLnVuZG9NYW5hZ2VyLmlzVW5kb2luZ1JlZG9pbmc/ITE6ITApO31lbHNlIGI9ITE7aWYoYilpZihiPXRoaXMuUmgsbnVsbCE9PWIpe3ZhciBjPWIubGF5b3V0O251bGwhPT1jP2MuQigpOmIuQihhKTt9ZWxzZSBhPXRoaXMuZGlhZ3JhbSxudWxsIT09YSYmKGE9YS5sYXlvdXQsbnVsbCE9PWEmJmEuQigpKTt9O2Z1bmN0aW9uIEZqKGEpe2lmKCFhLmlzVmlzaWJsZSgpKXJldHVybiExO2E9YS5sYXllcjtyZXR1cm4gbnVsbCE9PWEmJmEuaXNUZW1wb3Jhcnk/ITE6ITA7fWZ1bmN0aW9uIElrKGEsYixjLGQsZSxmKXt2b2lkIDA9PT1mJiYoZj1udWxsKTtpZighKGEuY29udGFpbnMoYil8fG51bGwhPT1mJiYhZihiKXx8YiBpbnN0YW5jZW9mIHBmKSlpZihhLmFkZChiKSxiIGluc3RhbmNlb2YgVil7aWYoYyYmYiBpbnN0YW5jZW9mIGlnKWZvcih2YXIgZz1iLm1lbWJlclBhcnRzO2cubmV4dCgpOyl7SWsoYSxnLnZhbHVlLGMsZCxlLGYpO31pZighMSE9PWUpZm9yKGc9Yi5saW5rc0Nvbm5lY3RlZDtnLm5leHQoKTspe3ZhciBoPWcudmFsdWU7aWYoIWEuY29udGFpbnMoaCkpe3ZhciBrPWguZnJvbU5vZGUsbD1oLnRvTm9kZTtrPW51bGw9PT1rfHxhLmNvbnRhaW5zKGspO2w9bnVsbD09PWx8fGEuY29udGFpbnMobCk7KGU/ayYmbDprfHxsKSYmSWsoYSxoLGMsZCxlLGYpO319aWYoMTxkKWZvcihiPWIuJHUoKTtiLm5leHQoKTspe0lrKGEsYi52YWx1ZSxjLGQtMSxlLGYpO319ZWxzZSBpZihiIGluc3RhbmNlb2YgUylmb3IoYj1iLmxhYmVsTm9kZXM7Yi5uZXh0KCk7KXtJayhhLGIudmFsdWUsYyxkLGUsZik7fX1wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhULnByb3RvdHlwZSx7a2V5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKG51bGwhPT1hKXJldHVybiBhLm1vZGVsLnBhKHRoaXMuZGF0YSk7fX0sYWRvcm5tZW50czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsPT09dGhpcy53Zj94Yjp0aGlzLndmLml0ZXJhdG9yVmFsdWVzO319LGxheWVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZmk7fX0sZGlhZ3JhbTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMuZmk7cmV0dXJuIG51bGwhPT1hP2EuZGlhZ3JhbTpudWxsO319LGxheWVyTmFtZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlJnO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlJnO2lmKGIhPT1hKXt2YXIgYz10aGlzLmRpYWdyYW07aWYobnVsbD09PWN8fG51bGwhPT1jLlpsKGEpJiYhYy5wYXJ0TWFuYWdlci5hZGRzVG9UZW1wb3JhcnlMYXllcilpZih0aGlzLlJnPWEsbnVsbCE9PWMmJmMuWGEoKSx0aGlzLmcoImxheWVyTmFtZSIsYixhKSxiPXRoaXMubGF5ZXIsbnVsbCE9PWImJmIubmFtZSE9PWEmJihjPWIuZGlhZ3JhbSxudWxsIT09YyYmKGE9Yy5abChhKSxudWxsIT09YSYmYSE9PWIpKSl7dmFyIGQ9Yi54YygtMSx0aGlzLCEwKTswPD1kJiZjLmFiKGRmLCJwYXJ0cyIsYix0aGlzLG51bGwsZCwhMCk7ZD1hLk5pKDk5OTk5OTk5LHRoaXMsITApO2IudmlzaWJsZSE9PWEudmlzaWJsZSYmdGhpcy5NYihhLnZpc2libGUpOzA8PWQmJmMuYWIoY2YsInBhcnRzIixhLG51bGwsdGhpcywhMCxkKTtkPXRoaXMubGF5ZXJDaGFuZ2VkO2lmKG51bGwhPT1kKXt2YXIgZT1jLmRhO2MuZGE9ITA7ZCh0aGlzLGIsYSk7Yy5kYT1lO319fX19LGxheWVyQ2hhbmdlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmFvO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmFvO2IhPT1hJiYodGhpcy5hbz1hLHRoaXMuZygibGF5ZXJDaGFuZ2VkIixiLGEpKTt9fSx6T3JkZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5JcDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5JcDtpZihiIT09YSl7dGhpcy5JcD1hO3ZhciBjPXRoaXMubGF5ZXI7bnVsbCE9PWMmJmtpKGMsLTEsdGhpcyk7dGhpcy5nKCJ6T3JkZXIiLGIsYSk7YT10aGlzLmRpYWdyYW07bnVsbCE9PWEmJmEuUigpO319fSxsb2NhdGlvbk9iamVjdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe2lmKG51bGw9PT10aGlzLlZlKXt2YXIgYT10aGlzLmxvY2F0aW9uT2JqZWN0TmFtZTsiIiE9PWE/KGE9dGhpcy4kYShhKSxudWxsIT09YT90aGlzLlZlPWE6dGhpcy5WZT10aGlzKTp0aGlzIGluc3RhbmNlb2YgcGY/dGhpcy50eXBlIT09WC5MaW5rJiZudWxsIT09dGhpcy5wbGFjZWhvbGRlcj90aGlzLlZlPXRoaXMucGxhY2Vob2xkZXI6dGhpcy5WZT10aGlzOnRoaXMuVmU9dGhpczt9cmV0dXJuIHRoaXMuVmUudmlzaWJsZT90aGlzLlZlOnRoaXM7fX0sbWluTG9jYXRpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ybzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ybztiLkEoYSl8fCh0aGlzLnJvPWE9YS5JKCksdGhpcy5nKCJtaW5Mb2NhdGlvbiIsYixhKSk7fX0sbWF4TG9jYXRpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5rbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5rbztiLkEoYSl8fCh0aGlzLmtvPWE9YS5JKCksdGhpcy5nKCJtYXhMb2NhdGlvbiIsYixhKSk7fX0sbG9jYXRpb25PYmplY3ROYW1lOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuaW87fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuaW87YiE9PWEmJih0aGlzLmlvPWEsdGhpcy5WZT1udWxsLHRoaXMucygpLHRoaXMuZygibG9jYXRpb25PYmplY3ROYW1lIixiLGEpKTt9fSxsb2NhdGlvblNwb3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5qbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5qbztiLkEoYSl8fCh0aGlzLmpvPWE9YS5JKCksdGhpcy5zKCksdGhpcy5nKCJsb2NhdGlvblNwb3QiLGIsYSkpO319LGxvY2F0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuT2Y7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPWEueCxjPWEueSxkPXRoaXMuT2YsZT1kLngsZj1kLnk7KGU9PT1ifHxpc05hTihlKSYmaXNOYU4oYikpJiYoZj09PWN8fGlzTmFOKGYpJiZpc05hTihjKSl8fChhPWEuSSgpLGI9YSx0aGlzLnpoKCk/Yj0hMToodGhpcy5PZj1iLHRoaXMuRHw9MjA5NzE1MiwhMT09PXBqKHRoaXMpJiYoZW8odGhpcyksYz10aGlzLnNhLGMubygpJiYoZT1jLmNvcHkoKSxjLmgoYy54KyhiLngtZC54KSxjLnkrKGIueS1kLnkpKSxpbyh0aGlzLHRoaXMuZGlhZ3JhbSxjLGUpLHRoaXMuZygicG9zaXRpb24iLGUsYykpKSxiPSEwKSxiJiZ0aGlzLmcoImxvY2F0aW9uIixkLGEpKTt9fSxjYXRlZ29yeTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnlmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnlmO2lmKGIhPT1hKXt2YXIgYz10aGlzLmRpYWdyYW0sZD10aGlzLmRhdGEsZT1udWxsO2lmKG51bGwhPT1jJiZudWxsIT09ZCYmISh0aGlzIGluc3RhbmNlb2YgcGYpKXt2YXIgZj1jLm1vZGVsLnVuZG9NYW5hZ2VyO2YuaXNFbmFibGVkJiYhZi5pc1VuZG9pbmdSZWRvaW5nJiYoZT10aGlzLmNsb25lKCksZS5ZLmFkZEFsbCh0aGlzLlkpKTt9dGhpcy55Zj1hO3RoaXMuZygiY2F0ZWdvcnkiLGIsYSk7bnVsbD09PWN8fG51bGw9PT1kfHx0aGlzIGluc3RhbmNlb2YgcGY/dGhpcyBpbnN0YW5jZW9mIHBmJiYoZT10aGlzLmFkb3JuZWRQYXJ0LG51bGwhPT1lJiYoYT1lLndmLG51bGwhPT1hJiZhLnJlbW92ZShiKSxlLnFoKHRoaXMuY2F0ZWdvcnksdGhpcykpKTooZj1jLm1vZGVsLGYudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8KHRoaXMuemgoKT8oYy5wYXJ0TWFuYWdlci5zZXRMaW5rQ2F0ZWdvcnlGb3JEYXRhKGQsYSksYz1jLnBhcnRNYW5hZ2VyLmZpbmRMaW5rVGVtcGxhdGVGb3JDYXRlZ29yeShhKSxudWxsIT09YyYmKFlnKGMpLGM9Yy5jb3B5KCksbnVsbCE9PWMmJmxvKHRoaXMsYyxiLGEpKSk6KG51bGwhPT1mJiZmLnBxKGQsYSksYz10byhjLnBhcnRNYW5hZ2VyLGQsYSksbnVsbCE9PWMmJihZZyhjKSxjPWMuY29weSgpLG51bGw9PT1jfHxjIGluc3RhbmNlb2YgU3x8KGQ9dGhpcy5sb2NhdGlvbi5jb3B5KCksbG8odGhpcyxjLGIsYSksdGhpcy5sb2NhdGlvbi5vKCl8fCh0aGlzLmxvY2F0aW9uPWQpKSkpLG51bGwhPT1lJiYoYj10aGlzLmNsb25lKCksYi5ZLmFkZEFsbCh0aGlzLlkpLHRoaXMuZygic2VsZiIsZSxiKSkpKTt9fX0sc2VsZjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzO30sc2V0OmZ1bmN0aW9uIHNldChhKXtsbyh0aGlzLGEsdGhpcy5jYXRlZ29yeSxhLmNhdGVnb3J5KTt9fSxjb3B5YWJsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuRCYxKTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmMSk7YiE9PWEmJih0aGlzLkRePTEsdGhpcy5nKCJjb3B5YWJsZSIsYixhKSk7fX0sZGVsZXRhYmxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5EJjIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuRCYyKTtiIT09YSYmKHRoaXMuRF49Mix0aGlzLmcoImRlbGV0YWJsZSIsYixhKSk7fX0sdGV4dEVkaXRhYmxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5EJjQpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuRCY0KTtiIT09YSYmKHRoaXMuRF49NCx0aGlzLmcoInRleHRFZGl0YWJsZSIsYixhKSx0aGlzLkpiKCkpO319LGdyb3VwYWJsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuRCY4KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmOCk7YiE9PWEmJih0aGlzLkRePTgsdGhpcy5nKCJncm91cGFibGUiLGIsYSkpO319LG1vdmFibGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLkQmMTYpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuRCYxNik7YiE9PWEmJih0aGlzLkRePTE2LHRoaXMuZygibW92YWJsZSIsYixhKSk7fX0sc2VsZWN0aW9uQWRvcm5lZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuRCYzMik7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPTAhPT0odGhpcy5EJjMyKTtiIT09YSYmKHRoaXMuRF49MzIsdGhpcy5nKCJzZWxlY3Rpb25BZG9ybmVkIixiLGEpLHRoaXMuSmIoKSk7fX0saXNJbkRvY3VtZW50Qm91bmRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5EJjY0KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmNjQpO2lmKGIhPT1hKXt0aGlzLkRePTY0O3ZhciBjPXRoaXMuZGlhZ3JhbTtudWxsIT09YyYmYy5YYSgpO3RoaXMuZygiaXNJbkRvY3VtZW50Qm91bmRzIixiLGEpO319fSxpc0xheW91dFBvc2l0aW9uZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLkQmMTI4KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmMTI4KTtiIT09YSYmKHRoaXMuRF49MTI4LHRoaXMuZygiaXNMYXlvdXRQb3NpdGlvbmVkIixiLGEpLHRoaXMuQihhPzQ6OCkpO319LHNlbGVjdGFibGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLkQmMjU2KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmMjU2KTtiIT09YSYmKHRoaXMuRF49MjU2LHRoaXMuZygic2VsZWN0YWJsZSIsYixhKSx0aGlzLkpiKCkpO319LHJlc2hhcGFibGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLkQmNTEyKTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmNTEyKTtiIT09YSYmKHRoaXMuRF49NTEyLHRoaXMuZygicmVzaGFwYWJsZSIsYixhKSx0aGlzLkpiKCkpO319LHJlc2l6YWJsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuRCYxMDI0KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmMTAyNCk7YiE9PWEmJih0aGlzLkRePTEwMjQsdGhpcy5nKCJyZXNpemFibGUiLGIsYSksdGhpcy5KYigpKTt9fSxyb3RhdGFibGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLkQmMjA0OCk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPTAhPT0odGhpcy5EJjIwNDgpO2IhPT1hJiYodGhpcy5EXj0yMDQ4LHRoaXMuZygicm90YXRhYmxlIixiLGEpLHRoaXMuSmIoKSk7fX0saXNTZWxlY3RlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuRCY0MDk2KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmNDA5Nik7aWYoYiE9PWEpe3ZhciBjPXRoaXMuZGlhZ3JhbTtpZighYXx8dGhpcy5jYW5TZWxlY3QoKSYmIShudWxsIT09YyYmYy5zZWxlY3Rpb24uY291bnQ+PWMubWF4U2VsZWN0aW9uQ291bnQpKXt0aGlzLkRePTQwOTY7dmFyIGQ9ITE7aWYobnVsbCE9PWMpe2Q9Yy5za2lwc1VuZG9NYW5hZ2VyO2Muc2tpcHNVbmRvTWFuYWdlcj0hMDt2YXIgZT1jLnNlbGVjdGlvbjtlLmhhKCk7YT9lLmFkZCh0aGlzKTplLnJlbW92ZSh0aGlzKTtlLmZyZWV6ZSgpO310aGlzLmcoImlzU2VsZWN0ZWQiLGIsYSk7dGhpcy5KYigpO2E9dGhpcy5zZWxlY3Rpb25DaGFuZ2VkO251bGwhPT1hJiZhKHRoaXMpO251bGwhPT1jJiYoYy5jYygpLGMuc2tpcHNVbmRvTWFuYWdlcj1kKTt9fX19LGlzSGlnaGxpZ2h0ZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLkQmNTI0Mjg4KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmNTI0Mjg4KTtpZihiIT09YSl7dGhpcy5EXj01MjQyODg7dmFyIGM9dGhpcy5kaWFncmFtO251bGwhPT1jJiYoYz1jLmhpZ2hsaWdodGVkcyxjLmhhKCksYT9jLmFkZCh0aGlzKTpjLnJlbW92ZSh0aGlzKSxjLmZyZWV6ZSgpKTt0aGlzLmcoImlzSGlnaGxpZ2h0ZWQiLGIsYSk7dGhpcy5SKCk7YT10aGlzLmhpZ2hsaWdodGVkQ2hhbmdlZDtudWxsIT09YSYmYSh0aGlzKTt9fX0saXNTaGFkb3dlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuRCY4MTkyKTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLkQmODE5Mik7YiE9PWEmJih0aGlzLkRePTgxOTIsdGhpcy5nKCJpc1NoYWRvd2VkIixiLGEpLHRoaXMuUigpKTt9fSxpc0FuaW1hdGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5EJjI2MjE0NCk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPTAhPT0odGhpcy5EJjI2MjE0NCk7YiE9PWEmJih0aGlzLkRePTI2MjE0NCx0aGlzLmcoImlzQW5pbWF0ZWQiLGIsYSkpO319LGhpZ2hsaWdodGVkQ2hhbmdlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk5uO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLk5uO2IhPT1hJiYodGhpcy5Obj1hLHRoaXMuZygiaGlnaGxpZ2h0ZWRDaGFuZ2VkIixiLGEpKTt9fSxzZWxlY3Rpb25PYmplY3ROYW1lOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuanA7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuanA7YiE9PWEmJih0aGlzLmpwPWEsdGhpcy5kaD1udWxsLHRoaXMuZygic2VsZWN0aW9uT2JqZWN0TmFtZSIsYixhKSk7fX0sc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ocDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ocDtiIT09YSYmKHRoaXMuaHA9YSx0aGlzLmcoInNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlIixiLGEpKTt9fSxzZWxlY3Rpb25PYmplY3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtpZihudWxsPT09dGhpcy5kaCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25PYmplY3ROYW1lO251bGwhPT1hJiYiIiE9PWE/KGE9dGhpcy4kYShhKSxudWxsIT09YT90aGlzLmRoPWE6dGhpcy5kaD10aGlzKTp0aGlzIGluc3RhbmNlb2YgUz8oYT10aGlzLnBhdGgsbnVsbCE9PWE/dGhpcy5kaD1hOnRoaXMuZGg9dGhpcyk6dGhpcy5kaD10aGlzO31yZXR1cm4gdGhpcy5kaDt9fSxzZWxlY3Rpb25DaGFuZ2VkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuaXA7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuaXA7YiE9PWEmJih0aGlzLmlwPWEsdGhpcy5nKCJzZWxlY3Rpb25DaGFuZ2VkIixiLGEpKTt9fSxyZXNpemVBZG9ybm1lbnRUZW1wbGF0ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlRvO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlRvO2IhPT1hJiYodGhpcy5Ubz1hLHRoaXMuZygicmVzaXplQWRvcm5tZW50VGVtcGxhdGUiLGIsYSkpO319LHJlc2l6ZU9iamVjdE5hbWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Wbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5WbztiIT09YSYmKHRoaXMuVm89YSx0aGlzLmcoInJlc2l6ZU9iamVjdE5hbWUiLGIsYSkpO319LHJlc2l6ZU9iamVjdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMucmVzaXplT2JqZWN0TmFtZTtyZXR1cm4iIiE9PWEmJihhPXRoaXMuJGEoYSksbnVsbCE9PWEpP2E6dGhpczt9fSxyZXNpemVDZWxsU2l6ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlVvO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlVvO2IuQShhKXx8KHRoaXMuVW89YT1hLkkoKSx0aGlzLmcoInJlc2l6ZUNlbGxTaXplIixiLGEpKTt9fSxyb3RhdGVBZG9ybm1lbnRUZW1wbGF0ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLldvO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLldvO2IhPT1hJiYodGhpcy5Xbz1hLHRoaXMuZygicm90YXRlQWRvcm5tZW50VGVtcGxhdGUiLGIsYSkpO319LHJvdGF0ZU9iamVjdE5hbWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Ybzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5YbztiIT09YSYmKHRoaXMuWG89YSx0aGlzLmcoInJvdGF0ZU9iamVjdE5hbWUiLGIsYSkpO319LHJvdGF0ZU9iamVjdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMucm90YXRlT2JqZWN0TmFtZTtyZXR1cm4iIiE9PWEmJihhPXRoaXMuJGEoYSksbnVsbCE9PWEpP2E6dGhpczt9fSxyb3RhdGlvblNwb3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Zbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ZbztiLkEoYSl8fCh0aGlzLllvPWE9YS5JKCksdGhpcy5nKCJyb3RhdGlvblNwb3QiLGIsYSkpO319LHRleHQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5QYjtiIT09YSYmKHRoaXMuUGI9YSx0aGlzLmcoInRleHQiLGIsYSkpO319LGNvbnRhaW5pbmdHcm91cDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlJoO30sc2V0OmZ1bmN0aW9uIHNldChhKXtpZih0aGlzLkxiKCkpe3ZhciBiPXRoaXMuUmg7aWYoYiE9PWEpe251bGw9PT1hfHx0aGlzIT09YSYmIWEuVmQodGhpcyl8fCh0aGlzPT09YSYmQSgiQ2Fubm90IG1ha2UgYSBHcm91cCBhIG1lbWJlciBvZiBpdHNlbGY6ICIrdGhpcy50b1N0cmluZygpKSxBKCJDYW5ub3QgbWFrZSBhIEdyb3VwIGluZGlyZWN0bHkgY29udGFpbiBpdHNlbGY6ICIrdGhpcy50b1N0cmluZygpKyIgYWxyZWFkeSBjb250YWlucyAiK2EudG9TdHJpbmcoKSkpO3RoaXMuQigyKTt2YXIgYz10aGlzLmRpYWdyYW07bnVsbCE9PWI/cG8oYix0aGlzKTp0aGlzIGluc3RhbmNlb2YgaWcmJm51bGwhPT1jJiZjLnhpLnJlbW92ZSh0aGlzKTt0aGlzLlJoPWE7bnVsbCE9PWE/b28oYSx0aGlzKTp0aGlzIGluc3RhbmNlb2YgaWcmJm51bGwhPT1jJiZjLnhpLmFkZCh0aGlzKTt0aGlzLkIoMSk7aWYobnVsbCE9PWMpe3ZhciBkPXRoaXMuZGF0YSxlPWMubW9kZWw7aWYobnVsbCE9PWQmJmUuZGsoKSl7dmFyIGY9ZS5wYShudWxsIT09YT9hLmRhdGE6bnVsbCk7ZS51dChkLGYpO319ZD10aGlzLmNvbnRhaW5pbmdHcm91cENoYW5nZWQ7bnVsbCE9PWQmJihlPSEwLG51bGwhPT1jJiYoZT1jLmRhLGMuZGE9ITApLGQodGhpcyxiLGEpLG51bGwhPT1jJiYoYy5kYT1lKSk7aWYodGhpcyBpbnN0YW5jZW9mIGlnKWZvcihjPW5ldyBGKCksSWsoYyx0aGlzLCEwLDAsITApLGM9Yy5pdGVyYXRvcjtjLm5leHQoKTspe2lmKGQ9Yy52YWx1ZSxkIGluc3RhbmNlb2YgVilmb3IoZD1kLmxpbmtzQ29ubmVjdGVkO2QubmV4dCgpOyl7dW8oZC52YWx1ZSk7fX1pZih0aGlzIGluc3RhbmNlb2YgVil7Zm9yKGM9dGhpcy5saW5rc0Nvbm5lY3RlZDtjLm5leHQoKTspe3VvKGMudmFsdWUpO31jPXRoaXMubGFiZWxlZExpbms7bnVsbCE9PWMmJnVvKGMpO310aGlzLmcoImNvbnRhaW5pbmdHcm91cCIsYixhKTtudWxsIT09YSYmKGI9YS5sYXllcixudWxsIT09YiYma2koYiwtMSxhKSk7fX1lbHNlIEEoImNhbm5vdCBzZXQgdGhlIFBhcnQuY29udGFpbmluZ0dyb3VwIG9mIGEgTGluayBvciBBZG9ybm1lbnQiKTt9fSxjb250YWluaW5nR3JvdXBDaGFuZ2VkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuJG07fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuJG07YiE9PWEmJih0aGlzLiRtPWEsdGhpcy5nKCJjb250YWluaW5nR3JvdXBDaGFuZ2VkIixiLGEpKTt9fSxpc1RvcExldmVsOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLmNvbnRhaW5pbmdHcm91cHx8dGhpcyBpbnN0YW5jZW9mIFYmJm51bGwhPT10aGlzLmxhYmVsZWRMaW5rPyExOiEwO319LGxheW91dENvbmRpdGlvbnM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ibzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ibztiIT09YSYmKHRoaXMuYm89YSx0aGlzLmcoImxheW91dENvbmRpdGlvbnMiLGIsYSkpO319LGRyYWdDb21wdXRhdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnduO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnduO2IhPT1hJiYodGhpcy53bj1hLHRoaXMuZygiZHJhZ0NvbXB1dGF0aW9uIixiLGEpKTt9fSxzaGFkb3dPZmZzZXQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5zaTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5zaTtiLkEoYSl8fCh0aGlzLnNpPWE9YS5JKCksdGhpcy5SKCksdGhpcy5nKCJzaGFkb3dPZmZzZXQiLGIsYSkpO319LHNoYWRvd0NvbG9yOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSWo7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuSWo7YiE9PWEmJih0aGlzLklqPWEsdGhpcy5SKCksdGhpcy5nKCJzaGFkb3dDb2xvciIsYixhKSk7fX0sc2hhZG93Qmx1cjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk9kO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLk9kO2IhPT1hJiYodGhpcy5PZD1hLHRoaXMuUigpLHRoaXMuZygic2hhZG93Qmx1ciIsYixhKSk7fX19KTtULnByb3RvdHlwZS5pbnZhbGlkYXRlTGF5b3V0PVQucHJvdG90eXBlLkI7VC5wcm90b3R5cGUuZmluZENvbW1vbkNvbnRhaW5pbmdHcm91cD1ULnByb3RvdHlwZS5oeDtULnByb3RvdHlwZS5pc01lbWJlck9mPVQucHJvdG90eXBlLlZkO1QucHJvdG90eXBlLmZpbmRUb3BMZXZlbFBhcnQ9VC5wcm90b3R5cGUuVnk7VC5wcm90b3R5cGUuZmluZFN1YkdyYXBoTGV2ZWw9VC5wcm90b3R5cGUuU3k7VC5wcm90b3R5cGUuZW5zdXJlQm91bmRzPVQucHJvdG90eXBlLmFjO1QucHJvdG90eXBlLmdldERvY3VtZW50Qm91bmRzPVQucHJvdG90eXBlLlZwO1QucHJvdG90eXBlLmdldFJlbGF0aXZlUG9pbnQ9VC5wcm90b3R5cGUubmY7VC5wcm90b3R5cGUuZmluZE9iamVjdD1ULnByb3RvdHlwZS4kYTtULnByb3RvdHlwZS5tb3ZlVG89VC5wcm90b3R5cGUubW92ZVRvO1QucHJvdG90eXBlLmludmFsaWRhdGVBZG9ybm1lbnRzPVQucHJvdG90eXBlLkpiO1QucHJvdG90eXBlLmNsZWFyQWRvcm5tZW50cz1ULnByb3RvdHlwZS5TajtULnByb3RvdHlwZS5yZW1vdmVBZG9ybm1lbnQ9VC5wcm90b3R5cGUudGY7VC5wcm90b3R5cGUuYWRkQWRvcm5tZW50PVQucHJvdG90eXBlLnFoO1QucHJvdG90eXBlLmZpbmRBZG9ybm1lbnQ9VC5wcm90b3R5cGUuJGo7VC5wcm90b3R5cGUudXBkYXRlVGFyZ2V0QmluZGluZ3M9VC5wcm90b3R5cGUuRWE7dmFyIG1vPSExO1QuY2xhc3NOYW1lPSJQYXJ0IjtULkxheW91dE5vbmU9MDtULkxheW91dEFkZGVkPTE7VC5MYXlvdXRSZW1vdmVkPTI7VC5MYXlvdXRTaG93bj00O1QuTGF5b3V0SGlkZGVuPTg7VC5MYXlvdXROb2RlU2l6ZWQ9MTY7VC5MYXlvdXRHcm91cExheW91dD0zMjtULkxheW91dE5vZGVSZXBsYWNlZD02NDtULkxheW91dFN0YW5kYXJkPTEyNztULkxheW91dEFsbD0xNjc3NzIxNTtmdW5jdGlvbiBwZihhKXtULmNhbGwodGhpcyxhKTt0aGlzLkQmPS0yNTc7dGhpcy5SZz0iQWRvcm5tZW50Ijt0aGlzLiRkPW51bGw7dGhpcy5Fdz0wO3RoaXMuUHc9ITE7dGhpcy5sPVtdO3RoaXMuVmE9bnVsbDt9b2EocGYsVCk7cGYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hZG9ybmVkUGFydDtyZXR1cm4iQWRvcm5tZW50KCIrdGhpcy5jYXRlZ29yeSsiKSIrKG51bGwhPT1hP2EudG9TdHJpbmcoKToiIik7fTtwZi5wcm90b3R5cGUudXBkYXRlUmVsYXRpb25zaGlwc0Zyb21EYXRhPWZ1bmN0aW9uKCl7fTtwZi5wcm90b3R5cGUuZ2s9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hZG9ybmVkT2JqZWN0LnBhcnQ7aWYoYiBpbnN0YW5jZW9mIFMmJnRoaXMuYWRvcm5lZE9iamVjdCBpbnN0YW5jZW9mIFcpe3ZhciBjPWIucGF0aDtiLmdrKGEpO2E9Yy5nZW9tZXRyeTtiPXRoaXMuWS5qO2M9Yi5sZW5ndGg7Zm9yKHZhciBkPTA7ZDxjO2QrKyl7dmFyIGU9YltkXTtlLmlzUGFuZWxNYWluJiZlIGluc3RhbmNlb2YgVyYmKGUucWE9YSk7fX19O3BmLnByb3RvdHlwZS5QaT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJGQ7aWYobnVsbD09PWEpcmV0dXJuITA7YT1hLnBhcnQ7cmV0dXJuIG51bGw9PT1hfHwhcGooYSk7fTtwZi5wcm90b3R5cGUuTGI9ZnVuY3Rpb24oKXtyZXR1cm4hMTt9O3BmLnByb3RvdHlwZS5uaz1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXtpZihhPT09Y2YmJiJlbGVtZW50cyI9PT1iKXtpZihlIGluc3RhbmNlb2YgWGcpbnVsbD09PXRoaXMuVmEmJih0aGlzLlZhPWUpO2Vsc2V7aWYoZSBpbnN0YW5jZW9mIFgpe3ZhciBoPWUuWWwoZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBYZzt9KTtoIGluc3RhbmNlb2YgWGcmJm51bGw9PT10aGlzLlZhJiYodGhpcy5WYT1oKTt9fX1lbHNlIGE9PT1kZiYmImVsZW1lbnRzIj09PWImJm51bGwhPT10aGlzLlZhJiYoZD09PXRoaXMuVmE/dGhpcy5WYT1udWxsOmQgaW5zdGFuY2VvZiBYJiZ0aGlzLlZhLnFnKGQpJiYodGhpcy5WYT1udWxsKSk7VC5wcm90b3R5cGUubmsuY2FsbCh0aGlzLGEsYixjLGQsZSxmLGcpO307cGYucHJvdG90eXBlLnVwZGF0ZUFkb3JubWVudHM9ZnVuY3Rpb24oKXt9O3BmLnByb3RvdHlwZS5Zaj1mdW5jdGlvbigpe307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGYucHJvdG90eXBlLHtwbGFjZWhvbGRlcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlZhO319LGFkb3JuZWRPYmplY3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy4kZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5hZG9ybmVkUGFydCxjPW51bGw7bnVsbCE9PWEmJihjPWEucGFydCk7bnVsbD09PWJ8fG51bGwhPT1hJiZiPT09Y3x8Yi50Zih0aGlzLmNhdGVnb3J5KTt0aGlzLiRkPWE7bnVsbCE9PWMmJmMucWgodGhpcy5jYXRlZ29yeSx0aGlzKTt9fSxhZG9ybmVkUGFydDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMuJGQ7cmV0dXJuIG51bGwhPT1hP2EucGFydDpudWxsO319LGNvbnRhaW5pbmdHcm91cDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsO319fSk7cGYuY2xhc3NOYW1lPSJBZG9ybm1lbnQiO2Z1bmN0aW9uIFYoYSl7VC5jYWxsKHRoaXMsYSk7dGhpcy5TPTEzO3RoaXMuWWE9bmV3IEUoKTt0aGlzLkNwPXRoaXMuaGw9dGhpcy5paT10aGlzLmVvPXRoaXMuY289bnVsbDt0aGlzLkNrPVBjO3RoaXMucmM9dGhpcy5MZT1udWxsO3RoaXMuUW89dm87dGhpcy5vaD0hMTt9b2EoVixUKTtWLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZD1mdW5jdGlvbihhKXtULnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZC5jYWxsKHRoaXMsYSk7YS5TPXRoaXMuUzthLlM9dGhpcy5TJi0xNzthLmNvPXRoaXMuY287YS5lbz10aGlzLmVvO2EuaWk9dGhpcy5paTthLkNwPXRoaXMuQ3A7YS5Daz10aGlzLkNrLkkoKTthLlFvPXRoaXMuUW87fTt0PVYucHJvdG90eXBlO3QubWY9ZnVuY3Rpb24oYSl7VC5wcm90b3R5cGUubWYuY2FsbCh0aGlzLGEpO2EuZWQoKTthLkxlPXRoaXMuTGU7YS5yYz1udWxsO307ZnVuY3Rpb24gd28oYSxiKXtudWxsIT09YiYmKG51bGw9PT1hLkxlJiYoYS5MZT1uZXcgRigpKSxhLkxlLmFkZChiKSk7fWZ1bmN0aW9uIHhvKGEsYixjLGQpe2lmKG51bGw9PT1ifHxudWxsPT09YS5MZSlyZXR1cm4gbnVsbDtmb3IodmFyIGU9YS5MZS5pdGVyYXRvcjtlLm5leHQoKTspe3ZhciBmPWUudmFsdWU7aWYoZi5qdD09PWEmJmYub3Y9PT1iJiZmLnh4PT09YyYmZi55eD09PWR8fGYuanQ9PT1iJiZmLm92PT09YSYmZi54eD09PWQmJmYueXg9PT1jKXJldHVybiBmO31yZXR1cm4gbnVsbDt9dC5xej1mdW5jdGlvbihhLGIsYyl7aWYodm9pZCAwPT09Ynx8bnVsbD09PWIpYj0iIjtpZih2b2lkIDA9PT1jfHxudWxsPT09YyljPSIiO2E9eG8odGhpcyxhLGIsYyk7bnVsbCE9PWEmJmEuY20oKTt9O3Qubms9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7YT09PWNmJiYiZWxlbWVudHMiPT09Yj90aGlzLnJjPW51bGw6YT09PWRmJiYiZWxlbWVudHMiPT09YiYmKHRoaXMucmM9bnVsbCk7VC5wcm90b3R5cGUubmsuY2FsbCh0aGlzLGEsYixjLGQsZSxmLGcpO307dC5lZD1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTtmb3IodmFyIGI9dGhpcy5saW5rc0Nvbm5lY3RlZDtiLm5leHQoKTspe3ZhciBjPWIudmFsdWU7bnVsbCE9PWEmJmEuY29udGFpbnMoYyl8fCh5byh0aGlzLGMuZnJvbVBvcnQpLHlvKHRoaXMsYy50b1BvcnQpLGMuUmEoKSk7fX07ZnVuY3Rpb24gZmwoYSxiKXtmb3IodmFyIGM9YS5saW5rc0Nvbm5lY3RlZDtjLm5leHQoKTspe3ZhciBkPWMudmFsdWU7aWYoZC5mcm9tUG9ydD09PWJ8fGQudG9Qb3J0PT09Yil5byhhLGQuZnJvbVBvcnQpLHlvKGEsZC50b1BvcnQpLGQuUmEoKTt9fWZ1bmN0aW9uIHlvKGEsYil7bnVsbCE9PWImJihiPWIuUG8sbnVsbCE9PWImJmIuY20oKSxhPWEuY29udGFpbmluZ0dyb3VwLG51bGw9PT1hfHxhLmlzU3ViR3JhcGhFeHBhbmRlZHx8eW8oYSxhLnBvcnQpKTt9dC5QaT1mdW5jdGlvbigpe3JldHVybiEwO307Vi5wcm90b3R5cGUuZ2V0QXZvaWRhYmxlUmVjdD1mdW5jdGlvbihhKXthLnNldCh0aGlzLmFjdHVhbEJvdW5kcyk7YS5McCh0aGlzLkNrKTtyZXR1cm4gYTt9O1YucHJvdG90eXBlLmZpbmRWaXNpYmxlTm9kZT1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzO251bGwhPT1hJiYhYS5pc1Zpc2libGUoKTspe2E9YS5jb250YWluaW5nR3JvdXA7fXJldHVybiBhO307Vi5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKCl7aWYoIVQucHJvdG90eXBlLmlzVmlzaWJsZS5jYWxsKHRoaXMpKXJldHVybiExO3ZhciBhPSEwLGI9cmksYz10aGlzLmRpYWdyYW07aWYobnVsbCE9PWMpe2lmKFhoKGMuYW5pbWF0aW9uTWFuYWdlcix0aGlzKSlyZXR1cm4hMDthPWMuaXNUcmVlUGF0aFRvQ2hpbGRyZW47Yj1jLnRyZWVDb2xsYXBzZVBvbGljeTt9aWYoYj09PXJpKXtpZihhPXRoaXMub2coKSxudWxsIT09YSYmIWEuaXNUcmVlRXhwYW5kZWQpcmV0dXJuITE7fWVsc2UgaWYoYj09PXdrKXtpZihhPWE/dGhpcy5ZdSgpOnRoaXMuWnUoKSwwPGEuY291bnQmJmEuYWxsKGZ1bmN0aW9uKGEpe3JldHVybiFhLmlzVHJlZUV4cGFuZGVkO30pKXJldHVybiExO31lbHNlIGlmKGI9PT14ayYmKGE9YT90aGlzLll1KCk6dGhpcy5adSgpLDA8YS5jb3VudCYmYS5hbnkoZnVuY3Rpb24oYSl7cmV0dXJuIWEuaXNUcmVlRXhwYW5kZWQ7fSkpKXJldHVybiExO2E9dGhpcy5sYWJlbGVkTGluaztyZXR1cm4gbnVsbCE9PWE/YS5pc1Zpc2libGUoKTohMDt9O3Q9Vi5wcm90b3R5cGU7dC5NYj1mdW5jdGlvbihhKXtULnByb3RvdHlwZS5NYi5jYWxsKHRoaXMsYSk7Zm9yKHZhciBiPXRoaXMubGlua3NDb25uZWN0ZWQ7Yi5uZXh0KCk7KXtiLnZhbHVlLk1iKGEpO319O3QuV3U9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9bnVsbCk7aWYobnVsbD09PWEpcmV0dXJuIHRoaXMuWWEuaXRlcmF0b3I7dmFyIGI9bmV3IHpiKHRoaXMuWWEpLGM9dGhpcztiLnByZWRpY2F0ZT1mdW5jdGlvbihiKXtyZXR1cm4gYi5mcm9tTm9kZT09PWMmJmIuZnJvbVBvcnRJZD09PWF8fGIudG9Ob2RlPT09YyYmYi50b1BvcnRJZD09PWE7fTtyZXR1cm4gYjt9O3QuU3A9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9bnVsbCk7dmFyIGI9bmV3IHpiKHRoaXMuWWEpLGM9dGhpcztiLnByZWRpY2F0ZT1mdW5jdGlvbihiKXtyZXR1cm4gYi5mcm9tTm9kZSE9PWM/ITE6bnVsbD09PWE/ITA6Yi5mcm9tUG9ydElkPT09YTt9O3JldHVybiBiO307dC5zZD1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTt2YXIgYj1uZXcgemIodGhpcy5ZYSksYz10aGlzO2IucHJlZGljYXRlPWZ1bmN0aW9uKGIpe3JldHVybiBiLnRvTm9kZSE9PWM/ITE6bnVsbD09PWE/ITA6Yi50b1BvcnRJZD09PWE7fTtyZXR1cm4gYjt9O3QuWHU9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9bnVsbCk7Zm9yKHZhciBiPW51bGwsYz1udWxsLGQ9dGhpcy5ZYS5pdGVyYXRvcjtkLm5leHQoKTspe3ZhciBlPWQudmFsdWU7aWYoZS5mcm9tTm9kZT09PXRoaXMpe2lmKG51bGw9PT1hfHxlLmZyb21Qb3J0SWQ9PT1hKWU9ZS50b05vZGUsbnVsbCE9PWI/Yi5hZGQoZSk6bnVsbCE9PWMmJmMhPT1lPyhiPW5ldyBGKCksYi5hZGQoYyksYi5hZGQoZSkpOmM9ZTt9ZWxzZSBlLnRvTm9kZSE9PXRoaXN8fG51bGwhPT1hJiZlLnRvUG9ydElkIT09YXx8KGU9ZS5mcm9tTm9kZSxudWxsIT09Yj9iLmFkZChlKTpudWxsIT09YyYmYyE9PWU/KGI9bmV3IEYoKSxiLmFkZChjKSxiLmFkZChlKSk6Yz1lKTt9cmV0dXJuIG51bGwhPT1iP2IuaXRlcmF0b3I6bnVsbCE9PWM/bmV3IHliKGMpOnhiO307dC5adT1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTtmb3IodmFyIGI9bnVsbCxjPW51bGwsZD10aGlzLllhLml0ZXJhdG9yO2QubmV4dCgpOyl7dmFyIGU9ZC52YWx1ZTtlLmZyb21Ob2RlIT09dGhpc3x8bnVsbCE9PWEmJmUuZnJvbVBvcnRJZCE9PWF8fChlPWUudG9Ob2RlLG51bGwhPT1iP2IuYWRkKGUpOm51bGwhPT1jJiZjIT09ZT8oYj1uZXcgRigpLGIuYWRkKGMpLGIuYWRkKGUpKTpjPWUpO31yZXR1cm4gbnVsbCE9PWI/Yi5pdGVyYXRvcjpudWxsIT09Yz9uZXcgeWIoYyk6eGI7fTt0Lll1PWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO2Zvcih2YXIgYj1udWxsLGM9bnVsbCxkPXRoaXMuWWEuaXRlcmF0b3I7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlO2UudG9Ob2RlIT09dGhpc3x8bnVsbCE9PWEmJmUudG9Qb3J0SWQhPT1hfHwoZT1lLmZyb21Ob2RlLG51bGwhPT1iP2IuYWRkKGUpOm51bGwhPT1jJiZjIT09ZT8oYj1uZXcgRigpLGIuYWRkKGMpLGIuYWRkKGUpKTpjPWUpO31yZXR1cm4gbnVsbCE9PWI/Yi5pdGVyYXRvcjpudWxsIT09Yz9uZXcgeWIoYyk6eGI7fTt0Lk55PWZ1bmN0aW9uKGEsYixjKXt2b2lkIDA9PT1iJiYoYj1udWxsKTt2b2lkIDA9PT1jJiYoYz1udWxsKTt2YXIgZD1uZXcgemIodGhpcy5ZYSksZT10aGlzO2QucHJlZGljYXRlPWZ1bmN0aW9uKGQpe3JldHVybihkLmZyb21Ob2RlIT09ZXx8ZC50b05vZGUhPT1hfHxudWxsIT09YiYmZC5mcm9tUG9ydElkIT09Ynx8bnVsbCE9PWMmJmQudG9Qb3J0SWQhPT1jKSYmKGQuZnJvbU5vZGUhPT1hfHxkLnRvTm9kZSE9PWV8fG51bGwhPT1jJiZkLmZyb21Qb3J0SWQhPT1jfHxudWxsIT09YiYmZC50b1BvcnRJZCE9PWIpPyExOiEwO307cmV0dXJuIGQ7fTt0Lk95PWZ1bmN0aW9uKGEsYixjKXt2b2lkIDA9PT1iJiYoYj1udWxsKTt2b2lkIDA9PT1jJiYoYz1udWxsKTt2YXIgZD1uZXcgemIodGhpcy5ZYSksZT10aGlzO2QucHJlZGljYXRlPWZ1bmN0aW9uKGQpe3JldHVybiBkLmZyb21Ob2RlIT09ZXx8ZC50b05vZGUhPT1hfHxudWxsIT09YiYmZC5mcm9tUG9ydElkIT09Ynx8bnVsbCE9PWMmJmQudG9Qb3J0SWQhPT1jPyExOiEwO307cmV0dXJuIGQ7fTtmdW5jdGlvbiB6byhhLGIsYyl7eW8oYSxjKTt2YXIgZD1hLllhLmNvbnRhaW5zKGIpO2R8fGEuWWEuYWRkKGIpO2lmKCFkfHxiLmZyb21Ob2RlPT09Yi50b05vZGUpe3ZhciBlPWEubGlua0Nvbm5lY3RlZDtpZihudWxsIT09ZSl7dmFyIGY9ITAsZz1hLmRpYWdyYW07bnVsbCE9PWcmJihmPWcuZGEsZy5kYT0hMCk7ZShhLGIsYyk7bnVsbCE9PWcmJihnLmRhPWYpO319IWQmJmIuaXNUcmVlTGluayYmKGM9Yi5mcm9tTm9kZSxiPWIudG9Ob2RlLG51bGwhPT1jJiZudWxsIT09YiYmYyE9PWImJihkPSEwLGE9YS5kaWFncmFtLG51bGwhPT1hJiYoZD1hLmlzVHJlZVBhdGhUb0NoaWxkcmVuKSxlPWQ/YjpjLGY9ZD9jOmIsZS5vaHx8KGUub2g9ZiksIWYuaXNUcmVlTGVhZnx8bnVsbCE9PWEmJmEudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8KGQ/Yz09PWYmJihmLmlzVHJlZUxlYWY9ITEpOmI9PT1mJiYoZi5pc1RyZWVMZWFmPSExKSkpKTt9ZnVuY3Rpb24gQW8oYSxiLGMpe3lvKGEsYyk7dmFyIGQ9YS5ZYS5yZW1vdmUoYiksZT1udWxsO2lmKGR8fGIudG9Ob2RlPT09Yi5mcm9tTm9kZSl7dmFyIGY9YS5saW5rRGlzY29ubmVjdGVkO2U9YS5kaWFncmFtO2lmKG51bGwhPT1mKXt2YXIgZz0hMDtudWxsIT09ZSYmKGc9ZS5kYSxlLmRhPSEwKTtmKGEsYixjKTtudWxsIT09ZSYmKGUuZGE9Zyk7fX1kJiZiLmlzVHJlZUxpbmsmJihjPSEwLG51bGwhPT1lJiYoYz1lLmlzVHJlZVBhdGhUb0NoaWxkcmVuKSxhPWM/Yi50b05vZGU6Yi5mcm9tTm9kZSxiPWM/Yi5mcm9tTm9kZTpiLnRvTm9kZSxudWxsIT09YSYmKGEub2g9ITEpLG51bGw9PT1ifHxiLmlzVHJlZUxlYWZ8fCgwPT09Yi5ZYS5jb3VudD8oYi5vaD1udWxsLG51bGwhPT1lJiZlLnVuZG9NYW5hZ2VyLmlzVW5kb2luZ1JlZG9pbmd8fChiLmlzVHJlZUxlYWY9ITApKTp2ayhiKSkpO31mdW5jdGlvbiB2ayhhKXthLm9oPSExO2lmKDAhPT1hLllhLmNvdW50KXt2YXIgYj0hMCxjPWEuZGlhZ3JhbTtpZihudWxsPT09Y3x8IWMudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZyl7bnVsbCE9PWMmJihiPWMuaXNUcmVlUGF0aFRvQ2hpbGRyZW4pO2ZvcihjPWEuWWEuaXRlcmF0b3I7Yy5uZXh0KCk7KXt2YXIgZD1jLnZhbHVlO2lmKGQuaXNUcmVlTGluaylpZihiKXtpZihkLmZyb21Ob2RlPT09YSl7YS5pc1RyZWVMZWFmPSExO3JldHVybjt9fWVsc2UgaWYoZC50b05vZGU9PT1hKXthLmlzVHJlZUxlYWY9ITE7cmV0dXJuO319YS5pc1RyZWVMZWFmPSEwO319fVYucHJvdG90eXBlLnVwZGF0ZVJlbGF0aW9uc2hpcHNGcm9tRGF0YT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtudWxsIT09YSYmYS5wYXJ0TWFuYWdlci51cGRhdGVSZWxhdGlvbnNoaXBzRnJvbURhdGEodGhpcyk7fTt0PVYucHJvdG90eXBlO3QuWXA9ZnVuY3Rpb24oYSl7VC5wcm90b3R5cGUuWXAuY2FsbCh0aGlzLGEpO2F8fCh2ayh0aGlzKSxhPXRoaXMuaGwsbnVsbCE9PWEmJkJvKGEsdGhpcykpO307dC5acD1mdW5jdGlvbihhKXtULnByb3RvdHlwZS5acC5jYWxsKHRoaXMsYSk7YXx8KGE9dGhpcy5obCxudWxsIT09YSYmbnVsbCE9PWEuJGMmJihhLiRjLnJlbW92ZSh0aGlzKSxhLnMoKSkpO307dC5Zaj1mdW5jdGlvbigpe2lmKDA8dGhpcy5ZYS5jb3VudCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKG51bGwhPT1hKWZvcih2YXIgYj1udWxsIT09YS5jb21tYW5kSGFuZGxlcj9hLmNvbW1hbmRIYW5kbGVyLmRlbGV0ZXNDb25uZWN0ZWRMaW5rczohMCxjPXRoaXMuWWEuY29weSgpLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGQ9Yy52YWx1ZTtiP2EucmVtb3ZlKGQpOihkLmZyb21Ob2RlPT09dGhpcyYmKGQuZnJvbU5vZGU9bnVsbCksZC50b05vZGU9PT10aGlzJiYoZC50b05vZGU9bnVsbCkpO319dGhpcy5sYWJlbGVkTGluaz1udWxsO1QucHJvdG90eXBlLllqLmNhbGwodGhpcyk7fTt0LlRzPWZ1bmN0aW9uKGEpe2lmKG51bGw9PT10aGlzLnJjKXtpZigiIj09PWEmJiExPT09dGhpcy54aClyZXR1cm4gdGhpcztDbyh0aGlzKTt9dmFyIGI9dGhpcy5yYy5KKGEpO3JldHVybiBudWxsIT09Ynx8IiIhPT1hJiYoYj10aGlzLnJjLkooIiIpLG51bGwhPT1iKT9iOnRoaXM7fTtmdW5jdGlvbiBDbyhhKXtudWxsPT09YS5yYz9hLnJjPW5ldyBMYigpOmEucmMuY2xlYXIoKTthLnltKGEsZnVuY3Rpb24oYSxjKXtJbChhLGMpO30pOzA9PT1hLnJjLmNvdW50JiZhLnJjLmFkZCgiIixhKTt9ZnVuY3Rpb24gSWwoYSxiKXt2YXIgYz1iLnBvcnRJZDtudWxsIT09YyYmbnVsbCE9PWEucmMmJmEucmMuYWRkKGMsYik7fWZ1bmN0aW9uIEhsKGEsYixjKXt2YXIgZD1iLnBvcnRJZDtpZihudWxsIT09ZCYmKG51bGwhPT1hLnJjJiZhLnJjLnJlbW92ZShkKSxiPWEuZGlhZ3JhbSxudWxsIT09YiYmYykpe2M9bnVsbDtmb3IoYT1hLld1KGQpO2EubmV4dCgpOyl7ZD1hLnZhbHVlLG51bGw9PT1jJiYoYz1LYSgpKSxjLnB1c2goZCk7fWlmKG51bGwhPT1jKXtmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKXtiLnJlbW92ZShjW2FdKTt9T2EoYyk7fX19dC5zej1mdW5jdGlvbihhKXtpZihudWxsPT09YXx8YT09PXRoaXMpcmV0dXJuITE7dmFyIGI9ITAsYz10aGlzLmRpYWdyYW07bnVsbCE9PWMmJihiPWMuaXNUcmVlUGF0aFRvQ2hpbGRyZW4pO2M9dGhpcztpZihiKWZvcig7YyE9PWE7KXtiPW51bGw7Zm9yKHZhciBkPWMuWWEuaXRlcmF0b3I7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlO2lmKGUuaXNUcmVlTGluayYmKGI9ZS5mcm9tTm9kZSxiIT09YyYmYiE9PXRoaXMpKWJyZWFrO31pZihiPT09dGhpc3x8bnVsbD09PWJ8fGI9PT1jKXJldHVybiExO2M9Yjt9ZWxzZSBmb3IoO2MhPT1hOyl7Yj1udWxsO2ZvcihkPWMuWWEuaXRlcmF0b3I7ZC5uZXh0KCkmJihlPWQudmFsdWUsIWUuaXNUcmVlTGlua3x8KGI9ZS50b05vZGUsYj09PWN8fGI9PT10aGlzKSk7KXs7fWlmKGI9PT10aGlzfHxudWxsPT09Ynx8Yj09PWMpcmV0dXJuITE7Yz1iO31yZXR1cm4hMDt9O3QuWnk9ZnVuY3Rpb24oKXt2YXIgYT0hMCxiPXRoaXMuZGlhZ3JhbTtudWxsIT09YiYmKGE9Yi5pc1RyZWVQYXRoVG9DaGlsZHJlbik7Yj10aGlzO2lmKGEpZm9yKDs7KXthPW51bGw7Zm9yKHZhciBjPWIuWWEuaXRlcmF0b3I7Yy5uZXh0KCk7KXt2YXIgZD1jLnZhbHVlO2lmKGQuaXNUcmVlTGluayYmKGE9ZC5mcm9tTm9kZSxhIT09YiYmYSE9PXRoaXMpKWJyZWFrO31pZihhPT09dGhpcylyZXR1cm4gdGhpcztpZihudWxsPT09YXx8YT09PWIpcmV0dXJuIGI7Yj1hO31lbHNlIGZvcig7Oyl7YT1udWxsO2ZvcihjPWIuWWEuaXRlcmF0b3I7Yy5uZXh0KCkmJihkPWMudmFsdWUsIWQuaXNUcmVlTGlua3x8KGE9ZC50b05vZGUsYT09PWJ8fGE9PT10aGlzKSk7KXs7fWlmKGE9PT10aGlzKXJldHVybiB0aGlzO2lmKG51bGw9PT1hfHxhPT09YilyZXR1cm4gYjtiPWE7fX07dC5LeT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDtpZih0aGlzPT09YSlyZXR1cm4gdGhpcztmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe25vKGIsITApLGI9Yi5vZygpO312YXIgYz1udWxsO2ZvcihiPWE7bnVsbCE9PWI7KXtpZigwIT09KGIuRCYxMDQ4NTc2KSl7Yz1iO2JyZWFrO31iPWIub2coKTt9Zm9yKGI9dGhpcztudWxsIT09Yjspe25vKGIsITEpLGI9Yi5vZygpO31yZXR1cm4gYzt9O3QuSGk9ZnVuY3Rpb24oKXt2YXIgYT0hMCxiPXRoaXMuZGlhZ3JhbTtudWxsIT09YiYmKGE9Yi5pc1RyZWVQYXRoVG9DaGlsZHJlbik7Yj10aGlzLllhLml0ZXJhdG9yO2lmKGEpZm9yKDtiLm5leHQoKTspe2lmKGE9Yi52YWx1ZSxhLmlzVHJlZUxpbmsmJmEuZnJvbU5vZGUhPT10aGlzKXJldHVybiBhO31lbHNlIGZvcig7Yi5uZXh0KCk7KXtpZihhPWIudmFsdWUsYS5pc1RyZWVMaW5rJiZhLnRvTm9kZSE9PXRoaXMpcmV0dXJuIGE7fXJldHVybiBudWxsO307dC5vZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMub2g7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7aWYoYSBpbnN0YW5jZW9mIFYpcmV0dXJuIGE7dmFyIGI9ITA7YT10aGlzLmRpYWdyYW07bnVsbCE9PWEmJihiPWEuaXNUcmVlUGF0aFRvQ2hpbGRyZW4pO2E9dGhpcy5ZYS5pdGVyYXRvcjtpZihiKWZvcig7YS5uZXh0KCk7KXtpZihiPWEudmFsdWUsYi5pc1RyZWVMaW5rJiYoYj1iLmZyb21Ob2RlLGIhPT10aGlzKSlyZXR1cm4gdGhpcy5vaD1iO31lbHNlIGZvcig7YS5uZXh0KCk7KXtpZihiPWEudmFsdWUsYi5pc1RyZWVMaW5rJiYoYj1iLnRvTm9kZSxiIT09dGhpcykpcmV0dXJuIHRoaXMub2g9Yjt9cmV0dXJuIHRoaXMub2g9bnVsbDt9O3QuWHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIsZCl7aWYobnVsbCE9PWIpe2QuYWRkKGIpO3ZhciBjPWIuSGkoKTtudWxsIT09YyYmKGQuYWRkKGMpLGEoYi5vZygpLGQpKTt9fXZhciBiPW5ldyBGKCk7YSh0aGlzLGIpO3JldHVybiBiO307dC5XeT1mdW5jdGlvbigpe3JldHVybiBEbyh0aGlzLHRoaXMpO307ZnVuY3Rpb24gRG8oYSxiKXtiPWIub2coKTtyZXR1cm4gbnVsbD09PWI/MDoxK0RvKGEsYik7fXQuVXA9ZnVuY3Rpb24oKXt2YXIgYT0hMCxiPXRoaXMuZGlhZ3JhbTtudWxsIT09YiYmKGE9Yi5pc1RyZWVQYXRoVG9DaGlsZHJlbik7Yj1uZXcgemIodGhpcy5ZYSk7dmFyIGM9dGhpcztiLnByZWRpY2F0ZT1hP2Z1bmN0aW9uKGEpe3JldHVybiBhLmlzVHJlZUxpbmsmJmEuZnJvbU5vZGU9PT1jPyEwOiExO306ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNUcmVlTGluayYmYS50b05vZGU9PT1jPyEwOiExO307cmV0dXJuIGI7fTt0LiR1PWZ1bmN0aW9uKCl7dmFyIGE9ITAsYj10aGlzLmRpYWdyYW07bnVsbCE9PWImJihhPWIuaXNUcmVlUGF0aFRvQ2hpbGRyZW4pO3ZhciBjPWI9bnVsbCxkPXRoaXMuWWEuaXRlcmF0b3I7aWYoYSlmb3IoO2QubmV4dCgpOyl7YT1kLnZhbHVlLGEuaXNUcmVlTGluayYmYS5mcm9tTm9kZT09PXRoaXMmJihhPWEudG9Ob2RlLG51bGwhPT1iP2IuYWRkKGEpOm51bGwhPT1jJiZjIT09YT8oYj1uZXcgRSgpLGIuYWRkKGMpLGIuYWRkKGEpKTpjPWEpO31lbHNlIGZvcig7ZC5uZXh0KCk7KXthPWQudmFsdWUsYS5pc1RyZWVMaW5rJiZhLnRvTm9kZT09PXRoaXMmJihhPWEuZnJvbU5vZGUsbnVsbCE9PWI/Yi5hZGQoYSk6bnVsbCE9PWMmJmMhPT1hPyhiPW5ldyBFKCksYi5hZGQoYyksYi5hZGQoYSkpOmM9YSk7fXJldHVybiBudWxsIT09Yj9iLml0ZXJhdG9yOm51bGwhPT1jP25ldyB5YihjKTp4Yjt9O3QuWXk9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9SW5maW5pdHkpO3ZhciBiPW5ldyBGKCk7SWsoYix0aGlzLCExLGEsITApO3JldHVybiBiO307Vi5wcm90b3R5cGUuY29sbGFwc2VUcmVlPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPTEpOzE+YSYmKGE9MSk7dmFyIGI9dGhpcy5kaWFncmFtO2lmKG51bGwhPT1iJiYhYi5FZSl7Yi5FZT0hMDt2YXIgYz1uZXcgRigpO2MuYWRkKHRoaXMpO0VvKHRoaXMsYyxiLmlzVHJlZVBhdGhUb0NoaWxkcmVuLGEsYix0aGlzLGIudHJlZUNvbGxhcHNlUG9saWN5PT09cmkpO2IuRWU9ITE7fX07ZnVuY3Rpb24gRW8oYSxiLGMsZCxlLGYsZyl7aWYoMTxkKWZvcih2YXIgaD1jP2EuU3AoKTphLnNkKCk7aC5uZXh0KCk7KXt2YXIgaz1oLnZhbHVlO2suaXNUcmVlTGluayYmKGs9ay5YcyhhKSxudWxsPT09a3x8az09PWF8fGIuY29udGFpbnMoayl8fChiLmFkZChrKSxFbyhrLGIsYyxkLTEsZSxmLGcpKSk7fWVsc2UgRm8oYSxiLGMsZSxmLGcpO31mdW5jdGlvbiBGbyhhLGIsYyxkLGUsZil7Zm9yKHZhciBnPWU9PT1hPyEwOmEuaXNUcmVlRXhwYW5kZWQsaD1jP2EuU3AoKTphLnNkKCk7aC5uZXh0KCk7KXt2YXIgaz1oLnZhbHVlO2lmKGsuaXNUcmVlTGluayYmKGs9ay5YcyhhKSxudWxsIT09ayYmayE9PWEpKXt2YXIgbD1iLmNvbnRhaW5zKGspO2x8fGIuYWRkKGspO2cmJihmJiZkLkpwKGssZSksay55aCgpLGsuTWIoITEpKTtrLmlzVHJlZUV4cGFuZGVkJiYoay53YXNUcmVlRXhwYW5kZWQ9ay5pc1RyZWVFeHBhbmRlZCxsfHxGbyhrLGIsYyxkLGUsZikpO319YS5pc1RyZWVFeHBhbmRlZD0hMTt9Vi5wcm90b3R5cGUuZXhwYW5kVHJlZT1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT0yKTsyPmEmJihhPTIpO3ZhciBiPXRoaXMuZGlhZ3JhbTtpZihudWxsIT09YiYmIWIuRWUpe2IuRWU9ITA7dmFyIGM9bmV3IEYoKTtjLmFkZCh0aGlzKTtHbyh0aGlzLGMsYi5pc1RyZWVQYXRoVG9DaGlsZHJlbixhLGIsdGhpcyxiLnRyZWVDb2xsYXBzZVBvbGljeT09PXJpKTtiLkVlPSExO319O2Z1bmN0aW9uIEdvKGEsYixjLGQsZSxmLGcpe2Zvcih2YXIgaD1mPT09YT8hMTphLmlzVHJlZUV4cGFuZGVkLGs9Yz9hLlNwKCk6YS5zZCgpO2submV4dCgpOyl7dmFyIGw9ay52YWx1ZTtsLmlzVHJlZUxpbmsmJihofHxsLkxjfHxsLlJhKCksbD1sLlhzKGEpLG51bGwhPT1sJiZsIT09YSYmIWIuY29udGFpbnMobCkmJihiLmFkZChsKSxofHwobC5NYighMCksbC55aCgpLGcmJmUuS3AobCxmKSksMjxkfHxsLndhc1RyZWVFeHBhbmRlZCkpJiYobC53YXNUcmVlRXhwYW5kZWQ9ITEsR28obCxiLGMsZC0xLGUsZixnKSk7fWEuaXNUcmVlRXhwYW5kZWQ9ITA7fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFYucHJvdG90eXBlLHtwb3J0U3ByZWFkaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUW87fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuUW87YiE9PWEmJih0aGlzLlFvPWEsdGhpcy5nKCJwb3J0U3ByZWFkaW5nIixiLGEpLGE9dGhpcy5kaWFncmFtLG51bGwhPT1hJiZhLnVuZG9NYW5hZ2VyLmlzVW5kb2luZ1JlZG9pbmd8fHRoaXMuZWQoKSk7fX0sYXZvaWRhYmxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5TJjgpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuUyY4KTtpZihiIT09YSl7dGhpcy5TXj04O3ZhciBjPXRoaXMuZGlhZ3JhbTtudWxsIT09YyYmcGsoYyx0aGlzKTt0aGlzLmcoImF2b2lkYWJsZSIsYixhKTt9fX0sYXZvaWRhYmxlTWFyZ2luOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ2s7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpeyJudW1iZXIiPT09dHlwZW9mIGEmJihhPW5ldyBJYyhhKSk7dmFyIGI9dGhpcy5DaztpZighYi5BKGEpKXt0aGlzLkNrPWE9YS5JKCk7dmFyIGM9dGhpcy5kaWFncmFtO251bGwhPT1jJiZwayhjLHRoaXMpO3RoaXMuZygiYXZvaWRhYmxlTWFyZ2luIixiLGEpO319fSxsaW5rc0Nvbm5lY3RlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLllhLml0ZXJhdG9yO319LGxpbmtDb25uZWN0ZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5jbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5jbztiIT09YSYmKHRoaXMuY289YSx0aGlzLmcoImxpbmtDb25uZWN0ZWQiLGIsYSkpO319LGxpbmtEaXNjb25uZWN0ZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5lbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5lbztiIT09YSYmKHRoaXMuZW89YSx0aGlzLmcoImxpbmtEaXNjb25uZWN0ZWQiLGIsYSkpO319LGxpbmtWYWxpZGF0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuaWk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuaWk7YiE9PWEmJih0aGlzLmlpPWEsdGhpcy5nKCJsaW5rVmFsaWRhdGlvbiIsYixhKSk7fX0saXNMaW5rTGFiZWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gbnVsbCE9PXRoaXMuaGw7fX0sbGFiZWxlZExpbms6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5obDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5obDtpZihiIT09YSl7dmFyIGM9dGhpcy5kaWFncmFtLGQ9dGhpcy5kYXRhO2lmKG51bGwhPT1iKXtudWxsIT09Yi4kYyYmKGIuJGMucmVtb3ZlKHRoaXMpLGIucygpKTtpZihudWxsIT09YyYmbnVsbCE9PWQmJiFjLnVuZG9NYW5hZ2VyLmlzVW5kb2luZ1JlZG9pbmcpe3ZhciBlPWIuZGF0YSxmPWMubW9kZWw7aWYobnVsbCE9PWUmJmYuZW0oKSl7dmFyIGc9Zi5wYShkKTt2b2lkIDAhPT1nJiZmLkF4KGUsZyk7fX10aGlzLmNvbnRhaW5pbmdHcm91cD1udWxsO310aGlzLmhsPWE7bnVsbCE9PWEmJihCbyhhLHRoaXMpLG51bGw9PT1jfHxudWxsPT09ZHx8Yy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHwoZT1hLmRhdGEsYz1jLm1vZGVsLG51bGwhPT1lJiZjLmVtKCkmJihkPWMucGEoZCksdm9pZCAwIT09ZCYmYy5HdShlLGQpKSksdGhpcy5jb250YWluaW5nR3JvdXA9YS5jb250YWluaW5nR3JvdXApO3RsKHRoaXMpO3RoaXMuZygibGFiZWxlZExpbmsiLGIsYSk7fX19LHBvcnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5UcygiIik7fX0scG9ydHM6e2dldDpmdW5jdGlvbiBnZXQoKXtudWxsPT09dGhpcy5yYyYmQ28odGhpcyk7cmV0dXJuIHRoaXMucmMuaXRlcmF0b3JWYWx1ZXM7fX0saXNUcmVlRXhwYW5kZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLlMmMSk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPTAhPT0odGhpcy5TJjEpO2lmKGIhPT1hKXt0aGlzLlNePTE7dmFyIGM9dGhpcy5kaWFncmFtO3RoaXMuZygiaXNUcmVlRXhwYW5kZWQiLGIsYSk7Yj10aGlzLnRyZWVFeHBhbmRlZENoYW5nZWQ7aWYobnVsbCE9PWIpe3ZhciBkPSEwO251bGwhPT1jJiYoZD1jLmRhLGMuZGE9ITApO2IodGhpcyk7bnVsbCE9PWMmJihjLmRhPWQpO31udWxsIT09YyYmYy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nP3RoaXMuTWIoYSk6YT90aGlzLmV4cGFuZFRyZWUoKTp0aGlzLmNvbGxhcHNlVHJlZSgpO319fSx3YXNUcmVlRXhwYW5kZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLlMmMik7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPTAhPT0odGhpcy5TJjIpO2IhPT1hJiYodGhpcy5TXj0yLHRoaXMuZygid2FzVHJlZUV4cGFuZGVkIixiLGEpKTt9fSx0cmVlRXhwYW5kZWRDaGFuZ2VkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ3A7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuQ3A7YiE9PWEmJih0aGlzLkNwPWEsdGhpcy5nKCJ0cmVlRXhwYW5kZWRDaGFuZ2VkIixiLGEpKTt9fSxpc1RyZWVMZWFmOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5TJjQpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuUyY0KTtiIT09YSYmKHRoaXMuU149NCx0aGlzLmcoImlzVHJlZUxlYWYiLGIsYSkpO319fSk7Vi5wcm90b3R5cGUuZXhwYW5kVHJlZT1WLnByb3RvdHlwZS5leHBhbmRUcmVlO1YucHJvdG90eXBlLmNvbGxhcHNlVHJlZT1WLnByb3RvdHlwZS5jb2xsYXBzZVRyZWU7Vi5wcm90b3R5cGUuZmluZFRyZWVQYXJ0cz1WLnByb3RvdHlwZS5ZeTtWLnByb3RvdHlwZS5maW5kVHJlZUNoaWxkcmVuTm9kZXM9Vi5wcm90b3R5cGUuJHU7Vi5wcm90b3R5cGUuZmluZFRyZWVDaGlsZHJlbkxpbmtzPVYucHJvdG90eXBlLlVwO1YucHJvdG90eXBlLmZpbmRUcmVlTGV2ZWw9Vi5wcm90b3R5cGUuV3k7Vi5wcm90b3R5cGUuZmluZFRyZWVQYXJlbnRDaGFpbj1WLnByb3RvdHlwZS5YeTtWLnByb3RvdHlwZS5maW5kVHJlZVBhcmVudE5vZGU9Vi5wcm90b3R5cGUub2c7Vi5wcm90b3R5cGUuZmluZFRyZWVQYXJlbnRMaW5rPVYucHJvdG90eXBlLkhpO1YucHJvdG90eXBlLmZpbmRDb21tb25UcmVlUGFyZW50PVYucHJvdG90eXBlLkt5O1YucHJvdG90eXBlLmZpbmRUcmVlUm9vdD1WLnByb3RvdHlwZS5aeTtWLnByb3RvdHlwZS5pc0luVHJlZU9mPVYucHJvdG90eXBlLnN6O1YucHJvdG90eXBlLmZpbmRQb3J0PVYucHJvdG90eXBlLlRzO1YucHJvdG90eXBlLmZpbmRMaW5rc1RvPVYucHJvdG90eXBlLk95O1YucHJvdG90eXBlLmZpbmRMaW5rc0JldHdlZW49Vi5wcm90b3R5cGUuTnk7Vi5wcm90b3R5cGUuZmluZE5vZGVzSW50bz1WLnByb3RvdHlwZS5ZdTtWLnByb3RvdHlwZS5maW5kTm9kZXNPdXRPZj1WLnByb3RvdHlwZS5adTtWLnByb3RvdHlwZS5maW5kTm9kZXNDb25uZWN0ZWQ9Vi5wcm90b3R5cGUuWHU7Vi5wcm90b3R5cGUuZmluZExpbmtzSW50bz1WLnByb3RvdHlwZS5zZDtWLnByb3RvdHlwZS5maW5kTGlua3NPdXRPZj1WLnByb3RvdHlwZS5TcDtWLnByb3RvdHlwZS5maW5kTGlua3NDb25uZWN0ZWQ9Vi5wcm90b3R5cGUuV3U7Vi5wcm90b3R5cGUuaW52YWxpZGF0ZUNvbm5lY3RlZExpbmtzPVYucHJvdG90eXBlLmVkO1YucHJvdG90eXBlLmludmFsaWRhdGVMaW5rQnVuZGxlPVYucHJvdG90eXBlLnF6O3ZhciBIbz1uZXcgRChWLCJTcHJlYWRpbmdOb25lIiwxMCksdm89bmV3IEQoViwiU3ByZWFkaW5nRXZlbmx5IiwxMSksSW89bmV3IEQoViwiU3ByZWFkaW5nUGFja2VkIiwxMik7Vi5jbGFzc05hbWU9Ik5vZGUiO1YuU3ByZWFkaW5nTm9uZT1IbztWLlNwcmVhZGluZ0V2ZW5seT12bztWLlNwcmVhZGluZ1BhY2tlZD1JbztmdW5jdGlvbiBpZyhhKXtWLmNhbGwodGhpcyxhKTt0aGlzLlN8PTQ2MDg7dGhpcy5vbz1uZXcgRigpO3RoaXMucmw9bmV3IEYoKTt0aGlzLlZhPXRoaXMudHA9dGhpcy5qaT10aGlzLnBvPXRoaXMubm89bnVsbDt0aGlzLmdjPW5ldyB5aSgpO3RoaXMuZ2MuZ3JvdXA9dGhpczt9b2EoaWcsVik7aWcucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkPWZ1bmN0aW9uKGEpe1YucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkLmNhbGwodGhpcyxhKTt0aGlzLlM9dGhpcy5TJi0zMjc2OTthLm5vPXRoaXMubm87YS5wbz10aGlzLnBvO2Euamk9dGhpcy5qaTthLnRwPXRoaXMudHA7dmFyIGI9YS5ZbChmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFhnO30pO2IgaW5zdGFuY2VvZiBYZz9hLlZhPWI6YS5WYT1udWxsO251bGwhPT10aGlzLmdjPyhhLmdjPXRoaXMuZ2MuY29weSgpLGEuZ2MuZ3JvdXA9YSk6KG51bGwhPT1hLmdjJiYoYS5nYy5ncm91cD1udWxsKSxhLmdjPW51bGwpO307dD1pZy5wcm90b3R5cGU7dC5tZj1mdW5jdGlvbihhKXtWLnByb3RvdHlwZS5tZi5jYWxsKHRoaXMsYSk7dmFyIGI9YS5haygpO2ZvcihhPWEubWVtYmVyUGFydHM7YS5uZXh0KCk7KXt2YXIgYz1hLnZhbHVlO2MucygpO2MuQig4KTtjLlNqKCk7aWYoYyBpbnN0YW5jZW9mIFYpYy5lZChiKTtlbHNlIGlmKGMgaW5zdGFuY2VvZiBTKWZvcihjPWMubGFiZWxOb2RlcztjLm5leHQoKTspe2MudmFsdWUuZWQoYik7fX19O3Qubms9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7aWYoYT09PWNmJiYiZWxlbWVudHMiPT09Yil7aWYoZSBpbnN0YW5jZW9mIFhnKW51bGw9PT10aGlzLlZhP3RoaXMuVmE9ZTp0aGlzLlZhIT09ZSYmQSgiQ2Fubm90IGluc2VydCBhIHNlY29uZCBQbGFjZWhvbGRlciBpbnRvIHRoZSB2aXN1YWwgdHJlZSBvZiBhIEdyb3VwLiIpO2Vsc2V7aWYoZSBpbnN0YW5jZW9mIFgpe3ZhciBoPWUuWWwoZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBYZzt9KTtoIGluc3RhbmNlb2YgWGcmJihudWxsPT09dGhpcy5WYT90aGlzLlZhPWg6dGhpcy5WYSE9PWgmJkEoIkNhbm5vdCBpbnNlcnQgYSBzZWNvbmQgUGxhY2Vob2xkZXIgaW50byB0aGUgdmlzdWFsIHRyZWUgb2YgYSBHcm91cC4iKSk7fX19ZWxzZSBhPT09ZGYmJiJlbGVtZW50cyI9PT1iJiZudWxsIT09dGhpcy5WYSYmKGQ9PT10aGlzLlZhP3RoaXMuVmE9bnVsbDpkIGluc3RhbmNlb2YgWCYmdGhpcy5WYS5xZyhkKSYmKHRoaXMuVmE9bnVsbCkpO1YucHJvdG90eXBlLm5rLmNhbGwodGhpcyxhLGIsYyxkLGUsZixnKTt9O3QudGg9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5WZT10aGlzLlZhO1YucHJvdG90eXBlLnRoLmNhbGwodGhpcyxhLGIsYyxkKTt9O3QuUGk9ZnVuY3Rpb24oKXtpZighVi5wcm90b3R5cGUuUGkuY2FsbCh0aGlzKSlyZXR1cm4hMTtmb3IodmFyIGE9dGhpcy5tZW1iZXJQYXJ0czthLm5leHQoKTspe3ZhciBiPWEudmFsdWU7aWYoYiBpbnN0YW5jZW9mIFYpe2lmKGIuaXNWaXNpYmxlKCkmJnBqKGIpKXJldHVybiExO31lbHNlIGlmKGIgaW5zdGFuY2VvZiBTJiZiLmlzVmlzaWJsZSgpJiZwaihiKSYmYi5mcm9tTm9kZSE9PXRoaXMmJmIudG9Ob2RlIT09dGhpcylyZXR1cm4hMTt9cmV0dXJuITA7fTtmdW5jdGlvbiBvbyhhLGIpe2lmKGEub28uYWRkKGIpKXtiIGluc3RhbmNlb2YgaWcmJmEucmwuYWRkKGIpO3ZhciBjPWEubWVtYmVyQWRkZWQ7aWYobnVsbCE9PWMpe3ZhciBkPSEwLGU9YS5kaWFncmFtO251bGwhPT1lJiYoZD1lLmRhLGUuZGE9ITApO2MoYSxiKTtudWxsIT09ZSYmKGUuZGE9ZCk7fWEuaXNWaXNpYmxlKCkmJmEuaXNTdWJHcmFwaEV4cGFuZGVkfHxiLk1iKCExKTt9YiBpbnN0YW5jZW9mIFMmJiFhLmNvbXB1dGVzQm91bmRzSW5jbHVkaW5nTGlua3N8fChiPWEuVmEsbnVsbD09PWImJihiPWEpLGIucygpKTt9ZnVuY3Rpb24gcG8oYSxiKXtpZihhLm9vLnJlbW92ZShiKSl7YiBpbnN0YW5jZW9mIGlnJiZhLnJsLnJlbW92ZShiKTt2YXIgYz1hLm1lbWJlclJlbW92ZWQ7aWYobnVsbCE9PWMpe3ZhciBkPSEwLGU9YS5kaWFncmFtO251bGwhPT1lJiYoZD1lLmRhLGUuZGE9ITApO2MoYSxiKTtudWxsIT09ZSYmKGUuZGE9ZCk7fWEuaXNWaXNpYmxlKCkmJmEuaXNTdWJHcmFwaEV4cGFuZGVkfHxiLk1iKCEwKTt9YiBpbnN0YW5jZW9mIFMmJiFhLmNvbXB1dGVzQm91bmRzSW5jbHVkaW5nTGlua3N8fChiPWEuVmEsbnVsbD09PWImJihiPWEpLGIucygpKTt9dC5Zaj1mdW5jdGlvbigpe2lmKDA8dGhpcy5vby5jb3VudCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKG51bGwhPT1hKWZvcih2YXIgYj10aGlzLm9vLmNvcHkoKS5pdGVyYXRvcjtiLm5leHQoKTspe2EucmVtb3ZlKGIudmFsdWUpO319Vi5wcm90b3R5cGUuWWouY2FsbCh0aGlzKTt9O2lnLnByb3RvdHlwZS5jYW5BZGRNZW1iZXJzPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZGlhZ3JhbTtpZihudWxsPT09YilyZXR1cm4hMTtiPWIuY29tbWFuZEhhbmRsZXI7Zm9yKGE9S2soYSkuaXRlcmF0b3I7YS5uZXh0KCk7KXtpZighYi5pc1ZhbGlkTWVtYmVyKHRoaXMsYS52YWx1ZSkpcmV0dXJuITE7fXJldHVybiEwO307aWcucHJvdG90eXBlLmFkZE1lbWJlcnM9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmRpYWdyYW07aWYobnVsbD09PWMpcmV0dXJuITE7Yz1jLmNvbW1hbmRIYW5kbGVyO3ZhciBkPSEwO2ZvcihhPUtrKGEpLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGU9YS52YWx1ZTshYnx8Yy5pc1ZhbGlkTWVtYmVyKHRoaXMsZSk/ZS5jb250YWluaW5nR3JvdXA9dGhpczpkPSExO31yZXR1cm4gZDt9O2lnLnByb3RvdHlwZS5jYW5Vbmdyb3VwPWZ1bmN0aW9uKCl7aWYoIXRoaXMudW5ncm91cGFibGUpcmV0dXJuITE7dmFyIGE9dGhpcy5sYXllcjtpZihudWxsIT09YSYmIWEuYWxsb3dVbmdyb3VwKXJldHVybiExO2E9YS5kaWFncmFtO3JldHVybiBudWxsPT09YXx8YS5hbGxvd1VuZ3JvdXA/ITA6ITE7fTt0PWlnLnByb3RvdHlwZTt0LmVkPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPW51bGwpO3ZhciBiPTAhPT0odGhpcy5TJjY1NTM2KTtWLnByb3RvdHlwZS5lZC5jYWxsKHRoaXMsYSk7aWYoIWIpZm9yKDAhPT0odGhpcy5TJjY1NTM2KSE9PSEwJiYodGhpcy5TPXRoaXMuU142NTUzNiksYj10aGlzLlZ1KCk7Yi5uZXh0KCk7KXt2YXIgYz1iLnZhbHVlO2lmKG51bGw9PT1hfHwhYS5jb250YWlucyhjKSl7dmFyIGQ9Yy5mcm9tTm9kZTtudWxsIT09ZCYmZCE9PXRoaXMmJmQuVmQodGhpcykmJiFkLmlzVmlzaWJsZSgpPyh5byhkLGMuZnJvbVBvcnQpLHlvKGQsYy50b1BvcnQpLGMuUmEoKSk6KGQ9Yy50b05vZGUsbnVsbCE9PWQmJmQhPT10aGlzJiZkLlZkKHRoaXMpJiYhZC5pc1Zpc2libGUoKSYmKHlvKGQsYy5mcm9tUG9ydCkseW8oZCxjLnRvUG9ydCksYy5SYSgpKSk7fX19O3QuVnU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmFrKCk7YS5hZGQodGhpcyk7Zm9yKHZhciBiPW5ldyBGKCksYz1hLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGQ9Yy52YWx1ZTtpZihkIGluc3RhbmNlb2YgVilmb3IoZD1kLmxpbmtzQ29ubmVjdGVkO2QubmV4dCgpOyl7dmFyIGU9ZC52YWx1ZTthLmNvbnRhaW5zKGUpfHxiLmFkZChlKTt9fXJldHVybiBiLml0ZXJhdG9yO307dC5NeT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYWsoKTthLmFkZCh0aGlzKTtmb3IodmFyIGI9bmV3IEYoKSxjPWEuaXRlcmF0b3I7Yy5uZXh0KCk7KXt2YXIgZD1jLnZhbHVlO2lmKGQgaW5zdGFuY2VvZiBWKWZvcihkPWQubGlua3NDb25uZWN0ZWQ7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlLGY9ZS5mcm9tTm9kZTthLmNvbnRhaW5zKGYpJiZmIT09dGhpc3x8Yi5hZGQoZik7ZT1lLnRvTm9kZTthLmNvbnRhaW5zKGUpJiZlIT09dGhpc3x8Yi5hZGQoZSk7fX1yZXR1cm4gYi5pdGVyYXRvcjt9O3QuTHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIsZCl7bnVsbCE9PWImJihkLmFkZChiKSxhKGIuY29udGFpbmluZ0dyb3VwLGQpKTt9dmFyIGI9bmV3IEYoKTthKHRoaXMsYik7cmV0dXJuIGI7fTt0LmFrPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IEYoKTtJayhhLHRoaXMsITAsMCwhMCk7YS5yZW1vdmUodGhpcyk7cmV0dXJuIGE7fTt0Lk1iPWZ1bmN0aW9uKGEpe1YucHJvdG90eXBlLk1iLmNhbGwodGhpcyxhKTtmb3IodmFyIGI9dGhpcy5tZW1iZXJQYXJ0cztiLm5leHQoKTspe2IudmFsdWUuTWIoYSk7fX07aWcucHJvdG90eXBlLmNvbGxhcHNlU3ViR3JhcGg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW07aWYobnVsbCE9PWEmJiFhLkVlKXthLkVlPSEwO3ZhciBiPXRoaXMuYWsoKTtKbyh0aGlzLGIsYSx0aGlzKTthLkVlPSExO319O2Z1bmN0aW9uIEpvKGEsYixjLGQpe2Zvcih2YXIgZT1hLm1lbWJlclBhcnRzO2UubmV4dCgpOyl7dmFyIGY9ZS52YWx1ZTtmLk1iKCExKTtmIGluc3RhbmNlb2YgaWcmJmYuaXNTdWJHcmFwaEV4cGFuZGVkJiYoZi53YXNTdWJHcmFwaEV4cGFuZGVkPWYuaXNTdWJHcmFwaEV4cGFuZGVkLEpvKGYsYixjLGQpKTtpZihmIGluc3RhbmNlb2YgVilmLmVkKGIpLGMuSnAoZixkKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTKWZvcihmPWYubGFiZWxOb2RlcztmLm5leHQoKTspe2YudmFsdWUuZWQoYik7fX1hLmlzU3ViR3JhcGhFeHBhbmRlZD0hMTt9aWcucHJvdG90eXBlLmV4cGFuZFN1YkdyYXBoPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKG51bGwhPT1hJiYhYS5FZSl7YS5FZT0hMDt2YXIgYj10aGlzLmFrKCk7S28odGhpcyxiLGEsdGhpcyk7YS5FZT0hMTt9fTtmdW5jdGlvbiBLbyhhLGIsYyxkKXtmb3IodmFyIGU9YS5tZW1iZXJQYXJ0cztlLm5leHQoKTspe3ZhciBmPWUudmFsdWU7Zi5NYighMCk7ZiBpbnN0YW5jZW9mIGlnJiZmLndhc1N1YkdyYXBoRXhwYW5kZWQmJihmLndhc1N1YkdyYXBoRXhwYW5kZWQ9ITEsS28oZixiLGMsZCkpO2lmKGYgaW5zdGFuY2VvZiBWKWYuZWQoYiksYy5LcChmLGQpO2Vsc2UgaWYoZiBpbnN0YW5jZW9mIFMpZm9yKGY9Zi5sYWJlbE5vZGVzO2YubmV4dCgpOyl7Zi52YWx1ZS5lZChiKTt9fWEuaXNTdWJHcmFwaEV4cGFuZGVkPSEwO31pZy5wcm90b3R5cGUubW92ZT1mdW5jdGlvbihhLGIpe3ZvaWQgMD09PWImJihiPSExKTt2YXIgYz1iP3RoaXMubG9jYXRpb246dGhpcy5wb3NpdGlvbixkPWMueDtpc05hTihkKSYmKGQ9MCk7Yz1jLnk7aXNOYU4oYykmJihjPTApO2Q9YS54LWQ7Yz1hLnktYzt2YXIgZT1HLmFsbG9jQXQoZCxjKTtWLnByb3RvdHlwZS5tb3ZlLmNhbGwodGhpcyxhLGIpO2E9bmV3IEYoKTtmb3IoYj10aGlzLmFrKCkuaXRlcmF0b3I7Yi5uZXh0KCk7KXt2YXIgZj1iLnZhbHVlO2YgaW5zdGFuY2VvZiBTJiYoZi5zdXNwZW5kc1JvdXRpbmcmJmEuYWRkKGYpLGYuTGN8fGYuZnJvbU5vZGUhPT10aGlzJiZmLnRvTm9kZSE9PXRoaXMpJiYoZi5zdXNwZW5kc1JvdXRpbmc9ITApO31mb3IoYi5yZXNldCgpO2IubmV4dCgpOyl7aWYoZj1iLnZhbHVlLCEoZi56aCgpfHxmIGluc3RhbmNlb2YgViYmZi5pc0xpbmtMYWJlbCkpe3ZhciBnPWYucG9zaXRpb24saD1mLmxvY2F0aW9uO2cubygpPyhlLng9Zy54K2QsZS55PWcueStjLGYucG9zaXRpb249ZSk6aC5vKCkmJihlLng9aC54K2QsZS55PWgueStjLGYubG9jYXRpb249ZSk7fX1mb3IoYi5yZXNldCgpO2IubmV4dCgpOyl7aWYoZj1iLnZhbHVlLGYgaW5zdGFuY2VvZiBTJiYoZi5zdXNwZW5kc1JvdXRpbmc9YS5jb250YWlucyhmKSxmLkxjfHxmLmZyb21Ob2RlIT09dGhpcyYmZi50b05vZGUhPT10aGlzKSlnPWYucG9zaXRpb24sZS54PWcueCtkLGUueT1nLnkrYyxlLm8oKT9mLm1vdmUoZSk6Zi5SYSgpLE5qKGYpJiZmLlJhKCk7fUcuZnJlZShlKTt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlnLnByb3RvdHlwZSx7cGxhY2Vob2xkZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5WYTt9fSxjb21wdXRlc0JvdW5kc0FmdGVyRHJhZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuUyYyMDQ4KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLlMmMjA0OCk7YiE9PWEmJih0aGlzLlNePTIwNDgsdGhpcy5nKCJjb21wdXRlc0JvdW5kc0FmdGVyRHJhZyIsYixhKSk7fX0sY29tcHV0ZXNCb3VuZHNJbmNsdWRpbmdMaW5rczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuUyY0MDk2KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLlMmNDA5Nik7YiE9PWEmJih0aGlzLlNePTQwOTYsdGhpcy5nKCJjb21wdXRlc0JvdW5kc0luY2x1ZGluZ0xpbmtzIixiLGEpKTt9fSxjb21wdXRlc0JvdW5kc0luY2x1ZGluZ0xvY2F0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5TJjgxOTIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuUyY4MTkyKTtiIT09YSYmKHRoaXMuU149ODE5Mix0aGlzLmcoImNvbXB1dGVzQm91bmRzSW5jbHVkaW5nTG9jYXRpb24iLGIsYSkpO319LGhhbmRsZXNEcmFnRHJvcEZvck1lbWJlcnM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLlMmMTYzODQpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuUyYxNjM4NCk7YiE9PWEmJih0aGlzLlNePTE2Mzg0LHRoaXMuZygiaGFuZGxlc0RyYWdEcm9wRm9yTWVtYmVycyIsYixhKSk7fX0sbWVtYmVyUGFydHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5vby5pdGVyYXRvcjt9fSxsYXlvdXQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5nYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5nYztpZihiIT09YSl7bnVsbCE9PWImJihiLmRpYWdyYW09bnVsbCxiLmdyb3VwPW51bGwpO3RoaXMuZ2M9YTt2YXIgYz10aGlzLmRpYWdyYW07bnVsbCE9PWEmJihhLmRpYWdyYW09YyxhLmdyb3VwPXRoaXMpO251bGwhPT1jJiYoYy56Zz0hMCk7dGhpcy5nKCJsYXlvdXQiLGIsYSk7bnVsbCE9PWMmJmMuY2MoKTt9fX0sbWVtYmVyQWRkZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ubzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ubztiIT09YSYmKHRoaXMubm89YSx0aGlzLmcoIm1lbWJlckFkZGVkIixiLGEpKTt9fSxtZW1iZXJSZW1vdmVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucG87fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMucG87YiE9PWEmJih0aGlzLnBvPWEsdGhpcy5nKCJtZW1iZXJSZW1vdmVkIixiLGEpKTt9fSxtZW1iZXJWYWxpZGF0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuamk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuamk7YiE9PWEmJih0aGlzLmppPWEsdGhpcy5nKCJtZW1iZXJWYWxpZGF0aW9uIixiLGEpKTt9fSx1bmdyb3VwYWJsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuUyYyNTYpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuUyYyNTYpO2IhPT1hJiYodGhpcy5TXj0yNTYsdGhpcy5nKCJ1bmdyb3VwYWJsZSIsYixhKSk7fX0saXNTdWJHcmFwaEV4cGFuZGVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5TJjUxMik7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPTAhPT0odGhpcy5TJjUxMik7aWYoYiE9PWEpe3RoaXMuU149NTEyO3ZhciBjPXRoaXMuZGlhZ3JhbTt0aGlzLmcoImlzU3ViR3JhcGhFeHBhbmRlZCIsYixhKTtiPXRoaXMuc3ViR3JhcGhFeHBhbmRlZENoYW5nZWQ7aWYobnVsbCE9PWIpe3ZhciBkPSEwO251bGwhPT1jJiYoZD1jLmRhLGMuZGE9ITApO2IodGhpcyk7bnVsbCE9PWMmJihjLmRhPWQpO31udWxsIT09YyYmYy51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nPyhudWxsIT09dGhpcy5WYSYmdGhpcy5WYS5zKCksdGhpcy5tZW1iZXJQYXJ0cy5lYWNoKGZ1bmN0aW9uKGEpe2EudXBkYXRlQWRvcm5tZW50cygpO30pKTphP3RoaXMuZXhwYW5kU3ViR3JhcGgoKTp0aGlzLmNvbGxhcHNlU3ViR3JhcGgoKTt9fX0sd2FzU3ViR3JhcGhFeHBhbmRlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuUyYxMDI0KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9MCE9PSh0aGlzLlMmMTAyNCk7YiE9PWEmJih0aGlzLlNePTEwMjQsdGhpcy5nKCJ3YXNTdWJHcmFwaEV4cGFuZGVkIixiLGEpKTt9fSxzdWJHcmFwaEV4cGFuZGVkQ2hhbmdlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnRwO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnRwO2IhPT1hJiYodGhpcy50cD1hLHRoaXMuZygic3ViR3JhcGhFeHBhbmRlZENoYW5nZWQiLGIsYSkpO319LG1rOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDAhPT0odGhpcy5TJjMyNzY4KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7MCE9PSh0aGlzLlMmMzI3NjgpIT09YSYmKHRoaXMuU149MzI3NjgpO319fSk7aWcucHJvdG90eXBlLmV4cGFuZFN1YkdyYXBoPWlnLnByb3RvdHlwZS5leHBhbmRTdWJHcmFwaDtpZy5wcm90b3R5cGUuY29sbGFwc2VTdWJHcmFwaD1pZy5wcm90b3R5cGUuY29sbGFwc2VTdWJHcmFwaDtpZy5wcm90b3R5cGUuZmluZFN1YkdyYXBoUGFydHM9aWcucHJvdG90eXBlLmFrO2lnLnByb3RvdHlwZS5maW5kQ29udGFpbmluZ0dyb3VwQ2hhaW49aWcucHJvdG90eXBlLkx5O2lnLnByb3RvdHlwZS5maW5kRXh0ZXJuYWxOb2Rlc0Nvbm5lY3RlZD1pZy5wcm90b3R5cGUuTXk7aWcucHJvdG90eXBlLmZpbmRFeHRlcm5hbExpbmtzQ29ubmVjdGVkPWlnLnByb3RvdHlwZS5WdTtpZy5jbGFzc05hbWU9Ikdyb3VwIjtmdW5jdGlvbiBYZygpe1kuY2FsbCh0aGlzKTt0aGlzLmViPU9jO3RoaXMuZXA9bmV3IE4oTmFOLE5hTixOYU4sTmFOKTt9b2EoWGcsWSk7WGcucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkPWZ1bmN0aW9uKGEpe1kucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkLmNhbGwodGhpcyxhKTthLmViPXRoaXMuZWIuSSgpO2EuZXA9dGhpcy5lcC5jb3B5KCk7fTtYZy5wcm90b3R5cGUudmg9ZnVuY3Rpb24oYSl7aWYobnVsbD09PXRoaXMuYmFja2dyb3VuZCYmbnVsbD09PXRoaXMuYXJlYUJhY2tncm91bmQpcmV0dXJuITE7dmFyIGI9dGhpcy5uYXR1cmFsQm91bmRzO3JldHVybiBDYygwLDAsYi53aWR0aCxiLmhlaWdodCxhLngsYS55KTt9O1hnLnByb3RvdHlwZS5obT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGFydDtudWxsIT09YSYmKGEgaW5zdGFuY2VvZiBpZ3x8YSBpbnN0YW5jZW9mIHBmKXx8QSgiUGxhY2Vob2xkZXIgaXMgbm90IGluc2lkZSBhIEdyb3VwIG9yIEFkb3JubWVudC4iKTtpZihhIGluc3RhbmNlb2YgaWcpe3ZhciBiPXRoaXMuY29tcHV0ZUJvcmRlcih0aGlzLmVwKSxjPXRoaXMubWluU2l6ZSxkPXRoaXMucWM7c2MoZCwoaXNGaW5pdGUoYy53aWR0aCk/TWF0aC5tYXgoYy53aWR0aCxiLndpZHRoKTpiLndpZHRoKXx8MCwoaXNGaW5pdGUoYy5oZWlnaHQpP01hdGgubWF4KGMuaGVpZ2h0LGIuaGVpZ2h0KTpiLmhlaWdodCl8fDApO1prKHRoaXMsMCwwLGQud2lkdGgsZC5oZWlnaHQpO2M9YS5tZW1iZXJQYXJ0cztmb3IoZD0hMTtjLm5leHQoKTspe2lmKGMudmFsdWUuaXNWaXNpYmxlKCkpe2Q9ITA7YnJlYWs7fX1jPWEuZGlhZ3JhbTsoZD0hZHx8bnVsbD09PWMpfHwoZD1jLmFuaW1hdGlvbk1hbmFnZXIsZC5LZj8oZD1kLnhqLkooYSksZD1udWxsIT09ZCYmKGQuc3RhcnQucG9zaXRpb258fGQuc3RhcnQubG9jYXRpb24pKTpkPSExKTtkfHxpc05hTihiLngpfHxpc05hTihiLnkpP251bGwhPT1jJiZjLmFuaW1hdGlvbk1hbmFnZXIuaXNBbmltYXRpbmcmJmMuYW5pbWF0aW9uTWFuYWdlci4kci5hZGQodGhpcyk6KGM9Ry5hbGxvYygpLGMuVGkoYixhLmxvY2F0aW9uU3BvdCksYy5BKGEubG9jYXRpb24pfHwoYS5sb2NhdGlvbj1uZXcgRyhjLngsYy55KSksRy5mcmVlKGMpKTt9ZWxzZXtiPXRoaXMucWM7Yz10aGlzLmViO2Q9Yy5sZWZ0K2MucmlnaHQ7dmFyIGU9Yy50b3ArYy5ib3R0b20sZj1hLmFkb3JuZWRPYmplY3Q7YS5hbmdsZT1mLkppKCk7dmFyIGc9MDtmIGluc3RhbmNlb2YgVyYmKGc9Zi5zdHJva2VXaWR0aCk7dmFyIGg9Zi5DZSgpLGs9Zi5uYXR1cmFsQm91bmRzLGw9KGsud2lkdGgrZykqaDtnPShrLmhlaWdodCtnKSpoO2EudHlwZSE9PVguTGluayYmKGY9Zi5tYSgiU2VsZWN0aW9uIj09PWEuY2F0ZWdvcnk/VGM6YS5sb2NhdGlvblNwb3QsRy5hbGxvYygpKSxhLmxvY2F0aW9uPWYsRy5mcmVlKGYpKTtpc05hTihsKXx8aXNOYU4oZyk/KGE9YS5hZG9ybmVkT2JqZWN0LGw9YS5tYShUYyxHLmFsbG9jKCkpLGY9Ti5hbGxvY0F0KGwueCxsLnksMCwwKSxmLkllKGEubWEoaGQsbCkpLGYuSWUoYS5tYShWYyxsKSksZi5JZShhLm1hKGZkLGwpKSxzYyhiLGYud2lkdGgrZHx8MCxmLmhlaWdodCtlfHwwKSxaayh0aGlzLC1jLmxlZnQsLWMudG9wLGIud2lkdGgsYi5oZWlnaHQpLEcuZnJlZShsKSxOLmZyZWUoZikpOihzYyhiLGwrZHx8MCxnK2V8fDApLFprKHRoaXMsLWMubGVmdCwtYy50b3AsYi53aWR0aCxiLmhlaWdodCkpO319O1hnLnByb3RvdHlwZS50aD1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLmFjdHVhbEJvdW5kcy5oKGEsYixjLGQpO307WGcucHJvdG90eXBlLmNvbXB1dGVCb3JkZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wYXJ0LGM9Yi5kaWFncmFtO2lmKG51bGwhPT1jJiZiIGluc3RhbmNlb2YgaWcmJiFiLmxheWVyLmlzVGVtcG9yYXJ5JiZiLmNvbXB1dGVzQm91bmRzQWZ0ZXJEcmFnJiZ0aGlzLmVwLm8oKSl7dmFyIGQ9Yy50b29sTWFuYWdlci5maW5kVG9vbCgiRHJhZ2dpbmciKTtpZihkPT09Yy5jdXJyZW50VG9vbCYmKGM9ZC5jb21wdXRlQm9yZGVyKGIsdGhpcy5lcCxhKSxudWxsIT09YykpcmV0dXJuIGM7fWM9Ti5hbGxvYygpO2Q9dGhpcy5jb21wdXRlTWVtYmVyQm91bmRzKGMpO3ZhciBlPXRoaXMuZWI7YiBpbnN0YW5jZW9mIGlnJiYhYi5pc1N1YkdyYXBoRXhwYW5kZWQ/YS5oKGQueC1lLmxlZnQsZC55LWUudG9wLDAsMCk6YS5oKGQueC1lLmxlZnQsZC55LWUudG9wLE1hdGgubWF4KGQud2lkdGgrZS5sZWZ0K2UucmlnaHQsMCksTWF0aC5tYXgoZC5oZWlnaHQrZS50b3ArZS5ib3R0b20sMCkpO04uZnJlZShjKTtiIGluc3RhbmNlb2YgaWcmJmIuY29tcHV0ZXNCb3VuZHNJbmNsdWRpbmdMb2NhdGlvbiYmYi5sb2NhdGlvbi5vKCkmJmEuSWUoYi5sb2NhdGlvbik7cmV0dXJuIGE7fTtYZy5wcm90b3R5cGUuY29tcHV0ZU1lbWJlckJvdW5kcz1mdW5jdGlvbihhKXtpZighKHRoaXMucGFydCBpbnN0YW5jZW9mIGlnKSlyZXR1cm4gYS5oKDAsMCwwLDApLGE7Zm9yKHZhciBiPXRoaXMucGFydCxjPUluZmluaXR5LGQ9SW5maW5pdHksZT0tSW5maW5pdHksZj0tSW5maW5pdHksZz1iLm1lbWJlclBhcnRzO2cubmV4dCgpOyl7dmFyIGg9Zy52YWx1ZTtpZihoLmlzVmlzaWJsZSgpKXtpZihoIGluc3RhbmNlb2YgUyl7aWYoIWIuY29tcHV0ZXNCb3VuZHNJbmNsdWRpbmdMaW5rcyljb250aW51ZTtpZihvaihoKSljb250aW51ZTtpZihoLmZyb21Ob2RlPT09Ynx8aC50b05vZGU9PT1iKWNvbnRpbnVlO31oPWguYWN0dWFsQm91bmRzO2gubGVmdDxjJiYoYz1oLmxlZnQpO2gudG9wPGQmJihkPWgudG9wKTtoLnJpZ2h0PmUmJihlPWgucmlnaHQpO2guYm90dG9tPmYmJihmPWguYm90dG9tKTt9fWlzRmluaXRlKGMpJiZpc0Zpbml0ZShkKT9hLmgoYyxkLGUtYyxmLWQpOihiPWIubG9jYXRpb24sYS5oKGIueCxiLnksMCwwKSk7cmV0dXJuIGE7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhYZy5wcm90b3R5cGUse3BhZGRpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5lYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7Im51bWJlciI9PT10eXBlb2YgYSYmKGE9bmV3IEljKGEpKTt2YXIgYj10aGlzLmViO2IuQShhKXx8KHRoaXMuZWI9YT1hLkkoKSx0aGlzLmcoInBhZGRpbmciLGIsYSkpO319fSk7WGcuY2xhc3NOYW1lPSJQbGFjZWhvbGRlciI7ZnVuY3Rpb24gUygpe1QuY2FsbCh0aGlzLFguTGluayk7dGhpcy5UYT04O3RoaXMuT2U9bnVsbDt0aGlzLlBlPSIiO3RoaXMuZWY9dGhpcy5Gbj1udWxsO3RoaXMuZmY9IiI7dGhpcy5CcD1udWxsO3RoaXMuTG09T2c7dGhpcy5nbj0wO3RoaXMua249T2c7dGhpcy5sbj1OYU47dGhpcy5Faj1Mbzt0aGlzLnBwPS41O3RoaXMuJGM9bnVsbDt0aGlzLnhiPW5ldyBFKCkuZnJlZXplKCk7dGhpcy5iaD10aGlzLlhnPW51bGw7dGhpcy54bD1uZXcgTigpO3RoaXMucWE9bmV3ICRkKCk7dGhpcy5Rbj0hMDt0aGlzLks9dGhpcy51PXRoaXMueGY9dGhpcy5HZj1udWxsO3RoaXMubD1bXTt0aGlzLnp1PW5ldyBHKCk7dGhpcy5rcj10aGlzLkx3PXRoaXMuS3c9bnVsbDt0aGlzLmF1PU5hTjt0aGlzLlA9bnVsbDt9b2EoUyxUKTtTLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZD1mdW5jdGlvbihhKXtULnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZC5jYWxsKHRoaXMsYSk7YS5UYT10aGlzLlRhJi0xMTM7YS5QZT10aGlzLlBlO2EuRm49dGhpcy5GbjthLmZmPXRoaXMuZmY7YS5CcD10aGlzLkJwO2EuTG09dGhpcy5MbTthLmduPXRoaXMuZ247YS5rbj10aGlzLmtuO2EubG49dGhpcy5sbjthLkVqPXRoaXMuRWo7YS5wcD10aGlzLnBwO251bGwhPT10aGlzLlAmJihhLlA9dGhpcy5QLmNvcHkoKSk7fTt0PVMucHJvdG90eXBlO3QubWY9ZnVuY3Rpb24oYSl7VC5wcm90b3R5cGUubWYuY2FsbCh0aGlzLGEpO3RoaXMuUGU9YS5QZTt0aGlzLmZmPWEuZmY7YS5YZz1udWxsO2EuUmEoKTthLnhmPXRoaXMueGY7dmFyIGI9YS5mcm9tUG9ydDtudWxsIT09YiYmeW8oYS5mcm9tTm9kZSxiKTtiPWEudG9Qb3J0O251bGwhPT1iJiZ5byhhLnRvTm9kZSxiKTt9O3QuZmI9ZnVuY3Rpb24oYSl7YS5jbGFzc1R5cGU9PT1TPzI9PT0oYS52YWx1ZSYyKT90aGlzLnJvdXRpbmc9YTphPT09Umd8fGE9PT1OZ3x8YT09PU1nP3RoaXMuY3VydmU9YTphPT09TW98fGE9PT1Ob3x8YT09PU9vP3RoaXMuYWRqdXN0aW5nPWE6YSE9PUxvJiZhIT09T2cmJkEoIlVua25vd24gTGluayBlbnVtIHZhbHVlIGZvciBhIExpbmsgcHJvcGVydHk6ICIrYSk6VC5wcm90b3R5cGUuZmIuY2FsbCh0aGlzLGEpO307dC5IYz1mdW5jdGlvbigpe251bGw9PT10aGlzLlAmJih0aGlzLlA9bmV3IFVrKCkpO307dC5QaT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZnJvbU5vZGU7aWYobnVsbCE9PWEpe3ZhciBiPWEuZmluZFZpc2libGVOb2RlKCk7bnVsbCE9PWImJihhPWIpO2lmKHBqKGEpfHxxaihhKSlyZXR1cm4hMTt9YT10aGlzLnRvTm9kZTtyZXR1cm4gbnVsbCE9PWEmJihiPWEuZmluZFZpc2libGVOb2RlKCksbnVsbCE9PWImJihhPWIpLHBqKGEpfHxxaihhKSk/ITE6ITA7fTt0Lkt2PWZ1bmN0aW9uKCl7cmV0dXJuITE7fTt0Lkx2PWZ1bmN0aW9uKCl7fTt0LkxiPWZ1bmN0aW9uKCl7cmV0dXJuITE7fTtTLnByb3RvdHlwZS5jb21wdXRlQW5nbGU9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTLmNvbXB1dGVBbmdsZShiLGMpO307Uy5jb21wdXRlQW5nbGU9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7ZGVmYXVsdDpjYXNlIE9nOmE9MDticmVhaztjYXNlIHNuOmE9YjticmVhaztjYXNlIERtOmE9Yis5MDticmVhaztjYXNlIEZtOmE9Yi05MDticmVhaztjYXNlIFBvOmE9YisxODA7YnJlYWs7Y2FzZSBRbzphPUguZ3EoYik7OTA8YSYmMjcwPmEmJihhLT0xODApO2JyZWFrO2Nhc2UgRW06YT1ILmdxKGIrOTApOzkwPGEmJjI3MD5hJiYoYS09MTgwKTticmVhaztjYXNlIEdtOmE9SC5ncShiLTkwKTs5MDxhJiYyNzA+YSYmKGEtPTE4MCk7YnJlYWs7Y2FzZSBIbTphPUguZ3EoYik7aWYoNDU8YSYmMTM1PmF8fDIyNTxhJiYzMTU+YSlyZXR1cm4gMDs5MDxhJiYyNzA+YSYmKGEtPTE4MCk7fXJldHVybiBILmdxKGEpO307ZnVuY3Rpb24gdW8oYSl7dmFyIGI9YS5mcm9tTm9kZSxjPWEudG9Ob2RlLGQ9bnVsbDtudWxsIT09Yj9kPW51bGwhPT1jP2IuaHgoYyk6Yi5jb250YWluaW5nR3JvdXA6bnVsbCE9PWM/ZD1jLmNvbnRhaW5pbmdHcm91cDpkPW51bGw7Yj1kO2M9YS5SaDtpZihjIT09Yil7bnVsbCE9PWMmJnBvKGMsYSk7YS5SaD1iO251bGwhPT1iJiZvbyhiLGEpO3ZhciBlPWEuY29udGFpbmluZ0dyb3VwQ2hhbmdlZDtpZihudWxsIT09ZSl7dmFyIGY9ITAsZz1hLmRpYWdyYW07bnVsbCE9PWcmJihmPWcuZGEsZy5kYT0hMCk7ZShhLGMsYik7bnVsbCE9PWcmJihnLmRhPWYpO30hYS5MY3x8YS5LdyE9PWMmJmEuTHchPT1jfHxhLlJhKCk7fWlmKGEuaXNMYWJlbGVkTGluaylmb3IoYT1hLmxhYmVsTm9kZXM7YS5uZXh0KCk7KXthLnZhbHVlLmNvbnRhaW5pbmdHcm91cD1kO319dD1TLnByb3RvdHlwZTt0LnloPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jb250YWluaW5nR3JvdXA7bnVsbCE9PWEmJnRoaXMuZnJvbU5vZGUhPT1hJiZ0aGlzLnRvTm9kZSE9PWEmJmEuY29tcHV0ZXNCb3VuZHNJbmNsdWRpbmdMaW5rcyYmVC5wcm90b3R5cGUueWguY2FsbCh0aGlzKTt9O3QuWHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5mcm9tTm9kZTtyZXR1cm4gYT09PWI/dGhpcy50b05vZGU6Yjt9O3QuZXo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5mcm9tUG9ydDtyZXR1cm4gYT09PWI/dGhpcy50b1BvcnQ6Yjt9O2Z1bmN0aW9uIEJvKGEsYil7bnVsbD09PWEuJGMmJihhLiRjPW5ldyBGKCkpO2EuJGMuYWRkKGIpO2EucygpO310LllwPWZ1bmN0aW9uKGEpe1QucHJvdG90eXBlLllwLmNhbGwodGhpcyxhKTtSbyh0aGlzKSYmdGhpcy4kcCh0aGlzLmFjdHVhbEJvdW5kcyk7aWYoIWEpe2E9dGhpcy5PZTt2YXIgYj1udWxsO251bGwhPT1hJiYoYj10aGlzLmZyb21Qb3J0LHpvKGEsdGhpcyxiKSk7dmFyIGM9dGhpcy5lZjtpZihudWxsIT09Yyl7dmFyIGQ9dGhpcy50b1BvcnQ7Yz09PWEmJmQ9PT1ifHx6byhjLHRoaXMsZCk7fVNvKHRoaXMpO319O3QuWnA9ZnVuY3Rpb24oYSl7VC5wcm90b3R5cGUuWnAuY2FsbCh0aGlzLGEpO1JvKHRoaXMpJiZ0aGlzLiRwKHRoaXMuYWN0dWFsQm91bmRzKTtpZighYSl7YT10aGlzLk9lO3ZhciBiPW51bGw7bnVsbCE9PWEmJihiPXRoaXMuZnJvbVBvcnQsQW8oYSx0aGlzLGIpKTt2YXIgYz10aGlzLmVmO2lmKG51bGwhPT1jKXt2YXIgZD10aGlzLnRvUG9ydDtjPT09YSYmZD09PWJ8fEFvKGMsdGhpcyxkKTt9VG8odGhpcyk7fX07dC5Zaj1mdW5jdGlvbigpe3RoaXMuTGM9ITA7aWYobnVsbCE9PXRoaXMuJGMpe3ZhciBhPXRoaXMuZGlhZ3JhbTtpZihudWxsIT09YSlmb3IodmFyIGI9dGhpcy4kYy5jb3B5KCkuaXRlcmF0b3I7Yi5uZXh0KCk7KXthLnJlbW92ZShiLnZhbHVlKTt9fW51bGwhPT10aGlzLmRhdGEmJihhPXRoaXMuZGlhZ3JhbSxudWxsIT09YSYmYS5wYXJ0TWFuYWdlci5yZW1vdmVEYXRhRm9yTGluayh0aGlzKSk7fTtTLnByb3RvdHlwZS51cGRhdGVSZWxhdGlvbnNoaXBzRnJvbURhdGE9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5kYXRhKXt2YXIgYT10aGlzLmRpYWdyYW07bnVsbCE9PWEmJmEucGFydE1hbmFnZXIudXBkYXRlUmVsYXRpb25zaGlwc0Zyb21EYXRhKHRoaXMpO319O1MucHJvdG90eXBlLm1vdmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iP3RoaXMubG9jYXRpb246dGhpcy5wb3NpdGlvbixkPWMueDtpc05hTihkKSYmKGQ9MCk7dmFyIGU9Yy55O2lzTmFOKGUpJiYoZT0wKTtkPWEueC1kO2U9YS55LWU7ITA9PT1iP1QucHJvdG90eXBlLm1vdmUuY2FsbCh0aGlzLGEsITEpOihhPUcuYWxsb2NBdChjLngrZCxjLnkrZSksVC5wcm90b3R5cGUubW92ZS5jYWxsKHRoaXMsYSwhMSksRy5mcmVlKGEpKTskZih0aGlzLGQsZSk7Zm9yKGE9dGhpcy5sYWJlbE5vZGVzO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGM9Yi5wb3NpdGlvbixiLm1vdmVUbyhjLngrZCxjLnkrZSk7fX07Uy5wcm90b3R5cGUuY2FuUmVsaW5rRnJvbT1mdW5jdGlvbigpe2lmKCF0aGlzLnJlbGlua2FibGVGcm9tKXJldHVybiExO3ZhciBhPXRoaXMubGF5ZXI7aWYobnVsbD09PWEpcmV0dXJuITA7aWYoIWEuYWxsb3dSZWxpbmspcmV0dXJuITE7YT1hLmRpYWdyYW07cmV0dXJuIG51bGw9PT1hfHxhLmFsbG93UmVsaW5rPyEwOiExO307Uy5wcm90b3R5cGUuY2FuUmVsaW5rVG89ZnVuY3Rpb24oKXtpZighdGhpcy5yZWxpbmthYmxlVG8pcmV0dXJuITE7dmFyIGE9dGhpcy5sYXllcjtpZihudWxsPT09YSlyZXR1cm4hMDtpZighYS5hbGxvd1JlbGluaylyZXR1cm4hMTthPWEuZGlhZ3JhbTtyZXR1cm4gbnVsbD09PWF8fGEuYWxsb3dSZWxpbms/ITA6ITE7fTtTLnByb3RvdHlwZS5jb21wdXRlTWlkUG9pbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wb2ludHNDb3VudDtpZigwPT09YilyZXR1cm4gYS5hc3NpZ24oZWMpLGE7aWYoMT09PWIpcmV0dXJuIGEuYXNzaWduKHRoaXMuaSgwKSksYTtpZigyPT09Yil7dmFyIGM9dGhpcy5pKDApLGQ9dGhpcy5pKDEpO2EuaCgoYy54K2QueCkvMiwoYy55K2QueSkvMik7cmV0dXJuIGE7fWlmKHRoaXMuaXNPcnRob2dvbmFsJiYoMTU8PXRoaXMuY29tcHV0ZUNvcm5lcigpfHx0aGlzLmNvbXB1dGVDdXJ2ZSgpPT09UmcpKXJldHVybiB0aGlzLnFhLmN2KC41LGEpLGEuYWRkKHRoaXMuaSgwKSksYz10aGlzLnFhLmZpZ3VyZXMuZmlyc3QoKSxhLm9mZnNldCgtYy5zdGFydFgsLWMuc3RhcnRZKSxhO2lmKHRoaXMuY29tcHV0ZUN1cnZlKCk9PT1SZyl7aWYoMz09PWIpcmV0dXJuIHRoaXMuaSgxKTtkPShiLTEpLzN8MDtjPTMqKGQvMnwwKTtpZigxPT09ZCUyKXtkPXRoaXMuaShjKTt2YXIgZT10aGlzLmkoYysxKSxmPXRoaXMuaShjKzIpO2M9dGhpcy5pKGMrMyk7SC5xeShkLngsZC55LGUueCxlLnksZi54LGYueSxjLngsYy55LGEpO31lbHNlIGEuYXNzaWduKHRoaXMuaShjKSk7cmV0dXJuIGE7fXZhciBnPXRoaXMuZmxhdHRlbmVkTGVuZ3RocztjPXRoaXMuZmxhdHRlbmVkVG90YWxMZW5ndGg7Zm9yKGU9Zj1kPTA7ZDxjLzImJmY8Yjspe2U9Z1tmXTtpZihkK2U+Yy8yKWJyZWFrO2QrPWU7ZisrO31iPXRoaXMuaShmKTtmPXRoaXMuaShmKzEpOzE+TWF0aC5hYnMoYi54LWYueCk/Yi55PmYueT9hLmgoYi54LGIueS0oYy8yLWQpKTphLmgoYi54LGIueSsoYy8yLWQpKToxPk1hdGguYWJzKGIueS1mLnkpP2IueD5mLng/YS5oKGIueC0oYy8yLWQpLGIueSk6YS5oKGIueCsoYy8yLWQpLGIueSk6KGM9KGMvMi1kKS9lLGEuaChiLngrYyooZi54LWIueCksYi55K2MqKGYueS1iLnkpKSk7cmV0dXJuIGE7fTtTLnByb3RvdHlwZS5jb21wdXRlTWlkQW5nbGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBvaW50c0NvdW50O2lmKDI+YSlyZXR1cm4gTmFOO2lmKDI9PT1hKXJldHVybiB0aGlzLmkoMCkuV2EodGhpcy5pKDEpKTtpZih0aGlzLmlzT3J0aG9nb25hbCYmKDE1PD10aGlzLmNvbXB1dGVDb3JuZXIoKXx8dGhpcy5jb21wdXRlQ3VydmUoKT09PVJnKSl7YTp7YT10aGlzLnFhO3ZhciBiPS41OzA+Yj9iPTA6MTxiJiYoYj0xKTtpZihhLnR5cGU9PT1jZSlhPTE4MCpNYXRoLmF0YW4yKGEuZW5kWS1hLnN0YXJ0WSxhLmVuZFgtYS5zdGFydFgpL01hdGguUEk7ZWxzZXt2YXIgYz1hLmZsYXR0ZW5lZFNlZ21lbnRzLGQ9YS5mbGF0dGVuZWRMZW5ndGhzLGU9Yy5sZW5ndGg7Yj1hLmZsYXR0ZW5lZFRvdGFsTGVuZ3RoKmI7Zm9yKHZhciBmPTAsZz0wO2c8ZTtnKyspe3ZhciBoPWRbZ10saz1oLmxlbmd0aDtmb3IoYT0wO2E8azthKyspe3ZhciBsPWhbYV07aWYoZitsPj1iKXtiPWNbZ107Yz1iWzIqYV07ZD1iWzIqYSsxXTtlPWJbMiphKzJdO2E9YlsyKmErM107YT0xPk1hdGguYWJzKGUtYykmJjE+TWF0aC5hYnMoYS1kKT8wOjE+TWF0aC5hYnMoZS1jKT8wPD1hLWQ/OTA6MjcwOjE+TWF0aC5hYnMoYS1kKT8wPD1lLWM/MDoxODA6MTgwKk1hdGguYXRhbjIoYS1kLGUtYykvTWF0aC5QSTticmVhayBhO31mKz1sO319YT1OYU47fX1yZXR1cm4gYTt9aWYodGhpcy5jb21wdXRlQ3VydmUoKT09PVJnJiY0PD1hKXtkPShhLTEpLzN8MDtjPTMqKGQvMnwwKTtpZigxPT09ZCUyKXJldHVybiBjPU1hdGguZmxvb3IoYyksYT10aGlzLmkoYyksZD10aGlzLmkoYysxKSxlPXRoaXMuaShjKzIpLGM9dGhpcy5pKGMrMyksSC5weShhLngsYS55LGQueCxkLnksZS54LGUueSxjLngsYy55KTtpZigwPGMmJmMrMTxhKXJldHVybiB0aGlzLmkoYy0xKS5XYSh0aGlzLmkoYysxKSk7fWQ9dGhpcy5mbGF0dGVuZWRMZW5ndGhzO2U9dGhpcy5mbGF0dGVuZWRUb3RhbExlbmd0aDtmb3IoYz1iPTA7YjxlLzImJmM8YTspe2Y9ZFtjXTtpZihiK2Y+ZS8yKWJyZWFrO2IrPWY7YysrO31kPXRoaXMuaShjKTtlPXRoaXMuaShjKzEpO2lmKDE+TWF0aC5hYnMoZC54LWUueCkmJjE+TWF0aC5hYnMoZC55LWUueSkpe2lmKDA8YyYmYysyPGEpcmV0dXJuIHRoaXMuaShjLTEpLldhKHRoaXMuaShjKzIpKTt9ZWxzZXtpZigxPk1hdGguYWJzKGQueC1lLngpKXJldHVybiBkLnk+ZS55PzI3MDo5MDtpZigxPk1hdGguYWJzKGQueS1lLnkpKXJldHVybiBkLng+ZS54PzE4MDowO31yZXR1cm4gZC5XYShlKTt9O3Q9Uy5wcm90b3R5cGU7dC5pPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnhiLmpbYV07fTt0LmpkPWZ1bmN0aW9uKGEsYil7dGhpcy54Yi5nZChhLGIpO307dC5NPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnhiLmdkKGEsbmV3IEcoYixjKSk7fTt0Lm96PWZ1bmN0aW9uKGEsYil7dGhpcy54Yi5JYihhLGIpO307dC5tPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnhiLkliKGEsbmV3IEcoYixjKSk7fTt0LnhlPWZ1bmN0aW9uKGEpe3RoaXMueGIuYWRkKGEpO307dC5qZj1mdW5jdGlvbihhLGIpe3RoaXMueGIuYWRkKG5ldyBHKGEsYikpO307dC56dj1mdW5jdGlvbihhKXt0aGlzLnhiLm1iKGEpO307dC5Uaj1mdW5jdGlvbigpe3RoaXMueGIuY2xlYXIoKTt9O2Z1bmN0aW9uICRmKGEsYixjKXtpZigwIT09Ynx8MCE9PWMpe2Zvcih2YXIgZD1hLkxjLGU9bmV3IEUoKSxmPWEueGIuaXRlcmF0b3I7Zi5uZXh0KCk7KXt2YXIgZz1mLnZhbHVlO2UuYWRkKG5ldyBHKGcueCtiLGcueStjKS5mcmVlemUoKSk7fWUuZnJlZXplKCk7Zj1hLnhiO2EueGI9ZTtpc05hTihiKXx8aXNOYU4oYyl8fGEuZGlhZ3JhbS5hbmltYXRpb25NYW5hZ2VyLnJiP2EucygpOihhLk9mLmgoYS5PZi54K2IsYS5PZi55K2MpLGEuc2EuaChhLnNhLngrYixhLnNhLnkrYyksdGwoYSkpO2QmJlVvKGEpO2I9YS5kaWFncmFtO251bGwhPT1iJiZiLmFuaW1hdGlvbk1hbmFnZXIucmImJihhLmJoPWUpO2EuZygicG9pbnRzIixmLGUpO319dC5CaD1mdW5jdGlvbigpe251bGw9PT10aGlzLlhnJiYodGhpcy5YZz10aGlzLnhiLHRoaXMueGI9dGhpcy54Yi5jb3B5KCkpO307dC5rZj1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLlhnKXtmb3IodmFyIGE9dGhpcy5YZyxiPXRoaXMueGIsYz1JbmZpbml0eSxkPUluZmluaXR5LGU9YS5qLGY9ZS5sZW5ndGgsZz0wO2c8ZjtnKyspe3ZhciBoPWVbZ107Yz1NYXRoLm1pbihoLngsYyk7ZD1NYXRoLm1pbihoLnksZCk7fWg9Zz1JbmZpbml0eTtmb3IodmFyIGs9Yi5qLGw9ay5sZW5ndGgsbT0wO208bDttKyspe3ZhciBuPWtbbV07Zz1NYXRoLm1pbihuLngsZyk7aD1NYXRoLm1pbihuLnksaCk7bi5mcmVlemUoKTt9Yi5mcmVlemUoKTtpZihsPT09Zilmb3IoZj0wO2Y8bDtmKyspe2lmKG09ZVtmXSxuPWtbZl0sbS54LWMhPT1uLngtZ3x8bS55LWQhPT1uLnktaCl7dGhpcy5zKCk7dGhpcy5iYygpO2JyZWFrO319ZWxzZSB0aGlzLnMoKSx0aGlzLmJjKCk7dGhpcy5YZz1udWxsO2M9dGhpcy5kaWFncmFtO251bGwhPT1jJiZjLmFuaW1hdGlvbk1hbmFnZXIucmImJih0aGlzLmJoPWIpO1VvKHRoaXMpO3RoaXMuZygicG9pbnRzIixhLGIpO319O3QuQ3g9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5YZyYmKHRoaXMueGI9dGhpcy5YZyx0aGlzLlhnPW51bGwpO307ZnVuY3Rpb24gVW8oYSl7MD09PWEueGIuY291bnQ/YS5MYz0hMTooYS5MYz0hMCxhLmtyPW51bGwsYS5hdT1OYU4sYS5kZWZhdWx0RnJvbVBvaW50PWEuaSgwKSxhLmRlZmF1bHRUb1BvaW50PWEuaShhLnBvaW50c0NvdW50LTEpLFZvKGEsITEpKTt9dC5SYT1mdW5jdGlvbigpe2lmKCF0aGlzLnN1c3BlbmRzUm91dGluZyl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKGEpe2lmKGEuZ3QuY29udGFpbnModGhpcyl8fGEudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZylyZXR1cm47YT1hLmFuaW1hdGlvbk1hbmFnZXI7aWYoYS5pc1RpY2tpbmcmJiFhLmlzQW5pbWF0aW5nKXJldHVybjtudWxsIT09dGhpcy5iaCYmIWEuaXNUaWNraW5nJiZhLmlzQW5pbWF0aW5nJiYodGhpcy5iaD1udWxsKTt9YT10aGlzLnBhdGg7bnVsbCE9PWEmJih0aGlzLkxjPSExLHRoaXMucygpLGEucygpKTt9fTt0LllpPWZ1bmN0aW9uKCl7aWYoIXRoaXMuTGMmJiF0aGlzLk91KXt2YXIgYT0hMDt0cnl7dGhpcy5PdT0hMCx0aGlzLkJoKCksYT10aGlzLmNvbXB1dGVQb2ludHMoKTt9ZmluYWxseXt0aGlzLk91PSExLGE/dGhpcy5rZigpOnRoaXMuQ3goKTt9fX07Uy5wcm90b3R5cGUuY29tcHV0ZVBvaW50cz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbTtpZihudWxsPT09YSlyZXR1cm4hMTt2YXIgYj10aGlzLmZyb21Ob2RlLGM9bnVsbDtudWxsPT09Yj8oYS5vaXx8KGEuWm89bmV3IFcoKSxhLlpvLmRlc2lyZWRTaXplPWZjLGEuWm8uc3Ryb2tlV2lkdGg9MCxhLm9pPW5ldyBWKCksYS5vaS5hZGQoYS5abyksYS5vaS5hYygpKSx0aGlzLmRlZmF1bHRGcm9tUG9pbnQmJihhLm9pLnBvc2l0aW9uPWEub2kubG9jYXRpb249dGhpcy5kZWZhdWx0RnJvbVBvaW50LGEub2kuYWMoKSxiPWEub2ksYz1hLlpvKSk6Yz10aGlzLmZyb21Qb3J0O2lmKG51bGwhPT1jJiYhYi5pc1Zpc2libGUoKSl7dmFyIGQ9Yi5maW5kVmlzaWJsZU5vZGUoKTtudWxsIT09ZCYmZCE9PWI/KGI9ZCxjPWQucG9ydCk6Yj1kO310aGlzLkt3PWI7aWYobnVsbD09PWJ8fCFiLmxvY2F0aW9uLm8oKSlyZXR1cm4hMTtmb3IoOyEobnVsbD09PWN8fGMuYWN0dWFsQm91bmRzLm8oKSYmYy5yZigpKTspe2M9Yy5wYW5lbDt9aWYobnVsbD09PWMpcmV0dXJuITE7dmFyIGU9dGhpcy50b05vZGUsZj1udWxsO251bGw9PT1lPyhhLnBpfHwoYS4kbz1uZXcgVygpLGEuJG8uZGVzaXJlZFNpemU9ZmMsYS4kby5zdHJva2VXaWR0aD0wLGEucGk9bmV3IFYoKSxhLnBpLmFkZChhLiRvKSxhLnBpLmFjKCkpLHRoaXMuZGVmYXVsdFRvUG9pbnQmJihhLnBpLnBvc2l0aW9uPWEucGkubG9jYXRpb249dGhpcy5kZWZhdWx0VG9Qb2ludCxhLnBpLmFjKCksZT1hLnBpLGY9YS4kbykpOmY9dGhpcy50b1BvcnQ7bnVsbD09PWZ8fGUuaXNWaXNpYmxlKCl8fChhPWUuZmluZFZpc2libGVOb2RlKCksbnVsbCE9PWEmJmEhPT1lPyhlPWEsZj1hLnBvcnQpOmU9YSk7dGhpcy5Mdz1lO2lmKG51bGw9PT1lfHwhZS5sb2NhdGlvbi5vKCkpcmV0dXJuITE7Zm9yKDshKG51bGw9PT1mfHxmLmFjdHVhbEJvdW5kcy5vKCkmJmYucmYoKSk7KXtmPWYucGFuZWw7fWlmKG51bGw9PT1mKXJldHVybiExO3ZhciBnPXRoaXMucG9pbnRzQ291bnQ7ZD10aGlzLmNvbXB1dGVTcG90KCEwLGMpO2E9dGhpcy5jb21wdXRlU3BvdCghMSxmKTt2YXIgaD1XbyhkKSxrPVdvKGEpLGw9Yz09PWYmJm51bGwhPT1jLG09dGhpcy5pc09ydGhvZ29uYWwsbj10aGlzLmN1cnZlPT09Umc7dGhpcy5HZj1sJiYhbT9uPSEwOiExO3ZhciBwPXRoaXMuYWRqdXN0aW5nPT09T2d8fGw7aWYoIW0mJiFsJiZoJiZrKXtpZihoPSExLCFwJiYzPD1nJiYocD10aGlzLmdldExpbmtQb2ludChiLGMsZCwhMCwhMSxlLGYpLGs9dGhpcy5nZXRMaW5rUG9pbnQoZSxmLGEsITEsITEsYixjKSxoPXRoaXMuYWRqdXN0UG9pbnRzKDAscCxnLTEsaykpJiYocD10aGlzLmdldExpbmtQb2ludChiLGMsZCwhMCwhMSxlLGYpLGs9dGhpcy5nZXRMaW5rUG9pbnQoZSxmLGEsITEsITEsYixjKSx0aGlzLmFkanVzdFBvaW50cygwLHAsZy0xLGspKSwhaClpZih0aGlzLlRqKCksbil7Zz10aGlzLmdldExpbmtQb2ludChiLGMsZCwhMCwhMSxlLGYpO3A9dGhpcy5nZXRMaW5rUG9pbnQoZSxmLGEsITEsITEsYixjKTtoPXAueC1nLng7az1wLnktZy55O2w9dGhpcy5jb21wdXRlQ3VydmluZXNzKCk7bj1tPTA7dmFyIHE9Zy54K2gvMyxyPWcueStrLzMsdT1xLHg9cjtILncoaywwKT94PTA8aD94LWw6eCtsOihtPS1oL2ssbj1NYXRoLnNxcnQobCpsLyhtKm0rMSkpLDA+bCYmKG49LW4pLHU9KDA+az8tMToxKSpuK3EseD1tKih1LXEpK3IpO3E9Zy54KzIqaC8zO3I9Zy55KzIqay8zO3ZhciB2PXEseT1yO0gudyhrLDApP3k9MDxoP3ktbDp5K2w6KHY9KDA+az8tMToxKSpuK3EseT1tKih2LXEpK3IpO3RoaXMuVGooKTt0aGlzLnhlKGcpO3RoaXMuamYodSx4KTt0aGlzLmpmKHYseSk7dGhpcy54ZShwKTt0aGlzLmpkKDAsdGhpcy5nZXRMaW5rUG9pbnQoYixjLGQsITAsITEsZSxmKSk7dGhpcy5qZCgzLHRoaXMuZ2V0TGlua1BvaW50KGUsZixhLCExLCExLGIsYykpO31lbHNlIGQ9dGhpcy5nZXRMaW5rUG9pbnQoYixjLGQsITAsITEsZSxmKSxhPXRoaXMuZ2V0TGlua1BvaW50KGUsZixhLCExLCExLGIsYyksdGhpcy5oYXNDdXJ2aW5lc3MoKT8ocD1hLngtZC54LGU9YS55LWQueSxmPXRoaXMuY29tcHV0ZUN1cnZpbmVzcygpLGI9ZC54K3AvMixjPWQueStlLzIsZz1iLGg9YyxILncoZSwwKT9oPTA8cD9oLWY6aCtmOihwPS1wL2UsZz1NYXRoLnNxcnQoZipmLyhwKnArMSkpLDA+ZiYmKGc9LWcpLGc9KDA+ZT8tMToxKSpnK2IsaD1wKihnLWIpK2MpLHRoaXMueGUoZCksdGhpcy5qZihnLGgpKTp0aGlzLnhlKGQpLHRoaXMueGUoYSk7fWVsc2V7bj10aGlzLmlzQXZvaWRpbmc7cCYmKG0mJm58fGwpJiZ0aGlzLlRqKCk7dmFyIHo9bD90aGlzLmNvbXB1dGVDdXJ2aW5lc3MoKTowO249dGhpcy5nZXRMaW5rUG9pbnQoYixjLGQsITAsbSxlLGYpO3E9dT1yPTA7aWYobXx8IWh8fGwpeD10aGlzLmNvbXB1dGVFbmRTZWdtZW50TGVuZ3RoKGIsYyxkLCEwKSxxPXRoaXMuZ2V0TGlua0RpcmVjdGlvbihiLGMsbixkLCEwLG0sZSxmKSxsJiYoaHx8ZC5BKGEpfHwhbSYmMT09PWQueCthLngmJjE9PT1kLnkrYS55KSYmKHEtPW0/OTA6MzAsMD56JiYocS09MTgwKSksMD5xP3ErPTM2MDozNjA8PXEmJihxLT0zNjApLGwmJih4Kz1NYXRoLmFicyh6KSoobT8xOjIpKSwwPT09cT9yPXg6OTA9PT1xP3U9eDoxODA9PT1xP3I9LXg6MjcwPT09cT91PS14OihyPXgqTWF0aC5jb3MocSpNYXRoLlBJLzE4MCksdT14Kk1hdGguc2luKHEqTWF0aC5QSS8xODApKSxkLmpjKCkmJmwmJih4PWMubWEoZGQsRy5hbGxvYygpKSx2PUcuYWxsb2NBdCh4LngrMUUzKnIseC55KzFFMyp1KSx0aGlzLmdldExpbmtQb2ludEZyb21Qb2ludChiLGMseCx2LCEwLG4pLEcuZnJlZSh4KSxHLmZyZWUodikpO3g9dGhpcy5nZXRMaW5rUG9pbnQoZSxmLGEsITEsbSxiLGMpO3ZhciBCPXk9dj0wO2lmKG18fCFrfHxsKXt2YXIgQz10aGlzLmNvbXB1dGVFbmRTZWdtZW50TGVuZ3RoKGUsZixhLCExKTtCPXRoaXMuZ2V0TGlua0RpcmVjdGlvbihlLGYseCxhLCExLG0sYixjKTtsJiYoa3x8ZC5BKGEpfHwhbSYmMT09PWQueCthLngmJjE9PT1kLnkrYS55KSYmKEIrPW0/MDozMCwwPnomJihCKz0xODApKTswPkI/Qis9MzYwOjM2MDw9QiYmKEItPTM2MCk7bCYmKEMrPU1hdGguYWJzKHopKihtPzE6MikpOzA9PT1CP3Y9Qzo5MD09PUI/eT1DOjE4MD09PUI/dj0tQzoyNzA9PT1CP3k9LUM6KHY9QypNYXRoLmNvcyhCKk1hdGguUEkvMTgwKSx5PUMqTWF0aC5zaW4oQipNYXRoLlBJLzE4MCkpO2EuamMoKSYmbCYmKGE9Zi5tYShkZCxHLmFsbG9jKCkpLGQ9Ry5hbGxvY0F0KGEueCsxRTMqdixhLnkrMUUzKnkpLHRoaXMuZ2V0TGlua1BvaW50RnJvbVBvaW50KGUsZixhLGQsITEseCksRy5mcmVlKGEpLEcuZnJlZShkKSk7fWE9bjtpZihtfHwhaHx8bClhPW5ldyBHKG4ueCtyLG4ueSt1KTtkPXg7aWYobXx8IWt8fGwpZD1uZXcgRyh4Lngrdix4LnkreSk7IXAmJiFtJiZoJiYzPGcmJnRoaXMuYWRqdXN0UG9pbnRzKDAsbixnLTIsZCk/dGhpcy5qZChnLTEseCk6IXAmJiFtJiZrJiYzPGcmJnRoaXMuYWRqdXN0UG9pbnRzKDEsYSxnLTEseCk/dGhpcy5qZCgwLG4pOiFwJiYobT82PD1nOjQ8ZykmJnRoaXMuYWRqdXN0UG9pbnRzKDEsYSxnLTIsZCk/KHRoaXMuamQoMCxuKSx0aGlzLmpkKGctMSx4KSk6KHRoaXMuVGooKSx0aGlzLnhlKG4pLChtfHwhaHx8bCkmJnRoaXMueGUoYSksbSYmdGhpcy5hZGRPcnRob1BvaW50cyhhLHEsZCxCLGIsZSksKG18fCFrfHxsKSYmdGhpcy54ZShkKSx0aGlzLnhlKHgpKTt9cmV0dXJuITA7fTtmdW5jdGlvbiBYbyhhLGIpe01hdGguYWJzKGIueC1hLngpPk1hdGguYWJzKGIueS1hLnkpPyhiLng+PWEueD9iLng9YS54KzlFOTpiLng9YS54LTlFOSxiLnk9YS55KTooYi55Pj1hLnk/Yi55PWEueSs5RTk6Yi55PWEueS05RTksYi54PWEueCk7cmV0dXJuIGI7fVMucHJvdG90eXBlLmdldExpbmtQb2ludEZyb21Qb2ludD1mdW5jdGlvbihhLGIsYyxkLGUsZil7dm9pZCAwPT09ZiYmKGY9bmV3IEcoKSk7aWYobnVsbD09PWF8fG51bGw9PT1iKXJldHVybiBmLmFzc2lnbihjKSxmO2EuaXNWaXNpYmxlKCl8fChlPWEuZmluZFZpc2libGVOb2RlKCksbnVsbCE9PWUmJmUhPT1hJiYoYj1lLnBvcnQpKTthPW51bGw7ZT1iLnBhbmVsO251bGw9PT1lfHxlLlpkKCl8fChlPWUucGFuZWwpO2lmKG51bGw9PT1lKXtlPWQueDtkPWQueTt2YXIgZz1jLng7Yz1jLnk7fWVsc2V7YT1lLnJkO2U9MS8oYS5tMTEqYS5tMjItYS5tMTIqYS5tMjEpO2c9YS5tMjIqZTt2YXIgaD0tYS5tMTIqZSxrPS1hLm0yMSplLGw9YS5tMTEqZSxtPWUqKGEubTIxKmEuZHktYS5tMjIqYS5keCksbj1lKihhLm0xMiphLmR4LWEubTExKmEuZHkpO2U9ZC54KmcrZC55KmsrbTtkPWQueCpoK2QueSpsK247Zz1jLngqZytjLnkqayttO2M9Yy54KmgrYy55Kmwrbjt9Yi5iayhlLGQsZyxjLGYpO251bGwhPT1hJiZmLnRyYW5zZm9ybShhKTtyZXR1cm4gZjt9O2Z1bmN0aW9uIFlvKGEsYil7dmFyIGM9Yi5QbztudWxsPT09YyYmKGM9bmV3IFpvKCksYy5wb3J0PWIsYy5ub2RlPWIucGFydCxiLlBvPWMpO3JldHVybiAkbyhjLGEpO31TLnByb3RvdHlwZS5nZXRMaW5rUG9pbnQ9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXt2b2lkIDA9PT1oJiYoaD1uZXcgRygpKTtpZihjLmdiKCkmJiFXbyhjKSlyZXR1cm4gYi5tYShjLGgpLGg7aWYoYy5xZigpKXt2YXIgaz1Zbyh0aGlzLGIpO2lmKG51bGwhPT1rKXtoLmFzc2lnbihrLmNxKTtpZihlJiZ0aGlzLnJvdXRpbmc9PT1hcCl7dmFyIGw9WW8odGhpcyxnKTtpZihudWxsIT09bCYmay5XbDxsLldsKXtrPUcuYWxsb2MoKTtsPUcuYWxsb2MoKTt2YXIgbT1uZXcgTihiLm1hKFRjLGspLGIubWEoaGQsbCkpLG49dGhpcy5jb21wdXRlU3BvdCghZCxnKTthPXRoaXMuZ2V0TGlua1BvaW50KGYsZyxuLCFkLGUsYSxiLGwpOyhjLnBmKGpkKXx8Yy5wZihwZCkpJiZhLnk+PW0ueSYmYS55PD1tLnkrbS5oZWlnaHQ/aC55PWEueTooYy5wZihpZCl8fGMucGYocWQpKSYmYS54Pj1tLngmJmEueDw9bS54K20ud2lkdGgmJihoLng9YS54KTtHLmZyZWUoayk7Ry5mcmVlKGwpO319cmV0dXJuIGg7fX1jPWIubWEoLjU9PT1jLngmJi41PT09Yy55P2M6ZGQsRy5hbGxvYygpKTt0aGlzLnBvaW50c0NvdW50PihlPzY6Mik/KGc9ZD90aGlzLmkoMSk6dGhpcy5pKHRoaXMucG9pbnRzQ291bnQtMiksZSYmKGc9WG8oYyxnLmNvcHkoKSkpKTooaz10aGlzLmNvbXB1dGVTcG90KCFkLGcpLGY9Ry5hbGxvYygpLGc9Zy5tYSguNT09PWsueCYmLjU9PT1rLnk/azpkZCxmKSxlJiYoZz1YbyhjLGcpKSxHLmZyZWUoZikpO3RoaXMuZ2V0TGlua1BvaW50RnJvbVBvaW50KGEsYixjLGcsZCxoKTtHLmZyZWUoYyk7cmV0dXJuIGg7fTtTLnByb3RvdHlwZS5nZXRMaW5rRGlyZWN0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7YTppZihkLmdiKCkpdmFyIGs9ZC54PmQueT9kLng+MS1kLnk/MDpkLng8MS1kLnk/MjcwOjMxNTpkLng8ZC55P2QueD4xLWQueT85MDpkLng8MS1kLnk/MTgwOjEzNTouNT5kLng/MjI1Oi41PGQueD80NTowO2Vsc2V7aWYoZC5xZigpJiYoaz1Zbyh0aGlzLGIpLG51bGwhPT1rKSlzd2l0Y2goay55Yyl7Y2FzZSAxOms9MjcwO2JyZWFrIGE7Y2FzZSAyOms9MTgwO2JyZWFrIGE7ZGVmYXVsdDpjYXNlIDQ6az0wO2JyZWFrIGE7Y2FzZSA4Oms9OTA7YnJlYWsgYTt9az1iLm1hKGRkLEcuYWxsb2MoKSk7dGhpcy5wb2ludHNDb3VudD4oZj82OjIpPyhoPWU/dGhpcy5pKDEpOnRoaXMuaSh0aGlzLnBvaW50c0NvdW50LTIpLGg9Zj9YbyhrLGguY29weSgpKTpjKTooYz1HLmFsbG9jKCksaD1oLm1hKGRkLGMpLEcuZnJlZShjKSk7Yz1NYXRoLmFicyhoLngtay54KT5NYXRoLmFicyhoLnktay55KT9oLng+PWsueD8wOjE4MDpoLnk+PWsueT85MDoyNzA7Ry5mcmVlKGspO2s9Yzt9ZC5qYygpJiZnLlZkKGEpJiYoays9MTgwLDM2MDw9ayYmKGstPTM2MCkpO2lmKFdvKGQpKXJldHVybiBrO2E9Yi5KaSgpO2lmKDA9PT1hKXJldHVybiBrOzQ1PD1hJiYxMzU+YT9rKz05MDoxMzU8PWEmJjIyNT5hP2srPTE4MDoyMjU8PWEmJjMxNT5hJiYoays9MjcwKTszNjA8PWsmJihrLT0zNjApO3JldHVybiBrO307Uy5wcm90b3R5cGUuY29tcHV0ZUVuZFNlZ21lbnRMZW5ndGg9ZnVuY3Rpb24oYSxiLGMsZCl7aWYobnVsbCE9PWImJmMucWYoKSYmKGE9WW8odGhpcyxiKSxudWxsIT09YSkpcmV0dXJuIGEuVHU7YT1kP3RoaXMuZnJvbUVuZFNlZ21lbnRMZW5ndGg6dGhpcy50b0VuZFNlZ21lbnRMZW5ndGg7bnVsbCE9PWImJmlzTmFOKGEpJiYoYT1kP2IuZnJvbUVuZFNlZ21lbnRMZW5ndGg6Yi50b0VuZFNlZ21lbnRMZW5ndGgpO2lzTmFOKGEpJiYoYT0xMCk7cmV0dXJuIGE7fTtTLnByb3RvdHlwZS5jb21wdXRlU3BvdD1mdW5jdGlvbihhLGIpe3ZvaWQgMD09PWImJihiPW51bGwpO2E/KGE9Yj9iOnRoaXMuZnJvbVBvcnQsbnVsbD09PWE/YT1kZDooYj10aGlzLmZyb21TcG90LGIuS2IoKSYmKGI9YS5mcm9tU3BvdCksYT1iPT09RWQ/U2M6YikpOihhPWI/Yjp0aGlzLnRvUG9ydCxudWxsPT09YT9hPWRkOihiPXRoaXMudG9TcG90LGIuS2IoKSYmKGI9YS50b1Nwb3QpLGE9Yj09PUVkP1NjOmIpKTtyZXR1cm4gYTt9O2Z1bmN0aW9uIFdvKGEpe3JldHVybiBhPT09U2N8fC41PT09YS54JiYuNT09PWEueTt9Uy5wcm90b3R5cGUuY29tcHV0ZU90aGVyUG9pbnQ9ZnVuY3Rpb24oYSxiKXthPWIubWEoZGQpO2I9Yi5QbztiPW51bGwhPT1iPyRvKGIsdGhpcyk6bnVsbDtudWxsIT09YiYmKGE9Yi5jcSk7cmV0dXJuIGE7fTtTLnByb3RvdHlwZS5jb21wdXRlU2hvcnRMZW5ndGg9ZnVuY3Rpb24oYSl7aWYoYSl7YT10aGlzLmZyb21TaG9ydExlbmd0aDtpZihpc05hTihhKSl7dmFyIGI9dGhpcy5mcm9tUG9ydDtudWxsIT09YiYmKGE9Yi5mcm9tU2hvcnRMZW5ndGgpO31yZXR1cm4gaXNOYU4oYSk/MDphO31hPXRoaXMudG9TaG9ydExlbmd0aDtpc05hTihhKSYmKGI9dGhpcy50b1BvcnQsbnVsbCE9PWImJihhPWIudG9TaG9ydExlbmd0aCkpO3JldHVybiBpc05hTihhKT8wOmE7fTtTLnByb3RvdHlwZS5tZz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoITE9PT10aGlzLnBpY2thYmxlKXJldHVybiExO3ZvaWQgMD09PWImJihiPW51bGwpO3ZvaWQgMD09PWMmJihjPW51bGwpO3ZhciBnPWY7dm9pZCAwPT09ZiYmKGc9UWMuYWxsb2MoKSxnLnJlc2V0KCkpO2cubXVsdGlwbHkodGhpcy50cmFuc2Zvcm0pO2lmKHRoaXMudWgoYSxnKSlyZXR1cm4gV20odGhpcyxiLGMsZSksdm9pZCAwPT09ZiYmUWMuZnJlZShnKSwhMDtpZih0aGlzLkljKGEsZykpe3ZhciBoPSExO2lmKCF0aGlzLmlzQXRvbWljKWZvcih2YXIgaz10aGlzLlkuaixsPWsubGVuZ3RoO2wtLTspe3ZhciBtPWtbbF07aWYobS52aXNpYmxlfHxtPT09dGhpcy5sb2NhdGlvbk9iamVjdCl7dmFyIG49bS5hY3R1YWxCb3VuZHMscD10aGlzLm5hdHVyYWxCb3VuZHM7aWYoIShuLng+cC53aWR0aHx8bi55PnAuaGVpZ2h0fHwwPm4ueCtuLndpZHRofHwwPm4ueStuLmhlaWdodCkpe249UWMuYWxsb2MoKTtuLnNldChnKTtpZihtIGluc3RhbmNlb2YgWCloPW0ubWcoYSxiLGMsZCxlLG4pO2Vsc2UgaWYodGhpcy5wYXRoPT09bSl7aWYobSBpbnN0YW5jZW9mIFcpaWYoaD1hLHA9ZCwhMT09PW0ucGlja2FibGUpaD0hMTtlbHNlIGlmKG4ubXVsdGlwbHkobS50cmFuc2Zvcm0pLHApYjp7dmFyIHE9aCxyPW47aWYobS51aChxLHIpKWg9ITA7ZWxzZXtpZih2b2lkIDA9PT1yJiYocj1tLnRyYW5zZm9ybSxxLmxmKG0uYWN0dWFsQm91bmRzKSkpe2g9ITA7YnJlYWsgYjt9aD1xLmxlZnQ7cD1xLnJpZ2h0O3ZhciB1PXEudG9wO3E9cS5ib3R0b207dmFyIHg9Ry5hbGxvYygpLHY9Ry5hbGxvYygpLHk9Ry5hbGxvYygpLHo9UWMuYWxsb2MoKTt6LnNldChyKTt6Lm52KG0udHJhbnNmb3JtKTt6LmJ0KCk7di54PXA7di55PXU7di50cmFuc2Zvcm0oeik7eC54PWg7eC55PXU7eC50cmFuc2Zvcm0oeik7cj0hMTtxbihtLHgsdix5KT9yPSEwOih4Lng9cCx4Lnk9cSx4LnRyYW5zZm9ybSh6KSxxbihtLHgsdix5KT9yPSEwOih2Lng9aCx2Lnk9cSx2LnRyYW5zZm9ybSh6KSxxbihtLHgsdix5KT9yPSEwOih4Lng9aCx4Lnk9dSx4LnRyYW5zZm9ybSh6KSxxbihtLHgsdix5KSYmKHI9ITApKSkpO1FjLmZyZWUoeik7Ry5mcmVlKHgpO0cuZnJlZSh2KTtHLmZyZWUoeSk7aD1yO319ZWxzZSBoPW0udWgoaCxuKTt9ZWxzZSBoPWFsKG0sYSxkLG4pO2gmJihwPW0sbnVsbCE9PWImJihwPWIobSkpLHAmJihudWxsPT09Y3x8YyhwKSkmJmUuYWRkKHApKTtRYy5mcmVlKG4pO319fXZvaWQgMD09PWYmJlFjLmZyZWUoZyk7cmV0dXJuIGh8fG51bGwhPT10aGlzLmJhY2tncm91bmR8fG51bGwhPT10aGlzLmFyZWFCYWNrZ3JvdW5kO312b2lkIDA9PT1mJiZRYy5mcmVlKGcpO3JldHVybiExO307Uy5wcm90b3R5cGUuY29tcHV0ZUN1cnZlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuR2Ype3ZhciBhPXRoaXMuZnJvbVBvcnQsYj10aGlzLmlzT3J0aG9nb25hbDt0aGlzLkdmPW51bGwhPT1hJiZhPT09dGhpcy50b1BvcnQmJiFiO31yZXR1cm4gdGhpcy5HZj9SZzp0aGlzLmN1cnZlO307Uy5wcm90b3R5cGUuY29tcHV0ZUNvcm5lcj1mdW5jdGlvbigpe2lmKHRoaXMuY3VydmU9PT1SZylyZXR1cm4gMDt2YXIgYT10aGlzLmNvcm5lcjtpZihpc05hTihhKXx8MD5hKWE9MTA7cmV0dXJuIGE7fTtTLnByb3RvdHlwZS5maW5kTWlkTGFiZWw9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5wYXRoLGI9dGhpcy5ZLmosYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7dmFyIGU9YltkXTtpZihlIT09YSYmIWUuaXNQYW5lbE1haW4mJigtSW5maW5pdHk9PT1lLnNlZ21lbnRJbmRleHx8aXNOYU4oZS5zZWdtZW50SW5kZXgpKSlyZXR1cm4gZTt9Zm9yKGE9dGhpcy5sYWJlbE5vZGVzO2EubmV4dCgpOyl7aWYoYj1hLnZhbHVlLC1JbmZpbml0eT09PWIuc2VnbWVudEluZGV4fHxpc05hTihiLnNlZ21lbnRJbmRleCkpcmV0dXJuIGI7fXJldHVybiBudWxsO307Uy5wcm90b3R5cGUuY29tcHV0ZVNwYWNpbmc9ZnVuY3Rpb24oKXtpZighdGhpcy5pc1Zpc2libGUoKSlyZXR1cm4gMDt2YXIgYT1NYXRoLm1heCgxNCx0aGlzLmNvbXB1dGVUaGlja25lc3MoKSk7dmFyIGI9dGhpcy5mcm9tUG9ydCxjPXRoaXMudG9Qb3J0O2lmKG51bGwhPT1iJiZudWxsIT09Yyl7dmFyIGQ9dGhpcy5maW5kTWlkTGFiZWwoKTtpZihudWxsIT09ZCl7dmFyIGU9ZC5uYXR1cmFsQm91bmRzLGY9ZC5tYXJnaW4sZz1pc05hTihlLndpZHRoKT8zMDplLndpZHRoKmQuc2NhbGUrZi5sZWZ0K2YucmlnaHQ7ZT1pc05hTihlLmhlaWdodCk/MTQ6ZS5oZWlnaHQqZC5zY2FsZStmLnRvcCtmLmJvdHRvbTtkPWQuc2VnbWVudE9yaWVudGF0aW9uO2Q9PT1zbnx8ZD09PVFvfHxkPT09UG8/YT1NYXRoLm1heChhLGUpOmQ9PT1GbXx8ZD09PUdtfHxkPT09RG18fGQ9PT1FbT9hPU1hdGgubWF4KGEsZyk6KGI9Yi5tYShkZCkuV2EoYy5tYShkZCkpLzE4MCpNYXRoLlBJLGE9TWF0aC5tYXgoYSxNYXRoLmFicyhNYXRoLnNpbihiKSpnKStNYXRoLmFicyhNYXRoLmNvcyhiKSplKSsxKSk7dGhpcy5jdXJ2ZT09PVJnJiYoYSo9MS4zMzMpO319cmV0dXJuIGE7fTtTLnByb3RvdHlwZS5hcnJhbmdlQnVuZGxlZExpbmtzPWZ1bmN0aW9uKGEsYil7aWYoYilmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1hW2JdO2MuYWRqdXN0aW5nPT09T2cmJmMuUmEoKTt9fTtTLnByb3RvdHlwZS5jb21wdXRlQ3VydmluZXNzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jdXJ2aW5lc3M7aWYoaXNOYU4oYSkpe2E9MTY7dmFyIGI9dGhpcy54ZjtpZihudWxsIT09Yil7Zm9yKHZhciBjPUthKCksZD0wLGU9Yi5saW5rcyxmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl0uY29tcHV0ZVNwYWNpbmcoKTtjLnB1c2goZyk7ZCs9Zzt9ZD0tZC8yO2ZvcihmPTA7ZjxlLmxlbmd0aDtmKyspe2lmKGVbZl09PT10aGlzKXthPWQrY1tmXS8yO2JyZWFrO31kKz1jW2ZdO31iLmp0PT09dGhpcy5mcm9tTm9kZSYmKGE9LWEpO09hKGMpO319cmV0dXJuIGE7fTtTLnByb3RvdHlwZS5jb21wdXRlVGhpY2tuZXNzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNWaXNpYmxlKCkpcmV0dXJuIDA7dmFyIGE9dGhpcy5wYXRoO3JldHVybiBudWxsIT09YT9NYXRoLm1heChhLnN0cm9rZVdpZHRoLDEpOjE7fTtTLnByb3RvdHlwZS5oYXNDdXJ2aW5lc3M9ZnVuY3Rpb24oKXtyZXR1cm4haXNOYU4odGhpcy5jdXJ2aW5lc3MpfHxudWxsIT09dGhpcy54Zjt9O1MucHJvdG90eXBlLmFkanVzdFBvaW50cz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLmFkanVzdGluZztpZih0aGlzLmlzT3J0aG9nb25hbCl7aWYoZT09PU5vKXJldHVybiExO2U9PT1PbyYmKGU9TW8pO31zd2l0Y2goZSl7Y2FzZSBObzp2YXIgZj10aGlzLmkoYSksZz10aGlzLmkoYyk7aWYoIWYuUWEoYil8fCFnLlFhKGQpKXtlPWYueDtmPWYueTt2YXIgaD1nLngtZSxrPWcueS1mLGw9TWF0aC5zcXJ0KGgqaCtrKmspO2lmKCFILmNhKGwsMCkpe2lmKEguY2EoaCwwKSl2YXIgbT0wPms/LU1hdGguUEkvMjpNYXRoLlBJLzI7ZWxzZSBtPU1hdGguYXRhbihrL01hdGguYWJzKGgpKSwwPmgmJihtPU1hdGguUEktbSk7Zz1iLng7dmFyIG49Yi55O2g9ZC54LWc7dmFyIHA9ZC55LW47az1NYXRoLnNxcnQoaCpoK3AqcCk7SC5jYShoLDApP3A9MD5wPy1NYXRoLlBJLzI6TWF0aC5QSS8yOihwPU1hdGguYXRhbihwL01hdGguYWJzKGgpKSwwPmgmJihwPU1hdGguUEktcCkpO2w9ay9sO209cC1tO3RoaXMuamQoYSxiKTtmb3IoYSs9MTthPGM7YSsrKXtiPXRoaXMuaShhKSxoPWIueC1lLGs9Yi55LWYsYj1NYXRoLnNxcnQoaCpoK2sqayksSC5jYShiLDApfHwoSC5jYShoLDApP2s9MD5rPy1NYXRoLlBJLzI6TWF0aC5QSS8yOihrPU1hdGguYXRhbihrL01hdGguYWJzKGgpKSwwPmgmJihrPU1hdGguUEktaykpLGg9ayttLGIqPWwsdGhpcy5NKGEsZytiKk1hdGguY29zKGgpLG4rYipNYXRoLnNpbihoKSkpO310aGlzLmpkKGMsZCk7fX1yZXR1cm4hMDtjYXNlIE9vOmY9dGhpcy5pKGEpO249dGhpcy5pKGMpO2lmKCFmLlFhKGIpfHwhbi5RYShkKSl7ZT1mLng7Zj1mLnk7Zz1uLng7bj1uLnk7bD0oZy1lKSooZy1lKSsobi1mKSoobi1mKTtoPWIueDttPWIueTtrPWQueDtwPWQueTt2YXIgcT0xO2lmKDAhPT1rLWgpe3ZhciByPShwLW0pLyhrLWgpO3E9TWF0aC5zcXJ0KDErMS8ocipyKSk7fWVsc2Ugcj05RTk7dGhpcy5qZChhLGIpO2ZvcihhKz0xO2E8YzthKyspe2I9dGhpcy5pKGEpO3ZhciB1PWIueCx4PWIueSx2PS41OzAhPT1sJiYodj0oKGUtdSkqKGUtZykrKGYteCkqKGYtbikpL2wpO3ZhciB5PWUrdiooZy1lKSx6PWYrdioobi1mKTtiPU1hdGguc3FydCgodS15KSoodS15KSsoeC16KSooeC16KSk7eDxyKih1LXkpK3omJihiPS1iKTswPHImJihiPS1iKTt1PWgrdiooay1oKTt2PW0rdioocC1tKTswIT09cj8oYj11K2IvcSx0aGlzLk0oYSxiLHYtKGItdSkvcikpOnRoaXMuTShhLHUsditiKTt9dGhpcy5qZChjLGQpO31yZXR1cm4hMDtjYXNlIE1vOmE6e2lmKHRoaXMuaXNPcnRob2dvbmFsJiYoZT10aGlzLmkoYSksZj10aGlzLmkoYSsxKSxnPXRoaXMuaShhKzIpLGg9Zi54LG09Zi55LG49aCxsPW0sSC53KGUueSxmLnkpP0gudyhmLngsZy54KT9tPWIueTpILncoZi55LGcueSkmJihoPWIueCk6SC53KGUueCxmLngpJiYoSC53KGYueSxnLnkpP2g9Yi54OkgudyhmLngsZy54KSYmKG09Yi55KSksdGhpcy5NKGErMSxoLG0pLGU9dGhpcy5pKGMpLGY9dGhpcy5pKGMtMSksZz10aGlzLmkoYy0yKSxoPWYueCxtPWYueSxrPWgscD1tLEgudyhlLnksZi55KT9ILncoZi54LGcueCk/bT1kLnk6SC53KGYueSxnLnkpJiYoaD1kLngpOkgudyhlLngsZi54KSYmKEgudyhmLnksZy55KT9oPWQueDpILncoZi54LGcueCkmJihtPWQueSkpLHRoaXMuTShjLTEsaCxtKSxOaih0aGlzKSkpe3RoaXMuTShhKzEsbixsKTt0aGlzLk0oYy0xLGsscCk7Yz0hMTticmVhayBhO310aGlzLmpkKGEsYik7dGhpcy5qZChjLGQpO2M9ITA7fXJldHVybiBjO2RlZmF1bHQ6cmV0dXJuITE7fX07Uy5wcm90b3R5cGUuYWRkT3J0aG9Qb2ludHM9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2I9LTQ1PD1iJiY0NT5iPzA6NDU8PWImJjEzNT5iPzkwOjEzNTw9YiYmMjI1PmI/MTgwOjI3MDtkPS00NTw9ZCYmNDU+ZD8wOjQ1PD1kJiYxMzU+ZD85MDoxMzU8PWQmJjIyNT5kPzE4MDoyNzA7dmFyIGc9ZS5hY3R1YWxCb3VuZHMuY29weSgpLGg9Zi5hY3R1YWxCb3VuZHMuY29weSgpO2lmKGcubygpJiZoLm8oKSl7Zy5VYyg4LDgpO2guVWMoOCw4KTtnLkllKGEpO2guSWUoYyk7aWYoMD09PWIpe2lmKGMueD5hLnh8fDI3MD09PWQmJmMueTxhLnkmJmgucmlnaHQ+YS54fHw5MD09PWQmJmMueT5hLnkmJmgucmlnaHQ+YS54KXt2YXIgaz1uZXcgRyhjLngsYS55KTt2YXIgbD1uZXcgRyhjLngsKGEueStjLnkpLzIpOzE4MD09PWQ/KGsueD10aGlzLmNvbXB1dGVNaWRPcnRob1Bvc2l0aW9uKGEueCxhLnksYy54LGMueSwhMSksbC54PWsueCxsLnk9Yy55KToyNzA9PT1kJiZjLnk8YS55fHw5MD09PWQmJmMueT5hLnk/KGsueD1hLng8aC5sZWZ0P3RoaXMuY29tcHV0ZU1pZE9ydGhvUG9zaXRpb24oYS54LGEueSxoLmxlZnQsYy55LCExKTphLng8aC5yaWdodCYmKDI3MD09PWQmJmEueTxoLnRvcHx8OTA9PT1kJiZhLnk+aC5ib3R0b20pP3RoaXMuY29tcHV0ZU1pZE9ydGhvUG9zaXRpb24oYS54LGEueSxjLngsYy55LCExKTpoLnJpZ2h0LGwueD1rLngsbC55PWMueSk6MD09PWQmJmEueDxoLmxlZnQmJmEueT5oLnRvcCYmYS55PGguYm90dG9tJiYoay54PWEueCxrLnk9YS55PGMueT9NYXRoLm1pbihjLnksaC50b3ApOk1hdGgubWF4KGMueSxoLmJvdHRvbSksbC55PWsueSk7fWVsc2V7az1uZXcgRyhhLngsYy55KTtsPW5ldyBHKChhLngrYy54KS8yLGMueSk7aWYoMTgwPT09ZHx8OTA9PT1kJiZjLnk8Zy50b3B8fDI3MD09PWQmJmMueT5nLmJvdHRvbSkxODA9PT1kJiYoaC5lYShhKXx8Zy5lYShjKSk/ay55PXRoaXMuY29tcHV0ZU1pZE9ydGhvUG9zaXRpb24oYS54LGEueSxjLngsYy55LCEwKTpjLnk8YS55JiYoMTgwPT09ZHx8OTA9PT1kKT9rLnk9dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsZy50b3AsYy54LE1hdGgubWF4KGMueSxoLmJvdHRvbSksITApOmMueT5hLnkmJigxODA9PT1kfHwyNzA9PT1kKSYmKGsueT10aGlzLmNvbXB1dGVNaWRPcnRob1Bvc2l0aW9uKGEueCxnLmJvdHRvbSxjLngsTWF0aC5taW4oYy55LGgudG9wKSwhMCkpLGwueD1jLngsbC55PWsueTtpZihrLnk+Zy50b3AmJmsueTxnLmJvdHRvbSlpZihjLng+PWcubGVmdCYmYy54PD1hLnh8fGEueDw9aC5yaWdodCYmYS54Pj1jLngpe2lmKDkwPT09ZHx8MjcwPT09ZClrPW5ldyBHKE1hdGgubWF4KChhLngrYy54KS8yLGEueCksYS55KSxsPW5ldyBHKGsueCxjLnkpO31lbHNlIGsueT0yNzA9PT1kfHwoMD09PWR8fDE4MD09PWQpJiZjLnk8YS55P01hdGgubWluKGMueSwwPT09ZD9nLnRvcDpNYXRoLm1pbihnLnRvcCxoLnRvcCkpOk1hdGgubWF4KGMueSwwPT09ZD9nLmJvdHRvbTpNYXRoLm1heChnLmJvdHRvbSxoLmJvdHRvbSkpLGwueD1jLngsbC55PWsueTt9fWVsc2UgaWYoMTgwPT09Yil7aWYoYy54PGEueHx8MjcwPT09ZCYmYy55PGEueSYmaC5sZWZ0PGEueHx8OTA9PT1kJiZjLnk+YS55JiZoLmxlZnQ8YS54KWs9bmV3IEcoYy54LGEueSksbD1uZXcgRyhjLngsKGEueStjLnkpLzIpLDA9PT1kPyhrLng9dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsYS55LGMueCxjLnksITEpLGwueD1rLngsbC55PWMueSk6MjcwPT09ZCYmYy55PGEueXx8OTA9PT1kJiZjLnk+YS55PyhrLng9YS54PmgucmlnaHQ/dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsYS55LGgucmlnaHQsYy55LCExKTphLng+aC5sZWZ0JiYoMjcwPT09ZCYmYS55PGgudG9wfHw5MD09PWQmJmEueT5oLmJvdHRvbSk/dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsYS55LGMueCxjLnksITEpOmgubGVmdCxsLng9ay54LGwueT1jLnkpOjE4MD09PWQmJmEueD5oLnJpZ2h0JiZhLnk+aC50b3AmJmEueTxoLmJvdHRvbSYmKGsueD1hLngsay55PWEueTxjLnk/TWF0aC5taW4oYy55LGgudG9wKTpNYXRoLm1heChjLnksaC5ib3R0b20pLGwueT1rLnkpO2Vsc2V7az1uZXcgRyhhLngsYy55KTtsPW5ldyBHKChhLngrYy54KS8yLGMueSk7aWYoMD09PWR8fDkwPT09ZCYmYy55PGcudG9wfHwyNzA9PT1kJiZjLnk+Zy5ib3R0b20pMD09PWQmJihoLmVhKGEpfHxnLmVhKGMpKT9rLnk9dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsYS55LGMueCxjLnksITApOmMueTxhLnkmJigwPT09ZHx8OTA9PT1kKT9rLnk9dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsZy50b3AsYy54LE1hdGgubWF4KGMueSxoLmJvdHRvbSksITApOmMueT5hLnkmJigwPT09ZHx8MjcwPT09ZCkmJihrLnk9dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsZy5ib3R0b20sYy54LE1hdGgubWluKGMueSxoLnRvcCksITApKSxsLng9Yy54LGwueT1rLnk7aWYoay55PmcudG9wJiZrLnk8Zy5ib3R0b20paWYoYy54PD1nLnJpZ2h0JiZjLng+PWEueHx8YS54Pj1oLmxlZnQmJmEueDw9Yy54KXtpZig5MD09PWR8fDI3MD09PWQpaz1uZXcgRyhNYXRoLm1pbigoYS54K2MueCkvMixhLngpLGEueSksbD1uZXcgRyhrLngsYy55KTt9ZWxzZSBrLnk9MjcwPT09ZHx8KDA9PT1kfHwxODA9PT1kKSYmYy55PGEueT9NYXRoLm1pbihjLnksMTgwPT09ZD9nLnRvcDpNYXRoLm1pbihnLnRvcCxoLnRvcCkpOk1hdGgubWF4KGMueSwxODA9PT1kP2cuYm90dG9tOk1hdGgubWF4KGcuYm90dG9tLGguYm90dG9tKSksbC54PWMueCxsLnk9ay55O319ZWxzZSBpZig5MD09PWIpe2lmKGMueT5hLnl8fDE4MD09PWQmJmMueDxhLngmJmguYm90dG9tPmEueXx8MD09PWQmJmMueD5hLngmJmguYm90dG9tPmEueSlrPW5ldyBHKGEueCxjLnkpLGw9bmV3IEcoKGEueCtjLngpLzIsYy55KSwyNzA9PT1kPyhrLnk9dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsYS55LGMueCxjLnksITApLGwueD1jLngsbC55PWsueSk6MTgwPT09ZCYmYy54PGEueHx8MD09PWQmJmMueD5hLng/KGsueT1hLnk8aC50b3A/dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsYS55LGMueCxoLnRvcCwhMCk6YS55PGguYm90dG9tJiYoMTgwPT09ZCYmYS54PGgubGVmdHx8MD09PWQmJmEueD5oLnJpZ2h0KT90aGlzLmNvbXB1dGVNaWRPcnRob1Bvc2l0aW9uKGEueCxhLnksYy54LGMueSwhMCk6aC5ib3R0b20sbC54PWMueCxsLnk9ay55KTo5MD09PWQmJmEueTxoLnRvcCYmYS54PmgubGVmdCYmYS54PGgucmlnaHQmJihrLng9YS54PGMueD9NYXRoLm1pbihjLngsaC5sZWZ0KTpNYXRoLm1heChjLngsaC5yaWdodCksay55PWEueSxsLng9ay54KTtlbHNle2s9bmV3IEcoYy54LGEueSk7bD1uZXcgRyhjLngsKGEueStjLnkpLzIpO2lmKDI3MD09PWR8fDA9PT1kJiZjLng8Zy5sZWZ0fHwxODA9PT1kJiZjLng+Zy5yaWdodCkyNzA9PT1kJiYoaC5lYShhKXx8Zy5lYShjKSk/ay54PXRoaXMuY29tcHV0ZU1pZE9ydGhvUG9zaXRpb24oYS54LGEueSxjLngsYy55LCExKTpjLng8YS54JiYoMjcwPT09ZHx8MD09PWQpP2sueD10aGlzLmNvbXB1dGVNaWRPcnRob1Bvc2l0aW9uKGcubGVmdCxhLnksTWF0aC5tYXgoYy54LGgucmlnaHQpLGMueSwhMSk6Yy54PmEueCYmKDI3MD09PWR8fDE4MD09PWQpJiYoay54PXRoaXMuY29tcHV0ZU1pZE9ydGhvUG9zaXRpb24oZy5yaWdodCxhLnksTWF0aC5taW4oYy54LGgubGVmdCksYy55LCExKSksbC54PWsueCxsLnk9Yy55O2lmKGsueD5nLmxlZnQmJmsueDxnLnJpZ2h0KWlmKGMueT49Zy50b3AmJmMueTw9YS55fHxhLnk8PWguYm90dG9tJiZhLnk+PWMueSl7aWYoMD09PWR8fDE4MD09PWQpaz1uZXcgRyhhLngsTWF0aC5tYXgoKGEueStjLnkpLzIsYS55KSksbD1uZXcgRyhjLngsay55KTt9ZWxzZSBrLng9MTgwPT09ZHx8KDkwPT09ZHx8MjcwPT09ZCkmJmMueDxhLng/TWF0aC5taW4oYy54LDkwPT09ZD9nLmxlZnQ6TWF0aC5taW4oZy5sZWZ0LGgubGVmdCkpOk1hdGgubWF4KGMueCw5MD09PWQ/Zy5yaWdodDpNYXRoLm1heChnLnJpZ2h0LGgucmlnaHQpKSxsLng9ay54LGwueT1jLnk7fX1lbHNlIGlmKGMueTxhLnl8fDE4MD09PWQmJmMueDxhLngmJmgudG9wPGEueXx8MD09PWQmJmMueD5hLngmJmgudG9wPGEueSlrPW5ldyBHKGEueCxjLnkpLGw9bmV3IEcoKGEueCtjLngpLzIsYy55KSw5MD09PWQ/KGsueT10aGlzLmNvbXB1dGVNaWRPcnRob1Bvc2l0aW9uKGEueCxhLnksYy54LGMueSwhMCksbC54PWMueCxsLnk9ay55KToxODA9PT1kJiZjLng8YS54fHwwPT09ZCYmYy54Pj1hLng/KGsueT1hLnk+aC5ib3R0b20/dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsYS55LGMueCxoLmJvdHRvbSwhMCk6YS55PmgudG9wJiYoMTgwPT09ZCYmYS54PGgubGVmdHx8MD09PWQmJmEueD5oLnJpZ2h0KT90aGlzLmNvbXB1dGVNaWRPcnRob1Bvc2l0aW9uKGEueCxhLnksYy54LGMueSwhMCk6aC50b3AsbC54PWMueCxsLnk9ay55KToyNzA9PT1kJiZhLnk+aC5ib3R0b20mJmEueD5oLmxlZnQmJmEueDxoLnJpZ2h0JiYoay54PWEueDxjLng/TWF0aC5taW4oYy54LGgubGVmdCk6TWF0aC5tYXgoYy54LGgucmlnaHQpLGsueT1hLnksbC54PWsueCk7ZWxzZXtrPW5ldyBHKGMueCxhLnkpO2w9bmV3IEcoYy54LChhLnkrYy55KS8yKTtpZig5MD09PWR8fDA9PT1kJiZjLng8Zy5sZWZ0fHwxODA9PT1kJiZjLng+Zy5yaWdodCk5MD09PWQmJihoLmVhKGEpfHxnLmVhKGMpKT9rLng9dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihhLngsYS55LGMueCxjLnksITEpOmMueDxhLngmJig5MD09PWR8fDA9PT1kKT9rLng9dGhpcy5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbihnLmxlZnQsYS55LE1hdGgubWF4KGMueCxoLnJpZ2h0KSxjLnksITEpOmMueD5hLngmJig5MD09PWR8fDE4MD09PWQpJiYoay54PXRoaXMuY29tcHV0ZU1pZE9ydGhvUG9zaXRpb24oZy5yaWdodCxhLnksTWF0aC5taW4oYy54LGgubGVmdCksYy55LCExKSksbC54PWsueCxsLnk9Yy55O2lmKGsueD5nLmxlZnQmJmsueDxnLnJpZ2h0KWlmKGMueTw9Zy5ib3R0b20mJmMueT49YS55fHxhLnk+PWgudG9wJiZhLnk8PWMueSl7aWYoMD09PWR8fDE4MD09PWQpaz1uZXcgRyhhLngsTWF0aC5taW4oKGEueStjLnkpLzIsYS55KSksbD1uZXcgRyhjLngsay55KTt9ZWxzZSBrLng9MTgwPT09ZHx8KDkwPT09ZHx8MjcwPT09ZCkmJmMueDxhLng/TWF0aC5taW4oYy54LDI3MD09PWQ/Zy5sZWZ0Ok1hdGgubWluKGcubGVmdCxoLmxlZnQpKTpNYXRoLm1heChjLngsMjcwPT09ZD9nLnJpZ2h0Ok1hdGgubWF4KGcucmlnaHQsaC5yaWdodCkpLGwueD1rLngsbC55PWMueTt9dmFyIG09ayxuPWwscD1jO2lmKHRoaXMuaXNBdm9pZGluZyl7dmFyIHE9dGhpcy5kaWFncmFtO2lmKG51bGw9PT1xfHwhamsocSl8fGcuZWEocCkmJiFmLlZkKGUpfHxoLmVhKGEpJiYhZS5WZChmKXx8ZT09PWZ8fHRoaXMubGF5ZXIuaXNUZW1wb3JhcnkpYj0hMTtlbHNle3ZhciByPWtrKHEsITAsdGhpcy5jb250YWluaW5nR3JvdXAsbnVsbCk7aWYoci5layhNYXRoLm1pbihhLngsbS54KSxNYXRoLm1pbihhLnksbS55KSxNYXRoLmFicyhhLngtbS54KSxNYXRoLmFicyhhLnktbS55KSkmJnIuZWsoTWF0aC5taW4obS54LG4ueCksTWF0aC5taW4obS55LG4ueSksTWF0aC5hYnMobS54LW4ueCksTWF0aC5hYnMobS55LW4ueSkpJiZyLmVrKE1hdGgubWluKG4ueCxwLngpLE1hdGgubWluKG4ueSxwLnkpLE1hdGguYWJzKG4ueC1wLngpLE1hdGguYWJzKG4ueS1wLnkpKSliPSExO2Vsc2V7ZT1hO2Y9cDt2YXIgdT1jPW51bGw7aWYocS5pc1ZpcnR1YWxpemVkKXtxPXIuYm91bmRzLmNvcHkoKTtxLlVjKC1yLlVsLC1yLlRsKTt2YXIgeD1HLmFsbG9jKCk7YnAocixhLngsYS55KXx8KEguVGMocS54LHEueSxxLngrcS53aWR0aCxxLnkrcS5oZWlnaHQsYS54LGEueSxtLngsbS55LHgpPyhjPWE9eC5jb3B5KCksYj14LldhKG0pKTpILlRjKHEueCxxLnkscS54K3Eud2lkdGgscS55K3EuaGVpZ2h0LG0ueCxtLnksbi54LG4ueSx4KT8oYz1hPXguY29weSgpLGI9eC5XYShuKSk6SC5UYyhxLngscS55LHEueCtxLndpZHRoLHEueStxLmhlaWdodCxuLngsbi55LHAueCxwLnkseCkmJihjPWE9eC5jb3B5KCksYj14LldhKHApKSk7YnAocixwLngscC55KXx8KEguVGMocS54LHEueSxxLngrcS53aWR0aCxxLnkrcS5oZWlnaHQscC54LHAueSxuLngsbi55LHgpPyh1PXA9eC5jb3B5KCksZD1uLldhKHgpKTpILlRjKHEueCxxLnkscS54K3Eud2lkdGgscS55K3EuaGVpZ2h0LG4ueCxuLnksbS54LG0ueSx4KT8odT1wPXguY29weSgpLGQ9bS5XYSh4KSk6SC5UYyhxLngscS55LHEueCtxLndpZHRoLHEueStxLmhlaWdodCxtLngsbS55LGEueCxhLnkseCkmJih1PXA9eC5jb3B5KCksZD1hLldhKHgpKSk7Ry5mcmVlKHgpO31nPWcuY29weSgpLkpjKGgpO2g9ci5UejtnLlVjKHIuVWwqaCxyLlRsKmgpO2NwKHIsYSxiLHAsZCxnKTtoPWRwKHIscC54LHAueSk7IXIuYWJvcnQmJmg+PWVwJiYobmsociksaD1yLnh6LGcuVWMoci5VbCpoLHIuVGwqaCksY3AocixhLGIscCxkLGcpLGg9ZHAocixwLngscC55KSk7IXIuYWJvcnQmJmg+PWVwJiZyLlp6JiYobmsociksY3AocixhLGIscCxkLHIuYm91bmRzKSxoPWRwKHIscC54LHAueSkpO2lmKCFyLmFib3J0JiZoPGVwJiZkcChyLHAueCxwLnkpIT09ZnApe2dwKHRoaXMscixwLngscC55LGQsITApO2c9dGhpcy5pKDIpO2lmKDQ+dGhpcy5wb2ludHNDb3VudCkwPT09Ynx8MTgwPT09Yj8oZy54PWEueCxnLnk9cC55KTooZy54PXAueCxnLnk9YS55KSx0aGlzLk0oMixnLngsZy55KSx0aGlzLm0oMyxnLngsZy55KTtlbHNlIGlmKHA9dGhpcy5pKDMpLDA9PT1ifHwxODA9PT1iKUgudyhnLngscC54KT8oZz0wPT09Yj9NYXRoLm1heChnLngsYS54KTpNYXRoLm1pbihnLngsYS54KSx0aGlzLk0oMixnLGEueSksdGhpcy5NKDMsZyxwLnkpKTpILncoZy55LHAueSk/KE1hdGguYWJzKGEueS1nLnkpPD1yLlRsLzImJih0aGlzLk0oMixnLngsYS55KSx0aGlzLk0oMyxwLngsYS55KSksdGhpcy5tKDIsZy54LGEueSkpOnRoaXMuTSgyLGEueCxnLnkpO2Vsc2UgaWYoOTA9PT1ifHwyNzA9PT1iKUgudyhnLnkscC55KT8oZz05MD09PWI/TWF0aC5tYXgoZy55LGEueSk6TWF0aC5taW4oZy55LGEueSksdGhpcy5NKDIsYS54LGcpLHRoaXMuTSgzLHAueCxnKSk6SC53KGcueCxwLngpPyhNYXRoLmFicyhhLngtZy54KTw9ci5VbC8yJiYodGhpcy5NKDIsYS54LGcueSksdGhpcy5NKDMsYS54LHAueSkpLHRoaXMubSgyLGEueCxnLnkpKTp0aGlzLk0oMixnLngsYS55KTtudWxsIT09YyYmKGE9dGhpcy5pKDEpLHA9dGhpcy5pKDIpLGEueCE9PXAueCYmYS55IT09cC55PzA9PT1ifHwxODA9PT1iP3RoaXMubSgyLGEueCxwLnkpOnRoaXMubSgyLHAueCxhLnkpOjA9PT1ifHwxODA9PT1iP3RoaXMubSgyLGUueCxjLnkpOnRoaXMubSgyLGMueCxlLnkpKTtudWxsIT09dSYmKDA9PT1kfHwxODA9PT1kP3RoaXMuamYoZi54LHUueSk6dGhpcy5qZih1LngsZi55KSk7Yj0hMDt9ZWxzZSBiPSExO319fWVsc2UgYj0hMTtifHwodGhpcy54ZShrKSx0aGlzLnhlKGwpKTt9fTtTLnByb3RvdHlwZS5jb21wdXRlTWlkT3J0aG9Qb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPTA7dGhpcy5oYXNDdXJ2aW5lc3MoKSYmKGY9dGhpcy5jb21wdXRlQ3VydmluZXNzKCkpO3JldHVybiBlPyhiK2QpLzIrZjooYStjKS8yK2Y7fTtmdW5jdGlvbiBOaihhKXtpZihudWxsPT09YS5kaWFncmFtfHwhYS5pc0F2b2lkaW5nfHwhamsoYS5kaWFncmFtKSlyZXR1cm4hMTt2YXIgYj1hLnBvaW50cy5qLGM9Yi5sZW5ndGg7aWYoND5jKXJldHVybiExO2E9a2soYS5kaWFncmFtLCEwLGEuY29udGFpbmluZ0dyb3VwLG51bGwpO2Zvcih2YXIgZD0xO2Q8Yy0yO2QrKyl7dmFyIGU9YltkXSxmPWJbZCsxXTtpZighYS5layhNYXRoLm1pbihlLngsZi54KSxNYXRoLm1pbihlLnksZi55KSxNYXRoLmFicyhlLngtZi54KSxNYXRoLmFicyhlLnktZi55KSkpcmV0dXJuITA7fXJldHVybiExO31mdW5jdGlvbiBncChhLGIsYyxkLGUsZil7dmFyIGc9Yi5VbCxoPWIuVGwsaz1kcChiLGMsZCksbD1jLG09ZDtmb3IoMD09PWU/bCs9Zzo5MD09PWU/bSs9aDoxODA9PT1lP2wtPWc6bS09aDtrPmhwJiZkcChiLGwsbSk9PT1rLTE7KXtjPWwsZD1tLDA9PT1lP2wrPWc6OTA9PT1lP20rPWg6MTgwPT09ZT9sLT1nOm0tPWgsLS1rO31pZihmKXtpZihrPmhwKWlmKDE4MD09PWV8fDA9PT1lKWM9TWF0aC5mbG9vcihjL2cpKmcrZy8yO2Vsc2UgaWYoOTA9PT1lfHwyNzA9PT1lKWQ9TWF0aC5mbG9vcihkL2gpKmgraC8yO31lbHNlIGM9TWF0aC5mbG9vcihjL2cpKmcrZy8yLGQ9TWF0aC5mbG9vcihkL2gpKmgraC8yO2s+aHAmJihmPWUsbD1jLG09ZCwwPT09ZT8oZj05MCxtKz1oKTo5MD09PWU/KGY9MTgwLGwtPWcpOjE4MD09PWU/KGY9MjcwLG0tPWgpOjI3MD09PWUmJihmPTAsbCs9ZyksZHAoYixsLG0pPT09ay0xP2dwKGEsYixsLG0sZiwhMSk6KGw9YyxtPWQsMD09PWU/KGY9MjcwLG0tPWgpOjkwPT09ZT8oZj0wLGwrPWcpOjE4MD09PWU/KGY9OTAsbSs9aCk6MjcwPT09ZSYmKGY9MTgwLGwtPWcpLGRwKGIsbCxtKT09PWstMSYmZ3AoYSxiLGwsbSxmLCExKSkpO2EuamYoYyxkKTt9Uy5wcm90b3R5cGUuSXk9ZnVuY3Rpb24oYSl7dmFyIGI9YS54O2E9YS55O2Zvcih2YXIgYz10aGlzLmkoMCksZD10aGlzLmkoMSksZT1SYihiLGEsYy54LGMueSxkLngsZC55KSxmPTAsZz0xO2c8dGhpcy5wb2ludHNDb3VudC0xO2crKyl7Yz10aGlzLmkoZysxKTt2YXIgaD1SYihiLGEsZC54LGQueSxjLngsYy55KTtkPWM7aDxlJiYoZj1nLGU9aCk7fXJldHVybiBmO307Uy5wcm90b3R5cGUuYmM9ZnVuY3Rpb24oKXt0aGlzLlFuPSEwO307Uy5wcm90b3R5cGUuZ2s9ZnVuY3Rpb24oYSl7aWYoIWEpe2lmKCExPT09dGhpcy5MYylyZXR1cm47YT10aGlzLnpiKCk7aWYoIXRoaXMuUW4mJihudWxsPT09YXx8bnVsbCE9PWEuZ2VvbWV0cnkpKXJldHVybjt9dGhpcy5xYT10aGlzLm1ha2VHZW9tZXRyeSgpO2E9dGhpcy5wYXRoO2lmKG51bGwhPT1hKXthLnFhPXRoaXMucWE7Zm9yKHZhciBiPXRoaXMuWS5qLGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe3ZhciBlPWJbZF07ZSE9PWEmJmUuaXNQYW5lbE1haW4mJmUgaW5zdGFuY2VvZiBXJiYoZS5xYT10aGlzLnFhKTt9fX07Uy5wcm90b3R5cGUubWFrZUdlb21ldHJ5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xYSxiPXRoaXMucG9pbnRzQ291bnQ7aWYoMj5iKXJldHVybiBhLnR5cGU9Y2UsdGhpcy5Rbj0hMSxhO3ZhciBjPSExLGQ9dGhpcy5kaWFncmFtO251bGwhPT1kJiZSbyh0aGlzKSYmZC5XaC5jb250YWlucyh0aGlzKSYmKDAhPT10aGlzLnhsLndpZHRofHwwIT09dGhpcy54bC5oZWlnaHQpJiYoYz0hMCk7dmFyIGU9dGhpcy5pKDApLmNvcHkoKSxmPWUuY29weSgpO2Q9dGhpcy54Yi5qO3ZhciBnPXRoaXMuY29tcHV0ZUN1cnZlKCk7aWYoZz09PVJnJiYzPD1iJiYhSC5jYSh0aGlzLnNtb290aG5lc3MsMCkpe2lmKDM9PT1iKXt2YXIgaD10aGlzLmkoMSk7ZD1NYXRoLm1pbihlLngsaC54KTt2YXIgaz1NYXRoLm1pbihlLnksaC55KTtoPXRoaXMuaSgyKTtkPU1hdGgubWluKGQsaC54KTtrPU1hdGgubWluKGssaC55KTt9ZWxzZXtpZih0aGlzLmlzT3J0aG9nb25hbClmb3Ioaz0wO2s8YjtrKyspe2g9ZFtrXSxmLng9TWF0aC5taW4oaC54LGYueCksZi55PU1hdGgubWluKGgueSxmLnkpO31lbHNlIGZvcihkPTM7ZDxiO2QrPTMpe2QrMz49YiYmKGQ9Yi0xKSxrPXRoaXMuaShkKSxmLng9TWF0aC5taW4oay54LGYueCksZi55PU1hdGgubWluKGsueSxmLnkpO31kPWYueDtrPWYueTt9fWVsc2V7Zm9yKGs9MDtrPGI7aysrKXtoPWRba10sZi54PU1hdGgubWluKGgueCxmLngpLGYueT1NYXRoLm1pbihoLnksZi55KTt9ZD1mLng7az1mLnk7fWQtPXRoaXMuenUueDtrLT10aGlzLnp1Lnk7ZS54LT1kO2UueS09aztpZigyIT09Ynx8Um8odGhpcykpe2EudHlwZT1hZTtoPW5lKGEpOzAhPT10aGlzLmNvbXB1dGVTaG9ydExlbmd0aCghMCkmJihlPWlwKHRoaXMsZSwhMCxmKSk7b2UoaCxlLngsZS55LCExKTtpZihnPT09UmcmJjM8PWImJiFILmNhKHRoaXMuc21vb3RobmVzcywwKSl7aWYoMz09PWIpYz10aGlzLmkoMSksYj1jLngtZCxjPWMueS1rLGU9dGhpcy5pKDIpLmNvcHkoKSxlLngtPWQsZS55LT1rLDAhPT10aGlzLmNvbXB1dGVTaG9ydExlbmd0aCghMSkmJihlPWlwKHRoaXMsZSwhMSxmKSkscGUoaCxiLGMsYixjLGUueCxlLnkpO2Vsc2UgaWYodGhpcy5pc09ydGhvZ29uYWwpe2Y9bmV3IEcoZCxrKTtlPXRoaXMuaSgxKS5jb3B5KCk7Zz1uZXcgRyhkLGspO2I9bmV3IEcoZCxrKTtjPXRoaXMuaSgwKTtmb3IodmFyIGwsbT10aGlzLnNtb290aG5lc3MvMyxuPTE7bjx0aGlzLnBvaW50c0NvdW50LTE7bisrKXtsPXRoaXMuaShuKTt2YXIgcD1jLHE9bCxyPXRoaXMuaShqcCh0aGlzLGwsbiwhMSkpO2lmKCFILmNhKHAueCxxLngpfHwhSC5jYShxLngsci54KSlpZighSC5jYShwLnkscS55KXx8IUguY2EocS55LHIueSkpe3ZhciB1PW07aXNOYU4odSkmJih1PXRoaXMuc21vb3RobmVzcy8zKTt2YXIgeD1wLng7cD1wLnk7dmFyIHY9cS54O3E9cS55O3ZhciB5PXIueDtyPXIueTt2YXIgej11KmtwKHgscCx2LHEpO3UqPWtwKHYscSx5LHIpO0guY2EocCxxKSYmSC5jYSh2LHkpJiYodj54P3I+cT8oZy54PXYteixnLnk9cS16LGIueD12K3UsYi55PXErdSk6KGcueD12LXosZy55PXEreixiLng9dit1LGIueT1xLXUpOnI+cT8oZy54PXYreixnLnk9cS16LGIueD12LXUsYi55PXErdSk6KGcueD12K3osZy55PXEreixiLng9di11LGIueT1xLXUpKTtILmNhKHgsdikmJkguY2EocSxyKSYmKHE+cD8oeT52PyhnLng9di16LGcueT1xLXosYi54PXYrdSk6KGcueD12K3osZy55PXEteixiLng9di11KSxiLnk9cSt1KTooeT52PyhnLng9di16LGcueT1xK3osYi54PXYrdSk6KGcueD12K3osZy55PXEreixiLng9di11KSxiLnk9cS11KSk7aWYoSC5jYSh4LHYpJiZILmNhKHYseSl8fEguY2EocCxxKSYmSC5jYShxLHIpKXg9LjUqKHgreSkscD0uNSoocCtyKSxnLng9eCxnLnk9cCxiLng9eCxiLnk9cDsxPT09bj8oZS54PS41KihjLngrbC54KSxlLnk9LjUqKGMueStsLnkpKToyPT09biYmSC5jYShjLngsdGhpcy5pKDApLngpJiZILmNhKGMueSx0aGlzLmkoMCkueSkmJihlLng9LjUqKGMueCtsLngpLGUueT0uNSooYy55K2wueSkpO3BlKGgsZS54LWQsZS55LWssZy54LWQsZy55LWssbC54LWQsbC55LWspO2Yuc2V0KGcpO2Uuc2V0KGIpO2M9bDt9fWY9Yy54O2M9Yy55O2U9dGhpcy5pKHRoaXMucG9pbnRzQ291bnQtMSk7MCE9PXRoaXMuY29tcHV0ZVNob3J0TGVuZ3RoKCExKSYmKGU9aXAodGhpcyxlLmNvcHkoKSwhMSxhYykpO2Y9LjUqKGYrZS54KTtjPS41KihjK2UueSk7cGUoaCxiLngtZCxiLnktayxmLWQsYy1rLGUueC1kLGUueS1rKTt9ZWxzZSBmb3IoYz0zO2M8YjtjKz0zKXtmPXRoaXMuaShjLTIpLGMrMz49YiYmKGM9Yi0xKSxlPXRoaXMuaShjLTEpLGc9dGhpcy5pKGMpLGM9PT1iLTEmJjAhPT10aGlzLmNvbXB1dGVTaG9ydExlbmd0aCghMSkmJihnPWlwKHRoaXMsZy5jb3B5KCksITEsYWMpKSxwZShoLGYueC1kLGYueS1rLGUueC1kLGUueS1rLGcueC1kLGcueS1rKTt9fWVsc2V7Zj1HLmFsbG9jKCk7Zi5hc3NpZ24odGhpcy5pKDApKTtnPTE7Zm9yKGU9MDtnPGI7KXtnPWpwKHRoaXMsZixnLDE8Zyk7bT10aGlzLmkoZyk7aWYoZz49Yi0xKXtpZighZi5BKG0pKTAhPT10aGlzLmNvbXB1dGVTaG9ydExlbmd0aCghMSkmJihtPWlwKHRoaXMsbS5jb3B5KCksITEsYWMpKSxscCh0aGlzLGgsLWQsLWssZixtLGMpO2Vsc2UgaWYoMD09PWUpZm9yKGc9MTtnPGI7KXttPXRoaXMuaShnKyspLGxwKHRoaXMsaCwtZCwtayxmLG0sYyksZi5hc3NpZ24obSk7fWJyZWFrO31lPWpwKHRoaXMsbSxnKzEsZzxiLTMpO2c9LWQ7bD0taztuPXRoaXMuaShlKTt4PWM7SC53KGYueSxtLnkpJiZILncobS54LG4ueCk/KHA9dGhpcy5jb21wdXRlQ29ybmVyKCkscD1NYXRoLm1pbihwLE1hdGguYWJzKG0ueC1mLngpLzIpLHA9dT1NYXRoLm1pbihwLE1hdGguYWJzKG4ueS1tLnkpLzIpLEgudyhwLDApPyhscCh0aGlzLGgsZyxsLGYsbSx4KSxmLmFzc2lnbihtKSk6KHY9bS54LHE9bS55LHk9dixyPXEsbS54PmYueD92PW0ueC1wOnY9bS54K3Asbi55Pm0ueT9yPW0ueSt1OnI9bS55LXUsbHAodGhpcyxoLGcsbCxmLG5ldyBHKHYscSkseCksdGUoaCxtLngrZyxtLnkrbCx5K2cscitsKSxmLmgoeSxyKSkpOkgudyhmLngsbS54KSYmSC53KG0ueSxuLnkpPyhwPXRoaXMuY29tcHV0ZUNvcm5lcigpLHA9TWF0aC5taW4ocCxNYXRoLmFicyhtLnktZi55KS8yKSxwPXU9TWF0aC5taW4ocCxNYXRoLmFicyhuLngtbS54KS8yKSxILncodSwwKT8obHAodGhpcyxoLGcsbCxmLG0seCksZi5hc3NpZ24obSkpOih2PW0ueCxxPW0ueSx5PXYscj1xLG0ueT5mLnk/cT1tLnktcDpxPW0ueStwLG4ueD5tLng/eT1tLngrdTp5PW0ueC11LGxwKHRoaXMsaCxnLGwsZixuZXcgRyh2LHEpLHgpLHRlKGgsbS54K2csbS55K2wseStnLHIrbCksZi5oKHkscikpKToobHAodGhpcyxoLGcsbCxmLG0seCksZi5hc3NpZ24obSkpO2c9ZTt9Ry5mcmVlKGYpO313ZT1oO31lbHNlIGg9dGhpcy5pKDEpLmNvcHkoKSxoLngtPWQsaC55LT1rLDAhPT10aGlzLmNvbXB1dGVTaG9ydExlbmd0aCghMCkmJihlPWlwKHRoaXMsZSwhMCxmKSksMCE9PXRoaXMuY29tcHV0ZVNob3J0TGVuZ3RoKCExKSYmKGg9aXAodGhpcyxoLCExLGYpKSxhLnR5cGU9Y2UsYS5zdGFydFg9ZS54LGEuc3RhcnRZPWUueSxhLmVuZFg9aC54LGEuZW5kWT1oLnk7dGhpcy5Rbj0hMTtyZXR1cm4gYTt9O2Z1bmN0aW9uIGtwKGEsYixjLGQpe2E9Yy1hO2lmKGlzTmFOKGEpfHxJbmZpbml0eT09PWF8fC1JbmZpbml0eT09PWEpcmV0dXJuIE5hTjswPmEmJihhPS1hKTtiPWQtYjtpZihpc05hTihiKXx8SW5maW5pdHk9PT1ifHwtSW5maW5pdHk9PT1iKXJldHVybiBOYU47MD5iJiYoYj0tYik7cmV0dXJuIEguY2EoYSwwKT9iOkguY2EoYiwwKT9hOk1hdGguc3FydChhKmErYipiKTt9ZnVuY3Rpb24gaXAoYSxiLGMsZCl7dmFyIGU9YS5wb2ludHNDb3VudDtpZigyPmUpcmV0dXJuIGI7aWYoYyl7dmFyIGY9YS5pKDEpO2M9Zi54LWQueDtmPWYueS1kLnk7ZD1rcChiLngsYi55LGMsZik7aWYoMD09PWQpcmV0dXJuIGI7ZT0yPT09ZT8uNSpkOmQ7YT1hLmNvbXB1dGVTaG9ydExlbmd0aCghMCk7YT5lJiYoYT1lKTtlPWEqKGYtYi55KS9kO2IueCs9YSooYy1iLngpL2Q7Yi55Kz1lO31lbHNle2Y9YS5pKGUtMik7Yz1mLngtZC54O2Y9Zi55LWQueTtkPWtwKGIueCxiLnksYyxmKTtpZigwPT09ZClyZXR1cm4gYjtlPTI9PT1lPy41KmQ6ZDthPWEuY29tcHV0ZVNob3J0TGVuZ3RoKCExKTthPmUmJihhPWUpO2U9YSooYi55LWYpL2Q7Yi54LT1hKihiLngtYykvZDtiLnktPWU7fXJldHVybiBiO31mdW5jdGlvbiBqcChhLGIsYyxkKXtmb3IodmFyIGU9YS5wb2ludHNDb3VudCxmPWI7SC5jYShiLngsZi54KSYmSC5jYShiLnksZi55KTspe2lmKGM+PWUpcmV0dXJuIGUtMTtmPWEuaShjKyspO31pZighSC5jYShiLngsZi54KSYmIUguY2EoYi55LGYueSkpcmV0dXJuIGMtMTtmb3IodmFyIGc9ZjtILmNhKGIueCxmLngpJiZILmNhKGYueCxnLngpJiYoIWR8fChiLnk+PWYueT9mLnk+PWcueTpmLnk8PWcueSkpfHxILmNhKGIueSxmLnkpJiZILmNhKGYueSxnLnkpJiYoIWR8fChiLng+PWYueD9mLng+PWcueDpmLng8PWcueCkpOyl7aWYoYz49ZSlyZXR1cm4gZS0xO2c9YS5pKGMrKyk7fXJldHVybiBjLTI7fWZ1bmN0aW9uIGxwKGEsYixjLGQsZSxmLGcpe2lmKCFnJiZSbyhhKSl7Zz1bXTt2YXIgaD0wO2EuaXNWaXNpYmxlKCkmJihoPW1wKGEsZSxmLGcpKTtpZigwPGgpaWYoSC53KGUueSxmLnkpKXtpZihlLng8Zi54KWZvcih2YXIgaz0wO2s8aDspe3ZhciBsPU1hdGgubWF4KGUueCxNYXRoLm1pbihnW2srK10tNSxmLngtMTApKTtiLmxpbmVUbyhsK2MsZi55K2QpO3ZhciBtPWwrYztmb3IodmFyIG49TWF0aC5taW4obCsxMCxmLngpO2s8aDspe2lmKGw9Z1trXSxsPG4rMTApaysrLG49TWF0aC5taW4obCs1LGYueCk7ZWxzZSBicmVhazt9bD1mLnktMTArZDtuKz1jO3ZhciBwPWYueStkO2EuY3VydmU9PT1OZz9vZShiLG4scCwhMSk6cGUoYixtLGwsbixsLG4scCk7fWVsc2UgZm9yKC0taDswPD1oOyl7az1NYXRoLm1pbihlLngsTWF0aC5tYXgoZ1toLS1dKzUsZi54KzEwKSk7Yi5saW5lVG8oaytjLGYueStkKTttPWsrYztmb3IobD1NYXRoLm1heChrLTEwLGYueCk7MDw9aDspe2lmKGs9Z1toXSxrPmwtMTApaC0tLGw9TWF0aC5tYXgoay01LGYueCk7ZWxzZSBicmVhazt9az1mLnktMTArZDtsKz1jO249Zi55K2Q7YS5jdXJ2ZT09PU5nP29lKGIsbCxuLCExKTpwZShiLG0sayxsLGssbCxuKTt9fWVsc2UgaWYoSC53KGUueCxmLngpKWlmKGUueTxmLnkpZm9yKGs9MDtrPGg7KXtsPU1hdGgubWF4KGUueSxNYXRoLm1pbihnW2srK10tNSxmLnktMTApKTtiLmxpbmVUbyhmLngrYyxsK2QpO209bCtkO2ZvcihsPU1hdGgubWluKGwrMTAsZi55KTtrPGg7KXtpZihuPWdba10sbjxsKzEwKWsrKyxsPU1hdGgubWluKG4rNSxmLnkpO2Vsc2UgYnJlYWs7fW49Zi54LTEwK2M7cD1mLngrYztsKz1kO2EuY3VydmU9PT1OZz9vZShiLHAsbCwhMSk6cGUoYixuLG0sbixsLHAsbCk7fWVsc2UgZm9yKC0taDswPD1oOyl7az1NYXRoLm1pbihlLnksTWF0aC5tYXgoZ1toLS1dKzUsZi55KzEwKSk7Yi5saW5lVG8oZi54K2MsaytkKTttPWsrZDtmb3Ioaz1NYXRoLm1heChrLTEwLGYueSk7MDw9aDspe2lmKGw9Z1toXSxsPmstMTApaC0tLGs9TWF0aC5tYXgobC01LGYueSk7ZWxzZSBicmVhazt9bD1mLngtMTArYztuPWYueCtjO2srPWQ7YS5jdXJ2ZT09PU5nP29lKGIsbixrLCExKTpwZShiLGwsbSxsLGssbixrKTt9fWIubGluZVRvKGYueCtjLGYueStkKTt9ZnVuY3Rpb24gbXAoYSxiLGMsZCl7dmFyIGU9YS5kaWFncmFtO2lmKG51bGw9PT1lfHxiLkEoYykpcmV0dXJuIDA7Zm9yKGU9ZS5sYXllcnM7ZS5uZXh0KCk7KXt2YXIgZj1lLnZhbHVlO2lmKG51bGwhPT1mJiZmLnZpc2libGUpe2Y9Zi5GYS5qO2Zvcih2YXIgZz1mLmxlbmd0aCxoPTA7aDxnO2grKyl7dmFyIGs9ZltoXTtpZihrIGluc3RhbmNlb2YgUyl7aWYoaz09PWEpcmV0dXJuIDA8ZC5sZW5ndGgmJmQuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLWI7fSksZC5sZW5ndGg7aWYoay5pc1Zpc2libGUoKSYmUm8oaykpe3ZhciBsPWsucm91dGVCb3VuZHM7bC5vKCkmJmEucm91dGVCb3VuZHMuSWMobCkmJiFhLnVzZXNTYW1lUG9ydChrKSYmKGw9ay5wYXRoLG51bGwhPT1sJiZsLnJmKCkmJm5wKGIsYyxkLGspKTt9fX19fTA8ZC5sZW5ndGgmJmQuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLWI7fSk7cmV0dXJuIGQubGVuZ3RoO31mdW5jdGlvbiBucChhLGIsYyxkKXtmb3IodmFyIGU9SC53KGEueSxiLnkpLGY9ZC5wb2ludHNDb3VudCxnPWQuaSgwKSxoPUcuYWxsb2MoKSxrPTE7azxmO2srKyl7dmFyIGw9ZC5pKGspO2lmKGs8Zi0xKXt2YXIgbT1kLmkoaysxKTtpZihnLnk9PT1sLnkmJmwueT09PW0ueSl7aWYobC54PmcueCYmbS54Pj1sLnh8fGwueDxnLngmJm0ueDw9bC54KWNvbnRpbnVlO31lbHNlIGlmKGcueD09PWwueCYmbC54PT09bS54JiYobC55PmcueSYmbS55Pj1sLnl8fGwueTxnLnkmJm0ueTw9bC55KSljb250aW51ZTt9YTp7bT1hLng7dmFyIG49YS55LHA9Yi54LHE9Yi55LHI9Zy54O2c9Zy55O3ZhciB1PWwueCx4PWwueTtpZighSC53KG0scCkpe2lmKEgudyhuLHEpJiZILncocix1KSYmTWF0aC5taW4obSxwKTxyJiZNYXRoLm1heChtLHApPnImJk1hdGgubWluKGcseCk8biYmTWF0aC5tYXgoZyx4KT5uJiYhSC53KGcseCkpe2gueD1yO2gueT1uO209ITA7YnJlYWsgYTt9fWVsc2UgaWYoIUgudyhuLHEpJiZILncoZyx4KSYmTWF0aC5taW4obixxKTxnJiZNYXRoLm1heChuLHEpPmcmJk1hdGgubWluKHIsdSk8bSYmTWF0aC5tYXgocix1KT5tJiYhSC53KHIsdSkpe2gueD1tO2gueT1nO209ITA7YnJlYWsgYTt9aC54PTA7aC55PTA7bT0hMTt9bSYmKGU/Yy5wdXNoKGgueCk6Yy5wdXNoKGgueSkpO2c9bDt9Ry5mcmVlKGgpO31mdW5jdGlvbiBSbyhhKXthPWEuY3VydmU7cmV0dXJuIGE9PT1NZ3x8YT09PU5nO31mdW5jdGlvbiBWbyhhLGIpe2lmKGJ8fFJvKGEpKWI9YS5kaWFncmFtLG51bGw9PT1ifHxiLlVpfHxiLldoLmNvbnRhaW5zKGEpfHwwPT09YS54bC53aWR0aCYmMD09PWEueGwuaGVpZ2h0fHxiLldoLmFkZChhLGEueGwpO31TLnByb3RvdHlwZS4kcD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmxheWVyO2lmKG51bGwhPT1iJiZiLnZpc2libGUmJiFiLmlzVGVtcG9yYXJ5KXt2YXIgYz1iLmRpYWdyYW07aWYobnVsbCE9PWMmJiFjLmFuaW1hdGlvbk1hbmFnZXIuaXNBbmltYXRpbmcpe3ZhciBkPSExO2ZvcihjPWMubGF5ZXJzO2MubmV4dCgpOyl7dmFyIGU9Yy52YWx1ZTtpZihlLnZpc2libGUpaWYoZT09PWIpe2Q9ITA7dmFyIGY9ITE7ZT1lLkZhLmo7Zm9yKHZhciBnPWUubGVuZ3RoLGg9MDtoPGc7aCsrKXt2YXIgaz1lW2hdO2sgaW5zdGFuY2VvZiBTJiYoaz09PXRoaXM/Zj0hMDpmJiZvcCh0aGlzLGssYSkpO319ZWxzZSBpZihkKWZvcihmPWUuRmEuaixlPWYubGVuZ3RoLGc9MDtnPGU7ZysrKXtoPWZbZ10saCBpbnN0YW5jZW9mIFMmJm9wKHRoaXMsaCxhKTt9fX19fTtmdW5jdGlvbiBvcChhLGIsYyl7aWYobnVsbCE9PWImJm51bGwhPT1iLnFhJiZSbyhiKSl7dmFyIGQ9Yi5yb3V0ZUJvdW5kcztkLm8oKSYmKGEucm91dGVCb3VuZHMuSWMoZCl8fGMuSWMoZCkpJiYoYS51c2VzU2FtZVBvcnQoYil8fGIuYmMoKSk7fX1TLnByb3RvdHlwZS51c2VzU2FtZVBvcnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wb2ludHNDb3VudCxjPWEucG9pbnRzQ291bnQ7aWYoMDxiJiYwPGMpe3ZhciBkPXRoaXMuaSgwKSxlPWEuaSgwKTtpZihkLlFhKGUpKXJldHVybiEwO2I9dGhpcy5pKGItMSk7YT1hLmkoYy0xKTtpZihiLlFhKGEpfHxkLlFhKGEpfHxiLlFhKGUpKXJldHVybiEwO31lbHNlIGlmKHRoaXMuZnJvbU5vZGU9PT1hLmZyb21Ob2RlfHx0aGlzLnRvTm9kZT09PWEudG9Ob2RlfHx0aGlzLmZyb21Ob2RlPT09YS50b05vZGV8fHRoaXMudG9Ob2RlPT09YS5mcm9tTm9kZSlyZXR1cm4hMDtyZXR1cm4hMTt9O1MucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbigpe2lmKCFULnByb3RvdHlwZS5pc1Zpc2libGUuY2FsbCh0aGlzKSlyZXR1cm4hMTt2YXIgYT10aGlzLmNvbnRhaW5pbmdHcm91cCxiPSEwLGM9dGhpcy5kaWFncmFtO251bGwhPT1jJiYoYj1jLmlzVHJlZVBhdGhUb0NoaWxkcmVuKTtjPXRoaXMuZnJvbU5vZGU7aWYobnVsbCE9PWMpe2lmKHRoaXMuaXNUcmVlTGluayYmYiYmIWMuaXNUcmVlRXhwYW5kZWQpcmV0dXJuITE7aWYoYz09PWEpcmV0dXJuITA7Zm9yKHZhciBkPWM7bnVsbCE9PWQ7KXtpZihkLmxhYmVsZWRMaW5rPT09dGhpcylyZXR1cm4hMDtkPWQuY29udGFpbmluZ0dyb3VwO31jPWMuZmluZFZpc2libGVOb2RlKCk7aWYobnVsbD09PWN8fGM9PT1hKXJldHVybiExO31jPXRoaXMudG9Ob2RlO2lmKG51bGwhPT1jKXtpZih0aGlzLmlzVHJlZUxpbmsmJiFiJiYhYy5pc1RyZWVFeHBhbmRlZClyZXR1cm4hMTtpZihjPT09YSlyZXR1cm4hMDtmb3IoYj1jO251bGwhPT1iOyl7aWYoYi5sYWJlbGVkTGluaz09PXRoaXMpcmV0dXJuITA7Yj1iLmNvbnRhaW5pbmdHcm91cDt9Yj1jLmZpbmRWaXNpYmxlTm9kZSgpO2lmKG51bGw9PT1ifHxiPT09YSlyZXR1cm4hMTt9cmV0dXJuITA7fTtTLnByb3RvdHlwZS5NYj1mdW5jdGlvbihhKXtULnByb3RvdHlwZS5NYi5jYWxsKHRoaXMsYSk7bnVsbCE9PXRoaXMueGYmJnRoaXMueGYuY20oKTtpZihudWxsIT09dGhpcy4kYylmb3IodmFyIGI9dGhpcy4kYy5pdGVyYXRvcjtiLm5leHQoKTspe2IudmFsdWUuTWIoYSk7fX07ZnVuY3Rpb24gU28oYSl7dmFyIGI9YS5PZTtpZihudWxsIT09Yil7dmFyIGM9YS5lZjtpZihudWxsIT09Yyl7Zm9yKHZhciBkPWEuUGUsZT1hLmZmLGY9YT1udWxsLGc9Yi5ZYS5qLGg9Zy5sZW5ndGgsaz0wO2s8aDtrKyspe3ZhciBsPWdba107aWYobC5PZT09PWImJmwuUGU9PT1kJiZsLmVmPT09YyYmbC5mZj09PWV8fGwuT2U9PT1jJiZsLlBlPT09ZSYmbC5lZj09PWImJmwuZmY9PT1kKW51bGw9PT1mP2Y9bDoobnVsbD09PWEmJihhPVtdLGEucHVzaChmKSksYS5wdXNoKGwpKTt9aWYobnVsbCE9PWEpe2Y9eG8oYixjLGQsZSk7bnVsbD09PWYmJihmPW5ldyBwcChiLGQsYyxlKSx3byhiLGYpLHdvKGMsZikpO2YubGlua3M9YTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXthW2JdLnhmPWY7fWYuY20oKTt9fX19ZnVuY3Rpb24gVG8oYSl7dmFyIGI9YS54ZjtudWxsIT09YiYmKGEueGY9bnVsbCxhPWIubGlua3MuaW5kZXhPZihhKSwwPD1hJiYoSmEoYi5saW5rcyxhKSxiLmNtKCkpKTt9Uy5wcm90b3R5cGUuemg9ZnVuY3Rpb24oKXtyZXR1cm4hMDt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFMucHJvdG90eXBlLHtmcm9tTm9kZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk9lO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLk9lO2lmKGIhPT1hKXt2YXIgYz10aGlzLmZyb21Qb3J0O251bGwhPT1iJiYodGhpcy5lZiE9PWImJkFvKGIsdGhpcyxjKSxUbyh0aGlzKSx0aGlzLkIoMikpO3RoaXMuT2U9YTtudWxsIT09YSYmdGhpcy5NYihhLmlzVmlzaWJsZSgpKTt0aGlzLkdmPW51bGw7dGhpcy5SYSgpO3ZhciBkPXRoaXMuZGlhZ3JhbTtudWxsIT09ZCYmZC5wYXJ0TWFuYWdlci5zZXRGcm9tTm9kZUZvckxpbmsodGhpcyxhLGIpO3ZhciBlPXRoaXMuZnJvbVBvcnQsZj10aGlzLmZyb21Qb3J0Q2hhbmdlZDtpZihudWxsIT09Zil7dmFyIGc9ITA7bnVsbCE9PWQmJihnPWQuZGEsZC5kYT0hMCk7Zih0aGlzLGMsZSk7bnVsbCE9PWQmJihkLmRhPWcpO31udWxsIT09YSYmKHRoaXMuZWYhPT1hJiZ6byhhLHRoaXMsZSksU28odGhpcyksdGhpcy5CKDEpKTt0aGlzLmcoImZyb21Ob2RlIixiLGEpO3VvKHRoaXMpO319fSxmcm9tUG9ydElkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUGU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuUGU7aWYoYiE9PWEpe3ZhciBjPXRoaXMuZnJvbVBvcnQ7bnVsbCE9PWMmJnlvKHRoaXMuZnJvbU5vZGUsYyk7VG8odGhpcyk7dGhpcy5QZT1hO3ZhciBkPXRoaXMuZnJvbVBvcnQ7bnVsbCE9PWQmJnlvKHRoaXMuZnJvbU5vZGUsZCk7dmFyIGU9dGhpcy5kaWFncmFtO2lmKG51bGwhPT1lKXt2YXIgZj10aGlzLmRhdGEsZz1lLm1vZGVsO251bGwhPT1mJiZnLmVtKCkmJmcuSHgoZixhKTt9YyE9PWQmJih0aGlzLkdmPW51bGwsdGhpcy5SYSgpLGY9dGhpcy5mcm9tUG9ydENoYW5nZWQsbnVsbCE9PWYmJihnPSEwLG51bGwhPT1lJiYoZz1lLmRhLGUuZGE9ITApLGYodGhpcyxjLGQpLG51bGwhPT1lJiYoZS5kYT1nKSkpO1NvKHRoaXMpO3RoaXMuZygiZnJvbVBvcnRJZCIsYixhKTt9fX0sZnJvbVBvcnQ6e2dldDpmdW5jdGlvbiBnZXQoKXt2YXIgYT10aGlzLk9lO3JldHVybiBudWxsPT09YT9udWxsOmEuVHModGhpcy5QZSk7fX0sZnJvbVBvcnRDaGFuZ2VkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRm47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuRm47YiE9PWEmJih0aGlzLkZuPWEsdGhpcy5nKCJmcm9tUG9ydENoYW5nZWQiLGIsYSkpO319LHRvTm9kZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmVmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmVmO2lmKGIhPT1hKXt2YXIgYz10aGlzLnRvUG9ydDtudWxsIT09YiYmKHRoaXMuT2UhPT1iJiZBbyhiLHRoaXMsYyksVG8odGhpcyksdGhpcy5CKDIpKTt0aGlzLmVmPWE7bnVsbCE9PWEmJnRoaXMuTWIoYS5pc1Zpc2libGUoKSk7dGhpcy5HZj1udWxsO3RoaXMuUmEoKTt2YXIgZD10aGlzLmRpYWdyYW07bnVsbCE9PWQmJmQucGFydE1hbmFnZXIuc2V0VG9Ob2RlRm9yTGluayh0aGlzLGEsYik7dmFyIGU9dGhpcy50b1BvcnQsZj10aGlzLnRvUG9ydENoYW5nZWQ7aWYobnVsbCE9PWYpe3ZhciBnPSEwO251bGwhPT1kJiYoZz1kLmRhLGQuZGE9ITApO2YodGhpcyxjLGUpO251bGwhPT1kJiYoZC5kYT1nKTt9bnVsbCE9PWEmJih0aGlzLk9lIT09YSYmem8oYSx0aGlzLGUpLFNvKHRoaXMpLHRoaXMuQigxKSk7dGhpcy5nKCJ0b05vZGUiLGIsYSk7dW8odGhpcyk7fX19LHRvUG9ydElkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZmY7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuZmY7aWYoYiE9PWEpe3ZhciBjPXRoaXMudG9Qb3J0O251bGwhPT1jJiZ5byh0aGlzLnRvTm9kZSxjKTtUbyh0aGlzKTt0aGlzLmZmPWE7dmFyIGQ9dGhpcy50b1BvcnQ7bnVsbCE9PWQmJnlvKHRoaXMudG9Ob2RlLGQpO3ZhciBlPXRoaXMuZGlhZ3JhbTtpZihudWxsIT09ZSl7dmFyIGY9dGhpcy5kYXRhLGc9ZS5tb2RlbDtudWxsIT09ZiYmZy5lbSgpJiZnLkx4KGYsYSk7fWMhPT1kJiYodGhpcy5HZj1udWxsLHRoaXMuUmEoKSxmPXRoaXMudG9Qb3J0Q2hhbmdlZCxudWxsIT09ZiYmKGc9ITAsbnVsbCE9PWUmJihnPWUuZGEsZS5kYT0hMCksZih0aGlzLGMsZCksbnVsbCE9PWUmJihlLmRhPWcpKSk7U28odGhpcyk7dGhpcy5nKCJ0b1BvcnRJZCIsYixhKTt9fX0sdG9Qb3J0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7dmFyIGE9dGhpcy5lZjtyZXR1cm4gbnVsbD09PWE/bnVsbDphLlRzKHRoaXMuZmYpO319LHRvUG9ydENoYW5nZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5CcDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5CcDtiIT09YSYmKHRoaXMuQnA9YSx0aGlzLmcoInRvUG9ydENoYW5nZWQiLGIsYSkpO319LGZyb21TcG90OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLlA/dGhpcy5QLkxnOkVkO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkhjKCk7dmFyIGI9dGhpcy5QLkxnO2IuQShhKXx8KGE9YS5JKCksdGhpcy5QLkxnPWEsdGhpcy5nKCJmcm9tU3BvdCIsYixhKSx0aGlzLlJhKCkpO319LGZyb21FbmRTZWdtZW50TGVuZ3RoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLlA/dGhpcy5QLkpnOk5hTjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5KZztiIT09YSYmKDA+YSYmeGEoYSwiPj0gMCIsUywiZnJvbUVuZFNlZ21lbnRMZW5ndGgiKSx0aGlzLlAuSmc9YSx0aGlzLmcoImZyb21FbmRTZWdtZW50TGVuZ3RoIixiLGEpLHRoaXMuUmEoKSk7fX0sZnJvbVNob3J0TGVuZ3RoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLlA/dGhpcy5QLktnOk5hTjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5LZztiIT09YSYmKHRoaXMuUC5LZz1hLHRoaXMuZygiZnJvbVNob3J0TGVuZ3RoIixiLGEpLHRoaXMuUmEoKSx0aGlzLmJjKCkpO319LHRvU3BvdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBudWxsIT09dGhpcy5QP3RoaXMuUC5uaDpFZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5uaDtiLkEoYSl8fChhPWEuSSgpLHRoaXMuUC5uaD1hLHRoaXMuZygidG9TcG90IixiLGEpLHRoaXMuUmEoKSk7fX0sdG9FbmRTZWdtZW50TGVuZ3RoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLlA/dGhpcy5QLmxoOk5hTjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5saDtiIT09YSYmKDA+YSYmeGEoYSwiPj0gMCIsUywidG9FbmRTZWdtZW50TGVuZ3RoIiksdGhpcy5QLmxoPWEsdGhpcy5nKCJ0b0VuZFNlZ21lbnRMZW5ndGgiLGIsYSksdGhpcy5SYSgpKTt9fSx0b1Nob3J0TGVuZ3RoOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGwhPT10aGlzLlA/dGhpcy5QLm1oOk5hTjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5IYygpO3ZhciBiPXRoaXMuUC5taDtiIT09YSYmKHRoaXMuUC5taD1hLHRoaXMuZygidG9TaG9ydExlbmd0aCIsYixhKSx0aGlzLlJhKCksdGhpcy5iYygpKTt9fSxpc0xhYmVsZWRMaW5rOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGw9PT10aGlzLiRjPyExOjA8dGhpcy4kYy5jb3VudDt9fSxsYWJlbE5vZGVzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIG51bGw9PT10aGlzLiRjP3hiOnRoaXMuJGMuaXRlcmF0b3I7fX0scmVsaW5rYWJsZUZyb206e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLlRhJjEpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuVGEmMSk7YiE9PWEmJih0aGlzLlRhXj0xLHRoaXMuZygicmVsaW5rYWJsZUZyb20iLGIsYSksdGhpcy5KYigpKTt9fSxyZWxpbmthYmxlVG86e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLlRhJjIpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj0wIT09KHRoaXMuVGEmMik7YiE9PWEmJih0aGlzLlRhXj0yLHRoaXMuZygicmVsaW5rYWJsZVRvIixiLGEpLHRoaXMuSmIoKSk7fX0scmVzZWdtZW50YWJsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuVGEmNCk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPTAhPT0odGhpcy5UYSY0KTtiIT09YSYmKHRoaXMuVGFePTQsdGhpcy5nKCJyZXNlZ21lbnRhYmxlIixiLGEpLHRoaXMuSmIoKSk7fX0saXNUcmVlTGluazp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuVGEmOCk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPTAhPT0odGhpcy5UYSY4KTtiIT09YSYmKHRoaXMuVGFePTgsdGhpcy5nKCJpc1RyZWVMaW5rIixiLGEpLG51bGwhPT10aGlzLmZyb21Ob2RlJiZ2ayh0aGlzLmZyb21Ob2RlKSxudWxsIT09dGhpcy50b05vZGUmJnZrKHRoaXMudG9Ob2RlKSk7fX0scGF0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMuemIoKTtyZXR1cm4gYSBpbnN0YW5jZW9mIFc/YTpudWxsO319LHJvdXRlQm91bmRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7dGhpcy5ZaSgpO3ZhciBhPXRoaXMueGwsYj1JbmZpbml0eSxjPUluZmluaXR5LGQ9dGhpcy5wb2ludHNDb3VudDtpZigwPT09ZClhLmgoTmFOLE5hTiwwLDApO2Vsc2V7aWYoMT09PWQpZD10aGlzLmkoMCksYj1NYXRoLm1pbihkLngsYiksYz1NYXRoLm1pbihkLnksYyksYS5oKGQueCxkLnksMCwwKTtlbHNlIGlmKDI9PT1kKXtkPXRoaXMuaSgwKTt2YXIgZT10aGlzLmkoMSk7Yj1NYXRoLm1pbihkLngsZS54KTtjPU1hdGgubWluKGQueSxlLnkpO2EuaChkLngsZC55LDAsMCk7YS5JZShlKTt9ZWxzZSBpZih0aGlzLmNvbXB1dGVDdXJ2ZSgpPT09UmcmJjM8PWQmJiF0aGlzLmlzT3J0aG9nb25hbCl7aWYoZT10aGlzLmkoMCksYj1lLngsYz1lLnksYS5oKGIsYywwLDApLDM9PT1kKXtkPXRoaXMuaSgxKTtiPU1hdGgubWluKGQueCxiKTtjPU1hdGgubWluKGQueSxjKTt2YXIgZj10aGlzLmkoMik7Yj1NYXRoLm1pbihmLngsYik7Yz1NYXRoLm1pbihmLnksYyk7SC5TbChlLngsZS55LGQueCxkLnksZC54LGQueSxmLngsZi55LC41LGEpO31lbHNlIGZvcihmPTM7ZjxkO2YrPTMpe3ZhciBnPXRoaXMuaShmLTIpO2YrMz49ZCYmKGY9ZC0xKTt2YXIgaD10aGlzLmkoZi0xKSxrPXRoaXMuaShmKTtILlNsKGUueCxlLnksZy54LGcueSxoLngsaC55LGsueCxrLnksLjUsYSk7Yj1NYXRoLm1pbihrLngsYik7Yz1NYXRoLm1pbihrLnksYyk7ZT1rO319ZWxzZSBmb3IoZT10aGlzLmkoMCksZj10aGlzLmkoMSksYj1NYXRoLm1pbihlLngsZi54KSxjPU1hdGgubWluKGUueSxmLnkpLGEuaChlLngsZS55LDAsMCksYS5JZShmKSxlPTI7ZTxkO2UrKyl7Zj10aGlzLmkoZSksYj1NYXRoLm1pbihmLngsYiksYz1NYXRoLm1pbihmLnksYyksYS5JZShmKTt9dGhpcy56dS5oKGItYS54LGMtYS55KTt9cmV0dXJuIGE7fX0sbWlkUG9pbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXt0aGlzLllpKCk7cmV0dXJuIHRoaXMuY29tcHV0ZU1pZFBvaW50KG5ldyBHKCkpO319LG1pZEFuZ2xlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7dGhpcy5ZaSgpO3JldHVybiB0aGlzLmNvbXB1dGVNaWRBbmdsZSgpO319LGZsYXR0ZW5lZExlbmd0aHM6e2dldDpmdW5jdGlvbiBnZXQoKXtpZihudWxsPT09dGhpcy5rcil7dGhpcy5MY3x8VW8odGhpcyk7Zm9yKHZhciBhPXRoaXMua3I9W10sYj10aGlzLnBvaW50c0NvdW50LGM9MDtjPGItMTtjKyspe3ZhciBkPXRoaXMuaShjKTt2YXIgZT10aGlzLmkoYysxKTtILmNhKGQueCxlLngpPyhkPWUueS1kLnksMD5kJiYoZD0tZCkpOkguY2EoZC55LGUueSk/KGQ9ZS54LWQueCwwPmQmJihkPS1kKSk6ZD1NYXRoLnNxcnQoZC5CZShlKSk7YS5wdXNoKGQpO319cmV0dXJuIHRoaXMua3I7fX0sZmxhdHRlbmVkVG90YWxMZW5ndGg6e2dldDpmdW5jdGlvbiBnZXQoKXt2YXIgYT10aGlzLmF1O2lmKGlzTmFOKGEpKXtmb3IodmFyIGI9dGhpcy5mbGF0dGVuZWRMZW5ndGhzLGM9Yi5sZW5ndGgsZD1hPTA7ZDxjO2QrKyl7YSs9YltkXTt9dGhpcy5hdT1hO31yZXR1cm4gYTt9fSxwb2ludHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy54Yjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy54YjtpZihiIT09YSl7dmFyIGM9bnVsbDtpZihBcnJheS5pc0FycmF5KGEpKXt2YXIgZD0wPT09YS5sZW5ndGglMjtpZihkKWZvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKXtpZigibnVtYmVyIiE9PXR5cGVvZiBhW2VdfHxpc05hTihhW2VdKSl7ZD0hMTticmVhazt9fWlmKGQpZm9yKGM9bmV3IEUoKSxkPTA7ZDxhLmxlbmd0aC8yO2QrKyl7ZT1uZXcgRyhhWzIqZF0sYVsyKmQrMV0pLmZyZWV6ZSgpLGMuYWRkKGUpO31lbHNle2Q9ITA7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGY9YVtlXTtpZighQ2EoZil8fCJudW1iZXIiIT09dHlwZW9mIGYueHx8aXNOYU4oZi54KXx8Im51bWJlciIhPT10eXBlb2YgZi55fHxpc05hTihmLnkpKXtkPSExO2JyZWFrO319aWYoZClmb3IoYz1uZXcgRSgpLGQ9MDtkPGEubGVuZ3RoO2QrKyl7ZT1hW2RdLGMuYWRkKG5ldyBHKGUueCxlLnkpLmZyZWV6ZSgpKTt9fX1lbHNlIGlmKGEgaW5zdGFuY2VvZiBFKWZvcihjPWEuY29weSgpLGE9Yy5pdGVyYXRvcjthLm5leHQoKTspe2EudmFsdWUuZnJlZXplKCk7fWVsc2UgQSgiTGluay5wb2ludHMgdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIExpc3Qgb3IgQXJyYXk6ICIrYSk7Yy5mcmVlemUoKTt0aGlzLnhiPWM7dGhpcy5iYygpO3RoaXMucygpO1VvKHRoaXMpO2E9dGhpcy5kaWFncmFtO251bGwhPT1hJiYoYS5PaXx8YS51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nfHxhLmd0LmFkZCh0aGlzKSxhLmFuaW1hdGlvbk1hbmFnZXIucmImJih0aGlzLmJoPWMpKTt0aGlzLmcoInBvaW50cyIsYixjKTt9fX0scG9pbnRzQ291bnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy54Yi5jb3VudDt9fSxMYzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiAwIT09KHRoaXMuVGEmMTYpO30sc2V0OmZ1bmN0aW9uIHNldChhKXswIT09KHRoaXMuVGEmMTYpIT09YSYmKHRoaXMuVGFePTE2KTt9fSxzdXNwZW5kc1JvdXRpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLlRhJjMyKTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7MCE9PSh0aGlzLlRhJjMyKSE9PWEmJih0aGlzLlRhXj0zMik7fX0sT3U6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMCE9PSh0aGlzLlRhJjY0KTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7MCE9PSh0aGlzLlRhJjY0KSE9PWEmJih0aGlzLlRhXj02NCk7fX0sZGVmYXVsdEZyb21Qb2ludDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudT1hLmNvcHkoKTt9fSxkZWZhdWx0VG9Qb2ludDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLks7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSz1hLmNvcHkoKTt9fSxpc09ydGhvZ29uYWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gMj09PSh0aGlzLkVqLnZhbHVlJjIpO319LGlzQXZvaWRpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gND09PSh0aGlzLkVqLnZhbHVlJjQpO319LGdlb21ldHJ5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7dGhpcy5RbiYmKHRoaXMuWWkoKSx0aGlzLnFhPXRoaXMubWFrZUdlb21ldHJ5KCkpO3JldHVybiB0aGlzLnFhO319LGZpcnN0UGlja0luZGV4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIDI+PXRoaXMucG9pbnRzQ291bnQ/MDp0aGlzLmlzT3J0aG9nb25hbHx8IVdvKHRoaXMuY29tcHV0ZVNwb3QoITApKT8xOjA7fX0sbGFzdFBpY2tJbmRleDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMucG9pbnRzQ291bnQ7cmV0dXJuIDA9PT1hPzA6Mj49YT9hLTE6dGhpcy5pc09ydGhvZ29uYWx8fCFXbyh0aGlzLmNvbXB1dGVTcG90KCExKSk/YS0yOmEtMTt9fSxhZGp1c3Rpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5MbTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5MbTtiIT09YSYmKHRoaXMuTG09YSx0aGlzLmcoImFkanVzdGluZyIsYixhKSk7fX0sY29ybmVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZ247fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuZ247YiE9PWEmJih0aGlzLmduPWEsdGhpcy5iYygpLHRoaXMuZygiY29ybmVyIixiLGEpKTt9fSxjdXJ2ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmtuO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmtuO2IhPT1hJiYodGhpcy5rbj1hLHRoaXMuUmEoKSx0aGlzLmJjKCksVm8odGhpcyxiPT09Tmd8fGI9PT1NZ3x8YT09PU5nfHxhPT09TWcpLHRoaXMuZygiY3VydmUiLGIsYSkpO319LGN1cnZpbmVzczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmxuO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmxuO2IhPT1hJiYodGhpcy5sbj1hLHRoaXMuUmEoKSx0aGlzLmJjKCksdGhpcy5nKCJjdXJ2aW5lc3MiLGIsYSkpO319LHJvdXRpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Fajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5FajtiIT09YSYmKHRoaXMuRWo9YSx0aGlzLkdmPW51bGwsdGhpcy5SYSgpLFZvKHRoaXMsMj09PShiLnZhbHVlJjIpfHwyPT09KGEudmFsdWUmMikpLHRoaXMuZygicm91dGluZyIsYixhKSk7fX0sc21vb3RobmVzczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnBwO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnBwO2IhPT1hJiYodGhpcy5wcD1hLHRoaXMuYmMoKSx0aGlzLmcoInNtb290aG5lc3MiLGIsYSkpO319LGtleTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3ZhciBhPXRoaXMuZGlhZ3JhbTtpZihudWxsIT09YSYmYS5tb2RlbC5lbSgpKXJldHVybiBhLm1vZGVsLmljKHRoaXMuZGF0YSk7fX19KTtTLnByb3RvdHlwZS5pbnZhbGlkYXRlT3RoZXJKdW1wT3ZlcnM9Uy5wcm90b3R5cGUuJHA7Uy5wcm90b3R5cGUuZmluZENsb3Nlc3RTZWdtZW50PVMucHJvdG90eXBlLkl5O1MucHJvdG90eXBlLnVwZGF0ZVJvdXRlPVMucHJvdG90eXBlLllpO1MucHJvdG90eXBlLmludmFsaWRhdGVSb3V0ZT1TLnByb3RvdHlwZS5SYTtTLnByb3RvdHlwZS5yb2xsYmFja1JvdXRlPVMucHJvdG90eXBlLkN4O1MucHJvdG90eXBlLmNvbW1pdFJvdXRlPVMucHJvdG90eXBlLmtmO1MucHJvdG90eXBlLnN0YXJ0Um91dGU9Uy5wcm90b3R5cGUuQmg7Uy5wcm90b3R5cGUuY2xlYXJQb2ludHM9Uy5wcm90b3R5cGUuVGo7Uy5wcm90b3R5cGUucmVtb3ZlUG9pbnQ9Uy5wcm90b3R5cGUuenY7Uy5wcm90b3R5cGUuYWRkUG9pbnRBdD1TLnByb3RvdHlwZS5qZjtTLnByb3RvdHlwZS5hZGRQb2ludD1TLnByb3RvdHlwZS54ZTtTLnByb3RvdHlwZS5pbnNlcnRQb2ludEF0PVMucHJvdG90eXBlLm07Uy5wcm90b3R5cGUuaW5zZXJ0UG9pbnQ9Uy5wcm90b3R5cGUub3o7Uy5wcm90b3R5cGUuc2V0UG9pbnRBdD1TLnByb3RvdHlwZS5NO1MucHJvdG90eXBlLnNldFBvaW50PVMucHJvdG90eXBlLmpkO1MucHJvdG90eXBlLmdldFBvaW50PVMucHJvdG90eXBlLmk7Uy5wcm90b3R5cGUuZ2V0T3RoZXJQb3J0PVMucHJvdG90eXBlLmV6O1MucHJvdG90eXBlLmdldE90aGVyTm9kZT1TLnByb3RvdHlwZS5Yczt2YXIgTG89bmV3IEQoUywiTm9ybWFsIiwxKSxxcD1uZXcgRChTLCJPcnRob2dvbmFsIiwyKSxycD1uZXcgRChTLCJBdm9pZHNOb2RlcyIsNiksYXA9bmV3IEQoUywiQXZvaWRzTm9kZXNTdHJhaWdodCIsNyksT2c9bmV3IEQoUywiTm9uZSIsMCksUmc9bmV3IEQoUywiQmV6aWVyIiw5KSxOZz1uZXcgRChTLCJKdW1wR2FwIiwxMCksTWc9bmV3IEQoUywiSnVtcE92ZXIiLDExKSxNbz1uZXcgRChTLCJFbmQiLDE3KSxObz1uZXcgRChTLCJTY2FsZSIsMTgpLE9vPW5ldyBEKFMsIlN0cmV0Y2giLDE5KSxzbj1uZXcgRChTLCJPcmllbnRBbG9uZyIsMjEpLERtPW5ldyBEKFMsIk9yaWVudFBsdXM5MCIsMjIpLEZtPW5ldyBEKFMsIk9yaWVudE1pbnVzOTAiLDIzKSxQbz1uZXcgRChTLCJPcmllbnRPcHBvc2l0ZSIsMjQpLFFvPW5ldyBEKFMsIk9yaWVudFVwcmlnaHQiLDI1KSxFbT1uZXcgRChTLCJPcmllbnRQbHVzOTBVcHJpZ2h0IiwyNiksR209bmV3IEQoUywiT3JpZW50TWludXM5MFVwcmlnaHQiLDI3KSxIbT1uZXcgRChTLCJPcmllbnRVcHJpZ2h0NDUiLDI4KTtTLmNsYXNzTmFtZT0iTGluayI7Uy5Ob3JtYWw9TG87Uy5PcnRob2dvbmFsPXFwO1MuQXZvaWRzTm9kZXM9cnA7Uy5Bdm9pZHNOb2Rlc1N0cmFpZ2h0PWFwO1MuTm9uZT1PZztTLkJlemllcj1SZztTLkp1bXBHYXA9Tmc7Uy5KdW1wT3Zlcj1NZztTLkVuZD1NbztTLlNjYWxlPU5vO1MuU3RyZXRjaD1PbztTLk9yaWVudEFsb25nPXNuO1MuT3JpZW50UGx1czkwPURtO1MuT3JpZW50TWludXM5MD1GbTtTLk9yaWVudE9wcG9zaXRlPVBvO1MuT3JpZW50VXByaWdodD1RbztTLk9yaWVudFBsdXM5MFVwcmlnaHQ9RW07Uy5PcmllbnRNaW51czkwVXByaWdodD1HbTtTLk9yaWVudFVwcmlnaHQ0NT1IbTtmdW5jdGlvbiBwcChhLGIsYyxkKXttYih0aGlzKTt0aGlzLmllPXRoaXMueHI9ITE7dGhpcy5qdD1hO3RoaXMueHg9Yjt0aGlzLm92PWM7dGhpcy55eD1kO3RoaXMubGlua3M9W107fXBwLnByb3RvdHlwZS5jbT1mdW5jdGlvbigpe2lmKCF0aGlzLnhyKXt2YXIgYT10aGlzLmxpbmtzOzA8YS5sZW5ndGgmJihhPWFbMF0uZGlhZ3JhbSxudWxsIT09YSYmKGEuencuYWRkKHRoaXMpLHRoaXMuaWU9YS51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nKSk7fXRoaXMueHI9ITA7fTtwcC5wcm90b3R5cGUuWXY9ZnVuY3Rpb24oKXtpZih0aGlzLnhyKXt0aGlzLnhyPSExO3ZhciBhPXRoaXMubGlua3M7aWYoMDxhLmxlbmd0aCl7dmFyIGI9YVswXSxjPWIuZGlhZ3JhbTtjPW51bGw9PT1jfHxjLk9pJiYhdGhpcy5pZTt0aGlzLmllPSExO2IuYXJyYW5nZUJ1bmRsZWRMaW5rcyhhLGMpOzE9PT1hLmxlbmd0aCYmKGIueGY9bnVsbCxhLmxlbmd0aD0wKTt9MD09PWEubGVuZ3RoJiYoYT10aGlzLmp0LG51bGwhPT10aGlzJiZudWxsIT09YS5MZSYmYS5MZS5yZW1vdmUodGhpcyksYT10aGlzLm92LG51bGwhPT10aGlzJiZudWxsIT09YS5MZSYmYS5MZS5yZW1vdmUodGhpcykpO319O3BwLmNsYXNzTmFtZT0iTGlua0J1bmRsZSI7ZnVuY3Rpb24gbGsoKXttYih0aGlzKTt0aGlzLk14PXRoaXMuZ3JvdXA9bnVsbDt0aGlzLmF0PSEwO3RoaXMuYWJvcnQ9ITE7dGhpcy5LZD10aGlzLkpkPTE7dGhpcy5tbz10aGlzLmxvPS0xO3RoaXMubGM9dGhpcy5rYz04O3RoaXMuQmI9W1tdXTt0aGlzLk1qPXRoaXMuTGo9MDt0aGlzLlp6PSExO3RoaXMuVHo9MjI7dGhpcy54ej0xMTE7fWxrLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGEpe2lmKCEoMD49YS53aWR0aHx8MD49YS5oZWlnaHQpKXt2YXIgYj1hLnksYz1hLngrYS53aWR0aCxkPWEueSthLmhlaWdodDt0aGlzLkpkPU1hdGguZmxvb3IoKGEueC10aGlzLmtjKS90aGlzLmtjKSp0aGlzLmtjO3RoaXMuS2Q9TWF0aC5mbG9vcigoYi10aGlzLmxjKS90aGlzLmxjKSp0aGlzLmxjO3RoaXMubG89TWF0aC5jZWlsKChjKzIqdGhpcy5rYykvdGhpcy5rYykqdGhpcy5rYzt0aGlzLm1vPU1hdGguY2VpbCgoZCsyKnRoaXMubGMpL3RoaXMubGMpKnRoaXMubGM7YT0xKyhNYXRoLmNlaWwoKHRoaXMubG8tdGhpcy5KZCkvdGhpcy5rYyl8MCk7Yj0xKyhNYXRoLmNlaWwoKHRoaXMubW8tdGhpcy5LZCkvdGhpcy5sYyl8MCk7aWYobnVsbD09PXRoaXMuQmJ8fHRoaXMuTGo8YS0xfHx0aGlzLk1qPGItMSl7Yz1bXTtmb3IoZD0wO2Q8PWE7ZCsrKXtjW2RdPVtdO310aGlzLkJiPWM7dGhpcy5Maj1hLTE7dGhpcy5Naj1iLTE7fWE9c3A7aWYobnVsbCE9PXRoaXMuQmIpZm9yKGI9MDtiPD10aGlzLkxqO2IrKyl7Zm9yKGM9MDtjPD10aGlzLk1qO2MrKyl7dGhpcy5CYltiXVtjXT1hO319fX07ZnVuY3Rpb24gYnAoYSxiLGMpe3JldHVybiBhLkpkPD1iJiZiPD1hLmxvJiZhLktkPD1jJiZjPD1hLm1vO31mdW5jdGlvbiBkcChhLGIsYyl7aWYoIWJwKGEsYixjKSlyZXR1cm4gc3A7Yi09YS5KZDtiLz1hLmtjO2MtPWEuS2Q7Yy89YS5sYztyZXR1cm4gYS5CYltifDBdW2N8MF07fWZ1bmN0aW9uIG9rKGEsYixjKXticChhLGIsYykmJihiLT1hLkpkLGIvPWEua2MsYy09YS5LZCxjLz1hLmxjLGEuQmJbYnwwXVtjfDBdPWZwKTt9ZnVuY3Rpb24gbmsoYSl7aWYobnVsbCE9PWEuQmIpZm9yKHZhciBiPTA7Yjw9YS5MajtiKyspe2Zvcih2YXIgYz0wO2M8PWEuTWo7YysrKXthLkJiW2JdW2NdPj1ocCYmKGEuQmJbYl1bY109c3ApO319fWxrLnByb3RvdHlwZS5laz1mdW5jdGlvbihhLGIsYyxkKXtpZihhPnRoaXMubG98fGErYzx0aGlzLkpkfHxiPnRoaXMubW98fGIrZDx0aGlzLktkKXJldHVybiEwO2E9KGEtdGhpcy5KZCkvdGhpcy5rY3wwO2I9KGItdGhpcy5LZCkvdGhpcy5sY3wwO2M9TWF0aC5tYXgoMCxjKS90aGlzLmtjKzF8MDt2YXIgZT1NYXRoLm1heCgwLGQpL3RoaXMubGMrMXwwOzA+YSYmKGMrPWEsYT0wKTswPmImJihlKz1iLGI9MCk7aWYoMD5jfHwwPmUpcmV0dXJuITA7ZD1NYXRoLm1pbihhK2MtMSx0aGlzLkxqKXwwO2ZvcihjPU1hdGgubWluKGIrZS0xLHRoaXMuTWopfDA7YTw9ZDthKyspe2ZvcihlPWI7ZTw9YztlKyspe2lmKHRoaXMuQmJbYV1bZV09PT1mcClyZXR1cm4hMTt9fXJldHVybiEwO307ZnVuY3Rpb24gdHAoYSxiLGMsZCxlLGYsZyxoLGspe2lmKCEoYjxmfHxiPmd8fGM8aHx8Yz5rKSl7dmFyIGw9YnwwO3ZhciBtPWN8MDt2YXIgbj1hLkJiW2xdW21dO2lmKG4+PWhwJiZuPGVwKWZvcihlP20rPWQ6bCs9ZCxuKz0xO2Y8PWwmJmw8PWcmJmg8PW0mJm08PWsmJiEobj49YS5CYltsXVttXSk7KXthLkJiW2xdW21dPW4sbis9MSxlP20rPWQ6bCs9ZDt9bD1lP206bDtpZihlKXtpZigwPGQpZm9yKGMrPWQ7YzxsO2MrPWQpe3RwKGEsYixjLDEsIWUsZixnLGgsayksdHAoYSxiLGMsLTEsIWUsZixnLGgsayk7fWVsc2UgZm9yKGMrPWQ7Yz5sO2MrPWQpe3RwKGEsYixjLDEsIWUsZixnLGgsayksdHAoYSxiLGMsLTEsIWUsZixnLGgsayk7fX1lbHNlIGlmKDA8ZClmb3IoYis9ZDtiPGw7Yis9ZCl7dHAoYSxiLGMsMSwhZSxmLGcsaCxrKSx0cChhLGIsYywtMSwhZSxmLGcsaCxrKTt9ZWxzZSBmb3IoYis9ZDtiPmw7Yis9ZCl7dHAoYSxiLGMsMSwhZSxmLGcsaCxrKSx0cChhLGIsYywtMSwhZSxmLGcsaCxrKTt9fX1mdW5jdGlvbiB1cChhLGIsYyxkLGUsZixnLGgsayl7Ynw9MDtjfD0wO3ZhciBsPWZwLG09aHA7Zm9yKGEuQmJbYl1bY109bTtsPT09ZnAmJmI+ZiYmYjxnJiZjPmgmJmM8azspe20rPTEsYS5CYltiXVtjXT1tLGU/Yys9ZDpiKz1kLGw9YS5CYltiXVtjXTt9fWZ1bmN0aW9uIHZwKGEsYixjLGQsZSxmLGcsaCxrKXtifD0wO2N8PTA7dmFyIGw9ZnAsbT1lcDtmb3IoYS5CYltiXVtjXT1tO2w9PT1mcCYmYj5mJiZiPGcmJmM+aCYmYzxrOyl7YS5CYltiXVtjXT1tLGU/Yys9ZDpiKz1kLGw9YS5CYltiXVtjXTt9fWZ1bmN0aW9uIGNwKGEsYixjLGQsZSxmKXtpZihudWxsIT09YS5CYil7YS5hYm9ydD0hMTt2YXIgZz1iLngsaD1iLnk7aWYoYnAoYSxnLGgpJiYoZy09YS5KZCxnLz1hLmtjLGgtPWEuS2QsaC89YS5sYyxiPWQueCxkPWQueSxicChhLGIsZCkpKWlmKGItPWEuSmQsYi89YS5rYyxkLT1hLktkLGQvPWEubGMsMT49TWF0aC5hYnMoZy1iKSYmMT49TWF0aC5hYnMoaC1kKSlhLmFib3J0PSEwO2Vsc2V7dmFyIGs9Zi54LGw9Zi55LG09Zi54K2Yud2lkdGgsbj1mLnkrZi5oZWlnaHQ7ay09YS5KZDtrLz1hLmtjO2wtPWEuS2Q7bC89YS5sYzttLT1hLkpkO20vPWEua2M7bi09YS5LZDtuLz1hLmxjO2Y9TWF0aC5tYXgoMCxNYXRoLm1pbihhLkxqLGt8MCkpO209TWF0aC5taW4oYS5MaixNYXRoLm1heCgwLG18MCkpO2w9TWF0aC5tYXgoMCxNYXRoLm1pbihhLk1qLGx8MCkpO249TWF0aC5taW4oYS5NaixNYXRoLm1heCgwLG58MCkpO2d8PTA7aHw9MDtifD0wO2R8PTA7az0wPT09Y3x8OTA9PT1jPzE6LTE7Yz05MD09PWN8fDI3MD09PWM7YS5CYltnXVtoXT09PWZwPyh1cChhLGcsaCxrLGMsZixtLGwsbiksdXAoYSxnLGgsMSwhYyxmLG0sbCxuKSx1cChhLGcsaCwtMSwhYyxmLG0sbCxuKSk6dXAoYSxnLGgsayxjLGcsaCxnLGgpO2EuQmJbYl1bZF09PT1mcD8odnAoYSxiLGQsMD09PWV8fDkwPT09ZT8xOi0xLDkwPT09ZXx8MjcwPT09ZSxmLG0sbCxuKSx2cChhLGIsZCwxLCEoOTA9PT1lfHwyNzA9PT1lKSxmLG0sbCxuKSx2cChhLGIsZCwtMSwhKDkwPT09ZXx8MjcwPT09ZSksZixtLGwsbikpOnZwKGEsYixkLGssYyxiLGQsYixkKTthLmFib3J0fHwodHAoYSxnLGgsMSwhMSxmLG0sbCxuKSx0cChhLGcsaCwtMSwhMSxmLG0sbCxuKSx0cChhLGcsaCwxLCEwLGYsbSxsLG4pLHRwKGEsZyxoLC0xLCEwLGYsbSxsLG4pKTt9fX1wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhsay5wcm90b3R5cGUse2JvdW5kczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiBuZXcgTih0aGlzLkpkLHRoaXMuS2QsdGhpcy5sby10aGlzLkpkLHRoaXMubW8tdGhpcy5LZCk7fX0sVWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5rYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7MDxhJiZhIT09dGhpcy5rYyYmKHRoaXMua2M9YSx0aGlzLmluaXRpYWxpemUodGhpcy5ib3VuZHMpKTt9fSxUbDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmxjO30sc2V0OmZ1bmN0aW9uIHNldChhKXswPGEmJmEhPT10aGlzLmxjJiYodGhpcy5sYz1hLHRoaXMuaW5pdGlhbGl6ZSh0aGlzLmJvdW5kcykpO319fSk7dmFyIGZwPTAsaHA9MSxlcD05OTk5OTksc3A9ZXArMTtsay5jbGFzc05hbWU9IlBvc2l0aW9uQXJyYXkiO2Z1bmN0aW9uIFpvKCl7bWIodGhpcyk7dGhpcy5wb3J0PXRoaXMubm9kZT1udWxsO3RoaXMuV2Q9W107dGhpcy5mcT0hMTt9Wm8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuV2QsYj10aGlzLm5vZGUudG9TdHJpbmcoKSsiICIrYS5sZW5ndGgudG9TdHJpbmcoKSsiOiIsYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO251bGwhPT1kJiYoYis9IlxuICAiK2QudG9TdHJpbmcoKSk7fXJldHVybiBiO307ZnVuY3Rpb24gd3AoYSxiLGMsZCl7Yj1iLm9mZnNldFk7c3dpdGNoKGIpe2Nhc2UgODpyZXR1cm4gOTA7Y2FzZSAyOnJldHVybiAxODA7Y2FzZSAxOnJldHVybiAyNzA7Y2FzZSA0OnJldHVybiAwO31zd2l0Y2goYil7Y2FzZSA5OnJldHVybiAxODA8Yz8yNzA6OTA7Y2FzZSA2OnJldHVybiA5MDxjJiYyNzA+PWM/MTgwOjA7fWE9MTgwKk1hdGguYXRhbjIoYS5oZWlnaHQsYS53aWR0aCkvTWF0aC5QSTtzd2l0Y2goYil7Y2FzZSAzOnJldHVybiBjPmEmJmM8PTE4MCthPzE4MDoyNzA7Y2FzZSA1OnJldHVybiBjPjE4MC1hJiZjPD0zNjAtYT8yNzA6MDtjYXNlIDEyOnJldHVybiBjPmEmJmM8PTE4MCthPzkwOjA7Y2FzZSAxMDpyZXR1cm4gYz4xODAtYSYmYzw9MzYwLWE/MTgwOjkwO2Nhc2UgNzpyZXR1cm4gOTA8YyYmYzw9MTgwK2E/MTgwOmM+MTgwK2EmJmM8PTM2MC1hPzI3MDowO2Nhc2UgMTM6cmV0dXJuIDE4MDxjJiZjPD0zNjAtYT8yNzA6Yz5hJiYxODA+PWM/OTA6MDtjYXNlIDE0OnJldHVybiBjPmEmJmM8PTE4MC1hPzkwOmM+MTgwLWEmJjI3MD49Yz8xODA6MDtjYXNlIDExOnJldHVybiBjPjE4MC1hJiZjPD0xODArYT8xODA6Yz4xODArYT8yNzA6OTA7fWQmJjE1IT09YiYmKGMtPTE1LDA+YyYmKGMrPTM2MCkpO3JldHVybiBjPmEmJmM8MTgwLWE/OTA6Yz49MTgwLWEmJmM8PTE4MCthPzE4MDpjPjE4MCthJiZjPDM2MC1hPzI3MDowO31aby5wcm90b3R5cGUuY209ZnVuY3Rpb24oKXt0aGlzLldkLmxlbmd0aD0wO307ZnVuY3Rpb24gJG8oYSxiKXt2YXIgYz1hLldkO2lmKDA9PT1jLmxlbmd0aCl7YTppZighYS5mcSl7Yz1hLmZxO2EuZnE9ITA7dmFyIGQ9bnVsbCxlPWEubm9kZTtlPWUgaW5zdGFuY2VvZiBpZz9lOm51bGw7aWYobnVsbD09PWV8fGUuaXNTdWJHcmFwaEV4cGFuZGVkKXZhciBmPWEubm9kZS5XdShhLnBvcnQucG9ydElkKTtlbHNle2lmKCFlLmFjdHVhbEJvdW5kcy5vKCkpe2EuZnE9YzticmVhayBhO31kPWU7Zj1kLlZ1KCk7fXZhciBnPWEuV2QubGVuZ3RoPTAsaD1hLnBvcnQubWEoVGMsRy5hbGxvYygpKSxrPWEucG9ydC5tYShoZCxHLmFsbG9jKCkpO2U9Ti5hbGxvY0F0KGgueCxoLnksMCwwKTtlLkllKGspO0cuZnJlZShoKTtHLmZyZWUoayk7aD1HLmFsbG9jQXQoZS54K2Uud2lkdGgvMixlLnkrZS5oZWlnaHQvMik7az1hLnBvcnQuSmkoKTtmb3IoZj1mLml0ZXJhdG9yO2YubmV4dCgpOyl7dmFyIGw9Zi52YWx1ZTtpZihsLmlzVmlzaWJsZSgpJiZsLmZyb21Qb3J0IT09bC50b1BvcnQpe3ZhciBtPWwuZnJvbVBvcnQ9PT1hLnBvcnR8fG51bGwhPT1sLmZyb21Ob2RlJiZsLmZyb21Ob2RlLlZkKGQpLG49bC5jb21wdXRlU3BvdChtLGEucG9ydCk7aWYobi5xZigpJiYobT1tP2wudG9Qb3J0OmwuZnJvbVBvcnQsbnVsbCE9PW0pKXt2YXIgcD1tLnBhcnQ7aWYobnVsbCE9PXApe3ZhciBxPXAuZmluZFZpc2libGVOb2RlKCk7bnVsbCE9PXEmJnEhPT1wJiYocD1xLG09cC5wb3J0KTttPWwuY29tcHV0ZU90aGVyUG9pbnQocCxtKTtwPWguV2EobSk7cC09azswPnAmJihwKz0zNjApO249d3AoZSxuLHAsbC5pc09ydGhvZ29uYWwpOzA9PT1uPyhuPTQsMTgwPHAmJihwLT0zNjApKTpuPTkwPT09bj84OjE4MD09PW4/MjoxO3E9YS5XZFtnXTt2b2lkIDA9PT1xPyhxPW5ldyB4cChsLHAsbiksYS5XZFtnXT1xKToocS5saW5rPWwscS5hbmdsZT1wLHEueWM9bik7cS5zdi5zZXQobSk7ZysrO319fX1HLmZyZWUoaCk7YS5XZC5zb3J0KFpvLnByb3RvdHlwZS5sKTtrPWEuV2QubGVuZ3RoO2Q9LTE7Zm9yKGc9aD0wO2c8aztnKyspe2Y9YS5XZFtnXSx2b2lkIDAhPT1mJiYoZi55YyE9PWQmJihkPWYueWMsaD0wKSxmLlhwPWgsaCsrKTt9ZD0tMTtoPTA7Zm9yKGc9ay0xOzA8PWc7Zy0tKXtrPWEuV2RbZ10sdm9pZCAwIT09ayYmKGsueWMhPT1kJiYoZD1rLnljLGg9ay5YcCsxKSxrLldsPWgpO31nPWEuV2Q7bj1hLnBvcnQ7ZD1hLm5vZGUucG9ydFNwcmVhZGluZztoPUcuYWxsb2MoKTtrPUcuYWxsb2MoKTtmPUcuYWxsb2MoKTtsPUcuYWxsb2MoKTtuLm1hKFRjLGgpO24ubWEoVmMsayk7bi5tYShoZCxmKTtuLm1hKGZkLGwpO3E9cD1tPW49MDtpZihkPT09SW8pZm9yKHZhciByPTA7cjxnLmxlbmd0aDtyKyspe3ZhciB1PWdbcl07aWYobnVsbCE9PXUpe3ZhciB4PXUubGluay5jb21wdXRlVGhpY2tuZXNzKCk7c3dpdGNoKHUueWMpe2Nhc2UgODpwKz14O2JyZWFrO2Nhc2UgMjpxKz14O2JyZWFrO2Nhc2UgMTpuKz14O2JyZWFrO2RlZmF1bHQ6Y2FzZSA0Om0rPXg7fX19dmFyIHY9cj0wLHk9MSx6PXU9MDtmb3IoeD0wO3g8Zy5sZW5ndGg7eCsrKXt2YXIgQj1nW3hdO2lmKG51bGwhPT1CKXtpZihyIT09Qi55Yyl7cj1CLnljO3N3aXRjaChyKXtjYXNlIDg6dmFyIEM9Zjt2PWw7YnJlYWs7Y2FzZSAyOkM9bDt2PWg7YnJlYWs7Y2FzZSAxOkM9aDt2PWs7YnJlYWs7ZGVmYXVsdDpjYXNlIDQ6Qz1rLHY9Zjt9dT12LngtQy54O3o9di55LUMueTtzd2l0Y2gocil7Y2FzZSA4OnA+TWF0aC5hYnModSk/KHk9TWF0aC5hYnModSkvcCxwPU1hdGguYWJzKHUpKTp5PTE7YnJlYWs7Y2FzZSAyOnE+TWF0aC5hYnMoeik/KHk9TWF0aC5hYnMoeikvcSxxPU1hdGguYWJzKHopKTp5PTE7YnJlYWs7Y2FzZSAxOm4+TWF0aC5hYnModSk/KHk9TWF0aC5hYnModSkvbixuPU1hdGguYWJzKHUpKTp5PTE7YnJlYWs7ZGVmYXVsdDpjYXNlIDQ6bT5NYXRoLmFicyh6KT8oeT1NYXRoLmFicyh6KS9tLG09TWF0aC5hYnMoeikpOnk9MTt9dj0wO312YXIgST1CLmNxO2lmKGQ9PT1Jbyl7Qj1CLmxpbmsuY29tcHV0ZVRoaWNrbmVzcygpO0IqPXk7SS5zZXQoQyk7c3dpdGNoKHIpe2Nhc2UgODpJLng9Qy54K3UvMitwLzItdi1CLzI7YnJlYWs7Y2FzZSAyOkkueT1DLnkrei8yK3EvMi12LUIvMjticmVhaztjYXNlIDE6SS54PUMueCt1LzItbi8yK3YrQi8yO2JyZWFrO2RlZmF1bHQ6Y2FzZSA0OkkueT1DLnkrei8yLW0vMit2K0IvMjt9dis9Qjt9ZWxzZXt2YXIgSj0uNTtkPT09dm8mJihKPShCLlhwKzEpLyhCLldsKzEpKTtJLng9Qy54K3UqSjtJLnk9Qy55K3oqSjt9fX1HLmZyZWUoaCk7Ry5mcmVlKGspO0cuZnJlZShmKTtHLmZyZWUobCk7Qz1hLldkO2ZvcihnPTA7ZzxDLmxlbmd0aDtnKyspe2Q9Q1tnXSxudWxsIT09ZCYmKGQuVHU9YS5jb21wdXRlRW5kU2VnbWVudExlbmd0aChkKSk7fWEuZnE9YztOLmZyZWUoZSk7fWM9YS5XZDt9Zm9yKGE9MDthPGMubGVuZ3RoO2ErKyl7aWYoZT1jW2FdLG51bGwhPT1lJiZlLmxpbms9PT1iKXJldHVybiBlO31yZXR1cm4gbnVsbDt9Wm8ucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWI/MDpudWxsPT09YT8tMTpudWxsPT09Yj8xOmEueWM8Yi55Yz8tMTphLnljPmIueWM/MTphLmFuZ2xlPGIuYW5nbGU/LTE6YS5hbmdsZT5iLmFuZ2xlPzE6MDt9O1pvLnByb3RvdHlwZS5jb21wdXRlRW5kU2VnbWVudExlbmd0aD1mdW5jdGlvbihhKXt2YXIgYj1hLmxpbmssYz1iLmNvbXB1dGVFbmRTZWdtZW50TGVuZ3RoKHRoaXMubm9kZSx0aGlzLnBvcnQsU2MsYi5mcm9tUG9ydD09PXRoaXMucG9ydCksZD1hLlhwO2lmKDA+ZClyZXR1cm4gYzt2YXIgZT1hLldsO2lmKDE+PWV8fCFiLmlzT3J0aG9nb25hbClyZXR1cm4gYztiPWEuc3Y7dmFyIGY9YS5jcTtpZigyPT09YS55Y3x8OD09PWEueWMpZD1lLTEtZDtyZXR1cm4oKGE9Mj09PWEueWN8fDQ9PT1hLnljKT9iLnk8Zi55OmIueDxmLngpP2MrOCpkOihhP2IueT09PWYueTpiLng9PT1mLngpP2M6Yys4KihlLTEtZCk7fTtaby5jbGFzc05hbWU9Iktub3QiO2Z1bmN0aW9uIHhwKGEsYixjKXt0aGlzLmxpbms9YTt0aGlzLmFuZ2xlPWI7dGhpcy55Yz1jO3RoaXMuc3Y9bmV3IEcoKTt0aGlzLldsPXRoaXMuWHA9MDt0aGlzLmNxPW5ldyBHKCk7dGhpcy5UdT0wO314cC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5rLnRvU3RyaW5nKCkrIiAiK3RoaXMuYW5nbGUudG9TdHJpbmcoKSsiICIrdGhpcy55Yy50b1N0cmluZygpKyI6Iit0aGlzLlhwLnRvU3RyaW5nKCkrIi8iK3RoaXMuV2wudG9TdHJpbmcoKSsiICIrdGhpcy5jcS50b1N0cmluZygpKyIgIit0aGlzLlR1LnRvU3RyaW5nKCkrIiAiK3RoaXMuc3YudG9TdHJpbmcoKTt9O3hwLmNsYXNzTmFtZT0iTGlua0luZm8iO2Z1bmN0aW9uIFVrKCl7dGhpcy5uaD10aGlzLkxnPUVkO3RoaXMubWg9dGhpcy5LZz10aGlzLmxoPXRoaXMuSmc9TmFOO3RoaXMuenA9dGhpcy5Ebj1udWxsO3RoaXMuQXA9dGhpcy5Fbj1JbmZpbml0eTt9VWsucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVWsoKTthLkxnPXRoaXMuTGcuSSgpO2Eubmg9dGhpcy5uaC5JKCk7YS5KZz10aGlzLkpnO2EubGg9dGhpcy5saDthLktnPXRoaXMuS2c7YS5taD10aGlzLm1oO2EuRG49dGhpcy5EbjthLnpwPXRoaXMuenA7YS5Fbj10aGlzLkVuO2EuQXA9dGhpcy5BcDtyZXR1cm4gYTt9O1VrLmNsYXNzTmFtZT0iTGlua1NldHRpbmdzIjtmdW5jdGlvbiB5aSgpe21iKHRoaXMpO3RoaXMuSz10aGlzLkM9bnVsbDt0aGlzLlBnPXRoaXMuU249ITA7dGhpcy5Zbj0hMTt0aGlzLlFtPW5ldyBHKDAsMCkuZnJlZXplKCk7dGhpcy5Wbj0hMDt0aGlzLlVuPW51bGw7dGhpcy50dz0iIjt0aGlzLnU9bnVsbDt0aGlzLlhuPSExO3RoaXMubD1udWxsO315aS5wcm90b3R5cGUuY2xvbmVQcm90ZWN0ZWQ9ZnVuY3Rpb24oYSl7YS5Tbj10aGlzLlNuO2EuUGc9dGhpcy5QZzthLlluPXRoaXMuWW47YS5RbS5hc3NpZ24odGhpcy5RbSk7YS5Wbj10aGlzLlZuO2EuVW49dGhpcy5VbjthLnR3PXRoaXMudHc7YS5Ybj0hMDt9O3lpLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHRoaXMuY29uc3RydWN0b3IoKTt0aGlzLmNsb25lUHJvdGVjdGVkKGEpO3JldHVybiBhO307eWkucHJvdG90eXBlLmZiPWZ1bmN0aW9uKCl7fTt5aS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT1QYSh0aGlzLmNvbnN0cnVjdG9yKTthKz0iKCI7bnVsbCE9PXRoaXMuZ3JvdXAmJihhKz0iIGluICIrdGhpcy5ncm91cCk7bnVsbCE9PXRoaXMuZGlhZ3JhbSYmKGErPSIgZm9yICIrdGhpcy5kaWFncmFtKTtyZXR1cm4gYSsiKSI7fTt5aS5wcm90b3R5cGUuQj1mdW5jdGlvbigpe2lmKHRoaXMuaXNWYWxpZExheW91dCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKG51bGwhPT1hJiYhYS51bmRvTWFuYWdlci5pc1VuZG9pbmdSZWRvaW5nKXt2YXIgYj1hLmFuaW1hdGlvbk1hbmFnZXI7IWIuaXNUaWNraW5nJiYoYi5pc0FuaW1hdGluZyYmYi52ZCgpLHRoaXMuaXNPbmdvaW5nJiZhLk9pfHx0aGlzLmlzSW5pdGlhbCYmIWEuT2kpJiYodGhpcy5pc1ZhbGlkTGF5b3V0PSExLGEuY2MoKSk7fX19O3lpLnByb3RvdHlwZS5jcmVhdGVOZXR3b3JrPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB5cCh0aGlzKTt9O3lpLnByb3RvdHlwZS5tYWtlTmV0d29yaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNyZWF0ZU5ldHdvcmsoKTthIGluc3RhbmNlb2YgUD8oYi5rZyhhLm5vZGVzLCEwKSxiLmtnKGEubGlua3MsITApKTphIGluc3RhbmNlb2YgaWc/Yi5rZyhhLm1lbWJlclBhcnRzKTpiLmtnKGEuaXRlcmF0b3IpO3JldHVybiBiO307eWkucHJvdG90eXBlLnVwZGF0ZVBhcnRzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWFncmFtO2lmKG51bGw9PT1hJiZudWxsIT09dGhpcy5uZXR3b3JrKWZvcih2YXIgYj10aGlzLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7Yi5uZXh0KCk7KXt2YXIgYz1iLnZhbHVlLm5vZGU7aWYobnVsbCE9PWMmJihhPWMuZGlhZ3JhbSxudWxsIT09YSkpYnJlYWs7fXRoaXMuaXNWYWxpZExheW91dD0hMDt0cnl7bnVsbCE9PWEmJmEuQWEoIkxheW91dCIpLHRoaXMuY29tbWl0TGF5b3V0KCk7fWZpbmFsbHl7bnVsbCE9PWEmJmEuWmEoIkxheW91dCIpO319O3lpLnByb3RvdHlwZS5jb21taXRMYXlvdXQ9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5uZXR3b3JrKXtmb3IodmFyIGE9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2EubmV4dCgpOyl7YS52YWx1ZS5jb21taXQoKTt9aWYodGhpcy5pc1JvdXRpbmcpZm9yKGE9dGhpcy5uZXR3b3JrLmVkZ2VzLml0ZXJhdG9yO2EubmV4dCgpOyl7YS52YWx1ZS5jb21taXQoKTt9fX07eWkucHJvdG90eXBlLmRvTGF5b3V0PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBGKCk7YSBpbnN0YW5jZW9mIFA/KHpwKHRoaXMsYixhLm5vZGVzLCEwLHRoaXMubWssITAsITEsITApLHpwKHRoaXMsYixhLnBhcnRzLCEwLHRoaXMubWssITAsITEsITApKTphIGluc3RhbmNlb2YgaWc/enAodGhpcyxiLGEubWVtYmVyUGFydHMsITEsdGhpcy5taywhMCwhMSwhMCk6Yi5hZGRBbGwoYS5pdGVyYXRvcik7dmFyIGM9Yi5jb3VudDtpZigwPGMpe2E9dGhpcy5kaWFncmFtO251bGwhPT1hJiZhLkFhKCJMYXlvdXQiKTtjPU1hdGguY2VpbChNYXRoLnNxcnQoYykpO3RoaXMuYXJyYW5nZW1lbnRPcmlnaW49dGhpcy5pbml0aWFsT3JpZ2luKHRoaXMuYXJyYW5nZW1lbnRPcmlnaW4pO3ZhciBkPXRoaXMuYXJyYW5nZW1lbnRPcmlnaW4ueCxlPWQsZj10aGlzLmFycmFuZ2VtZW50T3JpZ2luLnksZz0wLGg9MDtmb3IoYj1iLml0ZXJhdG9yO2IubmV4dCgpOyl7dmFyIGs9Yi52YWx1ZTtBcChrKTt2YXIgbD1rLm1lYXN1cmVkQm91bmRzLG09bC53aWR0aDtsPWwuaGVpZ2h0O2subW92ZVRvKGUsZik7ayBpbnN0YW5jZW9mIGlnJiYoay5taz0hMSk7ZSs9TWF0aC5tYXgobSw1MCkrMjA7aD1NYXRoLm1heChoLE1hdGgubWF4KGwsNTApKTtnPj1jLTE/KGc9MCxlPWQsZis9aCsyMCxoPTApOmcrKzt9bnVsbCE9PWEmJmEuWmEoIkxheW91dCIpO310aGlzLmlzVmFsaWRMYXlvdXQ9ITA7fTt5aS5wcm90b3R5cGUubWs9ZnVuY3Rpb24oYSl7cmV0dXJuIWEubG9jYXRpb24ubygpfHxhIGluc3RhbmNlb2YgaWcmJmEubWs/ITA6ITE7fTtmdW5jdGlvbiB6cChhLGIsYyxkLGUsZixnLGgpe2ZvcihjPWMuaXRlcmF0b3I7Yy5uZXh0KCk7KXt2YXIgaz1jLnZhbHVlO2QmJiFrLmlzVG9wTGV2ZWx8fG51bGwhPT1lJiYhZShrKXx8IWsuY2FuTGF5b3V0KCl8fChmJiZrIGluc3RhbmNlb2YgVj9rLmlzTGlua0xhYmVsfHwoayBpbnN0YW5jZW9mIGlnP251bGw9PT1rLmxheW91dD96cChhLGIsay5tZW1iZXJQYXJ0cywhMSxlLGYsZyxoKTooQXAoayksYi5hZGQoaykpOihBcChrKSxiLmFkZChrKSkpOmcmJmsgaW5zdGFuY2VvZiBTP2IuYWRkKGspOiFofHwhay5MYigpfHxrIGluc3RhbmNlb2YgVnx8KEFwKGspLGIuYWRkKGspKSk7fX1mdW5jdGlvbiBBcChhKXt2YXIgYj1hLmFjdHVhbEJvdW5kczsoMD09PWIud2lkdGh8fDA9PT1iLmhlaWdodHx8aXNOYU4oYi53aWR0aCl8fGlzTmFOKGIuaGVpZ2h0KSkmJmEuYWMoKTt9eWkucHJvdG90eXBlLkxpPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5ib3VuZHNDb21wdXRhdGlvbjtpZihudWxsIT09YylyZXR1cm4gYnx8KGI9bmV3IE4oKSksYyhhLHRoaXMsYik7aWYoIWIpcmV0dXJuIGEuYWN0dWFsQm91bmRzO2Iuc2V0KGEuYWN0dWFsQm91bmRzKTtyZXR1cm4gYjt9O3lpLnByb3RvdHlwZS5Ydz1mdW5jdGlvbihhKXt2YXIgYj1uZXcgRigpO2EgaW5zdGFuY2VvZiBQPyh6cCh0aGlzLGIsYS5ub2RlcywhMCxudWxsLCEwLCEwLCEwKSx6cCh0aGlzLGIsYS5saW5rcywhMCxudWxsLCEwLCEwLCEwKSx6cCh0aGlzLGIsYS5wYXJ0cywhMCxudWxsLCEwLCEwLCEwKSk6YSBpbnN0YW5jZW9mIGlnP3pwKHRoaXMsYixhLm1lbWJlclBhcnRzLCExLG51bGwsITAsITAsITApOnpwKHRoaXMsYixhLml0ZXJhdG9yLCExLG51bGwsITAsITAsITApO3JldHVybiBiO307eWkucHJvdG90eXBlLmluaXRpYWxPcmlnaW49ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ncm91cDtpZihudWxsIT09Yil7dmFyIGM9Yi5wb3NpdGlvbi5jb3B5KCk7KGlzTmFOKGMueCl8fGlzTmFOKGMueSkpJiZjLnNldChhKTtiPWIucGxhY2Vob2xkZXI7bnVsbCE9PWImJihjPWIubWEoVGMpLChpc05hTihjLngpfHxpc05hTihjLnkpKSYmYy5zZXQoYSksYT1iLnBhZGRpbmcsYy54Kz1hLmxlZnQsYy55Kz1hLnRvcCk7cmV0dXJuIGM7fXJldHVybiBhO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeWkucHJvdG90eXBlLHtkaWFncmFtOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5DPWE7fX0sZ3JvdXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5LO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkshPT1hJiYodGhpcy5LPWEsbnVsbCE9PWEmJih0aGlzLkM9YS5kaWFncmFtKSk7fX0saXNPbmdvaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuU247fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuU24hPT1hJiYodGhpcy5Tbj1hKTt9fSxpc0luaXRpYWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QZzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5QZz1hO2F8fCh0aGlzLlhuPSEwKTt9fSxpc1ZpZXdwb3J0U2l6ZWQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Zbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5ZbiE9PWEmJih0aGlzLlluPWEpJiZ0aGlzLkIoKTt9fSxpc1JvdXRpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Wbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5WbiE9PWEmJih0aGlzLlZuPWEpO319LGlzUmVhbHRpbWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Vbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5VbiE9PWEmJih0aGlzLlVuPWEpO319LGlzVmFsaWRMYXlvdXQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Ybjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5YbiE9PWEmJih0aGlzLlhuPWEsYXx8KGE9dGhpcy5kaWFncmFtLG51bGwhPT1hJiYoYS56Zz0hMCkpKTt9fSxuZXR3b3JrOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5sIT09YSYmKHRoaXMubD1hLG51bGwhPT1hJiYoYS5sYXlvdXQ9dGhpcykpO319LGJvdW5kc0NvbXB1dGF0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy51IT09YSYmKHRoaXMudT1hLHRoaXMuQigpKTt9fSxhcnJhbmdlbWVudE9yaWdpbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlFtO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlFtLkEoYSl8fCh0aGlzLlFtLmFzc2lnbihhKSx0aGlzLkIoKSk7fX19KTt5aS5wcm90b3R5cGUuY29sbGVjdFBhcnRzPXlpLnByb3RvdHlwZS5Ydzt5aS5wcm90b3R5cGUuZ2V0TGF5b3V0Qm91bmRzPXlpLnByb3RvdHlwZS5MaTt5aS5wcm90b3R5cGUuaW52YWxpZGF0ZUxheW91dD15aS5wcm90b3R5cGUuQjt5aS5jbGFzc05hbWU9IkxheW91dCI7ZnVuY3Rpb24geXAoYSl7bWIodGhpcyk7dGhpcy5nYz1hO3RoaXMuZ2Y9bmV3IEYoKTt0aGlzLmRlPW5ldyBGKCk7dGhpcy5rdD1uZXcgTGIoKTt0aGlzLmZ0PW5ldyBMYigpO315cC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtpZih0aGlzLmdmKWZvcih2YXIgYT10aGlzLmdmLml0ZXJhdG9yO2EubmV4dCgpOyl7YS52YWx1ZS5jbGVhcigpO31pZih0aGlzLmRlKWZvcihhPXRoaXMuZGUuaXRlcmF0b3I7YS5uZXh0KCk7KXthLnZhbHVlLmNsZWFyKCk7fXRoaXMuZ2Y9bmV3IEYoKTt0aGlzLmRlPW5ldyBGKCk7dGhpcy5rdD1uZXcgTGIoKTt0aGlzLmZ0PW5ldyBMYigpO307eXAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPTApO3ZhciBiPSJMYXlvdXROZXR3b3JrIisobnVsbCE9PXRoaXMubGF5b3V0PyIoIit0aGlzLmxheW91dC50b1N0cmluZygpKyIpIjoiIik7aWYoMD49YSlyZXR1cm4gYjtiKz0iIHZlcnRleGVzOiAiK3RoaXMuZ2YuY291bnQrIiBlZGdlczogIit0aGlzLmRlLmNvdW50O2lmKDE8YSl7Zm9yKHZhciBjPXRoaXMuZ2YuaXRlcmF0b3I7Yy5uZXh0KCk7KXtiKz0iXG4gICAgIitjLnZhbHVlLnRvU3RyaW5nKGEtMSk7fWZvcihjPXRoaXMuZGUuaXRlcmF0b3I7Yy5uZXh0KCk7KXtiKz0iXG4gICAgIitjLnZhbHVlLnRvU3RyaW5nKGEtMSk7fX1yZXR1cm4gYjt9O3lwLnByb3RvdHlwZS5jcmVhdGVWZXJ0ZXg9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEJwKHRoaXMpO307eXAucHJvdG90eXBlLmNyZWF0ZUVkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IENwKHRoaXMpO307eXAucHJvdG90eXBlLmtnPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSl7dm9pZCAwPT09YiYmKGI9ITEpO3ZvaWQgMD09PWMmJihjPW51bGwpO251bGw9PT1jJiYoYz1mdW5jdGlvbiBjKGEpe2lmKGEgaW5zdGFuY2VvZiBWKXJldHVybiFhLmlzTGlua0xhYmVsO2lmKGEgaW5zdGFuY2VvZiBTKXt2YXIgYj1hLmZyb21Ob2RlO2lmKG51bGw9PT1ifHxiLmlzTGlua0xhYmVsKXJldHVybiExO2E9YS50b05vZGU7cmV0dXJuIG51bGw9PT1hfHxhLmlzTGlua0xhYmVsPyExOiEwO31yZXR1cm4hMTt9KTtmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGQ9YS52YWx1ZTtpZihkIGluc3RhbmNlb2YgViYmKCFifHxkLmlzVG9wTGV2ZWwpJiZkLmNhbkxheW91dCgpJiZjKGQpKWlmKGQgaW5zdGFuY2VvZiBpZyYmbnVsbD09PWQubGF5b3V0KXRoaXMua2coZC5tZW1iZXJQYXJ0cywhMSk7ZWxzZSBpZihudWxsPT09dGhpcy5JaShkKSl7dmFyIGU9dGhpcy5jcmVhdGVWZXJ0ZXgoKTtlLm5vZGU9ZDt0aGlzLnNoKGUpO319Zm9yKGEucmVzZXQoKTthLm5leHQoKTspe2lmKGQ9YS52YWx1ZSxkIGluc3RhbmNlb2YgUyYmKCFifHxkLmlzVG9wTGV2ZWwpJiZkLmNhbkxheW91dCgpJiZjKGQpJiZudWxsPT09dGhpcy5ScChkKSl7dmFyIGY9ZC5mcm9tTm9kZTtlPWQudG9Ob2RlO251bGwhPT1mJiZudWxsIT09ZSYmZiE9PWUmJihmPXRoaXMuZmluZEdyb3VwVmVydGV4KGYpLGU9dGhpcy5maW5kR3JvdXBWZXJ0ZXgoZSksbnVsbCE9PWYmJm51bGwhPT1lJiZ0aGlzLmZrKGYsZSxkKSk7fX19fTt5cC5wcm90b3R5cGUuZmluZEdyb3VwVmVydGV4PWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiBudWxsO3ZhciBiPWEuZmluZFZpc2libGVOb2RlKCk7aWYobnVsbD09PWIpcmV0dXJuIG51bGw7YT10aGlzLklpKGIpO2lmKG51bGwhPT1hKXJldHVybiBhO2ZvcihiPWIuY29udGFpbmluZ0dyb3VwO251bGwhPT1iOyl7YT10aGlzLklpKGIpO2lmKG51bGwhPT1hKXJldHVybiBhO2I9Yi5jb250YWluaW5nR3JvdXA7fXJldHVybiBudWxsO307dD15cC5wcm90b3R5cGU7dC5zaD1mdW5jdGlvbihhKXtpZihudWxsIT09YSl7dGhpcy5nZi5hZGQoYSk7dmFyIGI9YS5ub2RlO251bGwhPT1iJiZ0aGlzLmt0LmFkZChiLGEpO2EubmV0d29yaz10aGlzO319O3QuUmw9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7dmFyIGI9dGhpcy5JaShhKTtudWxsPT09YiYmKGI9dGhpcy5jcmVhdGVWZXJ0ZXgoKSxiLm5vZGU9YSx0aGlzLnNoKGIpKTtyZXR1cm4gYjt9O3QuU3U9ZnVuY3Rpb24oYSl7aWYobnVsbCE9PWEmJkRwKHRoaXMsYSkpe2Zvcih2YXIgYj1hLnVnLGM9Yi5jb3VudC0xOzA8PWM7Yy0tKXt2YXIgZD1iLk4oYyk7dGhpcy5aaihkKTt9Yj1hLmxnO2ZvcihhPWIuY291bnQtMTswPD1hO2EtLSl7Yz1iLk4oYSksdGhpcy5aaihjKTt9fX07ZnVuY3Rpb24gRHAoYSxiKXtpZihudWxsPT09YilyZXR1cm4hMTt2YXIgYz1hLmdmLnJlbW92ZShiKTtjJiZhLmt0LnJlbW92ZShiLm5vZGUpO3JldHVybiBjO310LkN5PWZ1bmN0aW9uKGEpe251bGwhPT1hJiYoYT10aGlzLklpKGEpLG51bGwhPT1hJiZ0aGlzLlN1KGEpKTt9O3QuSWk9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hP251bGw6dGhpcy5rdC5KKGEpO307dC5Paj1mdW5jdGlvbihhKXtpZihudWxsIT09YSl7dGhpcy5kZS5hZGQoYSk7dmFyIGI9YS5saW5rO251bGwhPT1iJiZudWxsPT09dGhpcy5ScChiKSYmdGhpcy5mdC5hZGQoYixhKTtiPWEudG9WZXJ0ZXg7bnVsbCE9PWImJmIuSHUoYSk7Yj1hLmZyb21WZXJ0ZXg7bnVsbCE9PWImJmIuRnUoYSk7YS5uZXR3b3JrPXRoaXM7fX07dC5peT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDt2YXIgYj1hLmZyb21Ob2RlLGM9YS50b05vZGUsZD10aGlzLlJwKGEpO251bGw9PT1kPyhkPXRoaXMuY3JlYXRlRWRnZSgpLGQubGluaz1hLG51bGwhPT1iJiYoZC5mcm9tVmVydGV4PXRoaXMuUmwoYikpLG51bGwhPT1jJiYoZC50b1ZlcnRleD10aGlzLlJsKGMpKSx0aGlzLk9qKGQpKToobnVsbCE9PWI/ZC5mcm9tVmVydGV4PXRoaXMuUmwoYik6ZC5mcm9tVmVydGV4PW51bGwsbnVsbCE9PWM/ZC50b1ZlcnRleD10aGlzLlJsKGMpOmQudG9WZXJ0ZXg9bnVsbCk7cmV0dXJuIGQ7fTt0LlpqPWZ1bmN0aW9uKGEpe2lmKG51bGwhPT1hKXt2YXIgYj1hLnRvVmVydGV4O251bGwhPT1iJiZiLlJ1KGEpO2I9YS5mcm9tVmVydGV4O251bGwhPT1iJiZiLlF1KGEpO0VwKHRoaXMsYSk7fX07ZnVuY3Rpb24gRXAoYSxiKXtudWxsIT09YiYmYS5kZS5yZW1vdmUoYikmJmEuZnQucmVtb3ZlKGIubGluayk7fXQuQnk9ZnVuY3Rpb24oYSl7bnVsbCE9PWEmJihhPXRoaXMuUnAoYSksbnVsbCE9PWEmJnRoaXMuWmooYSkpO307dC5ScD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWE/bnVsbDp0aGlzLmZ0LkooYSk7fTt0LmZrPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsPT09YXx8bnVsbD09PWIpcmV0dXJuIG51bGw7aWYoYS5uZXR3b3JrPT09dGhpcyYmYi5uZXR3b3JrPT09dGhpcyl7dmFyIGQ9dGhpcy5jcmVhdGVFZGdlKCk7ZC5saW5rPWM7ZC5mcm9tVmVydGV4PWE7ZC50b1ZlcnRleD1iO3RoaXMuT2ooZCk7cmV0dXJuIGQ7fXJldHVybiBudWxsO307dC5zbT1mdW5jdGlvbihhKXtpZihudWxsIT09YSl7dmFyIGI9YS5mcm9tVmVydGV4LGM9YS50b1ZlcnRleDtudWxsIT09YiYmbnVsbCE9PWMmJihiLlF1KGEpLGMuUnUoYSksYS5zbSgpLGIuSHUoYSksYy5GdShhKSk7fX07dC5QcD1mdW5jdGlvbigpe2Zvcih2YXIgYT1LYSgpLGI9dGhpcy5kZS5pdGVyYXRvcjtiLm5leHQoKTspe3ZhciBjPWIudmFsdWU7Yy5mcm9tVmVydGV4PT09Yy50b1ZlcnRleCYmYS5wdXNoKGMpO31iPWEubGVuZ3RoO2ZvcihjPTA7YzxiO2MrKyl7dGhpcy5aaihhW2NdKTt9T2EoYSk7fTt5cC5wcm90b3R5cGUuZGVsZXRlQXJ0aWZpY2lhbFZlcnRleGVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPUthKCksYj10aGlzLmdmLml0ZXJhdG9yO2IubmV4dCgpOyl7dmFyIGM9Yi52YWx1ZTtudWxsPT09Yy5ub2RlJiZhLnB1c2goYyk7fWM9YS5sZW5ndGg7Zm9yKGI9MDtiPGM7YisrKXt0aGlzLlN1KGFbYl0pO31iPUthKCk7Zm9yKGM9dGhpcy5kZS5pdGVyYXRvcjtjLm5leHQoKTspe3ZhciBkPWMudmFsdWU7bnVsbD09PWQubGluayYmYi5wdXNoKGQpO31jPWIubGVuZ3RoO2ZvcihkPTA7ZDxjO2QrKyl7dGhpcy5aaihiW2RdKTt9T2EoYSk7T2EoYik7fTtmdW5jdGlvbiBGcChhKXtmb3IodmFyIGI9S2EoKSxjPWEuZGUuaXRlcmF0b3I7Yy5uZXh0KCk7KXt2YXIgZD1jLnZhbHVlO251bGwhPT1kLmZyb21WZXJ0ZXgmJm51bGwhPT1kLnRvVmVydGV4fHxiLnB1c2goZCk7fWM9Yi5sZW5ndGg7Zm9yKGQ9MDtkPGM7ZCsrKXthLlpqKGJbZF0pO31PYShiKTt9eXAucHJvdG90eXBlLk54PWZ1bmN0aW9uKCl7dGhpcy5kZWxldGVBcnRpZmljaWFsVmVydGV4ZXMoKTtGcCh0aGlzKTt0aGlzLlBwKCk7Zm9yKHZhciBhPW5ldyBFKCksYj0hMDtiOyl7Yj0hMTtmb3IodmFyIGM9dGhpcy5nZi5pdGVyYXRvcjtjLm5leHQoKTspe3ZhciBkPWMudmFsdWU7aWYoMDxkLnVnLmNvdW50fHwwPGQubGcuY291bnQpe2I9dGhpcy5sYXlvdXQuY3JlYXRlTmV0d29yaygpO2EuYWRkKGIpO0dwKHRoaXMsYixkKTtiPSEwO2JyZWFrO319fWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT09YXx8bnVsbD09PWJ8fGE9PT1iPzA6Yi52ZXJ0ZXhlcy5jb3VudC1hLnZlcnRleGVzLmNvdW50O30pO3JldHVybiBhO307ZnVuY3Rpb24gR3AoYSxiLGMpe2lmKG51bGwhPT1jJiZjLm5ldHdvcmshPT1iKXtEcChhLGMpO2Iuc2goYyk7Zm9yKHZhciBkPWMuc291cmNlRWRnZXM7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlO2UubmV0d29yayE9PWImJihFcChhLGUpLGIuT2ooZSksR3AoYSxiLGUuZnJvbVZlcnRleCkpO31mb3IoZD1jLmRlc3RpbmF0aW9uRWRnZXM7ZC5uZXh0KCk7KXtjPWQudmFsdWUsYy5uZXR3b3JrIT09YiYmKEVwKGEsYyksYi5PaihjKSxHcChhLGIsYy50b1ZlcnRleCkpO319fXlwLnByb3RvdHlwZS5IeT1mdW5jdGlvbigpe2Zvcih2YXIgYT1uZXcgRigpLGI9dGhpcy5nZi5pdGVyYXRvcjtiLm5leHQoKTspe2EuYWRkKGIudmFsdWUubm9kZSk7fWZvcihiPXRoaXMuZGUuaXRlcmF0b3I7Yi5uZXh0KCk7KXthLmFkZChiLnZhbHVlLmxpbmspO31yZXR1cm4gYTt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHlwLnByb3RvdHlwZSx7bGF5b3V0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZ2M7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe251bGwhPT1hJiYodGhpcy5nYz1hKTt9fSx2ZXJ0ZXhlczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmdmO319LGVkZ2VzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZGU7fX19KTt5cC5wcm90b3R5cGUuZmluZEFsbFBhcnRzPXlwLnByb3RvdHlwZS5IeTt5cC5wcm90b3R5cGUuc3BsaXRJbnRvU3ViTmV0d29ya3M9eXAucHJvdG90eXBlLk54O3lwLnByb3RvdHlwZS5kZWxldGVTZWxmRWRnZXM9eXAucHJvdG90eXBlLlBwO3lwLnByb3RvdHlwZS5yZXZlcnNlRWRnZT15cC5wcm90b3R5cGUuc207eXAucHJvdG90eXBlLmxpbmtWZXJ0ZXhlcz15cC5wcm90b3R5cGUuZms7eXAucHJvdG90eXBlLmZpbmRFZGdlPXlwLnByb3RvdHlwZS5ScDt5cC5wcm90b3R5cGUuZGVsZXRlTGluaz15cC5wcm90b3R5cGUuQnk7eXAucHJvdG90eXBlLmRlbGV0ZUVkZ2U9eXAucHJvdG90eXBlLlpqO3lwLnByb3RvdHlwZS5hZGRMaW5rPXlwLnByb3RvdHlwZS5peTt5cC5wcm90b3R5cGUuYWRkRWRnZT15cC5wcm90b3R5cGUuT2o7eXAucHJvdG90eXBlLmZpbmRWZXJ0ZXg9eXAucHJvdG90eXBlLklpO3lwLnByb3RvdHlwZS5kZWxldGVOb2RlPXlwLnByb3RvdHlwZS5DeTt5cC5wcm90b3R5cGUuZGVsZXRlVmVydGV4PXlwLnByb3RvdHlwZS5TdTt5cC5wcm90b3R5cGUuYWRkTm9kZT15cC5wcm90b3R5cGUuUmw7eXAucHJvdG90eXBlLmFkZFZlcnRleD15cC5wcm90b3R5cGUuc2g7eXAucHJvdG90eXBlLmFkZFBhcnRzPXlwLnByb3RvdHlwZS5rZzt5cC5jbGFzc05hbWU9IkxheW91dE5ldHdvcmsiO2Z1bmN0aW9uIEJwKGEpe21iKHRoaXMpO3RoaXMuVmM9YTt0aGlzLmw9bmV3IE4oMCwwLDEwLDEwKS5mcmVlemUoKTt0aGlzLnU9bmV3IEcoNSw1KS5mcmVlemUoKTt0aGlzLmtpPXRoaXMuamI9bnVsbDt0aGlzLnVnPW5ldyBFKCk7dGhpcy5sZz1uZXcgRSgpO31CcC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmtpPXRoaXMuamI9bnVsbDt0aGlzLnVnPW5ldyBFKCk7dGhpcy5sZz1uZXcgRSgpO307QnAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPTApO3ZhciBiPSJMYXlvdXRWZXJ0ZXgjIitCYih0aGlzKTtpZigwPGEmJihiKz1udWxsIT09dGhpcy5ub2RlPyIoIit0aGlzLm5vZGUudG9TdHJpbmcoKSsiKSI6IiIsMTxhKSl7YT0iIjtmb3IodmFyIGM9ITAsZD10aGlzLnVnLml0ZXJhdG9yO2QubmV4dCgpOyl7dmFyIGU9ZC52YWx1ZTtjP2M9ITE6YSs9IiwiO2ErPWUudG9TdHJpbmcoMCk7fWU9IiI7Yz0hMDtmb3IoZD10aGlzLmxnLml0ZXJhdG9yO2QubmV4dCgpOyl7dmFyIGY9ZC52YWx1ZTtjP2M9ITE6ZSs9IiwiO2UrPWYudG9TdHJpbmcoMCk7fWIrPSIgc291cmNlczogIithKyIgZGVzdGluYXRpb25zOiAiK2U7fXJldHVybiBiO307QnAucHJvdG90eXBlLmNvbW1pdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuamI7aWYobnVsbCE9PWEpe3ZhciBiPXRoaXMuYm91bmRzLGM9YS5ib3VuZHM7Q2EoYyk/KGMueD1iLngsYy55PWIueSxjLndpZHRoPWIud2lkdGgsYy5oZWlnaHQ9Yi5oZWlnaHQpOmEuYm91bmRzPWIuY29weSgpO31lbHNlIGlmKGE9dGhpcy5ub2RlLG51bGwhPT1hKXtiPXRoaXMuYm91bmRzO2lmKCEoYSBpbnN0YW5jZW9mIGlnKSl7Yz1OLmFsbG9jKCk7dmFyIGQ9dGhpcy5uZXR3b3JrLmxheW91dC5MaShhLGMpLGU9YS5sb2NhdGlvbk9iamVjdC5tYShkZCk7aWYoZC5vKCkmJmUubygpKXthLm1vdmVUbyhiLngrdGhpcy5mb2N1c1gtKGUueC1kLngpLGIueSt0aGlzLmZvY3VzWS0oZS55LWQueSkpO04uZnJlZShjKTtyZXR1cm47fU4uZnJlZShjKTt9YS5tb3ZlVG8oYi54LGIueSk7fX07QnAucHJvdG90eXBlLkh1PWZ1bmN0aW9uKGEpe251bGwhPT1hJiYodGhpcy51Zy5jb250YWlucyhhKXx8dGhpcy51Zy5hZGQoYSkpO307QnAucHJvdG90eXBlLlJ1PWZ1bmN0aW9uKGEpe251bGwhPT1hJiZ0aGlzLnVnLnJlbW92ZShhKTt9O0JwLnByb3RvdHlwZS5GdT1mdW5jdGlvbihhKXtudWxsIT09YSYmKHRoaXMubGcuY29udGFpbnMoYSl8fHRoaXMubGcuYWRkKGEpKTt9O0JwLnByb3RvdHlwZS5RdT1mdW5jdGlvbihhKXtudWxsIT09YSYmdGhpcy5sZy5yZW1vdmUoYSk7fTtmdW5jdGlvbiBIcChhLGIpe2E9YS5raTtiPWIua2k7cmV0dXJuIGE/Yj8oYT1hLnRleHQsYj1iLnRleHQsYTxiPy0xOmE+Yj8xOjApOjE6bnVsbCE9PWI/LTE6MDt9cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQnAucHJvdG90eXBlLHtzb3VyY2VFZGdlc0FycmF5QWNjZXNzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudWcuX2RhdGFBcnJheTt9fSxkZXN0aW5hdGlvbkVkZ2VzQXJyYXlBY2Nlc3M6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sZy5fZGF0YUFycmF5O319LGRhdGE6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5qYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5qYj1hO2lmKG51bGwhPT1hKXt2YXIgYj1hLmJvdW5kczthPWIueDt2YXIgYz1iLnksZD1iLndpZHRoO2I9Yi5oZWlnaHQ7dGhpcy51LmgoZC8yLGIvMik7dGhpcy5sLmgoYSxjLGQsYik7fX19LG5vZGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5raTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYodGhpcy5raSE9PWEpe3RoaXMua2k9YTthLmFjKCk7dmFyIGI9dGhpcy5uZXR3b3JrLmxheW91dCxjPU4uYWxsb2MoKSxkPWIuTGkoYSxjKTtiPWQueDt2YXIgZT1kLnksZj1kLndpZHRoO2Q9ZC5oZWlnaHQ7aXNOYU4oYikmJihiPTApO2lzTmFOKGUpJiYoZT0wKTt0aGlzLmwuaChiLGUsZixkKTtOLmZyZWUoYyk7aWYoIShhIGluc3RhbmNlb2YgaWcpJiYoYT1hLmxvY2F0aW9uT2JqZWN0Lm1hKGRkKSxhLm8oKSkpe3RoaXMudS5oKGEueC1iLGEueS1lKTtyZXR1cm47fXRoaXMudS5oKGYvMixkLzIpO319fSxib3VuZHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmwuQShhKXx8dGhpcy5sLmFzc2lnbihhKTt9fSxmb2N1czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudS5BKGEpfHx0aGlzLnUuYXNzaWduKGEpO319LGNlbnRlclg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sLngrdGhpcy51Lng7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMubDtiLngrdGhpcy51LnghPT1hJiYoYi5oYSgpLGIueD1hLXRoaXMudS54LGIuZnJlZXplKCkpO319LGNlbnRlclk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sLnkrdGhpcy51Lnk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMubDtiLnkrdGhpcy51LnkhPT1hJiYoYi5oYSgpLGIueT1hLXRoaXMudS55LGIuZnJlZXplKCkpO319LGZvY3VzWDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnUueDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy51O2IueCE9PWEmJihiLmhhKCksYi54PWEsYi5mcmVlemUoKSk7fX0sZm9jdXNZOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudS55O30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnU7Yi55IT09YSYmKGIuaGEoKSxiLnk9YSxiLmZyZWV6ZSgpKTt9fSx4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubC54O30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmw7Yi54IT09YSYmKGIuaGEoKSxiLng9YSxiLmZyZWV6ZSgpKTt9fSx5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubC55O30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmw7Yi55IT09YSYmKGIuaGEoKSxiLnk9YSxiLmZyZWV6ZSgpKTt9fSx3aWR0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmwud2lkdGg7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMubDtiLndpZHRoIT09YSYmKGIuaGEoKSxiLndpZHRoPWEsYi5mcmVlemUoKSk7fX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubC5oZWlnaHQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMubDtiLmhlaWdodCE9PWEmJihiLmhhKCksYi5oZWlnaHQ9YSxiLmZyZWV6ZSgpKTt9fSxuZXR3b3JrOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVmM9YTt9fSxzb3VyY2VWZXJ0ZXhlczp7Z2V0OmZ1bmN0aW9uIGdldCgpe2Zvcih2YXIgYT1uZXcgRigpLGI9dGhpcy5zb3VyY2VFZGdlcztiLm5leHQoKTspe2EuYWRkKGIudmFsdWUuZnJvbVZlcnRleCk7fXJldHVybiBhLml0ZXJhdG9yO319LGRlc3RpbmF0aW9uVmVydGV4ZXM6e2dldDpmdW5jdGlvbiBnZXQoKXtmb3IodmFyIGE9bmV3IEYoKSxiPXRoaXMuZGVzdGluYXRpb25FZGdlcztiLm5leHQoKTspe2EuYWRkKGIudmFsdWUudG9WZXJ0ZXgpO31yZXR1cm4gYS5pdGVyYXRvcjt9fSx2ZXJ0ZXhlczp7Z2V0OmZ1bmN0aW9uIGdldCgpe2Zvcih2YXIgYT1uZXcgRigpLGI9dGhpcy5zb3VyY2VFZGdlcztiLm5leHQoKTspe2EuYWRkKGIudmFsdWUuZnJvbVZlcnRleCk7fWZvcihiPXRoaXMuZGVzdGluYXRpb25FZGdlcztiLm5leHQoKTspe2EuYWRkKGIudmFsdWUudG9WZXJ0ZXgpO31yZXR1cm4gYS5pdGVyYXRvcjt9fSxzb3VyY2VFZGdlczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnVnLml0ZXJhdG9yO319LGRlc3RpbmF0aW9uRWRnZXM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sZy5pdGVyYXRvcjt9fSxlZGdlczp7Z2V0OmZ1bmN0aW9uIGdldCgpe2Zvcih2YXIgYT1uZXcgRSgpLGI9dGhpcy5zb3VyY2VFZGdlcztiLm5leHQoKTspe2EuYWRkKGIudmFsdWUpO31mb3IoYj10aGlzLmRlc3RpbmF0aW9uRWRnZXM7Yi5uZXh0KCk7KXthLmFkZChiLnZhbHVlKTt9cmV0dXJuIGEuaXRlcmF0b3I7fX0sZWRnZXNDb3VudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnVnLmNvdW50K3RoaXMubGcuY291bnQ7fX19KTtCcC5wcm90b3R5cGUuZGVsZXRlRGVzdGluYXRpb25FZGdlPUJwLnByb3RvdHlwZS5RdTtCcC5wcm90b3R5cGUuYWRkRGVzdGluYXRpb25FZGdlPUJwLnByb3RvdHlwZS5GdTtCcC5wcm90b3R5cGUuZGVsZXRlU291cmNlRWRnZT1CcC5wcm90b3R5cGUuUnU7QnAucHJvdG90eXBlLmFkZFNvdXJjZUVkZ2U9QnAucHJvdG90eXBlLkh1O0JwLmNsYXNzTmFtZT0iTGF5b3V0VmVydGV4IjtCcC5zdGFuZGFyZENvbXBhcmVyPUhwO0JwLnNtYXJ0Q29tcGFyZXI9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT09YSl7aWYobnVsbCE9PWIpe2E9YS5raTt2YXIgYz1iLmtpO2lmKG51bGwhPT1hKXtpZihudWxsIT09Yyl7Yj1hLnRleHQudG9Mb2NhbGVMb3dlckNhc2UoKS5zcGxpdCgvKFsrXC1dP1tcLl0/XGQrKD86XC5cZCopPyg/OmVbK1wtXT9cZCspPykvKTthPWMudGV4dC50b0xvY2FsZUxvd2VyQ2FzZSgpLnNwbGl0KC8oWytcLV0/W1wuXT9cZCsoPzpcLlxkKik/KD86ZVsrXC1dP1xkKyk/KS8pO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2lmKCIiIT09YVtjXSYmdm9pZCAwIT09YVtjXSl7dmFyIGQ9cGFyc2VGbG9hdChiW2NdKSxlPXBhcnNlRmxvYXQoYVtjXSk7aWYoaXNOYU4oZCkpe2lmKGlzTmFOKGUpKXtpZigwIT09YltjXS5sb2NhbGVDb21wYXJlKGFbY10pKXJldHVybiBiW2NdLmxvY2FsZUNvbXBhcmUoYVtjXSk7fWVsc2UgcmV0dXJuIDE7fWVsc2V7aWYoaXNOYU4oZSkpcmV0dXJuLTE7aWYoMCE9PWQtZSlyZXR1cm4gZC1lO319ZWxzZSBpZigiIiE9PWJbY10pcmV0dXJuIDE7fXJldHVybiIiIT09YVtjXSYmdm9pZCAwIT09YVtjXT8tMTowO31yZXR1cm4gMTt9cmV0dXJuIG51bGwhPT1jPy0xOjA7fXJldHVybiAxO31yZXR1cm4gbnVsbCE9PWI/LTE6MDt9O2Z1bmN0aW9uIENwKGEpe21iKHRoaXMpO3RoaXMuV2I9YTt0aGlzLmZnPXRoaXMuSWY9dGhpcy5tbD10aGlzLmpiPW51bGw7fUNwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuZmc9dGhpcy5JZj10aGlzLm1sPXRoaXMuamI9bnVsbDt9O0NwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT0wKTt2YXIgYj0iTGF5b3V0RWRnZSMiK0JiKHRoaXMpOzA8YSYmKGIrPW51bGwhPT10aGlzLm1sPyIoIit0aGlzLm1sLnRvU3RyaW5nKCkrIikiOiIiLDE8YSYmKGIrPSIgIisodGhpcy5JZj90aGlzLklmLnRvU3RyaW5nKCk6Im51bGwiKSsiIC0tXHgzZSAiKyh0aGlzLmZnP3RoaXMuZmcudG9TdHJpbmcoKToibnVsbCIpKSk7cmV0dXJuIGI7fTtDcC5wcm90b3R5cGUuc209ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklmO3RoaXMuSWY9dGhpcy5mZzt0aGlzLmZnPWE7fTtDcC5wcm90b3R5cGUuY29tbWl0PWZ1bmN0aW9uKCl7fTtDcC5wcm90b3R5cGUubng9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmc9PT1hP3RoaXMuSWY6dGhpcy5JZj09PWE/dGhpcy5mZzpudWxsO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ3AucHJvdG90eXBlLHtuZXR3b3JrOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuV2I7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuV2I9YTt9fSxkYXRhOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuamI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuamIhPT1hJiYodGhpcy5qYj1hKTt9fSxsaW5rOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubWw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMubWwhPT1hJiYodGhpcy5tbD1hKTt9fSxmcm9tVmVydGV4OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSWY7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuSWYhPT1hJiYodGhpcy5JZj1hKTt9fSx0b1ZlcnRleDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmZnO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmZnIT09YSYmKHRoaXMuZmc9YSk7fX19KTtDcC5wcm90b3R5cGUuZ2V0T3RoZXJWZXJ0ZXg9Q3AucHJvdG90eXBlLm54O0NwLmNsYXNzTmFtZT0iTGF5b3V0RWRnZSI7ZnVuY3Rpb24gQ2soKXt5aS5jYWxsKHRoaXMpO3RoaXMuaXNWaWV3cG9ydFNpemVkPSEwO3RoaXMuR3A9dGhpcy5IcD1OYU47dGhpcy5CZz1uZXcgSyhOYU4sTmFOKS5mcmVlemUoKTt0aGlzLlplPW5ldyBLKDEwLDEwKS5mcmVlemUoKTt0aGlzLndiPUlwO3RoaXMuQWI9SnA7dGhpcy5RYz1LcDt0aGlzLk1jPUxwO31vYShDayx5aSk7Q2sucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkPWZ1bmN0aW9uKGEpe3lpLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZC5jYWxsKHRoaXMsYSk7YS5IcD10aGlzLkhwO2EuR3A9dGhpcy5HcDthLkJnLmFzc2lnbih0aGlzLkJnKTthLlplLmFzc2lnbih0aGlzLlplKTthLndiPXRoaXMud2I7YS5BYj10aGlzLkFiO2EuUWM9dGhpcy5RYzthLk1jPXRoaXMuTWM7fTtDay5wcm90b3R5cGUuZmI9ZnVuY3Rpb24oYSl7YS5jbGFzc1R5cGU9PT1Daz9hPT09S3B8fGE9PT1NcHx8YT09PU5wfHxhPT09T3A/dGhpcy5zb3J0aW5nPWE6YT09PUpwfHxhPT09UHA/dGhpcy5hcnJhbmdlbWVudD1hOmE9PT1JcHx8YT09PVFwP3RoaXMuYWxpZ25tZW50PWE6QSgiVW5rbm93biBlbnVtIHZhbHVlOiAiK2EpOnlpLnByb3RvdHlwZS5mYi5jYWxsKHRoaXMsYSk7fTtDay5wcm90b3R5cGUuZG9MYXlvdXQ9ZnVuY3Rpb24oYSl7dGhpcy5hcnJhbmdlbWVudE9yaWdpbj10aGlzLmluaXRpYWxPcmlnaW4odGhpcy5hcnJhbmdlbWVudE9yaWdpbik7dmFyIGI9dGhpcy5YdyhhKTthPXRoaXMuZGlhZ3JhbTtmb3IodmFyIGM9Yi5jb3B5KCkuaXRlcmF0b3I7Yy5uZXh0KCk7KXt2YXIgZD1jLnZhbHVlO2lmKCFkLnpoKCl8fG51bGw9PT1kLmZyb21Ob2RlJiZudWxsPT09ZC50b05vZGUpe2lmKGQuYWMoKSxkIGluc3RhbmNlb2YgaWcpZm9yKGQ9ZC5tZW1iZXJQYXJ0cztkLm5leHQoKTspe2IucmVtb3ZlKGQudmFsdWUpO319ZWxzZSBiLnJlbW92ZShkKTt9dmFyIGU9Yi5OYSgpO2lmKDAhPT1lLmxlbmd0aCl7c3dpdGNoKHRoaXMuc29ydGluZyl7Y2FzZSBPcDplLnJldmVyc2UoKTticmVhaztjYXNlIEtwOmUuc29ydCh0aGlzLmNvbXBhcmVyKTticmVhaztjYXNlIE1wOmUuc29ydCh0aGlzLmNvbXBhcmVyKSxlLnJldmVyc2UoKTt9dmFyIGY9dGhpcy53cmFwcGluZ0NvbHVtbjtpc05hTihmKSYmKGY9MCk7dmFyIGc9dGhpcy53cmFwcGluZ1dpZHRoO2lzTmFOKGcpJiZudWxsIT09YT8oYj1hLnBhZGRpbmcsZz1NYXRoLm1heChhLnZpZXdwb3J0Qm91bmRzLndpZHRoLWIubGVmdC1iLnJpZ2h0LDApKTpnPU1hdGgubWF4KHRoaXMud3JhcHBpbmdXaWR0aCwwKTswPj1mJiYwPj1nJiYoZj0xKTtiPXRoaXMuc3BhY2luZy53aWR0aDtpc0Zpbml0ZShiKXx8KGI9MCk7Yz10aGlzLnNwYWNpbmcuaGVpZ2h0O2lzRmluaXRlKGMpfHwoYz0wKTtudWxsIT09YSYmYS5BYSgiTGF5b3V0Iik7ZD1bXTtzd2l0Y2godGhpcy5hbGlnbm1lbnQpe2Nhc2UgUXA6dmFyIGg9YixrPWMsbD1OLmFsbG9jKCksbT1NYXRoLm1heCh0aGlzLmNlbGxTaXplLndpZHRoLDEpO2lmKCFpc0Zpbml0ZShtKSlmb3IodmFyIG49bT0wO248ZS5sZW5ndGg7bisrKXt2YXIgcD10aGlzLkxpKGVbbl0sbCk7bT1NYXRoLm1heChtLHAud2lkdGgpO31tPU1hdGgubWF4KG0raCwxKTtuPU1hdGgubWF4KHRoaXMuY2VsbFNpemUuaGVpZ2h0LDEpO2lmKCFpc0Zpbml0ZShuKSlmb3IocD1uPTA7cDxlLmxlbmd0aDtwKyspe3ZhciBxPXRoaXMuTGkoZVtwXSxsKTtuPU1hdGgubWF4KG4scS5oZWlnaHQpO31uPU1hdGgubWF4KG4raywxKTtwPXRoaXMuYXJyYW5nZW1lbnQ7Zm9yKHZhciByPXE9dGhpcy5hcnJhbmdlbWVudE9yaWdpbi54LHU9dGhpcy5hcnJhbmdlbWVudE9yaWdpbi55LHg9MCx2PTAseT0wO3k8ZS5sZW5ndGg7eSsrKXt2YXIgej1lW3ldLEI9dGhpcy5MaSh6LGwpLEM9TWF0aC5jZWlsKChCLndpZHRoK2gpL20pKm0sST1NYXRoLmNlaWwoKEIuaGVpZ2h0K2spL24pKm47c3dpdGNoKHApe2Nhc2UgUHA6dmFyIEo9TWF0aC5hYnMoci1CLndpZHRoKTticmVhaztkZWZhdWx0Oko9citCLndpZHRoO31pZigwPGYmJng+Zi0xfHwwPGcmJjA8eCYmSi1xPmcpZC5wdXNoKG5ldyBOKDAsdSxnK2gsdikpLHg9MCxyPXEsdSs9dix2PTA7dj1NYXRoLm1heCh2LEkpO3N3aXRjaChwKXtjYXNlIFBwOkI9LUIud2lkdGg7YnJlYWs7ZGVmYXVsdDpCPTA7fXoubW92ZVRvKHIrQix1KTtzd2l0Y2gocCl7Y2FzZSBQcDpyLT1DO2JyZWFrO2RlZmF1bHQ6cis9Qzt9eCsrO31kLnB1c2gobmV3IE4oMCx1LGcraCx2KSk7Ti5mcmVlKGwpO2JyZWFrO2Nhc2UgSXA6az1nO209ZjtuPWI7cD1jO2c9Ti5hbGxvYygpO3E9TWF0aC5tYXgodGhpcy5jZWxsU2l6ZS53aWR0aCwxKTtmPXU9bD0wO2g9Ry5hbGxvYygpO2ZvcihyPTA7cjxlLmxlbmd0aDtyKyspe3Y9ZVtyXSx4PXRoaXMuTGkodixnKSx2PXYubmYodi5sb2NhdGlvbk9iamVjdCx2LmxvY2F0aW9uU3BvdCxoKSxsPU1hdGgubWF4KGwsdi54KSx1PU1hdGgubWF4KHUseC53aWR0aC12LngpLGY9TWF0aC5tYXgoZix2LnkpO31yPXRoaXMuYXJyYW5nZW1lbnQ7c3dpdGNoKHIpe2Nhc2UgUHA6bCs9bjticmVhaztkZWZhdWx0OnUrPW47fXE9aXNGaW5pdGUocSk/TWF0aC5tYXgocStuLDEpOk1hdGgubWF4KGwrdSwxKTt2YXIgTD12PXRoaXMuYXJyYW5nZW1lbnRPcmlnaW4ueDt5PXRoaXMuYXJyYW5nZW1lbnRPcmlnaW4ueTt1PTA7az49bCYmKGstPWwpO2w9ej0wO0M9TWF0aC5tYXgodGhpcy5jZWxsU2l6ZS5oZWlnaHQsMSk7Qj1mPTA7ST0hMDt4PUcuYWxsb2MoKTtmb3IoSj0wO0o8ZS5sZW5ndGg7SisrKXt2YXIgVT1lW0pdLFE9dGhpcy5MaShVLGcpLGlhPVUubmYoVS5sb2NhdGlvbk9iamVjdCxVLmxvY2F0aW9uU3BvdCxoKTtpZigwPHUpc3dpdGNoKHIpe2Nhc2UgUHA6TD0oTC12LShRLndpZHRoLWlhLngpKS9xO0w9SC5jYShNYXRoLnJvdW5kKEwpLEwpP01hdGgucm91bmQoTCk6TWF0aC5mbG9vcihMKTtMPUwqcSt2O2JyZWFrO2RlZmF1bHQ6TD0oTC12K2lhLngpL3EsTD1ILmNhKE1hdGgucm91bmQoTCksTCk/TWF0aC5yb3VuZChMKTpNYXRoLmNlaWwoTCksTD1MKnErdjt9ZWxzZSBzd2l0Y2gocil7Y2FzZSBQcDp6PUwraWEueCtRLndpZHRoO2JyZWFrO2RlZmF1bHQ6ej1MLWlhLng7fXN3aXRjaChyKXtjYXNlIFBwOnZhciBqYT0tKEwraWEueCkrejticmVhaztkZWZhdWx0OmphPUwrUS53aWR0aC1pYS54LXo7fWlmKDA8bSYmdT5tLTF8fDA8ayYmMDx1JiZqYT5rKXtkLnB1c2gobmV3IE4oMCxJP3ktZjp5LGsrbixCK2YrcCkpO2ZvcihMPTA7TDx1JiZKIT09dTtMKyspe2phPWVbSi11K0xdO3ZhciBNPWphLm5mKGphLmxvY2F0aW9uT2JqZWN0LGphLmxvY2F0aW9uU3BvdCx4KTtqYS5tb3ZlVG8oamEucG9zaXRpb24ueCxqYS5wb3NpdGlvbi55K2YtTS55KTt9Qis9cDt5PUk/eStCOnkrKEIrZik7dT1CPWY9MDtMPXY7ST0hMTt9TD09PXYmJihsPXI9PT1QcD9NYXRoLm1heChsLFEud2lkdGgtaWEueCk6TWF0aC5taW4obCwtaWEueCkpO2Y9TWF0aC5tYXgoZixpYS55KTtCPU1hdGgubWF4KEIsUS5oZWlnaHQtaWEueSk7aXNGaW5pdGUoQykmJihCPU1hdGgubWF4KEIsTWF0aC5tYXgoUS5oZWlnaHQsQyktaWEueSkpO0k/VS5tb3ZlVG8oTC1pYS54LHktaWEueSk6VS5tb3ZlVG8oTC1pYS54LHkpO3N3aXRjaChyKXtjYXNlIFBwOkwtPWlhLngrbjticmVhaztkZWZhdWx0OkwrPVEud2lkdGgtaWEueCtuO311Kys7fWQucHVzaChuZXcgTigwLHksaytuLChJP0I6QitmKStwKSk7aWYoZS5sZW5ndGghPT11KWZvcihrPTA7azx1O2srKyl7bT1lW2UubGVuZ3RoLXUra10sbj1tLm5mKG0ubG9jYXRpb25PYmplY3QsbS5sb2NhdGlvblNwb3QsaCksbS5tb3ZlVG8obS5wb3NpdGlvbi54LG0ucG9zaXRpb24ueStmLW4ueSk7fUcuZnJlZShoKTtHLmZyZWUoeCk7aWYocj09PVBwKWZvcihlPTA7ZTxkLmxlbmd0aDtlKyspe2Y9ZFtlXSxmLndpZHRoKz1sLGYueC09bDt9ZWxzZSBmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKXtmPWRbZV0sZi54PmwmJihmLndpZHRoKz1mLngtbCxmLng9bCk7fU4uZnJlZShnKTt9Zm9yKGg9Zj1nPWU9MDtoPGQubGVuZ3RoO2grKyl7az1kW2hdLGU9TWF0aC5taW4oZSxrLngpLGc9TWF0aC5taW4oZyxrLnkpLGY9TWF0aC5tYXgoZixrLngray53aWR0aCk7fXRoaXMuYXJyYW5nZW1lbnQ9PT1QcD90aGlzLmNvbW1pdExheWVycyhkLG5ldyBHKGUrYi8yLShmK2UpLGctYy8yKSk6dGhpcy5jb21taXRMYXllcnMoZCxuZXcgRyhlLWIvMixnLWMvMikpO251bGwhPT1hJiZhLlphKCJMYXlvdXQiKTt0aGlzLmlzVmFsaWRMYXlvdXQ9ITA7fX07Q2sucHJvdG90eXBlLmNvbW1pdExheWVycz1mdW5jdGlvbigpe307ZnVuY3Rpb24gTHAoYSxiKXthPWEudGV4dDtiPWIudGV4dDtyZXR1cm4gYTxiPy0xOmE+Yj8xOjA7fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENrLnByb3RvdHlwZSx7d3JhcHBpbmdXaWR0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkhwO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkhwIT09YSYmKDA8YXx8aXNOYU4oYSkpJiYodGhpcy5IcD1hLHRoaXMuaXNWaWV3cG9ydFNpemVkPWlzTmFOKGEpLHRoaXMuQigpKTt9fSx3cmFwcGluZ0NvbHVtbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkdwO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkdwIT09YSYmKDA8YXx8aXNOYU4oYSkpJiYodGhpcy5HcD1hLHRoaXMuQigpKTt9fSxjZWxsU2l6ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkJnO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkJnLkEoYSl8fCh0aGlzLkJnLmFzc2lnbihhKSx0aGlzLkIoKSk7fX0sc3BhY2luZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlplO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlplLkEoYSl8fCh0aGlzLlplLmFzc2lnbihhKSx0aGlzLkIoKSk7fX0sYWxpZ25tZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMud2I7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMud2I9PT1hfHxhIT09SXAmJmEhPT1RcHx8KHRoaXMud2I9YSx0aGlzLkIoKSk7fX0sYXJyYW5nZW1lbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5BYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5BYj09PWF8fGEhPT1KcCYmYSE9PVBwfHwodGhpcy5BYj1hLHRoaXMuQigpKTt9fSxzb3J0aW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUWM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuUWM9PT1hfHxhIT09TnAmJmEhPT1PcCYmYSE9PUtwJiZhIT09TXB8fCh0aGlzLlFjPWEsdGhpcy5CKCkpO319LGNvbXBhcmVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTWM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTWMhPT1hJiYodGhpcy5NYz1hLHRoaXMuQigpKTt9fX0pO3ZhciBRcD1uZXcgRChDaywiUG9zaXRpb24iLDApLElwPW5ldyBEKENrLCJMb2NhdGlvbiIsMSksSnA9bmV3IEQoQ2ssIkxlZnRUb1JpZ2h0IiwyKSxQcD1uZXcgRChDaywiUmlnaHRUb0xlZnQiLDMpLE5wPW5ldyBEKENrLCJGb3J3YXJkIiw0KSxPcD1uZXcgRChDaywiUmV2ZXJzZSIsNSksS3A9bmV3IEQoQ2ssIkFzY2VuZGluZyIsNiksTXA9bmV3IEQoQ2ssIkRlc2NlbmRpbmciLDcpO0NrLmNsYXNzTmFtZT0iR3JpZExheW91dCI7Q2suc3RhbmRhcmRDb21wYXJlcj1McDtDay5zbWFydENvbXBhcmVyPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9PWEpe2lmKG51bGwhPT1iKXthPWEudGV4dC50b0xvY2FsZUxvd2VyQ2FzZSgpLnNwbGl0KC8oWytcLV0/W1wuXT9cZCsoPzpcLlxkKik/KD86ZVsrXC1dP1xkKyk/KS8pO2I9Yi50ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCkuc3BsaXQoLyhbK1wtXT9bXC5dP1xkKyg/OlwuXGQqKT8oPzplWytcLV0/XGQrKT8pLyk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe2lmKCIiIT09YltjXSYmdm9pZCAwIT09YltjXSl7dmFyIGQ9cGFyc2VGbG9hdChhW2NdKSxlPXBhcnNlRmxvYXQoYltjXSk7aWYoaXNOYU4oZCkpe2lmKGlzTmFOKGUpKXtpZigwIT09YVtjXS5sb2NhbGVDb21wYXJlKGJbY10pKXJldHVybiBhW2NdLmxvY2FsZUNvbXBhcmUoYltjXSk7fWVsc2UgcmV0dXJuIDE7fWVsc2V7aWYoaXNOYU4oZSkpcmV0dXJuLTE7aWYoMCE9PWQtZSlyZXR1cm4gZC1lO319ZWxzZSBpZigiIiE9PWFbY10pcmV0dXJuIDE7fXJldHVybiIiIT09YltjXSYmdm9pZCAwIT09YltjXT8tMTowO31yZXR1cm4gMTt9cmV0dXJuIG51bGwhPT1iPy0xOjA7fTtDay5Qb3NpdGlvbj1RcDtDay5Mb2NhdGlvbj1JcDtDay5MZWZ0VG9SaWdodD1KcDtDay5SaWdodFRvTGVmdD1QcDtDay5Gb3J3YXJkPU5wO0NrLlJldmVyc2U9T3A7Q2suQXNjZW5kaW5nPUtwO0NrLkRlc2NlbmRpbmc9TXA7ZnVuY3Rpb24gdGkoKXt0aGlzLkNvPW5ldyBGKCk7dGhpcy5obz1uZXcgRigpO3RoaXMuRmE9bmV3IEYoKTt0aGlzLk1lPW5ldyBMYigpO3RoaXMuRGc9bmV3IExiKCk7dGhpcy5vaj1uZXcgTGIoKTt0aGlzLkM9bnVsbDt0aGlzLnhxPSExO310PXRpLnByb3RvdHlwZTt0LmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5Dby5jbGVhcigpO3RoaXMuaG8uY2xlYXIoKTt0aGlzLkZhLmNsZWFyKCk7dGhpcy5NZS5jbGVhcigpO3RoaXMuRGcuY2xlYXIoKTt0aGlzLm9qLmNsZWFyKCk7fTt0LmhiPWZ1bmN0aW9uKGEpe3RoaXMuQz1hO307dC5OaT1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgVil7aWYodGhpcy5Dby5hZGQoYSksYSBpbnN0YW5jZW9mIGlnKXt2YXIgYj1hLmNvbnRhaW5pbmdHcm91cDtudWxsPT09Yj90aGlzLkMueGkuYWRkKGEpOmIucmwuYWRkKGEpO2I9YS5sYXlvdXQ7bnVsbCE9PWImJihiLmRpYWdyYW09dGhpcy5DKTt9fWVsc2UgYSBpbnN0YW5jZW9mIFM/dGhpcy5oby5hZGQoYSk6YSBpbnN0YW5jZW9mIHBmfHx0aGlzLkZhLmFkZChhKTtiPWEuZGF0YTtudWxsPT09Ynx8YSBpbnN0YW5jZW9mIHBmfHwoYSBpbnN0YW5jZW9mIFM/dGhpcy5EZy5hZGQoYixhKTp0aGlzLk1lLmFkZChiLGEpKTt9O3QueGM9ZnVuY3Rpb24oYSl7YS5TaigpO2lmKGEgaW5zdGFuY2VvZiBWKXtpZih0aGlzLkNvLnJlbW92ZShhKSxhIGluc3RhbmNlb2YgaWcpe3ZhciBiPWEuY29udGFpbmluZ0dyb3VwO251bGw9PT1iP3RoaXMuQy54aS5yZW1vdmUoYSk6Yi5ybC5yZW1vdmUoYSk7Yj1hLmxheW91dDtudWxsIT09YiYmKGIuZGlhZ3JhbT1udWxsKTt9fWVsc2UgYSBpbnN0YW5jZW9mIFM/dGhpcy5oby5yZW1vdmUoYSk6YSBpbnN0YW5jZW9mIHBmfHx0aGlzLkZhLnJlbW92ZShhKTtiPWEuZGF0YTtudWxsPT09Ynx8YSBpbnN0YW5jZW9mIHBmfHwoYSBpbnN0YW5jZW9mIFM/dGhpcy5EZy5yZW1vdmUoYik6dGhpcy5NZS5yZW1vdmUoYikpO307dC51ZD1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkMubm9kZVRlbXBsYXRlTWFwLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGI9YS52YWx1ZSxjPWEua2V5OyghYi5MYigpfHxiIGluc3RhbmNlb2YgaWcpJiZBKCdJbnZhbGlkIG5vZGUgdGVtcGxhdGUgaW4gRGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXA6IHRlbXBsYXRlIGZvciAiJytjKyciIG11c3QgYmUgYSBOb2RlIG9yIGEgc2ltcGxlIFBhcnQsIG5vdCBhIEdyb3VwIG9yIExpbms6ICcrYik7fWZvcihhPXRoaXMuQy5ncm91cFRlbXBsYXRlTWFwLml0ZXJhdG9yO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGM9YS5rZXksYiBpbnN0YW5jZW9mIGlnfHxBKCdJbnZhbGlkIGdyb3VwIHRlbXBsYXRlIGluIERpYWdyYW0uZ3JvdXBUZW1wbGF0ZU1hcDogdGVtcGxhdGUgZm9yICInK2MrJyIgbXVzdCBiZSBhIEdyb3VwLCBub3QgYSBub3JtYWwgTm9kZSBvciBMaW5rOiAnK2IpO31mb3IoYT10aGlzLkMubGlua1RlbXBsYXRlTWFwLml0ZXJhdG9yO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGM9YS5rZXksYiBpbnN0YW5jZW9mIFN8fEEoJ0ludmFsaWQgbGluayB0ZW1wbGF0ZSBpbiBEaWFncmFtLmxpbmtUZW1wbGF0ZU1hcDogdGVtcGxhdGUgZm9yICInK2MrJyIgbXVzdCBiZSBhIExpbmssIG5vdCBhIG5vcm1hbCBOb2RlIG9yIHNpbXBsZSBQYXJ0OiAnK2IpO31hPUthKCk7Zm9yKGI9dGhpcy5DLnNlbGVjdGlvbi5pdGVyYXRvcjtiLm5leHQoKTspeyhjPWIudmFsdWUuZGF0YSkmJmEucHVzaChjKTt9Yj1LYSgpO2ZvcihjPXRoaXMuQy5oaWdobGlnaHRlZHMuaXRlcmF0b3I7Yy5uZXh0KCk7KXt2YXIgZD1jLnZhbHVlLmRhdGE7ZCYmYi5wdXNoKGQpO31jPUthKCk7Zm9yKGQ9dGhpcy5ub2Rlcy5pdGVyYXRvcjtkLm5leHQoKTspe3ZhciBlPWQudmFsdWU7bnVsbCE9PWUuZGF0YSYmKGMucHVzaChlLmRhdGEpLGMucHVzaChlLmxvY2F0aW9uKSk7fWZvcihkPXRoaXMubGlua3MuaXRlcmF0b3I7ZC5uZXh0KCk7KXtlPWQudmFsdWUsbnVsbCE9PWUuZGF0YSYmKGMucHVzaChlLmRhdGEpLGMucHVzaChlLmxvY2F0aW9uKSk7fWZvcihkPXRoaXMucGFydHMuaXRlcmF0b3I7ZC5uZXh0KCk7KXtlPWQudmFsdWUsbnVsbCE9PWUuZGF0YSYmKGMucHVzaChlLmRhdGEpLGMucHVzaChlLmxvY2F0aW9uKSk7fXRoaXMucmVtb3ZlQWxsTW9kZWxlZFBhcnRzKCk7dGhpcy5hZGRBbGxNb2RlbGVkUGFydHMoKTtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKXtlPXRoaXMudmMoYVtkXSksbnVsbCE9PWUmJihlLmlzU2VsZWN0ZWQ9ITApO31mb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKXtlPXRoaXMudmMoYltkXSksbnVsbCE9PWUmJihlLmlzSGlnaGxpZ2h0ZWQ9ITApO31mb3IoZD0wO2Q8Yy5sZW5ndGg7ZCs9Mil7ZT10aGlzLnZjKGNbZF0pLG51bGwhPT1lJiYoZS5sb2NhdGlvbj1jW2QrMV0pO31PYShhKTtPYShiKTtPYShjKTt9O3RpLnByb3RvdHlwZS5hZGRBbGxNb2RlbGVkUGFydHM9ZnVuY3Rpb24oKXt0aGlzLmFkZE1vZGVsZWRQYXJ0cyh0aGlzLmRpYWdyYW0ubW9kZWwubm9kZURhdGFBcnJheSk7fTt0aS5wcm90b3R5cGUuYWRkTW9kZWxlZFBhcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPXRoaXMuZGlhZ3JhbS5tb2RlbDthLmZvckVhY2goZnVuY3Rpb24oYSl7ZC5RYihhKSYmUnAoYyxhLCExKTt9KTthLmZvckVhY2goZnVuY3Rpb24oYSl7ZC5RYihhKSYmYy5yZXNvbHZlUmVmZXJlbmNlc0ZvckRhdGEoYSk7fSk7ITEhPT1iJiZmayh0aGlzLmRpYWdyYW0sITEpO307ZnVuY3Rpb24gUnAoYSxiLGMpe2lmKHZvaWQgMCE9PWImJm51bGwhPT1iJiYhYS5kaWFncmFtLnVuZG9NYW5hZ2VyLmlzVW5kb2luZ1JlZG9pbmcmJiFhLk1lLmNvbnRhaW5zKGIpKXt2b2lkIDA9PT1jJiYoYz0hMCk7YTp7aWYodm9pZCAwIT09YiYmbnVsbCE9PWImJiFhLkMudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZyYmIWEuTWUuY29udGFpbnMoYikpe3ZhciBkPWEuVnMoYik7dmFyIGU9dG8oYSxiLGQpO2lmKG51bGwhPT1lJiYoWWcoZSksZT1lLmNvcHkoKSxudWxsIT09ZSkpe3ZhciBmPWEuZGlhZ3JhbS5za2lwc01vZGVsU291cmNlQmluZGluZ3M7YS5kaWFncmFtLnNraXBzTW9kZWxTb3VyY2VCaW5kaW5ncz0hMDtlLnlmPWQ7ZS5qYj1iO2EueHEmJihlLlJnPSJUb29sIik7YS5kaWFncmFtLmFkZChlKTtlLmpiPW51bGw7ZS5kYXRhPWI7YS5kaWFncmFtLnNraXBzTW9kZWxTb3VyY2VCaW5kaW5ncz1mO2Q9ZTticmVhayBhO319ZD1udWxsO31udWxsIT09ZCYmYyYmYS5yZXNvbHZlUmVmZXJlbmNlc0ZvckRhdGEoYik7fX10aS5wcm90b3R5cGUuaW5zZXJ0TGluaz1mdW5jdGlvbigpe3JldHVybiBudWxsO307dGkucHJvdG90eXBlLnJlc29sdmVSZWZlcmVuY2VzRm9yRGF0YT1mdW5jdGlvbigpe307dGkucHJvdG90eXBlLlZzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkMubW9kZWwuVnMoYSk7fTtmdW5jdGlvbiB0byhhLGIsYyl7YT1hLkM7dmFyIGQ9YS5tb2RlbDtkLmRrKCkmJmQua3YoYik/KGI9YS5ncm91cFRlbXBsYXRlTWFwLkooYyksbnVsbD09PWImJihiPWEuZ3JvdXBUZW1wbGF0ZU1hcC5KKCIiKSxudWxsPT09YiYmKFNwfHwoU3A9ITAseWEoJ05vIEdyb3VwIHRlbXBsYXRlIGZvdW5kIGZvciBjYXRlZ29yeSAiJytjKyciJykseWEoIiAgVXNpbmcgZGVmYXVsdCBncm91cCB0ZW1wbGF0ZSIpKSxiPWEucXcpKSk6KGI9YS5ub2RlVGVtcGxhdGVNYXAuSihjKSxudWxsPT09YiYmKGI9YS5ub2RlVGVtcGxhdGVNYXAuSigiIiksbnVsbD09PWImJihUcHx8KFRwPSEwLHlhKCdObyBOb2RlIHRlbXBsYXRlIGZvdW5kIGZvciBjYXRlZ29yeSAiJytjKyciJykseWEoIiAgVXNpbmcgZGVmYXVsdCBub2RlIHRlbXBsYXRlIikpLGI9YS5zdykpKTtyZXR1cm4gYjt9dGkucHJvdG90eXBlLmdldExpbmtDYXRlZ29yeUZvckRhdGE9ZnVuY3Rpb24oKXtyZXR1cm4iIjt9O3RpLnByb3RvdHlwZS5zZXRMaW5rQ2F0ZWdvcnlGb3JEYXRhPWZ1bmN0aW9uKCl7fTt0aS5wcm90b3R5cGUuc2V0RnJvbU5vZGVGb3JMaW5rPWZ1bmN0aW9uKCl7fTt0aS5wcm90b3R5cGUuc2V0VG9Ob2RlRm9yTGluaz1mdW5jdGlvbigpe307dGkucHJvdG90eXBlLmZpbmRMaW5rVGVtcGxhdGVGb3JDYXRlZ29yeT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLkMubGlua1RlbXBsYXRlTWFwLkooYSk7bnVsbD09PWImJihiPXRoaXMuQy5saW5rVGVtcGxhdGVNYXAuSigiIiksbnVsbD09PWImJihVcHx8KFVwPSEwLHlhKCdObyBMaW5rIHRlbXBsYXRlIGZvdW5kIGZvciBjYXRlZ29yeSAiJythKyciJykseWEoIiAgVXNpbmcgZGVmYXVsdCBsaW5rIHRlbXBsYXRlIikpLGI9dGhpcy5DLnJ3KSk7cmV0dXJuIGI7fTt0aS5wcm90b3R5cGUucmVtb3ZlQWxsTW9kZWxlZFBhcnRzPWZ1bmN0aW9uKCl7dGhpcy5xdCh0aGlzLmRpYWdyYW0ubW9kZWwubm9kZURhdGFBcnJheSk7fTt0aS5wcm90b3R5cGUucXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthLmZvckVhY2goZnVuY3Rpb24oYSl7Yi5tcShhKTt9KTt9O3RpLnByb3RvdHlwZS5tcT1mdW5jdGlvbihhKXthPXRoaXMudmMoYSk7bnVsbCE9PWEmJihJaih0aGlzLmRpYWdyYW0sYSwhMSksdGhpcy51bnJlc29sdmVSZWZlcmVuY2VzRm9yUGFydChhKSk7fTt0aS5wcm90b3R5cGUudW5yZXNvbHZlUmVmZXJlbmNlc0ZvclBhcnQ9ZnVuY3Rpb24oKXt9O3RpLnByb3RvdHlwZS5yZW1vdmVEYXRhRm9yTGluaz1mdW5jdGlvbigpe307dGkucHJvdG90eXBlLmZpbmRQYXJ0Rm9yS2V5PWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hfHx2b2lkIDA9PT1hKXJldHVybiBudWxsO2E9dGhpcy5DLm1vZGVsLlJiKGEpO3JldHVybiBudWxsIT09YT90aGlzLk1lLkooYSk6bnVsbDt9O3Q9dGkucHJvdG90eXBlO3QuSGI9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWF8fHZvaWQgMD09PWEpcmV0dXJuIG51bGw7YT10aGlzLkMubW9kZWwuUmIoYSk7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7YT10aGlzLk1lLkooYSk7cmV0dXJuIGEgaW5zdGFuY2VvZiBWP2E6bnVsbDt9O3QudmM9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7dmFyIGI9dGhpcy5NZS5KKGEpO3JldHVybiBudWxsIT09Yj9iOmI9dGhpcy5EZy5KKGEpO307dC5FaT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDthPXRoaXMuTWUuSihhKTtyZXR1cm4gYSBpbnN0YW5jZW9mIFY/YTpudWxsO307dC51Yz1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWE/bnVsbDp0aGlzLkRnLkooYSk7fTt0LlNzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8YXJndW1lbnRzLmxlbmd0aDsrK2Ipezt9Yj1uZXcgRigpO2Zvcih2YXIgYz10aGlzLkNvLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGQ9Yy52YWx1ZSxlPWQuZGF0YTtpZihudWxsIT09ZSlmb3IodmFyIGY9MDtmPGFyZ3VtZW50cy5sZW5ndGg7ZisrKXt2YXIgZz1hcmd1bWVudHNbZl07aWYoQ2EoZykmJlZwKHRoaXMsZSxnKSl7Yi5hZGQoZCk7YnJlYWs7fX19cmV0dXJuIGIuaXRlcmF0b3I7fTt0LlJzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8YXJndW1lbnRzLmxlbmd0aDsrK2Ipezt9Yj1uZXcgRigpO2Zvcih2YXIgYz10aGlzLmhvLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGQ9Yy52YWx1ZSxlPWQuZGF0YTtpZihudWxsIT09ZSlmb3IodmFyIGY9MDtmPGFyZ3VtZW50cy5sZW5ndGg7ZisrKXt2YXIgZz1hcmd1bWVudHNbZl07aWYoQ2EoZykmJlZwKHRoaXMsZSxnKSl7Yi5hZGQoZCk7YnJlYWs7fX19cmV0dXJuIGIuaXRlcmF0b3I7fTtmdW5jdGlvbiBWcChhLGIsYyl7Zm9yKHZhciBkIGluIGMpe3ZhciBlPWJbZF0sZj1jW2RdO2lmKEVhKGYpKXtpZighRWEoZSl8fGUubGVuZ3RoPGYubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZz0wO2c8ZS5sZW5ndGg7ZysrKXt2YXIgaD1mW2ddO2lmKHZvaWQgMCE9PWgmJiFXcChhLGVbZ10saCkpcmV0dXJuITE7fX1lbHNlIGlmKCFXcChhLGUsZikpcmV0dXJuITE7fXJldHVybiEwO31mdW5jdGlvbiBXcChhLGIsYyl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBjKXtpZighYyhiKSlyZXR1cm4hMTt9ZWxzZSBpZihjIGluc3RhbmNlb2YgUmVnRXhwKXtpZighYnx8IWMudGVzdChiLnRvU3RyaW5nKCkpKXJldHVybiExO31lbHNlIGlmKENhKGIpJiZDYShjKSl7aWYoIVZwKGEsYixjKSlyZXR1cm4hMTt9ZWxzZSBpZihiIT09YylyZXR1cm4hMTtyZXR1cm4hMDt9dGkucHJvdG90eXBlLmRvTW9kZWxDaGFuZ2VkPWZ1bmN0aW9uKGEpe2lmKHRoaXMuQyl7dmFyIGI9dGhpcy5DO2lmKGEubW9kZWw9PT1iLm1vZGVsKXt2YXIgYz1hLmNoYW5nZTtiLmRvTW9kZWxDaGFuZ2VkKGEpO2lmKGIuZGEpe2IuZGE9ITE7dHJ5e3ZhciBkPWEubW9kZWxDaGFuZ2U7aWYoIiIhPT1kKXtpZihjPT09YWYpe2lmKCJub2RlQ2F0ZWdvcnkiPT09ZCl7dmFyIGU9dGhpcy52YyhhLm9iamVjdCksZj1hLm5ld1ZhbHVlO251bGwhPT1lJiYic3RyaW5nIj09PXR5cGVvZiBmJiYoZS5jYXRlZ29yeT1mKTt9ZWxzZSJub2RlRGF0YUFycmF5Ij09PWQmJih0aGlzLnF0KGEub2xkVmFsdWUpLHRoaXMuYWRkTW9kZWxlZFBhcnRzKGEubmV3VmFsdWUpKTtiLmlzTW9kaWZpZWQ9ITA7fWVsc2UgaWYoYz09PWNmKXt2YXIgZz1hLm5ld1ZhbHVlOyJub2RlRGF0YUFycmF5Ij09PWQmJkNhKGcpJiZScCh0aGlzLGcpO2IuaXNNb2RpZmllZD0hMDt9ZWxzZSBpZihjPT09ZGYpe3ZhciBoPWEub2xkVmFsdWU7Im5vZGVEYXRhQXJyYXkiPT09ZCYmQ2EoaCkmJnRoaXMubXEoaCk7Yi5pc01vZGlmaWVkPSEwO31lbHNlIGM9PT1iZiYmKCJTb3VyY2VDaGFuZ2VkIj09PWQ/bnVsbCE9PWEub2JqZWN0P3RoaXMudXBkYXRlRGF0YUJpbmRpbmdzKGEub2JqZWN0LGEucHJvcGVydHlOYW1lKToodGhpcy50cSgpLHRoaXMudXBkYXRlQWxsVGFyZ2V0QmluZGluZ3MoKSk6Ik1vZGVsRGlzcGxhY2VkIj09PWQmJnRoaXMudWQoKSk7fWVsc2UgaWYoYz09PWFmKXt2YXIgaz1hLnByb3BlcnR5TmFtZSxsPWEub2JqZWN0O2lmKGw9PT1iLm1vZGVsKXtpZigibm9kZUtleVByb3BlcnR5Ij09PWt8fCJub2RlQ2F0ZWdvcnlQcm9wZXJ0eSI9PT1rKWIudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8dGhpcy51ZCgpO31lbHNlIHRoaXMudXBkYXRlRGF0YUJpbmRpbmdzKGwsayk7Yi5pc01vZGlmaWVkPSEwO31lbHNlIGlmKGM9PT1jZnx8Yz09PWRmKXt2YXIgbT1hLmNoYW5nZT09PWNmLG49bT9hLm5ld1BhcmFtOmEub2xkUGFyYW0scD1tP2EubmV3VmFsdWU6YS5vbGRWYWx1ZSxxPXRoaXMub2ouSihhLm9iamVjdCk7aWYoQXJyYXkuaXNBcnJheShxKSlmb3IoYT0wO2E8cS5sZW5ndGg7YSsrKXt2YXIgcj1xW2FdO2lmKG0pYW4ocixwLG4pO2Vsc2UgaWYoISgwPm4pKXt2YXIgdT1uK1VtKHIpO3IueGModSwhMCk7ZW4ocix1LG4pO319Yi5pc01vZGlmaWVkPSEwO319ZmluYWxseXtiLmRhPSEwO319fX19O3RpLnByb3RvdHlwZS51cGRhdGVBbGxUYXJnZXRCaW5kaW5ncz1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT0iIik7Zm9yKHZhciBiPXRoaXMucGFydHMuaXRlcmF0b3I7Yi5uZXh0KCk7KXtiLnZhbHVlLkVhKGEpO31mb3IoYj10aGlzLm5vZGVzLml0ZXJhdG9yO2IubmV4dCgpOyl7Yi52YWx1ZS5FYShhKTt9Zm9yKGI9dGhpcy5saW5rcy5pdGVyYXRvcjtiLm5leHQoKTspe2IudmFsdWUuRWEoYSk7fX07dGkucHJvdG90eXBlLnRxPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQy5tb2RlbCxiPW5ldyBGKCksYz1hLm5vZGVEYXRhQXJyYXksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXtiLmFkZChjW2RdKTt9dmFyIGU9W107dGhpcy5ub2Rlcy5lYWNoKGZ1bmN0aW9uKGEpe251bGw9PT1hLmRhdGF8fGIuY29udGFpbnMoYS5kYXRhKXx8ZS5wdXNoKGEuZGF0YSk7fSk7dGhpcy5wYXJ0cy5lYWNoKGZ1bmN0aW9uKGEpe251bGw9PT1hLmRhdGF8fGIuY29udGFpbnMoYS5kYXRhKXx8ZS5wdXNoKGEuZGF0YSk7fSk7ZS5mb3JFYWNoKGZ1bmN0aW9uKGIpe1hwKGEsYiwhMSk7fSk7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGY9Y1tkXTtudWxsPT09dGhpcy52YyhmKSYmWXAoYSxmLCExKTt9dGhpcy5yZWZyZXNoRGF0YUJvdW5kTGlua3MoKTtmb3IoYz10aGlzLnBhcnRzLml0ZXJhdG9yO2MubmV4dCgpOyl7Yy52YWx1ZS51cGRhdGVSZWxhdGlvbnNoaXBzRnJvbURhdGEoKTt9Zm9yKGM9dGhpcy5ub2Rlcy5pdGVyYXRvcjtjLm5leHQoKTspe2MudmFsdWUudXBkYXRlUmVsYXRpb25zaGlwc0Zyb21EYXRhKCk7fWZvcihjPXRoaXMubGlua3MuaXRlcmF0b3I7Yy5uZXh0KCk7KXtjLnZhbHVlLnVwZGF0ZVJlbGF0aW9uc2hpcHNGcm9tRGF0YSgpO319O3RpLnByb3RvdHlwZS5yZWZyZXNoRGF0YUJvdW5kTGlua3M9ZnVuY3Rpb24oKXt9O3RpLnByb3RvdHlwZS51cGRhdGVSZWxhdGlvbnNoaXBzRnJvbURhdGE9ZnVuY3Rpb24oKXt9O3RpLnByb3RvdHlwZS51cGRhdGVEYXRhQmluZGluZ3M9ZnVuY3Rpb24oYSxiKXtpZigic3RyaW5nIj09PXR5cGVvZiBiKXt2YXIgYz10aGlzLnZjKGEpO2lmKG51bGwhPT1jKWMuRWEoYik7ZWxzZXtjPW51bGw7Zm9yKHZhciBkPXRoaXMub2ouaXRlcmF0b3I7ZC5uZXh0KCk7KXtmb3IodmFyIGU9ZC52YWx1ZSxmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl0uaXgoYSk7bnVsbCE9PWcmJihudWxsPT09YyYmKGM9S2EoKSksYy5wdXNoKGcpKTt9aWYobnVsbCE9PWMpYnJlYWs7fWlmKG51bGwhPT1jKXtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKXtjW2RdLkVhKGIpO31PYShjKTt9fWE9PT10aGlzLmRpYWdyYW0ubW9kZWwubW9kZWxEYXRhJiZ0aGlzLnVwZGF0ZUFsbFRhcmdldEJpbmRpbmdzKGIpO319O2Z1bmN0aW9uIERqKGEsYil7dmFyIGM9Yi5laTtpZihFYShjKSl7dmFyIGQ9YS5vai5KKGMpO2lmKG51bGw9PT1kKWQ9W10sZC5wdXNoKGIpLGEub2ouYWRkKGMsZCk7ZWxzZXtmb3IoYT0wO2E8ZC5sZW5ndGg7YSsrKXtpZihkW2FdPT09YilyZXR1cm47fWQucHVzaChiKTt9fX1mdW5jdGlvbiBIaihhLGIpe3ZhciBjPWIuZWk7aWYoRWEoYykpe3ZhciBkPWEub2ouSihjKTtpZihudWxsIT09ZClmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7aWYoZFtlXT09PWIpe2Quc3BsaWNlKGUsMSk7MD09PWQubGVuZ3RoJiZhLm9qLnJlbW92ZShjKTticmVhazt9fX19dGkucHJvdG90eXBlLlhqPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1uZXcgTGIoKTtpZihFYShhKSlmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl7WnAodGhpcyxhW2VdLGIsZCxjKTt9ZWxzZSBmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7WnAodGhpcyxhLnZhbHVlLGIsZCxjKTt9aWYobnVsbCE9PWIpe2M9Yi5tb2RlbDthPWIudG9vbE1hbmFnZXIuZmluZFRvb2woIkRyYWdnaW5nIik7YT1udWxsIT09YT9hLmRyYWdPcHRpb25zLmRyYWdzTGluazpiLkxrLmRyYWdzTGluaztlPW5ldyBGKCk7Zm9yKHZhciBmPW5ldyBMYigpLGc9ZC5pdGVyYXRvcjtnLm5leHQoKTspe3ZhciBoPWcudmFsdWU7aWYoaCBpbnN0YW5jZW9mIFMpYXx8bnVsbCE9PWguZnJvbU5vZGUmJm51bGwhPT1oLnRvTm9kZXx8ZS5hZGQoaCk7ZWxzZSBpZihoIGluc3RhbmNlb2YgViYmbnVsbCE9PWguZGF0YSYmYy5mbSgpKXt2YXIgaz1oO2g9Zy5rZXk7dmFyIGw9aC5vZygpO251bGwhPT1sJiYobD1kLkoobCksbnVsbCE9PWw/KGMuSGUoay5kYXRhLGMucGEobC5kYXRhKSksaz1iLnVjKGsuZGF0YSksaD1oLkhpKCksbnVsbCE9PWgmJm51bGwhPT1rJiZmLmFkZChoLGspKTpjLkhlKGsuZGF0YSx2b2lkIDApKTt9fTA8ZS5jb3VudCYmYi5ydChlLCExKTtpZigwPGYuY291bnQpZm9yKGM9Zi5pdGVyYXRvcjtjLm5leHQoKTspe2QuYWRkKGMua2V5LGMudmFsdWUpO319aWYobnVsbCE9PWImJm51bGwhPT10aGlzLkMmJihiPWIubW9kZWwsYz1iLmFmdGVyQ29weUZ1bmN0aW9uLG51bGwhPT1jKSl7dmFyIG09bmV3IExiKCk7ZC5lYWNoKGZ1bmN0aW9uKGEpe251bGwhPT1hLmtleS5kYXRhJiZtLmFkZChhLmtleS5kYXRhLGEudmFsdWUuZGF0YSk7fSk7YyhtLGIsdGhpcy5DLm1vZGVsKTt9Zm9yKGI9ZC5pdGVyYXRvcjtiLm5leHQoKTspe2IudmFsdWUuRWEoKTt9cmV0dXJuIGQ7fTtmdW5jdGlvbiBacChhLGIsYyxkLGUpe2lmKG51bGw9PT1ifHxlJiYhYi5jYW5Db3B5KCkpcmV0dXJuIG51bGw7aWYoZC5jb250YWlucyhiKSlyZXR1cm4gZC5KKGIpO3ZhciBmPWEuY29weVBhcnREYXRhKGIsYyk7aWYoIShmIGluc3RhbmNlb2YgVCkpcmV0dXJuIG51bGw7Zi5pc1NlbGVjdGVkPSExO2YuaXNIaWdobGlnaHRlZD0hMTtkLmFkZChiLGYpO2lmKGIgaW5zdGFuY2VvZiBWKXtmb3IodmFyIGc9Yi5saW5rc0Nvbm5lY3RlZDtnLm5leHQoKTspe3ZhciBoPWcudmFsdWU7aWYoaC5mcm9tTm9kZT09PWIpe3ZhciBrPWQuSihoKTtudWxsIT09ayYmKGsuZnJvbU5vZGU9Zik7fWgudG9Ob2RlPT09YiYmKGg9ZC5KKGgpLG51bGwhPT1oJiYoaC50b05vZGU9ZikpO31pZihiIGluc3RhbmNlb2YgaWcmJmYgaW5zdGFuY2VvZiBpZylmb3IoYj1iLm1lbWJlclBhcnRzO2IubmV4dCgpOyl7Zz1acChhLGIudmFsdWUsYyxkLGUpLGcgaW5zdGFuY2VvZiBTfHxudWxsPT09Z3x8KGcuY29udGFpbmluZ0dyb3VwPWYpO319ZWxzZSBpZihiIGluc3RhbmNlb2YgUyYmZiBpbnN0YW5jZW9mIFMpZm9yKGc9Yi5mcm9tTm9kZSxudWxsIT09ZyYmKGc9ZC5KKGcpLG51bGwhPT1nJiYoZi5mcm9tTm9kZT1nKSksZz1iLnRvTm9kZSxudWxsIT09ZyYmKGc9ZC5KKGcpLG51bGwhPT1nJiYoZi50b05vZGU9ZykpLGI9Yi5sYWJlbE5vZGVzO2IubmV4dCgpOyl7Zz1acChhLGIudmFsdWUsYyxkLGUpLG51bGwhPT1nJiZnIGluc3RhbmNlb2YgViYmKGcubGFiZWxlZExpbms9Zik7fXJldHVybiBmO310aS5wcm90b3R5cGUuY29weVBhcnREYXRhPWZ1bmN0aW9uKGEsYil7dmFyIGM9bnVsbCxkPWEuZGF0YTtpZihudWxsIT09ZCYmbnVsbCE9PWIpe3ZhciBlPWIubW9kZWw7YSBpbnN0YW5jZW9mIFN8fChkPWUuY29weU5vZGVEYXRhKGQpLENhKGQpJiYoZS5oZihkKSxjPWIudmMoZCkpKTt9ZWxzZSBZZyhhKSxjPWEuY29weSgpLG51bGwhPT1jJiYoZT10aGlzLkMsbnVsbCE9PWI/Yi5hZGQoYyk6bnVsbCE9PWQmJm51bGwhPT1lJiZudWxsIT09ZS5jb21tYW5kSGFuZGxlciYmZS5jb21tYW5kSGFuZGxlci5jb3BpZXNDbGlwYm9hcmREYXRhJiYoYj1lLm1vZGVsLGU9bnVsbCxjIGluc3RhbmNlb2YgU3x8KGU9Yi5jb3B5Tm9kZURhdGEoZCkpLENhKGUpJiYoYy5kYXRhPWUpKSk7cmV0dXJuIGM7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aS5wcm90b3R5cGUse25vZGVzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ287fX0sbGlua3M6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5obzt9fSxwYXJ0czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkZhO319LGRpYWdyYW06e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5DO319LGFkZHNUb1RlbXBvcmFyeUxheWVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMueHE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMueHE9YTt9fX0pO3RpLnByb3RvdHlwZS51cGRhdGVBbGxSZWxhdGlvbnNoaXBzRnJvbURhdGE9dGkucHJvdG90eXBlLnRxO3RpLnByb3RvdHlwZS5maW5kTGlua3NCeUV4YW1wbGU9dGkucHJvdG90eXBlLlJzO3RpLnByb3RvdHlwZS5maW5kTm9kZXNCeUV4YW1wbGU9dGkucHJvdG90eXBlLlNzO3RpLnByb3RvdHlwZS5maW5kTGlua0ZvckRhdGE9dGkucHJvdG90eXBlLnVjO3RpLnByb3RvdHlwZS5maW5kTm9kZUZvckRhdGE9dGkucHJvdG90eXBlLkVpO3RpLnByb3RvdHlwZS5maW5kUGFydEZvckRhdGE9dGkucHJvdG90eXBlLnZjO3RpLnByb3RvdHlwZS5maW5kTm9kZUZvcktleT10aS5wcm90b3R5cGUuSGI7dGkucHJvdG90eXBlLnJlbW92ZU1vZGVsZWRQYXJ0PXRpLnByb3RvdHlwZS5tcTt0aS5wcm90b3R5cGUucmVtb3ZlTW9kZWxlZFBhcnRzPXRpLnByb3RvdHlwZS5xdDt0aS5wcm90b3R5cGUucmVidWlsZFBhcnRzPXRpLnByb3RvdHlwZS51ZDt2YXIgVHA9ITEsU3A9ITEsVXA9ITE7dGkuY2xhc3NOYW1lPSJQYXJ0TWFuYWdlciI7ZnVuY3Rpb24gJHAoYSl7dGkuYXBwbHkodGhpcyxhcmd1bWVudHMpO31vYSgkcCx0aSk7JHAucHJvdG90eXBlLmFkZEFsbE1vZGVsZWRQYXJ0cz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGlhZ3JhbS5tb2RlbDt0aGlzLmFkZE1vZGVsZWRQYXJ0cyhhLm5vZGVEYXRhQXJyYXkpO2FxKHRoaXMsYS5saW5rRGF0YUFycmF5KTt9OyRwLnByb3RvdHlwZS5hZGRNb2RlbGVkUGFydHM9ZnVuY3Rpb24oYSl7dGkucHJvdG90eXBlLmFkZE1vZGVsZWRQYXJ0cy5jYWxsKHRoaXMsYSwhMSk7Zm9yKGE9dGhpcy5saW5rcy5pdGVyYXRvcjthLm5leHQoKTspe3VvKGEudmFsdWUpO31mayh0aGlzLmRpYWdyYW0sITEpO307ZnVuY3Rpb24gYXEoYSxiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7YnEoYSxiKTt9KTtmayhhLmRpYWdyYW0sITEpO31mdW5jdGlvbiBicShhLGIpe2lmKHZvaWQgMCE9PWImJm51bGwhPT1iJiYhYS5kaWFncmFtLnVuZG9NYW5hZ2VyLmlzVW5kb2luZ1JlZG9pbmcmJiFhLkRnLmNvbnRhaW5zKGIpKXt2YXIgYz1hLmdldExpbmtDYXRlZ29yeUZvckRhdGEoYiksZD1hLmZpbmRMaW5rVGVtcGxhdGVGb3JDYXRlZ29yeShjKTtpZihudWxsIT09ZCl7WWcoZCk7dmFyIGU9ZC5jb3B5KCk7aWYobnVsbCE9PWUpe2Q9YS5kaWFncmFtLnNraXBzTW9kZWxTb3VyY2VCaW5kaW5nczthLmRpYWdyYW0uc2tpcHNNb2RlbFNvdXJjZUJpbmRpbmdzPSEwO2UueWY9YztlLmpiPWI7Yz1hLmRpYWdyYW0ubW9kZWw7dmFyIGY9Y3EoYyxiLCEwKTsiIiE9PWYmJihlLmZyb21Qb3J0SWQ9Zik7Zj1kcShjLGIsITApO3ZvaWQgMCE9PWYmJihmPWEuSGIoZiksZiBpbnN0YW5jZW9mIFYmJihlLmZyb21Ob2RlPWYpKTtmPWNxKGMsYiwhMSk7IiIhPT1mJiYoZS50b1BvcnRJZD1mKTtmPWRxKGMsYiwhMSk7dm9pZCAwIT09ZiYmKGY9YS5IYihmKSxmIGluc3RhbmNlb2YgViYmKGUudG9Ob2RlPWYpKTtjPWMucGcoYik7QXJyYXkuaXNBcnJheShjKSYmYy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2I9YS5IYihiKTtudWxsIT09YiYmKGIubGFiZWxlZExpbms9ZSk7fSk7YS54cSYmKGUuUmc9IlRvb2wiKTthLmRpYWdyYW0uYWRkKGUpO2UuamI9bnVsbDtlLmRhdGE9YjthLmRpYWdyYW0uc2tpcHNNb2RlbFNvdXJjZUJpbmRpbmdzPWQ7fX19fSRwLnByb3RvdHlwZS5yZW1vdmVBbGxNb2RlbGVkUGFydHM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRpYWdyYW0ubW9kZWw7ZXEodGhpcyxhLmxpbmtEYXRhQXJyYXkpO3RoaXMucXQoYS5ub2RlRGF0YUFycmF5KTt9O2Z1bmN0aW9uIGVxKGEsYil7Yi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2EubXEoYik7fSk7fSRwLnByb3RvdHlwZS5nZXRMaW5rQ2F0ZWdvcnlGb3JEYXRhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpYWdyYW0ubW9kZWwuYXYoYSk7fTskcC5wcm90b3R5cGUuc2V0TGlua0NhdGVnb3J5Rm9yRGF0YT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmRpYWdyYW0ubW9kZWwudHQoYSxiKTt9OyRwLnByb3RvdHlwZS5zZXRGcm9tTm9kZUZvckxpbms9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmRpYWdyYW0ubW9kZWw7Yy5HeChhLmRhdGEsYy5wYShudWxsIT09Yj9iLmRhdGE6bnVsbCkpO307JHAucHJvdG90eXBlLnNldFRvTm9kZUZvckxpbms9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmRpYWdyYW0ubW9kZWw7Yy5LeChhLmRhdGEsYy5wYShudWxsIT09Yj9iLmRhdGE6bnVsbCkpO307JHAucHJvdG90eXBlLnJlbW92ZURhdGFGb3JMaW5rPWZ1bmN0aW9uKGEpe3RoaXMuZGlhZ3JhbS5tb2RlbC5ubShhLmRhdGEpO307JHAucHJvdG90eXBlLmZpbmRQYXJ0Rm9yS2V5PWZ1bmN0aW9uKGEpe3ZhciBiPXRpLnByb3RvdHlwZS5maW5kUGFydEZvcktleS5jYWxsKHRoaXMsYSk7cmV0dXJuIG51bGw9PT1iJiYoYT10aGlzLmRpYWdyYW0ubW9kZWwud2goYSksbnVsbCE9PWEpP3RoaXMuRGcuSihhKTpiO307JHAucHJvdG90eXBlLmRvTW9kZWxDaGFuZ2VkPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGkucHJvdG90eXBlLmRvTW9kZWxDaGFuZ2VkLmNhbGwodGhpcyxhKTtpZih0aGlzLmRpYWdyYW0pe3ZhciBjPXRoaXMuZGlhZ3JhbTtpZihhLm1vZGVsPT09Yy5tb2RlbCl7dmFyIGQ9YS5jaGFuZ2U7aWYoYy5kYSl7Yy5kYT0hMTt0cnl7dmFyIGU9YS5tb2RlbENoYW5nZTtpZigiIiE9PWUpe2lmKGQ9PT1hZil7aWYoImxpbmtGcm9tS2V5Ij09PWUpe3ZhciBmPXRoaXMudWMoYS5vYmplY3QpO2lmKG51bGwhPT1mKXt2YXIgZz10aGlzLkhiKGEubmV3VmFsdWUpO2YuZnJvbU5vZGU9Zzt9fWVsc2UgaWYoImxpbmtUb0tleSI9PT1lKXt2YXIgaD10aGlzLnVjKGEub2JqZWN0KTtpZihudWxsIT09aCl7dmFyIGs9dGhpcy5IYihhLm5ld1ZhbHVlKTtoLnRvTm9kZT1rO319ZWxzZSBpZigibGlua0Zyb21Qb3J0SWQiPT09ZSl7dmFyIGw9dGhpcy51YyhhLm9iamVjdCk7aWYobnVsbCE9PWwpe3ZhciBtPWEubmV3VmFsdWU7InN0cmluZyI9PT10eXBlb2YgbSYmKGwuZnJvbVBvcnRJZD1tKTt9fWVsc2UgaWYoImxpbmtUb1BvcnRJZCI9PT1lKXt2YXIgbj10aGlzLnVjKGEub2JqZWN0KTtpZihudWxsIT09bil7dmFyIHA9YS5uZXdWYWx1ZTsic3RyaW5nIj09PXR5cGVvZiBwJiYobi50b1BvcnRJZD1wKTt9fWVsc2UgaWYoIm5vZGVHcm91cEtleSI9PT1lKXt2YXIgcT10aGlzLnZjKGEub2JqZWN0KTtpZihudWxsIT09cSl7dmFyIHI9YS5uZXdWYWx1ZTtpZih2b2lkIDAhPT1yKXt2YXIgdT10aGlzLkhiKHIpO3UgaW5zdGFuY2VvZiBpZz9xLmNvbnRhaW5pbmdHcm91cD11OnEuY29udGFpbmluZ0dyb3VwPW51bGw7fWVsc2UgcS5jb250YWluaW5nR3JvdXA9bnVsbDt9fWVsc2UgaWYoImxpbmtMYWJlbEtleXMiPT09ZSl7dmFyIHg9dGhpcy51YyhhLm9iamVjdCk7aWYobnVsbCE9PXgpe3ZhciB2PWEub2xkVmFsdWUseT1hLm5ld1ZhbHVlO0FycmF5LmlzQXJyYXkodikmJnYuZm9yRWFjaChmdW5jdGlvbihhKXthPWIuSGIoYSk7bnVsbCE9PWEmJihhLmxhYmVsZWRMaW5rPW51bGwpO30pO0FycmF5LmlzQXJyYXkoeSkmJnkuZm9yRWFjaChmdW5jdGlvbihhKXthPWIuSGIoYSk7bnVsbCE9PWEmJihhLmxhYmVsZWRMaW5rPXgpO30pO319ZWxzZSBpZigibGlua0NhdGVnb3J5Ij09PWUpe3ZhciB6PXRoaXMudWMoYS5vYmplY3QpLEI9YS5uZXdWYWx1ZTtudWxsIT09eiYmInN0cmluZyI9PT10eXBlb2YgQiYmKHouY2F0ZWdvcnk9Qik7fWVsc2UibGlua0RhdGFBcnJheSI9PT1lJiYoZXEodGhpcyxhLm9sZFZhbHVlKSxhcSh0aGlzLGEubmV3VmFsdWUpKTtjLmlzTW9kaWZpZWQ9ITA7fWVsc2UgaWYoZD09PWNmKXt2YXIgQz1hLm5ld1ZhbHVlO2lmKCJsaW5rRGF0YUFycmF5Ij09PWUmJiJvYmplY3QiPT09X3R5cGVvZihDKSYmbnVsbCE9PUMpYnEodGhpcyxDKTtlbHNlIGlmKCJsaW5rTGFiZWxLZXlzIj09PWUmJmZxKEMpKXt2YXIgST10aGlzLnVjKGEub2JqZWN0KSxKPXRoaXMuSGIoQyk7bnVsbCE9PUkmJm51bGwhPT1KJiYoSi5sYWJlbGVkTGluaz1JKTt9Yy5pc01vZGlmaWVkPSEwO31lbHNle2lmKGQ9PT1kZil7dmFyIEw9YS5vbGRWYWx1ZTtpZigibGlua0RhdGFBcnJheSI9PT1lJiYib2JqZWN0Ij09PV90eXBlb2YoTCkmJm51bGwhPT1MKXRoaXMubXEoTCk7ZWxzZSBpZigibGlua0xhYmVsS2V5cyI9PT1lJiZmcShMKSl7dmFyIFU9dGhpcy5IYihMKTtudWxsIT09VSYmKFUubGFiZWxlZExpbms9bnVsbCk7fWMuaXNNb2RpZmllZD0hMDt9fX1lbHNlIGlmKGQ9PT1hZil7dmFyIFE9YS5wcm9wZXJ0eU5hbWUsaWE9YS5vYmplY3Q7aWYoaWE9PT1jLm1vZGVsKXtpZigibGlua0Zyb21LZXlQcm9wZXJ0eSI9PT1RfHwibGlua1RvS2V5UHJvcGVydHkiPT09UXx8ImxpbmtGcm9tUG9ydElkUHJvcGVydHkiPT09UXx8ImxpbmtUb1BvcnRJZFByb3BlcnR5Ij09PVF8fCJsaW5rTGFiZWxLZXlzUHJvcGVydHkiPT09UXx8Im5vZGVJc0dyb3VwUHJvcGVydHkiPT09UXx8Im5vZGVHcm91cEtleVByb3BlcnR5Ij09PVF8fCJsaW5rQ2F0ZWdvcnlQcm9wZXJ0eSI9PT1RKWMudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8dGhpcy51ZCgpO31lbHNlIHRoaXMudXBkYXRlRGF0YUJpbmRpbmdzKGlhLFEpO2MuaXNNb2RpZmllZD0hMDt9fWZpbmFsbHl7Yy5kYT0hMDt9fX19fTskcC5wcm90b3R5cGUucmVmcmVzaERhdGFCb3VuZExpbmtzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPXRoaXMuZGlhZ3JhbS5tb2RlbCxjPW5ldyBGKCksZD1iLmxpbmtEYXRhQXJyYXk7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2MuYWRkKGEpO30pO3ZhciBlPVtdO3RoaXMubGlua3MuZWFjaChmdW5jdGlvbihhKXtudWxsPT09YS5kYXRhfHxjLmNvbnRhaW5zKGEuZGF0YSl8fGUucHVzaChhLmRhdGEpO30pO2UuZm9yRWFjaChmdW5jdGlvbihhKXtncShiLGEsITEpO30pO2QuZm9yRWFjaChmdW5jdGlvbihjKXtudWxsPT09YS51YyhjKSYmaHEoYixjLCExKTt9KTt9OyRwLnByb3RvdHlwZS51cGRhdGVSZWxhdGlvbnNoaXBzRnJvbURhdGE9ZnVuY3Rpb24oYSl7dmFyIGI9YS5kYXRhO2lmKG51bGwhPT1iKXt2YXIgYz1hLmRpYWdyYW07aWYobnVsbCE9PWMpe3ZhciBkPWMubW9kZWw7aWYoYSBpbnN0YW5jZW9mIFMpe3ZhciBlPWRxKGQsYiwhMCk7ZT1jLkhiKGUpO2EuZnJvbU5vZGU9ZTtlPWRxKGQsYiwhMSk7ZT1jLkhiKGUpO2EudG9Ob2RlPWU7Yj1kLnBnKGIpO2lmKDA8Yi5sZW5ndGh8fDA8YS5sYWJlbE5vZGVzLmNvdW50KXtpZigxPT09Yi5sZW5ndGgmJjE9PT1hLmxhYmVsTm9kZXMuY291bnQpe2U9YlswXTt2YXIgZj1hLmxhYmVsTm9kZXMuZmlyc3QoKTtpZihkLnBhKGYuZGF0YSk9PT1lKXJldHVybjt9ZT1uZXcgRigpLmFkZEFsbChiKTt2YXIgZz1uZXcgRigpO2EubGFiZWxOb2Rlcy5lYWNoKGZ1bmN0aW9uKGEpe251bGwhPT1hLmRhdGEmJihhPWQucGEoYS5kYXRhKSx2b2lkIDAhPT1hJiZnLmFkZChhKSk7fSk7Yj1nLmNvcHkoKTtiLmxxKGUpO2U9ZS5jb3B5KCk7ZS5scShnKTtpZigwPGIuY291bnR8fDA8ZS5jb3VudCliLmVhY2goZnVuY3Rpb24oYil7Yj1jLkhiKGIpO251bGwhPT1iJiZiLmxhYmVsZWRMaW5rPT09YSYmKGIubGFiZWxlZExpbms9bnVsbCk7fSksZS5lYWNoKGZ1bmN0aW9uKGIpe2I9Yy5IYihiKTtudWxsIT09YiYmYi5sYWJlbGVkTGluayE9PWEmJihiLmxhYmVsZWRMaW5rPWEpO30pO319ZWxzZSEoYSBpbnN0YW5jZW9mIHBmKSYmKGI9ZC5LaShiKSxiPWMuZmluZFBhcnRGb3JLZXkoYiksbnVsbD09PWJ8fGIgaW5zdGFuY2VvZiBpZykmJihhLmNvbnRhaW5pbmdHcm91cD1iKTt9fX07JHAucHJvdG90eXBlLnJlc29sdmVSZWZlcmVuY2VzRm9yRGF0YT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmRpYWdyYW0ubW9kZWwsYz1iLnBhKGEpO2lmKHZvaWQgMCE9PWMpe3ZhciBkPWlxKGIsYyksZT10aGlzLnZjKGEpO2lmKG51bGwhPT1kJiZudWxsIT09ZSl7ZD1kLml0ZXJhdG9yO2Zvcih2YXIgZj17fTtkLm5leHQoKTspe3ZhciBnPWQudmFsdWU7Yi5RYihnKT9lIGluc3RhbmNlb2YgaWcmJmIuS2koZyk9PT1jJiYoZz10aGlzLnZjKGcpLG51bGwhPT1nJiYoZy5jb250YWluaW5nR3JvdXA9ZSkpOihmLmxpbms9dGhpcy51YyhnKSxudWxsIT09Zi5saW5rJiZlIGluc3RhbmNlb2YgViYmKGRxKGIsZywhMCk9PT1jJiYoZi5saW5rLmZyb21Ob2RlPWUpLGRxKGIsZywhMSk9PT1jJiYoZi5saW5rLnRvTm9kZT1lKSxnPWIucGcoZyksQXJyYXkuaXNBcnJheShnKSYmZy5zb21lKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYj09PWM/KGUubGFiZWxlZExpbms9YS5saW5rLCEwKTohMTt9O30oZikpKSk7Zj17bGluazpmLmxpbmt9O31qcShiLGMpO31hPWIuS2koYSk7dm9pZCAwIT09YSYmKGE9dGhpcy5IYihhKSxhIGluc3RhbmNlb2YgaWcmJihlLmNvbnRhaW5pbmdHcm91cD1hKSk7fX07JHAucHJvdG90eXBlLnVucmVzb2x2ZVJlZmVyZW5jZXNGb3JQYXJ0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZGlhZ3JhbS5tb2RlbDtpZihhIGluc3RhbmNlb2YgVil7dmFyIGM9Yi5wYShhLmRhdGEpO2lmKHZvaWQgMCE9PWMpe2Zvcih2YXIgZD1hLmxpbmtzQ29ubmVjdGVkO2QubmV4dCgpOyl7a3EoYixjLGQudmFsdWUuZGF0YSk7fWEuaXNMaW5rTGFiZWwmJihkPWEubGFiZWxlZExpbmssbnVsbCE9PWQmJmtxKGIsYyxkLmRhdGEpKTtpZihhIGluc3RhbmNlb2YgaWcpZm9yKGE9YS5tZW1iZXJQYXJ0czthLm5leHQoKTspe2Q9YS52YWx1ZS5kYXRhLGIuUWIoZCkmJmtxKGIsYyxkKTt9fX19OyRwLnByb3RvdHlwZS5jb3B5UGFydERhdGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aS5wcm90b3R5cGUuY29weVBhcnREYXRhLmNhbGwodGhpcyxhLGIpO2lmKGEgaW5zdGFuY2VvZiBTKWlmKGE9YS5kYXRhLG51bGwhPT1hJiZudWxsIT09Yil7dmFyIGQ9Yi5tb2RlbDthPWQuT3AoYSk7Im9iamVjdCI9PT1fdHlwZW9mKGEpJiZudWxsIT09YSYmKGQuQWkoYSksYz1iLnVjKGEpKTt9ZWxzZSBudWxsIT09YyYmKGI9dGhpcy5kaWFncmFtLG51bGwhPT1hJiZudWxsIT09YiYmbnVsbCE9PWIuY29tbWFuZEhhbmRsZXImJmIuY29tbWFuZEhhbmRsZXIuY29waWVzQ2xpcGJvYXJkRGF0YSYmKGI9Yi5tb2RlbC5PcChhKSwib2JqZWN0Ij09PV90eXBlb2YoYikmJm51bGwhPT1iJiYoYy5kYXRhPWIpKSk7cmV0dXJuIGM7fTskcC5wcm90b3R5cGUuaW5zZXJ0TGluaz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLmRpYWdyYW0sZj1lLm1vZGVsLGc9ZS50b29sTWFuYWdlci5maW5kVG9vbCgiTGlua2luZyIpLGg9IiI7bnVsbCE9PWEmJihudWxsPT09YiYmKGI9YSksaD1iLnBvcnRJZCxudWxsPT09aCYmKGg9IiIpKTtiPSIiO251bGwhPT1jJiYobnVsbD09PWQmJihkPWMpLGI9ZC5wb3J0SWQsbnVsbD09PWImJihiPSIiKSk7ZD1nLmFyY2hldHlwZUxpbmtEYXRhO2lmKGQgaW5zdGFuY2VvZiBTKXtpZihZZyhkKSxmPWQuY29weSgpLG51bGwhPT1mKXJldHVybiBmLmZyb21Ob2RlPWEsZi5mcm9tUG9ydElkPWgsZi50b05vZGU9YyxmLnRvUG9ydElkPWIsZS5hZGQoZiksYT1nLmFyY2hldHlwZUxhYmVsTm9kZURhdGEsYSBpbnN0YW5jZW9mIFYmJihZZyhhKSxhPWEuY29weSgpLG51bGwhPT1hJiYoYS5sYWJlbGVkTGluaz1mLGUuYWRkKGEpKSksZjt9ZWxzZSBpZihudWxsIT09ZCYmKGQ9Zi5PcChkKSwib2JqZWN0Ij09PV90eXBlb2YoZCkmJm51bGwhPT1kKSlyZXR1cm4gbnVsbCE9PWEmJmxxKGYsZCxmLnBhKGEuZGF0YSksITApLG1xKGYsZCxoLCEwKSxudWxsIT09YyYmbHEoZixkLGYucGEoYy5kYXRhKSwhMSksbXEoZixkLGIsITEpLGYuQWkoZCksYT1nLmFyY2hldHlwZUxhYmVsTm9kZURhdGEsbnVsbD09PWF8fGEgaW5zdGFuY2VvZiBWfHwoYT1mLmNvcHlOb2RlRGF0YShhKSwib2JqZWN0Ij09PV90eXBlb2YoYSkmJm51bGwhPT1hJiYoZi5oZihhKSxhPWYucGEoYSksdm9pZCAwIT09YSYmZi5HdShkLGEpKSksZS51YyhkKTtyZXR1cm4gbnVsbDt9OyRwLnByb3RvdHlwZS5maW5kUGFydEZvcktleT0kcC5wcm90b3R5cGUuZmluZFBhcnRGb3JLZXk7JHAucHJvdG90eXBlLnJlbW92ZUFsbE1vZGVsZWRQYXJ0cz0kcC5wcm90b3R5cGUucmVtb3ZlQWxsTW9kZWxlZFBhcnRzOyRwLnByb3RvdHlwZS5hZGRNb2RlbGVkUGFydHM9JHAucHJvdG90eXBlLmFkZE1vZGVsZWRQYXJ0czskcC5wcm90b3R5cGUuYWRkQWxsTW9kZWxlZFBhcnRzPSRwLnByb3RvdHlwZS5hZGRBbGxNb2RlbGVkUGFydHM7JHAuY2xhc3NOYW1lPSJHcmFwaExpbmtzUGFydE1hbmFnZXIiO2Z1bmN0aW9uIG5xKCl7dGkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuYWg9bnVsbDt9b2EobnEsdGkpO2Z1bmN0aW9uIG9xKGEsYixjKXtpZihudWxsIT09YiYmbnVsbCE9PWMpe3ZhciBkPWEuZGlhZ3JhbS50b29sTWFuYWdlci5maW5kVG9vbCgiTGlua2luZyIpLGU9YixmPWM7aWYoYS5kaWFncmFtLmlzVHJlZVBhdGhUb0NoaWxkcmVuKWZvcihiPWYubGlua3NDb25uZWN0ZWQ7Yi5uZXh0KCk7KXtpZihiLnZhbHVlLnRvTm9kZT09PWYpcmV0dXJuO31lbHNlIGZvcihlPWMsZj1iLGI9ZS5saW5rc0Nvbm5lY3RlZDtiLm5leHQoKTspe2lmKGIudmFsdWUuZnJvbU5vZGU9PT1lKXJldHVybjt9aWYobnVsbD09PWR8fCF2ZyhkLGUsZixudWxsLCEwKSlpZihkPWEuZ2V0TGlua0NhdGVnb3J5Rm9yRGF0YShjLmRhdGEpLGI9YS5maW5kTGlua1RlbXBsYXRlRm9yQ2F0ZWdvcnkoZCksbnVsbCE9PWImJihZZyhiKSxiPWIuY29weSgpLG51bGwhPT1iKSl7dmFyIGc9YS5kaWFncmFtLnNraXBzTW9kZWxTb3VyY2VCaW5kaW5nczthLmRpYWdyYW0uc2tpcHNNb2RlbFNvdXJjZUJpbmRpbmdzPSEwO2IueWY9ZDtiLmpiPWMuZGF0YTtiLmZyb21Ob2RlPWU7Yi50b05vZGU9ZjthLmRpYWdyYW0uYWRkKGIpO2IuamI9bnVsbDtiLmRhdGE9Yy5kYXRhO2EuZGlhZ3JhbS5za2lwc01vZGVsU291cmNlQmluZGluZ3M9Zzt9fX1ucS5wcm90b3R5cGUuZ2V0TGlua0NhdGVnb3J5Rm9yRGF0YT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kaWFncmFtLm1vZGVsLmJ2KGEpO307bnEucHJvdG90eXBlLnNldExpbmtDYXRlZ29yeUZvckRhdGE9ZnVuY3Rpb24oYSxiKXt0aGlzLmRpYWdyYW0ubW9kZWwuSXYoYSxiKTt9O25xLnByb3RvdHlwZS5zZXRGcm9tTm9kZUZvckxpbms9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZGlhZ3JhbS5tb2RlbDt2b2lkIDA9PT1jJiYoYz1udWxsKTtiPW51bGwhPT1iP2IuZGF0YTpudWxsO2lmKHRoaXMuZGlhZ3JhbS5pc1RyZWVQYXRoVG9DaGlsZHJlbilkLkhlKGEuZGF0YSxkLnBhKGIpKTtlbHNle3ZhciBlPXRoaXMuYWg7dGhpcy5haD1hO251bGwhPT1jJiZkLkhlKGMuZGF0YSx2b2lkIDApO2QuSGUoYixkLnBhKG51bGwhPT1hLnRvTm9kZT9hLnRvTm9kZS5kYXRhOm51bGwpKTt0aGlzLmFoPWU7fX07bnEucHJvdG90eXBlLnNldFRvTm9kZUZvckxpbms9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZGlhZ3JhbS5tb2RlbDt2b2lkIDA9PT1jJiYoYz1udWxsKTtiPW51bGwhPT1iP2IuZGF0YTpudWxsO2lmKHRoaXMuZGlhZ3JhbS5pc1RyZWVQYXRoVG9DaGlsZHJlbil7dmFyIGU9dGhpcy5haDt0aGlzLmFoPWE7bnVsbCE9PWMmJmQuSGUoYy5kYXRhLHZvaWQgMCk7ZC5IZShiLGQucGEobnVsbCE9PWEuZnJvbU5vZGU/YS5mcm9tTm9kZS5kYXRhOm51bGwpKTt0aGlzLmFoPWU7fWVsc2UgZC5IZShhLmRhdGEsZC5wYShiKSk7fTtucS5wcm90b3R5cGUucmVtb3ZlRGF0YUZvckxpbms9ZnVuY3Rpb24oYSl7dGhpcy5kaWFncmFtLm1vZGVsLkhlKGEuZGF0YSx2b2lkIDApO307bnEucHJvdG90eXBlLmRvTW9kZWxDaGFuZ2VkPWZ1bmN0aW9uKGEpe3RpLnByb3RvdHlwZS5kb01vZGVsQ2hhbmdlZC5jYWxsKHRoaXMsYSk7aWYodGhpcy5kaWFncmFtKXt2YXIgYj10aGlzLmRpYWdyYW07aWYoYS5tb2RlbD09PWIubW9kZWwpe3ZhciBjPWEuY2hhbmdlO2lmKGIuZGEpe2IuZGE9ITE7dHJ5e3ZhciBkPWEubW9kZWxDaGFuZ2U7aWYoIiIhPT1kKXtpZihjPT09YWYpe2lmKCJub2RlUGFyZW50S2V5Ij09PWQpe3ZhciBlPWEub2JqZWN0LGY9dGhpcy5IYihhLm5ld1ZhbHVlKSxnPXRoaXMuRWkoZSk7aWYobnVsbCE9PXRoaXMuYWgpbnVsbCE9PWYmJih0aGlzLmFoLmRhdGE9ZSx0aGlzLmFoLmNhdGVnb3J5PXRoaXMuZ2V0TGlua0NhdGVnb3J5Rm9yRGF0YShlKSk7ZWxzZSBpZihudWxsIT09Zyl7dmFyIGg9Zy5IaSgpO251bGwhPT1oP251bGw9PT1mP2IucmVtb3ZlKGgpOmIuaXNUcmVlUGF0aFRvQ2hpbGRyZW4/aC5mcm9tTm9kZT1mOmgudG9Ob2RlPWY6b3EodGhpcyxmLGcpO319ZWxzZSBpZigicGFyZW50TGlua0NhdGVnb3J5Ij09PWQpe3ZhciBrPXRoaXMuRWkoYS5vYmplY3QpLGw9YS5uZXdWYWx1ZTtpZihudWxsIT09ayYmInN0cmluZyI9PT10eXBlb2YgbCl7dmFyIG09ay5IaSgpO251bGwhPT1tJiYobS5jYXRlZ29yeT1sKTt9fWIuaXNNb2RpZmllZD0hMDt9fWVsc2UgaWYoYz09PWFmKXt2YXIgbj1hLnByb3BlcnR5TmFtZSxwPWEub2JqZWN0O3A9PT1iLm1vZGVsPyJub2RlUGFyZW50S2V5UHJvcGVydHkiPT09biYmKGIudW5kb01hbmFnZXIuaXNVbmRvaW5nUmVkb2luZ3x8dGhpcy51ZCgpKTp0aGlzLnVwZGF0ZURhdGFCaW5kaW5ncyhwLG4pO2IuaXNNb2RpZmllZD0hMDt9fWZpbmFsbHl7Yi5kYT0hMDt9fX19fTtucS5wcm90b3R5cGUudXBkYXRlUmVsYXRpb25zaGlwc0Zyb21EYXRhPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZGF0YTtpZihudWxsIT09Yil7dmFyIGM9YS5kaWFncmFtO2lmKG51bGwhPT1jKXt2YXIgZD1jLm1vZGVsO2EgaW5zdGFuY2VvZiBWJiYoYj1kLk1pKGIpLGI9Yy5IYihiKSxkPWEub2coKSxiIT09ZCYmKGQ9YS5IaSgpLG51bGwhPT1iP251bGwhPT1kP2MuaXNUcmVlUGF0aFRvQ2hpbGRyZW4/ZC5mcm9tTm9kZT1iOmQudG9Ob2RlPWI6b3EodGhpcyxiLGEpOm51bGwhPT1kJiZJaihjLGQsITEpKSk7fX19O25xLnByb3RvdHlwZS51cGRhdGVEYXRhQmluZGluZ3M9ZnVuY3Rpb24oYSxiKXt0aS5wcm90b3R5cGUudXBkYXRlRGF0YUJpbmRpbmdzLmNhbGwodGhpcyxhLGIpOyJzdHJpbmciPT09dHlwZW9mIGImJm51bGwhPT10aGlzLnZjKGEpJiYoYT10aGlzLnVjKGEpLG51bGwhPT1hJiZhLkVhKGIpKTt9O25xLnByb3RvdHlwZS5yZXNvbHZlUmVmZXJlbmNlc0ZvckRhdGE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kaWFncmFtLm1vZGVsLGM9Yi5wYShhKTtpZih2b2lkIDAhPT1jKXt2YXIgZD1pcShiLGMpLGU9dGhpcy52YyhhKTtpZihudWxsIT09ZCYmbnVsbCE9PWUpe2ZvcihkPWQuaXRlcmF0b3I7ZC5uZXh0KCk7KXt2YXIgZj1kLnZhbHVlO2IuUWIoZikmJmUgaW5zdGFuY2VvZiBWJiZiLk1pKGYpPT09YyYmb3EodGhpcyxlLHRoaXMuRWkoZikpO31qcShiLGMpO31hPWIuTWkoYSk7dm9pZCAwIT09YSYmZSBpbnN0YW5jZW9mIFYmJihhPXRoaXMuSGIoYSksb3EodGhpcyxhLGUpKTt9fTtucS5wcm90b3R5cGUudW5yZXNvbHZlUmVmZXJlbmNlc0ZvclBhcnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5kaWFncmFtLm1vZGVsO2lmKGEgaW5zdGFuY2VvZiBWKXt2YXIgYz1iLnBhKGEuZGF0YSksZD10aGlzLnVjKGEuZGF0YSk7aWYobnVsbCE9PWQpe2QuaXNTZWxlY3RlZD0hMTtkLmlzSGlnaGxpZ2h0ZWQ9ITE7dmFyIGU9ZC5sYXllcjtpZihudWxsIT09ZSl7dmFyIGY9ZS54YygtMSxkLCExKTswPD1mJiZ0aGlzLmRpYWdyYW0uYWIoZGYsInBhcnRzIixlLGQsbnVsbCxmLG51bGwpO2Y9ZC5sYXllckNoYW5nZWQ7bnVsbCE9PWYmJmYoZCxlLG51bGwpO319ZD10aGlzLmRpYWdyYW0uaXNUcmVlUGF0aFRvQ2hpbGRyZW47Zm9yKGE9YS5saW5rc0Nvbm5lY3RlZDthLm5leHQoKTspe2U9YS52YWx1ZSxlPShkP2UudG9Ob2RlOmUuZnJvbU5vZGUpLmRhdGEsYi5RYihlKSYma3EoYixjLGUpO319fTtucS5wcm90b3R5cGUuaW5zZXJ0TGluaz1mdW5jdGlvbihhLGIsYyl7Yj10aGlzLmRpYWdyYW0ubW9kZWw7dmFyIGQ9YSxlPWM7dGhpcy5kaWFncmFtLmlzVHJlZVBhdGhUb0NoaWxkcmVufHwoZD1jLGU9YSk7cmV0dXJuIG51bGwhPT1kJiZudWxsIT09ZT8oYi5IZShlLmRhdGEsYi5wYShkLmRhdGEpKSxlLkhpKCkpOm51bGw7fTtucS5jbGFzc05hbWU9IlRyZWVQYXJ0TWFuYWdlciI7ZnVuY3Rpb24gWihhKXt0aGlzLkV0PScsXG4gICJpbnNlcnRlZE5vZGVLZXlzIjogJzt0aGlzLmd3PScsXG4gICJtb2RpZmllZE5vZGVEYXRhIjogJzt0aGlzLkd0PScsXG4gICJyZW1vdmVkTm9kZUtleXMiOiAnO21iKHRoaXMpO3RoaXMubW49dGhpcy5VYT0iIjt0aGlzLkxmPSExO3RoaXMubD17fTt0aGlzLkZjPVtdO3RoaXMuY2I9bmV3IExiKCk7dGhpcy5saT0ia2V5Ijt0aGlzLklrPXRoaXMub2w9bnVsbDt0aGlzLmJuPXRoaXMuY249ITE7dGhpcy5lbj0hMDt0aGlzLk1tPW51bGw7dGhpcy53aj0iY2F0ZWdvcnkiO3RoaXMuRWY9bmV3IExiKCk7dGhpcy5mdT1uZXcgRSgpO3RoaXMuZWg9ITE7dGhpcy51PW51bGw7dGhpcy51bmRvTWFuYWdlcj1uZXcgZmYoKTt2b2lkIDAhPT1hJiYodGhpcy5ub2RlRGF0YUFycmF5PWEpO31aLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZD1mdW5jdGlvbihhKXthLlVhPXRoaXMuVWE7YS5tbj10aGlzLm1uO2EuTGY9dGhpcy5MZjthLmxpPXRoaXMubGk7YS5vbD10aGlzLm9sO2EuSWs9dGhpcy5JazthLmNuPXRoaXMuY247YS5ibj10aGlzLmJuO2EuZW49dGhpcy5lbjthLk1tPXRoaXMuTW07YS53aj10aGlzLndqO307Wi5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3ZhciBhPW5ldyB0aGlzLmNvbnN0cnVjdG9yKCk7dGhpcy5jbG9uZVByb3RlY3RlZChhKTtyZXR1cm4gYTt9O3Q9Wi5wcm90b3R5cGU7dC5jbGVhcj1mdW5jdGlvbigpe3RoaXMuRmM9W107dGhpcy5jYi5jbGVhcigpO3RoaXMuRWYuY2xlYXIoKTt0aGlzLnVuZG9NYW5hZ2VyLmNsZWFyKCk7fTt0LnRvU3RyaW5nPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPTApO2lmKDE8YSlyZXR1cm4gdGhpcy5ycSgpO3ZhciBiPSgiIiE9PXRoaXMubmFtZT90aGlzLm5hbWU6IiIpKyIgTW9kZWwiO2lmKDA8YSl7Yis9IlxuIG5vZGUgZGF0YToiO2E9dGhpcy5ub2RlRGF0YUFycmF5O2Zvcih2YXIgYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7dmFyIGU9YVtkXTtiKz0iICIrdGhpcy5wYShlKSsiOiIrUWEoZSk7fX1yZXR1cm4gYjt9O3Quc2s9ZnVuY3Rpb24oKXt2YXIgYT0iIjsiIiE9PXRoaXMubmFtZSYmKGErPScsXG4gICJuYW1lIjogJyt0aGlzLnF1b3RlKHRoaXMubmFtZSkpOyIiIT09dGhpcy5kYXRhRm9ybWF0JiYoYSs9JyxcbiAgImRhdGFGb3JtYXQiOiAnK3RoaXMucXVvdGUodGhpcy5kYXRhRm9ybWF0KSk7dGhpcy5pc1JlYWRPbmx5JiYoYSs9JyxcbiAgImlzUmVhZE9ubHkiOiAnK3RoaXMuaXNSZWFkT25seSk7ImtleSIhPT10aGlzLm5vZGVLZXlQcm9wZXJ0eSYmInN0cmluZyI9PT10eXBlb2YgdGhpcy5ub2RlS2V5UHJvcGVydHkmJihhKz0nLFxuICAibm9kZUtleVByb3BlcnR5IjogJyt0aGlzLnF1b3RlKHRoaXMubm9kZUtleVByb3BlcnR5KSk7dGhpcy5jb3BpZXNBcnJheXMmJihhKz0nLFxuICAiY29waWVzQXJyYXlzIjogdHJ1ZScpO3RoaXMuY29waWVzQXJyYXlPYmplY3RzJiYoYSs9JyxcbiAgImNvcGllc0FycmF5T2JqZWN0cyI6IHRydWUnKTt0aGlzLmNvcGllc0tleXx8KGErPScsXG4gICJjb3BpZXNLZXkiOiBmYWxzZScpOyJjYXRlZ29yeSIhPT10aGlzLm5vZGVDYXRlZ29yeVByb3BlcnR5JiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLm5vZGVDYXRlZ29yeVByb3BlcnR5JiYoYSs9JyxcbiAgIm5vZGVDYXRlZ29yeVByb3BlcnR5IjogJyt0aGlzLnF1b3RlKHRoaXMubm9kZUNhdGVnb3J5UHJvcGVydHkpKTtyZXR1cm4gYTt9O3Qua3E9ZnVuY3Rpb24oYSl7YS5uYW1lJiYodGhpcy5uYW1lPWEubmFtZSk7YS5kYXRhRm9ybWF0JiYodGhpcy5kYXRhRm9ybWF0PWEuZGF0YUZvcm1hdCk7YS5pc1JlYWRPbmx5JiYodGhpcy5pc1JlYWRPbmx5PSEwKTthLm5vZGVLZXlQcm9wZXJ0eSYmKHRoaXMubm9kZUtleVByb3BlcnR5PWEubm9kZUtleVByb3BlcnR5KTthLmNvcGllc0FycmF5cyYmKHRoaXMuY29waWVzQXJyYXlzPSEwKTthLmNvcGllc0FycmF5T2JqZWN0cyYmKHRoaXMuY29waWVzQXJyYXlPYmplY3RzPSEwKTshMT09PWEuY29waWVzS2V5JiYodGhpcy5jb3BpZXNLZXk9ITEpO2Eubm9kZUNhdGVnb3J5UHJvcGVydHkmJih0aGlzLm5vZGVDYXRlZ29yeVByb3BlcnR5PWEubm9kZUNhdGVnb3J5UHJvcGVydHkpO307ZnVuY3Rpb24gcHEoYSl7cmV0dXJuJyxcbiAgIm1vZGVsRGF0YSI6ICcrcXEoYSxhLm1vZGVsRGF0YSk7fWZ1bmN0aW9uIHJxKGEsYil7Yj1iLm1vZGVsRGF0YTtDYShiKSYmKGEucG0oYiksYS5tb2RlbERhdGE9Yik7fXQuJHY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm1vZGVsRGF0YSxiPSExLGM7Zm9yKGMgaW4gYSl7aWYoIXNxKGMsYVtjXSkpe2I9ITA7YnJlYWs7fX1hPSIiO2ImJihhPXBxKHRoaXMpKTtyZXR1cm4gYSsnLFxuICAibm9kZURhdGFBcnJheSI6ICcrdHEodGhpcyx0aGlzLm5vZGVEYXRhQXJyYXksITApO307dC53dj1mdW5jdGlvbihhKXtycSh0aGlzLGEpO2E9YS5ub2RlRGF0YUFycmF5O0VhKGEpJiYodGhpcy5wbShhKSx0aGlzLm5vZGVEYXRhQXJyYXk9YSk7fTtmdW5jdGlvbiB1cShhLGIsYyxkKXtpZihiPT09YylyZXR1cm4hMDtpZihfdHlwZW9mKGIpIT09X3R5cGVvZihjKXx8ImZ1bmN0aW9uIj09PXR5cGVvZiBifHwiZnVuY3Rpb24iPT09dHlwZW9mIGMpcmV0dXJuITE7aWYoQXJyYXkuaXNBcnJheShiKSYmQXJyYXkuaXNBcnJheShjKSl7aWYoZC5KKGIpPT09YylyZXR1cm4hMDtkLmFkZChiLGMpO2lmKGIubGVuZ3RoIT09Yy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspe2lmKCF1cShhLGJbZV0sY1tlXSxkKSlyZXR1cm4hMTt9cmV0dXJuITA7fWlmKENhKGIpJiZDYShjKSl7aWYoZC5KKGIpPT09YylyZXR1cm4hMDtkLmFkZChiLGMpO2Zvcih2YXIgZiBpbiBiKXt2YXIgZz1iW2ZdO2lmKCFzcShmLGcpKXt2YXIgaD1jW2ZdO2lmKHZvaWQgMD09PWh8fCF1cShhLGcsaCxkKSlyZXR1cm4hMTt9fWZvcihlIGluIGMpe2lmKGY9Y1tlXSwhc3EoZSxmKSYmKGc9YltlXSx2b2lkIDA9PT1nfHwhdXEoYSxnLGYsZCkpKXJldHVybiExO31yZXR1cm4hMDt9cmV0dXJuITE7fWZ1bmN0aW9uIHZxKGEsYixjKXthW2NdIT09YltjXSYmQSgiTW9kZWwuY29tcHV0ZUpzb25EaWZmZXJlbmNlOiBNb2RlbC4iK2MrJyBpcyBub3QgdGhlIHNhbWUgaW4gYm90aCBtb2RlbHM6ICInK2FbY10rJyIgYW5kICInK2JbY10rJyInKTt9dC52cT1mdW5jdGlvbihhKXt2cSh0aGlzLGEsIm5vZGVLZXlQcm9wZXJ0eSIpO2Zvcih2YXIgYj1uZXcgRigpLGM9bmV3IEYoKSxkPW5ldyBGKCkuYWRkQWxsKHRoaXMuY2IuaXRlcmF0b3JLZXlzKSxlPW5ldyBMYigpLGY9YS5ub2RlRGF0YUFycmF5LGc9Zi5sZW5ndGgsaD0wO2g8ZztoKyspe3ZhciBrPWZbaF0sbD1hLnBhKGspO2lmKHZvaWQgMCE9PWwpe2QucmVtb3ZlKGwpO3ZhciBtPXRoaXMuUmIobCk7bnVsbD09PW0/KGIuYWRkKGwpLGMuYWRkKGspKTp1cSh0aGlzLG0sayxlKXx8Yy5hZGQoayk7fWVsc2UgdGhpcy5odChrKSxsPXRoaXMucGEoayksYi5hZGQobCksYy5hZGQoayk7fWY9IiI7dXEodGhpcyx0aGlzLm1vZGVsRGF0YSxhLm1vZGVsRGF0YSxlKXx8KGYrPXBxKHRoaXMpKTswPGIuY291bnQmJihmKz10aGlzLkV0K3RxKHRoaXMsYi5OYSgpLCEwKSk7MDxjLmNvdW50JiYoZis9dGhpcy5ndyt0cSh0aGlzLGMuTmEoKSwhMCkpOzA8ZC5jb3VudCYmKGYrPXRoaXMuR3QrdHEodGhpcyxkLk5hKCksITApKTtyZXR1cm4gZjt9O3QudXk9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj13cSh0aGlzLHRoaXMpKTtyZXR1cm4neyAiY2xhc3MiOiAnK3RoaXMucXVvdGUoYikrJywgImluY3JlbWVudGFsIjogMScrdGhpcy5zaygpK3RoaXMudnEoYSkrIn0iO307dC56dD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD0hMSxlPW5ldyBGKCksZj1uZXcgRigpLGc9bmV3IEYoKTthLmNoYW5nZXMuZWFjaChmdW5jdGlvbihhKXthLm1vZGVsPT09YyYmKCJub2RlRGF0YUFycmF5Ij09PWEubW9kZWxDaGFuZ2U/YS5jaGFuZ2U9PT1jZj9lLmFkZChhLm5ld1ZhbHVlKTphLmNoYW5nZT09PWRmJiZnLmFkZChhLm9sZFZhbHVlKTpjLlFiKGEub2JqZWN0KT9mLmFkZChhLm9iamVjdCk6Yy5tb2RlbERhdGE9PT1hLm9iamVjdCYmYS5jaGFuZ2U9PT1hZiYmKGQ9ITApKTt9KTt2YXIgaD1uZXcgRigpO2UuZWFjaChmdW5jdGlvbihhKXtoLmFkZChjLnBhKGEpKTtifHxmLmFkZChhKTt9KTt2YXIgaz1uZXcgRigpO2cuZWFjaChmdW5jdGlvbihhKXtrLmFkZChjLnBhKGEpKTtiJiZmLmFkZChhKTt9KTthPSIiO2QmJihhKz1wcSh0aGlzKSk7MDxoLmNvdW50JiYoYSs9KGI/dGhpcy5HdDp0aGlzLkV0KSt0cSh0aGlzLGguTmEoKSwhMCkpOzA8Zi5jb3VudCYmKGErPXRoaXMuZ3crdHEodGhpcyxmLk5hKCksITApKTswPGsuY291bnQmJihhKz0oYj90aGlzLkV0OnRoaXMuR3QpK3RxKHRoaXMsay5OYSgpLCEwKSk7cmV0dXJuIGE7fTt0LnZ2PWZ1bmN0aW9uKGEpe3JxKHRoaXMsYSk7dmFyIGI9YS5pbnNlcnRlZE5vZGVLZXlzLGM9YS5tb2RpZmllZE5vZGVEYXRhLGQ9bmV3IExiKCk7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXSxnPXRoaXMucGEoZik7dm9pZCAwIT09ZyYmbnVsbCE9PWcmJmQuc2V0KGcsZik7fWlmKEFycmF5LmlzQXJyYXkoYikpZm9yKGU9Yi5sZW5ndGgsZj0wO2Y8ZTtmKyspe2c9YltmXTt2YXIgaD10aGlzLlJiKGcpO251bGw9PT1oJiYoaD0oaD1kLmdldChnKSk/aDp0aGlzLmNvcHlOb2RlRGF0YSh7fSksdGhpcy52bShoLGcpLHRoaXMuaGYoaCkpO31pZihBcnJheS5pc0FycmF5KGMpKWZvcihiPWMubGVuZ3RoLGQ9MDtkPGI7ZCsrKXtpZihlPWNbZF0sZj10aGlzLnBhKGUpLGY9dGhpcy5SYihmKSxudWxsIT09Zilmb3IodmFyIGsgaW4gZSl7Il9fZ29oYXNoaWQiPT09a3x8az09PXRoaXMubm9kZUtleVByb3BlcnR5fHx0aGlzLmNrKCkmJms9PT10aGlzLm5vZGVJc0dyb3VwUHJvcGVydHl8fHRoaXMuc2V0RGF0YVByb3BlcnR5KGYsayxlW2tdKTt9fWE9YS5yZW1vdmVkTm9kZUtleXM7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IoYz1hLmxlbmd0aCxrPTA7azxjO2srKyl7Yj10aGlzLlJiKGFba10pLG51bGwhPT1iJiZ0aGlzLm9tKGIpO319O3QuT3g9ZnVuY3Rpb24oYSxiKXthLmNoYW5nZSE9PWJmJiZBKCJNb2RlbC50b0luY3JlbWVudGFsSnNvbiBhcmd1bWVudCBpcyBub3QgYSBUcmFuc2FjdGlvbiBDaGFuZ2VkRXZlbnQ6IithLnRvU3RyaW5nKCkpO3ZhciBjPWEub2JqZWN0O2lmKCEoYS5pc1RyYW5zYWN0aW9uRmluaXNoZWQmJmMgaW5zdGFuY2VvZiBlZikpcmV0dXJuJ3sgImluY3JlbWVudGFsIjogMCB9Jzt2b2lkIDA9PT1iJiYoYj13cSh0aGlzLHRoaXMpKTtyZXR1cm4iMiI9PT1iPyd7ICJpbmNyZW1lbnRhbCI6IDInK3RoaXMuenQoYywiRmluaXNoZWRVbmRvIj09PWEucHJvcGVydHlOYW1lKSsifSI6J3sgImNsYXNzIjogJyt0aGlzLnF1b3RlKGIpKycsICJpbmNyZW1lbnRhbCI6IDEnK3RoaXMuc2soKSt0aGlzLnp0KGMsIkZpbmlzaGVkVW5kbyI9PT1hLnByb3BlcnR5TmFtZSkrIn0iO307dC5Yej1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLk94KGEsYik7fTt0LnJxPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPXdxKHRoaXMsdGhpcykpO3JldHVybid7ICJjbGFzcyI6ICcrdGhpcy5xdW90ZShhKSt0aGlzLnNrKCkrdGhpcy4kdigpKyJ9Ijt9O3QudG9KU09OPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJxKGEpO307dC5Vdz1mdW5jdGlvbihhKXt2YXIgYj1udWxsO2lmKCJzdHJpbmciPT09dHlwZW9mIGEpdHJ5e2I9dy5KU09OLnBhcnNlKGEpO31jYXRjaChkKXt9ZWxzZSJvYmplY3QiPT09X3R5cGVvZihhKT9iPWE6QSgiVW5hYmxlIHRvIG1vZGlmeSBhIE1vZGVsIGZyb206ICIrYSk7dmFyIGM9Yi5pbmNyZW1lbnRhbDsibnVtYmVyIiE9PXR5cGVvZiBjJiZBKCJVbmFibGUgdG8gYXBwbHkgbm9uLWluY3JlbWVudGFsIGNoYW5nZXMgdG8gTW9kZWw6ICIrYSk7MCE9PWMmJih0aGlzLkFhKCJhcHBseUluY3JlbWVudGFsSnNvbiIpLHRoaXMudnYoYiksdGhpcy5aYSgiYXBwbHlJbmNyZW1lbnRhbEpzb24iKSk7fTt0Lm55PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlV3KGEpO307Wi5jb25zdHJ1Y3RHcmFwaExpbmtzTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFooKTt9O3Q9Wi5wcm90b3R5cGU7dC5wbT1mdW5jdGlvbihhKXtpZihFYShhKSlmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe3ZhciBkPWFbY107aWYoQ2EoZCkpe3ZhciBlPWM7ZD10aGlzLnBtKGQpO0FycmF5LmlzQXJyYXkoYSk/YVtlXT1kOkEoIkNhbm5vdCByZXBsYWNlIGFuIG9iamVjdCBpbiBhbiBIVE1MQ29sbGVjdGlvbiBvciBOb2RlTGlzdCBhdCAiK2UpO319ZWxzZSBpZihDYShhKSl7Zm9yKGMgaW4gYSl7aWYoZT1hW2NdLENhKGUpJiYoZT10aGlzLnBtKGUpLGFbY109ZSwicG9pbnRzIj09PWMmJkFycmF5LmlzQXJyYXkoZSkpKXtkPTA9PT1lLmxlbmd0aCUyO2Zvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKXtpZigibnVtYmVyIiE9PXR5cGVvZiBlW2ZdKXtkPSExO2JyZWFrO319aWYoZCl7ZD1uZXcgRSgpO2ZvcihmPTA7ZjxlLmxlbmd0aC8yO2YrKyl7ZC5hZGQobmV3IEcoZVsyKmZdLGVbMipmKzFdKSk7fWQuZnJlZXplKCk7YVtjXT1kO319fWlmKCJvYmplY3QiPT09X3R5cGVvZihhKSl7Yz1hO2U9YVsiY2xhc3MiXTtpZigiTmFOIj09PWUpYz1OYU47ZWxzZSBpZigiRGF0ZSI9PT1lKWM9bmV3IERhdGUoYS52YWx1ZSk7ZWxzZSBpZigiZ28uUG9pbnQiPT09ZSljPW5ldyBHKHhxKGEueCkseHEoYS55KSk7ZWxzZSBpZigiZ28uU2l6ZSI9PT1lKWM9bmV3IEsoeHEoYS53aWR0aCkseHEoYS5oZWlnaHQpKTtlbHNlIGlmKCJnby5SZWN0Ij09PWUpYz1uZXcgTih4cShhLngpLHhxKGEueSkseHEoYS53aWR0aCkseHEoYS5oZWlnaHQpKTtlbHNlIGlmKCJnby5NYXJnaW4iPT09ZSljPW5ldyBJYyh4cShhLnRvcCkseHEoYS5yaWdodCkseHEoYS5ib3R0b20pLHhxKGEubGVmdCkpO2Vsc2UgaWYoImdvLlNwb3QiPT09ZSkic3RyaW5nIj09PXR5cGVvZiBhWyJlbnVtIl0/Yz1YZChhWyJlbnVtIl0pOmM9bmV3IE8oeHEoYS54KSx4cShhLnkpLHhxKGEub2Zmc2V0WCkseHEoYS5vZmZzZXRZKSk7ZWxzZSBpZigiZ28uQnJ1c2giPT09ZSl7aWYoYz1uZXcga2woKSxjLnR5cGU9cWIoa2wsYS50eXBlKSwic3RyaW5nIj09PXR5cGVvZiBhLmNvbG9yJiYoYy5jb2xvcj1hLmNvbG9yKSxhLnN0YXJ0IGluc3RhbmNlb2YgTyYmKGMuc3RhcnQ9YS5zdGFydCksYS5lbmQgaW5zdGFuY2VvZiBPJiYoYy5lbmQ9YS5lbmQpLCJudW1iZXIiPT09dHlwZW9mIGEuc3RhcnRSYWRpdXMmJihjLnN0YXJ0UmFkaXVzPXhxKGEuc3RhcnRSYWRpdXMpKSwibnVtYmVyIj09PXR5cGVvZiBhLmVuZFJhZGl1cyYmKGMuZW5kUmFkaXVzPXhxKGEuZW5kUmFkaXVzKSksYT1hLmNvbG9yU3RvcHMsQ2EoYSkpZm9yKGIgaW4gYSl7Yy5hZGRDb2xvclN0b3AocGFyc2VGbG9hdChiKSxhW2JdKTt9fWVsc2UiZ28uR2VvbWV0cnkiPT09ZT8oYj1udWxsLCJzdHJpbmciPT09dHlwZW9mIGEucGF0aD9iPW1lKGEucGF0aCk6Yj1uZXcgJGQoKSxiLnR5cGU9cWIoJGQsYS50eXBlKSwibnVtYmVyIj09PXR5cGVvZiBhLnN0YXJ0WCYmKGIuc3RhcnRYPXhxKGEuc3RhcnRYKSksIm51bWJlciI9PT10eXBlb2YgYS5zdGFydFkmJihiLnN0YXJ0WT14cShhLnN0YXJ0WSkpLCJudW1iZXIiPT09dHlwZW9mIGEuZW5kWCYmKGIuZW5kWD14cShhLmVuZFgpKSwibnVtYmVyIj09PXR5cGVvZiBhLmVuZFkmJihiLmVuZFk9eHEoYS5lbmRZKSksYS5zcG90MSBpbnN0YW5jZW9mIE8mJihiLnNwb3QxPWEuc3BvdDEpLGEuc3BvdDIgaW5zdGFuY2VvZiBPJiYoYi5zcG90Mj1hLnNwb3QyKSxjPWIpOiJnby5FbnVtVmFsdWUiPT09ZSYmKGI9YS5jbGFzc1R5cGUsMD09PWIuaW5kZXhPZigiZ28uIikmJihiPWIuc3Vic3RyKDMpKSxjPXFiKHlxW2JdP3lxW2JdOm51bGwsYS5uYW1lKSk7YT1jO319cmV0dXJuIGE7fTt0LnF1b3RlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXt2YXIgZT1hW2RdO2lmKCciJz09PWV8fCJcXCI9PT1lKWIrPSJcXCIrZTtlbHNlIGlmKCJcYiI9PT1lKWIrPSJcXGIiO2Vsc2UgaWYoIlxmIj09PWUpYis9IlxcZiI7ZWxzZSBpZigiXG4iPT09ZSliKz0iXFxuIjtlbHNlIGlmKCJcciI9PT1lKWIrPSJcXHIiO2Vsc2UgaWYoIlx0Ij09PWUpYis9IlxcdCI7ZWxzZXt2YXIgZj1hLmNoYXJDb2RlQXQoZCk7Yj0xNj5mP2IrKCJcXHUwMDAiK2EuY2hhckNvZGVBdChkKS50b1N0cmluZygxNikpOjMyPmY/YisoIlxcdTAwIithLmNoYXJDb2RlQXQoZCkudG9TdHJpbmcoMTYpKTo4MjMyPT09Zj9iKyJcXHUyMDI4Ijo4MjMzPT09Zj9iKyJcXHUyMDI5IjpiK2U7fX1yZXR1cm4nIicrYisnIic7fTt0LnptPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hPyJ1bmRlZmluZWQiOm51bGw9PT1hPyJudWxsIjohMD09PWE/InRydWUiOiExPT09YT8iZmFsc2UiOiJzdHJpbmciPT09dHlwZW9mIGE/dGhpcy5xdW90ZShhKToibnVtYmVyIj09PXR5cGVvZiBhP0luZmluaXR5PT09YT8iOWU5OTk5IjotSW5maW5pdHk9PT1hPyItOWU5OTk5Ijppc05hTihhKT8neyJjbGFzcyI6Ik5hTiJ9JzphLnRvU3RyaW5nKCk6YSBpbnN0YW5jZW9mIERhdGU/J3siY2xhc3MiOiJEYXRlIiwgInZhbHVlIjoiJythLnRvSlNPTigpKycifSc6YSBpbnN0YW5jZW9mIE51bWJlcj90aGlzLnptKGEudmFsdWVPZigpKTpFYShhKT90cSh0aGlzLGEpOkNhKGEpP3FxKHRoaXMsYSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBhPyJudWxsIjphLnRvU3RyaW5nKCk7fTtmdW5jdGlvbiB0cShhLGIsYyl7dm9pZCAwPT09YyYmKGM9ITEpO3ZhciBkPWIubGVuZ3RoO2lmKDA+PWQpcmV0dXJuIltdIjt2YXIgZT1uZXcgc2IoKTtlLmFkZCgiWyAiKTtjJiYxPGQmJmUuYWRkKCJcbiIpO2Zvcih2YXIgZj0wO2Y8ZDtmKyspe3ZhciBnPWJbZl07dm9pZCAwIT09ZyYmKDA8ZiYmKGUuYWRkKCIsIiksYyYmZS5hZGQoIlxuIikpLGUuYWRkKGEuem0oZykpKTt9YyYmMTxkJiZlLmFkZCgiXG4iKTtlLmFkZCgiIF0iKTtyZXR1cm4gZS50b1N0cmluZygpO31mdW5jdGlvbiBzcShhLGIpe3JldHVybiB2b2lkIDA9PT1ifHwiX19nb2hhc2hpZCI9PT1hfHwiXyI9PT1hWzBdfHwiZnVuY3Rpb24iPT09dHlwZW9mIGI/ITA6ITE7fWZ1bmN0aW9uIHpxKGEpe3JldHVybiBpc05hTihhKT8iTmFOIjpJbmZpbml0eT09PWE/IjllOTk5OSI6LUluZmluaXR5PT09YT8iLTllOTk5OSI6YTt9ZnVuY3Rpb24gcXEoYSxiKXt2YXIgYz1iO2lmKGMgaW5zdGFuY2VvZiBHKWI9eyJjbGFzcyI6ImdvLlBvaW50Iix4OnpxKGMueCkseTp6cShjLnkpfTtlbHNlIGlmKGMgaW5zdGFuY2VvZiBLKWI9eyJjbGFzcyI6ImdvLlNpemUiLHdpZHRoOnpxKGMud2lkdGgpLGhlaWdodDp6cShjLmhlaWdodCl9O2Vsc2UgaWYoYyBpbnN0YW5jZW9mIE4pYj17ImNsYXNzIjoiZ28uUmVjdCIseDp6cShjLngpLHk6enEoYy55KSx3aWR0aDp6cShjLndpZHRoKSxoZWlnaHQ6enEoYy5oZWlnaHQpfTtlbHNlIGlmKGMgaW5zdGFuY2VvZiBJYyliPXsiY2xhc3MiOiJnby5NYXJnaW4iLHRvcDp6cShjLnRvcCkscmlnaHQ6enEoYy5yaWdodCksYm90dG9tOnpxKGMuYm90dG9tKSxsZWZ0OnpxKGMubGVmdCl9O2Vsc2UgaWYoYyBpbnN0YW5jZW9mIE8pYy5nYigpP2I9eyJjbGFzcyI6ImdvLlNwb3QiLHg6enEoYy54KSx5OnpxKGMueSksb2Zmc2V0WDp6cShjLm9mZnNldFgpLG9mZnNldFk6enEoYy5vZmZzZXRZKX06Yj17ImNsYXNzIjoiZ28uU3BvdCIsImVudW0iOmMudG9TdHJpbmcoKX07ZWxzZSBpZihjIGluc3RhbmNlb2Yga2wpe2I9eyJjbGFzcyI6ImdvLkJydXNoIix0eXBlOmMudHlwZS5uYW1lfTtpZihjLnR5cGU9PT1ubCliLmNvbG9yPWMuY29sb3I7ZWxzZSBpZihjLnR5cGU9PT1xbHx8Yy50eXBlPT09bGwpYi5zdGFydD1jLnN0YXJ0LGIuZW5kPWMuZW5kLGMudHlwZT09PWxsJiYoMCE9PWMuc3RhcnRSYWRpdXMmJihiLnN0YXJ0UmFkaXVzPXpxKGMuc3RhcnRSYWRpdXMpKSxpc05hTihjLmVuZFJhZGl1cyl8fChiLmVuZFJhZGl1cz16cShjLmVuZFJhZGl1cykpKTtpZihudWxsIT09Yy5jb2xvclN0b3BzKXt2YXIgZD17fTtmb3IoYz1jLmNvbG9yU3RvcHMuaXRlcmF0b3I7Yy5uZXh0KCk7KXtkW2Mua2V5XT1jLnZhbHVlO31iLmNvbG9yU3RvcHM9ZDt9fWVsc2UgYyBpbnN0YW5jZW9mICRkPyhiPXsiY2xhc3MiOiJnby5HZW9tZXRyeSIsdHlwZTpjLnR5cGUubmFtZX0sMCE9PWMuc3RhcnRYJiYoYi5zdGFydFg9enEoYy5zdGFydFgpKSwwIT09Yy5zdGFydFkmJihiLnN0YXJ0WT16cShjLnN0YXJ0WSkpLDAhPT1jLmVuZFgmJihiLmVuZFg9enEoYy5lbmRYKSksMCE9PWMuZW5kWSYmKGIuZW5kWT16cShjLmVuZFkpKSxjLnNwb3QxLkEoVGMpfHwoYi5zcG90MT1jLnNwb3QxKSxjLnNwb3QyLkEoaGQpfHwoYi5zcG90Mj1jLnNwb3QyKSxjLnR5cGU9PT1hZSYmKGIucGF0aD1qZShjKSkpOmMgaW5zdGFuY2VvZiBEJiYoYj17ImNsYXNzIjoiZ28uRW51bVZhbHVlIixjbGFzc1R5cGU6d3EoYSxjLmNsYXNzVHlwZSksbmFtZTpjLm5hbWV9KTtkPSJ7IjtjPSEwO2Zvcih2YXIgZSBpbiBiKXt2YXIgZj1mbihiLGUpO2lmKCFzcShlLGYpKWlmKGM/Yz0hMTpkKz0iLCAiLGQrPSciJytlKyciOicsInBvaW50cyI9PT1lJiZmIGluc3RhbmNlb2YgRSl7dmFyIGc9IlsiO2ZvcihmPWYuaXRlcmF0b3I7Zi5uZXh0KCk7KXt2YXIgaD1mLnZhbHVlOzE8Zy5sZW5ndGgmJihnKz0iLCIpO2crPWEuem0oaC54KTtnKz0iLCI7Zys9YS56bShoLnkpO31nKz0iXSI7ZCs9Zzt9ZWxzZSBkKz1hLnptKGYpO31yZXR1cm4gZCsifSI7fWZ1bmN0aW9uIHhxKGEpe3JldHVybiJudW1iZXIiPT09dHlwZW9mIGE/YToiTmFOIj09PWE/TmFOOiI5ZTk5OTkiPT09YT9JbmZpbml0eToiLTllOTk5OSI9PT1hPy1JbmZpbml0eTpwYXJzZUZsb2F0KGEpO310LnJoPWZ1bmN0aW9uKGEpe3RoaXMuZnUuYWRkKGEpO307dC5waz1mdW5jdGlvbihhKXt0aGlzLmZ1LnJlbW92ZShhKTt9O3QuS3M9ZnVuY3Rpb24oYSl7dGhpcy5za2lwc1VuZG9NYW5hZ2VyfHx0aGlzLnVuZG9NYW5hZ2VyLmZ2KGEpO2Zvcih2YXIgYj10aGlzLmZ1LGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2IuTihkKShhKTt9fTt0LmFiPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe0FxKHRoaXMsIiIsYSxiLGMsZCxlLGYsZyk7fTt0Lmc9ZnVuY3Rpb24oYSxiLGMsZCxlKXtBcSh0aGlzLCIiLGFmLGEsdGhpcyxiLGMsZCxlKTt9O3QubXQ9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe0FxKHRoaXMsIiIsYWYsYixhLGMsZCxlLGYpO307ZnVuY3Rpb24gQXEoYSxiLGMsZCxlLGYsZyxoLGspe3ZvaWQgMD09PWgmJihoPW51bGwpO3ZvaWQgMD09PWsmJihrPW51bGwpO3ZhciBsPW5ldyAkZSgpO2wubW9kZWw9YTtsLmNoYW5nZT1jO2wubW9kZWxDaGFuZ2U9YjtsLnByb3BlcnR5TmFtZT1kO2wub2JqZWN0PWU7bC5vbGRWYWx1ZT1mO2wub2xkUGFyYW09aDtsLm5ld1ZhbHVlPWc7bC5uZXdQYXJhbT1rO2EuS3MobCk7fXQuUmo9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT09YSYmYS5tb2RlbD09PXRoaXMpaWYoYS5jaGFuZ2U9PT1hZilQaihhLm9iamVjdCxhLnByb3BlcnR5TmFtZSxhLkooYikpO2Vsc2UgaWYoYS5jaGFuZ2U9PT1jZil7dmFyIGM9YS5uZXdQYXJhbTtpZigibm9kZURhdGFBcnJheSI9PT1hLm1vZGVsQ2hhbmdlKXtpZihhPWEubmV3VmFsdWUsQ2EoYSkmJiJudW1iZXIiPT09dHlwZW9mIGMpe3ZhciBkPXRoaXMucGEoYSk7Yj8odGhpcy5GY1tjXT09PWEmJkphKHRoaXMuRmMsYyksdm9pZCAwIT09ZCYmdGhpcy5jYi5yZW1vdmUoZCkpOih0aGlzLkZjW2NdIT09YSYmSWEodGhpcy5GYyxjLGEpLHZvaWQgMCE9PWQmJnRoaXMuY2IuYWRkKGQsYSkpO319ZWxzZSIiPT09YS5tb2RlbENoYW5nZT8oKGQ9YS5vYmplY3QpJiYhRWEoZCkmJmEucHJvcGVydHlOYW1lJiYoZD1mbihhLm9iamVjdCxhLnByb3BlcnR5TmFtZSkpLEVhKGQpJiYibnVtYmVyIj09PXR5cGVvZiBjJiYoYT1hLm5ld1ZhbHVlLGI/SmEoZCxjKTpJYShkLGMsYSkpKTpBKCJ1bmtub3duIENoYW5nZWRFdmVudC5JbnNlcnQgbW9kZWxDaGFuZ2U6ICIrYS50b1N0cmluZygpKTt9ZWxzZSBhLmNoYW5nZT09PWRmPyhjPWEub2xkUGFyYW0sIm5vZGVEYXRhQXJyYXkiPT09YS5tb2RlbENoYW5nZT8oYT1hLm9sZFZhbHVlLENhKGEpJiYibnVtYmVyIj09PXR5cGVvZiBjJiYoZD10aGlzLnBhKGEpLGI/KHRoaXMuRmNbY10hPT1hJiZJYSh0aGlzLkZjLGMsYSksdm9pZCAwIT09ZCYmdGhpcy5jYi5hZGQoZCxhKSk6KHRoaXMuRmNbY109PT1hJiZKYSh0aGlzLkZjLGMpLHZvaWQgMCE9PWQmJnRoaXMuY2IucmVtb3ZlKGQpKSkpOiIiPT09YS5tb2RlbENoYW5nZT8oKGQ9YS5vYmplY3QpJiYhRWEoZCkmJmEucHJvcGVydHlOYW1lJiYoZD1mbihhLm9iamVjdCxhLnByb3BlcnR5TmFtZSkpLEVhKGQpJiYibnVtYmVyIj09PXR5cGVvZiBjJiYoYT1hLm9sZFZhbHVlLGI/SWEoZCxjLGEpOkphKGQsYykpKTpBKCJ1bmtub3duIENoYW5nZWRFdmVudC5SZW1vdmUgbW9kZWxDaGFuZ2U6ICIrYS50b1N0cmluZygpKSk6YS5jaGFuZ2UhPT1iZiYmQSgidW5rbm93biBDaGFuZ2VkRXZlbnQ6ICIrYS50b1N0cmluZygpKTt9O3QuQWE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudW5kb01hbmFnZXIuQWEoYSk7fTt0LlphPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVuZG9NYW5hZ2VyLlphKGEpO307dC51Zj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuZG9NYW5hZ2VyLnVmKCk7fTtaLnByb3RvdHlwZS5jb21taXQ9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj0iIik7dmFyIGM9dGhpcy5za2lwc1VuZG9NYW5hZ2VyO251bGw9PT1iJiYodGhpcy5za2lwc1VuZG9NYW5hZ2VyPSEwLGI9IiIpO3RoaXMudW5kb01hbmFnZXIuQWEoYik7dmFyIGQ9ITE7dHJ5e2EodGhpcyksZD0hMDt9ZmluYWxseXtkP3RoaXMudW5kb01hbmFnZXIuWmEoYik6dGhpcy51bmRvTWFuYWdlci51ZigpLHRoaXMuc2tpcHNVbmRvTWFuYWdlcj1jO319O3Q9Wi5wcm90b3R5cGU7dC5FYT1mdW5jdGlvbihhLGIpe3ZvaWQgMD09PWImJihiPSIiKTtBcSh0aGlzLCJTb3VyY2VDaGFuZ2VkIixiZixiLGEsbnVsbCxudWxsKTt9O3QucGE9ZnVuY3Rpb24oYSl7aWYobnVsbCE9PWEpe3ZhciBiPXRoaXMubGk7aWYoIiIhPT1iJiYoYj1mbihhLGIpLHZvaWQgMCE9PWIpKXtpZihmcShiKSlyZXR1cm4gYjtBKCJLZXkgdmFsdWUgZm9yIG5vZGUgZGF0YSAiK2ErIiBpcyBub3QgYSBudW1iZXIgb3IgYSBzdHJpbmc6ICIrYik7fX19O3Qudm09ZnVuY3Rpb24oYSxiKXtpZihudWxsIT09YSl7dmFyIGM9dGhpcy5saTtpZigiIiE9PWMpaWYodGhpcy5RYihhKSl7dmFyIGQ9Zm4oYSxjKTtkIT09YiYmbnVsbD09PXRoaXMuUmIoYikmJihQaihhLGMsYiksdm9pZCAwIT09ZCYmdGhpcy5jYi5yZW1vdmUoZCksdGhpcy5jYi5hZGQoYixhKSxBcSh0aGlzLCJub2RlS2V5IixhZixjLGEsZCxiKSwic3RyaW5nIj09PXR5cGVvZiBjJiZ0aGlzLkVhKGEsYyksdGhpcy5ucShkLGIpKTt9ZWxzZSBQaihhLGMsYik7fX07ZnVuY3Rpb24gZnEoYSl7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYXx8InN0cmluZyI9PT10eXBlb2YgYTt9dC5RYj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnBhKGEpO3JldHVybiB2b2lkIDA9PT1iPyExOnRoaXMuY2IuSihiKT09PWE7fTt0LlJiPWZ1bmN0aW9uKGEpe251bGw9PT1hJiZBKCJNb2RlbC5maW5kTm9kZURhdGFGb3JLZXk6a2V5IG11c3Qgbm90IGJlIG51bGwiKTtyZXR1cm4gdm9pZCAwIT09YSYmZnEoYSk/dGhpcy5jYi5KKGEpOm51bGw7fTt0Lmh0PWZ1bmN0aW9uKGEpe2lmKG51bGwhPT1hKXt2YXIgYj10aGlzLmxpO2lmKCIiIT09Yil7dmFyIGM9dGhpcy5wYShhKTtpZih2b2lkIDA9PT1jfHx0aGlzLmNiLmNvbnRhaW5zKGMpKXt2YXIgZD10aGlzLm9sO2lmKG51bGwhPT1kJiYoYz1kKHRoaXMsYSksdm9pZCAwIT09YyYmbnVsbCE9PWMmJiF0aGlzLmNiLmNvbnRhaW5zKGMpKSl7UGooYSxiLGMpO3JldHVybjt9aWYoInN0cmluZyI9PT10eXBlb2YgYyl7Zm9yKGQ9Mjt0aGlzLmNiLmNvbnRhaW5zKGMrZCk7KXtkKys7fVBqKGEsYixjK2QpO31lbHNlIGlmKHZvaWQgMD09PWN8fCJudW1iZXIiPT09dHlwZW9mIGMpe2ZvcihjPS10aGlzLmNiLmNvdW50LTE7dGhpcy5jYi5jb250YWlucyhjKTspe2MtLTt9UGooYSxiLGMpO319fX19O3QuaGY9ZnVuY3Rpb24oYSl7bnVsbCE9PWEmJihEYihhKSx0aGlzLlFiKGEpfHxZcCh0aGlzLGEsITApKTt9O2Z1bmN0aW9uIFlwKGEsYixjKXt2YXIgZD1hLnBhKGIpO2lmKHZvaWQgMD09PWR8fGEuY2IuSihkKSE9PWIpYS5odChiKSxkPWEucGEoYiksdm9pZCAwPT09ZD9BKCJNb2RlbC5tYWtlTm9kZURhdGFLZXlVbmlxdWUgZmFpbGVkIG9uICIrYisiLiAgRGF0YSBub3QgYWRkZWQgdG8gTW9kZWwuIik6KGEuY2IuYWRkKGQsYiksZD1udWxsLGMmJihkPWEuRmMubGVuZ3RoLElhKGEuRmMsZCxiKSksQXEoYSwibm9kZURhdGFBcnJheSIsY2YsIm5vZGVEYXRhQXJyYXkiLGEsbnVsbCxiLG51bGwsZCksYS5ybShiKSxhLnFtKGIpKTt9dC5reT1mdW5jdGlvbihhKXtpZihFYShhKSlmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe3RoaXMuaGYoYVtjXSk7fWVsc2UgZm9yKGE9YS5pdGVyYXRvcjthLm5leHQoKTspe3RoaXMuaGYoYS52YWx1ZSk7fX07dC5vbT1mdW5jdGlvbihhKXtudWxsIT09YSYmWHAodGhpcyxhLCEwKTt9O2Z1bmN0aW9uIFhwKGEsYixjKXt2YXIgZD1hLnBhKGIpO3ZvaWQgMCE9PWQmJmEuY2IucmVtb3ZlKGQpO2Q9bnVsbDtpZihjKXthOmlmKGM9YS5GYyxBcnJheS5pc0FycmF5KGMpKWQ9Yy5pbmRleE9mKGIpO2Vsc2V7ZD1jLmxlbmd0aDtmb3IodmFyIGU9MDtlPGQ7ZSsrKXtpZihjW2VdPT09Yil7ZD1lO2JyZWFrIGE7fX1kPS0xO31pZigwPmQpcmV0dXJuO0phKGEuRmMsZCk7fUFxKGEsIm5vZGVEYXRhQXJyYXkiLGRmLCJub2RlRGF0YUFycmF5IixhLGIsbnVsbCxkLG51bGwpO2Euc3EoYik7fXQuT3o9ZnVuY3Rpb24oYSl7aWYoRWEoYSkpZm9yKHZhciBiPWEubGVuZ3RoLGM9MDtjPGI7YysrKXt0aGlzLm9tKGFbY10pO31lbHNlIGZvcihhPWEuaXRlcmF0b3I7YS5uZXh0KCk7KXt0aGlzLm9tKGEudmFsdWUpO319O3QuRXo9ZnVuY3Rpb24oYSl7aWYoRWEoYSkpe2Zvcih2YXIgYj1uZXcgRih0aGlzLmNiLml0ZXJhdG9yS2V5cyksYz1uZXcgRigpLGQ9YS5sZW5ndGgsZT0wO2U8ZDtlKyspe3ZhciBmPWFbZV0sZz10aGlzLnBhKGYpO2lmKHZvaWQgMCE9PWcpe2MuYWRkKGcpO3ZhciBoPXRoaXMuUmIoZyk7bnVsbCE9PWg/dGhpcy5RaihoLGYpOihoPXt9LHRoaXMudm0oaCxnKSx0aGlzLlFqKGgsZiksdGhpcy5oZihoKSk7fWVsc2UgdGhpcy5oZihmKSxjLmFkZCh0aGlzLnBhKGYpKTt9Zm9yKGE9Yi5pdGVyYXRvcjthLm5leHQoKTspe2I9YS52YWx1ZSxjLmNvbnRhaW5zKGIpfHwoYj10aGlzLlJiKGIpKSYmdGhpcy5vbShiKTt9fX07dC5ucT1mdW5jdGlvbihhLGIpe3ZvaWQgMCE9PWImJihhPWlxKHRoaXMsYSksYSBpbnN0YW5jZW9mIEYmJnRoaXMuRWYuYWRkKGIsYSkpO307dC5Xdj1mdW5jdGlvbigpe307dC5ybT1mdW5jdGlvbigpe307dC5xbT1mdW5jdGlvbigpe307dC5zcT1mdW5jdGlvbigpe307ZnVuY3Rpb24ga3EoYSxiLGMpe2lmKHZvaWQgMCE9PWIpe3ZhciBkPWEuRWYuSihiKTtudWxsPT09ZCYmKGQ9bmV3IEYoKSxhLkVmLmFkZChiLGQpKTtkLmFkZChjKTt9fWZ1bmN0aW9uIGpxKGEsYixjKXtpZih2b2lkIDAhPT1iKXt2YXIgZD1hLkVmLkooYik7ZCBpbnN0YW5jZW9mIEYmJih2b2lkIDA9PT1jfHxudWxsPT09Yz9hLkVmLnJlbW92ZShiKTooZC5yZW1vdmUoYyksMD09PWQuY291bnQmJmEuRWYucmVtb3ZlKGIpKSk7fX1mdW5jdGlvbiBpcShhLGIpe2lmKHZvaWQgMD09PWIpcmV0dXJuIG51bGw7YT1hLkVmLkooYik7cmV0dXJuIGEgaW5zdGFuY2VvZiBGP2E6bnVsbDt9dC5MdT1mdW5jdGlvbihhKXt2b2lkIDA9PT1hP3RoaXMuRWYuY2xlYXIoKTp0aGlzLkVmLnJlbW92ZShhKTt9O1oucHJvdG90eXBlLmNvcHlOb2RlRGF0YT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDt2YXIgYj10aGlzLklrO2E9bnVsbCE9PWI/YihhLHRoaXMpOkJxKHRoaXMsYSwhMCk7Q2EoYSkmJm1iKGEpO3JldHVybiBhO307ZnVuY3Rpb24gQnEoYSxiLGMpe2lmKGEuY29waWVzQXJyYXlzJiZBcnJheS5pc0FycmF5KGIpKXt2YXIgZD1bXTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1CcShhLGJbY10sYS5jb3BpZXNBcnJheU9iamVjdHMpO2QucHVzaChlKTt9bWIoZCk7cmV0dXJuIGQ7fWlmKGMmJkNhKGIpKXtjPShjPWIuY29uc3RydWN0b3IpP25ldyBjKCk6e307ZT1hLmNvcGllc0tleXx8InN0cmluZyIhPT10eXBlb2YgYS5ub2RlS2V5UHJvcGVydHk/bnVsbDphLm5vZGVLZXlQcm9wZXJ0eTtmb3IoZCBpbiBiKXtpZigiX19nb2hhc2hpZCI9PT1kKWMuX19nb2hhc2hpZD12b2lkIDA7ZWxzZSBpZihkPT09ZSljW2VdPXZvaWQgMDtlbHNle3ZhciBmPWZuKGIsZCksZz13cShhLGYpOyJHcmFwaE9iamVjdCI9PT1nfHwiRGlhZ3JhbSI9PT1nfHwiTGF5ZXIiPT09Z3x8IlJvd0NvbHVtbkRlZmluaXRpb24iPT09Z3x8IkFuaW1hdGlvbk1hbmFnZXIiPT09Z3x8IlRvb2wiPT09Z3x8IkNvbW1hbmRIYW5kbGVyIj09PWd8fCJMYXlvdXQiPT09Z3x8IklucHV0RXZlbnQiPT09Z3x8IkRpYWdyYW1FdmVudCI9PT1nfHxmIGluc3RhbmNlb2YgWnx8ZiBpbnN0YW5jZW9mIGZmfHxmIGluc3RhbmNlb2YgZWZ8fGYgaW5zdGFuY2VvZiAkZT9QaihjLGQsZik6KGY9QnEoYSxmLCExKSxQaihjLGQsZikpO319bWIoYyk7cmV0dXJuIGM7fXJldHVybiBiIGluc3RhbmNlb2YgRz9iLmNvcHkoKTpiIGluc3RhbmNlb2YgSz9iLmNvcHkoKTpiIGluc3RhbmNlb2YgTj9iLmNvcHkoKTpiIGluc3RhbmNlb2YgTz9iLmNvcHkoKTpiIGluc3RhbmNlb2YgSWM/Yi5jb3B5KCk6Yjt9Wi5wcm90b3R5cGUuc2V0RGF0YVByb3BlcnR5PWZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLlFiKGEpKXtpZihiPT09dGhpcy5ub2RlS2V5UHJvcGVydHkpdGhpcy52bShhLGMpO2Vsc2V7aWYoYj09PXRoaXMubm9kZUNhdGVnb3J5UHJvcGVydHkpe3RoaXMucHEoYSxjKTtyZXR1cm47fX19ZWxzZSFDcSYmYSBpbnN0YW5jZW9mIFkmJihDcT0hMCx5YSgnTW9kZWwuc2V0RGF0YVByb3BlcnR5IGlzIG1vZGlmeWluZyBhIEdyYXBoT2JqZWN0LCAiJythLnRvU3RyaW5nKCkrJyInKSx5YSgiICBJcyB0aGF0IHJlYWxseSB5b3VyIGludGVudD8iKSk7dmFyIGQ9Zm4oYSxiKTtkIT09YyYmKFBqKGEsYixjKSx0aGlzLm10KGEsYixkLGMpKTt9O3Q9Wi5wcm90b3R5cGU7dC5zZXQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuc2V0RGF0YVByb3BlcnR5KGEsYixjKTt9O3QuUWo9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz10aGlzLlFiKGEpLGQ7Zm9yKGQgaW4gYil7Il9fZ29oYXNoaWQiPT09ZHx8YyYmZD09PXRoaXMubm9kZUtleVByb3BlcnR5fHx0aGlzLnNldERhdGFQcm9wZXJ0eShhLGQsYltkXSk7fX19O3QuZ3k9ZnVuY3Rpb24oYSxiKXt0aGlzLllzKGEsLTEsYik7fTt0LllzPWZ1bmN0aW9uKGEsYixjKXswPmImJihiPWEubGVuZ3RoKTtJYShhLGIsYyk7QXEodGhpcywiIixjZiwiIixhLG51bGwsYyxudWxsLGIpO307dC54dj1mdW5jdGlvbihhLGIpe3ZvaWQgMD09PWImJihiPS0xKTthPT09dGhpcy5GYyYmQSgiTW9kZWwucmVtb3ZlQXJyYXlJdGVtIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIHRoZSBNb2RlbC5ub2RlRGF0YUFycmF5Iik7LTE9PT1iJiYoYj1hLmxlbmd0aC0xKTt2YXIgYz1hW2JdO0phKGEsYik7QXEodGhpcywiIixkZiwiIixhLGMsbnVsbCxiLG51bGwpO307dC5Wcz1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4iIjt2YXIgYj10aGlzLndqO2lmKCIiPT09YilyZXR1cm4iIjtiPWZuKGEsYik7aWYodm9pZCAwPT09YilyZXR1cm4iIjtpZigic3RyaW5nIj09PXR5cGVvZiBiKXJldHVybiBiO0EoImdldENhdGVnb3J5Rm9yTm9kZURhdGEgZm91bmQgYSBub24tc3RyaW5nIGNhdGVnb3J5IGZvciAiK2ErIjogIitiKTtyZXR1cm4iIjt9O3QucHE9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT09YSl7dmFyIGM9dGhpcy53ajtpZigiIiE9PWMpaWYodGhpcy5RYihhKSl7dmFyIGQ9Zm4oYSxjKTt2b2lkIDA9PT1kJiYoZD0iIik7ZCE9PWImJihQaihhLGMsYiksQXEodGhpcywibm9kZUNhdGVnb3J5IixhZixjLGEsZCxiKSk7fWVsc2UgUGooYSxjLGIpO319O3QuZm09ZnVuY3Rpb24oKXtyZXR1cm4hMTt9O3QuY2s9ZnVuY3Rpb24oKXtyZXR1cm4hMTt9O3QuZW09ZnVuY3Rpb24oKXtyZXR1cm4hMTt9O3QuZHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMTt9O3QuZGs9ZnVuY3Rpb24oKXtyZXR1cm4hMTt9O2Z1bmN0aW9uIHhpKCl7cmV0dXJuIG5ldyBaKCk7fWZ1bmN0aW9uIHdxKGEsYil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBiKXtpZihiLmNsYXNzTmFtZSlyZXR1cm4gYi5jbGFzc05hbWU7aWYoYi5uYW1lKXJldHVybiBiLm5hbWU7fWVsc2UgaWYoIm9iamVjdCI9PT1fdHlwZW9mKGIpJiZudWxsIT09YiYmYi5jb25zdHJ1Y3RvcilyZXR1cm4gd3EoYSxiLmNvbnN0cnVjdG9yKTtyZXR1cm4gX3R5cGVvZihiKTt9ZnVuY3Rpb24gZm4oYSxiKXtpZighYXx8IWIpcmV0dXJuIG51bGw7dHJ5e2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYil2YXIgYz1iKGEpO2Vsc2UiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0QXR0cmlidXRlPyhjPWEuZ2V0QXR0cmlidXRlKGIpLG51bGw9PT1jJiYoYz12b2lkIDApKTpjPWFbYl07fWNhdGNoKGQpe31yZXR1cm4gYzt9ZnVuY3Rpb24gUGooYSxiLGMpe2lmKGEmJmIpdHJ5eyJmdW5jdGlvbiI9PT10eXBlb2YgYj9iKGEsYyk6ImZ1bmN0aW9uIj09PXR5cGVvZiBhLnNldEF0dHJpYnV0ZT9hLnNldEF0dHJpYnV0ZShiLGMpOmFbYl09Yzt9Y2F0Y2goZCl7fX1wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhaLnByb3RvdHlwZSx7bmFtZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlVhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLlVhO2IhPT1hJiYodGhpcy5VYT1hLHRoaXMuZygibmFtZSIsYixhKSk7fX0sZGF0YUZvcm1hdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLm1uO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLm1uO2IhPT1hJiYodGhpcy5tbj1hLHRoaXMuZygiZGF0YUZvcm1hdCIsYixhKSk7fX0saXNSZWFkT25seTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkxmO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkxmO2IhPT1hJiYodGhpcy5MZj1hLHRoaXMuZygiaXNSZWFkT25seSIsYixhKSk7fX0sbW9kZWxEYXRhOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5sO2IhPT1hJiYodGhpcy5sPWEsdGhpcy5nKCJtb2RlbERhdGEiLGIsYSksdGhpcy5FYShhKSk7fX0sdW5kb01hbmFnZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy51O30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnU7YiE9PWEmJihudWxsIT09YiYmYi5CeCh0aGlzKSx0aGlzLnU9YSxudWxsIT09YSYmYS5Tdyh0aGlzKSk7fX0sc2tpcHNVbmRvTWFuYWdlcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmVoO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmVoPWE7fX0sbm9kZUtleVByb3BlcnR5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMubGk7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMubGk7YiE9PWEmJigiIj09PWEmJkEoIk1vZGVsLm5vZGVLZXlQcm9wZXJ0eSBtYXkgbm90IGJlIHRoZSBlbXB0eSBzdHJpbmciKSwwPHRoaXMuY2IuY291bnQmJkEoIkNhbm5vdCBzZXQgTW9kZWwubm9kZUtleVByb3BlcnR5IHdoZW4gdGhlcmUgaXMgZXhpc3Rpbmcgbm9kZSBkYXRhIiksdGhpcy5saT1hLHRoaXMuZygibm9kZUtleVByb3BlcnR5IixiLGEpKTt9fSxtYWtlVW5pcXVlS2V5RnVuY3Rpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5vbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5vbDtiIT09YSYmKHRoaXMub2w9YSx0aGlzLmcoIm1ha2VVbmlxdWVLZXlGdW5jdGlvbiIsYixhKSk7fX0sbm9kZURhdGFBcnJheTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkZjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLkZjO2lmKGIhPT1hKXt0aGlzLmNiLmNsZWFyKCk7dGhpcy5XdigpO2Zvcih2YXIgYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7dmFyIGU9YVtkXTtpZighQ2EoZSkpe0EoIk1vZGVsLm5vZGVEYXRhQXJyYXkgbXVzdCBvbmx5IGNvbnRhaW4gT2JqZWN0cywgbm90OiAiK2UpO3JldHVybjt9RGIoZSk7fXRoaXMuRmM9YTtkPW5ldyBFKCk7Zm9yKGU9MDtlPGM7ZSsrKXt2YXIgZj1hW2VdLGc9dGhpcy5wYShmKTt2b2lkIDA9PT1nP2QuYWRkKGYpOm51bGwhPT10aGlzLmNiLkooZyk/ZC5hZGQoZik6dGhpcy5jYi5hZGQoZyxmKTt9Zm9yKGQ9ZC5pdGVyYXRvcjtkLm5leHQoKTspe2U9ZC52YWx1ZSx0aGlzLmh0KGUpLGY9dGhpcy5wYShlKSx2b2lkIDAhPT1mJiZ0aGlzLmNiLmFkZChmLGUpO31BcSh0aGlzLCJub2RlRGF0YUFycmF5IixhZiwibm9kZURhdGFBcnJheSIsdGhpcyxiLGEpO2ZvcihiPTA7YjxjO2IrKyl7ZD1hW2JdLHRoaXMucm0oZCksdGhpcy5xbShkKTt9dGhpcy5MdSgpO0FycmF5LmlzQXJyYXkoYSl8fCh0aGlzLmlzUmVhZE9ubHk9ITApO319fSxjb3B5Tm9kZURhdGFGdW5jdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLklrO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLklrO2IhPT1hJiYodGhpcy5Jaz1hLHRoaXMuZygiY29weU5vZGVEYXRhRnVuY3Rpb24iLGIsYSkpO319LGNvcGllc0FycmF5czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmNuO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmNuO2IhPT1hJiYodGhpcy5jbj1hLHRoaXMuZygiY29waWVzQXJyYXlzIixiLGEpKTt9fSxjb3BpZXNBcnJheU9iamVjdHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ibjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5ibjtiIT09YSYmKHRoaXMuYm49YSx0aGlzLmcoImNvcGllc0FycmF5T2JqZWN0cyIsYixhKSk7fX0sY29waWVzS2V5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuZW47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuZW47YiE9PWEmJih0aGlzLmVuPWEsdGhpcy5nKCJjb3BpZXNLZXkiLGIsYSkpO319LGFmdGVyQ29weUZ1bmN0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTW07fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuTW07YiE9PWEmJih0aGlzLk1tPWEsdGhpcy5nKCJhZnRlckNvcHlGdW5jdGlvbiIsYixhKSk7fX0sbm9kZUNhdGVnb3J5UHJvcGVydHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53ajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy53ajtiIT09YSYmKHRoaXMud2o9YSx0aGlzLmcoIm5vZGVDYXRlZ29yeVByb3BlcnR5IixiLGEpKTt9fX0pO3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFose3R5cGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4iTW9kZWwiO319fSk7Wi5wcm90b3R5cGUuc2V0Q2F0ZWdvcnlGb3JOb2RlRGF0YT1aLnByb3RvdHlwZS5wcTtaLnByb3RvdHlwZS5nZXRDYXRlZ29yeUZvck5vZGVEYXRhPVoucHJvdG90eXBlLlZzO1oucHJvdG90eXBlLnJlbW92ZUFycmF5SXRlbT1aLnByb3RvdHlwZS54djtaLnByb3RvdHlwZS5pbnNlcnRBcnJheUl0ZW09Wi5wcm90b3R5cGUuWXM7Wi5wcm90b3R5cGUuYWRkQXJyYXlJdGVtPVoucHJvdG90eXBlLmd5O1oucHJvdG90eXBlLmFzc2lnbkFsbERhdGFQcm9wZXJ0aWVzPVoucHJvdG90eXBlLlFqO1oucHJvdG90eXBlLnNldD1aLnByb3RvdHlwZS5zZXQ7Wi5wcm90b3R5cGUuY2xlYXJVbnJlc29sdmVkUmVmZXJlbmNlcz1aLnByb3RvdHlwZS5MdTtaLnByb3RvdHlwZS5tZXJnZU5vZGVEYXRhQXJyYXk9Wi5wcm90b3R5cGUuRXo7Wi5wcm90b3R5cGUucmVtb3ZlTm9kZURhdGFDb2xsZWN0aW9uPVoucHJvdG90eXBlLk96O1oucHJvdG90eXBlLnJlbW92ZU5vZGVEYXRhPVoucHJvdG90eXBlLm9tO1oucHJvdG90eXBlLmFkZE5vZGVEYXRhQ29sbGVjdGlvbj1aLnByb3RvdHlwZS5reTtaLnByb3RvdHlwZS5hZGROb2RlRGF0YT1aLnByb3RvdHlwZS5oZjtaLnByb3RvdHlwZS5tYWtlTm9kZURhdGFLZXlVbmlxdWU9Wi5wcm90b3R5cGUuaHQ7Wi5wcm90b3R5cGUuZmluZE5vZGVEYXRhRm9yS2V5PVoucHJvdG90eXBlLlJiO1oucHJvdG90eXBlLmNvbnRhaW5zTm9kZURhdGE9Wi5wcm90b3R5cGUuUWI7Wi5wcm90b3R5cGUuc2V0S2V5Rm9yTm9kZURhdGE9Wi5wcm90b3R5cGUudm07Wi5wcm90b3R5cGUuZ2V0S2V5Rm9yTm9kZURhdGE9Wi5wcm90b3R5cGUucGE7Wi5wcm90b3R5cGUudXBkYXRlVGFyZ2V0QmluZGluZ3M9Wi5wcm90b3R5cGUuRWE7Wi5wcm90b3R5cGUuY29tbWl0PVoucHJvdG90eXBlLmNvbW1pdDtaLnByb3RvdHlwZS5yb2xsYmFja1RyYW5zYWN0aW9uPVoucHJvdG90eXBlLnVmO1oucHJvdG90eXBlLmNvbW1pdFRyYW5zYWN0aW9uPVoucHJvdG90eXBlLlphO1oucHJvdG90eXBlLnN0YXJ0VHJhbnNhY3Rpb249Wi5wcm90b3R5cGUuQWE7Wi5wcm90b3R5cGUucmFpc2VEYXRhQ2hhbmdlZD1aLnByb3RvdHlwZS5tdDtaLnByb3RvdHlwZS5yYWlzZUNoYW5nZWQ9Wi5wcm90b3R5cGUuZztaLnByb3RvdHlwZS5yYWlzZUNoYW5nZWRFdmVudD1aLnByb3RvdHlwZS5hYjtaLnByb3RvdHlwZS5yZW1vdmVDaGFuZ2VkTGlzdGVuZXI9Wi5wcm90b3R5cGUucGs7Wi5wcm90b3R5cGUuYWRkQ2hhbmdlZExpc3RlbmVyPVoucHJvdG90eXBlLnJoO1oucHJvdG90eXBlLndyaXRlSnNvblZhbHVlPVoucHJvdG90eXBlLnptO1oucHJvdG90eXBlLnJlcGxhY2VKc29uT2JqZWN0cz1aLnByb3RvdHlwZS5wbTtaLnByb3RvdHlwZS5hcHBseUluY3JlbWVudGFsSlNPTj1aLnByb3RvdHlwZS5ueTtaLnByb3RvdHlwZS5hcHBseUluY3JlbWVudGFsSnNvbj1aLnByb3RvdHlwZS5VdztaLnByb3RvdHlwZS50b0pTT049Wi5wcm90b3R5cGUudG9KU09OO1oucHJvdG90eXBlLnRvSnNvbj1aLnByb3RvdHlwZS5ycTtaLnByb3RvdHlwZS50b0luY3JlbWVudGFsSlNPTj1aLnByb3RvdHlwZS5YejtaLnByb3RvdHlwZS50b0luY3JlbWVudGFsSnNvbj1aLnByb3RvdHlwZS5PeDtaLnByb3RvdHlwZS5jb21wdXRlSnNvbkRpZmZlcmVuY2U9Wi5wcm90b3R5cGUudXk7Wi5wcm90b3R5cGUuY2xlYXI9Wi5wcm90b3R5cGUuY2xlYXI7dmFyIENxPSExLHlxPXt9O1ouY2xhc3NOYW1lPSJNb2RlbCI7Wi5mcm9tSlNPTj1aLmZyb21Kc29uPWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9bnVsbCk7dmFyIGM9bnVsbDtpZigic3RyaW5nIj09PXR5cGVvZiBhKXRyeXtjPXcuSlNPTi5wYXJzZShhKTt9Y2F0Y2goZil7fWVsc2Uib2JqZWN0Ij09PV90eXBlb2YoYSk/Yz1hOkEoIlVuYWJsZSB0byBjb25zdHJ1Y3QgYSBNb2RlbCBmcm9tOiAiK2EpO2lmKG51bGw9PT1iKXthPW51bGw7dmFyIGQ9Y1siY2xhc3MiXTtpZigic3RyaW5nIj09PXR5cGVvZiBkKXRyeXt2YXIgZT1udWxsOzA9PT1kLmluZGV4T2YoImdvLiIpPyhkPWQuc3Vic3RyKDMpLGU9eXFbZF0/eXFbZF06bnVsbCk6KGU9eXFbZF0/eXFbZF06bnVsbCx2b2lkIDA9PT1lJiYoZT13W2RdKSk7ImZ1bmN0aW9uIj09PXR5cGVvZiBlJiYoYT1uZXcgZSgpKTt9Y2F0Y2goZil7fW51bGw9PT1hfHxhIGluc3RhbmNlb2YgWj9iPWE6QSgiVW5hYmxlIHRvIGNvbnN0cnVjdCBhIE1vZGVsIG9mIGRlY2xhcmVkIGNsYXNzOiAiK2NbImNsYXNzIl0pO31udWxsPT09YiYmKGI9Wi5jb25zdHJ1Y3RHcmFwaExpbmtzTW9kZWwoKSk7Yi5rcShjKTtiLnd2KGMpO3JldHVybiBiO307Wi5zYWZlUHJvcGVydHlWYWx1ZT1mbjtaLnNhZmVQcm9wZXJ0eVNldD1Qajt5cS5CcnVzaD1rbDt5cS5DaGFuZ2VkRXZlbnQ9JGU7eXEuR2VvbWV0cnk9JGQ7eXEuR3JhcGhPYmplY3Q9WTt5cS5NYXJnaW49SWM7eXEuUGFuZWw9WDt5cS5Qb2ludD1HO3lxLlJlY3Q9Tjt5cS5TaXplPUs7eXEuU3BvdD1PO3lxLlRyYW5zYWN0aW9uPWVmO3lxLlVuZG9NYW5hZ2VyPWZmO2Z1bmN0aW9uIEhpKGEsYixjKXttYih0aGlzKTt0aGlzLnY9ITE7dm9pZCAwPT09YSYmKGE9IiIpO3ZvaWQgMD09PWImJihiPWEpO3ZvaWQgMD09PWMmJihjPW51bGwpO3RoaXMubD0tMTt0aGlzLlFkPW51bGw7dGhpcy5PbD1hO3RoaXMuTmw9dGhpcy53cD0wO3RoaXMud3M9bnVsbDt0aGlzLlduPSExO3RoaXMuRWw9Yjt0aGlzLmFuPWM7dGhpcy5zbz1EcTt0aGlzLlZtPW51bGw7dGhpcy5adD1uZXcgRigpO31IaS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3ZhciBhPW5ldyBIaSgpO2EuT2w9dGhpcy5PbDthLndwPXRoaXMud3A7YS5ObD10aGlzLk5sO2Eud3M9dGhpcy53czthLlduPXRoaXMuV247YS5FbD10aGlzLkVsO2EuYW49dGhpcy5hbjthLnNvPXRoaXMuc287YS5WbT10aGlzLlZtO3JldHVybiBhO307dD1IaS5wcm90b3R5cGU7dC5mYj1mdW5jdGlvbihhKXthLmNsYXNzVHlwZT09PUhpJiYodGhpcy5tb2RlPWEpO307dC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJCaW5kaW5nKCIrdGhpcy50YXJnZXRQcm9wZXJ0eSsiOiIrdGhpcy5zb3VyY2VQcm9wZXJ0eSsoLTEhPT10aGlzLlhpPyIgIit0aGlzLlhpOiIiKSsiICIrdGhpcy5tb2RlLm5hbWUrIikiO307dC5mcmVlemU9ZnVuY3Rpb24oKXt0aGlzLnY9ITA7cmV0dXJuIHRoaXM7fTt0LmhhPWZ1bmN0aW9uKCl7dGhpcy52PSExO3JldHVybiB0aGlzO307dC50eD1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1udWxsKTt0aGlzLm1vZGU9Wm07dGhpcy5iYWNrQ29udmVydGVyPWE7cmV0dXJuIHRoaXM7fTt0LmhxPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPSIiKTt0aGlzLnNvdXJjZU5hbWU9YTt0aGlzLmlzVG9Nb2RlbD0hMTtyZXR1cm4gdGhpczt9O3QuR3o9ZnVuY3Rpb24oKXt0aGlzLnNvdXJjZU5hbWU9bnVsbDt0aGlzLmlzVG9Nb2RlbD0hMDtyZXR1cm4gdGhpczt9O2Z1bmN0aW9uIFlrKGEsYixjKXthPWEuc291cmNlTmFtZTtyZXR1cm4gbnVsbD09PWF8fCIiPT09YT9iOiIvIj09PWE/Yy5wYXJ0OiIuIj09PWE/YzoiLi4iPT09YT9jLnBhbmVsOmIuJGEoYSk7fXQuWHY9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuRWw7aWYodm9pZCAwPT09Y3x8IiI9PT1kfHxkPT09Yyl7Yz10aGlzLk9sO3ZhciBlPXRoaXMuYW47aWYobnVsbD09PWUmJiIiPT09Yyl5YSgiQmluZGluZyBlcnJvcjogdGFyZ2V0IHByb3BlcnR5IGlzIHRoZSBlbXB0eSBzdHJpbmc6ICIrdGhpcy50b1N0cmluZygpKTtlbHNle3ZhciBmPWI7IiIhPT1kJiYoZj1mbihiLGQpKTtpZih2b2lkIDAhPT1mKWlmKG51bGw9PT1lKSIiIT09YyYmUGooYSxjLGYpO2Vsc2UgdHJ5e2lmKCIiIT09Yyl7dmFyIGc9ZShmLGEpO1BqKGEsYyxnKTt9ZWxzZSBlKGYsYSk7fWNhdGNoKGgpe319fX07dC51cT1mdW5jdGlvbihhLGIsYyxkKXtpZih0aGlzLnNvPT09Wm0pe3ZhciBlPXRoaXMuT2w7aWYodm9pZCAwPT09Y3x8ZT09PWMpe2M9dGhpcy5FbDt2YXIgZj10aGlzLlZtLGc9YTsiIiE9PWUmJihnPWZuKGEsZSkpO2lmKHZvaWQgMCE9PWcmJiF0aGlzLlp0LmNvbnRhaW5zKGEpKXRyeXt0aGlzLlp0LmFkZChhKTt2YXIgaD1udWxsIT09ZD9kLmRpYWdyYW06bnVsbCxrPW51bGwhPT1oP2gubW9kZWw6bnVsbDtpZihudWxsPT09Zil7aWYoIiIhPT1jKW51bGwhPT1rP2suc2V0RGF0YVByb3BlcnR5KGIsYyxnKTpQaihiLGMsZyk7ZWxzZXtpZihudWxsIT09ayYmbnVsbCE9PWQmJjA8PWQuaXRlbUluZGV4JiZudWxsIT09ZC5wYW5lbCYmQXJyYXkuaXNBcnJheShkLnBhbmVsLml0ZW1BcnJheSkpe3ZhciBsPWQuaXRlbUluZGV4LG09ZC5wYW5lbC5pdGVtQXJyYXk7ay54dihtLGwpO2suWXMobSxsLGcpO319fWVsc2UgdHJ5e2lmKCIiIT09Yyl7dmFyIG49ZihnLGIsayk7bnVsbCE9PWs/ay5zZXREYXRhUHJvcGVydHkoYixjLG4pOlBqKGIsYyxuKTt9ZWxzZXt2YXIgcD1mKGcsYixrKTtpZih2b2lkIDAhPT1wJiZudWxsIT09ayYmbnVsbCE9PWQmJjA8PWQuaXRlbUluZGV4JiZudWxsIT09ZC5wYW5lbCYmQXJyYXkuaXNBcnJheShkLnBhbmVsLml0ZW1BcnJheSkpe3ZhciBxPWQuaXRlbUluZGV4LHI9ZC5wYW5lbC5pdGVtQXJyYXk7ay54dihyLHEpO2suWXMocixxLHApO319fWNhdGNoKHUpe319ZmluYWxseXt0aGlzLlp0LnJlbW92ZShhKTt9fX19O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEhpLnByb3RvdHlwZSx7WGk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnYmJndhKHRoaXMpO3RoaXMubD1hO319LHRhcmdldFByb3BlcnR5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuT2w7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyk7dGhpcy5PbD1hO319LHNvdXJjZU5hbWU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy53czt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzKTt0aGlzLndzPWE7bnVsbCE9PWEmJih0aGlzLlduPSExKTt9fSxpc1RvTW9kZWw6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Xbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzKTt0aGlzLlduPWE7fX0sc291cmNlUHJvcGVydHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5FbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzKTt0aGlzLkVsPWE7fX0sY29udmVydGVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYW47fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudiYmd2EodGhpcyk7dGhpcy5hbj1hO319LGJhY2tDb252ZXJ0ZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5WbTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52JiZ3YSh0aGlzKTt0aGlzLlZtPWE7fX0sbW9kZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnNvO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnYmJndhKHRoaXMpO3RoaXMuc289YTt9fX0pO0hpLnByb3RvdHlwZS51cGRhdGVTb3VyY2U9SGkucHJvdG90eXBlLnVxO0hpLnByb3RvdHlwZS51cGRhdGVUYXJnZXQ9SGkucHJvdG90eXBlLlh2O0hpLnByb3RvdHlwZS5vZk1vZGVsPUhpLnByb3RvdHlwZS5HejtIaS5wcm90b3R5cGUub2ZPYmplY3Q9SGkucHJvdG90eXBlLmhxO0hpLnByb3RvdHlwZS5tYWtlVHdvV2F5PUhpLnByb3RvdHlwZS50eDt2YXIgRHE9bmV3IEQoSGksIk9uZVdheSIsMSksWm09bmV3IEQoSGksIlR3b1dheSIsMik7SGkuY2xhc3NOYW1lPSJCaW5kaW5nIjtIaS5wYXJzZUVudW09ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Yz1xYihhLGMpO3JldHVybiBudWxsPT09Yz9iOmM7fTt9O0hpLnRvU3RyaW5nPVFhO0hpLk9uZVdheT1EcTtIaS5Ud29XYXk9Wm07ZnVuY3Rpb24gRXEoYSxiKXtaLmNhbGwodGhpcyk7dGhpcy5EdD0nLFxuICAiaW5zZXJ0ZWRMaW5rS2V5cyI6ICc7dGhpcy5mdz0nLFxuICAibW9kaWZpZWRMaW5rRGF0YSI6ICc7dGhpcy5GdD0nLFxuICAicmVtb3ZlZExpbmtLZXlzIjogJzt0aGlzLk9jPVtdO3RoaXMuTWY9bmV3IEYoKTt0aGlzLnFiPW5ldyBMYigpO3RoaXMuaGk9IiI7dGhpcy4kaT10aGlzLkhrPXRoaXMucGw9bnVsbDt0aGlzLlRlPSJmcm9tIjt0aGlzLlVlPSJ0byI7dGhpcy50aj10aGlzLnNqPSIiO3RoaXMucmo9ImNhdGVnb3J5Ijt0aGlzLkhkPSIiO3RoaXMudGw9ImlzR3JvdXAiO3RoaXMucWU9Imdyb3VwIjt0aGlzLmRuPSExO3ZvaWQgMCE9PWEmJih0aGlzLm5vZGVEYXRhQXJyYXk9YSk7dm9pZCAwIT09YiYmKHRoaXMubGlua0RhdGFBcnJheT1iKTt9b2EoRXEsWik7RXEuY29uc3RydWN0R3JhcGhMaW5rc01vZGVsPVouY29uc3RydWN0R3JhcGhMaW5rc01vZGVsO0VxLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZD1mdW5jdGlvbihhKXtaLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZC5jYWxsKHRoaXMsYSk7YS5oaT10aGlzLmhpO2EucGw9dGhpcy5wbDthLkhrPXRoaXMuSGs7YS5UZT10aGlzLlRlO2EuVWU9dGhpcy5VZTthLnNqPXRoaXMuc2o7YS50aj10aGlzLnRqO2Eucmo9dGhpcy5yajthLkhkPXRoaXMuSGQ7YS50bD10aGlzLnRsO2EucWU9dGhpcy5xZTthLmRuPXRoaXMuZG47fTt0PUVxLnByb3RvdHlwZTt0LmNsZWFyPWZ1bmN0aW9uKCl7Wi5wcm90b3R5cGUuY2xlYXIuY2FsbCh0aGlzKTt0aGlzLk9jPVtdO3RoaXMucWIuY2xlYXIoKTt0aGlzLk1mLmNsZWFyKCk7fTt0LnRvU3RyaW5nPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPTApO2lmKDI8PWEpcmV0dXJuIHRoaXMucnEoKTt2YXIgYj0oIiIhPT10aGlzLm5hbWU/dGhpcy5uYW1lOiIiKSsiIEdyYXBoTGlua3NNb2RlbCI7aWYoMDxhKXtiKz0iXG4gbm9kZSBkYXRhOiI7YT10aGlzLm5vZGVEYXRhQXJyYXk7dmFyIGM9YS5sZW5ndGgsZDtmb3IoZD0wO2Q8YztkKyspe3ZhciBlPWFbZF07Yis9IiAiK3RoaXMucGEoZSkrIjoiK1FhKGUpO31iKz0iXG4gbGluayBkYXRhOiI7YT10aGlzLmxpbmtEYXRhQXJyYXk7Yz1hLmxlbmd0aDtmb3IoZD0wO2Q8YztkKyspe2U9YVtkXSxiKz0iICIrZHEodGhpcyxlLCEwKSsiLS1ceDNlIitkcSh0aGlzLGUsITEpO319cmV0dXJuIGI7fTt0LnNrPWZ1bmN0aW9uKCl7dmFyIGE9Wi5wcm90b3R5cGUuc2suY2FsbCh0aGlzKSxiPSIiOyJjYXRlZ29yeSIhPT10aGlzLmxpbmtDYXRlZ29yeVByb3BlcnR5JiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLmxpbmtDYXRlZ29yeVByb3BlcnR5JiYoYis9JyxcbiAgImxpbmtDYXRlZ29yeVByb3BlcnR5IjogJyt0aGlzLnF1b3RlKHRoaXMubGlua0NhdGVnb3J5UHJvcGVydHkpKTsiIiE9PXRoaXMubGlua0tleVByb3BlcnR5JiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLmxpbmtLZXlQcm9wZXJ0eSYmKGIrPScsXG4gICJsaW5rS2V5UHJvcGVydHkiOiAnK3RoaXMucXVvdGUodGhpcy5saW5rS2V5UHJvcGVydHkpKTsiZnJvbSIhPT10aGlzLmxpbmtGcm9tS2V5UHJvcGVydHkmJiJzdHJpbmciPT09dHlwZW9mIHRoaXMubGlua0Zyb21LZXlQcm9wZXJ0eSYmKGIrPScsXG4gICJsaW5rRnJvbUtleVByb3BlcnR5IjogJyt0aGlzLnF1b3RlKHRoaXMubGlua0Zyb21LZXlQcm9wZXJ0eSkpOyJ0byIhPT10aGlzLmxpbmtUb0tleVByb3BlcnR5JiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLmxpbmtUb0tleVByb3BlcnR5JiYoYis9JyxcbiAgImxpbmtUb0tleVByb3BlcnR5IjogJyt0aGlzLnF1b3RlKHRoaXMubGlua1RvS2V5UHJvcGVydHkpKTsiIiE9PXRoaXMubGlua0Zyb21Qb3J0SWRQcm9wZXJ0eSYmInN0cmluZyI9PT10eXBlb2YgdGhpcy5saW5rRnJvbVBvcnRJZFByb3BlcnR5JiYoYis9JyxcbiAgImxpbmtGcm9tUG9ydElkUHJvcGVydHkiOiAnK3RoaXMucXVvdGUodGhpcy5saW5rRnJvbVBvcnRJZFByb3BlcnR5KSk7IiIhPT10aGlzLmxpbmtUb1BvcnRJZFByb3BlcnR5JiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLmxpbmtUb1BvcnRJZFByb3BlcnR5JiYoYis9JyxcbiAgImxpbmtUb1BvcnRJZFByb3BlcnR5IjogJyt0aGlzLnF1b3RlKHRoaXMubGlua1RvUG9ydElkUHJvcGVydHkpKTsiIiE9PXRoaXMubGlua0xhYmVsS2V5c1Byb3BlcnR5JiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLmxpbmtMYWJlbEtleXNQcm9wZXJ0eSYmKGIrPScsXG4gICJsaW5rTGFiZWxLZXlzUHJvcGVydHkiOiAnK3RoaXMucXVvdGUodGhpcy5saW5rTGFiZWxLZXlzUHJvcGVydHkpKTsiaXNHcm91cCIhPT10aGlzLm5vZGVJc0dyb3VwUHJvcGVydHkmJiJzdHJpbmciPT09dHlwZW9mIHRoaXMubm9kZUlzR3JvdXBQcm9wZXJ0eSYmKGIrPScsXG4gICJub2RlSXNHcm91cFByb3BlcnR5IjogJyt0aGlzLnF1b3RlKHRoaXMubm9kZUlzR3JvdXBQcm9wZXJ0eSkpOyJncm91cCIhPT10aGlzLm5vZGVHcm91cEtleVByb3BlcnR5JiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLm5vZGVHcm91cEtleVByb3BlcnR5JiYoYis9JyxcbiAgIm5vZGVHcm91cEtleVByb3BlcnR5IjogJyt0aGlzLnF1b3RlKHRoaXMubm9kZUdyb3VwS2V5UHJvcGVydHkpKTtyZXR1cm4gYStiO307dC5rcT1mdW5jdGlvbihhKXtaLnByb3RvdHlwZS5rcS5jYWxsKHRoaXMsYSk7YS5saW5rS2V5UHJvcGVydHkmJih0aGlzLmxpbmtLZXlQcm9wZXJ0eT1hLmxpbmtLZXlQcm9wZXJ0eSk7YS5saW5rRnJvbUtleVByb3BlcnR5JiYodGhpcy5saW5rRnJvbUtleVByb3BlcnR5PWEubGlua0Zyb21LZXlQcm9wZXJ0eSk7YS5saW5rVG9LZXlQcm9wZXJ0eSYmKHRoaXMubGlua1RvS2V5UHJvcGVydHk9YS5saW5rVG9LZXlQcm9wZXJ0eSk7YS5saW5rRnJvbVBvcnRJZFByb3BlcnR5JiYodGhpcy5saW5rRnJvbVBvcnRJZFByb3BlcnR5PWEubGlua0Zyb21Qb3J0SWRQcm9wZXJ0eSk7YS5saW5rVG9Qb3J0SWRQcm9wZXJ0eSYmKHRoaXMubGlua1RvUG9ydElkUHJvcGVydHk9YS5saW5rVG9Qb3J0SWRQcm9wZXJ0eSk7YS5saW5rQ2F0ZWdvcnlQcm9wZXJ0eSYmKHRoaXMubGlua0NhdGVnb3J5UHJvcGVydHk9YS5saW5rQ2F0ZWdvcnlQcm9wZXJ0eSk7YS5saW5rTGFiZWxLZXlzUHJvcGVydHkmJih0aGlzLmxpbmtMYWJlbEtleXNQcm9wZXJ0eT1hLmxpbmtMYWJlbEtleXNQcm9wZXJ0eSk7YS5ub2RlSXNHcm91cFByb3BlcnR5JiYodGhpcy5ub2RlSXNHcm91cFByb3BlcnR5PWEubm9kZUlzR3JvdXBQcm9wZXJ0eSk7YS5ub2RlR3JvdXBLZXlQcm9wZXJ0eSYmKHRoaXMubm9kZUdyb3VwS2V5UHJvcGVydHk9YS5ub2RlR3JvdXBLZXlQcm9wZXJ0eSk7fTt0LiR2PWZ1bmN0aW9uKCl7dmFyIGE9Wi5wcm90b3R5cGUuJHYuY2FsbCh0aGlzKSxiPScsXG4gICJsaW5rRGF0YUFycmF5IjogJyt0cSh0aGlzLHRoaXMubGlua0RhdGFBcnJheSwhMCk7cmV0dXJuIGErYjt9O3Qud3Y9ZnVuY3Rpb24oYSl7Wi5wcm90b3R5cGUud3YuY2FsbCh0aGlzLGEpO2E9YS5saW5rRGF0YUFycmF5O0FycmF5LmlzQXJyYXkoYSkmJih0aGlzLnBtKGEpLHRoaXMubGlua0RhdGFBcnJheT1hKTt9O3QudnE9ZnVuY3Rpb24oYSl7aWYoIShhIGluc3RhbmNlb2YgRXEpKXJldHVybiBBKCJNb2RlbC5jb21wdXRlSnNvbkRpZmZlcmVuY2U6IG5ld21vZGVsIG11c3QgYmUgYSBHcmFwaExpbmtzTW9kZWwiKSwiIjt2YXIgYj1aLnByb3RvdHlwZS52cS5jYWxsKHRoaXMsYSk7dnEodGhpcyxhLCJsaW5rS2V5UHJvcGVydHkiKTt2cSh0aGlzLGEsImxpbmtGcm9tS2V5UHJvcGVydHkiKTt2cSh0aGlzLGEsImxpbmtUb0tleVByb3BlcnR5Iik7dnEodGhpcyxhLCJsaW5rTGFiZWxLZXlzUHJvcGVydHkiKTt2cSh0aGlzLGEsIm5vZGVJc0dyb3VwUHJvcGVydHkiKTt2cSh0aGlzLGEsIm5vZGVHcm91cEtleVByb3BlcnR5Iik7Zm9yKHZhciBjPW5ldyBGKCksZD1uZXcgRigpLGU9bmV3IEYoKS5hZGRBbGwodGhpcy5xYi5pdGVyYXRvcktleXMpLGY9bmV3IExiKCksZz1hLmxpbmtEYXRhQXJyYXksaD1nLmxlbmd0aCxrPTA7azxoO2srKyl7dmFyIGw9Z1trXSxtPWEuaWMobCk7aWYodm9pZCAwIT09bSl7ZS5yZW1vdmUobSk7dmFyIG49dGhpcy53aChtKTtudWxsPT09bj8oYy5hZGQobSksZC5hZGQobCkpOnVxKHRoaXMsbixsLGYpfHxkLmFkZChsKTt9ZWxzZSB0aGlzLmVxKGwpLG09dGhpcy5pYyhsKSxjLmFkZChtKSxkLmFkZChsKTt9YT1iOzA8Yy5jb3VudCYmKGErPXRoaXMuRHQrdHEodGhpcyxjLk5hKCksITApKTswPGQuY291bnQmJihhKz10aGlzLmZ3K3RxKHRoaXMsZC5OYSgpLCEwKSk7MDxlLmNvdW50JiYoYSs9dGhpcy5GdCt0cSh0aGlzLGUuTmEoKSwhMCkpO3JldHVybiBhO307dC56dD1mdW5jdGlvbihhLGIpe3ZhciBjPVoucHJvdG90eXBlLnp0LmNhbGwodGhpcyxhLGIpLGQ9dGhpcyxlPW5ldyBGKCksZj1uZXcgRigpLGc9bmV3IEYoKTthLmNoYW5nZXMuZWFjaChmdW5jdGlvbihhKXthLm1vZGVsPT09ZCYmKCJsaW5rRGF0YUFycmF5Ij09PWEubW9kZWxDaGFuZ2U/YS5jaGFuZ2U9PT1jZj9lLmFkZChhLm5ld1ZhbHVlKTphLmNoYW5nZT09PWRmJiZnLmFkZChhLm9sZFZhbHVlKTpkLkFlKGEub2JqZWN0KSYmZi5hZGQoYS5vYmplY3QpKTt9KTt2YXIgaD1uZXcgRigpO2UuZWFjaChmdW5jdGlvbihhKXtoLmFkZChkLmljKGEpKTtifHxmLmFkZChhKTt9KTt2YXIgaz1uZXcgRigpO2cuZWFjaChmdW5jdGlvbihhKXtrLmFkZChkLmljKGEpKTtiJiZmLmFkZChhKTt9KTthPWM7MDxoLmNvdW50JiYoYSs9KGI/dGhpcy5GdDp0aGlzLkR0KSt0cSh0aGlzLGguTmEoKSwhMCkpOzA8Zi5jb3VudCYmKGErPXRoaXMuZncrdHEodGhpcyxmLk5hKCksITApKTswPGsuY291bnQmJihhKz0oYj90aGlzLkR0OnRoaXMuRnQpK3RxKHRoaXMsay5OYSgpLCEwKSk7cmV0dXJuIGE7fTt0LnZ2PWZ1bmN0aW9uKGEpe1oucHJvdG90eXBlLnZ2LmNhbGwodGhpcyxhKTt2YXIgYj1hLmluc2VydGVkTGlua0tleXM7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe3ZhciBlPWJbZF0sZj10aGlzLndoKGUpO251bGw9PT1mJiYoZj10aGlzLk9wKHt9KSx0aGlzLnZ0KGYsZSksdGhpcy5BaShmKSk7fWI9YS5tb2RpZmllZExpbmtEYXRhO2lmKEFycmF5LmlzQXJyYXkoYikpZm9yKGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGU9YltkXSxmPXRoaXMuaWMoZSksZj10aGlzLndoKGYpLG51bGwhPT1mKWZvcih2YXIgZyBpbiBlKXsiX19nb2hhc2hpZCIhPT1nJiZnIT09dGhpcy5saW5rS2V5UHJvcGVydHkmJnRoaXMuc2V0RGF0YVByb3BlcnR5KGYsZyxlW2ddKTt9fWE9YS5yZW1vdmVkTGlua0tleXM7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IoZz1hLmxlbmd0aCxiPTA7YjxnO2IrKyl7Yz10aGlzLndoKGFbYl0pLG51bGwhPT1jJiZ0aGlzLm5tKGMpO319O3QuUmo9ZnVuY3Rpb24oYSxiKXtpZihhLmNoYW5nZT09PWNmKXt2YXIgYz1hLm5ld1BhcmFtO2lmKCJsaW5rRGF0YUFycmF5Ij09PWEubW9kZWxDaGFuZ2Upe2E9YS5uZXdWYWx1ZTtpZihDYShhKSYmIm51bWJlciI9PT10eXBlb2YgYyl7dmFyIGQ9dGhpcy5pYyhhKTtiPyh0aGlzLk1mLnJlbW92ZShhKSx0aGlzLk9jW2NdPT09YSYmdGhpcy5PYy5zcGxpY2UoYywxKSx2b2lkIDAhPT1kJiZ0aGlzLnFiLnJlbW92ZShkKSk6KHRoaXMuTWYuYWRkKGEpLHRoaXMuT2NbY10hPT1hJiZ0aGlzLk9jLnNwbGljZShjLDAsYSksdm9pZCAwIT09ZCYmdGhpcy5xYi5hZGQoZCxhKSk7fXJldHVybjt9aWYoImxpbmtMYWJlbEtleXMiPT09YS5tb2RlbENoYW5nZSl7ZD10aGlzLnBnKGEub2JqZWN0KTtBcnJheS5pc0FycmF5KGQpJiYibnVtYmVyIj09PXR5cGVvZiBjJiYoYj8oYz1kLmluZGV4T2YoYS5uZXdWYWx1ZSksMDw9YyYmZC5zcGxpY2UoYywxKSk6MD5kLmluZGV4T2YoYS5uZXdWYWx1ZSkmJmQuc3BsaWNlKGMsMCxhLm5ld1ZhbHVlKSk7cmV0dXJuO319ZWxzZSBpZihhLmNoYW5nZT09PWRmKXtjPWEub2xkUGFyYW07aWYoImxpbmtEYXRhQXJyYXkiPT09YS5tb2RlbENoYW5nZSl7YT1hLm9sZFZhbHVlO0NhKGEpJiYibnVtYmVyIj09PXR5cGVvZiBjJiYoZD10aGlzLmljKGEpLGI/KHRoaXMuTWYuYWRkKGEpLHRoaXMuT2NbY10hPT1hJiZ0aGlzLk9jLnNwbGljZShjLDAsYSksdm9pZCAwIT09ZCYmdGhpcy5xYi5hZGQoZCxhKSk6KHRoaXMuTWYucmVtb3ZlKGEpLHRoaXMuT2NbY109PT1hJiZ0aGlzLk9jLnNwbGljZShjLDEpLHZvaWQgMCE9PWQmJnRoaXMucWIucmVtb3ZlKGQpKSk7cmV0dXJuO31pZigibGlua0xhYmVsS2V5cyI9PT1hLm1vZGVsQ2hhbmdlKXtkPXRoaXMucGcoYS5vYmplY3QpO0FycmF5LmlzQXJyYXkoZCkmJiJudW1iZXIiPT09dHlwZW9mIGMmJihiPzA+ZC5pbmRleE9mKGEubmV3VmFsdWUpJiZkLnNwbGljZShjLDAsYS5uZXdWYWx1ZSk6KGM9ZC5pbmRleE9mKGEubmV3VmFsdWUpLDA8PWMmJmQuc3BsaWNlKGMsMSkpKTtyZXR1cm47fX1aLnByb3RvdHlwZS5Sai5jYWxsKHRoaXMsYSxiKTt9O3QuZ209ZnVuY3Rpb24oYSl7aWYodm9pZCAwIT09YSl7dmFyIGI9dGhpcy4kaTtpZihudWxsIT09Yil7dmFyIGM9dGhpcy5SYihhKTtudWxsPT09YyYmKGM9dGhpcy5jb3B5Tm9kZURhdGEoYiksUGooYyx0aGlzLm5vZGVLZXlQcm9wZXJ0eSxhKSx0aGlzLmhmKGMpKTt9cmV0dXJuIGE7fX07dC5iej1mdW5jdGlvbihhKXtyZXR1cm4gZHEodGhpcyxhLCEwKTt9O3QuR3g9ZnVuY3Rpb24oYSxiKXtscSh0aGlzLGEsYiwhMCk7fTt0Lmd6PWZ1bmN0aW9uKGEpe3JldHVybiBkcSh0aGlzLGEsITEpO307dC5LeD1mdW5jdGlvbihhLGIpe2xxKHRoaXMsYSxiLCExKTt9O2Z1bmN0aW9uIGRxKGEsYixjKXtpZihudWxsIT09YiYmKGE9Yz9hLlRlOmEuVWUsIiIhPT1hJiYoYT1mbihiLGEpLHZvaWQgMCE9PWEpKSl7aWYoZnEoYSkpcmV0dXJuIGE7QSgoYz8iRnJvbUtleSI6IlRvS2V5IikrIiB2YWx1ZSBmb3IgbGluayBkYXRhICIrYisiIGlzIG5vdCBhIG51bWJlciBvciBhIHN0cmluZzogIithKTt9fWZ1bmN0aW9uIGxxKGEsYixjLGQpe251bGw9PT1jJiYoYz12b2lkIDApO2lmKG51bGwhPT1iKXt2YXIgZT1kP2EuVGU6YS5VZTtpZigiIiE9PWUpaWYoYz1hLmdtKGMpLGEuQWUoYikpe3ZhciBmPWZuKGIsZSk7ZiE9PWMmJihqcShhLGYsYiksUGooYixlLGMpLG51bGw9PT1hLlJiKGMpJiZrcShhLGMsYiksQXEoYSxkPyJsaW5rRnJvbUtleSI6ImxpbmtUb0tleSIsYWYsZSxiLGYsYyksInN0cmluZyI9PT10eXBlb2YgZSYmYS5FYShiLGUpKTt9ZWxzZSBQaihiLGUsYyk7fX10LmN6PWZ1bmN0aW9uKGEpe3JldHVybiBjcSh0aGlzLGEsITApO307dC5IeD1mdW5jdGlvbihhLGIpe21xKHRoaXMsYSxiLCEwKTt9O3QuaHo9ZnVuY3Rpb24oYSl7cmV0dXJuIGNxKHRoaXMsYSwhMSk7fTt0Lkx4PWZ1bmN0aW9uKGEsYil7bXEodGhpcyxhLGIsITEpO307ZnVuY3Rpb24gY3EoYSxiLGMpe2lmKG51bGw9PT1iKXJldHVybiIiO2E9Yz9hLnNqOmEudGo7aWYoIiI9PT1hKXJldHVybiIiO2I9Zm4oYixhKTtyZXR1cm4gdm9pZCAwPT09Yj8iIjpiO31mdW5jdGlvbiBtcShhLGIsYyxkKXtpZihudWxsIT09Yil7dmFyIGU9ZD9hLnNqOmEudGo7aWYoIiIhPT1lKWlmKGEuQWUoYikpe3ZhciBmPWZuKGIsZSk7dm9pZCAwPT09ZiYmKGY9IiIpO2YhPT1jJiYoUGooYixlLGMpLEFxKGEsZD8ibGlua0Zyb21Qb3J0SWQiOiJsaW5rVG9Qb3J0SWQiLGFmLGUsYixmLGMpLCJzdHJpbmciPT09dHlwZW9mIGUmJmEuRWEoYixlKSk7fWVsc2UgUGooYixlLGMpO319dC5wZz1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gRnE7dmFyIGI9dGhpcy5IZDtpZigiIj09PWIpcmV0dXJuIEZxO2E9Zm4oYSxiKTtyZXR1cm4gdm9pZCAwPT09YT9GcTphO307dC5Idj1mdW5jdGlvbihhLGIpe2lmKG51bGwhPT1hKXt2YXIgYz10aGlzLkhkO2lmKCIiIT09YylpZih0aGlzLkFlKGEpKXt2YXIgZD1mbihhLGMpO3ZvaWQgMD09PWQmJihkPUZxKTtpZihkIT09Yil7aWYoQXJyYXkuaXNBcnJheShkKSlmb3IodmFyIGU9ZC5sZW5ndGgsZj0wO2Y8ZTtmKyspe2pxKHRoaXMsZFtmXSxhKTt9UGooYSxjLGIpO2U9Yi5sZW5ndGg7Zm9yKGY9MDtmPGU7ZisrKXt2YXIgZz1iW2ZdO251bGw9PT10aGlzLlJiKGcpJiZrcSh0aGlzLGcsYSk7fUFxKHRoaXMsImxpbmtMYWJlbEtleXMiLGFmLGMsYSxkLGIpOyJzdHJpbmciPT09dHlwZW9mIGMmJnRoaXMuRWEoYSxjKTt9fWVsc2UgUGooYSxjLGIpO319O3QuR3U9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT09YiYmdm9pZCAwIT09YiYmbnVsbCE9PWEpe3ZhciBjPXRoaXMuSGQ7aWYoIiIhPT1jKXt2YXIgZD1mbihhLGMpO2lmKHZvaWQgMD09PWQpYz1bXSxjLnB1c2goYiksdGhpcy5IdihhLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShkKSl7dmFyIGU9ZC5pbmRleE9mKGIpOzA8PWV8fChlPWQubGVuZ3RoLGQucHVzaChiKSx0aGlzLkFlKGEpJiYobnVsbD09PXRoaXMuUmIoYikmJmtxKHRoaXMsYixhKSxBcSh0aGlzLCJsaW5rTGFiZWxLZXlzIixjZixjLGEsbnVsbCxiLG51bGwsZSkpKTt9ZWxzZSBBKGMrIiBwcm9wZXJ0eSBpcyBub3QgYW4gQXJyYXk7IGNhbm5vdCBhZGRMYWJlbEtleUZvckxpbmtEYXRhOiAiK2EpO319fTt0LkF4PWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9PWImJnZvaWQgMCE9PWImJm51bGwhPT1hKXt2YXIgYz10aGlzLkhkO2lmKCIiIT09Yyl7dmFyIGQ9Zm4oYSxjKTtpZihBcnJheS5pc0FycmF5KGQpKXt2YXIgZT1kLmluZGV4T2YoYik7MD5lfHwoZC5zcGxpY2UoZSwxKSx0aGlzLkFlKGEpJiYoanEodGhpcyxiLGEpLEFxKHRoaXMsImxpbmtMYWJlbEtleXMiLGRmLGMsYSxiLG51bGwsZSxudWxsKSkpO31lbHNlIHZvaWQgMCE9PWQmJkEoYysiIHByb3BlcnR5IGlzIG5vdCBhbiBBcnJheTsgY2Fubm90IHJlbW92ZUxhYmVsS2V5Zm9yTGlua0RhdGE6ICIrYSk7fX19O3QuaWM9ZnVuY3Rpb24oYSl7aWYobnVsbCE9PWEpe3ZhciBiPXRoaXMuaGk7aWYoIiIhPT1iJiYoYj1mbihhLGIpLHZvaWQgMCE9PWIpKXtpZihmcShiKSlyZXR1cm4gYjtBKCJLZXkgdmFsdWUgZm9yIGxpbmsgZGF0YSAiK2ErIiBpcyBub3QgYSBudW1iZXIgb3IgYSBzdHJpbmc6ICIrYik7fX19O3QudnQ9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT09YSl7dmFyIGM9dGhpcy5oaTtpZigiIiE9PWMpaWYodGhpcy5BZShhKSl7dmFyIGQ9Zm4oYSxjKTtkIT09YiYmbnVsbD09PXRoaXMud2goYikmJihQaihhLGMsYiksdm9pZCAwIT09ZCYmdGhpcy5xYi5yZW1vdmUoZCksdGhpcy5xYi5hZGQoYixhKSxBcSh0aGlzLCJsaW5rS2V5IixhZixjLGEsZCxiKSwic3RyaW5nIj09PXR5cGVvZiBjJiZ0aGlzLkVhKGEsYykpO31lbHNlIFBqKGEsYyxiKTt9fTt0LndoPWZ1bmN0aW9uKGEpe251bGw9PT1hJiZBKCJHcmFwaExpbmtzTW9kZWwuZmluZExpbmtEYXRhRm9yS2V5OmtleSBtdXN0IG5vdCBiZSBudWxsIik7cmV0dXJuIHZvaWQgMCE9PWEmJmZxKGEpP3RoaXMucWIuSihhKTpudWxsO307dC5lcT1mdW5jdGlvbihhKXtpZihudWxsIT09YSl7dmFyIGI9dGhpcy5oaTtpZigiIiE9PWIpe3ZhciBjPXRoaXMuaWMoYSk7aWYodm9pZCAwPT09Y3x8dGhpcy5xYi5jb250YWlucyhjKSl7dmFyIGQ9dGhpcy5wbDtpZihudWxsIT09ZCYmKGM9ZCh0aGlzLGEpLHZvaWQgMCE9PWMmJm51bGwhPT1jJiYhdGhpcy5xYi5jb250YWlucyhjKSkpe1BqKGEsYixjKTtyZXR1cm47fWlmKCJzdHJpbmciPT09dHlwZW9mIGMpe2ZvcihkPTI7dGhpcy5xYi5jb250YWlucyhjK2QpOyl7ZCsrO31QaihhLGIsYytkKTt9ZWxzZSBpZih2b2lkIDA9PT1jfHwibnVtYmVyIj09PXR5cGVvZiBjKXtmb3IoYz0tdGhpcy5xYi5jb3VudC0xO3RoaXMucWIuY29udGFpbnMoYyk7KXtjLS07fVBqKGEsYixjKTt9fX19fTt0LkFlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YT8hMTp0aGlzLk1mLmNvbnRhaW5zKGEpO307dC5BaT1mdW5jdGlvbihhKXtudWxsIT09YSYmKERiKGEpLHRoaXMuQWUoYSl8fGhxKHRoaXMsYSwhMCkpO307ZnVuY3Rpb24gaHEoYSxiLGMpe2lmKCIiIT09YS5saW5rS2V5UHJvcGVydHkpe3ZhciBkPWEuaWMoYik7aWYodm9pZCAwIT09ZCYmYS5xYi5KKGQpPT09YilyZXR1cm47YS5lcShiKTtkPWEuaWMoYik7aWYodm9pZCAwPT09ZCl7QSgiR3JhcGhMaW5rc01vZGVsLm1ha2VMaW5rRGF0YUtleVVuaXF1ZSBmYWlsZWQgb24gIitiKyIuIERhdGEgbm90IGFkZGVkIHRvIG1vZGVsLiIpO3JldHVybjt9YS5xYi5hZGQoZCxiKTt9YS5NZi5hZGQoYik7ZD1udWxsO2MmJihkPWEuT2MubGVuZ3RoLGEuT2Muc3BsaWNlKGQsMCxiKSk7QXEoYSwibGlua0RhdGFBcnJheSIsY2YsImxpbmtEYXRhQXJyYXkiLGEsbnVsbCxiLG51bGwsZCk7R3EoYSxiKTt9dC5qeT1mdW5jdGlvbihhKXtpZihBcnJheS5pc0FycmF5KGEpKWZvcih2YXIgYj1hLmxlbmd0aCxjPTA7YzxiO2MrKyl7dGhpcy5BaShhW2NdKTt9ZWxzZSBmb3IoYT1hLml0ZXJhdG9yO2EubmV4dCgpOyl7dGhpcy5BaShhLnZhbHVlKTt9fTt0Lm5tPWZ1bmN0aW9uKGEpe251bGwhPT1hJiZncSh0aGlzLGEsITApO307ZnVuY3Rpb24gZ3EoYSxiLGMpe2EuTWYucmVtb3ZlKGIpO3ZhciBkPWEuaWMoYik7dm9pZCAwIT09ZCYmYS5xYi5yZW1vdmUoZCk7ZD1udWxsO2lmKGMpe2Q9YS5PYy5pbmRleE9mKGIpO2lmKDA+ZClyZXR1cm47YS5PYy5zcGxpY2UoZCwxKTt9QXEoYSwibGlua0RhdGFBcnJheSIsZGYsImxpbmtEYXRhQXJyYXkiLGEsYixudWxsLGQsbnVsbCk7Yz1kcShhLGIsITApO2pxKGEsYyxiKTtjPWRxKGEsYiwhMSk7anEoYSxjLGIpO2Q9YS5wZyhiKTtpZihBcnJheS5pc0FycmF5KGQpKWZvcih2YXIgZT1kLmxlbmd0aCxmPTA7ZjxlO2YrKyl7Yz1kW2ZdLGpxKGEsYyxiKTt9fXQuTXo9ZnVuY3Rpb24oYSl7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspe3RoaXMubm0oYVtjXSk7fWVsc2UgZm9yKGE9YS5pdGVyYXRvcjthLm5leHQoKTspe3RoaXMubm0oYS52YWx1ZSk7fX07dC5Eej1mdW5jdGlvbihhKXtpZihFYShhKSl7Zm9yKHZhciBiPW5ldyBGKHRoaXMucWIuaXRlcmF0b3JLZXlzKSxjPW5ldyBGKCksZD1hLmxlbmd0aCxlPTA7ZTxkO2UrKyl7dmFyIGY9YVtlXSxnPXRoaXMuaWMoZik7aWYodm9pZCAwIT09Zyl7Yy5hZGQoZyk7dmFyIGg9dGhpcy53aChnKTtudWxsIT09aD90aGlzLlFqKGgsZik6KGg9e30sdGhpcy52dChoLGcpLHRoaXMuUWooaCxmKSx0aGlzLkFpKGgpKTt9ZWxzZSB0aGlzLkFpKGYpLGMuYWRkKHRoaXMuaWMoZikpO31mb3IoYT1iLml0ZXJhdG9yO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGMuY29udGFpbnMoYil8fChiPXRoaXMud2goYikpJiZ0aGlzLm5tKGIpO319fTtmdW5jdGlvbiBHcShhLGIpe3ZhciBjPWRxKGEsYiwhMCk7Yz1hLmdtKGMpO251bGw9PT1hLlJiKGMpJiZrcShhLGMsYik7Yz1kcShhLGIsITEpO2M9YS5nbShjKTtudWxsPT09YS5SYihjKSYma3EoYSxjLGIpO3ZhciBkPWEucGcoYik7aWYoQXJyYXkuaXNBcnJheShkKSlmb3IodmFyIGU9ZC5sZW5ndGgsZj0wO2Y8ZTtmKyspe2M9ZFtmXSxudWxsPT09YS5SYihjKSYma3EoYSxjLGIpO319dC5PcD1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDt2YXIgYj10aGlzLkhrO2E9bnVsbCE9PWI/YihhLHRoaXMpOkJxKHRoaXMsYSwhMCk7Q2EoYSkmJihtYihhKSwiIiE9PXRoaXMuVGUmJlBqKGEsdGhpcy5UZSx2b2lkIDApLCIiIT09dGhpcy5VZSYmUGooYSx0aGlzLlVlLHZvaWQgMCksIiIhPT10aGlzLkhkJiZQaihhLHRoaXMuSGQsW10pKTtyZXR1cm4gYTt9O3Qua3Y9ZnVuY3Rpb24oYSl7aWYobnVsbD09PWEpcmV0dXJuITE7dmFyIGI9dGhpcy50bDtyZXR1cm4iIj09PWI/ITE6Zm4oYSxiKT8hMDohMTt9O3QuS2k9ZnVuY3Rpb24oYSl7aWYobnVsbCE9PWEpe3ZhciBiPXRoaXMucWU7aWYoIiIhPT1iJiYoYj1mbihhLGIpLHZvaWQgMCE9PWIpKXtpZihmcShiKSlyZXR1cm4gYjtBKCJHcm91cEtleSB2YWx1ZSBmb3Igbm9kZSBkYXRhICIrYSsiIGlzIG5vdCBhIG51bWJlciBvciBhIHN0cmluZzogIitiKTt9fX07dC51dD1mdW5jdGlvbihhLGIpe251bGw9PT1iJiYoYj12b2lkIDApO2lmKG51bGwhPT1hKXt2YXIgYz10aGlzLnFlO2lmKCIiIT09YylpZih0aGlzLlFiKGEpKXt2YXIgZD1mbihhLGMpO2QhPT1iJiYoanEodGhpcyxkLGEpLFBqKGEsYyxiKSxudWxsPT09dGhpcy5SYihiKSYma3EodGhpcyxiLGEpLEFxKHRoaXMsIm5vZGVHcm91cEtleSIsYWYsYyxhLGQsYiksInN0cmluZyI9PT10eXBlb2YgYyYmdGhpcy5FYShhLGMpKTt9ZWxzZSBQaihhLGMsYik7fX07RXEucHJvdG90eXBlLmNvcHlOb2RlRGF0YT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDthPVoucHJvdG90eXBlLmNvcHlOb2RlRGF0YS5jYWxsKHRoaXMsYSk7dGhpcy5Wanx8IiI9PT10aGlzLnFlfHx2b2lkIDA9PT1mbihhLHRoaXMucWUpfHxQaihhLHRoaXMucWUsdm9pZCAwKTtyZXR1cm4gYTt9O0VxLnByb3RvdHlwZS5zZXREYXRhUHJvcGVydHk9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuUWIoYSkpe2lmKGI9PT10aGlzLm5vZGVLZXlQcm9wZXJ0eSl0aGlzLnZtKGEsYyk7ZWxzZXtpZihiPT09dGhpcy5ub2RlQ2F0ZWdvcnlQcm9wZXJ0eSl7dGhpcy5wcShhLGMpO3JldHVybjt9aWYoYj09PXRoaXMubm9kZUdyb3VwS2V5UHJvcGVydHkpe3RoaXMudXQoYSxjKTtyZXR1cm47fX19ZWxzZSBpZih0aGlzLkFlKGEpKXtpZihiPT09dGhpcy5saW5rRnJvbUtleVByb3BlcnR5KXtscSh0aGlzLGEsYywhMCk7cmV0dXJuO31pZihiPT09dGhpcy5saW5rVG9LZXlQcm9wZXJ0eSl7bHEodGhpcyxhLGMsITEpO3JldHVybjt9aWYoYj09PXRoaXMubGlua0Zyb21Qb3J0SWRQcm9wZXJ0eSl7bXEodGhpcyxhLGMsITApO3JldHVybjt9aWYoYj09PXRoaXMubGlua1RvUG9ydElkUHJvcGVydHkpe21xKHRoaXMsYSxjLCExKTtyZXR1cm47fWlmKGI9PT10aGlzLmxpbmtLZXlQcm9wZXJ0eSl7dGhpcy52dChhLGMpO3JldHVybjt9aWYoYj09PXRoaXMubGlua0NhdGVnb3J5UHJvcGVydHkpe3RoaXMudHQoYSxjKTtyZXR1cm47fWlmKGI9PT10aGlzLmxpbmtMYWJlbEtleXNQcm9wZXJ0eSl7dGhpcy5IdihhLGMpO3JldHVybjt9fXZhciBkPWZuKGEsYik7ZCE9PWMmJihQaihhLGIsYyksdGhpcy5tdChhLGIsZCxjKSk7fTt0PUVxLnByb3RvdHlwZTt0LlFqPWZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9dGhpcy5RYihhKSxkPXRoaXMuQWUoYSksZTtmb3IoZSBpbiBiKXsiX19nb2hhc2hpZCI9PT1lfHxjJiZlPT09dGhpcy5ub2RlS2V5UHJvcGVydHl8fGQmJmU9PT10aGlzLmxpbmtLZXlQcm9wZXJ0eXx8dGhpcy5zZXREYXRhUHJvcGVydHkoYSxlLGJbZV0pO319fTt0Lm5xPWZ1bmN0aW9uKGEsYil7Wi5wcm90b3R5cGUubnEuY2FsbCh0aGlzLGEsYik7Zm9yKHZhciBjPXRoaXMuY2IuaXRlcmF0b3I7Yy5uZXh0KCk7KXt0aGlzLkJ2KGMudmFsdWUsYSxiKTt9Zm9yKGM9dGhpcy5NZi5pdGVyYXRvcjtjLm5leHQoKTspe3ZhciBkPWMudmFsdWUsZT1hLGY9YjtpZihkcSh0aGlzLGQsITApPT09ZSl7dmFyIGc9dGhpcy5UZTtQaihkLGcsZik7QXEodGhpcywibGlua0Zyb21LZXkiLGFmLGcsZCxlLGYpOyJzdHJpbmciPT09dHlwZW9mIGcmJnRoaXMuRWEoZCxnKTt9ZHEodGhpcyxkLCExKT09PWUmJihnPXRoaXMuVWUsUGooZCxnLGYpLEFxKHRoaXMsImxpbmtUb0tleSIsYWYsZyxkLGUsZiksInN0cmluZyI9PT10eXBlb2YgZyYmdGhpcy5FYShkLGcpKTtnPXRoaXMucGcoZCk7aWYoQXJyYXkuaXNBcnJheShnKSlmb3IodmFyIGg9Zy5sZW5ndGgsaz10aGlzLkhkLGw9MDtsPGg7bCsrKXtnW2xdPT09ZSYmKGdbbF09ZixBcSh0aGlzLCJsaW5rTGFiZWxLZXlzIixjZixrLGQsZSxmLGwsbCkpO319fTt0LkJ2PWZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLktpKGEpPT09Yil7dmFyIGQ9dGhpcy5xZTtQaihhLGQsYyk7QXEodGhpcywibm9kZUdyb3VwS2V5IixhZixkLGEsYixjKTsic3RyaW5nIj09PXR5cGVvZiBkJiZ0aGlzLkVhKGEsZCk7fX07dC5Xdj1mdW5jdGlvbigpe1oucHJvdG90eXBlLld2LmNhbGwodGhpcyk7Zm9yKHZhciBhPXRoaXMubGlua0RhdGFBcnJheSxiPWEubGVuZ3RoLGM9MDtjPGI7YysrKXtHcSh0aGlzLGFbY10pO319O3Qucm09ZnVuY3Rpb24oYSl7Wi5wcm90b3R5cGUucm0uY2FsbCh0aGlzLGEpO2E9dGhpcy5wYShhKTt2YXIgYj1pcSh0aGlzLGEpO2lmKG51bGwhPT1iKXt2YXIgYz1LYSgpO2ZvcihiPWIuaXRlcmF0b3I7Yi5uZXh0KCk7KXt2YXIgZD1iLnZhbHVlO2lmKHRoaXMuUWIoZCkpe2lmKHRoaXMuS2koZCk9PT1hKXt2YXIgZT10aGlzLnFlO0FxKHRoaXMsIm5vZGVHcm91cEtleSIsYWYsZSxkLGEsYSk7InN0cmluZyI9PT10eXBlb2YgZSYmdGhpcy5FYShkLGUpO2MucHVzaChkKTt9fWVsc2UgaWYoZHEodGhpcyxkLCEwKT09PWEmJihlPXRoaXMuVGUsQXEodGhpcywibGlua0Zyb21LZXkiLGFmLGUsZCxhLGEpLCJzdHJpbmciPT09dHlwZW9mIGUmJnRoaXMuRWEoZCxlKSxjLnB1c2goZCkpLGRxKHRoaXMsZCwhMSk9PT1hJiYoZT10aGlzLlVlLEFxKHRoaXMsImxpbmtUb0tleSIsYWYsZSxkLGEsYSksInN0cmluZyI9PT10eXBlb2YgZSYmdGhpcy5FYShkLGUpLGMucHVzaChkKSksZT10aGlzLnBnKGQpLEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBmPWUubGVuZ3RoLGc9dGhpcy5IZCxoPTA7aDxmO2grKyl7ZVtoXT09PWEmJihBcSh0aGlzLCJsaW5rTGFiZWxLZXlzIixjZixnLGQsYSxhLGgsaCksYy5wdXNoKGQpKTt9fWZvcihiPTA7YjxjLmxlbmd0aDtiKyspe2pxKHRoaXMsYSxjW2JdKTt9T2EoYyk7fX07dC5xbT1mdW5jdGlvbihhKXtaLnByb3RvdHlwZS5xbS5jYWxsKHRoaXMsYSk7dmFyIGI9dGhpcy5LaShhKTtudWxsPT09dGhpcy5SYihiKSYma3EodGhpcyxiLGEpO307dC5zcT1mdW5jdGlvbihhKXtaLnByb3RvdHlwZS5zcS5jYWxsKHRoaXMsYSk7dmFyIGI9dGhpcy5LaShhKTtqcSh0aGlzLGIsYSk7fTt0LmF2PWZ1bmN0aW9uKGEpe2lmKG51bGw9PT1hKXJldHVybiIiO3ZhciBiPXRoaXMucmo7aWYoIiI9PT1iKXJldHVybiIiO2I9Zm4oYSxiKTtpZih2b2lkIDA9PT1iKXJldHVybiIiO2lmKCJzdHJpbmciPT09dHlwZW9mIGIpcmV0dXJuIGI7QSgiZ2V0Q2F0ZWdvcnlGb3JMaW5rRGF0YSBmb3VuZCBhIG5vbi1zdHJpbmcgY2F0ZWdvcnkgZm9yICIrYSsiOiAiK2IpO3JldHVybiIiO307RXEucHJvdG90eXBlLmdldExpbmtDYXRlZ29yeUZvckRhdGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXYoYSk7fTtFcS5wcm90b3R5cGUudHQ9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT09YSl7dmFyIGM9dGhpcy5yajtpZigiIiE9PWMpaWYodGhpcy5BZShhKSl7dmFyIGQ9Zm4oYSxjKTt2b2lkIDA9PT1kJiYoZD0iIik7ZCE9PWImJihQaihhLGMsYiksQXEodGhpcywibGlua0NhdGVnb3J5IixhZixjLGEsZCxiKSwic3RyaW5nIj09PXR5cGVvZiBjJiZ0aGlzLkVhKGEsYykpO31lbHNlIFBqKGEsYyxiKTt9fTtFcS5wcm90b3R5cGUuc2V0TGlua0NhdGVnb3J5Rm9yRGF0YT1mdW5jdGlvbihhLGIpe3RoaXMudHQoYSxiKTt9O0VxLnByb3RvdHlwZS5jaz1mdW5jdGlvbigpe3JldHVybiEwO307RXEucHJvdG90eXBlLmVtPWZ1bmN0aW9uKCl7cmV0dXJuITA7fTtFcS5wcm90b3R5cGUuZHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMDt9O0VxLnByb3RvdHlwZS5kaz1mdW5jdGlvbigpe3JldHVybiEwO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRXEucHJvdG90eXBlLHthcmNoZXR5cGVOb2RlRGF0YTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLiRpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLiRpO2IhPT1hJiYodGhpcy4kaT1hLHRoaXMuZygiYXJjaGV0eXBlTm9kZURhdGEiLGIsYSkpO319LGxpbmtGcm9tS2V5UHJvcGVydHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5UZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5UZTtiIT09YSYmKHRoaXMuVGU9YSx0aGlzLmcoImxpbmtGcm9tS2V5UHJvcGVydHkiLGIsYSkpO319LGxpbmtUb0tleVByb3BlcnR5OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVWU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuVWU7YiE9PWEmJih0aGlzLlVlPWEsdGhpcy5nKCJsaW5rVG9LZXlQcm9wZXJ0eSIsYixhKSk7fX0sbGlua0Zyb21Qb3J0SWRQcm9wZXJ0eTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnNqO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnNqO2IhPT1hJiYodGhpcy5zaj1hLHRoaXMuZygibGlua0Zyb21Qb3J0SWRQcm9wZXJ0eSIsYixhKSk7fX0sbGlua1RvUG9ydElkUHJvcGVydHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy50ajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy50ajtiIT09YSYmKHRoaXMudGo9YSx0aGlzLmcoImxpbmtUb1BvcnRJZFByb3BlcnR5IixiLGEpKTt9fSxsaW5rTGFiZWxLZXlzUHJvcGVydHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5IZDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5IZDtiIT09YSYmKHRoaXMuSGQ9YSx0aGlzLmcoImxpbmtMYWJlbEtleXNQcm9wZXJ0eSIsYixhKSk7fX0sbGlua0RhdGFBcnJheTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk9jO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLk9jO2lmKGIhPT1hKXt0aGlzLnFiLmNsZWFyKCk7Zm9yKHZhciBjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXt2YXIgZT1hW2RdO2lmKCFDYShlKSl7QSgiR3JhcGhMaW5rc01vZGVsLmxpbmtEYXRhQXJyYXkgbXVzdCBvbmx5IGNvbnRhaW4gT2JqZWN0cywgbm90OiAiK2UpO3JldHVybjt9RGIoZSk7fXRoaXMuT2M9YTtpZigiIiE9PXRoaXMubGlua0tleVByb3BlcnR5KXtkPW5ldyBFKCk7Zm9yKGU9MDtlPGM7ZSsrKXt2YXIgZj1hW2VdLGc9dGhpcy5pYyhmKTt2b2lkIDA9PT1nP2QuYWRkKGYpOm51bGwhPT10aGlzLnFiLkooZyk/ZC5hZGQoZik6dGhpcy5xYi5hZGQoZyxmKTt9Zm9yKGQ9ZC5pdGVyYXRvcjtkLm5leHQoKTspe2U9ZC52YWx1ZSx0aGlzLmVxKGUpLGY9dGhpcy5pYyhlKSx2b2lkIDAhPT1mJiZ0aGlzLnFiLmFkZChmLGUpO319ZD1uZXcgRigpO2ZvcihlPTA7ZTxjO2UrKyl7ZC5hZGQoYVtlXSk7fXRoaXMuTWY9ZDtBcSh0aGlzLCJsaW5rRGF0YUFycmF5IixhZiwibGlua0RhdGFBcnJheSIsdGhpcyxiLGEpO2ZvcihiPTA7YjxjO2IrKyl7R3EodGhpcyxhW2JdKTt9fX19LGxpbmtLZXlQcm9wZXJ0eTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmhpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLmhpO2lmKGIhPT1hKXt0aGlzLmhpPWE7dGhpcy5xYi5jbGVhcigpO2Zvcih2YXIgYz10aGlzLmxpbmtEYXRhQXJyYXkubGVuZ3RoLGQ9MDtkPGM7ZCsrKXt2YXIgZT10aGlzLmxpbmtEYXRhQXJyYXlbZF0sZj10aGlzLmljKGUpO3ZvaWQgMD09PWYmJih0aGlzLmVxKGUpLGY9dGhpcy5pYyhlKSk7dm9pZCAwIT09ZiYmdGhpcy5xYi5hZGQoZixlKTt9dGhpcy5nKCJsaW5rS2V5UHJvcGVydHkiLGIsYSk7fX19LG1ha2VVbmlxdWVMaW5rS2V5RnVuY3Rpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5wbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5wbDtiIT09YSYmKHRoaXMucGw9YSx0aGlzLmcoIm1ha2VVbmlxdWVMaW5rS2V5RnVuY3Rpb24iLGIsYSkpO319LGNvcHlMaW5rRGF0YUZ1bmN0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSGs7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3ZhciBiPXRoaXMuSGs7YiE9PWEmJih0aGlzLkhrPWEsdGhpcy5nKCJjb3B5TGlua0RhdGFGdW5jdGlvbiIsYixhKSk7fX0sbm9kZUlzR3JvdXBQcm9wZXJ0eTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnRsO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnRsO2IhPT1hJiYodGhpcy50bD1hLHRoaXMuZygibm9kZUlzR3JvdXBQcm9wZXJ0eSIsYixhKSk7fX0sbm9kZUdyb3VwS2V5UHJvcGVydHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5xZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5xZTtiIT09YSYmKHRoaXMucWU9YSx0aGlzLmcoIm5vZGVHcm91cEtleVByb3BlcnR5IixiLGEpKTt9fSxWajp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmRuO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmRuIT09YSYmKHRoaXMuZG49YSk7fX0sbGlua0NhdGVnb3J5UHJvcGVydHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5yajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy5yajtiIT09YSYmKHRoaXMucmo9YSx0aGlzLmcoImxpbmtDYXRlZ29yeVByb3BlcnR5IixiLGEpKTt9fX0pO3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEVxLHt0eXBlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIkdyYXBoTGlua3NNb2RlbCI7fX19KTtFcS5wcm90b3R5cGUuc2V0Q2F0ZWdvcnlGb3JMaW5rRGF0YT1FcS5wcm90b3R5cGUudHQ7RXEucHJvdG90eXBlLmdldENhdGVnb3J5Rm9yTGlua0RhdGE9RXEucHJvdG90eXBlLmF2O0VxLnByb3RvdHlwZS5hc3NpZ25BbGxEYXRhUHJvcGVydGllcz1FcS5wcm90b3R5cGUuUWo7RXEucHJvdG90eXBlLnNldEdyb3VwS2V5Rm9yTm9kZURhdGE9RXEucHJvdG90eXBlLnV0O0VxLnByb3RvdHlwZS5nZXRHcm91cEtleUZvck5vZGVEYXRhPUVxLnByb3RvdHlwZS5LaTtFcS5wcm90b3R5cGUuaXNHcm91cEZvck5vZGVEYXRhPUVxLnByb3RvdHlwZS5rdjtFcS5wcm90b3R5cGUuY29weUxpbmtEYXRhPUVxLnByb3RvdHlwZS5PcDtFcS5wcm90b3R5cGUubWVyZ2VMaW5rRGF0YUFycmF5PUVxLnByb3RvdHlwZS5EejtFcS5wcm90b3R5cGUucmVtb3ZlTGlua0RhdGFDb2xsZWN0aW9uPUVxLnByb3RvdHlwZS5NejtFcS5wcm90b3R5cGUucmVtb3ZlTGlua0RhdGE9RXEucHJvdG90eXBlLm5tO0VxLnByb3RvdHlwZS5hZGRMaW5rRGF0YUNvbGxlY3Rpb249RXEucHJvdG90eXBlLmp5O0VxLnByb3RvdHlwZS5hZGRMaW5rRGF0YT1FcS5wcm90b3R5cGUuQWk7RXEucHJvdG90eXBlLmNvbnRhaW5zTGlua0RhdGE9RXEucHJvdG90eXBlLkFlO0VxLnByb3RvdHlwZS5tYWtlTGlua0RhdGFLZXlVbmlxdWU9RXEucHJvdG90eXBlLmVxO0VxLnByb3RvdHlwZS5maW5kTGlua0RhdGFGb3JLZXk9RXEucHJvdG90eXBlLndoO0VxLnByb3RvdHlwZS5zZXRLZXlGb3JMaW5rRGF0YT1FcS5wcm90b3R5cGUudnQ7RXEucHJvdG90eXBlLmdldEtleUZvckxpbmtEYXRhPUVxLnByb3RvdHlwZS5pYztFcS5wcm90b3R5cGUucmVtb3ZlTGFiZWxLZXlGb3JMaW5rRGF0YT1FcS5wcm90b3R5cGUuQXg7RXEucHJvdG90eXBlLmFkZExhYmVsS2V5Rm9yTGlua0RhdGE9RXEucHJvdG90eXBlLkd1O0VxLnByb3RvdHlwZS5zZXRMYWJlbEtleXNGb3JMaW5rRGF0YT1FcS5wcm90b3R5cGUuSHY7RXEucHJvdG90eXBlLmdldExhYmVsS2V5c0ZvckxpbmtEYXRhPUVxLnByb3RvdHlwZS5wZztFcS5wcm90b3R5cGUuc2V0VG9Qb3J0SWRGb3JMaW5rRGF0YT1FcS5wcm90b3R5cGUuTHg7RXEucHJvdG90eXBlLmdldFRvUG9ydElkRm9yTGlua0RhdGE9RXEucHJvdG90eXBlLmh6O0VxLnByb3RvdHlwZS5zZXRGcm9tUG9ydElkRm9yTGlua0RhdGE9RXEucHJvdG90eXBlLkh4O0VxLnByb3RvdHlwZS5nZXRGcm9tUG9ydElkRm9yTGlua0RhdGE9RXEucHJvdG90eXBlLmN6O0VxLnByb3RvdHlwZS5zZXRUb0tleUZvckxpbmtEYXRhPUVxLnByb3RvdHlwZS5LeDtFcS5wcm90b3R5cGUuZ2V0VG9LZXlGb3JMaW5rRGF0YT1FcS5wcm90b3R5cGUuZ3o7RXEucHJvdG90eXBlLnNldEZyb21LZXlGb3JMaW5rRGF0YT1FcS5wcm90b3R5cGUuR3g7RXEucHJvdG90eXBlLmdldEZyb21LZXlGb3JMaW5rRGF0YT1FcS5wcm90b3R5cGUuYno7RXEucHJvdG90eXBlLmNsZWFyPUVxLnByb3RvdHlwZS5jbGVhcjt2YXIgRnE9T2JqZWN0LmZyZWV6ZShbXSk7RXEuY2xhc3NOYW1lPSJHcmFwaExpbmtzTW9kZWwiO3lxLkdyYXBoTGlua3NNb2RlbD1FcTtaLmNvbnN0cnVjdEdyYXBoTGlua3NNb2RlbD1aLmNvbnN0cnVjdEdyYXBoTGlua3NNb2RlbD1mdW5jdGlvbigpe3JldHVybiBuZXcgRXEoKTt9O1ouaW5pdERpYWdyYW1Nb2RlbD14aT1mdW5jdGlvbiB4aSgpe3JldHVybiBuZXcgRXEoKTt9O2Z1bmN0aW9uIEhxKGEpe1ouY2FsbCh0aGlzKTt0aGlzLnJlPSJwYXJlbnQiO3RoaXMuZm49ITE7dGhpcy56aj0icGFyZW50TGlua0NhdGVnb3J5Ijt2b2lkIDAhPT1hJiYodGhpcy5ub2RlRGF0YUFycmF5PWEpO31vYShIcSxaKTtIcS5jb25zdHJ1Y3RHcmFwaExpbmtzTW9kZWw9Wi5jb25zdHJ1Y3RHcmFwaExpbmtzTW9kZWw7SHEucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkPWZ1bmN0aW9uKGEpe1oucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkLmNhbGwodGhpcyxhKTthLnJlPXRoaXMucmU7YS5mbj10aGlzLmZuO2Euemo9dGhpcy56ajt9O3Q9SHEucHJvdG90eXBlO3QudG9TdHJpbmc9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9MCk7aWYoMjw9YSlyZXR1cm4gdGhpcy5ycSgpO3ZhciBiPSgiIiE9PXRoaXMubmFtZT90aGlzLm5hbWU6IiIpKyIgVHJlZU1vZGVsIjtpZigwPGEpe2IrPSJcbiBub2RlIGRhdGE6IjthPXRoaXMubm9kZURhdGFBcnJheTtmb3IodmFyIGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe3ZhciBlPWFbZF07Yis9IiAiK3RoaXMucGEoZSkrIjoiK1FhKGUpO319cmV0dXJuIGI7fTt0LnNrPWZ1bmN0aW9uKCl7dmFyIGE9Wi5wcm90b3R5cGUuc2suY2FsbCh0aGlzKSxiPSIiOyJwYXJlbnQiIT09dGhpcy5ub2RlUGFyZW50S2V5UHJvcGVydHkmJiJzdHJpbmciPT09dHlwZW9mIHRoaXMubm9kZVBhcmVudEtleVByb3BlcnR5JiYoYis9JyxcbiAgIm5vZGVQYXJlbnRLZXlQcm9wZXJ0eSI6ICcrdGhpcy5xdW90ZSh0aGlzLm5vZGVQYXJlbnRLZXlQcm9wZXJ0eSkpO3JldHVybiBhK2I7fTt0LmtxPWZ1bmN0aW9uKGEpe1oucHJvdG90eXBlLmtxLmNhbGwodGhpcyxhKTthLm5vZGVQYXJlbnRLZXlQcm9wZXJ0eSYmKHRoaXMubm9kZVBhcmVudEtleVByb3BlcnR5PWEubm9kZVBhcmVudEtleVByb3BlcnR5KTt9O3QudnE9ZnVuY3Rpb24oYSl7dnEodGhpcyxhLCJub2RlUGFyZW50S2V5UHJvcGVydHkiKTtyZXR1cm4gWi5wcm90b3R5cGUudnEuY2FsbCh0aGlzLGEpO307dC5nbT1mdW5jdGlvbihhKXtyZXR1cm4gYTt9O3QuTWk9ZnVuY3Rpb24oYSl7aWYobnVsbCE9PWEpe3ZhciBiPXRoaXMucmU7aWYoIiIhPT1iJiYoYj1mbihhLGIpLHZvaWQgMCE9PWIpKXtpZihmcShiKSlyZXR1cm4gYjtBKCJQYXJlbnRLZXkgdmFsdWUgZm9yIG5vZGUgZGF0YSAiK2ErIiBpcyBub3QgYSBudW1iZXIgb3IgYSBzdHJpbmc6ICIrYik7fX19O3QuSGU9ZnVuY3Rpb24oYSxiKXtudWxsPT09YiYmKGI9dm9pZCAwKTtpZihudWxsIT09YSl7dmFyIGM9dGhpcy5yZTtpZigiIiE9PWMpaWYoYj10aGlzLmdtKGIpLHRoaXMuUWIoYSkpe3ZhciBkPWZuKGEsYyk7ZCE9PWImJihqcSh0aGlzLGQsYSksUGooYSxjLGIpLG51bGw9PT10aGlzLlJiKGIpJiZrcSh0aGlzLGIsYSksQXEodGhpcywibm9kZVBhcmVudEtleSIsYWYsYyxhLGQsYiksInN0cmluZyI9PT10eXBlb2YgYyYmdGhpcy5FYShhLGMpKTt9ZWxzZSBQaihhLGMsYik7fX07dC5idj1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4iIjt2YXIgYj10aGlzLnpqO2lmKCIiPT09YilyZXR1cm4iIjtiPWZuKGEsYik7aWYodm9pZCAwPT09YilyZXR1cm4iIjtpZigic3RyaW5nIj09PXR5cGVvZiBiKXJldHVybiBiO0EoImdldFBhcmVudExpbmtDYXRlZ29yeUZvck5vZGVEYXRhIGZvdW5kIGEgbm9uLXN0cmluZyBjYXRlZ29yeSBmb3IgIithKyI6ICIrYik7cmV0dXJuIiI7fTtIcS5wcm90b3R5cGUuZ2V0TGlua0NhdGVnb3J5Rm9yRGF0YT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5idihhKTt9O0hxLnByb3RvdHlwZS5Jdj1mdW5jdGlvbihhLGIpe2lmKG51bGwhPT1hKXt2YXIgYz10aGlzLnpqO2lmKCIiIT09YylpZih0aGlzLlFiKGEpKXt2YXIgZD1mbihhLGMpO3ZvaWQgMD09PWQmJihkPSIiKTtkIT09YiYmKFBqKGEsYyxiKSxBcSh0aGlzLCJwYXJlbnRMaW5rQ2F0ZWdvcnkiLGFmLGMsYSxkLGIpLCJzdHJpbmciPT09dHlwZW9mIGMmJnRoaXMuRWEoYSxjKSk7fWVsc2UgUGooYSxjLGIpO319O0hxLnByb3RvdHlwZS5zZXRMaW5rQ2F0ZWdvcnlGb3JEYXRhPWZ1bmN0aW9uKGEsYil7dGhpcy5JdihhLGIpO307SHEucHJvdG90eXBlLmNvcHlOb2RlRGF0YT1mdW5jdGlvbihhKXtpZihudWxsPT09YSlyZXR1cm4gbnVsbDthPVoucHJvdG90eXBlLmNvcHlOb2RlRGF0YS5jYWxsKHRoaXMsYSk7dGhpcy5Xanx8IiI9PT10aGlzLnJlfHx2b2lkIDA9PT1mbihhLHRoaXMucmUpfHxQaihhLHRoaXMucmUsdm9pZCAwKTtyZXR1cm4gYTt9O0hxLnByb3RvdHlwZS5zZXREYXRhUHJvcGVydHk9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuUWIoYSkpaWYoYj09PXRoaXMubm9kZUtleVByb3BlcnR5KXRoaXMudm0oYSxjKTtlbHNle2lmKGI9PT10aGlzLm5vZGVDYXRlZ29yeVByb3BlcnR5KXt0aGlzLnBxKGEsYyk7cmV0dXJuO31pZihiPT09dGhpcy5ub2RlUGFyZW50S2V5UHJvcGVydHkpe3RoaXMuSGUoYSxjKTtyZXR1cm47fX12YXIgZD1mbihhLGIpO2QhPT1jJiYoUGooYSxiLGMpLHRoaXMubXQoYSxiLGQsYykpO307dD1IcS5wcm90b3R5cGU7dC5ucT1mdW5jdGlvbihhLGIpe1oucHJvdG90eXBlLm5xLmNhbGwodGhpcyxhLGIpO2Zvcih2YXIgYz10aGlzLmNiLml0ZXJhdG9yO2MubmV4dCgpOyl7dGhpcy5CdihjLnZhbHVlLGEsYik7fX07dC5Cdj1mdW5jdGlvbihhLGIsYyl7aWYodGhpcy5NaShhKT09PWIpe3ZhciBkPXRoaXMucmU7UGooYSxkLGMpO0FxKHRoaXMsIm5vZGVQYXJlbnRLZXkiLGFmLGQsYSxiLGMpOyJzdHJpbmciPT09dHlwZW9mIGQmJnRoaXMuRWEoYSxkKTt9fTt0LnJtPWZ1bmN0aW9uKGEpe1oucHJvdG90eXBlLnJtLmNhbGwodGhpcyxhKTthPXRoaXMucGEoYSk7dmFyIGI9aXEodGhpcyxhKTtpZihudWxsIT09Yil7dmFyIGM9S2EoKTtmb3IoYj1iLml0ZXJhdG9yO2IubmV4dCgpOyl7dmFyIGQ9Yi52YWx1ZTtpZih0aGlzLlFiKGQpJiZ0aGlzLk1pKGQpPT09YSl7dmFyIGU9dGhpcy5yZTtBcSh0aGlzLCJub2RlUGFyZW50S2V5IixhZixlLGQsYSxhKTsic3RyaW5nIj09PXR5cGVvZiBlJiZ0aGlzLkVhKGQsZSk7Yy5wdXNoKGQpO319Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7anEodGhpcyxhLGNbYl0pO31PYShjKTt9fTt0LnFtPWZ1bmN0aW9uKGEpe1oucHJvdG90eXBlLnFtLmNhbGwodGhpcyxhKTt2YXIgYj10aGlzLk1pKGEpO2I9dGhpcy5nbShiKTtudWxsPT09dGhpcy5SYihiKSYma3EodGhpcyxiLGEpO307dC5zcT1mdW5jdGlvbihhKXtaLnByb3RvdHlwZS5zcS5jYWxsKHRoaXMsYSk7dmFyIGI9dGhpcy5NaShhKTtqcSh0aGlzLGIsYSk7fTt0LmZtPWZ1bmN0aW9uKCl7cmV0dXJuITA7fTt0LmR0PWZ1bmN0aW9uKCl7cmV0dXJuITA7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhIcS5wcm90b3R5cGUse25vZGVQYXJlbnRLZXlQcm9wZXJ0eTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnJlO30sc2V0OmZ1bmN0aW9uIHNldChhKXt2YXIgYj10aGlzLnJlO2IhPT1hJiYodGhpcy5yZT1hLHRoaXMuZygibm9kZVBhcmVudEtleVByb3BlcnR5IixiLGEpKTt9fSxXajp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmZuO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmZuIT09YSYmKHRoaXMuZm49YSk7fX0scGFyZW50TGlua0NhdGVnb3J5UHJvcGVydHk6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy56ajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dmFyIGI9dGhpcy56ajtiIT09YSYmKHRoaXMuemo9YSx0aGlzLmcoInBhcmVudExpbmtDYXRlZ29yeVByb3BlcnR5IixiLGEpKTt9fSxsaW5rQ2F0ZWdvcnlQcm9wZXJ0eTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnBhcmVudExpbmtDYXRlZ29yeVByb3BlcnR5O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnBhcmVudExpbmtDYXRlZ29yeVByb3BlcnR5PWE7fX19KTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhIcSx7dHlwZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiJUcmVlTW9kZWwiO319fSk7SHEucHJvdG90eXBlLnNldFBhcmVudExpbmtDYXRlZ29yeUZvck5vZGVEYXRhPUhxLnByb3RvdHlwZS5JdjtIcS5wcm90b3R5cGUuZ2V0UGFyZW50TGlua0NhdGVnb3J5Rm9yTm9kZURhdGE9SHEucHJvdG90eXBlLmJ2O0hxLnByb3RvdHlwZS5zZXRQYXJlbnRLZXlGb3JOb2RlRGF0YT1IcS5wcm90b3R5cGUuSGU7SHEucHJvdG90eXBlLmdldFBhcmVudEtleUZvck5vZGVEYXRhPUhxLnByb3RvdHlwZS5NaTtIcS5jbGFzc05hbWU9IlRyZWVNb2RlbCI7eXEuVHJlZU1vZGVsPUhxO2Z1bmN0aW9uIElxKCl7eWkuY2FsbCh0aGlzKTt0aGlzLnd3PXRoaXMuem49dGhpcy5ZYj0wO3RoaXMuZXI9MzYwO3RoaXMudnc9SnE7dGhpcy5maj0wO3RoaXMuaHc9bmV3IEcoKTt0aGlzLlJxPXRoaXMuUmQ9MDt0aGlzLkdzPW5ldyBLcSgpO3RoaXMuTXQ9dGhpcy55aj0wO3RoaXMuWHg9NjAwO3RoaXMuUm89TmFOO3RoaXMuU209MTt0aGlzLnNwPTA7dGhpcy5LbD0zNjA7dGhpcy5BYj1KcTt0aGlzLkw9THE7dGhpcy5RYz1NcTt0aGlzLk1jPUhwO3RoaXMuWmU9Njt0aGlzLkJvPU5xO31vYShJcSx5aSk7SXEucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkPWZ1bmN0aW9uKGEpe3lpLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZC5jYWxsKHRoaXMsYSk7YS5Sbz10aGlzLlJvO2EuU209dGhpcy5TbTthLnNwPXRoaXMuc3A7YS5LbD10aGlzLktsO2EuQWI9dGhpcy5BYjthLkw9dGhpcy5MO2EuUWM9dGhpcy5RYzthLk1jPXRoaXMuTWM7YS5aZT10aGlzLlplO2EuQm89dGhpcy5Cbzt9O0lxLnByb3RvdHlwZS5mYj1mdW5jdGlvbihhKXtpZihhLmNsYXNzVHlwZT09PUlxKXtpZihhPT09UHF8fGE9PT1RcXx8YT09PVJxfHxhPT09U3F8fGE9PT1NcSl0aGlzLnNvcnRpbmc9YTtlbHNlIGlmKGE9PT1UcXx8YT09PVVxfHxhPT09THF8fGE9PT1WcSl0aGlzLmRpcmVjdGlvbj1hO2Vsc2UgaWYoYT09PVdxfHxhPT09WHF8fGE9PT1KcXx8YT09PVlxKXRoaXMuYXJyYW5nZW1lbnQ9YTtlbHNle2lmKGE9PT1acXx8YT09PU5xKXRoaXMubm9kZURpYW1ldGVyRm9ybXVsYT1hO319ZWxzZSB5aS5wcm90b3R5cGUuZmIuY2FsbCh0aGlzLGEpO307SXEucHJvdG90eXBlLmNyZWF0ZU5ldHdvcms9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3ICRxKHRoaXMpO307SXEucHJvdG90eXBlLmRvTGF5b3V0PWZ1bmN0aW9uKGEpe251bGw9PT10aGlzLm5ldHdvcmsmJih0aGlzLm5ldHdvcms9dGhpcy5tYWtlTmV0d29yayhhKSk7dGhpcy5hcnJhbmdlbWVudE9yaWdpbj10aGlzLmluaXRpYWxPcmlnaW4odGhpcy5hcnJhbmdlbWVudE9yaWdpbik7YT10aGlzLm5ldHdvcmsudmVydGV4ZXM7aWYoMT49YS5jb3VudCkxPT09YS5jb3VudCYmKGE9YS5maXJzdCgpLGEuY2VudGVyWD0wLGEuY2VudGVyWT0wKTtlbHNle3ZhciBiPW5ldyBFKCk7Yi5hZGRBbGwoYS5pdGVyYXRvcik7YT1uZXcgRSgpO3ZhciBjPW5ldyBFKCk7dmFyIGQ9dGhpcy5zb3J0KGIpO3ZhciBlLGYsZz10aGlzLlJxO3ZhciBoPXRoaXMuYXJyYW5nZW1lbnQ7dmFyIGs9dGhpcy5ub2RlRGlhbWV0ZXJGb3JtdWxhO3ZhciBsPXRoaXMucmFkaXVzO2lmKCFpc0Zpbml0ZShsKXx8MD49bClsPU5hTjt2YXIgbT10aGlzLmFzcGVjdFJhdGlvO2lmKCFpc0Zpbml0ZShtKXx8MD49bSltPTE7dmFyIG49dGhpcy5zdGFydEFuZ2xlO2lzRmluaXRlKG4pfHwobj0wKTt2YXIgcD10aGlzLnN3ZWVwQW5nbGU7aWYoIWlzRmluaXRlKHApfHwzNjA8cHx8MT5wKXA9MzYwO2I9dGhpcy5zcGFjaW5nO2lzRmluaXRlKGIpfHwoYj1OYU4pO2g9PT1ZcSYmaz09PVpxP2g9SnE6aD09PVlxJiZrIT09WnEmJihoPXRoaXMuYXJyYW5nZW1lbnQpO2lmKCh0aGlzLmRpcmVjdGlvbj09PVRxfHx0aGlzLmRpcmVjdGlvbj09PVVxKSYmdGhpcy5zb3J0aW5nIT09TXEpe2ZvcihrPTA7IShrPj1kLmxlbmd0aCk7ays9Mil7YS5hZGQoZC5OKGspKTtpZihrKzE+PWQubGVuZ3RoKWJyZWFrO2MuYWRkKGQuTihrKzEpKTt9dGhpcy5kaXJlY3Rpb249PT1UcT8odGhpcy5hcnJhbmdlbWVudD09PVlxJiZhLnJldmVyc2UoKSxkPW5ldyBFKCksZC5hZGRBbGwoYSksZC5hZGRBbGwoYykpOih0aGlzLmFycmFuZ2VtZW50PT09WXEmJmMucmV2ZXJzZSgpLGQ9bmV3IEUoKSxkLmFkZEFsbChjKSxkLmFkZEFsbChhKSk7fWs9ZC5sZW5ndGg7Zm9yKHZhciBxPWY9ZT0wO3E8ZC5sZW5ndGg7cSsrKXt2YXIgcj1uK3AqZioodGhpcy5kaXJlY3Rpb249PT1McT8xOi0xKS9rLHU9ZC5OKHEpLmRpYW1ldGVyO2lzTmFOKHUpJiYodT1hcihkLk4ocSkscikpOzM2MD5wJiYoMD09PXF8fHE9PT1kLmxlbmd0aC0xKSYmKHUvPTIpO2UrPXU7ZisrO31pZihpc05hTihsKXx8aD09PVlxKXtpc05hTihiKSYmKGI9Nik7aWYoaCE9PUpxJiZoIT09WXEpe2Y9LUluZmluaXR5O2ZvcihnPTA7ZzxrO2crKyl7cT1kLk4oZyksZT1kLk4oZz09PWstMT8wOmcrMSksaXNOYU4ocS5kaWFtZXRlcikmJmFyKHEsMCksaXNOYU4oZS5kaWFtZXRlcikmJmFyKGUsMCksZj1NYXRoLm1heChmLChxLmRpYW1ldGVyK2UuZGlhbWV0ZXIpLzIpO31nPWYrYjtoPT09V3E/bD0oZitiKS8oMipNYXRoLlBJL2spOmw9YnIodGhpcyxnKigzNjA8PXA/azprLTEpLG0sbipNYXRoLlBJLzE4MCxwKk1hdGguUEkvMTgwKTt9ZWxzZSBsPWJyKHRoaXMsZSsoMzYwPD1wP2s6ay0xKSooaCE9PVlxP2I6MS42KmIpLG0sbipNYXRoLlBJLzE4MCxwKk1hdGguUEkvMTgwKTtmPWwqbTt9ZWxzZSBpZihmPWwqbSxxPWNyKHRoaXMsbCxmLG4qTWF0aC5QSS8xODAscCpNYXRoLlBJLzE4MCksaXNOYU4oYikpe2lmKGg9PT1KcXx8aD09PVlxKWI9KHEtZSkvKDM2MDw9cD9rOmstMSk7fWVsc2UgaWYoaD09PUpxfHxoPT09WXEpcT0ocS1lKS8oMzYwPD1wP2s6ay0xKSxxPGI/KGw9YnIodGhpcyxlK2IqKDM2MDw9cD9rOmstMSksbSxuKk1hdGguUEkvMTgwLHAqTWF0aC5QSS8xODApLGY9bCptKTpiPXE7ZWxzZXtnPS1JbmZpbml0eTtmb3IoZT0wO2U8aztlKyspe3I9ZC5OKGUpLHU9ZC5OKGU9PT1rLTE/MDplKzEpLGlzTmFOKHIuZGlhbWV0ZXIpJiZhcihyLDApLGlzTmFOKHUuZGlhbWV0ZXIpJiZhcih1LDApLGc9TWF0aC5tYXgoZywoci5kaWFtZXRlcit1LmRpYW1ldGVyKS8yKTt9Zys9YjtlPWJyKHRoaXMsZyooMzYwPD1wP2s6ay0xKSxtLG4qTWF0aC5QSS8xODAscCpNYXRoLlBJLzE4MCk7ZT5sPyhsPWUsZj1sKm0pOmc9cS8oMzYwPD1wP2s6ay0xKTt9dGhpcy52dz1oO3RoaXMuWWI9bDt0aGlzLnpuPW07dGhpcy53dz1uO3RoaXMuZXI9cDt0aGlzLmZqPWI7dGhpcy5SZD1mO3RoaXMuUnE9ZztiPWQ7ZD10aGlzLnZ3O2g9dGhpcy5ZYjtsPXRoaXMud3c7bT10aGlzLmVyO249dGhpcy5majtwPXRoaXMuUmQ7az10aGlzLlJxO2lmKHRoaXMuZGlyZWN0aW9uIT09VHEmJnRoaXMuZGlyZWN0aW9uIT09VXF8fGQhPT1ZcSl7aWYodGhpcy5kaXJlY3Rpb249PT1UcXx8dGhpcy5kaXJlY3Rpb249PT1VcSl7Zz0wO3N3aXRjaChkKXtjYXNlIFhxOmc9MTgwKmRyKHRoaXMsaCxwLGwsaykvTWF0aC5QSTticmVhaztjYXNlIEpxOms9Yj0wO2c9YS5maXJzdCgpO251bGwhPT1nJiYoYj1hcihnLE1hdGguUEkvMikpO2c9Yy5maXJzdCgpO251bGwhPT1nJiYoaz1hcihnLE1hdGguUEkvMikpO2c9MTgwKmRyKHRoaXMsaCxwLGwsbisoYitrKS8yKS9NYXRoLlBJO2JyZWFrO2Nhc2UgV3E6Zz1tL2IubGVuZ3RoO31pZih0aGlzLmRpcmVjdGlvbj09PVRxKXtzd2l0Y2goZCl7Y2FzZSBYcTplcih0aGlzLGEsbCxWcSk7YnJlYWs7Y2FzZSBKcTpmcih0aGlzLGEsbCxWcSk7YnJlYWs7Y2FzZSBXcTpncih0aGlzLGEsbS8yLGwsVnEpO31zd2l0Y2goZCl7Y2FzZSBYcTplcih0aGlzLGMsbCtnLExxKTticmVhaztjYXNlIEpxOmZyKHRoaXMsYyxsK2csTHEpO2JyZWFrO2Nhc2UgV3E6Z3IodGhpcyxjLG0vMixsK2csTHEpO319ZWxzZXtzd2l0Y2goZCl7Y2FzZSBYcTplcih0aGlzLGMsbCxWcSk7YnJlYWs7Y2FzZSBKcTpmcih0aGlzLGMsbCxWcSk7YnJlYWs7Y2FzZSBXcTpncih0aGlzLGMsbS8yLGwsVnEpO31zd2l0Y2goZCl7Y2FzZSBYcTplcih0aGlzLGEsbCtnLExxKTticmVhaztjYXNlIEpxOmZyKHRoaXMsYSxsK2csTHEpO2JyZWFrO2Nhc2UgV3E6Z3IodGhpcyxhLG0vMixsK2csTHEpO319fWVsc2Ugc3dpdGNoKGQpe2Nhc2UgWHE6ZXIodGhpcyxiLGwsdGhpcy5kaXJlY3Rpb24pO2JyZWFrO2Nhc2UgSnE6ZnIodGhpcyxiLGwsdGhpcy5kaXJlY3Rpb24pO2JyZWFrO2Nhc2UgV3E6Z3IodGhpcyxiLG0sbCx0aGlzLmRpcmVjdGlvbik7YnJlYWs7Y2FzZSBZcTpocih0aGlzLGIsbSxsLHRoaXMuZGlyZWN0aW9uKTt9fWVsc2UgaHIodGhpcyxiLG0sbC1tLzIsTHEpO310aGlzLnVwZGF0ZVBhcnRzKCk7dGhpcy5uZXR3b3JrPW51bGw7dGhpcy5pc1ZhbGlkTGF5b3V0PSEwO307ZnVuY3Rpb24gZ3IoYSxiLGMsZCxlKXt2YXIgZj1hLmVyLGc9YS5ZYjthPWEuUmQ7ZD1kKk1hdGguUEkvMTgwO2M9YypNYXRoLlBJLzE4MDtmb3IodmFyIGg9Yi5sZW5ndGgsaz0wO2s8aDtrKyspe3ZhciBsPWQrKGU9PT1McT9rKmMvKDM2MDw9Zj9oOmgtMSk6LShrKmMpL2gpLG09Yi5OKGspLG49ZypNYXRoLnRhbihsKS9hO249TWF0aC5zcXJ0KChnKmcrYSphKm4qbikvKDErbipuKSk7bS5jZW50ZXJYPW4qTWF0aC5jb3MobCk7bS5jZW50ZXJZPW4qTWF0aC5zaW4obCk7bS5hY3R1YWxBbmdsZT0xODAqbC9NYXRoLlBJO319ZnVuY3Rpb24gZnIoYSxiLGMsZCl7dmFyIGU9YS5ZYixmPWEuUmQsZz1hLmZqO2M9YypNYXRoLlBJLzE4MDtmb3IodmFyIGg9Yi5sZW5ndGgsaz0wO2s8aDtrKyspe3ZhciBsPWIuTihrKSxtPWIuTihrPT09aC0xPzA6aysxKSxuPWYqTWF0aC5zaW4oYyk7bC5jZW50ZXJYPWUqTWF0aC5jb3MoYyk7bC5jZW50ZXJZPW47bC5hY3R1YWxBbmdsZT0xODAqYy9NYXRoLlBJO2lzTmFOKGwuZGlhbWV0ZXIpJiZhcihsLDApO2lzTmFOKG0uZGlhbWV0ZXIpJiZhcihtLDApO2w9ZHIoYSxlLGYsZD09PUxxP2M6LWMsKGwuZGlhbWV0ZXIrbS5kaWFtZXRlcikvMitnKTtjKz1kPT09THE/bDotbDt9fWZ1bmN0aW9uIGVyKGEsYixjLGQpe3ZhciBlPWEuWWIsZj1hLlJkLGc9YS5ScTtjPWMqTWF0aC5QSS8xODA7Zm9yKHZhciBoPWIubGVuZ3RoLGs9MDtrPGg7aysrKXt2YXIgbD1iLk4oayk7bC5jZW50ZXJYPWUqTWF0aC5jb3MoYyk7bC5jZW50ZXJZPWYqTWF0aC5zaW4oYyk7bC5hY3R1YWxBbmdsZT0xODAqYy9NYXRoLlBJO2w9ZHIoYSxlLGYsZD09PUxxP2M6LWMsZyk7Yys9ZD09PUxxP2w6LWw7fX1mdW5jdGlvbiBocihhLGIsYyxkLGUpe3ZhciBmPWEuZXI7YS55aj0wO2EuR3M9bmV3IEtxKCk7aWYoMzYwPmMpe2ZvcihmPWQrKGU9PT1McT9mOi1mKTswPmY7KXtmKz0zNjA7fWYlPTM2MDsxODA8ZiYmKGYtPTM2MCk7Zio9TWF0aC5QSS8xODA7YS5NdD1mO2lyKGEsYixjLGQsZSk7fWVsc2UganIoYSxiLGMsZCxlKTthLkdzLmNvbW1pdChiKTt9ZnVuY3Rpb24ganIoYSxiLGMsZCxlKXt2YXIgZj1hLlliLGc9YS5maixoPWEuem4saz1mKk1hdGguY29zKGQqTWF0aC5QSS8xODApLGw9YS5SZCpNYXRoLnNpbihkKk1hdGguUEkvMTgwKSxtPWIuTmEoKTtpZigzPT09bS5sZW5ndGgpbVswXS5jZW50ZXJYPWYsbVswXS5jZW50ZXJZPTAsbVsxXS5jZW50ZXJYPW1bMF0uY2VudGVyWC1tWzBdLndpZHRoLzItbVsxXS53aWR0aC8yLWcsbVsxXS55PW1bMF0ueSxtWzJdLmNlbnRlclg9KG1bMF0uY2VudGVyWCttWzFdLmNlbnRlclgpLzIsbVsyXS55PW1bMF0ueS1tWzJdLmhlaWdodC1nO2Vsc2UgaWYoND09PW0ubGVuZ3RoKW1bMF0uY2VudGVyWD1mLG1bMF0uY2VudGVyWT0wLG1bMl0uY2VudGVyWD0tbVswXS5jZW50ZXJYLG1bMl0uY2VudGVyWT1tWzBdLmNlbnRlclksbVsxXS5jZW50ZXJYPTAsbVsxXS55PU1hdGgubWluKG1bMF0ueSxtWzJdLnkpLW1bMV0uaGVpZ2h0LWcsbVszXS5jZW50ZXJYPTAsbVszXS55PU1hdGgubWF4KG1bMF0ueSttWzBdLmhlaWdodCtnLG1bMl0ueSttWzJdLmhlaWdodCtnKTtlbHNle2Y9Ry5hbGxvYygpO2Zvcih2YXIgbj0wO248bS5sZW5ndGg7bisrKXttW25dLmNlbnRlclg9azttW25dLmNlbnRlclk9bDtpZihuPj1tLmxlbmd0aC0xKWJyZWFrO2tyKGEsayxsLG0sbixlLGYpfHxscihhLGssbCxtLG4sZSxmKTtrPWYueDtsPWYueTt9Ry5mcmVlKGYpO2EueWorKztpZighKDIzPGEueWopKXtrPW1bMF0uY2VudGVyWDtsPW1bMF0uY2VudGVyWTtmPW1bbS5sZW5ndGgtMV0uY2VudGVyWDtuPW1bbS5sZW5ndGgtMV0uY2VudGVyWTt2YXIgcD1NYXRoLmFicyhrLWYpLSgobVswXS53aWR0aCttW20ubGVuZ3RoLTFdLndpZHRoKS8yK2cpLHE9TWF0aC5hYnMobC1uKS0oKG1bMF0uaGVpZ2h0K21bbS5sZW5ndGgtMV0uaGVpZ2h0KS8yK2cpO2c9MDsxPk1hdGguYWJzKHEpP01hdGguYWJzKGstZik8KG1bMF0ud2lkdGgrbVttLmxlbmd0aC0xXS53aWR0aCkvMiYmKGc9MCk6Zz0wPHE/cToxPk1hdGguYWJzKHApPzA6cDtrPU1hdGguYWJzKGYpPk1hdGguYWJzKG4pPzA8ZiE9PWw+bjowPG4hPT1rPGY7aWYoaz1lPT09THE/azohaylnPS1NYXRoLmFicyhnKSxnPU1hdGgubWluKGcsLW1bbS5sZW5ndGgtMV0ud2lkdGgpLGc9TWF0aC5taW4oZywtbVttLmxlbmd0aC0xXS5oZWlnaHQpO2EuR3MuY29tcGFyZShnLG0pOzE8TWF0aC5hYnMoZykmJihhLlliPTg+YS55aj9hLlliLWcvKDIqTWF0aC5QSSk6NT5tLmxlbmd0aCYmMTA8Zz9hLlliLzI6YS5ZYi0oMDxnPzEuNzotMi4zKSxhLlJkPWEuWWIqaCxqcihhLGIsYyxkLGUpKTt9fX1mdW5jdGlvbiBpcihhLGIsYyxkLGUpe2Zvcih2YXIgZj1hLlliLGc9YS5SZCxoPWEuem4saz1mKk1hdGguY29zKGQqTWF0aC5QSS8xODApLGw9ZypNYXRoLnNpbihkKk1hdGguUEkvMTgwKSxtPUcuYWxsb2MoKSxuPWIuTmEoKSxwPTA7cDxuLmxlbmd0aDtwKyspe25bcF0uY2VudGVyWD1rO25bcF0uY2VudGVyWT1sO2lmKHA+PW4ubGVuZ3RoLTEpYnJlYWs7a3IoYSxrLGwsbixwLGUsbSl8fGxyKGEsayxsLG4scCxlLG0pO2s9bS54O2w9bS55O31HLmZyZWUobSk7YS55aisrO2lmKCEoMjM8YS55aikpe2s9TWF0aC5hdGFuMihsLGspO2s9ZT09PUxxP2EuTXQtazprLWEuTXQ7az1NYXRoLmFicyhrKTxNYXRoLmFicyhrLTIqTWF0aC5QSSk/azprLTIqTWF0aC5QSTtmPWsqKGYrZykvMjtnPWEuR3M7aWYoTWF0aC5hYnMoZik8TWF0aC5hYnMoZy5hbSkpZm9yKGcuYW09ZixnLnRrPVtdLGcuQW09W10saz0wO2s8bi5sZW5ndGg7aysrKXtnLnRrW2tdPW5ba10uYm91bmRzLngsZy5BbVtrXT1uW2tdLmJvdW5kcy55O30xPE1hdGguYWJzKGYpJiYoYS5ZYj04PmEueWo/YS5ZYi1mLygyKk1hdGguUEkpOmEuWWItKDA8Zj8xLjc6LTIuMyksYS5SZD1hLlliKmgsaXIoYSxiLGMsZCxlKSk7fX1mdW5jdGlvbiBrcihhLGIsYyxkLGUsZixnKXt2YXIgaD1hLlliLGs9YS5SZCxsPTA7YT0oZFtlXS53aWR0aCtkW2UrMV0ud2lkdGgpLzIrYS5majt2YXIgbT0hMTtpZigwPD1jIT09KGY9PT1McSkpe2lmKGY9YithLGY+aCl7Zj1iLWE7aWYoZjwtaClyZXR1cm4gZy54PWYsZy55PWwsITE7bT0hMDt9fWVsc2UgaWYoZj1iLWEsZjwtaCl7Zj1iK2E7aWYoZj5oKXJldHVybiBnLng9ZixnLnk9bCwhMTttPSEwO31sPU1hdGguc3FydCgxLU1hdGgubWluKDEsZipmLyhoKmgpKSkqazswPmMhPT1tJiYobD0tbCk7aWYoTWF0aC5hYnMoYy1sKT4oZFtlXS5oZWlnaHQrZFtlKzFdLmhlaWdodCkvMilyZXR1cm4gZy54PWYsZy55PWwsITE7Zy54PWY7Zy55PWw7cmV0dXJuITA7fWZ1bmN0aW9uIGxyKGEsYixjLGQsZSxmLGcpe3ZhciBoPWEuWWIsaz1hLlJkLGw9MDthPShkW2VdLmhlaWdodCtkW2UrMV0uaGVpZ2h0KS8yK2EuZmo7ZD0hMTtpZigwPD1iIT09KGY9PT1McSkpe2lmKGY9Yy1hLGY8LWspe2Y9YythO2lmKGY+ayl7Zy54PWw7Zy55PWY7cmV0dXJuO31kPSEwO319ZWxzZSBpZihmPWMrYSxmPmspe2Y9Yy1hO2lmKGY8LWspe2cueD1sO2cueT1mO3JldHVybjt9ZD0hMDt9bD1NYXRoLnNxcnQoMS1NYXRoLm1pbigxLGYqZi8oayprKSkpKmg7MD5iIT09ZCYmKGw9LWwpO2cueD1sO2cueT1mO31JcS5wcm90b3R5cGUuY29tbWl0TGF5b3V0PWZ1bmN0aW9uKCl7dGhpcy5jb21taXROb2RlcygpO3RoaXMuaXNSb3V0aW5nJiZ0aGlzLmNvbW1pdExpbmtzKCk7fTtJcS5wcm90b3R5cGUuY29tbWl0Tm9kZXM9ZnVuY3Rpb24oKXt2YXIgYT1udWxsIT09dGhpcy5ncm91cCYmbnVsbCE9PXRoaXMuZ3JvdXAucGxhY2Vob2xkZXImJnRoaXMuZ3JvdXAuaXNTdWJHcmFwaEV4cGFuZGVkLGI9YT90aGlzLmdyb3VwLmxvY2F0aW9uLmNvcHkoKTpudWxsLGM9dGhpcy5hY3R1YWxDZW50ZXI7YT9jPW5ldyBHKDAsMCk6KGMueD10aGlzLmFycmFuZ2VtZW50T3JpZ2luLngrdGhpcy5ZYixjLnk9dGhpcy5hcnJhbmdlbWVudE9yaWdpbi55K3RoaXMuUmQpO2Zvcih2YXIgZD10aGlzLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlO2UueCs9Yy54O2UueSs9Yy55O2UuY29tbWl0KCk7fWEmJih0aGlzLmdyb3VwLmFjKCksYT10aGlzLmdyb3VwLnBvc2l0aW9uLmNvcHkoKSxjPXRoaXMuZ3JvdXAubG9jYXRpb24uY29weSgpLGI9Yi5YZChjLlhkKGEpKSx0aGlzLmdyb3VwLm1vdmUoYiksdGhpcy5odz1iLlhkKGEpKTt9O0lxLnByb3RvdHlwZS5jb21taXRMaW5rcz1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm5ldHdvcmsuZWRnZXMuaXRlcmF0b3I7YS5uZXh0KCk7KXthLnZhbHVlLmNvbW1pdCgpO319O2Z1bmN0aW9uIGNyKGEsYixjLGQsZSl7dmFyIGY9YS5YeDtpZiguMDAxPk1hdGguYWJzKGEuem4tMSkpcmV0dXJuIHZvaWQgMCE9PWQmJnZvaWQgMCE9PWU/ZSpiOjIqTWF0aC5QSSpiO2E9Yj5jP01hdGguc3FydChiKmItYypjKS9iOk1hdGguc3FydChjKmMtYipiKS9jO3ZhciBnPTA7dmFyIGg9dm9pZCAwIT09ZCYmdm9pZCAwIT09ZT9lLyhmKzEpOk1hdGguUEkvKDIqKGYrMSkpO2Zvcih2YXIgaz0wLGw9MDtsPD1mO2wrKyl7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZT9rPWQrbCplL2Y6az1sKk1hdGguUEkvKDIqZik7dmFyIG09TWF0aC5zaW4oayk7Zys9TWF0aC5zcXJ0KDEtYSphKm0qbSkqaDt9cmV0dXJuIHZvaWQgMCE9PWQmJnZvaWQgMCE9PWU/KGI+Yz9iOmMpKmc6NCooYj5jP2I6YykqZzt9ZnVuY3Rpb24gYnIoYSxiLGMsZCxlKXtyZXR1cm4gYi8odm9pZCAwIT09ZCYmdm9pZCAwIT09ZT9jcihhLDEsYyxkLGUpOmNyKGEsMSxjKSk7fWZ1bmN0aW9uIGRyKGEsYixjLGQsZSl7aWYoLjAwMT5NYXRoLmFicyhhLnpuLTEpKXJldHVybiBlL2I7dmFyIGY9Yj5jP01hdGguc3FydChiKmItYypjKS9iOk1hdGguc3FydChjKmMtYipiKS9jLGc9MDthPTIqTWF0aC5QSS8oNzAwKmEubmV0d29yay52ZXJ0ZXhlcy5jb3VudCk7Yj5jJiYoZCs9TWF0aC5QSS8yKTtmb3IodmFyIGg9MDs7aCsrKXt2YXIgaz1NYXRoLnNpbihkK2gqYSk7Zys9KGI+Yz9iOmMpKk1hdGguc3FydCgxLWYqZiprKmspKmE7aWYoZz49ZSlyZXR1cm4gaCphO319SXEucHJvdG90eXBlLnNvcnQ9ZnVuY3Rpb24oYSl7c3dpdGNoKHRoaXMuc29ydGluZyl7Y2FzZSBScTpicmVhaztjYXNlIFNxOmEucmV2ZXJzZSgpO2JyZWFrO2Nhc2UgUHE6YS5zb3J0KHRoaXMuY29tcGFyZXIpO2JyZWFrO2Nhc2UgUXE6YS5zb3J0KHRoaXMuY29tcGFyZXIpO2EucmV2ZXJzZSgpO2JyZWFrO2Nhc2UgTXE6Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7Yi5wdXNoKDApO31jPW5ldyBFKCk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPS0xLGY9LTE7aWYoMD09PWQpZm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspe3ZhciBoPWEuTihnKS5lZGdlc0NvdW50O2g+ZSYmKGU9aCxmPWcpO31lbHNlIGZvcihnPTA7ZzxhLmxlbmd0aDtnKyspe2g9YltnXSxoPmUmJihlPWgsZj1nKTt9Yy5hZGQoYS5OKGYpKTtiW2ZdPS0xO2Y9YS5OKGYpO2ZvcihnPWYuc291cmNlRWRnZXM7Zy5uZXh0KCk7KXtlPWEuaW5kZXhPZihnLnZhbHVlLmZyb21WZXJ0ZXgpLDA+ZXx8MDw9YltlXSYmYltlXSsrO31mb3IoZj1mLmRlc3RpbmF0aW9uRWRnZXM7Zi5uZXh0KCk7KXtlPWEuaW5kZXhPZihmLnZhbHVlLnRvVmVydGV4KSwwPmV8fDA8PWJbZV0mJmJbZV0rKzt9fWE9W107Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7ZT1jLk4oYik7YVtiXT1bXTtmb3IoZj1lLmRlc3RpbmF0aW9uRWRnZXM7Zi5uZXh0KCk7KXtkPWMuaW5kZXhPZihmLnZhbHVlLnRvVmVydGV4KSxkIT09YiYmMD5hW2JdLmluZGV4T2YoZCkmJmFbYl0ucHVzaChkKTt9Zm9yKGU9ZS5zb3VyY2VFZGdlcztlLm5leHQoKTspe2Q9Yy5pbmRleE9mKGUudmFsdWUuZnJvbVZlcnRleCksZCE9PWImJjA+YVtiXS5pbmRleE9mKGQpJiZhW2JdLnB1c2goZCk7fX1mPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe2ZbYl09MDt9Yj1bXTtnPVtdO2g9W107ZT1bXTtkPW5ldyBFKCk7Zm9yKHZhciBrPTAsbD0wO2w8YS5sZW5ndGg7bCsrKXt2YXIgbT1hW2xdLmxlbmd0aDtpZigxPT09bSllLnB1c2gobCk7ZWxzZSBpZigwPT09bSlkLmFkZChjLk4obCkpO2Vsc2V7aWYoMD09PWspYi5wdXNoKGwpO2Vsc2V7Zm9yKHZhciBuPW09SW5maW5pdHkscD0tMSxxPVtdLHI9MDtyPGIubGVuZ3RoO3IrKyl7MD5hW2Jbcl1dLmluZGV4T2YoYltyPT09Yi5sZW5ndGgtMT8wOnIrMV0pJiZxLnB1c2gocj09PWIubGVuZ3RoLTE/MDpyKzEpO31pZigwPT09cS5sZW5ndGgpZm9yKHI9MDtyPGIubGVuZ3RoO3IrKyl7cS5wdXNoKHIpO31mb3Iocj0wO3I8cS5sZW5ndGg7cisrKXtmb3IodmFyIHU9cVtyXSx4PWFbbF0sdj0wLHk9MDt5PGcubGVuZ3RoO3krKyl7dmFyIHo9ZltnW3ldXSxCPWZbaFt5XV07aWYoejxCKXt2YXIgQz16O3o9Qjt9ZWxzZSBDPUI7aWYoQzx1JiZ1PD16KWZvcihCPTA7Qjx4Lmxlbmd0aDtCKyspe3ZhciBJPXhbQl07MD5iLmluZGV4T2YoSSl8fEM8ZltJXSYmZltJXTx6fHxDPT09ZltJXXx8ej09PWZbSV18fHYrKzt9ZWxzZSBmb3IoQj0wO0I8eC5sZW5ndGg7QisrKXtJPXhbQl0sMD5iLmluZGV4T2YoSSl8fEM8ZltJXSYmZltJXTx6JiZDIT09ZltJXSYmeiE9PWZbSV0mJnYrKzt9fXg9djtmb3IoeT12PTA7eTxhW2xdLmxlbmd0aDt5Kyspe0M9Yi5pbmRleE9mKGFbbF1beV0pLDA8PUMmJihDPU1hdGguYWJzKHUtKEM+PXU/QysxOkMpKSx2Kz1DPGIubGVuZ3RoKzEtQz9DOmIubGVuZ3RoKzEtQyk7fWZvcih5PTA7eTxnLmxlbmd0aDt5Kyspe0M9ZltnW3ldXSx6PWZbaFt5XV0sQz49dSYmQysrLHo+PXUmJnorKyxDPnomJihCPXosej1DLEM9Qiksei1DPChiLmxlbmd0aCsyKS8yPT09KEM8dSYmdTw9eikmJnYrKzt9aWYoeDxtfHx4PT09bSYmdjxuKW09eCxuPXYscD11O31iLnNwbGljZShwLDAsbCk7Zm9yKG09MDttPGIubGVuZ3RoO20rKyl7ZltiW21dXT1tO31mb3IobT0wO208YVtsXS5sZW5ndGg7bSsrKXtuPWFbbF1bbV0sMDw9Yi5pbmRleE9mKG4pJiYoZy5wdXNoKGwpLGgucHVzaChuKSk7fX1rKys7fX1mb3IoZz1iLmxlbmd0aDs7KXtmPSEwO2ZvcihoPTA7aDxlLmxlbmd0aDtoKyspe2lmKGs9ZVtoXSxsPWFba11bMF0sbT1iLmluZGV4T2YobCksMDw9bSl7Zm9yKHA9bj0wO3A8YVtsXS5sZW5ndGg7cCsrKXtxPWIuaW5kZXhPZihhW2xdW3BdKSwwPnF8fHE9PT1tfHwocj1xPm0/cS1tOm0tcSxuKz1xPG0hPT1yPmctcj8xOi0xKTt9Yi5zcGxpY2UoMD5uP206bSsxLDAsayk7ZS5zcGxpY2UoaCwxKTtoLS07fWVsc2UgZj0hMTt9aWYoZilicmVhaztlbHNlIGIucHVzaChlWzBdKSxlLnNwbGljZSgwLDEpO31mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXtkLmFkZChjLk4oYlthXSkpO31yZXR1cm4gZDtkZWZhdWx0OkEoIkludmFsaWQgc29ydGluZyB0eXBlLiIpO31yZXR1cm4gYTt9O3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKElxLnByb3RvdHlwZSx7cmFkaXVzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUm87fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuUm8hPT1hJiYoMDxhfHxpc05hTihhKSkmJih0aGlzLlJvPWEsdGhpcy5CKCkpO319LGFzcGVjdFJhdGlvOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuU207fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuU20hPT1hJiYwPGEmJih0aGlzLlNtPWEsdGhpcy5CKCkpO319LHN0YXJ0QW5nbGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5zcDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5zcCE9PWEmJih0aGlzLnNwPWEsdGhpcy5CKCkpO319LHN3ZWVwQW5nbGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5LbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LbCE9PWEmJigwPGEmJjM2MD49YT90aGlzLktsPWE6dGhpcy5LbD0zNjAsdGhpcy5CKCkpO319LGFycmFuZ2VtZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQWI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuQWI9PT1hfHxhIT09WXEmJmEhPT1KcSYmYSE9PVhxJiZhIT09V3F8fCh0aGlzLkFiPWEsdGhpcy5CKCkpO319LGRpcmVjdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkw7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTD09PWF8fGEhPT1McSYmYSE9PVZxJiZhIT09VHEmJmEhPT1VcXx8KHRoaXMuTD1hLHRoaXMuQigpKTt9fSxzb3J0aW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUWM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuUWM9PT1hfHxhIT09UnEmJmEhPT1TcSYmYSE9PVBxJiYhUXEmJmEhPT1NcXx8KHRoaXMuUWM9YSx0aGlzLkIoKSk7fX0sY29tcGFyZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5NYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5NYyE9PWEmJih0aGlzLk1jPWEsdGhpcy5CKCkpO319LHNwYWNpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5aZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5aZSE9PWEmJih0aGlzLlplPWEsdGhpcy5CKCkpO319LG5vZGVEaWFtZXRlckZvcm11bGE6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Cbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5Cbz09PWF8fGEhPT1OcSYmYSE9PVpxfHwodGhpcy5Cbz1hLHRoaXMuQigpKTt9fSxhY3R1YWxYUmFkaXVzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWWI7fX0sYWN0dWFsWVJhZGl1czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlJkO319LGFjdHVhbFNwYWNpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5majt9fSxhY3R1YWxDZW50ZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5odzt9fX0pO3ZhciBKcT1uZXcgRChJcSwiQ29uc3RhbnRTcGFjaW5nIiwwKSxYcT1uZXcgRChJcSwiQ29uc3RhbnREaXN0YW5jZSIsMSksV3E9bmV3IEQoSXEsIkNvbnN0YW50QW5nbGUiLDIpLFlxPW5ldyBEKElxLCJQYWNrZWQiLDMpLExxPW5ldyBEKElxLCJDbG9ja3dpc2UiLDQpLFZxPW5ldyBEKElxLCJDb3VudGVyY2xvY2t3aXNlIiw1KSxUcT1uZXcgRChJcSwiQmlkaXJlY3Rpb25hbExlZnQiLDYpLFVxPW5ldyBEKElxLCJCaWRpcmVjdGlvbmFsUmlnaHQiLDcpLFJxPW5ldyBEKElxLCJGb3J3YXJkcyIsOCksU3E9bmV3IEQoSXEsIlJldmVyc2UiLDkpLFBxPW5ldyBEKElxLCJBc2NlbmRpbmciLDEwKSxRcT1uZXcgRChJcSwiRGVzY2VuZGluZyIsMTEpLE1xPW5ldyBEKElxLCJPcHRpbWl6ZWQiLDEyKSxOcT1uZXcgRChJcSwiUHl0aGFnb3JlYW4iLDEzKSxacT1uZXcgRChJcSwiQ2lyY3VsYXIiLDE0KTtJcS5jbGFzc05hbWU9IkNpcmN1bGFyTGF5b3V0IjtJcS5Db25zdGFudFNwYWNpbmc9SnE7SXEuQ29uc3RhbnREaXN0YW5jZT1YcTtJcS5Db25zdGFudEFuZ2xlPVdxO0lxLlBhY2tlZD1ZcTtJcS5DbG9ja3dpc2U9THE7SXEuQ291bnRlcmNsb2Nrd2lzZT1WcTtJcS5CaWRpcmVjdGlvbmFsTGVmdD1UcTtJcS5CaWRpcmVjdGlvbmFsUmlnaHQ9VXE7SXEuRm9yd2FyZHM9UnE7SXEuUmV2ZXJzZT1TcTtJcS5Bc2NlbmRpbmc9UHE7SXEuRGVzY2VuZGluZz1RcTtJcS5PcHRpbWl6ZWQ9TXE7SXEuUHl0aGFnb3JlYW49TnE7SXEuQ2lyY3VsYXI9WnE7ZnVuY3Rpb24gS3EoKXt0aGlzLmFtPS1JbmZpbml0eTt0aGlzLkFtPXRoaXMudGs9bnVsbDt9S3EucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oYSxiKXtpZigwPGEmJjA+dGhpcy5hbXx8TWF0aC5hYnMoYSk8TWF0aC5hYnModGhpcy5hbSkmJiEoMD5hJiYwPHRoaXMuYW0pKWZvcih0aGlzLmFtPWEsdGhpcy50az1bXSx0aGlzLkFtPVtdLGE9MDthPGIubGVuZ3RoO2ErKyl7dGhpcy50a1thXT1iW2FdLmJvdW5kcy54LHRoaXMuQW1bYV09YlthXS5ib3VuZHMueTt9fTtLcS5wcm90b3R5cGUuY29tbWl0PWZ1bmN0aW9uKGEpe2lmKG51bGwhPT10aGlzLnRrJiZudWxsIT09dGhpcy5BbSlmb3IodmFyIGI9MDtiPHRoaXMudGsubGVuZ3RoO2IrKyl7dmFyIGM9YS5OKGIpO2MueD10aGlzLnRrW2JdO2MueT10aGlzLkFtW2JdO319O0txLmNsYXNzTmFtZT0iVmVydGV4QXJyYW5nZW1lbnQiO2Z1bmN0aW9uICRxKGEpe3lwLmNhbGwodGhpcyxhKTt9b2EoJHEseXApOyRxLnByb3RvdHlwZS5jcmVhdGVWZXJ0ZXg9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG1yKHRoaXMpO307JHEucHJvdG90eXBlLmNyZWF0ZUVkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG5yKHRoaXMpO307JHEuY2xhc3NOYW1lPSJDaXJjdWxhck5ldHdvcmsiO2Z1bmN0aW9uIG1yKGEpe0JwLmNhbGwodGhpcyxhKTt0aGlzLks9dGhpcy5laj1OYU47fW9hKG1yLEJwKTtmdW5jdGlvbiBhcihhLGIpe3ZhciBjPWEubmV0d29yaztpZihudWxsPT09YylyZXR1cm4gTmFOO2M9Yy5sYXlvdXQ7aWYobnVsbD09PWMpcmV0dXJuIE5hTjtpZihjLmFycmFuZ2VtZW50PT09WXEpe2lmKGMubm9kZURpYW1ldGVyRm9ybXVsYT09PVpxKWEuZWo9TWF0aC5tYXgoYS53aWR0aCxhLmhlaWdodCk7ZWxzZXtjPU1hdGguYWJzKE1hdGguc2luKGIpKTtiPU1hdGguYWJzKE1hdGguY29zKGIpKTtpZigwPT09YylyZXR1cm4gYS53aWR0aDtpZigwPT09YilyZXR1cm4gYS5oZWlnaHQ7YS5laj1NYXRoLm1pbihhLmhlaWdodC9jLGEud2lkdGgvYik7fX1lbHNlIGEuZWo9Yy5ub2RlRGlhbWV0ZXJGb3JtdWxhPT09WnE/TWF0aC5tYXgoYS53aWR0aCxhLmhlaWdodCk6TWF0aC5zcXJ0KGEud2lkdGgqYS53aWR0aCthLmhlaWdodCphLmhlaWdodCk7cmV0dXJuIGEuZWo7fXBhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG1yLnByb3RvdHlwZSx7ZGlhbWV0ZXI6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5lajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5laiE9PWEmJih0aGlzLmVqPWEpO319LGFjdHVhbEFuZ2xlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LIT09YSYmKHRoaXMuSz1hKTt9fX0pO21yLmNsYXNzTmFtZT0iQ2lyY3VsYXJWZXJ0ZXgiO2Z1bmN0aW9uIG5yKGEpe0NwLmNhbGwodGhpcyxhKTt9b2EobnIsQ3ApO25yLmNsYXNzTmFtZT0iQ2lyY3VsYXJFZGdlIjtmdW5jdGlvbiBvcigpe3lpLmNhbGwodGhpcyk7dGhpcy5waD1udWxsO3RoaXMuJG49MDt0aGlzLndkPW5ldyBLKDEwMCwxMDApLmZyZWV6ZSgpO3RoaXMuUm09ITE7dGhpcy5ZZT0hMDt0aGlzLlhjPSExO3RoaXMucWw9MTAwO3RoaXMuQ249MTt0aGlzLkpmPTFFMzt0aGlzLnZvPTEwO3RoaXMuU289TWF0aDt0aGlzLlBrPS4wNTt0aGlzLk9rPTUwO3RoaXMuTWs9MTUwO3RoaXMuTms9MDt0aGlzLnBuPTEwO3RoaXMub249NTt9b2Eob3IseWkpO29yLnByb3RvdHlwZS5jbG9uZVByb3RlY3RlZD1mdW5jdGlvbihhKXt5aS5wcm90b3R5cGUuY2xvbmVQcm90ZWN0ZWQuY2FsbCh0aGlzLGEpO2Eud2QuYXNzaWduKHRoaXMud2QpO2EuUm09dGhpcy5SbTthLlllPXRoaXMuWWU7YS5YYz10aGlzLlhjO2EucWw9dGhpcy5xbDthLkNuPXRoaXMuQ247YS5KZj10aGlzLkpmO2Eudm89dGhpcy52bzthLlNvPXRoaXMuU287YS5Qaz10aGlzLlBrO2EuT2s9dGhpcy5PazthLk1rPXRoaXMuTWs7YS5Oaz10aGlzLk5rO2EucG49dGhpcy5wbjthLm9uPXRoaXMub247fTtvci5wcm90b3R5cGUuY3JlYXRlTmV0d29yaz1mdW5jdGlvbigpe3JldHVybiBuZXcgcHIodGhpcyk7fTtvci5wcm90b3R5cGUuZG9MYXlvdXQ9ZnVuY3Rpb24oYSl7bnVsbD09PXRoaXMubmV0d29yayYmKHRoaXMubmV0d29yaz10aGlzLm1ha2VOZXR3b3JrKGEpKTthPXRoaXMubWF4SXRlcmF0aW9ucztpZigwPHRoaXMubmV0d29yay52ZXJ0ZXhlcy5jb3VudCl7dGhpcy5uZXR3b3JrLlBwKCk7Zm9yKHZhciBiPXRoaXMubmV0d29yay52ZXJ0ZXhlcy5pdGVyYXRvcjtiLm5leHQoKTspe3ZhciBjPWIudmFsdWU7Yy5jaGFyZ2U9dGhpcy5lbGVjdHJpY2FsQ2hhcmdlKGMpO2MubWFzcz10aGlzLmdyYXZpdGF0aW9uYWxNYXNzKGMpO31mb3IoYj10aGlzLm5ldHdvcmsuZWRnZXMuaXRlcmF0b3I7Yi5uZXh0KCk7KXtjPWIudmFsdWUsYy5zdGlmZm5lc3M9dGhpcy5zcHJpbmdTdGlmZm5lc3MoYyksYy5sZW5ndGg9dGhpcy5zcHJpbmdMZW5ndGgoYyk7fXRoaXMuSXUoKTt0aGlzLiRuPTA7aWYodGhpcy5uZWVkc0NsdXN0ZXJMYXlvdXQoKSl7Yj10aGlzLm5ldHdvcms7Zm9yKGM9Yi5OeCgpLml0ZXJhdG9yO2MubmV4dCgpOyl7dGhpcy5uZXR3b3JrPWMudmFsdWU7Zm9yKHZhciBkPXRoaXMubmV0d29yay52ZXJ0ZXhlcy5pdGVyYXRvcjtkLm5leHQoKTspe3ZhciBlPWQudmFsdWU7ZS50ZD1lLnZlcnRleGVzLmNvdW50O2UuQWg9MTtlLlVqPW51bGw7ZS5HZT1udWxsO31xcih0aGlzLDAsYSk7fXRoaXMubmV0d29yaz1iO2MucmVzZXQoKTtkPXRoaXMuYXJyYW5nZW1lbnRTcGFjaW5nO2Zvcih2YXIgZj1jLmNvdW50LGc9ITAsaD1lPTAsaz1LYSgpLGw9MDtsPGYrYi52ZXJ0ZXhlcy5jb3VudCsyO2wrKyl7a1tsXT1udWxsO31mPTA7Yy5yZXNldCgpO2Zvcih2YXIgbT1OLmFsbG9jKCk7Yy5uZXh0KCk7KXtpZihsPWMudmFsdWUsdGhpcy5jb21wdXRlQm91bmRzKGwsbSksZylnPSExLGU9bS54K20ud2lkdGgvMixoPW0ueSttLmhlaWdodC8yLGtbMF09bmV3IEcobS54K20ud2lkdGgrZC53aWR0aCxtLnkpLGtbMV09bmV3IEcobS54LG0ueSttLmhlaWdodCtkLmhlaWdodCksZj0yO2Vsc2V7dmFyIG49cnIoayxmLGUsaCxtLndpZHRoLG0uaGVpZ2h0LGQpLHA9a1tuXSxxPW5ldyBHKHAueCttLndpZHRoK2Qud2lkdGgscC55KSxyPW5ldyBHKHAueCxwLnkrbS5oZWlnaHQrZC5oZWlnaHQpO24rMTxmJiZrLnNwbGljZShuKzEsMCxudWxsKTtrW25dPXE7a1tuKzFdPXI7ZisrO249cC54LW0ueDtwPXAueS1tLnk7Zm9yKGw9bC52ZXJ0ZXhlcy5pdGVyYXRvcjtsLm5leHQoKTspe3E9bC52YWx1ZSxxLmNlbnRlclgrPW4scS5jZW50ZXJZKz1wO319fU4uZnJlZShtKTtmb3IobD1iLnZlcnRleGVzLml0ZXJhdG9yO2wubmV4dCgpOyl7Zz1sLnZhbHVlLHE9Zy5ib3VuZHMsMj5mPyhlPXEueCtxLndpZHRoLzIsaD1xLnkrcS5oZWlnaHQvMixrWzBdPW5ldyBHKHEueCtxLndpZHRoK2Qud2lkdGgscS55KSxrWzFdPW5ldyBHKHEueCxxLnkrcS5oZWlnaHQrZC5oZWlnaHQpLGY9Mik6KG09cnIoayxmLGUsaCxxLndpZHRoLHEuaGVpZ2h0LGQpLHA9a1ttXSxuPW5ldyBHKHAueCtxLndpZHRoK2Qud2lkdGgscC55KSxxPW5ldyBHKHAueCxwLnkrcS5oZWlnaHQrZC5oZWlnaHQpLG0rMTxmJiZrLnNwbGljZShtKzEsMCxudWxsKSxrW21dPW4sa1ttKzFdPXEsZisrLGcuY2VudGVyWD1wLngrZy53aWR0aC8yLGcuY2VudGVyWT1wLnkrZy5oZWlnaHQvMik7fU9hKGspO2ZvcihjLnJlc2V0KCk7Yy5uZXh0KCk7KXtkPWMudmFsdWU7Zm9yKGU9ZC52ZXJ0ZXhlcy5pdGVyYXRvcjtlLm5leHQoKTspe2Iuc2goZS52YWx1ZSk7fWZvcihkPWQuZWRnZXMuaXRlcmF0b3I7ZC5uZXh0KCk7KXtiLk9qKGQudmFsdWUpO319fXNyKHRoaXMsYSk7dGhpcy51cGRhdGVQYXJ0cygpO310aGlzLnFsPWE7dGhpcy5uZXR3b3JrPW51bGw7dGhpcy5pc1ZhbGlkTGF5b3V0PSEwO307b3IucHJvdG90eXBlLm5lZWRzQ2x1c3RlckxheW91dD1mdW5jdGlvbigpe2lmKDM+dGhpcy5uZXR3b3JrLnZlcnRleGVzLmNvdW50KXJldHVybiExO2Zvcih2YXIgYT0wLGI9MCxjPXRoaXMubmV0d29yay52ZXJ0ZXhlcy5maXJzdCgpLmJvdW5kcyxkPXRoaXMubmV0d29yay52ZXJ0ZXhlcy5pdGVyYXRvcjtkLm5leHQoKTspe2lmKGQudmFsdWUuYm91bmRzLkljKGMpJiYoYSsrLDI8YSkpcmV0dXJuITA7aWYoMTA8YilicmVhaztiKys7fXJldHVybiExO307b3IucHJvdG90eXBlLmNvbXB1dGVCb3VuZHM9ZnVuY3Rpb24oYSxiKXt2YXIgYz0hMDtmb3IoYT1hLnZlcnRleGVzLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGQ9YS52YWx1ZTtjPyhjPSExLGIuc2V0KGQuYm91bmRzKSk6Yi5KYyhkLmJvdW5kcyk7fXJldHVybiBiO307ZnVuY3Rpb24gcXIoYSxiLGMpe2lmKHRyKGEsYikpe3ZhciBkPWEuSmY7YS5KZio9MSsxLyhiKzEpO3ZhciBlPXVyKGEsYiksZj1NYXRoLm1heCgwLE1hdGgubWF4KE1hdGgubWluKGEubmV0d29yay52ZXJ0ZXhlcy5jb3VudCxjKihiKzEpLzExKSwxMCkpO2EubWF4SXRlcmF0aW9ucys9ZjtxcihhLGIrMSxjKTtzcihhLGYpO3ZyKGEsZSk7Yj1lLnZlcnRleGVzLk5hKCk7Yi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PT1hfHxudWxsPT09Ynx8YT09PWI/MDpiLnRkLWEudGQ7fSk7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl7d3IoYSxiW2NdKTt9YS5KZj1kO319ZnVuY3Rpb24gdHIoYSxiKXtpZigxMDxifHwzPmEubmV0d29yay52ZXJ0ZXhlcy5jb3VudClyZXR1cm4hMTthLnBoPWEubmV0d29yay52ZXJ0ZXhlcy5OYSgpO2E9YS5waDthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09PWF8fG51bGw9PT1ifHxhPT09Yj8wOmIudGQtYS50ZDt9KTtmb3IoYj1hLmxlbmd0aC0xOzA8PWImJjE+PWFbYl0udGQ7KXtiLS07fXJldHVybiAxPGEubGVuZ3RoLWI7fWZ1bmN0aW9uIHVyKGEsYil7Zm9yKHZhciBjPWEubmV0d29yayxkPW5ldyBwcihhKSxlPTA7ZTxhLnBoLmxlbmd0aDtlKyspe3ZhciBmPWEucGhbZV07aWYoMTxmLnRkKXtkLnNoKGYpO3ZhciBnPW5ldyB4cigpO2cuQnQ9Zi50ZDtnLkN0PWYud2lkdGg7Zy5BdD1mLmhlaWdodDtnLmF3PWYuZm9jdXMueDtnLmJ3PWYuZm9jdXMueTtudWxsPT09Zi5HZSYmKGYuR2U9bmV3IEUoKSk7Zi5HZS5hZGQoZyk7Zi5Fdj1mLkdlLmNvdW50LTE7fWVsc2UgYnJlYWs7fWZvcihmPWMuZWRnZXMuaXRlcmF0b3I7Zi5uZXh0KCk7KXt2YXIgaD1mLnZhbHVlO2U9aC5mcm9tVmVydGV4O2c9aC50b1ZlcnRleDtlLm5ldHdvcms9PT1kJiZnLm5ldHdvcms9PT1kP2QuT2ooaCk6ZS5uZXR3b3JrPT09ZD8oaD1lLlVqLG51bGw9PT1oJiYoaD1uZXcgRSgpLGUuVWo9aCksaC5hZGQoZyksZS50ZC0tLGUuQWgrPWcuQWgpOmcubmV0d29yaz09PWQmJihoPWcuVWosbnVsbD09PWgmJihoPW5ldyBFKCksZy5Vaj1oKSxoLmFkZChlKSxnLnRkLS0sZy5BaCs9ZS5BaCk7fWZvcihlPWQuZWRnZXMuaXRlcmF0b3I7ZS5uZXh0KCk7KXtmPWUudmFsdWUsZi5sZW5ndGgqPU1hdGgubWF4KDEsSC5zcXJ0KChmLmZyb21WZXJ0ZXguQWgrZi50b1ZlcnRleC5BaCkvKDQqYisxKSkpO31mb3IoYj1kLnZlcnRleGVzLml0ZXJhdG9yO2IubmV4dCgpOyl7ZT1iLnZhbHVlO3ZhciBrPWUuVWo7aWYobnVsbCE9PWsmJjA8ay5jb3VudCYmKGc9ZS5HZS5OKGUuR2UuY291bnQtMSkuQnQtZS50ZCwhKDA+PWcpKSl7Zm9yKHZhciBsPWg9MCxtPWsuY291bnQtZzttPGsuY291bnQ7bSsrKXt2YXIgbj1rLk4obSkscD1udWxsO2ZvcihmPW4uZWRnZXMuaXRlcmF0b3I7Zi5uZXh0KCk7KXt2YXIgcT1mLnZhbHVlO2lmKHEubngobik9PT1lKXtwPXE7YnJlYWs7fX1udWxsIT09cCYmKGwrPXAubGVuZ3RoLGgrPW4ud2lkdGgqbi5oZWlnaHQpO31mPWUuY2VudGVyWDtrPWUuY2VudGVyWTttPWUud2lkdGg7bj1lLmhlaWdodDtwPWUuZm9jdXM7cT1tKm47MT5xJiYocT0xKTtoPUguc3FydCgoaCtxK2wqbCo0LyhnKmcpKS9xKTtnPShoLTEpKm0vMjtoPShoLTEpKm4vMjtlLmJvdW5kcz1uZXcgTihmLXAueC1nLGstcC55LWgsbSsyKmcsbisyKmgpO2UuZm9jdXM9bmV3IEcocC54K2cscC55K2gpO319YS5uZXR3b3JrPWQ7cmV0dXJuIGM7fWZ1bmN0aW9uIHZyKGEsYil7Zm9yKHZhciBjPWEubmV0d29yay52ZXJ0ZXhlcy5pdGVyYXRvcjtjLm5leHQoKTspe3ZhciBkPWMudmFsdWU7ZC5uZXR3b3JrPWI7aWYobnVsbCE9PWQuR2Upe3ZhciBlPWQuR2UuTihkLkV2KTtkLnRkPWUuQnQ7dmFyIGY9ZS5hdyxnPWUuYnc7ZC5ib3VuZHM9bmV3IE4oZC5jZW50ZXJYLWYsZC5jZW50ZXJZLWcsZS5DdCxlLkF0KTtkLmZvY3VzPW5ldyBHKGYsZyk7ZC5Fdi0tO319Zm9yKGM9YS5uZXR3b3JrLmVkZ2VzLml0ZXJhdG9yO2MubmV4dCgpOyl7Yy52YWx1ZS5uZXR3b3JrPWI7fWEubmV0d29yaz1iO31mdW5jdGlvbiB3cihhLGIpe3ZhciBjPWIuVWo7aWYobnVsbCE9PWMmJjAhPT1jLmNvdW50KXt2YXIgZD1iLmNlbnRlclgsZT1iLmNlbnRlclksZj1iLndpZHRoLGc9Yi5oZWlnaHQ7bnVsbCE9PWIuR2UmJjA8Yi5HZS5jb3VudCYmKGc9Yi5HZS5OKDApLGY9Zy5DdCxnPWcuQXQpO2Y9SC5zcXJ0KGYqZitnKmcpLzI7Zm9yKHZhciBoPSExLGs9Zz0wLGw9MCxtPWIudmVydGV4ZXMuaXRlcmF0b3I7bS5uZXh0KCk7KXt2YXIgbj1tLnZhbHVlOzE+PW4udGQ/aysrOihoPSEwLGwrKyxnKz1NYXRoLmF0YW4yKGIuY2VudGVyWS1uLmNlbnRlclksYi5jZW50ZXJYLW4uY2VudGVyWCkpO31pZigwIT09aylmb3IoMDxsJiYoZy89bCksbD1iPTAsYj1oPzIqTWF0aC5QSS8oaysxKToyKk1hdGguUEkvaywwPT09ayUyJiYobD1iLzIpLDE8Yy5jb3VudCYmYy5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PT1hfHxudWxsPT09Ynx8YT09PWI/MDpiLndpZHRoKmIuaGVpZ2h0LWEud2lkdGgqYS5oZWlnaHQ7fSksaD0wPT09ayUyPzA6MSxjPWMuaXRlcmF0b3I7Yy5uZXh0KCk7KXtpZihrPWMudmFsdWUsISgxPGsudGR8fGEuaXNGaXhlZChrKSkpe209bnVsbDtmb3Iobj1rLmVkZ2VzLml0ZXJhdG9yO24ubmV4dCgpOyl7bT1uLnZhbHVlO2JyZWFrO31uPWsud2lkdGg7dmFyIHA9ay5oZWlnaHQ7bj1ILnNxcnQobipuK3AqcCkvMjttPWYrbS5sZW5ndGgrbjtuPWcrKGIqKGgvMj4+MSkrbCkqKDA9PT1oJTI/MTotMSk7ay5jZW50ZXJYPWQrbSpNYXRoLmNvcyhuKTtrLmNlbnRlclk9ZSttKk1hdGguc2luKG4pO2grKzt9fX19ZnVuY3Rpb24gcnIoYSxiLGMsZCxlLGYsZyl7dmFyIGg9OUUxOSxrPS0xLGw9MDthOmZvcig7bDxiO2wrKyl7dmFyIG09YVtsXSxuPW0ueC1jLHA9bS55LWQ7bj1uKm4rcCpwO2lmKG48aCl7Zm9yKHA9bC0xOzA8PXA7cC0tKXtpZihhW3BdLnk+bS55JiZhW3BdLngtbS54PGUrZy53aWR0aCljb250aW51ZSBhO31mb3IocD1sKzE7cDxiO3ArKyl7aWYoYVtwXS54Pm0ueCYmYVtwXS55LW0ueTxmK2cuaGVpZ2h0KWNvbnRpbnVlIGE7fWs9bDtoPW47fX1yZXR1cm4gazt9b3IucHJvdG90eXBlLkl1PWZ1bmN0aW9uKCl7aWYodGhpcy5jb21tZW50cylmb3IodmFyIGE9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2EubmV4dCgpOyl7dGhpcy5hZGRDb21tZW50cyhhLnZhbHVlKTt9fTtvci5wcm90b3R5cGUuYWRkQ29tbWVudHM9ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlO2lmKG51bGwhPT1iKWZvcihiPWIuWHUoKTtiLm5leHQoKTspe3ZhciBjPWIudmFsdWU7aWYoIkNvbW1lbnQiPT09Yy5jYXRlZ29yeSYmYy5pc1Zpc2libGUoKSl7dmFyIGQ9dGhpcy5uZXR3b3JrLklpKGMpO251bGw9PT1kJiYoZD10aGlzLm5ldHdvcmsuUmwoYykpO2QuY2hhcmdlPXRoaXMuZGVmYXVsdENvbW1lbnRFbGVjdHJpY2FsQ2hhcmdlO2M9bnVsbDtmb3IodmFyIGU9ZC5kZXN0aW5hdGlvbkVkZ2VzO2UubmV4dCgpOyl7dmFyIGY9ZS52YWx1ZTtpZihmLnRvVmVydGV4PT09YSl7Yz1mO2JyZWFrO319aWYobnVsbD09PWMpZm9yKGU9ZC5zb3VyY2VFZGdlcztlLm5leHQoKTspe2lmKGY9ZS52YWx1ZSxmLmZyb21WZXJ0ZXg9PT1hKXtjPWY7YnJlYWs7fX1udWxsPT09YyYmKGM9dGhpcy5uZXR3b3JrLmZrKGEsZCxudWxsKSk7Yy5sZW5ndGg9dGhpcy5kZWZhdWx0Q29tbWVudFNwcmluZ0xlbmd0aDt9fX07ZnVuY3Rpb24geXIoYSxiKXt2YXIgYz1hLmJvdW5kcyxkPWMueDthPWMueTt2YXIgZT1jLndpZHRoO2M9Yy5oZWlnaHQ7dmFyIGY9Yi5ib3VuZHMsZz1mLng7Yj1mLnk7dmFyIGg9Zi53aWR0aDtmPWYuaGVpZ2h0O3JldHVybiBkK2U8Zz9hPmIrZj8oYz1kK2UtZyxhPWEtYi1mLEguc3FydChjKmMrYSphKSk6YStjPGI/KGQ9ZCtlLWcsYT1hK2MtYixILnNxcnQoZCpkK2EqYSkpOmctKGQrZSk6ZD5nK2g/YT5iK2Y/KGM9ZC1nLWgsYT1hLWItZixILnNxcnQoYypjK2EqYSkpOmErYzxiPyhkPWQtZy1oLGE9YStjLWIsSC5zcXJ0KGQqZCthKmEpKTpkLShnK2gpOmE+YitmP2EtKGIrZik6YStjPGI/Yi0oYStjKTouMTt9ZnVuY3Rpb24gc3IoYSxiKXthLnBoPW51bGw7Zm9yKGI9YS4kbitiO2EuJG48YiYmKGEuJG4rKyx6cihhKSk7KXs7fWEucGg9bnVsbDt9ZnVuY3Rpb24genIoYSl7bnVsbD09PWEucGgmJihhLnBoPWEubmV0d29yay52ZXJ0ZXhlcy5OYSgpKTt2YXIgYj1hLnBoO2lmKDA+PWIubGVuZ3RoKXJldHVybiExO3ZhciBjPWJbMF07Yy5mb3JjZVg9MDtjLmZvcmNlWT0wO2Zvcih2YXIgZD1jLmNlbnRlclgsZT1kLGY9Yz1jLmNlbnRlclksZz0xO2c8Yi5sZW5ndGg7ZysrKXt2YXIgaD1iW2ddO2guZm9yY2VYPTA7aC5mb3JjZVk9MDt2YXIgaz1oLmNlbnRlclg7aD1oLmNlbnRlclk7ZD1NYXRoLm1pbihkLGspO2U9TWF0aC5tYXgoZSxrKTtjPU1hdGgubWluKGMsaCk7Zj1NYXRoLm1heChmLGgpO30oZT1lLWQ+Zi1jKT9iLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09PWF8fG51bGw9PT1ifHxhPT09Yj8wOmEuY2VudGVyWC1iLmNlbnRlclg7fSk6Yi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PT1hfHxudWxsPT09Ynx8YT09PWI/MDphLmNlbnRlclktYi5jZW50ZXJZO30pO2M9YS5KZjt2YXIgbD1kPWg9MDtmb3IoZj0wO2Y8Yi5sZW5ndGg7ZisrKXtnPWJbZl07ZD1nLmJvdW5kcztoPWcuZm9jdXM7az1kLngraC54O3ZhciBtPWQueStoLnk7ZD1nLmNoYXJnZSphLmVsZWN0cmljYWxGaWVsZFgoayxtKTtsPWcuY2hhcmdlKmEuZWxlY3RyaWNhbEZpZWxkWShrLG0pO2QrPWcubWFzcyphLmdyYXZpdGF0aW9uYWxGaWVsZFgoayxtKTtsKz1nLm1hc3MqYS5ncmF2aXRhdGlvbmFsRmllbGRZKGssbSk7Zy5mb3JjZVgrPWQ7Zy5mb3JjZVkrPWw7Zm9yKHZhciBuPWYrMTtuPGIubGVuZ3RoO24rKyl7dmFyIHA9YltuXTtpZihwIT09Zyl7ZD1wLmJvdW5kcztoPXAuZm9jdXM7bD1kLngraC54O3ZhciBxPWQueStoLnk7aWYoay1sPmN8fGwtaz5jKXtpZihlKWJyZWFrO31lbHNlIGlmKG0tcT5jfHxxLW0+Yyl7aWYoIWUpYnJlYWs7fWVsc2V7dmFyIHI9eXIoZyxwKTsxPnI/KGQ9YS5yYW5kb21OdW1iZXJHZW5lcmF0b3IsbnVsbD09PWQmJihhLnJhbmRvbU51bWJlckdlbmVyYXRvcj1kPW5ldyBBcigpKSxyPWQucmFuZG9tKCksaD1kLnJhbmRvbSgpLGs+bD8oZD1NYXRoLmFicyhwLmJvdW5kcy5yaWdodC1nLmJvdW5kcy54KSxkPSgxK2QpKnIpOms8bD8oZD1NYXRoLmFicyhwLmJvdW5kcy54LWcuYm91bmRzLnJpZ2h0KSxkPS0oMStkKSpyKTooZD1NYXRoLm1heChwLndpZHRoLGcud2lkdGgpLGQ9KDErZCkqci1kLzIpLG0+cT8obD1NYXRoLmFicyhwLmJvdW5kcy5ib3R0b20tZy5ib3VuZHMueSksbD0oMStsKSpoKTprPGw/KGw9TWF0aC5hYnMocC5ib3VuZHMueS1nLmJvdW5kcy5ib3R0b20pLGw9LSgxK2wpKmgpOihsPU1hdGgubWF4KHAuaGVpZ2h0LGcuaGVpZ2h0KSxsPSgxK2wpKmgtbC8yKSk6KGg9LShnLmNoYXJnZSpwLmNoYXJnZSkvKHIqciksZD0obC1rKS9yKmgsbD0ocS1tKS9yKmgpO2cuZm9yY2VYKz1kO2cuZm9yY2VZKz1sO3AuZm9yY2VYLT1kO3AuZm9yY2VZLT1sO319fX1mb3IoZT1hLm5ldHdvcmsuZWRnZXMuaXRlcmF0b3I7ZS5uZXh0KCk7KXtoPWUudmFsdWUsYz1oLmZyb21WZXJ0ZXgsZj1oLnRvVmVydGV4LGc9Yy5ib3VuZHMsaz1jLmZvY3VzLGQ9Zy54K2sueCxnPWcueStrLnksbT1mLmJvdW5kcyxuPWYuZm9jdXMsaz1tLngrbi54LG09bS55K24ueSxuPXlyKGMsZiksMT5uPyhuPWEucmFuZG9tTnVtYmVyR2VuZXJhdG9yLG51bGw9PT1uJiYoYS5yYW5kb21OdW1iZXJHZW5lcmF0b3I9bj1uZXcgQXIoKSksaD1uLnJhbmRvbSgpLG49bi5yYW5kb20oKSxkPShkPms/MTotMSkqKDErKGYud2lkdGg+Yy53aWR0aD9mLndpZHRoOmMud2lkdGgpKSpoLGw9KGc+bT8xOi0xKSooMSsoZi5oZWlnaHQ+Yy5oZWlnaHQ/Zi5oZWlnaHQ6Yy5oZWlnaHQpKSpuKTooaD1oLnN0aWZmbmVzcyoobi1oLmxlbmd0aCksZD0oay1kKS9uKmgsbD0obS1nKS9uKmgpLGMuZm9yY2VYKz1kLGMuZm9yY2VZKz1sLGYuZm9yY2VYLT1kLGYuZm9yY2VZLT1sO31kPTA7ZT1hLm1vdmVMaW1pdDtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtmPWJbY10sYS5pc0ZpeGVkKGYpP2EubW92ZUZpeGVkVmVydGV4KGYpOihnPWYuZm9yY2VYLGs9Zi5mb3JjZVksZzwtZT9nPS1lOmc+ZSYmKGc9ZSksazwtZT9rPS1lOms+ZSYmKGs9ZSksZi5jZW50ZXJYKz1nLGYuY2VudGVyWSs9ayxkPU1hdGgubWF4KGQsZypnK2sqaykpO31yZXR1cm4gZD5hLmVwc2lsb25EaXN0YW5jZSphLmVwc2lsb25EaXN0YW5jZTt9b3IucHJvdG90eXBlLm1vdmVGaXhlZFZlcnRleD1mdW5jdGlvbigpe307b3IucHJvdG90eXBlLmNvbW1pdExheW91dD1mdW5jdGlvbigpe3RoaXMuSnYoKTt0aGlzLmNvbW1pdE5vZGVzKCk7dGhpcy5pc1JvdXRpbmcmJnRoaXMuY29tbWl0TGlua3MoKTt9O29yLnByb3RvdHlwZS5Kdj1mdW5jdGlvbigpe2lmKHRoaXMuc2V0c1BvcnRTcG90cylmb3IodmFyIGE9dGhpcy5uZXR3b3JrLmVkZ2VzLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGI9YS52YWx1ZS5saW5rO251bGwhPT1iJiYoYi5mcm9tU3BvdD1FZCxiLnRvU3BvdD1FZCk7fX07b3IucHJvdG90eXBlLmNvbW1pdE5vZGVzPWZ1bmN0aW9uKCl7dmFyIGE9MCxiPTA7aWYodGhpcy5hcnJhbmdlc1RvT3JpZ2luKXt2YXIgYz1OLmFsbG9jKCk7dGhpcy5jb21wdXRlQm91bmRzKHRoaXMubmV0d29yayxjKTtiPXRoaXMuYXJyYW5nZW1lbnRPcmlnaW47YT1iLngtYy54O2I9Yi55LWMueTtOLmZyZWUoYyk7fWM9Ti5hbGxvYygpO2Zvcih2YXIgZD10aGlzLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlO2lmKDAhPT1hfHwwIT09YiljLmFzc2lnbihlLmJvdW5kcyksYy54Kz1hLGMueSs9YixlLmJvdW5kcz1jO2UuY29tbWl0KCk7fU4uZnJlZShjKTt9O29yLnByb3RvdHlwZS5jb21taXRMaW5rcz1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm5ldHdvcmsuZWRnZXMuaXRlcmF0b3I7YS5uZXh0KCk7KXthLnZhbHVlLmNvbW1pdCgpO319O29yLnByb3RvdHlwZS5zcHJpbmdTdGlmZm5lc3M9ZnVuY3Rpb24oYSl7YT1hLnN0aWZmbmVzcztyZXR1cm4gaXNOYU4oYSk/dGhpcy5QazphO307b3IucHJvdG90eXBlLnNwcmluZ0xlbmd0aD1mdW5jdGlvbihhKXthPWEubGVuZ3RoO3JldHVybiBpc05hTihhKT90aGlzLk9rOmE7fTtvci5wcm90b3R5cGUuZWxlY3RyaWNhbENoYXJnZT1mdW5jdGlvbihhKXthPWEuY2hhcmdlO3JldHVybiBpc05hTihhKT90aGlzLk1rOmE7fTtvci5wcm90b3R5cGUuZWxlY3RyaWNhbEZpZWxkWD1mdW5jdGlvbigpe3JldHVybiAwO307b3IucHJvdG90eXBlLmVsZWN0cmljYWxGaWVsZFk9ZnVuY3Rpb24oKXtyZXR1cm4gMDt9O29yLnByb3RvdHlwZS5ncmF2aXRhdGlvbmFsTWFzcz1mdW5jdGlvbihhKXthPWEubWFzcztyZXR1cm4gaXNOYU4oYSk/dGhpcy5OazphO307b3IucHJvdG90eXBlLmdyYXZpdGF0aW9uYWxGaWVsZFg9ZnVuY3Rpb24oKXtyZXR1cm4gMDt9O29yLnByb3RvdHlwZS5ncmF2aXRhdGlvbmFsRmllbGRZPWZ1bmN0aW9uKCl7cmV0dXJuIDA7fTtvci5wcm90b3R5cGUuaXNGaXhlZD1mdW5jdGlvbihhKXtyZXR1cm4gYS5pc0ZpeGVkO307cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob3IucHJvdG90eXBlLHtjdXJyZW50SXRlcmF0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuJG47fX0sYXJyYW5nZW1lbnRTcGFjaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMud2Q7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMud2QuQShhKXx8KHRoaXMud2QuYXNzaWduKGEpLHRoaXMuQigpKTt9fSxhcnJhbmdlc1RvT3JpZ2luOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUm07fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuUm0hPT1hJiYodGhpcy5SbT1hLHRoaXMuQigpKTt9fSxzZXRzUG9ydFNwb3RzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWWU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuWWUhPT1hJiYodGhpcy5ZZT1hLHRoaXMuQigpKTt9fSxjb21tZW50czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlhjO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlhjIT09YSYmKHRoaXMuWGM9YSx0aGlzLkIoKSk7fX0sbWF4SXRlcmF0aW9uczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnFsO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnFsIT09YSYmMDw9YSYmKHRoaXMucWw9YSx0aGlzLkIoKSk7fX0sZXBzaWxvbkRpc3RhbmNlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ247fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuQ24hPT1hJiYwPGEmJih0aGlzLkNuPWEsdGhpcy5CKCkpO319LGluZmluaXR5RGlzdGFuY2U6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5KZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5KZiE9PWEmJjE8YSYmKHRoaXMuSmY9YSx0aGlzLkIoKSk7fX0sbW92ZUxpbWl0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudm87fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudm8hPT1hJiYxPGEmJih0aGlzLnZvPWEsdGhpcy5CKCkpO319LHJhbmRvbU51bWJlckdlbmVyYXRvcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlNvO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlNvIT09YSYmKG51bGwhPT1hJiYiZnVuY3Rpb24iIT09dHlwZW9mIGEucmFuZG9tJiZBKCdGb3JjZURpcmVjdGVkTGF5b3V0LnJhbmRvbU51bWJlckdlbmVyYXRvciBtdXN0IGhhdmUgYSAicmFuZG9tKCkiIGZ1bmN0aW9uIG9uIGl0OiAnK2EpLHRoaXMuU289YSk7fX0sZGVmYXVsdFNwcmluZ1N0aWZmbmVzczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlBrO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlBrIT09YSYmKHRoaXMuUGs9YSx0aGlzLkIoKSk7fX0sZGVmYXVsdFNwcmluZ0xlbmd0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk9rO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk9rIT09YSYmKHRoaXMuT2s9YSx0aGlzLkIoKSk7fX0sZGVmYXVsdEVsZWN0cmljYWxDaGFyZ2U6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Nazt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5NayE9PWEmJih0aGlzLk1rPWEsdGhpcy5CKCkpO319LGRlZmF1bHRHcmF2aXRhdGlvbmFsTWFzczp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk5rO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk5rIT09YSYmKHRoaXMuTms9YSx0aGlzLkIoKSk7fX0sZGVmYXVsdENvbW1lbnRTcHJpbmdMZW5ndGg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5wbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5wbiE9PWEmJih0aGlzLnBuPWEsdGhpcy5CKCkpO319LGRlZmF1bHRDb21tZW50RWxlY3RyaWNhbENoYXJnZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLm9uO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLm9uIT09YSYmKHRoaXMub249YSx0aGlzLkIoKSk7fX19KTtvci5jbGFzc05hbWU9IkZvcmNlRGlyZWN0ZWRMYXlvdXQiO2Z1bmN0aW9uIHhyKCl7dGhpcy5idz10aGlzLmF3PXRoaXMuQXQ9dGhpcy5DdD10aGlzLkJ0PTA7fXhyLmNsYXNzTmFtZT0iRm9yY2VEaXJlY3RlZFN1Ym5ldCI7ZnVuY3Rpb24gcHIoYSl7eXAuY2FsbCh0aGlzLGEpO31vYShwcix5cCk7cHIucHJvdG90eXBlLmNyZWF0ZVZlcnRleD1mdW5jdGlvbigpe3JldHVybiBuZXcgQnIodGhpcyk7fTtwci5wcm90b3R5cGUuY3JlYXRlRWRnZT1mdW5jdGlvbigpe3JldHVybiBuZXcgQ3IodGhpcyk7fTtwci5jbGFzc05hbWU9IkZvcmNlRGlyZWN0ZWROZXR3b3JrIjtmdW5jdGlvbiBCcihhKXtCcC5jYWxsKHRoaXMsYSk7dGhpcy5NYT0hMTt0aGlzLlZiPXRoaXMuSz1OYU47dGhpcy5BaD10aGlzLnRkPXRoaXMuTGE9dGhpcy5iYT0wO3RoaXMuR2U9dGhpcy5Vaj1udWxsO3RoaXMuRXY9MDt9b2EoQnIsQnApO3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEJyLnByb3RvdHlwZSx7aXNGaXhlZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1hO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk1hIT09YSYmKHRoaXMuTWE9YSk7fX0sY2hhcmdlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LIT09YSYmKHRoaXMuSz1hKTt9fSxtYXNzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVmIhPT1hJiYodGhpcy5WYj1hKTt9fSxmb3JjZVg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5iYTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5iYSE9PWEmJih0aGlzLmJhPWEpO319LGZvcmNlWTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkxhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkxhIT09YSYmKHRoaXMuTGE9YSk7fX19KTtCci5jbGFzc05hbWU9IkZvcmNlRGlyZWN0ZWRWZXJ0ZXgiO2Z1bmN0aW9uIENyKGEpe0NwLmNhbGwodGhpcyxhKTt0aGlzLmw9dGhpcy51PU5hTjt9b2EoQ3IsQ3ApO3BhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENyLnByb3RvdHlwZSx7c3RpZmZuZXNzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy51IT09YSYmKHRoaXMudT1hKTt9fSxsZW5ndGg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmwhPT1hJiYodGhpcy5sPWEpO319fSk7Q3IuY2xhc3NOYW1lPSJGb3JjZURpcmVjdGVkRWRnZSI7ZnVuY3Rpb24gQXIoKXt2YXIgYT0wO3ZvaWQgMD09PWEmJihhPTQyKTt0aGlzLnNlZWQ9YTt0aGlzLlB4PTQ4MjcxO3RoaXMuUng9MjE0NzQ4MzY0Nzt0aGlzLlE9NDQ0ODguMDcwNDE0OTQ4OTM7dGhpcy5UeD0zMzk5O3RoaXMuUXg9MS8yMTQ3NDgzNjQ3O3RoaXMucmFuZG9tKCk7fUFyLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlZWQldGhpcy5RKnRoaXMuUHgtdGhpcy5zZWVkL3RoaXMuUSp0aGlzLlR4OzA8YT90aGlzLnNlZWQ9YTp0aGlzLnNlZWQ9YSt0aGlzLlJ4O3JldHVybiB0aGlzLnNlZWQqdGhpcy5ReDt9O0FyLmNsYXNzTmFtZT0iUmFuZG9tTnVtYmVyR2VuZXJhdG9yIjtmdW5jdGlvbiBEcigpe3lpLmNhbGwodGhpcyk7dGhpcy5YYj10aGlzLmtlPTI1O3RoaXMuTD0wO3RoaXMuS2s9RXI7dGhpcy5sbD1Gcjt0aGlzLmJsPUdyO3RoaXMucGo9NDt0aGlzLnZrPUhyO3RoaXMuJGY9Nzt0aGlzLlllPSEwO3RoaXMuZm89NDt0aGlzLkhhPXRoaXMuTHI9dGhpcy55YT0tMTt0aGlzLm9kPXRoaXMucW89MDt0aGlzLkthPXRoaXMubGQ9dGhpcy5tZD10aGlzLkdkPXRoaXMuZmM9bnVsbDt0aGlzLnhvPTA7dGhpcy53bz10aGlzLnVqPW51bGw7dGhpcy5MZD0wO3RoaXMueW89bnVsbDt0aGlzLmp3PW5ldyBHKCk7dGhpcy5vZT1bXTt0aGlzLm9lLmxlbmd0aD0xMDA7fW9hKERyLHlpKTtEci5wcm90b3R5cGUuY2xvbmVQcm90ZWN0ZWQ9ZnVuY3Rpb24oYSl7eWkucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkLmNhbGwodGhpcyxhKTthLmtlPXRoaXMua2U7YS5YYj10aGlzLlhiO2EuTD10aGlzLkw7YS5Laz10aGlzLktrO2EubGw9dGhpcy5sbDthLmJsPXRoaXMuYmw7YS5waj10aGlzLnBqO2Eudms9dGhpcy52azthLiRmPXRoaXMuJGY7YS5ZZT10aGlzLlllO2EuZm89dGhpcy5mbzt9O0RyLnByb3RvdHlwZS5mYj1mdW5jdGlvbihhKXthLmNsYXNzVHlwZT09PURyPzA9PT1hLm5hbWUuaW5kZXhPZigiQWdncmVzc2l2ZSIpP3RoaXMuYWdncmVzc2l2ZU9wdGlvbj1hOjA9PT1hLm5hbWUuaW5kZXhPZigiQ3ljbGUiKT90aGlzLmN5Y2xlUmVtb3ZlT3B0aW9uPWE6MD09PWEubmFtZS5pbmRleE9mKCJJbml0Iik/dGhpcy5pbml0aWFsaXplT3B0aW9uPWE6MD09PWEubmFtZS5pbmRleE9mKCJMYXllciIpP3RoaXMubGF5ZXJpbmdPcHRpb249YTpBKCJVbmtub3duIGVudW0gdmFsdWU6ICIrYSk6eWkucHJvdG90eXBlLmZiLmNhbGwodGhpcyxhKTt9O0RyLnByb3RvdHlwZS5jcmVhdGVOZXR3b3JrPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBJcih0aGlzKTt9O0RyLnByb3RvdHlwZS5kb0xheW91dD1mdW5jdGlvbihhKXtudWxsPT09dGhpcy5uZXR3b3JrJiYodGhpcy5uZXR3b3JrPXRoaXMubWFrZU5ldHdvcmsoYSkpO3RoaXMuYXJyYW5nZW1lbnRPcmlnaW49dGhpcy5pbml0aWFsT3JpZ2luKHRoaXMuYXJyYW5nZW1lbnRPcmlnaW4pO3RoaXMuTHI9LTE7dGhpcy5vZD10aGlzLnFvPTA7dGhpcy55bz10aGlzLndvPXRoaXMudWo9bnVsbDtmb3IoYT0wO2E8dGhpcy5vZS5sZW5ndGg7YSsrKXt0aGlzLm9lW2FdPW51bGw7fWlmKDA8dGhpcy5uZXR3b3JrLnZlcnRleGVzLmNvdW50KXt0aGlzLm5ldHdvcmsuUHAoKTt0aGlzLmN5Y2xlUmVtb3ZlT3B0aW9uIT09SnImJnRoaXMucmVtb3ZlQ3ljbGVzKCk7Zm9yKGE9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2EubmV4dCgpOyl7YS52YWx1ZS5sYXllcj0tMTt9dGhpcy55YT0tMTt0aGlzLmFzc2lnbkxheWVycygpO2ZvcihhLnJlc2V0KCk7YS5uZXh0KCk7KXt0aGlzLnlhPU1hdGgubWF4KHRoaXMueWEsYS52YWx1ZS5sYXllcik7fXRoaXMuY3ljbGVSZW1vdmVPcHRpb249PT1KciYmdGhpcy5yZW1vdmVDeWNsZXMoKTthPXRoaXMubmV0d29yaztmb3IodmFyIGI9W10sYz1hLmVkZ2VzLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGQ9Yy52YWx1ZTtkLnZhbGlkPSExO2IucHVzaChkKTt9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl7ZD1iW2NdO3ZhciBlPWQuZnJvbVZlcnRleCxmPWQudG9WZXJ0ZXg7aWYoIWQudmFsaWQmJihudWxsIT09ZS5ub2RlJiZudWxsIT09Zi5ub2RlfHxlLmxheWVyIT09Zi5sYXllcikpe3ZhciBnPTAsaD0wLGs9MCxsPTA7aWYobnVsbCE9PWQubGluayl7aD1kLmxpbms7aWYobnVsbD09PWgpY29udGludWU7dmFyIG09ZS5ub2RlO2c9Zi5ub2RlO2lmKG51bGw9PT1tfHxudWxsPT09Zyljb250aW51ZTt2YXIgbj1oLmZyb21Ob2RlO2s9aC50b05vZGU7dmFyIHA9aC5mcm9tUG9ydDtoPWgudG9Qb3J0O2lmKGQucmV2KXtsPW47dmFyIHE9cDtuPWs7cD1oO2s9bDtoPXE7fXZhciByPWUuZm9jdXM7bD1mLmZvY3VzO3ZhciB1PWQucmV2P2YuYm91bmRzOmUuYm91bmRzO3E9Ry5hbGxvYygpO20hPT1uP3UubygpJiZuLmlzVmlzaWJsZSgpP24uYWN0dWFsQm91bmRzLm8oKT8obi5uZihwLGRkLHEpLHEueCs9bi5hY3R1YWxCb3VuZHMueC11LngscS55Kz1uLmFjdHVhbEJvdW5kcy55LXUueSk6KG4ubmYocCxkZCxxKSxxLm8oKXx8cS5hc3NpZ24ocikpOnEuYXNzaWduKHIpOnUubygpPyhuLm5mKHAsZGQscSkscS5vKCl8fHEuYXNzaWduKHIpKTpxLmFzc2lnbihyKTtuPWQucmV2P2UuYm91bmRzOmYuYm91bmRzO209Ry5hbGxvYygpO2chPT1rP24ubygpJiZrLmlzVmlzaWJsZSgpP2suYWN0dWFsQm91bmRzLm8oKT8oay5uZihoLGRkLG0pLG0ueCs9ay5hY3R1YWxCb3VuZHMueC1uLngsbS55Kz1rLmFjdHVhbEJvdW5kcy55LW4ueSk6KGsubmYoaCxkZCxtKSxtLm8oKXx8bS5hc3NpZ24obCkpOm0uYXNzaWduKGwpOm4ubygpPyhrLm5mKGgsZGQsbSksbS5vKCl8fG0uYXNzaWduKGwpKTptLmFzc2lnbihsKTs5MD09PXRoaXMuTHx8MjcwPT09dGhpcy5MPyhnPU1hdGgucm91bmQoKHEueC1yLngpL3RoaXMuWGIpLGs9cS54LGg9TWF0aC5yb3VuZCgobS54LWwueCkvdGhpcy5YYiksbD1tLngpOihnPU1hdGgucm91bmQoKHEueS1yLnkpL3RoaXMuWGIpLGs9cS55LGg9TWF0aC5yb3VuZCgobS55LWwueSkvdGhpcy5YYiksbD1tLnkpO0cuZnJlZShxKTtHLmZyZWUobSk7ZC5wb3J0RnJvbUNvbE9mZnNldD1nO2QucG9ydEZyb21Qb3M9aztkLnBvcnRUb0NvbE9mZnNldD1oO2QucG9ydFRvUG9zPWw7fWVsc2UgZC5wb3J0RnJvbUNvbE9mZnNldD0wLGQucG9ydEZyb21Qb3M9MCxkLnBvcnRUb0NvbE9mZnNldD0wLGQucG9ydFRvUG9zPTA7cT1lLmxheWVyO209Zi5sYXllcjtuPTA7dT1kLmxpbms7aWYobnVsbCE9PXUpe3ZhciB4PXUuZnJvbVBvcnQsdj11LnRvUG9ydDtpZihudWxsIT09eCYmbnVsbCE9PXYpe3ZhciB5PXUuZnJvbU5vZGU7cD11LnRvTm9kZTtpZihudWxsIT09eSYmbnVsbCE9PXApe3ZhciB6PUtyKHRoaXMsITApLEI9S3IodGhpcywhMSksQz10aGlzLnNldHNQb3J0U3BvdHM/ejp1LmNvbXB1dGVTcG90KCEwLHgpO3I9dGhpcy5zZXRzUG9ydFNwb3RzP0I6dS5jb21wdXRlU3BvdCghMSx2KTt2YXIgST11LmlzT3J0aG9nb25hbDtDLnFmKCkmJkMucGYoQikmJnIucWYoKSYmci5wZih6KT9uPTA6KHo9dS5nZXRMaW5rUG9pbnQoeSx4LEMsITAsSSxwLHYsRy5hbGxvYygpKSxCPXUuZ2V0TGlua0RpcmVjdGlvbih5LHgseixDLCEwLEkscCx2KSxHLmZyZWUoeiksQy5ldCgpfHxCIT09THIodGhpcyxkLCEwKT90aGlzLnNldHNQb3J0U3BvdHMmJm51bGwhPT15JiYxPT09eS5wb3J0cy5jb3VudCYmZC5yZXYmJihuKz0xKTpuKz0xLEM9dS5nZXRMaW5rUG9pbnQocCx2LHIsITEsSSx5LHgsRy5hbGxvYygpKSx1PXUuZ2V0TGlua0RpcmVjdGlvbihwLHYsQyxyLCExLEkseSx4KSxHLmZyZWUoQyksci5ldCgpfHx1IT09THIodGhpcyxkLCExKT90aGlzLnNldHNQb3J0U3BvdHMmJm51bGwhPT1wJiYxPT09cC5wb3J0cy5jb3VudCYmZC5yZXYmJihuKz0yKTpuKz0yKTt9fX1wPW47bj0xPT09cHx8Mz09PXA/ITA6ITE7aWYocD0yPT09cHx8Mz09PXA/ITA6ITEpcj1hLmNyZWF0ZVZlcnRleCgpLHIubm9kZT1udWxsLHIuUGo9MSxyLmxheWVyPXEsci5uZWFyPWUsYS5zaChyKSxlPWEuZmsoZSxyLGQubGluayksZS52YWxpZD0hMSxlLnJldj1kLnJldixlLnBvcnRGcm9tQ29sT2Zmc2V0PWcsZS5wb3J0VG9Db2xPZmZzZXQ9MCxlLnBvcnRGcm9tUG9zPWssZS5wb3J0VG9Qb3M9MCxlPXI7dT0xO24mJnUtLTtpZihxLW0+dSYmMDxxKXtkLnZhbGlkPSExO3I9YS5jcmVhdGVWZXJ0ZXgoKTtyLm5vZGU9bnVsbDtyLlBqPTI7ci5sYXllcj1xLTE7YS5zaChyKTtlPWEuZmsoZSxyLGQubGluayk7ZS52YWxpZD0hMDtlLnJldj1kLnJldjtlLnBvcnRGcm9tQ29sT2Zmc2V0PXA/MDpnO2UucG9ydFRvQ29sT2Zmc2V0PTA7ZS5wb3J0RnJvbVBvcz1wPzA6aztlLnBvcnRUb1Bvcz0wO2U9cjtmb3IocS0tO3EtbT51JiYwPHE7KXtyPWEuY3JlYXRlVmVydGV4KCksci5ub2RlPW51bGwsci5Qaj0zLHIubGF5ZXI9cS0xLGEuc2gociksZT1hLmZrKGUscixkLmxpbmspLGUudmFsaWQ9ITAsZS5yZXY9ZC5yZXYsZS5wb3J0RnJvbUNvbE9mZnNldD0wLGUucG9ydFRvQ29sT2Zmc2V0PTAsZS5wb3J0RnJvbVBvcz0wLGUucG9ydFRvUG9zPTAsZT1yLHEtLTt9ZT1hLmZrKHIsZixkLmxpbmspO2UudmFsaWQ9IW47biYmKHIubmVhcj1mKTtlLnJldj1kLnJldjtlLnBvcnRGcm9tQ29sT2Zmc2V0PTA7ZS5wb3J0VG9Db2xPZmZzZXQ9aDtlLnBvcnRGcm9tUG9zPTA7ZS5wb3J0VG9Qb3M9bDt9ZWxzZSBkLnZhbGlkPSEwO319YT10aGlzLmZjPVtdO2ZvcihiPTA7Yjw9dGhpcy55YTtiKyspe2FbYl09MDt9Zm9yKGI9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2IubmV4dCgpOyl7Yi52YWx1ZS5pbmRleD0tMTt9dGhpcy5pbml0aWFsaXplSW5kaWNlcygpO3RoaXMuTHI9LTE7Zm9yKGM9dGhpcy5vZD10aGlzLnFvPTA7Yzw9dGhpcy55YTtjKyspe2FbY10+YVt0aGlzLm9kXSYmKHRoaXMuTHI9YVtjXS0xLHRoaXMub2Q9YyksYVtjXTxhW3RoaXMucW9dJiYodGhpcy5xbz1jKTt9dGhpcy55bz1bXTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXt0aGlzLnlvW2NdPVtdO31mb3IoYi5yZXNldCgpO2IubmV4dCgpOyl7YT1iLnZhbHVlLHRoaXMueW9bYS5sYXllcl1bYS5pbmRleF09YTt9dGhpcy5IYT0tMTtmb3IoYT0wO2E8PXRoaXMueWE7YSsrKXtiPU1yKHRoaXMsYSk7Yz0wO2Q9dGhpcy5mY1thXTtmb3IoZj0wO2Y8ZDtmKyspe2U9YltmXSxjKz10aGlzLm5vZGVNaW5Db2x1bW5TcGFjZShlLCEwKSxlLmNvbHVtbj1jLGMrPTEsYys9dGhpcy5ub2RlTWluQ29sdW1uU3BhY2UoZSwhMSk7fXRoaXMuSGE9TWF0aC5tYXgodGhpcy5IYSxjLTEpO05yKHRoaXMsYSxiKTt9dGhpcy5yZWR1Y2VDcm9zc2luZ3MoKTt0aGlzLnN0cmFpZ2h0ZW5BbmRQYWNrKCk7dGhpcy51cGRhdGVQYXJ0cygpO310aGlzLm5ldHdvcms9bnVsbDt0aGlzLmlzVmFsaWRMYXlvdXQ9ITA7fTtEci5wcm90b3R5cGUubGlua01pbkxlbmd0aD1mdW5jdGlvbigpe3JldHVybiAxO307ZnVuY3Rpb24gT3IoYSl7dmFyIGI9YS5mcm9tVmVydGV4Lm5vZGU7YT1hLnRvVmVydGV4Lm5vZGU7cmV0dXJuIG51bGw9PT1iJiZudWxsPT09YT84Om51bGw9PT1ifHxudWxsPT09YT80OjE7fURyLnByb3RvdHlwZS5ub2RlTWluTGF5ZXJTcGFjZT1mdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT09YS5ub2RlPzA6OTA9PT10aGlzLkx8fDI3MD09PXRoaXMuTD9iP2EuZm9jdXMueSsxMDphLmJvdW5kcy5oZWlnaHQtYS5mb2N1cy55KzEwOmI/YS5mb2N1cy54KzEwOmEuYm91bmRzLndpZHRoLWEuZm9jdXMueCsxMDt9O0RyLnByb3RvdHlwZS5ub2RlTWluQ29sdW1uU3BhY2U9ZnVuY3Rpb24oYSxiKXtpZihudWxsPT09YS5ub2RlKXJldHVybiAwO3ZhciBjPWI/YS5xdjphLnB2O2lmKG51bGwhPT1jKXJldHVybiBjO2M9dGhpcy5MO3JldHVybiA5MD09PWN8fDI3MD09PWM/Yj9hLnF2PWEuZm9jdXMueC90aGlzLlhiKzF8MDphLnB2PShhLmJvdW5kcy53aWR0aC1hLmZvY3VzLngpL3RoaXMuWGIrMXwwOmI/YS5xdj1hLmZvY3VzLnkvdGhpcy5YYisxfDA6YS5wdj0oYS5ib3VuZHMuaGVpZ2h0LWEuZm9jdXMueSkvdGhpcy5YYisxfDA7fTtmdW5jdGlvbiBQcihhKXtudWxsPT09YS51aiYmKGEudWo9W10pO2Zvcih2YXIgYj0wLGM9YS5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGQ9Yy52YWx1ZTthLnVqW2JdPWQubGF5ZXI7YisrO2EudWpbYl09ZC5jb2x1bW47YisrO2EudWpbYl09ZC5pbmRleDtiKys7fXJldHVybiBhLnVqO31mdW5jdGlvbiBRcihhLGIpe3ZhciBjPTA7Zm9yKGE9YS5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGQ9YS52YWx1ZTtkLmxheWVyPWJbY107YysrO2QuY29sdW1uPWJbY107YysrO2QuaW5kZXg9YltjXTtjKys7fX1mdW5jdGlvbiBScihhLGIsYyl7dmFyIGQ9TXIoYSxiKSxlPWEuZmNbYl07aWYobnVsbD09PWEud298fGEud28ubGVuZ3RoPGUqZSlhLndvPVtdO2Zvcih2YXIgZj1hLndvLGc9MDtnPGU7ZysrKXt2YXIgaD0wLGs9ZFtnXSxsPWsubmVhcjtpZihudWxsIT09bCYmbC5sYXllcj09PWsubGF5ZXIpaWYoaz1sLmluZGV4LGs+Zylmb3IodmFyIG09ZysxO208azttKyspe3ZhciBuPWRbbV07bi5uZWFyPT09bCYmbi5Qaj09PWwuUGp8fGgrKzt9ZWxzZSBmb3IobT1nLTE7bT5rO20tLSl7bj1kW21dLG4ubmVhcj09PWwmJm4uUGo9PT1sLlBqfHxoKys7fXZhciBwO2lmKDA8PWMpZm9yKGs9ZFtnXS5zb3VyY2VFZGdlc0FycmF5QWNjZXNzLGw9MDtsPGsubGVuZ3RoO2wrKyl7dmFyIHE9a1tsXTtpZihxLnZhbGlkJiZxLmZyb21WZXJ0ZXgubGF5ZXIhPT1iKWZvcihuPXEuZnJvbVZlcnRleC5pbmRleCxtPXEucG9ydFRvUG9zLHE9cS5wb3J0RnJvbVBvcyxwPWwrMTtwPGsubGVuZ3RoO3ArKyl7dmFyIHI9a1twXTtpZihyLnZhbGlkJiZyLmZyb21WZXJ0ZXgubGF5ZXIhPT1iKXt2YXIgdT1yLmZyb21WZXJ0ZXguaW5kZXg7dmFyIHg9ci5wb3J0VG9Qb3M7cj1yLnBvcnRGcm9tUG9zO208eCYmKG4+dXx8bj09PXUmJnE+cikmJmgrKzt4PG0mJih1Pm58fHU9PT1uJiZyPnEpJiZoKys7fX19aWYoMD49Yylmb3Ioaz1kW2ddLmRlc3RpbmF0aW9uRWRnZXNBcnJheUFjY2VzcyxsPTA7bDxrLmxlbmd0aDtsKyspe2lmKHE9a1tsXSxxLnZhbGlkJiZxLnRvVmVydGV4LmxheWVyIT09Yilmb3Iobj1xLnRvVmVydGV4LmluZGV4LG09cS5wb3J0VG9Qb3MscT1xLnBvcnRGcm9tUG9zLHA9bCsxO3A8ay5sZW5ndGg7cCsrKXtyPWtbcF0sci52YWxpZCYmci50b1ZlcnRleC5sYXllciE9PWImJih1PXIudG9WZXJ0ZXguaW5kZXgseD1yLnBvcnRUb1BvcyxyPXIucG9ydEZyb21Qb3MscTxyJiYobj51fHxuPT09dSYmbT54KSYmaCsrLHI8cSYmKHU+bnx8dT09PW4mJng+bSkmJmgrKyk7fX1mW2cqZStnXT1oO2ZvcihrPWcrMTtrPGU7aysrKXt2YXIgdj0wLHk9MDtpZigwPD1jKXtoPWRbZ10uc291cmNlRWRnZXNBcnJheUFjY2Vzczt2YXIgej1kW2tdLnNvdXJjZUVkZ2VzQXJyYXlBY2Nlc3M7Zm9yKGw9MDtsPGgubGVuZ3RoO2wrKyl7aWYocT1oW2xdLHEudmFsaWQmJnEuZnJvbVZlcnRleC5sYXllciE9PWIpZm9yKG49cS5mcm9tVmVydGV4LmluZGV4LHE9cS5wb3J0RnJvbVBvcyxwPTA7cDx6Lmxlbmd0aDtwKyspe3I9eltwXSxyLnZhbGlkJiZyLmZyb21WZXJ0ZXgubGF5ZXIhPT1iJiYodT1yLmZyb21WZXJ0ZXguaW5kZXgscj1yLnBvcnRGcm9tUG9zLChuPHV8fG49PT11JiZxPHIpJiZ5KyssKHU8bnx8dT09PW4mJnI8cSkmJnYrKyk7fX19aWYoMD49Yylmb3IoaD1kW2ddLmRlc3RpbmF0aW9uRWRnZXNBcnJheUFjY2Vzcyx6PWRba10uZGVzdGluYXRpb25FZGdlc0FycmF5QWNjZXNzLGw9MDtsPGgubGVuZ3RoO2wrKyl7aWYocT1oW2xdLHEudmFsaWQmJnEudG9WZXJ0ZXgubGF5ZXIhPT1iKWZvcihuPXEudG9WZXJ0ZXguaW5kZXgsbT1xLnBvcnRUb1BvcyxwPTA7cDx6Lmxlbmd0aDtwKyspe3I9eltwXSxyLnZhbGlkJiZyLnRvVmVydGV4LmxheWVyIT09YiYmKHU9ci50b1ZlcnRleC5pbmRleCx4PXIucG9ydFRvUG9zLChuPHV8fG49PT11JiZtPHgpJiZ5KyssKHU8bnx8dT09PW4mJng8bSkmJnYrKyk7fX1mW2cqZStrXT12O2ZbayplK2ddPXk7fX1OcihhLGIsZCk7cmV0dXJuIGY7fURyLnByb3RvdHlwZS5jb3VudENyb3NzaW5ncz1mdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI9MDtiPD10aGlzLnlhO2IrKyl7Zm9yKHZhciBjPVJyKHRoaXMsYiwxKSxkPXRoaXMuZmNbYl0sZT0wO2U8ZDtlKyspe2Zvcih2YXIgZj1lO2Y8ZDtmKyspe2ErPWNbZSpkK2ZdO319fXJldHVybiBhO307ZnVuY3Rpb24gU3IoYSl7Zm9yKHZhciBiPTAsYz0wO2M8PWEueWE7YysrKXtmb3IodmFyIGQ9YSxlPWMsZj1NcihkLGUpLGc9ZC5mY1tlXSxoPTAsaz0wO2s8ZztrKyspe3ZhciBsPWZba10uZGVzdGluYXRpb25FZGdlc0FycmF5QWNjZXNzO2lmKG51bGwhPT1sKWZvcih2YXIgbT0wO208bC5sZW5ndGg7bSsrKXt2YXIgbj1sW21dO2lmKG4udmFsaWQmJm4udG9WZXJ0ZXgubGF5ZXIhPT1lKXt2YXIgcD1uLmZyb21WZXJ0ZXguY29sdW1uK24ucG9ydEZyb21Db2xPZmZzZXQ7dmFyIHE9bi50b1ZlcnRleC5jb2x1bW4rbi5wb3J0VG9Db2xPZmZzZXQ7aCs9KE1hdGguYWJzKHAtcSkrMSkqT3Iobik7fX19TnIoZCxlLGYpO2IrPWg7fXJldHVybiBiO31Eci5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7dmFyIGE9SW5maW5pdHk7dGhpcy5IYT0tMTtmb3IodmFyIGI9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2IubmV4dCgpOyl7dmFyIGM9Yi52YWx1ZTthPU1hdGgubWluKGEsYy5jb2x1bW4tdGhpcy5ub2RlTWluQ29sdW1uU3BhY2UoYywhMCkpO3RoaXMuSGE9TWF0aC5tYXgodGhpcy5IYSxjLmNvbHVtbit0aGlzLm5vZGVNaW5Db2x1bW5TcGFjZShjLCExKSk7fWZvcihiLnJlc2V0KCk7Yi5uZXh0KCk7KXtiLnZhbHVlLmNvbHVtbi09YTt9dGhpcy5IYS09YTt9O2Z1bmN0aW9uIFRyKGEsYixjKXtmb3IodmFyIGQ9TXIoYSxiKSxlPWEuZmNbYl0sZj1bXSxnPTA7ZzxlO2crKyl7dmFyIGg9ZFtnXSxrPW51bGw7MD49YyYmKGs9aC5zb3VyY2VFZGdlc0FycmF5QWNjZXNzKTt2YXIgbD1udWxsOzA8PWMmJihsPWguZGVzdGluYXRpb25FZGdlc0FycmF5QWNjZXNzKTt2YXIgbT0wLG49MCxwPWgubmVhcjtudWxsIT09cCYmcC5sYXllcj09PWgubGF5ZXImJihtKz1wLmNvbHVtbi0xLG4rKyk7aWYobnVsbCE9PWspZm9yKHA9MDtwPGsubGVuZ3RoO3ArKyl7aD1rW3BdO3ZhciBxPWguZnJvbVZlcnRleDtoLnZhbGlkJiYhaC5yZXYmJnEubGF5ZXIhPT1iJiYobSs9cS5jb2x1bW4sbisrKTt9aWYobnVsbCE9PWwpZm9yKGs9MDtrPGwubGVuZ3RoO2srKyl7aD1sW2tdLHA9aC50b1ZlcnRleCxoLnZhbGlkJiYhaC5yZXYmJnAubGF5ZXIhPT1iJiYobSs9cC5jb2x1bW4sbisrKTt9ZltnXT0wPT09bj8tMTptL247fU5yKGEsYixkKTtyZXR1cm4gZjt9ZnVuY3Rpb24gVXIoYSxiLGMpe2Zvcih2YXIgZD1NcihhLGIpLGU9YS5mY1tiXSxmPVtdLGc9MDtnPGU7ZysrKXt2YXIgaD1kW2ddLGs9bnVsbDswPj1jJiYoaz1oLnNvdXJjZUVkZ2VzQXJyYXlBY2Nlc3MpO3ZhciBsPW51bGw7MDw9YyYmKGw9aC5kZXN0aW5hdGlvbkVkZ2VzQXJyYXlBY2Nlc3MpO3ZhciBtPTAsbj1bXSxwPWgubmVhcjtudWxsIT09cCYmcC5sYXllcj09PWgubGF5ZXImJihuW21dPXAuY29sdW1uLTEsbSsrKTtoPXZvaWQgMDtpZihudWxsIT09aylmb3IocD0wO3A8ay5sZW5ndGg7cCsrKXtoPWtbcF07dmFyIHE9aC5mcm9tVmVydGV4O2gudmFsaWQmJiFoLnJldiYmcS5sYXllciE9PWImJihuW21dPXEuY29sdW1uK2gucG9ydEZyb21Db2xPZmZzZXQsbSsrKTt9aWYobnVsbCE9PWwpZm9yKGs9MDtrPGwubGVuZ3RoO2srKyl7aD1sW2tdLHA9aC50b1ZlcnRleCxoLnZhbGlkJiYhaC5yZXYmJnAubGF5ZXIhPT1iJiYoblttXT1wLmNvbHVtbitoLnBvcnRUb0NvbE9mZnNldCxtKyspO30wPT09bT9mW2ddPS0xOihuLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1iO30pLGw9bT4+MSxmW2ddPTAhPT0obSYxKT9uW2xdOm5bbC0xXStuW2xdPj4xKTt9TnIoYSxiLGQpO3JldHVybiBmO31mdW5jdGlvbiBWcihhLGIsYyxkLGUsZil7aWYoYi5jb21wb25lbnQ9PT1kKXtiLmNvbXBvbmVudD1jO2lmKGUpZm9yKHZhciBnPWIuZGVzdGluYXRpb25FZGdlcztnLm5leHQoKTspe3ZhciBoPWcudmFsdWU7dmFyIGs9aC50b1ZlcnRleDt2YXIgbD1iLmxheWVyLWsubGF5ZXI7aD1hLmxpbmtNaW5MZW5ndGgoaCk7bD09PWgmJlZyKGEsayxjLGQsZSxmKTt9aWYoZilmb3IoZz1iLnNvdXJjZUVkZ2VzO2cubmV4dCgpOyl7aD1nLnZhbHVlLGs9aC5mcm9tVmVydGV4LGw9ay5sYXllci1iLmxheWVyLGg9YS5saW5rTWluTGVuZ3RoKGgpLGw9PT1oJiZWcihhLGssYyxkLGUsZik7fX19ZnVuY3Rpb24gV3IoYSxiLGMsZCxlLGYpe2lmKGIuY29tcG9uZW50PT09ZCl7Yi5jb21wb25lbnQ9YztpZihlKWZvcih2YXIgZz1iLmRlc3RpbmF0aW9uRWRnZXM7Zy5uZXh0KCk7KXtXcihhLGcudmFsdWUudG9WZXJ0ZXgsYyxkLGUsZik7fWlmKGYpZm9yKGI9Yi5zb3VyY2VFZGdlcztiLm5leHQoKTspe1dyKGEsYi52YWx1ZS5mcm9tVmVydGV4LGMsZCxlLGYpO319fURyLnByb3RvdHlwZS5yZW1vdmVDeWNsZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5uZXR3b3JrLmVkZ2VzLml0ZXJhdG9yO2EubmV4dCgpOyl7YS52YWx1ZS5yZXY9ITE7fXN3aXRjaCh0aGlzLktrKXtkZWZhdWx0OmNhc2UgWHI6YT10aGlzLm5ldHdvcms7dmFyIGI9MCxjPWEudmVydGV4ZXMuY291bnQtMSxkPVtdO2QubGVuZ3RoPWMrMTtmb3IodmFyIGU9YS52ZXJ0ZXhlcy5pdGVyYXRvcjtlLm5leHQoKTspe2UudmFsdWUudmFsaWQ9ITA7fWZvcig7bnVsbCE9PVlyKGEpOyl7Zm9yKGU9WnIoYSk7bnVsbCE9PWU7KXtkW2NdPWUsYy0tLGUudmFsaWQ9ITEsZT1acihhKTt9Zm9yKGU9JHIoYSk7bnVsbCE9PWU7KXtkW2JdPWUsYisrLGUudmFsaWQ9ITEsZT0kcihhKTt9ZT1udWxsO2Zvcih2YXIgZj0wLGc9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2cubmV4dCgpOyl7dmFyIGg9Zy52YWx1ZTtpZihoLnZhbGlkKXtmb3IodmFyIGs9MCxsPWguZGVzdGluYXRpb25FZGdlcztsLm5leHQoKTspe2wudmFsdWUudG9WZXJ0ZXgudmFsaWQmJmsrKzt9bD0wO2Zvcih2YXIgbT1oLnNvdXJjZUVkZ2VzO20ubmV4dCgpOyl7bS52YWx1ZS5mcm9tVmVydGV4LnZhbGlkJiZsKys7fWlmKG51bGw9PT1lfHxmPGstbCllPWgsZj1rLWw7fX1udWxsIT09ZSYmKGRbYl09ZSxiKyssZS52YWxpZD0hMSk7fWZvcihiPTA7YjxhLnZlcnRleGVzLmNvdW50O2IrKyl7ZFtiXS5pbmRleD1iO31mb3IoZD1hLmVkZ2VzLml0ZXJhdG9yO2QubmV4dCgpOyl7Yj1kLnZhbHVlLGIuZnJvbVZlcnRleC5pbmRleD5iLnRvVmVydGV4LmluZGV4JiYoYS5zbShiKSxiLnJldj0hMCk7fWJyZWFrO2Nhc2UgRXI6Zm9yKGQ9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2QubmV4dCgpOyl7YT1kLnZhbHVlLGEuWGw9LTEsYS5maW5pc2g9LTE7fWZvcihhPXRoaXMubmV0d29yay5lZGdlcy5pdGVyYXRvcjthLm5leHQoKTspe2EudmFsdWUuZm9yZXN0PSExO310aGlzLnhvPTA7Zm9yKGQucmVzZXQoKTtkLm5leHQoKTspe2I9ZC52YWx1ZSwwPT09Yi5zb3VyY2VFZGdlcy5jb3VudCYmYXModGhpcyxiKTt9Zm9yKGQucmVzZXQoKTtkLm5leHQoKTspe2I9ZC52YWx1ZSwtMT09PWIuWGwmJmFzKHRoaXMsYik7fWZvcihhLnJlc2V0KCk7YS5uZXh0KCk7KXtkPWEudmFsdWUsZC5mb3Jlc3R8fChiPWQuZnJvbVZlcnRleCxjPWIuZmluaXNoLGU9ZC50b1ZlcnRleCxmPWUuZmluaXNoLGUuWGw8Yi5YbCYmYzxmJiYodGhpcy5uZXR3b3JrLnNtKGQpLGQucmV2PSEwKSk7fWJyZWFrO2Nhc2UgSnI6YT10aGlzLm5ldHdvcms7Yj1hLnZlcnRleGVzLml0ZXJhdG9yO2ZvcihkPUluZmluaXR5O2IubmV4dCgpOyl7ZD1NYXRoLm1pbihkLGIudmFsdWUubGF5ZXIpO31pZihJbmZpbml0eT5kKXtpZigwPmQpZm9yKGIucmVzZXQoKTtiLm5leHQoKTspe2IudmFsdWUubGF5ZXItPWQ7fWQ9W107Zm9yKGIucmVzZXQoKTtiLm5leHQoKTspe2M9Yi52YWx1ZSxlPWRbYy5sYXllcl0sdm9pZCAwPT09ZT9kW2MubGF5ZXJdPVtjXTplLnB1c2goYyk7fWZvcihjPWI9MDtjPGQubGVuZ3RoO2MrKyl7aWYoZT1kW2NdLCFlfHwwPT09ZS5sZW5ndGgpYisrO2Vsc2UgaWYoMDxjKWZvcihmPTA7ZjxlLmxlbmd0aDtmKyspe2VbZl0ubGF5ZXItPWI7fX1mb3IoZD1hLmVkZ2VzLml0ZXJhdG9yO2QubmV4dCgpOyl7Yj1kLnZhbHVlLGIuZnJvbVZlcnRleC5sYXllcjxiLnRvVmVydGV4LmxheWVyJiYoYS5zbShiKSxiLnJldj0hMCk7fX19fTtmdW5jdGlvbiBZcihhKXtmb3IoYT1hLnZlcnRleGVzLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGI9YS52YWx1ZTtpZihiLnZhbGlkKXJldHVybiBiO31yZXR1cm4gbnVsbDt9ZnVuY3Rpb24gWnIoYSl7Zm9yKGE9YS52ZXJ0ZXhlcy5pdGVyYXRvcjthLm5leHQoKTspe3ZhciBiPWEudmFsdWU7aWYoYi52YWxpZCl7Zm9yKHZhciBjPSEwLGQ9Yi5kZXN0aW5hdGlvbkVkZ2VzO2QubmV4dCgpOyl7aWYoZC52YWx1ZS50b1ZlcnRleC52YWxpZCl7Yz0hMTticmVhazt9fWlmKGMpcmV0dXJuIGI7fX1yZXR1cm4gbnVsbDt9ZnVuY3Rpb24gJHIoYSl7Zm9yKGE9YS52ZXJ0ZXhlcy5pdGVyYXRvcjthLm5leHQoKTspe3ZhciBiPWEudmFsdWU7aWYoYi52YWxpZCl7Zm9yKHZhciBjPSEwLGQ9Yi5zb3VyY2VFZGdlcztkLm5leHQoKTspe2lmKGQudmFsdWUuZnJvbVZlcnRleC52YWxpZCl7Yz0hMTticmVhazt9fWlmKGMpcmV0dXJuIGI7fX1yZXR1cm4gbnVsbDt9ZnVuY3Rpb24gYXMoYSxiKXtiLlhsPWEueG87YS54bysrO2Zvcih2YXIgYz1iLmRlc3RpbmF0aW9uRWRnZXM7Yy5uZXh0KCk7KXt2YXIgZD1jLnZhbHVlLGU9ZC50b1ZlcnRleDstMT09PWUuWGwmJihkLmZvcmVzdD0hMCxhcyhhLGUpKTt9Yi5maW5pc2g9YS54bzthLnhvKys7fURyLnByb3RvdHlwZS5hc3NpZ25MYXllcnM9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5sbCl7Y2FzZSBiczpjcyh0aGlzKTticmVhaztjYXNlIGRzOmZvcih2YXIgYSxiPXRoaXMubmV0d29yay52ZXJ0ZXhlcy5pdGVyYXRvcjtiLm5leHQoKTspe2E9ZXModGhpcyxiLnZhbHVlKSx0aGlzLnlhPU1hdGgubWF4KGEsdGhpcy55YSk7fWZvcihiLnJlc2V0KCk7Yi5uZXh0KCk7KXthPWIudmFsdWUsYS5sYXllcj10aGlzLnlhLWEubGF5ZXI7fWJyZWFrO2RlZmF1bHQ6Y2FzZSBGcjpjcyh0aGlzKTtmb3IoYj10aGlzLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7Yi5uZXh0KCk7KXtiLnZhbHVlLnZhbGlkPSExO31mb3IoYi5yZXNldCgpO2IubmV4dCgpOyl7YT1iLnZhbHVlLDA9PT1hLnNvdXJjZUVkZ2VzLmNvdW50JiZmcyh0aGlzLGEpO31hPUluZmluaXR5O2ZvcihiLnJlc2V0KCk7Yi5uZXh0KCk7KXthPU1hdGgubWluKGEsYi52YWx1ZS5sYXllcik7fXRoaXMueWE9LTE7Zm9yKGIucmVzZXQoKTtiLm5leHQoKTspe3ZhciBjPWIudmFsdWU7Yy5sYXllci09YTt0aGlzLnlhPU1hdGgubWF4KHRoaXMueWEsYy5sYXllcik7fX19O2Z1bmN0aW9uIGNzKGEpe2Zvcih2YXIgYj1hLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7Yi5uZXh0KCk7KXt2YXIgYz1ncyhhLGIudmFsdWUpO2EueWE9TWF0aC5tYXgoYyxhLnlhKTt9fWZ1bmN0aW9uIGdzKGEsYil7dmFyIGM9MDtpZigtMT09PWIubGF5ZXIpe2Zvcih2YXIgZD1iLmRlc3RpbmF0aW9uRWRnZXM7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlLGY9ZS50b1ZlcnRleDtlPWEubGlua01pbkxlbmd0aChlKTtjPU1hdGgubWF4KGMsZ3MoYSxmKStlKTt9Yi5sYXllcj1jO31lbHNlIGM9Yi5sYXllcjtyZXR1cm4gYzt9ZnVuY3Rpb24gZXMoYSxiKXt2YXIgYz0wO2lmKC0xPT09Yi5sYXllcil7Zm9yKHZhciBkPWIuc291cmNlRWRnZXM7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlLGY9ZS5mcm9tVmVydGV4O2U9YS5saW5rTWluTGVuZ3RoKGUpO2M9TWF0aC5tYXgoYyxlcyhhLGYpK2UpO31iLmxheWVyPWM7fWVsc2UgYz1iLmxheWVyO3JldHVybiBjO31mdW5jdGlvbiBmcyhhLGIpe2lmKCFiLnZhbGlkKXtiLnZhbGlkPSEwO2Zvcih2YXIgYz1iLmRlc3RpbmF0aW9uRWRnZXM7Yy5uZXh0KCk7KXtmcyhhLGMudmFsdWUudG9WZXJ0ZXgpO31mb3IoYz1hLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7Yy5uZXh0KCk7KXtjLnZhbHVlLmNvbXBvbmVudD0tMTt9Zm9yKHZhciBkPWIuc291cmNlRWRnZXNBcnJheUFjY2VzcyxlPWQubGVuZ3RoLGY9MDtmPGU7ZisrKXt2YXIgZz1kW2ZdLGg9Zy5mcm9tVmVydGV4LGs9Zy50b1ZlcnRleDtnPWEubGlua01pbkxlbmd0aChnKTtoLmxheWVyLWsubGF5ZXI+ZyYmVnIoYSxoLDAsLTEsITAsITEpO31mb3IoVnIoYSxiLDEsLTEsITAsITApOzAhPT1iLmNvbXBvbmVudDspe2Y9MDtkPUluZmluaXR5O2g9MDtrPW51bGw7Zm9yKGc9YS5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2cubmV4dCgpOyl7dmFyIGw9Zy52YWx1ZTtpZigxPT09bC5jb21wb25lbnQpe3ZhciBtPTAsbj0hMSxwPWwuc291cmNlRWRnZXNBcnJheUFjY2VzcztlPXAubGVuZ3RoO2Zvcih2YXIgcT0wO3E8ZTtxKyspe3ZhciByPXBbcV0sdT1yLmZyb21WZXJ0ZXg7bSs9MTsxIT09dS5jb21wb25lbnQmJihmKz0xLHU9dS5sYXllci1sLmxheWVyLHI9YS5saW5rTWluTGVuZ3RoKHIpLGQ9TWF0aC5taW4oZCx1LXIpKTt9cD1sLmRlc3RpbmF0aW9uRWRnZXNBcnJheUFjY2VzcztlPXAubGVuZ3RoO2ZvcihxPTA7cTxlO3ErKyl7cj1wW3FdLnRvVmVydGV4LC0tbSwxIT09ci5jb21wb25lbnQ/LS1mOm49ITA7fShudWxsPT09a3x8bTxoKSYmIW4mJihrPWwsaD1tKTt9fWlmKDA8Zil7Zm9yKGMucmVzZXQoKTtjLm5leHQoKTspe2U9Yy52YWx1ZSwxPT09ZS5jb21wb25lbnQmJihlLmxheWVyKz1kKTt9Yi5jb21wb25lbnQ9MDt9ZWxzZSBrLmNvbXBvbmVudD0wO31mb3IoYz1hLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7Yy5uZXh0KCk7KXtjLnZhbHVlLmNvbXBvbmVudD0tMTt9Zm9yKFZyKGEsYiwxLC0xLCEwLCExKTswIT09Yi5jb21wb25lbnQ7KXtkPTA7ZT1JbmZpbml0eTtmPTA7aD1udWxsO2ZvcihrPWEubmV0d29yay52ZXJ0ZXhlcy5pdGVyYXRvcjtrLm5leHQoKTspe2lmKGc9ay52YWx1ZSwxPT09Zy5jb21wb25lbnQpe2w9MDttPSExO3A9Zy5zb3VyY2VFZGdlc0FycmF5QWNjZXNzO249cC5sZW5ndGg7Zm9yKHE9MDtxPG47cSsrKXtyPXBbcV0uZnJvbVZlcnRleCxsKz0xLDEhPT1yLmNvbXBvbmVudD9kKz0xOm09ITA7fXA9Zy5kZXN0aW5hdGlvbkVkZ2VzQXJyYXlBY2Nlc3M7bj1wLmxlbmd0aDtmb3IocT0wO3E8bjtxKyspe3I9cFtxXSx1PXIudG9WZXJ0ZXgsLS1sLDEhPT11LmNvbXBvbmVudCYmKC0tZCx1PWcubGF5ZXItdS5sYXllcixyPWEubGlua01pbkxlbmd0aChyKSxlPU1hdGgubWluKGUsdS1yKSk7fShudWxsPT09aHx8bD5mKSYmIW0mJihoPWcsZj1sKTt9fWlmKDA+ZCl7Zm9yKGMucmVzZXQoKTtjLm5leHQoKTspe2Q9Yy52YWx1ZSwxPT09ZC5jb21wb25lbnQmJihkLmxheWVyLT1lKTt9Yi5jb21wb25lbnQ9MDt9ZWxzZSBoLmNvbXBvbmVudD0wO319fWZ1bmN0aW9uIExyKGEsYixjKXtyZXR1cm4gOTA9PT1hLkw/YyYmIWIucmV2fHwhYyYmYi5yZXY/MjcwOjkwOjE4MD09PWEuTD9jJiYhYi5yZXZ8fCFjJiZiLnJldj8wOjE4MDoyNzA9PT1hLkw/YyYmIWIucmV2fHwhYyYmYi5yZXY/OTA6MjcwOmMmJiFiLnJldnx8IWMmJmIucmV2PzE4MDowO31Eci5wcm90b3R5cGUuaW5pdGlhbGl6ZUluZGljZXM9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5ibCl7ZGVmYXVsdDpjYXNlIGhzOmZvcih2YXIgYT10aGlzLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7YS5uZXh0KCk7KXt2YXIgYj1hLnZhbHVlLGM9Yi5sYXllcjtiLmluZGV4PXRoaXMuZmNbY107dGhpcy5mY1tjXSsrO31icmVhaztjYXNlIEdyOmE9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2ZvcihiPXRoaXMueWE7MDw9YjtiLS0pe2ZvcihhLnJlc2V0KCk7YS5uZXh0KCk7KXtjPWEudmFsdWUsYy5sYXllcj09PWImJi0xPT09Yy5pbmRleCYmaXModGhpcyxjKTt9fWJyZWFrO2Nhc2UganM6Zm9yKGE9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yLGI9MDtiPD10aGlzLnlhO2IrKyl7Zm9yKGEucmVzZXQoKTthLm5leHQoKTspe2M9YS52YWx1ZSxjLmxheWVyPT09YiYmLTE9PT1jLmluZGV4JiZrcyh0aGlzLGMpO319fX07ZnVuY3Rpb24gaXMoYSxiKXt2YXIgYz1iLmxheWVyO2IuaW5kZXg9YS5mY1tjXTthLmZjW2NdKys7Yj1iLmRlc3RpbmF0aW9uRWRnZXNBcnJheUFjY2Vzcztmb3IoYz0hMDtjOyl7Yz0hMTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoLTE7ZCsrKXt2YXIgZT1iW2RdLGY9YltkKzFdO2UucG9ydEZyb21Db2xPZmZzZXQ+Zi5wb3J0RnJvbUNvbE9mZnNldCYmKGM9ITAsYltkXT1mLGJbZCsxXT1lKTt9fWZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Q9YltjXSxkLnZhbGlkJiYoZD1kLnRvVmVydGV4LC0xPT09ZC5pbmRleCYmaXMoYSxkKSk7fX1mdW5jdGlvbiBrcyhhLGIpe3ZhciBjPWIubGF5ZXI7Yi5pbmRleD1hLmZjW2NdO2EuZmNbY10rKztiPWIuc291cmNlRWRnZXNBcnJheUFjY2Vzcztmb3IodmFyIGQ9ITA7ZDspe2ZvcihkPSExLGM9MDtjPGIubGVuZ3RoLTE7YysrKXt2YXIgZT1iW2NdLGY9YltjKzFdO2UucG9ydFRvQ29sT2Zmc2V0PmYucG9ydFRvQ29sT2Zmc2V0JiYoZD0hMCxiW2NdPWYsYltjKzFdPWUpO319Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl7ZD1iW2NdLGQudmFsaWQmJihkPWQuZnJvbVZlcnRleCwtMT09PWQuaW5kZXgmJmtzKGEsZCkpO319RHIucHJvdG90eXBlLnJlZHVjZUNyb3NzaW5ncz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY291bnRDcm9zc2luZ3MoKSxiPVByKHRoaXMpLGMsZDtmb3IoYz0wO2M8dGhpcy5wajtjKyspe2ZvcihkPTA7ZDw9dGhpcy55YTtkKyspe2xzKHRoaXMsZCwxKSxtcyh0aGlzLGQsMSk7fXZhciBlPXRoaXMuY291bnRDcm9zc2luZ3MoKTtlPGEmJihhPWUsYj1Qcih0aGlzKSk7Zm9yKGQ9dGhpcy55YTswPD1kO2QtLSl7bHModGhpcyxkLC0xKSxtcyh0aGlzLGQsLTEpO31lPXRoaXMuY291bnRDcm9zc2luZ3MoKTtlPGEmJihhPWUsYj1Qcih0aGlzKSk7fVFyKHRoaXMsYik7Zm9yKGM9MDtjPHRoaXMucGo7YysrKXtmb3IoZD0wO2Q8PXRoaXMueWE7ZCsrKXtscyh0aGlzLGQsMCksbXModGhpcyxkLDApO31lPXRoaXMuY291bnRDcm9zc2luZ3MoKTtlPGEmJihhPWUsYj1Qcih0aGlzKSk7Zm9yKGQ9dGhpcy55YTswPD1kO2QtLSl7bHModGhpcyxkLDApLG1zKHRoaXMsZCwwKTt9ZT10aGlzLmNvdW50Q3Jvc3NpbmdzKCk7ZTxhJiYoYT1lLGI9UHIodGhpcykpO31Rcih0aGlzLGIpO3ZhciBmLGcsaDtzd2l0Y2godGhpcy52ayl7Y2FzZSBuczpicmVhaztjYXNlIG9zOmZvcihoPWErMTsoZD10aGlzLmNvdW50Q3Jvc3NpbmdzKCkpPGg7KXtmb3IoaD1kLGM9dGhpcy55YTswPD1jO2MtLSl7Zm9yKGc9MDtnPD1jO2crKyl7Zm9yKGY9ITA7Zjspe2ZvcihmPSExLGQ9YztkPj1nO2QtLSl7Zj1tcyh0aGlzLGQsLTEpfHxmO319ZT10aGlzLmNvdW50Q3Jvc3NpbmdzKCk7ZT49YT9Rcih0aGlzLGIpOihhPWUsYj1Qcih0aGlzKSk7Zm9yKGY9ITA7Zjspe2ZvcihmPSExLGQ9YztkPj1nO2QtLSl7Zj1tcyh0aGlzLGQsMSl8fGY7fX1lPXRoaXMuY291bnRDcm9zc2luZ3MoKTtlPj1hP1FyKHRoaXMsYik6KGE9ZSxiPVByKHRoaXMpKTtmb3IoZj0hMDtmOyl7Zm9yKGY9ITEsZD1nO2Q8PWM7ZCsrKXtmPW1zKHRoaXMsZCwxKXx8Zjt9fWU+PWE/UXIodGhpcyxiKTooYT1lLGI9UHIodGhpcykpO2ZvcihmPSEwO2Y7KXtmb3IoZj0hMSxkPWc7ZDw9YztkKyspe2Y9bXModGhpcyxkLC0xKXx8Zjt9fWU+PWE/UXIodGhpcyxiKTooYT1lLGI9UHIodGhpcykpO2ZvcihmPSEwO2Y7KXtmb3IoZj0hMSxkPWM7ZD49ZztkLS0pe2Y9bXModGhpcyxkLDApfHxmO319ZT49YT9Rcih0aGlzLGIpOihhPWUsYj1Qcih0aGlzKSk7Zm9yKGY9ITA7Zjspe2ZvcihmPSExLGQ9ZztkPD1jO2QrKyl7Zj1tcyh0aGlzLGQsMCl8fGY7fX1lPj1hP1FyKHRoaXMsYik6KGE9ZSxiPVByKHRoaXMpKTt9fX1icmVhaztkZWZhdWx0OmNhc2UgSHI6Zm9yKGM9dGhpcy55YSxnPTAsaD1hKzE7KGQ9dGhpcy5jb3VudENyb3NzaW5ncygpKTxoOyl7aD1kO2ZvcihmPSEwO2Y7KXtmb3IoZj0hMSxkPWM7ZD49ZztkLS0pe2Y9bXModGhpcyxkLC0xKXx8Zjt9fWU9dGhpcy5jb3VudENyb3NzaW5ncygpO2U+PWE/UXIodGhpcyxiKTooYT1lLGI9UHIodGhpcykpO2ZvcihmPSEwO2Y7KXtmb3IoZj0hMSxkPWM7ZD49ZztkLS0pe2Y9bXModGhpcyxkLDEpfHxmO319ZT10aGlzLmNvdW50Q3Jvc3NpbmdzKCk7ZT49YT9Rcih0aGlzLGIpOihhPWUsYj1Qcih0aGlzKSk7Zm9yKGY9ITA7Zjspe2ZvcihmPSExLGQ9ZztkPD1jO2QrKyl7Zj1tcyh0aGlzLGQsMSl8fGY7fX1lPj1hP1FyKHRoaXMsYik6KGE9ZSxiPVByKHRoaXMpKTtmb3IoZj0hMDtmOyl7Zm9yKGY9ITEsZD1nO2Q8PWM7ZCsrKXtmPW1zKHRoaXMsZCwtMSl8fGY7fX1lPj1hP1FyKHRoaXMsYik6KGE9ZSxiPVByKHRoaXMpKTtmb3IoZj0hMDtmOyl7Zm9yKGY9ITEsZD1jO2Q+PWc7ZC0tKXtmPW1zKHRoaXMsZCwwKXx8Zjt9fWU+PWE/UXIodGhpcyxiKTooYT1lLGI9UHIodGhpcykpO2ZvcihmPSEwO2Y7KXtmb3IoZj0hMSxkPWc7ZDw9YztkKyspe2Y9bXModGhpcyxkLDApfHxmO319ZT49YT9Rcih0aGlzLGIpOihhPWUsYj1Qcih0aGlzKSk7fX1Rcih0aGlzLGIpO307ZnVuY3Rpb24gbHMoYSxiLGMpe3ZhciBkPU1yKGEsYiksZT1hLmZjW2JdLGY9VXIoYSxiLGMpLGc9VHIoYSxiLGMpO2ZvcihjPTA7YzxlO2MrKyl7LTE9PT1nW2NdJiYoZ1tjXT1kW2NdLmNvbHVtbiksLTE9PT1mW2NdJiYoZltjXT1kW2NdLmNvbHVtbik7fWZvcih2YXIgaD0hMCxrO2g7KXtmb3IoaD0hMSxjPTA7YzxlLTE7YysrKXtpZihmW2MrMV08ZltjXXx8ZltjKzFdPT09ZltjXSYmZ1tjKzFdPGdbY10paD0hMCxrPWZbY10sZltjXT1mW2MrMV0sZltjKzFdPWssaz1nW2NdLGdbY109Z1tjKzFdLGdbYysxXT1rLGs9ZFtjXSxkW2NdPWRbYysxXSxkW2MrMV09azt9fWZvcihjPWY9MDtjPGU7YysrKXtrPWRbY10say5pbmRleD1jLGYrPWEubm9kZU1pbkNvbHVtblNwYWNlKGssITApLGsuY29sdW1uPWYsZis9MSxmKz1hLm5vZGVNaW5Db2x1bW5TcGFjZShrLCExKTt9TnIoYSxiLGQpO31mdW5jdGlvbiBtcyhhLGIsYyl7dmFyIGQ9TXIoYSxiKSxlPWEuZmNbYl07Yz1ScihhLGIsYyk7dmFyIGY7dmFyIGc9W107Zm9yKGY9MDtmPGU7ZisrKXtnW2ZdPS0xO312YXIgaD1bXTtmb3IoZj0wO2Y8ZTtmKyspe2hbZl09LTE7fWZvcih2YXIgaz0hMSxsPSEwO2w7KXtmb3IobD0hMSxmPTA7ZjxlLTE7ZisrKXt2YXIgbT1jW2RbZl0uaW5kZXgqZStkW2YrMV0uaW5kZXhdLG49Y1tkW2YrMV0uaW5kZXgqZStkW2ZdLmluZGV4XSxwPTAscT0wLHI9ZFtmXS5jb2x1bW4sdT1kW2YrMV0uY29sdW1uLHg9YS5ub2RlTWluQ29sdW1uU3BhY2UoZFtmXSwhMCksdj1hLm5vZGVNaW5Db2x1bW5TcGFjZShkW2ZdLCExKSx5PWEubm9kZU1pbkNvbHVtblNwYWNlKGRbZisxXSwhMCksej1hLm5vZGVNaW5Db2x1bW5TcGFjZShkW2YrMV0sITEpO3g9ci14K3k7dj11LXYrejt2YXIgQj1kW2ZdLnNvdXJjZUVkZ2VzLml0ZXJhdG9yO2ZvcihCLnJlc2V0KCk7Qi5uZXh0KCk7KXtpZih5PUIudmFsdWUsej15LmZyb21WZXJ0ZXgseS52YWxpZCYmei5sYXllcj09PWIpe2Zvcih5PTA7ZFt5XSE9PXo7KXt5Kys7fXk8ZiYmKHArPTIqKGYteSkscSs9MiooZisxLXkpKTt5PT09ZisxJiYocCs9MSk7eT5mKzEmJihwKz00Kih5LWYpLHErPTQqKHktKGYrMSkpKTt9fUI9ZFtmXS5kZXN0aW5hdGlvbkVkZ2VzLml0ZXJhdG9yO2ZvcihCLnJlc2V0KCk7Qi5uZXh0KCk7KXtpZih5PUIudmFsdWUsej15LnRvVmVydGV4LHkudmFsaWQmJnoubGF5ZXI9PT1iKXtmb3IoeT0wO2RbeV0hPT16Oyl7eSsrO315PT09ZisxJiYocSs9MSk7fX1CPWRbZisxXS5zb3VyY2VFZGdlcy5pdGVyYXRvcjtmb3IoQi5yZXNldCgpO0IubmV4dCgpOyl7aWYoeT1CLnZhbHVlLHo9eS5mcm9tVmVydGV4LHkudmFsaWQmJnoubGF5ZXI9PT1iKXtmb3IoeT0wO2RbeV0hPT16Oyl7eSsrO315PGYmJihwKz0yKihmKzEteSkscSs9MiooZi15KSk7eT09PWYmJihxKz0xKTt5PmYrMSYmKHArPTQqKHktKGYrMSkpLHErPTQqKHktZikpO319Qj1kW2YrMV0uZGVzdGluYXRpb25FZGdlcy5pdGVyYXRvcjtmb3IoQi5yZXNldCgpO0IubmV4dCgpOyl7aWYoeT1CLnZhbHVlLHo9eS50b1ZlcnRleCx5LnZhbGlkJiZ6LmxheWVyPT09Yil7Zm9yKHk9MDtkW3ldIT09ejspe3krKzt9eT09PWYmJihwKz0xKTt9fXk9ej0wO0I9Z1tkW2ZdLmluZGV4XTt2YXIgQz1oW2RbZl0uaW5kZXhdLEk9Z1tkW2YrMV0uaW5kZXhdLEo9aFtkW2YrMV0uaW5kZXhdOy0xIT09QiYmKHorPU1hdGguYWJzKEItcikseSs9TWF0aC5hYnMoQi12KSk7LTEhPT1DJiYoeis9TWF0aC5hYnMoQy1yKSx5Kz1NYXRoLmFicyhDLXYpKTstMSE9PUkmJih6Kz1NYXRoLmFicyhJLXUpLHkrPU1hdGguYWJzKEkteCkpOy0xIT09SiYmKHorPU1hdGguYWJzKEotdSkseSs9TWF0aC5hYnMoSi14KSk7aWYocTxwLS41fHxxPT09cCYmbjxtLS41fHxxPT09cCYmbj09PW0mJnk8ei0uNSlsPWs9ITAsZFtmXS5jb2x1bW49dixkW2YrMV0uY29sdW1uPXgsbT1kW2ZdLGRbZl09ZFtmKzFdLGRbZisxXT1tO319Zm9yKGY9MDtmPGU7ZisrKXtkW2ZdLmluZGV4PWY7fU5yKGEsYixkKTtyZXR1cm4gazt9RHIucHJvdG90eXBlLnN0cmFpZ2h0ZW5BbmRQYWNrPWZ1bmN0aW9uKCl7dmFyIGE9MCE9PSh0aGlzLiRmJjEpO3ZhciBiPTc9PT10aGlzLiRmOzFFMzx0aGlzLm5ldHdvcmsuZWRnZXMuY291bnQmJiFiJiYoYT0hMSk7aWYoYSl7dmFyIGM9W107Zm9yKGI9MDtiPD10aGlzLnlhO2IrKyl7Y1tiXT0wO31mb3IodmFyIGQsZT10aGlzLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7ZS5uZXh0KCk7KXt2YXIgZj1lLnZhbHVlO2I9Zi5sYXllcjtkPWYuY29sdW1uO2Y9dGhpcy5ub2RlTWluQ29sdW1uU3BhY2UoZiwhMSk7Y1tiXT1NYXRoLm1heChjW2JdLGQrZik7fWZvcihlLnJlc2V0KCk7ZS5uZXh0KCk7KXtmPWUudmFsdWUsYj1mLmxheWVyLGQ9Zi5jb2x1bW4sZi5jb2x1bW49KDgqKHRoaXMuSGEtY1tiXSk+PjEpKzgqZDt9dGhpcy5IYSo9ODt9aWYoMCE9PSh0aGlzLiRmJjIpKWZvcihjPSEwO2M7KXtjPSExO2ZvcihiPXRoaXMub2QrMTtiPD10aGlzLnlhO2IrKyl7Yz1wcyh0aGlzLGIsMSl8fGM7fWZvcihiPXRoaXMub2QtMTswPD1iO2ItLSl7Yz1wcyh0aGlzLGIsLTEpfHxjO31jPXBzKHRoaXMsdGhpcy5vZCwwKXx8Yzt9aWYoMCE9PSh0aGlzLiRmJjQpKXtmb3IoYj10aGlzLm9kKzE7Yjw9dGhpcy55YTtiKyspe3FzKHRoaXMsYiwxKTt9Zm9yKGI9dGhpcy5vZC0xOzA8PWI7Yi0tKXtxcyh0aGlzLGIsLTEpO31xcyh0aGlzLHRoaXMub2QsMCk7fWEmJihycyh0aGlzLC0xKSxycyh0aGlzLDEpKTtpZigwIT09KHRoaXMuJGYmMikpZm9yKGM9ITA7Yzspe2M9ITE7Yz1wcyh0aGlzLHRoaXMub2QsMCl8fGM7Zm9yKGI9dGhpcy5vZCsxO2I8PXRoaXMueWE7YisrKXtjPXBzKHRoaXMsYiwwKXx8Yzt9Zm9yKGI9dGhpcy5vZC0xOzA8PWI7Yi0tKXtjPXBzKHRoaXMsYiwwKXx8Yzt9fX07ZnVuY3Rpb24gcHMoYSxiLGMpe2Zvcih2YXIgZD0hMTtzcyhhLGIsYyk7KXtkPSEwO31yZXR1cm4gZDt9ZnVuY3Rpb24gc3MoYSxiLGMpe3ZhciBkLGU9TXIoYSxiKSxmPWEuZmNbYl0sZz1UcihhLGIsLTEpO2lmKDA8Yylmb3IoZD0wO2Q8ZjtkKyspe2dbZF09LTE7fXZhciBoPVRyKGEsYiwxKTtpZigwPmMpZm9yKGQ9MDtkPGY7ZCsrKXtoW2RdPS0xO31mb3IodmFyIGs9ITEsbD0hMDtsOyl7Zm9yKGw9ITEsZD0wO2Q8ZjtkKyspe3ZhciBtPWVbZF0uY29sdW1uLG49YS5ub2RlTWluQ29sdW1uU3BhY2UoZVtkXSwhMCkscD1hLm5vZGVNaW5Db2x1bW5TcGFjZShlW2RdLCExKSxxPTA7MD5kLTF8fG0tZVtkLTFdLmNvbHVtbi0xPm4rYS5ub2RlTWluQ29sdW1uU3BhY2UoZVtkLTFdLCExKT9xPW0tMTpxPW07bj1kKzE+PWZ8fGVbZCsxXS5jb2x1bW4tbS0xPnArYS5ub2RlTWluQ29sdW1uU3BhY2UoZVtkKzFdLCEwKT9tKzE6bTt2YXIgcj1wPTAsdT0wO2lmKDA+PWMpZm9yKHZhciB4PWVbZF0uc291cmNlRWRnZXMuaXRlcmF0b3I7eC5uZXh0KCk7KXt2YXIgdj14LnZhbHVlO3ZhciB5PXYuZnJvbVZlcnRleDtpZih2LnZhbGlkJiZ5LmxheWVyIT09Yil7dmFyIHo9T3Iodik7dmFyIEI9di5wb3J0RnJvbUNvbE9mZnNldDt2PXYucG9ydFRvQ29sT2Zmc2V0O3k9eS5jb2x1bW47cCs9KE1hdGguYWJzKG0rdi0oeStCKSkrMSkqejtyKz0oTWF0aC5hYnMocSt2LSh5K0IpKSsxKSp6O3UrPShNYXRoLmFicyhuK3YtKHkrQikpKzEpKno7fX1pZigwPD1jKWZvcih4PWVbZF0uZGVzdGluYXRpb25FZGdlcy5pdGVyYXRvcjt4Lm5leHQoKTspe3Y9eC52YWx1ZSx5PXYudG9WZXJ0ZXgsdi52YWxpZCYmeS5sYXllciE9PWImJih6PU9yKHYpLEI9di5wb3J0RnJvbUNvbE9mZnNldCx2PXYucG9ydFRvQ29sT2Zmc2V0LHk9eS5jb2x1bW4scCs9KE1hdGguYWJzKG0rQi0oeSt2KSkrMSkqeixyKz0oTWF0aC5hYnMocStCLSh5K3YpKSsxKSp6LHUrPShNYXRoLmFicyhuK0ItKHkrdikpKzEpKnopO312PUI9ej0wO3g9Z1tlW2RdLmluZGV4XTt5PWhbZVtkXS5pbmRleF07LTEhPT14JiYoeis9TWF0aC5hYnMoeC1tKSxCKz1NYXRoLmFicyh4LXEpLHYrPU1hdGguYWJzKHgtbikpOy0xIT09eSYmKHorPU1hdGguYWJzKHktbSksQis9TWF0aC5hYnMoeS1xKSx2Kz1NYXRoLmFicyh5LW4pKTtpZihyPHB8fHI9PT1wJiZCPHopbD1rPSEwLGVbZF0uY29sdW1uPXE7ZWxzZSBpZih1PHB8fHU9PT1wJiZ2PHopbD1rPSEwLGVbZF0uY29sdW1uPW47fX1OcihhLGIsZSk7YS5ub3JtYWxpemUoKTtyZXR1cm4gazt9ZnVuY3Rpb24gcXMoYSxiLGMpe3ZhciBkPU1yKGEsYiksZT1hLmZjW2JdLGY9VXIoYSxiLGMpLGc9W107Zm9yKGM9MDtjPGU7YysrKXtnW2NdPWZbY107fWZvcihmPSEwO2Y7KXtmb3IoZj0hMSxjPTA7YzxlO2MrKyl7dmFyIGg9ZFtjXS5jb2x1bW4saz1hLm5vZGVNaW5Db2x1bW5TcGFjZShkW2NdLCEwKSxsPWEubm9kZU1pbkNvbHVtblNwYWNlKGRbY10sITEpLG09MDtpZigtMT09PWdbY10pe2lmKDA9PT1jJiZjPT09ZS0xKW09aDtlbHNlIGlmKDA9PT1jKXt2YXIgbj1kW2MrMV0uY29sdW1uO24taD09PWwrYS5ub2RlTWluQ29sdW1uU3BhY2UoZFtjKzFdLCEwKT9tPWgtMTptPWg7fWVsc2UgYz09PWUtMT8obj1kW2MtMV0uY29sdW1uLG09aC1uPT09aythLm5vZGVNaW5Db2x1bW5TcGFjZShkW2MtMV0sITEpP2grMTpoKToobj1kW2MtMV0uY29sdW1uLGs9bithLm5vZGVNaW5Db2x1bW5TcGFjZShkW2MtMV0sITEpK2srMSxuPWRbYysxXS5jb2x1bW4sbD1uLWEubm9kZU1pbkNvbHVtblNwYWNlKGRbYysxXSwhMCktbC0xLG09KGsrbCkvMnwwKTt9ZWxzZSAwPT09YyYmYz09PWUtMT9tPWdbY106MD09PWM/KG49ZFtjKzFdLmNvbHVtbixsPW4tYS5ub2RlTWluQ29sdW1uU3BhY2UoZFtjKzFdLCEwKS1sLTEsbT1NYXRoLm1pbihnW2NdLGwpKTpjPT09ZS0xPyhuPWRbYy0xXS5jb2x1bW4saz1uK2Eubm9kZU1pbkNvbHVtblNwYWNlKGRbYy0xXSwhMSkraysxLG09TWF0aC5tYXgoZ1tjXSxrKSk6KG49ZFtjLTFdLmNvbHVtbixrPW4rYS5ub2RlTWluQ29sdW1uU3BhY2UoZFtjLTFdLCExKStrKzEsbj1kW2MrMV0uY29sdW1uLGw9bi1hLm5vZGVNaW5Db2x1bW5TcGFjZShkW2MrMV0sITApLWwtMSxrPGdbY10mJmdbY108bD9tPWdbY106az49Z1tjXT9tPWs6bDw9Z1tjXSYmKG09bCkpO20hPT1oJiYoZj0hMCxkW2NdLmNvbHVtbj1tKTt9fU5yKGEsYixkKTthLm5vcm1hbGl6ZSgpO31mdW5jdGlvbiB0cyhhLGIpe2Zvcih2YXIgYz0hMCxkPWEubmV0d29yay52ZXJ0ZXhlcy5pdGVyYXRvcjtkLm5leHQoKTspe3ZhciBlPWQudmFsdWUsZj1hLm5vZGVNaW5Db2x1bW5TcGFjZShlLCEwKSxnPWEubm9kZU1pbkNvbHVtblNwYWNlKGUsITEpO2lmKGUuY29sdW1uLWY8PWImJmUuY29sdW1uK2c+PWIpe2M9ITE7YnJlYWs7fX1hPSExO2lmKGMpZm9yKGQucmVzZXQoKTtkLm5leHQoKTspe2M9ZC52YWx1ZSxjLmNvbHVtbj5iJiYoLS1jLmNvbHVtbixhPSEwKTt9cmV0dXJuIGE7fWZ1bmN0aW9uIHVzKGEsYil7dmFyIGM9YisxO3ZhciBkLGU9W10sZj1bXTtmb3IoZD0wO2Q8PWEueWE7ZCsrKXtlW2RdPSExLGZbZF09ITE7fWZvcih2YXIgZz1hLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7Zy5uZXh0KCk7KXtkPWcudmFsdWU7dmFyIGg9ZC5jb2x1bW4tYS5ub2RlTWluQ29sdW1uU3BhY2UoZCwhMCksaz1kLmNvbHVtbithLm5vZGVNaW5Db2x1bW5TcGFjZShkLCExKTtoPD1iJiZrPj1iJiYoZVtkLmxheWVyXT0hMCk7aDw9YyYmaz49YyYmKGZbZC5sYXllcl09ITApO31oPSEwO2M9ITE7Zm9yKGQ9MDtkPD1hLnlhO2QrKyl7aD1oJiYhKGVbZF0mJmZbZF0pO31pZihoKWZvcihnLnJlc2V0KCk7Zy5uZXh0KCk7KXthPWcudmFsdWUsYS5jb2x1bW4+YiYmKC0tYS5jb2x1bW4sYz0hMCk7fXJldHVybiBjO31mdW5jdGlvbiBycyhhLGIpe2Zvcih2YXIgYz0wO2M8PWEuSGE7YysrKXtmb3IoO3RzKGEsYyk7KXs7fX1hLm5vcm1hbGl6ZSgpO2ZvcihjPTA7YzxhLkhhO2MrKyl7Zm9yKDt1cyhhLGMpOyl7O319YS5ub3JtYWxpemUoKTt2YXIgZDtpZigwPGIpZm9yKGM9MDtjPD1hLkhhO2MrKyl7dmFyIGU9UHIoYSk7dmFyIGY9U3IoYSk7Zm9yKGQ9ZisxO2Y8ZDspe2Q9Zjt2cyhhLGMsMSk7dmFyIGc9U3IoYSk7Zz5mP1FyKGEsZSk6ZzxmJiYoZj1nLGU9UHIoYSkpO319aWYoMD5iKWZvcihjPWEuSGE7MDw9YztjLS0pe2ZvcihlPVByKGEpLGY9U3IoYSksZD1mKzE7ZjxkOyl7ZD1mLHZzKGEsYywtMSksZz1TcihhKSxnPmY/UXIoYSxlKTpnPGYmJihmPWcsZT1QcihhKSk7fX1hLm5vcm1hbGl6ZSgpO31mdW5jdGlvbiB2cyhhLGIsYyl7YS5MZD0wO2Zvcih2YXIgZD1hLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7ZC5uZXh0KCk7KXtkLnZhbHVlLmNvbXBvbmVudD0tMTt9aWYoMDxjKWZvcihkLnJlc2V0KCk7ZC5uZXh0KCk7KXt2YXIgZT1kLnZhbHVlO2UuY29sdW1uLWEubm9kZU1pbkNvbHVtblNwYWNlKGUsITApPD1iJiYoZS5jb21wb25lbnQ9YS5MZCk7fWlmKDA+Yylmb3IoZC5yZXNldCgpO2QubmV4dCgpOyl7ZT1kLnZhbHVlLGUuY29sdW1uK2Eubm9kZU1pbkNvbHVtblNwYWNlKGUsITEpPj1iJiYoZS5jb21wb25lbnQ9YS5MZCk7fWEuTGQrKztmb3IoZC5yZXNldCgpO2QubmV4dCgpOyl7Yj1kLnZhbHVlLC0xPT09Yi5jb21wb25lbnQmJihXcihhLGIsYS5MZCwtMSwhMCwhMCksYS5MZCsrKTt9dmFyIGY7Yj1bXTtmb3IoZj0wO2Y8YS5MZCphLkxkO2YrKyl7YltmXT0hMTt9ZT1bXTtmb3IoZj0wO2Y8KGEueWErMSkqKGEuSGErMSk7ZisrKXtlW2ZdPS0xO31mb3IoZC5yZXNldCgpO2QubmV4dCgpOyl7Zj1kLnZhbHVlO2Zvcih2YXIgZz1mLmxheWVyLGg9TWF0aC5tYXgoMCxmLmNvbHVtbi1hLm5vZGVNaW5Db2x1bW5TcGFjZShmLCEwKSksaz1NYXRoLm1pbihhLkhhLGYuY29sdW1uK2Eubm9kZU1pbkNvbHVtblNwYWNlKGYsITEpKTtoPD1rO2grKyl7ZVtnKihhLkhhKzEpK2hdPWYuY29tcG9uZW50O319Zm9yKGY9MDtmPD1hLnlhO2YrKyl7aWYoMDxjKWZvcihnPTA7ZzxhLkhhO2crKyl7LTEhPT1lW2YqKGEuSGErMSkrZ10mJi0xIT09ZVtmKihhLkhhKzEpK2crMV0mJmVbZiooYS5IYSsxKStnXSE9PWVbZiooYS5IYSsxKStnKzFdJiYoYltlW2YqKGEuSGErMSkrZ10qYS5MZCtlW2YqKGEuSGErMSkrZysxXV09ITApO31pZigwPmMpZm9yKGc9YS5IYTswPGc7Zy0tKXstMSE9PWVbZiooYS5IYSsxKStnXSYmLTEhPT1lW2YqKGEuSGErMSkrZy0xXSYmZVtmKihhLkhhKzEpK2ddIT09ZVtmKihhLkhhKzEpK2ctMV0mJihiW2VbZiooYS5IYSsxKStnXSphLkxkK2VbZiooYS5IYSsxKStnLTFdXT0hMCk7fX1lPVtdO2ZvcihmPTA7ZjxhLkxkO2YrKyl7ZVtmXT0hMDt9Zz1bXTtmb3IoZy5wdXNoKDApOzAhPT1nLmxlbmd0aDspe2lmKGs9Z1tnLmxlbmd0aC0xXSxnLnBvcCgpLGVba10pZm9yKGVba109ITEsZj0wO2Y8YS5MZDtmKyspe2JbayphLkxkK2ZdJiZnLnNwbGljZSgwLDAsZik7fX1pZigwPGMpZm9yKGQucmVzZXQoKTtkLm5leHQoKTspe2E9ZC52YWx1ZSxlW2EuY29tcG9uZW50XSYmLS1hLmNvbHVtbjt9aWYoMD5jKWZvcihkLnJlc2V0KCk7ZC5uZXh0KCk7KXtjPWQudmFsdWUsZVtjLmNvbXBvbmVudF0mJihjLmNvbHVtbis9MSk7fX1Eci5wcm90b3R5cGUuY29tbWl0TGF5b3V0PWZ1bmN0aW9uKCl7aWYodGhpcy5zZXRzUG9ydFNwb3RzKWZvcih2YXIgYT1Lcih0aGlzLCEwKSxiPUtyKHRoaXMsITEpLGM9dGhpcy5uZXR3b3JrLmVkZ2VzLml0ZXJhdG9yO2MubmV4dCgpOyl7dmFyIGQ9Yy52YWx1ZS5saW5rO251bGwhPT1kJiYoZC5mcm9tU3BvdD1hLGQudG9TcG90PWIpO310aGlzLmNvbW1pdE5vZGVzKCk7dGhpcy5NdSgpO3RoaXMuaXNSb3V0aW5nJiZ0aGlzLmNvbW1pdExpbmtzKCk7fTtmdW5jdGlvbiBLcihhLGIpe3JldHVybiAyNzA9PT1hLkw/Yj9KZDpUZDo5MD09PWEuTD9iP1RkOkpkOjE4MD09PWEuTD9iP0tkOlNkOmI/U2Q6S2Q7fURyLnByb3RvdHlwZS5jb21taXROb2Rlcz1mdW5jdGlvbigpe3RoaXMuR2Q9W107dGhpcy5tZD1bXTt0aGlzLmxkPVtdO3RoaXMuS2E9W107Zm9yKHZhciBhPTA7YTw9dGhpcy55YTthKyspe3RoaXMuR2RbYV09MCx0aGlzLm1kW2FdPTAsdGhpcy5sZFthXT0wLHRoaXMuS2FbYV09MDt9Zm9yKGE9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGI9YS52YWx1ZSxjPWIubGF5ZXI7dGhpcy5HZFtjXT1NYXRoLm1heCh0aGlzLkdkW2NdLHRoaXMubm9kZU1pbkxheWVyU3BhY2UoYiwhMCkpO3RoaXMubWRbY109TWF0aC5tYXgodGhpcy5tZFtjXSx0aGlzLm5vZGVNaW5MYXllclNwYWNlKGIsITEpKTt9Yj0wO2M9dGhpcy5rZTtmb3IodmFyIGQ9MDtkPD10aGlzLnlhO2QrKyl7dmFyIGU9YzswPj10aGlzLkdkW2RdK3RoaXMubWRbZF0mJihlPTApOzA8ZCYmKGIrPWUvMik7OTA9PT10aGlzLkx8fDA9PT10aGlzLkw/KGIrPXRoaXMubWRbZF0sdGhpcy5sZFtkXT1iLGIrPXRoaXMuR2RbZF0pOihiKz10aGlzLkdkW2RdLHRoaXMubGRbZF09YixiKz10aGlzLm1kW2RdKTtkPHRoaXMueWEmJihiKz1lLzIpO3RoaXMuS2FbZF09Yjt9Yz1iO2I9dGhpcy5hcnJhbmdlbWVudE9yaWdpbjtmb3IoZD0wO2Q8PXRoaXMueWE7ZCsrKXsyNzA9PT10aGlzLkw/dGhpcy5sZFtkXT1iLnkrdGhpcy5sZFtkXTo5MD09PXRoaXMuTD8odGhpcy5sZFtkXT1iLnkrYy10aGlzLmxkW2RdLHRoaXMuS2FbZF09Yy10aGlzLkthW2RdKToxODA9PT10aGlzLkw/dGhpcy5sZFtkXT1iLngrdGhpcy5sZFtkXToodGhpcy5sZFtkXT1iLngrYy10aGlzLmxkW2RdLHRoaXMuS2FbZF09Yy10aGlzLkthW2RdKTt9YS5yZXNldCgpO2ZvcihjPWQ9SW5maW5pdHk7YS5uZXh0KCk7KXtlPWEudmFsdWU7dmFyIGY9ZS5sYXllcixnPWUuY29sdW1ufDA7aWYoMjcwPT09dGhpcy5MfHw5MD09PXRoaXMuTCl7dmFyIGg9Yi54K3RoaXMuWGIqZztmPXRoaXMubGRbZl07fWVsc2UgaD10aGlzLmxkW2ZdLGY9Yi55K3RoaXMuWGIqZztlLmNlbnRlclg9aDtlLmNlbnRlclk9ZjtkPU1hdGgubWluKGUueCxkKTtjPU1hdGgubWluKGUueSxjKTt9ZD1iLngtZDtiPWIueS1jO3RoaXMuanc9bmV3IEcoZCxiKTtmb3IoYS5yZXNldCgpO2EubmV4dCgpOyl7Yz1hLnZhbHVlLGMueCs9ZCxjLnkrPWIsYy5jb21taXQoKTt9fTtEci5wcm90b3R5cGUuTXU9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiPXRoaXMua2UsYz0wO2M8PXRoaXMueWE7YysrKXthKz10aGlzLkdkW2NdLGErPXRoaXMubWRbY107fWErPXRoaXMueWEqYjtiPVtdO2M9dGhpcy5YYip0aGlzLkhhO2Zvcih2YXIgZD10aGlzLm1heExheWVyOzA8PWQ7ZC0tKXsyNzA9PT10aGlzLkw/MD09PWQ/Yi5wdXNoKG5ldyBOKDAsMCxjLE1hdGguYWJzKHRoaXMuS2FbMF0pKSk6Yi5wdXNoKG5ldyBOKDAsdGhpcy5LYVtkLTFdLGMsTWF0aC5hYnModGhpcy5LYVtkLTFdLXRoaXMuS2FbZF0pKSk6OTA9PT10aGlzLkw/MD09PWQ/Yi5wdXNoKG5ldyBOKDAsdGhpcy5LYVswXSxjLE1hdGguYWJzKHRoaXMuS2FbMF0tYSkpKTpiLnB1c2gobmV3IE4oMCx0aGlzLkthW2RdLGMsTWF0aC5hYnModGhpcy5LYVtkLTFdLXRoaXMuS2FbZF0pKSk6MTgwPT09dGhpcy5MPzA9PT1kP2IucHVzaChuZXcgTigwLDAsTWF0aC5hYnModGhpcy5LYVswXSksYykpOmIucHVzaChuZXcgTih0aGlzLkthW2QtMV0sMCxNYXRoLmFicyh0aGlzLkthW2QtMV0tdGhpcy5LYVtkXSksYykpOjA9PT1kP2IucHVzaChuZXcgTih0aGlzLkthWzBdLDAsTWF0aC5hYnModGhpcy5LYVswXS1hKSxjKSk6Yi5wdXNoKG5ldyBOKHRoaXMuS2FbZF0sMCxNYXRoLmFicyh0aGlzLkthW2QtMV0tdGhpcy5LYVtkXSksYykpO310aGlzLmNvbW1pdExheWVycyhiLHRoaXMuancpO307RHIucHJvdG90eXBlLmNvbW1pdExheWVycz1mdW5jdGlvbigpe307RHIucHJvdG90eXBlLmNvbW1pdExpbmtzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMubmV0d29yay5lZGdlcy5pdGVyYXRvcixiO2EubmV4dCgpOyl7Yj1hLnZhbHVlLmxpbmssbnVsbCE9PWImJihiLkJoKCksYi5UaigpLGIua2YoKSk7fWZvcihhLnJlc2V0KCk7YS5uZXh0KCk7KXtiPWEudmFsdWUubGluayxudWxsIT09YiYmYi5ZaSgpO31mb3IoYS5yZXNldCgpO2EubmV4dCgpOyl7dmFyIGM9YS52YWx1ZTtiPWMubGluaztpZihudWxsIT09Yil7Yi5CaCgpO3ZhciBkPWIsZT1kLmZyb21Ob2RlLGY9ZC50b05vZGUsZz1kLmZyb21Qb3J0LGg9ZC50b1BvcnQ7aWYobnVsbCE9PWUpe3ZhciBrPWUuZmluZFZpc2libGVOb2RlKCk7bnVsbCE9PWsmJmshPT1lJiYoZT1rLGc9ay5wb3J0KTt9aWYobnVsbCE9PWYpe3ZhciBsPWYuZmluZFZpc2libGVOb2RlKCk7bnVsbCE9PWwmJmwhPT1mJiYoZj1sLGg9bC5wb3J0KTt9dmFyIG09Yi5jb21wdXRlU3BvdCghMCxnKSxuPWIuY29tcHV0ZVNwb3QoITEsaCkscD1jLmZyb21WZXJ0ZXgscT1jLnRvVmVydGV4O2lmKGMudmFsaWQpe2lmKGIuY3VydmU9PT1SZyYmND09PWIucG9pbnRzQ291bnQpaWYocC5jb2x1bW49PT1xLmNvbHVtbil7dmFyIHI9Yi5nZXRMaW5rUG9pbnQoZSxnLG0sITAsITEsZixoKSx1PWIuZ2V0TGlua1BvaW50KGYsaCxuLCExLCExLGUsZyk7ci5vKCl8fHIuc2V0KGUuYWN0dWFsQm91bmRzLmNlbnRlcik7dS5vKCl8fHUuc2V0KGYuYWN0dWFsQm91bmRzLmNlbnRlcik7Yi5UaigpO2IuamYoci54LHIueSk7Yi5qZigoMipyLngrdS54KS8zLCgyKnIueSt1LnkpLzMpO2IuamYoKHIueCsyKnUueCkvMywoci55KzIqdS55KS8zKTtiLmpmKHUueCx1LnkpO31lbHNle3ZhciB4PSExLHY9ITE7bnVsbCE9PWcmJm09PT1TYyYmKHg9ITApO251bGwhPT1oJiZuPT09U2MmJih2PSEwKTtpZih4fHx2KXt2YXIgeT1iLmkoMCkueCx6PWIuaSgwKS55LEI9Yi5pKDMpLngsQz1iLmkoMykueTtpZih4KXtpZig5MD09PXRoaXMuTHx8MjcwPT09dGhpcy5MKXt2YXIgST15O3ZhciBKPSh6K0MpLzI7fWVsc2UgST0oeStCKS8yLEo9ejtiLk0oMSxJLEopO3ZhciBMPWIuZ2V0TGlua1BvaW50KGUsZyxtLCEwLCExLGYsaCk7TC5vKCl8fEwuc2V0KGUuYWN0dWFsQm91bmRzLmNlbnRlcik7Yi5NKDAsTC54LEwueSk7fWlmKHYpe2lmKDkwPT09dGhpcy5MfHwyNzA9PT10aGlzLkwpe3ZhciBVPUI7dmFyIFE9KHorQykvMjt9ZWxzZSBVPSh5K0IpLzIsUT1DO2IuTSgyLFUsUSk7dmFyIGlhPWIuZ2V0TGlua1BvaW50KGYsaCxuLCExLCExLGUsZyk7aWEubygpfHxpYS5zZXQoZi5hY3R1YWxCb3VuZHMuY2VudGVyKTtiLk0oMyxpYS54LGlhLnkpO319fWIua2YoKTt9ZWxzZSBpZihwLmxheWVyPT09cS5sYXllciliLmtmKCk7ZWxzZXt2YXIgamE9ITEsTT0hMSxSPWIuZmlyc3RQaWNrSW5kZXgrMTtpZihiLmlzT3J0aG9nb25hbCl7TT0hMDt2YXIgQWE9Yi5wb2ludHNDb3VudDs0PEFhJiZiLnBvaW50cy5yZW1vdmVSYW5nZSgyLEFhLTMpO31lbHNlIGlmKGIuY3VydmU9PT1SZylqYT0hMCxBYT1iLnBvaW50c0NvdW50LDQ8QWEmJmIucG9pbnRzLnJlbW92ZVJhbmdlKDIsQWEtMyksUj0yO2Vsc2V7QWE9Yi5wb2ludHNDb3VudDt2YXIgb2I9bT09PVNjLEhhPW49PT1TYzsyPEFhJiZvYiYmSGE/Yi5wb2ludHMucmVtb3ZlUmFuZ2UoMSxBYS0yKTozPEFhJiZvYiYmIUhhP2IucG9pbnRzLnJlbW92ZVJhbmdlKDEsQWEtMyk6MzxBYSYmIW9iJiZIYT9iLnBvaW50cy5yZW1vdmVSYW5nZSgyLEFhLTIpOjQ8QWEmJiFvYiYmIUhhJiZiLnBvaW50cy5yZW1vdmVSYW5nZSgyLEFhLTMpO312YXIgRGE7aWYoYy5yZXYpe2Zvcih2YXIgRmE7bnVsbCE9PXEmJnAhPT1xOyl7dmFyIFJhPURhPW51bGw7Zm9yKHZhciBVYj1xLnNvdXJjZUVkZ2VzLml0ZXJhdG9yO1ViLm5leHQoKTspe3ZhciAkYT1VYi52YWx1ZTtpZigkYS5saW5rPT09Yy5saW5rJiYoRGE9JGEuZnJvbVZlcnRleCxSYT0kYS50b1ZlcnRleCxudWxsPT09RGEubm9kZSkpYnJlYWs7fWlmKERhIT09cCl7dmFyIFhhPWIuaShSLTEpLng7dmFyIE1hPWIuaShSLTEpLnk7dmFyIGZhPURhLmNlbnRlclg7dmFyIGVhPURhLmNlbnRlclk7aWYoTSl7aWYoMTgwPT09dGhpcy5MfHwwPT09dGhpcy5MKXtpZigyPT09UiliLm0oUisrLFhhLE1hKSxiLm0oUisrLFhhLGVhKTtlbHNle2lmKChudWxsIT09UmE/UmEuY2VudGVyWTpNYSkhPT1lYSl7dmFyIGhiPXRoaXMuS2FbRGEubGF5ZXItMV07Yi5tKFIrKyxoYixNYSk7Yi5tKFIrKyxoYixlYSk7fX19ZWxzZSAyPT09Uj8oYi5tKFIrKyxYYSxNYSksYi5tKFIrKyxmYSxNYSkpOihudWxsIT09UmE/UmEuY2VudGVyWDpYYSkhPT1mYSYmKGhiPXRoaXMuS2FbRGEubGF5ZXItMV0sYi5tKFIrKyxYYSxoYiksYi5tKFIrKyxmYSxoYikpO31lbHNlIGlmKDI9PT1SKXt2YXIgamI9TWF0aC5tYXgoMTAsdGhpcy5HZFtxLmxheWVyXSk7dmFyIE5hPU1hdGgubWF4KDEwLHRoaXMubWRbcS5sYXllcl0pO2lmKGphKTE4MD09PXRoaXMuTD9mYTw9cS5ib3VuZHMueD8oRmE9cS5ib3VuZHMueCxiLm0oUisrLEZhLWpiLGVhKSxiLm0oUisrLEZhLGVhKSxiLm0oUisrLEZhK05hLGVhKSk6KGIubShSKyssZmEtamIsZWEpLGIubShSKyssZmEsZWEpLGIubShSKyssZmErTmEsZWEpKTo5MD09PXRoaXMuTD9lYT49cS5ib3VuZHMuYm90dG9tPyhGYT1xLmJvdW5kcy55K3EuYm91bmRzLmhlaWdodCxiLm0oUisrLGZhLEZhK05hKSxiLm0oUisrLGZhLEZhKSxiLm0oUisrLGZhLEZhLWpiKSk6KGIubShSKyssZmEsZWErTmEpLGIubShSKyssZmEsZWEpLGIubShSKyssZmEsZWEtamIpKToyNzA9PT10aGlzLkw/ZWE8PXEuYm91bmRzLnk/KEZhPXEuYm91bmRzLnksYi5tKFIrKyxmYSxGYS1qYiksYi5tKFIrKyxmYSxGYSksYi5tKFIrKyxmYSxGYStOYSkpOihiLm0oUisrLGZhLGVhLWpiKSxiLm0oUisrLGZhLGVhKSxiLm0oUisrLGZhLGVhK05hKSk6MD09PXRoaXMuTCYmKGZhPj1xLmJvdW5kcy5yaWdodD8oRmE9cS5ib3VuZHMueCtxLmJvdW5kcy53aWR0aCxiLm0oUisrLEZhK05hLGVhKSxiLm0oUisrLEZhLGVhKSxiLm0oUisrLEZhLWpiLGVhKSk6KGIubShSKyssZmErTmEsZWEpLGIubShSKyssZmEsZWEpLGIubShSKyssZmEtamIsZWEpKSk7ZWxzZXtiLm0oUisrLFhhLE1hKTt2YXIgZWU9MDtpZigxODA9PT10aGlzLkx8fDA9PT10aGlzLkwpe2lmKDE4MD09PXRoaXMuTD9mYT49cS5ib3VuZHMucmlnaHQ6ZmE8PXEuYm91bmRzLngpZWU9KDA9PT10aGlzLkw/LWpiOk5hKS8yO2IubShSKyssWGErZWUsZWEpO31lbHNle2lmKDI3MD09PXRoaXMuTD9lYT49cS5ib3VuZHMuYm90dG9tOmVhPD1xLmJvdW5kcy55KWVlPSg5MD09PXRoaXMuTD8tamI6TmEpLzI7Yi5tKFIrKyxmYSxNYStlZSk7fWIubShSKyssZmEsZWEpO319ZWxzZSBqYj1NYXRoLm1heCgxMCx0aGlzLkdkW0RhLmxheWVyXSksTmE9TWF0aC5tYXgoMTAsdGhpcy5tZFtEYS5sYXllcl0pLDE4MD09PXRoaXMuTD8oamEmJmIubShSKyssZmEtamIsZWEpLGIubShSKyssZmEsZWEpLGphJiZiLm0oUisrLGZhK05hLGVhKSk6OTA9PT10aGlzLkw/KGphJiZiLm0oUisrLGZhLGVhK05hKSxiLm0oUisrLGZhLGVhKSxqYSYmYi5tKFIrKyxmYSxlYS1qYikpOjI3MD09PXRoaXMuTD8oamEmJmIubShSKyssZmEsZWEtamIpLGIubShSKyssZmEsZWEpLGphJiZiLm0oUisrLGZhLGVhK05hKSk6KGphJiZiLm0oUisrLGZhK05hLGVhKSxiLm0oUisrLGZhLGVhKSxqYSYmYi5tKFIrKyxmYS1qYixlYSkpO31xPURhO31pZihudWxsPT09aHx8bSE9PVNjfHxNKWlmKFhhPWIuaShSLTEpLngsTWE9Yi5pKFItMSkueSxmYT1iLmkoUikueCxlYT1iLmkoUikueSxNKXt2YXIgTGQ9dGhpcy5tZFtwLmxheWVyXTtpZigxODA9PT10aGlzLkx8fDA9PT10aGlzLkwpe3ZhciB2Yj1NYTt2Yj49cC5ib3VuZHMueSYmdmI8PXAuYm91bmRzLmJvdHRvbSYmKDE4MD09PXRoaXMuTD9mYT49cC5ib3VuZHMueDpmYTw9cC5ib3VuZHMucmlnaHQpJiYoRmE9cC5jZW50ZXJYKygxODA9PT10aGlzLkw/LUxkOkxkKSx2YjxwLmJvdW5kcy55K3AuYm91bmRzLmhlaWdodC8yP3ZiPXAuYm91bmRzLnktdGhpcy5YYi8yOnZiPXAuYm91bmRzLmJvdHRvbSt0aGlzLlhiLzIsYi5tKFIrKyxGYSxNYSksYi5tKFIrKyxGYSx2YikpO2IubShSKyssZmEsdmIpO31lbHNlIHZiPVhhLHZiPj1wLmJvdW5kcy54JiZ2Yjw9cC5ib3VuZHMucmlnaHQmJigyNzA9PT10aGlzLkw/ZWE+PXAuYm91bmRzLnk6ZWE8PXAuYm91bmRzLmJvdHRvbSkmJihGYT1wLmNlbnRlclkrKDI3MD09PXRoaXMuTD8tTGQ6TGQpLHZiPHAuYm91bmRzLngrcC5ib3VuZHMud2lkdGgvMj92Yj1wLmJvdW5kcy54LXRoaXMuWGIvMjp2Yj1wLmJvdW5kcy5yaWdodCt0aGlzLlhiLzIsYi5tKFIrKyxYYSxGYSksYi5tKFIrKyx2YixGYSkpLGIubShSKyssdmIsZWEpO2IubShSKyssZmEsZWEpO31lbHNlIGlmKGphKWpiPU1hdGgubWF4KDEwLHRoaXMuR2RbcC5sYXllcl0pLE5hPU1hdGgubWF4KDEwLHRoaXMubWRbcC5sYXllcl0pLDE4MD09PXRoaXMuTCYmZmE+PXAuYm91bmRzLng/KEZhPXAuYm91bmRzLngrcC5ib3VuZHMud2lkdGgsYi5NKFItMixGYSxNYSksYi5NKFItMSxGYStOYSxNYSkpOjkwPT09dGhpcy5MJiZlYTw9cC5ib3VuZHMuYm90dG9tPyhGYT1wLmJvdW5kcy55LGIuTShSLTIsWGEsRmEpLGIuTShSLTEsWGEsRmEtamIpKToyNzA9PT10aGlzLkwmJmVhPj1wLmJvdW5kcy55PyhGYT1wLmJvdW5kcy55K3AuYm91bmRzLmhlaWdodCxiLk0oUi0yLFhhLEZhKSxiLk0oUi0xLFhhLEZhK05hKSk6MD09PXRoaXMuTCYmZmE8PXAuYm91bmRzLnJpZ2h0JiYoRmE9cC5ib3VuZHMueCxiLk0oUi0yLEZhLE1hKSxiLk0oUi0xLEZhLWpiLE1hKSk7ZWxzZXtqYj1NYXRoLm1heCgxMCx0aGlzLkdkW3AubGF5ZXJdKTtOYT1NYXRoLm1heCgxMCx0aGlzLm1kW3AubGF5ZXJdKTt2YXIgemY9MDtpZigxODA9PT10aGlzLkx8fDA9PT10aGlzLkwpe2lmKDE4MD09PXRoaXMuTD9mYTw9cC5ib3VuZHMueDpmYT49cC5ib3VuZHMucmlnaHQpemY9KDA9PT10aGlzLkw/TmE6LWpiKS8yO2IubShSKyssZmEremYsTWEpO31lbHNle2lmKDI3MD09PXRoaXMuTD9lYTw9cC5ib3VuZHMueTplYT49cC5ib3VuZHMuYm90dG9tKXpmPSg5MD09PXRoaXMuTD9OYTotamIpLzI7Yi5tKFIrKyxYYSxlYSt6Zik7fWIubShSKyssZmEsZWEpO319ZWxzZXtmb3IoO251bGwhPT1wJiZwIT09cTspe1JhPURhPW51bGw7Zm9yKHZhciBFYj1wLmRlc3RpbmF0aW9uRWRnZXMuaXRlcmF0b3I7RWIubmV4dCgpOyl7dmFyIHFlPUViLnZhbHVlO2lmKHFlLmxpbms9PT1jLmxpbmsmJihEYT1xZS50b1ZlcnRleCxSYT1xZS5mcm9tVmVydGV4LG51bGwhPT1SYS5ub2RlJiYoUmE9bnVsbCksbnVsbD09PURhLm5vZGUpKWJyZWFrO31EYSE9PXEmJihYYT1iLmkoUi0xKS54LE1hPWIuaShSLTEpLnksZmE9RGEuY2VudGVyWCxlYT1EYS5jZW50ZXJZLE0/MTgwPT09dGhpcy5MfHwwPT09dGhpcy5MPyhudWxsIT09UmE/UmEuY2VudGVyWTpNYSkhPT1lYSYmKGhiPXRoaXMuS2FbRGEubGF5ZXJdLDI9PT1SJiYoaGI9MD09PXRoaXMuTD9NYXRoLm1heChoYixYYSk6TWF0aC5taW4oaGIsWGEpKSxiLm0oUisrLGhiLE1hKSxiLm0oUisrLGhiLGVhKSk6KG51bGwhPT1SYT9SYS5jZW50ZXJYOlhhKSE9PWZhJiYoaGI9dGhpcy5LYVtEYS5sYXllcl0sMj09PVImJihoYj05MD09PXRoaXMuTD9NYXRoLm1heChoYixNYSk6TWF0aC5taW4oaGIsTWEpKSxiLm0oUisrLFhhLGhiKSxiLm0oUisrLGZhLGhiKSk6KGpiPU1hdGgubWF4KDEwLHRoaXMuR2RbRGEubGF5ZXJdKSxOYT1NYXRoLm1heCgxMCx0aGlzLm1kW0RhLmxheWVyXSksMTgwPT09dGhpcy5MPyhiLm0oUisrLGZhK05hLGVhKSxqYSYmYi5tKFIrKyxmYSxlYSksYi5tKFIrKyxmYS1qYixlYSkpOjkwPT09dGhpcy5MPyhiLm0oUisrLGZhLGVhLWpiKSxqYSYmYi5tKFIrKyxmYSxlYSksYi5tKFIrKyxmYSxlYStOYSkpOjI3MD09PXRoaXMuTD8oYi5tKFIrKyxmYSxlYStOYSksamEmJmIubShSKyssZmEsZWEpLGIubShSKyssZmEsZWEtamIpKTooYi5tKFIrKyxmYS1qYixlYSksamEmJmIubShSKyssZmEsZWEpLGIubShSKyssZmErTmEsZWEpKSkpO3A9RGE7fU0mJihYYT1iLmkoUi0xKS54LE1hPWIuaShSLTEpLnksZmE9Yi5pKFIpLngsZWE9Yi5pKFIpLnksMTgwPT09dGhpcy5MfHwwPT09dGhpcy5MP01hIT09ZWEmJihoYj0wPT09dGhpcy5MP01hdGgubWluKE1hdGgubWF4KChmYStYYSkvMix0aGlzLkthW3EubGF5ZXJdKSxmYSk6TWF0aC5tYXgoTWF0aC5taW4oKGZhK1hhKS8yLHRoaXMuS2FbcS5sYXllcl0pLGZhKSxiLm0oUisrLGhiLE1hKSxiLm0oUisrLGhiLGVhKSk6WGEhPT1mYSYmKGhiPTkwPT09dGhpcy5MP01hdGgubWluKE1hdGgubWF4KChlYStNYSkvMix0aGlzLkthW3EubGF5ZXJdKSxlYSk6TWF0aC5tYXgoTWF0aC5taW4oKGVhK01hKS8yLHRoaXMuS2FbcS5sYXllcl0pLGVhKSxiLm0oUisrLFhhLGhiKSxiLm0oUisrLGZhLGhiKSkpO31pZihudWxsIT09ZCYmamEpe2lmKG51bGwhPT1nKXtpZihtPT09U2Mpe3ZhciBXYz1iLmkoMCksVmI9Yi5pKDIpO1djLkEoVmIpfHxiLk0oMSwoV2MueCtWYi54KS8yLChXYy55K1ZiLnkpLzIpO312YXIgTWQ9Yi5nZXRMaW5rUG9pbnQoZSxnLFNjLCEwLCExLGYsaCk7TWQubygpfHxNZC5zZXQoZS5hY3R1YWxCb3VuZHMuY2VudGVyKTtiLk0oMCxNZC54LE1kLnkpO31pZihudWxsIT09aCl7aWYobj09PVNjKXt2YXIgRWM9Yi5pKGIucG9pbnRzQ291bnQtMSksSWU9Yi5pKGIucG9pbnRzQ291bnQtMyk7RWMuQShJZSl8fGIuTShiLnBvaW50c0NvdW50LTIsKEVjLngrSWUueCkvMiwoRWMueStJZS55KS8yKTt9dmFyIEplPWIuZ2V0TGlua1BvaW50KGYsaCxTYywhMSwhMSxlLGcpO0plLm8oKXx8SmUuc2V0KGYuYWN0dWFsQm91bmRzLmNlbnRlcik7Yi5NKGIucG9pbnRzQ291bnQtMSxKZS54LEplLnkpO319Yi5rZigpO2MuY29tbWl0KCk7fX19Zm9yKHZhciBBZj1uZXcgRSgpLGdmPXRoaXMubmV0d29yay5lZGdlcy5pdGVyYXRvcjtnZi5uZXh0KCk7KXt2YXIgQmY9Z2YudmFsdWUubGluaztudWxsIT09QmYmJkJmLmlzT3J0aG9nb25hbCYmIUFmLmNvbnRhaW5zKEJmKSYmQWYuYWRkKEJmKTt9aWYoMDxBZi5jb3VudClpZig5MD09PXRoaXMuTHx8MjcwPT09dGhpcy5MKXtmb3IodmFyIFdiPTAsWWE9W10sYWIsTGMsQ2Y9QWYuaXRlcmF0b3I7Q2YubmV4dCgpOyl7dmFyIGpjPUNmLnZhbHVlO2lmKG51bGwhPT1qYyYmamMuaXNPcnRob2dvbmFsKWZvcih2YXIgTmQ9MjtOZDxqYy5wb2ludHNDb3VudC0zO05kKyspe2lmKGFiPWpjLmkoTmQpLExjPWpjLmkoTmQrMSksdGhpcy53KGFiLnksTGMueSkmJiF0aGlzLncoYWIueCxMYy54KSl7dmFyIHFjPW5ldyB3cygpO3FjLmxheWVyPU1hdGguZmxvb3IoYWIueS8yKTt2YXIgT2Q9amMuaSgwKSxYYj1qYy5pKGpjLnBvaW50c0NvdW50LTEpO3FjLmZpcnN0PU9kLngqT2QueCtPZC55O3FjLlRiPVhiLngqWGIueCtYYi55O3FjLlNjPU1hdGgubWluKGFiLngsTGMueCk7cWMuc2M9TWF0aC5tYXgoYWIueCxMYy54KTtxYy5pbmRleD1OZDtxYy5saW5rPWpjO2lmKE5kKzI8amMucG9pbnRzQ291bnQpe3ZhciBDaD1qYy5pKE5kLTEpLERoPWpjLmkoTmQrMiksS2U9MDtDaC55PGFiLnk/S2U9RGgueTxhYi55PzM6YWIueDxMYy54PzI6MTpDaC55PmFiLnkmJihLZT1EaC55PmFiLnk/MDpMYy54PGFiLng/MjoxKTtxYy5sPUtlO31ZYS5wdXNoKHFjKTt9fX1pZigxPFlhLmxlbmd0aCl7WWEuc29ydCh0aGlzLkZ4KTtmb3IodmFyIHBiPTA7cGI8WWEubGVuZ3RoOyl7Zm9yKHZhciBEZj1ZYVtwYl0ubGF5ZXIsTGU9cGIrMTtMZTxZYS5sZW5ndGgmJllhW0xlXS5sYXllcj09PURmOyl7TGUrKzt9aWYoMTxMZS1wYilmb3IodmFyIFliPXBiO1liPExlOyl7Zm9yKHZhciBNZT1ZYVtZYl0uc2MsTWM9cGIrMTtNYzxMZSYmWWFbTWNdLlNjPE1lOyl7TWU9TWF0aC5tYXgoTWUsWWFbTWNdLnNjKSxNYysrO312YXIgZWI9TWMtWWI7aWYoMTxlYil7dGhpcy5WaShZYSx0aGlzLnN0LFliLFliK2ViKTtmb3IodmFyIE5lPTEscmI9WWFbWWJdLlRiLHJjPVliO3JjPE1jO3JjKyspe3ZhciBrYj1ZYVtyY107a2IuVGIhPT1yYiYmKE5lKysscmI9a2IuVGIpO310aGlzLlZpKFlhLHRoaXMuRXgsWWIsWWIrZWIpO3ZhciBYYz0xO3JiPVlhW1liXS5maXJzdDtmb3IodmFyIFljPVliO1ljPE1jO1ljKyspe3ZhciB4ZD1ZYVtZY107eGQuZmlyc3QhPT1yYiYmKFhjKysscmI9eGQuZmlyc3QpO312YXIgQWc9ITAsRWY9WGM7TmU8WGM/KEFnPSExLEVmPU5lLHJiPVlhW1liXS5UYix0aGlzLlZpKFlhLHRoaXMuc3QsWWIsWWIrZWIpKTpyYj1ZYVtZYl0uZmlyc3Q7Zm9yKHZhciBGZj0wLGhmPVliO2hmPE1jO2hmKyspe3ZhciBrZD1ZYVtoZl07KEFnP2tkLmZpcnN0OmtkLlRiKSE9PXJiJiYoRmYrKyxyYj1BZz9rZC5maXJzdDprZC5UYik7dmFyIFBkPWtkLmxpbms7YWI9UGQuaShrZC5pbmRleCk7TGM9UGQuaShrZC5pbmRleCsxKTt2YXIgbGQ9dGhpcy5saW5rU3BhY2luZyooRmYtKEVmLTEpLzIpO1diKys7UGQuQmgoKTtQZC5NKGtkLmluZGV4LGFiLngsYWIueStsZCk7UGQuTShrZC5pbmRleCsxLExjLngsTGMueStsZCk7UGQua2YoKTt9fVliPU1jO31wYj1MZTt9fX1lbHNle2Zvcih2YXIgbWQ9MCxuYj1bXSxmYixuZCxaYz1BZi5pdGVyYXRvcjtaYy5uZXh0KCk7KXt2YXIgb2Q9WmMudmFsdWU7aWYobnVsbCE9PW9kJiZvZC5pc09ydGhvZ29uYWwpZm9yKHZhciB2Yz0yO3ZjPG9kLnBvaW50c0NvdW50LTM7dmMrKyl7aWYoZmI9b2QuaSh2YyksbmQ9b2QuaSh2YysxKSx0aGlzLncoZmIueCxuZC54KSYmIXRoaXMudyhmYi55LG5kLnkpKXt2YXIgQmE9bmV3IHdzKCk7QmEubGF5ZXI9TWF0aC5mbG9vcihmYi54LzIpO3ZhciAkYz1vZC5pKDApLFpiPW9kLmkob2QucG9pbnRzQ291bnQtMSk7QmEuZmlyc3Q9JGMueCskYy55KiRjLnk7QmEuVGI9WmIueCtaYi55KlpiLnk7QmEuU2M9TWF0aC5taW4oZmIueSxuZC55KTtCYS5zYz1NYXRoLm1heChmYi55LG5kLnkpO0JhLmluZGV4PXZjO0JhLmxpbms9b2Q7aWYodmMrMjxvZC5wb2ludHNDb3VudCl7dmFyIGZlPW9kLmkodmMtMSksT2U9b2QuaSh2YysyKSxnZT0wO2ZlLng8ZmIueD9nZT1PZS54PGZiLng/MzpmYi55PG5kLnk/MjoxOmZlLng+ZmIueCYmKGdlPU9lLng+ZmIueD8wOm5kLnk8ZmIueT8yOjEpO0JhLmw9Z2U7fW5iLnB1c2goQmEpO319fWlmKDE8bmIubGVuZ3RoKXtuYi5zb3J0KHRoaXMuRngpO2Zvcih2YXIgd2M9MDt3YzxuYi5sZW5ndGg7KXtmb3IodmFyIHJlPW5iW3djXS5sYXllcixhZD13YysxO2FkPG5iLmxlbmd0aCYmbmJbYWRdLmxheWVyPT09cmU7KXthZCsrO31pZigxPGFkLXdjKWZvcih2YXIgd2I9d2M7d2I8YWQ7KXtmb3IodmFyIFFkPW5iW3diXS5zYyxNYj13YysxO01iPGFkJiZuYltNYl0uU2M8UWQ7KXtRZD1NYXRoLm1heChRZCxuYltNYl0uc2MpLE1iKys7fXZhciBzZT1NYi13YjtpZigxPHNlKXt0aGlzLlZpKG5iLHRoaXMuc3Qsd2Isd2Irc2UpO2Zvcih2YXIgeWQ9MSxoZT1uYlt3Yl0uVGIsQmc9d2I7Qmc8TWI7QmcrKyl7dmFyIGJkPW5iW0JnXTtiZC5UYiE9PWhlJiYoeWQrKyxoZT1iZC5UYik7fXRoaXMuVmkobmIsdGhpcy5FeCx3Yix3YitzZSk7dmFyIFBlPTE7aGU9bmJbd2JdLmZpcnN0O2Zvcih2YXIgQ2c9d2I7Q2c8TWI7Q2crKyl7dmFyIEdmPW5iW0NnXTtHZi5maXJzdCE9PWhlJiYoUGUrKyxoZT1HZi5maXJzdCk7fXZhciBRZT0hMCxEZz1QZTt5ZDxQZT8oUWU9ITEsRGc9eWQsaGU9bmJbd2JdLlRiLHRoaXMuVmkobmIsdGhpcy5zdCx3Yix3YitzZSkpOmhlPW5iW3diXS5maXJzdDtmb3IodmFyIGNnPTAsRWk9d2I7RWk8TWI7RWkrKyl7dmFyIFJlPW5iW0VpXTsoUWU/UmUuZmlyc3Q6UmUuVGIpIT09aGUmJihjZysrLGhlPVFlP1JlLmZpcnN0OlJlLlRiKTt2YXIgU2U9UmUubGluaztmYj1TZS5pKFJlLmluZGV4KTtuZD1TZS5pKFJlLmluZGV4KzEpO3ZhciBFaD10aGlzLmxpbmtTcGFjaW5nKihjZy0oRGctMSkvMik7bWQrKztTZS5CaCgpO1NlLk0oUmUuaW5kZXgsZmIueCtFaCxmYi55KTtTZS5NKFJlLmluZGV4KzEsbmQueCtFaCxuZC55KTtTZS5rZigpO319d2I9TWI7fXdjPWFkO319fX07dD1Eci5wcm90b3R5cGU7dC5GeD1mdW5jdGlvbihhLGIpe3JldHVybiBhIGluc3RhbmNlb2Ygd3MmJmIgaW5zdGFuY2VvZiB3cyYmYSE9PWI/YS5sYXllcjxiLmxheWVyPy0xOmEubGF5ZXI+Yi5sYXllcj8xOmEuU2M8Yi5TYz8tMTphLlNjPmIuU2M/MTphLnNjPGIuc2M/LTE6YS5zYz5iLnNjPzE6MDowO307dC5FeD1mdW5jdGlvbihhLGIpe3JldHVybiBhIGluc3RhbmNlb2Ygd3MmJmIgaW5zdGFuY2VvZiB3cyYmYSE9PWI/YS5maXJzdDxiLmZpcnN0Py0xOmEuZmlyc3Q+Yi5maXJzdHx8YS5sPGIubD8xOmEubD5iLmx8fGEuU2M8Yi5TYz8tMTphLlNjPmIuU2M/MTphLnNjPGIuc2M/LTE6YS5zYz5iLnNjPzE6MDowO307dC5zdD1mdW5jdGlvbihhLGIpe3JldHVybiBhIGluc3RhbmNlb2Ygd3MmJmIgaW5zdGFuY2VvZiB3cyYmYSE9PWI/YS5UYjxiLlRiPy0xOmEuVGI+Yi5UYnx8YS5sPGIubD8xOmEubD5iLmx8fGEuU2M8Yi5TYz8tMTphLlNjPmIuU2M/MTphLnNjPGIuc2M/LTE6YS5zYz5iLnNjPzE6MDowO307dC53PWZ1bmN0aW9uKGEsYil7YS09YjtyZXR1cm4tMTxhJiYxPmE7fTt0LlZpPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWEubGVuZ3RoLGY9ZC1jO2lmKCEoMT49ZikpaWYoKDA+Y3x8Yz49ZS0xKSYmQSgibm90IGluIHJhbmdlIDAgPD0gZnJvbSA8IGxlbmd0aDogIitjKSwyPT09ZilkPWFbY10sZT1hW2MrMV0sMDxiKGQsZSkmJihhW2NdPWUsYVtjKzFdPWQpO2Vsc2UgaWYoMD09PWMpe2lmKGQ+PWUpYS5zb3J0KGIpO2Vsc2UgZm9yKGM9YS5zbGljZSgwLGQpLGMuc29ydChiKSxiPTA7YjxkO2IrKyl7YVtiXT1jW2JdO319ZWxzZSBpZihkPj1lKWZvcihkPWEuc2xpY2UoYyksZC5zb3J0KGIpLGI9YztiPGU7YisrKXthW2JdPWRbYi1jXTt9ZWxzZSBmb3IoZT1hLnNsaWNlKGMsZCksZS5zb3J0KGIpLGI9YztiPGQ7YisrKXthW2JdPWVbYi1jXTt9fTtmdW5jdGlvbiBNcihhLGIpe3ZhciBjPWEuZmNbYl07aWYoYz49YS5vZS5sZW5ndGgpe3ZhciBkPVtdO2Zvcih2YXIgZT0wO2U8YS5vZS5sZW5ndGg7ZSsrKXtkW2VdPWEub2VbZV07fWEub2U9ZDt9dm9pZCAwPT09YS5vZVtjXXx8bnVsbD09PWEub2VbY10/ZD1bXTooZD1hLm9lW2NdLGEub2VbY109bnVsbCk7YT1hLnlvW2JdO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe2M9YVtiXSxkW2MuaW5kZXhdPWM7fXJldHVybiBkO31mdW5jdGlvbiBOcihhLGIsYyl7YS5vZVthLmZjW2JdXT1jO31wYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhEci5wcm90b3R5cGUse2xheWVyU3BhY2luZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmtlO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmtlIT09YSYmMDw9YSYmKHRoaXMua2U9YSx0aGlzLkIoKSk7fX0sY29sdW1uU3BhY2luZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlhiO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlhiIT09YSYmMDxhJiYodGhpcy5YYj1hLHRoaXMuQigpKTt9fSxkaXJlY3Rpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5MO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkwhPT1hJiYoMD09PWF8fDkwPT09YXx8MTgwPT09YXx8MjcwPT09YT8odGhpcy5MPWEsdGhpcy5CKCkpOkEoIkxheWVyZWREaWdyYXBoTGF5b3V0LmRpcmVjdGlvbiBtdXN0IGJlIDAsIDkwLCAxODAsIG9yIDI3MCIpKTt9fSxjeWNsZVJlbW92ZU9wdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLktrO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLktrPT09YXx8YSE9PVhyJiZhIT09RXImJmEhPT1Kcnx8KHRoaXMuS2s9YSx0aGlzLkIoKSk7fX0sbGF5ZXJpbmdPcHRpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sbDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5sbD09PWF8fGEhPT1GciYmYSE9PWJzJiZhIT09ZHN8fCh0aGlzLmxsPWEsdGhpcy5CKCkpO319LGluaXRpYWxpemVPcHRpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5ibDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5ibD09PWF8fGEhPT1HciYmYSE9PWpzJiZhIT09aHN8fCh0aGlzLmJsPWEsdGhpcy5CKCkpO319LGl0ZXJhdGlvbnM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5wajt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5waiE9PWEmJjA8PWEmJih0aGlzLnBqPWEsdGhpcy5CKCkpO319LGFnZ3Jlc3NpdmVPcHRpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy52azt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy52az09PWF8fGEhPT1ucyYmYSE9PUhyJiZhIT09b3N8fCh0aGlzLnZrPWEsdGhpcy5CKCkpO319LHBhY2tPcHRpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy4kZjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy4kZiE9PWEmJjA8PWEmJjg+YSYmKHRoaXMuJGY9YSx0aGlzLkIoKSk7fX0sc2V0c1BvcnRTcG90czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlllO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlllIT09YSYmKHRoaXMuWWU9YSx0aGlzLkIoKSk7fX0sbGlua1NwYWNpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5mbzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5mbyE9PWEmJjA8PWEmJih0aGlzLmZvPWEsdGhpcy5CKCkpO319LG1heExheWVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMueWE7fX0sbWF4SW5kZXg6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Mcjt9fSxtYXhDb2x1bW46e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5IYTt9fSxtaW5JbmRleExheWVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMucW87fX0sbWF4SW5kZXhMYXllcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLm9kO319fSk7dmFyIEVyPW5ldyBEKERyLCJDeWNsZURlcHRoRmlyc3QiLDApLFhyPW5ldyBEKERyLCJDeWNsZUdyZWVkeSIsMSksSnI9bmV3IEQoRHIsIkN5Y2xlRnJvbUxheWVycyIsMiksRnI9bmV3IEQoRHIsIkxheWVyT3B0aW1hbExpbmtMZW5ndGgiLDApLGJzPW5ldyBEKERyLCJMYXllckxvbmdlc3RQYXRoU2luayIsMSksZHM9bmV3IEQoRHIsIkxheWVyTG9uZ2VzdFBhdGhTb3VyY2UiLDIpLEdyPW5ldyBEKERyLCJJbml0RGVwdGhGaXJzdE91dCIsMCksanM9bmV3IEQoRHIsIkluaXREZXB0aEZpcnN0SW4iLDEpLGhzPW5ldyBEKERyLCJJbml0TmFpdmUiLDIpLG5zPW5ldyBEKERyLCJBZ2dyZXNzaXZlTm9uZSIsMCksSHI9bmV3IEQoRHIsIkFnZ3Jlc3NpdmVMZXNzIiwxKSxvcz1uZXcgRChEciwiQWdncmVzc2l2ZU1vcmUiLDIpO0RyLmNsYXNzTmFtZT0iTGF5ZXJlZERpZ3JhcGhMYXlvdXQiO0RyLkN5Y2xlRGVwdGhGaXJzdD1FcjtEci5DeWNsZUdyZWVkeT1YcjtEci5DeWNsZUZyb21MYXllcnM9SnI7RHIuTGF5ZXJPcHRpbWFsTGlua0xlbmd0aD1GcjtEci5MYXllckxvbmdlc3RQYXRoU2luaz1icztEci5MYXllckxvbmdlc3RQYXRoU291cmNlPWRzO0RyLkluaXREZXB0aEZpcnN0T3V0PUdyO0RyLkluaXREZXB0aEZpcnN0SW49anM7RHIuSW5pdE5haXZlPWhzO0RyLkFnZ3Jlc3NpdmVOb25lPW5zO0RyLkFnZ3Jlc3NpdmVMZXNzPUhyO0RyLkFnZ3Jlc3NpdmVNb3JlPW9zO0RyLlBhY2tOb25lPTA7RHIuUGFja0V4cGFuZD0xO0RyLlBhY2tTdHJhaWdodGVuPTI7RHIuUGFja01lZGlhbj00O0RyLlBhY2tBbGw9NztmdW5jdGlvbiB3cygpe3RoaXMuaW5kZXg9dGhpcy5zYz10aGlzLlNjPXRoaXMuVGI9dGhpcy5maXJzdD10aGlzLmxheWVyPTA7dGhpcy5saW5rPW51bGw7dGhpcy5sPTA7fXdzLmNsYXNzTmFtZT0iU2VnSW5mbyI7ZnVuY3Rpb24gSXIoYSl7eXAuY2FsbCh0aGlzLGEpO31vYShJcix5cCk7SXIucHJvdG90eXBlLmNyZWF0ZVZlcnRleD1mdW5jdGlvbigpe3JldHVybiBuZXcgeHModGhpcyk7fTtJci5wcm90b3R5cGUuY3JlYXRlRWRnZT1mdW5jdGlvbigpe3JldHVybiBuZXcgeXModGhpcyk7fTtJci5jbGFzc05hbWU9IkxheWVyZWREaWdyYXBoTmV0d29yayI7ZnVuY3Rpb24geHMoYSl7QnAuY2FsbCh0aGlzLGEpO3RoaXMuU2E9dGhpcy5DZz10aGlzLmZpPS0xO3RoaXMuSz1OYU47dGhpcy5iYT1udWxsO3RoaXMudmFsaWQ9ITE7dGhpcy5maW5pc2g9dGhpcy5YbD1OYU47dGhpcy5Qaj0wO3RoaXMucHY9dGhpcy5xdj1udWxsO31vYSh4cyxCcCk7cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeHMucHJvdG90eXBlLHtsYXllcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmZpO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmZpIT09YSYmKHRoaXMuZmk9YSk7fX0sY29sdW1uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuQ2c7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuQ2chPT1hJiYodGhpcy5DZz1hKTt9fSxpbmRleDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlNhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlNhIT09YSYmKHRoaXMuU2E9YSk7fX0sY29tcG9uZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LIT09YSYmKHRoaXMuSz1hKTt9fSxuZWFyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYmE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuYmEhPT1hJiYodGhpcy5iYT1hKTt9fX0pO3hzLmNsYXNzTmFtZT0iTGF5ZXJlZERpZ3JhcGhWZXJ0ZXgiO2Z1bmN0aW9uIHlzKGEpe0NwLmNhbGwodGhpcyxhKTt0aGlzLmw9dGhpcy5NYT10aGlzLlZiPSExO3RoaXMuTGE9dGhpcy5LPU5hTjt0aGlzLmJhPXRoaXMudT0wO31vYSh5cyxDcCk7cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeXMucHJvdG90eXBlLHt2YWxpZDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlZiO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlZiIT09YSYmKHRoaXMuVmI9YSk7fX0scmV2OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTWE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTWEhPT1hJiYodGhpcy5NYT1hKTt9fSxmb3Jlc3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5sO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmwhPT1hJiYodGhpcy5sPWEpO319LHBvcnRGcm9tUG9zOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LIT09YSYmKHRoaXMuSz1hKTt9fSxwb3J0VG9Qb3M6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5MYTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5MYSE9PWEmJih0aGlzLkxhPWEpO319LHBvcnRGcm9tQ29sT2Zmc2V0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy51IT09YSYmKHRoaXMudT1hKTt9fSxwb3J0VG9Db2xPZmZzZXQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5iYTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5iYSE9PWEmJih0aGlzLmJhPWEpO319fSk7eXMuY2xhc3NOYW1lPSJMYXllcmVkRGlncmFwaEVkZ2UiO2Z1bmN0aW9uIHpzKCl7eWkuY2FsbCh0aGlzKTt0aGlzLkZiPW5ldyBGKCk7dGhpcy5Nbz1Bczt0aGlzLlpjPUJzO3RoaXMuRHA9Q3M7dGhpcy5Kcj1Eczt0aGlzLml3PVtdO3RoaXMuWGM9ITA7dGhpcy5BYj1Fczt0aGlzLndkPW5ldyBLKDEwLDEwKS5mcmVlemUoKTt2YXIgYT1uZXcgRnModGhpcyk7dGhpcy5VPW5ldyBHcyhhKTt0aGlzLlY9bmV3IEdzKGEpO3RoaXMueHU9W107fW9hKHpzLHlpKTt6cy5wcm90b3R5cGUuY2xvbmVQcm90ZWN0ZWQ9ZnVuY3Rpb24oYSl7eWkucHJvdG90eXBlLmNsb25lUHJvdGVjdGVkLmNhbGwodGhpcyxhKTthLk1vPXRoaXMuTW87YS5EcD10aGlzLkRwO2EuSnI9dGhpcy5KcjthLlhjPXRoaXMuWGM7YS5BYj10aGlzLkFiO2Eud2QuYXNzaWduKHRoaXMud2QpO2EuVS5jb3B5SW5oZXJpdGVkUHJvcGVydGllc0Zyb20odGhpcy5VKTthLlYuY29weUluaGVyaXRlZFByb3BlcnRpZXNGcm9tKHRoaXMuVik7fTt6cy5wcm90b3R5cGUuZmI9ZnVuY3Rpb24oYSl7YS5jbGFzc1R5cGU9PT16cz8wPT09YS5uYW1lLmluZGV4T2YoIkFsaWdubWVudCIpP3RoaXMuYWxpZ25tZW50PWE6MD09PWEubmFtZS5pbmRleE9mKCJBcnJhbmdlbWVudCIpP3RoaXMuYXJyYW5nZW1lbnQ9YTowPT09YS5uYW1lLmluZGV4T2YoIkNvbXBhY3Rpb24iKT90aGlzLmNvbXBhY3Rpb249YTowPT09YS5uYW1lLmluZGV4T2YoIlBhdGgiKT90aGlzLnBhdGg9YTowPT09YS5uYW1lLmluZGV4T2YoIlNvcnRpbmciKT90aGlzLnNvcnRpbmc9YTowPT09YS5uYW1lLmluZGV4T2YoIlN0eWxlIik/dGhpcy50cmVlU3R5bGU9YTpBKCJVbmtub3duIGVudW0gdmFsdWU6ICIrYSk6eWkucHJvdG90eXBlLmZiLmNhbGwodGhpcyxhKTt9O3pzLnByb3RvdHlwZS5jcmVhdGVOZXR3b3JrPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBGcyh0aGlzKTt9O3pzLnByb3RvdHlwZS5tYWtlTmV0d29yaz1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe2lmKGEgaW5zdGFuY2VvZiBWKXJldHVybiFhLmlzTGlua0xhYmVsJiYiQ29tbWVudCIhPT1hLmNhdGVnb3J5O2lmKGEgaW5zdGFuY2VvZiBTKXt2YXIgYj1hLmZyb21Ob2RlO2lmKG51bGw9PT1ifHxiLmlzTGlua0xhYmVsfHwiQ29tbWVudCI9PT1iLmNhdGVnb3J5KXJldHVybiExO2E9YS50b05vZGU7cmV0dXJuIG51bGw9PT1hfHxhLmlzTGlua0xhYmVsfHwiQ29tbWVudCI9PT1hLmNhdGVnb3J5PyExOiEwO31yZXR1cm4hMTt9dmFyIGM9dGhpcy5jcmVhdGVOZXR3b3JrKCk7YSBpbnN0YW5jZW9mIFA/KGMua2coYS5ub2RlcywhMCxiKSxjLmtnKGEubGlua3MsITAsYikpOmEgaW5zdGFuY2VvZiBpZz9jLmtnKGEubWVtYmVyUGFydHMsITEsYik6Yy5rZyhhLml0ZXJhdG9yLCExLGIpO3JldHVybiBjO307enMucHJvdG90eXBlLmRvTGF5b3V0PWZ1bmN0aW9uKGEpe251bGw9PT10aGlzLm5ldHdvcmsmJih0aGlzLm5ldHdvcms9dGhpcy5tYWtlTmV0d29yayhhKSk7dGhpcy5hcnJhbmdlbWVudCE9PUhzJiYodGhpcy5hcnJhbmdlbWVudE9yaWdpbj10aGlzLmluaXRpYWxPcmlnaW4odGhpcy5hcnJhbmdlbWVudE9yaWdpbikpO3ZhciBiPXRoaXMuZGlhZ3JhbTtudWxsPT09YiYmYSBpbnN0YW5jZW9mIFAmJihiPWEpO3RoaXMucGF0aD09PUFzJiZudWxsIT09Yj90aGlzLlpjPWIuaXNUcmVlUGF0aFRvQ2hpbGRyZW4/QnM6SXM6dGhpcy5aYz10aGlzLnBhdGg9PT1Bcz9Cczp0aGlzLnBhdGg7aWYoMDx0aGlzLm5ldHdvcmsudmVydGV4ZXMuY291bnQpe3RoaXMubmV0d29yay5QcCgpO2ZvcihhPXRoaXMubmV0d29yay52ZXJ0ZXhlcy5pdGVyYXRvcjthLm5leHQoKTspe2I9YS52YWx1ZSxiLmluaXRpYWxpemVkPSExLGIubGV2ZWw9MCxiLnBhcmVudD1udWxsLGIuY2hpbGRyZW49W107fWlmKDA8dGhpcy5GYi5jb3VudCl7YT1uZXcgRigpO2ZvcihiPXRoaXMuRmIuaXRlcmF0b3I7Yi5uZXh0KCk7KXt2YXIgYz1iLnZhbHVlO2MgaW5zdGFuY2VvZiBWPyhjPXRoaXMubmV0d29yay5JaShjKSxudWxsIT09YyYmYS5hZGQoYykpOmMgaW5zdGFuY2VvZiBHcyYmYS5hZGQoYyk7fXRoaXMuRmI9YTt9MD09PXRoaXMuRmIuY291bnQmJnRoaXMuZmluZFJvb3RzKCk7Zm9yKGE9dGhpcy5GYi5jb3B5KCkuaXRlcmF0b3I7YS5uZXh0KCk7KXtiPWEudmFsdWUsYi5pbml0aWFsaXplZHx8KGIuaW5pdGlhbGl6ZWQ9ITAsSnModGhpcyxiKSk7fWI9dGhpcy5uZXR3b3JrLnZlcnRleGVzO2ZvcihhPW51bGw7YT1LcyhiKSwwPGEuY291bnQ7KXtiPUxzKHRoaXMsYSksbnVsbCE9PWImJnRoaXMuRmIuYWRkKGIpLGIuaW5pdGlhbGl6ZWQ9ITAsSnModGhpcyxiKSxiPWE7fWZvcihhPXRoaXMuRmIuaXRlcmF0b3I7YS5uZXh0KCk7KXtiPWEudmFsdWUsYiBpbnN0YW5jZW9mIEdzJiZNcyh0aGlzLGIpO31mb3IoYT10aGlzLkZiLml0ZXJhdG9yO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGIgaW5zdGFuY2VvZiBHcyYmTnModGhpcyxiKTt9Zm9yKGE9dGhpcy5GYi5pdGVyYXRvcjthLm5leHQoKTspe2I9YS52YWx1ZSxiIGluc3RhbmNlb2YgR3MmJk9zKHRoaXMsYik7fXRoaXMuSXUoKTtpZih0aGlzLmxheWVyU3R5bGU9PT1Qcyl7YT1bXTtmb3IoYj10aGlzLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7Yi5uZXh0KCk7KXtjPWIudmFsdWU7dmFyIGQ9Yy5wYXJlbnQ7bnVsbD09PWQmJihkPWMpO2Q9MD09PWQuYW5nbGV8fDE4MD09PWQuYW5nbGU7dmFyIGU9YVtjLmxldmVsXTt2b2lkIDA9PT1lJiYoZT0wKTthW2MubGV2ZWxdPU1hdGgubWF4KGUsZD9jLndpZHRoOmMuaGVpZ2h0KTt9Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dm9pZCAwPT09YVtiXSYmKGFbYl09MCk7fXRoaXMuaXc9YTtmb3IoYj10aGlzLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7Yi5uZXh0KCk7KXtjPWIudmFsdWUsZD1jLnBhcmVudCxudWxsPT09ZCYmKGQ9YyksMD09PWQuYW5nbGV8fDE4MD09PWQuYW5nbGU/KDE4MD09PWQuYW5nbGUmJihjLmZvY3VzWCs9YVtjLmxldmVsXS1jLndpZHRoKSxjLndpZHRoPWFbYy5sZXZlbF0pOigyNzA9PT1kLmFuZ2xlJiYoYy5mb2N1c1krPWFbYy5sZXZlbF0tYy5oZWlnaHQpLGMuaGVpZ2h0PWFbYy5sZXZlbF0pO319ZWxzZSBpZih0aGlzLmxheWVyU3R5bGU9PT1Rcylmb3IoYT10aGlzLm5ldHdvcmsudmVydGV4ZXMuaXRlcmF0b3I7YS5uZXh0KCk7KXtiPWEudmFsdWU7Yz0wPT09Yi5hbmdsZXx8MTgwPT09Yi5hbmdsZTtkPS0xO2ZvcihlPTA7ZTxiLmNoaWxkcmVuLmxlbmd0aDtlKyspe3ZhciBmPWIuY2hpbGRyZW5bZV07ZD1NYXRoLm1heChkLGM/Zi53aWR0aDpmLmhlaWdodCk7fWlmKDA8PWQpZm9yKGU9MDtlPGIuY2hpbGRyZW4ubGVuZ3RoO2UrKyl7Zj1iLmNoaWxkcmVuW2VdLGM/KDE4MD09PWIuYW5nbGUmJihmLmZvY3VzWCs9ZC1mLndpZHRoKSxmLndpZHRoPWQpOigyNzA9PT1iLmFuZ2xlJiYoZi5mb2N1c1krPWQtZi5oZWlnaHQpLGYuaGVpZ2h0PWQpO319Zm9yKGE9dGhpcy5GYi5pdGVyYXRvcjthLm5leHQoKTspe2I9YS52YWx1ZSxiIGluc3RhbmNlb2YgR3MmJnRoaXMubGF5b3V0VHJlZShiKTt9dGhpcy5hcnJhbmdlVHJlZXMoKTt0aGlzLnVwZGF0ZVBhcnRzKCk7fXRoaXMubmV0d29yaz1udWxsO3RoaXMuRmI9bmV3IEYoKTt0aGlzLmlzVmFsaWRMYXlvdXQ9ITA7fTtmdW5jdGlvbiBLcyhhKXt2YXIgYj1uZXcgRigpO2ZvcihhPWEuaXRlcmF0b3I7YS5uZXh0KCk7KXt2YXIgYz1hLnZhbHVlO2MuaW5pdGlhbGl6ZWR8fGIuYWRkKGMpO31yZXR1cm4gYjt9enMucHJvdG90eXBlLmZpbmRSb290cz1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm5ldHdvcmsudmVydGV4ZXMsYj1hLml0ZXJhdG9yO2IubmV4dCgpOyl7dmFyIGM9Yi52YWx1ZTtzd2l0Y2godGhpcy5aYyl7Y2FzZSBCczowPT09Yy5zb3VyY2VFZGdlcy5jb3VudCYmdGhpcy5GYi5hZGQoYyk7YnJlYWs7Y2FzZSBJczowPT09Yy5kZXN0aW5hdGlvbkVkZ2VzLmNvdW50JiZ0aGlzLkZiLmFkZChjKTticmVhaztkZWZhdWx0OkEoIlVuaGFuZGxlZCBwYXRoIHZhbHVlICIrdGhpcy5aYy50b1N0cmluZygpKTt9fTA9PT10aGlzLkZiLmNvdW50JiYoYT1Mcyh0aGlzLGEpLG51bGwhPT1hJiZ0aGlzLkZiLmFkZChhKSk7fTtmdW5jdGlvbiBMcyhhLGIpe3ZhciBjPTk5OTk5OSxkPW51bGw7Zm9yKGI9Yi5pdGVyYXRvcjtiLm5leHQoKTspe3ZhciBlPWIudmFsdWU7c3dpdGNoKGEuWmMpe2Nhc2UgQnM6ZS5zb3VyY2VFZGdlcy5jb3VudDxjJiYoYz1lLnNvdXJjZUVkZ2VzLmNvdW50LGQ9ZSk7YnJlYWs7Y2FzZSBJczplLmRlc3RpbmF0aW9uRWRnZXMuY291bnQ8YyYmKGM9ZS5kZXN0aW5hdGlvbkVkZ2VzLmNvdW50LGQ9ZSk7YnJlYWs7ZGVmYXVsdDpBKCJVbmhhbmRsZWQgcGF0aCB2YWx1ZSAiK2EuWmMudG9TdHJpbmcoKSk7fX1yZXR1cm4gZDt9ZnVuY3Rpb24gSnMoYSxiKXtpZihudWxsIT09Yil7c3dpdGNoKGEuWmMpe2Nhc2UgQnM6aWYoMDxiLmRlc3RpbmF0aW9uRWRnZXMuY291bnQpe2Zvcih2YXIgYz1uZXcgRSgpLGQ9Yi5kZXN0aW5hdGlvblZlcnRleGVzO2QubmV4dCgpOyl7dmFyIGU9ZC52YWx1ZTtScyhhLGIsZSkmJmMuYWRkKGUpO30wPGMuY291bnQmJihiLmNoaWxkcmVuPWMuTmEoKSk7fWJyZWFrO2Nhc2UgSXM6aWYoMDxiLnNvdXJjZUVkZ2VzLmNvdW50KXtjPW5ldyBFKCk7Zm9yKGQ9Yi5zb3VyY2VWZXJ0ZXhlcztkLm5leHQoKTspe2U9ZC52YWx1ZSxScyhhLGIsZSkmJmMuYWRkKGUpO30wPGMuY291bnQmJihiLmNoaWxkcmVuPWMuTmEoKSk7fWJyZWFrO2RlZmF1bHQ6QSgiVW5oYW5kbGVkIHBhdGggdmFsdWUiK2EuWmMudG9TdHJpbmcoKSk7fWM9Yi5jaGlsZHJlbjtkPWMubGVuZ3RoO2ZvcihlPTA7ZTxkO2UrKyl7dmFyIGY9Y1tlXTtmLmluaXRpYWxpemVkPSEwO2YubGV2ZWw9Yi5sZXZlbCsxO2YucGFyZW50PWI7YS5GYi5yZW1vdmUoZik7fWZvcihiPTA7YjxkO2IrKyl7SnMoYSxjW2JdKTt9fX1mdW5jdGlvbiBScyhhLGIsYyl7aWYoYy5pbml0aWFsaXplZCl7aWYobnVsbD09PWIpdmFyIGQ9ITE7ZWxzZXtmb3IoZD1iLnBhcmVudDtudWxsIT09ZCYmZCE9PWM7KXtkPWQucGFyZW50O31kPWQ9PT1jO31pZihkfHxjLmxldmVsPmIubGV2ZWwpcmV0dXJuITE7YS5yZW1vdmVDaGlsZChjLnBhcmVudCxjKTt9cmV0dXJuITA7fXpzLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihhLGIpe2lmKG51bGwhPT1hJiZudWxsIT09Yil7Zm9yKHZhciBjPWEuY2hpbGRyZW4sZD0wLGU9MDtlPGMubGVuZ3RoO2UrKyl7Y1tlXT09PWImJmQrKzt9aWYoMDxkKXtkPUFycmF5KGMubGVuZ3RoLWQpO2Zvcih2YXIgZj1lPTA7ZjxjLmxlbmd0aDtmKyspe2NbZl0hPT1iJiYoZFtlKytdPWNbZl0pO31hLmNoaWxkcmVuPWQ7fX19O2Z1bmN0aW9uIE1zKGEsYil7aWYobnVsbCE9PWIpe2EuaW5pdGlhbGl6ZVRyZWVWZXJ0ZXhWYWx1ZXMoYik7Yi5hbGlnbm1lbnQ9PT1TcyYmYS5zb3J0VHJlZVZlcnRleENoaWxkcmVuKGIpO2Zvcih2YXIgYz0wLGQ9Yi5jaGlsZHJlbkNvdW50LGU9MCxmPWIuY2hpbGRyZW4sZz1mLmxlbmd0aCxoPTA7aDxnO2grKyl7dmFyIGs9ZltoXTtNcyhhLGspO2MrPWsuZGVzY2VuZGFudENvdW50KzE7ZD1NYXRoLm1heChkLGsubWF4Q2hpbGRyZW5Db3VudCk7ZT1NYXRoLm1heChlLGsubWF4R2VuZXJhdGlvbkNvdW50KTt9Yi5kZXNjZW5kYW50Q291bnQ9YztiLm1heENoaWxkcmVuQ291bnQ9ZDtiLm1heEdlbmVyYXRpb25Db3VudD0wPGQ/ZSsxOjA7fX1mdW5jdGlvbiBUcyhhLGIpe3N3aXRjaChhLkRwKXtkZWZhdWx0OmNhc2UgQ3M6cmV0dXJuIG51bGwhPT1iLnBhcmVudD9iLnBhcmVudDphLlU7Y2FzZSBVczpyZXR1cm4gbnVsbD09PWIucGFyZW50P2EuVTpudWxsPT09Yi5wYXJlbnQucGFyZW50P2EuVjpiLnBhcmVudDtjYXNlIFZzOnJldHVybiBudWxsIT09Yi5wYXJlbnQ/bnVsbCE9PWIucGFyZW50LnBhcmVudD9iLnBhcmVudC5wYXJlbnQ6YS5WOmEuVTtjYXNlIFdzOnZhciBjPSEwO2lmKDA9PT1iLmNoaWxkcmVuQ291bnQpYz0hMTtlbHNlIGZvcih2YXIgZD1iLmNoaWxkcmVuLGU9ZC5sZW5ndGgsZj0wO2Y8ZTtmKyspe2lmKDA8ZFtmXS5jaGlsZHJlbkNvdW50KXtjPSExO2JyZWFrO319cmV0dXJuIGMmJm51bGwhPT1iLnBhcmVudD9hLlY6bnVsbCE9PWIucGFyZW50P2IucGFyZW50OmEuVTt9fXpzLnByb3RvdHlwZS5pbml0aWFsaXplVHJlZVZlcnRleFZhbHVlcz1mdW5jdGlvbihhKXthLmNvcHlJbmhlcml0ZWRQcm9wZXJ0aWVzRnJvbShUcyh0aGlzLGEpKTtpZihudWxsIT09YS5wYXJlbnQmJmEucGFyZW50LmFsaWdubWVudD09PVNzKXtmb3IodmFyIGI9YS5hbmdsZSxjPWEucGFyZW50LmNoaWxkcmVuLGQ9MDtkPGMubGVuZ3RoJiZhIT09Y1tkXTspe2QrKzt9MD09PWQlMj9kIT09Yy5sZW5ndGgtMSYmKGI9OTA9PT1iPzE4MDoxODA9PT1iPzI3MDoyNzA9PT1iPzE4MDoyNzApOmI9OTA9PT1iPzA6MTgwPT09Yj85MDoyNzA9PT1iPzA6OTA7YS5hbmdsZT1iO31hLmluaXRpYWxpemVkPSEwO307ZnVuY3Rpb24gTnMoYSxiKXtpZihudWxsIT09Yil7YS5hc3NpZ25UcmVlVmVydGV4VmFsdWVzKGIpO2I9Yi5jaGlsZHJlbjtmb3IodmFyIGM9Yi5sZW5ndGgsZD0wO2Q8YztkKyspe05zKGEsYltkXSk7fX19enMucHJvdG90eXBlLmFzc2lnblRyZWVWZXJ0ZXhWYWx1ZXM9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIE9zKGEsYil7aWYobnVsbCE9PWIpe2IuYWxpZ25tZW50IT09U3MmJmEuc29ydFRyZWVWZXJ0ZXhDaGlsZHJlbihiKTtiPWIuY2hpbGRyZW47Zm9yKHZhciBjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtPcyhhLGJbZF0pO319fXpzLnByb3RvdHlwZS5zb3J0VHJlZVZlcnRleENoaWxkcmVuPWZ1bmN0aW9uKGEpe3N3aXRjaChhLnNvcnRpbmcpe2Nhc2UgWHM6YnJlYWs7Y2FzZSBZczphLmNoaWxkcmVuLnJldmVyc2UoKTticmVhaztjYXNlIFpzOmEuY2hpbGRyZW4uc29ydChhLmNvbXBhcmVyKTticmVhaztjYXNlICRzOmEuY2hpbGRyZW4uc29ydChhLmNvbXBhcmVyKTthLmNoaWxkcmVuLnJldmVyc2UoKTticmVhaztkZWZhdWx0OkEoIlVuaGFuZGxlZCBzb3J0aW5nIHZhbHVlICIrYS5zb3J0aW5nLnRvU3RyaW5nKCkpO319O3pzLnByb3RvdHlwZS5JdT1mdW5jdGlvbigpe2lmKHRoaXMuY29tbWVudHMpZm9yKHZhciBhPXRoaXMubmV0d29yay52ZXJ0ZXhlcy5pdGVyYXRvcjthLm5leHQoKTspe3RoaXMuYWRkQ29tbWVudHMoYS52YWx1ZSk7fX07enMucHJvdG90eXBlLmFkZENvbW1lbnRzPWZ1bmN0aW9uKGEpe3ZhciBiPWEuYW5nbGUsYz1hLnBhcmVudCxkPTA7dmFyIGU9ITE7bnVsbCE9PWMmJihkPWMuYW5nbGUsZT1jLmFsaWdubWVudCxlPWF0KGUpKTtiPTkwPT09Ynx8MjcwPT09YjtkPTkwPT09ZHx8MjcwPT09ZDtjPTA9PT1hLmNoaWxkcmVuQ291bnQ7dmFyIGY9MCxnPTAsaD0wLGs9YS5jb21tZW50U3BhY2luZztpZihudWxsIT09YS5ub2RlKWZvcih2YXIgbD1hLm5vZGUuWHUoKTtsLm5leHQoKTspe3ZhciBtPWwudmFsdWU7IkNvbW1lbnQiPT09bS5jYXRlZ29yeSYmbS5jYW5MYXlvdXQoKSYmKG51bGw9PT1hLmNvbW1lbnRzJiYoYS5jb21tZW50cz1bXSksYS5jb21tZW50cy5wdXNoKG0pLG0uYWMoKSxtPW0ubWVhc3VyZWRCb3VuZHMsYiYmIWN8fCFlJiYhZCYmY3x8ZSYmZCYmYz8oZj1NYXRoLm1heChmLG0ud2lkdGgpLGcrPW0uaGVpZ2h0K01hdGguYWJzKGgpKTooZis9bS53aWR0aCtNYXRoLmFicyhoKSxnPU1hdGgubWF4KGcsbS5oZWlnaHQpKSxoPWspO31udWxsIT09YS5jb21tZW50cyYmKGImJiFjfHwhZSYmIWQmJmN8fGUmJmQmJmM/KGYrPU1hdGguYWJzKGEuY29tbWVudE1hcmdpbiksZz1NYXRoLm1heCgwLGctYS5oZWlnaHQpKTooZys9TWF0aC5hYnMoYS5jb21tZW50TWFyZ2luKSxmPU1hdGgubWF4KDAsZi1hLndpZHRoKSksZT1OLmFsbG9jQXQoMCwwLGEuYm91bmRzLndpZHRoK2YsYS5ib3VuZHMuaGVpZ2h0K2cpLGEuYm91bmRzPWUsTi5mcmVlKGUpKTt9O2Z1bmN0aW9uIGF0KGEpe3JldHVybiBhPT09YnR8fGE9PT1Tc3x8YT09PWN0fHxhPT09ZHQ7fWZ1bmN0aW9uIGV0KGEpe3JldHVybiBhPT09YnR8fGE9PT1Tczt9ZnVuY3Rpb24gZnQoYSl7dmFyIGI9YS5wYXJlbnQ7aWYobnVsbCE9PWIpe3ZhciBjPWIuYWxpZ25tZW50O2lmKGF0KGMpKXtpZihldChjKSl7Yj1iLmNoaWxkcmVuO2ZvcihjPTA7YzxiLmxlbmd0aCYmYSE9PWJbY107KXtjKys7fXJldHVybiAwPT09YyUyO31pZihjPT09Y3QpcmV0dXJuITA7fX1yZXR1cm4hMTt9enMucHJvdG90eXBlLmxheW91dENvbW1lbnRzPWZ1bmN0aW9uKGEpe2lmKG51bGwhPT1hLmNvbW1lbnRzKXt2YXIgYj1hLm5vZGUubWVhc3VyZWRCb3VuZHMsYz1hLnBhcmVudCxkPWEuYW5nbGUsZT0wO3ZhciBmPSExO251bGwhPT1jJiYoZT1jLmFuZ2xlLGY9Yy5hbGlnbm1lbnQsZj1hdChmKSk7ZD05MD09PWR8fDI3MD09PWQ7Yz05MD09PWV8fDI3MD09PWU7Zm9yKHZhciBnPTA9PT1hLmNoaWxkcmVuQ291bnQsaD1mdChhKSxrPTAsbD1hLmNvbW1lbnRzLG09bC5sZW5ndGgsbj1HLmFsbG9jKCkscD0wO3A8bTtwKyspe3ZhciBxPWxbcF0scj1xLm1lYXN1cmVkQm91bmRzO2lmKGQmJiFnfHwhZiYmIWMmJmd8fGYmJmMmJmcpe2lmKDEzNTxlJiYhZnx8YyYmaCl7aWYoMDw9YS5jb21tZW50TWFyZ2luKWZvcihuLmgoYS5ib3VuZHMueC1hLmNvbW1lbnRNYXJnaW4tci53aWR0aCxhLmJvdW5kcy55K2spLHEubW92ZShuKSxxPXEuc2QoKTtxLm5leHQoKTspe3ZhciB1PXEudmFsdWU7dS5mcm9tU3BvdD1LZDt1LnRvU3BvdD1TZDt9ZWxzZSBmb3Iobi5oKGEuYm91bmRzLngrMiphLmZvY3VzLngtYS5jb21tZW50TWFyZ2luLGEuYm91bmRzLnkraykscS5tb3ZlKG4pLHE9cS5zZCgpO3EubmV4dCgpOyl7dT1xLnZhbHVlLHUuZnJvbVNwb3Q9U2QsdS50b1Nwb3Q9S2Q7fX1lbHNlIGlmKDA8PWEuY29tbWVudE1hcmdpbilmb3Iobi5oKGEuYm91bmRzLngrMiphLmZvY3VzLngrYS5jb21tZW50TWFyZ2luLGEuYm91bmRzLnkraykscS5tb3ZlKG4pLHE9cS5zZCgpO3EubmV4dCgpOyl7dT1xLnZhbHVlLHUuZnJvbVNwb3Q9U2QsdS50b1Nwb3Q9S2Q7fWVsc2UgZm9yKG4uaChhLmJvdW5kcy54K2EuY29tbWVudE1hcmdpbi1yLndpZHRoLGEuYm91bmRzLnkraykscS5tb3ZlKG4pLHE9cS5zZCgpO3EubmV4dCgpOyl7dT1xLnZhbHVlLHUuZnJvbVNwb3Q9S2QsdS50b1Nwb3Q9U2Q7fWs9MDw9YS5jb21tZW50U3BhY2luZz9rKyhyLmhlaWdodCthLmNvbW1lbnRTcGFjaW5nKTprKyhhLmNvbW1lbnRTcGFjaW5nLXIuaGVpZ2h0KTt9ZWxzZXtpZigxMzU8ZSYmIWZ8fCFjJiZoKXtpZigwPD1hLmNvbW1lbnRNYXJnaW4pZm9yKG4uaChhLmJvdW5kcy54K2ssYS5ib3VuZHMueS1hLmNvbW1lbnRNYXJnaW4tci5oZWlnaHQpLHEubW92ZShuKSxxPXEuc2QoKTtxLm5leHQoKTspe3U9cS52YWx1ZSx1LmZyb21TcG90PUpkLHUudG9TcG90PVRkO31lbHNlIGZvcihuLmgoYS5ib3VuZHMueCtrLGEuYm91bmRzLnkrMiphLmZvY3VzLnktYS5jb21tZW50TWFyZ2luKSxxLm1vdmUobikscT1xLnNkKCk7cS5uZXh0KCk7KXt1PXEudmFsdWUsdS5mcm9tU3BvdD1UZCx1LnRvU3BvdD1KZDt9fWVsc2UgaWYoMDw9YS5jb21tZW50TWFyZ2luKWZvcihuLmgoYS5ib3VuZHMueCtrLGEuYm91bmRzLnkrMiphLmZvY3VzLnkrYS5jb21tZW50TWFyZ2luKSxxLm1vdmUobikscT1xLnNkKCk7cS5uZXh0KCk7KXt1PXEudmFsdWUsdS5mcm9tU3BvdD1UZCx1LnRvU3BvdD1KZDt9ZWxzZSBmb3Iobi5oKGEuYm91bmRzLngrayxhLmJvdW5kcy55K2EuY29tbWVudE1hcmdpbi1yLmhlaWdodCkscS5tb3ZlKG4pLHE9cS5zZCgpO3EubmV4dCgpOyl7dT1xLnZhbHVlLHUuZnJvbVNwb3Q9SmQsdS50b1Nwb3Q9VGQ7fWs9MDw9YS5jb21tZW50U3BhY2luZz9rKyhyLndpZHRoK2EuY29tbWVudFNwYWNpbmcpOmsrKGEuY29tbWVudFNwYWNpbmctci53aWR0aCk7fX1HLmZyZWUobik7Yj1rLWEuY29tbWVudFNwYWNpbmctKGQ/Yi5oZWlnaHQ6Yi53aWR0aCk7aWYodGhpcy5aYz09PUJzKWZvcihhPWEuZGVzdGluYXRpb25FZGdlczthLm5leHQoKTspe2U9YS52YWx1ZS5saW5rLG51bGw9PT1lfHxlLmlzQXZvaWRpbmd8fChlLmZyb21FbmRTZWdtZW50TGVuZ3RoPTA8Yj9iOk5hTik7fWVsc2UgZm9yKGE9YS5zb3VyY2VFZGdlczthLm5leHQoKTspe2U9YS52YWx1ZS5saW5rLG51bGw9PT1lfHxlLmlzQXZvaWRpbmd8fChlLnRvRW5kU2VnbWVudExlbmd0aD0wPGI/YjpOYU4pO319fTt6cy5wcm90b3R5cGUubGF5b3V0VHJlZT1mdW5jdGlvbihhKXtpZihudWxsIT09YSl7Zm9yKHZhciBiPWEuY2hpbGRyZW4sYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7dGhpcy5sYXlvdXRUcmVlKGJbZF0pO31zd2l0Y2goYS5jb21wYWN0aW9uKXtjYXNlIGd0Omh0KHRoaXMsYSk7YnJlYWs7Y2FzZSBpdDppZihhLmFsaWdubWVudD09PVNzKWh0KHRoaXMsYSk7ZWxzZSBpZigwPT09YS5jaGlsZHJlbkNvdW50KWQ9YS5wYXJlbnQsYz0hMSxiPTAsbnVsbCE9PWQmJihiPWQuYW5nbGUsYz1kLmFsaWdubWVudCxjPWF0KGMpKSxkPWZ0KGEpLGEuVC5oKDAsMCksYS51YS5oKGEud2lkdGgsYS5oZWlnaHQpLG51bGw9PT1hLnBhcmVudHx8bnVsbD09PWEuY29tbWVudHN8fCgxODAhPT1iJiYyNzAhPT1ifHxjKSYmIWQ/YS5pYS5oKDAsMCk6MTgwPT09YiYmIWN8fCg5MD09PWJ8fDI3MD09PWIpJiZkP2EuaWEuaChhLndpZHRoLTIqYS5mb2N1cy54LDApOmEuaWEuaCgwLGEuaGVpZ2h0LTIqYS5mb2N1cy55KSxhLmJxPW51bGwsYS5vcT1udWxsO2Vsc2V7dmFyIGU9anQoYSk7Yj05MD09PWV8fDI3MD09PWU7dmFyIGY9MCxnPWEuY2hpbGRyZW4saD1nLmxlbmd0aDtmb3IoYz0wO2M8aDtjKyspe2Q9Z1tjXSxmPU1hdGgubWF4KGYsYj9kLnVhLndpZHRoOmQudWEuaGVpZ2h0KTt9dmFyIGs9YS5hbGlnbm1lbnQsbD1rPT09a3QsbT1hdChrKSxuPU1hdGgubWF4KDAsYS5icmVhZHRoTGltaXQpO2M9bHQoYSk7dmFyIHA9YS5ub2RlU3BhY2luZyxxPW10KGEpLHI9YS5yb3dTcGFjaW5nLHU9MDtpZihrPT09cXR8fGx8fGEudG18fGEudW0mJjE9PT1hLm1heEdlbmVyYXRpb25Db3VudCl1PU1hdGgubWF4KDAsYS5yb3dJbmRlbnQpO2Q9YS53aWR0aDt2YXIgeD1hLmhlaWdodCx2PTAseT0wLHo9MCxCPW51bGwsQz1udWxsLEk9MCxKPTAsTD0wLFU9MCxRPTAsaWE9MCxqYT0wLE09MDttJiYhZXQoaykmJjEzNTxlJiZnLnJldmVyc2UoKTtpZihldChrKSlpZigxPGgpZm9yKHZhciBSPTA7UjxoO1IrKyl7MD09PVIlMiYmUiE9PWgtMSYmKE09TWF0aC5tYXgoTSxiP2dbUl0udWEud2lkdGg6Z1tSXS51YS5oZWlnaHQpKTt9ZWxzZSAxPT09aCYmKE09Yj9nWzBdLnVhLndpZHRoOmdbMF0udWEuaGVpZ2h0KTtpZihtKXtzd2l0Y2goayl7Y2FzZSBidDp5PTEzNT5lP3J0KGEsZyxNLHYseSk6c3QoYSxnLE0sdix5KTtNPXkueDt2PXkud2lkdGg7eT15LmhlaWdodDticmVhaztjYXNlIGN0OmZvcihCPTA7QjxoO0IrKyl7Qz1nW0JdLG49Qy51YSx6PTA9PT1pYT8wOnIsYj8oQy5ULmgoZi1uLndpZHRoLFUreiksdj1NYXRoLm1heCh2LG4ud2lkdGgpLHk9TWF0aC5tYXgoeSxVK3orbi5oZWlnaHQpLFUrPXorbi5oZWlnaHQpOihDLlQuaChMK3osZi1uLmhlaWdodCksdj1NYXRoLm1heCh2LEwreituLndpZHRoKSx5PU1hdGgubWF4KHksbi5oZWlnaHQpLEwrPXorbi53aWR0aCksaWErKzt9YnJlYWs7Y2FzZSBkdDpmb3IoQj0wO0I8aDtCKyspe0M9Z1tCXSxmPUMudWEsbj0wPT09aWE/MDpyLGI/KEMuVC5oKHAvMithLmZvY3VzLngsVStuKSx2PU1hdGgubWF4KHYsZi53aWR0aCkseT1NYXRoLm1heCh5LFUrbitmLmhlaWdodCksVSs9bitmLmhlaWdodCk6KEMuVC5oKEwrbixwLzIrYS5mb2N1cy55KSx2PU1hdGgubWF4KHYsTCtuK2Yud2lkdGgpLHk9TWF0aC5tYXgoeSxmLmhlaWdodCksTCs9bitmLndpZHRoKSxpYSsrO319Qj10dCh0aGlzLDIpO0M9dHQodGhpcywyKTtiPyhCWzBdLmgoMCwwKSxCWzFdLmgoMCx5KSxDWzBdLmgodiwwKSk6KEJbMF0uaCgwLDApLEJbMV0uaCh2LDApLENbMF0uaCgwLHkpKTtDWzFdLmgodix5KTt9ZWxzZSBmb3IoUj0wO1I8aDtSKyspe3ZhciBBYT1nW1JdLG9iPUFhLnVhO2lmKGIpezA8biYmMDxpYSYmTCtwK29iLndpZHRoPm4mJihMPGYmJnV0KGEsayxmLUwsMCxqYSxSLTEpLFErKyxpYT0wLGphPVIsej15LEw9MCxVPTEzNTxlPy15LXI6eStyKTt2dCh0aGlzLEFhLDAsVSk7dmFyIEhhPTA7aWYoMD09PWlhKXtpZihCPUFhLmJxLEM9QWEub3EsST1vYi53aWR0aCxKPW9iLmhlaWdodCxudWxsPT09Qnx8bnVsbD09PUN8fGUhPT1qdChBYSkpQj10dCh0aGlzLDIpLEM9dHQodGhpcywyKSxCWzBdLmgoMCwwKSxCWzFdLmgoMCxKKSxDWzBdLmgoSSwwKSxDWzFdLmgoSSxKKTt9ZWxzZXt2YXIgRGE9S2EoKTtKPXd0KHRoaXMsYSxBYSxCLEMsSSxKLERhKTtIYT1KLng7Qj1EYVswXTtDPURhWzFdO0k9Si53aWR0aDtKPUouaGVpZ2h0O09hKERhKTtMPG9iLndpZHRoJiYwPkhhJiYoeHQoYSwtSGEsMCxqYSxSLTEpLHl0KEIsLUhhLDApLHl0KEMsLUhhLDApLEhhPTApO31BYS5ULmgoSGEsVSk7dj1NYXRoLm1heCh2LEkpO3k9TWF0aC5tYXgoeSx6KygwPT09UT8wOnIpK29iLmhlaWdodCk7TD1JO31lbHNlezA8biYmMDxpYSYmVStwK29iLmhlaWdodD5uJiYoVTxmJiZ1dChhLGssMCxmLVUsamEsUi0xKSxRKyssaWE9MCxqYT1SLHo9dixVPTAsTD0xMzU8ZT8tdi1yOnYrcik7dnQodGhpcyxBYSxMLDApO0hhPTA7aWYoMD09PWlhKXtpZihCPUFhLmJxLEM9QWEub3EsST1vYi53aWR0aCxKPW9iLmhlaWdodCxudWxsPT09Qnx8bnVsbD09PUN8fGUhPT1qdChBYSkpQj10dCh0aGlzLDIpLEM9dHQodGhpcywyKSxCWzBdLmgoMCwwKSxCWzFdLmgoSSwwKSxDWzBdLmgoMCxKKSxDWzFdLmgoSSxKKTt9ZWxzZSBEYT1LYSgpLEo9d3QodGhpcyxhLEFhLEIsQyxJLEosRGEpLEhhPUoueCxCPURhWzBdLEM9RGFbMV0sST1KLndpZHRoLEo9Si5oZWlnaHQsT2EoRGEpLFU8b2IuaGVpZ2h0JiYwPkhhJiYoeHQoYSwwLC1IYSxqYSxSLTEpLHl0KEIsMCwtSGEpLHl0KEMsMCwtSGEpLEhhPTApO0FhLlQuaChMLEhhKTt5PU1hdGgubWF4KHksSik7dj1NYXRoLm1heCh2LHorKDA9PT1RPzA6cikrb2Iud2lkdGgpO1U9Sjt9aWErKzt9MDxRJiYoYj8oeSs9TWF0aC5tYXgoMCxjKSxMPHYmJnV0KGEsayx2LUwsMCxqYSxoLTEpLDA8dSYmKGx8fHh0KGEsdSwwLDAsaC0xKSx2Kz11KSk6KHYrPU1hdGgubWF4KDAsYyksVTx5JiZ1dChhLGssMCx5LVUsamEsaC0xKSwwPHUmJihsfHx4dChhLDAsdSwwLGgtMSkseSs9dSkpKTt1PWw9MDtzd2l0Y2goayl7Y2FzZSB6dDpiP2wrPXYvMi1hLmZvY3VzLngtcS8yOnUrPXkvMi1hLmZvY3VzLnktcS8yO2JyZWFrO2Nhc2UgQXQ6MDxRP2I/bCs9di8yLWEuZm9jdXMueC1xLzI6dSs9eS8yLWEuZm9jdXMueS1xLzI6Yj8oTT1nWzBdLlQueCtnWzBdLmlhLngsbCs9TSsoZ1toLTFdLlQueCtnW2gtMV0uaWEueCsyKmdbaC0xXS5mb2N1cy54LU0pLzItYS5mb2N1cy54LXEvMik6KE09Z1swXS5ULnkrZ1swXS5pYS55LHUrPU0rKGdbaC0xXS5ULnkrZ1toLTFdLmlhLnkrMipnW2gtMV0uZm9jdXMueS1NKS8yLWEuZm9jdXMueS1xLzIpO2JyZWFrO2Nhc2UgcXQ6Yj8obC09cSx2Kz1xKToodS09cSx5Kz1xKTticmVhaztjYXNlIGt0OmI/KGwrPXYtYS53aWR0aCtxLHYrPXEpOih1Kz15LWEuaGVpZ2h0K3EseSs9cSk7YnJlYWs7Y2FzZSBidDpiPzE8aD9sKz1NK3AvMi1hLmZvY3VzLng6bCs9Z1swXS5mb2N1cy54LWEuZm9jdXMueCtnWzBdLmlhLng6MTxoP3UrPU0rcC8yLWEuZm9jdXMueTp1Kz1nWzBdLmZvY3VzLnktYS5mb2N1cy55K2dbMF0uaWEueTticmVhaztjYXNlIGN0OmI/bCs9ditwLzItYS5mb2N1cy54OnUrPXkrcC8yLWEuZm9jdXMueTticmVhaztjYXNlIGR0OmJyZWFrO2RlZmF1bHQ6QSgiVW5oYW5kbGVkIGFsaWdubWVudCB2YWx1ZSAiK2sudG9TdHJpbmcoKSk7fWZvcihxPTA7cTxoO3ErKyl7TT1nW3FdLGI/TS5ULmgoTS5ULngrTS5pYS54LWwsTS5ULnkrKDEzNTxlPyhtPy15Oi1NLnVhLmhlaWdodCkrTS5pYS55LWM6eCtjK00uaWEueSkpOk0uVC5oKE0uVC54KygxMzU8ZT8obT8tdjotTS51YS53aWR0aCkrTS5pYS54LWM6ZCtjK00uaWEueCksTS5ULnkrTS5pYS55LXUpO31oPWc9MDttP2I/KHY9QnQoYSx2LGwpLDA+bCYmKGw9MCksMTM1PGUmJih1Kz15K2MpLHkrPXgrYyxrPT09ZHQmJihnKz1wLzIrYS5mb2N1cy54KSxoKz14K2MpOigxMzU8ZSYmKGwrPXYrYyksdis9ZCtjLHk9Q3QoYSx5LHUpLDA+dSYmKHU9MCksaz09PWR0JiYoaCs9cC8yK2EuZm9jdXMueSksZys9ZCtjKTpiPyhudWxsPT09YS5jb21tZW50cz9kPnYmJih2PUR0KGssZC12LDApLGc9di54LGg9di55LHY9ZCxsPTApOnY9QnQoYSx2LGwpLDA+bCYmKGctPWwsbD0wKSwxMzU8ZSYmKHUrPXkrYykseT1NYXRoLm1heChNYXRoLm1heCh5LHgpLHkreCtjKSxoKz14K2MpOigxMzU8ZSYmKGwrPXYrYyksdj1NYXRoLm1heChNYXRoLm1heCh2LGQpLHYrZCtjKSxudWxsPT09YS5jb21tZW50cz94PnkmJih5PUR0KGssMCx4LXkpLGc9eS54LGg9eS55LHk9eCx1PTApOnk9Q3QoYSx5LHUpLDA+dSYmKGgtPXUsdT0wKSxnKz1kK2MpO2lmKDA8USllPXR0KHRoaXMsNCksUT10dCh0aGlzLDQpLGI/KGVbMl0uaCgwLHgrYyksZVszXS5oKGVbMl0ueCx5KSxRWzJdLmgodixlWzJdLnkpLFFbM10uaChRWzJdLngsZVszXS55KSk6KGVbMl0uaChkK2MsMCksZVszXS5oKHYsZVsyXS55KSxRWzJdLmgoZVsyXS54LHkpLFFbM10uaChlWzNdLngsUVsyXS55KSk7ZWxzZXtlPXR0KHRoaXMsQi5sZW5ndGgrMik7UT10dCh0aGlzLEMubGVuZ3RoKzIpO2ZvcihrPTA7azxCLmxlbmd0aDtrKyspe209QltrXSxlW2srMl0uaChtLngrZyxtLnkraCk7fWZvcihrPTA7azxDLmxlbmd0aDtrKyspe209Q1trXSxRW2srMl0uaChtLngrZyxtLnkraCk7fX1iPyhlWzBdLmgobCwwKSxlWzFdLmgoZVswXS54LHgpLGVbMl0ueTxlWzFdLnkmJihlWzJdLng+ZVswXS54P2VbMl0uYXNzaWduKGVbMV0pOmVbMV0uYXNzaWduKGVbMl0pKSxlWzNdLnk8ZVsyXS55JiYoZVszXS54PmVbMF0ueD9lWzNdLmFzc2lnbihlWzJdKTplWzJdLmFzc2lnbihlWzNdKSksUVswXS5oKGwrZCwwKSxRWzFdLmgoUVswXS54LHgpLFFbMl0ueTxRWzFdLnkmJihRWzJdLng8UVswXS54P1FbMl0uYXNzaWduKFFbMV0pOlFbMV0uYXNzaWduKFFbMl0pKSxRWzNdLnk8UVsyXS55JiYoUVszXS54PFFbMF0ueD9RWzNdLmFzc2lnbihRWzJdKTpRWzJdLmFzc2lnbihRWzNdKSksZVsyXS55LT1jLzIsUVsyXS55LT1jLzIpOihlWzBdLmgoMCx1KSxlWzFdLmgoZCxlWzBdLnkpLGVbMl0ueDxlWzFdLngmJihlWzJdLnk+ZVswXS55P2VbMl0uYXNzaWduKGVbMV0pOmVbMV0uYXNzaWduKGVbMl0pKSxlWzNdLng8ZVsyXS54JiYoZVszXS55PmVbMF0ueT9lWzNdLmFzc2lnbihlWzJdKTplWzJdLmFzc2lnbihlWzNdKSksUVswXS5oKDAsdSt4KSxRWzFdLmgoZCxRWzBdLnkpLFFbMl0ueDxRWzFdLngmJihRWzJdLnk8UVswXS55P1FbMl0uYXNzaWduKFFbMV0pOlFbMV0uYXNzaWduKFFbMl0pKSxRWzNdLng8UVsyXS54JiYoUVszXS55PFFbMF0ueT9RWzNdLmFzc2lnbihRWzJdKTpRWzJdLmFzc2lnbihRWzNdKSksZVsyXS54LT1jLzIsUVsyXS54LT1jLzIpO0V0KHRoaXMsQik7RXQodGhpcyxDKTthLmJxPWU7YS5vcT1RO2EuaWEuaChsLHUpO2EudWEuaCh2LHkpO31icmVhaztkZWZhdWx0OkEoIlVuaGFuZGxlZCBjb21wYWN0aW9uIHZhbHVlICIrYS5jb21wYWN0aW9uLnRvU3RyaW5nKCkpO319fTtmdW5jdGlvbiBodChhLGIpe2lmKDA9PT1iLmNoaWxkcmVuQ291bnQpe3ZhciBjPSExLGQ9MDtudWxsIT09Yi5wYXJlbnQmJihkPWIucGFyZW50LmFuZ2xlLGM9Yi5wYXJlbnQuYWxpZ25tZW50LGM9YXQoYykpO3ZhciBlPWZ0KGIpO2IuVC5oKDAsMCk7Yi51YS5oKGIud2lkdGgsYi5oZWlnaHQpO251bGw9PT1iLnBhcmVudHx8bnVsbD09PWIuY29tbWVudHN8fCgxODAhPT1kJiYyNzAhPT1kfHxjKSYmIWU/Yi5pYS5oKDAsMCk6MTgwPT09ZCYmIWN8fCg5MD09PWR8fDI3MD09PWQpJiZlP2IuaWEuaChiLndpZHRoLTIqYi5mb2N1cy54LDApOmIuaWEuaCgwLGIuaGVpZ2h0LTIqYi5mb2N1cy55KTt9ZWxzZXtkPWp0KGIpO2M9OTA9PT1kfHwyNzA9PT1kO3ZhciBmPTA7ZT1iLmNoaWxkcmVuO2Zvcih2YXIgZz1lLmxlbmd0aCxoPTA7aDxnO2grKyl7dmFyIGs9ZVtoXTtmPU1hdGgubWF4KGYsYz9rLnVhLndpZHRoOmsudWEuaGVpZ2h0KTt9dmFyIGw9Yi5hbGlnbm1lbnQsbT1sPT09cXQsbj1sPT09a3Q7aD1hdChsKTt2YXIgcD1NYXRoLm1heCgwLGIuYnJlYWR0aExpbWl0KTtrPWx0KGIpO3ZhciBxPWIubm9kZVNwYWNpbmcscj1tdChiKSx1PW18fG4/MDpyLzIseD1iLnJvd1NwYWNpbmcsdj0wO2lmKG18fG58fGIudG18fGIudW0mJjE9PT1iLm1heEdlbmVyYXRpb25Db3VudCl2PU1hdGgubWF4KDAsYi5yb3dJbmRlbnQpO209Yi53aWR0aDt2YXIgeT1iLmhlaWdodCx6PTAsQj0wLEM9MCxJPTAsSj0wLEw9MCxVPTAsUT0wLGlhPTA7aCYmIWV0KGwpJiYxMzU8ZCYmZS5yZXZlcnNlKCk7aWYoZXQobCkpaWYoMTxnKWZvcih2YXIgamE9MDtqYTxnO2phKyspe3ZhciBNPWVbamFdLFI9TS51YTswPT09amElMiYmamEhPT1nLTEmJihpYT1NYXRoLm1heChpYSwoYz9SLndpZHRoOlIuaGVpZ2h0KStGdChNKS1xKSk7fWVsc2UgMT09PWcmJihpYT1jP2VbMF0udWEud2lkdGg6ZVswXS51YS5oZWlnaHQpO2lmKGgpc3dpdGNoKGwpe2Nhc2UgYnQ6Y2FzZSBTczpCPTEzNT5kP3J0KGIsZSxpYSx6LEIpOnN0KGIsZSxpYSx6LEIpO2lhPUIueDt6PUIud2lkdGg7Qj1CLmhlaWdodDticmVhaztjYXNlIGN0OmZvcihhPTA7YTxnO2ErKyl7cD1lW2FdLHU9cC51YSxDPTA9PT1VPzA6eCxjPyhwLlQuaChmLXUud2lkdGgsSitDKSx6PU1hdGgubWF4KHosdS53aWR0aCksQj1NYXRoLm1heChCLEorQyt1LmhlaWdodCksSis9Qyt1LmhlaWdodCk6KHAuVC5oKEkrQyxmLXUuaGVpZ2h0KSx6PU1hdGgubWF4KHosSStDK3Uud2lkdGgpLEI9TWF0aC5tYXgoQix1LmhlaWdodCksSSs9Qyt1LndpZHRoKSxVKys7fWJyZWFrO2Nhc2UgZHQ6Zm9yKGY9MDtmPGc7ZisrKXthPWVbZl0scD1hLnVhLHU9MD09PVU/MDp4LGM/KGEuVC5oKHEvMitiLmZvY3VzLngsSit1KSx6PU1hdGgubWF4KHoscC53aWR0aCksQj1NYXRoLm1heChCLEordStwLmhlaWdodCksSis9dStwLmhlaWdodCk6KGEuVC5oKEkrdSxxLzIrYi5mb2N1cy55KSx6PU1hdGgubWF4KHosSSt1K3Aud2lkdGgpLEI9TWF0aC5tYXgoQixwLmhlaWdodCksSSs9dStwLndpZHRoKSxVKys7fX1lbHNlIGZvcihqYT0wO2phPGc7amErKyl7TT1lW2phXTtSPU0udWE7aWYoYyl7MDxwJiYwPFUmJkkrcStSLndpZHRoPnAmJihJPGYmJnV0KGIsbCxmLUksMCxRLGphLTEpLEwrKyxVPTAsUT1qYSxDPUIsST0wLEo9MTM1PGQ/LUIteDpCK3gpO3ZhciBBYT0wPT09VT91OnE7dnQoYSxNLDAsSik7TS5ULmgoSStBYSxKKTt6PU1hdGgubWF4KHosSStBYStSLndpZHRoKTtCPU1hdGgubWF4KEIsQysoMD09PUw/MDp4KStSLmhlaWdodCk7SSs9QWErUi53aWR0aDt9ZWxzZSAwPHAmJjA8VSYmSitxK1IuaGVpZ2h0PnAmJihKPGYmJnV0KGIsbCwwLGYtSixRLGphLTEpLEwrKyxVPTAsUT1qYSxDPXosSj0wLEk9MTM1PGQ/LXoteDp6K3gpLEFhPTA9PT1VP3U6cSx2dChhLE0sSSwwKSxNLlQuaChJLEorQWEpLEI9TWF0aC5tYXgoQixKK0FhK1IuaGVpZ2h0KSx6PU1hdGgubWF4KHosQysoMD09PUw/MDp4KStSLndpZHRoKSxKKz1BYStSLmhlaWdodDtVKys7fTA8TCYmKGM/KEIrPU1hdGgubWF4KDAsayksSTx6JiZ1dChiLGwsei1JLDAsUSxnLTEpLDA8diYmKG58fHh0KGIsdiwwLDAsZy0xKSx6Kz12KSk6KHorPU1hdGgubWF4KDAsayksSjxCJiZ1dChiLGwsMCxCLUosUSxnLTEpLDA8diYmKG58fHh0KGIsMCx2LDAsZy0xKSxCKz12KSkpO3Y9bj0wO3N3aXRjaChsKXtjYXNlIHp0OmM/bis9ei8yLWIuZm9jdXMueC1yLzI6dis9Qi8yLWIuZm9jdXMueS1yLzI7YnJlYWs7Y2FzZSBBdDowPEw/Yz9uKz16LzItYi5mb2N1cy54LXIvMjp2Kz1CLzItYi5mb2N1cy55LXIvMjpjPyhsPWVbMF0uVC54K2VbMF0uaWEueCxuKz1sKyhlW2ctMV0uVC54K2VbZy0xXS5pYS54KzIqZVtnLTFdLmZvY3VzLngtbCkvMi1iLmZvY3VzLngtci8yKToobD1lWzBdLlQueStlWzBdLmlhLnksdis9bCsoZVtnLTFdLlQueStlW2ctMV0uaWEueSsyKmVbZy0xXS5mb2N1cy55LWwpLzItYi5mb2N1cy55LXIvMik7YnJlYWs7Y2FzZSBxdDpjPyhuLT1yLHorPXIpOih2LT1yLEIrPXIpO2JyZWFrO2Nhc2Uga3Q6Yz8obis9ei1iLndpZHRoK3Iseis9cik6KHYrPUItYi5oZWlnaHQrcixCKz1yKTticmVhaztjYXNlIGJ0OmNhc2UgU3M6Yz8xPGc/bis9aWErcS8yLWIuZm9jdXMueDpuKz1lWzBdLmZvY3VzLngtYi5mb2N1cy54K2VbMF0uaWEueDoxPGc/dis9aWErcS8yLWIuZm9jdXMueTp2Kz1lWzBdLmZvY3VzLnktYi5mb2N1cy55K2VbMF0uaWEueTticmVhaztjYXNlIGN0OmM/bis9eitxLzItYi5mb2N1cy54OnYrPUIrcS8yLWIuZm9jdXMueTticmVhaztjYXNlIGR0OmJyZWFrO2RlZmF1bHQ6QSgiVW5oYW5kbGVkIGFsaWdubWVudCB2YWx1ZSAiK2wudG9TdHJpbmcoKSk7fWZvcihyPTA7cjxnO3IrKyl7bD1lW3JdLGM/bC5ULmgobC5ULngrbC5pYS54LW4sbC5ULnkrKDEzNTxkPyhoPy1COi1sLnVhLmhlaWdodCkrbC5pYS55LWs6eStrK2wuaWEueSkpOmwuVC5oKGwuVC54KygxMzU8ZD8oaD8tejotbC51YS53aWR0aCkrbC5pYS54LWs6bStrK2wuaWEueCksbC5ULnkrbC5pYS55LXYpO31jPyh6PUJ0KGIseixuKSwwPm4mJihuPTApLDEzNTxkJiYodis9QitrKSxCKz15K2spOigxMzU8ZCYmKG4rPXoraykseis9bStrLEI9Q3QoYixCLHYpLDA+diYmKHY9MCkpO2IuaWEuaChuLHYpO2IudWEuaCh6LEIpO319ZnVuY3Rpb24gcnQoYSxiLGMsZCxlKXt2YXIgZj1iLmxlbmd0aDtpZigwPT09ZilyZXR1cm4gbmV3IE4oYywwLGQsZSk7aWYoMT09PWYpcmV0dXJuIGE9YlswXSxkPWEudWEud2lkdGgsZT1hLnVhLmhlaWdodCxuZXcgTihjLDAsZCxlKTtmb3IodmFyIGc9YS5ub2RlU3BhY2luZyxoPWEucm93U3BhY2luZyxrPTkwPT09anQoYSksbD0wLG09MCxuPTAscD0wO3A8ZjtwKyspe2lmKCEoMCE9PXAlMnx8MTxmJiZwPT09Zi0xKSl7dmFyIHE9YltwXSxyPXEudWEsdT0wPT09bD8wOmg7aWYoayl7dmFyIHg9RnQocSktZztxLlQuaChjLShyLndpZHRoK3gpLG4rdSk7ZD1NYXRoLm1heChkLHIud2lkdGgreCk7ZT1NYXRoLm1heChlLG4rdStyLmhlaWdodCk7bis9dStyLmhlaWdodDt9ZWxzZSB4PUZ0KHEpLWcscS5ULmgobSt1LGMtKHIuaGVpZ2h0K3gpKSxlPU1hdGgubWF4KGUsci5oZWlnaHQreCksZD1NYXRoLm1heChkLG0rdStyLndpZHRoKSxtKz11K3Iud2lkdGg7bCsrO319bD0wO3E9bTtwPW47az8obT1jK2csbj0wKToobT0wLG49YytnKTtmb3Iocj0wO3I8ZjtyKyspe2lmKDAhPT1yJTIpe3U9YltyXTt4PXUudWE7dmFyIHY9MD09PWw/MDpoO2lmKGspe3ZhciB5PUZ0KHUpLWc7dS5ULmgobSt5LG4rdik7ZD1NYXRoLm1heChkLG0reC53aWR0aCt5KTtlPU1hdGgubWF4KGUsbit2K3guaGVpZ2h0KTtuKz12K3guaGVpZ2h0O31lbHNlIHk9RnQodSktZyx1LlQuaChtK3Ysbit5KSxkPU1hdGgubWF4KGQsbSt2K3gud2lkdGgpLGU9TWF0aC5tYXgoZSxuK3guaGVpZ2h0K3kpLG0rPXYreC53aWR0aDtsKys7fX0xPGYmJjE9PT1mJTImJihiPWJbZi0xXSxmPWIudWEsaD1udWxsPT09Yi5wYXJlbnQ/MDpiLnBhcmVudC5yb3dTcGFjaW5nLGs/KGIuVC5oKGMrZy8yLWIuZm9jdXMueC1iLmlhLngsZStoKSxrPWMrZy8yLWIuZm9jdXMueC1iLmlhLngsZD1NYXRoLm1heChkLGsrZi53aWR0aCksMD5rJiYoZC09ayksZT1NYXRoLm1heChlLE1hdGgubWF4KHAsbikraCtmLmhlaWdodCksMD5iLlQueCYmKGM9R3QoYSxiLlQueCwhMSxjLGcpKSk6KGIuVC5oKGQraCxjK2cvMi1iLmZvY3VzLnktYi5pYS55KSxkPU1hdGgubWF4KGQsTWF0aC5tYXgocSxtKStoK2Yud2lkdGgpLG49YytnLzItYi5mb2N1cy55LWIuaWEueSxlPU1hdGgubWF4KGUsbitmLmhlaWdodCksMD5uJiYoZS09biksMD5iLlQueSYmKGM9R3QoYSxiLlQueSwhMCxjLGcpKSkpO3JldHVybiBuZXcgTihjLDAsZCxlKTt9ZnVuY3Rpb24gc3QoYSxiLGMsZCxlKXt2YXIgZj1iLmxlbmd0aDtpZigwPT09ZilyZXR1cm4gbmV3IE4oYywwLGQsZSk7aWYoMT09PWYpcmV0dXJuIGI9YlswXSxkPWIudWEud2lkdGgsZT1iLnVhLmhlaWdodCxuZXcgTihjLDAsZCxlKTtmb3IodmFyIGc9YS5ub2RlU3BhY2luZyxoPWEucm93U3BhY2luZyxrPTI3MD09PWp0KGEpLGw9MCxtPTAsbj0wLHA9MDtwPGY7cCsrKXtpZighKDAhPT1wJTJ8fDE8ZiYmcD09PWYtMSkpe3ZhciBxPWJbcF0scj1xLnVhLHU9MD09PWw/MDpoO2lmKGspe3ZhciB4PUZ0KHEpLWc7bi09dStyLmhlaWdodDtxLlQuaChjLShyLndpZHRoK3gpLG4pO2Q9TWF0aC5tYXgoZCxyLndpZHRoK3gpO2U9TWF0aC5tYXgoZSxNYXRoLmFicyhuKSk7fWVsc2UgeD1GdChxKS1nLG0tPXUrci53aWR0aCxxLlQuaChtLGMtKHIuaGVpZ2h0K3gpKSxlPU1hdGgubWF4KGUsci5oZWlnaHQreCksZD1NYXRoLm1heChkLE1hdGguYWJzKG0pKTtsKys7fX1sPTA7cT1tO3A9bjtrPyhtPWMrZyxuPTApOihtPTAsbj1jK2cpO2ZvcihyPTA7cjxmO3IrKyl7aWYoMCE9PXIlMil7dT1iW3JdO3g9dS51YTt2YXIgdj0wPT09bD8wOmg7aWYoayl7dmFyIHk9RnQodSktZztuLT12K3guaGVpZ2h0O3UuVC5oKG0reSxuKTtkPU1hdGgubWF4KGQsbSt4LndpZHRoK3kpO2U9TWF0aC5tYXgoZSxNYXRoLmFicyhuKSk7fWVsc2UgeT1GdCh1KS1nLG0tPXYreC53aWR0aCx1LlQuaChtLG4reSksZT1NYXRoLm1heChlLG4reC5oZWlnaHQreSksZD1NYXRoLm1heChkLE1hdGguYWJzKG0pKTtsKys7fX0xPGYmJjE9PT1mJTImJihoPWJbZi0xXSxsPWgudWEscj1udWxsPT09aC5wYXJlbnQ/MDpoLnBhcmVudC5yb3dTcGFjaW5nLGs/KGguVC5oKGMrZy8yLWguZm9jdXMueC1oLmlhLngsLWUtbC5oZWlnaHQtciksbT1jK2cvMi1oLmZvY3VzLngtaC5pYS54LGQ9TWF0aC5tYXgoZCxtK2wud2lkdGgpLDA+bSYmKGQtPW0pLGU9TWF0aC5tYXgoZSxNYXRoLmFicyhNYXRoLm1pbihwLG4pKStyK2wuaGVpZ2h0KSwwPmguVC54JiYoYz1HdChhLGguVC54LCExLGMsZykpKTooaC5ULmgoLWQtbC53aWR0aC1yLGMrZy8yLWguZm9jdXMueS1oLmlhLnkpLGQ9TWF0aC5tYXgoZCxNYXRoLmFicyhNYXRoLm1pbihxLG0pKStyK2wud2lkdGgpLG49YytnLzItaC5mb2N1cy55LWguaWEueSxlPU1hdGgubWF4KGUsbitsLmhlaWdodCksMD5uJiYoZS09biksMD5oLlQueSYmKGM9R3QoYSxoLlQueSwhMCxjLGcpKSkpO2ZvcihhPTA7YTxmO2ErKyl7Zz1iW2FdLGs/Zy5ULmgoZy5ULngsZy5ULnkrZSk6Zy5ULmgoZy5ULngrZCxnLlQueSk7fXJldHVybiBuZXcgTihjLDAsZCxlKTt9ZnVuY3Rpb24gRnQoYSl7cmV0dXJuIG51bGw9PT1hLnBhcmVudD8wOmEucGFyZW50Lm5vZGVTcGFjaW5nO31mdW5jdGlvbiBHdChhLGIsYyxkLGUpe2E9YS5jaGlsZHJlbjtmb3IodmFyIGY9YS5sZW5ndGgsZz0wO2c8ZjtnKyspe2M/YVtnXS5ULmgoYVtnXS5ULngsYVtnXS5ULnktYik6YVtnXS5ULmgoYVtnXS5ULngtYixhW2ddLlQueSk7fWI9YVtmLTFdO3JldHVybiBNYXRoLm1heChkLGM/Yi5pYS55K2IuZm9jdXMueS1lLzI6Yi5pYS54K2IuZm9jdXMueC1lLzIpO31mdW5jdGlvbiBCdChhLGIsYyl7c3dpdGNoKGEuYWxpZ25tZW50KXtjYXNlIEF0OmNhc2UgenQ6cmV0dXJuIGMrYS53aWR0aD5iJiYoYj1jK2Eud2lkdGgpLDA+YyYmKGItPWMpLGI7Y2FzZSBxdDpyZXR1cm4gYS53aWR0aD5iP2Eud2lkdGg6YjtjYXNlIGt0OnJldHVybiAyKmEuZm9jdXMueD5iP2Eud2lkdGg6YithLndpZHRoLTIqYS5mb2N1cy54O2Nhc2UgYnQ6Y2FzZSBTczpyZXR1cm4gTWF0aC5tYXgoYS53aWR0aCxNYXRoLm1heChiLGMrYS53aWR0aCktTWF0aC5taW4oMCxjKSk7Y2FzZSBjdDpyZXR1cm4gYS53aWR0aC1hLmZvY3VzLngrYS5ub2RlU3BhY2luZy8yK2I7Y2FzZSBkdDpyZXR1cm4gTWF0aC5tYXgoYS53aWR0aCxhLmZvY3VzLngrYS5ub2RlU3BhY2luZy8yK2IpO2RlZmF1bHQ6cmV0dXJuIGI7fX1mdW5jdGlvbiBDdChhLGIsYyl7c3dpdGNoKGEuYWxpZ25tZW50KXtjYXNlIEF0OmNhc2UgenQ6cmV0dXJuIGMrYS5oZWlnaHQ+YiYmKGI9YythLmhlaWdodCksMD5jJiYoYi09YyksYjtjYXNlIHF0OnJldHVybiBhLmhlaWdodD5iP2EuaGVpZ2h0OmI7Y2FzZSBrdDpyZXR1cm4gMiphLmZvY3VzLnk+Yj9hLmhlaWdodDpiK2EuaGVpZ2h0LTIqYS5mb2N1cy55O2Nhc2UgYnQ6Y2FzZSBTczpyZXR1cm4gTWF0aC5tYXgoYS5oZWlnaHQsTWF0aC5tYXgoYixjK2EuaGVpZ2h0KS1NYXRoLm1pbigwLGMpKTtjYXNlIGN0OnJldHVybiBhLmhlaWdodC1hLmZvY3VzLnkrYS5ub2RlU3BhY2luZy8yK2I7Y2FzZSBkdDpyZXR1cm4gTWF0aC5tYXgoYS5oZWlnaHQsYS5mb2N1cy55K2Eubm9kZVNwYWNpbmcvMitiKTtkZWZhdWx0OnJldHVybiBiO319ZnVuY3Rpb24gRHQoYSxiLGMpe3N3aXRjaChhKXtjYXNlIHp0OmIvPTI7Yy89MjticmVhaztjYXNlIEF0OmIvPTI7Yy89MjticmVhaztjYXNlIHF0OmM9Yj0wO2JyZWFrO2Nhc2Uga3Q6YnJlYWs7ZGVmYXVsdDpBKCJVbmhhbmRsZWQgYWxpZ25tZW50IHZhbHVlICIrYS50b1N0cmluZygpKTt9cmV0dXJuIG5ldyBHKGIsYyk7fWZ1bmN0aW9uIHV0KGEsYixjLGQsZSxmKXtiPUR0KGIsYyxkKTt4dChhLGIueCxiLnksZSxmKTt9ZnVuY3Rpb24geHQoYSxiLGMsZCxlKXtpZigwIT09Ynx8MCE9PWMpZm9yKGE9YS5jaGlsZHJlbjtkPD1lO2QrKyl7dmFyIGY9YVtkXS5UO2YueCs9YjtmLnkrPWM7fX1mdW5jdGlvbiB2dChhLGIsYyxkKXt2YXIgZT1iLnBhcmVudDtzd2l0Y2goYS5aYyl7Y2FzZSBCczpmb3IoYT1iLnNvdXJjZUVkZ2VzO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGIuZnJvbVZlcnRleD09PWUmJmIucmVsYXRpdmVQb2ludC5oKGMsZCk7fWJyZWFrO2Nhc2UgSXM6Zm9yKGE9Yi5kZXN0aW5hdGlvbkVkZ2VzO2EubmV4dCgpOyl7Yj1hLnZhbHVlLGIudG9WZXJ0ZXg9PT1lJiZiLnJlbGF0aXZlUG9pbnQuaChjLGQpO31icmVhaztkZWZhdWx0OkEoIlVuaGFuZGxlZCBwYXRoIHZhbHVlICIrYS5aYy50b1N0cmluZygpKTt9fWZ1bmN0aW9uIHl0KGEsYixjKXtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTtlLngrPWI7ZS55Kz1jO319ZnVuY3Rpb24gd3QoYSxiLGMsZCxlLGYsZyxoKXt2YXIgaz1qdChiKSxsPTkwPT09a3x8MjcwPT09ayxtPWIubm9kZVNwYWNpbmc7Yj1kO3ZhciBuPWU7ZD1mO3ZhciBwPWcscT1jLmJxLHI9Yy5vcTtnPWMudWE7dmFyIHU9bD9NYXRoLm1heChwLGcuaGVpZ2h0KTpNYXRoLm1heChkLGcud2lkdGgpO2lmKG51bGw9PT1xfHxrIT09anQoYykpcT10dChhLDIpLHI9dHQoYSwyKSxsPyhxWzBdLmgoMCwwKSxxWzFdLmgoMCxnLmhlaWdodCksclswXS5oKGcud2lkdGgsMCksclsxXS5oKHJbMF0ueCxxWzFdLnkpKToocVswXS5oKDAsMCkscVsxXS5oKGcud2lkdGgsMCksclswXS5oKDAsZy5oZWlnaHQpLHJbMV0uaChxWzFdLngsclswXS55KSk7aWYobCl7cD05OTk5OTk5O2lmKCEobnVsbD09PW58fDI+bi5sZW5ndGh8fG51bGw9PT1xfHwyPnEubGVuZ3RoKSlmb3IoZT1jPTA7YzxuLmxlbmd0aCYmZTxxLmxlbmd0aDspe2Y9bltjXTt2YXIgeD1xW2VdO2s9eC54O2w9eC55O2srPWQ7dmFyIHY9ZjtjKzE8bi5sZW5ndGgmJih2PW5bYysxXSk7dmFyIHk9eDt4PXkueDt5PXkueTtlKzE8cS5sZW5ndGgmJih5PXFbZSsxXSx4PXkueCx5PXkueSx4Kz1kKTt2YXIgej1wO2YueT09PWw/ej1rLWYueDpmLnk+bCYmZi55PHk/ej1rKyhmLnktbCkvKHktbCkqKHgtayktZi54Omw+Zi55JiZsPHYueSYmKHo9ay0oZi54KyhsLWYueSkvKHYueS1mLnkpKih2LngtZi54KSkpO3o8cCYmKHA9eik7di55PD1mLnk/YysrOnk8PWw/ZSsrOih2Lnk8PXkmJmMrKyx5PD12LnkmJmUrKyk7fXA9ZC1wO3ArPW07Yz1xO2U9cDtpZihudWxsPT09Ynx8Mj5iLmxlbmd0aHx8bnVsbD09PWN8fDI+Yy5sZW5ndGgpZD1udWxsO2Vsc2V7bT10dChhLGIubGVuZ3RoK2MubGVuZ3RoKTtmb3IoZD1mPWs9MDtmPGMubGVuZ3RoJiZjW2ZdLnk8YlswXS55Oyl7bD1jW2YrK10sbVtkKytdLmgobC54K2UsbC55KTt9Zm9yKDtrPGIubGVuZ3RoOyl7bD1iW2srK10sbVtkKytdLmgobC54LGwueSk7fWZvcihrPWJbYi5sZW5ndGgtMV0ueTtmPGMubGVuZ3RoJiZjW2ZdLnk8PWs7KXtmKys7fWZvcig7ZjxjLmxlbmd0aCYmY1tmXS55Pms7KXtsPWNbZisrXSxtW2QrK10uaChsLngrZSxsLnkpO31jPXR0KGEsZCk7Zm9yKGs9MDtrPGQ7aysrKXtjW2tdLmFzc2lnbihtW2tdKTt9RXQoYSxtKTtkPWM7fWY9cjtrPXA7aWYobnVsbD09PW58fDI+bi5sZW5ndGh8fG51bGw9PT1mfHwyPmYubGVuZ3RoKWU9bnVsbDtlbHNle209dHQoYSxuLmxlbmd0aCtmLmxlbmd0aCk7Zm9yKGU9bD1jPTA7YzxuLmxlbmd0aCYmbltjXS55PGZbMF0ueTspe3Y9bltjKytdLG1bZSsrXS5oKHYueCx2LnkpO31mb3IoO2w8Zi5sZW5ndGg7KXt2PWZbbCsrXSxtW2UrK10uaCh2Lngrayx2LnkpO31mb3IoZj1mW2YubGVuZ3RoLTFdLnk7YzxuLmxlbmd0aCYmbltjXS55PD1mOyl7YysrO31mb3IoO2M8bi5sZW5ndGgmJm5bY10ueT5mOyl7az1uW2MrK10sbVtlKytdLmgoay54LGsueSk7fWY9dHQoYSxlKTtmb3IoYz0wO2M8ZTtjKyspe2ZbY10uYXNzaWduKG1bY10pO31FdChhLG0pO2U9Zjt9Zj1NYXRoLm1heCgwLHApK2cud2lkdGg7Zz11O0V0KGEsYik7RXQoYSxxKTtFdChhLG4pO0V0KGEscik7aFswXT1kO2hbMV09ZTtyZXR1cm4gbmV3IE4ocCwwLGYsZyk7fWQ9OTk5OTk5OTtpZighKG51bGw9PT1ufHwyPm4ubGVuZ3RofHxudWxsPT09cXx8Mj5xLmxlbmd0aCkpZm9yKGU9Yz0wO2M8bi5sZW5ndGgmJmU8cS5sZW5ndGg7KXtmPW5bY10seD1xW2VdLGs9eC54LGw9eC55LGwrPXAsdj1mLGMrMTxuLmxlbmd0aCYmKHY9bltjKzFdKSx5PXgseD15LngseT15LnksZSsxPHEubGVuZ3RoJiYoeT1xW2UrMV0seD15LngseT15LnkseSs9cCksej1kLGYueD09PWs/ej1sLWYueTpmLng+ayYmZi54PHg/ej1sKyhmLngtaykvKHgtaykqKHktbCktZi55Oms+Zi54JiZrPHYueCYmKHo9bC0oZi55KyhrLWYueCkvKHYueC1mLngpKih2LnktZi55KSkpLHo8ZCYmKGQ9eiksdi54PD1mLng/YysrOng8PWs/ZSsrOih2Lng8PXgmJmMrKyx4PD12LngmJmUrKyk7fXAtPWQ7cCs9bTtjPXE7ZT1wO2lmKG51bGw9PT1ifHwyPmIubGVuZ3RofHxudWxsPT09Y3x8Mj5jLmxlbmd0aClkPW51bGw7ZWxzZXttPXR0KGEsYi5sZW5ndGgrYy5sZW5ndGgpO2ZvcihkPWY9az0wO2Y8Yy5sZW5ndGgmJmNbZl0ueDxiWzBdLng7KXtsPWNbZisrXSxtW2QrK10uaChsLngsbC55K2UpO31mb3IoO2s8Yi5sZW5ndGg7KXtsPWJbaysrXSxtW2QrK10uaChsLngsbC55KTt9Zm9yKGs9YltiLmxlbmd0aC0xXS54O2Y8Yy5sZW5ndGgmJmNbZl0ueDw9azspe2YrKzt9Zm9yKDtmPGMubGVuZ3RoJiZjW2ZdLng+azspe2w9Y1tmKytdLG1bZCsrXS5oKGwueCxsLnkrZSk7fWM9dHQoYSxkKTtmb3Ioaz0wO2s8ZDtrKyspe2Nba10uYXNzaWduKG1ba10pO31FdChhLG0pO2Q9Yzt9Zj1yO2s9cDtpZihudWxsPT09bnx8Mj5uLmxlbmd0aHx8bnVsbD09PWZ8fDI+Zi5sZW5ndGgpZT1udWxsO2Vsc2V7bT10dChhLG4ubGVuZ3RoK2YubGVuZ3RoKTtmb3IoZT1sPWM9MDtjPG4ubGVuZ3RoJiZuW2NdLng8ZlswXS54Oyl7dj1uW2MrK10sbVtlKytdLmgodi54LHYueSk7fWZvcig7bDxmLmxlbmd0aDspe3Y9ZltsKytdLG1bZSsrXS5oKHYueCx2Lnkrayk7fWZvcihmPWZbZi5sZW5ndGgtMV0ueDtjPG4ubGVuZ3RoJiZuW2NdLng8PWY7KXtjKys7fWZvcig7YzxuLmxlbmd0aCYmbltjXS54PmY7KXtrPW5bYysrXSxtW2UrK10uaChrLngsay55KTt9Zj10dChhLGUpO2ZvcihjPTA7YzxlO2MrKyl7ZltjXS5hc3NpZ24obVtjXSk7fUV0KGEsbSk7ZT1mO31mPXU7Zz1NYXRoLm1heCgwLHApK2cuaGVpZ2h0O0V0KGEsYik7RXQoYSxxKTtFdChhLG4pO0V0KGEscik7aFswXT1kO2hbMV09ZTtyZXR1cm4gbmV3IE4ocCwwLGYsZyk7fWZ1bmN0aW9uIHR0KGEsYil7YT1hLnh1W2JdO2lmKHZvaWQgMCE9PWEmJihhPWEucG9wKCksdm9pZCAwIT09YSkpcmV0dXJuIGE7YT1bXTtmb3IodmFyIGM9MDtjPGI7YysrKXthW2NdPW5ldyBHKCk7fXJldHVybiBhO31mdW5jdGlvbiBFdChhLGIpe3ZhciBjPWIubGVuZ3RoLGQ9YS54dVtjXTt2b2lkIDA9PT1kJiYoZD1bXSxhLnh1W2NdPWQpO2QucHVzaChiKTt9enMucHJvdG90eXBlLmFycmFuZ2VUcmVlcz1mdW5jdGlvbigpe2lmKHRoaXMuQWI9PT1Icylmb3IodmFyIGE9dGhpcy5GYi5pdGVyYXRvcjthLm5leHQoKTspe3ZhciBiPWEudmFsdWU7aWYoYiBpbnN0YW5jZW9mIEdzKXt2YXIgYz1iLm5vZGU7aWYobnVsbCE9PWMpe3ZhciBkPWMucG9zaXRpb247Yz1kLng7ZD1kLnk7aXNGaW5pdGUoYyl8fChjPTApO2lzRmluaXRlKGQpfHwoZD0wKTtIdCh0aGlzLGIsYyxkKTt9fX1lbHNle2E9W107Zm9yKGI9dGhpcy5GYi5pdGVyYXRvcjtiLm5leHQoKTspe2M9Yi52YWx1ZSxjIGluc3RhbmNlb2YgR3MmJmEucHVzaChjKTt9c3dpdGNoKHRoaXMuc29ydGluZyl7Y2FzZSBYczpicmVhaztjYXNlIFlzOmEucmV2ZXJzZSgpO2JyZWFrO2Nhc2UgWnM6YS5zb3J0KHRoaXMuY29tcGFyZXIpO2JyZWFrO2Nhc2UgJHM6YS5zb3J0KHRoaXMuY29tcGFyZXIpO2EucmV2ZXJzZSgpO2JyZWFrO2RlZmF1bHQ6QSgiVW5oYW5kbGVkIHNvcnRpbmcgdmFsdWUgIit0aGlzLnNvcnRpbmcudG9TdHJpbmcoKSk7fWM9dGhpcy5hcnJhbmdlbWVudE9yaWdpbjtiPWMueDtjPWMueTtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO0h0KHRoaXMsZSxiK2UuaWEueCxjK2UuaWEueSk7c3dpdGNoKHRoaXMuQWIpe2Nhc2UgRXM6Yys9ZS51YS5oZWlnaHQrdGhpcy53ZC5oZWlnaHQ7YnJlYWs7Y2FzZSBJdDpiKz1lLnVhLndpZHRoK3RoaXMud2Qud2lkdGg7YnJlYWs7ZGVmYXVsdDpBKCJVbmhhbmRsZWQgYXJyYW5nZW1lbnQgdmFsdWUgIit0aGlzLkFiLnRvU3RyaW5nKCkpO319fX07ZnVuY3Rpb24gSHQoYSxiLGMsZCl7aWYobnVsbCE9PWIpe2IueD1jO2IueT1kO2I9Yi5jaGlsZHJlbjtmb3IodmFyIGU9Yi5sZW5ndGgsZj0wO2Y8ZTtmKyspe3ZhciBnPWJbZl07SHQoYSxnLGMrZy5ULngsZCtnLlQueSk7fX19enMucHJvdG90eXBlLmNvbW1pdExheW91dD1mdW5jdGlvbigpe3RoaXMuSnYoKTt0aGlzLmNvbW1pdE5vZGVzKCk7dGhpcy5NdSgpO3RoaXMuaXNSb3V0aW5nJiZ0aGlzLmNvbW1pdExpbmtzKCk7fTt6cy5wcm90b3R5cGUuY29tbWl0Tm9kZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2EubmV4dCgpOyl7YS52YWx1ZS5jb21taXQoKTt9Zm9yKGEucmVzZXQoKTthLm5leHQoKTspe3RoaXMubGF5b3V0Q29tbWVudHMoYS52YWx1ZSk7fX07enMucHJvdG90eXBlLk11PWZ1bmN0aW9uKCl7aWYodGhpcy5sYXllclN0eWxlPT09UHMpe2Zvcih2YXIgYT10aGlzLml3LGI9W10sYz1udWxsLGQ9dGhpcy5uZXR3b3JrLnZlcnRleGVzLml0ZXJhdG9yO2QubmV4dCgpOyl7dmFyIGU9ZC52YWx1ZTtudWxsPT09Yz9jPWUuYm91bmRzLmNvcHkoKTpjLkpjKGUuYm91bmRzKTt2YXIgZj1iW2UubGV2ZWxdO3ZvaWQgMD09PWY/Zj1sdChlKTpmPU1hdGgubWF4KGYsbHQoZSkpO2JbZS5sZXZlbF09Zjt9Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyl7dm9pZCAwPT09YltkXSYmKGJbZF09MCk7fTkwPT09dGhpcy5hbmdsZXx8MjcwPT09dGhpcy5hbmdsZT8oYy5VYyh0aGlzLm5vZGVTcGFjaW5nLzIsdGhpcy5sYXllclNwYWNpbmcpLGQ9bmV3IEcoLXRoaXMubm9kZVNwYWNpbmcvMiwtdGhpcy5sYXllclNwYWNpbmcvMikpOihjLlVjKHRoaXMubGF5ZXJTcGFjaW5nLHRoaXMubm9kZVNwYWNpbmcvMiksZD1uZXcgRygtdGhpcy5sYXllclNwYWNpbmcvMiwtdGhpcy5ub2RlU3BhY2luZy8yKSk7ZT1bXTtjPTkwPT09dGhpcy5hbmdsZXx8MjcwPT09dGhpcy5hbmdsZT9jLndpZHRoOmMuaGVpZ2h0O2Y9MDtpZigxODA9PT10aGlzLmFuZ2xlfHwyNzA9PT10aGlzLmFuZ2xlKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXtmKz1hW2ddK2JbZ107fWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspe3ZhciBoPWFbZ10rYltnXTsyNzA9PT10aGlzLmFuZ2xlPyhmLT1oLGUucHVzaChuZXcgTigwLGYsYyxoKSkpOjkwPT09dGhpcy5hbmdsZT8oZS5wdXNoKG5ldyBOKDAsZixjLGgpKSxmKz1oKToxODA9PT10aGlzLmFuZ2xlPyhmLT1oLGUucHVzaChuZXcgTihmLDAsaCxjKSkpOihlLnB1c2gobmV3IE4oZiwwLGgsYykpLGYrPWgpO310aGlzLmNvbW1pdExheWVycyhlLGQpO319O3pzLnByb3RvdHlwZS5jb21taXRMYXllcnM9ZnVuY3Rpb24oKXt9O3pzLnByb3RvdHlwZS5jb21taXRMaW5rcz1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm5ldHdvcmsuZWRnZXMuaXRlcmF0b3I7YS5uZXh0KCk7KXthLnZhbHVlLmNvbW1pdCgpO319O3pzLnByb3RvdHlwZS5Kdj1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkZiLml0ZXJhdG9yO2EubmV4dCgpOyl7dmFyIGI9YS52YWx1ZTtiIGluc3RhbmNlb2YgR3MmJkp0KHRoaXMsYik7fX07ZnVuY3Rpb24gSnQoYSxiKXtpZihudWxsIT09Yil7YS5zZXRQb3J0U3BvdHMoYik7Yj1iLmNoaWxkcmVuO2Zvcih2YXIgYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7SnQoYSxiW2RdKTt9fX16cy5wcm90b3R5cGUuc2V0UG9ydFNwb3RzPWZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpZ25tZW50O2lmKGF0KGIpKXt2YXIgYz10aGlzLlpjPT09QnMsZD1qdChhKTtzd2l0Y2goZCl7Y2FzZSAwOnZhciBlPVNkO2JyZWFrO2Nhc2UgOTA6ZT1UZDticmVhaztjYXNlIDE4MDplPUtkO2JyZWFrO2RlZmF1bHQ6ZT1KZDt9dmFyIGY9YS5jaGlsZHJlbixnPWYubGVuZ3RoO3N3aXRjaChiKXtjYXNlIGJ0OmNhc2UgU3M6Zm9yKGI9MDtiPGc7YisrKXt2YXIgaD1mW2JdO2g9KGM/aC5zb3VyY2VFZGdlczpoLmRlc3RpbmF0aW9uRWRnZXMpLmZpcnN0KCk7aWYobnVsbCE9PWgmJihoPWgubGluayxudWxsIT09aCkpe3ZhciBrPTkwPT09ZHx8MjcwPT09ZD9LZDpKZDtpZigxPT09Z3x8Yj09PWctMSYmMT09PWclMilzd2l0Y2goZCl7Y2FzZSAwOms9S2Q7YnJlYWs7Y2FzZSA5MDprPUpkO2JyZWFrO2Nhc2UgMTgwOms9U2Q7YnJlYWs7ZGVmYXVsdDprPVRkO31lbHNlIDA9PT1iJTImJihrPTkwPT09ZHx8MjcwPT09ZD9TZDpUZCk7Yz8oYS5zZXRzUG9ydFNwb3QmJihoLmZyb21TcG90PWUpLGEuc2V0c0NoaWxkUG9ydFNwb3QmJihoLnRvU3BvdD1rKSk6KGEuc2V0c1BvcnRTcG90JiYoaC5mcm9tU3BvdD1rKSxhLnNldHNDaGlsZFBvcnRTcG90JiYoaC50b1Nwb3Q9ZSkpO319YnJlYWs7Y2FzZSBjdDpkPTkwPT09ZHx8MjcwPT09ZD9TZDpUZDtmb3IoZj1jP2EuZGVzdGluYXRpb25FZGdlczphLnNvdXJjZUVkZ2VzO2YubmV4dCgpOyl7Zz1mLnZhbHVlLmxpbmssbnVsbCE9PWcmJihjPyhhLnNldHNQb3J0U3BvdCYmKGcuZnJvbVNwb3Q9ZSksYS5zZXRzQ2hpbGRQb3J0U3BvdCYmKGcudG9TcG90PWQpKTooYS5zZXRzUG9ydFNwb3QmJihnLmZyb21TcG90PWQpLGEuc2V0c0NoaWxkUG9ydFNwb3QmJihnLnRvU3BvdD1lKSkpO31icmVhaztjYXNlIGR0OmZvcihkPTkwPT09ZHx8MjcwPT09ZD9LZDpKZCxmPWM/YS5kZXN0aW5hdGlvbkVkZ2VzOmEuc291cmNlRWRnZXM7Zi5uZXh0KCk7KXtnPWYudmFsdWUubGluayxudWxsIT09ZyYmKGM/KGEuc2V0c1BvcnRTcG90JiYoZy5mcm9tU3BvdD1lKSxhLnNldHNDaGlsZFBvcnRTcG90JiYoZy50b1Nwb3Q9ZCkpOihhLnNldHNQb3J0U3BvdCYmKGcuZnJvbVNwb3Q9ZCksYS5zZXRzQ2hpbGRQb3J0U3BvdCYmKGcudG9TcG90PWUpKSk7fX19ZWxzZSBpZihjPWp0KGEpLHRoaXMuWmM9PT1Ccylmb3IoZT1hLmRlc3RpbmF0aW9uRWRnZXM7ZS5uZXh0KCk7KXtpZihkPWUudmFsdWUubGluayxudWxsIT09ZCl7aWYoYS5zZXRzUG9ydFNwb3QpaWYoYS5wb3J0U3BvdC5LYigpKXN3aXRjaChjKXtjYXNlIDA6ZC5mcm9tU3BvdD1TZDticmVhaztjYXNlIDkwOmQuZnJvbVNwb3Q9VGQ7YnJlYWs7Y2FzZSAxODA6ZC5mcm9tU3BvdD1LZDticmVhaztkZWZhdWx0OmQuZnJvbVNwb3Q9SmQ7fWVsc2UgZC5mcm9tU3BvdD1hLnBvcnRTcG90O2lmKGEuc2V0c0NoaWxkUG9ydFNwb3QpaWYoYS5jaGlsZFBvcnRTcG90LktiKCkpc3dpdGNoKGMpe2Nhc2UgMDpkLnRvU3BvdD1LZDticmVhaztjYXNlIDkwOmQudG9TcG90PUpkO2JyZWFrO2Nhc2UgMTgwOmQudG9TcG90PVNkO2JyZWFrO2RlZmF1bHQ6ZC50b1Nwb3Q9VGQ7fWVsc2UgZC50b1Nwb3Q9YS5jaGlsZFBvcnRTcG90O319ZWxzZSBmb3IoZT1hLnNvdXJjZUVkZ2VzO2UubmV4dCgpOyl7aWYoZD1lLnZhbHVlLmxpbmssbnVsbCE9PWQpe2lmKGEuc2V0c1BvcnRTcG90KWlmKGEucG9ydFNwb3QuS2IoKSlzd2l0Y2goYyl7Y2FzZSAwOmQudG9TcG90PVNkO2JyZWFrO2Nhc2UgOTA6ZC50b1Nwb3Q9VGQ7YnJlYWs7Y2FzZSAxODA6ZC50b1Nwb3Q9S2Q7YnJlYWs7ZGVmYXVsdDpkLnRvU3BvdD1KZDt9ZWxzZSBkLnRvU3BvdD1hLnBvcnRTcG90O2lmKGEuc2V0c0NoaWxkUG9ydFNwb3QpaWYoYS5jaGlsZFBvcnRTcG90LktiKCkpc3dpdGNoKGMpe2Nhc2UgMDpkLmZyb21TcG90PUtkO2JyZWFrO2Nhc2UgOTA6ZC5mcm9tU3BvdD1KZDticmVhaztjYXNlIDE4MDpkLmZyb21TcG90PVNkO2JyZWFrO2RlZmF1bHQ6ZC5mcm9tU3BvdD1UZDt9ZWxzZSBkLmZyb21TcG90PWEuY2hpbGRQb3J0U3BvdDt9fX07ZnVuY3Rpb24ganQoYSl7YT1hLmFuZ2xlO3JldHVybiA0NT49YT8wOjEzNT49YT85MDoyMjU+PWE/MTgwOjMxNT49YT8yNzA6MDt9ZnVuY3Rpb24gbHQoYSl7dmFyIGI9anQoYSk7Yj05MD09PWJ8fDI3MD09PWI7dmFyIGM9YS5sYXllclNwYWNpbmc7aWYoMDxhLmxheWVyU3BhY2luZ1BhcmVudE92ZXJsYXApe3ZhciBkPU1hdGgubWluKDEsYS5sYXllclNwYWNpbmdQYXJlbnRPdmVybGFwKTtjLT1iP2EuaGVpZ2h0KmQ6YS53aWR0aCpkO31jPChiPy1hLmhlaWdodDotYS53aWR0aCkmJihjPWI/LWEuaGVpZ2h0Oi1hLndpZHRoKTtyZXR1cm4gYzt9ZnVuY3Rpb24gbXQoYSl7dmFyIGI9anQoYSksYz1hLm5vZGVJbmRlbnQ7aWYoMDxhLm5vZGVJbmRlbnRQYXN0UGFyZW50KXt2YXIgZD1NYXRoLm1pbigxLGEubm9kZUluZGVudFBhc3RQYXJlbnQpO2MrPTkwPT09Ynx8MjcwPT09Yj9hLndpZHRoKmQ6YS5oZWlnaHQqZDt9cmV0dXJuIGM9TWF0aC5tYXgoMCxjKTt9cGEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoenMucHJvdG90eXBlLHtyb290czp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkZiO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkZiIT09YSYmKHRoaXMuRmI9YSx0aGlzLkIoKSk7fX0scGF0aDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1vO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk1vIT09YSYmKHRoaXMuTW89YSx0aGlzLkIoKSk7fX0sdHJlZVN0eWxlOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuRHA7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuQWI9PT1hfHxhIT09Q3MmJmEhPT1WcyYmYSE9PVdzJiZhIT09VXN8fCh0aGlzLkRwPWEsdGhpcy5CKCkpO319LGxheWVyU3R5bGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Kcjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5BYj09PWF8fGEhPT1EcyYmYSE9PVFzJiZhIT09UHN8fCh0aGlzLkpyPWEsdGhpcy5CKCkpO319LGNvbW1lbnRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWGM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuWGMhPT1hJiYodGhpcy5YYz1hLHRoaXMuQigpKTt9fSxhcnJhbmdlbWVudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLkFiO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLkFiPT09YXx8YSE9PUVzJiZhIT09SXQmJmEhPT1Ic3x8KHRoaXMuQWI9YSx0aGlzLkIoKSk7fX0sYXJyYW5nZW1lbnRTcGFjaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMud2Q7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMud2QuQShhKXx8KHRoaXMud2QuYXNzaWduKGEpLHRoaXMuQigpKTt9fSxyb290RGVmYXVsdHM6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5VO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlUhPT1hJiYodGhpcy5VPWEsdGhpcy5CKCkpO319LGFsdGVybmF0ZURlZmF1bHRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5WIT09YSYmKHRoaXMuVj1hLHRoaXMuQigpKTt9fSxzb3J0aW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5zb3J0aW5nO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlUuc29ydGluZz09PWF8fGEhPT1YcyYmYSE9PVlzJiZhIT09WnMmJiEkc3x8KHRoaXMuVS5zb3J0aW5nPWEsdGhpcy5CKCkpO319LGNvbXBhcmVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5jb21wYXJlcjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5VLmNvbXBhcmVyIT09YSYmKHRoaXMuVS5jb21wYXJlcj1hLHRoaXMuQigpKTt9fSxhbmdsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlUuYW5nbGU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVS5hbmdsZSE9PWEmJigwPT09YXx8OTA9PT1hfHwxODA9PT1hfHwyNzA9PT1hPyh0aGlzLlUuYW5nbGU9YSx0aGlzLkIoKSk6QSgiVHJlZUxheW91dC5hbmdsZSBtdXN0IGJlIDAsIDkwLCAxODAsIG9yIDI3MCIpKTt9fSxhbGlnbm1lbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5VLmFsaWdubWVudDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5VLmFsaWdubWVudCE9PWEmJih0aGlzLlUuYWxpZ25tZW50PWEsdGhpcy5CKCkpO319LG5vZGVJbmRlbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5VLm5vZGVJbmRlbnQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVS5ub2RlSW5kZW50IT09YSYmMDw9YSYmKHRoaXMuVS5ub2RlSW5kZW50PWEsdGhpcy5CKCkpO319LG5vZGVJbmRlbnRQYXN0UGFyZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5ub2RlSW5kZW50UGFzdFBhcmVudDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5VLm5vZGVJbmRlbnRQYXN0UGFyZW50IT09YSYmMDw9YSYmMT49YSYmKHRoaXMuVS5ub2RlSW5kZW50UGFzdFBhcmVudD1hLHRoaXMuQigpKTt9fSxub2RlU3BhY2luZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlUubm9kZVNwYWNpbmc7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVS5ub2RlU3BhY2luZyE9PWEmJih0aGlzLlUubm9kZVNwYWNpbmc9YSx0aGlzLkIoKSk7fX0sbGF5ZXJTcGFjaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5sYXllclNwYWNpbmc7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVS5sYXllclNwYWNpbmchPT1hJiYodGhpcy5VLmxheWVyU3BhY2luZz1hLHRoaXMuQigpKTt9fSxsYXllclNwYWNpbmdQYXJlbnRPdmVybGFwOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5sYXllclNwYWNpbmdQYXJlbnRPdmVybGFwO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlUubGF5ZXJTcGFjaW5nUGFyZW50T3ZlcmxhcCE9PWEmJjA8PWEmJjE+PWEmJih0aGlzLlUubGF5ZXJTcGFjaW5nUGFyZW50T3ZlcmxhcD1hLHRoaXMuQigpKTt9fSxjb21wYWN0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5jb21wYWN0aW9uO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlUuY29tcGFjdGlvbj09PWF8fGEhPT1ndCYmYSE9PWl0fHwodGhpcy5VLmNvbXBhY3Rpb249YSx0aGlzLkIoKSk7fX0sYnJlYWR0aExpbWl0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5icmVhZHRoTGltaXQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVS5icmVhZHRoTGltaXQhPT1hJiYwPD1hJiYodGhpcy5VLmJyZWFkdGhMaW1pdD1hLHRoaXMuQigpKTt9fSxyb3dTcGFjaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5yb3dTcGFjaW5nO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlUucm93U3BhY2luZyE9PWEmJih0aGlzLlUucm93U3BhY2luZz1hLHRoaXMuQigpKTt9fSxyb3dJbmRlbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5VLnJvd0luZGVudDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5VLnJvd0luZGVudCE9PWEmJjA8PWEmJih0aGlzLlUucm93SW5kZW50PWEsdGhpcy5CKCkpO319LGNvbW1lbnRTcGFjaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5jb21tZW50U3BhY2luZzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5VLmNvbW1lbnRTcGFjaW5nIT09YSYmKHRoaXMuVS5jb21tZW50U3BhY2luZz1hLHRoaXMuQigpKTt9fSxjb21tZW50TWFyZ2luOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5jb21tZW50TWFyZ2luO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlUuY29tbWVudE1hcmdpbiE9PWEmJih0aGlzLlUuY29tbWVudE1hcmdpbj1hLHRoaXMuQigpKTt9fSxzZXRzUG9ydFNwb3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5VLnNldHNQb3J0U3BvdDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5VLnNldHNQb3J0U3BvdCE9PWEmJih0aGlzLlUuc2V0c1BvcnRTcG90PWEsdGhpcy5CKCkpO319LHBvcnRTcG90OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVS5wb3J0U3BvdDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5VLnBvcnRTcG90LkEoYSl8fCh0aGlzLlUucG9ydFNwb3Q9YSx0aGlzLkIoKSk7fX0sc2V0c0NoaWxkUG9ydFNwb3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5VLnNldHNDaGlsZFBvcnRTcG90O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlUuc2V0c0NoaWxkUG9ydFNwb3QhPT1hJiYodGhpcy5VLnNldHNDaGlsZFBvcnRTcG90PWEsdGhpcy5CKCkpO319LGNoaWxkUG9ydFNwb3Q6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5VLmNoaWxkUG9ydFNwb3Q7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVS5jaGlsZFBvcnRTcG90LkEoYSl8fCh0aGlzLlUuY2hpbGRQb3J0U3BvdD1hLHRoaXMuQigpKTt9fSxhbHRlcm5hdGVTb3J0aW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVi5zb3J0aW5nO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlYuc29ydGluZz09PWF8fGEhPT1YcyYmYSE9PVlzJiZhIT09WnMmJiEkc3x8KHRoaXMuVi5zb3J0aW5nPWEsdGhpcy5CKCkpO319LGFsdGVybmF0ZUNvbXBhcmVyOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVi5jb21wYXJlcjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5WLmNvbXBhcmVyIT09YSYmKHRoaXMuVi5jb21wYXJlcj1hLHRoaXMuQigpKTt9fSxhbHRlcm5hdGVBbmdsZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYuYW5nbGU7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVi5hbmdsZT09PWF8fDAhPT1hJiY5MCE9PWEmJjE4MCE9PWEmJjI3MCE9PWF8fCh0aGlzLlYuYW5nbGU9YSx0aGlzLkIoKSk7fX0sYWx0ZXJuYXRlQWxpZ25tZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVi5hbGlnbm1lbnQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVi5hbGlnbm1lbnQhPT1hJiYodGhpcy5WLmFsaWdubWVudD1hLHRoaXMuQigpKTt9fSxhbHRlcm5hdGVOb2RlSW5kZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVi5ub2RlSW5kZW50O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlYubm9kZUluZGVudCE9PWEmJjA8PWEmJih0aGlzLlYubm9kZUluZGVudD1hLHRoaXMuQigpKTt9fSxhbHRlcm5hdGVOb2RlSW5kZW50UGFzdFBhcmVudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYubm9kZUluZGVudFBhc3RQYXJlbnQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVi5ub2RlSW5kZW50UGFzdFBhcmVudCE9PWEmJjA8PWEmJjE+PWEmJih0aGlzLlYubm9kZUluZGVudFBhc3RQYXJlbnQ9YSx0aGlzLkIoKSk7fX0sYWx0ZXJuYXRlTm9kZVNwYWNpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5WLm5vZGVTcGFjaW5nO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlYubm9kZVNwYWNpbmchPT1hJiYodGhpcy5WLm5vZGVTcGFjaW5nPWEsdGhpcy5CKCkpO319LGFsdGVybmF0ZUxheWVyU3BhY2luZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYubGF5ZXJTcGFjaW5nO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlYubGF5ZXJTcGFjaW5nIT09YSYmKHRoaXMuVi5sYXllclNwYWNpbmc9YSx0aGlzLkIoKSk7fX0sYWx0ZXJuYXRlTGF5ZXJTcGFjaW5nUGFyZW50T3ZlcmxhcDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYubGF5ZXJTcGFjaW5nUGFyZW50T3ZlcmxhcDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5WLmxheWVyU3BhY2luZ1BhcmVudE92ZXJsYXAhPT1hJiYwPD1hJiYxPj1hJiYodGhpcy5WLmxheWVyU3BhY2luZ1BhcmVudE92ZXJsYXA9YSx0aGlzLkIoKSk7fX0sYWx0ZXJuYXRlQ29tcGFjdGlvbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYuY29tcGFjdGlvbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5WLmNvbXBhY3Rpb249PT1hfHxhIT09Z3QmJmEhPT1pdHx8KHRoaXMuVi5jb21wYWN0aW9uPWEsdGhpcy5CKCkpO319LGFsdGVybmF0ZUJyZWFkdGhMaW1pdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYuYnJlYWR0aExpbWl0O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlYuYnJlYWR0aExpbWl0IT09YSYmMDw9YSYmKHRoaXMuVi5icmVhZHRoTGltaXQ9YSx0aGlzLkIoKSk7fX0sYWx0ZXJuYXRlUm93U3BhY2luZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYucm93U3BhY2luZzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5WLnJvd1NwYWNpbmchPT1hJiYodGhpcy5WLnJvd1NwYWNpbmc9YSx0aGlzLkIoKSk7fX0sYWx0ZXJuYXRlUm93SW5kZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVi5yb3dJbmRlbnQ7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVi5yb3dJbmRlbnQhPT1hJiYwPD1hJiYodGhpcy5WLnJvd0luZGVudD1hLHRoaXMuQigpKTt9fSxhbHRlcm5hdGVDb21tZW50U3BhY2luZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYuY29tbWVudFNwYWNpbmc7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVi5jb21tZW50U3BhY2luZyE9PWEmJih0aGlzLlYuY29tbWVudFNwYWNpbmc9YSx0aGlzLkIoKSk7fX0sYWx0ZXJuYXRlQ29tbWVudE1hcmdpbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYuY29tbWVudE1hcmdpbjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5WLmNvbW1lbnRNYXJnaW4hPT1hJiYodGhpcy5WLmNvbW1lbnRNYXJnaW49YSx0aGlzLkIoKSk7fX0sYWx0ZXJuYXRlU2V0c1BvcnRTcG90OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVi5zZXRzUG9ydFNwb3Q7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVi5zZXRzUG9ydFNwb3QhPT1hJiYodGhpcy5WLnNldHNQb3J0U3BvdD1hLHRoaXMuQigpKTt9fSxhbHRlcm5hdGVQb3J0U3BvdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLlYucG9ydFNwb3Q7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVi5wb3J0U3BvdC5BKGEpfHwodGhpcy5WLnBvcnRTcG90PWEsdGhpcy5CKCkpO319LGFsdGVybmF0ZVNldHNDaGlsZFBvcnRTcG90OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVi5zZXRzQ2hpbGRQb3J0U3BvdDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5WLnNldHNDaGlsZFBvcnRTcG90IT09YSYmKHRoaXMuVi5zZXRzQ2hpbGRQb3J0U3BvdD1hLHRoaXMuQigpKTt9fSxhbHRlcm5hdGVDaGlsZFBvcnRTcG90OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVi5jaGlsZFBvcnRTcG90O30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLlYuY2hpbGRQb3J0U3BvdC5BKGEpfHwodGhpcy5WLmNoaWxkUG9ydFNwb3Q9YSx0aGlzLkIoKSk7fX19KTt2YXIgQXM9bmV3IEQoenMsIlBhdGhEZWZhdWx0IiwtMSksQnM9bmV3IEQoenMsIlBhdGhEZXN0aW5hdGlvbiIsMCksSXM9bmV3IEQoenMsIlBhdGhTb3VyY2UiLDEpLFhzPW5ldyBEKHpzLCJTb3J0aW5nRm9yd2FyZHMiLDEwKSxZcz1uZXcgRCh6cywiU29ydGluZ1JldmVyc2UiLDExKSxacz1uZXcgRCh6cywiU29ydGluZ0FzY2VuZGluZyIsMTIpLCRzPW5ldyBEKHpzLCJTb3J0aW5nRGVzY2VuZGluZyIsMTMpLHp0PW5ldyBEKHpzLCJBbGlnbm1lbnRDZW50ZXJTdWJ0cmVlcyIsMjApLEF0PW5ldyBEKHpzLCJBbGlnbm1lbnRDZW50ZXJDaGlsZHJlbiIsMjEpLHF0PW5ldyBEKHpzLCJBbGlnbm1lbnRTdGFydCIsMjIpLGt0PW5ldyBEKHpzLCJBbGlnbm1lbnRFbmQiLDIzKSxidD1uZXcgRCh6cywiQWxpZ25tZW50QnVzIiwyNCksU3M9bmV3IEQoenMsIkFsaWdubWVudEJ1c0JyYW5jaGluZyIsMjUpLGN0PW5ldyBEKHpzLCJBbGlnbm1lbnRUb3BMZWZ0QnVzIiwyNiksZHQ9bmV3IEQoenMsIkFsaWdubWVudEJvdHRvbVJpZ2h0QnVzIiwyNyksZ3Q9bmV3IEQoenMsIkNvbXBhY3Rpb25Ob25lIiwzMCksaXQ9bmV3IEQoenMsIkNvbXBhY3Rpb25CbG9jayIsMzEpLENzPW5ldyBEKHpzLCJTdHlsZUxheWVyZWQiLDQwKSxXcz1uZXcgRCh6cywiU3R5bGVMYXN0UGFyZW50cyIsNDEpLFZzPW5ldyBEKHpzLCJTdHlsZUFsdGVybmF0aW5nIiw0MiksVXM9bmV3IEQoenMsIlN0eWxlUm9vdE9ubHkiLDQzKSxFcz1uZXcgRCh6cywiQXJyYW5nZW1lbnRWZXJ0aWNhbCIsNTApLEl0PW5ldyBEKHpzLCJBcnJhbmdlbWVudEhvcml6b250YWwiLDUxKSxIcz1uZXcgRCh6cywiQXJyYW5nZW1lbnRGaXhlZFJvb3RzIiw1MiksRHM9bmV3IEQoenMsIkxheWVySW5kaXZpZHVhbCIsNjApLFFzPW5ldyBEKHpzLCJMYXllclNpYmxpbmdzIiw2MSksUHM9bmV3IEQoenMsIkxheWVyVW5pZm9ybSIsNjIpO3pzLmNsYXNzTmFtZT0iVHJlZUxheW91dCI7enMuUGF0aERlZmF1bHQ9QXM7enMuUGF0aERlc3RpbmF0aW9uPUJzO3pzLlBhdGhTb3VyY2U9SXM7enMuU29ydGluZ0ZvcndhcmRzPVhzO3pzLlNvcnRpbmdSZXZlcnNlPVlzO3pzLlNvcnRpbmdBc2NlbmRpbmc9WnM7enMuU29ydGluZ0Rlc2NlbmRpbmc9JHM7enMuQWxpZ25tZW50Q2VudGVyU3VidHJlZXM9enQ7enMuQWxpZ25tZW50Q2VudGVyQ2hpbGRyZW49QXQ7enMuQWxpZ25tZW50U3RhcnQ9cXQ7enMuQWxpZ25tZW50RW5kPWt0O3pzLkFsaWdubWVudEJ1cz1idDt6cy5BbGlnbm1lbnRCdXNCcmFuY2hpbmc9U3M7enMuQWxpZ25tZW50VG9wTGVmdEJ1cz1jdDt6cy5BbGlnbm1lbnRCb3R0b21SaWdodEJ1cz1kdDt6cy5Db21wYWN0aW9uTm9uZT1ndDt6cy5Db21wYWN0aW9uQmxvY2s9aXQ7enMuU3R5bGVMYXllcmVkPUNzO3pzLlN0eWxlTGFzdFBhcmVudHM9V3M7enMuU3R5bGVBbHRlcm5hdGluZz1Wczt6cy5TdHlsZVJvb3RPbmx5PVVzO3pzLkFycmFuZ2VtZW50VmVydGljYWw9RXM7enMuQXJyYW5nZW1lbnRIb3Jpem9udGFsPUl0O3pzLkFycmFuZ2VtZW50Rml4ZWRSb290cz1Iczt6cy5MYXllckluZGl2aWR1YWw9RHM7enMuTGF5ZXJTaWJsaW5ncz1Rczt6cy5MYXllclVuaWZvcm09UHM7ZnVuY3Rpb24gRnMoYSl7eXAuY2FsbCh0aGlzLGEpO31vYShGcyx5cCk7RnMucHJvdG90eXBlLmNyZWF0ZVZlcnRleD1mdW5jdGlvbigpe3JldHVybiBuZXcgR3ModGhpcyk7fTtGcy5wcm90b3R5cGUuY3JlYXRlRWRnZT1mdW5jdGlvbigpe3JldHVybiBuZXcgS3QodGhpcyk7fTtGcy5jbGFzc05hbWU9IlRyZWVOZXR3b3JrIjtmdW5jdGlvbiBHcyhhKXtCcC5jYWxsKHRoaXMsYSk7dGhpcy5MYT0hMTt0aGlzLktjPW51bGw7dGhpcy5LPVtdO3RoaXMuV2I9dGhpcy5WYj10aGlzLmJhPXRoaXMuTWE9MDt0aGlzLlhjPW51bGw7dGhpcy5UPW5ldyBHKDAsMCk7dGhpcy51YT1uZXcgSygwLDApO3RoaXMuaWE9bmV3IEcoMCwwKTt0aGlzLnVtPXRoaXMudG09dGhpcy5Rej0hMTt0aGlzLm9xPXRoaXMuYnE9bnVsbDt0aGlzLlFjPVhzO3RoaXMuTWM9SHA7dGhpcy56Yz0wO3RoaXMud2I9QXQ7dGhpcy5Ycj10aGlzLldyPTA7dGhpcy5acj0yMDt0aGlzLmtlPTUwO3RoaXMuSXI9MDt0aGlzLlBxPWl0O3RoaXMuSXE9MDt0aGlzLmxzPTI1O3RoaXMuT3E9dGhpcy5rcz0xMDt0aGlzLk5xPTIwO3RoaXMudnM9ITA7dGhpcy5ncz1FZDt0aGlzLnVzPSEwO3RoaXMuTHE9RWQ7fW9hKEdzLEJwKTtHcy5wcm90b3R5cGUuY29weUluaGVyaXRlZFByb3BlcnRpZXNGcm9tPWZ1bmN0aW9uKGEpe251bGwhPT1hJiYodGhpcy5RYz1hLnNvcnRpbmcsdGhpcy5NYz1hLmNvbXBhcmVyLHRoaXMuemM9YS5hbmdsZSx0aGlzLndiPWEuYWxpZ25tZW50LHRoaXMuV3I9YS5ub2RlSW5kZW50LHRoaXMuWHI9YS5ub2RlSW5kZW50UGFzdFBhcmVudCx0aGlzLlpyPWEubm9kZVNwYWNpbmcsdGhpcy5rZT1hLmxheWVyU3BhY2luZyx0aGlzLklyPWEubGF5ZXJTcGFjaW5nUGFyZW50T3ZlcmxhcCx0aGlzLlBxPWEuY29tcGFjdGlvbix0aGlzLklxPWEuYnJlYWR0aExpbWl0LHRoaXMubHM9YS5yb3dTcGFjaW5nLHRoaXMua3M9YS5yb3dJbmRlbnQsdGhpcy5PcT1hLmNvbW1lbnRTcGFjaW5nLHRoaXMuTnE9YS5jb21tZW50TWFyZ2luLHRoaXMudnM9YS5zZXRzUG9ydFNwb3QsdGhpcy5ncz1hLnBvcnRTcG90LHRoaXMudXM9YS5zZXRzQ2hpbGRQb3J0U3BvdCx0aGlzLkxxPWEuY2hpbGRQb3J0U3BvdCk7fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhHcy5wcm90b3R5cGUse2luaXRpYWxpemVkOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTGE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTGEhPT1hJiYodGhpcy5MYT1hKTt9fSxwYXJlbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5LYzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5LYyE9PWEmJih0aGlzLktjPWEpO319LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuSzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7aWYodGhpcy5LIT09YSl7aWYobnVsbCE9PWEpZm9yKHZhciBiPWEubGVuZ3RoLGM9MDtjPGI7YysrKXs7fXRoaXMuSz1hO319fSxsZXZlbDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1hO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk1hIT09YSYmKHRoaXMuTWE9YSk7fX0sZGVzY2VuZGFudENvdW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuYmE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuYmEhPT1hJiYodGhpcy5iYT1hKTt9fSxtYXhDaGlsZHJlbkNvdW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVmI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuVmIhPT1hJiYodGhpcy5WYj1hKTt9fSxtYXhHZW5lcmF0aW9uQ291bnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5XYjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5XYiE9PWEmJih0aGlzLldiPWEpO319LGNvbW1lbnRzOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWGM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe2lmKHRoaXMuWGMhPT1hKXtpZihudWxsIT09YSlmb3IodmFyIGI9YS5sZW5ndGgsYz0wO2M8YjtjKyspezt9dGhpcy5YYz1hO319fSxzb3J0aW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuUWM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuUWMhPT1hJiYodGhpcy5RYz1hKTt9fSxjb21wYXJlcjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk1jO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk1jIT09YSYmKHRoaXMuTWM9YSk7fX0sYW5nbGU6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy56Yzt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy56YyE9PWEmJih0aGlzLnpjPWEpO319LGFsaWdubWVudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLndiO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLndiIT09YSYmKHRoaXMud2I9YSk7fX0sbm9kZUluZGVudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLldyO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLldyIT09YSYmKHRoaXMuV3I9YSk7fX0sbm9kZUluZGVudFBhc3RQYXJlbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Ycjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5YciE9PWEmJih0aGlzLlhyPWEpO319LG5vZGVTcGFjaW5nOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuWnI7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuWnIhPT1hJiYodGhpcy5acj1hKTt9fSxsYXllclNwYWNpbmc6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5rZTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5rZSE9PWEmJih0aGlzLmtlPWEpO319LGxheWVyU3BhY2luZ1BhcmVudE92ZXJsYXA6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5Jcjt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5JciE9PWEmJih0aGlzLklyPWEpO319LGNvbXBhY3Rpb246e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5QcTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5QcSE9PWEmJih0aGlzLlBxPWEpO319LGJyZWFkdGhMaW1pdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLklxO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLklxIT09YSYmKHRoaXMuSXE9YSk7fX0scm93U3BhY2luZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmxzO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmxzIT09YSYmKHRoaXMubHM9YSk7fX0scm93SW5kZW50OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMua3M7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMua3MhPT1hJiYodGhpcy5rcz1hKTt9fSxjb21tZW50U3BhY2luZzp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk9xO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk9xIT09YSYmKHRoaXMuT3E9YSk7fX0sY29tbWVudE1hcmdpbjp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLk5xO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLk5xIT09YSYmKHRoaXMuTnE9YSk7fX0sc2V0c1BvcnRTcG90OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudnM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudnMhPT1hJiYodGhpcy52cz1hKTt9fSxwb3J0U3BvdDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmdzO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLmdzLkEoYSl8fCh0aGlzLmdzPWEpO319LHNldHNDaGlsZFBvcnRTcG90OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMudXM7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMudXMhPT1hJiYodGhpcy51cz1hKTt9fSxjaGlsZFBvcnRTcG90OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuTHE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuTHEuQShhKXx8KHRoaXMuTHE9YSk7fX0sY2hpbGRyZW5Db3VudDp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDt9fSxyZWxhdGl2ZVBvc2l0aW9uOntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuVDt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5ULnNldChhKTt9fSxzdWJ0cmVlU2l6ZTp7Z2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLnVhO30sc2V0OmZ1bmN0aW9uIHNldChhKXt0aGlzLnVhLnNldChhKTt9fSxzdWJ0cmVlT2Zmc2V0OntnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuaWE7fSxzZXQ6ZnVuY3Rpb24gc2V0KGEpe3RoaXMuaWEuc2V0KGEpO319fSk7R3MuY2xhc3NOYW1lPSJUcmVlVmVydGV4IjtmdW5jdGlvbiBLdChhKXtDcC5jYWxsKHRoaXMsYSk7dGhpcy5vdT1uZXcgRygwLDApO31vYShLdCxDcCk7S3QucHJvdG90eXBlLmNvbW1pdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMubGluaztpZihudWxsIT09YSYmIWEuaXNBdm9pZGluZyl7dmFyIGI9dGhpcy5uZXR3b3JrLmxheW91dCxjPW51bGwsZD1udWxsO3N3aXRjaChiLlpjKXtjYXNlIEJzOmM9dGhpcy5mcm9tVmVydGV4O2Q9dGhpcy50b1ZlcnRleDticmVhaztjYXNlIElzOmM9dGhpcy50b1ZlcnRleDtkPXRoaXMuZnJvbVZlcnRleDticmVhaztkZWZhdWx0OkEoIlVuaGFuZGxlZCBwYXRoIHZhbHVlICIrYi5aYy50b1N0cmluZygpKTt9aWYobnVsbCE9PWMmJm51bGwhPT1kKWlmKGI9dGhpcy5vdSwwIT09Yi54fHwwIT09Yi55fHxjLlF6KXtkPWMuYm91bmRzO3ZhciBlPWp0KGMpLGY9bHQoYyksZz1jLnJvd1NwYWNpbmc7YS5ZaSgpO3ZhciBoPWEuY3VydmU9PT1SZyxrPWEuaXNPcnRob2dvbmFsLGw7YS5CaCgpO2lmKGt8fGgpe2ZvcihsPTI7NDxhLnBvaW50c0NvdW50Oyl7YS56digyKTt9dmFyIG09YS5pKDEpO3ZhciBuPWEuaSgyKTt9ZWxzZXtmb3IobD0xOzM8YS5wb2ludHNDb3VudDspe2EuenYoMSk7fW09YS5pKDApO249YS5pKGEucG9pbnRzQ291bnQtMSk7fXZhciBwPWEuaShhLnBvaW50c0NvdW50LTEpOzA9PT1lPyhjLmFsaWdubWVudD09PWt0PyhlPWQuYm90dG9tK2IueSwwPT09Yi55JiZtLnk+cC55K2Mucm93SW5kZW50JiYoZT1NYXRoLm1pbihlLE1hdGgubWF4KG0ueSxlLW10KGMpKSkpKTpjLmFsaWdubWVudD09PXF0PyhlPWQudG9wK2IueSwwPT09Yi55JiZtLnk8cC55LWMucm93SW5kZW50JiYoZT1NYXRoLm1heChlLE1hdGgubWluKG0ueSxlK210KGMpKSkpKTplPWMudG18fGMudW0mJjE9PT1jLm1heEdlbmVyYXRpb25Db3VudD9kLnRvcC1jLmlhLnkrYi55OmQueStkLmhlaWdodC8yK2IueSxoPyhhLm0obCxtLngsZSksbCsrLGEubShsLGQucmlnaHQrZixlKSxsKyssYS5tKGwsZC5yaWdodCtmKyhiLngtZykvMyxlKSxsKyssYS5tKGwsZC5yaWdodCtmKzIqKGIueC1nKS8zLGUpLGwrKyxhLm0obCxkLnJpZ2h0K2YrKGIueC1nKSxlKSxsKyssYS5tKGwsbi54LGUpKTooayYmKGEubShsLGQucmlnaHQrZi8yLG0ueSksbCsrKSxhLm0obCxkLnJpZ2h0K2YvMixlKSxsKyssYS5tKGwsZC5yaWdodCtmK2IueC0oaz9nLzI6ZyksZSksbCsrLGsmJmEubShsLGEuaShsLTEpLngsbi55KSkpOjkwPT09ZT8oYy5hbGlnbm1lbnQ9PT1rdD8oZT1kLnJpZ2h0K2IueCwwPT09Yi54JiZtLng+cC54K2Mucm93SW5kZW50JiYoZT1NYXRoLm1pbihlLE1hdGgubWF4KG0ueCxlLW10KGMpKSkpKTpjLmFsaWdubWVudD09PXF0PyhlPWQubGVmdCtiLngsMD09PWIueCYmbS54PHAueC1jLnJvd0luZGVudCYmKGU9TWF0aC5tYXgoZSxNYXRoLm1pbihtLngsZSttdChjKSkpKSk6ZT1jLnRtfHxjLnVtJiYxPT09Yy5tYXhHZW5lcmF0aW9uQ291bnQ/ZC5sZWZ0LWMuaWEueCtiLng6ZC54K2Qud2lkdGgvMitiLngsaD8oYS5tKGwsZSxtLnkpLGwrKyxhLm0obCxlLGQuYm90dG9tK2YpLGwrKyxhLm0obCxlLGQuYm90dG9tK2YrKGIueS1nKS8zKSxsKyssYS5tKGwsZSxkLmJvdHRvbStmKzIqKGIueS1nKS8zKSxsKyssYS5tKGwsZSxkLmJvdHRvbStmKyhiLnktZykpLGwrKyxhLm0obCxlLG4ueSkpOihrJiYoYS5tKGwsbS54LGQuYm90dG9tK2YvMiksbCsrKSxhLm0obCxlLGQuYm90dG9tK2YvMiksbCsrLGEubShsLGUsZC5ib3R0b20rZitiLnktKGs/Zy8yOmcpKSxsKyssayYmYS5tKGwsbi54LGEuaShsLTEpLnkpKSk6MTgwPT09ZT8oYy5hbGlnbm1lbnQ9PT1rdD8oZT1kLmJvdHRvbStiLnksMD09PWIueSYmbS55PnAueStjLnJvd0luZGVudCYmKGU9TWF0aC5taW4oZSxNYXRoLm1heChtLnksZS1tdChjKSkpKSk6Yy5hbGlnbm1lbnQ9PT1xdD8oZT1kLnRvcCtiLnksMD09PWIueSYmbS55PHAueS1jLnJvd0luZGVudCYmKGU9TWF0aC5tYXgoZSxNYXRoLm1pbihtLnksZSttdChjKSkpKSk6ZT1jLnRtfHxjLnVtJiYxPT09Yy5tYXhHZW5lcmF0aW9uQ291bnQ/ZC50b3AtYy5pYS55K2IueTpkLnkrZC5oZWlnaHQvMitiLnksaD8oYS5tKGwsbS54LGUpLGwrKyxhLm0obCxkLmxlZnQtZixlKSxsKyssYS5tKGwsZC5sZWZ0LWYrKGIueCtnKS8zLGUpLGwrKyxhLm0obCxkLmxlZnQtZisyKihiLngrZykvMyxlKSxsKyssYS5tKGwsZC5sZWZ0LWYrKGIueCtnKSxlKSxsKyssYS5tKGwsbi54LGUpKTooayYmKGEubShsLGQubGVmdC1mLzIsbS55KSxsKyspLGEubShsLGQubGVmdC1mLzIsZSksbCsrLGEubShsLGQubGVmdC1mK2IueCsoaz9nLzI6ZyksZSksbCsrLGsmJmEubShsLGEuaShsLTEpLngsbi55KSkpOjI3MD09PWU/KGMuYWxpZ25tZW50PT09a3Q/KGU9ZC5yaWdodCtiLngsMD09PWIueCYmbS54PnAueCtjLnJvd0luZGVudCYmKGU9TWF0aC5taW4oZSxNYXRoLm1heChtLngsZS1tdChjKSkpKSk6Yy5hbGlnbm1lbnQ9PT1xdD8oZT1kLmxlZnQrYi54LDA9PT1iLngmJm0ueDxwLngtYy5yb3dJbmRlbnQmJihlPU1hdGgubWF4KGUsTWF0aC5taW4obS54LGUrbXQoYykpKSkpOmU9Yy50bXx8Yy51bSYmMT09PWMubWF4R2VuZXJhdGlvbkNvdW50P2QubGVmdC1jLmlhLngrYi54OmQueCtkLndpZHRoLzIrYi54LGg/KGEubShsLGUsbS55KSxsKyssYS5tKGwsZSxkLnRvcC1mKSxsKyssYS5tKGwsZSxkLnRvcC1mKyhiLnkrZykvMyksbCsrLGEubShsLGUsZC50b3AtZisyKihiLnkrZykvMyksbCsrLGEubShsLGUsZC50b3AtZisoYi55K2cpKSxsKyssYS5tKGwsZSxuLnkpKTooayYmKGEubShsLG0ueCxkLnRvcC1mLzIpLGwrKyksYS5tKGwsZSxkLnRvcC1mLzIpLGwrKyxhLm0obCxlLGQudG9wLWYrYi55KyhrP2cvMjpnKSksbCsrLGsmJmEubShsLG4ueCxhLmkobC0xKS55KSkpOkEoIkludmFsaWQgYW5nbGUgIitlKTthLmtmKCk7fWVsc2UgYT10aGlzLmxpbmssZj1qdChjKSxmIT09anQoZCkmJihnPWx0KGMpLGg9Yy5ib3VuZHMsYz1kLmJvdW5kcywwPT09ZiYmYy5sZWZ0LWgucmlnaHQ8ZysxfHw5MD09PWYmJmMudG9wLWguYm90dG9tPGcrMXx8MTgwPT09ZiYmaC5sZWZ0LWMucmlnaHQ8ZysxfHwyNzA9PT1mJiZoLnRvcC1jLmJvdHRvbTxnKzF8fChhLllpKCksYz1hLmN1cnZlPT09UmcsYj1hLmlzT3J0aG9nb25hbCxkPWF0KHRoaXMuZnJvbVZlcnRleC5hbGlnbm1lbnQpLGEuQmgoKSwwPT09Zj8oZj1oLnJpZ2h0K2cvMixjPzQ9PT1hLnBvaW50c0NvdW50JiYoYz1hLmkoMykueSxhLk0oMSxmLTIwLGEuaSgxKS55KSxhLm0oMixmLTIwLGMpLGEubSgzLGYsYyksYS5tKDQsZisyMCxjKSxhLk0oNSxhLmkoNSkueCxjKSk6Yj9kP2EuTSgzLGEuaSgyKS54LGEuaSg0KS55KTo2PT09YS5wb2ludHNDb3VudCYmKGEuTSgyLGYsYS5pKDIpLnkpLGEuTSgzLGYsYS5pKDMpLnkpKTo0PT09YS5wb2ludHNDb3VudD9hLm0oMixmLGEuaSgyKS55KTozPT09YS5wb2ludHNDb3VudD9hLk0oMSxmLGEuaSgyKS55KToyPT09YS5wb2ludHNDb3VudCYmYS5tKDEsZixhLmkoMSkueSkpOjkwPT09Zj8oZj1oLmJvdHRvbStnLzIsYz80PT09YS5wb2ludHNDb3VudCYmKGM9YS5pKDMpLngsYS5NKDEsYS5pKDEpLngsZi0yMCksYS5tKDIsYyxmLTIwKSxhLm0oMyxjLGYpLGEubSg0LGMsZisyMCksYS5NKDUsYyxhLmkoNSkueSkpOmI/ZD9hLk0oMyxhLmkoMikueCxhLmkoNCkueSk6Nj09PWEucG9pbnRzQ291bnQmJihhLk0oMixhLmkoMikueCxmKSxhLk0oMyxhLmkoMykueCxmKSk6ND09PWEucG9pbnRzQ291bnQ/YS5tKDIsYS5pKDIpLngsZik6Mz09PWEucG9pbnRzQ291bnQ/YS5NKDEsYS5pKDIpLngsZik6Mj09PWEucG9pbnRzQ291bnQmJmEubSgxLGEuaSgxKS54LGYpKToxODA9PT1mPyhmPWgubGVmdC1nLzIsYz80PT09YS5wb2ludHNDb3VudCYmKGM9YS5pKDMpLnksYS5NKDEsZisyMCxhLmkoMSkueSksYS5tKDIsZisyMCxjKSxhLm0oMyxmLGMpLGEubSg0LGYtMjAsYyksYS5NKDUsYS5pKDUpLngsYykpOmI/ZD9hLk0oMyxhLmkoMikueCxhLmkoNCkueSk6Nj09PWEucG9pbnRzQ291bnQmJihhLk0oMixmLGEuaSgyKS55KSxhLk0oMyxmLGEuaSgzKS55KSk6ND09PWEucG9pbnRzQ291bnQ/YS5tKDIsZixhLmkoMikueSk6Mz09PWEucG9pbnRzQ291bnQ/YS5NKDEsZixhLmkoMikueSk6Mj09PWEucG9pbnRzQ291bnQmJmEubSgxLGYsYS5pKDEpLnkpKToyNzA9PT1mJiYoZj1oLnRvcC1nLzIsYz80PT09YS5wb2ludHNDb3VudCYmKGM9YS5pKDMpLngsYS5NKDEsYS5pKDEpLngsZisyMCksYS5tKDIsYyxmKzIwKSxhLm0oMyxjLGYpLGEubSg0LGMsZi0yMCksYS5NKDUsYyxhLmkoNSkueSkpOmI/ZD9hLk0oMyxhLmkoMikueCxhLmkoNCkueSk6Nj09PWEucG9pbnRzQ291bnQmJihhLk0oMixhLmkoMikueCxmKSxhLk0oMyxhLmkoMykueCxmKSk6ND09PWEucG9pbnRzQ291bnQ/YS5tKDIsYS5pKDIpLngsZik6Mz09PWEucG9pbnRzQ291bnQ/YS5NKDEsYS5pKDIpLngsZik6Mj09PWEucG9pbnRzQ291bnQmJmEubSgxLGEuaSgxKS54LGYpKSxhLmtmKCkpKTt9fTtwYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhLdC5wcm90b3R5cGUse3JlbGF0aXZlUG9pbnQ6e2dldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5vdTt9LHNldDpmdW5jdGlvbiBzZXQoYSl7dGhpcy5vdS5zZXQoYSk7fX19KTtLdC5jbGFzc05hbWU9IlRyZWVFZGdlIjtVYS5wcm90b3R5cGUuaW5pdGlhbGl6ZVN0YW5kYXJkVG9vbHM9ZnVuY3Rpb24oKXt2Zih0aGlzLCJBY3Rpb24iLG5ldyBkaCgpLHRoaXMubW91c2VEb3duVG9vbHMpO3ZmKHRoaXMsIlJlbGlua2luZyIsbmV3IE5mKCksdGhpcy5tb3VzZURvd25Ub29scyk7dmYodGhpcywiTGlua1Jlc2hhcGluZyIsbmV3IFBnKCksdGhpcy5tb3VzZURvd25Ub29scyk7dmYodGhpcywiUm90YXRpbmciLG5ldyBiaCgpLHRoaXMubW91c2VEb3duVG9vbHMpO3ZmKHRoaXMsIlJlc2l6aW5nIixuZXcgV2coKSx0aGlzLm1vdXNlRG93blRvb2xzKTt2Zih0aGlzLCJMaW5raW5nIixuZXcgSWcoKSx0aGlzLm1vdXNlTW92ZVRvb2xzKTt2Zih0aGlzLCJEcmFnZ2luZyIsbmV3IHhmKCksdGhpcy5tb3VzZU1vdmVUb29scyk7dmYodGhpcywiRHJhZ1NlbGVjdGluZyIsbmV3IGdoKCksdGhpcy5tb3VzZU1vdmVUb29scyk7dmYodGhpcywiUGFubmluZyIsbmV3IGhoKCksdGhpcy5tb3VzZU1vdmVUb29scyk7dmYodGhpcywiQ29udGV4dE1lbnUiLG5ldyBqaCgpLHRoaXMubW91c2VVcFRvb2xzKTt2Zih0aGlzLCJUZXh0RWRpdGluZyIsbmV3IHVoKCksdGhpcy5tb3VzZVVwVG9vbHMpO3ZmKHRoaXMsIkNsaWNrQ3JlYXRpbmciLG5ldyBlaCgpLHRoaXMubW91c2VVcFRvb2xzKTt2Zih0aGlzLCJDbGlja1NlbGVjdGluZyIsbmV3IGNoKCksdGhpcy5tb3VzZVVwVG9vbHMpO307Z24oIkhvcml6b250YWwiLG5ldyBvbSgpKTtnbigiU3BvdCIsbmV3IHFtKCkpO2duKCJUYWJsZSIsbmV3IHVtKCkpO2duKCJWaWV3Ym94IixuZXcgem0oKSk7Z24oIlRhYmxlUm93IixuZXcgeG0oKSk7Z24oIlRhYmxlQ29sdW1uIixuZXcgeW0oKSk7Z24oIkdyYWR1YXRlZCIsbmV3IEltKCkpO3NpLmFkZChFcS50eXBlLCRwKTtzaS5hZGQoSHEudHlwZSxucSk7dmFyIEx0PXcuZ28sTXQ9e2dldCBsaWNlbnNlS2V5KCl7cmV0dXJuIFAubGljZW5zZUtleTt9LHNldCBsaWNlbnNlS2V5KGEpe1AubGljZW5zZUtleT1hO30sZ2V0IHZlcnNpb24oKXtyZXR1cm4gUC52ZXJzaW9uO30sR3JvdXA6aWcsRW51bVZhbHVlOkQsTGlzdDpFLFNldDpGLE1hcDpMYixQb2ludDpHLFNpemU6SyxSZWN0Ok4sTWFyZ2luOkljLFNwb3Q6TyxHZW9tZXRyeTokZCxQYXRoRmlndXJlOlVlLFBhdGhTZWdtZW50OlZlLElucHV0RXZlbnQ6WGUsRGlhZ3JhbUV2ZW50OlplLENoYW5nZWRFdmVudDokZSxNb2RlbDpaLEdyYXBoTGlua3NNb2RlbDpFcSxUcmVlTW9kZWw6SHEsQmluZGluZzpIaSxUcmFuc2FjdGlvbjplZixVbmRvTWFuYWdlcjpmZixDb21tYW5kSGFuZGxlcjpIayxUb29sOmtmLERyYWdnaW5nVG9vbDp4ZixEcmFnZ2luZ0luZm86T2YsTGlua2luZ0Jhc2VUb29sOnJnLExpbmtpbmdUb29sOklnLFJlbGlua2luZ1Rvb2w6TmYsTGlua1Jlc2hhcGluZ1Rvb2w6UGcsUmVzaXppbmdUb29sOldnLFJvdGF0aW5nVG9vbDpiaCxDbGlja1NlbGVjdGluZ1Rvb2w6Y2gsQWN0aW9uVG9vbDpkaCxDbGlja0NyZWF0aW5nVG9vbDplaCxIVE1MSW5mbzp1ZixDb250ZXh0TWVudVRvb2w6amgsRHJhZ1NlbGVjdGluZ1Rvb2w6Z2gsUGFubmluZ1Rvb2w6aGgsVGV4dEVkaXRpbmdUb29sOnVoLFRvb2xNYW5hZ2VyOlVhLEFuaW1hdGlvbk1hbmFnZXI6T2gsTGF5ZXI6ZmksRGlhZ3JhbTpQLFBhbGV0dGU6QmssT3ZlcnZpZXc6RGssQnJ1c2g6a2wsR3JhcGhPYmplY3Q6WSxQYW5lbDpYLFJvd0NvbHVtbkRlZmluaXRpb246UWosU2hhcGU6VyxUZXh0QmxvY2s6dmgsVGV4dEJsb2NrTWV0cmljczpLbSxQaWN0dXJlOmNrLFBhcnQ6VCxBZG9ybm1lbnQ6cGYsTm9kZTpWLExpbms6UyxQbGFjZWhvbGRlcjpYZyxMYXlvdXQ6eWksTGF5b3V0TmV0d29yazp5cCxMYXlvdXRWZXJ0ZXg6QnAsTGF5b3V0RWRnZTpDcCxHcmlkTGF5b3V0OkNrLFBhbmVsTGF5b3V0OkVsLENpcmN1bGFyTGF5b3V0OklxLENpcmN1bGFyTmV0d29yazokcSxDaXJjdWxhclZlcnRleDptcixDaXJjdWxhckVkZ2U6bnIsRm9yY2VEaXJlY3RlZExheW91dDpvcixGb3JjZURpcmVjdGVkTmV0d29yazpwcixGb3JjZURpcmVjdGVkVmVydGV4OkJyLEZvcmNlRGlyZWN0ZWRFZGdlOkNyLExheWVyZWREaWdyYXBoTGF5b3V0OkRyLExheWVyZWREaWdyYXBoTmV0d29yazpJcixMYXllcmVkRGlncmFwaFZlcnRleDp4cyxMYXllcmVkRGlncmFwaEVkZ2U6eXMsVHJlZUxheW91dDp6cyxUcmVlTmV0d29yazpGcyxUcmVlVmVydGV4OkdzLFRyZWVFZGdlOkt0fTtMdCYmTHQudmVyc2lvbiE9PU10LnZlcnNpb24mJkEoIldBUk5JTkc6IGEgYGdvYCBvYmplY3Qgb24gdGhlIHJvb3Qgb2JqZWN0IGlzIGFscmVhZHkgZGVmaW5lZCB3aXRoIGEgdmVyc2lvbiBtaXNtYXRjaC4iK0x0LnZlcnNpb24rIi4gUmVwbGFjZWQgd2l0aCB2ZXJzaW9uOiAiK010LnZlcnNpb24pO3cuZ289TXQ7KCJ1bmRlZmluZWQiPT09dHlwZW9mIHd8fCJ1bmRlZmluZWQiPT09dHlwZW9mIHcubW9kdWxlfHwib2JqZWN0IiE9PV90eXBlb2Yody5tb2R1bGUuZXhwb3J0cykpJiZ3LmRlZmluZSYmImZ1bmN0aW9uIj09PXR5cGVvZiB3LmRlZmluZSYmdy5kZWZpbmUuYW1kJiZ3LmRlZmluZShNdCk7J3VuZGVmaW5lZCchPT10eXBlb2YgbW9kdWxlJiYnb2JqZWN0Jz09PV90eXBlb2YobW9kdWxlLmV4cG9ydHMpJiYobW9kdWxlLmV4cG9ydHM9J3VuZGVmaW5lZCchPT10eXBlb2YgZ2xvYmFsP2dsb2JhbC5nbzpzZWxmLmdvKTt9KSgpOw=="},null]}
|