diff --git a/PotreeConverter/resources/page_template/build/js/laslaz.js b/PotreeConverter/resources/page_template/build/js/laslaz.js index 0e93824d..b7e47d73 100644 --- a/PotreeConverter/resources/page_template/build/js/laslaz.js +++ b/PotreeConverter/resources/page_template/build/js/laslaz.js @@ -1,2 +1,2 @@ Potree.workers.laslaz = new Potree.WorkerManager(atob("dmFyIE1vZHVsZTtpZighTW9kdWxlKU1vZHVsZT0odHlwZW9mIE1vZHVsZSE9PSJ1bmRlZmluZWQiP01vZHVsZTpudWxsKXx8e307dmFyIG1vZHVsZU92ZXJyaWRlcz17fTtmb3IodmFyIGtleSBpbiBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyIEVOVklST05NRU5UX0lTX05PREU9dHlwZW9mIHByb2Nlc3M9PT0ib2JqZWN0IiYmdHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iO3ZhciBFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PSJvYmplY3QiO3ZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVI9dHlwZW9mIGltcG9ydFNjcmlwdHM9PT0iZnVuY3Rpb24iO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZighTW9kdWxlWyJwcmludCJdKU1vZHVsZVsicHJpbnQiXT1mdW5jdGlvbiBwcmludCh4KXtwcm9jZXNzWyJzdGRvdXQiXS53cml0ZSh4KyJcbiIpfTtpZighTW9kdWxlWyJwcmludEVyciJdKU1vZHVsZVsicHJpbnRFcnIiXT1mdW5jdGlvbiBwcmludEVycih4KXtwcm9jZXNzWyJzdGRlcnIiXS53cml0ZSh4KyJcbiIpfTt2YXIgbm9kZUZTPXJlcXVpcmUoImZzIik7dmFyIG5vZGVQYXRoPXJlcXVpcmUoInBhdGgiKTtNb2R1bGVbInJlYWQiXT1mdW5jdGlvbiByZWFkKGZpbGVuYW1lLGJpbmFyeSl7ZmlsZW5hbWU9bm9kZVBhdGhbIm5vcm1hbGl6ZSJdKGZpbGVuYW1lKTt2YXIgcmV0PW5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUpO2lmKCFyZXQmJmZpbGVuYW1lIT1ub2RlUGF0aFsicmVzb2x2ZSJdKGZpbGVuYW1lKSl7ZmlsZW5hbWU9cGF0aC5qb2luKF9fZGlybmFtZSwiLi4iLCJzcmMiLGZpbGVuYW1lKTtyZXQ9bm9kZUZTWyJyZWFkRmlsZVN5bmMiXShmaWxlbmFtZSl9aWYocmV0JiYhYmluYXJ5KXJldD1yZXQudG9TdHJpbmcoKTtyZXR1cm4gcmV0fTtNb2R1bGVbInJlYWRCaW5hcnkiXT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXtyZXR1cm4gTW9kdWxlWyJyZWFkIl0oZmlsZW5hbWUsdHJ1ZSl9O01vZHVsZVsibG9hZCJdPWZ1bmN0aW9uIGxvYWQoZil7Z2xvYmFsRXZhbChyZWFkKGYpKX07TW9kdWxlWyJhcmd1bWVudHMiXT1wcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7bW9kdWxlWyJleHBvcnRzIl09TW9kdWxlfWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKCFNb2R1bGVbInByaW50Il0pTW9kdWxlWyJwcmludCJdPXByaW50O2lmKHR5cGVvZiBwcmludEVyciE9InVuZGVmaW5lZCIpTW9kdWxlWyJwcmludEVyciJdPXByaW50RXJyO2lmKHR5cGVvZiByZWFkIT0idW5kZWZpbmVkIil7TW9kdWxlWyJyZWFkIl09cmVhZH1lbHNle01vZHVsZVsicmVhZCJdPWZ1bmN0aW9uIHJlYWQoKXt0aHJvdyJubyByZWFkKCkgYXZhaWxhYmxlIChqc2M/KSJ9fU1vZHVsZVsicmVhZEJpbmFyeSJdPWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7cmV0dXJuIHJlYWQoZiwiYmluYXJ5Iil9O2lmKHR5cGVvZiBzY3JpcHRBcmdzIT0idW5kZWZpbmVkIil7TW9kdWxlWyJhcmd1bWVudHMiXT1zY3JpcHRBcmdzfWVsc2UgaWYodHlwZW9mIGFyZ3VtZW50cyE9InVuZGVmaW5lZCIpe01vZHVsZVsiYXJndW1lbnRzIl09YXJndW1lbnRzfXRoaXNbIk1vZHVsZSJdPU1vZHVsZTtldmFsKCJpZiAodHlwZW9mIGdjID09PSAnZnVuY3Rpb24nICYmIGdjLnRvU3RyaW5nKCkuaW5kZXhPZignW25hdGl2ZSBjb2RlXScpID4gMCkgdmFyIGdjID0gdW5kZWZpbmVkIil9ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7TW9kdWxlWyJyZWFkIl09ZnVuY3Rpb24gcmVhZCh1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKHR5cGVvZiBhcmd1bWVudHMhPSJ1bmRlZmluZWQiKXtNb2R1bGVbImFyZ3VtZW50cyJdPWFyZ3VtZW50c31pZih0eXBlb2YgY29uc29sZSE9PSJ1bmRlZmluZWQiKXtpZighTW9kdWxlWyJwcmludCJdKU1vZHVsZVsicHJpbnQiXT1mdW5jdGlvbiBwcmludCh4KXt9O2lmKCFNb2R1bGVbInByaW50RXJyIl0pTW9kdWxlWyJwcmludEVyciJdPWZ1bmN0aW9uIHByaW50RXJyKHgpe319ZWxzZXt2YXIgVFJZX1VTRV9EVU1QPWZhbHNlO2lmKCFNb2R1bGVbInByaW50Il0pTW9kdWxlWyJwcmludCJdPVRSWV9VU0VfRFVNUCYmdHlwZW9mIGR1bXAhPT0idW5kZWZpbmVkIj8oZnVuY3Rpb24oeCl7ZHVtcCh4KX0pOihmdW5jdGlvbih4KXt9KX1pZihFTlZJUk9OTUVOVF9JU19XRUIpe3dpbmRvd1siTW9kdWxlIl09TW9kdWxlfWVsc2V7TW9kdWxlWyJsb2FkIl09aW1wb3J0U2NyaXB0c319ZWxzZXt0aHJvdyJVbmtub3duIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFdoZXJlIGFyZSB3ZT8ifWZ1bmN0aW9uIGdsb2JhbEV2YWwoeCl7ZXZhbC5jYWxsKG51bGwseCl9aWYoIU1vZHVsZVsibG9hZCJdPT0idW5kZWZpbmVkIiYmTW9kdWxlWyJyZWFkIl0pe01vZHVsZVsibG9hZCJdPWZ1bmN0aW9uIGxvYWQoZil7Z2xvYmFsRXZhbChNb2R1bGVbInJlYWQiXShmKSl9fWlmKCFNb2R1bGVbInByaW50Il0pe01vZHVsZVsicHJpbnQiXT0oZnVuY3Rpb24oKXt9KX1pZighTW9kdWxlWyJwcmludEVyciJdKXtNb2R1bGVbInByaW50RXJyIl09TW9kdWxlWyJwcmludCJdfWlmKCFNb2R1bGVbImFyZ3VtZW50cyJdKXtNb2R1bGVbImFyZ3VtZW50cyJdPVtdfU1vZHVsZS5wcmludD1Nb2R1bGVbInByaW50Il07TW9kdWxlLnByaW50RXJyPU1vZHVsZVsicHJpbnRFcnIiXTtNb2R1bGVbInByZVJ1biJdPVtdO01vZHVsZVsicG9zdFJ1biJdPVtdO2Zvcih2YXIga2V5IGluIG1vZHVsZU92ZXJyaWRlcyl7aWYobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpe01vZHVsZVtrZXldPW1vZHVsZU92ZXJyaWRlc1trZXldfX12YXIgUnVudGltZT17c2V0VGVtcFJldDA6KGZ1bmN0aW9uKHZhbHVlKXt0ZW1wUmV0MD12YWx1ZX0pLGdldFRlbXBSZXQwOihmdW5jdGlvbigpe3JldHVybiB0ZW1wUmV0MH0pLHN0YWNrU2F2ZTooZnVuY3Rpb24oKXtyZXR1cm4gU1RBQ0tUT1B9KSxzdGFja1Jlc3RvcmU6KGZ1bmN0aW9uKHN0YWNrVG9wKXtTVEFDS1RPUD1zdGFja1RvcH0pLGZvcmNlQWxpZ246KGZ1bmN0aW9uKHRhcmdldCxxdWFudHVtKXtxdWFudHVtPXF1YW50dW18fDQ7aWYocXVhbnR1bT09MSlyZXR1cm4gdGFyZ2V0O2lmKGlzTnVtYmVyKHRhcmdldCkmJmlzTnVtYmVyKHF1YW50dW0pKXtyZXR1cm4gTWF0aC5jZWlsKHRhcmdldC9xdWFudHVtKSpxdWFudHVtfWVsc2UgaWYoaXNOdW1iZXIocXVhbnR1bSkmJmlzUG93ZXJPZlR3byhxdWFudHVtKSl7cmV0dXJuIigoKCIrdGFyZ2V0KyIpKyIrKHF1YW50dW0tMSkrIikmIisgLXF1YW50dW0rIikifXJldHVybiJNYXRoLmNlaWwoKCIrdGFyZ2V0KyIpLyIrcXVhbnR1bSsiKSoiK3F1YW50dW19KSxpc051bWJlclR5cGU6KGZ1bmN0aW9uKHR5cGUpe3JldHVybiB0eXBlIGluIFJ1bnRpbWUuSU5UX1RZUEVTfHx0eXBlIGluIFJ1bnRpbWUuRkxPQVRfVFlQRVN9KSxpc1BvaW50ZXJUeXBlOmZ1bmN0aW9uIGlzUG9pbnRlclR5cGUodHlwZSl7cmV0dXJuIHR5cGVbdHlwZS5sZW5ndGgtMV09PSIqIn0saXNTdHJ1Y3RUeXBlOmZ1bmN0aW9uIGlzU3RydWN0VHlwZSh0eXBlKXtpZihpc1BvaW50ZXJUeXBlKHR5cGUpKXJldHVybiBmYWxzZTtpZihpc0FycmF5VHlwZSh0eXBlKSlyZXR1cm4gdHJ1ZTtpZigvPD9ceyA/W159XSogP1x9Pj8vLnRlc3QodHlwZSkpcmV0dXJuIHRydWU7cmV0dXJuIHR5cGVbMF09PSIlIn0sSU5UX1RZUEVTOnsiaTEiOjAsImk4IjowLCJpMTYiOjAsImkzMiI6MCwiaTY0IjowfSxGTE9BVF9UWVBFUzp7ImZsb2F0IjowLCJkb3VibGUiOjB9LG9yNjQ6KGZ1bmN0aW9uKHgseSl7dmFyIGw9eHwwfCh5fDApO3ZhciBoPShNYXRoLnJvdW5kKHgvNDI5NDk2NzI5Nil8TWF0aC5yb3VuZCh5LzQyOTQ5NjcyOTYpKSo0Mjk0OTY3Mjk2O3JldHVybiBsK2h9KSxhbmQ2NDooZnVuY3Rpb24oeCx5KXt2YXIgbD0oeHwwKSYoeXwwKTt2YXIgaD0oTWF0aC5yb3VuZCh4LzQyOTQ5NjcyOTYpJk1hdGgucm91bmQoeS80Mjk0OTY3Mjk2KSkqNDI5NDk2NzI5NjtyZXR1cm4gbCtofSkseG9yNjQ6KGZ1bmN0aW9uKHgseSl7dmFyIGw9KHh8MCleKHl8MCk7dmFyIGg9KE1hdGgucm91bmQoeC80Mjk0OTY3Mjk2KV5NYXRoLnJvdW5kKHkvNDI5NDk2NzI5NikpKjQyOTQ5NjcyOTY7cmV0dXJuIGwraH0pLGdldE5hdGl2ZVR5cGVTaXplOihmdW5jdGlvbih0eXBlKXtzd2l0Y2godHlwZSl7Y2FzZSJpMSI6Y2FzZSJpOCI6cmV0dXJuIDE7Y2FzZSJpMTYiOnJldHVybiAyO2Nhc2UiaTMyIjpyZXR1cm4gNDtjYXNlImk2NCI6cmV0dXJuIDg7Y2FzZSJmbG9hdCI6cmV0dXJuIDQ7Y2FzZSJkb3VibGUiOnJldHVybiA4O2RlZmF1bHQ6e2lmKHR5cGVbdHlwZS5sZW5ndGgtMV09PT0iKiIpe3JldHVybiBSdW50aW1lLlFVQU5UVU1fU0laRX1lbHNlIGlmKHR5cGVbMF09PT0iaSIpe3ZhciBiaXRzPXBhcnNlSW50KHR5cGUuc3Vic3RyKDEpKTthc3NlcnQoYml0cyU4PT09MCk7cmV0dXJuIGJpdHMvOH1lbHNle3JldHVybiAwfX19fSksZ2V0TmF0aXZlRmllbGRTaXplOihmdW5jdGlvbih0eXBlKXtyZXR1cm4gTWF0aC5tYXgoUnVudGltZS5nZXROYXRpdmVUeXBlU2l6ZSh0eXBlKSxSdW50aW1lLlFVQU5UVU1fU0laRSl9KSxkZWR1cDpmdW5jdGlvbiBkZWR1cChpdGVtcyxpZGVudCl7dmFyIHNlZW49e307aWYoaWRlbnQpe3JldHVybiBpdGVtcy5maWx0ZXIoKGZ1bmN0aW9uKGl0ZW0pe2lmKHNlZW5baXRlbVtpZGVudF1dKXJldHVybiBmYWxzZTtzZWVuW2l0ZW1baWRlbnRdXT10cnVlO3JldHVybiB0cnVlfSkpfWVsc2V7cmV0dXJuIGl0ZW1zLmZpbHRlcigoZnVuY3Rpb24oaXRlbSl7aWYoc2VlbltpdGVtXSlyZXR1cm4gZmFsc2U7c2VlbltpdGVtXT10cnVlO3JldHVybiB0cnVlfSkpfX0sc2V0OmZ1bmN0aW9uIHNldCgpe3ZhciBhcmdzPXR5cGVvZiBhcmd1bWVudHNbMF09PT0ib2JqZWN0Ij9hcmd1bWVudHNbMF06YXJndW1lbnRzO3ZhciByZXQ9e307Zm9yKHZhciBpPTA7aTxhcmdzLmxlbmd0aDtpKyspe3JldFthcmdzW2ldXT0wfXJldHVybiByZXR9LFNUQUNLX0FMSUdOOjgsZ2V0QWxpZ25TaXplOihmdW5jdGlvbih0eXBlLHNpemUsdmFyYXJnKXtpZighdmFyYXJnJiYodHlwZT09Imk2NCJ8fHR5cGU9PSJkb3VibGUiKSlyZXR1cm4gODtpZighdHlwZSlyZXR1cm4gTWF0aC5taW4oc2l6ZSw4KTtyZXR1cm4gTWF0aC5taW4oc2l6ZXx8KHR5cGU/UnVudGltZS5nZXROYXRpdmVGaWVsZFNpemUodHlwZSk6MCksUnVudGltZS5RVUFOVFVNX1NJWkUpfSksY2FsY3VsYXRlU3RydWN0QWxpZ25tZW50OmZ1bmN0aW9uIGNhbGN1bGF0ZVN0cnVjdEFsaWdubWVudCh0eXBlKXt0eXBlLmZsYXRTaXplPTA7dHlwZS5hbGlnblNpemU9MDt2YXIgZGlmZnM9W107dmFyIHByZXY9LTE7dmFyIGluZGV4PTA7dHlwZS5mbGF0SW5kZXhlcz10eXBlLmZpZWxkcy5tYXAoKGZ1bmN0aW9uKGZpZWxkKXtpbmRleCsrO3ZhciBzaXplLGFsaWduU2l6ZTtpZihSdW50aW1lLmlzTnVtYmVyVHlwZShmaWVsZCl8fFJ1bnRpbWUuaXNQb2ludGVyVHlwZShmaWVsZCkpe3NpemU9UnVudGltZS5nZXROYXRpdmVUeXBlU2l6ZShmaWVsZCk7YWxpZ25TaXplPVJ1bnRpbWUuZ2V0QWxpZ25TaXplKGZpZWxkLHNpemUpfWVsc2UgaWYoUnVudGltZS5pc1N0cnVjdFR5cGUoZmllbGQpKXtpZihmaWVsZFsxXT09PSIwIil7c2l6ZT0wO2lmKFR5cGVzLnR5cGVzW2ZpZWxkXSl7YWxpZ25TaXplPVJ1bnRpbWUuZ2V0QWxpZ25TaXplKG51bGwsVHlwZXMudHlwZXNbZmllbGRdLmFsaWduU2l6ZSl9ZWxzZXthbGlnblNpemU9dHlwZS5hbGlnblNpemV8fFFVQU5UVU1fU0laRX19ZWxzZXtzaXplPVR5cGVzLnR5cGVzW2ZpZWxkXS5mbGF0U2l6ZTthbGlnblNpemU9UnVudGltZS5nZXRBbGlnblNpemUobnVsbCxUeXBlcy50eXBlc1tmaWVsZF0uYWxpZ25TaXplKX19ZWxzZSBpZihmaWVsZFswXT09ImIiKXtzaXplPWZpZWxkLnN1YnN0cigxKXwwO2FsaWduU2l6ZT0xfWVsc2UgaWYoZmllbGRbMF09PT0iPCIpe3NpemU9YWxpZ25TaXplPVR5cGVzLnR5cGVzW2ZpZWxkXS5mbGF0U2l6ZX1lbHNlIGlmKGZpZWxkWzBdPT09ImkiKXtzaXplPWFsaWduU2l6ZT1wYXJzZUludChmaWVsZC5zdWJzdHIoMSkpLzg7YXNzZXJ0KHNpemUlMT09PTAsImNhbm5vdCBoYW5kbGUgbm9uLWJ5dGUtc2l6ZSBmaWVsZCAiK2ZpZWxkKX1lbHNle2Fzc2VydChmYWxzZSwiaW52YWxpZCB0eXBlIGZvciBjYWxjdWxhdGVTdHJ1Y3RBbGlnbm1lbnQiKX1pZih0eXBlLnBhY2tlZClhbGlnblNpemU9MTt0eXBlLmFsaWduU2l6ZT1NYXRoLm1heCh0eXBlLmFsaWduU2l6ZSxhbGlnblNpemUpO3ZhciBjdXJyPVJ1bnRpbWUuYWxpZ25NZW1vcnkodHlwZS5mbGF0U2l6ZSxhbGlnblNpemUpO3R5cGUuZmxhdFNpemU9Y3VycitzaXplO2lmKHByZXY+PTApe2RpZmZzLnB1c2goY3Vyci1wcmV2KX1wcmV2PWN1cnI7cmV0dXJuIGN1cnJ9KSk7aWYodHlwZS5uYW1lXyYmdHlwZS5uYW1lX1swXT09PSJbIil7dHlwZS5mbGF0U2l6ZT1wYXJzZUludCh0eXBlLm5hbWVfLnN1YnN0cigxKSkqdHlwZS5mbGF0U2l6ZS8yfXR5cGUuZmxhdFNpemU9UnVudGltZS5hbGlnbk1lbW9yeSh0eXBlLmZsYXRTaXplLHR5cGUuYWxpZ25TaXplKTtpZihkaWZmcy5sZW5ndGg9PTApe3R5cGUuZmxhdEZhY3Rvcj10eXBlLmZsYXRTaXplfWVsc2UgaWYoUnVudGltZS5kZWR1cChkaWZmcykubGVuZ3RoPT0xKXt0eXBlLmZsYXRGYWN0b3I9ZGlmZnNbMF19dHlwZS5uZWVkc0ZsYXR0ZW5pbmc9dHlwZS5mbGF0RmFjdG9yIT0xO3JldHVybiB0eXBlLmZsYXRJbmRleGVzfSxnZW5lcmF0ZVN0cnVjdEluZm86KGZ1bmN0aW9uKHN0cnVjdCx0eXBlTmFtZSxvZmZzZXQpe3ZhciB0eXBlLGFsaWdubWVudDtpZih0eXBlTmFtZSl7b2Zmc2V0PW9mZnNldHx8MDt0eXBlPSh0eXBlb2YgVHlwZXM9PT0idW5kZWZpbmVkIj9SdW50aW1lLnR5cGVJbmZvOlR5cGVzLnR5cGVzKVt0eXBlTmFtZV07aWYoIXR5cGUpcmV0dXJuIG51bGw7aWYodHlwZS5maWVsZHMubGVuZ3RoIT1zdHJ1Y3QubGVuZ3RoKXtwcmludEVycigiTnVtYmVyIG9mIG5hbWVkIGZpZWxkcyBtdXN0IG1hdGNoIHRoZSB0eXBlIGZvciAiK3R5cGVOYW1lKyI6IHBvc3NpYmx5IGR1cGxpY2F0ZSBzdHJ1Y3QgbmFtZXMuIENhbm5vdCByZXR1cm4gc3RydWN0SW5mbyIpO3JldHVybiBudWxsfWFsaWdubWVudD10eXBlLmZsYXRJbmRleGVzfWVsc2V7dmFyIHR5cGU9e2ZpZWxkczpzdHJ1Y3QubWFwKChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbVswXX0pKX07YWxpZ25tZW50PVJ1bnRpbWUuY2FsY3VsYXRlU3RydWN0QWxpZ25tZW50KHR5cGUpfXZhciByZXQ9e19fc2l6ZV9fOnR5cGUuZmxhdFNpemV9O2lmKHR5cGVOYW1lKXtzdHJ1Y3QuZm9yRWFjaCgoZnVuY3Rpb24oaXRlbSxpKXtpZih0eXBlb2YgaXRlbT09PSJzdHJpbmciKXtyZXRbaXRlbV09YWxpZ25tZW50W2ldK29mZnNldH1lbHNle3ZhciBrZXk7Zm9yKHZhciBrIGluIGl0ZW0pa2V5PWs7cmV0W2tleV09UnVudGltZS5nZW5lcmF0ZVN0cnVjdEluZm8oaXRlbVtrZXldLHR5cGUuZmllbGRzW2ldLGFsaWdubWVudFtpXSl9fSkpfWVsc2V7c3RydWN0LmZvckVhY2goKGZ1bmN0aW9uKGl0ZW0saSl7cmV0W2l0ZW1bMV1dPWFsaWdubWVudFtpXX0pKX1yZXR1cm4gcmV0fSksZHluQ2FsbDooZnVuY3Rpb24oc2lnLHB0cixhcmdzKXtpZihhcmdzJiZhcmdzLmxlbmd0aCl7aWYoIWFyZ3Muc3BsaWNlKWFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7YXJncy5zcGxpY2UoMCwwLHB0cik7cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF8iK3NpZ10uYXBwbHkobnVsbCxhcmdzKX1lbHNle3JldHVybiBNb2R1bGVbImR5bkNhbGxfIitzaWddLmNhbGwobnVsbCxwdHIpfX0pLGZ1bmN0aW9uUG9pbnRlcnM6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLGFkZEZ1bmN0aW9uOihmdW5jdGlvbihmdW5jKXtmb3IodmFyIGk9MDtpPFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVycy5sZW5ndGg7aSsrKXtpZighUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2ldKXtSdW50aW1lLmZ1bmN0aW9uUG9pbnRlcnNbaV09ZnVuYztyZXR1cm4gMiooMStpKX19dGhyb3ciRmluaXNoZWQgdXAgYWxsIHJlc2VydmVkIGZ1bmN0aW9uIHBvaW50ZXJzLiBVc2UgYSBoaWdoZXIgdmFsdWUgZm9yIFJFU0VSVkVEX0ZVTkNUSU9OX1BPSU5URVJTLiJ9KSxyZW1vdmVGdW5jdGlvbjooZnVuY3Rpb24oaW5kZXgpe1J1bnRpbWUuZnVuY3Rpb25Qb2ludGVyc1soaW5kZXgtMikvMl09bnVsbH0pLGdldEFzbUNvbnN0OihmdW5jdGlvbihjb2RlLG51bUFyZ3Mpe2lmKCFSdW50aW1lLmFzbUNvbnN0Q2FjaGUpUnVudGltZS5hc21Db25zdENhY2hlPXt9O3ZhciBmdW5jPVJ1bnRpbWUuYXNtQ29uc3RDYWNoZVtjb2RlXTtpZihmdW5jKXJldHVybiBmdW5jO3ZhciBhcmdzPVtdO2Zvcih2YXIgaT0wO2k8bnVtQXJncztpKyspe2FyZ3MucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDM2KStpKX12YXIgc291cmNlPVBvaW50ZXJfc3RyaW5naWZ5KGNvZGUpO2lmKHNvdXJjZVswXT09PSciJyl7aWYoc291cmNlLmluZGV4T2YoJyInLDEpPT09c291cmNlLmxlbmd0aC0xKXtzb3VyY2U9c291cmNlLnN1YnN0cigxLHNvdXJjZS5sZW5ndGgtMil9ZWxzZXthYm9ydCgiaW52YWxpZCBFTV9BU00gaW5wdXQgfCIrc291cmNlKyJ8LiBQbGVhc2UgdXNlIEVNX0FTTSguLmNvZGUuLikgKG5vIHF1b3Rlcykgb3IgRU1fQVNNKHsgLi5jb2RlKCQwKS4uIH0sIGlucHV0KSAodG8gaW5wdXQgdmFsdWVzKSIpfX10cnl7dmFyIGV2YWxsZWQ9ZXZhbCgiKGZ1bmN0aW9uKCIrYXJncy5qb2luKCIsIikrIil7ICIrc291cmNlKyIgfSkiKX1jYXRjaChlKXtNb2R1bGUucHJpbnRFcnIoImVycm9yIGluIGV4ZWN1dGluZyBpbmxpbmUgRU1fQVNNIGNvZGU6ICIrZSsiIG9uOiBcblxuIitzb3VyY2UrIlxuXG53aXRoIGFyZ3MgfCIrYXJncysifCAobWFrZSBzdXJlIHRvIHVzZSB0aGUgcmlnaHQgb25lIG91dCBvZiBFTV9BU00sIEVNX0FTTV9BUkdTLCBldGMuKSIpO3Rocm93IGV9cmV0dXJuIFJ1bnRpbWUuYXNtQ29uc3RDYWNoZVtjb2RlXT1ldmFsbGVkfSksd2Fybk9uY2U6KGZ1bmN0aW9uKHRleHQpe2lmKCFSdW50aW1lLndhcm5PbmNlLnNob3duKVJ1bnRpbWUud2Fybk9uY2Uuc2hvd249e307aWYoIVJ1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF0pe1J1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF09MTtNb2R1bGUucHJpbnRFcnIodGV4dCl9fSksZnVuY1dyYXBwZXJzOnt9LGdldEZ1bmNXcmFwcGVyOihmdW5jdGlvbihmdW5jLHNpZyl7YXNzZXJ0KHNpZyk7aWYoIVJ1bnRpbWUuZnVuY1dyYXBwZXJzW2Z1bmNdKXtSdW50aW1lLmZ1bmNXcmFwcGVyc1tmdW5jXT1mdW5jdGlvbiBkeW5DYWxsX3dyYXBwZXIoKXtyZXR1cm4gUnVudGltZS5keW5DYWxsKHNpZyxmdW5jLGFyZ3VtZW50cyl9fXJldHVybiBSdW50aW1lLmZ1bmNXcmFwcGVyc1tmdW5jXX0pLFVURjhQcm9jZXNzb3I6KGZ1bmN0aW9uKCl7dmFyIGJ1ZmZlcj1bXTt2YXIgbmVlZGVkPTA7dGhpcy5wcm9jZXNzQ0NoYXI9KGZ1bmN0aW9uKGNvZGUpe2NvZGU9Y29kZSYyNTU7aWYoYnVmZmVyLmxlbmd0aD09MCl7aWYoKGNvZGUmMTI4KT09MCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSl9YnVmZmVyLnB1c2goY29kZSk7aWYoKGNvZGUmMjI0KT09MTkyKXtuZWVkZWQ9MX1lbHNlIGlmKChjb2RlJjI0MCk9PTIyNCl7bmVlZGVkPTJ9ZWxzZXtuZWVkZWQ9M31yZXR1cm4iIn1pZihuZWVkZWQpe2J1ZmZlci5wdXNoKGNvZGUpO25lZWRlZC0tO2lmKG5lZWRlZD4wKXJldHVybiIifXZhciBjMT1idWZmZXJbMF07dmFyIGMyPWJ1ZmZlclsxXTt2YXIgYzM9YnVmZmVyWzJdO3ZhciBjND1idWZmZXJbM107dmFyIHJldDtpZihidWZmZXIubGVuZ3RoPT0yKXtyZXQ9U3RyaW5nLmZyb21DaGFyQ29kZSgoYzEmMzEpPDw2fGMyJjYzKX1lbHNlIGlmKGJ1ZmZlci5sZW5ndGg9PTMpe3JldD1TdHJpbmcuZnJvbUNoYXJDb2RlKChjMSYxNSk8PDEyfChjMiY2Myk8PDZ8YzMmNjMpfWVsc2V7dmFyIGNvZGVQb2ludD0oYzEmNyk8PDE4fChjMiY2Myk8PDEyfChjMyY2Myk8PDZ8YzQmNjM7cmV0PVN0cmluZy5mcm9tQ2hhckNvZGUoTWF0aC5mbG9vcigoY29kZVBvaW50LTY1NTM2KS8xMDI0KSs1NTI5NiwoY29kZVBvaW50LTY1NTM2KSUxMDI0KzU2MzIwKX1idWZmZXIubGVuZ3RoPTA7cmV0dXJuIHJldH0pO3RoaXMucHJvY2Vzc0pTU3RyaW5nPWZ1bmN0aW9uIHByb2Nlc3NKU1N0cmluZyhzdHJpbmcpe3N0cmluZz11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nKSk7dmFyIHJldD1bXTtmb3IodmFyIGk9MDtpPHN0cmluZy5sZW5ndGg7aSsrKXtyZXQucHVzaChzdHJpbmcuY2hhckNvZGVBdChpKSl9cmV0dXJuIHJldH19KSxnZXRDb21waWxlclNldHRpbmc6KGZ1bmN0aW9uKG5hbWUpe3Rocm93IllvdSBtdXN0IGJ1aWxkIHdpdGggLXMgUkVUQUlOX0NPTVBJTEVSX1NFVFRJTkdTPTEgZm9yIFJ1bnRpbWUuZ2V0Q29tcGlsZXJTZXR0aW5nIG9yIGVtc2NyaXB0ZW5fZ2V0X2NvbXBpbGVyX3NldHRpbmcgdG8gd29yayJ9KSxzdGFja0FsbG9jOihmdW5jdGlvbihzaXplKXt2YXIgcmV0PVNUQUNLVE9QO1NUQUNLVE9QPVNUQUNLVE9QK3NpemV8MDtTVEFDS1RPUD1TVEFDS1RPUCs3Ji04O3JldHVybiByZXR9KSxzdGF0aWNBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyIHJldD1TVEFUSUNUT1A7U1RBVElDVE9QPVNUQVRJQ1RPUCtzaXplfDA7U1RBVElDVE9QPVNUQVRJQ1RPUCs3Ji04O3JldHVybiByZXR9KSxkeW5hbWljQWxsb2M6KGZ1bmN0aW9uKHNpemUpe3ZhciByZXQ9RFlOQU1JQ1RPUDtEWU5BTUlDVE9QPURZTkFNSUNUT1Arc2l6ZXwwO0RZTkFNSUNUT1A9RFlOQU1JQ1RPUCs3Ji04O2lmKERZTkFNSUNUT1A+PVRPVEFMX01FTU9SWSllbmxhcmdlTWVtb3J5KCk7cmV0dXJuIHJldH0pLGFsaWduTWVtb3J5OihmdW5jdGlvbihzaXplLHF1YW50dW0pe3ZhciByZXQ9c2l6ZT1NYXRoLmNlaWwoc2l6ZS8ocXVhbnR1bT9xdWFudHVtOjgpKSoocXVhbnR1bT9xdWFudHVtOjgpO3JldHVybiByZXR9KSxtYWtlQmlnSW50OihmdW5jdGlvbihsb3csaGlnaCx1bnNpZ25lZCl7dmFyIHJldD11bnNpZ25lZD8rKGxvdz4+PjApKyArKGhpZ2g+Pj4wKSorNDI5NDk2NzI5NjorKGxvdz4+PjApKyArKGhpZ2h8MCkqKzQyOTQ5NjcyOTY7cmV0dXJuIHJldH0pLEdMT0JBTF9CQVNFOjgsUVVBTlRVTV9TSVpFOjQsX19kdW1teV9fOjB9O01vZHVsZVsiUnVudGltZSJdPVJ1bnRpbWU7ZnVuY3Rpb24ganNDYWxsKCl7dmFyIGFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2FyZ3NbMF1dLmFwcGx5KG51bGwsYXJncy5zbGljZSgxKSl9dmFyIF9fVEhSRVdfXz0wO3ZhciBBQk9SVD1mYWxzZTt2YXIgRVhJVFNUQVRVUz0wO3ZhciB1bmRlZj0wO3ZhciB0ZW1wVmFsdWUsdGVtcEludCx0ZW1wQmlnSW50LHRlbXBJbnQyLHRlbXBCaWdJbnQyLHRlbXBQYWlyLHRlbXBCaWdJbnRJLHRlbXBCaWdJbnRSLHRlbXBCaWdJbnRTLHRlbXBCaWdJbnRQLHRlbXBCaWdJbnRELHRlbXBEb3VibGUsdGVtcEZsb2F0O3ZhciB0ZW1wSTY0LHRlbXBJNjRiO3ZhciB0ZW1wUmV0MCx0ZW1wUmV0MSx0ZW1wUmV0Mix0ZW1wUmV0Myx0ZW1wUmV0NCx0ZW1wUmV0NSx0ZW1wUmV0Nix0ZW1wUmV0Nyx0ZW1wUmV0OCx0ZW1wUmV0OTtmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiK3RleHQpfX12YXIgZ2xvYmFsU2NvcGU9dGhpcztmdW5jdGlvbiBnZXRDRnVuYyhpZGVudCl7dHJ5e3ZhciBmdW5jPU1vZHVsZVsiXyIraWRlbnRdO2lmKCFmdW5jKWZ1bmM9ZXZhbCgiXyIraWRlbnQpfWNhdGNoKGUpe31hc3NlcnQoZnVuYywiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiAiK2lkZW50KyIgKHBlcmhhcHMgTExWTSBvcHRpbWl6YXRpb25zIG9yIGNsb3N1cmUgcmVtb3ZlZCBpdD8pIik7cmV0dXJuIGZ1bmN9dmFyIGN3cmFwLGNjYWxsOygoZnVuY3Rpb24oKXt2YXIgc3RhY2s9MDt2YXIgSlNmdW5jcz17InN0YWNrU2F2ZSI6KGZ1bmN0aW9uKCl7c3RhY2s9UnVudGltZS5zdGFja1NhdmUoKX0pLCJzdGFja1Jlc3RvcmUiOihmdW5jdGlvbigpe1J1bnRpbWUuc3RhY2tSZXN0b3JlKHN0YWNrKX0pLCJhcnJheVRvQyI6KGZ1bmN0aW9uKGFycil7dmFyIHJldD1SdW50aW1lLnN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVybiByZXR9KSwic3RyaW5nVG9DIjooZnVuY3Rpb24oc3RyKXt2YXIgcmV0PTA7aWYoc3RyIT09bnVsbCYmc3RyIT09dW5kZWZpbmVkJiZzdHIhPT0wKXtyZXQ9UnVudGltZS5zdGFja0FsbG9jKHN0ci5sZW5ndGgrMSk7d3JpdGVTdHJpbmdUb01lbW9yeShzdHIscmV0KX1yZXR1cm4gcmV0fSl9O3ZhciB0b0M9eyJzdHJpbmciOkpTZnVuY3NbInN0cmluZ1RvQyJdLCJhcnJheSI6SlNmdW5jc1siYXJyYXlUb0MiXX07Y2NhbGw9ZnVuY3Rpb24gY2NhbGxGdW5jKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyl7dmFyIGZ1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBjQXJncz1bXTtpZihhcmdzKXtmb3IodmFyIGk9MDtpPGFyZ3MubGVuZ3RoO2krKyl7dmFyIGNvbnZlcnRlcj10b0NbYXJnVHlwZXNbaV1dO2lmKGNvbnZlcnRlcil7aWYoc3RhY2s9PT0wKXN0YWNrPVJ1bnRpbWUuc3RhY2tTYXZlKCk7Y0FyZ3NbaV09Y29udmVydGVyKGFyZ3NbaV0pfWVsc2V7Y0FyZ3NbaV09YXJnc1tpXX19fXZhciByZXQ9ZnVuYy5hcHBseShudWxsLGNBcmdzKTtpZihyZXR1cm5UeXBlPT09InN0cmluZyIpcmV0PVBvaW50ZXJfc3RyaW5naWZ5KHJldCk7aWYoc3RhY2shPT0wKUpTZnVuY3NbInN0YWNrUmVzdG9yZSJdKCk7cmV0dXJuIHJldH07dmFyIHNvdXJjZVJlZ2V4PS9eZnVuY3Rpb25cc1woKFteKV0qKVwpXHMqe1xzKihbXipdKj8pW1xzO10qKD86cmV0dXJuXHMqKC4qPylbO1xzXSopP30kLztmdW5jdGlvbiBwYXJzZUpTRnVuYyhqc2Z1bmMpe3ZhciBwYXJzZWQ9anNmdW5jLnRvU3RyaW5nKCkubWF0Y2goc291cmNlUmVnZXgpLnNsaWNlKDEpO3JldHVybnthcmd1bWVudHM6cGFyc2VkWzBdLGJvZHk6cGFyc2VkWzFdLHJldHVyblZhbHVlOnBhcnNlZFsyXX19dmFyIEpTc291cmNlPXt9O2Zvcih2YXIgZnVuIGluIEpTZnVuY3Mpe2lmKEpTZnVuY3MuaGFzT3duUHJvcGVydHkoZnVuKSl7SlNzb3VyY2VbZnVuXT1wYXJzZUpTRnVuYyhKU2Z1bmNzW2Z1bl0pfX1jd3JhcD1mdW5jdGlvbiBjd3JhcChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzKXt2YXIgY2Z1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBudW1lcmljQXJncz1hcmdUeXBlcy5ldmVyeSgoZnVuY3Rpb24odHlwZSl7cmV0dXJuIHR5cGU9PT0ibnVtYmVyIn0pKTt2YXIgbnVtZXJpY1JldD1yZXR1cm5UeXBlIT09InN0cmluZyI7aWYobnVtZXJpY1JldCYmbnVtZXJpY0FyZ3Mpe3JldHVybiBjZnVuY312YXIgYXJnTmFtZXM9YXJnVHlwZXMubWFwKChmdW5jdGlvbih4LGkpe3JldHVybiIkIitpfSkpO3ZhciBmdW5jc3RyPSIoZnVuY3Rpb24oIithcmdOYW1lcy5qb2luKCIsIikrIikgeyI7dmFyIG5hcmdzPWFyZ1R5cGVzLmxlbmd0aDtpZighbnVtZXJpY0FyZ3Mpe2Z1bmNzdHIrPUpTc291cmNlWyJzdGFja1NhdmUiXS5ib2R5KyI7Ijtmb3IodmFyIGk9MDtpPG5hcmdzO2krKyl7dmFyIGFyZz1hcmdOYW1lc1tpXSx0eXBlPWFyZ1R5cGVzW2ldO2lmKHR5cGU9PT0ibnVtYmVyIiljb250aW51ZTt2YXIgY29udmVydENvZGU9SlNzb3VyY2VbdHlwZSsiVG9DIl07ZnVuY3N0cis9InZhciAiK2NvbnZlcnRDb2RlLmFyZ3VtZW50cysiID0gIithcmcrIjsiO2Z1bmNzdHIrPWNvbnZlcnRDb2RlLmJvZHkrIjsiO2Z1bmNzdHIrPWFyZysiPSIrY29udmVydENvZGUucmV0dXJuVmFsdWUrIjsifX12YXIgY2Z1bmNuYW1lPXBhcnNlSlNGdW5jKChmdW5jdGlvbigpe3JldHVybiBjZnVuY30pKS5yZXR1cm5WYWx1ZTtmdW5jc3RyKz0idmFyIHJldCA9ICIrY2Z1bmNuYW1lKyIoIithcmdOYW1lcy5qb2luKCIsIikrIik7IjtpZighbnVtZXJpY1JldCl7dmFyIHN0cmdmeT1wYXJzZUpTRnVuYygoZnVuY3Rpb24oKXtyZXR1cm4gUG9pbnRlcl9zdHJpbmdpZnl9KSkucmV0dXJuVmFsdWU7ZnVuY3N0cis9InJldCA9ICIrc3RyZ2Z5KyIocmV0KTsifWlmKCFudW1lcmljQXJncyl7ZnVuY3N0cis9SlNzb3VyY2VbInN0YWNrUmVzdG9yZSJdLmJvZHkrIjsifWZ1bmNzdHIrPSJyZXR1cm4gcmV0fSkiO3JldHVybiBldmFsKGZ1bmNzdHIpfX0pKSgpO01vZHVsZVsiY3dyYXAiXT1jd3JhcDtNb2R1bGVbImNjYWxsIl09Y2NhbGw7ZnVuY3Rpb24gc2V0VmFsdWUocHRyLHZhbHVlLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fCJpOCI7aWYodHlwZS5jaGFyQXQodHlwZS5sZW5ndGgtMSk9PT0iKiIpdHlwZT0iaTMyIjtzd2l0Y2godHlwZSl7Y2FzZSJpMSI6SEVBUDhbcHRyPj4wXT12YWx1ZTticmVhaztjYXNlImk4IjpIRUFQOFtwdHI+PjBdPXZhbHVlO2JyZWFrO2Nhc2UiaTE2IjpIRUFQMTZbcHRyPj4xXT12YWx1ZTticmVhaztjYXNlImkzMiI6SEVBUDMyW3B0cj4+Ml09dmFsdWU7YnJlYWs7Y2FzZSJpNjQiOnRlbXBJNjQ9W3ZhbHVlPj4+MCwodGVtcERvdWJsZT12YWx1ZSwrTWF0aF9hYnModGVtcERvdWJsZSk+PSsxP3RlbXBEb3VibGU+KzA/KE1hdGhfbWluKCtNYXRoX2Zsb29yKHRlbXBEb3VibGUvKzQyOTQ5NjcyOTYpLCs0Mjk0OTY3Mjk1KXwwKT4+PjA6fn4rTWF0aF9jZWlsKCh0ZW1wRG91YmxlLSArKH5+dGVtcERvdWJsZT4+PjApKS8rNDI5NDk2NzI5Nik+Pj4wOjApXSxIRUFQMzJbcHRyPj4yXT10ZW1wSTY0WzBdLEhFQVAzMltwdHIrND4+Ml09dGVtcEk2NFsxXTticmVhaztjYXNlImZsb2F0IjpIRUFQRjMyW3B0cj4+Ml09dmFsdWU7YnJlYWs7Y2FzZSJkb3VibGUiOkhFQVBGNjRbcHRyPj4zXT12YWx1ZTticmVhaztkZWZhdWx0OmFib3J0KCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiAiK3R5cGUpfX1Nb2R1bGVbInNldFZhbHVlIl09c2V0VmFsdWU7ZnVuY3Rpb24gZ2V0VmFsdWUocHRyLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fCJpOCI7aWYodHlwZS5jaGFyQXQodHlwZS5sZW5ndGgtMSk9PT0iKiIpdHlwZT0iaTMyIjtzd2l0Y2godHlwZSl7Y2FzZSJpMSI6cmV0dXJuIEhFQVA4W3B0cj4+MF07Y2FzZSJpOCI6cmV0dXJuIEhFQVA4W3B0cj4+MF07Y2FzZSJpMTYiOnJldHVybiBIRUFQMTZbcHRyPj4xXTtjYXNlImkzMiI6cmV0dXJuIEhFQVAzMltwdHI+PjJdO2Nhc2UiaTY0IjpyZXR1cm4gSEVBUDMyW3B0cj4+Ml07Y2FzZSJmbG9hdCI6cmV0dXJuIEhFQVBGMzJbcHRyPj4yXTtjYXNlImRvdWJsZSI6cmV0dXJuIEhFQVBGNjRbcHRyPj4zXTtkZWZhdWx0OmFib3J0KCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiAiK3R5cGUpfXJldHVybiBudWxsfU1vZHVsZVsiZ2V0VmFsdWUiXT1nZXRWYWx1ZTt2YXIgQUxMT0NfTk9STUFMPTA7dmFyIEFMTE9DX1NUQUNLPTE7dmFyIEFMTE9DX1NUQVRJQz0yO3ZhciBBTExPQ19EWU5BTUlDPTM7dmFyIEFMTE9DX05PTkU9NDtNb2R1bGVbIkFMTE9DX05PUk1BTCJdPUFMTE9DX05PUk1BTDtNb2R1bGVbIkFMTE9DX1NUQUNLIl09QUxMT0NfU1RBQ0s7TW9kdWxlWyJBTExPQ19TVEFUSUMiXT1BTExPQ19TVEFUSUM7TW9kdWxlWyJBTExPQ19EWU5BTUlDIl09QUxMT0NfRFlOQU1JQztNb2R1bGVbIkFMTE9DX05PTkUiXT1BTExPQ19OT05FO2Z1bmN0aW9uIGFsbG9jYXRlKHNsYWIsdHlwZXMsYWxsb2NhdG9yLHB0cil7dmFyIHplcm9pbml0LHNpemU7aWYodHlwZW9mIHNsYWI9PT0ibnVtYmVyIil7emVyb2luaXQ9dHJ1ZTtzaXplPXNsYWJ9ZWxzZXt6ZXJvaW5pdD1mYWxzZTtzaXplPXNsYWIubGVuZ3RofXZhciBzaW5nbGVUeXBlPXR5cGVvZiB0eXBlcz09PSJzdHJpbmciP3R5cGVzOm51bGw7dmFyIHJldDtpZihhbGxvY2F0b3I9PUFMTE9DX05PTkUpe3JldD1wdHJ9ZWxzZXtyZXQ9W19tYWxsb2MsUnVudGltZS5zdGFja0FsbG9jLFJ1bnRpbWUuc3RhdGljQWxsb2MsUnVudGltZS5keW5hbWljQWxsb2NdW2FsbG9jYXRvcj09PXVuZGVmaW5lZD9BTExPQ19TVEFUSUM6YWxsb2NhdG9yXShNYXRoLm1heChzaXplLHNpbmdsZVR5cGU/MTp0eXBlcy5sZW5ndGgpKX1pZih6ZXJvaW5pdCl7dmFyIHB0cj1yZXQsc3RvcDthc3NlcnQoKHJldCYzKT09MCk7c3RvcD1yZXQrKHNpemUmfjMpO2Zvcig7cHRyPHN0b3A7cHRyKz00KXtIRUFQMzJbcHRyPj4yXT0wfXN0b3A9cmV0K3NpemU7d2hpbGUocHRyPHN0b3Ape0hFQVA4W3B0cisrPj4wXT0wfXJldHVybiByZXR9aWYoc2luZ2xlVHlwZT09PSJpOCIpe2lmKHNsYWIuc3ViYXJyYXl8fHNsYWIuc2xpY2Upe0hFQVBVOC5zZXQoc2xhYixyZXQpfWVsc2V7SEVBUFU4LnNldChuZXcgVWludDhBcnJheShzbGFiKSxyZXQpfXJldHVybiByZXR9dmFyIGk9MCx0eXBlLHR5cGVTaXplLHByZXZpb3VzVHlwZTt3aGlsZShpPHNpemUpe3ZhciBjdXJyPXNsYWJbaV07aWYodHlwZW9mIGN1cnI9PT0iZnVuY3Rpb24iKXtjdXJyPVJ1bnRpbWUuZ2V0RnVuY3Rpb25JbmRleChjdXJyKX10eXBlPXNpbmdsZVR5cGV8fHR5cGVzW2ldO2lmKHR5cGU9PT0wKXtpKys7Y29udGludWV9aWYodHlwZT09Imk2NCIpdHlwZT0iaTMyIjtzZXRWYWx1ZShyZXQraSxjdXJyLHR5cGUpO2lmKHByZXZpb3VzVHlwZSE9PXR5cGUpe3R5cGVTaXplPVJ1bnRpbWUuZ2V0TmF0aXZlVHlwZVNpemUodHlwZSk7cHJldmlvdXNUeXBlPXR5cGV9aSs9dHlwZVNpemV9cmV0dXJuIHJldH1Nb2R1bGVbImFsbG9jYXRlIl09YWxsb2NhdGU7ZnVuY3Rpb24gUG9pbnRlcl9zdHJpbmdpZnkocHRyLGxlbmd0aCl7dmFyIGhhc1V0Zj1mYWxzZTt2YXIgdDt2YXIgaT0wO3doaWxlKDEpe3Q9SEVBUFU4W3B0citpPj4wXTtpZih0Pj0xMjgpaGFzVXRmPXRydWU7ZWxzZSBpZih0PT0wJiYhbGVuZ3RoKWJyZWFrO2krKztpZihsZW5ndGgmJmk9PWxlbmd0aClicmVha31pZighbGVuZ3RoKWxlbmd0aD1pO3ZhciByZXQ9IiI7aWYoIWhhc1V0Zil7dmFyIE1BWF9DSFVOSz0xMDI0O3ZhciBjdXJyO3doaWxlKGxlbmd0aD4wKXtjdXJyPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLEhFQVBVOC5zdWJhcnJheShwdHIscHRyK01hdGgubWluKGxlbmd0aCxNQVhfQ0hVTkspKSk7cmV0PXJldD9yZXQrY3VycjpjdXJyO3B0cis9TUFYX0NIVU5LO2xlbmd0aC09TUFYX0NIVU5LfXJldHVybiByZXR9dmFyIHV0Zjg9bmV3IFJ1bnRpbWUuVVRGOFByb2Nlc3Nvcjtmb3IoaT0wO2k8bGVuZ3RoO2krKyl7dD1IRUFQVThbcHRyK2k+PjBdO3JldCs9dXRmOC5wcm9jZXNzQ0NoYXIodCl9cmV0dXJuIHJldH1Nb2R1bGVbIlBvaW50ZXJfc3RyaW5naWZ5Il09UG9pbnRlcl9zdHJpbmdpZnk7ZnVuY3Rpb24gVVRGMTZUb1N0cmluZyhwdHIpe3ZhciBpPTA7dmFyIHN0cj0iIjt3aGlsZSgxKXt2YXIgY29kZVVuaXQ9SEVBUDE2W3B0citpKjI+PjFdO2lmKGNvZGVVbml0PT0wKXJldHVybiBzdHI7KytpO3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZShjb2RlVW5pdCl9fU1vZHVsZVsiVVRGMTZUb1N0cmluZyJdPVVURjE2VG9TdHJpbmc7ZnVuY3Rpb24gc3RyaW5nVG9VVEYxNihzdHIsb3V0UHRyKXtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgY29kZVVuaXQ9c3RyLmNoYXJDb2RlQXQoaSk7SEVBUDE2W291dFB0citpKjI+PjFdPWNvZGVVbml0fUhFQVAxNltvdXRQdHIrc3RyLmxlbmd0aCoyPj4xXT0wfU1vZHVsZVsic3RyaW5nVG9VVEYxNiJdPXN0cmluZ1RvVVRGMTY7ZnVuY3Rpb24gVVRGMzJUb1N0cmluZyhwdHIpe3ZhciBpPTA7dmFyIHN0cj0iIjt3aGlsZSgxKXt2YXIgdXRmMzI9SEVBUDMyW3B0citpKjQ+PjJdO2lmKHV0ZjMyPT0wKXJldHVybiBzdHI7KytpO2lmKHV0ZjMyPj02NTUzNil7dmFyIGNoPXV0ZjMyLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9ZWxzZXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodXRmMzIpfX19TW9kdWxlWyJVVEYzMlRvU3RyaW5nIl09VVRGMzJUb1N0cmluZztmdW5jdGlvbiBzdHJpbmdUb1VURjMyKHN0cixvdXRQdHIpe3ZhciBpQ2hhcj0wO2Zvcih2YXIgaUNvZGVVbml0PTA7aUNvZGVVbml0PHN0ci5sZW5ndGg7KytpQ29kZVVuaXQpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpQ29kZVVuaXQpO2lmKGNvZGVVbml0Pj01NTI5NiYmY29kZVVuaXQ8PTU3MzQzKXt2YXIgdHJhaWxTdXJyb2dhdGU9c3RyLmNoYXJDb2RlQXQoKytpQ29kZVVuaXQpO2NvZGVVbml0PTY1NTM2KygoY29kZVVuaXQmMTAyMyk8PDEwKXx0cmFpbFN1cnJvZ2F0ZSYxMDIzfUhFQVAzMltvdXRQdHIraUNoYXIqND4+Ml09Y29kZVVuaXQ7KytpQ2hhcn1IRUFQMzJbb3V0UHRyK2lDaGFyKjQ+PjJdPTB9TW9kdWxlWyJzdHJpbmdUb1VURjMyIl09c3RyaW5nVG9VVEYzMjtmdW5jdGlvbiBkZW1hbmdsZShmdW5jKXt2YXIgaT0zO3ZhciBiYXNpY1R5cGVzPXsidiI6InZvaWQiLCJiIjoiYm9vbCIsImMiOiJjaGFyIiwicyI6InNob3J0IiwiaSI6ImludCIsImwiOiJsb25nIiwiZiI6ImZsb2F0IiwiZCI6ImRvdWJsZSIsInciOiJ3Y2hhcl90IiwiYSI6InNpZ25lZCBjaGFyIiwiaCI6InVuc2lnbmVkIGNoYXIiLCJ0IjoidW5zaWduZWQgc2hvcnQiLCJqIjoidW5zaWduZWQgaW50IiwibSI6InVuc2lnbmVkIGxvbmciLCJ4IjoibG9uZyBsb25nIiwieSI6InVuc2lnbmVkIGxvbmcgbG9uZyIsInoiOiIuLi4ifTt2YXIgc3Vicz1bXTt2YXIgZmlyc3Q9dHJ1ZTtmdW5jdGlvbiBkdW1wKHgpe2lmKHgpTW9kdWxlLnByaW50KHgpO01vZHVsZS5wcmludChmdW5jKTt2YXIgcHJlPSIiO2Zvcih2YXIgYT0wO2E8aTthKyspcHJlKz0iICI7TW9kdWxlLnByaW50KHByZSsiXiIpfWZ1bmN0aW9uIHBhcnNlTmVzdGVkKCl7aSsrO2lmKGZ1bmNbaV09PT0iSyIpaSsrO3ZhciBwYXJ0cz1bXTt3aGlsZShmdW5jW2ldIT09IkUiKXtpZihmdW5jW2ldPT09IlMiKXtpKys7dmFyIG5leHQ9ZnVuYy5pbmRleE9mKCJfIixpKTt2YXIgbnVtPWZ1bmMuc3Vic3RyaW5nKGksbmV4dCl8fDA7cGFydHMucHVzaChzdWJzW251bV18fCI/Iik7aT1uZXh0KzE7Y29udGludWV9aWYoZnVuY1tpXT09PSJDIil7cGFydHMucHVzaChwYXJ0c1twYXJ0cy5sZW5ndGgtMV0pO2krPTI7Y29udGludWV9dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO3ZhciBwcmU9c2l6ZS50b1N0cmluZygpLmxlbmd0aDtpZighc2l6ZXx8IXByZSl7aS0tO2JyZWFrfXZhciBjdXJyPWZ1bmMuc3Vic3RyKGkrcHJlLHNpemUpO3BhcnRzLnB1c2goY3Vycik7c3Vicy5wdXNoKGN1cnIpO2krPXByZStzaXplfWkrKztyZXR1cm4gcGFydHN9ZnVuY3Rpb24gcGFyc2UocmF3TGlzdCxsaW1pdCxhbGxvd1ZvaWQpe2xpbWl0PWxpbWl0fHxJbmZpbml0eTt2YXIgcmV0PSIiLGxpc3Q9W107ZnVuY3Rpb24gZmx1c2hMaXN0KCl7cmV0dXJuIigiK2xpc3Quam9pbigiLCAiKSsiKSJ9dmFyIG5hbWU7aWYoZnVuY1tpXT09PSJOIil7bmFtZT1wYXJzZU5lc3RlZCgpLmpvaW4oIjo6Iik7bGltaXQtLTtpZihsaW1pdD09PTApcmV0dXJuIHJhd0xpc3Q/W25hbWVdOm5hbWV9ZWxzZXtpZihmdW5jW2ldPT09IksifHxmaXJzdCYmZnVuY1tpXT09PSJMIilpKys7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2lmKHNpemUpe3ZhciBwcmU9c2l6ZS50b1N0cmluZygpLmxlbmd0aDtuYW1lPWZ1bmMuc3Vic3RyKGkrcHJlLHNpemUpO2krPXByZStzaXplfX1maXJzdD1mYWxzZTtpZihmdW5jW2ldPT09IkkiKXtpKys7dmFyIGlMaXN0PXBhcnNlKHRydWUpO3ZhciBpUmV0PXBhcnNlKHRydWUsMSx0cnVlKTtyZXQrPWlSZXRbMF0rIiAiK25hbWUrIjwiK2lMaXN0LmpvaW4oIiwgIikrIj4ifWVsc2V7cmV0PW5hbWV9cGFyYW1Mb29wOndoaWxlKGk8ZnVuYy5sZW5ndGgmJmxpbWl0LS0+MCl7dmFyIGM9ZnVuY1tpKytdO2lmKGMgaW4gYmFzaWNUeXBlcyl7bGlzdC5wdXNoKGJhc2ljVHlwZXNbY10pfWVsc2V7c3dpdGNoKGMpe2Nhc2UiUCI6bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXSsiKiIpO2JyZWFrO2Nhc2UiUiI6bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXSsiJiIpO2JyZWFrO2Nhc2UiTCI6e2krKzt2YXIgZW5kPWZ1bmMuaW5kZXhPZigiRSIsaSk7dmFyIHNpemU9ZW5kLWk7bGlzdC5wdXNoKGZ1bmMuc3Vic3RyKGksc2l6ZSkpO2krPXNpemUrMjticmVha307Y2FzZSJBIjp7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2krPXNpemUudG9TdHJpbmcoKS5sZW5ndGg7aWYoZnVuY1tpXSE9PSJfIil0aHJvdyI/IjtpKys7bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXSsiIFsiK3NpemUrIl0iKTticmVha307Y2FzZSJFIjpicmVhayBwYXJhbUxvb3A7ZGVmYXVsdDpyZXQrPSI/IitjO2JyZWFrIHBhcmFtTG9vcH19fWlmKCFhbGxvd1ZvaWQmJmxpc3QubGVuZ3RoPT09MSYmbGlzdFswXT09PSJ2b2lkIilsaXN0PVtdO2lmKHJhd0xpc3Qpe2lmKHJldCl7bGlzdC5wdXNoKHJldCsiPyIpfXJldHVybiBsaXN0fWVsc2V7cmV0dXJuIHJldCtmbHVzaExpc3QoKX19dHJ5e2lmKGZ1bmM9PSJPYmplY3QuX21haW4ifHxmdW5jPT0iX21haW4iKXtyZXR1cm4ibWFpbigpIn1pZih0eXBlb2YgZnVuYz09PSJudW1iZXIiKWZ1bmM9UG9pbnRlcl9zdHJpbmdpZnkoZnVuYyk7aWYoZnVuY1swXSE9PSJfIilyZXR1cm4gZnVuYztpZihmdW5jWzFdIT09Il8iKXJldHVybiBmdW5jO2lmKGZ1bmNbMl0hPT0iWiIpcmV0dXJuIGZ1bmM7c3dpdGNoKGZ1bmNbM10pe2Nhc2UibiI6cmV0dXJuIm9wZXJhdG9yIG5ldygpIjtjYXNlImQiOnJldHVybiJvcGVyYXRvciBkZWxldGUoKSJ9cmV0dXJuIHBhcnNlKCl9Y2F0Y2goZSl7cmV0dXJuIGZ1bmN9fWZ1bmN0aW9uIGRlbWFuZ2xlQWxsKHRleHQpe3JldHVybiB0ZXh0LnJlcGxhY2UoL19fWltcd1xkX10rL2csKGZ1bmN0aW9uKHgpe3ZhciB5PWRlbWFuZ2xlKHgpO3JldHVybiB4PT09eT94OngrIiBbIit5KyJdIn0pKX1mdW5jdGlvbiBzdGFja1RyYWNlKCl7dmFyIHN0YWNrPShuZXcgRXJyb3IpLnN0YWNrO3JldHVybiBzdGFjaz9kZW1hbmdsZUFsbChzdGFjayk6IihubyBzdGFjayB0cmFjZSBhdmFpbGFibGUpIn12YXIgUEFHRV9TSVpFPTQwOTY7ZnVuY3Rpb24gYWxpZ25NZW1vcnlQYWdlKHgpe3JldHVybiB4KzQwOTUmLTQwOTZ9dmFyIEhFQVA7dmFyIEhFQVA4LEhFQVBVOCxIRUFQMTYsSEVBUFUxNixIRUFQMzIsSEVBUFUzMixIRUFQRjMyLEhFQVBGNjQ7dmFyIFNUQVRJQ19CQVNFPTAsU1RBVElDVE9QPTAsc3RhdGljU2VhbGVkPWZhbHNlO3ZhciBTVEFDS19CQVNFPTAsU1RBQ0tUT1A9MCxTVEFDS19NQVg9MDt2YXIgRFlOQU1JQ19CQVNFPTAsRFlOQU1JQ1RPUD0wO2Z1bmN0aW9uIGVubGFyZ2VNZW1vcnkoKXthYm9ydCgiQ2Fubm90IGVubGFyZ2UgbWVtb3J5IGFycmF5cy4gRWl0aGVyICgxKSBjb21waWxlIHdpdGggLXMgVE9UQUxfTUVNT1JZPVggd2l0aCBYIGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlICIrVE9UQUxfTUVNT1JZKyIsICgyKSBjb21waWxlIHdpdGggQUxMT1dfTUVNT1JZX0dST1dUSCB3aGljaCBhZGp1c3RzIHRoZSBzaXplIGF0IHJ1bnRpbWUgYnV0IHByZXZlbnRzIHNvbWUgb3B0aW1pemF0aW9ucywgb3IgKDMpIHNldCBNb2R1bGUuVE9UQUxfTUVNT1JZIGJlZm9yZSB0aGUgcHJvZ3JhbSBydW5zLiIpfXZhciBUT1RBTF9TVEFDSz1Nb2R1bGVbIlRPVEFMX1NUQUNLIl18fDUyNDI4ODA7dmFyIFRPVEFMX01FTU9SWT1Nb2R1bGVbIlRPVEFMX01FTU9SWSJdfHwxNjc3NzIxNjA7dmFyIEZBU1RfTUVNT1JZPU1vZHVsZVsiRkFTVF9NRU1PUlkiXXx8MTA0ODU3NjA7dmFyIHRvdGFsTWVtb3J5PTQwOTY7d2hpbGUodG90YWxNZW1vcnk8VE9UQUxfTUVNT1JZfHx0b3RhbE1lbW9yeTwyKlRPVEFMX1NUQUNLKXtpZih0b3RhbE1lbW9yeTwxNioxMDI0KjEwMjQpe3RvdGFsTWVtb3J5Kj0yfWVsc2V7dG90YWxNZW1vcnkrPTE2KjEwMjQqMTAyNH19aWYodG90YWxNZW1vcnkhPT1UT1RBTF9NRU1PUlkpe01vZHVsZS5wcmludEVycigiaW5jcmVhc2luZyBUT1RBTF9NRU1PUlkgdG8gIit0b3RhbE1lbW9yeSsiIHRvIGJlIG1vcmUgcmVhc29uYWJsZSIpO1RPVEFMX01FTU9SWT10b3RhbE1lbW9yeX1hc3NlcnQodHlwZW9mIEludDMyQXJyYXkhPT0idW5kZWZpbmVkIiYmdHlwZW9mIEZsb2F0NjRBcnJheSE9PSJ1bmRlZmluZWQiJiYhIShuZXcgSW50MzJBcnJheSgxKSlbInN1YmFycmF5Il0mJiEhKG5ldyBJbnQzMkFycmF5KDEpKVsic2V0Il0sIkpTIGVuZ2luZSBkb2VzIG5vdCBwcm92aWRlIGZ1bGwgdHlwZWQgYXJyYXkgc3VwcG9ydCIpO3ZhciBidWZmZXI9bmV3IEFycmF5QnVmZmVyKFRPVEFMX01FTU9SWSk7SEVBUDg9bmV3IEludDhBcnJheShidWZmZXIpO0hFQVAxNj1uZXcgSW50MTZBcnJheShidWZmZXIpO0hFQVAzMj1uZXcgSW50MzJBcnJheShidWZmZXIpO0hFQVBVOD1uZXcgVWludDhBcnJheShidWZmZXIpO0hFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGJ1ZmZlcik7SEVBUFUzMj1uZXcgVWludDMyQXJyYXkoYnVmZmVyKTtIRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtIRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkoYnVmZmVyKTtIRUFQMzJbMF09MjU1O2Fzc2VydChIRUFQVThbMF09PT0yNTUmJkhFQVBVOFszXT09PTAsIlR5cGVkIGFycmF5cyAyIG11c3QgYmUgcnVuIG9uIGEgbGl0dGxlLWVuZGlhbiBzeXN0ZW0iKTtNb2R1bGVbIkhFQVAiXT1IRUFQO01vZHVsZVsiSEVBUDgiXT1IRUFQODtNb2R1bGVbIkhFQVAxNiJdPUhFQVAxNjtNb2R1bGVbIkhFQVAzMiJdPUhFQVAzMjtNb2R1bGVbIkhFQVBVOCJdPUhFQVBVODtNb2R1bGVbIkhFQVBVMTYiXT1IRUFQVTE2O01vZHVsZVsiSEVBUFUzMiJdPUhFQVBVMzI7TW9kdWxlWyJIRUFQRjMyIl09SEVBUEYzMjtNb2R1bGVbIkhFQVBGNjQiXT1IRUFQRjY0O2Z1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcyl7d2hpbGUoY2FsbGJhY2tzLmxlbmd0aD4wKXt2YXIgY2FsbGJhY2s9Y2FsbGJhY2tzLnNoaWZ0KCk7aWYodHlwZW9mIGNhbGxiYWNrPT0iZnVuY3Rpb24iKXtjYWxsYmFjaygpO2NvbnRpbnVlfXZhciBmdW5jPWNhbGxiYWNrLmZ1bmM7aWYodHlwZW9mIGZ1bmM9PT0ibnVtYmVyIil7aWYoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkKXtSdW50aW1lLmR5bkNhbGwoInYiLGZ1bmMpfWVsc2V7UnVudGltZS5keW5DYWxsKCJ2aSIsZnVuYyxbY2FsbGJhY2suYXJnXSl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19dmFyIF9fQVRQUkVSVU5fXz1bXTt2YXIgX19BVElOSVRfXz1bXTt2YXIgX19BVE1BSU5fXz1bXTt2YXIgX19BVEVYSVRfXz1bXTt2YXIgX19BVFBPU1RSVU5fXz1bXTt2YXIgcnVudGltZUluaXRpYWxpemVkPWZhbHNlO2Z1bmN0aW9uIHByZVJ1bigpe2lmKE1vZHVsZVsicHJlUnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicHJlUnVuIl09W01vZHVsZVsicHJlUnVuIl1dO3doaWxlKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKXthZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGVuc3VyZUluaXRSdW50aW1lKCl7aWYocnVudGltZUluaXRpYWxpemVkKXJldHVybjtydW50aW1lSW5pdGlhbGl6ZWQ9dHJ1ZTtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKX1mdW5jdGlvbiBwcmVNYWluKCl7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyl9ZnVuY3Rpb24gZXhpdFJ1bnRpbWUoKXtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FURVhJVF9fKX1mdW5jdGlvbiBwb3N0UnVuKCl7aWYoTW9kdWxlWyJwb3N0UnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInBvc3RSdW4iXT09ImZ1bmN0aW9uIilNb2R1bGVbInBvc3RSdW4iXT1bTW9kdWxlWyJwb3N0UnVuIl1dO3doaWxlKE1vZHVsZVsicG9zdFJ1biJdLmxlbmd0aCl7YWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKX1mdW5jdGlvbiBhZGRPblByZVJ1bihjYil7X19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25QcmVSdW4iXT1Nb2R1bGUuYWRkT25QcmVSdW49YWRkT25QcmVSdW47ZnVuY3Rpb24gYWRkT25Jbml0KGNiKXtfX0FUSU5JVF9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25Jbml0Il09TW9kdWxlLmFkZE9uSW5pdD1hZGRPbkluaXQ7ZnVuY3Rpb24gYWRkT25QcmVNYWluKGNiKXtfX0FUTUFJTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25QcmVNYWluIl09TW9kdWxlLmFkZE9uUHJlTWFpbj1hZGRPblByZU1haW47ZnVuY3Rpb24gYWRkT25FeGl0KGNiKXtfX0FURVhJVF9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25FeGl0Il09TW9kdWxlLmFkZE9uRXhpdD1hZGRPbkV4aXQ7ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25Qb3N0UnVuIl09TW9kdWxlLmFkZE9uUG9zdFJ1bj1hZGRPblBvc3RSdW47ZnVuY3Rpb24gaW50QXJyYXlGcm9tU3RyaW5nKHN0cmluZ3ksZG9udEFkZE51bGwsbGVuZ3RoKXt2YXIgcmV0PShuZXcgUnVudGltZS5VVEY4UHJvY2Vzc29yKS5wcm9jZXNzSlNTdHJpbmcoc3RyaW5neSk7aWYobGVuZ3RoKXtyZXQubGVuZ3RoPWxlbmd0aH1pZighZG9udEFkZE51bGwpe3JldC5wdXNoKDApfXJldHVybiByZXR9TW9kdWxlWyJpbnRBcnJheUZyb21TdHJpbmciXT1pbnRBcnJheUZyb21TdHJpbmc7ZnVuY3Rpb24gaW50QXJyYXlUb1N0cmluZyhhcnJheSl7dmFyIHJldD1bXTtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDtpKyspe3ZhciBjaHI9YXJyYXlbaV07aWYoY2hyPjI1NSl7Y2hyJj0yNTV9cmV0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaHIpKX1yZXR1cm4gcmV0LmpvaW4oIiIpfU1vZHVsZVsiaW50QXJyYXlUb1N0cmluZyJdPWludEFycmF5VG9TdHJpbmc7ZnVuY3Rpb24gd3JpdGVTdHJpbmdUb01lbW9yeShzdHJpbmcsYnVmZmVyLGRvbnRBZGROdWxsKXt2YXIgYXJyYXk9aW50QXJyYXlGcm9tU3RyaW5nKHN0cmluZyxkb250QWRkTnVsbCk7dmFyIGk9MDt3aGlsZShpPGFycmF5Lmxlbmd0aCl7dmFyIGNocj1hcnJheVtpXTtIRUFQOFtidWZmZXIraT4+MF09Y2hyO2k9aSsxfX1Nb2R1bGVbIndyaXRlU3RyaW5nVG9NZW1vcnkiXT13cml0ZVN0cmluZ1RvTWVtb3J5O2Z1bmN0aW9uIHdyaXRlQXJyYXlUb01lbW9yeShhcnJheSxidWZmZXIpe2Zvcih2YXIgaT0wO2k8YXJyYXkubGVuZ3RoO2krKyl7SEVBUDhbYnVmZmVyK2k+PjBdPWFycmF5W2ldfX1Nb2R1bGVbIndyaXRlQXJyYXlUb01lbW9yeSJdPXdyaXRlQXJyYXlUb01lbW9yeTtmdW5jdGlvbiB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyLGJ1ZmZlcixkb250QWRkTnVsbCl7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoO2krKyl7SEVBUDhbYnVmZmVyK2k+PjBdPXN0ci5jaGFyQ29kZUF0KGkpfWlmKCFkb250QWRkTnVsbClIRUFQOFtidWZmZXIrc3RyLmxlbmd0aD4+MF09MH1Nb2R1bGVbIndyaXRlQXNjaWlUb01lbW9yeSJdPXdyaXRlQXNjaWlUb01lbW9yeTtmdW5jdGlvbiB1blNpZ24odmFsdWUsYml0cyxpZ25vcmUpe2lmKHZhbHVlPj0wKXtyZXR1cm4gdmFsdWV9cmV0dXJuIGJpdHM8PTMyPzIqTWF0aC5hYnMoMTw8Yml0cy0xKSt2YWx1ZTpNYXRoLnBvdygyLGJpdHMpK3ZhbHVlfWZ1bmN0aW9uIHJlU2lnbih2YWx1ZSxiaXRzLGlnbm9yZSl7aWYodmFsdWU8PTApe3JldHVybiB2YWx1ZX12YXIgaGFsZj1iaXRzPD0zMj9NYXRoLmFicygxPDxiaXRzLTEpOk1hdGgucG93KDIsYml0cy0xKTtpZih2YWx1ZT49aGFsZiYmKGJpdHM8PTMyfHx2YWx1ZT5oYWxmKSl7dmFsdWU9LTIqaGFsZit2YWx1ZX1yZXR1cm4gdmFsdWV9aWYoIU1hdGhbImltdWwiXXx8TWF0aFsiaW11bCJdKDQyOTQ5NjcyOTUsNSkhPT0tNSlNYXRoWyJpbXVsIl09ZnVuY3Rpb24gaW11bChhLGIpe3ZhciBhaD1hPj4+MTY7dmFyIGFsPWEmNjU1MzU7dmFyIGJoPWI+Pj4xNjt2YXIgYmw9YiY2NTUzNTtyZXR1cm4gYWwqYmwrKGFoKmJsK2FsKmJoPDwxNil8MH07TWF0aC5pbXVsPU1hdGhbImltdWwiXTt2YXIgTWF0aF9hYnM9TWF0aC5hYnM7dmFyIE1hdGhfY29zPU1hdGguY29zO3ZhciBNYXRoX3Npbj1NYXRoLnNpbjt2YXIgTWF0aF90YW49TWF0aC50YW47dmFyIE1hdGhfYWNvcz1NYXRoLmFjb3M7dmFyIE1hdGhfYXNpbj1NYXRoLmFzaW47dmFyIE1hdGhfYXRhbj1NYXRoLmF0YW47dmFyIE1hdGhfYXRhbjI9TWF0aC5hdGFuMjt2YXIgTWF0aF9leHA9TWF0aC5leHA7dmFyIE1hdGhfbG9nPU1hdGgubG9nO3ZhciBNYXRoX3NxcnQ9TWF0aC5zcXJ0O3ZhciBNYXRoX2NlaWw9TWF0aC5jZWlsO3ZhciBNYXRoX2Zsb29yPU1hdGguZmxvb3I7dmFyIE1hdGhfcG93PU1hdGgucG93O3ZhciBNYXRoX2ltdWw9TWF0aC5pbXVsO3ZhciBNYXRoX2Zyb3VuZD1NYXRoLmZyb3VuZDt2YXIgTWF0aF9taW49TWF0aC5taW47dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMrKztpZihNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSl7TW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKX19TW9kdWxlWyJhZGRSdW5EZXBlbmRlbmN5Il09YWRkUnVuRGVwZW5kZW5jeTtmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMtLTtpZihNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSl7TW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKX1pZihydW5EZXBlbmRlbmNpZXM9PTApe2lmKHJ1bkRlcGVuZGVuY3lXYXRjaGVyIT09bnVsbCl7Y2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7cnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbH1pZihkZXBlbmRlbmNpZXNGdWxmaWxsZWQpe3ZhciBjYWxsYmFjaz1kZXBlbmRlbmNpZXNGdWxmaWxsZWQ7ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7Y2FsbGJhY2soKX19fU1vZHVsZVsicmVtb3ZlUnVuRGVwZW5kZW5jeSJdPXJlbW92ZVJ1bkRlcGVuZGVuY3k7TW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXT17fTtNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdPXt9O3ZhciBtZW1vcnlJbml0aWFsaXplcj1udWxsO3ZhciBfX1pUSXQ9MjE4NzI7dmFyIF9fWlRJcz0yMTg2NDt2YXIgX19aVEltPTIxOTM2O3ZhciBfX1pUSWw9MjE5MjA7dmFyIF9fWlRWTjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0U9MjE2NTY7dmFyIF9fWlRJaT0yMTg4ODt2YXIgX19aVEloPTIxODQwO3ZhciBfX1pUSWo9MjE5MDQ7dmFyIF9fWlRJZD0yMTk2ODt2YXIgX19aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0U9MjE2MTY7dmFyIF9fWlRJZj0yMTk1Mjt2YXIgX19aVElhPTIxODU2O3ZhciBfX1pUVk4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRT0yMTk3Njt2YXIgX19aVEljPTIxODI0O1NUQVRJQ19CQVNFPTg7U1RBVElDVE9QPVNUQVRJQ19CQVNFK1J1bnRpbWUuYWxpZ25NZW1vcnkoMjMwODMpO19fQVRJTklUX18ucHVzaCh7ZnVuYzooZnVuY3Rpb24oKXtfX0dMT0JBTF9fSV9hKCl9KX0se2Z1bmM6KGZ1bmN0aW9uKCl7X19HTE9CQUxfX0lfYTY1KCl9KX0se2Z1bmM6KGZ1bmN0aW9uKCl7X19HTE9CQUxfX0lfYTE1MygpfSl9KTthbGxvY2F0ZShbNzYsNjUsODMsOTAsMTA1LDExMiwwLDAsMTExLDExMiwxMDEsMTEwLDAsMCwwLDAsMTAzLDEwMSwxMTYsODAsMTExLDEwNSwxMTAsMTE2LDAsMCwwLDAsMCwwLDAsMCwxMDMsMTAxLDExNiw2NywxMTEsMTE3LDExMCwxMTYsMCwwLDAsMCwwLDAsMCwwLDEwNSwxMDUsMTA1LDAsMCwwLDAsMCw1NCw3Niw2NSw4Myw5MCwxMDUsMTEyLDAsMTIwLDg0LDAsMCw2NCwwLDAsMCw4MCw1NCw3Niw2NSw4Myw5MCwxMDUsMTEyLDAsMCwwLDAsMCwwLDAsMCwxNjAsODQsMCwwLDgwLDAsMCwwLDAsMCwwLDAsNzIsMCwwLDAsMTE4LDEwNSwxMDUsMTA1LDAsMCwwLDAsMTE4LDEwNSwxMDUsMTA1LDEwNSwwLDAsMCwxMDUsMTA1LDAsMCwwLDAsMCwwLDExOCwxMDUsMCwwLDAsMCwwLDAsMTE4LDAsMCwwLDAsMCwwLDAsMTA1LDEwNSwwLDAsMCwwLDAsMCw4MCw3NSw1NCw3Niw2NSw4Myw5MCwxMDUsMTEyLDAsMCwwLDAsMCwwLDAsMTYwLDg0LDAsMCwxNjAsMCwwLDAsMSwwLDAsMCw3MiwwLDAsMCwxMTgsNTAsMTE2LDU0LDExNSw1MCw0OCwwLDExOCw1MCwxMTYsNTQsMTE1LDUwLDQ4LDExOCw1MCwxMTYsNTUsMTE1LDU2LDAsMCwwLDExOCw1MCwxMTYsNTQsMTE1LDUwLDQ4LDExOCw1MCwxMTYsNTYsMTE1LDU0LDAsMCwwLDExOCw1MCwxMTYsNTQsMTE1LDUwLDQ4LDExOCw1MCwxMTYsNTUsMTE1LDU2LDExOCw1MCwxMTYsNTYsMTE1LDU0LDAsMCwwLDAsMCwxMDQsOTcsMTE1LDMyLDEwNSwxMTUsNTgsMzIsMCwwLDAsMCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNDksNTcsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDk1LDExNSw5OSwxMDQsMTAxLDEwOSw5Nyw5NSwxMTYsMTIxLDExMiwxMDEsNjksMCwwLDIyNCw4NSwwLDAsMTYsMSwwLDAsODAsMzksMCwwLDAsMCwwLDAsODQsMTA0LDEwMSwzMiw3Niw2NSw5MCwzMiwxMTUsOTksMTA0LDEwMSwxMDksOTcsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTQsMTAxLDk5LDExMSwxMDMsMTEwLDEwNSwxMjIsMTAxLDEwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OCwxLDAsMCwyMiwwLDAsMCwyMywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDczLDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMTEsMTAyLDMyLDExNSwxMjEsMTA5LDk4LDExMSwxMDgsMTE1LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDIyLDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw0OCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNDgsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw0OCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNDgsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDY4LDk1LDY5LDY5LDY5LDY5LDc4LDgzLDY2LDk1LDczLDc4LDgzLDY3LDk1LDU1LDEwMywxMTIsMTE1LDExNiwxMDUsMTA5LDEwMSw2OSw3OCw4Myw2OSw5NSw3Myw4Myw3Miw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2Niw5NSw3Myw3OCw4Myw2Nyw5NSw1MSwxMTQsMTAzLDk4LDY5LDc4LDgzLDY5LDk1LDczLDgzLDc1LDk1LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OCwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNjksMCwxMjAsODQsMCwwLDIwOCwyLDAsMCwyMjQsODUsMCwwLDE4NCwxLDAsMCwyNDgsMiwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDQ5LDQ5LDEwMSwxMTAsMTAwLDk1LDExMSwxMDIsOTUsMTAyLDEwNSwxMDgsMTAxLDY5LDAsMCwyMjQsODUsMCwwLDE2LDMsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDgyLDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw2OSwxMTAsMTAwLDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDAsMCwwLDAsMCwwLDAsMCwwLDQwLDMsMCwwLDI2LDAsMCwwLDI3LDAsMCwwLDIyLDAsMCwwLDAsMCwwLDAsMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDE0LDAsMSwzLDYsMTAsMTAsOSwxMywxLDIsNCw3LDExLDExLDEwLDEyLDMsNCw1LDgsMTIsMTIsMTEsMTEsNiw3LDgsOSwxMywxMywxMiwxMCwxMCwxMSwxMiwxMywxNCwxNCwxMyw5LDEwLDExLDEyLDEzLDE0LDE1LDE0LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwwLDEsMiwzLDQsNSw2LDcsMSwwLDEsMiwzLDQsNSw2LDIsMSwwLDEsMiwzLDQsNSwzLDIsMSwwLDEsMiwzLDQsNCwzLDIsMSwwLDEsMiwzLDUsNCwzLDIsMSwwLDEsMiw2LDUsNCwzLDIsMSwwLDEsNyw2LDUsNCwzLDIsMSwwLDAsMCwwLDAsMTEyLDUsMCwwLDI4LDAsMCwwLDI5LDAsMCwwLDMwLDAsMCwwLDIyLDAsMCwwLDMxLDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUwLDQ4LDk1LDk1LDExNSwxMDQsOTcsMTE0LDEwMSwxMDAsOTUsMTEyLDExNiwxMTQsOTUsMTEyLDExMSwxMDUsMTEwLDExNiwxMDEsMTE0LDczLDgwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2OCw5NSw3Myw3OCw4Myw2OSw5NSw1NSwxMDMsMTEyLDExNSwxMTYsMTA1LDEwOSwxMDEsNjksNzgsODMsNzEsOTUsNzMsODMsNzQsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3Nyw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw4MSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw4MSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsOCw0LDAsMCwxNDQsMzgsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDk1LDEwMCwxMDEsMTA4LDEwMSwxMTYsMTAxLDczLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2OCw5NSw3Myw3OCw4Myw2OSw5NSw1NSwxMDMsMTEyLDExNSwxMTYsMTA1LDEwOSwxMDEsNjksNzgsODMsNzEsOTUsNzMsODMsNzQsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3Nyw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwxOTIsNywwLDAsMjMsMCwwLDAsMzIsMCwwLDAsMzMsMCwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU1LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE1LDUwLDQ5LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw0OSw3Myw3OCw4Myw5NSw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDc4LDgzLDQ4LDk1LDQ5LDU3LDExNCwxMDEsOTksMTExLDExNCwxMDAsOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw3Myw3NCw3OCw4Myw0OCw5NSw1MywxMDIsMTA1LDEwMSwxMDgsMTAwLDczLDc4LDgzLDQ4LDk1LDUxLDEwOCw5NywxMTUsNTUsMTEyLDExMSwxMDUsMTEwLDExNiw0OSw0OCw2OSw3OCw4Myw0OCw5NSw1MCw0OCwxMTUsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw5NSwxMDAsMTA1LDEwMiwxMDIsOTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsNzMsODMsNjgsOTUsNjksNjksNjksNjksNzgsODMsNjYsOTUsNzMsNzgsODMsNjcsOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw2OSw5NSw3Myw4Myw3Miw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMjI0LDg1LDAsMCwyMDAsNiwwLDAsMjQ4LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCw1Niw5LDAsMCwzNCwwLDAsMCwzNSwwLDAsMCwzNiwwLDAsMCwyMywwLDAsMCwzNywwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTUsMTA0LDk3LDExNCwxMDEsMTAwLDk1LDExMiwxMTYsMTE0LDk1LDExMiwxMTEsMTA1LDExMCwxMTYsMTAxLDExNCw3Myw4MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU1LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE1LDUwLDQ5LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw0OSw3Myw3OCw4Myw0OSw5NSw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw0OSw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDc4LDgzLDUwLDk1LDQ5LDU3LDExNCwxMDEsOTksMTExLDExNCwxMDAsOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw3Myw3NCw3OCw4Myw1MCw5NSw1MywxMDIsMTA1LDEwMSwxMDgsMTAwLDczLDc4LDgzLDUwLDk1LDUxLDEwOCw5NywxMTUsNTUsMTEyLDExMSwxMDUsMTEwLDExNiw0OSw0OCw2OSw3OCw4Myw1MCw5NSw1MCw0OCwxMTUsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw5NSwxMDAsMTA1LDEwMiwxMDIsOTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsNzMsODMsNzAsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3NCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw3OCw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw3OCw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMjI0LDg1LDAsMCwyNDAsNywwLDAsMTQ0LDM4LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU1LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE1LDUwLDQ5LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw0OSw3Myw3OCw4Myw0OSw5NSw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw0OSw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDc4LDgzLDUwLDk1LDQ5LDU3LDExNCwxMDEsOTksMTExLDExNCwxMDAsOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw3Myw3NCw3OCw4Myw1MCw5NSw1MywxMDIsMTA1LDEwMSwxMDgsMTAwLDczLDc4LDgzLDUwLDk1LDUxLDEwOCw5NywxMTUsNTUsMTEyLDExMSwxMDUsMTEwLDExNiw0OSw0OCw2OSw3OCw4Myw1MCw5NSw1MCw0OCwxMTUsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw5NSwxMDAsMTA1LDEwMiwxMDIsOTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsNzMsODMsNzAsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3NCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMTIsMTEsMCwwLDI0LDAsMCwwLDM4LDAsMCwwLDM5LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw0OCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNDgsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw0OCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNDgsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDY4LDk1LDY5LDY5LDY5LDY5LDc4LDgzLDY2LDk1LDczLDc4LDgzLDY3LDk1LDU1LDEwMywxMTIsMTE1LDExNiwxMDUsMTA5LDEwMSw2OSw3OCw4Myw2OSw5NSw3Myw4Myw3Miw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDIyNCw4NSwwLDAsMTIwLDEwLDAsMCwyNDgsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDIzMiwxMiwwLDAsNDAsMCwwLDAsNDEsMCwwLDAsNDIsMCwwLDAsMjQsMCwwLDAsNDMsMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNDgsOTUsOTUsMTE1LDEwNCw5NywxMTQsMTAxLDEwMCw5NSwxMTIsMTE2LDExNCw5NSwxMTIsMTExLDEwNSwxMTAsMTE2LDEwMSwxMTQsNzMsODAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsNDksOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsNDksOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsNDksOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw1MCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNTAsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw1MCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNTAsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDcwLDk1LDY5LDY5LDY5LDY5LDc4LDgzLDY4LDk1LDczLDc4LDgzLDY5LDk1LDU1LDEwMywxMTIsMTE1LDExNiwxMDUsMTA5LDEwMSw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3NCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw3OCw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw3OCw5NSw2OSw2OSw2OSw2OSwwLDIyNCw4NSwwLDAsMTYwLDExLDAsMCwxNDQsMzgsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDk1LDEwMCwxMDEsMTA4LDEwMSwxMTYsMTAxLDczLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2OCw5NSw3Myw3OCw4Myw2OSw5NSw1NSwxMDMsMTEyLDExNSwxMTYsMTA1LDEwOSwxMDEsNjksNzgsODMsNzEsOTUsNzMsODMsNzQsOTUsNjksNjksNjksNjksNjksNjksNjksNjksNjksNjksNjksMCwwLDAsMCwwLDAsMCwwLDgsMTUsMCwwLDI1LDAsMCwwLDQ0LDAsMCwwLDQ1LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw0OCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNDgsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw0OCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNDgsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDY4LDk1LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCw0MCwxNCwwLDAsMjQ4LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMDQsMTYsMCwwLDQ2LDAsMCwwLDQ3LDAsMCwwLDQ4LDAsMCwwLDI1LDAsMCwwLDQ5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUwLDQ4LDk1LDk1LDExNSwxMDQsOTcsMTE0LDEwMSwxMDAsOTUsMTEyLDExNiwxMTQsOTUsMTEyLDExMSwxMDUsMTEwLDExNiwxMDEsMTE0LDczLDgwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw3NSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw3NSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsNTYsMTUsMCwwLDE0NCwzOCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsNDksOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsNDksOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsNDksOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw1MCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNTAsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw1MCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNTAsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDcwLDk1LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwxMTgsMCwwLDAsMCwwLDAsMCwxMTYsMCwwLDAsMCwwLDAsMCwxMTUsMCwwLDAsMCwwLDAsMCw2NCwwLDAsMCwwLDAsMCwwLDE2LDE4LDAsMCw1MCwwLDAsMCw1MSwwLDAsMCw1NiwwLDAsMCwyNDgsMjU1LDI1NSwyNTUsMTYsMTgsMCwwLDUyLDAsMCwwLDUzLDAsMCwwLDE5MiwyNTUsMjU1LDI1NSwxOTIsMjU1LDI1NSwyNTUsMTYsMTgsMCwwLDU0LDAsMCwwLDU1LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU2LDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNzgsODMsOTUsNTcsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDExMSwxMTQsNzMsOTksNjksNjksNjksNjksMCwwLDAsMCwyMjQsODUsMCwwLDIwMCwxNywwLDAsMjI0LDQ1LDAsMCwwLDAsMCwwLDY0LDAsMCwwLDAsMCwwLDAsMTkyLDQ0LDAsMCw1NiwwLDAsMCw1NywwLDAsMCwxOTIsMjU1LDI1NSwyNTUsMTkyLDI1NSwyNTUsMjU1LDE5Miw0NCwwLDAsNTgsMCwwLDAsNTksMCwwLDAsMCwwLDAsMCwyMDgsMTgsMCwwLDYwLDAsMCwwLDYxLDAsMCwwLDI2LDAsMCwwLDIyLDAsMCwwLDIyLDAsMCwwLDIyLDAsMCwwLDIzLDAsMCwwLDI0LDAsMCwwLDIzLDAsMCwwLDI1LDAsMCwwLDI2LDAsMCwwLDI2LDAsMCwwLDI0LDAsMCwwLDI3LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Myw5OCw5NywxMTUsMTA1LDk5LDk1LDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDk4LDExNywxMDIsNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDc4LDgzLDk1LDU3LDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMTEsMTE0LDczLDk5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxMzYsMTgsMCwwLDcyLDQ0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMTY4LDE5LDAsMCw2MiwwLDAsMCw2MywwLDAsMCw2NCwwLDAsMCwyOCwwLDAsMCw2NSwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTUsMTA0LDk3LDExNCwxMDEsMTAwLDk1LDExMiwxMTYsMTE0LDk1LDExMiwxMTEsMTA1LDExMCwxMTYsMTAxLDExNCw3Myw4MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsOTUsNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsODMsNTcsOTUsNjksNjksNzgsODMsOTUsNTcsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDExMSwxMTQsNzMsODMsNTcsOTUsNjksNjksNjksNjksMCwyMjQsODUsMCwwLDAsMTksMCwwLDE0NCwzOCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw0OSw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsNzEsMTExLDExNiwzMiwxMDAsOTcsMTE2LDk3LDMyLDAsMCwwLDAsMCwwLDAsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDAsMCwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwNSwxMTAsMTAzLDMyLDExNSwxMDQsMTA1LDExNiwzMywwLDAsMTAwLDExMSwxMTAsMTAxLDMyLDEwMCwxMDEsMTA4LDEwMSwxMTYsMTA1LDExMCwxMDMsMzIsMTE1LDEwNCwxMDUsMTE2LDMzLDAsMCwwLDAsMCw3Niw2NSw4Myw3MCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNDksNTEsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTUsMTA5LDk3LDEwMywxMDUsOTksNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTIwLDIwLDAsMCw4MCwzOSwwLDAsMCwwLDAsMCw3Nyw5NywxMDMsMTA1LDk5LDMyLDExNCwxMDEsOTcsMTAwLDMzLDAsMCwwLDAsMCwxMTIsOTcsMTE0LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDAsMCwxMTIsOTcsMTE0LDExNSwxMDUsMTEwLDEwMywzMiw5OSwxMDQsMTE3LDExMCwxMDcsMzIsMTE2LDk3LDk4LDEwOCwxMDEsMCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTAsNTAsOTksMTA0LDExNywxMTAsMTA3LDk1LDExNiw5Nyw5OCwxMDgsMTAxLDk1LDExNCwxMDEsOTcsMTAwLDk1LDEwMSwxMTQsMTE0LDExMSwxMTQsNjksMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDIyNCwyMCwwLDAsODAsMzksMCwwLDAsMCwwLDAsNjcsMTA0LDExNywxMTAsMTA3LDMyLDExNiw5Nyw5OCwxMDgsMTAxLDMyLDExMSwxMDIsMTAyLDExNSwxMDEsMTE2LDMyLDYxLDYxLDMyLDQ1LDQ5LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsOTcsMTE2LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTYsMTA1LDEwOSwxMDEsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNDksNTEsMTEwLDExMSwxMTYsOTUsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsODAsMjEsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTAsNTQsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDk1LDk5LDEwNCwxMTcsMTEwLDEwNyw5NSwxMTYsOTcsOTgsMTA4LDEwMSw5NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDY5LDAsMCwwLDIyNCw4NSwwLDAsMTI4LDIxLDAsMCw4MCwzOSwwLDAsMCwwLDAsMCw5OSwxMDQsMTE3LDExMCwxMDcsOTUsMTE1LDEwNSwxMjIsMTAxLDMyLDYxLDYxLDMyLDExNywxMDUsMTEwLDExNiw0NiwxMDksOTcsMTIwLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsOTcsMTE2LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTYsMTA1LDEwOSwxMDEsNDQsMzIsOTksOTcsMTA4LDEwOCwzMiw0OSw0NSw1Niw0OCw0OCw0NSw2OCw2NSw3MCw4NSw4MSwzMiwxMDIsMTExLDExNCwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsNDYsMCwwLDAsMCwwLDk5LDEwNCwxMTcsMTEwLDEwNywzMiwxMTYsOTcsOTgsMTA4LDEwMSwzMiw5OSwxMTEsMTE3LDExMCwxMTYsMzIsMTA1LDExNSw1OCwzMiwwLDAsOTksMTE2LDExMSw5MSwwLDAsMCwwLDkzLDU4LDMyLDAsMCwwLDAsMCw4NCwxMDQsMTAxLDMyLDk5LDEwNCwxMTcsMTEwLDEwNywzMiwxMTYsOTcsOTgsMTA4LDEwMSwzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDExNywxMTAsMTA3LDExMCwxMTEsMTE5LDExMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTY4LDIxLDAsMCw2NiwwLDAsMCw2NywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTEyLDIxLDAsMCw2OCwwLDAsMCw2OSwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDg0LDEwNCwxMDEsMTE0LDEwMSwzMiwxMTksOTcsMTE1LDMyLDk3LDMyLDExMiwxMTQsMTExLDk4LDEwOCwxMDEsMTA5LDMyLDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDk5LDEwNCwxMTcsMTEwLDEwNywzMiwxMTYsOTcsOTgsMTA4LDEwMSwwLDAsMCwwLDAsMCwwLDAsMCw4LDIxLDAsMCw3MCwwLDAsMCw3MSwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsMzIsMTAxLDExMCw5OSwxMTEsMTAwLDEwMSwxMDAsMCwwLDExOCwxMDgsMTE0LDMyLDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMzIsMTE0LDEwMSw5NywxMDAsMzMsMCwwLDAsMCwwLDAsMCwwLDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsMzIsMTE4LDEwOCwxMTQsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwwLDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw0OSw1MSwxMTAsMTExLDk1LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsOTUsMTE4LDEwOCwxMTQsNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMzIsMjMsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDExMiwxMTcsMTE1LDEwNCwxMDUsMTEwLDEwMywzMywwLDAsMCwwLDAsMCwwLDAsNzgsMTExLDMyLDc2LDY1LDgzLDEyMiwxMDUsMTEyLDMyLDg2LDc2LDgyLDMyLDExOSw5NywxMTUsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDg2LDc2LDgyLDExNSwzMiwxMTUsMTAxLDk5LDExNiwxMDUsMTExLDExMCwwLDAsMCwwLDAsMCwwLDAsMCw2NCwyMywwLDAsNzIsMCwwLDAsNzMsMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDUzLDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsOTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiw5NSwxMTcsMTEwLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDY5LDAsMCwwLDAsMjI0LDg1LDAsMCwxNjgsMjMsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDMyLDEwNSwxMTUsNTgsMzIsMCwxMTYsMTExLDExNiw5NywxMDgsMzIsMTA1LDExNiwxMDEsMTA5LDExNSw1OCwzMiwwLDAsMCw4MCw5NywxMTQsMTE1LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTE0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDUsMTE2LDEwMSwxMDksMTE1LDMyLDExMCwxMTEsMTE5LDMzLDAsMCwwLDAsMCwwLDgwLDExNywxMTUsMTA0LDEwNSwxMTAsMTAzLDMyLDEwNSwxMTYsMTAxLDEwOSwzMiw5NywxMTYsMzIsMTA1LDExMCwxMDAsMTAxLDEyMCw1OCwzMiwwLDc5LDExMCwxMDgsMTIxLDMyLDc2LDY1LDgzLDEyMiwxMDUsMTEyLDMyLDgwLDc5LDczLDc4LDg0LDg3LDczLDgzLDY5LDMyLDY3LDcyLDg1LDc4LDc1LDY5LDY4LDMyLDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwwLDAsMCwwLDAsMjA4LDIzLDAsMCw3NCwwLDAsMCw3NSwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1NSw5OCw5NywxMDAsOTUsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDk1LDk5LDk3LDEwOCwxMDgsNjksMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTM2LDI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNjgsMjQsMCwwLDc2LDAsMCwwLDc3LDAsMCwwLDI3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTYsMjYsMCwwLDc4LDAsMCwwLDc5LDAsMCwwLDI4LDAsMCwwLDI3LDAsMCwwLDgwLDAsMCwwLDgxLDAsMCwwLDI4LDAsMCwwLDI5LDAsMCwwLDI5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDk1LDk1LDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCw1NCw5NSw5NSwxMDIsMTE3LDExMCw5OSw3Myw5MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDEwNSwxMTEsNTQsMTE0LDEwMSw5NywxMDAsMTAxLDExNCw0OSw0OCw5OCw5NywxMTUsMTA1LDk5LDk1LDEwMiwxMDUsMTA4LDEwMSw3Myw3OCw4Myw1MCw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDQ5LDQ5LDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTExLDExNCwxMTUsNjksMTE4LDY5LDg1LDEwOCw4Miw3OCw4Myw1MSw5NSw1NCwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDY5LDY5LDk1LDc4LDgzLDk1LDU3LDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMTEsMTE0LDczLDgzLDY2LDk1LDY5LDY5LDcwLDExOCw4Myw2NSw5NSw2OSw2OSw2OSwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCw5NSw5NSwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsNTQsOTUsOTUsOTgsOTcsMTE1LDEwMSw3Myw3MCwxMTgsODIsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1MCwxMDUsMTExLDU0LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsNjksNjksNjksNjksMCwwLDAsMCwxMjAsODQsMCwwLDIwOCwyNSwwLDAsMjI0LDg1LDAsMCw1NiwyNSwwLDAsOCwyNiwwLDAsMCwwLDAsMCw5MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDEwNSwxMTEsNTQsMTE0LDEwMSw5NywxMDAsMTAxLDExNCw0OSw0OCw5OCw5NywxMTUsMTA1LDk5LDk1LDEwMiwxMDUsMTA4LDEwMSw3Myw3OCw4Myw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDQ5LDQ5LDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTExLDExNCwxMTUsNjksMTE4LDY5LDg1LDEwOCw4Miw3OCw4Myw0OCw5NSw1NCwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDY5LDY5LDk1LDAsMCwwLDEyMCw4NCwwLDAsMzIsMjYsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTAsNDksMTExLDEwOCwxMDAsOTUsMTE1LDExNiwxMjEsMTA4LDEwMSw5NSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTA1LDExMSwxMTAsNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTM2LDI2LDAsMCw4MCwzOSwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDQ5LDUyLDExMCwxMTEsMTE2LDk1LDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMDEsMTAwLDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxOTIsMjYsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDg0LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwxMTAsMzksMTE2LDMyLDExNSwxMDEsMTAxLDEwOSwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTAxLDEwMCwwLDAsMCwwLDAsMCwyMjQsMjYsMCwwLDgyLDAsMCwwLDgzLDAsMCwwLDIyLDAsMCwwLDAsMCwwLDAsODQsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEwMSwxMDEsMTA5LDExNSwzMiwxMTYsMTExLDMyLDEwNCw5NywxMTgsMTAxLDMyLDExMSwxMDgsMTAwLDMyLDExNSwxMTYsMTIxLDEwOCwxMDEsMzIsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDEwNSwxMTEsMTEwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDAsMCwwLDAsMCwwLDAsMCwwLDE3NiwyNiwwLDAsODQsMCwwLDAsODUsMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCw3MCwxMDUsMTA4LDEwMSwzMiwxMDksOTcsMTAzLDEwNSw5OSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExOCw5NywxMDgsMTA1LDEwMCwwLDAsMCwwLDAsMTUyLDIwLDAsMCw4NiwwLDAsMCw4NywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDEwMywxMTEsMTA1LDExMCwxMDMsMzIsMTAwLDExMSwxMTksMTEwLDMzLDAsMCwwLDAsMCwwLDAsMCwwLDEyOCwyOCwwLDAsODgsMCwwLDAsODksMCwwLDAsOTAsMCwwLDAsMzAsMCwwLDAsOTEsMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNDgsOTUsOTUsMTE1LDEwNCw5NywxMTQsMTAxLDEwMCw5NSwxMTIsMTE2LDExNCw5NSwxMTIsMTExLDEwNSwxMTAsMTE2LDEwMSwxMTQsNzMsODAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1MCwxMDUsMTExLDU0LDExNCwxMDEsOTcsMTAwLDEwMSwxMTQsNDksNDgsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDIsMTA1LDEwOCwxMDEsNzMsNzgsODMsNDksOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw1NSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw1NSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDI0MCwyNywwLDAsMTQ0LDM4LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDEwNSwxMTEsNTQsMTE0LDEwMSw5NywxMDAsMTAxLDExNCw0OSw0OCw5OCw5NywxMTUsMTA1LDk5LDk1LDEwMiwxMDUsMTA4LDEwMSw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwxMjAsMjksMCwwLDkyLDAsMCwwLDkzLDAsMCwwLDk0LDAsMCwwLDMxLDAsMCwwLDk1LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUwLDQ4LDk1LDk1LDExNSwxMDQsOTcsMTE0LDEwMSwxMDAsOTUsMTEyLDExNiwxMTQsOTUsMTEyLDExMSwxMDUsMTEwLDExNiwxMDEsMTE0LDczLDgwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw1MSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw1MSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwyMjQsODUsMCwwLDgsMjksMCwwLDE0NCwzOCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDExOCwxMTEsMTA1LDEwMCwwLDAsMCwwLDk4LDExMSwxMTEsMTA4LDAsMCwwLDAsOTksMTA0LDk3LDExNCwwLDAsMCwwLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDk5LDEwNCw5NywxMTQsMCwwLDAsMCwwLDExNywxMTAsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsOTksMTA0LDk3LDExNCwwLDAsMCwxMTUsMTA0LDExMSwxMTQsMTE2LDAsMCwwLDExNywxMTAsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTE1LDEwNCwxMTEsMTE0LDExNiwwLDAsMTA1LDExMCwxMTYsMCwwLDAsMCwwLDExNywxMTAsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTA1LDExMCwxMTYsMCwwLDAsMCwxMDgsMTExLDExMCwxMDMsMCwwLDAsMCwxMTcsMTEwLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDEwOCwxMTEsMTEwLDEwMywwLDAsMCwxMDIsMTA4LDExMSw5NywxMTYsMCwwLDAsMTAwLDExMSwxMTcsOTgsMTA4LDEwMSwwLDAsMTE1LDExNiwxMDAsNTgsNTgsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMCwwLDAsMCwwLDExNSwxMTYsMTAwLDU4LDU4LDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNjAsMTE3LDExMCwxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwzMiw5OSwxMDQsOTcsMTE0LDYyLDAsMCwwLDAsMCwwLDAsMCwxMTUsMTE2LDEwMCw1OCw1OCwxMTksMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMCwwLDAsMCwxMDEsMTA5LDExNSw5OSwxMTQsMTA1LDExMiwxMTYsMTAxLDExMCw1OCw1OCwxMTgsOTcsMTA4LDAsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNTgsNTgsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE4LDEwNSwxMDEsMTE5LDAsNzgsNDksNDgsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNDksNDksMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE4LDEwNSwxMDEsMTE5LDY5LDAsMCwwLDAsMCwxMjAsODQsMCwwLDIwMCwzMCwwLDAsNzgsNDksNDgsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNTEsMTE4LDk3LDEwOCw2OSwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDI0MCwzMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUwLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNzMsMTE5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3MywxMTksNjksNjksNzgsODMsOTUsNTcsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDExMSwxMTQsNzMsMTE5LDY5LDY5LDY5LDY5LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNDksOTUsOTUsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw5NSw5OSwxMTEsMTA5LDEwOSwxMTEsMTEwLDczLDc2LDk4LDQ5LDY5LDY5LDY5LDAsMCwwLDEyMCw4NCwwLDAsODAsMzEsMCwwLDY0LDg2LDAsMCwxNiwzMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDEyMCwzMSwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTAsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw3MywxMDQsNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDEwNCw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3MywxMDQsNjksNjksNjksNjksMCwwLDY0LDg2LDAsMCwxNTIsMzEsMCwwLDAsMCwwLDAsMSwwLDAsMCwxMjAsMzEsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUwLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDc4LDgzLDk1LDU3LDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMTEsMTE0LDczLDk5LDY5LDY5LDY5LDY5LDAsMCw2NCw4NiwwLDAsMjQwLDMxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMTIwLDMxXSwiaTgiLEFMTE9DX05PTkUsUnVudGltZS5HTE9CQUxfQkFTRSk7YWxsb2NhdGUoWzIwOCwzNiwwLDAsOTYsMCwwLDAsOTcsMCwwLDAsMjksMCwwLDAsMjUsMCwwLDAsMjMsMCwwLDAsMjMsMCwwLDAsMzAsMCwwLDAsMzEsMCwwLDAsMjYsMCwwLDAsMzIsMCwwLDAsMzMsMCwwLDAsMzIsMCwwLDAsMjcsMCwwLDAsMzMsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDExNSwxMTYsMTAwLDExMSwxMTcsMTE2LDk4LDExNywxMDIsNzMsMTE5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDE3NiwzNiwwLDAsMTM2LDQ0LDAsMCwwLDAsMCwwLDAsMCwwLDAsNTYsMzcsMCwwLDk4LDAsMCwwLDk5LDAsMCwwLDMwLDAsMCwwLDI1LDAsMCwwLDIzLDAsMCwwLDIzLDAsMCwwLDM0LDAsMCwwLDMxLDAsMCwwLDI2LDAsMCwwLDM1LDAsMCwwLDM2LDAsMCwwLDM0LDAsMCwwLDI4LDAsMCwwLDM1LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCw5NSw5NSwxMTUsMTE2LDEwMCwxMDUsMTEwLDk4LDExNywxMDIsNzMsMTE5LDY5LDY5LDAsMjI0LDg1LDAsMCwzMiwzNywwLDAsMTM2LDQ0LDAsMCwwLDAsMCwwLDExNywxMTAsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsMTA4LDExMSw5OSw5NywxMDgsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDMyLDEwNSwxMTAsMTEyLDExNywxMTYsMCwwLDAsMCwwLDAsMCwyMDgsMzcsMCwwLDEwMCwwLDAsMCwxMDEsMCwwLDAsMzEsMCwwLDAsMjIsMCwwLDAsMjQsMCwwLDAsMjQsMCwwLDAsMzcsMCwwLDAsMjQsMCwwLDAsMjMsMCwwLDAsMzgsMCwwLDAsMjYsMCwwLDAsMzYsMCwwLDAsMjksMCwwLDAsMzcsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDExNSwxMTYsMTAwLDExMSwxMTcsMTE2LDk4LDExNywxMDIsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTc2LDM3LDAsMCw3Miw0NCwwLDAsMCwwLDAsMCwwLDAsMCwwLDU2LDM4LDAsMCwxMDIsMCwwLDAsMTAzLDAsMCwwLDMyLDAsMCwwLDIyLDAsMCwwLDI0LDAsMCwwLDI0LDAsMCwwLDIzLDAsMCwwLDI0LDAsMCwwLDIzLDAsMCwwLDM5LDAsMCwwLDQwLDAsMCwwLDM4LDAsMCwwLDI0LDAsMCwwLDM5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCw5NSw5NSwxMTUsMTE2LDEwMCwxMDUsMTEwLDk4LDExNywxMDIsNzMsOTksNjksNjksMCwyMjQsODUsMCwwLDMyLDM4LDAsMCw3Miw0NCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsOTUsOTUsMTE1LDEwNCw5NywxMTQsMTAxLDEwMCw5NSw5OSwxMTEsMTE3LDExMCwxMTYsNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsNzIsMzgsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Nyw5NSw5NSwxMTUsMTA0LDk3LDExNCwxMDEsMTAwLDk1LDExOSwxMDEsOTcsMTA3LDk1LDk5LDExMSwxMTcsMTEwLDExNiw2OSwwLDAsMCw2NCw4NiwwLDAsMTEyLDM4LDAsMCwwLDAsMCwwLDEsMCwwLDAsMTA0LDM4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMjMyLDM4LDAsMCwxMDQsMCwwLDAsMTA1LDAsMCwwLDQxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MCwzOSwwLDAsMTA2LDAsMCwwLDEwNywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDgzLDExNiw0OSw0OSwxMDgsMTExLDEwMywxMDUsOTksOTUsMTAxLDExNCwxMTQsMTExLDExNCwwLDIyNCw4NSwwLDAsMjE2LDM4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0MCwzOSwwLDAsMTA0LDAsMCwwLDEwOCwwLDAsMCw0MSwwLDAsMCwwLDAsMCwwLDgzLDExNiw0OSw1MCwxMDgsMTAxLDExMCwxMDMsMTE2LDEwNCw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDE2LDM5LDAsMCwyMzIsMzgsMCwwLDAsMCwwLDAsODMsMTE2LDQ5LDUxLDExNCwxMTcsMTEwLDExNiwxMDUsMTA5LDEwMSw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCw1NiwzOSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEwMywxMDEsMTEwLDEwMSwxMTQsMTA1LDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw1OCwzMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDIwMCwzOSwwLDAsMTA5LDAsMCwwLDExMCwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MCwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDY5LDAsMCwyMjQsODUsMCwwLDE3NiwzOSwwLDAsODAsMzksMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUyLDEwMSwxMTQsMTE0LDExMSwxMTQsOTUsOTksOTcsMTE2LDEwMSwxMDMsMTExLDExNCwxMjEsNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsMjE2LDM5LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTAsOTUsOTUsMTAwLDExMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSw2OSwwLDAsMjI0LDg1LDAsMCwwLDQwLDAsMCwyNDgsMzksMCwwLDAsMCwwLDAsMCwwLDAsMCwxMjAsNDAsMCwwLDExMSwwLDAsMCwxMTIsMCwwLDAsNDIsMCwwLDAsMjIsMCwwLDAsMzAsMCwwLDAsMzEsMCwwLDAsMjMsMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNTIsOTUsOTUsMTAzLDEwMSwxMTAsMTAxLDExNCwxMDUsOTksOTUsMTAxLDExNCwxMTQsMTExLDExNCw5NSw5OSw5NywxMTYsMTAxLDEwMywxMTEsMTE0LDEyMSw2OSwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDgwLDQwLDAsMCwyNCw0MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIxNiw0MCwwLDAsMTEzLDAsMCwwLDExNCwwLDAsMCw0MywwLDAsMCwyNCwwLDAsMCwzMCwwLDAsMCwzMSwwLDAsMCwyNSwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw1MSw5NSw5NSwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDk1LDk5LDk3LDExNiwxMDEsMTAzLDExMSwxMTQsMTIxLDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxNzYsNDAsMCwwLDI0LDQwLDAsMCwwLDAsMCwwLDEwOSwxMTcsMTE2LDEwMSwxMjAsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTAyLDk3LDEwNSwxMDgsMTAxLDEwMCwwLDAsMCwwLDAsMCwwLDEwMSw5OSwzMiw2MSw2MSwzMiw0OCwwLDQ3LDg1LDExNSwxMDEsMTE0LDExNSw0NywxMTgsMTAxLDExNCwxMDksOTcsNDcsMTE2LDEwOSwxMTIsNDcsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNDcsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksNDcsMTA4LDEwNSw5OCw0NywxMDgsMTA1LDk4LDk5LDEyMCwxMjAsNDcsMTA5LDExNywxMTYsMTAxLDEyMCw0Niw5OSwxMTIsMTEyLDAsMTE3LDExMCwxMDgsMTExLDk5LDEwNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywwLDAsMCwwLDAsMCwwLDAsNzIsNDQsMCwwLDExNSwwLDAsMCwxMTYsMCwwLDAsMjYsMCwwLDAsMjIsMCwwLDAsMjQsMCwwLDAsMjQsMCwwLDAsMjMsMCwwLDAsMjQsMCwwLDAsMjMsMCwwLDAsMzgsMCwwLDAsMjYsMCwwLDAsMzYsMCwwLDAsMjQsMCwwLDAsMzksMCwwLDAsMCwwLDAsMCwxMzYsNDQsMCwwLDExNywwLDAsMCwxMTgsMCwwLDAsMzMsMCwwLDAsMjUsMCwwLDAsMjMsMCwwLDAsMjMsMCwwLDAsMzQsMCwwLDAsMzEsMCwwLDAsMjYsMCwwLDAsMzIsMCwwLDAsMzMsMCwwLDAsMzIsMCwwLDAsMjgsMCwwLDAsMzUsMCwwLDAsOCwwLDAsMCwwLDAsMCwwLDE5Miw0NCwwLDAsNTYsMCwwLDAsNTcsMCwwLDAsMjQ4LDI1NSwyNTUsMjU1LDI0OCwyNTUsMjU1LDI1NSwxOTIsNDQsMCwwLDU4LDAsMCwwLDU5LDAsMCwwLDgsMCwwLDAsMCwwLDAsMCw4LDQ1LDAsMCwxMTksMCwwLDAsMTIwLDAsMCwwLDI0OCwyNTUsMjU1LDI1NSwyNDgsMjU1LDI1NSwyNTUsOCw0NSwwLDAsMTIxLDAsMCwwLDEyMiwwLDAsMCw0LDAsMCwwLDAsMCwwLDAsODAsNDUsMCwwLDEyMywwLDAsMCwxMjQsMCwwLDAsMjUyLDI1NSwyNTUsMjU1LDI1MiwyNTUsMjU1LDI1NSw4MCw0NSwwLDAsMTI1LDAsMCwwLDEyNiwwLDAsMCw0LDAsMCwwLDAsMCwwLDAsMTUyLDQ1LDAsMCwxMjcsMCwwLDAsMTI4LDAsMCwwLDI1MiwyNTUsMjU1LDI1NSwyNTIsMjU1LDI1NSwyNTUsMTUyLDQ1LDAsMCwxMjksMCwwLDAsMTMwLDAsMCwwLDEwNSwxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwwLDAsMCwwLDAsMCwwLDAsMTE3LDExMCwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwNSwxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSw5OSw5NywxMTYsMTAxLDEwMywxMTEsMTE0LDEyMSwzMiwxMDEsMTE0LDExNCwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsOTYsNDMsMCwwLDEzMSwwLDAsMCwxMzIsMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEzNiw0MywwLDAsMTMzLDAsMCwwLDEzNCwwLDAsMCwxMDUsMTExLDExNSw5NSw5OCw5NywxMTUsMTAxLDU4LDU4LDk5LDEwOCwxMDEsOTcsMTE0LDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDEwNSwxMTEsMTE1LDk1LDk4LDk3LDExNSwxMDEsNTUsMTAyLDk3LDEwNSwxMDgsMTE3LDExNCwxMDEsNjksMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDY0LDQzLDAsMCwyMDAsMzksMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDEwNSwxMTEsMTE1LDk1LDk4LDk3LDExNSwxMDEsNjksMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDExMiw0MywwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk4LDk3LDExNSwxMDUsOTksOTUsMTA1LDExMSwxMTUsNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxNDQsNDMsMCwwLDEzNiw0MywwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDUsMTExLDExNSw3MywxMTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDExOSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMjA4LDQzLDAsMCwxMzYsNDMsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUzLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwxNiw0NCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUzLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDgwLDQ0LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTEsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksMCwwLDY0LDg2LDAsMCwxNDQsNDQsMCwwLDAsMCwwLDAsMSwwLDAsMCwxOTIsNDMsMCwwLDMsMjQ0LDI1NSwyNTUsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUxLDk4LDk3LDExNSwxMDUsOTksOTUsMTA1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNzMsMTE5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3MywxMTksNjksNjksNjksNjksMCwwLDY0LDg2LDAsMCwyMTYsNDQsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDQ0LDAsMCwzLDI0NCwyNTUsMjU1LDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MSw5OCw5NywxMTUsMTA1LDk5LDk1LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSwwLDAsNjQsODYsMCwwLDMyLDQ1LDAsMCwwLDAsMCwwLDEsMCwwLDAsMTkyLDQzLDAsMCwzLDI0NCwyNTUsMjU1LDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MSw5OCw5NywxMTUsMTA1LDk5LDk1LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDAsMCw2NCw4NiwwLDAsMTA0LDQ1LDAsMCwwLDAsMCwwLDEsMCwwLDAsMCw0NCwwLDAsMywyNDQsMjU1LDI1NSw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDUsMTExLDExNSwxMTYsMTE0LDEwMSw5NywxMDksNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDY5LDY5LDAsNjQsODYsMCwwLDE3Niw0NSwwLDAsMywwLDAsMCwyLDAsMCwwLDE5Miw0NCwwLDAsMiwwLDAsMCw4MCw0NSwwLDAsMiw4LDAsMCwwLDAsMCwwLDcyLDQ2LDAsMCwxMzUsMCwwLDAsMTM2LDAsMCwwLDQ0LDAsMCwwLDIyLDAsMCwwLDMwLDAsMCwwLDMxLDAsMCwwLDI2LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU3LDk1LDk1LDEwNSwxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSw5OSw5NywxMTYsMTAxLDEwMywxMTEsMTE0LDEyMSw2OSwwLDAsMCwyMjQsODUsMCwwLDQwLDQ2LDAsMCwyNCw0MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDU2LDYwLDAsMCwxMzcsMCwwLDAsMTM4LDAsMCwwLDEzOSwwLDAsMCwyMiwwLDAsMCwyNSwwLDAsMCwzMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw5Niw2MCwwLDAsMTQwLDAsMCwwLDE0MSwwLDAsMCwxMzksMCwwLDAsMjMsMCwwLDAsMjYsMCwwLDAsMzMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTYsNjUsMCwwLDE0MiwwLDAsMCwxNDMsMCwwLDAsMTM5LDAsMCwwLDIyLDAsMCwwLDIzLDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDI2LDAsMCwwLDI3LDAsMCwwLDI4LDAsMCwwLDI5LDAsMCwwLDMwLDAsMCwwLDMxLDAsMCwwLDMyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw5Nyw5OCw5OSwxMDAsMTAxLDEwMiw2NSw2Niw2Nyw2OCw2OSw3MCwxMjAsODgsNDMsNDUsMTEyLDgwLDEwNSw3MywxMTAsNzgsMCwwLDAsMCwwLDAsMCwwLDM3LDExMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDE2OCw2NSwwLDAsMTQ0LDAsMCwwLDE0NSwwLDAsMCwxMzksMCwwLDAsMzMsMCwwLDAsMzQsMCwwLDAsMzUsMCwwLDAsMzYsMCwwLDAsMzcsMCwwLDAsMzgsMCwwLDAsMzksMCwwLDAsNDAsMCwwLDAsNDEsMCwwLDAsNDIsMCwwLDAsNDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTA0LDY2LDAsMCwxNDYsMCwwLDAsMTQ3LDAsMCwwLDEzOSwwLDAsMCwyNSwwLDAsMCwyNiwwLDAsMCw0NCwwLDAsMCwyNywwLDAsMCw0NSwwLDAsMCwyMiwwLDAsMCwyMywwLDAsMCwyOCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNjcsMCwwLDE0OCwwLDAsMCwxNDksMCwwLDAsMTM5LDAsMCwwLDI5LDAsMCwwLDMwLDAsMCwwLDQ2LDAsMCwwLDMxLDAsMCwwLDQ3LDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDMyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDM3LDAsMCwwLDAsMCwwLDAsMzcsMTEyLDAsMCwwLDAsMCwwLDAsMCwwLDAsNDAsNjIsMCwwLDE1MCwwLDAsMCwxNTEsMCwwLDAsMTM5LDAsMCwwLDQ1LDAsMCwwLDQ4LDAsMCwwLDQ5LDAsMCwwLDUwLDAsMCwwLDUxLDAsMCwwLDUyLDAsMCwwLDIyLDAsMCwwLDI0OCwyNTUsMjU1LDI1NSw0MCw2MiwwLDAsNDYsMCwwLDAsNDcsMCwwLDAsNDgsMCwwLDAsNDksMCwwLDAsNTAsMCwwLDAsNTEsMCwwLDAsNTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzcsNzIsNTgsMzcsNzcsNTgsMzcsODMsMzcsMTA5LDQ3LDM3LDEwMCw0NywzNywxMjEsMzcsODksNDUsMzcsMTA5LDQ1LDM3LDEwMCwzNyw3Myw1OCwzNyw3Nyw1OCwzNyw4MywzMiwzNywxMTIsMCwwLDAsMCwwLDM3LDcyLDU4LDM3LDc3LDAsMCwwLDM3LDcyLDU4LDM3LDc3LDU4LDM3LDgzLDAsMCwwLDAsMjAwLDYyLDAsMCwxNTIsMCwwLDAsMTUzLDAsMCwwLDEzOSwwLDAsMCw1MywwLDAsMCw1MywwLDAsMCw1NCwwLDAsMCw1NSwwLDAsMCw1NiwwLDAsMCw1NywwLDAsMCwyMywwLDAsMCwyNDgsMjU1LDI1NSwyNTUsMjAwLDYyLDAsMCw1NCwwLDAsMCw1NSwwLDAsMCw1NiwwLDAsMCw1NywwLDAsMCw1OCwwLDAsMCw1OSwwLDAsMCw2MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNywwLDAsMCw3MiwwLDAsMCw1OCwwLDAsMCwzNywwLDAsMCw3NywwLDAsMCw1OCwwLDAsMCwzNywwLDAsMCw4MywwLDAsMCwzNywwLDAsMCwxMDksMCwwLDAsNDcsMCwwLDAsMzcsMCwwLDAsMTAwLDAsMCwwLDQ3LDAsMCwwLDM3LDAsMCwwLDEyMSwwLDAsMCwzNywwLDAsMCw4OSwwLDAsMCw0NSwwLDAsMCwzNywwLDAsMCwxMDksMCwwLDAsNDUsMCwwLDAsMzcsMCwwLDAsMTAwLDAsMCwwLDM3LDAsMCwwLDczLDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDc3LDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDgzLDAsMCwwLDMyLDAsMCwwLDM3LDAsMCwwLDExMiwwLDAsMCwwLDAsMCwwLDM3LDAsMCwwLDcyLDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDc3LDAsMCwwLDAsMCwwLDAsMzcsMCwwLDAsNzIsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsNzcsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsODMsMCwwLDAsMCwwLDAsMCw4OCw2MywwLDAsMTU0LDAsMCwwLDE1NSwwLDAsMCwxMzksMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTkyLDYzLDAsMCwxNTYsMCwwLDAsMTU3LDAsMCwwLDEzOSwwLDAsMCwyMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNzYsNjAsMCwwLDE1OCwwLDAsMCwxNTksMCwwLDAsMTM5LDAsMCwwLDYxLDAsMCwwLDYyLDAsMCwwLDM0LDAsMCwwLDM1LDAsMCwwLDM2LDAsMCwwLDM3LDAsMCwwLDYzLDAsMCwwLDM4LDAsMCwwLDM5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDI0MCw2MCwwLDAsMTYwLDAsMCwwLDE2MSwwLDAsMCwxMzksMCwwLDAsNjQsMCwwLDAsNjUsMCwwLDAsNDAsMCwwLDAsNDEsMCwwLDAsNDIsMCwwLDAsNDMsMCwwLDAsNjYsMCwwLDAsNDQsMCwwLDAsNDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNDgsNjEsMCwwLDE2MiwwLDAsMCwxNjMsMCwwLDAsMTM5LDAsMCwwLDY3LDAsMCwwLDY4LDAsMCwwLDQ2LDAsMCwwLDQ3LDAsMCwwLDQ4LDAsMCwwLDQ5LDAsMCwwLDY5LDAsMCwwLDUwLDAsMCwwLDUxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDExMiw2MSwwLDAsMTY0LDAsMCwwLDE2NSwwLDAsMCwxMzksMCwwLDAsNzAsMCwwLDAsNzEsMCwwLDAsNTIsMCwwLDAsNTMsMCwwLDAsNTQsMCwwLDAsNTUsMCwwLDAsNzIsMCwwLDAsNTYsMCwwLDAsNTcsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTQ0LDY3LDAsMCwxNjYsMCwwLDAsMTY3LDAsMCwwLDEzOSwwLDAsMCwyNCwwLDAsMCwyNSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1NywwLDAsMCwwLDAsMCwzNyw3NiwxMDIsMCwwLDAsMCwwLDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTAzLDEwMSwxMTYsMzIsMTAxLDExNCwxMTQsMTExLDExNCwwLDAsMCwwLDAsMzIsNjgsMCwwLDE2OCwwLDAsMCwxNjksMCwwLDAsMTM5LDAsMCwwLDI2LDAsMCwwLDI3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMTc2LDY4LDAsMCwxNzAsMCwwLDAsMTcxLDAsMCwwLDEzOSwwLDAsMCwyMiwwLDAsMCw1OCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNyw0Niw0OCw3NiwxMDIsMCwwLDAsMCwwLDAsMCw2NCw2OSwwLDAsMTcyLDAsMCwwLDE3MywwLDAsMCwxMzksMCwwLDAsMjMsMCwwLDAsNTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNCw2NCwwLDAsMTc0LDAsMCwwLDE3NSwwLDAsMCwxMzksMCwwLDAsMzQsMCwwLDAsMzMsMCwwLDAsNTgsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODAsNjQsMCwwLDE3NiwwLDAsMCwxNzcsMCwwLDAsMTM5LDAsMCwwLDM1LDAsMCwwLDM0LDAsMCwwLDU5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMTgsMTAxLDk5LDExNiwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDY3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNiw2MCwwLDAsMTc4LDAsMCwwLDE3OSwwLDAsMCwxMzksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyMzIsNTYsMCwwLDE4MCwwLDAsMCwxODEsMCwwLDAsMTM5LDAsMCwwLDQwLDAsMCwwLDM2LDAsMCwwLDQxLDAsMCwwLDM3LDAsMCwwLDQyLDAsMCwwLDIyLDAsMCwwLDM4LDAsMCwwLDI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIwMCw1NywwLDAsMTgyLDAsMCwwLDE4MywwLDAsMCwxMzksMCwwLDAsMjIsMCwwLDAsMjMsMCwwLDAsMjUsMCwwLDAsNzMsMCwwLDAsNzQsMCwwLDAsMjYsMCwwLDAsNzUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTkyLDU5LDAsMCwxODQsMCwwLDAsMTg1LDAsMCwwLDEzOSwwLDAsMCw3NiwwLDAsMCw3NywwLDAsMCw2MCwwLDAsMCw2MSwwLDAsMCw2MiwwLDAsMCwwLDAsMCwwLDIzMiw1OSwwLDAsMTg2LDAsMCwwLDE4NywwLDAsMCwxMzksMCwwLDAsNzgsMCwwLDAsNzksMCwwLDAsNjMsMCwwLDAsNjQsMCwwLDAsNjUsMCwwLDAsMTE2LDAsMCwwLDExNCwwLDAsMCwxMTcsMCwwLDAsMTAxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMDIsOTcsMTA4LDExNSwxMDEsMCwwLDAsMTAyLDAsMCwwLDk3LDAsMCwwLDEwOCwwLDAsMCwxMTUsMCwwLDAsMTAxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzcsMCwwLDAsMTA5LDAsMCwwLDQ3LDAsMCwwLDM3LDAsMCwwLDEwMCwwLDAsMCw0NywwLDAsMCwzNywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDM3LDAsMCwwLDcyLDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDc3LDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDgzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNyw5NywzMiwzNyw5OCwzMiwzNywxMDAsMzIsMzcsNzIsNTgsMzcsNzcsNTgsMzcsODMsMzIsMzcsODksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNywwLDAsMCw5NywwLDAsMCwzMiwwLDAsMCwzNywwLDAsMCw5OCwwLDAsMCwzMiwwLDAsMCwzNywwLDAsMCwxMDAsMCwwLDAsMzIsMCwwLDAsMzcsMCwwLDAsNzIsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsNzcsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsODMsMCwwLDAsMzIsMCwwLDAsMzcsMCwwLDAsODksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDM3LDczLDU4LDM3LDc3LDU4LDM3LDgzLDMyLDM3LDExMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzcsMCwwLDAsNzMsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsNzcsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsODMsMCwwLDAsMzIsMCwwLDAsMzcsMCwwLDAsMTEyLDAsMCwwLDAsMCwwLDAsMTA4LDExMSw5OSw5NywxMDgsMTAxLDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDAsMCwwLDAsMCwwLDAsMCwzMiw1NiwwLDAsMTg4LDAsMCwwLDE4OSwwLDAsMCwxMzksMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTQsMTA4LDExMSw5OSw5NywxMDgsMTAxLDUzLDEwMiw5Nyw5OSwxMDEsMTE2LDY5LDAsMCwwLDIyNCw4NSwwLDAsOCw1NiwwLDAsMTA0LDM4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMTc2LDU2LDAsMCwxODgsMCwwLDAsMTkwLDAsMCwwLDEzOSwwLDAsMCwzOSwwLDAsMCwyMywwLDAsMCwyNCwwLDAsMCwyNSwwLDAsMCw0MywwLDAsMCw0MCwwLDAsMCw0NCwwLDAsMCw0MSwwLDAsMCw0NSwwLDAsMCwyNiwwLDAsMCw0MiwwLDAsMCwyNywwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1Myw5OSwxMTYsMTIxLDExMiwxMDEsNzMsMTE5LDY5LDY5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDk5LDExNiwxMjEsMTEyLDEwMSw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMTIwLDg0LDAsMCwxNDQsNTYsMCwwLDY0LDg2LDAsMCwxMjAsNTYsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNTYsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUzLDk5LDExNiwxMjEsMTEyLDEwMSw3Myw5OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwyMDgsNTYsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNTYsMCwwLDIsMCwwLDAsMCwwLDAsMCwxMjgsNTcsMCwwLDE4OCwwLDAsMCwxOTEsMCwwLDAsMTM5LDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDI4LDAsMCwwLDgwLDAsMCwwLDgxLDAsMCwwLDI5LDAsMCwwLDgyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSw5OSwxMTEsMTAwLDEwMSw5OSwxMTgsMTE2LDczLDk5LDk5LDQ5LDQ5LDk1LDk1LDEwOSw5OCwxMTUsMTE2LDk3LDExNiwxMDEsOTUsMTE2LDY5LDY5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUwLDk5LDExMSwxMDAsMTAxLDk5LDExOCwxMTYsOTUsOTgsOTcsMTE1LDEwMSw2OSwwLDAsMTIwLDg0LDAsMCw5Niw1NywwLDAsNjQsODYsMCwwLDU2LDU3LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMTIwLDU3LDAsMCwyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSw5OSwxMTEsMTAwLDEwMSw5OSwxMTgsMTE2LDczLDExOSw5OSw0OSw0OSw5NSw5NSwxMDksOTgsMTE1LDExNiw5NywxMTYsMTAxLDk1LDExNiw2OSw2OSwwLDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwxNjAsNTcsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxMjAsNTcsMCwwLDIsMCwwLDAsMCwwLDAsMCw2NCw1OCwwLDAsMTg4LDAsMCwwLDE5MiwwLDAsMCwxMzksMCwwLDAsMjYsMCwwLDAsMjcsMCwwLDAsMzAsMCwwLDAsODMsMCwwLDAsODQsMCwwLDAsMzEsMCwwLDAsODUsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDk5LDExMSwxMDAsMTAxLDk5LDExOCwxMTYsNzMsNjgsMTE1LDk5LDQ5LDQ5LDk1LDk1LDEwOSw5OCwxMTUsMTE2LDk3LDExNiwxMDEsOTUsMTE2LDY5LDY5LDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwyNCw1OCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDEyMCw1NywwLDAsMiwwLDAsMCwwLDAsMCwwLDE4NCw1OCwwLDAsMTg4LDAsMCwwLDE5MywwLDAsMCwxMzksMCwwLDAsMjgsMCwwLDAsMjksMCwwLDAsMzIsMCwwLDAsODYsMCwwLDAsODcsMCwwLDAsMzMsMCwwLDAsODgsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDk5LDExMSwxMDAsMTAxLDk5LDExOCwxMTYsNzMsNjgsMTA1LDk5LDQ5LDQ5LDk1LDk1LDEwOSw5OCwxMTUsMTE2LDk3LDExNiwxMDEsOTUsMTE2LDY5LDY5LDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwxNDQsNTgsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxMjAsNTcsMCwwLDIsMCwwLDAsMCwwLDAsMCw0OCw1OSwwLDAsMTg4LDAsMCwwLDE5NCwwLDAsMCwxMzksMCwwLDAsMjgsMCwwLDAsMjksMCwwLDAsMzIsMCwwLDAsODYsMCwwLDAsODcsMCwwLDAsMzMsMCwwLDAsODgsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU0LDk1LDk1LDExMCw5NywxMTQsMTE0LDExMSwxMTksOTUsMTE2LDExMSw5NSwxMTcsMTE2LDEwMiw1Niw3Myw3NiwxMDYsNTEsNTAsNjksNjksNjksMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDgsNTksMCwwLDE4NCw1OCwwLDAsMCwwLDAsMCwwLDAsMCwwLDE1Miw1OSwwLDAsMTg4LDAsMCwwLDE5NSwwLDAsMCwxMzksMCwwLDAsMjgsMCwwLDAsMjksMCwwLDAsMzIsMCwwLDAsODYsMCwwLDAsODcsMCwwLDAsMzMsMCwwLDAsODgsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU1LDk1LDk1LDExOSwxMDUsMTAwLDEwMSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExNywxMTYsMTAyLDU2LDczLDc2LDEwNiw1MSw1MCw2OSw2OSw2OSwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDExMiw1OSwwLDAsMTg0LDU4LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMTAsMTE3LDEwOSwxMTIsMTE3LDExMCw5OSwxMTYsNzMsOTksNjksNjksMCwwLDAsMCwyMjQsODUsMCwwLDE2OCw1OSwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDExMCwxMTcsMTA5LDExMiwxMTcsMTEwLDk5LDExNiw3MywxMTksNjksNjksMCwwLDAsMCwyMjQsODUsMCwwLDIwOCw1OSwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU0LDEwOCwxMTEsOTksOTcsMTA4LDEwMSw1Myw5NSw5NSwxMDUsMTA5LDExMiw2OSwwLDAsMCwyMjQsODUsMCwwLDI0OCw1OSwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDk5LDExMSwxMDgsMTA4LDk3LDExNiwxMDEsNzMsOTksNjksNjksMCwwLDAsMCwwLDIyNCw4NSwwLDAsMzIsNjAsMCwwLDMyLDU2LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSw5OSwxMTEsMTA4LDEwOCw5NywxMTYsMTAxLDczLDExOSw2OSw2OSwwLDAsMCwwLDAsMjI0LDg1LDAsMCw3Miw2MCwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDEwOSwxMTEsMTEwLDEwMSwxMjEsMTEyLDExNywxMTAsOTksMTE2LDczLDk5LDc2LDk4LDQ4LDY5LDY5LDY5LDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNDgsMTA5LDExMSwxMTAsMTAxLDEyMSw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMTIwLDg0LDAsMCwxNDQsNjAsMCwwLDY0LDg2LDAsMCwxMTIsNjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNjAsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDEwOSwxMTEsMTEwLDEwMSwxMjEsMTEyLDExNywxMTAsOTksMTE2LDczLDk5LDc2LDk4LDQ5LDY5LDY5LDY5LDAsMCwwLDAsMCw2NCw4NiwwLDAsMjA4LDYwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMTY4LDYwLDAsMCwyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCwxMDksMTExLDExMCwxMDEsMTIxLDExMiwxMTcsMTEwLDk5LDExNiw3MywxMTksNzYsOTgsNDgsNjksNjksNjksMCwwLDAsMCwwLDY0LDg2LDAsMCwxNiw2MSwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDE2OCw2MCwwLDAsMiwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNDgsMTA5LDExMSwxMTAsMTAxLDEyMSwxMTIsMTE3LDExMCw5OSwxMTYsNzMsMTE5LDc2LDk4LDQ5LDY5LDY5LDY5LDAsMCwwLDAsMCw2NCw4NiwwLDAsODAsNjEsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNjAsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDExNiwxMDUsMTA5LDEwMSw5NSwxMDMsMTAxLDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsMTE2LDEwNSwxMDksMTAxLDk1LDk4LDk3LDExNSwxMDEsNjksMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwyMTYsNjEsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTYsMTA1LDEwOSwxMDEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTUsMTE1LDExNiwxMTEsMTE0LDk3LDEwMywxMDEsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDI0OCw2MSwwLDAsNjQsODYsMCwwLDE0NCw2MSwwLDAsMCwwLDAsMCwzLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDI0MCw2MSwwLDAsMiwwLDAsMCwzMiw2MiwwLDAsMCw4LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTYsMTE2LDEwNSwxMDksMTAxLDk1LDEwMywxMDEsMTE2LDczLDExOSw3OCw4Myw5NSw0OSw1NywxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3MywxMTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDExOSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTYsMTA1LDEwOSwxMDEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTUsMTE1LDExNiwxMTEsMTE0LDk3LDEwMywxMDEsNzMsMTE5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwxNTIsNjIsMCwwLDY0LDg2LDAsMCw4MCw2MiwwLDAsMCwwLDAsMCwzLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDI0MCw2MSwwLDAsMiwwLDAsMCwxOTIsNjIsMCwwLDAsOCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDExNiwxMDUsMTA5LDEwMSw5NSwxMTIsMTE3LDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNDgsOTUsOTUsMTE2LDEwNSwxMDksMTAxLDk1LDExMiwxMTcsMTE2LDY5LDAsMCwwLDAsMTIwLDg0LDAsMCw1Niw2MywwLDAsNjQsODYsMCwwLDI0MCw2MiwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDgwLDYzLDAsMCwwLDgsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMTYsMTA1LDEwOSwxMDEsOTUsMTEyLDExNywxMTYsNzMsMTE5LDc4LDgzLDk1LDQ5LDU3LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsNjQsODYsMCwwLDEyMCw2MywwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDgwLDYzLDAsMCwwLDgsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTUsNzMsOTksNjksNjksMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTEsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMTE1LDk1LDk4LDk3LDExNSwxMDEsNjksMCwxMjAsODQsMCwwLDI0OCw2MywwLDAsNjQsODYsMCwwLDIyNCw2MywwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDE2LDY0LDAsMCwyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTUsNzMsMTE5LDY5LDY5LDAsMCwwLDAsNjQsODYsMCwwLDU2LDY0LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMTYsNjQsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDExMCwxMTcsMTA5LDk1LDEwMywxMDEsMTE2LDczLDk5LDc4LDgzLDk1LDQ5LDU3LDEwNSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk1LDk1LDExMCwxMTcsMTA5LDk1LDEwMywxMDEsMTE2LDczLDk5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Miw5NSw5NSwxMTAsMTE3LDEwOSw5NSwxMDMsMTAxLDExNiw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDIwOCw2NCwwLDAsNjQsODYsMCwwLDE4NCw2NCwwLDAsMCwwLDAsMCwxLDAsMCwwLDI0MCw2NCwwLDAsMCwwLDAsMCw2NCw4NiwwLDAsMTEyLDY0LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMjQ4LDY0LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSwxMTAsMTE3LDEwOSw5NSwxMDMsMTAxLDExNiw3MywxMTksNzgsODMsOTUsNDksNTcsMTA1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTgsMTE3LDEwMiw5NSwxMDUsMTE2LDEwMSwxMTQsOTcsMTE2LDExMSwxMTQsNzMsMTE5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3MywxMTksNjksNjksNjksNjksNjksNjksMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1Nyw5NSw5NSwxMTAsMTE3LDEwOSw5NSwxMDMsMTAxLDExNiw3MywxMTksNjksNjksMCwwLDAsNjQsODYsMCwwLDEyMCw2NSwwLDAsMCwwLDAsMCwxLDAsMCwwLDI0MCw2NCwwLDAsMCwwLDAsMCw2NCw4NiwwLDAsNDgsNjUsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNDQsNjUsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDk5LDc4LDgzLDk1LDQ5LDU3LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk1LDk1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDk5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Miw5NSw5NSwxMTAsMTE3LDEwOSw5NSwxMTIsMTE3LDExNiw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDQwLDY2LDAsMCw2NCw4NiwwLDAsMTYsNjYsMCwwLDAsMCwwLDAsMSwwLDAsMCw3Miw2NiwwLDAsMCwwLDAsMCw2NCw4NiwwLDAsMjAwLDY1LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsODAsNjYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDExOSw3OCw4Myw5NSw0OSw1NywxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3MywxMTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDExOSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk1LDk1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDExOSw2OSw2OSwwLDAsMCw2NCw4NiwwLDAsMjA4LDY2LDAsMCwwLDAsMCwwLDEsMCwwLDAsNzIsNjYsMCwwLDAsMCwwLDAsNjQsODYsMCwwLDEzNiw2NiwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDIzMiw2NiwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsMTA5LDExMSwxMTAsMTAxLDEyMSw5NSwxMDMsMTAxLDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTAzLDEwMSwxMTYsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsMTA0LDY3LDAsMCw2NCw4NiwwLDAsMzIsNjcsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxMzYsNjcsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTAzLDEwMSwxMTYsNzMsMTE5LDc4LDgzLDk1LDQ5LDU3LDEwNSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OSw5NSw5NSwxMDksMTExLDExMCwxMDEsMTIxLDk1LDEwMywxMDEsMTE2LDczLDExOSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwyNDgsNjcsMCwwLDY0LDg2LDAsMCwxNzYsNjcsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwyNCw2OCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsMTA5LDExMSwxMTAsMTAxLDEyMSw5NSwxMTIsMTE3LDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTEyLDExNywxMTYsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsMTM2LDY4LDAsMCw2NCw4NiwwLDAsNjQsNjgsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNjgsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTEyLDExNywxMTYsNzMsMTE5LDc4LDgzLDk1LDQ5LDU3LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OSw5NSw5NSwxMDksMTExLDExMCwxMDEsMTIxLDk1LDExMiwxMTcsMTE2LDczLDExOSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwyNCw2OSwwLDAsNjQsODYsMCwwLDIwOCw2OCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDU2LDY5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDY1LDAsMCwwLDc3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MCwwLDAsMCw3NywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDY1LDc3LDAsMCwwLDAsMCwwLDgwLDc3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3NCwwLDAsMCw5NywwLDAsMCwxMTAsMCwwLDAsMTE3LDAsMCwwLDk3LDAsMCwwLDExNCwwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCw3MCwwLDAsMCwxMDEsMCwwLDAsOTgsMCwwLDAsMTE0LDAsMCwwLDExNywwLDAsMCw5NywwLDAsMCwxMTQsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3NywwLDAsMCw5NywwLDAsMCwxMTQsMCwwLDAsOTksMCwwLDAsMTA0LDAsMCwwLDAsMCwwLDAsNjUsMCwwLDAsMTEyLDAsMCwwLDExNCwwLDAsMCwxMDUsMCwwLDAsMTA4LDAsMCwwLDAsMCwwLDAsNzQsMCwwLDAsMTE3LDAsMCwwLDExMCwwLDAsMCwxMDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDc0LDAsMCwwLDExNywwLDAsMCwxMDgsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw2NSwwLDAsMCwxMTcsMCwwLDAsMTAzLDAsMCwwLDExNywwLDAsMCwxMTUsMCwwLDAsMTE2LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCwxMDEsMCwwLDAsMTEyLDAsMCwwLDExNiwwLDAsMCwxMDEsMCwwLDAsMTA5LDAsMCwwLDk4LDAsMCwwLDEwMSwwLDAsMCwxMTQsMCwwLDAsMCwwLDAsMCw3OSwwLDAsMCw5OSwwLDAsMCwxMTYsMCwwLDAsMTExLDAsMCwwLDk4LDAsMCwwLDEwMSwwLDAsMCwxMTQsMCwwLDAsMCwwLDAsMCw3OCwwLDAsMCwxMTEsMCwwLDAsMTE4LDAsMCwwLDEwMSwwLDAsMCwxMDksMCwwLDAsOTgsMCwwLDAsMTAxLDAsMCwwLDExNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNjgsMCwwLDAsMTAxLDAsMCwwLDk5LDAsMCwwLDEwMSwwLDAsMCwxMDksMCwwLDAsOTgsMCwwLDAsMTAxLDAsMCwwLDExNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzQsMCwwLDAsOTcsMCwwLDAsMTEwLDAsMCwwLDAsMCwwLDAsNzAsMCwwLDAsMTAxLDAsMCwwLDk4LDAsMCwwLDAsMCwwLDAsNzcsMCwwLDAsOTcsMCwwLDAsMTE0LDAsMCwwLDAsMCwwLDAsNjVdLCJpOCIsQUxMT0NfTk9ORSxSdW50aW1lLkdMT0JBTF9CQVNFKzkzMjQpO2FsbG9jYXRlKFsxMTIsMCwwLDAsMTE0LDAsMCwwLDAsMCwwLDAsNzcsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsNzQsMCwwLDAsMTE3LDAsMCwwLDExMCwwLDAsMCwwLDAsMCwwLDc0LDAsMCwwLDExNywwLDAsMCwxMDgsMCwwLDAsMCwwLDAsMCw2NSwwLDAsMCwxMTcsMCwwLDAsMTAzLDAsMCwwLDAsMCwwLDAsODMsMCwwLDAsMTAxLDAsMCwwLDExMiwwLDAsMCwwLDAsMCwwLDc5LDAsMCwwLDk5LDAsMCwwLDExNiwwLDAsMCwwLDAsMCwwLDc4LDAsMCwwLDExMSwwLDAsMCwxMTgsMCwwLDAsMCwwLDAsMCw2OCwwLDAsMCwxMDEsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzQsOTcsMTEwLDExNyw5NywxMTQsMTIxLDAsNzAsMTAxLDk4LDExNCwxMTcsOTcsMTE0LDEyMSwwLDAsMCwwLDAsMCwwLDAsNzcsOTcsMTE0LDk5LDEwNCwwLDAsMCw2NSwxMTIsMTE0LDEwNSwxMDgsMCwwLDAsNzcsOTcsMTIxLDAsMCwwLDAsMCw3NCwxMTcsMTEwLDEwMSwwLDAsMCwwLDc0LDExNywxMDgsMTIxLDAsMCwwLDAsNjUsMTE3LDEwMywxMTcsMTE1LDExNiwwLDAsODMsMTAxLDExMiwxMTYsMTAxLDEwOSw5OCwxMDEsMTE0LDAsMCwwLDAsMCwwLDAsNzksOTksMTE2LDExMSw5OCwxMDEsMTE0LDAsNzgsMTExLDExOCwxMDEsMTA5LDk4LDEwMSwxMTQsMCwwLDAsMCwwLDAsMCwwLDY4LDEwMSw5OSwxMDEsMTA5LDk4LDEwMSwxMTQsMCwwLDAsMCwwLDAsMCwwLDc0LDk3LDExMCwwLDAsMCwwLDAsNzAsMTAxLDk4LDAsMCwwLDAsMCw3Nyw5NywxMTQsMCwwLDAsMCwwLDY1LDExMiwxMTQsMCwwLDAsMCwwLDc0LDExNywxMTAsMCwwLDAsMCwwLDc0LDExNywxMDgsMCwwLDAsMCwwLDY1LDExNywxMDMsMCwwLDAsMCwwLDgzLDEwMSwxMTIsMCwwLDAsMCwwLDc5LDk5LDExNiwwLDAsMCwwLDAsNzgsMTExLDExOCwwLDAsMCwwLDAsNjgsMTAxLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODMsMCwwLDAsMTE3LDAsMCwwLDExMCwwLDAsMCwxMDAsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3NywwLDAsMCwxMTEsMCwwLDAsMTEwLDAsMCwwLDEwMCwwLDAsMCw5NywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDg0LDAsMCwwLDExNywwLDAsMCwxMDEsMCwwLDAsMTE1LDAsMCwwLDEwMCwwLDAsMCw5NywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCw4NywwLDAsMCwxMDEsMCwwLDAsMTAwLDAsMCwwLDExMCwwLDAsMCwxMDEsMCwwLDAsMTE1LDAsMCwwLDEwMCwwLDAsMCw5NywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCw4NCwwLDAsMCwxMDQsMCwwLDAsMTE3LDAsMCwwLDExNCwwLDAsMCwxMTUsMCwwLDAsMTAwLDAsMCwwLDk3LDAsMCwwLDEyMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzAsMCwwLDAsMTE0LDAsMCwwLDEwNSwwLDAsMCwxMDAsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCw5NywwLDAsMCwxMTYsMCwwLDAsMTE3LDAsMCwwLDExNCwwLDAsMCwxMDAsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCwxMTcsMCwwLDAsMTEwLDAsMCwwLDAsMCwwLDAsNzcsMCwwLDAsMTExLDAsMCwwLDExMCwwLDAsMCwwLDAsMCwwLDg0LDAsMCwwLDExNywwLDAsMCwxMDEsMCwwLDAsMCwwLDAsMCw4NywwLDAsMCwxMDEsMCwwLDAsMTAwLDAsMCwwLDAsMCwwLDAsODQsMCwwLDAsMTA0LDAsMCwwLDExNywwLDAsMCwwLDAsMCwwLDcwLDAsMCwwLDExNCwwLDAsMCwxMDUsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCw5NywwLDAsMCwxMTYsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODMsMTE3LDExMCwxMDAsOTcsMTIxLDAsMCw3NywxMTEsMTEwLDEwMCw5NywxMjEsMCwwLDg0LDExNywxMDEsMTE1LDEwMCw5NywxMjEsMCw4NywxMDEsMTAwLDExMCwxMDEsMTE1LDEwMCw5NywxMjEsMCwwLDAsMCwwLDAsMCw4NCwxMDQsMTE3LDExNCwxMTUsMTAwLDk3LDEyMSwwLDAsMCwwLDAsMCwwLDAsNzAsMTE0LDEwNSwxMDAsOTcsMTIxLDAsMCw4Myw5NywxMTYsMTE3LDExNCwxMDAsOTcsMTIxLDAsMCwwLDAsMCwwLDAsMCw4MywxMTcsMTEwLDAsMCwwLDAsMCw3NywxMTEsMTEwLDAsMCwwLDAsMCw4NCwxMTcsMTAxLDAsMCwwLDAsMCw4NywxMDEsMTAwLDAsMCwwLDAsMCw4NCwxMDQsMTE3LDAsMCwwLDAsMCw3MCwxMTQsMTA1LDAsMCwwLDAsMCw4Myw5NywxMTYsMCwwLDAsMCwwLDIsMCwwLDE5MiwzLDAsMCwxOTIsNCwwLDAsMTkyLDUsMCwwLDE5Miw2LDAsMCwxOTIsNywwLDAsMTkyLDgsMCwwLDE5Miw5LDAsMCwxOTIsMTAsMCwwLDE5MiwxMSwwLDAsMTkyLDEyLDAsMCwxOTIsMTMsMCwwLDE5MiwxNCwwLDAsMTkyLDE1LDAsMCwxOTIsMTYsMCwwLDE5MiwxNywwLDAsMTkyLDE4LDAsMCwxOTIsMTksMCwwLDE5MiwyMCwwLDAsMTkyLDIxLDAsMCwxOTIsMjIsMCwwLDE5MiwyMywwLDAsMTkyLDI0LDAsMCwxOTIsMjUsMCwwLDE5MiwyNiwwLDAsMTkyLDI3LDAsMCwxOTIsMjgsMCwwLDE5MiwyOSwwLDAsMTkyLDMwLDAsMCwxOTIsMzEsMCwwLDE5MiwwLDAsMCwxNzksMSwwLDAsMTk1LDIsMCwwLDE5NSwzLDAsMCwxOTUsNCwwLDAsMTk1LDUsMCwwLDE5NSw2LDAsMCwxOTUsNywwLDAsMTk1LDgsMCwwLDE5NSw5LDAsMCwxOTUsMTAsMCwwLDE5NSwxMSwwLDAsMTk1LDEyLDAsMCwxOTUsMTMsMCwwLDIxMSwxNCwwLDAsMTk1LDE1LDAsMCwxOTUsMCwwLDEyLDE4NywxLDAsMTIsMTk1LDIsMCwxMiwxOTUsMywwLDEyLDE5NSw0LDAsMTIsMjExLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEyOCw4MywwLDAsMTk2LDAsMCwwLDE5NywwLDAsMCw4OSwwLDAsMCwwLDAsMCwwLDExNSwxMTYsMTAwLDU4LDU4LDk4LDk3LDEwMCw5NSw5OSw5NywxMTUsMTE2LDAsMCwwLDgzLDExNiw1NywxMTYsMTIxLDExMiwxMDEsOTUsMTA1LDExMCwxMDIsMTExLDAsMCwwLDAsMTIwLDg0LDAsMCw4OCw4MywwLDAsODMsMTE2LDU2LDk4LDk3LDEwMCw5NSw5OSw5NywxMTUsMTE2LDAsMCwwLDAsMCwyMjQsODUsMCwwLDExMiw4MywwLDAsMCwwLDAsMCwwLDAsMCwwLDc4LDQ5LDQ4LDk1LDk1LDk5LDEyMCwxMjAsOTcsOTgsMTA1LDExOCw0OSw0OSw1NCw5NSw5NSwxMTUsMTA0LDEwNSwxMDksOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxNDQsODMsMCwwLDEwNCw4MywwLDAsMCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNDksNTUsOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMjAwLDgzLDAsMCwxODQsODMsMCwwLDAsMCwwLDAsNzgsNDksNDgsOTUsOTUsOTksMTIwLDEyMCw5Nyw5OCwxMDUsMTE4LDQ5LDQ5LDU3LDk1LDk1LDExMiwxMTEsMTA1LDExMCwxMTYsMTAxLDExNCw5NSwxMTYsMTIxLDExMiwxMDEsOTUsMTA1LDExMCwxMDIsMTExLDY5LDAsMCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNDksNTUsOTUsOTUsMTEyLDk4LDk3LDExNSwxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsNDAsODQsMCwwLDE4NCw4MywwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDAsODQsMCwwLDgwLDg0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMjQwLDgzLDAsMCwxOTgsMCwwLDAsMTk5LDAsMCwwLDIwMCwwLDAsMCwyMDEsMCwwLDAsNDMsMCwwLDAsMzUsMCwwLDAsMjIsMCwwLDAsMjcsMCwwLDAsMCwwLDAsMCw5Niw4NCwwLDAsMTk4LDAsMCwwLDIwMiwwLDAsMCwyMDAsMCwwLDAsMjAxLDAsMCwwLDQ0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDg1LDAsMCwxOTgsMCwwLDAsMjAzLDAsMCwwLDIwMCwwLDAsMCwyMDEsMCwwLDAsNDUsMCwwLDAsMCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNTAsNTEsOTUsOTUsMTAyLDExNywxMTAsMTAwLDk3LDEwOSwxMDEsMTEwLDExNiw5NywxMDgsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDIyNCw4NSwwLDAsMjE2LDg0LDAsMCwxODQsODMsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCwxMTIsMTcsMCwwLDY4LDExMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDI0LDg1LDAsMCw5OCwwLDAsMCwwLDAsMCwwLDE5Miw4NCwwLDAsNDAsODUsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCw1Niw4NSwwLDAsMTA0LDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCw3Miw4NSwwLDAsOTcsMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDg4LDg1LDAsMCwxOTIsODQsMCwwLDEyOCwxNywwLDAsMTkyLDg0LDAsMCwxMjAsMTcsMCwwLDEwNSwwLDAsMCwwLDAsMCwwLDE5Miw4NCwwLDAsMTIwLDg1LDAsMCwxMDYsMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDEzNiw4NSwwLDAsMTA4LDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCwxNTIsODUsMCwwLDEwOSwwLDAsMCwwLDAsMCwwLDE5Miw4NCwwLDAsMTY4LDg1LDAsMCwxMDIsMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDE4NCw4NSwwLDAsMTAwLDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCwyMDAsODUsMCwwLDAsMCwwLDAsNDAsODYsMCwwLDE5OCwwLDAsMCwyMDQsMCwwLDAsMjAwLDAsMCwwLDIwMSwwLDAsMCw0MywwLDAsMCwzNiwwLDAsMCwyMywwLDAsMCwyOCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNTAsNDgsOTUsOTUsMTE1LDEwNSw5NSw5OSwxMDgsOTcsMTE1LDExNSw5NSwxMTYsMTIxLDExMiwxMDEsOTUsMTA1LDExMCwxMDIsMTExLDY5LDAsMCwwLDAsMjI0LDg1LDAsMCwwLDg2LDAsMCwyNDAsODMsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMzYsODYsMCwwLDE5OCwwLDAsMCwyMDUsMCwwLDAsMjAwLDAsMCwwLDIwMSwwLDAsMCw0MywwLDAsMCwzNywwLDAsMCwyNCwwLDAsMCwyOSwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNTAsNDksOTUsOTUsMTE4LDEwOSwxMDUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwyMjQsODUsMCwwLDk2LDg2LDAsMCwyNDAsODMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyMDAsODgsMCwwLDIwNiwwLDAsMCwyMDcsMCwwLDAsOTAsMCwwLDAsMCwwLDAsMCwxMTUsMTE2LDEwMCw1OCw1OCw5OCw5NywxMDAsOTUsOTcsMTA4LDEwOCwxMTEsOTksMCwwLDgzLDExNiw1Nyw5OCw5NywxMDAsOTUsOTcsMTA4LDEwOCwxMTEsOTksMCwwLDAsMCwyMjQsODUsMCwwLDE4NCw4OCwwLDAsMCwwLDAsMCwwLDAsMCwwLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwwLDEsMiwzLDQsNSw2LDcsOCw5LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMCwwLDAsMCwwLDAsMCwwLDEsMiw0LDcsMyw2LDUsMCwwLDAsMCwwLDAsMCwwLDEwNSwxMTAsMTAyLDEwNSwxMTAsMTA1LDExNiwxMjEsMCwwLDAsMCwwLDAsMCwwLDExMCw5NywxMTAsMCwwLDAsMCwwLDk1LDExMiwxMzcsMCwyNTUsOSw0NywxNSwxMCwwLDAsMCwxMDAsMCwwLDAsMjMyLDMsMCwwLDE2LDM5LDAsMCwxNjAsMTM0LDEsMCw2NCw2NiwxNSwwLDEyOCwxNTAsMTUyLDAsMCwyMjUsMjQ1LDVdLCJpOCIsQUxMT0NfTk9ORSxSdW50aW1lLkdMT0JBTF9CQVNFKzE5NTY0KTt2YXIgdGVtcERvdWJsZVB0cj1SdW50aW1lLmFsaWduTWVtb3J5KGFsbG9jYXRlKDEyLCJpOCIsQUxMT0NfU1RBVElDKSw4KTthc3NlcnQodGVtcERvdWJsZVB0ciU4PT0wKTtmdW5jdGlvbiBjb3B5VGVtcEZsb2F0KHB0cil7SEVBUDhbdGVtcERvdWJsZVB0cl09SEVBUDhbcHRyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzFdPUhFQVA4W3B0cisxXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzJdPUhFQVA4W3B0cisyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzNdPUhFQVA4W3B0ciszXX1mdW5jdGlvbiBjb3B5VGVtcERvdWJsZShwdHIpe0hFQVA4W3RlbXBEb3VibGVQdHJdPUhFQVA4W3B0cl07SEVBUDhbdGVtcERvdWJsZVB0cisxXT1IRUFQOFtwdHIrMV07SEVBUDhbdGVtcERvdWJsZVB0cisyXT1IRUFQOFtwdHIrMl07SEVBUDhbdGVtcERvdWJsZVB0ciszXT1IRUFQOFtwdHIrM107SEVBUDhbdGVtcERvdWJsZVB0cis0XT1IRUFQOFtwdHIrNF07SEVBUDhbdGVtcERvdWJsZVB0cis1XT1IRUFQOFtwdHIrNV07SEVBUDhbdGVtcERvdWJsZVB0cis2XT1IRUFQOFtwdHIrNl07SEVBUDhbdGVtcERvdWJsZVB0cis3XT1IRUFQOFtwdHIrN119ZnVuY3Rpb24gX2F0ZXhpdChmdW5jLGFyZyl7X19BVEVYSVRfXy51bnNoaWZ0KHtmdW5jOmZ1bmMsYXJnOmFyZ30pfXZhciBfX19jeGFfYXRleGl0PV9hdGV4aXQ7TW9kdWxlWyJfaTY0U3VidHJhY3QiXT1faTY0U3VidHJhY3Q7TW9kdWxlWyJfaTY0QWRkIl09X2k2NEFkZDtmdW5jdGlvbiBfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udigpe3JldHVybiEhX19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYudW5jYXVnaHRfZXhjZXB0aW9ufWZ1bmN0aW9uIF9fX2N4YV9pc19udW1iZXJfdHlwZSh0eXBlKXt2YXIgaXNOdW1iZXI9ZmFsc2U7dHJ5e2lmKHR5cGU9PV9fWlRJaSlpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVElqKWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSWwpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJbSlpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVEl4KWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSXkpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJZilpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVElkKWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSWUpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJYylpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVElhKWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSWgpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJcylpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVEl0KWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXJldHVybiBpc051bWJlcn1mdW5jdGlvbiBfX19jeGFfZG9lc19pbmhlcml0KGRlZmluaXRlVHlwZSxwb3NzaWJpbGl0eVR5cGUscG9zc2liaWxpdHkpe2lmKHBvc3NpYmlsaXR5PT0wKXJldHVybiBmYWxzZTtpZihwb3NzaWJpbGl0eVR5cGU9PTB8fHBvc3NpYmlsaXR5VHlwZT09ZGVmaW5pdGVUeXBlKXJldHVybiB0cnVlO3ZhciBwb3NzaWJpbGl0eV90eXBlX2luZm87aWYoX19fY3hhX2lzX251bWJlcl90eXBlKHBvc3NpYmlsaXR5VHlwZSkpe3Bvc3NpYmlsaXR5X3R5cGVfaW5mbz1wb3NzaWJpbGl0eVR5cGV9ZWxzZXt2YXIgcG9zc2liaWxpdHlfdHlwZV9pbmZvQWRkcj1IRUFQMzJbcG9zc2liaWxpdHlUeXBlPj4yXS04O3Bvc3NpYmlsaXR5X3R5cGVfaW5mbz1IRUFQMzJbcG9zc2liaWxpdHlfdHlwZV9pbmZvQWRkcj4+Ml19c3dpdGNoKHBvc3NpYmlsaXR5X3R5cGVfaW5mbyl7Y2FzZSAwOnZhciBkZWZpbml0ZV90eXBlX2luZm9BZGRyPUhFQVAzMltkZWZpbml0ZVR5cGU+PjJdLTg7dmFyIGRlZmluaXRlX3R5cGVfaW5mbz1IRUFQMzJbZGVmaW5pdGVfdHlwZV9pbmZvQWRkcj4+Ml07aWYoZGVmaW5pdGVfdHlwZV9pbmZvPT0wKXt2YXIgZGVmUG9pbnRlckJhc2VBZGRyPWRlZmluaXRlVHlwZSs4O3ZhciBkZWZQb2ludGVyQmFzZVR5cGU9SEVBUDMyW2RlZlBvaW50ZXJCYXNlQWRkcj4+Ml07dmFyIHBvc3NQb2ludGVyQmFzZUFkZHI9cG9zc2liaWxpdHlUeXBlKzg7dmFyIHBvc3NQb2ludGVyQmFzZVR5cGU9SEVBUDMyW3Bvc3NQb2ludGVyQmFzZUFkZHI+PjJdO3JldHVybiBfX19jeGFfZG9lc19pbmhlcml0KGRlZlBvaW50ZXJCYXNlVHlwZSxwb3NzUG9pbnRlckJhc2VUeXBlLHBvc3NpYmlsaXR5KX1lbHNlIHJldHVybiBmYWxzZTtjYXNlIDE6cmV0dXJuIGZhbHNlO2Nhc2UgMjp2YXIgcGFyZW50VHlwZUFkZHI9cG9zc2liaWxpdHlUeXBlKzg7dmFyIHBhcmVudFR5cGU9SEVBUDMyW3BhcmVudFR5cGVBZGRyPj4yXTtyZXR1cm4gX19fY3hhX2RvZXNfaW5oZXJpdChkZWZpbml0ZVR5cGUscGFyZW50VHlwZSxwb3NzaWJpbGl0eSk7ZGVmYXVsdDpyZXR1cm4gZmFsc2V9fXZhciBfX19jeGFfbGFzdF90aHJvd25fZXhjZXB0aW9uPTA7ZnVuY3Rpb24gX19fcmVzdW1lRXhjZXB0aW9uKHB0cil7TW9kdWxlLnByaW50KCJSZXN1bWluZyBleGNlcHRpb24iKTtpZighX19fY3hhX2xhc3RfdGhyb3duX2V4Y2VwdGlvbil7X19fY3hhX2xhc3RfdGhyb3duX2V4Y2VwdGlvbj1wdHJ9dGhyb3cgcHRyfXZhciBfX19jeGFfZXhjZXB0aW9uX2hlYWRlcl9zaXplPTg7ZnVuY3Rpb24gX19fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2godGhyb3duLHRocm93bnR5cGUpe2lmKHRocm93bj09LTEpdGhyb3duPV9fX2N4YV9sYXN0X3Rocm93bl9leGNlcHRpb247aGVhZGVyPXRocm93bi1fX19jeGFfZXhjZXB0aW9uX2hlYWRlcl9zaXplO2lmKHRocm93bnR5cGU9PS0xKXRocm93bnR5cGU9SEVBUDMyW2hlYWRlcj4+Ml07dmFyIHR5cGVBcnJheT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7aWYodGhyb3dudHlwZSE9MCYmIV9fX2N4YV9pc19udW1iZXJfdHlwZSh0aHJvd250eXBlKSl7dmFyIHRocm93bnR5cGVJbmZvQWRkcj1IRUFQMzJbdGhyb3dudHlwZT4+Ml0tODt2YXIgdGhyb3dudHlwZUluZm89SEVBUDMyW3Rocm93bnR5cGVJbmZvQWRkcj4+Ml07aWYodGhyb3dudHlwZUluZm89PTApdGhyb3duPUhFQVAzMlt0aHJvd24+PjJdfWZvcih2YXIgaT0wO2k8dHlwZUFycmF5Lmxlbmd0aDtpKyspe2lmKF9fX2N4YV9kb2VzX2luaGVyaXQodHlwZUFycmF5W2ldLHRocm93bnR5cGUsdGhyb3duKSlyZXR1cm4oYXNtWyJzZXRUZW1wUmV0MCJdKHR5cGVBcnJheVtpXSksdGhyb3duKXwwfXJldHVybihhc21bInNldFRlbXBSZXQwIl0odGhyb3dudHlwZSksdGhyb3duKXwwfWZ1bmN0aW9uIF9fX2N4YV90aHJvdyhwdHIsdHlwZSxkZXN0cnVjdG9yKXtpZighX19fY3hhX3Rocm93LmluaXRpYWxpemVkKXt0cnl7SEVBUDMyW19fWlRWTjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0U+PjJdPTB9Y2F0Y2goZSl7fXRyeXtIRUFQMzJbX19aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0U+PjJdPTF9Y2F0Y2goZSl7fXRyeXtIRUFQMzJbX19aVFZOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0U+PjJdPTJ9Y2F0Y2goZSl7fV9fX2N4YV90aHJvdy5pbml0aWFsaXplZD10cnVlfU1vZHVsZS5wcmludEVycigiQ29tcGlsZWQgY29kZSB0aHJvd2luZyBhbiBleGNlcHRpb24sICIrW3B0cix0eXBlLGRlc3RydWN0b3JdKyIsIGF0ICIrc3RhY2tUcmFjZSgpKTt2YXIgaGVhZGVyPXB0ci1fX19jeGFfZXhjZXB0aW9uX2hlYWRlcl9zaXplO0hFQVAzMltoZWFkZXI+PjJdPXR5cGU7SEVBUDMyW2hlYWRlcis0Pj4yXT1kZXN0cnVjdG9yO19fX2N4YV9sYXN0X3Rocm93bl9leGNlcHRpb249cHRyO2lmKCEoInVuY2F1Z2h0X2V4Y2VwdGlvbiJpbiBfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udikpe19fWlN0MTh1bmNhdWdodF9leGNlcHRpb252LnVuY2F1Z2h0X2V4Y2VwdGlvbj0xfWVsc2V7X19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYudW5jYXVnaHRfZXhjZXB0aW9uKyt9dGhyb3cgcHRyfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Jvb2woKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfYm9vbCIpO2Fib3J0KC0xKX1mdW5jdGlvbiBfcHRocmVhZF9tdXRleF9sb2NrKCl7fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcoKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfc3RkX3N0cmluZyIpO2Fib3J0KC0xKX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZygpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZyIpO2Fib3J0KC0xKX12YXIgRVJSTk9fQ09ERVM9e0VQRVJNOjEsRU5PRU5UOjIsRVNSQ0g6MyxFSU5UUjo0LEVJTzo1LEVOWElPOjYsRTJCSUc6NyxFTk9FWEVDOjgsRUJBREY6OSxFQ0hJTEQ6MTAsRUFHQUlOOjExLEVXT1VMREJMT0NLOjExLEVOT01FTToxMixFQUNDRVM6MTMsRUZBVUxUOjE0LEVOT1RCTEs6MTUsRUJVU1k6MTYsRUVYSVNUOjE3LEVYREVWOjE4LEVOT0RFVjoxOSxFTk9URElSOjIwLEVJU0RJUjoyMSxFSU5WQUw6MjIsRU5GSUxFOjIzLEVNRklMRToyNCxFTk9UVFk6MjUsRVRYVEJTWToyNixFRkJJRzoyNyxFTk9TUEM6MjgsRVNQSVBFOjI5LEVST0ZTOjMwLEVNTElOSzozMSxFUElQRTozMixFRE9NOjMzLEVSQU5HRTozNCxFTk9NU0c6NDIsRUlEUk06NDMsRUNIUk5HOjQ0LEVMMk5TWU5DOjQ1LEVMM0hMVDo0NixFTDNSU1Q6NDcsRUxOUk5HOjQ4LEVVTkFUQ0g6NDksRU5PQ1NJOjUwLEVMMkhMVDo1MSxFREVBRExLOjM1LEVOT0xDSzozNyxFQkFERTo1MixFQkFEUjo1MyxFWEZVTEw6NTQsRU5PQU5POjU1LEVCQURSUUM6NTYsRUJBRFNMVDo1NyxFREVBRExPQ0s6MzUsRUJGT05UOjU5LEVOT1NUUjo2MCxFTk9EQVRBOjYxLEVUSU1FOjYyLEVOT1NSOjYzLEVOT05FVDo2NCxFTk9QS0c6NjUsRVJFTU9URTo2NixFTk9MSU5LOjY3LEVBRFY6NjgsRVNSTU5UOjY5LEVDT01NOjcwLEVQUk9UTzo3MSxFTVVMVElIT1A6NzIsRURPVERPVDo3MyxFQkFETVNHOjc0LEVOT1RVTklROjc2LEVCQURGRDo3NyxFUkVNQ0hHOjc4LEVMSUJBQ0M6NzksRUxJQkJBRDo4MCxFTElCU0NOOjgxLEVMSUJNQVg6ODIsRUxJQkVYRUM6ODMsRU5PU1lTOjM4LEVOT1RFTVBUWTozOSxFTkFNRVRPT0xPTkc6MzYsRUxPT1A6NDAsRU9QTk9UU1VQUDo5NSxFUEZOT1NVUFBPUlQ6OTYsRUNPTk5SRVNFVDoxMDQsRU5PQlVGUzoxMDUsRUFGTk9TVVBQT1JUOjk3LEVQUk9UT1RZUEU6OTEsRU5PVFNPQ0s6ODgsRU5PUFJPVE9PUFQ6OTIsRVNIVVRET1dOOjEwOCxFQ09OTlJFRlVTRUQ6MTExLEVBRERSSU5VU0U6OTgsRUNPTk5BQk9SVEVEOjEwMyxFTkVUVU5SRUFDSDoxMDEsRU5FVERPV046MTAwLEVUSU1FRE9VVDoxMTAsRUhPU1RET1dOOjExMixFSE9TVFVOUkVBQ0g6MTEzLEVJTlBST0dSRVNTOjExNSxFQUxSRUFEWToxMTQsRURFU1RBRERSUkVROjg5LEVNU0dTSVpFOjkwLEVQUk9UT05PU1VQUE9SVDo5MyxFU09DS1ROT1NVUFBPUlQ6OTQsRUFERFJOT1RBVkFJTDo5OSxFTkVUUkVTRVQ6MTAyLEVJU0NPTk46MTA2LEVOT1RDT05OOjEwNyxFVE9PTUFOWVJFRlM6MTA5LEVVU0VSUzo4NyxFRFFVT1Q6MTIyLEVTVEFMRToxMTYsRU5PVFNVUDo5NSxFTk9NRURJVU06MTIzLEVJTFNFUTo4NCxFT1ZFUkZMT1c6NzUsRUNBTkNFTEVEOjEyNSxFTk9UUkVDT1ZFUkFCTEU6MTMxLEVPV05FUkRFQUQ6MTMwLEVTVFJQSVBFOjg2fTt2YXIgRVJSTk9fTUVTU0FHRVM9ezA6IlN1Y2Nlc3MiLDE6Ik5vdCBzdXBlci11c2VyIiwyOiJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiwzOiJObyBzdWNoIHByb2Nlc3MiLDQ6IkludGVycnVwdGVkIHN5c3RlbSBjYWxsIiw1OiJJL08gZXJyb3IiLDY6Ik5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiLDc6IkFyZyBsaXN0IHRvbyBsb25nIiw4OiJFeGVjIGZvcm1hdCBlcnJvciIsOToiQmFkIGZpbGUgbnVtYmVyIiwxMDoiTm8gY2hpbGRyZW4iLDExOiJObyBtb3JlIHByb2Nlc3NlcyIsMTI6Ik5vdCBlbm91Z2ggY29yZSIsMTM6IlBlcm1pc3Npb24gZGVuaWVkIiwxNDoiQmFkIGFkZHJlc3MiLDE1OiJCbG9jayBkZXZpY2UgcmVxdWlyZWQiLDE2OiJNb3VudCBkZXZpY2UgYnVzeSIsMTc6IkZpbGUgZXhpc3RzIiwxODoiQ3Jvc3MtZGV2aWNlIGxpbmsiLDE5OiJObyBzdWNoIGRldmljZSIsMjA6Ik5vdCBhIGRpcmVjdG9yeSIsMjE6IklzIGEgZGlyZWN0b3J5IiwyMjoiSW52YWxpZCBhcmd1bWVudCIsMjM6IlRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtIiwyNDoiVG9vIG1hbnkgb3BlbiBmaWxlcyIsMjU6Ik5vdCBhIHR5cGV3cml0ZXIiLDI2OiJUZXh0IGZpbGUgYnVzeSIsMjc6IkZpbGUgdG9vIGxhcmdlIiwyODoiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiLDI5OiJJbGxlZ2FsIHNlZWsiLDMwOiJSZWFkIG9ubHkgZmlsZSBzeXN0ZW0iLDMxOiJUb28gbWFueSBsaW5rcyIsMzI6IkJyb2tlbiBwaXBlIiwzMzoiTWF0aCBhcmcgb3V0IG9mIGRvbWFpbiBvZiBmdW5jIiwzNDoiTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUiLDM1OiJGaWxlIGxvY2tpbmcgZGVhZGxvY2sgZXJyb3IiLDM2OiJGaWxlIG9yIHBhdGggbmFtZSB0b28gbG9uZyIsMzc6Ik5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUiLDM4OiJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiLDM5OiJEaXJlY3Rvcnkgbm90IGVtcHR5Iiw0MDoiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MiLDQyOiJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSIsNDM6IklkZW50aWZpZXIgcmVtb3ZlZCIsNDQ6IkNoYW5uZWwgbnVtYmVyIG91dCBvZiByYW5nZSIsNDU6IkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIsNDY6IkxldmVsIDMgaGFsdGVkIiw0NzoiTGV2ZWwgMyByZXNldCIsNDg6IkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZSIsNDk6IlByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQiLDUwOiJObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSIsNTE6IkxldmVsIDIgaGFsdGVkIiw1MjoiSW52YWxpZCBleGNoYW5nZSIsNTM6IkludmFsaWQgcmVxdWVzdCBkZXNjcmlwdG9yIiw1NDoiRXhjaGFuZ2UgZnVsbCIsNTU6Ik5vIGFub2RlIiw1NjoiSW52YWxpZCByZXF1ZXN0IGNvZGUiLDU3OiJJbnZhbGlkIHNsb3QiLDU5OiJCYWQgZm9udCBmaWxlIGZtdCIsNjA6IkRldmljZSBub3QgYSBzdHJlYW0iLDYxOiJObyBkYXRhIChmb3Igbm8gZGVsYXkgaW8pIiw2MjoiVGltZXIgZXhwaXJlZCIsNjM6Ik91dCBvZiBzdHJlYW1zIHJlc291cmNlcyIsNjQ6Ik1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIiw2NToiUGFja2FnZSBub3QgaW5zdGFsbGVkIiw2NjoiVGhlIG9iamVjdCBpcyByZW1vdGUiLDY3OiJUaGUgbGluayBoYXMgYmVlbiBzZXZlcmVkIiw2ODoiQWR2ZXJ0aXNlIGVycm9yIiw2OToiU3Jtb3VudCBlcnJvciIsNzA6IkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIsNzE6IlByb3RvY29sIGVycm9yIiw3MjoiTXVsdGlob3AgYXR0ZW1wdGVkIiw3MzoiQ3Jvc3MgbW91bnQgcG9pbnQgKG5vdCByZWFsbHkgZXJyb3IpIiw3NDoiVHJ5aW5nIHRvIHJlYWQgdW5yZWFkYWJsZSBtZXNzYWdlIiw3NToiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIsNzY6IkdpdmVuIGxvZy4gbmFtZSBub3QgdW5pcXVlIiw3NzoiZi5kLiBpbnZhbGlkIGZvciB0aGlzIG9wZXJhdGlvbiIsNzg6IlJlbW90ZSBhZGRyZXNzIGNoYW5nZWQiLDc5OiJDYW4gICBhY2Nlc3MgYSBuZWVkZWQgc2hhcmVkIGxpYiIsODA6IkFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGliIiw4MToiLmxpYiBzZWN0aW9uIGluIGEub3V0IGNvcnJ1cHRlZCIsODI6IkF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBsaWJzIiw4MzoiQXR0ZW1wdGluZyB0byBleGVjIGEgc2hhcmVkIGxpYnJhcnkiLDg0OiJJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UiLDg2OiJTdHJlYW1zIHBpcGUgZXJyb3IiLDg3OiJUb28gbWFueSB1c2VycyIsODg6IlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIsODk6IkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiLDkwOiJNZXNzYWdlIHRvbyBsb25nIiw5MToiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Iiw5MjoiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIsOTM6IlVua25vd24gcHJvdG9jb2wiLDk0OiJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIiw5NToiTm90IHN1cHBvcnRlZCIsOTY6IlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIiw5NzoiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCBmYW1pbHkiLDk4OiJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIiw5OToiQWRkcmVzcyBub3QgYXZhaWxhYmxlIiwxMDA6Ik5ldHdvcmsgaW50ZXJmYWNlIGlzIG5vdCBjb25maWd1cmVkIiwxMDE6Ik5ldHdvcmsgaXMgdW5yZWFjaGFibGUiLDEwMjoiQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrIiwxMDM6IkNvbm5lY3Rpb24gYWJvcnRlZCIsMTA0OiJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiLDEwNToiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIsMTA2OiJTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiLDEwNzoiU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiLDEwODoiQ2FuJ3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24iLDEwOToiVG9vIG1hbnkgcmVmZXJlbmNlcyIsMTEwOiJDb25uZWN0aW9uIHRpbWVkIG91dCIsMTExOiJDb25uZWN0aW9uIHJlZnVzZWQiLDExMjoiSG9zdCBpcyBkb3duIiwxMTM6Ikhvc3QgaXMgdW5yZWFjaGFibGUiLDExNDoiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIiwxMTU6IkNvbm5lY3Rpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIsMTE2OiJTdGFsZSBmaWxlIGhhbmRsZSIsMTIyOiJRdW90YSBleGNlZWRlZCIsMTIzOiJObyBtZWRpdW0gKGluIHRhcGUgZHJpdmUpIiwxMjU6Ik9wZXJhdGlvbiBjYW5jZWxlZCIsMTMwOiJQcmV2aW91cyBvd25lciBkaWVkIiwxMzE6IlN0YXRlIG5vdCByZWNvdmVyYWJsZSJ9O3ZhciBfX19lcnJub19zdGF0ZT0wO2Z1bmN0aW9uIF9fX3NldEVyck5vKHZhbHVlKXtIRUFQMzJbX19fZXJybm9fc3RhdGU+PjJdPXZhbHVlO3JldHVybiB2YWx1ZX12YXIgUEFUSD17c3BsaXRQYXRoOihmdW5jdGlvbihmaWxlbmFtZSl7dmFyIHNwbGl0UGF0aFJlPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSl9KSxub3JtYWxpemVBcnJheTooZnVuY3Rpb24ocGFydHMsYWxsb3dBYm92ZVJvb3Qpe3ZhciB1cD0wO2Zvcih2YXIgaT1wYXJ0cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGxhc3Q9cGFydHNbaV07aWYobGFzdD09PSIuIil7cGFydHMuc3BsaWNlKGksMSl9ZWxzZSBpZihsYXN0PT09Ii4uIil7cGFydHMuc3BsaWNlKGksMSk7dXArK31lbHNlIGlmKHVwKXtwYXJ0cy5zcGxpY2UoaSwxKTt1cC0tfX1pZihhbGxvd0Fib3ZlUm9vdCl7Zm9yKDt1cC0tO3VwKXtwYXJ0cy51bnNoaWZ0KCIuLiIpfX1yZXR1cm4gcGFydHN9KSxub3JtYWxpemU6KGZ1bmN0aW9uKHBhdGgpe3ZhciBpc0Fic29sdXRlPXBhdGguY2hhckF0KDApPT09Ii8iLHRyYWlsaW5nU2xhc2g9cGF0aC5zdWJzdHIoLTEpPT09Ii8iO3BhdGg9UEFUSC5ub3JtYWxpemVBcnJheShwYXRoLnNwbGl0KCIvIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIWlzQWJzb2x1dGUpLmpvaW4oIi8iKTtpZighcGF0aCYmIWlzQWJzb2x1dGUpe3BhdGg9Ii4ifWlmKHBhdGgmJnRyYWlsaW5nU2xhc2gpe3BhdGgrPSIvIn1yZXR1cm4oaXNBYnNvbHV0ZT8iLyI6IiIpK3BhdGh9KSxkaXJuYW1lOihmdW5jdGlvbihwYXRoKXt2YXIgcmVzdWx0PVBBVEguc3BsaXRQYXRoKHBhdGgpLHJvb3Q9cmVzdWx0WzBdLGRpcj1yZXN1bHRbMV07aWYoIXJvb3QmJiFkaXIpe3JldHVybiIuIn1pZihkaXIpe2Rpcj1kaXIuc3Vic3RyKDAsZGlyLmxlbmd0aC0xKX1yZXR1cm4gcm9vdCtkaXJ9KSxiYXNlbmFtZTooZnVuY3Rpb24ocGF0aCl7aWYocGF0aD09PSIvIilyZXR1cm4iLyI7dmFyIGxhc3RTbGFzaD1wYXRoLmxhc3RJbmRleE9mKCIvIik7aWYobGFzdFNsYXNoPT09LTEpcmV0dXJuIHBhdGg7cmV0dXJuIHBhdGguc3Vic3RyKGxhc3RTbGFzaCsxKX0pLGV4dG5hbWU6KGZ1bmN0aW9uKHBhdGgpe3JldHVybiBQQVRILnNwbGl0UGF0aChwYXRoKVszXX0pLGpvaW46KGZ1bmN0aW9uKCl7dmFyIHBhdGhzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aHMuam9pbigiLyIpKX0pLGpvaW4yOihmdW5jdGlvbihsLHIpe3JldHVybiBQQVRILm5vcm1hbGl6ZShsKyIvIityKX0pLHJlc29sdmU6KGZ1bmN0aW9uKCl7dmFyIHJlc29sdmVkUGF0aD0iIixyZXNvbHZlZEFic29sdXRlPWZhbHNlO2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLTE7aT49LTEmJiFyZXNvbHZlZEFic29sdXRlO2ktLSl7dmFyIHBhdGg9aT49MD9hcmd1bWVudHNbaV06RlMuY3dkKCk7aWYodHlwZW9mIHBhdGghPT0ic3RyaW5nIil7dGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKX1lbHNlIGlmKCFwYXRoKXtjb250aW51ZX1yZXNvbHZlZFBhdGg9cGF0aCsiLyIrcmVzb2x2ZWRQYXRoO3Jlc29sdmVkQWJzb2x1dGU9cGF0aC5jaGFyQXQoMCk9PT0iLyJ9cmVzb2x2ZWRQYXRoPVBBVEgubm9ybWFsaXplQXJyYXkocmVzb2x2ZWRQYXRoLnNwbGl0KCIvIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oIi8iKTtyZXR1cm4ocmVzb2x2ZWRBYnNvbHV0ZT8iLyI6IiIpK3Jlc29sdmVkUGF0aHx8Ii4ifSkscmVsYXRpdmU6KGZ1bmN0aW9uKGZyb20sdG8pe2Zyb209UEFUSC5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTt0bz1QQVRILnJlc29sdmUodG8pLnN1YnN0cigxKTtmdW5jdGlvbiB0cmltKGFycil7dmFyIHN0YXJ0PTA7Zm9yKDtzdGFydDxhcnIubGVuZ3RoO3N0YXJ0Kyspe2lmKGFycltzdGFydF0hPT0iIilicmVha312YXIgZW5kPWFyci5sZW5ndGgtMTtmb3IoO2VuZD49MDtlbmQtLSl7aWYoYXJyW2VuZF0hPT0iIilicmVha31pZihzdGFydD5lbmQpcmV0dXJuW107cmV0dXJuIGFyci5zbGljZShzdGFydCxlbmQtc3RhcnQrMSl9dmFyIGZyb21QYXJ0cz10cmltKGZyb20uc3BsaXQoIi8iKSk7dmFyIHRvUGFydHM9dHJpbSh0by5zcGxpdCgiLyIpKTt2YXIgbGVuZ3RoPU1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsdG9QYXJ0cy5sZW5ndGgpO3ZhciBzYW1lUGFydHNMZW5ndGg9bGVuZ3RoO2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7aWYoZnJvbVBhcnRzW2ldIT09dG9QYXJ0c1tpXSl7c2FtZVBhcnRzTGVuZ3RoPWk7YnJlYWt9fXZhciBvdXRwdXRQYXJ0cz1bXTtmb3IodmFyIGk9c2FtZVBhcnRzTGVuZ3RoO2k8ZnJvbVBhcnRzLmxlbmd0aDtpKyspe291dHB1dFBhcnRzLnB1c2goIi4uIil9b3V0cHV0UGFydHM9b3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7cmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oIi8iKX0pfTt2YXIgVFRZPXt0dHlzOltdLGluaXQ6KGZ1bmN0aW9uKCl7fSksc2h1dGRvd246KGZ1bmN0aW9uKCl7fSkscmVnaXN0ZXI6KGZ1bmN0aW9uKGRldixvcHMpe1RUWS50dHlzW2Rldl09e2lucHV0OltdLG91dHB1dDpbXSxvcHM6b3BzfTtGUy5yZWdpc3RlckRldmljZShkZXYsVFRZLnN0cmVhbV9vcHMpfSksc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgdHR5PVRUWS50dHlzW3N0cmVhbS5ub2RlLnJkZXZdO2lmKCF0dHkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9c3RyZWFtLnR0eT10dHk7c3RyZWFtLnNlZWthYmxlPWZhbHNlfSksY2xvc2U6KGZ1bmN0aW9uKHN0cmVhbSl7aWYoc3RyZWFtLnR0eS5vdXRwdXQubGVuZ3RoKXtzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcihzdHJlYW0udHR5LDEwKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXtpZighc3RyZWFtLnR0eXx8IXN0cmVhbS50dHkub3BzLmdldF9jaGFyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTlhJTyl9dmFyIGJ5dGVzUmVhZD0wO2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dmFyIHJlc3VsdDt0cnl7cmVzdWx0PXN0cmVhbS50dHkub3BzLmdldF9jaGFyKHN0cmVhbS50dHkpfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUdBSU4pfWlmKHJlc3VsdD09PW51bGx8fHJlc3VsdD09PXVuZGVmaW5lZClicmVhaztieXRlc1JlYWQrKztidWZmZXJbb2Zmc2V0K2ldPXJlc3VsdH1pZihieXRlc1JlYWQpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBieXRlc1JlYWR9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7aWYoIXN0cmVhbS50dHl8fCFzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5YSU8pfWZvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dHJ5e3N0cmVhbS50dHkub3BzLnB1dF9jaGFyKHN0cmVhbS50dHksYnVmZmVyW29mZnNldCtpXSl9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlPKX19aWYobGVuZ3RoKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gaX0pfSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyOihmdW5jdGlvbih0dHkpe2lmKCF0dHkuaW5wdXQubGVuZ3RoKXt2YXIgcmVzdWx0PW51bGw7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7cmVzdWx0PXByb2Nlc3NbInN0ZGluIl1bInJlYWQiXSgpO2lmKCFyZXN1bHQpe2lmKHByb2Nlc3NbInN0ZGluIl1bIl9yZWFkYWJsZVN0YXRlIl0mJnByb2Nlc3NbInN0ZGluIl1bIl9yZWFkYWJsZVN0YXRlIl1bImVuZGVkIl0pe3JldHVybiBudWxsfXJldHVybiB1bmRlZmluZWR9fWVsc2UgaWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiB3aW5kb3cucHJvbXB0PT0iZnVuY3Rpb24iKXtyZXN1bHQ9d2luZG93LnByb21wdCgiSW5wdXQ6ICIpO2lmKHJlc3VsdCE9PW51bGwpe3Jlc3VsdCs9IlxuIn19ZWxzZSBpZih0eXBlb2YgcmVhZGxpbmU9PSJmdW5jdGlvbiIpe3Jlc3VsdD1yZWFkbGluZSgpO2lmKHJlc3VsdCE9PW51bGwpe3Jlc3VsdCs9IlxuIn19aWYoIXJlc3VsdCl7cmV0dXJuIG51bGx9dHR5LmlucHV0PWludEFycmF5RnJvbVN0cmluZyhyZXN1bHQsdHJ1ZSl9cmV0dXJuIHR0eS5pbnB1dC5zaGlmdCgpfSkscHV0X2NoYXI6KGZ1bmN0aW9uKHR0eSx2YWwpe2lmKHZhbD09PW51bGx8fHZhbD09PTEwKXtNb2R1bGVbInByaW50Il0odHR5Lm91dHB1dC5qb2luKCIiKSk7dHR5Lm91dHB1dD1bXX1lbHNle3R0eS5vdXRwdXQucHVzaChUVFkudXRmOC5wcm9jZXNzQ0NoYXIodmFsKSl9fSl9LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyOihmdW5jdGlvbih0dHksdmFsKXtpZih2YWw9PT1udWxsfHx2YWw9PT0xMCl7TW9kdWxlWyJwcmludEVyciJdKHR0eS5vdXRwdXQuam9pbigiIikpO3R0eS5vdXRwdXQ9W119ZWxzZXt0dHkub3V0cHV0LnB1c2goVFRZLnV0ZjgucHJvY2Vzc0NDaGFyKHZhbCkpfX0pfX07dmFyIE1FTUZTPXtvcHNfdGFibGU6bnVsbCxDT05URU5UX09XTklORzoxLENPTlRFTlRfRkxFWElCTEU6MixDT05URU5UX0ZJWEVEOjMsbW91bnQ6KGZ1bmN0aW9uKG1vdW50KXtyZXR1cm4gTUVNRlMuY3JlYXRlTm9kZShudWxsLCIvIiwxNjM4NHw1MTEsMCl9KSxjcmVhdGVOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLGRldil7aWYoRlMuaXNCbGtkZXYobW9kZSl8fEZTLmlzRklGTyhtb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKCFNRU1GUy5vcHNfdGFibGUpe01FTUZTLm9wc190YWJsZT17ZGlyOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyLGxvb2t1cDpNRU1GUy5ub2RlX29wcy5sb29rdXAsbWtub2Q6TUVNRlMubm9kZV9vcHMubWtub2QscmVuYW1lOk1FTUZTLm5vZGVfb3BzLnJlbmFtZSx1bmxpbms6TUVNRlMubm9kZV9vcHMudW5saW5rLHJtZGlyOk1FTUZTLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6TUVNRlMubm9kZV9vcHMucmVhZGRpcixzeW1saW5rOk1FTUZTLm5vZGVfb3BzLnN5bWxpbmt9LHN0cmVhbTp7bGxzZWVrOk1FTUZTLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cn0sc3RyZWFtOntsbHNlZWs6TUVNRlMuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpNRU1GUy5zdHJlYW1fb3BzLnJlYWQsd3JpdGU6TUVNRlMuc3RyZWFtX29wcy53cml0ZSxhbGxvY2F0ZTpNRU1GUy5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6TUVNRlMuc3RyZWFtX29wcy5tbWFwfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cixyZWFkbGluazpNRU1GUy5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6TUVNRlMubm9kZV9vcHMuZ2V0YXR0cixzZXRhdHRyOk1FTUZTLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTpGUy5jaHJkZXZfc3RyZWFtX29wc319fXZhciBub2RlPUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSxkZXYpO2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmRpci5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUuZGlyLnN0cmVhbTtub2RlLmNvbnRlbnRzPXt9fWVsc2UgaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmZpbGUubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmZpbGUuc3RyZWFtO25vZGUuY29udGVudHM9W107bm9kZS5jb250ZW50TW9kZT1NRU1GUy5DT05URU5UX0ZMRVhJQkxFfWVsc2UgaWYoRlMuaXNMaW5rKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmxpbmsubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmxpbmsuc3RyZWFtfWVsc2UgaWYoRlMuaXNDaHJkZXYobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuY2hyZGV2Lm5vZGU7bm9kZS5zdHJlYW1fb3BzPU1FTUZTLm9wc190YWJsZS5jaHJkZXYuc3RyZWFtfW5vZGUudGltZXN0YW1wPURhdGUubm93KCk7aWYocGFyZW50KXtwYXJlbnQuY29udGVudHNbbmFtZV09bm9kZX1yZXR1cm4gbm9kZX0pLGVuc3VyZUZsZXhpYmxlOihmdW5jdGlvbihub2RlKXtpZihub2RlLmNvbnRlbnRNb2RlIT09TUVNRlMuQ09OVEVOVF9GTEVYSUJMRSl7dmFyIGNvbnRlbnRzPW5vZGUuY29udGVudHM7bm9kZS5jb250ZW50cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb250ZW50cyk7bm9kZS5jb250ZW50TW9kZT1NRU1GUy5DT05URU5UX0ZMRVhJQkxFfX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXt2YXIgYXR0cj17fTthdHRyLmRldj1GUy5pc0NocmRldihub2RlLm1vZGUpP25vZGUuaWQ6MTthdHRyLmlubz1ub2RlLmlkO2F0dHIubW9kZT1ub2RlLm1vZGU7YXR0ci5ubGluaz0xO2F0dHIudWlkPTA7YXR0ci5naWQ9MDthdHRyLnJkZXY9bm9kZS5yZGV2O2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT00MDk2fWVsc2UgaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT1ub2RlLmNvbnRlbnRzLmxlbmd0aH1lbHNlIGlmKEZTLmlzTGluayhub2RlLm1vZGUpKXthdHRyLnNpemU9bm9kZS5saW5rLmxlbmd0aH1lbHNle2F0dHIuc2l6ZT0wfWF0dHIuYXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIubXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuY3RpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuYmxrc2l6ZT00MDk2O2F0dHIuYmxvY2tzPU1hdGguY2VpbChhdHRyLnNpemUvYXR0ci5ibGtzaXplKTtyZXR1cm4gYXR0cn0pLHNldGF0dHI6KGZ1bmN0aW9uKG5vZGUsYXR0cil7aWYoYXR0ci5tb2RlIT09dW5kZWZpbmVkKXtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXtub2RlLnRpbWVzdGFtcD1hdHRyLnRpbWVzdGFtcH1pZihhdHRyLnNpemUhPT11bmRlZmluZWQpe01FTUZTLmVuc3VyZUZsZXhpYmxlKG5vZGUpO3ZhciBjb250ZW50cz1ub2RlLmNvbnRlbnRzO2lmKGF0dHIuc2l6ZTxjb250ZW50cy5sZW5ndGgpY29udGVudHMubGVuZ3RoPWF0dHIuc2l6ZTtlbHNlIHdoaWxlKGF0dHIuc2l6ZT5jb250ZW50cy5sZW5ndGgpY29udGVudHMucHVzaCgwKX19KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt0aHJvdyBGUy5nZW5lcmljRXJyb3JzW0VSUk5PX0NPREVTLkVOT0VOVF19KSxta25vZDooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe3JldHVybiBNRU1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkX25vZGUsbmV3X2RpcixuZXdfbmFtZSl7aWYoRlMuaXNEaXIob2xkX25vZGUubW9kZSkpe3ZhciBuZXdfbm9kZTt0cnl7bmV3X25vZGU9RlMubG9va3VwTm9kZShuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt9aWYobmV3X25vZGUpe2Zvcih2YXIgaSBpbiBuZXdfbm9kZS5jb250ZW50cyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKX19fWRlbGV0ZSBvbGRfbm9kZS5wYXJlbnQuY29udGVudHNbb2xkX25vZGUubmFtZV07b2xkX25vZGUubmFtZT1uZXdfbmFtZTtuZXdfZGlyLmNvbnRlbnRzW25ld19uYW1lXT1vbGRfbm9kZTtvbGRfbm9kZS5wYXJlbnQ9bmV3X2Rpcn0pLHVubGluazooZnVuY3Rpb24ocGFyZW50LG5hbWUpe2RlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxybWRpcjooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO2Zvcih2YXIgaSBpbiBub2RlLmNvbnRlbnRzKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URU1QVFkpfWRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxyZWFkZGlyOihmdW5jdGlvbihub2RlKXt2YXIgZW50cmllcz1bIi4iLCIuLiJdO2Zvcih2YXIga2V5IGluIG5vZGUuY29udGVudHMpe2lmKCFub2RlLmNvbnRlbnRzLmhhc093blByb3BlcnR5KGtleSkpe2NvbnRpbnVlfWVudHJpZXMucHVzaChrZXkpfXJldHVybiBlbnRyaWVzfSksc3ltbGluazooZnVuY3Rpb24ocGFyZW50LG5ld25hbWUsb2xkcGF0aCl7dmFyIG5vZGU9TUVNRlMuY3JlYXRlTm9kZShwYXJlbnQsbmV3bmFtZSw1MTF8NDA5NjAsMCk7bm9kZS5saW5rPW9sZHBhdGg7cmV0dXJuIG5vZGV9KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7aWYoIUZTLmlzTGluayhub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXJldHVybiBub2RlLmxpbmt9KX0sc3RyZWFtX29wczp7cmVhZDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXt2YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYocG9zaXRpb24+PWNvbnRlbnRzLmxlbmd0aClyZXR1cm4gMDt2YXIgc2l6ZT1NYXRoLm1pbihjb250ZW50cy5sZW5ndGgtcG9zaXRpb24sbGVuZ3RoKTthc3NlcnQoc2l6ZT49MCk7aWYoc2l6ZT44JiZjb250ZW50cy5zdWJhcnJheSl7YnVmZmVyLnNldChjb250ZW50cy5zdWJhcnJheShwb3NpdGlvbixwb3NpdGlvbitzaXplKSxvZmZzZXQpfWVsc2V7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX19cmV0dXJuIHNpemV9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLGNhbk93bil7dmFyIG5vZGU9c3RyZWFtLm5vZGU7bm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKTt2YXIgY29udGVudHM9bm9kZS5jb250ZW50cztpZihsZW5ndGgmJmNvbnRlbnRzLmxlbmd0aD09PTAmJnBvc2l0aW9uPT09MCYmYnVmZmVyLnN1YmFycmF5KXtpZihjYW5Pd24mJm9mZnNldD09PTApe25vZGUuY29udGVudHM9YnVmZmVyO25vZGUuY29udGVudE1vZGU9YnVmZmVyLmJ1ZmZlcj09PUhFQVA4LmJ1ZmZlcj9NRU1GUy5DT05URU5UX09XTklORzpNRU1GUy5DT05URU5UX0ZJWEVEfWVsc2V7bm9kZS5jb250ZW50cz1uZXcgVWludDhBcnJheShidWZmZXIuc3ViYXJyYXkob2Zmc2V0LG9mZnNldCtsZW5ndGgpKTtub2RlLmNvbnRlbnRNb2RlPU1FTUZTLkNPTlRFTlRfRklYRUR9cmV0dXJuIGxlbmd0aH1NRU1GUy5lbnN1cmVGbGV4aWJsZShub2RlKTt2YXIgY29udGVudHM9bm9kZS5jb250ZW50czt3aGlsZShjb250ZW50cy5sZW5ndGg8cG9zaXRpb24pY29udGVudHMucHVzaCgwKTtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe2NvbnRlbnRzW3Bvc2l0aW9uK2ldPWJ1ZmZlcltvZmZzZXQraV19cmV0dXJuIGxlbmd0aH0pLGxsc2VlazooZnVuY3Rpb24oc3RyZWFtLG9mZnNldCx3aGVuY2Upe3ZhciBwb3NpdGlvbj1vZmZzZXQ7aWYod2hlbmNlPT09MSl7cG9zaXRpb24rPXN0cmVhbS5wb3NpdGlvbn1lbHNlIGlmKHdoZW5jZT09PTIpe2lmKEZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSl7cG9zaXRpb24rPXN0cmVhbS5ub2RlLmNvbnRlbnRzLmxlbmd0aH19aWYocG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1zdHJlYW0udW5nb3R0ZW49W107c3RyZWFtLnBvc2l0aW9uPXBvc2l0aW9uO3JldHVybiBwb3NpdGlvbn0pLGFsbG9jYXRlOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LGxlbmd0aCl7TUVNRlMuZW5zdXJlRmxleGlibGUoc3RyZWFtLm5vZGUpO3ZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50czt2YXIgbGltaXQ9b2Zmc2V0K2xlbmd0aDt3aGlsZShsaW1pdD5jb250ZW50cy5sZW5ndGgpY29udGVudHMucHVzaCgwKX0pLG1tYXA6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixwcm90LGZsYWdzKXtpZighRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9ERVYpfXZhciBwdHI7dmFyIGFsbG9jYXRlZDt2YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYoIShmbGFncyYyKSYmKGNvbnRlbnRzLmJ1ZmZlcj09PWJ1ZmZlcnx8Y29udGVudHMuYnVmZmVyPT09YnVmZmVyLmJ1ZmZlcikpe2FsbG9jYXRlZD1mYWxzZTtwdHI9Y29udGVudHMuYnl0ZU9mZnNldH1lbHNle2lmKHBvc2l0aW9uPjB8fHBvc2l0aW9uK2xlbmd0aDxjb250ZW50cy5sZW5ndGgpe2lmKGNvbnRlbnRzLnN1YmFycmF5KXtjb250ZW50cz1jb250ZW50cy5zdWJhcnJheShwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpfWVsc2V7Y29udGVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY29udGVudHMscG9zaXRpb24scG9zaXRpb24rbGVuZ3RoKX19YWxsb2NhdGVkPXRydWU7cHRyPV9tYWxsb2MobGVuZ3RoKTtpZighcHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9NRU0pfWJ1ZmZlci5zZXQoY29udGVudHMscHRyKX1yZXR1cm57cHRyOnB0cixhbGxvY2F0ZWQ6YWxsb2NhdGVkfX0pfX07dmFyIElEQkZTPXtkYnM6e30saW5kZXhlZERCOihmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW5kZXhlZERCfHx3aW5kb3cubW96SW5kZXhlZERCfHx3aW5kb3cud2Via2l0SW5kZXhlZERCfHx3aW5kb3cubXNJbmRleGVkREJ9KSxEQl9WRVJTSU9OOjIxLERCX1NUT1JFX05BTUU6IkZJTEVfREFUQSIsbW91bnQ6KGZ1bmN0aW9uKG1vdW50KXtyZXR1cm4gTUVNRlMubW91bnQuYXBwbHkobnVsbCxhcmd1bWVudHMpfSksc3luY2ZzOihmdW5jdGlvbihtb3VudCxwb3B1bGF0ZSxjYWxsYmFjayl7SURCRlMuZ2V0TG9jYWxTZXQobW91bnQsKGZ1bmN0aW9uKGVycixsb2NhbCl7aWYoZXJyKXJldHVybiBjYWxsYmFjayhlcnIpO0lEQkZTLmdldFJlbW90ZVNldChtb3VudCwoZnVuY3Rpb24oZXJyLHJlbW90ZSl7aWYoZXJyKXJldHVybiBjYWxsYmFjayhlcnIpO3ZhciBzcmM9cG9wdWxhdGU/cmVtb3RlOmxvY2FsO3ZhciBkc3Q9cG9wdWxhdGU/bG9jYWw6cmVtb3RlO0lEQkZTLnJlY29uY2lsZShzcmMsZHN0LGNhbGxiYWNrKX0pKX0pKX0pLGdldERCOihmdW5jdGlvbihuYW1lLGNhbGxiYWNrKXt2YXIgZGI9SURCRlMuZGJzW25hbWVdO2lmKGRiKXtyZXR1cm4gY2FsbGJhY2sobnVsbCxkYil9dmFyIHJlcTt0cnl7cmVxPUlEQkZTLmluZGV4ZWREQigpLm9wZW4obmFtZSxJREJGUy5EQl9WRVJTSU9OKX1jYXRjaChlKXtyZXR1cm4gY2FsbGJhY2soZSl9cmVxLm9udXBncmFkZW5lZWRlZD0oZnVuY3Rpb24oZSl7dmFyIGRiPWUudGFyZ2V0LnJlc3VsdDt2YXIgdHJhbnNhY3Rpb249ZS50YXJnZXQudHJhbnNhY3Rpb247dmFyIGZpbGVTdG9yZTtpZihkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKElEQkZTLkRCX1NUT1JFX05BTUUpKXtmaWxlU3RvcmU9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSl9ZWxzZXtmaWxlU3RvcmU9ZGIuY3JlYXRlT2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSl9ZmlsZVN0b3JlLmNyZWF0ZUluZGV4KCJ0aW1lc3RhbXAiLCJ0aW1lc3RhbXAiLHt1bmlxdWU6ZmFsc2V9KX0pO3JlcS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKCl7ZGI9cmVxLnJlc3VsdDtJREJGUy5kYnNbbmFtZV09ZGI7Y2FsbGJhY2sobnVsbCxkYil9KTtyZXEub25lcnJvcj0oZnVuY3Rpb24oKXtjYWxsYmFjayh0aGlzLmVycm9yKX0pfSksZ2V0TG9jYWxTZXQ6KGZ1bmN0aW9uKG1vdW50LGNhbGxiYWNrKXt2YXIgZW50cmllcz17fTtmdW5jdGlvbiBpc1JlYWxEaXIocCl7cmV0dXJuIHAhPT0iLiImJnAhPT0iLi4ifWZ1bmN0aW9uIHRvQWJzb2x1dGUocm9vdCl7cmV0dXJuKGZ1bmN0aW9uKHApe3JldHVybiBQQVRILmpvaW4yKHJvb3QscCl9KX12YXIgY2hlY2s9RlMucmVhZGRpcihtb3VudC5tb3VudHBvaW50KS5maWx0ZXIoaXNSZWFsRGlyKS5tYXAodG9BYnNvbHV0ZShtb3VudC5tb3VudHBvaW50KSk7d2hpbGUoY2hlY2subGVuZ3RoKXt2YXIgcGF0aD1jaGVjay5wb3AoKTt2YXIgc3RhdDt0cnl7c3RhdD1GUy5zdGF0KHBhdGgpfWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1pZihGUy5pc0RpcihzdGF0Lm1vZGUpKXtjaGVjay5wdXNoLmFwcGx5KGNoZWNrLEZTLnJlYWRkaXIocGF0aCkuZmlsdGVyKGlzUmVhbERpcikubWFwKHRvQWJzb2x1dGUocGF0aCkpKX1lbnRyaWVzW3BhdGhdPXt0aW1lc3RhbXA6c3RhdC5tdGltZX19cmV0dXJuIGNhbGxiYWNrKG51bGwse3R5cGU6ImxvY2FsIixlbnRyaWVzOmVudHJpZXN9KX0pLGdldFJlbW90ZVNldDooZnVuY3Rpb24obW91bnQsY2FsbGJhY2spe3ZhciBlbnRyaWVzPXt9O0lEQkZTLmdldERCKG1vdW50Lm1vdW50cG9pbnQsKGZ1bmN0aW9uKGVycixkYil7aWYoZXJyKXJldHVybiBjYWxsYmFjayhlcnIpO3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbSURCRlMuREJfU1RPUkVfTkFNRV0sInJlYWRvbmx5Iik7dHJhbnNhY3Rpb24ub25lcnJvcj0oZnVuY3Rpb24oKXtjYWxsYmFjayh0aGlzLmVycm9yKX0pO3ZhciBzdG9yZT10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShJREJGUy5EQl9TVE9SRV9OQU1FKTt2YXIgaW5kZXg9c3RvcmUuaW5kZXgoInRpbWVzdGFtcCIpO2luZGV4Lm9wZW5LZXlDdXJzb3IoKS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKGV2ZW50KXt2YXIgY3Vyc29yPWV2ZW50LnRhcmdldC5yZXN1bHQ7aWYoIWN1cnNvcil7cmV0dXJuIGNhbGxiYWNrKG51bGwse3R5cGU6InJlbW90ZSIsZGI6ZGIsZW50cmllczplbnRyaWVzfSl9ZW50cmllc1tjdXJzb3IucHJpbWFyeUtleV09e3RpbWVzdGFtcDpjdXJzb3Iua2V5fTtjdXJzb3IuY29udGludWUoKX0pfSkpfSksbG9hZExvY2FsRW50cnk6KGZ1bmN0aW9uKHBhdGgsY2FsbGJhY2spe3ZhciBzdGF0LG5vZGU7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTtub2RlPWxvb2t1cC5ub2RlO3N0YXQ9RlMuc3RhdChwYXRoKX1jYXRjaChlKXtyZXR1cm4gY2FsbGJhY2soZSl9aWYoRlMuaXNEaXIoc3RhdC5tb2RlKSl7cmV0dXJuIGNhbGxiYWNrKG51bGwse3RpbWVzdGFtcDpzdGF0Lm10aW1lLG1vZGU6c3RhdC5tb2RlfSl9ZWxzZSBpZihGUy5pc0ZpbGUoc3RhdC5tb2RlKSl7cmV0dXJuIGNhbGxiYWNrKG51bGwse3RpbWVzdGFtcDpzdGF0Lm10aW1lLG1vZGU6c3RhdC5tb2RlLGNvbnRlbnRzOm5vZGUuY29udGVudHN9KX1lbHNle3JldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIikpfX0pLHN0b3JlTG9jYWxFbnRyeTooZnVuY3Rpb24ocGF0aCxlbnRyeSxjYWxsYmFjayl7dHJ5e2lmKEZTLmlzRGlyKGVudHJ5Lm1vZGUpKXtGUy5ta2RpcihwYXRoLGVudHJ5Lm1vZGUpfWVsc2UgaWYoRlMuaXNGaWxlKGVudHJ5Lm1vZGUpKXtGUy53cml0ZUZpbGUocGF0aCxlbnRyeS5jb250ZW50cyx7ZW5jb2Rpbmc6ImJpbmFyeSIsY2FuT3duOnRydWV9KX1lbHNle3JldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIikpfUZTLnV0aW1lKHBhdGgsZW50cnkudGltZXN0YW1wLGVudHJ5LnRpbWVzdGFtcCl9Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfWNhbGxiYWNrKG51bGwpfSkscmVtb3ZlTG9jYWxFbnRyeTooZnVuY3Rpb24ocGF0aCxjYWxsYmFjayl7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTt2YXIgc3RhdD1GUy5zdGF0KHBhdGgpO2lmKEZTLmlzRGlyKHN0YXQubW9kZSkpe0ZTLnJtZGlyKHBhdGgpfWVsc2UgaWYoRlMuaXNGaWxlKHN0YXQubW9kZSkpe0ZTLnVubGluayhwYXRoKX19Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfWNhbGxiYWNrKG51bGwpfSksbG9hZFJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLmdldChwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbihldmVudCl7Y2FsbGJhY2sobnVsbCxldmVudC50YXJnZXQucmVzdWx0KX0pO3JlcS5vbmVycm9yPShmdW5jdGlvbigpe2NhbGxiYWNrKHRoaXMuZXJyb3IpfSl9KSxzdG9yZVJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGVudHJ5LGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLnB1dChlbnRyeSxwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKCl7Y2FsbGJhY2sodGhpcy5lcnJvcil9KX0pLHJlbW92ZVJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLmRlbGV0ZShwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKCl7Y2FsbGJhY2sodGhpcy5lcnJvcil9KX0pLHJlY29uY2lsZTooZnVuY3Rpb24oc3JjLGRzdCxjYWxsYmFjayl7dmFyIHRvdGFsPTA7dmFyIGNyZWF0ZT1bXTtPYmplY3Qua2V5cyhzcmMuZW50cmllcykuZm9yRWFjaCgoZnVuY3Rpb24oa2V5KXt2YXIgZT1zcmMuZW50cmllc1trZXldO3ZhciBlMj1kc3QuZW50cmllc1trZXldO2lmKCFlMnx8ZS50aW1lc3RhbXA+ZTIudGltZXN0YW1wKXtjcmVhdGUucHVzaChrZXkpO3RvdGFsKyt9fSkpO3ZhciByZW1vdmU9W107T2JqZWN0LmtleXMoZHN0LmVudHJpZXMpLmZvckVhY2goKGZ1bmN0aW9uKGtleSl7dmFyIGU9ZHN0LmVudHJpZXNba2V5XTt2YXIgZTI9c3JjLmVudHJpZXNba2V5XTtpZighZTIpe3JlbW92ZS5wdXNoKGtleSk7dG90YWwrK319KSk7aWYoIXRvdGFsKXtyZXR1cm4gY2FsbGJhY2sobnVsbCl9dmFyIGVycm9yZWQ9ZmFsc2U7dmFyIGNvbXBsZXRlZD0wO3ZhciBkYj1zcmMudHlwZT09PSJyZW1vdGUiP3NyYy5kYjpkc3QuZGI7dmFyIHRyYW5zYWN0aW9uPWRiLnRyYW5zYWN0aW9uKFtJREJGUy5EQl9TVE9SRV9OQU1FXSwicmVhZHdyaXRlIik7dmFyIHN0b3JlPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpO2Z1bmN0aW9uIGRvbmUoZXJyKXtpZihlcnIpe2lmKCFkb25lLmVycm9yZWQpe2RvbmUuZXJyb3JlZD10cnVlO3JldHVybiBjYWxsYmFjayhlcnIpfXJldHVybn1pZigrK2NvbXBsZXRlZD49dG90YWwpe3JldHVybiBjYWxsYmFjayhudWxsKX19dHJhbnNhY3Rpb24ub25lcnJvcj0oZnVuY3Rpb24oKXtkb25lKHRoaXMuZXJyb3IpfSk7Y3JlYXRlLnNvcnQoKS5mb3JFYWNoKChmdW5jdGlvbihwYXRoKXtpZihkc3QudHlwZT09PSJsb2NhbCIpe0lEQkZTLmxvYWRSZW1vdGVFbnRyeShzdG9yZSxwYXRoLChmdW5jdGlvbihlcnIsZW50cnkpe2lmKGVycilyZXR1cm4gZG9uZShlcnIpO0lEQkZTLnN0b3JlTG9jYWxFbnRyeShwYXRoLGVudHJ5LGRvbmUpfSkpfWVsc2V7SURCRlMubG9hZExvY2FsRW50cnkocGF0aCwoZnVuY3Rpb24oZXJyLGVudHJ5KXtpZihlcnIpcmV0dXJuIGRvbmUoZXJyKTtJREJGUy5zdG9yZVJlbW90ZUVudHJ5KHN0b3JlLHBhdGgsZW50cnksZG9uZSl9KSl9fSkpO3JlbW92ZS5zb3J0KCkucmV2ZXJzZSgpLmZvckVhY2goKGZ1bmN0aW9uKHBhdGgpe2lmKGRzdC50eXBlPT09ImxvY2FsIil7SURCRlMucmVtb3ZlTG9jYWxFbnRyeShwYXRoLGRvbmUpfWVsc2V7SURCRlMucmVtb3ZlUmVtb3RlRW50cnkoc3RvcmUscGF0aCxkb25lKX19KSl9KX07dmFyIE5PREVGUz17aXNXaW5kb3dzOmZhbHNlLHN0YXRpY0luaXQ6KGZ1bmN0aW9uKCl7Tk9ERUZTLmlzV2luZG93cz0hIXByb2Nlc3MucGxhdGZvcm0ubWF0Y2goL153aW4vKX0pLG1vdW50OihmdW5jdGlvbihtb3VudCl7YXNzZXJ0KEVOVklST05NRU5UX0lTX05PREUpO3JldHVybiBOT0RFRlMuY3JlYXRlTm9kZShudWxsLCIvIixOT0RFRlMuZ2V0TW9kZShtb3VudC5vcHRzLnJvb3QpLDApfSksY3JlYXRlTm9kZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe2lmKCFGUy5pc0Rpcihtb2RlKSYmIUZTLmlzRmlsZShtb2RlKSYmIUZTLmlzTGluayhtb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbm9kZT1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUpO25vZGUubm9kZV9vcHM9Tk9ERUZTLm5vZGVfb3BzO25vZGUuc3RyZWFtX29wcz1OT0RFRlMuc3RyZWFtX29wcztyZXR1cm4gbm9kZX0pLGdldE1vZGU6KGZ1bmN0aW9uKHBhdGgpe3ZhciBzdGF0O3RyeXtzdGF0PWZzLmxzdGF0U3luYyhwYXRoKTtpZihOT0RFRlMuaXNXaW5kb3dzKXtzdGF0Lm1vZGU9c3RhdC5tb2RlfChzdGF0Lm1vZGUmMTQ2KT4+MX19Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfXJldHVybiBzdGF0Lm1vZGV9KSxyZWFsUGF0aDooZnVuY3Rpb24obm9kZSl7dmFyIHBhcnRzPVtdO3doaWxlKG5vZGUucGFyZW50IT09bm9kZSl7cGFydHMucHVzaChub2RlLm5hbWUpO25vZGU9bm9kZS5wYXJlbnR9cGFydHMucHVzaChub2RlLm1vdW50Lm9wdHMucm9vdCk7cGFydHMucmV2ZXJzZSgpO3JldHVybiBQQVRILmpvaW4uYXBwbHkobnVsbCxwYXJ0cyl9KSxmbGFnc1RvUGVybWlzc2lvblN0cmluZ01hcDp7MDoiciIsMToicisiLDI6InIrIiw2NDoiciIsNjU6InIrIiw2NjoicisiLDEyOToicngrIiwxOTM6InJ4KyIsNTE0OiJ3KyIsNTc3OiJ3Iiw1Nzg6IncrIiw3MDU6Ind4Iiw3MDY6Ind4KyIsMTAyNDoiYSIsMTAyNToiYSIsMTAyNjoiYSsiLDEwODk6ImEiLDEwOTA6ImErIiwxMTUzOiJheCIsMTE1NDoiYXgrIiwxMjE3OiJheCIsMTIxODoiYXgrIiw0MDk2OiJycyIsNDA5ODoicnMrIn0sZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmc6KGZ1bmN0aW9uKGZsYWdzKXtpZihmbGFncyBpbiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXApe3JldHVybiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXBbZmxhZ3NdfWVsc2V7cmV0dXJuIGZsYWdzfX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dmFyIHN0YXQ7dHJ5e3N0YXQ9ZnMubHN0YXRTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1pZihOT0RFRlMuaXNXaW5kb3dzJiYhc3RhdC5ibGtzaXplKXtzdGF0LmJsa3NpemU9NDA5Nn1pZihOT0RFRlMuaXNXaW5kb3dzJiYhc3RhdC5ibG9ja3Mpe3N0YXQuYmxvY2tzPShzdGF0LnNpemUrc3RhdC5ibGtzaXplLTEpL3N0YXQuYmxrc2l6ZXwwfXJldHVybntkZXY6c3RhdC5kZXYsaW5vOnN0YXQuaW5vLG1vZGU6c3RhdC5tb2RlLG5saW5rOnN0YXQubmxpbmssdWlkOnN0YXQudWlkLGdpZDpzdGF0LmdpZCxyZGV2OnN0YXQucmRldixzaXplOnN0YXQuc2l6ZSxhdGltZTpzdGF0LmF0aW1lLG10aW1lOnN0YXQubXRpbWUsY3RpbWU6c3RhdC5jdGltZSxibGtzaXplOnN0YXQuYmxrc2l6ZSxibG9ja3M6c3RhdC5ibG9ja3N9fSksc2V0YXR0cjooZnVuY3Rpb24obm9kZSxhdHRyKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dHJ5e2lmKGF0dHIubW9kZSE9PXVuZGVmaW5lZCl7ZnMuY2htb2RTeW5jKHBhdGgsYXR0ci5tb2RlKTtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXt2YXIgZGF0ZT1uZXcgRGF0ZShhdHRyLnRpbWVzdGFtcCk7ZnMudXRpbWVzU3luYyhwYXRoLGRhdGUsZGF0ZSl9aWYoYXR0ci5zaXplIT09dW5kZWZpbmVkKXtmcy50cnVuY2F0ZVN5bmMocGF0aCxhdHRyLnNpemUpfX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksbG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt2YXIgbW9kZT1OT0RFRlMuZ2V0TW9kZShwYXRoKTtyZXR1cm4gTk9ERUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSl9KSxta25vZDooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe3ZhciBub2RlPU5PREVGUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KTt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dHJ5e2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2ZzLm1rZGlyU3luYyhwYXRoLG5vZGUubW9kZSl9ZWxzZXtmcy53cml0ZUZpbGVTeW5jKHBhdGgsIiIse21vZGU6bm9kZS5tb2RlfSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gbm9kZX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkTm9kZSxuZXdEaXIsbmV3TmFtZSl7dmFyIG9sZFBhdGg9Tk9ERUZTLnJlYWxQYXRoKG9sZE5vZGUpO3ZhciBuZXdQYXRoPVBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKG5ld0RpciksbmV3TmFtZSk7dHJ5e2ZzLnJlbmFtZVN5bmMob2xkUGF0aCxuZXdQYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksdW5saW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt0cnl7ZnMudW5saW5rU3luYyhwYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgcGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5hbWUpO3RyeXtmcy5ybWRpclN5bmMocGF0aCl9Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfX0pLHJlYWRkaXI6KGZ1bmN0aW9uKG5vZGUpe3ZhciBwYXRoPU5PREVGUy5yZWFsUGF0aChub2RlKTt0cnl7cmV0dXJuIGZzLnJlYWRkaXJTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxzeW1saW5rOihmdW5jdGlvbihwYXJlbnQsbmV3TmFtZSxvbGRQYXRoKXt2YXIgbmV3UGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5ld05hbWUpO3RyeXtmcy5zeW1saW5rU3luYyhvbGRQYXRoLG5ld1BhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtyZXR1cm4gZnMucmVhZGxpbmtTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KX0sc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgoc3RyZWFtLm5vZGUpO3RyeXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3N0cmVhbS5uZmQ9ZnMub3BlblN5bmMocGF0aCxOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoc3RyZWFtLmZsYWdzKSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXt0cnl7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpJiZzdHJlYW0ubmZkKXtmcy5jbG9zZVN5bmMoc3RyZWFtLm5mZCl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBuYnVmZmVyPW5ldyBCdWZmZXIobGVuZ3RoKTt2YXIgcmVzO3RyeXtyZXM9ZnMucmVhZFN5bmMoc3RyZWFtLm5mZCxuYnVmZmVyLDAsbGVuZ3RoLHBvc2l0aW9uKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1pZihyZXM+MCl7Zm9yKHZhciBpPTA7aTxyZXM7aSsrKXtidWZmZXJbb2Zmc2V0K2ldPW5idWZmZXJbaV19fXJldHVybiByZXN9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXt2YXIgbmJ1ZmZlcj1uZXcgQnVmZmVyKGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsb2Zmc2V0K2xlbmd0aCkpO3ZhciByZXM7dHJ5e3Jlcz1mcy53cml0ZVN5bmMoc3RyZWFtLm5mZCxuYnVmZmVyLDAsbGVuZ3RoLHBvc2l0aW9uKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gcmVzfSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7dmFyIHBvc2l0aW9uPW9mZnNldDtpZih3aGVuY2U9PT0xKXtwb3NpdGlvbis9c3RyZWFtLnBvc2l0aW9ufWVsc2UgaWYod2hlbmNlPT09Mil7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXt0cnl7dmFyIHN0YXQ9ZnMuZnN0YXRTeW5jKHN0cmVhbS5uZmQpO3Bvc2l0aW9uKz1zdGF0LnNpemV9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fX1pZihwb3NpdGlvbjwwKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXN0cmVhbS5wb3NpdGlvbj1wb3NpdGlvbjtyZXR1cm4gcG9zaXRpb259KX19O3ZhciBfc3RkaW49YWxsb2NhdGUoMSwiaTMyKiIsQUxMT0NfU1RBVElDKTt2YXIgX3N0ZG91dD1hbGxvY2F0ZSgxLCJpMzIqIixBTExPQ19TVEFUSUMpO3ZhciBfc3RkZXJyPWFsbG9jYXRlKDEsImkzMioiLEFMTE9DX1NUQVRJQyk7dmFyIEZTPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6W251bGxdLHN0cmVhbXM6W10sbmV4dElub2RlOjEsbmFtZVRhYmxlOm51bGwsY3VycmVudFBhdGg6Ii8iLGluaXRpYWxpemVkOmZhbHNlLGlnbm9yZVBlcm1pc3Npb25zOnRydWUsdHJhY2tpbmdEZWxlZ2F0ZTp7fSx0cmFja2luZzp7b3BlbkZsYWdzOntSRUFEOjEsV1JJVEU6Mn19LEVycm5vRXJyb3I6bnVsbCxnZW5lcmljRXJyb3JzOnt9LGhhbmRsZUZTRXJyb3I6KGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKXRocm93IGUrIiA6ICIrc3RhY2tUcmFjZSgpO3JldHVybiBfX19zZXRFcnJObyhlLmVycm5vKX0pLGxvb2t1cFBhdGg6KGZ1bmN0aW9uKHBhdGgsb3B0cyl7cGF0aD1QQVRILnJlc29sdmUoRlMuY3dkKCkscGF0aCk7b3B0cz1vcHRzfHx7fTt2YXIgZGVmYXVsdHM9e2ZvbGxvd19tb3VudDp0cnVlLHJlY3Vyc2VfY291bnQ6MH07Zm9yKHZhciBrZXkgaW4gZGVmYXVsdHMpe2lmKG9wdHNba2V5XT09PXVuZGVmaW5lZCl7b3B0c1trZXldPWRlZmF1bHRzW2tleV19fWlmKG9wdHMucmVjdXJzZV9jb3VudD44KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTE9PUCl9dmFyIHBhcnRzPVBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdCgiLyIpLmZpbHRlcigoZnVuY3Rpb24ocCl7cmV0dXJuISFwfSkpLGZhbHNlKTt2YXIgY3VycmVudD1GUy5yb290O3ZhciBjdXJyZW50X3BhdGg9Ii8iO2Zvcih2YXIgaT0wO2k8cGFydHMubGVuZ3RoO2krKyl7dmFyIGlzbGFzdD1pPT09cGFydHMubGVuZ3RoLTE7aWYoaXNsYXN0JiZvcHRzLnBhcmVudCl7YnJlYWt9Y3VycmVudD1GUy5sb29rdXBOb2RlKGN1cnJlbnQscGFydHNbaV0pO2N1cnJlbnRfcGF0aD1QQVRILmpvaW4yKGN1cnJlbnRfcGF0aCxwYXJ0c1tpXSk7aWYoRlMuaXNNb3VudHBvaW50KGN1cnJlbnQpKXtpZighaXNsYXN0fHxpc2xhc3QmJm9wdHMuZm9sbG93X21vdW50KXtjdXJyZW50PWN1cnJlbnQubW91bnRlZC5yb290fX1pZighaXNsYXN0fHxvcHRzLmZvbGxvdyl7dmFyIGNvdW50PTA7d2hpbGUoRlMuaXNMaW5rKGN1cnJlbnQubW9kZSkpe3ZhciBsaW5rPUZTLnJlYWRsaW5rKGN1cnJlbnRfcGF0aCk7Y3VycmVudF9wYXRoPVBBVEgucmVzb2x2ZShQQVRILmRpcm5hbWUoY3VycmVudF9wYXRoKSxsaW5rKTt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgoY3VycmVudF9wYXRoLHtyZWN1cnNlX2NvdW50Om9wdHMucmVjdXJzZV9jb3VudH0pO2N1cnJlbnQ9bG9va3VwLm5vZGU7aWYoY291bnQrKz40MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUxPT1ApfX19fXJldHVybntwYXRoOmN1cnJlbnRfcGF0aCxub2RlOmN1cnJlbnR9fSksZ2V0UGF0aDooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg7d2hpbGUodHJ1ZSl7aWYoRlMuaXNSb290KG5vZGUpKXt2YXIgbW91bnQ9bm9kZS5tb3VudC5tb3VudHBvaW50O2lmKCFwYXRoKXJldHVybiBtb3VudDtyZXR1cm4gbW91bnRbbW91bnQubGVuZ3RoLTFdIT09Ii8iP21vdW50KyIvIitwYXRoOm1vdW50K3BhdGh9cGF0aD1wYXRoP25vZGUubmFtZSsiLyIrcGF0aDpub2RlLm5hbWU7bm9kZT1ub2RlLnBhcmVudH19KSxoYXNoTmFtZTooZnVuY3Rpb24ocGFyZW50aWQsbmFtZSl7dmFyIGhhc2g9MDtmb3IodmFyIGk9MDtpPG5hbWUubGVuZ3RoO2krKyl7aGFzaD0oaGFzaDw8NSktaGFzaCtuYW1lLmNoYXJDb2RlQXQoaSl8MH1yZXR1cm4ocGFyZW50aWQraGFzaD4+PjApJUZTLm5hbWVUYWJsZS5sZW5ndGh9KSxoYXNoQWRkTm9kZTooZnVuY3Rpb24obm9kZSl7dmFyIGhhc2g9RlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsbm9kZS5uYW1lKTtub2RlLm5hbWVfbmV4dD1GUy5uYW1lVGFibGVbaGFzaF07RlMubmFtZVRhYmxlW2hhc2hdPW5vZGV9KSxoYXNoUmVtb3ZlTm9kZTooZnVuY3Rpb24obm9kZSl7dmFyIGhhc2g9RlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsbm9kZS5uYW1lKTtpZihGUy5uYW1lVGFibGVbaGFzaF09PT1ub2RlKXtGUy5uYW1lVGFibGVbaGFzaF09bm9kZS5uYW1lX25leHR9ZWxzZXt2YXIgY3VycmVudD1GUy5uYW1lVGFibGVbaGFzaF07d2hpbGUoY3VycmVudCl7aWYoY3VycmVudC5uYW1lX25leHQ9PT1ub2RlKXtjdXJyZW50Lm5hbWVfbmV4dD1ub2RlLm5hbWVfbmV4dDticmVha31jdXJyZW50PWN1cnJlbnQubmFtZV9uZXh0fX19KSxsb29rdXBOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIGVycj1GUy5tYXlMb29rdXAocGFyZW50KTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9dmFyIGhhc2g9RlMuaGFzaE5hbWUocGFyZW50LmlkLG5hbWUpO2Zvcih2YXIgbm9kZT1GUy5uYW1lVGFibGVbaGFzaF07bm9kZTtub2RlPW5vZGUubmFtZV9uZXh0KXt2YXIgbm9kZU5hbWU9bm9kZS5uYW1lO2lmKG5vZGUucGFyZW50LmlkPT09cGFyZW50LmlkJiZub2RlTmFtZT09PW5hbWUpe3JldHVybiBub2RlfX1yZXR1cm4gRlMubG9va3VwKHBhcmVudCxuYW1lKX0pLGNyZWF0ZU5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUscmRldil7aWYoIUZTLkZTTm9kZSl7RlMuRlNOb2RlPShmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLHJkZXYpe2lmKCFwYXJlbnQpe3BhcmVudD10aGlzfXRoaXMucGFyZW50PXBhcmVudDt0aGlzLm1vdW50PXBhcmVudC5tb3VudDt0aGlzLm1vdW50ZWQ9bnVsbDt0aGlzLmlkPUZTLm5leHRJbm9kZSsrO3RoaXMubmFtZT1uYW1lO3RoaXMubW9kZT1tb2RlO3RoaXMubm9kZV9vcHM9e307dGhpcy5zdHJlYW1fb3BzPXt9O3RoaXMucmRldj1yZGV2fSk7RlMuRlNOb2RlLnByb3RvdHlwZT17fTt2YXIgcmVhZE1vZGU9MjkyfDczO3ZhciB3cml0ZU1vZGU9MTQ2O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZTLkZTTm9kZS5wcm90b3R5cGUse3JlYWQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5tb2RlJnJlYWRNb2RlKT09PXJlYWRNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXJlYWRNb2RlOnRoaXMubW9kZSY9fnJlYWRNb2RlfSl9LHdyaXRlOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZ3cml0ZU1vZGUpPT09d3JpdGVNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXdyaXRlTW9kZTp0aGlzLm1vZGUmPX53cml0ZU1vZGV9KX0saXNGb2xkZXI6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4gRlMuaXNEaXIodGhpcy5tb2RlKX0pfSxpc0RldmljZTp7Z2V0OihmdW5jdGlvbigpe3JldHVybiBGUy5pc0NocmRldih0aGlzLm1vZGUpfSl9fSl9dmFyIG5vZGU9bmV3IEZTLkZTTm9kZShwYXJlbnQsbmFtZSxtb2RlLHJkZXYpO0ZTLmhhc2hBZGROb2RlKG5vZGUpO3JldHVybiBub2RlfSksZGVzdHJveU5vZGU6KGZ1bmN0aW9uKG5vZGUpe0ZTLmhhc2hSZW1vdmVOb2RlKG5vZGUpfSksaXNSb290OihmdW5jdGlvbihub2RlKXtyZXR1cm4gbm9kZT09PW5vZGUucGFyZW50fSksaXNNb3VudHBvaW50OihmdW5jdGlvbihub2RlKXtyZXR1cm4hIW5vZGUubW91bnRlZH0pLGlzRmlsZTooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MzI3Njh9KSxpc0RpcjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MTYzODR9KSxpc0xpbms6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTYwfSksaXNDaHJkZXY6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTgxOTJ9KSxpc0Jsa2RldjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MjQ1NzZ9KSxpc0ZJRk86KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTZ9KSxpc1NvY2tldDooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNDkxNTIpPT09NDkxNTJ9KSxmbGFnTW9kZXM6eyJyIjowLCJycyI6MTA1MjY3MiwicisiOjIsInciOjU3Nywid3giOjcwNSwieHciOjcwNSwidysiOjU3OCwid3grIjo3MDYsInh3KyI6NzA2LCJhIjoxMDg5LCJheCI6MTIxNywieGEiOjEyMTcsImErIjoxMDkwLCJheCsiOjEyMTgsInhhKyI6MTIxOH0sbW9kZVN0cmluZ1RvRmxhZ3M6KGZ1bmN0aW9uKHN0cil7dmFyIGZsYWdzPUZTLmZsYWdNb2Rlc1tzdHJdO2lmKHR5cGVvZiBmbGFncz09PSJ1bmRlZmluZWQiKXt0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZmlsZSBvcGVuIG1vZGU6ICIrc3RyKX1yZXR1cm4gZmxhZ3N9KSxmbGFnc1RvUGVybWlzc2lvblN0cmluZzooZnVuY3Rpb24oZmxhZyl7dmFyIGFjY21vZGU9ZmxhZyYyMDk3MTU1O3ZhciBwZXJtcz1bInIiLCJ3IiwicnciXVthY2Ntb2RlXTtpZihmbGFnJjUxMil7cGVybXMrPSJ3In1yZXR1cm4gcGVybXN9KSxub2RlUGVybWlzc2lvbnM6KGZ1bmN0aW9uKG5vZGUscGVybXMpe2lmKEZTLmlnbm9yZVBlcm1pc3Npb25zKXtyZXR1cm4gMH1pZihwZXJtcy5pbmRleE9mKCJyIikhPT0tMSYmIShub2RlLm1vZGUmMjkyKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVBQ0NFU31lbHNlIGlmKHBlcm1zLmluZGV4T2YoInciKSE9PS0xJiYhKG5vZGUubW9kZSYxNDYpKXtyZXR1cm4gRVJSTk9fQ09ERVMuRUFDQ0VTfWVsc2UgaWYocGVybXMuaW5kZXhPZigieCIpIT09LTEmJiEobm9kZS5tb2RlJjczKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVBQ0NFU31yZXR1cm4gMH0pLG1heUxvb2t1cDooZnVuY3Rpb24oZGlyKXtyZXR1cm4gRlMubm9kZVBlcm1pc3Npb25zKGRpciwieCIpfSksbWF5Q3JlYXRlOihmdW5jdGlvbihkaXIsbmFtZSl7dHJ5e3ZhciBub2RlPUZTLmxvb2t1cE5vZGUoZGlyLG5hbWUpO3JldHVybiBFUlJOT19DT0RFUy5FRVhJU1R9Y2F0Y2goZSl7fXJldHVybiBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLCJ3eCIpfSksbWF5RGVsZXRlOihmdW5jdGlvbihkaXIsbmFtZSxpc2Rpcil7dmFyIG5vZGU7dHJ5e25vZGU9RlMubG9va3VwTm9kZShkaXIsbmFtZSl9Y2F0Y2goZSl7cmV0dXJuIGUuZXJybm99dmFyIGVycj1GUy5ub2RlUGVybWlzc2lvbnMoZGlyLCJ3eCIpO2lmKGVycil7cmV0dXJuIGVycn1pZihpc2Rpcil7aWYoIUZTLmlzRGlyKG5vZGUubW9kZSkpe3JldHVybiBFUlJOT19DT0RFUy5FTk9URElSfWlmKEZTLmlzUm9vdChub2RlKXx8RlMuZ2V0UGF0aChub2RlKT09PUZTLmN3ZCgpKXtyZXR1cm4gRVJSTk9fQ09ERVMuRUJVU1l9fWVsc2V7aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVJU0RJUn19cmV0dXJuIDB9KSxtYXlPcGVuOihmdW5jdGlvbihub2RlLGZsYWdzKXtpZighbm9kZSl7cmV0dXJuIEVSUk5PX0NPREVTLkVOT0VOVH1pZihGUy5pc0xpbmsobm9kZS5tb2RlKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVMT09QfWVsc2UgaWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7aWYoKGZsYWdzJjIwOTcxNTUpIT09MHx8ZmxhZ3MmNTEyKXtyZXR1cm4gRVJSTk9fQ09ERVMuRUlTRElSfX1yZXR1cm4gRlMubm9kZVBlcm1pc3Npb25zKG5vZGUsRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoZmxhZ3MpKX0pLE1BWF9PUEVOX0ZEUzo0MDk2LG5leHRmZDooZnVuY3Rpb24oZmRfc3RhcnQsZmRfZW5kKXtmZF9zdGFydD1mZF9zdGFydHx8MDtmZF9lbmQ9ZmRfZW5kfHxGUy5NQVhfT1BFTl9GRFM7Zm9yKHZhciBmZD1mZF9zdGFydDtmZDw9ZmRfZW5kO2ZkKyspe2lmKCFGUy5zdHJlYW1zW2ZkXSl7cmV0dXJuIGZkfX10aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTUZJTEUpfSksZ2V0U3RyZWFtOihmdW5jdGlvbihmZCl7cmV0dXJuIEZTLnN0cmVhbXNbZmRdfSksY3JlYXRlU3RyZWFtOihmdW5jdGlvbihzdHJlYW0sZmRfc3RhcnQsZmRfZW5kKXtpZighRlMuRlNTdHJlYW0pe0ZTLkZTU3RyZWFtPShmdW5jdGlvbigpe30pO0ZTLkZTU3RyZWFtLnByb3RvdHlwZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGUy5GU1N0cmVhbS5wcm90b3R5cGUse29iamVjdDp7Z2V0OihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGV9KSxzZXQ6KGZ1bmN0aW9uKHZhbCl7dGhpcy5ub2RlPXZhbH0pfSxpc1JlYWQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5mbGFncyYyMDk3MTU1KSE9PTF9KX0saXNXcml0ZTp7Z2V0OihmdW5jdGlvbigpe3JldHVybih0aGlzLmZsYWdzJjIwOTcxNTUpIT09MH0pfSxpc0FwcGVuZDp7Z2V0OihmdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9KX19KX12YXIgbmV3U3RyZWFtPW5ldyBGUy5GU1N0cmVhbTtmb3IodmFyIHAgaW4gc3RyZWFtKXtuZXdTdHJlYW1bcF09c3RyZWFtW3BdfXN0cmVhbT1uZXdTdHJlYW07dmFyIGZkPUZTLm5leHRmZChmZF9zdGFydCxmZF9lbmQpO3N0cmVhbS5mZD1mZDtGUy5zdHJlYW1zW2ZkXT1zdHJlYW07cmV0dXJuIHN0cmVhbX0pLGNsb3NlU3RyZWFtOihmdW5jdGlvbihmZCl7RlMuc3RyZWFtc1tmZF09bnVsbH0pLGdldFN0cmVhbUZyb21QdHI6KGZ1bmN0aW9uKHB0cil7cmV0dXJuIEZTLnN0cmVhbXNbcHRyLTFdfSksZ2V0UHRyRm9yU3RyZWFtOihmdW5jdGlvbihzdHJlYW0pe3JldHVybiBzdHJlYW0/c3RyZWFtLmZkKzE6MH0pLGNocmRldl9zdHJlYW1fb3BzOntvcGVuOihmdW5jdGlvbihzdHJlYW0pe3ZhciBkZXZpY2U9RlMuZ2V0RGV2aWNlKHN0cmVhbS5ub2RlLnJkZXYpO3N0cmVhbS5zdHJlYW1fb3BzPWRldmljZS5zdHJlYW1fb3BzO2lmKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pe3N0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKX19KSxsbHNlZWs6KGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX0pfSxtYWpvcjooZnVuY3Rpb24oZGV2KXtyZXR1cm4gZGV2Pj44fSksbWlub3I6KGZ1bmN0aW9uKGRldil7cmV0dXJuIGRldiYyNTV9KSxtYWtlZGV2OihmdW5jdGlvbihtYSxtaSl7cmV0dXJuIG1hPDw4fG1pfSkscmVnaXN0ZXJEZXZpY2U6KGZ1bmN0aW9uKGRldixvcHMpe0ZTLmRldmljZXNbZGV2XT17c3RyZWFtX29wczpvcHN9fSksZ2V0RGV2aWNlOihmdW5jdGlvbihkZXYpe3JldHVybiBGUy5kZXZpY2VzW2Rldl19KSxnZXRNb3VudHM6KGZ1bmN0aW9uKG1vdW50KXt2YXIgbW91bnRzPVtdO3ZhciBjaGVjaz1bbW91bnRdO3doaWxlKGNoZWNrLmxlbmd0aCl7dmFyIG09Y2hlY2sucG9wKCk7bW91bnRzLnB1c2gobSk7Y2hlY2sucHVzaC5hcHBseShjaGVjayxtLm1vdW50cyl9cmV0dXJuIG1vdW50c30pLHN5bmNmczooZnVuY3Rpb24ocG9wdWxhdGUsY2FsbGJhY2spe2lmKHR5cGVvZiBwb3B1bGF0ZT09PSJmdW5jdGlvbiIpe2NhbGxiYWNrPXBvcHVsYXRlO3BvcHVsYXRlPWZhbHNlfXZhciBtb3VudHM9RlMuZ2V0TW91bnRzKEZTLnJvb3QubW91bnQpO3ZhciBjb21wbGV0ZWQ9MDtmdW5jdGlvbiBkb25lKGVycil7aWYoZXJyKXtpZighZG9uZS5lcnJvcmVkKXtkb25lLmVycm9yZWQ9dHJ1ZTtyZXR1cm4gY2FsbGJhY2soZXJyKX1yZXR1cm59aWYoKytjb21wbGV0ZWQ+PW1vdW50cy5sZW5ndGgpe2NhbGxiYWNrKG51bGwpfX1tb3VudHMuZm9yRWFjaCgoZnVuY3Rpb24obW91bnQpe2lmKCFtb3VudC50eXBlLnN5bmNmcyl7cmV0dXJuIGRvbmUobnVsbCl9bW91bnQudHlwZS5zeW5jZnMobW91bnQscG9wdWxhdGUsZG9uZSl9KSl9KSxtb3VudDooZnVuY3Rpb24odHlwZSxvcHRzLG1vdW50cG9pbnQpe3ZhciByb290PW1vdW50cG9pbnQ9PT0iLyI7dmFyIHBzZXVkbz0hbW91bnRwb2ludDt2YXIgbm9kZTtpZihyb290JiZGUy5yb290KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQlVTWSl9ZWxzZSBpZighcm9vdCYmIXBzZXVkbyl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKG1vdW50cG9pbnQse2ZvbGxvd19tb3VudDpmYWxzZX0pO21vdW50cG9pbnQ9bG9va3VwLnBhdGg7bm9kZT1sb29rdXAubm9kZTtpZihGUy5pc01vdW50cG9pbnQobm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1pZighRlMuaXNEaXIobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVERJUil9fXZhciBtb3VudD17dHlwZTp0eXBlLG9wdHM6b3B0cyxtb3VudHBvaW50Om1vdW50cG9pbnQsbW91bnRzOltdfTt2YXIgbW91bnRSb290PXR5cGUubW91bnQobW91bnQpO21vdW50Um9vdC5tb3VudD1tb3VudDttb3VudC5yb290PW1vdW50Um9vdDtpZihyb290KXtGUy5yb290PW1vdW50Um9vdH1lbHNlIGlmKG5vZGUpe25vZGUubW91bnRlZD1tb3VudDtpZihub2RlLm1vdW50KXtub2RlLm1vdW50Lm1vdW50cy5wdXNoKG1vdW50KX19cmV0dXJuIG1vdW50Um9vdH0pLHVubW91bnQ6KGZ1bmN0aW9uKG1vdW50cG9pbnQpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChtb3VudHBvaW50LHtmb2xsb3dfbW91bnQ6ZmFsc2V9KTtpZighRlMuaXNNb3VudHBvaW50KGxvb2t1cC5ub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbm9kZT1sb29rdXAubm9kZTt2YXIgbW91bnQ9bm9kZS5tb3VudGVkO3ZhciBtb3VudHM9RlMuZ2V0TW91bnRzKG1vdW50KTtPYmplY3Qua2V5cyhGUy5uYW1lVGFibGUpLmZvckVhY2goKGZ1bmN0aW9uKGhhc2gpe3ZhciBjdXJyZW50PUZTLm5hbWVUYWJsZVtoYXNoXTt3aGlsZShjdXJyZW50KXt2YXIgbmV4dD1jdXJyZW50Lm5hbWVfbmV4dDtpZihtb3VudHMuaW5kZXhPZihjdXJyZW50Lm1vdW50KSE9PS0xKXtGUy5kZXN0cm95Tm9kZShjdXJyZW50KX1jdXJyZW50PW5leHR9fSkpO25vZGUubW91bnRlZD1udWxsO3ZhciBpZHg9bm9kZS5tb3VudC5tb3VudHMuaW5kZXhPZihtb3VudCk7YXNzZXJ0KGlkeCE9PS0xKTtub2RlLm1vdW50Lm1vdW50cy5zcGxpY2UoaWR4LDEpfSksbG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7cmV0dXJuIHBhcmVudC5ub2RlX29wcy5sb29rdXAocGFyZW50LG5hbWUpfSksbWtub2Q6KGZ1bmN0aW9uKHBhdGgsbW9kZSxkZXYpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgZXJyPUZTLm1heUNyZWF0ZShwYXJlbnQsbmFtZSk7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfWlmKCFwYXJlbnQubm9kZV9vcHMubWtub2Qpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1yZXR1cm4gcGFyZW50Lm5vZGVfb3BzLm1rbm9kKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0pLGNyZWF0ZTooZnVuY3Rpb24ocGF0aCxtb2RlKXttb2RlPW1vZGUhPT11bmRlZmluZWQ/bW9kZTo0Mzg7bW9kZSY9NDA5NTttb2RlfD0zMjc2ODtyZXR1cm4gRlMubWtub2QocGF0aCxtb2RlLDApfSksbWtkaXI6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7bW9kZT1tb2RlIT09dW5kZWZpbmVkP21vZGU6NTExO21vZGUmPTUxMXw1MTI7bW9kZXw9MTYzODQ7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSwwKX0pLG1rZGV2OihmdW5jdGlvbihwYXRoLG1vZGUsZGV2KXtpZih0eXBlb2YgZGV2PT09InVuZGVmaW5lZCIpe2Rldj1tb2RlO21vZGU9NDM4fW1vZGV8PTgxOTI7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSxkZXYpfSksc3ltbGluazooZnVuY3Rpb24ob2xkcGF0aCxuZXdwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgobmV3cGF0aCx7cGFyZW50OnRydWV9KTt2YXIgcGFyZW50PWxvb2t1cC5ub2RlO3ZhciBuZXduYW1lPVBBVEguYmFzZW5hbWUobmV3cGF0aCk7dmFyIGVycj1GUy5tYXlDcmVhdGUocGFyZW50LG5ld25hbWUpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLnN5bWxpbmspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1yZXR1cm4gcGFyZW50Lm5vZGVfb3BzLnN5bWxpbmsocGFyZW50LG5ld25hbWUsb2xkcGF0aCl9KSxyZW5hbWU6KGZ1bmN0aW9uKG9sZF9wYXRoLG5ld19wYXRoKXt2YXIgb2xkX2Rpcm5hbWU9UEFUSC5kaXJuYW1lKG9sZF9wYXRoKTt2YXIgbmV3X2Rpcm5hbWU9UEFUSC5kaXJuYW1lKG5ld19wYXRoKTt2YXIgb2xkX25hbWU9UEFUSC5iYXNlbmFtZShvbGRfcGF0aCk7dmFyIG5ld19uYW1lPVBBVEguYmFzZW5hbWUobmV3X3BhdGgpO3ZhciBsb29rdXAsb2xkX2RpcixuZXdfZGlyO3RyeXtsb29rdXA9RlMubG9va3VwUGF0aChvbGRfcGF0aCx7cGFyZW50OnRydWV9KTtvbGRfZGlyPWxvb2t1cC5ub2RlO2xvb2t1cD1GUy5sb29rdXBQYXRoKG5ld19wYXRoLHtwYXJlbnQ6dHJ1ZX0pO25ld19kaXI9bG9va3VwLm5vZGV9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfWlmKG9sZF9kaXIubW91bnQhPT1uZXdfZGlyLm1vdW50KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FWERFVil9dmFyIG9sZF9ub2RlPUZTLmxvb2t1cE5vZGUob2xkX2RpcixvbGRfbmFtZSk7dmFyIHJlbGF0aXZlPVBBVEgucmVsYXRpdmUob2xkX3BhdGgsbmV3X2Rpcm5hbWUpO2lmKHJlbGF0aXZlLmNoYXJBdCgwKSE9PSIuIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZWxhdGl2ZT1QQVRILnJlbGF0aXZlKG5ld19wYXRoLG9sZF9kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT0iLiIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RFTVBUWSl9dmFyIG5ld19ub2RlO3RyeXtuZXdfbm9kZT1GUy5sb29rdXBOb2RlKG5ld19kaXIsbmV3X25hbWUpfWNhdGNoKGUpe31pZihvbGRfbm9kZT09PW5ld19ub2RlKXtyZXR1cm59dmFyIGlzZGlyPUZTLmlzRGlyKG9sZF9ub2RlLm1vZGUpO3ZhciBlcnI9RlMubWF5RGVsZXRlKG9sZF9kaXIsb2xkX25hbWUsaXNkaXIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1lcnI9bmV3X25vZGU/RlMubWF5RGVsZXRlKG5ld19kaXIsbmV3X25hbWUsaXNkaXIpOkZTLm1heUNyZWF0ZShuZXdfZGlyLG5ld19uYW1lKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIW9sZF9kaXIubm9kZV9vcHMucmVuYW1lKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9aWYoRlMuaXNNb3VudHBvaW50KG9sZF9ub2RlKXx8bmV3X25vZGUmJkZTLmlzTW91bnRwb2ludChuZXdfbm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1pZihuZXdfZGlyIT09b2xkX2Rpcil7ZXJyPUZTLm5vZGVQZXJtaXNzaW9ucyhvbGRfZGlyLCJ3Iik7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfX10cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsid2lsbE1vdmVQYXRoIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxNb3ZlUGF0aCJdKG9sZF9wYXRoLG5ld19wYXRoKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ3dpbGxNb3ZlUGF0aCddKCciK29sZF9wYXRoKyInLCAnIituZXdfcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9RlMuaGFzaFJlbW92ZU5vZGUob2xkX25vZGUpO3RyeXtvbGRfZGlyLm5vZGVfb3BzLnJlbmFtZShvbGRfbm9kZSxuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt0aHJvdyBlfWZpbmFsbHl7RlMuaGFzaEFkZE5vZGUob2xkX25vZGUpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbk1vdmVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Nb3ZlUGF0aCJdKG9sZF9wYXRoLG5ld19wYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25Nb3ZlUGF0aCddKCciK29sZF9wYXRoKyInLCAnIituZXdfcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTt2YXIgZXJyPUZTLm1heURlbGV0ZShwYXJlbnQsbmFtZSx0cnVlKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIXBhcmVudC5ub2RlX29wcy5ybWRpcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKXtGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKHBhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMucm1kaXIocGFyZW50LG5hbWUpO0ZTLmRlc3Ryb3lOb2RlKG5vZGUpO3RyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXSlGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXShwYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25EZWxldGVQYXRoJ10oJyIrcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9fSkscmVhZGRpcjooZnVuY3Rpb24ocGF0aCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7aWYoIW5vZGUubm9kZV9vcHMucmVhZGRpcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVERJUil9cmV0dXJuIG5vZGUubm9kZV9vcHMucmVhZGRpcihub2RlKX0pLHVubGluazooZnVuY3Rpb24ocGF0aCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyIHBhcmVudD1sb29rdXAubm9kZTt2YXIgbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO3ZhciBlcnI9RlMubWF5RGVsZXRlKHBhcmVudCxuYW1lLGZhbHNlKTtpZihlcnIpe2lmKGVycj09PUVSUk5PX0NPREVTLkVJU0RJUillcnI9RVJSTk9fQ09ERVMuRVBFUk07dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLnVubGluayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKXtGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKHBhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMudW5saW5rKHBhcmVudCxuYW1lKTtGUy5kZXN0cm95Tm9kZShub2RlKTt0cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0ocGF0aCl9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uRGVsZXRlUGF0aCddKCciK3BhdGgrIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UpfX0pLHJlYWRsaW5rOihmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCk7dmFyIGxpbms9bG9va3VwLm5vZGU7aWYoIWxpbmsubm9kZV9vcHMucmVhZGxpbmspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuIGxpbmsubm9kZV9vcHMucmVhZGxpbmsobGluayl9KSxzdGF0OihmdW5jdGlvbihwYXRoLGRvbnRGb2xsb3cpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRGb2xsb3d9KTt2YXIgbm9kZT1sb29rdXAubm9kZTtpZighbm9kZS5ub2RlX29wcy5nZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9cmV0dXJuIG5vZGUubm9kZV9vcHMuZ2V0YXR0cihub2RlKX0pLGxzdGF0OihmdW5jdGlvbihwYXRoKXtyZXR1cm4gRlMuc3RhdChwYXRoLHRydWUpfSksY2htb2Q6KGZ1bmN0aW9uKHBhdGgsbW9kZSxkb250Rm9sbG93KXt2YXIgbm9kZTtpZih0eXBlb2YgcGF0aD09PSJzdHJpbmciKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse21vZGU6bW9kZSY0MDk1fG5vZGUubW9kZSZ+NDA5NSx0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSksbGNobW9kOihmdW5jdGlvbihwYXRoLG1vZGUpe0ZTLmNobW9kKHBhdGgsbW9kZSx0cnVlKX0pLGZjaG1vZDooZnVuY3Rpb24oZmQsbW9kZSl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1GUy5jaG1vZChzdHJlYW0ubm9kZSxtb2RlKX0pLGNob3duOihmdW5jdGlvbihwYXRoLHVpZCxnaWQsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzohZG9udEZvbGxvd30pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSksbGNob3duOihmdW5jdGlvbihwYXRoLHVpZCxnaWQpe0ZTLmNob3duKHBhdGgsdWlkLGdpZCx0cnVlKX0pLGZjaG93bjooZnVuY3Rpb24oZmQsdWlkLGdpZCl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1GUy5jaG93bihzdHJlYW0ubm9kZSx1aWQsZ2lkKX0pLHRydW5jYXRlOihmdW5jdGlvbihwYXRoLGxlbil7aWYobGVuPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTRElSKX1pZighRlMuaXNGaWxlKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIGVycj1GUy5ub2RlUGVybWlzc2lvbnMobm9kZSwidyIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1ub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSx7c2l6ZTpsZW4sdGltZXN0YW1wOkRhdGUubm93KCl9KX0pLGZ0cnVuY2F0ZTooZnVuY3Rpb24oZmQsbGVuKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfUZTLnRydW5jYXRlKHN0cmVhbS5ub2RlLGxlbil9KSx1dGltZTooZnVuY3Rpb24ocGF0aCxhdGltZSxtdGltZSl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse3RpbWVzdGFtcDpNYXRoLm1heChhdGltZSxtdGltZSl9KX0pLG9wZW46KGZ1bmN0aW9uKHBhdGgsZmxhZ3MsbW9kZSxmZF9zdGFydCxmZF9lbmQpe2ZsYWdzPXR5cGVvZiBmbGFncz09PSJzdHJpbmciP0ZTLm1vZGVTdHJpbmdUb0ZsYWdzKGZsYWdzKTpmbGFnczttb2RlPXR5cGVvZiBtb2RlPT09InVuZGVmaW5lZCI/NDM4Om1vZGU7aWYoZmxhZ3MmNjQpe21vZGU9bW9kZSY0MDk1fDMyNzY4fWVsc2V7bW9kZT0wfXZhciBub2RlO2lmKHR5cGVvZiBwYXRoPT09Im9iamVjdCIpe25vZGU9cGF0aH1lbHNle3BhdGg9UEFUSC5ub3JtYWxpemUocGF0aCk7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IShmbGFncyYxMzEwNzIpfSk7bm9kZT1sb29rdXAubm9kZX1jYXRjaChlKXt9fWlmKGZsYWdzJjY0KXtpZihub2RlKXtpZihmbGFncyYxMjgpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVFWElTVCl9fWVsc2V7bm9kZT1GUy5ta25vZChwYXRoLG1vZGUsMCl9fWlmKCFub2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfWlmKEZTLmlzQ2hyZGV2KG5vZGUubW9kZSkpe2ZsYWdzJj1+NTEyfXZhciBlcnI9RlMubWF5T3Blbihub2RlLGZsYWdzKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoZmxhZ3MmNTEyKXtGUy50cnVuY2F0ZShub2RlLDApfWZsYWdzJj1+KDEyOHw1MTIpO3ZhciBzdHJlYW09RlMuY3JlYXRlU3RyZWFtKHtub2RlOm5vZGUscGF0aDpGUy5nZXRQYXRoKG5vZGUpLGZsYWdzOmZsYWdzLHNlZWthYmxlOnRydWUscG9zaXRpb246MCxzdHJlYW1fb3BzOm5vZGUuc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjpmYWxzZX0sZmRfc3RhcnQsZmRfZW5kKTtpZihzdHJlYW0uc3RyZWFtX29wcy5vcGVuKXtzdHJlYW0uc3RyZWFtX29wcy5vcGVuKHN0cmVhbSl9aWYoTW9kdWxlWyJsb2dSZWFkRmlsZXMiXSYmIShmbGFncyYxKSl7aWYoIUZTLnJlYWRGaWxlcylGUy5yZWFkRmlsZXM9e307aWYoIShwYXRoIGluIEZTLnJlYWRGaWxlcykpe0ZTLnJlYWRGaWxlc1twYXRoXT0xO01vZHVsZVsicHJpbnRFcnIiXSgicmVhZCBmaWxlOiAiK3BhdGgpfX10cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25PcGVuRmlsZSJdKXt2YXIgdHJhY2tpbmdGbGFncz0wO2lmKChmbGFncyYyMDk3MTU1KSE9PTEpe3RyYWNraW5nRmxhZ3N8PUZTLnRyYWNraW5nLm9wZW5GbGFncy5SRUFEfWlmKChmbGFncyYyMDk3MTU1KSE9PTApe3RyYWNraW5nRmxhZ3N8PUZTLnRyYWNraW5nLm9wZW5GbGFncy5XUklURX1GUy50cmFja2luZ0RlbGVnYXRlWyJvbk9wZW5GaWxlIl0ocGF0aCx0cmFja2luZ0ZsYWdzKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uT3BlbkZpbGUnXSgnIitwYXRoKyInLCBmbGFncykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9cmV0dXJuIHN0cmVhbX0pLGNsb3NlOihmdW5jdGlvbihzdHJlYW0pe3RyeXtpZihzdHJlYW0uc3RyZWFtX29wcy5jbG9zZSl7c3RyZWFtLnN0cmVhbV9vcHMuY2xvc2Uoc3RyZWFtKX19Y2F0Y2goZSl7dGhyb3cgZX1maW5hbGx5e0ZTLmNsb3NlU3RyZWFtKHN0cmVhbS5mZCl9fSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7aWYoIXN0cmVhbS5zZWVrYWJsZXx8IXN0cmVhbS5zdHJlYW1fb3BzLmxsc2Vlayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMubGxzZWVrKHN0cmVhbSxvZmZzZXQsd2hlbmNlKX0pLHJlYWQ6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbil7aWYobGVuZ3RoPDB8fHBvc2l0aW9uPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTEpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTRElSKX1pZighc3RyZWFtLnN0cmVhbV9vcHMucmVhZCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgc2Vla2luZz10cnVlO2lmKHR5cGVvZiBwb3NpdGlvbj09PSJ1bmRlZmluZWQiKXtwb3NpdGlvbj1zdHJlYW0ucG9zaXRpb247c2Vla2luZz1mYWxzZX1lbHNlIGlmKCFzdHJlYW0uc2Vla2FibGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9dmFyIGJ5dGVzUmVhZD1zdHJlYW0uc3RyZWFtX29wcy5yZWFkKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbik7aWYoIXNlZWtpbmcpc3RyZWFtLnBvc2l0aW9uKz1ieXRlc1JlYWQ7cmV0dXJuIGJ5dGVzUmVhZH0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24sY2FuT3duKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1pZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSVNESVIpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy53cml0ZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgc2Vla2luZz10cnVlO2lmKHR5cGVvZiBwb3NpdGlvbj09PSJ1bmRlZmluZWQiKXtwb3NpdGlvbj1zdHJlYW0ucG9zaXRpb247c2Vla2luZz1mYWxzZX1lbHNlIGlmKCFzdHJlYW0uc2Vla2FibGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9aWYoc3RyZWFtLmZsYWdzJjEwMjQpe0ZTLmxsc2VlayhzdHJlYW0sMCwyKX12YXIgYnl0ZXNXcml0dGVuPXN0cmVhbS5zdHJlYW1fb3BzLndyaXRlKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixjYW5Pd24pO2lmKCFzZWVraW5nKXN0cmVhbS5wb3NpdGlvbis9Ynl0ZXNXcml0dGVuO3RyeXtpZihzdHJlYW0ucGF0aCYmRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Xcml0ZVRvRmlsZSJdKUZTLnRyYWNraW5nRGVsZWdhdGVbIm9uV3JpdGVUb0ZpbGUiXShzdHJlYW0ucGF0aCl9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uV3JpdGVUb0ZpbGUnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1yZXR1cm4gYnl0ZXNXcml0dGVufSksYWxsb2NhdGU6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKXtpZihvZmZzZXQ8MHx8bGVuZ3RoPD0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQkFERil9aWYoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSYmIUZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9aWYoIXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FT1BOT1RTVVBQKX1zdHJlYW0uc3RyZWFtX29wcy5hbGxvY2F0ZShzdHJlYW0sb2Zmc2V0LGxlbmd0aCl9KSxtbWFwOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24scHJvdCxmbGFncyl7aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTEpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVBQ0NFUyl9aWYoIXN0cmVhbS5zdHJlYW1fb3BzLm1tYXApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9cmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLm1tYXAoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLHByb3QsZmxhZ3MpfSksaW9jdGw6KGZ1bmN0aW9uKHN0cmVhbSxjbWQsYXJnKXtpZighc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RUWSl9cmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLmlvY3RsKHN0cmVhbSxjbWQsYXJnKX0pLHJlYWRGaWxlOihmdW5jdGlvbihwYXRoLG9wdHMpe29wdHM9b3B0c3x8e307b3B0cy5mbGFncz1vcHRzLmZsYWdzfHwiciI7b3B0cy5lbmNvZGluZz1vcHRzLmVuY29kaW5nfHwiYmluYXJ5IjtpZihvcHRzLmVuY29kaW5nIT09InV0ZjgiJiZvcHRzLmVuY29kaW5nIT09ImJpbmFyeSIpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmNvZGluZyB0eXBlICInK29wdHMuZW5jb2RpbmcrJyInKX12YXIgcmV0O3ZhciBzdHJlYW09RlMub3BlbihwYXRoLG9wdHMuZmxhZ3MpO3ZhciBzdGF0PUZTLnN0YXQocGF0aCk7dmFyIGxlbmd0aD1zdGF0LnNpemU7dmFyIGJ1Zj1uZXcgVWludDhBcnJheShsZW5ndGgpO0ZTLnJlYWQoc3RyZWFtLGJ1ZiwwLGxlbmd0aCwwKTtpZihvcHRzLmVuY29kaW5nPT09InV0ZjgiKXtyZXQ9IiI7dmFyIHV0Zjg9bmV3IFJ1bnRpbWUuVVRGOFByb2Nlc3Nvcjtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3JldCs9dXRmOC5wcm9jZXNzQ0NoYXIoYnVmW2ldKX19ZWxzZSBpZihvcHRzLmVuY29kaW5nPT09ImJpbmFyeSIpe3JldD1idWZ9RlMuY2xvc2Uoc3RyZWFtKTtyZXR1cm4gcmV0fSksd3JpdGVGaWxlOihmdW5jdGlvbihwYXRoLGRhdGEsb3B0cyl7b3B0cz1vcHRzfHx7fTtvcHRzLmZsYWdzPW9wdHMuZmxhZ3N8fCJ3IjtvcHRzLmVuY29kaW5nPW9wdHMuZW5jb2Rpbmd8fCJ1dGY4IjtpZihvcHRzLmVuY29kaW5nIT09InV0ZjgiJiZvcHRzLmVuY29kaW5nIT09ImJpbmFyeSIpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmNvZGluZyB0eXBlICInK29wdHMuZW5jb2RpbmcrJyInKX12YXIgc3RyZWFtPUZTLm9wZW4ocGF0aCxvcHRzLmZsYWdzLG9wdHMubW9kZSk7aWYob3B0cy5lbmNvZGluZz09PSJ1dGY4Iil7dmFyIHV0Zjg9bmV3IFJ1bnRpbWUuVVRGOFByb2Nlc3Nvcjt2YXIgYnVmPW5ldyBVaW50OEFycmF5KHV0ZjgucHJvY2Vzc0pTU3RyaW5nKGRhdGEpKTtGUy53cml0ZShzdHJlYW0sYnVmLDAsYnVmLmxlbmd0aCwwLG9wdHMuY2FuT3duKX1lbHNlIGlmKG9wdHMuZW5jb2Rpbmc9PT0iYmluYXJ5Iil7RlMud3JpdGUoc3RyZWFtLGRhdGEsMCxkYXRhLmxlbmd0aCwwLG9wdHMuY2FuT3duKX1GUy5jbG9zZShzdHJlYW0pfSksY3dkOihmdW5jdGlvbigpe3JldHVybiBGUy5jdXJyZW50UGF0aH0pLGNoZGlyOihmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTtpZighRlMuaXNEaXIobG9va3VwLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfXZhciBlcnI9RlMubm9kZVBlcm1pc3Npb25zKGxvb2t1cC5ub2RlLCJ4Iik7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfUZTLmN1cnJlbnRQYXRoPWxvb2t1cC5wYXRofSksY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzOihmdW5jdGlvbigpe0ZTLm1rZGlyKCIvdG1wIil9KSxjcmVhdGVEZWZhdWx0RGV2aWNlczooZnVuY3Rpb24oKXtGUy5ta2RpcigiL2RldiIpO0ZTLnJlZ2lzdGVyRGV2aWNlKEZTLm1ha2VkZXYoMSwzKSx7cmVhZDooZnVuY3Rpb24oKXtyZXR1cm4gMH0pLHdyaXRlOihmdW5jdGlvbigpe3JldHVybiAwfSl9KTtGUy5ta2RldigiL2Rldi9udWxsIixGUy5tYWtlZGV2KDEsMykpO1RUWS5yZWdpc3RlcihGUy5tYWtlZGV2KDUsMCksVFRZLmRlZmF1bHRfdHR5X29wcyk7VFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNiwwKSxUVFkuZGVmYXVsdF90dHkxX29wcyk7RlMubWtkZXYoIi9kZXYvdHR5IixGUy5tYWtlZGV2KDUsMCkpO0ZTLm1rZGV2KCIvZGV2L3R0eTEiLEZTLm1ha2VkZXYoNiwwKSk7RlMubWtkaXIoIi9kZXYvc2htIik7RlMubWtkaXIoIi9kZXYvc2htL3RtcCIpfSksY3JlYXRlU3RhbmRhcmRTdHJlYW1zOihmdW5jdGlvbigpe2lmKE1vZHVsZVsic3RkaW4iXSl7RlMuY3JlYXRlRGV2aWNlKCIvZGV2Iiwic3RkaW4iLE1vZHVsZVsic3RkaW4iXSl9ZWxzZXtGUy5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKX1pZihNb2R1bGVbInN0ZG91dCJdKXtGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRvdXQiLG51bGwsTW9kdWxlWyJzdGRvdXQiXSl9ZWxzZXtGUy5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0Iil9aWYoTW9kdWxlWyJzdGRlcnIiXSl7RlMuY3JlYXRlRGV2aWNlKCIvZGV2Iiwic3RkZXJyIixudWxsLE1vZHVsZVsic3RkZXJyIl0pfWVsc2V7RlMuc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKX12YXIgc3RkaW49RlMub3BlbigiL2Rldi9zdGRpbiIsInIiKTtIRUFQMzJbX3N0ZGluPj4yXT1GUy5nZXRQdHJGb3JTdHJlYW0oc3RkaW4pO2Fzc2VydChzdGRpbi5mZD09PTAsImludmFsaWQgaGFuZGxlIGZvciBzdGRpbiAoIitzdGRpbi5mZCsiKSIpO3ZhciBzdGRvdXQ9RlMub3BlbigiL2Rldi9zdGRvdXQiLCJ3Iik7SEVBUDMyW19zdGRvdXQ+PjJdPUZTLmdldFB0ckZvclN0cmVhbShzdGRvdXQpO2Fzc2VydChzdGRvdXQuZmQ9PT0xLCJpbnZhbGlkIGhhbmRsZSBmb3Igc3Rkb3V0ICgiK3N0ZG91dC5mZCsiKSIpO3ZhciBzdGRlcnI9RlMub3BlbigiL2Rldi9zdGRlcnIiLCJ3Iik7SEVBUDMyW19zdGRlcnI+PjJdPUZTLmdldFB0ckZvclN0cmVhbShzdGRlcnIpO2Fzc2VydChzdGRlcnIuZmQ9PT0yLCJpbnZhbGlkIGhhbmRsZSBmb3Igc3RkZXJyICgiK3N0ZGVyci5mZCsiKSIpfSksZW5zdXJlRXJybm9FcnJvcjooZnVuY3Rpb24oKXtpZihGUy5FcnJub0Vycm9yKXJldHVybjtGUy5FcnJub0Vycm9yPWZ1bmN0aW9uIEVycm5vRXJyb3IoZXJybm8pe3RoaXMuZXJybm89ZXJybm87Zm9yKHZhciBrZXkgaW4gRVJSTk9fQ09ERVMpe2lmKEVSUk5PX0NPREVTW2tleV09PT1lcnJubyl7dGhpcy5jb2RlPWtleTticmVha319dGhpcy5tZXNzYWdlPUVSUk5PX01FU1NBR0VTW2Vycm5vXX07RlMuRXJybm9FcnJvci5wcm90b3R5cGU9bmV3IEVycm9yO0ZTLkVycm5vRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZTLkVycm5vRXJyb3I7W0VSUk5PX0NPREVTLkVOT0VOVF0uZm9yRWFjaCgoZnVuY3Rpb24oY29kZSl7RlMuZ2VuZXJpY0Vycm9yc1tjb2RlXT1uZXcgRlMuRXJybm9FcnJvcihjb2RlKTtGUy5nZW5lcmljRXJyb3JzW2NvZGVdLnN0YWNrPSI8Z2VuZXJpYyBlcnJvciwgbm8gc3RhY2s+In0pKX0pLHN0YXRpY0luaXQ6KGZ1bmN0aW9uKCl7RlMuZW5zdXJlRXJybm9FcnJvcigpO0ZTLm5hbWVUYWJsZT1uZXcgQXJyYXkoNDA5Nik7RlMubW91bnQoTUVNRlMse30sIi8iKTtGUy5jcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKTtGUy5jcmVhdGVEZWZhdWx0RGV2aWNlcygpfSksaW5pdDooZnVuY3Rpb24oaW5wdXQsb3V0cHV0LGVycm9yKXthc3NlcnQoIUZTLmluaXQuaW5pdGlhbGl6ZWQsIkZTLmluaXQgd2FzIHByZXZpb3VzbHkgY2FsbGVkLiBJZiB5b3Ugd2FudCB0byBpbml0aWFsaXplIGxhdGVyIHdpdGggY3VzdG9tIHBhcmFtZXRlcnMsIHJlbW92ZSBhbnkgZWFybGllciBjYWxscyAobm90ZSB0aGF0IG9uZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgY29kZSkiKTtGUy5pbml0LmluaXRpYWxpemVkPXRydWU7RlMuZW5zdXJlRXJybm9FcnJvcigpO01vZHVsZVsic3RkaW4iXT1pbnB1dHx8TW9kdWxlWyJzdGRpbiJdO01vZHVsZVsic3Rkb3V0Il09b3V0cHV0fHxNb2R1bGVbInN0ZG91dCJdO01vZHVsZVsic3RkZXJyIl09ZXJyb3J8fE1vZHVsZVsic3RkZXJyIl07RlMuY3JlYXRlU3RhbmRhcmRTdHJlYW1zKCl9KSxxdWl0OihmdW5jdGlvbigpe0ZTLmluaXQuaW5pdGlhbGl6ZWQ9ZmFsc2U7Zm9yKHZhciBpPTA7aTxGUy5zdHJlYW1zLmxlbmd0aDtpKyspe3ZhciBzdHJlYW09RlMuc3RyZWFtc1tpXTtpZighc3RyZWFtKXtjb250aW51ZX1GUy5jbG9zZShzdHJlYW0pfX0pLGdldE1vZGU6KGZ1bmN0aW9uKGNhblJlYWQsY2FuV3JpdGUpe3ZhciBtb2RlPTA7aWYoY2FuUmVhZCltb2RlfD0yOTJ8NzM7aWYoY2FuV3JpdGUpbW9kZXw9MTQ2O3JldHVybiBtb2RlfSksam9pblBhdGg6KGZ1bmN0aW9uKHBhcnRzLGZvcmNlUmVsYXRpdmUpe3ZhciBwYXRoPVBBVEguam9pbi5hcHBseShudWxsLHBhcnRzKTtpZihmb3JjZVJlbGF0aXZlJiZwYXRoWzBdPT0iLyIpcGF0aD1wYXRoLnN1YnN0cigxKTtyZXR1cm4gcGF0aH0pLGFic29sdXRlUGF0aDooZnVuY3Rpb24ocmVsYXRpdmUsYmFzZSl7cmV0dXJuIFBBVEgucmVzb2x2ZShiYXNlLHJlbGF0aXZlKX0pLHN0YW5kYXJkaXplUGF0aDooZnVuY3Rpb24ocGF0aCl7cmV0dXJuIFBBVEgubm9ybWFsaXplKHBhdGgpfSksZmluZE9iamVjdDooZnVuY3Rpb24ocGF0aCxkb250UmVzb2x2ZUxhc3RMaW5rKXt2YXIgcmV0PUZTLmFuYWx5emVQYXRoKHBhdGgsZG9udFJlc29sdmVMYXN0TGluayk7aWYocmV0LmV4aXN0cyl7cmV0dXJuIHJldC5vYmplY3R9ZWxzZXtfX19zZXRFcnJObyhyZXQuZXJyb3IpO3JldHVybiBudWxsfX0pLGFuYWx5emVQYXRoOihmdW5jdGlvbihwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspe3RyeXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cGF0aD1sb29rdXAucGF0aH1jYXRjaChlKXt9dmFyIHJldD17aXNSb290OmZhbHNlLGV4aXN0czpmYWxzZSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOmZhbHNlLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3JldC5wYXJlbnRFeGlzdHM9dHJ1ZTtyZXQucGFyZW50UGF0aD1sb29rdXAucGF0aDtyZXQucGFyZW50T2JqZWN0PWxvb2t1cC5ub2RlO3JldC5uYW1lPVBBVEguYmFzZW5hbWUocGF0aCk7bG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cmV0LmV4aXN0cz10cnVlO3JldC5wYXRoPWxvb2t1cC5wYXRoO3JldC5vYmplY3Q9bG9va3VwLm5vZGU7cmV0Lm5hbWU9bG9va3VwLm5vZGUubmFtZTtyZXQuaXNSb290PWxvb2t1cC5wYXRoPT09Ii8ifWNhdGNoKGUpe3JldC5lcnJvcj1lLmVycm5vfXJldHVybiByZXR9KSxjcmVhdGVGb2xkZXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGNhblJlYWQsY2FuV3JpdGUpe3ZhciBwYXRoPVBBVEguam9pbjIodHlwZW9mIHBhcmVudD09PSJzdHJpbmciP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMubWtkaXIocGF0aCxtb2RlKX0pLGNyZWF0ZVBhdGg6KGZ1bmN0aW9uKHBhcmVudCxwYXRoLGNhblJlYWQsY2FuV3JpdGUpe3BhcmVudD10eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KTt2YXIgcGFydHM9cGF0aC5zcGxpdCgiLyIpLnJldmVyc2UoKTt3aGlsZShwYXJ0cy5sZW5ndGgpe3ZhciBwYXJ0PXBhcnRzLnBvcCgpO2lmKCFwYXJ0KWNvbnRpbnVlO3ZhciBjdXJyZW50PVBBVEguam9pbjIocGFyZW50LHBhcnQpO3RyeXtGUy5ta2RpcihjdXJyZW50KX1jYXRjaChlKXt9cGFyZW50PWN1cnJlbnR9cmV0dXJuIGN1cnJlbnR9KSxjcmVhdGVGaWxlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxwcm9wZXJ0aWVzLGNhblJlYWQsY2FuV3JpdGUpe3ZhciBwYXRoPVBBVEguam9pbjIodHlwZW9mIHBhcmVudD09PSJzdHJpbmciP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMuY3JlYXRlKHBhdGgsbW9kZSl9KSxjcmVhdGVEYXRhRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsZGF0YSxjYW5SZWFkLGNhbldyaXRlLGNhbk93bil7dmFyIHBhdGg9bmFtZT9QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT0ic3RyaW5nIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpLG5hbWUpOnBhcmVudDt2YXIgbW9kZT1GUy5nZXRNb2RlKGNhblJlYWQsY2FuV3JpdGUpO3ZhciBub2RlPUZTLmNyZWF0ZShwYXRoLG1vZGUpO2lmKGRhdGEpe2lmKHR5cGVvZiBkYXRhPT09InN0cmluZyIpe3ZhciBhcnI9bmV3IEFycmF5KGRhdGEubGVuZ3RoKTtmb3IodmFyIGk9MCxsZW49ZGF0YS5sZW5ndGg7aTxsZW47KytpKWFycltpXT1kYXRhLmNoYXJDb2RlQXQoaSk7ZGF0YT1hcnJ9RlMuY2htb2Qobm9kZSxtb2RlfDE0Nik7dmFyIHN0cmVhbT1GUy5vcGVuKG5vZGUsInciKTtGUy53cml0ZShzdHJlYW0sZGF0YSwwLGRhdGEubGVuZ3RoLDAsY2FuT3duKTtGUy5jbG9zZShzdHJlYW0pO0ZTLmNobW9kKG5vZGUsbW9kZSl9cmV0dXJuIG5vZGV9KSxjcmVhdGVEZXZpY2U6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGlucHV0LG91dHB1dCl7dmFyIHBhdGg9UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTt2YXIgbW9kZT1GUy5nZXRNb2RlKCEhaW5wdXQsISFvdXRwdXQpO2lmKCFGUy5jcmVhdGVEZXZpY2UubWFqb3IpRlMuY3JlYXRlRGV2aWNlLm1ham9yPTY0O3ZhciBkZXY9RlMubWFrZWRldihGUy5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtGUy5yZWdpc3RlckRldmljZShkZXYse29wZW46KGZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnNlZWthYmxlPWZhbHNlfSksY2xvc2U6KGZ1bmN0aW9uKHN0cmVhbSl7aWYob3V0cHV0JiZvdXRwdXQuYnVmZmVyJiZvdXRwdXQuYnVmZmVyLmxlbmd0aCl7b3V0cHV0KDEwKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXt2YXIgYnl0ZXNSZWFkPTA7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXt2YXIgcmVzdWx0O3RyeXtyZXN1bHQ9aW5wdXQoKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfWlmKHJlc3VsdD09PXVuZGVmaW5lZCYmYnl0ZXNSZWFkPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gYnl0ZXNSZWFkfSksd3JpdGU6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3Mpe2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dHJ5e291dHB1dChidWZmZXJbb2Zmc2V0K2ldKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfX1pZihsZW5ndGgpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBpfSl9KTtyZXR1cm4gRlMubWtkZXYocGF0aCxtb2RlLGRldil9KSxjcmVhdGVMaW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSx0YXJnZXQsY2FuUmVhZCxjYW5Xcml0ZSl7dmFyIHBhdGg9UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTtyZXR1cm4gRlMuc3ltbGluayh0YXJnZXQscGF0aCl9KSxmb3JjZUxvYWRGaWxlOihmdW5jdGlvbihvYmope2lmKG9iai5pc0RldmljZXx8b2JqLmlzRm9sZGVyfHxvYmoubGlua3x8b2JqLmNvbnRlbnRzKXJldHVybiB0cnVlO3ZhciBzdWNjZXNzPXRydWU7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT09InVuZGVmaW5lZCIpe3Rocm93IG5ldyBFcnJvcigiTGF6eSBsb2FkaW5nIHNob3VsZCBoYXZlIGJlZW4gcGVyZm9ybWVkIChjb250ZW50cyBzZXQpIGluIGNyZWF0ZUxhenlGaWxlLCBidXQgaXQgd2FzIG5vdC4gTGF6eSBsb2FkaW5nIG9ubHkgd29ya3MgaW4gd2ViIHdvcmtlcnMuIFVzZSAtLWVtYmVkLWZpbGUgb3IgLS1wcmVsb2FkLWZpbGUgaW4gZW1jYyBvbiB0aGUgbWFpbiB0aHJlYWQuIil9ZWxzZSBpZihNb2R1bGVbInJlYWQiXSl7dHJ5e29iai5jb250ZW50cz1pbnRBcnJheUZyb21TdHJpbmcoTW9kdWxlWyJyZWFkIl0ob2JqLnVybCksdHJ1ZSl9Y2F0Y2goZSl7c3VjY2Vzcz1mYWxzZX19ZWxzZXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfWlmKCFzdWNjZXNzKV9fX3NldEVyck5vKEVSUk5PX0NPREVTLkVJTyk7cmV0dXJuIHN1Y2Nlc3N9KSxjcmVhdGVMYXp5RmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsdXJsLGNhblJlYWQsY2FuV3JpdGUpe2Z1bmN0aW9uIExhenlVaW50OEFycmF5KCl7dGhpcy5sZW5ndGhLbm93bj1mYWxzZTt0aGlzLmNodW5rcz1bXX1MYXp5VWludDhBcnJheS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIExhenlVaW50OEFycmF5X2dldChpZHgpe2lmKGlkeD50aGlzLmxlbmd0aC0xfHxpZHg8MCl7cmV0dXJuIHVuZGVmaW5lZH12YXIgY2h1bmtPZmZzZXQ9aWR4JXRoaXMuY2h1bmtTaXplO3ZhciBjaHVua051bT1NYXRoLmZsb29yKGlkeC90aGlzLmNodW5rU2l6ZSk7cmV0dXJuIHRoaXMuZ2V0dGVyKGNodW5rTnVtKVtjaHVua09mZnNldF19O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5zZXREYXRhR2V0dGVyPWZ1bmN0aW9uIExhenlVaW50OEFycmF5X3NldERhdGFHZXR0ZXIoZ2V0dGVyKXt0aGlzLmdldHRlcj1nZXR0ZXJ9O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5jYWNoZUxlbmd0aD1mdW5jdGlvbiBMYXp5VWludDhBcnJheV9jYWNoZUxlbmd0aCgpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJIRUFEIix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIrdXJsKyIuIFN0YXR1czogIit4aHIuc3RhdHVzKTt2YXIgZGF0YWxlbmd0aD1OdW1iZXIoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LWxlbmd0aCIpKTt2YXIgaGVhZGVyO3ZhciBoYXNCeXRlU2VydmluZz0oaGVhZGVyPXhoci5nZXRSZXNwb25zZUhlYWRlcigiQWNjZXB0LVJhbmdlcyIpKSYmaGVhZGVyPT09ImJ5dGVzIjt2YXIgY2h1bmtTaXplPTEwMjQqMTAyNDtpZighaGFzQnl0ZVNlcnZpbmcpY2h1bmtTaXplPWRhdGFsZW5ndGg7dmFyIGRvWEhSPShmdW5jdGlvbihmcm9tLHRvKXtpZihmcm9tPnRvKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCByYW5nZSAoIitmcm9tKyIsICIrdG8rIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKHRvPmRhdGFsZW5ndGgtMSl0aHJvdyBuZXcgRXJyb3IoIm9ubHkgIitkYXRhbGVuZ3RoKyIgYnl0ZXMgYXZhaWxhYmxlISBwcm9ncmFtbWVyIGVycm9yISIpO3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7aWYoZGF0YWxlbmd0aCE9PWNodW5rU2l6ZSl4aHIuc2V0UmVxdWVzdEhlYWRlcigiUmFuZ2UiLCJieXRlcz0iK2Zyb20rIi0iK3RvKTtpZih0eXBlb2YgVWludDhBcnJheSE9InVuZGVmaW5lZCIpeGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO2lmKHhoci5vdmVycmlkZU1pbWVUeXBlKXt4aHIub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpfXhoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIrdXJsKyIuIFN0YXR1czogIit4aHIuc3RhdHVzKTtpZih4aHIucmVzcG9uc2UhPT11bmRlZmluZWQpe3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2V8fFtdKX1lbHNle3JldHVybiBpbnRBcnJheUZyb21TdHJpbmcoeGhyLnJlc3BvbnNlVGV4dHx8IiIsdHJ1ZSl9fSk7dmFyIGxhenlBcnJheT10aGlzO2xhenlBcnJheS5zZXREYXRhR2V0dGVyKChmdW5jdGlvbihjaHVua051bSl7dmFyIHN0YXJ0PWNodW5rTnVtKmNodW5rU2l6ZTt2YXIgZW5kPShjaHVua051bSsxKSpjaHVua1NpemUtMTtlbmQ9TWF0aC5taW4oZW5kLGRhdGFsZW5ndGgtMSk7aWYodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09InVuZGVmaW5lZCIpe2xhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPWRvWEhSKHN0YXJ0LGVuZCl9aWYodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09InVuZGVmaW5lZCIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dfSkpO3RoaXMuX2xlbmd0aD1kYXRhbGVuZ3RoO3RoaXMuX2NodW5rU2l6ZT1jaHVua1NpemU7dGhpcy5sZW5ndGhLbm93bj10cnVlfTtpZih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPT0idW5kZWZpbmVkIil7aWYoIUVOVklST05NRU5UX0lTX1dPUktFUil0aHJvdyJDYW5ub3QgZG8gc3luY2hyb25vdXMgYmluYXJ5IFhIUnMgb3V0c2lkZSB3ZWJ3b3JrZXJzIGluIG1vZGVybiBicm93c2Vycy4gVXNlIC0tZW1iZWQtZmlsZSBvciAtLXByZWxvYWQtZmlsZSBpbiBlbWNjIjt2YXIgbGF6eUFycmF5PW5ldyBMYXp5VWludDhBcnJheTtPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eUFycmF5LCJsZW5ndGgiLHtnZXQ6KGZ1bmN0aW9uKCl7aWYoIXRoaXMubGVuZ3RoS25vd24pe3RoaXMuY2FjaGVMZW5ndGgoKX1yZXR1cm4gdGhpcy5fbGVuZ3RofSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eUFycmF5LCJjaHVua1NpemUiLHtnZXQ6KGZ1bmN0aW9uKCl7aWYoIXRoaXMubGVuZ3RoS25vd24pe3RoaXMuY2FjaGVMZW5ndGgoKX1yZXR1cm4gdGhpcy5fY2h1bmtTaXplfSl9KTt2YXIgcHJvcGVydGllcz17aXNEZXZpY2U6ZmFsc2UsY29udGVudHM6bGF6eUFycmF5fX1lbHNle3ZhciBwcm9wZXJ0aWVzPXtpc0RldmljZTpmYWxzZSx1cmw6dXJsfX12YXIgbm9kZT1GUy5jcmVhdGVGaWxlKHBhcmVudCxuYW1lLHByb3BlcnRpZXMsY2FuUmVhZCxjYW5Xcml0ZSk7aWYocHJvcGVydGllcy5jb250ZW50cyl7bm9kZS5jb250ZW50cz1wcm9wZXJ0aWVzLmNvbnRlbnRzfWVsc2UgaWYocHJvcGVydGllcy51cmwpe25vZGUuY29udGVudHM9bnVsbDtub2RlLnVybD1wcm9wZXJ0aWVzLnVybH12YXIgc3RyZWFtX29wcz17fTt2YXIga2V5cz1PYmplY3Qua2V5cyhub2RlLnN0cmVhbV9vcHMpO2tleXMuZm9yRWFjaCgoZnVuY3Rpb24oa2V5KXt2YXIgZm49bm9kZS5zdHJlYW1fb3BzW2tleV07c3RyZWFtX29wc1trZXldPWZ1bmN0aW9uIGZvcmNlTG9hZExhenlGaWxlKCl7aWYoIUZTLmZvcmNlTG9hZEZpbGUobm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9cmV0dXJuIGZuLmFwcGx5KG51bGwsYXJndW1lbnRzKX19KSk7c3RyZWFtX29wcy5yZWFkPWZ1bmN0aW9uIHN0cmVhbV9vcHNfcmVhZChzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe2lmKCFGUy5mb3JjZUxvYWRGaWxlKG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfXZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50cztpZihwb3NpdGlvbj49Y29udGVudHMubGVuZ3RoKXJldHVybiAwO3ZhciBzaXplPU1hdGgubWluKGNvbnRlbnRzLmxlbmd0aC1wb3NpdGlvbixsZW5ndGgpO2Fzc2VydChzaXplPj0wKTtpZihjb250ZW50cy5zbGljZSl7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX19ZWxzZXtmb3IodmFyIGk9MDtpPHNpemU7aSsrKXtidWZmZXJbb2Zmc2V0K2ldPWNvbnRlbnRzLmdldChwb3NpdGlvbitpKX19cmV0dXJuIHNpemV9O25vZGUuc3RyZWFtX29wcz1zdHJlYW1fb3BzO3JldHVybiBub2RlfSksY3JlYXRlUHJlbG9hZGVkRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsdXJsLGNhblJlYWQsY2FuV3JpdGUsb25sb2FkLG9uZXJyb3IsZG9udENyZWF0ZUZpbGUsY2FuT3duKXtCcm93c2VyLmluaXQoKTt2YXIgZnVsbG5hbWU9bmFtZT9QQVRILnJlc29sdmUoUEFUSC5qb2luMihwYXJlbnQsbmFtZSkpOnBhcmVudDtmdW5jdGlvbiBwcm9jZXNzRGF0YShieXRlQXJyYXkpe2Z1bmN0aW9uIGZpbmlzaChieXRlQXJyYXkpe2lmKCFkb250Q3JlYXRlRmlsZSl7RlMuY3JlYXRlRGF0YUZpbGUocGFyZW50LG5hbWUsYnl0ZUFycmF5LGNhblJlYWQsY2FuV3JpdGUsY2FuT3duKX1pZihvbmxvYWQpb25sb2FkKCk7cmVtb3ZlUnVuRGVwZW5kZW5jeSgiY3AgIitmdWxsbmFtZSl9dmFyIGhhbmRsZWQ9ZmFsc2U7TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLmZvckVhY2goKGZ1bmN0aW9uKHBsdWdpbil7aWYoaGFuZGxlZClyZXR1cm47aWYocGx1Z2luWyJjYW5IYW5kbGUiXShmdWxsbmFtZSkpe3BsdWdpblsiaGFuZGxlIl0oYnl0ZUFycmF5LGZ1bGxuYW1lLGZpbmlzaCwoZnVuY3Rpb24oKXtpZihvbmVycm9yKW9uZXJyb3IoKTtyZW1vdmVSdW5EZXBlbmRlbmN5KCJjcCAiK2Z1bGxuYW1lKX0pKTtoYW5kbGVkPXRydWV9fSkpO2lmKCFoYW5kbGVkKWZpbmlzaChieXRlQXJyYXkpfWFkZFJ1bkRlcGVuZGVuY3koImNwICIrZnVsbG5hbWUpO2lmKHR5cGVvZiB1cmw9PSJzdHJpbmciKXtCcm93c2VyLmFzeW5jTG9hZCh1cmwsKGZ1bmN0aW9uKGJ5dGVBcnJheSl7cHJvY2Vzc0RhdGEoYnl0ZUFycmF5KX0pLG9uZXJyb3IpfWVsc2V7cHJvY2Vzc0RhdGEodXJsKX19KSxpbmRleGVkREI6KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbmRleGVkREJ8fHdpbmRvdy5tb3pJbmRleGVkREJ8fHdpbmRvdy53ZWJraXRJbmRleGVkREJ8fHdpbmRvdy5tc0luZGV4ZWREQn0pLERCX05BTUU6KGZ1bmN0aW9uKCl7cmV0dXJuIkVNX0ZTXyIrd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSksREJfVkVSU0lPTjoyMCxEQl9TVE9SRV9OQU1FOiJGSUxFX0RBVEEiLHNhdmVGaWxlc1RvREI6KGZ1bmN0aW9uKHBhdGhzLG9ubG9hZCxvbmVycm9yKXtvbmxvYWQ9b25sb2FkfHwoZnVuY3Rpb24oKXt9KTtvbmVycm9yPW9uZXJyb3J8fChmdW5jdGlvbigpe30pO3ZhciBpbmRleGVkREI9RlMuaW5kZXhlZERCKCk7dHJ5e3ZhciBvcGVuUmVxdWVzdD1pbmRleGVkREIub3BlbihGUy5EQl9OQU1FKCksRlMuREJfVkVSU0lPTil9Y2F0Y2goZSl7cmV0dXJuIG9uZXJyb3IoZSl9b3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkPWZ1bmN0aW9uIG9wZW5SZXF1ZXN0X29udXBncmFkZW5lZWRlZCgpe2NvbnNvbGUubG9nKCJjcmVhdGluZyBkYiIpO3ZhciBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7ZGIuY3JlYXRlT2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSl9O29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbRlMuREJfU1RPUkVfTkFNRV0sInJlYWR3cml0ZSIpO3ZhciBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXIgb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uIGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZSBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7dmFyIHB1dFJlcXVlc3Q9ZmlsZXMucHV0KEZTLmFuYWx5emVQYXRoKHBhdGgpLm9iamVjdC5jb250ZW50cyxwYXRoKTtwdXRSZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBwdXRSZXF1ZXN0X29uc3VjY2Vzcygpe29rKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9O3B1dFJlcXVlc3Qub25lcnJvcj1mdW5jdGlvbiBwdXRSZXF1ZXN0X29uZXJyb3IoKXtmYWlsKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9fSkpO3RyYW5zYWN0aW9uLm9uZXJyb3I9b25lcnJvcn07b3BlblJlcXVlc3Qub25lcnJvcj1vbmVycm9yfSksbG9hZEZpbGVzRnJvbURCOihmdW5jdGlvbihwYXRocyxvbmxvYWQsb25lcnJvcil7b25sb2FkPW9ubG9hZHx8KGZ1bmN0aW9uKCl7fSk7b25lcnJvcj1vbmVycm9yfHwoZnVuY3Rpb24oKXt9KTt2YXIgaW5kZXhlZERCPUZTLmluZGV4ZWREQigpO3RyeXt2YXIgb3BlblJlcXVlc3Q9aW5kZXhlZERCLm9wZW4oRlMuREJfTkFNRSgpLEZTLkRCX1ZFUlNJT04pfWNhdGNoKGUpe3JldHVybiBvbmVycm9yKGUpfW9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZD1vbmVycm9yO29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3RyeXt2YXIgdHJhbnNhY3Rpb249ZGIudHJhbnNhY3Rpb24oW0ZTLkRCX1NUT1JFX05BTUVdLCJyZWFkb25seSIpfWNhdGNoKGUpe29uZXJyb3IoZSk7cmV0dXJufXZhciBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXIgb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uIGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZSBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7dmFyIGdldFJlcXVlc3Q9ZmlsZXMuZ2V0KHBhdGgpO2dldFJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIGdldFJlcXVlc3Rfb25zdWNjZXNzKCl7aWYoRlMuYW5hbHl6ZVBhdGgocGF0aCkuZXhpc3RzKXtGUy51bmxpbmsocGF0aCl9RlMuY3JlYXRlRGF0YUZpbGUoUEFUSC5kaXJuYW1lKHBhdGgpLFBBVEguYmFzZW5hbWUocGF0aCksZ2V0UmVxdWVzdC5yZXN1bHQsdHJ1ZSx0cnVlLHRydWUpO29rKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9O2dldFJlcXVlc3Qub25lcnJvcj1mdW5jdGlvbiBnZXRSZXF1ZXN0X29uZXJyb3IoKXtmYWlsKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9fSkpO3RyYW5zYWN0aW9uLm9uZXJyb3I9b25lcnJvcn07b3BlblJlcXVlc3Qub25lcnJvcj1vbmVycm9yfSl9O2Z1bmN0aW9uIF9mZmx1c2goc3RyZWFtKXt9TW9kdWxlWyJfc3RybGVuIl09X3N0cmxlbjtmdW5jdGlvbiBfX3JlYWxseU5lZ2F0aXZlKHgpe3JldHVybiB4PDB8fHg9PT0wJiYxL3g9PT0tSW5maW5pdHl9ZnVuY3Rpb24gX19mb3JtYXRTdHJpbmcoZm9ybWF0LHZhcmFyZ3Mpe3ZhciB0ZXh0SW5kZXg9Zm9ybWF0O3ZhciBhcmdJbmRleD0wO2Z1bmN0aW9uIGdldE5leHRBcmcodHlwZSl7dmFyIHJldDtpZih0eXBlPT09ImRvdWJsZSIpe3JldD0oSEVBUDMyW3RlbXBEb3VibGVQdHI+PjJdPUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXSxIRUFQMzJbdGVtcERvdWJsZVB0cis0Pj4yXT1IRUFQMzJbdmFyYXJncysoYXJnSW5kZXgrNCk+PjJdLCtIRUFQRjY0W3RlbXBEb3VibGVQdHI+PjNdKX1lbHNlIGlmKHR5cGU9PSJpNjQiKXtyZXQ9W0hFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXSxIRUFQMzJbdmFyYXJncysoYXJnSW5kZXgrNCk+PjJdXX1lbHNle3R5cGU9ImkzMiI7cmV0PUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXX1hcmdJbmRleCs9UnVudGltZS5nZXROYXRpdmVGaWVsZFNpemUodHlwZSk7cmV0dXJuIHJldH12YXIgcmV0PVtdO3ZhciBjdXJyLG5leHQsY3VyckFyZzt3aGlsZSgxKXt2YXIgc3RhcnRUZXh0SW5kZXg9dGV4dEluZGV4O2N1cnI9SEVBUDhbdGV4dEluZGV4Pj4wXTtpZihjdXJyPT09MClicmVhaztuZXh0PUhFQVA4W3RleHRJbmRleCsxPj4wXTtpZihjdXJyPT0zNyl7dmFyIGZsYWdBbHdheXNTaWduZWQ9ZmFsc2U7dmFyIGZsYWdMZWZ0QWxpZ249ZmFsc2U7dmFyIGZsYWdBbHRlcm5hdGl2ZT1mYWxzZTt2YXIgZmxhZ1plcm9QYWQ9ZmFsc2U7dmFyIGZsYWdQYWRTaWduPWZhbHNlO2ZsYWdzTG9vcDp3aGlsZSgxKXtzd2l0Y2gobmV4dCl7Y2FzZSA0MzpmbGFnQWx3YXlzU2lnbmVkPXRydWU7YnJlYWs7Y2FzZSA0NTpmbGFnTGVmdEFsaWduPXRydWU7YnJlYWs7Y2FzZSAzNTpmbGFnQWx0ZXJuYXRpdmU9dHJ1ZTticmVhaztjYXNlIDQ4OmlmKGZsYWdaZXJvUGFkKXticmVhayBmbGFnc0xvb3B9ZWxzZXtmbGFnWmVyb1BhZD10cnVlO2JyZWFrfTtjYXNlIDMyOmZsYWdQYWRTaWduPXRydWU7YnJlYWs7ZGVmYXVsdDpicmVhayBmbGFnc0xvb3B9dGV4dEluZGV4Kys7bmV4dD1IRUFQOFt0ZXh0SW5kZXgrMT4+MF19dmFyIHdpZHRoPTA7aWYobmV4dD09NDIpe3dpZHRoPWdldE5leHRBcmcoImkzMiIpO3RleHRJbmRleCsrO25leHQ9SEVBUDhbdGV4dEluZGV4KzE+PjBdfWVsc2V7d2hpbGUobmV4dD49NDgmJm5leHQ8PTU3KXt3aWR0aD13aWR0aCoxMCsobmV4dC00OCk7dGV4dEluZGV4Kys7bmV4dD1IRUFQOFt0ZXh0SW5kZXgrMT4+MF19fXZhciBwcmVjaXNpb25TZXQ9ZmFsc2UscHJlY2lzaW9uPS0xO2lmKG5leHQ9PTQ2KXtwcmVjaXNpb249MDtwcmVjaXNpb25TZXQ9dHJ1ZTt0ZXh0SW5kZXgrKztuZXh0PUhFQVA4W3RleHRJbmRleCsxPj4wXTtpZihuZXh0PT00Mil7cHJlY2lzaW9uPWdldE5leHRBcmcoImkzMiIpO3RleHRJbmRleCsrfWVsc2V7d2hpbGUoMSl7dmFyIHByZWNpc2lvbkNocj1IRUFQOFt0ZXh0SW5kZXgrMT4+MF07aWYocHJlY2lzaW9uQ2hyPDQ4fHxwcmVjaXNpb25DaHI+NTcpYnJlYWs7cHJlY2lzaW9uPXByZWNpc2lvbioxMCsocHJlY2lzaW9uQ2hyLTQ4KTt0ZXh0SW5kZXgrK319bmV4dD1IRUFQOFt0ZXh0SW5kZXgrMT4+MF19aWYocHJlY2lzaW9uPDApe3ByZWNpc2lvbj02O3ByZWNpc2lvblNldD1mYWxzZX12YXIgYXJnU2l6ZTtzd2l0Y2goU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0KSl7Y2FzZSJoIjp2YXIgbmV4dE5leHQ9SEVBUDhbdGV4dEluZGV4KzI+PjBdO2lmKG5leHROZXh0PT0xMDQpe3RleHRJbmRleCsrO2FyZ1NpemU9MX1lbHNle2FyZ1NpemU9Mn1icmVhaztjYXNlImwiOnZhciBuZXh0TmV4dD1IRUFQOFt0ZXh0SW5kZXgrMj4+MF07aWYobmV4dE5leHQ9PTEwOCl7dGV4dEluZGV4Kys7YXJnU2l6ZT04fWVsc2V7YXJnU2l6ZT00fWJyZWFrO2Nhc2UiTCI6Y2FzZSJxIjpjYXNlImoiOmFyZ1NpemU9ODticmVhaztjYXNlInoiOmNhc2UidCI6Y2FzZSJJIjphcmdTaXplPTQ7YnJlYWs7ZGVmYXVsdDphcmdTaXplPW51bGx9aWYoYXJnU2l6ZSl0ZXh0SW5kZXgrKztuZXh0PUhFQVA4W3RleHRJbmRleCsxPj4wXTtzd2l0Y2goU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0KSl7Y2FzZSJkIjpjYXNlImkiOmNhc2UidSI6Y2FzZSJvIjpjYXNlIngiOmNhc2UiWCI6Y2FzZSJwIjp7dmFyIHNpZ25lZD1uZXh0PT0xMDB8fG5leHQ9PTEwNTthcmdTaXplPWFyZ1NpemV8fDQ7dmFyIGN1cnJBcmc9Z2V0TmV4dEFyZygiaSIrYXJnU2l6ZSo4KTt2YXIgb3JpZ0FyZz1jdXJyQXJnO3ZhciBhcmdUZXh0O2lmKGFyZ1NpemU9PTgpe2N1cnJBcmc9UnVudGltZS5tYWtlQmlnSW50KGN1cnJBcmdbMF0sY3VyckFyZ1sxXSxuZXh0PT0xMTcpfWlmKGFyZ1NpemU8PTQpe3ZhciBsaW1pdD1NYXRoLnBvdygyNTYsYXJnU2l6ZSktMTtjdXJyQXJnPShzaWduZWQ/cmVTaWduOnVuU2lnbikoY3VyckFyZyZsaW1pdCxhcmdTaXplKjgpfXZhciBjdXJyQWJzQXJnPU1hdGguYWJzKGN1cnJBcmcpO3ZhciBwcmVmaXg9IiI7aWYobmV4dD09MTAwfHxuZXh0PT0xMDUpe2lmKGFyZ1NpemU9PTgmJmk2NE1hdGgpYXJnVGV4dD1pNjRNYXRoLnN0cmluZ2lmeShvcmlnQXJnWzBdLG9yaWdBcmdbMV0sbnVsbCk7ZWxzZSBhcmdUZXh0PXJlU2lnbihjdXJyQXJnLDgqYXJnU2l6ZSwxKS50b1N0cmluZygxMCl9ZWxzZSBpZihuZXh0PT0xMTcpe2lmKGFyZ1NpemU9PTgmJmk2NE1hdGgpYXJnVGV4dD1pNjRNYXRoLnN0cmluZ2lmeShvcmlnQXJnWzBdLG9yaWdBcmdbMV0sdHJ1ZSk7ZWxzZSBhcmdUZXh0PXVuU2lnbihjdXJyQXJnLDgqYXJnU2l6ZSwxKS50b1N0cmluZygxMCk7Y3VyckFyZz1NYXRoLmFicyhjdXJyQXJnKX1lbHNlIGlmKG5leHQ9PTExMSl7YXJnVGV4dD0oZmxhZ0FsdGVybmF0aXZlPyIwIjoiIikrY3VyckFic0FyZy50b1N0cmluZyg4KX1lbHNlIGlmKG5leHQ9PTEyMHx8bmV4dD09ODgpe3ByZWZpeD1mbGFnQWx0ZXJuYXRpdmUmJmN1cnJBcmchPTA/IjB4IjoiIjtpZihhcmdTaXplPT04JiZpNjRNYXRoKXtpZihvcmlnQXJnWzFdKXthcmdUZXh0PShvcmlnQXJnWzFdPj4+MCkudG9TdHJpbmcoMTYpO3ZhciBsb3dlcj0ob3JpZ0FyZ1swXT4+PjApLnRvU3RyaW5nKDE2KTt3aGlsZShsb3dlci5sZW5ndGg8OClsb3dlcj0iMCIrbG93ZXI7YXJnVGV4dCs9bG93ZXJ9ZWxzZXthcmdUZXh0PShvcmlnQXJnWzBdPj4+MCkudG9TdHJpbmcoMTYpfX1lbHNlIGlmKGN1cnJBcmc8MCl7Y3VyckFyZz0tY3VyckFyZzthcmdUZXh0PShjdXJyQWJzQXJnLTEpLnRvU3RyaW5nKDE2KTt2YXIgYnVmZmVyPVtdO2Zvcih2YXIgaT0wO2k8YXJnVGV4dC5sZW5ndGg7aSsrKXtidWZmZXIucHVzaCgoMTUtcGFyc2VJbnQoYXJnVGV4dFtpXSwxNikpLnRvU3RyaW5nKDE2KSl9YXJnVGV4dD1idWZmZXIuam9pbigiIik7d2hpbGUoYXJnVGV4dC5sZW5ndGg8YXJnU2l6ZSoyKWFyZ1RleHQ9ImYiK2FyZ1RleHR9ZWxzZXthcmdUZXh0PWN1cnJBYnNBcmcudG9TdHJpbmcoMTYpfWlmKG5leHQ9PTg4KXtwcmVmaXg9cHJlZml4LnRvVXBwZXJDYXNlKCk7YXJnVGV4dD1hcmdUZXh0LnRvVXBwZXJDYXNlKCl9fWVsc2UgaWYobmV4dD09MTEyKXtpZihjdXJyQWJzQXJnPT09MCl7YXJnVGV4dD0iKG5pbCkifWVsc2V7cHJlZml4PSIweCI7YXJnVGV4dD1jdXJyQWJzQXJnLnRvU3RyaW5nKDE2KX19aWYocHJlY2lzaW9uU2V0KXt3aGlsZShhcmdUZXh0Lmxlbmd0aDxwcmVjaXNpb24pe2FyZ1RleHQ9IjAiK2FyZ1RleHR9fWlmKGN1cnJBcmc+PTApe2lmKGZsYWdBbHdheXNTaWduZWQpe3ByZWZpeD0iKyIrcHJlZml4fWVsc2UgaWYoZmxhZ1BhZFNpZ24pe3ByZWZpeD0iICIrcHJlZml4fX1pZihhcmdUZXh0LmNoYXJBdCgwKT09Ii0iKXtwcmVmaXg9Ii0iK3ByZWZpeDthcmdUZXh0PWFyZ1RleHQuc3Vic3RyKDEpfXdoaWxlKHByZWZpeC5sZW5ndGgrYXJnVGV4dC5sZW5ndGg8d2lkdGgpe2lmKGZsYWdMZWZ0QWxpZ24pe2FyZ1RleHQrPSIgIn1lbHNle2lmKGZsYWdaZXJvUGFkKXthcmdUZXh0PSIwIithcmdUZXh0fWVsc2V7cHJlZml4PSIgIitwcmVmaXh9fX1hcmdUZXh0PXByZWZpeCthcmdUZXh0O2FyZ1RleHQuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGNocil7cmV0LnB1c2goY2hyLmNoYXJDb2RlQXQoMCkpfSkpO2JyZWFrfTtjYXNlImYiOmNhc2UiRiI6Y2FzZSJlIjpjYXNlIkUiOmNhc2UiZyI6Y2FzZSJHIjp7dmFyIGN1cnJBcmc9Z2V0TmV4dEFyZygiZG91YmxlIik7dmFyIGFyZ1RleHQ7aWYoaXNOYU4oY3VyckFyZykpe2FyZ1RleHQ9Im5hbiI7ZmxhZ1plcm9QYWQ9ZmFsc2V9ZWxzZSBpZighaXNGaW5pdGUoY3VyckFyZykpe2FyZ1RleHQ9KGN1cnJBcmc8MD8iLSI6IiIpKyJpbmYiO2ZsYWdaZXJvUGFkPWZhbHNlfWVsc2V7dmFyIGlzR2VuZXJhbD1mYWxzZTt2YXIgZWZmZWN0aXZlUHJlY2lzaW9uPU1hdGgubWluKHByZWNpc2lvbiwyMCk7aWYobmV4dD09MTAzfHxuZXh0PT03MSl7aXNHZW5lcmFsPXRydWU7cHJlY2lzaW9uPXByZWNpc2lvbnx8MTt2YXIgZXhwb25lbnQ9cGFyc2VJbnQoY3VyckFyZy50b0V4cG9uZW50aWFsKGVmZmVjdGl2ZVByZWNpc2lvbikuc3BsaXQoImUiKVsxXSwxMCk7aWYocHJlY2lzaW9uPmV4cG9uZW50JiZleHBvbmVudD49LTQpe25leHQ9KG5leHQ9PTEwMz8iZiI6IkYiKS5jaGFyQ29kZUF0KDApO3ByZWNpc2lvbi09ZXhwb25lbnQrMX1lbHNle25leHQ9KG5leHQ9PTEwMz8iZSI6IkUiKS5jaGFyQ29kZUF0KDApO3ByZWNpc2lvbi0tfWVmZmVjdGl2ZVByZWNpc2lvbj1NYXRoLm1pbihwcmVjaXNpb24sMjApfWlmKG5leHQ9PTEwMXx8bmV4dD09Njkpe2FyZ1RleHQ9Y3VyckFyZy50b0V4cG9uZW50aWFsKGVmZmVjdGl2ZVByZWNpc2lvbik7aWYoL1tlRV1bLStdXGQkLy50ZXN0KGFyZ1RleHQpKXthcmdUZXh0PWFyZ1RleHQuc2xpY2UoMCwtMSkrIjAiK2FyZ1RleHQuc2xpY2UoLTEpfX1lbHNlIGlmKG5leHQ9PTEwMnx8bmV4dD09NzApe2FyZ1RleHQ9Y3VyckFyZy50b0ZpeGVkKGVmZmVjdGl2ZVByZWNpc2lvbik7aWYoY3VyckFyZz09PTAmJl9fcmVhbGx5TmVnYXRpdmUoY3VyckFyZykpe2FyZ1RleHQ9Ii0iK2FyZ1RleHR9fXZhciBwYXJ0cz1hcmdUZXh0LnNwbGl0KCJlIik7aWYoaXNHZW5lcmFsJiYhZmxhZ0FsdGVybmF0aXZlKXt3aGlsZShwYXJ0c1swXS5sZW5ndGg+MSYmcGFydHNbMF0uaW5kZXhPZigiLiIpIT0tMSYmKHBhcnRzWzBdLnNsaWNlKC0xKT09IjAifHxwYXJ0c1swXS5zbGljZSgtMSk9PSIuIikpe3BhcnRzWzBdPXBhcnRzWzBdLnNsaWNlKDAsLTEpfX1lbHNle2lmKGZsYWdBbHRlcm5hdGl2ZSYmYXJnVGV4dC5pbmRleE9mKCIuIik9PS0xKXBhcnRzWzBdKz0iLiI7d2hpbGUocHJlY2lzaW9uPmVmZmVjdGl2ZVByZWNpc2lvbisrKXBhcnRzWzBdKz0iMCJ9YXJnVGV4dD1wYXJ0c1swXSsocGFydHMubGVuZ3RoPjE/ImUiK3BhcnRzWzFdOiIiKTtpZihuZXh0PT02OSlhcmdUZXh0PWFyZ1RleHQudG9VcHBlckNhc2UoKTtpZihjdXJyQXJnPj0wKXtpZihmbGFnQWx3YXlzU2lnbmVkKXthcmdUZXh0PSIrIithcmdUZXh0fWVsc2UgaWYoZmxhZ1BhZFNpZ24pe2FyZ1RleHQ9IiAiK2FyZ1RleHR9fX13aGlsZShhcmdUZXh0Lmxlbmd0aDx3aWR0aCl7aWYoZmxhZ0xlZnRBbGlnbil7YXJnVGV4dCs9IiAifWVsc2V7aWYoZmxhZ1plcm9QYWQmJihhcmdUZXh0WzBdPT0iLSJ8fGFyZ1RleHRbMF09PSIrIikpe2FyZ1RleHQ9YXJnVGV4dFswXSsiMCIrYXJnVGV4dC5zbGljZSgxKX1lbHNle2FyZ1RleHQ9KGZsYWdaZXJvUGFkPyIwIjoiICIpK2FyZ1RleHR9fX1pZihuZXh0PDk3KWFyZ1RleHQ9YXJnVGV4dC50b1VwcGVyQ2FzZSgpO2FyZ1RleHQuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGNocil7cmV0LnB1c2goY2hyLmNoYXJDb2RlQXQoMCkpfSkpO2JyZWFrfTtjYXNlInMiOnt2YXIgYXJnPWdldE5leHRBcmcoImk4KiIpO3ZhciBhcmdMZW5ndGg9YXJnP19zdHJsZW4oYXJnKToiKG51bGwpIi5sZW5ndGg7aWYocHJlY2lzaW9uU2V0KWFyZ0xlbmd0aD1NYXRoLm1pbihhcmdMZW5ndGgscHJlY2lzaW9uKTtpZighZmxhZ0xlZnRBbGlnbil7d2hpbGUoYXJnTGVuZ3RoPHdpZHRoLS0pe3JldC5wdXNoKDMyKX19aWYoYXJnKXtmb3IodmFyIGk9MDtpPGFyZ0xlbmd0aDtpKyspe3JldC5wdXNoKEhFQVBVOFthcmcrKz4+MF0pfX1lbHNle3JldD1yZXQuY29uY2F0KGludEFycmF5RnJvbVN0cmluZygiKG51bGwpIi5zdWJzdHIoMCxhcmdMZW5ndGgpLHRydWUpKX1pZihmbGFnTGVmdEFsaWduKXt3aGlsZShhcmdMZW5ndGg8d2lkdGgtLSl7cmV0LnB1c2goMzIpfX1icmVha307Y2FzZSJjIjp7aWYoZmxhZ0xlZnRBbGlnbilyZXQucHVzaChnZXROZXh0QXJnKCJpOCIpKTt3aGlsZSgtLXdpZHRoPjApe3JldC5wdXNoKDMyKX1pZighZmxhZ0xlZnRBbGlnbilyZXQucHVzaChnZXROZXh0QXJnKCJpOCIpKTticmVha307Y2FzZSJuIjp7dmFyIHB0cj1nZXROZXh0QXJnKCJpMzIqIik7SEVBUDMyW3B0cj4+Ml09cmV0Lmxlbmd0aDticmVha307Y2FzZSIlIjp7cmV0LnB1c2goY3Vycik7YnJlYWt9O2RlZmF1bHQ6e2Zvcih2YXIgaT1zdGFydFRleHRJbmRleDtpPHRleHRJbmRleCsyO2krKyl7cmV0LnB1c2goSEVBUDhbaT4+MF0pfX19dGV4dEluZGV4Kz0yfWVsc2V7cmV0LnB1c2goY3Vycik7dGV4dEluZGV4Kz0xfX1yZXR1cm4gcmV0fWZ1bmN0aW9uIF9tYWxsb2MoYnl0ZXMpe3ZhciBwdHI9UnVudGltZS5keW5hbWljQWxsb2MoYnl0ZXMrOCk7cmV0dXJuIHB0cis4JjQyOTQ5NjcyODh9TW9kdWxlWyJfbWFsbG9jIl09X21hbGxvYztmdW5jdGlvbiBfc25wcmludGYocyxuLGZvcm1hdCx2YXJhcmdzKXt2YXIgcmVzdWx0PV9fZm9ybWF0U3RyaW5nKGZvcm1hdCx2YXJhcmdzKTt2YXIgbGltaXQ9bj09PXVuZGVmaW5lZD9yZXN1bHQubGVuZ3RoOk1hdGgubWluKHJlc3VsdC5sZW5ndGgsTWF0aC5tYXgobi0xLDApKTtpZihzPDApe3M9LXM7dmFyIGJ1Zj1fbWFsbG9jKGxpbWl0KzEpO0hFQVAzMltzPj4yXT1idWY7cz1idWZ9Zm9yKHZhciBpPTA7aTxsaW1pdDtpKyspe0hFQVA4W3MraT4+MF09cmVzdWx0W2ldfWlmKGxpbWl0PG58fG49PT11bmRlZmluZWQpSEVBUDhbcytpPj4wXT0wO3JldHVybiByZXN1bHQubGVuZ3RofWZ1bmN0aW9uIF9ta3BvcnQoKXt0aHJvdyJUT0RPIn12YXIgU09DS0ZTPXttb3VudDooZnVuY3Rpb24obW91bnQpe3JldHVybiBGUy5jcmVhdGVOb2RlKG51bGwsIi8iLDE2Mzg0fDUxMSwwKX0pLGNyZWF0ZVNvY2tldDooZnVuY3Rpb24oZmFtaWx5LHR5cGUscHJvdG9jb2wpe3ZhciBzdHJlYW1pbmc9dHlwZT09MTtpZihwcm90b2NvbCl7YXNzZXJ0KHN0cmVhbWluZz09KHByb3RvY29sPT02KSl9dmFyIHNvY2s9e2ZhbWlseTpmYW1pbHksdHlwZTp0eXBlLHByb3RvY29sOnByb3RvY29sLHNlcnZlcjpudWxsLHBlZXJzOnt9LHBlbmRpbmc6W10scmVjdl9xdWV1ZTpbXSxzb2NrX29wczpTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzfTt2YXIgbmFtZT1TT0NLRlMubmV4dG5hbWUoKTt2YXIgbm9kZT1GUy5jcmVhdGVOb2RlKFNPQ0tGUy5yb290LG5hbWUsNDkxNTIsMCk7bm9kZS5zb2NrPXNvY2s7dmFyIHN0cmVhbT1GUy5jcmVhdGVTdHJlYW0oe3BhdGg6bmFtZSxub2RlOm5vZGUsZmxhZ3M6RlMubW9kZVN0cmluZ1RvRmxhZ3MoInIrIiksc2Vla2FibGU6ZmFsc2Usc3RyZWFtX29wczpTT0NLRlMuc3RyZWFtX29wc30pO3NvY2suc3RyZWFtPXN0cmVhbTtyZXR1cm4gc29ja30pLGdldFNvY2tldDooZnVuY3Rpb24oZmQpe3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKGZkKTtpZighc3RyZWFtfHwhRlMuaXNTb2NrZXQoc3RyZWFtLm5vZGUubW9kZSkpe3JldHVybiBudWxsfXJldHVybiBzdHJlYW0ubm9kZS5zb2NrfSksc3RyZWFtX29wczp7cG9sbDooZnVuY3Rpb24oc3RyZWFtKXt2YXIgc29jaz1zdHJlYW0ubm9kZS5zb2NrO3JldHVybiBzb2NrLnNvY2tfb3BzLnBvbGwoc29jayl9KSxpb2N0bDooZnVuY3Rpb24oc3RyZWFtLHJlcXVlc3QsdmFyYXJncyl7dmFyIHNvY2s9c3RyZWFtLm5vZGUuc29jaztyZXR1cm4gc29jay5zb2NrX29wcy5pb2N0bChzb2NrLHJlcXVlc3QsdmFyYXJncyl9KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBzb2NrPXN0cmVhbS5ub2RlLnNvY2s7dmFyIG1zZz1zb2NrLnNvY2tfb3BzLnJlY3Ztc2coc29jayxsZW5ndGgpO2lmKCFtc2cpe3JldHVybiAwfWJ1ZmZlci5zZXQobXNnLmJ1ZmZlcixvZmZzZXQpO3JldHVybiBtc2cuYnVmZmVyLmxlbmd0aH0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBzb2NrPXN0cmVhbS5ub2RlLnNvY2s7cmV0dXJuIHNvY2suc29ja19vcHMuc2VuZG1zZyhzb2NrLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoKX0pLGNsb3NlOihmdW5jdGlvbihzdHJlYW0pe3ZhciBzb2NrPXN0cmVhbS5ub2RlLnNvY2s7c29jay5zb2NrX29wcy5jbG9zZShzb2NrKX0pfSxuZXh0bmFtZTooZnVuY3Rpb24oKXtpZighU09DS0ZTLm5leHRuYW1lLmN1cnJlbnQpe1NPQ0tGUy5uZXh0bmFtZS5jdXJyZW50PTB9cmV0dXJuInNvY2tldFsiK1NPQ0tGUy5uZXh0bmFtZS5jdXJyZW50KysgKyJdIn0pLHdlYnNvY2tldF9zb2NrX29wczp7Y3JlYXRlUGVlcjooZnVuY3Rpb24oc29jayxhZGRyLHBvcnQpe3ZhciB3cztpZih0eXBlb2YgYWRkcj09PSJvYmplY3QiKXt3cz1hZGRyO2FkZHI9bnVsbDtwb3J0PW51bGx9aWYod3Mpe2lmKHdzLl9zb2NrZXQpe2FkZHI9d3MuX3NvY2tldC5yZW1vdGVBZGRyZXNzO3BvcnQ9d3MuX3NvY2tldC5yZW1vdGVQb3J0fWVsc2V7dmFyIHJlc3VsdD0vd3Nbc10/OlwvXC8oW146XSspOihcZCspLy5leGVjKHdzLnVybCk7aWYoIXJlc3VsdCl7dGhyb3cgbmV3IEVycm9yKCJXZWJTb2NrZXQgVVJMIG11c3QgYmUgaW4gdGhlIGZvcm1hdCB3cyhzKTovL2FkZHJlc3M6cG9ydCIpfWFkZHI9cmVzdWx0WzFdO3BvcnQ9cGFyc2VJbnQocmVzdWx0WzJdLDEwKX19ZWxzZXt0cnl7dmFyIHJ1bnRpbWVDb25maWc9TW9kdWxlWyJ3ZWJzb2NrZXQiXSYmIm9iamVjdCI9PT10eXBlb2YgTW9kdWxlWyJ3ZWJzb2NrZXQiXTt2YXIgdXJsPSJ3czojIi5yZXBsYWNlKCIjIiwiLy8iKTtpZihydW50aW1lQ29uZmlnKXtpZigic3RyaW5nIj09PXR5cGVvZiBNb2R1bGVbIndlYnNvY2tldCJdWyJ1cmwiXSl7dXJsPU1vZHVsZVsid2Vic29ja2V0Il1bInVybCJdfX1pZih1cmw9PT0id3M6Ly8ifHx1cmw9PT0id3NzOi8vIil7dXJsPXVybCthZGRyKyI6Iitwb3J0fXZhciBzdWJQcm90b2NvbHM9ImJpbmFyeSI7aWYocnVudGltZUNvbmZpZyl7aWYoInN0cmluZyI9PT10eXBlb2YgTW9kdWxlWyJ3ZWJzb2NrZXQiXVsic3VicHJvdG9jb2wiXSl7c3ViUHJvdG9jb2xzPU1vZHVsZVsid2Vic29ja2V0Il1bInN1YnByb3RvY29sIl19fXN1YlByb3RvY29scz1zdWJQcm90b2NvbHMucmVwbGFjZSgvXiArfCArJC9nLCIiKS5zcGxpdCgvICosICovKTt2YXIgb3B0cz1FTlZJUk9OTUVOVF9JU19OT0RFP3sicHJvdG9jb2wiOnN1YlByb3RvY29scy50b1N0cmluZygpfTpzdWJQcm90b2NvbHM7dmFyIFdlYlNvY2tldD1FTlZJUk9OTUVOVF9JU19OT0RFP3JlcXVpcmUoIndzIik6d2luZG93WyJXZWJTb2NrZXQiXTt3cz1uZXcgV2ViU29ja2V0KHVybCxvcHRzKTt3cy5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciJ9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUhPU1RVTlJFQUNIKX19dmFyIHBlZXI9e2FkZHI6YWRkcixwb3J0OnBvcnQsc29ja2V0OndzLGRncmFtX3NlbmRfcXVldWU6W119O1NPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuYWRkUGVlcihzb2NrLHBlZXIpO1NPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuaGFuZGxlUGVlckV2ZW50cyhzb2NrLHBlZXIpO2lmKHNvY2sudHlwZT09PTImJnR5cGVvZiBzb2NrLnNwb3J0IT09InVuZGVmaW5lZCIpe3BlZXIuZGdyYW1fc2VuZF9xdWV1ZS5wdXNoKG5ldyBVaW50OEFycmF5KFsyNTUsMjU1LDI1NSwyNTUsInAiLmNoYXJDb2RlQXQoMCksIm8iLmNoYXJDb2RlQXQoMCksInIiLmNoYXJDb2RlQXQoMCksInQiLmNoYXJDb2RlQXQoMCksKHNvY2suc3BvcnQmNjUyODApPj44LHNvY2suc3BvcnQmMjU1XSkpfXJldHVybiBwZWVyfSksZ2V0UGVlcjooZnVuY3Rpb24oc29jayxhZGRyLHBvcnQpe3JldHVybiBzb2NrLnBlZXJzW2FkZHIrIjoiK3BvcnRdfSksYWRkUGVlcjooZnVuY3Rpb24oc29jayxwZWVyKXtzb2NrLnBlZXJzW3BlZXIuYWRkcisiOiIrcGVlci5wb3J0XT1wZWVyfSkscmVtb3ZlUGVlcjooZnVuY3Rpb24oc29jayxwZWVyKXtkZWxldGUgc29jay5wZWVyc1twZWVyLmFkZHIrIjoiK3BlZXIucG9ydF19KSxoYW5kbGVQZWVyRXZlbnRzOihmdW5jdGlvbihzb2NrLHBlZXIpe3ZhciBmaXJzdD10cnVlO3ZhciBoYW5kbGVPcGVuPShmdW5jdGlvbigpe3RyeXt2YXIgcXVldWVkPXBlZXIuZGdyYW1fc2VuZF9xdWV1ZS5zaGlmdCgpO3doaWxlKHF1ZXVlZCl7cGVlci5zb2NrZXQuc2VuZChxdWV1ZWQpO3F1ZXVlZD1wZWVyLmRncmFtX3NlbmRfcXVldWUuc2hpZnQoKX19Y2F0Y2goZSl7cGVlci5zb2NrZXQuY2xvc2UoKX19KTtmdW5jdGlvbiBoYW5kbGVNZXNzYWdlKGRhdGEpe2Fzc2VydCh0eXBlb2YgZGF0YSE9PSJzdHJpbmciJiZkYXRhLmJ5dGVMZW5ndGghPT11bmRlZmluZWQpO2RhdGE9bmV3IFVpbnQ4QXJyYXkoZGF0YSk7dmFyIHdhc2ZpcnN0PWZpcnN0O2ZpcnN0PWZhbHNlO2lmKHdhc2ZpcnN0JiZkYXRhLmxlbmd0aD09PTEwJiZkYXRhWzBdPT09MjU1JiZkYXRhWzFdPT09MjU1JiZkYXRhWzJdPT09MjU1JiZkYXRhWzNdPT09MjU1JiZkYXRhWzRdPT09InAiLmNoYXJDb2RlQXQoMCkmJmRhdGFbNV09PT0ibyIuY2hhckNvZGVBdCgwKSYmZGF0YVs2XT09PSJyIi5jaGFyQ29kZUF0KDApJiZkYXRhWzddPT09InQiLmNoYXJDb2RlQXQoMCkpe3ZhciBuZXdwb3J0PWRhdGFbOF08PDh8ZGF0YVs5XTtTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLnJlbW92ZVBlZXIoc29jayxwZWVyKTtwZWVyLnBvcnQ9bmV3cG9ydDtTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmFkZFBlZXIoc29jayxwZWVyKTtyZXR1cm59c29jay5yZWN2X3F1ZXVlLnB1c2goe2FkZHI6cGVlci5hZGRyLHBvcnQ6cGVlci5wb3J0LGRhdGE6ZGF0YX0pfWlmKEVOVklST05NRU5UX0lTX05PREUpe3BlZXIuc29ja2V0Lm9uKCJvcGVuIixoYW5kbGVPcGVuKTtwZWVyLnNvY2tldC5vbigibWVzc2FnZSIsKGZ1bmN0aW9uKGRhdGEsZmxhZ3Mpe2lmKCFmbGFncy5iaW5hcnkpe3JldHVybn1oYW5kbGVNZXNzYWdlKChuZXcgVWludDhBcnJheShkYXRhKSkuYnVmZmVyKX0pKTtwZWVyLnNvY2tldC5vbigiZXJyb3IiLChmdW5jdGlvbigpe30pKX1lbHNle3BlZXIuc29ja2V0Lm9ub3Blbj1oYW5kbGVPcGVuO3BlZXIuc29ja2V0Lm9ubWVzc2FnZT1mdW5jdGlvbiBwZWVyX3NvY2tldF9vbm1lc3NhZ2UoZXZlbnQpe2hhbmRsZU1lc3NhZ2UoZXZlbnQuZGF0YSl9fX0pLHBvbGw6KGZ1bmN0aW9uKHNvY2spe2lmKHNvY2sudHlwZT09PTEmJnNvY2suc2VydmVyKXtyZXR1cm4gc29jay5wZW5kaW5nLmxlbmd0aD82NHwxOjB9dmFyIG1hc2s9MDt2YXIgZGVzdD1zb2NrLnR5cGU9PT0xP1NPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuZ2V0UGVlcihzb2NrLHNvY2suZGFkZHIsc29jay5kcG9ydCk6bnVsbDtpZihzb2NrLnJlY3ZfcXVldWUubGVuZ3RofHwhZGVzdHx8ZGVzdCYmZGVzdC5zb2NrZXQucmVhZHlTdGF0ZT09PWRlc3Quc29ja2V0LkNMT1NJTkd8fGRlc3QmJmRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TRUQpe21hc2t8PTY0fDF9aWYoIWRlc3R8fGRlc3QmJmRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5PUEVOKXttYXNrfD00fWlmKGRlc3QmJmRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TSU5HfHxkZXN0JiZkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ0xPU0VEKXttYXNrfD0xNn1yZXR1cm4gbWFza30pLGlvY3RsOihmdW5jdGlvbihzb2NrLHJlcXVlc3QsYXJnKXtzd2l0Y2gocmVxdWVzdCl7Y2FzZSAyMTUzMTp2YXIgYnl0ZXM9MDtpZihzb2NrLnJlY3ZfcXVldWUubGVuZ3RoKXtieXRlcz1zb2NrLnJlY3ZfcXVldWVbMF0uZGF0YS5sZW5ndGh9SEVBUDMyW2FyZz4+Ml09Ynl0ZXM7cmV0dXJuIDA7ZGVmYXVsdDpyZXR1cm4gRVJSTk9fQ09ERVMuRUlOVkFMfX0pLGNsb3NlOihmdW5jdGlvbihzb2NrKXtpZihzb2NrLnNlcnZlcil7dHJ5e3NvY2suc2VydmVyLmNsb3NlKCl9Y2F0Y2goZSl7fXNvY2suc2VydmVyPW51bGx9dmFyIHBlZXJzPU9iamVjdC5rZXlzKHNvY2sucGVlcnMpO2Zvcih2YXIgaT0wO2k8cGVlcnMubGVuZ3RoO2krKyl7dmFyIHBlZXI9c29jay5wZWVyc1twZWVyc1tpXV07dHJ5e3BlZXIuc29ja2V0LmNsb3NlKCl9Y2F0Y2goZSl7fVNPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMucmVtb3ZlUGVlcihzb2NrLHBlZXIpfXJldHVybiAwfSksYmluZDooZnVuY3Rpb24oc29jayxhZGRyLHBvcnQpe2lmKHR5cGVvZiBzb2NrLnNhZGRyIT09InVuZGVmaW5lZCJ8fHR5cGVvZiBzb2NrLnNwb3J0IT09InVuZGVmaW5lZCIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9c29jay5zYWRkcj1hZGRyO3NvY2suc3BvcnQ9cG9ydHx8X21rcG9ydCgpO2lmKHNvY2sudHlwZT09PTIpe2lmKHNvY2suc2VydmVyKXtzb2NrLnNlcnZlci5jbG9zZSgpO3NvY2suc2VydmVyPW51bGx9dHJ5e3NvY2suc29ja19vcHMubGlzdGVuKHNvY2ssMCl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpdGhyb3cgZTtpZihlLmVycm5vIT09RVJSTk9fQ09ERVMuRU9QTk9UU1VQUCl0aHJvdyBlfX19KSxjb25uZWN0OihmdW5jdGlvbihzb2NrLGFkZHIscG9ydCl7aWYoc29jay5zZXJ2ZXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPRFMuRU9QTk9UU1VQUCl9aWYodHlwZW9mIHNvY2suZGFkZHIhPT0idW5kZWZpbmVkIiYmdHlwZW9mIHNvY2suZHBvcnQhPT0idW5kZWZpbmVkIil7dmFyIGRlc3Q9U09DS0ZTLndlYnNvY2tldF9zb2NrX29wcy5nZXRQZWVyKHNvY2ssc29jay5kYWRkcixzb2NrLmRwb3J0KTtpZihkZXN0KXtpZihkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ09OTkVDVElORyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFMUkVBRFkpfWVsc2V7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTQ09OTil9fX12YXIgcGVlcj1TT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmNyZWF0ZVBlZXIoc29jayxhZGRyLHBvcnQpO3NvY2suZGFkZHI9cGVlci5hZGRyO3NvY2suZHBvcnQ9cGVlci5wb3J0O3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlBST0dSRVNTKX0pLGxpc3RlbjooZnVuY3Rpb24oc29jayxiYWNrbG9nKXtpZighRU5WSVJPTk1FTlRfSVNfTk9ERSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU9QTk9UU1VQUCl9aWYoc29jay5zZXJ2ZXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIFdlYlNvY2tldFNlcnZlcj1yZXF1aXJlKCJ3cyIpLlNlcnZlcjt2YXIgaG9zdD1zb2NrLnNhZGRyO3NvY2suc2VydmVyPW5ldyBXZWJTb2NrZXRTZXJ2ZXIoe2hvc3Q6aG9zdCxwb3J0OnNvY2suc3BvcnR9KTtzb2NrLnNlcnZlci5vbigiY29ubmVjdGlvbiIsKGZ1bmN0aW9uKHdzKXtpZihzb2NrLnR5cGU9PT0xKXt2YXIgbmV3c29jaz1TT0NLRlMuY3JlYXRlU29ja2V0KHNvY2suZmFtaWx5LHNvY2sudHlwZSxzb2NrLnByb3RvY29sKTt2YXIgcGVlcj1TT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmNyZWF0ZVBlZXIobmV3c29jayx3cyk7bmV3c29jay5kYWRkcj1wZWVyLmFkZHI7bmV3c29jay5kcG9ydD1wZWVyLnBvcnQ7c29jay5wZW5kaW5nLnB1c2gobmV3c29jayl9ZWxzZXtTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmNyZWF0ZVBlZXIoc29jayx3cyl9fSkpO3NvY2suc2VydmVyLm9uKCJjbG9zZWQiLChmdW5jdGlvbigpe3NvY2suc2VydmVyPW51bGx9KSk7c29jay5zZXJ2ZXIub24oImVycm9yIiwoZnVuY3Rpb24oKXt9KSl9KSxhY2NlcHQ6KGZ1bmN0aW9uKGxpc3RlbnNvY2spe2lmKCFsaXN0ZW5zb2NrLnNlcnZlcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbmV3c29jaz1saXN0ZW5zb2NrLnBlbmRpbmcuc2hpZnQoKTtuZXdzb2NrLnN0cmVhbS5mbGFncz1saXN0ZW5zb2NrLnN0cmVhbS5mbGFncztyZXR1cm4gbmV3c29ja30pLGdldG5hbWU6KGZ1bmN0aW9uKHNvY2sscGVlcil7dmFyIGFkZHIscG9ydDtpZihwZWVyKXtpZihzb2NrLmRhZGRyPT09dW5kZWZpbmVkfHxzb2NrLmRwb3J0PT09dW5kZWZpbmVkKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9UQ09OTil9YWRkcj1zb2NrLmRhZGRyO3BvcnQ9c29jay5kcG9ydH1lbHNle2FkZHI9c29jay5zYWRkcnx8MDtwb3J0PXNvY2suc3BvcnR8fDB9cmV0dXJue2FkZHI6YWRkcixwb3J0OnBvcnR9fSksc2VuZG1zZzooZnVuY3Rpb24oc29jayxidWZmZXIsb2Zmc2V0LGxlbmd0aCxhZGRyLHBvcnQpe2lmKHNvY2sudHlwZT09PTIpe2lmKGFkZHI9PT11bmRlZmluZWR8fHBvcnQ9PT11bmRlZmluZWQpe2FkZHI9c29jay5kYWRkcjtwb3J0PXNvY2suZHBvcnR9aWYoYWRkcj09PXVuZGVmaW5lZHx8cG9ydD09PXVuZGVmaW5lZCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRURFU1RBRERSUkVRKX19ZWxzZXthZGRyPXNvY2suZGFkZHI7cG9ydD1zb2NrLmRwb3J0fXZhciBkZXN0PVNPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuZ2V0UGVlcihzb2NrLGFkZHIscG9ydCk7aWYoc29jay50eXBlPT09MSl7aWYoIWRlc3R8fGRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TSU5HfHxkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ0xPU0VEKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9UQ09OTil9ZWxzZSBpZihkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ09OTkVDVElORyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX19dmFyIGRhdGE7aWYoYnVmZmVyIGluc3RhbmNlb2YgQXJyYXl8fGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXtkYXRhPWJ1ZmZlci5zbGljZShvZmZzZXQsb2Zmc2V0K2xlbmd0aCl9ZWxzZXtkYXRhPWJ1ZmZlci5idWZmZXIuc2xpY2UoYnVmZmVyLmJ5dGVPZmZzZXQrb2Zmc2V0LGJ1ZmZlci5ieXRlT2Zmc2V0K29mZnNldCtsZW5ndGgpfWlmKHNvY2sudHlwZT09PTIpe2lmKCFkZXN0fHxkZXN0LnNvY2tldC5yZWFkeVN0YXRlIT09ZGVzdC5zb2NrZXQuT1BFTil7aWYoIWRlc3R8fGRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TSU5HfHxkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ0xPU0VEKXtkZXN0PVNPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuY3JlYXRlUGVlcihzb2NrLGFkZHIscG9ydCl9ZGVzdC5kZ3JhbV9zZW5kX3F1ZXVlLnB1c2goZGF0YSk7cmV0dXJuIGxlbmd0aH19dHJ5e2Rlc3Quc29ja2V0LnNlbmQoZGF0YSk7cmV0dXJuIGxlbmd0aH1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfX0pLHJlY3Ztc2c6KGZ1bmN0aW9uKHNvY2ssbGVuZ3RoKXtpZihzb2NrLnR5cGU9PT0xJiZzb2NrLnNlcnZlcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVENPTk4pfXZhciBxdWV1ZWQ9c29jay5yZWN2X3F1ZXVlLnNoaWZ0KCk7aWYoIXF1ZXVlZCl7aWYoc29jay50eXBlPT09MSl7dmFyIGRlc3Q9U09DS0ZTLndlYnNvY2tldF9zb2NrX29wcy5nZXRQZWVyKHNvY2ssc29jay5kYWRkcixzb2NrLmRwb3J0KTtpZighZGVzdCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVENPTk4pfWVsc2UgaWYoZGVzdC5zb2NrZXQucmVhZHlTdGF0ZT09PWRlc3Quc29ja2V0LkNMT1NJTkd8fGRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TRUQpe3JldHVybiBudWxsfWVsc2V7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX19ZWxzZXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUdBSU4pfX12YXIgcXVldWVkTGVuZ3RoPXF1ZXVlZC5kYXRhLmJ5dGVMZW5ndGh8fHF1ZXVlZC5kYXRhLmxlbmd0aDt2YXIgcXVldWVkT2Zmc2V0PXF1ZXVlZC5kYXRhLmJ5dGVPZmZzZXR8fDA7dmFyIHF1ZXVlZEJ1ZmZlcj1xdWV1ZWQuZGF0YS5idWZmZXJ8fHF1ZXVlZC5kYXRhO3ZhciBieXRlc1JlYWQ9TWF0aC5taW4obGVuZ3RoLHF1ZXVlZExlbmd0aCk7dmFyIHJlcz17YnVmZmVyOm5ldyBVaW50OEFycmF5KHF1ZXVlZEJ1ZmZlcixxdWV1ZWRPZmZzZXQsYnl0ZXNSZWFkKSxhZGRyOnF1ZXVlZC5hZGRyLHBvcnQ6cXVldWVkLnBvcnR9O2lmKHNvY2sudHlwZT09PTEmJmJ5dGVzUmVhZDxxdWV1ZWRMZW5ndGgpe3ZhciBieXRlc1JlbWFpbmluZz1xdWV1ZWRMZW5ndGgtYnl0ZXNSZWFkO3F1ZXVlZC5kYXRhPW5ldyBVaW50OEFycmF5KHF1ZXVlZEJ1ZmZlcixxdWV1ZWRPZmZzZXQrYnl0ZXNSZWFkLGJ5dGVzUmVtYWluaW5nKTtzb2NrLnJlY3ZfcXVldWUudW5zaGlmdChxdWV1ZWQpfXJldHVybiByZXN9KX19O2Z1bmN0aW9uIF9zZW5kKGZkLGJ1ZixsZW4sZmxhZ3Mpe3ZhciBzb2NrPVNPQ0tGUy5nZXRTb2NrZXQoZmQpO2lmKCFzb2NrKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuLTF9cmV0dXJuIF93cml0ZShmZCxidWYsbGVuKX1mdW5jdGlvbiBfcHdyaXRlKGZpbGRlcyxidWYsbmJ5dGUsb2Zmc2V0KXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmaWxkZXMpO2lmKCFzdHJlYW0pe19fX3NldEVyck5vKEVSUk5PX0NPREVTLkVCQURGKTtyZXR1cm4tMX10cnl7dmFyIHNsYWI9SEVBUDg7cmV0dXJuIEZTLndyaXRlKHN0cmVhbSxzbGFiLGJ1ZixuYnl0ZSxvZmZzZXQpfWNhdGNoKGUpe0ZTLmhhbmRsZUZTRXJyb3IoZSk7cmV0dXJuLTF9fWZ1bmN0aW9uIF93cml0ZShmaWxkZXMsYnVmLG5ieXRlKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmaWxkZXMpO2lmKCFzdHJlYW0pe19fX3NldEVyck5vKEVSUk5PX0NPREVTLkVCQURGKTtyZXR1cm4tMX10cnl7dmFyIHNsYWI9SEVBUDg7cmV0dXJuIEZTLndyaXRlKHN0cmVhbSxzbGFiLGJ1ZixuYnl0ZSl9Y2F0Y2goZSl7RlMuaGFuZGxlRlNFcnJvcihlKTtyZXR1cm4tMX19ZnVuY3Rpb24gX2ZpbGVubyhzdHJlYW0pe3N0cmVhbT1GUy5nZXRTdHJlYW1Gcm9tUHRyKHN0cmVhbSk7aWYoIXN0cmVhbSlyZXR1cm4tMTtyZXR1cm4gc3RyZWFtLmZkfWZ1bmN0aW9uIF9md3JpdGUocHRyLHNpemUsbml0ZW1zLHN0cmVhbSl7dmFyIGJ5dGVzVG9Xcml0ZT1uaXRlbXMqc2l6ZTtpZihieXRlc1RvV3JpdGU9PTApcmV0dXJuIDA7dmFyIGZkPV9maWxlbm8oc3RyZWFtKTt2YXIgYnl0ZXNXcml0dGVuPV93cml0ZShmZCxwdHIsYnl0ZXNUb1dyaXRlKTtpZihieXRlc1dyaXR0ZW49PS0xKXt2YXIgc3RyZWFtT2JqPUZTLmdldFN0cmVhbUZyb21QdHIoc3RyZWFtKTtpZihzdHJlYW1PYmopc3RyZWFtT2JqLmVycm9yPXRydWU7cmV0dXJuIDB9ZWxzZXtyZXR1cm4gTWF0aC5mbG9vcihieXRlc1dyaXR0ZW4vc2l6ZSl9fWZ1bmN0aW9uIF9yZWN2KGZkLGJ1ZixsZW4sZmxhZ3Mpe3ZhciBzb2NrPVNPQ0tGUy5nZXRTb2NrZXQoZmQpO2lmKCFzb2NrKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuLTF9cmV0dXJuIF9yZWFkKGZkLGJ1ZixsZW4pfWZ1bmN0aW9uIF9wcmVhZChmaWxkZXMsYnVmLG5ieXRlLG9mZnNldCl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmlsZGVzKTtpZighc3RyZWFtKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuLTF9dHJ5e3ZhciBzbGFiPUhFQVA4O3JldHVybiBGUy5yZWFkKHN0cmVhbSxzbGFiLGJ1ZixuYnl0ZSxvZmZzZXQpfWNhdGNoKGUpe0ZTLmhhbmRsZUZTRXJyb3IoZSk7cmV0dXJuLTF9fWZ1bmN0aW9uIF9yZWFkKGZpbGRlcyxidWYsbmJ5dGUpe3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKGZpbGRlcyk7aWYoIXN0cmVhbSl7X19fc2V0RXJyTm8oRVJSTk9fQ09ERVMuRUJBREYpO3JldHVybi0xfXRyeXt2YXIgc2xhYj1IRUFQODtyZXR1cm4gRlMucmVhZChzdHJlYW0sc2xhYixidWYsbmJ5dGUpfWNhdGNoKGUpe0ZTLmhhbmRsZUZTRXJyb3IoZSk7cmV0dXJuLTF9fWZ1bmN0aW9uIF9mcmVhZChwdHIsc2l6ZSxuaXRlbXMsc3RyZWFtKXt2YXIgYnl0ZXNUb1JlYWQ9bml0ZW1zKnNpemU7aWYoYnl0ZXNUb1JlYWQ9PTApe3JldHVybiAwfXZhciBieXRlc1JlYWQ9MDt2YXIgc3RyZWFtT2JqPUZTLmdldFN0cmVhbUZyb21QdHIoc3RyZWFtKTtpZighc3RyZWFtT2JqKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuIDB9d2hpbGUoc3RyZWFtT2JqLnVuZ290dGVuLmxlbmd0aCYmYnl0ZXNUb1JlYWQ+MCl7SEVBUDhbcHRyKys+PjBdPXN0cmVhbU9iai51bmdvdHRlbi5wb3AoKTtieXRlc1RvUmVhZC0tO2J5dGVzUmVhZCsrfXZhciBlcnI9X3JlYWQoc3RyZWFtT2JqLmZkLHB0cixieXRlc1RvUmVhZCk7aWYoZXJyPT0tMSl7aWYoc3RyZWFtT2JqKXN0cmVhbU9iai5lcnJvcj10cnVlO3JldHVybiAwfWJ5dGVzUmVhZCs9ZXJyO2lmKGJ5dGVzUmVhZDxieXRlc1RvUmVhZClzdHJlYW1PYmouZW9mPXRydWU7cmV0dXJuIE1hdGguZmxvb3IoYnl0ZXNSZWFkL3NpemUpfWZ1bmN0aW9uIF9mZ2V0YyhzdHJlYW0pe3ZhciBzdHJlYW1PYmo9RlMuZ2V0U3RyZWFtRnJvbVB0cihzdHJlYW0pO2lmKCFzdHJlYW1PYmopcmV0dXJuLTE7aWYoc3RyZWFtT2JqLmVvZnx8c3RyZWFtT2JqLmVycm9yKXJldHVybi0xO3ZhciByZXQ9X2ZyZWFkKF9mZ2V0Yy5yZXQsMSwxLHN0cmVhbSk7aWYocmV0PT0wKXtyZXR1cm4tMX1lbHNlIGlmKHJldD09LTEpe3N0cmVhbU9iai5lcnJvcj10cnVlO3JldHVybi0xfWVsc2V7cmV0dXJuIEhFQVBVOFtfZmdldGMucmV0Pj4wXX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW12YWwoKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfZW12YWwiKTthYm9ydCgtMSl9ZnVuY3Rpb24gX19fZ3h4X3BlcnNvbmFsaXR5X3YwKCl7fWZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpe3N3aXRjaChuYW1lKXtjYXNlIDMwOnJldHVybiBQQUdFX1NJWkU7Y2FzZSAxMzI6Y2FzZSAxMzM6Y2FzZSAxMjpjYXNlIDEzNzpjYXNlIDEzODpjYXNlIDE1OmNhc2UgMjM1OmNhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgMTk6Y2FzZSAyMDpjYXNlIDE0OTpjYXNlIDEzOmNhc2UgMTA6Y2FzZSAyMzY6Y2FzZSAxNTM6Y2FzZSA5OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDE1OTpjYXNlIDE1NDpjYXNlIDE0OmNhc2UgNzc6Y2FzZSA3ODpjYXNlIDEzOTpjYXNlIDgwOmNhc2UgODE6Y2FzZSA3OTpjYXNlIDgyOmNhc2UgNjg6Y2FzZSA2NzpjYXNlIDE2NDpjYXNlIDExOmNhc2UgMjk6Y2FzZSA0NzpjYXNlIDQ4OmNhc2UgOTU6Y2FzZSA1MjpjYXNlIDUxOmNhc2UgNDY6cmV0dXJuIDIwMDgwOTtjYXNlIDI3OmNhc2UgMjQ2OmNhc2UgMTI3OmNhc2UgMTI4OmNhc2UgMjM6Y2FzZSAyNDpjYXNlIDE2MDpjYXNlIDE2MTpjYXNlIDE4MTpjYXNlIDE4MjpjYXNlIDI0MjpjYXNlIDE4MzpjYXNlIDE4NDpjYXNlIDI0MzpjYXNlIDI0NDpjYXNlIDI0NTpjYXNlIDE2NTpjYXNlIDE3ODpjYXNlIDE3OTpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSAxNjg6Y2FzZSAxNjk6Y2FzZSAxNzU6Y2FzZSAxNzA6Y2FzZSAxNzE6Y2FzZSAxNzI6Y2FzZSA5NzpjYXNlIDc2OmNhc2UgMzI6Y2FzZSAxNzM6Y2FzZSAzNTpyZXR1cm4tMTtjYXNlIDE3NjpjYXNlIDE3NzpjYXNlIDc6Y2FzZSAxNTU6Y2FzZSA4OmNhc2UgMTU3OmNhc2UgMTI1OmNhc2UgMTI2OmNhc2UgOTI6Y2FzZSA5MzpjYXNlIDEyOTpjYXNlIDEzMDpjYXNlIDEzMTpjYXNlIDk0OmNhc2UgOTE6cmV0dXJuIDE7Y2FzZSA3NDpjYXNlIDYwOmNhc2UgNjk6Y2FzZSA3MDpjYXNlIDQ6cmV0dXJuIDEwMjQ7Y2FzZSAzMTpjYXNlIDQyOmNhc2UgNzI6cmV0dXJuIDMyO2Nhc2UgODc6Y2FzZSAyNjpjYXNlIDMzOnJldHVybiAyMTQ3NDgzNjQ3O2Nhc2UgMzQ6Y2FzZSAxOnJldHVybiA0NzgzOTtjYXNlIDM4OmNhc2UgMzY6cmV0dXJuIDk5O2Nhc2UgNDM6Y2FzZSAzNzpyZXR1cm4gMjA0ODtjYXNlIDA6cmV0dXJuIDIwOTcxNTI7Y2FzZSAzOnJldHVybiA2NTUzNjtjYXNlIDI4OnJldHVybiAzMjc2ODtjYXNlIDQ0OnJldHVybiAzMjc2NztjYXNlIDc1OnJldHVybiAxNjM4NDtjYXNlIDM5OnJldHVybiAxZTM7Y2FzZSA4OTpyZXR1cm4gNzAwO2Nhc2UgNzE6cmV0dXJuIDI1NjtjYXNlIDQwOnJldHVybiAyNTU7Y2FzZSAyOnJldHVybiAxMDA7Y2FzZSAxODA6cmV0dXJuIDY0O2Nhc2UgMjU6cmV0dXJuIDIwO2Nhc2UgNTpyZXR1cm4gMTY7Y2FzZSA2OnJldHVybiA2O2Nhc2UgNzM6cmV0dXJuIDQ7Y2FzZSA4NDpyZXR1cm4gMX1fX19zZXRFcnJObyhFUlJOT19DT0RFUy5FSU5WQUwpO3JldHVybi0xfU1vZHVsZVsiX2JpdHNoaWZ0NjRMc2hyIl09X2JpdHNoaWZ0NjRMc2hyO2Z1bmN0aW9uIF9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCl7cmV0dXJuIDB9ZnVuY3Rpb24gX19leGl0KHN0YXR1cyl7TW9kdWxlWyJleGl0Il0oc3RhdHVzKX1mdW5jdGlvbiBfZXhpdChzdGF0dXMpe19fZXhpdChzdGF0dXMpfWZ1bmN0aW9uIF9fWlN0OXRlcm1pbmF0ZXYoKXtfZXhpdCgtMTIzNCl9ZnVuY3Rpb24gX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCl7fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCxzcmMsbnVtKXtIRUFQVTguc2V0KEhFQVBVOC5zdWJhcnJheShzcmMsc3JjK251bSksZGVzdCk7cmV0dXJuIGRlc3R9TW9kdWxlWyJfbWVtY3B5Il09X21lbWNweTtmdW5jdGlvbiBfc2JyayhieXRlcyl7dmFyIHNlbGY9X3Nicms7aWYoIXNlbGYuY2FsbGVkKXtEWU5BTUlDVE9QPWFsaWduTWVtb3J5UGFnZShEWU5BTUlDVE9QKTtzZWxmLmNhbGxlZD10cnVlO2Fzc2VydChSdW50aW1lLmR5bmFtaWNBbGxvYyk7c2VsZi5hbGxvYz1SdW50aW1lLmR5bmFtaWNBbGxvYztSdW50aW1lLmR5bmFtaWNBbGxvYz0oZnVuY3Rpb24oKXthYm9ydCgiY2Fubm90IGR5bmFtaWNhbGx5IGFsbG9jYXRlLCBzYnJrIG5vdyBoYXMgY29udHJvbCIpfSl9dmFyIHJldD1EWU5BTUlDVE9QO2lmKGJ5dGVzIT0wKXNlbGYuYWxsb2MoYnl0ZXMpO3JldHVybiByZXR9ZnVuY3Rpb24gX25ld2xvY2FsZShtYXNrLGxvY2FsZSxiYXNlKXtyZXR1cm4gX21hbGxvYyg0KX1Nb2R1bGVbIl9tZW1tb3ZlIl09X21lbW1vdmU7ZnVuY3Rpb24gX19fZXJybm9fbG9jYXRpb24oKXtyZXR1cm4gX19fZXJybm9fc3RhdGV9ZnVuY3Rpb24gX3N0cmVycm9yX3IoZXJybnVtLHN0cmVycmJ1ZixidWZsZW4pe2lmKGVycm51bSBpbiBFUlJOT19NRVNTQUdFUyl7aWYoRVJSTk9fTUVTU0FHRVNbZXJybnVtXS5sZW5ndGg+YnVmbGVuLTEpe3JldHVybiBfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FUkFOR0UpfWVsc2V7dmFyIG1zZz1FUlJOT19NRVNTQUdFU1tlcnJudW1dO3dyaXRlQXNjaWlUb01lbW9yeShtc2csc3RyZXJyYnVmKTtyZXR1cm4gMH19ZWxzZXtyZXR1cm4gX19fc2V0RXJyTm8oRVJSTk9fQ09ERVMuRUlOVkFMKX19ZnVuY3Rpb24gX3N0cmVycm9yKGVycm51bSl7aWYoIV9zdHJlcnJvci5idWZmZXIpX3N0cmVycm9yLmJ1ZmZlcj1fbWFsbG9jKDI1Nik7X3N0cmVycm9yX3IoZXJybnVtLF9zdHJlcnJvci5idWZmZXIsMjU2KTtyZXR1cm4gX3N0cmVycm9yLmJ1ZmZlcn1mdW5jdGlvbiBfcHRocmVhZF9tdXRleF9kZXN0cm95KCl7fWZ1bmN0aW9uIF9jYXRjbG9zZShjYXRkKXtyZXR1cm4gMH1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldygpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldyIpO2Fib3J0KC0xKX1mdW5jdGlvbiBfX19jeGFfZ3VhcmRfcmVsZWFzZSgpe31mdW5jdGlvbiBfdW5nZXRjKGMsc3RyZWFtKXtzdHJlYW09RlMuZ2V0U3RyZWFtRnJvbVB0cihzdHJlYW0pO2lmKCFzdHJlYW0pe3JldHVybi0xfWlmKGM9PT0tMSl7cmV0dXJuIGN9Yz11blNpZ24oYyYyNTUpO3N0cmVhbS51bmdvdHRlbi5wdXNoKGMpO3N0cmVhbS5lb2Y9ZmFsc2U7cmV0dXJuIGN9ZnVuY3Rpb24gX3VzZWxvY2FsZShsb2NhbGUpe3JldHVybiAwfWZ1bmN0aW9uIF92c25wcmludGYocyxuLGZvcm1hdCx2YV9hcmcpe3JldHVybiBfc25wcmludGYocyxuLGZvcm1hdCxIRUFQMzJbdmFfYXJnPj4yXSl9ZnVuY3Rpb24gX19nZXRGbG9hdCh0ZXh0KXtyZXR1cm4vXlsrLV0/WzAtOV0qXC4/WzAtOV0rKFtlRV1bKy1dP1swLTldKyk/Ly5leGVjKHRleHQpfWZ1bmN0aW9uIF9fc2NhblN0cmluZyhmb3JtYXQsZ2V0LHVuZ2V0LHZhcmFyZ3Mpe2lmKCFfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSl7X19zY2FuU3RyaW5nLndoaXRlU3BhY2U9e307X19zY2FuU3RyaW5nLndoaXRlU3BhY2VbMzJdPTE7X19zY2FuU3RyaW5nLndoaXRlU3BhY2VbOV09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxMF09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxMV09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxMl09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxM109MX1mb3JtYXQ9UG9pbnRlcl9zdHJpbmdpZnkoZm9ybWF0KTt2YXIgc29GYXI9MDtpZihmb3JtYXQuaW5kZXhPZigiJW4iKT49MCl7dmFyIF9nZXQ9Z2V0O2dldD1mdW5jdGlvbiBnZXQoKXtzb0ZhcisrO3JldHVybiBfZ2V0KCl9O3ZhciBfdW5nZXQ9dW5nZXQ7dW5nZXQ9ZnVuY3Rpb24gdW5nZXQoKXtzb0Zhci0tO3JldHVybiBfdW5nZXQoKX19dmFyIGZvcm1hdEluZGV4PTA7dmFyIGFyZ3NpPTA7dmFyIGZpZWxkcz0wO3ZhciBhcmdJbmRleD0wO3ZhciBuZXh0O21haW5Mb29wOmZvcih2YXIgZm9ybWF0SW5kZXg9MDtmb3JtYXRJbmRleDxmb3JtYXQubGVuZ3RoOyl7aWYoZm9ybWF0W2Zvcm1hdEluZGV4XT09PSIlIiYmZm9ybWF0W2Zvcm1hdEluZGV4KzFdPT0ibiIpe3ZhciBhcmdQdHI9SEVBUDMyW3ZhcmFyZ3MrYXJnSW5kZXg+PjJdO2FyZ0luZGV4Kz1SdW50aW1lLmdldEFsaWduU2l6ZSgidm9pZCoiLG51bGwsdHJ1ZSk7SEVBUDMyW2FyZ1B0cj4+Ml09c29GYXI7Zm9ybWF0SW5kZXgrPTI7Y29udGludWV9aWYoZm9ybWF0W2Zvcm1hdEluZGV4XT09PSIlIil7dmFyIG5leHRDPWZvcm1hdC5pbmRleE9mKCJjIixmb3JtYXRJbmRleCsxKTtpZihuZXh0Qz4wKXt2YXIgbWF4eD0xO2lmKG5leHRDPmZvcm1hdEluZGV4KzEpe3ZhciBzdWI9Zm9ybWF0LnN1YnN0cmluZyhmb3JtYXRJbmRleCsxLG5leHRDKTttYXh4PXBhcnNlSW50KHN1Yik7aWYobWF4eCE9c3ViKW1heHg9MH1pZihtYXh4KXt2YXIgYXJnUHRyPUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXTthcmdJbmRleCs9UnVudGltZS5nZXRBbGlnblNpemUoInZvaWQqIixudWxsLHRydWUpO2ZpZWxkcysrO2Zvcih2YXIgaT0wO2k8bWF4eDtpKyspe25leHQ9Z2V0KCk7SEVBUDhbYXJnUHRyKys+PjBdPW5leHQ7aWYobmV4dD09PTApcmV0dXJuIGk+MD9maWVsZHM6ZmllbGRzLTF9Zm9ybWF0SW5kZXgrPW5leHRDLWZvcm1hdEluZGV4KzE7Y29udGludWV9fX1pZihmb3JtYXRbZm9ybWF0SW5kZXhdPT09IiUiJiZmb3JtYXQuaW5kZXhPZigiWyIsZm9ybWF0SW5kZXgrMSk+MCl7dmFyIG1hdGNoPS9cJShbMC05XSopXFsoXF4pPyhcXT9bXlxdXSopXF0vLmV4ZWMoZm9ybWF0LnN1YnN0cmluZyhmb3JtYXRJbmRleCkpO2lmKG1hdGNoKXt2YXIgbWF4TnVtQ2hhcmFjdGVycz1wYXJzZUludChtYXRjaFsxXSl8fEluZmluaXR5O3ZhciBuZWdhdGVTY2FuTGlzdD1tYXRjaFsyXT09PSJeIjt2YXIgc2Nhbkxpc3Q9bWF0Y2hbM107dmFyIG1pZGRsZURhc2hNYXRjaDt3aGlsZShtaWRkbGVEYXNoTWF0Y2g9LyhbXlwtXSlcLShbXlwtXSkvLmV4ZWMoc2Nhbkxpc3QpKXt2YXIgcmFuZ2VTdGFydENoYXJDb2RlPW1pZGRsZURhc2hNYXRjaFsxXS5jaGFyQ29kZUF0KDApO3ZhciByYW5nZUVuZENoYXJDb2RlPW1pZGRsZURhc2hNYXRjaFsyXS5jaGFyQ29kZUF0KDApO2Zvcih2YXIgZXhwYW5kZWQ9IiI7cmFuZ2VTdGFydENoYXJDb2RlPD1yYW5nZUVuZENoYXJDb2RlO2V4cGFuZGVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJhbmdlU3RhcnRDaGFyQ29kZSsrKSk7c2Nhbkxpc3Q9c2Nhbkxpc3QucmVwbGFjZShtaWRkbGVEYXNoTWF0Y2hbMV0rIi0iK21pZGRsZURhc2hNYXRjaFsyXSxleHBhbmRlZCl9dmFyIGFyZ1B0cj1IRUFQMzJbdmFyYXJncythcmdJbmRleD4+Ml07YXJnSW5kZXgrPVJ1bnRpbWUuZ2V0QWxpZ25TaXplKCJ2b2lkKiIsbnVsbCx0cnVlKTtmaWVsZHMrKztmb3IodmFyIGk9MDtpPG1heE51bUNoYXJhY3RlcnM7aSsrKXtuZXh0PWdldCgpO2lmKG5lZ2F0ZVNjYW5MaXN0KXtpZihzY2FuTGlzdC5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpPDApe0hFQVA4W2FyZ1B0cisrPj4wXT1uZXh0fWVsc2V7dW5nZXQoKTticmVha319ZWxzZXtpZihzY2FuTGlzdC5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpPj0wKXtIRUFQOFthcmdQdHIrKz4+MF09bmV4dH1lbHNle3VuZ2V0KCk7YnJlYWt9fX1IRUFQOFthcmdQdHIrKz4+MF09MDtmb3JtYXRJbmRleCs9bWF0Y2hbMF0ubGVuZ3RoO2NvbnRpbnVlfX13aGlsZSgxKXtuZXh0PWdldCgpO2lmKG5leHQ9PTApcmV0dXJuIGZpZWxkcztpZighKG5leHQgaW4gX19zY2FuU3RyaW5nLndoaXRlU3BhY2UpKWJyZWFrfXVuZ2V0KCk7aWYoZm9ybWF0W2Zvcm1hdEluZGV4XT09PSIlIil7Zm9ybWF0SW5kZXgrKzt2YXIgc3VwcHJlc3NBc3NpZ25tZW50PWZhbHNlO2lmKGZvcm1hdFtmb3JtYXRJbmRleF09PSIqIil7c3VwcHJlc3NBc3NpZ25tZW50PXRydWU7Zm9ybWF0SW5kZXgrK312YXIgbWF4U3BlY2lmaWVyU3RhcnQ9Zm9ybWF0SW5kZXg7d2hpbGUoZm9ybWF0W2Zvcm1hdEluZGV4XS5jaGFyQ29kZUF0KDApPj00OCYmZm9ybWF0W2Zvcm1hdEluZGV4XS5jaGFyQ29kZUF0KDApPD01Nyl7Zm9ybWF0SW5kZXgrK312YXIgbWF4XztpZihmb3JtYXRJbmRleCE9bWF4U3BlY2lmaWVyU3RhcnQpe21heF89cGFyc2VJbnQoZm9ybWF0LnNsaWNlKG1heFNwZWNpZmllclN0YXJ0LGZvcm1hdEluZGV4KSwxMCl9dmFyIGxvbmdfPWZhbHNlO3ZhciBoYWxmPWZhbHNlO3ZhciBxdWFydGVyPWZhbHNlO3ZhciBsb25nTG9uZz1mYWxzZTtpZihmb3JtYXRbZm9ybWF0SW5kZXhdPT0ibCIpe2xvbmdfPXRydWU7Zm9ybWF0SW5kZXgrKztpZihmb3JtYXRbZm9ybWF0SW5kZXhdPT0ibCIpe2xvbmdMb25nPXRydWU7Zm9ybWF0SW5kZXgrK319ZWxzZSBpZihmb3JtYXRbZm9ybWF0SW5kZXhdPT0iaCIpe2hhbGY9dHJ1ZTtmb3JtYXRJbmRleCsrO2lmKGZvcm1hdFtmb3JtYXRJbmRleF09PSJoIil7cXVhcnRlcj10cnVlO2Zvcm1hdEluZGV4Kyt9fXZhciB0eXBlPWZvcm1hdFtmb3JtYXRJbmRleF07Zm9ybWF0SW5kZXgrKzt2YXIgY3Vycj0wO3ZhciBidWZmZXI9W107aWYodHlwZT09ImYifHx0eXBlPT0iZSJ8fHR5cGU9PSJnInx8dHlwZT09IkYifHx0eXBlPT0iRSJ8fHR5cGU9PSJHIil7bmV4dD1nZXQoKTt3aGlsZShuZXh0PjAmJiEobmV4dCBpbiBfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSkpe2J1ZmZlci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpO25leHQ9Z2V0KCl9dmFyIG09X19nZXRGbG9hdChidWZmZXIuam9pbigiIikpO3ZhciBsYXN0PW0/bVswXS5sZW5ndGg6MDtmb3IodmFyIGk9MDtpPGJ1ZmZlci5sZW5ndGgtbGFzdCsxO2krKyl7dW5nZXQoKX1idWZmZXIubGVuZ3RoPWxhc3R9ZWxzZXtuZXh0PWdldCgpO3ZhciBmaXJzdD10cnVlO2lmKCh0eXBlPT0ieCJ8fHR5cGU9PSJYIikmJm5leHQ9PTQ4KXt2YXIgcGVlaz1nZXQoKTtpZihwZWVrPT0xMjB8fHBlZWs9PTg4KXtuZXh0PWdldCgpfWVsc2V7dW5nZXQoKX19d2hpbGUoKGN1cnI8bWF4X3x8aXNOYU4obWF4XykpJiZuZXh0PjApe2lmKCEobmV4dCBpbiBfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSkmJih0eXBlPT0icyJ8fCh0eXBlPT09ImQifHx0eXBlPT0idSJ8fHR5cGU9PSJpIikmJihuZXh0Pj00OCYmbmV4dDw9NTd8fGZpcnN0JiZuZXh0PT00NSl8fCh0eXBlPT09IngifHx0eXBlPT09IlgiKSYmKG5leHQ+PTQ4JiZuZXh0PD01N3x8bmV4dD49OTcmJm5leHQ8PTEwMnx8bmV4dD49NjUmJm5leHQ8PTcwKSkmJihmb3JtYXRJbmRleD49Zm9ybWF0Lmxlbmd0aHx8bmV4dCE9PWZvcm1hdFtmb3JtYXRJbmRleF0uY2hhckNvZGVBdCgwKSkpe2J1ZmZlci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpO25leHQ9Z2V0KCk7Y3VycisrO2ZpcnN0PWZhbHNlfWVsc2V7YnJlYWt9fXVuZ2V0KCl9aWYoYnVmZmVyLmxlbmd0aD09PTApcmV0dXJuIDA7aWYoc3VwcHJlc3NBc3NpZ25tZW50KWNvbnRpbnVlO3ZhciB0ZXh0PWJ1ZmZlci5qb2luKCIiKTt2YXIgYXJnUHRyPUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXTthcmdJbmRleCs9UnVudGltZS5nZXRBbGlnblNpemUoInZvaWQqIixudWxsLHRydWUpO3ZhciBiYXNlPTEwO3N3aXRjaCh0eXBlKXtjYXNlIlgiOmNhc2UieCI6YmFzZT0xNjtjYXNlImQiOmNhc2UidSI6Y2FzZSJpIjppZihxdWFydGVyKXtIRUFQOFthcmdQdHI+PjBdPXBhcnNlSW50KHRleHQsYmFzZSl9ZWxzZSBpZihoYWxmKXtIRUFQMTZbYXJnUHRyPj4xXT1wYXJzZUludCh0ZXh0LGJhc2UpfWVsc2UgaWYobG9uZ0xvbmcpe3RlbXBJNjQ9W3BhcnNlSW50KHRleHQsYmFzZSk+Pj4wLCh0ZW1wRG91YmxlPXBhcnNlSW50KHRleHQsYmFzZSksK01hdGhfYWJzKHRlbXBEb3VibGUpPj0rMT90ZW1wRG91YmxlPiswPyhNYXRoX21pbigrTWF0aF9mbG9vcih0ZW1wRG91YmxlLys0Mjk0OTY3Mjk2KSwrNDI5NDk2NzI5NSl8MCk+Pj4wOn5+K01hdGhfY2VpbCgodGVtcERvdWJsZS0gKyh+fnRlbXBEb3VibGU+Pj4wKSkvKzQyOTQ5NjcyOTYpPj4+MDowKV0sSEVBUDMyW2FyZ1B0cj4+Ml09dGVtcEk2NFswXSxIRUFQMzJbYXJnUHRyKzQ+PjJdPXRlbXBJNjRbMV19ZWxzZXtIRUFQMzJbYXJnUHRyPj4yXT1wYXJzZUludCh0ZXh0LGJhc2UpfWJyZWFrO2Nhc2UiRiI6Y2FzZSJmIjpjYXNlIkUiOmNhc2UiZSI6Y2FzZSJHIjpjYXNlImciOmNhc2UiRSI6aWYobG9uZ18pe0hFQVBGNjRbYXJnUHRyPj4zXT1wYXJzZUZsb2F0KHRleHQpfWVsc2V7SEVBUEYzMlthcmdQdHI+PjJdPXBhcnNlRmxvYXQodGV4dCl9YnJlYWs7Y2FzZSJzIjp2YXIgYXJyYXk9aW50QXJyYXlGcm9tU3RyaW5nKHRleHQpO2Zvcih2YXIgaj0wO2o8YXJyYXkubGVuZ3RoO2orKyl7SEVBUDhbYXJnUHRyK2o+PjBdPWFycmF5W2pdfWJyZWFrfWZpZWxkcysrfWVsc2UgaWYoZm9ybWF0W2Zvcm1hdEluZGV4XS5jaGFyQ29kZUF0KDApaW4gX19zY2FuU3RyaW5nLndoaXRlU3BhY2Upe25leHQ9Z2V0KCk7d2hpbGUobmV4dCBpbiBfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSl7aWYobmV4dDw9MClicmVhayBtYWluTG9vcDtuZXh0PWdldCgpfXVuZ2V0KG5leHQpO2Zvcm1hdEluZGV4Kyt9ZWxzZXtuZXh0PWdldCgpO2lmKGZvcm1hdFtmb3JtYXRJbmRleF0uY2hhckNvZGVBdCgwKSE9PW5leHQpe3VuZ2V0KG5leHQpO2JyZWFrIG1haW5Mb29wfWZvcm1hdEluZGV4Kyt9fXJldHVybiBmaWVsZHN9ZnVuY3Rpb24gX3NzY2FuZihzLGZvcm1hdCx2YXJhcmdzKXt2YXIgaW5kZXg9MDtmdW5jdGlvbiBnZXQoKXtyZXR1cm4gSEVBUDhbcytpbmRleCsrPj4wXX1mdW5jdGlvbiB1bmdldCgpe2luZGV4LS19cmV0dXJuIF9fc2NhblN0cmluZyhmb3JtYXQsZ2V0LHVuZ2V0LHZhcmFyZ3MpfWZ1bmN0aW9uIF92c3NjYW5mKHMsZm9ybWF0LHZhX2FyZyl7cmV0dXJuIF9zc2NhbmYocyxmb3JtYXQsSEVBUDMyW3ZhX2FyZz4+Ml0pfWZ1bmN0aW9uIF9fX2Fzc2VydF9mYWlsKGNvbmRpdGlvbixmaWxlbmFtZSxsaW5lLGZ1bmMpe0FCT1JUPXRydWU7dGhyb3ciQXNzZXJ0aW9uIGZhaWxlZDogIitQb2ludGVyX3N0cmluZ2lmeShjb25kaXRpb24pKyIsIGF0OiAiK1tmaWxlbmFtZT9Qb2ludGVyX3N0cmluZ2lmeShmaWxlbmFtZSk6InVua25vd24gZmlsZW5hbWUiLGxpbmUsZnVuYz9Qb2ludGVyX3N0cmluZ2lmeShmdW5jKToidW5rbm93biBmdW5jdGlvbiJdKyIgYXQgIitzdGFja1RyYWNlKCl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdm9pZCgpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl92b2lkIik7YWJvcnQoLTEpfU1vZHVsZVsiX21lbXNldCJdPV9tZW1zZXQ7dmFyIF9CSXRvRD10cnVlO2Z1bmN0aW9uIF9faXNMZWFwWWVhcih5ZWFyKXtyZXR1cm4geWVhciU0PT09MCYmKHllYXIlMTAwIT09MHx8eWVhciU0MDA9PT0wKX1mdW5jdGlvbiBfX2FycmF5U3VtKGFycmF5LGluZGV4KXt2YXIgc3VtPTA7Zm9yKHZhciBpPTA7aTw9aW5kZXg7c3VtKz1hcnJheVtpKytdKTtyZXR1cm4gc3VtfXZhciBfX01PTlRIX0RBWVNfTEVBUD1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO3ZhciBfX01PTlRIX0RBWVNfUkVHVUxBUj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIF9fYWRkRGF5cyhkYXRlLGRheXMpe3ZhciBuZXdEYXRlPW5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTt3aGlsZShkYXlzPjApe3ZhciBsZWFwPV9faXNMZWFwWWVhcihuZXdEYXRlLmdldEZ1bGxZZWFyKCkpO3ZhciBjdXJyZW50TW9udGg9bmV3RGF0ZS5nZXRNb250aCgpO3ZhciBkYXlzSW5DdXJyZW50TW9udGg9KGxlYXA/X19NT05USF9EQVlTX0xFQVA6X19NT05USF9EQVlTX1JFR1VMQVIpW2N1cnJlbnRNb250aF07aWYoZGF5cz5kYXlzSW5DdXJyZW50TW9udGgtbmV3RGF0ZS5nZXREYXRlKCkpe2RheXMtPWRheXNJbkN1cnJlbnRNb250aC1uZXdEYXRlLmdldERhdGUoKSsxO25ld0RhdGUuc2V0RGF0ZSgxKTtpZihjdXJyZW50TW9udGg8MTEpe25ld0RhdGUuc2V0TW9udGgoY3VycmVudE1vbnRoKzEpfWVsc2V7bmV3RGF0ZS5zZXRNb250aCgwKTtuZXdEYXRlLnNldEZ1bGxZZWFyKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSsxKX19ZWxzZXtuZXdEYXRlLnNldERhdGUobmV3RGF0ZS5nZXREYXRlKCkrZGF5cyk7cmV0dXJuIG5ld0RhdGV9fXJldHVybiBuZXdEYXRlfWZ1bmN0aW9uIF9zdHJmdGltZShzLG1heHNpemUsZm9ybWF0LHRtKXt2YXIgZGF0ZT17dG1fc2VjOkhFQVAzMlt0bT4+Ml0sdG1fbWluOkhFQVAzMlt0bSs0Pj4yXSx0bV9ob3VyOkhFQVAzMlt0bSs4Pj4yXSx0bV9tZGF5OkhFQVAzMlt0bSsxMj4+Ml0sdG1fbW9uOkhFQVAzMlt0bSsxNj4+Ml0sdG1feWVhcjpIRUFQMzJbdG0rMjA+PjJdLHRtX3dkYXk6SEVBUDMyW3RtKzI0Pj4yXSx0bV95ZGF5OkhFQVAzMlt0bSsyOD4+Ml0sdG1faXNkc3Q6SEVBUDMyW3RtKzMyPj4yXX07dmFyIHBhdHRlcm49UG9pbnRlcl9zdHJpbmdpZnkoZm9ybWF0KTt2YXIgRVhQQU5TSU9OX1JVTEVTXzE9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMifTtmb3IodmFyIHJ1bGUgaW4gRVhQQU5TSU9OX1JVTEVTXzEpe3BhdHRlcm49cGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwiZyIpLEVYUEFOU0lPTl9SVUxFU18xW3J1bGVdKX12YXIgV0VFS0RBWVM9WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdO3ZhciBNT05USFM9WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdO2Z1bmN0aW9uIGxlYWRpbmdTb21ldGhpbmcodmFsdWUsZGlnaXRzLGNoYXJhY3Rlcil7dmFyIHN0cj10eXBlb2YgdmFsdWU9PT0ibnVtYmVyIj92YWx1ZS50b1N0cmluZygpOnZhbHVlfHwiIjt3aGlsZShzdHIubGVuZ3RoPGRpZ2l0cyl7c3RyPWNoYXJhY3RlclswXStzdHJ9cmV0dXJuIHN0cn1mdW5jdGlvbiBsZWFkaW5nTnVsbHModmFsdWUsZGlnaXRzKXtyZXR1cm4gbGVhZGluZ1NvbWV0aGluZyh2YWx1ZSxkaWdpdHMsIjAiKX1mdW5jdGlvbiBjb21wYXJlQnlEYXkoZGF0ZTEsZGF0ZTIpe2Z1bmN0aW9uIHNnbih2YWx1ZSl7cmV0dXJuIHZhbHVlPDA/LTE6dmFsdWU+MD8xOjB9dmFyIGNvbXBhcmU7aWYoKGNvbXBhcmU9c2duKGRhdGUxLmdldEZ1bGxZZWFyKCktZGF0ZTIuZ2V0RnVsbFllYXIoKSkpPT09MCl7aWYoKGNvbXBhcmU9c2duKGRhdGUxLmdldE1vbnRoKCktZGF0ZTIuZ2V0TW9udGgoKSkpPT09MCl7Y29tcGFyZT1zZ24oZGF0ZTEuZ2V0RGF0ZSgpLWRhdGUyLmdldERhdGUoKSl9fXJldHVybiBjb21wYXJlfWZ1bmN0aW9uIGdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGgpe3N3aXRjaChqYW5Gb3VydGguZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCktMSwxMSwyOSk7Y2FzZSAxOnJldHVybiBqYW5Gb3VydGg7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCksMCwyKTtjYXNlIDQ6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpLTEsMTEsMzApfX1mdW5jdGlvbiBnZXRXZWVrQmFzZWRZZWFyKGRhdGUpe3ZhciB0aGlzRGF0ZT1fX2FkZERheXMobmV3IERhdGUoZGF0ZS50bV95ZWFyKzE5MDAsMCwxKSxkYXRlLnRtX3lkYXkpO3ZhciBqYW5Gb3VydGhUaGlzWWVhcj1uZXcgRGF0ZSh0aGlzRGF0ZS5nZXRGdWxsWWVhcigpLDAsNCk7dmFyIGphbkZvdXJ0aE5leHRZZWFyPW5ldyBEYXRlKHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkrMSwwLDQpO3ZhciBmaXJzdFdlZWtTdGFydFRoaXNZZWFyPWdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGhUaGlzWWVhcik7dmFyIGZpcnN0V2Vla1N0YXJ0TmV4dFllYXI9Z2V0Rmlyc3RXZWVrU3RhcnREYXRlKGphbkZvdXJ0aE5leHRZZWFyKTtpZihjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnRUaGlzWWVhcix0aGlzRGF0ZSk8PTApe2lmKGNvbXBhcmVCeURheShmaXJzdFdlZWtTdGFydE5leHRZZWFyLHRoaXNEYXRlKTw9MCl7cmV0dXJuIHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkrMX1lbHNle3JldHVybiB0aGlzRGF0ZS5nZXRGdWxsWWVhcigpfX1lbHNle3JldHVybiB0aGlzRGF0ZS5nZXRGdWxsWWVhcigpLTF9fXZhciBFWFBBTlNJT05fUlVMRVNfMj17IiVhIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIFdFRUtEQVlTW2RhdGUudG1fd2RheV0uc3Vic3RyaW5nKDAsMyl9KSwiJUEiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gV0VFS0RBWVNbZGF0ZS50bV93ZGF5XX0pLCIlYiI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBNT05USFNbZGF0ZS50bV9tb25dLnN1YnN0cmluZygwLDMpfSksIiVCIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIE1PTlRIU1tkYXRlLnRtX21vbl19KSwiJUMiOihmdW5jdGlvbihkYXRlKXt2YXIgeWVhcj1kYXRlLnRtX3llYXIrMTkwMDtyZXR1cm4gbGVhZGluZ051bGxzKE1hdGguZmxvb3IoeWVhci8xMDApLDIpfSksIiVkIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGxlYWRpbmdOdWxscyhkYXRlLnRtX21kYXksMil9KSwiJWUiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gbGVhZGluZ1NvbWV0aGluZyhkYXRlLnRtX21kYXksMiwiICIpfSksIiVnIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGdldFdlZWtCYXNlZFllYXIoZGF0ZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMil9KSwiJUciOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gZ2V0V2Vla0Jhc2VkWWVhcihkYXRlKX0pLCIlSCI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9ob3VyLDIpfSksIiVJIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGxlYWRpbmdOdWxscyhkYXRlLnRtX2hvdXI8MTM/ZGF0ZS50bV9ob3VyOmRhdGUudG1faG91ci0xMiwyKX0pLCIlaiI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9tZGF5K19fYXJyYXlTdW0oX19pc0xlYXBZZWFyKGRhdGUudG1feWVhcisxOTAwKT9fX01PTlRIX0RBWVNfTEVBUDpfX01PTlRIX0RBWVNfUkVHVUxBUixkYXRlLnRtX21vbi0xKSwzKX0pLCIlbSI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9tb24rMSwyKX0pLCIlTSI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9taW4sMil9KSwiJW4iOihmdW5jdGlvbigpe3JldHVybiJcbiJ9KSwiJXAiOihmdW5jdGlvbihkYXRlKXtpZihkYXRlLnRtX2hvdXI+MCYmZGF0ZS50bV9ob3VyPDEzKXtyZXR1cm4iQU0ifWVsc2V7cmV0dXJuIlBNIn19KSwiJVMiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gbGVhZGluZ051bGxzKGRhdGUudG1fc2VjLDIpfSksIiV0IjooZnVuY3Rpb24oKXtyZXR1cm4iXHQifSksIiV1IjooZnVuY3Rpb24oZGF0ZSl7dmFyIGRheT1uZXcgRGF0ZShkYXRlLnRtX3llYXIrMTkwMCxkYXRlLnRtX21vbisxLGRhdGUudG1fbWRheSwwLDAsMCwwKTtyZXR1cm4gZGF5LmdldERheSgpfHw3fSksIiVVIjooZnVuY3Rpb24oZGF0ZSl7dmFyIGphbkZpcnN0PW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAwLDAsMSk7dmFyIGZpcnN0U3VuZGF5PWphbkZpcnN0LmdldERheSgpPT09MD9qYW5GaXJzdDpfX2FkZERheXMoamFuRmlyc3QsNy1qYW5GaXJzdC5nZXREYXkoKSk7dmFyIGVuZERhdGU9bmV3IERhdGUoZGF0ZS50bV95ZWFyKzE5MDAsZGF0ZS50bV9tb24sZGF0ZS50bV9tZGF5KTtpZihjb21wYXJlQnlEYXkoZmlyc3RTdW5kYXksZW5kRGF0ZSk8MCl7dmFyIGZlYnJ1YXJ5Rmlyc3RVbnRpbEVuZE1vbnRoPV9fYXJyYXlTdW0oX19pc0xlYXBZZWFyKGVuZERhdGUuZ2V0RnVsbFllYXIoKSk/X19NT05USF9EQVlTX0xFQVA6X19NT05USF9EQVlTX1JFR1VMQVIsZW5kRGF0ZS5nZXRNb250aCgpLTEpLTMxO3ZhciBmaXJzdFN1bmRheVVudGlsRW5kSmFudWFyeT0zMS1maXJzdFN1bmRheS5nZXREYXRlKCk7dmFyIGRheXM9Zmlyc3RTdW5kYXlVbnRpbEVuZEphbnVhcnkrZmVicnVhcnlGaXJzdFVudGlsRW5kTW9udGgrZW5kRGF0ZS5nZXREYXRlKCk7cmV0dXJuIGxlYWRpbmdOdWxscyhNYXRoLmNlaWwoZGF5cy83KSwyKX1yZXR1cm4gY29tcGFyZUJ5RGF5KGZpcnN0U3VuZGF5LGphbkZpcnN0KT09PTA/IjAxIjoiMDAifSksIiVWIjooZnVuY3Rpb24oZGF0ZSl7dmFyIGphbkZvdXJ0aFRoaXNZZWFyPW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAwLDAsNCk7dmFyIGphbkZvdXJ0aE5leHRZZWFyPW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAxLDAsNCk7dmFyIGZpcnN0V2Vla1N0YXJ0VGhpc1llYXI9Z2V0Rmlyc3RXZWVrU3RhcnREYXRlKGphbkZvdXJ0aFRoaXNZZWFyKTt2YXIgZmlyc3RXZWVrU3RhcnROZXh0WWVhcj1nZXRGaXJzdFdlZWtTdGFydERhdGUoamFuRm91cnRoTmV4dFllYXIpO3ZhciBlbmREYXRlPV9fYWRkRGF5cyhuZXcgRGF0ZShkYXRlLnRtX3llYXIrMTkwMCwwLDEpLGRhdGUudG1feWRheSk7aWYoY29tcGFyZUJ5RGF5KGVuZERhdGUsZmlyc3RXZWVrU3RhcnRUaGlzWWVhcik8MCl7cmV0dXJuIjUzIn1pZihjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnROZXh0WWVhcixlbmREYXRlKTw9MCl7cmV0dXJuIjAxIn12YXIgZGF5c0RpZmZlcmVuY2U7aWYoZmlyc3RXZWVrU3RhcnRUaGlzWWVhci5nZXRGdWxsWWVhcigpPGRhdGUudG1feWVhcisxOTAwKXtkYXlzRGlmZmVyZW5jZT1kYXRlLnRtX3lkYXkrMzItZmlyc3RXZWVrU3RhcnRUaGlzWWVhci5nZXREYXRlKCl9ZWxzZXtkYXlzRGlmZmVyZW5jZT1kYXRlLnRtX3lkYXkrMS1maXJzdFdlZWtTdGFydFRoaXNZZWFyLmdldERhdGUoKX1yZXR1cm4gbGVhZGluZ051bGxzKE1hdGguY2VpbChkYXlzRGlmZmVyZW5jZS83KSwyKX0pLCIldyI6KGZ1bmN0aW9uKGRhdGUpe3ZhciBkYXk9bmV3IERhdGUoZGF0ZS50bV95ZWFyKzE5MDAsZGF0ZS50bV9tb24rMSxkYXRlLnRtX21kYXksMCwwLDAsMCk7cmV0dXJuIGRheS5nZXREYXkoKX0pLCIlVyI6KGZ1bmN0aW9uKGRhdGUpe3ZhciBqYW5GaXJzdD1uZXcgRGF0ZShkYXRlLnRtX3llYXIsMCwxKTt2YXIgZmlyc3RNb25kYXk9amFuRmlyc3QuZ2V0RGF5KCk9PT0xP2phbkZpcnN0Ol9fYWRkRGF5cyhqYW5GaXJzdCxqYW5GaXJzdC5nZXREYXkoKT09PTA/MTo3LWphbkZpcnN0LmdldERheSgpKzEpO3ZhciBlbmREYXRlPW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAwLGRhdGUudG1fbW9uLGRhdGUudG1fbWRheSk7aWYoY29tcGFyZUJ5RGF5KGZpcnN0TW9uZGF5LGVuZERhdGUpPDApe3ZhciBmZWJydWFyeUZpcnN0VW50aWxFbmRNb250aD1fX2FycmF5U3VtKF9faXNMZWFwWWVhcihlbmREYXRlLmdldEZ1bGxZZWFyKCkpP19fTU9OVEhfREFZU19MRUFQOl9fTU9OVEhfREFZU19SRUdVTEFSLGVuZERhdGUuZ2V0TW9udGgoKS0xKS0zMTt2YXIgZmlyc3RNb25kYXlVbnRpbEVuZEphbnVhcnk9MzEtZmlyc3RNb25kYXkuZ2V0RGF0ZSgpO3ZhciBkYXlzPWZpcnN0TW9uZGF5VW50aWxFbmRKYW51YXJ5K2ZlYnJ1YXJ5Rmlyc3RVbnRpbEVuZE1vbnRoK2VuZERhdGUuZ2V0RGF0ZSgpO3JldHVybiBsZWFkaW5nTnVsbHMoTWF0aC5jZWlsKGRheXMvNyksMil9cmV0dXJuIGNvbXBhcmVCeURheShmaXJzdE1vbmRheSxqYW5GaXJzdCk9PT0wPyIwMSI6IjAwIn0pLCIleSI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybihkYXRlLnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMil9KSwiJVkiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gZGF0ZS50bV95ZWFyKzE5MDB9KSwiJXoiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4iIn0pLCIlWiI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiIifSksIiUlIjooZnVuY3Rpb24oKXtyZXR1cm4iJSJ9KX07Zm9yKHZhciBydWxlIGluIEVYUEFOU0lPTl9SVUxFU18yKXtpZihwYXR0ZXJuLmluZGV4T2YocnVsZSk+PTApe3BhdHRlcm49cGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwiZyIpLEVYUEFOU0lPTl9SVUxFU18yW3J1bGVdKGRhdGUpKX19dmFyIGJ5dGVzPWludEFycmF5RnJvbVN0cmluZyhwYXR0ZXJuLGZhbHNlKTtpZihieXRlcy5sZW5ndGg+bWF4c2l6ZSl7cmV0dXJuIDB9d3JpdGVBcnJheVRvTWVtb3J5KGJ5dGVzLHMpO3JldHVybiBieXRlcy5sZW5ndGgtMX1mdW5jdGlvbiBfc3RyZnRpbWVfbChzLG1heHNpemUsZm9ybWF0LHRtKXtyZXR1cm4gX3N0cmZ0aW1lKHMsbWF4c2l6ZSxmb3JtYXQsdG0pfWZ1bmN0aW9uIF9hYm9ydCgpe01vZHVsZVsiYWJvcnQiXSgpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzKCl7TW9kdWxlWyJwcmludEVyciJdKCJtaXNzaW5nIGZ1bmN0aW9uOiBfZW1iaW5kX3JlZ2lzdGVyX2NsYXNzIik7YWJvcnQoLTEpfWZ1bmN0aW9uIF9wdGhyZWFkX2NvbmRfd2FpdCgpe3JldHVybiAwfXZhciBfZmFicz1NYXRoX2Ficzt2YXIgX2dldGM9X2ZnZXRjO2Z1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIoKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlciIpO2Fib3J0KC0xKX12YXIgQnJvd3Nlcj17bWFpbkxvb3A6e3NjaGVkdWxlcjpudWxsLG1ldGhvZDoiIixzaG91bGRQYXVzZTpmYWxzZSxwYXVzZWQ6ZmFsc2UscXVldWU6W10scGF1c2U6KGZ1bmN0aW9uKCl7QnJvd3Nlci5tYWluTG9vcC5zaG91bGRQYXVzZT10cnVlfSkscmVzdW1lOihmdW5jdGlvbigpe2lmKEJyb3dzZXIubWFpbkxvb3AucGF1c2VkKXtCcm93c2VyLm1haW5Mb29wLnBhdXNlZD1mYWxzZTtCcm93c2VyLm1haW5Mb29wLnNjaGVkdWxlcigpfUJyb3dzZXIubWFpbkxvb3Auc2hvdWxkUGF1c2U9ZmFsc2V9KSx1cGRhdGVTdGF0dXM6KGZ1bmN0aW9uKCl7aWYoTW9kdWxlWyJzZXRTdGF0dXMiXSl7dmFyIG1lc3NhZ2U9TW9kdWxlWyJzdGF0dXNNZXNzYWdlIl18fCJQbGVhc2Ugd2FpdC4uLiI7dmFyIHJlbWFpbmluZz1Ccm93c2VyLm1haW5Mb29wLnJlbWFpbmluZ0Jsb2NrZXJzO3ZhciBleHBlY3RlZD1Ccm93c2VyLm1haW5Mb29wLmV4cGVjdGVkQmxvY2tlcnM7aWYocmVtYWluaW5nKXtpZihyZW1haW5pbmc8ZXhwZWN0ZWQpe01vZHVsZVsic2V0U3RhdHVzIl0obWVzc2FnZSsiICgiKyhleHBlY3RlZC1yZW1haW5pbmcpKyIvIitleHBlY3RlZCsiKSIpfWVsc2V7TW9kdWxlWyJzZXRTdGF0dXMiXShtZXNzYWdlKX19ZWxzZXtNb2R1bGVbInNldFN0YXR1cyJdKCIiKX19fSl9LGlzRnVsbFNjcmVlbjpmYWxzZSxwb2ludGVyTG9jazpmYWxzZSxtb2R1bGVDb250ZXh0Q3JlYXRlZENhbGxiYWNrczpbXSx3b3JrZXJzOltdLGluaXQ6KGZ1bmN0aW9uKCl7aWYoIU1vZHVsZVsicHJlbG9hZFBsdWdpbnMiXSlNb2R1bGVbInByZWxvYWRQbHVnaW5zIl09W107aWYoQnJvd3Nlci5pbml0dGVkfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpcmV0dXJuO0Jyb3dzZXIuaW5pdHRlZD10cnVlO3RyeXtuZXcgQmxvYjtCcm93c2VyLmhhc0Jsb2JDb25zdHJ1Y3Rvcj10cnVlfWNhdGNoKGUpe0Jyb3dzZXIuaGFzQmxvYkNvbnN0cnVjdG9yPWZhbHNlO2NvbnNvbGUubG9nKCJ3YXJuaW5nOiBubyBibG9iIGNvbnN0cnVjdG9yLCBjYW5ub3QgY3JlYXRlIGJsb2JzIHdpdGggbWltZXR5cGVzIil9QnJvd3Nlci5CbG9iQnVpbGRlcj10eXBlb2YgTW96QmxvYkJ1aWxkZXIhPSJ1bmRlZmluZWQiP01vekJsb2JCdWlsZGVyOnR5cGVvZiBXZWJLaXRCbG9iQnVpbGRlciE9InVuZGVmaW5lZCI/V2ViS2l0QmxvYkJ1aWxkZXI6IUJyb3dzZXIuaGFzQmxvYkNvbnN0cnVjdG9yP2NvbnNvbGUubG9nKCJ3YXJuaW5nOiBubyBCbG9iQnVpbGRlciIpOm51bGw7QnJvd3Nlci5VUkxPYmplY3Q9dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCI/d2luZG93LlVSTD93aW5kb3cuVVJMOndpbmRvdy53ZWJraXRVUkw6dW5kZWZpbmVkO2lmKCFNb2R1bGUubm9JbWFnZURlY29kaW5nJiZ0eXBlb2YgQnJvd3Nlci5VUkxPYmplY3Q9PT0idW5kZWZpbmVkIil7Y29uc29sZS5sb2coIndhcm5pbmc6IEJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBjcmVhdGluZyBvYmplY3QgVVJMcy4gQnVpbHQtaW4gYnJvd3NlciBpbWFnZSBkZWNvZGluZyB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIik7TW9kdWxlLm5vSW1hZ2VEZWNvZGluZz10cnVlfXZhciBpbWFnZVBsdWdpbj17fTtpbWFnZVBsdWdpblsiY2FuSGFuZGxlIl09ZnVuY3Rpb24gaW1hZ2VQbHVnaW5fY2FuSGFuZGxlKG5hbWUpe3JldHVybiFNb2R1bGUubm9JbWFnZURlY29kaW5nJiYvXC4oanBnfGpwZWd8cG5nfGJtcCkkL2kudGVzdChuYW1lKX07aW1hZ2VQbHVnaW5bImhhbmRsZSJdPWZ1bmN0aW9uIGltYWdlUGx1Z2luX2hhbmRsZShieXRlQXJyYXksbmFtZSxvbmxvYWQsb25lcnJvcil7dmFyIGI9bnVsbDtpZihCcm93c2VyLmhhc0Jsb2JDb25zdHJ1Y3Rvcil7dHJ5e2I9bmV3IEJsb2IoW2J5dGVBcnJheV0se3R5cGU6QnJvd3Nlci5nZXRNaW1ldHlwZShuYW1lKX0pO2lmKGIuc2l6ZSE9PWJ5dGVBcnJheS5sZW5ndGgpe2I9bmV3IEJsb2IoWyhuZXcgVWludDhBcnJheShieXRlQXJyYXkpKS5idWZmZXJdLHt0eXBlOkJyb3dzZXIuZ2V0TWltZXR5cGUobmFtZSl9KX19Y2F0Y2goZSl7UnVudGltZS53YXJuT25jZSgiQmxvYiBjb25zdHJ1Y3RvciBwcmVzZW50IGJ1dCBmYWlsczogIitlKyI7IGZhbGxpbmcgYmFjayB0byBibG9iIGJ1aWxkZXIiKX19aWYoIWIpe3ZhciBiYj1uZXcgQnJvd3Nlci5CbG9iQnVpbGRlcjtiYi5hcHBlbmQoKG5ldyBVaW50OEFycmF5KGJ5dGVBcnJheSkpLmJ1ZmZlcik7Yj1iYi5nZXRCbG9iKCl9dmFyIHVybD1Ccm93c2VyLlVSTE9iamVjdC5jcmVhdGVPYmplY3RVUkwoYik7dmFyIGltZz1uZXcgSW1hZ2U7aW1nLm9ubG9hZD1mdW5jdGlvbiBpbWdfb25sb2FkKCl7YXNzZXJ0KGltZy5jb21wbGV0ZSwiSW1hZ2UgIituYW1lKyIgY291bGQgbm90IGJlIGRlY29kZWQiKTt2YXIgY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2NhbnZhcy53aWR0aD1pbWcud2lkdGg7Y2FudmFzLmhlaWdodD1pbWcuaGVpZ2h0O3ZhciBjdHg9Y2FudmFzLmdldENvbnRleHQoIjJkIik7Y3R4LmRyYXdJbWFnZShpbWcsMCwwKTtNb2R1bGVbInByZWxvYWRlZEltYWdlcyJdW25hbWVdPWNhbnZhcztCcm93c2VyLlVSTE9iamVjdC5yZXZva2VPYmplY3RVUkwodXJsKTtpZihvbmxvYWQpb25sb2FkKGJ5dGVBcnJheSl9O2ltZy5vbmVycm9yPWZ1bmN0aW9uIGltZ19vbmVycm9yKGV2ZW50KXtjb25zb2xlLmxvZygiSW1hZ2UgIit1cmwrIiBjb3VsZCBub3QgYmUgZGVjb2RlZCIpO2lmKG9uZXJyb3Ipb25lcnJvcigpfTtpbWcuc3JjPXVybH07TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLnB1c2goaW1hZ2VQbHVnaW4pO3ZhciBhdWRpb1BsdWdpbj17fTthdWRpb1BsdWdpblsiY2FuSGFuZGxlIl09ZnVuY3Rpb24gYXVkaW9QbHVnaW5fY2FuSGFuZGxlKG5hbWUpe3JldHVybiFNb2R1bGUubm9BdWRpb0RlY29kaW5nJiZuYW1lLnN1YnN0cigtNClpbnsiLm9nZyI6MSwiLndhdiI6MSwiLm1wMyI6MX19O2F1ZGlvUGx1Z2luWyJoYW5kbGUiXT1mdW5jdGlvbiBhdWRpb1BsdWdpbl9oYW5kbGUoYnl0ZUFycmF5LG5hbWUsb25sb2FkLG9uZXJyb3Ipe3ZhciBkb25lPWZhbHNlO2Z1bmN0aW9uIGZpbmlzaChhdWRpbyl7aWYoZG9uZSlyZXR1cm47ZG9uZT10cnVlO01vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl1bbmFtZV09YXVkaW87aWYob25sb2FkKW9ubG9hZChieXRlQXJyYXkpfWZ1bmN0aW9uIGZhaWwoKXtpZihkb25lKXJldHVybjtkb25lPXRydWU7TW9kdWxlWyJwcmVsb2FkZWRBdWRpb3MiXVtuYW1lXT1uZXcgQXVkaW87aWYob25lcnJvcilvbmVycm9yKCl9aWYoQnJvd3Nlci5oYXNCbG9iQ29uc3RydWN0b3Ipe3RyeXt2YXIgYj1uZXcgQmxvYihbYnl0ZUFycmF5XSx7dHlwZTpCcm93c2VyLmdldE1pbWV0eXBlKG5hbWUpfSl9Y2F0Y2goZSl7cmV0dXJuIGZhaWwoKX12YXIgdXJsPUJyb3dzZXIuVVJMT2JqZWN0LmNyZWF0ZU9iamVjdFVSTChiKTt2YXIgYXVkaW89bmV3IEF1ZGlvO2F1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoImNhbnBsYXl0aHJvdWdoIiwoZnVuY3Rpb24oKXtmaW5pc2goYXVkaW8pfSksZmFsc2UpO2F1ZGlvLm9uZXJyb3I9ZnVuY3Rpb24gYXVkaW9fb25lcnJvcihldmVudCl7aWYoZG9uZSlyZXR1cm47Y29uc29sZS5sb2coIndhcm5pbmc6IGJyb3dzZXIgY291bGQgbm90IGZ1bGx5IGRlY29kZSBhdWRpbyAiK25hbWUrIiwgdHJ5aW5nIHNsb3dlciBiYXNlNjQgYXBwcm9hY2giKTtmdW5jdGlvbiBlbmNvZGU2NChkYXRhKXt2YXIgQkFTRT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7dmFyIFBBRD0iPSI7dmFyIHJldD0iIjt2YXIgbGVmdGNoYXI9MDt2YXIgbGVmdGJpdHM9MDtmb3IodmFyIGk9MDtpPGRhdGEubGVuZ3RoO2krKyl7bGVmdGNoYXI9bGVmdGNoYXI8PDh8ZGF0YVtpXTtsZWZ0Yml0cys9ODt3aGlsZShsZWZ0Yml0cz49Nil7dmFyIGN1cnI9bGVmdGNoYXI+PmxlZnRiaXRzLTYmNjM7bGVmdGJpdHMtPTY7cmV0Kz1CQVNFW2N1cnJdfX1pZihsZWZ0Yml0cz09Mil7cmV0Kz1CQVNFWyhsZWZ0Y2hhciYzKTw8NF07cmV0Kz1QQUQrUEFEfWVsc2UgaWYobGVmdGJpdHM9PTQpe3JldCs9QkFTRVsobGVmdGNoYXImMTUpPDwyXTtyZXQrPVBBRH1yZXR1cm4gcmV0fWF1ZGlvLnNyYz0iZGF0YTphdWRpby94LSIrbmFtZS5zdWJzdHIoLTMpKyI7YmFzZTY0LCIrZW5jb2RlNjQoYnl0ZUFycmF5KTtmaW5pc2goYXVkaW8pfTthdWRpby5zcmM9dXJsO0Jyb3dzZXIuc2FmZVNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZmluaXNoKGF1ZGlvKX0pLDFlNCl9ZWxzZXtyZXR1cm4gZmFpbCgpfX07TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLnB1c2goYXVkaW9QbHVnaW4pO3ZhciBjYW52YXM9TW9kdWxlWyJjYW52YXMiXTtpZihjYW52YXMpe2NhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2s9Y2FudmFzWyJyZXF1ZXN0UG9pbnRlckxvY2siXXx8Y2FudmFzWyJtb3pSZXF1ZXN0UG9pbnRlckxvY2siXXx8Y2FudmFzWyJ3ZWJraXRSZXF1ZXN0UG9pbnRlckxvY2siXXx8Y2FudmFzWyJtc1JlcXVlc3RQb2ludGVyTG9jayJdfHwoZnVuY3Rpb24oKXt9KTtjYW52YXMuZXhpdFBvaW50ZXJMb2NrPWRvY3VtZW50WyJleGl0UG9pbnRlckxvY2siXXx8ZG9jdW1lbnRbIm1vekV4aXRQb2ludGVyTG9jayJdfHxkb2N1bWVudFsid2Via2l0RXhpdFBvaW50ZXJMb2NrIl18fGRvY3VtZW50WyJtc0V4aXRQb2ludGVyTG9jayJdfHwoZnVuY3Rpb24oKXt9KTtjYW52YXMuZXhpdFBvaW50ZXJMb2NrPWNhbnZhcy5leGl0UG9pbnRlckxvY2suYmluZChkb2N1bWVudCk7ZnVuY3Rpb24gcG9pbnRlckxvY2tDaGFuZ2UoKXtCcm93c2VyLnBvaW50ZXJMb2NrPWRvY3VtZW50WyJwb2ludGVyTG9ja0VsZW1lbnQiXT09PWNhbnZhc3x8ZG9jdW1lbnRbIm1velBvaW50ZXJMb2NrRWxlbWVudCJdPT09Y2FudmFzfHxkb2N1bWVudFsid2Via2l0UG9pbnRlckxvY2tFbGVtZW50Il09PT1jYW52YXN8fGRvY3VtZW50WyJtc1BvaW50ZXJMb2NrRWxlbWVudCJdPT09Y2FudmFzfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJsb2NrY2hhbmdlIixwb2ludGVyTG9ja0NoYW5nZSxmYWxzZSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW96cG9pbnRlcmxvY2tjaGFuZ2UiLHBvaW50ZXJMb2NrQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRwb2ludGVybG9ja2NoYW5nZSIscG9pbnRlckxvY2tDaGFuZ2UsZmFsc2UpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1zcG9pbnRlcmxvY2tjaGFuZ2UiLHBvaW50ZXJMb2NrQ2hhbmdlLGZhbHNlKTtpZihNb2R1bGVbImVsZW1lbnRQb2ludGVyTG9jayJdKXtjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihldil7aWYoIUJyb3dzZXIucG9pbnRlckxvY2smJmNhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2spe2NhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2soKTtldi5wcmV2ZW50RGVmYXVsdCgpfX0pLGZhbHNlKX19fSksY3JlYXRlQ29udGV4dDooZnVuY3Rpb24oY2FudmFzLHVzZVdlYkdMLHNldEluTW9kdWxlLHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpe3ZhciBjdHg7dmFyIGVycm9ySW5mbz0iPyI7ZnVuY3Rpb24gb25Db250ZXh0Q3JlYXRpb25FcnJvcihldmVudCl7ZXJyb3JJbmZvPWV2ZW50LnN0YXR1c01lc3NhZ2V8fGVycm9ySW5mb310cnl7aWYodXNlV2ViR0wpe3ZhciBjb250ZXh0QXR0cmlidXRlcz17YW50aWFsaWFzOmZhbHNlLGFscGhhOmZhbHNlfTtpZih3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKXtmb3IodmFyIGF0dHJpYnV0ZSBpbiB3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKXtjb250ZXh0QXR0cmlidXRlc1thdHRyaWJ1dGVdPXdlYkdMQ29udGV4dEF0dHJpYnV0ZXNbYXR0cmlidXRlXX19Y2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLG9uQ29udGV4dENyZWF0aW9uRXJyb3IsZmFsc2UpO3RyeXtbImV4cGVyaW1lbnRhbC13ZWJnbCIsIndlYmdsIl0uc29tZSgoZnVuY3Rpb24od2ViZ2xJZCl7cmV0dXJuIGN0eD1jYW52YXMuZ2V0Q29udGV4dCh3ZWJnbElkLGNvbnRleHRBdHRyaWJ1dGVzKX0pKX1maW5hbGx5e2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIixvbkNvbnRleHRDcmVhdGlvbkVycm9yLGZhbHNlKX19ZWxzZXtjdHg9Y2FudmFzLmdldENvbnRleHQoIjJkIil9aWYoIWN0eCl0aHJvdyI6KCJ9Y2F0Y2goZSl7TW9kdWxlLnByaW50KCJDb3VsZCBub3QgY3JlYXRlIGNhbnZhczogIitbZXJyb3JJbmZvLGVdKTtyZXR1cm4gbnVsbH1pZih1c2VXZWJHTCl7Y2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iYmxhY2sifWlmKHNldEluTW9kdWxlKXtHTGN0eD1Nb2R1bGUuY3R4PWN0eDtNb2R1bGUudXNlV2ViR0w9dXNlV2ViR0w7QnJvd3Nlci5tb2R1bGVDb250ZXh0Q3JlYXRlZENhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbihjYWxsYmFjayl7Y2FsbGJhY2soKX0pKTtCcm93c2VyLmluaXQoKX1yZXR1cm4gY3R4fSksZGVzdHJveUNvbnRleHQ6KGZ1bmN0aW9uKGNhbnZhcyx1c2VXZWJHTCxzZXRJbk1vZHVsZSl7fSksZnVsbFNjcmVlbkhhbmRsZXJzSW5zdGFsbGVkOmZhbHNlLGxvY2tQb2ludGVyOnVuZGVmaW5lZCxyZXNpemVDYW52YXM6dW5kZWZpbmVkLHJlcXVlc3RGdWxsU2NyZWVuOihmdW5jdGlvbihsb2NrUG9pbnRlcixyZXNpemVDYW52YXMpe0Jyb3dzZXIubG9ja1BvaW50ZXI9bG9ja1BvaW50ZXI7QnJvd3Nlci5yZXNpemVDYW52YXM9cmVzaXplQ2FudmFzO2lmKHR5cGVvZiBCcm93c2VyLmxvY2tQb2ludGVyPT09InVuZGVmaW5lZCIpQnJvd3Nlci5sb2NrUG9pbnRlcj10cnVlO2lmKHR5cGVvZiBCcm93c2VyLnJlc2l6ZUNhbnZhcz09PSJ1bmRlZmluZWQiKUJyb3dzZXIucmVzaXplQ2FudmFzPWZhbHNlO3ZhciBjYW52YXM9TW9kdWxlWyJjYW52YXMiXTtmdW5jdGlvbiBmdWxsU2NyZWVuQ2hhbmdlKCl7QnJvd3Nlci5pc0Z1bGxTY3JlZW49ZmFsc2U7dmFyIGNhbnZhc0NvbnRhaW5lcj1jYW52YXMucGFyZW50Tm9kZTtpZigoZG9jdW1lbnRbIndlYmtpdEZ1bGxTY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsibW96RnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1vekZ1bGxzY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJmdWxsU2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsiZnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCJdKT09PWNhbnZhc0NvbnRhaW5lcil7Y2FudmFzLmNhbmNlbEZ1bGxTY3JlZW49ZG9jdW1lbnRbImNhbmNlbEZ1bGxTY3JlZW4iXXx8ZG9jdW1lbnRbIm1vekNhbmNlbEZ1bGxTY3JlZW4iXXx8ZG9jdW1lbnRbIndlYmtpdENhbmNlbEZ1bGxTY3JlZW4iXXx8ZG9jdW1lbnRbIm1zRXhpdEZ1bGxzY3JlZW4iXXx8ZG9jdW1lbnRbImV4aXRGdWxsc2NyZWVuIl18fChmdW5jdGlvbigpe30pO2NhbnZhcy5jYW5jZWxGdWxsU2NyZWVuPWNhbnZhcy5jYW5jZWxGdWxsU2NyZWVuLmJpbmQoZG9jdW1lbnQpO2lmKEJyb3dzZXIubG9ja1BvaW50ZXIpY2FudmFzLnJlcXVlc3RQb2ludGVyTG9jaygpO0Jyb3dzZXIuaXNGdWxsU2NyZWVuPXRydWU7aWYoQnJvd3Nlci5yZXNpemVDYW52YXMpQnJvd3Nlci5zZXRGdWxsU2NyZWVuQ2FudmFzU2l6ZSgpfWVsc2V7Y2FudmFzQ29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNhbnZhcyxjYW52YXNDb250YWluZXIpO2NhbnZhc0NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNhbnZhc0NvbnRhaW5lcik7aWYoQnJvd3Nlci5yZXNpemVDYW52YXMpQnJvd3Nlci5zZXRXaW5kb3dlZENhbnZhc1NpemUoKX1pZihNb2R1bGVbIm9uRnVsbFNjcmVlbiJdKU1vZHVsZVsib25GdWxsU2NyZWVuIl0oQnJvd3Nlci5pc0Z1bGxTY3JlZW4pO0Jyb3dzZXIudXBkYXRlQ2FudmFzRGltZW5zaW9ucyhjYW52YXMpfWlmKCFCcm93c2VyLmZ1bGxTY3JlZW5IYW5kbGVyc0luc3RhbGxlZCl7QnJvd3Nlci5mdWxsU2NyZWVuSGFuZGxlcnNJbnN0YWxsZWQ9dHJ1ZTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIixmdWxsU2NyZWVuQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3pmdWxsc2NyZWVuY2hhbmdlIixmdWxsU2NyZWVuQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIixmdWxsU2NyZWVuQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJNU0Z1bGxzY3JlZW5DaGFuZ2UiLGZ1bGxTY3JlZW5DaGFuZ2UsZmFsc2UpfXZhciBjYW52YXNDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y2FudmFzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNhbnZhc0NvbnRhaW5lcixjYW52YXMpO2NhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpO2NhbnZhc0NvbnRhaW5lci5yZXF1ZXN0RnVsbFNjcmVlbj1jYW52YXNDb250YWluZXJbInJlcXVlc3RGdWxsU2NyZWVuIl18fGNhbnZhc0NvbnRhaW5lclsibW96UmVxdWVzdEZ1bGxTY3JlZW4iXXx8Y2FudmFzQ29udGFpbmVyWyJtc1JlcXVlc3RGdWxsc2NyZWVuIl18fChjYW52YXNDb250YWluZXJbIndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuIl0/KGZ1bmN0aW9uKCl7Y2FudmFzQ29udGFpbmVyWyJ3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbiJdKEVsZW1lbnRbIkFMTE9XX0tFWUJPQVJEX0lOUFVUIl0pfSk6bnVsbCk7Y2FudmFzQ29udGFpbmVyLnJlcXVlc3RGdWxsU2NyZWVuKCl9KSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWU6ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpe2lmKHR5cGVvZiB3aW5kb3c9PT0idW5kZWZpbmVkIil7c2V0VGltZW91dChmdW5jLDFlMy82MCl9ZWxzZXtpZighd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT13aW5kb3dbInJlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbIm1velJlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbIm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl18fHdpbmRvd1sib1JlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbInNldFRpbWVvdXQiXX13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpfX0sc2FmZUNhbGxiYWNrOihmdW5jdGlvbihmdW5jKXtyZXR1cm4oZnVuY3Rpb24oKXtpZighQUJPUlQpcmV0dXJuIGZ1bmMuYXBwbHkobnVsbCxhcmd1bWVudHMpfSl9KSxzYWZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOihmdW5jdGlvbihmdW5jKXtyZXR1cm4gQnJvd3Nlci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7aWYoIUFCT1JUKWZ1bmMoKX0pKX0pLHNhZmVTZXRUaW1lb3V0OihmdW5jdGlvbihmdW5jLHRpbWVvdXQpe01vZHVsZVsibm9FeGl0UnVudGltZSJdPXRydWU7cmV0dXJuIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYoIUFCT1JUKWZ1bmMoKX0pLHRpbWVvdXQpfSksc2FmZVNldEludGVydmFsOihmdW5jdGlvbihmdW5jLHRpbWVvdXQpe01vZHVsZVsibm9FeGl0UnVudGltZSJdPXRydWU7cmV0dXJuIHNldEludGVydmFsKChmdW5jdGlvbigpe2lmKCFBQk9SVClmdW5jKCl9KSx0aW1lb3V0KX0pLGdldE1pbWV0eXBlOihmdW5jdGlvbihuYW1lKXtyZXR1cm57ImpwZyI6ImltYWdlL2pwZWciLCJqcGVnIjoiaW1hZ2UvanBlZyIsInBuZyI6ImltYWdlL3BuZyIsImJtcCI6ImltYWdlL2JtcCIsIm9nZyI6ImF1ZGlvL29nZyIsIndhdiI6ImF1ZGlvL3dhdiIsIm1wMyI6ImF1ZGlvL21wZWcifVtuYW1lLnN1YnN0cihuYW1lLmxhc3RJbmRleE9mKCIuIikrMSldfSksZ2V0VXNlck1lZGlhOihmdW5jdGlvbihmdW5jKXtpZighd2luZG93LmdldFVzZXJNZWRpYSl7d2luZG93LmdldFVzZXJNZWRpYT1uYXZpZ2F0b3JbImdldFVzZXJNZWRpYSJdfHxuYXZpZ2F0b3JbIm1vekdldFVzZXJNZWRpYSJdfXdpbmRvdy5nZXRVc2VyTWVkaWEoZnVuYyl9KSxnZXRNb3ZlbWVudFg6KGZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4gZXZlbnRbIm1vdmVtZW50WCJdfHxldmVudFsibW96TW92ZW1lbnRYIl18fGV2ZW50WyJ3ZWJraXRNb3ZlbWVudFgiXXx8MH0pLGdldE1vdmVtZW50WTooZnVuY3Rpb24oZXZlbnQpe3JldHVybiBldmVudFsibW92ZW1lbnRZIl18fGV2ZW50WyJtb3pNb3ZlbWVudFkiXXx8ZXZlbnRbIndlYmtpdE1vdmVtZW50WSJdfHwwfSksZ2V0TW91c2VXaGVlbERlbHRhOihmdW5jdGlvbihldmVudCl7dmFyIGRlbHRhPTA7c3dpdGNoKGV2ZW50LnR5cGUpe2Nhc2UiRE9NTW91c2VTY3JvbGwiOmRlbHRhPWV2ZW50LmRldGFpbDticmVhaztjYXNlIm1vdXNld2hlZWwiOmRlbHRhPS1ldmVudC53aGVlbERlbHRhO2JyZWFrO2Nhc2Uid2hlZWwiOmRlbHRhPWV2ZW50LmRlbHRhWTticmVhaztkZWZhdWx0OnRocm93InVucmVjb2duaXplZCBtb3VzZSB3aGVlbCBldmVudDogIitldmVudC50eXBlfXJldHVybiBNYXRoLm1heCgtMSxNYXRoLm1pbigxLGRlbHRhKSl9KSxtb3VzZVg6MCxtb3VzZVk6MCxtb3VzZU1vdmVtZW50WDowLG1vdXNlTW92ZW1lbnRZOjAsdG91Y2hlczp7fSxsYXN0VG91Y2hlczp7fSxjYWxjdWxhdGVNb3VzZUV2ZW50OihmdW5jdGlvbihldmVudCl7aWYoQnJvd3Nlci5wb2ludGVyTG9jayl7aWYoZXZlbnQudHlwZSE9Im1vdXNlbW92ZSImJiJtb3pNb3ZlbWVudFgiaW4gZXZlbnQpe0Jyb3dzZXIubW91c2VNb3ZlbWVudFg9QnJvd3Nlci5tb3VzZU1vdmVtZW50WT0wfWVsc2V7QnJvd3Nlci5tb3VzZU1vdmVtZW50WD1Ccm93c2VyLmdldE1vdmVtZW50WChldmVudCk7QnJvd3Nlci5tb3VzZU1vdmVtZW50WT1Ccm93c2VyLmdldE1vdmVtZW50WShldmVudCl9aWYodHlwZW9mIFNETCE9InVuZGVmaW5lZCIpe0Jyb3dzZXIubW91c2VYPVNETC5tb3VzZVgrQnJvd3Nlci5tb3VzZU1vdmVtZW50WDtCcm93c2VyLm1vdXNlWT1TREwubW91c2VZK0Jyb3dzZXIubW91c2VNb3ZlbWVudFl9ZWxzZXtCcm93c2VyLm1vdXNlWCs9QnJvd3Nlci5tb3VzZU1vdmVtZW50WDtCcm93c2VyLm1vdXNlWSs9QnJvd3Nlci5tb3VzZU1vdmVtZW50WX19ZWxzZXt2YXIgcmVjdD1Nb2R1bGVbImNhbnZhcyJdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBjdz1Nb2R1bGVbImNhbnZhcyJdLndpZHRoO3ZhciBjaD1Nb2R1bGVbImNhbnZhcyJdLmhlaWdodDt2YXIgc2Nyb2xsWD10eXBlb2Ygd2luZG93LnNjcm9sbFghPT0idW5kZWZpbmVkIj93aW5kb3cuc2Nyb2xsWDp3aW5kb3cucGFnZVhPZmZzZXQ7dmFyIHNjcm9sbFk9dHlwZW9mIHdpbmRvdy5zY3JvbGxZIT09InVuZGVmaW5lZCI/d2luZG93LnNjcm9sbFk6d2luZG93LnBhZ2VZT2Zmc2V0O2lmKGV2ZW50LnR5cGU9PT0idG91Y2hzdGFydCJ8fGV2ZW50LnR5cGU9PT0idG91Y2hlbmQifHxldmVudC50eXBlPT09InRvdWNobW92ZSIpe3ZhciB0b3VjaD1ldmVudC50b3VjaDtpZih0b3VjaD09PXVuZGVmaW5lZCl7cmV0dXJufXZhciBhZGp1c3RlZFg9dG91Y2gucGFnZVgtKHNjcm9sbFgrcmVjdC5sZWZ0KTt2YXIgYWRqdXN0ZWRZPXRvdWNoLnBhZ2VZLShzY3JvbGxZK3JlY3QudG9wKTthZGp1c3RlZFg9YWRqdXN0ZWRYKihjdy9yZWN0LndpZHRoKTthZGp1c3RlZFk9YWRqdXN0ZWRZKihjaC9yZWN0LmhlaWdodCk7dmFyIGNvb3Jkcz17eDphZGp1c3RlZFgseTphZGp1c3RlZFl9O2lmKGV2ZW50LnR5cGU9PT0idG91Y2hzdGFydCIpe0Jyb3dzZXIubGFzdFRvdWNoZXNbdG91Y2guaWRlbnRpZmllcl09Y29vcmRzO0Jyb3dzZXIudG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXT1jb29yZHN9ZWxzZSBpZihldmVudC50eXBlPT09InRvdWNoZW5kInx8ZXZlbnQudHlwZT09PSJ0b3VjaG1vdmUiKXtCcm93c2VyLmxhc3RUb3VjaGVzW3RvdWNoLmlkZW50aWZpZXJdPUJyb3dzZXIudG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXTtCcm93c2VyLnRvdWNoZXNbdG91Y2guaWRlbnRpZmllcl09e3g6YWRqdXN0ZWRYLHk6YWRqdXN0ZWRZfX1yZXR1cm59dmFyIHg9ZXZlbnQucGFnZVgtKHNjcm9sbFgrcmVjdC5sZWZ0KTt2YXIgeT1ldmVudC5wYWdlWS0oc2Nyb2xsWStyZWN0LnRvcCk7eD14Kihjdy9yZWN0LndpZHRoKTt5PXkqKGNoL3JlY3QuaGVpZ2h0KTtCcm93c2VyLm1vdXNlTW92ZW1lbnRYPXgtQnJvd3Nlci5tb3VzZVg7QnJvd3Nlci5tb3VzZU1vdmVtZW50WT15LUJyb3dzZXIubW91c2VZO0Jyb3dzZXIubW91c2VYPXg7QnJvd3Nlci5tb3VzZVk9eX19KSx4aHJMb2FkOihmdW5jdGlvbih1cmwsb25sb2FkLG9uZXJyb3Ipe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCx0cnVlKTt4aHIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciI7eGhyLm9ubG9hZD1mdW5jdGlvbiB4aHJfb25sb2FkKCl7aWYoeGhyLnN0YXR1cz09MjAwfHx4aHIuc3RhdHVzPT0wJiZ4aHIucmVzcG9uc2Upe29ubG9hZCh4aHIucmVzcG9uc2UpfWVsc2V7b25lcnJvcigpfX07eGhyLm9uZXJyb3I9b25lcnJvcjt4aHIuc2VuZChudWxsKX0pLGFzeW5jTG9hZDooZnVuY3Rpb24odXJsLG9ubG9hZCxvbmVycm9yLG5vUnVuRGVwKXtCcm93c2VyLnhockxvYWQodXJsLChmdW5jdGlvbihhcnJheUJ1ZmZlcil7YXNzZXJ0KGFycmF5QnVmZmVyLCdMb2FkaW5nIGRhdGEgZmlsZSAiJyt1cmwrJyIgZmFpbGVkIChubyBhcnJheUJ1ZmZlcikuJyk7b25sb2FkKG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7aWYoIW5vUnVuRGVwKXJlbW92ZVJ1bkRlcGVuZGVuY3koImFsICIrdXJsKX0pLChmdW5jdGlvbihldmVudCl7aWYob25lcnJvcil7b25lcnJvcigpfWVsc2V7dGhyb3cnTG9hZGluZyBkYXRhIGZpbGUgIicrdXJsKyciIGZhaWxlZC4nfX0pKTtpZighbm9SdW5EZXApYWRkUnVuRGVwZW5kZW5jeSgiYWwgIit1cmwpfSkscmVzaXplTGlzdGVuZXJzOltdLHVwZGF0ZVJlc2l6ZUxpc3RlbmVyczooZnVuY3Rpb24oKXt2YXIgY2FudmFzPU1vZHVsZVsiY2FudmFzIl07QnJvd3Nlci5yZXNpemVMaXN0ZW5lcnMuZm9yRWFjaCgoZnVuY3Rpb24obGlzdGVuZXIpe2xpc3RlbmVyKGNhbnZhcy53aWR0aCxjYW52YXMuaGVpZ2h0KX0pKX0pLHNldENhbnZhc1NpemU6KGZ1bmN0aW9uKHdpZHRoLGhlaWdodCxub1VwZGF0ZXMpe3ZhciBjYW52YXM9TW9kdWxlWyJjYW52YXMiXTtCcm93c2VyLnVwZGF0ZUNhbnZhc0RpbWVuc2lvbnMoY2FudmFzLHdpZHRoLGhlaWdodCk7aWYoIW5vVXBkYXRlcylCcm93c2VyLnVwZGF0ZVJlc2l6ZUxpc3RlbmVycygpfSksd2luZG93ZWRXaWR0aDowLHdpbmRvd2VkSGVpZ2h0OjAsc2V0RnVsbFNjcmVlbkNhbnZhc1NpemU6KGZ1bmN0aW9uKCl7aWYodHlwZW9mIFNETCE9InVuZGVmaW5lZCIpe3ZhciBmbGFncz1IRUFQVTMyW1NETC5zY3JlZW4rUnVudGltZS5RVUFOVFVNX1NJWkUqMD4+Ml07ZmxhZ3M9ZmxhZ3N8ODM4ODYwODtIRUFQMzJbU0RMLnNjcmVlbitSdW50aW1lLlFVQU5UVU1fU0laRSowPj4yXT1mbGFnc31Ccm93c2VyLnVwZGF0ZVJlc2l6ZUxpc3RlbmVycygpfSksc2V0V2luZG93ZWRDYW52YXNTaXplOihmdW5jdGlvbigpe2lmKHR5cGVvZiBTREwhPSJ1bmRlZmluZWQiKXt2YXIgZmxhZ3M9SEVBUFUzMltTREwuc2NyZWVuK1J1bnRpbWUuUVVBTlRVTV9TSVpFKjA+PjJdO2ZsYWdzPWZsYWdzJn44Mzg4NjA4O0hFQVAzMltTREwuc2NyZWVuK1J1bnRpbWUuUVVBTlRVTV9TSVpFKjA+PjJdPWZsYWdzfUJyb3dzZXIudXBkYXRlUmVzaXplTGlzdGVuZXJzKCl9KSx1cGRhdGVDYW52YXNEaW1lbnNpb25zOihmdW5jdGlvbihjYW52YXMsd05hdGl2ZSxoTmF0aXZlKXtpZih3TmF0aXZlJiZoTmF0aXZlKXtjYW52YXMud2lkdGhOYXRpdmU9d05hdGl2ZTtjYW52YXMuaGVpZ2h0TmF0aXZlPWhOYXRpdmV9ZWxzZXt3TmF0aXZlPWNhbnZhcy53aWR0aE5hdGl2ZTtoTmF0aXZlPWNhbnZhcy5oZWlnaHROYXRpdmV9dmFyIHc9d05hdGl2ZTt2YXIgaD1oTmF0aXZlO2lmKE1vZHVsZVsiZm9yY2VkQXNwZWN0UmF0aW8iXSYmTW9kdWxlWyJmb3JjZWRBc3BlY3RSYXRpbyJdPjApe2lmKHcvaDxNb2R1bGVbImZvcmNlZEFzcGVjdFJhdGlvIl0pe3c9TWF0aC5yb3VuZChoKk1vZHVsZVsiZm9yY2VkQXNwZWN0UmF0aW8iXSl9ZWxzZXtoPU1hdGgucm91bmQody9Nb2R1bGVbImZvcmNlZEFzcGVjdFJhdGlvIl0pfX1pZigoZG9jdW1lbnRbIndlYmtpdEZ1bGxTY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsibW96RnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1vekZ1bGxzY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJmdWxsU2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsiZnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCJdKT09PWNhbnZhcy5wYXJlbnROb2RlJiZ0eXBlb2Ygc2NyZWVuIT0idW5kZWZpbmVkIil7dmFyIGZhY3Rvcj1NYXRoLm1pbihzY3JlZW4ud2lkdGgvdyxzY3JlZW4uaGVpZ2h0L2gpO3c9TWF0aC5yb3VuZCh3KmZhY3Rvcik7aD1NYXRoLnJvdW5kKGgqZmFjdG9yKX1pZihCcm93c2VyLnJlc2l6ZUNhbnZhcyl7aWYoY2FudmFzLndpZHRoIT13KWNhbnZhcy53aWR0aD13O2lmKGNhbnZhcy5oZWlnaHQhPWgpY2FudmFzLmhlaWdodD1oO2lmKHR5cGVvZiBjYW52YXMuc3R5bGUhPSJ1bmRlZmluZWQiKXtjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIndpZHRoIik7Y2FudmFzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKX19ZWxzZXtpZihjYW52YXMud2lkdGghPXdOYXRpdmUpY2FudmFzLndpZHRoPXdOYXRpdmU7aWYoY2FudmFzLmhlaWdodCE9aE5hdGl2ZSljYW52YXMuaGVpZ2h0PWhOYXRpdmU7aWYodHlwZW9mIGNhbnZhcy5zdHlsZSE9InVuZGVmaW5lZCIpe2lmKHchPXdOYXRpdmV8fGghPWhOYXRpdmUpe2NhbnZhcy5zdHlsZS5zZXRQcm9wZXJ0eSgid2lkdGgiLHcrInB4IiwiaW1wb3J0YW50Iik7Y2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCJoZWlnaHQiLGgrInB4IiwiaW1wb3J0YW50Iil9ZWxzZXtjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIndpZHRoIik7Y2FudmFzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKX19fX0pfTtmdW5jdGlvbiBfX19jdHlwZV9iX2xvYygpe3ZhciBtZT1fX19jdHlwZV9iX2xvYztpZighbWUucmV0KXt2YXIgdmFsdWVzPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwyLDIsMiwyLDIsMiwyLDIsODE5NSw4MTk0LDgxOTQsODE5NCw4MTk0LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDI0NTc3LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDU0NTM2LDU0NTM2LDU0NTM2LDU0NTM2LDU0NTM2LDU0NTM2LDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDU0NzkyLDU0NzkyLDU0NzkyLDU0NzkyLDU0NzkyLDU0NzkyLDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTt2YXIgaTE2c2l6ZT0yO3ZhciBhcnI9X21hbGxvYyh2YWx1ZXMubGVuZ3RoKmkxNnNpemUpO2Zvcih2YXIgaT0wO2k8dmFsdWVzLmxlbmd0aDtpKyspe0hFQVAxNlthcnIraSppMTZzaXplPj4xXT12YWx1ZXNbaV19bWUucmV0PWFsbG9jYXRlKFthcnIrMTI4KmkxNnNpemVdLCJpMTYqIixBTExPQ19OT1JNQUwpfXJldHVybiBtZS5yZXR9ZnVuY3Rpb24gX2ZyZWUoKXt9TW9kdWxlWyJfZnJlZSJdPV9mcmVlO2Z1bmN0aW9uIF9mcmVlbG9jYWxlKGxvY2FsZSl7X2ZyZWUobG9jYWxlKX1mdW5jdGlvbiBfX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uKHNpemUpe3ZhciBwdHI9X21hbGxvYyhzaXplK19fX2N4YV9leGNlcHRpb25faGVhZGVyX3NpemUpO3JldHVybiBwdHIrX19fY3hhX2V4Y2VwdGlvbl9oZWFkZXJfc2l6ZX1mdW5jdGlvbiBfZm1vZCh4LHkpe3JldHVybiB4JXl9dmFyIF9mbW9kbD1fZm1vZDtmdW5jdGlvbiBfY2F0b3BlbihuYW1lLG9mbGFnKXtyZXR1cm4tMX1mdW5jdGlvbiBfY2F0Z2V0cyhjYXRkLHNldF9pZCxtc2dfaWQscyl7cmV0dXJuIHN9ZnVuY3Rpb24gX3NwcmludGYocyxmb3JtYXQsdmFyYXJncyl7cmV0dXJuIF9zbnByaW50ZihzLHVuZGVmaW5lZCxmb3JtYXQsdmFyYXJncyl9ZnVuY3Rpb24gX2FzcHJpbnRmKHMsZm9ybWF0LHZhcmFyZ3Mpe3JldHVybiBfc3ByaW50Zigtcyxmb3JtYXQsdmFyYXJncyl9ZnVuY3Rpb24gX3Zhc3ByaW50ZihzLGZvcm1hdCx2YV9hcmcpe3JldHVybiBfYXNwcmludGYocyxmb3JtYXQsSEVBUDMyW3ZhX2FyZz4+Ml0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0KCl7TW9kdWxlWyJwcmludEVyciJdKCJtaXNzaW5nIGZ1bmN0aW9uOiBfZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0Iik7YWJvcnQoLTEpfWZ1bmN0aW9uIF90aW1lKHB0cil7dmFyIHJldD1NYXRoLmZsb29yKERhdGUubm93KCkvMWUzKTtpZihwdHIpe0hFQVAzMltwdHI+PjJdPXJldH1yZXR1cm4gcmV0fWZ1bmN0aW9uIF9jb3B5c2lnbihhLGIpe3JldHVybiBfX3JlYWxseU5lZ2F0aXZlKGEpPT09X19yZWFsbHlOZWdhdGl2ZShiKT9hOi1hfWZ1bmN0aW9uIF9fX2N0eXBlX3RvdXBwZXJfbG9jKCl7dmFyIG1lPV9fX2N0eXBlX3RvdXBwZXJfbG9jO2lmKCFtZS5yZXQpe3ZhciB2YWx1ZXM9WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwtMSwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDEyMywxMjQsMTI1LDEyNiwxMjcsMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NV07dmFyIGkzMnNpemU9NDt2YXIgYXJyPV9tYWxsb2ModmFsdWVzLmxlbmd0aCppMzJzaXplKTtmb3IodmFyIGk9MDtpPHZhbHVlcy5sZW5ndGg7aSsrKXtIRUFQMzJbYXJyK2kqaTMyc2l6ZT4+Ml09dmFsdWVzW2ldfW1lLnJldD1hbGxvY2F0ZShbYXJyKzEyOCppMzJzaXplXSwiaTMyKiIsQUxMT0NfTk9STUFMKX1yZXR1cm4gbWUucmV0fWZ1bmN0aW9uIF9fX2N4YV9ndWFyZF9hY3F1aXJlKHZhcmlhYmxlKXtpZighSEVBUDhbdmFyaWFibGU+PjBdKXtIRUFQOFt2YXJpYWJsZT4+MF09MTtyZXR1cm4gMX1yZXR1cm4gMH1mdW5jdGlvbiBfX19jdHlwZV90b2xvd2VyX2xvYygpe3ZhciBtZT1fX19jdHlwZV90b2xvd2VyX2xvYztpZighbWUucmV0KXt2YXIgdmFsdWVzPVsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsLTEsMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwLDExMSwxMTIsMTEzLDExNCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1XTt2YXIgaTMyc2l6ZT00O3ZhciBhcnI9X21hbGxvYyh2YWx1ZXMubGVuZ3RoKmkzMnNpemUpO2Zvcih2YXIgaT0wO2k8dmFsdWVzLmxlbmd0aDtpKyspe0hFQVAzMlthcnIraSppMzJzaXplPj4yXT12YWx1ZXNbaV19bWUucmV0PWFsbG9jYXRlKFthcnIrMTI4KmkzMnNpemVdLCJpMzIqIixBTExPQ19OT1JNQUwpfXJldHVybiBtZS5yZXR9dmFyIF9fX2N4YV9jYXVnaHRfZXhjZXB0aW9ucz1bXTtmdW5jdGlvbiBfX19jeGFfYmVnaW5fY2F0Y2gocHRyKXtfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udi51bmNhdWdodF9leGNlcHRpb24tLTtfX19jeGFfY2F1Z2h0X2V4Y2VwdGlvbnMucHVzaChfX19jeGFfbGFzdF90aHJvd25fZXhjZXB0aW9uKTtyZXR1cm4gcHRyfU1vZHVsZVsiX2JpdHNoaWZ0NjRTaGwiXT1fYml0c2hpZnQ2NFNobDtmdW5jdGlvbiBfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYoKXtpZighX19aTktTdDlleGNlcHRpb240d2hhdEV2LmJ1ZmZlcil7dmFyIG5hbWU9InN0ZDo6ZXhjZXB0aW9uIjtfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYuYnVmZmVyPV9tYWxsb2MobmFtZS5sZW5ndGgrMSk7d3JpdGVTdHJpbmdUb01lbW9yeShuYW1lLF9fWk5LU3Q5ZXhjZXB0aW9uNHdoYXRFdi5idWZmZXIpfXJldHVybiBfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYuYnVmZmVyfWZ1bmN0aW9uIF9fWk5TdDlleGNlcHRpb25EMkV2KCl7fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yKCl7TW9kdWxlWyJwcmludEVyciJdKCJtaXNzaW5nIGZ1bmN0aW9uOiBfZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yIik7YWJvcnQoLTEpfXZhciBfY29weXNpZ25sPV9jb3B5c2lnbjtmdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbigpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbiIpO2Fib3J0KC0xKX12YXIgX19aVElTdDlleGNlcHRpb249YWxsb2NhdGUoW2FsbG9jYXRlKFsxLDAsMCwwLDAsMCwwXSwiaTgiLEFMTE9DX1NUQVRJQykrOCwwXSwiaTMyIixBTExPQ19TVEFUSUMpO3ZhciBfX19kc29faGFuZGxlPWFsbG9jYXRlKDEsImkzMioiLEFMTE9DX1NUQVRJQyk7RlMuc3RhdGljSW5pdCgpO19fQVRJTklUX18udW5zaGlmdCh7ZnVuYzooZnVuY3Rpb24oKXtpZighTW9kdWxlWyJub0ZTSW5pdCJdJiYhRlMuaW5pdC5pbml0aWFsaXplZClGUy5pbml0KCl9KX0pO19fQVRNQUlOX18ucHVzaCh7ZnVuYzooZnVuY3Rpb24oKXtGUy5pZ25vcmVQZXJtaXNzaW9ucz1mYWxzZX0pfSk7X19BVEVYSVRfXy5wdXNoKHtmdW5jOihmdW5jdGlvbigpe0ZTLnF1aXQoKX0pfSk7TW9kdWxlWyJGU19jcmVhdGVGb2xkZXIiXT1GUy5jcmVhdGVGb2xkZXI7TW9kdWxlWyJGU19jcmVhdGVQYXRoIl09RlMuY3JlYXRlUGF0aDtNb2R1bGVbIkZTX2NyZWF0ZURhdGFGaWxlIl09RlMuY3JlYXRlRGF0YUZpbGU7TW9kdWxlWyJGU19jcmVhdGVQcmVsb2FkZWRGaWxlIl09RlMuY3JlYXRlUHJlbG9hZGVkRmlsZTtNb2R1bGVbIkZTX2NyZWF0ZUxhenlGaWxlIl09RlMuY3JlYXRlTGF6eUZpbGU7TW9kdWxlWyJGU19jcmVhdGVMaW5rIl09RlMuY3JlYXRlTGluaztNb2R1bGVbIkZTX2NyZWF0ZURldmljZSJdPUZTLmNyZWF0ZURldmljZTtfX19lcnJub19zdGF0ZT1SdW50aW1lLnN0YXRpY0FsbG9jKDQpO0hFQVAzMltfX19lcnJub19zdGF0ZT4+Ml09MDtfX0FUSU5JVF9fLnVuc2hpZnQoe2Z1bmM6KGZ1bmN0aW9uKCl7VFRZLmluaXQoKX0pfSk7X19BVEVYSVRfXy5wdXNoKHtmdW5jOihmdW5jdGlvbigpe1RUWS5zaHV0ZG93bigpfSl9KTtUVFkudXRmOD1uZXcgUnVudGltZS5VVEY4UHJvY2Vzc29yO2lmKEVOVklST05NRU5UX0lTX05PREUpe3ZhciBmcz1yZXF1aXJlKCJmcyIpO05PREVGUy5zdGF0aWNJbml0KCl9X19BVElOSVRfXy5wdXNoKHtmdW5jOihmdW5jdGlvbigpe1NPQ0tGUy5yb290PUZTLm1vdW50KFNPQ0tGUyx7fSxudWxsKX0pfSk7X2ZnZXRjLnJldD1hbGxvY2F0ZShbMF0sImk4IixBTExPQ19TVEFUSUMpO01vZHVsZVsicmVxdWVzdEZ1bGxTY3JlZW4iXT1mdW5jdGlvbiBNb2R1bGVfcmVxdWVzdEZ1bGxTY3JlZW4obG9ja1BvaW50ZXIscmVzaXplQ2FudmFzKXtCcm93c2VyLnJlcXVlc3RGdWxsU2NyZWVuKGxvY2tQb2ludGVyLHJlc2l6ZUNhbnZhcyl9O01vZHVsZVsicmVxdWVzdEFuaW1hdGlvbkZyYW1lIl09ZnVuY3Rpb24gTW9kdWxlX3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jKXtCcm93c2VyLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jKX07TW9kdWxlWyJzZXRDYW52YXNTaXplIl09ZnVuY3Rpb24gTW9kdWxlX3NldENhbnZhc1NpemUod2lkdGgsaGVpZ2h0LG5vVXBkYXRlcyl7QnJvd3Nlci5zZXRDYW52YXNTaXplKHdpZHRoLGhlaWdodCxub1VwZGF0ZXMpfTtNb2R1bGVbInBhdXNlTWFpbkxvb3AiXT1mdW5jdGlvbiBNb2R1bGVfcGF1c2VNYWluTG9vcCgpe0Jyb3dzZXIubWFpbkxvb3AucGF1c2UoKX07TW9kdWxlWyJyZXN1bWVNYWluTG9vcCJdPWZ1bmN0aW9uIE1vZHVsZV9yZXN1bWVNYWluTG9vcCgpe0Jyb3dzZXIubWFpbkxvb3AucmVzdW1lKCl9O01vZHVsZVsiZ2V0VXNlck1lZGlhIl09ZnVuY3Rpb24gTW9kdWxlX2dldFVzZXJNZWRpYSgpe0Jyb3dzZXIuZ2V0VXNlck1lZGlhKCl9O1NUQUNLX0JBU0U9U1RBQ0tUT1A9UnVudGltZS5hbGlnbk1lbW9yeShTVEFUSUNUT1ApO3N0YXRpY1NlYWxlZD10cnVlO1NUQUNLX01BWD1TVEFDS19CQVNFKzUyNDI4ODA7RFlOQU1JQ19CQVNFPURZTkFNSUNUT1A9UnVudGltZS5hbGlnbk1lbW9yeShTVEFDS19NQVgpO2Fzc2VydChEWU5BTUlDX0JBU0U8VE9UQUxfTUVNT1JZLCJUT1RBTF9NRU1PUlkgbm90IGJpZyBlbm91Z2ggZm9yIHN0YWNrIik7dmFyIGN0bHpfaTg9YWxsb2NhdGUoWzgsNyw2LDYsNSw1LDUsNSw0LDQsNCw0LDQsNCw0LDQsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLCJpOCIsQUxMT0NfRFlOQU1JQyk7dmFyIGN0dHpfaTg9YWxsb2NhdGUoWzgsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNiwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw3LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNSwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDYsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDBdLCJpOCIsQUxMT0NfRFlOQU1JQyk7dmFyIE1hdGhfbWluPU1hdGgubWluO2Z1bmN0aW9uIGludm9rZV9paWlpKGluZGV4LGExLGEyLGEzKXt0cnl7cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF9paWlpIl0oaW5kZXgsYTEsYTIsYTMpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2LGE3KXt0cnl7TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYsYTcpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpaWkiXShpbmRleCxhMSxhMixhMyxhNCxhNSl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfaShpbmRleCl7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaSJdKGluZGV4KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV92aShpbmRleCxhMSl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aSJdKGluZGV4LGExKX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV92aWkoaW5kZXgsYTEsYTIpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpIl0oaW5kZXgsYTEsYTIpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWkoaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYsYTcsYTgsYTkpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpaWlpaWlpaSJdKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4LGE5KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV9paShpbmRleCxhMSl7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaWkiXShpbmRleCxhMSl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaWQoaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYsYTcpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpaWlpaWQiXShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaShpbmRleCxhMSxhMixhMyl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpIl0oaW5kZXgsYTEsYTIsYTMpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWQoaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpaWlpZCJdKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV92KGluZGV4KXt0cnl7TW9kdWxlWyJkeW5DYWxsX3YiXShpbmRleCl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4KXt0cnl7cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWkiXShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfaWlpaWkoaW5kZXgsYTEsYTIsYTMsYTQpe3RyeXtyZXR1cm4gTW9kdWxlWyJkeW5DYWxsX2lpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpaWlpaWkiXShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSxhNil7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX2lpaShpbmRleCxhMSxhMil7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaWlpIl0oaW5kZXgsYTEsYTIpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX2lpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSl7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaWlpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQsYTUpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpKGluZGV4LGExLGEyLGEzLGE0KXt0cnl7TW9kdWxlWyJkeW5DYWxsX3ZpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gYXNtUHJpbnRJbnQoeCx5KXtNb2R1bGUucHJpbnQoImludCAiK3grIiwiK3kpfWZ1bmN0aW9uIGFzbVByaW50RmxvYXQoeCx5KXtNb2R1bGUucHJpbnQoImZsb2F0ICIreCsiLCIreSl9dmFyIGFzbT0oZnVuY3Rpb24oZ2xvYmFsLGVudixidWZmZXIpIHsKLy8gRU1TQ1JJUFRFTl9TVEFSVF9BU00KInVzZSBhc20iO3ZhciBhPW5ldyBnbG9iYWwuSW50OEFycmF5KGJ1ZmZlcik7dmFyIGI9bmV3IGdsb2JhbC5JbnQxNkFycmF5KGJ1ZmZlcik7dmFyIGM9bmV3IGdsb2JhbC5JbnQzMkFycmF5KGJ1ZmZlcik7dmFyIGQ9bmV3IGdsb2JhbC5VaW50OEFycmF5KGJ1ZmZlcik7dmFyIGU9bmV3IGdsb2JhbC5VaW50MTZBcnJheShidWZmZXIpO3ZhciBmPW5ldyBnbG9iYWwuVWludDMyQXJyYXkoYnVmZmVyKTt2YXIgZz1uZXcgZ2xvYmFsLkZsb2F0MzJBcnJheShidWZmZXIpO3ZhciBoPW5ldyBnbG9iYWwuRmxvYXQ2NEFycmF5KGJ1ZmZlcik7dmFyIGk9ZW52LlNUQUNLVE9QfDA7dmFyIGo9ZW52LlNUQUNLX01BWHwwO3ZhciBrPWVudi50ZW1wRG91YmxlUHRyfDA7dmFyIGw9ZW52LkFCT1JUfDA7dmFyIG09ZW52LmN0dHpfaTh8MDt2YXIgbj1lbnYuY3Rsel9pOHwwO3ZhciBvPWVudi5fX1pUSVN0OWV4Y2VwdGlvbnwwO3ZhciBwPWVudi5fX19kc29faGFuZGxlfDA7dmFyIHE9ZW52Ll9zdGRlcnJ8MDt2YXIgcj1lbnYuX3N0ZGlufDA7dmFyIHM9ZW52Ll9zdGRvdXR8MDt2YXIgdD0wO3ZhciB1PTA7dmFyIHY9MDt2YXIgdz0wO3ZhciB4PStlbnYuTmFOLHk9K2Vudi5JbmZpbml0eTt2YXIgej0wLEE9MCxCPTAsQz0wLEQ9MC4wLEU9MCxGPTAsRz0wLEg9MC4wO3ZhciBJPTA7dmFyIEo9MDt2YXIgSz0wO3ZhciBMPTA7dmFyIE09MDt2YXIgTj0wO3ZhciBPPTA7dmFyIFA9MDt2YXIgUT0wO3ZhciBSPTA7dmFyIFM9Z2xvYmFsLk1hdGguZmxvb3I7dmFyIFQ9Z2xvYmFsLk1hdGguYWJzO3ZhciBVPWdsb2JhbC5NYXRoLnNxcnQ7dmFyIFY9Z2xvYmFsLk1hdGgucG93O3ZhciBXPWdsb2JhbC5NYXRoLmNvczt2YXIgWD1nbG9iYWwuTWF0aC5zaW47dmFyIFk9Z2xvYmFsLk1hdGgudGFuO3ZhciBaPWdsb2JhbC5NYXRoLmFjb3M7dmFyIF89Z2xvYmFsLk1hdGguYXNpbjt2YXIgJD1nbG9iYWwuTWF0aC5hdGFuO3ZhciBhYT1nbG9iYWwuTWF0aC5hdGFuMjt2YXIgYmE9Z2xvYmFsLk1hdGguZXhwO3ZhciBjYT1nbG9iYWwuTWF0aC5sb2c7dmFyIGRhPWdsb2JhbC5NYXRoLmNlaWw7dmFyIGVhPWdsb2JhbC5NYXRoLmltdWw7dmFyIGZhPWVudi5hYm9ydDt2YXIgZ2E9ZW52LmFzc2VydDt2YXIgaGE9ZW52LmFzbVByaW50SW50O3ZhciBpYT1lbnYuYXNtUHJpbnRGbG9hdDt2YXIgamE9ZW52Lm1pbjt2YXIga2E9ZW52LmpzQ2FsbDt2YXIgbGE9ZW52Lmludm9rZV9paWlpO3ZhciBtYT1lbnYuaW52b2tlX3ZpaWlpaWlpO3ZhciBuYT1lbnYuaW52b2tlX3ZpaWlpaTt2YXIgb2E9ZW52Lmludm9rZV9pO3ZhciBwYT1lbnYuaW52b2tlX3ZpO3ZhciBxYT1lbnYuaW52b2tlX3ZpaTt2YXIgcmE9ZW52Lmludm9rZV92aWlpaWlpaWlpO3ZhciBzYT1lbnYuaW52b2tlX2lpO3ZhciB0YT1lbnYuaW52b2tlX3ZpaWlpaWlkO3ZhciB1YT1lbnYuaW52b2tlX3ZpaWk7dmFyIHZhPWVudi5pbnZva2VfdmlpaWlpZDt2YXIgd2E9ZW52Lmludm9rZV92O3ZhciB4YT1lbnYuaW52b2tlX2lpaWlpaWlpaTt2YXIgeWE9ZW52Lmludm9rZV9paWlpaTt2YXIgemE9ZW52Lmludm9rZV92aWlpaWlpaWk7dmFyIEFhPWVudi5pbnZva2VfdmlpaWlpaTt2YXIgQmE9ZW52Lmludm9rZV9paWk7dmFyIENhPWVudi5pbnZva2VfaWlpaWlpO3ZhciBEYT1lbnYuaW52b2tlX3ZpaWlpO3ZhciBFYT1lbnYuX2ZhYnM7dmFyIEZhPWVudi5fc3NjYW5mO3ZhciBHYT1lbnYuX3B0aHJlYWRfY29uZF93YWl0O3ZhciBIYT1lbnYuX19fY3R5cGVfdG9sb3dlcl9sb2M7dmFyIElhPWVudi5fYXNwcmludGY7dmFyIEphPWVudi5fX2VtYmluZF9yZWdpc3Rlcl92b2lkO3ZhciBLYT1lbnYuX3NlbmQ7dmFyIExhPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldzt2YXIgTWE9ZW52Ll92c3NjYW5mO3ZhciBOYT1lbnYuX19fY3R5cGVfYl9sb2M7dmFyIE9hPWVudi5fX1pTdDl0ZXJtaW5hdGV2O3ZhciBQYT1lbnYuX2Ztb2Q7dmFyIFFhPWVudi5fX19jeGFfZ3VhcmRfYWNxdWlyZTt2YXIgUmE9ZW52Ll9fX3NldEVyck5vO3ZhciBTYT1lbnYuX19fY3hhX2lzX251bWJlcl90eXBlO3ZhciBUYT1lbnYuX19fZ3h4X3BlcnNvbmFsaXR5X3YwO3ZhciBVYT1lbnYuX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcjt2YXIgVmE9ZW52Ll91bmdldGM7dmFyIFdhPWVudi5fX19hc3NlcnRfZmFpbDt2YXIgWGE9ZW52Ll9fX2N4YV9hbGxvY2F0ZV9leGNlcHRpb247dmFyIFlhPWVudi5fX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udjt2YXIgWmE9ZW52Ll9fX2N0eXBlX3RvdXBwZXJfbG9jO3ZhciBfYT1lbnYuX2ZmbHVzaDt2YXIgJGE9ZW52Ll9fX2N4YV9ndWFyZF9yZWxlYXNlO3ZhciBhYj1lbnYuX19hZGREYXlzO3ZhciBiYj1lbnYuX19fZXJybm9fbG9jYXRpb247dmFyIGNiPWVudi5fcHdyaXRlO3ZhciBkYj1lbnYuX3N0cmVycm9yX3I7dmFyIGViPWVudi5fc3RyZnRpbWVfbDt2YXIgZmI9ZW52Ll9fZm9ybWF0U3RyaW5nO3ZhciBnYj1lbnYuX19yZWFsbHlOZWdhdGl2ZTt2YXIgaGI9ZW52Ll9zYnJrO3ZhciBpYj1lbnYuX3VzZWxvY2FsZTt2YXIgamI9ZW52Ll9jYXRnZXRzO3ZhciBrYj1lbnYuX25ld2xvY2FsZTt2YXIgbGI9ZW52Ll9zbnByaW50Zjt2YXIgbWI9ZW52Ll9fX2N4YV9iZWdpbl9jYXRjaDt2YXIgbmI9ZW52Ll9lbXNjcmlwdGVuX21lbWNweV9iaWc7dmFyIG9iPWVudi5fZmlsZW5vO3ZhciBwYj1lbnYuX19lbWJpbmRfcmVnaXN0ZXJfYm9vbDt2YXIgcWI9ZW52Ll9fX3Jlc3VtZUV4Y2VwdGlvbjt2YXIgcmI9ZW52Ll9fX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoO3ZhciBzYj1lbnYuX3N5c2NvbmY7dmFyIHRiPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nO3ZhciB1Yj1lbnYuX3N0cmZ0aW1lO3ZhciB2Yj1lbnYuX19hcnJheVN1bTt2YXIgd2I9ZW52Ll9fX2N4YV90aHJvdzt2YXIgeGI9ZW52Ll9fZW1iaW5kX3JlZ2lzdGVyX2VtdmFsO3ZhciB5Yj1lbnYuX19leGl0O3ZhciB6Yj1lbnYuX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfZnVuY3Rpb247dmFyIEFiPWVudi5fX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXY7dmFyIEJiPWVudi5fcHRocmVhZF9tdXRleF9kZXN0cm95O3ZhciBDYj1lbnYuX3B0aHJlYWRfbXV0ZXhfdW5sb2NrO3ZhciBEYj1lbnYuX2ZyZWFkO3ZhciBFYj1lbnYuX3B0aHJlYWRfY29uZF9icm9hZGNhc3Q7dmFyIEZiPWVudi5fbWtwb3J0O3ZhciBHYj1lbnYuX3NwcmludGY7dmFyIEhiPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9jbGFzczt2YXIgSWI9ZW52Ll92YXNwcmludGY7dmFyIEpiPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZzt2YXIgS2I9ZW52Ll93cml0ZTt2YXIgTGI9ZW52Ll9faXNMZWFwWWVhcjt2YXIgTWI9ZW52Ll9fc2NhblN0cmluZzt2YXIgTmI9ZW52Ll9zdHJlcnJvcjt2YXIgT2I9ZW52Ll9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yO3ZhciBQYj1lbnYuX3JlY3Y7dmFyIFFiPWVudi5fdnNucHJpbnRmO3ZhciBSYj1lbnYuX19aTlN0OWV4Y2VwdGlvbkQyRXY7dmFyIFNiPWVudi5fY29weXNpZ247dmFyIFRiPWVudi5fZmdldGM7dmFyIFViPWVudi5fX19jeGFfZG9lc19pbmhlcml0O3ZhciBWYj1lbnYuX2ZyZWVsb2NhbGU7dmFyIFdiPWVudi5fcmVhZDt2YXIgWGI9ZW52Ll9hYm9ydDt2YXIgWWI9ZW52Ll9jYXRjbG9zZTt2YXIgWmI9ZW52Ll9md3JpdGU7dmFyIF9iPWVudi5fdGltZTt2YXIgJGI9ZW52Ll9wdGhyZWFkX211dGV4X2xvY2s7dmFyIGFjPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9mbG9hdDt2YXIgYmM9ZW52Ll9wcmVhZDt2YXIgY2M9ZW52Ll9hdGV4aXQ7dmFyIGRjPWVudi5fY2F0b3Blbjt2YXIgZWM9ZW52Ll9leGl0O3ZhciBmYz1lbnYuX19nZXRGbG9hdDt2YXIgZ2M9MC4wOwovLyBFTVNDUklQVEVOX1NUQVJUX0ZVTkNTCmZ1bmN0aW9uIEFjKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2k9aSthfDA7aT1pKzcmLTg7cmV0dXJuIGJ8MH1mdW5jdGlvbiBCYygpe3JldHVybiBpfDB9ZnVuY3Rpb24gQ2MoYSl7YT1hfDA7aT1hfWZ1bmN0aW9uIERjKGEsYil7YT1hfDA7Yj1ifDA7aWYoKHR8MCk9PTApe3Q9YTt1PWJ9fWZ1bmN0aW9uIEVjKGIpe2I9YnwwO2Fbaz4+MF09YVtiPj4wXTthW2srMT4+MF09YVtiKzE+PjBdO2FbaysyPj4wXT1hW2IrMj4+MF07YVtrKzM+PjBdPWFbYiszPj4wXX1mdW5jdGlvbiBGYyhiKXtiPWJ8MDthW2s+PjBdPWFbYj4+MF07YVtrKzE+PjBdPWFbYisxPj4wXTthW2srMj4+MF09YVtiKzI+PjBdO2FbayszPj4wXT1hW2IrMz4+MF07YVtrKzQ+PjBdPWFbYis0Pj4wXTthW2srNT4+MF09YVtiKzU+PjBdO2Fbays2Pj4wXT1hW2IrNj4+MF07YVtrKzc+PjBdPWFbYis3Pj4wXX1mdW5jdGlvbiBHYyhhKXthPWF8MDtJPWF9ZnVuY3Rpb24gSGMoKXtyZXR1cm4gSXwwfWZ1bmN0aW9uIEljKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtmPWk7aT1pKzE2fDA7bT1mO2w9U2MoamgoU2MoODM1Miw1MTY4KXwwLGUpfDAsNTE4NCl8MDtqPWNbbCsoKGNbKGNbbD4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO2g9ais0fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1ttPj4yXT0xMzQ1NjtjW20rND4+Ml09MjA4O2NbbSs4Pj4yXT0wO2NnKDEzNDU2LG0pfW09KGNbMTM0NjA+PjJdfDApKyAtMXwwO249Y1tqKzg+PjJdfDA7aWYoKGNbaisxMj4+Ml18MCktbj4+Mj4+PjA+bT4+PjA/KGs9Y1tuKyhtPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7az14Y1tjWyhjW2s+PjJdfDApKzI4Pj4yXSY2M10oaywxMCl8MDtuPWNbaD4+Ml18MDtjW2g+PjJdPW4rIC0xO2lmKChufDApPT0wKXtsY1tjWyhjW2o+PjJdfDApKzg+PjJdJjI1NV0oail9bGgobCxrKTtZZyhsKTt3aGlsZSgxKXtoPXVuKDIwKXwwO2lmKChofDApIT0wKXticmVha31oPWNbNTY2Nl18MDtjWzU2NjZdPWgrMDtpZigoaHwwKT09MCl7Zz0xNDticmVha31zY1toJjMxXSgpfWlmKChnfDApPT0xNCl7bj1YYSg0KXwwO2Nbbj4+Ml09MjI2ODA7d2IobnwwLDIyNzI4LDIwNil9Y1toPj4yXT1kO2NbaCs0Pj4yXT1lO2NbaCs4Pj4yXT0wO2FbaCsxMj4+MF09MDthW2grMTM+PjBdPTA7Y1toKzE2Pj4yXT0wO3doaWxlKDEpe2Q9dW4oMTYpfDA7aWYoKGR8MCkhPTApe2JyZWFrfWU9Y1s1NjY2XXwwO2NbNTY2Nl09ZSswO2lmKChlfDApPT0wKXtnPTIwO2JyZWFrfXNjW2UmMzFdKCl9aWYoKGd8MCk9PTIwKXtuPVhhKDQpfDA7Y1tuPj4yXT0yMjY4MDt3YihufDAsMjI3MjgsMjA2KX1jW2QrND4+Ml09MDtjW2QrOD4+Ml09MDtjW2Q+PjJdPTc0MDg7Y1tkKzEyPj4yXT1oO2NbYj4+Ml09aDtuPWIrNHwwO2U9Y1tuPj4yXXwwO2Nbbj4+Ml09ZDtpZigoZXwwKSE9MCl7bT1lKzR8MDtuPWNbbT4+Ml18MDtjW20+PjJdPW4rIC0xO2lmKChufDApPT0wPyhsY1tjWyhjW2U+PjJdfDApKzg+PjJdJjI1NV0oZSksbT1lKzh8MCxuPWNbbT4+Ml18MCxjW20+PjJdPW4rIC0xLChufDApPT0wKTowKXtsY1tjWyhjW2U+PjJdfDApKzE2Pj4yXSYyNTVdKGUpfWg9Y1tiPj4yXXwwfXdoaWxlKDEpe2U9dW4oMzUyKXwwO2lmKChlfDApIT0wKXticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7Zz0zMTticmVha31zY1tlJjMxXSgpfWlmKChnfDApPT0zMSl7bj1YYSg0KXwwO2Nbbj4+Ml09MjI2ODA7d2IobnwwLDIyNzI4LDIwNil9Y1tlPj4yXT1oO2NbZSs0Pj4yXT1oO2NbZSs4Pj4yXT0wO2NbZSsxMj4+Ml09MDtqPXVuKDEwNDg2NDQpfDA7aD1qKzY4Ji02NDtjW2grIC00Pj4yXT1qO2NbZSsxNj4+Ml09aDtoPWUrMjc5fDA7YVtoPj4wXT0wO2FbaCsxPj4wXT0wO2g9ZSsyODF8MDthW2g+PjBdPTA7YVtoKzE+PjBdPTA7YVtoKzI+PjBdPTA7YVtoKzM+PjBdPTA7aD1lKzM0NHwwO2o9ZSsyODh8MDtkPWorNTZ8MDtkb3tjW2o+PjJdPTA7aj1qKzR8MH13aGlsZSgoanwwKTwoZHwwKSk7bj1oO2Nbbj4+Ml09LTE7Y1tuKzQ+PjJdPS0xO29lKGUpO3doaWxlKDEpe2Q9dW4oMTYpfDA7aWYoKGR8MCkhPTApe2JyZWFrfWQ9Y1s1NjY2XXwwO2NbNTY2Nl09ZCswO2lmKChkfDApPT0wKXtnPTM3O2JyZWFrfXNjW2QmMzFdKCl9aWYoKGd8MCk9PTM3KXtuPVhhKDQpfDA7Y1tuPj4yXT0yMjY4MDt3YihufDAsMjI3MjgsMjA2KX1jW2QrND4+Ml09MDtjW2QrOD4+Ml09MDtjW2Q+PjJdPTcxMjg7Y1tkKzEyPj4yXT1lO2NbYis4Pj4yXT1lO249YisxMnwwO2c9Y1tuPj4yXXwwO2Nbbj4+Ml09ZDtpZigoZ3wwKT09MCl7aT1mO3JldHVybn1tPWcrNHwwO249Y1ttPj4yXXwwO2NbbT4+Ml09bisgLTE7aWYoKG58MCkhPTApe2k9ZjtyZXR1cm59bGNbY1soY1tnPj4yXXwwKSs4Pj4yXSYyNTVdKGcpO209Zys4fDA7bj1jW20+PjJdfDA7Y1ttPj4yXT1uKyAtMTtpZigobnwwKSE9MCl7aT1mO3JldHVybn1sY1tjWyhjW2c+PjJdfDApKzE2Pj4yXSYyNTVdKGcpO2k9ZjtyZXR1cm59bj1YYSg0KXwwO2Nbbj4+Ml09MjEzMDQ7d2IobnwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gSmMoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTA7aD1pO2k9aSsxNzZ8MDtnPWg7az1oKzMyfDA7aj1oKzI0fDA7Zj1oKzEyfDA7Yj1jW2IrOD4+Ml18MDttPWIrMzM2fDA7Qj1tO0M9YisyNTl8MDtsPWIrMzIwfDA7aWYoKCEoKGNbQis0Pj4yXXwwKT09MD8oY1tCPj4yXXwwKT09KGRbQz4+MF18ZFtDKzE+PjBdPDw4fGRbQysyPj4wXTw8MTZ8ZFtDKzM+PjBdPDwyNHwwKTowKT8obj1jW2w+PjJdfDAsKG58MCkhPTApOjApPyhjW2IrMzEyPj4yXXwwKSE9MDowKXt6PW47Qj1jW3o+PjJdfDA7Qj1jW0I+PjJdfDA7bWNbQiYxMjddKHosZSk7ej1tO0I9ejtCPWNbQj4+Ml18MDt6PXorNHwwO3o9Y1t6Pj4yXXwwO3o9SW4oQnwwLHp8MCwxLDApfDA7Qj1JO0M9bTtBPUM7Y1tBPj4yXT16O0M9Qys0fDA7Y1tDPj4yXT1CO2k9aDtyZXR1cm59Y1tsPj4yXT0wO249YiszMjR8MDtwPWNbbj4+Ml18MDtjW24+PjJdPTA7aWYoKChwfDApIT0wPyhCPXArNHwwLEM9Y1tCPj4yXXwwLGNbQj4+Ml09QysgLTEsKEN8MCk9PTApOjApPyhsY1tjWyhjW3A+PjJdfDApKzg+PjJdJjI1NV0ocCksQj1wKzh8MCxDPWNbQj4+Ml18MCxjW0I+PjJdPUMrIC0xLChDfDApPT0wKTowKXtsY1tjWyhjW3A+PjJdfDApKzE2Pj4yXSYyNTVdKHApfXM9YiszMTJ8MDtjW3M+PjJdPTA7cj1iKzMxNnwwO3A9Y1tyPj4yXXwwO2Nbcj4+Ml09MDtpZigoKHB8MCkhPTA/KEI9cCs0fDAsQz1jW0I+PjJdfDAsY1tCPj4yXT1DKyAtMSwoQ3wwKT09MCk6MCk/KGxjW2NbKGNbcD4+Ml18MCkrOD4+Ml0mMjU1XShwKSxCPXArOHwwLEM9Y1tCPj4yXXwwLGNbQj4+Ml09QysgLTEsKEN8MCk9PTApOjApe2xjW2NbKGNbcD4+Ml18MCkrMTY+PjJdJjI1NV0ocCl9d2hpbGUoMSl7cD11bigxMil8MDtpZigocHwwKSE9MCl7YnJlYWt9cD1jWzU2NjZdfDA7Y1s1NjY2XT1wKzA7aWYoKHB8MCk9PTApe289MTU7YnJlYWt9c2NbcCYzMV0oKX1pZigob3wwKT09MTUpe0M9WGEoNCl8MDtjW0M+PjJdPTIyNjgwO3diKEN8MCwyMjcyOCwyMDYpfWNbcD4+Ml09Yis0O2NbcCs0Pj4yXT0wO2NbcCs4Pj4yXT0tMTt3aGlsZSgxKXt0PXVuKDE2KXwwO2lmKCh0fDApIT0wKXticmVha310PWNbNTY2Nl18MDtjWzU2NjZdPXQrMDtpZigodHwwKT09MCl7bz0yMTticmVha31zY1t0JjMxXSgpfWlmKChvfDApPT0yMSl7Qz1YYSg0KXwwO2NbQz4+Ml09MjI2ODA7d2IoQ3wwLDIyNzI4LDIwNil9Y1t0KzQ+PjJdPTA7Y1t0Kzg+PjJdPTA7Y1t0Pj4yXT00ODQwO2NbdCsxMj4+Ml09cDtjW3M+PjJdPXA7dT1jW3I+PjJdfDA7Y1tyPj4yXT10O2lmKCh1fDApIT0wKXtCPXUrNHwwO0M9Y1tCPj4yXXwwO2NbQj4+Ml09QysgLTE7aWYoKEN8MCk9PTA/KGxjW2NbKGNbdT4+Ml18MCkrOD4+Ml0mMjU1XSh1KSxCPXUrOHwwLEM9Y1tCPj4yXXwwLGNbQj4+Ml09QysgLTEsKEN8MCk9PTApOjApe2xjW2NbKGNbdT4+Ml18MCkrMTY+PjJdJjI1NV0odSl9cD1jW3M+PjJdfDB9eT1rKzY0fDA7cz1rKzh8MDtjW3M+PjJdPTQ1MjA7dT1rKzEyfDA7Y1trPj4yXT00NjUyO2NbeT4+Ml09NDY3MjtjW2srND4+Ml09MDtyPWsrNjR8MDtjW2srODg+PjJdPXU7Y1trKzgwPj4yXT0wO2Nbays4ND4+Ml09MDtjW2srNjg+PjJdPTQwOTg7Y1trKzc2Pj4yXT0wO2Nbays3Mj4+Ml09Njt4PWsrOTJ8MDt0PWsrOTZ8MDt3PXQrNDB8MDtkb3tjW3Q+PjJdPTA7dD10KzR8MH13aGlsZSgodHwwKTwod3wwKSk7WGsoeCk7Y1trKzEzNj4+Ml09MDtjW2srMTQwPj4yXT0tMTtjW2s+PjJdPTQ1MDA7Y1t5Pj4yXT00NTQwO2Nbcz4+Ml09NDUyMDtjW3U+PjJdPTEwNjY0O3Q9aysxNnwwO1hrKHQpO3g9aysyMHwwO2NbeCswPj4yXT0wO2NbeCs0Pj4yXT0wO2NbeCs4Pj4yXT0wO2NbeCsxMj4+Ml09MDtjW3grMTY+PjJdPTA7Y1t4KzIwPj4yXT0wO2NbdT4+Ml09NDY4ODt1PWsrNDR8MDt5PWsrNjB8MDtjW3UrMD4+Ml09MDtjW3UrND4+Ml09MDtjW3UrOD4+Ml09MDtjW3UrMTI+PjJdPTA7Y1t5Pj4yXT0yNDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDthW3UrMT4+MF09MDtpZigoYVt1Pj4wXSYxKT09MCl7YVt1Pj4wXT0wfWVsc2V7Y1trKzQ4Pj4yXT0wfXc9ays1NnwwO2Nbdz4+Ml09MDt6PWFbdT4+MF18MDtpZigoeiYxKT09MCl7QT11KygoeiYyNTUpPj4+MSkrMXwwO2Nbdz4+Ml09QTt6PXUrMXwwfWVsc2V7ej1jW2srNTI+PjJdfDA7QT16KyhjW2srNDg+PjJdfDApfDA7Y1t3Pj4yXT1BfWNbeD4+Ml09ejtjW2srMjQ+PjJdPXo7Y1trKzI4Pj4yXT1BO0M9YVt1Pj4wXXwwO2lmKChDJjEpPT0wKXt6PShDJjI1NSk+Pj4xO2Nbdz4+Ml09dSt6KzE7QT0xMH1lbHNle3o9Y1trKzQ4Pj4yXXwwO2Nbdz4+Ml09KGNbays1Mj4+Ml18MCkrejtBPWNbdT4+Ml18MDtDPUEmMjU1O0E9KEEmLTIpKyAtMXwwfUI9KEMmMSk9PTA7aWYoQil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1trKzQ4Pj4yXXwwfWRve2lmKCEoQz4+PjA8QT4+PjApKXtpZihCKXthW3UrQSsxPj4wXT0wO2FbdT4+MF09QTw8MTticmVha31lbHNle2FbKGNbays1Mj4+Ml18MCkrQT4+MF09MDtjW2srNDg+PjJdPUE7YnJlYWt9fWVsc2V7aGcodSxBLUN8MCl9fXdoaWxlKDApO0I9YVt1Pj4wXXwwO2lmKChCJjEpPT0wKXtBPXUrMXwwO0I9KEImMjU1KT4+PjF9ZWxzZXtBPWNbays1Mj4+Ml18MDtCPWNbays0OD4+Ml18MH1DPWsrMzZ8MDtjW0M+PjJdPUE7Y1trKzMyPj4yXT1BO2Nbays0MD4+Ml09QStCO2lmKChjW3k+PjJdJjN8MCkhPTApe2NbQz4+Ml09QSt6fWlmKCEoKGFbZz4+MF0mMSk9PTApPyh2PWNbZys4Pj4yXXwwLCh2fDApIT0wKTowKXt2bih2KX1BPWNbYiszMDA+PjJdfDA7dj1jW2IrMzA0Pj4yXXwwO2lmKChBfDApIT0odnwwKSl7ej1rKzh8MDtkb3tCPWNbQT4+Ml18MDtDPWNbQSs0Pj4yXXwwO0Q9Y1tBKzg+PjJdfDA7aWgoU2MoaWgoU2MoaWgoU2Moeiw0NDY0KXwwLEQpfDAsNDQ3Mil8MCxCKXwwLDQ0ODApfDAsQyl8MDtBPUErMTJ8MH13aGlsZSgoQXwwKSE9KHZ8MCkpfXY9Y1t5Pj4yXXwwO2Rve2lmKCh2JjE2fDApPT0wKXtpZigodiY4fDApPT0wKXtjW2YrMD4+Ml09MDtjW2YrND4+Ml09MDtjW2YrOD4+Ml09MDticmVha314PWNbeD4+Ml18MDt3PWNbaysyOD4+Ml18MDt2PXg7QT13LXZ8MDtpZihBPj4+MD40Mjk0OTY3Mjc5KXtkZygpfWRve2lmKEE+Pj4wPDExKXthW2Y+PjBdPUE8PDE7Qj1mKzF8MH1lbHNle3o9QSsxNiYtMTY7eT0oenwwKT09MD8xOno7d2hpbGUoMSl7Qj11bih5KXwwO2lmKChCfDApIT0wKXtvPTkzO2JyZWFrfUI9Y1s1NjY2XXwwO2NbNTY2Nl09QiswO2lmKChCfDApPT0wKXticmVha31zY1tCJjMxXSgpfWlmKChvfDApPT05Myl7Y1tmKzg+PjJdPUI7Y1tmPj4yXT16fDE7Y1tmKzQ+PjJdPUE7YnJlYWt9RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKCh4fDApIT0od3wwKSl7bz1CO3doaWxlKDEpe2Fbbz4+MF09YVt4Pj4wXXwwO3g9eCsxfDA7aWYoKHh8MCk9PSh3fDApKXticmVha31lbHNle289bysxfDB9fUI9QisodysoMC12KSl8MH1hW0I+PjBdPTB9ZWxzZXt4PWNbdz4+Ml18MDt2PWNbayszNj4+Ml18MDtpZih4Pj4+MDx2Pj4+MCl7Y1t3Pj4yXT12fWVsc2V7dj14fXg9Y1trKzMyPj4yXXwwO3c9eDt6PXYtd3wwO2lmKHo+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9ZG97aWYoej4+PjA8MTEpe2FbZj4+MF09ejw8MTtCPWYrMXwwfWVsc2V7eT16KzE2Ji0xNjtBPSh5fDApPT0wPzE6eTt3aGlsZSgxKXtCPXVuKEEpfDA7aWYoKEJ8MCkhPTApe289NzY7YnJlYWt9Qj1jWzU2NjZdfDA7Y1s1NjY2XT1CKzA7aWYoKEJ8MCk9PTApe2JyZWFrfXNjW0ImMzFdKCl9aWYoKG98MCk9PTc2KXtjW2YrOD4+Ml09QjtjW2Y+PjJdPXl8MTtjW2YrND4+Ml09ejticmVha31EPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKHh8MCkhPSh2fDApKXtvPUI7d2hpbGUoMSl7YVtvPj4wXT1hW3g+PjBdfDA7eD14KzF8MDtpZigoeHwwKT09KHZ8MCkpe2JyZWFrfWVsc2V7bz1vKzF8MH19Qj1CKyh2KygwLXcpKXwwfWFbQj4+MF09MH19d2hpbGUoMCk7Y1trPj4yXT00NTAwO2Nbays2ND4+Ml09NDU0MDtjW3M+PjJdPTQ1MjA7bz1rKzEyfDA7Y1tvPj4yXT00Njg4O2lmKCEoKGFbdT4+MF0mMSk9PTApPyhxPWNbays1Mj4+Ml18MCwocXwwKSE9MCk6MCl7dm4ocSl9Y1tvPj4yXT0xMDY2NDtvPWNbdD4+Ml18MDtDPW8rNHwwO0Q9Y1tDPj4yXXwwO2NbQz4+Ml09RCsgLTE7aWYoKER8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1yZyhyKTtxPWFbZj4+MF18MDtyPShxJjEpPT0wO2lmKHIpe3Q9KHEmMjU1KT4+PjE7dj1mKzF8MH1lbHNle3Q9Y1tmKzQ+PjJdfDA7dj1jW2YrOD4+Ml18MH1zPXQ+Pj4wPjc7bz1zPzc6dDthOmRve2lmKChvfDApPT0wKXtvPTExMH1lbHNle3U9MTkyO3doaWxlKDEpe2lmKChhW3Y+PjBdfDApIT0oYVt1Pj4wXXwwKSl7bz0xMzA7YnJlYWsgYX1vPW8rIC0xfDA7aWYoKG98MCk9PTApe289MTEwO2JyZWFrfWVsc2V7dj12KzF8MDt1PXUrMXwwfX19fXdoaWxlKDApO2Rve2lmKChvfDApPT0xMTApe2lmKHQ+Pj4wPjYmKHNeMSkpe3doaWxlKDEpe2o9dW4oNDc4OCl8MDtpZigoanwwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe289MTE0O2JyZWFrfXNjW2cmMzFdKCl9aWYoKG98MCk9PTExNCl7RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9ZmQoaik7YVtqKzQ3ODQ+PjBdPTE7d2hpbGUoMSl7Zz11bigxMil8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe289MTIxO2JyZWFrfXNjW2cmMzFdKCl9aWYoKG98MCk9PTEyMSl7RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9Y1tnPj4yXT0zNjA4O2NbZys0Pj4yXT1wO2NbZys4Pj4yXT1qO3doaWxlKDEpe2o9dW4oMTYpfDA7aWYoKGp8MCkhPTApe289MTI5O2JyZWFrfWo9Y1s1NjY2XXwwO2NbNTY2Nl09aiswO2lmKChqfDApPT0wKXticmVha31zY1tqJjMxXSgpfWlmKChvfDApPT0xMjkpe2Nbais0Pj4yXT0wO2Nbais4Pj4yXT0wO2Nbaj4+Ml09Mzg3MjtjW2orMTI+PjJdPWc7YnJlYWt9RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9ZWxzZXtvPTEzMH19fXdoaWxlKDApO2I6ZG97aWYoKG98MCk9PTEzMCl7aWYocil7dD0ocSYyNTUpPj4+MTt3PWYrMXwwfWVsc2V7dD1jW2YrND4+Ml18MDt3PWNbZis4Pj4yXXwwfXM9dD4+PjA+MTM7dT1zPzEzOnQ7Yzpkb3tpZigodXwwKT09MCl7bz0xMzZ9ZWxzZXt2PTIwMDt3aGlsZSgxKXtpZigoYVt3Pj4wXXwwKSE9KGFbdj4+MF18MCkpe2JyZWFrIGN9dT11KyAtMXwwO2lmKCh1fDApPT0wKXtvPTEzNjticmVha31lbHNle3c9dysxfDA7dj12KzF8MH19fX13aGlsZSgwKTtkb3tpZigob3wwKT09MTM2KXtpZighKHQ+Pj4wPjEyJihzXjEpKSl7YnJlYWt9d2hpbGUoMSl7aj11big1MTE2KXwwO2lmKChqfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0xNDA7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MTQwKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1mZChqKTtlZChqKzQ3ODR8MCk7Y1tqKzQ5NTI+PjJdPTMyO2Nbais0OTU2Pj4yXT05O2Nbais0OTYwPj4yXT04O2Nbais0OTY0Pj4yXT0wO2Nbais0OTg0Pj4yXT0wO2Nbais0OTg4Pj4yXT0wO2Nbais0OTkyPj4yXT0wO2Nbais1MDA4Pj4yXT0xO2Nbais1MDEyPj4yXT0yO2Nbais1MDA0Pj4yXT00MDk2O2Nbais1ZTM+PjJdPTQ7Y1tqKzQ5OTY+PjJdPTQ7Y1tqKzUwMTY+PjJdPTA7Y1tqKzUwMjA+PjJdPTA7Y1tqKzUwMjQ+PjJdPTA7Y1tqKzQ5Njg+PjJdPTMyO2Nbais0OTcyPj4yXT0wO2Nbais0OTc2Pj4yXT0tMjE0NzQ4MzY0ODtjW2orNDk4MD4+Ml09MjE0NzQ4MzY0NztjW2orNDk0OD4+Ml09MDtjW2orNTAzMj4+Ml09MzI7Y1tqKzUwMzY+PjJdPTk7Y1tqKzUwNDA+PjJdPTg7Y1tqKzUwNDQ+PjJdPTA7Y1tqKzUwNjQ+PjJdPTA7Y1tqKzUwNjg+PjJdPTA7Y1tqKzUwNzI+PjJdPTA7Y1tqKzUwODg+PjJdPTE7Y1tqKzUwOTI+PjJdPTI7Y1tqKzUwODQ+PjJdPTQwOTY7Y1tqKzUwODA+PjJdPTQ7Y1tqKzUwNzY+PjJdPTQ7Y1tqKzUwOTY+PjJdPTA7Y1tqKzUxMDA+PjJdPTA7Y1tqKzUxMDQ+PjJdPTA7Y1tqKzUwNDg+PjJdPTMyO2Nbais1MDUyPj4yXT0wO2Nbais1MDU2Pj4yXT0tMjE0NzQ4MzY0ODtjW2orNTA2MD4+Ml09MjE0NzQ4MzY0NztjW2orNTAyOD4+Ml09MDthW2orNTEwOD4+MF09MDthW2orNTEwOT4+MF09MDthW2orNTExMj4+MF09MTt3aGlsZSgxKXtnPXVuKDEyKXwwO2lmKChnfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0xNDg7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MTQ4KXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1jW2c+PjJdPTI2NjQ7Y1tnKzQ+PjJdPXA7Y1tnKzg+PjJdPWo7d2hpbGUoMSl7aj11bigxNil8MDtpZigoanwwKSE9MCl7bz0xNTY7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2JyZWFrfXNjW2omMzFdKCl9aWYoKG98MCk9PTE1Nil7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7Y1tqPj4yXT0yOTUyO2NbaisxMj4+Ml09ZzticmVhayBifUQ9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihyKXt0PShxJjI1NSk+Pj4xO3Y9ZisxfDB9ZWxzZXt0PWNbZis0Pj4yXXwwO3Y9Y1tmKzg+PjJdfDB9cz10Pj4+MD4xMzt1PXM/MTM6dDtkOmRve2lmKCh1fDApPT0wKXtvPTE2M31lbHNle3c9MjE2O3doaWxlKDEpe2lmKChhW3Y+PjBdfDApIT0oYVt3Pj4wXXwwKSl7YnJlYWsgZH11PXUrIC0xfDA7aWYoKHV8MCk9PTApe289MTYzO2JyZWFrfWVsc2V7dj12KzF8MDt3PXcrMXwwfX19fXdoaWxlKDApO2Rve2lmKChvfDApPT0xNjMpe2lmKCEodD4+PjA+MTImKHNeMSkpKXticmVha313aGlsZSgxKXtqPXVuKDUxMDQpfDA7aWYoKGp8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtvPTE2NzticmVha31zY1tnJjMxXSgpfWlmKChvfDApPT0xNjcpe0Q9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfWZkKGopO2JkKGorNDc4NHwwKTthW2orNTEwMD4+MF09MTt3aGlsZSgxKXtnPXVuKDEyKXwwO2lmKChnfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0xNzU7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MTc1KXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1jW2c+PjJdPTE3MjA7Y1tnKzQ+PjJdPXA7Y1tnKzg+PjJdPWo7d2hpbGUoMSl7aj11bigxNil8MDtpZigoanwwKSE9MCl7bz0xODM7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2JyZWFrfXNjW2omMzFdKCl9aWYoKG98MCk9PTE4Myl7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7Y1tqPj4yXT0yMDA4O2NbaisxMj4+Ml09ZzticmVhayBifUQ9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihyKXtyPShxJjI1NSk+Pj4xO3Q9ZisxfDB9ZWxzZXtyPWNbZis0Pj4yXXwwO3Q9Y1tmKzg+PjJdfDB9cT1yPj4+MD4xOTtzPXE/MTk6cjtlOmRve2lmKChzfDApPT0wKXtvPTE5MH1lbHNle3U9MjMyO3doaWxlKDEpe2lmKChhW3Q+PjBdfDApIT0oYVt1Pj4wXXwwKSl7YnJlYWsgZX1zPXMrIC0xfDA7aWYoKHN8MCk9PTApe289MTkwO2JyZWFrfWVsc2V7dD10KzF8MDt1PXUrMXwwfX19fXdoaWxlKDApO2Rve2lmKChvfDApPT0xOTApe2lmKCEocj4+PjA+MTgmKHFeMSkpKXticmVha313aGlsZSgxKXtqPXVuKDU0MzIpfDA7aWYoKGp8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtvPTE5NDticmVha31zY1tnJjMxXSgpfWlmKChvfDApPT0xOTQpe0Q9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfWZkKGopO2VkKGorNDc4NHwwKTtjW2orNDk1Mj4+Ml09MzI7Y1tqKzQ5NTY+PjJdPTk7Y1tqKzQ5NjA+PjJdPTg7Y1tqKzQ5NjQ+PjJdPTA7Y1tqKzQ5ODQ+PjJdPTA7Y1tqKzQ5ODg+PjJdPTA7Y1tqKzQ5OTI+PjJdPTA7Y1tqKzUwMDg+PjJdPTE7Y1tqKzUwMTI+PjJdPTI7Y1tqKzUwMDQ+PjJdPTQwOTY7Y1tqKzVlMz4+Ml09NDtjW2orNDk5Nj4+Ml09NDtjW2orNTAxNj4+Ml09MDtjW2orNTAyMD4+Ml09MDtjW2orNTAyND4+Ml09MDtjW2orNDk2OD4+Ml09MzI7Y1tqKzQ5NzI+PjJdPTA7Y1tqKzQ5NzY+PjJdPS0yMTQ3NDgzNjQ4O2Nbais0OTgwPj4yXT0yMTQ3NDgzNjQ3O2Nbais0OTQ4Pj4yXT0wO2Nbais1MDMyPj4yXT0zMjtjW2orNTAzNj4+Ml09OTtjW2orNTA0MD4+Ml09ODtjW2orNTA0ND4+Ml09MDtjW2orNTA2ND4+Ml09MDtjW2orNTA2OD4+Ml09MDtjW2orNTA3Mj4+Ml09MDtjW2orNTA4OD4+Ml09MTtjW2orNTA5Mj4+Ml09MjtjW2orNTA4ND4+Ml09NDA5NjtjW2orNTA4MD4+Ml09NDtjW2orNTA3Nj4+Ml09NDtjW2orNTA5Nj4+Ml09MDtjW2orNTEwMD4+Ml09MDtjW2orNTEwND4+Ml09MDtjW2orNTA0OD4+Ml09MzI7Y1tqKzUwNTI+PjJdPTA7Y1tqKzUwNTY+PjJdPS0yMTQ3NDgzNjQ4O2Nbais1MDYwPj4yXT0yMTQ3NDgzNjQ3O2Nbais1MDI4Pj4yXT0wO2Fbais1MTA4Pj4wXT0wO2Fbais1MTA5Pj4wXT0wO2JkKGorNTExMnwwKTthW2orNTQyOD4+MF09MTt3aGlsZSgxKXtnPXVuKDEyKXwwO2lmKChnfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0yMDM7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MjAzKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1jW2c+PjJdPTQyNDtjW2crND4+Ml09cDtjW2crOD4+Ml09ajt3aGlsZSgxKXtqPXVuKDE2KXwwO2lmKChqfDApIT0wKXtvPTIxMTticmVha31qPWNbNTY2Nl18MDtjWzU2NjZdPWorMDtpZigoanwwKT09MCl7YnJlYWt9c2NbaiYzMV0oKX1pZigob3wwKT09MjExKXtjW2orND4+Ml09MDtjW2orOD4+Ml09MDtjW2o+PjJdPTEwMDg7Y1tqKzEyPj4yXT1nO2JyZWFrIGJ9RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2g9U2MoODM1MiwyNTYpfDA7YVtrPj4wXT0wO2Nbays0Pj4yXT1oO2U9Y1soY1toPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2grKGUrMTYpPj4yXXwwKT09MCl7ZT1jW2grKGUrNzIpPj4yXXwwO2lmKChlfDApIT0wKXtZZyhlKX1hW2s+PjBdPTE7ZT1hW2Y+PjBdfDA7ZG97aWYoKGUmMSk9PTApe289KGUmMjU1KT4+PjE7bT1jWyhjW2g+PjJdfDApKyAtMTI+PjJdfDA7bD1jW2grKG0rMjQpPj4yXXwwO249ZisxfDA7aWYoKGNbaCsobSs0KT4+Ml0mMTc2fDApIT0zMil7ZT1uO2I9bzticmVha31lPW47Yj1vO249ZitvKzF8MH1lbHNle249Y1tmKzQ+PjJdfDA7bT1jWyhjW2g+PjJdfDApKyAtMTI+PjJdfDA7bD1jW2grKG0rMjQpPj4yXXwwO2Y9Y1tmKzg+PjJdfDA7aWYoKGNbaCsobSs0KT4+Ml0mMTc2fDApIT0zMil7ZT1mO2I9bjtuPWY7YnJlYWt9ZT1mO2I9bjtuPWYrbnwwfX13aGlsZSgwKTtmPWgrbXwwO289aCsobSs3Nil8MDtwPWNbbz4+Ml18MDtmOmRve2lmKChwfDApPT0tMSl7cD1jW2grKG0rMjgpPj4yXXwwO209cCs0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tnPj4yXT0xMzQ1NjtjW2crND4+Ml09MjA4O2NbZys4Pj4yXT0wO2NnKDEzNDU2LGcpfXE9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3I9Y1twKzg+PjJdfDA7ZG97aWYoKGNbcCsxMj4+Ml18MCktcj4+Mj4+PjA+cT4+PjApe3E9Y1tyKyhxPDwyKT4+Ml18MDtpZigocXwwKT09MCl7YnJlYWt9cT14Y1tjWyhjW3E+PjJdfDApKzI4Pj4yXSY2M10ocSwzMil8MDtEPWNbbT4+Ml18MDtjW20+PjJdPUQrIC0xO2lmKChEfDApPT0wKXtsY1tjWyhjW3A+PjJdfDApKzg+PjJdJjI1NV0ocCl9cD1xPDwyND4+MjQ7Y1tvPj4yXT1wO2JyZWFrIGZ9fXdoaWxlKDApO0Q9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtXYyhqLGwsZSxuLGUrYnwwLGYscCYyNTUpO2lmKChjW2o+PjJdfDApIT0wKXticmVha31EPWNbKGNbaD4+Ml18MCkrIC0xMj4+Ml18MDtxZyhoK0R8MCxjW2grKEQrMTYpPj4yXXw1KX19d2hpbGUoMCk7Z2goayk7Zj1jW2grKChjWyhjW2g+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtlPWYrNHwwO2NbZT4+Ml09KGNbZT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZz4+Ml09MTM0NTY7Y1tnKzQ+PjJdPTIwODtjW2crOD4+Ml09MDtjZygxMzQ1NixnKX1qPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtnPWNbZis4Pj4yXXwwO2Rve2lmKChjW2YrMTI+PjJdfDApLWc+PjI+Pj4wPmo+Pj4wKXtnPWNbZysoajw8Mik+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWc9eGNbY1soY1tnPj4yXXwwKSsyOD4+Ml0mNjNdKGcsMTApfDA7RD1jW2U+PjJdfDA7Y1tlPj4yXT1EKyAtMTtpZigoRHwwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfWxoKGgsZyk7WWcoaCk7Zj1YYSg4KXwwO2NbZj4+Ml09OTkyODt3aGlsZSgxKXtnPXVuKDQ1KXwwO2lmKChnfDApIT0wKXtvPTI1MzticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0yNTE7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MjUxKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1lbHNlIGlmKChvfDApPT0yNTMpe2NbZys0Pj4yXT0zMjtjW2c+PjJdPTMyO3Q9ZysxMnwwO2NbZis0Pj4yXT10O2NbZys4Pj4yXT0wO3Q9dCswfDA7Zz0zMjB8MDt3PXQrMzN8MDtkb3thW3Q+PjBdPWFbZz4+MF18MDt0PXQrMXwwO2c9ZysxfDB9d2hpbGUoKHR8MCk8KHd8MCkpO2NbZj4+Ml09MzY4O3diKGZ8MCwzMDQsMjIpfX19d2hpbGUoMCk7RD1YYSg0KXwwO2NbRD4+Ml09MjEzMDQ7d2IoRHwwLDIxMzc2LDE5Nil9fXdoaWxlKDApO2Rve2lmKCEoKGFbZj4+MF0mMSk9PTApKXtmPWNbZis4Pj4yXXwwO2lmKChmfDApPT0wKXticmVha312bihmKX19d2hpbGUoMCk7Y1tsPj4yXT1nO2Y9Y1tuPj4yXXwwO2Nbbj4+Ml09ajtkb3tpZigoZnwwKSE9MCl7Qz1mKzR8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXticmVha31sY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZik7Qz1mKzh8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXticmVha31sY1tjWyhjW2Y+PjJdfDApKzE2Pj4yXSYyNTVdKGYpfX13aGlsZSgwKTtBPWIrMzI4fDA7Qz1BO0M9SW4oY1tDPj4yXXwwLGNbQys0Pj4yXXwwLDEsMCl8MDtjW0E+PjJdPUM7Y1tBKzQ+PjJdPUk7QT1tO2NbQT4+Ml09MDtjW0ErND4+Ml09MDtBPWNbbD4+Ml18MDtDPWNbQT4+Ml18MDtDPWNbQz4+Ml18MDttY1tDJjEyN10oQSxlKTtBPW07Qz1BO0M9Y1tDPj4yXXwwO0E9QSs0fDA7QT1jW0E+PjJdfDA7QT1JbihDfDAsQXwwLDEsMCl8MDtDPUk7RD1tO0I9RDtjW0I+PjJdPUE7RD1EKzR8MDtjW0Q+PjJdPUM7aT1oO3JldHVybn1mdW5jdGlvbiBLYyhhKXthPWF8MDthPShjW2ErOD4+Ml18MCkrMTI3fDA7cmV0dXJuIGRbYT4+MF18ZFthKzE+PjBdPDw4fGRbYSsyPj4wXTw8MTZ8ZFthKzM+PjBdPDwyNHwwfWZ1bmN0aW9uIExjKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGU9MCxmPTA7ZT1pO2Y9ZFthPj4wXXxkW2ErMT4+MF08PDh8ZFthKzI+PjBdPDwxNnxkW2ErMz4+MF08PDI0O2E9YSs0fDA7YT1kW2E+PjBdfGRbYSsxPj4wXTw8OHxkW2ErMj4+MF08PDE2fGRbYSszPj4wXTw8MjQ7Yj1iKyhhPj4xKXwwO2lmKChhJjF8MCk9PTApe2E9ZjthPW9jW2EmMTI3XShiKXwwO2k9ZTtyZXR1cm4gYXwwfWVsc2V7YT1jWyhjW2I+PjJdfDApK2Y+PjJdfDA7YT1vY1thJjEyN10oYil8MDtpPWU7cmV0dXJuIGF8MH1yZXR1cm4gMH1mdW5jdGlvbiBNYyhhLGIsZSl7YT1hfDA7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTA7Zj1pO2c9ZFthPj4wXXxkW2ErMT4+MF08PDh8ZFthKzI+PjBdPDwxNnxkW2ErMz4+MF08PDI0O2E9YSs0fDA7YT1kW2E+PjBdfGRbYSsxPj4wXTw8OHxkW2ErMj4+MF08PDE2fGRbYSszPj4wXTw8MjQ7Yj1iKyhhPj4xKXwwO2lmKChhJjF8MCk9PTApe2E9ZzttY1thJjEyN10oYixlKTtpPWY7cmV0dXJufWVsc2V7YT1jWyhjW2I+PjJdfDApK2c+PjJdfDA7bWNbYSYxMjddKGIsZSk7aT1mO3JldHVybn19ZnVuY3Rpb24gTmMoYSxiLGUsZil7YT1hfDA7Yj1ifDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTA7Zz1pO2g9ZFthPj4wXXxkW2ErMT4+MF08PDh8ZFthKzI+PjBdPDwxNnxkW2ErMz4+MF08PDI0O2E9YSs0fDA7YT1kW2E+PjBdfGRbYSsxPj4wXTw8OHxkW2ErMj4+MF08PDE2fGRbYSszPj4wXTw8MjQ7Yj1iKyhhPj4xKXwwO2lmKChhJjF8MCk9PTApe2E9aDtxY1thJjMxXShiLGUsZik7aT1nO3JldHVybn1lbHNle2E9Y1soY1tiPj4yXXwwKStoPj4yXXwwO3FjW2EmMzFdKGIsZSxmKTtpPWc7cmV0dXJufX1mdW5jdGlvbiBPYygpe3ZhciBhPTAsYj0wLGQ9MDtiPWk7d2hpbGUoMSl7ZD11bigxNil8MDtpZigoZHwwKSE9MCl7YT03O2JyZWFrfWQ9Y1s1NjY2XXwwO2NbNTY2Nl09ZCswO2lmKChkfDApPT0wKXticmVha31zY1tkJjMxXSgpfWlmKChhfDApPT03KXtjW2QrMD4+Ml09MDtjW2QrND4+Ml09MDtjW2QrOD4+Ml09MDtjW2QrMTI+PjJdPTA7aT1iO3JldHVybiBkfDB9ZD1YYSg0KXwwO2NbZD4+Ml09MjI2ODA7d2IoZHwwLDIyNzI4LDIwNik7cmV0dXJuIDB9ZnVuY3Rpb24gUGMoYSl7YT1hfDA7dmFyIGI9MDtiPWk7YT1rY1thJjMxXSgpfDA7aT1iO3JldHVybiBhfDB9ZnVuY3Rpb24gUWMoYSl7YT1hfDA7cmV0dXJuIDcyfWZ1bmN0aW9uIFJjKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufWQ9Y1thKzEyPj4yXXwwO2lmKCgoZHwwKSE9MD8oZj1kKzR8MCxlPWNbZj4+Ml18MCxjW2Y+PjJdPWUrIC0xLChlfDApPT0wKTowKT8obGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpLGU9ZCs4fDAsZj1jW2U+PjJdfDAsY1tlPj4yXT1mKyAtMSwoZnwwKT09MCk6MCl7bGNbY1soY1tkPj4yXXwwKSsxNj4+Ml0mMjU1XShkKX1kPWNbYSs0Pj4yXXwwO2lmKCgoZHwwKSE9MD8oZT1kKzR8MCxmPWNbZT4+Ml18MCxjW2U+PjJdPWYrIC0xLChmfDApPT0wKTowKT8obGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpLGU9ZCs4fDAsZj1jW2U+PjJdfDAsY1tlPj4yXT1mKyAtMSwoZnwwKT09MCk6MCl7bGNbY1soY1tkPj4yXXwwKSsxNj4+Ml0mMjU1XShkKX12bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFNjKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtmPWk7aT1pKzMyfDA7bz1mO2U9ZisxNnwwO2c9ZisxMnwwO2FbZT4+MF09MDtjW2UrND4+Ml09YjtwPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtpZigoY1tiKyhwKzE2KT4+Ml18MCk9PTApe2g9Y1tiKyhwKzcyKT4+Ml18MDtpZigoaHwwKSE9MCl7WWcoaCk7cD1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDB9YVtlPj4wXT0xO2o9Sm4oZHwwKXwwO209Y1tiKyhwKzI0KT4+Ml18MDtpZigoY1tiKyhwKzQpPj4yXSYxNzZ8MCk9PTMyKXtoPWQranwwfWVsc2V7aD1kfWw9YitwfDA7bj1iKyhwKzc2KXwwO3E9Y1tuPj4yXXwwO2Rve2lmKChxfDApPT0tMSl7cD1jW2IrKHArMjgpPj4yXXwwO3E9cCs0fDA7Y1txPj4yXT0oY1txPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tvPj4yXT0xMzQ1NjtjW28rND4+Ml09MjA4O2Nbbys4Pj4yXT0wO2NnKDEzNDU2LG8pfXI9KGNbMTM0NjA+PjJdfDApKyAtMXwwO289Y1twKzg+PjJdfDA7aWYoKGNbcCsxMj4+Ml18MCktbz4+Mj4+PjA+cj4+PjA/KGs9Y1tvKyhyPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7az14Y1tjWyhjW2s+PjJdfDApKzI4Pj4yXSY2M10oaywzMil8MDtyPWNbcT4+Ml18MDtjW3E+PjJdPXIrIC0xO2lmKChyfDApPT0wKXtsY1tjWyhjW3A+PjJdfDApKzg+PjJdJjI1NV0ocCl9cT1rPDwyND4+MjQ7Y1tuPj4yXT1xO2JyZWFrfXI9WGEoNCl8MDtjW3I+PjJdPTIxMzA0O3diKHJ8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtXYyhnLG0sZCxoLGQranwwLGwscSYyNTUpO2lmKChjW2c+PjJdfDApPT0wKXtyPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK3J8MCxjW2IrKHIrMTYpPj4yXXw1KX19Z2goZSk7aT1mO3JldHVybiBifDB9ZnVuY3Rpb24gVGMoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFVjKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gVmMoYSl7YT1hfDA7bWIoYXwwKXwwO09hKCl9ZnVuY3Rpb24gV2MoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MDtrPWk7aT1pKzE2fDA7bD1rO2lmKChkfDApPT0wKXtjW2I+PjJdPTA7aT1rO3JldHVybn1wPWU7bj1nLXB8MDtoPWgrMTJ8MDttPWNbaD4+Ml18MDtuPShtfDApPihufDApP20tbnwwOjA7bT1mO3A9bS1wfDA7aWYoKHB8MCk+MD8oaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsZSxwKXwwKSE9KHB8MCk6MCl7Y1tiPj4yXT0wO2k9aztyZXR1cm59ZG97aWYoKG58MCk+MCl7ZG97aWYobj4+PjA8MTEpe3A9bjw8MSYyNTU7YVtsPj4wXT1wO289bDtlPWwrMXwwfWVsc2V7cT1uKzE2Ji0xNjtwPShxfDApPT0wPzE6cTt3aGlsZSgxKXtlPXVuKHApfDA7aWYoKGV8MCkhPTApe289MTU7YnJlYWt9ZT1jWzU2NjZdfDA7Y1s1NjY2XT1lKzA7aWYoKGV8MCk9PTApe2JyZWFrfXNjW2UmMzFdKCl9aWYoKG98MCk9PTE1KXtjW2wrOD4+Ml09ZTtwPXF8MTtjW2w+PjJdPXA7Y1tsKzQ+PjJdPW47bz1sO3A9cCYyNTU7YnJlYWt9cT1YYSg0KXwwO2NbcT4+Ml09MjI2ODA7d2IocXwwLDIyNzI4LDIwNil9fXdoaWxlKDApO05uKGV8MCxqfDAsbnwwKXwwO2FbZStuPj4wXT0wO2lmKChwJjEpPT0wKXtqPWwrMXwwfWVsc2V7aj1jW2wrOD4+Ml18MH1pZigoaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsaixuKXwwKT09KG58MCkpe2lmKChhW28+PjBdJjEpPT0wKXticmVha31sPWNbbCs4Pj4yXXwwO2lmKChsfDApPT0wKXticmVha312bihsKTticmVha31jW2I+PjJdPTA7aWYoKGFbbz4+MF0mMSk9PTApe2k9aztyZXR1cm59Yj1jW2wrOD4+Ml18MDtpZigoYnwwKT09MCl7aT1rO3JldHVybn12bihiKTtpPWs7cmV0dXJufX13aGlsZSgwKTtsPWctbXwwO2lmKChsfDApPjA/KGhjW2NbKGNbZD4+Ml18MCkrNDg+PjJdJjYzXShkLGYsbCl8MCkhPShsfDApOjApe2NbYj4+Ml09MDtpPWs7cmV0dXJufWNbaD4+Ml09MDtjW2I+PjJdPWQ7aT1rO3JldHVybn1mdW5jdGlvbiBYYyhhKXthPWF8MDt2YXIgYj0wO2I9aTtfYyhhKzQ3Njh8MCk7X2MoYSs0NzM2fDApO19jKGErNDY4OHwwKTtfYyhhKzQ2NTZ8MCk7X2MoYSs0NjA4fDApO19jKGErNDU3NnwwKTtfYyhhKzQ1Mjh8MCk7X2MoYSs0NDk2fDApO19jKGErNDQ0OHwwKTtfYyhhKzQ0MTZ8MCk7WmMoYSs0MzAwfDApO1pjKGErNDIyMHwwKTtaYyhhKzQxNDB8MCk7WmMoYSs0MDYwfDApO1pjKGErMzk4MHwwKTtZYyhhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFljKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2Q9Y1thKzg5Nj4+Ml18MDtpZigoZHwwKSE9MCl7ZT1jW2QrOD4+Ml18MDtpZigoZXwwKSE9MCl7dm4oY1tlKyAtND4+Ml18MCl9ZT1jW2QrMTI+PjJdfDA7aWYoKGV8MCkhPTApe3ZuKGNbZSsgLTQ+PjJdfDApfWU9Y1tkKzE2Pj4yXXwwO2lmKChlfDApIT0wKXt2bihjW2UrIC00Pj4yXXwwKX12bihkKX1kPWNbYSs5MDA+PjJdfDA7aWYoKGR8MCk9PTApe2Q9MH1lbHNle2U9Y1tkKzg+PjJdfDA7aWYoKGV8MCkhPTApe3ZuKGNbZSsgLTQ+PjJdfDApfWU9Y1tkKzEyPj4yXXwwO2lmKChlfDApIT0wKXt2bihjW2UrIC00Pj4yXXwwKX1lPWNbZCsxNj4+Ml18MDtpZigoZXwwKSE9MCl7dm4oY1tlKyAtND4+Ml18MCl9dm4oZCk7ZD0wfWRve2U9Y1thKyhkPDwyKSs5MDQ+PjJdfDA7aWYoKGV8MCkhPTApe2Y9Y1tlKzg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlKzEyPj4yXXwwO2lmKChmfDApIT0wKXt2bihjW2YrIC00Pj4yXXwwKX1mPWNbZSsxNj4+Ml18MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9dm4oZSl9ZT1jW2ErKGQ8PDIpKzE5Mjg+PjJdfDA7aWYoKGV8MCkhPTApe2Y9Y1tlKzg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlKzEyPj4yXXwwO2lmKChmfDApIT0wKXt2bihjW2YrIC00Pj4yXXwwKX1mPWNbZSsxNj4+Ml18MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9dm4oZSl9ZT1jW2ErKGQ8PDIpKzI5NTI+PjJdfDA7aWYoKGV8MCkhPTApe2Y9Y1tlKzg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlKzEyPj4yXXwwO2lmKChmfDApIT0wKXt2bihjW2YrIC00Pj4yXXwwKX1mPWNbZSsxNj4+Ml18MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9dm4oZSl9ZD1kKzF8MH13aGlsZSgoZHwwKSE9MjU2KTtkPWNbYSs4NjA+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzg2ND4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9YT1jW2ErODY4Pj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufXZuKGNbYSsgLTQ+PjJdfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gWmMoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTAsaD0wO2I9aTtkPWErMzZ8MDtlPWNbZD4+Ml18MDtmPWErNDB8MDtnPWNbZj4+Ml18MDtpZigoZ3wwKSE9KGV8MCkpe2Rve2NbZj4+Ml09ZysgLTQ0O2g9Y1tnKyAtMzY+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWg9Y1tnKyAtMzI+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWc9Y1tnKyAtMjg+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWc9Y1tmPj4yXXwwfXdoaWxlKChnfDApIT0oZXwwKSl9Zj1hKzY4fDA7ZT1jW2Y+PjJdfDA7YT1hKzcyfDA7Zz1jW2E+PjJdfDA7aWYoKGd8MCk9PShlfDApKXtfYyhmKTtfYyhkKTtpPWI7cmV0dXJufWRve2NbYT4+Ml09ZysgLTQ0O2g9Y1tnKyAtMzY+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWg9Y1tnKyAtMzI+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWc9Y1tnKyAtMjg+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWc9Y1thPj4yXXwwfXdoaWxlKChnfDApIT0oZXwwKSk7X2MoZik7X2MoZCk7aT1iO3JldHVybn1mdW5jdGlvbiBfYyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MDtiPWk7ZD1jW2E+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59ZT1hKzR8MDtmPWNbZT4+Ml18MDtpZigoZnwwKSE9KGR8MCkpe2Rve2NbZT4+Ml09ZisgLTQ0O2c9Y1tmKyAtMzY+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWc9Y1tmKyAtMzI+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWY9Y1tmKyAtMjg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlPj4yXXwwfXdoaWxlKChmfDApIT0oZHwwKSk7ZD1jW2E+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59fXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gJGMoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1pO2Q9Y1thKzU2Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSs2MD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErNjQ+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzEyPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxNj4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9YT1jW2ErMjA+PjJdfDA7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oY1thKyAtND4+Ml18MCk7aT1iO3JldHVybn1mdW5jdGlvbiBhZChhKXthPWF8MDt2YXIgYj0wLGQ9MDtiPWk7ZD1jW2ErMjgwPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsyODQ+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzI4OD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMjM2Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsyNDA+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzI0ND4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTkyPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxOTY+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzIwMD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTQ4Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxNTI+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzE1Nj4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTA0Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxMDg+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzExMj4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErNjA+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzY0Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSs2OD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTY+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzIwPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1hPWNbYSsyND4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn12bihjW2ErIC00Pj4yXXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGJkKGIpe2I9YnwwO3ZhciBjPTAsZD0wO2M9aTtkPWIrOHwwO2FbYiswPj4wXT0wO2FbYisxPj4wXT0wO2FbYisyPj4wXT0wO2FbYiszPj4wXT0wO2FbYis0Pj4wXT0wO2FbYis1Pj4wXT0wO2FbYis2Pj4wXT0wO2NkKGQsMTI4KTtjZChiKzUyfDAsMjU2KTtjZChiKzk2fDAsMjU2KTtjZChiKzE0MHwwLDI1Nik7Y2QoYisxODR8MCwyNTYpO2NkKGIrMjI4fDAsMjU2KTtjZChiKzI3MnwwLDI1Nik7aT1jO3JldHVybn1mdW5jdGlvbiBjZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MDtlPWk7Y1tiPj4yXT1kO2FbYis0Pj4wXT0wO2o9Yis4fDA7Y1tqPj4yXT0wO2c9YisxMnwwO2NbZz4+Ml09MDtoPWIrMTZ8MDtjW2g+PjJdPTA7aWYoKGQrIC0yfDApPj4+MD4yMDQ2KXtiPVhhKDgpfDA7Y1tiPj4yXT05OTI4O3doaWxlKDEpe2U9dW4oMzgpfDA7aWYoKGV8MCkhPTApe2Y9ODticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7YnJlYWt9c2NbZSYzMV0oKX1pZigoZnwwKT09OCl7Y1tlKzQ+PjJdPTI1O2NbZT4+Ml09MjU7ZD1lKzEyfDA7Y1tiKzQ+PjJdPWQ7Y1tlKzg+PjJdPTA7ZT1kKzB8MDtkPTM4NHwwO2Y9ZSsyNnwwO2Rve2FbZT4+MF09YVtkPj4wXXwwO2U9ZSsxfDA7ZD1kKzF8MH13aGlsZSgoZXwwKTwoZnwwKSk7d2IoYnwwLDEwMDY0LDEwNil9aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9Y1tiKzMyPj4yXT1kKyAtMTtpZihkPj4+MD4xNil7Zj0zO3doaWxlKDEpe2lmKDE8PGYrMj4+PjA8ZD4+PjApe2Y9ZisxfDB9ZWxzZXticmVha319az0xPDxmO2NbYiszNj4+Ml09aztjW2IrNDA+PjJdPTE1LWY7az11bigoazw8MikrNzZ8MCl8MDtmPWsrNjgmLTY0O2NbZisgLTQ+PjJdPWs7Y1toPj4yXT1mfWVsc2V7Y1toPj4yXT0wO2NbYis0MD4+Ml09MDtjW2IrMzY+PjJdPTB9az0oZDw8MikrNjh8MDtoPXVuKGspfDA7Zj1oKzY4Ji02NDtjW2YrIC00Pj4yXT1oO2Nbaj4+Ml09ZjtrPXVuKGspfDA7Zj1rKzY4Ji02NDtjW2YrIC00Pj4yXT1rO2NbZz4+Ml09ZjtjW2IrMjA+PjJdPTA7Zz1iKzI0fDA7Y1tnPj4yXT1kO2lmKChkfDApPT0wKXtkZChiKTtqPWNbYj4+Ml18MDtqPWorNnwwO2o9aj4+PjE7Y1tnPj4yXT1qO2s9YisyOHwwO2Nbaz4+Ml09ajtpPWU7cmV0dXJufWVsc2V7ZD0wfWRve2NbZisoZDw8Mik+PjJdPTE7ZD1kKzF8MH13aGlsZShkPj4+MDwoY1tiPj4yXXwwKT4+PjApO2RkKGIpO2o9Y1tiPj4yXXwwO2o9ais2fDA7aj1qPj4+MTtjW2c+PjJdPWo7az1iKzI4fDA7Y1trPj4yXT1qO2k9ZTtyZXR1cm59ZnVuY3Rpb24gZGQoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2Q9aTtlPWIrMjR8MDtoPWIrMjB8MDtrPShjW2g+PjJdfDApKyhjW2U+PjJdfDApfDA7Y1toPj4yXT1rO2lmKGs+Pj4wPjMyNzY4KXtjW2g+PjJdPTA7aWYoKGNbYj4+Ml18MCk9PTApe2s9MH1lbHNle2w9Y1tiKzEyPj4yXXwwO2o9MDtkb3tzPWwrKGo8PDIpfDA7az0oKGNbcz4+Ml18MCkrMXwwKT4+PjE7Y1tzPj4yXT1rO2s9aysoY1toPj4yXXwwKXwwO2NbaD4+Ml09aztqPWorMXwwfXdoaWxlKGo+Pj4wPChjW2I+PjJdfDApPj4+MCl9fWg9MjE0NzQ4MzY0OC8oaz4+PjApfDA7aWYoKGFbYis0Pj4wXXwwKT09MD8oZj1iKzM2fDAsKGNbZj4+Ml18MCkhPTApOjApe2lmKChjW2I+PjJdfDApIT0wKXtvPWNbYis4Pj4yXXwwO209Y1tiKzEyPj4yXXwwO2s9Yis0MHwwO249YisxNnwwO2o9MDtzPTA7bD0wO3doaWxlKDEpe3I9KGVhKGwsaCl8MCk+Pj4xNjtjW28rKGo8PDIpPj4yXT1yO2w9KGNbbSsoajw8Mik+PjJdfDApK2x8MDtyPXI+Pj4oY1trPj4yXXwwKTtpZihzPj4+MDxyPj4+MCl7cD1qKyAtMXwwO3E9Y1tuPj4yXXwwO2Rve3M9cysxfDA7Y1txKyhzPDwyKT4+Ml09cH13aGlsZSgoc3wwKSE9KHJ8MCkpfWVsc2V7cj1zfWo9aisxfDA7aWYoIShqPj4+MDwoY1tiPj4yXXwwKT4+PjApKXticmVha31lbHNle3M9cn19aD1jW24+PjJdfDA7Y1toPj4yXT0wO2lmKCEocj4+PjA+KGNbZj4+Ml18MCk+Pj4wKSl7Zz0xOH19ZWxzZXtoPWNbYisxNj4+Ml18MDtjW2g+PjJdPTA7cj0wO2c9MTh9aWYoKGd8MCk9PTE4KXtkb3tyPXIrMXwwO2NbaCsocjw8Mik+PjJdPShjW2I+PjJdfDApKyAtMX13aGlsZSghKHI+Pj4wPihjW2Y+PjJdfDApPj4+MCkpfXM9Y1tiPj4yXXwwO3I9Y1tlPj4yXXwwO3I9cio1fDA7cj1yPj4+MjtzPXM8PDM7cz1zKzQ4fDA7cT1yPj4+MD5zPj4+MDtyPXE/czpyO2NbZT4+Ml09cjtzPWIrMjh8MDtjW3M+PjJdPXI7aT1kO3JldHVybn1pZigoY1tiPj4yXXwwKT09MCl7cz0wO3I9Y1tlPj4yXXwwO3I9cio1fDA7cj1yPj4+MjtzPXM8PDM7cz1zKzQ4fDA7cT1yPj4+MD5zPj4+MDtyPXE/czpyO2NbZT4+Ml09cjtzPWIrMjh8MDtjW3M+PjJdPXI7aT1kO3JldHVybn1qPWNbYis4Pj4yXXwwO2s9Y1tiKzEyPj4yXXwwO2w9MDtnPTA7ZG97Y1tqKyhsPDwyKT4+Ml09KGVhKGcsaCl8MCk+Pj4xNjtnPShjW2srKGw8PDIpPj4yXXwwKStnfDA7bD1sKzF8MDtmPWNbYj4+Ml18MH13aGlsZShsPj4+MDxmPj4+MCk7cj1jW2U+PjJdfDA7cj1yKjV8MDtyPXI+Pj4yO3M9Zjw8MztzPXMrNDh8MDtxPXI+Pj4wPnM+Pj4wO3I9cT9zOnI7Y1tlPj4yXT1yO3M9YisyOHwwO2Nbcz4+Ml09cjtpPWQ7cmV0dXJufWZ1bmN0aW9uIGVkKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wO2Q9aTthW2I+PjBdPTA7Y2QoYis0fDAsNTE2KTtlPWIrNDh8MDtjW2U+PjJdPTY7YVtiKzUyPj4wXT0wO2NbYis4MD4+Ml09NTtjW2IrNjQ+PjJdPTA7Y1tiKzg4Pj4yXT0wO2NbYis4ND4+Ml09MDtnPXVuKDkyKXwwO2Y9Zys2OCYtNjQ7Y1tmKyAtND4+Ml09ZztjW2IrNTY+PjJdPWY7Zj11big5Mil8MDtnPWYrNjgmLTY0O2NbZysgLTQ+PjJdPWY7Y1tiKzYwPj4yXT1nO2NbYis2OD4+Ml09MDtmPWIrNzJ8MDtjW2Y+PjJdPTY7aD0wO2Rve2NbZysoaDw8Mik+PjJdPTE7aD1oKzF8MH13aGlsZShoPj4+MDwoY1tlPj4yXXwwKT4+PjApO2RkKGUpO2U9KChjW2U+PjJdfDApKzZ8MCk+Pj4xO2NbZj4+Ml09ZTtjW2IrNzY+PjJdPWU7ZT1iKzkyfDA7Yj1lKzcyfDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KGJ8MCkpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZmQoZCl7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtlPWk7Zz1kKzUyfDA7aD1kKzcyfDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzc2fDA7Zz1kKzk2fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzEwMHwwO2g9ZCsxMjB8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrMTI0fDA7Zz1kKzE0NHwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCsxNDh8MDtoPWQrMTY4fDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzE3MnwwO2c9ZCsxOTJ8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrMTk2fDA7aD1kKzIxNnwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCsyMjB8MDtnPWQrMjQwfDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzI0NHwwO2g9ZCsyNjR8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrMjY4fDA7Zz1kKzI4OHwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCsyOTJ8MDtoPWQrMzEyfDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzMxNnwwO2c9ZCszMzZ8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrMzQwfDA7aD1kKzM2MHwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCszNjR8MDtnPWQrMzg0fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzM4OHwwO2g9ZCs0MDh8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrNDEyfDA7Zz1kKzQzMnwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCs0MzZ8MDtoPWQrNDU2fDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzQ2MHwwO2c9ZCs0ODB8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrNDg0fDA7aD1kKzUwNHwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCs1MDh8MDtnPWQrNTI4fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzUzMnwwO2g9ZCs1NTJ8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrNTU2fDA7Zz1kKzU3NnwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCs1ODB8MDtoPWQrNjAwfDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzYwNHwwO2c9ZCs2MjR8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrNjI4fDA7aD1kKzY0OHwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCs2NTJ8MDtnPWQrNjcyfDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzY3NnwwO2g9ZCs2OTZ8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrNzAwfDA7Zz1kKzcyMHwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCs3MjR8MDtoPWQrNzQ0fDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzc0OHwwO2c9ZCs3Njh8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrNzcyfDA7aD1kKzc5MnwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCs3OTZ8MDtnPWQrODE2fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Y2QoZCs4NTJ8MCw2NCk7YVtkKzM5NzY+PjBdPTA7Zz1kKzIwfDA7aD1nKzMyfDA7ZG97YltnPj4xXT0wO2c9ZysyfDB9d2hpbGUoKGd8MCk8KGh8MCkpO3doaWxlKDEpe2c9dW4oNDQpfDA7aWYoKGd8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtmPTU7YnJlYWt9c2NbZyYzMV0oKX1pZigoZnwwKT09NSl7aD1YYSg0KXwwO2NbaD4+Ml09MjI2ODA7d2IoaHwwLDIyNzI4LDIwNil9Y2QoZywyNTYpO2NbZCs4OTY+PjJdPWc7d2hpbGUoMSl7Zz11big0NCl8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2Y9MTI7YnJlYWt9c2NbZyYzMV0oKX1pZigoZnwwKT09MTIpe2g9WGEoNCl8MDtjW2g+PjJdPTIyNjgwO3diKGh8MCwyMjcyOCwyMDYpfWNkKGcsMjU2KTtjW2QrOTAwPj4yXT1nO2Y9ZCs4MjB8MDtjW2YrMD4+Ml09MDtjW2YrND4+Ml09MDtjW2YrOD4+Ml09MDtjW2YrMTI+PjJdPTA7Y1tmKzE2Pj4yXT0wO2NbZisyMD4+Ml09MDtjW2YrMjQ+PjJdPTA7Y1tmKzI4Pj4yXT0wO2Y9MDthOndoaWxlKDEpe3doaWxlKDEpe2c9dW4oNDQpfDA7aWYoKGd8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtmPTIwO2JyZWFrIGF9c2NbZyYzMV0oKX1jZChnLDI1Nik7Y1tkKyhmPDwyKSs5MDQ+PjJdPWc7d2hpbGUoMSl7Zz11big0NCl8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2Y9Mjc7YnJlYWsgYX1zY1tnJjMxXSgpfWNkKGcsMjU2KTtjW2QrKGY8PDIpKzE5Mjg+PjJdPWc7d2hpbGUoMSl7Zz11big0NCl8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2Y9MzQ7YnJlYWsgYX1zY1tnJjMxXSgpfWNkKGcsMjU2KTtjW2QrKGY8PDIpKzI5NTI+PjJdPWc7Zj1mKzF8MDtpZigoZnwwKT49MjU2KXtmPTM4O2JyZWFrfX1pZigoZnwwKT09MjApe2g9WGEoNCl8MDtjW2g+PjJdPTIyNjgwO3diKGh8MCwyMjcyOCwyMDYpfWVsc2UgaWYoKGZ8MCk9PTI3KXtoPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX1lbHNlIGlmKChmfDApPT0zNCl7aD1YYSg0KXwwO2NbaD4+Ml09MjI2ODA7d2IoaHwwLDIyNzI4LDIwNil9ZWxzZSBpZigoZnwwKT09Mzgpe2NbZCszOTg0Pj4yXT0xNjtjW2QrMzk4OD4+Ml09NDtjW2QrMzk5Mj4+Ml09ODtjW2QrMzk5Nj4+Ml09MDtjW2QrNDAxNj4+Ml09MDtjW2QrNDAyMD4+Ml09MDtjW2QrNDAyND4+Ml09MDtjW2QrNDA0MD4+Ml09MTtjW2QrNDA0ND4+Ml09MjtjW2QrNDAzNj4+Ml09NDA5NjtjW2QrNDAzMj4+Ml09NDtjW2QrNDAyOD4+Ml09NDtjW2QrNDA0OD4+Ml09MDtjW2QrNDA1Mj4+Ml09MDtjW2QrNDA1Nj4+Ml09MDtjW2QrNGUzPj4yXT0xNjtjW2QrNDAwND4+Ml09NjU1MzY7Y1tkKzQwMDg+PjJdPS0zMjc2ODtjW2QrNDAxMj4+Ml09MzI3Njc7Y1tkKzM5ODA+PjJdPTA7Y1tkKzQwNjQ+PjJdPTE2O2NbZCs0MDY4Pj4yXT0xO2NbZCs0MDcyPj4yXT04O2NbZCs0MDc2Pj4yXT0wO2NbZCs0MDk2Pj4yXT0wO2NbZCs0MTAwPj4yXT0wO2NbZCs0MTA0Pj4yXT0wO2NbZCs0MTIwPj4yXT0xO2NbZCs0MTI0Pj4yXT0yO2NbZCs0MTE2Pj4yXT00MDk2O2NbZCs0MTEyPj4yXT00O2NbZCs0MTA4Pj4yXT00O2NbZCs0MTI4Pj4yXT0wO2NbZCs0MTMyPj4yXT0wO2NbZCs0MTM2Pj4yXT0wO2NbZCs0MDgwPj4yXT0xNjtjW2QrNDA4ND4+Ml09NjU1MzY7Y1tkKzQwODg+PjJdPS0zMjc2ODtjW2QrNDA5Mj4+Ml09MzI3Njc7Y1tkKzQwNjA+PjJdPTA7Y1tkKzQxNDQ+PjJdPTMyO2NbZCs0MTQ4Pj4yXT0yO2NbZCs0MTUyPj4yXT04O2NbZCs0MTU2Pj4yXT0wO2NbZCs0MTc2Pj4yXT0wO2NbZCs0MTgwPj4yXT0wO2NbZCs0MTg0Pj4yXT0wO2NbZCs0MjAwPj4yXT0xO2NbZCs0MjA0Pj4yXT0yO2NbZCs0MTk2Pj4yXT00MDk2O2NbZCs0MTkyPj4yXT00O2NbZCs0MTg4Pj4yXT00O2NbZCs0MjA4Pj4yXT0wO2NbZCs0MjEyPj4yXT0wO2NbZCs0MjE2Pj4yXT0wO2NbZCs0MTYwPj4yXT0zMjtjW2QrNDE2ND4+Ml09MDtjW2QrNDE2OD4+Ml09LTIxNDc0ODM2NDg7Y1tkKzQxNzI+PjJdPTIxNDc0ODM2NDc7Y1tkKzQxNDA+PjJdPTA7Y1tkKzQyMjQ+PjJdPTMyO2NbZCs0MjI4Pj4yXT0yMjtjW2QrNDIzMj4+Ml09ODtjW2QrNDIzNj4+Ml09MDtjW2QrNDI1Nj4+Ml09MDtjW2QrNDI2MD4+Ml09MDtjW2QrNDI2ND4+Ml09MDtjW2QrNDI4MD4+Ml09MTtjW2QrNDI4ND4+Ml09MjtjW2QrNDI3Nj4+Ml09NDA5NjtjW2QrNDI3Mj4+Ml09NDtjW2QrNDI2OD4+Ml09NDtjW2QrNDI4OD4+Ml09MDtjW2QrNDI5Mj4+Ml09MDtjW2QrNDI5Nj4+Ml09MDtjW2QrNDI0MD4+Ml09MzI7Y1tkKzQyNDQ+PjJdPTA7Y1tkKzQyNDg+PjJdPS0yMTQ3NDgzNjQ4O2NbZCs0MjUyPj4yXT0yMTQ3NDgzNjQ3O2NbZCs0MjIwPj4yXT0wO2NbZCs0MzA0Pj4yXT0zMjtjW2QrNDMwOD4+Ml09MjA7Y1tkKzQzMTI+PjJdPTg7Y1tkKzQzMTY+PjJdPTA7Y1tkKzQzMzY+PjJdPTA7Y1tkKzQzNDA+PjJdPTA7Y1tkKzQzNDQ+PjJdPTA7Y1tkKzQzNjA+PjJdPTE7Y1tkKzQzNjQ+PjJdPTI7Y1tkKzQzNTY+PjJdPTQwOTY7Y1tkKzQzNTI+PjJdPTQ7Y1tkKzQzNDg+PjJdPTQ7Y1tkKzQzNjg+PjJdPTA7Y1tkKzQzNzI+PjJdPTA7Y1tkKzQzNzY+PjJdPTA7Y1tkKzQzMjA+PjJdPTMyO2NbZCs0MzI0Pj4yXT0wO2NbZCs0MzI4Pj4yXT0tMjE0NzQ4MzY0ODtjW2QrNDMzMj4+Ml09MjE0NzQ4MzY0NztjW2QrNDMwMD4+Ml09MDtjW2QrNDM4ND4+Ml09MTY7Y1tkKzQzODg+PjJdPTQ7Y1tkKzQzOTI+PjJdPTg7Y1tkKzQzOTY+PjJdPTA7Y1tkKzQ0MTY+PjJdPTA7Y1tkKzQ0MjA+PjJdPTA7Y1tkKzQ0MjQ+PjJdPTA7Y1tkKzQ0NDA+PjJdPTE7Y1tkKzQ0NDQ+PjJdPTI7Y1tkKzQ0MzY+PjJdPTQwOTY7Y1tkKzQ0MzI+PjJdPTQ7Y1tkKzQ0Mjg+PjJdPTQ7Y1tkKzQ0NDg+PjJdPTA7Y1tkKzQ0NTI+PjJdPTA7Y1tkKzQ0NTY+PjJdPTA7Y1tkKzQ0MDA+PjJdPTE2O2NbZCs0NDA0Pj4yXT02NTUzNjtjW2QrNDQwOD4+Ml09LTMyNzY4O2NbZCs0NDEyPj4yXT0zMjc2NztjW2QrNDM4MD4+Ml09MDtjW2QrNDQ2ND4+Ml09MTY7Y1tkKzQ0Njg+PjJdPTE7Y1tkKzQ0NzI+PjJdPTg7Y1tkKzQ0NzY+PjJdPTA7Y1tkKzQ0OTY+PjJdPTA7Y1tkKzQ1MDA+PjJdPTA7Y1tkKzQ1MDQ+PjJdPTA7Y1tkKzQ1MjA+PjJdPTE7Y1tkKzQ1MjQ+PjJdPTI7Y1tkKzQ1MTY+PjJdPTQwOTY7Y1tkKzQ1MTI+PjJdPTQ7Y1tkKzQ1MDg+PjJdPTQ7Y1tkKzQ1Mjg+PjJdPTA7Y1tkKzQ1MzI+PjJdPTA7Y1tkKzQ1MzY+PjJdPTA7Y1tkKzQ0ODA+PjJdPTE2O2NbZCs0NDg0Pj4yXT02NTUzNjtjW2QrNDQ4OD4+Ml09LTMyNzY4O2NbZCs0NDkyPj4yXT0zMjc2NztjW2QrNDQ2MD4+Ml09MDtjW2QrNDU0ND4+Ml09MzI7Y1tkKzQ1NDg+PjJdPTI7Y1tkKzQ1NTI+PjJdPTg7Y1tkKzQ1NTY+PjJdPTA7Y1tkKzQ1NzY+PjJdPTA7Y1tkKzQ1ODA+PjJdPTA7Y1tkKzQ1ODQ+PjJdPTA7Y1tkKzQ2MDA+PjJdPTE7Y1tkKzQ2MDQ+PjJdPTI7Y1tkKzQ1OTY+PjJdPTQwOTY7Y1tkKzQ1OTI+PjJdPTQ7Y1tkKzQ1ODg+PjJdPTQ7Y1tkKzQ2MDg+PjJdPTA7Y1tkKzQ2MTI+PjJdPTA7Y1tkKzQ2MTY+PjJdPTA7Y1tkKzQ1NjA+PjJdPTMyO2NbZCs0NTY0Pj4yXT0wO2NbZCs0NTY4Pj4yXT0tMjE0NzQ4MzY0ODtjW2QrNDU3Mj4+Ml09MjE0NzQ4MzY0NztjW2QrNDU0MD4+Ml09MDtjW2QrNDYyND4+Ml09MzI7Y1tkKzQ2Mjg+PjJdPTIyO2NbZCs0NjMyPj4yXT04O2NbZCs0NjM2Pj4yXT0wO2NbZCs0NjU2Pj4yXT0wO2NbZCs0NjYwPj4yXT0wO2NbZCs0NjY0Pj4yXT0wO2NbZCs0NjgwPj4yXT0xO2NbZCs0Njg0Pj4yXT0yO2NbZCs0Njc2Pj4yXT00MDk2O2NbZCs0NjcyPj4yXT00O2NbZCs0NjY4Pj4yXT00O2NbZCs0Njg4Pj4yXT0wO2NbZCs0NjkyPj4yXT0wO2NbZCs0Njk2Pj4yXT0wO2NbZCs0NjQwPj4yXT0zMjtjW2QrNDY0ND4+Ml09MDtjW2QrNDY0OD4+Ml09LTIxNDc0ODM2NDg7Y1tkKzQ2NTI+PjJdPTIxNDc0ODM2NDc7Y1tkKzQ2MjA+PjJdPTA7Y1tkKzQ3MDQ+PjJdPTMyO2NbZCs0NzA4Pj4yXT0yMDtjW2QrNDcxMj4+Ml09ODtjW2QrNDcxNj4+Ml09MDtjW2QrNDczNj4+Ml09MDtjW2QrNDc0MD4+Ml09MDtjW2QrNDc0ND4+Ml09MDtjW2QrNDc2MD4+Ml09MTtjW2QrNDc2ND4+Ml09MjtjW2QrNDc1Nj4+Ml09NDA5NjtjW2QrNDc1Mj4+Ml09NDtjW2QrNDc0OD4+Ml09NDtjW2QrNDc2OD4+Ml09MDtjW2QrNDc3Mj4+Ml09MDtjW2QrNDc3Nj4+Ml09MDtjW2QrNDcyMD4+Ml09MzI7Y1tkKzQ3MjQ+PjJdPTA7Y1tkKzQ3Mjg+PjJdPS0yMTQ3NDgzNjQ4O2NbZCs0NzMyPj4yXT0yMTQ3NDgzNjQ3O2NbZCs0NzAwPj4yXT0wO2FbZCs0NzgwPj4wXT0wO2FbZCs0NzgxPj4wXT0wO2k9ZTtyZXR1cm59fWZ1bmN0aW9uIGdkKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTA7ZT1pO2k9aSszMnwwO2g9ZTtmPWNbYis4Pj4yXXwwO2I9Y1tiKzQ+PjJdfDA7amQoaCxmLGIpO2c9Y1toPj4yXXwwO2FbZCszPj4wXT1nPj4+MjQ7YVtkKzI+PjBdPWc+Pj4xNjthW2QrMT4+MF09Zz4+Pjg7YVtkPj4wXT1nO2c9Y1toKzQ+PjJdfDA7YVtkKzc+PjBdPWc+Pj4yNDthW2QrNj4+MF09Zz4+PjE2O2FbZCs1Pj4wXT1nPj4+ODthW2QrND4+MF09ZztnPWNbaCs4Pj4yXXwwO2FbZCsxMT4+MF09Zz4+PjI0O2FbZCsxMD4+MF09Zz4+PjE2O2FbZCs5Pj4wXT1nPj4+ODthW2QrOD4+MF09ZztnPWNbaCsxMj4+Ml18MDthW2QrMTM+PjBdPShnJjY1NTM1KT4+Pjg7YVtkKzEyPj4wXT1nO2FbZCsxND4+MF09Zz4+PjE2O2FbZCsxNT4+MF09Zz4+PjI0O2g9Y1toKzE2Pj4yXXwwO2FbZCsxNj4+MF09aDthW2QrMTc+PjBdPShoJjY1NTM1KT4+Pjg7YVtkKzE5Pj4wXT1oPj4+MjQ7YVtkKzE4Pj4wXT1oPj4+MTY7aD1rZChmKzQ3ODR8MCxiKXwwO2c9STthW2QrMjM+PjBdPWg+Pj4yNDthW2QrMjI+PjBdPWg+Pj4xNjthW2QrMjE+PjBdPWg+Pj44O2FbZCsyMD4+MF09aDtqPUtuKGh8MCxnfDAsNTYpfDA7YVtkKzI3Pj4wXT1qO2o9S24oaHwwLGd8MCw0OCl8MDthW2QrMjY+PjBdPWo7aD1LbihofDAsZ3wwLDQwKXwwO2FbZCsyNT4+MF09aDthW2QrMjQ+PjBdPWc7bGQoZis1MTEyfDAsYixkKzI4fDApO2k9ZTtyZXR1cm59ZnVuY3Rpb24gaGQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7Y1thPj4yXT00MjQ7YT1jW2ErOD4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1hZChhKzUxMTJ8MCk7X2MoYSs1MDk2fDApO19jKGErNTA2NHwwKTtaYyhhKzQ5NDh8MCk7JGMoYSs0Nzg0fDApO1hjKGEpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gaWQoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1pO2NbYT4+Ml09NDI0O2Q9Y1thKzg+PjJdfDA7aWYoKGR8MCk9PTApe3ZuKGEpO2k9YjtyZXR1cm59YWQoZCs1MTEyfDApO19jKGQrNTA5NnwwKTtfYyhkKzUwNjR8MCk7WmMoZCs0OTQ4fDApOyRjKGQrNDc4NHwwKTtYYyhkKTt2bihkKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGpkKGYsZyxoKXtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wO2o9aTtpPWkrMzJ8MDtrPWo7bD1nKzQ3ODF8MDtpZigoYVtsPj4wXXwwKT09MCl7dGQoZys0MzgwfDApO3RkKGcrNDQ2MHwwKTt0ZChnKzQ1NDB8MCk7dGQoZys0NjIwfDApO3RkKGcrNDcwMHwwKTthW2w+PjBdPTF9bD1nKzM5NzZ8MDtpZigoYVtsPj4wXXwwKT09MCl7YVtsPj4wXT0xO3BkKGNbaD4+Ml18MCxrLDIwKTtyPWRbaysxPj4wXTw8OHxkW2s+PjBdfGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNDtvPWRbays1Pj4wXTw8OHxkW2srND4+MF18ZFtrKzY+PjBdPDwxNnxkW2srNz4+MF08PDI0O3A9ZFtrKzk+PjBdPDw4fGRbays4Pj4wXXxkW2srMTA+PjBdPDwxNnxkW2srMTE+PjBdPDwyNDtxPShhW2srMTM+PjBdPDw4fGRbaysxMj4+MF0pJjY1NTM1O3M9YVtrKzE0Pj4wXXwwO3Q9YVtrKzE1Pj4wXXwwO3U9YVtrKzE2Pj4wXXwwO2g9YVtrKzE3Pj4wXXwwO3Y9KGFbaysxOT4+MF08PDh8ZFtrKzE4Pj4wXSkmNjU1MzU7YVtnPj4wXT1yO2FbZysxPj4wXT1yPj44O2FbZysyPj4wXT1yPj4xNjthW2crMz4+MF09cj4+MjQ7cj1nKzR8MDthW3I+PjBdPW87YVtyKzE+PjBdPW8+Pjg7YVtyKzI+PjBdPW8+PjE2O2FbciszPj4wXT1vPj4yNDtyPWcrOHwwO2Fbcj4+MF09cDthW3IrMT4+MF09cD4+ODthW3IrMj4+MF09cD4+MTY7YVtyKzM+PjBdPXA+PjI0O3I9ZysxMnwwO2Fbcj4+MF09cTthW3IrMT4+MF09cT4+ODthW2crMTQ+PjBdPXM7YVtnKzE1Pj4wXT10O2FbZysxNj4+MF09dTthW2crMTc+PjBdPWg7aD1nKzE4fDA7YVtoPj4wXT12O2FbaCsxPj4wXT12Pj44O2Y9ZiswfDA7aD1nKzB8MDtnPWYrMjB8MDtkb3thW2Y+PjBdPWFbaD4+MF18MDtmPWYrMXwwO2g9aCsxfDB9d2hpbGUoKGZ8MCk8KGd8MCkpO2k9ajtyZXR1cm59bT1xZChoLGcrODUyfDApfDA7aWYoKG18MCkhPTApe289ZysxNHwwO2s9YVtvPj4wXXwwO2lmKChtJjMyfDApIT0wKXtrPShxZChoLGNbZysoKCgoayYyNTUpPj4+NyYyNTUpPDw3fGsmN3woKGsmMjU1KT4+PjYmMjU1KTw8NiY2NHwoKGsmMjU1KT4+PjMmMjU1KTw8MyY1Nik8PDIpKzkwND4+Ml18MCl8MCkmMjU1O2Fbbz4+MF09a31sPWsmNztrPShrJjI1NSk+Pj4zJjc7bj1kWzg3Misoazw8MykrbD4+MF18MDtsPWRbOTM2KyhrPDwzKStsPj4wXXwwO2lmKChtJjE2fDApPT0wKXt1PWJbZysobjw8MSkrMjA+PjFdfDA7dj1nKzEyfDA7YVt2Pj4wXT11O2FbdisxPj4wXT11Pj44fWVsc2V7cD1nKyhuPDwxKSsyMHwwO3E9ZVtwPj4xXXwwO3E9KHJkKGcrNDM4MHwwLGgsKGNbZys0NDE2Pj4yXXwwKSsoKG4+Pj4wPDM/bjozKSo0NHwwKXwwKXwwKStxfDA7cj1jW2crNDQwND4+Ml18MDtpZigocXwwKTwwKXtxPXErcnwwfWVsc2V7cT1xLShxPj4+MDxyPj4+MD8wOnIpfDB9dj1xJjY1NTM1O3U9ZysxMnwwO2FbdT4+MF09djthW3UrMT4+MF09dj4+ODtiW3A+PjFdPXZ9aWYoKG0mOHwwKSE9MCl7dj1nKzE1fDA7YVt2Pj4wXT1xZChoLGNbZysoZFt2Pj4wXTw8MikrMTkyOD4+Ml18MCl8MH1pZigobSY0fDApIT0wKXtwPXFkKGgsY1tnKygoKGRbbz4+MF18MCk+Pj42JjEpPDwyKSs4OTY+PjJdfDApfDA7bz1nKzE2fDA7cD0oYVtvPj4wXXwwKStwfDA7aWYoKHB8MCk8MCl7cD1wKzI1NnwwfWVsc2V7cD0ocHwwKT4yNTU/cCsgLTI1NnwwOnB9YVtvPj4wXT1wfWlmKChtJjJ8MCkhPTApe3Y9ZysxN3wwO2Fbdj4+MF09cWQoaCxjW2crKGRbdj4+MF08PDIpKzI5NTI+PjJdfDApfDB9aWYoKG0mMXwwKSE9MCl7bT1nKzE4fDA7cD0oZFttPj4wXXxkW20rMT4+MF08PDgpJjY1NTM1O3A9KHJkKGcrNDQ2MHwwLGgsY1tnKzQ0OTY+PjJdfDApfDApK3B8MDtvPWNbZys0NDg0Pj4yXXwwO2lmKChwfDApPDApe289cCtvfDB9ZWxzZXtvPXAtKHA+Pj4wPG8+Pj4wPzA6byl8MH12PW8mNjU1MzU7YVttPj4wXT12O2FbbSsxPj4wXT12Pj44fX1lbHNle2s9YVtnKzE0Pj4wXXwwO249ayY3O2s9KGsmMjU1KT4+PjMmNztsPWRbOTM2KyhrPDwzKStuPj4wXXwwO249ZFs4NzIrKGs8PDMpK24+PjBdfDB9cT1nKyhuKjI0fDApKzUyfDA7bz1nKyhuKjI0fDApKzYwfDA7cD1jW28+PjJdfDA7bT1nKzQ1NDB8MDtrPShrfDApPT0xJjE7cD0ocmQobSxoLChjW2crNDU3Nj4+Ml18MCkrKGsqNDR8MCl8MCl8MCkrcHwwO3I9Y1tnKzQ1NjQ+PjJdfDA7aWYoKHB8MCk8MCl7cD1wK3J8MH1lbHNle3A9cC0ocD4+PjA8cj4+PjA/MDpyKXwwfXI9KGRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNCkrcHwwO2FbZz4+MF09cjthW2crMT4+MF09cj4+ODthW2crMj4+MF09cj4+MTY7YVtnKzM+PjBdPXI+PjI0O3I9ZysobioyNHwwKSs3MnwwO3M9Y1tvPj4yXXwwO2Rve2lmKChhW3I+PjBdfDApPT0wKXt1PWcrKG4qMjR8MCkrNTZ8MDt0PWNbdT4+Ml18MDtpZigoc3wwKT49KHB8MCkpe2lmKCh0fDApPChwfDApKXtjW3E+PjJdPXQ7Y1t1Pj4yXT1wfWVsc2V7Y1txPj4yXT1wfWFbcj4+MF09MTticmVha31jW3E+PjJdPXQ7Y1t1Pj4yXT1zO3Q9ZysobioyNHwwKSs2OHwwO3E9Y1t0Pj4yXXwwO3M9ZysobioyNHwwKSs2NHwwO3I9Y1tzPj4yXXwwO2lmKChxfDApPChwfDApKXtjW28+PjJdPXI7Y1tzPj4yXT1xO2NbdD4+Ml09cDticmVha31pZigocnwwKTwocHwwKSl7Y1tvPj4yXT1yO2Nbcz4+Ml09cDticmVha31lbHNle2Nbbz4+Ml09cDticmVha319ZWxzZXt0PWcrKG4qMjR8MCkrNjR8MDt1PWNbdD4+Ml18MDtpZigocHwwKT49KHN8MCkpe289ZysobioyNHwwKSs2OHwwO2lmKChwfDApPCh1fDApKXtjW28+PjJdPXU7Y1t0Pj4yXT1wfWVsc2V7Y1tvPj4yXT1wfWFbcj4+MF09MDticmVha31jW2crKG4qMjR8MCkrNjg+PjJdPXU7Y1t0Pj4yXT1zO3M9Y1txPj4yXXwwO3Q9ZysobioyNHwwKSs1NnwwO3I9Y1t0Pj4yXXwwO2lmKChwfDApPChzfDApKXtjW28+PjJdPXI7Y1t0Pj4yXT1zO2NbcT4+Ml09cDticmVha31pZigocHwwKTwocnwwKSl7Y1tvPj4yXT1yO2NbdD4+Ml09cDticmVha31lbHNle2Nbbz4+Ml09cDticmVha319fXdoaWxlKDApO3I9ZysobioyNHwwKSs0MzZ8MDtwPWcrKG4qMjR8MCkrNDQ0fDA7cT1jW3A+PjJdfDA7cz1jW20+PjJdfDA7bz1nKzQ2MjB8MDtxPShyZChvLGgsKGNbZys0NjU2Pj4yXXwwKSsoKChzPj4+MDwyMD9zJi0yOjIwKXxrKSo0NHwwKXwwKXwwKStxfDA7cz1jW2crNDY0ND4+Ml18MDtpZigocXwwKTwwKXtxPXErc3wwfWVsc2V7cT1xLShxPj4+MDxzPj4+MD8wOnMpfDB9cz1nKzR8MDt0PShkW3M+PjBdfGRbcysxPj4wXTw8OHxkW3MrMj4+MF08PDE2fGRbcyszPj4wXTw8MjQpK3F8MDthW3M+PjBdPXQ7YVtzKzE+PjBdPXQ+Pjg7YVtzKzI+PjBdPXQ+PjE2O2FbcyszPj4wXT10Pj4yNDtzPWcrKG4qMjR8MCkrNDU2fDA7dD1jW3A+PjJdfDA7ZG97aWYoKGFbcz4+MF18MCk9PTApe3U9ZysobioyNHwwKSs0NDB8MDt2PWNbdT4+Ml18MDtpZigodHwwKT49KHF8MCkpe2lmKCh2fDApPChxfDApKXtjW3I+PjJdPXY7Y1t1Pj4yXT1xfWVsc2V7Y1tyPj4yXT1xfWFbcz4+MF09MTticmVha31jW3I+PjJdPXY7Y1t1Pj4yXT10O3M9ZysobioyNHwwKSs0NTJ8MDtyPWNbcz4+Ml18MDtuPWcrKG4qMjR8MCkrNDQ4fDA7dD1jW24+PjJdfDA7aWYoKHJ8MCk8KHF8MCkpe2NbcD4+Ml09dDtjW24+PjJdPXI7Y1tzPj4yXT1xO2JyZWFrfWlmKCh0fDApPChxfDApKXtjW3A+PjJdPXQ7Y1tuPj4yXT1xO2JyZWFrfWVsc2V7Y1twPj4yXT1xO2JyZWFrfX1lbHNle3U9ZysobioyNHwwKSs0NDh8MDt2PWNbdT4+Ml18MDtpZigocXwwKT49KHR8MCkpe249ZysobioyNHwwKSs0NTJ8MDtpZigocXwwKTwodnwwKSl7Y1tuPj4yXT12O2NbdT4+Ml09cX1lbHNle2Nbbj4+Ml09cX1hW3M+PjBdPTA7YnJlYWt9Y1tnKyhuKjI0fDApKzQ1Mj4+Ml09djtjW3U+PjJdPXQ7cz1jW3I+PjJdfDA7bj1nKyhuKjI0fDApKzQ0MHwwO3Q9Y1tuPj4yXXwwO2lmKChxfDApPChzfDApKXtjW3A+PjJdPXQ7Y1tuPj4yXT1zO2Nbcj4+Ml09cTticmVha31pZigocXwwKTwodHwwKSl7Y1twPj4yXT10O2Nbbj4+Ml09cTticmVha31lbHNle2NbcD4+Ml09cTticmVha319fXdoaWxlKDApO209KGNbbz4+Ml18MCkrKGNbbT4+Ml18MCl8MDtsPWcrKGw8PDIpKzgyMHwwO249Y1tsPj4yXXwwO2lmKG0+Pj4wPDM2KXttPW0+Pj4xJjIxNDc0ODM2NDZ9ZWxzZXttPTE4fWs9KHJkKGcrNDcwMHwwLGgsKGNbZys0NzM2Pj4yXXwwKSsoKG18aykqNDR8MCl8MCl8MCkrbnwwO2g9Y1tnKzQ3MjQ+PjJdfDA7aWYoKGt8MCk8MCl7aD1rK2h8MH1lbHNle2g9ay0oaz4+PjA8aD4+PjA/MDpoKXwwfXY9Zys4fDA7YVt2Pj4wXT1oO2FbdisxPj4wXT1oPj44O2FbdisyPj4wXT1oPj4xNjthW3YrMz4+MF09aD4+MjQ7Y1tsPj4yXT1oO2Y9ZiswfDA7aD1nKzB8MDtnPWYrMjB8MDtkb3thW2Y+PjBdPWFbaD4+MF18MDtmPWYrMXwwO2g9aCsxfDB9d2hpbGUoKGZ8MCk8KGd8MCkpO2k9ajtyZXR1cm59ZnVuY3Rpb24ga2QoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7Zj1pO2k9aSsxNnwwO2c9ZjtoPWIrMzI1fDA7aWYoKGFbaD4+MF18MCk9PTApe3RkKGIrMjQ0fDApO2FbaD4+MF09MX1pZigoYVtiPj4wXXwwKT09MCl7YVtiPj4wXT0xO3BkKGNbZT4+Ml18MCxnLDgpO249ZFtnKzE+PjBdPDw4fGRbZz4+MF18ZFtnKzI+PjBdPDwxNnxkW2crMz4+MF08PDI0O209ZFtnKzU+PjBdPDw4fGRbZys0Pj4wXXxkW2crNj4+MF08PDE2fGRbZys3Pj4wXTw8MjQ7bD1iKzEwMHwwO2s9bDthW2s+PjBdPW47YVtrKzE+PjBdPW4+Pjg7YVtrKzI+PjBdPW4+PjE2O2FbayszPj4wXT1uPj4yNDtsPWwrNHwwO2FbbD4+MF09bTthW2wrMT4+MF09bT4+ODthW2wrMj4+MF09bT4+MTY7YVtsKzM+PjBdPW0+PjI0O0k9bTtpPWY7cmV0dXJuIG58MH1nPWIrOTJ8MDtkb3tpZigoY1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdfDApPT0wKXtoPXFkKGUsYis0OHwwKXwwO2lmKChofDApPT0yKXtoPWIrOTZ8MDtjW2g+PjJdPShjW2g+PjJdfDApKzEmMztqPWIrKGNbZz4+Ml08PDMpKzEwNHwwO2o9ZFtqPj4wXXxkW2orMT4+MF08PDh8ZFtqKzI+PjBdPDwxNnxkW2orMz4+MF08PDI0O2o9KHJkKGIrMjQ0fDAsZSwoY1tiKzI4MD4+Ml18MCkrMzUyfDApfDApK2p8MDtrPWNbYisyNjg+PjJdfDA7aWYoKGp8MCk8MCl7aj1qK2t8MH1lbHNle2o9ai0oaj4+PjA8az4+PjA/MDprKXwwfW09KChqfDApPDApPDwzMT4+MzE7az1iKyhjW2g+PjJdPDwzKSsxMDB8MDtuPWs7YVtuPj4wXT1qO2FbbisxPj4wXT1qPj44O2FbbisyPj4wXT1qPj4xNjthW24rMz4+MF09aj4+MjQ7az1rKzR8MDthW2s+PjBdPW07YVtrKzE+PjBdPW0+Pjg7YVtrKzI+PjBdPW0+PjE2O2FbayszPj4wXT1tPj4yNDtrPWIrKGNbaD4+Ml08PDMpKzEwMHwwO209azttPWRbbT4+MF18ZFttKzE+PjBdPDw4fGRbbSsyPj4wXTw8MTZ8ZFttKzM+PjBdPDwyNDtqPWs7YVtqPj4wXT0wO2FbaisxPj4wXT0wO2FbaisyPj4wXT0wO2FbaiszPj4wXT0wO2s9ays0fDA7YVtrPj4wXT1tO2FbaysxPj4wXT1tPj44O2FbaysyPj4wXT1tPj4xNjthW2srMz4+MF09bT4+MjQ7az1lKzR8MDttPWNbaz4+Ml18MDtqPWUrOHwwO249KGNbaj4+Ml18MCk+Pj4xNjtjW2o+PjJdPW47bD0obT4+PjApLyhuPj4+MCl8MDtuPW0tKGVhKG4sbCl8MCl8MDtjW2s+PjJdPW47ZG97bj0obWQoY1tlPj4yXXwwKXwwKSYyNTV8bjw8ODtjW2s+PjJdPW47bT1jW2o+PjJdfDA7bz1tPDw4O2Nbaj4+Ml09b313aGlsZShvPj4+MDwxNjc3NzIxNik7bz1tPj4+OCY2NTUzNTtjW2o+PjJdPW87bT0obj4+PjApLyhvPj4+MCl8MDtuPW4tKGVhKG0sbyl8MCl8MDtjW2s+PjJdPW47ZG97bj0obWQoY1tlPj4yXXwwKXwwKSYyNTV8bjw8ODtjW2s+PjJdPW47bz1jW2o+PjJdPDw4O2Nbaj4+Ml09b313aGlsZShvPj4+MDwxNjc3NzIxNik7bz1iKyhjW2g+PjJdPDwzKSsxMDB8MDtuPW87az1uO249bis0fDA7bj1kW24+PjBdfGRbbisxPj4wXTw8OHxkW24rMj4+MF08PDE2fGRbbiszPj4wXTw8MjQ7bD1kW2s+PjBdfGRbaysxPj4wXTw8OHxkW2srMj4+MF08PDE2fGRbayszPj4wXTw8MjR8KG08PDE2fGwmNjU1MzUpO209bzthW20+PjBdPWw7YVttKzE+PjBdPWw+Pjg7YVttKzI+PjBdPWw+PjE2O2FbbSszPj4wXT1sPj4yNDtvPW8rNHwwO2Fbbz4+MF09bjthW28rMT4+MF09bj4+ODthW28rMj4+MF09bj4+MTY7YVtvKzM+PjBdPW4+PjI0O289Y1toPj4yXXwwO2NbZz4+Ml09bztjW2IrKG88PDIpKzEzMj4+Ml09MDtjW2IrKGNbZz4+Ml08PDIpKzE0OD4+Ml09MDticmVha31lbHNlIGlmKChofDApPT0xKXtlPXJkKGIrMjQ0fDAsZSxjW2IrMjgwPj4yXXwwKXwwO2g9Y1tiKzI2OD4+Ml18MDtpZigoZXwwKTwwKXtlPWgrZXwwfWVsc2V7ZT1lLShlPj4+MDxoPj4+MD8wOmgpfDB9Y1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdPWU7bz1jW2c+PjJdfDA7bD1jW2IrKG88PDIpKzEzMj4+Ml18MDtvPWIrKG88PDMpKzEwMHwwO249bzttPW47bj1uKzR8MDtsPUluKGRbbT4+MF18ZFttKzE+PjBdPDw4fGRbbSsyPj4wXTw8MTZ8ZFttKzM+PjBdPDwyNHwwLGRbbj4+MF18ZFtuKzE+PjBdPDw4fGRbbisyPj4wXTw8MTZ8ZFtuKzM+PjBdPDwyNHwwLGx8MCwoKGx8MCk8MCk8PDMxPj4zMXwwKXwwO249STttPW87YVttPj4wXT1sO2FbbSsxPj4wXT1sPj44O2FbbSsyPj4wXT1sPj4xNjthW20rMz4+MF09bD4+MjQ7bz1vKzR8MDthW28+PjBdPW47YVtvKzE+PjBdPW4+Pjg7YVtvKzI+PjBdPW4+PjE2O2FbbyszPj4wXT1uPj4yNDtjW2IrKGNbZz4+Ml08PDIpKzE0OD4+Ml09MDticmVha31lbHNle2lmKChofDApPD0yKXticmVha31jW2c+PjJdPWgrMisoY1tnPj4yXXwwKSYzO2tkKGIsZSl8MDticmVha319ZWxzZXtoPXFkKGUsYis0fDApfDA7aWYoKGh8MCk9PTEpe2g9Y1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdfDA7ZT0ocmQoYisyNDR8MCxlLChjW2IrMjgwPj4yXXwwKSs0NHwwKXwwKStofDA7aD1jW2IrMjY4Pj4yXXwwO2lmKChlfDApPDApe2U9ZStofDB9ZWxzZXtlPWUtKGU+Pj4wPGg+Pj4wPzA6aCl8MH1vPWIrKGNbZz4+Ml08PDMpKzEwMHwwO2w9bztuPWw7bD1sKzR8MDtsPUluKGRbbj4+MF18ZFtuKzE+PjBdPDw4fGRbbisyPj4wXTw8MTZ8ZFtuKzM+PjBdPDwyNHwwLGRbbD4+MF18ZFtsKzE+PjBdPDw4fGRbbCsyPj4wXTw8MTZ8ZFtsKzM+PjBdPDwyNHwwLGV8MCwoKGV8MCk8MCk8PDMxPj4zMXwwKXwwO249STttPW87YVttPj4wXT1sO2FbbSsxPj4wXT1sPj44O2FbbSsyPj4wXT1sPj4xNjthW20rMz4+MF09bD4+MjQ7bz1vKzR8MDthW28+PjBdPW47YVtvKzE+PjBdPW4+Pjg7YVtvKzI+PjBdPW4+PjE2O2FbbyszPj4wXT1uPj4yNDtjW2IrKGNbZz4+Ml08PDIpKzE0OD4+Ml09MDticmVha31pZigoaHwwKT49NTExKXtpZigoaHwwKSE9NTEyKXtpZigoaHwwKTw9NTExKXticmVha31jW2c+PjJdPShjW2c+PjJdfDApK2gmMztrZChiLGUpfDA7YnJlYWt9aD1iKzk2fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxJjM7az1iKyhjW2c+PjJdPDwzKSsxMDR8MDtrPWRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNDtrPShyZChiKzI0NHwwLGUsKGNbYisyODA+PjJdfDApKzM1MnwwKXwwKStrfDA7aj1jW2IrMjY4Pj4yXXwwO2lmKChrfDApPDApe2o9aytqfDB9ZWxzZXtqPWstKGs+Pj4wPGo+Pj4wPzA6ail8MH1vPSgoanwwKTwwKTw8MzE+PjMxO2s9YisoY1toPj4yXTw8MykrMTAwfDA7bD1rO2FbbD4+MF09ajthW2wrMT4+MF09aj4+ODthW2wrMj4+MF09aj4+MTY7YVtsKzM+PjBdPWo+PjI0O2s9ays0fDA7YVtrPj4wXT1vO2FbaysxPj4wXT1vPj44O2FbaysyPj4wXT1vPj4xNjthW2srMz4+MF09bz4+MjQ7az1iKyhjW2g+PjJdPDwzKSsxMDB8MDtvPWs7bz1kW28+PjBdfGRbbysxPj4wXTw8OHxkW28rMj4+MF08PDE2fGRbbyszPj4wXTw8MjQ7bD1rO2FbbD4+MF09MDthW2wrMT4+MF09MDthW2wrMj4+MF09MDthW2wrMz4+MF09MDtrPWsrNHwwO2Fbaz4+MF09bzthW2srMT4+MF09bz4+ODthW2srMj4+MF09bz4+MTY7YVtrKzM+PjBdPW8+PjI0O2s9ZSs0fDA7bz1jW2s+PjJdfDA7bD1lKzh8MDttPShjW2w+PjJdfDApPj4+MTY7Y1tsPj4yXT1tO2o9KG8+Pj4wKS8obT4+PjApfDA7bT1vLShlYShtLGopfDApfDA7Y1trPj4yXT1tO2Rve209KG1kKGNbZT4+Ml18MCl8MCkmMjU1fG08PDg7Y1trPj4yXT1tO249Y1tsPj4yXXwwO289bjw8ODtjW2w+PjJdPW99d2hpbGUobz4+PjA8MTY3NzcyMTYpO289bj4+PjgmNjU1MzU7Y1tsPj4yXT1vO249KG0+Pj4wKS8obz4+PjApfDA7bT1tLShlYShuLG8pfDApfDA7Y1trPj4yXT1tO2Rve209KG1kKGNbZT4+Ml18MCl8MCkmMjU1fG08PDg7Y1trPj4yXT1tO289Y1tsPj4yXTw8ODtjW2w+PjJdPW99d2hpbGUobz4+PjA8MTY3NzcyMTYpO289YisoY1toPj4yXTw8MykrMTAwfDA7bT1vO2w9bTttPW0rNHwwO209ZFttPj4wXXxkW20rMT4+MF08PDh8ZFttKzI+PjBdPDwxNnxkW20rMz4+MF08PDI0O2w9ZFtsPj4wXXxkW2wrMT4+MF08PDh8ZFtsKzI+PjBdPDwxNnxkW2wrMz4+MF08PDI0fChuPDwxNnxqJjY1NTM1KTtuPW87YVtuPj4wXT1sO2FbbisxPj4wXT1sPj44O2FbbisyPj4wXT1sPj4xNjthW24rMz4+MF09bD4+MjQ7bz1vKzR8MDthW28+PjBdPW07YVtvKzE+PjBdPW0+Pjg7YVtvKzI+PjBdPW0+PjE2O2FbbyszPj4wXT1tPj4yNDtvPWNbaD4+Ml18MDtjW2c+PjJdPW87Y1tiKyhvPDwyKSsxMzI+PjJdPTA7Y1tiKyhjW2c+PjJdPDwyKSsxNDg+PjJdPTA7YnJlYWt9ZG97aWYoKGh8MCk9PTApe2U9cmQoYisyNDR8MCxlLChjW2IrMjgwPj4yXXwwKSszMDh8MCl8MDtoPWNbYisyNjg+PjJdfDA7aWYoKGV8MCk8MCl7ZT1oK2V8MH1lbHNle2U9ZS0oZT4+PjA8aD4+PjA/MDpoKXwwfWg9YisoY1tnPj4yXTw8MikrMTQ4fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2g9Y1tnPj4yXXwwO2lmKChjW2IrKGg8PDIpKzE0OD4+Ml18MCk+Myl7Y1tiKyhoPDwyKSsxMzI+PjJdPWU7Y1tiKyhjW2c+PjJdPDwyKSsxNDg+PjJdPTB9fWVsc2V7aWYoKGh8MCk8NTAwKXtsPWIrMjQ0fDA7aj1lYShjW2IrKGNbZz4+Ml08PDIpKzEzMj4+Ml18MCxoKXwwO2s9Y1tiKzI4MD4+Ml18MDtpZigoaHwwKTwxMCl7aD0ocmQobCxlLGsrODh8MCl8MCkranwwO2U9Y1tiKzI2OD4+Ml18MDtpZigoaHwwKTwwKXtlPWgrZXwwO2JyZWFrfWVsc2V7ZT1oLShoPj4+MDxlPj4+MD8wOmUpfDA7YnJlYWt9fWVsc2V7aD0ocmQobCxlLGsrMTMyfDApfDApK2p8MDtlPWNbYisyNjg+PjJdfDA7aWYoKGh8MCk8MCl7ZT1oK2V8MDticmVha31lbHNle2U9aC0oaD4+PjA8ZT4+PjA/MDplKXwwO2JyZWFrfX19aWYoKGh8MCk9PTUwMCl7aD0oY1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdfDApKjUwMHwwO2g9KHJkKGIrMjQ0fDAsZSwoY1tiKzI4MD4+Ml18MCkrMTc2fDApfDApK2h8MDtlPWNbYisyNjg+PjJdfDA7aWYoKGh8MCk8MCl7ZT1oK2V8MH1lbHNle2U9aC0oaD4+PjA8ZT4+PjA/MDplKXwwfWg9YisoY1tnPj4yXTw8MikrMTQ4fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2g9Y1tnPj4yXXwwO2lmKChjW2IrKGg8PDIpKzE0OD4+Ml18MCk8PTMpe2JyZWFrfWNbYisoaDw8MikrMTMyPj4yXT1lO2NbYisoY1tnPj4yXTw8MikrMTQ4Pj4yXT0wO2JyZWFrfWg9NTAwLWh8MDtrPWIrMjQ0fDA7aj1jW2IrKGNbZz4+Ml08PDIpKzEzMj4+Ml18MDtpZigoaHwwKT4tMTApe2g9ZWEoaixoKXwwO2g9KHJkKGssZSwoY1tiKzI4MD4+Ml18MCkrMjIwfDApfDApK2h8MDtlPWNbYisyNjg+PjJdfDA7aWYoKGh8MCk8MCl7ZT1oK2V8MDticmVha31lbHNle2U9aC0oaD4+PjA8ZT4+PjA/MDplKXwwO2JyZWFrfX1oPWVhKGosLTEwKXwwO2U9KHJkKGssZSwoY1tiKzI4MD4+Ml18MCkrMjY0fDApfDApK2h8MDtoPWNbYisyNjg+PjJdfDA7aWYoKGV8MCk8MCl7aD1lK2h8MH1lbHNle2g9ZS0oZT4+PjA8aD4+PjA/MDpoKXwwfWU9YisoY1tnPj4yXTw8MikrMTQ4fDA7Y1tlPj4yXT0oY1tlPj4yXXwwKSsxO2U9Y1tnPj4yXXwwO2lmKChjW2IrKGU8PDIpKzE0OD4+Ml18MCk+Myl7Y1tiKyhlPDwyKSsxMzI+PjJdPWg7Y1tiKyhjW2c+PjJdPDwyKSsxNDg+PjJdPTA7ZT1ofWVsc2V7ZT1ofX19d2hpbGUoMCk7bz1iKyhjW2c+PjJdPDwzKSsxMDB8MDtsPW87bj1sO2w9bCs0fDA7bD1JbihkW24+PjBdfGRbbisxPj4wXTw8OHxkW24rMj4+MF08PDE2fGRbbiszPj4wXTw8MjR8MCxkW2w+PjBdfGRbbCsxPj4wXTw8OHxkW2wrMj4+MF08PDE2fGRbbCszPj4wXTw8MjR8MCxlfDAsKChlfDApPDApPDwzMT4+MzF8MCl8MDtuPUk7bT1vO2FbbT4+MF09bDthW20rMT4+MF09bD4+ODthW20rMj4+MF09bD4+MTY7YVttKzM+PjBdPWw+PjI0O289bys0fDA7YVtvPj4wXT1uO2FbbysxPj4wXT1uPj44O2FbbysyPj4wXT1uPj4xNjthW28rMz4+MF09bj4+MjR9fXdoaWxlKDApO249YisoY1tnPj4yXTw8MykrMTAwfDA7bz1uO249bis0fDA7bj1kW24+PjBdfGRbbisxPj4wXTw8OHxkW24rMj4+MF08PDE2fGRbbiszPj4wXTw8MjQ7bz1kW28+PjBdfGRbbysxPj4wXTw8OHxkW28rMj4+MF08PDE2fGRbbyszPj4wXTw8MjQ7ST1uO2k9ZjtyZXR1cm4gb3wwfWZ1bmN0aW9uIGxkKGIsZSxmKXtiPWJ8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtnPWk7aT1pKzE2fDA7aD1nO2lmKChhW2I+PjBdfDApPT0wKXthW2I+PjBdPTE7cGQoY1tlPj4yXXwwLGgsNik7dT1hW2grMT4+MF08PDh8ZFtoPj4wXTtqPXUmNjU1MzU7bD1hW2grMj4+MF18MDtrPShhW2grMz4+MF08PDh8bCYyNTUpJjY1NTM1O249YVtoKzQ+PjBdfDA7bT0oYVtoKzU+PjBdPDw4fG4mMjU1KSY2NTUzNTtoPWIrMXwwO2FbaD4+MF09ajthW2grMT4+MF09aj4+ODtoPWIrM3wwO2FbaD4+MF09azthW2grMT4+MF09az4+ODtoPWIrNXwwO2FbaD4+MF09bTthW2grMT4+MF09bT4+ODtoPXU7bT0obSY2NTUzNSk+Pj44JjI1NX1lbHNle2w9cWQoZSxiKzh8MCl8MDtpZigobCYxfDApPT0wKXttPWIrMXwwO209ZFttPj4wXXxkW20rMT4+MF08PDg7aD1tJjI1NX1lbHNle2g9KHFkKGUsYis1MnwwKXwwKSYyNTU7bT1iKzF8MDttPWRbbT4+MF18ZFttKzE+PjBdPDw4O2g9KG0mMjU1KStofDA7aD0oaHwwKT4yNTU/aCs2NTI4MHwwOmh9aWYoKGwmMnwwKT09MCl7aD1tJjY1MjgwfGgmNjU1MzV9ZWxzZXt1PShxZChlLGIrOTZ8MCl8MCkmMjU1O209YisxfDA7bT1kW20+PjBdfGRbbSsxPj4wXTw8ODt1PSgobSY2NTUzNSk+Pj44KSt1fDA7aD0oKHV8MCk+MjU1P3UrNjUyODB8MDp1KTw8OHxoJjY1NTM1fWo9aCY2NTUzNTtkb3tpZigobCY2NHwwKT09MCl7az1iKzF8MDtsPWIrNXwwO249ajttPWp9ZWxzZXtrPWIrMXwwO209KGgmMjU1KS0obSYyNTUpfDA7ZG97aWYoKGwmNHwwKSE9MCl7cD1xZChlLGIrMTQwfDApfDA7bj1wJjI1NTtvPWIrM3wwO289ZFtvPj4wXXxkW28rMT4+MF08PDg7cT1vJjY1NTM1O3I9KHEmMjU1KSttfDA7cz0ocnwwKTwxO2lmKChyKyAtMXwwKT4+PjA+MjUzKXt0PXM/MDoyNTV9ZWxzZXt0PXErbSYyNTV9aWYoKHQrbnwwKT4yNTUpe2lmKCFzKXtpZigocnwwKT4yNTQpe249MjU1fWVsc2V7bj1xK20mMjU1fX1lbHNle249MH1uPShwfC0yNTYpK258MDticmVha31lbHNle2lmKCFzKXtpZigocnwwKT4yNTQpe3A9MjU1fWVsc2V7cD1xK20mMjU1fX1lbHNle3A9MH1uPXArbnwwO2JyZWFrfX1lbHNle289YiszfDA7bz1kW28+PjBdfGRbbysxPj4wXTw8ODtuPW8mMjU1fX13aGlsZSgwKTtkb3tpZigobCYxNnwwKSE9MCl7cD1xZChlLGIrMjI4fDApfDA7bz1iKzN8MDtvPWRbbz4+MF18ZFtvKzE+PjBdPDw4O3I9KChuJjI1NSkrbS0obyYyNTUpfDApLzJ8MDttPXAmMjU1O3Q9Yis1fDA7dD0oZFt0Pj4wXXxkW3QrMT4+MF08PDgpJjY1NTM1O3U9KHQmMjU1KStyfDA7cz0odXwwKTwxO2lmKCh1KyAtMXwwKT4+PjA+MjUzKXtxPXM/MDoyNTV9ZWxzZXtxPXQrciYyNTV9aWYoKHErbXwwKT4yNTUpe2lmKCFzKXtpZigodXwwKT4yNTQpe209MjU1fWVsc2V7bT10K3ImMjU1fX1lbHNle209MH1tPShwfC0yNTYpK218MDtwPW87YnJlYWt9ZWxzZXtpZighcyl7aWYoKHV8MCk+MjU0KXtwPTI1NX1lbHNle3A9dCtyJjI1NX19ZWxzZXtwPTB9bT1wK218MDtwPW87YnJlYWt9fWVsc2V7bT1iKzV8MDttPShkW20+PjBdfGRbbSsxPj4wXTw8OCkmMjU1O3A9b319d2hpbGUoMCk7bz0oaD4+PjgmMjU1KS0oKChkW2s+PjBdfGRbaysxPj4wXTw8OCkmNjU1MzUpPj4+OCl8MDtpZigobCY4fDApPT0wKXtyPXAmNjUyODB8biY2NTUzNX1lbHNle3A9cWQoZSxiKzE4NHwwKXwwO3E9cCYyNTU7dD1iKzN8MDt0PSgoKGRbdD4+MF18ZFt0KzE+PjBdPDw4KSY2NTUzNSk+Pj44KStvfDA7cj0odHwwKTwxO2lmKHIpe3M9MH1lbHNle3M9KHR8MCk+MjU0PzI1NTp0JjI1NX1pZigocytxfDApPjI1NSl7aWYocil7cT0wfWVsc2V7cT0odHwwKT4yNTQ/MjU1OnQmMjU1fXA9KHB8LTI1NikrcXwwfWVsc2V7aWYocil7cD0wfWVsc2V7cD0odHwwKT4yNTQ/MjU1OnQmMjU1fXA9cCtxfDB9cj1wPDw4fG4mNjU1MzV9bj1yJjY1NTM1O2lmKChsJjMyfDApPT0wKXt1PWIrNXwwO2w9dTttPSgoZFt1Pj4wXXxkW3UrMT4+MF08PDgpJjY1MjgwfG0pJjY1NTM1O2JyZWFrfXE9cWQoZSxiKzI3MnwwKXwwO3U9YiszfDA7cD1xJjI1NTtsPWIrNXwwO3I9KCgoZFtsPj4wXXxkW2wrMT4+MF08PDgpJjY1NTM1KT4+PjgpKygoKHI+Pj44JjI1NSkrby0oKChkW3U+PjBdfGRbdSsxPj4wXTw8OCkmNjU1MzUpPj4+OCl8MCkvMnwwKXwwO289KHJ8MCk8MTtpZihvKXtzPTB9ZWxzZXtzPShyfDApPjI1ND8yNTU6ciYyNTV9aWYoKHMrcHwwKT4yNTUpe2lmKG8pe289MH1lbHNle289KHJ8MCk+MjU0PzI1NTpyJjI1NX1vPShxfC0yNTYpK298MH1lbHNle2lmKG8pe289MH1lbHNle289KHJ8MCk+MjU0PzI1NTpyJjI1NX1vPW8rcHwwfW09KG88PDh8bSkmNjU1MzV9fXdoaWxlKDApO2Fbaz4+MF09ajthW2srMT4+MF09aj4+ODtrPWIrM3wwO2Fbaz4+MF09bjthW2srMT4+MF09bj4+ODthW2w+PjBdPW07YVtsKzE+PjBdPW0+Pjg7az1uO2w9biYyNTU7bj1tJjI1NTttPShtJjY1NTM1KT4+PjgmMjU1fWFbZisxPj4wXT0oaiY2NTUzNSk+Pj44O2FbZj4+MF09aDthW2YrMz4+MF09KGsmNjU1MzUpPj4+ODthW2YrMj4+MF09bDthW2YrNT4+MF09bTthW2YrND4+MF09bjtmPWIrMzE2fDA7aWYoKGFbZj4+MF18MCk9PTApe2k9ZztyZXR1cm59dT0oKG1kKGNbZT4+Ml18MCl8MCkmMjU1KTw8MjQ7dT0oKG1kKGNbZT4+Ml18MCl8MCkmMjU1KTw8MTZ8dTt1PXV8KChtZChjW2U+PjJdfDApfDApJjI1NSk8PDg7Y1tlKzQ+PjJdPXV8KG1kKGNbZT4+Ml18MCl8MCkmMjU1O2FbZj4+MF09MDtpPWc7cmV0dXJufWZ1bmN0aW9uIG1kKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Zz1pO2U9Yis0fDA7aD1jW2U+PjJdfDA7Zj1iKzh8MDtpZigoaHwwKTwoY1tmPj4yXXwwKSl7aj1oO2g9aisxfDA7Y1tlPj4yXT1oO2g9YisxMnwwO2g9Y1toPj4yXXwwO2o9aCtqfDA7aj1hW2o+PjBdfDA7aT1nO3JldHVybiBqfDB9Y1tlPj4yXT0wO2o9Y1tiPj4yXXwwO2g9aisxM3wwO2lmKChhW2g+PjBdfDApPT0wKXtrPWorNHwwO249ais4fDA7bD1jW24+PjJdfDA7bT0oY1trPj4yXXwwKS1sfDA7bT0obXwwKTwxMDQ4NTc2P206MTA0ODU3NjtNbihjW2IrMTI+PjJdfDAsKGNbaj4+Ml18MCkrbHwwLG18MCl8MDtsPShjW24+PjJdfDApK218MDtjW24+PjJdPWw7Y1tqKzE2Pj4yXT1tO2lmKChsfDApPj0oY1trPj4yXXwwKSl7YVtoPj4wXT0xfX1lbHNle2FbaisxMj4+MF09MX1uPWNbKGNbYj4+Ml18MCkrMTY+PjJdfDA7Y1tmPj4yXT1uO2lmKChufDApIT0wKXtuPWNbZT4+Ml18MDttPW4rMXwwO2NbZT4+Ml09bTttPWIrMTJ8MDttPWNbbT4+Ml18MDtuPW0rbnwwO249YVtuPj4wXXwwO2k9ZztyZXR1cm4gbnwwfWI9WGEoOCl8MDtjW2I+PjJdPTk5Mjg7d2hpbGUoMSl7ZT11bigzMil8MDtpZigoZXwwKSE9MCl7ZD0xNDticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7YnJlYWt9c2NbZSYzMV0oKX1pZigoZHwwKT09MTQpe2NbZSs0Pj4yXT0xOTtjW2U+PjJdPTE5O2Y9ZSsxMnwwO2NbYis0Pj4yXT1mO2NbZSs4Pj4yXT0wO2Y9ZiswfDA7ZT04MjR8MDtkPWYrMjB8MDtkb3thW2Y+PjBdPWFbZT4+MF18MDtmPWYrMXwwO2U9ZSsxfDB9d2hpbGUoKGZ8MCk8KGR8MCkpO2NbYj4+Ml09ODU2O3diKGJ8MCw4MDgsMjYpfW49WGEoNCl8MDtjW24+PjJdPTIyNjgwO3diKG58MCwyMjcyOCwyMDYpO3JldHVybiAwfWZ1bmN0aW9uIG5kKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBvZChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHBkKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2Y9aTtnPWIrNHwwO2s9Y1tnPj4yXXwwO2o9Yis4fDA7ZG97aWYoKGt8MCk8KGNbaj4+Ml18MCkpe2o9a31lbHNle2NbZz4+Ml09MDtrPWNbYj4+Ml18MDtsPWsrMTN8MDtpZigoYVtsPj4wXXwwKT09MCl7bT1rKzR8MDtwPWsrOHwwO249Y1twPj4yXXwwO289KGNbbT4+Ml18MCktbnwwO289KG98MCk8MTA0ODU3Nj9vOjEwNDg1NzY7TW4oY1tiKzEyPj4yXXwwLChjW2s+PjJdfDApK258MCxvfDApfDA7bj0oY1twPj4yXXwwKStvfDA7Y1twPj4yXT1uO2NbaysxNj4+Ml09bztpZigobnwwKT49KGNbbT4+Ml18MCkpe2FbbD4+MF09MX19ZWxzZXthW2srMTI+PjBdPTF9cD1jWyhjW2I+PjJdfDApKzE2Pj4yXXwwO2Nbaj4+Ml09cDtpZigocHwwKSE9MCl7aj1jW2c+PjJdfDA7YnJlYWt9ZT1YYSg4KXwwO2NbZT4+Ml09OTkyODt3aGlsZSgxKXtmPXVuKDMyKXwwO2lmKChmfDApIT0wKXtoPTE0O2JyZWFrfWY9Y1s1NjY2XXwwO2NbNTY2Nl09ZiswO2lmKChmfDApPT0wKXticmVha31zY1tmJjMxXSgpfWlmKChofDApPT0xNCl7Y1tmKzQ+PjJdPTE5O2NbZj4+Ml09MTk7ZD1mKzEyfDA7Y1tlKzQ+PjJdPWQ7Y1tmKzg+PjJdPTA7ZD1kKzB8MDtnPTgyNHwwO2Y9ZCsyMHwwO2Rve2FbZD4+MF09YVtnPj4wXXwwO2Q9ZCsxfDA7Zz1nKzF8MH13aGlsZSgoZHwwKTwoZnwwKSk7Y1tlPj4yXT04NTY7d2IoZXwwLDgwOCwyNil9cD1YYSg0KXwwO2NbcD4+Ml09MjI2ODA7d2IocHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2I9Y1tiKzEyPj4yXXwwO2g9YisoaitlKXwwO2lmKChlfDApPT0wKXtwPWo7cD1wK2V8MDtjW2c+PjJdPXA7aT1mO3JldHVybn1iPWIranwwO3doaWxlKDEpe2FbZD4+MF09YVtiPj4wXXwwO2I9YisxfDA7aWYoKGJ8MCk9PShofDApKXticmVha31lbHNle2Q9ZCsxfDB9fXA9Y1tnPj4yXXwwO3A9cCtlfDA7Y1tnPj4yXT1wO2k9ZjtyZXR1cm59ZnVuY3Rpb24gcWQoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTA7ZT1pO2Q9YSs4fDA7Zj1jW2Q+PjJdfDA7aD1jW2IrMTY+PjJdfDA7aWYoKGh8MCkhPTApe2o9Y1thKzQ+PjJdfDA7Zz1mPj4+MTU7Y1tkPj4yXT1nO2w9KGo+Pj4wKS8oZz4+PjApfDA7bT1sPj4+KGNbYis0MD4+Ml18MCk7az1jW2grKG08PDIpPj4yXXwwO209KGNbaCsobSsxPDwyKT4+Ml18MCkrMXwwO249aysxfDA7aD1jW2IrOD4+Ml18MDtpZihtPj4+MD5uPj4+MCl7d2hpbGUoMSl7bj0obStrfDApPj4+MTtvPShjW2grKG48PDIpPj4yXXwwKT4+PjA+bD4+PjA7az1vP2s6bjttPW8/bjptO249aysxfDA7aWYoIShtPj4+MD5uPj4+MCkpe2w9bjticmVha319fWVsc2V7bD1ufW49ZWEoZyxjW2grKGs8PDIpPj4yXXwwKXwwO2lmKChrfDApIT0oY1tiKzMyPj4yXXwwKSl7Zj1lYShjW2grKGw8PDIpPj4yXXwwLGcpfDB9fWVsc2V7aD1mPj4+MTU7Y1tkPj4yXT1oO2w9Y1tiPj4yXXwwO2c9Y1tiKzg+PjJdfDA7aj1jW2ErND4+Ml18MDttPWw+Pj4xO2s9MDtuPTA7ZG97cD1lYShjW2crKG08PDIpPj4yXXwwLGgpfDA7bz1wPj4+MD5qPj4+MDtmPW8/cDpmO249bz9uOnA7az1vP2s6bTtsPW8/bTpsO209KGsrbHwwKT4+PjF9d2hpbGUoKG18MCkhPShrfDApKX1nPWErNHwwO2g9ai1ufDA7Y1tnPj4yXT1oO3A9Zi1ufDA7Y1tkPj4yXT1wO2lmKHA+Pj4wPDE2Nzc3MjE2KXtkb3toPShtZChjW2E+PjJdfDApfDApJjI1NXxoPDw4O2NbZz4+Ml09aDtwPWNbZD4+Ml08PDg7Y1tkPj4yXT1wfXdoaWxlKHA+Pj4wPDE2Nzc3MjE2KX1vPShjW2IrMTI+PjJdfDApKyhrPDwyKXwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtvPWIrMjh8MDtwPShjW28+PjJdfDApKyAtMXwwO2Nbbz4+Ml09cDtpZigocHwwKSE9MCl7aT1lO3JldHVybiBrfDB9ZGQoYik7aT1lO3JldHVybiBrfDB9ZnVuY3Rpb24gcmQoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2U9aTtmPXFkKGIsZCl8MDtjW2E+PjJdPWY7aWYoKGZ8MCkhPTApe2lmKCEoZj4+PjA8MzIpKXtsPWNbYSsyOD4+Ml18MDtpPWU7cmV0dXJuIGx8MH1kPWNbYSsxMj4+Ml18MDtpZihmPj4+MD5kPj4+MCl7ZD1mLWR8MDtsPXFkKGIsKGNbYSs2OD4+Ml18MCkrKChmKyAtMXwwKSo0NHwwKXwwKXwwO2Q9bDw8ZHwoc2QoYixkKXwwKX1lbHNle2Q9cWQoYiwoY1thKzY4Pj4yXXwwKSsoKGYrIC0xfDApKjQ0fDApfDApfDB9YT1jW2E+PjJdfDA7aWYoKGR8MCk8KDE8PGErIC0xfDApKXtsPWQrMSsoLTE8PGEpfDA7aT1lO3JldHVybiBsfDB9ZWxzZXtsPWQrMXwwO2k9ZTtyZXR1cm4gbHwwfX1mPWErNTZ8MDtoPWIrOHwwO2w9Y1toPj4yXXwwO2o9ZWEobD4+PjEzLGNbZj4+Ml18MCl8MDtnPWIrNHwwO2s9Y1tnPj4yXXwwO209az4+PjA+PWo+Pj4wO2Q9bSYxO2lmKG0pe2NbZz4+Ml09ay1qO2o9bC1qfDA7Y1toPj4yXT1qfWVsc2V7Y1toPj4yXT1qO2o9YSs2MHwwO2Nbaj4+Ml09KGNbaj4+Ml18MCkrMTtqPWNbaD4+Ml18MH1pZihqPj4+MDwxNjc3NzIxNil7aj1jW2c+PjJdfDA7ZG97aj0obWQoY1tiPj4yXXwwKXwwKSYyNTV8ajw8ODtjW2c+PjJdPWo7bT1jW2g+PjJdPDw4O2NbaD4+Ml09bX13aGlsZShtPj4+MDwxNjc3NzIxNil9aD1hKzUyfDA7bT0oY1toPj4yXXwwKSsgLTF8MDtjW2g+PjJdPW07aWYoKG18MCkhPTApe209ZDtpPWU7cmV0dXJuIG18MH1iPWErNDh8MDtnPWNbYj4+Ml18MDtqPWErNjR8MDtrPShjW2o+PjJdfDApK2d8MDtjW2o+PjJdPWs7aWYoaz4+PjA+ODE5Mil7az0oaysxfDApPj4+MTtjW2o+PjJdPWs7bT1hKzYwfDA7YT0oKGNbbT4+Ml18MCkrMXwwKT4+PjE7Y1ttPj4yXT1hO2lmKChhfDApPT0oa3wwKSl7bT1rKzF8MDtjW2o+PjJdPW07aj1tfWVsc2V7aj1rO2s9YX19ZWxzZXtqPWs7az1jW2ErNjA+PjJdfDB9Y1tmPj4yXT0oZWEoMjE0NzQ4MzY0OC8oaj4+PjApfDAsayl8MCk+Pj4xODttPWcqNXwwO209bT4+PjA+MjU5PzY0Om0+Pj4yO2NbYj4+Ml09bTtjW2g+PjJdPW07bT1kO2k9ZTtyZXR1cm4gbXwwfWZ1bmN0aW9uIHNkKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wO2Y9aTtkPWErNHwwO2c9Y1tkPj4yXXwwO2U9YSs4fDA7aD1jW2U+PjJdfDA7aWYoYj4+PjA+MTkpe2o9aD4+PjE2O2NbZT4+Ml09ajtoPShnPj4+MCkvKGo+Pj4wKXwwO2c9Zy0oZWEoaCxqKXwwKXwwO2NbZD4+Ml09Zztkb3tnPShtZChjW2E+PjJdfDApfDApJjI1NXxnPDw4O2NbZD4+Ml09ZztqPWNbZT4+Ml08PDg7Y1tlPj4yXT1qfXdoaWxlKGo+Pj4wPDE2Nzc3MjE2KTtqPShzZChhLGIrIC0xNnwwKXwwKTw8MTZ8aCY2NTUzNTtpPWY7cmV0dXJuIGp8MH1qPWg+Pj5iO2NbZT4+Ml09ajtiPShnPj4+MCkvKGo+Pj4wKXwwO2c9Zy0oZWEoYixqKXwwKXwwO2NbZD4+Ml09ZztpZighKGo+Pj4wPDE2Nzc3MjE2KSl7aT1mO3JldHVybiBifDB9ZG97Zz0obWQoY1thPj4yXXwwKXwwKSYyNTV8Zzw8ODtjW2Q+PjJdPWc7aj1jW2U+PjJdPDw4O2NbZT4+Ml09an13aGlsZShqPj4+MDwxNjc3NzIxNik7aT1mO3JldHVybiBifDB9ZnVuY3Rpb24gdGQoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTA7Zj1pO2k9aSs5NnwwO2g9Zis0NHwwO2Q9Zjt3PWIrMzZ8MDt1PWIrNDB8MDtpZigoY1t3Pj4yXXwwKSE9KGNbdT4+Ml18MCkpe2k9ZjtyZXR1cm59aj1iKzh8MDtlPWIrMjB8MDtpZigoY1tqPj4yXXwwKSE9MCl7Zz1iKzQ0fDA7bj1oKzR8MDttPWgrOHwwO2w9aCsxMnwwO2s9aCsxNnwwO289aCsyMHwwO3A9aCsyNHwwO3E9aCsyOHwwO3I9aCszMnwwO3M9aCszNnwwO3Q9aCs0MHwwO3Y9MDtkb3tjZChoLChjW2U+PjJdfDApKzF8MCk7eD1jW3U+PjJdfDA7aWYoeD4+PjA8KGNbZz4+Ml18MCk+Pj4wKXtpZigoeHwwKT09MCl7eD0wfWVsc2V7Y1t4Pj4yXT1jW2g+PjJdO2FbeCs0Pj4wXT1hW24+PjBdfDA7Y1t4Kzg+PjJdPWNbbT4+Ml07Y1t4KzEyPj4yXT1jW2w+PjJdO2NbeCsxNj4+Ml09Y1trPj4yXTtjW3grMjA+PjJdPWNbbz4+Ml07Y1t4KzI0Pj4yXT1jW3A+PjJdO2NbeCsyOD4+Ml09Y1txPj4yXTtjW3grMzI+PjJdPWNbcj4+Ml07Y1t4KzM2Pj4yXT1jW3M+PjJdO2NbeCs0MD4+Ml09Y1t0Pj4yXTtjW20rMD4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDt4PWNbdT4+Ml18MH1jW3U+PjJdPXgrNDR9ZWxzZXt1ZCh3LGgpfXg9Y1ttPj4yXXwwO2lmKCh4fDApIT0wKXt2bihjW3grIC00Pj4yXXwwKX14PWNbbD4+Ml18MDtpZigoeHwwKSE9MCl7dm4oY1t4KyAtND4+Ml18MCl9eD1jW2s+PjJdfDA7aWYoKHh8MCkhPTApe3ZuKGNbeCsgLTQ+PjJdfDApfXY9disxfDB9d2hpbGUodj4+PjA8KGNbaj4+Ml18MCk+Pj4wKX1pZigoY1tlPj4yXXwwKT09MCl7aT1mO3JldHVybn10PWIrMTJ8MDtrPWIrNzJ8MDtzPWIrNzZ8MDtsPWQrNHwwO2o9ZCs4fDA7bz1kKzEyfDA7aD1kKzE2fDA7bT1kKzIwfDA7bj1kKzI0fDA7Zz1kKzI4fDA7cD1kKzMyfDA7cT1kKzM2fDA7cj1kKzQwfDA7Yj1iKzY4fDA7dT0xO2Rve3Y9Y1t0Pj4yXXwwO2NkKGQsMTw8KHU+Pj4wPnY+Pj4wP3Y6dSkpO3Y9Y1trPj4yXXwwO2lmKHY+Pj4wPChjW3M+PjJdfDApPj4+MCl7aWYoKHZ8MCk9PTApe3Y9MH1lbHNle2Nbdj4+Ml09Y1tkPj4yXTthW3YrND4+MF09YVtsPj4wXXwwO2Nbdis4Pj4yXT1jW2o+PjJdO2NbdisxMj4+Ml09Y1tvPj4yXTtjW3YrMTY+PjJdPWNbaD4+Ml07Y1t2KzIwPj4yXT1jW20+PjJdO2NbdisyND4+Ml09Y1tuPj4yXTtjW3YrMjg+PjJdPWNbZz4+Ml07Y1t2KzMyPj4yXT1jW3A+PjJdO2NbdiszNj4+Ml09Y1txPj4yXTtjW3YrNDA+PjJdPWNbcj4+Ml07Y1tqKzA+PjJdPTA7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7dj1jW2s+PjJdfDB9Y1trPj4yXT12KzQ0fWVsc2V7dWQoYixkKX12PWNbaj4+Ml18MDtpZigodnwwKSE9MCl7dm4oY1t2KyAtND4+Ml18MCl9dj1jW28+PjJdfDA7aWYoKHZ8MCkhPTApe3ZuKGNbdisgLTQ+PjJdfDApfXY9Y1toPj4yXXwwO2lmKCh2fDApIT0wKXt2bihjW3YrIC00Pj4yXXwwKX11PXUrMXwwfXdoaWxlKCEodT4+PjA+KGNbZT4+Ml18MCk+Pj4wKSk7aT1mO3JldHVybn1mdW5jdGlvbiB1ZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2U9aTtmPWIrNHwwO209Y1tmPj4yXXwwO2s9Y1tiPj4yXXwwO2w9aztoPShtLWx8MCkvNDR8MDtqPWgrMXwwO2lmKGo+Pj4wPjk3NjEyODkzKXtUaygpfWc9Yis4fDA7bD0oKGNbZz4+Ml18MCktbHwwKS80NHwwO2lmKGw+Pj4wPDQ4ODA2NDQ2KXtvPWw8PDE7bz1vPj4+MDxqPj4+MD9qOm87aWYoKG98MCk9PTApe3A9MDtsPTB9ZWxzZXtuPTV9fWVsc2V7bz05NzYxMjg5MztuPTV9ZG97aWYoKG58MCk9PTUpe3A9byo0NHwwO3A9KHB8MCk9PTA/MTpwO3doaWxlKDEpe2w9dW4ocCl8MDtpZigobHwwKSE9MCl7bj0xMTticmVha31sPWNbNTY2Nl18MDtjWzU2NjZdPWwrMDtpZigobHwwKT09MCl7YnJlYWt9c2NbbCYzMV0oKX1pZigobnwwKT09MTEpe3A9bzticmVha31wPVhhKDQpfDA7Y1twPj4yXT0yMjY4MDt3YihwfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7bz1sKyhoKjQ0fDApfDA7bj1sKyhwKjQ0fDApfDA7aWYoKG98MCkhPTApe2Nbbz4+Ml09Y1tkPj4yXTthW2wrKGgqNDR8MCkrND4+MF09YVtkKzQ+PjBdfDA7bT1kKzh8MDtjW2wrKGgqNDR8MCkrOD4+Ml09Y1ttPj4yXTtjW2wrKGgqNDR8MCkrMTI+PjJdPWNbZCsxMj4+Ml07Y1tsKyhoKjQ0fDApKzE2Pj4yXT1jW2QrMTY+PjJdO2NbbCsoaCo0NHwwKSsyMD4+Ml09Y1tkKzIwPj4yXTtjW2wrKGgqNDR8MCkrMjQ+PjJdPWNbZCsyND4+Ml07Y1tsKyhoKjQ0fDApKzI4Pj4yXT1jW2QrMjg+PjJdO2NbbCsoaCo0NHwwKSszMj4+Ml09Y1tkKzMyPj4yXTtjW2wrKGgqNDR8MCkrMzY+PjJdPWNbZCszNj4+Ml07Y1tsKyhoKjQ0fDApKzQwPj4yXT1jW2QrNDA+PjJdO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO209Y1tmPj4yXXwwO2s9Y1tiPj4yXXwwfWo9bCsoaio0NHwwKXwwO2lmKChtfDApIT0oa3wwKSl7aD1oKyAtMS0oKChtKyAtNDQrKDAtayl8MCk+Pj4wKS80NHwwKXwwO3doaWxlKDEpe2Q9bTttPW0rIC00NHwwO2NbbysgLTQ0Pj4yXT1jW20+PjJdO2FbbysgLTQwPj4wXT1hW2QrIC00MD4+MF18MDtwPWQrIC0zNnwwO2NbbysgLTM2Pj4yXT1jW3A+PjJdO2NbbysgLTMyPj4yXT1jW2QrIC0zMj4+Ml07Y1tvKyAtMjg+PjJdPWNbZCsgLTI4Pj4yXTtjW28rIC0yND4+Ml09Y1tkKyAtMjQ+PjJdO2NbbysgLTIwPj4yXT1jW2QrIC0yMD4+Ml07Y1tvKyAtMTY+PjJdPWNbZCsgLTE2Pj4yXTtjW28rIC0xMj4+Ml09Y1tkKyAtMTI+PjJdO2NbbysgLTg+PjJdPWNbZCsgLTg+PjJdO2NbbysgLTQ+PjJdPWNbZCsgLTQ+PjJdO2NbcCswPj4yXT0wO2NbcCs0Pj4yXT0wO2NbcCs4Pj4yXT0wO2lmKChtfDApPT0oa3wwKSl7YnJlYWt9ZWxzZXtvPW8rIC00NHwwfX1tPWNbYj4+Ml18MDtrPWNbZj4+Ml18MDtjW2I+PjJdPWwrKGgqNDR8MCk7Y1tmPj4yXT1qO2NbZz4+Ml09bjtpZigoa3wwKSE9KG18MCkpe2Rve2Y9Y1trKyAtMzY+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1trKyAtMzI+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1trKyAtMjg+PjJdfDA7az1rKyAtNDR8MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9fXdoaWxlKChrfDApIT0obXwwKSl9fWVsc2V7Y1tiPj4yXT1vO2NbZj4+Ml09ajtjW2c+PjJdPW59aWYoKG18MCk9PTApe2k9ZTtyZXR1cm59dm4obSk7aT1lO3JldHVybn1mdW5jdGlvbiB2ZChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gd2QoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geGQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7YT1jW2ErMTI+PjJdfDA7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59bGNbY1soY1thPj4yXXwwKSs4Pj4yXSYyNTVdKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24geWQoYSxiKXthPWF8MDtiPWJ8MDtpZigoY1tiKzQ+PjJdfDApPT0xNDA4KXthPWErMTJ8MH1lbHNle2E9MH1yZXR1cm4gYXwwfWZ1bmN0aW9uIHpkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEFkKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtlPWk7aT1pKzMyfDA7Zz1lO2Y9Y1tiKzg+PjJdfDA7Yj1jW2IrND4+Ml18MDtqZChnLGYsYik7aD1jW2c+PjJdfDA7YVtkKzM+PjBdPWg+Pj4yNDthW2QrMj4+MF09aD4+PjE2O2FbZCsxPj4wXT1oPj4+ODthW2Q+PjBdPWg7aD1jW2crND4+Ml18MDthW2QrNz4+MF09aD4+PjI0O2FbZCs2Pj4wXT1oPj4+MTY7YVtkKzU+PjBdPWg+Pj44O2FbZCs0Pj4wXT1oO2g9Y1tnKzg+PjJdfDA7YVtkKzExPj4wXT1oPj4+MjQ7YVtkKzEwPj4wXT1oPj4+MTY7YVtkKzk+PjBdPWg+Pj44O2FbZCs4Pj4wXT1oO2g9Y1tnKzEyPj4yXXwwO2FbZCsxMz4+MF09KGgmNjU1MzUpPj4+ODthW2QrMTI+PjBdPWg7YVtkKzE0Pj4wXT1oPj4+MTY7YVtkKzE1Pj4wXT1oPj4+MjQ7Zz1jW2crMTY+PjJdfDA7YVtkKzE2Pj4wXT1nO2FbZCsxNz4+MF09KGcmNjU1MzUpPj4+ODthW2QrMTk+PjBdPWc+Pj4yNDthW2QrMTg+PjBdPWc+Pj4xNjtsZChmKzQ3ODR8MCxiLGQrMjB8MCk7aT1lO3JldHVybn1mdW5jdGlvbiBCZChhKXthPWF8MDt2YXIgYj0wO2I9aTtjW2E+PjJdPTE3MjA7YT1jW2ErOD4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1hZChhKzQ3ODR8MCk7WGMoYSk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBDZChhKXthPWF8MDt2YXIgYj0wLGQ9MDtiPWk7Y1thPj4yXT0xNzIwO2Q9Y1thKzg+PjJdfDA7aWYoKGR8MCk9PTApe3ZuKGEpO2k9YjtyZXR1cm59YWQoZCs0Nzg0fDApO1hjKGQpO3ZuKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gRGQoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEVkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEZkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2E9Y1thKzEyPj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEdkKGEsYil7YT1hfDA7Yj1ifDA7aWYoKGNbYis0Pj4yXXwwKT09MjM3Nil7YT1hKzEyfDB9ZWxzZXthPTB9cmV0dXJuIGF8MH1mdW5jdGlvbiBIZChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBJZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2U9aTtpPWkrMzJ8MDtoPWU7Zj1jW2IrOD4+Ml18MDtiPWNbYis0Pj4yXXwwO2pkKGgsZixiKTtnPWNbaD4+Ml18MDthW2QrMz4+MF09Zz4+PjI0O2FbZCsyPj4wXT1nPj4+MTY7YVtkKzE+PjBdPWc+Pj44O2FbZD4+MF09ZztnPWNbaCs0Pj4yXXwwO2FbZCs3Pj4wXT1nPj4+MjQ7YVtkKzY+PjBdPWc+Pj4xNjthW2QrNT4+MF09Zz4+Pjg7YVtkKzQ+PjBdPWc7Zz1jW2grOD4+Ml18MDthW2QrMTE+PjBdPWc+Pj4yNDthW2QrMTA+PjBdPWc+Pj4xNjthW2QrOT4+MF09Zz4+Pjg7YVtkKzg+PjBdPWc7Zz1jW2grMTI+PjJdfDA7YVtkKzEzPj4wXT0oZyY2NTUzNSk+Pj44O2FbZCsxMj4+MF09ZzthW2QrMTQ+PjBdPWc+Pj4xNjthW2QrMTU+PjBdPWc+Pj4yNDtoPWNbaCsxNj4+Ml18MDthW2QrMTY+PjBdPWg7YVtkKzE3Pj4wXT0oaCY2NTUzNSk+Pj44O2FbZCsxOT4+MF09aD4+PjI0O2FbZCsxOD4+MF09aD4+PjE2O2g9a2QoZis0Nzg0fDAsYil8MDtnPUk7YVtkKzIzPj4wXT1oPj4+MjQ7YVtkKzIyPj4wXT1oPj4+MTY7YVtkKzIxPj4wXT1oPj4+ODthW2QrMjA+PjBdPWg7aj1LbihofDAsZ3wwLDU2KXwwO2FbZCsyNz4+MF09ajtqPUtuKGh8MCxnfDAsNDgpfDA7YVtkKzI2Pj4wXT1qO2g9S24oaHwwLGd8MCw0MCl8MDthW2QrMjU+PjBdPWg7YVtkKzI0Pj4wXT1nO2Q9Zis1MTEyfDA7aWYoKGFbZD4+MF18MCk9PTApe2k9ZTtyZXR1cm59aj0oKG1kKGNbYj4+Ml18MCl8MCkmMjU1KTw8MjQ7aj0oKG1kKGNbYj4+Ml18MCl8MCkmMjU1KTw8MTZ8ajtqPWp8KChtZChjW2I+PjJdfDApfDApJjI1NSk8PDg7Y1tiKzQ+PjJdPWp8KG1kKGNbYj4+Ml18MCl8MCkmMjU1O2FbZD4+MF09MDtpPWU7cmV0dXJufWZ1bmN0aW9uIEpkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2NbYT4+Ml09MjY2NDthPWNbYSs4Pj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufV9jKGErNTA5NnwwKTtfYyhhKzUwNjR8MCk7WmMoYSs0OTQ4fDApOyRjKGErNDc4NHwwKTtYYyhhKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEtkKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2I9aTtjW2E+PjJdPTI2NjQ7ZD1jW2ErOD4+Ml18MDtpZigoZHwwKT09MCl7dm4oYSk7aT1iO3JldHVybn1fYyhkKzUwOTZ8MCk7X2MoZCs1MDY0fDApO1pjKGQrNDk0OHwwKTskYyhkKzQ3ODR8MCk7WGMoZCk7dm4oZCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBMZChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gTWQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gTmQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7YT1jW2ErMTI+PjJdfDA7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59bGNbY1soY1thPj4yXXwwKSs4Pj4yXSYyNTVdKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gT2QoYSxiKXthPWF8MDtiPWJ8MDtpZigoY1tiKzQ+PjJdfDApPT0zMzIwKXthPWErMTJ8MH1lbHNle2E9MH1yZXR1cm4gYXwwfWZ1bmN0aW9uIFBkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFFkKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtlPWk7aT1pKzMyfDA7Zz1lO2Y9Y1tiKzg+PjJdfDA7Yj1jW2IrND4+Ml18MDtqZChnLGYsYik7aD1jW2c+PjJdfDA7YVtkKzM+PjBdPWg+Pj4yNDthW2QrMj4+MF09aD4+PjE2O2FbZCsxPj4wXT1oPj4+ODthW2Q+PjBdPWg7aD1jW2crND4+Ml18MDthW2QrNz4+MF09aD4+PjI0O2FbZCs2Pj4wXT1oPj4+MTY7YVtkKzU+PjBdPWg+Pj44O2FbZCs0Pj4wXT1oO2g9Y1tnKzg+PjJdfDA7YVtkKzExPj4wXT1oPj4+MjQ7YVtkKzEwPj4wXT1oPj4+MTY7YVtkKzk+PjBdPWg+Pj44O2FbZCs4Pj4wXT1oO2g9Y1tnKzEyPj4yXXwwO2FbZCsxMz4+MF09KGgmNjU1MzUpPj4+ODthW2QrMTI+PjBdPWg7YVtkKzE0Pj4wXT1oPj4+MTY7YVtkKzE1Pj4wXT1oPj4+MjQ7Zz1jW2crMTY+PjJdfDA7YVtkKzE2Pj4wXT1nO2FbZCsxNz4+MF09KGcmNjU1MzUpPj4+ODthW2QrMTk+PjBdPWc+Pj4yNDthW2QrMTg+PjBdPWc+Pj4xNjtkPWYrNDc4NHwwO2lmKChhW2Q+PjBdfDApPT0wKXtpPWU7cmV0dXJufWg9KChtZChjW2I+PjJdfDApfDApJjI1NSk8PDI0O2g9KChtZChjW2I+PjJdfDApfDApJjI1NSk8PDE2fGg7aD1ofCgobWQoY1tiPj4yXXwwKXwwKSYyNTUpPDw4O2NbYis0Pj4yXT1ofChtZChjW2I+PjJdfDApfDApJjI1NTthW2Q+PjBdPTA7aT1lO3JldHVybn1mdW5jdGlvbiBSZChhKXthPWF8MDt2YXIgYj0wO2I9aTtjW2E+PjJdPTM2MDg7YT1jW2ErOD4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1YYyhhKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFNkKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2I9aTtjW2E+PjJdPTM2MDg7ZD1jW2ErOD4+Ml18MDtpZigoZHwwKT09MCl7dm4oYSk7aT1iO3JldHVybn1YYyhkKTt2bihkKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFRkKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBVZChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBWZChhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSsxMj4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1sY1tjWyhjW2E+PjJdfDApKzg+PjJdJjI1NV0oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBXZChhLGIpe2E9YXwwO2I9YnwwO2lmKChjW2IrND4+Ml18MCk9PTQyMTYpe2E9YSsxMnwwfWVsc2V7YT0wfXJldHVybiBhfDB9ZnVuY3Rpb24gWGQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gWWQoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7Y1tiPj4yXT00NTAwO2NbYis2ND4+Ml09NDU0MDtjW2IrOD4+Ml09NDUyMDtlPWIrMTJ8MDtjW2U+PjJdPTQ2ODg7aWYoISgoYVtiKzQ0Pj4wXSYxKT09MCk/KGY9Y1tiKzUyPj4yXXwwLChmfDApIT0wKTowKXt2bihmKX1jW2U+PjJdPTEwNjY0O2U9Y1tiKzE2Pj4yXXwwO2c9ZSs0fDA7Zj1jW2c+PjJdfDA7Y1tnPj4yXT1mKyAtMTtpZigoZnwwKSE9MCl7Zz1iKzY0fDA7cmcoZyk7aT1kO3JldHVybn1sY1tjWyhjW2U+PjJdfDApKzg+PjJdJjI1NV0oZSk7Zz1iKzY0fDA7cmcoZyk7aT1kO3JldHVybn1mdW5jdGlvbiBaZChiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wO2Q9aTtnPWIrIC04fDA7Y1tnPj4yXT00NTAwO2I9Zys2NHwwO2NbYj4+Ml09NDU0MDtjW2crOD4+Ml09NDUyMDtmPWcrMTJ8MDtjW2Y+PjJdPTQ2ODg7aWYoISgoYVtnKzQ0Pj4wXSYxKT09MCk/KGU9Y1tnKzUyPj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1jW2Y+PjJdPTEwNjY0O2U9Y1tnKzE2Pj4yXXwwO2Y9ZSs0fDA7Zz1jW2Y+PjJdfDA7Y1tmPj4yXT1nKyAtMTtpZigoZ3wwKSE9MCl7cmcoYik7aT1kO3JldHVybn1sY1tjWyhjW2U+PjJdfDApKzg+PjJdJjI1NV0oZSk7cmcoYik7aT1kO3JldHVybn1mdW5jdGlvbiBfZChiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MDtlPWk7Zz1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7Y1tiK2c+PjJdPTQ1MDA7ZD1iKyhnKzY0KXwwO2NbZD4+Ml09NDU0MDtjW2IrKGcrOCk+PjJdPTQ1MjA7Zj1iKyhnKzEyKXwwO2NbZj4+Ml09NDY4ODtpZighKChhW2IrKGcrNDQpPj4wXSYxKT09MCk/KGg9Y1tiKyhnKzUyKT4+Ml18MCwoaHwwKSE9MCk6MCl7dm4oaCl9Y1tmPj4yXT0xMDY2NDtiPWNbYisoZysxNik+PjJdfDA7Zz1iKzR8MDtoPWNbZz4+Ml18MDtjW2c+PjJdPWgrIC0xO2lmKChofDApIT0wKXtyZyhkKTtpPWU7cmV0dXJufWxjW2NbKGNbYj4+Ml18MCkrOD4+Ml0mMjU1XShiKTtyZyhkKTtpPWU7cmV0dXJufWZ1bmN0aW9uICRkKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTA7ZD1pO2NbYj4+Ml09NDUwMDtjW2IrNjQ+PjJdPTQ1NDA7Y1tiKzg+PjJdPTQ1MjA7ZT1iKzEyfDA7Y1tlPj4yXT00Njg4O2lmKCEoKGFbYis0ND4+MF0mMSk9PTApPyhmPWNbYis1Mj4+Ml18MCwoZnwwKSE9MCk6MCl7dm4oZil9Y1tlPj4yXT0xMDY2NDtlPWNbYisxNj4+Ml18MDtnPWUrNHwwO2Y9Y1tnPj4yXXwwO2NbZz4+Ml09ZisgLTE7aWYoKGZ8MCk9PTApe2xjW2NbKGNbZT4+Ml18MCkrOD4+Ml0mMjU1XShlKX1yZyhiKzY0fDApO2lmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gYWUoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7ZD1pO2Y9YisgLTh8MDtjW2Y+PjJdPTQ1MDA7Yj1mKzY0fDA7Y1tiPj4yXT00NTQwO2NbZis4Pj4yXT00NTIwO2c9ZisxMnwwO2NbZz4+Ml09NDY4ODtpZighKChhW2YrNDQ+PjBdJjEpPT0wKT8oZT1jW2YrNTI+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWNbZz4+Ml09MTA2NjQ7ZT1jW2YrMTY+PjJdfDA7aD1lKzR8MDtnPWNbaD4+Ml18MDtjW2g+PjJdPWcrIC0xO2lmKChnfDApIT0wKXtyZyhiKTt2bihmKTtpPWQ7cmV0dXJufWxjW2NbKGNbZT4+Ml18MCkrOD4+Ml0mMjU1XShlKTtyZyhiKTt2bihmKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIGJlKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MDtkPWk7aD1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7Zj1iK2h8MDtjW2Y+PjJdPTQ1MDA7ZT1iKyhoKzY0KXwwO2NbZT4+Ml09NDU0MDtjW2IrKGgrOCk+PjJdPTQ1MjA7Zz1iKyhoKzEyKXwwO2NbZz4+Ml09NDY4ODtpZighKChhW2IrKGgrNDQpPj4wXSYxKT09MCk/KGo9Y1tiKyhoKzUyKT4+Ml18MCwoanwwKSE9MCk6MCl7dm4oail9Y1tnPj4yXT0xMDY2NDtiPWNbYisoaCsxNik+PjJdfDA7aD1iKzR8MDtqPWNbaD4+Ml18MDtjW2g+PjJdPWorIC0xO2lmKChqfDApPT0wKXtsY1tjWyhjW2I+PjJdfDApKzg+PjJdJjI1NV0oYil9cmcoZSk7aWYoKGZ8MCk9PTApe2k9ZDtyZXR1cm59dm4oZik7aT1kO3JldHVybn1mdW5jdGlvbiBjZShiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTA7ZD1pO2NbYj4+Ml09NDY4ODtpZighKChhW2IrMzI+PjBdJjEpPT0wKT8oZT1jW2IrNDA+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWNbYj4+Ml09MTA2NjQ7Yj1jW2IrND4+Ml18MDtmPWIrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe2k9ZDtyZXR1cm59bGNbY1soY1tiPj4yXXwwKSs4Pj4yXSYyNTVdKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZGUoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7Y1tiPj4yXT00Njg4O2lmKCEoKGFbYiszMj4+MF0mMSk9PTApPyhlPWNbYis0MD4+Ml18MCwoZXwwKSE9MCk6MCl7dm4oZSl9Y1tiPj4yXT0xMDY2NDtlPWNbYis0Pj4yXXwwO2c9ZSs0fDA7Zj1jW2c+PjJdfDA7Y1tnPj4yXT1mKyAtMTtpZigoZnwwKT09MCl7bGNbY1soY1tlPj4yXXwwKSs4Pj4yXSYyNTVdKGUpfWlmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZWUoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MDtsPWk7bz1kKzQ0fDA7bT1jW28+PjJdfDA7az1kKzI0fDA7aj1jW2s+PjJdfDA7aWYobT4+PjA8aj4+PjApe2Nbbz4+Ml09ajttPWp9bz1oJjI0O2Rve2lmKChvfDApPT0wKXtvPWI7Y1tvPj4yXT0wO2Nbbys0Pj4yXT0wO289Yis4fDA7Y1tvPj4yXT0tMTtjW28rND4+Ml09LTE7aT1sO3JldHVybn1lbHNlIGlmKChvfDApIT0yNCl7aWYoKGd8MCk9PTIpe249MTE7YnJlYWt9ZWxzZSBpZigoZ3wwKT09MCl7Zz0wO289MDticmVha31lbHNlIGlmKChnfDApIT0xKXtuPTE1O2JyZWFrfWlmKChoJjh8MCk9PTApe289ai0oY1tkKzIwPj4yXXwwKXwwO2c9bztvPSgob3wwKTwwKTw8MzE+PjMxO2JyZWFrfWVsc2V7bz0oY1tkKzEyPj4yXXwwKS0oY1tkKzg+PjJdfDApfDA7Zz1vO289KChvfDApPDApPDwzMT4+MzE7YnJlYWt9fWVsc2V7aWYoKGd8MCk9PTIpe249MTE7YnJlYWt9ZWxzZSBpZigoZ3wwKT09MCl7Zz0wO289MDticmVha31lbHNlIGlmKChnfDApIT0xKXtuPTE1O2JyZWFrfW89YjtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7bz1iKzh8MDtjW28+PjJdPS0xO2Nbbys0Pj4yXT0tMTtpPWw7cmV0dXJufX13aGlsZSgwKTtpZigobnwwKT09MTUpe289YjtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7bz1iKzh8MDtjW28+PjJdPS0xO2Nbbys0Pj4yXT0tMTtpPWw7cmV0dXJufWlmKChufDApPT0xMSl7bj1kKzMyfDA7aWYoKGFbbj4+MF0mMSk9PTApe249bisxfDB9ZWxzZXtuPWNbZCs0MD4+Ml18MH1vPW0tbnwwO2c9bztvPSgob3wwKTwwKTw8MzE+PjMxfWY9SW4oZ3wwLG98MCxlfDAsZnwwKXwwO2U9STtpZigoZXwwKT49MCl7bj1kKzMyfDA7aWYoKGFbbj4+MF0mMSk9PTApe249bisxfDB9ZWxzZXtuPWNbZCs0MD4+Ml18MH1vPW0tbnwwO2c9KChvfDApPDApPDwzMT4+MzE7aWYoISgoZ3wwKTwoZXwwKXwoZ3wwKT09KGV8MCkmbz4+PjA8Zj4+PjApKXtuPWgmODtpZighKChmfDApPT0wJihlfDApPT0wKSl7aWYoKG58MCkhPTA/KGNbZCsxMj4+Ml18MCk9PTA6MCl7bz1iO2Nbbz4+Ml09MDtjW28rND4+Ml09MDtvPWIrOHwwO2Nbbz4+Ml09LTE7Y1tvKzQ+PjJdPS0xO2k9bDtyZXR1cm59aWYoKGgmMTZ8MCkhPTAmKGp8MCk9PTApe289YjtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7bz1iKzh8MDtjW28+PjJdPS0xO2Nbbys0Pj4yXT0tMTtpPWw7cmV0dXJufX1pZigobnwwKSE9MCl7Y1tkKzEyPj4yXT0oY1tkKzg+PjJdfDApK2Y7Y1tkKzE2Pj4yXT1tfWlmKChoJjE2fDApIT0wKXtjW2s+PjJdPShjW2QrMjA+PjJdfDApK2Z9bz1iO2Nbbz4+Ml09MDtjW28rND4+Ml09MDtvPWIrOHwwO2Nbbz4+Ml09ZjtjW28rND4+Ml09ZTtpPWw7cmV0dXJufX1vPWI7Y1tvPj4yXT0wO2Nbbys0Pj4yXT0wO289Yis4fDA7Y1tvPj4yXT0tMTtjW28rND4+Ml09LTE7aT1sO3JldHVybn1mdW5jdGlvbiBmZShhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wO2Y9aTtkPWQrOHwwO3djW2NbKGNbYj4+Ml18MCkrMTY+PjJdJjYzXShhLGIsY1tkPj4yXXwwLGNbZCs0Pj4yXXwwLDAsZSk7aT1mO3JldHVybn1mdW5jdGlvbiBnZShhKXthPWF8MDt2YXIgYj0wLGU9MCxmPTAsZz0wO2I9aTtmPWErNDR8MDtnPWNbZj4+Ml18MDtlPWNbYSsyND4+Ml18MDtpZihnPj4+MDxlPj4+MCl7Y1tmPj4yXT1lfWVsc2V7ZT1nfWlmKChjW2ErNDg+PjJdJjh8MCk9PTApe2c9LTE7aT1iO3JldHVybiBnfDB9Zj1hKzE2fDA7Zz1jW2Y+PjJdfDA7YT1jW2ErMTI+PjJdfDA7aWYoZz4+PjA8ZT4+PjApe2NbZj4+Ml09ZX1lbHNle2U9Z31pZighKGE+Pj4wPGU+Pj4wKSl7Zz0tMTtpPWI7cmV0dXJuIGd8MH1nPWRbYT4+MF18MDtpPWI7cmV0dXJuIGd8MH1mdW5jdGlvbiBoZShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7ZT1pO2c9Yis0NHwwO2Y9Y1tnPj4yXXwwO2o9Y1tiKzI0Pj4yXXwwO2lmKGY+Pj4wPGo+Pj4wKXtjW2c+PjJdPWp9ZWxzZXtqPWZ9Zj1iKzh8MDtnPWNbZj4+Ml18MDtoPWIrMTJ8MDtsPWNbaD4+Ml18MDtpZighKGc+Pj4wPGw+Pj4wKSl7bD0tMTtpPWU7cmV0dXJuIGx8MH1pZigoZHwwKT09LTEpe2NbZj4+Ml09ZztjW2g+PjJdPWwrIC0xO2NbYisxNj4+Ml09ajtsPTA7aT1lO3JldHVybiBsfDB9aWYoKGNbYis0OD4+Ml0mMTZ8MCk9PTApe2s9ZCYyNTU7bD1sKyAtMXwwO2lmKCEoazw8MjQ+PjI0PT0oYVtsPj4wXXwwKSkpe2w9LTE7aT1lO3JldHVybiBsfDB9fWVsc2V7az1kJjI1NTtsPWwrIC0xfDB9Y1tmPj4yXT1nO2NbaD4+Ml09bDtjW2IrMTY+PjJdPWo7YVtsPj4wXT1rO2w9ZDtpPWU7cmV0dXJuIGx8MH1mdW5jdGlvbiBpZShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7aj1pO2lmKChkfDApPT0tMSl7dT0wO2k9ajtyZXR1cm4gdXwwfWc9YisxMnwwO2U9Yis4fDA7Zj0oY1tnPj4yXXwwKS0oY1tlPj4yXXwwKXwwO2g9YisyNHwwO249Y1toPj4yXXwwO2s9YisyOHwwO209Y1trPj4yXXwwO2lmKChufDApPT0obXwwKSl7bD1iKzQ4fDA7aWYoKGNbbD4+Ml0mMTZ8MCk9PTApe3U9LTE7aT1qO3JldHVybiB1fDB9bT1iKzIwfDA7cD1jW20+PjJdfDA7bj1uLXB8MDtvPWIrNDR8MDtwPShjW28+PjJdfDApLXB8MDtxPWIrMzJ8MDtyPWFbcT4+MF18MDtzPShyJjEpIT0wO2lmKHMpe3Q9KGNbcT4+Ml0mLTIpKyAtMXwwO3I9Y1tiKzM2Pj4yXXwwfWVsc2V7dD0xMDtyPShyJjI1NSk+Pj4xfWlmKChyfDApPT0odHwwKSl7bGcocSx0LDEsdCx0LDApO2lmKChhW3E+PjBdJjEpPT0wKXtzPTEyfWVsc2V7cz0xM319ZWxzZXtpZihzKXtzPTEzfWVsc2V7cz0xMn19aWYoKHN8MCk9PTEyKXthW3E+PjBdPShyPDwxKSsyO3U9cSsxfDA7dD1yKzF8MH1lbHNlIGlmKChzfDApPT0xMyl7dT1jW2IrNDA+PjJdfDA7dD1yKzF8MDtjW2IrMzY+PjJdPXR9YVt1K3I+PjBdPTA7YVt1K3Q+PjBdPTA7dD1hW3E+PjBdfDA7aWYoKHQmMSk9PTApe3I9MTB9ZWxzZXtyPWNbcT4+Ml18MDt0PXImMjU1O3I9KHImLTIpKyAtMXwwfXM9KHQmMSk9PTA7aWYocyl7dD0odCYyNTUpPj4+MX1lbHNle3Q9Y1tiKzM2Pj4yXXwwfWRve2lmKCEodD4+PjA8cj4+PjApKXtpZihzKXthW3ErcisxPj4wXT0wO2FbcT4+MF09cjw8MTticmVha31lbHNle2FbKGNbYis0MD4+Ml18MCkrcj4+MF09MDtjW2IrMzY+PjJdPXI7YnJlYWt9fWVsc2V7aGcocSxyLXR8MCl9fXdoaWxlKDApO3I9YVtxPj4wXXwwO2lmKChyJjEpPT0wKXtxPXErMXwwO3I9KHImMjU1KT4+PjF9ZWxzZXtxPWNbYis0MD4+Ml18MDtyPWNbYiszNj4+Ml18MH10PXErcnwwO2NbbT4+Ml09cTtjW2s+PjJdPXQ7bj1xK258MDtjW2g+PjJdPW47dT1xK3B8MDtjW28+PjJdPXU7az10O289dX1lbHNle2w9Yis0OHwwO2s9bTtvPWNbYis0ND4+Ml18MH1tPW4rMXwwO289bT4+PjA8bz4+PjA/bzptO2NbYis0ND4+Ml09bztpZigoY1tsPj4yXSY4fDApIT0wKXtsPWIrMzJ8MDtpZigoYVtsPj4wXSYxKT09MCl7bD1sKzF8MH1lbHNle2w9Y1tiKzQwPj4yXXwwfWNbZT4+Ml09bDtjW2c+PjJdPWwrZjtjW2IrMTY+PjJdPW99aWYoKG58MCk9PShrfDApKXt1PXhjW2NbKGNbYj4+Ml18MCkrNTI+PjJdJjYzXShiLGQmMjU1KXwwO2k9ajtyZXR1cm4gdXwwfWVsc2V7Y1toPj4yXT1tO2Fbbj4+MF09ZDt1PWQmMjU1O2k9ajtyZXR1cm4gdXwwfXJldHVybiAwfWZ1bmN0aW9uIGplKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBrZShhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBsZShhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSsxMj4+Ml18MDtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBtZShhLGIpe2E9YXwwO2I9YnwwO2lmKChjW2IrND4+Ml18MCk9PTUwNDgpe2E9YSsxMnwwfWVsc2V7YT0wfXJldHVybiBhfDB9ZnVuY3Rpb24gbmUoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gb2UoYil7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGo9MCxsPTAsbT0wLG49MCxvPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsSj0wLjAsSz0wLjAsTD0wLjAsTT0wLjAsTj0wLjAsTz0wLjA7ZT1pO2k9aSsyNTZ8MDtmPWUrODB8MDtvPWU7bj1lKzEwNHwwO209ZSsyMjR8MDtqPWUrMjA4fDA7Zz1lKzEyOHwwO3g9ZSsyNDB8MDt2PWUrMTEyfDA7cz1lKzU2fDA7ej1jW2I+PjJdfDA7eT16KzEzfDA7aWYoKGFbeT4+MF18MCk9PTApe0g9eis0fDA7RT16Kzh8MDtHPWNbRT4+Ml18MDtGPShjW0g+PjJdfDApLUd8MDtGPShGfDApPDQ/Rjo0O01uKHh8MCwoY1t6Pj4yXXwwKStHfDAsRnwwKXwwO0c9KGNbRT4+Ml18MCkrRnwwO2NbRT4+Ml09RztjW3orMTY+PjJdPUY7aWYoKEd8MCk+PShjW0g+PjJdfDApKXthW3k+PjBdPTF9fWVsc2V7YVt6KzEyPj4wXT0xfWFbdj4+MF09ODtCPXYrMXwwO2FbQj4+MF09YVt4Pj4wXXwwO2FbdisyPj4wXT1hW3grMT4+MF18MDthW3YrMz4+MF09YVt4KzI+PjBdfDA7eT12KzR8MDthW3k+PjBdPWFbeCszPj4wXXwwO2FbdisoeCsoNC14KSkrMT4+MF09MDt6PWFbdj4+MF18MDt4PSh6JjEpPT0wO2lmKHgpe3k9KHomMjU1KT4+PjF9ZWxzZXtCPWNbdis4Pj4yXXwwO3k9Y1t5Pj4yXXwwfXo9eT4+PjA+NDtBPXo/NDp5O2E6ZG97aWYoKEF8MCkhPTApe0M9NTIzMjt3aGlsZSgxKXtEPWFbQj4+MF18MDtFPWFbQz4+MF18MDtpZighKEQ8PDI0Pj4yND09RTw8MjQ+PjI0KSl7YnJlYWt9QT1BKyAtMXwwO2lmKChBfDApPT0wKXtsPTEyO2JyZWFrIGF9ZWxzZXtCPUIrMXwwO0M9QysxfDB9fWlmKCEoRDw8MjQ+PjI0PT1FPDwyND4+MjQpKXt5PShEJjI1NSktKEUmMjU1KXwwfWVsc2V7bD0xMn19ZWxzZXtsPTEyfX13aGlsZSgwKTtpZigobHwwKT09MTIpe3k9eT4+PjA8ND8tMTp6JjF9eT0oeXwwKT09MDtpZigheD8odz1jW3YrOD4+Ml18MCwod3wwKSE9MCk6MCl7dm4odyl9aWYoIXkpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11bigzNil8MDtpZigoYnwwKSE9MCl7bD0yMzticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MjMpe2NbYis0Pj4yXT0yMztjW2I+PjJdPTIzO2Y9YisxMnwwO2NbZys0Pj4yXT1mO2NbYis4Pj4yXT0wO2Y9ZiswfDA7Yj03MDU2fDA7ZT1mKzI0fDA7ZG97YVtmPj4wXT1hW2I+PjBdfDA7Zj1mKzF8MDtiPWIrMXwwfXdoaWxlKChmfDApPChlfDApKTtjW2c+PjJdPTcwODg7d2IoZ3wwLDUyNzIsODYpfUg9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfXY9U2MoODM1Miw1Mjg4KXwwO3c9Y1t2KygoY1soY1t2Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7eD13KzR8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9ej0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7eT1jW3crOD4+Ml18MDtpZigoY1t3KzEyPj4yXXwwKS15Pj4yPj4+MD56Pj4+MD8odT1jW3krKHo8PDIpPj4yXXwwLCh1fDApIT0wKTowKXt1PXhjW2NbKGNbdT4+Ml18MCkrMjg+PjJdJjYzXSh1LDEwKXwwO0g9Y1t4Pj4yXXwwO2NbeD4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbdz4+Ml18MCkrOD4+Ml0mMjU1XSh3KX1saCh2LHUpO1lnKHYpO3U9Y1tiPj4yXXwwO2lmKChjW3UrND4+Ml18MCk+MCl7Y1t1Kzg+PjJdPTB9ZWxzZXthW3UrMTI+PjBdPTF9dj1jW2I+PjJdfDA7dT1iKzIwfDA7dz12KzEzfDA7aWYoKGFbdz4+MF18MCk9PTApe0g9dis0fDA7RT12Kzh8MDtHPWNbRT4+Ml18MDtGPShjW0g+PjJdfDApLUd8MDtGPShGfDApPDIyNz9GOjIyNztNbih1fDAsKGNbdj4+Ml18MCkrR3wwLEZ8MCl8MDtHPShjW0U+PjJdfDApK0Z8MDtjW0U+PjJdPUc7Y1t2KzE2Pj4yXT1GO2lmKChHfDApPj0oY1tIPj4yXXwwKSl7YVt3Pj4wXT0xfX1lbHNle2FbdisxMj4+MF09MX1DPWIrMTk5fDA7YVtrPj4wXT1hW0M+PjBdO2FbaysxPj4wXT1hW0MrMT4+MF07YVtrKzI+PjBdPWFbQysyPj4wXTthW2srMz4+MF09YVtDKzM+PjBdO2Fbays0Pj4wXT1hW0MrND4+MF07YVtrKzU+PjBdPWFbQys1Pj4wXTthW2srNj4+MF09YVtDKzY+PjBdO2Fbays3Pj4wXT1hW0MrNz4+MF07Tj0raFtrPj4zXTtFPWIrMjA3fDA7YVtrPj4wXT1hW0U+PjBdO2FbaysxPj4wXT1hW0UrMT4+MF07YVtrKzI+PjBdPWFbRSsyPj4wXTthW2srMz4+MF09YVtFKzM+PjBdO2Fbays0Pj4wXT1hW0UrND4+MF07YVtrKzU+PjBdPWFbRSs1Pj4wXTthW2srNj4+MF09YVtFKzY+PjBdO2Fbays3Pj4wXT1hW0UrNz4+MF07Tz0raFtrPj4zXTtHPWIrMjE1fDA7YVtrPj4wXT1hW0c+PjBdO2FbaysxPj4wXT1hW0crMT4+MF07YVtrKzI+PjBdPWFbRysyPj4wXTthW2srMz4+MF09YVtHKzM+PjBdO2Fbays0Pj4wXT1hW0crND4+MF07YVtrKzU+PjBdPWFbRys1Pj4wXTthW2srNj4+MF09YVtHKzY+PjBdO2Fbays3Pj4wXT1hW0crNz4+MF07TD0raFtrPj4zXTtEPWIrMjIzfDA7YVtrPj4wXT1hW0Q+PjBdO2FbaysxPj4wXT1hW0QrMT4+MF07YVtrKzI+PjBdPWFbRCsyPj4wXTthW2srMz4+MF09YVtEKzM+PjBdO2Fbays0Pj4wXT1hW0QrND4+MF07YVtrKzU+PjBdPWFbRCs1Pj4wXTthW2srNj4+MF09YVtEKzY+PjBdO2Fbays3Pj4wXT1hW0QrNz4+MF07TT0raFtrPj4zXTtGPWIrMjMxfDA7YVtrPj4wXT1hW0Y+PjBdO2FbaysxPj4wXT1hW0YrMT4+MF07YVtrKzI+PjBdPWFbRisyPj4wXTthW2srMz4+MF09YVtGKzM+PjBdO2Fbays0Pj4wXT1hW0YrND4+MF07YVtrKzU+PjBdPWFbRis1Pj4wXTthW2srNj4+MF09YVtGKzY+PjBdO2Fbays3Pj4wXT1hW0YrNz4+MF07Sj0raFtrPj4zXTtIPWIrMjM5fDA7YVtrPj4wXT1hW0g+PjBdO2FbaysxPj4wXT1hW0grMT4+MF07YVtrKzI+PjBdPWFbSCsyPj4wXTthW2srMz4+MF09YVtIKzM+PjBdO2Fbays0Pj4wXT1hW0grND4+MF07YVtrKzU+PjBdPWFbSCs1Pj4wXTthW2srNj4+MF09YVtIKzY+PjBdO2Fbays3Pj4wXT1hW0grNz4+MF07Sz0raFtrPj4zXTtoW2s+PjNdPU87YVtDPj4wXT1hW2s+PjBdO2FbQysxPj4wXT1hW2srMT4+MF07YVtDKzI+PjBdPWFbaysyPj4wXTthW0MrMz4+MF09YVtrKzM+PjBdO2FbQys0Pj4wXT1hW2srND4+MF07YVtDKzU+PjBdPWFbays1Pj4wXTthW0MrNj4+MF09YVtrKzY+PjBdO2FbQys3Pj4wXT1hW2srNz4+MF07aFtrPj4zXT1OO2FbRD4+MF09YVtrPj4wXTthW0QrMT4+MF09YVtrKzE+PjBdO2FbRCsyPj4wXT1hW2srMj4+MF07YVtEKzM+PjBdPWFbayszPj4wXTthW0QrND4+MF09YVtrKzQ+PjBdO2FbRCs1Pj4wXT1hW2srNT4+MF07YVtEKzY+PjBdPWFbays2Pj4wXTthW0QrNz4+MF09YVtrKzc+PjBdO2hbaz4+M109TTthW0U+PjBdPWFbaz4+MF07YVtFKzE+PjBdPWFbaysxPj4wXTthW0UrMj4+MF09YVtrKzI+PjBdO2FbRSszPj4wXT1hW2srMz4+MF07YVtFKzQ+PjBdPWFbays0Pj4wXTthW0UrNT4+MF09YVtrKzU+PjBdO2FbRSs2Pj4wXT1hW2srNj4+MF07YVtFKzc+PjBdPWFbays3Pj4wXTtoW2s+PjNdPUw7YVtGPj4wXT1hW2s+PjBdO2FbRisxPj4wXT1hW2srMT4+MF07YVtGKzI+PjBdPWFbaysyPj4wXTthW0YrMz4+MF09YVtrKzM+PjBdO2FbRis0Pj4wXT1hW2srND4+MF07YVtGKzU+PjBdPWFbays1Pj4wXTthW0YrNj4+MF09YVtrKzY+PjBdO2FbRis3Pj4wXT1hW2srNz4+MF07aFtrPj4zXT1LO2FbRz4+MF09YVtrPj4wXTthW0crMT4+MF09YVtrKzE+PjBdO2FbRysyPj4wXT1hW2srMj4+MF07YVtHKzM+PjBdPWFbayszPj4wXTthW0crND4+MF09YVtrKzQ+PjBdO2FbRys1Pj4wXT1hW2srNT4+MF07YVtHKzY+PjBdPWFbays2Pj4wXTthW0crNz4+MF09YVtrKzc+PjBdO2hbaz4+M109SjthW0g+PjBdPWFbaz4+MF07YVtIKzE+PjBdPWFbaysxPj4wXTthW0grMj4+MF09YVtrKzI+PjBdO2FbSCszPj4wXT1hW2srMz4+MF07YVtIKzQ+PjBdPWFbays0Pj4wXTthW0grNT4+MF09YVtrKzU+PjBdO2FbSCs2Pj4wXT1hW2srNj4+MF07YVtIKzc+PjBdPWFbays3Pj4wXTtpZigoYVs2MzY4XXwwKT09MD8oUWEoNjM2OCl8MCkhPTA6MCl7Y1sxNTg4XT0wO2NbNjM1Nj4+Ml09MDtjWzYzNjA+PjJdPTA7Y2MoMjA5LDYzNTIscHwwKXwwOyRhKDYzNjgpfWlmKChhWzY0MDBdfDApPT0wPyhRYSg2NDAwKXwwKSE9MDowKXtjYygyMTAsNjM3NixwfDApfDA7JGEoNjQwMCl9dz1jWzE1ODhdfDA7dj1jWzYzNTY+PjJdfDA7ZG97aWYoKHd8MCk9PSh2fDApKXt2PSRiKDYzNzYpfDA7aWYoKHZ8MCkhPTApe2I9WGEoMTYpfDA7ZG97aWYoKGFbMTAxMjBdfDApPT0wKXtpZigoUWEoMTAxMjApfDApPT0wKXticmVha31jWzI1MjhdPTEwMzg0OyRhKDEwMTIwKX19d2hpbGUoMCk7WWYoYix2LDEwMTEyLDEwNDcyKTt3YihifDAsMTAxODQsMTA5KX14PWNbMTU4OF18MDtkb3tpZigoeHwwKT09KGNbNjM1Nj4+Ml18MCkpe3Y9ZisxNnwwO2Nbdj4+Ml09ZjtjW2Y+PjJdPTY0MTY7dz1jWzYzNjA+PjJdfDA7ZG97aWYoeD4+PjA8dz4+PjApe2lmKCh4fDApPT0wKXt3PTB9ZWxzZXtjW3grMTY+PjJdPXg7dz1jW3Y+PjJdfDA7bWNbY1soY1t3Pj4yXXwwKSsxMj4+Ml0mMTI3XSh3LHgpO3c9Y1s2MzU2Pj4yXXwwfWNbNjM1Nj4+Ml09dysyNH1lbHNle3c9KHcteHwwKS8yNHwwO2lmKHc+Pj4wPDg5NDc4NDg1KXt3PXc8PDE7dz0od3wwKT09MD8xOnd9ZWxzZXt3PTE3ODk1Njk3MH14PXcqMjR8MDt4PSh4fDApPT0wPzE6eDt3aGlsZSgxKXt5PXVuKHgpfDA7aWYoKHl8MCkhPTApe2JyZWFrfXk9Y1s1NjY2XXwwO2NbNTY2Nl09eSswO2lmKCh5fDApPT0wKXtsPTY1O2JyZWFrfXNjW3kmMzFdKCl9aWYoKGx8MCk9PTY1KXtIPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX13PXkrKHcqMjR8MCl8MDtkb3tpZigoeXwwKSE9MCl7eD1jW3Y+PjJdfDA7aWYoKHh8MCk9PTApe2NbeSsxNj4+Ml09MDticmVha31pZigoeHwwKT09KGZ8MCkpe2NbeSsxNj4+Ml09eTttY1tjWyhjW2Y+PjJdfDApKzEyPj4yXSYxMjddKGYseSk7YnJlYWt9ZWxzZXtjW3krMTY+PjJdPXg7Y1t2Pj4yXT0wO2JyZWFrfX19d2hpbGUoMCk7eD15KzI0fDA7ej1jWzE1ODhdfDA7QT1jWzYzNTY+PjJdfDA7ZG97aWYoKEF8MCk9PSh6fDApKXtjWzE1ODhdPXk7Y1s2MzU2Pj4yXT14O2NbNjM2MD4+Ml09d31lbHNle2Rve0M9eTt5PXkrIC0yNHwwO0I9QSsgLTh8MDtBPUErIC0yNHwwO0Q9Y1tCPj4yXXwwO2Rve2lmKChEfDApIT0wKXtpZigoRHwwKT09KEF8MCkpe2NbQysgLTg+PjJdPXk7SD1jW0I+PjJdfDA7bWNbY1soY1tIPj4yXXwwKSsxMj4+Ml0mMTI3XShILHkpO2JyZWFrfWVsc2V7Y1tDKyAtOD4+Ml09RDtjW0I+PjJdPTA7YnJlYWt9fWVsc2V7Y1tDKyAtOD4+Ml09MH19d2hpbGUoMCl9d2hpbGUoKEF8MCkhPSh6fDApKTt6PWNbMTU4OF18MDtBPWNbNjM1Nj4+Ml18MDtjWzE1ODhdPXk7Y1s2MzU2Pj4yXT14O2NbNjM2MD4+Ml09dztpZigoQXwwKT09KHp8MCkpe2JyZWFrfWRve3c9Y1tBKyAtOD4+Ml18MDtBPUErIC0yNHwwO2Rve2lmKCh3fDApPT0oQXwwKSl7bGNbY1soY1t3Pj4yXXwwKSsxNj4+Ml0mMjU1XSh3KX1lbHNle2lmKCh3fDApPT0wKXticmVha31sY1tjWyhjW3c+PjJdfDApKzIwPj4yXSYyNTVdKHcpfX13aGlsZSgwKX13aGlsZSgoQXwwKSE9KHp8MCkpfX13aGlsZSgwKTtpZigoenwwKT09MCl7YnJlYWt9dm4oeil9fXdoaWxlKDApO3Y9Y1t2Pj4yXXwwO2lmKCh2fDApPT0oZnwwKSl7bGNbY1soY1tmPj4yXXwwKSsxNj4+Ml0mMjU1XShmKTticmVha31pZigodnwwKT09MCl7YnJlYWt9bGNbY1soY1t2Pj4yXXwwKSsyMD4+Ml0mMjU1XSh2KX19d2hpbGUoMCk7aWYoKENiKDYzNzYpfDApPT0wKXt0PWNbMTU4OF18MDtyPWNbNjM1Nj4+Ml18MDticmVha31XYSgxMDQ5NiwxMDUwNCw0NiwxMDU2MCl9ZWxzZXt0PXc7cj12fX13aGlsZSgwKTtiOmRve2lmKCh0fDApIT0ocnwwKSl7dj1zKzE2fDA7d2hpbGUoMSl7eD10KzE2fDA7dz1jW3g+PjJdfDA7aWYoKHd8MCk9PTApe2w9MTAxO2JyZWFrfWlmKCh3fDApPT0odHwwKSl7Y1t2Pj4yXT1zO3c9Y1t4Pj4yXXwwO21jW2NbKGNbdz4+Ml18MCkrMTI+PjJdJjEyN10odyxzKTt3PWNbdj4+Ml18MH1lbHNle3c9b2NbY1soY1t3Pj4yXXwwKSs4Pj4yXSYxMjddKHcpfDA7Y1t2Pj4yXT13fWlmKCh3fDApPT0wKXticmVha31tY1tjWyhjW3c+PjJdfDApKzI0Pj4yXSYxMjddKHcsdSk7dz1jW3Y+PjJdfDA7ZG97aWYoKHd8MCk9PShzfDApKXtsY1tjWyhjW3M+PjJdfDApKzE2Pj4yXSYyNTVdKHMpfWVsc2V7aWYoKHd8MCk9PTApe2JyZWFrfWxjW2NbKGNbdz4+Ml18MCkrMjA+PjJdJjI1NV0odyl9fXdoaWxlKDApO3Q9dCsyNHwwO2lmKCh0fDApPT0ocnwwKSl7YnJlYWsgYn19aWYoKGx8MCk9PTEwMSl7Y1t2Pj4yXT0wfUg9WGEoNCl8MDtjW0g+PjJdPTYzMzY7d2IoSHwwLDYzMTIsNzYpfX13aGlsZSgwKTtzPVNjKDgzNTIsNTMwNCl8MDtyPWNbcysoKGNbKGNbcz4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO3Q9cis0fDA7Y1t0Pj4yXT0oY1t0Pj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tmPj4yXT0xMzQ1NjtjW2YrND4+Ml09MjA4O2NbZis4Pj4yXT0wO2NnKDEzNDU2LGYpfXU9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3Y9Y1tyKzg+PjJdfDA7aWYoKGNbcisxMj4+Ml18MCktdj4+Mj4+PjA+dT4+PjA/KHE9Y1t2Kyh1PDwyKT4+Ml18MCwocXwwKSE9MCk6MCl7cT14Y1tjWyhjW3E+PjJdfDApKzI4Pj4yXSY2M10ocSwxMCl8MDtIPWNbdD4+Ml18MDtjW3Q+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW3I+PjJdfDApKzg+PjJdJjI1NV0ocil9bGgocyxxKTtZZyhzKTtyPWNbYj4+Ml18MDtxPWIrMTE0fDA7cT1kW3E+PjBdfGRbcSsxPj4wXTw8ODtIPWNbcis0Pj4yXXwwO0c9KChIfDApPDApPDwzMT4+MzE7aWYoMDwoR3wwKXwwPT0oR3wwKSYocSY2NTUzNSk+Pj4wPEg+Pj4wKXtjW3IrOD4+Ml09cSY2NTUzNX1lbHNle2FbcisxMj4+MF09MX1yPWIrMTIwfDA7Yzpkb3tpZigoZFtyPj4wXXxkW3IrMT4+MF08PDh8ZFtyKzI+PjBdPDwxNnxkW3IrMz4+MF08PDI0fDApIT0wKXt3PW8rMnwwO3U9bysxNnwwO3Q9bysxOHwwO3E9bysyMHwwO3g9Zis0fDA7dj1mKzh8MDtzPTA7d2hpbGUoMSl7Rz0oY1tiPj4yXXwwKSsxMnwwO0g9YVtHPj4wXXwwO2FbRz4+MF09MDtpZighKEg8PDI0Pj4yND09MCkpe2JyZWFrIGN9eT1jW2I+PjJdfDA7ej15KzEzfDA7aWYoKGFbej4+MF18MCkhPTApe2JyZWFrIGN9SD15KzR8MDtFPXkrOHwwO0c9Y1tFPj4yXXwwO0Y9KGNbSD4+Ml18MCktR3wwO0Y9KEZ8MCk8NTQ/Rjo1NDtNbihvfDAsKGNbeT4+Ml18MCkrR3wwLEZ8MCl8MDtHPShjW0U+PjJdfDApK0Z8MDtjW0U+PjJdPUc7Y1t5KzE2Pj4yXT1GO2lmKChHfDApPj0oY1tIPj4yXXwwKSl7YVt6Pj4wXT0xfXk9U2MoODM1Miw1ODcyKXwwO3o9Y1t5KygoY1soY1t5Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7QT16KzR8MDtjW0E+PjJdPShjW0E+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbeD4+Ml09MjA4O2Nbdj4+Ml09MDtjZygxMzQ1NixmKX1DPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtCPWNbeis4Pj4yXXwwO2lmKCEoKGNbeisxMj4+Ml18MCktQj4+Mj4+PjA+Qz4+PjApKXtsPTEzNjticmVha31CPWNbQisoQzw8Mik+PjJdfDA7aWYoKEJ8MCk9PTApe2w9MTM2O2JyZWFrfUI9eGNbY1soY1tCPj4yXXwwKSsyOD4+Ml0mNjNdKEIsMTApfDA7SD1jW0E+PjJdfDA7Y1tBPj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1t6Pj4yXXwwKSs4Pj4yXSYyNTVdKHopfWxoKHksQik7WWcoeSk7eT13O3o9NTg1Njt3aGlsZSgxKXtpZigoYVt5Pj4wXXwwKSE9KGFbej4+MF18MCkpe2JyZWFrfXk9eSsxfDA7aWYoKHl8MCk9PSh1fDApKXtsPTE0NDticmVha31lbHNle3o9eisxfDB9fWlmKChsfDApPT0xNDQ/KGw9MCwoZFt0Pj4wXXxkW3QrMT4+MF08PDgpPDwxNj4+MTY9PTIyMjA0KTowKXticmVha31BPWNbYj4+Ml18MDt5PUErOHwwO3o9Y1t5Pj4yXXwwO3o9SW4oenwwLCgoenwwKTwwKTw8MzE+PjMxfDAsKGRbcT4+MF18ZFtxKzE+PjBdPDw4KSY2NTUzNXwwLDApfDA7SD1JO0c9Y1tBKzQ+PjJdfDA7Rj0oKEd8MCk8MCk8PDMxPj4zMTtBPUErMTJ8MDtpZigoSHwwKT4oRnwwKXwoSHwwKT09KEZ8MCkmej4+PjA+PUc+Pj4wfChIfDApPDApe2FbQT4+MF09MX1lbHNle2FbQT4+MF09MDtjW3k+PjJdPXp9cz1zKzF8MDtpZighKHM+Pj4wPChkW3I+PjBdfGRbcisxPj4wXTw8OHxkW3IrMj4+MF08PDE2fGRbciszPj4wXTw8MjQpPj4+MCkpe2JyZWFrIGN9fWlmKChsfDApPT0xMzYpe0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfXI9U2MoODM1Miw1ODk2KXwwO3M9Y1tyKygoY1soY1tyPj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dD1zKzR8MDtjW3Q+PjJdPShjW3Q+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9dT0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7dj1jW3MrOD4+Ml18MDtkb3tpZigoY1tzKzEyPj4yXXwwKS12Pj4yPj4+MD51Pj4+MCl7dT1jW3YrKHU8PDIpPj4yXXwwO2lmKCh1fDApPT0wKXticmVha311PXhjW2NbKGNbdT4+Ml18MCkrMjg+PjJdJjYzXSh1LDEwKXwwO0g9Y1t0Pj4yXXwwO2NbdD4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbcz4+Ml18MCkrOD4+Ml0mMjU1XShzKX1saChyLHUpO1lnKHIpO3I9ZFtxPj4wXXxkW3ErMT4+MF08PDg7cT1yJjY1NTM1O3I9cjw8MTY+PjE2PT0wPzE6cTt3aGlsZSgxKXtzPXVuKHIpfDA7aWYoKHN8MCkhPTApe2JyZWFrfXM9Y1s1NjY2XXwwO2NbNTY2Nl09cyswO2lmKChzfDApPT0wKXtsPTE1ODticmVha31zY1tzJjMxXSgpfWlmKChsfDApPT0xNTgpe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfXQ9Y1tiPj4yXXwwO3I9dCsxM3wwO2Rve2lmKChhW3I+PjBdfDApPT0wKXtIPXQrNHwwO0U9dCs4fDA7Rz1jW0U+PjJdfDA7Rj0oY1tIPj4yXXwwKS1HfDA7Rj0oRnwwKTwocXwwKT9GOnE7TW4oc3wwLChjW3Q+PjJdfDApK0d8MCxGfDApfDA7Rz0oY1tFPj4yXXwwKStGfDA7Y1tFPj4yXT1HO2NbdCsxNj4+Ml09RjtpZigoR3wwKTwoY1tIPj4yXXwwKSl7YnJlYWt9YVtyPj4wXT0xfWVsc2V7YVt0KzEyPj4wXT0xfX13aGlsZSgwKTt0PXMrMzR8MDtxPWIrMjQ3fDA7TW4ocXwwLHN8MCwzNCl8MDtpZighKChkW3E+PjBdfGRbcSsxPj4wXTw8OCk8PDE2Pj4xNj09Mikpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11big2OCl8MDtpZigoYnwwKSE9MCl7bD0xNzE7YnJlYWt9Yj1jWzU2NjZdfDA7Y1s1NjY2XT1iKzA7aWYoKGJ8MCk9PTApe2JyZWFrfXNjW2ImMzFdKCl9aWYoKGx8MCk9PTE3MSl7Y1tiKzQ+PjJdPTU1O2NbYj4+Ml09NTU7Zj1iKzEyfDA7Y1tnKzQ+PjJdPWY7Y1tiKzg+PjJdPTA7Zj1mKzB8MDtiPTYyMDB8MDtlPWYrNTZ8MDtkb3thW2Y+PjBdPWFbYj4+MF18MDtmPWYrMXwwO2I9YisxfDB9d2hpbGUoKGZ8MCk8KGV8MCkpO2NbZz4+Ml09NjI2NDt3YihnfDAsNjA5Niw3NCl9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9cj1TYyg4MzUyLDYxMTIpfDA7cT1oaChyLGRbcT4+MF18ZFtxKzE+PjBdPDw4KXwwO3I9Y1txKygoY1soY1txPj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dT1yKzR8MDtjW3U+PjJdPShjW3U+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9dj0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7dz1jW3IrOD4+Ml18MDtkb3tpZigoY1tyKzEyPj4yXXwwKS13Pj4yPj4+MD52Pj4+MCl7dj1jW3crKHY8PDIpPj4yXXwwO2lmKCh2fDApPT0wKXticmVha312PXhjW2NbKGNbdj4+Ml18MCkrMjg+PjJdJjYzXSh2LDEwKXwwO0g9Y1t1Pj4yXXwwO2NbdT4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbcj4+Ml18MCkrOD4+Ml0mMjU1XShyKX1saChxLHYpO1lnKHEpO3Y9U2MoODM1Miw2MTI4KXwwO3E9YisyNzl8MDt2PWhoKHYsZFtxPj4wXXxkW3ErMT4+MF08PDgpfDA7cj1jW3YrKChjWyhjW3Y+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDt1PXIrNHwwO2NbdT4+Ml09KGNbdT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tmKzQ+PjJdPTIwODtjW2YrOD4+Ml09MDtjZygxMzQ1NixmKX13PShjWzEzNDYwPj4yXXwwKSsgLTF8MDt4PWNbcis4Pj4yXXwwO2Rve2lmKChjW3IrMTI+PjJdfDApLXg+PjI+Pj4wPnc+Pj4wKXt3PWNbeCsodzw8Mik+PjJdfDA7aWYoKHd8MCk9PTApe2JyZWFrfXc9eGNbY1soY1t3Pj4yXXwwKSsyOD4+Ml0mNjNdKHcsMTApfDA7SD1jW3U+PjJdfDA7Y1t1Pj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1tyPj4yXXwwKSs4Pj4yXSYyNTVdKHIpfWxoKHYsdyk7WWcodik7cj0oKGRbcT4+MF18ZFtxKzE+PjBdPDw4KSY2NTUzNSkqNnwwO3I9KHJ8MCk9PTA/MTpyO3doaWxlKDEpe3U9dW4ocil8MDtpZigodXwwKSE9MCl7YnJlYWt9dT1jWzU2NjZdfDA7Y1s1NjY2XT11KzA7aWYoKHV8MCk9PTApe2w9MTk0O2JyZWFrfXNjW3UmMzFdKCl9aWYoKGx8MCk9PTE5NCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9cj1iKzI4MXwwO2Fbcj4+MF09dTthW3IrMT4+MF09dT4+ODthW3IrMj4+MF09dT4+MTY7YVtyKzM+PjBdPXU+PjI0O3U9U2MoODM1Miw2MTQ0KXwwO3Y9Y1t1KygoY1soY1t1Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dz12KzR8MDtjW3c+PjJdPShjW3c+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9eD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7eT1jW3YrOD4+Ml18MDtkb3tpZigoY1t2KzEyPj4yXXwwKS15Pj4yPj4+MD54Pj4+MCl7eD1jW3krKHg8PDIpPj4yXXwwO2lmKCh4fDApPT0wKXticmVha314PXhjW2NbKGNbeD4+Ml18MCkrMjg+PjJdJjYzXSh4LDEwKXwwO0g9Y1t3Pj4yXXwwO2Nbdz4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbdj4+Ml18MCkrOD4+Ml0mMjU1XSh2KX1saCh1LHgpO1lnKHUpO2Q6ZG97aWYoISgoZFtxPj4wXXxkW3ErMT4+MF08PDgpPDwxNj4+MTY9PTApKXt2PWYrNHwwO3U9Zis4fDA7dz0wO3doaWxlKDEpe01uKChkW3I+PjBdfGRbcisxPj4wXTw8OHxkW3IrMj4+MF08PDE2fGRbciszPj4wXTw8MjQpKyh3KjZ8MCl8MCx0fDAsNil8MDt6PWloKFNjKDgzNTIsNjE3Nil8MCx3KXwwO3k9Y1t6KygoY1soY1t6Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7eD15KzR8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2Nbdj4+Ml09MjA4O2NbdT4+Ml09MDtjZygxMzQ1NixmKX1BPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtCPWNbeSs4Pj4yXXwwO2lmKCEoKGNbeSsxMj4+Ml18MCktQj4+Mj4+PjA+QT4+PjApKXticmVha31BPWNbQisoQTw8Mik+PjJdfDA7aWYoKEF8MCk9PTApe2JyZWFrfUE9eGNbY1soY1tBPj4yXXwwKSsyOD4+Ml0mNjNdKEEsMTApfDA7SD1jW3g+PjJdfDA7Y1t4Pj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1t5Pj4yXXwwKSs4Pj4yXSYyNTVdKHkpfWxoKHosQSk7WWcoeik7dz13KzF8MDtpZigod3wwKT49KChkW3E+PjBdfGRbcSsxPj4wXTw8OCkmNjU1MzV8MCkpe2JyZWFrIGR9ZWxzZXt0PXQrNnwwfX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7dm4ocyk7ZTpkb3tpZighKChkW3E+PjBdfGRbcSsxPj4wXTw8OCk8PDE2Pj4xNj09MCkpe3c9YiszMDR8MDt2PWIrMzA4fDA7eD1iKzMwMHwwO3U9Zis0fDA7dD1mKzh8MDtzPTA7Zjp3aGlsZSgxKXt5PVNjKDgzNTIsNTk2OCl8MDtBPWNbeSsoKGNbKGNbeT4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO3o9QSs0fDA7Y1t6Pj4yXT0oY1t6Pj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tmPj4yXT0xMzQ1NjtjW3U+PjJdPTIwODtjW3Q+PjJdPTA7Y2coMTM0NTYsZil9Qj0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7Qz1jW0ErOD4+Ml18MDtpZighKChjW0ErMTI+PjJdfDApLUM+PjI+Pj4wPkI+Pj4wKSl7bD0yMzQ7YnJlYWt9Qj1jW0MrKEI8PDIpPj4yXXwwO2lmKChCfDApPT0wKXtsPTIzNDticmVha31CPXhjW2NbKGNbQj4+Ml18MCkrMjg+PjJdJjYzXShCLDEwKXwwO0g9Y1t6Pj4yXXwwO2Nbej4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbQT4+Ml18MCkrOD4+Ml0mMjU1XShBKX1saCh5LEIpO1lnKHkpO0E9ZFtyPj4wXXxkW3IrMT4+MF08PDh8ZFtyKzI+PjBdPDwxNnxkW3IrMz4+MF08PDI0O3k9QSsocyo2fDApfDA7eT0oZFt5Pj4wXXxkW3krMT4+MF08PDgpJjY1NTM1O3o9QSsocyo2fDApKzJ8MDt6PShkW3o+PjBdfGRbeisxPj4wXTw8OCkmNjU1MzU7QT1BKyhzKjZ8MCkrNHwwO0E9KGRbQT4+MF18ZFtBKzE+PjBdPDw4KSY2NTUzNTtDPWNbdz4+Ml18MDtkb3tpZigoQ3wwKT09KGNbdj4+Ml18MCkpe0I9Y1t4Pj4yXXwwO0U9Qy1CfDA7Qz0oRXwwKS8xMnwwO0Q9QysxfDA7aWYoRD4+PjA+MzU3OTEzOTQxKXtsPTI0NDticmVhayBmfWlmKEM+Pj4wPDE3ODk1Njk3MCl7Rj1DPDwxO0Y9Rj4+PjA8RD4+PjA/RDpGO2lmKChGfDApPT0wKXtGPTA7Rz0wfWVsc2V7bD0yNDd9fWVsc2V7Rj0zNTc5MTM5NDE7bD0yNDd9aWYoKGx8MCk9PTI0Nyl7bD0wO0g9RioxMnwwO0g9KEh8MCk9PTA/MTpIO3doaWxlKDEpe0c9dW4oSCl8MDtpZigoR3wwKSE9MCl7YnJlYWt9Rz1jWzU2NjZdfDA7Y1s1NjY2XT1HKzA7aWYoKEd8MCk9PTApe2w9MjUxO2JyZWFrIGZ9c2NbRyYzMV0oKX19SD1HKyhDKjEyfDApfDA7aWYoKEh8MCkhPTApe2NbSD4+Ml09eTtjW0crKEMqMTJ8MCkrND4+Ml09ejtjW0crKEMqMTJ8MCkrOD4+Ml09QX1IPUcrKCgoKEV8MCkvLTEyfDApK0N8MCkqMTJ8MCl8MDtMbihIfDAsQnwwLEV8MCl8MDtjW3g+PjJdPUg7Y1t3Pj4yXT1HKyhEKjEyfDApO2Nbdj4+Ml09RysoRioxMnwwKTtpZigoQnwwKT09MCl7YnJlYWt9dm4oQil9ZWxzZXtpZigoQ3wwKT09MCl7eT0wfWVsc2V7Y1tDPj4yXT15O2NbQys0Pj4yXT16O2NbQys4Pj4yXT1BO3k9Y1t3Pj4yXXwwfWNbdz4+Ml09eSsxMn19d2hpbGUoMCk7cz1zKzF8MDtpZigoc3wwKT49KChkW3E+PjBdfGRbcSsxPj4wXTw8OCkmNjU1MzV8MCkpe2JyZWFrIGV9fWlmKChsfDApPT0yMzQpe0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfWVsc2UgaWYoKGx8MCk9PTI0NCl7VGsoKX1lbHNlIGlmKChsfDApPT0yNTEpe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfX19d2hpbGUoMCk7cz1TYyg4MzUyLDUzMjApfDA7cj1jW3MrKChjWyhjW3M+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtxPXIrNHwwO2NbcT4+Ml09KGNbcT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tmKzQ+PjJdPTIwODtjW2YrOD4+Ml09MDtjZygxMzQ1NixmKX11PShjWzEzNDYwPj4yXXwwKSsgLTF8MDt0PWNbcis4Pj4yXXwwO2Rve2lmKChjW3IrMTI+PjJdfDApLXQ+PjI+Pj4wPnU+Pj4wKXt0PWNbdCsodTw8Mik+PjJdfDA7aWYoKHR8MCk9PTApe2JyZWFrfXQ9eGNbY1soY1t0Pj4yXXwwKSsyOD4+Ml0mNjNdKHQsMTApfDA7SD1jW3E+PjJdfDA7Y1txPj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1tyPj4yXXwwKSs4Pj4yXSYyNTVdKHIpfWxoKHMsdCk7WWcocyk7cj1jW2I+PjJdfDA7cT1iKzExNnwwO3M9ZFtxPj4wXXxkW3ErMT4+MF08PDh8ZFtxKzI+PjBdPDwxNnxkW3ErMz4+MF08PDI0O0g9Y1tyKzQ+PjJdfDA7Rz0oKEh8MCk8MCk8PDMxPj4zMTtpZigwPChHfDApfDA9PShHfDApJnM+Pj4wPEg+Pj4wKXtjW3IrOD4+Ml09c31lbHNle2FbcisxMj4+MF09MX1zPW87Y1tzPj4yXT0wO2Nbcys0Pj4yXT0wO3M9Y1tiPj4yXXwwO3I9cysxM3wwO2Rve2lmKChhW3I+PjBdfDApPT0wKXtIPWNbcys0Pj4yXXwwO0U9cys4fDA7Rz1jW0U+PjJdfDA7Rj1ILUd8MDtGPShGfDApPDg/Rjo4O0xuKG98MCwoY1tzPj4yXXwwKStHfDAsRnwwKXwwO0c9RytGfDA7Y1tFPj4yXT1HO2NbcysxNj4+Ml09RjtpZigoR3wwKTwoSHwwKSl7YnJlYWt9YVtyPj4wXT0xfWVsc2V7YVtzKzEyPj4wXT0xfX13aGlsZSgwKTtHPShjW2I+PjJdfDApKzEyfDA7SD1hW0c+PjBdfDA7YVtHPj4wXT0wO2lmKCEoSDw8MjQ+PjI0PT0wKSl7Zz1YYSg4KXwwO2NbZz4+Ml09OTkyODt3aGlsZSgxKXtiPXVuKDU2KXwwO2lmKChifDApIT0wKXtsPTI4MjticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MjgyKXtjW2IrND4+Ml09NDM7Y1tiPj4yXT00MztmPWIrMTJ8MDtjW2crND4+Ml09ZjtjW2IrOD4+Ml09MDtmPWYrMHwwO2I9NTc4NHwwO2U9Zis0NHwwO2Rve2FbZj4+MF09YVtiPj4wXXwwO2Y9ZisxfDA7Yj1iKzF8MH13aGlsZSgoZnwwKTwoZXwwKSk7Y1tnPj4yXT01ODQwO3diKGd8MCw1Mzg0LDcwKX1IPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX1zPWNbbz4+Ml18MDtvPWNbbys0Pj4yXXwwO2lmKChzfDApPT0tMSYob3wwKT09LTEpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11big2Nyl8MDtpZigoYnwwKSE9MCl7bD0yOTA7YnJlYWt9Yj1jWzU2NjZdfDA7Y1s1NjY2XT1iKzA7aWYoKGJ8MCk9PTApe2JyZWFrfXNjW2ImMzFdKCl9aWYoKGx8MCk9PTI5MCl7Y1tiKzQ+PjJdPTU0O2NbYj4+Ml09NTQ7Zj1iKzEyfDA7Y1tnKzQ+PjJdPWY7Y1tiKzg+PjJdPTA7Zj1mKzB8MDtiPTU0MDB8MDtlPWYrNTV8MDtkb3thW2Y+PjBdPWFbYj4+MF18MDtmPWYrMXwwO2I9YisxfDB9d2hpbGUoKGZ8MCk8KGV8MCkpO2NbZz4+Ml09NTc2ODt3YihnfDAsNTQ4OCw2OCl9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9cj1jW2I+PjJdfDA7SD1jW3IrND4+Ml18MDtHPSgoSHwwKTwwKTw8MzE+PjMxO2lmKChvfDApPChHfDApfChvfDApPT0oR3wwKSZzPj4+MDxIPj4+MCl7Y1tyKzg+PjJdPXN9ZWxzZXthW3IrMTI+PjBdPTF9Rz0oY1tiPj4yXXwwKSsxMnwwO0g9YVtHPj4wXXwwO2FbRz4+MF09MDtpZighKEg8PDI0Pj4yND09MCkpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11big1Nil8MDtpZigoYnwwKSE9MCl7bD0zMDE7YnJlYWt9Yj1jWzU2NjZdfDA7Y1s1NjY2XT1iKzA7aWYoKGJ8MCk9PTApe2JyZWFrfXNjW2ImMzFdKCl9aWYoKGx8MCk9PTMwMSl7Y1tiKzQ+PjJdPTQzO2NbYj4+Ml09NDM7Zj1iKzEyfDA7Y1tnKzQ+PjJdPWY7Y1tiKzg+PjJdPTA7Zj1mKzB8MDtiPTU3ODR8MDtlPWYrNDR8MDtkb3thW2Y+PjBdPWFbYj4+MF18MDtmPWYrMXwwO2I9YisxfDB9d2hpbGUoKGZ8MCk8KGV8MCkpO2NbZz4+Ml09NTg0MDt3YihnfDAsNTM4NCw3MCl9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9bz1jW2I+PjJdfDA7cj1vKzEzfDA7ZG97aWYoKGFbcj4+MF18MCk9PTApe0g9Y1tvKzQ+PjJdfDA7RT1vKzh8MDtHPWNbRT4+Ml18MDtGPUgtR3wwO0Y9KEZ8MCk8OD9GOjg7TG4obnwwLChjW28+PjJdfDApK0d8MCxGfDApfDA7Rz1HK0Z8MDtjW0U+PjJdPUc7Y1tvKzE2Pj4yXT1GO2lmKChHfDApPChIfDApKXticmVha31hW3I+PjBdPTF9ZWxzZXthW28rMTI+PjBdPTF9fXdoaWxlKDApO0c9KGNbYj4+Ml18MCkrMTJ8MDtIPWFbRz4+MF18MDthW0c+PjBdPTA7aWYoIShIPDwyND4+MjQ9PTApKXtnPVhhKDgpfDA7Y1tnPj4yXT05OTI4O3doaWxlKDEpe2I9dW4oNTYpfDA7aWYoKGJ8MCkhPTApe2w9MzEzO2JyZWFrfWI9Y1s1NjY2XXwwO2NbNTY2Nl09YiswO2lmKChifDApPT0wKXticmVha31zY1tiJjMxXSgpfWlmKChsfDApPT0zMTMpe2NbYis0Pj4yXT00MztjW2I+PjJdPTQzO2Y9YisxMnwwO2NbZys0Pj4yXT1mO2NbYis4Pj4yXT0wO2Y9ZiswfDA7Yj01Nzg0fDA7ZT1mKzQ0fDA7ZG97YVtmPj4wXT1hW2I+PjBdfDA7Zj1mKzF8MDtiPWIrMXwwfXdoaWxlKChmfDApPChlfDApKTtjW2c+PjJdPTU4NDA7d2IoZ3wwLDUzODQsNzApfUg9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfWlmKChjW24+PjJdfDApIT0wKXtnPVhhKDgpfDA7Y1tnPj4yXT05OTI4O3doaWxlKDEpe2I9dW4oNTQpfDA7aWYoKGJ8MCkhPTApe2w9MzIxO2JyZWFrfWI9Y1s1NjY2XXwwO2NbNTY2Nl09YiswO2lmKChifDApPT0wKXticmVha31zY1tiJjMxXSgpfWlmKChsfDApPT0zMjEpe2NbYis0Pj4yXT00MTtjW2I+PjJdPTQxO2Y9YisxMnwwO2NbZys0Pj4yXT1mO2NbYis4Pj4yXT0wO2Y9ZiswfDA7Yj01Njg4fDA7ZT1mKzQyfDA7ZG97YVtmPj4wXT1hW2I+PjBdfDA7Zj1mKzF8MDtiPWIrMXwwfXdoaWxlKChmfDApPChlfDApKTtjW2c+PjJdPTU3NDQ7d2IoZ3wwLDU1NDQsNjYpfUg9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfW89YisyODh8MDtzPWNbbz4+Ml18MDtyPWIrMjkyfDA7dD1jW3I+PjJdfDA7aWYoKHR8MCk9PShzfDApKXt3PXN9ZWxzZXt3PXQrKH4oKHQrIC04KygwLXMpfDApPj4+Myk8PDMpfDA7Y1tyPj4yXT13fUg9YisyNTl8MDtpZigoZFtIPj4wXXxkW0grMT4+MF08PDh8ZFtIKzI+PjBdPDwxNnxkW0grMz4+MF08PDI0fDApPT0tMSl7Zz1YYSg4KXwwO2NbZz4+Ml09OTkyODt3aGlsZSgxKXtiPXVuKDk2KXwwO2lmKChifDApIT0wKXtsPTMzMTticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MzMxKXtjW2IrND4+Ml09ODM7Y1tiPj4yXT04MztmPWIrMTJ8MDtjW2crND4+Ml09ZjtjW2IrOD4+Ml09MDtmPWYrMHwwO2I9NTU2MHwwO2U9Zis4NHwwO2Rve2FbZj4+MF09YVtiPj4wXXwwO2Y9ZisxfDA7Yj1iKzF8MH13aGlsZSgoZnwwKTwoZXwwKSk7Y1tnPj4yXT01NzY4O3diKGd8MCw1NDg4LDY4KX1IPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX12PW4rNHwwO249Y1t2Pj4yXXwwO3U9bisxfDA7ej1zO3Q9dy16Pj4zO2Rve2lmKHQ+Pj4wPHU+Pj4wKXt1PXUtdHwwO3Q9YisyOTZ8MDtBPWNbdD4+Ml18MDt4PXc7aWYoIShBLXg+PjM+Pj4wPHU+Pj4wKSl7dD11O2w9dzt3aGlsZSgxKXtpZigobHwwKSE9MCl7SD1sO2NbSD4+Ml09MDtjW0grND4+Ml09MH10PXQrIC0xfDA7aWYoKHR8MCk9PTApe2JyZWFrfWVsc2V7bD1sKzh8MH19Y1tyPj4yXT13Kyh1PDwzKTticmVha314PXgtenwwO3k9eD4+Mzt3PXkrdXwwO2lmKHc+Pj4wPjUzNjg3MDkxMSl7VGsoKX16PUEtenwwO2lmKHo+PjM+Pj4wPDI2ODQzNTQ1NSl7ej16Pj4yO3o9ej4+PjA8dz4+PjA/dzp6O2lmKCh6fDApPT0wKXt6PTA7Qj0wfWVsc2V7bD0zNDJ9fWVsc2V7ej01MzY4NzA5MTE7bD0zNDJ9ZG97aWYoKGx8MCk9PTM0Mil7QT16PDwzO0E9KEF8MCk9PTA/MTpBO3doaWxlKDEpe0I9dW4oQSl8MDtpZigoQnwwKSE9MCl7bD0zNDg7YnJlYWt9Qj1jWzU2NjZdfDA7Y1s1NjY2XT1CKzA7aWYoKEJ8MCk9PTApe2JyZWFrfXNjW0ImMzFdKCl9aWYoKGx8MCk9PTM0OCl7YnJlYWt9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2w9QisoeTw8Myl8MDt3aGlsZSgxKXtpZigobHwwKSE9MCl7SD1sO2NbSD4+Ml09MDtjW0grND4+Ml09MH11PXUrIC0xfDA7aWYoKHV8MCk9PTApe2JyZWFrfWVsc2V7bD1sKzh8MH19TG4oQnwwLHN8MCx4fDApfDA7Y1tvPj4yXT1CO2Nbcj4+Ml09Qisodzw8Myk7Y1t0Pj4yXT1CKyh6PDwzKTtpZigoc3wwKT09MCl7cz1CO2JyZWFrfXZuKHMpO3M9Y1tvPj4yXXwwfWVsc2V7aWYoISh0Pj4+MD51Pj4+MCkpe2JyZWFrfWw9cysodTw8Myl8MDtpZigod3wwKT09KGx8MCkpe2JyZWFrfWNbcj4+Ml09dysofigodysgLTgrKDAtbCl8MCk+Pj4zKTw8Myl9fXdoaWxlKDApO2w9ZFtxPj4wXXxkW3ErMT4+MF08PDh8ZFtxKzI+PjBdPDwxNnxkW3ErMz4+MF08PDI0O0g9cztjW0g+PjJdPWwrODtjW0grND4+Ml09MDtnOmRve2lmKG4+Pj4wPjEpe2NbbT4+Ml09Y1tiPj4yXTtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtsPW0rMTJ8MDtzPXVuKDEwNDg2NDQpfDA7eT1zKzY4Ji02NDtjW3krIC00Pj4yXT1zO2NbbD4+Ml09eTtjW2o+PjJdPW07eT1qKzR8MDtjW3k+PjJdPTA7Y1tqKzg+PjJdPS0xO2NbZys0Pj4yXT0zMjtjW2crOD4+Ml09MjtjW2crMTI+PjJdPTg7Y1tnKzE2Pj4yXT0wO3M9ZyszNnwwO2Nbcz4+Ml09MDtuPWcrNDB8MDtjW24+PjJdPTA7Y1tnKzQ0Pj4yXT0wO2NbZys2MD4+Ml09MTtjW2crNjQ+PjJdPTI7Y1tnKzU2Pj4yXT00MDk2O2NbZys1Mj4+Ml09NDtjW2crNDg+PjJdPTQ7dT1nKzY4fDA7Y1t1Pj4yXT0wO3Q9Zys3MnwwO2NbdD4+Ml09MDtjW2crNzY+PjJdPTA7Y1tnKzIwPj4yXT0zMjt3PWcrMjR8MDtjW3c+PjJdPTA7Y1tnKzI4Pj4yXT0tMjE0NzQ4MzY0ODtjW2crMzI+PjJdPTIxNDc0ODM2NDc7Y1tnPj4yXT0wO0g9bWQobSl8MDtHPW1kKG0pfDA7eD1tZChtKXwwO2NbeT4+Ml09KEcmMjU1KTw8MTZ8KEgmMjU1KTw8MjR8KHgmMjU1KTw8OHwobWQobSl8MCkmMjU1O3RkKGcpO3k9U2MoODM1Miw1NjQ4KXwwO209Y1t2Pj4yXXwwO3k9amgoeSxtKXwwO3g9Y1t5KygoY1soY1t5Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dj14KzR8MDtjW3Y+PjJdPShjW3Y+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9QT0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7ej1jW3grOD4+Ml18MDtkb3tpZigoY1t4KzEyPj4yXXwwKS16Pj4yPj4+MD5BPj4+MCl7ej1jW3orKEE8PDIpPj4yXXwwO2lmKCh6fDApPT0wKXticmVha316PXhjW2NbKGNbej4+Ml18MCkrMjg+PjJdJjYzXSh6LDEwKXwwO0g9Y1t2Pj4yXXwwO2Nbdj4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbeD4+Ml18MCkrOD4+Ml0mMjU1XSh4KX1saCh5LHopO1lnKHkpO2g6ZG97aWYoKG18MCkhPTApe3g9Zis0fDA7dj1mKzh8MDt5PTE7d2hpbGUoMSl7aWYoeT4+PjA+MSl7ej1jWyhjW28+PjJdfDApKyh5KyAtMTw8Myk+PjJdfDB9ZWxzZXt6PTB9QT0ocmQoZyxqLChjW3M+PjJdfDApKzQ0fDApfDApK3p8MDt6PWNbdz4+Ml18MDtpZigoQXwwKTwwKXt6PXorQXwwfWVsc2V7ej1BLShBPj4+MDx6Pj4+MD8wOnopfDB9QT0oY1tvPj4yXXwwKSsoeTw8Myl8MDtjW0E+PjJdPXo7Y1tBKzQ+PjJdPSgoenwwKTwwKTw8MzE+PjMxO0E9U2MoamgoU2MoODM1Miw1NjcyKXwwLHkpfDAsNTY4MCl8MDt6PShjW28+PjJdfDApKyh5PDwzKXwwO3o9a2goQSxjW3o+PjJdfDAsY1t6KzQ+PjJdfDApfDA7QT1jW3orKChjWyhjW3o+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtCPUErNHwwO2NbQj4+Ml09KGNbQj4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1t4Pj4yXT0yMDg7Y1t2Pj4yXT0wO2NnKDEzNDU2LGYpfUM9KGNbMTM0NjA+PjJdfDApKyAtMXwwO0Q9Y1tBKzg+PjJdfDA7aWYoISgoY1tBKzEyPj4yXXwwKS1EPj4yPj4+MD5DPj4+MCkpe2JyZWFrfUM9Y1tEKyhDPDwyKT4+Ml18MDtpZigoQ3wwKT09MCl7YnJlYWt9Qz14Y1tjWyhjW0M+PjJdfDApKzI4Pj4yXSY2M10oQywxMCl8MDtIPWNbQj4+Ml18MDtjW0I+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW0E+PjJdfDApKzg+PjJdJjI1NV0oQSl9bGgoeixDKTtZZyh6KTt5PXkrMXwwO2lmKHk+Pj4wPm0+Pj4wKXticmVhayBofX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7dj1jW28+PjJdfDA7aTpkb3tpZigoY1tyPj4yXXwwKS12Pj4zPj4+MD4xKXtqPWYrNHwwO2c9Zis4fDA7bT0xO3doaWxlKDEpe3c9disobSsgLTE8PDMpfDA7dj12KyhtPDwzKXwwO3g9djt3PUluKGNbeD4+Ml18MCxjW3grND4+Ml18MCxjW3c+PjJdfDAsY1t3KzQ+PjJdfDApfDA7Y1t2Pj4yXT13O2Nbdis0Pj4yXT1JO3Y9U2MoamgoU2MoODM1Miw1NjcyKXwwLG0pfDAsNTY4MCl8MDt3PShjW28+PjJdfDApKyhtPDwzKXwwO3c9a2godixjW3c+PjJdfDAsY1t3KzQ+PjJdfDApfDA7dj1jW3crKChjWyhjW3c+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDt4PXYrNHwwO2NbeD4+Ml09KGNbeD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tqPj4yXT0yMDg7Y1tnPj4yXT0wO2NnKDEzNDU2LGYpfXo9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3k9Y1t2Kzg+PjJdfDA7aWYoISgoY1t2KzEyPj4yXXwwKS15Pj4yPj4+MD56Pj4+MCkpe2JyZWFrfXk9Y1t5Kyh6PDwyKT4+Ml18MDtpZigoeXwwKT09MCl7YnJlYWt9eT14Y1tjWyhjW3k+PjJdfDApKzI4Pj4yXSY2M10oeSwxMCl8MDtIPWNbeD4+Ml18MDtjW3g+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW3Y+PjJdfDApKzg+PjJdJjI1NV0odil9bGgodyx5KTtZZyh3KTttPW0rMXwwO3Y9Y1tvPj4yXXwwO2lmKCEobT4+PjA8KGNbcj4+Ml18MCktdj4+Mz4+PjApKXticmVhayBpfX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Zj1jW3U+PjJdfDA7ZG97aWYoKGZ8MCkhPTApe2c9Y1t0Pj4yXXwwO2lmKChnfDApIT0oZnwwKSl7ZG97Y1t0Pj4yXT1nKyAtNDQ7aj1jW2crIC0zNj4+Ml18MDtpZigoanwwKSE9MCl7dm4oY1tqKyAtND4+Ml18MCl9aj1jW2crIC0zMj4+Ml18MDtpZigoanwwKSE9MCl7dm4oY1tqKyAtND4+Ml18MCl9Zz1jW2crIC0yOD4+Ml18MDtpZigoZ3wwKSE9MCl7dm4oY1tnKyAtND4+Ml18MCl9Zz1jW3Q+PjJdfDB9d2hpbGUoKGd8MCkhPShmfDApKTtmPWNbdT4+Ml18MDtpZigoZnwwKT09MCl7YnJlYWt9fXZuKGYpfX13aGlsZSgwKTtmPWNbcz4+Ml18MDtkb3tpZigoZnwwKSE9MCl7Zz1jW24+PjJdfDA7aWYoKGd8MCkhPShmfDApKXtkb3tjW24+PjJdPWcrIC00NDtqPWNbZysgLTM2Pj4yXXwwO2lmKChqfDApIT0wKXt2bihjW2orIC00Pj4yXXwwKX1qPWNbZysgLTMyPj4yXXwwO2lmKChqfDApIT0wKXt2bihjW2orIC00Pj4yXXwwKX1nPWNbZysgLTI4Pj4yXXwwO2lmKChnfDApIT0wKXt2bihjW2crIC00Pj4yXXwwKX1nPWNbbj4+Ml18MH13aGlsZSgoZ3wwKSE9KGZ8MCkpO2Y9Y1tzPj4yXXwwO2lmKChmfDApPT0wKXticmVha319dm4oZil9fXdoaWxlKDApO3ZuKGNbKGNbbD4+Ml18MCkrIC00Pj4yXXwwKTtsPWRbcT4+MF18ZFtxKzE+PjBdPDw4fGRbcSsyPj4wXTw8MTZ8ZFtxKzM+PjBdPDwyNDticmVhayBnfX13aGlsZSgwKTtIPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Zj1jW2I+PjJdfDA7YVtmKzEyPj4wXT0wO2FbZisxMz4+MF09MDtmPWNbYj4+Ml18MDtnPWwrOHwwO0g9Y1tmKzQ+PjJdfDA7Rz0oKEh8MCk8MCk8PDMxPj4zMTtpZigwPChHfDApfDA9PShHfDApJmc+Pj4wPEg+Pj4wKXtjW2YrOD4+Ml09ZztIPWIrMTJ8MDtjW0g+PjJdPTA7SD1iKzh8MDtjW0g+PjJdPTA7aT1lO3JldHVybn1lbHNle2FbZisxMj4+MF09MTtIPWIrMTJ8MDtjW0g+PjJdPTA7SD1iKzh8MDtjW0g+PjJdPTA7aT1lO3JldHVybn19fXdoaWxlKDApO0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtIPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7SD1YYSg0KXwwO2NbSD4+Ml09MjEzMDQ7d2IoSHwwLDIxMzc2LDE5Nil9fXdoaWxlKDApO0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtIPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Zz1YYSg4KXwwO2NbZz4+Ml09OTkyODt3aGlsZSgxKXtiPXVuKDU2KXwwO2lmKChifDApIT0wKXtsPTIyOTticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MjI5KXtjW2IrND4+Ml09NDM7Y1tiPj4yXT00MztmPWIrMTJ8MDtjW2crND4+Ml09ZjtjW2IrOD4+Ml09MDtmPWYrMHwwO2I9NTk4NHwwO2U9Zis0NHwwO2Rve2FbZj4+MF09YVtiPj4wXXwwO2Y9ZisxfDA7Yj1iKzF8MH13aGlsZSgoZnwwKTwoZXwwKSk7Y1tnPj4yXT02MDQwO3diKGd8MCw1OTUyLDcyKX1IPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBwZShhKXthPWF8MDt2YXIgYj0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7Yj1pO2k9aSsxNnwwO2Y9YjtnPVNjKDgzNTIsNTE5Mil8MDtoPWNbZysoKGNbKGNbZz4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO2o9aCs0fDA7Y1tqPj4yXT0oY1tqPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tmPj4yXT0xMzQ1NjtjW2YrND4+Ml09MjA4O2NbZis4Pj4yXT0wO2NnKDEzNDU2LGYpfWw9KGNbMTM0NjA+PjJdfDApKyAtMXwwO209Y1toKzg+PjJdfDA7aWYoKGNbaCsxMj4+Ml18MCktbT4+Mj4+PjA+bD4+PjA/KGs9Y1ttKyhsPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7az14Y1tjWyhjW2s+PjJdfDApKzI4Pj4yXSY2M10oaywxMCl8MDttPWNbaj4+Ml18MDtjW2o+PjJdPW0rIC0xO2lmKChtfDApPT0wKXtsY1tjWyhjW2g+PjJdfDApKzg+PjJdJjI1NV0oaCl9bGgoZyxrKTtZZyhnKTtnPWErMzR8MDtnPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNDtpZigoZ3wwKSE9MCl7dm4oZyl9Zz1TYyg4MzUyLDUyMDgpfDA7aD1jW2crKChjWyhjW2c+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtqPWgrNHwwO2Nbaj4+Ml09KGNbaj4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tmKzQ+PjJdPTIwODtjW2YrOD4+Ml09MDtjZygxMzQ1NixmKX1mPShjWzEzNDYwPj4yXXwwKSsgLTF8MDthPWNbaCs4Pj4yXXwwO2lmKChjW2grMTI+PjJdfDApLWE+PjI+Pj4wPmY+Pj4wPyhlPWNbYSsoZjw8Mik+PjJdfDAsKGV8MCkhPTApOjApe2U9eGNbY1soY1tlPj4yXXwwKSsyOD4+Ml0mNjNdKGUsMTApfDA7bT1jW2o+PjJdfDA7Y1tqPj4yXT1tKyAtMTtpZigobXwwKT09MCl7bGNbY1soY1toPj4yXXwwKSs4Pj4yXSYyNTVdKGgpfWxoKGcsZSk7WWcoZyk7aT1iO3JldHVybn1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBxZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gcmUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHNlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiB0ZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gdWUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApfVJiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiB2ZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHdlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24geGUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHllKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gemUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEFlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gQmUoYSl7YT1hfDA7dmFyIGI9MDtiPWk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIENlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1JiKGF8MCk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gRGUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTA7Yj1pO2Q9Y1thPj4yXXwwO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufWU9YSs0fDA7Zj1jW2U+PjJdfDA7aWYoKGZ8MCkhPShkfDApKXtkb3tnPWYrIC0yNHwwO2NbZT4+Ml09ZztmPWNbZisgLTg+PjJdfDA7aWYoKGZ8MCkhPShnfDApKXtpZigoZnwwKSE9MCl7bGNbY1soY1tmPj4yXXwwKSsyMD4+Ml0mMjU1XShmKX19ZWxzZXtsY1tjWyhjW2Y+PjJdfDApKzE2Pj4yXSYyNTVdKGYpfWY9Y1tlPj4yXXwwfXdoaWxlKChmfDApIT0oZHwwKSk7ZD1jW2E+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59fXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gRWUoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEZlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEdlKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2E9aTt3aGlsZSgxKXtkPXVuKDgpfDA7aWYoKGR8MCkhPTApe2I9NzticmVha31kPWNbNTY2Nl18MDtjWzU2NjZdPWQrMDtpZigoZHwwKT09MCl7YnJlYWt9c2NbZCYzMV0oKX1pZigoYnwwKT09Nyl7Y1tkPj4yXT02NDE2O2k9YTtyZXR1cm4gZHwwfWQ9WGEoNCl8MDtjW2Q+PjJdPTIyNjgwO3diKGR8MCwyMjcyOCwyMDYpO3JldHVybiAwfWZ1bmN0aW9uIEhlKGEsYil7YT1hfDA7Yj1ifDA7aWYoKGJ8MCkhPTApe2NbYj4+Ml09NjQxNn1yZXR1cm59ZnVuY3Rpb24gSWUoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEplKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEtlKGIsZSl7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MDtiPWk7aj1lKzEwNHwwO2c9ZFtqPj4wXXwwO2U9Zz4+Pjc7aD1nPj4+NiYxO2lmKCEoKGV8MCkhPTF8KGh8MCk9PTApKXtiPVhhKDgpfDA7Y1tiPj4yXT05OTI4O3doaWxlKDEpe2U9dW4oODApfDA7aWYoKGV8MCkhPTApe2Y9ODticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7YnJlYWt9c2NbZSYzMV0oKX1pZigoZnwwKT09OCl7Y1tlKzQ+PjJdPTY3O2NbZT4+Ml09Njc7Zz1lKzEyfDA7Y1tiKzQ+PjJdPWc7Y1tlKzg+PjJdPTA7Zz1nKzB8MDtlPTY5NjB8MDtmPWcrNjh8MDtkb3thW2c+PjBdPWFbZT4+MF18MDtnPWcrMXwwO2U9ZSsxfDB9d2hpbGUoKGd8MCk8KGZ8MCkpO2NbYj4+Ml09NzA0MDt3YihifDAsNjgzMiw4NCl9aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9aWYoKGV8MCkhPShofDApKXthW2o+PjBdPWcmNjM7aT1iO3JldHVybn1iPVhhKDgpfDA7Y1tiPj4yXT05OTI4O3doaWxlKDEpe2U9dW4oNTEpfDA7aWYoKGV8MCkhPTApe2Y9MTY7YnJlYWt9ZT1jWzU2NjZdfDA7Y1s1NjY2XT1lKzA7aWYoKGV8MCk9PTApe2JyZWFrfXNjW2UmMzFdKCl9aWYoKGZ8MCk9PTE2KXtjW2UrND4+Ml09Mzg7Y1tlPj4yXT0zODtnPWUrMTJ8MDtjW2IrND4+Ml09ZztjW2UrOD4+Ml09MDtnPWcrMHwwO2U9Njg5NnwwO2Y9ZyszOXwwO2Rve2FbZz4+MF09YVtlPj4wXXwwO2c9ZysxfDA7ZT1lKzF8MH13aGlsZSgoZ3wwKTwoZnwwKSk7Y1tiPj4yXT02OTQ0O3diKGJ8MCw2ODgwLDgyKX1qPVhhKDQpfDA7Y1tqPj4yXT0yMjY4MDt3YihqfDAsMjI3MjgsMjA2KX1mdW5jdGlvbiBMZShhLGIpe2E9YXwwO2I9YnwwO3JldHVybigoY1tiKzQ+PjJdfDApPT02Njg4P2ErNHwwOjApfDB9ZnVuY3Rpb24gTWUoYSl7YT1hfDA7cmV0dXJuIDY3ODR9ZnVuY3Rpb24gTmUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIE9lKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBQZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFFlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gUmUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApfVJiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBTZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wO2I9aTtpPWkrMTZ8MDtoPWI7ZD1TYyg4MzUyLDcxMDQpfDA7ZT1jW2QrKChjWyhjW2Q+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtmPWUrNHwwO2NbZj4+Ml09KGNbZj4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbaD4+Ml09MTM0NTY7Y1toKzQ+PjJdPTIwODtjW2grOD4+Ml09MDtjZygxMzQ1NixoKX1oPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtqPWNbZSs4Pj4yXXwwO2lmKChjW2UrMTI+PjJdfDApLWo+PjI+Pj4wPmg+Pj4wPyhnPWNbaisoaDw8Mik+PjJdfDAsKGd8MCkhPTApOjApe2c9eGNbY1soY1tnPj4yXXwwKSsyOD4+Ml0mNjNdKGcsMTApfDA7aj1jW2Y+PjJdfDA7Y1tmPj4yXT1qKyAtMTtpZigoanwwKT09MCl7bGNbY1soY1tlPj4yXXwwKSs4Pj4yXSYyNTVdKGUpfWxoKGQsZyk7WWcoZCk7ZD1jW2ErMzI0Pj4yXXwwO2lmKCgoZHwwKSE9MD8oaD1kKzR8MCxqPWNbaD4+Ml18MCxjW2g+PjJdPWorIC0xLChqfDApPT0wKTowKT8obGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpLGg9ZCs4fDAsaj1jW2g+PjJdfDAsY1toPj4yXT1qKyAtMSwoanwwKT09MCk6MCl7bGNbY1soY1tkPj4yXXwwKSsxNj4+Ml0mMjU1XShkKX1kPWNbYSszMTY+PjJdfDA7aWYoKChkfDApIT0wPyhoPWQrNHwwLGo9Y1toPj4yXXwwLGNbaD4+Ml09aisgLTEsKGp8MCk9PTApOjApPyhsY1tjWyhjW2Q+PjJdfDApKzg+PjJdJjI1NV0oZCksaD1kKzh8MCxqPWNbaD4+Ml18MCxjW2g+PjJdPWorIC0xLChqfDApPT0wKTowKXtsY1tjWyhjW2Q+PjJdfDApKzE2Pj4yXSYyNTVdKGQpfWQ9Y1thKzMwMD4+Ml18MDtpZigoZHwwKSE9MCl7ZT1hKzMwNHwwO2Y9Y1tlPj4yXXwwO2lmKChmfDApIT0oZHwwKSl7Y1tlPj4yXT1mKyh+KCgoZisgLTEyKygwLWQpfDApPj4+MCkvMTJ8MCkqMTJ8MCl9dm4oZCl9ZD1jW2ErMjg4Pj4yXXwwO2lmKChkfDApPT0wKXtqPWErMjQ3fDA7cGUoaik7aj1hKzE2fDA7aj1jW2o+PjJdfDA7aj1qKyAtNHwwO2o9Y1tqPj4yXXwwO3ZuKGopO2k9YjtyZXR1cm59ZT1hKzI5MnwwO2Y9Y1tlPj4yXXwwO2lmKChmfDApIT0oZHwwKSl7Y1tlPj4yXT1mKyh+KChmKyAtOCsoMC1kKXwwKT4+PjMpPDwzKX12bihkKTtqPWErMjQ3fDA7cGUoaik7aj1hKzE2fDA7aj1jW2o+PjJdfDA7aj1qKyAtNHwwO2o9Y1tqPj4yXXwwO3ZuKGopO2k9YjtyZXR1cm59aj1YYSg0KXwwO2Nbaj4+Ml09MjEzMDQ7d2IoanwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gVGUoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFVlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFZlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2E9Y1thKzEyPj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufVNlKGEpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gV2UoYSxiKXthPWF8MDtiPWJ8MDtpZigoY1tiKzQ+PjJdfDApPT03MzEyKXthPWErMTJ8MH1lbHNle2E9MH1yZXR1cm4gYXwwfWZ1bmN0aW9uIFhlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFllKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBaZShhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBfZShhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSsxMj4+Ml18MDtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiAkZShhLGIpe2E9YXwwO2I9YnwwO2lmKChjW2IrND4+Ml18MCk9PTc1NjApe2E9YSsxMnwwfWVsc2V7YT0wfXJldHVybiBhfDB9ZnVuY3Rpb24gYWYoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gYmYoKXt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MDtiPWk7aT1pKzMyfDA7ZD1iO0hiKDcyLDk2LDE3NiwwLDE1Miw5MSwxNDQsMCwxNDQsMCw4LDEzNiwyMTEpO2NbZD4+Ml09MTtlPWQrNHwwO2NbZT4+Ml09OTY7T2IoNzIsMSxlfDAsMTI4LDkyLDIyKTtjW2Q+PjJdPTQ7ZT1kKzR8MDtjW2U+PjJdPTIxNzc2O2NbZCs4Pj4yXT05NjtjW2QrMTI+PjJdPTIxOTA0O2NbZCsxNj4+Ml09MjE5MDQ7Zj11big4KXwwO2lmKChmfDApIT0wKXthW2Y+PjBdPTI3O2FbZisxPj4wXT0wO2FbZisyPj4wXT0wO2FbZiszPj4wXT0wO2c9Zis0fDA7YVtnPj4wXT0wO2FbZysxPj4wXT0wO2FbZysyPj4wXT0wO2FbZyszPj4wXT0wfXpiKDcyLDE2LDQsZXwwLDEyMCwzMCxmfDAsMCk7Y1tkPj4yXT0zO2U9ZCs0fDA7Y1tlPj4yXT0yMTc3NjtjW2QrOD4+Ml09OTY7Y1tkKzEyPj4yXT0yMTg4ODtmPXVuKDgpfDA7aWYoKGZ8MCkhPTApe2FbZj4+MF09NjY7YVtmKzE+PjBdPTA7YVtmKzI+PjBdPTA7YVtmKzM+PjBdPTA7Zz1mKzR8MDthW2c+PjBdPTA7YVtnKzE+PjBdPTA7YVtnKzI+PjBdPTA7YVtnKzM+PjBdPTB9emIoNzIsMjQsMyxlfDAsMTEyLDI4LGZ8MCwwKTtjW2Q+PjJdPTI7ZT1kKzR8MDtjW2U+PjJdPTIxOTA0O2NbZCs4Pj4yXT05NjtkPXVuKDgpfDA7aWYoKGR8MCk9PTApe3piKDcyLDQwLDIsZXwwLDU2LDQ2LGR8MCwwKTtpPWI7cmV0dXJufWFbZD4+MF09OTM7YVtkKzE+PjBdPTA7YVtkKzI+PjBdPTA7YVtkKzM+PjBdPTA7Zz1kKzR8MDthW2c+PjBdPTA7YVtnKzE+PjBdPTA7YVtnKzI+PjBdPTA7YVtnKzM+PjBdPTA7emIoNzIsNDAsMixlfDAsNTYsNDYsZHwwLDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gY2YoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtkPWNbYSs0Pj4yXXwwO2U9KEpuKGR8MCl8MCkrMXwwO2E9dW4oZSl8MDtpZigoYXwwKT09MCl7ZT0wO2k9YjtyZXR1cm4gZXwwfUxuKGF8MCxkfDAsZXwwKXwwO2U9YTtpPWI7cmV0dXJuIGV8MH1mdW5jdGlvbiBkZigpe3ZhciBhPTA7YT1pO0phKDIxNzc2LDc2MjQpO3BiKDIxODA4LDc2MzIsMSwxLDApO1VhKDIxODI0LDc2NDAsMSwtMTI4LDEyNyk7VWEoMjE4NTYsNzY0OCwxLC0xMjgsMTI3KTtVYSgyMTg0MCw3NjY0LDEsMCwyNTUpO1VhKDIxODY0LDc2ODAsMiwtMzI3NjgsMzI3NjcpO1VhKDIxODcyLDc2ODgsMiwwLDY1NTM1KTtVYSgyMTg4OCw3NzA0LDQsLTIxNDc0ODM2NDgsMjE0NzQ4MzY0Nyk7VWEoMjE5MDQsNzcxMiw0LDAsLTEpO1VhKDIxOTIwLDc3MjgsNCwtMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ3KTtVYSgyMTkzNiw3NzM2LDQsMCwtMSk7YWMoMjE5NTIsNzc1Miw0KTthYygyMTk2OCw3NzYwLDgpO3RiKDgyNDAsNzc2OCk7dGIoODE1Miw3Nzg0KTtKYig4MDY0LDQsNzgyNCk7eGIoNzk0NCw3ODQwKTtMYSg3OTEyLDc4NTYpO2k9YTtyZXR1cm59ZnVuY3Rpb24gZWYoYSl7YT1hfDA7YT1pO1lnKDgzNTIpO1lnKDg1MjgpO2JoKDg3MDQpO2JoKDg4ODApO2k9YTtyZXR1cm59ZnVuY3Rpb24gZmYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNzI4O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGdmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA3Mjg7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gaGYoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wO2U9aTtvY1tjWyhjW2I+PjJdfDApKzI0Pj4yXSYxMjddKGIpfDA7ZD1ZayhjW2Q+PjJdfDAsMTM1MjgpfDA7Y1tiKzM2Pj4yXT1kO2FbYis0ND4+MF09KG9jW2NbKGNbZD4+Ml18MCkrMjg+PjJdJjEyN10oZCl8MCkmMTtpPWU7cmV0dXJufWZ1bmN0aW9uIGpmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtiPWk7aT1pKzE2fDA7Zz1iKzh8MDtkPWI7ZT1hKzM2fDA7Zj1hKzQwfDA7aD1nKzh8MDtqPWc7YT1hKzMyfDA7d2hpbGUoMSl7az1jW2U+PjJdfDA7az15Y1tjWyhjW2s+PjJdfDApKzIwPj4yXSY2M10oayxjW2Y+PjJdfDAsZyxoLGQpfDA7bD0oY1tkPj4yXXwwKS1qfDA7aWYoKFpiKGd8MCwxLGx8MCxjW2E+PjJdfDApfDApIT0obHwwKSl7ZT0tMTtkPTU7YnJlYWt9aWYoKGt8MCk9PTIpe2U9LTE7ZD01O2JyZWFrfWVsc2UgaWYoKGt8MCkhPTEpe2Q9NDticmVha319aWYoKGR8MCk9PTQpe2w9KChfYShjW2E+PjJdfDApfDApIT0wKTw8MzE+PjMxO2k9YjtyZXR1cm4gbHwwfWVsc2UgaWYoKGR8MCk9PTUpe2k9YjtyZXR1cm4gZXwwfXJldHVybiAwfWZ1bmN0aW9uIGtmKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MDtmPWk7aWYoKGFbYis0ND4+MF18MCkhPTApe2c9WmIoZHwwLDQsZXwwLGNbYiszMj4+Ml18MCl8MDtpPWY7cmV0dXJuIGd8MH1pZigoZXwwKT4wKXtnPTB9ZWxzZXtnPTA7aT1mO3JldHVybiBnfDB9d2hpbGUoMSl7aWYoKHhjW2NbKGNbYj4+Ml18MCkrNTI+PjJdJjYzXShiLGNbZD4+Ml18MCl8MCk9PS0xKXtlPTY7YnJlYWt9Zz1nKzF8MDtpZigoZ3wwKTwoZXwwKSl7ZD1kKzR8MH1lbHNle2U9NjticmVha319aWYoKGV8MCk9PTYpe2k9ZjtyZXR1cm4gZ3wwfXJldHVybiAwfWZ1bmN0aW9uIGxmKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtlPWk7aT1pKzMyfDA7az1lKzE2fDA7cD1lKzh8MDtqPWUrNHwwO2g9ZTtmPShkfDApPT0tMTthOmRve2lmKCFmKXtjW3A+PjJdPWQ7aWYoKGFbYis0ND4+MF18MCkhPTApe2lmKChaYihwfDAsNCwxLGNbYiszMj4+Ml18MCl8MCk9PTEpe2JyZWFrfWVsc2V7ZD0tMX1pPWU7cmV0dXJuIGR8MH1jW2o+PjJdPWs7bD1wKzR8MDtuPWIrMzZ8MDtvPWIrNDB8MDtnPWsrOHwwO209aztiPWIrMzJ8MDt3aGlsZSgxKXtxPWNbbj4+Ml18MDtxPXRjW2NbKGNbcT4+Ml18MCkrMTI+PjJdJjMxXShxLGNbbz4+Ml18MCxwLGwsaCxrLGcsail8MDtpZigoY1toPj4yXXwwKT09KHB8MCkpe2Q9LTE7Zz0xMjticmVha31pZigocXwwKT09Myl7Zz03O2JyZWFrfXI9KHF8MCk9PTE7aWYoIShxPj4+MDwyKSl7ZD0tMTtnPTEyO2JyZWFrfXE9KGNbaj4+Ml18MCktbXwwO2lmKChaYihrfDAsMSxxfDAsY1tiPj4yXXwwKXwwKSE9KHF8MCkpe2Q9LTE7Zz0xMjticmVha31pZihyKXtwPXI/Y1toPj4yXXwwOnB9ZWxzZXticmVhayBhfX1pZigoZ3wwKT09Nyl7aWYoKFpiKHB8MCwxLDEsY1tiPj4yXXwwKXwwKT09MSl7YnJlYWt9ZWxzZXtkPS0xfWk9ZTtyZXR1cm4gZHwwfWVsc2UgaWYoKGd8MCk9PTEyKXtpPWU7cmV0dXJuIGR8MH19fXdoaWxlKDApO3I9Zj8wOmQ7aT1lO3JldHVybiByfDB9ZnVuY3Rpb24gbWYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNzI4O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIG5mKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA3Mjg7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gb2YoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTA7ZT1pO2c9WWsoY1tkPj4yXXwwLDEzNTI4KXwwO2Y9YiszNnwwO2NbZj4+Ml09ZztkPWIrNDR8MDtjW2Q+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MDtmPWNbZj4+Ml18MDthW2IrNTM+PjBdPShvY1tjWyhjW2Y+PjJdfDApKzI4Pj4yXSYxMjddKGYpfDApJjE7aWYoKGNbZD4+Ml18MCk+OCl7b2soOTU0NCl9ZWxzZXtpPWU7cmV0dXJufX1mdW5jdGlvbiBwZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPXNmKGEsMCl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBxZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPXNmKGEsMSl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiByZihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2U9aTtpPWkrMzJ8MDtqPWUrMTZ8MDtmPWUrOHwwO2w9ZSs0fDA7az1lO2c9Yis1MnwwO209KGFbZz4+MF18MCkhPTA7aWYoKGR8MCk9PS0xKXtpZihtKXttPS0xO2k9ZTtyZXR1cm4gbXwwfW09Y1tiKzQ4Pj4yXXwwO2FbZz4+MF09KG18MCkhPS0xJjE7aT1lO3JldHVybiBtfDB9aD1iKzQ4fDA7YTpkb3tpZihtKXtjW2w+PjJdPWNbaD4+Ml07bT1jW2IrMzY+PjJdfDA7az10Y1tjWyhjW20+PjJdfDApKzEyPj4yXSYzMV0obSxjW2IrNDA+PjJdfDAsbCxsKzR8MCxrLGosais4fDAsZil8MDtpZigoa3wwKT09Myl7YVtqPj4wXT1jW2g+PjJdO2NbZj4+Ml09aisxfWVsc2UgaWYoKGt8MCk9PTF8KGt8MCk9PTIpe209LTE7aT1lO3JldHVybiBtfDB9Yj1iKzMyfDA7d2hpbGUoMSl7az1jW2Y+PjJdfDA7aWYoIShrPj4+MD5qPj4+MCkpe2JyZWFrIGF9bT1rKyAtMXwwO2NbZj4+Ml09bTtpZigoVmEoYVttPj4wXXwwLGNbYj4+Ml18MCl8MCk9PS0xKXtmPS0xO2JyZWFrfX1pPWU7cmV0dXJuIGZ8MH19d2hpbGUoMCk7Y1toPj4yXT1kO2FbZz4+MF09MTttPWQ7aT1lO3JldHVybiBtfDB9ZnVuY3Rpb24gc2YoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTA7ZT1pO2k9aSszMnwwO2c9ZSsxNnwwO2o9ZSs4fDA7bT1lKzR8MDtsPWU7bj1iKzUyfDA7aWYoKGFbbj4+MF18MCkhPTApe2Y9Yis0OHwwO2c9Y1tmPj4yXXwwO2lmKCFkKXt2PWc7aT1lO3JldHVybiB2fDB9Y1tmPj4yXT0tMTthW24+PjBdPTA7dj1nO2k9ZTtyZXR1cm4gdnwwfXM9Y1tiKzQ0Pj4yXXwwO3M9KHN8MCk+MT9zOjE7YTpkb3tpZigoc3wwKT4wKXtwPWIrMzJ8MDtuPTA7d2hpbGUoMSl7bz1UYihjW3A+PjJdfDApfDA7aWYoKG98MCk9PS0xKXtoPS0xO2JyZWFrfWFbZytuPj4wXT1vO249bisxfDA7aWYoKG58MCk+PShzfDApKXticmVhayBhfX1pPWU7cmV0dXJuIGh8MH19d2hpbGUoMCk7Yjpkb3tpZigoYVtiKzUzPj4wXXwwKT09MCl7cD1iKzQwfDA7cT1iKzM2fDA7bj1qKzR8MDtvPWIrMzJ8MDt3aGlsZSgxKXt2PWNbcD4+Ml18MDt1PXY7dD1jW3U+PjJdfDA7dT1jW3UrND4+Ml18MDt3PWNbcT4+Ml18MDtyPWcrc3wwO3Y9dGNbY1soY1t3Pj4yXXwwKSsxNj4+Ml0mMzFdKHcsdixnLHIsbSxqLG4sbCl8MDtpZigodnwwKT09Myl7Zj0xNDticmVha31lbHNlIGlmKCh2fDApPT0yKXtoPS0xO2Y9MjI7YnJlYWt9ZWxzZSBpZigodnwwKSE9MSl7az1zO2JyZWFrIGJ9dz1jW3A+PjJdfDA7Y1t3Pj4yXT10O2Nbdys0Pj4yXT11O2lmKChzfDApPT04KXtoPS0xO2Y9MjI7YnJlYWt9dD1UYihjW28+PjJdfDApfDA7aWYoKHR8MCk9PS0xKXtoPS0xO2Y9MjI7YnJlYWt9YVtyPj4wXT10O3M9cysxfDB9aWYoKGZ8MCk9PTE0KXtjW2o+PjJdPWFbZz4+MF18MDtrPXM7YnJlYWt9ZWxzZSBpZigoZnwwKT09MjIpe2k9ZTtyZXR1cm4gaHwwfX1lbHNle2Nbaj4+Ml09YVtnPj4wXXwwO2s9c319d2hpbGUoMCk7aWYoZCl7dz1jW2o+PjJdfDA7Y1tiKzQ4Pj4yXT13O2k9ZTtyZXR1cm4gd3wwfWQ9YiszMnwwO3doaWxlKDEpe2lmKChrfDApPD0wKXticmVha31rPWsrIC0xfDA7aWYoKFZhKGFbZytrPj4wXXwwLGNbZD4+Ml18MCl8MCk9PS0xKXtoPS0xO2Y9MjI7YnJlYWt9fWlmKChmfDApPT0yMil7aT1lO3JldHVybiBofDB9dz1jW2o+PjJdfDA7aT1lO3JldHVybiB3fDB9ZnVuY3Rpb24gdGYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNjY0O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHVmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA2NjQ7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gdmYoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wO2U9aTtvY1tjWyhjW2I+PjJdfDApKzI0Pj4yXSYxMjddKGIpfDA7ZD1ZayhjW2Q+PjJdfDAsMTM1MjApfDA7Y1tiKzM2Pj4yXT1kO2FbYis0ND4+MF09KG9jW2NbKGNbZD4+Ml18MCkrMjg+PjJdJjEyN10oZCl8MCkmMTtpPWU7cmV0dXJufWZ1bmN0aW9uIHdmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtiPWk7aT1pKzE2fDA7Zz1iKzh8MDtkPWI7ZT1hKzM2fDA7Zj1hKzQwfDA7aD1nKzh8MDtqPWc7YT1hKzMyfDA7d2hpbGUoMSl7az1jW2U+PjJdfDA7az15Y1tjWyhjW2s+PjJdfDApKzIwPj4yXSY2M10oayxjW2Y+PjJdfDAsZyxoLGQpfDA7bD0oY1tkPj4yXXwwKS1qfDA7aWYoKFpiKGd8MCwxLGx8MCxjW2E+PjJdfDApfDApIT0obHwwKSl7ZT0tMTtkPTU7YnJlYWt9aWYoKGt8MCk9PTIpe2U9LTE7ZD01O2JyZWFrfWVsc2UgaWYoKGt8MCkhPTEpe2Q9NDticmVha319aWYoKGR8MCk9PTQpe2w9KChfYShjW2E+PjJdfDApfDApIT0wKTw8MzE+PjMxO2k9YjtyZXR1cm4gbHwwfWVsc2UgaWYoKGR8MCk9PTUpe2k9YjtyZXR1cm4gZXwwfXJldHVybiAwfWZ1bmN0aW9uIHhmKGIsZSxmKXtiPWJ8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MDtnPWk7aWYoKGFbYis0ND4+MF18MCkhPTApe2g9WmIoZXwwLDEsZnwwLGNbYiszMj4+Ml18MCl8MDtpPWc7cmV0dXJuIGh8MH1pZigoZnwwKT4wKXtoPTB9ZWxzZXtoPTA7aT1nO3JldHVybiBofDB9d2hpbGUoMSl7aWYoKHhjW2NbKGNbYj4+Ml18MCkrNTI+PjJdJjYzXShiLGRbZT4+MF18MCl8MCk9PS0xKXtmPTY7YnJlYWt9aD1oKzF8MDtpZigoaHwwKTwoZnwwKSl7ZT1lKzF8MH1lbHNle2Y9NjticmVha319aWYoKGZ8MCk9PTYpe2k9ZztyZXR1cm4gaHwwfXJldHVybiAwfWZ1bmN0aW9uIHlmKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtlPWk7aT1pKzMyfDA7az1lKzE2fDA7cD1lKzh8MDtqPWUrNHwwO2g9ZTtmPShkfDApPT0tMTthOmRve2lmKCFmKXthW3A+PjBdPWQ7aWYoKGFbYis0ND4+MF18MCkhPTApe2lmKChaYihwfDAsMSwxLGNbYiszMj4+Ml18MCl8MCk9PTEpe2JyZWFrfWVsc2V7ZD0tMX1pPWU7cmV0dXJuIGR8MH1jW2o+PjJdPWs7bD1wKzF8MDtuPWIrMzZ8MDtvPWIrNDB8MDtnPWsrOHwwO209aztiPWIrMzJ8MDt3aGlsZSgxKXtxPWNbbj4+Ml18MDtxPXRjW2NbKGNbcT4+Ml18MCkrMTI+PjJdJjMxXShxLGNbbz4+Ml18MCxwLGwsaCxrLGcsail8MDtpZigoY1toPj4yXXwwKT09KHB8MCkpe2Q9LTE7Zz0xMjticmVha31pZigocXwwKT09Myl7Zz03O2JyZWFrfXI9KHF8MCk9PTE7aWYoIShxPj4+MDwyKSl7ZD0tMTtnPTEyO2JyZWFrfXE9KGNbaj4+Ml18MCktbXwwO2lmKChaYihrfDAsMSxxfDAsY1tiPj4yXXwwKXwwKSE9KHF8MCkpe2Q9LTE7Zz0xMjticmVha31pZihyKXtwPXI/Y1toPj4yXXwwOnB9ZWxzZXticmVhayBhfX1pZigoZ3wwKT09Nyl7aWYoKFpiKHB8MCwxLDEsY1tiPj4yXXwwKXwwKT09MSl7YnJlYWt9ZWxzZXtkPS0xfWk9ZTtyZXR1cm4gZHwwfWVsc2UgaWYoKGd8MCk9PTEyKXtpPWU7cmV0dXJuIGR8MH19fXdoaWxlKDApO3I9Zj8wOmQ7aT1lO3JldHVybiByfDB9ZnVuY3Rpb24gemYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNjY0O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEFmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA2NjQ7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gQmYoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTA7ZT1pO2c9WWsoY1tkPj4yXXwwLDEzNTIwKXwwO2Y9YiszNnwwO2NbZj4+Ml09ZztkPWIrNDR8MDtjW2Q+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MDtmPWNbZj4+Ml18MDthW2IrNTM+PjBdPShvY1tjWyhjW2Y+PjJdfDApKzI4Pj4yXSYxMjddKGYpfDApJjE7aWYoKGNbZD4+Ml18MCk+OCl7b2soOTU0NCl9ZWxzZXtpPWU7cmV0dXJufX1mdW5jdGlvbiBDZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPUZmKGEsMCl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBEZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPUZmKGEsMSl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBFZihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2U9aTtpPWkrMzJ8MDtqPWUrMTZ8MDtmPWUrNHwwO2w9ZSs4fDA7az1lO2c9Yis1MnwwO209KGFbZz4+MF18MCkhPTA7aWYoKGR8MCk9PS0xKXtpZihtKXttPS0xO2k9ZTtyZXR1cm4gbXwwfW09Y1tiKzQ4Pj4yXXwwO2FbZz4+MF09KG18MCkhPS0xJjE7aT1lO3JldHVybiBtfDB9aD1iKzQ4fDA7YTpkb3tpZihtKXthW2w+PjBdPWNbaD4+Ml07bT1jW2IrMzY+PjJdfDA7az10Y1tjWyhjW20+PjJdfDApKzEyPj4yXSYzMV0obSxjW2IrNDA+PjJdfDAsbCxsKzF8MCxrLGosais4fDAsZil8MDtpZigoa3wwKT09MXwoa3wwKT09Mil7bT0tMTtpPWU7cmV0dXJuIG18MH1lbHNlIGlmKChrfDApPT0zKXthW2o+PjBdPWNbaD4+Ml07Y1tmPj4yXT1qKzF9Yj1iKzMyfDA7d2hpbGUoMSl7az1jW2Y+PjJdfDA7aWYoIShrPj4+MD5qPj4+MCkpe2JyZWFrIGF9bT1rKyAtMXwwO2NbZj4+Ml09bTtpZigoVmEoYVttPj4wXXwwLGNbYj4+Ml18MCl8MCk9PS0xKXtmPS0xO2JyZWFrfX1pPWU7cmV0dXJuIGZ8MH19d2hpbGUoMCk7Y1toPj4yXT1kO2FbZz4+MF09MTttPWQ7aT1lO3JldHVybiBtfDB9ZnVuY3Rpb24gRmYoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTA7Zj1pO2k9aSszMnwwO2g9ZisxNnwwO2o9Zis4fDA7bj1mKzR8MDttPWY7bz1iKzUyfDA7aWYoKGFbbz4+MF18MCkhPTApe2c9Yis0OHwwO2g9Y1tnPj4yXXwwO2lmKCFlKXt3PWg7aT1mO3JldHVybiB3fDB9Y1tnPj4yXT0tMTthW28+PjBdPTA7dz1oO2k9ZjtyZXR1cm4gd3wwfXA9Y1tiKzQ0Pj4yXXwwO3A9KHB8MCk+MT9wOjE7YTpkb3tpZigocHwwKT4wKXtyPWIrMzJ8MDtvPTA7d2hpbGUoMSl7cT1UYihjW3I+PjJdfDApfDA7aWYoKHF8MCk9PS0xKXtrPS0xO2JyZWFrfWFbaCtvPj4wXT1xO289bysxfDA7aWYoKG98MCk+PShwfDApKXticmVhayBhfX1pPWY7cmV0dXJuIGt8MH19d2hpbGUoMCk7Yjpkb3tpZigoYVtiKzUzPj4wXXwwKT09MCl7cj1iKzQwfDA7cz1iKzM2fDA7bz1qKzF8MDtxPWIrMzJ8MDt3aGlsZSgxKXt3PWNbcj4+Ml18MDt2PXc7dT1jW3Y+PjJdfDA7dj1jW3YrND4+Ml18MDt4PWNbcz4+Ml18MDt0PWgrcHwwO3c9dGNbY1soY1t4Pj4yXXwwKSsxNj4+Ml0mMzFdKHgsdyxoLHQsbixqLG8sbSl8MDtpZigod3wwKT09Mil7az0tMTttPTIzO2JyZWFrfWVsc2UgaWYoKHd8MCk9PTMpe209MTQ7YnJlYWt9ZWxzZSBpZigod3wwKSE9MSl7bD1wO2JyZWFrIGJ9eD1jW3I+PjJdfDA7Y1t4Pj4yXT11O2NbeCs0Pj4yXT12O2lmKChwfDApPT04KXtrPS0xO209MjM7YnJlYWt9dT1UYihjW3E+PjJdfDApfDA7aWYoKHV8MCk9PS0xKXtrPS0xO209MjM7YnJlYWt9YVt0Pj4wXT11O3A9cCsxfDB9aWYoKG18MCk9PTE0KXthW2o+PjBdPWFbaD4+MF18MDtsPXA7YnJlYWt9ZWxzZSBpZigobXwwKT09MjMpe2k9ZjtyZXR1cm4ga3wwfX1lbHNle2Fbaj4+MF09YVtoPj4wXXwwO2w9cH19d2hpbGUoMCk7ZG97aWYoIWUpe2U9YiszMnwwO3doaWxlKDEpe2lmKChsfDApPD0wKXttPTIxO2JyZWFrfWw9bCsgLTF8MDtpZigoVmEoZFtoK2w+PjBdfDAsY1tlPj4yXXwwKXwwKT09LTEpe2s9LTE7bT0yMzticmVha319aWYoKG18MCk9PTIxKXtnPWFbaj4+MF18MDticmVha31lbHNlIGlmKChtfDApPT0yMyl7aT1mO3JldHVybiBrfDB9fWVsc2V7Zz1hW2o+PjBdfDA7Y1tiKzQ4Pj4yXT1nJjI1NX19d2hpbGUoMCk7eD1nJjI1NTtpPWY7cmV0dXJuIHh8MH1mdW5jdGlvbiBHZigpe3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2I9aTtpPWkrMTZ8MDtkPWI7Zj1jW3I+PjJdfDA7Y1syMjQ0XT0xMDY2NDtYayg4OTgwfDApO2NbODk4ND4+Ml09MDtjWzg5ODg+PjJdPTA7Y1s4OTkyPj4yXT0wO2NbODk5Nj4+Ml09MDtjWzllMz4+Ml09MDtjWzkwMDQ+PjJdPTA7Y1syMjQ0XT05NzA0O2NbOTAwOD4+Ml09ZjtjWzkwMTY+PjJdPTkwMzI7Y1s5MDI0Pj4yXT0tMTthWzkwMjg+PjBdPTA7bj1jWzg5ODA+PjJdfDA7bT1uKzR8MDtjW20+PjJdPShjW20+PjJdfDApKzE7aWYoISgoY1szMzgwXXwwKT09LTEpKXtjW2Q+PjJdPTEzNTIwO2NbZCs0Pj4yXT0yMDg7Y1tkKzg+PjJdPTA7Y2coMTM1MjAsZCl9bD0oY1sxMzUyND4+Ml18MCkrIC0xfDA7az1jW24rOD4+Ml18MDtpZigoY1tuKzEyPj4yXXwwKS1rPj4yPj4+MD5sPj4+MD8oaj1jW2srKGw8PDIpPj4yXXwwLChqfDApIT0wKTowKXtjWzkwMTI+PjJdPWo7Y1s5MDIwPj4yXT1vY1tjWyhjW2o+PjJdfDApKzI0Pj4yXSYxMjddKGopfDA7bD1jWzkwMTI+PjJdfDA7YVs5MDI5Pj4wXT0ob2NbY1soY1tsPj4yXXwwKSsyOD4+Ml0mMTI3XShsKXwwKSYxO2lmKChjWzkwMjA+PjJdfDApPjgpe29rKDk1NDQpfWw9Y1ttPj4yXXwwO2NbbT4+Ml09bCsgLTE7aWYoKGx8MCk9PTApe2xjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKX1jWzIwNjZdPTEwNzk2O2NbODI3Mj4+Ml09MTA4MTY7Y1s4MjY4Pj4yXT0wO2NbODI5Nj4+Ml09ODk3NjtjWzgyODg+PjJdPTA7Y1s4MjkyPj4yXT0wO2NbODI3Nj4+Ml09NDA5ODtjWzgyODQ+PjJdPTA7Y1s4MjgwPj4yXT02O2s9ODMwNHwwO2w9ays0MHwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChsfDApKTtYayg4MzAwfDApO2NbODM0ND4+Ml09MDtjWzgzNDg+PjJdPS0xO2o9Y1tzPj4yXXwwO2NbMjI3MF09MTA2NjQ7WGsoOTA4NHwwKTtjWzkwODg+PjJdPTA7Y1s5MDkyPj4yXT0wO2NbOTA5Nj4+Ml09MDtjWzkxMDA+PjJdPTA7Y1s5MTA0Pj4yXT0wO2NbOTEwOD4+Ml09MDtjWzIyNzBdPTk1OTI7Y1s5MTEyPj4yXT1qO2s9Y1s5MDg0Pj4yXXwwO2w9ays0fDA7Y1tsPj4yXT0oY1tsPj4yXXwwKSsxO2lmKCEoKGNbMzM4MF18MCk9PS0xKSl7Y1tkPj4yXT0xMzUyMDtjW2QrND4+Ml09MjA4O2NbZCs4Pj4yXT0wO2NnKDEzNTIwLGQpfW09KGNbMTM1MjQ+PjJdfDApKyAtMXwwO249Y1trKzg+PjJdfDA7aWYoKGNbaysxMj4+Ml18MCktbj4+Mj4+PjA+bT4+PjA/KGg9Y1tuKyhtPDwyKT4+Ml18MCwoaHwwKSE9MCk6MCl7bj1jW2w+PjJdfDA7Y1tsPj4yXT1uKyAtMTtpZigobnwwKT09MCl7bGNbY1soY1trPj4yXXwwKSs4Pj4yXSYyNTVdKGspfWNbOTExNj4+Ml09aDtjWzkxMjA+PjJdPTkwNDA7YVs5MTI0Pj4wXT0ob2NbY1soY1toPj4yXXwwKSsyOD4+Ml0mMTI3XShoKXwwKSYxO2NbMjA4OF09MTA4NzY7Y1s4MzU2Pj4yXT0xMDg5NjtjWzgzODA+PjJdPTkwODA7Y1s4MzcyPj4yXT0wO2NbODM3Nj4+Ml09MDtjWzgzNjA+PjJdPTQwOTg7Y1s4MzY4Pj4yXT0wO2NbODM2ND4+Ml09NjtrPTgzODh8MDtsPWsrNDB8MDtkb3tjW2s+PjJdPTA7az1rKzR8MH13aGlsZSgoa3wwKTwobHwwKSk7WGsoODM4NHwwKTtjWzg0Mjg+PjJdPTA7Y1s4NDMyPj4yXT0tMTtoPWNbcT4+Ml18MDtjWzIyODJdPTEwNjY0O1hrKDkxMzJ8MCk7Y1s5MTM2Pj4yXT0wO2NbOTE0MD4+Ml09MDtjWzkxNDQ+PjJdPTA7Y1s5MTQ4Pj4yXT0wO2NbOTE1Mj4+Ml09MDtjWzkxNTY+PjJdPTA7Y1syMjgyXT05NTkyO2NbOTE2MD4+Ml09aDttPWNbOTEzMj4+Ml18MDtuPW0rNHwwO2Nbbj4+Ml09KGNbbj4+Ml18MCkrMTtpZighKChjWzMzODBdfDApPT0tMSkpe2NbZD4+Ml09MTM1MjA7Y1tkKzQ+PjJdPTIwODtjW2QrOD4+Ml09MDtjZygxMzUyMCxkKX1sPShjWzEzNTI0Pj4yXXwwKSsgLTF8MDtrPWNbbSs4Pj4yXXwwO2lmKChjW20rMTI+PjJdfDApLWs+PjI+Pj4wPmw+Pj4wPyhnPWNbaysobDw8Mik+PjJdfDAsKGd8MCkhPTApOjApe2w9Y1tuPj4yXXwwO2Nbbj4+Ml09bCsgLTE7aWYoKGx8MCk9PTApe2xjW2NbKGNbbT4+Ml18MCkrOD4+Ml0mMjU1XShtKX1jWzkxNjQ+PjJdPWc7Y1s5MTY4Pj4yXT05MDQ4O2FbOTE3Mj4+MF09KG9jW2NbKGNbZz4+Ml18MCkrMjg+PjJdJjEyN10oZyl8MCkmMTtjWzIxMTBdPTEwODc2O2NbODQ0ND4+Ml09MTA4OTY7Y1s4NDY4Pj4yXT05MTI4O2NbODQ2MD4+Ml09MDtjWzg0NjQ+PjJdPTA7Y1s4NDQ4Pj4yXT00MDk4O2NbODQ1Nj4+Ml09MDtjWzg0NTI+PjJdPTY7az04NDc2fDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg0NzJ8MCk7Y1s4NTE2Pj4yXT0wO2NbODUyMD4+Ml09LTE7az1jWyhjWyhjWzIxMTBdfDApKyAtMTI+PjJdfDApKzg0NjQ+PjJdfDA7Y1syMTMyXT0xMDg3NjtjWzg1MzI+PjJdPTEwODk2O2NbODU1Nj4+Ml09aztjWzg1NDg+PjJdPShrfDApPT0wJjE7Y1s4NTUyPj4yXT0wO2NbODUzNj4+Ml09NDA5ODtjWzg1NDQ+PjJdPTA7Y1s4NTQwPj4yXT02O2s9ODU2NHwwO2w9ays0MHwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChsfDApKTtYayg4NTYwfDApO2NbODYwND4+Ml09MDtjWzg2MDg+PjJdPS0xO2NbKGNbKGNbMjA2Nl18MCkrIC0xMj4+Ml18MCkrODMzNj4+Ml09ODM1MjtnPShjWyhjWzIxMTBdfDApKyAtMTI+PjJdfDApKzg0NDR8MDtjW2c+PjJdPWNbZz4+Ml18ODE5MjtjWyhjWyhjWzIxMTBdfDApKyAtMTI+PjJdfDApKzg1MTI+PjJdPTgzNTI7Y1syMjk0XT0xMDcyODtYayg5MTgwfDApO2NbOTE4ND4+Ml09MDtjWzkxODg+PjJdPTA7Y1s5MTkyPj4yXT0wO2NbOTE5Nj4+Ml09MDtjWzkyMDA+PjJdPTA7Y1s5MjA0Pj4yXT0wO2NbMjI5NF09OTQ0ODtjWzkyMDg+PjJdPWY7Y1s5MjE2Pj4yXT05MDU2O2NbOTIyND4+Ml09LTE7YVs5MjI4Pj4wXT0wO2Y9Y1s5MTgwPj4yXXwwO2c9Zis0fDA7Y1tnPj4yXT0oY1tnPj4yXXwwKSsxO2lmKCEoKGNbMzM4Ml18MCk9PS0xKSl7Y1tkPj4yXT0xMzUyODtjW2QrND4+Ml09MjA4O2NbZCs4Pj4yXT0wO2NnKDEzNTI4LGQpfWs9KGNbMTM1MzI+PjJdfDApKyAtMXwwO2w9Y1tmKzg+PjJdfDA7aWYoKGNbZisxMj4+Ml18MCktbD4+Mj4+PjA+az4+PjA/KGU9Y1tsKyhrPDwyKT4+Ml18MCwoZXwwKSE9MCk6MCl7Y1s5MjEyPj4yXT1lO2NbOTIyMD4+Ml09b2NbY1soY1tlPj4yXXwwKSsyND4+Ml0mMTI3XShlKXwwO249Y1s5MjEyPj4yXXwwO2FbOTIyOT4+MF09KG9jW2NbKGNbbj4+Ml18MCkrMjg+PjJdJjEyN10obil8MCkmMTtpZigoY1s5MjIwPj4yXXwwKT44KXtvayg5NTQ0KX1uPWNbZz4+Ml18MDtjW2c+PjJdPW4rIC0xO2lmKChufDApPT0wKXtsY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZil9Y1syMTU0XT0xMDgzNjtjWzg2MjQ+PjJdPTEwODU2O2NbODYyMD4+Ml09MDtjWzg2NDg+PjJdPTkxNzY7Y1s4NjQwPj4yXT0wO2NbODY0ND4+Ml09MDtjWzg2Mjg+PjJdPTQwOTg7Y1s4NjM2Pj4yXT0wO2NbODYzMj4+Ml09NjtrPTg2NTZ8MDtsPWsrNDB8MDtkb3tjW2s+PjJdPTA7az1rKzR8MH13aGlsZSgoa3wwKTwobHwwKSk7WGsoODY1MnwwKTtjWzg2OTY+PjJdPTA7Y1s4NzAwPj4yXT0tMTtjWzIzMDhdPTEwNzI4O1hrKDkyMzZ8MCk7Y1s5MjQwPj4yXT0wO2NbOTI0ND4+Ml09MDtjWzkyNDg+PjJdPTA7Y1s5MjUyPj4yXT0wO2NbOTI1Nj4+Ml09MDtjWzkyNjA+PjJdPTA7Y1syMzA4XT05MzM2O2NbOTI2ND4+Ml09ajtlPWNbOTIzNj4+Ml18MDtmPWUrNHwwO2NbZj4+Ml09KGNbZj4+Ml18MCkrMTtpZighKChjWzMzODJdfDApPT0tMSkpe2NbZD4+Ml09MTM1Mjg7Y1tkKzQ+PjJdPTIwODtjW2QrOD4+Ml09MDtjZygxMzUyOCxkKX1nPShjWzEzNTMyPj4yXXwwKSsgLTF8MDtqPWNbZSs4Pj4yXXwwO2Rve2lmKChjW2UrMTI+PjJdfDApLWo+PjI+Pj4wPmc+Pj4wKXtnPWNbaisoZzw8Mik+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfW49Y1tmPj4yXXwwO2NbZj4+Ml09bisgLTE7aWYoKG58MCk9PTApe2xjW2NbKGNbZT4+Ml18MCkrOD4+Ml0mMjU1XShlKX1jWzkyNjg+PjJdPWc7Y1s5MjcyPj4yXT05MDY0O2FbOTI3Nj4+MF09KG9jW2NbKGNbZz4+Ml18MCkrMjg+PjJdJjEyN10oZyl8MCkmMTtjWzIxNzZdPTEwOTE2O2NbODcwOD4+Ml09MTA5MzY7Y1s4NzMyPj4yXT05MjMyO2NbODcyND4+Ml09MDtjWzg3Mjg+PjJdPTA7Y1s4NzEyPj4yXT00MDk4O2NbODcyMD4+Ml09MDtjWzg3MTY+PjJdPTY7az04NzQwfDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg3MzZ8MCk7Y1s4NzgwPj4yXT0wO2NbODc4ND4+Ml09LTE7Y1syMzIwXT0xMDcyODtYayg5Mjg0fDApO2NbOTI4OD4+Ml09MDtjWzkyOTI+PjJdPTA7Y1s5Mjk2Pj4yXT0wO2NbOTMwMD4+Ml09MDtjWzkzMDQ+PjJdPTA7Y1s5MzA4Pj4yXT0wO2NbMjMyMF09OTMzNjtjWzkzMTI+PjJdPWg7Zj1jWzkyODQ+PjJdfDA7ZT1mKzR8MDtjW2U+PjJdPShjW2U+PjJdfDApKzE7aWYoISgoY1szMzgyXXwwKT09LTEpKXtjW2Q+PjJdPTEzNTI4O2NbZCs0Pj4yXT0yMDg7Y1tkKzg+PjJdPTA7Y2coMTM1MjgsZCl9ZD0oY1sxMzUzMj4+Ml18MCkrIC0xfDA7Zz1jW2YrOD4+Ml18MDtkb3tpZigoY1tmKzEyPj4yXXwwKS1nPj4yPj4+MD5kPj4+MCl7ZD1jW2crKGQ8PDIpPj4yXXwwO2lmKChkfDApPT0wKXticmVha31uPWNbZT4+Ml18MDtjW2U+PjJdPW4rIC0xO2lmKChufDApIT0wKXtjWzkzMTY+PjJdPWQ7Y1s5MzIwPj4yXT05MDcyO2s9Y1tkPj4yXXwwO2s9aysyOHwwO2s9Y1trPj4yXXwwO2s9b2NbayYxMjddKGQpfDA7az1rJjE7YVs5MzI0Pj4wXT1rO2NbMjE5OF09MTA5MTY7Y1s4Nzk2Pj4yXT0xMDkzNjtjWzg4MjA+PjJdPTkyODA7Y1s4ODEyPj4yXT0wO2NbODgxNj4+Ml09MDtjWzg4MDA+PjJdPTQwOTg7Y1s4ODA4Pj4yXT0wO2NbODgwND4+Ml09NjtrPTg4Mjh8MDtsPWsrNDB8MDtkb3tjW2s+PjJdPTA7az1rKzR8MH13aGlsZSgoa3wwKTwobHwwKSk7WGsoODgyNHwwKTtjWzg4Njg+PjJdPTA7Y1s4ODcyPj4yXT0tMTtrPWNbMjE5OF18MDtrPWsrIC0xMnwwO2s9Y1trPj4yXXwwO2s9aysyNHwwO2s9ODc5MitrfDA7az1jW2s+PjJdfDA7Y1syMjIwXT0xMDkxNjtjWzg4ODQ+PjJdPTEwOTM2O2NbODkwOD4+Ml09aztrPShrfDApPT0wO2s9ayYxO2NbODkwMD4+Ml09aztjWzg5MDQ+PjJdPTA7Y1s4ODg4Pj4yXT00MDk4O2NbODg5Nj4+Ml09MDtjWzg4OTI+PjJdPTY7az04OTE2fDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg5MTJ8MCk7Y1s4OTU2Pj4yXT0wO2NbODk2MD4+Ml09LTE7bj1jWzIxNTRdfDA7bj1uKyAtMTJ8MDtuPWNbbj4+Ml18MDtuPW4rNzJ8MDtuPTg2MTYrbnwwO2Nbbj4+Ml09ODcwNDtuPWNbMjE5OF18MDtuPW4rIC0xMnwwO249Y1tuPj4yXXwwO249bis0fDA7bj04NzkyK258MDttPWNbbj4+Ml18MDttPW18ODE5MjtjW24+PjJdPW07bj1jWzIxOThdfDA7bj1uKyAtMTJ8MDtuPWNbbj4+Ml18MDtuPW4rNzJ8MDtuPTg3OTIrbnwwO2Nbbj4+Ml09ODcwNDtjYygyMTIsODk2OCxwfDApfDA7aT1iO3JldHVybn1sY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZik7Y1s5MzE2Pj4yXT1kO2NbOTMyMD4+Ml09OTA3MjtrPWNbZD4+Ml18MDtrPWsrMjh8MDtrPWNbaz4+Ml18MDtrPW9jW2smMTI3XShkKXwwO2s9ayYxO2FbOTMyND4+MF09aztjWzIxOThdPTEwOTE2O2NbODc5Nj4+Ml09MTA5MzY7Y1s4ODIwPj4yXT05MjgwO2NbODgxMj4+Ml09MDtjWzg4MTY+PjJdPTA7Y1s4ODAwPj4yXT00MDk4O2NbODgwOD4+Ml09MDtjWzg4MDQ+PjJdPTY7az04ODI4fDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg4MjR8MCk7Y1s4ODY4Pj4yXT0wO2NbODg3Mj4+Ml09LTE7az1jWzIxOThdfDA7az1rKyAtMTJ8MDtrPWNbaz4+Ml18MDtrPWsrMjR8MDtrPTg3OTIra3wwO2s9Y1trPj4yXXwwO2NbMjIyMF09MTA5MTY7Y1s4ODg0Pj4yXT0xMDkzNjtjWzg5MDg+PjJdPWs7az0oa3wwKT09MDtrPWsmMTtjWzg5MDA+PjJdPWs7Y1s4OTA0Pj4yXT0wO2NbODg4OD4+Ml09NDA5ODtjWzg4OTY+PjJdPTA7Y1s4ODkyPj4yXT02O2s9ODkxNnwwO2w9ays0MHwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChsfDApKTtYayg4OTEyfDApO2NbODk1Nj4+Ml09MDtjWzg5NjA+PjJdPS0xO249Y1syMTU0XXwwO249bisgLTEyfDA7bj1jW24+PjJdfDA7bj1uKzcyfDA7bj04NjE2K258MDtjW24+PjJdPTg3MDQ7bj1jWzIxOThdfDA7bj1uKyAtMTJ8MDtuPWNbbj4+Ml18MDtuPW4rNHwwO249ODc5MitufDA7bT1jW24+PjJdfDA7bT1tfDgxOTI7Y1tuPj4yXT1tO249Y1syMTk4XXwwO249bisgLTEyfDA7bj1jW24+PjJdfDA7bj1uKzcyfDA7bj04NzkyK258MDtjW24+PjJdPTg3MDQ7Y2MoMjEyLDg5NjgscHwwKXwwO2k9YjtyZXR1cm59fXdoaWxlKDApO249WGEoNCl8MDtjW24+PjJdPTIxMzA0O3diKG58MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtuPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBIZihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5MDQ7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWVsc2V7UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufX1mdW5jdGlvbiBJZihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5MDQ7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gSmYoYSl7YT1hfDA7cmV0dXJuIGNbYSs0Pj4yXXwwfWZ1bmN0aW9uIEtmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZWxzZXtSYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59fWZ1bmN0aW9uIExmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBNZihhKXthPWF8MDtyZXR1cm4gY1thKzQ+PjJdfDB9ZnVuY3Rpb24gTmYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTA0O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1lbHNle1JiKGF8MCk7dm4oYSk7aT1iO3JldHVybn19ZnVuY3Rpb24gT2YoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO2NbYT4+Ml09ZDtjW2ErND4+Ml09YjtyZXR1cm59ZnVuY3Rpb24gUGYoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wO2U9aTtpPWkrMTZ8MDtmPWU7cWNbY1soY1thPj4yXXwwKSsxMj4+Ml0mMzFdKGYsYSxiKTtpZigoY1tmKzQ+PjJdfDApIT0oY1tkKzQ+PjJdfDApKXthPTA7aT1lO3JldHVybiBhfDB9YT0oY1tmPj4yXXwwKT09KGNbZD4+Ml18MCk7aT1lO3JldHVybiBhfDB9ZnVuY3Rpb24gUWYoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTA7ZT1pO2lmKChjW2IrND4+Ml18MCkhPShhfDApKXthPTA7aT1lO3JldHVybiBhfDB9YT0oY1tiPj4yXXwwKT09KGR8MCk7aT1lO3JldHVybiBhfDB9ZnVuY3Rpb24gUmYoYSl7YT1hfDA7cmV0dXJuIDEwMDgwfWZ1bmN0aW9uIFNmKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wO2Q9aTtlPU5iKGV8MCl8MDtmPUpuKGV8MCl8MDtpZihmPj4+MD40Mjk0OTY3Mjc5KXtkZygpfWlmKGY+Pj4wPDExKXthW2I+PjBdPWY8PDE7aj1iKzF8MDtMbihqfDAsZXwwLGZ8MCl8MDtqPWorZnwwO2Fbaj4+MF09MDtpPWQ7cmV0dXJufWc9ZisxNiYtMTY7aD0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aj11bihoKXwwO2lmKChqfDApIT0wKXtoPTExO2JyZWFrfWo9Y1s1NjY2XXwwO2NbNTY2Nl09aiswO2lmKChqfDApPT0wKXtoPTk7YnJlYWt9c2NbaiYzMV0oKX1pZigoaHwwKT09OSl7aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9ZWxzZSBpZigoaHwwKT09MTEpe2NbYis4Pj4yXT1qO2NbYj4+Ml09Z3wxO2NbYis0Pj4yXT1mO0xuKGp8MCxlfDAsZnwwKXwwO2o9aitmfDA7YVtqPj4wXT0wO2k9ZDtyZXR1cm59fWZ1bmN0aW9uIFRmKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBVZihhKXthPWF8MDtyZXR1cm4gMTAxMDR9ZnVuY3Rpb24gVmYoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTA7ZD1pO2U9TmIoZXwwKXwwO2Y9Sm4oZXwwKXwwO2lmKGY+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9aWYoZj4+PjA8MTEpe2FbYj4+MF09Zjw8MTtqPWIrMXwwO0xuKGp8MCxlfDAsZnwwKXwwO2o9aitmfDA7YVtqPj4wXT0wO2k9ZDtyZXR1cm59Zz1mKzE2Ji0xNjtoPShnfDApPT0wPzE6Zzt3aGlsZSgxKXtqPXVuKGgpfDA7aWYoKGp8MCkhPTApe2g9MTE7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2g9OTticmVha31zY1tqJjMxXSgpfWlmKChofDApPT05KXtqPVhhKDQpfDA7Y1tqPj4yXT0yMjY4MDt3YihqfDAsMjI3MjgsMjA2KX1lbHNlIGlmKChofDApPT0xMSl7Y1tiKzg+PjJdPWo7Y1tiPj4yXT1nfDE7Y1tiKzQ+PjJdPWY7TG4oanwwLGV8MCxmfDApfDA7aj1qK2Z8MDthW2o+PjBdPTA7aT1kO3JldHVybn19ZnVuY3Rpb24gV2YoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Q9aTtpZigoYVsxMDA5Nl18MCk9PTA/KFFhKDEwMDk2KXwwKSE9MDowKXtjWzI1MjJdPTEwMjg4OyRhKDEwMDk2KX1jW2I+PjJdPWU7Y1tiKzQ+PjJdPTEwMDg4O2k9ZDtyZXR1cm59ZnVuY3Rpb24gWGYoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFlmKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wO2c9aTtpPWkrNDh8MDtvPWcrMjR8MDtsPWcrMTJ8MDtoPWc7cD1KbihmfDApfDA7aWYocD4+PjA+NDI5NDk2NzI3OSl7ZGcoKX1kb3tpZihwPj4+MDwxMSl7YVtoPj4wXT1wPDwxO209aDtxPWgrMXwwfWVsc2V7bT1wKzE2Ji0xNjtyPShtfDApPT0wPzE6bTt3aGlsZSgxKXtxPXVuKHIpfDA7aWYoKHF8MCkhPTApe2o9MTE7YnJlYWt9cT1jWzU2NjZdfDA7Y1s1NjY2XT1xKzA7aWYoKHF8MCk9PTApe2JyZWFrfXNjW3EmMzFdKCl9aWYoKGp8MCk9PTExKXtjW2grOD4+Ml09cTtjW2g+PjJdPW18MTtjW2grND4+Ml09cDttPWg7YnJlYWt9cj1YYSg0KXwwO2Nbcj4+Ml09MjI2ODA7d2IocnwwLDIyNzI4LDIwNil9fXdoaWxlKDApO0xuKHF8MCxmfDAscHwwKXwwO2FbcStwPj4wXT0wO2lmKChkfDApIT0wKXtwPWFbbT4+MF18MDtpZigocCYxKT09MCl7cD0ocCYyNTUpPj4+MX1lbHNle3A9Y1toKzQ+PjJdfDB9aWYoKHB8MCkhPTApe2pnKGgsMTAxMjgsMil9cWNbY1soY1tlPj4yXXwwKSsyND4+Ml0mMzFdKG8sZSxkKTtmPWFbbz4+MF18MDtpZigoZiYxKT09MCl7cD1vKzF8MDtmPShmJjI1NSk+Pj4xfWVsc2V7cD1jW28rOD4+Ml18MDtmPWNbbys0Pj4yXXwwfWpnKGgscCxmKTtpZighKChhW28+PjBdJjEpPT0wKT8obj1jW28rOD4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9fWNbbCswPj4yXT1jW20rMD4+Ml07Y1tsKzQ+PjJdPWNbbSs0Pj4yXTtjW2wrOD4+Ml09Y1ttKzg+PjJdO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2NbYj4+Ml09OTkyODtuPWIrNHwwO2lmKChhW2w+PjBdJjEpPT0wKXtmPWwrMXwwfWVsc2V7Zj1jW2wrOD4+Ml18MH1wPUpuKGZ8MCl8MDtvPXArMTN8MDtvPShvfDApPT0wPzE6bzt3aGlsZSgxKXtxPXVuKG8pfDA7aWYoKHF8MCkhPTApe2JyZWFrfXE9Y1s1NjY2XXwwO2NbNTY2Nl09cSswO2lmKChxfDApPT0wKXtqPTMzO2JyZWFrfXNjW3EmMzFdKCl9aWYoKGp8MCk9PTMzKXtyPVhhKDQpfDA7Y1tyPj4yXT0yMjY4MDt3YihyfDAsMjI3MjgsMjA2KX1jW3ErND4+Ml09cDtjW3E+PjJdPXA7cj1xKzEyfDA7Y1tuPj4yXT1yO2NbcSs4Pj4yXT0wO0xuKHJ8MCxmfDAscCsxfDApfDA7aWYoISgoYVtsPj4wXSYxKT09MCk/KGs9Y1tsKzg+PjJdfDAsKGt8MCkhPTApOjApe3ZuKGspfWlmKChhW20+PjBdJjEpPT0wKXtjW2I+PjJdPTEwMTQ0O3I9Yis4fDA7cT1lO2Y9cjtjW2Y+PjJdPWQ7cj1yKzR8MDtjW3I+PjJdPXE7aT1nO3JldHVybn1oPWNbaCs4Pj4yXXwwO2lmKChofDApPT0wKXtjW2I+PjJdPTEwMTQ0O3I9Yis4fDA7cT1lO2Y9cjtjW2Y+PjJdPWQ7cj1yKzR8MDtjW3I+PjJdPXE7aT1nO3JldHVybn12bihoKTtjW2I+PjJdPTEwMTQ0O3I9Yis4fDA7cT1lO2Y9cjtjW2Y+PjJdPWQ7cj1yKzR8MDtjW3I+PjJdPXE7aT1nO3JldHVybn1mdW5jdGlvbiBaZihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIF9mKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiAkZihhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBhZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn0KCgoKZnVuY3Rpb24gYmcoYSl7YT1hfDA7dmFyIGI9MDtiPWk7QmIoYXwwKXwwO2k9YjtyZXR1cm59ZnVuY3Rpb24gY2coYSxiKXthPWF8MDtiPWJ8MDt2YXIgZT0wLGY9MCxnPTA7ZT1pOyRiKDEwNTY4KXwwO2lmKChjW2E+PjJdfDApPT0xKXtkb3tHYSgxMDU5MiwxMDU2OCl8MH13aGlsZSgoY1thPj4yXXwwKT09MSl9aWYoKGNbYT4+Ml18MCkhPTApe0NiKDEwNTY4KXwwO2k9ZTtyZXR1cm59Y1thPj4yXT0xO0NiKDEwNTY4KXwwO2c9Yis0fDA7Zj1kW2c+PjBdfGRbZysxPj4wXTw8OHxkW2crMj4+MF08PDE2fGRbZyszPj4wXTw8MjQ7Zz1nKzR8MDtnPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNDtiPShjW2I+PjJdfDApKyhnPj4xKXwwO2lmKChnJjF8MCkhPTApe2Y9Y1soY1tiPj4yXXwwKStmPj4yXXwwfWxjW2YmMjU1XShiKTskYigxMDU2OCl8MDtjW2E+PjJdPS0xO0NiKDEwNTY4KXwwO0ViKDEwNTkyKXwwO2k9ZTtyZXR1cm59ZnVuY3Rpb24gZGcoKXt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9WGEoOCl8MDtjW2I+PjJdPTk5MDQ7d2hpbGUoMSl7ZT11bigyNSl8MDtpZigoZXwwKSE9MCl7ZD03O2JyZWFrfWU9Y1s1NjY2XXwwO2NbNTY2Nl09ZSswO2lmKChlfDApPT0wKXticmVha31zY1tlJjMxXSgpfWlmKChkfDApPT03KXtjW2UrND4+Ml09MTI7Y1tlPj4yXT0xMjtmPWUrMTJ8MDtjW2IrND4+Ml09ZjtjW2UrOD4+Ml09MDtmPWYrMHwwO2U9MTA2NDB8MDtkPWYrMTN8MDtkb3thW2Y+PjBdPWFbZT4+MF18MDtmPWYrMXwwO2U9ZSsxfDB9d2hpbGUoKGZ8MCk8KGR8MCkpO2NbYj4+Ml09OTk4NDt3YihifDAsMTAwMjQsMTA0KX1mPVhhKDQpfDA7Y1tmPj4yXT0yMjY4MDt3YihmfDAsMjI3MjgsMjA2KX1mdW5jdGlvbiBlZyhiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MDtmPWk7aWYoZT4+PjA+NDI5NDk2NzI3OSl7ZGcoKX1pZihlPj4+MDwxMSl7YVtiPj4wXT1lPDwxO2o9YisxfDA7TG4oanwwLGR8MCxlfDApfDA7aj1qK2V8MDthW2o+PjBdPTA7aT1mO3JldHVybn1nPWUrMTYmLTE2O2g9KGd8MCk9PTA/MTpnO3doaWxlKDEpe2o9dW4oaCl8MDtpZigoanwwKSE9MCl7aD0xMTticmVha31qPWNbNTY2Nl18MDtjWzU2NjZdPWorMDtpZigoanwwKT09MCl7aD05O2JyZWFrfXNjW2omMzFdKCl9aWYoKGh8MCk9PTkpe2o9WGEoNCl8MDtjW2o+PjJdPTIyNjgwO3diKGp8MCwyMjcyOCwyMDYpfWVsc2UgaWYoKGh8MCk9PTExKXtjW2IrOD4+Ml09ajtjW2I+PjJdPWd8MTtjW2IrND4+Ml09ZTtMbihqfDAsZHwwLGV8MCl8MDtqPWorZXwwO2Fbaj4+MF09MDtpPWY7cmV0dXJufX1mdW5jdGlvbiBmZyhiKXtiPWJ8MDt2YXIgZD0wLGU9MDtkPWk7aWYoISgoYVtiPj4wXSYxKT09MCk/KGU9Y1tiKzg+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWk9ZDtyZXR1cm59ZnVuY3Rpb24gZ2coYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MDtmPWk7ZT1KbihkfDApfDA7aD1hW2I+PjBdfDA7aWYoKGgmMSk9PTApe2c9MTB9ZWxzZXtnPWNbYj4+Ml18MDtoPWcmMjU1O2c9KGcmLTIpKyAtMXwwfWo9KGgmMSk9PTA7aWYoZz4+PjA8ZT4+PjApe2lmKGope2g9KGgmMjU1KT4+PjF9ZWxzZXtoPWNbYis0Pj4yXXwwfWtnKGIsZyxlLWd8MCxoLDAsaCxlLGQpO2k9ZjtyZXR1cm59aWYoail7Zz1iKzF8MH1lbHNle2c9Y1tiKzg+PjJdfDB9TW4oZ3wwLGR8MCxlfDApfDA7YVtnK2U+PjBdPTA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09ZTw8MTtpPWY7cmV0dXJufWVsc2V7Y1tiKzQ+PjJdPWU7aT1mO3JldHVybn19ZnVuY3Rpb24gaGcoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wO2U9aTtpZigoZHwwKT09MCl7aT1lO3JldHVybn1oPWFbYj4+MF18MDtpZigoaCYxKT09MCl7Zz0xMH1lbHNle2g9Y1tiPj4yXXwwO2c9KGgmLTIpKyAtMXwwO2g9aCYyNTV9aWYoKGgmMSk9PTApe2Y9KGgmMjU1KT4+PjF9ZWxzZXtmPWNbYis0Pj4yXXwwfWlmKChnLWZ8MCk+Pj4wPGQ+Pj4wKXtsZyhiLGcsZC1nK2Z8MCxmLGYsMCk7aD1hW2I+PjBdfDB9aWYoKGgmMSk9PTApe2c9YisxfDB9ZWxzZXtnPWNbYis4Pj4yXXwwfU5uKGcrZnwwLDAsZHwwKXwwO2Q9ZitkfDA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09ZDw8MX1lbHNle2NbYis0Pj4yXT1kfWFbZytkPj4wXT0wO2k9ZTtyZXR1cm59ZnVuY3Rpb24gaWcoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7ZD1pO2g9YVtiPj4wXXwwO2lmKChoJjEpPT0wKXtsPTEwfWVsc2V7aD1jW2I+PjJdfDA7bD0oaCYtMikrIC0xfDA7aD1oJjI1NX1qPShoJjEpPT0wO2lmKGope2Y9KGgmMjU1KT4+PjF9ZWxzZXtmPWNbYis0Pj4yXXwwfWlmKGY+Pj4wPDExKXtlPTEwfWVsc2V7ZT0oZisxNiYtMTYpKyAtMXwwfWlmKChlfDApPT0obHwwKSl7aT1kO3JldHVybn1kb3tpZigoZXwwKT09MTApe2s9YisxfDA7Zz1jW2IrOD4+Ml18MDtpZihqKXtMbihrfDAsZ3wwLCgoaCYyNTUpPj4+MSkrMXwwKXwwO2g9aztrPTA7aj1nO2c9Mjd9ZWxzZXtoPWs7az0wO2o9ZztnPTI1fX1lbHNle2s9ZSsxfDA7az0oa3wwKT09MD8xOms7YTpkb3tpZihlPj4+MD5sPj4+MCl7d2hpbGUoMSl7bD11bihrKXwwO2lmKChsfDApIT0wKXticmVhayBhfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXticmVha31zY1tsJjMxXSgpfWw9WGEoNCl8MDtjW2w+PjJdPTIyNjgwO3diKGx8MCwyMjcyOCwyMDYpfWVsc2V7d2hpbGUoMSl7bD11bihrKXwwO2lmKChsfDApIT0wKXticmVhayBhfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXticmVha31zY1tsJjMxXSgpfWw9WGEoNCl8MDtjW2w+PjJdPTIyNjgwO3diKGx8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihqKXtMbihsfDAsYisxfDAsKChoJjI1NSk+Pj4xKSsxfDApfDA7aD1sO2JyZWFrfWVsc2V7aD1sO2s9MTtqPWNbYis4Pj4yXXwwO2c9MjU7YnJlYWt9fX13aGlsZSgwKTtpZigoZ3wwKT09MjUpe0xuKGh8MCxqfDAsKGNbYis0Pj4yXXwwKSsxfDApfDA7Zz0yN31kb3tpZigoZ3wwKT09Mjcpe2lmKChqfDApPT0wKXtpZihrKXticmVha319ZWxzZXt2bihqKTtpZihrKXticmVha319YVtiPj4wXT1mPDwxO2k9ZDtyZXR1cm59fXdoaWxlKDApO2NbYj4+Ml09ZSsxfDE7Y1tiKzQ+PjJdPWY7Y1tiKzg+PjJdPWg7aT1kO3JldHVybn1mdW5jdGlvbiBqZyhiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MDtmPWk7aj1hW2I+PjBdfDA7aWYoKGomMSk9PTApe2c9MTB9ZWxzZXtqPWNbYj4+Ml18MDtnPShqJi0yKSsgLTF8MDtqPWomMjU1fWg9KGomMSk9PTA7aWYoaCl7aj0oaiYyNTUpPj4+MX1lbHNle2o9Y1tiKzQ+PjJdfDB9aWYoKGctanwwKT4+PjA8ZT4+PjApe2tnKGIsZyxlLWcranwwLGosaiwwLGUsZCk7aT1mO3JldHVybn1pZigoZXwwKT09MCl7aT1mO3JldHVybn1pZihoKXtnPWIrMXwwfWVsc2V7Zz1jW2IrOD4+Ml18MH1MbihnK2p8MCxkfDAsZXwwKXwwO2U9aitlfDA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09ZTw8MX1lbHNle2NbYis0Pj4yXT1lfWFbZytlPj4wXT0wO2k9ZjtyZXR1cm59ZnVuY3Rpb24ga2coYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MDtsPWk7aWYoKC0xOC1kfDApPj4+MDxlPj4+MCl7ZGcoKX1pZigoYVtiPj4wXSYxKT09MCl7bT1iKzF8MH1lbHNle209Y1tiKzg+PjJdfDB9aWYoZD4+PjA8MjE0NzQ4MzYyMyl7ZT1lK2R8MDtwPWQ8PDE7ZT1lPj4+MDxwPj4+MD9wOmU7aWYoZT4+PjA8MTEpe2U9MTF9ZWxzZXtlPWUrMTYmLTE2fX1lbHNle2U9LTE3fW89KGV8MCk9PTA/MTplO3doaWxlKDEpe3A9dW4obyl8MDtpZigocHwwKSE9MCl7YnJlYWt9cD1jWzU2NjZdfDA7Y1s1NjY2XT1wKzA7aWYoKHB8MCk9PTApe249MTM7YnJlYWt9c2NbcCYzMV0oKX1pZigobnwwKT09MTMpe3A9WGEoNCl8MDtjW3A+PjJdPTIyNjgwO3diKHB8MCwyMjcyOCwyMDYpfWlmKChnfDApIT0wKXtMbihwfDAsbXwwLGd8MCl8MH1pZigoanwwKSE9MCl7TG4ocCtnfDAsa3wwLGp8MCl8MH1uPWYtaHwwO2lmKChufDApIT0oZ3wwKSl7TG4ocCsoaitnKXwwLG0rKGgrZyl8MCxuLWd8MCl8MH1pZigoZHwwKT09MTB8KG18MCk9PTApe289Yis4fDA7Y1tvPj4yXT1wO289ZXwxO2NbYj4+Ml09bztvPW4ranwwO2U9Yis0fDA7Y1tlPj4yXT1vO3A9cCtvfDA7YVtwPj4wXT0wO2k9bDtyZXR1cm59dm4obSk7bz1iKzh8MDtjW28+PjJdPXA7bz1lfDE7Y1tiPj4yXT1vO289bitqfDA7ZT1iKzR8MDtjW2U+PjJdPW87cD1wK298MDthW3A+PjBdPTA7aT1sO3JldHVybn1mdW5jdGlvbiBsZyhiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTA7bD1pO2lmKCgtMTctZHwwKT4+PjA8ZT4+PjApe2RnKCl9aWYoKGFbYj4+MF0mMSk9PTApe2s9YisxfDB9ZWxzZXtrPWNbYis4Pj4yXXwwfWlmKGQ+Pj4wPDIxNDc0ODM2MjMpe2U9ZStkfDA7bj1kPDwxO2U9ZT4+PjA8bj4+PjA/bjplO2lmKGU+Pj4wPDExKXtlPTExfWVsc2V7ZT1lKzE2Ji0xNn19ZWxzZXtlPS0xN31tPShlfDApPT0wPzE6ZTt3aGlsZSgxKXtuPXVuKG0pfDA7aWYoKG58MCkhPTApe2JyZWFrfW49Y1s1NjY2XXwwO2NbNTY2Nl09biswO2lmKChufDApPT0wKXtqPTEzO2JyZWFrfXNjW24mMzFdKCl9aWYoKGp8MCk9PTEzKXtuPVhhKDQpfDA7Y1tuPj4yXT0yMjY4MDt3YihufDAsMjI3MjgsMjA2KX1pZigoZ3wwKSE9MCl7TG4obnwwLGt8MCxnfDApfDB9aWYoKGZ8MCkhPShnfDApKXtMbihuKyhoK2cpfDAsaytnfDAsZi1nfDApfDB9aWYoKGR8MCk9PTEwfChrfDApPT0wKXttPWIrOHwwO2NbbT4+Ml09bjtuPWV8MTtjW2I+PjJdPW47aT1sO3JldHVybn12bihrKTttPWIrOHwwO2NbbT4+Ml09bjtuPWV8MTtjW2I+PjJdPW47aT1sO3JldHVybn1mdW5jdGlvbiBtZyhiKXtiPWJ8MDt2YXIgZD0wLGU9MDtkPWk7aWYoISgoYVtiPj4wXSYxKT09MCk/KGU9Y1tiKzg+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWk9ZDtyZXR1cm59ZnVuY3Rpb24gbmcoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtlPWk7Zj1kO3doaWxlKDEpe2lmKChjW2Y+PjJdfDApPT0wKXticmVha31lbHNle2Y9Zis0fDB9fWs9ZDtqPWYta3wwO2Y9aj4+MjtsPWFbYj4+MF18MDtpZigobCYxKT09MCl7Zz0xfWVsc2V7bD1jW2I+PjJdfDA7Zz0obCYtMikrIC0xfDA7bD1sJjI1NX1pZighKGc+Pj4wPGY+Pj4wKSl7aWYoKGwmMSk9PTApe2c9Yis0fDB9ZWxzZXtnPWNbYis4Pj4yXXwwfWg9KGZ8MCk9PTA7aWYoZy1rPj4yPj4+MDxmPj4+MCl7aWYoIWgpe2g9Zjtkb3toPWgrIC0xfDA7Y1tnKyhoPDwyKT4+Ml09Y1tkKyhoPDwyKT4+Ml19d2hpbGUoKGh8MCkhPTApfX1lbHNle2lmKCFoKXtoPWc7az1mO3doaWxlKDEpe2s9aysgLTF8MDtjW2g+PjJdPWNbZD4+Ml07aWYoKGt8MCk9PTApe2JyZWFrfWVsc2V7ZD1kKzR8MDtoPWgrNHwwfX19fWNbZysoZjw8Mik+PjJdPTA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09aj4+PjE7aT1lO3JldHVybn1lbHNle2NbYis0Pj4yXT1mO2k9ZTtyZXR1cm59fWlmKCgxMDczNzQxODA2LWd8MCk+Pj4wPChmLWd8MCk+Pj4wKXtkZygpfWlmKChsJjEpPT0wKXtqPWIrNHwwfWVsc2V7aj1jW2IrOD4+Ml18MH1pZihnPj4+MDw1MzY4NzA4ODcpe2s9Zzw8MTtrPWY+Pj4wPGs+Pj4wP2s6ZjtpZihrPj4+MDwyKXtrPTJ9ZWxzZXtrPWsrNCYtNH19ZWxzZXtrPTEwNzM3NDE4MDd9bT1rPDwyO209KG18MCk9PTA/MTptO3doaWxlKDEpe2w9dW4obSl8MDtpZigobHwwKSE9MCl7YnJlYWt9bD1jWzU2NjZdfDA7Y1s1NjY2XT1sKzA7aWYoKGx8MCk9PTApe2g9Mjk7YnJlYWt9c2NbbCYzMV0oKX1pZigoaHwwKT09Mjkpe209WGEoNCl8MDtjW20+PjJdPTIyNjgwO3diKG18MCwyMjcyOCwyMDYpfWlmKChmfDApIT0wKXtoPWY7bT1sO3doaWxlKDEpe2g9aCsgLTF8MDtjW20+PjJdPWNbZD4+Ml07aWYoKGh8MCk9PTApe2JyZWFrfWVsc2V7ZD1kKzR8MDttPW0rNHwwfX19aWYoISgoZ3wwKT09MXwoanwwKT09MCkpe3ZuKGopfWNbYis4Pj4yXT1sO2NbYj4+Ml09a3wxO2NbYis0Pj4yXT1mO2NbbCsoZjw8Mik+PjJdPTA7aT1lO3JldHVybn1mdW5jdGlvbiBvZyhiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2Q9aTtnPWFbYj4+MF18MDtpZigoZyYxKT09MCl7az0xfWVsc2V7Zz1jW2I+PjJdfDA7az0oZyYtMikrIC0xfDA7Zz1nJjI1NX1oPShnJjEpPT0wO2lmKGgpe2Y9KGcmMjU1KT4+PjF9ZWxzZXtmPWNbYis0Pj4yXXwwfWlmKGY+Pj4wPDIpe2U9MX1lbHNle2U9KGYrNCYtNCkrIC0xfDB9aWYoKGV8MCk9PShrfDApKXtpPWQ7cmV0dXJufWRve2lmKChlfDApPT0xKXtuPWIrNHwwO2w9Y1tiKzg+PjJdfDA7aWYoaCl7aj0wO209MTtoPTI2fWVsc2V7Zz1uO2o9MDttPTE7aD0yNX19ZWxzZXtqPShlPDwyKSs0fDA7aj0oanwwKT09MD8xOmo7YTpkb3tpZihlPj4+MD5rPj4+MCl7d2hpbGUoMSl7bj11bihqKXwwO2lmKChufDApIT0wKXticmVhayBhfWs9Y1s1NjY2XXwwO2NbNTY2Nl09ayswO2lmKChrfDApPT0wKXticmVha31zY1trJjMxXSgpfW49WGEoNCl8MDtjW24+PjJdPTIyNjgwO3diKG58MCwyMjcyOCwyMDYpfWVsc2V7d2hpbGUoMSl7bj11bihqKXwwO2lmKChufDApIT0wKXticmVhayBhfWs9Y1s1NjY2XXwwO2NbNTY2Nl09ayswO2lmKChrfDApPT0wKXticmVha31zY1trJjMxXSgpfW49WGEoNCl8MDtjW24+PjJdPTIyNjgwO3diKG58MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihoKXtqPTE7bD1iKzR8MDttPTA7aD0yNjticmVha31lbHNle2c9bjtqPTE7bD1jW2IrOD4+Ml18MDttPTE7aD0yNTticmVha319fXdoaWxlKDApO2lmKChofDApPT0yNSl7az1jW2IrND4+Ml18MH1lbHNlIGlmKChofDApPT0yNil7az0oZyYyNTUpPj4+MTtnPW59az1rKzF8MDtpZigoa3wwKSE9MCl7bj1sO2g9Zzt3aGlsZSgxKXtrPWsrIC0xfDA7Y1toPj4yXT1jW24+PjJdO2lmKChrfDApPT0wKXticmVha31lbHNle249bis0fDA7aD1oKzR8MH19fWlmKCEobV4xfChsfDApPT0wKSl7dm4obCl9aWYoail7Y1tiPj4yXT1lKzF8MTtjW2IrND4+Ml09ZjtjW2IrOD4+Ml09ZztpPWQ7cmV0dXJufWVsc2V7YVtiPj4wXT1mPDwxO2k9ZDtyZXR1cm59fWZ1bmN0aW9uIHBnKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MDtrPWk7aWYoKDEwNzM3NDE4MDctZHwwKT4+PjA8ZT4+PjApe2RnKCl9aWYoKGFbYj4+MF0mMSk9PTApe2w9Yis0fDB9ZWxzZXtsPWNbYis4Pj4yXXwwfWlmKGQ+Pj4wPDUzNjg3MDg4Nyl7ZT1lK2R8MDtwPWQ8PDE7ZT1lPj4+MDxwPj4+MD9wOmU7aWYoZT4+PjA8Mil7ZT0yfWVsc2V7ZT1lKzQmLTR9fWVsc2V7ZT0xMDczNzQxODA3fW89ZTw8MjtvPShvfDApPT0wPzE6bzt3aGlsZSgxKXttPXVuKG8pfDA7aWYoKG18MCkhPTApe2JyZWFrfW09Y1s1NjY2XXwwO2NbNTY2Nl09bSswO2lmKChtfDApPT0wKXtuPTEzO2JyZWFrfXNjW20mMzFdKCl9aWYoKG58MCk9PTEzKXtwPVhhKDQpfDA7Y1twPj4yXT0yMjY4MDt3YihwfDAsMjI3MjgsMjA2KX1pZigoZ3wwKSE9MCl7bz1nO249bDtwPW07d2hpbGUoMSl7bz1vKyAtMXwwO2NbcD4+Ml09Y1tuPj4yXTtpZigob3wwKT09MCl7YnJlYWt9ZWxzZXtuPW4rNHwwO3A9cCs0fDB9fX1mPWYtaHwwO2lmKChmfDApIT0oZ3wwKSl7Zj1mLWd8MDtoPWwrKGgrZzw8Mil8MDtnPW0rKGorZzw8Mil8MDt3aGlsZSgxKXtmPWYrIC0xfDA7Y1tnPj4yXT1jW2g+PjJdO2lmKChmfDApPT0wKXticmVha31lbHNle2g9aCs0fDA7Zz1nKzR8MH19fWlmKChkfDApPT0xfChsfDApPT0wKXtwPWIrOHwwO2NbcD4+Ml09bTtwPWV8MTtjW2I+PjJdPXA7aT1rO3JldHVybn12bihsKTtwPWIrOHwwO2NbcD4+Ml09bTtwPWV8MTtjW2I+PjJdPXA7aT1rO3JldHVybn1mdW5jdGlvbiBxZyhiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTA7ZT0oY1tiKzI0Pj4yXXwwKT09MDtpZihlKXtjW2IrMTY+PjJdPWR8MX1lbHNle2NbYisxNj4+Ml09ZH1pZigoKGUmMXxkKSZjW2IrMjA+PjJdfDApPT0wKXtyZXR1cm59ZD1YYSgxNil8MDtpZigoYVsxMTAwOF18MCk9PTA/KFFhKDExMDA4KXwwKSE9MDowKXtjWzI3NTBdPTExNzg0OyRhKDExMDA4KX1ZZihkLDEsMTFlMywxMTA1Nik7Y1tkPj4yXT0xMTAyNDt3YihkfDAsMTExMDQsMTMxKX1mdW5jdGlvbiByZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTA7ZT1pO2NbYT4+Ml09MTEwNDg7Zj1jW2ErNDA+PjJdfDA7Yj1hKzMyfDA7ZD1hKzM2fDA7aWYoKGZ8MCkhPTApe2Rve2Y9ZisgLTF8MDtxY1tjWyhjW2I+PjJdfDApKyhmPDwyKT4+Ml0mMzFdKDAsYSxjWyhjW2Q+PjJdfDApKyhmPDwyKT4+Ml18MCl9d2hpbGUoKGZ8MCkhPTApfWY9Y1thKzI4Pj4yXXwwO2g9Zis0fDA7Zz1jW2g+PjJdfDA7Y1toPj4yXT1nKyAtMTtpZigoZ3wwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfXZuKGNbYj4+Ml18MCk7dm4oY1tkPj4yXXwwKTt2bihjW2ErNDg+PjJdfDApO3ZuKGNbYSs2MD4+Ml18MCk7aT1lO3JldHVybn1mdW5jdGlvbiBzZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTEwNjY0O2Q9Y1thKzQ+PjJdfDA7Zj1kKzR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlfDApIT0wKXt2bihhKTtpPWI7cmV0dXJufWxjW2NbKGNbZD4+Ml18MCkrOD4+Ml0mMjU1XShkKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHRnKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MDtiPWk7Y1thPj4yXT0xMDY2NDthPWNbYSs0Pj4yXXwwO2U9YSs0fDA7ZD1jW2U+PjJdfDA7Y1tlPj4yXT1kKyAtMTtpZigoZHwwKSE9MCl7aT1iO3JldHVybn1sY1tjWyhjW2E+PjJdfDApKzg+PjJdJjI1NV0oYSk7aT1iO3JldHVybn1mdW5jdGlvbiB1ZyhhLGIpe2E9YXwwO2I9YnwwO3JldHVybn1mdW5jdGlvbiB2ZyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGF8MH1mdW5jdGlvbiB3ZyhhLGIsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7Zz1hO2NbZz4+Ml09MDtjW2crND4+Ml09MDtnPWErOHwwO2NbZz4+Ml09LTE7Y1tnKzQ+PjJdPS0xO3JldHVybn1mdW5jdGlvbiB4ZyhhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtlPWE7Y1tlPj4yXT0wO2NbZSs0Pj4yXT0wO2U9YSs4fDA7Y1tlPj4yXT0tMTtjW2UrND4+Ml09LTE7cmV0dXJufWZ1bmN0aW9uIHlnKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIHpnKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIEFnKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MDtmPWk7aWYoKGV8MCk8PTApe2s9MDtpPWY7cmV0dXJuIGt8MH1nPWIrMTJ8MDtoPWIrMTZ8MDtqPTA7d2hpbGUoMSl7az1jW2c+PjJdfDA7aWYoaz4+PjA8KGNbaD4+Ml18MCk+Pj4wKXtjW2c+PjJdPWsrMTtrPWFbaz4+MF18MH1lbHNle2s9b2NbY1soY1tiPj4yXXwwKSs0MD4+Ml0mMTI3XShiKXwwO2lmKChrfDApPT0tMSl7ZT04O2JyZWFrfWs9ayYyNTV9YVtkPj4wXT1rO2o9aisxfDA7aWYoKGp8MCk8KGV8MCkpe2Q9ZCsxfDB9ZWxzZXtlPTg7YnJlYWt9fWlmKChlfDApPT04KXtpPWY7cmV0dXJuIGp8MH1yZXR1cm4gMH1mdW5jdGlvbiBCZyhhKXthPWF8MDtyZXR1cm4tMX1mdW5jdGlvbiBDZyhhKXthPWF8MDt2YXIgYj0wLGU9MDtiPWk7aWYoKG9jW2NbKGNbYT4+Ml18MCkrMzY+PjJdJjEyN10oYSl8MCk9PS0xKXthPS0xO2k9YjtyZXR1cm4gYXwwfWU9YSsxMnwwO2E9Y1tlPj4yXXwwO2NbZT4+Ml09YSsxO2E9ZFthPj4wXXwwO2k9YjtyZXR1cm4gYXwwfWZ1bmN0aW9uIERnKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuLTF9ZnVuY3Rpb24gRWcoYixlLGYpe2I9YnwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtnPWk7aWYoKGZ8MCk8PTApe2w9MDtpPWc7cmV0dXJuIGx8MH1qPWIrMjR8MDtoPWIrMjh8MDtrPTA7d2hpbGUoMSl7bD1jW2o+PjJdfDA7aWYoIShsPj4+MDwoY1toPj4yXXwwKT4+PjApKXtpZigoeGNbY1soY1tiPj4yXXwwKSs1Mj4+Ml0mNjNdKGIsZFtlPj4wXXwwKXwwKT09LTEpe2g9NzticmVha319ZWxzZXttPWFbZT4+MF18MDtjW2o+PjJdPWwrMTthW2w+PjBdPW19az1rKzF8MDtpZigoa3wwKTwoZnwwKSl7ZT1lKzF8MH1lbHNle2g9NzticmVha319aWYoKGh8MCk9PTcpe2k9ZztyZXR1cm4ga3wwfXJldHVybiAwfWZ1bmN0aW9uIEZnKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuLTF9ZnVuY3Rpb24gR2coYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT0xMDcyODtkPWNbYSs0Pj4yXXwwO2Y9ZCs0fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZXwwKSE9MCl7dm4oYSk7aT1iO3JldHVybn1sY1tjWyhjW2Q+PjJdfDApKzg+PjJdJjI1NV0oZCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBIZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2NbYT4+Ml09MTA3Mjg7YT1jW2ErND4+Ml18MDtlPWErNHwwO2Q9Y1tlPj4yXXwwO2NbZT4+Ml09ZCsgLTE7aWYoKGR8MCkhPTApe2k9YjtyZXR1cm59bGNbY1soY1thPj4yXXwwKSs4Pj4yXSYyNTVdKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gSWcoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm59ZnVuY3Rpb24gSmcoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBhfDB9ZnVuY3Rpb24gS2coYSxiLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2c9YTtjW2c+PjJdPTA7Y1tnKzQ+PjJdPTA7Zz1hKzh8MDtjW2c+PjJdPS0xO2NbZys0Pj4yXT0tMTtyZXR1cm59ZnVuY3Rpb24gTGcoYSxiLGQsZSl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7ZT1hO2NbZT4+Ml09MDtjW2UrND4+Ml09MDtlPWErOHwwO2NbZT4+Ml09LTE7Y1tlKzQ+PjJdPS0xO3JldHVybn1mdW5jdGlvbiBNZyhhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBOZyhhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBPZyhhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTA7ZT1pO2lmKChkfDApPD0wKXtqPTA7aT1lO3JldHVybiBqfDB9Zz1hKzEyfDA7Zj1hKzE2fDA7aD0wO3doaWxlKDEpe2o9Y1tnPj4yXXwwO2lmKCEoaj4+PjA8KGNbZj4+Ml18MCk+Pj4wKSl7aj1vY1tjWyhjW2E+PjJdfDApKzQwPj4yXSYxMjddKGEpfDA7aWYoKGp8MCk9PS0xKXthPTg7YnJlYWt9fWVsc2V7Y1tnPj4yXT1qKzQ7aj1jW2o+PjJdfDB9Y1tiPj4yXT1qO2g9aCsxfDA7aWYoKGh8MCk+PShkfDApKXthPTg7YnJlYWt9Yj1iKzR8MH1pZigoYXwwKT09OCl7aT1lO3JldHVybiBofDB9cmV0dXJuIDB9ZnVuY3Rpb24gUGcoYSl7YT1hfDA7cmV0dXJuLTF9ZnVuY3Rpb24gUWcoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1pO2lmKChvY1tjWyhjW2E+PjJdfDApKzM2Pj4yXSYxMjddKGEpfDApPT0tMSl7YT0tMTtpPWI7cmV0dXJuIGF8MH1kPWErMTJ8MDthPWNbZD4+Ml18MDtjW2Q+PjJdPWErNDthPWNbYT4+Ml18MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBSZyhhLGIpe2E9YXwwO2I9YnwwO3JldHVybi0xfWZ1bmN0aW9uIFNnKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTA7ZT1pO2lmKChkfDApPD0wKXtqPTA7aT1lO3JldHVybiBqfDB9Zz1hKzI0fDA7Zj1hKzI4fDA7aD0wO3doaWxlKDEpe2o9Y1tnPj4yXXwwO2lmKCEoaj4+PjA8KGNbZj4+Ml18MCk+Pj4wKSl7aWYoKHhjW2NbKGNbYT4+Ml18MCkrNTI+PjJdJjYzXShhLGNbYj4+Ml18MCl8MCk9PS0xKXtmPTg7YnJlYWt9fWVsc2V7az1jW2I+PjJdfDA7Y1tnPj4yXT1qKzQ7Y1tqPj4yXT1rfWg9aCsxfDA7aWYoKGh8MCk+PShkfDApKXtmPTg7YnJlYWt9Yj1iKzR8MH1pZigoZnwwKT09OCl7aT1lO3JldHVybiBofDB9cmV0dXJuIDB9ZnVuY3Rpb24gVGcoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4tMX1mdW5jdGlvbiBVZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBWZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBXZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2U9Y1soY1thPj4yXXwwKSsgLTEyPj4yXXwwO2Q9YStlfDA7cmcoYSsoZSs4KXwwKTtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFhnKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErKChjWyhjW2E+PjJdfDApKyAtMTI+PjJdfDApKzgpfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gWWcoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7aT1pKzE2fDA7ZT1kO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2lmKChjW2IrKGYrMjQpPj4yXXwwKT09MCl7aT1kO3JldHVybn1hW2U+PjBdPTA7Y1tlKzQ+PjJdPWI7aWYoKGNbYisoZisxNik+PjJdfDApPT0wKXtnPWNbYisoZis3Mik+PjJdfDA7aWYoKGd8MCkhPTApe1lnKGcpO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwfWFbZT4+MF09MTtnPWNbYisoZisyNCk+PjJdfDA7aWYoKG9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MCk9PS0xKXtnPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK2d8MCxjW2IrKGcrMTYpPj4yXXwxKX19Z2goZSk7aT1kO3JldHVybn1mdW5jdGlvbiBaZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBfZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aT1iO3JldHVybn1mdW5jdGlvbiAkZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2U9Y1soY1thPj4yXXwwKSsgLTEyPj4yXXwwO2Q9YStlfDA7cmcoYSsoZSs4KXwwKTtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGFoKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErKChjWyhjW2E+PjJdfDApKyAtMTI+PjJdfDApKzgpfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gYmgoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7aT1pKzE2fDA7ZT1kO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2lmKChjW2IrKGYrMjQpPj4yXXwwKT09MCl7aT1kO3JldHVybn1hW2U+PjBdPTA7Y1tlKzQ+PjJdPWI7aWYoKGNbYisoZisxNik+PjJdfDApPT0wKXtnPWNbYisoZis3Mik+PjJdfDA7aWYoKGd8MCkhPTApe2JoKGcpO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwfWFbZT4+MF09MTtnPWNbYisoZisyNCk+PjJdfDA7aWYoKG9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MCk9PS0xKXtnPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK2d8MCxjW2IrKGcrMTYpPj4yXXwxKX19cWgoZSk7aT1kO3JldHVybn1mdW5jdGlvbiBjaChhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzR8MCk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBkaChhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzR8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBlaChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2U9Y1soY1thPj4yXXwwKSsgLTEyPj4yXXwwO2Q9YStlfDA7cmcoYSsoZSs0KXwwKTtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGZoKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErKChjWyhjW2E+PjJdfDApKyAtMTI+PjJdfDApKzQpfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gZ2goYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTthPWErNHwwO2Q9Y1thPj4yXXwwO2U9Y1soY1tkPj4yXXwwKSsgLTEyPj4yXXwwO2lmKChjW2QrKGUrMjQpPj4yXXwwKT09MCl7aT1iO3JldHVybn1pZigoY1tkKyhlKzE2KT4+Ml18MCkhPTApe2k9YjtyZXR1cm59aWYoKGNbZCsoZSs0KT4+Ml0mODE5MnwwKT09MCl7aT1iO3JldHVybn1pZihZYSgpfDApe2k9YjtyZXR1cm59ZT1jW2E+PjJdfDA7ZT1jW2UrKChjWyhjW2U+PjJdfDApKyAtMTI+PjJdfDApKzI0KT4+Ml18MDtpZighKChvY1tjWyhjW2U+PjJdfDApKzI0Pj4yXSYxMjddKGUpfDApPT0tMSkpe2k9YjtyZXR1cm59ZD1jW2E+PjJdfDA7ZT1jWyhjW2Q+PjJdfDApKyAtMTI+PjJdfDA7cWcoZCtlfDAsY1tkKyhlKzE2KT4+Ml18MSk7aT1iO3JldHVybn1mdW5jdGlvbiBoaChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2g9aTtpPWkrMzJ8MDtrPWg7aj1oKzI0fDA7Zz1oKzE2fDA7Zj1oKzEyfDA7YVtnPj4wXT0wO2NbZys0Pj4yXT1iO249Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2IrKG4rMTYpPj4yXXwwKT09MCl7bT1jW2IrKG4rNzIpPj4yXXwwO2lmKChtfDApIT0wKXtZZyhtKTtuPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MH1hW2c+PjBdPTE7bz1jW2IrKG4rMjgpPj4yXXwwO3A9bys0fDA7Y1twPj4yXT0oY1twPj4yXXwwKSsxO2lmKCEoKGNbMzA0OF18MCk9PS0xKSl7Y1trPj4yXT0xMjE5MjtjW2srND4+Ml09MjA4O2Nbays4Pj4yXT0wO2NnKDEyMTkyLGspfW49KGNbMTIxOTY+PjJdfDApKyAtMXwwO209Y1tvKzg+PjJdfDA7aWYoKGNbbysxMj4+Ml18MCktbT4+Mj4+PjA+bj4+PjA/KGU9Y1ttKyhuPDwyKT4+Ml18MCwoZXwwKSE9MCk6MCl7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfXE9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO209Y1tiKyhxKzI0KT4+Ml18MDtuPWIrcXwwO289YisocSs3Nil8MDtwPWNbbz4+Ml18MDtkb3tpZigocHwwKT09LTEpe3E9Y1tiKyhxKzI4KT4+Ml18MDtwPXErNHwwO2NbcD4+Ml09KGNbcD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NTY7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ1NixrKX1yPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtzPWNbcSs4Pj4yXXwwO2lmKChjW3ErMTI+PjJdfDApLXM+PjI+Pj4wPnI+Pj4wPyhsPWNbcysocjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe2w9eGNbY1soY1tsPj4yXXwwKSsyOD4+Ml0mNjNdKGwsMzIpfDA7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfXA9bDw8MjQ+PjI0O2Nbbz4+Ml09cDticmVha31zPVhhKDQpfDA7Y1tzPj4yXT0yMTMwNDt3YihzfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7cj1wJjI1NTtzPWQmNjU1MzU7cT1jWyhjW2U+PjJdfDApKzI0Pj4yXXwwO2Nbaj4+Ml09bTtjW2srMD4+Ml09Y1tqKzA+PjJdO3djW3EmNjNdKGYsZSxrLG4scixzKTtpZigoY1tmPj4yXXwwKSE9MCl7YnJlYWt9cz1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7cWcoYitzfDAsY1tiKyhzKzE2KT4+Ml18NSk7YnJlYWt9cz1YYSg0KXwwO2Nbcz4+Ml09MjEzMDQ7d2Ioc3wwLDIxMzc2LDE5Nil9fXdoaWxlKDApO2doKGcpO2k9aDtyZXR1cm4gYnwwfWZ1bmN0aW9uIGloKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7aD1pO2k9aSszMnwwO2s9aDtqPWgrMjR8MDtnPWgrMTZ8MDtmPWgrMTJ8MDthW2c+PjBdPTA7Y1tnKzQ+PjJdPWI7bj1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7ZG97aWYoKGNbYisobisxNik+PjJdfDApPT0wKXttPWNbYisobis3Mik+PjJdfDA7aWYoKG18MCkhPTApe1lnKG0pO249Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwfWFbZz4+MF09MTtvPWNbYisobisyOCk+PjJdfDA7cD1vKzR8MDtjW3A+PjJdPShjW3A+PjJdfDApKzE7aWYoISgoY1szMDQ4XXwwKT09LTEpKXtjW2s+PjJdPTEyMTkyO2Nbays0Pj4yXT0yMDg7Y1trKzg+PjJdPTA7Y2coMTIxOTIsayl9bj0oY1sxMjE5Nj4+Ml18MCkrIC0xfDA7bT1jW28rOD4+Ml18MDtpZigoY1tvKzEyPj4yXXwwKS1tPj4yPj4+MD5uPj4+MD8oZT1jW20rKG48PDIpPj4yXXwwLChlfDApIT0wKTowKXtzPWNbcD4+Ml18MDtjW3A+PjJdPXMrIC0xO2lmKChzfDApPT0wKXtsY1tjWyhjW28+PjJdfDApKzg+PjJdJjI1NV0obyl9cT1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7bT1jW2IrKHErMjQpPj4yXXwwO249YitxfDA7bz1iKyhxKzc2KXwwO3A9Y1tvPj4yXXwwO2Rve2lmKChwfDApPT0tMSl7cT1jW2IrKHErMjgpPj4yXXwwO3A9cSs0fDA7Y1twPj4yXT0oY1twPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1trPj4yXT0xMzQ1NjtjW2srND4+Ml09MjA4O2Nbays4Pj4yXT0wO2NnKDEzNDU2LGspfXI9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3M9Y1txKzg+PjJdfDA7aWYoKGNbcSsxMj4+Ml18MCktcz4+Mj4+PjA+cj4+PjA/KGw9Y1tzKyhyPDwyKT4+Ml18MCwobHwwKSE9MCk6MCl7bD14Y1tjWyhjW2w+PjJdfDApKzI4Pj4yXSY2M10obCwzMil8MDtzPWNbcD4+Ml18MDtjW3A+PjJdPXMrIC0xO2lmKChzfDApPT0wKXtsY1tjWyhjW3E+PjJdfDApKzg+PjJdJjI1NV0ocSl9cD1sPDwyND4+MjQ7Y1tvPj4yXT1wO2JyZWFrfXM9WGEoNCl8MDtjW3M+PjJdPTIxMzA0O3diKHN8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtzPXAmMjU1O3I9Y1soY1tlPj4yXXwwKSsxNj4+Ml18MDtjW2o+PjJdPW07Y1trKzA+PjJdPWNbaiswPj4yXTt3Y1tyJjYzXShmLGUsayxuLHMsZCk7aWYoKGNbZj4+Ml18MCkhPTApe2JyZWFrfXM9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO3FnKGIrc3wwLGNbYisocysxNik+PjJdfDUpO2JyZWFrfXM9WGEoNCl8MDtjW3M+PjJdPTIxMzA0O3diKHN8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtnaChnKTtpPWg7cmV0dXJuIGJ8MH1mdW5jdGlvbiBqaChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2g9aTtpPWkrMzJ8MDtrPWg7aj1oKzI0fDA7Zz1oKzE2fDA7Zj1oKzEyfDA7YVtnPj4wXT0wO2NbZys0Pj4yXT1iO249Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2IrKG4rMTYpPj4yXXwwKT09MCl7bT1jW2IrKG4rNzIpPj4yXXwwO2lmKChtfDApIT0wKXtZZyhtKTtuPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MH1hW2c+PjBdPTE7bz1jW2IrKG4rMjgpPj4yXXwwO3A9bys0fDA7Y1twPj4yXT0oY1twPj4yXXwwKSsxO2lmKCEoKGNbMzA0OF18MCk9PS0xKSl7Y1trPj4yXT0xMjE5MjtjW2srND4+Ml09MjA4O2Nbays4Pj4yXT0wO2NnKDEyMTkyLGspfW49KGNbMTIxOTY+PjJdfDApKyAtMXwwO209Y1tvKzg+PjJdfDA7aWYoKGNbbysxMj4+Ml18MCktbT4+Mj4+PjA+bj4+PjA/KGU9Y1ttKyhuPDwyKT4+Ml18MCwoZXwwKSE9MCk6MCl7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfXE9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO209Y1tiKyhxKzI0KT4+Ml18MDtuPWIrcXwwO289YisocSs3Nil8MDtwPWNbbz4+Ml18MDtkb3tpZigocHwwKT09LTEpe3E9Y1tiKyhxKzI4KT4+Ml18MDtwPXErNHwwO2NbcD4+Ml09KGNbcD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NTY7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ1NixrKX1yPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtzPWNbcSs4Pj4yXXwwO2lmKChjW3ErMTI+PjJdfDApLXM+PjI+Pj4wPnI+Pj4wPyhsPWNbcysocjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe2w9eGNbY1soY1tsPj4yXXwwKSsyOD4+Ml0mNjNdKGwsMzIpfDA7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfXA9bDw8MjQ+PjI0O2Nbbz4+Ml09cDticmVha31zPVhhKDQpfDA7Y1tzPj4yXT0yMTMwNDt3YihzfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7cz1wJjI1NTtyPWNbKGNbZT4+Ml18MCkrMjQ+PjJdfDA7Y1tqPj4yXT1tO2NbayswPj4yXT1jW2orMD4+Ml07d2NbciY2M10oZixlLGssbixzLGQpO2lmKChjW2Y+PjJdfDApIT0wKXticmVha31zPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK3N8MCxjW2IrKHMrMTYpPj4yXXw1KTticmVha31zPVhhKDQpfDA7Y1tzPj4yXT0yMTMwNDt3YihzfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Z2goZyk7aT1oO3JldHVybiBifDB9ZnVuY3Rpb24ga2goYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wO2g9aTtpPWkrMzJ8MDtsPWg7aj1oKzI0fDA7Zz1oKzE2fDA7Zj1oKzEyfDA7YVtnPj4wXT0wO2NbZys0Pj4yXT1iO289Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2IrKG8rMTYpPj4yXXwwKT09MCl7bj1jW2IrKG8rNzIpPj4yXXwwO2lmKChufDApIT0wKXtZZyhuKTtvPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MH1hW2c+PjBdPTE7cD1jW2IrKG8rMjgpPj4yXXwwO3E9cCs0fDA7Y1txPj4yXT0oY1txPj4yXXwwKSsxO2lmKCEoKGNbMzA0OF18MCk9PS0xKSl7Y1tsPj4yXT0xMjE5MjtjW2wrND4+Ml09MjA4O2NbbCs4Pj4yXT0wO2NnKDEyMTkyLGwpfW89KGNbMTIxOTY+PjJdfDApKyAtMXwwO249Y1twKzg+PjJdfDA7aWYoKGNbcCsxMj4+Ml18MCktbj4+Mj4+PjA+bz4+PjA/KGs9Y1tuKyhvPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7dD1jW3E+PjJdfDA7Y1txPj4yXT10KyAtMTtpZigodHwwKT09MCl7bGNbY1soY1twPj4yXXwwKSs4Pj4yXSYyNTVdKHApfXI9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO249Y1tiKyhyKzI0KT4+Ml18MDtvPWIrcnwwO3A9Yisocis3Nil8MDtxPWNbcD4+Ml18MDtkb3tpZigocXwwKT09LTEpe3I9Y1tiKyhyKzI4KT4+Ml18MDtxPXIrNHwwO2NbcT4+Ml09KGNbcT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1zPShjWzEzNDYwPj4yXXwwKSsgLTF8MDt0PWNbcis4Pj4yXXwwO2lmKChjW3IrMTI+PjJdfDApLXQ+PjI+Pj4wPnM+Pj4wPyhtPWNbdCsoczw8Mik+PjJdfDAsKG18MCkhPTApOjApe209eGNbY1soY1ttPj4yXXwwKSsyOD4+Ml0mNjNdKG0sMzIpfDA7dD1jW3E+PjJdfDA7Y1txPj4yXT10KyAtMTtpZigodHwwKT09MCl7bGNbY1soY1tyPj4yXXwwKSs4Pj4yXSYyNTVdKHIpfXE9bTw8MjQ+PjI0O2NbcD4+Ml09cTticmVha310PVhhKDQpfDA7Y1t0Pj4yXT0yMTMwNDt3Yih0fDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7dD1xJjI1NTtzPWNbKGNbaz4+Ml18MCkrMjg+PjJdfDA7Y1tqPj4yXT1uO2NbbCswPj4yXT1jW2orMD4+Ml07aWNbcyY2M10oZixrLGwsbyx0LGQsZSk7aWYoKGNbZj4+Ml18MCkhPTApe2JyZWFrfXQ9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO3FnKGIrdHwwLGNbYisodCsxNik+PjJdfDUpO2JyZWFrfXQ9WGEoNCl8MDtjW3Q+PjJdPTIxMzA0O3diKHR8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtnaChnKTtpPWg7cmV0dXJuIGJ8MH1mdW5jdGlvbiBsaChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2U9aTtpPWkrMTZ8MDtmPWU7YVtmPj4wXT0wO2NbZis0Pj4yXT1iO2g9Y1tiPj4yXXwwO2c9Y1toKyAtMTI+PjJdfDA7ZG97aWYoKGNbYisoZysxNik+PjJdfDApPT0wKXtqPWNbYisoZys3Mik+PjJdfDA7aWYoKGp8MCkhPTApe1lnKGopO2c9Y1tiPj4yXXwwO2g9ZztnPWNbZysgLTEyPj4yXXwwfWFbZj4+MF09MTtnPWNbYisoZysyNCk+PjJdfDA7aWYoKGd8MCkhPTApe2o9ZysyNHwwO2g9Y1tqPj4yXXwwO2lmKChofDApIT0oY1tnKzI4Pj4yXXwwKSl7Y1tqPj4yXT1oKzE7YVtoPj4wXT1kO2JyZWFrfWlmKCEoKHhjW2NbKGNbZz4+Ml18MCkrNTI+PjJdJjYzXShnLGQmMjU1KXwwKT09LTEpKXticmVha31oPWNbYj4+Ml18MH1qPWNbaCsgLTEyPj4yXXwwO3FnKGIranwwLGNbYisoaisxNik+PjJdfDEpfX13aGlsZSgwKTtnaChmKTtpPWU7cmV0dXJufWZ1bmN0aW9uIG1oKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErNHwwKTtpZigoYXwwKT09MCl7aT1iO3JldHVybn12bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIG5oKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErNHwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIG9oKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MDtiPWk7ZT1jWyhjW2E+PjJdfDApKyAtMTI+PjJdfDA7ZD1hK2V8MDtyZyhhKyhlKzQpfDApO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gcGgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7cmcoYSsoKGNbKGNbYT4+Ml18MCkrIC0xMj4+Ml18MCkrNCl8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBxaChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2E9YSs0fDA7ZD1jW2E+PjJdfDA7ZT1jWyhjW2Q+PjJdfDApKyAtMTI+PjJdfDA7aWYoKGNbZCsoZSsyNCk+PjJdfDApPT0wKXtpPWI7cmV0dXJufWlmKChjW2QrKGUrMTYpPj4yXXwwKSE9MCl7aT1iO3JldHVybn1pZigoY1tkKyhlKzQpPj4yXSY4MTkyfDApPT0wKXtpPWI7cmV0dXJufWlmKFlhKCl8MCl7aT1iO3JldHVybn1lPWNbYT4+Ml18MDtlPWNbZSsoKGNbKGNbZT4+Ml18MCkrIC0xMj4+Ml18MCkrMjQpPj4yXXwwO2lmKCEoKG9jW2NbKGNbZT4+Ml18MCkrMjQ+PjJdJjEyN10oZSl8MCk9PS0xKSl7aT1iO3JldHVybn1kPWNbYT4+Ml18MDtlPWNbKGNbZD4+Ml18MCkrIC0xMj4+Ml18MDtxZyhkK2V8MCxjW2QrKGUrMTYpPj4yXXwxKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHJoKGEpe2E9YXwwO3JldHVybiAxMDk0NH1mdW5jdGlvbiBzaChiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTA7ZD1pO2lmKChlfDApPT0xKXtlZyhiLDEwOTYwLDM1KTtpPWQ7cmV0dXJufWc9TmIoZXwwKXwwO2U9Sm4oZ3wwKXwwO2lmKGU+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9ZG97aWYoZT4+PjA8MTEpe2FbYj4+MF09ZTw8MTtrPWIrMXwwfWVsc2V7aD1lKzE2Ji0xNjtqPShofDApPT0wPzE6aDt3aGlsZSgxKXtrPXVuKGopfDA7aWYoKGt8MCkhPTApe2Y9MTI7YnJlYWt9az1jWzU2NjZdfDA7Y1s1NjY2XT1rKzA7aWYoKGt8MCk9PTApe2JyZWFrfXNjW2smMzFdKCl9aWYoKGZ8MCk9PTEyKXtjW2IrOD4+Ml09aztjW2I+PjJdPWh8MTtjW2IrND4+Ml09ZTticmVha31rPVhhKDQpfDA7Y1trPj4yXT0yMjY4MDt3YihrfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7TG4oa3wwLGd8MCxlfDApfDA7YVtrK2U+PjBdPTA7aT1kO3JldHVybn1mdW5jdGlvbiB0aChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gdWgoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApfVJiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiB2aChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gd2goYSl7YT1hfDA7dmFyIGI9MDtiPWk7cmcoYSk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geGgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geWgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gemgoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEFoKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBCaChiLGMsZCxlLGYpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MDtiPWk7YTpkb3tpZigoZXwwKT09KGZ8MCkpe2c9Nn1lbHNle3doaWxlKDEpe2lmKChjfDApPT0oZHwwKSl7ZD0tMTticmVhayBhfWg9YVtjPj4wXXwwO2o9YVtlPj4wXXwwO2lmKGg8PDI0Pj4yNDxqPDwyND4+MjQpe2Q9LTE7YnJlYWsgYX1pZihqPDwyND4+MjQ8aDw8MjQ+PjI0KXtkPTE7YnJlYWsgYX1jPWMrMXwwO2U9ZSsxfDA7aWYoKGV8MCk9PShmfDApKXtnPTY7YnJlYWt9fX19d2hpbGUoMCk7aWYoKGd8MCk9PTYpe2Q9KGN8MCkhPShkfDApJjF9aT1iO3JldHVybiBkfDB9ZnVuY3Rpb24gQ2goYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2Q9aTtnPWU7aj1mLWd8MDtpZihqPj4+MD40Mjk0OTY3Mjc5KXtkZygpfWRve2lmKGo+Pj4wPDExKXthW2I+PjBdPWo8PDE7bT1iKzF8MH1lbHNle2s9aisxNiYtMTY7bD0oa3wwKT09MD8xOms7d2hpbGUoMSl7bT11bihsKXwwO2lmKChtfDApIT0wKXtoPTExO2JyZWFrfW09Y1s1NjY2XXwwO2NbNTY2Nl09bSswO2lmKChtfDApPT0wKXticmVha31zY1ttJjMxXSgpfWlmKChofDApPT0xMSl7Y1tiKzg+PjJdPW07Y1tiPj4yXT1rfDE7Y1tiKzQ+PjJdPWo7YnJlYWt9bT1YYSg0KXwwO2NbbT4+Ml09MjI2ODA7d2IobXwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKChlfDApPT0oZnwwKSl7YVttPj4wXT0wO2k9ZDtyZXR1cm59ZWxzZXtiPW19d2hpbGUoMSl7YVtiPj4wXT1hW2U+PjBdfDA7ZT1lKzF8MDtpZigoZXwwKT09KGZ8MCkpe2JyZWFrfWVsc2V7Yj1iKzF8MH19bT1tKyhmKygwLWcpKXwwO2FbbT4+MF09MDtpPWQ7cmV0dXJufWZ1bmN0aW9uIERoKGIsYyxkKXtiPWJ8MDtjPWN8MDtkPWR8MDt2YXIgZT0wLGY9MDtiPWk7aWYoKGN8MCk9PShkfDApKXtlPTA7aT1iO3JldHVybiBlfDB9ZWxzZXtlPTB9ZG97ZT0oYVtjPj4wXXwwKSsoZTw8NCl8MDtmPWUmLTI2ODQzNTQ1NjtlPShmPj4+MjR8ZileZTtjPWMrMXwwfXdoaWxlKChjfDApIT0oZHwwKSk7aT1iO3JldHVybiBlfDB9ZnVuY3Rpb24gRWgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gRmgoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEdoKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wO2E9aTthOmRve2lmKChlfDApPT0oZnwwKSl7Zz02fWVsc2V7d2hpbGUoMSl7aWYoKGJ8MCk9PShkfDApKXtkPS0xO2JyZWFrIGF9aD1jW2I+PjJdfDA7aj1jW2U+PjJdfDA7aWYoKGh8MCk8KGp8MCkpe2Q9LTE7YnJlYWsgYX1pZigoanwwKTwoaHwwKSl7ZD0xO2JyZWFrIGF9Yj1iKzR8MDtlPWUrNHwwO2lmKChlfDApPT0oZnwwKSl7Zz02O2JyZWFrfX19fXdoaWxlKDApO2lmKChnfDApPT02KXtkPShifDApIT0oZHwwKSYxfWk9YTtyZXR1cm4gZHwwfWZ1bmN0aW9uIEhoKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtkPWk7aD1lO2s9Zi1ofDA7aj1rPj4yO2lmKGo+Pj4wPjEwNzM3NDE4MDcpe2RnKCl9ZG97aWYoaj4+PjA8Mil7YVtiPj4wXT1rPj4+MTttPWIrNHwwfWVsc2V7az1qKzQmLTQ7bD1rPDwyO2w9KGx8MCk9PTA/MTpsO3doaWxlKDEpe209dW4obCl8MDtpZigobXwwKSE9MCl7Zz0xMTticmVha31tPWNbNTY2Nl18MDtjWzU2NjZdPW0rMDtpZigobXwwKT09MCl7YnJlYWt9c2NbbSYzMV0oKX1pZigoZ3wwKT09MTEpe2NbYis4Pj4yXT1tO2NbYj4+Ml09a3wxO2NbYis0Pj4yXT1qO2JyZWFrfW09WGEoNCl8MDtjW20+PjJdPTIyNjgwO3diKG18MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZigoZXwwKT09KGZ8MCkpe2NbbT4+Ml09MDtpPWQ7cmV0dXJufWI9ZisgLTQrKDAtaCl8MDtnPW07d2hpbGUoMSl7Y1tnPj4yXT1jW2U+PjJdO2U9ZSs0fDA7aWYoKGV8MCk9PShmfDApKXticmVha31lbHNle2c9Zys0fDB9fW09bSsoKGI+Pj4yKSsxPDwyKXwwO2NbbT4+Ml09MDtpPWQ7cmV0dXJufWZ1bmN0aW9uIEloKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MDthPWk7aWYoKGJ8MCk9PShkfDApKXtlPTA7aT1hO3JldHVybiBlfDB9ZWxzZXtlPTB9ZG97ZT0oY1tiPj4yXXwwKSsoZTw8NCl8MDtmPWUmLTI2ODQzNTQ1NjtlPShmPj4+MjR8ZileZTtiPWIrNHwwfXdoaWxlKChifDApIT0oZHwwKSk7aT1hO3JldHVybiBlfDB9ZnVuY3Rpb24gSmgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gS2goYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIExoKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2s9aTtpPWkrNjR8MDtwPWs7dT1rKzQ4fDA7cT1rKzUyfDA7dD1rKzU2fDA7cz1rKzE2fDA7cj1rKzEyfDA7bD1rKzI0fDA7aWYoKGNbZys0Pj4yXSYxfDApPT0wKXtjW3E+PjJdPS0xO2w9Y1soY1tkPj4yXXwwKSsxNj4+Ml18MDtjW3M+PjJdPWNbZT4+Ml07Y1tyPj4yXT1jW2Y+PjJdO2NbdSswPj4yXT1jW3MrMD4+Ml07Y1twKzA+PjJdPWNbciswPj4yXTtpY1tsJjYzXSh0LGQsdSxwLGcsaCxxKTtsPWNbdD4+Ml18MDtjW2U+PjJdPWw7ZT1jW3E+PjJdfDA7aWYoKGV8MCk9PTApe2Fbaj4+MF09MH1lbHNlIGlmKChlfDApPT0xKXthW2o+PjBdPTF9ZWxzZXthW2o+PjBdPTE7Y1toPj4yXT00fWNbYj4+Ml09bDtpPWs7cmV0dXJufXE9ZysyOHwwO3I9Y1txPj4yXXwwO2Q9cis0fDA7Y1tkPj4yXT0oY1tkPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1twPj4yXT0xMzQ1NjtjW3ArND4+Ml09MjA4O2NbcCs4Pj4yXT0wO2NnKDEzNDU2LHApfXM9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3Q9Y1tyKzg+PjJdfDA7aWYoKGNbcisxMj4+Ml18MCktdD4+Mj4+PjA+cz4+PjA/KG89Y1t0KyhzPDwyKT4+Ml18MCwob3wwKSE9MCk6MCl7dT1yKzR8MDtkPWNbdT4+Ml18MDtjW3U+PjJdPWQrIC0xO2lmKChkfDApPT0wKXtsY1tjWyhjW3I+PjJdfDApKzg+PjJdJjI1NV0ocil9cT1jW3E+PjJdfDA7ZD1xKzR8MDtjW2Q+PjJdPShjW2Q+PjJdfDApKzE7aWYoISgoY1szNDAwXXwwKT09LTEpKXtjW3A+PjJdPTEzNjAwO2NbcCs0Pj4yXT0yMDg7Y1twKzg+PjJdPTA7Y2coMTM2MDAscCl9cD0oY1sxMzYwND4+Ml18MCkrIC0xfDA7cj1jW3ErOD4+Ml18MDtpZigoY1txKzEyPj4yXXwwKS1yPj4yPj4+MD5wPj4+MD8obj1jW3IrKHA8PDIpPj4yXXwwLChufDApIT0wKTowKXt1PXErNHwwO2Q9Y1t1Pj4yXXwwO2NbdT4+Ml09ZCsgLTE7aWYoKGR8MCk9PTApe2xjW2NbKGNbcT4+Ml18MCkrOD4+Ml0mMjU1XShxKX1tY1tjWyhjW24+PjJdfDApKzI0Pj4yXSYxMjddKGwsbik7ZD1sKzEyfDA7bWNbY1soY1tuPj4yXXwwKSsyOD4+Ml0mMTI3XShkLG4pO2Fbaj4+MF09KE1oKGUsY1tmPj4yXXwwLGwsbCsyNHwwLG8saCwxKXwwKT09KGx8MCkmMTtjW2I+PjJdPWNbZT4+Ml07aWYoISgoYVtkPj4wXSYxKT09MCk/KG09Y1tsKzIwPj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZigoYVtsPj4wXSYxKT09MCl7aT1rO3JldHVybn1iPWNbbCs4Pj4yXXwwO2lmKChifDApPT0wKXtpPWs7cmV0dXJufXZuKGIpO2k9aztyZXR1cm59ZD1YYSg0KXwwO2NbZD4+Ml09MjEzMDQ7d2IoZHwwLDIxMzc2LDE5Nil9ZD1YYSg0KXwwO2NbZD4+Ml09MjEzMDQ7d2IoZHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gTWgoYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MDttPWk7aT1pKzExMnwwO289bTt0PShnLWZ8MCkvMTJ8MDtpZih0Pj4+MD4xMDApe289dW4odCl8MDtpZigob3wwKT09MCl7QT1YYSg0KXwwO2NbQT4+Ml09MjI2ODA7d2IoQXwwLDIyNzI4LDIwNil9ZWxzZXtsPW99fWVsc2V7bD0wfXA9KGZ8MCk9PShnfDApO2lmKHApe3U9MH1lbHNle3E9Zjt1PTA7cj1vO3doaWxlKDEpe3M9YVtxPj4wXXwwO2lmKChzJjEpPT0wKXtzPShzJjI1NSk+Pj4xfWVsc2V7cz1jW3ErND4+Ml18MH1pZigoc3wwKT09MCl7YVtyPj4wXT0yO3U9dSsxfDA7dD10KyAtMXwwfWVsc2V7YVtyPj4wXT0xfXE9cSsxMnwwO2lmKChxfDApPT0oZ3wwKSl7YnJlYWt9ZWxzZXtyPXIrMXwwfX19cT0wO2E6d2hpbGUoMSl7dj0odHwwKSE9MDtyPXE7d2hpbGUoMSl7cT1jW2I+PjJdfDA7ZG97aWYoKHF8MCkhPTApe2lmKChjW3ErMTI+PjJdfDApPT0oY1txKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbcT4+Ml18MCkrMzY+PjJdJjEyN10ocSl8MCk9PS0xKXtjW2I+PjJdPTA7cT0wO2JyZWFrfWVsc2V7cT1jW2I+PjJdfDA7YnJlYWt9fX1lbHNle3E9MH19d2hpbGUoMCk7dz0ocXwwKT09MDtpZigoZXwwKSE9MCl7aWYoKGNbZSsxMj4+Ml18MCk9PShjW2UrMTY+PjJdfDApKXtBPShvY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDApPT0tMTtxPUE/MDplO2U9QT8wOmV9ZWxzZXtxPWV9fWVsc2V7cT0wO2U9MH1zPShxfDApPT0wO3g9Y1tiPj4yXXwwO2lmKCEoKHdecykmdikpe2JyZWFrIGF9cT1jW3grMTI+PjJdfDA7aWYoKHF8MCk9PShjW3grMTY+PjJdfDApKXtxPW9jW2NbKGNbeD4+Ml18MCkrMzY+PjJdJjEyN10oeCl8MH1lbHNle3E9ZFtxPj4wXXwwfXM9cSYyNTU7aWYoIWspe3M9eGNbY1soY1toPj4yXXwwKSsxMj4+Ml0mNjNdKGgscyl8MH1xPXIrMXwwO2lmKHApe3I9cX1lbHNle2JyZWFrfX1iOmRve2lmKGspe3g9MDt2PWY7dz1vO3doaWxlKDEpe2Rve2lmKChhW3c+PjBdfDApPT0xKXt5PWFbdj4+MF18MDt6PSh5JjEpPT0wO2lmKHope0E9disxfDB9ZWxzZXtBPWNbdis4Pj4yXXwwfWlmKCEoczw8MjQ+PjI0PT0oYVtBK3I+PjBdfDApKSl7YVt3Pj4wXT0wO3Q9dCsgLTF8MDticmVha31pZih6KXt4PSh5JjI1NSk+Pj4xfWVsc2V7eD1jW3YrND4+Ml18MH1pZigoeHwwKT09KHF8MCkpe2Fbdz4+MF09Mjt4PTE7dT11KzF8MDt0PXQrIC0xfDB9ZWxzZXt4PTF9fX13aGlsZSgwKTt2PXYrMTJ8MDtpZigodnwwKT09KGd8MCkpe2JyZWFrIGJ9dz13KzF8MH19ZWxzZXt4PTA7dj1mO3c9bzt3aGlsZSgxKXtkb3tpZigoYVt3Pj4wXXwwKT09MSl7aWYoKGFbdj4+MF0mMSk9PTApe3k9disxfDB9ZWxzZXt5PWNbdis4Pj4yXXwwfWlmKCEoczw8MjQ+PjI0PT0oeGNbY1soY1toPj4yXXwwKSsxMj4+Ml0mNjNdKGgsYVt5K3I+PjBdfDApfDApPDwyND4+MjQpKXthW3c+PjBdPTA7dD10KyAtMXwwO2JyZWFrfXg9YVt2Pj4wXXwwO2lmKCh4JjEpPT0wKXt4PSh4JjI1NSk+Pj4xfWVsc2V7eD1jW3YrND4+Ml18MH1pZigoeHwwKT09KHF8MCkpe2Fbdz4+MF09Mjt4PTE7dT11KzF8MDt0PXQrIC0xfDB9ZWxzZXt4PTF9fX13aGlsZSgwKTt2PXYrMTJ8MDtpZigodnwwKT09KGd8MCkpe2JyZWFrIGJ9dz13KzF8MH19fXdoaWxlKDApO2lmKCF4KXtjb250aW51ZX12PWNbYj4+Ml18MDtzPXYrMTJ8MDtyPWNbcz4+Ml18MDtpZigocnwwKT09KGNbdisxNj4+Ml18MCkpe29jW2NbKGNbdj4+Ml18MCkrNDA+PjJdJjEyN10odil8MH1lbHNle2Nbcz4+Ml09cisxfWlmKCh0K3V8MCk+Pj4wPDIpe2NvbnRpbnVlfWVsc2V7cz1mO3I9b313aGlsZSgxKXtpZigoYVtyPj4wXXwwKT09Mil7dj1hW3M+PjBdfDA7aWYoKHYmMSk9PTApe3Y9KHYmMjU1KT4+PjF9ZWxzZXt2PWNbcys0Pj4yXXwwfWlmKCh2fDApIT0ocXwwKSl7YVtyPj4wXT0wO3U9dSsgLTF8MH19cz1zKzEyfDA7aWYoKHN8MCk9PShnfDApKXtjb250aW51ZSBhfWVsc2V7cj1yKzF8MH19fWRve2lmKCh4fDApIT0wKXtpZigoY1t4KzEyPj4yXXwwKT09KGNbeCsxNj4+Ml18MCkpe2lmKChvY1tjWyhjW3g+PjJdfDApKzM2Pj4yXSYxMjddKHgpfDApPT0tMSl7Y1tiPj4yXT0wO3g9MDticmVha31lbHNle3g9Y1tiPj4yXXwwO2JyZWFrfX19ZWxzZXt4PTB9fXdoaWxlKDApO2g9KHh8MCk9PTA7ZG97aWYoIXMpe2lmKChjW3ErMTI+PjJdfDApIT0oY1txKzE2Pj4yXXwwKSl7aWYoaCl7YnJlYWt9ZWxzZXtuPTg1O2JyZWFrfX1pZighKChvY1tjWyhjW3E+PjJdfDApKzM2Pj4yXSYxMjddKHEpfDApPT0tMSkpe2lmKCFoKXtuPTg1fX1lbHNle249ODN9fWVsc2V7bj04M319d2hpbGUoMCk7aWYoKG58MCk9PTgzP2g6MCl7bj04NX1pZigobnwwKT09ODUpe2Nbaj4+Ml09Y1tqPj4yXXwyfWM6ZG97aWYoIXApe2lmKChhW28+PjBdfDApPT0yKXtnPWZ9ZWxzZXt3aGlsZSgxKXtmPWYrMTJ8MDtvPW8rMXwwO2lmKChmfDApPT0oZ3wwKSl7bj05MDticmVhayBjfWlmKChhW28+PjBdfDApPT0yKXtnPWY7YnJlYWt9fX19ZWxzZXtuPTkwfX13aGlsZSgwKTtpZigobnwwKT09OTApe2Nbaj4+Ml09Y1tqPj4yXXw0fWlmKChsfDApPT0wKXtpPW07cmV0dXJuIGd8MH12bihsKTtpPW07cmV0dXJuIGd8MH1mdW5jdGlvbiBOaChiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MDtlPWk7aT1pKzIyNHwwO3Y9ZSsxOTh8MDt1PWUrMTk2fDA7bj1lKzE2fDA7bz1lKzR8MDtxPWUrMTkyfDA7cz1lKzMyfDA7cj1lO3Q9ZSsyOHwwO3k9Y1tmPj4yXXwwO0E9Y1tnPj4yXXwwO2c9Y1toKzQ+PjJdJjc0O2lmKChnfDApPT04KXtnPTE2fWVsc2UgaWYoKGd8MCk9PTApe2c9MH1lbHNlIGlmKChnfDApPT02NCl7Zz04fWVsc2V7Zz0xMH1taShuLGgsdix1KTtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtoZyhvLDEwKTtpZigoYVtvPj4wXSYxKT09MCl7Qj1vKzF8MDt3PUI7Zj1vKzh8MH1lbHNle0I9bys4fDA7dz1vKzF8MDtmPUI7Qj1jW0I+PjJdfDB9Y1txPj4yXT1CO2Nbcj4+Ml09cztjW3Q+PjJdPTA7aD1vKzR8MDt4PWFbdT4+MF18MDt1PW8rOHwwO2E6d2hpbGUoMSl7aWYoKHl8MCkhPTApe2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RT0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7eT1FPzA6eX19ZWxzZXt5PTB9ej0oeXwwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZih6KXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xKSl7aWYoIXope2JyZWFrIGF9fWVsc2V7bD0xOX19ZWxzZXtsPTE5fX13aGlsZSgwKTtpZigobHwwKT09MTkpe2w9MDtpZih6KXtBPTA7YnJlYWt9ZWxzZXtBPTB9fUQ9YVtvPj4wXXwwO0M9KEQmMSk9PTA7aWYoQyl7RT0oRCYyNTUpPj4+MX1lbHNle0U9Y1toPj4yXXwwfWlmKCgoY1txPj4yXXwwKS1CfDApPT0oRXwwKSl7aWYoQyl7Qj0oRCYyNTUpPj4+MTtFPShEJjI1NSk+Pj4xO0Q9Qjw8MX1lbHNle0I9Y1toPj4yXXwwO0U9Y1toPj4yXXwwO0Q9Qjw8MX1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUI8PDI7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtFPWFbbz4+MF18MDtpZigoRSYxKT09MCl7RD0xMH1lbHNle0Q9Y1tvPj4yXXwwO0U9RCYyNTU7RD0oRCYtMikrIC0xfDB9Qz0oRSYxKT09MDtpZihDKXtFPShFJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9ZG97aWYoIShFPj4+MDxEPj4+MCkpe2lmKEMpe2FbbytEKzE+PjBdPTA7YVtvPj4wXT1EPDwxO2JyZWFrfWVsc2V7YVsoY1t1Pj4yXXwwKStEPj4wXT0wO2NbaD4+Ml09RDticmVha319ZWxzZXtoZyhvLEQtRXwwKX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9d31lbHNle0M9Y1tmPj4yXXwwfWNbcT4+Ml09QytCO0I9Q31EPXkrMTJ8MDtFPWNbRD4+Ml18MDtDPXkrMTZ8MDtpZigoRXwwKT09KGNbQz4+Ml18MCkpe0U9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7RT1kW0U+PjBdfDB9aWYoKFhoKEUmMjU1LGcsQixxLHQseCxuLHMscix2KXwwKSE9MCl7YnJlYWt9ej1jW0Q+PjJdfDA7aWYoKHp8MCk9PShjW0M+PjJdfDApKXtvY1tjWyhjW3k+PjJdfDApKzQwPj4yXSYxMjddKHkpfDA7Y29udGludWV9ZWxzZXtjW0Q+PjJdPXorMTtjb250aW51ZX19dj1hW24+PjBdfDA7aWYoKHYmMSk9PTApe3Y9KHYmMjU1KT4+PjF9ZWxzZXt2PWNbbis0Pj4yXXwwfWlmKCh2fDApIT0wPyhwPWNbcj4+Ml18MCwocC1zfDApPDE2MCk6MCl7RT1jW3Q+PjJdfDA7Y1tyPj4yXT1wKzQ7Y1twPj4yXT1FfWNbaz4+Ml09Tm0oQixjW3E+PjJdfDAsaixnKXwwO3FrKG4scyxjW3I+PjJdfDAsaik7aWYoIXope2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RT0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7eT1FPzA6eX19ZWxzZXt5PTB9cD0oeXwwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZihwKXticmVha31lbHNle2w9NzE7YnJlYWt9fWlmKCEoKG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xKSl7aWYoIXApe2w9NzF9fWVsc2V7bD02OX19ZWxzZXtsPTY5fX13aGlsZSgwKTtpZigobHwwKT09Njk/cDowKXtsPTcxfWlmKChsfDApPT03MSl7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT15O2lmKCEoKGFbbz4+MF0mMSk9PTApPyhtPWNbdT4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoKGFbbj4+MF0mMSk9PTApe2k9ZTtyZXR1cm59bD1jW24rOD4+Ml18MDtpZigobHwwKT09MCl7aT1lO3JldHVybn12bihsKTtpPWU7cmV0dXJufWZ1bmN0aW9uIE9oKGIsZSxmLGcsaCxqLGspe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wO2U9aTtpPWkrMjI0fDA7dj1lKzE5OHwwO3U9ZSsxOTZ8MDtuPWUrMTZ8MDtvPWUrNHwwO3E9ZSsxOTJ8MDtzPWUrMzJ8MDtyPWU7dD1lKzI4fDA7eT1jW2Y+PjJdfDA7QT1jW2c+PjJdfDA7Zz1jW2grND4+Ml0mNzQ7aWYoKGd8MCk9PTApe2c9MH1lbHNlIGlmKChnfDApPT04KXtnPTE2fWVsc2UgaWYoKGd8MCk9PTY0KXtnPTh9ZWxzZXtnPTEwfW1pKG4saCx2LHUpO2NbbyswPj4yXT0wO2Nbbys0Pj4yXT0wO2Nbbys4Pj4yXT0wO2hnKG8sMTApO2lmKChhW28+PjBdJjEpPT0wKXtCPW8rMXwwO3c9QjtmPW8rOHwwfWVsc2V7Qj1vKzh8MDt3PW8rMXwwO2Y9QjtCPWNbQj4+Ml18MH1jW3E+PjJdPUI7Y1tyPj4yXT1zO2NbdD4+Ml09MDtoPW8rNHwwO3g9YVt1Pj4wXXwwO3U9bys4fDA7YTp3aGlsZSgxKXtpZigoeXwwKSE9MCl7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH16PSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHope2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZigheil7YnJlYWsgYX19ZWxzZXtsPTE5fX1lbHNle2w9MTl9fXdoaWxlKDApO2lmKChsfDApPT0xOSl7bD0wO2lmKHope0E9MDticmVha31lbHNle0E9MH19RD1hW28+PjBdfDA7Qz0oRCYxKT09MDtpZihDKXtFPShEJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9aWYoKChjW3E+PjJdfDApLUJ8MCk9PShFfDApKXtpZihDKXtCPShEJjI1NSk+Pj4xO0U9KEQmMjU1KT4+PjE7RD1CPDwxfWVsc2V7Qj1jW2g+PjJdfDA7RT1jW2g+PjJdfDA7RD1CPDwxfWRve2lmKCEoRT4+PjA8RD4+PjApKXtpZihDKXthW28rRCsxPj4wXT0wO2Fbbz4+MF09Qjw8MjticmVha31lbHNle2FbKGNbdT4+Ml18MCkrRD4+MF09MDtjW2g+PjJdPUQ7YnJlYWt9fWVsc2V7aGcobyxELUV8MCl9fXdoaWxlKDApO0U9YVtvPj4wXXwwO2lmKChFJjEpPT0wKXtEPTEwfWVsc2V7RD1jW28+PjJdfDA7RT1EJjI1NTtEPShEJi0yKSsgLTF8MH1DPShFJjEpPT0wO2lmKEMpe0U9KEUmMjU1KT4+PjF9ZWxzZXtFPWNbaD4+Ml18MH1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUQ8PDE7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz13fWVsc2V7Qz1jW2Y+PjJdfDB9Y1txPj4yXT1DK0I7Qj1DfUQ9eSsxMnwwO0U9Y1tEPj4yXXwwO0M9eSsxNnwwO2lmKChFfDApPT0oY1tDPj4yXXwwKSl7RT1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXtFPWRbRT4+MF18MH1pZigoWGgoRSYyNTUsZyxCLHEsdCx4LG4scyxyLHYpfDApIT0wKXticmVha316PWNbRD4+Ml18MDtpZigoenwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbeT4+Ml18MCkrNDA+PjJdJjEyN10oeSl8MDtjb250aW51ZX1lbHNle2NbRD4+Ml09eisxO2NvbnRpbnVlfX12PWFbbj4+MF18MDtpZigodiYxKT09MCl7dj0odiYyNTUpPj4+MX1lbHNle3Y9Y1tuKzQ+PjJdfDB9aWYoKHZ8MCkhPTA/KHA9Y1tyPj4yXXwwLChwLXN8MCk8MTYwKTowKXtFPWNbdD4+Ml18MDtjW3I+PjJdPXArNDtjW3A+PjJdPUV9RD1NbShCLGNbcT4+Ml18MCxqLGcpfDA7RT1rO2NbRT4+Ml09RDtjW0UrND4+Ml09STtxayhuLHMsY1tyPj4yXXwwLGopO2lmKCF6KXtpZigoY1t5KzEyPj4yXXwwKT09KGNbeSsxNj4+Ml18MCkpe0U9KG9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MCk9PS0xO3k9RT8wOnl9fWVsc2V7eT0wfXA9KHl8MCk9PTA7ZG97aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApIT0oY1tBKzE2Pj4yXXwwKSl7aWYocCl7YnJlYWt9ZWxzZXtsPTcxO2JyZWFrfX1pZighKChvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMSkpe2lmKCFwKXtsPTcxfX1lbHNle2w9Njl9fWVsc2V7bD02OX19d2hpbGUoMCk7aWYoKGx8MCk9PTY5P3A6MCl7bD03MX1pZigobHwwKT09NzEpe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09eTtpZighKChhW28+PjBdJjEpPT0wKT8obT1jW3U+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKChhW24+PjBdJjEpPT0wKXtpPWU7cmV0dXJufWw9Y1tuKzg+PjJdfDA7aWYoKGx8MCk9PTApe2k9ZTtyZXR1cm59dm4obCk7aT1lO3JldHVybn1mdW5jdGlvbiBQaChlLGYsZyxoLGosayxsKXtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MDtmPWk7aT1pKzIyNHwwO3c9ZisxOTh8MDt2PWYrMTk2fDA7bz1mKzE2fDA7cD1mKzR8MDtyPWYrMTkyfDA7dD1mKzMyfDA7cz1mO3U9ZisyOHwwO3o9Y1tnPj4yXXwwO0I9Y1toPj4yXXwwO2g9Y1tqKzQ+PjJdJjc0O2lmKChofDApPT04KXtoPTE2fWVsc2UgaWYoKGh8MCk9PTY0KXtoPTh9ZWxzZSBpZigoaHwwKT09MCl7aD0wfWVsc2V7aD0xMH1taShvLGosdyx2KTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDtoZyhwLDEwKTtpZigoYVtwPj4wXSYxKT09MCl7Qz1wKzF8MDt4PUM7Zz1wKzh8MH1lbHNle0M9cCs4fDA7eD1wKzF8MDtnPUM7Qz1jW0M+PjJdfDB9Y1tyPj4yXT1DO2Nbcz4+Ml09dDtjW3U+PjJdPTA7aj1wKzR8MDt5PWFbdj4+MF18MDt2PXArOHwwO2E6d2hpbGUoMSl7aWYoKHp8MCkhPTApe2lmKChjW3orMTI+PjJdfDApPT0oY1t6KzE2Pj4yXXwwKSl7Rj0ob2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwKT09LTE7ej1GPzA6en19ZWxzZXt6PTB9QT0oenwwKT09MDtkb3tpZigoQnwwKSE9MCl7aWYoKGNbQisxMj4+Ml18MCkhPShjW0IrMTY+PjJdfDApKXtpZihBKXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MCk9PS0xKSl7aWYoIUEpe2JyZWFrIGF9fWVsc2V7bT0xOX19ZWxzZXttPTE5fX13aGlsZSgwKTtpZigobXwwKT09MTkpe209MDtpZihBKXtCPTA7YnJlYWt9ZWxzZXtCPTB9fUU9YVtwPj4wXXwwO0Q9KEUmMSk9PTA7aWYoRCl7Rj0oRSYyNTUpPj4+MX1lbHNle0Y9Y1tqPj4yXXwwfWlmKCgoY1tyPj4yXXwwKS1DfDApPT0oRnwwKSl7aWYoRCl7Qz0oRSYyNTUpPj4+MTtGPShFJjI1NSk+Pj4xO0U9Qzw8MX1lbHNle0M9Y1tqPj4yXXwwO0Y9Y1tqPj4yXXwwO0U9Qzw8MX1kb3tpZighKEY+Pj4wPEU+Pj4wKSl7aWYoRCl7YVtwK0UrMT4+MF09MDthW3A+PjBdPUM8PDI7YnJlYWt9ZWxzZXthWyhjW3Y+PjJdfDApK0U+PjBdPTA7Y1tqPj4yXT1FO2JyZWFrfX1lbHNle2hnKHAsRS1GfDApfX13aGlsZSgwKTtGPWFbcD4+MF18MDtpZigoRiYxKT09MCl7RT0xMH1lbHNle0U9Y1twPj4yXXwwO0Y9RSYyNTU7RT0oRSYtMikrIC0xfDB9RD0oRiYxKT09MDtpZihEKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW2o+PjJdfDB9ZG97aWYoIShGPj4+MDxFPj4+MCkpe2lmKEQpe2FbcCtFKzE+PjBdPTA7YVtwPj4wXT1FPDwxO2JyZWFrfWVsc2V7YVsoY1t2Pj4yXXwwKStFPj4wXT0wO2Nbaj4+Ml09RTticmVha319ZWxzZXtoZyhwLEUtRnwwKX19d2hpbGUoMCk7aWYoKGFbcD4+MF0mMSk9PTApe0Q9eH1lbHNle0Q9Y1tnPj4yXXwwfWNbcj4+Ml09RCtDO0M9RH1FPXorMTJ8MDtGPWNbRT4+Ml18MDtEPXorMTZ8MDtpZigoRnwwKT09KGNbRD4+Ml18MCkpe0Y9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7Rj1kW0Y+PjBdfDB9aWYoKFhoKEYmMjU1LGgsQyxyLHUseSxvLHQscyx3KXwwKSE9MCl7YnJlYWt9QT1jW0U+PjJdfDA7aWYoKEF8MCk9PShjW0Q+PjJdfDApKXtvY1tjWyhjW3o+PjJdfDApKzQwPj4yXSYxMjddKHopfDA7Y29udGludWV9ZWxzZXtjW0U+PjJdPUErMTtjb250aW51ZX19dz1hW28+PjBdfDA7aWYoKHcmMSk9PTApe3c9KHcmMjU1KT4+PjF9ZWxzZXt3PWNbbys0Pj4yXXwwfWlmKCh3fDApIT0wPyhxPWNbcz4+Ml18MCwocS10fDApPDE2MCk6MCl7Rj1jW3U+PjJdfDA7Y1tzPj4yXT1xKzQ7Y1txPj4yXT1GfWJbbD4+MV09TG0oQyxjW3I+PjJdfDAsayxoKXwwO3FrKG8sdCxjW3M+PjJdfDAsayk7aWYoIUEpe2lmKChjW3orMTI+PjJdfDApPT0oY1t6KzE2Pj4yXXwwKSl7Rj0ob2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwKT09LTE7ej1GPzA6en19ZWxzZXt6PTB9cT0oenwwKT09MDtkb3tpZigoQnwwKSE9MCl7aWYoKGNbQisxMj4+Ml18MCkhPShjW0IrMTY+PjJdfDApKXtpZihxKXticmVha31lbHNle209NzE7YnJlYWt9fWlmKCEoKG9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MCk9PS0xKSl7aWYoIXEpe209NzF9fWVsc2V7bT02OX19ZWxzZXttPTY5fX13aGlsZSgwKTtpZigobXwwKT09Njk/cTowKXttPTcxfWlmKChtfDApPT03MSl7Y1trPj4yXT1jW2s+PjJdfDJ9Y1tlPj4yXT16O2lmKCEoKGFbcD4+MF0mMSk9PTApPyhuPWNbdj4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoKGFbbz4+MF0mMSk9PTApe2k9ZjtyZXR1cm59bT1jW28rOD4+Ml18MDtpZigobXwwKT09MCl7aT1mO3JldHVybn12bihtKTtpPWY7cmV0dXJufWZ1bmN0aW9uIFFoKGIsZSxmLGcsaCxqLGspe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wO2U9aTtpPWkrMjI0fDA7dj1lKzE5OHwwO3U9ZSsxOTZ8MDtuPWUrMTZ8MDtvPWUrNHwwO3E9ZSsxOTJ8MDtzPWUrMzJ8MDtyPWU7dD1lKzI4fDA7eT1jW2Y+PjJdfDA7QT1jW2c+PjJdfDA7Zz1jW2grND4+Ml0mNzQ7aWYoKGd8MCk9PTY0KXtnPTh9ZWxzZSBpZigoZ3wwKT09OCl7Zz0xNn1lbHNlIGlmKChnfDApPT0wKXtnPTB9ZWxzZXtnPTEwfW1pKG4saCx2LHUpO2NbbyswPj4yXT0wO2Nbbys0Pj4yXT0wO2Nbbys4Pj4yXT0wO2hnKG8sMTApO2lmKChhW28+PjBdJjEpPT0wKXtCPW8rMXwwO3c9QjtmPW8rOHwwfWVsc2V7Qj1vKzh8MDt3PW8rMXwwO2Y9QjtCPWNbQj4+Ml18MH1jW3E+PjJdPUI7Y1tyPj4yXT1zO2NbdD4+Ml09MDtoPW8rNHwwO3g9YVt1Pj4wXXwwO3U9bys4fDA7YTp3aGlsZSgxKXtpZigoeXwwKSE9MCl7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH16PSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHope2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZigheil7YnJlYWsgYX19ZWxzZXtsPTE5fX1lbHNle2w9MTl9fXdoaWxlKDApO2lmKChsfDApPT0xOSl7bD0wO2lmKHope0E9MDticmVha31lbHNle0E9MH19RD1hW28+PjBdfDA7Qz0oRCYxKT09MDtpZihDKXtFPShEJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9aWYoKChjW3E+PjJdfDApLUJ8MCk9PShFfDApKXtpZihDKXtCPShEJjI1NSk+Pj4xO0U9KEQmMjU1KT4+PjE7RD1CPDwxfWVsc2V7Qj1jW2g+PjJdfDA7RT1jW2g+PjJdfDA7RD1CPDwxfWRve2lmKCEoRT4+PjA8RD4+PjApKXtpZihDKXthW28rRCsxPj4wXT0wO2Fbbz4+MF09Qjw8MjticmVha31lbHNle2FbKGNbdT4+Ml18MCkrRD4+MF09MDtjW2g+PjJdPUQ7YnJlYWt9fWVsc2V7aGcobyxELUV8MCl9fXdoaWxlKDApO0U9YVtvPj4wXXwwO2lmKChFJjEpPT0wKXtEPTEwfWVsc2V7RD1jW28+PjJdfDA7RT1EJjI1NTtEPShEJi0yKSsgLTF8MH1DPShFJjEpPT0wO2lmKEMpe0U9KEUmMjU1KT4+PjF9ZWxzZXtFPWNbaD4+Ml18MH1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUQ8PDE7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz13fWVsc2V7Qz1jW2Y+PjJdfDB9Y1txPj4yXT1DK0I7Qj1DfUQ9eSsxMnwwO0U9Y1tEPj4yXXwwO0M9eSsxNnwwO2lmKChFfDApPT0oY1tDPj4yXXwwKSl7RT1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXtFPWRbRT4+MF18MH1pZigoWGgoRSYyNTUsZyxCLHEsdCx4LG4scyxyLHYpfDApIT0wKXticmVha316PWNbRD4+Ml18MDtpZigoenwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbeT4+Ml18MCkrNDA+PjJdJjEyN10oeSl8MDtjb250aW51ZX1lbHNle2NbRD4+Ml09eisxO2NvbnRpbnVlfX12PWFbbj4+MF18MDtpZigodiYxKT09MCl7dj0odiYyNTUpPj4+MX1lbHNle3Y9Y1tuKzQ+PjJdfDB9aWYoKHZ8MCkhPTA/KHA9Y1tyPj4yXXwwLChwLXN8MCk8MTYwKTowKXtFPWNbdD4+Ml18MDtjW3I+PjJdPXArNDtjW3A+PjJdPUV9Y1trPj4yXT1LbShCLGNbcT4+Ml18MCxqLGcpfDA7cWsobixzLGNbcj4+Ml18MCxqKTtpZigheil7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH1wPSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHApe2JyZWFrfWVsc2V7bD03MTticmVha319aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZighcCl7bD03MX19ZWxzZXtsPTY5fX1lbHNle2w9Njl9fXdoaWxlKDApO2lmKChsfDApPT02OT9wOjApe2w9NzF9aWYoKGx8MCk9PTcxKXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPXk7aWYoISgoYVtvPj4wXSYxKT09MCk/KG09Y1t1Pj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZigoYVtuPj4wXSYxKT09MCl7aT1lO3JldHVybn1sPWNbbis4Pj4yXXwwO2lmKChsfDApPT0wKXtpPWU7cmV0dXJufXZuKGwpO2k9ZTtyZXR1cm59ZnVuY3Rpb24gUmgoYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTA7ZT1pO2k9aSsyMjR8MDt2PWUrMTk4fDA7dT1lKzE5NnwwO249ZSsxNnwwO289ZSs0fDA7cT1lKzE5MnwwO3M9ZSszMnwwO3I9ZTt0PWUrMjh8MDt5PWNbZj4+Ml18MDtBPWNbZz4+Ml18MDtnPWNbaCs0Pj4yXSY3NDtpZigoZ3wwKT09OCl7Zz0xNn1lbHNlIGlmKChnfDApPT0wKXtnPTB9ZWxzZSBpZigoZ3wwKT09NjQpe2c9OH1lbHNle2c9MTB9bWkobixoLHYsdSk7Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTA7aGcobywxMCk7aWYoKGFbbz4+MF0mMSk9PTApe0I9bysxfDA7dz1CO2Y9bys4fDB9ZWxzZXtCPW8rOHwwO3c9bysxfDA7Zj1CO0I9Y1tCPj4yXXwwfWNbcT4+Ml09QjtjW3I+PjJdPXM7Y1t0Pj4yXT0wO2g9bys0fDA7eD1hW3U+PjBdfDA7dT1vKzh8MDthOndoaWxlKDEpe2lmKCh5fDApIT0wKXtpZigoY1t5KzEyPj4yXXwwKT09KGNbeSsxNj4+Ml18MCkpe0U9KG9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MCk9PS0xO3k9RT8wOnl9fWVsc2V7eT0wfXo9KHl8MCk9PTA7ZG97aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApIT0oY1tBKzE2Pj4yXXwwKSl7aWYoeil7YnJlYWt9ZWxzZXticmVhayBhfX1pZighKChvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMSkpe2lmKCF6KXticmVhayBhfX1lbHNle2w9MTl9fWVsc2V7bD0xOX19d2hpbGUoMCk7aWYoKGx8MCk9PTE5KXtsPTA7aWYoeil7QT0wO2JyZWFrfWVsc2V7QT0wfX1EPWFbbz4+MF18MDtDPShEJjEpPT0wO2lmKEMpe0U9KEQmMjU1KT4+PjF9ZWxzZXtFPWNbaD4+Ml18MH1pZigoKGNbcT4+Ml18MCktQnwwKT09KEV8MCkpe2lmKEMpe0I9KEQmMjU1KT4+PjE7RT0oRCYyNTUpPj4+MTtEPUI8PDF9ZWxzZXtCPWNbaD4+Ml18MDtFPWNbaD4+Ml18MDtEPUI8PDF9ZG97aWYoIShFPj4+MDxEPj4+MCkpe2lmKEMpe2FbbytEKzE+PjBdPTA7YVtvPj4wXT1CPDwyO2JyZWFrfWVsc2V7YVsoY1t1Pj4yXXwwKStEPj4wXT0wO2NbaD4+Ml09RDticmVha319ZWxzZXtoZyhvLEQtRXwwKX19d2hpbGUoMCk7RT1hW28+PjBdfDA7aWYoKEUmMSk9PTApe0Q9MTB9ZWxzZXtEPWNbbz4+Ml18MDtFPUQmMjU1O0Q9KEQmLTIpKyAtMXwwfUM9KEUmMSk9PTA7aWYoQyl7RT0oRSYyNTUpPj4+MX1lbHNle0U9Y1toPj4yXXwwfWRve2lmKCEoRT4+PjA8RD4+PjApKXtpZihDKXthW28rRCsxPj4wXT0wO2Fbbz4+MF09RDw8MTticmVha31lbHNle2FbKGNbdT4+Ml18MCkrRD4+MF09MDtjW2g+PjJdPUQ7YnJlYWt9fWVsc2V7aGcobyxELUV8MCl9fXdoaWxlKDApO2lmKChhW28+PjBdJjEpPT0wKXtDPXd9ZWxzZXtDPWNbZj4+Ml18MH1jW3E+PjJdPUMrQjtCPUN9RD15KzEyfDA7RT1jW0Q+PjJdfDA7Qz15KzE2fDA7aWYoKEV8MCk9PShjW0M+PjJdfDApKXtFPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle0U9ZFtFPj4wXXwwfWlmKChYaChFJjI1NSxnLEIscSx0LHgsbixzLHIsdil8MCkhPTApe2JyZWFrfXo9Y1tEPj4yXXwwO2lmKCh6fDApPT0oY1tDPj4yXXwwKSl7b2NbY1soY1t5Pj4yXXwwKSs0MD4+Ml0mMTI3XSh5KXwwO2NvbnRpbnVlfWVsc2V7Y1tEPj4yXT16KzE7Y29udGludWV9fXY9YVtuPj4wXXwwO2lmKCh2JjEpPT0wKXt2PSh2JjI1NSk+Pj4xfWVsc2V7dj1jW24rND4+Ml18MH1pZigodnwwKSE9MD8ocD1jW3I+PjJdfDAsKHAtc3wwKTwxNjApOjApe0U9Y1t0Pj4yXXwwO2Nbcj4+Ml09cCs0O2NbcD4+Ml09RX1jW2s+PjJdPUptKEIsY1txPj4yXXwwLGosZyl8MDtxayhuLHMsY1tyPj4yXXwwLGopO2lmKCF6KXtpZigoY1t5KzEyPj4yXXwwKT09KGNbeSsxNj4+Ml18MCkpe0U9KG9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MCk9PS0xO3k9RT8wOnl9fWVsc2V7eT0wfXA9KHl8MCk9PTA7ZG97aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApIT0oY1tBKzE2Pj4yXXwwKSl7aWYocCl7YnJlYWt9ZWxzZXtsPTcxO2JyZWFrfX1pZighKChvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMSkpe2lmKCFwKXtsPTcxfX1lbHNle2w9Njl9fWVsc2V7bD02OX19d2hpbGUoMCk7aWYoKGx8MCk9PTY5P3A6MCl7bD03MX1pZigobHwwKT09NzEpe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09eTtpZighKChhW28+PjBdJjEpPT0wKT8obT1jW3U+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKChhW24+PjBdJjEpPT0wKXtpPWU7cmV0dXJufWw9Y1tuKzg+PjJdfDA7aWYoKGx8MCk9PTApe2k9ZTtyZXR1cm59dm4obCk7aT1lO3JldHVybn1mdW5jdGlvbiBTaChiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MDtlPWk7aT1pKzIyNHwwO3Y9ZSsxOTh8MDt1PWUrMTk2fDA7bj1lKzE2fDA7bz1lKzR8MDtxPWUrMTkyfDA7cz1lKzMyfDA7cj1lO3Q9ZSsyOHwwO3k9Y1tmPj4yXXwwO0E9Y1tnPj4yXXwwO2c9Y1toKzQ+PjJdJjc0O2lmKChnfDApPT0wKXtnPTB9ZWxzZSBpZigoZ3wwKT09OCl7Zz0xNn1lbHNlIGlmKChnfDApPT02NCl7Zz04fWVsc2V7Zz0xMH1taShuLGgsdix1KTtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtoZyhvLDEwKTtpZigoYVtvPj4wXSYxKT09MCl7Qj1vKzF8MDt3PUI7Zj1vKzh8MH1lbHNle0I9bys4fDA7dz1vKzF8MDtmPUI7Qj1jW0I+PjJdfDB9Y1txPj4yXT1CO2Nbcj4+Ml09cztjW3Q+PjJdPTA7aD1vKzR8MDt4PWFbdT4+MF18MDt1PW8rOHwwO2E6d2hpbGUoMSl7aWYoKHl8MCkhPTApe2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RT0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7eT1FPzA6eX19ZWxzZXt5PTB9ej0oeXwwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZih6KXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xKSl7aWYoIXope2JyZWFrIGF9fWVsc2V7bD0xOX19ZWxzZXtsPTE5fX13aGlsZSgwKTtpZigobHwwKT09MTkpe2w9MDtpZih6KXtBPTA7YnJlYWt9ZWxzZXtBPTB9fUQ9YVtvPj4wXXwwO0M9KEQmMSk9PTA7aWYoQyl7RT0oRCYyNTUpPj4+MX1lbHNle0U9Y1toPj4yXXwwfWlmKCgoY1txPj4yXXwwKS1CfDApPT0oRXwwKSl7aWYoQyl7Qj0oRCYyNTUpPj4+MTtFPShEJjI1NSk+Pj4xO0Q9Qjw8MX1lbHNle0I9Y1toPj4yXXwwO0U9Y1toPj4yXXwwO0Q9Qjw8MX1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUI8PDI7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtFPWFbbz4+MF18MDtpZigoRSYxKT09MCl7RD0xMH1lbHNle0Q9Y1tvPj4yXXwwO0U9RCYyNTU7RD0oRCYtMikrIC0xfDB9Qz0oRSYxKT09MDtpZihDKXtFPShFJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9ZG97aWYoIShFPj4+MDxEPj4+MCkpe2lmKEMpe2FbbytEKzE+PjBdPTA7YVtvPj4wXT1EPDwxO2JyZWFrfWVsc2V7YVsoY1t1Pj4yXXwwKStEPj4wXT0wO2NbaD4+Ml09RDticmVha319ZWxzZXtoZyhvLEQtRXwwKX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9d31lbHNle0M9Y1tmPj4yXXwwfWNbcT4+Ml09QytCO0I9Q31EPXkrMTJ8MDtFPWNbRD4+Ml18MDtDPXkrMTZ8MDtpZigoRXwwKT09KGNbQz4+Ml18MCkpe0U9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7RT1kW0U+PjBdfDB9aWYoKFhoKEUmMjU1LGcsQixxLHQseCxuLHMscix2KXwwKSE9MCl7YnJlYWt9ej1jW0Q+PjJdfDA7aWYoKHp8MCk9PShjW0M+PjJdfDApKXtvY1tjWyhjW3k+PjJdfDApKzQwPj4yXSYxMjddKHkpfDA7Y29udGludWV9ZWxzZXtjW0Q+PjJdPXorMTtjb250aW51ZX19dj1hW24+PjBdfDA7aWYoKHYmMSk9PTApe3Y9KHYmMjU1KT4+PjF9ZWxzZXt2PWNbbis0Pj4yXXwwfWlmKCh2fDApIT0wPyhwPWNbcj4+Ml18MCwocC1zfDApPDE2MCk6MCl7RT1jW3Q+PjJdfDA7Y1tyPj4yXT1wKzQ7Y1twPj4yXT1FfUQ9SW0oQixjW3E+PjJdfDAsaixnKXwwO0U9aztjW0U+PjJdPUQ7Y1tFKzQ+PjJdPUk7cWsobixzLGNbcj4+Ml18MCxqKTtpZigheil7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH1wPSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHApe2JyZWFrfWVsc2V7bD03MTticmVha319aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZighcCl7bD03MX19ZWxzZXtsPTY5fX1lbHNle2w9Njl9fXdoaWxlKDApO2lmKChsfDApPT02OT9wOjApe2w9NzF9aWYoKGx8MCk9PTcxKXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPXk7aWYoISgoYVtvPj4wXSYxKT09MCk/KG09Y1t1Pj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZigoYVtuPj4wXSYxKT09MCl7aT1lO3JldHVybn1sPWNbbis4Pj4yXXwwO2lmKChsfDApPT0wKXtpPWU7cmV0dXJufXZuKGwpO2k9ZTtyZXR1cm59ZnVuY3Rpb24gVGgoYixlLGYsaCxqLGssbCl7Yj1ifDA7ZT1lfDA7Zj1mfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7dmFyIG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MDtlPWk7aT1pKzI1NnwwO3g9ZSsyMDh8MDt6PWUrMjAwfDA7dz1lKzI0MHwwO289ZTtwPWUrMTg4fDA7dj1lKzE4NHwwO3Q9ZSsxNnwwO3M9ZSsxNzZ8MDtyPWUrMTgwfDA7dT1lKzI0MXwwO3k9ZSsyNDJ8MDtBPWNbZj4+Ml18MDtEPWNbaD4+Ml18MDtuaShvLGoseCx6LHcpO2NbcCswPj4yXT0wO2NbcCs0Pj4yXT0wO2NbcCs4Pj4yXT0wO2hnKHAsMTApO2lmKChhW3A+PjBdJjEpPT0wKXtFPXArMXwwO2g9RTtmPXArOHwwfWVsc2V7RT1wKzh8MDtoPXArMXwwO2Y9RTtFPWNbRT4+Ml18MH1jW3Y+PjJdPUU7Y1tzPj4yXT10O2Nbcj4+Ml09MDthW3U+PjBdPTE7YVt5Pj4wXT02OTtqPXArNHwwO3o9YVt6Pj4wXXwwO0I9YVt3Pj4wXXwwO3c9cCs4fDA7YTp3aGlsZSgxKXtpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCk9PShjW0ErMTY+PjJdfDApKXtIPShvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMTtBPUg/MDpBfX1lbHNle0E9MH1DPShBfDApPT0wO2Rve2lmKChEfDApIT0wKXtpZigoY1tEKzEyPj4yXXwwKSE9KGNbRCsxNj4+Ml18MCkpe2lmKEMpe2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tEPj4yXXwwKSszNj4+Ml0mMTI3XShEKXwwKT09LTEpKXtpZighQyl7YnJlYWsgYX19ZWxzZXttPTE1fX1lbHNle209MTV9fXdoaWxlKDApO2lmKChtfDApPT0xNSl7bT0wO2lmKEMpe0Q9MDticmVha31lbHNle0Q9MH19Rz1hW3A+PjBdfDA7Rj0oRyYxKT09MDtpZihGKXtIPShHJjI1NSk+Pj4xfWVsc2V7SD1jW2o+PjJdfDB9aWYoKChjW3Y+PjJdfDApLUV8MCk9PShIfDApKXtpZihGKXtFPShHJjI1NSk+Pj4xO0c9KEcmMjU1KT4+PjE7SD1FPDwxfWVsc2V7RT1jW2o+PjJdfDA7Rz1jW2o+PjJdfDA7SD1FPDwxfWRve2lmKCEoRz4+PjA8SD4+PjApKXtpZihGKXthW3ArSCsxPj4wXT0wO2FbcD4+MF09RTw8MjticmVha31lbHNle2FbKGNbdz4+Ml18MCkrSD4+MF09MDtjW2o+PjJdPUg7YnJlYWt9fWVsc2V7aGcocCxILUd8MCl9fXdoaWxlKDApO0g9YVtwPj4wXXwwO2lmKChIJjEpPT0wKXtHPTEwfWVsc2V7Rz1jW3A+PjJdfDA7SD1HJjI1NTtHPShHJi0yKSsgLTF8MH1GPShIJjEpPT0wO2lmKEYpe0g9KEgmMjU1KT4+PjF9ZWxzZXtIPWNbaj4+Ml18MH1kb3tpZighKEg+Pj4wPEc+Pj4wKSl7aWYoRil7YVtwK0crMT4+MF09MDthW3A+PjBdPUc8PDE7YnJlYWt9ZWxzZXthWyhjW3c+PjJdfDApK0c+PjBdPTA7Y1tqPj4yXT1HO2JyZWFrfX1lbHNle2hnKHAsRy1IfDApfX13aGlsZSgwKTtpZigoYVtwPj4wXSYxKT09MCl7Rj1ofWVsc2V7Rj1jW2Y+PjJdfDB9Y1t2Pj4yXT1GK0U7RT1GfUc9QSsxMnwwO0g9Y1tHPj4yXXwwO0Y9QSsxNnwwO2lmKChIfDApPT0oY1tGPj4yXXwwKSl7SD1vY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDB9ZWxzZXtIPWRbSD4+MF18MH1pZigob2koSCYyNTUsdSx5LEUsdix6LEIsbyx0LHMscix4KXwwKSE9MCl7YnJlYWt9Qz1jW0c+PjJdfDA7aWYoKEN8MCk9PShjW0Y+PjJdfDApKXtvY1tjWyhjW0E+PjJdfDApKzQwPj4yXSYxMjddKEEpfDA7Y29udGludWV9ZWxzZXtjW0c+PjJdPUMrMTtjb250aW51ZX19eD1hW28+PjBdfDA7aWYoKHgmMSk9PTApe3g9KHgmMjU1KT4+PjF9ZWxzZXt4PWNbbys0Pj4yXXwwfWlmKCgoeHwwKSE9MD8oYVt1Pj4wXXwwKSE9MDowKT8ocT1jW3M+PjJdfDAsKHEtdHwwKTwxNjApOjApe0g9Y1tyPj4yXXwwO2Nbcz4+Ml09cSs0O2NbcT4+Ml09SH1nW2w+PjJdPStIbShFLGNbdj4+Ml18MCxrKTtxayhvLHQsY1tzPj4yXXwwLGspO2lmKCFDKXtpZigoY1tBKzEyPj4yXXwwKT09KGNbQSsxNj4+Ml18MCkpe0g9KG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xO0E9SD8wOkF9fWVsc2V7QT0wfWw9KEF8MCk9PTA7ZG97aWYoKER8MCkhPTApe2lmKChjW0QrMTI+PjJdfDApIT0oY1tEKzE2Pj4yXXwwKSl7aWYobCl7YnJlYWt9ZWxzZXttPTY4O2JyZWFrfX1pZighKChvY1tjWyhjW0Q+PjJdfDApKzM2Pj4yXSYxMjddKEQpfDApPT0tMSkpe2lmKCFsKXttPTY4fX1lbHNle209NjZ9fWVsc2V7bT02Nn19d2hpbGUoMCk7aWYoKG18MCk9PTY2P2w6MCl7bT02OH1pZigobXwwKT09Njgpe2Nbaz4+Ml09Y1trPj4yXXwyfWNbYj4+Ml09QTtpZighKChhW3A+PjBdJjEpPT0wKT8obj1jW3c+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKChhW28+PjBdJjEpPT0wKXtpPWU7cmV0dXJufW09Y1tvKzg+PjJdfDA7aWYoKG18MCk9PTApe2k9ZTtyZXR1cm59dm4obSk7aT1lO3JldHVybn1mdW5jdGlvbiBVaChiLGUsZixnLGosayxsKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wO2U9aTtpPWkrMjU2fDA7eD1lKzIwOHwwO3o9ZSsyMDB8MDt3PWUrMjQwfDA7bz1lO3A9ZSsxODh8MDt2PWUrMTg0fDA7dD1lKzE2fDA7cz1lKzE3NnwwO3I9ZSsxODB8MDt1PWUrMjQxfDA7eT1lKzI0MnwwO0E9Y1tmPj4yXXwwO0Q9Y1tnPj4yXXwwO25pKG8saix4LHosdyk7Y1twKzA+PjJdPTA7Y1twKzQ+PjJdPTA7Y1twKzg+PjJdPTA7aGcocCwxMCk7aWYoKGFbcD4+MF0mMSk9PTApe0U9cCsxfDA7Zz1FO2Y9cCs4fDB9ZWxzZXtFPXArOHwwO2c9cCsxfDA7Zj1FO0U9Y1tFPj4yXXwwfWNbdj4+Ml09RTtjW3M+PjJdPXQ7Y1tyPj4yXT0wO2FbdT4+MF09MTthW3k+PjBdPTY5O2o9cCs0fDA7ej1hW3o+PjBdfDA7Qj1hW3c+PjBdfDA7dz1wKzh8MDthOndoaWxlKDEpe2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKT09KGNbQSsxNj4+Ml18MCkpe0g9KG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xO0E9SD8wOkF9fWVsc2V7QT0wfUM9KEF8MCk9PTA7ZG97aWYoKER8MCkhPTApe2lmKChjW0QrMTI+PjJdfDApIT0oY1tEKzE2Pj4yXXwwKSl7aWYoQyl7YnJlYWt9ZWxzZXticmVhayBhfX1pZighKChvY1tjWyhjW0Q+PjJdfDApKzM2Pj4yXSYxMjddKEQpfDApPT0tMSkpe2lmKCFDKXticmVhayBhfX1lbHNle209MTV9fWVsc2V7bT0xNX19d2hpbGUoMCk7aWYoKG18MCk9PTE1KXttPTA7aWYoQyl7RD0wO2JyZWFrfWVsc2V7RD0wfX1HPWFbcD4+MF18MDtGPShHJjEpPT0wO2lmKEYpe0g9KEcmMjU1KT4+PjF9ZWxzZXtIPWNbaj4+Ml18MH1pZigoKGNbdj4+Ml18MCktRXwwKT09KEh8MCkpe2lmKEYpe0U9KEcmMjU1KT4+PjE7Rz0oRyYyNTUpPj4+MTtIPUU8PDF9ZWxzZXtFPWNbaj4+Ml18MDtHPWNbaj4+Ml18MDtIPUU8PDF9ZG97aWYoIShHPj4+MDxIPj4+MCkpe2lmKEYpe2FbcCtIKzE+PjBdPTA7YVtwPj4wXT1FPDwyO2JyZWFrfWVsc2V7YVsoY1t3Pj4yXXwwKStIPj4wXT0wO2Nbaj4+Ml09SDticmVha319ZWxzZXtoZyhwLEgtR3wwKX19d2hpbGUoMCk7SD1hW3A+PjBdfDA7aWYoKEgmMSk9PTApe0c9MTB9ZWxzZXtHPWNbcD4+Ml18MDtIPUcmMjU1O0c9KEcmLTIpKyAtMXwwfUY9KEgmMSk9PTA7aWYoRil7SD0oSCYyNTUpPj4+MX1lbHNle0g9Y1tqPj4yXXwwfWRve2lmKCEoSD4+PjA8Rz4+PjApKXtpZihGKXthW3ArRysxPj4wXT0wO2FbcD4+MF09Rzw8MTticmVha31lbHNle2FbKGNbdz4+Ml18MCkrRz4+MF09MDtjW2o+PjJdPUc7YnJlYWt9fWVsc2V7aGcocCxHLUh8MCl9fXdoaWxlKDApO2lmKChhW3A+PjBdJjEpPT0wKXtGPWd9ZWxzZXtGPWNbZj4+Ml18MH1jW3Y+PjJdPUYrRTtFPUZ9Rz1BKzEyfDA7SD1jW0c+PjJdfDA7Rj1BKzE2fDA7aWYoKEh8MCk9PShjW0Y+PjJdfDApKXtIPW9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MH1lbHNle0g9ZFtIPj4wXXwwfWlmKChvaShIJjI1NSx1LHksRSx2LHosQixvLHQscyxyLHgpfDApIT0wKXticmVha31DPWNbRz4+Ml18MDtpZigoQ3wwKT09KGNbRj4+Ml18MCkpe29jW2NbKGNbQT4+Ml18MCkrNDA+PjJdJjEyN10oQSl8MDtjb250aW51ZX1lbHNle2NbRz4+Ml09QysxO2NvbnRpbnVlfX14PWFbbz4+MF18MDtpZigoeCYxKT09MCl7eD0oeCYyNTUpPj4+MX1lbHNle3g9Y1tvKzQ+PjJdfDB9aWYoKCh4fDApIT0wPyhhW3U+PjBdfDApIT0wOjApPyhxPWNbcz4+Ml18MCwocS10fDApPDE2MCk6MCl7SD1jW3I+PjJdfDA7Y1tzPj4yXT1xKzQ7Y1txPj4yXT1IfWhbbD4+M109K0dtKEUsY1t2Pj4yXXwwLGspO3FrKG8sdCxjW3M+PjJdfDAsayk7aWYoIUMpe2lmKChjW0ErMTI+PjJdfDApPT0oY1tBKzE2Pj4yXXwwKSl7SD0ob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTE7QT1IPzA6QX19ZWxzZXtBPTB9bD0oQXwwKT09MDtkb3tpZigoRHwwKSE9MCl7aWYoKGNbRCsxMj4+Ml18MCkhPShjW0QrMTY+PjJdfDApKXtpZihsKXticmVha31lbHNle209Njg7YnJlYWt9fWlmKCEoKG9jW2NbKGNbRD4+Ml18MCkrMzY+PjJdJjEyN10oRCl8MCk9PS0xKSl7aWYoIWwpe209Njh9fWVsc2V7bT02Nn19ZWxzZXttPTY2fX13aGlsZSgwKTtpZigobXwwKT09NjY/bDowKXttPTY4fWlmKChtfDApPT02OCl7Y1trPj4yXT1jW2s+PjJdfDJ9Y1tiPj4yXT1BO2lmKCEoKGFbcD4+MF0mMSk9PTApPyhuPWNbdz4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoKGFbbz4+MF0mMSk9PTApe2k9ZTtyZXR1cm59bT1jW28rOD4+Ml18MDtpZigobXwwKT09MCl7aT1lO3JldHVybn12bihtKTtpPWU7cmV0dXJufWZ1bmN0aW9uIFZoKGIsZSxmLGcsaixrLGwpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9anwwO2s9a3wwO2w9bHwwO3ZhciBtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTA7ZT1pO2k9aSsyNTZ8MDt4PWUrMjA4fDA7ej1lKzIwMHwwO3c9ZSsyNDB8MDtvPWU7cD1lKzE4OHwwO3Y9ZSsxODR8MDt0PWUrMTZ8MDtzPWUrMTc2fDA7cj1lKzE4MHwwO3U9ZSsyNDF8MDt5PWUrMjQyfDA7QT1jW2Y+PjJdfDA7RD1jW2c+PjJdfDA7bmkobyxqLHgseix3KTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDtoZyhwLDEwKTtpZigoYVtwPj4wXSYxKT09MCl7RT1wKzF8MDtnPUU7Zj1wKzh8MH1lbHNle0U9cCs4fDA7Zz1wKzF8MDtmPUU7RT1jW0U+PjJdfDB9Y1t2Pj4yXT1FO2Nbcz4+Ml09dDtjW3I+PjJdPTA7YVt1Pj4wXT0xO2FbeT4+MF09Njk7aj1wKzR8MDt6PWFbej4+MF18MDtCPWFbdz4+MF18MDt3PXArOHwwO2E6d2hpbGUoMSl7aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApPT0oY1tBKzE2Pj4yXXwwKSl7SD0ob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTE7QT1IPzA6QX19ZWxzZXtBPTB9Qz0oQXwwKT09MDtkb3tpZigoRHwwKSE9MCl7aWYoKGNbRCsxMj4+Ml18MCkhPShjW0QrMTY+PjJdfDApKXtpZihDKXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbRD4+Ml18MCkrMzY+PjJdJjEyN10oRCl8MCk9PS0xKSl7aWYoIUMpe2JyZWFrIGF9fWVsc2V7bT0xNX19ZWxzZXttPTE1fX13aGlsZSgwKTtpZigobXwwKT09MTUpe209MDtpZihDKXtEPTA7YnJlYWt9ZWxzZXtEPTB9fUc9YVtwPj4wXXwwO0Y9KEcmMSk9PTA7aWYoRil7SD0oRyYyNTUpPj4+MX1lbHNle0g9Y1tqPj4yXXwwfWlmKCgoY1t2Pj4yXXwwKS1FfDApPT0oSHwwKSl7aWYoRil7RT0oRyYyNTUpPj4+MTtHPShHJjI1NSk+Pj4xO0g9RTw8MX1lbHNle0U9Y1tqPj4yXXwwO0c9Y1tqPj4yXXwwO0g9RTw8MX1kb3tpZighKEc+Pj4wPEg+Pj4wKSl7aWYoRil7YVtwK0grMT4+MF09MDthW3A+PjBdPUU8PDI7YnJlYWt9ZWxzZXthWyhjW3c+PjJdfDApK0g+PjBdPTA7Y1tqPj4yXT1IO2JyZWFrfX1lbHNle2hnKHAsSC1HfDApfX13aGlsZSgwKTtIPWFbcD4+MF18MDtpZigoSCYxKT09MCl7Rz0xMH1lbHNle0c9Y1twPj4yXXwwO0g9RyYyNTU7Rz0oRyYtMikrIC0xfDB9Rj0oSCYxKT09MDtpZihGKXtIPShIJjI1NSk+Pj4xfWVsc2V7SD1jW2o+PjJdfDB9ZG97aWYoIShIPj4+MDxHPj4+MCkpe2lmKEYpe2FbcCtHKzE+PjBdPTA7YVtwPj4wXT1HPDwxO2JyZWFrfWVsc2V7YVsoY1t3Pj4yXXwwKStHPj4wXT0wO2Nbaj4+Ml09RzticmVha319ZWxzZXtoZyhwLEctSHwwKX19d2hpbGUoMCk7aWYoKGFbcD4+MF0mMSk9PTApe0Y9Z31lbHNle0Y9Y1tmPj4yXXwwfWNbdj4+Ml09RitFO0U9Rn1HPUErMTJ8MDtIPWNbRz4+Ml18MDtGPUErMTZ8MDtpZigoSHwwKT09KGNbRj4+Ml18MCkpe0g9b2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwfWVsc2V7SD1kW0g+PjBdfDB9aWYoKG9pKEgmMjU1LHUseSxFLHYseixCLG8sdCxzLHIseCl8MCkhPTApe2JyZWFrfUM9Y1tHPj4yXXwwO2lmKChDfDApPT0oY1tGPj4yXXwwKSl7b2NbY1soY1tBPj4yXXwwKSs0MD4+Ml0mMTI3XShBKXwwO2NvbnRpbnVlfWVsc2V7Y1tHPj4yXT1DKzE7Y29udGludWV9fXg9YVtvPj4wXXwwO2lmKCh4JjEpPT0wKXt4PSh4JjI1NSk+Pj4xfWVsc2V7eD1jW28rND4+Ml18MH1pZigoKHh8MCkhPTA/KGFbdT4+MF18MCkhPTA6MCk/KHE9Y1tzPj4yXXwwLChxLXR8MCk8MTYwKTowKXtIPWNbcj4+Ml18MDtjW3M+PjJdPXErNDtjW3E+PjJdPUh9aFtsPj4zXT0rRm0oRSxjW3Y+PjJdfDAsayk7cWsobyx0LGNbcz4+Ml18MCxrKTtpZighQyl7aWYoKGNbQSsxMj4+Ml18MCk9PShjW0ErMTY+PjJdfDApKXtIPShvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMTtBPUg/MDpBfX1lbHNle0E9MH1sPShBfDApPT0wO2Rve2lmKChEfDApIT0wKXtpZigoY1tEKzEyPj4yXXwwKSE9KGNbRCsxNj4+Ml18MCkpe2lmKGwpe2JyZWFrfWVsc2V7bT02ODticmVha319aWYoISgob2NbY1soY1tEPj4yXXwwKSszNj4+Ml0mMTI3XShEKXwwKT09LTEpKXtpZighbCl7bT02OH19ZWxzZXttPTY2fX1lbHNle209NjZ9fXdoaWxlKDApO2lmKChtfDApPT02Nj9sOjApe209Njh9aWYoKG18MCk9PTY4KXtjW2s+PjJdPWNbaz4+Ml18Mn1jW2I+PjJdPUE7aWYoISgoYVtwPj4wXSYxKT09MCk/KG49Y1t3Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZigoYVtvPj4wXSYxKT09MCl7aT1lO3JldHVybn1tPWNbbys4Pj4yXXwwO2lmKChtfDApPT0wKXtpPWU7cmV0dXJufXZuKG0pO2k9ZTtyZXR1cm59ZnVuY3Rpb24gV2goYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtlPWk7aT1pKzIyNHwwO249ZTtvPWUrMTg4fDA7bT1lKzE3NnwwO3c9ZSsxNnwwO3E9Y1toKzI4Pj4yXXwwO0Q9cSs0fDA7Y1tEPj4yXT0oY1tEPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tuPj4yXT0xMzQ1NjtjW24rND4+Ml09MjA4O2Nbbis4Pj4yXT0wO2NnKDEzNDU2LG4pfWg9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3I9Y1txKzg+PjJdfDA7aWYoKGNbcSsxMj4+Ml18MCktcj4+Mj4+PjA+aD4+PjA/KHA9Y1tyKyhoPDwyKT4+Ml18MCwocHwwKSE9MCk6MCl7dWNbY1soY1twPj4yXXwwKSszMj4+Ml0mMzFdKHAsMTIwMTYsMTIwNDJ8MCxvKXwwO0M9cSs0fDA7RD1jW0M+PjJdfDA7Y1tDPj4yXT1EKyAtMTtpZigoRHwwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfWNbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2hnKG0sMTApO2lmKChhW20+PjBdJjEpPT0wKXt6PW0rMXwwO2g9ejtxPW0rOHwwfWVsc2V7ej1tKzh8MDtoPW0rMXwwO3E9ejt6PWNbej4+Ml18MH11PW0rNHwwO3Y9bysyNHwwO3M9bysyNXwwO3Q9bysyNnwwO3I9bztwPW0rOHwwO3k9Y1tmPj4yXXwwO3g9MDtBPXo7YTp3aGlsZSgxKXtpZigoeXwwKSE9MCl7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApPyhvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTowKXtjW2Y+PjJdPTA7eT0wfX1lbHNle3k9MH1DPSh5fDApPT0wO0I9Y1tnPj4yXXwwO2Rve2lmKChCfDApIT0wKXtpZigoY1tCKzEyPj4yXXwwKSE9KGNbQisxNj4+Ml18MCkpe2lmKEMpe2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tCPj4yXXwwKSszNj4+Ml0mMTI3XShCKXwwKT09LTEpKXtpZihDKXticmVha31lbHNle2JyZWFrIGF9fWVsc2V7Y1tnPj4yXT0wO2w9MjY7YnJlYWt9fWVsc2V7bD0yNn19d2hpbGUoMCk7aWYoKGx8MCk9PTI2PyhsPTAsQyk6MCl7YnJlYWt9RD1hW20+PjBdfDA7Qj0oRCYxKT09MDtpZihCKXtDPShEJjI1NSk+Pj4xfWVsc2V7Qz1jW3U+PjJdfDB9aWYoKEEtenwwKT09KEN8MCkpe2lmKEIpe0E9KEQmMjU1KT4+PjE7Qz0oRCYyNTUpPj4+MTt6PUE8PDF9ZWxzZXtBPWNbdT4+Ml18MDtDPWNbdT4+Ml18MDt6PUE8PDF9ZG97aWYoIShDPj4+MDx6Pj4+MCkpe2lmKEIpe2FbbSt6KzE+PjBdPTA7YVttPj4wXT1BPDwyO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKSt6Pj4wXT0wO2NbdT4+Ml09ejticmVha319ZWxzZXtoZyhtLHotQ3wwKX19d2hpbGUoMCk7Qz1hW20+PjBdfDA7aWYoKEMmMSk9PTApe3o9MTB9ZWxzZXt6PWNbbT4+Ml18MDtDPXomMjU1O3o9KHomLTIpKyAtMXwwfUI9KEMmMSk9PTA7aWYoQil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1t1Pj4yXXwwfWRve2lmKCEoQz4+PjA8ej4+PjApKXtpZihCKXthW20reisxPj4wXT0wO2FbbT4+MF09ejw8MTticmVha31lbHNle2FbKGNbcD4+Ml18MCkrej4+MF09MDtjW3U+PjJdPXo7YnJlYWt9fWVsc2V7aGcobSx6LUN8MCl9fXdoaWxlKDApO2lmKChhW20+PjBdJjEpPT0wKXt6PWh9ZWxzZXt6PWNbcT4+Ml18MH1BPXorQXwwfUI9Y1t5KzEyPj4yXXwwO2lmKChCfDApPT0oY1t5KzE2Pj4yXXwwKSl7eT1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXt5PWRbQj4+MF18MH1CPXkmMjU1O3k9KEF8MCk9PSh6fDApO2Rve2lmKHkpe0M9KGFbdj4+MF18MCk9PUI8PDI0Pj4yNDtpZighQz8hKChhW3M+PjBdfDApPT1CPDwyND4+MjQpOjApe0M9bztsPTYxO2JyZWFrfWFbQT4+MF09Qz80Mzo0NTtBPUErMXwwO3g9MH1lbHNle0M9bztsPTYxfX13aGlsZSgwKTtkb3tpZigobHwwKT09NjEpe3doaWxlKDEpe2w9MDtpZigoYVtDPj4wXXwwKT09Qjw8MjQ+PjI0KXticmVha31DPUMrMXwwO2lmKChDfDApPT0odHwwKSl7Qz10O2JyZWFrfWVsc2V7bD02MX19Qj1DLXJ8MDtpZigoQnwwKT4yMyl7YnJlYWsgYX1pZigoQnwwKTwyMil7YVtBPj4wXT1hWzEyMDE2K0I+PjBdfDA7QT1BKzF8MDt4PXgrMXwwO2JyZWFrfWlmKHkpe3o9QTticmVhayBhfWlmKChBLXp8MCk+PTMpe2JyZWFrIGF9aWYoKGFbQSsgLTE+PjBdfDApIT00OCl7YnJlYWsgYX1hW0E+PjBdPWFbMTIwMTYrQj4+MF18MDtBPUErMXwwO3g9MH19d2hpbGUoMCk7eT1jW2Y+PjJdfDA7Qj15KzEyfDA7Qz1jW0I+PjJdfDA7aWYoKEN8MCk9PShjW3krMTY+PjJdfDApKXtvY1tjWyhjW3k+PjJdfDApKzQwPj4yXSYxMjddKHkpfDA7RD13O3c9RDtjb250aW51ZX1lbHNle2NbQj4+Ml09QysxO0Q9dzt3PUQ7Y29udGludWV9fWFbeiszPj4wXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1EPWNbMzM0MF18MDtjW24+PjJdPWs7aWYoKFloKHosRCxuKXwwKSE9MSl7Y1tqPj4yXT00fWs9Y1tmPj4yXXwwO2lmKChrfDApIT0wKXtpZigoY1trKzEyPj4yXXwwKT09KGNbaysxNj4+Ml18MCk/KG9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MCk9PS0xOjApe2NbZj4+Ml09MDtmPTB9ZWxzZXtmPWt9fWVsc2V7Zj0wfWs9KGZ8MCk9PTA7bj1jW2c+PjJdfDA7ZG97aWYoKG58MCkhPTApe2lmKChjW24rMTI+PjJdfDApIT0oY1tuKzE2Pj4yXXwwKSl7aWYoayl7YnJlYWt9ZWxzZXtsPTkyO2JyZWFrfX1pZighKChvY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDApPT0tMSkpe2lmKGspe2JyZWFrfWVsc2V7bD05MjticmVha319ZWxzZXtjW2c+PjJdPTA7bD05MDticmVha319ZWxzZXtsPTkwfX13aGlsZSgwKTtpZigobHwwKT09OTA/azowKXtsPTkyfWlmKChsfDApPT05Mil7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT1mO2lmKChhW20+PjBdJjEpPT0wKXtpPWU7cmV0dXJufWo9Y1twPj4yXXwwO2lmKChqfDApPT0wKXtpPWU7cmV0dXJufXZuKGopO2k9ZTtyZXR1cm59RD1YYSg0KXwwO2NbRD4+Ml09MjEzMDQ7d2IoRHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gWGgoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MDtuPWk7cD1jW2Y+PjJdfDA7bz0ocHwwKT09KGV8MCk7ZG97aWYobyl7cT0oYVttKzI0Pj4wXXwwKT09Yjw8MjQ+PjI0O2lmKCFxPyEoKGFbbSsyNT4+MF18MCk9PWI8PDI0Pj4yNCk6MCl7YnJlYWt9Y1tmPj4yXT1lKzE7YVtlPj4wXT1xPzQzOjQ1O2NbZz4+Ml09MDtxPTA7aT1uO3JldHVybiBxfDB9fXdoaWxlKDApO3E9YVtqPj4wXXwwO2lmKChxJjEpPT0wKXtqPShxJjI1NSk+Pj4xfWVsc2V7aj1jW2orND4+Ml18MH1pZigoanwwKSE9MD9iPDwyND4+MjQ9PWg8PDI0Pj4yNDowKXtvPWNbbD4+Ml18MDtpZigoby1rfDApPj0xNjApe3E9MDtpPW47cmV0dXJuIHF8MH1xPWNbZz4+Ml18MDtjW2w+PjJdPW8rNDtjW28+PjJdPXE7Y1tnPj4yXT0wO3E9MDtpPW47cmV0dXJuIHF8MH1sPW0rMjZ8MDtrPW07d2hpbGUoMSl7aWYoKGFbaz4+MF18MCk9PWI8PDI0Pj4yNCl7YnJlYWt9az1rKzF8MDtpZigoa3wwKT09KGx8MCkpe2s9bDticmVha319bT1rLW18MDtpZigobXwwKT4yMyl7cT0tMTtpPW47cmV0dXJuIHF8MH1pZigoZHwwKT09MTB8KGR8MCk9PTgpe2lmKChtfDApPj0oZHwwKSl7cT0tMTtpPW47cmV0dXJuIHF8MH19ZWxzZSBpZigoZHwwKT09MTY/KG18MCk+PTIyOjApe2lmKG8pe3E9LTE7aT1uO3JldHVybiBxfDB9aWYoKHAtZXwwKT49Myl7cT0tMTtpPW47cmV0dXJuIHF8MH1pZigoYVtwKyAtMT4+MF18MCkhPTQ4KXtxPS0xO2k9bjtyZXR1cm4gcXwwfWNbZz4+Ml09MDtxPWFbMTIwMTYrbT4+MF18MDtjW2Y+PjJdPXArMTthW3A+PjBdPXE7cT0wO2k9bjtyZXR1cm4gcXwwfXE9YVsxMjAxNittPj4wXXwwO2NbZj4+Ml09cCsxO2FbcD4+MF09cTtjW2c+PjJdPShjW2c+PjJdfDApKzE7cT0wO2k9bjtyZXR1cm4gcXwwfWZ1bmN0aW9uIFloKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MDtlPWk7aT1pKzE2fDA7Zj1lO2NbZj4+Ml09ZDtiPWliKGJ8MCl8MDthPU1hKGF8MCwxMjA1NixmfDApfDA7aWYoKGJ8MCk9PTApe2k9ZTtyZXR1cm4gYXwwfWliKGJ8MCl8MDtpPWU7cmV0dXJuIGF8MH1mdW5jdGlvbiBaaChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBfaChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gJGgoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7az1pO2k9aSs2NHwwO3A9azt1PWsrNDh8MDtxPWsrNTJ8MDt0PWsrNTZ8MDtzPWsrMTZ8MDtyPWsrMTJ8MDtsPWsrMjR8MDtpZigoY1tnKzQ+PjJdJjF8MCk9PTApe2NbcT4+Ml09LTE7bD1jWyhjW2Q+PjJdfDApKzE2Pj4yXXwwO2Nbcz4+Ml09Y1tlPj4yXTtjW3I+PjJdPWNbZj4+Ml07Y1t1KzA+PjJdPWNbcyswPj4yXTtjW3ArMD4+Ml09Y1tyKzA+PjJdO2ljW2wmNjNdKHQsZCx1LHAsZyxoLHEpO2w9Y1t0Pj4yXXwwO2NbZT4+Ml09bDtlPWNbcT4+Ml18MDtpZigoZXwwKT09MSl7YVtqPj4wXT0xfWVsc2UgaWYoKGV8MCk9PTApe2Fbaj4+MF09MH1lbHNle2Fbaj4+MF09MTtjW2g+PjJdPTR9Y1tiPj4yXT1sO2k9aztyZXR1cm59cT1nKzI4fDA7cj1jW3E+PjJdfDA7ZD1yKzR8MDtjW2Q+PjJdPShjW2Q+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW3A+PjJdPTEzNDQ4O2NbcCs0Pj4yXT0yMDg7Y1twKzg+PjJdPTA7Y2coMTM0NDgscCl9cz0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dD1jW3IrOD4+Ml18MDtpZigoY1tyKzEyPj4yXXwwKS10Pj4yPj4+MD5zPj4+MD8obz1jW3QrKHM8PDIpPj4yXXwwLChvfDApIT0wKTowKXt1PXIrNHwwO2Q9Y1t1Pj4yXXwwO2NbdT4+Ml09ZCsgLTE7aWYoKGR8MCk9PTApe2xjW2NbKGNbcj4+Ml18MCkrOD4+Ml0mMjU1XShyKX1xPWNbcT4+Ml18MDtkPXErNHwwO2NbZD4+Ml09KGNbZD4+Ml18MCkrMTtpZighKChjWzM0MDJdfDApPT0tMSkpe2NbcD4+Ml09MTM2MDg7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzYwOCxwKX1wPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtyPWNbcSs4Pj4yXXwwO2lmKChjW3ErMTI+PjJdfDApLXI+PjI+Pj4wPnA+Pj4wPyhuPWNbcisocDw8Mik+PjJdfDAsKG58MCkhPTApOjApe3U9cSs0fDA7ZD1jW3U+PjJdfDA7Y1t1Pj4yXT1kKyAtMTtpZigoZHwwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfW1jW2NbKGNbbj4+Ml18MCkrMjQ+PjJdJjEyN10obCxuKTtkPWwrMTJ8MDttY1tjWyhjW24+PjJdfDApKzI4Pj4yXSYxMjddKGQsbik7YVtqPj4wXT0oYWkoZSxjW2Y+PjJdfDAsbCxsKzI0fDAsbyxoLDEpfDApPT0obHwwKSYxO2NbYj4+Ml09Y1tlPj4yXTtpZighKChhW2Q+PjBdJjEpPT0wKT8obT1jW2wrMjA+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKChhW2w+PjBdJjEpPT0wKXtpPWs7cmV0dXJufWI9Y1tsKzg+PjJdfDA7aWYoKGJ8MCk9PTApe2k9aztyZXR1cm59dm4oYik7aT1rO3JldHVybn1kPVhhKDQpfDA7Y1tkPj4yXT0yMTMwNDt3YihkfDAsMjEzNzYsMTk2KX1kPVhhKDQpfDA7Y1tkPj4yXT0yMTMwNDt3YihkfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBhaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO2w9aTtpPWkrMTEyfDA7bj1sO3M9KGYtZXwwKS8xMnwwO2lmKHM+Pj4wPjEwMCl7bj11bihzKXwwO2lmKChufDApPT0wKXt6PVhhKDQpfDA7Y1t6Pj4yXT0yMjY4MDt3Yih6fDAsMjI3MjgsMjA2KX1lbHNle2s9bn19ZWxzZXtrPTB9bz0oZXwwKT09KGZ8MCk7aWYobyl7dD0wfWVsc2V7cD1lO3Q9MDtxPW47d2hpbGUoMSl7cj1hW3A+PjBdfDA7aWYoKHImMSk9PTApe3I9KHImMjU1KT4+PjF9ZWxzZXtyPWNbcCs0Pj4yXXwwfWlmKChyfDApPT0wKXthW3E+PjBdPTI7dD10KzF8MDtzPXMrIC0xfDB9ZWxzZXthW3E+PjBdPTF9cD1wKzEyfDA7aWYoKHB8MCk9PShmfDApKXticmVha31lbHNle3E9cSsxfDB9fX1wPTA7YTp3aGlsZSgxKXt1PShzfDApIT0wO3E9cDt3aGlsZSgxKXtyPWNbYj4+Ml18MDtkb3tpZigocnwwKSE9MCl7cD1jW3IrMTI+PjJdfDA7aWYoKHB8MCk9PShjW3IrMTY+PjJdfDApKXtwPW9jW2NbKGNbcj4+Ml18MCkrMzY+PjJdJjEyN10ocil8MH1lbHNle3A9Y1twPj4yXXwwfWlmKChwfDApPT0tMSl7Y1tiPj4yXT0wO3I9MTticmVha31lbHNle3I9KGNbYj4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7cj0xfX13aGlsZSgwKTtpZigoZHwwKT09MCl7cD0wO3c9MTtkPTB9ZWxzZXtwPWNbZCsxMj4+Ml18MDtpZigocHwwKT09KGNbZCsxNj4+Ml18MCkpe3A9b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7cD1jW3A+PjJdfDB9ej0ocHwwKT09LTE7cD16PzA6ZDt3PXo/MTowO2Q9ej8wOmR9dj1jW2I+PjJdfDA7aWYoISgocl53KSZ1KSl7YnJlYWsgYX1wPWNbdisxMj4+Ml18MDtpZigocHwwKT09KGNbdisxNj4+Ml18MCkpe3I9b2NbY1soY1t2Pj4yXXwwKSszNj4+Ml0mMTI3XSh2KXwwfWVsc2V7cj1jW3A+PjJdfDB9aWYoIWope3I9eGNbY1soY1tnPj4yXXwwKSsyOD4+Ml0mNjNdKGcscil8MH1wPXErMXwwO2lmKG8pe3E9cH1lbHNle2JyZWFrfX1iOmRve2lmKGope3c9MDt1PWU7dj1uO3doaWxlKDEpe2Rve2lmKChhW3Y+PjBdfDApPT0xKXt4PWFbdT4+MF18MDt5PSh4JjEpPT0wO2lmKHkpe3o9dSs0fDB9ZWxzZXt6PWNbdSs4Pj4yXXwwfWlmKChyfDApIT0oY1t6KyhxPDwyKT4+Ml18MCkpe2Fbdj4+MF09MDtzPXMrIC0xfDA7YnJlYWt9aWYoeSl7dz0oeCYyNTUpPj4+MX1lbHNle3c9Y1t1KzQ+PjJdfDB9aWYoKHd8MCk9PShwfDApKXthW3Y+PjBdPTI7dz0xO3Q9dCsxfDA7cz1zKyAtMXwwfWVsc2V7dz0xfX19d2hpbGUoMCk7dT11KzEyfDA7aWYoKHV8MCk9PShmfDApKXticmVhayBifXY9disxfDB9fWVsc2V7dz0wO3U9ZTt2PW47d2hpbGUoMSl7ZG97aWYoKGFbdj4+MF18MCk9PTEpe2lmKChhW3U+PjBdJjEpPT0wKXt4PXUrNHwwfWVsc2V7eD1jW3UrOD4+Ml18MH1pZigocnwwKSE9KHhjW2NbKGNbZz4+Ml18MCkrMjg+PjJdJjYzXShnLGNbeCsocTw8Mik+PjJdfDApfDApKXthW3Y+PjBdPTA7cz1zKyAtMXwwO2JyZWFrfXc9YVt1Pj4wXXwwO2lmKCh3JjEpPT0wKXt3PSh3JjI1NSk+Pj4xfWVsc2V7dz1jW3UrND4+Ml18MH1pZigod3wwKT09KHB8MCkpe2Fbdj4+MF09Mjt3PTE7dD10KzF8MDtzPXMrIC0xfDB9ZWxzZXt3PTF9fX13aGlsZSgwKTt1PXUrMTJ8MDtpZigodXwwKT09KGZ8MCkpe2JyZWFrIGJ9dj12KzF8MH19fXdoaWxlKDApO2lmKCF3KXtjb250aW51ZX11PWNbYj4+Ml18MDtyPXUrMTJ8MDtxPWNbcj4+Ml18MDtpZigocXwwKT09KGNbdSsxNj4+Ml18MCkpe29jW2NbKGNbdT4+Ml18MCkrNDA+PjJdJjEyN10odSl8MH1lbHNle2Nbcj4+Ml09cSs0fWlmKChzK3R8MCk+Pj4wPDIpe2NvbnRpbnVlfWVsc2V7cj1lO3E9bn13aGlsZSgxKXtpZigoYVtxPj4wXXwwKT09Mil7dT1hW3I+PjBdfDA7aWYoKHUmMSk9PTApe3U9KHUmMjU1KT4+PjF9ZWxzZXt1PWNbcis0Pj4yXXwwfWlmKCh1fDApIT0ocHwwKSl7YVtxPj4wXT0wO3Q9dCsgLTF8MH19cj1yKzEyfDA7aWYoKHJ8MCk9PShmfDApKXtjb250aW51ZSBhfWVsc2V7cT1xKzF8MH19fWRve2lmKCh2fDApIT0wKXtqPWNbdisxMj4+Ml18MDtpZigoanwwKT09KGNbdisxNj4+Ml18MCkpe2o9b2NbY1soY1t2Pj4yXXwwKSszNj4+Ml0mMTI3XSh2KXwwfWVsc2V7aj1jW2o+PjJdfDB9aWYoKGp8MCk9PS0xKXtjW2I+PjJdPTA7Yj0xO2JyZWFrfWVsc2V7Yj0oY1tiPj4yXXwwKT09MDticmVha319ZWxzZXtiPTF9fXdoaWxlKDApO2lmKChwfDApIT0wKXtqPWNbcCsxMj4+Ml18MDtpZigoanwwKT09KGNbcCsxNj4+Ml18MCkpe2o9b2NbY1soY1twPj4yXXwwKSszNj4+Ml0mMTI3XShwKXwwfWVsc2V7aj1jW2o+PjJdfDB9aWYoISgoanwwKT09LTEpKXtpZighYil7bT04OH19ZWxzZXttPTg2fX1lbHNle209ODZ9aWYoKG18MCk9PTg2P2I6MCl7bT04OH1pZigobXwwKT09ODgpe2NbaD4+Ml09Y1toPj4yXXwyfWM6ZG97aWYoIW8pe2lmKChhW24+PjBdfDApPT0yKXtmPWV9ZWxzZXt3aGlsZSgxKXtlPWUrMTJ8MDtuPW4rMXwwO2lmKChlfDApPT0oZnwwKSl7bT05MzticmVhayBjfWlmKChhW24+PjBdfDApPT0yKXtmPWU7YnJlYWt9fX19ZWxzZXttPTkzfX13aGlsZSgwKTtpZigobXwwKT09OTMpe2NbaD4+Ml09Y1toPj4yXXw0fWlmKChrfDApPT0wKXtpPWw7cmV0dXJuIGZ8MH12bihrKTtpPWw7cmV0dXJuIGZ8MH1mdW5jdGlvbiBiaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtkPWk7aT1pKzMwNHwwO3U9ZCsxNjB8MDtvPWQrMjgwfDA7bj1kKzI2NHwwO209ZCsyODR8MDt0PWQrMzAwfDA7cj1kO3M9ZCsyNzZ8MDtxPWQrMjk2fDA7dz1jW2U+PjJdfDA7eT1jW2Y+PjJdfDA7Zj1jW2crND4+Ml0mNzQ7aWYoKGZ8MCk9PTY0KXtmPTh9ZWxzZSBpZigoZnwwKT09MCl7Zj0wfWVsc2UgaWYoKGZ8MCk9PTgpe2Y9MTZ9ZWxzZXtmPTEwfXBpKG4sZyx1LG8pO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2hnKG0sMTApO2lmKChhW20+PjBdJjEpPT0wKXt6PW0rMXwwO2U9ejtnPW0rOHwwfWVsc2V7ej1tKzh8MDtlPW0rMXwwO2c9ejt6PWNbej4+Ml18MH1jW3Q+PjJdPXo7Y1tzPj4yXT1yO2NbcT4+Ml09MDt2PW0rNHwwO3g9Y1tvPj4yXXwwO289bSs4fDA7d2hpbGUoMSl7aWYoKHd8MCk9PTApe0E9MTt3PTB9ZWxzZXtBPWNbdysxMj4+Ml18MDtpZigoQXwwKT09KGNbdysxNj4+Ml18MCkpe0E9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7QT1jW0E+PjJdfDB9Qz0oQXwwKT09LTE7QT1DPzE6MDt3PUM/MDp3fWlmKCh5fDApIT0wKXtCPWNbeSsxMj4+Ml18MDtpZigoQnwwKT09KGNbeSsxNj4+Ml18MCkpe0I9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7Qj1jW0I+PjJdfDB9aWYoISgoQnwwKT09LTEpKXtpZighQSl7YnJlYWt9fWVsc2V7az0yMH19ZWxzZXtrPTIwfWlmKChrfDApPT0yMCl7az0wO2lmKEEpe3k9MDticmVha31lbHNle3k9MH19QT1hW20+PjBdfDA7Qj0oQSYxKT09MDtpZihCKXtDPShBJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9aWYoKChjW3Q+PjJdfDApLXp8MCk9PShDfDApKXtpZihCKXtEPShBJjI1NSk+Pj4xO3o9KEEmMjU1KT4+PjE7Qz1EPDwxO0E9RH1lbHNle0E9Y1t2Pj4yXXwwO3o9Y1t2Pj4yXXwwO0M9QTw8MX1kb3tpZighKHo+Pj4wPEM+Pj4wKSl7aWYoQil7YVttK0MrMT4+MF09MDthW20+PjBdPUE8PDI7YnJlYWt9ZWxzZXthWyhjW28+PjJdfDApK0M+PjBdPTA7Y1t2Pj4yXT1DO2JyZWFrfX1lbHNle2hnKG0sQy16fDApfX13aGlsZSgwKTtDPWFbbT4+MF18MDtpZigoQyYxKT09MCl7Qj0xMH1lbHNle0I9Y1ttPj4yXXwwO0M9QiYyNTU7Qj0oQiYtMikrIC0xfDB9ej0oQyYxKT09MDtpZih6KXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9ZG97aWYoIShDPj4+MDxCPj4+MCkpe2lmKHope2FbbStCKzE+PjBdPTA7YVttPj4wXT1CPDwxO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStCPj4wXT0wO2Nbdj4+Ml09QjticmVha319ZWxzZXtoZyhtLEItQ3wwKX19d2hpbGUoMCk7aWYoKGFbbT4+MF0mMSk9PTApe3o9ZX1lbHNle3o9Y1tnPj4yXXwwfWNbdD4+Ml09eitBfUE9dysxMnwwO0M9Y1tBPj4yXXwwO0I9dysxNnwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7Qz1vY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSYxMjddKHcpfDB9ZWxzZXtDPWNbQz4+Ml18MH1pZigobGkoQyxmLHosdCxxLHgsbixyLHMsdSl8MCkhPTApe2JyZWFrfUM9Y1tBPj4yXXwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7b2NbY1soY1t3Pj4yXXwwKSs0MD4+Ml0mMTI3XSh3KXwwO2NvbnRpbnVlfWVsc2V7Y1tBPj4yXT1DKzQ7Y29udGludWV9fXU9YVtuPj4wXXwwO2lmKCh1JjEpPT0wKXt1PSh1JjI1NSk+Pj4xfWVsc2V7dT1jW24rND4+Ml18MH1pZigodXwwKSE9MD8ocD1jW3M+PjJdfDAsKHAtcnwwKTwxNjApOjApe0Q9Y1txPj4yXXwwO2Nbcz4+Ml09cCs0O2NbcD4+Ml09RH1jW2o+PjJdPU5tKHosY1t0Pj4yXXwwLGgsZil8MDtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gY2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTA7ZD1pO2k9aSszMDR8MDt1PWQrMTYwfDA7bz1kKzI4MHwwO249ZCsyNjR8MDttPWQrMjg0fDA7dD1kKzMwMHwwO3I9ZDtzPWQrMjc2fDA7cT1kKzI5NnwwO3c9Y1tlPj4yXXwwO3k9Y1tmPj4yXXwwO2Y9Y1tnKzQ+PjJdJjc0O2lmKChmfDApPT04KXtmPTE2fWVsc2UgaWYoKGZ8MCk9PTY0KXtmPTh9ZWxzZSBpZigoZnwwKT09MCl7Zj0wfWVsc2V7Zj0xMH1waShuLGcsdSxvKTtjW20rMD4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtoZyhtLDEwKTtpZigoYVttPj4wXSYxKT09MCl7ej1tKzF8MDtlPXo7Zz1tKzh8MH1lbHNle3o9bSs4fDA7ZT1tKzF8MDtnPXo7ej1jW3o+PjJdfDB9Y1t0Pj4yXT16O2Nbcz4+Ml09cjtjW3E+PjJdPTA7dj1tKzR8MDt4PWNbbz4+Ml18MDtvPW0rOHwwO3doaWxlKDEpe2lmKCh3fDApPT0wKXtBPTE7dz0wfWVsc2V7QT1jW3crMTI+PjJdfDA7aWYoKEF8MCk9PShjW3crMTY+PjJdfDApKXtBPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle0E9Y1tBPj4yXXwwfUM9KEF8MCk9PS0xO0E9Qz8xOjA7dz1DPzA6d31pZigoeXwwKSE9MCl7Qj1jW3krMTI+PjJdfDA7aWYoKEJ8MCk9PShjW3krMTY+PjJdfDApKXtCPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle0I9Y1tCPj4yXXwwfWlmKCEoKEJ8MCk9PS0xKSl7aWYoIUEpe2JyZWFrfX1lbHNle2s9MjB9fWVsc2V7az0yMH1pZigoa3wwKT09MjApe2s9MDtpZihBKXt5PTA7YnJlYWt9ZWxzZXt5PTB9fUE9YVttPj4wXXwwO0I9KEEmMSk9PTA7aWYoQil7Qz0oQSYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWlmKCgoY1t0Pj4yXXwwKS16fDApPT0oQ3wwKSl7aWYoQil7RD0oQSYyNTUpPj4+MTt6PShBJjI1NSk+Pj4xO0M9RDw8MTtBPUR9ZWxzZXtBPWNbdj4+Ml18MDt6PWNbdj4+Ml18MDtDPUE8PDF9ZG97aWYoISh6Pj4+MDxDPj4+MCkpe2lmKEIpe2FbbStDKzE+PjBdPTA7YVttPj4wXT1BPDwyO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStDPj4wXT0wO2Nbdj4+Ml09QzticmVha319ZWxzZXtoZyhtLEMtenwwKX19d2hpbGUoMCk7Qz1hW20+PjBdfDA7aWYoKEMmMSk9PTApe0I9MTB9ZWxzZXtCPWNbbT4+Ml18MDtDPUImMjU1O0I9KEImLTIpKyAtMXwwfXo9KEMmMSk9PTA7aWYoeil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWRve2lmKCEoQz4+PjA8Qj4+PjApKXtpZih6KXthW20rQisxPj4wXT0wO2FbbT4+MF09Qjw8MTticmVha31lbHNle2FbKGNbbz4+Ml18MCkrQj4+MF09MDtjW3Y+PjJdPUI7YnJlYWt9fWVsc2V7aGcobSxCLUN8MCl9fXdoaWxlKDApO2lmKChhW20+PjBdJjEpPT0wKXt6PWV9ZWxzZXt6PWNbZz4+Ml18MH1jW3Q+PjJdPXorQX1BPXcrMTJ8MDtDPWNbQT4+Ml18MDtCPXcrMTZ8MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe0M9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7Qz1jW0M+PjJdfDB9aWYoKGxpKEMsZix6LHQscSx4LG4scixzLHUpfDApIT0wKXticmVha31DPWNbQT4+Ml18MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe29jW2NbKGNbdz4+Ml18MCkrNDA+PjJdJjEyN10odyl8MDtjb250aW51ZX1lbHNle2NbQT4+Ml09Qys0O2NvbnRpbnVlfX11PWFbbj4+MF18MDtpZigodSYxKT09MCl7dT0odSYyNTUpPj4+MX1lbHNle3U9Y1tuKzQ+PjJdfDB9aWYoKHV8MCkhPTA/KHA9Y1tzPj4yXXwwLChwLXJ8MCk8MTYwKTowKXtEPWNbcT4+Ml18MDtjW3M+PjJdPXArNDtjW3A+PjJdPUR9Qz1NbSh6LGNbdD4+Ml18MCxoLGYpfDA7RD1qO2NbRD4+Ml09QztjW0QrND4+Ml09STtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZGkoZCxlLGYsZyxoLGosayl7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTA7ZT1pO2k9aSszMDR8MDt2PWUrMTYwfDA7cD1lKzI4MHwwO289ZSsyNjR8MDtuPWUrMjg0fDA7dT1lKzMwMHwwO3M9ZTt0PWUrMjc2fDA7cj1lKzI5NnwwO3g9Y1tmPj4yXXwwO3o9Y1tnPj4yXXwwO2c9Y1toKzQ+PjJdJjc0O2lmKChnfDApPT0wKXtnPTB9ZWxzZSBpZigoZ3wwKT09NjQpe2c9OH1lbHNlIGlmKChnfDApPT04KXtnPTE2fWVsc2V7Zz0xMH1waShvLGgsdixwKTtjW24rMD4+Ml09MDtjW24rND4+Ml09MDtjW24rOD4+Ml09MDtoZyhuLDEwKTtpZigoYVtuPj4wXSYxKT09MCl7QT1uKzF8MDtmPUE7aD1uKzh8MH1lbHNle0E9bis4fDA7Zj1uKzF8MDtoPUE7QT1jW0E+PjJdfDB9Y1t1Pj4yXT1BO2NbdD4+Ml09cztjW3I+PjJdPTA7dz1uKzR8MDt5PWNbcD4+Ml18MDtwPW4rOHwwO3doaWxlKDEpe2lmKCh4fDApPT0wKXtCPTE7eD0wfWVsc2V7Qj1jW3grMTI+PjJdfDA7aWYoKEJ8MCk9PShjW3grMTY+PjJdfDApKXtCPW9jW2NbKGNbeD4+Ml18MCkrMzY+PjJdJjEyN10oeCl8MH1lbHNle0I9Y1tCPj4yXXwwfUQ9KEJ8MCk9PS0xO0I9RD8xOjA7eD1EPzA6eH1pZigoenwwKSE9MCl7Qz1jW3orMTI+PjJdfDA7aWYoKEN8MCk9PShjW3orMTY+PjJdfDApKXtDPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle0M9Y1tDPj4yXXwwfWlmKCEoKEN8MCk9PS0xKSl7aWYoIUIpe2JyZWFrfX1lbHNle2w9MjB9fWVsc2V7bD0yMH1pZigobHwwKT09MjApe2w9MDtpZihCKXt6PTA7YnJlYWt9ZWxzZXt6PTB9fUI9YVtuPj4wXXwwO0M9KEImMSk9PTA7aWYoQyl7RD0oQiYyNTUpPj4+MX1lbHNle0Q9Y1t3Pj4yXXwwfWlmKCgoY1t1Pj4yXXwwKS1BfDApPT0oRHwwKSl7aWYoQyl7RT0oQiYyNTUpPj4+MTtBPShCJjI1NSk+Pj4xO0Q9RTw8MTtCPUV9ZWxzZXtCPWNbdz4+Ml18MDtBPWNbdz4+Ml18MDtEPUI8PDF9ZG97aWYoIShBPj4+MDxEPj4+MCkpe2lmKEMpe2FbbitEKzE+PjBdPTA7YVtuPj4wXT1CPDwyO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKStEPj4wXT0wO2Nbdz4+Ml09RDticmVha319ZWxzZXtoZyhuLEQtQXwwKX19d2hpbGUoMCk7RD1hW24+PjBdfDA7aWYoKEQmMSk9PTApe0M9MTB9ZWxzZXtDPWNbbj4+Ml18MDtEPUMmMjU1O0M9KEMmLTIpKyAtMXwwfUE9KEQmMSk9PTA7aWYoQSl7RD0oRCYyNTUpPj4+MX1lbHNle0Q9Y1t3Pj4yXXwwfWRve2lmKCEoRD4+PjA8Qz4+PjApKXtpZihBKXthW24rQysxPj4wXT0wO2Fbbj4+MF09Qzw8MTticmVha31lbHNle2FbKGNbcD4+Ml18MCkrQz4+MF09MDtjW3c+PjJdPUM7YnJlYWt9fWVsc2V7aGcobixDLUR8MCl9fXdoaWxlKDApO2lmKChhW24+PjBdJjEpPT0wKXtBPWZ9ZWxzZXtBPWNbaD4+Ml18MH1jW3U+PjJdPUErQn1CPXgrMTJ8MDtEPWNbQj4+Ml18MDtDPXgrMTZ8MDtpZigoRHwwKT09KGNbQz4+Ml18MCkpe0Q9b2NbY1soY1t4Pj4yXXwwKSszNj4+Ml0mMTI3XSh4KXwwfWVsc2V7RD1jW0Q+PjJdfDB9aWYoKGxpKEQsZyxBLHUscix5LG8scyx0LHYpfDApIT0wKXticmVha31EPWNbQj4+Ml18MDtpZigoRHwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbeD4+Ml18MCkrNDA+PjJdJjEyN10oeCl8MDtjb250aW51ZX1lbHNle2NbQj4+Ml09RCs0O2NvbnRpbnVlfX12PWFbbz4+MF18MDtpZigodiYxKT09MCl7dj0odiYyNTUpPj4+MX1lbHNle3Y9Y1tvKzQ+PjJdfDB9aWYoKHZ8MCkhPTA/KHE9Y1t0Pj4yXXwwLChxLXN8MCk8MTYwKTowKXtFPWNbcj4+Ml18MDtjW3Q+PjJdPXErNDtjW3E+PjJdPUV9YltrPj4xXT1MbShBLGNbdT4+Ml18MCxqLGcpfDA7cWsobyxzLGNbdD4+Ml18MCxqKTtpZigoeHwwKT09MCl7az0wO3E9MX1lbHNle2s9Y1t4KzEyPj4yXXwwO2lmKChrfDApPT0oY1t4KzE2Pj4yXXwwKSl7az1vY1tjWyhjW3g+PjJdfDApKzM2Pj4yXSYxMjddKHgpfDB9ZWxzZXtrPWNbaz4+Ml18MH1xPShrfDApPT0tMTtrPXE/MDp4O3E9cT8xOjB9aWYoKHp8MCkhPTApe3I9Y1t6KzEyPj4yXXwwO2lmKChyfDApPT0oY1t6KzE2Pj4yXXwwKSl7cj1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtyPWNbcj4+Ml18MH1pZighKChyfDApPT0tMSkpe2lmKCFxKXtsPTczfX1lbHNle2w9NzF9fWVsc2V7bD03MX1pZigobHwwKT09NzE/cTowKXtsPTczfWlmKChsfDApPT03Myl7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tkPj4yXT1rO2lmKCEoKGFbbj4+MF0mMSk9PTApPyhtPWNbcD4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoKGFbbz4+MF0mMSk9PTApe2k9ZTtyZXR1cm59aj1jW28rOD4+Ml18MDtpZigoanwwKT09MCl7aT1lO3JldHVybn12bihqKTtpPWU7cmV0dXJufWZ1bmN0aW9uIGVpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wO2Q9aTtpPWkrMzA0fDA7dT1kKzE2MHwwO289ZCsyODB8MDtuPWQrMjY0fDA7bT1kKzI4NHwwO3Q9ZCszMDB8MDtyPWQ7cz1kKzI3NnwwO3E9ZCsyOTZ8MDt3PWNbZT4+Ml18MDt5PWNbZj4+Ml18MDtmPWNbZys0Pj4yXSY3NDtpZigoZnwwKT09OCl7Zj0xNn1lbHNlIGlmKChmfDApPT02NCl7Zj04fWVsc2UgaWYoKGZ8MCk9PTApe2Y9MH1lbHNle2Y9MTB9cGkobixnLHUsbyk7Y1ttKzA+PjJdPTA7Y1ttKzQ+PjJdPTA7Y1ttKzg+PjJdPTA7aGcobSwxMCk7aWYoKGFbbT4+MF0mMSk9PTApe3o9bSsxfDA7ZT16O2c9bSs4fDB9ZWxzZXt6PW0rOHwwO2U9bSsxfDA7Zz16O3o9Y1t6Pj4yXXwwfWNbdD4+Ml09ejtjW3M+PjJdPXI7Y1txPj4yXT0wO3Y9bSs0fDA7eD1jW28+PjJdfDA7bz1tKzh8MDt3aGlsZSgxKXtpZigod3wwKT09MCl7QT0xO3c9MH1lbHNle0E9Y1t3KzEyPj4yXXwwO2lmKChBfDApPT0oY1t3KzE2Pj4yXXwwKSl7QT1vY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSYxMjddKHcpfDB9ZWxzZXtBPWNbQT4+Ml18MH1DPShBfDApPT0tMTtBPUM/MTowO3c9Qz8wOnd9aWYoKHl8MCkhPTApe0I9Y1t5KzEyPj4yXXwwO2lmKChCfDApPT0oY1t5KzE2Pj4yXXwwKSl7Qj1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXtCPWNbQj4+Ml18MH1pZighKChCfDApPT0tMSkpe2lmKCFBKXticmVha319ZWxzZXtrPTIwfX1lbHNle2s9MjB9aWYoKGt8MCk9PTIwKXtrPTA7aWYoQSl7eT0wO2JyZWFrfWVsc2V7eT0wfX1BPWFbbT4+MF18MDtCPShBJjEpPT0wO2lmKEIpe0M9KEEmMjU1KT4+PjF9ZWxzZXtDPWNbdj4+Ml18MH1pZigoKGNbdD4+Ml18MCktenwwKT09KEN8MCkpe2lmKEIpe0Q9KEEmMjU1KT4+PjE7ej0oQSYyNTUpPj4+MTtDPUQ8PDE7QT1EfWVsc2V7QT1jW3Y+PjJdfDA7ej1jW3Y+PjJdfDA7Qz1BPDwxfWRve2lmKCEoej4+PjA8Qz4+PjApKXtpZihCKXthW20rQysxPj4wXT0wO2FbbT4+MF09QTw8MjticmVha31lbHNle2FbKGNbbz4+Ml18MCkrQz4+MF09MDtjW3Y+PjJdPUM7YnJlYWt9fWVsc2V7aGcobSxDLXp8MCl9fXdoaWxlKDApO0M9YVttPj4wXXwwO2lmKChDJjEpPT0wKXtCPTEwfWVsc2V7Qj1jW20+PjJdfDA7Qz1CJjI1NTtCPShCJi0yKSsgLTF8MH16PShDJjEpPT0wO2lmKHope0M9KEMmMjU1KT4+PjF9ZWxzZXtDPWNbdj4+Ml18MH1kb3tpZighKEM+Pj4wPEI+Pj4wKSl7aWYoeil7YVttK0IrMT4+MF09MDthW20+PjBdPUI8PDE7YnJlYWt9ZWxzZXthWyhjW28+PjJdfDApK0I+PjBdPTA7Y1t2Pj4yXT1CO2JyZWFrfX1lbHNle2hnKG0sQi1DfDApfX13aGlsZSgwKTtpZigoYVttPj4wXSYxKT09MCl7ej1lfWVsc2V7ej1jW2c+PjJdfDB9Y1t0Pj4yXT16K0F9QT13KzEyfDA7Qz1jW0E+PjJdfDA7Qj13KzE2fDA7aWYoKEN8MCk9PShjW0I+PjJdfDApKXtDPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle0M9Y1tDPj4yXXwwfWlmKChsaShDLGYseix0LHEseCxuLHIscyx1KXwwKSE9MCl7YnJlYWt9Qz1jW0E+PjJdfDA7aWYoKEN8MCk9PShjW0I+PjJdfDApKXtvY1tjWyhjW3c+PjJdfDApKzQwPj4yXSYxMjddKHcpfDA7Y29udGludWV9ZWxzZXtjW0E+PjJdPUMrNDtjb250aW51ZX19dT1hW24+PjBdfDA7aWYoKHUmMSk9PTApe3U9KHUmMjU1KT4+PjF9ZWxzZXt1PWNbbis0Pj4yXXwwfWlmKCh1fDApIT0wPyhwPWNbcz4+Ml18MCwocC1yfDApPDE2MCk6MCl7RD1jW3E+PjJdfDA7Y1tzPj4yXT1wKzQ7Y1twPj4yXT1EfWNbaj4+Ml09S20oeixjW3Q+PjJdfDAsaCxmKXwwO3FrKG4scixjW3M+PjJdfDAsaCk7aWYoKHd8MCk9PTApe2o9MDtwPTF9ZWxzZXtqPWNbdysxMj4+Ml18MDtpZigoanwwKT09KGNbdysxNj4+Ml18MCkpe2o9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7aj1jW2o+PjJdfDB9cD0oanwwKT09LTE7aj1wPzA6dztwPXA/MTowfWlmKCh5fDApIT0wKXtxPWNbeSsxMj4+Ml18MDtpZigocXwwKT09KGNbeSsxNj4+Ml18MCkpe3E9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7cT1jW3E+PjJdfDB9aWYoISgocXwwKT09LTEpKXtpZighcCl7az03M319ZWxzZXtrPTcxfX1lbHNle2s9NzF9aWYoKGt8MCk9PTcxP3A6MCl7az03M31pZigoa3wwKT09NzMpe2NbaD4+Ml09Y1toPj4yXXwyfWNbYj4+Ml09ajtpZighKChhW20+PjBdJjEpPT0wKT8obD1jW28+PjJdfDAsKGx8MCkhPTApOjApe3ZuKGwpfWlmKChhW24+PjBdJjEpPT0wKXtpPWQ7cmV0dXJufWg9Y1tuKzg+PjJdfDA7aWYoKGh8MCk9PTApe2k9ZDtyZXR1cm59dm4oaCk7aT1kO3JldHVybn1mdW5jdGlvbiBmaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtkPWk7aT1pKzMwNHwwO3U9ZCsxNjB8MDtvPWQrMjgwfDA7bj1kKzI2NHwwO209ZCsyODR8MDt0PWQrMzAwfDA7cj1kO3M9ZCsyNzZ8MDtxPWQrMjk2fDA7dz1jW2U+PjJdfDA7eT1jW2Y+PjJdfDA7Zj1jW2crND4+Ml0mNzQ7aWYoKGZ8MCk9PTApe2Y9MH1lbHNlIGlmKChmfDApPT02NCl7Zj04fWVsc2UgaWYoKGZ8MCk9PTgpe2Y9MTZ9ZWxzZXtmPTEwfXBpKG4sZyx1LG8pO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2hnKG0sMTApO2lmKChhW20+PjBdJjEpPT0wKXt6PW0rMXwwO2U9ejtnPW0rOHwwfWVsc2V7ej1tKzh8MDtlPW0rMXwwO2c9ejt6PWNbej4+Ml18MH1jW3Q+PjJdPXo7Y1tzPj4yXT1yO2NbcT4+Ml09MDt2PW0rNHwwO3g9Y1tvPj4yXXwwO289bSs4fDA7d2hpbGUoMSl7aWYoKHd8MCk9PTApe0E9MTt3PTB9ZWxzZXtBPWNbdysxMj4+Ml18MDtpZigoQXwwKT09KGNbdysxNj4+Ml18MCkpe0E9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7QT1jW0E+PjJdfDB9Qz0oQXwwKT09LTE7QT1DPzE6MDt3PUM/MDp3fWlmKCh5fDApIT0wKXtCPWNbeSsxMj4+Ml18MDtpZigoQnwwKT09KGNbeSsxNj4+Ml18MCkpe0I9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7Qj1jW0I+PjJdfDB9aWYoISgoQnwwKT09LTEpKXtpZighQSl7YnJlYWt9fWVsc2V7az0yMH19ZWxzZXtrPTIwfWlmKChrfDApPT0yMCl7az0wO2lmKEEpe3k9MDticmVha31lbHNle3k9MH19QT1hW20+PjBdfDA7Qj0oQSYxKT09MDtpZihCKXtDPShBJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9aWYoKChjW3Q+PjJdfDApLXp8MCk9PShDfDApKXtpZihCKXtEPShBJjI1NSk+Pj4xO3o9KEEmMjU1KT4+PjE7Qz1EPDwxO0E9RH1lbHNle0E9Y1t2Pj4yXXwwO3o9Y1t2Pj4yXXwwO0M9QTw8MX1kb3tpZighKHo+Pj4wPEM+Pj4wKSl7aWYoQil7YVttK0MrMT4+MF09MDthW20+PjBdPUE8PDI7YnJlYWt9ZWxzZXthWyhjW28+PjJdfDApK0M+PjBdPTA7Y1t2Pj4yXT1DO2JyZWFrfX1lbHNle2hnKG0sQy16fDApfX13aGlsZSgwKTtDPWFbbT4+MF18MDtpZigoQyYxKT09MCl7Qj0xMH1lbHNle0I9Y1ttPj4yXXwwO0M9QiYyNTU7Qj0oQiYtMikrIC0xfDB9ej0oQyYxKT09MDtpZih6KXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9ZG97aWYoIShDPj4+MDxCPj4+MCkpe2lmKHope2FbbStCKzE+PjBdPTA7YVttPj4wXT1CPDwxO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStCPj4wXT0wO2Nbdj4+Ml09QjticmVha319ZWxzZXtoZyhtLEItQ3wwKX19d2hpbGUoMCk7aWYoKGFbbT4+MF0mMSk9PTApe3o9ZX1lbHNle3o9Y1tnPj4yXXwwfWNbdD4+Ml09eitBfUE9dysxMnwwO0M9Y1tBPj4yXXwwO0I9dysxNnwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7Qz1vY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSYxMjddKHcpfDB9ZWxzZXtDPWNbQz4+Ml18MH1pZigobGkoQyxmLHosdCxxLHgsbixyLHMsdSl8MCkhPTApe2JyZWFrfUM9Y1tBPj4yXXwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7b2NbY1soY1t3Pj4yXXwwKSs0MD4+Ml0mMTI3XSh3KXwwO2NvbnRpbnVlfWVsc2V7Y1tBPj4yXT1DKzQ7Y29udGludWV9fXU9YVtuPj4wXXwwO2lmKCh1JjEpPT0wKXt1PSh1JjI1NSk+Pj4xfWVsc2V7dT1jW24rND4+Ml18MH1pZigodXwwKSE9MD8ocD1jW3M+PjJdfDAsKHAtcnwwKTwxNjApOjApe0Q9Y1txPj4yXXwwO2Nbcz4+Ml09cCs0O2NbcD4+Ml09RH1jW2o+PjJdPUptKHosY1t0Pj4yXXwwLGgsZil8MDtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZ2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTA7ZD1pO2k9aSszMDR8MDt1PWQrMTYwfDA7bz1kKzI4MHwwO249ZCsyNjR8MDttPWQrMjg0fDA7dD1kKzMwMHwwO3I9ZDtzPWQrMjc2fDA7cT1kKzI5NnwwO3c9Y1tlPj4yXXwwO3k9Y1tmPj4yXXwwO2Y9Y1tnKzQ+PjJdJjc0O2lmKChmfDApPT04KXtmPTE2fWVsc2UgaWYoKGZ8MCk9PTApe2Y9MH1lbHNlIGlmKChmfDApPT02NCl7Zj04fWVsc2V7Zj0xMH1waShuLGcsdSxvKTtjW20rMD4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtoZyhtLDEwKTtpZigoYVttPj4wXSYxKT09MCl7ej1tKzF8MDtlPXo7Zz1tKzh8MH1lbHNle3o9bSs4fDA7ZT1tKzF8MDtnPXo7ej1jW3o+PjJdfDB9Y1t0Pj4yXT16O2Nbcz4+Ml09cjtjW3E+PjJdPTA7dj1tKzR8MDt4PWNbbz4+Ml18MDtvPW0rOHwwO3doaWxlKDEpe2lmKCh3fDApPT0wKXtBPTE7dz0wfWVsc2V7QT1jW3crMTI+PjJdfDA7aWYoKEF8MCk9PShjW3crMTY+PjJdfDApKXtBPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle0E9Y1tBPj4yXXwwfUM9KEF8MCk9PS0xO0E9Qz8xOjA7dz1DPzA6d31pZigoeXwwKSE9MCl7Qj1jW3krMTI+PjJdfDA7aWYoKEJ8MCk9PShjW3krMTY+PjJdfDApKXtCPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle0I9Y1tCPj4yXXwwfWlmKCEoKEJ8MCk9PS0xKSl7aWYoIUEpe2JyZWFrfX1lbHNle2s9MjB9fWVsc2V7az0yMH1pZigoa3wwKT09MjApe2s9MDtpZihBKXt5PTA7YnJlYWt9ZWxzZXt5PTB9fUE9YVttPj4wXXwwO0I9KEEmMSk9PTA7aWYoQil7Qz0oQSYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWlmKCgoY1t0Pj4yXXwwKS16fDApPT0oQ3wwKSl7aWYoQil7RD0oQSYyNTUpPj4+MTt6PShBJjI1NSk+Pj4xO0M9RDw8MTtBPUR9ZWxzZXtBPWNbdj4+Ml18MDt6PWNbdj4+Ml18MDtDPUE8PDF9ZG97aWYoISh6Pj4+MDxDPj4+MCkpe2lmKEIpe2FbbStDKzE+PjBdPTA7YVttPj4wXT1BPDwyO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStDPj4wXT0wO2Nbdj4+Ml09QzticmVha319ZWxzZXtoZyhtLEMtenwwKX19d2hpbGUoMCk7Qz1hW20+PjBdfDA7aWYoKEMmMSk9PTApe0I9MTB9ZWxzZXtCPWNbbT4+Ml18MDtDPUImMjU1O0I9KEImLTIpKyAtMXwwfXo9KEMmMSk9PTA7aWYoeil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWRve2lmKCEoQz4+PjA8Qj4+PjApKXtpZih6KXthW20rQisxPj4wXT0wO2FbbT4+MF09Qjw8MTticmVha31lbHNle2FbKGNbbz4+Ml18MCkrQj4+MF09MDtjW3Y+PjJdPUI7YnJlYWt9fWVsc2V7aGcobSxCLUN8MCl9fXdoaWxlKDApO2lmKChhW20+PjBdJjEpPT0wKXt6PWV9ZWxzZXt6PWNbZz4+Ml18MH1jW3Q+PjJdPXorQX1BPXcrMTJ8MDtDPWNbQT4+Ml18MDtCPXcrMTZ8MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe0M9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7Qz1jW0M+PjJdfDB9aWYoKGxpKEMsZix6LHQscSx4LG4scixzLHUpfDApIT0wKXticmVha31DPWNbQT4+Ml18MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe29jW2NbKGNbdz4+Ml18MCkrNDA+PjJdJjEyN10odyl8MDtjb250aW51ZX1lbHNle2NbQT4+Ml09Qys0O2NvbnRpbnVlfX11PWFbbj4+MF18MDtpZigodSYxKT09MCl7dT0odSYyNTUpPj4+MX1lbHNle3U9Y1tuKzQ+PjJdfDB9aWYoKHV8MCkhPTA/KHA9Y1tzPj4yXXwwLChwLXJ8MCk8MTYwKTowKXtEPWNbcT4+Ml18MDtjW3M+PjJdPXArNDtjW3A+PjJdPUR9Qz1JbSh6LGNbdD4+Ml18MCxoLGYpfDA7RD1qO2NbRD4+Ml09QztjW0QrND4+Ml09STtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gaGkoYixkLGUsZixoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MDtkPWk7aT1pKzM1MnwwO3c9ZCsyMDh8MDt5PWQrMTg0fDA7cD1kKzR8MDtuPWQrOHwwO289ZCsxOTZ8MDt1PWQ7dD1kKzI0fDA7cz1kKzE5MnwwO3Y9ZCsxODh8MDtyPWQrMzM3fDA7eD1kKzMzNnwwO3o9Y1tlPj4yXXwwO0I9Y1tmPj4yXXwwO3FpKG4saCx3LHkscCk7Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTA7aGcobywxMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9bysxfDA7ZT1DO2Y9bys4fDB9ZWxzZXtDPW8rOHwwO2U9bysxfDA7Zj1DO0M9Y1tDPj4yXXwwfWNbdT4+Ml09QztjW3M+PjJdPXQ7Y1t2Pj4yXT0wO2Fbcj4+MF09MTthW3g+PjBdPTY5O2g9bys0fDA7eT1jW3k+PjJdfDA7QT1jW3A+PjJdfDA7cD1vKzh8MDt3aGlsZSgxKXtpZigoenwwKT09MCl7RD0xO3o9MH1lbHNle0Q9Y1t6KzEyPj4yXXwwO2lmKChEfDApPT0oY1t6KzE2Pj4yXXwwKSl7RD1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtEPWNbRD4+Ml18MH1GPShEfDApPT0tMTtEPUY/MTowO3o9Rj8wOnp9aWYoKEJ8MCkhPTApe0U9Y1tCKzEyPj4yXXwwO2lmKChFfDApPT0oY1tCKzE2Pj4yXXwwKSl7RT1vY1tjWyhjW0I+PjJdfDApKzM2Pj4yXSYxMjddKEIpfDB9ZWxzZXtFPWNbRT4+Ml18MH1pZighKChFfDApPT0tMSkpe2lmKCFEKXticmVha319ZWxzZXttPTE2fX1lbHNle209MTZ9aWYoKG18MCk9PTE2KXttPTA7aWYoRCl7Qj0wO2JyZWFrfWVsc2V7Qj0wfX1EPWFbbz4+MF18MDtFPShEJjEpPT0wO2lmKEUpe0Y9KEQmMjU1KT4+PjF9ZWxzZXtGPWNbaD4+Ml18MH1pZigoKGNbdT4+Ml18MCktQ3wwKT09KEZ8MCkpe2lmKEUpe0c9KEQmMjU1KT4+PjE7Rj0oRCYyNTUpPj4+MTtDPUc8PDE7RD1HfWVsc2V7RD1jW2g+PjJdfDA7Rj1jW2g+PjJdfDA7Qz1EPDwxfWRve2lmKCEoRj4+PjA8Qz4+PjApKXtpZihFKXthW28rQysxPj4wXT0wO2Fbbz4+MF09RDw8MjticmVha31lbHNle2FbKGNbcD4+Ml18MCkrQz4+MF09MDtjW2g+PjJdPUM7YnJlYWt9fWVsc2V7aGcobyxDLUZ8MCl9fXdoaWxlKDApO0Y9YVtvPj4wXXwwO2lmKChGJjEpPT0wKXtFPTEwfWVsc2V7RT1jW28+PjJdfDA7Rj1FJjI1NTtFPShFJi0yKSsgLTF8MH1DPShGJjEpPT0wO2lmKEMpe0Y9KEYmMjU1KT4+PjF9ZWxzZXtGPWNbaD4+Ml18MH1kb3tpZighKEY+Pj4wPEU+Pj4wKSl7aWYoQyl7YVtvK0UrMT4+MF09MDthW28+PjBdPUU8PDE7YnJlYWt9ZWxzZXthWyhjW3A+PjJdfDApK0U+PjBdPTA7Y1toPj4yXT1FO2JyZWFrfX1lbHNle2hnKG8sRS1GfDApfX13aGlsZSgwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz1lfWVsc2V7Qz1jW2Y+PjJdfDB9Y1t1Pj4yXT1DK0R9RT16KzEyfDA7Rj1jW0U+PjJdfDA7RD16KzE2fDA7aWYoKEZ8MCk9PShjW0Q+PjJdfDApKXtGPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle0Y9Y1tGPj4yXXwwfWlmKChyaShGLHIseCxDLHUseSxBLG4sdCxzLHYsdyl8MCkhPTApe2JyZWFrfUY9Y1tFPj4yXXwwO2lmKChGfDApPT0oY1tEPj4yXXwwKSl7b2NbY1soY1t6Pj4yXXwwKSs0MD4+Ml0mMTI3XSh6KXwwO2NvbnRpbnVlfWVsc2V7Y1tFPj4yXT1GKzQ7Y29udGludWV9fXc9YVtuPj4wXXwwO2lmKCh3JjEpPT0wKXt3PSh3JjI1NSk+Pj4xfWVsc2V7dz1jW24rND4+Ml18MH1pZigoKHd8MCkhPTA/KGFbcj4+MF18MCkhPTA6MCk/KHE9Y1tzPj4yXXwwLChxLXR8MCk8MTYwKTowKXtHPWNbdj4+Ml18MDtjW3M+PjJdPXErNDtjW3E+PjJdPUd9Z1trPj4yXT0rSG0oQyxjW3U+PjJdfDAsaik7cWsobix0LGNbcz4+Ml18MCxqKTtpZigoenwwKT09MCl7az0wO3E9MX1lbHNle2s9Y1t6KzEyPj4yXXwwO2lmKChrfDApPT0oY1t6KzE2Pj4yXXwwKSl7az1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtrPWNbaz4+Ml18MH1xPShrfDApPT0tMTtrPXE/MDp6O3E9cT8xOjB9aWYoKEJ8MCkhPTApe3I9Y1tCKzEyPj4yXXwwO2lmKChyfDApPT0oY1tCKzE2Pj4yXXwwKSl7cj1vY1tjWyhjW0I+PjJdfDApKzM2Pj4yXSYxMjddKEIpfDB9ZWxzZXtyPWNbcj4+Ml18MH1pZighKChyfDApPT0tMSkpe2lmKCFxKXttPTcwfX1lbHNle209Njh9fWVsc2V7bT02OH1pZigobXwwKT09Njg/cTowKXttPTcwfWlmKChtfDApPT03MCl7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT1rO2lmKCEoKGFbbz4+MF0mMSk9PTApPyhsPWNbcD4+Ml18MCwobHwwKSE9MCk6MCl7dm4obCl9aWYoKGFbbj4+MF0mMSk9PTApe2k9ZDtyZXR1cm59aj1jW24rOD4+Ml18MDtpZigoanwwKT09MCl7aT1kO3JldHVybn12bihqKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIGlpKGIsZCxlLGYsZyxqLGspe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTA7ZD1pO2k9aSszNTJ8MDt3PWQrMjA4fDA7eT1kKzE4NHwwO3A9ZCs0fDA7bj1kKzh8MDtvPWQrMTk2fDA7dT1kO3Q9ZCsyNHwwO3M9ZCsxOTJ8MDt2PWQrMTg4fDA7cj1kKzMzN3wwO3g9ZCszMzZ8MDt6PWNbZT4+Ml18MDtCPWNbZj4+Ml18MDtxaShuLGcsdyx5LHApO2NbbyswPj4yXT0wO2Nbbys0Pj4yXT0wO2Nbbys4Pj4yXT0wO2hnKG8sMTApO2lmKChhW28+PjBdJjEpPT0wKXtDPW8rMXwwO2U9QztmPW8rOHwwfWVsc2V7Qz1vKzh8MDtlPW8rMXwwO2Y9QztDPWNbQz4+Ml18MH1jW3U+PjJdPUM7Y1tzPj4yXT10O2Nbdj4+Ml09MDthW3I+PjBdPTE7YVt4Pj4wXT02OTtnPW8rNHwwO3k9Y1t5Pj4yXXwwO0E9Y1twPj4yXXwwO3A9bys4fDA7d2hpbGUoMSl7aWYoKHp8MCk9PTApe0Q9MTt6PTB9ZWxzZXtEPWNbeisxMj4+Ml18MDtpZigoRHwwKT09KGNbeisxNj4+Ml18MCkpe0Q9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7RD1jW0Q+PjJdfDB9Rj0oRHwwKT09LTE7RD1GPzE6MDt6PUY/MDp6fWlmKChCfDApIT0wKXtFPWNbQisxMj4+Ml18MDtpZigoRXwwKT09KGNbQisxNj4+Ml18MCkpe0U9b2NbY1soY1tCPj4yXXwwKSszNj4+Ml0mMTI3XShCKXwwfWVsc2V7RT1jW0U+PjJdfDB9aWYoISgoRXwwKT09LTEpKXtpZighRCl7YnJlYWt9fWVsc2V7bT0xNn19ZWxzZXttPTE2fWlmKChtfDApPT0xNil7bT0wO2lmKEQpe0I9MDticmVha31lbHNle0I9MH19RD1hW28+PjBdfDA7RT0oRCYxKT09MDtpZihFKXtGPShEJjI1NSk+Pj4xfWVsc2V7Rj1jW2c+PjJdfDB9aWYoKChjW3U+PjJdfDApLUN8MCk9PShGfDApKXtpZihFKXtHPShEJjI1NSk+Pj4xO0Y9KEQmMjU1KT4+PjE7Qz1HPDwxO0Q9R31lbHNle0Q9Y1tnPj4yXXwwO0Y9Y1tnPj4yXXwwO0M9RDw8MX1kb3tpZighKEY+Pj4wPEM+Pj4wKSl7aWYoRSl7YVtvK0MrMT4+MF09MDthW28+PjBdPUQ8PDI7YnJlYWt9ZWxzZXthWyhjW3A+PjJdfDApK0M+PjBdPTA7Y1tnPj4yXT1DO2JyZWFrfX1lbHNle2hnKG8sQy1GfDApfX13aGlsZSgwKTtGPWFbbz4+MF18MDtpZigoRiYxKT09MCl7RT0xMH1lbHNle0U9Y1tvPj4yXXwwO0Y9RSYyNTU7RT0oRSYtMikrIC0xfDB9Qz0oRiYxKT09MDtpZihDKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW2c+PjJdfDB9ZG97aWYoIShGPj4+MDxFPj4+MCkpe2lmKEMpe2FbbytFKzE+PjBdPTA7YVtvPj4wXT1FPDwxO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKStFPj4wXT0wO2NbZz4+Ml09RTticmVha319ZWxzZXtoZyhvLEUtRnwwKX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9ZX1lbHNle0M9Y1tmPj4yXXwwfWNbdT4+Ml09QytEfUU9eisxMnwwO0Y9Y1tFPj4yXXwwO0Q9eisxNnwwO2lmKChGfDApPT0oY1tEPj4yXXwwKSl7Rj1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtGPWNbRj4+Ml18MH1pZigocmkoRixyLHgsQyx1LHksQSxuLHQscyx2LHcpfDApIT0wKXticmVha31GPWNbRT4+Ml18MDtpZigoRnwwKT09KGNbRD4+Ml18MCkpe29jW2NbKGNbej4+Ml18MCkrNDA+PjJdJjEyN10oeil8MDtjb250aW51ZX1lbHNle2NbRT4+Ml09Ris0O2NvbnRpbnVlfX13PWFbbj4+MF18MDtpZigodyYxKT09MCl7dz0odyYyNTUpPj4+MX1lbHNle3c9Y1tuKzQ+PjJdfDB9aWYoKCh3fDApIT0wPyhhW3I+PjBdfDApIT0wOjApPyhxPWNbcz4+Ml18MCwocS10fDApPDE2MCk6MCl7Rz1jW3Y+PjJdfDA7Y1tzPj4yXT1xKzQ7Y1txPj4yXT1HfWhbaz4+M109K0dtKEMsY1t1Pj4yXXwwLGopO3FrKG4sdCxjW3M+PjJdfDAsaik7aWYoKHp8MCk9PTApe2s9MDtxPTF9ZWxzZXtrPWNbeisxMj4+Ml18MDtpZigoa3wwKT09KGNbeisxNj4+Ml18MCkpe2s9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7az1jW2s+PjJdfDB9cT0oa3wwKT09LTE7az1xPzA6ejtxPXE/MTowfWlmKChCfDApIT0wKXtyPWNbQisxMj4+Ml18MDtpZigocnwwKT09KGNbQisxNj4+Ml18MCkpe3I9b2NbY1soY1tCPj4yXXwwKSszNj4+Ml0mMTI3XShCKXwwfWVsc2V7cj1jW3I+PjJdfDB9aWYoISgocnwwKT09LTEpKXtpZighcSl7bT03MH19ZWxzZXttPTY4fX1lbHNle209Njh9aWYoKG18MCk9PTY4P3E6MCl7bT03MH1pZigobXwwKT09NzApe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09aztpZighKChhW28+PjBdJjEpPT0wKT8obD1jW3A+PjJdfDAsKGx8MCkhPTApOjApe3ZuKGwpfWlmKChhW24+PjBdJjEpPT0wKXtpPWQ7cmV0dXJufWo9Y1tuKzg+PjJdfDA7aWYoKGp8MCk9PTApe2k9ZDtyZXR1cm59dm4oaik7aT1kO3JldHVybn1mdW5jdGlvbiBqaShiLGQsZSxmLGcsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wO2Q9aTtpPWkrMzUyfDA7dz1kKzIwOHwwO3k9ZCsxODR8MDtwPWQrNHwwO249ZCs4fDA7bz1kKzE5NnwwO3U9ZDt0PWQrMjR8MDtzPWQrMTkyfDA7dj1kKzE4OHwwO3I9ZCszMzd8MDt4PWQrMzM2fDA7ej1jW2U+PjJdfDA7Qj1jW2Y+PjJdfDA7cWkobixnLHcseSxwKTtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtoZyhvLDEwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz1vKzF8MDtlPUM7Zj1vKzh8MH1lbHNle0M9bys4fDA7ZT1vKzF8MDtmPUM7Qz1jW0M+PjJdfDB9Y1t1Pj4yXT1DO2Nbcz4+Ml09dDtjW3Y+PjJdPTA7YVtyPj4wXT0xO2FbeD4+MF09Njk7Zz1vKzR8MDt5PWNbeT4+Ml18MDtBPWNbcD4+Ml18MDtwPW8rOHwwO3doaWxlKDEpe2lmKCh6fDApPT0wKXtEPTE7ej0wfWVsc2V7RD1jW3orMTI+PjJdfDA7aWYoKER8MCk9PShjW3orMTY+PjJdfDApKXtEPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle0Q9Y1tEPj4yXXwwfUY9KER8MCk9PS0xO0Q9Rj8xOjA7ej1GPzA6en1pZigoQnwwKSE9MCl7RT1jW0IrMTI+PjJdfDA7aWYoKEV8MCk9PShjW0IrMTY+PjJdfDApKXtFPW9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MH1lbHNle0U9Y1tFPj4yXXwwfWlmKCEoKEV8MCk9PS0xKSl7aWYoIUQpe2JyZWFrfX1lbHNle209MTZ9fWVsc2V7bT0xNn1pZigobXwwKT09MTYpe209MDtpZihEKXtCPTA7YnJlYWt9ZWxzZXtCPTB9fUQ9YVtvPj4wXXwwO0U9KEQmMSk9PTA7aWYoRSl7Rj0oRCYyNTUpPj4+MX1lbHNle0Y9Y1tnPj4yXXwwfWlmKCgoY1t1Pj4yXXwwKS1DfDApPT0oRnwwKSl7aWYoRSl7Rz0oRCYyNTUpPj4+MTtGPShEJjI1NSk+Pj4xO0M9Rzw8MTtEPUd9ZWxzZXtEPWNbZz4+Ml18MDtGPWNbZz4+Ml18MDtDPUQ8PDF9ZG97aWYoIShGPj4+MDxDPj4+MCkpe2lmKEUpe2FbbytDKzE+PjBdPTA7YVtvPj4wXT1EPDwyO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKStDPj4wXT0wO2NbZz4+Ml09QzticmVha319ZWxzZXtoZyhvLEMtRnwwKX19d2hpbGUoMCk7Rj1hW28+PjBdfDA7aWYoKEYmMSk9PTApe0U9MTB9ZWxzZXtFPWNbbz4+Ml18MDtGPUUmMjU1O0U9KEUmLTIpKyAtMXwwfUM9KEYmMSk9PTA7aWYoQyl7Rj0oRiYyNTUpPj4+MX1lbHNle0Y9Y1tnPj4yXXwwfWRve2lmKCEoRj4+PjA8RT4+PjApKXtpZihDKXthW28rRSsxPj4wXT0wO2Fbbz4+MF09RTw8MTticmVha31lbHNle2FbKGNbcD4+Ml18MCkrRT4+MF09MDtjW2c+PjJdPUU7YnJlYWt9fWVsc2V7aGcobyxFLUZ8MCl9fXdoaWxlKDApO2lmKChhW28+PjBdJjEpPT0wKXtDPWV9ZWxzZXtDPWNbZj4+Ml18MH1jW3U+PjJdPUMrRH1FPXorMTJ8MDtGPWNbRT4+Ml18MDtEPXorMTZ8MDtpZigoRnwwKT09KGNbRD4+Ml18MCkpe0Y9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7Rj1jW0Y+PjJdfDB9aWYoKHJpKEYscix4LEMsdSx5LEEsbix0LHMsdix3KXwwKSE9MCl7YnJlYWt9Rj1jW0U+PjJdfDA7aWYoKEZ8MCk9PShjW0Q+PjJdfDApKXtvY1tjWyhjW3o+PjJdfDApKzQwPj4yXSYxMjddKHopfDA7Y29udGludWV9ZWxzZXtjW0U+PjJdPUYrNDtjb250aW51ZX19dz1hW24+PjBdfDA7aWYoKHcmMSk9PTApe3c9KHcmMjU1KT4+PjF9ZWxzZXt3PWNbbis0Pj4yXXwwfWlmKCgod3wwKSE9MD8oYVtyPj4wXXwwKSE9MDowKT8ocT1jW3M+PjJdfDAsKHEtdHwwKTwxNjApOjApe0c9Y1t2Pj4yXXwwO2Nbcz4+Ml09cSs0O2NbcT4+Ml09R31oW2s+PjNdPStGbShDLGNbdT4+Ml18MCxqKTtxayhuLHQsY1tzPj4yXXwwLGopO2lmKCh6fDApPT0wKXtrPTA7cT0xfWVsc2V7az1jW3orMTI+PjJdfDA7aWYoKGt8MCk9PShjW3orMTY+PjJdfDApKXtrPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle2s9Y1trPj4yXXwwfXE9KGt8MCk9PS0xO2s9cT8wOno7cT1xPzE6MH1pZigoQnwwKSE9MCl7cj1jW0IrMTI+PjJdfDA7aWYoKHJ8MCk9PShjW0IrMTY+PjJdfDApKXtyPW9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MH1lbHNle3I9Y1tyPj4yXXwwfWlmKCEoKHJ8MCk9PS0xKSl7aWYoIXEpe209NzB9fWVsc2V7bT02OH19ZWxzZXttPTY4fWlmKChtfDApPT02OD9xOjApe209NzB9aWYoKG18MCk9PTcwKXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPWs7aWYoISgoYVtvPj4wXSYxKT09MCk/KGw9Y1twPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1qPWNbbis4Pj4yXXwwO2lmKChqfDApPT0wKXtpPWQ7cmV0dXJufXZuKGopO2k9ZDtyZXR1cm59ZnVuY3Rpb24ga2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MDtkPWk7aT1pKzMwNHwwO249ZDtvPWQrMTkyfDA7bD1kKzE3NnwwO3Y9ZCsxNnwwO3E9Y1tnKzI4Pj4yXXwwO0M9cSs0fDA7Y1tDPj4yXT0oY1tDPj4yXXwwKSsxO2lmKCEoKGNbMzM2Ml18MCk9PS0xKSl7Y1tuPj4yXT0xMzQ0ODtjW24rND4+Ml09MjA4O2Nbbis4Pj4yXT0wO2NnKDEzNDQ4LG4pfWc9KGNbMTM0NTI+PjJdfDApKyAtMXwwO3A9Y1txKzg+PjJdfDA7aWYoKGNbcSsxMj4+Ml18MCktcD4+Mj4+PjA+Zz4+PjA/KG09Y1twKyhnPDwyKT4+Ml18MCwobXwwKSE9MCk6MCl7dWNbY1soY1ttPj4yXXwwKSs0OD4+Ml0mMzFdKG0sMTIwMTYsMTIwNDJ8MCxvKXwwO0I9cSs0fDA7Qz1jW0I+PjJdfDA7Y1tCPj4yXT1DKyAtMTtpZigoQ3wwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfWNbbCswPj4yXT0wO2NbbCs0Pj4yXT0wO2NbbCs4Pj4yXT0wO2hnKGwsMTApO2lmKChhW2w+PjBdJjEpPT0wKXt5PWwrMXwwO3A9eTtxPWwrOHwwfWVsc2V7eT1sKzh8MDtwPWwrMXwwO3E9eTt5PWNbeT4+Ml18MH1yPWwrNHwwO3Q9bys5NnwwO3U9bysxMDB8MDtzPW8rMTA0fDA7Zz1vO209bCs4fDA7eD1jW2U+PjJdfDA7dz0wO3o9eTthOndoaWxlKDEpe2lmKCh4fDApIT0wKXtBPWNbeCsxMj4+Ml18MDtpZigoQXwwKT09KGNbeCsxNj4+Ml18MCkpe0E9b2NbY1soY1t4Pj4yXXwwKSszNj4+Ml0mMTI3XSh4KXwwfWVsc2V7QT1jW0E+PjJdfDB9aWYoKEF8MCk9PS0xKXtjW2U+PjJdPTA7eD0wO0E9MX1lbHNle0E9MH19ZWxzZXt4PTA7QT0xfUM9Y1tmPj4yXXwwO2Rve2lmKChDfDApIT0wKXtCPWNbQysxMj4+Ml18MDtpZigoQnwwKT09KGNbQysxNj4+Ml18MCkpe0I9b2NbY1soY1tDPj4yXXwwKSszNj4+Ml0mMTI3XShDKXwwfWVsc2V7Qj1jW0I+PjJdfDB9aWYoISgoQnwwKT09LTEpKXtpZihBKXticmVha31lbHNle2JyZWFrIGF9fWVsc2V7Y1tmPj4yXT0wO2s9Mjc7YnJlYWt9fWVsc2V7az0yN319d2hpbGUoMCk7aWYoKGt8MCk9PTI3PyhrPTAsQSk6MCl7YnJlYWt9Qz1hW2w+PjBdfDA7QT0oQyYxKT09MDtpZihBKXtCPShDJjI1NSk+Pj4xfWVsc2V7Qj1jW3I+PjJdfDB9aWYoKHoteXwwKT09KEJ8MCkpe2lmKEEpe3o9KEMmMjU1KT4+PjE7Qj0oQyYyNTUpPj4+MTt5PXo8PDF9ZWxzZXt6PWNbcj4+Ml18MDtCPWNbcj4+Ml18MDt5PXo8PDF9ZG97aWYoIShCPj4+MDx5Pj4+MCkpe2lmKEEpe2FbbCt5KzE+PjBdPTA7YVtsPj4wXT16PDwyO2JyZWFrfWVsc2V7YVsoY1ttPj4yXXwwKSt5Pj4wXT0wO2Nbcj4+Ml09eTticmVha319ZWxzZXtoZyhsLHktQnwwKX19d2hpbGUoMCk7Qj1hW2w+PjBdfDA7aWYoKEImMSk9PTApe0E9MTB9ZWxzZXtBPWNbbD4+Ml18MDtCPUEmMjU1O0E9KEEmLTIpKyAtMXwwfXk9KEImMSk9PTA7aWYoeSl7Qj0oQiYyNTUpPj4+MX1lbHNle0I9Y1tyPj4yXXwwfWRve2lmKCEoQj4+PjA8QT4+PjApKXtpZih5KXthW2wrQSsxPj4wXT0wO2FbbD4+MF09QTw8MTticmVha31lbHNle2FbKGNbbT4+Ml18MCkrQT4+MF09MDtjW3I+PjJdPUE7YnJlYWt9fWVsc2V7aGcobCxBLUJ8MCl9fXdoaWxlKDApO2lmKChhW2w+PjBdJjEpPT0wKXt5PXB9ZWxzZXt5PWNbcT4+Ml18MH16PXkrenwwfUE9Y1t4KzEyPj4yXXwwO2lmKChBfDApPT0oY1t4KzE2Pj4yXXwwKSl7QT1vY1tjWyhjW3g+PjJdfDApKzM2Pj4yXSYxMjddKHgpfDB9ZWxzZXtBPWNbQT4+Ml18MH14PSh6fDApPT0oeXwwKTtkb3tpZih4KXtCPShjW3Q+PjJdfDApPT0oQXwwKTtpZighQj8oY1t1Pj4yXXwwKSE9KEF8MCk6MCl7Qj1vO2s9NjI7YnJlYWt9YVt6Pj4wXT1CPzQzOjQ1O3o9eisxfDA7dz0wfWVsc2V7Qj1vO2s9NjJ9fXdoaWxlKDApO2Rve2lmKChrfDApPT02Mil7d2hpbGUoMSl7az0wO2lmKChjW0I+PjJdfDApPT0oQXwwKSl7YnJlYWt9Qj1CKzR8MDtpZigoQnwwKT09KHN8MCkpe0I9czticmVha31lbHNle2s9NjJ9fUI9Qi1nfDA7QT1CPj4yO2lmKChCfDApPjkyKXticmVhayBhfWlmKChCfDApPDg4KXthW3o+PjBdPWFbMTIwMTYrQT4+MF18MDt6PXorMXwwO3c9dysxfDA7YnJlYWt9aWYoeCl7eT16O2JyZWFrIGF9aWYoKHoteXwwKT49Myl7YnJlYWsgYX1pZigoYVt6KyAtMT4+MF18MCkhPTQ4KXticmVhayBhfWFbej4+MF09YVsxMjAxNitBPj4wXXwwO3o9eisxfDA7dz0wfX13aGlsZSgwKTt4PWNbZT4+Ml18MDtCPXgrMTJ8MDtBPWNbQj4+Ml18MDtpZigoQXwwKT09KGNbeCsxNj4+Ml18MCkpe29jW2NbKGNbeD4+Ml18MCkrNDA+PjJdJjEyN10oeCl8MDtDPXY7dj1DO2NvbnRpbnVlfWVsc2V7Y1tCPj4yXT1BKzQ7Qz12O3Y9Qztjb250aW51ZX19YVt5KzM+PjBdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfUM9Y1szMzQwXXwwO2Nbbj4+Ml09ajtpZigoWWgoeSxDLG4pfDApIT0xKXtjW2g+PjJdPTR9aj1jW2U+PjJdfDA7aWYoKGp8MCkhPTApe249Y1tqKzEyPj4yXXwwO2lmKChufDApPT0oY1tqKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW2o+PjJdfDApKzM2Pj4yXSYxMjddKGopfDB9ZWxzZXtuPWNbbj4+Ml18MH1pZigobnwwKT09LTEpe2NbZT4+Ml09MDtqPTA7ZT0xfWVsc2V7ZT0wfX1lbHNle2o9MDtlPTF9bj1jW2Y+PjJdfDA7ZG97aWYoKG58MCkhPTApe289Y1tuKzEyPj4yXXwwO2lmKChvfDApPT0oY1tuKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDB9ZWxzZXtuPWNbbz4+Ml18MH1pZighKChufDApPT0tMSkpe2lmKGUpe2JyZWFrfWVsc2V7az05NDticmVha319ZWxzZXtjW2Y+PjJdPTA7az05MjticmVha319ZWxzZXtrPTkyfX13aGlsZSgwKTtpZigoa3wwKT09OTI/ZTowKXtrPTk0fWlmKChrfDApPT05NCl7Y1toPj4yXT1jW2g+PjJdfDJ9Y1tiPj4yXT1qO2lmKChhW2w+PjBdJjEpPT0wKXtpPWQ7cmV0dXJufWY9Y1ttPj4yXXwwO2lmKChmfDApPT0wKXtpPWQ7cmV0dXJufXZuKGYpO2k9ZDtyZXR1cm59Qz1YYSg0KXwwO2NbQz4+Ml09MjEzMDQ7d2IoQ3wwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gbGkoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MDtuPWk7cD1jW2Y+PjJdfDA7bz0ocHwwKT09KGV8MCk7ZG97aWYobyl7cT0oY1ttKzk2Pj4yXXwwKT09KGJ8MCk7aWYoIXE/KGNbbSsxMDA+PjJdfDApIT0oYnwwKTowKXticmVha31jW2Y+PjJdPWUrMTthW2U+PjBdPXE/NDM6NDU7Y1tnPj4yXT0wO3E9MDtpPW47cmV0dXJuIHF8MH19d2hpbGUoMCk7cT1hW2o+PjBdfDA7aWYoKHEmMSk9PTApe2o9KHEmMjU1KT4+PjF9ZWxzZXtqPWNbais0Pj4yXXwwfWlmKChqfDApIT0wJihifDApPT0oaHwwKSl7bz1jW2w+PjJdfDA7aWYoKG8ta3wwKT49MTYwKXtxPTA7aT1uO3JldHVybiBxfDB9cT1jW2c+PjJdfDA7Y1tsPj4yXT1vKzQ7Y1tvPj4yXT1xO2NbZz4+Ml09MDtxPTA7aT1uO3JldHVybiBxfDB9bD1tKzEwNHwwO2s9bTt3aGlsZSgxKXtpZigoY1trPj4yXXwwKT09KGJ8MCkpe2JyZWFrfWs9ays0fDA7aWYoKGt8MCk9PShsfDApKXtrPWw7YnJlYWt9fWI9ay1tfDA7bT1iPj4yO2lmKChifDApPjkyKXtxPS0xO2k9bjtyZXR1cm4gcXwwfWlmKChkfDApPT0xMHwoZHwwKT09OCl7aWYoKG18MCk+PShkfDApKXtxPS0xO2k9bjtyZXR1cm4gcXwwfX1lbHNlIGlmKChkfDApPT0xNj8oYnwwKT49ODg6MCl7aWYobyl7cT0tMTtpPW47cmV0dXJuIHF8MH1pZigocC1lfDApPj0zKXtxPS0xO2k9bjtyZXR1cm4gcXwwfWlmKChhW3ArIC0xPj4wXXwwKSE9NDgpe3E9LTE7aT1uO3JldHVybiBxfDB9Y1tnPj4yXT0wO3E9YVsxMjAxNittPj4wXXwwO2NbZj4+Ml09cCsxO2FbcD4+MF09cTtxPTA7aT1uO3JldHVybiBxfDB9cT1hWzEyMDE2K20+PjBdfDA7Y1tmPj4yXT1wKzE7YVtwPj4wXT1xO2NbZz4+Ml09KGNbZz4+Ml18MCkrMTtxPTA7aT1uO3JldHVybiBxfDB9ZnVuY3Rpb24gbWkoYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7aD1pO2k9aSsxNnwwO2w9aDtkPWNbZCsyOD4+Ml18MDtvPWQrNHwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1uPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtqPWQrMTJ8MDttPWQrOHwwO289Y1ttPj4yXXwwO2lmKChjW2o+PjJdfDApLW8+PjI+Pj4wPm4+Pj4wPyhrPWNbbysobjw8Mik+PjJdfDAsKGt8MCkhPTApOjApe3VjW2NbKGNbaz4+Ml18MCkrMzI+PjJdJjMxXShrLDEyMDE2LDEyMDQyfDAsZSl8MDtpZighKChjWzM0MDBdfDApPT0tMSkpe2NbbD4+Ml09MTM2MDA7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzYwMCxsKX1lPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDtrPWNbbT4+Ml18MDtpZigoY1tqPj4yXXwwKS1rPj4yPj4+MD5lPj4+MD8oZz1jW2srKGU8PDIpPj4yXXwwLChnfDApIT0wKTowKXthW2Y+PjBdPW9jW2NbKGNbZz4+Ml18MCkrMTY+PjJdJjEyN10oZyl8MDttY1tjWyhjW2c+PjJdfDApKzIwPj4yXSYxMjddKGIsZyk7bj1kKzR8MDtvPWNbbj4+Ml18MDtjW24+PjJdPW8rIC0xO2lmKChvfDApIT0wKXtpPWg7cmV0dXJufWxjW2NbKGNbZD4+Ml18MCkrOD4+Ml0mMjU1XShkKTtpPWg7cmV0dXJufW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIG5pKGIsZCxlLGYsZyl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTA7aj1pO2k9aSsxNnwwO2w9ajtkPWNbZCsyOD4+Ml18MDtwPWQrNHwwO2NbcD4+Ml09KGNbcD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1vPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtrPWQrMTJ8MDtuPWQrOHwwO3A9Y1tuPj4yXXwwO2lmKChjW2s+PjJdfDApLXA+PjI+Pj4wPm8+Pj4wPyhtPWNbcCsobzw8Mik+PjJdfDAsKG18MCkhPTApOjApe3VjW2NbKGNbbT4+Ml18MCkrMzI+PjJdJjMxXShtLDEyMDE2LDEyMDQ4fDAsZSl8MDtpZighKChjWzM0MDBdfDApPT0tMSkpe2NbbD4+Ml09MTM2MDA7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzYwMCxsKX1lPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDtsPWNbbj4+Ml18MDtpZigoY1trPj4yXXwwKS1sPj4yPj4+MD5lPj4+MD8oaD1jW2wrKGU8PDIpPj4yXXwwLChofDApIT0wKTowKXthW2Y+PjBdPW9jW2NbKGNbaD4+Ml18MCkrMTI+PjJdJjEyN10oaCl8MDthW2c+PjBdPW9jW2NbKGNbaD4+Ml18MCkrMTY+PjJdJjEyN10oaCl8MDttY1tjWyhjW2g+PjJdfDApKzIwPj4yXSYxMjddKGIsaCk7bz1kKzR8MDtwPWNbbz4+Ml18MDtjW28+PjJdPXArIC0xO2lmKChwfDApIT0wKXtpPWo7cmV0dXJufWxjW2NbKGNbZD4+Ml18MCkrOD4+Ml0mMjU1XShkKTtpPWo7cmV0dXJufXA9WGEoNCl8MDtjW3A+PjJdPTIxMzA0O3diKHB8MCwyMTM3NiwxOTYpfXA9WGEoNCl8MDtjW3A+PjJdPTIxMzA0O3diKHB8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIG9pKGIsZCxlLGYsZyxoLGosayxsLG0sbixvKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDtvPW98MDt2YXIgcD0wLHE9MDtwPWk7aWYoYjw8MjQ+PjI0PT1oPDwyND4+MjQpe2lmKChhW2Q+PjBdfDApPT0wKXtqPS0xO2k9cDtyZXR1cm4ganwwfWFbZD4+MF09MDtqPWNbZz4+Ml18MDtjW2c+PjJdPWorMTthW2o+PjBdPTQ2O2c9YVtrPj4wXXwwO2lmKChnJjEpPT0wKXtnPShnJjI1NSk+Pj4xfWVsc2V7Zz1jW2srND4+Ml18MH1pZigoZ3wwKT09MCl7aj0wO2k9cDtyZXR1cm4ganwwfWc9Y1ttPj4yXXwwO2lmKChnLWx8MCk+PTE2MCl7aj0wO2k9cDtyZXR1cm4ganwwfWo9Y1tuPj4yXXwwO2NbbT4+Ml09Zys0O2NbZz4+Ml09ajtqPTA7aT1wO3JldHVybiBqfDB9aWYoYjw8MjQ+PjI0PT1qPDwyND4+MjQpe2g9YVtrPj4wXXwwO2lmKChoJjEpPT0wKXtoPShoJjI1NSk+Pj4xfWVsc2V7aD1jW2srND4+Ml18MH1pZigoaHwwKSE9MCl7aWYoKGFbZD4+MF18MCk9PTApe2o9LTE7aT1wO3JldHVybiBqfDB9Zz1jW20+PjJdfDA7aWYoKGctbHwwKT49MTYwKXtqPTA7aT1wO3JldHVybiBqfDB9aj1jW24+PjJdfDA7Y1ttPj4yXT1nKzQ7Y1tnPj4yXT1qO2Nbbj4+Ml09MDtqPTA7aT1wO3JldHVybiBqfDB9fWg9byszMnwwO2o9bztkb3tpZigoYVtqPj4wXXwwKT09Yjw8MjQ+PjI0KXtoPWo7YnJlYWt9aj1qKzF8MH13aGlsZSgoanwwKSE9KGh8MCkpO2I9aC1vfDA7aWYoKGJ8MCk+MzEpe2o9LTE7aT1wO3JldHVybiBqfDB9bz1hWzEyMDE2K2I+PjBdfDA7aWYoKGJ8MCk9PTIzfChifDApPT0yMil7YVtlPj4wXT04MDtqPWNbZz4+Ml18MDtjW2c+PjJdPWorMTthW2o+PjBdPW87aj0wO2k9cDtyZXR1cm4ganwwfWVsc2UgaWYoKGJ8MCk9PTI0fChifDApPT0yNSl7bj1jW2c+PjJdfDA7aWYoKG58MCkhPShmfDApPyhhW24rIC0xPj4wXSY5NXwwKSE9KGFbZT4+MF0mMTI3fDApOjApe2o9LTE7aT1wO3JldHVybiBqfDB9Y1tnPj4yXT1uKzE7YVtuPj4wXT1vO2o9MDtpPXA7cmV0dXJuIGp8MH1lbHNle2Y9byY5NTtpZigoZnwwKT09KGFbZT4+MF18MCk/KGFbZT4+MF09ZnwxMjgsKGFbZD4+MF18MCkhPTApOjApe2FbZD4+MF09MDtlPWFbaz4+MF18MDtpZigoZSYxKT09MCl7az0oZSYyNTUpPj4+MX1lbHNle2s9Y1trKzQ+PjJdfDB9aWYoKGt8MCkhPTA/KHE9Y1ttPj4yXXwwLChxLWx8MCk8MTYwKTowKXtqPWNbbj4+Ml18MDtjW20+PjJdPXErNDtjW3E+PjJdPWp9fWo9Y1tnPj4yXXwwO2NbZz4+Ml09aisxO2Fbaj4+MF09bztpZigoYnwwKT4yMSl7aj0wO2k9cDtyZXR1cm4ganwwfWNbbj4+Ml09KGNbbj4+Ml18MCkrMTtqPTA7aT1wO3JldHVybiBqfDB9cmV0dXJuIDB9ZnVuY3Rpb24gcGkoYSxiLGQsZSl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Zz1pO2k9aSsxNnwwO2s9ZztiPWNbYisyOD4+Ml18MDtuPWIrNHwwO2Nbbj4+Ml09KGNbbj4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ0OCxrKX1tPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtoPWIrMTJ8MDtsPWIrOHwwO249Y1tsPj4yXXwwO2lmKChjW2g+PjJdfDApLW4+PjI+Pj4wPm0+Pj4wPyhqPWNbbisobTw8Mik+PjJdfDAsKGp8MCkhPTApOjApe3VjW2NbKGNbaj4+Ml18MCkrNDg+PjJdJjMxXShqLDEyMDE2LDEyMDQyfDAsZCl8MDtpZighKChjWzM0MDJdfDApPT0tMSkpe2Nbaz4+Ml09MTM2MDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzYwOCxrKX1kPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtqPWNbbD4+Ml18MDtpZigoY1toPj4yXXwwKS1qPj4yPj4+MD5kPj4+MD8oZj1jW2orKGQ8PDIpPj4yXXwwLChmfDApIT0wKTowKXtjW2U+PjJdPW9jW2NbKGNbZj4+Ml18MCkrMTY+PjJdJjEyN10oZil8MDttY1tjWyhjW2Y+PjJdfDApKzIwPj4yXSYxMjddKGEsZik7bT1iKzR8MDtuPWNbbT4+Ml18MDtjW20+PjJdPW4rIC0xO2lmKChufDApIT0wKXtpPWc7cmV0dXJufWxjW2NbKGNbYj4+Ml18MCkrOD4+Ml0mMjU1XShiKTtpPWc7cmV0dXJufW49WGEoNCl8MDtjW24+PjJdPTIxMzA0O3diKG58MCwyMTM3NiwxOTYpfW49WGEoNCl8MDtjW24+PjJdPTIxMzA0O3diKG58MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHFpKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7aD1pO2k9aSsxNnwwO2s9aDtiPWNbYisyOD4+Ml18MDtvPWIrNHwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ0OCxrKX1uPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtqPWIrMTJ8MDttPWIrOHwwO289Y1ttPj4yXXwwO2lmKChjW2o+PjJdfDApLW8+PjI+Pj4wPm4+Pj4wPyhsPWNbbysobjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe3VjW2NbKGNbbD4+Ml18MCkrNDg+PjJdJjMxXShsLDEyMDE2LDEyMDQ4fDAsZCl8MDtpZighKChjWzM0MDJdfDApPT0tMSkpe2Nbaz4+Ml09MTM2MDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzYwOCxrKX1kPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtrPWNbbT4+Ml18MDtpZigoY1tqPj4yXXwwKS1rPj4yPj4+MD5kPj4+MD8oZz1jW2srKGQ8PDIpPj4yXXwwLChnfDApIT0wKTowKXtjW2U+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMTI+PjJdJjEyN10oZyl8MDtjW2Y+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMTY+PjJdJjEyN10oZyl8MDttY1tjWyhjW2c+PjJdfDApKzIwPj4yXSYxMjddKGEsZyk7bj1iKzR8MDtvPWNbbj4+Ml18MDtjW24+PjJdPW8rIC0xO2lmKChvfDApIT0wKXtpPWg7cmV0dXJufWxjW2NbKGNbYj4+Ml18MCkrOD4+Ml0mMjU1XShiKTtpPWg7cmV0dXJufW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHJpKGIsZCxlLGYsZyxoLGosayxsLG0sbixvKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDtvPW98MDt2YXIgcD0wLHE9MDtwPWk7aWYoKGJ8MCk9PShofDApKXtpZigoYVtkPj4wXXwwKT09MCl7aj0tMTtpPXA7cmV0dXJuIGp8MH1hW2Q+PjBdPTA7aj1jW2c+PjJdfDA7Y1tnPj4yXT1qKzE7YVtqPj4wXT00NjtnPWFbaz4+MF18MDtpZigoZyYxKT09MCl7Zz0oZyYyNTUpPj4+MX1lbHNle2c9Y1trKzQ+PjJdfDB9aWYoKGd8MCk9PTApe2o9MDtpPXA7cmV0dXJuIGp8MH1nPWNbbT4+Ml18MDtpZigoZy1sfDApPj0xNjApe2o9MDtpPXA7cmV0dXJuIGp8MH1qPWNbbj4+Ml18MDtjW20+PjJdPWcrNDtjW2c+PjJdPWo7aj0wO2k9cDtyZXR1cm4ganwwfWlmKChifDApPT0oanwwKSl7aD1hW2s+PjBdfDA7aWYoKGgmMSk9PTApe2g9KGgmMjU1KT4+PjF9ZWxzZXtoPWNbays0Pj4yXXwwfWlmKChofDApIT0wKXtpZigoYVtkPj4wXXwwKT09MCl7aj0tMTtpPXA7cmV0dXJuIGp8MH1nPWNbbT4+Ml18MDtpZigoZy1sfDApPj0xNjApe2o9MDtpPXA7cmV0dXJuIGp8MH1qPWNbbj4+Ml18MDtjW20+PjJdPWcrNDtjW2c+PjJdPWo7Y1tuPj4yXT0wO2o9MDtpPXA7cmV0dXJuIGp8MH19aD1vKzEyOHwwO2o9bztkb3tpZigoY1tqPj4yXXwwKT09KGJ8MCkpe2g9ajticmVha31qPWorNHwwfXdoaWxlKChqfDApIT0oaHwwKSk7Yj1oLW98MDtoPWI+PjI7aWYoKGJ8MCk+MTI0KXtqPS0xO2k9cDtyZXR1cm4ganwwfW89YVsxMjAxNitoPj4wXXwwO2lmKChofDApPT0yNHwoaHwwKT09MjUpe249Y1tnPj4yXXwwO2lmKChufDApIT0oZnwwKT8oYVtuKyAtMT4+MF0mOTV8MCkhPShhW2U+PjBdJjEyN3wwKTowKXtqPS0xO2k9cDtyZXR1cm4ganwwfWNbZz4+Ml09bisxO2Fbbj4+MF09bztqPTA7aT1wO3JldHVybiBqfDB9ZWxzZSBpZighKChofDApPT0yM3woaHwwKT09MjIpKXtmPW8mOTU7aWYoKGZ8MCk9PShhW2U+PjBdfDApPyhhW2U+PjBdPWZ8MTI4LChhW2Q+PjBdfDApIT0wKTowKXthW2Q+PjBdPTA7ZT1hW2s+PjBdfDA7aWYoKGUmMSk9PTApe2s9KGUmMjU1KT4+PjF9ZWxzZXtrPWNbays0Pj4yXXwwfWlmKChrfDApIT0wPyhxPWNbbT4+Ml18MCwocS1sfDApPDE2MCk6MCl7aj1jW24+PjJdfDA7Y1ttPj4yXT1xKzQ7Y1txPj4yXT1qfX19ZWxzZXthW2U+PjBdPTgwfWo9Y1tnPj4yXXwwO2NbZz4+Ml09aisxO2Fbaj4+MF09bztpZigoYnwwKT44NCl7aj0wO2k9cDtyZXR1cm4ganwwfWNbbj4+Ml09KGNbbj4+Ml18MCkrMTtqPTA7aT1wO3JldHVybiBqfDB9ZnVuY3Rpb24gc2koYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gdGkoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIHVpKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7aj1pO2k9aSszMnwwO209ajtuPWorMjR8MDtrPWorMTJ8MDtpZigoY1tmKzQ+PjJdJjF8MCk9PTApe2w9Y1soY1tkPj4yXXwwKSsyND4+Ml18MDtjW24+PjJdPWNbZT4+Ml07bz1oJjE7Y1ttKzA+PjJdPWNbbiswPj4yXTt3Y1tsJjYzXShiLGQsbSxmLGcsbyk7aT1qO3JldHVybn1kPWNbZisyOD4+Ml18MDtvPWQrNHwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtpZighKChjWzM0MDBdfDApPT0tMSkpe2NbbT4+Ml09MTM2MDA7Y1ttKzQ+PjJdPTIwODtjW20rOD4+Ml09MDtjZygxMzYwMCxtKX1mPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDttPWNbZCs4Pj4yXXwwO2lmKChjW2QrMTI+PjJdfDApLW0+PjI+Pj4wPmY+Pj4wPyhsPWNbbSsoZjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe2c9ZCs0fDA7bz1jW2c+PjJdfDA7Y1tnPj4yXT1vKyAtMTtpZigob3wwKT09MCl7bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpfW09Y1tsPj4yXXwwO2lmKGgpe21jW2NbbSsyND4+Ml0mMTI3XShrLGwpfWVsc2V7bWNbY1ttKzI4Pj4yXSYxMjddKGssbCl9bj1hW2s+PjBdfDA7aWYoKG4mMSk9PTApe2g9aysxfDA7ZD1oO2w9ays4fDB9ZWxzZXtsPWsrOHwwO2Q9Y1tsPj4yXXwwO2g9aysxfDB9bT1rKzR8MDt3aGlsZSgxKXtmPShuJjEpPT0wO2lmKGYpe2c9aDtuPShuJjI1NSk+Pj4xfWVsc2V7Zz1jW2w+PjJdfDA7bj1jW20+PjJdfDB9aWYoKGR8MCk9PShnK258MCkpe2JyZWFrfW89YVtkPj4wXXwwO249Y1tlPj4yXXwwO2Rve2lmKChufDApIT0wKXtmPW4rMjR8MDtnPWNbZj4+Ml18MDtpZigoZ3wwKSE9KGNbbisyOD4+Ml18MCkpe2NbZj4+Ml09ZysxO2FbZz4+MF09bzticmVha31pZigoeGNbY1soY1tuPj4yXXwwKSs1Mj4+Ml0mNjNdKG4sbyYyNTUpfDApPT0tMSl7Y1tlPj4yXT0wfX19d2hpbGUoMCk7bj1hW2s+PjBdfDA7ZD1kKzF8MH1jW2I+PjJdPWNbZT4+Ml07aWYoZil7aT1qO3JldHVybn1rPWNbays4Pj4yXXwwO2lmKChrfDApPT0wKXtpPWo7cmV0dXJufXZuKGspO2k9ajtyZXR1cm59bz1YYSg0KXwwO2Nbbz4+Ml09MjEzMDQ7d2Iob3wwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gdmkoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtkPWk7aT1pKzY0fDA7cj1kO3E9ZCsxNnwwO249ZCsyNHwwO209ZCszNnwwO2s9ZCs4fDA7bD1kKzR8MDtvPWQrMTJ8MDthW3ErMD4+MF09YVsxMjI2ND4+MF18MDthW3ErMT4+MF09YVsxMjI2NT4+MF18MDthW3ErMj4+MF09YVsxMjI2Nj4+MF18MDthW3ErMz4+MF09YVsxMjI2Nz4+MF18MDthW3ErND4+MF09YVsxMjI2OD4+MF18MDthW3ErNT4+MF09YVsxMjI2OT4+MF18MDt0PXErMXwwO3A9Zis0fDA7cz1jW3A+PjJdfDA7aWYoKHMmMjA0OHwwKSE9MCl7YVt0Pj4wXT00Mzt0PXErMnwwfWlmKChzJjUxMnwwKSE9MCl7YVt0Pj4wXT0zNTt0PXQrMXwwfWFbdD4+MF09MTA4O3Q9dCsxfDA7dT1zJjc0O2Rve2lmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZSBpZigodXwwKT09OCl7aWYoKHMmMTYzODR8MCk9PTApe2FbdD4+MF09MTIwO2JyZWFrfWVsc2V7YVt0Pj4wXT04ODticmVha319ZWxzZXthW3Q+PjBdPTEwMH19d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO2Nbcj4+Ml09aDtxPXdpKG4sMTIsdSxxLHIpfDA7aD1uK3F8MDtwPWNbcD4+Ml0mMTc2O2Rve2lmKChwfDApPT0zMil7cD1ofWVsc2UgaWYoKHB8MCk9PTE2KXtwPWFbbj4+MF18MDtpZihwPDwyND4+MjQ9PTQzfHA8PDI0Pj4yND09NDUpe3A9bisxfDA7YnJlYWt9aWYoKHF8MCk+MSZwPDwyND4+MjQ9PTQ4Pyh1PWFbbisxPj4wXXwwLHU8PDI0Pj4yND09ODh8dTw8MjQ+PjI0PT0xMjApOjApe3A9bisyfDB9ZWxzZXtqPTIxfX1lbHNle2o9MjF9fXdoaWxlKDApO2lmKChqfDApPT0yMSl7cD1ufWo9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09ajtqPWorNHwwO2Nbaj4+Ml09KGNbaj4+Ml18MCkrMTt4aShuLHAsaCxtLGssbCxvKTtqPWNbbz4+Ml18MDt0PWorNHwwO3U9Y1t0Pj4yXXwwO2NbdD4+Ml09dSsgLTE7aWYoKHV8MCkhPTApe3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1tsPj4yXXwwO1djKGIscyxtLHQsdSxmLGcpO2k9ZDtyZXR1cm59bGNbY1soY1tqPj4yXXwwKSs4Pj4yXSYyNTVdKGopO3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1tsPj4yXXwwO1djKGIscyxtLHQsdSxmLGcpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gd2koYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MDtnPWk7aT1pKzE2fDA7aD1nO2NbaD4+Ml09ZjtkPWliKGR8MCl8MDtlPVFiKGF8MCxifDAsZXwwLGh8MCl8MDtpZigoZHwwKT09MCl7aT1nO3JldHVybiBlfDB9aWIoZHwwKXwwO2k9ZztyZXR1cm4gZXwwfWZ1bmN0aW9uIHhpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTA7az1pO2k9aSszMnwwO3A9aztsPWsrMTJ8MDtuPWNbaj4+Ml18MDtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbcD4+Ml09MTM0NTY7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzQ1NixwKX1yPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtzPWNbbis4Pj4yXXwwO2lmKCEoKGNbbisxMj4+Ml18MCktcz4+Mj4+PjA+cj4+PjApKXt2PVhhKDQpfDA7Y1t2Pj4yXT0yMTMwNDt3Yih2fDAsMjEzNzYsMTk2KX1uPWNbcysocjw8Mik+PjJdfDA7aWYoKG58MCk9PTApe3Y9WGEoNCl8MDtjW3Y+PjJdPTIxMzA0O3diKHZ8MCwyMTM3NiwxOTYpfWo9Y1tqPj4yXXwwO2lmKCEoKGNbMzQwMF18MCk9PS0xKSl7Y1twPj4yXT0xMzYwMDtjW3ArND4+Ml09MjA4O2NbcCs4Pj4yXT0wO2NnKDEzNjAwLHApfXA9KGNbMTM2MDQ+PjJdfDApKyAtMXwwO3I9Y1tqKzg+PjJdfDA7aWYoISgoY1tqKzEyPj4yXXwwKS1yPj4yPj4+MD5wPj4+MCkpe3Y9WGEoNCl8MDtjW3Y+PjJdPTIxMzA0O3diKHZ8MCwyMTM3NiwxOTYpfWo9Y1tyKyhwPDwyKT4+Ml18MDtpZigoanwwKT09MCl7dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9bWNbY1soY1tqPj4yXXwwKSsyMD4+Ml0mMTI3XShsLGopO3A9YVtsPj4wXXwwO2lmKChwJjEpPT0wKXtwPShwJjI1NSk+Pj4xfWVsc2V7cD1jW2wrND4+Ml18MH1pZigocHwwKSE9MCl7Y1toPj4yXT1mO3A9YVtiPj4wXXwwO2lmKHA8PDI0Pj4yND09NDN8cDw8MjQ+PjI0PT00NSl7dj14Y1tjWyhjW24+PjJdfDApKzI4Pj4yXSY2M10obixwKXwwO3A9Y1toPj4yXXwwO2NbaD4+Ml09cCsxO2FbcD4+MF09djtwPWIrMXwwfWVsc2V7cD1ifWlmKCgoZS1wfDApPjE/KGFbcD4+MF18MCk9PTQ4OjApPyhxPXArMXwwLHY9YVtxPj4wXXwwLHY8PDI0Pj4yND09ODh8djw8MjQ+PjI0PT0xMjApOjApe3Y9eGNbY1soY1tuPj4yXXwwKSsyOD4+Ml0mNjNdKG4sNDgpfDA7dT1jW2g+PjJdfDA7Y1toPj4yXT11KzE7YVt1Pj4wXT12O3U9eGNbY1soY1tuPj4yXXwwKSsyOD4+Ml0mNjNdKG4sYVtxPj4wXXwwKXwwO3Y9Y1toPj4yXXwwO2NbaD4+Ml09disxO2Fbdj4+MF09dTtwPXArMnwwfWlmKChwfDApIT0oZXwwKT8obz1lKyAtMXwwLG8+Pj4wPnA+Pj4wKTowKXtxPXA7ZG97dj1hW3E+PjBdfDA7YVtxPj4wXT1hW28+PjBdfDA7YVtvPj4wXT12O3E9cSsxfDA7bz1vKyAtMXwwfXdoaWxlKHE+Pj4wPG8+Pj4wKX1qPW9jW2NbKGNbaj4+Ml18MCkrMTY+PjJdJjEyN10oail8MDtpZihwPj4+MDxlPj4+MCl7cT1sKzF8MDtzPWwrNHwwO289bCs4fDA7dT0wO3Q9MDtyPXA7d2hpbGUoMSl7dj1hWygoYVtsPj4wXSYxKT09MD9xOmNbbz4+Ml18MCkrdD4+MF18MDtpZih2PDwyND4+MjQhPTAmKHV8MCk9PSh2PDwyND4+MjR8MCkpe3U9Y1toPj4yXXwwO2NbaD4+Ml09dSsxO2FbdT4+MF09ajt1PWFbbD4+MF18MDtpZigodSYxKT09MCl7dj0odSYyNTUpPj4+MX1lbHNle3Y9Y1tzPj4yXXwwfXU9MDt0PSh0Pj4+MDwodisgLTF8MCk+Pj4wJjEpK3R8MH13PXhjW2NbKGNbbj4+Ml18MCkrMjg+PjJdJjYzXShuLGFbcj4+MF18MCl8MDt2PWNbaD4+Ml18MDtjW2g+PjJdPXYrMTthW3Y+PjBdPXc7cj1yKzF8MDtpZighKHI+Pj4wPGU+Pj4wKSl7YnJlYWt9ZWxzZXt1PXUrMXwwfX19bz1mKyhwLWIpfDA7bj1jW2g+PjJdfDA7aWYoKG98MCkhPShufDApPyhtPW4rIC0xfDAsbT4+PjA+bz4+PjApOjApe2Rve3c9YVtvPj4wXXwwO2Fbbz4+MF09YVttPj4wXXwwO2FbbT4+MF09dztvPW8rMXwwO209bSsgLTF8MH13aGlsZShvPj4+MDxtPj4+MCl9fWVsc2V7dWNbY1soY1tuPj4yXXwwKSszMj4+Ml0mMzFdKG4sYixlLGYpfDA7Y1toPj4yXT1mKyhlLWIpfWlmKChkfDApPT0oZXwwKSl7Yj1jW2g+PjJdfDB9ZWxzZXtiPWYrKGQtYil8MH1jW2c+PjJdPWI7aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59bD1jW2wrOD4+Ml18MDtpZigobHwwKT09MCl7aT1rO3JldHVybn12bihsKTtpPWs7cmV0dXJufWZ1bmN0aW9uIHlpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2Q9aTtpPWkrOTZ8MDtuPWQrOHwwO3M9ZDtvPWQrNjR8MDtrPWQrNjB8MDttPWQrNTZ8MDtwPWQrNTJ8MDt1PXM7Y1t1Pj4yXT0zNztjW3UrND4+Ml09MDt1PXMrMXwwO3E9Zis0fDA7cj1jW3E+PjJdfDA7aWYoKHImMjA0OHwwKSE9MCl7YVt1Pj4wXT00Mzt1PXMrMnwwfWlmKChyJjUxMnwwKSE9MCl7YVt1Pj4wXT0zNTt1PXUrMXwwfXQ9dSsyfDA7YVt1Pj4wXT0xMDg7YVt1KzE+PjBdPTEwODt1PXImNzQ7ZG97aWYoKHV8MCk9PTY0KXthW3Q+PjBdPTExMX1lbHNlIGlmKCh1fDApPT04KXtpZigociYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNle2FbdD4+MF09MTAwfX13aGlsZSgwKTtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dT1jWzMzNDBdfDA7dD1uO2NbdD4+Ml09aDtjW3QrND4+Ml09ajtqPXdpKG8sMjIsdSxzLG4pfDA7aD1vK2p8MDtxPWNbcT4+Ml0mMTc2O2Rve2lmKChxfDApPT0zMil7cT1ofWVsc2UgaWYoKHF8MCk9PTE2KXtxPWFbbz4+MF18MDtpZihxPDwyND4+MjQ9PTQzfHE8PDI0Pj4yND09NDUpe3E9bysxfDA7YnJlYWt9aWYoKGp8MCk+MSZxPDwyND4+MjQ9PTQ4Pyh1PWFbbysxPj4wXXwwLHU8PDI0Pj4yND09ODh8dTw8MjQ+PjI0PT0xMjApOjApe3E9bysyfDB9ZWxzZXtsPTIxfX1lbHNle2w9MjF9fXdoaWxlKDApO2lmKChsfDApPT0yMSl7cT1vfWw9Y1tmKzI4Pj4yXXwwO2NbcD4+Ml09bDtsPWwrNHwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTt4aShvLHEsaCxuLGssbSxwKTtsPWNbcD4+Ml18MDt0PWwrNHwwO3U9Y1t0Pj4yXXwwO2NbdD4+Ml09dSsgLTE7aWYoKHV8MCkhPTApe3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1ttPj4yXXwwO1djKGIscyxuLHQsdSxmLGcpO2k9ZDtyZXR1cm59bGNbY1soY1tsPj4yXXwwKSs4Pj4yXSYyNTVdKGwpO3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1ttPj4yXXwwO1djKGIscyxuLHQsdSxmLGcpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gemkoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDttPWk7aT1pKzY0fDA7cj1tO3E9bSsxNnwwO249bSsyNHwwO2s9bSszNnwwO2Q9bSs4fDA7aj1tKzR8MDtvPW0rMTJ8MDthW3ErMD4+MF09YVsxMjI2ND4+MF18MDthW3ErMT4+MF09YVsxMjI2NT4+MF18MDthW3ErMj4+MF09YVsxMjI2Nj4+MF18MDthW3ErMz4+MF09YVsxMjI2Nz4+MF18MDthW3ErND4+MF09YVsxMjI2OD4+MF18MDthW3ErNT4+MF09YVsxMjI2OT4+MF18MDt0PXErMXwwO3A9Zis0fDA7cz1jW3A+PjJdfDA7aWYoKHMmMjA0OHwwKSE9MCl7YVt0Pj4wXT00Mzt0PXErMnwwfWlmKChzJjUxMnwwKSE9MCl7YVt0Pj4wXT0zNTt0PXQrMXwwfWFbdD4+MF09MTA4O3Q9dCsxfDA7dT1zJjc0O2Rve2lmKCh1fDApPT04KXtpZigocyYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNlIGlmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZXthW3Q+PjBdPTExN319d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO2Nbcj4+Ml09aDtxPXdpKG4sMTIsdSxxLHIpfDA7aD1uK3F8MDtwPWNbcD4+Ml0mMTc2O2Rve2lmKChwfDApPT0zMil7cD1ofWVsc2UgaWYoKHB8MCk9PTE2KXtwPWFbbj4+MF18MDtpZihwPDwyND4+MjQ9PTQzfHA8PDI0Pj4yND09NDUpe3A9bisxfDA7YnJlYWt9aWYoKHF8MCk+MSZwPDwyND4+MjQ9PTQ4Pyh1PWFbbisxPj4wXXwwLHU8PDI0Pj4yND09ODh8dTw8MjQ+PjI0PT0xMjApOjApe3A9bisyfDB9ZWxzZXtsPTIxfX1lbHNle2w9MjF9fXdoaWxlKDApO2lmKChsfDApPT0yMSl7cD1ufWw9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09bDtsPWwrNHwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTt4aShuLHAsaCxrLGQsaixvKTtsPWNbbz4+Ml18MDt0PWwrNHwwO3U9Y1t0Pj4yXXwwO2NbdD4+Ml09dSsgLTE7aWYoKHV8MCkhPTApe3M9Y1tlPj4yXXwwO3Q9Y1tkPj4yXXwwO3U9Y1tqPj4yXXwwO1djKGIscyxrLHQsdSxmLGcpO2k9bTtyZXR1cm59bGNbY1soY1tsPj4yXXwwKSs4Pj4yXSYyNTVdKGwpO3M9Y1tlPj4yXXwwO3Q9Y1tkPj4yXXwwO3U9Y1tqPj4yXXwwO1djKGIscyxrLHQsdSxmLGcpO2k9bTtyZXR1cm59ZnVuY3Rpb24gQWkoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7ZD1pO2k9aSs5NnwwO249ZCs4fDA7cz1kO289ZCs2NHwwO2s9ZCs2MHwwO209ZCs1NnwwO3A9ZCs1MnwwO3U9cztjW3U+PjJdPTM3O2NbdSs0Pj4yXT0wO3U9cysxfDA7cT1mKzR8MDtyPWNbcT4+Ml18MDtpZigociYyMDQ4fDApIT0wKXthW3U+PjBdPTQzO3U9cysyfDB9aWYoKHImNTEyfDApIT0wKXthW3U+PjBdPTM1O3U9dSsxfDB9dD11KzJ8MDthW3U+PjBdPTEwODthW3UrMT4+MF09MTA4O3U9ciY3NDtkb3tpZigodXwwKT09NjQpe2FbdD4+MF09MTExfWVsc2UgaWYoKHV8MCk9PTgpe2lmKChyJjE2Mzg0fDApPT0wKXthW3Q+PjBdPTEyMDticmVha31lbHNle2FbdD4+MF09ODg7YnJlYWt9fWVsc2V7YVt0Pj4wXT0xMTd9fXdoaWxlKDApO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX11PWNbMzM0MF18MDt0PW47Y1t0Pj4yXT1oO2NbdCs0Pj4yXT1qO2o9d2kobywyMyx1LHMsbil8MDtoPW8ranwwO3E9Y1txPj4yXSYxNzY7ZG97aWYoKHF8MCk9PTMyKXtxPWh9ZWxzZSBpZigocXwwKT09MTYpe3E9YVtvPj4wXXwwO2lmKHE8PDI0Pj4yND09NDN8cTw8MjQ+PjI0PT00NSl7cT1vKzF8MDticmVha31pZigoanwwKT4xJnE8PDI0Pj4yND09NDg/KHU9YVtvKzE+PjBdfDAsdTw8MjQ+PjI0PT04OHx1PDwyND4+MjQ9PTEyMCk6MCl7cT1vKzJ8MH1lbHNle2w9MjF9fWVsc2V7bD0yMX19d2hpbGUoMCk7aWYoKGx8MCk9PTIxKXtxPW99bD1jW2YrMjg+PjJdfDA7Y1twPj4yXT1sO2w9bCs0fDA7Y1tsPj4yXT0oY1tsPj4yXXwwKSsxO3hpKG8scSxoLG4sayxtLHApO2w9Y1twPj4yXXwwO3Q9bCs0fDA7dT1jW3Q+PjJdfDA7Y1t0Pj4yXT11KyAtMTtpZigodXwwKSE9MCl7cz1jW2U+PjJdfDA7dD1jW2s+PjJdfDA7dT1jW20+PjJdfDA7V2MoYixzLG4sdCx1LGYsZyk7aT1kO3JldHVybn1sY1tjWyhjW2w+PjJdfDApKzg+PjJdJjI1NV0obCk7cz1jW2U+PjJdfDA7dD1jW2s+PjJdfDA7dT1jW20+PjJdfDA7V2MoYixzLG4sdCx1LGYsZyk7aT1kO3JldHVybn1mdW5jdGlvbiBCaShiLGQsZSxmLGcsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aj0rajt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MDtkPWk7aT1pKzEyOHwwO3A9ZDt1PWQrNjR8MDtyPWQrOTJ8MDt0PWQrODB8MDtsPWQrNzZ8MDtuPWQrNzJ8MDtvPWQrODR8MDttPWQrODh8MDt2PXU7Y1t2Pj4yXT0zNztjW3YrND4+Ml09MDt2PXUrMXwwO3M9Zis0fDA7dz1jW3M+PjJdfDA7aWYoKHcmMjA0OHwwKSE9MCl7YVt2Pj4wXT00Mzt2PXUrMnwwfWlmKCh3JjEwMjR8MCkhPTApe2Fbdj4+MF09MzU7dj12KzF8MH14PXcmMjYwO3k9dz4+PjE0O2Rve2lmKCh4fDApPT0yNjApe2lmKCh5JjF8MCk9PTApe2Fbdj4+MF09OTc7dj0wO2JyZWFrfWVsc2V7YVt2Pj4wXT02NTt2PTA7YnJlYWt9fWVsc2V7YVt2Pj4wXT00Njt3PXYrMnwwO2FbdisxPj4wXT00MjtpZigoeHwwKT09NCl7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDI7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MDt2PTE7YnJlYWt9fWVsc2UgaWYoKHh8MCk9PTI1Nil7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDE7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT02OTt2PTE7YnJlYWt9fWVsc2V7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDM7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MTt2PTE7YnJlYWt9fX19d2hpbGUoMCk7Y1t0Pj4yXT1yO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtpZih2KXtjW3A+PjJdPWNbZis4Pj4yXTt5PXArNHwwO2hbaz4+M109ajtjW3k+PjJdPWNbaz4+Ml07Y1t5KzQ+PjJdPWNbays0Pj4yXTt3PXdpKHIsMzAsdyx1LHApfDB9ZWxzZXtoW2s+PjNdPWo7Y1twPj4yXT1jW2s+PjJdO2NbcCs0Pj4yXT1jW2srND4+Ml07dz13aShyLDMwLHcsdSxwKXwwfWlmKCh3fDApPjI5KXt3PShhWzEzMzY4XXwwKT09MDtpZih2KXtpZih3PyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2NbcD4+Ml09Y1tmKzg+PjJdO3k9cCs0fDA7aFtrPj4zXT1qO2NbeT4+Ml09Y1trPj4yXTtjW3krND4+Ml09Y1trKzQ+PjJdO3c9Q2kodCx3LHUscCl8MH1lbHNle2lmKHc/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7Y1twPj4yXT1jW2YrOD4+Ml07eT1wKzR8MDtoW2s+PjNdPWo7Y1t5Pj4yXT1jW2s+PjJdO2NbeSs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfXQ9Y1t0Pj4yXXwwO2lmKCh0fDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3Y9dH19ZWxzZXt2PWNbdD4+Ml18MDt0PTB9dT12K3d8MDtzPWNbcz4+Ml0mMTc2O2Rve2lmKChzfDApPT0xNil7cz1hW3Y+PjBdfDA7aWYoczw8MjQ+PjI0PT00M3xzPDwyND4+MjQ9PTQ1KXtzPXYrMXwwO2JyZWFrfWlmKCh3fDApPjEmczw8MjQ+PjI0PT00OD8oeT1hW3YrMT4+MF18MCx5PDwyND4+MjQ9PTg4fHk8PDI0Pj4yND09MTIwKTowKXtzPXYrMnwwfWVsc2V7cT00OH19ZWxzZSBpZigoc3wwKT09MzIpe3M9dX1lbHNle3E9NDh9fXdoaWxlKDApO2lmKChxfDApPT00OCl7cz12fWlmKCh2fDApIT0ocnwwKSl7cD11bih3PDwxKXwwO2lmKChwfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3I9djtxPXB9fWVsc2V7cT0wfXg9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09eDt4PXgrNHwwO2NbeD4+Ml09KGNbeD4+Ml18MCkrMTtEaShyLHMsdSxwLGwsbixvKTtvPWNbbz4+Ml18MDt4PW8rNHwwO3k9Y1t4Pj4yXXwwO2NbeD4+Ml09eSsgLTE7aWYoKHl8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1XYyhtLGNbZT4+Ml18MCxwLGNbbD4+Ml18MCxjW24+PjJdfDAsZixnKTt5PWNbbT4+Ml18MDtjW2U+PjJdPXk7Y1tiPj4yXT15O2lmKChxfDApIT0wKXt2bihxKX1pZigodHwwKT09MCl7aT1kO3JldHVybn12bih0KTtpPWQ7cmV0dXJufWZ1bmN0aW9uIENpKGEsYixkLGUpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wO2Y9aTtpPWkrMTZ8MDtnPWY7Y1tnPj4yXT1lO2I9aWIoYnwwKXwwO2Q9SWIoYXwwLGR8MCxnfDApfDA7aWYoKGJ8MCk9PTApe2k9ZjtyZXR1cm4gZHwwfWliKGJ8MCl8MDtpPWY7cmV0dXJuIGR8MH1mdW5jdGlvbiBEaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO2s9aTtpPWkrMzJ8MDtvPWs7bD1rKzEyfDA7bT1jW2o+PjJdfDA7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW28+PjJdPTEzNDU2O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM0NTYsbyl9dD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7cj1jW20rOD4+Ml18MDtpZighKChjW20rMTI+PjJdfDApLXI+PjI+Pj4wPnQ+Pj4wKSl7eT1YYSg0KXwwO2NbeT4+Ml09MjEzMDQ7d2IoeXwwLDIxMzc2LDE5Nil9bT1jW3IrKHQ8PDIpPj4yXXwwO2lmKChtfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1qPWNbaj4+Ml18MDtpZighKChjWzM0MDBdfDApPT0tMSkpe2Nbbz4+Ml09MTM2MDA7Y1tvKzQ+PjJdPTIwODtjW28rOD4+Ml09MDtjZygxMzYwMCxvKX1vPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDtyPWNbais4Pj4yXXwwO2lmKCEoKGNbaisxMj4+Ml18MCktcj4+Mj4+PjA+bz4+PjApKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1vPWNbcisobzw8Mik+PjJdfDA7aWYoKG98MCk9PTApe3k9WGEoNCl8MDtjW3k+PjJdPTIxMzA0O3diKHl8MCwyMTM3NiwxOTYpfW1jW2NbKGNbbz4+Ml18MCkrMjA+PjJdJjEyN10obCxvKTtjW2g+PjJdPWY7aj1hW2I+PjBdfDA7aWYoajw8MjQ+PjI0PT00M3xqPDwyND4+MjQ9PTQ1KXt5PXhjW2NbKGNbbT4+Ml18MCkrMjg+PjJdJjYzXShtLGopfDA7dD1jW2g+PjJdfDA7Y1toPj4yXT10KzE7YVt0Pj4wXT15O3Q9YisxfDB9ZWxzZXt0PWJ9aj1lO2E6ZG97aWYoKChqLXR8MCk+MT8oYVt0Pj4wXXwwKT09NDg6MCk/KHA9dCsxfDAseT1hW3A+PjBdfDAseTw8MjQ+PjI0PT04OHx5PDwyND4+MjQ9PTEyMCk6MCl7eT14Y1tjWyhjW20+PjJdfDApKzI4Pj4yXSY2M10obSw0OCl8MDt4PWNbaD4+Ml18MDtjW2g+PjJdPXgrMTthW3g+PjBdPXk7dD10KzJ8MDt4PXhjW2NbKGNbbT4+Ml18MCkrMjg+PjJdJjYzXShtLGFbcD4+MF18MCl8MDt5PWNbaD4+Ml18MDtjW2g+PjJdPXkrMTthW3k+PjBdPXg7aWYodD4+PjA8ZT4+PjApe3I9dDt3aGlsZSgxKXtwPWFbcj4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9eT1wPDwyND4+MjQ7aWYoISgoeSsgLTQ4fDApPj4+MDwxMCk/ISgoKHl8MzIpKyAtOTd8MCk+Pj4wPDYpOjApe3A9dDticmVhayBhfXI9cisxfDA7aWYoIShyPj4+MDxlPj4+MCkpe3A9dDticmVha319fWVsc2V7cD10O3I9dH19ZWxzZXtzPTE1fX13aGlsZSgwKTtiOmRve2lmKChzfDApPT0xNSl7aWYodD4+PjA8ZT4+PjApe3I9dDt3aGlsZSgxKXtwPWFbcj4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9cz1yKzF8MDtpZighKCgocDw8MjQ+PjI0KSsgLTQ4fDApPj4+MDwxMCkpe3A9dDticmVhayBifWlmKHM+Pj4wPGU+Pj4wKXtyPXN9ZWxzZXtwPXQ7cj1zO2JyZWFrfX19ZWxzZXtwPXQ7cj10fX19d2hpbGUoMCk7cz1hW2w+PjBdfDA7aWYoKHMmMSk9PTApe3M9KHMmMjU1KT4+PjF9ZWxzZXtzPWNbbCs0Pj4yXXwwfWlmKChzfDApIT0wKXtpZigocHwwKSE9KHJ8MCk/KHE9cisgLTF8MCxxPj4+MD5wPj4+MCk6MCl7cz1wO2Rve3k9YVtzPj4wXXwwO2Fbcz4+MF09YVtxPj4wXXwwO2FbcT4+MF09eTtzPXMrMXwwO3E9cSsgLTF8MH13aGlsZShzPj4+MDxxPj4+MCl9dT1vY1tjWyhjW28+PjJdfDApKzE2Pj4yXSYxMjddKG8pfDA7aWYocD4+PjA8cj4+PjApe3E9bCsxfDA7dD1sKzR8MDtzPWwrOHwwO3g9MDt3PTA7dj1wO3doaWxlKDEpe3k9YVsoKGFbbD4+MF0mMSk9PTA/cTpjW3M+PjJdfDApK3c+PjBdfDA7aWYoeTw8MjQ+PjI0PjAmKHh8MCk9PSh5PDwyND4+MjR8MCkpe3g9Y1toPj4yXXwwO2NbaD4+Ml09eCsxO2FbeD4+MF09dTt4PWFbbD4+MF18MDtpZigoeCYxKT09MCl7eT0oeCYyNTUpPj4+MX1lbHNle3k9Y1t0Pj4yXXwwfXg9MDt3PSh3Pj4+MDwoeSsgLTF8MCk+Pj4wJjEpK3d8MH16PXhjW2NbKGNbbT4+Ml18MCkrMjg+PjJdJjYzXShtLGFbdj4+MF18MCl8MDt5PWNbaD4+Ml18MDtjW2g+PjJdPXkrMTthW3k+PjBdPXo7dj12KzF8MDtpZighKHY+Pj4wPHI+Pj4wKSl7YnJlYWt9ZWxzZXt4PXgrMXwwfX19cD1mKyhwLWIpfDA7cT1jW2g+PjJdfDA7aWYoKHB8MCkhPShxfDApPyhuPXErIC0xfDAsbj4+PjA+cD4+PjApOjApe2Rve3o9YVtwPj4wXXwwO2FbcD4+MF09YVtuPj4wXXwwO2Fbbj4+MF09ejtwPXArMXwwO249bisgLTF8MH13aGlsZShwPj4+MDxuPj4+MCl9fWVsc2V7dWNbY1soY1ttPj4yXXwwKSszMj4+Ml0mMzFdKG0scCxyLGNbaD4+Ml18MCl8MDtjW2g+PjJdPShjW2g+PjJdfDApKyhyLXApfWM6ZG97aWYocj4+PjA8ZT4+PjApe3doaWxlKDEpe249YVtyPj4wXXwwO2lmKG48PDI0Pj4yND09NDYpe2JyZWFrfXk9eGNbY1soY1ttPj4yXXwwKSsyOD4+Ml0mNjNdKG0sbil8MDt6PWNbaD4+Ml18MDtjW2g+PjJdPXorMTthW3o+PjBdPXk7cj1yKzF8MDtpZighKHI+Pj4wPGU+Pj4wKSl7YnJlYWsgY319eT1vY1tjWyhjW28+PjJdfDApKzEyPj4yXSYxMjddKG8pfDA7ej1jW2g+PjJdfDA7Y1toPj4yXT16KzE7YVt6Pj4wXT15O3I9cisxfDB9fXdoaWxlKDApO3VjW2NbKGNbbT4+Ml18MCkrMzI+PjJdJjMxXShtLHIsZSxjW2g+PjJdfDApfDA7bT0oY1toPj4yXXwwKSsoai1yKXwwO2NbaD4+Ml09bTtpZigoZHwwKSE9KGV8MCkpe209ZisoZC1iKXwwfWNbZz4+Ml09bTtpZigoYVtsPj4wXSYxKT09MCl7aT1rO3JldHVybn1sPWNbbCs4Pj4yXXwwO2lmKChsfDApPT0wKXtpPWs7cmV0dXJufXZuKGwpO2k9aztyZXR1cm59ZnVuY3Rpb24gRWkoYixkLGUsZixnLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9K2o7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MDtkPWk7aT1pKzEyOHwwO3A9ZDt1PWQrNjR8MDtyPWQrOTJ8MDt0PWQrODB8MDtsPWQrNzZ8MDttPWQrNzJ8MDtvPWQrODR8MDtuPWQrODh8MDt4PXU7Y1t4Pj4yXT0zNztjW3grND4+Ml09MDt4PXUrMXwwO3M9Zis0fDA7dj1jW3M+PjJdfDA7aWYoKHYmMjA0OHwwKSE9MCl7YVt4Pj4wXT00Mzt4PXUrMnwwfWlmKCh2JjEwMjR8MCkhPTApe2FbeD4+MF09MzU7eD14KzF8MH13PXYmMjYwO3Y9dj4+PjE0O2Rve2lmKCh3fDApPT0yNjApe2FbeD4+MF09NzY7dz14KzF8MDtpZigodiYxfDApPT0wKXthW3c+PjBdPTk3O3Y9MDticmVha31lbHNle2Fbdz4+MF09NjU7dj0wO2JyZWFrfX1lbHNle2FbeD4+MF09NDY7YVt4KzE+PjBdPTQyO2FbeCsyPj4wXT03Njt4PXgrM3wwO2lmKCh3fDApPT0yNTYpe2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAxO3Y9MTticmVha31lbHNle2FbeD4+MF09Njk7dj0xO2JyZWFrfX1lbHNlIGlmKCh3fDApPT00KXtpZigodiYxfDApPT0wKXthW3g+PjBdPTEwMjt2PTE7YnJlYWt9ZWxzZXthW3g+PjBdPTcwO3Y9MTticmVha319ZWxzZXtpZigodiYxfDApPT0wKXthW3g+PjBdPTEwMzt2PTE7YnJlYWt9ZWxzZXthW3g+PjBdPTcxO3Y9MTticmVha319fX13aGlsZSgwKTtjW3Q+PjJdPXI7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2lmKHYpe2NbcD4+Ml09Y1tmKzg+PjJdO3g9cCs0fDA7aFtrPj4zXT1qO2NbeD4+Ml09Y1trPj4yXTtjW3grND4+Ml09Y1trKzQ+PjJdO3c9d2kociwzMCx3LHUscCl8MH1lbHNle2hbaz4+M109ajtjW3A+PjJdPWNbaz4+Ml07Y1twKzQ+PjJdPWNbays0Pj4yXTt3PXdpKHIsMzAsdyx1LHApfDB9aWYoKHd8MCk+Mjkpe3c9KGFbMTMzNjhdfDApPT0wO2lmKHYpe2lmKHc/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7Y1twPj4yXT1jW2YrOD4+Ml07eD1wKzR8MDtoW2s+PjNdPWo7Y1t4Pj4yXT1jW2s+PjJdO2NbeCs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfWVsc2V7aWYodz8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtoW2s+PjNdPWo7Y1twPj4yXT1jW2s+PjJdO2NbcCs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfXQ9Y1t0Pj4yXXwwO2lmKCh0fDApPT0wKXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNle3Y9dH19ZWxzZXt2PWNbdD4+Ml18MDt0PTB9dT12K3d8MDtzPWNbcz4+Ml0mMTc2O2Rve2lmKChzfDApPT0xNil7cz1hW3Y+PjBdfDA7aWYoczw8MjQ+PjI0PT00M3xzPDwyND4+MjQ9PTQ1KXtzPXYrMXwwO2JyZWFrfWlmKCh3fDApPjEmczw8MjQ+PjI0PT00OD8oeD1hW3YrMT4+MF18MCx4PDwyND4+MjQ9PTg4fHg8PDI0Pj4yND09MTIwKTowKXtzPXYrMnwwfWVsc2V7cT00OH19ZWxzZSBpZigoc3wwKT09MzIpe3M9dX1lbHNle3E9NDh9fXdoaWxlKDApO2lmKChxfDApPT00OCl7cz12fWlmKCh2fDApIT0ocnwwKSl7cD11bih3PDwxKXwwO2lmKChwfDApPT0wKXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNle3I9djtxPXB9fWVsc2V7cT0wfXc9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09dzt3PXcrNHwwO2Nbdz4+Ml09KGNbdz4+Ml18MCkrMTtEaShyLHMsdSxwLGwsbSxvKTtvPWNbbz4+Ml18MDt3PW8rNHwwO3g9Y1t3Pj4yXXwwO2Nbdz4+Ml09eCsgLTE7aWYoKHh8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1XYyhuLGNbZT4+Ml18MCxwLGNbbD4+Ml18MCxjW20+PjJdfDAsZixnKTt4PWNbbj4+Ml18MDtjW2U+PjJdPXg7Y1tiPj4yXT14O2lmKChxfDApIT0wKXt2bihxKX1pZigodHwwKT09MCl7aT1kO3JldHVybn12bih0KTtpPWQ7cmV0dXJufWZ1bmN0aW9uIEZpKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MDtsPWk7aT1pKzgwfDA7bj1sO289bCs3MnwwO2Q9bCs1MnwwO2s9bCsxMnwwO2FbbyswPj4wXT1hWzEyMjcyPj4wXXwwO2FbbysxPj4wXT1hWzEyMjczPj4wXXwwO2FbbysyPj4wXT1hWzEyMjc0Pj4wXXwwO2FbbyszPj4wXT1hWzEyMjc1Pj4wXXwwO2Fbbys0Pj4wXT1hWzEyMjc2Pj4wXXwwO2Fbbys1Pj4wXT1hWzEyMjc3Pj4wXXwwO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1wPWNbMzM0MF18MDtjW24+PjJdPWg7bz13aShkLDIwLHAsbyxuKXwwO2g9ZCtvfDA7cD1jW2YrND4+Ml0mMTc2O2Rve2lmKChwfDApPT0xNil7cD1hW2Q+PjBdfDA7aWYocDw8MjQ+PjI0PT00M3xwPDwyND4+MjQ9PTQ1KXtwPWQrMXwwO2JyZWFrfWlmKChvfDApPjEmcDw8MjQ+PjI0PT00OD8ocT1hW2QrMT4+MF18MCxxPDwyND4+MjQ9PTg4fHE8PDI0Pj4yND09MTIwKTowKXtwPWQrMnwwfWVsc2V7bT0xMX19ZWxzZSBpZigocHwwKT09MzIpe3A9aH1lbHNle209MTF9fXdoaWxlKDApO2lmKChtfDApPT0xMSl7cD1kfW09Y1tmKzI4Pj4yXXwwO3E9bSs0fDA7Y1txPj4yXT0oY1txPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tuPj4yXT0xMzQ1NjtjW24rND4+Ml09MjA4O2Nbbis4Pj4yXT0wO2NnKDEzNDU2LG4pfXE9KGNbMTM0NjA+PjJdfDApKyAtMXwwO249Y1ttKzg+PjJdfDA7aWYoKGNbbSsxMj4+Ml18MCktbj4+Mj4+PjA+cT4+PjA/KGo9Y1tuKyhxPDwyKT4+Ml18MCwoanwwKSE9MCk6MCl7bj1tKzR8MDtxPWNbbj4+Ml18MDtjW24+PjJdPXErIC0xO2lmKChxfDApPT0wKXtsY1tjWyhjW20+PjJdfDApKzg+PjJdJjI1NV0obSl9dWNbY1soY1tqPj4yXXwwKSszMj4+Ml0mMzFdKGosZCxoLGspfDA7aj1rK298MDtpZigocHwwKT09KGh8MCkpe3E9ajtwPWNbZT4+Ml18MDtXYyhiLHAsayxxLGosZixnKTtpPWw7cmV0dXJufXE9aysocC1kKXwwO3A9Y1tlPj4yXXwwO1djKGIscCxrLHEsaixmLGcpO2k9bDtyZXR1cm59cT1YYSg0KXwwO2NbcT4+Ml09MjEzMDQ7d2IocXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gR2koYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gSGkoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIElpKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MDtqPWk7aT1pKzMyfDA7bT1qO249aisyNHwwO2s9aisxMnwwO2lmKChjW2YrND4+Ml0mMXwwKT09MCl7az1jWyhjW2Q+PjJdfDApKzI0Pj4yXXwwO2Nbbj4+Ml09Y1tlPj4yXTtsPWgmMTtjW20rMD4+Ml09Y1tuKzA+PjJdO3djW2smNjNdKGIsZCxtLGYsZyxsKTtpPWo7cmV0dXJufW49Y1tmKzI4Pj4yXXwwO2Q9bis0fDA7Y1tkPj4yXT0oY1tkPj4yXXwwKSsxO2lmKCEoKGNbMzQwMl18MCk9PS0xKSl7Y1ttPj4yXT0xMzYwODtjW20rND4+Ml09MjA4O2NbbSs4Pj4yXT0wO2NnKDEzNjA4LG0pfWc9KGNbMTM2MTI+PjJdfDApKyAtMXwwO209Y1tuKzg+PjJdfDA7aWYoKGNbbisxMj4+Ml18MCktbT4+Mj4+PjA+Zz4+PjA/KGw9Y1ttKyhnPDwyKT4+Ml18MCwobHwwKSE9MCk6MCl7Zj1uKzR8MDtkPWNbZj4+Ml18MDtjW2Y+PjJdPWQrIC0xO2lmKChkfDApPT0wKXtsY1tjWyhjW24+PjJdfDApKzg+PjJdJjI1NV0obil9bT1jW2w+PjJdfDA7aWYoaCl7bWNbY1ttKzI0Pj4yXSYxMjddKGssbCl9ZWxzZXttY1tjW20rMjg+PjJdJjEyN10oayxsKX1nPWFbaz4+MF18MDtpZigoZyYxKT09MCl7aD1rKzR8MDttPWg7bD1rKzh8MH1lbHNle2w9ays4fDA7bT1jW2w+PjJdfDA7aD1rKzR8MH13aGlsZSgxKXtmPShnJjEpPT0wO2lmKGYpe249aDtnPShnJjI1NSk+Pj4xfWVsc2V7bj1jW2w+PjJdfDA7Zz1jW2g+PjJdfDB9aWYoKG18MCk9PShuKyhnPDwyKXwwKSl7YnJlYWt9Zz1jW20+PjJdfDA7Zj1jW2U+PjJdfDA7aWYoKGZ8MCkhPTApe2Q9ZisyNHwwO249Y1tkPj4yXXwwO2lmKChufDApPT0oY1tmKzI4Pj4yXXwwKSl7Zz14Y1tjWyhjW2Y+PjJdfDApKzUyPj4yXSY2M10oZixnKXwwfWVsc2V7Y1tkPj4yXT1uKzQ7Y1tuPj4yXT1nfWlmKChnfDApPT0tMSl7Y1tlPj4yXT0wfX1nPWFbaz4+MF18MDttPW0rNHwwfWNbYj4+Ml09Y1tlPj4yXTtpZihmKXtpPWo7cmV0dXJufWs9Y1trKzg+PjJdfDA7aWYoKGt8MCk9PTApe2k9ajtyZXR1cm59dm4oayk7aT1qO3JldHVybn1kPVhhKDQpfDA7Y1tkPj4yXT0yMTMwNDt3YihkfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBKaShiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTA7bT1pO2k9aSsxMjh8MDtsPW07cj1tKzEwOHwwO249bSs5NnwwO2Q9bSs5MnwwO2o9bSs4OHwwO289bSs4NHwwO2FbciswPj4wXT1hWzEyMjY0Pj4wXXwwO2FbcisxPj4wXT1hWzEyMjY1Pj4wXXwwO2FbcisyPj4wXT1hWzEyMjY2Pj4wXXwwO2FbciszPj4wXT1hWzEyMjY3Pj4wXXwwO2Fbcis0Pj4wXT1hWzEyMjY4Pj4wXXwwO2Fbcis1Pj4wXT1hWzEyMjY5Pj4wXXwwO3M9cisxfDA7cD1mKzR8MDtxPWNbcD4+Ml18MDtpZigocSYyMDQ4fDApIT0wKXthW3M+PjBdPTQzO3M9cisyfDB9aWYoKHEmNTEyfDApIT0wKXthW3M+PjBdPTM1O3M9cysxfDB9YVtzPj4wXT0xMDg7cz1zKzF8MDt0PXEmNzQ7ZG97aWYoKHR8MCk9PTgpe2lmKChxJjE2Mzg0fDApPT0wKXthW3M+PjBdPTEyMDticmVha31lbHNle2Fbcz4+MF09ODg7YnJlYWt9fWVsc2UgaWYoKHR8MCk9PTY0KXthW3M+PjBdPTExMX1lbHNle2Fbcz4+MF09MTAwfX13aGlsZSgwKTtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9cT1jWzMzNDBdfDA7Y1tsPj4yXT1oO3E9d2kobiwxMixxLHIsbCl8MDtoPW4rcXwwO3A9Y1twPj4yXSYxNzY7ZG97aWYoKHB8MCk9PTE2KXtwPWFbbj4+MF18MDtpZihwPDwyND4+MjQ9PTQzfHA8PDI0Pj4yND09NDUpe3A9bisxfDA7YnJlYWt9aWYoKHF8MCk+MSZwPDwyND4+MjQ9PTQ4Pyh0PWFbbisxPj4wXXwwLHQ8PDI0Pj4yND09ODh8dDw8MjQ+PjI0PT0xMjApOjApe3A9bisyfDB9ZWxzZXtrPTIxfX1lbHNlIGlmKChwfDApPT0zMil7cD1ofWVsc2V7az0yMX19d2hpbGUoMCk7aWYoKGt8MCk9PTIxKXtwPW59az1jW2YrMjg+PjJdfDA7Y1tvPj4yXT1rO2s9ays0fDA7Y1trPj4yXT0oY1trPj4yXXwwKSsxO0tpKG4scCxoLGwsZCxqLG8pO2s9Y1tvPj4yXXwwO3M9ays0fDA7dD1jW3M+PjJdfDA7Y1tzPj4yXT10KyAtMTtpZigodHwwKSE9MCl7cj1jW2U+PjJdfDA7cz1jW2Q+PjJdfDA7dD1jW2o+PjJdfDA7TGkoYixyLGwscyx0LGYsZyk7aT1tO3JldHVybn1sY1tjWyhjW2s+PjJdfDApKzg+PjJdJjI1NV0oayk7cj1jW2U+PjJdfDA7cz1jW2Q+PjJdfDA7dD1jW2o+PjJdfDA7TGkoYixyLGwscyx0LGYsZyk7aT1tO3JldHVybn1mdW5jdGlvbiBLaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MDtrPWk7aT1pKzMyfDA7bz1rO2w9aysxMnwwO249Y1tqPj4yXXwwO2lmKCEoKGNbMzM2Ml18MCk9PS0xKSl7Y1tvPj4yXT0xMzQ0ODtjW28rND4+Ml09MjA4O2Nbbys4Pj4yXT0wO2NnKDEzNDQ4LG8pfXM9KGNbMTM0NTI+PjJdfDApKyAtMXwwO3I9Y1tuKzg+PjJdfDA7aWYoISgoY1tuKzEyPj4yXXwwKS1yPj4yPj4+MD5zPj4+MCkpe3Y9WGEoNCl8MDtjW3Y+PjJdPTIxMzA0O3diKHZ8MCwyMTM3NiwxOTYpfW49Y1tyKyhzPDwyKT4+Ml18MDtpZigobnwwKT09MCl7dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9aj1jW2o+PjJdfDA7aWYoISgoY1szNDAyXXwwKT09LTEpKXtjW28+PjJdPTEzNjA4O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM2MDgsbyl9bz0oY1sxMzYxMj4+Ml18MCkrIC0xfDA7cj1jW2orOD4+Ml18MDtpZighKChjW2orMTI+PjJdfDApLXI+PjI+Pj4wPm8+Pj4wKSl7dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9aj1jW3IrKG88PDIpPj4yXXwwO2lmKChqfDApPT0wKXt2PVhhKDQpfDA7Y1t2Pj4yXT0yMTMwNDt3Yih2fDAsMjEzNzYsMTk2KX1tY1tjWyhjW2o+PjJdfDApKzIwPj4yXSYxMjddKGwsaik7bz1hW2w+PjBdfDA7aWYoKG8mMSk9PTApe289KG8mMjU1KT4+PjF9ZWxzZXtvPWNbbCs0Pj4yXXwwfWlmKChvfDApIT0wKXtjW2g+PjJdPWY7bz1hW2I+PjBdfDA7aWYobzw8MjQ+PjI0PT00M3xvPDwyND4+MjQ9PTQ1KXt2PXhjW2NbKGNbbj4+Ml18MCkrNDQ+PjJdJjYzXShuLG8pfDA7bz1jW2g+PjJdfDA7Y1toPj4yXT1vKzQ7Y1tvPj4yXT12O289YisxfDB9ZWxzZXtvPWJ9aWYoKChlLW98MCk+MT8oYVtvPj4wXXwwKT09NDg6MCk/KHE9bysxfDAsdj1hW3E+PjBdfDAsdjw8MjQ+PjI0PT04OHx2PDwyND4+MjQ9PTEyMCk6MCl7dj14Y1tjWyhjW24+PjJdfDApKzQ0Pj4yXSY2M10obiw0OCl8MDt1PWNbaD4+Ml18MDtjW2g+PjJdPXUrNDtjW3U+PjJdPXY7dT14Y1tjWyhjW24+PjJdfDApKzQ0Pj4yXSY2M10obixhW3E+PjBdfDApfDA7dj1jW2g+PjJdfDA7Y1toPj4yXT12KzQ7Y1t2Pj4yXT11O289bysyfDB9aWYoKG98MCkhPShlfDApPyhwPWUrIC0xfDAscD4+PjA+bz4+PjApOjApe3E9bztkb3t2PWFbcT4+MF18MDthW3E+PjBdPWFbcD4+MF18MDthW3A+PjBdPXY7cT1xKzF8MDtwPXArIC0xfDB9d2hpbGUocT4+PjA8cD4+PjApfXE9b2NbY1soY1tqPj4yXXwwKSsxNj4+Ml0mMTI3XShqKXwwO2lmKG8+Pj4wPGU+Pj4wKXtwPWwrMXwwO3M9bCs0fDA7aj1sKzh8MDt1PTA7dD0wO3I9bzt3aGlsZSgxKXt2PWFbKChhW2w+PjBdJjEpPT0wP3A6Y1tqPj4yXXwwKSt0Pj4wXXwwO2lmKHY8PDI0Pj4yNCE9MCYodXwwKT09KHY8PDI0Pj4yNHwwKSl7dT1jW2g+PjJdfDA7Y1toPj4yXT11KzQ7Y1t1Pj4yXT1xO3U9YVtsPj4wXXwwO2lmKCh1JjEpPT0wKXt2PSh1JjI1NSk+Pj4xfWVsc2V7dj1jW3M+PjJdfDB9dT0wO3Q9KHQ+Pj4wPCh2KyAtMXwwKT4+PjAmMSkrdHwwfXg9eGNbY1soY1tuPj4yXXwwKSs0ND4+Ml0mNjNdKG4sYVtyPj4wXXwwKXwwO3c9Y1toPj4yXXwwO3Y9dys0fDA7Y1toPj4yXT12O2Nbdz4+Ml09eDtyPXIrMXwwO2lmKCEocj4+PjA8ZT4+PjApKXticmVha31lbHNle3U9dSsxfDB9fX1lbHNle3Y9Y1toPj4yXXwwfWg9Zisoby1iPDwyKXwwO2lmKChofDApIT0odnwwKT8obT12KyAtNHwwLG0+Pj4wPmg+Pj4wKTowKXtkb3t4PWNbaD4+Ml18MDtjW2g+PjJdPWNbbT4+Ml07Y1ttPj4yXT14O2g9aCs0fDA7bT1tKyAtNHwwfXdoaWxlKGg+Pj4wPG0+Pj4wKX19ZWxzZXt1Y1tjWyhjW24+PjJdfDApKzQ4Pj4yXSYzMV0obixiLGUsZil8MDt2PWYrKGUtYjw8Mil8MDtjW2g+PjJdPXZ9aWYoKGR8MCkhPShlfDApKXt2PWYrKGQtYjw8Mil8MH1jW2c+PjJdPXY7aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59bD1jW2wrOD4+Ml18MDtpZigobHwwKT09MCl7aT1rO3JldHVybn12bihsKTtpPWs7cmV0dXJufWZ1bmN0aW9uIExpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7az1pO2k9aSsxNnwwO2w9aztpZigoZHwwKT09MCl7Y1tiPj4yXT0wO2k9aztyZXR1cm59cT1lO249Zy1xPj4yO2g9aCsxMnwwO209Y1toPj4yXXwwO249KG18MCk+KG58MCk/bS1ufDA6MDttPWY7cT1tLXF8MDtwPXE+PjI7aWYoKHF8MCk+MD8oaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsZSxwKXwwKSE9KHB8MCk6MCl7Y1tiPj4yXT0wO2k9aztyZXR1cm59ZG97aWYoKG58MCk+MCl7aWYobj4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihuPj4+MDwyKXthW2w+PjBdPW48PDE7ZT1sKzR8MDtvPTE4fWVsc2V7ZT1uKzQmLTQ7cD1lPDwyO3A9KHB8MCk9PTA/MTpwO3doaWxlKDEpe3E9dW4ocCl8MDtpZigocXwwKSE9MCl7bz0xNzticmVha31xPWNbNTY2Nl18MDtjWzU2NjZdPXErMDtpZigocXwwKT09MCl7YnJlYWt9c2NbcSYzMV0oKX1pZigob3wwKT09MTcpe2NbbCs4Pj4yXT1xO2NbbD4+Ml09ZXwxO2NbbCs0Pj4yXT1uO2lmKChufDApPT0wKXtlPXE7YnJlYWt9ZWxzZXtlPXE7bz0xODticmVha319cT1YYSg0KXwwO2NbcT4+Ml09MjI2ODA7d2IocXwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKChvfDApPT0xOCl7bz1uO3A9ZTt3aGlsZSgxKXtvPW8rIC0xfDA7Y1twPj4yXT1qO2lmKChvfDApPT0wKXticmVha31lbHNle3A9cCs0fDB9fX1jW2UrKG48PDIpPj4yXT0wO2lmKChhW2w+PjBdJjEpPT0wKXtqPWwrNHwwfWVsc2V7aj1jW2wrOD4+Ml18MH1pZigoaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsaixuKXwwKT09KG58MCkpe2lmKChhW2w+PjBdJjEpPT0wKXticmVha31sPWNbbCs4Pj4yXXwwO2lmKChsfDApPT0wKXticmVha312bihsKTticmVha31jW2I+PjJdPTA7aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59Yj1jW2wrOD4+Ml18MDtpZigoYnwwKT09MCl7aT1rO3JldHVybn12bihiKTtpPWs7cmV0dXJufX13aGlsZSgwKTtxPWctbXwwO2w9cT4+MjtpZigocXwwKT4wPyhoY1tjWyhjW2Q+PjJdfDApKzQ4Pj4yXSY2M10oZCxmLGwpfDApIT0obHwwKTowKXtjW2I+PjJdPTA7aT1rO3JldHVybn1jW2g+PjJdPTA7Y1tiPj4yXT1kO2k9aztyZXR1cm59ZnVuY3Rpb24gTWkoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7bT1pO2k9aSsyMDh8MDtsPW0rOHwwO3M9bTtvPW0rMTg0fDA7ZD1tKzE4MHwwO2s9bSsxNzZ8MDtwPW0rMTcyfDA7dT1zO2NbdT4+Ml09Mzc7Y1t1KzQ+PjJdPTA7dT1zKzF8MDtxPWYrNHwwO3I9Y1txPj4yXXwwO2lmKChyJjIwNDh8MCkhPTApe2FbdT4+MF09NDM7dT1zKzJ8MH1pZigociY1MTJ8MCkhPTApe2FbdT4+MF09MzU7dT11KzF8MH10PXUrMnwwO2FbdT4+MF09MTA4O2FbdSsxPj4wXT0xMDg7dT1yJjc0O2Rve2lmKCh1fDApPT04KXtpZigociYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNlIGlmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZXthW3Q+PjBdPTEwMH19d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO3Q9bDtjW3Q+PjJdPWg7Y1t0KzQ+PjJdPWo7aD13aShvLDIyLHUscyxsKXwwO2o9bytofDA7cT1jW3E+PjJdJjE3Njtkb3tpZigocXwwKT09MzIpe3E9an1lbHNlIGlmKChxfDApPT0xNil7cT1hW28+PjBdfDA7aWYocTw8MjQ+PjI0PT00M3xxPDwyND4+MjQ9PTQ1KXtxPW8rMXwwO2JyZWFrfWlmKChofDApPjEmcTw8MjQ+PjI0PT00OD8odT1hW28rMT4+MF18MCx1PDwyND4+MjQ9PTg4fHU8PDI0Pj4yND09MTIwKTowKXtxPW8rMnwwfWVsc2V7bj0yMX19ZWxzZXtuPTIxfX13aGlsZSgwKTtpZigobnwwKT09MjEpe3E9b31uPWNbZisyOD4+Ml18MDtjW3A+PjJdPW47bj1uKzR8MDtjW24+PjJdPShjW24+PjJdfDApKzE7S2kobyxxLGosbCxkLGsscCk7bj1jW3A+PjJdfDA7dD1uKzR8MDt1PWNbdD4+Ml18MDtjW3Q+PjJdPXUrIC0xO2lmKCh1fDApIT0wKXtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWxjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKTtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWZ1bmN0aW9uIE5pKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MDtkPWk7aT1pKzEyOHwwO2w9ZDtxPWQrMTA4fDA7bj1kKzk2fDA7az1kKzkyfDA7bT1kKzg4fDA7bz1kKzg0fDA7YVtxKzA+PjBdPWFbMTIyNjQ+PjBdfDA7YVtxKzE+PjBdPWFbMTIyNjU+PjBdfDA7YVtxKzI+PjBdPWFbMTIyNjY+PjBdfDA7YVtxKzM+PjBdPWFbMTIyNjc+PjBdfDA7YVtxKzQ+PjBdPWFbMTIyNjg+PjBdfDA7YVtxKzU+PjBdPWFbMTIyNjk+PjBdfDA7cz1xKzF8MDtwPWYrNHwwO3I9Y1twPj4yXXwwO2lmKChyJjIwNDh8MCkhPTApe2Fbcz4+MF09NDM7cz1xKzJ8MH1pZigociY1MTJ8MCkhPTApe2Fbcz4+MF09MzU7cz1zKzF8MH1hW3M+PjBdPTEwODt0PXMrMXwwO3M9ciY3NDtkb3tpZigoc3wwKT09NjQpe2FbdD4+MF09MTExfWVsc2UgaWYoKHN8MCk9PTgpe2lmKChyJjE2Mzg0fDApPT0wKXthW3Q+PjBdPTEyMDticmVha31lbHNle2FbdD4+MF09ODg7YnJlYWt9fWVsc2V7YVt0Pj4wXT0xMTd9fXdoaWxlKDApO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX10PWNbMzM0MF18MDtjW2w+PjJdPWg7cT13aShuLDEyLHQscSxsKXwwO2g9bitxfDA7cD1jW3A+PjJdJjE3Njtkb3tpZigocHwwKT09MzIpe3A9aH1lbHNlIGlmKChwfDApPT0xNil7cD1hW24+PjBdfDA7aWYocDw8MjQ+PjI0PT00M3xwPDwyND4+MjQ9PTQ1KXtwPW4rMXwwO2JyZWFrfWlmKChxfDApPjEmcDw8MjQ+PjI0PT00OD8odD1hW24rMT4+MF18MCx0PDwyND4+MjQ9PTg4fHQ8PDI0Pj4yND09MTIwKTowKXtwPW4rMnwwfWVsc2V7aj0yMX19ZWxzZXtqPTIxfX13aGlsZSgwKTtpZigoanwwKT09MjEpe3A9bn1qPWNbZisyOD4+Ml18MDtjW28+PjJdPWo7aj1qKzR8MDtjW2o+PjJdPShjW2o+PjJdfDApKzE7S2kobixwLGgsbCxrLG0sbyk7aj1jW28+PjJdfDA7cz1qKzR8MDt0PWNbcz4+Ml18MDtjW3M+PjJdPXQrIC0xO2lmKCh0fDApIT0wKXtyPWNbZT4+Ml18MDtzPWNbaz4+Ml18MDt0PWNbbT4+Ml18MDtMaShiLHIsbCxzLHQsZixnKTtpPWQ7cmV0dXJufWxjW2NbKGNbaj4+Ml18MCkrOD4+Ml0mMjU1XShqKTtyPWNbZT4+Ml18MDtzPWNbaz4+Ml18MDt0PWNbbT4+Ml18MDtMaShiLHIsbCxzLHQsZixnKTtpPWQ7cmV0dXJufQoKCgpmdW5jdGlvbiBYayhiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MDtkPWk7aT1pKzE2fDA7ZT1kO2lmKChhWzEzNDMyXXwwKSE9MCl7aD1jWzMzNTZdfDA7Y1tiPj4yXT1oO2g9aCs0fDA7Zz1jW2g+PjJdfDA7Y1toPj4yXT1nKzE7aT1kO3JldHVybn1pZigoUWEoMTM0MzIpfDApPT0wKXtoPWNbMzM1Nl18MDtjW2I+PjJdPWg7aD1oKzR8MDtnPWNbaD4+Ml18MDtjW2g+PjJdPWcrMTtpPWQ7cmV0dXJufWlmKChhWzEzNDE2XXwwKT09MD8oUWEoMTM0MTYpfDApIT0wOjApe2NbMTc3NjQ+PjJdPTA7Y1s0NDQwXT0xMzM5MjthWzE3ODk2Pj4wXT0xO2NbMTc3NzI+PjJdPTE3Nzg0O2NbMTc3Njg+PjJdPTE3Nzg0O2NbMTc3NzY+PjJdPTE3ODk2O2g9Mjg7Zj0xNzc4NHwwO2Rve2NbZj4+Ml09MDtnPWNbMTc3NzI+PjJdfDA7Zj1nKzR8MDtjWzE3NzcyPj4yXT1mO2g9aCsgLTF8MH13aGlsZSgoaHwwKSE9MCk7YVsxNzkwND4+MF09MjthWzE3OTA1Pj4wXT02NzthWzE3OTA2Pj4wXT0wO2g9Y1sxNzc2OD4+Ml18MDtpZigoZnwwKSE9KGh8MCkpe2NbMTc3NzI+PjJdPWcrKDAtKChnKygwLWgpfDApPj4+Mik8PDIpfWNbMTgyMjg+PjJdPTA7Y1s0NTU2XT0xMTg3MjtpZighKChjWzI5NzRdfDApPT0tMSkpe2NbZT4+Ml09MTE4OTY7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMTg5NixlKX1VaygxNzc2MCwxODIyNCwoY1sxMTkwMD4+Ml18MCkrIC0xfDApO2NbMTgyMjA+PjJdPTA7Y1s0NTU0XT0xMTkxMjtpZighKChjWzI5ODRdfDApPT0tMSkpe2NbZT4+Ml09MTE5MzY7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMTkzNixlKX1VaygxNzc2MCwxODIxNiwoY1sxMTk0MD4+Ml18MCkrIC0xfDApO2NbMTgyMDQ+PjJdPTA7Y1s0NTUwXT0xMzQ3MjtjWzE4MjA4Pj4yXT0wO2FbMTgyMTI+PjBdPTA7Y1sxODIwOD4+Ml09Y1soTmEoKXwwKT4+Ml07aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2U+PjJdPTEzNDU2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM0NTYsZSl9VWsoMTc3NjAsMTgyMDAsKGNbMTM0NjA+PjJdfDApKyAtMXwwKTtjWzE4MTk2Pj4yXT0wO2NbNDU0OF09MTQzOTI7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW2U+PjJdPTEzNDQ4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM0NDgsZSl9VWsoMTc3NjAsMTgxOTIsKGNbMTM0NTI+PjJdfDApKyAtMXwwKTtjWzE4MTg4Pj4yXT0wO2NbNDU0Nl09MTQ2MDg7aWYoISgoY1szMzgwXXwwKT09LTEpKXtjW2U+PjJdPTEzNTIwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1MjAsZSl9VWsoMTc3NjAsMTgxODQsKGNbMTM1MjQ+PjJdfDApKyAtMXwwKTtjWzE4MTcyPj4yXT0wO2NbNDU0Ml09MTM1NDQ7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWNbMTgxNzY+PjJdPWNbMzM0MF07aWYoISgoY1szMzgyXXwwKT09LTEpKXtjW2U+PjJdPTEzNTI4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1MjgsZSl9VWsoMTc3NjAsMTgxNjgsKGNbMTM1MzI+PjJdfDApKyAtMXwwKTtjWzE4MTY0Pj4yXT0wO2NbNDU0MF09MTQ4MzI7aWYoISgoY1szMzk2XXwwKT09LTEpKXtjW2U+PjJdPTEzNTg0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1ODQsZSl9VWsoMTc3NjAsMTgxNjAsKGNbMTM1ODg+PjJdfDApKyAtMXwwKTtjWzE4MTU2Pj4yXT0wO2NbNDUzOF09MTQ5NTI7aWYoISgoY1szMzk4XXwwKT09LTEpKXtjW2U+PjJdPTEzNTkyO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1OTIsZSl9VWsoMTc3NjAsMTgxNTIsKGNbMTM1OTY+PjJdfDApKyAtMXwwKTtjWzE4MTMyPj4yXT0wO2NbNDUzMl09MTM2MjQ7YVsxODEzNj4+MF09NDY7YVsxODEzNz4+MF09NDQ7Y1sxODE0MD4+Ml09MDtjWzE4MTQ0Pj4yXT0wO2NbMTgxNDg+PjJdPTA7aWYoISgoY1szNDAwXXwwKT09LTEpKXtjW2U+PjJdPTEzNjAwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM2MDAsZSl9VWsoMTc3NjAsMTgxMjgsKGNbMTM2MDQ+PjJdfDApKyAtMXwwKTtjWzE4MTAwPj4yXT0wO2NbNDUyNF09MTM2NjQ7Y1sxODEwND4+Ml09NDY7Y1sxODEwOD4+Ml09NDQ7Y1sxODExMj4+Ml09MDtjWzE4MTE2Pj4yXT0wO2NbMTgxMjA+PjJdPTA7aWYoISgoY1szNDAyXXwwKT09LTEpKXtjW2U+PjJdPTEzNjA4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM2MDgsZSl9VWsoMTc3NjAsMTgwOTYsKGNbMTM2MTI+PjJdfDApKyAtMXwwKTtjWzE4MDkyPj4yXT0wO2NbNDUyMl09MTE5NTI7aWYoISgoY1szMDAyXXwwKT09LTEpKXtjW2U+PjJdPTEyMDA4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIwMDgsZSl9VWsoMTc3NjAsMTgwODgsKGNbMTIwMTI+PjJdfDApKyAtMXwwKTtjWzE4MDg0Pj4yXT0wO2NbNDUyMF09MTIwNzI7aWYoISgoY1szMDMyXXwwKT09LTEpKXtjW2U+PjJdPTEyMTI4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIxMjgsZSl9VWsoMTc3NjAsMTgwODAsKGNbMTIxMzI+PjJdfDApKyAtMXwwKTtjWzE4MDc2Pj4yXT0wO2NbNDUxOF09MTIxNDQ7aWYoISgoY1szMDQ4XXwwKT09LTEpKXtjW2U+PjJdPTEyMTkyO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIxOTIsZSl9VWsoMTc3NjAsMTgwNzIsKGNbMTIxOTY+PjJdfDApKyAtMXwwKTtjWzE4MDY4Pj4yXT0wO2NbNDUxNl09MTIyMDg7aWYoISgoY1szMDY0XXwwKT09LTEpKXtjW2U+PjJdPTEyMjU2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIyNTYsZSl9VWsoMTc3NjAsMTgwNjQsKGNbMTIyNjA+PjJdfDApKyAtMXwwKTtjWzE4MDYwPj4yXT0wO2NbNDUxNF09MTI4MDA7aWYoISgoY1szMjEyXXwwKT09LTEpKXtjW2U+PjJdPTEyODQ4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI4NDgsZSl9VWsoMTc3NjAsMTgwNTYsKGNbMTI4NTI+PjJdfDApKyAtMXwwKTtjWzE4MDUyPj4yXT0wO2NbNDUxMl09MTI4NjQ7aWYoISgoY1szMjI4XXwwKT09LTEpKXtjW2U+PjJdPTEyOTEyO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI5MTIsZSl9VWsoMTc3NjAsMTgwNDgsKGNbMTI5MTY+PjJdfDApKyAtMXwwKTtjWzE4MDQ0Pj4yXT0wO2NbNDUxMF09MTI5Mjg7aWYoISgoY1szMjQ0XXwwKT09LTEpKXtjW2U+PjJdPTEyOTc2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI5NzYsZSl9VWsoMTc3NjAsMTgwNDAsKGNbMTI5ODA+PjJdfDApKyAtMXwwKTtjWzE4MDM2Pj4yXT0wO2NbNDUwOF09MTI5OTI7aWYoISgoY1szMjYwXXwwKT09LTEpKXtjW2U+PjJdPTEzMDQwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMwNDAsZSl9VWsoMTc3NjAsMTgwMzIsKGNbMTMwNDQ+PjJdfDApKyAtMXwwKTtjWzE4MDI4Pj4yXT0wO2NbNDUwNl09MTMwNTY7aWYoISgoY1szMjcwXXwwKT09LTEpKXtjW2U+PjJdPTEzMDgwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMwODAsZSl9VWsoMTc3NjAsMTgwMjQsKGNbMTMwODQ+PjJdfDApKyAtMXwwKTtjWzE4MDIwPj4yXT0wO2NbNDUwNF09MTMxMzY7aWYoISgoY1szMjkwXXwwKT09LTEpKXtjW2U+PjJdPTEzMTYwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMxNjAsZSl9VWsoMTc3NjAsMTgwMTYsKGNbMTMxNjQ+PjJdfDApKyAtMXwwKTtjWzE4MDEyPj4yXT0wO2NbNDUwMl09MTMxOTI7aWYoISgoY1szMzA0XXwwKT09LTEpKXtjW2U+PjJdPTEzMjE2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMyMTYsZSl9VWsoMTc3NjAsMTgwMDgsKGNbMTMyMjA+PjJdfDApKyAtMXwwKTtjWzE4MDA0Pj4yXT0wO2NbNDUwMF09MTMyNDA7aWYoISgoY1szMzE2XXwwKT09LTEpKXtjW2U+PjJdPTEzMjY0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMyNjQsZSl9VWsoMTc3NjAsMThlMywoY1sxMzI2OD4+Ml18MCkrIC0xfDApO2NbMTc5ODg+PjJdPTA7Y1s0NDk2XT0xMjI4ODtjWzE3OTkyPj4yXT0xMjMzNjtpZighKChjWzMwOTJdfDApPT0tMSkpe2NbZT4+Ml09MTIzNjg7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMjM2OCxlKX1VaygxNzc2MCwxNzk4NCwoY1sxMjM3Mj4+Ml18MCkrIC0xfDApO2NbMTc5NzI+PjJdPTA7Y1s0NDkyXT0xMjQ0MDtjWzE3OTc2Pj4yXT0xMjQ4ODtpZighKChjWzMxMzBdfDApPT0tMSkpe2NbZT4+Ml09MTI1MjA7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMjUyMCxlKX1VaygxNzc2MCwxNzk2OCwoY1sxMjUyND4+Ml18MCkrIC0xfDApO2NbMTc5NTY+PjJdPTA7Y1s0NDg4XT0xNDMyODtkb3tpZigoYVsxMzM2OF18MCk9PTApe2lmKChRYSgxMzM2OCl8MCk9PTApe2JyZWFrfWNbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX19d2hpbGUoMCk7Y1sxNzk2MD4+Ml09Y1szMzQwXTtjWzQ0ODhdPTEyNzM2O2lmKCEoKGNbMzE4OF18MCk9PS0xKSl7Y1tlPj4yXT0xMjc1MjtjW2UrND4+Ml09MjA4O2NbZSs4Pj4yXT0wO2NnKDEyNzUyLGUpfVVrKDE3NzYwLDE3OTUyLChjWzEyNzU2Pj4yXXwwKSsgLTF8MCk7Y1sxNzk0MD4+Ml09MDtjWzQ0ODRdPTE0MzI4O2Rve2lmKChhWzEzMzY4XXwwKT09MCl7aWYoKFFhKDEzMzY4KXwwKT09MCl7YnJlYWt9Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfX13aGlsZSgwKTtjWzE3OTQ0Pj4yXT1jWzMzNDBdO2NbNDQ4NF09MTI3Njg7aWYoISgoY1szMTk2XXwwKT09LTEpKXtjW2U+PjJdPTEyNzg0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI3ODQsZSl9VWsoMTc3NjAsMTc5MzYsKGNbMTI3ODg+PjJdfDApKyAtMXwwKTtjWzE3OTMyPj4yXT0wO2NbNDQ4Ml09MTMyODA7aWYoISgoY1szMzI2XXwwKT09LTEpKXtjW2U+PjJdPTEzMzA0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMzMDQsZSl9VWsoMTc3NjAsMTc5MjgsKGNbMTMzMDg+PjJdfDApKyAtMXwwKTtjWzE3OTI0Pj4yXT0wO2NbNDQ4MF09MTMzMjA7aWYoISgoY1szMzM2XXwwKT09LTEpKXtjW2U+PjJdPTEzMzQ0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMzNDQsZSl9VWsoMTc3NjAsMTc5MjAsKGNbMTMzNDg+PjJdfDApKyAtMXwwKTtjWzMzNTJdPTE3NzYwOyRhKDEzNDE2KX1oPWNbMzM1Ml18MDtjWzMzNTZdPWg7aD1oKzR8MDtjW2g+PjJdPShjW2g+PjJdfDApKzE7JGEoMTM0MzIpO2g9Y1szMzU2XXwwO2NbYj4+Ml09aDtoPWgrNHwwO2c9Y1toPj4yXXwwO2NbaD4+Ml09ZysxO2k9ZDtyZXR1cm59ZnVuY3Rpb24gWWsoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MDtkPWk7aT1pKzE2fDA7ZT1kO2lmKCEoKGNbYj4+Ml18MCk9PS0xKSl7Y1tlPj4yXT1iO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coYixlKX1lPShjW2IrND4+Ml18MCkrIC0xfDA7Yj1jW2ErOD4+Ml18MDtpZighKChjW2ErMTI+PjJdfDApLWI+PjI+Pj4wPmU+Pj4wKSl7ZT1YYSg0KXwwO2NbZT4+Ml09MjEzMDQ7d2IoZXwwLDIxMzc2LDE5Nil9YT1jW2IrKGU8PDIpPj4yXXwwO2lmKChhfDApPT0wKXtlPVhhKDQpfDA7Y1tlPj4yXT0yMTMwNDt3YihlfDAsMjEzNzYsMTk2KX1lbHNle2k9ZDtyZXR1cm4gYXwwfXJldHVybiAwfWZ1bmN0aW9uIFprKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIF9rKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrND4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uICRrKGEpe2E9YXwwO3ZhciBiPTA7Yj1jWzMzNjBdfDA7Y1szMzYwXT1iKzE7Y1thKzQ+PjJdPWIrMTtyZXR1cm59ZnVuY3Rpb24gYWwoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gYmwoYSxkLGUpe2E9YXwwO2Q9ZHwwO2U9ZXwwO2E9aTtpZighKGU+Pj4wPDEyOCkpe2Q9MDtpPWE7cmV0dXJuIGR8MH1kPShiWyhjWyhOYSgpfDApPj4yXXwwKSsoZTw8MSk+PjFdJmQpPDwxNj4+MTYhPTA7aT1hO3JldHVybiBkfDB9ZnVuY3Rpb24gY2woYSxkLGUsZil7YT1hfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MDthPWk7aWYoKGR8MCk9PShlfDApKXtnPWQ7aT1hO3JldHVybiBnfDB9d2hpbGUoMSl7Zz1jW2Q+PjJdfDA7aWYoZz4+PjA8MTI4KXtnPWJbKGNbKE5hKCl8MCk+PjJdfDApKyhnPDwxKT4+MV18MH1lbHNle2c9MH1iW2Y+PjFdPWc7ZD1kKzR8MDtpZigoZHwwKT09KGV8MCkpe2JyZWFrfWVsc2V7Zj1mKzJ8MH19aT1hO3JldHVybiBlfDB9ZnVuY3Rpb24gZGwoYSxkLGUsZil7YT1hfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MDthPWk7YTpkb3tpZigoZXwwKT09KGZ8MCkpe2Y9ZX1lbHNle2Rve2c9Y1tlPj4yXXwwO2lmKGc+Pj4wPDEyOD8hKChiWyhjWyhOYSgpfDApPj4yXXwwKSsoZzw8MSk+PjFdJmQpPDwxNj4+MTY9PTApOjApe2Y9ZTticmVhayBhfWU9ZSs0fDB9d2hpbGUoKGV8MCkhPShmfDApKX19d2hpbGUoMCk7aT1hO3JldHVybiBmfDB9ZnVuY3Rpb24gZWwoYSxkLGUsZil7YT1hfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MDthPWk7YTpkb3tpZigoZXwwKT09KGZ8MCkpe2Y9ZX1lbHNle2Rve2c9Y1tlPj4yXXwwO2lmKCEoZz4+PjA8MTI4KSl7Zj1lO2JyZWFrIGF9aWYoKGJbKGNbKE5hKCl8MCk+PjJdfDApKyhnPDwxKT4+MV0mZCk8PDE2Pj4xNj09MCl7Zj1lO2JyZWFrIGF9ZT1lKzR8MH13aGlsZSgoZXwwKSE9KGZ8MCkpfX13aGlsZSgwKTtpPWE7cmV0dXJuIGZ8MH1mdW5jdGlvbiBmbChhLGIpe2E9YXwwO2I9YnwwO2E9aTtpZighKGI+Pj4wPDEyOCkpe2k9YTtyZXR1cm4gYnwwfWI9Y1soY1soWmEoKXwwKT4+Ml18MCkrKGI8PDIpPj4yXXwwO2k9YTtyZXR1cm4gYnwwfWZ1bmN0aW9uIGdsKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wO2E9aTtpZigoYnwwKT09KGR8MCkpe2U9YjtpPWE7cmV0dXJuIGV8MH1kb3tlPWNbYj4+Ml18MDtpZihlPj4+MDwxMjgpe2U9Y1soY1soWmEoKXwwKT4+Ml18MCkrKGU8PDIpPj4yXXwwfWNbYj4+Ml09ZTtiPWIrNHwwfXdoaWxlKChifDApIT0oZHwwKSk7aT1hO3JldHVybiBkfDB9ZnVuY3Rpb24gaGwoYSxiKXthPWF8MDtiPWJ8MDthPWk7aWYoIShiPj4+MDwxMjgpKXtpPWE7cmV0dXJuIGJ8MH1iPWNbKGNbKEhhKCl8MCk+PjJdfDApKyhiPDwyKT4+Ml18MDtpPWE7cmV0dXJuIGJ8MH1mdW5jdGlvbiBpbChhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MDthPWk7aWYoKGJ8MCk9PShkfDApKXtlPWI7aT1hO3JldHVybiBlfDB9ZG97ZT1jW2I+PjJdfDA7aWYoZT4+PjA8MTI4KXtlPWNbKGNbKEhhKCl8MCk+PjJdfDApKyhlPDwyKT4+Ml18MH1jW2I+PjJdPWU7Yj1iKzR8MH13aGlsZSgoYnwwKSE9KGR8MCkpO2k9YTtyZXR1cm4gZHwwfWZ1bmN0aW9uIGpsKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGI8PDI0Pj4yNHwwfWZ1bmN0aW9uIGtsKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2I9aTtpZigoZHwwKT09KGV8MCkpe2k9YjtyZXR1cm4gZHwwfXdoaWxlKDEpe2NbZj4+Ml09YVtkPj4wXXwwO2Q9ZCsxfDA7aWYoKGR8MCk9PShlfDApKXticmVha31lbHNle2Y9Zis0fDB9fWk9YjtyZXR1cm4gZXwwfWZ1bmN0aW9uIGxsKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4oYj4+PjA8MTI4P2ImMjU1OmMpfDB9ZnVuY3Rpb24gbWwoYixkLGUsZixnKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wLGo9MCxrPTA7Yj1pO2lmKChkfDApPT0oZXwwKSl7aj1kO2k9YjtyZXR1cm4ganwwfWg9KChlKyAtNCsoMC1kKXwwKT4+PjIpKzF8MDtqPWQ7d2hpbGUoMSl7az1jW2o+PjJdfDA7YVtnPj4wXT1rPj4+MDwxMjg/ayYyNTU6ZjtqPWorNHwwO2lmKChqfDApPT0oZXwwKSl7YnJlYWt9ZWxzZXtnPWcrMXwwfX1rPWQrKGg8PDIpfDA7aT1iO3JldHVybiBrfDB9ZnVuY3Rpb24gbmwoYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2NbYj4+Ml09MTM0NzI7ZT1jW2IrOD4+Ml18MDtpZigoZXwwKSE9MCl7aWYoKGFbYisxMj4+MF18MCkhPTApe3ZuKGUpfWlmKChifDApPT0wKXtpPWQ7cmV0dXJufX12bihiKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIG9sKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNDcyO2U9Y1tiKzg+PjJdfDA7aWYoKGV8MCkhPTA/KGFbYisxMj4+MF18MCkhPTA6MCl7dm4oZSl9aT1kO3JldHVybn1mdW5jdGlvbiBwbChhLGIpe2E9YXwwO2I9YnwwO2E9aTtpZighKGI8PDI0Pj4yND4tMSkpe2k9YTtyZXR1cm4gYnwwfWI9Y1soY1soWmEoKXwwKT4+Ml18MCkrKChiJjI1NSk8PDIpPj4yXSYyNTU7aT1hO3JldHVybiBifDB9ZnVuY3Rpb24gcWwoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTA7Yj1pO2lmKChkfDApPT0oZXwwKSl7Zj1kO2k9YjtyZXR1cm4gZnwwfWRve2Y9YVtkPj4wXXwwO2lmKGY8PDI0Pj4yND4tMSl7Zj1jWyhjWyhaYSgpfDApPj4yXXwwKSsoZjw8MjQ+PjI0PDwyKT4+Ml0mMjU1fWFbZD4+MF09ZjtkPWQrMXwwfXdoaWxlKChkfDApIT0oZXwwKSk7aT1iO3JldHVybiBlfDB9ZnVuY3Rpb24gcmwoYSxiKXthPWF8MDtiPWJ8MDthPWk7aWYoIShiPDwyND4+MjQ+LTEpKXtpPWE7cmV0dXJuIGJ8MH1iPWNbKGNbKEhhKCl8MCk+PjJdfDApKyhiPDwyND4+MjQ8PDIpPj4yXSYyNTU7aT1hO3JldHVybiBifDB9ZnVuY3Rpb24gc2woYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTA7Yj1pO2lmKChkfDApPT0oZXwwKSl7Zj1kO2k9YjtyZXR1cm4gZnwwfWRve2Y9YVtkPj4wXXwwO2lmKGY8PDI0Pj4yND4tMSl7Zj1jWyhjWyhIYSgpfDApPj4yXXwwKSsoZjw8MjQ+PjI0PDwyKT4+Ml0mMjU1fWFbZD4+MF09ZjtkPWQrMXwwfXdoaWxlKChkfDApIT0oZXwwKSk7aT1iO3JldHVybiBlfDB9ZnVuY3Rpb24gdGwoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4gYnwwfWZ1bmN0aW9uIHVsKGIsYyxkLGUpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2I9aTtpZigoY3wwKT09KGR8MCkpe2Q9Y31lbHNle3doaWxlKDEpe2FbZT4+MF09YVtjPj4wXXwwO2M9YysxfDA7aWYoKGN8MCk9PShkfDApKXticmVha31lbHNle2U9ZSsxfDB9fX1pPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB2bChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuKGI8PDI0Pj4yND4tMT9iOmMpfDB9ZnVuY3Rpb24gd2woYixjLGQsZSxmKXtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wO2I9aTtpZigoY3wwKT09KGR8MCkpe2k9YjtyZXR1cm4gY3wwfXdoaWxlKDEpe2c9YVtjPj4wXXwwO2FbZj4+MF09Zzw8MjQ+PjI0Pi0xP2c6ZTtjPWMrMXwwO2lmKChjfDApPT0oZHwwKSl7YnJlYWt9ZWxzZXtmPWYrMXwwfX1pPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB4bChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiB5bChhLGIsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2NbZj4+Ml09ZDtjW2k+PjJdPWc7cmV0dXJuIDN9ZnVuY3Rpb24gemwoYSxiLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtjW2Y+PjJdPWQ7Y1tpPj4yXT1nO3JldHVybiAzfWZ1bmN0aW9uIEFsKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Y1tmPj4yXT1kO3JldHVybiAzfWZ1bmN0aW9uIEJsKGEpe2E9YXwwO3JldHVybiAxfWZ1bmN0aW9uIENsKGEpe2E9YXwwO3JldHVybiAxfWZ1bmN0aW9uIERsKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Yj1kLWN8MDtyZXR1cm4oYj4+PjA8ZT4+PjA/YjplKXwwfWZ1bmN0aW9uIEVsKGEpe2E9YXwwO3JldHVybiAxfWZ1bmN0aW9uIEZsKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1NrKGEpO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEdsKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTA7ZD1pO2k9aSsyNzJ8MDtsPWQrMjY0fDA7bj1kKzh8MDtvPWQ7YTpkb3tpZigoZXwwKSE9KGZ8MCkpe3E9ZTt3aGlsZSgxKXtpZigoY1txPj4yXXwwKT09MCl7YnJlYWt9cT1xKzR8MDtpZigocXwwKT09KGZ8MCkpe3E9ZjticmVha319Y1trPj4yXT1oO2NbZz4+Ml09ZTtpZigoaHwwKSE9KGp8MCkpe3A9ajtiPWIrOHwwO3doaWxlKDEpe3c9cS1lPj4yO3M9aWIoY1tiPj4yXXwwKXwwO3k9Y1tnPj4yXXwwO3I9KGh8MCkhPTA7dj1yP3AtaHwwOjI1Njt1PXI/aDpuO2I6ZG97aWYoKHl8MCk9PTB8KHZ8MCk9PTApe3Q9MH1lbHNle3Q9MDtkb3t4PXc+Pj4wPj12Pj4+MDtpZighKHh8dz4+PjA+MzIpKXticmVhayBifXg9eD92Onc7dz13LXh8MDtjOmRve2lmKCh1fDApPT0wKXtBPWNbeT4+Ml18MDtpZigoQXwwKT09MCl7ej0wfWVsc2V7ej0wO3g9eTt3aGlsZSgxKXtpZihBPj4+MD4xMjcpe0E9V20obCxBKXwwO2lmKChBfDApPT0tMSl7dj0wO3Q9LTE7YnJlYWsgYn19ZWxzZXtBPTF9ej1BK3p8MDt4PXgrNHwwO0E9Y1t4Pj4yXXwwO2lmKChBfDApPT0wKXttPTMyO2JyZWFrfX19fWVsc2V7ZDpkb3tpZih4Pj4+MD4zKXt6PXU7QT14O3doaWxlKDEpe0I9Y1t5Pj4yXXwwO2lmKChCfDApPT0wKXttPTIyO2JyZWFrIGR9aWYoQj4+PjA+MTI3KXtCPVdtKHosQil8MDtpZigoQnwwKT09LTEpe3Y9MDt0PS0xO2JyZWFrIGJ9ej16K0J8MDtBPUEtQnwwfWVsc2V7YVt6Pj4wXT1CO3o9eisxfDA7QT1BKyAtMXwwfXk9eSs0fDA7aWYoIShBPj4+MD4zKSl7bT0xNjticmVha319fWVsc2V7ej11O0E9eDttPTE2fX13aGlsZSgwKTtpZigobXwwKT09MTYpe209MDtpZigoQXwwKT09MCl7QT0wfWVsc2V7bT0yMn19ZTpkb3tpZigobXwwKT09MjIpe3doaWxlKDEpe209MDtCPWNbeT4+Ml18MDtpZigoQnwwKT09MCl7bT0zMDticmVha31pZihCPj4+MD4xMjcpe0I9V20obCxCKXwwO2lmKChCfDApPT0tMSl7dj0wO3Q9LTE7YnJlYWsgYn1pZihCPj4+MD5BPj4+MCl7bT0yNjticmVha31XbSh6LGNbeT4+Ml18MCl8MDt6PXorQnwwO0E9QS1CfDB9ZWxzZXthW3o+PjBdPUI7ej16KzF8MDtBPUErIC0xfDB9aWYoKEF8MCk9PTApe0E9MDticmVhayBlfWVsc2V7eT15KzR8MDttPTIyfX1pZigobXwwKT09MjYpe3o9eC1BfDA7bT0zMjticmVhayBjfWVsc2UgaWYoKG18MCk9PTMwKXthW3o+PjBdPTA7YnJlYWt9fX13aGlsZSgwKTt6PXgtQXwwO3k9MDttPTMyfX13aGlsZSgwKTtpZigobXwwKT09MzIpe209MDtpZigoenwwKT09LTEpe3Y9MDt0PS0xO2JyZWFrIGJ9fWlmKCh1fDApPT0obnwwKSl7dT1ufWVsc2V7dj12LXp8MDt1PXUrenwwfXQ9eit0fDB9d2hpbGUoISgoeXwwKT09MHwodnwwKT09MCkpfX13aGlsZSgwKTtmOmRve2lmKCh5fDApIT0wPyEoKHZ8MCk9PTB8KHd8MCk9PTApOjApe3doaWxlKDEpe3g9V20odSxjW3k+PjJdfDApfDA7aWYoKHgrMXwwKT4+PjA8Mil7YnJlYWt9eT15KzR8MDt3PXcrIC0xfDA7dD10KzF8MDtpZigodnwwKT09KHh8MCl8KHd8MCk9PTApe2JyZWFrIGZ9ZWxzZXt2PXYteHwwO3U9dSt4fDB9fUI9KHh8MCk9PTA7dD1CP3Q6LTE7eT1CPzA6eX19d2hpbGUoMCk7aWYocil7Y1tnPj4yXT15fWlmKChzfDApIT0wKXtpYihzfDApfDB9aWYoKHR8MCk9PTApe2c9MTttPTY3O2JyZWFrfWVsc2UgaWYoKHR8MCk9PS0xKXttPTQ2O2JyZWFrfWg9KGNbaz4+Ml18MCkrdHwwO2Nbaz4+Ml09aDtpZigoaHwwKT09KGp8MCkpe209NjU7YnJlYWt9aWYoKHF8MCk9PShmfDApKXtlPWNbZz4+Ml18MDtxPWZ9ZWxzZXtlPWliKGNbYj4+Ml18MCl8MDthW28+PjBdPTA7aWYoKGV8MCkhPTApe2liKGV8MCl8MH1oPWNbaz4+Ml18MDtpZigoaHwwKT09KGp8MCkpe2c9MTttPTY3O2JyZWFrfWVsc2V7ZT0wO3E9MDtyPW99d2hpbGUoMSl7Y1trPj4yXT1oKzE7YVtoPj4wXT1lO2lmKChxfDApPT0wKXticmVha31CPXIrMXwwO2g9Y1trPj4yXXwwO2U9YVtCPj4wXXwwO3E9cSsgLTF8MDtyPUJ9ZT0oY1tnPj4yXXwwKSs0fDA7Y1tnPj4yXT1lO2c6ZG97aWYoKGV8MCk9PShmfDApKXtxPWZ9ZWxzZXtxPWU7d2hpbGUoMSl7aWYoKGNbcT4+Ml18MCk9PTApe2JyZWFrIGd9cT1xKzR8MDtpZigocXwwKT09KGZ8MCkpe3E9ZjticmVha319fX13aGlsZSgwKTtoPWNbaz4+Ml18MH1pZigoZXwwKT09KGZ8MCl8KGh8MCk9PShqfDApKXticmVhayBhfX1pZigobXwwKT09NDYpe2Nbaz4+Ml09aDtoOmRve2lmKChlfDApIT0oY1tnPj4yXXwwKSl7ZG97aj1jW2U+PjJdfDA7Zj1pYihjW2I+PjJdfDApfDA7aj1XbShoLGopfDA7aWYoKGZ8MCkhPTApe2liKGZ8MCl8MH1pZigoanwwKT09LTEpe2JyZWFrIGh9aD0oY1trPj4yXXwwKStqfDA7Y1trPj4yXT1oO2U9ZSs0fDB9d2hpbGUoKGV8MCkhPShjW2c+PjJdfDApKX19d2hpbGUoMCk7Y1tnPj4yXT1lO0I9MjtpPWQ7cmV0dXJuIEJ8MH1lbHNlIGlmKChtfDApPT02NSl7ZT1jW2c+PjJdfDA7YnJlYWt9ZWxzZSBpZigobXwwKT09Njcpe2k9ZDtyZXR1cm4gZ3wwfX19ZWxzZXtjW2s+PjJdPWg7Y1tnPj4yXT1lfX13aGlsZSgwKTtCPShlfDApIT0oZnwwKSYxO2k9ZDtyZXR1cm4gQnwwfWZ1bmN0aW9uIEhsKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MDtsPWk7aT1pKzEwNDB8MDtuPWwrMTZ8MDtvPWwrOHwwO209bDthOmRve2lmKChlfDApIT0oZnwwKSl7cj1lO3doaWxlKDEpe2lmKChhW3I+PjBdfDApPT0wKXticmVha31yPXIrMXwwO2lmKChyfDApPT0oZnwwKSl7cj1mO2JyZWFrfX1jW2s+PjJdPWg7Y1tnPj4yXT1lO2lmKChofDApIT0oanwwKSl7cD1qO2I9Yis4fDA7d2hpbGUoMSl7dD1kO3U9Y1t0KzQ+PjJdfDA7cT1tO2NbcT4+Ml09Y1t0Pj4yXTtjW3ErND4+Ml09dTtxPXI7dT1xLWV8MDt0PWliKGNbYj4+Ml18MCl8MDt5PWNbZz4+Ml18MDtjW28+PjJdPXk7cz0oaHwwKSE9MDt3PXM/cC1oPj4yOjI1Njt4PXM/aDpuO2I6ZG97aWYoKHl8MCk9PTB8KHd8MCk9PTApe3Y9MH1lbHNle3Y9MDt3aGlsZSgxKXt6PXU+Pj4yO0E9ej4+PjA+PXc+Pj4wO2lmKCEoQXx1Pj4+MD4xMzEpKXticmVhayBifXk9QT93Ono7dT11LXl8MDt5PVZtKHgsbyx5LGQpfDA7aWYoKHl8MCk9PS0xKXticmVha31pZigoeHwwKT09KG58MCkpe3g9bn1lbHNle3c9dy15fDA7eD14Kyh5PDwyKXwwfXY9eSt2fDA7eT1jW28+PjJdfDA7aWYoKHl8MCk9PTB8KHd8MCk9PTApe2JyZWFrIGJ9fXc9MDt5PWNbbz4+Ml18MDt2PS0xfX13aGlsZSgwKTtjOmRve2lmKCh5fDApIT0wKXtpZighKCh3fDApPT0wfCh1fDApPT0wKSl7d2hpbGUoMSl7ej1VbSh4LHksdSxkKXwwO2lmKCh6KzJ8MCk+Pj4wPDMpe2JyZWFrfXk9eSt6fDA7Y1tvPj4yXT15O3c9dysgLTF8MDt2PXYrMXwwO2lmKCh3fDApPT0wfCh1fDApPT0oenwwKSl7YnJlYWsgY31lbHNle3U9dS16fDA7eD14KzR8MH19aWYoKHp8MCk9PS0xKXt2PS0xO2JyZWFrfWVsc2UgaWYoKHp8MCk9PTApe2Nbbz4+Ml09MDt5PTA7YnJlYWt9ZWxzZXtjW2Q+PjJdPTA7YnJlYWt9fX1lbHNle3k9MH19d2hpbGUoMCk7aWYocyl7Y1tnPj4yXT15fWlmKCh0fDApIT0wKXtpYih0fDApfDB9aWYoKHZ8MCk9PTApe2Y9MjtkPTQ4O2JyZWFrfWVsc2UgaWYoKHZ8MCk9PS0xKXtkPTI2O2JyZWFrfWg9KGNbaz4+Ml18MCkrKHY8PDIpfDA7Y1trPj4yXT1oO2lmKChofDApPT0oanwwKSl7ZD00NjticmVha31lPWNbZz4+Ml18MDtpZigocnwwKT09KGZ8MCkpe3I9Zn1lbHNle3E9aWIoY1tiPj4yXXwwKXwwO2U9VW0oaCxlLDEsZCl8MDtpZigocXwwKSE9MCl7aWIocXwwKXwwfWlmKChlfDApIT0wKXtmPTI7ZD00ODticmVha31jW2s+PjJdPShjW2s+PjJdfDApKzQ7ZT0oY1tnPj4yXXwwKSsxfDA7Y1tnPj4yXT1lO2Q6ZG97aWYoKGV8MCk9PShmfDApKXtyPWZ9ZWxzZXtyPWU7d2hpbGUoMSl7aWYoKGFbcj4+MF18MCk9PTApe2JyZWFrIGR9cj1yKzF8MDtpZigocnwwKT09KGZ8MCkpe3I9ZjticmVha319fX13aGlsZSgwKTtoPWNbaz4+Ml18MH1pZigoZXwwKT09KGZ8MCl8KGh8MCk9PShqfDApKXticmVhayBhfX1pZigoZHwwKT09MjYpe2Nbaz4+Ml09aDtlOmRve2lmKChlfDApIT0oY1tnPj4yXXwwKSl7d2hpbGUoMSl7ZD1pYihjW2I+PjJdfDApfDA7bj1VbShoLGUscS1lfDAsbSl8MDtpZigoZHwwKSE9MCl7aWIoZHwwKXwwfWlmKChufDApPT0tMSl7ZD0zMTticmVha31lbHNlIGlmKChufDApPT0tMil7ZD0zMjticmVha31lbHNlIGlmKChufDApPT0wKXtlPWUrMXwwfWVsc2V7ZT1lK258MH1oPShjW2s+PjJdfDApKzR8MDtjW2s+PjJdPWg7aWYoKGV8MCk9PShjW2c+PjJdfDApKXticmVhayBlfX1pZigoZHwwKT09MzEpe2NbZz4+Ml09ZTtBPTI7aT1sO3JldHVybiBBfDB9ZWxzZSBpZigoZHwwKT09MzIpe2NbZz4+Ml09ZTtBPTE7aT1sO3JldHVybiBBfDB9fX13aGlsZSgwKTtjW2c+PjJdPWU7QT0oZXwwKSE9KGZ8MCkmMTtpPWw7cmV0dXJuIEF8MH1lbHNlIGlmKChkfDApPT00Nil7ZT1jW2c+PjJdfDA7YnJlYWt9ZWxzZSBpZigoZHwwKT09NDgpe2k9bDtyZXR1cm4gZnwwfX19ZWxzZXtjW2s+PjJdPWg7Y1tnPj4yXT1lfX13aGlsZSgwKTtBPShlfDApIT0oZnwwKSYxO2k9bDtyZXR1cm4gQXwwfWZ1bmN0aW9uIElsKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Yj1pO2NbZj4+Ml09ZDthPWliKGNbYSs4Pj4yXXwwKXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJuIDB9aWIoYXwwKXwwO2k9YjtyZXR1cm4gMH1mdW5jdGlvbiBKbChhKXthPWF8MDt2YXIgYj0wLGQ9MDtiPWk7YT1hKzh8MDtkPWliKGNbYT4+Ml18MCl8MDtpZigoZHwwKSE9MCl7aWIoZHwwKXwwfWE9Y1thPj4yXXwwO2lmKChhfDApIT0wKXthPWliKGF8MCl8MDtpZigoYXwwKT09MCl7YT0wfWVsc2V7aWIoYXwwKXwwO2E9MH19ZWxzZXthPTF9aT1iO3JldHVybiBhfDB9ZnVuY3Rpb24gS2woYSl7YT1hfDA7cmV0dXJuIDB9ZnVuY3Rpb24gTGwoYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7Zz1pO2lmKChmfDApPT0wfChkfDApPT0oZXwwKSl7bT0wO2k9ZztyZXR1cm4gbXwwfWg9ZTthPWErOHwwO2I9KGJ8MCkhPTA/YjoyMTI4MDtrPTA7aj0wO3doaWxlKDEpe209aWIoY1thPj4yXXwwKXwwO2w9VW0oMCxkLGgtZHwwLGIpfDA7aWYoKG18MCkhPTApe2liKG18MCl8MH1pZigobHwwKT09MCl7ZD1kKzF8MDtsPTF9ZWxzZSBpZigobHwwKT09LTJ8KGx8MCk9PS0xKXtmPTk7YnJlYWt9ZWxzZXtkPWQrbHwwfWs9bCtrfDA7aj1qKzF8MDtpZihqPj4+MD49Zj4+PjB8KGR8MCk9PShlfDApKXtmPTk7YnJlYWt9fWlmKChmfDApPT05KXtpPWc7cmV0dXJuIGt8MH1yZXR1cm4gMH1mdW5jdGlvbiBNbChhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSs4Pj4yXXwwO2lmKChhfDApIT0wKXthPWliKGF8MCl8MDtpZigoYXwwKT09MCl7YT00fWVsc2V7aWIoYXwwKXwwO2E9NH19ZWxzZXthPTF9aT1iO3JldHVybiBhfDB9ZnVuY3Rpb24gTmwoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gT2woZCxmLGcsaCxqLGssbCxtKXtkPWR8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDt2YXIgbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7Zj1pO2Q9aDthOmRve2lmKGc+Pj4wPGg+Pj4wKXtvPWc7bj1rO3doaWxlKDEpe3E9YltvPj4xXXwwO3A9cSY2NTUzNTtkb3tpZigocSY2NTUzNSk8MTI4KXtpZigobC1ufDApPDEpe2g9MTticmVhayBhfWFbbj4+MF09cTtuPW4rMXwwfWVsc2V7aWYoKHEmNjU1MzUpPDIwNDgpe2lmKChsLW58MCk8Mil7aD0xO2JyZWFrIGF9YVtuPj4wXT1wPj4+NnwxOTI7YVtuKzE+PjBdPXAmNjN8MTI4O249bisyfDA7YnJlYWt9aWYoKHEmNjU1MzUpPDU1Mjk2KXtpZigobC1ufDApPDMpe2g9MTticmVhayBhfWFbbj4+MF09cD4+PjEyfDIyNDthW24rMT4+MF09cD4+PjYmNjN8MTI4O2FbbisyPj4wXT1wJjYzfDEyODtuPW4rM3wwO2JyZWFrfWlmKCEoKHEmNjU1MzUpPDU2MzIwKSl7aWYoKHEmNjU1MzUpPDU3MzQ0KXtoPTI7YnJlYWsgYX1pZigobC1ufDApPDMpe2g9MTticmVhayBhfWFbbj4+MF09cD4+PjEyfDIyNDthW24rMT4+MF09cD4+PjYmNjN8MTI4O2FbbisyPj4wXT1wJjYzfDEyODtuPW4rM3wwO2JyZWFrfWlmKChkLW98MCk8NCl7aD0xO2JyZWFrIGF9cT1vKzJ8MDtyPWVbcT4+MV18MDtpZigociY2NDUxMnwwKSE9NTYzMjApe2g9MjticmVhayBhfWlmKChsLW58MCk8NCl7aD0xO2JyZWFrIGF9cz1wJjk2MDtpZigoKHM8PDEwKSs2NTUzNnwwKT4+PjA+MTExNDExMSl7aD0yO2JyZWFrIGF9bz0ocz4+PjYpKzF8MDthW24+PjBdPW8+Pj4yfDI0MDthW24rMT4+MF09cD4+PjImMTV8bzw8NCY0OHwxMjg7YVtuKzI+PjBdPXA8PDQmNDh8cj4+PjYmMTV8MTI4O2FbbiszPj4wXT1yJjYzfDEyODtvPXE7bj1uKzR8MH19d2hpbGUoMCk7bz1vKzJ8MDtpZighKG8+Pj4wPGg+Pj4wKSl7aD0wO2JyZWFrfX19ZWxzZXtoPTA7bz1nO249a319d2hpbGUoMCk7Y1tqPj4yXT1nKyhvLWc+PjE8PDEpO2NbbT4+Ml09aysobi1rKTtpPWY7cmV0dXJuIGh8MH1mdW5jdGlvbiBQbChlLGYsZyxoLGosayxsLG0pe2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO2w9bHwwO209bXwwO3ZhciBuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2Y9aTthOmRve2lmKGc+Pj4wPGg+Pj4wKXtvPWg7cD1sO3E9ZztlPWs7d2hpbGUoMSl7aWYoIShlPj4+MDxsPj4+MCkpe249MzE7YnJlYWsgYX1zPWFbcT4+MF18MDtyPXMmMjU1O2Rve2lmKHM8PDI0Pj4yND4tMSl7YltlPj4xXT1zJjI1NTtxPXErMXwwfWVsc2V7aWYoKHMmMjU1KTwxOTQpe2g9MjticmVhayBhfWlmKChzJjI1NSk8MjI0KXtpZigoby1xfDApPDIpe2g9MTticmVhayBhfXM9ZFtxKzE+PjBdfDA7aWYoKHMmMTkyfDApIT0xMjgpe2g9MjticmVhayBhfWJbZT4+MV09cyY2M3xyPDw2JjE5ODQ7cT1xKzJ8MDticmVha31pZigocyYyNTUpPDI0MCl7aWYoKG8tcXwwKTwzKXtoPTE7YnJlYWsgYX1zPWFbcSsxPj4wXXwwO3Q9YVtxKzI+PjBdfDA7aWYoKHJ8MCk9PTIzNyl7aWYoISgocyYtMzIpPDwyND4+MjQ9PS0xMjgpKXtoPTI7YnJlYWsgYX19ZWxzZSBpZigocnwwKT09MjI0KXtpZighKChzJi0zMik8PDI0Pj4yND09LTk2KSl7aD0yO2JyZWFrIGF9fWVsc2V7aWYoISgocyYtNjQpPDwyND4+MjQ9PS0xMjgpKXtoPTI7YnJlYWsgYX19dD10JjI1NTtpZigodCYxOTJ8MCkhPTEyOCl7aD0yO2JyZWFrIGF9YltlPj4xXT0ocyYyNTUpPDw2JjQwMzJ8cjw8MTJ8dCY2MztxPXErM3wwO2JyZWFrfWlmKCEoKHMmMjU1KTwyNDUpKXtoPTI7YnJlYWsgYX1pZigoby1xfDApPDQpe2g9MTticmVhayBhfXM9YVtxKzE+PjBdfDA7dD1hW3ErMj4+MF18MDt1PWFbcSszPj4wXXwwO2lmKChyfDApPT0yNDApe2lmKCEoKHMrMTEyPDwyND4+MjQmMjU1KTw0OCkpe2g9MjticmVhayBhfX1lbHNlIGlmKChyfDApPT0yNDQpe2lmKCEoKHMmLTE2KTw8MjQ+PjI0PT0tMTI4KSl7aD0yO2JyZWFrIGF9fWVsc2V7aWYoISgocyYtNjQpPDwyND4+MjQ9PS0xMjgpKXtoPTI7YnJlYWsgYX19dD10JjI1NTtpZigodCYxOTJ8MCkhPTEyOCl7aD0yO2JyZWFrIGF9dT11JjI1NTtpZigodSYxOTJ8MCkhPTEyOCl7aD0yO2JyZWFrIGF9aWYoKHAtZXwwKTw0KXtoPTE7YnJlYWsgYX1yPXImNztzPXMmMjU1O2lmKChzPDwxMiYxOTY2MDh8cjw8MTgpPj4+MD4xMTE0MTExKXtoPTI7YnJlYWsgYX1iW2U+PjFdPXM8PDImNjB8dD4+PjQmM3woKHM+Pj40JjN8cjw8Mik8PDYpKzE2MzIwfDU1Mjk2O2U9ZSsyfDA7YltlPj4xXT11JjYzfHQ8PDYmOTYwfDU2MzIwO3E9cSs0fDB9fXdoaWxlKDApO2U9ZSsyfDA7aWYoIShxPj4+MDxoPj4+MCkpe249MzE7YnJlYWt9fX1lbHNle3E9ZztlPWs7bj0zMX19d2hpbGUoMCk7aWYoKG58MCk9PTMxKXtoPXE+Pj4wPGg+Pj4wJjF9Y1tqPj4yXT1nKyhxLWcpO2NbbT4+Ml09aysoZS1rPj4xPDwxKTtpPWY7cmV0dXJuIGh8MH1mdW5jdGlvbiBRbChhLGIsZCxlLGYpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2NbZj4+Ml09ZDtyZXR1cm4gM31mdW5jdGlvbiBSbChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBTbChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBUbChiLGMsZCxlLGYpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Yz1pO2E6ZG97aWYoZD4+PjA8ZT4+PjAmKGZ8MCkhPTApe2I9ZTtoPWQ7Zz0wO2I6d2hpbGUoMSl7az1hW2g+PjBdfDA7aj1rJjI1NTtkb3tpZihrPDwyND4+MjQ+LTEpe2g9aCsxfDB9ZWxzZXtpZigoayYyNTUpPDE5NCl7YnJlYWsgYX1pZigoayYyNTUpPDIyNCl7aWYoKGItaHwwKTwyKXticmVhayBhfWlmKCEoKGFbaCsxPj4wXSYtNjQpPDwyND4+MjQ9PS0xMjgpKXticmVhayBhfWg9aCsyfDA7YnJlYWt9aWYoKGsmMjU1KTwyNDApe2s9aDtpZigoYi1rfDApPDMpe2JyZWFrIGF9bT1hW2grMT4+MF18MDtsPWFbaCsyPj4wXXwwO2lmKChqfDApPT0yMjQpe2lmKCEoKG0mLTMyKTw8MjQ+PjI0PT0tOTYpKXtlPTE0O2JyZWFrIGJ9fWVsc2UgaWYoKGp8MCk9PTIzNyl7aWYoISgobSYtMzIpPDwyND4+MjQ9PS0xMjgpKXtlPTE2O2JyZWFrIGJ9fWVsc2V7aWYoISgobSYtNjQpPDwyND4+MjQ9PS0xMjgpKXtlPTE4O2JyZWFrIGJ9fWlmKCEoKGwmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7YnJlYWsgYX1oPWgrM3wwO2JyZWFrfWlmKCEoKGsmMjU1KTwyNDUpKXticmVhayBhfWs9aDtpZigoYi1rfDApPDQpe2JyZWFrIGF9aWYoKGYtZ3wwKT4+PjA8Mil7YnJlYWsgYX1uPWFbaCsxPj4wXXwwO2w9YVtoKzI+PjBdfDA7bT1hW2grMz4+MF18MDtpZigoanwwKT09MjQ0KXtpZighKChuJi0xNik8PDI0Pj4yND09LTEyOCkpe2U9Mjg7YnJlYWsgYn19ZWxzZSBpZigoanwwKT09MjQwKXtpZighKChuKzExMjw8MjQ+PjI0JjI1NSk8NDgpKXtlPTI2O2JyZWFrIGJ9fWVsc2V7aWYoISgobiYtNjQpPDwyND4+MjQ9PS0xMjgpKXtlPTMwO2JyZWFrIGJ9fWlmKCEoKGwmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7YnJlYWsgYX1pZighKChtJi02NCk8PDI0Pj4yND09LTEyOCkpe2JyZWFrIGF9aWYoKChuJjI1NSk8PDEyJjE5NjYwOHxqPDwxOCYxODM1MDA4KT4+PjA+MTExNDExMSl7YnJlYWsgYX1oPWgrNHwwO2c9ZysxfDB9fXdoaWxlKDApO2c9ZysxfDA7aWYoIShoPj4+MDxlPj4+MCZnPj4+MDxmPj4+MCkpe2JyZWFrIGF9fWlmKChlfDApPT0xNCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0xNil7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0xOCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0yNil7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0yOCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0zMCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH19ZWxzZXtoPWR9fXdoaWxlKDApO249aC1kfDA7aT1jO3JldHVybiBufDB9ZnVuY3Rpb24gVWwoYSl7YT1hfDA7cmV0dXJuIDR9ZnVuY3Rpb24gVmwoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gV2woYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTA7ZD1pO2E6ZG97aWYoZT4+PjA8Zj4+PjApe2I9ZTtsPWg7d2hpbGUoMSl7bT1jW2I+PjJdfDA7aWYoKG0mLTIwNDh8MCk9PTU1Mjk2fG0+Pj4wPjExMTQxMTEpe2Y9MjticmVhayBhfWRve2lmKCEobT4+PjA8MTI4KSl7aWYobT4+PjA8MjA0OCl7aWYoKGotbHwwKTwyKXtmPTE7YnJlYWsgYX1hW2w+PjBdPW0+Pj42fDE5MjthW2wrMT4+MF09bSY2M3wxMjg7bD1sKzJ8MDticmVha31uPWotbHwwO2lmKG0+Pj4wPDY1NTM2KXtpZigobnwwKTwzKXtmPTE7YnJlYWsgYX1hW2w+PjBdPW0+Pj4xMnwyMjQ7YVtsKzE+PjBdPW0+Pj42JjYzfDEyODthW2wrMj4+MF09bSY2M3wxMjg7bD1sKzN8MDticmVha31lbHNle2lmKChufDApPDQpe2Y9MTticmVhayBhfWFbbD4+MF09bT4+PjE4fDI0MDthW2wrMT4+MF09bT4+PjEyJjYzfDEyODthW2wrMj4+MF09bT4+PjYmNjN8MTI4O2FbbCszPj4wXT1tJjYzfDEyODtsPWwrNHwwO2JyZWFrfX1lbHNle2lmKChqLWx8MCk8MSl7Zj0xO2JyZWFrIGF9YVtsPj4wXT1tO2w9bCsxfDB9fXdoaWxlKDApO2I9Yis0fDA7aWYoIShiPj4+MDxmPj4+MCkpe2Y9MDticmVha319fWVsc2V7Zj0wO2I9ZTtsPWh9fXdoaWxlKDApO2NbZz4+Ml09ZSsoYi1lPj4yPDwyKTtjW2s+PjJdPWgrKGwtaCk7aT1kO3JldHVybiBmfDB9ZnVuY3Rpb24gWGwoYixlLGYsZyxoLGosayxsKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2U9aTthOmRve2lmKGY+Pj4wPGc+Pj4wKXtvPWc7bj1mO2I9ajt3aGlsZSgxKXtpZighKGI+Pj4wPGs+Pj4wKSl7bT0zMDticmVhayBhfXE9YVtuPj4wXXwwO3A9cSYyNTU7ZG97aWYocTw8MjQ+PjI0Pi0xKXtjW2I+PjJdPXA7bj1uKzF8MH1lbHNle2lmKChxJjI1NSk8MTk0KXtnPTI7YnJlYWsgYX1pZigocSYyNTUpPDIyNCl7aWYoKG8tbnwwKTwyKXtnPTE7YnJlYWsgYX1xPWRbbisxPj4wXXwwO2lmKChxJjE5MnwwKSE9MTI4KXtnPTI7YnJlYWsgYX1jW2I+PjJdPXEmNjN8cDw8NiYxOTg0O249bisyfDA7YnJlYWt9aWYoKHEmMjU1KTwyNDApe2lmKChvLW58MCk8Myl7Zz0xO2JyZWFrIGF9cT1hW24rMT4+MF18MDtyPWFbbisyPj4wXXwwO2lmKChwfDApPT0yMjQpe2lmKCEoKHEmLTMyKTw8MjQ+PjI0PT0tOTYpKXtnPTI7YnJlYWsgYX19ZWxzZSBpZigocHwwKT09MjM3KXtpZighKChxJi0zMik8PDI0Pj4yND09LTEyOCkpe2c9MjticmVhayBhfX1lbHNle2lmKCEoKHEmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7Zz0yO2JyZWFrIGF9fXI9ciYyNTU7aWYoKHImMTkyfDApIT0xMjgpe2c9MjticmVhayBhfWNbYj4+Ml09KHEmMjU1KTw8NiY0MDMyfHA8PDEyJjYxNDQwfHImNjM7bj1uKzN8MDticmVha31pZighKChxJjI1NSk8MjQ1KSl7Zz0yO2JyZWFrIGF9aWYoKG8tbnwwKTw0KXtnPTE7YnJlYWsgYX1xPWFbbisxPj4wXXwwO3I9YVtuKzI+PjBdfDA7cz1hW24rMz4+MF18MDtpZigocHwwKT09MjQ0KXtpZighKChxJi0xNik8PDI0Pj4yND09LTEyOCkpe2c9MjticmVhayBhfX1lbHNlIGlmKChwfDApPT0yNDApe2lmKCEoKHErMTEyPDwyND4+MjQmMjU1KTw0OCkpe2c9MjticmVhayBhfX1lbHNle2lmKCEoKHEmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7Zz0yO2JyZWFrIGF9fXI9ciYyNTU7aWYoKHImMTkyfDApIT0xMjgpe2c9MjticmVhayBhfXM9cyYyNTU7aWYoKHMmMTkyfDApIT0xMjgpe2c9MjticmVhayBhfXA9KHEmMjU1KTw8MTImMjU4MDQ4fHA8PDE4JjE4MzUwMDh8cjw8NiY0MDMyfHMmNjM7aWYocD4+PjA+MTExNDExMSl7Zz0yO2JyZWFrIGF9Y1tiPj4yXT1wO249bis0fDB9fXdoaWxlKDApO2I9Yis0fDA7aWYoIShuPj4+MDxnPj4+MCkpe209MzA7YnJlYWt9fX1lbHNle249ZjtiPWo7bT0zMH19d2hpbGUoMCk7aWYoKG18MCk9PTMwKXtnPW4+Pj4wPGc+Pj4wJjF9Y1toPj4yXT1mKyhuLWYpO2NbbD4+Ml09aisoYi1qPj4yPDwyKTtpPWU7cmV0dXJuIGd8MH1mdW5jdGlvbiBZbChhLGIsZCxlLGYpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2NbZj4+Ml09ZDtyZXR1cm4gM31mdW5jdGlvbiBabChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBfbChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiAkbChiLGMsZCxlLGYpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Yz1pO2E6ZG97aWYoZD4+PjA8ZT4+PjAmKGZ8MCkhPTApe2c9ZTtqPWQ7Yj0xO2I6d2hpbGUoMSl7az1hW2o+PjBdfDA7aD1rJjI1NTtkb3tpZihrPDwyND4+MjQ+LTEpe2o9aisxfDB9ZWxzZXtpZigoayYyNTUpPDE5NCl7YnJlYWsgYX1pZigoayYyNTUpPDIyNCl7aWYoKGctanwwKTwyKXticmVhayBhfWlmKCEoKGFbaisxPj4wXSYtNjQpPDwyND4+MjQ9PS0xMjgpKXticmVhayBhfWo9aisyfDA7YnJlYWt9aWYoKGsmMjU1KTwyNDApe2s9ajtpZigoZy1rfDApPDMpe2JyZWFrIGF9bT1hW2orMT4+MF18MDtsPWFbaisyPj4wXXwwO2lmKChofDApPT0yMjQpe2lmKCEoKG0mLTMyKTw8MjQ+PjI0PT0tOTYpKXtlPTE0O2JyZWFrIGJ9fWVsc2UgaWYoKGh8MCk9PTIzNyl7aWYoISgobSYtMzIpPDwyND4+MjQ9PS0xMjgpKXtlPTE2O2JyZWFrIGJ9fWVsc2V7aWYoISgobSYtNjQpPDwyND4+MjQ9PS0xMjgpKXtlPTE4O2JyZWFrIGJ9fWlmKCEoKGwmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7YnJlYWsgYX1qPWorM3wwO2JyZWFrfWlmKCEoKGsmMjU1KTwyNDUpKXticmVhayBhfWs9ajtpZigoZy1rfDApPDQpe2JyZWFrIGF9bT1hW2orMT4+MF18MDtuPWFbaisyPj4wXXwwO2w9YVtqKzM+PjBdfDA7aWYoKGh8MCk9PTI0MCl7aWYoISgobSsxMTI8PDI0Pj4yNCYyNTUpPDQ4KSl7ZT0yNTticmVhayBifX1lbHNlIGlmKChofDApPT0yNDQpe2lmKCEoKG0mLTE2KTw8MjQ+PjI0PT0tMTI4KSl7ZT0yNzticmVhayBifX1lbHNle2lmKCEoKG0mLTY0KTw8MjQ+PjI0PT0tMTI4KSl7ZT0yOTticmVhayBifX1pZighKChuJi02NCk8PDI0Pj4yND09LTEyOCkpe2JyZWFrIGF9aWYoISgobCYtNjQpPDwyND4+MjQ9PS0xMjgpKXticmVhayBhfWlmKCgobSYyNTUpPDwxMiYxOTY2MDh8aDw8MTgmMTgzNTAwOCk+Pj4wPjExMTQxMTEpe2JyZWFrIGF9aj1qKzR8MH19d2hpbGUoMCk7aWYoIShqPj4+MDxlPj4+MCZiPj4+MDxmPj4+MCkpe2JyZWFrIGF9Yj1iKzF8MH1pZigoZXwwKT09MTQpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09MTYpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09MTgpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09MjUpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09Mjcpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09Mjkpe249ay1kfDA7aT1jO3JldHVybiBufDB9fWVsc2V7aj1kfX13aGlsZSgwKTtuPWotZHwwO2k9YztyZXR1cm4gbnwwfWZ1bmN0aW9uIGFtKGEpe2E9YXwwO3JldHVybiA0fWZ1bmN0aW9uIGJtKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIGNtKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIGRtKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNjI0O2lmKCEoKGFbYisxMj4+MF0mMSk9PTApKXtlPWNbYisyMD4+Ml18MDtpZigoZXwwKSE9MCl7dm4oZSl9aWYoKGJ8MCk9PTApe2k9ZDtyZXR1cm59fXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2NbYj4+Ml09MTM2MjQ7aWYoISgoYVtiKzEyPj4wXSYxKT09MCk/KGU9Y1tiKzIwPj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pPWQ7cmV0dXJufWZ1bmN0aW9uIGZtKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNjY0O2lmKCEoKGFbYisxNj4+MF0mMSk9PTApKXtlPWNbYisyND4+Ml18MDtpZigoZXwwKSE9MCl7dm4oZSl9aWYoKGJ8MCk9PTApe2k9ZDtyZXR1cm59fXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZ20oYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2NbYj4+Ml09MTM2NjQ7aWYoISgoYVtiKzE2Pj4wXSYxKT09MCk/KGU9Y1tiKzI0Pj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pPWQ7cmV0dXJufWZ1bmN0aW9uIGhtKGIpe2I9YnwwO3JldHVybiBhW2IrOD4+MF18MH1mdW5jdGlvbiBpbShhKXthPWF8MDtyZXR1cm4gY1thKzg+PjJdfDB9ZnVuY3Rpb24gam0oYil7Yj1ifDA7cmV0dXJuIGFbYis5Pj4wXXwwfWZ1bmN0aW9uIGttKGEpe2E9YXwwO3JldHVybiBjW2ErMTI+PjJdfDB9ZnVuY3Rpb24gbG0oYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTA7ZT1pO2c9ZCsxMnwwO2lmKChhW2c+PjBdJjEpPT0wKXtjW2IrMD4+Ml09Y1tnKzA+PjJdO2NbYis0Pj4yXT1jW2crND4+Ml07Y1tiKzg+PjJdPWNbZys4Pj4yXTtpPWU7cmV0dXJufWc9Y1tkKzIwPj4yXXwwO2Q9Y1tkKzE2Pj4yXXwwO2lmKGQ+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9ZG97aWYoZD4+PjA8MTEpe2FbYj4+MF09ZDw8MTtrPWIrMXwwfWVsc2V7aD1kKzE2Ji0xNjtqPShofDApPT0wPzE6aDt3aGlsZSgxKXtrPXVuKGopfDA7aWYoKGt8MCkhPTApe2Y9MTM7YnJlYWt9az1jWzU2NjZdfDA7Y1s1NjY2XT1rKzA7aWYoKGt8MCk9PTApe2JyZWFrfXNjW2smMzFdKCl9aWYoKGZ8MCk9PTEzKXtjW2IrOD4+Ml09aztjW2I+PjJdPWh8MTtjW2IrND4+Ml09ZDticmVha31rPVhhKDQpfDA7Y1trPj4yXT0yMjY4MDt3YihrfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7TG4oa3wwLGd8MCxkfDApfDA7YVtrK2Q+PjBdPTA7aT1lO3JldHVybn1mdW5jdGlvbiBtbShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MDtlPWk7Zz1kKzE2fDA7aWYoKGFbZz4+MF0mMSk9PTApe2NbYiswPj4yXT1jW2crMD4+Ml07Y1tiKzQ+PjJdPWNbZys0Pj4yXTtjW2IrOD4+Ml09Y1tnKzg+PjJdO2k9ZTtyZXR1cm59Zz1jW2QrMjQ+PjJdfDA7ZD1jW2QrMjA+PjJdfDA7aWYoZD4+PjA+NDI5NDk2NzI3OSl7ZGcoKX1kb3tpZihkPj4+MDwxMSl7YVtiPj4wXT1kPDwxO2s9YisxfDB9ZWxzZXtoPWQrMTYmLTE2O2o9KGh8MCk9PTA/MTpoO3doaWxlKDEpe2s9dW4oail8MDtpZigoa3wwKSE9MCl7Zj0xMzticmVha31rPWNbNTY2Nl18MDtjWzU2NjZdPWsrMDtpZigoa3wwKT09MCl7YnJlYWt9c2NbayYzMV0oKX1pZigoZnwwKT09MTMpe2NbYis4Pj4yXT1rO2NbYj4+Ml09aHwxO2NbYis0Pj4yXT1kO2JyZWFrfWs9WGEoNCl8MDtjW2s+PjJdPTIyNjgwO3diKGt8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtMbihrfDAsZ3wwLGR8MCl8MDthW2srZD4+MF09MDtpPWU7cmV0dXJufWZ1bmN0aW9uIG5tKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT04O2M9YisxfDA7YVtjPj4wXT0xNzAyMTk1ODI4O2FbYysxPj4wXT02NjQ5MjAyO2FbYysyPj4wXT0yNTk3MzthW2MrMz4+MF09MTAxO2FbYis1Pj4wXT0wO3JldHVybn1mdW5jdGlvbiBvbShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2Q9aTtlPTEzNjk2O3doaWxlKDEpe2lmKChjW2U+PjJdfDApPT0wKXticmVha31lbHNle2U9ZSs0fDB9fWc9ZS0xMzY5NnwwO2U9Zz4+MjtpZihlPj4+MD4xMDczNzQxODA3KXtkZygpfWRve2lmKGU+Pj4wPDIpe2FbYj4+MF09Zz4+PjE7aj1iKzR8MH1lbHNle2c9ZSs0Ji00O2g9Zzw8MjtoPShofDApPT0wPzE6aDt3aGlsZSgxKXtqPXVuKGgpfDA7aWYoKGp8MCkhPTApe2Y9MTM7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2JyZWFrfXNjW2omMzFdKCl9aWYoKGZ8MCk9PTEzKXtjW2IrOD4+Ml09ajtjW2I+PjJdPWd8MTtjW2IrND4+Ml09ZTticmVha31qPVhhKDQpfDA7Y1tqPj4yXT0yMjY4MDt3YihqfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGV8MCk9PTApe2o9aisoZTw8Mil8MDtjW2o+PjJdPTA7aT1kO3JldHVybn1lbHNle2Y9ZTtnPTEzNjk2O2I9an13aGlsZSgxKXtmPWYrIC0xfDA7Y1tiPj4yXT1jW2c+PjJdO2lmKChmfDApPT0wKXticmVha31lbHNle2c9Zys0fDA7Yj1iKzR8MH19aj1qKyhlPDwyKXwwO2Nbaj4+Ml09MDtpPWQ7cmV0dXJufWZ1bmN0aW9uIHBtKGIsYyl7Yj1ifDA7Yz1jfDA7dmFyIGQ9MDtjPWk7YVtiPj4wXT0xMDtkPWIrMXwwO2FbZCswPj4wXT1hWzEzNzIwPj4wXXwwO2FbZCsxPj4wXT1hWzEzNzIxPj4wXXwwO2FbZCsyPj4wXT1hWzEzNzIyPj4wXXwwO2FbZCszPj4wXT1hWzEzNzIzPj4wXXwwO2FbZCs0Pj4wXT1hWzEzNzI0Pj4wXXwwO2FbYis2Pj4wXT0wO2k9YztyZXR1cm59ZnVuY3Rpb24gcW0oYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MDtkPWk7ZT0xMzcyODt3aGlsZSgxKXtpZigoY1tlPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtlPWUrNHwwfX1nPWUtMTM3Mjh8MDtlPWc+PjI7aWYoZT4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihlPj4+MDwyKXthW2I+PjBdPWc+Pj4xO2o9Yis0fDB9ZWxzZXtnPWUrNCYtNDtoPWc8PDI7aD0oaHwwKT09MD8xOmg7d2hpbGUoMSl7aj11bihoKXwwO2lmKChqfDApIT0wKXtmPTEzO2JyZWFrfWo9Y1s1NjY2XXwwO2NbNTY2Nl09aiswO2lmKChqfDApPT0wKXticmVha31zY1tqJjMxXSgpfWlmKChmfDApPT0xMyl7Y1tiKzg+PjJdPWo7Y1tiPj4yXT1nfDE7Y1tiKzQ+PjJdPWU7YnJlYWt9aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKChlfDApPT0wKXtqPWorKGU8PDIpfDA7Y1tqPj4yXT0wO2k9ZDtyZXR1cm59ZWxzZXtmPWU7Zz0xMzcyODtiPWp9d2hpbGUoMSl7Zj1mKyAtMXwwO2NbYj4+Ml09Y1tnPj4yXTtpZigoZnwwKT09MCl7YnJlYWt9ZWxzZXtnPWcrNHwwO2I9Yis0fDB9fWo9aisoZTw8Mil8MDtjW2o+PjJdPTA7aT1kO3JldHVybn1mdW5jdGlvbiBybShiKXtiPWJ8MDt2YXIgZD0wO2I9aTtpZigoYVsxMzc2MF18MCkhPTApe2Q9Y1szNDM4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChRYSgxMzc2MCl8MCk9PTApe2Q9Y1szNDM4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChhWzIwOTI4XXwwKT09MD8oUWEoMjA5MjgpfDApIT0wOjApe05uKDIwNzYwLDAsMTY4KXwwO2NjKDIxNSwwLHB8MCl8MDskYSgyMDkyOCl9Z2coMjA3NjAsMjA5MzYpO2dnKDIwNzcyfDAsMjA5NDQpO2dnKDIwNzg0fDAsMjA5NTIpO2dnKDIwNzk2fDAsMjA5NjApO2dnKDIwODA4fDAsMjA5NzYpO2dnKDIwODIwfDAsMjA5OTIpO2dnKDIwODMyfDAsMjFlMyk7Z2coMjA4NDR8MCwyMTAxNik7Z2coMjA4NTZ8MCwyMTAyNCk7Z2coMjA4Njh8MCwyMTAzMik7Z2coMjA4ODB8MCwyMTA0MCk7Z2coMjA4OTJ8MCwyMTA0OCk7Z2coMjA5MDR8MCwyMTA1Nik7Z2coMjA5MTZ8MCwyMTA2NCk7Y1szNDM4XT0yMDc2MDskYSgxMzc2MCk7ZD1jWzM0MzhdfDA7aT1iO3JldHVybiBkfDB9ZnVuY3Rpb24gc20oYil7Yj1ifDA7dmFyIGQ9MDtiPWk7aWYoKGFbMTM3NzZdfDApIT0wKXtkPWNbMzQ0Ml18MDtpPWI7cmV0dXJuIGR8MH1pZigoUWEoMTM3NzYpfDApPT0wKXtkPWNbMzQ0Ml18MDtpPWI7cmV0dXJuIGR8MH1pZigoYVsyMDM5Ml18MCk9PTA/KFFhKDIwMzkyKXwwKSE9MDowKXtObigyMDIyNCwwLDE2OCl8MDtjYygyMTYsMCxwfDApfDA7JGEoMjAzOTIpfW5nKDIwMjI0LDIwNDAwKTtuZygyMDIzNnwwLDIwNDMyKTtuZygyMDI0OHwwLDIwNDY0KTtuZygyMDI2MHwwLDIwNDk2KTtuZygyMDI3MnwwLDIwNTM2KTtuZygyMDI4NHwwLDIwNTc2KTtuZygyMDI5NnwwLDIwNjA4KTtuZygyMDMwOHwwLDIwNjQ4KTtuZygyMDMyMHwwLDIwNjY0KTtuZygyMDMzMnwwLDIwNjgwKTtuZygyMDM0NHwwLDIwNjk2KTtuZygyMDM1NnwwLDIwNzEyKTtuZygyMDM2OHwwLDIwNzI4KTtuZygyMDM4MHwwLDIwNzQ0KTtjWzM0NDJdPTIwMjI0OyRhKDEzNzc2KTtkPWNbMzQ0Ml18MDtpPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB0bShiKXtiPWJ8MDt2YXIgZD0wO2I9aTtpZigoYVsxMzc5Ml18MCkhPTApe2Q9Y1szNDQ2XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChRYSgxMzc5Mil8MCk9PTApe2Q9Y1szNDQ2XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChhWzJlNF18MCk9PTA/KFFhKDJlNCl8MCkhPTA6MCl7Tm4oMTk3MTIsMCwyODgpfDA7Y2MoMjE3LDAscHwwKXwwOyRhKDJlNCl9Z2coMTk3MTIsMjAwMDgpO2dnKDE5NzI0fDAsMjAwMTYpO2dnKDE5NzM2fDAsMjAwMzIpO2dnKDE5NzQ4fDAsMjAwNDApO2dnKDE5NzYwfDAsMjAwNDgpO2dnKDE5NzcyfDAsMjAwNTYpO2dnKDE5Nzg0fDAsMjAwNjQpO2dnKDE5Nzk2fDAsMjAwNzIpO2dnKDE5ODA4fDAsMjAwODApO2dnKDE5ODIwfDAsMjAwOTYpO2dnKDE5ODMyfDAsMjAxMDQpO2dnKDE5ODQ0fDAsMjAxMjApO2dnKDE5ODU2fDAsMjAxMzYpO2dnKDE5ODY4fDAsMjAxNDQpO2dnKDE5ODgwfDAsMjAxNTIpO2dnKDE5ODkyfDAsMjAxNjApO2dnKDE5OTA0fDAsMjAwNDgpO2dnKDE5OTE2fDAsMjAxNjgpO2dnKDE5OTI4fDAsMjAxNzYpO2dnKDE5OTQwfDAsMjAxODQpO2dnKDE5OTUyfDAsMjAxOTIpO2dnKDE5OTY0fDAsMjAyMDApO2dnKDE5OTc2fDAsMjAyMDgpO2dnKDE5OTg4fDAsMjAyMTYpO2NbMzQ0Nl09MTk3MTI7JGEoMTM3OTIpO2Q9Y1szNDQ2XXwwO2k9YjtyZXR1cm4gZHwwfWZ1bmN0aW9uIHVtKGIpe2I9YnwwO3ZhciBkPTA7Yj1pO2lmKChhWzEzODA4XXwwKSE9MCl7ZD1jWzM0NTBdfDA7aT1iO3JldHVybiBkfDB9aWYoKFFhKDEzODA4KXwwKT09MCl7ZD1jWzM0NTBdfDA7aT1iO3JldHVybiBkfDB9aWYoKGFbMTkxNjBdfDApPT0wPyhRYSgxOTE2MCl8MCkhPTA6MCl7Tm4oMTg4NzIsMCwyODgpfDA7Y2MoMjE4LDAscHwwKXwwOyRhKDE5MTYwKX1uZygxODg3MiwxOTE2OCk7bmcoMTg4ODR8MCwxOTIwMCk7bmcoMTg4OTZ8MCwxOTI0MCk7bmcoMTg5MDh8MCwxOTI2NCk7bmcoMTg5MjB8MCwxOTU4NCk7bmcoMTg5MzJ8MCwxOTI4OCk7bmcoMTg5NDR8MCwxOTMxMik7bmcoMTg5NTZ8MCwxOTMzNik7bmcoMTg5Njh8MCwxOTM2OCk7bmcoMTg5ODB8MCwxOTQwOCk7bmcoMTg5OTJ8MCwxOTQ0MCk7bmcoMTkwMDR8MCwxOTQ4MCk7bmcoMTkwMTZ8MCwxOTUyMCk7bmcoMTkwMjh8MCwxOTUzNik7bmcoMTkwNDB8MCwxOTU1Mik7bmcoMTkwNTJ8MCwxOTU2OCk7bmcoMTkwNjR8MCwxOTU4NCk7bmcoMTkwNzZ8MCwxOTYwMCk7bmcoMTkwODh8MCwxOTYxNik7bmcoMTkxMDB8MCwxOTYzMik7bmcoMTkxMTJ8MCwxOTY0OCk7bmcoMTkxMjR8MCwxOTY2NCk7bmcoMTkxMzZ8MCwxOTY4MCk7bmcoMTkxNDh8MCwxOTY5Nik7Y1szNDUwXT0xODg3MjskYSgxMzgwOCk7ZD1jWzM0NTBdfDA7aT1iO3JldHVybiBkfDB9ZnVuY3Rpb24gdm0oYil7Yj1ifDA7dmFyIGQ9MDtiPWk7aWYoKGFbMTM4MjRdfDApIT0wKXtkPWNbMzQ1NF18MDtpPWI7cmV0dXJuIGR8MH1pZigoUWEoMTM4MjQpfDApPT0wKXtkPWNbMzQ1NF18MDtpPWI7cmV0dXJuIGR8MH1pZigoYVsxODg0OF18MCk9PTA/KFFhKDE4ODQ4KXwwKSE9MDowKXtObigxODU2MCwwLDI4OCl8MDtjYygyMTksMCxwfDApfDA7JGEoMTg4NDgpfWdnKDE4NTYwLDE4ODU2KTtnZygxODU3MnwwLDE4ODY0KTtjWzM0NTRdPTE4NTYwOyRhKDEzODI0KTtkPWNbMzQ1NF18MDtpPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB3bShiKXtiPWJ8MDt2YXIgZD0wO2I9aTtpZigoYVsxMzg0MF18MCkhPTApe2Q9Y1szNDU4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChRYSgxMzg0MCl8MCk9PTApe2Q9Y1szNDU4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChhWzE4NTIwXXwwKT09MD8oUWEoMTg1MjApfDApIT0wOjApe05uKDE4MjMyLDAsMjg4KXwwO2NjKDIyMCwwLHB8MCl8MDskYSgxODUyMCl9bmcoMTgyMzIsMTg1MjgpO25nKDE4MjQ0fDAsMTg1NDQpO2NbMzQ1OF09MTgyMzI7JGEoMTM4NDApO2Q9Y1szNDU4XXwwO2k9YjtyZXR1cm4gZHwwfWZ1bmN0aW9uIHhtKGIpe2I9YnwwO3ZhciBjPTAsZD0wO2I9aTtpZigoYVsxMzg2NF18MCkhPTApe2k9YjtyZXR1cm4gMTM4NDh9aWYoKFFhKDEzODY0KXwwKT09MCl7aT1iO3JldHVybiAxMzg0OH1hWzEzODQ4XT0xNjtjPTEzODQ5fDA7ZD1jO2FbZD4+MF09NjIzODY1MTI1O2FbZCsxPj4wXT0yNDM2OTczO2FbZCsyPj4wXT05NTE5O2FbZCszPj4wXT0zNztjPWMrNHwwO2FbYz4+MF09MjAzMjQ4MDEwMDthW2MrMT4+MF09NzkzOTM3NTthW2MrMj4+MF09MzEwMTM7YVtjKzM+PjBdPTEyMTthWzEzODU3Pj4wXT0wO2NjKDIyMSwxMzg0OCxwfDApfDA7JGEoMTM4NjQpO2k9YjtyZXR1cm4gMTM4NDh9ZnVuY3Rpb24geW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzEzODg4XXwwKSE9MCl7aT1iO3JldHVybiAxMzg3Mn1pZigoUWEoMTM4ODgpfDApPT0wKXtpPWI7cmV0dXJuIDEzODcyfWVsc2V7ZD0xMzg5Nn13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTM4OTZ8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzEzODcyXT1mPj4+MTtlPTEzODc2fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxMzg4MD4+Ml09aDtjWzM0NjhdPWZ8MTtjWzEzODc2Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTEzODk2O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDEzODcyLHB8MCl8MDskYSgxMzg4OCk7aT1iO3JldHVybiAxMzg3Mn1mdW5jdGlvbiB6bShiKXtiPWJ8MDt2YXIgYz0wLGQ9MDtiPWk7aWYoKGFbMTM5NTJdfDApIT0wKXtpPWI7cmV0dXJuIDEzOTM2fWlmKChRYSgxMzk1Mil8MCk9PTApe2k9YjtyZXR1cm4gMTM5MzZ9YVsxMzkzNl09MTY7Yz0xMzkzN3wwO2Q9YzthW2Q+PjBdPTYyNDU3NjU0OTthW2QrMT4+MF09MjQzOTc1MjthW2QrMj4+MF09OTUzMDthW2QrMz4+MF09Mzc7Yz1jKzR8MDthW2M+PjBdPTEzOTQ5NDg2ODU7YVtjKzE+PjBdPTU0NDkwMTg7YVtjKzI+PjBdPTIxMjg1O2FbYyszPj4wXT04MzthWzEzOTQ1Pj4wXT0wO2NjKDIyMSwxMzkzNixwfDApfDA7JGEoMTM5NTIpO2k9YjtyZXR1cm4gMTM5MzZ9ZnVuY3Rpb24gQW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzEzOTc2XXwwKSE9MCl7aT1iO3JldHVybiAxMzk2MH1pZigoUWEoMTM5NzYpfDApPT0wKXtpPWI7cmV0dXJuIDEzOTYwfWVsc2V7ZD0xMzk4NH13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTM5ODR8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzEzOTYwXT1mPj4+MTtlPTEzOTY0fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxMzk2OD4+Ml09aDtjWzM0OTBdPWZ8MTtjWzEzOTY0Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTEzOTg0O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDEzOTYwLHB8MCl8MDskYSgxMzk3Nik7aT1iO3JldHVybiAxMzk2MH1mdW5jdGlvbiBCbShiKXtiPWJ8MDtiPWk7aWYoKGFbMTQwNDBdfDApPT0wPyhRYSgxNDA0MCl8MCkhPTA6MCl7ZWcoMTQwMjQsMTQwNDgsMjApO2NjKDIyMSwxNDAyNCxwfDApfDA7JGEoMTQwNDApfWk9YjtyZXR1cm4gMTQwMjR9ZnVuY3Rpb24gQ20oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzE0MDg4XXwwKSE9MCl7aT1iO3JldHVybiAxNDA3Mn1pZigoUWEoMTQwODgpfDApPT0wKXtpPWI7cmV0dXJuIDE0MDcyfWVsc2V7ZD0xNDA5Nn13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTQwOTZ8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzE0MDcyXT1mPj4+MTtlPTE0MDc2fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxNDA4MD4+Ml09aDtjWzM1MThdPWZ8MTtjWzE0MDc2Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTE0MDk2O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDE0MDcyLHB8MCl8MDskYSgxNDA4OCk7aT1iO3JldHVybiAxNDA3Mn1mdW5jdGlvbiBEbShiKXtiPWJ8MDtiPWk7aWYoKGFbMTQyMDBdfDApPT0wPyhRYSgxNDIwMCl8MCkhPTA6MCl7ZWcoMTQxODQsMTQyMDgsMTEpO2NjKDIyMSwxNDE4NCxwfDApfDA7JGEoMTQyMDApfWk9YjtyZXR1cm4gMTQxODR9ZnVuY3Rpb24gRW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzE0MjQwXXwwKSE9MCl7aT1iO3JldHVybiAxNDIyNH1pZigoUWEoMTQyNDApfDApPT0wKXtpPWI7cmV0dXJuIDE0MjI0fWVsc2V7ZD0xNDI0OH13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTQyNDh8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzE0MjI0XT1mPj4+MTtlPTE0MjI4fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxNDIzMj4+Ml09aDtjWzM1NTZdPWZ8MTtjWzE0MjI4Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTE0MjQ4O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDE0MjI0LHB8MCl8MDskYSgxNDI0MCk7aT1iO3JldHVybiAxNDIyNH1mdW5jdGlvbiBGbShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAuMDtmPWk7aT1pKzE2fDA7Zz1mO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O2s9MC4wO2k9ZjtyZXR1cm4ra31qPWJiKCl8MDtoPWNbaj4+Ml18MDtjW2o+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWs9K0ZuKGIsZyk7Yj1jW2o+PjJdfDA7aWYoKGJ8MCk9PTApe2Nbaj4+Ml09aH1pZigoY1tnPj4yXXwwKSE9KGR8MCkpe2NbZT4+Ml09NDtrPTAuMDtpPWY7cmV0dXJuK2t9aWYoKGJ8MCkhPTM0KXtpPWY7cmV0dXJuK2t9Y1tlPj4yXT00O2k9ZjtyZXR1cm4ra31mdW5jdGlvbiBHbShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAuMDtmPWk7aT1pKzE2fDA7Zz1mO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O2s9MC4wO2k9ZjtyZXR1cm4ra31qPWJiKCl8MDtoPWNbaj4+Ml18MDtjW2o+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWs9K0ZuKGIsZyk7Yj1jW2o+PjJdfDA7aWYoKGJ8MCk9PTApe2Nbaj4+Ml09aH1pZigoY1tnPj4yXXwwKSE9KGR8MCkpe2NbZT4+Ml09NDtrPTAuMDtpPWY7cmV0dXJuK2t9aWYoKGJ8MCkhPTM0KXtpPWY7cmV0dXJuK2t9Y1tlPj4yXT00O2k9ZjtyZXR1cm4ra31mdW5jdGlvbiBIbShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAuMDtmPWk7aT1pKzE2fDA7Zz1mO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O2s9MC4wO2k9ZjtyZXR1cm4ra31qPWJiKCl8MDtoPWNbaj4+Ml18MDtjW2o+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWs9K0ZuKGIsZyk7Yj1jW2o+PjJdfDA7aWYoKGJ8MCk9PTApe2Nbaj4+Ml09aH1pZigoY1tnPj4yXXwwKSE9KGR8MCkpe2NbZT4+Ml09NDtrPTAuMDtpPWY7cmV0dXJuK2t9aWYoKGJ8MCk9PTM0KXtjW2U+PjJdPTR9aT1mO3JldHVybitrfWZ1bmN0aW9uIEltKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7aD1pO2k9aSsxMTJ8MDtrPWg7aWYoKGJ8MCk9PShkfDApKXtjW2U+PjJdPTQ7Zj0wO209MDtJPWY7aT1oO3JldHVybiBtfDB9aWYoKGFbYj4+MF18MCk9PTQ1KXtjW2U+PjJdPTQ7Zj0wO209MDtJPWY7aT1oO3JldHVybiBtfDB9Zz1iYigpfDA7aj1jW2c+PjJdfDA7Y1tnPj4yXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1jW2s+PjJdPTA7bD1rKzR8MDtjW2w+PjJdPWI7Y1trKzQ0Pj4yXT1iO2lmKChifDApPDApe2Nbays4Pj4yXT0tMTttPS0xfWVsc2V7bT1iKzIxNDc0ODM2NDd8MDtjW2srOD4+Ml09bX1jW2srNzY+PjJdPS0xO2NbaysxMDQ+PjJdPTA7bj1rKzEwOHwwO2Nbbj4+Ml09bS1iO2NbaysxMDA+PjJdPW07bT1CbihrLGYsLTEsLTEpfDA7Zj1JO2s9YisoKGNbbD4+Ml18MCkrKGNbbj4+Ml18MCktKGNbays4Pj4yXXwwKSl8MDtiPWNbZz4+Ml18MDtpZigoYnwwKT09MCl7Y1tnPj4yXT1qfWlmKChrfDApIT0oZHwwKSl7Y1tlPj4yXT00O209MDtuPTA7ST1tO2k9aDtyZXR1cm4gbnwwfWlmKChifDApIT0zNCl7bj1tO0k9ZjtpPWg7cmV0dXJuIG58MH1jW2U+PjJdPTQ7bT0tMTtuPS0xO0k9bTtpPWg7cmV0dXJuIG58MH1mdW5jdGlvbiBKbShiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2g9aTtpPWkrMTEyfDA7az1oO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O209MDtpPWg7cmV0dXJuIG18MH1pZigoYVtiPj4wXXwwKT09NDUpe2NbZT4+Ml09NDttPTA7aT1oO3JldHVybiBtfDB9Zz1iYigpfDA7aj1jW2c+PjJdfDA7Y1tnPj4yXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1jW2s+PjJdPTA7bD1rKzR8MDtjW2w+PjJdPWI7Y1trKzQ0Pj4yXT1iO2lmKChifDApPDApe2Nbays4Pj4yXT0tMTttPS0xfWVsc2V7bT1iKzIxNDc0ODM2NDd8MDtjW2srOD4+Ml09bX1jW2srNzY+PjJdPS0xO2NbaysxMDQ+PjJdPTA7bj1rKzEwOHwwO2Nbbj4+Ml09bS1iO2NbaysxMDA+PjJdPW07bT1CbihrLGYsLTEsLTEpfDA7Zj1JO2s9YisoKGNbbD4+Ml18MCkrKGNbbj4+Ml18MCktKGNbays4Pj4yXXwwKSl8MDtiPWNbZz4+Ml18MDtpZigoYnwwKT09MCl7Y1tnPj4yXT1qfWlmKChrfDApIT0oZHwwKSl7Y1tlPj4yXT00O249MDtpPWg7cmV0dXJuIG58MH1pZigoYnwwKT09MzR8KGY+Pj4wPjB8KGZ8MCk9PTAmbT4+PjA+NDI5NDk2NzI5NSkpe2NbZT4+Ml09NDtuPS0xO2k9aDtyZXR1cm4gbnwwfWVsc2V7bj1tO2k9aDtyZXR1cm4gbnwwfXJldHVybiAwfWZ1bmN0aW9uIEttKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7aD1pO2k9aSsxMTJ8MDtrPWg7aWYoKGJ8MCk9PShkfDApKXtjW2U+PjJdPTQ7bT0wO2k9aDtyZXR1cm4gbXwwfWlmKChhW2I+PjBdfDApPT00NSl7Y1tlPj4yXT00O209MDtpPWg7cmV0dXJuIG18MH1nPWJiKCl8MDtqPWNbZz4+Ml18MDtjW2c+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWNbaz4+Ml09MDtsPWsrNHwwO2NbbD4+Ml09YjtjW2srNDQ+PjJdPWI7aWYoKGJ8MCk8MCl7Y1trKzg+PjJdPS0xO209LTF9ZWxzZXttPWIrMjE0NzQ4MzY0N3wwO2Nbays4Pj4yXT1tfWNbays3Nj4+Ml09LTE7Y1trKzEwND4+Ml09MDtuPWsrMTA4fDA7Y1tuPj4yXT1tLWI7Y1trKzEwMD4+Ml09bTttPUJuKGssZiwtMSwtMSl8MDtmPUk7az1iKygoY1tsPj4yXXwwKSsoY1tuPj4yXXwwKS0oY1trKzg+PjJdfDApKXwwO2I9Y1tnPj4yXXwwO2lmKChifDApPT0wKXtjW2c+PjJdPWp9aWYoKGt8MCkhPShkfDApKXtjW2U+PjJdPTQ7bj0wO2k9aDtyZXR1cm4gbnwwfWlmKChifDApPT0zNHwoZj4+PjA+MHwoZnwwKT09MCZtPj4+MD40Mjk0OTY3Mjk1KSl7Y1tlPj4yXT00O249LTE7aT1oO3JldHVybiBufDB9ZWxzZXtuPW07aT1oO3JldHVybiBufDB9cmV0dXJuIDB9ZnVuY3Rpb24gTG0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtoPWk7aT1pKzExMnwwO2s9aDtpZigoYnwwKT09KGR8MCkpe2NbZT4+Ml09NDttPTA7aT1oO3JldHVybiBtfDB9aWYoKGFbYj4+MF18MCk9PTQ1KXtjW2U+PjJdPTQ7bT0wO2k9aDtyZXR1cm4gbXwwfWc9YmIoKXwwO2o9Y1tnPj4yXXwwO2NbZz4+Ml09MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9Y1trPj4yXT0wO2w9ays0fDA7Y1tsPj4yXT1iO2Nbays0ND4+Ml09YjtpZigoYnwwKTwwKXtjW2srOD4+Ml09LTE7bT0tMX1lbHNle209YisyMTQ3NDgzNjQ3fDA7Y1trKzg+PjJdPW19Y1trKzc2Pj4yXT0tMTtjW2srMTA0Pj4yXT0wO249aysxMDh8MDtjW24+PjJdPW0tYjtjW2srMTAwPj4yXT1tO209Qm4oayxmLC0xLC0xKXwwO2Y9STtrPWIrKChjW2w+PjJdfDApKyhjW24+PjJdfDApLShjW2srOD4+Ml18MCkpfDA7Yj1jW2c+PjJdfDA7aWYoKGJ8MCk9PTApe2NbZz4+Ml09an1pZigoa3wwKSE9KGR8MCkpe2NbZT4+Ml09NDtuPTA7aT1oO3JldHVybiBufDB9aWYoKGJ8MCk9PTM0fChmPj4+MD4wfChmfDApPT0wJm0+Pj4wPjY1NTM1KSl7Y1tlPj4yXT00O249LTE7aT1oO3JldHVybiBufDB9ZWxzZXtuPW0mNjU1MzU7aT1oO3JldHVybiBufDB9cmV0dXJuIDB9ZnVuY3Rpb24gTW0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtoPWk7aT1pKzExMnwwO2s9aDtpZigoYnwwKT09KGR8MCkpe2NbZT4+Ml09NDtmPTA7bT0wO0k9ZjtpPWg7cmV0dXJuIG18MH1nPWJiKCl8MDtqPWNbZz4+Ml18MDtjW2c+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWNbaz4+Ml09MDtsPWsrNHwwO2NbbD4+Ml09YjtjW2srNDQ+PjJdPWI7aWYoKGJ8MCk8MCl7Y1trKzg+PjJdPS0xO209LTF9ZWxzZXttPWIrMjE0NzQ4MzY0N3wwO2Nbays4Pj4yXT1tfWNbays3Nj4+Ml09LTE7Y1trKzEwND4+Ml09MDtuPWsrMTA4fDA7Y1tuPj4yXT1tLWI7Y1trKzEwMD4+Ml09bTttPUJuKGssZiwwLC0yMTQ3NDgzNjQ4KXwwO2Y9STtrPWIrKChjW2w+PjJdfDApKyhjW24+PjJdfDApLShjW2srOD4+Ml18MCkpfDA7Yj1jW2c+PjJdfDA7aWYoKGJ8MCk9PTApe2NbZz4+Ml09an1pZigoa3wwKSE9KGR8MCkpe2NbZT4+Ml09NDttPTA7bj0wO0k9bTtpPWg7cmV0dXJuIG58MH1pZigoYnwwKT09MzQpe2NbZT4+Ml09NDtuPShmfDApPjB8KGZ8MCk9PTAmbT4+PjA+MDtJPW4/MjE0NzQ4MzY0NzotMjE0NzQ4MzY0ODtpPWg7cmV0dXJuKG4/LTE6MCl8MH1lbHNle249bTtJPWY7aT1oO3JldHVybiBufDB9cmV0dXJuIDB9ZnVuY3Rpb24gTm0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtoPWk7aT1pKzExMnwwO2s9aDtpZigoYnwwKT09KGR8MCkpe2NbZT4+Ml09NDttPTA7aT1oO3JldHVybiBtfDB9Zz1iYigpfDA7aj1jW2c+PjJdfDA7Y1tnPj4yXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1jW2s+PjJdPTA7bD1rKzR8MDtjW2w+PjJdPWI7Y1trKzQ0Pj4yXT1iO2lmKChifDApPDApe2Nbays4Pj4yXT0tMTttPS0xfWVsc2V7bT1iKzIxNDc0ODM2NDd8MDtjW2srOD4+Ml09bX1jW2srNzY+PjJdPS0xO2NbaysxMDQ+PjJdPTA7bj1rKzEwOHwwO2Nbbj4+Ml09bS1iO2NbaysxMDA+PjJdPW07bT1CbihrLGYsMCwtMjE0NzQ4MzY0OCl8MDtmPUk7az1iKygoY1tsPj4yXXwwKSsoY1tuPj4yXXwwKS0oY1trKzg+PjJdfDApKXwwO2I9Y1tnPj4yXXwwO2lmKChifDApPT0wKXtjW2c+PjJdPWp9aWYoKGt8MCkhPShkfDApKXtjW2U+PjJdPTQ7bj0wO2k9aDtyZXR1cm4gbnwwfWRve2lmKChifDApPT0zNCl7Y1tlPj4yXT00O2lmKChmfDApPjB8KGZ8MCk9PTAmbT4+PjA+MCl7bj0yMTQ3NDgzNjQ3O2k9aDtyZXR1cm4gbnwwfX1lbHNle2lmKChmfDApPC0xfChmfDApPT0tMSZtPj4+MDwyMTQ3NDgzNjQ4KXtjW2U+PjJdPTQ7YnJlYWt9aWYoKGZ8MCk+MHwoZnwwKT09MCZtPj4+MD4yMTQ3NDgzNjQ3KXtjW2U+PjJdPTQ7bj0yMTQ3NDgzNjQ3O2k9aDtyZXR1cm4gbnwwfWVsc2V7bj1tO2k9aDtyZXR1cm4gbnwwfX19d2hpbGUoMCk7bj0tMjE0NzQ4MzY0ODtpPWg7cmV0dXJuIG58MH1mdW5jdGlvbiBPbShiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTA7Yj1pO2lmKCEoKGFbMTg1MDg+PjBdJjEpPT0wKT8odj1jWzE4NTE2Pj4yXXwwLCh2fDApIT0wKTowKXt2bih2KX1pZighKChhWzE4NDk2Pj4wXSYxKT09MCk/KHU9Y1sxODUwND4+Ml18MCwodXwwKSE9MCk6MCl7dm4odSl9aWYoISgoYVsxODQ4ND4+MF0mMSk9PTApPyh0PWNbMTg0OTI+PjJdfDAsKHR8MCkhPTApOjApe3ZuKHQpfWlmKCEoKGFbMTg0NzI+PjBdJjEpPT0wKT8ocz1jWzE4NDgwPj4yXXwwLChzfDApIT0wKTowKXt2bihzKX1pZighKChhWzE4NDYwPj4wXSYxKT09MCk/KHI9Y1sxODQ2OD4+Ml18MCwocnwwKSE9MCk6MCl7dm4ocil9aWYoISgoYVsxODQ0OD4+MF0mMSk9PTApPyhkPWNbMTg0NTY+PjJdfDAsKGR8MCkhPTApOjApe3ZuKGQpfWlmKCEoKGFbMTg0MzY+PjBdJjEpPT0wKT8ocD1jWzE4NDQ0Pj4yXXwwLChwfDApIT0wKTowKXt2bihwKX1pZighKChhWzE4NDI0Pj4wXSYxKT09MCk/KG89Y1sxODQzMj4+Ml18MCwob3wwKSE9MCk6MCl7dm4obyl9aWYoISgoYVsxODQxMj4+MF0mMSk9PTApPyhuPWNbMTg0MjA+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKCEoKGFbMTg0MDA+PjBdJjEpPT0wKT8obT1jWzE4NDA4Pj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZighKChhWzE4Mzg4Pj4wXSYxKT09MCk/KGw9Y1sxODM5Nj4+Ml18MCwobHwwKSE9MCk6MCl7dm4obCl9aWYoISgoYVsxODM3Nj4+MF0mMSk9PTApPyhrPWNbMTgzODQ+PjJdfDAsKGt8MCkhPTApOjApe3ZuKGspfWlmKCEoKGFbMTgzNjQ+PjBdJjEpPT0wKT8oaj1jWzE4MzcyPj4yXXwwLChqfDApIT0wKTowKXt2bihqKX1pZighKChhWzE4MzUyPj4wXSYxKT09MCk/KGg9Y1sxODM2MD4+Ml18MCwoaHwwKSE9MCk6MCl7dm4oaCl9aWYoISgoYVsxODM0MD4+MF0mMSk9PTApPyhnPWNbMTgzNDg+PjJdfDAsKGd8MCkhPTApOjApe3ZuKGcpfWlmKCEoKGFbMTgzMjg+PjBdJjEpPT0wKT8oZj1jWzE4MzM2Pj4yXXwwLChmfDApIT0wKTowKXt2bihmKX1pZighKChhWzE4MzE2Pj4wXSYxKT09MCk/KGU9Y1sxODMyND4+Ml18MCwoZXwwKSE9MCk6MCl7dm4oZSl9aWYoISgoYVsxODMwND4+MF0mMSk9PTApPyhxPWNbMTgzMTI+PjJdfDAsKHF8MCkhPTApOjApe3ZuKHEpfWRve2lmKCEoKGFbMTgyOTI+PjBdJjEpPT0wKSl7ZD1jWzE4MzAwPj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODI4MD4+MF0mMSk9PTApKXtkPWNbMTgyODg+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE4MjY4Pj4wXSYxKT09MCkpe2Q9Y1sxODI3Nj4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTgyNTY+PjBdJjEpPT0wKSl7ZD1jWzE4MjY0Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODI0ND4+MF0mMSk9PTApKXtkPWNbMTgyNTI+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtpZigoYVsxODIzMl0mMSk9PTApe2k9YjtyZXR1cm59ZD1jWzE4MjQwPj4yXXwwO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gUG0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wO2I9aTtpZighKChhWzE4ODM2Pj4wXSYxKT09MCk/KHY9Y1sxODg0ND4+Ml18MCwodnwwKSE9MCk6MCl7dm4odil9aWYoISgoYVsxODgyND4+MF0mMSk9PTApPyh1PWNbMTg4MzI+PjJdfDAsKHV8MCkhPTApOjApe3ZuKHUpfWlmKCEoKGFbMTg4MTI+PjBdJjEpPT0wKT8odD1jWzE4ODIwPj4yXXwwLCh0fDApIT0wKTowKXt2bih0KX1pZighKChhWzE4ODAwPj4wXSYxKT09MCk/KHM9Y1sxODgwOD4+Ml18MCwoc3wwKSE9MCk6MCl7dm4ocyl9aWYoISgoYVsxODc4OD4+MF0mMSk9PTApPyhyPWNbMTg3OTY+PjJdfDAsKHJ8MCkhPTApOjApe3ZuKHIpfWlmKCEoKGFbMTg3NzY+PjBdJjEpPT0wKT8oZD1jWzE4Nzg0Pj4yXXwwLChkfDApIT0wKTowKXt2bihkKX1pZighKChhWzE4NzY0Pj4wXSYxKT09MCk/KHA9Y1sxODc3Mj4+Ml18MCwocHwwKSE9MCk6MCl7dm4ocCl9aWYoISgoYVsxODc1Mj4+MF0mMSk9PTApPyhvPWNbMTg3NjA+PjJdfDAsKG98MCkhPTApOjApe3ZuKG8pfWlmKCEoKGFbMTg3NDA+PjBdJjEpPT0wKT8obj1jWzE4NzQ4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhWzE4NzI4Pj4wXSYxKT09MCk/KG09Y1sxODczNj4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoISgoYVsxODcxNj4+MF0mMSk9PTApPyhsPWNbMTg3MjQ+PjJdfDAsKGx8MCkhPTApOjApe3ZuKGwpfWlmKCEoKGFbMTg3MDQ+PjBdJjEpPT0wKT8oaz1jWzE4NzEyPj4yXXwwLChrfDApIT0wKTowKXt2bihrKX1pZighKChhWzE4NjkyPj4wXSYxKT09MCk/KGo9Y1sxODcwMD4+Ml18MCwoanwwKSE9MCk6MCl7dm4oail9aWYoISgoYVsxODY4MD4+MF0mMSk9PTApPyhoPWNbMTg2ODg+PjJdfDAsKGh8MCkhPTApOjApe3ZuKGgpfWlmKCEoKGFbMTg2Njg+PjBdJjEpPT0wKT8oZz1jWzE4Njc2Pj4yXXwwLChnfDApIT0wKTowKXt2bihnKX1pZighKChhWzE4NjU2Pj4wXSYxKT09MCk/KGY9Y1sxODY2ND4+Ml18MCwoZnwwKSE9MCk6MCl7dm4oZil9aWYoISgoYVsxODY0ND4+MF0mMSk9PTApPyhlPWNbMTg2NTI+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWlmKCEoKGFbMTg2MzI+PjBdJjEpPT0wKT8ocT1jWzE4NjQwPj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1kb3tpZighKChhWzE4NjIwPj4wXSYxKT09MCkpe2Q9Y1sxODYyOD4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg2MDg+PjBdJjEpPT0wKSl7ZD1jWzE4NjE2Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODU5Nj4+MF0mMSk9PTApKXtkPWNbMTg2MDQ+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE4NTg0Pj4wXSYxKT09MCkpe2Q9Y1sxODU5Mj4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg1NzI+PjBdJjEpPT0wKSl7ZD1jWzE4NTgwPj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7aWYoKGFbMTg1NjBdJjEpPT0wKXtpPWI7cmV0dXJufWQ9Y1sxODU2OD4+Ml18MDtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFFtKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MDtiPWk7aWYoISgoYVsxOTE0OD4+MF0mMSk9PTApPyh2PWNbMTkxNTY+PjJdfDAsKHZ8MCkhPTApOjApe3ZuKHYpfWlmKCEoKGFbMTkxMzY+PjBdJjEpPT0wKT8odT1jWzE5MTQ0Pj4yXXwwLCh1fDApIT0wKTowKXt2bih1KX1pZighKChhWzE5MTI0Pj4wXSYxKT09MCk/KHQ9Y1sxOTEzMj4+Ml18MCwodHwwKSE9MCk6MCl7dm4odCl9aWYoISgoYVsxOTExMj4+MF0mMSk9PTApPyhzPWNbMTkxMjA+PjJdfDAsKHN8MCkhPTApOjApe3ZuKHMpfWlmKCEoKGFbMTkxMDA+PjBdJjEpPT0wKT8ocj1jWzE5MTA4Pj4yXXwwLChyfDApIT0wKTowKXt2bihyKX1pZighKChhWzE5MDg4Pj4wXSYxKT09MCk/KGQ9Y1sxOTA5Nj4+Ml18MCwoZHwwKSE9MCk6MCl7dm4oZCl9aWYoISgoYVsxOTA3Nj4+MF0mMSk9PTApPyhwPWNbMTkwODQ+PjJdfDAsKHB8MCkhPTApOjApe3ZuKHApfWlmKCEoKGFbMTkwNjQ+PjBdJjEpPT0wKT8obz1jWzE5MDcyPj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhWzE5MDUyPj4wXSYxKT09MCk/KG49Y1sxOTA2MD4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoISgoYVsxOTA0MD4+MF0mMSk9PTApPyhtPWNbMTkwNDg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbMTkwMjg+PjBdJjEpPT0wKT8obD1jWzE5MDM2Pj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZighKChhWzE5MDE2Pj4wXSYxKT09MCk/KGs9Y1sxOTAyND4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9aWYoISgoYVsxOTAwND4+MF0mMSk9PTApPyhqPWNbMTkwMTI+PjJdfDAsKGp8MCkhPTApOjApe3ZuKGopfWlmKCEoKGFbMTg5OTI+PjBdJjEpPT0wKT8oaD1jWzE5ZTM+PjJdfDAsKGh8MCkhPTApOjApe3ZuKGgpfWlmKCEoKGFbMTg5ODA+PjBdJjEpPT0wKT8oZz1jWzE4OTg4Pj4yXXwwLChnfDApIT0wKTowKXt2bihnKX1pZighKChhWzE4OTY4Pj4wXSYxKT09MCk/KGY9Y1sxODk3Nj4+Ml18MCwoZnwwKSE9MCk6MCl7dm4oZil9aWYoISgoYVsxODk1Nj4+MF0mMSk9PTApPyhlPWNbMTg5NjQ+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWlmKCEoKGFbMTg5NDQ+PjBdJjEpPT0wKT8ocT1jWzE4OTUyPj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1kb3tpZighKChhWzE4OTMyPj4wXSYxKT09MCkpe2Q9Y1sxODk0MD4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg5MjA+PjBdJjEpPT0wKSl7ZD1jWzE4OTI4Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODkwOD4+MF0mMSk9PTApKXtkPWNbMTg5MTY+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE4ODk2Pj4wXSYxKT09MCkpe2Q9Y1sxODkwND4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg4ODQ+PjBdJjEpPT0wKSl7ZD1jWzE4ODkyPj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7aWYoKGFbMTg4NzJdJjEpPT0wKXtpPWI7cmV0dXJufWQ9Y1sxODg4MD4+Ml18MDtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFJtKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MDtiPWk7aWYoISgoYVsxOTk4OD4+MF0mMSk9PTApPyh2PWNbMTk5OTY+PjJdfDAsKHZ8MCkhPTApOjApe3ZuKHYpfWlmKCEoKGFbMTk5NzY+PjBdJjEpPT0wKT8odT1jWzE5OTg0Pj4yXXwwLCh1fDApIT0wKTowKXt2bih1KX1pZighKChhWzE5OTY0Pj4wXSYxKT09MCk/KHQ9Y1sxOTk3Mj4+Ml18MCwodHwwKSE9MCk6MCl7dm4odCl9aWYoISgoYVsxOTk1Mj4+MF0mMSk9PTApPyhzPWNbMTk5NjA+PjJdfDAsKHN8MCkhPTApOjApe3ZuKHMpfWlmKCEoKGFbMTk5NDA+PjBdJjEpPT0wKT8ocj1jWzE5OTQ4Pj4yXXwwLChyfDApIT0wKTowKXt2bihyKX1pZighKChhWzE5OTI4Pj4wXSYxKT09MCk/KGQ9Y1sxOTkzNj4+Ml18MCwoZHwwKSE9MCk6MCl7dm4oZCl9aWYoISgoYVsxOTkxNj4+MF0mMSk9PTApPyhwPWNbMTk5MjQ+PjJdfDAsKHB8MCkhPTApOjApe3ZuKHApfWlmKCEoKGFbMTk5MDQ+PjBdJjEpPT0wKT8obz1jWzE5OTEyPj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhWzE5ODkyPj4wXSYxKT09MCk/KG49Y1sxOTkwMD4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoISgoYVsxOTg4MD4+MF0mMSk9PTApPyhtPWNbMTk4ODg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbMTk4Njg+PjBdJjEpPT0wKT8obD1jWzE5ODc2Pj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZighKChhWzE5ODU2Pj4wXSYxKT09MCk/KGs9Y1sxOTg2ND4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9aWYoISgoYVsxOTg0ND4+MF0mMSk9PTApPyhqPWNbMTk4NTI+PjJdfDAsKGp8MCkhPTApOjApe3ZuKGopfWlmKCEoKGFbMTk4MzI+PjBdJjEpPT0wKT8oaD1jWzE5ODQwPj4yXXwwLChofDApIT0wKTowKXt2bihoKX1pZighKChhWzE5ODIwPj4wXSYxKT09MCk/KGc9Y1sxOTgyOD4+Ml18MCwoZ3wwKSE9MCk6MCl7dm4oZyl9aWYoISgoYVsxOTgwOD4+MF0mMSk9PTApPyhmPWNbMTk4MTY+PjJdfDAsKGZ8MCkhPTApOjApe3ZuKGYpfWlmKCEoKGFbMTk3OTY+PjBdJjEpPT0wKT8oZT1jWzE5ODA0Pj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pZighKChhWzE5Nzg0Pj4wXSYxKT09MCk/KHE9Y1sxOTc5Mj4+Ml18MCwocXwwKSE9MCk6MCl7dm4ocSl9ZG97aWYoISgoYVsxOTc3Mj4+MF0mMSk9PTApKXtkPWNbMTk3ODA+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE5NzYwPj4wXSYxKT09MCkpe2Q9Y1sxOTc2OD4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTk3NDg+PjBdJjEpPT0wKSl7ZD1jWzE5NzU2Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxOTczNj4+MF0mMSk9PTApKXtkPWNbMTk3NDQ+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE5NzI0Pj4wXSYxKT09MCkpe2Q9Y1sxOTczMj4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2lmKChhWzE5NzEyXSYxKT09MCl7aT1iO3JldHVybn1kPWNbMTk3MjA+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59dm4oZCk7aT1iO3JldHVybn1mdW5jdGlvbiBTbShiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wO2I9aTtpZighKChhWzIwMzgwPj4wXSYxKT09MCk/KHE9Y1syMDM4OD4+Ml18MCwocXwwKSE9MCk6MCl7dm4ocSl9aWYoISgoYVsyMDM2OD4+MF0mMSk9PTApPyhwPWNbMjAzNzY+PjJdfDAsKHB8MCkhPTApOjApe3ZuKHApfWlmKCEoKGFbMjAzNTY+PjBdJjEpPT0wKT8obz1jWzIwMzY0Pj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhWzIwMzQ0Pj4wXSYxKT09MCk/KG49Y1syMDM1Mj4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoISgoYVsyMDMzMj4+MF0mMSk9PTApPyhtPWNbMjAzNDA+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbMjAzMjA+PjBdJjEpPT0wKT8oZD1jWzIwMzI4Pj4yXXwwLChkfDApIT0wKTowKXt2bihkKX1pZighKChhWzIwMzA4Pj4wXSYxKT09MCk/KGw9Y1syMDMxNj4+Ml18MCwobHwwKSE9MCk6MCl7dm4obCl9aWYoISgoYVsyMDI5Nj4+MF0mMSk9PTApPyhrPWNbMjAzMDQ+PjJdfDAsKGt8MCkhPTApOjApe3ZuKGspfWlmKCEoKGFbMjAyODQ+PjBdJjEpPT0wKT8oaj1jWzIwMjkyPj4yXXwwLChqfDApIT0wKTowKXt2bihqKX1pZighKChhWzIwMjcyPj4wXSYxKT09MCk/KGg9Y1syMDI4MD4+Ml18MCwoaHwwKSE9MCk6MCl7dm4oaCl9aWYoISgoYVsyMDI2MD4+MF0mMSk9PTApPyhnPWNbMjAyNjg+PjJdfDAsKGd8MCkhPTApOjApe3ZuKGcpfWlmKCEoKGFbMjAyNDg+PjBdJjEpPT0wKT8oZj1jWzIwMjU2Pj4yXXwwLChmfDApIT0wKTowKXt2bihmKX1pZighKChhWzIwMjM2Pj4wXSYxKT09MCk/KGU9Y1syMDI0ND4+Ml18MCwoZXwwKSE9MCk6MCl7dm4oZSl9aWYoKGFbMjAyMjRdJjEpPT0wKXtpPWI7cmV0dXJufWQ9Y1syMDIzMj4+Ml18MDtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFRtKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7Yj1pO2lmKCEoKGFbMjA5MTY+PjBdJjEpPT0wKT8ocT1jWzIwOTI0Pj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1pZighKChhWzIwOTA0Pj4wXSYxKT09MCk/KHA9Y1syMDkxMj4+Ml18MCwocHwwKSE9MCk6MCl7dm4ocCl9aWYoISgoYVsyMDg5Mj4+MF0mMSk9PTApPyhvPWNbMjA5MDA+PjJdfDAsKG98MCkhPTApOjApe3ZuKG8pfWlmKCEoKGFbMjA4ODA+PjBdJjEpPT0wKT8obj1jWzIwODg4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhWzIwODY4Pj4wXSYxKT09MCk/KG09Y1syMDg3Nj4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoISgoYVsyMDg1Nj4+MF0mMSk9PTApPyhkPWNbMjA4NjQ+PjJdfDAsKGR8MCkhPTApOjApe3ZuKGQpfWlmKCEoKGFbMjA4NDQ+PjBdJjEpPT0wKT8obD1jWzIwODUyPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZighKChhWzIwODMyPj4wXSYxKT09MCk/KGs9Y1syMDg0MD4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9aWYoISgoYVsyMDgyMD4+MF0mMSk9PTApPyhqPWNbMjA4Mjg+PjJdfDAsKGp8MCkhPTApOjApe3ZuKGopfWlmKCEoKGFbMjA4MDg+PjBdJjEpPT0wKT8oaD1jWzIwODE2Pj4yXXwwLChofDApIT0wKTowKXt2bihoKX1pZighKChhWzIwNzk2Pj4wXSYxKT09MCk/KGc9Y1syMDgwND4+Ml18MCwoZ3wwKSE9MCk6MCl7dm4oZyl9aWYoISgoYVsyMDc4ND4+MF0mMSk9PTApPyhmPWNbMjA3OTI+PjJdfDAsKGZ8MCkhPTApOjApe3ZuKGYpfWlmKCEoKGFbMjA3NzI+PjBdJjEpPT0wKT8oZT1jWzIwNzgwPj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pZigoYVsyMDc2MF0mMSk9PTApe2k9YjtyZXR1cm59ZD1jWzIwNzY4Pj4yXXwwO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gVW0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTA7Zz1pO2k9aSsxNnwwO2g9ZztjW2g+PjJdPWI7Zj0oZnwwKT09MD8yMTI4ODpmO2o9Y1tmPj4yXXwwO2E6ZG97aWYoKGR8MCk9PTApe2lmKChqfDApPT0wKXtrPTA7aT1nO3JldHVybiBrfDB9fWVsc2V7aWYoKGJ8MCk9PTApe2NbaD4+Ml09aH1lbHNle2g9Yn1pZigoZXwwKT09MCl7az0tMjtpPWc7cmV0dXJuIGt8MH1kb3tpZigoanwwKT09MCl7Yj1hW2Q+PjBdfDA7aj1iJjI1NTtpZihiPDwyND4+MjQ+LTEpe2NbaD4+Ml09ajtrPWI8PDI0Pj4yNCE9MCYxO2k9ZztyZXR1cm4ga3wwfWVsc2V7aj1qKyAtMTk0fDA7aWYoaj4+PjA+NTApe2JyZWFrIGF9Yj1lKyAtMXwwO2o9Y1syMTA3Misoajw8Mik+PjJdfDA7ZD1kKzF8MDticmVha319ZWxzZXtiPWV9fXdoaWxlKDApO2I6ZG97aWYoKGJ8MCkhPTApe2s9YVtkPj4wXXwwO2w9KGsmMjU1KT4+PjM7aWYoKGwrIC0xNnxsKyhqPj4yNikpPj4+MD43KXticmVhayBhfXdoaWxlKDEpe2Q9ZCsxfDA7aj0oayYyNTUpKyAtMTI4fGo8PDY7Yj1iKyAtMXwwO2lmKChqfDApPj0wKXticmVha31pZigoYnwwKT09MCl7YnJlYWsgYn1rPWFbZD4+MF18MDtpZigoKGsmMjU1KSsgLTEyOHwwKT4+PjA+NjMpe2JyZWFrIGF9fWNbZj4+Ml09MDtjW2g+PjJdPWo7bD1lLWJ8MDtpPWc7cmV0dXJuIGx8MH19d2hpbGUoMCk7Y1tmPj4yXT1qO2w9LTI7aT1nO3JldHVybiBsfDB9fXdoaWxlKDApO2NbZj4+Ml09MDtjWyhiYigpfDApPj4yXT04NDtsPS0xO2k9ZztyZXR1cm4gbHwwfWZ1bmN0aW9uIFZtKGIsZSxmLGcpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MCxsPTAsbT0wO2g9aTtrPWNbZT4+Ml18MDtpZigoZ3wwKSE9MD8obD1jW2c+PjJdfDAsKGx8MCkhPTApOjApe2lmKChifDApPT0wKXtqPWY7Zz0xNn1lbHNle2NbZz4+Ml09MDtqPWY7Zz0zNX19ZWxzZXtpZigoYnwwKT09MCl7aj1mO2c9N31lbHNle2o9ZjtnPTZ9fWE6d2hpbGUoMSl7aWYoKGd8MCk9PTYpe2lmKChqfDApPT0wKXtnPTUzO2JyZWFrfXdoaWxlKDEpe2c9YVtrPj4wXXwwO2I6ZG97aWYoKChnJjI1NSkrIC0xfDApPj4+MDwxMjc/KGsmM3wwKT09MCZqPj4+MD4zOjApe2Rve2c9Y1trPj4yXXwwO2lmKCgoZysgLTE2ODQzMDA5fGcpJi0yMTM5MDYyMTQ0fDApIT0wKXtnPWcmMjU1O2JyZWFrIGJ9Y1tiPj4yXT1nJjI1NTtjW2IrND4+Ml09ZFtrKzE+PjBdfDA7Y1tiKzg+PjJdPWRbaysyPj4wXXwwO2w9aztrPWsrNHwwO209YjtiPWIrMTZ8MDtjW20rMTI+PjJdPWRbbCszPj4wXXwwO2o9aisgLTR8MH13aGlsZShqPj4+MD4zKTtnPWFbaz4+MF18MH19d2hpbGUoMCk7bD1nJjI1NTtpZighKChsKyAtMXwwKT4+PjA8MTI3KSl7YnJlYWt9Y1tiPj4yXT1sO2o9aisgLTF8MDtpZigoanwwKT09MCl7Zz01MzticmVhayBhfWVsc2V7Yj1iKzR8MDtrPWsrMXwwfX1sPWwrIC0xOTR8MDtpZihsPj4+MD41MCl7bD1nO2c9NDc7YnJlYWt9bD1jWzIxMDcyKyhsPDwyKT4+Ml18MDtrPWsrMXwwO2c9MzU7Y29udGludWV9ZWxzZSBpZigoZ3wwKT09Nyl7bD1hW2s+PjBdfDA7aWYoKChsJjI1NSkrIC0xfDApPj4+MDwxMjc/KGsmM3wwKT09MDowKXtsPWNbaz4+Ml18MDtpZigoKGwrIC0xNjg0MzAwOXxsKSYtMjEzOTA2MjE0NHwwKT09MCl7ZG97az1rKzR8MDtqPWorIC00fDA7bD1jW2s+PjJdfDB9d2hpbGUoKChsKyAtMTY4NDMwMDl8bCkmLTIxMzkwNjIxNDR8MCk9PTApfWc9bCYyNTU7bD1sJjI1NX1lbHNle2c9bH1sPWwmMjU1O2lmKChsKyAtMXwwKT4+PjA8MTI3KXtqPWorIC0xfDA7az1rKzF8MDtnPTc7Y29udGludWV9bD1sKyAtMTk0fDA7aWYobD4+PjA+NTApe2w9ZztnPTQ3O2JyZWFrfWw9Y1syMTA3MisobDw8Mik+PjJdfDA7az1rKzF8MDtnPTE2O2NvbnRpbnVlfWVsc2UgaWYoKGd8MCk9PTE2KXttPShkW2s+PjBdfDApPj4+MztpZigobSsgLTE2fG0rKGw+PjI2KSk+Pj4wPjcpe2c9MTc7YnJlYWt9Zz1rKzF8MDtpZigobCYzMzU1NDQzMnwwKSE9MCl7aWYoKChkW2c+PjBdfDApKyAtMTI4fDApPj4+MD42Myl7Zz0yMDticmVha31nPWsrMnwwO2lmKChsJjUyNDI4OHwwKT09MCl7az1nfWVsc2V7aWYoKChkW2c+PjBdfDApKyAtMTI4fDApPj4+MD42Myl7Zz0yMzticmVha31rPWsrM3wwfX1lbHNle2s9Z31qPWorIC0xfDA7Zz03O2NvbnRpbnVlfWVsc2UgaWYoKGd8MCk9PTM1KXttPWRbaz4+MF18MDtnPW0+Pj4zO2lmKChnKyAtMTZ8ZysobD4+MjYpKT4+PjA+Nyl7Zz0zNjticmVha31nPWsrMXwwO2w9bSsgLTEyOHxsPDw2O2lmKChsfDApPDApe209KGRbZz4+MF18MCkrIC0xMjh8MDtpZihtPj4+MD42Myl7Zz0zOTticmVha31nPWsrMnwwO2w9bXxsPDw2O2lmKChsfDApPDApe2c9KGRbZz4+MF18MCkrIC0xMjh8MDtpZihnPj4+MD42Myl7Zz00MjticmVha31sPWd8bDw8NjtrPWsrM3wwfWVsc2V7az1nfX1lbHNle2s9Z31jW2I+PjJdPWw7Yj1iKzR8MDtqPWorIC0xfDA7Zz02O2NvbnRpbnVlfX1pZigoZ3wwKT09MTcpe2s9aysgLTF8MDtnPTQ1fWVsc2UgaWYoKGd8MCk9PTIwKXtrPWsrIC0xfDA7Zz00NX1lbHNlIGlmKChnfDApPT0yMyl7az1rKyAtMXwwO2c9NDV9ZWxzZSBpZigoZ3wwKT09MzYpe2s9aysgLTF8MDtnPTQ1fWVsc2UgaWYoKGd8MCk9PTM5KXtrPWsrIC0xfDA7Zz00NX1lbHNlIGlmKChnfDApPT00Mil7az1rKyAtMXwwO2c9NDV9ZWxzZSBpZigoZ3wwKT09NTMpe2k9aDtyZXR1cm4gZnwwfWlmKChnfDApPT00NSl7aWYoKGx8MCk9PTApe2w9YVtrPj4wXXwwO2c9NDd9fWlmKChnfDApPT00Nyl7aWYobDw8MjQ+PjI0PT0wKXtpZigoYnwwKSE9MCl7Y1tiPj4yXT0wO2NbZT4+Ml09MH1tPWYtanwwO2k9aDtyZXR1cm4gbXwwfX1jWyhiYigpfDApPj4yXT04NDtpZigoYnwwKT09MCl7bT0tMTtpPWg7cmV0dXJuIG18MH1jW2U+PjJdPWs7bT0tMTtpPWg7cmV0dXJuIG18MH1mdW5jdGlvbiBXbShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTA7ZT1pO2lmKChifDApPT0wKXtiPTE7aT1lO3JldHVybiBifDB9aWYoZD4+PjA8MTI4KXthW2I+PjBdPWQ7Yj0xO2k9ZTtyZXR1cm4gYnwwfWlmKGQ+Pj4wPDIwNDgpe2FbYj4+MF09ZD4+PjZ8MTkyO2FbYisxPj4wXT1kJjYzfDEyODtiPTI7aT1lO3JldHVybiBifDB9aWYoZD4+PjA8NTUyOTZ8KGQrIC01NzM0NHwwKT4+PjA8ODE5Mil7YVtiPj4wXT1kPj4+MTJ8MjI0O2FbYisxPj4wXT1kPj4+NiY2M3wxMjg7YVtiKzI+PjBdPWQmNjN8MTI4O2I9MztpPWU7cmV0dXJuIGJ8MH1pZigoZCsgLTY1NTM2fDApPj4+MDwxMDQ4NTc2KXthW2I+PjBdPWQ+Pj4xOHwyNDA7YVtiKzE+PjBdPWQ+Pj4xMiY2M3wxMjg7YVtiKzI+PjBdPWQ+Pj42JjYzfDEyODthW2IrMz4+MF09ZCY2M3wxMjg7Yj00O2k9ZTtyZXR1cm4gYnwwfWVsc2V7Y1soYmIoKXwwKT4+Ml09ODQ7Yj0tMTtpPWU7cmV0dXJuIGJ8MH1yZXR1cm4gMH1mdW5jdGlvbiBYbShhKXthPWF8MDt2YXIgYj0wO2I9aTtSYihhfDApO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFltKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBabShhKXthPWF8MDtyZXR1cm4gMjEzMjB9ZnVuY3Rpb24gX20oYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uICRtKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBhbihhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gYm4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gY24oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZG4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZW4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZm4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZ24oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybihhfDApPT0oYnwwKXwwfWZ1bmN0aW9uIGhuKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wO2U9aTtpPWkrNjR8MDtmPWU7aWYoKGF8MCk9PShifDApKXtoPTE7aT1lO3JldHVybiBofDB9aWYoKGJ8MCk9PTApe2g9MDtpPWU7cmV0dXJuIGh8MH1iPW5uKGIsMjE0ODgpfDA7aWYoKGJ8MCk9PTApe2g9MDtpPWU7cmV0dXJuIGh8MH1oPWYrMHwwO2c9aCs1NnwwO2Rve2NbaD4+Ml09MDtoPWgrNHwwfXdoaWxlKChofDApPChnfDApKTtjW2Y+PjJdPWI7Y1tmKzg+PjJdPWE7Y1tmKzEyPj4yXT0tMTtjW2YrNDg+PjJdPTE7emNbY1soY1tiPj4yXXwwKSsyOD4+Ml0mMzFdKGIsZixjW2Q+PjJdfDAsMSk7aWYoKGNbZisyND4+Ml18MCkhPTEpe2g9MDtpPWU7cmV0dXJuIGh8MH1jW2Q+PjJdPWNbZisxNj4+Ml07aD0xO2k9ZTtyZXR1cm4gaHwwfWZ1bmN0aW9uIGpuKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wO2c9aTtpZigoY1tkKzg+PjJdfDApIT0oYnwwKSl7aT1nO3JldHVybn1iPWQrMTZ8MDtoPWNbYj4+Ml18MDtpZigoaHwwKT09MCl7Y1tiPj4yXT1lO2NbZCsyND4+Ml09ZjtjW2QrMzY+PjJdPTE7aT1nO3JldHVybn1pZigoaHwwKSE9KGV8MCkpe2g9ZCszNnwwO2NbaD4+Ml09KGNbaD4+Ml18MCkrMTtjW2QrMjQ+PjJdPTI7YVtkKzU0Pj4wXT0xO2k9ZztyZXR1cm59ZT1kKzI0fDA7aWYoKGNbZT4+Ml18MCkhPTIpe2k9ZztyZXR1cm59Y1tlPj4yXT1mO2k9ZztyZXR1cm59ZnVuY3Rpb24ga24oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTA7Zz1pO2lmKChifDApIT0oY1tkKzg+PjJdfDApKXtoPWNbYis4Pj4yXXwwO3pjW2NbKGNbaD4+Ml18MCkrMjg+PjJdJjMxXShoLGQsZSxmKTtpPWc7cmV0dXJufWI9ZCsxNnwwO2g9Y1tiPj4yXXwwO2lmKChofDApPT0wKXtjW2I+PjJdPWU7Y1tkKzI0Pj4yXT1mO2NbZCszNj4+Ml09MTtpPWc7cmV0dXJufWlmKChofDApIT0oZXwwKSl7aD1kKzM2fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2NbZCsyND4+Ml09MjthW2QrNTQ+PjBdPTE7aT1nO3JldHVybn1lPWQrMjR8MDtpZigoY1tlPj4yXXwwKSE9Mil7aT1nO3JldHVybn1jW2U+PjJdPWY7aT1nO3JldHVybn1mdW5jdGlvbiBsbihiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7Zz1pO2lmKChifDApPT0oY1tkKzg+PjJdfDApKXtiPWQrMTZ8MDtoPWNbYj4+Ml18MDtpZigoaHwwKT09MCl7Y1tiPj4yXT1lO2NbZCsyND4+Ml09ZjtjW2QrMzY+PjJdPTE7aT1nO3JldHVybn1pZigoaHwwKSE9KGV8MCkpe2w9ZCszNnwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTtjW2QrMjQ+PjJdPTI7YVtkKzU0Pj4wXT0xO2k9ZztyZXR1cm59ZT1kKzI0fDA7aWYoKGNbZT4+Ml18MCkhPTIpe2k9ZztyZXR1cm59Y1tlPj4yXT1mO2k9ZztyZXR1cm59aj1jW2IrMTI+PjJdfDA7aD1iKyhqPDwzKSsxNnwwO2s9Y1tiKzIwPj4yXXwwO2w9az4+ODtpZigoayYxfDApIT0wKXtsPWNbKGNbZT4+Ml18MCkrbD4+Ml18MH1tPWNbYisxNj4+Ml18MDt6Y1tjWyhjW20+PjJdfDApKzI4Pj4yXSYzMV0obSxkLGUrbHwwLChrJjJ8MCkhPTA/ZjoyKTtpZigoanwwKTw9MSl7aT1nO3JldHVybn1qPWQrNTR8MDtrPWIrMjR8MDt3aGlsZSgxKXtiPWNbays0Pj4yXXwwO2w9Yj4+ODtpZigoYiYxfDApIT0wKXtsPWNbKGNbZT4+Ml18MCkrbD4+Ml18MH1tPWNbaz4+Ml18MDt6Y1tjWyhjW20+PjJdfDApKzI4Pj4yXSYzMV0obSxkLGUrbHwwLChiJjJ8MCkhPTA/ZjoyKTtpZigoYVtqPj4wXXwwKSE9MCl7Zj0xNjticmVha31rPWsrOHwwO2lmKCEoaz4+PjA8aD4+PjApKXtmPTE2O2JyZWFrfX1pZigoZnwwKT09MTYpe2k9ZztyZXR1cm59fWZ1bmN0aW9uIG1uKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTA7ZT1pO2k9aSs2NHwwO2g9ZTtjW2Q+PjJdPWNbY1tkPj4yXT4+Ml07aWYoISgoYXwwKT09KGJ8MCl8KGJ8MCk9PTIxNzkyKSl7aWYoKChifDApIT0wPyhrPW5uKGIsMjE2MDApfDAsKGt8MCkhPTApOjApPyhjW2srOD4+Ml0mfmNbYSs4Pj4yXXwwKT09MDowKXtiPWNbYSsxMj4+Ml18MDtrPWsrMTJ8MDtpZighKChifDApPT0yMTc3Nj8xOihifDApPT0oY1trPj4yXXwwKSkpe2lmKCgoKGJ8MCkhPTA/KGc9bm4oYiwyMTQ4OCl8MCwoZ3wwKSE9MCk6MCk/KGo9Y1trPj4yXXwwLChqfDApIT0wKTowKT8oZj1ubihqLDIxNDg4KXwwLChmfDApIT0wKTowKXtrPWgrMHwwO2o9ays1NnwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChqfDApKTtjW2g+PjJdPWY7Y1toKzg+PjJdPWc7Y1toKzEyPj4yXT0tMTtjW2grNDg+PjJdPTE7emNbY1soY1tmPj4yXXwwKSsyOD4+Ml0mMzFdKGYsaCxjW2Q+PjJdfDAsMSk7aWYoKGNbaCsyND4+Ml18MCk9PTEpe2NbZD4+Ml09Y1toKzE2Pj4yXTtkPTF9ZWxzZXtkPTB9fWVsc2V7ZD0wfX1lbHNle2Q9MX19ZWxzZXtkPTB9fWVsc2V7ZD0xfWk9ZTtyZXR1cm4gZHwwfWZ1bmN0aW9uIG5uKGQsZSl7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wO2Y9aTtpPWkrNjR8MDttPWY7Zz1jW2Q+PjJdfDA7aD1kKyhjW2crIC04Pj4yXXwwKXwwO2c9Y1tnKyAtND4+Ml18MDtjW20+PjJdPWU7Y1ttKzQ+PjJdPWQ7Y1ttKzg+PjJdPTIxNDMyO3A9bSsxMnwwO249bSsxNnwwO289bSsyMHwwO2o9bSsyNHwwO2Q9bSsyOHwwO2s9bSszMnwwO2w9bSs0MHwwO3I9KGd8MCk9PShlfDApO2U9cCswfDA7cT1lKzQwfDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KHF8MCkpO2JbcCs0MD4+MV09MDthW3ArNDI+PjBdPTA7ZG97aWYocil7Y1ttKzQ4Pj4yXT0xO3djW2NbKGNbZz4+Ml18MCkrMjA+PjJdJjYzXShnLG0saCxoLDEsMCk7ZD0oY1tqPj4yXXwwKT09MT9oOjB9ZWxzZXtqY1tjWyhjW2c+PjJdfDApKzI0Pj4yXSYzMV0oZyxtLGgsMSwwKTtnPWNbbSszNj4+Ml18MDtpZigoZ3wwKT09MCl7aWYoKGNbbD4+Ml18MCkhPTEpe2Q9MDticmVha31pZigoY1tkPj4yXXwwKSE9MSl7ZD0wO2JyZWFrfWQ9KGNbaz4+Ml18MCk9PTE/Y1tvPj4yXXwwOjA7YnJlYWt9ZWxzZSBpZigoZ3wwKSE9MSl7ZD0wO2JyZWFrfWlmKChjW2o+PjJdfDApIT0xKXtpZigoY1tsPj4yXXwwKSE9MCl7ZD0wO2JyZWFrfWlmKChjW2Q+PjJdfDApIT0xKXtkPTA7YnJlYWt9aWYoKGNbaz4+Ml18MCkhPTEpe2Q9MDticmVha319ZD1jW24+PjJdfDB9fXdoaWxlKDApO2k9ZjtyZXR1cm4gZHwwfWZ1bmN0aW9uIG9uKGIsZCxlLGYsZyl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MDtoPWk7aWYoKGJ8MCk9PShjW2QrOD4+Ml18MCkpe2lmKChjW2QrND4+Ml18MCkhPShlfDApKXtpPWg7cmV0dXJufWU9ZCsyOHwwO2lmKChjW2U+PjJdfDApPT0xKXtpPWg7cmV0dXJufWNbZT4+Ml09ZjtpPWg7cmV0dXJufWlmKChifDApPT0oY1tkPj4yXXwwKSl7aWYoKGNbZCsxNj4+Ml18MCkhPShlfDApPyhsPWQrMjB8MCwoY1tsPj4yXXwwKSE9KGV8MCkpOjApe2NbZCszMj4+Ml09ZjtrPWQrNDR8MDtpZigoY1trPj4yXXwwKT09NCl7aT1oO3JldHVybn13PWNbYisxMj4+Ml18MDtwPWIrKHc8PDMpKzE2fDA7YTpkb3tpZigod3wwKT4wKXtuPWQrNTJ8MDtxPWQrNTN8MDtvPWQrNTR8MDt0PWIrOHwwO3I9ZCsyNHwwO3U9MDtzPTA7Yj1iKzE2fDA7Yjpkb3thW24+PjBdPTA7YVtxPj4wXT0wO3Y9Y1tiKzQ+PjJdfDA7dz12Pj44O2lmKCh2JjF8MCkhPTApe3c9Y1soY1tlPj4yXXwwKSt3Pj4yXXwwfXg9Y1tiPj4yXXwwO3djW2NbKGNbeD4+Ml18MCkrMjA+PjJdJjYzXSh4LGQsZSxlK3d8MCwyLSh2Pj4+MSYxKXwwLGcpO2lmKChhW28+PjBdfDApIT0wKXticmVha31kb3tpZigoYVtxPj4wXXwwKSE9MCl7aWYoKGFbbj4+MF18MCk9PTApe2lmKChjW3Q+PjJdJjF8MCk9PTApe3M9MTticmVhayBifWVsc2V7cz0xO2JyZWFrfX1pZigoY1tyPj4yXXwwKT09MSl7Yj0yNzticmVhayBhfWlmKChjW3Q+PjJdJjJ8MCk9PTApe2I9Mjc7YnJlYWsgYX1lbHNle3U9MTtzPTF9fX13aGlsZSgwKTtiPWIrOHwwfXdoaWxlKGI+Pj4wPHA+Pj4wKTtpZih1KXtqPXM7Yj0yNn1lbHNle209cztiPTIzfX1lbHNle209MDtiPTIzfX13aGlsZSgwKTtpZigoYnwwKT09MjMpe2NbbD4+Ml09ZTt4PWQrNDB8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoKGNbZCszNj4+Ml18MCk9PTE/KGNbZCsyND4+Ml18MCk9PTI6MCl7YVtkKzU0Pj4wXT0xO2lmKG0pe2I9Mjd9ZWxzZXtiPTI4fX1lbHNle2o9bTtiPTI2fX1pZigoYnwwKT09MjYpe2lmKGope2I9Mjd9ZWxzZXtiPTI4fX1pZigoYnwwKT09Mjcpe2Nbaz4+Ml09MztpPWg7cmV0dXJufWVsc2UgaWYoKGJ8MCk9PTI4KXtjW2s+PjJdPTQ7aT1oO3JldHVybn19aWYoKGZ8MCkhPTEpe2k9aDtyZXR1cm59Y1tkKzMyPj4yXT0xO2k9aDtyZXR1cm59bT1jW2IrMTI+PjJdfDA7aj1iKyhtPDwzKSsxNnwwO2w9Y1tiKzIwPj4yXXwwO249bD4+ODtpZigobCYxfDApIT0wKXtuPWNbKGNbZT4+Ml18MCkrbj4+Ml18MH14PWNbYisxNj4+Ml18MDtqY1tjWyhjW3g+PjJdfDApKzI0Pj4yXSYzMV0oeCxkLGUrbnwwLChsJjJ8MCkhPTA/ZjoyLGcpO2w9YisyNHwwO2lmKChtfDApPD0xKXtpPWg7cmV0dXJufW09Y1tiKzg+PjJdfDA7aWYoKG0mMnwwKT09MD8oaz1kKzM2fDAsKGNbaz4+Ml18MCkhPTEpOjApe2lmKChtJjF8MCk9PTApe209ZCs1NHwwO2I9bDt3aGlsZSgxKXtpZigoYVttPj4wXXwwKSE9MCl7Yj01MzticmVha31pZigoY1trPj4yXXwwKT09MSl7Yj01MzticmVha31uPWNbYis0Pj4yXXwwO289bj4+ODtpZigobiYxfDApIT0wKXtvPWNbKGNbZT4+Ml18MCkrbz4+Ml18MH14PWNbYj4+Ml18MDtqY1tjWyhjW3g+PjJdfDApKzI0Pj4yXSYzMV0oeCxkLGUrb3wwLChuJjJ8MCkhPTA/ZjoyLGcpO2I9Yis4fDA7aWYoIShiPj4+MDxqPj4+MCkpe2I9NTM7YnJlYWt9fWlmKChifDApPT01Myl7aT1oO3JldHVybn19bj1kKzI0fDA7bz1kKzU0fDA7Yj1sO3doaWxlKDEpe2lmKChhW28+PjBdfDApIT0wKXtiPTUzO2JyZWFrfWlmKChjW2s+PjJdfDApPT0xPyhjW24+PjJdfDApPT0xOjApe2I9NTM7YnJlYWt9bT1jW2IrND4+Ml18MDtwPW0+Pjg7aWYoKG0mMXwwKSE9MCl7cD1jWyhjW2U+PjJdfDApK3A+PjJdfDB9eD1jW2I+PjJdfDA7amNbY1soY1t4Pj4yXXwwKSsyND4+Ml0mMzFdKHgsZCxlK3B8MCwobSYyfDApIT0wP2Y6MixnKTtiPWIrOHwwO2lmKCEoYj4+PjA8aj4+PjApKXtiPTUzO2JyZWFrfX1pZigoYnwwKT09NTMpe2k9aDtyZXR1cm59fWs9ZCs1NHwwO3doaWxlKDEpe2lmKChhW2s+PjBdfDApIT0wKXtiPTUzO2JyZWFrfW09Y1tsKzQ+PjJdfDA7Yj1tPj44O2lmKChtJjF8MCkhPTApe2I9Y1soY1tlPj4yXXwwKStiPj4yXXwwfXg9Y1tsPj4yXXwwO2pjW2NbKGNbeD4+Ml18MCkrMjQ+PjJdJjMxXSh4LGQsZStifDAsKG0mMnwwKSE9MD9mOjIsZyk7bD1sKzh8MDtpZighKGw+Pj4wPGo+Pj4wKSl7Yj01MzticmVha319aWYoKGJ8MCk9PTUzKXtpPWg7cmV0dXJufX1mdW5jdGlvbiBwbihiLGQsZSxmLGcpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MCxsPTAsbT0wO2g9aTtpZigoYnwwKT09KGNbZCs4Pj4yXXwwKSl7aWYoKGNbZCs0Pj4yXXwwKSE9KGV8MCkpe2k9aDtyZXR1cm59aj1kKzI4fDA7aWYoKGNbaj4+Ml18MCk9PTEpe2k9aDtyZXR1cm59Y1tqPj4yXT1mO2k9aDtyZXR1cm59aWYoKGJ8MCkhPShjW2Q+PjJdfDApKXtsPWNbYis4Pj4yXXwwO2pjW2NbKGNbbD4+Ml18MCkrMjQ+PjJdJjMxXShsLGQsZSxmLGcpO2k9aDtyZXR1cm59aWYoKGNbZCsxNj4+Ml18MCkhPShlfDApPyhrPWQrMjB8MCwoY1trPj4yXXwwKSE9KGV8MCkpOjApe2NbZCszMj4+Ml09ZjtmPWQrNDR8MDtpZigoY1tmPj4yXXwwKT09NCl7aT1oO3JldHVybn1sPWQrNTJ8MDthW2w+PjBdPTA7bT1kKzUzfDA7YVttPj4wXT0wO2I9Y1tiKzg+PjJdfDA7d2NbY1soY1tiPj4yXXwwKSsyMD4+Ml0mNjNdKGIsZCxlLGUsMSxnKTtpZigoYVttPj4wXXwwKSE9MCl7aWYoKGFbbD4+MF18MCk9PTApe2I9MTtqPTEzfX1lbHNle2I9MDtqPTEzfWRve2lmKChqfDApPT0xMyl7Y1trPj4yXT1lO209ZCs0MHwwO2NbbT4+Ml09KGNbbT4+Ml18MCkrMTtpZigoY1tkKzM2Pj4yXXwwKT09MT8oY1tkKzI0Pj4yXXwwKT09MjowKXthW2QrNTQ+PjBdPTE7aWYoYil7YnJlYWt9fWVsc2V7aj0xNn1pZigoanwwKT09MTY/YjowKXticmVha31jW2Y+PjJdPTQ7aT1oO3JldHVybn19d2hpbGUoMCk7Y1tmPj4yXT0zO2k9aDtyZXR1cm59aWYoKGZ8MCkhPTEpe2k9aDtyZXR1cm59Y1tkKzMyPj4yXT0xO2k9aDtyZXR1cm59ZnVuY3Rpb24gcW4oYixkLGUsZixnKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wO2c9aTtpZigoY1tkKzg+PjJdfDApPT0oYnwwKSl7aWYoKGNbZCs0Pj4yXXwwKSE9KGV8MCkpe2k9ZztyZXR1cm59ZD1kKzI4fDA7aWYoKGNbZD4+Ml18MCk9PTEpe2k9ZztyZXR1cm59Y1tkPj4yXT1mO2k9ZztyZXR1cm59aWYoKGNbZD4+Ml18MCkhPShifDApKXtpPWc7cmV0dXJufWlmKChjW2QrMTY+PjJdfDApIT0oZXwwKT8oaD1kKzIwfDAsKGNbaD4+Ml18MCkhPShlfDApKTowKXtjW2QrMzI+PjJdPWY7Y1toPj4yXT1lO2I9ZCs0MHwwO2NbYj4+Ml09KGNbYj4+Ml18MCkrMTtpZigoY1tkKzM2Pj4yXXwwKT09MT8oY1tkKzI0Pj4yXXwwKT09MjowKXthW2QrNTQ+PjBdPTF9Y1tkKzQ0Pj4yXT00O2k9ZztyZXR1cm59aWYoKGZ8MCkhPTEpe2k9ZztyZXR1cm59Y1tkKzMyPj4yXT0xO2k9ZztyZXR1cm59ZnVuY3Rpb24gcm4oYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtqPWk7aWYoKGJ8MCkhPShjW2QrOD4+Ml18MCkpe209ZCs1MnwwO2w9YVttPj4wXXwwO289ZCs1M3wwO249YVtvPj4wXXwwO3E9Y1tiKzEyPj4yXXwwO2s9YisocTw8MykrMTZ8MDthW20+PjBdPTA7YVtvPj4wXT0wO3A9Y1tiKzIwPj4yXXwwO3I9cD4+ODtpZigocCYxfDApIT0wKXtyPWNbKGNbZj4+Ml18MCkrcj4+Ml18MH10PWNbYisxNj4+Ml18MDt3Y1tjWyhjW3Q+PjJdfDApKzIwPj4yXSY2M10odCxkLGUsZityfDAsKHAmMnwwKSE9MD9nOjIsaCk7YTpkb3tpZigocXwwKT4xKXtxPWQrMjR8MDtwPWIrOHwwO3I9ZCs1NHwwO2I9YisyNHwwO2Rve2lmKChhW3I+PjBdfDApIT0wKXticmVhayBhfWlmKChhW20+PjBdfDApPT0wKXtpZigoYVtvPj4wXXwwKSE9MD8oY1twPj4yXSYxfDApPT0wOjApe2JyZWFrIGF9fWVsc2V7aWYoKGNbcT4+Ml18MCk9PTEpe2JyZWFrIGF9aWYoKGNbcD4+Ml0mMnwwKT09MCl7YnJlYWsgYX19YVttPj4wXT0wO2Fbbz4+MF09MDtzPWNbYis0Pj4yXXwwO3Q9cz4+ODtpZigocyYxfDApIT0wKXt0PWNbKGNbZj4+Ml18MCkrdD4+Ml18MH11PWNbYj4+Ml18MDt3Y1tjWyhjW3U+PjJdfDApKzIwPj4yXSY2M10odSxkLGUsZit0fDAsKHMmMnwwKSE9MD9nOjIsaCk7Yj1iKzh8MH13aGlsZShiPj4+MDxrPj4+MCl9fXdoaWxlKDApO2FbbT4+MF09bDthW28+PjBdPW47aT1qO3JldHVybn1hW2QrNTM+PjBdPTE7aWYoKGNbZCs0Pj4yXXwwKSE9KGZ8MCkpe2k9ajtyZXR1cm59YVtkKzUyPj4wXT0xO2s9ZCsxNnwwO2Y9Y1trPj4yXXwwO2lmKChmfDApPT0wKXtjW2s+PjJdPWU7Y1tkKzI0Pj4yXT1nO2NbZCszNj4+Ml09MTtpZighKChnfDApPT0xPyhjW2QrNDg+PjJdfDApPT0xOjApKXtpPWo7cmV0dXJufWFbZCs1ND4+MF09MTtpPWo7cmV0dXJufWlmKChmfDApIT0oZXwwKSl7dT1kKzM2fDA7Y1t1Pj4yXT0oY1t1Pj4yXXwwKSsxO2FbZCs1ND4+MF09MTtpPWo7cmV0dXJufWU9ZCsyNHwwO2s9Y1tlPj4yXXwwO2lmKChrfDApPT0yKXtjW2U+PjJdPWd9ZWxzZXtnPWt9aWYoISgoZ3wwKT09MT8oY1tkKzQ4Pj4yXXwwKT09MTowKSl7aT1qO3JldHVybn1hW2QrNTQ+PjBdPTE7aT1qO3JldHVybn1mdW5jdGlvbiBzbihiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MDtqPWk7aWYoKGJ8MCkhPShjW2QrOD4+Ml18MCkpe2I9Y1tiKzg+PjJdfDA7d2NbY1soY1tiPj4yXXwwKSsyMD4+Ml0mNjNdKGIsZCxlLGYsZyxoKTtpPWo7cmV0dXJufWFbZCs1Mz4+MF09MTtpZigoY1tkKzQ+PjJdfDApIT0oZnwwKSl7aT1qO3JldHVybn1hW2QrNTI+PjBdPTE7Yj1kKzE2fDA7Zj1jW2I+PjJdfDA7aWYoKGZ8MCk9PTApe2NbYj4+Ml09ZTtjW2QrMjQ+PjJdPWc7Y1tkKzM2Pj4yXT0xO2lmKCEoKGd8MCk9PTE/KGNbZCs0OD4+Ml18MCk9PTE6MCkpe2k9ajtyZXR1cm59YVtkKzU0Pj4wXT0xO2k9ajtyZXR1cm59aWYoKGZ8MCkhPShlfDApKXtoPWQrMzZ8MDtjW2g+PjJdPShjW2g+PjJdfDApKzE7YVtkKzU0Pj4wXT0xO2k9ajtyZXR1cm59ZT1kKzI0fDA7Yj1jW2U+PjJdfDA7aWYoKGJ8MCk9PTIpe2NbZT4+Ml09Z31lbHNle2c9Yn1pZighKChnfDApPT0xPyhjW2QrNDg+PjJdfDApPT0xOjApKXtpPWo7cmV0dXJufWFbZCs1ND4+MF09MTtpPWo7cmV0dXJufWZ1bmN0aW9uIHRuKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtoPWk7aWYoKGNbZCs4Pj4yXXwwKSE9KGJ8MCkpe2k9aDtyZXR1cm59YVtkKzUzPj4wXT0xO2lmKChjW2QrND4+Ml18MCkhPShmfDApKXtpPWg7cmV0dXJufWFbZCs1Mj4+MF09MTtmPWQrMTZ8MDtiPWNbZj4+Ml18MDtpZigoYnwwKT09MCl7Y1tmPj4yXT1lO2NbZCsyND4+Ml09ZztjW2QrMzY+PjJdPTE7aWYoISgoZ3wwKT09MT8oY1tkKzQ4Pj4yXXwwKT09MTowKSl7aT1oO3JldHVybn1hW2QrNTQ+PjBdPTE7aT1oO3JldHVybn1pZigoYnwwKSE9KGV8MCkpe2I9ZCszNnwwO2NbYj4+Ml09KGNbYj4+Ml18MCkrMTthW2QrNTQ+PjBdPTE7aT1oO3JldHVybn1lPWQrMjR8MDtmPWNbZT4+Ml18MDtpZigoZnwwKT09Mil7Y1tlPj4yXT1nfWVsc2V7Zz1mfWlmKCEoKGd8MCk9PTE/KGNbZCs0OD4+Ml18MCk9PTE6MCkpe2k9aDtyZXR1cm59YVtkKzU0Pj4wXT0xO2k9aDtyZXR1cm59ZnVuY3Rpb24gdW4oYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MDtiPWk7ZG97aWYoYT4+PjA8MjQ1KXtpZihhPj4+MDwxMSl7YT0xNn1lbHNle2E9YSsxMSYtOH12PWE+Pj4zO3A9Y1s1NTQyXXwwO3c9cD4+PnY7aWYoKHcmM3wwKSE9MCl7aD0odyYxXjEpK3Z8MDtnPWg8PDE7ZT0yMjIwOCsoZzw8Mil8MDtnPTIyMjA4KyhnKzI8PDIpfDA7aj1jW2c+PjJdfDA7ZD1qKzh8MDtmPWNbZD4+Ml18MDtkb3tpZigoZXwwKSE9KGZ8MCkpe2lmKGY+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9az1mKzEyfDA7aWYoKGNbaz4+Ml18MCk9PShqfDApKXtjW2s+PjJdPWU7Y1tnPj4yXT1mO2JyZWFrfWVsc2V7WGIoKX19ZWxzZXtjWzU1NDJdPXAmfigxPDxoKX19d2hpbGUoMCk7SD1oPDwzO2Nbais0Pj4yXT1IfDM7SD1qKyhIfDQpfDA7Y1tIPj4yXT1jW0g+PjJdfDE7SD1kO2k9YjtyZXR1cm4gSHwwfWlmKGE+Pj4wPihjWzIyMTc2Pj4yXXwwKT4+PjApe2lmKCh3fDApIT0wKXtoPTI8PHY7aD13PDx2JihofDAtaCk7aD0oaCYwLWgpKyAtMXwwO2Q9aD4+PjEyJjE2O2g9aD4+PmQ7Zj1oPj4+NSY4O2g9aD4+PmY7Zz1oPj4+MiY0O2g9aD4+Pmc7ZT1oPj4+MSYyO2g9aD4+PmU7aj1oPj4+MSYxO2o9KGZ8ZHxnfGV8aikrKGg+Pj5qKXwwO2g9ajw8MTtlPTIyMjA4KyhoPDwyKXwwO2g9MjIyMDgrKGgrMjw8Mil8MDtnPWNbaD4+Ml18MDtkPWcrOHwwO2Y9Y1tkPj4yXXwwO2Rve2lmKChlfDApIT0oZnwwKSl7aWYoZj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1rPWYrMTJ8MDtpZigoY1trPj4yXXwwKT09KGd8MCkpe2Nbaz4+Ml09ZTtjW2g+PjJdPWY7YnJlYWt9ZWxzZXtYYigpfX1lbHNle2NbNTU0Ml09cCZ+KDE8PGopfX13aGlsZSgwKTtoPWo8PDM7Zj1oLWF8MDtjW2crND4+Ml09YXwzO2U9ZythfDA7Y1tnKyhhfDQpPj4yXT1mfDE7Y1tnK2g+PjJdPWY7aD1jWzIyMTc2Pj4yXXwwO2lmKChofDApIT0wKXtnPWNbMjIxODg+PjJdfDA7az1oPj4+MztqPWs8PDE7aD0yMjIwOCsoajw8Mil8MDtsPWNbNTU0Ml18MDtrPTE8PGs7aWYoKGwma3wwKSE9MCl7aj0yMjIwOCsoaisyPDwyKXwwO2s9Y1tqPj4yXXwwO2lmKGs+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtEPWo7Qz1rfX1lbHNle2NbNTU0Ml09bHxrO0Q9MjIyMDgrKGorMjw8Mil8MDtDPWh9Y1tEPj4yXT1nO2NbQysxMj4+Ml09ZztjW2crOD4+Ml09QztjW2crMTI+PjJdPWh9Y1syMjE3Nj4+Ml09ZjtjWzIyMTg4Pj4yXT1lO0g9ZDtpPWI7cmV0dXJuIEh8MH1wPWNbMjIxNzI+PjJdfDA7aWYoKHB8MCkhPTApe2U9KHAmMC1wKSsgLTF8MDtHPWU+Pj4xMiYxNjtlPWU+Pj5HO0Y9ZT4+PjUmODtlPWU+Pj5GO0g9ZT4+PjImNDtlPWU+Pj5IO2Y9ZT4+PjEmMjtlPWU+Pj5mO2Q9ZT4+PjEmMTtkPWNbMjI0NzIrKChGfEd8SHxmfGQpKyhlPj4+ZCk8PDIpPj4yXXwwO2U9KGNbZCs0Pj4yXSYtOCktYXwwO2Y9ZDt3aGlsZSgxKXtnPWNbZisxNj4+Ml18MDtpZigoZ3wwKT09MCl7Zz1jW2YrMjA+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfX1mPShjW2crND4+Ml0mLTgpLWF8MDtIPWY+Pj4wPGU+Pj4wO2U9SD9mOmU7Zj1nO2Q9SD9nOmR9aD1jWzIyMTg0Pj4yXXwwO2lmKGQ+Pj4wPGg+Pj4wKXtYYigpfWY9ZCthfDA7aWYoIShkPj4+MDxmPj4+MCkpe1hiKCl9Zz1jW2QrMjQ+PjJdfDA7az1jW2QrMTI+PjJdfDA7ZG97aWYoKGt8MCk9PShkfDApKXtrPWQrMjB8MDtqPWNbaz4+Ml18MDtpZigoanwwKT09MCl7az1kKzE2fDA7aj1jW2s+PjJdfDA7aWYoKGp8MCk9PTApe0I9MDticmVha319d2hpbGUoMSl7bD1qKzIwfDA7bT1jW2w+PjJdfDA7aWYoKG18MCkhPTApe2o9bTtrPWw7Y29udGludWV9bT1qKzE2fDA7bD1jW20+PjJdfDA7aWYoKGx8MCk9PTApe2JyZWFrfWVsc2V7aj1sO2s9bX19aWYoaz4+PjA8aD4+PjApe1hiKCl9ZWxzZXtjW2s+PjJdPTA7Qj1qO2JyZWFrfX1lbHNle2o9Y1tkKzg+PjJdfDA7aWYoaj4+PjA8aD4+PjApe1hiKCl9aD1qKzEyfDA7aWYoKGNbaD4+Ml18MCkhPShkfDApKXtYYigpfWw9ays4fDA7aWYoKGNbbD4+Ml18MCk9PShkfDApKXtjW2g+PjJdPWs7Y1tsPj4yXT1qO0I9azticmVha31lbHNle1hiKCl9fX13aGlsZSgwKTtkb3tpZigoZ3wwKSE9MCl7aD1jW2QrMjg+PjJdfDA7aj0yMjQ3MisoaDw8Mil8MDtpZigoZHwwKT09KGNbaj4+Ml18MCkpe2Nbaj4+Ml09QjtpZigoQnwwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxoKTticmVha319ZWxzZXtpZihnPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWg9ZysxNnwwO2lmKChjW2g+PjJdfDApPT0oZHwwKSl7Y1toPj4yXT1CfWVsc2V7Y1tnKzIwPj4yXT1CfWlmKChCfDApPT0wKXticmVha319aWYoQj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW0IrMjQ+PjJdPWc7Zz1jW2QrMTY+PjJdfDA7ZG97aWYoKGd8MCkhPTApe2lmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW0IrMTY+PjJdPWc7Y1tnKzI0Pj4yXT1CO2JyZWFrfX19d2hpbGUoMCk7Zz1jW2QrMjA+PjJdfDA7aWYoKGd8MCkhPTApe2lmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW0IrMjA+PjJdPWc7Y1tnKzI0Pj4yXT1CO2JyZWFrfX19fXdoaWxlKDApO2lmKGU+Pj4wPDE2KXtIPWUrYXwwO2NbZCs0Pj4yXT1IfDM7SD1kKyhIKzQpfDA7Y1tIPj4yXT1jW0g+PjJdfDF9ZWxzZXtjW2QrND4+Ml09YXwzO2NbZCsoYXw0KT4+Ml09ZXwxO2NbZCsoZSthKT4+Ml09ZTtoPWNbMjIxNzY+PjJdfDA7aWYoKGh8MCkhPTApe2c9Y1syMjE4OD4+Ml18MDtsPWg+Pj4zO2o9bDw8MTtoPTIyMjA4KyhqPDwyKXwwO2s9Y1s1NTQyXXwwO2w9MTw8bDtpZigoayZsfDApIT0wKXtqPTIyMjA4KyhqKzI8PDIpfDA7az1jW2o+PjJdfDA7aWYoaz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle0E9ajt6PWt9fWVsc2V7Y1s1NTQyXT1rfGw7QT0yMjIwOCsoaisyPDwyKXwwO3o9aH1jW0E+PjJdPWc7Y1t6KzEyPj4yXT1nO2NbZys4Pj4yXT16O2NbZysxMj4+Ml09aH1jWzIyMTc2Pj4yXT1lO2NbMjIxODg+PjJdPWZ9SD1kKzh8MDtpPWI7cmV0dXJuIEh8MH19fWVsc2V7aWYoIShhPj4+MD40Mjk0OTY3MjMxKSl7ej1hKzExfDA7YT16Ji04O0I9Y1syMjE3Mj4+Ml18MDtpZigoQnwwKSE9MCl7QT0wLWF8MDt6PXo+Pj44O2lmKCh6fDApIT0wKXtpZihhPj4+MD4xNjc3NzIxNSl7Qz0zMX1lbHNle0c9KHorMTA0ODMyMHwwKT4+PjE2Jjg7SD16PDxHO0Y9KEgrNTIwMTkyfDApPj4+MTYmNDtIPUg8PEY7Qz0oSCsyNDU3NjB8MCk+Pj4xNiYyO0M9MTQtKEZ8R3xDKSsoSDw8Qz4+PjE1KXwwO0M9YT4+PihDKzd8MCkmMXxDPDwxfX1lbHNle0M9MH1EPWNbMjI0NzIrKEM8PDIpPj4yXXwwO2E6ZG97aWYoKER8MCk9PTApe0Y9MDt6PTB9ZWxzZXtpZigoQ3wwKT09MzEpe3o9MH1lbHNle3o9MjUtKEM+Pj4xKXwwfUY9MDtFPWE8PHo7ej0wO3doaWxlKDEpe0g9Y1tEKzQ+PjJdJi04O0c9SC1hfDA7aWYoRz4+PjA8QT4+PjApe2lmKChIfDApPT0oYXwwKSl7QT1HO0Y9RDt6PUQ7YnJlYWsgYX1lbHNle0E9Rzt6PUR9fUg9Y1tEKzIwPj4yXXwwO0Q9Y1tEKyhFPj4+MzE8PDIpKzE2Pj4yXXwwO0Y9KEh8MCk9PTB8KEh8MCk9PShEfDApP0Y6SDtpZigoRHwwKT09MCl7YnJlYWt9ZWxzZXtFPUU8PDF9fX19d2hpbGUoMCk7aWYoKEZ8MCk9PTAmKHp8MCk9PTApe0g9Mjw8QztCPUImKEh8MC1IKTtpZigoQnwwKT09MCl7YnJlYWt9SD0oQiYwLUIpKyAtMXwwO0Q9SD4+PjEyJjE2O0g9SD4+PkQ7Qz1IPj4+NSY4O0g9SD4+PkM7RT1IPj4+MiY0O0g9SD4+PkU7Rz1IPj4+MSYyO0g9SD4+Pkc7Rj1IPj4+MSYxO0Y9Y1syMjQ3MisoKEN8RHxFfEd8RikrKEg+Pj5GKTw8Mik+PjJdfDB9aWYoKEZ8MCkhPTApe3doaWxlKDEpe0g9KGNbRis0Pj4yXSYtOCktYXwwO0I9SD4+PjA8QT4+PjA7QT1CP0g6QTt6PUI/Rjp6O0I9Y1tGKzE2Pj4yXXwwO2lmKChCfDApIT0wKXtGPUI7Y29udGludWV9Rj1jW0YrMjA+PjJdfDA7aWYoKEZ8MCk9PTApe2JyZWFrfX19aWYoKHp8MCkhPTA/QT4+PjA8KChjWzIyMTc2Pj4yXXwwKS1hfDApPj4+MDowKXtmPWNbMjIxODQ+PjJdfDA7aWYoej4+PjA8Zj4+PjApe1hiKCl9ZD16K2F8MDtpZighKHo+Pj4wPGQ+Pj4wKSl7WGIoKX1lPWNbeisyND4+Ml18MDtoPWNbeisxMj4+Ml18MDtkb3tpZigoaHwwKT09KHp8MCkpe2g9eisyMHwwO2c9Y1toPj4yXXwwO2lmKChnfDApPT0wKXtoPXorMTZ8MDtnPWNbaD4+Ml18MDtpZigoZ3wwKT09MCl7eD0wO2JyZWFrfX13aGlsZSgxKXtqPWcrMjB8MDtrPWNbaj4+Ml18MDtpZigoa3wwKSE9MCl7Zz1rO2g9ajtjb250aW51ZX1qPWcrMTZ8MDtrPWNbaj4+Ml18MDtpZigoa3wwKT09MCl7YnJlYWt9ZWxzZXtnPWs7aD1qfX1pZihoPj4+MDxmPj4+MCl7WGIoKX1lbHNle2NbaD4+Ml09MDt4PWc7YnJlYWt9fWVsc2V7Zz1jW3orOD4+Ml18MDtpZihnPj4+MDxmPj4+MCl7WGIoKX1mPWcrMTJ8MDtpZigoY1tmPj4yXXwwKSE9KHp8MCkpe1hiKCl9aj1oKzh8MDtpZigoY1tqPj4yXXwwKT09KHp8MCkpe2NbZj4+Ml09aDtjW2o+PjJdPWc7eD1oO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2Rve2lmKChlfDApIT0wKXtnPWNbeisyOD4+Ml18MDtmPTIyNDcyKyhnPDwyKXwwO2lmKCh6fDApPT0oY1tmPj4yXXwwKSl7Y1tmPj4yXT14O2lmKCh4fDApPT0wKXtjWzIyMTcyPj4yXT1jWzIyMTcyPj4yXSZ+KDE8PGcpO2JyZWFrfX1lbHNle2lmKGU+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9Zj1lKzE2fDA7aWYoKGNbZj4+Ml18MCk9PSh6fDApKXtjW2Y+PjJdPXh9ZWxzZXtjW2UrMjA+PjJdPXh9aWYoKHh8MCk9PTApe2JyZWFrfX1pZih4Pj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWNbeCsyND4+Ml09ZTtlPWNbeisxNj4+Ml18MDtkb3tpZigoZXwwKSE9MCl7aWYoZT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbeCsxNj4+Ml09ZTtjW2UrMjQ+PjJdPXg7YnJlYWt9fX13aGlsZSgwKTtlPWNbeisyMD4+Ml18MDtpZigoZXwwKSE9MCl7aWYoZT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbeCsyMD4+Ml09ZTtjW2UrMjQ+PjJdPXg7YnJlYWt9fX19d2hpbGUoMCk7Yjpkb3tpZighKEE+Pj4wPDE2KSl7Y1t6KzQ+PjJdPWF8MztjW3orKGF8NCk+PjJdPUF8MTtjW3orKEErYSk+PjJdPUE7Zj1BPj4+MztpZihBPj4+MDwyNTYpe2g9Zjw8MTtlPTIyMjA4KyhoPDwyKXwwO2c9Y1s1NTQyXXwwO2Y9MTw8Zjtkb3tpZigoZyZmfDApPT0wKXtjWzU1NDJdPWd8Zjt3PTIyMjA4KyhoKzI8PDIpfDA7dj1lfWVsc2V7Zj0yMjIwOCsoaCsyPDwyKXwwO2c9Y1tmPj4yXXwwO2lmKCEoZz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCkpe3c9Zjt2PWc7YnJlYWt9WGIoKX19d2hpbGUoMCk7Y1t3Pj4yXT1kO2NbdisxMj4+Ml09ZDtjW3orKGErOCk+PjJdPXY7Y1t6KyhhKzEyKT4+Ml09ZTticmVha31lPUE+Pj44O2lmKChlfDApIT0wKXtpZihBPj4+MD4xNjc3NzIxNSl7ZT0zMX1lbHNle0c9KGUrMTA0ODMyMHwwKT4+PjE2Jjg7SD1lPDxHO0Y9KEgrNTIwMTkyfDApPj4+MTYmNDtIPUg8PEY7ZT0oSCsyNDU3NjB8MCk+Pj4xNiYyO2U9MTQtKEZ8R3xlKSsoSDw8ZT4+PjE1KXwwO2U9QT4+PihlKzd8MCkmMXxlPDwxfX1lbHNle2U9MH1mPTIyNDcyKyhlPDwyKXwwO2NbeisoYSsyOCk+PjJdPWU7Y1t6KyhhKzIwKT4+Ml09MDtjW3orKGErMTYpPj4yXT0wO2g9Y1syMjE3Mj4+Ml18MDtnPTE8PGU7aWYoKGgmZ3wwKT09MCl7Y1syMjE3Mj4+Ml09aHxnO2NbZj4+Ml09ZDtjW3orKGErMjQpPj4yXT1mO2NbeisoYSsxMik+PjJdPWQ7Y1t6KyhhKzgpPj4yXT1kO2JyZWFrfWY9Y1tmPj4yXXwwO2lmKChlfDApPT0zMSl7ZT0wfWVsc2V7ZT0yNS0oZT4+PjEpfDB9Yzpkb3tpZigoY1tmKzQ+PjJdJi04fDApIT0oQXwwKSl7ZT1BPDxlO3doaWxlKDEpe2c9ZisoZT4+PjMxPDwyKSsxNnwwO2g9Y1tnPj4yXXwwO2lmKChofDApPT0wKXticmVha31pZigoY1toKzQ+PjJdJi04fDApPT0oQXwwKSl7cD1oO2JyZWFrIGN9ZWxzZXtlPWU8PDE7Zj1ofX1pZihnPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1tnPj4yXT1kO2NbeisoYSsyNCk+PjJdPWY7Y1t6KyhhKzEyKT4+Ml09ZDtjW3orKGErOCk+PjJdPWQ7YnJlYWsgYn19ZWxzZXtwPWZ9fXdoaWxlKDApO2Y9cCs4fDA7ZT1jW2Y+PjJdfDA7Zz1jWzIyMTg0Pj4yXXwwO2lmKHA+Pj4wPGc+Pj4wKXtYYigpfWlmKGU+Pj4wPGc+Pj4wKXtYYigpfWVsc2V7Y1tlKzEyPj4yXT1kO2NbZj4+Ml09ZDtjW3orKGErOCk+PjJdPWU7Y1t6KyhhKzEyKT4+Ml09cDtjW3orKGErMjQpPj4yXT0wO2JyZWFrfX1lbHNle0g9QSthfDA7Y1t6KzQ+PjJdPUh8MztIPXorKEgrNCl8MDtjW0g+PjJdPWNbSD4+Ml18MX19d2hpbGUoMCk7SD16Kzh8MDtpPWI7cmV0dXJuIEh8MH19fWVsc2V7YT0tMX19fXdoaWxlKDApO3A9Y1syMjE3Nj4+Ml18MDtpZighKGE+Pj4wPnA+Pj4wKSl7ZT1wLWF8MDtkPWNbMjIxODg+PjJdfDA7aWYoZT4+PjA+MTUpe2NbMjIxODg+PjJdPWQrYTtjWzIyMTc2Pj4yXT1lO2NbZCsoYSs0KT4+Ml09ZXwxO2NbZCtwPj4yXT1lO2NbZCs0Pj4yXT1hfDN9ZWxzZXtjWzIyMTc2Pj4yXT0wO2NbMjIxODg+PjJdPTA7Y1tkKzQ+PjJdPXB8MztIPWQrKHArNCl8MDtjW0g+PjJdPWNbSD4+Ml18MX1IPWQrOHwwO2k9YjtyZXR1cm4gSHwwfXA9Y1syMjE4MD4+Ml18MDtpZihhPj4+MDxwPj4+MCl7Rz1wLWF8MDtjWzIyMTgwPj4yXT1HO0g9Y1syMjE5Mj4+Ml18MDtjWzIyMTkyPj4yXT1IK2E7Y1tIKyhhKzQpPj4yXT1HfDE7Y1tIKzQ+PjJdPWF8MztIPUgrOHwwO2k9YjtyZXR1cm4gSHwwfWRve2lmKChjWzU2NjBdfDApPT0wKXtwPXNiKDMwKXwwO2lmKChwKyAtMSZwfDApPT0wKXtjWzIyNjQ4Pj4yXT1wO2NbMjI2NDQ+PjJdPXA7Y1syMjY1Mj4+Ml09LTE7Y1syMjY1Nj4+Ml09LTE7Y1syMjY2MD4+Ml09MDtjWzIyNjEyPj4yXT0wO2NbNTY2MF09KF9iKDApfDApJi0xNl4xNDMxNjU1NzY4O2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO3c9YSs0OHwwO3A9Y1syMjY0OD4+Ml18MDt4PWErNDd8MDt6PXAreHwwO3A9MC1wfDA7dj16JnA7aWYoISh2Pj4+MD5hPj4+MCkpe0g9MDtpPWI7cmV0dXJuIEh8MH1BPWNbMjI2MDg+PjJdfDA7aWYoKEF8MCkhPTA/KEc9Y1syMjYwMD4+Ml18MCxIPUcrdnwwLEg+Pj4wPD1HPj4+MHxIPj4+MD5BPj4+MCk6MCl7SD0wO2k9YjtyZXR1cm4gSHwwfWQ6ZG97aWYoKGNbMjI2MTI+PjJdJjR8MCk9PTApe0I9Y1syMjE5Mj4+Ml18MDtlOmRve2lmKChCfDApIT0wKXtBPTIyNjE2fDA7d2hpbGUoMSl7Qz1jW0E+PjJdfDA7aWYoIShDPj4+MD5CPj4+MCk/KHk9QSs0fDAsKEMrKGNbeT4+Ml18MCl8MCk+Pj4wPkI+Pj4wKTowKXticmVha31BPWNbQSs4Pj4yXXwwO2lmKChBfDApPT0wKXtvPTE4MjticmVhayBlfX1pZigoQXwwKSE9MCl7Qj16LShjWzIyMTgwPj4yXXwwKSZwO2lmKEI+Pj4wPDIxNDc0ODM2NDcpe3A9aGIoQnwwKXwwO0E9KHB8MCk9PSgoY1tBPj4yXXwwKSsoY1t5Pj4yXXwwKXwwKTt5PXA7ej1CO3A9QT9wOi0xO0E9QT9COjA7bz0xOTF9ZWxzZXtBPTB9fWVsc2V7bz0xODJ9fWVsc2V7bz0xODJ9fXdoaWxlKDApO2Rve2lmKChvfDApPT0xODIpe3A9aGIoMCl8MDtpZigocHwwKSE9KC0xfDApKXt6PXA7QT1jWzIyNjQ0Pj4yXXwwO3k9QSsgLTF8MDtpZigoeSZ6fDApPT0wKXtBPXZ9ZWxzZXtBPXYteisoeSt6JjAtQSl8MH15PWNbMjI2MDA+PjJdfDA7ej15K0F8MDtpZihBPj4+MD5hPj4+MCZBPj4+MDwyMTQ3NDgzNjQ3KXtIPWNbMjI2MDg+PjJdfDA7aWYoKEh8MCkhPTA/ej4+PjA8PXk+Pj4wfHo+Pj4wPkg+Pj4wOjApe0E9MDticmVha315PWhiKEF8MCl8MDtvPSh5fDApPT0ocHwwKTt6PUE7cD1vP3A6LTE7QT1vP0E6MDtvPTE5MX1lbHNle0E9MH19ZWxzZXtBPTB9fX13aGlsZSgwKTtmOmRve2lmKChvfDApPT0xOTEpe289MC16fDA7aWYoKHB8MCkhPSgtMXwwKSl7cT1BO289MjAyO2JyZWFrIGR9ZG97aWYoKHl8MCkhPSgtMXwwKSZ6Pj4+MDwyMTQ3NDgzNjQ3Jno+Pj4wPHc+Pj4wPyh1PWNbMjI2NDg+PjJdfDAsdT14LXordSYwLXUsdT4+PjA8MjE0NzQ4MzY0Nyk6MCl7aWYoKGhiKHV8MCl8MCk9PSgtMXwwKSl7aGIob3wwKXwwO2JyZWFrIGZ9ZWxzZXt6PXUrenwwO2JyZWFrfX19d2hpbGUoMCk7aWYoKHl8MCkhPSgtMXwwKSl7cD15O3E9ejtvPTIwMjticmVhayBkfX19d2hpbGUoMCk7Y1syMjYxMj4+Ml09Y1syMjYxMj4+Ml18NDtvPTE5OX1lbHNle0E9MDtvPTE5OX19d2hpbGUoMCk7aWYoKCgob3wwKT09MTk5P3Y+Pj4wPDIxNDc0ODM2NDc6MCk/KHQ9aGIodnwwKXwwLHM9aGIoMCl8MCwoc3wwKSE9KC0xfDApJih0fDApIT0oLTF8MCkmdD4+PjA8cz4+PjApOjApPyhyPXMtdHwwLHE9cj4+PjA+KGErNDB8MCk+Pj4wLHEpOjApe3A9dDtxPXE/cjpBO289MjAyfWlmKChvfDApPT0yMDIpe3I9KGNbMjI2MDA+PjJdfDApK3F8MDtjWzIyNjAwPj4yXT1yO2lmKHI+Pj4wPihjWzIyNjA0Pj4yXXwwKT4+PjApe2NbMjI2MDQ+PjJdPXJ9cj1jWzIyMTkyPj4yXXwwO2c6ZG97aWYoKHJ8MCkhPTApe3Y9MjI2MTZ8MDt3aGlsZSgxKXt0PWNbdj4+Ml18MDt1PXYrNHwwO3M9Y1t1Pj4yXXwwO2lmKChwfDApPT0odCtzfDApKXtvPTIxNDticmVha313PWNbdis4Pj4yXXwwO2lmKCh3fDApPT0wKXticmVha31lbHNle3Y9d319aWYoKChvfDApPT0yMTQ/KGNbdisxMj4+Ml0mOHwwKT09MDowKT9yPj4+MD49dD4+PjAmcj4+PjA8cD4+PjA6MCl7Y1t1Pj4yXT1zK3E7ZD0oY1syMjE4MD4+Ml18MCkrcXwwO2U9cis4fDA7aWYoKGUmN3wwKT09MCl7ZT0wfWVsc2V7ZT0wLWUmN31IPWQtZXwwO2NbMjIxOTI+PjJdPXIrZTtjWzIyMTgwPj4yXT1IO2NbcisoZSs0KT4+Ml09SHwxO2NbcisoZCs0KT4+Ml09NDA7Y1syMjE5Nj4+Ml09Y1syMjY1Nj4+Ml07YnJlYWt9aWYocD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7Y1syMjE4ND4+Ml09cH10PXArcXwwO3M9MjI2MTZ8MDt3aGlsZSgxKXtpZigoY1tzPj4yXXwwKT09KHR8MCkpe289MjI0O2JyZWFrfXU9Y1tzKzg+PjJdfDA7aWYoKHV8MCk9PTApe2JyZWFrfWVsc2V7cz11fX1pZigob3wwKT09MjI0PyhjW3MrMTI+PjJdJjh8MCk9PTA6MCl7Y1tzPj4yXT1wO2g9cys0fDA7Y1toPj4yXT0oY1toPj4yXXwwKStxO2g9cCs4fDA7aWYoKGgmN3wwKT09MCl7aD0wfWVsc2V7aD0wLWgmN31qPXArKHErOCl8MDtpZigoaiY3fDApPT0wKXtuPTB9ZWxzZXtuPTAtaiY3fW89cCsobitxKXwwO2o9aCthfDA7az1wK2p8MDttPW8tKHAraCktYXwwO2NbcCsoaCs0KT4+Ml09YXwzO2g6ZG97aWYoKG98MCkhPShjWzIyMTkyPj4yXXwwKSl7aWYoKG98MCk9PShjWzIyMTg4Pj4yXXwwKSl7SD0oY1syMjE3Nj4+Ml18MCkrbXwwO2NbMjIxNzY+PjJdPUg7Y1syMjE4OD4+Ml09aztjW3ArKGorNCk+PjJdPUh8MTtjW3ArKEgraik+PjJdPUg7YnJlYWt9cj1xKzR8MDt0PWNbcCsocituKT4+Ml18MDtpZigodCYzfDApPT0xKXthPXQmLTg7cz10Pj4+MztpOmRve2lmKCEodD4+PjA8MjU2KSl7bD1jW3ArKChufDI0KStxKT4+Ml18MDt1PWNbcCsocSsxMituKT4+Ml18MDtkb3tpZigodXwwKT09KG98MCkpe3U9bnwxNjt0PXArKHIrdSl8MDtzPWNbdD4+Ml18MDtpZigoc3wwKT09MCl7dD1wKyh1K3EpfDA7cz1jW3Q+PjJdfDA7aWYoKHN8MCk9PTApe2c9MDticmVha319d2hpbGUoMSl7dT1zKzIwfDA7dj1jW3U+PjJdfDA7aWYoKHZ8MCkhPTApe3M9djt0PXU7Y29udGludWV9dT1zKzE2fDA7dj1jW3U+PjJdfDA7aWYoKHZ8MCk9PTApe2JyZWFrfWVsc2V7cz12O3Q9dX19aWYodD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbdD4+Ml09MDtnPXM7YnJlYWt9fWVsc2V7dD1jW3ArKChufDgpK3EpPj4yXXwwO2lmKHQ+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9dj10KzEyfDA7aWYoKGNbdj4+Ml18MCkhPShvfDApKXtYYigpfXM9dSs4fDA7aWYoKGNbcz4+Ml18MCk9PShvfDApKXtjW3Y+PjJdPXU7Y1tzPj4yXT10O2c9dTticmVha31lbHNle1hiKCl9fX13aGlsZSgwKTtpZigobHwwKT09MCl7YnJlYWt9dD1jW3ArKHErMjgrbik+PjJdfDA7cz0yMjQ3MisodDw8Mil8MDtkb3tpZigob3wwKSE9KGNbcz4+Ml18MCkpe2lmKGw+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9cz1sKzE2fDA7aWYoKGNbcz4+Ml18MCk9PShvfDApKXtjW3M+PjJdPWd9ZWxzZXtjW2wrMjA+PjJdPWd9aWYoKGd8MCk9PTApe2JyZWFrIGl9fWVsc2V7Y1tzPj4yXT1nO2lmKChnfDApIT0wKXticmVha31jWzIyMTcyPj4yXT1jWzIyMTcyPj4yXSZ+KDE8PHQpO2JyZWFrIGl9fXdoaWxlKDApO2lmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9Y1tnKzI0Pj4yXT1sO2w9bnwxNjtvPWNbcCsobCtxKT4+Ml18MDtkb3tpZigob3wwKSE9MCl7aWYobz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbZysxNj4+Ml09bztjW28rMjQ+PjJdPWc7YnJlYWt9fX13aGlsZSgwKTtsPWNbcCsocitsKT4+Ml18MDtpZigobHwwKT09MCl7YnJlYWt9aWYobD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbZysyMD4+Ml09bDtjW2wrMjQ+PjJdPWc7YnJlYWt9fWVsc2V7cj1jW3ArKChufDgpK3EpPj4yXXwwO2c9Y1twKyhxKzEyK24pPj4yXXwwO3Q9MjIyMDgrKHM8PDE8PDIpfDA7ZG97aWYoKHJ8MCkhPSh0fDApKXtpZihyPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWlmKChjW3IrMTI+PjJdfDApPT0ob3wwKSl7YnJlYWt9WGIoKX19d2hpbGUoMCk7aWYoKGd8MCk9PShyfDApKXtjWzU1NDJdPWNbNTU0Ml0mfigxPDxzKTticmVha31kb3tpZigoZ3wwKT09KHR8MCkpe2w9Zys4fDB9ZWxzZXtpZihnPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfXM9Zys4fDA7aWYoKGNbcz4+Ml18MCk9PShvfDApKXtsPXM7YnJlYWt9WGIoKX19d2hpbGUoMCk7Y1tyKzEyPj4yXT1nO2NbbD4+Ml09cn19d2hpbGUoMCk7bz1wKygoYXxuKStxKXwwO209YSttfDB9Zz1vKzR8MDtjW2c+PjJdPWNbZz4+Ml0mLTI7Y1twKyhqKzQpPj4yXT1tfDE7Y1twKyhtK2opPj4yXT1tO2c9bT4+PjM7aWYobT4+PjA8MjU2KXttPWc8PDE7ZD0yMjIwOCsobTw8Mil8MDtsPWNbNTU0Ml18MDtnPTE8PGc7ZG97aWYoKGwmZ3wwKT09MCl7Y1s1NTQyXT1sfGc7Zj0yMjIwOCsobSsyPDwyKXwwO2U9ZH1lbHNle2w9MjIyMDgrKG0rMjw8Mil8MDtnPWNbbD4+Ml18MDtpZighKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApKXtmPWw7ZT1nO2JyZWFrfVhiKCl9fXdoaWxlKDApO2NbZj4+Ml09aztjW2UrMTI+PjJdPWs7Y1twKyhqKzgpPj4yXT1lO2NbcCsoaisxMik+PjJdPWQ7YnJlYWt9ZT1tPj4+ODtkb3tpZigoZXwwKT09MCl7ZT0wfWVsc2V7aWYobT4+PjA+MTY3NzcyMTUpe2U9MzE7YnJlYWt9Rz0oZSsxMDQ4MzIwfDApPj4+MTYmODtIPWU8PEc7Rj0oSCs1MjAxOTJ8MCk+Pj4xNiY0O0g9SDw8RjtlPShIKzI0NTc2MHwwKT4+PjE2JjI7ZT0xNC0oRnxHfGUpKyhIPDxlPj4+MTUpfDA7ZT1tPj4+KGUrN3wwKSYxfGU8PDF9fXdoaWxlKDApO2w9MjI0NzIrKGU8PDIpfDA7Y1twKyhqKzI4KT4+Ml09ZTtjW3ArKGorMjApPj4yXT0wO2NbcCsoaisxNik+PjJdPTA7Zj1jWzIyMTcyPj4yXXwwO2c9MTw8ZTtpZigoZiZnfDApPT0wKXtjWzIyMTcyPj4yXT1mfGc7Y1tsPj4yXT1rO2NbcCsoaisyNCk+PjJdPWw7Y1twKyhqKzEyKT4+Ml09aztjW3ArKGorOCk+PjJdPWs7YnJlYWt9bD1jW2w+PjJdfDA7aWYoKGV8MCk9PTMxKXtlPTB9ZWxzZXtlPTI1LShlPj4+MSl8MH1qOmRve2lmKChjW2wrND4+Ml0mLTh8MCkhPShtfDApKXtlPW08PGU7d2hpbGUoMSl7Zz1sKyhlPj4+MzE8PDIpKzE2fDA7Zj1jW2c+PjJdfDA7aWYoKGZ8MCk9PTApe2JyZWFrfWlmKChjW2YrND4+Ml0mLTh8MCk9PShtfDApKXtkPWY7YnJlYWsgan1lbHNle2U9ZTw8MTtsPWZ9fWlmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2c+PjJdPWs7Y1twKyhqKzI0KT4+Ml09bDtjW3ArKGorMTIpPj4yXT1rO2NbcCsoais4KT4+Ml09azticmVhayBofX1lbHNle2Q9bH19d2hpbGUoMCk7Zj1kKzh8MDtlPWNbZj4+Ml18MDtnPWNbMjIxODQ+PjJdfDA7aWYoZD4+PjA8Zz4+PjApe1hiKCl9aWYoZT4+PjA8Zz4+PjApe1hiKCl9ZWxzZXtjW2UrMTI+PjJdPWs7Y1tmPj4yXT1rO2NbcCsoais4KT4+Ml09ZTtjW3ArKGorMTIpPj4yXT1kO2NbcCsoaisyNCk+PjJdPTA7YnJlYWt9fWVsc2V7SD0oY1syMjE4MD4+Ml18MCkrbXwwO2NbMjIxODA+PjJdPUg7Y1syMjE5Mj4+Ml09aztjW3ArKGorNCk+PjJdPUh8MX19d2hpbGUoMCk7SD1wKyhofDgpfDA7aT1iO3JldHVybiBIfDB9ZT0yMjYxNnwwO3doaWxlKDEpe2Q9Y1tlPj4yXXwwO2lmKCEoZD4+PjA+cj4+PjApPyhuPWNbZSs0Pj4yXXwwLG09ZCtufDAsbT4+PjA+cj4+PjApOjApe2JyZWFrfWU9Y1tlKzg+PjJdfDB9ZT1kKyhuKyAtMzkpfDA7aWYoKGUmN3wwKT09MCl7ZT0wfWVsc2V7ZT0wLWUmN31kPWQrKG4rIC00NytlKXwwO2Q9ZD4+PjA8KHIrMTZ8MCk+Pj4wP3I6ZDtlPWQrOHwwO2Y9cCs4fDA7aWYoKGYmN3wwKT09MCl7Zj0wfWVsc2V7Zj0wLWYmN31IPXErIC00MC1mfDA7Y1syMjE5Mj4+Ml09cCtmO2NbMjIxODA+PjJdPUg7Y1twKyhmKzQpPj4yXT1IfDE7Y1twKyhxKyAtMzYpPj4yXT00MDtjWzIyMTk2Pj4yXT1jWzIyNjU2Pj4yXTtjW2QrND4+Ml09Mjc7Y1tlKzA+PjJdPWNbMjI2MTY+PjJdO2NbZSs0Pj4yXT1jWzIyNjIwPj4yXTtjW2UrOD4+Ml09Y1syMjYyND4+Ml07Y1tlKzEyPj4yXT1jWzIyNjI4Pj4yXTtjWzIyNjE2Pj4yXT1wO2NbMjI2MjA+PjJdPXE7Y1syMjYyOD4+Ml09MDtjWzIyNjI0Pj4yXT1lO2U9ZCsyOHwwO2NbZT4+Ml09NztpZigoZCszMnwwKT4+PjA8bT4+PjApe2Rve0g9ZTtlPWUrNHwwO2NbZT4+Ml09N313aGlsZSgoSCs4fDApPj4+MDxtPj4+MCl9aWYoKGR8MCkhPShyfDApKXtkPWQtcnwwO2U9cisoZCs0KXwwO2NbZT4+Ml09Y1tlPj4yXSYtMjtjW3IrND4+Ml09ZHwxO2NbcitkPj4yXT1kO2U9ZD4+PjM7aWYoZD4+PjA8MjU2KXtnPWU8PDE7ZD0yMjIwOCsoZzw8Mil8MDtmPWNbNTU0Ml18MDtlPTE8PGU7ZG97aWYoKGYmZXwwKT09MCl7Y1s1NTQyXT1mfGU7az0yMjIwOCsoZysyPDwyKXwwO2o9ZH1lbHNle2Y9MjIyMDgrKGcrMjw8Mil8MDtlPWNbZj4+Ml18MDtpZighKGU+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApKXtrPWY7aj1lO2JyZWFrfVhiKCl9fXdoaWxlKDApO2Nbaz4+Ml09cjtjW2orMTI+PjJdPXI7Y1tyKzg+PjJdPWo7Y1tyKzEyPj4yXT1kO2JyZWFrfWU9ZD4+Pjg7aWYoKGV8MCkhPTApe2lmKGQ+Pj4wPjE2Nzc3MjE1KXtlPTMxfWVsc2V7Rz0oZSsxMDQ4MzIwfDApPj4+MTYmODtIPWU8PEc7Rj0oSCs1MjAxOTJ8MCk+Pj4xNiY0O0g9SDw8RjtlPShIKzI0NTc2MHwwKT4+PjE2JjI7ZT0xNC0oRnxHfGUpKyhIPDxlPj4+MTUpfDA7ZT1kPj4+KGUrN3wwKSYxfGU8PDF9fWVsc2V7ZT0wfWo9MjI0NzIrKGU8PDIpfDA7Y1tyKzI4Pj4yXT1lO2NbcisyMD4+Ml09MDtjW3IrMTY+PjJdPTA7Zj1jWzIyMTcyPj4yXXwwO2c9MTw8ZTtpZigoZiZnfDApPT0wKXtjWzIyMTcyPj4yXT1mfGc7Y1tqPj4yXT1yO2NbcisyND4+Ml09ajtjW3IrMTI+PjJdPXI7Y1tyKzg+PjJdPXI7YnJlYWt9Zj1jW2o+PjJdfDA7aWYoKGV8MCk9PTMxKXtlPTB9ZWxzZXtlPTI1LShlPj4+MSl8MH1rOmRve2lmKChjW2YrND4+Ml0mLTh8MCkhPShkfDApKXtlPWQ8PGU7d2hpbGUoMSl7aj1mKyhlPj4+MzE8PDIpKzE2fDA7Zz1jW2o+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWlmKChjW2crND4+Ml0mLTh8MCk9PShkfDApKXtoPWc7YnJlYWsga31lbHNle2U9ZTw8MTtmPWd9fWlmKGo+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2o+PjJdPXI7Y1tyKzI0Pj4yXT1mO2NbcisxMj4+Ml09cjtjW3IrOD4+Ml09cjticmVhayBnfX1lbHNle2g9Zn19d2hpbGUoMCk7Zj1oKzh8MDtlPWNbZj4+Ml18MDtkPWNbMjIxODQ+PjJdfDA7aWYoaD4+PjA8ZD4+PjApe1hiKCl9aWYoZT4+PjA8ZD4+PjApe1hiKCl9ZWxzZXtjW2UrMTI+PjJdPXI7Y1tmPj4yXT1yO2Nbcis4Pj4yXT1lO2NbcisxMj4+Ml09aDtjW3IrMjQ+PjJdPTA7YnJlYWt9fX1lbHNle0g9Y1syMjE4ND4+Ml18MDtpZigoSHwwKT09MHxwPj4+MDxIPj4+MCl7Y1syMjE4ND4+Ml09cH1jWzIyNjE2Pj4yXT1wO2NbMjI2MjA+PjJdPXE7Y1syMjYyOD4+Ml09MDtjWzIyMjA0Pj4yXT1jWzU2NjBdO2NbMjIyMDA+PjJdPS0xO2Q9MDtkb3tIPWQ8PDE7Rz0yMjIwOCsoSDw8Mil8MDtjWzIyMjA4KyhIKzM8PDIpPj4yXT1HO2NbMjIyMDgrKEgrMjw8Mik+PjJdPUc7ZD1kKzF8MH13aGlsZSgoZHwwKSE9MzIpO2Q9cCs4fDA7aWYoKGQmN3wwKT09MCl7ZD0wfWVsc2V7ZD0wLWQmN31IPXErIC00MC1kfDA7Y1syMjE5Mj4+Ml09cCtkO2NbMjIxODA+PjJdPUg7Y1twKyhkKzQpPj4yXT1IfDE7Y1twKyhxKyAtMzYpPj4yXT00MDtjWzIyMTk2Pj4yXT1jWzIyNjU2Pj4yXX19d2hpbGUoMCk7ZD1jWzIyMTgwPj4yXXwwO2lmKGQ+Pj4wPmE+Pj4wKXtHPWQtYXwwO2NbMjIxODA+PjJdPUc7SD1jWzIyMTkyPj4yXXwwO2NbMjIxOTI+PjJdPUgrYTtjW0grKGErNCk+PjJdPUd8MTtjW0grND4+Ml09YXwzO0g9SCs4fDA7aT1iO3JldHVybiBIfDB9fWNbKGJiKCl8MCk+PjJdPTEyO0g9MDtpPWI7cmV0dXJuIEh8MH1mdW5jdGlvbiB2bihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MDtiPWk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59cT1hKyAtOHwwO3I9Y1syMjE4ND4+Ml18MDtpZihxPj4+MDxyPj4+MCl7WGIoKX1vPWNbYSsgLTQ+PjJdfDA7bj1vJjM7aWYoKG58MCk9PTEpe1hiKCl9aj1vJi04O2g9YSsoaisgLTgpfDA7ZG97aWYoKG8mMXwwKT09MCl7dT1jW3E+PjJdfDA7aWYoKG58MCk9PTApe2k9YjtyZXR1cm59cT0tOC11fDA7bz1hK3F8MDtuPXUranwwO2lmKG8+Pj4wPHI+Pj4wKXtYYigpfWlmKChvfDApPT0oY1syMjE4OD4+Ml18MCkpe2Q9YSsoaisgLTQpfDA7aWYoKGNbZD4+Ml0mM3wwKSE9Myl7ZD1vO209bjticmVha31jWzIyMTc2Pj4yXT1uO2NbZD4+Ml09Y1tkPj4yXSYtMjtjW2ErKHErNCk+PjJdPW58MTtjW2g+PjJdPW47aT1iO3JldHVybn10PXU+Pj4zO2lmKHU+Pj4wPDI1Nil7ZD1jW2ErKHErOCk+PjJdfDA7bT1jW2ErKHErMTIpPj4yXXwwO3A9MjIyMDgrKHQ8PDE8PDIpfDA7aWYoKGR8MCkhPShwfDApKXtpZihkPj4+MDxyPj4+MCl7WGIoKX1pZigoY1tkKzEyPj4yXXwwKSE9KG98MCkpe1hiKCl9fWlmKChtfDApPT0oZHwwKSl7Y1s1NTQyXT1jWzU1NDJdJn4oMTw8dCk7ZD1vO209bjticmVha31pZigobXwwKSE9KHB8MCkpe2lmKG0+Pj4wPHI+Pj4wKXtYYigpfXA9bSs4fDA7aWYoKGNbcD4+Ml18MCk9PShvfDApKXtzPXB9ZWxzZXtYYigpfX1lbHNle3M9bSs4fDB9Y1tkKzEyPj4yXT1tO2Nbcz4+Ml09ZDtkPW87bT1uO2JyZWFrfXM9Y1thKyhxKzI0KT4+Ml18MDt0PWNbYSsocSsxMik+PjJdfDA7ZG97aWYoKHR8MCk9PShvfDApKXt1PWErKHErMjApfDA7dD1jW3U+PjJdfDA7aWYoKHR8MCk9PTApe3U9YSsocSsxNil8MDt0PWNbdT4+Ml18MDtpZigodHwwKT09MCl7cD0wO2JyZWFrfX13aGlsZSgxKXt3PXQrMjB8MDt2PWNbdz4+Ml18MDtpZigodnwwKSE9MCl7dD12O3U9dztjb250aW51ZX12PXQrMTZ8MDt3PWNbdj4+Ml18MDtpZigod3wwKT09MCl7YnJlYWt9ZWxzZXt0PXc7dT12fX1pZih1Pj4+MDxyPj4+MCl7WGIoKX1lbHNle2NbdT4+Ml09MDtwPXQ7YnJlYWt9fWVsc2V7dT1jW2ErKHErOCk+PjJdfDA7aWYodT4+PjA8cj4+PjApe1hiKCl9cj11KzEyfDA7aWYoKGNbcj4+Ml18MCkhPShvfDApKXtYYigpfXY9dCs4fDA7aWYoKGNbdj4+Ml18MCk9PShvfDApKXtjW3I+PjJdPXQ7Y1t2Pj4yXT11O3A9dDticmVha31lbHNle1hiKCl9fX13aGlsZSgwKTtpZigoc3wwKSE9MCl7dD1jW2ErKHErMjgpPj4yXXwwO3I9MjI0NzIrKHQ8PDIpfDA7aWYoKG98MCk9PShjW3I+PjJdfDApKXtjW3I+PjJdPXA7aWYoKHB8MCk9PTApe2NbMjIxNzI+PjJdPWNbMjIxNzI+PjJdJn4oMTw8dCk7ZD1vO209bjticmVha319ZWxzZXtpZihzPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfXI9cysxNnwwO2lmKChjW3I+PjJdfDApPT0ob3wwKSl7Y1tyPj4yXT1wfWVsc2V7Y1tzKzIwPj4yXT1wfWlmKChwfDApPT0wKXtkPW87bT1uO2JyZWFrfX1pZihwPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWNbcCsyND4+Ml09cztyPWNbYSsocSsxNik+PjJdfDA7ZG97aWYoKHJ8MCkhPTApe2lmKHI+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW3ArMTY+PjJdPXI7Y1tyKzI0Pj4yXT1wO2JyZWFrfX19d2hpbGUoMCk7cT1jW2ErKHErMjApPj4yXXwwO2lmKChxfDApIT0wKXtpZihxPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1twKzIwPj4yXT1xO2NbcSsyND4+Ml09cDtkPW87bT1uO2JyZWFrfX1lbHNle2Q9bzttPW59fWVsc2V7ZD1vO209bn19ZWxzZXtkPXE7bT1qfX13aGlsZSgwKTtpZighKGQ+Pj4wPGg+Pj4wKSl7WGIoKX1uPWErKGorIC00KXwwO289Y1tuPj4yXXwwO2lmKChvJjF8MCk9PTApe1hiKCl9aWYoKG8mMnwwKT09MCl7aWYoKGh8MCk9PShjWzIyMTkyPj4yXXwwKSl7dz0oY1syMjE4MD4+Ml18MCkrbXwwO2NbMjIxODA+PjJdPXc7Y1syMjE5Mj4+Ml09ZDtjW2QrND4+Ml09d3wxO2lmKChkfDApIT0oY1syMjE4OD4+Ml18MCkpe2k9YjtyZXR1cm59Y1syMjE4OD4+Ml09MDtjWzIyMTc2Pj4yXT0wO2k9YjtyZXR1cm59aWYoKGh8MCk9PShjWzIyMTg4Pj4yXXwwKSl7dz0oY1syMjE3Nj4+Ml18MCkrbXwwO2NbMjIxNzY+PjJdPXc7Y1syMjE4OD4+Ml09ZDtjW2QrND4+Ml09d3wxO2NbZCt3Pj4yXT13O2k9YjtyZXR1cm59bT0obyYtOCkrbXwwO249bz4+PjM7ZG97aWYoIShvPj4+MDwyNTYpKXtsPWNbYSsoaisxNik+PjJdfDA7cT1jW2ErKGp8NCk+PjJdfDA7ZG97aWYoKHF8MCk9PShofDApKXtvPWErKGorMTIpfDA7bj1jW28+PjJdfDA7aWYoKG58MCk9PTApe289YSsoais4KXwwO249Y1tvPj4yXXwwO2lmKChufDApPT0wKXtrPTA7YnJlYWt9fXdoaWxlKDEpe3A9bisyMHwwO3E9Y1twPj4yXXwwO2lmKChxfDApIT0wKXtuPXE7bz1wO2NvbnRpbnVlfXA9bisxNnwwO3E9Y1twPj4yXXwwO2lmKChxfDApPT0wKXticmVha31lbHNle249cTtvPXB9fWlmKG8+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW28+PjJdPTA7az1uO2JyZWFrfX1lbHNle289Y1thK2o+PjJdfDA7aWYobz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1wPW8rMTJ8MDtpZigoY1twPj4yXXwwKSE9KGh8MCkpe1hiKCl9bj1xKzh8MDtpZigoY1tuPj4yXXwwKT09KGh8MCkpe2NbcD4+Ml09cTtjW24+PjJdPW87az1xO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2lmKChsfDApIT0wKXtuPWNbYSsoaisyMCk+PjJdfDA7bz0yMjQ3Misobjw8Mil8MDtpZigoaHwwKT09KGNbbz4+Ml18MCkpe2Nbbz4+Ml09aztpZigoa3wwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxuKTticmVha319ZWxzZXtpZihsPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfW49bCsxNnwwO2lmKChjW24+PjJdfDApPT0oaHwwKSl7Y1tuPj4yXT1rfWVsc2V7Y1tsKzIwPj4yXT1rfWlmKChrfDApPT0wKXticmVha319aWYoaz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2srMjQ+PjJdPWw7aD1jW2ErKGorOCk+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKGg+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2srMTY+PjJdPWg7Y1toKzI0Pj4yXT1rO2JyZWFrfX19d2hpbGUoMCk7aD1jW2ErKGorMTIpPj4yXXwwO2lmKChofDApIT0wKXtpZihoPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1trKzIwPj4yXT1oO2NbaCsyND4+Ml09azticmVha319fX1lbHNle2s9Y1thK2o+PjJdfDA7YT1jW2ErKGp8NCk+PjJdfDA7aj0yMjIwOCsobjw8MTw8Mil8MDtpZigoa3wwKSE9KGp8MCkpe2lmKGs+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9aWYoKGNbaysxMj4+Ml18MCkhPShofDApKXtYYigpfX1pZigoYXwwKT09KGt8MCkpe2NbNTU0Ml09Y1s1NTQyXSZ+KDE8PG4pO2JyZWFrfWlmKChhfDApIT0oanwwKSl7aWYoYT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1qPWErOHwwO2lmKChjW2o+PjJdfDApPT0oaHwwKSl7bD1qfWVsc2V7WGIoKX19ZWxzZXtsPWErOHwwfWNbaysxMj4+Ml09YTtjW2w+PjJdPWt9fXdoaWxlKDApO2NbZCs0Pj4yXT1tfDE7Y1tkK20+PjJdPW07aWYoKGR8MCk9PShjWzIyMTg4Pj4yXXwwKSl7Y1syMjE3Nj4+Ml09bTtpPWI7cmV0dXJufX1lbHNle2Nbbj4+Ml09byYtMjtjW2QrND4+Ml09bXwxO2NbZCttPj4yXT1tfWg9bT4+PjM7aWYobT4+PjA8MjU2KXthPWg8PDE7ZT0yMjIwOCsoYTw8Mil8MDtqPWNbNTU0Ml18MDtoPTE8PGg7aWYoKGomaHwwKSE9MCl7aD0yMjIwOCsoYSsyPDwyKXwwO2E9Y1toPj4yXXwwO2lmKGE+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtmPWg7Zz1hfX1lbHNle2NbNTU0Ml09anxoO2Y9MjIyMDgrKGErMjw8Mil8MDtnPWV9Y1tmPj4yXT1kO2NbZysxMj4+Ml09ZDtjW2QrOD4+Ml09ZztjW2QrMTI+PjJdPWU7aT1iO3JldHVybn1mPW0+Pj44O2lmKChmfDApIT0wKXtpZihtPj4+MD4xNjc3NzIxNSl7Zj0zMX1lbHNle3Y9KGYrMTA0ODMyMHwwKT4+PjE2Jjg7dz1mPDx2O3U9KHcrNTIwMTkyfDApPj4+MTYmNDt3PXc8PHU7Zj0odysyNDU3NjB8MCk+Pj4xNiYyO2Y9MTQtKHV8dnxmKSsodzw8Zj4+PjE1KXwwO2Y9bT4+PihmKzd8MCkmMXxmPDwxfX1lbHNle2Y9MH1nPTIyNDcyKyhmPDwyKXwwO2NbZCsyOD4+Ml09ZjtjW2QrMjA+PjJdPTA7Y1tkKzE2Pj4yXT0wO2E9Y1syMjE3Mj4+Ml18MDtoPTE8PGY7YTpkb3tpZigoYSZofDApIT0wKXtnPWNbZz4+Ml18MDtpZigoZnwwKT09MzEpe2Y9MH1lbHNle2Y9MjUtKGY+Pj4xKXwwfWI6ZG97aWYoKGNbZys0Pj4yXSYtOHwwKSE9KG18MCkpe2Y9bTw8ZjthPWc7d2hpbGUoMSl7aD1hKyhmPj4+MzE8PDIpKzE2fDA7Zz1jW2g+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWlmKChjW2crND4+Ml0mLTh8MCk9PShtfDApKXtlPWc7YnJlYWsgYn1lbHNle2Y9Zjw8MTthPWd9fWlmKGg+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2g+PjJdPWQ7Y1tkKzI0Pj4yXT1hO2NbZCsxMj4+Ml09ZDtjW2QrOD4+Ml09ZDticmVhayBhfX1lbHNle2U9Z319d2hpbGUoMCk7Zz1lKzh8MDtmPWNbZz4+Ml18MDtoPWNbMjIxODQ+PjJdfDA7aWYoZT4+PjA8aD4+PjApe1hiKCl9aWYoZj4+PjA8aD4+PjApe1hiKCl9ZWxzZXtjW2YrMTI+PjJdPWQ7Y1tnPj4yXT1kO2NbZCs4Pj4yXT1mO2NbZCsxMj4+Ml09ZTtjW2QrMjQ+PjJdPTA7YnJlYWt9fWVsc2V7Y1syMjE3Mj4+Ml09YXxoO2NbZz4+Ml09ZDtjW2QrMjQ+PjJdPWc7Y1tkKzEyPj4yXT1kO2NbZCs4Pj4yXT1kfX13aGlsZSgwKTt3PShjWzIyMjAwPj4yXXwwKSsgLTF8MDtjWzIyMjAwPj4yXT13O2lmKCh3fDApPT0wKXtkPTIyNjI0fDB9ZWxzZXtpPWI7cmV0dXJufXdoaWxlKDEpe2Q9Y1tkPj4yXXwwO2lmKChkfDApPT0wKXticmVha31lbHNle2Q9ZCs4fDB9fWNbMjIyMDA+PjJdPS0xO2k9YjtyZXR1cm59ZnVuY3Rpb24gd24oYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtkPWk7aWYoKGF8MCk9PTApe3I9dW4oYil8MDtpPWQ7cmV0dXJuIHJ8MH1pZihiPj4+MD40Mjk0OTY3MjMxKXtjWyhiYigpfDApPj4yXT0xMjtyPTA7aT1kO3JldHVybiByfDB9aWYoYj4+PjA8MTEpe2Y9MTZ9ZWxzZXtmPWIrMTEmLTh9ZT1hKyAtNHwwO2s9Y1tlPj4yXXwwO2w9ayYtODtvPWwrIC04fDA7aD1hK298MDttPWNbMjIxODQ+PjJdfDA7aWYoKGErIC04fDApPj4+MDxtPj4+MCl7WGIoKX1yPWsmMztpZighKChyfDApIT0xJihvfDApPi04KSl7WGIoKX1vPWx8NDtxPWErKG8rIC04KXwwO3A9Y1txPj4yXXwwO2lmKChwJjF8MCk9PTApe1hiKCl9ZG97aWYoKHJ8MCk9PTApe2lmKCEoZj4+PjA8MjU2fGw+Pj4wPChmfDQpPj4+MCk/ISgobC1mfDApPj4+MD5jWzIyNjQ4Pj4yXTw8MT4+PjApOjApe3I9YTtpPWQ7cmV0dXJuIHJ8MH19ZWxzZXtpZighKGw+Pj4wPGY+Pj4wKSl7Zz1sLWZ8MDtpZighKGc+Pj4wPjE1KSl7cj1hO2k9ZDtyZXR1cm4gcnwwfWNbZT4+Ml09ayYxfGZ8MjtjW2ErKChmfDQpKyAtOCk+PjJdPWd8MztjW3E+PjJdPWNbcT4+Ml18MTt4bihhKyhmKyAtOCl8MCxnKTtyPWE7aT1kO3JldHVybiByfDB9aWYoKGh8MCk9PShjWzIyMTkyPj4yXXwwKSl7Zz0oY1syMjE4MD4+Ml18MCkrbHwwO2lmKCEoZz4+PjA+Zj4+PjApKXticmVha31yPWctZnwwO2NbZT4+Ml09ayYxfGZ8MjtjW2ErKChmfDQpKyAtOCk+PjJdPXJ8MTtjWzIyMTkyPj4yXT1hKyhmKyAtOCk7Y1syMjE4MD4+Ml09cjtyPWE7aT1kO3JldHVybiByfDB9aWYoKGh8MCk9PShjWzIyMTg4Pj4yXXwwKSl7Zz0oY1syMjE3Nj4+Ml18MCkrbHwwO2lmKGc+Pj4wPGY+Pj4wKXticmVha31oPWctZnwwO2lmKGg+Pj4wPjE1KXtjW2U+PjJdPWsmMXxmfDI7Y1thKygoZnw0KSsgLTgpPj4yXT1ofDE7Y1thKyhnKyAtOCk+PjJdPWg7ZT1hKyhnKyAtNCl8MDtjW2U+PjJdPWNbZT4+Ml0mLTI7ZT1hKyhmKyAtOCl8MH1lbHNle2NbZT4+Ml09ayYxfGd8MjtlPWErKGcrIC00KXwwO2NbZT4+Ml09Y1tlPj4yXXwxO2U9MDtoPTB9Y1syMjE3Nj4+Ml09aDtjWzIyMTg4Pj4yXT1lO3I9YTtpPWQ7cmV0dXJuIHJ8MH1pZigocCYyfDApPT0wPyhnPShwJi04KStsfDAsIShnPj4+MDxmPj4+MCkpOjApe2s9Zy1mfDA7Yj1wPj4+Mztkb3tpZighKHA+Pj4wPDI1Nikpe249Y1thKyhsKzE2KT4+Ml18MDtvPWNbYStvPj4yXXwwO2Rve2lmKChvfDApPT0oaHwwKSl7Yj1hKyhsKzEyKXwwO289Y1tiPj4yXXwwO2lmKChvfDApPT0wKXtiPWErKGwrOCl8MDtvPWNbYj4+Ml18MDtpZigob3wwKT09MCl7aj0wO2JyZWFrfX13aGlsZSgxKXtxPW8rMjB8MDtwPWNbcT4+Ml18MDtpZigocHwwKSE9MCl7bz1wO2I9cTtjb250aW51ZX1wPW8rMTZ8MDtxPWNbcD4+Ml18MDtpZigocXwwKT09MCl7YnJlYWt9ZWxzZXtvPXE7Yj1wfX1pZihiPj4+MDxtPj4+MCl7WGIoKX1lbHNle2NbYj4+Ml09MDtqPW87YnJlYWt9fWVsc2V7Yj1jW2ErbD4+Ml18MDtpZihiPj4+MDxtPj4+MCl7WGIoKX1wPWIrMTJ8MDtpZigoY1twPj4yXXwwKSE9KGh8MCkpe1hiKCl9bT1vKzh8MDtpZigoY1ttPj4yXXwwKT09KGh8MCkpe2NbcD4+Ml09bztjW20+PjJdPWI7aj1vO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2lmKChufDApIT0wKXtvPWNbYSsobCsyMCk+PjJdfDA7bT0yMjQ3Misobzw8Mil8MDtpZigoaHwwKT09KGNbbT4+Ml18MCkpe2NbbT4+Ml09ajtpZigoanwwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxvKTticmVha319ZWxzZXtpZihuPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfW09bisxNnwwO2lmKChjW20+PjJdfDApPT0oaHwwKSl7Y1ttPj4yXT1qfWVsc2V7Y1tuKzIwPj4yXT1qfWlmKChqfDApPT0wKXticmVha319aWYoaj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2orMjQ+PjJdPW47aD1jW2ErKGwrOCk+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKGg+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2orMTY+PjJdPWg7Y1toKzI0Pj4yXT1qO2JyZWFrfX19d2hpbGUoMCk7aD1jW2ErKGwrMTIpPj4yXXwwO2lmKChofDApPT0wKXticmVha31pZihoPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1tqKzIwPj4yXT1oO2NbaCsyND4+Ml09ajticmVha319fWVsc2V7aj1jW2ErbD4+Ml18MDtsPWNbYStvPj4yXXwwO289MjIyMDgrKGI8PDE8PDIpfDA7aWYoKGp8MCkhPShvfDApKXtpZihqPj4+MDxtPj4+MCl7WGIoKX1pZigoY1tqKzEyPj4yXXwwKSE9KGh8MCkpe1hiKCl9fWlmKChsfDApPT0oanwwKSl7Y1s1NTQyXT1jWzU1NDJdJn4oMTw8Yik7YnJlYWt9ZG97aWYoKGx8MCk9PShvfDApKXtuPWwrOHwwfWVsc2V7aWYobD4+PjA8bT4+PjApe1hiKCl9bT1sKzh8MDtpZigoY1ttPj4yXXwwKT09KGh8MCkpe249bTticmVha31YYigpfX13aGlsZSgwKTtjW2orMTI+PjJdPWw7Y1tuPj4yXT1qfX13aGlsZSgwKTtpZihrPj4+MDwxNil7Y1tlPj4yXT1nfGNbZT4+Ml0mMXwyO3I9YSsoKGd8NCkrIC04KXwwO2Nbcj4+Ml09Y1tyPj4yXXwxO3I9YTtpPWQ7cmV0dXJuIHJ8MH1lbHNle2NbZT4+Ml09Y1tlPj4yXSYxfGZ8MjtjW2ErKChmfDQpKyAtOCk+PjJdPWt8MztyPWErKChnfDQpKyAtOCl8MDtjW3I+PjJdPWNbcj4+Ml18MTt4bihhKyhmKyAtOCl8MCxrKTtyPWE7aT1kO3JldHVybiByfDB9fX19d2hpbGUoMCk7Zj11bihiKXwwO2lmKChmfDApPT0wKXtyPTA7aT1kO3JldHVybiByfDB9cj1jW2U+PjJdfDA7cj0ociYtOCktKChyJjN8MCk9PTA/ODo0KXwwO0xuKGZ8MCxhfDAsKHI+Pj4wPGI+Pj4wP3I6Yil8MCl8MDt2bihhKTtyPWY7aT1kO3JldHVybiByfDB9ZnVuY3Rpb24geG4oYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTA7ZD1pO2g9YStifDA7bD1jW2ErND4+Ml18MDtkb3tpZigobCYxfDApPT0wKXtwPWNbYT4+Ml18MDtpZigobCYzfDApPT0wKXtpPWQ7cmV0dXJufWw9YSsoMC1wKXwwO209cCtifDA7cT1jWzIyMTg0Pj4yXXwwO2lmKGw+Pj4wPHE+Pj4wKXtYYigpfWlmKChsfDApPT0oY1syMjE4OD4+Ml18MCkpe2U9YSsoYis0KXwwO2lmKChjW2U+PjJdJjN8MCkhPTMpe2U9bDtuPW07YnJlYWt9Y1syMjE3Nj4+Ml09bTtjW2U+PjJdPWNbZT4+Ml0mLTI7Y1thKyg0LXApPj4yXT1tfDE7Y1toPj4yXT1tO2k9ZDtyZXR1cm59cz1wPj4+MztpZihwPj4+MDwyNTYpe2U9Y1thKyg4LXApPj4yXXwwO249Y1thKygxMi1wKT4+Ml18MDtvPTIyMjA4KyhzPDwxPDwyKXwwO2lmKChlfDApIT0ob3wwKSl7aWYoZT4+PjA8cT4+PjApe1hiKCl9aWYoKGNbZSsxMj4+Ml18MCkhPShsfDApKXtYYigpfX1pZigobnwwKT09KGV8MCkpe2NbNTU0Ml09Y1s1NTQyXSZ+KDE8PHMpO2U9bDtuPW07YnJlYWt9aWYoKG58MCkhPShvfDApKXtpZihuPj4+MDxxPj4+MCl7WGIoKX1vPW4rOHwwO2lmKChjW28+PjJdfDApPT0obHwwKSl7cj1vfWVsc2V7WGIoKX19ZWxzZXtyPW4rOHwwfWNbZSsxMj4+Ml09bjtjW3I+PjJdPWU7ZT1sO249bTticmVha31yPWNbYSsoMjQtcCk+PjJdfDA7dD1jW2ErKDEyLXApPj4yXXwwO2Rve2lmKCh0fDApPT0obHwwKSl7dT0xNi1wfDA7dD1hKyh1KzQpfDA7cz1jW3Q+PjJdfDA7aWYoKHN8MCk9PTApe3Q9YSt1fDA7cz1jW3Q+PjJdfDA7aWYoKHN8MCk9PTApe289MDticmVha319d2hpbGUoMSl7dT1zKzIwfDA7dj1jW3U+PjJdfDA7aWYoKHZ8MCkhPTApe3M9djt0PXU7Y29udGludWV9dj1zKzE2fDA7dT1jW3Y+PjJdfDA7aWYoKHV8MCk9PTApe2JyZWFrfWVsc2V7cz11O3Q9dn19aWYodD4+PjA8cT4+PjApe1hiKCl9ZWxzZXtjW3Q+PjJdPTA7bz1zO2JyZWFrfX1lbHNle3M9Y1thKyg4LXApPj4yXXwwO2lmKHM+Pj4wPHE+Pj4wKXtYYigpfXU9cysxMnwwO2lmKChjW3U+PjJdfDApIT0obHwwKSl7WGIoKX1xPXQrOHwwO2lmKChjW3E+PjJdfDApPT0obHwwKSl7Y1t1Pj4yXT10O2NbcT4+Ml09cztvPXQ7YnJlYWt9ZWxzZXtYYigpfX19d2hpbGUoMCk7aWYoKHJ8MCkhPTApe3E9Y1thKygyOC1wKT4+Ml18MDtzPTIyNDcyKyhxPDwyKXwwO2lmKChsfDApPT0oY1tzPj4yXXwwKSl7Y1tzPj4yXT1vO2lmKChvfDApPT0wKXtjWzIyMTcyPj4yXT1jWzIyMTcyPj4yXSZ+KDE8PHEpO2U9bDtuPW07YnJlYWt9fWVsc2V7aWYocj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1xPXIrMTZ8MDtpZigoY1txPj4yXXwwKT09KGx8MCkpe2NbcT4+Ml09b31lbHNle2NbcisyMD4+Ml09b31pZigob3wwKT09MCl7ZT1sO249bTticmVha319aWYobz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW28rMjQ+PjJdPXI7cD0xNi1wfDA7cT1jW2ErcD4+Ml18MDtkb3tpZigocXwwKSE9MCl7aWYocT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbbysxNj4+Ml09cTtjW3ErMjQ+PjJdPW87YnJlYWt9fX13aGlsZSgwKTtwPWNbYSsocCs0KT4+Ml18MDtpZigocHwwKSE9MCl7aWYocD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbbysyMD4+Ml09cDtjW3ArMjQ+PjJdPW87ZT1sO249bTticmVha319ZWxzZXtlPWw7bj1tfX1lbHNle2U9bDtuPW19fWVsc2V7ZT1hO249Yn19d2hpbGUoMCk7bD1jWzIyMTg0Pj4yXXwwO2lmKGg+Pj4wPGw+Pj4wKXtYYigpfW09YSsoYis0KXwwO289Y1ttPj4yXXwwO2lmKChvJjJ8MCk9PTApe2lmKChofDApPT0oY1syMjE5Mj4+Ml18MCkpe3Y9KGNbMjIxODA+PjJdfDApK258MDtjWzIyMTgwPj4yXT12O2NbMjIxOTI+PjJdPWU7Y1tlKzQ+PjJdPXZ8MTtpZigoZXwwKSE9KGNbMjIxODg+PjJdfDApKXtpPWQ7cmV0dXJufWNbMjIxODg+PjJdPTA7Y1syMjE3Nj4+Ml09MDtpPWQ7cmV0dXJufWlmKChofDApPT0oY1syMjE4OD4+Ml18MCkpe3Y9KGNbMjIxNzY+PjJdfDApK258MDtjWzIyMTc2Pj4yXT12O2NbMjIxODg+PjJdPWU7Y1tlKzQ+PjJdPXZ8MTtjW2Urdj4+Ml09djtpPWQ7cmV0dXJufW49KG8mLTgpK258MDttPW8+Pj4zO2Rve2lmKCEobz4+PjA8MjU2KSl7az1jW2ErKGIrMjQpPj4yXXwwO209Y1thKyhiKzEyKT4+Ml18MDtkb3tpZigobXwwKT09KGh8MCkpe289YSsoYisyMCl8MDttPWNbbz4+Ml18MDtpZigobXwwKT09MCl7bz1hKyhiKzE2KXwwO209Y1tvPj4yXXwwO2lmKChtfDApPT0wKXtqPTA7YnJlYWt9fXdoaWxlKDEpe3E9bSsyMHwwO3A9Y1txPj4yXXwwO2lmKChwfDApIT0wKXttPXA7bz1xO2NvbnRpbnVlfXA9bSsxNnwwO3E9Y1twPj4yXXwwO2lmKChxfDApPT0wKXticmVha31lbHNle209cTtvPXB9fWlmKG8+Pj4wPGw+Pj4wKXtYYigpfWVsc2V7Y1tvPj4yXT0wO2o9bTticmVha319ZWxzZXtvPWNbYSsoYis4KT4+Ml18MDtpZihvPj4+MDxsPj4+MCl7WGIoKX1sPW8rMTJ8MDtpZigoY1tsPj4yXXwwKSE9KGh8MCkpe1hiKCl9cD1tKzh8MDtpZigoY1twPj4yXXwwKT09KGh8MCkpe2NbbD4+Ml09bTtjW3A+PjJdPW87aj1tO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2lmKChrfDApIT0wKXtsPWNbYSsoYisyOCk+PjJdfDA7bT0yMjQ3MisobDw8Mil8MDtpZigoaHwwKT09KGNbbT4+Ml18MCkpe2NbbT4+Ml09ajtpZigoanwwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxsKTticmVha319ZWxzZXtpZihrPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWw9aysxNnwwO2lmKChjW2w+PjJdfDApPT0oaHwwKSl7Y1tsPj4yXT1qfWVsc2V7Y1trKzIwPj4yXT1qfWlmKChqfDApPT0wKXticmVha319aWYoaj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2orMjQ+PjJdPWs7aD1jW2ErKGIrMTYpPj4yXXwwO2Rve2lmKChofDApIT0wKXtpZihoPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1tqKzE2Pj4yXT1oO2NbaCsyND4+Ml09ajticmVha319fXdoaWxlKDApO2g9Y1thKyhiKzIwKT4+Ml18MDtpZigoaHwwKSE9MCl7aWYoaD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbaisyMD4+Ml09aDtjW2grMjQ+PjJdPWo7YnJlYWt9fX19ZWxzZXtqPWNbYSsoYis4KT4+Ml18MDthPWNbYSsoYisxMik+PjJdfDA7Yj0yMjIwOCsobTw8MTw8Mil8MDtpZigoanwwKSE9KGJ8MCkpe2lmKGo+Pj4wPGw+Pj4wKXtYYigpfWlmKChjW2orMTI+PjJdfDApIT0oaHwwKSl7WGIoKX19aWYoKGF8MCk9PShqfDApKXtjWzU1NDJdPWNbNTU0Ml0mfigxPDxtKTticmVha31pZigoYXwwKSE9KGJ8MCkpe2lmKGE+Pj4wPGw+Pj4wKXtYYigpfWI9YSs4fDA7aWYoKGNbYj4+Ml18MCk9PShofDApKXtrPWJ9ZWxzZXtYYigpfX1lbHNle2s9YSs4fDB9Y1tqKzEyPj4yXT1hO2Nbaz4+Ml09an19d2hpbGUoMCk7Y1tlKzQ+PjJdPW58MTtjW2Urbj4+Ml09bjtpZigoZXwwKT09KGNbMjIxODg+PjJdfDApKXtjWzIyMTc2Pj4yXT1uO2k9ZDtyZXR1cm59fWVsc2V7Y1ttPj4yXT1vJi0yO2NbZSs0Pj4yXT1ufDE7Y1tlK24+PjJdPW59YT1uPj4+MztpZihuPj4+MDwyNTYpe2I9YTw8MTtoPTIyMjA4KyhiPDwyKXwwO2o9Y1s1NTQyXXwwO2E9MTw8YTtpZigoaiZhfDApIT0wKXtiPTIyMjA4KyhiKzI8PDIpfDA7YT1jW2I+PjJdfDA7aWYoYT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2c9YjtmPWF9fWVsc2V7Y1s1NTQyXT1qfGE7Zz0yMjIwOCsoYisyPDwyKXwwO2Y9aH1jW2c+PjJdPWU7Y1tmKzEyPj4yXT1lO2NbZSs4Pj4yXT1mO2NbZSsxMj4+Ml09aDtpPWQ7cmV0dXJufWY9bj4+Pjg7aWYoKGZ8MCkhPTApe2lmKG4+Pj4wPjE2Nzc3MjE1KXtmPTMxfWVsc2V7dT0oZisxMDQ4MzIwfDApPj4+MTYmODt2PWY8PHU7dD0odis1MjAxOTJ8MCk+Pj4xNiY0O3Y9djw8dDtmPSh2KzI0NTc2MHwwKT4+PjE2JjI7Zj0xNC0odHx1fGYpKyh2PDxmPj4+MTUpfDA7Zj1uPj4+KGYrN3wwKSYxfGY8PDF9fWVsc2V7Zj0wfWE9MjI0NzIrKGY8PDIpfDA7Y1tlKzI4Pj4yXT1mO2NbZSsyMD4+Ml09MDtjW2UrMTY+PjJdPTA7aD1jWzIyMTcyPj4yXXwwO2c9MTw8ZjtpZigoaCZnfDApPT0wKXtjWzIyMTcyPj4yXT1ofGc7Y1thPj4yXT1lO2NbZSsyND4+Ml09YTtjW2UrMTI+PjJdPWU7Y1tlKzg+PjJdPWU7aT1kO3JldHVybn1nPWNbYT4+Ml18MDtpZigoZnwwKT09MzEpe2Y9MH1lbHNle2Y9MjUtKGY+Pj4xKXwwfWE6ZG97aWYoKGNbZys0Pj4yXSYtOHwwKSE9KG58MCkpe2Y9bjw8ZjthPWc7d2hpbGUoMSl7aD1hKyhmPj4+MzE8PDIpKzE2fDA7Zz1jW2g+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWlmKChjW2crND4+Ml0mLTh8MCk9PShufDApKXticmVhayBhfWVsc2V7Zj1mPDwxO2E9Z319aWYoaD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2g+PjJdPWU7Y1tlKzI0Pj4yXT1hO2NbZSsxMj4+Ml09ZTtjW2UrOD4+Ml09ZTtpPWQ7cmV0dXJufX13aGlsZSgwKTtmPWcrOHwwO2E9Y1tmPj4yXXwwO2g9Y1syMjE4ND4+Ml18MDtpZihnPj4+MDxoPj4+MCl7WGIoKX1pZihhPj4+MDxoPj4+MCl7WGIoKX1jW2ErMTI+PjJdPWU7Y1tmPj4yXT1lO2NbZSs4Pj4yXT1hO2NbZSsxMj4+Ml09ZztjW2UrMjQ+PjJdPTA7aT1kO3JldHVybn1mdW5jdGlvbiB5bihhKXthPWF8MDt2YXIgYj0wO2I9aTtSYihhfDApO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIHpuKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBBbihhKXthPWF8MDtyZXR1cm4gMjI2OTZ9ZnVuY3Rpb24gQm4oYixlLGYsZyl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wO2g9aTtpZihlPj4+MD4zNil7Y1soYmIoKXwwKT4+Ml09MjI7cz0wO3Q9MDtJPXM7aT1oO3JldHVybiB0fDB9az1iKzR8MDtqPWIrMTAwfDA7ZG97bD1jW2s+PjJdfDA7aWYobD4+PjA8KGNbaj4+Ml18MCk+Pj4wKXtjW2s+PjJdPWwrMTtvPWRbbD4+MF18MH1lbHNle289RG4oYil8MH19d2hpbGUoKG98MCk9PTMyfChvKyAtOXwwKT4+PjA8NSk7ZG97aWYoKG98MCk9PTQzfChvfDApPT00NSl7bD0oKG98MCk9PTQ1KTw8MzE+PjMxO209Y1trPj4yXXwwO2lmKG0+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1tKzE7bz1kW20+PjBdfDA7YnJlYWt9ZWxzZXtvPURuKGIpfDA7YnJlYWt9fWVsc2V7bD0wfX13aGlsZSgwKTttPShlfDApPT0wO2Rve2lmKChlJi0xN3wwKT09MCYob3wwKT09NDgpe249Y1trPj4yXXwwO2lmKG4+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1uKzE7bz1kW24+PjBdfDB9ZWxzZXtvPURuKGIpfDB9aWYoKG98MzJ8MCkhPTEyMCl7ZT1tPzg6ZTttPTI4O2JyZWFrfWU9Y1trPj4yXXwwO2lmKGU+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1lKzE7bz1kW2U+PjBdfDB9ZWxzZXtvPURuKGIpfDB9aWYoKGRbbysyMjc0NT4+MF18MCk+MTUpe2lmKChjW2o+PjJdfDApPT0wKXtzPTA7dD0wO0k9cztpPWg7cmV0dXJuIHR8MH1jW2s+PjJdPShjW2s+PjJdfDApKyAtMjtzPTA7dD0wO0k9cztpPWg7cmV0dXJuIHR8MH1lbHNle2U9MTY7bT00M319ZWxzZXtlPW0/MTA6ZTtpZigoZFtvKzIyNzQ1Pj4wXXwwKT4+PjA8ZT4+PjApe209Mjh9ZWxzZXtmPWNbaz4+Ml18MDtpZigoY1tqPj4yXXwwKSE9MCl7Zj1mKyAtMXwwO2Nbaz4+Ml09Zn1jW2IrMTA0Pj4yXT0wO3M9Y1tiKzg+PjJdfDA7Y1tiKzEwOD4+Ml09cy1mO2Nbaj4+Ml09cztjWyhiYigpfDApPj4yXT0yMjtzPTA7dD0wO0k9cztpPWg7cmV0dXJuIHR8MH19fXdoaWxlKDApO2lmKChtfDApPT0yOCl7aWYoKGV8MCk9PTEwKXtlPW8rIC00OHwwO2lmKGU+Pj4wPDEwKXtuPTA7d2hpbGUoMSl7bj1uK2V8MDtlPWNbaz4+Ml18MDtpZihlPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09ZSsxO289ZFtlPj4wXXwwfWVsc2V7bz1EbihiKXwwfWU9bysgLTQ4fDA7aWYoIShlPj4+MDwxMCZuPj4+MDw0Mjk0OTY3MjkpKXticmVha31uPW4qMTB8MH1wPTB9ZWxzZXtuPTA7cD0wfWU9bysgLTQ4fDA7aWYoZT4+PjA8MTApe2Rve3M9Vm4obnwwLHB8MCwxMCwwKXwwO3I9STtxPSgoZXwwKTwwKTw8MzE+PjMxO3Q9fnE7aWYocj4+PjA+dD4+PjB8KHJ8MCk9PSh0fDApJnM+Pj4wPn5lPj4+MCl7YnJlYWt9bj1JbihzfDAscnwwLGV8MCxxfDApfDA7cD1JO2U9Y1trPj4yXXwwO2lmKGU+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1lKzE7bz1kW2U+PjBdfDB9ZWxzZXtvPURuKGIpfDB9ZT1vKyAtNDh8MH13aGlsZShlPj4+MDwxMCYocD4+PjA8NDI5NDk2NzI5fChwfDApPT00Mjk0OTY3Mjkmbj4+PjA8MjU3Njk4MDM3OCkpO2lmKCEoZT4+PjA+OSkpe2U9MTA7bT02OX19fWVsc2V7bT00M319YTpkb3tpZigobXwwKT09NDMpe2lmKChlKyAtMSZlfDApPT0wKXttPWFbMjMwMDgrKChlKjIzfDApPj4+NSY3KT4+MF18MDtyPWFbbysyMjc0NT4+MF18MDtuPXImMjU1O2lmKG4+Pj4wPGU+Pj4wKXtvPW47bj0wO2Rve249b3xuPDxtO289Y1trPj4yXXwwO2lmKG8+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1vKzE7cz1kW28+PjBdfDB9ZWxzZXtzPURuKGIpfDB9cj1hW3MrMjI3NDU+PjBdfDA7bz1yJjI1NX13aGlsZShvPj4+MDxlPj4+MCZuPj4+MDwxMzQyMTc3MjgpO3A9MH1lbHNle3A9MDtuPTA7cz1vfXE9S24oLTEsLTEsbXwwKXwwO289STtpZigociYyNTUpPj4+MD49ZT4+PjB8KHA+Pj4wPm8+Pj4wfChwfDApPT0ob3wwKSZuPj4+MD5xPj4+MCkpe289czttPTY5O2JyZWFrfXdoaWxlKDEpe249T24obnwwLHB8MCxtfDApfDA7cD1JO249ciYyNTV8bjtyPWNbaz4+Ml18MDtpZihyPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09cisxO3M9ZFtyPj4wXXwwfWVsc2V7cz1EbihiKXwwfXI9YVtzKzIyNzQ1Pj4wXXwwO2lmKChyJjI1NSk+Pj4wPj1lPj4+MHwocD4+PjA+bz4+PjB8KHB8MCk9PShvfDApJm4+Pj4wPnE+Pj4wKSl7bz1zO209Njk7YnJlYWsgYX19fXE9YVtvKzIyNzQ1Pj4wXXwwO209cSYyNTU7aWYobT4+PjA8ZT4+PjApe249MDtkb3tuPW0rKGVhKG4sZSl8MCl8MDttPWNbaz4+Ml18MDtpZihtPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09bSsxO3I9ZFttPj4wXXwwfWVsc2V7cj1EbihiKXwwfXE9YVtyKzIyNzQ1Pj4wXXwwO209cSYyNTV9d2hpbGUobT4+PjA8ZT4+PjAmbj4+PjA8MTE5MzA0NjQ3KTtwPTB9ZWxzZXtuPTA7cD0wO3I9b31pZigocSYyNTUpPj4+MDxlPj4+MCl7bT1XbigtMSwtMSxlfDAsMCl8MDtvPUk7d2hpbGUoMSl7aWYocD4+PjA+bz4+PjB8KHB8MCk9PShvfDApJm4+Pj4wPm0+Pj4wKXtvPXI7bT02OTticmVhayBhfXM9Vm4obnwwLHB8MCxlfDAsMCl8MDt0PUk7cT1xJjI1NTtpZih0Pj4+MD40Mjk0OTY3Mjk1fCh0fDApPT0tMSZzPj4+MD5+cT4+PjApe289cjttPTY5O2JyZWFrIGF9bj1JbihxfDAsMCxzfDAsdHwwKXwwO3A9STtxPWNbaz4+Ml18MDtpZihxPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09cSsxO3I9ZFtxPj4wXXwwfWVsc2V7cj1EbihiKXwwfXE9YVtyKzIyNzQ1Pj4wXXwwO2lmKCEoKHEmMjU1KT4+PjA8ZT4+PjApKXtvPXI7bT02OTticmVha319fWVsc2V7bz1yO209Njl9fX13aGlsZSgwKTtpZigobXwwKT09Njkpe2lmKChkW28rMjI3NDU+PjBdfDApPj4+MDxlPj4+MCl7ZG97bT1jW2s+PjJdfDA7aWYobT4+PjA8KGNbaj4+Ml18MCk+Pj4wKXtjW2s+PjJdPW0rMTttPWRbbT4+MF18MH1lbHNle209RG4oYil8MH19d2hpbGUoKGRbbSsyMjc0NT4+MF18MCk+Pj4wPGU+Pj4wKTtjWyhiYigpfDApPj4yXT0zNDtwPWc7bj1mfX1pZigoY1tqPj4yXXwwKSE9MCl7Y1trPj4yXT0oY1trPj4yXXwwKSsgLTF9aWYoIShwPj4+MDxnPj4+MHwocHwwKT09KGd8MCkmbj4+PjA8Zj4+PjApKXtpZigoZiYxfDApPT0wJjA9PTAmKGx8MCk9PTApe2NbKGJiKCl8MCk+PjJdPTM0O3Q9SW4oZnwwLGd8MCwtMSwtMSl8MDtzPUk7ST1zO2k9aDtyZXR1cm4gdHwwfWlmKHA+Pj4wPmc+Pj4wfChwfDApPT0oZ3wwKSZuPj4+MD5mPj4+MCl7Y1soYmIoKXwwKT4+Ml09MzQ7cz1nO3Q9ZjtJPXM7aT1oO3JldHVybiB0fDB9fXQ9KChsfDApPDApPDwzMT4+MzE7dD1IbihuXmx8MCxwXnR8MCxsfDAsdHwwKXwwO3M9STtJPXM7aT1oO3JldHVybiB0fDB9ZnVuY3Rpb24gQ24oYSl7YT1hfDA7dmFyIGI9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7ZT1pO2Y9YSs0fDA7Zz1jW2Y+PjJdfDA7Yj1hKzEwMHwwO2lmKGc+Pj4wPChjW2I+PjJdfDApPj4+MCl7Y1tmPj4yXT1nKzE7aj1kW2c+PjBdfDB9ZWxzZXtqPURuKGEpfDB9aWYoKGp8MCk9PTQzfChqfDApPT00NSl7Zz0oanwwKT09NDUmMTtoPWNbZj4+Ml18MDtpZihoPj4+MDwoY1tiPj4yXXwwKT4+PjApe2NbZj4+Ml09aCsxO2o9ZFtoPj4wXXwwfWVsc2V7aj1EbihhKXwwfWlmKCEoKGorIC00OHwwKT4+PjA8MTApPyhjW2I+PjJdfDApIT0wOjApe2NbZj4+Ml09KGNbZj4+Ml18MCkrIC0xfX1lbHNle2c9MH1pZigoaisgLTQ4fDApPj4+MD45KXtpZigoY1tiPj4yXXwwKT09MCl7az0tMjE0NzQ4MzY0ODtsPTA7ST1rO2k9ZTtyZXR1cm4gbHwwfWNbZj4+Ml09KGNbZj4+Ml18MCkrIC0xO2s9LTIxNDc0ODM2NDg7bD0wO0k9aztpPWU7cmV0dXJuIGx8MH1lbHNle2g9MH13aGlsZSgxKXtoPWorIC00OCtofDA7aj1jW2Y+PjJdfDA7aWYoaj4+PjA8KGNbYj4+Ml18MCk+Pj4wKXtjW2Y+PjJdPWorMTtqPWRbaj4+MF18MH1lbHNle2o9RG4oYSl8MH1sPShqKyAtNDh8MCk+Pj4wPDEwO2lmKCEobCYoaHwwKTwyMTQ3NDgzNjQpKXticmVha31oPWgqMTB8MH1rPSgoaHwwKTwwKTw8MzE+PjMxO2lmKGwpe2Rve2s9Vm4oaHwwLGt8MCwxMCwwKXwwO2g9STtqPUluKGp8MCwoKGp8MCk8MCk8PDMxPj4zMXwwLC00OCwtMSl8MDtoPUluKGp8MCxJfDAsa3wwLGh8MCl8MDtrPUk7aj1jW2Y+PjJdfDA7aWYoaj4+PjA8KGNbYj4+Ml18MCk+Pj4wKXtjW2Y+PjJdPWorMTtqPWRbaj4+MF18MH1lbHNle2o9RG4oYSl8MH19d2hpbGUoKGorIC00OHwwKT4+PjA8MTAmKChrfDApPDIxNDc0ODM2fChrfDApPT0yMTQ3NDgzNiZoPj4+MDwyMDYxNTg0MzAyKSl9aWYoKGorIC00OHwwKT4+PjA8MTApe2Rve2o9Y1tmPj4yXXwwO2lmKGo+Pj4wPChjW2I+PjJdfDApPj4+MCl7Y1tmPj4yXT1qKzE7aj1kW2o+PjBdfDB9ZWxzZXtqPURuKGEpfDB9fXdoaWxlKChqKyAtNDh8MCk+Pj4wPDEwKX1pZigoY1tiPj4yXXwwKSE9MCl7Y1tmPj4yXT0oY1tmPj4yXXwwKSsgLTF9aj0oZ3wwKSE9MDtsPUhuKDAsMCxofDAsa3wwKXwwO2s9aj9JOms7bD1qP2w6aDtJPWs7aT1lO3JldHVybiBsfDB9ZnVuY3Rpb24gRG4oYil7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtlPWk7aD1iKzEwNHwwO2w9Y1toPj4yXXwwO2lmKCEoKGx8MCkhPTA/KGNbYisxMDg+PjJdfDApPj0obHwwKTowKSl7Zz0zfWlmKChnfDApPT0zPyhmPUVuKGIpfDAsKGZ8MCk+PTApOjApe2w9Y1toPj4yXXwwO2g9Y1tiKzg+PjJdfDA7az1jW2IrND4+Ml18MDtpZigobHwwKSE9MD8oaj1sLShjW2IrMTA4Pj4yXXwwKSsgLTF8MCwoaC1rfDApPihqfDApKTowKXtjW2IrMTAwPj4yXT1rK2p9ZWxzZXtnPTh9aWYoKGd8MCk9PTgpe2NbYisxMDA+PjJdPWh9aWYoKGh8MCkhPTApe2w9YisxMDh8MDtjW2w+PjJdPWgrMS1rKyhjW2w+PjJdfDApfWI9aysgLTF8MDtpZigoZFtiPj4wXXwwfDApPT0oZnwwKSl7bD1mO2k9ZTtyZXR1cm4gbHwwfWFbYj4+MF09ZjtsPWY7aT1lO3JldHVybiBsfDB9Y1tiKzEwMD4+Ml09MDtsPS0xO2k9ZTtyZXR1cm4gbHwwfWZ1bmN0aW9uIEVuKGIpe2I9YnwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2c9aTtpPWkrMTZ8MDtlPWc7Zj1iKzh8MDtkb3tpZigoY1tmPj4yXXwwKT09MCl7aj1iKzc0fDA7aD1hW2o+PjBdfDA7YVtqPj4wXT1oKzI1NXxoO2o9YisyMHwwO2g9Yis0NHwwO2lmKChjW2o+PjJdfDApPj4+MD4oY1toPj4yXXwwKT4+PjApe2hjW2NbYiszNj4+Ml0mNjNdKGIsMCwwKXwwfWNbYisxNj4+Ml09MDtjW2IrMjg+PjJdPTA7Y1tqPj4yXT0wO2o9Y1tiPj4yXXwwO2lmKChqJjIwfDApPT0wKXtqPWNbaD4+Ml18MDtjW2Y+PjJdPWo7Y1tiKzQ+PjJdPWo7YnJlYWt9aWYoKGomNHwwKT09MCl7aj0tMTtpPWc7cmV0dXJuIGp8MH1jW2I+PjJdPWp8MzI7aj0tMTtpPWc7cmV0dXJuIGp8MH19d2hpbGUoMCk7aWYoKGhjW2NbYiszMj4+Ml0mNjNdKGIsZSwxKXwwKSE9MSl7aj0tMTtpPWc7cmV0dXJuIGp8MH1qPWRbZT4+MF18MDtpPWc7cmV0dXJuIGp8MH1mdW5jdGlvbiBGbihiLGUpe2I9YnwwO2U9ZXwwO3ZhciBmPTAsZz0wLGo9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MC4wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLjAsSj0wLEs9MCxMPTAuMCxNPTAuMCxOPTAuMCxPPTAuMDtmPWk7aT1pKzYyNHwwO289ZisxMTJ8MDtxPWY7bD1xKzB8MDtqPWwrMTA4fDA7ZG97Y1tsPj4yXT0wO2w9bCs0fDB9d2hpbGUoKGx8MCk8KGp8MCkpO209cSs0fDA7Y1ttPj4yXT1iO2w9cSs4fDA7Y1tsPj4yXT0tMTtjW3ErNDQ+PjJdPWI7Y1txKzc2Pj4yXT0tMTtzPXErMTA0fDA7Y1tzPj4yXT0wO2o9cSsxMDh8MDtjW2o+PjJdPX5iO3A9cSsxMDB8MDtjW3A+PjJdPS0xO249Yjt6PS0xO3doaWxlKDEpe2lmKG4+Pj4wPHo+Pj4wKXtjW20+PjJdPW4rMTt6PWRbbj4+MF18MH1lbHNle3o9RG4ocSl8MH1pZighKCh6fDApPT0zMnwoeisgLTl8MCk+Pj4wPDUpKXticmVha31uPWNbbT4+Ml18MDt6PWNbcD4+Ml18MH1kb3tpZigoenwwKT09NDN8KHp8MCk9PTQ1KXtuPTEtKCgoenwwKT09NDUmMSk8PDEpfDA7ej1jW20+PjJdfDA7aWYoej4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPXorMTt6PWRbej4+MF18MDticmVha31lbHNle3o9RG4ocSl8MDticmVha319ZWxzZXtuPTF9fXdoaWxlKDApO0I9MDtkb3tpZigoenwzMnwwKSE9KGFbMjMwMjQrQj4+MF18MCkpe2JyZWFrfWRve2lmKEI+Pj4wPDcpe3o9Y1ttPj4yXXwwO2lmKHo+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT16KzE7ej1kW3o+PjBdfDA7YnJlYWt9ZWxzZXt6PURuKHEpfDA7YnJlYWt9fX13aGlsZSgwKTtCPUIrMXwwfXdoaWxlKEI+Pj4wPDgpO2E6ZG97aWYoKEJ8MCk9PTMpe2c9MjF9ZWxzZSBpZigoQnwwKSE9OCl7aWYoIShCPj4+MDw0KSl7aWYoKEJ8MCk9PTgpe2c9MjU7YnJlYWt9ZWxzZXtnPTIxO2JyZWFrfX1iOmRve2lmKChCfDApPT0wKXtCPTA7ZG97aWYoKHp8MzJ8MCkhPShhWzIzMDQwK0I+PjBdfDApKXticmVhayBifWRve2lmKEI+Pj4wPDIpe3o9Y1ttPj4yXXwwO2lmKHo+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT16KzE7ej1kW3o+PjBdfDA7YnJlYWt9ZWxzZXt6PURuKHEpfDA7YnJlYWt9fX13aGlsZSgwKTtCPUIrMXwwfXdoaWxlKEI+Pj4wPDMpfX13aGlsZSgwKTtpZigoQnwwKT09MCl7ZG97aWYoKHp8MCk9PTQ4KXt6PWNbbT4+Ml18MDtpZih6Pj4+MDwoY1twPj4yXXwwKT4+PjApe2NbbT4+Ml09eisxO3o9ZFt6Pj4wXXwwfWVsc2V7ej1EbihxKXwwfWlmKCh6fDMyfDApIT0xMjApe2lmKChjW3A+PjJdfDApPT0wKXt6PTQ4O2JyZWFrfWNbbT4+Ml09KGNbbT4+Ml18MCkrIC0xO3o9NDg7YnJlYWt9bz1jW20+PjJdfDA7aWYobz4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPW8rMTtGPWRbbz4+MF18MDtEPTB9ZWxzZXtGPURuKHEpfDA7RD0wfXdoaWxlKDEpe2lmKChGfDApPT00Nil7Zz02NTticmVha31lbHNlIGlmKChGfDApIT00OCl7bz0wO3M9MDtBPTA7ej0wO0M9MDtFPTA7SD0xLjA7Qj0wO3c9MC4wO2JyZWFrfW89Y1ttPj4yXXwwO2lmKG8+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT1vKzE7Rj1kW28+PjBdfDA7RD0xO2NvbnRpbnVlfWVsc2V7Rj1EbihxKXwwO0Q9MTtjb250aW51ZX19Yzpkb3tpZigoZ3wwKT09NjUpe289Y1ttPj4yXXwwO2lmKG8+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT1vKzE7Rj1kW28+PjBdfDB9ZWxzZXtGPURuKHEpfDB9aWYoKEZ8MCk9PTQ4KXtBPS0xO3o9LTE7d2hpbGUoMSl7bz1jW20+PjJdfDA7aWYobz4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPW8rMTtGPWRbbz4+MF18MH1lbHNle0Y9RG4ocSl8MH1pZigoRnwwKSE9NDgpe289MDtzPTA7RD0xO0M9MTtFPTA7SD0xLjA7Qj0wO3c9MC4wO2JyZWFrIGN9Sz1JbihBfDAsenwwLC0xLC0xKXwwO0E9Szt6PUl9fWVsc2V7bz0wO3M9MDtBPTA7ej0wO0M9MTtFPTA7SD0xLjA7Qj0wO3c9MC4wfX19d2hpbGUoMCk7ZDp3aGlsZSgxKXtLPUYrIC00OHwwO2Rve2lmKCEoSz4+PjA8MTApKXtHPUZ8MzI7Sj0oRnwwKT09NDY7aWYoISgoRysgLTk3fDApPj4+MDw2fEopKXticmVhayBkfWlmKEope2lmKChDfDApPT0wKXtBPXM7ej1vO0M9MTticmVha31lbHNle0Y9NDY7YnJlYWsgZH19ZWxzZXtLPShGfDApPjU3P0crIC04N3wwOks7Zz03OTticmVha319ZWxzZXtnPTc5fX13aGlsZSgwKTtpZigoZ3wwKT09Nzkpe2c9MDtkb3tpZighKChvfDApPDB8KG98MCk9PTAmcz4+PjA8OCkpe2lmKChvfDApPDB8KG98MCk9PTAmcz4+PjA8MTQpe049SCouMDYyNTtMPU47dz13K04qKyhLfDApO2JyZWFrfWlmKChLfDApIT0wJihFfDApPT0wKXtFPTE7TD1IO3c9dytIKi41fWVsc2V7TD1IfX1lbHNle0w9SDtCPUsrKEI8PDQpfDB9fXdoaWxlKDApO3M9SW4oc3wwLG98MCwxLDApfDA7bz1JO0Q9MTtIPUx9Rj1jW20+PjJdfDA7aWYoRj4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPUYrMTtGPWRbRj4+MF18MDtjb250aW51ZX1lbHNle0Y9RG4ocSl8MDtjb250aW51ZX19aWYoKER8MCk9PTApe2lmKChjW3A+PjJdfDApIT0wPyh2PWNbbT4+Ml18MCxjW20+PjJdPXYrIC0yLChDfDApIT0wKTowKXtjW20+PjJdPXYrIC0zfXc9KyhufDApKjAuMDticmVhayBhfUs9KEN8MCk9PTA7dj1LP3M6QTt6PUs/bzp6O2lmKChvfDApPDB8KG98MCk9PTAmcz4+PjA8OCl7ZG97Qj1CPDw0O3M9SW4oc3wwLG98MCwxLDApfDA7bz1JfXdoaWxlKChvfDApPDB8KG98MCk9PTAmcz4+PjA8OCl9aWYoISgoRnwzMnwwKT09MTEyPyh1PUNuKHEpfDAsdD1JLCEoKHV8MCk9PTAmKHR8MCk9PS0yMTQ3NDgzNjQ4KSk6MCkpe2lmKChjW3A+PjJdfDApPT0wKXt1PTA7dD0wfWVsc2V7Y1ttPj4yXT0oY1ttPj4yXXwwKSsgLTE7dT0wO3Q9MH19bz1Pbih2fDAsenwwLDIpfDA7bz1JbihvfDAsSXwwLC0zMiwtMSl8MDtvPUluKG98MCxJfDAsdXwwLHR8MCl8MDtwPUk7aWYoKEJ8MCk9PTApe3c9KyhufDApKjAuMDticmVhayBhfWlmKChwfDApPjB8KHB8MCk9PTAmbz4+PjA+MTA3NCl7Y1soYmIoKXwwKT4+Ml09MzQ7dz0rKG58MCkqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7YnJlYWsgYX1pZigocHwwKTwtMXwocHwwKT09LTEmbz4+PjA8NDI5NDk2NjExNil7Y1soYmIoKXwwKT4+Ml09MzQ7dz0rKG58MCkqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7YnJlYWsgYX1pZigoQnwwKT4tMSl7ZG97Qj1CPDwxO2lmKCEodz49LjUpKXtIPXd9ZWxzZXtIPXcrLTEuMDtCPUJ8MX13PXcrSDtvPUluKG98MCxwfDAsLTEsLTEpfDA7cD1JfXdoaWxlKChCfDApPi0xKX1wPUluKG98MCxwfDAsMTEwNiwwKXwwO0s9STtkb3tpZigoS3wwKTwwfChLfDApPT0wJnA+Pj4wPDUzPyhyPShwfDApPDA/MDpwLChyfDApPDUzKTowKXtwPTg0LXJ8MDtkb3tpZigocHwwKT4xMDIzKXtxPXArIC0xMDIzfDA7aWYoKHF8MCk8PTEwMjMpe3A9cTtIPTguOTg4NDY1Njc0MzExNThlKzMwNzticmVha31wPXArIC0yMDQ2fDA7cD0ocHwwKT4xMDIzPzEwMjM6cDtIPXl9ZWxzZXtpZighKChwfDApPC0xMDIyKSl7SD0xLjA7YnJlYWt9cT1wKzEwMjJ8MDtpZighKChxfDApPC0xMDIyKSl7cD1xO0g9Mi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7YnJlYWt9cD1wKzIwNDR8MDtwPShwfDApPC0xMDIyPy0xMDIyOnA7SD0wLjB9fXdoaWxlKDApO0o9T24ocCsxMDIzfDAsMCw1Mil8MDtLPUk7Y1trPj4yXT1KO2Nbays0Pj4yXT1LO009KyhufDApO0w9K1NiKCsoSCoraFtrPj4zXSksK00pO2lmKCEoKHJ8MCk8MzImdyE9MC4wKSl7SD1NO2JyZWFrfUs9QiYxO0g9TTtCPShLXjEpK0J8MDt3PShLfDApPT0wPzAuMDp3fWVsc2V7Zz0xMTR9fXdoaWxlKDApO2lmKChnfDApPT0xMTQpe0g9KyhufDApO0w9MC4wfXc9SCp3KyhMK0gqKyhCPj4+MCkpLUw7aWYoISh3IT0wLjApKXtjWyhiYigpfDApPj4yXT0zNH1kb3tpZigob3wwKT4xMDIzKXt3PXcqOC45ODg0NjU2NzQzMTE1OGUrMzA3O249bysgLTEwMjN8MDtpZigobnwwKTw9MTAyMyl7bz1uO2JyZWFrfW89bysgLTIwNDZ8MDtvPShvfDApPjEwMjM/MTAyMzpvO3c9dyo4Ljk4ODQ2NTY3NDMxMTU4ZSszMDd9ZWxzZXtpZighKChvfDApPC0xMDIyKSl7YnJlYWt9dz13KjIuMjI1MDczODU4NTA3MjAxNGUtMzA4O249bysxMDIyfDA7aWYoISgobnwwKTwtMTAyMikpe289bjticmVha31vPW8rMjA0NHwwO289KG98MCk8LTEwMjI/LTEwMjI6bzt3PXcqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDh9fXdoaWxlKDApO0o9T24obysxMDIzfDAsMCw1Mil8MDtLPUk7Y1trPj4yXT1KO2Nbays0Pj4yXT1LO3c9dyoraFtrPj4zXTticmVhayBhfX13aGlsZSgwKTtHPTA7d2hpbGUoMSl7aWYoKHp8MCk9PTQ2KXtnPTEzOTticmVha31lbHNlIGlmKCh6fDApIT00OCl7cj0wO0Y9MDtDPTA7YnJlYWt9cj1jW20+PjJdfDA7aWYocj4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPXIrMTt6PWRbcj4+MF18MDtHPTE7Y29udGludWV9ZWxzZXt6PURuKHEpfDA7Rz0xO2NvbnRpbnVlfX1lOmRve2lmKChnfDApPT0xMzkpe3I9Y1ttPj4yXXwwO2lmKHI+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT1yKzE7ej1kW3I+PjBdfDB9ZWxzZXt6PURuKHEpfDB9aWYoKHp8MCk9PTQ4KXtyPS0xO0Y9LTE7d2hpbGUoMSl7dD1jW20+PjJdfDA7aWYodD4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPXQrMTt6PWRbdD4+MF18MH1lbHNle3o9RG4ocSl8MH1pZigoenwwKSE9NDgpe0c9MTtDPTE7YnJlYWsgZX1LPUluKHJ8MCxGfDAsLTEsLTEpfDA7cj1LO0Y9SX19ZWxzZXtyPTA7Rj0wO0M9MX19fXdoaWxlKDApO2Nbbz4+Ml09MDtEPXorIC00OHwwO0o9KHp8MCk9PTQ2O2Y6ZG97aWYoRD4+PjA8MTB8Sil7dD1vKzQ5NnwwO0U9MDtCPTA7QT0wO3Y9MDt1PTA7d2hpbGUoMSl7ZG97aWYoSil7aWYoKEN8MCk9PTApe3I9RTtGPUI7Qz0xfWVsc2V7YnJlYWsgZn19ZWxzZXtKPUluKEV8MCxCfDAsMSwwKXwwO0I9STtLPSh6fDApIT00ODtpZigodnwwKT49MTI1KXtpZighSyl7RT1KO2JyZWFrfWNbdD4+Ml09Y1t0Pj4yXXwxO0U9SjticmVha31FPW8rKHY8PDIpfDA7aWYoKEF8MCkhPTApe0Q9eisgLTQ4KygoY1tFPj4yXXwwKSoxMHwwKXwwfWNbRT4+Ml09RDtBPUErMXwwO0Q9KEF8MCk9PTk7RT1KO0c9MTtBPUQ/MDpBO3Y9KEQmMSkrdnwwO3U9Sz9KOnV9fXdoaWxlKDApO3o9Y1ttPj4yXXwwO2lmKHo+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT16KzE7ej1kW3o+PjBdfDB9ZWxzZXt6PURuKHEpfDB9RD16KyAtNDh8MDtKPSh6fDApPT00NjtpZighKEQ+Pj4wPDEwfEopKXtnPTE2MjticmVha319fWVsc2V7RT0wO0I9MDtBPTA7dj0wO3U9MDtnPTE2Mn19d2hpbGUoMCk7aWYoKGd8MCk9PTE2Mil7Sz0oQ3wwKT09MDtyPUs/RTpyO0Y9Sz9COkZ9dD0oR3wwKSE9MDtpZih0Pyh6fDMyfDApPT0xMDE6MCl7ej1DbihxKXwwO3E9STtpZigoenwwKT09MCYocXwwKT09LTIxNDc0ODM2NDgpe2lmKChjW3A+PjJdfDApPT0wKXt6PTA7cT0wfWVsc2V7Y1ttPj4yXT0oY1ttPj4yXXwwKSsgLTE7ej0wO3E9MH19cj1Jbih6fDAscXwwLHJ8MCxGfDApfDA7Rj1JfWVsc2V7aWYoKHp8MCk+LTE/KGNbcD4+Ml18MCkhPTA6MCl7Y1ttPj4yXT0oY1ttPj4yXXwwKSsgLTF9fWlmKCF0KXtjWyhiYigpfDApPj4yXT0yMjtjW3M+PjJdPTA7Sz1jW2w+PjJdfDA7Y1tqPj4yXT1LLShjW20+PjJdfDApO2NbcD4+Ml09Szt3PTAuMDticmVha31wPWNbbz4+Ml18MDtpZigocHwwKT09MCl7dz0rKG58MCkqMC4wO2JyZWFrfWlmKChyfDApPT0oRXwwKSYoRnwwKT09KEJ8MCkmKChCfDApPDB8KEJ8MCk9PTAmRT4+PjA8MTApKXt3PSsobnwwKSorKHA+Pj4wKTticmVha31pZigoRnwwKT4wfChGfDApPT0wJnI+Pj4wPjUzNyl7Y1soYmIoKXwwKT4+Ml09MzQ7dz0rKG58MCkqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7YnJlYWt9aWYoKEZ8MCk8LTF8KEZ8MCk9PS0xJnI+Pj4wPDQyOTQ5NjYxMTYpe2NbKGJiKCl8MCk+PjJdPTM0O3c9KyhufDApKjIuMjI1MDczODU4NTA3MjAxNGUtMzA4KjIuMjI1MDczODU4NTA3MjAxNGUtMzA4O2JyZWFrfWlmKChBfDApIT0wKXtpZigoQXwwKTw5KXtxPW8rKHY8PDIpfDA7cD1jW3E+PjJdfDA7ZG97cD1wKjEwfDA7QT1BKzF8MH13aGlsZSgoQXwwKSE9OSk7Y1txPj4yXT1wfXY9disxfDB9ZG97aWYoKHV8MCk8OT8odXwwKTw9KHJ8MCkmKHJ8MCk8MTg6MCl7aWYoKHJ8MCk9PTkpe3c9KyhufDApKisoKGNbbz4+Ml18MCk+Pj4wKTticmVhayBhfWlmKChyfDApPDkpe3c9KyhufDApKisoKGNbbz4+Ml18MCk+Pj4wKS8rKGNbMjMwNTYrKDgtcjw8Mik+PjJdfDApO2JyZWFrIGF9Sz0oZWEociwtMyl8MCkrODB8MDtwPWNbbz4+Ml18MDtpZigoS3wwKTw9MzA/KHA+Pj5LfDApIT0wOjApe2JyZWFrfXc9KyhufDApKisocD4+PjApKisoY1syMzA1NisocisgLTEwPDwyKT4+Ml18MCk7YnJlYWsgYX19d2hpbGUoMCk7cD0ocnwwKSU5fDA7aWYoKHB8MCk9PTApe3A9MDtxPTB9ZWxzZXtzPShyfDApPi0xP3A6cCs5fDA7cT1jWzIzMDU2Kyg4LXM8PDIpPj4yXXwwO2lmKCh2fDApIT0wKXt0PTFlOS8ocXwwKXwwO3A9MDt6PTA7dT0wO2Rve0c9bysodTw8Mil8MDtKPWNbRz4+Ml18MDtLPSgoSj4+PjApLyhxPj4+MCl8MCkrenwwO2NbRz4+Ml09Szt6PWVhKChKPj4+MCklKHE+Pj4wKXwwLHQpfDA7Sj11O3U9dSsxfDA7aWYoKEp8MCk9PShwfDApJihLfDApPT0wKXtwPXUmMTI3O3I9cisgLTl8MH19d2hpbGUoKHV8MCkhPSh2fDApKTtpZigoenwwKSE9MCl7Y1tvKyh2PDwyKT4+Ml09ejt2PXYrMXwwfX1lbHNle3A9MDt2PTB9cT0wO3I9OS1zK3J8MH1nOndoaWxlKDEpe3M9bysocDw8Mil8MDtpZigocnwwKTwxOCl7ZG97dT0wO3M9disxMjd8MDt3aGlsZSgxKXtzPXMmMTI3O3Q9bysoczw8Mil8MDt6PU9uKGNbdD4+Ml18MCwwLDI5KXwwO3o9SW4oenwwLEl8MCx1fDAsMCl8MDt1PUk7aWYodT4+PjA+MHwodXwwKT09MCZ6Pj4+MD4xZTkpe0s9V24oenwwLHV8MCwxZTksMCl8MDt6PVhuKHp8MCx1fDAsMWU5LDApfDA7dT1LfWVsc2V7dT0wfWNbdD4+Ml09ejt0PShzfDApPT0ocHwwKTtpZighKChzfDApIT0odisxMjcmMTI3fDApfHQpKXt2PSh6fDApPT0wP3M6dn1pZih0KXticmVha31lbHNle3M9cysgLTF8MH19cT1xKyAtMjl8MH13aGlsZSgodXwwKT09MCl9ZWxzZXtpZigocnwwKSE9MTgpe2JyZWFrfWRve2lmKCEoKGNbcz4+Ml18MCk+Pj4wPDkwMDcxOTkpKXtyPTE4O2JyZWFrIGd9dT0wO3Q9disxMjd8MDt3aGlsZSgxKXt0PXQmMTI3O3o9bysodDw8Mil8MDtBPU9uKGNbej4+Ml18MCwwLDI5KXwwO0E9SW4oQXwwLEl8MCx1fDAsMCl8MDt1PUk7aWYodT4+PjA+MHwodXwwKT09MCZBPj4+MD4xZTkpe0s9V24oQXwwLHV8MCwxZTksMCl8MDtBPVhuKEF8MCx1fDAsMWU5LDApfDA7dT1LfWVsc2V7dT0wfWNbej4+Ml09QTt6PSh0fDApPT0ocHwwKTtpZighKCh0fDApIT0odisxMjcmMTI3fDApfHopKXt2PShBfDApPT0wP3Q6dn1pZih6KXticmVha31lbHNle3Q9dCsgLTF8MH19cT1xKyAtMjl8MH13aGlsZSgodXwwKT09MCl9cD1wKzEyNyYxMjc7aWYoKHB8MCk9PSh2fDApKXtLPXYrMTI3JjEyNzt2PW8rKCh2KzEyNiYxMjcpPDwyKXwwO2Nbdj4+Ml09Y1t2Pj4yXXxjW28rKEs8PDIpPj4yXTt2PUt9Y1tvKyhwPDwyKT4+Ml09dTtyPXIrOXwwfWg6d2hpbGUoMSl7cz12KzEmMTI3O3Q9bysoKHYrMTI3JjEyNyk8PDIpfDA7d2hpbGUoMSl7ej0ocnwwKT09MTg7dT0ocnwwKT4yNz85OjE7d2hpbGUoMSl7QT0wO3doaWxlKDEpe0I9QStwJjEyNztpZigoQnwwKT09KHZ8MCkpe0E9MjticmVha31CPWNbbysoQjw8Mik+PjJdfDA7RD1jWzIzMDQ4KyhBPDwyKT4+Ml18MDtpZihCPj4+MDxEPj4+MCl7QT0yO2JyZWFrfUM9QSsxfDA7aWYoQj4+PjA+RD4+PjApe2JyZWFrfWlmKChDfDApPDIpe0E9Q31lbHNle0E9QzticmVha319aWYoKEF8MCk9PTImeil7YnJlYWsgaH1xPXUrcXwwO2lmKChwfDApPT0odnwwKSl7cD12fWVsc2V7YnJlYWt9fXo9KDE8PHUpKyAtMXwwO0E9MWU5Pj4+dTtCPXA7Qz0wO2Rve0c9bysocDw8Mil8MDtKPWNbRz4+Ml18MDtLPShKPj4+dSkrQ3wwO2NbRz4+Ml09SztDPWVhKEomeixBKXwwO0s9KHB8MCk9PShCfDApJihLfDApPT0wO3A9cCsxJjEyNztyPUs/cisgLTl8MDpyO0I9Sz9wOkJ9d2hpbGUoKHB8MCkhPSh2fDApKTtpZigoQ3wwKT09MCl7cD1CO2NvbnRpbnVlfWlmKChzfDApIT0oQnwwKSl7YnJlYWt9Y1t0Pj4yXT1jW3Q+PjJdfDE7cD1CfWNbbysodjw8Mik+PjJdPUM7cD1CO3Y9c31yPXAmMTI3O2lmKChyfDApPT0odnwwKSl7Y1tvKyhzKyAtMTw8Mik+PjJdPTA7dj1zfUg9KygoY1tvKyhyPDwyKT4+Ml18MCk+Pj4wKTtyPXArMSYxMjc7aWYoKHJ8MCk9PSh2fDApKXt2PXYrMSYxMjc7Y1tvKyh2KyAtMTw8Mik+PjJdPTB9dz0rKG58MCk7SD13KihIKjEuMGU5KyArKChjW28rKHI8PDIpPj4yXXwwKT4+PjApKTtuPXErNTN8MDtyPXErMTEyN3wwO2Rve2lmKChyfDApPDUzKXtzPShyfDApPDA/MDpyO2lmKChzfDApPj01Myl7TT0wLjA7dD0xO049MC4wO2JyZWFrfXQ9MTA1LXN8MDtkb3tpZigodHwwKT4xMDIzKXt1PXQrIC0xMDIzfDA7aWYoKHV8MCk8PTEwMjMpe3Q9dTtMPTguOTg4NDY1Njc0MzExNThlKzMwNzticmVha310PXQrIC0yMDQ2fDA7dD0odHwwKT4xMDIzPzEwMjM6dDtMPXl9ZWxzZXtpZighKCh0fDApPC0xMDIyKSl7TD0xLjA7YnJlYWt9dT10KzEwMjJ8MDtpZighKCh1fDApPC0xMDIyKSl7dD11O0w9Mi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7YnJlYWt9dD10KzIwNDR8MDt0PSh0fDApPC0xMDIyPy0xMDIyOnQ7TD0wLjB9fXdoaWxlKDApO0s9T24odCsxMDIzfDAsMCw1Mil8MDt0PUk7Y1trPj4yXT1LO2Nbays0Pj4yXT10O0w9K1NiKCsoTCoraFtrPj4zXSksK0gpO3Q9NTMtc3wwO2Rve2lmKCh0fDApPjEwMjMpe3U9dCsgLTEwMjN8MDtpZigodXwwKTw9MTAyMyl7dD11O009OC45ODg0NjU2NzQzMTE1OGUrMzA3O2JyZWFrfXQ9dCsgLTIwNDZ8MDt0PSh0fDApPjEwMjM/MTAyMzp0O009eX1lbHNle2lmKCEoKHR8MCk8LTEwMjIpKXtNPTEuMDticmVha311PXQrMTAyMnwwO2lmKCEoKHV8MCk8LTEwMjIpKXt0PXU7TT0yLjIyNTA3Mzg1ODUwNzIwMTRlLTMwODticmVha310PXQrMjA0NHwwO3Q9KHR8MCk8LTEwMjI/LTEwMjI6dDtNPTAuMH19d2hpbGUoMCk7Sz1Pbih0KzEwMjN8MCwwLDUyKXwwO3Q9STtjW2s+PjJdPUs7Y1trKzQ+PjJdPXQ7Tz0rUGEoK0gsKyhNKitoW2s+PjNdKSk7TT1MO3Q9MTtOPU87SD1MKyhILU8pfWVsc2V7cz01MztNPTAuMDt0PTA7Tj0wLjB9fXdoaWxlKDApO3U9cCsyJjEyNztkb3tpZigodXwwKSE9KHZ8MCkpe289Y1tvKyh1PDwyKT4+Ml18MDtkb3tpZighKG8+Pj4wPDVlOCkpe2lmKG8+Pj4wPjVlOCl7Tj13Ki43NStOO2JyZWFrfWlmKChwKzMmMTI3fDApPT0odnwwKSl7Tj13Ki41K047YnJlYWt9ZWxzZXtOPXcqLjc1K047YnJlYWt9fWVsc2V7aWYoKG98MCk9PTA/KHArMyYxMjd8MCk9PSh2fDApOjApe2JyZWFrfU49dyouMjUrTn19d2hpbGUoMCk7aWYoKDUzLXN8MCk8PTEpe2JyZWFrfWlmKCtQYSgrTiwxLjApIT0wLjApe2JyZWFrfU49TisxLjB9fXdoaWxlKDApO3c9SCtOLU07ZG97aWYoKG4mMjE0NzQ4MzY0NCk+Pj4wPjEwMTkpe2lmKCtUKCt3KT49OTAwNzE5OTI1NDc0MDk5Mi4wKXt0PSh0fDApIT0wJihzfDApPT0ocnwwKT8wOnQ7cT1xKzF8MDt3PXcqLjV9aWYoKHErNTB8MCk8PTEwMjE/ISgodHwwKSE9MCZOIT0wLjApOjApe2JyZWFrfWNbKGJiKCl8MCk+PjJdPTM0fX13aGlsZSgwKTtkb3tpZigocXwwKT4xMDIzKXt3PXcqOC45ODg0NjU2NzQzMTE1OGUrMzA3O249cSsgLTEwMjN8MDtpZigobnwwKTw9MTAyMyl7cT1uO2JyZWFrfXE9cSsgLTIwNDZ8MDtxPShxfDApPjEwMjM/MTAyMzpxO3c9dyo4Ljk4ODQ2NTY3NDMxMTU4ZSszMDd9ZWxzZXtpZighKChxfDApPC0xMDIyKSl7YnJlYWt9dz13KjIuMjI1MDczODU4NTA3MjAxNGUtMzA4O249cSsxMDIyfDA7aWYoISgobnwwKTwtMTAyMikpe3E9bjticmVha31xPXErMjA0NHwwO3E9KHF8MCk8LTEwMjI/LTEwMjI6cTt3PXcqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDh9fXdoaWxlKDApO0o9T24ocSsxMDIzfDAsMCw1Mil8MDtLPUk7Y1trPj4yXT1KO2Nbays0Pj4yXT1LO3c9dyoraFtrPj4zXTticmVha31lbHNlIGlmKChCfDApPT0zKXtuPWNbbT4+Ml18MDtpZihuPj4+MDwoY1twPj4yXXwwKT4+PjApe2NbbT4+Ml09bisxO249ZFtuPj4wXXwwfWVsc2V7bj1EbihxKXwwfWlmKChufDApPT00MCl7bj0xfWVsc2V7aWYoKGNbcD4+Ml18MCk9PTApe3c9eDticmVha31jW20+PjJdPShjW20+PjJdfDApKyAtMTt3PXg7YnJlYWt9d2hpbGUoMSl7bz1jW20+PjJdfDA7aWYobz4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPW8rMTtvPWRbbz4+MF18MH1lbHNle289RG4ocSl8MH1pZighKChvKyAtNDh8MCk+Pj4wPDEwfChvKyAtNjV8MCk+Pj4wPDI2KT8hKChvKyAtOTd8MCk+Pj4wPDI2fChvfDApPT05NSk6MCl7YnJlYWt9bj1uKzF8MH1pZigob3wwKT09NDEpe3c9eDticmVha31pZigoY1twPj4yXXwwKT09MCl7dz14O2JyZWFrfW89KGNbbT4+Ml18MCkrIC0xfDA7Y1ttPj4yXT1vO2lmKChufDApPT0wKXt3PXg7YnJlYWt9ZG97bj1uKyAtMXwwO289bysgLTF8MH13aGlsZSgobnwwKSE9MCk7Y1ttPj4yXT1vO3c9eDticmVha31lbHNle249Y1ttPj4yXXwwO2lmKChjW3A+PjJdfDApIT0wKXtuPW4rIC0xfDA7Y1ttPj4yXT1ufWNbKGJiKCl8MCk+PjJdPTIyO2Nbcz4+Ml09MDtLPWNbbD4+Ml18MDtjW2o+PjJdPUstbjtjW3A+PjJdPUs7dz0wLjA7YnJlYWt9fWVsc2V7Zz0yNX19d2hpbGUoMCk7aWYoKGd8MCk9PTIxKXtpZigoY1twPj4yXXwwKSE9MD8oQT0oY1ttPj4yXXwwKSsgLTF8MCxjW20+PjJdPUEsIShCPj4+MDw0KSk6MCl7ZG97QT1BKyAtMXwwO0I9QisgLTF8MH13aGlsZShCPj4+MD4zKTtjW20+PjJdPUE7Zz0yNX1lbHNle2c9MjV9fWlmKChnfDApPT0yNSl7dz0rKG58MCkqeX1nPShjW20+PjJdfDApLShjW2w+PjJdfDApKyhjW2o+PjJdfDApfDA7aWYoKGV8MCk9PTApe2k9ZjtyZXR1cm4rd31pZigoZ3wwKSE9MCl7Yj1iK2d8MH1jW2U+PjJdPWI7aT1mO3JldHVybit3fWZ1bmN0aW9uIEduKCl7Y1sxNTgwXT1vO2NbMjQ5Ml09bztjWzI1MThdPW87Y1s1MzQ2XT1vO2NbNTY4NF09b31mdW5jdGlvbiBIbihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtiPWItZC0oYz4+PjA+YT4+PjB8MCk+Pj4wO3JldHVybihJPWIsYS1jPj4+MHwwKXwwfWZ1bmN0aW9uIEluKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2M9YStjPj4+MDtyZXR1cm4oST1iK2QrKGM+Pj4wPGE+Pj4wfDApPj4+MCxjfDApfDB9ZnVuY3Rpb24gSm4oYil7Yj1ifDA7dmFyIGM9MDtjPWI7d2hpbGUoYVtjPj4wXXwwKXtjPWMrMXwwfXJldHVybiBjLWJ8MH1mdW5jdGlvbiBLbihhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7aWYoKGN8MCk8MzIpe0k9Yj4+PmM7cmV0dXJuIGE+Pj5jfChiJigxPDxjKS0xKTw8MzItY31JPTA7cmV0dXJuIGI+Pj5jLTMyfDB9ZnVuY3Rpb24gTG4oYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTA7aWYoKGV8MCk+PTQwOTYpcmV0dXJuIG5iKGJ8MCxkfDAsZXwwKXwwO2Y9YnwwO2lmKChiJjMpPT0oZCYzKSl7d2hpbGUoYiYzKXtpZigoZXwwKT09MClyZXR1cm4gZnwwO2FbYj4+MF09YVtkPj4wXXwwO2I9YisxfDA7ZD1kKzF8MDtlPWUtMXwwfXdoaWxlKChlfDApPj00KXtjW2I+PjJdPWNbZD4+Ml07Yj1iKzR8MDtkPWQrNHwwO2U9ZS00fDB9fXdoaWxlKChlfDApPjApe2FbYj4+MF09YVtkPj4wXXwwO2I9YisxfDA7ZD1kKzF8MDtlPWUtMXwwfXJldHVybiBmfDB9ZnVuY3Rpb24gTW4oYixjLGQpe2I9YnwwO2M9Y3wwO2Q9ZHwwO3ZhciBlPTA7aWYoKGN8MCk8KGJ8MCkmKGJ8MCk8KGMrZHwwKSl7ZT1iO2M9YytkfDA7Yj1iK2R8MDt3aGlsZSgoZHwwKT4wKXtiPWItMXwwO2M9Yy0xfDA7ZD1kLTF8MDthW2I+PjBdPWFbYz4+MF18MH1iPWV9ZWxzZXtMbihiLGMsZCl8MH1yZXR1cm4gYnwwfWZ1bmN0aW9uIE5uKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaT0wO2Y9YitlfDA7aWYoKGV8MCk+PTIwKXtkPWQmMjU1O2k9YiYzO2g9ZHxkPDw4fGQ8PDE2fGQ8PDI0O2c9ZiZ+MztpZihpKXtpPWIrNC1pfDA7d2hpbGUoKGJ8MCk8KGl8MCkpe2FbYj4+MF09ZDtiPWIrMXwwfX13aGlsZSgoYnwwKTwoZ3wwKSl7Y1tiPj4yXT1oO2I9Yis0fDB9fXdoaWxlKChifDApPChmfDApKXthW2I+PjBdPWQ7Yj1iKzF8MH1yZXR1cm4gYi1lfDB9ZnVuY3Rpb24gT24oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtJPWI8PGN8KGEmKDE8PGMpLTE8PDMyLWMpPj4+MzItYztyZXR1cm4gYTw8Y31JPWE8PGMtMzI7cmV0dXJuIDB9ZnVuY3Rpb24gUG4oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtJPWI+PmM7cmV0dXJuIGE+Pj5jfChiJigxPDxjKS0xKTw8MzItY31JPShifDApPDA/LTE6MDtyZXR1cm4gYj4+Yy0zMnwwfWZ1bmN0aW9uIFFuKGIpe2I9YnwwO3ZhciBjPTA7Yz1hW24rKGI+Pj4yNCk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gY3wwO2M9YVtuKyhiPj4xNiYyNTUpPj4wXXwwO2lmKChjfDApPDgpcmV0dXJuIGMrOHwwO2M9YVtuKyhiPj44JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYysxNnwwO3JldHVybihhW24rKGImMjU1KT4+MF18MCkrMjR8MH1mdW5jdGlvbiBSbihiKXtiPWJ8MDt2YXIgYz0wO2M9YVttKyhiJjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gY3wwO2M9YVttKyhiPj44JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYys4fDA7Yz1hW20rKGI+PjE2JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYysxNnwwO3JldHVybihhW20rKGI+Pj4yNCk+PjBdfDApKzI0fDB9ZnVuY3Rpb24gU24oYSxiKXthPWF8MDtiPWJ8MDt2YXIgYz0wLGQ9MCxlPTAsZj0wO2Y9YSY2NTUzNTtkPWImNjU1MzU7Yz1lYShkLGYpfDA7ZT1hPj4+MTY7ZD0oYz4+PjE2KSsoZWEoZCxlKXwwKXwwO2I9Yj4+PjE2O2E9ZWEoYixmKXwwO3JldHVybihJPShkPj4+MTYpKyhlYShiLGUpfDApKygoKGQmNjU1MzUpK2F8MCk+Pj4xNil8MCxkK2E8PDE2fGMmNjU1MzV8MCl8MH1mdW5jdGlvbiBUbihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTA7aj1iPj4zMXwoKGJ8MCk8MD8tMTowKTw8MTtpPSgoYnwwKTwwPy0xOjApPj4zMXwoKGJ8MCk8MD8tMTowKTw8MTtmPWQ+PjMxfCgoZHwwKTwwPy0xOjApPDwxO2U9KChkfDApPDA/LTE6MCk+PjMxfCgoZHwwKTwwPy0xOjApPDwxO2g9SG4oal5hLGleYixqLGkpfDA7Zz1JO2I9Zl5qO2E9ZV5pO2E9SG4oKFluKGgsZyxIbihmXmMsZV5kLGYsZSl8MCxJLDApfDApXmIsSV5hLGIsYSl8MDtyZXR1cm4gYXwwfWZ1bmN0aW9uIFVuKGEsYixkLGUpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtmPWk7aT1pKzh8MDtqPWZ8MDtoPWI+PjMxfCgoYnwwKTwwPy0xOjApPDwxO2c9KChifDApPDA/LTE6MCk+PjMxfCgoYnwwKTwwPy0xOjApPDwxO2w9ZT4+MzF8KChlfDApPDA/LTE6MCk8PDE7az0oKGV8MCk8MD8tMTowKT4+MzF8KChlfDApPDA/LTE6MCk8PDE7Yj1IbihoXmEsZ15iLGgsZyl8MDthPUk7WW4oYixhLEhuKGxeZCxrXmUsbCxrKXwwLEksail8MDthPUhuKGNbaj4+Ml1eaCxjW2orND4+Ml1eZyxoLGcpfDA7Yj1JO2k9ZjtyZXR1cm4oST1iLGEpfDB9ZnVuY3Rpb24gVm4oYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7dmFyIGU9MCxmPTA7ZT1hO2Y9YzthPVNuKGUsZil8MDtjPUk7cmV0dXJuKEk9KGVhKGIsZil8MCkrKGVhKGQsZSl8MCkrY3xjJjAsYXwwfDApfDB9ZnVuY3Rpb24gV24oYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7YT1ZbihhLGIsYyxkLDApfDA7cmV0dXJuIGF8MH1mdW5jdGlvbiBYbihhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MDtnPWk7aT1pKzh8MDtmPWd8MDtZbihhLGIsZCxlLGYpfDA7aT1nO3JldHVybihJPWNbZis0Pj4yXXwwLGNbZj4+Ml18MCl8MH1mdW5jdGlvbiBZbihhLGIsZCxlLGYpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTA7aD1hO2o9YjtpPWo7bD1kO2c9ZTtrPWc7aWYoKGl8MCk9PTApe2c9KGZ8MCkhPTA7aWYoKGt8MCk9PTApe2lmKGcpe2NbZj4+Ml09KGg+Pj4wKSUobD4+PjApO2NbZis0Pj4yXT0wfWs9MDttPShoPj4+MCkvKGw+Pj4wKT4+PjA7cmV0dXJuKEk9ayxtKXwwfWVsc2V7aWYoIWcpe2w9MDttPTA7cmV0dXJuKEk9bCxtKXwwfWNbZj4+Ml09YXwwO2NbZis0Pj4yXT1iJjA7bD0wO209MDtyZXR1cm4oST1sLG0pfDB9fW09KGt8MCk9PTA7ZG97aWYoKGx8MCkhPTApe2lmKCFtKXtrPShRbihrfDApfDApLShRbihpfDApfDApfDA7aWYoaz4+PjA8PTMxKXttPWsrMXwwO2w9MzEta3wwO2E9ay0zMT4+MzE7aj1tO2I9aD4+PihtPj4+MCkmYXxpPDxsO2E9aT4+PihtPj4+MCkmYTtrPTA7bD1oPDxsO2JyZWFrfWlmKChmfDApPT0wKXtsPTA7bT0wO3JldHVybihJPWwsbSl8MH1jW2Y+PjJdPWF8MDtjW2YrND4+Ml09anxiJjA7bD0wO209MDtyZXR1cm4oST1sLG0pfDB9az1sLTF8MDtpZigoayZsfDApIT0wKXtsPShRbihsfDApfDApKzMzLShRbihpfDApfDApfDA7cD02NC1sfDA7bT0zMi1sfDA7bj1tPj4zMTtvPWwtMzJ8MDthPW8+PjMxO2o9bDtiPW0tMT4+MzEmaT4+PihvPj4+MCl8KGk8PG18aD4+PihsPj4+MCkpJmE7YT1hJmk+Pj4obD4+PjApO2s9aDw8cCZuO2w9KGk8PHB8aD4+PihvPj4+MCkpJm58aDw8bSZsLTMzPj4zMTticmVha31pZigoZnwwKSE9MCl7Y1tmPj4yXT1rJmg7Y1tmKzQ+PjJdPTB9aWYoKGx8MCk9PTEpe289anxiJjA7cD1hfDB8MDtyZXR1cm4oST1vLHApfDB9ZWxzZXtwPVJuKGx8MCl8MDtvPWk+Pj4ocD4+PjApfDA7cD1pPDwzMi1wfGg+Pj4ocD4+PjApfDA7cmV0dXJuKEk9byxwKXwwfX1lbHNle2lmKG0pe2lmKChmfDApIT0wKXtjW2Y+PjJdPShpPj4+MCklKGw+Pj4wKTtjW2YrND4+Ml09MH1vPTA7cD0oaT4+PjApLyhsPj4+MCk+Pj4wO3JldHVybihJPW8scCl8MH1pZigoaHwwKT09MCl7aWYoKGZ8MCkhPTApe2NbZj4+Ml09MDtjW2YrND4+Ml09KGk+Pj4wKSUoaz4+PjApfW89MDtwPShpPj4+MCkvKGs+Pj4wKT4+PjA7cmV0dXJuKEk9byxwKXwwfWw9ay0xfDA7aWYoKGwma3wwKT09MCl7aWYoKGZ8MCkhPTApe2NbZj4+Ml09YXwwO2NbZis0Pj4yXT1sJml8YiYwfW89MDtwPWk+Pj4oKFJuKGt8MCl8MCk+Pj4wKTtyZXR1cm4oST1vLHApfDB9az0oUW4oa3wwKXwwKS0oUW4oaXwwKXwwKXwwO2lmKGs+Pj4wPD0zMCl7YT1rKzF8MDtsPTMxLWt8MDtqPWE7Yj1pPDxsfGg+Pj4oYT4+PjApO2E9aT4+PihhPj4+MCk7az0wO2w9aDw8bDticmVha31pZigoZnwwKT09MCl7bz0wO3A9MDtyZXR1cm4oST1vLHApfDB9Y1tmPj4yXT1hfDA7Y1tmKzQ+PjJdPWp8YiYwO289MDtwPTA7cmV0dXJuKEk9byxwKXwwfX13aGlsZSgwKTtpZigoanwwKT09MCl7Zz1sO2U9MDtpPTB9ZWxzZXtoPWR8MHwwO2c9Z3xlJjA7ZT1JbihoLGcsLTEsLTEpfDA7ZD1JO2k9MDtkb3ttPWw7bD1rPj4+MzF8bDw8MTtrPWl8azw8MTttPWI8PDF8bT4+PjMxfDA7bj1iPj4+MzF8YTw8MXwwO0huKGUsZCxtLG4pfDA7cD1JO289cD4+MzF8KChwfDApPDA/LTE6MCk8PDE7aT1vJjE7Yj1IbihtLG4sbyZoLCgoKHB8MCk8MD8tMTowKT4+MzF8KChwfDApPDA/LTE6MCk8PDEpJmcpfDA7YT1JO2o9ai0xfDB9d2hpbGUoKGp8MCkhPTApO2c9bDtlPTB9aD0wO2lmKChmfDApIT0wKXtjW2Y+PjJdPWI7Y1tmKzQ+PjJdPWF9bz0oa3wwKT4+PjMxfChnfGgpPDwxfChoPDwxfGs+Pj4zMSkmMHxlO3A9KGs8PDF8MD4+PjMxKSYtMnxpO3JldHVybihJPW8scCl8MH0KCgoKZnVuY3Rpb24gT2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7bT1pO2k9aSsyMjR8MDtsPW0rOHwwO3M9bTtvPW0rMTkyfDA7ZD1tKzE4OHwwO2s9bSsxODR8MDtwPW0rMTgwfDA7dT1zO2NbdT4+Ml09Mzc7Y1t1KzQ+PjJdPTA7dT1zKzF8MDtxPWYrNHwwO3I9Y1txPj4yXXwwO2lmKChyJjIwNDh8MCkhPTApe2FbdT4+MF09NDM7dT1zKzJ8MH1pZigociY1MTJ8MCkhPTApe2FbdT4+MF09MzU7dT11KzF8MH10PXUrMnwwO2FbdT4+MF09MTA4O2FbdSsxPj4wXT0xMDg7dT1yJjc0O2Rve2lmKCh1fDApPT04KXtpZigociYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNlIGlmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZXthW3Q+PjBdPTExN319d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO3Q9bDtjW3Q+PjJdPWg7Y1t0KzQ+PjJdPWo7aD13aShvLDIzLHUscyxsKXwwO2o9bytofDA7cT1jW3E+PjJdJjE3Njtkb3tpZigocXwwKT09MzIpe3E9an1lbHNlIGlmKChxfDApPT0xNil7cT1hW28+PjBdfDA7aWYocTw8MjQ+PjI0PT00M3xxPDwyND4+MjQ9PTQ1KXtxPW8rMXwwO2JyZWFrfWlmKChofDApPjEmcTw8MjQ+PjI0PT00OD8odT1hW28rMT4+MF18MCx1PDwyND4+MjQ9PTg4fHU8PDI0Pj4yND09MTIwKTowKXtxPW8rMnwwfWVsc2V7bj0yMX19ZWxzZXtuPTIxfX13aGlsZSgwKTtpZigobnwwKT09MjEpe3E9b31uPWNbZisyOD4+Ml18MDtjW3A+PjJdPW47bj1uKzR8MDtjW24+PjJdPShjW24+PjJdfDApKzE7S2kobyxxLGosbCxkLGsscCk7bj1jW3A+PjJdfDA7dD1uKzR8MDt1PWNbdD4+Ml18MDtjW3Q+PjJdPXUrIC0xO2lmKCh1fDApIT0wKXtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWxjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKTtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWZ1bmN0aW9uIFBpKGIsZCxlLGYsZyxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPStqO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wO2w9aTtpPWkrMzA0fDA7cD1sO3U9bCsyMzJ8MDtyPWwrMjYwfDA7dD1sKzI0OHwwO2Q9bCsyNDR8MDtuPWwrMjQwfDA7bz1sKzI1MnwwO209bCsyNTZ8MDt2PXU7Y1t2Pj4yXT0zNztjW3YrND4+Ml09MDt2PXUrMXwwO3M9Zis0fDA7dz1jW3M+PjJdfDA7aWYoKHcmMjA0OHwwKSE9MCl7YVt2Pj4wXT00Mzt2PXUrMnwwfWlmKCh3JjEwMjR8MCkhPTApe2Fbdj4+MF09MzU7dj12KzF8MH14PXcmMjYwO3k9dz4+PjE0O2Rve2lmKCh4fDApPT0yNjApe2lmKCh5JjF8MCk9PTApe2Fbdj4+MF09OTc7dj0wO2JyZWFrfWVsc2V7YVt2Pj4wXT02NTt2PTA7YnJlYWt9fWVsc2V7YVt2Pj4wXT00Njt3PXYrMnwwO2FbdisxPj4wXT00MjtpZigoeHwwKT09MjU2KXtpZigoeSYxfDApPT0wKXthW3c+PjBdPTEwMTt2PTE7YnJlYWt9ZWxzZXthW3c+PjBdPTY5O3Y9MTticmVha319ZWxzZSBpZigoeHwwKT09NCl7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDI7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MDt2PTE7YnJlYWt9fWVsc2V7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDM7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MTt2PTE7YnJlYWt9fX19d2hpbGUoMCk7Y1t0Pj4yXT1yO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtpZih2KXtjW3A+PjJdPWNbZis4Pj4yXTt5PXArNHwwO2hbaz4+M109ajtjW3k+PjJdPWNbaz4+Ml07Y1t5KzQ+PjJdPWNbays0Pj4yXTt3PXdpKHIsMzAsdyx1LHApfDB9ZWxzZXtoW2s+PjNdPWo7Y1twPj4yXT1jW2s+PjJdO2NbcCs0Pj4yXT1jW2srND4+Ml07dz13aShyLDMwLHcsdSxwKXwwfWlmKCh3fDApPjI5KXt3PShhWzEzMzY4XXwwKT09MDtpZih2KXtpZih3PyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2NbcD4+Ml09Y1tmKzg+PjJdO3k9cCs0fDA7aFtrPj4zXT1qO2NbeT4+Ml09Y1trPj4yXTtjW3krND4+Ml09Y1trKzQ+PjJdO3c9Q2kodCx3LHUscCl8MH1lbHNle2lmKHc/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7Y1twPj4yXT1jW2YrOD4+Ml07eT1wKzR8MDtoW2s+PjNdPWo7Y1t5Pj4yXT1jW2s+PjJdO2NbeSs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfXQ9Y1t0Pj4yXXwwO2lmKCh0fDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3Y9dH19ZWxzZXt2PWNbdD4+Ml18MDt0PTB9dT12K3d8MDtzPWNbcz4+Ml0mMTc2O2Rve2lmKChzfDApPT0zMil7cz11fWVsc2UgaWYoKHN8MCk9PTE2KXtzPWFbdj4+MF18MDtpZihzPDwyND4+MjQ9PTQzfHM8PDI0Pj4yND09NDUpe3M9disxfDA7YnJlYWt9aWYoKHd8MCk+MSZzPDwyND4+MjQ9PTQ4Pyh5PWFbdisxPj4wXXwwLHk8PDI0Pj4yND09ODh8eTw8MjQ+PjI0PT0xMjApOjApe3M9disyfDB9ZWxzZXtxPTQ4fX1lbHNle3E9NDh9fXdoaWxlKDApO2lmKChxfDApPT00OCl7cz12fWlmKCh2fDApIT0ocnwwKSl7cD11bih3PDwzKXwwO2lmKChwfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3I9djtxPXB9fWVsc2V7cT0wfXg9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09eDt4PXgrNHwwO2NbeD4+Ml09KGNbeD4+Ml18MCkrMTtRaShyLHMsdSxwLGQsbixvKTtvPWNbbz4+Ml18MDt4PW8rNHwwO3k9Y1t4Pj4yXXwwO2NbeD4+Ml09eSsgLTE7aWYoKHl8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1MaShtLGNbZT4+Ml18MCxwLGNbZD4+Ml18MCxjW24+PjJdfDAsZixnKTt5PWNbbT4+Ml18MDtjW2U+PjJdPXk7Y1tiPj4yXT15O2lmKChxfDApIT0wKXt2bihxKX1pZigodHwwKT09MCl7aT1sO3JldHVybn12bih0KTtpPWw7cmV0dXJufWZ1bmN0aW9uIFFpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wO2s9aTtpPWkrMzJ8MDtvPWs7bD1rKzEyfDA7cT1jW2o+PjJdfDA7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW28+PjJdPTEzNDQ4O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM0NDgsbyl9bT0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dD1jW3ErOD4+Ml18MDtpZighKChjW3ErMTI+PjJdfDApLXQ+PjI+Pj4wPm0+Pj4wKSl7eT1YYSg0KXwwO2NbeT4+Ml09MjEzMDQ7d2IoeXwwLDIxMzc2LDE5Nil9bT1jW3QrKG08PDIpPj4yXXwwO2lmKChtfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1qPWNbaj4+Ml18MDtpZighKChjWzM0MDJdfDApPT0tMSkpe2Nbbz4+Ml09MTM2MDg7Y1tvKzQ+PjJdPTIwODtjW28rOD4+Ml09MDtjZygxMzYwOCxvKX1vPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtxPWNbais4Pj4yXXwwO2lmKCEoKGNbaisxMj4+Ml18MCktcT4+Mj4+PjA+bz4+PjApKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1qPWNbcSsobzw8Mik+PjJdfDA7aWYoKGp8MCk9PTApe3k9WGEoNCl8MDtjW3k+PjJdPTIxMzA0O3diKHl8MCwyMTM3NiwxOTYpfW1jW2NbKGNbaj4+Ml18MCkrMjA+PjJdJjEyN10obCxqKTtjW2g+PjJdPWY7bz1hW2I+PjBdfDA7aWYobzw8MjQ+PjI0PT00M3xvPDwyND4+MjQ9PTQ1KXt5PXhjW2NbKGNbbT4+Ml18MCkrNDQ+PjJdJjYzXShtLG8pfDA7dD1jW2g+PjJdfDA7Y1toPj4yXT10KzQ7Y1t0Pj4yXT15O3Q9YisxfDB9ZWxzZXt0PWJ9bz1lO2E6ZG97aWYoKChvLXR8MCk+MT8oYVt0Pj4wXXwwKT09NDg6MCk/KHA9dCsxfDAseT1hW3A+PjBdfDAseTw8MjQ+PjI0PT04OHx5PDwyND4+MjQ9PTEyMCk6MCl7eT14Y1tjWyhjW20+PjJdfDApKzQ0Pj4yXSY2M10obSw0OCl8MDt4PWNbaD4+Ml18MDtjW2g+PjJdPXgrNDtjW3g+PjJdPXk7dD10KzJ8MDt4PXhjW2NbKGNbbT4+Ml18MCkrNDQ+PjJdJjYzXShtLGFbcD4+MF18MCl8MDt5PWNbaD4+Ml18MDtjW2g+PjJdPXkrNDtjW3k+PjJdPXg7aWYodD4+PjA8ZT4+PjApe3E9dDt3aGlsZSgxKXtwPWFbcT4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9eT1wPDwyND4+MjQ7aWYoISgoeSsgLTQ4fDApPj4+MDwxMCk/ISgoKHl8MzIpKyAtOTd8MCk+Pj4wPDYpOjApe3A9dDticmVhayBhfXE9cSsxfDA7aWYoIShxPj4+MDxlPj4+MCkpe3A9dDticmVha319fWVsc2V7cD10O3E9dH19ZWxzZXtzPTE1fX13aGlsZSgwKTtiOmRve2lmKChzfDApPT0xNSl7aWYodD4+PjA8ZT4+PjApe3E9dDt3aGlsZSgxKXtwPWFbcT4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9cz1xKzF8MDtpZighKCgocDw8MjQ+PjI0KSsgLTQ4fDApPj4+MDwxMCkpe3A9dDticmVhayBifWlmKHM+Pj4wPGU+Pj4wKXtxPXN9ZWxzZXtwPXQ7cT1zO2JyZWFrfX19ZWxzZXtwPXQ7cT10fX19d2hpbGUoMCk7cz1hW2w+PjBdfDA7aWYoKHMmMSk9PTApe3M9KHMmMjU1KT4+PjF9ZWxzZXtzPWNbbCs0Pj4yXXwwfWlmKChzfDApIT0wKXtpZigocHwwKSE9KHF8MCk/KHI9cSsgLTF8MCxyPj4+MD5wPj4+MCk6MCl7cz1wO2Rve3k9YVtzPj4wXXwwO2Fbcz4+MF09YVtyPj4wXXwwO2Fbcj4+MF09eTtzPXMrMXwwO3I9cisgLTF8MH13aGlsZShzPj4+MDxyPj4+MCl9dj1vY1tjWyhjW2o+PjJdfDApKzE2Pj4yXSYxMjddKGopfDA7aWYocD4+PjA8cT4+PjApe3Q9bCsxfDA7cj1sKzR8MDt1PWwrOHwwO3g9MDt3PTA7cz1wO3doaWxlKDEpe3k9YVsoKGFbbD4+MF0mMSk9PTA/dDpjW3U+PjJdfDApK3c+PjBdfDA7aWYoeTw8MjQ+PjI0PjAmKHh8MCk9PSh5PDwyND4+MjR8MCkpe3g9Y1toPj4yXXwwO2NbaD4+Ml09eCs0O2NbeD4+Ml09djt4PWFbbD4+MF18MDtpZigoeCYxKT09MCl7eT0oeCYyNTUpPj4+MX1lbHNle3k9Y1tyPj4yXXwwfXg9MDt3PSh3Pj4+MDwoeSsgLTF8MCk+Pj4wJjEpK3d8MH1BPXhjW2NbKGNbbT4+Ml18MCkrNDQ+PjJdJjYzXShtLGFbcz4+MF18MCl8MDt6PWNbaD4+Ml18MDt5PXorNHwwO2NbaD4+Ml09eTtjW3o+PjJdPUE7cz1zKzF8MDtpZighKHM+Pj4wPHE+Pj4wKSl7YnJlYWt9ZWxzZXt4PXgrMXwwfX19ZWxzZXt5PWNbaD4+Ml18MH1wPWYrKHAtYjw8Mil8MDtpZigocHwwKSE9KHl8MCk/KG49eSsgLTR8MCxuPj4+MD5wPj4+MCk6MCl7ZG97QT1jW3A+PjJdfDA7Y1twPj4yXT1jW24+PjJdO2Nbbj4+Ml09QTtwPXArNHwwO249bisgLTR8MH13aGlsZShwPj4+MDxuPj4+MCl9fWVsc2V7dWNbY1soY1ttPj4yXXwwKSs0OD4+Ml0mMzFdKG0scCxxLGNbaD4+Ml18MCl8MDt5PShjW2g+PjJdfDApKyhxLXA8PDIpfDA7Y1toPj4yXT15fWM6ZG97aWYocT4+PjA8ZT4+PjApe3doaWxlKDEpe249YVtxPj4wXXwwO2lmKG48PDI0Pj4yND09NDYpe2JyZWFrfXo9eGNbY1soY1ttPj4yXXwwKSs0ND4+Ml0mNjNdKG0sbil8MDtBPWNbaD4+Ml18MDt5PUErNHwwO2NbaD4+Ml09eTtjW0E+PjJdPXo7cT1xKzF8MDtpZighKHE+Pj4wPGU+Pj4wKSl7YnJlYWsgY319ej1vY1tjWyhjW2o+PjJdfDApKzEyPj4yXSYxMjddKGopfDA7QT1jW2g+PjJdfDA7eT1BKzR8MDtjW2g+PjJdPXk7Y1tBPj4yXT16O3E9cSsxfDB9fXdoaWxlKDApO3VjW2NbKGNbbT4+Ml18MCkrNDg+PjJdJjMxXShtLHEsZSx5KXwwO209KGNbaD4+Ml18MCkrKG8tcTw8Mil8MDtjW2g+PjJdPW07aWYoKGR8MCkhPShlfDApKXttPWYrKGQtYjw8Mil8MH1jW2c+PjJdPW07aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59Zz1jW2wrOD4+Ml18MDtpZigoZ3wwKT09MCl7aT1rO3JldHVybn12bihnKTtpPWs7cmV0dXJufWZ1bmN0aW9uIFJpKGIsZCxlLGYsZyxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPStqO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTA7bD1pO2k9aSszMDR8MDtwPWw7dT1sKzIzMnwwO3I9bCsyNjB8MDt0PWwrMjQ4fDA7bT1sKzI0NHwwO2Q9bCsyNDB8MDtvPWwrMjUyfDA7bj1sKzI1NnwwO3g9dTtjW3g+PjJdPTM3O2NbeCs0Pj4yXT0wO3g9dSsxfDA7cz1mKzR8MDt2PWNbcz4+Ml18MDtpZigodiYyMDQ4fDApIT0wKXthW3g+PjBdPTQzO3g9dSsyfDB9aWYoKHYmMTAyNHwwKSE9MCl7YVt4Pj4wXT0zNTt4PXgrMXwwfXc9diYyNjA7dj12Pj4+MTQ7ZG97aWYoKHd8MCk9PTI2MCl7YVt4Pj4wXT03Njt3PXgrMXwwO2lmKCh2JjF8MCk9PTApe2Fbdz4+MF09OTc7dj0wO2JyZWFrfWVsc2V7YVt3Pj4wXT02NTt2PTA7YnJlYWt9fWVsc2V7YVt4Pj4wXT00NjthW3grMT4+MF09NDI7YVt4KzI+PjBdPTc2O3g9eCszfDA7aWYoKHd8MCk9PTQpe2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAyO3Y9MTticmVha31lbHNle2FbeD4+MF09NzA7dj0xO2JyZWFrfX1lbHNlIGlmKCh3fDApPT0yNTYpe2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAxO3Y9MTticmVha31lbHNle2FbeD4+MF09Njk7dj0xO2JyZWFrfX1lbHNle2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAzO3Y9MTticmVha31lbHNle2FbeD4+MF09NzE7dj0xO2JyZWFrfX19fXdoaWxlKDApO2NbdD4+Ml09cjtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7aWYodil7Y1twPj4yXT1jW2YrOD4+Ml07eD1wKzR8MDtoW2s+PjNdPWo7Y1t4Pj4yXT1jW2s+PjJdO2NbeCs0Pj4yXT1jW2srND4+Ml07dz13aShyLDMwLHcsdSxwKXwwfWVsc2V7aFtrPj4zXT1qO2NbcD4+Ml09Y1trPj4yXTtjW3ArND4+Ml09Y1trKzQ+PjJdO3c9d2kociwzMCx3LHUscCl8MH1pZigod3wwKT4yOSl7dz0oYVsxMzM2OF18MCk9PTA7aWYodil7aWYodz8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtjW3A+PjJdPWNbZis4Pj4yXTt4PXArNHwwO2hbaz4+M109ajtjW3g+PjJdPWNbaz4+Ml07Y1t4KzQ+PjJdPWNbays0Pj4yXTt3PUNpKHQsdyx1LHApfDB9ZWxzZXtpZih3PyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2hbaz4+M109ajtjW3A+PjJdPWNbaz4+Ml07Y1twKzQ+PjJdPWNbays0Pj4yXTt3PUNpKHQsdyx1LHApfDB9dD1jW3Q+PjJdfDA7aWYoKHR8MCk9PTApe3g9WGEoNCl8MDtjW3g+PjJdPTIyNjgwO3diKHh8MCwyMjcyOCwyMDYpfWVsc2V7dj10fX1lbHNle3Y9Y1t0Pj4yXXwwO3Q9MH11PXYrd3wwO3M9Y1tzPj4yXSYxNzY7ZG97aWYoKHN8MCk9PTMyKXtzPXV9ZWxzZSBpZigoc3wwKT09MTYpe3M9YVt2Pj4wXXwwO2lmKHM8PDI0Pj4yND09NDN8czw8MjQ+PjI0PT00NSl7cz12KzF8MDticmVha31pZigod3wwKT4xJnM8PDI0Pj4yND09NDg/KHg9YVt2KzE+PjBdfDAseDw8MjQ+PjI0PT04OHx4PDwyND4+MjQ9PTEyMCk6MCl7cz12KzJ8MH1lbHNle3E9NDh9fWVsc2V7cT00OH19d2hpbGUoMCk7aWYoKHF8MCk9PTQ4KXtzPXZ9aWYoKHZ8MCkhPShyfDApKXtwPXVuKHc8PDMpfDA7aWYoKHB8MCk9PTApe3g9WGEoNCl8MDtjW3g+PjJdPTIyNjgwO3diKHh8MCwyMjcyOCwyMDYpfWVsc2V7cj12O3E9cH19ZWxzZXtxPTB9dz1jW2YrMjg+PjJdfDA7Y1tvPj4yXT13O3c9dys0fDA7Y1t3Pj4yXT0oY1t3Pj4yXXwwKSsxO1FpKHIscyx1LHAsbSxkLG8pO289Y1tvPj4yXXwwO3c9bys0fDA7eD1jW3c+PjJdfDA7Y1t3Pj4yXT14KyAtMTtpZigoeHwwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfUxpKG4sY1tlPj4yXXwwLHAsY1ttPj4yXXwwLGNbZD4+Ml18MCxmLGcpO3g9Y1tuPj4yXXwwO2NbZT4+Ml09eDtjW2I+PjJdPXg7aWYoKHF8MCkhPTApe3ZuKHEpfWlmKCh0fDApPT0wKXtpPWw7cmV0dXJufXZuKHQpO2k9bDtyZXR1cm59ZnVuY3Rpb24gU2koYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wO2Q9aTtpPWkrMTkyfDA7bj1kO289ZCsxODB8MDtrPWQrMTYwfDA7bD1kKzEyfDA7YVtvKzA+PjBdPWFbMTIyNzI+PjBdfDA7YVtvKzE+PjBdPWFbMTIyNzM+PjBdfDA7YVtvKzI+PjBdPWFbMTIyNzQ+PjBdfDA7YVtvKzM+PjBdPWFbMTIyNzU+PjBdfDA7YVtvKzQ+PjBdPWFbMTIyNzY+PjBdfDA7YVtvKzU+PjBdPWFbMTIyNzc+PjBdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXA9Y1szMzQwXXwwO2Nbbj4+Ml09aDtvPXdpKGssMjAscCxvLG4pfDA7aD1rK298MDtwPWNbZis0Pj4yXSYxNzY7ZG97aWYoKHB8MCk9PTMyKXtwPWh9ZWxzZSBpZigocHwwKT09MTYpe3A9YVtrPj4wXXwwO2lmKHA8PDI0Pj4yND09NDN8cDw8MjQ+PjI0PT00NSl7cD1rKzF8MDticmVha31pZigob3wwKT4xJnA8PDI0Pj4yND09NDg/KHE9YVtrKzE+PjBdfDAscTw8MjQ+PjI0PT04OHxxPDwyND4+MjQ9PTEyMCk6MCl7cD1rKzJ8MH1lbHNle209MTF9fWVsc2V7bT0xMX19d2hpbGUoMCk7aWYoKG18MCk9PTExKXtwPWt9bT1jW2YrMjg+PjJdfDA7cT1tKzR8MDtjW3E+PjJdPShjW3E+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW24+PjJdPTEzNDQ4O2Nbbis0Pj4yXT0yMDg7Y1tuKzg+PjJdPTA7Y2coMTM0NDgsbil9cT0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7bj1jW20rOD4+Ml18MDtpZigoY1ttKzEyPj4yXXwwKS1uPj4yPj4+MD5xPj4+MD8oaj1jW24rKHE8PDIpPj4yXXwwLChqfDApIT0wKTowKXtuPW0rNHwwO3E9Y1tuPj4yXXwwO2Nbbj4+Ml09cSsgLTE7aWYoKHF8MCk9PTApe2xjW2NbKGNbbT4+Ml18MCkrOD4+Ml0mMjU1XShtKX11Y1tjWyhjW2o+PjJdfDApKzQ4Pj4yXSYzMV0oaixrLGgsbCl8MDtqPWwrKG88PDIpfDA7aWYoKHB8MCk9PShofDApKXtxPWo7cD1jW2U+PjJdfDA7TGkoYixwLGwscSxqLGYsZyk7aT1kO3JldHVybn1xPWwrKHAtazw8Mil8MDtwPWNbZT4+Ml18MDtMaShiLHAsbCxxLGosZixnKTtpPWQ7cmV0dXJufXE9WGEoNCl8MDtjW3E+PjJdPTIxMzA0O3diKHF8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIFRpKGUsZixnLGgsaixrLGwsbSxuKXtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDt2YXIgbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wO3A9aTtpPWkrMzJ8MDtxPXA7cj1wKzI0fDA7dT1wKzIwfDA7dD1wKzE2fDA7cz1wKzEyfDA7eT1jW2orMjg+PjJdfDA7RD15KzR8MDtjW0Q+PjJdPShjW0Q+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW3E+PjJdPTEzNDU2O2NbcSs0Pj4yXT0yMDg7Y1txKzg+PjJdPTA7Y2coMTM0NTYscSl9eD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7ej1jW3krOD4+Ml18MDtpZigoY1t5KzEyPj4yXXwwKS16Pj4yPj4+MD54Pj4+MD8odz1jW3orKHg8PDIpPj4yXXwwLCh3fDApIT0wKTowKXtDPXkrNHwwO0Q9Y1tDPj4yXXwwO2NbQz4+Ml09RCsgLTE7aWYoKER8MCk9PTApe2xjW2NbKGNbeT4+Ml18MCkrOD4+Ml0mMjU1XSh5KX1jW2s+PjJdPTA7YTpkb3tpZigobXwwKSE9KG58MCkpe3g9dys4fDA7eT0wO2I6d2hpbGUoMSl7ej15O3k9Zzt3aGlsZSgxKXtpZigoenwwKSE9MCl7Zz15O2JyZWFrIGF9aWYoKHl8MCkhPTApe2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RD0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7Zz1EPzA6eTt5PUQ/MDp5fWVsc2V7Zz15fX1lbHNle2c9MDt5PTB9ej0oZ3wwKT09MDtkb3tpZigoaHwwKSE9MCl7aWYoKGNbaCsxMj4+Ml18MCk9PShjW2grMTY+PjJdfDApPyhvY1tjWyhjW2g+PjJdfDApKzM2Pj4yXSYxMjddKGgpfDApPT0tMTowKXtvPTIwO2JyZWFrfWlmKCF6KXtvPTIxO2JyZWFrIGJ9fWVsc2V7bz0yMH19d2hpbGUoMCk7aWYoKG98MCk9PTIwKXtvPTA7aWYoeil7aD0wO289MjE7YnJlYWsgYn1lbHNle2g9MH19aWYoKGhjW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjYzXSh3LGFbbT4+MF18MCwwKXwwKTw8MjQ+PjI0PT0zNyl7bz0yMzticmVha316PWFbbT4+MF18MDtpZih6PDwyND4+MjQ+LTE/KHY9Y1t4Pj4yXXwwLCEoKGJbdisoejw8MjQ+PjI0PDwxKT4+MV0mODE5Mik9PTApKTowKXtvPTM0O2JyZWFrfXo9ZysxMnwwO0I9Y1t6Pj4yXXwwO0E9ZysxNnwwO2lmKChCfDApPT0oY1tBPj4yXXwwKSl7Qj1vY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSYxMjddKGcpfDB9ZWxzZXtCPWRbQj4+MF18MH1EPXhjW2NbKGNbdz4+Ml18MCkrMTI+PjJdJjYzXSh3LEImMjU1KXwwO2lmKEQ8PDI0Pj4yND09KHhjW2NbKGNbdz4+Ml18MCkrMTI+PjJdJjYzXSh3LGFbbT4+MF18MCl8MCk8PDI0Pj4yNCl7bz01OTticmVha31jW2s+PjJdPTQ7ej00fWM6ZG97aWYoKG98MCk9PTIzKXtvPTA7ej1tKzF8MDtpZigoenwwKT09KG58MCkpe289MjQ7YnJlYWsgYn15PWhjW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjYzXSh3LGFbej4+MF18MCwwKXwwO2lmKHk8PDI0Pj4yND09NDh8eTw8MjQ+PjI0PT02OSl7ej1tKzJ8MDtpZigoenwwKT09KG58MCkpe289Mjc7YnJlYWsgYn1tPXo7ej1oY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSY2M10odyxhW3o+PjBdfDAsMCl8MH1lbHNle209ejt6PXk7eT0wfUQ9Y1soY1tmPj4yXXwwKSszNj4+Ml18MDtjW3Q+PjJdPWc7Y1tzPj4yXT1oO2NbciswPj4yXT1jW3QrMD4+Ml07Y1txKzA+PjJdPWNbcyswPj4yXTtuY1tEJjMxXSh1LGYscixxLGosayxsLHoseSk7bT1tKzF8MDtnPWNbdT4+Ml18MH1lbHNlIGlmKChvfDApPT0zNCl7d2hpbGUoMSl7bz0wO209bSsxfDA7aWYoKG18MCk9PShufDApKXttPW47YnJlYWt9ej1hW20+PjBdfDA7aWYoISh6PDwyND4+MjQ+LTEpKXticmVha31pZigoYlt2Kyh6PDwyND4+MjQ8PDEpPj4xXSY4MTkyKT09MCl7YnJlYWt9ZWxzZXtvPTM0fX1CPWg7QT1oO3doaWxlKDEpe2lmKChnfDApIT0wKXtpZigoY1tnKzEyPj4yXXwwKT09KGNbZysxNj4+Ml18MCkpe0Q9KG9jW2NbKGNbZz4+Ml18MCkrMzY+PjJdJjEyN10oZyl8MCk9PS0xO2c9RD8wOmc7eT1EPzA6eX19ZWxzZXtnPTB9Qz0oZ3wwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZihDKXt6PUI7YnJlYWt9ZWxzZXtnPXk7YnJlYWsgY319aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZihDXihCfDApPT0wKXt6PUI7QT1CfWVsc2V7Zz15O2JyZWFrIGN9fWVsc2V7ej0wO2g9MDtvPTQ1fX1lbHNle3o9QjtvPTQ1fX13aGlsZSgwKTtpZigob3wwKT09NDUpe289MDtpZihDKXtnPXk7YnJlYWsgY31lbHNle0E9MH19Qj1nKzEyfDA7RD1jW0I+PjJdfDA7Qz1nKzE2fDA7aWYoKER8MCk9PShjW0M+PjJdfDApKXtEPW9jW2NbKGNbZz4+Ml18MCkrMzY+PjJdJjEyN10oZyl8MH1lbHNle0Q9ZFtEPj4wXXwwfWlmKCEoKEQmMjU1KTw8MjQ+PjI0Pi0xKSl7Zz15O2JyZWFrIGN9aWYoKGJbKGNbeD4+Ml18MCkrKEQ8PDI0Pj4yNDw8MSk+PjFdJjgxOTIpPT0wKXtnPXk7YnJlYWsgY31EPWNbQj4+Ml18MDtpZigoRHwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbZz4+Ml18MCkrNDA+PjJdJjEyN10oZyl8MDtCPXo7Y29udGludWV9ZWxzZXtjW0I+PjJdPUQrMTtCPXo7Y29udGludWV9fX1lbHNlIGlmKChvfDApPT01OSl7bz0wO0I9Y1t6Pj4yXXwwO2lmKChCfDApPT0oY1tBPj4yXXwwKSl7b2NbY1soY1tnPj4yXXwwKSs0MD4+Ml0mMTI3XShnKXwwfWVsc2V7Y1t6Pj4yXT1CKzF9bT1tKzF8MDtnPXl9fXdoaWxlKDApO2lmKChtfDApPT0obnwwKSl7YnJlYWsgYX15PWNbaz4+Ml18MH1pZigob3wwKT09MjEpe2Nbaz4+Ml09NDticmVha31lbHNlIGlmKChvfDApPT0yNCl7Y1trPj4yXT00O2JyZWFrfWVsc2UgaWYoKG98MCk9PTI3KXtjW2s+PjJdPTQ7YnJlYWt9fX13aGlsZSgwKTtpZigoZ3wwKSE9MCl7aWYoKGNbZysxMj4+Ml18MCk9PShjW2crMTY+PjJdfDApKXtEPShvY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSYxMjddKGcpfDApPT0tMTtnPUQ/MDpnfX1lbHNle2c9MH1mPShnfDApPT0wO2Rve2lmKChofDApIT0wKXtpZigoY1toKzEyPj4yXXwwKT09KGNbaCsxNj4+Ml18MCk/KG9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MCk9PS0xOjApe289NzE7YnJlYWt9aWYoZil7Y1tlPj4yXT1nO2k9cDtyZXR1cm59fWVsc2V7bz03MX19d2hpbGUoMCk7aWYoKG98MCk9PTcxPyFmOjApe2NbZT4+Ml09ZztpPXA7cmV0dXJufWNbaz4+Ml09Y1trPj4yXXwyO2NbZT4+Ml09ZztpPXA7cmV0dXJufUQ9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIFVpKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFZpKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBXaShhKXthPWF8MDtyZXR1cm4gMn1mdW5jdGlvbiBYaShhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wO2o9aTtUaShhLGIsY1tkPj4yXXwwLGNbZT4+Ml18MCxmLGcsaCwxMjM3NiwxMjM4NHwwKTtpPWo7cmV0dXJufWZ1bmN0aW9uIFlpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTA7az1pO209ZCs4fDA7bT1vY1tjWyhjW20+PjJdfDApKzIwPj4yXSYxMjddKG0pfDA7bj1hW20+PjBdfDA7aWYoKG4mMSk9PTApe2w9bSsxfDA7bT0obiYyNTUpPj4+MX1lbHNle2w9Y1ttKzg+PjJdfDA7bT1jW20rND4+Ml18MH1UaShiLGQsY1tlPj4yXXwwLGNbZj4+Ml18MCxnLGgsaixsLGwrbXwwKTtpPWs7cmV0dXJufWZ1bmN0aW9uIFppKGEsYixkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTA7aj1pO2k9aSsxNnwwO2w9ajtmPWNbZisyOD4+Ml18MDttPWYrNHwwO2NbbT4+Ml09KGNbbT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1sPShjWzEzNDYwPj4yXXwwKSsgLTF8MDttPWNbZis4Pj4yXXwwO2lmKChjW2YrMTI+PjJdfDApLW0+PjI+Pj4wPmw+Pj4wPyhrPWNbbSsobDw8Mik+PjJdfDAsKGt8MCkhPTApOjApe2w9Zis0fDA7bT1jW2w+PjJdfDA7Y1tsPj4yXT1tKyAtMTtpZigobXwwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfW09Y1tlPj4yXXwwO2I9Yis4fDA7Yj1vY1tjW2NbYj4+Ml0+PjJdJjEyN10oYil8MDtiPShNaChkLG0sYixiKzE2OHwwLGssZywwKXwwKS1ifDA7aWYoKGJ8MCk+PTE2OCl7bT1jW2Q+PjJdfDA7Y1thPj4yXT1tO2k9ajtyZXR1cm59Y1toKzI0Pj4yXT0oKGJ8MCkvMTJ8MHwwKSU3fDA7bT1jW2Q+PjJdfDA7Y1thPj4yXT1tO2k9ajtyZXR1cm59bT1YYSg0KXwwO2NbbT4+Ml09MjEzMDQ7d2IobXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gX2koYSxiLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MDtqPWk7aT1pKzE2fDA7bD1qO2Y9Y1tmKzI4Pj4yXXwwO209Zis0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tsPj4yXT0xMzQ1NjtjW2wrND4+Ml09MjA4O2NbbCs4Pj4yXT0wO2NnKDEzNDU2LGwpfWw9KGNbMTM0NjA+PjJdfDApKyAtMXwwO209Y1tmKzg+PjJdfDA7aWYoKGNbZisxMj4+Ml18MCktbT4+Mj4+PjA+bD4+PjA/KGs9Y1ttKyhsPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7bD1mKzR8MDttPWNbbD4+Ml18MDtjW2w+PjJdPW0rIC0xO2lmKChtfDApPT0wKXtsY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZil9bT1jW2U+PjJdfDA7Yj1iKzh8MDtiPW9jW2NbKGNbYj4+Ml18MCkrND4+Ml0mMTI3XShiKXwwO2I9KE1oKGQsbSxiLGIrMjg4fDAsayxnLDApfDApLWJ8MDtpZigoYnwwKT49Mjg4KXttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1jW2grMTY+PjJdPSgoYnwwKS8xMnwwfDApJTEyfDA7bT1jW2Q+PjJdfDA7Y1thPj4yXT1tO2k9ajtyZXR1cm59bT1YYSg0KXwwO2NbbT4+Ml09MjEzMDQ7d2IobXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gJGkoYSxiLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wO2I9aTtpPWkrMTZ8MDtrPWI7Zj1jW2YrMjg+PjJdfDA7bD1mKzR8MDtjW2w+PjJdPShjW2w+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2s+PjJdPTEzNDU2O2Nbays0Pj4yXT0yMDg7Y1trKzg+PjJdPTA7Y2coMTM0NTYsayl9az0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7bD1jW2YrOD4+Ml18MDtpZigoY1tmKzEyPj4yXXwwKS1sPj4yPj4+MD5rPj4+MD8oaj1jW2wrKGs8PDIpPj4yXXwwLChqfDApIT0wKTowKXtrPWYrNHwwO2w9Y1trPj4yXXwwO2Nbaz4+Ml09bCsgLTE7aWYoKGx8MCk9PTApe2xjW2NbKGNbZj4+Ml18MCkrOD4+Ml0mMjU1XShmKX1lPWJqKGQsY1tlPj4yXXwwLGcsaiw0KXwwO2lmKChjW2c+PjJdJjR8MCkhPTApe2w9Y1tkPj4yXXwwO2NbYT4+Ml09bDtpPWI7cmV0dXJufWlmKChlfDApPDY5KXtnPWUrMmUzfDB9ZWxzZXtnPShlKyAtNjl8MCk+Pj4wPDMxP2UrMTkwMHwwOmV9Y1toKzIwPj4yXT1nKyAtMTkwMDtsPWNbZD4+Ml18MDtjW2E+PjJdPWw7aT1iO3JldHVybn1sPVhhKDQpfDA7Y1tsPj4yXT0yMTMwNDt3YihsfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBhaihlLGYsZyxoLGosayxsLG0sbil7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7dmFyIG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTA7bj1pO2k9aSs2NHwwO3c9bjtFPW4rMTZ8MDtyPW4rMjh8MDt1PW4rMjR8MDt2PW4rMzJ8MDt5PW4rMTJ8MDt6PW4rMjB8MDt4PW4rMzZ8MDtCPW4rNDB8MDt0PW4rNDR8MDtzPW4rNDh8MDtjW2s+PjJdPTA7QT1jW2orMjg+PjJdfDA7RD1BKzR8MDtjW0Q+PjJdPShjW0Q+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW3c+PjJdPTEzNDU2O2Nbdys0Pj4yXT0yMDg7Y1t3Kzg+PjJdPTA7Y2coMTM0NTYsdyl9Qz0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7RD1jW0ErOD4+Ml18MDtpZigoY1tBKzEyPj4yXXwwKS1EPj4yPj4+MD5DPj4+MD8ocD1jW0QrKEM8PDIpPj4yXXwwLChwfDApIT0wKTowKXtDPUErNHwwO0Q9Y1tDPj4yXXwwO2NbQz4+Ml09RCsgLTE7aWYoKER8MCk9PTApe2xjW2NbKGNbQT4+Ml18MCkrOD4+Ml0mMjU1XShBKX1hOmRve3N3aXRjaChtPDwyND4+MjR8MCl7Y2FzZSAxMTI6e289bCs4fDA7bD1jW2g+PjJdfDA7aD1mKzh8MDtoPW9jW2NbKGNbaD4+Ml18MCkrOD4+Ml0mMTI3XShoKXwwO2Y9YVtoPj4wXXwwO2lmKChmJjEpPT0wKXtmPShmJjI1NSk+Pj4xfWVsc2V7Zj1jW2grND4+Ml18MH1qPWFbaCsxMj4+MF18MDtpZigoaiYxKT09MCl7aj0oaiYyNTUpPj4+MX1lbHNle2o9Y1toKzE2Pj4yXXwwfWlmKChmfDApPT0oMC1qfDApKXtjW2s+PjJdPWNbaz4+Ml18NDticmVhayBhfUU9TWgoZyxsLGgsaCsyNHwwLHAsaywwKXwwO2s9RS1ofDA7aWYoKEV8MCk9PShofDApPyhjW28+PjJdfDApPT0xMjowKXtjW28+PjJdPTA7YnJlYWsgYX1pZigoa3wwKT09MTI/KHE9Y1tvPj4yXXwwLChxfDApPDEyKTowKXtjW28+PjJdPXErMTJ9YnJlYWt9O2Nhc2UgMTIwOntEPWNbKGNbZj4+Ml18MCkrMjA+PjJdfDA7Y1tCPj4yXT1jW2c+PjJdO2NbdD4+Ml09Y1toPj4yXTtjW0UrMD4+Ml09Y1tCKzA+PjJdO2NbdyswPj4yXT1jW3QrMD4+Ml07aWNbRCY2M10oZSxmLEUsdyxqLGssbCk7aT1uO3JldHVybn07Y2FzZSA4ODp7cT1mKzh8MDtxPW9jW2NbKGNbcT4+Ml18MCkrMjQ+PjJdJjEyN10ocSl8MDtwPWFbcT4+MF18MDtpZigocCYxKT09MCl7bz1xKzF8MDtwPShwJjI1NSk+Pj4xfWVsc2V7bz1jW3ErOD4+Ml18MDtwPWNbcSs0Pj4yXXwwfVRpKHMsZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLG8sbytwfDApO2NbZz4+Ml09Y1tzPj4yXTticmVha307Y2FzZSAxMjE6e289bCsyMHwwO2w9YmooZyxjW2g+PjJdfDAsayxwLDQpfDA7aWYoKGNbaz4+Ml0mNHwwKT09MCl7aWYoKGx8MCk8Njkpe2s9bCsyZTN8MH1lbHNle2s9KGwrIC02OXwwKT4+PjA8MzE/bCsxOTAwfDA6bH1jW28+PjJdPWsrIC0xOTAwfWJyZWFrfTtjYXNlIDgzOntvPWJqKGcsY1toPj4yXXwwLGsscCwyKXwwO3A9Y1trPj4yXXwwO2lmKChwJjR8MCk9PTAmKG98MCk8NjEpe2NbbD4+Ml09bzticmVhayBhfWVsc2V7Y1trPj4yXT1wfDQ7YnJlYWsgYX19O2Nhc2UgODI6e1RpKHosZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLDEyNDE2LDEyNDIxfDApO2NbZz4+Ml09Y1t6Pj4yXTticmVha307Y2FzZSAxMTQ6e1RpKHksZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLDEyNDAwLDEyNDExfDApO2NbZz4+Ml09Y1t5Pj4yXTticmVha307Y2FzZSA4OTp7bz1iaihnLGNbaD4+Ml18MCxrLHAsNCl8MDtpZigoY1trPj4yXSY0fDApPT0wKXtjW2wrMjA+PjJdPW8rIC0xOTAwfWJyZWFrfTtjYXNlIDM3OntsPWNbaD4+Ml18MDtoPWNbZz4+Ml18MDtkb3tpZigoaHwwKSE9MCl7aWYoKGNbaCsxMj4+Ml18MCk9PShjW2grMTY+PjJdfDApKXtpZigob2NbY1soY1toPj4yXXwwKSszNj4+Ml0mMTI3XShoKXwwKT09LTEpe2NbZz4+Ml09MDtoPTA7YnJlYWt9ZWxzZXtoPWNbZz4+Ml18MDticmVha319fWVsc2V7aD0wfX13aGlsZSgwKTtoPShofDApPT0wO2Rve2lmKChsfDApIT0wKXtpZigoY1tsKzEyPj4yXXwwKT09KGNbbCsxNj4+Ml18MCk/KG9jW2NbKGNbbD4+Ml18MCkrMzY+PjJdJjEyN10obCl8MCk9PS0xOjApe289MTE1O2JyZWFrfWlmKCFoKXtvPTExNn19ZWxzZXtvPTExNX19d2hpbGUoMCk7aWYoKG98MCk9PTExNSl7aWYoaCl7bz0xMTZ9ZWxzZXtsPTB9fWlmKChvfDApPT0xMTYpe2Nbaz4+Ml09Y1trPj4yXXw2O2JyZWFrIGF9aD1jW2c+PjJdfDA7Zj1jW2grMTI+PjJdfDA7aWYoKGZ8MCk9PShjW2grMTY+PjJdfDApKXtoPW9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MH1lbHNle2g9ZFtmPj4wXXwwfWlmKCEoKGhjW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjYzXShwLGgmMjU1LDApfDApPDwyND4+MjQ9PTM3KSl7Y1trPj4yXT1jW2s+PjJdfDQ7YnJlYWsgYX1wPWNbZz4+Ml18MDtoPXArMTJ8MDtmPWNbaD4+Ml18MDtpZigoZnwwKT09KGNbcCsxNj4+Ml18MCkpe29jW2NbKGNbcD4+Ml18MCkrNDA+PjJdJjEyN10ocCl8MH1lbHNle2NbaD4+Ml09ZisxfXA9Y1tnPj4yXXwwO2Rve2lmKChwfDApIT0wKXtpZigoY1twKzEyPj4yXXwwKT09KGNbcCsxNj4+Ml18MCkpe2lmKChvY1tjWyhjW3A+PjJdfDApKzM2Pj4yXSYxMjddKHApfDApPT0tMSl7Y1tnPj4yXT0wO3A9MDticmVha31lbHNle3A9Y1tnPj4yXXwwO2JyZWFrfX19ZWxzZXtwPTB9fXdoaWxlKDApO3A9KHB8MCk9PTA7ZG97aWYoKGx8MCkhPTApe2lmKChjW2wrMTI+PjJdfDApPT0oY1tsKzE2Pj4yXXwwKT8ob2NbY1soY1tsPj4yXXwwKSszNj4+Ml0mMTI3XShsKXwwKT09LTE6MCl7bz0xMzQ7YnJlYWt9aWYocCl7YnJlYWsgYX19ZWxzZXtvPTEzNH19d2hpbGUoMCk7aWYoKG98MCk9PTEzND8hcDowKXticmVhayBhfWNbaz4+Ml09Y1trPj4yXXwyO2JyZWFrfTtjYXNlIDg0OntUaSh4LGYsY1tnPj4yXXwwLGNbaD4+Ml18MCxqLGssbCwxMjQyNCwxMjQzMnwwKTtjW2c+PjJdPWNbeD4+Ml07YnJlYWt9O2Nhc2UgMTE5OntvPWJqKGcsY1toPj4yXXwwLGsscCwxKXwwO3A9Y1trPj4yXXwwO2lmKChwJjR8MCk9PTAmKG98MCk8Nyl7Y1tsKzI0Pj4yXT1vO2JyZWFrIGF9ZWxzZXtjW2s+PjJdPXB8NDticmVhayBhfX07Y2FzZSAxMDk6e289YmooZyxjW2g+PjJdfDAsayxwLDIpfDA7cD1jW2s+PjJdfDA7aWYoKHAmNHwwKT09MCYob3wwKTwxMyl7Y1tsKzE2Pj4yXT1vKyAtMTticmVhayBhfWVsc2V7Y1trPj4yXT1wfDQ7YnJlYWsgYX19O2Nhc2UgNzc6e289YmooZyxjW2g+PjJdfDAsayxwLDIpfDA7cD1jW2s+PjJdfDA7aWYoKHAmNHwwKT09MCYob3wwKTw2MCl7Y1tsKzQ+PjJdPW87YnJlYWsgYX1lbHNle2Nbaz4+Ml09cHw0O2JyZWFrIGF9fTtjYXNlIDEwNjp7bz1iaihnLGNbaD4+Ml18MCxrLHAsMyl8MDtwPWNbaz4+Ml18MDtpZigocCY0fDApPT0wJihvfDApPDM2Nil7Y1tsKzI4Pj4yXT1vO2JyZWFrIGF9ZWxzZXtjW2s+PjJdPXB8NDticmVhayBhfX07Y2FzZSA3Mjp7cD1iaihnLGNbaD4+Ml18MCxrLHAsMil8MDtvPWNbaz4+Ml18MDtpZigobyY0fDApPT0wJihwfDApPDI0KXtjW2wrOD4+Ml09cDticmVhayBhfWVsc2V7Y1trPj4yXT1vfDQ7YnJlYWsgYX19O2Nhc2UgNzA6e1RpKHYsZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLDEyMzkyLDEyNDAwfDApO2NbZz4+Ml09Y1t2Pj4yXTticmVha307Y2FzZSA2ODp7VGkodSxmLGNbZz4+Ml18MCxjW2g+PjJdfDAsaixrLGwsMTIzODQsMTIzOTJ8MCk7Y1tnPj4yXT1jW3U+PjJdO2JyZWFrfTtjYXNlIDEwNDpjYXNlIDY2OmNhc2UgOTg6e0Q9Y1toPj4yXXwwO0U9Zis4fDA7RT1vY1tjWyhjW0U+PjJdfDApKzQ+PjJdJjEyN10oRSl8MDtrPShNaChnLEQsRSxFKzI4OHwwLHAsaywwKXwwKS1FfDA7aWYoKGt8MCk8Mjg4KXtjW2wrMTY+PjJdPSgoa3wwKS8xMnwwfDApJTEyfDB9YnJlYWt9O2Nhc2UgNzM6e289bCs4fDA7bD1iaihnLGNbaD4+Ml18MCxrLHAsMil8MDtwPWNbaz4+Ml18MDtpZigocCY0fDApPT0wPyhsKyAtMXwwKT4+PjA8MTI6MCl7Y1tvPj4yXT1sO2JyZWFrIGF9Y1trPj4yXT1wfDQ7YnJlYWt9O2Nhc2UgNjU6Y2FzZSA5Nzp7RD1jW2g+PjJdfDA7RT1mKzh8MDtFPW9jW2NbY1tFPj4yXT4+Ml0mMTI3XShFKXwwO2s9KE1oKGcsRCxFLEUrMTY4fDAscCxrLDApfDApLUV8MDtpZigoa3wwKTwxNjgpe2NbbCsyND4+Ml09KChrfDApLzEyfDB8MCklN3wwfWJyZWFrfTtjYXNlIDEwMTpjYXNlIDEwMDp7bz1sKzEyfDA7bD1iaihnLGNbaD4+Ml18MCxrLHAsMil8MDtwPWNbaz4+Ml18MDtpZigocCY0fDApPT0wPyhsKyAtMXwwKT4+PjA8MzE6MCl7Y1tvPj4yXT1sO2JyZWFrIGF9Y1trPj4yXT1wfDQ7YnJlYWt9O2Nhc2UgMTE2OmNhc2UgMTEwOntsPXArOHwwO3A9Y1toPj4yXXwwO2I6d2hpbGUoMSl7aD1jW2c+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKChjW2grMTI+PjJdfDApPT0oY1toKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MCk9PS0xKXtjW2c+PjJdPTA7aD0wO2JyZWFrfWVsc2V7aD1jW2c+PjJdfDA7YnJlYWt9fX1lbHNle2g9MH19d2hpbGUoMCk7aD0oaHwwKT09MDtkb3tpZigocHwwKSE9MCl7aWYoKGNbcCsxMj4+Ml18MCkhPShjW3ArMTY+PjJdfDApKXtpZihoKXticmVha31lbHNle2JyZWFrIGJ9fWlmKCEoKG9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MCk9PS0xKSl7aWYoIWgpe2JyZWFrIGJ9fWVsc2V7bz01MH19ZWxzZXtvPTUwfX13aGlsZSgwKTtpZigob3wwKT09NTApe289MDtpZihoKXtwPTA7YnJlYWt9ZWxzZXtwPTB9fWg9Y1tnPj4yXXwwO2Y9Y1toKzEyPj4yXXwwO2lmKChmfDApPT0oY1toKzE2Pj4yXXwwKSl7aD1vY1tjWyhjW2g+PjJdfDApKzM2Pj4yXSYxMjddKGgpfDB9ZWxzZXtoPWRbZj4+MF18MH1pZighKChoJjI1NSk8PDI0Pj4yND4tMSkpe2JyZWFrfWlmKChiWyhjW2w+PjJdfDApKyhoPDwyND4+MjQ8PDEpPj4xXSY4MTkyKT09MCl7YnJlYWt9aj1jW2c+PjJdfDA7aD1qKzEyfDA7Zj1jW2g+PjJdfDA7aWYoKGZ8MCk9PShjW2orMTY+PjJdfDApKXtvY1tjWyhjW2o+PjJdfDApKzQwPj4yXSYxMjddKGopfDA7Y29udGludWV9ZWxzZXtjW2g+PjJdPWYrMTtjb250aW51ZX19bD1jW2c+PjJdfDA7ZG97aWYoKGx8MCkhPTApe2lmKChjW2wrMTI+PjJdfDApPT0oY1tsKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbbD4+Ml18MCkrMzY+PjJdJjEyN10obCl8MCk9PS0xKXtjW2c+PjJdPTA7bD0wO2JyZWFrfWVsc2V7bD1jW2c+PjJdfDA7YnJlYWt9fX1lbHNle2w9MH19d2hpbGUoMCk7bD0obHwwKT09MDtkb3tpZigocHwwKSE9MCl7aWYoKGNbcCsxMj4+Ml18MCk9PShjW3ArMTY+PjJdfDApPyhvY1tjWyhjW3A+PjJdfDApKzM2Pj4yXSYxMjddKHApfDApPT0tMTowKXtvPTY5O2JyZWFrfWlmKGwpe2JyZWFrIGF9fWVsc2V7bz02OX19d2hpbGUoMCk7aWYoKG98MCk9PTY5PyFsOjApe2JyZWFrIGF9Y1trPj4yXT1jW2s+PjJdfDI7YnJlYWt9O2Nhc2UgOTk6e3E9Zis4fDA7cT1vY1tjWyhjW3E+PjJdfDApKzEyPj4yXSYxMjddKHEpfDA7cD1hW3E+PjBdfDA7aWYoKHAmMSk9PTApe289cSsxfDA7cD0ocCYyNTUpPj4+MX1lbHNle289Y1txKzg+PjJdfDA7cD1jW3ErND4+Ml18MH1UaShyLGYsY1tnPj4yXXwwLGNbaD4+Ml18MCxqLGssbCxvLG8rcHwwKTtjW2c+PjJdPWNbcj4+Ml07YnJlYWt9O2RlZmF1bHQ6e2Nbaz4+Ml09Y1trPj4yXXw0fX19d2hpbGUoMCk7Y1tlPj4yXT1jW2c+PjJdO2k9bjtyZXR1cm59RT1YYSg0KXwwO2NbRT4+Ml09MjEzMDQ7d2IoRXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gYmooYSxlLGYsZyxoKXthPWF8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2o9aTtsPWNbYT4+Ml18MDtkb3tpZigobHwwKSE9MCl7aWYoKGNbbCsxMj4+Ml18MCk9PShjW2wrMTY+PjJdfDApKXtpZigob2NbY1soY1tsPj4yXXwwKSszNj4+Ml0mMTI3XShsKXwwKT09LTEpe2NbYT4+Ml09MDtsPTA7YnJlYWt9ZWxzZXtsPWNbYT4+Ml18MDticmVha319fWVsc2V7bD0wfX13aGlsZSgwKTtsPShsfDApPT0wO2Rve2lmKChlfDApIT0wKXtpZigoY1tlKzEyPj4yXXwwKT09KGNbZSsxNj4+Ml18MCk/KG9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MCk9PS0xOjApe209MTA7YnJlYWt9aWYoIWwpe209MTF9fWVsc2V7bT0xMH19d2hpbGUoMCk7aWYoKG18MCk9PTEwKXtpZihsKXttPTExfWVsc2V7ZT0wfX1pZigobXwwKT09MTEpe2NbZj4+Ml09Y1tmPj4yXXw2O3A9MDtpPWo7cmV0dXJuIHB8MH1tPWNbYT4+Ml18MDtsPWNbbSsxMj4+Ml18MDtpZigobHwwKT09KGNbbSsxNj4+Ml18MCkpe209b2NbY1soY1ttPj4yXXwwKSszNj4+Ml0mMTI3XShtKXwwfWVsc2V7bT1kW2w+PjBdfDB9bD1tJjI1NTtpZihsPDwyND4+MjQ+LTE/KGs9Zys4fDAsISgoYlsoY1trPj4yXXwwKSsobTw8MjQ+PjI0PDwxKT4+MV0mMjA0OCk9PTApKTowKXtsPShoY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSY2M10oZyxsLDApfDApPDwyND4+MjQ7bz1jW2E+PjJdfDA7bT1vKzEyfDA7bj1jW20+PjJdfDA7aWYoKG58MCk9PShjW28rMTY+PjJdfDApKXtvY1tjWyhjW28+PjJdfDApKzQwPj4yXSYxMjddKG8pfDA7bj1lO209ZX1lbHNle2NbbT4+Ml09bisxO249ZTttPWV9d2hpbGUoMSl7bD1sKyAtNDh8MDtoPWgrIC0xfDA7ZT1jW2E+PjJdfDA7ZG97aWYoKGV8MCkhPTApe2lmKChjW2UrMTI+PjJdfDApPT0oY1tlKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MCk9PS0xKXtjW2E+PjJdPTA7ZT0wO2JyZWFrfWVsc2V7ZT1jW2E+PjJdfDA7YnJlYWt9fX1lbHNle2U9MH19d2hpbGUoMCk7bz0oZXwwKT09MDtpZigobXwwKSE9MCl7aWYoKGNbbSsxMj4+Ml18MCk9PShjW20rMTY+PjJdfDApKXttPShvY1tjWyhjW20+PjJdfDApKzM2Pj4yXSYxMjddKG0pfDApPT0tMTtlPW0/MDpuO209bT8wOm59ZWxzZXtlPW59fWVsc2V7ZT1uO209MH1uPWNbYT4+Ml18MDtpZighKChvXihtfDApPT0wKSYoaHwwKT4wKSl7bT0zODticmVha31vPWNbbisxMj4+Ml18MDtpZigob3wwKT09KGNbbisxNj4+Ml18MCkpe249b2NbY1soY1tuPj4yXXwwKSszNj4+Ml0mMTI3XShuKXwwfWVsc2V7bj1kW28+PjBdfDB9bz1uJjI1NTtpZighKG88PDI0Pj4yND4tMSkpe209NDk7YnJlYWt9aWYoKGJbKGNbaz4+Ml18MCkrKG48PDI0Pj4yNDw8MSk+PjFdJjIwNDgpPT0wKXttPTQ5O2JyZWFrfWw9KChoY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSY2M10oZyxvLDApfDApPDwyND4+MjQpKyhsKjEwfDApfDA7bj1jW2E+PjJdfDA7cD1uKzEyfDA7bz1jW3A+PjJdfDA7aWYoKG98MCk9PShjW24rMTY+PjJdfDApKXtvY1tjWyhjW24+PjJdfDApKzQwPj4yXSYxMjddKG4pfDA7bj1lO2NvbnRpbnVlfWVsc2V7Y1twPj4yXT1vKzE7bj1lO2NvbnRpbnVlfX1pZigobXwwKT09Mzgpe2Rve2lmKChufDApIT0wKXtpZigoY1tuKzEyPj4yXXwwKT09KGNbbisxNj4+Ml18MCkpe2lmKChvY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDApPT0tMSl7Y1thPj4yXT0wO249MDticmVha31lbHNle249Y1thPj4yXXwwO2JyZWFrfX19ZWxzZXtuPTB9fXdoaWxlKDApO2c9KG58MCk9PTA7ZG97aWYoKGV8MCkhPTApe2lmKChjW2UrMTI+PjJdfDApPT0oY1tlKzE2Pj4yXXwwKT8ob2NbY1soY1tlPj4yXXwwKSszNj4+Ml0mMTI3XShlKXwwKT09LTE6MCl7bT00NzticmVha31pZihnKXtwPWw7aT1qO3JldHVybiBwfDB9fWVsc2V7bT00N319d2hpbGUoMCk7aWYoKG18MCk9PTQ3PyFnOjApe3A9bDtpPWo7cmV0dXJuIHB8MH1jW2Y+PjJdPWNbZj4+Ml18MjtwPWw7aT1qO3JldHVybiBwfDB9ZWxzZSBpZigobXwwKT09NDkpe2k9ajtyZXR1cm4gbHwwfX1jW2Y+PjJdPWNbZj4+Ml18NDtwPTA7aT1qO3JldHVybiBwfDB9ZnVuY3Rpb24gY2ooYSxiLGQsZSxmLGcsaCxqLGspe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wO209aTtpPWkrMzJ8MDtvPW07cD1tKzI0fDA7bj1tKzIwfDA7cj1tKzE2fDA7cT1tKzEyfDA7dD1jW2YrMjg+PjJdfDA7eT10KzR8MDtjW3k+PjJdPShjW3k+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW28+PjJdPTEzNDQ4O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM0NDgsbyl9dT0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dj1jW3QrOD4+Ml18MDtpZigoY1t0KzEyPj4yXXwwKS12Pj4yPj4+MD51Pj4+MD8ocz1jW3YrKHU8PDIpPj4yXXwwLChzfDApIT0wKTowKXt4PXQrNHwwO3k9Y1t4Pj4yXXwwO2NbeD4+Ml09eSsgLTE7aWYoKHl8MCk9PTApe2xjW2NbKGNbdD4+Ml18MCkrOD4+Ml0mMjU1XSh0KX1jW2c+PjJdPTA7YTpkb3tpZigoanwwKSE9KGt8MCkpe3Q9MDtiOndoaWxlKDEpe3U9dDt0PWQ7d2hpbGUoMSl7aWYoKHV8MCkhPTApe2Q9dDticmVhayBhfWlmKCh0fDApPT0wKXt1PTE7ZD0wO3Q9MH1lbHNle2Q9Y1t0KzEyPj4yXXwwO2lmKChkfDApPT0oY1t0KzE2Pj4yXXwwKSl7ZD1vY1tjWyhjW3Q+PjJdfDApKzM2Pj4yXSYxMjddKHQpfDB9ZWxzZXtkPWNbZD4+Ml18MH15PShkfDApPT0tMTt1PXk/MTowO2Q9eT8wOnQ7dD15PzA6dH1pZigoZXwwKSE9MCl7dj1jW2UrMTI+PjJdfDA7aWYoKHZ8MCk9PShjW2UrMTY+PjJdfDApKXt2PW9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MH1lbHNle3Y9Y1t2Pj4yXXwwfWlmKCEoKHZ8MCk9PS0xKSl7aWYoIXUpe2w9MjU7YnJlYWsgYn19ZWxzZXtsPTIzfX1lbHNle2w9MjN9aWYoKGx8MCk9PTIzKXtsPTA7aWYodSl7ZT0wO2w9MjU7YnJlYWsgYn1lbHNle2U9MH19aWYoKGhjW2NbKGNbcz4+Ml18MCkrNTI+PjJdJjYzXShzLGNbaj4+Ml18MCwwKXwwKTw8MjQ+PjI0PT0zNyl7bD0yNzticmVha31pZihoY1tjWyhjW3M+PjJdfDApKzEyPj4yXSY2M10ocyw4MTkyLGNbaj4+Ml18MCl8MCl7bD0zNzticmVha311PWQrMTJ8MDt3PWNbdT4+Ml18MDt2PWQrMTZ8MDtpZigod3wwKT09KGNbdj4+Ml18MCkpe3c9b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7dz1jW3c+PjJdfDB9eT14Y1tjWyhjW3M+PjJdfDApKzI4Pj4yXSY2M10ocyx3KXwwO2lmKCh5fDApPT0oeGNbY1soY1tzPj4yXXwwKSsyOD4+Ml0mNjNdKHMsY1tqPj4yXXwwKXwwKSl7bD02MzticmVha31jW2c+PjJdPTQ7dT00fWM6ZG97aWYoKGx8MCk9PTI3KXtsPTA7dT1qKzR8MDtpZigodXwwKT09KGt8MCkpe2w9Mjg7YnJlYWsgYn10PWhjW2NbKGNbcz4+Ml18MCkrNTI+PjJdJjYzXShzLGNbdT4+Ml18MCwwKXwwO2lmKHQ8PDI0Pj4yND09NDh8dDw8MjQ+PjI0PT02OSl7dT1qKzh8MDtpZigodXwwKT09KGt8MCkpe2w9MzE7YnJlYWsgYn1qPXU7dT1oY1tjWyhjW3M+PjJdfDApKzUyPj4yXSY2M10ocyxjW3U+PjJdfDAsMCl8MH1lbHNle2o9dTt1PXQ7dD0wfXk9Y1soY1tiPj4yXXwwKSszNj4+Ml18MDtjW3I+PjJdPWQ7Y1txPj4yXT1lO2NbcCswPj4yXT1jW3IrMD4+Ml07Y1tvKzA+PjJdPWNbcSswPj4yXTtuY1t5JjMxXShuLGIscCxvLGYsZyxoLHUsdCk7aj1qKzR8MDtkPWNbbj4+Ml18MH1lbHNlIGlmKChsfDApPT0zNyl7d2hpbGUoMSl7bD0wO2o9ais0fDA7aWYoKGp8MCk9PShrfDApKXtqPWs7YnJlYWt9aWYoaGNbY1soY1tzPj4yXXwwKSsxMj4+Ml0mNjNdKHMsODE5MixjW2o+PjJdfDApfDApe2w9Mzd9ZWxzZXticmVha319dT1lO3c9ZTt3aGlsZSgxKXtpZigoZHwwKT09MCl7dj0xO2Q9MH1lbHNle3Y9Y1tkKzEyPj4yXXwwO2lmKCh2fDApPT0oY1tkKzE2Pj4yXXwwKSl7dj1vY1tjWyhjW2Q+PjJdfDApKzM2Pj4yXSYxMjddKGQpfDB9ZWxzZXt2PWNbdj4+Ml18MH15PSh2fDApPT0tMTt2PXk/MTowO2Q9eT8wOmQ7dD15PzA6dH1pZigod3wwKSE9MCl7eD1jW3crMTI+PjJdfDA7aWYoKHh8MCk9PShjW3crMTY+PjJdfDApKXt3PW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle3c9Y1t4Pj4yXXwwfWlmKCEoKHd8MCk9PS0xKSl7aWYodl4odXwwKT09MCl7dj11O3c9dX1lbHNle2Q9dDticmVhayBjfX1lbHNle3U9MDtlPTA7bD01MH19ZWxzZXtsPTUwfWlmKChsfDApPT01MCl7bD0wO2lmKHYpe2Q9dDticmVhayBjfWVsc2V7dj11O3c9MH19eD1kKzEyfDA7eT1jW3g+PjJdfDA7dT1kKzE2fDA7aWYoKHl8MCk9PShjW3U+PjJdfDApKXt5PW9jW2NbKGNbZD4+Ml18MCkrMzY+PjJdJjEyN10oZCl8MH1lbHNle3k9Y1t5Pj4yXXwwfWlmKCEoaGNbY1soY1tzPj4yXXwwKSsxMj4+Ml0mNjNdKHMsODE5Mix5KXwwKSl7ZD10O2JyZWFrIGN9eT1jW3g+PjJdfDA7aWYoKHl8MCk9PShjW3U+PjJdfDApKXtvY1tjWyhjW2Q+PjJdfDApKzQwPj4yXSYxMjddKGQpfDA7dT12O2NvbnRpbnVlfWVsc2V7Y1t4Pj4yXT15KzQ7dT12O2NvbnRpbnVlfX19ZWxzZSBpZigobHwwKT09NjMpe2w9MDt3PWNbdT4+Ml18MDtpZigod3wwKT09KGNbdj4+Ml18MCkpe29jW2NbKGNbZD4+Ml18MCkrNDA+PjJdJjEyN10oZCl8MH1lbHNle2NbdT4+Ml09dys0fWo9ais0fDA7ZD10fX13aGlsZSgwKTtpZigoanwwKT09KGt8MCkpe2JyZWFrIGF9dD1jW2c+PjJdfDB9aWYoKGx8MCk9PTI1KXtjW2c+PjJdPTQ7YnJlYWt9ZWxzZSBpZigobHwwKT09Mjgpe2NbZz4+Ml09NDticmVha31lbHNlIGlmKChsfDApPT0zMSl7Y1tnPj4yXT00O2JyZWFrfX19d2hpbGUoMCk7aWYoKGR8MCk9PTApe249MDtvPTF9ZWxzZXtuPWNbZCsxMj4+Ml18MDtpZigobnwwKT09KGNbZCsxNj4+Ml18MCkpe249b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7bj1jW24+PjJdfDB9bz0obnwwKT09LTE7bj1vPzA6ZDtvPW8/MTowfWlmKChlfDApIT0wKXtwPWNbZSsxMj4+Ml18MDtpZigocHwwKT09KGNbZSsxNj4+Ml18MCkpe3A9b2NbY1soY1tlPj4yXXwwKSszNj4+Ml0mMTI3XShlKXwwfWVsc2V7cD1jW3A+PjJdfDB9aWYoISgocHwwKT09LTEpKXtpZihvKXtjW2E+PjJdPW47aT1tO3JldHVybn19ZWxzZXtsPTc4fX1lbHNle2w9Nzh9aWYoKGx8MCk9PTc4PyFvOjApe2NbYT4+Ml09bjtpPW07cmV0dXJufWNbZz4+Ml09Y1tnPj4yXXwyO2NbYT4+Ml09bjtpPW07cmV0dXJufXk9WGEoNCl8MDtjW3k+PjJdPTIxMzA0O3diKHl8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIGRqKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIGVqKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBmaihhKXthPWF8MDtyZXR1cm4gMn1mdW5jdGlvbiBnaihhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wO2o9aTtjaihhLGIsY1tkPj4yXXwwLGNbZT4+Ml18MCxmLGcsaCwxMjUyOCwxMjU2MHwwKTtpPWo7cmV0dXJufWZ1bmN0aW9uIGhqKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTA7az1pO209ZCs4fDA7bT1vY1tjWyhjW20+PjJdfDApKzIwPj4yXSYxMjddKG0pfDA7bj1hW20+PjBdfDA7aWYoKG4mMSk9PTApe2w9bSs0fDA7bT0obiYyNTUpPj4+MX1lbHNle2w9Y1ttKzg+PjJdfDA7bT1jW20rND4+Ml18MH1jaihiLGQsY1tlPj4yXXwwLGNbZj4+Ml18MCxnLGgsaixsLGwrKG08PDIpfDApO2k9aztyZXR1cm59ZnVuY3Rpb24gaWooYSxiLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MDtqPWk7aT1pKzE2fDA7bD1qO2Y9Y1tmKzI4Pj4yXXwwO209Zis0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKSsxO2lmKCEoKGNbMzM2Ml18MCk9PS0xKSl7Y1tsPj4yXT0xMzQ0ODtjW2wrND4+Ml09MjA4O2NbbCs4Pj4yXT0wO2NnKDEzNDQ4LGwpfWw9KGNbMTM0NTI+PjJdfDApKyAtMXwwO209Y1tmKzg+PjJdfDA7aWYoKGNbZisxMj4+Ml18MCktbT4+Mj4+PjA+bD4+PjA/KGs9Y1ttKyhsPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7bD1mKzR8MDttPWNbbD4+Ml18MDtjW2w+PjJdPW0rIC0xO2lmKChtfDApPT0wKXtsY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZil9bT1jW2U+PjJdfDA7Yj1iKzh8MDtiPW9jW2NbY1tiPj4yXT4+Ml0mMTI3XShiKXwwO2I9KGFpKGQsbSxiLGIrMTY4fDAsayxnLDApfDApLWJ8MDtpZigoYnwwKT49MTY4KXttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1jW2grMjQ+PjJdPSgoYnwwKS8xMnwwfDApJTd8MDttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBqaihhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wO2o9aTtpPWkrMTZ8MDtsPWo7Zj1jW2YrMjg+PjJdfDA7bT1mKzR8MDtjW20+PjJdPShjW20+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW2w+PjJdPTEzNDQ4O2NbbCs0Pj4yXT0yMDg7Y1tsKzg+PjJdPTA7Y2coMTM0NDgsbCl9bD0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7bT1jW2YrOD4+Ml18MDtpZigoY1tmKzEyPj4yXXwwKS1tPj4yPj4+MD5sPj4+MD8oaz1jW20rKGw8PDIpPj4yXXwwLChrfDApIT0wKTowKXtsPWYrNHwwO209Y1tsPj4yXXwwO2NbbD4+Ml09bSsgLTE7aWYoKG18MCk9PTApe2xjW2NbKGNbZj4+Ml18MCkrOD4+Ml0mMjU1XShmKX1tPWNbZT4+Ml18MDtiPWIrOHwwO2I9b2NbY1soY1tiPj4yXXwwKSs0Pj4yXSYxMjddKGIpfDA7Yj0oYWkoZCxtLGIsYisyODh8MCxrLGcsMCl8MCktYnwwO2lmKChifDApPj0yODgpe209Y1tkPj4yXXwwO2NbYT4+Ml09bTtpPWo7cmV0dXJufWNbaCsxNj4+Ml09KChifDApLzEyfDB8MCklMTJ8MDttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBraihhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTA7Yj1pO2k9aSsxNnwwO2s9YjtmPWNbZisyOD4+Ml18MDtsPWYrNHwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ0OCxrKX1rPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtsPWNbZis4Pj4yXXwwO2lmKChjW2YrMTI+PjJdfDApLWw+PjI+Pj4wPms+Pj4wPyhqPWNbbCsoazw8Mik+PjJdfDAsKGp8MCkhPTApOjApe2s9Zis0fDA7bD1jW2s+PjJdfDA7Y1trPj4yXT1sKyAtMTtpZigobHwwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfWU9bWooZCxjW2U+PjJdfDAsZyxqLDQpfDA7aWYoKGNbZz4+Ml0mNHwwKSE9MCl7bD1jW2Q+PjJdfDA7Y1thPj4yXT1sO2k9YjtyZXR1cm59aWYoKGV8MCk8Njkpe2c9ZSsyZTN8MH1lbHNle2c9KGUrIC02OXwwKT4+PjA8MzE/ZSsxOTAwfDA6ZX1jW2grMjA+PjJdPWcrIC0xOTAwO2w9Y1tkPj4yXXwwO2NbYT4+Ml09bDtpPWI7cmV0dXJufWw9WGEoNCl8MDtjW2w+PjJdPTIxMzA0O3diKGx8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIGxqKGIsZCxlLGYsZyxoLGosayxsKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MDtsPWk7aT1pKzY0fDA7eT1sO3g9bCsxNnwwO3A9bCsyOHwwO3Y9bCsyNHwwO3c9bCszMnwwO0M9bCsxMnwwO3I9bCsyMHwwO3M9bCszNnwwO3Q9bCs0MHwwO3o9bCs0NHwwO3E9bCs0OHwwO2NbaD4+Ml09MDt1PWNbZysyOD4+Ml18MDtCPXUrNHwwO2NbQj4+Ml09KGNbQj4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbeT4+Ml09MTM0NDg7Y1t5KzQ+PjJdPTIwODtjW3krOD4+Ml09MDtjZygxMzQ0OCx5KX1BPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtCPWNbdSs4Pj4yXXwwO2lmKChjW3UrMTI+PjJdfDApLUI+PjI+Pj4wPkE+Pj4wPyhuPWNbQisoQTw8Mik+PjJdfDAsKG58MCkhPTApOjApe0E9dSs0fDA7Qj1jW0E+PjJdfDA7Y1tBPj4yXT1CKyAtMTtpZigoQnwwKT09MCl7bGNbY1soY1t1Pj4yXXwwKSs4Pj4yXSYyNTVdKHUpfWE6ZG97c3dpdGNoKGs8PDI0Pj4yNHwwKXtjYXNlIDgzOntuPW1qKGUsY1tmPj4yXXwwLGgsbiwyKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8NjEpe2Nbaj4+Ml09bjticmVhayBhfWVsc2V7Y1toPj4yXT1tfDQ7YnJlYWsgYX19O2Nhc2UgODQ6e2NqKHMsZCxjW2U+PjJdfDAsY1tmPj4yXXwwLGcsaCxqLDEyNjk2LDEyNzI4fDApO2NbZT4+Ml09Y1tzPj4yXTticmVha307Y2FzZSA4Mjp7Y2oocixkLGNbZT4+Ml18MCxjW2Y+PjJdfDAsZyxoLGosMTI2NzIsMTI2OTJ8MCk7Y1tlPj4yXT1jW3I+PjJdO2JyZWFrfTtjYXNlIDExMjp7bT1qKzh8MDtqPWNbZj4+Ml18MDtmPWQrOHwwO2Y9b2NbY1soY1tmPj4yXXwwKSs4Pj4yXSYxMjddKGYpfDA7ZD1hW2Y+PjBdfDA7aWYoKGQmMSk9PTApe2Q9KGQmMjU1KT4+PjF9ZWxzZXtkPWNbZis0Pj4yXXwwfWc9YVtmKzEyPj4wXXwwO2lmKChnJjEpPT0wKXtnPShnJjI1NSk+Pj4xfWVsc2V7Zz1jW2YrMTY+PjJdfDB9aWYoKGR8MCk9PSgwLWd8MCkpe2NbaD4+Ml09Y1toPj4yXXw0O2JyZWFrIGF9Qz1haShlLGosZixmKzI0fDAsbixoLDApfDA7aD1DLWZ8MDtpZigoQ3wwKT09KGZ8MCk/KGNbbT4+Ml18MCk9PTEyOjApe2NbbT4+Ml09MDticmVhayBhfWlmKChofDApPT0xMj8obz1jW20+PjJdfDAsKG98MCk8MTIpOjApe2NbbT4+Ml09bysxMn1icmVha307Y2FzZSAxMTQ6e2NqKEMsZCxjW2U+PjJdfDAsY1tmPj4yXXwwLGcsaCxqLDEyNjI0LDEyNjY4fDApO2NbZT4+Ml09Y1tDPj4yXTticmVha307Y2FzZSAxMjA6e0M9Y1soY1tkPj4yXXwwKSsyMD4+Ml18MDtjW3Q+PjJdPWNbZT4+Ml07Y1t6Pj4yXT1jW2Y+PjJdO2NbeCswPj4yXT1jW3QrMD4+Ml07Y1t5KzA+PjJdPWNbeiswPj4yXTtpY1tDJjYzXShiLGQseCx5LGcsaCxqKTtpPWw7cmV0dXJufTtjYXNlIDg4OntvPWQrOHwwO289b2NbY1soY1tvPj4yXXwwKSsyND4+Ml0mMTI3XShvKXwwO249YVtvPj4wXXwwO2lmKChuJjEpPT0wKXttPW8rNHwwO249KG4mMjU1KT4+PjF9ZWxzZXttPWNbbys4Pj4yXXwwO249Y1tvKzQ+PjJdfDB9Y2oocSxkLGNbZT4+Ml18MCxjW2Y+PjJdfDAsZyxoLGosbSxtKyhuPDwyKXwwKTtjW2U+PjJdPWNbcT4+Ml07YnJlYWt9O2Nhc2UgMTE5OntuPW1qKGUsY1tmPj4yXXwwLGgsbiwxKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8Nyl7Y1tqKzI0Pj4yXT1uO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSAxMjE6e209aisyMHwwO249bWooZSxjW2Y+PjJdfDAsaCxuLDQpfDA7aWYoKGNbaD4+Ml0mNHwwKT09MCl7aWYoKG58MCk8Njkpe2g9bisyZTN8MH1lbHNle2g9KG4rIC02OXwwKT4+PjA8MzE/bisxOTAwfDA6bn1jW20+PjJdPWgrIC0xOTAwfWJyZWFrfTtjYXNlIDg5OnttPW1qKGUsY1tmPj4yXXwwLGgsbiw0KXwwO2lmKChjW2g+PjJdJjR8MCk9PTApe2NbaisyMD4+Ml09bSsgLTE5MDB9YnJlYWt9O2Nhc2UgMzc6e2o9Y1tmPj4yXXwwO2Y9Y1tlPj4yXXwwO2Rve2lmKChmfDApIT0wKXtkPWNbZisxMj4+Ml18MDtpZigoZHwwKT09KGNbZisxNj4+Ml18MCkpe2Y9b2NbY1soY1tmPj4yXXwwKSszNj4+Ml0mMTI3XShmKXwwfWVsc2V7Zj1jW2Q+PjJdfDB9aWYoKGZ8MCk9PS0xKXtjW2U+PjJdPTA7Zj0xO2JyZWFrfWVsc2V7Zj0oY1tlPj4yXXwwKT09MDticmVha319ZWxzZXtmPTF9fXdoaWxlKDApO2lmKChqfDApIT0wKXtkPWNbaisxMj4+Ml18MDtpZigoZHwwKT09KGNbaisxNj4+Ml18MCkpe2Q9b2NbY1soY1tqPj4yXXwwKSszNj4+Ml0mMTI3XShqKXwwfWVsc2V7ZD1jW2Q+PjJdfDB9aWYoISgoZHwwKT09LTEpKXtpZighZil7bT0xMjZ9fWVsc2V7bT0xMjR9fWVsc2V7bT0xMjR9aWYoKG18MCk9PTEyNCl7aWYoZil7bT0xMjZ9ZWxzZXtqPTB9fWlmKChtfDApPT0xMjYpe2NbaD4+Ml09Y1toPj4yXXw2O2JyZWFrIGF9ZD1jW2U+PjJdfDA7Zj1jW2QrMTI+PjJdfDA7aWYoKGZ8MCk9PShjW2QrMTY+PjJdfDApKXtmPW9jW2NbKGNbZD4+Ml18MCkrMzY+PjJdJjEyN10oZCl8MH1lbHNle2Y9Y1tmPj4yXXwwfWlmKCEoKGhjW2NbKGNbbj4+Ml18MCkrNTI+PjJdJjYzXShuLGYsMCl8MCk8PDI0Pj4yND09MzcpKXtjW2g+PjJdPWNbaD4+Ml18NDticmVhayBhfWQ9Y1tlPj4yXXwwO2Y9ZCsxMnwwO249Y1tmPj4yXXwwO2lmKChufDApPT0oY1tkKzE2Pj4yXXwwKSl7b2NbY1soY1tkPj4yXXwwKSs0MD4+Ml0mMTI3XShkKXwwfWVsc2V7Y1tmPj4yXT1uKzR9bj1jW2U+PjJdfDA7ZG97aWYoKG58MCkhPTApe2Y9Y1tuKzEyPj4yXXwwO2lmKChmfDApPT0oY1tuKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDB9ZWxzZXtuPWNbZj4+Ml18MH1pZigobnwwKT09LTEpe2NbZT4+Ml09MDtuPTE7YnJlYWt9ZWxzZXtuPShjW2U+PjJdfDApPT0wO2JyZWFrfX1lbHNle249MX19d2hpbGUoMCk7aWYoKGp8MCkhPTApe2Y9Y1tqKzEyPj4yXXwwO2lmKChmfDApPT0oY1tqKzE2Pj4yXXwwKSl7aj1vY1tjWyhjW2o+PjJdfDApKzM2Pj4yXSYxMjddKGopfDB9ZWxzZXtqPWNbZj4+Ml18MH1pZighKChqfDApPT0tMSkpe2lmKG4pe2JyZWFrIGF9fWVsc2V7bT0xNDd9fWVsc2V7bT0xNDd9aWYoKG18MCk9PTE0Nz8hbjowKXticmVhayBhfWNbaD4+Ml09Y1toPj4yXXwyO2JyZWFrfTtjYXNlIDEwOTp7bj1taihlLGNbZj4+Ml18MCxoLG4sMil8MDttPWNbaD4+Ml18MDtpZigobSY0fDApPT0wJihufDApPDEzKXtjW2orMTY+PjJdPW4rIC0xO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSA3MDp7Y2oodyxkLGNbZT4+Ml18MCxjW2Y+PjJdfDAsZyxoLGosMTI1OTIsMTI2MjR8MCk7Y1tlPj4yXT1jW3c+PjJdO2JyZWFrfTtjYXNlIDY4Ontjaih2LGQsY1tlPj4yXXwwLGNbZj4+Ml18MCxnLGgsaiwxMjU2MCwxMjU5MnwwKTtjW2U+PjJdPWNbdj4+Ml07YnJlYWt9O2Nhc2UgMTA0OmNhc2UgNjY6Y2FzZSA5ODp7Qj1jW2Y+PjJdfDA7Qz1kKzh8MDtDPW9jW2NbKGNbQz4+Ml18MCkrND4+Ml0mMTI3XShDKXwwO2g9KGFpKGUsQixDLEMrMjg4fDAsbixoLDApfDApLUN8MDtpZigoaHwwKTwyODgpe2NbaisxNj4+Ml09KChofDApLzEyfDB8MCklMTJ8MH1icmVha307Y2FzZSAxMTY6Y2FzZSAxMTA6e2o9Y1tmPj4yXXwwO3doaWxlKDEpe2Q9Y1tlPj4yXXwwO2Rve2lmKChkfDApIT0wKXtmPWNbZCsxMj4+Ml18MDtpZigoZnwwKT09KGNbZCsxNj4+Ml18MCkpe2Y9b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7Zj1jW2Y+PjJdfDB9aWYoKGZ8MCk9PS0xKXtjW2U+PjJdPTA7Zj0xO2JyZWFrfWVsc2V7Zj0oY1tlPj4yXXwwKT09MDticmVha319ZWxzZXtmPTF9fXdoaWxlKDApO2lmKChqfDApIT0wKXtkPWNbaisxMj4+Ml18MDtpZigoZHwwKT09KGNbaisxNj4+Ml18MCkpe2Q9b2NbY1soY1tqPj4yXXwwKSszNj4+Ml0mMTI3XShqKXwwfWVsc2V7ZD1jW2Q+PjJdfDB9aWYoISgoZHwwKT09LTEpKXtpZighZil7YnJlYWt9fWVsc2V7bT01M319ZWxzZXttPTUzfWlmKChtfDApPT01Myl7bT0wO2lmKGYpe2o9MDticmVha31lbHNle2o9MH19ZD1jW2U+PjJdfDA7Zj1jW2QrMTI+PjJdfDA7aWYoKGZ8MCk9PShjW2QrMTY+PjJdfDApKXtmPW9jW2NbKGNbZD4+Ml18MCkrMzY+PjJdJjEyN10oZCl8MH1lbHNle2Y9Y1tmPj4yXXwwfWlmKCEoaGNbY1soY1tuPj4yXXwwKSsxMj4+Ml0mNjNdKG4sODE5MixmKXwwKSl7YnJlYWt9bz1jW2U+PjJdfDA7ZD1vKzEyfDA7Zj1jW2Q+PjJdfDA7aWYoKGZ8MCk9PShjW28rMTY+PjJdfDApKXtvY1tjWyhjW28+PjJdfDApKzQwPj4yXSYxMjddKG8pfDA7Y29udGludWV9ZWxzZXtjW2Q+PjJdPWYrNDtjb250aW51ZX19Zj1jW2U+PjJdfDA7ZG97aWYoKGZ8MCkhPTApe249Y1tmKzEyPj4yXXwwO2lmKChufDApPT0oY1tmKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW2Y+PjJdfDApKzM2Pj4yXSYxMjddKGYpfDB9ZWxzZXtuPWNbbj4+Ml18MH1pZigobnwwKT09LTEpe2NbZT4+Ml09MDtuPTE7YnJlYWt9ZWxzZXtuPShjW2U+PjJdfDApPT0wO2JyZWFrfX1lbHNle249MX19d2hpbGUoMCk7aWYoKGp8MCkhPTApe2Y9Y1tqKzEyPj4yXXwwO2lmKChmfDApPT0oY1tqKzE2Pj4yXXwwKSl7aj1vY1tjWyhjW2o+PjJdfDApKzM2Pj4yXSYxMjddKGopfDB9ZWxzZXtqPWNbZj4+Ml18MH1pZighKChqfDApPT0tMSkpe2lmKG4pe2JyZWFrIGF9fWVsc2V7bT03NH19ZWxzZXttPTc0fWlmKChtfDApPT03ND8hbjowKXticmVhayBhfWNbaD4+Ml09Y1toPj4yXXwyO2JyZWFrfTtjYXNlIDY1OmNhc2UgOTc6e0I9Y1tmPj4yXXwwO0M9ZCs4fDA7Qz1vY1tjW2NbQz4+Ml0+PjJdJjEyN10oQyl8MDtoPShhaShlLEIsQyxDKzE2OHwwLG4saCwwKXwwKS1DfDA7aWYoKGh8MCk8MTY4KXtjW2orMjQ+PjJdPSgoaHwwKS8xMnwwfDApJTd8MH1icmVha307Y2FzZSA5OTp7bz1kKzh8MDtvPW9jW2NbKGNbbz4+Ml18MCkrMTI+PjJdJjEyN10obyl8MDtuPWFbbz4+MF18MDtpZigobiYxKT09MCl7bT1vKzR8MDtuPShuJjI1NSk+Pj4xfWVsc2V7bT1jW28rOD4+Ml18MDtuPWNbbys0Pj4yXXwwfWNqKHAsZCxjW2U+PjJdfDAsY1tmPj4yXXwwLGcsaCxqLG0sbSsobjw8Mil8MCk7Y1tlPj4yXT1jW3A+PjJdO2JyZWFrfTtjYXNlIDcyOntuPW1qKGUsY1tmPj4yXXwwLGgsbiwyKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8MjQpe2Nbais4Pj4yXT1uO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSAxMDE6Y2FzZSAxMDA6e209aisxMnwwO2o9bWooZSxjW2Y+PjJdfDAsaCxuLDIpfDA7bj1jW2g+PjJdfDA7aWYoKG4mNHwwKT09MD8oaisgLTF8MCk+Pj4wPDMxOjApe2NbbT4+Ml09ajticmVhayBhfWNbaD4+Ml09bnw0O2JyZWFrfTtjYXNlIDczOnttPWorOHwwO249bWooZSxjW2Y+PjJdfDAsaCxuLDIpfDA7aj1jW2g+PjJdfDA7aWYoKGomNHwwKT09MD8obisgLTF8MCk+Pj4wPDEyOjApe2NbbT4+Ml09bjticmVhayBhfWNbaD4+Ml09anw0O2JyZWFrfTtjYXNlIDc3OntuPW1qKGUsY1tmPj4yXXwwLGgsbiwyKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8NjApe2Nbais0Pj4yXT1uO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSAxMDY6e249bWooZSxjW2Y+PjJdfDAsaCxuLDMpfDA7bT1jW2g+PjJdfDA7aWYoKG0mNHwwKT09MCYobnwwKTwzNjYpe2NbaisyOD4+Ml09bjticmVhayBhfWVsc2V7Y1toPj4yXT1tfDQ7YnJlYWsgYX19O2RlZmF1bHQ6e2NbaD4+Ml09Y1toPj4yXXw0fX19d2hpbGUoMCk7Y1tiPj4yXT1jW2U+PjJdO2k9bDtyZXR1cm59Qz1YYSg0KXwwO2NbQz4+Ml09MjEzMDQ7d2IoQ3wwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gbWooYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2g9aTtrPWNbYT4+Ml18MDtkb3tpZigoa3wwKSE9MCl7aj1jW2srMTI+PjJdfDA7aWYoKGp8MCk9PShjW2srMTY+PjJdfDApKXtqPW9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MH1lbHNle2o9Y1tqPj4yXXwwfWlmKChqfDApPT0tMSl7Y1thPj4yXT0wO2o9MTticmVha31lbHNle2o9KGNbYT4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7aj0xfX13aGlsZSgwKTtpZigoYnwwKSE9MCl7az1jW2IrMTI+PjJdfDA7aWYoKGt8MCk9PShjW2IrMTY+PjJdfDApKXtrPW9jW2NbKGNbYj4+Ml18MCkrMzY+PjJdJjEyN10oYil8MH1lbHNle2s9Y1trPj4yXXwwfWlmKCEoKGt8MCk9PS0xKSl7aWYoIWope2c9MTV9fWVsc2V7Zz0xM319ZWxzZXtnPTEzfWlmKChnfDApPT0xMyl7aWYoail7Zz0xNX1lbHNle2I9MH19aWYoKGd8MCk9PTE1KXtjW2Q+PjJdPWNbZD4+Ml18NjtuPTA7aT1oO3JldHVybiBufDB9aj1jW2E+PjJdfDA7az1jW2orMTI+PjJdfDA7aWYoKGt8MCk9PShjW2orMTY+PjJdfDApKXtqPW9jW2NbKGNbaj4+Ml18MCkrMzY+PjJdJjEyN10oail8MH1lbHNle2o9Y1trPj4yXXwwfWlmKCEoaGNbY1soY1tlPj4yXXwwKSsxMj4+Ml0mNjNdKGUsMjA0OCxqKXwwKSl7Y1tkPj4yXT1jW2Q+PjJdfDQ7bj0wO2k9aDtyZXR1cm4gbnwwfWo9KGhjW2NbKGNbZT4+Ml18MCkrNTI+PjJdJjYzXShlLGosMCl8MCk8PDI0Pj4yNDtsPWNbYT4+Ml18MDtrPWwrMTJ8MDttPWNbaz4+Ml18MDtpZigobXwwKT09KGNbbCsxNj4+Ml18MCkpe29jW2NbKGNbbD4+Ml18MCkrNDA+PjJdJjEyN10obCl8MDtrPWI7bD1iO2I9an1lbHNle2Nbaz4+Ml09bSs0O2s9YjtsPWI7Yj1qfXdoaWxlKDEpe2I9YisgLTQ4fDA7Zj1mKyAtMXwwO2o9Y1thPj4yXXwwO2Rve2lmKChqfDApIT0wKXttPWNbaisxMj4+Ml18MDtpZigobXwwKT09KGNbaisxNj4+Ml18MCkpe2o9b2NbY1soY1tqPj4yXXwwKSszNj4+Ml0mMTI3XShqKXwwfWVsc2V7aj1jW20+PjJdfDB9aWYoKGp8MCk9PS0xKXtjW2E+PjJdPTA7bT0xO2JyZWFrfWVsc2V7bT0oY1thPj4yXXwwKT09MDticmVha319ZWxzZXttPTF9fXdoaWxlKDApO2lmKChsfDApPT0wKXtqPWs7bD0wO249MX1lbHNle2o9Y1tsKzEyPj4yXXwwO2lmKChqfDApPT0oY1tsKzE2Pj4yXXwwKSl7aj1vY1tjWyhjW2w+PjJdfDApKzM2Pj4yXSYxMjddKGwpfDB9ZWxzZXtqPWNbaj4+Ml18MH1uPShqfDApPT0tMTtqPW4/MDprO2w9bj8wOms7bj1uPzE6KGt8MCk9PTB9az1jW2E+PjJdfDA7aWYoISgobV5uKSYoZnwwKT4wKSl7YnJlYWt9bT1jW2srMTI+PjJdfDA7aWYoKG18MCk9PShjW2srMTY+PjJdfDApKXtrPW9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MH1lbHNle2s9Y1ttPj4yXXwwfWlmKCEoaGNbY1soY1tlPj4yXXwwKSsxMj4+Ml0mNjNdKGUsMjA0OCxrKXwwKSl7Zz01OTticmVha31iPSgoaGNbY1soY1tlPj4yXXwwKSs1Mj4+Ml0mNjNdKGUsaywwKXwwKTw8MjQ+PjI0KSsoYioxMHwwKXwwO209Y1thPj4yXXwwO249bSsxMnwwO2s9Y1tuPj4yXXwwO2lmKChrfDApPT0oY1ttKzE2Pj4yXXwwKSl7b2NbY1soY1ttPj4yXXwwKSs0MD4+Ml0mMTI3XShtKXwwO2s9ajtjb250aW51ZX1lbHNle2Nbbj4+Ml09ays0O2s9ajtjb250aW51ZX19aWYoKGd8MCk9PTU5KXtpPWg7cmV0dXJuIGJ8MH1kb3tpZigoa3wwKSE9MCl7ZT1jW2srMTI+PjJdfDA7aWYoKGV8MCk9PShjW2srMTY+PjJdfDApKXtlPW9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MH1lbHNle2U9Y1tlPj4yXXwwfWlmKChlfDApPT0tMSl7Y1thPj4yXT0wO2E9MTticmVha31lbHNle2E9KGNbYT4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7YT0xfX13aGlsZSgwKTtpZigoanwwKSE9MCl7ZT1jW2orMTI+PjJdfDA7aWYoKGV8MCk9PShjW2orMTY+PjJdfDApKXtlPW9jW2NbKGNbaj4+Ml18MCkrMzY+PjJdJjEyN10oail8MH1lbHNle2U9Y1tlPj4yXXwwfWlmKCEoKGV8MCk9PS0xKSl7aWYoYSl7bj1iO2k9aDtyZXR1cm4gbnwwfX1lbHNle2c9NTZ9fWVsc2V7Zz01Nn1pZigoZ3wwKT09NTY/IWE6MCl7bj1iO2k9aDtyZXR1cm4gbnwwfWNbZD4+Ml09Y1tkPj4yXXwyO249YjtpPWg7cmV0dXJuIG58MH1mdW5jdGlvbiBuaihiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTA7ZD1pO2U9Yis4fDA7Zj1jW2U+PjJdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWlmKChmfDApIT0oY1szMzQwXXwwKSl7VmIoY1tlPj4yXXwwKX1pZigoYnwwKT09MCl7aT1kO3JldHVybn12bihiKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIG9qKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtiPWIrOHwwO2U9Y1tiPj4yXXwwO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1pZigoZXwwKT09KGNbMzM0MF18MCkpe2k9ZDtyZXR1cm59VmIoY1tiPj4yXXwwKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIHBqKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wO2Y9aTtpPWkrMTEyfDA7bj1mKzEwMHwwO2c9ZjthW24+PjBdPTM3O2w9bisxfDA7YVtsPj4wXT1qO209bisyfDA7YVttPj4wXT1rO2FbbiszPj4wXT0wO2lmKCEoazw8MjQ+PjI0PT0wKSl7YVtsPj4wXT1rO2FbbT4+MF09an1uPWViKGd8MCwxMDAsbnwwLGh8MCxjW2QrOD4+Ml18MCl8MDtoPWcrbnwwO2Q9Y1tlPj4yXXwwO2lmKChufDApPT0wKXtuPWQ7Y1tiPj4yXT1uO2k9ZjtyZXR1cm59ZWxzZXtlPWQ7bD1kfWRve2o9YVtnPj4wXXwwO2Rve2lmKChlfDApIT0wKXtrPWUrMjR8MDtkPWNbaz4+Ml18MDtpZigoZHwwKT09KGNbZSsyOD4+Ml18MCkpe249KHhjW2NbKGNbZT4+Ml18MCkrNTI+PjJdJjYzXShlLGomMjU1KXwwKT09LTE7bD1uPzA6bDtlPW4/MDplO2JyZWFrfWVsc2V7Y1trPj4yXT1kKzE7YVtkPj4wXT1qO2JyZWFrfX1lbHNle2U9MH19d2hpbGUoMCk7Zz1nKzF8MH13aGlsZSgoZ3wwKSE9KGh8MCkpO2NbYj4+Ml09bDtpPWY7cmV0dXJufWZ1bmN0aW9uIHFqKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MDtkPWk7ZT1iKzh8MDtmPWNbZT4+Ml18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9aWYoKGZ8MCkhPShjWzMzNDBdfDApKXtWYihjW2U+PjJdfDApfWlmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gcmooYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2I9Yis4fDA7ZT1jW2I+PjJdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWlmKChlfDApPT0oY1szMzQwXXwwKSl7aT1kO3JldHVybn1WYihjW2I+PjJdfDApO2k9ZDtyZXR1cm59ZnVuY3Rpb24gc2ooYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7Zj1pO2k9aSs1Mjh8MDtvPWYrNTEyfDA7cD1mKzQxMnwwO209ZjtsPWYrNDA4fDA7Zz1mKzh8MDthW28+PjBdPTM3O249bysxfDA7YVtuPj4wXT1qO3E9bysyfDA7YVtxPj4wXT1rO2FbbyszPj4wXT0wO2lmKCEoazw8MjQ+PjI0PT0wKSl7YVtuPj4wXT1rO2FbcT4+MF09an1qPWQrOHwwO2ViKHB8MCwxMDAsb3wwLGh8MCxjW2o+PjJdfDApfDA7az1tO2Nbaz4+Ml09MDtjW2srND4+Ml09MDtjW2w+PjJdPXA7aj1pYihjW2o+PjJdfDApfDA7az1WbShnLGwsMTAwLG0pfDA7aWYoKGp8MCkhPTApe2liKGp8MCl8MH1pZigoa3wwKT09LTEpe29rKDE0Mjk2KX1qPWcrKGs8PDIpfDA7ZD1jW2U+PjJdfDA7aWYoKGt8MCk9PTApe3E9ZDtjW2I+PjJdPXE7aT1mO3JldHVybn1lbHNle2U9ZDtrPWR9ZG97ZD1jW2c+PjJdfDA7aWYoKGV8MCk9PTApe2U9MH1lbHNle2g9ZSsyNHwwO2w9Y1toPj4yXXwwO2lmKChsfDApPT0oY1tlKzI4Pj4yXXwwKSl7ZD14Y1tjWyhjW2U+PjJdfDApKzUyPj4yXSY2M10oZSxkKXwwfWVsc2V7Y1toPj4yXT1sKzQ7Y1tsPj4yXT1kfXE9KGR8MCk9PS0xO2s9cT8wOms7ZT1xPzA6ZX1nPWcrNHwwfXdoaWxlKChnfDApIT0oanwwKSk7Y1tiPj4yXT1rO2k9ZjtyZXR1cm59ZnVuY3Rpb24gdGooYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gdWooYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIHZqKGEpe2E9YXwwO3JldHVybiAxMjd9ZnVuY3Rpb24gd2ooYSl7YT1hfDA7cmV0dXJuIDEyN31mdW5jdGlvbiB4aihhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIHlqKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gemooYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBBaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09MjthW2IrMT4+MF09NDU7YVtiKzI+PjBdPTA7cmV0dXJufWZ1bmN0aW9uIEJqKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIENqKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT02NzEwOTYzNDthW2IrMT4+MF09MjYyMTQ3O2FbYisyPj4wXT0xMDI0O2FbYiszPj4wXT00O3JldHVybn1mdW5jdGlvbiBEaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09NjcxMDk2MzQ7YVtiKzE+PjBdPTI2MjE0NzthW2IrMj4+MF09MTAyNDthW2IrMz4+MF09NDtyZXR1cm59ZnVuY3Rpb24gRWooYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gRmooYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEdqKGEpe2E9YXwwO3JldHVybiAxMjd9ZnVuY3Rpb24gSGooYSl7YT1hfDA7cmV0dXJuIDEyN31mdW5jdGlvbiBJaihhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIEpqKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gS2ooYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBMaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09MjthW2IrMT4+MF09NDU7YVtiKzI+PjBdPTA7cmV0dXJufWZ1bmN0aW9uIE1qKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIE5qKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT02NzEwOTYzNDthW2IrMT4+MF09MjYyMTQ3O2FbYisyPj4wXT0xMDI0O2FbYiszPj4wXT00O3JldHVybn1mdW5jdGlvbiBPaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09NjcxMDk2MzQ7YVtiKzE+PjBdPTI2MjE0NzthW2IrMj4+MF09MTAyNDthW2IrMz4+MF09NDtyZXR1cm59ZnVuY3Rpb24gUGooYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gUWooYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFJqKGEpe2E9YXwwO3JldHVybiAyMTQ3NDgzNjQ3fWZ1bmN0aW9uIFNqKGEpe2E9YXwwO3JldHVybiAyMTQ3NDgzNjQ3fWZ1bmN0aW9uIFRqKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gVWooYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBWaihhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIFdqKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTA7ZD1pO2FbYj4+MF09MjtiPWIrNHwwO2Y9MTtlPWI7d2hpbGUoMSl7Zj1mKyAtMXwwO2NbZT4+Ml09NDU7aWYoKGZ8MCk9PTApe2JyZWFrfWVsc2V7ZT1lKzR8MH19Y1tiKzQ+PjJdPTA7aT1kO3JldHVybn1mdW5jdGlvbiBYaihhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBZaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09NjcxMDk2MzQ7YVtiKzE+PjBdPTI2MjE0NzthW2IrMj4+MF09MTAyNDthW2IrMz4+MF09NDtyZXR1cm59ZnVuY3Rpb24gWmooYixjKXtiPWJ8MDtjPWN8MDthW2I+PjBdPTY3MTA5NjM0O2FbYisxPj4wXT0yNjIxNDc7YVtiKzI+PjBdPTEwMjQ7YVtiKzM+PjBdPTQ7cmV0dXJufWZ1bmN0aW9uIF9qKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uICRqKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBhayhhKXthPWF8MDtyZXR1cm4gMjE0NzQ4MzY0N31mdW5jdGlvbiBiayhhKXthPWF8MDtyZXR1cm4gMjE0NzQ4MzY0N31mdW5jdGlvbiBjayhhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIGRrKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gZWsoYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBmayhiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wO2Q9aTthW2I+PjBdPTI7Yj1iKzR8MDtmPTE7ZT1iO3doaWxlKDEpe2Y9ZisgLTF8MDtjW2U+PjJdPTQ1O2lmKChmfDApPT0wKXticmVha31lbHNle2U9ZSs0fDB9fWNbYis0Pj4yXT0wO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZ2soYSl7YT1hfDA7cmV0dXJuIDB9ZnVuY3Rpb24gaGsoYixjKXtiPWJ8MDtjPWN8MDthW2I+PjBdPTY3MTA5NjM0O2FbYisxPj4wXT0yNjIxNDc7YVtiKzI+PjBdPTEwMjQ7YVtiKzM+PjBdPTQ7cmV0dXJufWZ1bmN0aW9uIGlrKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT02NzEwOTYzNDthW2IrMT4+MF09MjYyMTQ3O2FbYisyPj4wXT0xMDI0O2FbYiszPj4wXT00O3JldHVybn1mdW5jdGlvbiBqayhhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBrayhhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gbGsoYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wO249aTtpPWkrMjQwfDA7cD1uO3g9bisxNDB8MDtkPW4rMTZ8MDtyPW4rMjR8MDt1PW4rMTM4fDA7cz1uKzEyOHwwO3E9bisyOHwwO2NbZD4+Ml09eDttPWQrNHwwO2NbbT4+Ml09MjEzO3g9eCsxMDB8MDtvPWNbaCsyOD4+Ml18MDt3PW8rNHwwO2Nbdz4+Ml09KGNbdz4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbcD4+Ml09MTM0NTY7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzQ1NixwKX13PShjWzEzNDYwPj4yXXwwKSsgLTF8MDt2PWNbbys4Pj4yXXwwO2lmKChjW28rMTI+PjJdfDApLXY+PjI+Pj4wPnc+Pj4wPyh0PWNbdisodzw8Mik+PjJdfDAsKHR8MCkhPTApOjApe2FbdT4+MF09MDtkb3tpZihuayhlLGNbZj4+Ml18MCxnLG8sY1toKzQ+PjJdfDAsaix1LHQsZCxyLHgpfDApe3VjW2NbKGNbdD4+Ml18MCkrMzI+PjJdJjMxXSh0LDEzMDg4LDEzMDk4fDAscyl8MDtnPWNbcj4+Ml18MDtoPWNbZD4+Ml18MDt0PWctaHwwO2lmKCh0fDApPjk4KXt2PXVuKHQrMnwwKXwwO2lmKCh2fDApPT0wKXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNle3Q9dn19ZWxzZXt0PTA7dj1xfWlmKChhW3U+PjBdfDApIT0wKXthW3Y+PjBdPTQ1O3Y9disxfDB9aWYoaD4+PjA8Zz4+PjApe3U9cysxMHwwO2c9cztkb3t3PWFbaD4+MF18MDt4PXM7d2hpbGUoMSl7aWYoKGFbeD4+MF18MCk9PXc8PDI0Pj4yNCl7YnJlYWt9eD14KzF8MDtpZigoeHwwKT09KHV8MCkpe3g9dTticmVha319YVt2Pj4wXT1hWzEzMDg4Kyh4LWcpPj4wXXwwO2g9aCsxfDA7dj12KzF8MH13aGlsZShoPj4+MDwoY1tyPj4yXXwwKT4+PjApfWFbdj4+MF09MDtjW3A+PjJdPWs7aWYoKEZhKHF8MCwxMzEwNCxwfDApfDApPT0xKXtpZigodHwwKT09MCl7YnJlYWt9dm4odCk7YnJlYWt9Zj1YYSg4KXwwO2NbZj4+Ml09OTkyODt3aGlsZSgxKXtqPXVuKDI4KXwwO2lmKChqfDApIT0wKXtsPTI5O2JyZWFrfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXtsPTI3O2JyZWFrfXNjW2wmMzFdKCl9aWYoKGx8MCk9PTI3KXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNlIGlmKChsfDApPT0yOSl7Y1tqKzQ+PjJdPTE1O2Nbaj4+Ml09MTU7bD1qKzEyfDA7Y1tmKzQ+PjJdPWw7Y1tqKzg+PjJdPTA7aj1sKzB8MDtsPTEzMTEyfDA7Yj1qKzE2fDA7ZG97YVtqPj4wXT1hW2w+PjBdfDA7aj1qKzF8MDtsPWwrMXwwfXdoaWxlKChqfDApPChifDApKTt3YihmfDAsMTAwNjQsMTA2KX19fXdoaWxlKDApO3A9Y1tlPj4yXXwwO2lmKChwfDApIT0wKXtpZigoY1twKzEyPj4yXXwwKT09KGNbcCsxNj4+Ml18MCk/KG9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MCk9PS0xOjApe2NbZT4+Ml09MDtwPTB9fWVsc2V7cD0wfWs9KHB8MCk9PTA7ZT1jW2Y+PjJdfDA7ZG97aWYoKGV8MCkhPTApe2lmKChjW2UrMTI+PjJdfDApIT0oY1tlKzE2Pj4yXXwwKSl7aWYoayl7YnJlYWt9ZWxzZXtsPTQ2O2JyZWFrfX1pZighKChvY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDApPT0tMSkpe2lmKGspe2JyZWFrfWVsc2V7bD00NjticmVha319ZWxzZXtjW2Y+PjJdPTA7bD00NDticmVha319ZWxzZXtsPTQ0fX13aGlsZSgwKTtpZigobHwwKT09NDQ/azowKXtsPTQ2fWlmKChsfDApPT00Nil7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT1wO3c9bys0fDA7eD1jW3c+PjJdfDA7Y1t3Pj4yXT14KyAtMTtpZigoeHwwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfWw9Y1tkPj4yXXwwO2NbZD4+Ml09MDtpZigobHwwKT09MCl7aT1uO3JldHVybn1sY1tjW20+PjJdJjI1NV0obCk7aT1uO3JldHVybn14PVhhKDQpfDA7Y1t4Pj4yXT0yMTMwNDt3Yih4fDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBtayhhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gbmsoZSxmLGcsaCxqLGssbCxtLG4sbyxwKXtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDtvPW98MDtwPXB8MDt2YXIgcT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MDt1PWk7aT1pKzU5MnwwO1E9dTtPPXUrMTEyfDA7Rz11KzEyfDA7TT11KzEwMHwwO0o9dSs0MHwwO0s9dSsyNHwwO0w9dSszNnwwO1A9dSs4OHwwO049dSs3NnwwO0g9dSs1MnwwO0k9dSs2NHwwO1Q9dSsxMjB8MDtGPXUrNTIwfDA7dD11KzUyNHwwO3k9dSs1MzZ8MDt4PXUrNTQ4fDA7cz11KzU2MHwwO3c9dSs1NzJ8MDtCPXUrNTg0fDA7Y1tGPj4yXT0wO2NbdCswPj4yXT0wO2NbdCs0Pj4yXT0wO2NbdCs4Pj4yXT0wO2NbeSswPj4yXT0wO2NbeSs0Pj4yXT0wO2NbeSs4Pj4yXT0wO2NbeCswPj4yXT0wO2NbeCs0Pj4yXT0wO2NbeCs4Pj4yXT0wO2NbcyswPj4yXT0wO2Nbcys0Pj4yXT0wO2Nbcys4Pj4yXT0wO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wO2Rve2lmKGcpe2lmKCEoKGNbMzIyOF18MCk9PS0xKSl7Y1tRPj4yXT0xMjkxMjtjW1ErND4+Ml09MjA4O2NbUSs4Pj4yXT0wO2NnKDEyOTEyLFEpfUg9KGNbMTI5MTY+PjJdfDApKyAtMXwwO0U9Y1toKzg+PjJdfDA7aWYoKGNbaCsxMj4+Ml18MCktRT4+Mj4+PjA+SD4+PjA/KEQ9Y1tFKyhIPDwyKT4+Ml18MCwoRHwwKSE9MCk6MCl7bWNbY1soY1tEPj4yXXwwKSs0ND4+Ml0mMTI3XShPLEQpO2NbRj4+Ml09Y1tPPj4yXTttY1tjWyhjW0Q+PjJdfDApKzMyPj4yXSYxMjddKEcsRCk7aWYoKGFbcz4+MF0mMSk9PTApe2FbcysxPj4wXT0wO2Fbcz4+MF09MH1lbHNle2FbY1tzKzg+PjJdPj4wXT0wO2Nbcys0Pj4yXT0wfWlnKHMpO2NbcyswPj4yXT1jW0crMD4+Ml07Y1tzKzQ+PjJdPWNbRys0Pj4yXTtjW3MrOD4+Ml09Y1tHKzg+PjJdO2NbRyswPj4yXT0wO2NbRys0Pj4yXT0wO2NbRys4Pj4yXT0wO21jW2NbKGNbRD4+Ml18MCkrMjg+PjJdJjEyN10oTSxEKTtpZigoYVt4Pj4wXSYxKT09MCl7YVt4KzE+PjBdPTA7YVt4Pj4wXT0wfWVsc2V7YVtjW3grOD4+Ml0+PjBdPTA7Y1t4KzQ+PjJdPTB9aWcoeCk7Y1t4KzA+PjJdPWNbTSswPj4yXTtjW3grND4+Ml09Y1tNKzQ+PjJdO2NbeCs4Pj4yXT1jW00rOD4+Ml07Y1tNKzA+PjJdPTA7Y1tNKzQ+PjJdPTA7Y1tNKzg+PjJdPTA7aD1vY1tjWyhjW0Q+PjJdfDApKzEyPj4yXSYxMjddKEQpfDA7Rz1vY1tjWyhjW0Q+PjJdfDApKzE2Pj4yXSYxMjddKEQpfDA7bWNbY1soY1tEPj4yXXwwKSsyMD4+Ml0mMTI3XShKLEQpO2lmKChhW3Q+PjBdJjEpPT0wKXthW3QrMT4+MF09MDthW3Q+PjBdPTB9ZWxzZXthW2NbdCs4Pj4yXT4+MF09MDtjW3QrND4+Ml09MH1pZyh0KTtjW3QrMD4+Ml09Y1tKKzA+PjJdO2NbdCs0Pj4yXT1jW0orND4+Ml07Y1t0Kzg+PjJdPWNbSis4Pj4yXTtjW0orMD4+Ml09MDtjW0orND4+Ml09MDtjW0orOD4+Ml09MDttY1tjWyhjW0Q+PjJdfDApKzI0Pj4yXSYxMjddKEssRCk7aWYoKGFbeT4+MF0mMSk9PTApe2FbeSsxPj4wXT0wO2FbeT4+MF09MH1lbHNle2FbY1t5Kzg+PjJdPj4wXT0wO2NbeSs0Pj4yXT0wfWlnKHkpO2NbeSswPj4yXT1jW0srMD4+Ml07Y1t5KzQ+PjJdPWNbSys0Pj4yXTtjW3krOD4+Ml09Y1tLKzg+PjJdO2NbSyswPj4yXT0wO2NbSys0Pj4yXT0wO2NbSys4Pj4yXT0wO1Y9b2NbY1soY1tEPj4yXXwwKSszNj4+Ml0mMTI3XShEKXwwO2JyZWFrfWVhPVhhKDQpfDA7Y1tlYT4+Ml09MjEzMDQ7d2IoZWF8MCwyMTM3NiwxOTYpfWVsc2V7aWYoISgoY1szMjEyXXwwKT09LTEpKXtjW1E+PjJdPTEyODQ4O2NbUSs0Pj4yXT0yMDg7Y1tRKzg+PjJdPTA7Y2coMTI4NDgsUSl9Rz0oY1sxMjg1Mj4+Ml18MCkrIC0xfDA7RD1jW2grOD4+Ml18MDtpZigoY1toKzEyPj4yXXwwKS1EPj4yPj4+MD5HPj4+MD8oRT1jW0QrKEc8PDIpPj4yXXwwLChFfDApIT0wKTowKXttY1tjWyhjW0U+PjJdfDApKzQ0Pj4yXSYxMjddKEwsRSk7Y1tGPj4yXT1jW0w+PjJdO21jW2NbKGNbRT4+Ml18MCkrMzI+PjJdJjEyN10oUCxFKTtpZigoYVtzPj4wXSYxKT09MCl7YVtzKzE+PjBdPTA7YVtzPj4wXT0wfWVsc2V7YVtjW3MrOD4+Ml0+PjBdPTA7Y1tzKzQ+PjJdPTB9aWcocyk7Y1tzKzA+PjJdPWNbUCswPj4yXTtjW3MrND4+Ml09Y1tQKzQ+PjJdO2Nbcys4Pj4yXT1jW1ArOD4+Ml07Y1tQKzA+PjJdPTA7Y1tQKzQ+PjJdPTA7Y1tQKzg+PjJdPTA7bWNbY1soY1tFPj4yXXwwKSsyOD4+Ml0mMTI3XShOLEUpO2lmKChhW3g+PjBdJjEpPT0wKXthW3grMT4+MF09MDthW3g+PjBdPTB9ZWxzZXthW2NbeCs4Pj4yXT4+MF09MDtjW3grND4+Ml09MH1pZyh4KTtjW3grMD4+Ml09Y1tOKzA+PjJdO2NbeCs0Pj4yXT1jW04rND4+Ml07Y1t4Kzg+PjJdPWNbTis4Pj4yXTtjW04rMD4+Ml09MDtjW04rND4+Ml09MDtjW04rOD4+Ml09MDtoPW9jW2NbKGNbRT4+Ml18MCkrMTI+PjJdJjEyN10oRSl8MDtHPW9jW2NbKGNbRT4+Ml18MCkrMTY+PjJdJjEyN10oRSl8MDttY1tjWyhjW0U+PjJdfDApKzIwPj4yXSYxMjddKEgsRSk7aWYoKGFbdD4+MF0mMSk9PTApe2FbdCsxPj4wXT0wO2FbdD4+MF09MH1lbHNle2FbY1t0Kzg+PjJdPj4wXT0wO2NbdCs0Pj4yXT0wfWlnKHQpO2NbdCswPj4yXT1jW0grMD4+Ml07Y1t0KzQ+PjJdPWNbSCs0Pj4yXTtjW3QrOD4+Ml09Y1tIKzg+PjJdO2NbSCswPj4yXT0wO2NbSCs0Pj4yXT0wO2NbSCs4Pj4yXT0wO21jW2NbKGNbRT4+Ml18MCkrMjQ+PjJdJjEyN10oSSxFKTtpZigoYVt5Pj4wXSYxKT09MCl7YVt5KzE+PjBdPTA7YVt5Pj4wXT0wfWVsc2V7YVtjW3krOD4+Ml0+PjBdPTA7Y1t5KzQ+PjJdPTB9aWcoeSk7Y1t5KzA+PjJdPWNbSSswPj4yXTtjW3krND4+Ml09Y1tJKzQ+PjJdO2NbeSs4Pj4yXT1jW0krOD4+Ml07Y1tJKzA+PjJdPTA7Y1tJKzQ+PjJdPTA7Y1tJKzg+PjJdPTA7Vj1vY1tjWyhjW0U+PjJdfDApKzM2Pj4yXSYxMjddKEUpfDA7YnJlYWt9ZWE9WGEoNCl8MDtjW2VhPj4yXT0yMTMwNDt3YihlYXwwLDIxMzc2LDE5Nil9fXdoaWxlKDApO2Nbbz4+Ml09Y1tuPj4yXTtKPW0rOHwwO0k9cysxfDA7TD1zKzR8MDttPXMrOHwwO0s9eCsxfDA7SD14KzR8MDtEPXgrOHwwO009KGomNTEyfDApIT0wO1M9eSsxfDA7aj15Kzh8MDtRPXkrNHwwO2c9dysxfDA7RT13Kzh8MDtPPXcrNHwwO049RiszfDA7Uj1uKzR8MDtQPXQrNHwwO1g9VCs0MDB8MDtZPVQ7Wj1UO1U9MDtUPTA7Vz0yMTM7YTp3aGlsZSgxKXtfPWNbZT4+Ml18MDtkb3tpZigoX3wwKSE9MCl7aWYoKGNbXysxMj4+Ml18MCk9PShjW18rMTY+PjJdfDApKXtpZigob2NbY1soY1tfPj4yXXwwKSszNj4+Ml0mMTI3XShfKXwwKT09LTEpe2NbZT4+Ml09MDtfPTA7YnJlYWt9ZWxzZXtfPWNbZT4+Ml18MDticmVha319fWVsc2V7Xz0wfX13aGlsZSgwKTtfPShffDApPT0wO2Rve2lmKChmfDApIT0wKXtpZigoY1tmKzEyPj4yXXwwKSE9KGNbZisxNj4+Ml18MCkpe2lmKF8pe2JyZWFrfWVsc2V7Qz0zNjM7YnJlYWsgYX19aWYoISgob2NbY1soY1tmPj4yXXwwKSszNj4+Ml0mMTI3XShmKXwwKT09LTEpKXtpZighXyl7Qz0zNjM7YnJlYWsgYX19ZWxzZXtDPTc0fX1lbHNle0M9NzR9fXdoaWxlKDApO2lmKChDfDApPT03NCl7Qz0wO2lmKF8pe2Y9MDtDPTM2MzticmVha31lbHNle2Y9MH19Yjpkb3tzd2l0Y2goYVtGK1U+PjBdfDApe2Nhc2UgMjp7aWYoISgoVHwwKSE9MHxVPj4+MDwyKSl7aWYoKFV8MCk9PTIpe189KGFbTj4+MF18MCkhPTB9ZWxzZXtfPTB9aWYoIShNfF8pKXtUPTA7YnJlYWsgYn19JD1hW3k+PjBdfDA7YWE9KCQmMSk9PTA7Xz1hYT9TOmNbaj4+Ml18MDtjOmRve2lmKChVfDApIT0wPyhkW0YrKFUrIC0xKT4+MF18MCk8MjowKXtiYT1fKyhhYT8oJCYyNTUpPj4+MTpjW1E+PjJdfDApfDA7Y2E9Xzt3aGlsZSgxKXtpZigoY2F8MCk9PShiYXwwKSl7YnJlYWt9YWE9YVtjYT4+MF18MDtpZighKGFhPDwyND4+MjQ+LTEpKXtiYT1jYTticmVha31pZigoYlsoY1tKPj4yXXwwKSsoYWE8PDI0Pj4yNDw8MSk+PjFdJjgxOTIpPT0wKXtiYT1jYTticmVha31lbHNle2NhPWNhKzF8MH19YWE9YmEtX3wwO2NhPWFbdz4+MF18MDtkYT0oY2EmMSk9PTA7aWYoZGEpe2VhPShjYSYyNTUpPj4+MX1lbHNle2VhPWNbTz4+Ml18MH1pZighKGFhPj4+MD5lYT4+PjApKXtpZihkYSl7ZGE9KGNhJjI1NSk+Pj4xO2NhPWc7ZWE9ZGE7ZGE9dysoZGEtYWEpKzF8MH1lbHNle2ZhPWNbRT4+Ml18MDtkYT1jW08+PjJdfDA7Y2E9ZmE7ZWE9ZGE7ZGE9ZmErKGRhLWFhKXwwfWFhPWNhK2VhfDA7aWYoKGRhfDApPT0oYWF8MCkpe2FhPWY7Xz1iYTtiYT1mfWVsc2V7Y2E9Xzt3aGlsZSgxKXtpZigoYVtkYT4+MF18MCkhPShhW2NhPj4wXXwwKSl7YWE9ZjtiYT1mO2JyZWFrIGN9ZGE9ZGErMXwwO2lmKChkYXwwKT09KGFhfDApKXthYT1mO189YmE7YmE9ZjticmVha31lbHNle2NhPWNhKzF8MH19fX1lbHNle2FhPWY7YmE9Zn19ZWxzZXthYT1mO2JhPWZ9fXdoaWxlKDApO2Q6d2hpbGUoMSl7aWYoKCQmMSk9PTApe2NhPVM7JD0oJCYyNTUpPj4+MX1lbHNle2NhPWNbaj4+Ml18MDskPWNbUT4+Ml18MH1pZigoX3wwKT09KGNhKyR8MCkpe2JyZWFrfSQ9Y1tlPj4yXXwwO2Rve2lmKCgkfDApIT0wKXtpZigoY1skKzEyPj4yXXwwKT09KGNbJCsxNj4+Ml18MCkpe2lmKChvY1tjWyhjWyQ+PjJdfDApKzM2Pj4yXSYxMjddKCQpfDApPT0tMSl7Y1tlPj4yXT0wOyQ9MDticmVha31lbHNleyQ9Y1tlPj4yXXwwO2JyZWFrfX19ZWxzZXskPTB9fXdoaWxlKDApOyQ9KCR8MCk9PTA7ZG97aWYoKGJhfDApIT0wKXtpZigoY1tiYSsxMj4+Ml18MCkhPShjW2JhKzE2Pj4yXXwwKSl7aWYoJCl7JD1hYTticmVha31lbHNle2JyZWFrIGR9fWlmKCEoKG9jW2NbKGNbYmE+PjJdfDApKzM2Pj4yXSYxMjddKGJhKXwwKT09LTEpKXtpZigkXihhYXwwKT09MCl7JD1hYTtiYT1hYX1lbHNle2JyZWFrIGR9fWVsc2V7YWE9MDtmPTA7Qz0yMzJ9fWVsc2V7Qz0yMzJ9fXdoaWxlKDApO2lmKChDfDApPT0yMzIpe0M9MDtpZigkKXticmVha31lbHNleyQ9YWE7YmE9MH19YWE9Y1tlPj4yXXwwO2NhPWNbYWErMTI+PjJdfDA7aWYoKGNhfDApPT0oY1thYSsxNj4+Ml18MCkpe2FhPW9jW2NbKGNbYWE+PjJdfDApKzM2Pj4yXSYxMjddKGFhKXwwfWVsc2V7YWE9ZFtjYT4+MF18MH1pZighKChhYSYyNTUpPDwyND4+MjQ9PShhW18+PjBdfDApKSl7YnJlYWt9ZGE9Y1tlPj4yXXwwO2NhPWRhKzEyfDA7YWE9Y1tjYT4+Ml18MDtpZigoYWF8MCk9PShjW2RhKzE2Pj4yXXwwKSl7b2NbY1soY1tkYT4+Ml18MCkrNDA+PjJdJjEyN10oZGEpfDB9ZWxzZXtjW2NhPj4yXT1hYSsxfWFhPSQ7JD1hW3k+PjBdfDA7Xz1fKzF8MH1pZihNKXthYT1hW3k+PjBdfDA7aWYoKGFhJjEpPT0wKXskPVM7YWE9KGFhJjI1NSk+Pj4xfWVsc2V7JD1jW2o+PjJdfDA7YWE9Y1tRPj4yXXwwfWlmKChffDApIT0oJCthYXwwKSl7Qz0yNDc7YnJlYWsgYX19YnJlYWt9O2Nhc2UgMDp7Qz05NzticmVha307Y2FzZSAzOntfPWFbeD4+MF18MDthYT0oXyYxKT09MDtpZihhYSl7ZGE9KF8mMjU1KT4+PjF9ZWxzZXtkYT1jW0g+PjJdfDB9JD1hW3M+PjBdfDA7YmE9KCQmMSk9PTA7aWYoYmEpe2NhPSgkJjI1NSk+Pj4xfWVsc2V7Y2E9Y1tMPj4yXXwwfWlmKChkYXwwKSE9KDAtY2F8MCkpe2lmKGFhKXtjYT0oXyYyNTUpPj4+MX1lbHNle2NhPWNbSD4+Ml18MH1pZigoY2F8MCkhPTApe2lmKGJhKXtiYT0oJCYyNTUpPj4+MX1lbHNle2JhPWNbTD4+Ml18MH1pZigoYmF8MCkhPTApe2FhPWNbZT4+Ml18MDtiYT1jW2FhKzEyPj4yXXwwO2NhPWNbYWErMTY+PjJdfDA7aWYoKGJhfDApPT0oY2F8MCkpeyQ9b2NbY1soY1thYT4+Ml18MCkrMzY+PjJdJjEyN10oYWEpfDA7Y2E9Y1tlPj4yXXwwO189YVt4Pj4wXXwwO2FhPWNhO2JhPWNbY2ErMTI+PjJdfDA7Y2E9Y1tjYSsxNj4+Ml18MH1lbHNleyQ9ZFtiYT4+MF18MH1kYT1hYSsxMnwwO2NhPShiYXwwKT09KGNhfDApO2lmKCgkJjI1NSk8PDI0Pj4yND09KGFbKChfJjEpPT0wP0s6Y1tEPj4yXXwwKT4+MF18MCkpe2lmKGNhKXtvY1tjWyhjW2FhPj4yXXwwKSs0MD4+Ml0mMTI3XShhYSl8MH1lbHNle2NbZGE+PjJdPWJhKzF9Xz1hW3g+PjBdfDA7aWYoKF8mMSk9PTApe189KF8mMjU1KT4+PjF9ZWxzZXtfPWNbSD4+Ml18MH1UPV8+Pj4wPjE/eDpUO2JyZWFrIGJ9aWYoY2Epe189b2NbY1soY1thYT4+Ml18MCkrMzY+PjJdJjEyN10oYWEpfDB9ZWxzZXtfPWRbYmE+PjBdfDB9aWYoISgoXyYyNTUpPDwyND4+MjQ9PShhWygoYVtzPj4wXSYxKT09MD9JOmNbbT4+Ml18MCk+PjBdfDApKSl7Qz0xOTY7YnJlYWsgYX1hYT1jW2U+PjJdfDA7Xz1hYSsxMnwwOyQ9Y1tfPj4yXXwwO2lmKCgkfDApPT0oY1thYSsxNj4+Ml18MCkpe29jW2NbKGNbYWE+PjJdfDApKzQwPj4yXSYxMjddKGFhKXwwfWVsc2V7Y1tfPj4yXT0kKzF9YVtsPj4wXT0xO189YVtzPj4wXXwwO2lmKChfJjEpPT0wKXtfPShfJjI1NSk+Pj4xfWVsc2V7Xz1jW0w+PjJdfDB9VD1fPj4+MD4xP3M6VDticmVhayBifX1pZihhYSl7YWE9KF8mMjU1KT4+PjF9ZWxzZXthYT1jW0g+PjJdfDB9YmE9Y1tlPj4yXXwwO2NhPWNbYmErMTI+PjJdfDA7ZGE9KGNhfDApPT0oY1tiYSsxNj4+Ml18MCk7aWYoKGFhfDApPT0wKXtpZihkYSl7Xz1vY1tjWyhjW2JhPj4yXXwwKSszNj4+Ml0mMTI3XShiYSl8MDskPWFbcz4+MF18MH1lbHNle189ZFtjYT4+MF18MH1pZighKChfJjI1NSk8PDI0Pj4yND09KGFbKCgkJjEpPT0wP0k6Y1ttPj4yXXwwKT4+MF18MCkpKXticmVhayBifWFhPWNbZT4+Ml18MDtfPWFhKzEyfDA7JD1jW18+PjJdfDA7aWYoKCR8MCk9PShjW2FhKzE2Pj4yXXwwKSl7b2NbY1soY1thYT4+Ml18MCkrNDA+PjJdJjEyN10oYWEpfDB9ZWxzZXtjW18+PjJdPSQrMX1hW2w+PjBdPTE7Xz1hW3M+PjBdfDA7aWYoKF8mMSk9PTApe189KF8mMjU1KT4+PjF9ZWxzZXtfPWNbTD4+Ml18MH1UPV8+Pj4wPjE/czpUO2JyZWFrIGJ9aWYoZGEpeyQ9b2NbY1soY1tiYT4+Ml18MCkrMzY+PjJdJjEyN10oYmEpfDA7Xz1hW3g+PjBdfDB9ZWxzZXskPWRbY2E+PjBdfDB9aWYoISgoJCYyNTUpPDwyND4+MjQ9PShhWygoXyYxKT09MD9LOmNbRD4+Ml18MCk+PjBdfDApKSl7YVtsPj4wXT0xO2JyZWFrIGJ9Xz1jW2U+PjJdfDA7JD1fKzEyfDA7YWE9Y1skPj4yXXwwO2lmKChhYXwwKT09KGNbXysxNj4+Ml18MCkpe29jW2NbKGNbXz4+Ml18MCkrNDA+PjJdJjEyN10oXyl8MH1lbHNle2NbJD4+Ml09YWErMX1fPWFbeD4+MF18MDtpZigoXyYxKT09MCl7Xz0oXyYyNTUpPj4+MX1lbHNle189Y1tIPj4yXXwwfVQ9Xz4+PjA+MT94OlR9YnJlYWt9O2Nhc2UgNDp7Xz0wO2U6d2hpbGUoMSl7JD1jW2U+PjJdfDA7ZG97aWYoKCR8MCkhPTApe2lmKChjWyQrMTI+PjJdfDApPT0oY1skKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbJD4+Ml18MCkrMzY+PjJdJjEyN10oJCl8MCk9PS0xKXtjW2U+PjJdPTA7JD0wO2JyZWFrfWVsc2V7JD1jW2U+PjJdfDA7YnJlYWt9fX1lbHNleyQ9MH19d2hpbGUoMCk7JD0oJHwwKT09MDtkb3tpZigoZnwwKSE9MCl7aWYoKGNbZisxMj4+Ml18MCkhPShjW2YrMTY+PjJdfDApKXtpZigkKXticmVha31lbHNle2JyZWFrIGV9fWlmKCEoKG9jW2NbKGNbZj4+Ml18MCkrMzY+PjJdJjEyN10oZil8MCk9PS0xKSl7aWYoISQpe2JyZWFrIGV9fWVsc2V7Qz0yNTl9fWVsc2V7Qz0yNTl9fXdoaWxlKDApO2lmKChDfDApPT0yNTkpe0M9MDtpZigkKXtmPTA7YnJlYWt9ZWxzZXtmPTB9fSQ9Y1tlPj4yXXwwO2FhPWNbJCsxMj4+Ml18MDtpZigoYWF8MCk9PShjWyQrMTY+PjJdfDApKXthYT1vY1tjWyhjWyQ+PjJdfDApKzM2Pj4yXSYxMjddKCQpfDB9ZWxzZXthYT1kW2FhPj4wXXwwfSQ9YWEmMjU1O2lmKCQ8PDI0Pj4yND4tMT8hKChiWyhjW0o+PjJdfDApKyhhYTw8MjQ+PjI0PDwxKT4+MV0mMjA0OCk9PTApOjApe2FhPWNbbz4+Ml18MDtpZigoYWF8MCk9PShwfDApKXtiYT0oY1tSPj4yXXwwKSE9MjEzO2NhPWNbbj4+Ml18MDthYT1wLWNhfDA7cD1hYT4+PjA8MjE0NzQ4MzY0Nz9hYTw8MTotMTtjYT13bihiYT9jYTowLHApfDA7aWYoKGNhfDApPT0wKXtDPTI2ODticmVhayBhfWlmKCFiYSl7YmE9Y1tuPj4yXXwwO2Nbbj4+Ml09Y2E7aWYoKGJhfDApIT0wKXtsY1tjW1I+PjJdJjI1NV0oYmEpO2NhPWNbbj4+Ml18MH19ZWxzZXtjW24+PjJdPWNhfWNbUj4+Ml09MjE0O2FhPWNhK2FhfDA7Y1tvPj4yXT1hYTtwPShjW24+PjJdfDApK3B8MH1jW28+PjJdPWFhKzE7YVthYT4+MF09JDtfPV8rMXwwfWVsc2V7YWE9YVt0Pj4wXXwwO2lmKChhYSYxKT09MCl7YWE9KGFhJjI1NSk+Pj4xfWVsc2V7YWE9Y1tQPj4yXXwwfWlmKCEoKCgoYWF8MCk9PTB8KF98MCk9PTApXjEpJiQ8PDI0Pj4yND09Rzw8MjQ+PjI0KSl7YnJlYWt9aWYoKFl8MCk9PShYfDApKXtZPVktWnwwO1g9WT4+PjA8MjE0NzQ4MzY0Nz9ZPDwxOi0xO2lmKChXfDApPT0yMTMpe1o9MH1XPXduKFosWCl8MDtpZigoV3wwKT09MCl7Qz0yODU7YnJlYWsgYX1aPVc7WD1XKyhYPj4+Mjw8Mil8MDtZPVcrKFk+PjI8PDIpfDA7Vz0yMTR9Y1tZPj4yXT1fO1k9WSs0fDA7Xz0wfSQ9Y1tlPj4yXXwwO2FhPSQrMTJ8MDtiYT1jW2FhPj4yXXwwO2lmKChiYXwwKT09KGNbJCsxNj4+Ml18MCkpe29jW2NbKGNbJD4+Ml18MCkrNDA+PjJdJjEyN10oJCl8MDtjb250aW51ZX1lbHNle2NbYWE+PjJdPWJhKzE7Y29udGludWV9fWlmKCEoKFp8MCk9PShZfDApfChffDApPT0wKSl7aWYoKFl8MCk9PShYfDApKXtZPVktWnwwO1g9WT4+PjA8MjE0NzQ4MzY0Nz9ZPDwxOi0xO2lmKChXfDApPT0yMTMpe1o9MH1XPXduKFosWCl8MDtpZigoV3wwKT09MCl7Qz0yOTc7YnJlYWsgYX1aPVc7WD1XKyhYPj4+Mjw8Mil8MDtZPVcrKFk+PjI8PDIpfDA7Vz0yMTR9Y1tZPj4yXT1fO1k9WSs0fDB9aWYoKFZ8MCk+MCl7Xz1jW2U+PjJdfDA7ZG97aWYoKF98MCkhPTApe2lmKChjW18rMTI+PjJdfDApPT0oY1tfKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbXz4+Ml18MCkrMzY+PjJdJjEyN10oXyl8MCk9PS0xKXtjW2U+PjJdPTA7Xz0wO2JyZWFrfWVsc2V7Xz1jW2U+PjJdfDA7YnJlYWt9fX1lbHNle189MH19d2hpbGUoMCk7Xz0oX3wwKT09MDtkb3tpZigoZnwwKSE9MCl7aWYoKGNbZisxMj4+Ml18MCkhPShjW2YrMTY+PjJdfDApKXtpZihfKXticmVha31lbHNle0M9MzE5O2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbZj4+Ml18MCkrMzY+PjJdJjEyN10oZil8MCk9PS0xKSl7aWYoIV8pe0M9MzE5O2JyZWFrIGF9fWVsc2V7Qz0zMTN9fWVsc2V7Qz0zMTN9fXdoaWxlKDApO2lmKChDfDApPT0zMTMpe0M9MDtpZihfKXtDPTMxOTticmVhayBhfWVsc2V7Zj0wfX1fPWNbZT4+Ml18MDskPWNbXysxMj4+Ml18MDtpZigoJHwwKT09KGNbXysxNj4+Ml18MCkpe189b2NbY1soY1tfPj4yXXwwKSszNj4+Ml0mMTI3XShfKXwwfWVsc2V7Xz1kWyQ+PjBdfDB9aWYoISgoXyYyNTUpPDwyND4+MjQ9PWg8PDI0Pj4yNCkpe0M9MzE5O2JyZWFrIGF9Xz1jW2U+PjJdfDA7JD1fKzEyfDA7YWE9Y1skPj4yXXwwO2lmKChhYXwwKT09KGNbXysxNj4+Ml18MCkpe29jW2NbKGNbXz4+Ml18MCkrNDA+PjJdJjEyN10oXyl8MDthYT1mOyQ9Zn1lbHNle2NbJD4+Ml09YWErMTthYT1mOyQ9Zn13aGlsZSgxKXtfPWNbZT4+Ml18MDtkb3tpZigoX3wwKSE9MCl7aWYoKGNbXysxMj4+Ml18MCk9PShjW18rMTY+PjJdfDApKXtpZigob2NbY1soY1tfPj4yXXwwKSszNj4+Ml0mMTI3XShfKXwwKT09LTEpe2NbZT4+Ml09MDtfPTA7YnJlYWt9ZWxzZXtfPWNbZT4+Ml18MDticmVha319fWVsc2V7Xz0wfX13aGlsZSgwKTtiYT0oX3wwKT09MDtkb3tpZigoJHwwKSE9MCl7aWYoKGNbJCsxMj4+Ml18MCkhPShjWyQrMTY+PjJdfDApKXtpZihiYSl7Xz1hYTticmVha31lbHNle0M9MzQxO2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbJD4+Ml18MCkrMzY+PjJdJjEyN10oJCl8MCk9PS0xKSl7aWYoYmFeKGFhfDApPT0wKXtfPWFhOyQ9YWF9ZWxzZXtDPTM0MTticmVhayBhfX1lbHNle189MDtmPTA7Qz0zMzR9fWVsc2V7Xz1hYTtDPTMzNH19d2hpbGUoMCk7aWYoKEN8MCk9PTMzNCl7Qz0wO2lmKGJhKXtDPTM0MTticmVhayBhfWVsc2V7JD0wfX1hYT1jW2U+PjJdfDA7YmE9Y1thYSsxMj4+Ml18MDtpZigoYmF8MCk9PShjW2FhKzE2Pj4yXXwwKSl7YWE9b2NbY1soY1thYT4+Ml18MCkrMzY+PjJdJjEyN10oYWEpfDB9ZWxzZXthYT1kW2JhPj4wXXwwfWlmKCEoKGFhJjI1NSk8PDI0Pj4yND4tMSkpe0M9MzQxO2JyZWFrIGF9aWYoKGJbKGNbSj4+Ml18MCkrKGFhPDwyND4+MjQ8PDEpPj4xXSYyMDQ4KT09MCl7Qz0zNDE7YnJlYWsgYX1hYT1jW28+PjJdfDA7aWYoKGFhfDApPT0ocHwwKSl7YmE9KGNbUj4+Ml18MCkhPTIxMztjYT1jW24+PjJdfDA7YWE9cC1jYXwwO3A9YWE+Pj4wPDIxNDc0ODM2NDc/YWE8PDE6LTE7Y2E9d24oYmE/Y2E6MCxwKXwwO2lmKChjYXwwKT09MCl7Qz0zNDQ7YnJlYWsgYX1kb3tpZihiYSl7Y1tuPj4yXT1jYX1lbHNle2JhPWNbbj4+Ml18MDtjW24+PjJdPWNhO2lmKChiYXwwKT09MCl7YnJlYWt9bGNbY1tSPj4yXSYyNTVdKGJhKTtjYT1jW24+PjJdfDB9fXdoaWxlKDApO2NbUj4+Ml09MjE0O2FhPWNhK2FhfDA7Y1tvPj4yXT1hYTtwPShjW24+PjJdfDApK3B8MH1jYT1jW2U+PjJdfDA7YmE9Y1tjYSsxMj4+Ml18MDtpZigoYmF8MCk9PShjW2NhKzE2Pj4yXXwwKSl7YmE9b2NbY1soY1tjYT4+Ml18MCkrMzY+PjJdJjEyN10oY2EpfDA7YWE9Y1tvPj4yXXwwfWVsc2V7YmE9ZFtiYT4+MF18MH1jW28+PjJdPWFhKzE7YVthYT4+MF09YmE7Vj1WKyAtMXwwO2NhPWNbZT4+Ml18MDthYT1jYSsxMnwwO2JhPWNbYWE+PjJdfDA7aWYoKGJhfDApPT0oY1tjYSsxNj4+Ml18MCkpe29jW2NbKGNbY2E+PjJdfDApKzQwPj4yXSYxMjddKGNhKXwwfWVsc2V7Y1thYT4+Ml09YmErMX1pZigoVnwwKT4wKXthYT1ffWVsc2V7YnJlYWt9fX1pZigoY1tvPj4yXXwwKT09KGNbbj4+Ml18MCkpe0M9MzYxO2JyZWFrIGF9YnJlYWt9O2Nhc2UgMTp7aWYoKFV8MCk9PTMpe0M9MzYzO2JyZWFrIGF9Qz1jW2U+PjJdfDA7Xz1jW0MrMTI+PjJdfDA7aWYoKF98MCk9PShjW0MrMTY+PjJdfDApKXtDPW9jW2NbKGNbQz4+Ml18MCkrMzY+PjJdJjEyN10oQyl8MH1lbHNle0M9ZFtfPj4wXXwwfWlmKCEoKEMmMjU1KTw8MjQ+PjI0Pi0xKSl7Qz05NjticmVhayBhfWlmKChiWyhjW0o+PjJdfDApKyhDPDwyND4+MjQ8PDEpPj4xXSY4MTkyKT09MCl7Qz05NjticmVhayBhfUM9Y1tlPj4yXXwwOyQ9QysxMnwwO189Y1skPj4yXXwwO2lmKChffDApPT0oY1tDKzE2Pj4yXXwwKSl7Qz1vY1tjWyhjW0M+PjJdfDApKzQwPj4yXSYxMjddKEMpfDB9ZWxzZXtjWyQ+PjJdPV8rMTtDPWRbXz4+MF18MH1fPUMmMjU1OyQ9YVt3Pj4wXXwwO0M9KCQmMSkhPTA7aWYoQyl7YWE9KGNbdz4+Ml0mLTIpKyAtMXwwOyQ9Y1tPPj4yXXwwfWVsc2V7YWE9MTA7JD0oJCYyNTUpPj4+MX1pZigoJHwwKT09KGFhfDApKXtsZyh3LGFhLDEsYWEsYWEsMCk7aWYoKGFbdz4+MF0mMSk9PTApe0M9OTN9ZWxzZXtDPTk0fX1lbHNle2lmKEMpe0M9OTR9ZWxzZXtDPTkzfX1pZigoQ3wwKT09OTMpe2Fbdz4+MF09KCQ8PDEpKzI7YmE9ZzthYT0kKzF8MH1lbHNlIGlmKChDfDApPT05NCl7YmE9Y1tFPj4yXXwwO2FhPSQrMXwwO2NbTz4+Ml09YWF9YVtiYSskPj4wXT1fO2FbYmErYWE+PjBdPTA7Qz05NzticmVha307ZGVmYXVsdDp7fX19d2hpbGUoMCk7Zjpkb3tpZigoQ3wwKT09OTcpe0M9MDtpZigoVXwwKT09Myl7Qz0zNjM7YnJlYWsgYX1lbHNle2FhPWY7JD1mfXdoaWxlKDEpe189Y1tlPj4yXXwwO2Rve2lmKChffDApIT0wKXtpZigoY1tfKzEyPj4yXXwwKT09KGNbXysxNj4+Ml18MCkpe2lmKChvY1tjWyhjW18+PjJdfDApKzM2Pj4yXSYxMjddKF8pfDApPT0tMSl7Y1tlPj4yXT0wO189MDticmVha31lbHNle189Y1tlPj4yXXwwO2JyZWFrfX19ZWxzZXtfPTB9fXdoaWxlKDApO2JhPShffDApPT0wO2Rve2lmKCgkfDApIT0wKXtpZigoY1skKzEyPj4yXXwwKSE9KGNbJCsxNj4+Ml18MCkpe2lmKGJhKXtfPWFhO2JyZWFrfWVsc2V7YnJlYWsgZn19aWYoISgob2NbY1soY1skPj4yXXwwKSszNj4+Ml0mMTI3XSgkKXwwKT09LTEpKXtpZihiYV4oYWF8MCk9PTApe189YWE7JD1hYX1lbHNle2JyZWFrIGZ9fWVsc2V7Xz0wO2Y9MDtDPTEwOX19ZWxzZXtfPWFhO0M9MTA5fX13aGlsZSgwKTtpZigoQ3wwKT09MTA5KXtDPTA7aWYoYmEpe2JyZWFrIGZ9ZWxzZXskPTB9fWJhPWNbZT4+Ml18MDthYT1jW2JhKzEyPj4yXXwwO2lmKChhYXwwKT09KGNbYmErMTY+PjJdfDApKXthYT1vY1tjWyhjW2JhPj4yXXwwKSszNj4+Ml0mMTI3XShiYSl8MH1lbHNle2FhPWRbYWE+PjBdfDB9aWYoISgoYWEmMjU1KTw8MjQ+PjI0Pi0xKSl7YnJlYWsgZn1pZigoYlsoY1tKPj4yXXwwKSsoYWE8PDI0Pj4yNDw8MSk+PjFdJjgxOTIpPT0wKXticmVhayBmfWJhPWNbZT4+Ml18MDtDPWJhKzEyfDA7YWE9Y1tDPj4yXXwwO2lmKChhYXwwKT09KGNbYmErMTY+PjJdfDApKXtDPW9jW2NbKGNbYmE+PjJdfDApKzQwPj4yXSYxMjddKGJhKXwwfWVsc2V7Y1tDPj4yXT1hYSsxO0M9ZFthYT4+MF18MH1hYT1DJjI1NTtiYT1hW3c+PjBdfDA7Y2E9KGJhJjEpIT0wO2lmKGNhKXtDPShjW3c+PjJdJi0yKSsgLTF8MDtiYT1jW08+PjJdfDB9ZWxzZXtDPTEwO2JhPShiYSYyNTUpPj4+MX1pZigoYmF8MCk9PShDfDApKXtsZyh3LEMsMSxDLEMsMCk7aWYoKGFbdz4+MF0mMSk9PTApe0M9MTI2fWVsc2V7Qz0xMjd9fWVsc2V7aWYoY2Epe0M9MTI3fWVsc2V7Qz0xMjZ9fWlmKChDfDApPT0xMjYpe0M9MDthW3c+PjBdPShiYTw8MSkrMjtjYT1nO2RhPWJhKzF8MH1lbHNlIGlmKChDfDApPT0xMjcpe0M9MDtjYT1jW0U+PjJdfDA7ZGE9YmErMXwwO2NbTz4+Ml09ZGF9YVtjYStiYT4+MF09YWE7YVtjYStkYT4+MF09MDthYT1ffX19d2hpbGUoMCk7VT1VKzF8MDtpZighKFU+Pj4wPDQpKXtDPTM2MzticmVha319Zzpzd2l0Y2goQ3wwKXtjYXNlIDk2OntjW2s+PjJdPWNbaz4+Ml18NDtlPTA7WT1aO2JyZWFrfTtjYXNlIDE5Njp7Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVha307Y2FzZSAyNDc6e2Nbaz4+Ml09Y1trPj4yXXw0O2U9MDtZPVo7YnJlYWt9O2Nhc2UgMjY4OntmYT1YYSg0KXwwO2NbZmE+PjJdPTIyNjgwO3diKGZhfDAsMjI3MjgsMjA2KX07Y2FzZSAyODU6e2ZhPVhhKDQpfDA7Y1tmYT4+Ml09MjI2ODA7d2IoZmF8MCwyMjcyOCwyMDYpfTtjYXNlIDI5Nzp7ZmE9WGEoNCl8MDtjW2ZhPj4yXT0yMjY4MDt3YihmYXwwLDIyNzI4LDIwNil9O2Nhc2UgMzE5OntjW2s+PjJdPWNbaz4+Ml18NDtlPTA7WT1aO2JyZWFrfTtjYXNlIDM0MTp7Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVha307Y2FzZSAzNDQ6e2ZhPVhhKDQpfDA7Y1tmYT4+Ml09MjI2ODA7d2IoZmF8MCwyMjcyOCwyMDYpfTtjYXNlIDM2MTp7Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVha307Y2FzZSAzNjM6e2g6ZG97aWYoKFR8MCkhPTApe0Y9VCsxfDA7bj1UKzh8MDtsPVQrNHwwO289MTtpOndoaWxlKDEpe2g9YVtUPj4wXXwwO2lmKChoJjEpPT0wKXtoPShoJjI1NSk+Pj4xfWVsc2V7aD1jW2w+PjJdfDB9aWYoIShvPj4+MDxoPj4+MCkpe2JyZWFrIGh9aD1jW2U+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKChjW2grMTI+PjJdfDApPT0oY1toKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MCk9PS0xKXtjW2U+PjJdPTA7aD0wO2JyZWFrfWVsc2V7aD1jW2U+PjJdfDA7YnJlYWt9fX1lbHNle2g9MH19d2hpbGUoMCk7aD0oaHwwKT09MDtkb3tpZigoZnwwKSE9MCl7aWYoKGNbZisxMj4+Ml18MCkhPShjW2YrMTY+PjJdfDApKXtpZihoKXticmVha31lbHNle2JyZWFrIGl9fWlmKCEoKG9jW2NbKGNbZj4+Ml18MCkrMzY+PjJdJjEyN10oZil8MCk9PS0xKSl7aWYoIWgpe2JyZWFrIGl9fWVsc2V7Qz0zODB9fWVsc2V7Qz0zODB9fXdoaWxlKDApO2lmKChDfDApPT0zODApe0M9MDtpZihoKXticmVha31lbHNle2Y9MH19aD1jW2U+PjJdfDA7Rz1jW2grMTI+PjJdfDA7aWYoKEd8MCk9PShjW2grMTY+PjJdfDApKXtoPW9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MH1lbHNle2g9ZFtHPj4wXXwwfWlmKChhW1Q+PjBdJjEpPT0wKXtHPUZ9ZWxzZXtHPWNbbj4+Ml18MH1pZighKChoJjI1NSk8PDI0Pj4yND09KGFbRytvPj4wXXwwKSkpe2JyZWFrfW89bysxfDA7aD1jW2U+PjJdfDA7Rz1oKzEyfDA7SD1jW0c+PjJdfDA7aWYoKEh8MCk9PShjW2grMTY+PjJdfDApKXtvY1tjWyhjW2g+PjJdfDApKzQwPj4yXSYxMjddKGgpfDA7Y29udGludWV9ZWxzZXtjW0c+PjJdPUgrMTtjb250aW51ZX19Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVhayBnfX13aGlsZSgwKTtpZigoWnwwKSE9KFl8MCkpe2NbQj4+Ml09MDtxayh0LFosWSxCKTtpZigoY1tCPj4yXXwwKT09MCl7ZT0xO1k9Wn1lbHNle2Nbaz4+Ml09Y1trPj4yXXw0O2U9MDtZPVp9fWVsc2V7ZT0xfWJyZWFrfX1pZighKChhW3c+PjBdJjEpPT0wKT8odj1jW0U+PjJdfDAsKHZ8MCkhPTApOjApe3ZuKHYpfWlmKCEoKGFbcz4+MF0mMSk9PTApPyh6PWNbbT4+Ml18MCwoenwwKSE9MCk6MCl7dm4oeil9aWYoISgoYVt4Pj4wXSYxKT09MCk/KEE9Y1tEPj4yXXwwLChBfDApIT0wKTowKXt2bihBKX1pZighKChhW3k+PjBdJjEpPT0wKT8ocj1jW2o+PjJdfDAsKHJ8MCkhPTApOjApe3ZuKHIpfWlmKCEoKGFbdD4+MF0mMSk9PTApPyhxPWNbdCs4Pj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1pZigoWXwwKT09MCl7aT11O3JldHVybiBlfDB9bGNbVyYyNTVdKFkpO2k9dTtyZXR1cm4gZXwwfWZ1bmN0aW9uIG9rKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wO2Q9WGEoOCl8MDtjW2Q+PjJdPTk5Mjg7Yj1KbihhfDApfDA7ZT1iKzEzfDA7ZT0oZXwwKT09MD8xOmU7d2hpbGUoMSl7Zz11bihlKXwwO2lmKChnfDApIT0wKXtmPTc7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2JyZWFrfXNjW2cmMzFdKCl9aWYoKGZ8MCk9PTcpe2NbZys0Pj4yXT1iO2NbZz4+Ml09YjtmPWcrMTJ8MDtjW2QrND4+Ml09ZjtjW2crOD4+Ml09MDtMbihmfDAsYXwwLGIrMXwwKXwwO3diKGR8MCwxMDA2NCwxMDYpfWc9WGEoNCl8MDtjW2c+PjJdPTIyNjgwO3diKGd8MCwyMjcyOCwyMDYpfWZ1bmN0aW9uIHBrKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDttPWk7aT1pKzEyOHwwO3A9bTtzPW0rMjh8MDtkPW0rMTZ8MDtxPW0rMTJ8MDt0PW0rMjR8MDtjW2Q+PjJdPXM7bD1kKzR8MDtjW2w+PjJdPTIxMztzPXMrMTAwfDA7bj1jW2grMjg+PjJdfDA7dT1uKzR8MDtjW3U+PjJdPShjW3U+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW3A+PjJdPTEzNDU2O2NbcCs0Pj4yXT0yMDg7Y1twKzg+PjJdPTA7Y2coMTM0NTYscCl9cD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7dT1jW24rOD4+Ml18MDtpZigoY1tuKzEyPj4yXXwwKS11Pj4yPj4+MD5wPj4+MD8ocj1jW3UrKHA8PDIpPj4yXXwwLChyfDApIT0wKTowKXthW3Q+PjBdPTA7cD1jW2Y+PjJdfDA7ZG97aWYobmsoZSxwLGcsbixjW2grND4+Ml18MCxqLHQscixkLHEscyl8MCl7aWYoKGFbaz4+MF0mMSk9PTApe2FbaysxPj4wXT0wO2Fbaz4+MF09MH1lbHNle2FbY1trKzg+PjJdPj4wXT0wO2Nbays0Pj4yXT0wfWlmKChhW3Q+PjBdfDApIT0wKXtnPXhjW2NbKGNbcj4+Ml18MCkrMjg+PjJdJjYzXShyLDQ1KXwwO2g9YVtrPj4wXXwwO289KGgmMSkhPTA7aWYobyl7cz0oY1trPj4yXSYtMikrIC0xfDA7aD1jW2srND4+Ml18MH1lbHNle3M9MTA7aD0oaCYyNTUpPj4+MX1pZigoaHwwKT09KHN8MCkpe2xnKGsscywxLHMscywwKTtpZigoYVtrPj4wXSYxKT09MCl7bz0yMX1lbHNle289MjJ9fWVsc2V7aWYobyl7bz0yMn1lbHNle289MjF9fWlmKChvfDApPT0yMSl7YVtrPj4wXT0oaDw8MSkrMjtzPWsrMXwwO3Q9aCsxfDB9ZWxzZSBpZigob3wwKT09MjIpe3M9Y1trKzg+PjJdfDA7dD1oKzF8MDtjW2srND4+Ml09dH1hW3MraD4+MF09ZzthW3MrdD4+MF09MH1yPXhjW2NbKGNbcj4+Ml18MCkrMjg+PjJdJjYzXShyLDQ4KXwwO2g9Y1tkPj4yXXwwO3E9Y1txPj4yXXwwO2c9cSsgLTF8MDthOmRve2lmKGg+Pj4wPGc+Pj4wKXt3aGlsZSgxKXtzPWgrMXwwO2lmKCEoKGFbaD4+MF18MCk9PXI8PDI0Pj4yNCkpe2JyZWFrIGF9aWYocz4+PjA8Zz4+PjApe2g9c31lbHNle2g9czticmVha319fX13aGlsZSgwKTtzPWg7cj1hW2s+PjBdfDA7aWYoKHImMSk9PTApe3Q9cjt1PTEwO3I9KHImMjU1KT4+PjF9ZWxzZXt1PWNbaz4+Ml18MDt0PXUmMjU1O3U9KHUmLTIpKyAtMXwwO3I9Y1trKzQ+PjJdfDB9Zz1xLXN8MDtpZigocXwwKSE9KGh8MCkpe2lmKCh1LXJ8MCk+Pj4wPGc+Pj4wKXtsZyhrLHUscitnLXV8MCxyLHIsMCk7dD1hW2s+PjBdfDB9aWYoKHQmMSk9PTApe3Q9aysxfDB9ZWxzZXt0PWNbays4Pj4yXXwwfXM9cSsoci1zKXwwO3U9dCtyfDA7d2hpbGUoMSl7YVt1Pj4wXT1hW2g+PjBdfDA7aD1oKzF8MDtpZigoaHwwKT09KHF8MCkpe2JyZWFrfXU9dSsxfDB9YVt0K3M+PjBdPTA7cT1yK2d8MDtpZigoYVtrPj4wXSYxKT09MCl7YVtrPj4wXT1xPDwxO2JyZWFrfWVsc2V7Y1trKzQ+PjJdPXE7YnJlYWt9fX19d2hpbGUoMCk7az1jW2U+PjJdfDA7aWYoKGt8MCkhPTApe2lmKChjW2srMTI+PjJdfDApPT0oY1trKzE2Pj4yXXwwKT8ob2NbY1soY1trPj4yXXwwKSszNj4+Ml0mMTI3XShrKXwwKT09LTE6MCl7Y1tlPj4yXT0wO2s9MH19ZWxzZXtrPTB9ZT0oa3wwKT09MDtkb3tpZigocHwwKSE9MCl7aWYoKGNbcCsxMj4+Ml18MCkhPShjW3ArMTY+PjJdfDApKXtpZihlKXticmVha31lbHNle289NTc7YnJlYWt9fWlmKCEoKG9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MCk9PS0xKSl7aWYoZSl7YnJlYWt9ZWxzZXtvPTU3O2JyZWFrfX1lbHNle2NbZj4+Ml09MDtvPTU1O2JyZWFrfX1lbHNle289NTV9fXdoaWxlKDApO2lmKChvfDApPT01NT9lOjApe289NTd9aWYoKG98MCk9PTU3KXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPWs7dD1uKzR8MDt1PWNbdD4+Ml18MDtjW3Q+PjJdPXUrIC0xO2lmKCh1fDApPT0wKXtsY1tjWyhjW24+PjJdfDApKzg+PjJdJjI1NV0obil9aj1jW2Q+PjJdfDA7Y1tkPj4yXT0wO2lmKChqfDApPT0wKXtpPW07cmV0dXJufWxjW2NbbD4+Ml0mMjU1XShqKTtpPW07cmV0dXJufXU9WGEoNCl8MDtjW3U+PjJdPTIxMzA0O3diKHV8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHFrKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTA7Zz1pO2s9YVtiPj4wXXwwO2lmKChrJjEpPT0wKXtqPShrJjI1NSk+Pj4xfWVsc2V7aj1jW2IrND4+Ml18MH1pZigoanwwKT09MCl7aT1nO3JldHVybn1pZigoZHwwKSE9KGV8MCk/KGg9ZSsgLTR8MCxoPj4+MD5kPj4+MCk6MCl7aj1kO2Rve2s9Y1tqPj4yXXwwO2Nbaj4+Ml09Y1toPj4yXTtjW2g+PjJdPWs7aj1qKzR8MDtoPWgrIC00fDB9d2hpbGUoaj4+PjA8aD4+PjApO2s9YVtiPj4wXXwwfWlmKChrJjEpPT0wKXtoPWIrMXwwO2I9KGsmMjU1KT4+PjF9ZWxzZXtoPWNbYis4Pj4yXXwwO2I9Y1tiKzQ+PjJdfDB9ZT1lKyAtNHwwO2s9YVtoPj4wXXwwO2o9azw8MjQ+PjI0PDF8azw8MjQ+PjI0PT0xMjc7YTpkb3tpZihlPj4+MD5kPj4+MCl7Yj1oK2J8MDt3aGlsZSgxKXtpZighaj8oazw8MjQ+PjI0fDApIT0oY1tkPj4yXXwwKTowKXticmVha31oPShiLWh8MCk+MT9oKzF8MDpoO2Q9ZCs0fDA7az1hW2g+PjBdfDA7aj1rPDwyND4+MjQ8MXxrPDwyND4+MjQ9PTEyNztpZighKGQ+Pj4wPGU+Pj4wKSl7YnJlYWsgYX19Y1tmPj4yXT00O2k9ZztyZXR1cm59fXdoaWxlKDApO2lmKGope2k9ZztyZXR1cm59aj1jW2U+PjJdfDA7aWYoIShrPDwyND4+MjQ+Pj4wPGo+Pj4wfChqfDApPT0wKSl7aT1nO3JldHVybn1jW2Y+PjJdPTQ7aT1nO3JldHVybn1mdW5jdGlvbiByayhhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBzayhhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gdGsoYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wO249aTtpPWkrNTc2fDA7cT1uO3Y9bisyNHwwO2Q9bisxNnwwO3I9bis0NjR8MDt1PW4rNTY4fDA7cz1uKzQyNHwwO3A9bis0Njh8MDtjW2Q+PjJdPXY7bT1kKzR8MDtjW20+PjJdPTIxMzt2PXYrNDAwfDA7bz1jW2grMjg+PjJdfDA7eD1vKzR8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW3E+PjJdPTEzNDQ4O2NbcSs0Pj4yXT0yMDg7Y1txKzg+PjJdPTA7Y2coMTM0NDgscSl9eD0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dz1jW28rOD4+Ml18MDtpZigoY1tvKzEyPj4yXXwwKS13Pj4yPj4+MD54Pj4+MD8odD1jW3crKHg8PDIpPj4yXXwwLCh0fDApIT0wKTowKXthW3U+PjBdPTA7ZG97aWYodWsoZSxjW2Y+PjJdfDAsZyxvLGNbaCs0Pj4yXXwwLGosdSx0LGQscix2KXwwKXt1Y1tjWyhjW3Q+PjJdfDApKzQ4Pj4yXSYzMV0odCwxMzE2OCwxMzE3OHwwLHMpfDA7aD1jW3I+PjJdfDA7Zz1jW2Q+PjJdfDA7dD1oLWd8MDtpZigodHwwKT4zOTIpe3Y9dW4oKHQ+PjIpKzJ8MCl8MDtpZigodnwwKT09MCl7eD1YYSg0KXwwO2NbeD4+Ml09MjI2ODA7d2IoeHwwLDIyNzI4LDIwNil9ZWxzZXt0PXZ9fWVsc2V7dD0wO3Y9cH1pZigoYVt1Pj4wXXwwKSE9MCl7YVt2Pj4wXT00NTt2PXYrMXwwfWlmKGc+Pj4wPGg+Pj4wKXtoPXMrNDB8MDt1PXM7ZG97eD1jW2c+PjJdfDA7dz1zO3doaWxlKDEpe2lmKChjW3c+PjJdfDApPT0oeHwwKSl7YnJlYWt9dz13KzR8MDtpZigod3wwKT09KGh8MCkpe3c9aDticmVha319YVt2Pj4wXT1hWzEzMTY4Kyh3LXU+PjIpPj4wXXwwO2c9Zys0fDA7dj12KzF8MH13aGlsZShnPj4+MDwoY1tyPj4yXXwwKT4+PjApfWFbdj4+MF09MDtjW3E+PjJdPWs7aWYoKEZhKHB8MCwxMzEwNCxxfDApfDApPT0xKXtpZigodHwwKT09MCl7YnJlYWt9dm4odCk7YnJlYWt9aj1YYSg4KXwwO2Nbaj4+Ml09OTkyODt3aGlsZSgxKXtkPXVuKDI4KXwwO2lmKChkfDApIT0wKXtsPTI5O2JyZWFrfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXtsPTI3O2JyZWFrfXNjW2wmMzFdKCl9aWYoKGx8MCk9PTI3KXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNlIGlmKChsfDApPT0yOSl7Y1tkKzQ+PjJdPTE1O2NbZD4+Ml09MTU7Yj1kKzEyfDA7Y1tqKzQ+PjJdPWI7Y1tkKzg+PjJdPTA7Yj1iKzB8MDtkPTEzMTEyfDA7bD1iKzE2fDA7ZG97YVtiPj4wXT1hW2Q+PjBdfDA7Yj1iKzF8MDtkPWQrMXwwfXdoaWxlKChifDApPChsfDApKTt3YihqfDAsMTAwNjQsMTA2KX19fXdoaWxlKDApO2s9Y1tlPj4yXXwwO2lmKChrfDApIT0wKXtwPWNbaysxMj4+Ml18MDtpZigocHwwKT09KGNbaysxNj4+Ml18MCkpe3A9b2NbY1soY1trPj4yXXwwKSszNj4+Ml0mMTI3XShrKXwwfWVsc2V7cD1jW3A+PjJdfDB9aWYoKHB8MCk9PS0xKXtjW2U+PjJdPTA7ZT0wO2s9MX1lbHNle2U9aztrPTB9fWVsc2V7ZT0wO2s9MX1xPWNbZj4+Ml18MDtkb3tpZigocXwwKSE9MCl7cD1jW3ErMTI+PjJdfDA7aWYoKHB8MCk9PShjW3ErMTY+PjJdfDApKXtwPW9jW2NbKGNbcT4+Ml18MCkrMzY+PjJdJjEyN10ocSl8MH1lbHNle3A9Y1twPj4yXXwwfWlmKCEoKHB8MCk9PS0xKSl7aWYoayl7YnJlYWt9ZWxzZXtsPTQ3O2JyZWFrfX1lbHNle2NbZj4+Ml09MDtsPTQ1O2JyZWFrfX1lbHNle2w9NDV9fXdoaWxlKDApO2lmKChsfDApPT00NT9rOjApe2w9NDd9aWYoKGx8MCk9PTQ3KXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPWU7dz1vKzR8MDt4PWNbdz4+Ml18MDtjW3c+PjJdPXgrIC0xO2lmKCh4fDApPT0wKXtsY1tjWyhjW28+PjJdfDApKzg+PjJdJjI1NV0obyl9bD1jW2Q+PjJdfDA7Y1tkPj4yXT0wO2lmKChsfDApPT0wKXtpPW47cmV0dXJufWxjW2NbbT4+Ml0mMjU1XShsKTtpPW47cmV0dXJufXg9WGEoNCl8MDtjW3g+PjJdPTIxMzA0O3diKHh8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHVrKGIsZSxmLGcsaCxqLGssbCxtLG4sbyl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7bz1vfDA7dmFyIHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTA7dj1pO2k9aSs1OTJ8MDtRPXY7Tz12KzExMnwwO0s9disxMnwwO0c9disxMDB8MDtIPXYrNDB8MDtFPXYrMjR8MDtOPXYrMzZ8MDtNPXYrODh8MDtMPXYrNzZ8MDtKPXYrNTJ8MDtJPXYrNjR8MDtQPXYrMTIwfDA7Rj12KzUyMHwwO3Q9dis1MjR8MDt3PXYrNTM2fDA7eD12KzU0OHwwO3I9dis1NjB8MDtzPXYrNTcyfDA7QT12KzU4NHwwO2NbRj4+Ml09MDtjW3QrMD4+Ml09MDtjW3QrND4+Ml09MDtjW3QrOD4+Ml09MDtjW3crMD4+Ml09MDtjW3crND4+Ml09MDtjW3crOD4+Ml09MDtjW3grMD4+Ml09MDtjW3grND4+Ml09MDtjW3grOD4+Ml09MDtjW3IrMD4+Ml09MDtjW3IrND4+Ml09MDtjW3IrOD4+Ml09MDtjW3MrMD4+Ml09MDtjW3MrND4+Ml09MDtjW3MrOD4+Ml09MDtkb3tpZihmKXtpZighKChjWzMyNjBdfDApPT0tMSkpe2NbUT4+Ml09MTMwNDA7Y1tRKzQ+PjJdPTIwODtjW1ErOD4+Ml09MDtjZygxMzA0MCxRKX1DPShjWzEzMDQ0Pj4yXXwwKSsgLTF8MDtJPWNbZys4Pj4yXXwwO2lmKChjW2crMTI+PjJdfDApLUk+PjI+Pj4wPkM+Pj4wPyhEPWNbSSsoQzw8Mik+PjJdfDAsKER8MCkhPTApOjApe21jW2NbKGNbRD4+Ml18MCkrNDQ+PjJdJjEyN10oTyxEKTtjW0Y+PjJdPWNbTz4+Ml07bWNbY1soY1tEPj4yXXwwKSszMj4+Ml0mMTI3XShLLEQpO2lmKChhW3I+PjBdJjEpPT0wKXtjW3IrND4+Ml09MDthW3I+PjBdPTB9ZWxzZXtjW2Nbcis4Pj4yXT4+Ml09MDtjW3IrND4+Ml09MH1vZyhyKTtjW3IrMD4+Ml09Y1tLKzA+PjJdO2Nbcis0Pj4yXT1jW0srND4+Ml07Y1tyKzg+PjJdPWNbSys4Pj4yXTtjW0srMD4+Ml09MDtjW0srND4+Ml09MDtjW0srOD4+Ml09MDttY1tjWyhjW0Q+PjJdfDApKzI4Pj4yXSYxMjddKEcsRCk7aWYoKGFbeD4+MF0mMSk9PTApe2NbeCs0Pj4yXT0wO2FbeD4+MF09MH1lbHNle2NbY1t4Kzg+PjJdPj4yXT0wO2NbeCs0Pj4yXT0wfW9nKHgpO2NbeCswPj4yXT1jW0crMD4+Ml07Y1t4KzQ+PjJdPWNbRys0Pj4yXTtjW3grOD4+Ml09Y1tHKzg+PjJdO2NbRyswPj4yXT0wO2NbRys0Pj4yXT0wO2NbRys4Pj4yXT0wO2c9b2NbY1soY1tEPj4yXXwwKSsxMj4+Ml0mMTI3XShEKXwwO0c9b2NbY1soY1tEPj4yXXwwKSsxNj4+Ml0mMTI3XShEKXwwO21jW2NbKGNbRD4+Ml18MCkrMjA+PjJdJjEyN10oSCxEKTtpZigoYVt0Pj4wXSYxKT09MCl7YVt0KzE+PjBdPTA7YVt0Pj4wXT0wfWVsc2V7YVtjW3QrOD4+Ml0+PjBdPTA7Y1t0KzQ+PjJdPTB9aWcodCk7Y1t0KzA+PjJdPWNbSCswPj4yXTtjW3QrND4+Ml09Y1tIKzQ+PjJdO2NbdCs4Pj4yXT1jW0grOD4+Ml07Y1tIKzA+PjJdPTA7Y1tIKzQ+PjJdPTA7Y1tIKzg+PjJdPTA7bWNbY1soY1tEPj4yXXwwKSsyND4+Ml0mMTI3XShFLEQpO2lmKChhW3c+PjBdJjEpPT0wKXtjW3crND4+Ml09MDthW3c+PjBdPTB9ZWxzZXtjW2Nbdys4Pj4yXT4+Ml09MDtjW3crND4+Ml09MH1vZyh3KTtjW3crMD4+Ml09Y1tFKzA+PjJdO2Nbdys0Pj4yXT1jW0UrND4+Ml07Y1t3Kzg+PjJdPWNbRSs4Pj4yXTtjW0UrMD4+Ml09MDtjW0UrND4+Ml09MDtjW0UrOD4+Ml09MDtmPW9jW2NbKGNbRD4+Ml18MCkrMzY+PjJdJjEyN10oRCl8MDticmVha30kPVhhKDQpfDA7Y1skPj4yXT0yMTMwNDt3YigkfDAsMjEzNzYsMTk2KX1lbHNle2lmKCEoKGNbMzI0NF18MCk9PS0xKSl7Y1tRPj4yXT0xMjk3NjtjW1ErND4+Ml09MjA4O2NbUSs4Pj4yXT0wO2NnKDEyOTc2LFEpfUQ9KGNbMTI5ODA+PjJdfDApKyAtMXwwO0U9Y1tnKzg+PjJdfDA7aWYoKGNbZysxMj4+Ml18MCktRT4+Mj4+PjA+RD4+PjA/KEM9Y1tFKyhEPDwyKT4+Ml18MCwoQ3wwKSE9MCk6MCl7bWNbY1soY1tDPj4yXXwwKSs0ND4+Ml0mMTI3XShOLEMpO2NbRj4+Ml09Y1tOPj4yXTttY1tjWyhjW0M+PjJdfDApKzMyPj4yXSYxMjddKE0sQyk7aWYoKGFbcj4+MF0mMSk9PTApe2Nbcis0Pj4yXT0wO2Fbcj4+MF09MH1lbHNle2NbY1tyKzg+PjJdPj4yXT0wO2Nbcis0Pj4yXT0wfW9nKHIpO2NbciswPj4yXT1jW00rMD4+Ml07Y1tyKzQ+PjJdPWNbTSs0Pj4yXTtjW3IrOD4+Ml09Y1tNKzg+PjJdO2NbTSswPj4yXT0wO2NbTSs0Pj4yXT0wO2NbTSs4Pj4yXT0wO21jW2NbKGNbQz4+Ml18MCkrMjg+PjJdJjEyN10oTCxDKTtpZigoYVt4Pj4wXSYxKT09MCl7Y1t4KzQ+PjJdPTA7YVt4Pj4wXT0wfWVsc2V7Y1tjW3grOD4+Ml0+PjJdPTA7Y1t4KzQ+PjJdPTB9b2coeCk7Y1t4KzA+PjJdPWNbTCswPj4yXTtjW3grND4+Ml09Y1tMKzQ+PjJdO2NbeCs4Pj4yXT1jW0wrOD4+Ml07Y1tMKzA+PjJdPTA7Y1tMKzQ+PjJdPTA7Y1tMKzg+PjJdPTA7Zz1vY1tjWyhjW0M+PjJdfDApKzEyPj4yXSYxMjddKEMpfDA7Rz1vY1tjWyhjW0M+PjJdfDApKzE2Pj4yXSYxMjddKEMpfDA7bWNbY1soY1tDPj4yXXwwKSsyMD4+Ml0mMTI3XShKLEMpO2lmKChhW3Q+PjBdJjEpPT0wKXthW3QrMT4+MF09MDthW3Q+PjBdPTB9ZWxzZXthW2NbdCs4Pj4yXT4+MF09MDtjW3QrND4+Ml09MH1pZyh0KTtjW3QrMD4+Ml09Y1tKKzA+PjJdO2NbdCs0Pj4yXT1jW0orND4+Ml07Y1t0Kzg+PjJdPWNbSis4Pj4yXTtjW0orMD4+Ml09MDtjW0orND4+Ml09MDtjW0orOD4+Ml09MDttY1tjWyhjW0M+PjJdfDApKzI0Pj4yXSYxMjddKEksQyk7aWYoKGFbdz4+MF0mMSk9PTApe2Nbdys0Pj4yXT0wO2Fbdz4+MF09MH1lbHNle2NbY1t3Kzg+PjJdPj4yXT0wO2Nbdys0Pj4yXT0wfW9nKHcpO2NbdyswPj4yXT1jW0krMD4+Ml07Y1t3KzQ+PjJdPWNbSSs0Pj4yXTtjW3crOD4+Ml09Y1tJKzg+PjJdO2NbSSswPj4yXT0wO2NbSSs0Pj4yXT0wO2NbSSs4Pj4yXT0wO2Y9b2NbY1soY1tDPj4yXXwwKSszNj4+Ml0mMTI3XShDKXwwO2JyZWFrfSQ9WGEoNCl8MDtjWyQ+PjJdPTIxMzA0O3diKCR8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtjW24+PjJdPWNbbT4+Ml07ST1yKzR8MDtEPXIrOHwwO0g9eCs0fDA7Qz14Kzh8MDtMPShoJjUxMnwwKSE9MDtKPXcrNHwwO2g9dys4fDA7TT1zKzR8MDtFPXMrOHwwO049RiszfDA7Sz1tKzR8MDtPPXQrNHwwO1M9UCs0MDB8MDtVPVA7VD1QO1E9MDtQPTA7Uj0yMTM7YTp3aGlsZSgxKXtWPWNbYj4+Ml18MDtkb3tpZigoVnwwKSE9MCl7Vz1jW1YrMTI+PjJdfDA7aWYoKFd8MCk9PShjW1YrMTY+PjJdfDApKXtWPW9jW2NbKGNbVj4+Ml18MCkrMzY+PjJdJjEyN10oVil8MH1lbHNle1Y9Y1tXPj4yXXwwfWlmKChWfDApPT0tMSl7Y1tiPj4yXT0wO1Y9MTticmVha31lbHNle1Y9KGNbYj4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7Vj0xfX13aGlsZSgwKTtpZigoZXwwKSE9MCl7Vz1jW2UrMTI+PjJdfDA7aWYoKFd8MCk9PShjW2UrMTY+PjJdfDApKXtXPW9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MH1lbHNle1c9Y1tXPj4yXXwwfWlmKCEoKFd8MCk9PS0xKSl7aWYoIVYpe0I9Mzc4O2JyZWFrfX1lbHNle0I9NzV9fWVsc2V7Qj03NX1pZigoQnwwKT09NzUpe0I9MDtpZihWKXtlPTA7Qj0zNzg7YnJlYWt9ZWxzZXtlPTB9fWI6ZG97c3dpdGNoKGFbRitRPj4wXXwwKXtjYXNlIDE6e2lmKChRfDApPT0zKXtCPTM3ODticmVhayBhfUI9Y1tiPj4yXXwwO1Y9Y1tCKzEyPj4yXXwwO2lmKChWfDApPT0oY1tCKzE2Pj4yXXwwKSl7Qj1vY1tjWyhjW0I+PjJdfDApKzM2Pj4yXSYxMjddKEIpfDB9ZWxzZXtCPWNbVj4+Ml18MH1pZighKGhjW2NbKGNbbD4+Ml18MCkrMTI+PjJdJjYzXShsLDgxOTIsQil8MCkpe0I9OTc7YnJlYWsgYX1XPWNbYj4+Ml18MDtCPVcrMTJ8MDtWPWNbQj4+Ml18MDtpZigoVnwwKT09KGNbVysxNj4+Ml18MCkpe1Y9b2NbY1soY1tXPj4yXXwwKSs0MD4+Ml0mMTI3XShXKXwwfWVsc2V7Y1tCPj4yXT1WKzQ7Vj1jW1Y+PjJdfDB9Vz1hW3M+PjBdfDA7Qj0oVyYxKSE9MDtpZihCKXtYPShjW3M+PjJdJi0yKSsgLTF8MDtXPWNbTT4+Ml18MH1lbHNle1g9MTtXPShXJjI1NSk+Pj4xfWlmKChXfDApPT0oWHwwKSl7cGcocyxYLDEsWCxYLDAsMCk7aWYoKGFbcz4+MF0mMSk9PTApe0I9OTR9ZWxzZXtCPTk1fX1lbHNle2lmKEIpe0I9OTV9ZWxzZXtCPTk0fX1pZigoQnwwKT09OTQpe2Fbcz4+MF09KFc8PDEpKzI7WD1NO1k9VysxfDB9ZWxzZSBpZigoQnwwKT09OTUpe1g9Y1tFPj4yXXwwO1k9VysxfDA7Y1tNPj4yXT1ZfWNbWCsoVzw8Mik+PjJdPVY7Y1tYKyhZPDwyKT4+Ml09MDtCPTk4O2JyZWFrfTtjYXNlIDI6e2lmKCEoKFB8MCkhPTB8UT4+PjA8Mikpe2lmKChRfDApPT0yKXtWPShhW04+PjBdfDApIT0wfWVsc2V7Vj0wfWlmKCEoTHxWKSl7UD0wO2JyZWFrIGJ9fVk9YVt3Pj4wXXwwO1Y9KFkmMSk9PTA/SjpjW2g+PjJdfDA7Yzpkb3tpZigoUXwwKSE9MD8oZFtGKyhRKyAtMSk+PjBdfDApPDI6MCl7d2hpbGUoMSl7aWYoKFkmMSk9PTApe1g9SjtXPShZJjI1NSk+Pj4xfWVsc2V7WD1jW2g+PjJdfDA7Vz1jW0o+PjJdfDB9aWYoKFZ8MCk9PShYKyhXPDwyKXwwKSl7YnJlYWt9aWYoIShoY1tjWyhjW2w+PjJdfDApKzEyPj4yXSY2M10obCw4MTkyLGNbVj4+Ml18MCl8MCkpe0I9MjEyO2JyZWFrfVk9YVt3Pj4wXXwwO1Y9Vis0fDB9aWYoKEJ8MCk9PTIxMil7Qj0wO1k9YVt3Pj4wXXwwfVg9KFkmMSk9PTA/SjpjW2g+PjJdfDA7Vz1WLVg+PjI7Wj1hW3M+PjBdfDA7JD0oWiYxKT09MDtpZigkKXtfPShaJjI1NSk+Pj4xfWVsc2V7Xz1jW00+PjJdfDB9aWYoIShXPj4+MD5fPj4+MCkpe2lmKCQpe189KFomMjU1KT4+PjE7JD1NO1o9XztfPU0rKF8tVzw8Mil8MH1lbHNle2FhPWNbRT4+Ml18MDtfPWNbTT4+Ml18MDskPWFhO1o9XztfPWFhKyhfLVc8PDIpfDB9Vz0kKyhaPDwyKXwwO2lmKChffDApPT0oV3wwKSl7Vz1lO1g9ZX1lbHNle1o9WDt3aGlsZSgxKXtpZigoY1tfPj4yXXwwKSE9KGNbWj4+Ml18MCkpe1c9ZTtWPVg7WD1lO2JyZWFrIGN9Xz1fKzR8MDtpZigoX3wwKT09KFd8MCkpe1c9ZTtYPWU7YnJlYWsgY31aPVorNHwwfX19ZWxzZXtXPWU7Vj1YO1g9ZX19ZWxzZXtXPWU7WD1lfX13aGlsZSgwKTt3aGlsZSgxKXtpZigoWSYxKT09MCl7Wj1KO1k9KFkmMjU1KT4+PjF9ZWxzZXtaPWNbaD4+Ml18MDtZPWNbSj4+Ml18MH1pZigoVnwwKT09KForKFk8PDIpfDApKXticmVha31ZPWNbYj4+Ml18MDtkb3tpZigoWXwwKSE9MCl7Wj1jW1krMTI+PjJdfDA7aWYoKFp8MCk9PShjW1krMTY+PjJdfDApKXtZPW9jW2NbKGNbWT4+Ml18MCkrMzY+PjJdJjEyN10oWSl8MH1lbHNle1k9Y1taPj4yXXwwfWlmKChZfDApPT0tMSl7Y1tiPj4yXT0wO1k9MTticmVha31lbHNle1k9KGNbYj4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7WT0xfX13aGlsZSgwKTtpZigoWHwwKSE9MCl7Wj1jW1grMTI+PjJdfDA7aWYoKFp8MCk9PShjW1grMTY+PjJdfDApKXtYPW9jW2NbKGNbWD4+Ml18MCkrMzY+PjJdJjEyN10oWCl8MH1lbHNle1g9Y1taPj4yXXwwfWlmKCEoKFh8MCk9PS0xKSl7aWYoWV4oV3wwKT09MCl7WT1XO1g9V31lbHNle2JyZWFrfX1lbHNle1c9MDtlPTA7Qj0yNDB9fWVsc2V7Qj0yNDB9aWYoKEJ8MCk9PTI0MCl7Qj0wO2lmKFkpe2JyZWFrfWVsc2V7WT1XO1g9MH19Wj1jW2I+PjJdfDA7Vz1jW1orMTI+PjJdfDA7aWYoKFd8MCk9PShjW1orMTY+PjJdfDApKXtXPW9jW2NbKGNbWj4+Ml18MCkrMzY+PjJdJjEyN10oWil8MH1lbHNle1c9Y1tXPj4yXXwwfWlmKChXfDApIT0oY1tWPj4yXXwwKSl7YnJlYWt9Xz1jW2I+PjJdfDA7Vz1fKzEyfDA7Wj1jW1c+PjJdfDA7aWYoKFp8MCk9PShjW18rMTY+PjJdfDApKXtvY1tjWyhjW18+PjJdfDApKzQwPj4yXSYxMjddKF8pfDB9ZWxzZXtjW1c+PjJdPVorNH1XPVk7WT1hW3c+PjBdfDA7Vj1WKzR8MH1pZihMKXtYPWFbdz4+MF18MDtpZigoWCYxKT09MCl7Vz1KO1g9KFgmMjU1KT4+PjF9ZWxzZXtXPWNbaD4+Ml18MDtYPWNbSj4+Ml18MH1pZigoVnwwKSE9KFcrKFg8PDIpfDApKXtCPTI1NTticmVhayBhfX1icmVha307Y2FzZSAwOntCPTk4O2JyZWFrfTtjYXNlIDM6e1Y9YVt4Pj4wXXwwO1g9KFYmMSk9PTA7aWYoWCl7Wj0oViYyNTUpPj4+MX1lbHNle1o9Y1tIPj4yXXwwfVc9YVtyPj4wXXwwO1k9KFcmMSk9PTA7aWYoWSl7Xz0oVyYyNTUpPj4+MX1lbHNle189Y1tJPj4yXXwwfWlmKChafDApIT0oMC1ffDApKXtpZihYKXtaPShWJjI1NSk+Pj4xfWVsc2V7Wj1jW0g+PjJdfDB9aWYoKFp8MCkhPTApe2lmKFkpe1k9KFcmMjU1KT4+PjF9ZWxzZXtZPWNbST4+Ml18MH1pZigoWXwwKSE9MCl7WD1jW2I+PjJdfDA7WT1jW1grMTI+PjJdfDA7Wj1jW1grMTY+PjJdfDA7aWYoKFl8MCk9PShafDApKXtXPW9jW2NbKGNbWD4+Ml18MCkrMzY+PjJdJjEyN10oWCl8MDtaPWNbYj4+Ml18MDtWPWFbeD4+MF18MDtYPVo7WT1jW1orMTI+PjJdfDA7Wj1jW1orMTY+PjJdfDB9ZWxzZXtXPWNbWT4+Ml18MH1fPVgrMTJ8MDtaPShZfDApPT0oWnwwKTtpZigoV3wwKT09KGNbKChWJjEpPT0wP0g6Y1tDPj4yXXwwKT4+Ml18MCkpe2lmKFope29jW2NbKGNbWD4+Ml18MCkrNDA+PjJdJjEyN10oWCl8MH1lbHNle2NbXz4+Ml09WSs0fVY9YVt4Pj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0g+PjJdfDB9UD1WPj4+MD4xP3g6UDticmVhayBifWlmKFope1Y9b2NbY1soY1tYPj4yXXwwKSszNj4+Ml0mMTI3XShYKXwwfWVsc2V7Vj1jW1k+PjJdfDB9aWYoKFZ8MCkhPShjWygoYVtyPj4wXSYxKT09MD9JOmNbRD4+Ml18MCk+PjJdfDApKXtCPTE5ODticmVhayBhfVY9Y1tiPj4yXXwwO1c9VisxMnwwO1g9Y1tXPj4yXXwwO2lmKChYfDApPT0oY1tWKzE2Pj4yXXwwKSl7b2NbY1soY1tWPj4yXXwwKSs0MD4+Ml0mMTI3XShWKXwwfWVsc2V7Y1tXPj4yXT1YKzR9YVtrPj4wXT0xO1Y9YVtyPj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0k+PjJdfDB9UD1WPj4+MD4xP3I6UDticmVhayBifX1pZihYKXtYPShWJjI1NSk+Pj4xfWVsc2V7WD1jW0g+PjJdfDB9WT1jW2I+PjJdfDA7Wj1jW1krMTI+PjJdfDA7Xz0oWnwwKT09KGNbWSsxNj4+Ml18MCk7aWYoKFh8MCk9PTApe2lmKF8pe1Y9b2NbY1soY1tZPj4yXXwwKSszNj4+Ml0mMTI3XShZKXwwO1c9YVtyPj4wXXwwfWVsc2V7Vj1jW1o+PjJdfDB9aWYoKFZ8MCkhPShjWygoVyYxKT09MD9JOmNbRD4+Ml18MCk+PjJdfDApKXticmVhayBifVg9Y1tiPj4yXXwwO1c9WCsxMnwwO1Y9Y1tXPj4yXXwwO2lmKChWfDApPT0oY1tYKzE2Pj4yXXwwKSl7b2NbY1soY1tYPj4yXXwwKSs0MD4+Ml0mMTI3XShYKXwwfWVsc2V7Y1tXPj4yXT1WKzR9YVtrPj4wXT0xO1Y9YVtyPj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0k+PjJdfDB9UD1WPj4+MD4xP3I6UDticmVhayBifWlmKF8pe1c9b2NbY1soY1tZPj4yXXwwKSszNj4+Ml0mMTI3XShZKXwwO1Y9YVt4Pj4wXXwwfWVsc2V7Vz1jW1o+PjJdfDB9aWYoKFd8MCkhPShjWygoViYxKT09MD9IOmNbQz4+Ml18MCk+PjJdfDApKXthW2s+PjBdPTE7YnJlYWsgYn1YPWNbYj4+Ml18MDtXPVgrMTJ8MDtWPWNbVz4+Ml18MDtpZigoVnwwKT09KGNbWCsxNj4+Ml18MCkpe29jW2NbKGNbWD4+Ml18MCkrNDA+PjJdJjEyN10oWCl8MH1lbHNle2NbVz4+Ml09Vis0fVY9YVt4Pj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0g+PjJdfDB9UD1WPj4+MD4xP3g6UH1icmVha307Y2FzZSA0OntWPTA7d2hpbGUoMSl7WD1jW2I+PjJdfDA7ZG97aWYoKFh8MCkhPTApe1c9Y1tYKzEyPj4yXXwwO2lmKChXfDApPT0oY1tYKzE2Pj4yXXwwKSl7Vz1vY1tjWyhjW1g+PjJdfDApKzM2Pj4yXSYxMjddKFgpfDB9ZWxzZXtXPWNbVz4+Ml18MH1pZigoV3wwKT09LTEpe2NbYj4+Ml09MDtXPTE7YnJlYWt9ZWxzZXtXPShjW2I+PjJdfDApPT0wO2JyZWFrfX1lbHNle1c9MX19d2hpbGUoMCk7aWYoKGV8MCkhPTApe1g9Y1tlKzEyPj4yXXwwO2lmKChYfDApPT0oY1tlKzE2Pj4yXXwwKSl7WD1vY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDB9ZWxzZXtYPWNbWD4+Ml18MH1pZighKChYfDApPT0tMSkpe2lmKCFXKXticmVha319ZWxzZXtCPTI2OH19ZWxzZXtCPTI2OH1pZigoQnwwKT09MjY4KXtCPTA7aWYoVyl7ZT0wO2JyZWFrfWVsc2V7ZT0wfX1YPWNbYj4+Ml18MDtXPWNbWCsxMj4+Ml18MDtpZigoV3wwKT09KGNbWCsxNj4+Ml18MCkpe1c9b2NbY1soY1tYPj4yXXwwKSszNj4+Ml0mMTI3XShYKXwwfWVsc2V7Vz1jW1c+PjJdfDB9aWYoaGNbY1soY1tsPj4yXXwwKSsxMj4+Ml0mNjNdKGwsMjA0OCxXKXwwKXtYPWNbbj4+Ml18MDtpZigoWHwwKT09KG98MCkpe1k9KGNbSz4+Ml18MCkhPTIxMztaPWNbbT4+Ml18MDtvPW8tWnwwO1g9bz4+PjA8MjE0NzQ4MzY0Nz9vPDwxOi0xO289bz4+MjtpZighWSl7Wj0wfVo9d24oWixYKXwwO2lmKChafDApPT0wKXtCPTI3OTticmVhayBhfWlmKCFZKXtZPWNbbT4+Ml18MDtjW20+PjJdPVo7aWYoKFl8MCkhPTApe2xjW2NbSz4+Ml0mMjU1XShZKTtaPWNbbT4+Ml18MH19ZWxzZXtjW20+PjJdPVp9Y1tLPj4yXT0yMTQ7YWE9Wisobzw8Mil8MDtjW24+PjJdPWFhO289KGNbbT4+Ml18MCkrKFg+Pj4yPDwyKXwwO1g9YWF9Y1tuPj4yXT1YKzQ7Y1tYPj4yXT1XO1Y9VisxfDB9ZWxzZXtYPWFbdD4+MF18MDtpZigoWCYxKT09MCl7WD0oWCYyNTUpPj4+MX1lbHNle1g9Y1tPPj4yXXwwfWlmKCEoKCgoWHwwKT09MHwoVnwwKT09MCleMSkmKFd8MCk9PShHfDApKSl7YnJlYWt9aWYoKFV8MCk9PShTfDApKXtVPVUtVHwwO1M9VT4+PjA8MjE0NzQ4MzY0Nz9VPDwxOi0xO2lmKChSfDApPT0yMTMpe1Q9MH1SPXduKFQsUyl8MDtpZigoUnwwKT09MCl7Qj0yOTY7YnJlYWsgYX1UPVI7Uz1SKyhTPj4+Mjw8Mil8MDtVPVIrKFU+PjI8PDIpfDA7Uj0yMTR9Y1tVPj4yXT1WO1U9VSs0fDA7Vj0wfVc9Y1tiPj4yXXwwO1g9VysxMnwwO1k9Y1tYPj4yXXwwO2lmKChZfDApPT0oY1tXKzE2Pj4yXXwwKSl7b2NbY1soY1tXPj4yXXwwKSs0MD4+Ml0mMTI3XShXKXwwO2NvbnRpbnVlfWVsc2V7Y1tYPj4yXT1ZKzQ7Y29udGludWV9fWlmKCEoKFR8MCk9PShVfDApfChWfDApPT0wKSl7aWYoKFV8MCk9PShTfDApKXtVPVUtVHwwO1M9VT4+PjA8MjE0NzQ4MzY0Nz9VPDwxOi0xO2lmKChSfDApPT0yMTMpe1Q9MH1SPXduKFQsUyl8MDtpZigoUnwwKT09MCl7Qj0zMDg7YnJlYWsgYX1UPVI7Uz1SKyhTPj4+Mjw8Mil8MDtVPVIrKFU+PjI8PDIpfDA7Uj0yMTR9Y1tVPj4yXT1WO1U9VSs0fDB9aWYoKGZ8MCk+MCl7Vz1jW2I+PjJdfDA7ZG97aWYoKFd8MCkhPTApe1Y9Y1tXKzEyPj4yXXwwO2lmKChWfDApPT0oY1tXKzE2Pj4yXXwwKSl7Vj1vY1tjWyhjW1c+PjJdfDApKzM2Pj4yXSYxMjddKFcpfDB9ZWxzZXtWPWNbVj4+Ml18MH1pZigoVnwwKT09LTEpe2NbYj4+Ml09MDtWPTE7YnJlYWt9ZWxzZXtWPShjW2I+PjJdfDApPT0wO2JyZWFrfX1lbHNle1Y9MX19d2hpbGUoMCk7aWYoKGV8MCkhPTApe1c9Y1tlKzEyPj4yXXwwO2lmKChXfDApPT0oY1tlKzE2Pj4yXXwwKSl7Vz1vY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDB9ZWxzZXtXPWNbVz4+Ml18MH1pZighKChXfDApPT0tMSkpe2lmKCFWKXtCPTMzMTticmVhayBhfX1lbHNle0I9MzI1fX1lbHNle0I9MzI1fWlmKChCfDApPT0zMjUpe0I9MDtpZihWKXtCPTMzMTticmVhayBhfWVsc2V7ZT0wfX1XPWNbYj4+Ml18MDtWPWNbVysxMj4+Ml18MDtpZigoVnwwKT09KGNbVysxNj4+Ml18MCkpe1Y9b2NbY1soY1tXPj4yXXwwKSszNj4+Ml0mMTI3XShXKXwwfWVsc2V7Vj1jW1Y+PjJdfDB9aWYoKFZ8MCkhPShnfDApKXtCPTMzMTticmVhayBhfVY9Y1tiPj4yXXwwO1c9VisxMnwwO1g9Y1tXPj4yXXwwO2lmKChYfDApPT0oY1tWKzE2Pj4yXXwwKSl7b2NbY1soY1tWPj4yXXwwKSs0MD4+Ml0mMTI3XShWKXwwO1g9ZTtXPWV9ZWxzZXtjW1c+PjJdPVgrNDtYPWU7Vz1lfXdoaWxlKDEpe1k9Y1tiPj4yXXwwO2Rve2lmKChZfDApIT0wKXtWPWNbWSsxMj4+Ml18MDtpZigoVnwwKT09KGNbWSsxNj4+Ml18MCkpe1Y9b2NbY1soY1tZPj4yXXwwKSszNj4+Ml0mMTI3XShZKXwwfWVsc2V7Vj1jW1Y+PjJdfDB9aWYoKFZ8MCk9PS0xKXtjW2I+PjJdPTA7WT0xO2JyZWFrfWVsc2V7WT0oY1tiPj4yXXwwKT09MDticmVha319ZWxzZXtZPTF9fXdoaWxlKDApO2lmKChXfDApIT0wKXtWPWNbVysxMj4+Ml18MDtpZigoVnwwKT09KGNbVysxNj4+Ml18MCkpe1Y9b2NbY1soY1tXPj4yXXwwKSszNj4+Ml0mMTI3XShXKXwwfWVsc2V7Vj1jW1Y+PjJdfDB9aWYoISgoVnwwKT09LTEpKXtpZihZXihYfDApPT0wKXtWPVg7Vz1YfWVsc2V7Qj0zNTQ7YnJlYWsgYX19ZWxzZXtWPTA7ZT0wO0I9MzQ3fX1lbHNle1Y9WDtCPTM0N31pZigoQnwwKT09MzQ3KXtCPTA7aWYoWSl7Qj0zNTQ7YnJlYWsgYX1lbHNle1c9MH19WT1jW2I+PjJdfDA7WD1jW1krMTI+PjJdfDA7aWYoKFh8MCk9PShjW1krMTY+PjJdfDApKXtYPW9jW2NbKGNbWT4+Ml18MCkrMzY+PjJdJjEyN10oWSl8MH1lbHNle1g9Y1tYPj4yXXwwfWlmKCEoaGNbY1soY1tsPj4yXXwwKSsxMj4+Ml0mNjNdKGwsMjA0OCxYKXwwKSl7Qj0zNTQ7YnJlYWsgYX1YPWNbbj4+Ml18MDtpZigoWHwwKT09KG98MCkpe1k9KGNbSz4+Ml18MCkhPTIxMztaPWNbbT4+Ml18MDtYPW8tWnwwO289WD4+PjA8MjE0NzQ4MzY0Nz9YPDwxOi0xO1g9WD4+MjtpZighWSl7Wj0wfVo9d24oWixvKXwwO2lmKChafDApPT0wKXtCPTM1OTticmVhayBhfWRve2lmKFkpe2NbbT4+Ml09Wn1lbHNle1k9Y1ttPj4yXXwwO2NbbT4+Ml09WjtpZigoWXwwKT09MCl7YnJlYWt9bGNbY1tLPj4yXSYyNTVdKFkpO1o9Y1ttPj4yXXwwfX13aGlsZSgwKTtjW0s+PjJdPTIxNDtYPVorKFg8PDIpfDA7Y1tuPj4yXT1YO289KGNbbT4+Ml18MCkrKG8+Pj4yPDwyKXwwfVk9Y1tiPj4yXXwwO1o9Y1tZKzEyPj4yXXwwO2lmKChafDApPT0oY1tZKzE2Pj4yXXwwKSl7WT1vY1tjWyhjW1k+PjJdfDApKzM2Pj4yXSYxMjddKFkpfDA7WD1jW24+PjJdfDB9ZWxzZXtZPWNbWj4+Ml18MH1jW24+PjJdPVgrNDtjW1g+PjJdPVk7Zj1mKyAtMXwwO1g9Y1tiPj4yXXwwO1k9WCsxMnwwO1o9Y1tZPj4yXXwwO2lmKChafDApPT0oY1tYKzE2Pj4yXXwwKSl7b2NbY1soY1tYPj4yXXwwKSs0MD4+Ml0mMTI3XShYKXwwfWVsc2V7Y1tZPj4yXT1aKzR9aWYoKGZ8MCk+MCl7WD1WfWVsc2V7YnJlYWt9fX1pZigoY1tuPj4yXXwwKT09KGNbbT4+Ml18MCkpe0I9Mzc2O2JyZWFrIGF9YnJlYWt9O2RlZmF1bHQ6e319fXdoaWxlKDApO2Q6ZG97aWYoKEJ8MCk9PTk4KXtCPTA7aWYoKFF8MCk9PTMpe0I9Mzc4O2JyZWFrIGF9ZWxzZXtYPWU7Vj1lfXdoaWxlKDEpe1c9Y1tiPj4yXXwwO2Rve2lmKChXfDApIT0wKXtZPWNbVysxMj4+Ml18MDtpZigoWXwwKT09KGNbVysxNj4+Ml18MCkpe1c9b2NbY1soY1tXPj4yXXwwKSszNj4+Ml0mMTI3XShXKXwwfWVsc2V7Vz1jW1k+PjJdfDB9aWYoKFd8MCk9PS0xKXtjW2I+PjJdPTA7WT0xO2JyZWFrfWVsc2V7WT0oY1tiPj4yXXwwKT09MDticmVha319ZWxzZXtZPTF9fXdoaWxlKDApO2lmKChWfDApIT0wKXtXPWNbVisxMj4+Ml18MDtpZigoV3wwKT09KGNbVisxNj4+Ml18MCkpe1Y9b2NbY1soY1tWPj4yXXwwKSszNj4+Ml0mMTI3XShWKXwwfWVsc2V7Vj1jW1c+PjJdfDB9aWYoISgoVnwwKT09LTEpKXtpZihZXihYfDApPT0wKXtXPVg7Vj1YfWVsc2V7YnJlYWsgZH19ZWxzZXtXPTA7ZT0wO0I9MTExfX1lbHNle1c9WDtCPTExMX1pZigoQnwwKT09MTExKXtCPTA7aWYoWSl7YnJlYWsgZH1lbHNle1Y9MH19WT1jW2I+PjJdfDA7WD1jW1krMTI+PjJdfDA7aWYoKFh8MCk9PShjW1krMTY+PjJdfDApKXtYPW9jW2NbKGNbWT4+Ml18MCkrMzY+PjJdJjEyN10oWSl8MH1lbHNle1g9Y1tYPj4yXXwwfWlmKCEoaGNbY1soY1tsPj4yXXwwKSsxMj4+Ml0mNjNdKGwsODE5MixYKXwwKSl7YnJlYWsgZH1CPWNbYj4+Ml18MDtYPUIrMTJ8MDtZPWNbWD4+Ml18MDtpZigoWXwwKT09KGNbQisxNj4+Ml18MCkpe1g9b2NbY1soY1tCPj4yXXwwKSs0MD4+Ml0mMTI3XShCKXwwfWVsc2V7Y1tYPj4yXT1ZKzQ7WD1jW1k+PjJdfDB9WT1hW3M+PjBdfDA7Wj0oWSYxKSE9MDtpZihaKXtCPShjW3M+PjJdJi0yKSsgLTF8MDtZPWNbTT4+Ml18MH1lbHNle0I9MTtZPShZJjI1NSk+Pj4xfWlmKChZfDApPT0oQnwwKSl7cGcocyxCLDEsQixCLDAsMCk7aWYoKGFbcz4+MF0mMSk9PTApe0I9MTI4fWVsc2V7Qj0xMjl9fWVsc2V7aWYoWil7Qj0xMjl9ZWxzZXtCPTEyOH19aWYoKEJ8MCk9PTEyOCl7Qj0wO2Fbcz4+MF09KFk8PDEpKzI7Wj1NO189WSsxfDB9ZWxzZSBpZigoQnwwKT09MTI5KXtCPTA7Wj1jW0U+PjJdfDA7Xz1ZKzF8MDtjW00+PjJdPV99Y1taKyhZPDwyKT4+Ml09WDtjW1orKF88PDIpPj4yXT0wO1g9V319fXdoaWxlKDApO1E9USsxfDA7aWYoIShRPj4+MDw0KSl7Qj0zNzg7YnJlYWt9fWU6c3dpdGNoKEJ8MCl7Y2FzZSA5Nzp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDE5ODp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDI1NTp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDI3OTp7YWE9WGEoNCl8MDtjW2FhPj4yXT0yMjY4MDt3YihhYXwwLDIyNzI4LDIwNil9O2Nhc2UgMjk2OnthYT1YYSg0KXwwO2NbYWE+PjJdPTIyNjgwO3diKGFhfDAsMjI3MjgsMjA2KX07Y2FzZSAzMDg6e2FhPVhhKDQpfDA7Y1thYT4+Ml09MjI2ODA7d2IoYWF8MCwyMjcyOCwyMDYpfTtjYXNlIDMzMTp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDM1NDp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDM1OTp7YWE9WGEoNCl8MDtjW2FhPj4yXT0yMjY4MDt3YihhYXwwLDIyNzI4LDIwNil9O2Nhc2UgMzc2OntjW2o+PjJdPWNbaj4+Ml18NDtiPTA7YnJlYWt9O2Nhc2UgMzc4OntmOmRve2lmKChQfDApIT0wKXtsPVArNHwwO0Y9UCs4fDA7az0xO3doaWxlKDEpe209YVtQPj4wXXwwO2lmKChtJjEpPT0wKXttPShtJjI1NSk+Pj4xfWVsc2V7bT1jW2w+PjJdfDB9aWYoIShrPj4+MDxtPj4+MCkpe2JyZWFrIGZ9bj1jW2I+PjJdfDA7ZG97aWYoKG58MCkhPTApe209Y1tuKzEyPj4yXXwwO2lmKChtfDApPT0oY1tuKzE2Pj4yXXwwKSl7bT1vY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDB9ZWxzZXttPWNbbT4+Ml18MH1pZigobXwwKT09LTEpe2NbYj4+Ml09MDttPTE7YnJlYWt9ZWxzZXttPShjW2I+PjJdfDApPT0wO2JyZWFrfX1lbHNle209MX19d2hpbGUoMCk7aWYoKGV8MCkhPTApe249Y1tlKzEyPj4yXXwwO2lmKChufDApPT0oY1tlKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDB9ZWxzZXtuPWNbbj4+Ml18MH1pZighKChufDApPT0tMSkpe2lmKCFtKXticmVha319ZWxzZXtCPTM5Nn19ZWxzZXtCPTM5Nn1pZigoQnwwKT09Mzk2KXtCPTA7aWYobSl7YnJlYWt9ZWxzZXtlPTB9fW09Y1tiPj4yXXwwO249Y1ttKzEyPj4yXXwwO2lmKChufDApPT0oY1ttKzE2Pj4yXXwwKSl7bT1vY1tjWyhjW20+PjJdfDApKzM2Pj4yXSYxMjddKG0pfDB9ZWxzZXttPWNbbj4+Ml18MH1pZigoYVtQPj4wXSYxKT09MCl7bj1sfWVsc2V7bj1jW0Y+PjJdfDB9aWYoKG18MCkhPShjW24rKGs8PDIpPj4yXXwwKSl7YnJlYWt9az1rKzF8MDtnPWNbYj4+Ml18MDtuPWcrMTJ8MDttPWNbbj4+Ml18MDtpZigobXwwKT09KGNbZysxNj4+Ml18MCkpe29jW2NbKGNbZz4+Ml18MCkrNDA+PjJdJjEyN10oZyl8MDtjb250aW51ZX1lbHNle2Nbbj4+Ml09bSs0O2NvbnRpbnVlfX1jW2o+PjJdPWNbaj4+Ml18NDtiPTA7YnJlYWsgZX19d2hpbGUoMCk7aWYoKFR8MCkhPShVfDApKXtjW0E+PjJdPTA7cWsodCxULFUsQSk7aWYoKGNbQT4+Ml18MCk9PTApe2I9MX1lbHNle2Nbaj4+Ml09Y1tqPj4yXXw0O2I9MH19ZWxzZXtiPTE7VD1VfWJyZWFrfX1pZighKChhW3M+PjBdJjEpPT0wKT8oej1jW0U+PjJdfDAsKHp8MCkhPTApOjApe3ZuKHopfWlmKCEoKGFbcj4+MF0mMSk9PTApPyh5PWNbRD4+Ml18MCwoeXwwKSE9MCk6MCl7dm4oeSl9aWYoISgoYVt4Pj4wXSYxKT09MCk/KHU9Y1tDPj4yXXwwLCh1fDApIT0wKTowKXt2bih1KX1pZighKChhW3c+PjBdJjEpPT0wKT8ocT1jW2g+PjJdfDAsKHF8MCkhPTApOjApe3ZuKHEpfWlmKCEoKGFbdD4+MF0mMSk9PTApPyhwPWNbdCs4Pj4yXXwwLChwfDApIT0wKTowKXt2bihwKX1pZigoVHwwKT09MCl7aT12O3JldHVybiBifDB9bGNbUiYyNTVdKFQpO2k9djtyZXR1cm4gYnwwfWZ1bmN0aW9uIHZrKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTA7bT1pO2k9aSs0MzJ8MDtwPW07cz1tKzI0fDA7ZD1tKzE2fDA7cT1tKzEyfDA7dD1tKzQyNHwwO2NbZD4+Ml09cztsPWQrNHwwO2NbbD4+Ml09MjEzO3M9cys0MDB8MDtuPWNbaCsyOD4+Ml18MDt2PW4rNHwwO2Nbdj4+Ml09KGNbdj4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbcD4+Ml09MTM0NDg7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzQ0OCxwKX1wPShjWzEzNDUyPj4yXXwwKSsgLTF8MDt1PWNbbis4Pj4yXXwwO2lmKChjW24rMTI+PjJdfDApLXU+PjI+Pj4wPnA+Pj4wPyhyPWNbdSsocDw8Mik+PjJdfDAsKHJ8MCkhPTApOjApe2FbdD4+MF09MDtwPWNbZj4+Ml18MDtkb3tpZih1ayhlLHAsZyxuLGNbaCs0Pj4yXXwwLGosdCxyLGQscSxzKXwwKXtpZigoYVtrPj4wXSYxKT09MCl7Y1trKzQ+PjJdPTA7YVtrPj4wXT0wfWVsc2V7Y1tjW2srOD4+Ml0+PjJdPTA7Y1trKzQ+PjJdPTB9aWYoKGFbdD4+MF18MCkhPTApe2c9eGNbY1soY1tyPj4yXXwwKSs0ND4+Ml0mNjNdKHIsNDUpfDA7aD1hW2s+PjBdfDA7bz0oaCYxKSE9MDtpZihvKXtzPShjW2s+PjJdJi0yKSsgLTF8MDtoPWNbays0Pj4yXXwwfWVsc2V7cz0xO2g9KGgmMjU1KT4+PjF9aWYoKGh8MCk9PShzfDApKXtwZyhrLHMsMSxzLHMsMCwwKTtpZigoYVtrPj4wXSYxKT09MCl7bz0yMX1lbHNle289MjJ9fWVsc2V7aWYobyl7bz0yMn1lbHNle289MjF9fWlmKChvfDApPT0yMSl7YVtrPj4wXT0oaDw8MSkrMjt0PWsrNHwwO3M9aCsxfDB9ZWxzZSBpZigob3wwKT09MjIpe3Q9Y1trKzg+PjJdfDA7cz1oKzF8MDtjW2srND4+Ml09c31jW3QrKGg8PDIpPj4yXT1nO2NbdCsoczw8Mik+PjJdPTB9cj14Y1tjWyhjW3I+PjJdfDApKzQ0Pj4yXSY2M10ociw0OCl8MDtzPWNbZD4+Ml18MDtxPWNbcT4+Ml18MDtoPXErIC00fDA7YTpkb3tpZihzPj4+MDxoPj4+MCl7d2hpbGUoMSl7Zz1zKzR8MDtpZigoY1tzPj4yXXwwKSE9KHJ8MCkpe2JyZWFrIGF9aWYoZz4+PjA8aD4+PjApe3M9Z31lbHNle3M9ZzticmVha319fX13aGlsZSgwKTt0PXM7cj1hW2s+PjBdfDA7aWYoKHImMSk9PTApe3Y9cjt1PTE7Zz0ociYyNTUpPj4+MX1lbHNle3U9Y1trPj4yXXwwO3Y9dSYyNTU7dT0odSYtMikrIC0xfDA7Zz1jW2srND4+Ml18MH1yPXEtdD4+MjtpZigocnwwKSE9MCl7aWYoKHUtZ3wwKT4+PjA8cj4+PjApe3BnKGssdSxnK3ItdXwwLGcsZywwLDApO3Y9YVtrPj4wXXwwfWlmKCh2JjEpPT0wKXt1PWsrNHwwfWVsc2V7dT1jW2srOD4+Ml18MH12PXUrKGc8PDIpfDA7aWYoKHN8MCkhPShxfDApKXtoPWcrKChoKygwLXQpfDApPj4+MikrMXwwO3doaWxlKDEpe2Nbdj4+Ml09Y1tzPj4yXTtzPXMrNHwwO2lmKChzfDApPT0ocXwwKSl7YnJlYWt9dj12KzR8MH12PXUrKGg8PDIpfDB9Y1t2Pj4yXT0wO3E9ZytyfDA7aWYoKGFbaz4+MF0mMSk9PTApe2Fbaz4+MF09cTw8MTticmVha31lbHNle2Nbays0Pj4yXT1xO2JyZWFrfX19fXdoaWxlKDApO2s9Y1tlPj4yXXwwO2lmKChrfDApIT0wKXtxPWNbaysxMj4+Ml18MDtpZigocXwwKT09KGNbaysxNj4+Ml18MCkpe3E9b2NbY1soY1trPj4yXXwwKSszNj4+Ml0mMTI3XShrKXwwfWVsc2V7cT1jW3E+PjJdfDB9aWYoKHF8MCk9PS0xKXtjW2U+PjJdPTA7az0wO2U9MX1lbHNle2U9MH19ZWxzZXtrPTA7ZT0xfWRve2lmKChwfDApIT0wKXtxPWNbcCsxMj4+Ml18MDtpZigocXwwKT09KGNbcCsxNj4+Ml18MCkpe3A9b2NbY1soY1twPj4yXXwwKSszNj4+Ml0mMTI3XShwKXwwfWVsc2V7cD1jW3E+PjJdfDB9aWYoISgocHwwKT09LTEpKXtpZihlKXticmVha31lbHNle289NjA7YnJlYWt9fWVsc2V7Y1tmPj4yXT0wO289NTg7YnJlYWt9fWVsc2V7bz01OH19d2hpbGUoMCk7aWYoKG98MCk9PTU4P2U6MCl7bz02MH1pZigob3wwKT09NjApe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09azt1PW4rNHwwO3Y9Y1t1Pj4yXXwwO2NbdT4+Ml09disgLTE7aWYoKHZ8MCk9PTApe2xjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKX1qPWNbZD4+Ml18MDtjW2Q+PjJdPTA7aWYoKGp8MCk9PTApe2k9bTtyZXR1cm59bGNbY1tsPj4yXSYyNTVdKGopO2k9bTtyZXR1cm59dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gd2soYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geGsoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIHlrKGIsZCxlLGYsZyxqLGwpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9anwwO2w9K2w7dmFyIG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MDtxPWk7aT1pKzM2OHwwO0E9cTtDPXErMTU2fDA7RT1xKzEzMnwwO0I9cSsyNTZ8MDt0PXErMTQ4fDA7cz1xKzM1NnwwO3I9cSszNTd8MDt4PXErMTM2fDA7ZD1xKzEwNHwwO3c9cSsxMTZ8MDtGPXErMTAwfDA7dj1xKzEyOHwwO3U9cSsxNTJ8MDtjW0U+PjJdPUM7aFtrPj4zXT1sO2NbQT4+Ml09Y1trPj4yXTtjW0ErND4+Ml09Y1trKzQ+PjJdO0M9bGIoQ3wwLDEwMCwxMzIyNCxBfDApfDA7aWYoQz4+PjA+OTkpe2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1DPWNbMzM0MF18MDtoW2s+PjNdPWw7Y1tBPj4yXT1jW2s+PjJdO2NbQSs0Pj4yXT1jW2srND4+Ml07Qz1DaShFLEMsMTMyMjQsQSl8MDt6PWNbRT4+Ml18MDtpZigoenwwKT09MCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9Qj11bihDKXwwO2lmKChCfDApPT0wKXtIPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX1lbHNle3k9Qn19ZWxzZXt5PTA7ej0wfUQ9Y1tnKzI4Pj4yXXwwO0g9RCs0fDA7Y1tIPj4yXT0oY1tIPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tBPj4yXT0xMzQ1NjtjW0ErND4+Ml09MjA4O2NbQSs4Pj4yXT0wO2NnKDEzNDU2LEEpfUc9KGNbMTM0NjA+PjJdfDApKyAtMXwwO0g9Y1tEKzg+PjJdfDA7aWYoKGNbRCsxMj4+Ml18MCktSD4+Mj4+PjA+Rz4+PjA/KHA9Y1tIKyhHPDwyKT4+Ml18MCwocHwwKSE9MCk6MCl7SD1jW0U+PjJdfDA7dWNbY1soY1twPj4yXXwwKSszMj4+Ml0mMzFdKHAsSCxIK0N8MCxCKXwwO2lmKChDfDApPT0wKXtFPTB9ZWxzZXtFPShhW2NbRT4+Ml0+PjBdfDApPT00NX1jW3Q+PjJdPTA7Y1t4KzA+PjJdPTA7Y1t4KzQ+PjJdPTA7Y1t4Kzg+PjJdPTA7Y1tkKzA+PjJdPTA7Y1tkKzQ+PjJdPTA7Y1tkKzg+PjJdPTA7Y1t3KzA+PjJdPTA7Y1t3KzQ+PjJdPTA7Y1t3Kzg+PjJdPTA7emsoZixFLEQsdCxzLHIseCxkLHcsRik7Zj1jW0Y+PjJdfDA7aWYoKEN8MCk+KGZ8MCkpe0Y9YVt3Pj4wXXwwO2lmKChGJjEpPT0wKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW3crND4+Ml18MH1HPWFbZD4+MF18MDtpZigoRyYxKT09MCl7Rz0oRyYyNTUpPj4+MX1lbHNle0c9Y1tkKzQ+PjJdfDB9Rj1GKyhDLWY8PDF8MSkrR3wwfWVsc2V7Rj1hW3c+PjBdfDA7aWYoKEYmMSk9PTApe0Y9KEYmMjU1KT4+PjF9ZWxzZXtGPWNbdys0Pj4yXXwwfUc9YVtkPj4wXXwwO2lmKChHJjEpPT0wKXtHPShHJjI1NSk+Pj4xfWVsc2V7Rz1jW2QrND4+Ml18MH1GPUYrMitHfDB9Rj1GK2Z8MDtpZihGPj4+MD4xMDApe0E9dW4oRil8MDtpZigoQXwwKT09MCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9ZWxzZXtGPUF9fWVsc2V7Rj0wfUFrKEEsdix1LGNbZys0Pj4yXXwwLEIsQitDfDAscCxFLHQsYVtzPj4wXXwwLGFbcj4+MF18MCx4LGQsdyxmKTtXYyhiLGNbZT4+Ml18MCxBLGNbdj4+Ml18MCxjW3U+PjJdfDAsZyxqKTtpZigoRnwwKSE9MCl7dm4oRil9aWYoISgoYVt3Pj4wXSYxKT09MCk/KG49Y1t3Kzg+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKCEoKGFbZD4+MF0mMSk9PTApPyhvPWNbZCs4Pj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhW3g+PjBdJjEpPT0wKT8obT1jW3grOD4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9Rz1EKzR8MDtIPWNbRz4+Ml18MDtjW0c+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW0Q+PjJdfDApKzg+PjJdJjI1NV0oRCl9aWYoKHl8MCkhPTApe3ZuKHkpfWlmKCh6fDApPT0wKXtpPXE7cmV0dXJufXZuKHopO2k9cTtyZXR1cm59SD1YYSg0KXwwO2NbSD4+Ml09MjEzMDQ7d2IoSHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gemsoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTA7bj1pO2k9aSsxMjh8MDtBPW47eD1uKzEyfDA7bz1uKzQwfDA7dj1uKzUyfDA7dz1uKzU2fDA7dT1uKzE2fDA7ej1uKzI4fDA7cj1uKzY4fDA7cT1uKzcyfDA7dD1uKzg0fDA7cz1uKzg4fDA7cD1uKzEwMHwwO3k9bisxMTJ8MDtpZihiKXtpZighKChjWzMyMjhdfDApPT0tMSkpe2NbQT4+Ml09MTI5MTI7Y1tBKzQ+PjJdPTIwODtjW0ErOD4+Ml09MDtjZygxMjkxMixBKX1xPShjWzEyOTE2Pj4yXXwwKSsgLTF8MDtwPWNbZSs4Pj4yXXwwO2lmKCEoKGNbZSsxMj4+Ml18MCktcD4+Mj4+PjA+cT4+PjApKXtiPVhhKDQpfDA7Y1tiPj4yXT0yMTMwNDt3YihifDAsMjEzNzYsMTk2KX1wPWNbcCsocTw8Mik+PjJdfDA7aWYoKHB8MCk9PTApe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfXE9Y1twPj4yXXwwO2lmKGQpe21jW2NbcSs0ND4+Ml0mMTI3XSh4LHApO2I9Y1t4Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbcD4+Ml18MCkrMzI+PjJdJjEyN10obyxwKTtpZigoYVtsPj4wXSYxKT09MCl7YVtsKzE+PjBdPTA7YVtsPj4wXT0wfWVsc2V7YVtjW2wrOD4+Ml0+PjBdPTA7Y1tsKzQ+PjJdPTB9aWcobCk7Y1tsKzA+PjJdPWNbbyswPj4yXTtjW2wrND4+Ml09Y1tvKzQ+PjJdO2NbbCs4Pj4yXT1jW28rOD4+Ml07Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTB9ZWxzZXttY1tjW3ErNDA+PjJdJjEyN10odixwKTtiPWNbdj4+Ml18MDthW2Y+PjBdPWI7YVtmKzE+PjBdPWI+Pjg7YVtmKzI+PjBdPWI+PjE2O2FbZiszPj4wXT1iPj4yNDttY1tjWyhjW3A+PjJdfDApKzI4Pj4yXSYxMjddKHcscCk7aWYoKGFbbD4+MF0mMSk9PTApe2FbbCsxPj4wXT0wO2FbbD4+MF09MH1lbHNle2FbY1tsKzg+PjJdPj4wXT0wO2NbbCs0Pj4yXT0wfWlnKGwpO2NbbCswPj4yXT1jW3crMD4+Ml07Y1tsKzQ+PjJdPWNbdys0Pj4yXTtjW2wrOD4+Ml09Y1t3Kzg+PjJdO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wfWFbZz4+MF09b2NbY1soY1twPj4yXXwwKSsxMj4+Ml0mMTI3XShwKXwwO2FbaD4+MF09b2NbY1soY1twPj4yXXwwKSsxNj4+Ml0mMTI3XShwKXwwO21jW2NbKGNbcD4+Ml18MCkrMjA+PjJdJjEyN10odSxwKTtpZigoYVtqPj4wXSYxKT09MCl7YVtqKzE+PjBdPTA7YVtqPj4wXT0wfWVsc2V7YVtjW2orOD4+Ml0+PjBdPTA7Y1tqKzQ+PjJdPTB9aWcoaik7Y1tqKzA+PjJdPWNbdSswPj4yXTtjW2orND4+Ml09Y1t1KzQ+PjJdO2Nbais4Pj4yXT1jW3UrOD4+Ml07Y1t1KzA+PjJdPTA7Y1t1KzQ+PjJdPTA7Y1t1Kzg+PjJdPTA7bWNbY1soY1twPj4yXXwwKSsyND4+Ml0mMTI3XSh6LHApO2lmKChhW2s+PjBdJjEpPT0wKXthW2srMT4+MF09MDthW2s+PjBdPTB9ZWxzZXthW2Nbays4Pj4yXT4+MF09MDtjW2srND4+Ml09MH1pZyhrKTtjW2srMD4+Ml09Y1t6KzA+PjJdO2Nbays0Pj4yXT1jW3orND4+Ml07Y1trKzg+PjJdPWNbeis4Pj4yXTtjW3orMD4+Ml09MDtjW3orND4+Ml09MDtjW3orOD4+Ml09MDtiPW9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MDtjW20+PjJdPWI7aT1uO3JldHVybn1lbHNle2lmKCEoKGNbMzIxMl18MCk9PS0xKSl7Y1tBPj4yXT0xMjg0ODtjW0ErND4+Ml09MjA4O2NbQSs4Pj4yXT0wO2NnKDEyODQ4LEEpfXU9KGNbMTI4NTI+PjJdfDApKyAtMXwwO289Y1tlKzg+PjJdfDA7aWYoISgoY1tlKzEyPj4yXXwwKS1vPj4yPj4+MD51Pj4+MCkpe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfW89Y1tvKyh1PDwyKT4+Ml18MDtpZigob3wwKT09MCl7Yj1YYSg0KXwwO2NbYj4+Ml09MjEzMDQ7d2IoYnwwLDIxMzc2LDE5Nil9ZT1jW28+PjJdfDA7aWYoZCl7bWNbY1tlKzQ0Pj4yXSYxMjddKHIsbyk7Yj1jW3I+PjJdfDA7YVtmPj4wXT1iO2FbZisxPj4wXT1iPj44O2FbZisyPj4wXT1iPj4xNjthW2YrMz4+MF09Yj4+MjQ7bWNbY1soY1tvPj4yXXwwKSszMj4+Ml0mMTI3XShxLG8pO2lmKChhW2w+PjBdJjEpPT0wKXthW2wrMT4+MF09MDthW2w+PjBdPTB9ZWxzZXthW2NbbCs4Pj4yXT4+MF09MDtjW2wrND4+Ml09MH1pZyhsKTtjW2wrMD4+Ml09Y1txKzA+PjJdO2NbbCs0Pj4yXT1jW3ErND4+Ml07Y1tsKzg+PjJdPWNbcSs4Pj4yXTtjW3ErMD4+Ml09MDtjW3ErND4+Ml09MDtjW3ErOD4+Ml09MH1lbHNle21jW2NbZSs0MD4+Ml0mMTI3XSh0LG8pO2I9Y1t0Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbbz4+Ml18MCkrMjg+PjJdJjEyN10ocyxvKTtpZigoYVtsPj4wXSYxKT09MCl7YVtsKzE+PjBdPTA7YVtsPj4wXT0wfWVsc2V7YVtjW2wrOD4+Ml0+PjBdPTA7Y1tsKzQ+PjJdPTB9aWcobCk7Y1tsKzA+PjJdPWNbcyswPj4yXTtjW2wrND4+Ml09Y1tzKzQ+PjJdO2NbbCs4Pj4yXT1jW3MrOD4+Ml07Y1tzKzA+PjJdPTA7Y1tzKzQ+PjJdPTA7Y1tzKzg+PjJdPTB9YVtnPj4wXT1vY1tjWyhjW28+PjJdfDApKzEyPj4yXSYxMjddKG8pfDA7YVtoPj4wXT1vY1tjWyhjW28+PjJdfDApKzE2Pj4yXSYxMjddKG8pfDA7bWNbY1soY1tvPj4yXXwwKSsyMD4+Ml0mMTI3XShwLG8pO2lmKChhW2o+PjBdJjEpPT0wKXthW2orMT4+MF09MDthW2o+PjBdPTB9ZWxzZXthW2Nbais4Pj4yXT4+MF09MDtjW2orND4+Ml09MH1pZyhqKTtjW2orMD4+Ml09Y1twKzA+PjJdO2Nbais0Pj4yXT1jW3ArND4+Ml07Y1tqKzg+PjJdPWNbcCs4Pj4yXTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDttY1tjWyhjW28+PjJdfDApKzI0Pj4yXSYxMjddKHksbyk7aWYoKGFbaz4+MF0mMSk9PTApe2FbaysxPj4wXT0wO2Fbaz4+MF09MH1lbHNle2FbY1trKzg+PjJdPj4wXT0wO2Nbays0Pj4yXT0wfWlnKGspO2NbayswPj4yXT1jW3krMD4+Ml07Y1trKzQ+PjJdPWNbeSs0Pj4yXTtjW2srOD4+Ml09Y1t5Kzg+PjJdO2NbeSswPj4yXT0wO2NbeSs0Pj4yXT0wO2NbeSs4Pj4yXT0wO2I9b2NbY1soY1tvPj4yXXwwKSszNj4+Ml0mMTI3XShvKXwwO2NbbT4+Ml09YjtpPW47cmV0dXJufX1mdW5jdGlvbiBBayhkLGUsZixnLGgsaixrLGwsbSxuLG8scCxxLHIscyl7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7bz1vfDA7cD1wfDA7cT1xfDA7cj1yfDA7cz1zfDA7dmFyIHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MDt0PWk7Y1tmPj4yXT1kO3Y9cisxfDA7dz1yKzh8MDt1PXIrNHwwO3g9KGcmNTEyfDApPT0wO0Q9cSsxfDA7SD1xKzh8MDtJPXErNHwwO0E9KHN8MCk+MDtCPXArMXwwO0U9cCs4fDA7eT1wKzR8MDtDPWsrOHwwO3o9MC1zfDA7Sj0wO2Rve3N3aXRjaChhW20rSj4+MF18MCl7Y2FzZSAwOntjW2U+PjJdPWNbZj4+Ml07YnJlYWt9O2Nhc2UgNDp7Sz1jW2Y+PjJdfDA7aD1sP2grMXwwOmg7YTpkb3tpZihoPj4+MDxqPj4+MCl7TD1oO3doaWxlKDEpe049YVtMPj4wXXwwO2lmKCEoTjw8MjQ+PjI0Pi0xKSl7YnJlYWsgYX1NPUwrMXwwO2lmKChiWyhjW0M+PjJdfDApKyhOPDwyND4+MjQ8PDEpPj4xXSYyMDQ4KT09MCl7YnJlYWsgYX1pZihNPj4+MDxqPj4+MCl7TD1NfWVsc2V7TD1NO2JyZWFrfX19ZWxzZXtMPWh9fXdoaWxlKDApO009TDtpZihBKXtpZihMPj4+MD5oPj4+MCl7Tj1oKygwLU0pfDA7Tj1OPj4+MDx6Pj4+MD96Ok47TT1OK3N8MDtRPUs7UD1MO089czt3aGlsZSgxKXtQPVArIC0xfDA7Uj1hW1A+PjBdfDA7Y1tmPj4yXT1RKzE7YVtRPj4wXT1SO089TysgLTF8MDtRPShPfDApPjA7aWYoIShQPj4+MD5oPj4+MCZRKSl7YnJlYWt9UT1jW2Y+PjJdfDB9TD1MK058MDtpZihRKXtHPTMyfWVsc2V7Tj0wfX1lbHNle009cztHPTMyfWlmKChHfDApPT0zMil7Rz0wO049eGNbY1soY1trPj4yXXwwKSsyOD4+Ml0mNjNdKGssNDgpfDB9Tz1jW2Y+PjJdfDA7Y1tmPj4yXT1PKzE7aWYoKE18MCk+MCl7ZG97YVtPPj4wXT1OO009TSsgLTF8MDtPPWNbZj4+Ml18MDtjW2Y+PjJdPU8rMX13aGlsZSgoTXwwKT4wKX1hW08+PjBdPW59aWYoKEx8MCk9PShofDApKXtRPXhjW2NbKGNbaz4+Ml18MCkrMjg+PjJdJjYzXShrLDQ4KXwwO1I9Y1tmPj4yXXwwO2NbZj4+Ml09UisxO2FbUj4+MF09UX1lbHNle049YVtwPj4wXXwwO009KE4mMSk9PTA7aWYoTSl7Tj0oTiYyNTUpPj4+MX1lbHNle049Y1t5Pj4yXXwwfWlmKChOfDApPT0wKXtNPS0xO049MDtPPTB9ZWxzZXtpZihNKXtNPUJ9ZWxzZXtNPWNbRT4+Ml18MH1NPWFbTT4+MF18MDtOPTA7Tz0wfXdoaWxlKDEpe2lmKChPfDApPT0oTXwwKSl7UD1jW2Y+PjJdfDA7Y1tmPj4yXT1QKzE7YVtQPj4wXT1vO049TisxfDA7UD1hW3A+PjBdfDA7Tz0oUCYxKT09MDtpZihPKXtQPShQJjI1NSk+Pj4xfWVsc2V7UD1jW3k+PjJdfDB9aWYoTj4+PjA8UD4+PjApe2lmKE8pe009Qn1lbHNle009Y1tFPj4yXXwwfWlmKChhW00rTj4+MF18MCk9PTEyNyl7TT0tMTtPPTB9ZWxzZXtpZihPKXtNPUJ9ZWxzZXtNPWNbRT4+Ml18MH1NPWFbTStOPj4wXXwwO089MH19ZWxzZXtPPTB9fUw9TCsgLTF8MDtRPWFbTD4+MF18MDtSPWNbZj4+Ml18MDtjW2Y+PjJdPVIrMTthW1I+PjBdPVE7aWYoKEx8MCk9PShofDApKXticmVha31lbHNle089TysxfDB9fX1MPWNbZj4+Ml18MDtpZigoS3wwKSE9KEx8MCk/KEY9TCsgLTF8MCxGPj4+MD5LPj4+MCk6MCl7TD1GO2Rve1I9YVtLPj4wXXwwO2FbSz4+MF09YVtMPj4wXXwwO2FbTD4+MF09UjtLPUsrMXwwO0w9TCsgLTF8MH13aGlsZShLPj4+MDxMPj4+MCl9YnJlYWt9O2Nhc2UgMjp7TD1hW3E+PjBdfDA7TT0oTCYxKT09MDtpZihNKXtLPShMJjI1NSk+Pj4xfWVsc2V7Sz1jW0k+PjJdfDB9aWYoISgoS3wwKT09MHx4KSl7aWYoTSl7Sz1EO0w9KEwmMjU1KT4+PjF9ZWxzZXtLPWNbSD4+Ml18MDtMPWNbST4+Ml18MH1MPUsrTHwwO009Y1tmPj4yXXwwO2lmKChLfDApIT0oTHwwKSl7ZG97YVtNPj4wXT1hW0s+PjBdfDA7Sz1LKzF8MDtNPU0rMXwwfXdoaWxlKChLfDApIT0oTHwwKSl9Y1tmPj4yXT1NfWJyZWFrfTtjYXNlIDM6e0w9YVtyPj4wXXwwO0s9KEwmMSk9PTA7aWYoSyl7TD0oTCYyNTUpPj4+MX1lbHNle0w9Y1t1Pj4yXXwwfWlmKChMfDApIT0wKXtpZihLKXtLPXZ9ZWxzZXtLPWNbdz4+Ml18MH1RPWFbSz4+MF18MDtSPWNbZj4+Ml18MDtjW2Y+PjJdPVIrMTthW1I+PjBdPVF9YnJlYWt9O2Nhc2UgMTp7Y1tlPj4yXT1jW2Y+PjJdO1E9eGNbY1soY1trPj4yXXwwKSsyOD4+Ml0mNjNdKGssMzIpfDA7Uj1jW2Y+PjJdfDA7Y1tmPj4yXT1SKzE7YVtSPj4wXT1RO2JyZWFrfTtkZWZhdWx0Ont9fUo9SisxfDB9d2hpbGUoKEp8MCkhPTQpO2s9YVtyPj4wXXwwO3g9KGsmMSk9PTA7aWYoeCl7cj0oayYyNTUpPj4+MX1lbHNle3I9Y1t1Pj4yXXwwfWlmKHI+Pj4wPjEpe2lmKHgpe3U9KGsmMjU1KT4+PjF9ZWxzZXt2PWNbdz4+Ml18MDt1PWNbdT4+Ml18MH13PXYrMXwwO3U9dit1fDA7dj1jW2Y+PjJdfDA7aWYoKHd8MCkhPSh1fDApKXtkb3thW3Y+PjBdPWFbdz4+MF18MDt3PXcrMXwwO3Y9disxfDB9d2hpbGUoKHd8MCkhPSh1fDApKX1jW2Y+PjJdPXZ9Zz1nJjE3NjtpZigoZ3wwKT09MTYpe2k9dDtyZXR1cm59ZWxzZSBpZigoZ3wwKT09MzIpe2NbZT4+Ml09Y1tmPj4yXTtpPXQ7cmV0dXJufWVsc2V7Y1tlPj4yXT1kO2k9dDtyZXR1cm59fWZ1bmN0aW9uIEJrKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wO3A9aTtpPWkrMTYwfDA7eD1wO3Q9cCsxNDB8MDtzPXArMTUyfDA7cj1wKzE1M3wwO3E9cCsxMTJ8MDt2PXArMTAwfDA7ZD1wKzEyOHwwO3o9cCsxMjR8MDt3PXArMTQ0fDA7dT1wKzE0OHwwO289Y1tnKzI4Pj4yXXwwO0Q9bys0fDA7Y1tEPj4yXT0oY1tEPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1t4Pj4yXT0xMzQ1NjtjW3grND4+Ml09MjA4O2NbeCs4Pj4yXT0wO2NnKDEzNDU2LHgpfXk9KGNbMTM0NjA+PjJdfDApKyAtMXwwO0E9Y1tvKzg+PjJdfDA7aWYoKGNbbysxMj4+Ml18MCktQT4+Mj4+PjA+eT4+PjA/KGw9Y1tBKyh5PDwyKT4+Ml18MCwobHwwKSE9MCk6MCl7QT1hW2o+PjBdfDA7eT0oQSYxKT09MDtpZih5KXtBPShBJjI1NSk+Pj4xfWVsc2V7QT1jW2orND4+Ml18MH1pZigoQXwwKT09MCl7eT0wfWVsc2V7aWYoeSl7eT1qKzF8MH1lbHNle3k9Y1tqKzg+PjJdfDB9eT1hW3k+PjBdfDA7eT15PDwyND4+MjQ9PSh4Y1tjWyhjW2w+PjJdfDApKzI4Pj4yXSY2M10obCw0NSl8MCk8PDI0Pj4yNH1jW3Q+PjJdPTA7Y1txKzA+PjJdPTA7Y1txKzQ+PjJdPTA7Y1txKzg+PjJdPTA7Y1t2KzA+PjJdPTA7Y1t2KzQ+PjJdPTA7Y1t2Kzg+PjJdPTA7Y1tkKzA+PjJdPTA7Y1tkKzQ+PjJdPTA7Y1tkKzg+PjJdPTA7emsoZix5LG8sdCxzLHIscSx2LGQseik7Zj1hW2o+PjBdfDA7QT0oZiYxKT09MDtpZihBKXtCPShmJjI1NSk+Pj4xfWVsc2V7Qj1jW2orND4+Ml18MH16PWNbej4+Ml18MDtpZigoQnwwKT4oenwwKSl7aWYoQSl7Qj0oZiYyNTUpPj4+MX1lbHNle0I9Y1tqKzQ+PjJdfDB9Qz1hW2Q+PjBdfDA7aWYoKEMmMSk9PTApe0M9KEMmMjU1KT4+PjF9ZWxzZXtDPWNbZCs0Pj4yXXwwfUQ9YVt2Pj4wXXwwO2lmKChEJjEpPT0wKXtEPShEJjI1NSk+Pj4xfWVsc2V7RD1jW3YrND4+Ml18MH1CPUMrKEItejw8MXwxKStEfDB9ZWxzZXtCPWFbZD4+MF18MDtpZigoQiYxKT09MCl7Qj0oQiYyNTUpPj4+MX1lbHNle0I9Y1tkKzQ+PjJdfDB9Qz1hW3Y+PjBdfDA7aWYoKEMmMSk9PTApe0M9KEMmMjU1KT4+PjF9ZWxzZXtDPWNbdis0Pj4yXXwwfUI9QisyK0N8MH1CPUIrenwwO2lmKEI+Pj4wPjEwMCl7eD11bihCKXwwO2lmKCh4fDApPT0wKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1lbHNle0I9eH19ZWxzZXtCPTB9aWYoQSl7QT1qKzF8MDtqPShmJjI1NSk+Pj4xfWVsc2V7QT1jW2orOD4+Ml18MDtqPWNbais0Pj4yXXwwfUFrKHgsdyx1LGNbZys0Pj4yXXwwLEEsQStqfDAsbCx5LHQsYVtzPj4wXXwwLGFbcj4+MF18MCxxLHYsZCx6KTtXYyhiLGNbZT4+Ml18MCx4LGNbdz4+Ml18MCxjW3U+PjJdfDAsZyxoKTtpZigoQnwwKSE9MCl7dm4oQil9aWYoISgoYVtkPj4wXSYxKT09MCk/KG09Y1tkKzg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbdj4+MF0mMSk9PTApPyhuPWNbdis4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhW3E+PjBdJjEpPT0wKT8oaz1jW3ErOD4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9Qz1vKzR8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXtpPXA7cmV0dXJufWxjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKTtpPXA7cmV0dXJufUQ9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIENrKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIERrKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBFayhiLGQsZSxmLGcsaixsKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPWp8MDtsPStsO3ZhciBtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTA7cT1pO2k9aSs5NzZ8MDtBPXE7Qz1xKzg2OHwwO0U9cSs4MTZ8MDtCPXErNDE2fDA7dD1xKzQwOHwwO3M9cSs4NjB8MDtyPXErNDAwfDA7eD1xKzgyNHwwO2Q9cSs4MzZ8MDt3PXErODQ4fDA7Rj1xKzgyMHwwO3Y9cSs0MDR8MDt1PXErODY0fDA7Y1tFPj4yXT1DO2hbaz4+M109bDtjW0E+PjJdPWNbaz4+Ml07Y1tBKzQ+PjJdPWNbays0Pj4yXTtDPWxiKEN8MCwxMDAsMTMyMjQsQXwwKXwwO2lmKEM+Pj4wPjk5KXtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9Qz1jWzMzNDBdfDA7aFtrPj4zXT1sO2NbQT4+Ml09Y1trPj4yXTtjW0ErND4+Ml09Y1trKzQ+PjJdO0M9Q2koRSxDLDEzMjI0LEEpfDA7ej1jW0U+PjJdfDA7aWYoKHp8MCk9PTApe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfUI9dW4oQzw8Mil8MDtpZigoQnwwKT09MCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9ZWxzZXt5PUJ9fWVsc2V7eT0wO3o9MH1EPWNbZysyOD4+Ml18MDtIPUQrNHwwO2NbSD4+Ml09KGNbSD4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbQT4+Ml09MTM0NDg7Y1tBKzQ+PjJdPTIwODtjW0ErOD4+Ml09MDtjZygxMzQ0OCxBKX1HPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtIPWNbRCs4Pj4yXXwwO2lmKChjW0QrMTI+PjJdfDApLUg+PjI+Pj4wPkc+Pj4wPyhwPWNbSCsoRzw8Mik+PjJdfDAsKHB8MCkhPTApOjApe0g9Y1tFPj4yXXwwO3VjW2NbKGNbcD4+Ml18MCkrNDg+PjJdJjMxXShwLEgsSCtDfDAsQil8MDtpZigoQ3wwKT09MCl7RT0wfWVsc2V7RT0oYVtjW0U+PjJdPj4wXXwwKT09NDV9Y1t0Pj4yXT0wO2NbeCswPj4yXT0wO2NbeCs0Pj4yXT0wO2NbeCs4Pj4yXT0wO2NbZCswPj4yXT0wO2NbZCs0Pj4yXT0wO2NbZCs4Pj4yXT0wO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wO0ZrKGYsRSxELHQscyxyLHgsZCx3LEYpO2Y9Y1tGPj4yXXwwO2lmKChDfDApPihmfDApKXtGPWFbdz4+MF18MDtpZigoRiYxKT09MCl7Rj0oRiYyNTUpPj4+MX1lbHNle0Y9Y1t3KzQ+PjJdfDB9Rz1hW2Q+PjBdfDA7aWYoKEcmMSk9PTApe0c9KEcmMjU1KT4+PjF9ZWxzZXtHPWNbZCs0Pj4yXXwwfUY9RisoQy1mPDwxfDEpK0d8MH1lbHNle0Y9YVt3Pj4wXXwwO2lmKChGJjEpPT0wKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW3crND4+Ml18MH1HPWFbZD4+MF18MDtpZigoRyYxKT09MCl7Rz0oRyYyNTUpPj4+MX1lbHNle0c9Y1tkKzQ+PjJdfDB9Rj1GKzIrR3wwfUY9RitmfDA7aWYoRj4+PjA+MTAwKXtBPXVuKEY8PDIpfDA7aWYoKEF8MCk9PTApe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfWVsc2V7Rj1BfX1lbHNle0Y9MH1HayhBLHYsdSxjW2crND4+Ml18MCxCLEIrKEM8PDIpfDAscCxFLHQsY1tzPj4yXXwwLGNbcj4+Ml18MCx4LGQsdyxmKTtMaShiLGNbZT4+Ml18MCxBLGNbdj4+Ml18MCxjW3U+PjJdfDAsZyxqKTtpZigoRnwwKSE9MCl7dm4oRil9aWYoISgoYVt3Pj4wXSYxKT09MCk/KG49Y1t3Kzg+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKCEoKGFbZD4+MF0mMSk9PTApPyhvPWNbZCs4Pj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhW3g+PjBdJjEpPT0wKT8obT1jW3grOD4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9Rz1EKzR8MDtIPWNbRz4+Ml18MDtjW0c+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW0Q+PjJdfDApKzg+PjJdJjI1NV0oRCl9aWYoKHl8MCkhPTApe3ZuKHkpfWlmKCh6fDApPT0wKXtpPXE7cmV0dXJufXZuKHopO2k9cTtyZXR1cm59SD1YYSg0KXwwO2NbSD4+Ml09MjEzMDQ7d2IoSHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gRmsoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTA7bj1pO2k9aSsxMjh8MDtBPW47eD1uKzEyfDA7bz1uKzQwfDA7dj1uKzUyfDA7dz1uKzU2fDA7dT1uKzE2fDA7ej1uKzI4fDA7cj1uKzY4fDA7cT1uKzcyfDA7dD1uKzg0fDA7cz1uKzg4fDA7cD1uKzEwMHwwO3k9bisxMTJ8MDtpZihiKXtpZighKChjWzMyNjBdfDApPT0tMSkpe2NbQT4+Ml09MTMwNDA7Y1tBKzQ+PjJdPTIwODtjW0ErOD4+Ml09MDtjZygxMzA0MCxBKX1xPShjWzEzMDQ0Pj4yXXwwKSsgLTF8MDtwPWNbZSs4Pj4yXXwwO2lmKCEoKGNbZSsxMj4+Ml18MCktcD4+Mj4+PjA+cT4+PjApKXtiPVhhKDQpfDA7Y1tiPj4yXT0yMTMwNDt3YihifDAsMjEzNzYsMTk2KX1wPWNbcCsocTw8Mik+PjJdfDA7aWYoKHB8MCk9PTApe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfXE9Y1twPj4yXXwwO2lmKGQpe21jW2NbcSs0ND4+Ml0mMTI3XSh4LHApO2I9Y1t4Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbcD4+Ml18MCkrMzI+PjJdJjEyN10obyxwKTtpZigoYVtsPj4wXSYxKT09MCl7Y1tsKzQ+PjJdPTA7YVtsPj4wXT0wfWVsc2V7Y1tjW2wrOD4+Ml0+PjJdPTA7Y1tsKzQ+PjJdPTB9b2cobCk7Y1tsKzA+PjJdPWNbbyswPj4yXTtjW2wrND4+Ml09Y1tvKzQ+PjJdO2NbbCs4Pj4yXT1jW28rOD4+Ml07Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTB9ZWxzZXttY1tjW3ErNDA+PjJdJjEyN10odixwKTtiPWNbdj4+Ml18MDthW2Y+PjBdPWI7YVtmKzE+PjBdPWI+Pjg7YVtmKzI+PjBdPWI+PjE2O2FbZiszPj4wXT1iPj4yNDttY1tjWyhjW3A+PjJdfDApKzI4Pj4yXSYxMjddKHcscCk7aWYoKGFbbD4+MF0mMSk9PTApe2NbbCs0Pj4yXT0wO2FbbD4+MF09MH1lbHNle2NbY1tsKzg+PjJdPj4yXT0wO2NbbCs0Pj4yXT0wfW9nKGwpO2NbbCswPj4yXT1jW3crMD4+Ml07Y1tsKzQ+PjJdPWNbdys0Pj4yXTtjW2wrOD4+Ml09Y1t3Kzg+PjJdO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wfWNbZz4+Ml09b2NbY1soY1twPj4yXXwwKSsxMj4+Ml0mMTI3XShwKXwwO2NbaD4+Ml09b2NbY1soY1twPj4yXXwwKSsxNj4+Ml0mMTI3XShwKXwwO21jW2NbKGNbcD4+Ml18MCkrMjA+PjJdJjEyN10odSxwKTtpZigoYVtqPj4wXSYxKT09MCl7YVtqKzE+PjBdPTA7YVtqPj4wXT0wfWVsc2V7YVtjW2orOD4+Ml0+PjBdPTA7Y1tqKzQ+PjJdPTB9aWcoaik7Y1tqKzA+PjJdPWNbdSswPj4yXTtjW2orND4+Ml09Y1t1KzQ+PjJdO2Nbais4Pj4yXT1jW3UrOD4+Ml07Y1t1KzA+PjJdPTA7Y1t1KzQ+PjJdPTA7Y1t1Kzg+PjJdPTA7bWNbY1soY1twPj4yXXwwKSsyND4+Ml0mMTI3XSh6LHApO2lmKChhW2s+PjBdJjEpPT0wKXtjW2srND4+Ml09MDthW2s+PjBdPTB9ZWxzZXtjW2Nbays4Pj4yXT4+Ml09MDtjW2srND4+Ml09MH1vZyhrKTtjW2srMD4+Ml09Y1t6KzA+PjJdO2Nbays0Pj4yXT1jW3orND4+Ml07Y1trKzg+PjJdPWNbeis4Pj4yXTtjW3orMD4+Ml09MDtjW3orND4+Ml09MDtjW3orOD4+Ml09MDtiPW9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MDtjW20+PjJdPWI7aT1uO3JldHVybn1lbHNle2lmKCEoKGNbMzI0NF18MCk9PS0xKSl7Y1tBPj4yXT0xMjk3NjtjW0ErND4+Ml09MjA4O2NbQSs4Pj4yXT0wO2NnKDEyOTc2LEEpfXU9KGNbMTI5ODA+PjJdfDApKyAtMXwwO289Y1tlKzg+PjJdfDA7aWYoISgoY1tlKzEyPj4yXXwwKS1vPj4yPj4+MD51Pj4+MCkpe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfW89Y1tvKyh1PDwyKT4+Ml18MDtpZigob3wwKT09MCl7Yj1YYSg0KXwwO2NbYj4+Ml09MjEzMDQ7d2IoYnwwLDIxMzc2LDE5Nil9ZT1jW28+PjJdfDA7aWYoZCl7bWNbY1tlKzQ0Pj4yXSYxMjddKHIsbyk7Yj1jW3I+PjJdfDA7YVtmPj4wXT1iO2FbZisxPj4wXT1iPj44O2FbZisyPj4wXT1iPj4xNjthW2YrMz4+MF09Yj4+MjQ7bWNbY1soY1tvPj4yXXwwKSszMj4+Ml0mMTI3XShxLG8pO2lmKChhW2w+PjBdJjEpPT0wKXtjW2wrND4+Ml09MDthW2w+PjBdPTB9ZWxzZXtjW2NbbCs4Pj4yXT4+Ml09MDtjW2wrND4+Ml09MH1vZyhsKTtjW2wrMD4+Ml09Y1txKzA+PjJdO2NbbCs0Pj4yXT1jW3ErND4+Ml07Y1tsKzg+PjJdPWNbcSs4Pj4yXTtjW3ErMD4+Ml09MDtjW3ErND4+Ml09MDtjW3ErOD4+Ml09MH1lbHNle21jW2NbZSs0MD4+Ml0mMTI3XSh0LG8pO2I9Y1t0Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbbz4+Ml18MCkrMjg+PjJdJjEyN10ocyxvKTtpZigoYVtsPj4wXSYxKT09MCl7Y1tsKzQ+PjJdPTA7YVtsPj4wXT0wfWVsc2V7Y1tjW2wrOD4+Ml0+PjJdPTA7Y1tsKzQ+PjJdPTB9b2cobCk7Y1tsKzA+PjJdPWNbcyswPj4yXTtjW2wrND4+Ml09Y1tzKzQ+PjJdO2NbbCs4Pj4yXT1jW3MrOD4+Ml07Y1tzKzA+PjJdPTA7Y1tzKzQ+PjJdPTA7Y1tzKzg+PjJdPTB9Y1tnPj4yXT1vY1tjWyhjW28+PjJdfDApKzEyPj4yXSYxMjddKG8pfDA7Y1toPj4yXT1vY1tjWyhjW28+PjJdfDApKzE2Pj4yXSYxMjddKG8pfDA7bWNbY1soY1tvPj4yXXwwKSsyMD4+Ml0mMTI3XShwLG8pO2lmKChhW2o+PjBdJjEpPT0wKXthW2orMT4+MF09MDthW2o+PjBdPTB9ZWxzZXthW2Nbais4Pj4yXT4+MF09MDtjW2orND4+Ml09MH1pZyhqKTtjW2orMD4+Ml09Y1twKzA+PjJdO2Nbais0Pj4yXT1jW3ArND4+Ml07Y1tqKzg+PjJdPWNbcCs4Pj4yXTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDttY1tjWyhjW28+PjJdfDApKzI0Pj4yXSYxMjddKHksbyk7aWYoKGFbaz4+MF0mMSk9PTApe2Nbays0Pj4yXT0wO2Fbaz4+MF09MH1lbHNle2NbY1trKzg+PjJdPj4yXT0wO2Nbays0Pj4yXT0wfW9nKGspO2NbayswPj4yXT1jW3krMD4+Ml07Y1trKzQ+PjJdPWNbeSs0Pj4yXTtjW2srOD4+Ml09Y1t5Kzg+PjJdO2NbeSswPj4yXT0wO2NbeSs0Pj4yXT0wO2NbeSs4Pj4yXT0wO2I9b2NbY1soY1tvPj4yXXwwKSszNj4+Ml0mMTI3XShvKXwwO2NbbT4+Ml09YjtpPW47cmV0dXJufX1mdW5jdGlvbiBHayhiLGQsZSxmLGcsaCxqLGssbCxtLG4sbyxwLHEscil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7bz1vfDA7cD1wfDA7cT1xfDA7cj1yfDA7dmFyIHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wO3M9aTtjW2U+PjJdPWI7dD1xKzR8MDt1PXErOHwwO3k9KGYmNTEyfDApPT0wO3g9cCs0fDA7QT1wKzh8MDt3PShyfDApPjA7Qj1vKzF8MDtDPW8rOHwwO0Q9bys0fDA7RT0wO2Rve3N3aXRjaChhW2wrRT4+MF18MCl7Y2FzZSAyOntGPWFbcD4+MF18MDtIPShGJjEpPT0wO2lmKEgpe0c9KEYmMjU1KT4+PjF9ZWxzZXtHPWNbeD4+Ml18MH1pZighKChHfDApPT0wfHkpKXtpZihIKXtIPXg7ST0oRiYyNTUpPj4+MX1lbHNle0g9Y1tBPj4yXXwwO0k9Y1t4Pj4yXXwwfUc9SCsoSTw8Mil8MDtGPWNbZT4+Ml18MDtpZigoSHwwKSE9KEd8MCkpe0o9KEgrKEkrIC0xPDwyKSsoMC1IKXwwKT4+PjI7ST1GO3doaWxlKDEpe2NbST4+Ml09Y1tIPj4yXTtIPUgrNHwwO2lmKChIfDApPT0oR3wwKSl7YnJlYWt9ST1JKzR8MH1GPUYrKEorMTw8Mil8MH1jW2U+PjJdPUZ9YnJlYWt9O2Nhc2UgMzp7Rz1hW3E+PjBdfDA7Rj0oRyYxKT09MDtpZihGKXtHPShHJjI1NSk+Pj4xfWVsc2V7Rz1jW3Q+PjJdfDB9aWYoKEd8MCkhPTApe2lmKEYpe0Y9dH1lbHNle0Y9Y1t1Pj4yXXwwfUw9Y1tGPj4yXXwwO009Y1tlPj4yXXwwO2NbZT4+Ml09TSs0O2NbTT4+Ml09TH1icmVha307Y2FzZSA0OntGPWNbZT4+Ml18MDtnPWs/Zys0fDA6ZzthOmRve2lmKGc+Pj4wPGg+Pj4wKXtHPWc7d2hpbGUoMSl7SD1HKzR8MDtpZighKGhjW2NbKGNbaj4+Ml18MCkrMTI+PjJdJjYzXShqLDIwNDgsY1tHPj4yXXwwKXwwKSl7YnJlYWsgYX1pZihIPj4+MDxoPj4+MCl7Rz1IfWVsc2V7Rz1IO2JyZWFrfX19ZWxzZXtHPWd9fXdoaWxlKDApO2lmKHcpe2lmKEc+Pj4wPmc+Pj4wKXtIPWNbZT4+Ml18MDtJPXI7d2hpbGUoMSl7Rz1HKyAtNHwwO0s9SCs0fDA7Y1tIPj4yXT1jW0c+PjJdO0k9SSsgLTF8MDtKPShJfDApPjA7aWYoIShHPj4+MD5nPj4+MCZKKSl7YnJlYWt9ZWxzZXtIPUt9fWNbZT4+Ml09SztpZihKKXt6PTM0fWVsc2V7Y1tlPj4yXT1IKzh9fWVsc2V7ST1yO3o9MzR9aWYoKHp8MCk9PTM0KXt6PTA7Sj14Y1tjWyhjW2o+PjJdfDApKzQ0Pj4yXSY2M10oaiw0OCl8MDtLPWNbZT4+Ml18MDtNPUsrNHwwO2NbZT4+Ml09TTtpZigoSXwwKT4wKXtIPUs7TD1JO3doaWxlKDEpe2NbSD4+Ml09SjtMPUwrIC0xfDA7aWYoKEx8MCk8PTApe2JyZWFrfWVsc2V7SD1NO009TSs0fDB9fWNbZT4+Ml09SysoSSsxPDwyKTtLPUsrKEk8PDIpfDB9fWNbSz4+Ml09bX1pZigoR3wwKT09KGd8MCkpe0s9eGNbY1soY1tqPj4yXXwwKSs0ND4+Ml0mNjNdKGosNDgpfDA7TT1jW2U+PjJdfDA7TD1NKzR8MDtjW2U+PjJdPUw7Y1tNPj4yXT1LfWVsc2V7ST1hW28+PjBdfDA7SD0oSSYxKT09MDtpZihIKXtJPShJJjI1NSk+Pj4xfWVsc2V7ST1jW0Q+PjJdfDB9aWYoKEl8MCk9PTApe0g9LTF9ZWxzZXtpZihIKXtIPUJ9ZWxzZXtIPWNbQz4+Ml18MH1IPWFbSD4+MF18MH1JPWNbZT4+Ml18MDtLPTA7Sj0wO3doaWxlKDEpe2lmKChKfDApPT0oSHwwKSl7Sj1JKzR8MDtjW2U+PjJdPUo7Y1tJPj4yXT1uO0s9SysxfDA7TD1hW28+PjBdfDA7ST0oTCYxKT09MDtpZihJKXtMPShMJjI1NSk+Pj4xfWVsc2V7TD1jW0Q+PjJdfDB9aWYoSz4+PjA8TD4+PjApe2lmKEkpe0g9Qn1lbHNle0g9Y1tDPj4yXXwwfWlmKChhW0grSz4+MF18MCk9PTEyNyl7ST1KO0g9LTE7Sj0wfWVsc2V7aWYoSSl7SD1CfWVsc2V7SD1jW0M+PjJdfDB9ST1KO0g9YVtIK0s+PjBdfDA7Sj0wfX1lbHNle0k9SjtKPTB9fUc9RysgLTR8MDtNPWNbRz4+Ml18MDtMPUkrNHwwO2NbZT4+Ml09TDtjW0k+PjJdPU07aWYoKEd8MCk9PShnfDApKXticmVha31lbHNle0k9TDtKPUorMXwwfX19aWYoKEZ8MCkhPShMfDApPyh2PUwrIC00fDAsdj4+PjA+Rj4+PjApOjApe0c9djtkb3tNPWNbRj4+Ml18MDtjW0Y+PjJdPWNbRz4+Ml07Y1tHPj4yXT1NO0Y9Ris0fDA7Rz1HKyAtNHwwfXdoaWxlKEY+Pj4wPEc+Pj4wKX1icmVha307Y2FzZSAxOntjW2Q+PjJdPWNbZT4+Ml07TD14Y1tjWyhjW2o+PjJdfDApKzQ0Pj4yXSY2M10oaiwzMil8MDtNPWNbZT4+Ml18MDtjW2U+PjJdPU0rNDtjW00+PjJdPUw7YnJlYWt9O2Nhc2UgMDp7Y1tkPj4yXT1jW2U+PjJdO2JyZWFrfTtkZWZhdWx0Ont9fUU9RSsxfDB9d2hpbGUoKEV8MCkhPTQpO3c9YVtxPj4wXXwwO3Y9KHcmMSk9PTA7aWYodil7cT0odyYyNTUpPj4+MX1lbHNle3E9Y1t0Pj4yXXwwfWlmKHE+Pj4wPjEpe2lmKHYpe3Y9dDtxPSh3JjI1NSk+Pj4xfWVsc2V7dj1jW3U+PjJdfDA7cT1jW3Q+PjJdfDB9dz12KzR8MDt1PXYrKHE8PDIpfDA7dD1jW2U+PjJdfDA7aWYoKHd8MCkhPSh1fDApKXtxPSh2KyhxKyAtMTw8MikrKDAtdyl8MCk+Pj4yO3Y9dDt3aGlsZSgxKXtjW3Y+PjJdPWNbdz4+Ml07dz13KzR8MDtpZigod3wwKT09KHV8MCkpe2JyZWFrfWVsc2V7dj12KzR8MH19dD10KyhxKzE8PDIpfDB9Y1tlPj4yXT10fWY9ZiYxNzY7aWYoKGZ8MCk9PTE2KXtpPXM7cmV0dXJufWVsc2UgaWYoKGZ8MCk9PTMyKXtjW2Q+PjJdPWNbZT4+Ml07aT1zO3JldHVybn1lbHNle2NbZD4+Ml09YjtpPXM7cmV0dXJufX1mdW5jdGlvbiBIayhiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtwPWk7aT1pKzQ2NHwwO3g9cDt0PXArNDM2fDA7cz1wKzQ0MHwwO3I9cCs0NDR8MDtxPXArNDEyfDA7dj1wKzQwMHwwO2Q9cCs0MjR8MDt6PXArNDQ4fDA7dz1wKzQ1MnwwO3U9cCs0NTZ8MDtvPWNbZysyOD4+Ml18MDtEPW8rNHwwO2NbRD4+Ml09KGNbRD4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbeD4+Ml09MTM0NDg7Y1t4KzQ+PjJdPTIwODtjW3grOD4+Ml09MDtjZygxMzQ0OCx4KX15PShjWzEzNDUyPj4yXXwwKSsgLTF8MDtBPWNbbys4Pj4yXXwwO2lmKChjW28rMTI+PjJdfDApLUE+PjI+Pj4wPnk+Pj4wPyhsPWNbQSsoeTw8Mik+PjJdfDAsKGx8MCkhPTApOjApe0E9YVtqPj4wXXwwO3k9KEEmMSk9PTA7aWYoeSl7QT0oQSYyNTUpPj4+MX1lbHNle0E9Y1tqKzQ+PjJdfDB9aWYoKEF8MCk9PTApe3k9MH1lbHNle2lmKHkpe3k9ais0fDB9ZWxzZXt5PWNbais4Pj4yXXwwfXk9Y1t5Pj4yXXwwO3k9KHl8MCk9PSh4Y1tjWyhjW2w+PjJdfDApKzQ0Pj4yXSY2M10obCw0NSl8MCl9Y1t0Pj4yXT0wO2NbcSswPj4yXT0wO2NbcSs0Pj4yXT0wO2NbcSs4Pj4yXT0wO2NbdiswPj4yXT0wO2Nbdis0Pj4yXT0wO2Nbdis4Pj4yXT0wO2NbZCswPj4yXT0wO2NbZCs0Pj4yXT0wO2NbZCs4Pj4yXT0wO0ZrKGYseSxvLHQscyxyLHEsdixkLHopO2Y9YVtqPj4wXXwwO0E9KGYmMSk9PTA7aWYoQSl7Qj0oZiYyNTUpPj4+MX1lbHNle0I9Y1tqKzQ+PjJdfDB9ej1jW3o+PjJdfDA7aWYoKEJ8MCk+KHp8MCkpe2lmKEEpe0I9KGYmMjU1KT4+PjF9ZWxzZXtCPWNbais0Pj4yXXwwfUM9YVtkPj4wXXwwO2lmKChDJjEpPT0wKXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW2QrND4+Ml18MH1EPWFbdj4+MF18MDtpZigoRCYxKT09MCl7RD0oRCYyNTUpPj4+MX1lbHNle0Q9Y1t2KzQ+PjJdfDB9Qj1DKyhCLXo8PDF8MSkrRHwwfWVsc2V7Qj1hW2Q+PjBdfDA7aWYoKEImMSk9PTApe0I9KEImMjU1KT4+PjF9ZWxzZXtCPWNbZCs0Pj4yXXwwfUM9YVt2Pj4wXXwwO2lmKChDJjEpPT0wKXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW3YrND4+Ml18MH1CPUIrMitDfDB9Qj1CK3p8MDtpZihCPj4+MD4xMDApe3g9dW4oQjw8Mil8MDtpZigoeHwwKT09MCl7RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9ZWxzZXtCPXh9fWVsc2V7Qj0wfWlmKEEpe0E9ais0fDA7aj0oZiYyNTUpPj4+MX1lbHNle0E9Y1tqKzg+PjJdfDA7aj1jW2orND4+Ml18MH1Hayh4LHcsdSxjW2crND4+Ml18MCxBLEErKGo8PDIpfDAsbCx5LHQsY1tzPj4yXXwwLGNbcj4+Ml18MCxxLHYsZCx6KTtMaShiLGNbZT4+Ml18MCx4LGNbdz4+Ml18MCxjW3U+PjJdfDAsZyxoKTtpZigoQnwwKSE9MCl7dm4oQil9aWYoISgoYVtkPj4wXSYxKT09MCk/KG09Y1tkKzg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbdj4+MF0mMSk9PTApPyhuPWNbdis4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhW3E+PjBdJjEpPT0wKT8oaz1jW3ErOD4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9Qz1vKzR8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXtpPXA7cmV0dXJufWxjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKTtpPXA7cmV0dXJufUQ9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIElrKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEprKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBLayhiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Yj1pO2lmKChhW2Q+PjBdJjEpPT0wKXtkPWQrMXwwfWVsc2V7ZD1jW2QrOD4+Ml18MH1lPWRjKGR8MCwxKXwwO2k9YjtyZXR1cm4gZT4+PigoZXwwKSE9KC0xfDApJjEpfDB9ZnVuY3Rpb24gTGsoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7ZD1pO2k9aSsxNnwwO2o9ZDtjW2orMD4+Ml09MDtjW2orND4+Ml09MDtjW2orOD4+Ml09MDtrPWFbaD4+MF18MDtpZigoayYxKT09MCl7cD1oKzF8MDtoPShrJjI1NSk+Pj4xfWVsc2V7cD1jW2grOD4+Ml18MDtoPWNbaCs0Pj4yXXwwfW09cCtofDA7aWYocD4+PjA8bT4+PjApe249ais0fDA7bD1qKzF8MDtrPWorOHwwO3E9MDtkb3tvPWFbcD4+MF18MDtoPShxJjEpIT0wO2lmKGgpe3I9KGNbaj4+Ml0mLTIpKyAtMXwwO3E9Y1tuPj4yXXwwfWVsc2V7cj0xMDtxPShxJjI1NSk+Pj4xfWlmKChxfDApPT0ocnwwKSl7bGcoaixyLDEscixyLDApO2lmKChhW2o+PjBdJjEpPT0wKXtoPTE0fWVsc2V7aD0xNX19ZWxzZXtpZihoKXtoPTE1fWVsc2V7aD0xNH19aWYoKGh8MCk9PTE0KXthW2o+PjBdPShxPDwxKSsyO3I9bDtzPXErMXwwfWVsc2UgaWYoKGh8MCk9PTE1KXtyPWNbaz4+Ml18MDtzPXErMXwwO2Nbbj4+Ml09c31hW3IrcT4+MF09bzthW3Ircz4+MF09MDtwPXArMXwwO3E9YVtqPj4wXXwwfXdoaWxlKChwfDApIT0obXwwKSk7aD0oZXwwKT09LTE/LTE6ZTw8MTtlPShxJjEpPT0wP2w6Y1trPj4yXXwwfWVsc2V7aD0oZXwwKT09LTE/LTE6ZTw8MTtlPWorMXwwfWw9amIoaHwwLGZ8MCxnfDAsZXwwKXwwO2NbYiswPj4yXT0wO2NbYis0Pj4yXT0wO2NbYis4Pj4yXT0wO3M9Sm4obHwwKXwwO2s9bCtzfDA7YTpkb3tpZigoc3wwKT4wKXtmPWIrNHwwO2c9YisxfDA7ZT1iKzh8MDtuPTA7d2hpbGUoMSl7bT1hW2w+PjBdfDA7aD0obiYxKSE9MDtpZihoKXtvPShjW2I+PjJdJi0yKSsgLTF8MDtuPWNbZj4+Ml18MH1lbHNle289MTA7bj0obiYyNTUpPj4+MX1pZigobnwwKT09KG98MCkpe2xnKGIsbywxLG8sbywwKTtpZigoYVtiPj4wXSYxKT09MCl7aD0yOH1lbHNle2g9Mjl9fWVsc2V7aWYoaCl7aD0yOX1lbHNle2g9Mjh9fWlmKChofDApPT0yOCl7YVtiPj4wXT0objw8MSkrMjtwPWc7bz1uKzF8MH1lbHNlIGlmKChofDApPT0yOSl7cD1jW2U+PjJdfDA7bz1uKzF8MDtjW2Y+PjJdPW99YVtwK24+PjBdPW07YVtwK28+PjBdPTA7bD1sKzF8MDtpZigobHwwKT09KGt8MCkpe2JyZWFrIGF9bj1hW2I+PjBdfDB9fX13aGlsZSgwKTtpZigoYVtqPj4wXSYxKT09MCl7aT1kO3JldHVybn1iPWNbais4Pj4yXXwwO2lmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gTWsoYSxiKXthPWF8MDtiPWJ8MDthPWk7WWIoKChifDApPT0tMT8tMTpiPDwxKXwwKXwwO2k9YTtyZXR1cm59ZnVuY3Rpb24gTmsoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gT2soYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFBrKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDtiPWk7aWYoKGFbZD4+MF0mMSk9PTApe2Q9ZCsxfDB9ZWxzZXtkPWNbZCs4Pj4yXXwwfWU9ZGMoZHwwLDEpfDA7aT1iO3JldHVybiBlPj4+KChlfDApIT0oLTF8MCkmMSl8MH1mdW5jdGlvbiBRayhiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wO2Q9aTtpPWkrMTc2fDA7bT1kO249ZCs0MHwwO2s9ZCsxNjh8MDtsPWQrMTcyfDA7bz1kKzE2fDA7cj1kKzh8MDtqPWQrMzJ8MDtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtjW3IrND4+Ml09MDtjW3I+PjJdPTE1MDcyO3M9YVtoPj4wXXwwO2lmKChzJjEpPT0wKXt3PWgrNHwwO2g9KHMmMjU1KT4+PjF9ZWxzZXt3PWNbaCs4Pj4yXXwwO2g9Y1toKzQ+PjJdfDB9dj13KyhoPDwyKXwwO0E9bTtjW0E+PjJdPTA7Y1tBKzQ+PjJdPTA7ZG97aWYodz4+PjA8dj4+PjApe3Q9biszMnwwO3U9bys0fDA7cz1vKzF8MDtoPW8rOHwwO3g9MTUwNzJ8MDt3aGlsZSgxKXtjW2w+PjJdPXc7QT0odGNbY1t4KzEyPj4yXSYzMV0ocixtLHcsdixsLG4sdCxrKXwwKT09Mjt4PWNbbD4+Ml18MDtpZihBfCh4fDApPT0od3wwKSl7YnJlYWt9aWYobj4+PjA8KGNbaz4+Ml18MCk+Pj4wKXt4PW47ZG97dz1hW3g+PjBdfDA7eT1hW28+PjBdfDA7ej0oeSYxKSE9MDtpZih6KXtwPShjW28+PjJdJi0yKSsgLTF8MDt5PWNbdT4+Ml18MH1lbHNle3A9MTA7eT0oeSYyNTUpPj4+MX1pZigoeXwwKT09KHB8MCkpe2xnKG8scCwxLHAscCwwKTtpZigoYVtvPj4wXSYxKT09MCl7cD0xOH1lbHNle3A9MTl9fWVsc2V7aWYoeil7cD0xOX1lbHNle3A9MTh9fWlmKChwfDApPT0xOCl7cD0wO2Fbbz4+MF09KHk8PDEpKzI7QT1zO3o9eSsxfDB9ZWxzZSBpZigocHwwKT09MTkpe3A9MDtBPWNbaD4+Ml18MDt6PXkrMXwwO2NbdT4+Ml09en1hW0EreT4+MF09dzthW0Erej4+MF09MDt4PXgrMXwwfXdoaWxlKHg+Pj4wPChjW2s+PjJdfDApPj4+MCk7dz1jW2w+PjJdfDB9ZWxzZXt3PXh9aWYoISh3Pj4+MDx2Pj4+MCkpe3A9MjQ7YnJlYWt9eD1jW3I+PjJdfDB9aWYoKHB8MCk9PTI0KXtxPShhW28+PjBdJjEpPT0wO2JyZWFrfW9rKDE0Mjk2KX1lbHNle3E9MX19d2hpbGUoMCk7aWYocSl7cD1vKzF8MH1lbHNle3A9Y1tvKzg+PjJdfDB9cD1qYigoKGV8MCk9PS0xPy0xOmU8PDEpfDAsZnwwLGd8MCxwfDApfDA7Y1tiKzA+PjJdPTA7Y1tiKzQ+PjJdPTA7Y1tiKzg+PjJdPTA7Y1tqKzQ+PjJdPTA7Y1tqPj4yXT0xNTE3NjtBPUpuKHB8MCl8MDtxPXArQXwwO3o9bTtjW3o+PjJdPTA7Y1t6KzQ+PjJdPTA7YTpkb3tpZigoQXwwKT4wKXtlPXE7cj1uKzEyOHwwO2c9Yis0fDA7Zj1iKzh8MDtoPTE1MTc2fDA7d2hpbGUoMSl7Y1tsPj4yXT1wO0E9KHRjW2NbaCsxNj4+Ml0mMzFdKGosbSxwLChlLXB8MCk+MzI/cCszMnwwOnEsbCxuLHIsayl8MCk9PTI7aD1jW2w+PjJdfDA7aWYoQXwoaHwwKT09KHB8MCkpe2JyZWFrfWlmKG4+Pj4wPChjW2s+PjJdfDApPj4+MCl7cz1uO2Rve2g9Y1tzPj4yXXwwO3Q9YVtiPj4wXXwwO3U9KHQmMSkhPTA7aWYodSl7cD0oY1tiPj4yXSYtMikrIC0xfDA7dD1jW2c+PjJdfDB9ZWxzZXtwPTE7dD0odCYyNTUpPj4+MX1pZigodHwwKT09KHB8MCkpe3BnKGIscCwxLHAscCwwLDApO2lmKChhW2I+PjBdJjEpPT0wKXtwPTQzfWVsc2V7cD00NH19ZWxzZXtpZih1KXtwPTQ0fWVsc2V7cD00M319aWYoKHB8MCk9PTQzKXthW2I+PjBdPSh0PDwxKSsyO3Y9Zzt1PXQrMXwwfWVsc2UgaWYoKHB8MCk9PTQ0KXt2PWNbZj4+Ml18MDt1PXQrMXwwO2NbZz4+Ml09dX1jW3YrKHQ8PDIpPj4yXT1oO2NbdisodTw8Mik+PjJdPTA7cz1zKzR8MH13aGlsZShzPj4+MDwoY1trPj4yXXwwKT4+PjApO3A9Y1tsPj4yXXwwfWVsc2V7cD1ofWlmKCEocD4+PjA8cT4+PjApKXticmVhayBhfWg9Y1tqPj4yXXwwfW9rKDE0Mjk2KX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe2k9ZDtyZXR1cm59Yj1jW28rOD4+Ml18MDtpZigoYnwwKT09MCl7aT1kO3JldHVybn12bihiKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIFJrKGEsYil7YT1hfDA7Yj1ifDA7YT1pO1liKCgoYnwwKT09LTE/LTE6Yjw8MSl8MCl8MDtpPWE7cmV0dXJufWZ1bmN0aW9uIFNrKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNTQ0O2I9Yis4fDA7ZT1jW2I+PjJdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWlmKChlfDApPT0oY1szMzQwXXwwKSl7aT1kO3JldHVybn1WYihjW2I+PjJdfDApO2k9ZDtyZXR1cm59ZnVuY3Rpb24gVGsoKXt2YXIgYj0wLGQ9MCxlPTA7ZD1YYSg4KXwwO2NbZD4+Ml09OTkwNDt3aGlsZSgxKXtlPXVuKDE5KXwwO2lmKChlfDApIT0wKXtiPTc7YnJlYWt9ZT1jWzU2NjZdfDA7Y1s1NjY2XT1lKzA7aWYoKGV8MCk9PTApe2JyZWFrfXNjW2UmMzFdKCl9aWYoKGJ8MCk9PTcpe2NbZSs0Pj4yXT02O2NbZT4+Ml09NjtiPWUrMTJ8MDtjW2QrND4+Ml09YjtjW2UrOD4+Ml09MDthW2IrMD4+MF09YVsxMzM1Mj4+MF18MDthW2IrMT4+MF09YVsxMzM1Mz4+MF18MDthW2IrMj4+MF09YVsxMzM1ND4+MF18MDthW2IrMz4+MF09YVsxMzM1NT4+MF18MDthW2IrND4+MF09YVsxMzM1Nj4+MF18MDthW2IrNT4+MF09YVsxMzM1Nz4+MF18MDthW2IrNj4+MF09YVsxMzM1OD4+MF18MDtjW2Q+PjJdPTk5ODQ7d2IoZHwwLDEwMDI0LDEwNCl9ZT1YYSg0KXwwO2NbZT4+Ml09MjI2ODA7d2IoZXwwLDIyNzI4LDIwNil9ZnVuY3Rpb24gVWsoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtmPWk7aD1kKzR8MDtjW2g+PjJdPShjW2g+PjJdfDApKzE7aD1iKzEyfDA7bD1jW2g+PjJdfDA7Zz1iKzh8MDtrPWNbZz4+Ml18MDtxPWw7cD1rO2o9cS1wPj4yO2Rve2lmKCEoaj4+PjA+ZT4+PjApKXtvPWUrMXwwO2lmKCEoaj4+PjA8bz4+PjApKXtpZighKGo+Pj4wPm8+Pj4wKSl7YnJlYWt9aj1rKyhvPDwyKXwwO2lmKChsfDApPT0oanwwKSl7YnJlYWt9Y1toPj4yXT1sKyh+KChsKyAtNCsoMC1qKXwwKT4+PjIpPDwyKTticmVha31uPW8tanwwO2s9YisxNnwwO3I9Y1trPj4yXXwwO2Rve2lmKHItcT4+Mj4+PjA8bj4+PjApe2w9YisyNHwwO2lmKG8+Pj4wPjEwNzM3NDE4MjMpe1RrKCl9cD1yLXB8MDtpZihwPj4yPj4+MDw1MzY4NzA5MTEpe3I9cD4+MTtvPXI+Pj4wPG8+Pj4wP286cjtpZigob3wwKSE9MCl7cD1iKzEzNnwwO2lmKChhW3A+PjBdfDApPT0wJm8+Pj4wPDI5KXthW3A+PjBdPTE7cD1sfWVsc2V7bT0xNH19ZWxzZXtvPTA7cD0wfX1lbHNle289MTA3Mzc0MTgyMzttPTE0fWRve2lmKChtfDApPT0xNCl7cT1vPDwyO3E9KHF8MCk9PTA/MTpxO3doaWxlKDEpe3A9dW4ocSl8MDtpZigocHwwKSE9MCl7bT0yMDticmVha31wPWNbNTY2Nl18MDtjWzU2NjZdPXArMDtpZigocHwwKT09MCl7YnJlYWt9c2NbcCYzMV0oKX1pZigobXwwKT09MjApe2JyZWFrfXI9WGEoNCl8MDtjW3I+PjJdPTIyNjgwO3diKHJ8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTttPXArKGo8PDIpfDA7ZG97aWYoKG18MCk9PTApe209MH1lbHNle2NbbT4+Ml09MH1tPW0rNHwwO249bisgLTF8MH13aGlsZSgobnwwKSE9MCk7bj1jW2c+PjJdfDA7cT0oY1toPj4yXXwwKS1ufDA7cj1wKyhqLShxPj4yKTw8Mil8MDtMbihyfDAsbnwwLHF8MCl8MDtjW2c+PjJdPXI7Y1toPj4yXT1tO2Nbaz4+Ml09cCsobzw8Mik7aWYoKG58MCkhPTApe2lmKChsfDApPT0obnwwKSl7YVtiKzEzNj4+MF09MDticmVha31lbHNle3ZuKG4pO2JyZWFrfX19ZWxzZXtkb3tpZigobHwwKT09MCl7aj0wfWVsc2V7Y1tsPj4yXT0wO2o9Y1toPj4yXXwwfWw9ais0fDA7Y1toPj4yXT1sO249bisgLTF8MH13aGlsZSgobnwwKSE9MCl9fXdoaWxlKDApO2s9Y1tnPj4yXXwwfX13aGlsZSgwKTtoPWNbaysoZTw8Mik+PjJdfDA7aWYoKGh8MCk9PTApe3I9aztyPXIrKGU8PDIpfDA7Y1tyPj4yXT1kO2k9ZjtyZXR1cm59cT1oKzR8MDtyPWNbcT4+Ml18MDtjW3E+PjJdPXIrIC0xO2lmKChyfDApPT0wKXtsY1tjWyhjW2g+PjJdfDApKzg+PjJdJjI1NV0oaCl9cj1jW2c+PjJdfDA7cj1yKyhlPDwyKXwwO2Nbcj4+Ml09ZDtpPWY7cmV0dXJufWZ1bmN0aW9uIFZrKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1drKGEpO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFdrKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wO2U9aTtjW2I+PjJdPTEzMzkyO2Q9YisxMnwwO2o9Y1tkPj4yXXwwO2Y9Yis4fDA7az1jW2Y+PjJdfDA7aWYoKGp8MCkhPShrfDApKXtoPTA7d2hpbGUoMSl7bD1jW2srKGg8PDIpPj4yXXwwO2lmKChsfDApIT0wKXtqPWwrNHwwO2s9Y1tqPj4yXXwwO2Nbaj4+Ml09aysgLTE7aWYoKGt8MCk9PTApe2xjW2NbKGNbbD4+Ml18MCkrOD4+Ml0mMjU1XShsKX1qPWNbZD4+Ml18MDtrPWNbZj4+Ml18MH1oPWgrMXwwO2lmKCEoaD4+PjA8ai1rPj4yPj4+MCkpe2o9azticmVha319fWlmKCEoKGFbYisxNDQ+PjBdJjEpPT0wKT8oZz1jW2IrMTUyPj4yXXwwLChnfDApIT0wKTowKXt2bihnKTtqPWNbZj4+Ml18MH1pZigoanwwKT09MCl7aT1lO3JldHVybn1mPWNbZD4+Ml18MDtpZigoZnwwKSE9KGp8MCkpe2NbZD4+Ml09ZisofigoZisgLTQrKDAtail8MCk+Pj4yKTw8Mil9aWYoKGIrMjR8MCk9PShqfDApKXthW2IrMTM2Pj4wXT0wO2k9ZTtyZXR1cm59ZWxzZXt2bihqKTtpPWU7cmV0dXJufX0KCgoKZnVuY3Rpb24gWm4oYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGhjW2EmNjNdKGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIF9uKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoMCxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiAkbihhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGthKDEsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gYW8oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBrYSgyLGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIGJvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoMyxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBjbyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGthKDQsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gZW8oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBrYSg1LGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIGZvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoNixhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBnbyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGthKDcsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gaG8oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBrYSg4LGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIGlvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoOSxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBqbyhhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2ljW2EmNjNdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24ga28oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIGxvKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwKX1mdW5jdGlvbiBtbyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gbm8oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIG9vKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwKX1mdW5jdGlvbiBwbyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gcW8oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIHJvKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwKX1mdW5jdGlvbiBzbyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gdG8oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIHVvKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtqY1thJjMxXShifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiB2byhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gd28oYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtrYSgxLGF8MCxifDAsY3wwLGR8MCxlfDApfWZ1bmN0aW9uIHhvKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7a2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwKX1mdW5jdGlvbiB5byhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gem8oYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtrYSg0LGF8MCxifDAsY3wwLGR8MCxlfDApfWZ1bmN0aW9uIEFvKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7a2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwKX1mdW5jdGlvbiBCbyhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gQ28oYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtrYSg3LGF8MCxifDAsY3wwLGR8MCxlfDApfWZ1bmN0aW9uIERvKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7a2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwKX1mdW5jdGlvbiBFbyhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gRm8oYSl7YT1hfDA7cmV0dXJuIGtjW2EmMzFdKCl8MH1mdW5jdGlvbiBHbygpe3JldHVybiBrYSgwKXwwfWZ1bmN0aW9uIEhvKCl7cmV0dXJuIGthKDEpfDB9ZnVuY3Rpb24gSW8oKXtyZXR1cm4ga2EoMil8MH1mdW5jdGlvbiBKbygpe3JldHVybiBrYSgzKXwwfWZ1bmN0aW9uIEtvKCl7cmV0dXJuIGthKDQpfDB9ZnVuY3Rpb24gTG8oKXtyZXR1cm4ga2EoNSl8MH1mdW5jdGlvbiBNbygpe3JldHVybiBrYSg2KXwwfWZ1bmN0aW9uIE5vKCl7cmV0dXJuIGthKDcpfDB9ZnVuY3Rpb24gT28oKXtyZXR1cm4ga2EoOCl8MH1mdW5jdGlvbiBQbygpe3JldHVybiBrYSg5KXwwfWZ1bmN0aW9uIFFvKGEsYil7YT1hfDA7Yj1ifDA7bGNbYSYyNTVdKGJ8MCl9ZnVuY3Rpb24gUm8oYSl7YT1hfDA7a2EoMCxhfDApfWZ1bmN0aW9uIFNvKGEpe2E9YXwwO2thKDEsYXwwKX1mdW5jdGlvbiBUbyhhKXthPWF8MDtrYSgyLGF8MCl9ZnVuY3Rpb24gVW8oYSl7YT1hfDA7a2EoMyxhfDApfWZ1bmN0aW9uIFZvKGEpe2E9YXwwO2thKDQsYXwwKX1mdW5jdGlvbiBXbyhhKXthPWF8MDtrYSg1LGF8MCl9ZnVuY3Rpb24gWG8oYSl7YT1hfDA7a2EoNixhfDApfWZ1bmN0aW9uIFlvKGEpe2E9YXwwO2thKDcsYXwwKX1mdW5jdGlvbiBabyhhKXthPWF8MDtrYSg4LGF8MCl9ZnVuY3Rpb24gX28oYSl7YT1hfDA7a2EoOSxhfDApfWZ1bmN0aW9uICRvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDttY1thJjEyN10oYnwwLGN8MCl9ZnVuY3Rpb24gYXAoYSxiKXthPWF8MDtiPWJ8MDtrYSgwLGF8MCxifDApfWZ1bmN0aW9uIGJwKGEsYil7YT1hfDA7Yj1ifDA7a2EoMSxhfDAsYnwwKX1mdW5jdGlvbiBjcChhLGIpe2E9YXwwO2I9YnwwO2thKDIsYXwwLGJ8MCl9ZnVuY3Rpb24gZHAoYSxiKXthPWF8MDtiPWJ8MDtrYSgzLGF8MCxifDApfWZ1bmN0aW9uIGVwKGEsYil7YT1hfDA7Yj1ifDA7a2EoNCxhfDAsYnwwKX1mdW5jdGlvbiBmcChhLGIpe2E9YXwwO2I9YnwwO2thKDUsYXwwLGJ8MCl9ZnVuY3Rpb24gZ3AoYSxiKXthPWF8MDtiPWJ8MDtrYSg2LGF8MCxifDApfWZ1bmN0aW9uIGhwKGEsYil7YT1hfDA7Yj1ifDA7a2EoNyxhfDAsYnwwKX1mdW5jdGlvbiBpcChhLGIpe2E9YXwwO2I9YnwwO2thKDgsYXwwLGJ8MCl9ZnVuY3Rpb24ganAoYSxiKXthPWF8MDtiPWJ8MDtrYSg5LGF8MCxifDApfWZ1bmN0aW9uIGtwKGEsYixjLGQsZSxmLGcsaCxpLGope2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2o9anwwO25jW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDAsanwwKX1mdW5jdGlvbiBscChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gbXAoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIG5wKGEsYixjLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDAsaXwwKX1mdW5jdGlvbiBvcChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gcHAoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIHFwKGEsYixjLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDAsaXwwKX1mdW5jdGlvbiBycChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gc3AoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIHRwKGEsYixjLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDAsaXwwKX1mdW5jdGlvbiB1cChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gdnAoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4gb2NbYSYxMjddKGJ8MCl8MH1mdW5jdGlvbiB3cChhKXthPWF8MDtyZXR1cm4ga2EoMCxhfDApfDB9ZnVuY3Rpb24geHAoYSl7YT1hfDA7cmV0dXJuIGthKDEsYXwwKXwwfWZ1bmN0aW9uIHlwKGEpe2E9YXwwO3JldHVybiBrYSgyLGF8MCl8MH1mdW5jdGlvbiB6cChhKXthPWF8MDtyZXR1cm4ga2EoMyxhfDApfDB9ZnVuY3Rpb24gQXAoYSl7YT1hfDA7cmV0dXJuIGthKDQsYXwwKXwwfWZ1bmN0aW9uIEJwKGEpe2E9YXwwO3JldHVybiBrYSg1LGF8MCl8MH1mdW5jdGlvbiBDcChhKXthPWF8MDtyZXR1cm4ga2EoNixhfDApfDB9ZnVuY3Rpb24gRHAoYSl7YT1hfDA7cmV0dXJuIGthKDcsYXwwKXwwfWZ1bmN0aW9uIEVwKGEpe2E9YXwwO3JldHVybiBrYSg4LGF8MCl8MH1mdW5jdGlvbiBGcChhKXthPWF8MDtyZXR1cm4ga2EoOSxhfDApfDB9ZnVuY3Rpb24gR3AoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPStoO3BjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLCtoKX1mdW5jdGlvbiBIcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIElwKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9K2c7a2EoMSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCwrZyl9ZnVuY3Rpb24gSnAoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBLcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIExwKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9K2c7a2EoNCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCwrZyl9ZnVuY3Rpb24gTXAoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBOcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIE9wKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9K2c7a2EoNyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCwrZyl9ZnVuY3Rpb24gUHAoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBRcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIFJwKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3FjW2EmMzFdKGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBTcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoMCxhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gVHAoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2thKDEsYXwwLGJ8MCxjfDApfWZ1bmN0aW9uIFVwKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtrYSgyLGF8MCxifDAsY3wwKX1mdW5jdGlvbiBWcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoMyxhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gV3AoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2thKDQsYXwwLGJ8MCxjfDApfWZ1bmN0aW9uIFhwKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtrYSg1LGF8MCxifDAsY3wwKX1mdW5jdGlvbiBZcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoNixhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gWnAoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2thKDcsYXwwLGJ8MCxjfDApfWZ1bmN0aW9uIF9wKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtrYSg4LGF8MCxifDAsY3wwKX1mdW5jdGlvbiAkcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoOSxhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gYXEoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztyY1thJjMxXShifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBicShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSgwLGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGNxKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPStmO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCwrZil9ZnVuY3Rpb24gZHEoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9K2Y7a2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwLCtmKX1mdW5jdGlvbiBlcShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSgzLGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGZxKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPStmO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCwrZil9ZnVuY3Rpb24gZ3EoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9K2Y7a2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwLCtmKX1mdW5jdGlvbiBocShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSg2LGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGlxKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPStmO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCwrZil9ZnVuY3Rpb24ganEoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9K2Y7a2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwLCtmKX1mdW5jdGlvbiBrcShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSg5LGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGxxKGEpe2E9YXwwO3NjW2EmMzFdKCl9ZnVuY3Rpb24gbXEoKXtrYSgwKX1mdW5jdGlvbiBucSgpe2thKDEpfWZ1bmN0aW9uIG9xKCl7a2EoMil9ZnVuY3Rpb24gcHEoKXtrYSgzKX1mdW5jdGlvbiBxcSgpe2thKDQpfWZ1bmN0aW9uIHJxKCl7a2EoNSl9ZnVuY3Rpb24gc3EoKXtrYSg2KX1mdW5jdGlvbiB0cSgpe2thKDcpfWZ1bmN0aW9uIHVxKCl7a2EoOCl9ZnVuY3Rpb24gdnEoKXtrYSg5KX1mdW5jdGlvbiB3cShhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7cmV0dXJuIHRjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfDB9ZnVuY3Rpb24geHEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIHlxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7cmV0dXJuIGthKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl8MH1mdW5jdGlvbiB6cShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3JldHVybiBrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfDB9ZnVuY3Rpb24gQXEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIEJxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7cmV0dXJuIGthKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl8MH1mdW5jdGlvbiBDcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3JldHVybiBrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfDB9ZnVuY3Rpb24gRHEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIEVxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7cmV0dXJuIGthKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl8MH1mdW5jdGlvbiBGcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3JldHVybiBrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfDB9ZnVuY3Rpb24gR3EoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIEhxKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIHVjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBJcShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoMCxhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gSnEoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGthKDEsYXwwLGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIEtxKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3JldHVybiBrYSgyLGF8MCxifDAsY3wwLGR8MCl8MH1mdW5jdGlvbiBMcShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoMyxhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gTXEoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGthKDQsYXwwLGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIE5xKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3JldHVybiBrYSg1LGF8MCxifDAsY3wwLGR8MCl8MH1mdW5jdGlvbiBPcShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoNixhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gUHEoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGthKDcsYXwwLGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIFFxKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3JldHVybiBrYSg4LGF8MCxifDAsY3wwLGR8MCl8MH1mdW5jdGlvbiBScShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoOSxhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gU3EoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO3ZjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIFRxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBVcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24gVnEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfWZ1bmN0aW9uIFdxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBYcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24gWXEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfWZ1bmN0aW9uIFpxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBfcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24gJHEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfWZ1bmN0aW9uIGFyKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBicihhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt3Y1thJjYzXShifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gY3IoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIGRyKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtrYSgxLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiBlcihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7a2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCl9ZnVuY3Rpb24gZnIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIGdyKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtrYSg0LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiBocihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7a2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCl9ZnVuY3Rpb24gaXIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIGpyKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtrYSg3LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiBrcihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7a2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCl9ZnVuY3Rpb24gbHIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIG1yKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4geGNbYSY2M10oYnwwLGN8MCl8MH1mdW5jdGlvbiBucihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSgwLGF8MCxifDApfDB9ZnVuY3Rpb24gb3IoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4ga2EoMSxhfDAsYnwwKXwwfWZ1bmN0aW9uIHByKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGthKDIsYXwwLGJ8MCl8MH1mdW5jdGlvbiBxcihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSgzLGF8MCxifDApfDB9ZnVuY3Rpb24gcnIoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4ga2EoNCxhfDAsYnwwKXwwfWZ1bmN0aW9uIHNyKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGthKDUsYXwwLGJ8MCl8MH1mdW5jdGlvbiB0cihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSg2LGF8MCxifDApfDB9ZnVuY3Rpb24gdXIoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4ga2EoNyxhfDAsYnwwKXwwfWZ1bmN0aW9uIHZyKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGthKDgsYXwwLGJ8MCl8MH1mdW5jdGlvbiB3cihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSg5LGF8MCxifDApfDB9ZnVuY3Rpb24geHIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3JldHVybiB5Y1thJjYzXShifDAsY3wwLGR8MCxlfDAsZnwwKXwwfWZ1bmN0aW9uIHlyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiB6cihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBrYSgxLGF8MCxifDAsY3wwLGR8MCxlfDApfDB9ZnVuY3Rpb24gQXIoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4ga2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwKXwwfWZ1bmN0aW9uIEJyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBDcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBrYSg0LGF8MCxifDAsY3wwLGR8MCxlfDApfDB9ZnVuY3Rpb24gRHIoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4ga2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwKXwwfWZ1bmN0aW9uIEVyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBGcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBrYSg3LGF8MCxifDAsY3wwLGR8MCxlfDApfDB9ZnVuY3Rpb24gR3IoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4ga2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwKXwwfWZ1bmN0aW9uIEhyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBJcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3pjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gSnIoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoMCxhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIEtyKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2thKDEsYXwwLGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBMcihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCl9ZnVuY3Rpb24gTXIoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoMyxhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIE5yKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2thKDQsYXwwLGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBPcihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCl9ZnVuY3Rpb24gUHIoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoNixhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIFFyKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2thKDcsYXwwLGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBScihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCl9ZnVuY3Rpb24gU3IoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoOSxhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIFRyKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtmYSgwKTtyZXR1cm4gMH1mdW5jdGlvbiBVcihhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtmYSgxKX1mdW5jdGlvbiBWcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2ZhKDIpfWZ1bmN0aW9uIFdyKCl7ZmEoMyk7cmV0dXJuIDB9ZnVuY3Rpb24gWHIoYSl7YT1hfDA7ZmEoNCl9ZnVuY3Rpb24gWXIoYSxiKXthPWF8MDtiPWJ8MDtmYSg1KX1mdW5jdGlvbiBacihhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7ZmEoNil9ZnVuY3Rpb24gX3IoYSl7YT1hfDA7ZmEoNyk7cmV0dXJuIDB9ZnVuY3Rpb24gJHIoYSl7YT1hfDA7cmV0dXJuIEFiKGF8MCl8MH1mdW5jdGlvbiBhcyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2ZhKDgpfWZ1bmN0aW9uIGJzKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtmYSg5KX1mdW5jdGlvbiBjcyhhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtmYSgxMCl9ZnVuY3Rpb24gZHMoKXtmYSgxMSl9ZnVuY3Rpb24gZXMoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtmYSgxMik7cmV0dXJuIDB9ZnVuY3Rpb24gZnMoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZmEoMTMpO3JldHVybiAwfWZ1bmN0aW9uIGdzKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7ZmEoMTQpfWZ1bmN0aW9uIGhzKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtmYSgxNSl9ZnVuY3Rpb24gaXMoYSxiKXthPWF8MDtiPWJ8MDtmYSgxNik7cmV0dXJuIDB9ZnVuY3Rpb24ganMoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmYSgxNyk7cmV0dXJuIDB9ZnVuY3Rpb24ga3MoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZmEoMTgpfQoKCgoKLy8gRU1TQ1JJUFRFTl9FTkRfRlVOQ1MKdmFyIGhjPVtUcixUcixfbixUciwkbixUcixhbyxUcixibyxUcixjbyxUcixlbyxUcixmbyxUcixnbyxUcixobyxUcixpbyxUcix2ZyxBZyxFZyxKZyxPZyxrZixTZyx4ZixQZixRZixEaCxJaCxLayxQayxxbCxzbCx2bCxibCxnbCxpbCxsbCxobixtbixnbixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcl07dmFyIGljPVtVcixVcixrbyxVcixsbyxVcixtbyxVcixubyxVcixvbyxVcixwbyxVcixxbyxVcixybyxVcixzbyxVcix0byxVcixMaCxOaCxPaCxQaCxRaCxSaCxTaCxUaCxVaCxWaCxXaCwkaCxiaSxjaSxkaSxlaSxmaSxnaSxoaSxpaSxqaSxraSx5aSxBaSxNaSxPaSxYaSxZaSxaaSxfaSwkaSxnaixoaixpaixqaixraixCayxIayxVcixVcixVcixVcl07dmFyIGpjPVtWcixWcix2byxWcix3byxWcix4byxWcix5byxWcix6byxWcixBbyxWcixCbyxWcixDbyxWcixEbyxWcixFbyxWcixxbixwbixvbixWcixWcixWcixWcixWcixWcixWcl07dmFyIGtjPVtXcixXcixHbyxXcixIbyxXcixJbyxXcixKbyxXcixLbyxXcixMbyxXcixNbyxXcixObyxXcixPbyxXcixQbyxXcixPYyxXcixXcixXcixXcixXcixXcixXcixXcixXcl07dmFyIGxjPVtYcixYcixSbyxYcixTbyxYcixUbyxYcixVbyxYcixWbyxYcixXbyxYcixYbyxYcixZbyxYcixabyxYcixfbyxYcixUYyxVYyxoZCxpZCxuZCxvZCx2ZCx3ZCx4ZCx6ZCxCZCxDZCxEZCxFZCxGZCxIZCxKZCxLZCxMZCxNZCxOZCxQZCxSZCxTZCxUZCxVZCxWZCxYZCxZZCwkZCxaZCxhZSxfZCxiZSxWZyxVZyxYZyxXZyxjZSxkZSxqZSxrZSxsZSxuZSx0ZSx1ZSxzZSx2ZSxyZSx3ZSx4ZSx5ZSx6ZSxBZSxCZSxDZSxFZSxGZSxJZSxKZSxPZSxQZSxOZSxRZSxxZSxSZSxUZSxVZSxWZSxYZSxZZSxaZSxfZSxhZixmZixnZixtZixuZix0Zix1Zix6ZixBZixJZixIZixMZixLZixOZixfZixaZixUZiwkZixYZixhZyx0ZyxzZyxIZyxHZyxfZyxaZyxhaCwkZyxkaCxjaCxmaCxlaCxuaCxtaCxwaCxvaCx2aCx1aCxyZyx3aCx0aCx4aCx6aCx5aCxfayxGaCxFaCxLaCxKaCxfaCxaaCx0aSxzaSxIaSxHaSxWaSxVaSxlaixkaixvaixuaixyaixxaix1aix0aixGaixFaixRaixQaiwkaixfaixrayxqayxzayxyayx4ayx3ayxEayxDayxKayxJayxPayxOayxXayxWayxvbCxubCxTayxGbCxlbSxkbSxnbSxmbSxBaCxaayxhbCx4bCxObCxWbCxibSxjbSxZbSxYbSxfbSxjbiwkbSxhbixmbixibixkbixlbix6bix5biwkayxEZSxiZyxSYyxlZixtayx2bixUbSxTbSxSbSxRbSxQbSxPbSxmZyxtZyxYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcl07dmFyIG1jPVtZcixZcixhcCxZcixicCxZcixjcCxZcixkcCxZcixlcCxZcixmcCxZcixncCxZcixocCxZcixpcCxZcixqcCxZcixnZCxBZCxJZCxRZCx1ZyxIZSxLZSxoZixvZix2ZixCZixJZyx4aix5aix6aixBaixDaixEaixJaixKaixLaixMaixOaixPaixUaixVaixWaixXaixZaixaaixjayxkayxlayxmayxoayxpayxNayxSayxsbSxubSxwbSxtbSxvbSxxbSxKYyxZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcl07dmFyIG5jPVtacixacixscCxacixtcCxacixucCxacixvcCxacixwcCxacixxcCxacixycCxacixzcCxacix0cCxacix1cCxacixhaixsaixacixacixacixacixacixacixacixacl07dmFyIG9jPVtfcixfcix3cCxfcix4cCxfcix5cCxfcix6cCxfcixBcCxfcixCcCxfcixDcCxfcixEcCxfcixFcCxfcixGcCxfcixNZix5Zyx6ZyxnZSxDZywkcixHZSxNZSxqZixOZyxQZyxRZyxNZyxwZixxZix3ZixCZyxDZixEZixKZixSZixVZixyaCxXaSxybSx0bSx2bSxCbSxEbSx4bSx6bSxmaixzbSx1bSx3bSxDbSxFbSx5bSxBbSx2aix3aixCaixHaixIaixNaixSaixTaixYaixhayxiayxnayxKbCxLbCxNbCxobSxqbSxpbSxrbSxCbCxDbCxFbCxSbCxTbCxVbCxabCxfbCxhbSxabSxBbixRYyxQYyxLYyxfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcl07dmFyIHBjPVthcyxhcyxIcCxhcyxJcCxhcyxKcCxhcyxLcCxhcyxMcCxhcyxNcCxhcyxOcCxhcyxPcCxhcyxQcCxhcyxRcCxhcyx5ayxFayxhcyxhcyxhcyxhcyxhcyxhcyxhcyxhc107dmFyIHFjPVticyxicyxTcCxicyxUcCxicyxVcCxicyxWcCxicyxXcCxicyxYcCxicyxZcCxicyxacCxicyxfcCxicywkcCxicyxPZixTZixXZixWZixzaCxJYyxNYyxicyxicyxic107dmFyIHJjPVtjcyxjcyxicSxjcyxjcSxjcyxkcSxjcyxlcSxjcyxmcSxjcyxncSxjcyxocSxjcyxpcSxjcyxqcSxjcyxrcSxjcyxCaSxFaSxQaSxSaSxjcyxjcyxjcyxjcyxjcyxjc107dmFyIHNjPVtkcyxkcyxtcSxkcyxucSxkcyxvcSxkcyxwcSxkcyxxcSxkcyxycSxkcyxzcSxkcyx0cSxkcyx1cSxkcyx2cSxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkc107dmFyIHRjPVtlcyxlcyx4cSxlcyx5cSxlcyx6cSxlcyxBcSxlcyxCcSxlcyxDcSxlcyxEcSxlcyxFcSxlcyxGcSxlcyxHcSxlcyxHbCxIbCx5bCx6bCxPbCxQbCxXbCxYbCxlcyxlc107dmFyIHVjPVtmcyxmcyxJcSxmcyxKcSxmcyxLcSxmcyxMcSxmcyxNcSxmcyxOcSxmcyxPcSxmcyxQcSxmcyxRcSxmcyxScSxmcyx1bCxjbCxkbCxlbCxrbCxmcyxmcyxmcyxmcyxmc107dmFyIHZjPVtncyxncyxUcSxncyxVcSxncyxWcSxncyxXcSxncyxYcSxncyxZcSxncyxacSxncyxfcSxncywkcSxncyxhcixncyxwaixzaixsayxwayx0ayx2ayxncyxncyxncyxnc107dmFyIHdjPVtocyxocyxjcixocyxkcixocyxlcixocyxmcixocyxncixocyxocixocyxpcixocyxqcixocyxrcixocyxscixocyxlZSxLZyx3Zyx1aSx2aSx6aSxGaSxJaSxKaSxOaSxTaSxMayxRayx0bixzbixybixocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxoc107dmFyIHhjPVtpcyxpcyxucixpcyxvcixpcyxwcixpcyxxcixpcyxycixpcyxzcixpcyx0cixpcyx1cixpcyx2cixpcyx3cixpcyx5ZCxHZCxPZCxXZCxoZSxpZSxtZSxMZSxXZSwkZSxSZyxsZixyZixUZyxEZyx5ZixFZixGZyxwbCxybCx0bCxmbCxobCxqbCxMYyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpc107dmFyIHljPVtqcyxqcyx5cixqcyx6cixqcyxBcixqcyxCcixqcyxDcixqcyxEcixqcyxFcixqcyxGcixqcyxHcixqcyxIcixqcyxCaCxHaCx3bCxJbCxMbCxtbCxBbCxEbCxRbCxUbCxZbCwkbCxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqc107dmFyIHpjPVtrcyxrcyxKcixrcyxLcixrcyxMcixrcyxNcixrcyxOcixrcyxPcixrcyxQcixrcyxRcixrcyxScixrcyxTcixrcyxmZSxMZyx4ZyxDaCxIaCxqbixrbixsbixOYyxrc107cmV0dXJue19pNjRTdWJ0cmFjdDpIbixfZnJlZTp2bixfcmVhbGxvYzp3bixfaTY0QWRkOkluLF9tZW1tb3ZlOk1uLF9zdHJsZW46Sm4sX21lbXNldDpObixfbWFsbG9jOnVuLF9tZW1jcHk6TG4sX19fZ2V0VHlwZU5hbWU6Y2YsX2JpdHNoaWZ0NjRMc2hyOktuLF9iaXRzaGlmdDY0U2hsOk9uLF9fR0xPQkFMX19JX2E6YmYsX19HTE9CQUxfX0lfYTY1OmRmLF9fR0xPQkFMX19JX2ExNTM6R2YscnVuUG9zdFNldHM6R24sc3RhY2tBbGxvYzpBYyxzdGFja1NhdmU6QmMsc3RhY2tSZXN0b3JlOkNjLHNldFRocmV3OkRjLHNldFRlbXBSZXQwOkdjLGdldFRlbXBSZXQwOkhjLGR5bkNhbGxfaWlpaTpabixkeW5DYWxsX3ZpaWlpaWlpOmpvLGR5bkNhbGxfdmlpaWlpOnVvLGR5bkNhbGxfaTpGbyxkeW5DYWxsX3ZpOlFvLGR5bkNhbGxfdmlpOiRvLGR5bkNhbGxfdmlpaWlpaWlpaTprcCxkeW5DYWxsX2lpOnZwLGR5bkNhbGxfdmlpaWlpaWQ6R3AsZHluQ2FsbF92aWlpOlJwLGR5bkNhbGxfdmlpaWlpZDphcSxkeW5DYWxsX3Y6bHEsZHluQ2FsbF9paWlpaWlpaWk6d3EsZHluQ2FsbF9paWlpaTpIcSxkeW5DYWxsX3ZpaWlpaWlpaTpTcSxkeW5DYWxsX3ZpaWlpaWk6YnIsZHluQ2FsbF9paWk6bXIsZHluQ2FsbF9paWlpaWk6eHIsZHluQ2FsbF92aWlpaTpJcn0KLy8gRU1TQ1JJUFRFTl9FTkRfQVNNCgp9KSh7Ik1hdGgiOk1hdGgsIkludDhBcnJheSI6SW50OEFycmF5LCJJbnQxNkFycmF5IjpJbnQxNkFycmF5LCJJbnQzMkFycmF5IjpJbnQzMkFycmF5LCJVaW50OEFycmF5IjpVaW50OEFycmF5LCJVaW50MTZBcnJheSI6VWludDE2QXJyYXksIlVpbnQzMkFycmF5IjpVaW50MzJBcnJheSwiRmxvYXQzMkFycmF5IjpGbG9hdDMyQXJyYXksIkZsb2F0NjRBcnJheSI6RmxvYXQ2NEFycmF5fSx7ImFib3J0IjphYm9ydCwiYXNzZXJ0Ijphc3NlcnQsImFzbVByaW50SW50Ijphc21QcmludEludCwiYXNtUHJpbnRGbG9hdCI6YXNtUHJpbnRGbG9hdCwibWluIjpNYXRoX21pbiwianNDYWxsIjpqc0NhbGwsImludm9rZV9paWlpIjppbnZva2VfaWlpaSwiaW52b2tlX3ZpaWlpaWlpIjppbnZva2VfdmlpaWlpaWksImludm9rZV92aWlpaWkiOmludm9rZV92aWlpaWksImludm9rZV9pIjppbnZva2VfaSwiaW52b2tlX3ZpIjppbnZva2VfdmksImludm9rZV92aWkiOmludm9rZV92aWksImludm9rZV92aWlpaWlpaWlpIjppbnZva2VfdmlpaWlpaWlpaSwiaW52b2tlX2lpIjppbnZva2VfaWksImludm9rZV92aWlpaWlpZCI6aW52b2tlX3ZpaWlpaWlkLCJpbnZva2VfdmlpaSI6aW52b2tlX3ZpaWksImludm9rZV92aWlpaWlkIjppbnZva2VfdmlpaWlpZCwiaW52b2tlX3YiOmludm9rZV92LCJpbnZva2VfaWlpaWlpaWlpIjppbnZva2VfaWlpaWlpaWlpLCJpbnZva2VfaWlpaWkiOmludm9rZV9paWlpaSwiaW52b2tlX3ZpaWlpaWlpaSI6aW52b2tlX3ZpaWlpaWlpaSwiaW52b2tlX3ZpaWlpaWkiOmludm9rZV92aWlpaWlpLCJpbnZva2VfaWlpIjppbnZva2VfaWlpLCJpbnZva2VfaWlpaWlpIjppbnZva2VfaWlpaWlpLCJpbnZva2VfdmlpaWkiOmludm9rZV92aWlpaSwiX2ZhYnMiOl9mYWJzLCJfc3NjYW5mIjpfc3NjYW5mLCJfcHRocmVhZF9jb25kX3dhaXQiOl9wdGhyZWFkX2NvbmRfd2FpdCwiX19fY3R5cGVfdG9sb3dlcl9sb2MiOl9fX2N0eXBlX3RvbG93ZXJfbG9jLCJfYXNwcmludGYiOl9hc3ByaW50ZiwiX19lbWJpbmRfcmVnaXN0ZXJfdm9pZCI6X19lbWJpbmRfcmVnaXN0ZXJfdm9pZCwiX3NlbmQiOl9zZW5kLCJfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldyI6X19lbWJpbmRfcmVnaXN0ZXJfbWVtb3J5X3ZpZXcsIl92c3NjYW5mIjpfdnNzY2FuZiwiX19fY3R5cGVfYl9sb2MiOl9fX2N0eXBlX2JfbG9jLCJfX1pTdDl0ZXJtaW5hdGV2IjpfX1pTdDl0ZXJtaW5hdGV2LCJfZm1vZCI6X2Ztb2QsIl9fX2N4YV9ndWFyZF9hY3F1aXJlIjpfX19jeGFfZ3VhcmRfYWNxdWlyZSwiX19fc2V0RXJyTm8iOl9fX3NldEVyck5vLCJfX19jeGFfaXNfbnVtYmVyX3R5cGUiOl9fX2N4YV9pc19udW1iZXJfdHlwZSwiX19fZ3h4X3BlcnNvbmFsaXR5X3YwIjpfX19neHhfcGVyc29uYWxpdHlfdjAsIl9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIiOl9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIsIl91bmdldGMiOl91bmdldGMsIl9fX2Fzc2VydF9mYWlsIjpfX19hc3NlcnRfZmFpbCwiX19fY3hhX2FsbG9jYXRlX2V4Y2VwdGlvbiI6X19fY3hhX2FsbG9jYXRlX2V4Y2VwdGlvbiwiX19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYiOl9fWlN0MTh1bmNhdWdodF9leGNlcHRpb252LCJfX19jdHlwZV90b3VwcGVyX2xvYyI6X19fY3R5cGVfdG91cHBlcl9sb2MsIl9mZmx1c2giOl9mZmx1c2gsIl9fX2N4YV9ndWFyZF9yZWxlYXNlIjpfX19jeGFfZ3VhcmRfcmVsZWFzZSwiX19hZGREYXlzIjpfX2FkZERheXMsIl9fX2Vycm5vX2xvY2F0aW9uIjpfX19lcnJub19sb2NhdGlvbiwiX3B3cml0ZSI6X3B3cml0ZSwiX3N0cmVycm9yX3IiOl9zdHJlcnJvcl9yLCJfc3RyZnRpbWVfbCI6X3N0cmZ0aW1lX2wsIl9fZm9ybWF0U3RyaW5nIjpfX2Zvcm1hdFN0cmluZywiX19yZWFsbHlOZWdhdGl2ZSI6X19yZWFsbHlOZWdhdGl2ZSwiX3NicmsiOl9zYnJrLCJfdXNlbG9jYWxlIjpfdXNlbG9jYWxlLCJfY2F0Z2V0cyI6X2NhdGdldHMsIl9uZXdsb2NhbGUiOl9uZXdsb2NhbGUsIl9zbnByaW50ZiI6X3NucHJpbnRmLCJfX19jeGFfYmVnaW5fY2F0Y2giOl9fX2N4YV9iZWdpbl9jYXRjaCwiX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZywiX2ZpbGVubyI6X2ZpbGVubywiX19lbWJpbmRfcmVnaXN0ZXJfYm9vbCI6X19lbWJpbmRfcmVnaXN0ZXJfYm9vbCwiX19fcmVzdW1lRXhjZXB0aW9uIjpfX19yZXN1bWVFeGNlcHRpb24sIl9fX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoIjpfX19jeGFfZmluZF9tYXRjaGluZ19jYXRjaCwiX3N5c2NvbmYiOl9zeXNjb25mLCJfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nIjpfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nLCJfc3RyZnRpbWUiOl9zdHJmdGltZSwiX19hcnJheVN1bSI6X19hcnJheVN1bSwiX19fY3hhX3Rocm93IjpfX19jeGFfdGhyb3csIl9fZW1iaW5kX3JlZ2lzdGVyX2VtdmFsIjpfX2VtYmluZF9yZWdpc3Rlcl9lbXZhbCwiX19leGl0IjpfX2V4aXQsIl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uIjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbiwiX19aTktTdDlleGNlcHRpb240d2hhdEV2IjpfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYsIl9wdGhyZWFkX211dGV4X2Rlc3Ryb3kiOl9wdGhyZWFkX211dGV4X2Rlc3Ryb3ksIl9wdGhyZWFkX211dGV4X3VubG9jayI6X3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCJfZnJlYWQiOl9mcmVhZCwiX3B0aHJlYWRfY29uZF9icm9hZGNhc3QiOl9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0LCJfbWtwb3J0IjpfbWtwb3J0LCJfc3ByaW50ZiI6X3NwcmludGYsIl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzIjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzcywiX3Zhc3ByaW50ZiI6X3Zhc3ByaW50ZiwiX19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmciOl9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF93c3RyaW5nLCJfd3JpdGUiOl93cml0ZSwiX19pc0xlYXBZZWFyIjpfX2lzTGVhcFllYXIsIl9fc2NhblN0cmluZyI6X19zY2FuU3RyaW5nLCJfc3RyZXJyb3IiOl9zdHJlcnJvciwiX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IiOl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yLCJfcmVjdiI6X3JlY3YsIl92c25wcmludGYiOl92c25wcmludGYsIl9fWk5TdDlleGNlcHRpb25EMkV2IjpfX1pOU3Q5ZXhjZXB0aW9uRDJFdiwiX2NvcHlzaWduIjpfY29weXNpZ24sIl9mZ2V0YyI6X2ZnZXRjLCJfX19jeGFfZG9lc19pbmhlcml0IjpfX19jeGFfZG9lc19pbmhlcml0LCJfZnJlZWxvY2FsZSI6X2ZyZWVsb2NhbGUsIl9yZWFkIjpfcmVhZCwiX2Fib3J0IjpfYWJvcnQsIl9jYXRjbG9zZSI6X2NhdGNsb3NlLCJfZndyaXRlIjpfZndyaXRlLCJfdGltZSI6X3RpbWUsIl9wdGhyZWFkX211dGV4X2xvY2siOl9wdGhyZWFkX211dGV4X2xvY2ssIl9fZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0IjpfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdCwiX3ByZWFkIjpfcHJlYWQsIl9hdGV4aXQiOl9hdGV4aXQsIl9jYXRvcGVuIjpfY2F0b3BlbiwiX2V4aXQiOl9leGl0LCJfX2dldEZsb2F0IjpfX2dldEZsb2F0LCJTVEFDS1RPUCI6U1RBQ0tUT1AsIlNUQUNLX01BWCI6U1RBQ0tfTUFYLCJ0ZW1wRG91YmxlUHRyIjp0ZW1wRG91YmxlUHRyLCJBQk9SVCI6QUJPUlQsImN0dHpfaTgiOmN0dHpfaTgsImN0bHpfaTgiOmN0bHpfaTgsIk5hTiI6TmFOLCJJbmZpbml0eSI6SW5maW5pdHksIl9fWlRJU3Q5ZXhjZXB0aW9uIjpfX1pUSVN0OWV4Y2VwdGlvbiwiX19fZHNvX2hhbmRsZSI6X19fZHNvX2hhbmRsZSwiX3N0ZGVyciI6X3N0ZGVyciwiX3N0ZGluIjpfc3RkaW4sIl9zdGRvdXQiOl9zdGRvdXR9LGJ1ZmZlcik7dmFyIF9pNjRTdWJ0cmFjdD1Nb2R1bGVbIl9pNjRTdWJ0cmFjdCJdPWFzbVsiX2k2NFN1YnRyYWN0Il07dmFyIF9mcmVlPU1vZHVsZVsiX2ZyZWUiXT1hc21bIl9mcmVlIl07dmFyIF9yZWFsbG9jPU1vZHVsZVsiX3JlYWxsb2MiXT1hc21bIl9yZWFsbG9jIl07dmFyIF9pNjRBZGQ9TW9kdWxlWyJfaTY0QWRkIl09YXNtWyJfaTY0QWRkIl07dmFyIF9tZW1tb3ZlPU1vZHVsZVsiX21lbW1vdmUiXT1hc21bIl9tZW1tb3ZlIl07dmFyIF9zdHJsZW49TW9kdWxlWyJfc3RybGVuIl09YXNtWyJfc3RybGVuIl07dmFyIF9tZW1zZXQ9TW9kdWxlWyJfbWVtc2V0Il09YXNtWyJfbWVtc2V0Il07dmFyIF9tYWxsb2M9TW9kdWxlWyJfbWFsbG9jIl09YXNtWyJfbWFsbG9jIl07dmFyIF9tZW1jcHk9TW9kdWxlWyJfbWVtY3B5Il09YXNtWyJfbWVtY3B5Il07dmFyIF9fX2dldFR5cGVOYW1lPU1vZHVsZVsiX19fZ2V0VHlwZU5hbWUiXT1hc21bIl9fX2dldFR5cGVOYW1lIl07dmFyIF9iaXRzaGlmdDY0THNocj1Nb2R1bGVbIl9iaXRzaGlmdDY0THNociJdPWFzbVsiX2JpdHNoaWZ0NjRMc2hyIl07dmFyIF9iaXRzaGlmdDY0U2hsPU1vZHVsZVsiX2JpdHNoaWZ0NjRTaGwiXT1hc21bIl9iaXRzaGlmdDY0U2hsIl07dmFyIF9fR0xPQkFMX19JX2E9TW9kdWxlWyJfX0dMT0JBTF9fSV9hIl09YXNtWyJfX0dMT0JBTF9fSV9hIl07dmFyIF9fR0xPQkFMX19JX2E2NT1Nb2R1bGVbIl9fR0xPQkFMX19JX2E2NSJdPWFzbVsiX19HTE9CQUxfX0lfYTY1Il07dmFyIF9fR0xPQkFMX19JX2ExNTM9TW9kdWxlWyJfX0dMT0JBTF9fSV9hMTUzIl09YXNtWyJfX0dMT0JBTF9fSV9hMTUzIl07dmFyIHJ1blBvc3RTZXRzPU1vZHVsZVsicnVuUG9zdFNldHMiXT1hc21bInJ1blBvc3RTZXRzIl07dmFyIGR5bkNhbGxfaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaSJdPWFzbVsiZHluQ2FsbF9paWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaWlpIl09YXNtWyJkeW5DYWxsX3ZpaWlpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWkiXT1hc21bImR5bkNhbGxfdmlpaWlpIl07dmFyIGR5bkNhbGxfaT1Nb2R1bGVbImR5bkNhbGxfaSJdPWFzbVsiZHluQ2FsbF9pIl07dmFyIGR5bkNhbGxfdmk9TW9kdWxlWyJkeW5DYWxsX3ZpIl09YXNtWyJkeW5DYWxsX3ZpIl07dmFyIGR5bkNhbGxfdmlpPU1vZHVsZVsiZHluQ2FsbF92aWkiXT1hc21bImR5bkNhbGxfdmlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpaWlpaSJdPWFzbVsiZHluQ2FsbF92aWlpaWlpaWlpIl07dmFyIGR5bkNhbGxfaWk9TW9kdWxlWyJkeW5DYWxsX2lpIl09YXNtWyJkeW5DYWxsX2lpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWQ9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaWlkIl09YXNtWyJkeW5DYWxsX3ZpaWlpaWlkIl07dmFyIGR5bkNhbGxfdmlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaSJdPWFzbVsiZHluQ2FsbF92aWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpZD1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpZCJdPWFzbVsiZHluQ2FsbF92aWlpaWlkIl07dmFyIGR5bkNhbGxfdj1Nb2R1bGVbImR5bkNhbGxfdiJdPWFzbVsiZHluQ2FsbF92Il07dmFyIGR5bkNhbGxfaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWkiXT1hc21bImR5bkNhbGxfaWlpaWlpaWlpIl07dmFyIGR5bkNhbGxfaWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpIl09YXNtWyJkeW5DYWxsX2lpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWlpaWkiXT1hc21bImR5bkNhbGxfdmlpaWlpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpaSJdPWFzbVsiZHluQ2FsbF92aWlpaWlpIl07dmFyIGR5bkNhbGxfaWlpPU1vZHVsZVsiZHluQ2FsbF9paWkiXT1hc21bImR5bkNhbGxfaWlpIl07dmFyIGR5bkNhbGxfaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWkiXT1hc21bImR5bkNhbGxfaWlpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpIl09YXNtWyJkeW5DYWxsX3ZpaWlpIl07UnVudGltZS5zdGFja0FsbG9jPWFzbVsic3RhY2tBbGxvYyJdO1J1bnRpbWUuc3RhY2tTYXZlPWFzbVsic3RhY2tTYXZlIl07UnVudGltZS5zdGFja1Jlc3RvcmU9YXNtWyJzdGFja1Jlc3RvcmUiXTtSdW50aW1lLnNldFRlbXBSZXQwPWFzbVsic2V0VGVtcFJldDAiXTtSdW50aW1lLmdldFRlbXBSZXQwPWFzbVsiZ2V0VGVtcFJldDAiXTt2YXIgaTY0TWF0aD0oZnVuY3Rpb24oKXt2YXIgZ29vZz17bWF0aDp7fX07Z29vZy5tYXRoLkxvbmc9KGZ1bmN0aW9uKGxvdyxoaWdoKXt0aGlzLmxvd189bG93fDA7dGhpcy5oaWdoXz1oaWdofDB9KTtnb29nLm1hdGguTG9uZy5JbnRDYWNoZV89e307Z29vZy5tYXRoLkxvbmcuZnJvbUludD0oZnVuY3Rpb24odmFsdWUpe2lmKC0xMjg8PXZhbHVlJiZ2YWx1ZTwxMjgpe3ZhciBjYWNoZWRPYmo9Z29vZy5tYXRoLkxvbmcuSW50Q2FjaGVfW3ZhbHVlXTtpZihjYWNoZWRPYmope3JldHVybiBjYWNoZWRPYmp9fXZhciBvYmo9bmV3IGdvb2cubWF0aC5Mb25nKHZhbHVlfDAsdmFsdWU8MD8tMTowKTtpZigtMTI4PD12YWx1ZSYmdmFsdWU8MTI4KXtnb29nLm1hdGguTG9uZy5JbnRDYWNoZV9bdmFsdWVdPW9ian1yZXR1cm4gb2JqfSk7Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcj0oZnVuY3Rpb24odmFsdWUpe2lmKGlzTmFOKHZhbHVlKXx8IWlzRmluaXRlKHZhbHVlKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk99ZWxzZSBpZih2YWx1ZTw9LWdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjNfREJMXyl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRX1lbHNlIGlmKHZhbHVlKzE+PWdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjNfREJMXyl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLk1BWF9WQUxVRX1lbHNlIGlmKHZhbHVlPDApe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKC12YWx1ZSkubmVnYXRlKCl9ZWxzZXtyZXR1cm4gbmV3IGdvb2cubWF0aC5Mb25nKHZhbHVlJWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMX3wwLHZhbHVlL2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMX3wwKX19KTtnb29nLm1hdGguTG9uZy5mcm9tQml0cz0oZnVuY3Rpb24obG93Qml0cyxoaWdoQml0cyl7cmV0dXJuIG5ldyBnb29nLm1hdGguTG9uZyhsb3dCaXRzLGhpZ2hCaXRzKX0pO2dvb2cubWF0aC5Mb25nLmZyb21TdHJpbmc9KGZ1bmN0aW9uKHN0cixvcHRfcmFkaXgpe2lmKHN0ci5sZW5ndGg9PTApe3Rocm93IEVycm9yKCJudW1iZXIgZm9ybWF0IGVycm9yOiBlbXB0eSBzdHJpbmciKX12YXIgcmFkaXg9b3B0X3JhZGl4fHwxMDtpZihyYWRpeDwyfHwzNjxyYWRpeCl7dGhyb3cgRXJyb3IoInJhZGl4IG91dCBvZiByYW5nZTogIityYWRpeCl9aWYoc3RyLmNoYXJBdCgwKT09Ii0iKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLHJhZGl4KS5uZWdhdGUoKX1lbHNlIGlmKHN0ci5pbmRleE9mKCItIik+PTApe3Rocm93IEVycm9yKCdudW1iZXIgZm9ybWF0IGVycm9yOiBpbnRlcmlvciAiLSIgY2hhcmFjdGVyOiAnK3N0cil9dmFyIHJhZGl4VG9Qb3dlcj1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKE1hdGgucG93KHJhZGl4LDgpKTt2YXIgcmVzdWx0PWdvb2cubWF0aC5Mb25nLlpFUk87Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoO2krPTgpe3ZhciBzaXplPU1hdGgubWluKDgsc3RyLmxlbmd0aC1pKTt2YXIgdmFsdWU9cGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpLGkrc2l6ZSkscmFkaXgpO2lmKHNpemU8OCl7dmFyIHBvd2VyPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoTWF0aC5wb3cocmFkaXgsc2l6ZSkpO3Jlc3VsdD1yZXN1bHQubXVsdGlwbHkocG93ZXIpLmFkZChnb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKHZhbHVlKSl9ZWxzZXtyZXN1bHQ9cmVzdWx0Lm11bHRpcGx5KHJhZGl4VG9Qb3dlcik7cmVzdWx0PXJlc3VsdC5hZGQoZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcih2YWx1ZSkpfX1yZXR1cm4gcmVzdWx0fSk7Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl8xNl9EQkxfPTE8PDE2O2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfREJMXz0xPDwyNDtnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF89Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl8xNl9EQkxfKmdvb2cubWF0aC5Mb25nLlRXT19QV1JfMTZfREJMXztnb29nLm1hdGguTG9uZy5UV09fUFdSXzMxX0RCTF89Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl8zMl9EQkxfLzI7Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl80OF9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXypnb29nLm1hdGguTG9uZy5UV09fUFdSXzE2X0RCTF87Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl82NF9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXypnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF87Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl82M19EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjRfREJMXy8yO2dvb2cubWF0aC5Mb25nLlpFUk89Z29vZy5tYXRoLkxvbmcuZnJvbUludCgwKTtnb29nLm1hdGguTG9uZy5PTkU9Z29vZy5tYXRoLkxvbmcuZnJvbUludCgxKTtnb29nLm1hdGguTG9uZy5ORUdfT05FPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoLTEpO2dvb2cubWF0aC5Mb25nLk1BWF9WQUxVRT1nb29nLm1hdGguTG9uZy5mcm9tQml0cyg0Mjk0OTY3Mjk1fDAsMjE0NzQ4MzY0N3wwKTtnb29nLm1hdGguTG9uZy5NSU5fVkFMVUU9Z29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoMCwyMTQ3NDgzNjQ4fDApO2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoMTw8MjQpO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS50b0ludD0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dffSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnRvTnVtYmVyPShmdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hfKmdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXyt0aGlzLmdldExvd0JpdHNVbnNpZ25lZCgpfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nPShmdW5jdGlvbihvcHRfcmFkaXgpe3ZhciByYWRpeD1vcHRfcmFkaXh8fDEwO2lmKHJhZGl4PDJ8fDM2PHJhZGl4KXt0aHJvdyBFcnJvcigicmFkaXggb3V0IG9mIHJhbmdlOiAiK3JhZGl4KX1pZih0aGlzLmlzWmVybygpKXtyZXR1cm4iMCJ9aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpe3ZhciByYWRpeExvbmc9Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcihyYWRpeCk7dmFyIGRpdj10aGlzLmRpdihyYWRpeExvbmcpO3ZhciByZW09ZGl2Lm11bHRpcGx5KHJhZGl4TG9uZykuc3VidHJhY3QodGhpcyk7cmV0dXJuIGRpdi50b1N0cmluZyhyYWRpeCkrcmVtLnRvSW50KCkudG9TdHJpbmcocmFkaXgpfWVsc2V7cmV0dXJuIi0iK3RoaXMubmVnYXRlKCkudG9TdHJpbmcocmFkaXgpfX12YXIgcmFkaXhUb1Bvd2VyPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoTWF0aC5wb3cocmFkaXgsNikpO3ZhciByZW09dGhpczt2YXIgcmVzdWx0PSIiO3doaWxlKHRydWUpe3ZhciByZW1EaXY9cmVtLmRpdihyYWRpeFRvUG93ZXIpO3ZhciBpbnR2YWw9cmVtLnN1YnRyYWN0KHJlbURpdi5tdWx0aXBseShyYWRpeFRvUG93ZXIpKS50b0ludCgpO3ZhciBkaWdpdHM9aW50dmFsLnRvU3RyaW5nKHJhZGl4KTtyZW09cmVtRGl2O2lmKHJlbS5pc1plcm8oKSl7cmV0dXJuIGRpZ2l0cytyZXN1bHR9ZWxzZXt3aGlsZShkaWdpdHMubGVuZ3RoPDYpe2RpZ2l0cz0iMCIrZGlnaXRzfXJlc3VsdD0iIitkaWdpdHMrcmVzdWx0fX19KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0SGlnaEJpdHM9KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGlnaF99KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0TG93Qml0cz0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dffSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmdldExvd0JpdHNVbnNpZ25lZD0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dfPj0wP3RoaXMubG93Xzpnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8rdGhpcy5sb3dffSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmdldE51bUJpdHNBYnM9KGZ1bmN0aW9uKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpe3JldHVybiA2NH1lbHNle3JldHVybiB0aGlzLm5lZ2F0ZSgpLmdldE51bUJpdHNBYnMoKX19ZWxzZXt2YXIgdmFsPXRoaXMuaGlnaF8hPTA/dGhpcy5oaWdoXzp0aGlzLmxvd187Zm9yKHZhciBiaXQ9MzE7Yml0PjA7Yml0LS0pe2lmKCh2YWwmMTw8Yml0KSE9MCl7YnJlYWt9fXJldHVybiB0aGlzLmhpZ2hfIT0wP2JpdCszMzpiaXQrMX19KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNaZXJvPShmdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hfPT0wJiZ0aGlzLmxvd189PTB9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNOZWdhdGl2ZT0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoXzwwfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmlzT2RkPShmdW5jdGlvbigpe3JldHVybih0aGlzLmxvd18mMSk9PTF9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZXF1YWxzPShmdW5jdGlvbihvdGhlcil7cmV0dXJuIHRoaXMuaGlnaF89PW90aGVyLmhpZ2hfJiZ0aGlzLmxvd189PW90aGVyLmxvd199KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubm90RXF1YWxzPShmdW5jdGlvbihvdGhlcil7cmV0dXJuIHRoaXMuaGlnaF8hPW90aGVyLmhpZ2hffHx0aGlzLmxvd18hPW90aGVyLmxvd199KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubGVzc1RoYW49KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gdGhpcy5jb21wYXJlKG90aGVyKTwwfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbD0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiB0aGlzLmNvbXBhcmUob3RoZXIpPD0wfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmdyZWF0ZXJUaGFuPShmdW5jdGlvbihvdGhlcil7cmV0dXJuIHRoaXMuY29tcGFyZShvdGhlcik+MH0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw9KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gdGhpcy5jb21wYXJlKG90aGVyKT49MH0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5jb21wYXJlPShmdW5jdGlvbihvdGhlcil7aWYodGhpcy5lcXVhbHMob3RoZXIpKXtyZXR1cm4gMH12YXIgdGhpc05lZz10aGlzLmlzTmVnYXRpdmUoKTt2YXIgb3RoZXJOZWc9b3RoZXIuaXNOZWdhdGl2ZSgpO2lmKHRoaXNOZWcmJiFvdGhlck5lZyl7cmV0dXJuLTF9aWYoIXRoaXNOZWcmJm90aGVyTmVnKXtyZXR1cm4gMX1pZih0aGlzLnN1YnRyYWN0KG90aGVyKS5pc05lZ2F0aXZlKCkpe3JldHVybi0xfWVsc2V7cmV0dXJuIDF9fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLm5lZ2F0ZT0oZnVuY3Rpb24oKXtpZih0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFfWVsc2V7cmV0dXJuIHRoaXMubm90KCkuYWRkKGdvb2cubWF0aC5Mb25nLk9ORSl9fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmFkZD0oZnVuY3Rpb24ob3RoZXIpe3ZhciBhNDg9dGhpcy5oaWdoXz4+PjE2O3ZhciBhMzI9dGhpcy5oaWdoXyY2NTUzNTt2YXIgYTE2PXRoaXMubG93Xz4+PjE2O3ZhciBhMDA9dGhpcy5sb3dfJjY1NTM1O3ZhciBiNDg9b3RoZXIuaGlnaF8+Pj4xNjt2YXIgYjMyPW90aGVyLmhpZ2hfJjY1NTM1O3ZhciBiMTY9b3RoZXIubG93Xz4+PjE2O3ZhciBiMDA9b3RoZXIubG93XyY2NTUzNTt2YXIgYzQ4PTAsYzMyPTAsYzE2PTAsYzAwPTA7YzAwKz1hMDArYjAwO2MxNis9YzAwPj4+MTY7YzAwJj02NTUzNTtjMTYrPWExNitiMTY7YzMyKz1jMTY+Pj4xNjtjMTYmPTY1NTM1O2MzMis9YTMyK2IzMjtjNDgrPWMzMj4+PjE2O2MzMiY9NjU1MzU7YzQ4Kz1hNDgrYjQ4O2M0OCY9NjU1MzU7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGMxNjw8MTZ8YzAwLGM0ODw8MTZ8YzMyKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5zdWJ0cmFjdD0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiB0aGlzLmFkZChvdGhlci5uZWdhdGUoKSl9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubXVsdGlwbHk9KGZ1bmN0aW9uKG90aGVyKXtpZih0aGlzLmlzWmVybygpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuWkVST31lbHNlIGlmKG90aGVyLmlzWmVybygpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuWkVST31pZih0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gb3RoZXIuaXNPZGQoKT9nb29nLm1hdGguTG9uZy5NSU5fVkFMVUU6Z29vZy5tYXRoLkxvbmcuWkVST31lbHNlIGlmKG90aGVyLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gdGhpcy5pc09kZCgpP2dvb2cubWF0aC5Mb25nLk1JTl9WQUxVRTpnb29nLm1hdGguTG9uZy5aRVJPfWlmKHRoaXMuaXNOZWdhdGl2ZSgpKXtpZihvdGhlci5pc05lZ2F0aXZlKCkpe3JldHVybiB0aGlzLm5lZ2F0ZSgpLm11bHRpcGx5KG90aGVyLm5lZ2F0ZSgpKX1lbHNle3JldHVybiB0aGlzLm5lZ2F0ZSgpLm11bHRpcGx5KG90aGVyKS5uZWdhdGUoKX19ZWxzZSBpZihvdGhlci5pc05lZ2F0aXZlKCkpe3JldHVybiB0aGlzLm11bHRpcGx5KG90aGVyLm5lZ2F0ZSgpKS5uZWdhdGUoKX1pZih0aGlzLmxlc3NUaGFuKGdvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfKSYmb3RoZXIubGVzc1RoYW4oZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8yNF8pKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkqb3RoZXIudG9OdW1iZXIoKSl9dmFyIGE0OD10aGlzLmhpZ2hfPj4+MTY7dmFyIGEzMj10aGlzLmhpZ2hfJjY1NTM1O3ZhciBhMTY9dGhpcy5sb3dfPj4+MTY7dmFyIGEwMD10aGlzLmxvd18mNjU1MzU7dmFyIGI0OD1vdGhlci5oaWdoXz4+PjE2O3ZhciBiMzI9b3RoZXIuaGlnaF8mNjU1MzU7dmFyIGIxNj1vdGhlci5sb3dfPj4+MTY7dmFyIGIwMD1vdGhlci5sb3dfJjY1NTM1O3ZhciBjNDg9MCxjMzI9MCxjMTY9MCxjMDA9MDtjMDArPWEwMCpiMDA7YzE2Kz1jMDA+Pj4xNjtjMDAmPTY1NTM1O2MxNis9YTE2KmIwMDtjMzIrPWMxNj4+PjE2O2MxNiY9NjU1MzU7YzE2Kz1hMDAqYjE2O2MzMis9YzE2Pj4+MTY7YzE2Jj02NTUzNTtjMzIrPWEzMipiMDA7YzQ4Kz1jMzI+Pj4xNjtjMzImPTY1NTM1O2MzMis9YTE2KmIxNjtjNDgrPWMzMj4+PjE2O2MzMiY9NjU1MzU7YzMyKz1hMDAqYjMyO2M0OCs9YzMyPj4+MTY7YzMyJj02NTUzNTtjNDgrPWE0OCpiMDArYTMyKmIxNithMTYqYjMyK2EwMCpiNDg7YzQ4Jj02NTUzNTtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoYzE2PDwxNnxjMDAsYzQ4PDwxNnxjMzIpfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmRpdj0oZnVuY3Rpb24ob3RoZXIpe2lmKG90aGVyLmlzWmVybygpKXt0aHJvdyBFcnJvcigiZGl2aXNpb24gYnkgemVybyIpfWVsc2UgaWYodGhpcy5pc1plcm8oKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk99aWYodGhpcy5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSl7aWYob3RoZXIuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk9ORSl8fG90aGVyLmVxdWFscyhnb29nLm1hdGguTG9uZy5ORUdfT05FKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRX1lbHNlIGlmKG90aGVyLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuT05FfWVsc2V7dmFyIGhhbGZUaGlzPXRoaXMuc2hpZnRSaWdodCgxKTt2YXIgYXBwcm94PWhhbGZUaGlzLmRpdihvdGhlcikuc2hpZnRMZWZ0KDEpO2lmKGFwcHJveC5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuWkVSTykpe3JldHVybiBvdGhlci5pc05lZ2F0aXZlKCk/Z29vZy5tYXRoLkxvbmcuT05FOmdvb2cubWF0aC5Mb25nLk5FR19PTkV9ZWxzZXt2YXIgcmVtPXRoaXMuc3VidHJhY3Qob3RoZXIubXVsdGlwbHkoYXBwcm94KSk7dmFyIHJlc3VsdD1hcHByb3guYWRkKHJlbS5kaXYob3RoZXIpKTtyZXR1cm4gcmVzdWx0fX19ZWxzZSBpZihvdGhlci5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk99aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKG90aGVyLmlzTmVnYXRpdmUoKSl7cmV0dXJuIHRoaXMubmVnYXRlKCkuZGl2KG90aGVyLm5lZ2F0ZSgpKX1lbHNle3JldHVybiB0aGlzLm5lZ2F0ZSgpLmRpdihvdGhlcikubmVnYXRlKCl9fWVsc2UgaWYob3RoZXIuaXNOZWdhdGl2ZSgpKXtyZXR1cm4gdGhpcy5kaXYob3RoZXIubmVnYXRlKCkpLm5lZ2F0ZSgpfXZhciByZXM9Z29vZy5tYXRoLkxvbmcuWkVSTzt2YXIgcmVtPXRoaXM7d2hpbGUocmVtLmdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikpe3ZhciBhcHByb3g9TWF0aC5tYXgoMSxNYXRoLmZsb29yKHJlbS50b051bWJlcigpL290aGVyLnRvTnVtYmVyKCkpKTt2YXIgbG9nMj1NYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KS9NYXRoLkxOMik7dmFyIGRlbHRhPWxvZzI8PTQ4PzE6TWF0aC5wb3coMixsb2cyLTQ4KTt2YXIgYXBwcm94UmVzPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoYXBwcm94KTt2YXIgYXBwcm94UmVtPWFwcHJveFJlcy5tdWx0aXBseShvdGhlcik7d2hpbGUoYXBwcm94UmVtLmlzTmVnYXRpdmUoKXx8YXBwcm94UmVtLmdyZWF0ZXJUaGFuKHJlbSkpe2FwcHJveC09ZGVsdGE7YXBwcm94UmVzPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoYXBwcm94KTthcHByb3hSZW09YXBwcm94UmVzLm11bHRpcGx5KG90aGVyKX1pZihhcHByb3hSZXMuaXNaZXJvKCkpe2FwcHJveFJlcz1nb29nLm1hdGguTG9uZy5PTkV9cmVzPXJlcy5hZGQoYXBwcm94UmVzKTtyZW09cmVtLnN1YnRyYWN0KGFwcHJveFJlbSl9cmV0dXJuIHJlc30pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5tb2R1bG89KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gdGhpcy5zdWJ0cmFjdCh0aGlzLmRpdihvdGhlcikubXVsdGlwbHkob3RoZXIpKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ub3Q9KGZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKH50aGlzLmxvd18sfnRoaXMuaGlnaF8pfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmFuZD0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyh0aGlzLmxvd18mb3RoZXIubG93Xyx0aGlzLmhpZ2hfJm90aGVyLmhpZ2hfKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5vcj0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyh0aGlzLmxvd198b3RoZXIubG93Xyx0aGlzLmhpZ2hffG90aGVyLmhpZ2hfKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS54b3I9KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHModGhpcy5sb3dfXm90aGVyLmxvd18sdGhpcy5oaWdoX15vdGhlci5oaWdoXyl9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuc2hpZnRMZWZ0PShmdW5jdGlvbihudW1CaXRzKXtudW1CaXRzJj02MztpZihudW1CaXRzPT0wKXtyZXR1cm4gdGhpc31lbHNle3ZhciBsb3c9dGhpcy5sb3dfO2lmKG51bUJpdHM8MzIpe3ZhciBoaWdoPXRoaXMuaGlnaF87cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGxvdzw8bnVtQml0cyxoaWdoPDxudW1CaXRzfGxvdz4+PjMyLW51bUJpdHMpfWVsc2V7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKDAsbG93PDxudW1CaXRzLTMyKX19fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnNoaWZ0UmlnaHQ9KGZ1bmN0aW9uKG51bUJpdHMpe251bUJpdHMmPTYzO2lmKG51bUJpdHM9PTApe3JldHVybiB0aGlzfWVsc2V7dmFyIGhpZ2g9dGhpcy5oaWdoXztpZihudW1CaXRzPDMyKXt2YXIgbG93PXRoaXMubG93XztyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHMobG93Pj4+bnVtQml0c3xoaWdoPDwzMi1udW1CaXRzLGhpZ2g+Pm51bUJpdHMpfWVsc2V7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGhpZ2g+Pm51bUJpdHMtMzIsaGlnaD49MD8wOi0xKX19fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZD0oZnVuY3Rpb24obnVtQml0cyl7bnVtQml0cyY9NjM7aWYobnVtQml0cz09MCl7cmV0dXJuIHRoaXN9ZWxzZXt2YXIgaGlnaD10aGlzLmhpZ2hfO2lmKG51bUJpdHM8MzIpe3ZhciBsb3c9dGhpcy5sb3dfO3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyhsb3c+Pj5udW1CaXRzfGhpZ2g8PDMyLW51bUJpdHMsaGlnaD4+Pm51bUJpdHMpfWVsc2UgaWYobnVtQml0cz09MzIpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyhoaWdoLDApfWVsc2V7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGhpZ2g+Pj5udW1CaXRzLTMyLDApfX19KTt2YXIgbmF2aWdhdG9yPXthcHBOYW1lOiJNb2Rlcm4gQnJvd3NlciJ9O3ZhciBkYml0czt2YXIgY2FuYXJ5PTB4ZGVhZGJlZWZjYWZlO3ZhciBqX2xtPShjYW5hcnkmMTY3NzcyMTUpPT0xNTcxNTA3MDtmdW5jdGlvbiBCaWdJbnRlZ2VyKGEsYixjKXtpZihhIT1udWxsKWlmKCJudW1iZXIiPT10eXBlb2YgYSl0aGlzLmZyb21OdW1iZXIoYSxiLGMpO2Vsc2UgaWYoYj09bnVsbCYmInN0cmluZyIhPXR5cGVvZiBhKXRoaXMuZnJvbVN0cmluZyhhLDI1Nik7ZWxzZSB0aGlzLmZyb21TdHJpbmcoYSxiKX1mdW5jdGlvbiBuYmkoKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCl9ZnVuY3Rpb24gYW0xKGkseCx3LGosYyxuKXt3aGlsZSgtLW4+PTApe3ZhciB2PXgqdGhpc1tpKytdK3dbal0rYztjPU1hdGguZmxvb3Iodi82NzEwODg2NCk7d1tqKytdPXYmNjcxMDg4NjN9cmV0dXJuIGN9ZnVuY3Rpb24gYW0yKGkseCx3LGosYyxuKXt2YXIgeGw9eCYzMjc2Nyx4aD14Pj4xNTt3aGlsZSgtLW4+PTApe3ZhciBsPXRoaXNbaV0mMzI3Njc7dmFyIGg9dGhpc1tpKytdPj4xNTt2YXIgbT14aCpsK2gqeGw7bD14bCpsKygobSYzMjc2Nyk8PDE1KSt3W2pdKyhjJjEwNzM3NDE4MjMpO2M9KGw+Pj4zMCkrKG0+Pj4xNSkreGgqaCsoYz4+PjMwKTt3W2orK109bCYxMDczNzQxODIzfXJldHVybiBjfWZ1bmN0aW9uIGFtMyhpLHgsdyxqLGMsbil7dmFyIHhsPXgmMTYzODMseGg9eD4+MTQ7d2hpbGUoLS1uPj0wKXt2YXIgbD10aGlzW2ldJjE2MzgzO3ZhciBoPXRoaXNbaSsrXT4+MTQ7dmFyIG09eGgqbCtoKnhsO2w9eGwqbCsoKG0mMTYzODMpPDwxNCkrd1tqXStjO2M9KGw+PjI4KSsobT4+MTQpK3hoKmg7d1tqKytdPWwmMjY4NDM1NDU1fXJldHVybiBjfWlmKGpfbG0mJm5hdmlnYXRvci5hcHBOYW1lPT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIil7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0yO2RiaXRzPTMwfWVsc2UgaWYoal9sbSYmbmF2aWdhdG9yLmFwcE5hbWUhPSJOZXRzY2FwZSIpe0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMTtkYml0cz0yNn1lbHNle0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMztkYml0cz0yOH1CaWdJbnRlZ2VyLnByb3RvdHlwZS5EQj1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5ETT0oMTw8ZGJpdHMpLTE7QmlnSW50ZWdlci5wcm90b3R5cGUuRFY9MTw8ZGJpdHM7dmFyIEJJX0ZQPTUyO0JpZ0ludGVnZXIucHJvdG90eXBlLkZWPU1hdGgucG93KDIsQklfRlApO0JpZ0ludGVnZXIucHJvdG90eXBlLkYxPUJJX0ZQLWRiaXRzO0JpZ0ludGVnZXIucHJvdG90eXBlLkYyPTIqZGJpdHMtQklfRlA7dmFyIEJJX1JNPSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiO3ZhciBCSV9SQz1uZXcgQXJyYXk7dmFyIHJyLHZ2O3JyPSIwIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0wO3Z2PD05OysrdnYpQklfUkNbcnIrK109dnY7cnI9ImEiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpQklfUkNbcnIrK109dnY7cnI9IkEiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpQklfUkNbcnIrK109dnY7ZnVuY3Rpb24gaW50MmNoYXIobil7cmV0dXJuIEJJX1JNLmNoYXJBdChuKX1mdW5jdGlvbiBpbnRBdChzLGkpe3ZhciBjPUJJX1JDW3MuY2hhckNvZGVBdChpKV07cmV0dXJuIGM9PW51bGw/LTE6Y31mdW5jdGlvbiBibnBDb3B5VG8ocil7Zm9yKHZhciBpPXRoaXMudC0xO2k+PTA7LS1pKXJbaV09dGhpc1tpXTtyLnQ9dGhpcy50O3Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wRnJvbUludCh4KXt0aGlzLnQ9MTt0aGlzLnM9eDwwPy0xOjA7aWYoeD4wKXRoaXNbMF09eDtlbHNlIGlmKHg8LTEpdGhpc1swXT14K0RWO2Vsc2UgdGhpcy50PTB9ZnVuY3Rpb24gbmJ2KGkpe3ZhciByPW5iaSgpO3IuZnJvbUludChpKTtyZXR1cm4gcn1mdW5jdGlvbiBibnBGcm9tU3RyaW5nKHMsYil7dmFyIGs7aWYoYj09MTYpaz00O2Vsc2UgaWYoYj09OClrPTM7ZWxzZSBpZihiPT0yNTYpaz04O2Vsc2UgaWYoYj09MilrPTE7ZWxzZSBpZihiPT0zMilrPTU7ZWxzZSBpZihiPT00KWs9MjtlbHNle3RoaXMuZnJvbVJhZGl4KHMsYik7cmV0dXJufXRoaXMudD0wO3RoaXMucz0wO3ZhciBpPXMubGVuZ3RoLG1pPWZhbHNlLHNoPTA7d2hpbGUoLS1pPj0wKXt2YXIgeD1rPT04P3NbaV0mMjU1OmludEF0KHMsaSk7aWYoeDwwKXtpZihzLmNoYXJBdChpKT09Ii0iKW1pPXRydWU7Y29udGludWV9bWk9ZmFsc2U7aWYoc2g9PTApdGhpc1t0aGlzLnQrK109eDtlbHNlIGlmKHNoK2s+dGhpcy5EQil7dGhpc1t0aGlzLnQtMV18PSh4JigxPDx0aGlzLkRCLXNoKS0xKTw8c2g7dGhpc1t0aGlzLnQrK109eD4+dGhpcy5EQi1zaH1lbHNlIHRoaXNbdGhpcy50LTFdfD14PDxzaDtzaCs9aztpZihzaD49dGhpcy5EQilzaC09dGhpcy5EQn1pZihrPT04JiYoc1swXSYxMjgpIT0wKXt0aGlzLnM9LTE7aWYoc2g+MCl0aGlzW3RoaXMudC0xXXw9KDE8PHRoaXMuREItc2gpLTE8PHNofXRoaXMuY2xhbXAoKTtpZihtaSlCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX1mdW5jdGlvbiBibnBDbGFtcCgpe3ZhciBjPXRoaXMucyZ0aGlzLkRNO3doaWxlKHRoaXMudD4wJiZ0aGlzW3RoaXMudC0xXT09YyktLXRoaXMudH1mdW5jdGlvbiBiblRvU3RyaW5nKGIpe2lmKHRoaXMuczwwKXJldHVybiItIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGIpO3ZhciBrO2lmKGI9PTE2KWs9NDtlbHNlIGlmKGI9PTgpaz0zO2Vsc2UgaWYoYj09MilrPTE7ZWxzZSBpZihiPT0zMilrPTU7ZWxzZSBpZihiPT00KWs9MjtlbHNlIHJldHVybiB0aGlzLnRvUmFkaXgoYik7dmFyIGttPSgxPDxrKS0xLGQsbT1mYWxzZSxyPSIiLGk9dGhpcy50O3ZhciBwPXRoaXMuREItaSp0aGlzLkRCJWs7aWYoaS0tPjApe2lmKHA8dGhpcy5EQiYmKGQ9dGhpc1tpXT4+cCk+MCl7bT10cnVlO3I9aW50MmNoYXIoZCl9d2hpbGUoaT49MCl7aWYocDxrKXtkPSh0aGlzW2ldJigxPDxwKS0xKTw8ay1wO2R8PXRoaXNbLS1pXT4+KHArPXRoaXMuREItayl9ZWxzZXtkPXRoaXNbaV0+PihwLT1rKSZrbTtpZihwPD0wKXtwKz10aGlzLkRCOy0taX19aWYoZD4wKW09dHJ1ZTtpZihtKXIrPWludDJjaGFyKGQpfX1yZXR1cm4gbT9yOiIwIn1mdW5jdGlvbiBibk5lZ2F0ZSgpe3ZhciByPW5iaSgpO0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHIpO3JldHVybiByfWZ1bmN0aW9uIGJuQWJzKCl7cmV0dXJuIHRoaXMuczwwP3RoaXMubmVnYXRlKCk6dGhpc31mdW5jdGlvbiBibkNvbXBhcmVUbyhhKXt2YXIgcj10aGlzLnMtYS5zO2lmKHIhPTApcmV0dXJuIHI7dmFyIGk9dGhpcy50O3I9aS1hLnQ7aWYociE9MClyZXR1cm4gdGhpcy5zPDA/LXI6cjt3aGlsZSgtLWk+PTApaWYoKHI9dGhpc1tpXS1hW2ldKSE9MClyZXR1cm4gcjtyZXR1cm4gMH1mdW5jdGlvbiBuYml0cyh4KXt2YXIgcj0xLHQ7aWYoKHQ9eD4+PjE2KSE9MCl7eD10O3IrPTE2fWlmKCh0PXg+PjgpIT0wKXt4PXQ7cis9OH1pZigodD14Pj40KSE9MCl7eD10O3IrPTR9aWYoKHQ9eD4+MikhPTApe3g9dDtyKz0yfWlmKCh0PXg+PjEpIT0wKXt4PXQ7cis9MX1yZXR1cm4gcn1mdW5jdGlvbiBibkJpdExlbmd0aCgpe2lmKHRoaXMudDw9MClyZXR1cm4gMDtyZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXnRoaXMucyZ0aGlzLkRNKX1mdW5jdGlvbiBibnBETFNoaWZ0VG8obixyKXt2YXIgaTtmb3IoaT10aGlzLnQtMTtpPj0wOy0taSlyW2krbl09dGhpc1tpXTtmb3IoaT1uLTE7aT49MDstLWkpcltpXT0wO3IudD10aGlzLnQrbjtyLnM9dGhpcy5zfWZ1bmN0aW9uIGJucERSU2hpZnRUbyhuLHIpe2Zvcih2YXIgaT1uO2k8dGhpcy50OysraSlyW2ktbl09dGhpc1tpXTtyLnQ9TWF0aC5tYXgodGhpcy50LW4sMCk7ci5zPXRoaXMuc31mdW5jdGlvbiBibnBMU2hpZnRUbyhuLHIpe3ZhciBicz1uJXRoaXMuREI7dmFyIGNicz10aGlzLkRCLWJzO3ZhciBibT0oMTw8Y2JzKS0xO3ZhciBkcz1NYXRoLmZsb29yKG4vdGhpcy5EQiksYz10aGlzLnM8PGJzJnRoaXMuRE0saTtmb3IoaT10aGlzLnQtMTtpPj0wOy0taSl7cltpK2RzKzFdPXRoaXNbaV0+PmNic3xjO2M9KHRoaXNbaV0mYm0pPDxic31mb3IoaT1kcy0xO2k+PTA7LS1pKXJbaV09MDtyW2RzXT1jO3IudD10aGlzLnQrZHMrMTtyLnM9dGhpcy5zO3IuY2xhbXAoKX1mdW5jdGlvbiBibnBSU2hpZnRUbyhuLHIpe3Iucz10aGlzLnM7dmFyIGRzPU1hdGguZmxvb3Iobi90aGlzLkRCKTtpZihkcz49dGhpcy50KXtyLnQ9MDtyZXR1cm59dmFyIGJzPW4ldGhpcy5EQjt2YXIgY2JzPXRoaXMuREItYnM7dmFyIGJtPSgxPDxicyktMTtyWzBdPXRoaXNbZHNdPj5icztmb3IodmFyIGk9ZHMrMTtpPHRoaXMudDsrK2kpe3JbaS1kcy0xXXw9KHRoaXNbaV0mYm0pPDxjYnM7cltpLWRzXT10aGlzW2ldPj5ic31pZihicz4wKXJbdGhpcy50LWRzLTFdfD0odGhpcy5zJmJtKTw8Y2JzO3IudD10aGlzLnQtZHM7ci5jbGFtcCgpfWZ1bmN0aW9uIGJucFN1YlRvKGEscil7dmFyIGk9MCxjPTAsbT1NYXRoLm1pbihhLnQsdGhpcy50KTt3aGlsZShpPG0pe2MrPXRoaXNbaV0tYVtpXTtyW2krK109YyZ0aGlzLkRNO2M+Pj10aGlzLkRCfWlmKGEudDx0aGlzLnQpe2MtPWEuczt3aGlsZShpPHRoaXMudCl7Yys9dGhpc1tpXTtyW2krK109YyZ0aGlzLkRNO2M+Pj10aGlzLkRCfWMrPXRoaXMuc31lbHNle2MrPXRoaXMuczt3aGlsZShpPGEudCl7Yy09YVtpXTtyW2krK109YyZ0aGlzLkRNO2M+Pj10aGlzLkRCfWMtPWEuc31yLnM9YzwwPy0xOjA7aWYoYzwtMSlyW2krK109dGhpcy5EVitjO2Vsc2UgaWYoYz4wKXJbaSsrXT1jO3IudD1pO3IuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVRvKGEscil7dmFyIHg9dGhpcy5hYnMoKSx5PWEuYWJzKCk7dmFyIGk9eC50O3IudD1pK3kudDt3aGlsZSgtLWk+PTApcltpXT0wO2ZvcihpPTA7aTx5LnQ7KytpKXJbaSt4LnRdPXguYW0oMCx5W2ldLHIsaSwwLHgudCk7ci5zPTA7ci5jbGFtcCgpO2lmKHRoaXMucyE9YS5zKUJpZ0ludGVnZXIuWkVSTy5zdWJUbyhyLHIpfWZ1bmN0aW9uIGJucFNxdWFyZVRvKHIpe3ZhciB4PXRoaXMuYWJzKCk7dmFyIGk9ci50PTIqeC50O3doaWxlKC0taT49MClyW2ldPTA7Zm9yKGk9MDtpPHgudC0xOysraSl7dmFyIGM9eC5hbShpLHhbaV0sciwyKmksMCwxKTtpZigocltpK3gudF0rPXguYW0oaSsxLDIqeFtpXSxyLDIqaSsxLGMseC50LWktMSkpPj14LkRWKXtyW2kreC50XS09eC5EVjtyW2kreC50KzFdPTF9fWlmKHIudD4wKXJbci50LTFdKz14LmFtKGkseFtpXSxyLDIqaSwwLDEpO3Iucz0wO3IuY2xhbXAoKX1mdW5jdGlvbiBibnBEaXZSZW1UbyhtLHEscil7dmFyIHBtPW0uYWJzKCk7aWYocG0udDw9MClyZXR1cm47dmFyIHB0PXRoaXMuYWJzKCk7aWYocHQudDxwbS50KXtpZihxIT1udWxsKXEuZnJvbUludCgwKTtpZihyIT1udWxsKXRoaXMuY29weVRvKHIpO3JldHVybn1pZihyPT1udWxsKXI9bmJpKCk7dmFyIHk9bmJpKCksdHM9dGhpcy5zLG1zPW0uczt2YXIgbnNoPXRoaXMuREItbmJpdHMocG1bcG0udC0xXSk7aWYobnNoPjApe3BtLmxTaGlmdFRvKG5zaCx5KTtwdC5sU2hpZnRUbyhuc2gscil9ZWxzZXtwbS5jb3B5VG8oeSk7cHQuY29weVRvKHIpfXZhciB5cz15LnQ7dmFyIHkwPXlbeXMtMV07aWYoeTA9PTApcmV0dXJuO3ZhciB5dD15MCooMTw8dGhpcy5GMSkrKHlzPjE/eVt5cy0yXT4+dGhpcy5GMjowKTt2YXIgZDE9dGhpcy5GVi95dCxkMj0oMTw8dGhpcy5GMSkveXQsZT0xPDx0aGlzLkYyO3ZhciBpPXIudCxqPWkteXMsdD1xPT1udWxsP25iaSgpOnE7eS5kbFNoaWZ0VG8oaix0KTtpZihyLmNvbXBhcmVUbyh0KT49MCl7cltyLnQrK109MTtyLnN1YlRvKHQscil9QmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKHlzLHQpO3Quc3ViVG8oeSx5KTt3aGlsZSh5LnQ8eXMpeVt5LnQrK109MDt3aGlsZSgtLWo+PTApe3ZhciBxZD1yWy0taV09PXkwP3RoaXMuRE06TWF0aC5mbG9vcihyW2ldKmQxKyhyW2ktMV0rZSkqZDIpO2lmKChyW2ldKz15LmFtKDAscWQscixqLDAseXMpKTxxZCl7eS5kbFNoaWZ0VG8oaix0KTtyLnN1YlRvKHQscik7d2hpbGUocltpXTwtLXFkKXIuc3ViVG8odCxyKX19aWYocSE9bnVsbCl7ci5kclNoaWZ0VG8oeXMscSk7aWYodHMhPW1zKUJpZ0ludGVnZXIuWkVSTy5zdWJUbyhxLHEpfXIudD15cztyLmNsYW1wKCk7aWYobnNoPjApci5yU2hpZnRUbyhuc2gscik7aWYodHM8MClCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKX1mdW5jdGlvbiBibk1vZChhKXt2YXIgcj1uYmkoKTt0aGlzLmFicygpLmRpdlJlbVRvKGEsbnVsbCxyKTtpZih0aGlzLnM8MCYmci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKT4wKWEuc3ViVG8ocixyKTtyZXR1cm4gcn1mdW5jdGlvbiBDbGFzc2ljKG0pe3RoaXMubT1tfWZ1bmN0aW9uIGNDb252ZXJ0KHgpe2lmKHguczwwfHx4LmNvbXBhcmVUbyh0aGlzLm0pPj0wKXJldHVybiB4Lm1vZCh0aGlzLm0pO2Vsc2UgcmV0dXJuIHh9ZnVuY3Rpb24gY1JldmVydCh4KXtyZXR1cm4geH1mdW5jdGlvbiBjUmVkdWNlKHgpe3guZGl2UmVtVG8odGhpcy5tLG51bGwseCl9ZnVuY3Rpb24gY011bFRvKHgseSxyKXt4Lm11bHRpcGx5VG8oeSxyKTt0aGlzLnJlZHVjZShyKX1mdW5jdGlvbiBjU3FyVG8oeCxyKXt4LnNxdWFyZVRvKHIpO3RoaXMucmVkdWNlKHIpfUNsYXNzaWMucHJvdG90eXBlLmNvbnZlcnQ9Y0NvbnZlcnQ7Q2xhc3NpYy5wcm90b3R5cGUucmV2ZXJ0PWNSZXZlcnQ7Q2xhc3NpYy5wcm90b3R5cGUucmVkdWNlPWNSZWR1Y2U7Q2xhc3NpYy5wcm90b3R5cGUubXVsVG89Y011bFRvO0NsYXNzaWMucHJvdG90eXBlLnNxclRvPWNTcXJUbztmdW5jdGlvbiBibnBJbnZEaWdpdCgpe2lmKHRoaXMudDwxKXJldHVybiAwO3ZhciB4PXRoaXNbMF07aWYoKHgmMSk9PTApcmV0dXJuIDA7dmFyIHk9eCYzO3k9eSooMi0oeCYxNSkqeSkmMTU7eT15KigyLSh4JjI1NSkqeSkmMjU1O3k9eSooMi0oKHgmNjU1MzUpKnkmNjU1MzUpKSY2NTUzNTt5PXkqKDIteCp5JXRoaXMuRFYpJXRoaXMuRFY7cmV0dXJuIHk+MD90aGlzLkRWLXk6LXl9ZnVuY3Rpb24gTW9udGdvbWVyeShtKXt0aGlzLm09bTt0aGlzLm1wPW0uaW52RGlnaXQoKTt0aGlzLm1wbD10aGlzLm1wJjMyNzY3O3RoaXMubXBoPXRoaXMubXA+PjE1O3RoaXMudW09KDE8PG0uREItMTUpLTE7dGhpcy5tdDI9MiptLnR9ZnVuY3Rpb24gbW9udENvbnZlcnQoeCl7dmFyIHI9bmJpKCk7eC5hYnMoKS5kbFNoaWZ0VG8odGhpcy5tLnQscik7ci5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxyKTtpZih4LnM8MCYmci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKT4wKXRoaXMubS5zdWJUbyhyLHIpO3JldHVybiByfWZ1bmN0aW9uIG1vbnRSZXZlcnQoeCl7dmFyIHI9bmJpKCk7eC5jb3B5VG8ocik7dGhpcy5yZWR1Y2Uocik7cmV0dXJuIHJ9ZnVuY3Rpb24gbW9udFJlZHVjZSh4KXt3aGlsZSh4LnQ8PXRoaXMubXQyKXhbeC50KytdPTA7Zm9yKHZhciBpPTA7aTx0aGlzLm0udDsrK2kpe3ZhciBqPXhbaV0mMzI3Njc7dmFyIHUwPWoqdGhpcy5tcGwrKChqKnRoaXMubXBoKyh4W2ldPj4xNSkqdGhpcy5tcGwmdGhpcy51bSk8PDE1KSZ4LkRNO2o9aSt0aGlzLm0udDt4W2pdKz10aGlzLm0uYW0oMCx1MCx4LGksMCx0aGlzLm0udCk7d2hpbGUoeFtqXT49eC5EVil7eFtqXS09eC5EVjt4Wysral0rK319eC5jbGFtcCgpO3guZHJTaGlmdFRvKHRoaXMubS50LHgpO2lmKHguY29tcGFyZVRvKHRoaXMubSk+PTApeC5zdWJUbyh0aGlzLm0seCl9ZnVuY3Rpb24gbW9udFNxclRvKHgscil7eC5zcXVhcmVUbyhyKTt0aGlzLnJlZHVjZShyKX1mdW5jdGlvbiBtb250TXVsVG8oeCx5LHIpe3gubXVsdGlwbHlUbyh5LHIpO3RoaXMucmVkdWNlKHIpfU1vbnRnb21lcnkucHJvdG90eXBlLmNvbnZlcnQ9bW9udENvbnZlcnQ7TW9udGdvbWVyeS5wcm90b3R5cGUucmV2ZXJ0PW1vbnRSZXZlcnQ7TW9udGdvbWVyeS5wcm90b3R5cGUucmVkdWNlPW1vbnRSZWR1Y2U7TW9udGdvbWVyeS5wcm90b3R5cGUubXVsVG89bW9udE11bFRvO01vbnRnb21lcnkucHJvdG90eXBlLnNxclRvPW1vbnRTcXJUbztmdW5jdGlvbiBibnBJc0V2ZW4oKXtyZXR1cm4odGhpcy50PjA/dGhpc1swXSYxOnRoaXMucyk9PTB9ZnVuY3Rpb24gYm5wRXhwKGUseil7aWYoZT40Mjk0OTY3Mjk1fHxlPDEpcmV0dXJuIEJpZ0ludGVnZXIuT05FO3ZhciByPW5iaSgpLHIyPW5iaSgpLGc9ei5jb252ZXJ0KHRoaXMpLGk9bmJpdHMoZSktMTtnLmNvcHlUbyhyKTt3aGlsZSgtLWk+PTApe3ouc3FyVG8ocixyMik7aWYoKGUmMTw8aSk+MCl6Lm11bFRvKHIyLGcscik7ZWxzZXt2YXIgdD1yO3I9cjI7cjI9dH19cmV0dXJuIHoucmV2ZXJ0KHIpfWZ1bmN0aW9uIGJuTW9kUG93SW50KGUsbSl7dmFyIHo7aWYoZTwyNTZ8fG0uaXNFdmVuKCkpej1uZXcgQ2xhc3NpYyhtKTtlbHNlIHo9bmV3IE1vbnRnb21lcnkobSk7cmV0dXJuIHRoaXMuZXhwKGUseil9QmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvPWJucENvcHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50PWJucEZyb21JbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZz1ibnBGcm9tU3RyaW5nO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wPWJucENsYW1wO0JpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbz1ibnBETFNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvPWJucERSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbz1ibnBMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbz1ibnBSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbz1ibnBTdWJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvPWJucE11bHRpcGx5VG87QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG89Ym5wU3F1YXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG89Ym5wRGl2UmVtVG87QmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQ9Ym5wSW52RGlnaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuPWJucElzRXZlbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHA9Ym5wRXhwO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nPWJuVG9TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlPWJuTmVnYXRlO0JpZ0ludGVnZXIucHJvdG90eXBlLmFicz1ibkFicztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG89Ym5Db21wYXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoPWJuQml0TGVuZ3RoO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZD1ibk1vZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQ9Ym5Nb2RQb3dJbnQ7QmlnSW50ZWdlci5aRVJPPW5idigwKTtCaWdJbnRlZ2VyLk9ORT1uYnYoMSk7ZnVuY3Rpb24gYm5wRnJvbVJhZGl4KHMsYil7dGhpcy5mcm9tSW50KDApO2lmKGI9PW51bGwpYj0xMDt2YXIgY3M9dGhpcy5jaHVua1NpemUoYik7dmFyIGQ9TWF0aC5wb3coYixjcyksbWk9ZmFsc2Usaj0wLHc9MDtmb3IodmFyIGk9MDtpPHMubGVuZ3RoOysraSl7dmFyIHg9aW50QXQocyxpKTtpZih4PDApe2lmKHMuY2hhckF0KGkpPT0iLSImJnRoaXMuc2lnbnVtKCk9PTApbWk9dHJ1ZTtjb250aW51ZX13PWIqdyt4O2lmKCsraj49Y3Mpe3RoaXMuZE11bHRpcGx5KGQpO3RoaXMuZEFkZE9mZnNldCh3LDApO2o9MDt3PTB9fWlmKGo+MCl7dGhpcy5kTXVsdGlwbHkoTWF0aC5wb3coYixqKSk7dGhpcy5kQWRkT2Zmc2V0KHcsMCl9aWYobWkpQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyl9ZnVuY3Rpb24gYm5wQ2h1bmtTaXplKHIpe3JldHVybiBNYXRoLmZsb29yKE1hdGguTE4yKnRoaXMuREIvTWF0aC5sb2cocikpfWZ1bmN0aW9uIGJuU2lnTnVtKCl7aWYodGhpcy5zPDApcmV0dXJuLTE7ZWxzZSBpZih0aGlzLnQ8PTB8fHRoaXMudD09MSYmdGhpc1swXTw9MClyZXR1cm4gMDtlbHNlIHJldHVybiAxfWZ1bmN0aW9uIGJucERNdWx0aXBseShuKXt0aGlzW3RoaXMudF09dGhpcy5hbSgwLG4tMSx0aGlzLDAsMCx0aGlzLnQpOysrdGhpcy50O3RoaXMuY2xhbXAoKX1mdW5jdGlvbiBibnBEQWRkT2Zmc2V0KG4sdyl7aWYobj09MClyZXR1cm47d2hpbGUodGhpcy50PD13KXRoaXNbdGhpcy50KytdPTA7dGhpc1t3XSs9bjt3aGlsZSh0aGlzW3ddPj10aGlzLkRWKXt0aGlzW3ddLT10aGlzLkRWO2lmKCsrdz49dGhpcy50KXRoaXNbdGhpcy50KytdPTA7Kyt0aGlzW3ddfX1mdW5jdGlvbiBibnBUb1JhZGl4KGIpe2lmKGI9PW51bGwpYj0xMDtpZih0aGlzLnNpZ251bSgpPT0wfHxiPDJ8fGI+MzYpcmV0dXJuIjAiO3ZhciBjcz10aGlzLmNodW5rU2l6ZShiKTt2YXIgYT1NYXRoLnBvdyhiLGNzKTt2YXIgZD1uYnYoYSkseT1uYmkoKSx6PW5iaSgpLHI9IiI7dGhpcy5kaXZSZW1UbyhkLHkseik7d2hpbGUoeS5zaWdudW0oKT4wKXtyPShhK3ouaW50VmFsdWUoKSkudG9TdHJpbmcoYikuc3Vic3RyKDEpK3I7eS5kaXZSZW1UbyhkLHkseil9cmV0dXJuIHouaW50VmFsdWUoKS50b1N0cmluZyhiKStyfWZ1bmN0aW9uIGJuSW50VmFsdWUoKXtpZih0aGlzLnM8MCl7aWYodGhpcy50PT0xKXJldHVybiB0aGlzWzBdLXRoaXMuRFY7ZWxzZSBpZih0aGlzLnQ9PTApcmV0dXJuLTF9ZWxzZSBpZih0aGlzLnQ9PTEpcmV0dXJuIHRoaXNbMF07ZWxzZSBpZih0aGlzLnQ9PTApcmV0dXJuIDA7cmV0dXJuKHRoaXNbMV0mKDE8PDMyLXRoaXMuREIpLTEpPDx0aGlzLkRCfHRoaXNbMF19ZnVuY3Rpb24gYm5wQWRkVG8oYSxyKXt2YXIgaT0wLGM9MCxtPU1hdGgubWluKGEudCx0aGlzLnQpO3doaWxlKGk8bSl7Yys9dGhpc1tpXSthW2ldO3JbaSsrXT1jJnRoaXMuRE07Yz4+PXRoaXMuREJ9aWYoYS50PHRoaXMudCl7Yys9YS5zO3doaWxlKGk8dGhpcy50KXtjKz10aGlzW2ldO3JbaSsrXT1jJnRoaXMuRE07Yz4+PXRoaXMuREJ9Yys9dGhpcy5zfWVsc2V7Yys9dGhpcy5zO3doaWxlKGk8YS50KXtjKz1hW2ldO3JbaSsrXT1jJnRoaXMuRE07Yz4+PXRoaXMuREJ9Yys9YS5zfXIucz1jPDA/LTE6MDtpZihjPjApcltpKytdPWM7ZWxzZSBpZihjPC0xKXJbaSsrXT10aGlzLkRWK2M7ci50PWk7ci5jbGFtcCgpfUJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeD1ibnBGcm9tUmFkaXg7QmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplPWJucENodW5rU2l6ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaWdudW09Ym5TaWdOdW07QmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5PWJucERNdWx0aXBseTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kQWRkT2Zmc2V0PWJucERBZGRPZmZzZXQ7QmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeD1ibnBUb1JhZGl4O0JpZ0ludGVnZXIucHJvdG90eXBlLmludFZhbHVlPWJuSW50VmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG89Ym5wQWRkVG87dmFyIFdyYXBwZXI9e2FiczooZnVuY3Rpb24obCxoKXt2YXIgeD1uZXcgZ29vZy5tYXRoLkxvbmcobCxoKTt2YXIgcmV0O2lmKHguaXNOZWdhdGl2ZSgpKXtyZXQ9eC5uZWdhdGUoKX1lbHNle3JldD14fUhFQVAzMlt0ZW1wRG91YmxlUHRyPj4yXT1yZXQubG93XztIRUFQMzJbdGVtcERvdWJsZVB0cis0Pj4yXT1yZXQuaGlnaF99KSxlbnN1cmVUZW1wczooZnVuY3Rpb24oKXtpZihXcmFwcGVyLmVuc3VyZWRUZW1wcylyZXR1cm47V3JhcHBlci5lbnN1cmVkVGVtcHM9dHJ1ZTtXcmFwcGVyLnR3bzMyPW5ldyBCaWdJbnRlZ2VyO1dyYXBwZXIudHdvMzIuZnJvbVN0cmluZygiNDI5NDk2NzI5NiIsMTApO1dyYXBwZXIudHdvNjQ9bmV3IEJpZ0ludGVnZXI7V3JhcHBlci50d282NC5mcm9tU3RyaW5nKCIxODQ0Njc0NDA3MzcwOTU1MTYxNiIsMTApO1dyYXBwZXIudGVtcDE9bmV3IEJpZ0ludGVnZXI7V3JhcHBlci50ZW1wMj1uZXcgQmlnSW50ZWdlcn0pLGxoMmJpZ251bTooZnVuY3Rpb24obCxoKXt2YXIgYT1uZXcgQmlnSW50ZWdlcjthLmZyb21TdHJpbmcoaC50b1N0cmluZygpLDEwKTt2YXIgYj1uZXcgQmlnSW50ZWdlcjthLm11bHRpcGx5VG8oV3JhcHBlci50d28zMixiKTt2YXIgYz1uZXcgQmlnSW50ZWdlcjtjLmZyb21TdHJpbmcobC50b1N0cmluZygpLDEwKTt2YXIgZD1uZXcgQmlnSW50ZWdlcjtjLmFkZFRvKGIsZCk7cmV0dXJuIGR9KSxzdHJpbmdpZnk6KGZ1bmN0aW9uKGwsaCx1bnNpZ25lZCl7dmFyIHJldD0obmV3IGdvb2cubWF0aC5Mb25nKGwsaCkpLnRvU3RyaW5nKCk7aWYodW5zaWduZWQmJnJldFswXT09Ii0iKXtXcmFwcGVyLmVuc3VyZVRlbXBzKCk7dmFyIGJpZ251bT1uZXcgQmlnSW50ZWdlcjtiaWdudW0uZnJvbVN0cmluZyhyZXQsMTApO3JldD1uZXcgQmlnSW50ZWdlcjtXcmFwcGVyLnR3bzY0LmFkZFRvKGJpZ251bSxyZXQpO3JldD1yZXQudG9TdHJpbmcoMTApfXJldHVybiByZXR9KSxmcm9tU3RyaW5nOihmdW5jdGlvbihzdHIsYmFzZSxtaW4sbWF4LHVuc2lnbmVkKXtXcmFwcGVyLmVuc3VyZVRlbXBzKCk7dmFyIGJpZ251bT1uZXcgQmlnSW50ZWdlcjtiaWdudW0uZnJvbVN0cmluZyhzdHIsYmFzZSk7dmFyIGJpZ21pbj1uZXcgQmlnSW50ZWdlcjtiaWdtaW4uZnJvbVN0cmluZyhtaW4sMTApO3ZhciBiaWdtYXg9bmV3IEJpZ0ludGVnZXI7YmlnbWF4LmZyb21TdHJpbmcobWF4LDEwKTtpZih1bnNpZ25lZCYmYmlnbnVtLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPDApe3ZhciB0ZW1wPW5ldyBCaWdJbnRlZ2VyO2JpZ251bS5hZGRUbyhXcmFwcGVyLnR3bzY0LHRlbXApO2JpZ251bT10ZW1wfXZhciBlcnJvcj1mYWxzZTtpZihiaWdudW0uY29tcGFyZVRvKGJpZ21pbik8MCl7YmlnbnVtPWJpZ21pbjtlcnJvcj10cnVlfWVsc2UgaWYoYmlnbnVtLmNvbXBhcmVUbyhiaWdtYXgpPjApe2JpZ251bT1iaWdtYXg7ZXJyb3I9dHJ1ZX12YXIgcmV0PWdvb2cubWF0aC5Mb25nLmZyb21TdHJpbmcoYmlnbnVtLnRvU3RyaW5nKCkpO0hFQVAzMlt0ZW1wRG91YmxlUHRyPj4yXT1yZXQubG93XztIRUFQMzJbdGVtcERvdWJsZVB0cis0Pj4yXT1yZXQuaGlnaF87aWYoZXJyb3IpdGhyb3cicmFuZ2UgZXJyb3IifSl9O3JldHVybiBXcmFwcGVyfSkoKTtpZihtZW1vcnlJbml0aWFsaXplcil7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERXx8RU5WSVJPTk1FTlRfSVNfU0hFTEwpe3ZhciBkYXRhPU1vZHVsZVsicmVhZEJpbmFyeSJdKG1lbW9yeUluaXRpYWxpemVyKTtIRUFQVTguc2V0KGRhdGEsU1RBVElDX0JBU0UpfWVsc2V7YWRkUnVuRGVwZW5kZW5jeSgibWVtb3J5IGluaXRpYWxpemVyIik7QnJvd3Nlci5hc3luY0xvYWQobWVtb3J5SW5pdGlhbGl6ZXIsKGZ1bmN0aW9uKGRhdGEpe0hFQVBVOC5zZXQoZGF0YSxTVEFUSUNfQkFTRSk7cmVtb3ZlUnVuRGVwZW5kZW5jeSgibWVtb3J5IGluaXRpYWxpemVyIil9KSwoZnVuY3Rpb24oZGF0YSl7dGhyb3ciY291bGQgbm90IGxvYWQgbWVtb3J5IGluaXRpYWxpemVyICIrbWVtb3J5SW5pdGlhbGl6ZXJ9KSl9fWZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiO3RoaXMubWVzc2FnZT0iUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiK3N0YXR1cysiKSI7dGhpcy5zdGF0dXM9c3RhdHVzfUV4aXRTdGF0dXMucHJvdG90eXBlPW5ldyBFcnJvcjtFeGl0U3RhdHVzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FeGl0U3RhdHVzO3ZhciBpbml0aWFsU3RhY2tUb3A7dmFyIHByZWxvYWRTdGFydFRpbWU9bnVsbDt2YXIgY2FsbGVkTWFpbj1mYWxzZTtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9ZnVuY3Rpb24gcnVuQ2FsbGVyKCl7aWYoIU1vZHVsZVsiY2FsbGVkUnVuIl0mJnNob3VsZFJ1bk5vdylydW4oKTtpZighTW9kdWxlWyJjYWxsZWRSdW4iXSlkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtNb2R1bGVbImNhbGxNYWluIl09TW9kdWxlLmNhbGxNYWluPWZ1bmN0aW9uIGNhbGxNYWluKGFyZ3Mpe2Fzc2VydChydW5EZXBlbmRlbmNpZXM9PTAsImNhbm5vdCBjYWxsIG1haW4gd2hlbiBhc3luYyBkZXBlbmRlbmNpZXMgcmVtYWluISAobGlzdGVuIG9uIF9fQVRNQUlOX18pIik7YXNzZXJ0KF9fQVRQUkVSVU5fXy5sZW5ndGg9PTAsImNhbm5vdCBjYWxsIG1haW4gd2hlbiBwcmVSdW4gZnVuY3Rpb25zIHJlbWFpbiB0byBiZSBjYWxsZWQiKTthcmdzPWFyZ3N8fFtdO2Vuc3VyZUluaXRSdW50aW1lKCk7dmFyIGFyZ2M9YXJncy5sZW5ndGgrMTtmdW5jdGlvbiBwYWQoKXtmb3IodmFyIGk9MDtpPDQtMTtpKyspe2FyZ3YucHVzaCgwKX19dmFyIGFyZ3Y9W2FsbG9jYXRlKGludEFycmF5RnJvbVN0cmluZygiL2Jpbi90aGlzLnByb2dyYW0iKSwiaTgiLEFMTE9DX05PUk1BTCldO3BhZCgpO2Zvcih2YXIgaT0wO2k8YXJnYy0xO2k9aSsxKXthcmd2LnB1c2goYWxsb2NhdGUoaW50QXJyYXlGcm9tU3RyaW5nKGFyZ3NbaV0pLCJpOCIsQUxMT0NfTk9STUFMKSk7cGFkKCl9YXJndi5wdXNoKDApO2FyZ3Y9YWxsb2NhdGUoYXJndiwiaTMyIixBTExPQ19OT1JNQUwpO2luaXRpYWxTdGFja1RvcD1TVEFDS1RPUDt0cnl7dmFyIHJldD1Nb2R1bGVbIl9tYWluIl0oYXJnYyxhcmd2LDApO2lmKCFNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSl7ZXhpdChyZXQpfX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgRXhpdFN0YXR1cyl7cmV0dXJufWVsc2UgaWYoZT09IlNpbXVsYXRlSW5maW5pdGVMb29wIil7TW9kdWxlWyJub0V4aXRSdW50aW1lIl09dHJ1ZTtyZXR1cm59ZWxzZXtpZihlJiZ0eXBlb2YgZT09PSJvYmplY3QiJiZlLnN0YWNrKU1vZHVsZS5wcmludEVycigiZXhjZXB0aW9uIHRocm93bjogIitbZSxlLnN0YWNrXSk7dGhyb3cgZX19ZmluYWxseXtjYWxsZWRNYWluPXRydWV9fTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxNb2R1bGVbImFyZ3VtZW50cyJdO2lmKHByZWxvYWRTdGFydFRpbWU9PT1udWxsKXByZWxvYWRTdGFydFRpbWU9RGF0ZS5ub3coKTtpZihydW5EZXBlbmRlbmNpZXM+MCl7TW9kdWxlLnByaW50RXJyKCJydW4oKSBjYWxsZWQsIGJ1dCBkZXBlbmRlbmNpZXMgcmVtYWluLCBzbyBub3QgcnVubmluZyIpO3JldHVybn1wcmVSdW4oKTtpZihydW5EZXBlbmRlbmNpZXM+MClyZXR1cm47aWYoTW9kdWxlWyJjYWxsZWRSdW4iXSlyZXR1cm47ZnVuY3Rpb24gZG9SdW4oKXtpZihNb2R1bGVbImNhbGxlZFJ1biJdKXJldHVybjtNb2R1bGVbImNhbGxlZFJ1biJdPXRydWU7ZW5zdXJlSW5pdFJ1bnRpbWUoKTtwcmVNYWluKCk7aWYoRU5WSVJPTk1FTlRfSVNfV0VCJiZwcmVsb2FkU3RhcnRUaW1lIT09bnVsbCl7TW9kdWxlLnByaW50RXJyKCJwcmUtbWFpbiBwcmVwIHRpbWU6ICIrKERhdGUubm93KCktcHJlbG9hZFN0YXJ0VGltZSkrIiBtcyIpfWlmKE1vZHVsZVsiX21haW4iXSYmc2hvdWxkUnVuTm93KXtNb2R1bGVbImNhbGxNYWluIl0oYXJncyl9cG9zdFJ1bigpfWlmKE1vZHVsZVsic2V0U3RhdHVzIl0pe01vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7TW9kdWxlWyJzZXRTdGF0dXMiXSgiIil9KSwxKTtpZighQUJPUlQpZG9SdW4oKX0pLDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlWyJydW4iXT1Nb2R1bGUucnVuPXJ1bjtmdW5jdGlvbiBleGl0KHN0YXR1cyl7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPXN0YXR1cztTVEFDS1RPUD1pbml0aWFsU3RhY2tUb3A7ZXhpdFJ1bnRpbWUoKTt0aHJvdyBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpfU1vZHVsZVsiZXhpdCJdPU1vZHVsZS5leGl0PWV4aXQ7ZnVuY3Rpb24gYWJvcnQodGV4dCl7aWYodGV4dCl7TW9kdWxlLnByaW50KHRleHQpO01vZHVsZS5wcmludEVycih0ZXh0KX1BQk9SVD10cnVlO0VYSVRTVEFUVVM9MTt2YXIgZXh0cmE9IlxuSWYgdGhpcyBhYm9ydCgpIGlzIHVuZXhwZWN0ZWQsIGJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIHdoaWNoIGNhbiBnaXZlIG1vcmUgaW5mb3JtYXRpb24uIjt0aHJvdyJhYm9ydCgpIGF0ICIrc3RhY2tUcmFjZSgpK2V4dHJhfU1vZHVsZVsiYWJvcnQiXT1Nb2R1bGUuYWJvcnQ9YWJvcnQ7dmFyIEludGVybmFsRXJyb3I9TW9kdWxlWyJJbnRlcm5hbEVycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIkludGVybmFsRXJyb3IiKTt2YXIgQmluZGluZ0Vycm9yPU1vZHVsZVsiQmluZGluZ0Vycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIkJpbmRpbmdFcnJvciIpO3ZhciBVbmJvdW5kVHlwZUVycm9yPU1vZHVsZVsiVW5ib3VuZFR5cGVFcnJvciJdPWV4dGVuZEVycm9yKEJpbmRpbmdFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpO3ZhciBQdXJlVmlydHVhbEVycm9yPU1vZHVsZVsiUHVyZVZpcnR1YWxFcnJvciJdPWV4dGVuZEVycm9yKEJpbmRpbmdFcnJvciwiUHVyZVZpcnR1YWxFcnJvciIpO2Z1bmN0aW9uIHRocm93SW50ZXJuYWxFcnJvcihtZXNzYWdlKXt0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihtZXNzYWdlKX1mdW5jdGlvbiB0aHJvd0JpbmRpbmdFcnJvcihtZXNzYWdlKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKG1lc3NhZ2UpfWZ1bmN0aW9uIHRocm93VW5ib3VuZFR5cGVFcnJvcihtZXNzYWdlLHR5cGVzKXt2YXIgdW5ib3VuZFR5cGVzPVtdO3ZhciBzZWVuPXt9O2Z1bmN0aW9uIHZpc2l0KHR5cGUpe2lmKHNlZW5bdHlwZV0pe3JldHVybn1pZihyZWdpc3RlcmVkVHlwZXNbdHlwZV0pe3JldHVybn1pZih0eXBlRGVwZW5kZW5jaWVzW3R5cGVdKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdLmZvckVhY2godmlzaXQpO3JldHVybn11bmJvdW5kVHlwZXMucHVzaCh0eXBlKTtzZWVuW3R5cGVdPXRydWV9dHlwZXMuZm9yRWFjaCh2aXNpdCk7dGhyb3cgbmV3IFVuYm91bmRUeXBlRXJyb3IobWVzc2FnZSsiOiAiK3VuYm91bmRUeXBlcy5tYXAoZ2V0VHlwZU5hbWUpLmpvaW4oWyIsICJdKSl9ZnVuY3Rpb24gZW5zdXJlT3ZlcmxvYWRUYWJsZShwcm90byxtZXRob2ROYW1lLGh1bWFuTmFtZSl7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7dmFyIHByZXZGdW5jPXByb3RvW21ldGhvZE5hbWVdO3Byb3RvW21ldGhvZE5hbWVdPShmdW5jdGlvbigpe2lmKCFwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGFyZ3VtZW50cy5sZW5ndGgpKXt0aHJvd0JpbmRpbmdFcnJvcigiRnVuY3Rpb24gJyIraHVtYW5OYW1lKyInIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIithcmd1bWVudHMubGVuZ3RoKyIpIC0gZXhwZWN0cyBvbmUgb2YgKCIrcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSsiKSEiKX1yZXR1cm4gcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVthcmd1bWVudHMubGVuZ3RoXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlPVtdO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbcHJldkZ1bmMuYXJnQ291bnRdPXByZXZGdW5jfX1mdW5jdGlvbiBleHBvc2VQdWJsaWNTeW1ib2wobmFtZSx2YWx1ZSxudW1Bcmd1bWVudHMpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7aWYodW5kZWZpbmVkPT09bnVtQXJndW1lbnRzfHx1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZSYmdW5kZWZpbmVkIT09TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBwdWJsaWMgbmFtZSAnIituYW1lKyInIHR3aWNlIil9ZW5zdXJlT3ZlcmxvYWRUYWJsZShNb2R1bGUsbmFtZSxuYW1lKTtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkobnVtQXJndW1lbnRzKSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBvdmVybG9hZHMgb2YgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgKCIrbnVtQXJndW1lbnRzKyIpISIpfU1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlW251bUFyZ3VtZW50c109dmFsdWV9ZWxzZXtNb2R1bGVbbmFtZV09dmFsdWU7aWYodW5kZWZpbmVkIT09bnVtQXJndW1lbnRzKXtNb2R1bGVbbmFtZV0ubnVtQXJndW1lbnRzPW51bUFyZ3VtZW50c319fWZ1bmN0aW9uIHJlcGxhY2VQdWJsaWNTeW1ib2wobmFtZSx2YWx1ZSxudW1Bcmd1bWVudHMpe2lmKCFNb2R1bGUuaGFzT3duUHJvcGVydHkobmFtZSkpe3Rocm93SW50ZXJuYWxFcnJvcigiUmVwbGFjaW5nIG5vbmV4aXN0YW50IHB1YmxpYyBzeW1ib2wiKX1pZih1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZSYmdW5kZWZpbmVkIT09bnVtQXJndW1lbnRzKXtNb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZVtudW1Bcmd1bWVudHNdPXZhbHVlfWVsc2V7TW9kdWxlW25hbWVdPXZhbHVlfX1mdW5jdGlvbiBleHRlbmRFcnJvcihiYXNlRXJyb3JUeXBlLGVycm9yTmFtZSl7dmFyIGVycm9yQ2xhc3M9Y3JlYXRlTmFtZWRGdW5jdGlvbihlcnJvck5hbWUsKGZ1bmN0aW9uKG1lc3NhZ2Upe3RoaXMubmFtZT1lcnJvck5hbWU7dGhpcy5tZXNzYWdlPW1lc3NhZ2U7dmFyIHN0YWNrPShuZXcgRXJyb3IobWVzc2FnZSkpLnN0YWNrO2lmKHN0YWNrIT09dW5kZWZpbmVkKXt0aGlzLnN0YWNrPXRoaXMudG9TdHJpbmcoKSsiXG4iK3N0YWNrLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpfX0pKTtlcnJvckNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGJhc2VFcnJvclR5cGUucHJvdG90eXBlKTtlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lcnJvckNsYXNzO2Vycm9yQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPShmdW5jdGlvbigpe2lmKHRoaXMubWVzc2FnZT09PXVuZGVmaW5lZCl7cmV0dXJuIHRoaXMubmFtZX1lbHNle3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9fSk7cmV0dXJuIGVycm9yQ2xhc3N9ZnVuY3Rpb24gY3JlYXRlTmFtZWRGdW5jdGlvbihuYW1lLGJvZHkpe25hbWU9bWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpO3JldHVybihuZXcgRnVuY3Rpb24oImJvZHkiLCJyZXR1cm4gZnVuY3Rpb24gIituYW1lKyIoKSB7XG4iKycgICAgInVzZSBzdHJpY3QiOycrIiAgICByZXR1cm4gYm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuIisifTtcbiIpKShib2R5KX1mdW5jdGlvbiBfZW1iaW5kX3JlcHIodil7dmFyIHQ9dHlwZW9mIHY7aWYodD09PSJvYmplY3QifHx0PT09ImFycmF5Inx8dD09PSJmdW5jdGlvbiIpe3JldHVybiB2LnRvU3RyaW5nKCl9ZWxzZXtyZXR1cm4iIit2fX12YXIgcmVnaXN0ZXJlZEluc3RhbmNlcz17fTtmdW5jdGlvbiBnZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpe2lmKHB0cj09PXVuZGVmaW5lZCl7dGhyb3dCaW5kaW5nRXJyb3IoInB0ciBzaG91bGQgbm90IGJlIHVuZGVmaW5lZCIpfXdoaWxlKGNsYXNzXy5iYXNlQ2xhc3Mpe3B0cj1jbGFzc18udXBjYXN0KHB0cik7Y2xhc3NfPWNsYXNzXy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiByZWdpc3RlckluaGVyaXRlZEluc3RhbmNlKGNsYXNzXyxwdHIsaW5zdGFuY2Upe3B0cj1nZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpO2lmKHJlZ2lzdGVyZWRJbnN0YW5jZXMuaGFzT3duUHJvcGVydHkocHRyKSl7dGhyb3dCaW5kaW5nRXJyb3IoIlRyaWVkIHRvIHJlZ2lzdGVyIHJlZ2lzdGVyZWQgaW5zdGFuY2U6ICIrcHRyKX1lbHNle3JlZ2lzdGVyZWRJbnN0YW5jZXNbcHRyXT1pbnN0YW5jZX19ZnVuY3Rpb24gdW5yZWdpc3RlckluaGVyaXRlZEluc3RhbmNlKGNsYXNzXyxwdHIpe3B0cj1nZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpO2lmKHJlZ2lzdGVyZWRJbnN0YW5jZXMuaGFzT3duUHJvcGVydHkocHRyKSl7ZGVsZXRlIHJlZ2lzdGVyZWRJbnN0YW5jZXNbcHRyXX1lbHNle3Rocm93QmluZGluZ0Vycm9yKCJUcmllZCB0byB1bnJlZ2lzdGVyIHVucmVnaXN0ZXJlZCBpbnN0YW5jZTogIitwdHIpfX1mdW5jdGlvbiBnZXRJbmhlcml0ZWRJbnN0YW5jZShjbGFzc18scHRyKXtwdHI9Z2V0QmFzZXN0UG9pbnRlcihjbGFzc18scHRyKTtyZXR1cm4gcmVnaXN0ZXJlZEluc3RhbmNlc1twdHJdfWZ1bmN0aW9uIGdldEluaGVyaXRlZEluc3RhbmNlQ291bnQoKXtyZXR1cm4gT2JqZWN0LmtleXMocmVnaXN0ZXJlZEluc3RhbmNlcykubGVuZ3RofU1vZHVsZVsiZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudCJdPWdldEluaGVyaXRlZEluc3RhbmNlQ291bnQ7ZnVuY3Rpb24gZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcygpe3ZhciBydj1bXTtmb3IodmFyIGsgaW4gcmVnaXN0ZXJlZEluc3RhbmNlcyl7aWYocmVnaXN0ZXJlZEluc3RhbmNlcy5oYXNPd25Qcm9wZXJ0eShrKSl7cnYucHVzaChyZWdpc3RlcmVkSW5zdGFuY2VzW2tdKX19cmV0dXJuIHJ2fU1vZHVsZVsiZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcyJdPWdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM7dmFyIHJlZ2lzdGVyZWRUeXBlcz17fTt2YXIgYXdhaXRpbmdEZXBlbmRlbmNpZXM9e307dmFyIHR5cGVEZXBlbmRlbmNpZXM9e307dmFyIHJlZ2lzdGVyZWRQb2ludGVycz17fTtmdW5jdGlvbiByZWdpc3RlclR5cGUocmF3VHlwZSxyZWdpc3RlcmVkSW5zdGFuY2Upe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHJlZ2lzdGVyZWRJbnN0YW5jZSkpe3Rocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKX12YXIgbmFtZT1yZWdpc3RlcmVkSW5zdGFuY2UubmFtZTtpZighcmF3VHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoJ3R5cGUgIicrbmFtZSsnIiBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHR5cGVpZCBwb2ludGVyJyl9aWYocmVnaXN0ZXJlZFR5cGVzLmhhc093blByb3BlcnR5KHJhd1R5cGUpKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHR5cGUgJyIrbmFtZSsiJyB0d2ljZSIpfXJlZ2lzdGVyZWRUeXBlc1tyYXdUeXBlXT1yZWdpc3RlcmVkSW5zdGFuY2U7ZGVsZXRlIHR5cGVEZXBlbmRlbmNpZXNbcmF3VHlwZV07aWYoYXdhaXRpbmdEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocmF3VHlwZSkpe3ZhciBjYWxsYmFja3M9YXdhaXRpbmdEZXBlbmRlbmNpZXNbcmF3VHlwZV07ZGVsZXRlIGF3YWl0aW5nRGVwZW5kZW5jaWVzW3Jhd1R5cGVdO2NhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbihjYil7Y2IoKX0pKX19ZnVuY3Rpb24gd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQobXlUeXBlcyxkZXBlbmRlbnRUeXBlcyxnZXRUeXBlQ29udmVydGVycyl7bXlUeXBlcy5mb3JFYWNoKChmdW5jdGlvbih0eXBlKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdPWRlcGVuZGVudFR5cGVzfSkpO2Z1bmN0aW9uIG9uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpe3ZhciBteVR5cGVDb252ZXJ0ZXJzPWdldFR5cGVDb252ZXJ0ZXJzKHR5cGVDb252ZXJ0ZXJzKTtpZihteVR5cGVDb252ZXJ0ZXJzLmxlbmd0aCE9PW15VHlwZXMubGVuZ3RoKXt0aHJvd0ludGVybmFsRXJyb3IoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKX1mb3IodmFyIGk9MDtpPG15VHlwZXMubGVuZ3RoOysraSl7cmVnaXN0ZXJUeXBlKG15VHlwZXNbaV0sbXlUeXBlQ29udmVydGVyc1tpXSl9fXZhciB0eXBlQ29udmVydGVycz1uZXcgQXJyYXkoZGVwZW5kZW50VHlwZXMubGVuZ3RoKTt2YXIgdW5yZWdpc3RlcmVkVHlwZXM9W107dmFyIHJlZ2lzdGVyZWQ9MDtkZXBlbmRlbnRUeXBlcy5mb3JFYWNoKChmdW5jdGlvbihkdCxpKXtpZihyZWdpc3RlcmVkVHlwZXMuaGFzT3duUHJvcGVydHkoZHQpKXt0eXBlQ29udmVydGVyc1tpXT1yZWdpc3RlcmVkVHlwZXNbZHRdfWVsc2V7dW5yZWdpc3RlcmVkVHlwZXMucHVzaChkdCk7aWYoIWF3YWl0aW5nRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KGR0KSl7YXdhaXRpbmdEZXBlbmRlbmNpZXNbZHRdPVtdfWF3YWl0aW5nRGVwZW5kZW5jaWVzW2R0XS5wdXNoKChmdW5jdGlvbigpe3R5cGVDb252ZXJ0ZXJzW2ldPXJlZ2lzdGVyZWRUeXBlc1tkdF07KytyZWdpc3RlcmVkO2lmKHJlZ2lzdGVyZWQ9PT11bnJlZ2lzdGVyZWRUeXBlcy5sZW5ndGgpe29uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpfX0pKX19KSk7aWYoMD09PXVucmVnaXN0ZXJlZFR5cGVzLmxlbmd0aCl7b25Db21wbGV0ZSh0eXBlQ29udmVydGVycyl9fXZhciBfX2NoYXJDb2Rlcz0oZnVuY3Rpb24oKXt2YXIgY29kZXM9bmV3IEFycmF5KDI1Nik7Zm9yKHZhciBpPTA7aTwyNTY7KytpKXtjb2Rlc1tpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfXJldHVybiBjb2Rlc30pKCk7ZnVuY3Rpb24gcmVhZExhdGluMVN0cmluZyhwdHIpe3ZhciByZXQ9IiI7dmFyIGM9cHRyO3doaWxlKEhFQVBVOFtjXSl7cmV0Kz1fX2NoYXJDb2Rlc1tIRUFQVThbYysrXV19cmV0dXJuIHJldH1mdW5jdGlvbiBnZXRUeXBlTmFtZSh0eXBlKXt2YXIgcHRyPV9fX2dldFR5cGVOYW1lKHR5cGUpO3ZhciBydj1yZWFkTGF0aW4xU3RyaW5nKHB0cik7X2ZyZWUocHRyKTtyZXR1cm4gcnZ9ZnVuY3Rpb24gaGVhcDMyVmVjdG9yVG9BcnJheShjb3VudCxmaXJzdEVsZW1lbnQpe3ZhciBhcnJheT1bXTtmb3IodmFyIGk9MDtpPGNvdW50O2krKyl7YXJyYXkucHVzaChIRUFQMzJbKGZpcnN0RWxlbWVudD4+MikraV0pfXJldHVybiBhcnJheX1mdW5jdGlvbiByZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmF3VHlwZSxodW1hbk5hbWUpe3ZhciBpbXBsPXJlZ2lzdGVyZWRUeXBlc1tyYXdUeXBlXTtpZih1bmRlZmluZWQ9PT1pbXBsKXt0aHJvd0JpbmRpbmdFcnJvcihodW1hbk5hbWUrIiBoYXMgdW5rbm93biB0eXBlICIrZ2V0VHlwZU5hbWUocmF3VHlwZSkpfXJldHVybiBpbXBsfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3ZvaWQocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiYXJnUGFja0FkdmFuY2UiOjAsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKCl7cmV0dXJuIHVuZGVmaW5lZH0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7cmV0dXJuIHVuZGVmaW5lZH0pfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfYm9vbChyYXdUeXBlLG5hbWUsc2l6ZSx0cnVlVmFsdWUsZmFsc2VWYWx1ZSl7dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKHd0KXtyZXR1cm4hIXd0fSksInRvV2lyZVR5cGUiOihmdW5jdGlvbihkZXN0cnVjdG9ycyxvKXtyZXR1cm4gbz90cnVlVmFsdWU6ZmFsc2VWYWx1ZX0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOihmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcDtpZihzaXplPT09MSl7aGVhcD1IRUFQOH1lbHNlIGlmKHNpemU9PT0yKXtoZWFwPUhFQVAxNn1lbHNlIGlmKHNpemU9PT00KXtoZWFwPUhFQVAzMn1lbHNle3Rocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gYm9vbGVhbiB0eXBlIHNpemU6ICIrbmFtZSl9cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+c2hpZnRdKX0pLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gZ2V0U2hpZnRGcm9tU2l6ZShzaXplKXtzd2l0Y2goc2l6ZSl7Y2FzZSAxOnJldHVybiAwO2Nhc2UgMjpyZXR1cm4gMTtjYXNlIDQ6cmV0dXJuIDI7Y2FzZSA4OnJldHVybiAzO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB0eXBlIHNpemU6ICIrc2l6ZSl9fWZ1bmN0aW9uIGludGVnZXJSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LHNpZ25lZCl7c3dpdGNoKHNoaWZ0KXtjYXNlIDA6cmV0dXJuKGZ1bmN0aW9uKHBvaW50ZXIpe3ZhciBoZWFwPXNpZ25lZD9IRUFQODpIRUFQVTg7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcl0pfSk7Y2FzZSAxOnJldHVybihmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDE2OkhFQVBVMTY7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+MV0pfSk7Y2FzZSAyOnJldHVybihmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDMyOkhFQVBVMzI7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+Ml0pfSk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGludGVnZXIgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gZmxvYXRSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0KXtzd2l0Y2goc2hpZnQpe2Nhc2UgMjpyZXR1cm4oZnVuY3Rpb24ocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBGMzJbcG9pbnRlcj4+Ml0pfSk7Y2FzZSAzOnJldHVybihmdW5jdGlvbihwb2ludGVyKXtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oSEVBUEY2NFtwb2ludGVyPj4zXSl9KTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZmxvYXQgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcihwcmltaXRpdmVUeXBlLG5hbWUsc2l6ZSxtaW5SYW5nZSxtYXhSYW5nZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO2lmKG1heFJhbmdlPT09LTEpe21heFJhbmdlPTQyOTQ5NjcyOTV9dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7cmVnaXN0ZXJUeXBlKHByaW1pdGl2ZVR5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZX0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe2lmKHR5cGVvZiB2YWx1ZSE9PSJudW1iZXIiJiZ0eXBlb2YgdmFsdWUhPT0iYm9vbGVhbiIpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK19lbWJpbmRfcmVwcih2YWx1ZSkrJyIgdG8gJyt0aGlzLm5hbWUpfWlmKHZhbHVlPG1pblJhbmdlfHx2YWx1ZT5tYXhSYW5nZSl7dGhyb3cgbmV3IFR5cGVFcnJvcignUGFzc2luZyBhIG51bWJlciAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIGZyb20gSlMgc2lkZSB0byBDL0MrKyBzaWRlIHRvIGFuIGFyZ3VtZW50IG9mIHR5cGUgIicrbmFtZSsnIiwgd2hpY2ggaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UgWycrbWluUmFuZ2UrIiwgIittYXhSYW5nZSsiXSEiKX1yZXR1cm4gdmFsdWV8MH0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmludGVnZXJSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LG1pblJhbmdlIT09MCksZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdChyYXdUeXBlLG5hbWUsc2l6ZSl7dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWV9KSwidG9XaXJlVHlwZSI6KGZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtpZih0eXBlb2YgdmFsdWUhPT0ibnVtYmVyIiYmdHlwZW9mIHZhbHVlIT09ImJvb2xlYW4iKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIHRvICcrdGhpcy5uYW1lKX1yZXR1cm4gdmFsdWV9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpmbG9hdFJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gc2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBVMzJbcG9pbnRlcj4+Ml0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24odmFsdWUpe3ZhciBsZW5ndGg9SEVBUFUzMlt2YWx1ZT4+Ml07dmFyIGE9bmV3IEFycmF5KGxlbmd0aCk7Zm9yKHZhciBpPTA7aTxsZW5ndGg7KytpKXthW2ldPVN0cmluZy5mcm9tQ2hhckNvZGUoSEVBUFU4W3ZhbHVlKzQraV0pfV9mcmVlKHZhbHVlKTtyZXR1cm4gYS5qb2luKCIiKX0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe2lmKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe3ZhbHVlPW5ldyBVaW50OEFycmF5KHZhbHVlKX1mdW5jdGlvbiBnZXRUQUVsZW1lbnQodGEsaW5kZXgpe3JldHVybiB0YVtpbmRleF19ZnVuY3Rpb24gZ2V0U3RyaW5nRWxlbWVudChzdHJpbmcsaW5kZXgpe3JldHVybiBzdHJpbmcuY2hhckNvZGVBdChpbmRleCl9dmFyIGdldEVsZW1lbnQ7aWYodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtnZXRFbGVtZW50PWdldFRBRWxlbWVudH1lbHNlIGlmKHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5KXtnZXRFbGVtZW50PWdldFRBRWxlbWVudH1lbHNlIGlmKHR5cGVvZiB2YWx1ZT09PSJzdHJpbmciKXtnZXRFbGVtZW50PWdldFN0cmluZ0VsZW1lbnR9ZWxzZXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBzdGQ6OnN0cmluZyIpfXZhciBsZW5ndGg9dmFsdWUubGVuZ3RoO3ZhciBwdHI9X21hbGxvYyg0K2xlbmd0aCk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aDtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe3ZhciBjaGFyQ29kZT1nZXRFbGVtZW50KHZhbHVlLGkpO2lmKGNoYXJDb2RlPjI1NSl7X2ZyZWUocHRyKTt0aHJvd0JpbmRpbmdFcnJvcigiU3RyaW5nIGhhcyBVVEYtMTYgY29kZSB1bml0cyB0aGF0IGRvIG5vdCBmaXQgaW4gOCBiaXRzIil9SEVBUFU4W3B0cis0K2ldPWNoYXJDb2RlfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpzaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcixkZXN0cnVjdG9yRnVuY3Rpb246KGZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX0pfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcocmF3VHlwZSxjaGFyU2l6ZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7dmFyIEhFQVAsc2hpZnQ7aWYoY2hhclNpemU9PT0yKXtIRUFQPUhFQVBVMTY7c2hpZnQ9MX1lbHNlIGlmKGNoYXJTaXplPT09NCl7SEVBUD1IRUFQVTMyO3NoaWZ0PTJ9cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24odmFsdWUpe3ZhciBsZW5ndGg9SEVBUFUzMlt2YWx1ZT4+Ml07dmFyIGE9bmV3IEFycmF5KGxlbmd0aCk7dmFyIHN0YXJ0PXZhbHVlKzQ+PnNoaWZ0O2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7YVtpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKEhFQVBbc3RhcnQraV0pfV9mcmVlKHZhbHVlKTtyZXR1cm4gYS5qb2luKCIiKX0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe3ZhciBsZW5ndGg9dmFsdWUubGVuZ3RoO3ZhciBwdHI9X21hbGxvYyg0K2xlbmd0aCpjaGFyU2l6ZSk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aDt2YXIgc3RhcnQ9cHRyKzQ+PnNoaWZ0O2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7SEVBUFtzdGFydCtpXT12YWx1ZS5jaGFyQ29kZUF0KGkpfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpzaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcixkZXN0cnVjdG9yRnVuY3Rpb246KGZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX0pfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW12YWwocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24oaGFuZGxlKXt2YXIgcnY9X2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlO19fZW12YWxfZGVjcmVmKGhhbmRsZSk7cmV0dXJuIHJ2fSksInRvV2lyZVR5cGUiOihmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIodmFsdWUpfSksImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldyhyYXdUeXBlLG5hbWUpe3ZhciB0eXBlTWFwcGluZz1bSW50OEFycmF5LFVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXldO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOihmdW5jdGlvbihoYW5kbGUpe3ZhciB0eXBlPUhFQVBVMzJbaGFuZGxlPj4yXTt2YXIgc2l6ZT1IRUFQVTMyWyhoYW5kbGU+PjIpKzFdO3ZhciBkYXRhPUhFQVBVMzJbKGhhbmRsZT4+MikrMl07dmFyIFRBPXR5cGVNYXBwaW5nW3R5cGVdO3JldHVybiBuZXcgVEEoSEVBUDguYnVmZmVyLGRhdGEsc2l6ZSl9KSwiYXJnUGFja0FkdmFuY2UiOjE2LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6KGZ1bmN0aW9uKHB0cil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKHB0cil9KX0pfWZ1bmN0aW9uIHJ1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKXt3aGlsZShkZXN0cnVjdG9ycy5sZW5ndGgpe3ZhciBwdHI9ZGVzdHJ1Y3RvcnMucG9wKCk7dmFyIGRlbD1kZXN0cnVjdG9ycy5wb3AoKTtkZWwocHRyKX19ZnVuY3Rpb24gbmV3Xyhjb25zdHJ1Y3Rvcixhcmd1bWVudExpc3Qpe2lmKCEoY29uc3RydWN0b3IgaW5zdGFuY2VvZiBGdW5jdGlvbikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIm5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAiK3R5cGVvZiBjb25zdHJ1Y3RvcisiIHdoaWNoIGlzIG5vdCBhIGZ1bmN0aW9uIil9dmFyIGR1bW15PWNyZWF0ZU5hbWVkRnVuY3Rpb24oY29uc3RydWN0b3IubmFtZSwoZnVuY3Rpb24oKXt9KSk7ZHVtbXkucHJvdG90eXBlPWNvbnN0cnVjdG9yLnByb3RvdHlwZTt2YXIgb2JqPW5ldyBkdW1teTt2YXIgcj1jb25zdHJ1Y3Rvci5hcHBseShvYmosYXJndW1lbnRMaXN0KTtyZXR1cm4gciBpbnN0YW5jZW9mIE9iamVjdD9yOm9ian1mdW5jdGlvbiBjcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLGNwcEludm9rZXJGdW5jLGNwcFRhcmdldEZ1bmMpe3ZhciBhcmdDb3VudD1hcmdUeXBlcy5sZW5ndGg7aWYoYXJnQ291bnQ8Mil7dGhyb3dCaW5kaW5nRXJyb3IoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpfXZhciBpc0NsYXNzTWV0aG9kRnVuYz1hcmdUeXBlc1sxXSE9PW51bGwmJmNsYXNzVHlwZSE9PW51bGw7dmFyIGFyZ3NMaXN0PSIiO3ZhciBhcmdzTGlzdFdpcmVkPSIiO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMjsrK2kpe2FyZ3NMaXN0Kz0oaSE9PTA/IiwgIjoiIikrImFyZyIraTthcmdzTGlzdFdpcmVkKz0oaSE9PTA/IiwgIjoiIikrImFyZyIraSsiV2lyZWQifXZhciBpbnZva2VyRm5Cb2R5PSJyZXR1cm4gZnVuY3Rpb24gIittYWtlTGVnYWxGdW5jdGlvbk5hbWUoaHVtYW5OYW1lKSsiKCIrYXJnc0xpc3QrIikge1xuIisiaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09ICIrKGFyZ0NvdW50LTIpKyIpIHtcbiIrInRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAiK2h1bWFuTmFtZSsiIGNhbGxlZCB3aXRoICcgKyBhcmd1bWVudHMubGVuZ3RoICsgJyBhcmd1bWVudHMsIGV4cGVjdGVkICIrKGFyZ0NvdW50LTIpKyIgYXJncyEnKTtcbiIrIn1cbiI7dmFyIG5lZWRzRGVzdHJ1Y3RvclN0YWNrPWZhbHNlO2Zvcih2YXIgaT0xO2k8YXJnVHlwZXMubGVuZ3RoOysraSl7aWYoYXJnVHlwZXNbaV0hPT1udWxsJiZhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb249PT11bmRlZmluZWQpe25lZWRzRGVzdHJ1Y3RvclN0YWNrPXRydWU7YnJlYWt9fWlmKG5lZWRzRGVzdHJ1Y3RvclN0YWNrKXtpbnZva2VyRm5Cb2R5Kz0idmFyIGRlc3RydWN0b3JzID0gW107XG4ifXZhciBkdG9yU3RhY2s9bmVlZHNEZXN0cnVjdG9yU3RhY2s/ImRlc3RydWN0b3JzIjoibnVsbCI7dmFyIGFyZ3MxPVsidGhyb3dCaW5kaW5nRXJyb3IiLCJpbnZva2VyIiwiZm4iLCJydW5EZXN0cnVjdG9ycyIsInJldFR5cGUiLCJjbGFzc1BhcmFtIl07dmFyIGFyZ3MyPVt0aHJvd0JpbmRpbmdFcnJvcixjcHBJbnZva2VyRnVuYyxjcHBUYXJnZXRGdW5jLHJ1bkRlc3RydWN0b3JzLGFyZ1R5cGVzWzBdLGFyZ1R5cGVzWzFdXTtpZihpc0NsYXNzTWV0aG9kRnVuYyl7aW52b2tlckZuQm9keSs9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtLnRvV2lyZVR5cGUoIitkdG9yU3RhY2srIiwgdGhpcyk7XG4ifWZvcih2YXIgaT0wO2k8YXJnQ291bnQtMjsrK2kpe2ludm9rZXJGbkJvZHkrPSJ2YXIgYXJnIitpKyJXaXJlZCA9IGFyZ1R5cGUiK2krIi50b1dpcmVUeXBlKCIrZHRvclN0YWNrKyIsIGFyZyIraSsiKTsgLy8gIithcmdUeXBlc1tpKzJdLm5hbWUrIlxuIjthcmdzMS5wdXNoKCJhcmdUeXBlIitpKTthcmdzMi5wdXNoKGFyZ1R5cGVzW2krMl0pfWlmKGlzQ2xhc3NNZXRob2RGdW5jKXthcmdzTGlzdFdpcmVkPSJ0aGlzV2lyZWQiKyhhcmdzTGlzdFdpcmVkLmxlbmd0aD4wPyIsICI6IiIpK2FyZ3NMaXN0V2lyZWR9dmFyIHJldHVybnM9YXJnVHlwZXNbMF0ubmFtZSE9PSJ2b2lkIjtpbnZva2VyRm5Cb2R5Kz0ocmV0dXJucz8idmFyIHJ2ID0gIjoiIikrImludm9rZXIoZm4iKyhhcmdzTGlzdFdpcmVkLmxlbmd0aD4wPyIsICI6IiIpK2FyZ3NMaXN0V2lyZWQrIik7XG4iO2lmKG5lZWRzRGVzdHJ1Y3RvclN0YWNrKXtpbnZva2VyRm5Cb2R5Kz0icnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO1xuIn1lbHNle2Zvcih2YXIgaT1pc0NsYXNzTWV0aG9kRnVuYz8xOjI7aTxhcmdUeXBlcy5sZW5ndGg7KytpKXt2YXIgcGFyYW1OYW1lPWk9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyhpLTIpKyJXaXJlZCI7aWYoYXJnVHlwZXNbaV0uZGVzdHJ1Y3RvckZ1bmN0aW9uIT09bnVsbCl7aW52b2tlckZuQm9keSs9cGFyYW1OYW1lKyJfZHRvcigiK3BhcmFtTmFtZSsiKTsgLy8gIithcmdUeXBlc1tpXS5uYW1lKyJcbiI7YXJnczEucHVzaChwYXJhbU5hbWUrIl9kdG9yIik7YXJnczIucHVzaChhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb24pfX19aWYocmV0dXJucyl7aW52b2tlckZuQm9keSs9InJldHVybiByZXRUeXBlLmZyb21XaXJlVHlwZShydik7XG4ifWludm9rZXJGbkJvZHkrPSJ9XG4iO2FyZ3MxLnB1c2goaW52b2tlckZuQm9keSk7dmFyIGludm9rZXJGdW5jdGlvbj1uZXdfKEZ1bmN0aW9uLGFyZ3MxKS5hcHBseShudWxsLGFyZ3MyKTtyZXR1cm4gaW52b2tlckZ1bmN0aW9ufWZ1bmN0aW9uIHJlcXVpcmVGdW5jdGlvbihzaWduYXR1cmUscmF3RnVuY3Rpb24pe3NpZ25hdHVyZT1yZWFkTGF0aW4xU3RyaW5nKHNpZ25hdHVyZSk7dmFyIGZwO2lmKHR5cGVvZiBGVU5DVElPTl9UQUJMRT09PSJ1bmRlZmluZWQiKXt2YXIgZGM9YXNtWyJkeW5DYWxsXyIrc2lnbmF0dXJlXTtpZihkYz09PXVuZGVmaW5lZCl7ZGM9YXNtWyJkeW5DYWxsXyIrc2lnbmF0dXJlLnJlcGxhY2UoL2YvZywiZCIpXTtpZihkYz09PXVuZGVmaW5lZCl7dGhyb3dCaW5kaW5nRXJyb3IoIk5vIGR5bkNhbGwgaW52b2tlciBmb3Igc2lnbmF0dXJlOiAiK3NpZ25hdHVyZSl9fWZwPWRjLmJpbmQodW5kZWZpbmVkLHJhd0Z1bmN0aW9uKX1lbHNle2ZwPUZVTkNUSU9OX1RBQkxFW3Jhd0Z1bmN0aW9uXX1pZih0eXBlb2YgZnAhPT0iZnVuY3Rpb24iKXt0aHJvd0JpbmRpbmdFcnJvcigidW5rbm93biBmdW5jdGlvbiBwb2ludGVyIHdpdGggc2lnbmF0dXJlICIrc2lnbmF0dXJlKyI6ICIrcmF3RnVuY3Rpb24pfXJldHVybiBmcH1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mdW5jdGlvbihuYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixzaWduYXR1cmUscmF3SW52b2tlcixmbil7dmFyIGFyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmF3SW52b2tlcj1yZXF1aXJlRnVuY3Rpb24oc2lnbmF0dXJlLHJhd0ludm9rZXIpO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLChmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgIituYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLGFyZ1R5cGVzKX0pLGFyZ0NvdW50LTEpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLGFyZ1R5cGVzLChmdW5jdGlvbihhcmdUeXBlcyl7dmFyIGludm9rZXJBcmdzQXJyYXk9W2FyZ1R5cGVzWzBdLG51bGxdLmNvbmNhdChhcmdUeXBlcy5zbGljZSgxKSk7cmVwbGFjZVB1YmxpY1N5bWJvbChuYW1lLGNyYWZ0SW52b2tlckZ1bmN0aW9uKG5hbWUsaW52b2tlckFyZ3NBcnJheSxudWxsLHJhd0ludm9rZXIsZm4pLGFyZ0NvdW50LTEpO3JldHVybltdfSkpfXZhciB0dXBsZVJlZ2lzdHJhdGlvbnM9e307ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfYXJyYXkocmF3VHlwZSxuYW1lLGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yLGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3Rvcil7dHVwbGVSZWdpc3RyYXRpb25zW3Jhd1R5cGVdPXtuYW1lOnJlYWRMYXRpbjFTdHJpbmcobmFtZSkscmF3Q29uc3RydWN0b3I6cmVxdWlyZUZ1bmN0aW9uKGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yKSxyYXdEZXN0cnVjdG9yOnJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpLGVsZW1lbnRzOltdfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9hcnJheV9lbGVtZW50KHJhd1R1cGxlVHlwZSxnZXR0ZXJSZXR1cm5UeXBlLGdldHRlclNpZ25hdHVyZSxnZXR0ZXIsZ2V0dGVyQ29udGV4dCxzZXR0ZXJBcmd1bWVudFR5cGUsc2V0dGVyU2lnbmF0dXJlLHNldHRlcixzZXR0ZXJDb250ZXh0KXt0dXBsZVJlZ2lzdHJhdGlvbnNbcmF3VHVwbGVUeXBlXS5lbGVtZW50cy5wdXNoKHtnZXR0ZXJSZXR1cm5UeXBlOmdldHRlclJldHVyblR5cGUsZ2V0dGVyOnJlcXVpcmVGdW5jdGlvbihnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyKSxnZXR0ZXJDb250ZXh0OmdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlOnNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXI6cmVxdWlyZUZ1bmN0aW9uKHNldHRlclNpZ25hdHVyZSxzZXR0ZXIpLHNldHRlckNvbnRleHQ6c2V0dGVyQ29udGV4dH0pfWZ1bmN0aW9uIF9fZW1iaW5kX2ZpbmFsaXplX3ZhbHVlX2FycmF5KHJhd1R1cGxlVHlwZSl7dmFyIHJlZz10dXBsZVJlZ2lzdHJhdGlvbnNbcmF3VHVwbGVUeXBlXTtkZWxldGUgdHVwbGVSZWdpc3RyYXRpb25zW3Jhd1R1cGxlVHlwZV07dmFyIGVsZW1lbnRzPXJlZy5lbGVtZW50czt2YXIgZWxlbWVudHNMZW5ndGg9ZWxlbWVudHMubGVuZ3RoO3ZhciBlbGVtZW50VHlwZXM9ZWxlbWVudHMubWFwKChmdW5jdGlvbihlbHQpe3JldHVybiBlbHQuZ2V0dGVyUmV0dXJuVHlwZX0pKS5jb25jYXQoZWxlbWVudHMubWFwKChmdW5jdGlvbihlbHQpe3JldHVybiBlbHQuc2V0dGVyQXJndW1lbnRUeXBlfSkpKTt2YXIgcmF3Q29uc3RydWN0b3I9cmVnLnJhd0NvbnN0cnVjdG9yO3ZhciByYXdEZXN0cnVjdG9yPXJlZy5yYXdEZXN0cnVjdG9yO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtyYXdUdXBsZVR5cGVdLGVsZW1lbnRUeXBlcywoZnVuY3Rpb24oZWxlbWVudFR5cGVzKXtlbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbihlbHQsaSl7dmFyIGdldHRlclJldHVyblR5cGU9ZWxlbWVudFR5cGVzW2ldO3ZhciBnZXR0ZXI9ZWx0LmdldHRlcjt2YXIgZ2V0dGVyQ29udGV4dD1lbHQuZ2V0dGVyQ29udGV4dDt2YXIgc2V0dGVyQXJndW1lbnRUeXBlPWVsZW1lbnRUeXBlc1tpK2VsZW1lbnRzTGVuZ3RoXTt2YXIgc2V0dGVyPWVsdC5zZXR0ZXI7dmFyIHNldHRlckNvbnRleHQ9ZWx0LnNldHRlckNvbnRleHQ7ZWx0LnJlYWQ9KGZ1bmN0aW9uKHB0cil7cmV0dXJuIGdldHRlclJldHVyblR5cGVbImZyb21XaXJlVHlwZSJdKGdldHRlcihnZXR0ZXJDb250ZXh0LHB0cikpfSk7ZWx0LndyaXRlPShmdW5jdGlvbihwdHIsbyl7dmFyIGRlc3RydWN0b3JzPVtdO3NldHRlcihzZXR0ZXJDb250ZXh0LHB0cixzZXR0ZXJBcmd1bWVudFR5cGVbInRvV2lyZVR5cGUiXShkZXN0cnVjdG9ycyxvKSk7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpfSl9KSk7cmV0dXJuW3tuYW1lOnJlZy5uYW1lLCJmcm9tV2lyZVR5cGUiOihmdW5jdGlvbihwdHIpe3ZhciBydj1uZXcgQXJyYXkoZWxlbWVudHNMZW5ndGgpO2Zvcih2YXIgaT0wO2k8ZWxlbWVudHNMZW5ndGg7KytpKXtydltpXT1lbGVtZW50c1tpXS5yZWFkKHB0cil9cmF3RGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7aWYoZWxlbWVudHNMZW5ndGghPT1vLmxlbmd0aCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW5jb3JyZWN0IG51bWJlciBvZiB0dXBsZSBlbGVtZW50cyBmb3IgIityZWcubmFtZSsiOiBleHBlY3RlZD0iK2VsZW1lbnRzTGVuZ3RoKyIsIGFjdHVhbD0iK28ubGVuZ3RoKX12YXIgcHRyPXJhd0NvbnN0cnVjdG9yKCk7Zm9yKHZhciBpPTA7aTxlbGVtZW50c0xlbmd0aDsrK2kpe2VsZW1lbnRzW2ldLndyaXRlKHB0cixvW2ldKX1pZihkZXN0cnVjdG9ycyE9PW51bGwpe2Rlc3RydWN0b3JzLnB1c2gocmF3RGVzdHJ1Y3RvcixwdHIpfXJldHVybiBwdHJ9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpzaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcixkZXN0cnVjdG9yRnVuY3Rpb246cmF3RGVzdHJ1Y3Rvcn1dfSkpfXZhciBzdHJ1Y3RSZWdpc3RyYXRpb25zPXt9O2Z1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX29iamVjdChyYXdUeXBlLG5hbWUsY29uc3RydWN0b3JTaWduYXR1cmUscmF3Q29uc3RydWN0b3IsZGVzdHJ1Y3RvclNpZ25hdHVyZSxyYXdEZXN0cnVjdG9yKXtzdHJ1Y3RSZWdpc3RyYXRpb25zW3Jhd1R5cGVdPXtuYW1lOnJlYWRMYXRpbjFTdHJpbmcobmFtZSkscmF3Q29uc3RydWN0b3I6cmVxdWlyZUZ1bmN0aW9uKGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yKSxyYXdEZXN0cnVjdG9yOnJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpLGZpZWxkczpbXX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0X2ZpZWxkKHN0cnVjdFR5cGUsZmllbGROYW1lLGdldHRlclJldHVyblR5cGUsZ2V0dGVyU2lnbmF0dXJlLGdldHRlcixnZXR0ZXJDb250ZXh0LHNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXJTaWduYXR1cmUsc2V0dGVyLHNldHRlckNvbnRleHQpe3N0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV0uZmllbGRzLnB1c2goe2ZpZWxkTmFtZTpyZWFkTGF0aW4xU3RyaW5nKGZpZWxkTmFtZSksZ2V0dGVyUmV0dXJuVHlwZTpnZXR0ZXJSZXR1cm5UeXBlLGdldHRlcjpyZXF1aXJlRnVuY3Rpb24oZ2V0dGVyU2lnbmF0dXJlLGdldHRlciksZ2V0dGVyQ29udGV4dDpnZXR0ZXJDb250ZXh0LHNldHRlckFyZ3VtZW50VHlwZTpzZXR0ZXJBcmd1bWVudFR5cGUsc2V0dGVyOnJlcXVpcmVGdW5jdGlvbihzZXR0ZXJTaWduYXR1cmUsc2V0dGVyKSxzZXR0ZXJDb250ZXh0OnNldHRlckNvbnRleHR9KX1mdW5jdGlvbiBfX2VtYmluZF9maW5hbGl6ZV92YWx1ZV9vYmplY3Qoc3RydWN0VHlwZSl7dmFyIHJlZz1zdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO2RlbGV0ZSBzdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO3ZhciByYXdDb25zdHJ1Y3Rvcj1yZWcucmF3Q29uc3RydWN0b3I7dmFyIHJhd0Rlc3RydWN0b3I9cmVnLnJhd0Rlc3RydWN0b3I7dmFyIGZpZWxkUmVjb3Jkcz1yZWcuZmllbGRzO3ZhciBmaWVsZFR5cGVzPWZpZWxkUmVjb3Jkcy5tYXAoKGZ1bmN0aW9uKGZpZWxkKXtyZXR1cm4gZmllbGQuZ2V0dGVyUmV0dXJuVHlwZX0pKS5jb25jYXQoZmllbGRSZWNvcmRzLm1hcCgoZnVuY3Rpb24oZmllbGQpe3JldHVybiBmaWVsZC5zZXR0ZXJBcmd1bWVudFR5cGV9KSkpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtzdHJ1Y3RUeXBlXSxmaWVsZFR5cGVzLChmdW5jdGlvbihmaWVsZFR5cGVzKXt2YXIgZmllbGRzPXt9O2ZpZWxkUmVjb3Jkcy5mb3JFYWNoKChmdW5jdGlvbihmaWVsZCxpKXt2YXIgZmllbGROYW1lPWZpZWxkLmZpZWxkTmFtZTt2YXIgZ2V0dGVyUmV0dXJuVHlwZT1maWVsZFR5cGVzW2ldO3ZhciBnZXR0ZXI9ZmllbGQuZ2V0dGVyO3ZhciBnZXR0ZXJDb250ZXh0PWZpZWxkLmdldHRlckNvbnRleHQ7dmFyIHNldHRlckFyZ3VtZW50VHlwZT1maWVsZFR5cGVzW2krZmllbGRSZWNvcmRzLmxlbmd0aF07dmFyIHNldHRlcj1maWVsZC5zZXR0ZXI7dmFyIHNldHRlckNvbnRleHQ9ZmllbGQuc2V0dGVyQ29udGV4dDtmaWVsZHNbZmllbGROYW1lXT17cmVhZDooZnVuY3Rpb24ocHRyKXtyZXR1cm4gZ2V0dGVyUmV0dXJuVHlwZVsiZnJvbVdpcmVUeXBlIl0oZ2V0dGVyKGdldHRlckNvbnRleHQscHRyKSl9KSx3cml0ZTooZnVuY3Rpb24ocHRyLG8pe3ZhciBkZXN0cnVjdG9ycz1bXTtzZXR0ZXIoc2V0dGVyQ29udGV4dCxwdHIsc2V0dGVyQXJndW1lbnRUeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsbykpO3J1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKX0pfX0pKTtyZXR1cm5be25hbWU6cmVnLm5hbWUsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKHB0cil7dmFyIHJ2PXt9O2Zvcih2YXIgaSBpbiBmaWVsZHMpe3J2W2ldPWZpZWxkc1tpXS5yZWFkKHB0cil9cmF3RGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7Zm9yKHZhciBmaWVsZE5hbWUgaW4gZmllbGRzKXtpZighKGZpZWxkTmFtZSBpbiBvKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBmaWVsZCIpfX12YXIgcHRyPXJhd0NvbnN0cnVjdG9yKCk7Zm9yKGZpZWxkTmFtZSBpbiBmaWVsZHMpe2ZpZWxkc1tmaWVsZE5hbWVdLndyaXRlKHB0cixvW2ZpZWxkTmFtZV0pfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChyYXdEZXN0cnVjdG9yLHB0cil9cmV0dXJuIHB0cn0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpyYXdEZXN0cnVjdG9yfV19KSl9dmFyIGdlbmVyaWNQb2ludGVyVG9XaXJlVHlwZT0oZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsaGFuZGxlKXtpZihoYW5kbGU9PT1udWxsKXtpZih0aGlzLmlzUmVmZXJlbmNlKXt0aHJvd0JpbmRpbmdFcnJvcigibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7dmFyIHB0cj10aGlzLnJhd0NvbnN0cnVjdG9yKCk7aWYoZGVzdHJ1Y3RvcnMhPT1udWxsKXtkZXN0cnVjdG9ycy5wdXNoKHRoaXMucmF3RGVzdHJ1Y3RvcixwdHIpfXJldHVybiBwdHJ9ZWxzZXtyZXR1cm4gMH19aWYoIWhhbmRsZS4kJCl7dGhyb3dCaW5kaW5nRXJyb3IoJ0Nhbm5vdCBwYXNzICInK19lbWJpbmRfcmVwcihoYW5kbGUpKyciIGFzIGEgJyt0aGlzLm5hbWUpfWlmKCFoYW5kbGUuJCQucHRyKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgIit0aGlzLm5hbWUpfWlmKCF0aGlzLmlzQ29uc3QmJmhhbmRsZS4kJC5wdHJUeXBlLmlzQ29uc3Qpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlICIrKGhhbmRsZS4kJC5zbWFydFB0clR5cGU/aGFuZGxlLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOmhhbmRsZS4kJC5wdHJUeXBlLm5hbWUpKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO2lmKHRoaXMuaXNTbWFydFBvaW50ZXIpe2lmKHVuZGVmaW5lZD09PWhhbmRsZS4kJC5zbWFydFB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3NpbmcgcmF3IHBvaW50ZXIgdG8gc21hcnQgcG9pbnRlciBpcyBpbGxlZ2FsIil9c3dpdGNoKHRoaXMuc2hhcmluZ1BvbGljeSl7Y2FzZSAwOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIisoaGFuZGxlLiQkLnNtYXJ0UHRyVHlwZT9oYW5kbGUuJCQuc21hcnRQdHJUeXBlLm5hbWU6aGFuZGxlLiQkLnB0clR5cGUubmFtZSkrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSl9YnJlYWs7Y2FzZSAxOnB0cj1oYW5kbGUuJCQuc21hcnRQdHI7YnJlYWs7Y2FzZSAyOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dmFyIGNsb25lZEhhbmRsZT1oYW5kbGVbImNsb25lIl0oKTtwdHI9dGhpcy5yYXdTaGFyZShwdHIsX19lbXZhbF9yZWdpc3RlcigoZnVuY3Rpb24oKXtjbG9uZWRIYW5kbGVbImRlbGV0ZSJdKCl9KSkpO2lmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IscHRyKX19YnJlYWs7ZGVmYXVsdDp0aHJvd0JpbmRpbmdFcnJvcigiVW5zdXBwb3J0aW5nIHNoYXJpbmcgcG9saWN5Iil9fXJldHVybiBwdHJ9KTt2YXIgY29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGU9KGZ1bmN0aW9uKGRlc3RydWN0b3JzLGhhbmRsZSl7aWYoaGFuZGxlPT09bnVsbCl7aWYodGhpcy5pc1JlZmVyZW5jZSl7dGhyb3dCaW5kaW5nRXJyb3IoIm51bGwgaXMgbm90IGEgdmFsaWQgIit0aGlzLm5hbWUpfXJldHVybiAwfWlmKCFoYW5kbGUuJCQpe3Rocm93QmluZGluZ0Vycm9yKCdDYW5ub3QgcGFzcyAiJytfZW1iaW5kX3JlcHIoaGFuZGxlKSsnIiBhcyBhICcrdGhpcy5uYW1lKX1pZighaGFuZGxlLiQkLnB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICIrdGhpcy5uYW1lKX12YXIgaGFuZGxlQ2xhc3M9aGFuZGxlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3ZhciBwdHI9dXBjYXN0UG9pbnRlcihoYW5kbGUuJCQucHRyLGhhbmRsZUNsYXNzLHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gcHRyfSk7dmFyIG5vbkNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlPShmdW5jdGlvbihkZXN0cnVjdG9ycyxoYW5kbGUpe2lmKGhhbmRsZT09PW51bGwpe2lmKHRoaXMuaXNSZWZlcmVuY2Upe3Rocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKX1yZXR1cm4gMH1pZighaGFuZGxlLiQkKXt0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicrX2VtYmluZF9yZXByKGhhbmRsZSkrJyIgYXMgYSAnK3RoaXMubmFtZSl9aWYoIWhhbmRsZS4kJC5wdHIpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSl9aWYoaGFuZGxlLiQkLnB0clR5cGUuaXNDb25zdCl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIitoYW5kbGUuJCQucHRyVHlwZS5uYW1lKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiBwdHJ9KTtmdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHJlZ2lzdGVyZWRDbGFzcyxpc1JlZmVyZW5jZSxpc0NvbnN0LGlzU21hcnRQb2ludGVyLHBvaW50ZWVUeXBlLHNoYXJpbmdQb2xpY3kscmF3R2V0UG9pbnRlZSxyYXdDb25zdHJ1Y3RvcixyYXdTaGFyZSxyYXdEZXN0cnVjdG9yKXt0aGlzLm5hbWU9bmFtZTt0aGlzLnJlZ2lzdGVyZWRDbGFzcz1yZWdpc3RlcmVkQ2xhc3M7dGhpcy5pc1JlZmVyZW5jZT1pc1JlZmVyZW5jZTt0aGlzLmlzQ29uc3Q9aXNDb25zdDt0aGlzLmlzU21hcnRQb2ludGVyPWlzU21hcnRQb2ludGVyO3RoaXMucG9pbnRlZVR5cGU9cG9pbnRlZVR5cGU7dGhpcy5zaGFyaW5nUG9saWN5PXNoYXJpbmdQb2xpY3k7dGhpcy5yYXdHZXRQb2ludGVlPXJhd0dldFBvaW50ZWU7dGhpcy5yYXdDb25zdHJ1Y3Rvcj1yYXdDb25zdHJ1Y3Rvcjt0aGlzLnJhd1NoYXJlPXJhd1NoYXJlO3RoaXMucmF3RGVzdHJ1Y3Rvcj1yYXdEZXN0cnVjdG9yO2lmKCFpc1NtYXJ0UG9pbnRlciYmcmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzcz09PXVuZGVmaW5lZCl7aWYoaXNDb25zdCl7dGhpc1sidG9XaXJlVHlwZSJdPWNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlO3RoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGx9ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09bm9uQ29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGU7dGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbH19ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09Z2VuZXJpY1BvaW50ZXJUb1dpcmVUeXBlfX1SZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGUuZ2V0UG9pbnRlZT1mdW5jdGlvbiBnZXRQb2ludGVlKHB0cil7aWYodGhpcy5yYXdHZXRQb2ludGVlKXtwdHI9dGhpcy5yYXdHZXRQb2ludGVlKHB0cil9cmV0dXJuIHB0cn07UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlLmRlc3RydWN0b3I9ZnVuY3Rpb24gZGVzdHJ1Y3RvcihwdHIpe2lmKHRoaXMucmF3RGVzdHJ1Y3Rvcil7dGhpcy5yYXdEZXN0cnVjdG9yKHB0cil9fTtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImFyZ1BhY2tBZHZhbmNlIl09ODtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl09c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXI7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlWyJkZWxldGVPYmplY3QiXT1mdW5jdGlvbiBkZWxldGVPYmplY3QoaGFuZGxlKXtpZihoYW5kbGUhPT1udWxsKXtoYW5kbGVbImRlbGV0ZSJdKCl9fTtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImZyb21XaXJlVHlwZSJdPWZ1bmN0aW9uIGZyb21XaXJlVHlwZShwdHIpe3ZhciByYXdQb2ludGVyPXRoaXMuZ2V0UG9pbnRlZShwdHIpO2lmKCFyYXdQb2ludGVyKXt0aGlzLmRlc3RydWN0b3IocHRyKTtyZXR1cm4gbnVsbH12YXIgcmVnaXN0ZXJlZEluc3RhbmNlPWdldEluaGVyaXRlZEluc3RhbmNlKHRoaXMucmVnaXN0ZXJlZENsYXNzLHJhd1BvaW50ZXIpO2lmKHVuZGVmaW5lZCE9PXJlZ2lzdGVyZWRJbnN0YW5jZSl7aWYoMD09PXJlZ2lzdGVyZWRJbnN0YW5jZS4kJC5jb3VudC52YWx1ZSl7cmVnaXN0ZXJlZEluc3RhbmNlLiQkLnB0cj1yYXdQb2ludGVyO3JlZ2lzdGVyZWRJbnN0YW5jZS4kJC5zbWFydFB0cj1wdHI7cmV0dXJuIHJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpfWVsc2V7dmFyIHJ2PXJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpO3RoaXMuZGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn19ZnVuY3Rpb24gbWFrZURlZmF1bHRIYW5kbGUoKXtpZih0aGlzLmlzU21hcnRQb2ludGVyKXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnJhd1BvaW50ZXIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOnB0cn0pfX12YXIgYWN0dWFsVHlwZT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHJhd1BvaW50ZXIpO3ZhciByZWdpc3RlcmVkUG9pbnRlclJlY29yZD1yZWdpc3RlcmVkUG9pbnRlcnNbYWN0dWFsVHlwZV07aWYoIXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkKXtyZXR1cm4gbWFrZURlZmF1bHRIYW5kbGUuY2FsbCh0aGlzKX12YXIgdG9UeXBlO2lmKHRoaXMuaXNDb25zdCl7dG9UeXBlPXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkLmNvbnN0UG9pbnRlclR5cGV9ZWxzZXt0b1R5cGU9cmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQucG9pbnRlclR5cGV9dmFyIGRwPWRvd25jYXN0UG9pbnRlcihyYXdQb2ludGVyLHRoaXMucmVnaXN0ZXJlZENsYXNzLHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MpO2lmKGRwPT09bnVsbCl7cmV0dXJuIG1ha2VEZWZhdWx0SGFuZGxlLmNhbGwodGhpcyl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0b1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRvVHlwZSxwdHI6ZHAsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUse3B0clR5cGU6dG9UeXBlLHB0cjpkcH0pfX07ZnVuY3Rpb24gbWFrZUNsYXNzSGFuZGxlKHByb3RvdHlwZSxyZWNvcmQpe2lmKCFyZWNvcmQucHRyVHlwZXx8IXJlY29yZC5wdHIpe3Rocm93SW50ZXJuYWxFcnJvcigibWFrZUNsYXNzSGFuZGxlIHJlcXVpcmVzIHB0ciBhbmQgcHRyVHlwZSIpfXZhciBoYXNTbWFydFB0clR5cGU9ISFyZWNvcmQuc21hcnRQdHJUeXBlO3ZhciBoYXNTbWFydFB0cj0hIXJlY29yZC5zbWFydFB0cjtpZihoYXNTbWFydFB0clR5cGUhPT1oYXNTbWFydFB0cil7dGhyb3dJbnRlcm5hbEVycm9yKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKX1yZWNvcmQuY291bnQ9e3ZhbHVlOjF9O3JldHVybiBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSx7JCQ6e3ZhbHVlOnJlY29yZH19KX1mdW5jdGlvbiBDbGFzc0hhbmRsZSgpe31mdW5jdGlvbiBnZXRJbnN0YW5jZVR5cGVOYW1lKGhhbmRsZSl7cmV0dXJuIGhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcy5uYW1lfUNsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNBbGlhc09mIl09ZnVuY3Rpb24gaXNBbGlhc09mKG90aGVyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBDbGFzc0hhbmRsZSkpe3JldHVybiBmYWxzZX1pZighKG90aGVyIGluc3RhbmNlb2YgQ2xhc3NIYW5kbGUpKXtyZXR1cm4gZmFsc2V9dmFyIGxlZnRDbGFzcz10aGlzLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3ZhciBsZWZ0PXRoaXMuJCQucHRyO3ZhciByaWdodENsYXNzPW90aGVyLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3ZhciByaWdodD1vdGhlci4kJC5wdHI7d2hpbGUobGVmdENsYXNzLmJhc2VDbGFzcyl7bGVmdD1sZWZ0Q2xhc3MudXBjYXN0KGxlZnQpO2xlZnRDbGFzcz1sZWZ0Q2xhc3MuYmFzZUNsYXNzfXdoaWxlKHJpZ2h0Q2xhc3MuYmFzZUNsYXNzKXtyaWdodD1yaWdodENsYXNzLnVwY2FzdChyaWdodCk7cmlnaHRDbGFzcz1yaWdodENsYXNzLmJhc2VDbGFzc31yZXR1cm4gbGVmdENsYXNzPT09cmlnaHRDbGFzcyYmbGVmdD09PXJpZ2h0fTtmdW5jdGlvbiB0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQob2JqKXt0aHJvd0JpbmRpbmdFcnJvcihnZXRJbnN0YW5jZVR5cGVOYW1lKG9iaikrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX1DbGFzc0hhbmRsZS5wcm90b3R5cGVbImNsb25lIl09ZnVuY3Rpb24gY2xvbmUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXt0aGlzLiQkLmNvdW50LnZhbHVlKz0xO3JldHVybiB0aGlzfWVsc2V7dmFyIGNsb25lPU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLHskJDp7dmFsdWU6c2hhbGxvd0NvcHkodGhpcy4kJCl9fSk7Y2xvbmUuJCQuY291bnQudmFsdWUrPTE7cmV0dXJuIGNsb25lfX07ZnVuY3Rpb24gcnVuRGVzdHJ1Y3RvcihoYW5kbGUpe3ZhciAkJD1oYW5kbGUuJCQ7aWYoJCQuc21hcnRQdHIpeyQkLnNtYXJ0UHRyVHlwZS5yYXdEZXN0cnVjdG9yKCQkLnNtYXJ0UHRyKX1lbHNleyQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoJCQucHRyKX19Q2xhc3NIYW5kbGUucHJvdG90eXBlWyJkZWxldGUiXT1mdW5jdGlvbiBDbGFzc0hhbmRsZV9kZWxldGUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCYmIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3Rocm93QmluZGluZ0Vycm9yKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIil9dGhpcy4kJC5jb3VudC52YWx1ZS09MTt2YXIgdG9EZWxldGU9MD09PXRoaXMuJCQuY291bnQudmFsdWU7aWYodG9EZWxldGUpe3J1bkRlc3RydWN0b3IodGhpcyl9aWYoIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3RoaXMuJCQuc21hcnRQdHI9dW5kZWZpbmVkO3RoaXMuJCQucHRyPXVuZGVmaW5lZH19O3ZhciBkZWxldGlvblF1ZXVlPVtdO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNEZWxldGVkIl09ZnVuY3Rpb24gaXNEZWxldGVkKCl7cmV0dXJuIXRoaXMuJCQucHRyfTtDbGFzc0hhbmRsZS5wcm90b3R5cGVbImRlbGV0ZUxhdGVyIl09ZnVuY3Rpb24gZGVsZXRlTGF0ZXIoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCYmIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3Rocm93QmluZGluZ0Vycm9yKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIil9ZGVsZXRpb25RdWV1ZS5wdXNoKHRoaXMpO2lmKGRlbGV0aW9uUXVldWUubGVuZ3RoPT09MSYmZGVsYXlGdW5jdGlvbil7ZGVsYXlGdW5jdGlvbihmbHVzaFBlbmRpbmdEZWxldGVzKX10aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD10cnVlO3JldHVybiB0aGlzfTtmdW5jdGlvbiBmbHVzaFBlbmRpbmdEZWxldGVzKCl7d2hpbGUoZGVsZXRpb25RdWV1ZS5sZW5ndGgpe3ZhciBvYmo9ZGVsZXRpb25RdWV1ZS5wb3AoKTtvYmouJCQuZGVsZXRlU2NoZWR1bGVkPWZhbHNlO29ialsiZGVsZXRlIl0oKX19TW9kdWxlWyJmbHVzaFBlbmRpbmdEZWxldGVzIl09Zmx1c2hQZW5kaW5nRGVsZXRlczt2YXIgZGVsYXlGdW5jdGlvbjtNb2R1bGVbInNldERlbGF5RnVuY3Rpb24iXT1mdW5jdGlvbiBzZXREZWxheUZ1bmN0aW9uKGZuKXtkZWxheUZ1bmN0aW9uPWZuO2lmKGRlbGV0aW9uUXVldWUubGVuZ3RoJiZkZWxheUZ1bmN0aW9uKXtkZWxheUZ1bmN0aW9uKGZsdXNoUGVuZGluZ0RlbGV0ZXMpfX07ZnVuY3Rpb24gUmVnaXN0ZXJlZENsYXNzKG5hbWUsY29uc3RydWN0b3IsaW5zdGFuY2VQcm90b3R5cGUscmF3RGVzdHJ1Y3RvcixiYXNlQ2xhc3MsZ2V0QWN0dWFsVHlwZSx1cGNhc3QsZG93bmNhc3Qpe3RoaXMubmFtZT1uYW1lO3RoaXMuY29uc3RydWN0b3I9Y29uc3RydWN0b3I7dGhpcy5pbnN0YW5jZVByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt0aGlzLnJhd0Rlc3RydWN0b3I9cmF3RGVzdHJ1Y3Rvcjt0aGlzLmJhc2VDbGFzcz1iYXNlQ2xhc3M7dGhpcy5nZXRBY3R1YWxUeXBlPWdldEFjdHVhbFR5cGU7dGhpcy51cGNhc3Q9dXBjYXN0O3RoaXMuZG93bmNhc3Q9ZG93bmNhc3Q7dGhpcy5wdXJlVmlydHVhbEZ1bmN0aW9ucz1bXX1mdW5jdGlvbiBzaGFsbG93Q29weShvKXt2YXIgcnY9e307Zm9yKHZhciBrIGluIG8pe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLGspKXtydltrXT1vW2tdfX1yZXR1cm4gcnZ9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3MocmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlLGJhc2VDbGFzc1Jhd1R5cGUsZ2V0QWN0dWFsVHlwZVNpZ25hdHVyZSxnZXRBY3R1YWxUeXBlLHVwY2FzdFNpZ25hdHVyZSx1cGNhc3QsZG93bmNhc3RTaWduYXR1cmUsZG93bmNhc3QsbmFtZSxkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtnZXRBY3R1YWxUeXBlPXJlcXVpcmVGdW5jdGlvbihnZXRBY3R1YWxUeXBlU2lnbmF0dXJlLGdldEFjdHVhbFR5cGUpO2lmKHVwY2FzdCl7dXBjYXN0PXJlcXVpcmVGdW5jdGlvbih1cGNhc3RTaWduYXR1cmUsdXBjYXN0KX1pZihkb3duY2FzdCl7ZG93bmNhc3Q9cmVxdWlyZUZ1bmN0aW9uKGRvd25jYXN0U2lnbmF0dXJlLGRvd25jYXN0KX1yYXdEZXN0cnVjdG9yPXJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpO3ZhciBsZWdhbEZ1bmN0aW9uTmFtZT1tYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSk7ZXhwb3NlUHVibGljU3ltYm9sKGxlZ2FsRnVuY3Rpb25OYW1lLChmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNvbnN0cnVjdCAiK25hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsW2Jhc2VDbGFzc1Jhd1R5cGVdKX0pKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbcmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlXSxiYXNlQ2xhc3NSYXdUeXBlP1tiYXNlQ2xhc3NSYXdUeXBlXTpbXSwoZnVuY3Rpb24oYmFzZSl7YmFzZT1iYXNlWzBdO3ZhciBiYXNlQ2xhc3M7dmFyIGJhc2VQcm90b3R5cGU7aWYoYmFzZUNsYXNzUmF3VHlwZSl7YmFzZUNsYXNzPWJhc2UucmVnaXN0ZXJlZENsYXNzO2Jhc2VQcm90b3R5cGU9YmFzZUNsYXNzLmluc3RhbmNlUHJvdG90eXBlfWVsc2V7YmFzZVByb3RvdHlwZT1DbGFzc0hhbmRsZS5wcm90b3R5cGV9dmFyIGNvbnN0cnVjdG9yPWNyZWF0ZU5hbWVkRnVuY3Rpb24obGVnYWxGdW5jdGlvbk5hbWUsKGZ1bmN0aW9uKCl7aWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpIT09aW5zdGFuY2VQcm90b3R5cGUpe3Rocm93IG5ldyBCaW5kaW5nRXJyb3IoIlVzZSAnbmV3JyB0byBjb25zdHJ1Y3QgIituYW1lKX1pZih1bmRlZmluZWQ9PT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keSl7dGhyb3cgbmV3IEJpbmRpbmdFcnJvcihuYW1lKyIgaGFzIG5vIGFjY2Vzc2libGUgY29uc3RydWN0b3IiKX12YXIgYm9keT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmd1bWVudHMubGVuZ3RoXTtpZih1bmRlZmluZWQ9PT1ib2R5KXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJUcmllZCB0byBpbnZva2UgY3RvciBvZiAiK25hbWUrIiB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIrYXJndW1lbnRzLmxlbmd0aCsiKSAtIGV4cGVjdGVkICgiK09iamVjdC5rZXlzKHJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KS50b1N0cmluZygpKyIpIHBhcmFtZXRlcnMgaW5zdGVhZCEiKX1yZXR1cm4gYm9keS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSk7dmFyIGluc3RhbmNlUHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYmFzZVByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmNvbnN0cnVjdG9yfX0pO2NvbnN0cnVjdG9yLnByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt2YXIgcmVnaXN0ZXJlZENsYXNzPW5ldyBSZWdpc3RlcmVkQ2xhc3MobmFtZSxjb25zdHJ1Y3RvcixpbnN0YW5jZVByb3RvdHlwZSxyYXdEZXN0cnVjdG9yLGJhc2VDbGFzcyxnZXRBY3R1YWxUeXBlLHVwY2FzdCxkb3duY2FzdCk7dmFyIHJlZmVyZW5jZUNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSxyZWdpc3RlcmVkQ2xhc3MsdHJ1ZSxmYWxzZSxmYWxzZSk7dmFyIHBvaW50ZXJDb252ZXJ0ZXI9bmV3IFJlZ2lzdGVyZWRQb2ludGVyKG5hbWUrIioiLHJlZ2lzdGVyZWRDbGFzcyxmYWxzZSxmYWxzZSxmYWxzZSk7dmFyIGNvbnN0UG9pbnRlckNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSsiIGNvbnN0KiIscmVnaXN0ZXJlZENsYXNzLGZhbHNlLHRydWUsZmFsc2UpO3JlZ2lzdGVyZWRQb2ludGVyc1tyYXdUeXBlXT17cG9pbnRlclR5cGU6cG9pbnRlckNvbnZlcnRlcixjb25zdFBvaW50ZXJUeXBlOmNvbnN0UG9pbnRlckNvbnZlcnRlcn07cmVwbGFjZVB1YmxpY1N5bWJvbChsZWdhbEZ1bmN0aW9uTmFtZSxjb25zdHJ1Y3Rvcik7cmV0dXJuW3JlZmVyZW5jZUNvbnZlcnRlcixwb2ludGVyQ29udmVydGVyLGNvbnN0UG9pbnRlckNvbnZlcnRlcl19KSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IocmF3Q2xhc3NUeXBlLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLGludm9rZXIscmF3Q29uc3RydWN0b3Ipe3ZhciByYXdBcmdUeXBlcz1oZWFwMzJWZWN0b3JUb0FycmF5KGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcik7aW52b2tlcj1yZXF1aXJlRnVuY3Rpb24oaW52b2tlclNpZ25hdHVyZSxpbnZva2VyKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbcmF3Q2xhc3NUeXBlXSwoZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9ImNvbnN0cnVjdG9yICIrY2xhc3NUeXBlLm5hbWU7aWYodW5kZWZpbmVkPT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9W119aWYodW5kZWZpbmVkIT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgiKyhhcmdDb3VudC0xKSsiKSBmb3IgY2xhc3MgJyIrY2xhc3NUeXBlLm5hbWUrIichIE92ZXJsb2FkIHJlc29sdXRpb24gaXMgY3VycmVudGx5IG9ubHkgcGVyZm9ybWVkIHVzaW5nIHRoZSBwYXJhbWV0ZXIgY291bnQsIG5vdCBhY3R1YWwgdHlwZSBpbmZvISIpfWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmdDb3VudC0xXT1mdW5jdGlvbiB1bmJvdW5kVHlwZUhhbmRsZXIoKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjb25zdHJ1Y3QgIitjbGFzc1R5cGUubmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixyYXdBcmdUeXBlcyl9O3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLHJhd0FyZ1R5cGVzLChmdW5jdGlvbihhcmdUeXBlcyl7Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdPWZ1bmN0aW9uIGNvbnN0cnVjdG9yX2JvZHkoKXtpZihhcmd1bWVudHMubGVuZ3RoIT09YXJnQ291bnQtMSl7dGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lKyIgY2FsbGVkIHdpdGggIithcmd1bWVudHMubGVuZ3RoKyIgYXJndW1lbnRzLCBleHBlY3RlZCAiKyhhcmdDb3VudC0xKSl9dmFyIGRlc3RydWN0b3JzPVtdO3ZhciBhcmdzPW5ldyBBcnJheShhcmdDb3VudCk7YXJnc1swXT1yYXdDb25zdHJ1Y3Rvcjtmb3IodmFyIGk9MTtpPGFyZ0NvdW50OysraSl7YXJnc1tpXT1hcmdUeXBlc1tpXVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLGFyZ3VtZW50c1tpLTFdKX12YXIgcHRyPWludm9rZXIuYXBwbHkobnVsbCxhcmdzKTtydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7cmV0dXJuIGFyZ1R5cGVzWzBdWyJmcm9tV2lyZVR5cGUiXShwdHIpfTtyZXR1cm5bXX0pKTtyZXR1cm5bXX0pKX1mdW5jdGlvbiBkb3duY2FzdFBvaW50ZXIocHRyLHB0ckNsYXNzLGRlc2lyZWRDbGFzcyl7aWYocHRyQ2xhc3M9PT1kZXNpcmVkQ2xhc3Mpe3JldHVybiBwdHJ9aWYodW5kZWZpbmVkPT09ZGVzaXJlZENsYXNzLmJhc2VDbGFzcyl7cmV0dXJuIG51bGx9dmFyIHJ2PWRvd25jYXN0UG9pbnRlcihwdHIscHRyQ2xhc3MsZGVzaXJlZENsYXNzLmJhc2VDbGFzcyk7aWYocnY9PT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gZGVzaXJlZENsYXNzLmRvd25jYXN0KHJ2KX1mdW5jdGlvbiB1cGNhc3RQb2ludGVyKHB0cixwdHJDbGFzcyxkZXNpcmVkQ2xhc3Mpe3doaWxlKHB0ckNsYXNzIT09ZGVzaXJlZENsYXNzKXtpZighcHRyQ2xhc3MudXBjYXN0KXt0aHJvd0JpbmRpbmdFcnJvcigiRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAiK2Rlc2lyZWRDbGFzcy5uYW1lKyIsIGdvdCBhbiBpbnN0YW5jZSBvZiAiK3B0ckNsYXNzLm5hbWUpfXB0cj1wdHJDbGFzcy51cGNhc3QocHRyKTtwdHJDbGFzcz1wdHJDbGFzcy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiB2YWxpZGF0ZVRoaXModGhpc18sY2xhc3NUeXBlLGh1bWFuTmFtZSl7aWYoISh0aGlzXyBpbnN0YW5jZW9mIE9iamVjdCkpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsnIHdpdGggaW52YWxpZCAidGhpcyI6ICcrdGhpc18pfWlmKCEodGhpc18gaW5zdGFuY2VvZiBjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yKSl7dGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lKycgaW5jb21wYXRpYmxlIHdpdGggInRoaXMiIG9mIHR5cGUgJyt0aGlzXy5jb25zdHJ1Y3Rvci5uYW1lKX1pZighdGhpc18uJCQucHRyKXt0aHJvd0JpbmRpbmdFcnJvcigiY2Fubm90IGNhbGwgZW1zY3JpcHRlbiBiaW5kaW5nIG1ldGhvZCAiK2h1bWFuTmFtZSsiIG9uIGRlbGV0ZWQgb2JqZWN0Iil9cmV0dXJuIHVwY2FzdFBvaW50ZXIodGhpc18uJCQucHRyLHRoaXNfLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLGNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uKHJhd0NsYXNzVHlwZSxtZXRob2ROYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIsY29udGV4dCxpc1B1cmVWaXJ0dWFsKXt2YXIgcmF3QXJnVHlwZXM9aGVhcDMyVmVjdG9yVG9BcnJheShhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIpO21ldGhvZE5hbWU9cmVhZExhdGluMVN0cmluZyhtZXRob2ROYW1lKTtyYXdJbnZva2VyPXJlcXVpcmVGdW5jdGlvbihpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFtyYXdDbGFzc1R5cGVdLChmdW5jdGlvbihjbGFzc1R5cGUpe2NsYXNzVHlwZT1jbGFzc1R5cGVbMF07dmFyIGh1bWFuTmFtZT1jbGFzc1R5cGUubmFtZSsiLiIrbWV0aG9kTmFtZTtpZihpc1B1cmVWaXJ0dWFsKXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLnB1cmVWaXJ0dWFsRnVuY3Rpb25zLnB1c2gobWV0aG9kTmFtZSl9ZnVuY3Rpb24gdW5ib3VuZFR5cGVzSGFuZGxlcigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgIitodW1hbk5hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIscmF3QXJnVHlwZXMpfXZhciBwcm90bz1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlO3ZhciBtZXRob2Q9cHJvdG9bbWV0aG9kTmFtZV07aWYodW5kZWZpbmVkPT09bWV0aG9kfHx1bmRlZmluZWQ9PT1tZXRob2Qub3ZlcmxvYWRUYWJsZSYmbWV0aG9kLmNsYXNzTmFtZSE9PWNsYXNzVHlwZS5uYW1lJiZtZXRob2QuYXJnQ291bnQ9PT1hcmdDb3VudC0yKXt1bmJvdW5kVHlwZXNIYW5kbGVyLmFyZ0NvdW50PWFyZ0NvdW50LTI7dW5ib3VuZFR5cGVzSGFuZGxlci5jbGFzc05hbWU9Y2xhc3NUeXBlLm5hbWU7cHJvdG9bbWV0aG9kTmFtZV09dW5ib3VuZFR5cGVzSGFuZGxlcn1lbHNle2Vuc3VyZU92ZXJsb2FkVGFibGUocHJvdG8sbWV0aG9kTmFtZSxodW1hbk5hbWUpO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMl09dW5ib3VuZFR5cGVzSGFuZGxlcn13aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxyYXdBcmdUeXBlcywoZnVuY3Rpb24oYXJnVHlwZXMpe3ZhciBtZW1iZXJGdW5jdGlvbj1jcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLHJhd0ludm9rZXIsY29udGV4dCk7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7cHJvdG9bbWV0aG9kTmFtZV09bWVtYmVyRnVuY3Rpb259ZWxzZXtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlW2FyZ0NvdW50LTJdPW1lbWJlckZ1bmN0aW9ufXJldHVybltdfSkpO3JldHVybltdfSkpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX3Byb3BlcnR5KGNsYXNzVHlwZSxmaWVsZE5hbWUsZ2V0dGVyUmV0dXJuVHlwZSxnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyLGdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlLHNldHRlclNpZ25hdHVyZSxzZXR0ZXIsc2V0dGVyQ29udGV4dCl7ZmllbGROYW1lPXJlYWRMYXRpbjFTdHJpbmcoZmllbGROYW1lKTtnZXR0ZXI9cmVxdWlyZUZ1bmN0aW9uKGdldHRlclNpZ25hdHVyZSxnZXR0ZXIpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFtjbGFzc1R5cGVdLChmdW5jdGlvbihjbGFzc1R5cGUpe2NsYXNzVHlwZT1jbGFzc1R5cGVbMF07dmFyIGh1bWFuTmFtZT1jbGFzc1R5cGUubmFtZSsiLiIrZmllbGROYW1lO3ZhciBkZXNjPXtnZXQ6KGZ1bmN0aW9uKCl7dGhyb3dVbmJvdW5kVHlwZUVycm9yKCJDYW5ub3QgYWNjZXNzICIraHVtYW5OYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLFtnZXR0ZXJSZXR1cm5UeXBlLHNldHRlckFyZ3VtZW50VHlwZV0pfSksZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfTtpZihzZXR0ZXIpe2Rlc2Muc2V0PShmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGFjY2VzcyAiK2h1bWFuTmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixbZ2V0dGVyUmV0dXJuVHlwZSxzZXR0ZXJBcmd1bWVudFR5cGVdKX0pfWVsc2V7ZGVzYy5zZXQ9KGZ1bmN0aW9uKHYpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5Iil9KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSxmaWVsZE5hbWUsZGVzYyk7d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sc2V0dGVyP1tnZXR0ZXJSZXR1cm5UeXBlLHNldHRlckFyZ3VtZW50VHlwZV06W2dldHRlclJldHVyblR5cGVdLChmdW5jdGlvbih0eXBlcyl7dmFyIGdldHRlclJldHVyblR5cGU9dHlwZXNbMF07dmFyIGRlc2M9e2dldDooZnVuY3Rpb24oKXt2YXIgcHRyPXZhbGlkYXRlVGhpcyh0aGlzLGNsYXNzVHlwZSxodW1hbk5hbWUrIiBnZXR0ZXIiKTtyZXR1cm4gZ2V0dGVyUmV0dXJuVHlwZVsiZnJvbVdpcmVUeXBlIl0oZ2V0dGVyKGdldHRlckNvbnRleHQscHRyKSl9KSxlbnVtZXJhYmxlOnRydWV9O2lmKHNldHRlcil7c2V0dGVyPXJlcXVpcmVGdW5jdGlvbihzZXR0ZXJTaWduYXR1cmUsc2V0dGVyKTt2YXIgc2V0dGVyQXJndW1lbnRUeXBlPXR5cGVzWzFdO2Rlc2Muc2V0PShmdW5jdGlvbih2KXt2YXIgcHRyPXZhbGlkYXRlVGhpcyh0aGlzLGNsYXNzVHlwZSxodW1hbk5hbWUrIiBzZXR0ZXIiKTt2YXIgZGVzdHJ1Y3RvcnM9W107c2V0dGVyKHNldHRlckNvbnRleHQscHRyLHNldHRlckFyZ3VtZW50VHlwZVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLHYpKTtydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyl9KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSxmaWVsZE5hbWUsZGVzYyk7cmV0dXJuW119KSk7cmV0dXJuW119KSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY2xhc3NfZnVuY3Rpb24ocmF3Q2xhc3NUeXBlLG1ldGhvZE5hbWUsYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyLGludm9rZXJTaWduYXR1cmUscmF3SW52b2tlcixmbil7dmFyIHJhd0FyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTttZXRob2ROYW1lPXJlYWRMYXRpbjFTdHJpbmcobWV0aG9kTmFtZSk7cmF3SW52b2tlcj1yZXF1aXJlRnVuY3Rpb24oaW52b2tlclNpZ25hdHVyZSxyYXdJbnZva2VyKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbcmF3Q2xhc3NUeXBlXSwoZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9Y2xhc3NUeXBlLm5hbWUrIi4iK21ldGhvZE5hbWU7ZnVuY3Rpb24gdW5ib3VuZFR5cGVzSGFuZGxlcigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgIitodW1hbk5hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIscmF3QXJnVHlwZXMpfXZhciBwcm90bz1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yO2lmKHVuZGVmaW5lZD09PXByb3RvW21ldGhvZE5hbWVdKXt1bmJvdW5kVHlwZXNIYW5kbGVyLmFyZ0NvdW50PWFyZ0NvdW50LTE7cHJvdG9bbWV0aG9kTmFtZV09dW5ib3VuZFR5cGVzSGFuZGxlcn1lbHNle2Vuc3VyZU92ZXJsb2FkVGFibGUocHJvdG8sbWV0aG9kTmFtZSxodW1hbk5hbWUpO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMV09dW5ib3VuZFR5cGVzSGFuZGxlcn13aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxyYXdBcmdUeXBlcywoZnVuY3Rpb24oYXJnVHlwZXMpe3ZhciBpbnZva2VyQXJnc0FycmF5PVthcmdUeXBlc1swXSxudWxsXS5jb25jYXQoYXJnVHlwZXMuc2xpY2UoMSkpO3ZhciBmdW5jPWNyYWZ0SW52b2tlckZ1bmN0aW9uKGh1bWFuTmFtZSxpbnZva2VyQXJnc0FycmF5LG51bGwscmF3SW52b2tlcixmbik7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7cHJvdG9bbWV0aG9kTmFtZV09ZnVuY31lbHNle3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMV09ZnVuY31yZXR1cm5bXX0pKTtyZXR1cm5bXX0pKX1mdW5jdGlvbiBfX2VtYmluZF9jcmVhdGVfaW5oZXJpdGluZ19jb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvck5hbWUsd3JhcHBlclR5cGUscHJvcGVydGllcyl7Y29uc3RydWN0b3JOYW1lPXJlYWRMYXRpbjFTdHJpbmcoY29uc3RydWN0b3JOYW1lKTt3cmFwcGVyVHlwZT1yZXF1aXJlUmVnaXN0ZXJlZFR5cGUod3JhcHBlclR5cGUsIndyYXBwZXIiKTtwcm9wZXJ0aWVzPXJlcXVpcmVIYW5kbGUocHJvcGVydGllcyk7dmFyIGFycmF5U2xpY2U9W10uc2xpY2U7dmFyIHJlZ2lzdGVyZWRDbGFzcz13cmFwcGVyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHdyYXBwZXJQcm90b3R5cGU9cmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlO3ZhciBiYXNlQ2xhc3M9cmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzczt2YXIgYmFzZUNsYXNzUHJvdG90eXBlPWJhc2VDbGFzcy5pbnN0YW5jZVByb3RvdHlwZTt2YXIgYmFzZUNvbnN0cnVjdG9yPXJlZ2lzdGVyZWRDbGFzcy5iYXNlQ2xhc3MuY29uc3RydWN0b3I7dmFyIGN0b3I9Y3JlYXRlTmFtZWRGdW5jdGlvbihjb25zdHJ1Y3Rvck5hbWUsKGZ1bmN0aW9uKCl7cmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzcy5wdXJlVmlydHVhbEZ1bmN0aW9ucy5mb3JFYWNoKChmdW5jdGlvbihuYW1lKXtpZih0aGlzW25hbWVdPT09YmFzZUNsYXNzUHJvdG90eXBlW25hbWVdKXt0aHJvdyBuZXcgUHVyZVZpcnR1YWxFcnJvcigiUHVyZSB2aXJ0dWFsIGZ1bmN0aW9uICIrbmFtZSsiIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCIpfX0pLmJpbmQodGhpcykpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfX3BhcmVudCIse3ZhbHVlOndyYXBwZXJQcm90b3R5cGV9KTt0aGlzLl9fY29uc3RydWN0LmFwcGx5KHRoaXMsYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpfSkpO3dyYXBwZXJQcm90b3R5cGUuX19jb25zdHJ1Y3Q9ZnVuY3Rpb24gX19jb25zdHJ1Y3QoKXtpZih0aGlzPT09d3JhcHBlclByb3RvdHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3MgY29ycmVjdCAndGhpcycgdG8gX19jb25zdHJ1Y3QiKX12YXIgaW5uZXI9YmFzZUNvbnN0cnVjdG9yLmltcGxlbWVudC5hcHBseSh1bmRlZmluZWQsW3RoaXNdLmNvbmNhdChhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO3ZhciAkJD1pbm5lci4kJDtpbm5lci5ub3RpZnlPbkRlc3RydWN0aW9uKCk7JCQucHJlc2VydmVQb2ludGVyT25EZWxldGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJCQiLHt2YWx1ZTokJH0pO3JlZ2lzdGVySW5oZXJpdGVkSW5zdGFuY2UocmVnaXN0ZXJlZENsYXNzLCQkLnB0cix0aGlzKX07d3JhcHBlclByb3RvdHlwZS5fX2Rlc3RydWN0PWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKXtpZih0aGlzPT09d3JhcHBlclByb3RvdHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3MgY29ycmVjdCAndGhpcycgdG8gX19kZXN0cnVjdCIpfXVucmVnaXN0ZXJJbmhlcml0ZWRJbnN0YW5jZShyZWdpc3RlcmVkQ2xhc3MsdGhpcy4kJC5wdHIpfTtjdG9yLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHdyYXBwZXJQcm90b3R5cGUpO2Zvcih2YXIgcCBpbiBwcm9wZXJ0aWVzKXtjdG9yLnByb3RvdHlwZVtwXT1wcm9wZXJ0aWVzW3BdfXJldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGN0b3IpfXZhciBjaGFyXzA9IjAiLmNoYXJDb2RlQXQoMCk7dmFyIGNoYXJfOT0iOSIuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiBtYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSl7bmFtZT1uYW1lLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywiJCIpO3ZhciBmPW5hbWUuY2hhckNvZGVBdCgwKTtpZihmPj1jaGFyXzAmJmY8PWNoYXJfOSl7cmV0dXJuIl8iK25hbWV9ZWxzZXtyZXR1cm4gbmFtZX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfc21hcnRfcHRyKHJhd1R5cGUscmF3UG9pbnRlZVR5cGUsbmFtZSxzaGFyaW5nUG9saWN5LGdldFBvaW50ZWVTaWduYXR1cmUscmF3R2V0UG9pbnRlZSxjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3RvcixzaGFyZVNpZ25hdHVyZSxyYXdTaGFyZSxkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyYXdHZXRQb2ludGVlPXJlcXVpcmVGdW5jdGlvbihnZXRQb2ludGVlU2lnbmF0dXJlLHJhd0dldFBvaW50ZWUpO3Jhd0NvbnN0cnVjdG9yPXJlcXVpcmVGdW5jdGlvbihjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3Rvcik7cmF3U2hhcmU9cmVxdWlyZUZ1bmN0aW9uKHNoYXJlU2lnbmF0dXJlLHJhd1NoYXJlKTtyYXdEZXN0cnVjdG9yPXJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtyYXdUeXBlXSxbcmF3UG9pbnRlZVR5cGVdLChmdW5jdGlvbihwb2ludGVlVHlwZSl7cG9pbnRlZVR5cGU9cG9pbnRlZVR5cGVbMF07dmFyIHJlZ2lzdGVyZWRQb2ludGVyPW5ldyBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHBvaW50ZWVUeXBlLnJlZ2lzdGVyZWRDbGFzcyxmYWxzZSxmYWxzZSx0cnVlLHBvaW50ZWVUeXBlLHNoYXJpbmdQb2xpY3kscmF3R2V0UG9pbnRlZSxyYXdDb25zdHJ1Y3RvcixyYXdTaGFyZSxyYXdEZXN0cnVjdG9yKTtyZXR1cm5bcmVnaXN0ZXJlZFBvaW50ZXJdfSkpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2VudW0ocmF3VHlwZSxuYW1lLHNpemUsaXNTaWduZWQpe3ZhciBzaGlmdD1nZXRTaGlmdEZyb21TaXplKHNpemUpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtmdW5jdGlvbiBjb25zdHJ1Y3Rvcigpe31jb25zdHJ1Y3Rvci52YWx1ZXM9e307cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSxjb25zdHJ1Y3Rvcjpjb25zdHJ1Y3RvciwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudmFsdWVzW2NdfSksInRvV2lyZVR5cGUiOihmdW5jdGlvbihkZXN0cnVjdG9ycyxjKXtyZXR1cm4gYy52YWx1ZX0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmludGVnZXJSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LGlzU2lnbmVkKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLGNvbnN0cnVjdG9yKX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbnVtX3ZhbHVlKHJhd0VudW1UeXBlLG5hbWUsZW51bVZhbHVlKXt2YXIgZW51bVR5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJhd0VudW1UeXBlLCJlbnVtIik7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3ZhciBFbnVtPWVudW1UeXBlLmNvbnN0cnVjdG9yO3ZhciBWYWx1ZT1PYmplY3QuY3JlYXRlKGVudW1UeXBlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx7dmFsdWU6e3ZhbHVlOmVudW1WYWx1ZX0sY29uc3RydWN0b3I6e3ZhbHVlOmNyZWF0ZU5hbWVkRnVuY3Rpb24oZW51bVR5cGUubmFtZSsiXyIrbmFtZSwoZnVuY3Rpb24oKXt9KSl9fSk7RW51bS52YWx1ZXNbZW51bVZhbHVlXT1WYWx1ZTtFbnVtW25hbWVdPVZhbHVlfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NvbnN0YW50KG5hbWUsdHlwZSx2YWx1ZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFt0eXBlXSwoZnVuY3Rpb24odHlwZSl7dHlwZT10eXBlWzBdO01vZHVsZVtuYW1lXT10eXBlWyJmcm9tV2lyZVR5cGUiXSh2YWx1ZSk7cmV0dXJuW119KSl9dmFyIE1vZHVsZT1Nb2R1bGV8fHt9O3ZhciBfZW12YWxfaGFuZGxlX2FycmF5PVt7fV07dmFyIF9lbXZhbF9mcmVlX2xpc3Q9W107TW9kdWxlLmNvdW50X2VtdmFsX2hhbmRsZXM9KGZ1bmN0aW9uKCl7dmFyIGNvdW50PTA7Zm9yKHZhciBpPTE7aTxfZW12YWxfaGFuZGxlX2FycmF5Lmxlbmd0aDsrK2kpe2lmKF9lbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpeysrY291bnR9fXJldHVybiBjb3VudH0pO01vZHVsZS5nZXRfZmlyc3RfZW12YWw9KGZ1bmN0aW9uKCl7Zm9yKHZhciBpPTE7aTxfZW12YWxfaGFuZGxlX2FycmF5Lmxlbmd0aDsrK2kpe2lmKF9lbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpe3JldHVybiBfZW12YWxfaGFuZGxlX2FycmF5W2ldfX1yZXR1cm4gbnVsbH0pO3ZhciBfZW12YWxfc3ltYm9scz17fTtmdW5jdGlvbiBfX2VtdmFsX3JlZ2lzdGVyX3N5bWJvbChhZGRyZXNzKXtfZW12YWxfc3ltYm9sc1thZGRyZXNzXT1yZWFkTGF0aW4xU3RyaW5nKGFkZHJlc3MpfWZ1bmN0aW9uIGdldFN0cmluZ09yU3ltYm9sKGFkZHJlc3Mpe3ZhciBzeW1ib2w9X2VtdmFsX3N5bWJvbHNbYWRkcmVzc107aWYoc3ltYm9sPT09dW5kZWZpbmVkKXtyZXR1cm4gcmVhZExhdGluMVN0cmluZyhhZGRyZXNzKX1lbHNle3JldHVybiBzeW1ib2x9fWZ1bmN0aW9uIHJlcXVpcmVIYW5kbGUoaGFuZGxlKXtpZighaGFuZGxlKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHVzZSBkZWxldGVkIHZhbC4gaGFuZGxlID0gIitoYW5kbGUpfXJldHVybiBfZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0udmFsdWV9ZnVuY3Rpb24gX19lbXZhbF9yZWdpc3Rlcih2YWx1ZSl7dmFyIGhhbmRsZT1fZW12YWxfZnJlZV9saXN0Lmxlbmd0aD9fZW12YWxfZnJlZV9saXN0LnBvcCgpOl9lbXZhbF9oYW5kbGVfYXJyYXkubGVuZ3RoO19lbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXT17cmVmY291bnQ6MSx2YWx1ZTp2YWx1ZX07cmV0dXJuIGhhbmRsZX1mdW5jdGlvbiBfX2VtdmFsX2luY3JlZihoYW5kbGUpe2lmKGhhbmRsZSl7X2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnJlZmNvdW50Kz0xfX1mdW5jdGlvbiBfX2VtdmFsX2RlY3JlZihoYW5kbGUpe2lmKGhhbmRsZSYmMD09PS0tX2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnJlZmNvdW50KXtfZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV09dW5kZWZpbmVkO19lbXZhbF9mcmVlX2xpc3QucHVzaChoYW5kbGUpfX1mdW5jdGlvbiBfX2VtdmFsX3J1bl9kZXN0cnVjdG9ycyhoYW5kbGUpe3ZhciBkZXN0cnVjdG9ycz1fZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0udmFsdWU7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO19fZW12YWxfZGVjcmVmKGhhbmRsZSl9ZnVuY3Rpb24gX19lbXZhbF9uZXdfYXJyYXkoKXtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihbXSl9ZnVuY3Rpb24gX19lbXZhbF9uZXdfb2JqZWN0KCl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoe30pfWZ1bmN0aW9uIF9fZW12YWxfdW5kZWZpbmVkKCl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIodW5kZWZpbmVkKX1mdW5jdGlvbiBfX2VtdmFsX251bGwoKXtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihudWxsKX1mdW5jdGlvbiBfX2VtdmFsX25ld19jc3RyaW5nKHYpe3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGdldFN0cmluZ09yU3ltYm9sKHYpKX1mdW5jdGlvbiBfX2VtdmFsX3Rha2VfdmFsdWUodHlwZSxhcmd2KXt0eXBlPXJlcXVpcmVSZWdpc3RlcmVkVHlwZSh0eXBlLCJfZW12YWxfdGFrZV92YWx1ZSIpO3ZhciB2PXR5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl0oYXJndik7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIodil9dmFyIF9fbmV3ZXJzPXt9O2Z1bmN0aW9uIGNyYWZ0RW12YWxBbGxvY2F0b3IoYXJnQ291bnQpe3ZhciBhcmdzTGlzdD0iIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50OysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpfXZhciBmdW5jdGlvbkJvZHk9InJldHVybiBmdW5jdGlvbiBlbXZhbF9hbGxvY2F0b3JfIithcmdDb3VudCsiKGNvbnN0cnVjdG9yLCBhcmdUeXBlcywgYXJncykge1xuIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50OysraSl7ZnVuY3Rpb25Cb2R5Kz0idmFyIGFyZ1R5cGUiK2krIiA9IHJlcXVpcmVSZWdpc3RlcmVkVHlwZShIRUFQMzJbKGFyZ1R5cGVzID4+IDIpICsgIitpKyddLCAicGFyYW1ldGVyICcraSsnIik7XG4nKyJ2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7XG4iKyJhcmdzICs9IGFyZ1R5cGUiK2krIi5hcmdQYWNrQWR2YW5jZTtcbiJ9ZnVuY3Rpb25Cb2R5Kz0idmFyIG9iaiA9IG5ldyBjb25zdHJ1Y3RvcigiK2FyZ3NMaXN0KyIpO1xuIisicmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIob2JqKTtcbiIrIn1cbiI7cmV0dXJuKG5ldyBGdW5jdGlvbigicmVxdWlyZVJlZ2lzdGVyZWRUeXBlIiwiSEVBUDMyIiwiX19lbXZhbF9yZWdpc3RlciIsZnVuY3Rpb25Cb2R5KSkocmVxdWlyZVJlZ2lzdGVyZWRUeXBlLEhFQVAzMixfX2VtdmFsX3JlZ2lzdGVyKX1mdW5jdGlvbiBfX2VtdmFsX25ldyhoYW5kbGUsYXJnQ291bnQsYXJnVHlwZXMsYXJncyl7aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTt2YXIgbmV3ZXI9X19uZXdlcnNbYXJnQ291bnRdO2lmKCFuZXdlcil7bmV3ZXI9Y3JhZnRFbXZhbEFsbG9jYXRvcihhcmdDb3VudCk7X19uZXdlcnNbYXJnQ291bnRdPW5ld2VyfXJldHVybiBuZXdlcihoYW5kbGUsYXJnVHlwZXMsYXJncyl9dmFyIGdsb2JhbD0oZnVuY3Rpb24oKXtyZXR1cm4gRnVuY3Rpb259KSgpKCJyZXR1cm4gdGhpcyIpKCk7ZnVuY3Rpb24gX19lbXZhbF9nZXRfZ2xvYmFsKG5hbWUpe25hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobmFtZSk7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZ2xvYmFsW25hbWVdKX1mdW5jdGlvbiBfX2VtdmFsX2dldF9tb2R1bGVfcHJvcGVydHkobmFtZSl7bmFtZT1nZXRTdHJpbmdPclN5bWJvbChuYW1lKTtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihNb2R1bGVbbmFtZV0pfWZ1bmN0aW9uIF9fZW12YWxfZ2V0X3Byb3BlcnR5KGhhbmRsZSxrZXkpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7a2V5PXJlcXVpcmVIYW5kbGUoa2V5KTtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihoYW5kbGVba2V5XSl9ZnVuY3Rpb24gX19lbXZhbF9zZXRfcHJvcGVydHkoaGFuZGxlLGtleSx2YWx1ZSl7aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTtrZXk9cmVxdWlyZUhhbmRsZShrZXkpO3ZhbHVlPXJlcXVpcmVIYW5kbGUodmFsdWUpO2hhbmRsZVtrZXldPXZhbHVlfWZ1bmN0aW9uIF9fZW12YWxfYXMoaGFuZGxlLHJldHVyblR5cGUsZGVzdHJ1Y3RvcnNSZWYpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7cmV0dXJuVHlwZT1yZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmV0dXJuVHlwZSwiZW12YWw6OmFzIik7dmFyIGRlc3RydWN0b3JzPVtdO3ZhciByZD1fX2VtdmFsX3JlZ2lzdGVyKGRlc3RydWN0b3JzKTtIRUFQMzJbZGVzdHJ1Y3RvcnNSZWY+PjJdPXJkO3JldHVybiByZXR1cm5UeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsaGFuZGxlKX1mdW5jdGlvbiBfX2VtdmFsX2NhbGwoaGFuZGxlLGFyZ0NvdW50LGFyZ1R5cGVzLGFyZ3Ype2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7dmFyIHR5cGVzPWxvb2t1cFR5cGVzKGFyZ0NvdW50LGFyZ1R5cGVzKTt2YXIgYXJncz1uZXcgQXJyYXkoYXJnQ291bnQpO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXt2YXIgdHlwZT10eXBlc1tpXTthcmdzW2ldPXR5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl0oYXJndik7YXJndis9dHlwZS5hcmdQYWNrQWR2YW5jZX12YXIgcnY9aGFuZGxlLmFwcGx5KHVuZGVmaW5lZCxhcmdzKTtyZXR1cm4gX19lbXZhbF9yZWdpc3Rlcihydil9ZnVuY3Rpb24gbG9va3VwVHlwZXMoYXJnQ291bnQsYXJnVHlwZXMsYXJnV2lyZVR5cGVzKXt2YXIgYT1uZXcgQXJyYXkoYXJnQ291bnQpO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXthW2ldPXJlcXVpcmVSZWdpc3RlcmVkVHlwZShIRUFQMzJbKGFyZ1R5cGVzPj4yKStpXSwicGFyYW1ldGVyICIraSl9cmV0dXJuIGF9ZnVuY3Rpb24gYWxsb2NhdGVEZXN0cnVjdG9ycyhkZXN0cnVjdG9yc1JlZil7dmFyIGRlc3RydWN0b3JzPVtdO0hFQVAzMltkZXN0cnVjdG9yc1JlZj4+Ml09X19lbXZhbF9yZWdpc3RlcihkZXN0cnVjdG9ycyk7cmV0dXJuIGRlc3RydWN0b3JzfXZhciBtZXRob2RDYWxsZXJzPVt1bmRlZmluZWRdO2Z1bmN0aW9uIGFkZE1ldGhvZENhbGxlcihjYWxsZXIpe3ZhciBpZD1tZXRob2RDYWxsZXJzLmxlbmd0aDttZXRob2RDYWxsZXJzLnB1c2goY2FsbGVyKTtyZXR1cm4gaWR9ZnVuY3Rpb24gX19lbXZhbF9nZXRfbWV0aG9kX2NhbGxlcihhcmdDb3VudCxhcmdUeXBlcyl7dmFyIHR5cGVzPWxvb2t1cFR5cGVzKGFyZ0NvdW50LGFyZ1R5cGVzKTt2YXIgcmV0VHlwZT10eXBlc1swXTt2YXIgc2lnbmF0dXJlTmFtZT1yZXRUeXBlLm5hbWUrIl8kIit0eXBlcy5zbGljZSgxKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWV9KSkuam9pbigiXyIpKyIkIjt2YXIgcGFyYW1zPVsicmV0VHlwZSJdO3ZhciBhcmdzPVtyZXRUeXBlXTt2YXIgYXJnc0xpc3Q9IiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpO3BhcmFtcy5wdXNoKCJhcmdUeXBlIitpKTthcmdzLnB1c2godHlwZXNbMStpXSl9dmFyIGZ1bmN0aW9uQm9keT0icmV0dXJuIGZ1bmN0aW9uIChoYW5kbGUsIG5hbWUsIGRlc3RydWN0b3JzLCBhcmdzKSB7XG4iO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMTsrK2kpe2Z1bmN0aW9uQm9keSs9IiAgICB2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7XG4iKyIgICAgYXJncyArPSBhcmdUeXBlIitpKyIuYXJnUGFja0FkdmFuY2U7XG4ifWZ1bmN0aW9uQm9keSs9IiAgICB2YXIgcnYgPSBoYW5kbGVbbmFtZV0oIithcmdzTGlzdCsiKTtcbiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7aWYodHlwZXNbaSsxXVsiZGVsZXRlT2JqZWN0Il0pe2Z1bmN0aW9uQm9keSs9IiAgICBhcmdUeXBlIitpKyIuZGVsZXRlT2JqZWN0KGFyZyIraSsiKTtcbiJ9fWZ1bmN0aW9uQm9keSs9IiAgICByZXR1cm4gcmV0VHlwZS50b1dpcmVUeXBlKGRlc3RydWN0b3JzLCBydik7XG4iKyJ9O1xuIjtwYXJhbXMucHVzaChmdW5jdGlvbkJvZHkpO3ZhciBpbnZva2VyRnVuY3Rpb249bmV3XyhGdW5jdGlvbixwYXJhbXMpLmFwcGx5KG51bGwsYXJncyk7cmV0dXJuIGFkZE1ldGhvZENhbGxlcihjcmVhdGVOYW1lZEZ1bmN0aW9uKHNpZ25hdHVyZU5hbWUsaW52b2tlckZ1bmN0aW9uKSl9ZnVuY3Rpb24gX19lbXZhbF9jYWxsX21ldGhvZChjYWxsZXIsaGFuZGxlLG1ldGhvZE5hbWUsZGVzdHJ1Y3RvcnNSZWYsYXJncyl7Y2FsbGVyPW1ldGhvZENhbGxlcnNbY2FsbGVyXTtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO21ldGhvZE5hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobWV0aG9kTmFtZSk7cmV0dXJuIGNhbGxlcihoYW5kbGUsbWV0aG9kTmFtZSxhbGxvY2F0ZURlc3RydWN0b3JzKGRlc3RydWN0b3JzUmVmKSxhcmdzKX1mdW5jdGlvbiBfX2VtdmFsX2hhc19mdW5jdGlvbihoYW5kbGUsbmFtZSxjbGFzc1R5cGUpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7bmFtZT1nZXRTdHJpbmdPclN5bWJvbChuYW1lKTtjbGFzc1R5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKGNsYXNzVHlwZSwiY2xhc3Mgd3JhcHBlciBmaWx0ZXIiKTt2YXIgZmlsdGVyPWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGVbbmFtZV07cmV0dXJuIGhhbmRsZVtuYW1lXWluc3RhbmNlb2YgRnVuY3Rpb24mJihmaWx0ZXI9PT11bmRlZmluZWR8fGhhbmRsZVtuYW1lXSE9PWZpbHRlcil9ZnVuY3Rpb24gX19lbXZhbF90eXBlb2YoaGFuZGxlKXtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKHR5cGVvZiBoYW5kbGUpfWlmKE1vZHVsZVsicHJlSW5pdCJdKXtpZih0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il09PSJmdW5jdGlvbiIpTW9kdWxlWyJwcmVJbml0Il09W01vZHVsZVsicHJlSW5pdCJdXTt3aGlsZShNb2R1bGVbInByZUluaXQiXS5sZW5ndGg+MCl7TW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKX19dmFyIHNob3VsZFJ1bk5vdz10cnVlO2lmKE1vZHVsZVsibm9Jbml0aWFsUnVuIl0pe3Nob3VsZFJ1bk5vdz1mYWxzZX1ydW4oKQoKCgoKLy8gbGF6LWxvYWRlci13b3JrZXIuanMKLy8KCi8vaW1wb3J0U2NyaXB0cygnbGF6LXBlcmYuanMnKTsKCnZhciBpbnN0YW5jZSA9IG51bGw7IC8vIGxhei1wZXJmIGluc3RhbmNlCgpmdW5jdGlvbiByZWFkQXMoYnVmLCBUeXBlLCBvZmZzZXQsIGNvdW50KSB7Cgljb3VudCA9IChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IGNvdW50ID09PSAwID8gMSA6IGNvdW50KTsKCXZhciBzdWIgPSBidWYuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBUeXBlLkJZVEVTX1BFUl9FTEVNRU5UICogY291bnQpOwoKCXZhciByID0gbmV3IFR5cGUoc3ViKTsKCWlmIChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IGNvdW50ID09PSAxKQoJCXJldHVybiByWzBdOwoKCXZhciByZXQgPSBbXTsKCWZvciAodmFyIGkgPSAwIDsgaSA8IGNvdW50IDsgaSArKykgewoJCXJldC5wdXNoKHJbaV0pOwoJfQoKCXJldHVybiByZXQ7Cn0KCmZ1bmN0aW9uIHBhcnNlTEFTSGVhZGVyKGFycmF5YnVmZmVyKSB7Cgl2YXIgbyA9IHt9OwoKCW8ucG9pbnRzT2Zmc2V0ID0gcmVhZEFzKGFycmF5YnVmZmVyLCBVaW50MzJBcnJheSwgMzIqMyk7CglvLnBvaW50c0Zvcm1hdElkID0gcmVhZEFzKGFycmF5YnVmZmVyLCBVaW50OEFycmF5LCAzMiozKzgpOwoJby5wb2ludHNTdHJ1Y3RTaXplID0gcmVhZEFzKGFycmF5YnVmZmVyLCBVaW50MTZBcnJheSwgMzIqMys4KzEpOwoJby5wb2ludHNDb3VudCA9IHJlYWRBcyhhcnJheWJ1ZmZlciwgVWludDMyQXJyYXksIDMyKjMgKyAxMSk7CgoKCXZhciBzdGFydCA9IDMyKjMgKyAzNTsKCW8uc2NhbGUgPSByZWFkQXMoYXJyYXlidWZmZXIsIEZsb2F0NjRBcnJheSwgc3RhcnQsIDMpOyBzdGFydCArPSAyNDsgLy8gOCozCglvLm9mZnNldCA9IHJlYWRBcyhhcnJheWJ1ZmZlciwgRmxvYXQ2NEFycmF5LCBzdGFydCwgMyk7IHN0YXJ0ICs9IDI0OwoKCXZhciBib3VuZHMgPSByZWFkQXMoYXJyYXlidWZmZXIsIEZsb2F0NjRBcnJheSwgc3RhcnQsIDYpOyBzdGFydCArPSA0ODsgLy8gOCo2OwoJby5tYXhzID0gW2JvdW5kc1swXSwgYm91bmRzWzJdLCBib3VuZHNbNF1dOwoJby5taW5zID0gW2JvdW5kc1sxXSwgYm91bmRzWzNdLCBib3VuZHNbNV1dOwoKCXJldHVybiBvOwp9CgpmdW5jdGlvbiBoYW5kbGVFdmVudChtc2cpIHsKCXN3aXRjaChtc2cudHlwZSkgewoJCWNhc2UgIm9wZW4iOgoJCQl0cnkgewoJCQkJaW5zdGFuY2UgPSBuZXcgTW9kdWxlLkxBU1ppcCgpOwoJCQkJdmFyIGFiSW50ID0gbmV3IFVpbnQ4QXJyYXkobXNnLmFycmF5YnVmZmVyKTsKCQkJCXZhciBidWYgPSBNb2R1bGUuX21hbGxvYyhtc2cuYXJyYXlidWZmZXIuYnl0ZUxlbmd0aCk7CgoJCQkJaW5zdGFuY2UuYXJyYXlidWZmZXIgPSBtc2cuYXJyYXlidWZmZXI7CgkJCQlpbnN0YW5jZS5idWYgPSBidWY7CgkJCQlNb2R1bGUuSEVBUFU4LnNldChhYkludCwgYnVmKTsKCQkJCWluc3RhbmNlLm9wZW4oYnVmLCBtc2cuYXJyYXlidWZmZXIuYnl0ZUxlbmd0aCk7CgoJCQkJaW5zdGFuY2UucmVhZE9mZnNldCA9IDA7CgoJCQkJcG9zdE1lc3NhZ2UoeyB0eXBlOiAib3BlbiIsIHN0YXR1czogMX0pOwoJCQl9CgkJCWNhdGNoKGUpIHsKCQkJCXBvc3RNZXNzYWdlKHsgdHlwZTogIm9wZW4iLCBzdGF0dXM6IDAsIGRldGFpbHM6IGUgfSk7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgImhlYWRlciI6CgkJCWlmICghaW5zdGFuY2UpCgkJCQl0aHJvdyBuZXcgRXJyb3IoIllvdSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgYmVmb3JlIHRyeWluZyB0byByZWFkIGhlYWRlciIpOwoKCgoJCQl2YXIgaGVhZGVyID0gcGFyc2VMQVNIZWFkZXIoaW5zdGFuY2UuYXJyYXlidWZmZXIpOwoJCQloZWFkZXIucG9pbnRzRm9ybWF0SWQgJj0gMHgzZjsKCQkJaW5zdGFuY2UuaGVhZGVyID0gaGVhZGVyOwoJCQlwb3N0TWVzc2FnZSh7dHlwZTogImhlYWRlciIsIHN0YXR1czogMSwgaGVhZGVyOiBoZWFkZXJ9KTsKCQkJYnJlYWs7CgoJCWNhc2UgInJlYWQiOgoJCQlpZiAoIWluc3RhbmNlKQoJCQkJdGhyb3cgbmV3IEVycm9yKCJZb3UgbmVlZCB0byBvcGVuIHRoZSBmaWxlIGJlZm9yZSB0cnlpbmcgdG8gcmVhZCBzdHVmZiIpOwoKCQkJdmFyIHN0YXJ0ID0gbXNnLnN0YXJ0LCBjb3VudCA9IG1zZy5jb3VudCwgc2tpcCA9IG1zZy5za2lwOwoJCQl2YXIgbyA9IGluc3RhbmNlOwoKCQkJaWYgKCFvLmhlYWRlcikKCQkJCXRocm93IG5ldyBFcnJvcigiWW91IG5lZWQgdG8gcXVlcnkgaGVhZGVyIGJlZm9yZSByZWFkaW5nLCBJIG1haW50YWluIHN0YXRlIHRoYXQgd2F5LCBzb3JyeSA6KCIpOwoKCQkJdmFyIHBvaW50c1RvUmVhZCA9IE1hdGgubWluKGNvdW50ICogc2tpcCwgby5oZWFkZXIucG9pbnRzQ291bnQgLSBvLnJlYWRPZmZzZXQpOwoJCQl2YXIgYnVmZmVyU2l6ZSA9IE1hdGguY2VpbChwb2ludHNUb1JlYWQgLyBza2lwKTsKCQkJdmFyIHBvaW50c1JlYWQgPSAwOwoKCQkJdmFyIHRoaXNfYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyU2l6ZSAqIG8uaGVhZGVyLnBvaW50c1N0cnVjdFNpemUpOwoJCQl2YXIgYnVmX3JlYWQgPSBNb2R1bGUuX21hbGxvYyhvLmhlYWRlci5wb2ludHNTdHJ1Y3RTaXplKTsKCQkJZm9yICh2YXIgaSA9IDAgOyBpIDwgcG9pbnRzVG9SZWFkIDsgaSArKykgewoJCQkJby5nZXRQb2ludChidWZfcmVhZCk7CgoJCQkJaWYgKGkgJSBza2lwID09PSAwKSB7CgkJCQkJdmFyIGEgPSBuZXcgVWludDhBcnJheShNb2R1bGUuSEVBUFU4LmJ1ZmZlciwgYnVmX3JlYWQsIG8uaGVhZGVyLnBvaW50c1N0cnVjdFNpemUpOwoJCQkJCXRoaXNfYnVmLnNldChhLCBwb2ludHNSZWFkICogby5oZWFkZXIucG9pbnRzU3RydWN0U2l6ZSwgby5oZWFkZXIucG9pbnRzU3RydWN0U2l6ZSk7CgkJCQkJcG9pbnRzUmVhZCArKzsKCQkJCX0KCgkJCQlvLnJlYWRPZmZzZXQgKys7CgkJCX0KCgkJCXBvc3RNZXNzYWdlKHsKCQkJCXR5cGU6ICdoZWFkZXInLAoJCQkJc3RhdHVzOiAxLAoJCQkJYnVmZmVyOiB0aGlzX2J1Zi5idWZmZXIsCgkJCQljb3VudDogcG9pbnRzUmVhZCwKCQkJCWhhc01vcmVEYXRhOiBvLnJlYWRPZmZzZXQgPCBvLmhlYWRlci5wb2ludHNDb3VudAoJCQl9KTsKCgkJCWJyZWFrOwoKCgkJY2FzZSAiY2xvc2UiOgoJCQlpZiAoaW5zdGFuY2UgIT09IG51bGwpIHsKCQkJCWluc3RhbmNlLmRlbGV0ZSgpOwoJCQkJaW5zdGFuY2UgPSBudWxsOwoJCQl9CgkJCXBvc3RNZXNzYWdlKHsgdHlwZTogImNsb3NlIiwgc3RhdHVzOiAxfSk7CgkJCWJyZWFrOwoJfQp9Cgpvbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkgewoJdHJ5IHsKCQloYW5kbGVFdmVudChldmVudC5kYXRhKTsKCX0gY2F0Y2goZSkgewoJCXBvc3RNZXNzYWdlKHt0eXBlOiBldmVudC5kYXRhLnR5cGUsIHN0YXR1czogMCwgZGV0YWlsczogZX0pOwoJfQp9OwoKCg==")); -Potree.workers.lasdecoder = new Potree.WorkerManager(atob("CgovL3ZhciBwb2ludEZvcm1hdFJlYWRlcnMgPSB7Ci8vCTA6IGZ1bmN0aW9uKGR2KSB7Ci8vCQlyZXR1cm4gewovLwkJCSJwb3NpdGlvbiI6IFsgZHYuZ2V0SW50MzIoMCwgdHJ1ZSksIGR2LmdldEludDMyKDQsIHRydWUpLCBkdi5nZXRJbnQzMig4LCB0cnVlKV0sCi8vCQkJImludGVuc2l0eSI6IGR2LmdldFVpbnQxNigxMiwgdHJ1ZSksCi8vCQkJImNsYXNzaWZpY2F0aW9uIjogZHYuZ2V0VWludDgoMTYsIHRydWUpCi8vCQl9OwovLwl9LAovLwkxOiBmdW5jdGlvbihkdikgewovLwkJcmV0dXJuIHsKLy8JCQkicG9zaXRpb24iOiBbIGR2LmdldEludDMyKDAsIHRydWUpLCBkdi5nZXRJbnQzMig0LCB0cnVlKSwgZHYuZ2V0SW50MzIoOCwgdHJ1ZSldLAovLwkJCSJpbnRlbnNpdHkiOiBkdi5nZXRVaW50MTYoMTIsIHRydWUpLAovLwkJCSJjbGFzc2lmaWNhdGlvbiI6IGR2LmdldFVpbnQ4KDE2LCB0cnVlKQovLwkJfTsKLy8JfSwKLy8JMjogZnVuY3Rpb24oZHYpIHsKLy8JCXJldHVybiB7Ci8vCQkJInBvc2l0aW9uIjogWyBkdi5nZXRJbnQzMigwLCB0cnVlKSwgZHYuZ2V0SW50MzIoNCwgdHJ1ZSksIGR2LmdldEludDMyKDgsIHRydWUpXSwKLy8JCQkiaW50ZW5zaXR5IjogZHYuZ2V0VWludDE2KDEyLCB0cnVlKSwKLy8JCQkiY2xhc3NpZmljYXRpb24iOiBkdi5nZXRVaW50OCgxNiwgdHJ1ZSksCi8vCQkJImNvbG9yIjogW2R2LmdldFVpbnQxNigyMCwgdHJ1ZSksIGR2LmdldFVpbnQxNigyMiwgdHJ1ZSksIGR2LmdldFVpbnQxNigyNCwgdHJ1ZSldCi8vCQl9OwovLwl9LAovLwkzOiBmdW5jdGlvbihkdikgewovLwkJcmV0dXJuIHsKLy8JCQkicG9zaXRpb24iOiBbIGR2LmdldEludDMyKDAsIHRydWUpLCBkdi5nZXRJbnQzMig0LCB0cnVlKSwgZHYuZ2V0SW50MzIoOCwgdHJ1ZSldLAovLwkJCSJpbnRlbnNpdHkiOiBkdi5nZXRVaW50MTYoMTIsIHRydWUpLAovLwkJCSJjbGFzc2lmaWNhdGlvbiI6IGR2LmdldFVpbnQ4KDE2LCB0cnVlKSwKLy8JCQkiY29sb3IiOiBbZHYuZ2V0VWludDE2KDI4LCB0cnVlKSwgZHYuZ2V0VWludDE2KDMwLCB0cnVlKSwgZHYuZ2V0VWludDE2KDMyLCB0cnVlKV0KLy8JCX07Ci8vCX0KLy99OwovLwkKLy8JCi8vIERlY29kZXMgTEFTIHJlY29yZHMgaW50byBwb2ludHMKLy8KLy92YXIgTEFTRGVjb2RlciA9IGZ1bmN0aW9uKGJ1ZmZlciwgcG9pbnRGb3JtYXRJRCwgcG9pbnRTaXplLCBwb2ludHNDb3VudCwgc2NhbGUsIG9mZnNldCkgewovLwl0aGlzLmFycmF5YiA9IGJ1ZmZlcjsKLy8JdGhpcy5kZWNvZGVyID0gcG9pbnRGb3JtYXRSZWFkZXJzW3BvaW50Rm9ybWF0SURdOwovLwl0aGlzLnBvaW50c0NvdW50ID0gcG9pbnRzQ291bnQ7Ci8vCXRoaXMucG9pbnRTaXplID0gcG9pbnRTaXplOwovLwl0aGlzLnNjYWxlID0gc2NhbGU7Ci8vCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwovL307Ci8vCi8vTEFTRGVjb2Rlci5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbihpbmRleCkgewovLwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucG9pbnRzQ291bnQpCi8vCQl0aHJvdyBuZXcgRXJyb3IoIlBvaW50IGluZGV4IG91dCBvZiByYW5nZSIpOwovLwovLwl2YXIgZHYgPSBuZXcgRGF0YVZpZXcodGhpcy5hcnJheWIsIGluZGV4ICogdGhpcy5wb2ludFNpemUsIHRoaXMucG9pbnRTaXplKTsKLy8JcmV0dXJuIHRoaXMuZGVjb2Rlcihkdik7Ci8vfTsKCm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KXsKCXZhciBidWZmZXIgPSBldmVudC5kYXRhLmJ1ZmZlcjsKCXZhciBudW1Qb2ludHMgPSBldmVudC5kYXRhLm51bVBvaW50czsKCXZhciBwb2ludFNpemUgPSBldmVudC5kYXRhLnBvaW50U2l6ZTsKCXZhciBwb2ludEZvcm1hdElEID0gZXZlbnQuZGF0YS5wb2ludEZvcm1hdElEOwoJdmFyIHNjYWxlID0gZXZlbnQuZGF0YS5zY2FsZTsKCXZhciBvZmZzZXQgPSBldmVudC5kYXRhLm9mZnNldDsKCXZhciBtaW5zID0gZXZlbnQuZGF0YS5taW5zOwoJdmFyIG1heHMgPSBldmVudC5kYXRhLm1heHM7Cgl2YXIgYmJPZmZzZXQgPSBldmVudC5kYXRhLmJiT2Zmc2V0OwoJCgl2YXIgdGVtcCA9IG5ldyBBcnJheUJ1ZmZlcig0KTsKCXZhciB0ZW1wVWludDggPSBuZXcgVWludDhBcnJheSh0ZW1wKTsKCXZhciB0ZW1wVWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRlbXApOwoJdmFyIHRlbXBGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0ZW1wKTsKCXZhciB0ZW1wSW50MzIgPSBuZXcgSW50MzJBcnJheSh0ZW1wKTsKCXZhciBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTsKCQoJdmFyIHBCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyozKjQpOwoJdmFyIGNCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyozKjQpOwoJdmFyIGlCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KTsKCXZhciBjbEJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBybkJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBuckJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBwc0J1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzICogMik7CgkKCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KHBCdWZmKTsKCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KGNCdWZmKTsKCXZhciBpbnRlbnNpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmYpOwoJdmFyIGNsYXNzaWZpY2F0aW9ucyA9IG5ldyBVaW50OEFycmF5KGNsQnVmZik7Cgl2YXIgcmV0dXJuTnVtYmVycyA9IG5ldyBVaW50OEFycmF5KHJuQnVmZik7Cgl2YXIgbnVtYmVyT2ZSZXR1cm5zID0gbmV3IFVpbnQ4QXJyYXkobnJCdWZmKTsKCXZhciBwb2ludFNvdXJjZUlEcyA9IG5ldyBVaW50MTZBcnJheShwc0J1ZmYpOwoJdmFyIHRpZ2h0Qm91bmRpbmdCb3ggPSB7CgkJbWluOiBbIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFldLAoJCW1heDogWyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgXQoJfTsKCQoJCgkvLyB0ZW1wIGFycmF5cyBzZWVtIHRvIGJlIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gRGF0YVZpZXdzCgkvLyBhdCB0aGUgbW9tZW50OiBodHRwOi8vanNwZXJmLmNvbS9kYXRhdmlldy12cy10ZW1wb3JhcnktZmxvYXQ2NGFycmF5Cglmb3IodmFyIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKyspewoJCgkJLy8gUE9TSVRJT04KCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzBdOwoJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMV07CgkJdGVtcFVpbnQ4WzJdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyXTsKCQl0ZW1wVWludDhbM10gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzNdOwoJCXZhciB4ID0gdGVtcEludDMyWzBdOwoJCQoJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrNF07CgkJdGVtcFVpbnQ4WzFdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSs1XTsKCQl0ZW1wVWludDhbMl0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzZdOwoJCXRlbXBVaW50OFszXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrN107CgkJdmFyIHkgPSB0ZW1wSW50MzJbMF07CgkJCgkJdGVtcFVpbnQ4WzBdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSs4XTsKCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzldOwoJCXRlbXBVaW50OFsyXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTBdOwoJCXRlbXBVaW50OFszXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTFdOwoJCXZhciB6ID0gdGVtcEludDMyWzBdOwoJCQoJCXBvc2l0aW9uc1szKmkrMF0gPSB4ICogc2NhbGVbMF0gKyBvZmZzZXRbMF0gKyBiYk9mZnNldFswXTsKCQlwb3NpdGlvbnNbMyppKzFdID0geSAqIHNjYWxlWzFdICsgb2Zmc2V0WzFdICsgYmJPZmZzZXRbMV07CgkJcG9zaXRpb25zWzMqaSsyXSA9IHogKiBzY2FsZVsyXSArIG9mZnNldFsyXSArIGJiT2Zmc2V0WzJdOwoJCQoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzBdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMF0sIHBvc2l0aW9uc1szKmkrMF0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzFdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMV0sIHBvc2l0aW9uc1szKmkrMV0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzJdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMl0sIHBvc2l0aW9uc1szKmkrMl0pOwoJCQoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzBdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMF0sIHBvc2l0aW9uc1szKmkrMF0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzFdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMV0sIHBvc2l0aW9uc1szKmkrMV0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzJdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMl0sIHBvc2l0aW9uc1szKmkrMl0pOwoJCQoJCS8vIElOVEVOU0lUWQoJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTJdOwoJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTNdOwoJCXZhciBpbnRlbnNpdHkgPSB0ZW1wVWludDE2WzBdOwoJCWludGVuc2l0aWVzW2ldID0gaW50ZW5zaXR5OwoJCQoJCS8vIFJFVFVSTiBOVU1CRVIsIHN0b3JlZCBpbiB0aGUgZmlyc3QgMyBiaXRzIC0gMDAwMDAxMTEKCQl2YXIgcmV0dXJuTnVtYmVyID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsxNF0gJiA3OwoJCXJldHVybk51bWJlcnNbaV0gPSByZXR1cm5OdW1iZXI7CgkJCgkJLy8gTlVNQkVSIE9GIFJFVFVSTlMsIHN0b3JlZCBpbiAwMDExMTAwMAoJCW51bWJlck9mUmV0dXJuc1tpXSA9IChidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE0XSAmIDU2KSAvIDg7CgkJCgkJLy8gQ0xBU1NJRklDQVRJT04KCQl2YXIgY2xhc3NpZmljYXRpb24gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE1XTsKCQljbGFzc2lmaWNhdGlvbnNbaV0gPSBjbGFzc2lmaWNhdGlvbjsKCQkKCQkvLyBQT0lOVCBTT1VSQ0UgSUQKCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE4XTsKCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE5XTsKCQl2YXIgcG9pbnRTb3VyY2VJRCA9IHRlbXBVaW50MTZbMF07CgkJcG9pbnRTb3VyY2VJRHNbaV0gPSBwb2ludFNvdXJjZUlEOwoJCQoJCS8vIENPTE9SLCBpZiBhdmFpbGFibGUKCQlpZihwb2ludEZvcm1hdElEID09PSAyKXsKCQkJdGVtcFVpbnQ4WzBdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyMF07CgkJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMjFdOwoJCQl2YXIgciA9IHRlbXBVaW50MTZbMF07CgkJCQoJCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzIyXTsKCQkJdGVtcFVpbnQ4WzFdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyM107CgkJCXZhciBnID0gdGVtcFVpbnQxNlswXTsKCQkJCgkJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMjRdOwoJCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzI1XTsKCQkJdmFyIGIgPSB0ZW1wVWludDE2WzBdOwoJCQkKCQkJY29sb3JzWzMqaSswXSA9IHIgLyA2NTUzNjsKCQkJY29sb3JzWzMqaSsxXSA9IGcgLyA2NTUzNjsKCQkJY29sb3JzWzMqaSsyXSA9IGIgLyA2NTUzNjsKCQl9Cgl9CgkKCXZhciBtZXNzYWdlID0gewoJCXBvc2l0aW9uOiBwQnVmZiwgCgkJY29sb3I6IGNCdWZmLCAKCQlpbnRlbnNpdHk6IGlCdWZmLAoJCWNsYXNzaWZpY2F0aW9uOiBjbEJ1ZmYsCgkJcmV0dXJuTnVtYmVyOiBybkJ1ZmYsCgkJbnVtYmVyT2ZSZXR1cm5zOiBuckJ1ZmYsCgkJcG9pbnRTb3VyY2VJRDogcHNCdWZmLAoJCXRpZ2h0Qm91bmRpbmdCb3g6IHRpZ2h0Qm91bmRpbmdCb3gKCX07CgkJCgl2YXIgdHJhbnNmZXJhYmxlcyA9IFsKCQltZXNzYWdlLnBvc2l0aW9uLAoJCW1lc3NhZ2UuY29sb3IsIAoJCW1lc3NhZ2UuaW50ZW5zaXR5LAoJCW1lc3NhZ2UuY2xhc3NpZmljYXRpb24sCgkJbWVzc2FnZS5yZXR1cm5OdW1iZXIsCgkJbWVzc2FnZS5udW1iZXJPZlJldHVybnMsCgkJbWVzc2FnZS5wb2ludFNvdXJjZUlEXTsKCQkKCXBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyYWJsZXMpOwp9Cg==")); \ No newline at end of file +Potree.workers.lasdecoder = new Potree.WorkerManager(atob("CgovL3ZhciBwb2ludEZvcm1hdFJlYWRlcnMgPSB7Ci8vCTA6IGZ1bmN0aW9uKGR2KSB7Ci8vCQlyZXR1cm4gewovLwkJCSJwb3NpdGlvbiI6IFsgZHYuZ2V0SW50MzIoMCwgdHJ1ZSksIGR2LmdldEludDMyKDQsIHRydWUpLCBkdi5nZXRJbnQzMig4LCB0cnVlKV0sCi8vCQkJImludGVuc2l0eSI6IGR2LmdldFVpbnQxNigxMiwgdHJ1ZSksCi8vCQkJImNsYXNzaWZpY2F0aW9uIjogZHYuZ2V0VWludDgoMTYsIHRydWUpCi8vCQl9OwovLwl9LAovLwkxOiBmdW5jdGlvbihkdikgewovLwkJcmV0dXJuIHsKLy8JCQkicG9zaXRpb24iOiBbIGR2LmdldEludDMyKDAsIHRydWUpLCBkdi5nZXRJbnQzMig0LCB0cnVlKSwgZHYuZ2V0SW50MzIoOCwgdHJ1ZSldLAovLwkJCSJpbnRlbnNpdHkiOiBkdi5nZXRVaW50MTYoMTIsIHRydWUpLAovLwkJCSJjbGFzc2lmaWNhdGlvbiI6IGR2LmdldFVpbnQ4KDE2LCB0cnVlKQovLwkJfTsKLy8JfSwKLy8JMjogZnVuY3Rpb24oZHYpIHsKLy8JCXJldHVybiB7Ci8vCQkJInBvc2l0aW9uIjogWyBkdi5nZXRJbnQzMigwLCB0cnVlKSwgZHYuZ2V0SW50MzIoNCwgdHJ1ZSksIGR2LmdldEludDMyKDgsIHRydWUpXSwKLy8JCQkiaW50ZW5zaXR5IjogZHYuZ2V0VWludDE2KDEyLCB0cnVlKSwKLy8JCQkiY2xhc3NpZmljYXRpb24iOiBkdi5nZXRVaW50OCgxNiwgdHJ1ZSksCi8vCQkJImNvbG9yIjogW2R2LmdldFVpbnQxNigyMCwgdHJ1ZSksIGR2LmdldFVpbnQxNigyMiwgdHJ1ZSksIGR2LmdldFVpbnQxNigyNCwgdHJ1ZSldCi8vCQl9OwovLwl9LAovLwkzOiBmdW5jdGlvbihkdikgewovLwkJcmV0dXJuIHsKLy8JCQkicG9zaXRpb24iOiBbIGR2LmdldEludDMyKDAsIHRydWUpLCBkdi5nZXRJbnQzMig0LCB0cnVlKSwgZHYuZ2V0SW50MzIoOCwgdHJ1ZSldLAovLwkJCSJpbnRlbnNpdHkiOiBkdi5nZXRVaW50MTYoMTIsIHRydWUpLAovLwkJCSJjbGFzc2lmaWNhdGlvbiI6IGR2LmdldFVpbnQ4KDE2LCB0cnVlKSwKLy8JCQkiY29sb3IiOiBbZHYuZ2V0VWludDE2KDI4LCB0cnVlKSwgZHYuZ2V0VWludDE2KDMwLCB0cnVlKSwgZHYuZ2V0VWludDE2KDMyLCB0cnVlKV0KLy8JCX07Ci8vCX0KLy99OwovLwkKLy8JCi8vIERlY29kZXMgTEFTIHJlY29yZHMgaW50byBwb2ludHMKLy8KLy92YXIgTEFTRGVjb2RlciA9IGZ1bmN0aW9uKGJ1ZmZlciwgcG9pbnRGb3JtYXRJRCwgcG9pbnRTaXplLCBwb2ludHNDb3VudCwgc2NhbGUsIG9mZnNldCkgewovLwl0aGlzLmFycmF5YiA9IGJ1ZmZlcjsKLy8JdGhpcy5kZWNvZGVyID0gcG9pbnRGb3JtYXRSZWFkZXJzW3BvaW50Rm9ybWF0SURdOwovLwl0aGlzLnBvaW50c0NvdW50ID0gcG9pbnRzQ291bnQ7Ci8vCXRoaXMucG9pbnRTaXplID0gcG9pbnRTaXplOwovLwl0aGlzLnNjYWxlID0gc2NhbGU7Ci8vCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwovL307Ci8vCi8vTEFTRGVjb2Rlci5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbihpbmRleCkgewovLwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucG9pbnRzQ291bnQpCi8vCQl0aHJvdyBuZXcgRXJyb3IoIlBvaW50IGluZGV4IG91dCBvZiByYW5nZSIpOwovLwovLwl2YXIgZHYgPSBuZXcgRGF0YVZpZXcodGhpcy5hcnJheWIsIGluZGV4ICogdGhpcy5wb2ludFNpemUsIHRoaXMucG9pbnRTaXplKTsKLy8JcmV0dXJuIHRoaXMuZGVjb2Rlcihkdik7Ci8vfTsKCm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KXsKCXZhciBidWZmZXIgPSBldmVudC5kYXRhLmJ1ZmZlcjsKCXZhciBudW1Qb2ludHMgPSBldmVudC5kYXRhLm51bVBvaW50czsKCXZhciBwb2ludFNpemUgPSBldmVudC5kYXRhLnBvaW50U2l6ZTsKCXZhciBwb2ludEZvcm1hdElEID0gZXZlbnQuZGF0YS5wb2ludEZvcm1hdElEOwoJdmFyIHNjYWxlID0gZXZlbnQuZGF0YS5zY2FsZTsKCXZhciBvZmZzZXQgPSBldmVudC5kYXRhLm9mZnNldDsKCXZhciBtaW5zID0gZXZlbnQuZGF0YS5taW5zOwoJdmFyIG1heHMgPSBldmVudC5kYXRhLm1heHM7Cgl2YXIgYmJPZmZzZXQgPSBldmVudC5kYXRhLmJiT2Zmc2V0OwoJCgl2YXIgdGVtcCA9IG5ldyBBcnJheUJ1ZmZlcig0KTsKCXZhciB0ZW1wVWludDggPSBuZXcgVWludDhBcnJheSh0ZW1wKTsKCXZhciB0ZW1wVWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRlbXApOwoJdmFyIHRlbXBGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0ZW1wKTsKCXZhciB0ZW1wSW50MzIgPSBuZXcgSW50MzJBcnJheSh0ZW1wKTsKCXZhciBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTsKCQoJdmFyIHBCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyozKjQpOwoJdmFyIGNCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyozKjQpOwoJdmFyIGlCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KTsKCXZhciBjbEJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBybkJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBuckJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBwc0J1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzICogMik7CgkKCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KHBCdWZmKTsKCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KGNCdWZmKTsKCXZhciBpbnRlbnNpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmYpOwoJdmFyIGNsYXNzaWZpY2F0aW9ucyA9IG5ldyBVaW50OEFycmF5KGNsQnVmZik7Cgl2YXIgcmV0dXJuTnVtYmVycyA9IG5ldyBVaW50OEFycmF5KHJuQnVmZik7Cgl2YXIgbnVtYmVyT2ZSZXR1cm5zID0gbmV3IFVpbnQ4QXJyYXkobnJCdWZmKTsKCXZhciBwb2ludFNvdXJjZUlEcyA9IG5ldyBVaW50MTZBcnJheShwc0J1ZmYpOwoJdmFyIHRpZ2h0Qm91bmRpbmdCb3ggPSB7CgkJbWluOiBbIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFldLAoJCW1heDogWyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgXQoJfTsKCQoJCgkvLyB0ZW1wIGFycmF5cyBzZWVtIHRvIGJlIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gRGF0YVZpZXdzCgkvLyBhdCB0aGUgbW9tZW50OiBodHRwOi8vanNwZXJmLmNvbS9kYXRhdmlldy12cy10ZW1wb3JhcnktZmxvYXQ2NGFycmF5Cglmb3IodmFyIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKyspewoJCgkJLy8gUE9TSVRJT04KCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzBdOwoJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMV07CgkJdGVtcFVpbnQ4WzJdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyXTsKCQl0ZW1wVWludDhbM10gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzNdOwoJCXZhciB4ID0gdGVtcEludDMyWzBdOwoJCQoJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrNF07CgkJdGVtcFVpbnQ4WzFdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSs1XTsKCQl0ZW1wVWludDhbMl0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzZdOwoJCXRlbXBVaW50OFszXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrN107CgkJdmFyIHkgPSB0ZW1wSW50MzJbMF07CgkJCgkJdGVtcFVpbnQ4WzBdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSs4XTsKCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzldOwoJCXRlbXBVaW50OFsyXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTBdOwoJCXRlbXBVaW50OFszXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTFdOwoJCXZhciB6ID0gdGVtcEludDMyWzBdOwoJCQoJCXBvc2l0aW9uc1szKmkrMF0gPSB4ICogc2NhbGVbMF0gKyBvZmZzZXRbMF0gKyBiYk9mZnNldFswXTsKCQlwb3NpdGlvbnNbMyppKzFdID0geSAqIHNjYWxlWzFdICsgb2Zmc2V0WzFdICsgYmJPZmZzZXRbMV07CgkJcG9zaXRpb25zWzMqaSsyXSA9IHogKiBzY2FsZVsyXSArIG9mZnNldFsyXSArIGJiT2Zmc2V0WzJdOwoJCQoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzBdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMF0sIHBvc2l0aW9uc1szKmkrMF0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzFdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMV0sIHBvc2l0aW9uc1szKmkrMV0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzJdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMl0sIHBvc2l0aW9uc1szKmkrMl0pOwoJCQoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzBdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMF0sIHBvc2l0aW9uc1szKmkrMF0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzFdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMV0sIHBvc2l0aW9uc1szKmkrMV0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzJdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMl0sIHBvc2l0aW9uc1szKmkrMl0pOwoJCQoJCS8vIElOVEVOU0lUWQoJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTJdOwoJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTNdOwoJCXZhciBpbnRlbnNpdHkgPSB0ZW1wVWludDE2WzBdOwoJCWludGVuc2l0aWVzW2ldID0gaW50ZW5zaXR5OwoJCQoJCS8vIFJFVFVSTiBOVU1CRVIsIHN0b3JlZCBpbiB0aGUgZmlyc3QgMyBiaXRzIC0gMDAwMDAxMTEKCQl2YXIgcmV0dXJuTnVtYmVyID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsxNF0gJiA3OwoJCXJldHVybk51bWJlcnNbaV0gPSByZXR1cm5OdW1iZXI7CgkJCgkJLy8gTlVNQkVSIE9GIFJFVFVSTlMsIHN0b3JlZCBpbiAwMDExMTAwMAoJCW51bWJlck9mUmV0dXJuc1tpXSA9IChidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE0XSAmIDU2KSAvIDg7CgkJCgkJLy8gQ0xBU1NJRklDQVRJT04KCQl2YXIgY2xhc3NpZmljYXRpb24gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE1XTsKCQljbGFzc2lmaWNhdGlvbnNbaV0gPSBjbGFzc2lmaWNhdGlvbjsKCQkKCQkvLyBQT0lOVCBTT1VSQ0UgSUQKCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE4XTsKCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE5XTsKCQl2YXIgcG9pbnRTb3VyY2VJRCA9IHRlbXBVaW50MTZbMF07CgkJcG9pbnRTb3VyY2VJRHNbaV0gPSBwb2ludFNvdXJjZUlEOwoJCQoJCS8vIENPTE9SLCBpZiBhdmFpbGFibGUKCQlpZihwb2ludEZvcm1hdElEID09PSAyKXsKCQkJdGVtcFVpbnQ4WzBdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyMF07CgkJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMjFdOwoJCQl2YXIgciA9IHRlbXBVaW50MTZbMF07CgkJCQoJCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzIyXTsKCQkJdGVtcFVpbnQ4WzFdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyM107CgkJCXZhciBnID0gdGVtcFVpbnQxNlswXTsKCQkJCgkJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMjRdOwoJCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzI1XTsKCQkJdmFyIGIgPSB0ZW1wVWludDE2WzBdOwoJCQkKCQkJY29sb3JzWzMqaSswXSA9IHIgLyA2NTUzNjsKCQkJY29sb3JzWzMqaSsxXSA9IGcgLyA2NTUzNjsKCQkJY29sb3JzWzMqaSsyXSA9IGIgLyA2NTUzNjsKCQl9Cgl9CgkKCXZhciBtZXNzYWdlID0gewoJCXBvc2l0aW9uOiBwQnVmZiwgCgkJY29sb3I6IGNCdWZmLCAKCQlpbnRlbnNpdHk6IGlCdWZmLAoJCWNsYXNzaWZpY2F0aW9uOiBjbEJ1ZmYsCgkJcmV0dXJuTnVtYmVyOiBybkJ1ZmYsCgkJbnVtYmVyT2ZSZXR1cm5zOiBuckJ1ZmYsCgkJcG9pbnRTb3VyY2VJRDogcHNCdWZmLAoJCXRpZ2h0Qm91bmRpbmdCb3g6IHRpZ2h0Qm91bmRpbmdCb3gKCX07CgkJCgl2YXIgdHJhbnNmZXJhYmxlcyA9IFsKCQltZXNzYWdlLnBvc2l0aW9uLAoJCW1lc3NhZ2UuY29sb3IsIAoJCW1lc3NhZ2UuaW50ZW5zaXR5LAoJCW1lc3NhZ2UuY2xhc3NpZmljYXRpb24sCgkJbWVzc2FnZS5yZXR1cm5OdW1iZXIsCgkJbWVzc2FnZS5udW1iZXJPZlJldHVybnMsCgkJbWVzc2FnZS5wb2ludFNvdXJjZUlEXTsKCQkKCXBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyYWJsZXMpOwp9Owo=")); \ No newline at end of file diff --git a/PotreeConverter/resources/page_template/build/js/laslaz.min.js b/PotreeConverter/resources/page_template/build/js/laslaz.min.js deleted file mode 100644 index fa4048a4..00000000 --- a/PotreeConverter/resources/page_template/build/js/laslaz.min.js +++ /dev/null @@ -1,2 +0,0 @@ -Potree.workers.laslaz=new Potree.WorkerManager(atob("dmFyIE1vZHVsZTtpZighTW9kdWxlKU1vZHVsZT0odHlwZW9mIE1vZHVsZSE9PSJ1bmRlZmluZWQiP01vZHVsZTpudWxsKXx8e307dmFyIG1vZHVsZU92ZXJyaWRlcz17fTtmb3IodmFyIGtleSBpbiBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyIEVOVklST05NRU5UX0lTX05PREU9dHlwZW9mIHByb2Nlc3M9PT0ib2JqZWN0IiYmdHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iO3ZhciBFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PSJvYmplY3QiO3ZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVI9dHlwZW9mIGltcG9ydFNjcmlwdHM9PT0iZnVuY3Rpb24iO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZighTW9kdWxlWyJwcmludCJdKU1vZHVsZVsicHJpbnQiXT1mdW5jdGlvbiBwcmludCh4KXtwcm9jZXNzWyJzdGRvdXQiXS53cml0ZSh4KyJcbiIpfTtpZighTW9kdWxlWyJwcmludEVyciJdKU1vZHVsZVsicHJpbnRFcnIiXT1mdW5jdGlvbiBwcmludEVycih4KXtwcm9jZXNzWyJzdGRlcnIiXS53cml0ZSh4KyJcbiIpfTt2YXIgbm9kZUZTPXJlcXVpcmUoImZzIik7dmFyIG5vZGVQYXRoPXJlcXVpcmUoInBhdGgiKTtNb2R1bGVbInJlYWQiXT1mdW5jdGlvbiByZWFkKGZpbGVuYW1lLGJpbmFyeSl7ZmlsZW5hbWU9bm9kZVBhdGhbIm5vcm1hbGl6ZSJdKGZpbGVuYW1lKTt2YXIgcmV0PW5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUpO2lmKCFyZXQmJmZpbGVuYW1lIT1ub2RlUGF0aFsicmVzb2x2ZSJdKGZpbGVuYW1lKSl7ZmlsZW5hbWU9cGF0aC5qb2luKF9fZGlybmFtZSwiLi4iLCJzcmMiLGZpbGVuYW1lKTtyZXQ9bm9kZUZTWyJyZWFkRmlsZVN5bmMiXShmaWxlbmFtZSl9aWYocmV0JiYhYmluYXJ5KXJldD1yZXQudG9TdHJpbmcoKTtyZXR1cm4gcmV0fTtNb2R1bGVbInJlYWRCaW5hcnkiXT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXtyZXR1cm4gTW9kdWxlWyJyZWFkIl0oZmlsZW5hbWUsdHJ1ZSl9O01vZHVsZVsibG9hZCJdPWZ1bmN0aW9uIGxvYWQoZil7Z2xvYmFsRXZhbChyZWFkKGYpKX07TW9kdWxlWyJhcmd1bWVudHMiXT1wcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7bW9kdWxlWyJleHBvcnRzIl09TW9kdWxlfWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKCFNb2R1bGVbInByaW50Il0pTW9kdWxlWyJwcmludCJdPXByaW50O2lmKHR5cGVvZiBwcmludEVyciE9InVuZGVmaW5lZCIpTW9kdWxlWyJwcmludEVyciJdPXByaW50RXJyO2lmKHR5cGVvZiByZWFkIT0idW5kZWZpbmVkIil7TW9kdWxlWyJyZWFkIl09cmVhZH1lbHNle01vZHVsZVsicmVhZCJdPWZ1bmN0aW9uIHJlYWQoKXt0aHJvdyJubyByZWFkKCkgYXZhaWxhYmxlIChqc2M/KSJ9fU1vZHVsZVsicmVhZEJpbmFyeSJdPWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7cmV0dXJuIHJlYWQoZiwiYmluYXJ5Iil9O2lmKHR5cGVvZiBzY3JpcHRBcmdzIT0idW5kZWZpbmVkIil7TW9kdWxlWyJhcmd1bWVudHMiXT1zY3JpcHRBcmdzfWVsc2UgaWYodHlwZW9mIGFyZ3VtZW50cyE9InVuZGVmaW5lZCIpe01vZHVsZVsiYXJndW1lbnRzIl09YXJndW1lbnRzfXRoaXNbIk1vZHVsZSJdPU1vZHVsZTtldmFsKCJpZiAodHlwZW9mIGdjID09PSAnZnVuY3Rpb24nICYmIGdjLnRvU3RyaW5nKCkuaW5kZXhPZignW25hdGl2ZSBjb2RlXScpID4gMCkgdmFyIGdjID0gdW5kZWZpbmVkIil9ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7TW9kdWxlWyJyZWFkIl09ZnVuY3Rpb24gcmVhZCh1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKHR5cGVvZiBhcmd1bWVudHMhPSJ1bmRlZmluZWQiKXtNb2R1bGVbImFyZ3VtZW50cyJdPWFyZ3VtZW50c31pZih0eXBlb2YgY29uc29sZSE9PSJ1bmRlZmluZWQiKXtpZighTW9kdWxlWyJwcmludCJdKU1vZHVsZVsicHJpbnQiXT1mdW5jdGlvbiBwcmludCh4KXt9O2lmKCFNb2R1bGVbInByaW50RXJyIl0pTW9kdWxlWyJwcmludEVyciJdPWZ1bmN0aW9uIHByaW50RXJyKHgpe319ZWxzZXt2YXIgVFJZX1VTRV9EVU1QPWZhbHNlO2lmKCFNb2R1bGVbInByaW50Il0pTW9kdWxlWyJwcmludCJdPVRSWV9VU0VfRFVNUCYmdHlwZW9mIGR1bXAhPT0idW5kZWZpbmVkIj8oZnVuY3Rpb24oeCl7ZHVtcCh4KX0pOihmdW5jdGlvbih4KXt9KX1pZihFTlZJUk9OTUVOVF9JU19XRUIpe3dpbmRvd1siTW9kdWxlIl09TW9kdWxlfWVsc2V7TW9kdWxlWyJsb2FkIl09aW1wb3J0U2NyaXB0c319ZWxzZXt0aHJvdyJVbmtub3duIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFdoZXJlIGFyZSB3ZT8ifWZ1bmN0aW9uIGdsb2JhbEV2YWwoeCl7ZXZhbC5jYWxsKG51bGwseCl9aWYoIU1vZHVsZVsibG9hZCJdPT0idW5kZWZpbmVkIiYmTW9kdWxlWyJyZWFkIl0pe01vZHVsZVsibG9hZCJdPWZ1bmN0aW9uIGxvYWQoZil7Z2xvYmFsRXZhbChNb2R1bGVbInJlYWQiXShmKSl9fWlmKCFNb2R1bGVbInByaW50Il0pe01vZHVsZVsicHJpbnQiXT0oZnVuY3Rpb24oKXt9KX1pZighTW9kdWxlWyJwcmludEVyciJdKXtNb2R1bGVbInByaW50RXJyIl09TW9kdWxlWyJwcmludCJdfWlmKCFNb2R1bGVbImFyZ3VtZW50cyJdKXtNb2R1bGVbImFyZ3VtZW50cyJdPVtdfU1vZHVsZS5wcmludD1Nb2R1bGVbInByaW50Il07TW9kdWxlLnByaW50RXJyPU1vZHVsZVsicHJpbnRFcnIiXTtNb2R1bGVbInByZVJ1biJdPVtdO01vZHVsZVsicG9zdFJ1biJdPVtdO2Zvcih2YXIga2V5IGluIG1vZHVsZU92ZXJyaWRlcyl7aWYobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpe01vZHVsZVtrZXldPW1vZHVsZU92ZXJyaWRlc1trZXldfX12YXIgUnVudGltZT17c2V0VGVtcFJldDA6KGZ1bmN0aW9uKHZhbHVlKXt0ZW1wUmV0MD12YWx1ZX0pLGdldFRlbXBSZXQwOihmdW5jdGlvbigpe3JldHVybiB0ZW1wUmV0MH0pLHN0YWNrU2F2ZTooZnVuY3Rpb24oKXtyZXR1cm4gU1RBQ0tUT1B9KSxzdGFja1Jlc3RvcmU6KGZ1bmN0aW9uKHN0YWNrVG9wKXtTVEFDS1RPUD1zdGFja1RvcH0pLGZvcmNlQWxpZ246KGZ1bmN0aW9uKHRhcmdldCxxdWFudHVtKXtxdWFudHVtPXF1YW50dW18fDQ7aWYocXVhbnR1bT09MSlyZXR1cm4gdGFyZ2V0O2lmKGlzTnVtYmVyKHRhcmdldCkmJmlzTnVtYmVyKHF1YW50dW0pKXtyZXR1cm4gTWF0aC5jZWlsKHRhcmdldC9xdWFudHVtKSpxdWFudHVtfWVsc2UgaWYoaXNOdW1iZXIocXVhbnR1bSkmJmlzUG93ZXJPZlR3byhxdWFudHVtKSl7cmV0dXJuIigoKCIrdGFyZ2V0KyIpKyIrKHF1YW50dW0tMSkrIikmIisgLXF1YW50dW0rIikifXJldHVybiJNYXRoLmNlaWwoKCIrdGFyZ2V0KyIpLyIrcXVhbnR1bSsiKSoiK3F1YW50dW19KSxpc051bWJlclR5cGU6KGZ1bmN0aW9uKHR5cGUpe3JldHVybiB0eXBlIGluIFJ1bnRpbWUuSU5UX1RZUEVTfHx0eXBlIGluIFJ1bnRpbWUuRkxPQVRfVFlQRVN9KSxpc1BvaW50ZXJUeXBlOmZ1bmN0aW9uIGlzUG9pbnRlclR5cGUodHlwZSl7cmV0dXJuIHR5cGVbdHlwZS5sZW5ndGgtMV09PSIqIn0saXNTdHJ1Y3RUeXBlOmZ1bmN0aW9uIGlzU3RydWN0VHlwZSh0eXBlKXtpZihpc1BvaW50ZXJUeXBlKHR5cGUpKXJldHVybiBmYWxzZTtpZihpc0FycmF5VHlwZSh0eXBlKSlyZXR1cm4gdHJ1ZTtpZigvPD9ceyA/W159XSogP1x9Pj8vLnRlc3QodHlwZSkpcmV0dXJuIHRydWU7cmV0dXJuIHR5cGVbMF09PSIlIn0sSU5UX1RZUEVTOnsiaTEiOjAsImk4IjowLCJpMTYiOjAsImkzMiI6MCwiaTY0IjowfSxGTE9BVF9UWVBFUzp7ImZsb2F0IjowLCJkb3VibGUiOjB9LG9yNjQ6KGZ1bmN0aW9uKHgseSl7dmFyIGw9eHwwfCh5fDApO3ZhciBoPShNYXRoLnJvdW5kKHgvNDI5NDk2NzI5Nil8TWF0aC5yb3VuZCh5LzQyOTQ5NjcyOTYpKSo0Mjk0OTY3Mjk2O3JldHVybiBsK2h9KSxhbmQ2NDooZnVuY3Rpb24oeCx5KXt2YXIgbD0oeHwwKSYoeXwwKTt2YXIgaD0oTWF0aC5yb3VuZCh4LzQyOTQ5NjcyOTYpJk1hdGgucm91bmQoeS80Mjk0OTY3Mjk2KSkqNDI5NDk2NzI5NjtyZXR1cm4gbCtofSkseG9yNjQ6KGZ1bmN0aW9uKHgseSl7dmFyIGw9KHh8MCleKHl8MCk7dmFyIGg9KE1hdGgucm91bmQoeC80Mjk0OTY3Mjk2KV5NYXRoLnJvdW5kKHkvNDI5NDk2NzI5NikpKjQyOTQ5NjcyOTY7cmV0dXJuIGwraH0pLGdldE5hdGl2ZVR5cGVTaXplOihmdW5jdGlvbih0eXBlKXtzd2l0Y2godHlwZSl7Y2FzZSJpMSI6Y2FzZSJpOCI6cmV0dXJuIDE7Y2FzZSJpMTYiOnJldHVybiAyO2Nhc2UiaTMyIjpyZXR1cm4gNDtjYXNlImk2NCI6cmV0dXJuIDg7Y2FzZSJmbG9hdCI6cmV0dXJuIDQ7Y2FzZSJkb3VibGUiOnJldHVybiA4O2RlZmF1bHQ6e2lmKHR5cGVbdHlwZS5sZW5ndGgtMV09PT0iKiIpe3JldHVybiBSdW50aW1lLlFVQU5UVU1fU0laRX1lbHNlIGlmKHR5cGVbMF09PT0iaSIpe3ZhciBiaXRzPXBhcnNlSW50KHR5cGUuc3Vic3RyKDEpKTthc3NlcnQoYml0cyU4PT09MCk7cmV0dXJuIGJpdHMvOH1lbHNle3JldHVybiAwfX19fSksZ2V0TmF0aXZlRmllbGRTaXplOihmdW5jdGlvbih0eXBlKXtyZXR1cm4gTWF0aC5tYXgoUnVudGltZS5nZXROYXRpdmVUeXBlU2l6ZSh0eXBlKSxSdW50aW1lLlFVQU5UVU1fU0laRSl9KSxkZWR1cDpmdW5jdGlvbiBkZWR1cChpdGVtcyxpZGVudCl7dmFyIHNlZW49e307aWYoaWRlbnQpe3JldHVybiBpdGVtcy5maWx0ZXIoKGZ1bmN0aW9uKGl0ZW0pe2lmKHNlZW5baXRlbVtpZGVudF1dKXJldHVybiBmYWxzZTtzZWVuW2l0ZW1baWRlbnRdXT10cnVlO3JldHVybiB0cnVlfSkpfWVsc2V7cmV0dXJuIGl0ZW1zLmZpbHRlcigoZnVuY3Rpb24oaXRlbSl7aWYoc2VlbltpdGVtXSlyZXR1cm4gZmFsc2U7c2VlbltpdGVtXT10cnVlO3JldHVybiB0cnVlfSkpfX0sc2V0OmZ1bmN0aW9uIHNldCgpe3ZhciBhcmdzPXR5cGVvZiBhcmd1bWVudHNbMF09PT0ib2JqZWN0Ij9hcmd1bWVudHNbMF06YXJndW1lbnRzO3ZhciByZXQ9e307Zm9yKHZhciBpPTA7aTxhcmdzLmxlbmd0aDtpKyspe3JldFthcmdzW2ldXT0wfXJldHVybiByZXR9LFNUQUNLX0FMSUdOOjgsZ2V0QWxpZ25TaXplOihmdW5jdGlvbih0eXBlLHNpemUsdmFyYXJnKXtpZighdmFyYXJnJiYodHlwZT09Imk2NCJ8fHR5cGU9PSJkb3VibGUiKSlyZXR1cm4gODtpZighdHlwZSlyZXR1cm4gTWF0aC5taW4oc2l6ZSw4KTtyZXR1cm4gTWF0aC5taW4oc2l6ZXx8KHR5cGU/UnVudGltZS5nZXROYXRpdmVGaWVsZFNpemUodHlwZSk6MCksUnVudGltZS5RVUFOVFVNX1NJWkUpfSksY2FsY3VsYXRlU3RydWN0QWxpZ25tZW50OmZ1bmN0aW9uIGNhbGN1bGF0ZVN0cnVjdEFsaWdubWVudCh0eXBlKXt0eXBlLmZsYXRTaXplPTA7dHlwZS5hbGlnblNpemU9MDt2YXIgZGlmZnM9W107dmFyIHByZXY9LTE7dmFyIGluZGV4PTA7dHlwZS5mbGF0SW5kZXhlcz10eXBlLmZpZWxkcy5tYXAoKGZ1bmN0aW9uKGZpZWxkKXtpbmRleCsrO3ZhciBzaXplLGFsaWduU2l6ZTtpZihSdW50aW1lLmlzTnVtYmVyVHlwZShmaWVsZCl8fFJ1bnRpbWUuaXNQb2ludGVyVHlwZShmaWVsZCkpe3NpemU9UnVudGltZS5nZXROYXRpdmVUeXBlU2l6ZShmaWVsZCk7YWxpZ25TaXplPVJ1bnRpbWUuZ2V0QWxpZ25TaXplKGZpZWxkLHNpemUpfWVsc2UgaWYoUnVudGltZS5pc1N0cnVjdFR5cGUoZmllbGQpKXtpZihmaWVsZFsxXT09PSIwIil7c2l6ZT0wO2lmKFR5cGVzLnR5cGVzW2ZpZWxkXSl7YWxpZ25TaXplPVJ1bnRpbWUuZ2V0QWxpZ25TaXplKG51bGwsVHlwZXMudHlwZXNbZmllbGRdLmFsaWduU2l6ZSl9ZWxzZXthbGlnblNpemU9dHlwZS5hbGlnblNpemV8fFFVQU5UVU1fU0laRX19ZWxzZXtzaXplPVR5cGVzLnR5cGVzW2ZpZWxkXS5mbGF0U2l6ZTthbGlnblNpemU9UnVudGltZS5nZXRBbGlnblNpemUobnVsbCxUeXBlcy50eXBlc1tmaWVsZF0uYWxpZ25TaXplKX19ZWxzZSBpZihmaWVsZFswXT09ImIiKXtzaXplPWZpZWxkLnN1YnN0cigxKXwwO2FsaWduU2l6ZT0xfWVsc2UgaWYoZmllbGRbMF09PT0iPCIpe3NpemU9YWxpZ25TaXplPVR5cGVzLnR5cGVzW2ZpZWxkXS5mbGF0U2l6ZX1lbHNlIGlmKGZpZWxkWzBdPT09ImkiKXtzaXplPWFsaWduU2l6ZT1wYXJzZUludChmaWVsZC5zdWJzdHIoMSkpLzg7YXNzZXJ0KHNpemUlMT09PTAsImNhbm5vdCBoYW5kbGUgbm9uLWJ5dGUtc2l6ZSBmaWVsZCAiK2ZpZWxkKX1lbHNle2Fzc2VydChmYWxzZSwiaW52YWxpZCB0eXBlIGZvciBjYWxjdWxhdGVTdHJ1Y3RBbGlnbm1lbnQiKX1pZih0eXBlLnBhY2tlZClhbGlnblNpemU9MTt0eXBlLmFsaWduU2l6ZT1NYXRoLm1heCh0eXBlLmFsaWduU2l6ZSxhbGlnblNpemUpO3ZhciBjdXJyPVJ1bnRpbWUuYWxpZ25NZW1vcnkodHlwZS5mbGF0U2l6ZSxhbGlnblNpemUpO3R5cGUuZmxhdFNpemU9Y3VycitzaXplO2lmKHByZXY+PTApe2RpZmZzLnB1c2goY3Vyci1wcmV2KX1wcmV2PWN1cnI7cmV0dXJuIGN1cnJ9KSk7aWYodHlwZS5uYW1lXyYmdHlwZS5uYW1lX1swXT09PSJbIil7dHlwZS5mbGF0U2l6ZT1wYXJzZUludCh0eXBlLm5hbWVfLnN1YnN0cigxKSkqdHlwZS5mbGF0U2l6ZS8yfXR5cGUuZmxhdFNpemU9UnVudGltZS5hbGlnbk1lbW9yeSh0eXBlLmZsYXRTaXplLHR5cGUuYWxpZ25TaXplKTtpZihkaWZmcy5sZW5ndGg9PTApe3R5cGUuZmxhdEZhY3Rvcj10eXBlLmZsYXRTaXplfWVsc2UgaWYoUnVudGltZS5kZWR1cChkaWZmcykubGVuZ3RoPT0xKXt0eXBlLmZsYXRGYWN0b3I9ZGlmZnNbMF19dHlwZS5uZWVkc0ZsYXR0ZW5pbmc9dHlwZS5mbGF0RmFjdG9yIT0xO3JldHVybiB0eXBlLmZsYXRJbmRleGVzfSxnZW5lcmF0ZVN0cnVjdEluZm86KGZ1bmN0aW9uKHN0cnVjdCx0eXBlTmFtZSxvZmZzZXQpe3ZhciB0eXBlLGFsaWdubWVudDtpZih0eXBlTmFtZSl7b2Zmc2V0PW9mZnNldHx8MDt0eXBlPSh0eXBlb2YgVHlwZXM9PT0idW5kZWZpbmVkIj9SdW50aW1lLnR5cGVJbmZvOlR5cGVzLnR5cGVzKVt0eXBlTmFtZV07aWYoIXR5cGUpcmV0dXJuIG51bGw7aWYodHlwZS5maWVsZHMubGVuZ3RoIT1zdHJ1Y3QubGVuZ3RoKXtwcmludEVycigiTnVtYmVyIG9mIG5hbWVkIGZpZWxkcyBtdXN0IG1hdGNoIHRoZSB0eXBlIGZvciAiK3R5cGVOYW1lKyI6IHBvc3NpYmx5IGR1cGxpY2F0ZSBzdHJ1Y3QgbmFtZXMuIENhbm5vdCByZXR1cm4gc3RydWN0SW5mbyIpO3JldHVybiBudWxsfWFsaWdubWVudD10eXBlLmZsYXRJbmRleGVzfWVsc2V7dmFyIHR5cGU9e2ZpZWxkczpzdHJ1Y3QubWFwKChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbVswXX0pKX07YWxpZ25tZW50PVJ1bnRpbWUuY2FsY3VsYXRlU3RydWN0QWxpZ25tZW50KHR5cGUpfXZhciByZXQ9e19fc2l6ZV9fOnR5cGUuZmxhdFNpemV9O2lmKHR5cGVOYW1lKXtzdHJ1Y3QuZm9yRWFjaCgoZnVuY3Rpb24oaXRlbSxpKXtpZih0eXBlb2YgaXRlbT09PSJzdHJpbmciKXtyZXRbaXRlbV09YWxpZ25tZW50W2ldK29mZnNldH1lbHNle3ZhciBrZXk7Zm9yKHZhciBrIGluIGl0ZW0pa2V5PWs7cmV0W2tleV09UnVudGltZS5nZW5lcmF0ZVN0cnVjdEluZm8oaXRlbVtrZXldLHR5cGUuZmllbGRzW2ldLGFsaWdubWVudFtpXSl9fSkpfWVsc2V7c3RydWN0LmZvckVhY2goKGZ1bmN0aW9uKGl0ZW0saSl7cmV0W2l0ZW1bMV1dPWFsaWdubWVudFtpXX0pKX1yZXR1cm4gcmV0fSksZHluQ2FsbDooZnVuY3Rpb24oc2lnLHB0cixhcmdzKXtpZihhcmdzJiZhcmdzLmxlbmd0aCl7aWYoIWFyZ3Muc3BsaWNlKWFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7YXJncy5zcGxpY2UoMCwwLHB0cik7cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF8iK3NpZ10uYXBwbHkobnVsbCxhcmdzKX1lbHNle3JldHVybiBNb2R1bGVbImR5bkNhbGxfIitzaWddLmNhbGwobnVsbCxwdHIpfX0pLGZ1bmN0aW9uUG9pbnRlcnM6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLGFkZEZ1bmN0aW9uOihmdW5jdGlvbihmdW5jKXtmb3IodmFyIGk9MDtpPFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVycy5sZW5ndGg7aSsrKXtpZighUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2ldKXtSdW50aW1lLmZ1bmN0aW9uUG9pbnRlcnNbaV09ZnVuYztyZXR1cm4gMiooMStpKX19dGhyb3ciRmluaXNoZWQgdXAgYWxsIHJlc2VydmVkIGZ1bmN0aW9uIHBvaW50ZXJzLiBVc2UgYSBoaWdoZXIgdmFsdWUgZm9yIFJFU0VSVkVEX0ZVTkNUSU9OX1BPSU5URVJTLiJ9KSxyZW1vdmVGdW5jdGlvbjooZnVuY3Rpb24oaW5kZXgpe1J1bnRpbWUuZnVuY3Rpb25Qb2ludGVyc1soaW5kZXgtMikvMl09bnVsbH0pLGdldEFzbUNvbnN0OihmdW5jdGlvbihjb2RlLG51bUFyZ3Mpe2lmKCFSdW50aW1lLmFzbUNvbnN0Q2FjaGUpUnVudGltZS5hc21Db25zdENhY2hlPXt9O3ZhciBmdW5jPVJ1bnRpbWUuYXNtQ29uc3RDYWNoZVtjb2RlXTtpZihmdW5jKXJldHVybiBmdW5jO3ZhciBhcmdzPVtdO2Zvcih2YXIgaT0wO2k8bnVtQXJncztpKyspe2FyZ3MucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDM2KStpKX12YXIgc291cmNlPVBvaW50ZXJfc3RyaW5naWZ5KGNvZGUpO2lmKHNvdXJjZVswXT09PSciJyl7aWYoc291cmNlLmluZGV4T2YoJyInLDEpPT09c291cmNlLmxlbmd0aC0xKXtzb3VyY2U9c291cmNlLnN1YnN0cigxLHNvdXJjZS5sZW5ndGgtMil9ZWxzZXthYm9ydCgiaW52YWxpZCBFTV9BU00gaW5wdXQgfCIrc291cmNlKyJ8LiBQbGVhc2UgdXNlIEVNX0FTTSguLmNvZGUuLikgKG5vIHF1b3Rlcykgb3IgRU1fQVNNKHsgLi5jb2RlKCQwKS4uIH0sIGlucHV0KSAodG8gaW5wdXQgdmFsdWVzKSIpfX10cnl7dmFyIGV2YWxsZWQ9ZXZhbCgiKGZ1bmN0aW9uKCIrYXJncy5qb2luKCIsIikrIil7ICIrc291cmNlKyIgfSkiKX1jYXRjaChlKXtNb2R1bGUucHJpbnRFcnIoImVycm9yIGluIGV4ZWN1dGluZyBpbmxpbmUgRU1fQVNNIGNvZGU6ICIrZSsiIG9uOiBcblxuIitzb3VyY2UrIlxuXG53aXRoIGFyZ3MgfCIrYXJncysifCAobWFrZSBzdXJlIHRvIHVzZSB0aGUgcmlnaHQgb25lIG91dCBvZiBFTV9BU00sIEVNX0FTTV9BUkdTLCBldGMuKSIpO3Rocm93IGV9cmV0dXJuIFJ1bnRpbWUuYXNtQ29uc3RDYWNoZVtjb2RlXT1ldmFsbGVkfSksd2Fybk9uY2U6KGZ1bmN0aW9uKHRleHQpe2lmKCFSdW50aW1lLndhcm5PbmNlLnNob3duKVJ1bnRpbWUud2Fybk9uY2Uuc2hvd249e307aWYoIVJ1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF0pe1J1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF09MTtNb2R1bGUucHJpbnRFcnIodGV4dCl9fSksZnVuY1dyYXBwZXJzOnt9LGdldEZ1bmNXcmFwcGVyOihmdW5jdGlvbihmdW5jLHNpZyl7YXNzZXJ0KHNpZyk7aWYoIVJ1bnRpbWUuZnVuY1dyYXBwZXJzW2Z1bmNdKXtSdW50aW1lLmZ1bmNXcmFwcGVyc1tmdW5jXT1mdW5jdGlvbiBkeW5DYWxsX3dyYXBwZXIoKXtyZXR1cm4gUnVudGltZS5keW5DYWxsKHNpZyxmdW5jLGFyZ3VtZW50cyl9fXJldHVybiBSdW50aW1lLmZ1bmNXcmFwcGVyc1tmdW5jXX0pLFVURjhQcm9jZXNzb3I6KGZ1bmN0aW9uKCl7dmFyIGJ1ZmZlcj1bXTt2YXIgbmVlZGVkPTA7dGhpcy5wcm9jZXNzQ0NoYXI9KGZ1bmN0aW9uKGNvZGUpe2NvZGU9Y29kZSYyNTU7aWYoYnVmZmVyLmxlbmd0aD09MCl7aWYoKGNvZGUmMTI4KT09MCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSl9YnVmZmVyLnB1c2goY29kZSk7aWYoKGNvZGUmMjI0KT09MTkyKXtuZWVkZWQ9MX1lbHNlIGlmKChjb2RlJjI0MCk9PTIyNCl7bmVlZGVkPTJ9ZWxzZXtuZWVkZWQ9M31yZXR1cm4iIn1pZihuZWVkZWQpe2J1ZmZlci5wdXNoKGNvZGUpO25lZWRlZC0tO2lmKG5lZWRlZD4wKXJldHVybiIifXZhciBjMT1idWZmZXJbMF07dmFyIGMyPWJ1ZmZlclsxXTt2YXIgYzM9YnVmZmVyWzJdO3ZhciBjND1idWZmZXJbM107dmFyIHJldDtpZihidWZmZXIubGVuZ3RoPT0yKXtyZXQ9U3RyaW5nLmZyb21DaGFyQ29kZSgoYzEmMzEpPDw2fGMyJjYzKX1lbHNlIGlmKGJ1ZmZlci5sZW5ndGg9PTMpe3JldD1TdHJpbmcuZnJvbUNoYXJDb2RlKChjMSYxNSk8PDEyfChjMiY2Myk8PDZ8YzMmNjMpfWVsc2V7dmFyIGNvZGVQb2ludD0oYzEmNyk8PDE4fChjMiY2Myk8PDEyfChjMyY2Myk8PDZ8YzQmNjM7cmV0PVN0cmluZy5mcm9tQ2hhckNvZGUoTWF0aC5mbG9vcigoY29kZVBvaW50LTY1NTM2KS8xMDI0KSs1NTI5NiwoY29kZVBvaW50LTY1NTM2KSUxMDI0KzU2MzIwKX1idWZmZXIubGVuZ3RoPTA7cmV0dXJuIHJldH0pO3RoaXMucHJvY2Vzc0pTU3RyaW5nPWZ1bmN0aW9uIHByb2Nlc3NKU1N0cmluZyhzdHJpbmcpe3N0cmluZz11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nKSk7dmFyIHJldD1bXTtmb3IodmFyIGk9MDtpPHN0cmluZy5sZW5ndGg7aSsrKXtyZXQucHVzaChzdHJpbmcuY2hhckNvZGVBdChpKSl9cmV0dXJuIHJldH19KSxnZXRDb21waWxlclNldHRpbmc6KGZ1bmN0aW9uKG5hbWUpe3Rocm93IllvdSBtdXN0IGJ1aWxkIHdpdGggLXMgUkVUQUlOX0NPTVBJTEVSX1NFVFRJTkdTPTEgZm9yIFJ1bnRpbWUuZ2V0Q29tcGlsZXJTZXR0aW5nIG9yIGVtc2NyaXB0ZW5fZ2V0X2NvbXBpbGVyX3NldHRpbmcgdG8gd29yayJ9KSxzdGFja0FsbG9jOihmdW5jdGlvbihzaXplKXt2YXIgcmV0PVNUQUNLVE9QO1NUQUNLVE9QPVNUQUNLVE9QK3NpemV8MDtTVEFDS1RPUD1TVEFDS1RPUCs3Ji04O3JldHVybiByZXR9KSxzdGF0aWNBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyIHJldD1TVEFUSUNUT1A7U1RBVElDVE9QPVNUQVRJQ1RPUCtzaXplfDA7U1RBVElDVE9QPVNUQVRJQ1RPUCs3Ji04O3JldHVybiByZXR9KSxkeW5hbWljQWxsb2M6KGZ1bmN0aW9uKHNpemUpe3ZhciByZXQ9RFlOQU1JQ1RPUDtEWU5BTUlDVE9QPURZTkFNSUNUT1Arc2l6ZXwwO0RZTkFNSUNUT1A9RFlOQU1JQ1RPUCs3Ji04O2lmKERZTkFNSUNUT1A+PVRPVEFMX01FTU9SWSllbmxhcmdlTWVtb3J5KCk7cmV0dXJuIHJldH0pLGFsaWduTWVtb3J5OihmdW5jdGlvbihzaXplLHF1YW50dW0pe3ZhciByZXQ9c2l6ZT1NYXRoLmNlaWwoc2l6ZS8ocXVhbnR1bT9xdWFudHVtOjgpKSoocXVhbnR1bT9xdWFudHVtOjgpO3JldHVybiByZXR9KSxtYWtlQmlnSW50OihmdW5jdGlvbihsb3csaGlnaCx1bnNpZ25lZCl7dmFyIHJldD11bnNpZ25lZD8rKGxvdz4+PjApKyArKGhpZ2g+Pj4wKSorNDI5NDk2NzI5NjorKGxvdz4+PjApKyArKGhpZ2h8MCkqKzQyOTQ5NjcyOTY7cmV0dXJuIHJldH0pLEdMT0JBTF9CQVNFOjgsUVVBTlRVTV9TSVpFOjQsX19kdW1teV9fOjB9O01vZHVsZVsiUnVudGltZSJdPVJ1bnRpbWU7ZnVuY3Rpb24ganNDYWxsKCl7dmFyIGFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2FyZ3NbMF1dLmFwcGx5KG51bGwsYXJncy5zbGljZSgxKSl9dmFyIF9fVEhSRVdfXz0wO3ZhciBBQk9SVD1mYWxzZTt2YXIgRVhJVFNUQVRVUz0wO3ZhciB1bmRlZj0wO3ZhciB0ZW1wVmFsdWUsdGVtcEludCx0ZW1wQmlnSW50LHRlbXBJbnQyLHRlbXBCaWdJbnQyLHRlbXBQYWlyLHRlbXBCaWdJbnRJLHRlbXBCaWdJbnRSLHRlbXBCaWdJbnRTLHRlbXBCaWdJbnRQLHRlbXBCaWdJbnRELHRlbXBEb3VibGUsdGVtcEZsb2F0O3ZhciB0ZW1wSTY0LHRlbXBJNjRiO3ZhciB0ZW1wUmV0MCx0ZW1wUmV0MSx0ZW1wUmV0Mix0ZW1wUmV0Myx0ZW1wUmV0NCx0ZW1wUmV0NSx0ZW1wUmV0Nix0ZW1wUmV0Nyx0ZW1wUmV0OCx0ZW1wUmV0OTtmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiK3RleHQpfX12YXIgZ2xvYmFsU2NvcGU9dGhpcztmdW5jdGlvbiBnZXRDRnVuYyhpZGVudCl7dHJ5e3ZhciBmdW5jPU1vZHVsZVsiXyIraWRlbnRdO2lmKCFmdW5jKWZ1bmM9ZXZhbCgiXyIraWRlbnQpfWNhdGNoKGUpe31hc3NlcnQoZnVuYywiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiAiK2lkZW50KyIgKHBlcmhhcHMgTExWTSBvcHRpbWl6YXRpb25zIG9yIGNsb3N1cmUgcmVtb3ZlZCBpdD8pIik7cmV0dXJuIGZ1bmN9dmFyIGN3cmFwLGNjYWxsOygoZnVuY3Rpb24oKXt2YXIgc3RhY2s9MDt2YXIgSlNmdW5jcz17InN0YWNrU2F2ZSI6KGZ1bmN0aW9uKCl7c3RhY2s9UnVudGltZS5zdGFja1NhdmUoKX0pLCJzdGFja1Jlc3RvcmUiOihmdW5jdGlvbigpe1J1bnRpbWUuc3RhY2tSZXN0b3JlKHN0YWNrKX0pLCJhcnJheVRvQyI6KGZ1bmN0aW9uKGFycil7dmFyIHJldD1SdW50aW1lLnN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVybiByZXR9KSwic3RyaW5nVG9DIjooZnVuY3Rpb24oc3RyKXt2YXIgcmV0PTA7aWYoc3RyIT09bnVsbCYmc3RyIT09dW5kZWZpbmVkJiZzdHIhPT0wKXtyZXQ9UnVudGltZS5zdGFja0FsbG9jKHN0ci5sZW5ndGgrMSk7d3JpdGVTdHJpbmdUb01lbW9yeShzdHIscmV0KX1yZXR1cm4gcmV0fSl9O3ZhciB0b0M9eyJzdHJpbmciOkpTZnVuY3NbInN0cmluZ1RvQyJdLCJhcnJheSI6SlNmdW5jc1siYXJyYXlUb0MiXX07Y2NhbGw9ZnVuY3Rpb24gY2NhbGxGdW5jKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyl7dmFyIGZ1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBjQXJncz1bXTtpZihhcmdzKXtmb3IodmFyIGk9MDtpPGFyZ3MubGVuZ3RoO2krKyl7dmFyIGNvbnZlcnRlcj10b0NbYXJnVHlwZXNbaV1dO2lmKGNvbnZlcnRlcil7aWYoc3RhY2s9PT0wKXN0YWNrPVJ1bnRpbWUuc3RhY2tTYXZlKCk7Y0FyZ3NbaV09Y29udmVydGVyKGFyZ3NbaV0pfWVsc2V7Y0FyZ3NbaV09YXJnc1tpXX19fXZhciByZXQ9ZnVuYy5hcHBseShudWxsLGNBcmdzKTtpZihyZXR1cm5UeXBlPT09InN0cmluZyIpcmV0PVBvaW50ZXJfc3RyaW5naWZ5KHJldCk7aWYoc3RhY2shPT0wKUpTZnVuY3NbInN0YWNrUmVzdG9yZSJdKCk7cmV0dXJuIHJldH07dmFyIHNvdXJjZVJlZ2V4PS9eZnVuY3Rpb25cc1woKFteKV0qKVwpXHMqe1xzKihbXipdKj8pW1xzO10qKD86cmV0dXJuXHMqKC4qPylbO1xzXSopP30kLztmdW5jdGlvbiBwYXJzZUpTRnVuYyhqc2Z1bmMpe3ZhciBwYXJzZWQ9anNmdW5jLnRvU3RyaW5nKCkubWF0Y2goc291cmNlUmVnZXgpLnNsaWNlKDEpO3JldHVybnthcmd1bWVudHM6cGFyc2VkWzBdLGJvZHk6cGFyc2VkWzFdLHJldHVyblZhbHVlOnBhcnNlZFsyXX19dmFyIEpTc291cmNlPXt9O2Zvcih2YXIgZnVuIGluIEpTZnVuY3Mpe2lmKEpTZnVuY3MuaGFzT3duUHJvcGVydHkoZnVuKSl7SlNzb3VyY2VbZnVuXT1wYXJzZUpTRnVuYyhKU2Z1bmNzW2Z1bl0pfX1jd3JhcD1mdW5jdGlvbiBjd3JhcChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzKXt2YXIgY2Z1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBudW1lcmljQXJncz1hcmdUeXBlcy5ldmVyeSgoZnVuY3Rpb24odHlwZSl7cmV0dXJuIHR5cGU9PT0ibnVtYmVyIn0pKTt2YXIgbnVtZXJpY1JldD1yZXR1cm5UeXBlIT09InN0cmluZyI7aWYobnVtZXJpY1JldCYmbnVtZXJpY0FyZ3Mpe3JldHVybiBjZnVuY312YXIgYXJnTmFtZXM9YXJnVHlwZXMubWFwKChmdW5jdGlvbih4LGkpe3JldHVybiIkIitpfSkpO3ZhciBmdW5jc3RyPSIoZnVuY3Rpb24oIithcmdOYW1lcy5qb2luKCIsIikrIikgeyI7dmFyIG5hcmdzPWFyZ1R5cGVzLmxlbmd0aDtpZighbnVtZXJpY0FyZ3Mpe2Z1bmNzdHIrPUpTc291cmNlWyJzdGFja1NhdmUiXS5ib2R5KyI7Ijtmb3IodmFyIGk9MDtpPG5hcmdzO2krKyl7dmFyIGFyZz1hcmdOYW1lc1tpXSx0eXBlPWFyZ1R5cGVzW2ldO2lmKHR5cGU9PT0ibnVtYmVyIiljb250aW51ZTt2YXIgY29udmVydENvZGU9SlNzb3VyY2VbdHlwZSsiVG9DIl07ZnVuY3N0cis9InZhciAiK2NvbnZlcnRDb2RlLmFyZ3VtZW50cysiID0gIithcmcrIjsiO2Z1bmNzdHIrPWNvbnZlcnRDb2RlLmJvZHkrIjsiO2Z1bmNzdHIrPWFyZysiPSIrY29udmVydENvZGUucmV0dXJuVmFsdWUrIjsifX12YXIgY2Z1bmNuYW1lPXBhcnNlSlNGdW5jKChmdW5jdGlvbigpe3JldHVybiBjZnVuY30pKS5yZXR1cm5WYWx1ZTtmdW5jc3RyKz0idmFyIHJldCA9ICIrY2Z1bmNuYW1lKyIoIithcmdOYW1lcy5qb2luKCIsIikrIik7IjtpZighbnVtZXJpY1JldCl7dmFyIHN0cmdmeT1wYXJzZUpTRnVuYygoZnVuY3Rpb24oKXtyZXR1cm4gUG9pbnRlcl9zdHJpbmdpZnl9KSkucmV0dXJuVmFsdWU7ZnVuY3N0cis9InJldCA9ICIrc3RyZ2Z5KyIocmV0KTsifWlmKCFudW1lcmljQXJncyl7ZnVuY3N0cis9SlNzb3VyY2VbInN0YWNrUmVzdG9yZSJdLmJvZHkrIjsifWZ1bmNzdHIrPSJyZXR1cm4gcmV0fSkiO3JldHVybiBldmFsKGZ1bmNzdHIpfX0pKSgpO01vZHVsZVsiY3dyYXAiXT1jd3JhcDtNb2R1bGVbImNjYWxsIl09Y2NhbGw7ZnVuY3Rpb24gc2V0VmFsdWUocHRyLHZhbHVlLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fCJpOCI7aWYodHlwZS5jaGFyQXQodHlwZS5sZW5ndGgtMSk9PT0iKiIpdHlwZT0iaTMyIjtzd2l0Y2godHlwZSl7Y2FzZSJpMSI6SEVBUDhbcHRyPj4wXT12YWx1ZTticmVhaztjYXNlImk4IjpIRUFQOFtwdHI+PjBdPXZhbHVlO2JyZWFrO2Nhc2UiaTE2IjpIRUFQMTZbcHRyPj4xXT12YWx1ZTticmVhaztjYXNlImkzMiI6SEVBUDMyW3B0cj4+Ml09dmFsdWU7YnJlYWs7Y2FzZSJpNjQiOnRlbXBJNjQ9W3ZhbHVlPj4+MCwodGVtcERvdWJsZT12YWx1ZSwrTWF0aF9hYnModGVtcERvdWJsZSk+PSsxP3RlbXBEb3VibGU+KzA/KE1hdGhfbWluKCtNYXRoX2Zsb29yKHRlbXBEb3VibGUvKzQyOTQ5NjcyOTYpLCs0Mjk0OTY3Mjk1KXwwKT4+PjA6fn4rTWF0aF9jZWlsKCh0ZW1wRG91YmxlLSArKH5+dGVtcERvdWJsZT4+PjApKS8rNDI5NDk2NzI5Nik+Pj4wOjApXSxIRUFQMzJbcHRyPj4yXT10ZW1wSTY0WzBdLEhFQVAzMltwdHIrND4+Ml09dGVtcEk2NFsxXTticmVhaztjYXNlImZsb2F0IjpIRUFQRjMyW3B0cj4+Ml09dmFsdWU7YnJlYWs7Y2FzZSJkb3VibGUiOkhFQVBGNjRbcHRyPj4zXT12YWx1ZTticmVhaztkZWZhdWx0OmFib3J0KCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiAiK3R5cGUpfX1Nb2R1bGVbInNldFZhbHVlIl09c2V0VmFsdWU7ZnVuY3Rpb24gZ2V0VmFsdWUocHRyLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fCJpOCI7aWYodHlwZS5jaGFyQXQodHlwZS5sZW5ndGgtMSk9PT0iKiIpdHlwZT0iaTMyIjtzd2l0Y2godHlwZSl7Y2FzZSJpMSI6cmV0dXJuIEhFQVA4W3B0cj4+MF07Y2FzZSJpOCI6cmV0dXJuIEhFQVA4W3B0cj4+MF07Y2FzZSJpMTYiOnJldHVybiBIRUFQMTZbcHRyPj4xXTtjYXNlImkzMiI6cmV0dXJuIEhFQVAzMltwdHI+PjJdO2Nhc2UiaTY0IjpyZXR1cm4gSEVBUDMyW3B0cj4+Ml07Y2FzZSJmbG9hdCI6cmV0dXJuIEhFQVBGMzJbcHRyPj4yXTtjYXNlImRvdWJsZSI6cmV0dXJuIEhFQVBGNjRbcHRyPj4zXTtkZWZhdWx0OmFib3J0KCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiAiK3R5cGUpfXJldHVybiBudWxsfU1vZHVsZVsiZ2V0VmFsdWUiXT1nZXRWYWx1ZTt2YXIgQUxMT0NfTk9STUFMPTA7dmFyIEFMTE9DX1NUQUNLPTE7dmFyIEFMTE9DX1NUQVRJQz0yO3ZhciBBTExPQ19EWU5BTUlDPTM7dmFyIEFMTE9DX05PTkU9NDtNb2R1bGVbIkFMTE9DX05PUk1BTCJdPUFMTE9DX05PUk1BTDtNb2R1bGVbIkFMTE9DX1NUQUNLIl09QUxMT0NfU1RBQ0s7TW9kdWxlWyJBTExPQ19TVEFUSUMiXT1BTExPQ19TVEFUSUM7TW9kdWxlWyJBTExPQ19EWU5BTUlDIl09QUxMT0NfRFlOQU1JQztNb2R1bGVbIkFMTE9DX05PTkUiXT1BTExPQ19OT05FO2Z1bmN0aW9uIGFsbG9jYXRlKHNsYWIsdHlwZXMsYWxsb2NhdG9yLHB0cil7dmFyIHplcm9pbml0LHNpemU7aWYodHlwZW9mIHNsYWI9PT0ibnVtYmVyIil7emVyb2luaXQ9dHJ1ZTtzaXplPXNsYWJ9ZWxzZXt6ZXJvaW5pdD1mYWxzZTtzaXplPXNsYWIubGVuZ3RofXZhciBzaW5nbGVUeXBlPXR5cGVvZiB0eXBlcz09PSJzdHJpbmciP3R5cGVzOm51bGw7dmFyIHJldDtpZihhbGxvY2F0b3I9PUFMTE9DX05PTkUpe3JldD1wdHJ9ZWxzZXtyZXQ9W19tYWxsb2MsUnVudGltZS5zdGFja0FsbG9jLFJ1bnRpbWUuc3RhdGljQWxsb2MsUnVudGltZS5keW5hbWljQWxsb2NdW2FsbG9jYXRvcj09PXVuZGVmaW5lZD9BTExPQ19TVEFUSUM6YWxsb2NhdG9yXShNYXRoLm1heChzaXplLHNpbmdsZVR5cGU/MTp0eXBlcy5sZW5ndGgpKX1pZih6ZXJvaW5pdCl7dmFyIHB0cj1yZXQsc3RvcDthc3NlcnQoKHJldCYzKT09MCk7c3RvcD1yZXQrKHNpemUmfjMpO2Zvcig7cHRyPHN0b3A7cHRyKz00KXtIRUFQMzJbcHRyPj4yXT0wfXN0b3A9cmV0K3NpemU7d2hpbGUocHRyPHN0b3Ape0hFQVA4W3B0cisrPj4wXT0wfXJldHVybiByZXR9aWYoc2luZ2xlVHlwZT09PSJpOCIpe2lmKHNsYWIuc3ViYXJyYXl8fHNsYWIuc2xpY2Upe0hFQVBVOC5zZXQoc2xhYixyZXQpfWVsc2V7SEVBUFU4LnNldChuZXcgVWludDhBcnJheShzbGFiKSxyZXQpfXJldHVybiByZXR9dmFyIGk9MCx0eXBlLHR5cGVTaXplLHByZXZpb3VzVHlwZTt3aGlsZShpPHNpemUpe3ZhciBjdXJyPXNsYWJbaV07aWYodHlwZW9mIGN1cnI9PT0iZnVuY3Rpb24iKXtjdXJyPVJ1bnRpbWUuZ2V0RnVuY3Rpb25JbmRleChjdXJyKX10eXBlPXNpbmdsZVR5cGV8fHR5cGVzW2ldO2lmKHR5cGU9PT0wKXtpKys7Y29udGludWV9aWYodHlwZT09Imk2NCIpdHlwZT0iaTMyIjtzZXRWYWx1ZShyZXQraSxjdXJyLHR5cGUpO2lmKHByZXZpb3VzVHlwZSE9PXR5cGUpe3R5cGVTaXplPVJ1bnRpbWUuZ2V0TmF0aXZlVHlwZVNpemUodHlwZSk7cHJldmlvdXNUeXBlPXR5cGV9aSs9dHlwZVNpemV9cmV0dXJuIHJldH1Nb2R1bGVbImFsbG9jYXRlIl09YWxsb2NhdGU7ZnVuY3Rpb24gUG9pbnRlcl9zdHJpbmdpZnkocHRyLGxlbmd0aCl7dmFyIGhhc1V0Zj1mYWxzZTt2YXIgdDt2YXIgaT0wO3doaWxlKDEpe3Q9SEVBUFU4W3B0citpPj4wXTtpZih0Pj0xMjgpaGFzVXRmPXRydWU7ZWxzZSBpZih0PT0wJiYhbGVuZ3RoKWJyZWFrO2krKztpZihsZW5ndGgmJmk9PWxlbmd0aClicmVha31pZighbGVuZ3RoKWxlbmd0aD1pO3ZhciByZXQ9IiI7aWYoIWhhc1V0Zil7dmFyIE1BWF9DSFVOSz0xMDI0O3ZhciBjdXJyO3doaWxlKGxlbmd0aD4wKXtjdXJyPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLEhFQVBVOC5zdWJhcnJheShwdHIscHRyK01hdGgubWluKGxlbmd0aCxNQVhfQ0hVTkspKSk7cmV0PXJldD9yZXQrY3VycjpjdXJyO3B0cis9TUFYX0NIVU5LO2xlbmd0aC09TUFYX0NIVU5LfXJldHVybiByZXR9dmFyIHV0Zjg9bmV3IFJ1bnRpbWUuVVRGOFByb2Nlc3Nvcjtmb3IoaT0wO2k8bGVuZ3RoO2krKyl7dD1IRUFQVThbcHRyK2k+PjBdO3JldCs9dXRmOC5wcm9jZXNzQ0NoYXIodCl9cmV0dXJuIHJldH1Nb2R1bGVbIlBvaW50ZXJfc3RyaW5naWZ5Il09UG9pbnRlcl9zdHJpbmdpZnk7ZnVuY3Rpb24gVVRGMTZUb1N0cmluZyhwdHIpe3ZhciBpPTA7dmFyIHN0cj0iIjt3aGlsZSgxKXt2YXIgY29kZVVuaXQ9SEVBUDE2W3B0citpKjI+PjFdO2lmKGNvZGVVbml0PT0wKXJldHVybiBzdHI7KytpO3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZShjb2RlVW5pdCl9fU1vZHVsZVsiVVRGMTZUb1N0cmluZyJdPVVURjE2VG9TdHJpbmc7ZnVuY3Rpb24gc3RyaW5nVG9VVEYxNihzdHIsb3V0UHRyKXtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgY29kZVVuaXQ9c3RyLmNoYXJDb2RlQXQoaSk7SEVBUDE2W291dFB0citpKjI+PjFdPWNvZGVVbml0fUhFQVAxNltvdXRQdHIrc3RyLmxlbmd0aCoyPj4xXT0wfU1vZHVsZVsic3RyaW5nVG9VVEYxNiJdPXN0cmluZ1RvVVRGMTY7ZnVuY3Rpb24gVVRGMzJUb1N0cmluZyhwdHIpe3ZhciBpPTA7dmFyIHN0cj0iIjt3aGlsZSgxKXt2YXIgdXRmMzI9SEVBUDMyW3B0citpKjQ+PjJdO2lmKHV0ZjMyPT0wKXJldHVybiBzdHI7KytpO2lmKHV0ZjMyPj02NTUzNil7dmFyIGNoPXV0ZjMyLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9ZWxzZXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodXRmMzIpfX19TW9kdWxlWyJVVEYzMlRvU3RyaW5nIl09VVRGMzJUb1N0cmluZztmdW5jdGlvbiBzdHJpbmdUb1VURjMyKHN0cixvdXRQdHIpe3ZhciBpQ2hhcj0wO2Zvcih2YXIgaUNvZGVVbml0PTA7aUNvZGVVbml0PHN0ci5sZW5ndGg7KytpQ29kZVVuaXQpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpQ29kZVVuaXQpO2lmKGNvZGVVbml0Pj01NTI5NiYmY29kZVVuaXQ8PTU3MzQzKXt2YXIgdHJhaWxTdXJyb2dhdGU9c3RyLmNoYXJDb2RlQXQoKytpQ29kZVVuaXQpO2NvZGVVbml0PTY1NTM2KygoY29kZVVuaXQmMTAyMyk8PDEwKXx0cmFpbFN1cnJvZ2F0ZSYxMDIzfUhFQVAzMltvdXRQdHIraUNoYXIqND4+Ml09Y29kZVVuaXQ7KytpQ2hhcn1IRUFQMzJbb3V0UHRyK2lDaGFyKjQ+PjJdPTB9TW9kdWxlWyJzdHJpbmdUb1VURjMyIl09c3RyaW5nVG9VVEYzMjtmdW5jdGlvbiBkZW1hbmdsZShmdW5jKXt2YXIgaT0zO3ZhciBiYXNpY1R5cGVzPXsidiI6InZvaWQiLCJiIjoiYm9vbCIsImMiOiJjaGFyIiwicyI6InNob3J0IiwiaSI6ImludCIsImwiOiJsb25nIiwiZiI6ImZsb2F0IiwiZCI6ImRvdWJsZSIsInciOiJ3Y2hhcl90IiwiYSI6InNpZ25lZCBjaGFyIiwiaCI6InVuc2lnbmVkIGNoYXIiLCJ0IjoidW5zaWduZWQgc2hvcnQiLCJqIjoidW5zaWduZWQgaW50IiwibSI6InVuc2lnbmVkIGxvbmciLCJ4IjoibG9uZyBsb25nIiwieSI6InVuc2lnbmVkIGxvbmcgbG9uZyIsInoiOiIuLi4ifTt2YXIgc3Vicz1bXTt2YXIgZmlyc3Q9dHJ1ZTtmdW5jdGlvbiBkdW1wKHgpe2lmKHgpTW9kdWxlLnByaW50KHgpO01vZHVsZS5wcmludChmdW5jKTt2YXIgcHJlPSIiO2Zvcih2YXIgYT0wO2E8aTthKyspcHJlKz0iICI7TW9kdWxlLnByaW50KHByZSsiXiIpfWZ1bmN0aW9uIHBhcnNlTmVzdGVkKCl7aSsrO2lmKGZ1bmNbaV09PT0iSyIpaSsrO3ZhciBwYXJ0cz1bXTt3aGlsZShmdW5jW2ldIT09IkUiKXtpZihmdW5jW2ldPT09IlMiKXtpKys7dmFyIG5leHQ9ZnVuYy5pbmRleE9mKCJfIixpKTt2YXIgbnVtPWZ1bmMuc3Vic3RyaW5nKGksbmV4dCl8fDA7cGFydHMucHVzaChzdWJzW251bV18fCI/Iik7aT1uZXh0KzE7Y29udGludWV9aWYoZnVuY1tpXT09PSJDIil7cGFydHMucHVzaChwYXJ0c1twYXJ0cy5sZW5ndGgtMV0pO2krPTI7Y29udGludWV9dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO3ZhciBwcmU9c2l6ZS50b1N0cmluZygpLmxlbmd0aDtpZighc2l6ZXx8IXByZSl7aS0tO2JyZWFrfXZhciBjdXJyPWZ1bmMuc3Vic3RyKGkrcHJlLHNpemUpO3BhcnRzLnB1c2goY3Vycik7c3Vicy5wdXNoKGN1cnIpO2krPXByZStzaXplfWkrKztyZXR1cm4gcGFydHN9ZnVuY3Rpb24gcGFyc2UocmF3TGlzdCxsaW1pdCxhbGxvd1ZvaWQpe2xpbWl0PWxpbWl0fHxJbmZpbml0eTt2YXIgcmV0PSIiLGxpc3Q9W107ZnVuY3Rpb24gZmx1c2hMaXN0KCl7cmV0dXJuIigiK2xpc3Quam9pbigiLCAiKSsiKSJ9dmFyIG5hbWU7aWYoZnVuY1tpXT09PSJOIil7bmFtZT1wYXJzZU5lc3RlZCgpLmpvaW4oIjo6Iik7bGltaXQtLTtpZihsaW1pdD09PTApcmV0dXJuIHJhd0xpc3Q/W25hbWVdOm5hbWV9ZWxzZXtpZihmdW5jW2ldPT09IksifHxmaXJzdCYmZnVuY1tpXT09PSJMIilpKys7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2lmKHNpemUpe3ZhciBwcmU9c2l6ZS50b1N0cmluZygpLmxlbmd0aDtuYW1lPWZ1bmMuc3Vic3RyKGkrcHJlLHNpemUpO2krPXByZStzaXplfX1maXJzdD1mYWxzZTtpZihmdW5jW2ldPT09IkkiKXtpKys7dmFyIGlMaXN0PXBhcnNlKHRydWUpO3ZhciBpUmV0PXBhcnNlKHRydWUsMSx0cnVlKTtyZXQrPWlSZXRbMF0rIiAiK25hbWUrIjwiK2lMaXN0LmpvaW4oIiwgIikrIj4ifWVsc2V7cmV0PW5hbWV9cGFyYW1Mb29wOndoaWxlKGk8ZnVuYy5sZW5ndGgmJmxpbWl0LS0+MCl7dmFyIGM9ZnVuY1tpKytdO2lmKGMgaW4gYmFzaWNUeXBlcyl7bGlzdC5wdXNoKGJhc2ljVHlwZXNbY10pfWVsc2V7c3dpdGNoKGMpe2Nhc2UiUCI6bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXSsiKiIpO2JyZWFrO2Nhc2UiUiI6bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXSsiJiIpO2JyZWFrO2Nhc2UiTCI6e2krKzt2YXIgZW5kPWZ1bmMuaW5kZXhPZigiRSIsaSk7dmFyIHNpemU9ZW5kLWk7bGlzdC5wdXNoKGZ1bmMuc3Vic3RyKGksc2l6ZSkpO2krPXNpemUrMjticmVha307Y2FzZSJBIjp7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2krPXNpemUudG9TdHJpbmcoKS5sZW5ndGg7aWYoZnVuY1tpXSE9PSJfIil0aHJvdyI/IjtpKys7bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXSsiIFsiK3NpemUrIl0iKTticmVha307Y2FzZSJFIjpicmVhayBwYXJhbUxvb3A7ZGVmYXVsdDpyZXQrPSI/IitjO2JyZWFrIHBhcmFtTG9vcH19fWlmKCFhbGxvd1ZvaWQmJmxpc3QubGVuZ3RoPT09MSYmbGlzdFswXT09PSJ2b2lkIilsaXN0PVtdO2lmKHJhd0xpc3Qpe2lmKHJldCl7bGlzdC5wdXNoKHJldCsiPyIpfXJldHVybiBsaXN0fWVsc2V7cmV0dXJuIHJldCtmbHVzaExpc3QoKX19dHJ5e2lmKGZ1bmM9PSJPYmplY3QuX21haW4ifHxmdW5jPT0iX21haW4iKXtyZXR1cm4ibWFpbigpIn1pZih0eXBlb2YgZnVuYz09PSJudW1iZXIiKWZ1bmM9UG9pbnRlcl9zdHJpbmdpZnkoZnVuYyk7aWYoZnVuY1swXSE9PSJfIilyZXR1cm4gZnVuYztpZihmdW5jWzFdIT09Il8iKXJldHVybiBmdW5jO2lmKGZ1bmNbMl0hPT0iWiIpcmV0dXJuIGZ1bmM7c3dpdGNoKGZ1bmNbM10pe2Nhc2UibiI6cmV0dXJuIm9wZXJhdG9yIG5ldygpIjtjYXNlImQiOnJldHVybiJvcGVyYXRvciBkZWxldGUoKSJ9cmV0dXJuIHBhcnNlKCl9Y2F0Y2goZSl7cmV0dXJuIGZ1bmN9fWZ1bmN0aW9uIGRlbWFuZ2xlQWxsKHRleHQpe3JldHVybiB0ZXh0LnJlcGxhY2UoL19fWltcd1xkX10rL2csKGZ1bmN0aW9uKHgpe3ZhciB5PWRlbWFuZ2xlKHgpO3JldHVybiB4PT09eT94OngrIiBbIit5KyJdIn0pKX1mdW5jdGlvbiBzdGFja1RyYWNlKCl7dmFyIHN0YWNrPShuZXcgRXJyb3IpLnN0YWNrO3JldHVybiBzdGFjaz9kZW1hbmdsZUFsbChzdGFjayk6IihubyBzdGFjayB0cmFjZSBhdmFpbGFibGUpIn12YXIgUEFHRV9TSVpFPTQwOTY7ZnVuY3Rpb24gYWxpZ25NZW1vcnlQYWdlKHgpe3JldHVybiB4KzQwOTUmLTQwOTZ9dmFyIEhFQVA7dmFyIEhFQVA4LEhFQVBVOCxIRUFQMTYsSEVBUFUxNixIRUFQMzIsSEVBUFUzMixIRUFQRjMyLEhFQVBGNjQ7dmFyIFNUQVRJQ19CQVNFPTAsU1RBVElDVE9QPTAsc3RhdGljU2VhbGVkPWZhbHNlO3ZhciBTVEFDS19CQVNFPTAsU1RBQ0tUT1A9MCxTVEFDS19NQVg9MDt2YXIgRFlOQU1JQ19CQVNFPTAsRFlOQU1JQ1RPUD0wO2Z1bmN0aW9uIGVubGFyZ2VNZW1vcnkoKXthYm9ydCgiQ2Fubm90IGVubGFyZ2UgbWVtb3J5IGFycmF5cy4gRWl0aGVyICgxKSBjb21waWxlIHdpdGggLXMgVE9UQUxfTUVNT1JZPVggd2l0aCBYIGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlICIrVE9UQUxfTUVNT1JZKyIsICgyKSBjb21waWxlIHdpdGggQUxMT1dfTUVNT1JZX0dST1dUSCB3aGljaCBhZGp1c3RzIHRoZSBzaXplIGF0IHJ1bnRpbWUgYnV0IHByZXZlbnRzIHNvbWUgb3B0aW1pemF0aW9ucywgb3IgKDMpIHNldCBNb2R1bGUuVE9UQUxfTUVNT1JZIGJlZm9yZSB0aGUgcHJvZ3JhbSBydW5zLiIpfXZhciBUT1RBTF9TVEFDSz1Nb2R1bGVbIlRPVEFMX1NUQUNLIl18fDUyNDI4ODA7dmFyIFRPVEFMX01FTU9SWT1Nb2R1bGVbIlRPVEFMX01FTU9SWSJdfHwxNjc3NzIxNjA7dmFyIEZBU1RfTUVNT1JZPU1vZHVsZVsiRkFTVF9NRU1PUlkiXXx8MTA0ODU3NjA7dmFyIHRvdGFsTWVtb3J5PTQwOTY7d2hpbGUodG90YWxNZW1vcnk8VE9UQUxfTUVNT1JZfHx0b3RhbE1lbW9yeTwyKlRPVEFMX1NUQUNLKXtpZih0b3RhbE1lbW9yeTwxNioxMDI0KjEwMjQpe3RvdGFsTWVtb3J5Kj0yfWVsc2V7dG90YWxNZW1vcnkrPTE2KjEwMjQqMTAyNH19aWYodG90YWxNZW1vcnkhPT1UT1RBTF9NRU1PUlkpe01vZHVsZS5wcmludEVycigiaW5jcmVhc2luZyBUT1RBTF9NRU1PUlkgdG8gIit0b3RhbE1lbW9yeSsiIHRvIGJlIG1vcmUgcmVhc29uYWJsZSIpO1RPVEFMX01FTU9SWT10b3RhbE1lbW9yeX1hc3NlcnQodHlwZW9mIEludDMyQXJyYXkhPT0idW5kZWZpbmVkIiYmdHlwZW9mIEZsb2F0NjRBcnJheSE9PSJ1bmRlZmluZWQiJiYhIShuZXcgSW50MzJBcnJheSgxKSlbInN1YmFycmF5Il0mJiEhKG5ldyBJbnQzMkFycmF5KDEpKVsic2V0Il0sIkpTIGVuZ2luZSBkb2VzIG5vdCBwcm92aWRlIGZ1bGwgdHlwZWQgYXJyYXkgc3VwcG9ydCIpO3ZhciBidWZmZXI9bmV3IEFycmF5QnVmZmVyKFRPVEFMX01FTU9SWSk7SEVBUDg9bmV3IEludDhBcnJheShidWZmZXIpO0hFQVAxNj1uZXcgSW50MTZBcnJheShidWZmZXIpO0hFQVAzMj1uZXcgSW50MzJBcnJheShidWZmZXIpO0hFQVBVOD1uZXcgVWludDhBcnJheShidWZmZXIpO0hFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGJ1ZmZlcik7SEVBUFUzMj1uZXcgVWludDMyQXJyYXkoYnVmZmVyKTtIRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtIRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkoYnVmZmVyKTtIRUFQMzJbMF09MjU1O2Fzc2VydChIRUFQVThbMF09PT0yNTUmJkhFQVBVOFszXT09PTAsIlR5cGVkIGFycmF5cyAyIG11c3QgYmUgcnVuIG9uIGEgbGl0dGxlLWVuZGlhbiBzeXN0ZW0iKTtNb2R1bGVbIkhFQVAiXT1IRUFQO01vZHVsZVsiSEVBUDgiXT1IRUFQODtNb2R1bGVbIkhFQVAxNiJdPUhFQVAxNjtNb2R1bGVbIkhFQVAzMiJdPUhFQVAzMjtNb2R1bGVbIkhFQVBVOCJdPUhFQVBVODtNb2R1bGVbIkhFQVBVMTYiXT1IRUFQVTE2O01vZHVsZVsiSEVBUFUzMiJdPUhFQVBVMzI7TW9kdWxlWyJIRUFQRjMyIl09SEVBUEYzMjtNb2R1bGVbIkhFQVBGNjQiXT1IRUFQRjY0O2Z1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcyl7d2hpbGUoY2FsbGJhY2tzLmxlbmd0aD4wKXt2YXIgY2FsbGJhY2s9Y2FsbGJhY2tzLnNoaWZ0KCk7aWYodHlwZW9mIGNhbGxiYWNrPT0iZnVuY3Rpb24iKXtjYWxsYmFjaygpO2NvbnRpbnVlfXZhciBmdW5jPWNhbGxiYWNrLmZ1bmM7aWYodHlwZW9mIGZ1bmM9PT0ibnVtYmVyIil7aWYoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkKXtSdW50aW1lLmR5bkNhbGwoInYiLGZ1bmMpfWVsc2V7UnVudGltZS5keW5DYWxsKCJ2aSIsZnVuYyxbY2FsbGJhY2suYXJnXSl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19dmFyIF9fQVRQUkVSVU5fXz1bXTt2YXIgX19BVElOSVRfXz1bXTt2YXIgX19BVE1BSU5fXz1bXTt2YXIgX19BVEVYSVRfXz1bXTt2YXIgX19BVFBPU1RSVU5fXz1bXTt2YXIgcnVudGltZUluaXRpYWxpemVkPWZhbHNlO2Z1bmN0aW9uIHByZVJ1bigpe2lmKE1vZHVsZVsicHJlUnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicHJlUnVuIl09W01vZHVsZVsicHJlUnVuIl1dO3doaWxlKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKXthZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGVuc3VyZUluaXRSdW50aW1lKCl7aWYocnVudGltZUluaXRpYWxpemVkKXJldHVybjtydW50aW1lSW5pdGlhbGl6ZWQ9dHJ1ZTtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKX1mdW5jdGlvbiBwcmVNYWluKCl7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyl9ZnVuY3Rpb24gZXhpdFJ1bnRpbWUoKXtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FURVhJVF9fKX1mdW5jdGlvbiBwb3N0UnVuKCl7aWYoTW9kdWxlWyJwb3N0UnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInBvc3RSdW4iXT09ImZ1bmN0aW9uIilNb2R1bGVbInBvc3RSdW4iXT1bTW9kdWxlWyJwb3N0UnVuIl1dO3doaWxlKE1vZHVsZVsicG9zdFJ1biJdLmxlbmd0aCl7YWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKX1mdW5jdGlvbiBhZGRPblByZVJ1bihjYil7X19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25QcmVSdW4iXT1Nb2R1bGUuYWRkT25QcmVSdW49YWRkT25QcmVSdW47ZnVuY3Rpb24gYWRkT25Jbml0KGNiKXtfX0FUSU5JVF9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25Jbml0Il09TW9kdWxlLmFkZE9uSW5pdD1hZGRPbkluaXQ7ZnVuY3Rpb24gYWRkT25QcmVNYWluKGNiKXtfX0FUTUFJTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25QcmVNYWluIl09TW9kdWxlLmFkZE9uUHJlTWFpbj1hZGRPblByZU1haW47ZnVuY3Rpb24gYWRkT25FeGl0KGNiKXtfX0FURVhJVF9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25FeGl0Il09TW9kdWxlLmFkZE9uRXhpdD1hZGRPbkV4aXQ7ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25Qb3N0UnVuIl09TW9kdWxlLmFkZE9uUG9zdFJ1bj1hZGRPblBvc3RSdW47ZnVuY3Rpb24gaW50QXJyYXlGcm9tU3RyaW5nKHN0cmluZ3ksZG9udEFkZE51bGwsbGVuZ3RoKXt2YXIgcmV0PShuZXcgUnVudGltZS5VVEY4UHJvY2Vzc29yKS5wcm9jZXNzSlNTdHJpbmcoc3RyaW5neSk7aWYobGVuZ3RoKXtyZXQubGVuZ3RoPWxlbmd0aH1pZighZG9udEFkZE51bGwpe3JldC5wdXNoKDApfXJldHVybiByZXR9TW9kdWxlWyJpbnRBcnJheUZyb21TdHJpbmciXT1pbnRBcnJheUZyb21TdHJpbmc7ZnVuY3Rpb24gaW50QXJyYXlUb1N0cmluZyhhcnJheSl7dmFyIHJldD1bXTtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDtpKyspe3ZhciBjaHI9YXJyYXlbaV07aWYoY2hyPjI1NSl7Y2hyJj0yNTV9cmV0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaHIpKX1yZXR1cm4gcmV0LmpvaW4oIiIpfU1vZHVsZVsiaW50QXJyYXlUb1N0cmluZyJdPWludEFycmF5VG9TdHJpbmc7ZnVuY3Rpb24gd3JpdGVTdHJpbmdUb01lbW9yeShzdHJpbmcsYnVmZmVyLGRvbnRBZGROdWxsKXt2YXIgYXJyYXk9aW50QXJyYXlGcm9tU3RyaW5nKHN0cmluZyxkb250QWRkTnVsbCk7dmFyIGk9MDt3aGlsZShpPGFycmF5Lmxlbmd0aCl7dmFyIGNocj1hcnJheVtpXTtIRUFQOFtidWZmZXIraT4+MF09Y2hyO2k9aSsxfX1Nb2R1bGVbIndyaXRlU3RyaW5nVG9NZW1vcnkiXT13cml0ZVN0cmluZ1RvTWVtb3J5O2Z1bmN0aW9uIHdyaXRlQXJyYXlUb01lbW9yeShhcnJheSxidWZmZXIpe2Zvcih2YXIgaT0wO2k8YXJyYXkubGVuZ3RoO2krKyl7SEVBUDhbYnVmZmVyK2k+PjBdPWFycmF5W2ldfX1Nb2R1bGVbIndyaXRlQXJyYXlUb01lbW9yeSJdPXdyaXRlQXJyYXlUb01lbW9yeTtmdW5jdGlvbiB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyLGJ1ZmZlcixkb250QWRkTnVsbCl7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoO2krKyl7SEVBUDhbYnVmZmVyK2k+PjBdPXN0ci5jaGFyQ29kZUF0KGkpfWlmKCFkb250QWRkTnVsbClIRUFQOFtidWZmZXIrc3RyLmxlbmd0aD4+MF09MH1Nb2R1bGVbIndyaXRlQXNjaWlUb01lbW9yeSJdPXdyaXRlQXNjaWlUb01lbW9yeTtmdW5jdGlvbiB1blNpZ24odmFsdWUsYml0cyxpZ25vcmUpe2lmKHZhbHVlPj0wKXtyZXR1cm4gdmFsdWV9cmV0dXJuIGJpdHM8PTMyPzIqTWF0aC5hYnMoMTw8Yml0cy0xKSt2YWx1ZTpNYXRoLnBvdygyLGJpdHMpK3ZhbHVlfWZ1bmN0aW9uIHJlU2lnbih2YWx1ZSxiaXRzLGlnbm9yZSl7aWYodmFsdWU8PTApe3JldHVybiB2YWx1ZX12YXIgaGFsZj1iaXRzPD0zMj9NYXRoLmFicygxPDxiaXRzLTEpOk1hdGgucG93KDIsYml0cy0xKTtpZih2YWx1ZT49aGFsZiYmKGJpdHM8PTMyfHx2YWx1ZT5oYWxmKSl7dmFsdWU9LTIqaGFsZit2YWx1ZX1yZXR1cm4gdmFsdWV9aWYoIU1hdGhbImltdWwiXXx8TWF0aFsiaW11bCJdKDQyOTQ5NjcyOTUsNSkhPT0tNSlNYXRoWyJpbXVsIl09ZnVuY3Rpb24gaW11bChhLGIpe3ZhciBhaD1hPj4+MTY7dmFyIGFsPWEmNjU1MzU7dmFyIGJoPWI+Pj4xNjt2YXIgYmw9YiY2NTUzNTtyZXR1cm4gYWwqYmwrKGFoKmJsK2FsKmJoPDwxNil8MH07TWF0aC5pbXVsPU1hdGhbImltdWwiXTt2YXIgTWF0aF9hYnM9TWF0aC5hYnM7dmFyIE1hdGhfY29zPU1hdGguY29zO3ZhciBNYXRoX3Npbj1NYXRoLnNpbjt2YXIgTWF0aF90YW49TWF0aC50YW47dmFyIE1hdGhfYWNvcz1NYXRoLmFjb3M7dmFyIE1hdGhfYXNpbj1NYXRoLmFzaW47dmFyIE1hdGhfYXRhbj1NYXRoLmF0YW47dmFyIE1hdGhfYXRhbjI9TWF0aC5hdGFuMjt2YXIgTWF0aF9leHA9TWF0aC5leHA7dmFyIE1hdGhfbG9nPU1hdGgubG9nO3ZhciBNYXRoX3NxcnQ9TWF0aC5zcXJ0O3ZhciBNYXRoX2NlaWw9TWF0aC5jZWlsO3ZhciBNYXRoX2Zsb29yPU1hdGguZmxvb3I7dmFyIE1hdGhfcG93PU1hdGgucG93O3ZhciBNYXRoX2ltdWw9TWF0aC5pbXVsO3ZhciBNYXRoX2Zyb3VuZD1NYXRoLmZyb3VuZDt2YXIgTWF0aF9taW49TWF0aC5taW47dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMrKztpZihNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSl7TW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKX19TW9kdWxlWyJhZGRSdW5EZXBlbmRlbmN5Il09YWRkUnVuRGVwZW5kZW5jeTtmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMtLTtpZihNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSl7TW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKX1pZihydW5EZXBlbmRlbmNpZXM9PTApe2lmKHJ1bkRlcGVuZGVuY3lXYXRjaGVyIT09bnVsbCl7Y2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7cnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbH1pZihkZXBlbmRlbmNpZXNGdWxmaWxsZWQpe3ZhciBjYWxsYmFjaz1kZXBlbmRlbmNpZXNGdWxmaWxsZWQ7ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7Y2FsbGJhY2soKX19fU1vZHVsZVsicmVtb3ZlUnVuRGVwZW5kZW5jeSJdPXJlbW92ZVJ1bkRlcGVuZGVuY3k7TW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXT17fTtNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdPXt9O3ZhciBtZW1vcnlJbml0aWFsaXplcj1udWxsO3ZhciBfX1pUSXQ9MjE4NzI7dmFyIF9fWlRJcz0yMTg2NDt2YXIgX19aVEltPTIxOTM2O3ZhciBfX1pUSWw9MjE5MjA7dmFyIF9fWlRWTjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0U9MjE2NTY7dmFyIF9fWlRJaT0yMTg4ODt2YXIgX19aVEloPTIxODQwO3ZhciBfX1pUSWo9MjE5MDQ7dmFyIF9fWlRJZD0yMTk2ODt2YXIgX19aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0U9MjE2MTY7dmFyIF9fWlRJZj0yMTk1Mjt2YXIgX19aVElhPTIxODU2O3ZhciBfX1pUVk4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRT0yMTk3Njt2YXIgX19aVEljPTIxODI0O1NUQVRJQ19CQVNFPTg7U1RBVElDVE9QPVNUQVRJQ19CQVNFK1J1bnRpbWUuYWxpZ25NZW1vcnkoMjMwODMpO19fQVRJTklUX18ucHVzaCh7ZnVuYzooZnVuY3Rpb24oKXtfX0dMT0JBTF9fSV9hKCl9KX0se2Z1bmM6KGZ1bmN0aW9uKCl7X19HTE9CQUxfX0lfYTY1KCl9KX0se2Z1bmM6KGZ1bmN0aW9uKCl7X19HTE9CQUxfX0lfYTE1MygpfSl9KTthbGxvY2F0ZShbNzYsNjUsODMsOTAsMTA1LDExMiwwLDAsMTExLDExMiwxMDEsMTEwLDAsMCwwLDAsMTAzLDEwMSwxMTYsODAsMTExLDEwNSwxMTAsMTE2LDAsMCwwLDAsMCwwLDAsMCwxMDMsMTAxLDExNiw2NywxMTEsMTE3LDExMCwxMTYsMCwwLDAsMCwwLDAsMCwwLDEwNSwxMDUsMTA1LDAsMCwwLDAsMCw1NCw3Niw2NSw4Myw5MCwxMDUsMTEyLDAsMTIwLDg0LDAsMCw2NCwwLDAsMCw4MCw1NCw3Niw2NSw4Myw5MCwxMDUsMTEyLDAsMCwwLDAsMCwwLDAsMCwxNjAsODQsMCwwLDgwLDAsMCwwLDAsMCwwLDAsNzIsMCwwLDAsMTE4LDEwNSwxMDUsMTA1LDAsMCwwLDAsMTE4LDEwNSwxMDUsMTA1LDEwNSwwLDAsMCwxMDUsMTA1LDAsMCwwLDAsMCwwLDExOCwxMDUsMCwwLDAsMCwwLDAsMTE4LDAsMCwwLDAsMCwwLDAsMTA1LDEwNSwwLDAsMCwwLDAsMCw4MCw3NSw1NCw3Niw2NSw4Myw5MCwxMDUsMTEyLDAsMCwwLDAsMCwwLDAsMTYwLDg0LDAsMCwxNjAsMCwwLDAsMSwwLDAsMCw3MiwwLDAsMCwxMTgsNTAsMTE2LDU0LDExNSw1MCw0OCwwLDExOCw1MCwxMTYsNTQsMTE1LDUwLDQ4LDExOCw1MCwxMTYsNTUsMTE1LDU2LDAsMCwwLDExOCw1MCwxMTYsNTQsMTE1LDUwLDQ4LDExOCw1MCwxMTYsNTYsMTE1LDU0LDAsMCwwLDExOCw1MCwxMTYsNTQsMTE1LDUwLDQ4LDExOCw1MCwxMTYsNTUsMTE1LDU2LDExOCw1MCwxMTYsNTYsMTE1LDU0LDAsMCwwLDAsMCwxMDQsOTcsMTE1LDMyLDEwNSwxMTUsNTgsMzIsMCwwLDAsMCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNDksNTcsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDk1LDExNSw5OSwxMDQsMTAxLDEwOSw5Nyw5NSwxMTYsMTIxLDExMiwxMDEsNjksMCwwLDIyNCw4NSwwLDAsMTYsMSwwLDAsODAsMzksMCwwLDAsMCwwLDAsODQsMTA0LDEwMSwzMiw3Niw2NSw5MCwzMiwxMTUsOTksMTA0LDEwMSwxMDksOTcsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTQsMTAxLDk5LDExMSwxMDMsMTEwLDEwNSwxMjIsMTAxLDEwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OCwxLDAsMCwyMiwwLDAsMCwyMywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDczLDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMTEsMTAyLDMyLDExNSwxMjEsMTA5LDk4LDExMSwxMDgsMTE1LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDIyLDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw0OCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNDgsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw0OCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNDgsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDY4LDk1LDY5LDY5LDY5LDY5LDc4LDgzLDY2LDk1LDczLDc4LDgzLDY3LDk1LDU1LDEwMywxMTIsMTE1LDExNiwxMDUsMTA5LDEwMSw2OSw3OCw4Myw2OSw5NSw3Myw4Myw3Miw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2Niw5NSw3Myw3OCw4Myw2Nyw5NSw1MSwxMTQsMTAzLDk4LDY5LDc4LDgzLDY5LDk1LDczLDgzLDc1LDk1LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OCwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNjksMCwxMjAsODQsMCwwLDIwOCwyLDAsMCwyMjQsODUsMCwwLDE4NCwxLDAsMCwyNDgsMiwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDQ5LDQ5LDEwMSwxMTAsMTAwLDk1LDExMSwxMDIsOTUsMTAyLDEwNSwxMDgsMTAxLDY5LDAsMCwyMjQsODUsMCwwLDE2LDMsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDgyLDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw2OSwxMTAsMTAwLDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDAsMCwwLDAsMCwwLDAsMCwwLDQwLDMsMCwwLDI2LDAsMCwwLDI3LDAsMCwwLDIyLDAsMCwwLDAsMCwwLDAsMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDE0LDAsMSwzLDYsMTAsMTAsOSwxMywxLDIsNCw3LDExLDExLDEwLDEyLDMsNCw1LDgsMTIsMTIsMTEsMTEsNiw3LDgsOSwxMywxMywxMiwxMCwxMCwxMSwxMiwxMywxNCwxNCwxMyw5LDEwLDExLDEyLDEzLDE0LDE1LDE0LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwwLDEsMiwzLDQsNSw2LDcsMSwwLDEsMiwzLDQsNSw2LDIsMSwwLDEsMiwzLDQsNSwzLDIsMSwwLDEsMiwzLDQsNCwzLDIsMSwwLDEsMiwzLDUsNCwzLDIsMSwwLDEsMiw2LDUsNCwzLDIsMSwwLDEsNyw2LDUsNCwzLDIsMSwwLDAsMCwwLDAsMTEyLDUsMCwwLDI4LDAsMCwwLDI5LDAsMCwwLDMwLDAsMCwwLDIyLDAsMCwwLDMxLDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUwLDQ4LDk1LDk1LDExNSwxMDQsOTcsMTE0LDEwMSwxMDAsOTUsMTEyLDExNiwxMTQsOTUsMTEyLDExMSwxMDUsMTEwLDExNiwxMDEsMTE0LDczLDgwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2OCw5NSw3Myw3OCw4Myw2OSw5NSw1NSwxMDMsMTEyLDExNSwxMTYsMTA1LDEwOSwxMDEsNjksNzgsODMsNzEsOTUsNzMsODMsNzQsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3Nyw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw4MSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw4MSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsOCw0LDAsMCwxNDQsMzgsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDk1LDEwMCwxMDEsMTA4LDEwMSwxMTYsMTAxLDczLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2OCw5NSw3Myw3OCw4Myw2OSw5NSw1NSwxMDMsMTEyLDExNSwxMTYsMTA1LDEwOSwxMDEsNjksNzgsODMsNzEsOTUsNzMsODMsNzQsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3Nyw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwxOTIsNywwLDAsMjMsMCwwLDAsMzIsMCwwLDAsMzMsMCwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU1LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE1LDUwLDQ5LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw0OSw3Myw3OCw4Myw5NSw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDc4LDgzLDQ4LDk1LDQ5LDU3LDExNCwxMDEsOTksMTExLDExNCwxMDAsOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw3Myw3NCw3OCw4Myw0OCw5NSw1MywxMDIsMTA1LDEwMSwxMDgsMTAwLDczLDc4LDgzLDQ4LDk1LDUxLDEwOCw5NywxMTUsNTUsMTEyLDExMSwxMDUsMTEwLDExNiw0OSw0OCw2OSw3OCw4Myw0OCw5NSw1MCw0OCwxMTUsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw5NSwxMDAsMTA1LDEwMiwxMDIsOTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsNzMsODMsNjgsOTUsNjksNjksNjksNjksNzgsODMsNjYsOTUsNzMsNzgsODMsNjcsOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw2OSw5NSw3Myw4Myw3Miw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMjI0LDg1LDAsMCwyMDAsNiwwLDAsMjQ4LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCw1Niw5LDAsMCwzNCwwLDAsMCwzNSwwLDAsMCwzNiwwLDAsMCwyMywwLDAsMCwzNywwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTUsMTA0LDk3LDExNCwxMDEsMTAwLDk1LDExMiwxMTYsMTE0LDk1LDExMiwxMTEsMTA1LDExMCwxMTYsMTAxLDExNCw3Myw4MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU1LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE1LDUwLDQ5LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw0OSw3Myw3OCw4Myw0OSw5NSw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw0OSw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDc4LDgzLDUwLDk1LDQ5LDU3LDExNCwxMDEsOTksMTExLDExNCwxMDAsOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw3Myw3NCw3OCw4Myw1MCw5NSw1MywxMDIsMTA1LDEwMSwxMDgsMTAwLDczLDc4LDgzLDUwLDk1LDUxLDEwOCw5NywxMTUsNTUsMTEyLDExMSwxMDUsMTEwLDExNiw0OSw0OCw2OSw3OCw4Myw1MCw5NSw1MCw0OCwxMTUsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw5NSwxMDAsMTA1LDEwMiwxMDIsOTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsNzMsODMsNzAsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3NCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw3OCw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw3OCw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMjI0LDg1LDAsMCwyNDAsNywwLDAsMTQ0LDM4LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU1LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE1LDUwLDQ5LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw0OSw3Myw3OCw4Myw0OSw5NSw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw0OSw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDc4LDgzLDUwLDk1LDQ5LDU3LDExNCwxMDEsOTksMTExLDExNCwxMDAsOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw3Myw3NCw3OCw4Myw1MCw5NSw1MywxMDIsMTA1LDEwMSwxMDgsMTAwLDczLDc4LDgzLDUwLDk1LDUxLDEwOCw5NywxMTUsNTUsMTEyLDExMSwxMDUsMTEwLDExNiw0OSw0OCw2OSw3OCw4Myw1MCw5NSw1MCw0OCwxMTUsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw5NSwxMDAsMTA1LDEwMiwxMDIsOTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsNzMsODMsNzAsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3NCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMTIsMTEsMCwwLDI0LDAsMCwwLDM4LDAsMCwwLDM5LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw0OCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNDgsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw0OCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNDgsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDY4LDk1LDY5LDY5LDY5LDY5LDc4LDgzLDY2LDk1LDczLDc4LDgzLDY3LDk1LDU1LDEwMywxMTIsMTE1LDExNiwxMDUsMTA5LDEwMSw2OSw3OCw4Myw2OSw5NSw3Myw4Myw3Miw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDIyNCw4NSwwLDAsMTIwLDEwLDAsMCwyNDgsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDIzMiwxMiwwLDAsNDAsMCwwLDAsNDEsMCwwLDAsNDIsMCwwLDAsMjQsMCwwLDAsNDMsMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNDgsOTUsOTUsMTE1LDEwNCw5NywxMTQsMTAxLDEwMCw5NSwxMTIsMTE2LDExNCw5NSwxMTIsMTExLDEwNSwxMTAsMTE2LDEwMSwxMTQsNzMsODAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsNDksOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsNDksOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsNDksOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw1MCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNTAsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw1MCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNTAsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDcwLDk1LDY5LDY5LDY5LDY5LDc4LDgzLDY4LDk1LDczLDc4LDgzLDY5LDk1LDU1LDEwMywxMTIsMTE1LDExNiwxMDUsMTA5LDEwMSw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3NCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw3OCw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw3OCw5NSw2OSw2OSw2OSw2OSwwLDIyNCw4NSwwLDAsMTYwLDExLDAsMCwxNDQsMzgsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDk1LDEwMCwxMDEsMTA4LDEwMSwxMTYsMTAxLDczLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2OCw5NSw3Myw3OCw4Myw2OSw5NSw1NSwxMDMsMTEyLDExNSwxMTYsMTA1LDEwOSwxMDEsNjksNzgsODMsNzEsOTUsNzMsODMsNzQsOTUsNjksNjksNjksNjksNjksNjksNjksNjksNjksNjksNjksMCwwLDAsMCwwLDAsMCwwLDgsMTUsMCwwLDI1LDAsMCwwLDQ0LDAsMCwwLDQ1LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw0OCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNDgsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw0OCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNDgsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDY4LDk1LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCw0MCwxNCwwLDAsMjQ4LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMDQsMTYsMCwwLDQ2LDAsMCwwLDQ3LDAsMCwwLDQ4LDAsMCwwLDI1LDAsMCwwLDQ5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUwLDQ4LDk1LDk1LDExNSwxMDQsOTcsMTE0LDEwMSwxMDAsOTUsMTEyLDExNiwxMTQsOTUsMTEyLDExMSwxMDUsMTEwLDExNiwxMDEsMTE0LDczLDgwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw3NSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw3NSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsNTYsMTUsMCwwLDE0NCwzOCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsNDksOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsNDksOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsNDksOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw1MCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNTAsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw1MCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNTAsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDcwLDk1LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwxMTgsMCwwLDAsMCwwLDAsMCwxMTYsMCwwLDAsMCwwLDAsMCwxMTUsMCwwLDAsMCwwLDAsMCw2NCwwLDAsMCwwLDAsMCwwLDE2LDE4LDAsMCw1MCwwLDAsMCw1MSwwLDAsMCw1NiwwLDAsMCwyNDgsMjU1LDI1NSwyNTUsMTYsMTgsMCwwLDUyLDAsMCwwLDUzLDAsMCwwLDE5MiwyNTUsMjU1LDI1NSwxOTIsMjU1LDI1NSwyNTUsMTYsMTgsMCwwLDU0LDAsMCwwLDU1LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU2LDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNzgsODMsOTUsNTcsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDExMSwxMTQsNzMsOTksNjksNjksNjksNjksMCwwLDAsMCwyMjQsODUsMCwwLDIwMCwxNywwLDAsMjI0LDQ1LDAsMCwwLDAsMCwwLDY0LDAsMCwwLDAsMCwwLDAsMTkyLDQ0LDAsMCw1NiwwLDAsMCw1NywwLDAsMCwxOTIsMjU1LDI1NSwyNTUsMTkyLDI1NSwyNTUsMjU1LDE5Miw0NCwwLDAsNTgsMCwwLDAsNTksMCwwLDAsMCwwLDAsMCwyMDgsMTgsMCwwLDYwLDAsMCwwLDYxLDAsMCwwLDI2LDAsMCwwLDIyLDAsMCwwLDIyLDAsMCwwLDIyLDAsMCwwLDIzLDAsMCwwLDI0LDAsMCwwLDIzLDAsMCwwLDI1LDAsMCwwLDI2LDAsMCwwLDI2LDAsMCwwLDI0LDAsMCwwLDI3LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Myw5OCw5NywxMTUsMTA1LDk5LDk1LDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDk4LDExNywxMDIsNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDc4LDgzLDk1LDU3LDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMTEsMTE0LDczLDk5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxMzYsMTgsMCwwLDcyLDQ0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMTY4LDE5LDAsMCw2MiwwLDAsMCw2MywwLDAsMCw2NCwwLDAsMCwyOCwwLDAsMCw2NSwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTUsMTA0LDk3LDExNCwxMDEsMTAwLDk1LDExMiwxMTYsMTE0LDk1LDExMiwxMTEsMTA1LDExMCwxMTYsMTAxLDExNCw3Myw4MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsOTUsNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsODMsNTcsOTUsNjksNjksNzgsODMsOTUsNTcsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDExMSwxMTQsNzMsODMsNTcsOTUsNjksNjksNjksNjksMCwyMjQsODUsMCwwLDAsMTksMCwwLDE0NCwzOCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw0OSw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsNzEsMTExLDExNiwzMiwxMDAsOTcsMTE2LDk3LDMyLDAsMCwwLDAsMCwwLDAsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDAsMCwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwNSwxMTAsMTAzLDMyLDExNSwxMDQsMTA1LDExNiwzMywwLDAsMTAwLDExMSwxMTAsMTAxLDMyLDEwMCwxMDEsMTA4LDEwMSwxMTYsMTA1LDExMCwxMDMsMzIsMTE1LDEwNCwxMDUsMTE2LDMzLDAsMCwwLDAsMCw3Niw2NSw4Myw3MCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNDksNTEsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTUsMTA5LDk3LDEwMywxMDUsOTksNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTIwLDIwLDAsMCw4MCwzOSwwLDAsMCwwLDAsMCw3Nyw5NywxMDMsMTA1LDk5LDMyLDExNCwxMDEsOTcsMTAwLDMzLDAsMCwwLDAsMCwxMTIsOTcsMTE0LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDAsMCwxMTIsOTcsMTE0LDExNSwxMDUsMTEwLDEwMywzMiw5OSwxMDQsMTE3LDExMCwxMDcsMzIsMTE2LDk3LDk4LDEwOCwxMDEsMCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTAsNTAsOTksMTA0LDExNywxMTAsMTA3LDk1LDExNiw5Nyw5OCwxMDgsMTAxLDk1LDExNCwxMDEsOTcsMTAwLDk1LDEwMSwxMTQsMTE0LDExMSwxMTQsNjksMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDIyNCwyMCwwLDAsODAsMzksMCwwLDAsMCwwLDAsNjcsMTA0LDExNywxMTAsMTA3LDMyLDExNiw5Nyw5OCwxMDgsMTAxLDMyLDExMSwxMDIsMTAyLDExNSwxMDEsMTE2LDMyLDYxLDYxLDMyLDQ1LDQ5LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsOTcsMTE2LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTYsMTA1LDEwOSwxMDEsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNDksNTEsMTEwLDExMSwxMTYsOTUsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsODAsMjEsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTAsNTQsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDk1LDk5LDEwNCwxMTcsMTEwLDEwNyw5NSwxMTYsOTcsOTgsMTA4LDEwMSw5NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDY5LDAsMCwwLDIyNCw4NSwwLDAsMTI4LDIxLDAsMCw4MCwzOSwwLDAsMCwwLDAsMCw5OSwxMDQsMTE3LDExMCwxMDcsOTUsMTE1LDEwNSwxMjIsMTAxLDMyLDYxLDYxLDMyLDExNywxMDUsMTEwLDExNiw0NiwxMDksOTcsMTIwLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsOTcsMTE2LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTYsMTA1LDEwOSwxMDEsNDQsMzIsOTksOTcsMTA4LDEwOCwzMiw0OSw0NSw1Niw0OCw0OCw0NSw2OCw2NSw3MCw4NSw4MSwzMiwxMDIsMTExLDExNCwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsNDYsMCwwLDAsMCwwLDk5LDEwNCwxMTcsMTEwLDEwNywzMiwxMTYsOTcsOTgsMTA4LDEwMSwzMiw5OSwxMTEsMTE3LDExMCwxMTYsMzIsMTA1LDExNSw1OCwzMiwwLDAsOTksMTE2LDExMSw5MSwwLDAsMCwwLDkzLDU4LDMyLDAsMCwwLDAsMCw4NCwxMDQsMTAxLDMyLDk5LDEwNCwxMTcsMTEwLDEwNywzMiwxMTYsOTcsOTgsMTA4LDEwMSwzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDExNywxMTAsMTA3LDExMCwxMTEsMTE5LDExMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTY4LDIxLDAsMCw2NiwwLDAsMCw2NywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTEyLDIxLDAsMCw2OCwwLDAsMCw2OSwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDg0LDEwNCwxMDEsMTE0LDEwMSwzMiwxMTksOTcsMTE1LDMyLDk3LDMyLDExMiwxMTQsMTExLDk4LDEwOCwxMDEsMTA5LDMyLDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDk5LDEwNCwxMTcsMTEwLDEwNywzMiwxMTYsOTcsOTgsMTA4LDEwMSwwLDAsMCwwLDAsMCwwLDAsMCw4LDIxLDAsMCw3MCwwLDAsMCw3MSwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsMzIsMTAxLDExMCw5OSwxMTEsMTAwLDEwMSwxMDAsMCwwLDExOCwxMDgsMTE0LDMyLDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMzIsMTE0LDEwMSw5NywxMDAsMzMsMCwwLDAsMCwwLDAsMCwwLDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsMzIsMTE4LDEwOCwxMTQsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwwLDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw0OSw1MSwxMTAsMTExLDk1LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsOTUsMTE4LDEwOCwxMTQsNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMzIsMjMsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDExMiwxMTcsMTE1LDEwNCwxMDUsMTEwLDEwMywzMywwLDAsMCwwLDAsMCwwLDAsNzgsMTExLDMyLDc2LDY1LDgzLDEyMiwxMDUsMTEyLDMyLDg2LDc2LDgyLDMyLDExOSw5NywxMTUsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDg2LDc2LDgyLDExNSwzMiwxMTUsMTAxLDk5LDExNiwxMDUsMTExLDExMCwwLDAsMCwwLDAsMCwwLDAsMCw2NCwyMywwLDAsNzIsMCwwLDAsNzMsMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDUzLDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsOTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiw5NSwxMTcsMTEwLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDY5LDAsMCwwLDAsMjI0LDg1LDAsMCwxNjgsMjMsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDMyLDEwNSwxMTUsNTgsMzIsMCwxMTYsMTExLDExNiw5NywxMDgsMzIsMTA1LDExNiwxMDEsMTA5LDExNSw1OCwzMiwwLDAsMCw4MCw5NywxMTQsMTE1LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTE0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDUsMTE2LDEwMSwxMDksMTE1LDMyLDExMCwxMTEsMTE5LDMzLDAsMCwwLDAsMCwwLDgwLDExNywxMTUsMTA0LDEwNSwxMTAsMTAzLDMyLDEwNSwxMTYsMTAxLDEwOSwzMiw5NywxMTYsMzIsMTA1LDExMCwxMDAsMTAxLDEyMCw1OCwzMiwwLDc5LDExMCwxMDgsMTIxLDMyLDc2LDY1LDgzLDEyMiwxMDUsMTEyLDMyLDgwLDc5LDczLDc4LDg0LDg3LDczLDgzLDY5LDMyLDY3LDcyLDg1LDc4LDc1LDY5LDY4LDMyLDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwwLDAsMCwwLDAsMjA4LDIzLDAsMCw3NCwwLDAsMCw3NSwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1NSw5OCw5NywxMDAsOTUsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDk1LDk5LDk3LDEwOCwxMDgsNjksMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTM2LDI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNjgsMjQsMCwwLDc2LDAsMCwwLDc3LDAsMCwwLDI3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTYsMjYsMCwwLDc4LDAsMCwwLDc5LDAsMCwwLDI4LDAsMCwwLDI3LDAsMCwwLDgwLDAsMCwwLDgxLDAsMCwwLDI4LDAsMCwwLDI5LDAsMCwwLDI5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDk1LDk1LDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCw1NCw5NSw5NSwxMDIsMTE3LDExMCw5OSw3Myw5MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDEwNSwxMTEsNTQsMTE0LDEwMSw5NywxMDAsMTAxLDExNCw0OSw0OCw5OCw5NywxMTUsMTA1LDk5LDk1LDEwMiwxMDUsMTA4LDEwMSw3Myw3OCw4Myw1MCw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDQ5LDQ5LDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTExLDExNCwxMTUsNjksMTE4LDY5LDg1LDEwOCw4Miw3OCw4Myw1MSw5NSw1NCwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDY5LDY5LDk1LDc4LDgzLDk1LDU3LDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMTEsMTE0LDczLDgzLDY2LDk1LDY5LDY5LDcwLDExOCw4Myw2NSw5NSw2OSw2OSw2OSwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCw5NSw5NSwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsNTQsOTUsOTUsOTgsOTcsMTE1LDEwMSw3Myw3MCwxMTgsODIsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1MCwxMDUsMTExLDU0LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsNjksNjksNjksNjksMCwwLDAsMCwxMjAsODQsMCwwLDIwOCwyNSwwLDAsMjI0LDg1LDAsMCw1NiwyNSwwLDAsOCwyNiwwLDAsMCwwLDAsMCw5MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDEwNSwxMTEsNTQsMTE0LDEwMSw5NywxMDAsMTAxLDExNCw0OSw0OCw5OCw5NywxMTUsMTA1LDk5LDk1LDEwMiwxMDUsMTA4LDEwMSw3Myw3OCw4Myw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDQ5LDQ5LDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTExLDExNCwxMTUsNjksMTE4LDY5LDg1LDEwOCw4Miw3OCw4Myw0OCw5NSw1NCwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDY5LDY5LDk1LDAsMCwwLDEyMCw4NCwwLDAsMzIsMjYsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTAsNDksMTExLDEwOCwxMDAsOTUsMTE1LDExNiwxMjEsMTA4LDEwMSw5NSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTA1LDExMSwxMTAsNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTM2LDI2LDAsMCw4MCwzOSwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDQ5LDUyLDExMCwxMTEsMTE2LDk1LDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMDEsMTAwLDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxOTIsMjYsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDg0LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwxMTAsMzksMTE2LDMyLDExNSwxMDEsMTAxLDEwOSwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTAxLDEwMCwwLDAsMCwwLDAsMCwyMjQsMjYsMCwwLDgyLDAsMCwwLDgzLDAsMCwwLDIyLDAsMCwwLDAsMCwwLDAsODQsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEwMSwxMDEsMTA5LDExNSwzMiwxMTYsMTExLDMyLDEwNCw5NywxMTgsMTAxLDMyLDExMSwxMDgsMTAwLDMyLDExNSwxMTYsMTIxLDEwOCwxMDEsMzIsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDEwNSwxMTEsMTEwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDAsMCwwLDAsMCwwLDAsMCwwLDE3NiwyNiwwLDAsODQsMCwwLDAsODUsMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCw3MCwxMDUsMTA4LDEwMSwzMiwxMDksOTcsMTAzLDEwNSw5OSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExOCw5NywxMDgsMTA1LDEwMCwwLDAsMCwwLDAsMTUyLDIwLDAsMCw4NiwwLDAsMCw4NywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDEwMywxMTEsMTA1LDExMCwxMDMsMzIsMTAwLDExMSwxMTksMTEwLDMzLDAsMCwwLDAsMCwwLDAsMCwwLDEyOCwyOCwwLDAsODgsMCwwLDAsODksMCwwLDAsOTAsMCwwLDAsMzAsMCwwLDAsOTEsMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNDgsOTUsOTUsMTE1LDEwNCw5NywxMTQsMTAxLDEwMCw5NSwxMTIsMTE2LDExNCw5NSwxMTIsMTExLDEwNSwxMTAsMTE2LDEwMSwxMTQsNzMsODAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1MCwxMDUsMTExLDU0LDExNCwxMDEsOTcsMTAwLDEwMSwxMTQsNDksNDgsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDIsMTA1LDEwOCwxMDEsNzMsNzgsODMsNDksOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw1NSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw1NSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDI0MCwyNywwLDAsMTQ0LDM4LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDEwNSwxMTEsNTQsMTE0LDEwMSw5NywxMDAsMTAxLDExNCw0OSw0OCw5OCw5NywxMTUsMTA1LDk5LDk1LDEwMiwxMDUsMTA4LDEwMSw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwxMjAsMjksMCwwLDkyLDAsMCwwLDkzLDAsMCwwLDk0LDAsMCwwLDMxLDAsMCwwLDk1LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUwLDQ4LDk1LDk1LDExNSwxMDQsOTcsMTE0LDEwMSwxMDAsOTUsMTEyLDExNiwxMTQsOTUsMTEyLDExMSwxMDUsMTEwLDExNiwxMDEsMTE0LDczLDgwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw1MSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw1MSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwyMjQsODUsMCwwLDgsMjksMCwwLDE0NCwzOCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDExOCwxMTEsMTA1LDEwMCwwLDAsMCwwLDk4LDExMSwxMTEsMTA4LDAsMCwwLDAsOTksMTA0LDk3LDExNCwwLDAsMCwwLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDk5LDEwNCw5NywxMTQsMCwwLDAsMCwwLDExNywxMTAsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsOTksMTA0LDk3LDExNCwwLDAsMCwxMTUsMTA0LDExMSwxMTQsMTE2LDAsMCwwLDExNywxMTAsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTE1LDEwNCwxMTEsMTE0LDExNiwwLDAsMTA1LDExMCwxMTYsMCwwLDAsMCwwLDExNywxMTAsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTA1LDExMCwxMTYsMCwwLDAsMCwxMDgsMTExLDExMCwxMDMsMCwwLDAsMCwxMTcsMTEwLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDEwOCwxMTEsMTEwLDEwMywwLDAsMCwxMDIsMTA4LDExMSw5NywxMTYsMCwwLDAsMTAwLDExMSwxMTcsOTgsMTA4LDEwMSwwLDAsMTE1LDExNiwxMDAsNTgsNTgsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMCwwLDAsMCwwLDExNSwxMTYsMTAwLDU4LDU4LDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNjAsMTE3LDExMCwxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwzMiw5OSwxMDQsOTcsMTE0LDYyLDAsMCwwLDAsMCwwLDAsMCwxMTUsMTE2LDEwMCw1OCw1OCwxMTksMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMCwwLDAsMCwxMDEsMTA5LDExNSw5OSwxMTQsMTA1LDExMiwxMTYsMTAxLDExMCw1OCw1OCwxMTgsOTcsMTA4LDAsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNTgsNTgsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE4LDEwNSwxMDEsMTE5LDAsNzgsNDksNDgsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNDksNDksMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE4LDEwNSwxMDEsMTE5LDY5LDAsMCwwLDAsMCwxMjAsODQsMCwwLDIwMCwzMCwwLDAsNzgsNDksNDgsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNTEsMTE4LDk3LDEwOCw2OSwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDI0MCwzMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUwLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNzMsMTE5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3MywxMTksNjksNjksNzgsODMsOTUsNTcsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDExMSwxMTQsNzMsMTE5LDY5LDY5LDY5LDY5LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNDksOTUsOTUsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw5NSw5OSwxMTEsMTA5LDEwOSwxMTEsMTEwLDczLDc2LDk4LDQ5LDY5LDY5LDY5LDAsMCwwLDEyMCw4NCwwLDAsODAsMzEsMCwwLDY0LDg2LDAsMCwxNiwzMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDEyMCwzMSwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTAsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw3MywxMDQsNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDEwNCw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3MywxMDQsNjksNjksNjksNjksMCwwLDY0LDg2LDAsMCwxNTIsMzEsMCwwLDAsMCwwLDAsMSwwLDAsMCwxMjAsMzEsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUwLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDc4LDgzLDk1LDU3LDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMTEsMTE0LDczLDk5LDY5LDY5LDY5LDY5LDAsMCw2NCw4NiwwLDAsMjQwLDMxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMTIwLDMxXSwiaTgiLEFMTE9DX05PTkUsUnVudGltZS5HTE9CQUxfQkFTRSk7YWxsb2NhdGUoWzIwOCwzNiwwLDAsOTYsMCwwLDAsOTcsMCwwLDAsMjksMCwwLDAsMjUsMCwwLDAsMjMsMCwwLDAsMjMsMCwwLDAsMzAsMCwwLDAsMzEsMCwwLDAsMjYsMCwwLDAsMzIsMCwwLDAsMzMsMCwwLDAsMzIsMCwwLDAsMjcsMCwwLDAsMzMsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDExNSwxMTYsMTAwLDExMSwxMTcsMTE2LDk4LDExNywxMDIsNzMsMTE5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDE3NiwzNiwwLDAsMTM2LDQ0LDAsMCwwLDAsMCwwLDAsMCwwLDAsNTYsMzcsMCwwLDk4LDAsMCwwLDk5LDAsMCwwLDMwLDAsMCwwLDI1LDAsMCwwLDIzLDAsMCwwLDIzLDAsMCwwLDM0LDAsMCwwLDMxLDAsMCwwLDI2LDAsMCwwLDM1LDAsMCwwLDM2LDAsMCwwLDM0LDAsMCwwLDI4LDAsMCwwLDM1LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCw5NSw5NSwxMTUsMTE2LDEwMCwxMDUsMTEwLDk4LDExNywxMDIsNzMsMTE5LDY5LDY5LDAsMjI0LDg1LDAsMCwzMiwzNywwLDAsMTM2LDQ0LDAsMCwwLDAsMCwwLDExNywxMTAsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsMTA4LDExMSw5OSw5NywxMDgsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDMyLDEwNSwxMTAsMTEyLDExNywxMTYsMCwwLDAsMCwwLDAsMCwyMDgsMzcsMCwwLDEwMCwwLDAsMCwxMDEsMCwwLDAsMzEsMCwwLDAsMjIsMCwwLDAsMjQsMCwwLDAsMjQsMCwwLDAsMzcsMCwwLDAsMjQsMCwwLDAsMjMsMCwwLDAsMzgsMCwwLDAsMjYsMCwwLDAsMzYsMCwwLDAsMjksMCwwLDAsMzcsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDExNSwxMTYsMTAwLDExMSwxMTcsMTE2LDk4LDExNywxMDIsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTc2LDM3LDAsMCw3Miw0NCwwLDAsMCwwLDAsMCwwLDAsMCwwLDU2LDM4LDAsMCwxMDIsMCwwLDAsMTAzLDAsMCwwLDMyLDAsMCwwLDIyLDAsMCwwLDI0LDAsMCwwLDI0LDAsMCwwLDIzLDAsMCwwLDI0LDAsMCwwLDIzLDAsMCwwLDM5LDAsMCwwLDQwLDAsMCwwLDM4LDAsMCwwLDI0LDAsMCwwLDM5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCw5NSw5NSwxMTUsMTE2LDEwMCwxMDUsMTEwLDk4LDExNywxMDIsNzMsOTksNjksNjksMCwyMjQsODUsMCwwLDMyLDM4LDAsMCw3Miw0NCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsOTUsOTUsMTE1LDEwNCw5NywxMTQsMTAxLDEwMCw5NSw5OSwxMTEsMTE3LDExMCwxMTYsNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsNzIsMzgsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Nyw5NSw5NSwxMTUsMTA0LDk3LDExNCwxMDEsMTAwLDk1LDExOSwxMDEsOTcsMTA3LDk1LDk5LDExMSwxMTcsMTEwLDExNiw2OSwwLDAsMCw2NCw4NiwwLDAsMTEyLDM4LDAsMCwwLDAsMCwwLDEsMCwwLDAsMTA0LDM4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMjMyLDM4LDAsMCwxMDQsMCwwLDAsMTA1LDAsMCwwLDQxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MCwzOSwwLDAsMTA2LDAsMCwwLDEwNywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDgzLDExNiw0OSw0OSwxMDgsMTExLDEwMywxMDUsOTksOTUsMTAxLDExNCwxMTQsMTExLDExNCwwLDIyNCw4NSwwLDAsMjE2LDM4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0MCwzOSwwLDAsMTA0LDAsMCwwLDEwOCwwLDAsMCw0MSwwLDAsMCwwLDAsMCwwLDgzLDExNiw0OSw1MCwxMDgsMTAxLDExMCwxMDMsMTE2LDEwNCw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDE2LDM5LDAsMCwyMzIsMzgsMCwwLDAsMCwwLDAsODMsMTE2LDQ5LDUxLDExNCwxMTcsMTEwLDExNiwxMDUsMTA5LDEwMSw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCw1NiwzOSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEwMywxMDEsMTEwLDEwMSwxMTQsMTA1LDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw1OCwzMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDIwMCwzOSwwLDAsMTA5LDAsMCwwLDExMCwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MCwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDY5LDAsMCwyMjQsODUsMCwwLDE3NiwzOSwwLDAsODAsMzksMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUyLDEwMSwxMTQsMTE0LDExMSwxMTQsOTUsOTksOTcsMTE2LDEwMSwxMDMsMTExLDExNCwxMjEsNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsMjE2LDM5LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTAsOTUsOTUsMTAwLDExMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSw2OSwwLDAsMjI0LDg1LDAsMCwwLDQwLDAsMCwyNDgsMzksMCwwLDAsMCwwLDAsMCwwLDAsMCwxMjAsNDAsMCwwLDExMSwwLDAsMCwxMTIsMCwwLDAsNDIsMCwwLDAsMjIsMCwwLDAsMzAsMCwwLDAsMzEsMCwwLDAsMjMsMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNTIsOTUsOTUsMTAzLDEwMSwxMTAsMTAxLDExNCwxMDUsOTksOTUsMTAxLDExNCwxMTQsMTExLDExNCw5NSw5OSw5NywxMTYsMTAxLDEwMywxMTEsMTE0LDEyMSw2OSwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDgwLDQwLDAsMCwyNCw0MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIxNiw0MCwwLDAsMTEzLDAsMCwwLDExNCwwLDAsMCw0MywwLDAsMCwyNCwwLDAsMCwzMCwwLDAsMCwzMSwwLDAsMCwyNSwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw1MSw5NSw5NSwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDk1LDk5LDk3LDExNiwxMDEsMTAzLDExMSwxMTQsMTIxLDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxNzYsNDAsMCwwLDI0LDQwLDAsMCwwLDAsMCwwLDEwOSwxMTcsMTE2LDEwMSwxMjAsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTAyLDk3LDEwNSwxMDgsMTAxLDEwMCwwLDAsMCwwLDAsMCwwLDEwMSw5OSwzMiw2MSw2MSwzMiw0OCwwLDQ3LDg1LDExNSwxMDEsMTE0LDExNSw0NywxMTgsMTAxLDExNCwxMDksOTcsNDcsMTE2LDEwOSwxMTIsNDcsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNDcsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksNDcsMTA4LDEwNSw5OCw0NywxMDgsMTA1LDk4LDk5LDEyMCwxMjAsNDcsMTA5LDExNywxMTYsMTAxLDEyMCw0Niw5OSwxMTIsMTEyLDAsMTE3LDExMCwxMDgsMTExLDk5LDEwNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywwLDAsMCwwLDAsMCwwLDAsNzIsNDQsMCwwLDExNSwwLDAsMCwxMTYsMCwwLDAsMjYsMCwwLDAsMjIsMCwwLDAsMjQsMCwwLDAsMjQsMCwwLDAsMjMsMCwwLDAsMjQsMCwwLDAsMjMsMCwwLDAsMzgsMCwwLDAsMjYsMCwwLDAsMzYsMCwwLDAsMjQsMCwwLDAsMzksMCwwLDAsMCwwLDAsMCwxMzYsNDQsMCwwLDExNywwLDAsMCwxMTgsMCwwLDAsMzMsMCwwLDAsMjUsMCwwLDAsMjMsMCwwLDAsMjMsMCwwLDAsMzQsMCwwLDAsMzEsMCwwLDAsMjYsMCwwLDAsMzIsMCwwLDAsMzMsMCwwLDAsMzIsMCwwLDAsMjgsMCwwLDAsMzUsMCwwLDAsOCwwLDAsMCwwLDAsMCwwLDE5Miw0NCwwLDAsNTYsMCwwLDAsNTcsMCwwLDAsMjQ4LDI1NSwyNTUsMjU1LDI0OCwyNTUsMjU1LDI1NSwxOTIsNDQsMCwwLDU4LDAsMCwwLDU5LDAsMCwwLDgsMCwwLDAsMCwwLDAsMCw4LDQ1LDAsMCwxMTksMCwwLDAsMTIwLDAsMCwwLDI0OCwyNTUsMjU1LDI1NSwyNDgsMjU1LDI1NSwyNTUsOCw0NSwwLDAsMTIxLDAsMCwwLDEyMiwwLDAsMCw0LDAsMCwwLDAsMCwwLDAsODAsNDUsMCwwLDEyMywwLDAsMCwxMjQsMCwwLDAsMjUyLDI1NSwyNTUsMjU1LDI1MiwyNTUsMjU1LDI1NSw4MCw0NSwwLDAsMTI1LDAsMCwwLDEyNiwwLDAsMCw0LDAsMCwwLDAsMCwwLDAsMTUyLDQ1LDAsMCwxMjcsMCwwLDAsMTI4LDAsMCwwLDI1MiwyNTUsMjU1LDI1NSwyNTIsMjU1LDI1NSwyNTUsMTUyLDQ1LDAsMCwxMjksMCwwLDAsMTMwLDAsMCwwLDEwNSwxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwwLDAsMCwwLDAsMCwwLDAsMTE3LDExMCwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwNSwxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSw5OSw5NywxMTYsMTAxLDEwMywxMTEsMTE0LDEyMSwzMiwxMDEsMTE0LDExNCwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsOTYsNDMsMCwwLDEzMSwwLDAsMCwxMzIsMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEzNiw0MywwLDAsMTMzLDAsMCwwLDEzNCwwLDAsMCwxMDUsMTExLDExNSw5NSw5OCw5NywxMTUsMTAxLDU4LDU4LDk5LDEwOCwxMDEsOTcsMTE0LDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDEwNSwxMTEsMTE1LDk1LDk4LDk3LDExNSwxMDEsNTUsMTAyLDk3LDEwNSwxMDgsMTE3LDExNCwxMDEsNjksMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDY0LDQzLDAsMCwyMDAsMzksMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDEwNSwxMTEsMTE1LDk1LDk4LDk3LDExNSwxMDEsNjksMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDExMiw0MywwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk4LDk3LDExNSwxMDUsOTksOTUsMTA1LDExMSwxMTUsNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxNDQsNDMsMCwwLDEzNiw0MywwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDUsMTExLDExNSw3MywxMTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDExOSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMjA4LDQzLDAsMCwxMzYsNDMsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUzLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwxNiw0NCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUzLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDgwLDQ0LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTEsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksMCwwLDY0LDg2LDAsMCwxNDQsNDQsMCwwLDAsMCwwLDAsMSwwLDAsMCwxOTIsNDMsMCwwLDMsMjQ0LDI1NSwyNTUsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUxLDk4LDk3LDExNSwxMDUsOTksOTUsMTA1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNzMsMTE5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3MywxMTksNjksNjksNjksNjksMCwwLDY0LDg2LDAsMCwyMTYsNDQsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDQ0LDAsMCwzLDI0NCwyNTUsMjU1LDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MSw5OCw5NywxMTUsMTA1LDk5LDk1LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSwwLDAsNjQsODYsMCwwLDMyLDQ1LDAsMCwwLDAsMCwwLDEsMCwwLDAsMTkyLDQzLDAsMCwzLDI0NCwyNTUsMjU1LDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MSw5OCw5NywxMTUsMTA1LDk5LDk1LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDAsMCw2NCw4NiwwLDAsMTA0LDQ1LDAsMCwwLDAsMCwwLDEsMCwwLDAsMCw0NCwwLDAsMywyNDQsMjU1LDI1NSw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDUsMTExLDExNSwxMTYsMTE0LDEwMSw5NywxMDksNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDY5LDY5LDAsNjQsODYsMCwwLDE3Niw0NSwwLDAsMywwLDAsMCwyLDAsMCwwLDE5Miw0NCwwLDAsMiwwLDAsMCw4MCw0NSwwLDAsMiw4LDAsMCwwLDAsMCwwLDcyLDQ2LDAsMCwxMzUsMCwwLDAsMTM2LDAsMCwwLDQ0LDAsMCwwLDIyLDAsMCwwLDMwLDAsMCwwLDMxLDAsMCwwLDI2LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU3LDk1LDk1LDEwNSwxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSw5OSw5NywxMTYsMTAxLDEwMywxMTEsMTE0LDEyMSw2OSwwLDAsMCwyMjQsODUsMCwwLDQwLDQ2LDAsMCwyNCw0MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDU2LDYwLDAsMCwxMzcsMCwwLDAsMTM4LDAsMCwwLDEzOSwwLDAsMCwyMiwwLDAsMCwyNSwwLDAsMCwzMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw5Niw2MCwwLDAsMTQwLDAsMCwwLDE0MSwwLDAsMCwxMzksMCwwLDAsMjMsMCwwLDAsMjYsMCwwLDAsMzMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTYsNjUsMCwwLDE0MiwwLDAsMCwxNDMsMCwwLDAsMTM5LDAsMCwwLDIyLDAsMCwwLDIzLDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDI2LDAsMCwwLDI3LDAsMCwwLDI4LDAsMCwwLDI5LDAsMCwwLDMwLDAsMCwwLDMxLDAsMCwwLDMyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw5Nyw5OCw5OSwxMDAsMTAxLDEwMiw2NSw2Niw2Nyw2OCw2OSw3MCwxMjAsODgsNDMsNDUsMTEyLDgwLDEwNSw3MywxMTAsNzgsMCwwLDAsMCwwLDAsMCwwLDM3LDExMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDE2OCw2NSwwLDAsMTQ0LDAsMCwwLDE0NSwwLDAsMCwxMzksMCwwLDAsMzMsMCwwLDAsMzQsMCwwLDAsMzUsMCwwLDAsMzYsMCwwLDAsMzcsMCwwLDAsMzgsMCwwLDAsMzksMCwwLDAsNDAsMCwwLDAsNDEsMCwwLDAsNDIsMCwwLDAsNDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTA0LDY2LDAsMCwxNDYsMCwwLDAsMTQ3LDAsMCwwLDEzOSwwLDAsMCwyNSwwLDAsMCwyNiwwLDAsMCw0NCwwLDAsMCwyNywwLDAsMCw0NSwwLDAsMCwyMiwwLDAsMCwyMywwLDAsMCwyOCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNjcsMCwwLDE0OCwwLDAsMCwxNDksMCwwLDAsMTM5LDAsMCwwLDI5LDAsMCwwLDMwLDAsMCwwLDQ2LDAsMCwwLDMxLDAsMCwwLDQ3LDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDMyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDM3LDAsMCwwLDAsMCwwLDAsMzcsMTEyLDAsMCwwLDAsMCwwLDAsMCwwLDAsNDAsNjIsMCwwLDE1MCwwLDAsMCwxNTEsMCwwLDAsMTM5LDAsMCwwLDQ1LDAsMCwwLDQ4LDAsMCwwLDQ5LDAsMCwwLDUwLDAsMCwwLDUxLDAsMCwwLDUyLDAsMCwwLDIyLDAsMCwwLDI0OCwyNTUsMjU1LDI1NSw0MCw2MiwwLDAsNDYsMCwwLDAsNDcsMCwwLDAsNDgsMCwwLDAsNDksMCwwLDAsNTAsMCwwLDAsNTEsMCwwLDAsNTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzcsNzIsNTgsMzcsNzcsNTgsMzcsODMsMzcsMTA5LDQ3LDM3LDEwMCw0NywzNywxMjEsMzcsODksNDUsMzcsMTA5LDQ1LDM3LDEwMCwzNyw3Myw1OCwzNyw3Nyw1OCwzNyw4MywzMiwzNywxMTIsMCwwLDAsMCwwLDM3LDcyLDU4LDM3LDc3LDAsMCwwLDM3LDcyLDU4LDM3LDc3LDU4LDM3LDgzLDAsMCwwLDAsMjAwLDYyLDAsMCwxNTIsMCwwLDAsMTUzLDAsMCwwLDEzOSwwLDAsMCw1MywwLDAsMCw1MywwLDAsMCw1NCwwLDAsMCw1NSwwLDAsMCw1NiwwLDAsMCw1NywwLDAsMCwyMywwLDAsMCwyNDgsMjU1LDI1NSwyNTUsMjAwLDYyLDAsMCw1NCwwLDAsMCw1NSwwLDAsMCw1NiwwLDAsMCw1NywwLDAsMCw1OCwwLDAsMCw1OSwwLDAsMCw2MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNywwLDAsMCw3MiwwLDAsMCw1OCwwLDAsMCwzNywwLDAsMCw3NywwLDAsMCw1OCwwLDAsMCwzNywwLDAsMCw4MywwLDAsMCwzNywwLDAsMCwxMDksMCwwLDAsNDcsMCwwLDAsMzcsMCwwLDAsMTAwLDAsMCwwLDQ3LDAsMCwwLDM3LDAsMCwwLDEyMSwwLDAsMCwzNywwLDAsMCw4OSwwLDAsMCw0NSwwLDAsMCwzNywwLDAsMCwxMDksMCwwLDAsNDUsMCwwLDAsMzcsMCwwLDAsMTAwLDAsMCwwLDM3LDAsMCwwLDczLDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDc3LDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDgzLDAsMCwwLDMyLDAsMCwwLDM3LDAsMCwwLDExMiwwLDAsMCwwLDAsMCwwLDM3LDAsMCwwLDcyLDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDc3LDAsMCwwLDAsMCwwLDAsMzcsMCwwLDAsNzIsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsNzcsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsODMsMCwwLDAsMCwwLDAsMCw4OCw2MywwLDAsMTU0LDAsMCwwLDE1NSwwLDAsMCwxMzksMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTkyLDYzLDAsMCwxNTYsMCwwLDAsMTU3LDAsMCwwLDEzOSwwLDAsMCwyMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNzYsNjAsMCwwLDE1OCwwLDAsMCwxNTksMCwwLDAsMTM5LDAsMCwwLDYxLDAsMCwwLDYyLDAsMCwwLDM0LDAsMCwwLDM1LDAsMCwwLDM2LDAsMCwwLDM3LDAsMCwwLDYzLDAsMCwwLDM4LDAsMCwwLDM5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDI0MCw2MCwwLDAsMTYwLDAsMCwwLDE2MSwwLDAsMCwxMzksMCwwLDAsNjQsMCwwLDAsNjUsMCwwLDAsNDAsMCwwLDAsNDEsMCwwLDAsNDIsMCwwLDAsNDMsMCwwLDAsNjYsMCwwLDAsNDQsMCwwLDAsNDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNDgsNjEsMCwwLDE2MiwwLDAsMCwxNjMsMCwwLDAsMTM5LDAsMCwwLDY3LDAsMCwwLDY4LDAsMCwwLDQ2LDAsMCwwLDQ3LDAsMCwwLDQ4LDAsMCwwLDQ5LDAsMCwwLDY5LDAsMCwwLDUwLDAsMCwwLDUxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDExMiw2MSwwLDAsMTY0LDAsMCwwLDE2NSwwLDAsMCwxMzksMCwwLDAsNzAsMCwwLDAsNzEsMCwwLDAsNTIsMCwwLDAsNTMsMCwwLDAsNTQsMCwwLDAsNTUsMCwwLDAsNzIsMCwwLDAsNTYsMCwwLDAsNTcsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTQ0LDY3LDAsMCwxNjYsMCwwLDAsMTY3LDAsMCwwLDEzOSwwLDAsMCwyNCwwLDAsMCwyNSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1NywwLDAsMCwwLDAsMCwzNyw3NiwxMDIsMCwwLDAsMCwwLDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTAzLDEwMSwxMTYsMzIsMTAxLDExNCwxMTQsMTExLDExNCwwLDAsMCwwLDAsMzIsNjgsMCwwLDE2OCwwLDAsMCwxNjksMCwwLDAsMTM5LDAsMCwwLDI2LDAsMCwwLDI3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMTc2LDY4LDAsMCwxNzAsMCwwLDAsMTcxLDAsMCwwLDEzOSwwLDAsMCwyMiwwLDAsMCw1OCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNyw0Niw0OCw3NiwxMDIsMCwwLDAsMCwwLDAsMCw2NCw2OSwwLDAsMTcyLDAsMCwwLDE3MywwLDAsMCwxMzksMCwwLDAsMjMsMCwwLDAsNTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNCw2NCwwLDAsMTc0LDAsMCwwLDE3NSwwLDAsMCwxMzksMCwwLDAsMzQsMCwwLDAsMzMsMCwwLDAsNTgsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODAsNjQsMCwwLDE3NiwwLDAsMCwxNzcsMCwwLDAsMTM5LDAsMCwwLDM1LDAsMCwwLDM0LDAsMCwwLDU5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMTgsMTAxLDk5LDExNiwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDY3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNiw2MCwwLDAsMTc4LDAsMCwwLDE3OSwwLDAsMCwxMzksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyMzIsNTYsMCwwLDE4MCwwLDAsMCwxODEsMCwwLDAsMTM5LDAsMCwwLDQwLDAsMCwwLDM2LDAsMCwwLDQxLDAsMCwwLDM3LDAsMCwwLDQyLDAsMCwwLDIyLDAsMCwwLDM4LDAsMCwwLDI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIwMCw1NywwLDAsMTgyLDAsMCwwLDE4MywwLDAsMCwxMzksMCwwLDAsMjIsMCwwLDAsMjMsMCwwLDAsMjUsMCwwLDAsNzMsMCwwLDAsNzQsMCwwLDAsMjYsMCwwLDAsNzUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTkyLDU5LDAsMCwxODQsMCwwLDAsMTg1LDAsMCwwLDEzOSwwLDAsMCw3NiwwLDAsMCw3NywwLDAsMCw2MCwwLDAsMCw2MSwwLDAsMCw2MiwwLDAsMCwwLDAsMCwwLDIzMiw1OSwwLDAsMTg2LDAsMCwwLDE4NywwLDAsMCwxMzksMCwwLDAsNzgsMCwwLDAsNzksMCwwLDAsNjMsMCwwLDAsNjQsMCwwLDAsNjUsMCwwLDAsMTE2LDAsMCwwLDExNCwwLDAsMCwxMTcsMCwwLDAsMTAxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMDIsOTcsMTA4LDExNSwxMDEsMCwwLDAsMTAyLDAsMCwwLDk3LDAsMCwwLDEwOCwwLDAsMCwxMTUsMCwwLDAsMTAxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzcsMCwwLDAsMTA5LDAsMCwwLDQ3LDAsMCwwLDM3LDAsMCwwLDEwMCwwLDAsMCw0NywwLDAsMCwzNywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDM3LDAsMCwwLDcyLDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDc3LDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDgzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNyw5NywzMiwzNyw5OCwzMiwzNywxMDAsMzIsMzcsNzIsNTgsMzcsNzcsNTgsMzcsODMsMzIsMzcsODksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNywwLDAsMCw5NywwLDAsMCwzMiwwLDAsMCwzNywwLDAsMCw5OCwwLDAsMCwzMiwwLDAsMCwzNywwLDAsMCwxMDAsMCwwLDAsMzIsMCwwLDAsMzcsMCwwLDAsNzIsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsNzcsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsODMsMCwwLDAsMzIsMCwwLDAsMzcsMCwwLDAsODksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDM3LDczLDU4LDM3LDc3LDU4LDM3LDgzLDMyLDM3LDExMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzcsMCwwLDAsNzMsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsNzcsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsODMsMCwwLDAsMzIsMCwwLDAsMzcsMCwwLDAsMTEyLDAsMCwwLDAsMCwwLDAsMTA4LDExMSw5OSw5NywxMDgsMTAxLDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDAsMCwwLDAsMCwwLDAsMCwzMiw1NiwwLDAsMTg4LDAsMCwwLDE4OSwwLDAsMCwxMzksMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTQsMTA4LDExMSw5OSw5NywxMDgsMTAxLDUzLDEwMiw5Nyw5OSwxMDEsMTE2LDY5LDAsMCwwLDIyNCw4NSwwLDAsOCw1NiwwLDAsMTA0LDM4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMTc2LDU2LDAsMCwxODgsMCwwLDAsMTkwLDAsMCwwLDEzOSwwLDAsMCwzOSwwLDAsMCwyMywwLDAsMCwyNCwwLDAsMCwyNSwwLDAsMCw0MywwLDAsMCw0MCwwLDAsMCw0NCwwLDAsMCw0MSwwLDAsMCw0NSwwLDAsMCwyNiwwLDAsMCw0MiwwLDAsMCwyNywwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1Myw5OSwxMTYsMTIxLDExMiwxMDEsNzMsMTE5LDY5LDY5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDk5LDExNiwxMjEsMTEyLDEwMSw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMTIwLDg0LDAsMCwxNDQsNTYsMCwwLDY0LDg2LDAsMCwxMjAsNTYsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNTYsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUzLDk5LDExNiwxMjEsMTEyLDEwMSw3Myw5OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwyMDgsNTYsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNTYsMCwwLDIsMCwwLDAsMCwwLDAsMCwxMjgsNTcsMCwwLDE4OCwwLDAsMCwxOTEsMCwwLDAsMTM5LDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDI4LDAsMCwwLDgwLDAsMCwwLDgxLDAsMCwwLDI5LDAsMCwwLDgyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSw5OSwxMTEsMTAwLDEwMSw5OSwxMTgsMTE2LDczLDk5LDk5LDQ5LDQ5LDk1LDk1LDEwOSw5OCwxMTUsMTE2LDk3LDExNiwxMDEsOTUsMTE2LDY5LDY5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUwLDk5LDExMSwxMDAsMTAxLDk5LDExOCwxMTYsOTUsOTgsOTcsMTE1LDEwMSw2OSwwLDAsMTIwLDg0LDAsMCw5Niw1NywwLDAsNjQsODYsMCwwLDU2LDU3LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMTIwLDU3LDAsMCwyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSw5OSwxMTEsMTAwLDEwMSw5OSwxMTgsMTE2LDczLDExOSw5OSw0OSw0OSw5NSw5NSwxMDksOTgsMTE1LDExNiw5NywxMTYsMTAxLDk1LDExNiw2OSw2OSwwLDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwxNjAsNTcsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxMjAsNTcsMCwwLDIsMCwwLDAsMCwwLDAsMCw2NCw1OCwwLDAsMTg4LDAsMCwwLDE5MiwwLDAsMCwxMzksMCwwLDAsMjYsMCwwLDAsMjcsMCwwLDAsMzAsMCwwLDAsODMsMCwwLDAsODQsMCwwLDAsMzEsMCwwLDAsODUsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDk5LDExMSwxMDAsMTAxLDk5LDExOCwxMTYsNzMsNjgsMTE1LDk5LDQ5LDQ5LDk1LDk1LDEwOSw5OCwxMTUsMTE2LDk3LDExNiwxMDEsOTUsMTE2LDY5LDY5LDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwyNCw1OCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDEyMCw1NywwLDAsMiwwLDAsMCwwLDAsMCwwLDE4NCw1OCwwLDAsMTg4LDAsMCwwLDE5MywwLDAsMCwxMzksMCwwLDAsMjgsMCwwLDAsMjksMCwwLDAsMzIsMCwwLDAsODYsMCwwLDAsODcsMCwwLDAsMzMsMCwwLDAsODgsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDk5LDExMSwxMDAsMTAxLDk5LDExOCwxMTYsNzMsNjgsMTA1LDk5LDQ5LDQ5LDk1LDk1LDEwOSw5OCwxMTUsMTE2LDk3LDExNiwxMDEsOTUsMTE2LDY5LDY5LDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwxNDQsNTgsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxMjAsNTcsMCwwLDIsMCwwLDAsMCwwLDAsMCw0OCw1OSwwLDAsMTg4LDAsMCwwLDE5NCwwLDAsMCwxMzksMCwwLDAsMjgsMCwwLDAsMjksMCwwLDAsMzIsMCwwLDAsODYsMCwwLDAsODcsMCwwLDAsMzMsMCwwLDAsODgsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU0LDk1LDk1LDExMCw5NywxMTQsMTE0LDExMSwxMTksOTUsMTE2LDExMSw5NSwxMTcsMTE2LDEwMiw1Niw3Myw3NiwxMDYsNTEsNTAsNjksNjksNjksMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDgsNTksMCwwLDE4NCw1OCwwLDAsMCwwLDAsMCwwLDAsMCwwLDE1Miw1OSwwLDAsMTg4LDAsMCwwLDE5NSwwLDAsMCwxMzksMCwwLDAsMjgsMCwwLDAsMjksMCwwLDAsMzIsMCwwLDAsODYsMCwwLDAsODcsMCwwLDAsMzMsMCwwLDAsODgsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU1LDk1LDk1LDExOSwxMDUsMTAwLDEwMSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExNywxMTYsMTAyLDU2LDczLDc2LDEwNiw1MSw1MCw2OSw2OSw2OSwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDExMiw1OSwwLDAsMTg0LDU4LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMTAsMTE3LDEwOSwxMTIsMTE3LDExMCw5OSwxMTYsNzMsOTksNjksNjksMCwwLDAsMCwyMjQsODUsMCwwLDE2OCw1OSwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDExMCwxMTcsMTA5LDExMiwxMTcsMTEwLDk5LDExNiw3MywxMTksNjksNjksMCwwLDAsMCwyMjQsODUsMCwwLDIwOCw1OSwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU0LDEwOCwxMTEsOTksOTcsMTA4LDEwMSw1Myw5NSw5NSwxMDUsMTA5LDExMiw2OSwwLDAsMCwyMjQsODUsMCwwLDI0OCw1OSwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDk5LDExMSwxMDgsMTA4LDk3LDExNiwxMDEsNzMsOTksNjksNjksMCwwLDAsMCwwLDIyNCw4NSwwLDAsMzIsNjAsMCwwLDMyLDU2LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSw5OSwxMTEsMTA4LDEwOCw5NywxMTYsMTAxLDczLDExOSw2OSw2OSwwLDAsMCwwLDAsMjI0LDg1LDAsMCw3Miw2MCwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDEwOSwxMTEsMTEwLDEwMSwxMjEsMTEyLDExNywxMTAsOTksMTE2LDczLDk5LDc2LDk4LDQ4LDY5LDY5LDY5LDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNDgsMTA5LDExMSwxMTAsMTAxLDEyMSw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMTIwLDg0LDAsMCwxNDQsNjAsMCwwLDY0LDg2LDAsMCwxMTIsNjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNjAsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDEwOSwxMTEsMTEwLDEwMSwxMjEsMTEyLDExNywxMTAsOTksMTE2LDczLDk5LDc2LDk4LDQ5LDY5LDY5LDY5LDAsMCwwLDAsMCw2NCw4NiwwLDAsMjA4LDYwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMTY4LDYwLDAsMCwyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCwxMDksMTExLDExMCwxMDEsMTIxLDExMiwxMTcsMTEwLDk5LDExNiw3MywxMTksNzYsOTgsNDgsNjksNjksNjksMCwwLDAsMCwwLDY0LDg2LDAsMCwxNiw2MSwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDE2OCw2MCwwLDAsMiwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNDgsMTA5LDExMSwxMTAsMTAxLDEyMSwxMTIsMTE3LDExMCw5OSwxMTYsNzMsMTE5LDc2LDk4LDQ5LDY5LDY5LDY5LDAsMCwwLDAsMCw2NCw4NiwwLDAsODAsNjEsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNjAsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDExNiwxMDUsMTA5LDEwMSw5NSwxMDMsMTAxLDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsMTE2LDEwNSwxMDksMTAxLDk1LDk4LDk3LDExNSwxMDEsNjksMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwyMTYsNjEsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTYsMTA1LDEwOSwxMDEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTUsMTE1LDExNiwxMTEsMTE0LDk3LDEwMywxMDEsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDI0OCw2MSwwLDAsNjQsODYsMCwwLDE0NCw2MSwwLDAsMCwwLDAsMCwzLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDI0MCw2MSwwLDAsMiwwLDAsMCwzMiw2MiwwLDAsMCw4LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTYsMTE2LDEwNSwxMDksMTAxLDk1LDEwMywxMDEsMTE2LDczLDExOSw3OCw4Myw5NSw0OSw1NywxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3MywxMTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDExOSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTYsMTA1LDEwOSwxMDEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTUsMTE1LDExNiwxMTEsMTE0LDk3LDEwMywxMDEsNzMsMTE5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwxNTIsNjIsMCwwLDY0LDg2LDAsMCw4MCw2MiwwLDAsMCwwLDAsMCwzLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDI0MCw2MSwwLDAsMiwwLDAsMCwxOTIsNjIsMCwwLDAsOCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDExNiwxMDUsMTA5LDEwMSw5NSwxMTIsMTE3LDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNDgsOTUsOTUsMTE2LDEwNSwxMDksMTAxLDk1LDExMiwxMTcsMTE2LDY5LDAsMCwwLDAsMTIwLDg0LDAsMCw1Niw2MywwLDAsNjQsODYsMCwwLDI0MCw2MiwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDgwLDYzLDAsMCwwLDgsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMTYsMTA1LDEwOSwxMDEsOTUsMTEyLDExNywxMTYsNzMsMTE5LDc4LDgzLDk1LDQ5LDU3LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsNjQsODYsMCwwLDEyMCw2MywwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDgwLDYzLDAsMCwwLDgsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTUsNzMsOTksNjksNjksMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTEsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMTE1LDk1LDk4LDk3LDExNSwxMDEsNjksMCwxMjAsODQsMCwwLDI0OCw2MywwLDAsNjQsODYsMCwwLDIyNCw2MywwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDE2LDY0LDAsMCwyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTUsNzMsMTE5LDY5LDY5LDAsMCwwLDAsNjQsODYsMCwwLDU2LDY0LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMTYsNjQsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDExMCwxMTcsMTA5LDk1LDEwMywxMDEsMTE2LDczLDk5LDc4LDgzLDk1LDQ5LDU3LDEwNSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk1LDk1LDExMCwxMTcsMTA5LDk1LDEwMywxMDEsMTE2LDczLDk5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Miw5NSw5NSwxMTAsMTE3LDEwOSw5NSwxMDMsMTAxLDExNiw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDIwOCw2NCwwLDAsNjQsODYsMCwwLDE4NCw2NCwwLDAsMCwwLDAsMCwxLDAsMCwwLDI0MCw2NCwwLDAsMCwwLDAsMCw2NCw4NiwwLDAsMTEyLDY0LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMjQ4LDY0LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSwxMTAsMTE3LDEwOSw5NSwxMDMsMTAxLDExNiw3MywxMTksNzgsODMsOTUsNDksNTcsMTA1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTgsMTE3LDEwMiw5NSwxMDUsMTE2LDEwMSwxMTQsOTcsMTE2LDExMSwxMTQsNzMsMTE5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3MywxMTksNjksNjksNjksNjksNjksNjksMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1Nyw5NSw5NSwxMTAsMTE3LDEwOSw5NSwxMDMsMTAxLDExNiw3MywxMTksNjksNjksMCwwLDAsNjQsODYsMCwwLDEyMCw2NSwwLDAsMCwwLDAsMCwxLDAsMCwwLDI0MCw2NCwwLDAsMCwwLDAsMCw2NCw4NiwwLDAsNDgsNjUsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNDQsNjUsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDk5LDc4LDgzLDk1LDQ5LDU3LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk1LDk1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDk5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Miw5NSw5NSwxMTAsMTE3LDEwOSw5NSwxMTIsMTE3LDExNiw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDQwLDY2LDAsMCw2NCw4NiwwLDAsMTYsNjYsMCwwLDAsMCwwLDAsMSwwLDAsMCw3Miw2NiwwLDAsMCwwLDAsMCw2NCw4NiwwLDAsMjAwLDY1LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsODAsNjYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDExOSw3OCw4Myw5NSw0OSw1NywxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3MywxMTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDExOSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk1LDk1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDExOSw2OSw2OSwwLDAsMCw2NCw4NiwwLDAsMjA4LDY2LDAsMCwwLDAsMCwwLDEsMCwwLDAsNzIsNjYsMCwwLDAsMCwwLDAsNjQsODYsMCwwLDEzNiw2NiwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDIzMiw2NiwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsMTA5LDExMSwxMTAsMTAxLDEyMSw5NSwxMDMsMTAxLDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTAzLDEwMSwxMTYsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsMTA0LDY3LDAsMCw2NCw4NiwwLDAsMzIsNjcsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxMzYsNjcsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTAzLDEwMSwxMTYsNzMsMTE5LDc4LDgzLDk1LDQ5LDU3LDEwNSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OSw5NSw5NSwxMDksMTExLDExMCwxMDEsMTIxLDk1LDEwMywxMDEsMTE2LDczLDExOSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwyNDgsNjcsMCwwLDY0LDg2LDAsMCwxNzYsNjcsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwyNCw2OCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsMTA5LDExMSwxMTAsMTAxLDEyMSw5NSwxMTIsMTE3LDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTEyLDExNywxMTYsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsMTM2LDY4LDAsMCw2NCw4NiwwLDAsNjQsNjgsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNjgsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTEyLDExNywxMTYsNzMsMTE5LDc4LDgzLDk1LDQ5LDU3LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OSw5NSw5NSwxMDksMTExLDExMCwxMDEsMTIxLDk1LDExMiwxMTcsMTE2LDczLDExOSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwyNCw2OSwwLDAsNjQsODYsMCwwLDIwOCw2OCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDU2LDY5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDY1LDAsMCwwLDc3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MCwwLDAsMCw3NywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDY1LDc3LDAsMCwwLDAsMCwwLDgwLDc3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3NCwwLDAsMCw5NywwLDAsMCwxMTAsMCwwLDAsMTE3LDAsMCwwLDk3LDAsMCwwLDExNCwwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCw3MCwwLDAsMCwxMDEsMCwwLDAsOTgsMCwwLDAsMTE0LDAsMCwwLDExNywwLDAsMCw5NywwLDAsMCwxMTQsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3NywwLDAsMCw5NywwLDAsMCwxMTQsMCwwLDAsOTksMCwwLDAsMTA0LDAsMCwwLDAsMCwwLDAsNjUsMCwwLDAsMTEyLDAsMCwwLDExNCwwLDAsMCwxMDUsMCwwLDAsMTA4LDAsMCwwLDAsMCwwLDAsNzQsMCwwLDAsMTE3LDAsMCwwLDExMCwwLDAsMCwxMDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDc0LDAsMCwwLDExNywwLDAsMCwxMDgsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw2NSwwLDAsMCwxMTcsMCwwLDAsMTAzLDAsMCwwLDExNywwLDAsMCwxMTUsMCwwLDAsMTE2LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCwxMDEsMCwwLDAsMTEyLDAsMCwwLDExNiwwLDAsMCwxMDEsMCwwLDAsMTA5LDAsMCwwLDk4LDAsMCwwLDEwMSwwLDAsMCwxMTQsMCwwLDAsMCwwLDAsMCw3OSwwLDAsMCw5OSwwLDAsMCwxMTYsMCwwLDAsMTExLDAsMCwwLDk4LDAsMCwwLDEwMSwwLDAsMCwxMTQsMCwwLDAsMCwwLDAsMCw3OCwwLDAsMCwxMTEsMCwwLDAsMTE4LDAsMCwwLDEwMSwwLDAsMCwxMDksMCwwLDAsOTgsMCwwLDAsMTAxLDAsMCwwLDExNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNjgsMCwwLDAsMTAxLDAsMCwwLDk5LDAsMCwwLDEwMSwwLDAsMCwxMDksMCwwLDAsOTgsMCwwLDAsMTAxLDAsMCwwLDExNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzQsMCwwLDAsOTcsMCwwLDAsMTEwLDAsMCwwLDAsMCwwLDAsNzAsMCwwLDAsMTAxLDAsMCwwLDk4LDAsMCwwLDAsMCwwLDAsNzcsMCwwLDAsOTcsMCwwLDAsMTE0LDAsMCwwLDAsMCwwLDAsNjVdLCJpOCIsQUxMT0NfTk9ORSxSdW50aW1lLkdMT0JBTF9CQVNFKzkzMjQpO2FsbG9jYXRlKFsxMTIsMCwwLDAsMTE0LDAsMCwwLDAsMCwwLDAsNzcsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsNzQsMCwwLDAsMTE3LDAsMCwwLDExMCwwLDAsMCwwLDAsMCwwLDc0LDAsMCwwLDExNywwLDAsMCwxMDgsMCwwLDAsMCwwLDAsMCw2NSwwLDAsMCwxMTcsMCwwLDAsMTAzLDAsMCwwLDAsMCwwLDAsODMsMCwwLDAsMTAxLDAsMCwwLDExMiwwLDAsMCwwLDAsMCwwLDc5LDAsMCwwLDk5LDAsMCwwLDExNiwwLDAsMCwwLDAsMCwwLDc4LDAsMCwwLDExMSwwLDAsMCwxMTgsMCwwLDAsMCwwLDAsMCw2OCwwLDAsMCwxMDEsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzQsOTcsMTEwLDExNyw5NywxMTQsMTIxLDAsNzAsMTAxLDk4LDExNCwxMTcsOTcsMTE0LDEyMSwwLDAsMCwwLDAsMCwwLDAsNzcsOTcsMTE0LDk5LDEwNCwwLDAsMCw2NSwxMTIsMTE0LDEwNSwxMDgsMCwwLDAsNzcsOTcsMTIxLDAsMCwwLDAsMCw3NCwxMTcsMTEwLDEwMSwwLDAsMCwwLDc0LDExNywxMDgsMTIxLDAsMCwwLDAsNjUsMTE3LDEwMywxMTcsMTE1LDExNiwwLDAsODMsMTAxLDExMiwxMTYsMTAxLDEwOSw5OCwxMDEsMTE0LDAsMCwwLDAsMCwwLDAsNzksOTksMTE2LDExMSw5OCwxMDEsMTE0LDAsNzgsMTExLDExOCwxMDEsMTA5LDk4LDEwMSwxMTQsMCwwLDAsMCwwLDAsMCwwLDY4LDEwMSw5OSwxMDEsMTA5LDk4LDEwMSwxMTQsMCwwLDAsMCwwLDAsMCwwLDc0LDk3LDExMCwwLDAsMCwwLDAsNzAsMTAxLDk4LDAsMCwwLDAsMCw3Nyw5NywxMTQsMCwwLDAsMCwwLDY1LDExMiwxMTQsMCwwLDAsMCwwLDc0LDExNywxMTAsMCwwLDAsMCwwLDc0LDExNywxMDgsMCwwLDAsMCwwLDY1LDExNywxMDMsMCwwLDAsMCwwLDgzLDEwMSwxMTIsMCwwLDAsMCwwLDc5LDk5LDExNiwwLDAsMCwwLDAsNzgsMTExLDExOCwwLDAsMCwwLDAsNjgsMTAxLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODMsMCwwLDAsMTE3LDAsMCwwLDExMCwwLDAsMCwxMDAsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3NywwLDAsMCwxMTEsMCwwLDAsMTEwLDAsMCwwLDEwMCwwLDAsMCw5NywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDg0LDAsMCwwLDExNywwLDAsMCwxMDEsMCwwLDAsMTE1LDAsMCwwLDEwMCwwLDAsMCw5NywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCw4NywwLDAsMCwxMDEsMCwwLDAsMTAwLDAsMCwwLDExMCwwLDAsMCwxMDEsMCwwLDAsMTE1LDAsMCwwLDEwMCwwLDAsMCw5NywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCw4NCwwLDAsMCwxMDQsMCwwLDAsMTE3LDAsMCwwLDExNCwwLDAsMCwxMTUsMCwwLDAsMTAwLDAsMCwwLDk3LDAsMCwwLDEyMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzAsMCwwLDAsMTE0LDAsMCwwLDEwNSwwLDAsMCwxMDAsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCw5NywwLDAsMCwxMTYsMCwwLDAsMTE3LDAsMCwwLDExNCwwLDAsMCwxMDAsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCwxMTcsMCwwLDAsMTEwLDAsMCwwLDAsMCwwLDAsNzcsMCwwLDAsMTExLDAsMCwwLDExMCwwLDAsMCwwLDAsMCwwLDg0LDAsMCwwLDExNywwLDAsMCwxMDEsMCwwLDAsMCwwLDAsMCw4NywwLDAsMCwxMDEsMCwwLDAsMTAwLDAsMCwwLDAsMCwwLDAsODQsMCwwLDAsMTA0LDAsMCwwLDExNywwLDAsMCwwLDAsMCwwLDcwLDAsMCwwLDExNCwwLDAsMCwxMDUsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCw5NywwLDAsMCwxMTYsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODMsMTE3LDExMCwxMDAsOTcsMTIxLDAsMCw3NywxMTEsMTEwLDEwMCw5NywxMjEsMCwwLDg0LDExNywxMDEsMTE1LDEwMCw5NywxMjEsMCw4NywxMDEsMTAwLDExMCwxMDEsMTE1LDEwMCw5NywxMjEsMCwwLDAsMCwwLDAsMCw4NCwxMDQsMTE3LDExNCwxMTUsMTAwLDk3LDEyMSwwLDAsMCwwLDAsMCwwLDAsNzAsMTE0LDEwNSwxMDAsOTcsMTIxLDAsMCw4Myw5NywxMTYsMTE3LDExNCwxMDAsOTcsMTIxLDAsMCwwLDAsMCwwLDAsMCw4MywxMTcsMTEwLDAsMCwwLDAsMCw3NywxMTEsMTEwLDAsMCwwLDAsMCw4NCwxMTcsMTAxLDAsMCwwLDAsMCw4NywxMDEsMTAwLDAsMCwwLDAsMCw4NCwxMDQsMTE3LDAsMCwwLDAsMCw3MCwxMTQsMTA1LDAsMCwwLDAsMCw4Myw5NywxMTYsMCwwLDAsMCwwLDIsMCwwLDE5MiwzLDAsMCwxOTIsNCwwLDAsMTkyLDUsMCwwLDE5Miw2LDAsMCwxOTIsNywwLDAsMTkyLDgsMCwwLDE5Miw5LDAsMCwxOTIsMTAsMCwwLDE5MiwxMSwwLDAsMTkyLDEyLDAsMCwxOTIsMTMsMCwwLDE5MiwxNCwwLDAsMTkyLDE1LDAsMCwxOTIsMTYsMCwwLDE5MiwxNywwLDAsMTkyLDE4LDAsMCwxOTIsMTksMCwwLDE5MiwyMCwwLDAsMTkyLDIxLDAsMCwxOTIsMjIsMCwwLDE5MiwyMywwLDAsMTkyLDI0LDAsMCwxOTIsMjUsMCwwLDE5MiwyNiwwLDAsMTkyLDI3LDAsMCwxOTIsMjgsMCwwLDE5MiwyOSwwLDAsMTkyLDMwLDAsMCwxOTIsMzEsMCwwLDE5MiwwLDAsMCwxNzksMSwwLDAsMTk1LDIsMCwwLDE5NSwzLDAsMCwxOTUsNCwwLDAsMTk1LDUsMCwwLDE5NSw2LDAsMCwxOTUsNywwLDAsMTk1LDgsMCwwLDE5NSw5LDAsMCwxOTUsMTAsMCwwLDE5NSwxMSwwLDAsMTk1LDEyLDAsMCwxOTUsMTMsMCwwLDIxMSwxNCwwLDAsMTk1LDE1LDAsMCwxOTUsMCwwLDEyLDE4NywxLDAsMTIsMTk1LDIsMCwxMiwxOTUsMywwLDEyLDE5NSw0LDAsMTIsMjExLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEyOCw4MywwLDAsMTk2LDAsMCwwLDE5NywwLDAsMCw4OSwwLDAsMCwwLDAsMCwwLDExNSwxMTYsMTAwLDU4LDU4LDk4LDk3LDEwMCw5NSw5OSw5NywxMTUsMTE2LDAsMCwwLDgzLDExNiw1NywxMTYsMTIxLDExMiwxMDEsOTUsMTA1LDExMCwxMDIsMTExLDAsMCwwLDAsMTIwLDg0LDAsMCw4OCw4MywwLDAsODMsMTE2LDU2LDk4LDk3LDEwMCw5NSw5OSw5NywxMTUsMTE2LDAsMCwwLDAsMCwyMjQsODUsMCwwLDExMiw4MywwLDAsMCwwLDAsMCwwLDAsMCwwLDc4LDQ5LDQ4LDk1LDk1LDk5LDEyMCwxMjAsOTcsOTgsMTA1LDExOCw0OSw0OSw1NCw5NSw5NSwxMTUsMTA0LDEwNSwxMDksOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxNDQsODMsMCwwLDEwNCw4MywwLDAsMCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNDksNTUsOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMjAwLDgzLDAsMCwxODQsODMsMCwwLDAsMCwwLDAsNzgsNDksNDgsOTUsOTUsOTksMTIwLDEyMCw5Nyw5OCwxMDUsMTE4LDQ5LDQ5LDU3LDk1LDk1LDExMiwxMTEsMTA1LDExMCwxMTYsMTAxLDExNCw5NSwxMTYsMTIxLDExMiwxMDEsOTUsMTA1LDExMCwxMDIsMTExLDY5LDAsMCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNDksNTUsOTUsOTUsMTEyLDk4LDk3LDExNSwxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsNDAsODQsMCwwLDE4NCw4MywwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDAsODQsMCwwLDgwLDg0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMjQwLDgzLDAsMCwxOTgsMCwwLDAsMTk5LDAsMCwwLDIwMCwwLDAsMCwyMDEsMCwwLDAsNDMsMCwwLDAsMzUsMCwwLDAsMjIsMCwwLDAsMjcsMCwwLDAsMCwwLDAsMCw5Niw4NCwwLDAsMTk4LDAsMCwwLDIwMiwwLDAsMCwyMDAsMCwwLDAsMjAxLDAsMCwwLDQ0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDg1LDAsMCwxOTgsMCwwLDAsMjAzLDAsMCwwLDIwMCwwLDAsMCwyMDEsMCwwLDAsNDUsMCwwLDAsMCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNTAsNTEsOTUsOTUsMTAyLDExNywxMTAsMTAwLDk3LDEwOSwxMDEsMTEwLDExNiw5NywxMDgsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDIyNCw4NSwwLDAsMjE2LDg0LDAsMCwxODQsODMsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCwxMTIsMTcsMCwwLDY4LDExMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDI0LDg1LDAsMCw5OCwwLDAsMCwwLDAsMCwwLDE5Miw4NCwwLDAsNDAsODUsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCw1Niw4NSwwLDAsMTA0LDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCw3Miw4NSwwLDAsOTcsMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDg4LDg1LDAsMCwxOTIsODQsMCwwLDEyOCwxNywwLDAsMTkyLDg0LDAsMCwxMjAsMTcsMCwwLDEwNSwwLDAsMCwwLDAsMCwwLDE5Miw4NCwwLDAsMTIwLDg1LDAsMCwxMDYsMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDEzNiw4NSwwLDAsMTA4LDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCwxNTIsODUsMCwwLDEwOSwwLDAsMCwwLDAsMCwwLDE5Miw4NCwwLDAsMTY4LDg1LDAsMCwxMDIsMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDE4NCw4NSwwLDAsMTAwLDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCwyMDAsODUsMCwwLDAsMCwwLDAsNDAsODYsMCwwLDE5OCwwLDAsMCwyMDQsMCwwLDAsMjAwLDAsMCwwLDIwMSwwLDAsMCw0MywwLDAsMCwzNiwwLDAsMCwyMywwLDAsMCwyOCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNTAsNDgsOTUsOTUsMTE1LDEwNSw5NSw5OSwxMDgsOTcsMTE1LDExNSw5NSwxMTYsMTIxLDExMiwxMDEsOTUsMTA1LDExMCwxMDIsMTExLDY5LDAsMCwwLDAsMjI0LDg1LDAsMCwwLDg2LDAsMCwyNDAsODMsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMzYsODYsMCwwLDE5OCwwLDAsMCwyMDUsMCwwLDAsMjAwLDAsMCwwLDIwMSwwLDAsMCw0MywwLDAsMCwzNywwLDAsMCwyNCwwLDAsMCwyOSwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNTAsNDksOTUsOTUsMTE4LDEwOSwxMDUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwyMjQsODUsMCwwLDk2LDg2LDAsMCwyNDAsODMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyMDAsODgsMCwwLDIwNiwwLDAsMCwyMDcsMCwwLDAsOTAsMCwwLDAsMCwwLDAsMCwxMTUsMTE2LDEwMCw1OCw1OCw5OCw5NywxMDAsOTUsOTcsMTA4LDEwOCwxMTEsOTksMCwwLDgzLDExNiw1Nyw5OCw5NywxMDAsOTUsOTcsMTA4LDEwOCwxMTEsOTksMCwwLDAsMCwyMjQsODUsMCwwLDE4NCw4OCwwLDAsMCwwLDAsMCwwLDAsMCwwLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwwLDEsMiwzLDQsNSw2LDcsOCw5LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMCwwLDAsMCwwLDAsMCwwLDEsMiw0LDcsMyw2LDUsMCwwLDAsMCwwLDAsMCwwLDEwNSwxMTAsMTAyLDEwNSwxMTAsMTA1LDExNiwxMjEsMCwwLDAsMCwwLDAsMCwwLDExMCw5NywxMTAsMCwwLDAsMCwwLDk1LDExMiwxMzcsMCwyNTUsOSw0NywxNSwxMCwwLDAsMCwxMDAsMCwwLDAsMjMyLDMsMCwwLDE2LDM5LDAsMCwxNjAsMTM0LDEsMCw2NCw2NiwxNSwwLDEyOCwxNTAsMTUyLDAsMCwyMjUsMjQ1LDVdLCJpOCIsQUxMT0NfTk9ORSxSdW50aW1lLkdMT0JBTF9CQVNFKzE5NTY0KTt2YXIgdGVtcERvdWJsZVB0cj1SdW50aW1lLmFsaWduTWVtb3J5KGFsbG9jYXRlKDEyLCJpOCIsQUxMT0NfU1RBVElDKSw4KTthc3NlcnQodGVtcERvdWJsZVB0ciU4PT0wKTtmdW5jdGlvbiBjb3B5VGVtcEZsb2F0KHB0cil7SEVBUDhbdGVtcERvdWJsZVB0cl09SEVBUDhbcHRyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzFdPUhFQVA4W3B0cisxXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzJdPUhFQVA4W3B0cisyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzNdPUhFQVA4W3B0ciszXX1mdW5jdGlvbiBjb3B5VGVtcERvdWJsZShwdHIpe0hFQVA4W3RlbXBEb3VibGVQdHJdPUhFQVA4W3B0cl07SEVBUDhbdGVtcERvdWJsZVB0cisxXT1IRUFQOFtwdHIrMV07SEVBUDhbdGVtcERvdWJsZVB0cisyXT1IRUFQOFtwdHIrMl07SEVBUDhbdGVtcERvdWJsZVB0ciszXT1IRUFQOFtwdHIrM107SEVBUDhbdGVtcERvdWJsZVB0cis0XT1IRUFQOFtwdHIrNF07SEVBUDhbdGVtcERvdWJsZVB0cis1XT1IRUFQOFtwdHIrNV07SEVBUDhbdGVtcERvdWJsZVB0cis2XT1IRUFQOFtwdHIrNl07SEVBUDhbdGVtcERvdWJsZVB0cis3XT1IRUFQOFtwdHIrN119ZnVuY3Rpb24gX2F0ZXhpdChmdW5jLGFyZyl7X19BVEVYSVRfXy51bnNoaWZ0KHtmdW5jOmZ1bmMsYXJnOmFyZ30pfXZhciBfX19jeGFfYXRleGl0PV9hdGV4aXQ7TW9kdWxlWyJfaTY0U3VidHJhY3QiXT1faTY0U3VidHJhY3Q7TW9kdWxlWyJfaTY0QWRkIl09X2k2NEFkZDtmdW5jdGlvbiBfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udigpe3JldHVybiEhX19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYudW5jYXVnaHRfZXhjZXB0aW9ufWZ1bmN0aW9uIF9fX2N4YV9pc19udW1iZXJfdHlwZSh0eXBlKXt2YXIgaXNOdW1iZXI9ZmFsc2U7dHJ5e2lmKHR5cGU9PV9fWlRJaSlpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVElqKWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSWwpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJbSlpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVEl4KWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSXkpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJZilpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVElkKWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSWUpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJYylpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVElhKWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSWgpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJcylpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVEl0KWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXJldHVybiBpc051bWJlcn1mdW5jdGlvbiBfX19jeGFfZG9lc19pbmhlcml0KGRlZmluaXRlVHlwZSxwb3NzaWJpbGl0eVR5cGUscG9zc2liaWxpdHkpe2lmKHBvc3NpYmlsaXR5PT0wKXJldHVybiBmYWxzZTtpZihwb3NzaWJpbGl0eVR5cGU9PTB8fHBvc3NpYmlsaXR5VHlwZT09ZGVmaW5pdGVUeXBlKXJldHVybiB0cnVlO3ZhciBwb3NzaWJpbGl0eV90eXBlX2luZm87aWYoX19fY3hhX2lzX251bWJlcl90eXBlKHBvc3NpYmlsaXR5VHlwZSkpe3Bvc3NpYmlsaXR5X3R5cGVfaW5mbz1wb3NzaWJpbGl0eVR5cGV9ZWxzZXt2YXIgcG9zc2liaWxpdHlfdHlwZV9pbmZvQWRkcj1IRUFQMzJbcG9zc2liaWxpdHlUeXBlPj4yXS04O3Bvc3NpYmlsaXR5X3R5cGVfaW5mbz1IRUFQMzJbcG9zc2liaWxpdHlfdHlwZV9pbmZvQWRkcj4+Ml19c3dpdGNoKHBvc3NpYmlsaXR5X3R5cGVfaW5mbyl7Y2FzZSAwOnZhciBkZWZpbml0ZV90eXBlX2luZm9BZGRyPUhFQVAzMltkZWZpbml0ZVR5cGU+PjJdLTg7dmFyIGRlZmluaXRlX3R5cGVfaW5mbz1IRUFQMzJbZGVmaW5pdGVfdHlwZV9pbmZvQWRkcj4+Ml07aWYoZGVmaW5pdGVfdHlwZV9pbmZvPT0wKXt2YXIgZGVmUG9pbnRlckJhc2VBZGRyPWRlZmluaXRlVHlwZSs4O3ZhciBkZWZQb2ludGVyQmFzZVR5cGU9SEVBUDMyW2RlZlBvaW50ZXJCYXNlQWRkcj4+Ml07dmFyIHBvc3NQb2ludGVyQmFzZUFkZHI9cG9zc2liaWxpdHlUeXBlKzg7dmFyIHBvc3NQb2ludGVyQmFzZVR5cGU9SEVBUDMyW3Bvc3NQb2ludGVyQmFzZUFkZHI+PjJdO3JldHVybiBfX19jeGFfZG9lc19pbmhlcml0KGRlZlBvaW50ZXJCYXNlVHlwZSxwb3NzUG9pbnRlckJhc2VUeXBlLHBvc3NpYmlsaXR5KX1lbHNlIHJldHVybiBmYWxzZTtjYXNlIDE6cmV0dXJuIGZhbHNlO2Nhc2UgMjp2YXIgcGFyZW50VHlwZUFkZHI9cG9zc2liaWxpdHlUeXBlKzg7dmFyIHBhcmVudFR5cGU9SEVBUDMyW3BhcmVudFR5cGVBZGRyPj4yXTtyZXR1cm4gX19fY3hhX2RvZXNfaW5oZXJpdChkZWZpbml0ZVR5cGUscGFyZW50VHlwZSxwb3NzaWJpbGl0eSk7ZGVmYXVsdDpyZXR1cm4gZmFsc2V9fXZhciBfX19jeGFfbGFzdF90aHJvd25fZXhjZXB0aW9uPTA7ZnVuY3Rpb24gX19fcmVzdW1lRXhjZXB0aW9uKHB0cil7TW9kdWxlLnByaW50KCJSZXN1bWluZyBleGNlcHRpb24iKTtpZighX19fY3hhX2xhc3RfdGhyb3duX2V4Y2VwdGlvbil7X19fY3hhX2xhc3RfdGhyb3duX2V4Y2VwdGlvbj1wdHJ9dGhyb3cgcHRyfXZhciBfX19jeGFfZXhjZXB0aW9uX2hlYWRlcl9zaXplPTg7ZnVuY3Rpb24gX19fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2godGhyb3duLHRocm93bnR5cGUpe2lmKHRocm93bj09LTEpdGhyb3duPV9fX2N4YV9sYXN0X3Rocm93bl9leGNlcHRpb247aGVhZGVyPXRocm93bi1fX19jeGFfZXhjZXB0aW9uX2hlYWRlcl9zaXplO2lmKHRocm93bnR5cGU9PS0xKXRocm93bnR5cGU9SEVBUDMyW2hlYWRlcj4+Ml07dmFyIHR5cGVBcnJheT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7aWYodGhyb3dudHlwZSE9MCYmIV9fX2N4YV9pc19udW1iZXJfdHlwZSh0aHJvd250eXBlKSl7dmFyIHRocm93bnR5cGVJbmZvQWRkcj1IRUFQMzJbdGhyb3dudHlwZT4+Ml0tODt2YXIgdGhyb3dudHlwZUluZm89SEVBUDMyW3Rocm93bnR5cGVJbmZvQWRkcj4+Ml07aWYodGhyb3dudHlwZUluZm89PTApdGhyb3duPUhFQVAzMlt0aHJvd24+PjJdfWZvcih2YXIgaT0wO2k8dHlwZUFycmF5Lmxlbmd0aDtpKyspe2lmKF9fX2N4YV9kb2VzX2luaGVyaXQodHlwZUFycmF5W2ldLHRocm93bnR5cGUsdGhyb3duKSlyZXR1cm4oYXNtWyJzZXRUZW1wUmV0MCJdKHR5cGVBcnJheVtpXSksdGhyb3duKXwwfXJldHVybihhc21bInNldFRlbXBSZXQwIl0odGhyb3dudHlwZSksdGhyb3duKXwwfWZ1bmN0aW9uIF9fX2N4YV90aHJvdyhwdHIsdHlwZSxkZXN0cnVjdG9yKXtpZighX19fY3hhX3Rocm93LmluaXRpYWxpemVkKXt0cnl7SEVBUDMyW19fWlRWTjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0U+PjJdPTB9Y2F0Y2goZSl7fXRyeXtIRUFQMzJbX19aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0U+PjJdPTF9Y2F0Y2goZSl7fXRyeXtIRUFQMzJbX19aVFZOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0U+PjJdPTJ9Y2F0Y2goZSl7fV9fX2N4YV90aHJvdy5pbml0aWFsaXplZD10cnVlfU1vZHVsZS5wcmludEVycigiQ29tcGlsZWQgY29kZSB0aHJvd2luZyBhbiBleGNlcHRpb24sICIrW3B0cix0eXBlLGRlc3RydWN0b3JdKyIsIGF0ICIrc3RhY2tUcmFjZSgpKTt2YXIgaGVhZGVyPXB0ci1fX19jeGFfZXhjZXB0aW9uX2hlYWRlcl9zaXplO0hFQVAzMltoZWFkZXI+PjJdPXR5cGU7SEVBUDMyW2hlYWRlcis0Pj4yXT1kZXN0cnVjdG9yO19fX2N4YV9sYXN0X3Rocm93bl9leGNlcHRpb249cHRyO2lmKCEoInVuY2F1Z2h0X2V4Y2VwdGlvbiJpbiBfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udikpe19fWlN0MTh1bmNhdWdodF9leGNlcHRpb252LnVuY2F1Z2h0X2V4Y2VwdGlvbj0xfWVsc2V7X19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYudW5jYXVnaHRfZXhjZXB0aW9uKyt9dGhyb3cgcHRyfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Jvb2woKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfYm9vbCIpO2Fib3J0KC0xKX1mdW5jdGlvbiBfcHRocmVhZF9tdXRleF9sb2NrKCl7fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcoKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfc3RkX3N0cmluZyIpO2Fib3J0KC0xKX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZygpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZyIpO2Fib3J0KC0xKX12YXIgRVJSTk9fQ09ERVM9e0VQRVJNOjEsRU5PRU5UOjIsRVNSQ0g6MyxFSU5UUjo0LEVJTzo1LEVOWElPOjYsRTJCSUc6NyxFTk9FWEVDOjgsRUJBREY6OSxFQ0hJTEQ6MTAsRUFHQUlOOjExLEVXT1VMREJMT0NLOjExLEVOT01FTToxMixFQUNDRVM6MTMsRUZBVUxUOjE0LEVOT1RCTEs6MTUsRUJVU1k6MTYsRUVYSVNUOjE3LEVYREVWOjE4LEVOT0RFVjoxOSxFTk9URElSOjIwLEVJU0RJUjoyMSxFSU5WQUw6MjIsRU5GSUxFOjIzLEVNRklMRToyNCxFTk9UVFk6MjUsRVRYVEJTWToyNixFRkJJRzoyNyxFTk9TUEM6MjgsRVNQSVBFOjI5LEVST0ZTOjMwLEVNTElOSzozMSxFUElQRTozMixFRE9NOjMzLEVSQU5HRTozNCxFTk9NU0c6NDIsRUlEUk06NDMsRUNIUk5HOjQ0LEVMMk5TWU5DOjQ1LEVMM0hMVDo0NixFTDNSU1Q6NDcsRUxOUk5HOjQ4LEVVTkFUQ0g6NDksRU5PQ1NJOjUwLEVMMkhMVDo1MSxFREVBRExLOjM1LEVOT0xDSzozNyxFQkFERTo1MixFQkFEUjo1MyxFWEZVTEw6NTQsRU5PQU5POjU1LEVCQURSUUM6NTYsRUJBRFNMVDo1NyxFREVBRExPQ0s6MzUsRUJGT05UOjU5LEVOT1NUUjo2MCxFTk9EQVRBOjYxLEVUSU1FOjYyLEVOT1NSOjYzLEVOT05FVDo2NCxFTk9QS0c6NjUsRVJFTU9URTo2NixFTk9MSU5LOjY3LEVBRFY6NjgsRVNSTU5UOjY5LEVDT01NOjcwLEVQUk9UTzo3MSxFTVVMVElIT1A6NzIsRURPVERPVDo3MyxFQkFETVNHOjc0LEVOT1RVTklROjc2LEVCQURGRDo3NyxFUkVNQ0hHOjc4LEVMSUJBQ0M6NzksRUxJQkJBRDo4MCxFTElCU0NOOjgxLEVMSUJNQVg6ODIsRUxJQkVYRUM6ODMsRU5PU1lTOjM4LEVOT1RFTVBUWTozOSxFTkFNRVRPT0xPTkc6MzYsRUxPT1A6NDAsRU9QTk9UU1VQUDo5NSxFUEZOT1NVUFBPUlQ6OTYsRUNPTk5SRVNFVDoxMDQsRU5PQlVGUzoxMDUsRUFGTk9TVVBQT1JUOjk3LEVQUk9UT1RZUEU6OTEsRU5PVFNPQ0s6ODgsRU5PUFJPVE9PUFQ6OTIsRVNIVVRET1dOOjEwOCxFQ09OTlJFRlVTRUQ6MTExLEVBRERSSU5VU0U6OTgsRUNPTk5BQk9SVEVEOjEwMyxFTkVUVU5SRUFDSDoxMDEsRU5FVERPV046MTAwLEVUSU1FRE9VVDoxMTAsRUhPU1RET1dOOjExMixFSE9TVFVOUkVBQ0g6MTEzLEVJTlBST0dSRVNTOjExNSxFQUxSRUFEWToxMTQsRURFU1RBRERSUkVROjg5LEVNU0dTSVpFOjkwLEVQUk9UT05PU1VQUE9SVDo5MyxFU09DS1ROT1NVUFBPUlQ6OTQsRUFERFJOT1RBVkFJTDo5OSxFTkVUUkVTRVQ6MTAyLEVJU0NPTk46MTA2LEVOT1RDT05OOjEwNyxFVE9PTUFOWVJFRlM6MTA5LEVVU0VSUzo4NyxFRFFVT1Q6MTIyLEVTVEFMRToxMTYsRU5PVFNVUDo5NSxFTk9NRURJVU06MTIzLEVJTFNFUTo4NCxFT1ZFUkZMT1c6NzUsRUNBTkNFTEVEOjEyNSxFTk9UUkVDT1ZFUkFCTEU6MTMxLEVPV05FUkRFQUQ6MTMwLEVTVFJQSVBFOjg2fTt2YXIgRVJSTk9fTUVTU0FHRVM9ezA6IlN1Y2Nlc3MiLDE6Ik5vdCBzdXBlci11c2VyIiwyOiJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiwzOiJObyBzdWNoIHByb2Nlc3MiLDQ6IkludGVycnVwdGVkIHN5c3RlbSBjYWxsIiw1OiJJL08gZXJyb3IiLDY6Ik5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiLDc6IkFyZyBsaXN0IHRvbyBsb25nIiw4OiJFeGVjIGZvcm1hdCBlcnJvciIsOToiQmFkIGZpbGUgbnVtYmVyIiwxMDoiTm8gY2hpbGRyZW4iLDExOiJObyBtb3JlIHByb2Nlc3NlcyIsMTI6Ik5vdCBlbm91Z2ggY29yZSIsMTM6IlBlcm1pc3Npb24gZGVuaWVkIiwxNDoiQmFkIGFkZHJlc3MiLDE1OiJCbG9jayBkZXZpY2UgcmVxdWlyZWQiLDE2OiJNb3VudCBkZXZpY2UgYnVzeSIsMTc6IkZpbGUgZXhpc3RzIiwxODoiQ3Jvc3MtZGV2aWNlIGxpbmsiLDE5OiJObyBzdWNoIGRldmljZSIsMjA6Ik5vdCBhIGRpcmVjdG9yeSIsMjE6IklzIGEgZGlyZWN0b3J5IiwyMjoiSW52YWxpZCBhcmd1bWVudCIsMjM6IlRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtIiwyNDoiVG9vIG1hbnkgb3BlbiBmaWxlcyIsMjU6Ik5vdCBhIHR5cGV3cml0ZXIiLDI2OiJUZXh0IGZpbGUgYnVzeSIsMjc6IkZpbGUgdG9vIGxhcmdlIiwyODoiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiLDI5OiJJbGxlZ2FsIHNlZWsiLDMwOiJSZWFkIG9ubHkgZmlsZSBzeXN0ZW0iLDMxOiJUb28gbWFueSBsaW5rcyIsMzI6IkJyb2tlbiBwaXBlIiwzMzoiTWF0aCBhcmcgb3V0IG9mIGRvbWFpbiBvZiBmdW5jIiwzNDoiTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUiLDM1OiJGaWxlIGxvY2tpbmcgZGVhZGxvY2sgZXJyb3IiLDM2OiJGaWxlIG9yIHBhdGggbmFtZSB0b28gbG9uZyIsMzc6Ik5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUiLDM4OiJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiLDM5OiJEaXJlY3Rvcnkgbm90IGVtcHR5Iiw0MDoiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MiLDQyOiJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSIsNDM6IklkZW50aWZpZXIgcmVtb3ZlZCIsNDQ6IkNoYW5uZWwgbnVtYmVyIG91dCBvZiByYW5nZSIsNDU6IkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIsNDY6IkxldmVsIDMgaGFsdGVkIiw0NzoiTGV2ZWwgMyByZXNldCIsNDg6IkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZSIsNDk6IlByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQiLDUwOiJObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSIsNTE6IkxldmVsIDIgaGFsdGVkIiw1MjoiSW52YWxpZCBleGNoYW5nZSIsNTM6IkludmFsaWQgcmVxdWVzdCBkZXNjcmlwdG9yIiw1NDoiRXhjaGFuZ2UgZnVsbCIsNTU6Ik5vIGFub2RlIiw1NjoiSW52YWxpZCByZXF1ZXN0IGNvZGUiLDU3OiJJbnZhbGlkIHNsb3QiLDU5OiJCYWQgZm9udCBmaWxlIGZtdCIsNjA6IkRldmljZSBub3QgYSBzdHJlYW0iLDYxOiJObyBkYXRhIChmb3Igbm8gZGVsYXkgaW8pIiw2MjoiVGltZXIgZXhwaXJlZCIsNjM6Ik91dCBvZiBzdHJlYW1zIHJlc291cmNlcyIsNjQ6Ik1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIiw2NToiUGFja2FnZSBub3QgaW5zdGFsbGVkIiw2NjoiVGhlIG9iamVjdCBpcyByZW1vdGUiLDY3OiJUaGUgbGluayBoYXMgYmVlbiBzZXZlcmVkIiw2ODoiQWR2ZXJ0aXNlIGVycm9yIiw2OToiU3Jtb3VudCBlcnJvciIsNzA6IkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIsNzE6IlByb3RvY29sIGVycm9yIiw3MjoiTXVsdGlob3AgYXR0ZW1wdGVkIiw3MzoiQ3Jvc3MgbW91bnQgcG9pbnQgKG5vdCByZWFsbHkgZXJyb3IpIiw3NDoiVHJ5aW5nIHRvIHJlYWQgdW5yZWFkYWJsZSBtZXNzYWdlIiw3NToiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIsNzY6IkdpdmVuIGxvZy4gbmFtZSBub3QgdW5pcXVlIiw3NzoiZi5kLiBpbnZhbGlkIGZvciB0aGlzIG9wZXJhdGlvbiIsNzg6IlJlbW90ZSBhZGRyZXNzIGNoYW5nZWQiLDc5OiJDYW4gICBhY2Nlc3MgYSBuZWVkZWQgc2hhcmVkIGxpYiIsODA6IkFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGliIiw4MToiLmxpYiBzZWN0aW9uIGluIGEub3V0IGNvcnJ1cHRlZCIsODI6IkF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBsaWJzIiw4MzoiQXR0ZW1wdGluZyB0byBleGVjIGEgc2hhcmVkIGxpYnJhcnkiLDg0OiJJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UiLDg2OiJTdHJlYW1zIHBpcGUgZXJyb3IiLDg3OiJUb28gbWFueSB1c2VycyIsODg6IlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIsODk6IkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiLDkwOiJNZXNzYWdlIHRvbyBsb25nIiw5MToiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Iiw5MjoiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIsOTM6IlVua25vd24gcHJvdG9jb2wiLDk0OiJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIiw5NToiTm90IHN1cHBvcnRlZCIsOTY6IlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIiw5NzoiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCBmYW1pbHkiLDk4OiJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIiw5OToiQWRkcmVzcyBub3QgYXZhaWxhYmxlIiwxMDA6Ik5ldHdvcmsgaW50ZXJmYWNlIGlzIG5vdCBjb25maWd1cmVkIiwxMDE6Ik5ldHdvcmsgaXMgdW5yZWFjaGFibGUiLDEwMjoiQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrIiwxMDM6IkNvbm5lY3Rpb24gYWJvcnRlZCIsMTA0OiJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiLDEwNToiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIsMTA2OiJTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiLDEwNzoiU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiLDEwODoiQ2FuJ3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24iLDEwOToiVG9vIG1hbnkgcmVmZXJlbmNlcyIsMTEwOiJDb25uZWN0aW9uIHRpbWVkIG91dCIsMTExOiJDb25uZWN0aW9uIHJlZnVzZWQiLDExMjoiSG9zdCBpcyBkb3duIiwxMTM6Ikhvc3QgaXMgdW5yZWFjaGFibGUiLDExNDoiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIiwxMTU6IkNvbm5lY3Rpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIsMTE2OiJTdGFsZSBmaWxlIGhhbmRsZSIsMTIyOiJRdW90YSBleGNlZWRlZCIsMTIzOiJObyBtZWRpdW0gKGluIHRhcGUgZHJpdmUpIiwxMjU6Ik9wZXJhdGlvbiBjYW5jZWxlZCIsMTMwOiJQcmV2aW91cyBvd25lciBkaWVkIiwxMzE6IlN0YXRlIG5vdCByZWNvdmVyYWJsZSJ9O3ZhciBfX19lcnJub19zdGF0ZT0wO2Z1bmN0aW9uIF9fX3NldEVyck5vKHZhbHVlKXtIRUFQMzJbX19fZXJybm9fc3RhdGU+PjJdPXZhbHVlO3JldHVybiB2YWx1ZX12YXIgUEFUSD17c3BsaXRQYXRoOihmdW5jdGlvbihmaWxlbmFtZSl7dmFyIHNwbGl0UGF0aFJlPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSl9KSxub3JtYWxpemVBcnJheTooZnVuY3Rpb24ocGFydHMsYWxsb3dBYm92ZVJvb3Qpe3ZhciB1cD0wO2Zvcih2YXIgaT1wYXJ0cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGxhc3Q9cGFydHNbaV07aWYobGFzdD09PSIuIil7cGFydHMuc3BsaWNlKGksMSl9ZWxzZSBpZihsYXN0PT09Ii4uIil7cGFydHMuc3BsaWNlKGksMSk7dXArK31lbHNlIGlmKHVwKXtwYXJ0cy5zcGxpY2UoaSwxKTt1cC0tfX1pZihhbGxvd0Fib3ZlUm9vdCl7Zm9yKDt1cC0tO3VwKXtwYXJ0cy51bnNoaWZ0KCIuLiIpfX1yZXR1cm4gcGFydHN9KSxub3JtYWxpemU6KGZ1bmN0aW9uKHBhdGgpe3ZhciBpc0Fic29sdXRlPXBhdGguY2hhckF0KDApPT09Ii8iLHRyYWlsaW5nU2xhc2g9cGF0aC5zdWJzdHIoLTEpPT09Ii8iO3BhdGg9UEFUSC5ub3JtYWxpemVBcnJheShwYXRoLnNwbGl0KCIvIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIWlzQWJzb2x1dGUpLmpvaW4oIi8iKTtpZighcGF0aCYmIWlzQWJzb2x1dGUpe3BhdGg9Ii4ifWlmKHBhdGgmJnRyYWlsaW5nU2xhc2gpe3BhdGgrPSIvIn1yZXR1cm4oaXNBYnNvbHV0ZT8iLyI6IiIpK3BhdGh9KSxkaXJuYW1lOihmdW5jdGlvbihwYXRoKXt2YXIgcmVzdWx0PVBBVEguc3BsaXRQYXRoKHBhdGgpLHJvb3Q9cmVzdWx0WzBdLGRpcj1yZXN1bHRbMV07aWYoIXJvb3QmJiFkaXIpe3JldHVybiIuIn1pZihkaXIpe2Rpcj1kaXIuc3Vic3RyKDAsZGlyLmxlbmd0aC0xKX1yZXR1cm4gcm9vdCtkaXJ9KSxiYXNlbmFtZTooZnVuY3Rpb24ocGF0aCl7aWYocGF0aD09PSIvIilyZXR1cm4iLyI7dmFyIGxhc3RTbGFzaD1wYXRoLmxhc3RJbmRleE9mKCIvIik7aWYobGFzdFNsYXNoPT09LTEpcmV0dXJuIHBhdGg7cmV0dXJuIHBhdGguc3Vic3RyKGxhc3RTbGFzaCsxKX0pLGV4dG5hbWU6KGZ1bmN0aW9uKHBhdGgpe3JldHVybiBQQVRILnNwbGl0UGF0aChwYXRoKVszXX0pLGpvaW46KGZ1bmN0aW9uKCl7dmFyIHBhdGhzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aHMuam9pbigiLyIpKX0pLGpvaW4yOihmdW5jdGlvbihsLHIpe3JldHVybiBQQVRILm5vcm1hbGl6ZShsKyIvIityKX0pLHJlc29sdmU6KGZ1bmN0aW9uKCl7dmFyIHJlc29sdmVkUGF0aD0iIixyZXNvbHZlZEFic29sdXRlPWZhbHNlO2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLTE7aT49LTEmJiFyZXNvbHZlZEFic29sdXRlO2ktLSl7dmFyIHBhdGg9aT49MD9hcmd1bWVudHNbaV06RlMuY3dkKCk7aWYodHlwZW9mIHBhdGghPT0ic3RyaW5nIil7dGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKX1lbHNlIGlmKCFwYXRoKXtjb250aW51ZX1yZXNvbHZlZFBhdGg9cGF0aCsiLyIrcmVzb2x2ZWRQYXRoO3Jlc29sdmVkQWJzb2x1dGU9cGF0aC5jaGFyQXQoMCk9PT0iLyJ9cmVzb2x2ZWRQYXRoPVBBVEgubm9ybWFsaXplQXJyYXkocmVzb2x2ZWRQYXRoLnNwbGl0KCIvIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oIi8iKTtyZXR1cm4ocmVzb2x2ZWRBYnNvbHV0ZT8iLyI6IiIpK3Jlc29sdmVkUGF0aHx8Ii4ifSkscmVsYXRpdmU6KGZ1bmN0aW9uKGZyb20sdG8pe2Zyb209UEFUSC5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTt0bz1QQVRILnJlc29sdmUodG8pLnN1YnN0cigxKTtmdW5jdGlvbiB0cmltKGFycil7dmFyIHN0YXJ0PTA7Zm9yKDtzdGFydDxhcnIubGVuZ3RoO3N0YXJ0Kyspe2lmKGFycltzdGFydF0hPT0iIilicmVha312YXIgZW5kPWFyci5sZW5ndGgtMTtmb3IoO2VuZD49MDtlbmQtLSl7aWYoYXJyW2VuZF0hPT0iIilicmVha31pZihzdGFydD5lbmQpcmV0dXJuW107cmV0dXJuIGFyci5zbGljZShzdGFydCxlbmQtc3RhcnQrMSl9dmFyIGZyb21QYXJ0cz10cmltKGZyb20uc3BsaXQoIi8iKSk7dmFyIHRvUGFydHM9dHJpbSh0by5zcGxpdCgiLyIpKTt2YXIgbGVuZ3RoPU1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsdG9QYXJ0cy5sZW5ndGgpO3ZhciBzYW1lUGFydHNMZW5ndGg9bGVuZ3RoO2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7aWYoZnJvbVBhcnRzW2ldIT09dG9QYXJ0c1tpXSl7c2FtZVBhcnRzTGVuZ3RoPWk7YnJlYWt9fXZhciBvdXRwdXRQYXJ0cz1bXTtmb3IodmFyIGk9c2FtZVBhcnRzTGVuZ3RoO2k8ZnJvbVBhcnRzLmxlbmd0aDtpKyspe291dHB1dFBhcnRzLnB1c2goIi4uIil9b3V0cHV0UGFydHM9b3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7cmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oIi8iKX0pfTt2YXIgVFRZPXt0dHlzOltdLGluaXQ6KGZ1bmN0aW9uKCl7fSksc2h1dGRvd246KGZ1bmN0aW9uKCl7fSkscmVnaXN0ZXI6KGZ1bmN0aW9uKGRldixvcHMpe1RUWS50dHlzW2Rldl09e2lucHV0OltdLG91dHB1dDpbXSxvcHM6b3BzfTtGUy5yZWdpc3RlckRldmljZShkZXYsVFRZLnN0cmVhbV9vcHMpfSksc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgdHR5PVRUWS50dHlzW3N0cmVhbS5ub2RlLnJkZXZdO2lmKCF0dHkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9c3RyZWFtLnR0eT10dHk7c3RyZWFtLnNlZWthYmxlPWZhbHNlfSksY2xvc2U6KGZ1bmN0aW9uKHN0cmVhbSl7aWYoc3RyZWFtLnR0eS5vdXRwdXQubGVuZ3RoKXtzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcihzdHJlYW0udHR5LDEwKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXtpZighc3RyZWFtLnR0eXx8IXN0cmVhbS50dHkub3BzLmdldF9jaGFyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTlhJTyl9dmFyIGJ5dGVzUmVhZD0wO2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dmFyIHJlc3VsdDt0cnl7cmVzdWx0PXN0cmVhbS50dHkub3BzLmdldF9jaGFyKHN0cmVhbS50dHkpfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUdBSU4pfWlmKHJlc3VsdD09PW51bGx8fHJlc3VsdD09PXVuZGVmaW5lZClicmVhaztieXRlc1JlYWQrKztidWZmZXJbb2Zmc2V0K2ldPXJlc3VsdH1pZihieXRlc1JlYWQpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBieXRlc1JlYWR9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7aWYoIXN0cmVhbS50dHl8fCFzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5YSU8pfWZvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dHJ5e3N0cmVhbS50dHkub3BzLnB1dF9jaGFyKHN0cmVhbS50dHksYnVmZmVyW29mZnNldCtpXSl9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlPKX19aWYobGVuZ3RoKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gaX0pfSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyOihmdW5jdGlvbih0dHkpe2lmKCF0dHkuaW5wdXQubGVuZ3RoKXt2YXIgcmVzdWx0PW51bGw7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7cmVzdWx0PXByb2Nlc3NbInN0ZGluIl1bInJlYWQiXSgpO2lmKCFyZXN1bHQpe2lmKHByb2Nlc3NbInN0ZGluIl1bIl9yZWFkYWJsZVN0YXRlIl0mJnByb2Nlc3NbInN0ZGluIl1bIl9yZWFkYWJsZVN0YXRlIl1bImVuZGVkIl0pe3JldHVybiBudWxsfXJldHVybiB1bmRlZmluZWR9fWVsc2UgaWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiB3aW5kb3cucHJvbXB0PT0iZnVuY3Rpb24iKXtyZXN1bHQ9d2luZG93LnByb21wdCgiSW5wdXQ6ICIpO2lmKHJlc3VsdCE9PW51bGwpe3Jlc3VsdCs9IlxuIn19ZWxzZSBpZih0eXBlb2YgcmVhZGxpbmU9PSJmdW5jdGlvbiIpe3Jlc3VsdD1yZWFkbGluZSgpO2lmKHJlc3VsdCE9PW51bGwpe3Jlc3VsdCs9IlxuIn19aWYoIXJlc3VsdCl7cmV0dXJuIG51bGx9dHR5LmlucHV0PWludEFycmF5RnJvbVN0cmluZyhyZXN1bHQsdHJ1ZSl9cmV0dXJuIHR0eS5pbnB1dC5zaGlmdCgpfSkscHV0X2NoYXI6KGZ1bmN0aW9uKHR0eSx2YWwpe2lmKHZhbD09PW51bGx8fHZhbD09PTEwKXtNb2R1bGVbInByaW50Il0odHR5Lm91dHB1dC5qb2luKCIiKSk7dHR5Lm91dHB1dD1bXX1lbHNle3R0eS5vdXRwdXQucHVzaChUVFkudXRmOC5wcm9jZXNzQ0NoYXIodmFsKSl9fSl9LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyOihmdW5jdGlvbih0dHksdmFsKXtpZih2YWw9PT1udWxsfHx2YWw9PT0xMCl7TW9kdWxlWyJwcmludEVyciJdKHR0eS5vdXRwdXQuam9pbigiIikpO3R0eS5vdXRwdXQ9W119ZWxzZXt0dHkub3V0cHV0LnB1c2goVFRZLnV0ZjgucHJvY2Vzc0NDaGFyKHZhbCkpfX0pfX07dmFyIE1FTUZTPXtvcHNfdGFibGU6bnVsbCxDT05URU5UX09XTklORzoxLENPTlRFTlRfRkxFWElCTEU6MixDT05URU5UX0ZJWEVEOjMsbW91bnQ6KGZ1bmN0aW9uKG1vdW50KXtyZXR1cm4gTUVNRlMuY3JlYXRlTm9kZShudWxsLCIvIiwxNjM4NHw1MTEsMCl9KSxjcmVhdGVOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLGRldil7aWYoRlMuaXNCbGtkZXYobW9kZSl8fEZTLmlzRklGTyhtb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKCFNRU1GUy5vcHNfdGFibGUpe01FTUZTLm9wc190YWJsZT17ZGlyOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyLGxvb2t1cDpNRU1GUy5ub2RlX29wcy5sb29rdXAsbWtub2Q6TUVNRlMubm9kZV9vcHMubWtub2QscmVuYW1lOk1FTUZTLm5vZGVfb3BzLnJlbmFtZSx1bmxpbms6TUVNRlMubm9kZV9vcHMudW5saW5rLHJtZGlyOk1FTUZTLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6TUVNRlMubm9kZV9vcHMucmVhZGRpcixzeW1saW5rOk1FTUZTLm5vZGVfb3BzLnN5bWxpbmt9LHN0cmVhbTp7bGxzZWVrOk1FTUZTLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cn0sc3RyZWFtOntsbHNlZWs6TUVNRlMuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpNRU1GUy5zdHJlYW1fb3BzLnJlYWQsd3JpdGU6TUVNRlMuc3RyZWFtX29wcy53cml0ZSxhbGxvY2F0ZTpNRU1GUy5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6TUVNRlMuc3RyZWFtX29wcy5tbWFwfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cixyZWFkbGluazpNRU1GUy5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6TUVNRlMubm9kZV9vcHMuZ2V0YXR0cixzZXRhdHRyOk1FTUZTLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTpGUy5jaHJkZXZfc3RyZWFtX29wc319fXZhciBub2RlPUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSxkZXYpO2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmRpci5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUuZGlyLnN0cmVhbTtub2RlLmNvbnRlbnRzPXt9fWVsc2UgaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmZpbGUubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmZpbGUuc3RyZWFtO25vZGUuY29udGVudHM9W107bm9kZS5jb250ZW50TW9kZT1NRU1GUy5DT05URU5UX0ZMRVhJQkxFfWVsc2UgaWYoRlMuaXNMaW5rKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmxpbmsubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmxpbmsuc3RyZWFtfWVsc2UgaWYoRlMuaXNDaHJkZXYobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuY2hyZGV2Lm5vZGU7bm9kZS5zdHJlYW1fb3BzPU1FTUZTLm9wc190YWJsZS5jaHJkZXYuc3RyZWFtfW5vZGUudGltZXN0YW1wPURhdGUubm93KCk7aWYocGFyZW50KXtwYXJlbnQuY29udGVudHNbbmFtZV09bm9kZX1yZXR1cm4gbm9kZX0pLGVuc3VyZUZsZXhpYmxlOihmdW5jdGlvbihub2RlKXtpZihub2RlLmNvbnRlbnRNb2RlIT09TUVNRlMuQ09OVEVOVF9GTEVYSUJMRSl7dmFyIGNvbnRlbnRzPW5vZGUuY29udGVudHM7bm9kZS5jb250ZW50cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb250ZW50cyk7bm9kZS5jb250ZW50TW9kZT1NRU1GUy5DT05URU5UX0ZMRVhJQkxFfX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXt2YXIgYXR0cj17fTthdHRyLmRldj1GUy5pc0NocmRldihub2RlLm1vZGUpP25vZGUuaWQ6MTthdHRyLmlubz1ub2RlLmlkO2F0dHIubW9kZT1ub2RlLm1vZGU7YXR0ci5ubGluaz0xO2F0dHIudWlkPTA7YXR0ci5naWQ9MDthdHRyLnJkZXY9bm9kZS5yZGV2O2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT00MDk2fWVsc2UgaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT1ub2RlLmNvbnRlbnRzLmxlbmd0aH1lbHNlIGlmKEZTLmlzTGluayhub2RlLm1vZGUpKXthdHRyLnNpemU9bm9kZS5saW5rLmxlbmd0aH1lbHNle2F0dHIuc2l6ZT0wfWF0dHIuYXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIubXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuY3RpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuYmxrc2l6ZT00MDk2O2F0dHIuYmxvY2tzPU1hdGguY2VpbChhdHRyLnNpemUvYXR0ci5ibGtzaXplKTtyZXR1cm4gYXR0cn0pLHNldGF0dHI6KGZ1bmN0aW9uKG5vZGUsYXR0cil7aWYoYXR0ci5tb2RlIT09dW5kZWZpbmVkKXtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXtub2RlLnRpbWVzdGFtcD1hdHRyLnRpbWVzdGFtcH1pZihhdHRyLnNpemUhPT11bmRlZmluZWQpe01FTUZTLmVuc3VyZUZsZXhpYmxlKG5vZGUpO3ZhciBjb250ZW50cz1ub2RlLmNvbnRlbnRzO2lmKGF0dHIuc2l6ZTxjb250ZW50cy5sZW5ndGgpY29udGVudHMubGVuZ3RoPWF0dHIuc2l6ZTtlbHNlIHdoaWxlKGF0dHIuc2l6ZT5jb250ZW50cy5sZW5ndGgpY29udGVudHMucHVzaCgwKX19KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt0aHJvdyBGUy5nZW5lcmljRXJyb3JzW0VSUk5PX0NPREVTLkVOT0VOVF19KSxta25vZDooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe3JldHVybiBNRU1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkX25vZGUsbmV3X2RpcixuZXdfbmFtZSl7aWYoRlMuaXNEaXIob2xkX25vZGUubW9kZSkpe3ZhciBuZXdfbm9kZTt0cnl7bmV3X25vZGU9RlMubG9va3VwTm9kZShuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt9aWYobmV3X25vZGUpe2Zvcih2YXIgaSBpbiBuZXdfbm9kZS5jb250ZW50cyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKX19fWRlbGV0ZSBvbGRfbm9kZS5wYXJlbnQuY29udGVudHNbb2xkX25vZGUubmFtZV07b2xkX25vZGUubmFtZT1uZXdfbmFtZTtuZXdfZGlyLmNvbnRlbnRzW25ld19uYW1lXT1vbGRfbm9kZTtvbGRfbm9kZS5wYXJlbnQ9bmV3X2Rpcn0pLHVubGluazooZnVuY3Rpb24ocGFyZW50LG5hbWUpe2RlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxybWRpcjooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO2Zvcih2YXIgaSBpbiBub2RlLmNvbnRlbnRzKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URU1QVFkpfWRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxyZWFkZGlyOihmdW5jdGlvbihub2RlKXt2YXIgZW50cmllcz1bIi4iLCIuLiJdO2Zvcih2YXIga2V5IGluIG5vZGUuY29udGVudHMpe2lmKCFub2RlLmNvbnRlbnRzLmhhc093blByb3BlcnR5KGtleSkpe2NvbnRpbnVlfWVudHJpZXMucHVzaChrZXkpfXJldHVybiBlbnRyaWVzfSksc3ltbGluazooZnVuY3Rpb24ocGFyZW50LG5ld25hbWUsb2xkcGF0aCl7dmFyIG5vZGU9TUVNRlMuY3JlYXRlTm9kZShwYXJlbnQsbmV3bmFtZSw1MTF8NDA5NjAsMCk7bm9kZS5saW5rPW9sZHBhdGg7cmV0dXJuIG5vZGV9KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7aWYoIUZTLmlzTGluayhub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXJldHVybiBub2RlLmxpbmt9KX0sc3RyZWFtX29wczp7cmVhZDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXt2YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYocG9zaXRpb24+PWNvbnRlbnRzLmxlbmd0aClyZXR1cm4gMDt2YXIgc2l6ZT1NYXRoLm1pbihjb250ZW50cy5sZW5ndGgtcG9zaXRpb24sbGVuZ3RoKTthc3NlcnQoc2l6ZT49MCk7aWYoc2l6ZT44JiZjb250ZW50cy5zdWJhcnJheSl7YnVmZmVyLnNldChjb250ZW50cy5zdWJhcnJheShwb3NpdGlvbixwb3NpdGlvbitzaXplKSxvZmZzZXQpfWVsc2V7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX19cmV0dXJuIHNpemV9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLGNhbk93bil7dmFyIG5vZGU9c3RyZWFtLm5vZGU7bm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKTt2YXIgY29udGVudHM9bm9kZS5jb250ZW50cztpZihsZW5ndGgmJmNvbnRlbnRzLmxlbmd0aD09PTAmJnBvc2l0aW9uPT09MCYmYnVmZmVyLnN1YmFycmF5KXtpZihjYW5Pd24mJm9mZnNldD09PTApe25vZGUuY29udGVudHM9YnVmZmVyO25vZGUuY29udGVudE1vZGU9YnVmZmVyLmJ1ZmZlcj09PUhFQVA4LmJ1ZmZlcj9NRU1GUy5DT05URU5UX09XTklORzpNRU1GUy5DT05URU5UX0ZJWEVEfWVsc2V7bm9kZS5jb250ZW50cz1uZXcgVWludDhBcnJheShidWZmZXIuc3ViYXJyYXkob2Zmc2V0LG9mZnNldCtsZW5ndGgpKTtub2RlLmNvbnRlbnRNb2RlPU1FTUZTLkNPTlRFTlRfRklYRUR9cmV0dXJuIGxlbmd0aH1NRU1GUy5lbnN1cmVGbGV4aWJsZShub2RlKTt2YXIgY29udGVudHM9bm9kZS5jb250ZW50czt3aGlsZShjb250ZW50cy5sZW5ndGg8cG9zaXRpb24pY29udGVudHMucHVzaCgwKTtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe2NvbnRlbnRzW3Bvc2l0aW9uK2ldPWJ1ZmZlcltvZmZzZXQraV19cmV0dXJuIGxlbmd0aH0pLGxsc2VlazooZnVuY3Rpb24oc3RyZWFtLG9mZnNldCx3aGVuY2Upe3ZhciBwb3NpdGlvbj1vZmZzZXQ7aWYod2hlbmNlPT09MSl7cG9zaXRpb24rPXN0cmVhbS5wb3NpdGlvbn1lbHNlIGlmKHdoZW5jZT09PTIpe2lmKEZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSl7cG9zaXRpb24rPXN0cmVhbS5ub2RlLmNvbnRlbnRzLmxlbmd0aH19aWYocG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1zdHJlYW0udW5nb3R0ZW49W107c3RyZWFtLnBvc2l0aW9uPXBvc2l0aW9uO3JldHVybiBwb3NpdGlvbn0pLGFsbG9jYXRlOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LGxlbmd0aCl7TUVNRlMuZW5zdXJlRmxleGlibGUoc3RyZWFtLm5vZGUpO3ZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50czt2YXIgbGltaXQ9b2Zmc2V0K2xlbmd0aDt3aGlsZShsaW1pdD5jb250ZW50cy5sZW5ndGgpY29udGVudHMucHVzaCgwKX0pLG1tYXA6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixwcm90LGZsYWdzKXtpZighRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9ERVYpfXZhciBwdHI7dmFyIGFsbG9jYXRlZDt2YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYoIShmbGFncyYyKSYmKGNvbnRlbnRzLmJ1ZmZlcj09PWJ1ZmZlcnx8Y29udGVudHMuYnVmZmVyPT09YnVmZmVyLmJ1ZmZlcikpe2FsbG9jYXRlZD1mYWxzZTtwdHI9Y29udGVudHMuYnl0ZU9mZnNldH1lbHNle2lmKHBvc2l0aW9uPjB8fHBvc2l0aW9uK2xlbmd0aDxjb250ZW50cy5sZW5ndGgpe2lmKGNvbnRlbnRzLnN1YmFycmF5KXtjb250ZW50cz1jb250ZW50cy5zdWJhcnJheShwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpfWVsc2V7Y29udGVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY29udGVudHMscG9zaXRpb24scG9zaXRpb24rbGVuZ3RoKX19YWxsb2NhdGVkPXRydWU7cHRyPV9tYWxsb2MobGVuZ3RoKTtpZighcHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9NRU0pfWJ1ZmZlci5zZXQoY29udGVudHMscHRyKX1yZXR1cm57cHRyOnB0cixhbGxvY2F0ZWQ6YWxsb2NhdGVkfX0pfX07dmFyIElEQkZTPXtkYnM6e30saW5kZXhlZERCOihmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW5kZXhlZERCfHx3aW5kb3cubW96SW5kZXhlZERCfHx3aW5kb3cud2Via2l0SW5kZXhlZERCfHx3aW5kb3cubXNJbmRleGVkREJ9KSxEQl9WRVJTSU9OOjIxLERCX1NUT1JFX05BTUU6IkZJTEVfREFUQSIsbW91bnQ6KGZ1bmN0aW9uKG1vdW50KXtyZXR1cm4gTUVNRlMubW91bnQuYXBwbHkobnVsbCxhcmd1bWVudHMpfSksc3luY2ZzOihmdW5jdGlvbihtb3VudCxwb3B1bGF0ZSxjYWxsYmFjayl7SURCRlMuZ2V0TG9jYWxTZXQobW91bnQsKGZ1bmN0aW9uKGVycixsb2NhbCl7aWYoZXJyKXJldHVybiBjYWxsYmFjayhlcnIpO0lEQkZTLmdldFJlbW90ZVNldChtb3VudCwoZnVuY3Rpb24oZXJyLHJlbW90ZSl7aWYoZXJyKXJldHVybiBjYWxsYmFjayhlcnIpO3ZhciBzcmM9cG9wdWxhdGU/cmVtb3RlOmxvY2FsO3ZhciBkc3Q9cG9wdWxhdGU/bG9jYWw6cmVtb3RlO0lEQkZTLnJlY29uY2lsZShzcmMsZHN0LGNhbGxiYWNrKX0pKX0pKX0pLGdldERCOihmdW5jdGlvbihuYW1lLGNhbGxiYWNrKXt2YXIgZGI9SURCRlMuZGJzW25hbWVdO2lmKGRiKXtyZXR1cm4gY2FsbGJhY2sobnVsbCxkYil9dmFyIHJlcTt0cnl7cmVxPUlEQkZTLmluZGV4ZWREQigpLm9wZW4obmFtZSxJREJGUy5EQl9WRVJTSU9OKX1jYXRjaChlKXtyZXR1cm4gY2FsbGJhY2soZSl9cmVxLm9udXBncmFkZW5lZWRlZD0oZnVuY3Rpb24oZSl7dmFyIGRiPWUudGFyZ2V0LnJlc3VsdDt2YXIgdHJhbnNhY3Rpb249ZS50YXJnZXQudHJhbnNhY3Rpb247dmFyIGZpbGVTdG9yZTtpZihkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKElEQkZTLkRCX1NUT1JFX05BTUUpKXtmaWxlU3RvcmU9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSl9ZWxzZXtmaWxlU3RvcmU9ZGIuY3JlYXRlT2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSl9ZmlsZVN0b3JlLmNyZWF0ZUluZGV4KCJ0aW1lc3RhbXAiLCJ0aW1lc3RhbXAiLHt1bmlxdWU6ZmFsc2V9KX0pO3JlcS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKCl7ZGI9cmVxLnJlc3VsdDtJREJGUy5kYnNbbmFtZV09ZGI7Y2FsbGJhY2sobnVsbCxkYil9KTtyZXEub25lcnJvcj0oZnVuY3Rpb24oKXtjYWxsYmFjayh0aGlzLmVycm9yKX0pfSksZ2V0TG9jYWxTZXQ6KGZ1bmN0aW9uKG1vdW50LGNhbGxiYWNrKXt2YXIgZW50cmllcz17fTtmdW5jdGlvbiBpc1JlYWxEaXIocCl7cmV0dXJuIHAhPT0iLiImJnAhPT0iLi4ifWZ1bmN0aW9uIHRvQWJzb2x1dGUocm9vdCl7cmV0dXJuKGZ1bmN0aW9uKHApe3JldHVybiBQQVRILmpvaW4yKHJvb3QscCl9KX12YXIgY2hlY2s9RlMucmVhZGRpcihtb3VudC5tb3VudHBvaW50KS5maWx0ZXIoaXNSZWFsRGlyKS5tYXAodG9BYnNvbHV0ZShtb3VudC5tb3VudHBvaW50KSk7d2hpbGUoY2hlY2subGVuZ3RoKXt2YXIgcGF0aD1jaGVjay5wb3AoKTt2YXIgc3RhdDt0cnl7c3RhdD1GUy5zdGF0KHBhdGgpfWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1pZihGUy5pc0RpcihzdGF0Lm1vZGUpKXtjaGVjay5wdXNoLmFwcGx5KGNoZWNrLEZTLnJlYWRkaXIocGF0aCkuZmlsdGVyKGlzUmVhbERpcikubWFwKHRvQWJzb2x1dGUocGF0aCkpKX1lbnRyaWVzW3BhdGhdPXt0aW1lc3RhbXA6c3RhdC5tdGltZX19cmV0dXJuIGNhbGxiYWNrKG51bGwse3R5cGU6ImxvY2FsIixlbnRyaWVzOmVudHJpZXN9KX0pLGdldFJlbW90ZVNldDooZnVuY3Rpb24obW91bnQsY2FsbGJhY2spe3ZhciBlbnRyaWVzPXt9O0lEQkZTLmdldERCKG1vdW50Lm1vdW50cG9pbnQsKGZ1bmN0aW9uKGVycixkYil7aWYoZXJyKXJldHVybiBjYWxsYmFjayhlcnIpO3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbSURCRlMuREJfU1RPUkVfTkFNRV0sInJlYWRvbmx5Iik7dHJhbnNhY3Rpb24ub25lcnJvcj0oZnVuY3Rpb24oKXtjYWxsYmFjayh0aGlzLmVycm9yKX0pO3ZhciBzdG9yZT10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShJREJGUy5EQl9TVE9SRV9OQU1FKTt2YXIgaW5kZXg9c3RvcmUuaW5kZXgoInRpbWVzdGFtcCIpO2luZGV4Lm9wZW5LZXlDdXJzb3IoKS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKGV2ZW50KXt2YXIgY3Vyc29yPWV2ZW50LnRhcmdldC5yZXN1bHQ7aWYoIWN1cnNvcil7cmV0dXJuIGNhbGxiYWNrKG51bGwse3R5cGU6InJlbW90ZSIsZGI6ZGIsZW50cmllczplbnRyaWVzfSl9ZW50cmllc1tjdXJzb3IucHJpbWFyeUtleV09e3RpbWVzdGFtcDpjdXJzb3Iua2V5fTtjdXJzb3IuY29udGludWUoKX0pfSkpfSksbG9hZExvY2FsRW50cnk6KGZ1bmN0aW9uKHBhdGgsY2FsbGJhY2spe3ZhciBzdGF0LG5vZGU7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTtub2RlPWxvb2t1cC5ub2RlO3N0YXQ9RlMuc3RhdChwYXRoKX1jYXRjaChlKXtyZXR1cm4gY2FsbGJhY2soZSl9aWYoRlMuaXNEaXIoc3RhdC5tb2RlKSl7cmV0dXJuIGNhbGxiYWNrKG51bGwse3RpbWVzdGFtcDpzdGF0Lm10aW1lLG1vZGU6c3RhdC5tb2RlfSl9ZWxzZSBpZihGUy5pc0ZpbGUoc3RhdC5tb2RlKSl7cmV0dXJuIGNhbGxiYWNrKG51bGwse3RpbWVzdGFtcDpzdGF0Lm10aW1lLG1vZGU6c3RhdC5tb2RlLGNvbnRlbnRzOm5vZGUuY29udGVudHN9KX1lbHNle3JldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIikpfX0pLHN0b3JlTG9jYWxFbnRyeTooZnVuY3Rpb24ocGF0aCxlbnRyeSxjYWxsYmFjayl7dHJ5e2lmKEZTLmlzRGlyKGVudHJ5Lm1vZGUpKXtGUy5ta2RpcihwYXRoLGVudHJ5Lm1vZGUpfWVsc2UgaWYoRlMuaXNGaWxlKGVudHJ5Lm1vZGUpKXtGUy53cml0ZUZpbGUocGF0aCxlbnRyeS5jb250ZW50cyx7ZW5jb2Rpbmc6ImJpbmFyeSIsY2FuT3duOnRydWV9KX1lbHNle3JldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIikpfUZTLnV0aW1lKHBhdGgsZW50cnkudGltZXN0YW1wLGVudHJ5LnRpbWVzdGFtcCl9Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfWNhbGxiYWNrKG51bGwpfSkscmVtb3ZlTG9jYWxFbnRyeTooZnVuY3Rpb24ocGF0aCxjYWxsYmFjayl7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTt2YXIgc3RhdD1GUy5zdGF0KHBhdGgpO2lmKEZTLmlzRGlyKHN0YXQubW9kZSkpe0ZTLnJtZGlyKHBhdGgpfWVsc2UgaWYoRlMuaXNGaWxlKHN0YXQubW9kZSkpe0ZTLnVubGluayhwYXRoKX19Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfWNhbGxiYWNrKG51bGwpfSksbG9hZFJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLmdldChwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbihldmVudCl7Y2FsbGJhY2sobnVsbCxldmVudC50YXJnZXQucmVzdWx0KX0pO3JlcS5vbmVycm9yPShmdW5jdGlvbigpe2NhbGxiYWNrKHRoaXMuZXJyb3IpfSl9KSxzdG9yZVJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGVudHJ5LGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLnB1dChlbnRyeSxwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKCl7Y2FsbGJhY2sodGhpcy5lcnJvcil9KX0pLHJlbW92ZVJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLmRlbGV0ZShwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKCl7Y2FsbGJhY2sodGhpcy5lcnJvcil9KX0pLHJlY29uY2lsZTooZnVuY3Rpb24oc3JjLGRzdCxjYWxsYmFjayl7dmFyIHRvdGFsPTA7dmFyIGNyZWF0ZT1bXTtPYmplY3Qua2V5cyhzcmMuZW50cmllcykuZm9yRWFjaCgoZnVuY3Rpb24oa2V5KXt2YXIgZT1zcmMuZW50cmllc1trZXldO3ZhciBlMj1kc3QuZW50cmllc1trZXldO2lmKCFlMnx8ZS50aW1lc3RhbXA+ZTIudGltZXN0YW1wKXtjcmVhdGUucHVzaChrZXkpO3RvdGFsKyt9fSkpO3ZhciByZW1vdmU9W107T2JqZWN0LmtleXMoZHN0LmVudHJpZXMpLmZvckVhY2goKGZ1bmN0aW9uKGtleSl7dmFyIGU9ZHN0LmVudHJpZXNba2V5XTt2YXIgZTI9c3JjLmVudHJpZXNba2V5XTtpZighZTIpe3JlbW92ZS5wdXNoKGtleSk7dG90YWwrK319KSk7aWYoIXRvdGFsKXtyZXR1cm4gY2FsbGJhY2sobnVsbCl9dmFyIGVycm9yZWQ9ZmFsc2U7dmFyIGNvbXBsZXRlZD0wO3ZhciBkYj1zcmMudHlwZT09PSJyZW1vdGUiP3NyYy5kYjpkc3QuZGI7dmFyIHRyYW5zYWN0aW9uPWRiLnRyYW5zYWN0aW9uKFtJREJGUy5EQl9TVE9SRV9OQU1FXSwicmVhZHdyaXRlIik7dmFyIHN0b3JlPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpO2Z1bmN0aW9uIGRvbmUoZXJyKXtpZihlcnIpe2lmKCFkb25lLmVycm9yZWQpe2RvbmUuZXJyb3JlZD10cnVlO3JldHVybiBjYWxsYmFjayhlcnIpfXJldHVybn1pZigrK2NvbXBsZXRlZD49dG90YWwpe3JldHVybiBjYWxsYmFjayhudWxsKX19dHJhbnNhY3Rpb24ub25lcnJvcj0oZnVuY3Rpb24oKXtkb25lKHRoaXMuZXJyb3IpfSk7Y3JlYXRlLnNvcnQoKS5mb3JFYWNoKChmdW5jdGlvbihwYXRoKXtpZihkc3QudHlwZT09PSJsb2NhbCIpe0lEQkZTLmxvYWRSZW1vdGVFbnRyeShzdG9yZSxwYXRoLChmdW5jdGlvbihlcnIsZW50cnkpe2lmKGVycilyZXR1cm4gZG9uZShlcnIpO0lEQkZTLnN0b3JlTG9jYWxFbnRyeShwYXRoLGVudHJ5LGRvbmUpfSkpfWVsc2V7SURCRlMubG9hZExvY2FsRW50cnkocGF0aCwoZnVuY3Rpb24oZXJyLGVudHJ5KXtpZihlcnIpcmV0dXJuIGRvbmUoZXJyKTtJREJGUy5zdG9yZVJlbW90ZUVudHJ5KHN0b3JlLHBhdGgsZW50cnksZG9uZSl9KSl9fSkpO3JlbW92ZS5zb3J0KCkucmV2ZXJzZSgpLmZvckVhY2goKGZ1bmN0aW9uKHBhdGgpe2lmKGRzdC50eXBlPT09ImxvY2FsIil7SURCRlMucmVtb3ZlTG9jYWxFbnRyeShwYXRoLGRvbmUpfWVsc2V7SURCRlMucmVtb3ZlUmVtb3RlRW50cnkoc3RvcmUscGF0aCxkb25lKX19KSl9KX07dmFyIE5PREVGUz17aXNXaW5kb3dzOmZhbHNlLHN0YXRpY0luaXQ6KGZ1bmN0aW9uKCl7Tk9ERUZTLmlzV2luZG93cz0hIXByb2Nlc3MucGxhdGZvcm0ubWF0Y2goL153aW4vKX0pLG1vdW50OihmdW5jdGlvbihtb3VudCl7YXNzZXJ0KEVOVklST05NRU5UX0lTX05PREUpO3JldHVybiBOT0RFRlMuY3JlYXRlTm9kZShudWxsLCIvIixOT0RFRlMuZ2V0TW9kZShtb3VudC5vcHRzLnJvb3QpLDApfSksY3JlYXRlTm9kZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe2lmKCFGUy5pc0Rpcihtb2RlKSYmIUZTLmlzRmlsZShtb2RlKSYmIUZTLmlzTGluayhtb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbm9kZT1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUpO25vZGUubm9kZV9vcHM9Tk9ERUZTLm5vZGVfb3BzO25vZGUuc3RyZWFtX29wcz1OT0RFRlMuc3RyZWFtX29wcztyZXR1cm4gbm9kZX0pLGdldE1vZGU6KGZ1bmN0aW9uKHBhdGgpe3ZhciBzdGF0O3RyeXtzdGF0PWZzLmxzdGF0U3luYyhwYXRoKTtpZihOT0RFRlMuaXNXaW5kb3dzKXtzdGF0Lm1vZGU9c3RhdC5tb2RlfChzdGF0Lm1vZGUmMTQ2KT4+MX19Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfXJldHVybiBzdGF0Lm1vZGV9KSxyZWFsUGF0aDooZnVuY3Rpb24obm9kZSl7dmFyIHBhcnRzPVtdO3doaWxlKG5vZGUucGFyZW50IT09bm9kZSl7cGFydHMucHVzaChub2RlLm5hbWUpO25vZGU9bm9kZS5wYXJlbnR9cGFydHMucHVzaChub2RlLm1vdW50Lm9wdHMucm9vdCk7cGFydHMucmV2ZXJzZSgpO3JldHVybiBQQVRILmpvaW4uYXBwbHkobnVsbCxwYXJ0cyl9KSxmbGFnc1RvUGVybWlzc2lvblN0cmluZ01hcDp7MDoiciIsMToicisiLDI6InIrIiw2NDoiciIsNjU6InIrIiw2NjoicisiLDEyOToicngrIiwxOTM6InJ4KyIsNTE0OiJ3KyIsNTc3OiJ3Iiw1Nzg6IncrIiw3MDU6Ind4Iiw3MDY6Ind4KyIsMTAyNDoiYSIsMTAyNToiYSIsMTAyNjoiYSsiLDEwODk6ImEiLDEwOTA6ImErIiwxMTUzOiJheCIsMTE1NDoiYXgrIiwxMjE3OiJheCIsMTIxODoiYXgrIiw0MDk2OiJycyIsNDA5ODoicnMrIn0sZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmc6KGZ1bmN0aW9uKGZsYWdzKXtpZihmbGFncyBpbiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXApe3JldHVybiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXBbZmxhZ3NdfWVsc2V7cmV0dXJuIGZsYWdzfX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dmFyIHN0YXQ7dHJ5e3N0YXQ9ZnMubHN0YXRTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1pZihOT0RFRlMuaXNXaW5kb3dzJiYhc3RhdC5ibGtzaXplKXtzdGF0LmJsa3NpemU9NDA5Nn1pZihOT0RFRlMuaXNXaW5kb3dzJiYhc3RhdC5ibG9ja3Mpe3N0YXQuYmxvY2tzPShzdGF0LnNpemUrc3RhdC5ibGtzaXplLTEpL3N0YXQuYmxrc2l6ZXwwfXJldHVybntkZXY6c3RhdC5kZXYsaW5vOnN0YXQuaW5vLG1vZGU6c3RhdC5tb2RlLG5saW5rOnN0YXQubmxpbmssdWlkOnN0YXQudWlkLGdpZDpzdGF0LmdpZCxyZGV2OnN0YXQucmRldixzaXplOnN0YXQuc2l6ZSxhdGltZTpzdGF0LmF0aW1lLG10aW1lOnN0YXQubXRpbWUsY3RpbWU6c3RhdC5jdGltZSxibGtzaXplOnN0YXQuYmxrc2l6ZSxibG9ja3M6c3RhdC5ibG9ja3N9fSksc2V0YXR0cjooZnVuY3Rpb24obm9kZSxhdHRyKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dHJ5e2lmKGF0dHIubW9kZSE9PXVuZGVmaW5lZCl7ZnMuY2htb2RTeW5jKHBhdGgsYXR0ci5tb2RlKTtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXt2YXIgZGF0ZT1uZXcgRGF0ZShhdHRyLnRpbWVzdGFtcCk7ZnMudXRpbWVzU3luYyhwYXRoLGRhdGUsZGF0ZSl9aWYoYXR0ci5zaXplIT09dW5kZWZpbmVkKXtmcy50cnVuY2F0ZVN5bmMocGF0aCxhdHRyLnNpemUpfX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksbG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt2YXIgbW9kZT1OT0RFRlMuZ2V0TW9kZShwYXRoKTtyZXR1cm4gTk9ERUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSl9KSxta25vZDooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe3ZhciBub2RlPU5PREVGUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KTt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dHJ5e2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2ZzLm1rZGlyU3luYyhwYXRoLG5vZGUubW9kZSl9ZWxzZXtmcy53cml0ZUZpbGVTeW5jKHBhdGgsIiIse21vZGU6bm9kZS5tb2RlfSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gbm9kZX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkTm9kZSxuZXdEaXIsbmV3TmFtZSl7dmFyIG9sZFBhdGg9Tk9ERUZTLnJlYWxQYXRoKG9sZE5vZGUpO3ZhciBuZXdQYXRoPVBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKG5ld0RpciksbmV3TmFtZSk7dHJ5e2ZzLnJlbmFtZVN5bmMob2xkUGF0aCxuZXdQYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksdW5saW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt0cnl7ZnMudW5saW5rU3luYyhwYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgcGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5hbWUpO3RyeXtmcy5ybWRpclN5bmMocGF0aCl9Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfX0pLHJlYWRkaXI6KGZ1bmN0aW9uKG5vZGUpe3ZhciBwYXRoPU5PREVGUy5yZWFsUGF0aChub2RlKTt0cnl7cmV0dXJuIGZzLnJlYWRkaXJTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxzeW1saW5rOihmdW5jdGlvbihwYXJlbnQsbmV3TmFtZSxvbGRQYXRoKXt2YXIgbmV3UGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5ld05hbWUpO3RyeXtmcy5zeW1saW5rU3luYyhvbGRQYXRoLG5ld1BhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtyZXR1cm4gZnMucmVhZGxpbmtTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KX0sc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgoc3RyZWFtLm5vZGUpO3RyeXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3N0cmVhbS5uZmQ9ZnMub3BlblN5bmMocGF0aCxOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoc3RyZWFtLmZsYWdzKSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXt0cnl7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpJiZzdHJlYW0ubmZkKXtmcy5jbG9zZVN5bmMoc3RyZWFtLm5mZCl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBuYnVmZmVyPW5ldyBCdWZmZXIobGVuZ3RoKTt2YXIgcmVzO3RyeXtyZXM9ZnMucmVhZFN5bmMoc3RyZWFtLm5mZCxuYnVmZmVyLDAsbGVuZ3RoLHBvc2l0aW9uKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1pZihyZXM+MCl7Zm9yKHZhciBpPTA7aTxyZXM7aSsrKXtidWZmZXJbb2Zmc2V0K2ldPW5idWZmZXJbaV19fXJldHVybiByZXN9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXt2YXIgbmJ1ZmZlcj1uZXcgQnVmZmVyKGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsb2Zmc2V0K2xlbmd0aCkpO3ZhciByZXM7dHJ5e3Jlcz1mcy53cml0ZVN5bmMoc3RyZWFtLm5mZCxuYnVmZmVyLDAsbGVuZ3RoLHBvc2l0aW9uKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gcmVzfSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7dmFyIHBvc2l0aW9uPW9mZnNldDtpZih3aGVuY2U9PT0xKXtwb3NpdGlvbis9c3RyZWFtLnBvc2l0aW9ufWVsc2UgaWYod2hlbmNlPT09Mil7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXt0cnl7dmFyIHN0YXQ9ZnMuZnN0YXRTeW5jKHN0cmVhbS5uZmQpO3Bvc2l0aW9uKz1zdGF0LnNpemV9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fX1pZihwb3NpdGlvbjwwKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXN0cmVhbS5wb3NpdGlvbj1wb3NpdGlvbjtyZXR1cm4gcG9zaXRpb259KX19O3ZhciBfc3RkaW49YWxsb2NhdGUoMSwiaTMyKiIsQUxMT0NfU1RBVElDKTt2YXIgX3N0ZG91dD1hbGxvY2F0ZSgxLCJpMzIqIixBTExPQ19TVEFUSUMpO3ZhciBfc3RkZXJyPWFsbG9jYXRlKDEsImkzMioiLEFMTE9DX1NUQVRJQyk7dmFyIEZTPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6W251bGxdLHN0cmVhbXM6W10sbmV4dElub2RlOjEsbmFtZVRhYmxlOm51bGwsY3VycmVudFBhdGg6Ii8iLGluaXRpYWxpemVkOmZhbHNlLGlnbm9yZVBlcm1pc3Npb25zOnRydWUsdHJhY2tpbmdEZWxlZ2F0ZTp7fSx0cmFja2luZzp7b3BlbkZsYWdzOntSRUFEOjEsV1JJVEU6Mn19LEVycm5vRXJyb3I6bnVsbCxnZW5lcmljRXJyb3JzOnt9LGhhbmRsZUZTRXJyb3I6KGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKXRocm93IGUrIiA6ICIrc3RhY2tUcmFjZSgpO3JldHVybiBfX19zZXRFcnJObyhlLmVycm5vKX0pLGxvb2t1cFBhdGg6KGZ1bmN0aW9uKHBhdGgsb3B0cyl7cGF0aD1QQVRILnJlc29sdmUoRlMuY3dkKCkscGF0aCk7b3B0cz1vcHRzfHx7fTt2YXIgZGVmYXVsdHM9e2ZvbGxvd19tb3VudDp0cnVlLHJlY3Vyc2VfY291bnQ6MH07Zm9yKHZhciBrZXkgaW4gZGVmYXVsdHMpe2lmKG9wdHNba2V5XT09PXVuZGVmaW5lZCl7b3B0c1trZXldPWRlZmF1bHRzW2tleV19fWlmKG9wdHMucmVjdXJzZV9jb3VudD44KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTE9PUCl9dmFyIHBhcnRzPVBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdCgiLyIpLmZpbHRlcigoZnVuY3Rpb24ocCl7cmV0dXJuISFwfSkpLGZhbHNlKTt2YXIgY3VycmVudD1GUy5yb290O3ZhciBjdXJyZW50X3BhdGg9Ii8iO2Zvcih2YXIgaT0wO2k8cGFydHMubGVuZ3RoO2krKyl7dmFyIGlzbGFzdD1pPT09cGFydHMubGVuZ3RoLTE7aWYoaXNsYXN0JiZvcHRzLnBhcmVudCl7YnJlYWt9Y3VycmVudD1GUy5sb29rdXBOb2RlKGN1cnJlbnQscGFydHNbaV0pO2N1cnJlbnRfcGF0aD1QQVRILmpvaW4yKGN1cnJlbnRfcGF0aCxwYXJ0c1tpXSk7aWYoRlMuaXNNb3VudHBvaW50KGN1cnJlbnQpKXtpZighaXNsYXN0fHxpc2xhc3QmJm9wdHMuZm9sbG93X21vdW50KXtjdXJyZW50PWN1cnJlbnQubW91bnRlZC5yb290fX1pZighaXNsYXN0fHxvcHRzLmZvbGxvdyl7dmFyIGNvdW50PTA7d2hpbGUoRlMuaXNMaW5rKGN1cnJlbnQubW9kZSkpe3ZhciBsaW5rPUZTLnJlYWRsaW5rKGN1cnJlbnRfcGF0aCk7Y3VycmVudF9wYXRoPVBBVEgucmVzb2x2ZShQQVRILmRpcm5hbWUoY3VycmVudF9wYXRoKSxsaW5rKTt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgoY3VycmVudF9wYXRoLHtyZWN1cnNlX2NvdW50Om9wdHMucmVjdXJzZV9jb3VudH0pO2N1cnJlbnQ9bG9va3VwLm5vZGU7aWYoY291bnQrKz40MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUxPT1ApfX19fXJldHVybntwYXRoOmN1cnJlbnRfcGF0aCxub2RlOmN1cnJlbnR9fSksZ2V0UGF0aDooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg7d2hpbGUodHJ1ZSl7aWYoRlMuaXNSb290KG5vZGUpKXt2YXIgbW91bnQ9bm9kZS5tb3VudC5tb3VudHBvaW50O2lmKCFwYXRoKXJldHVybiBtb3VudDtyZXR1cm4gbW91bnRbbW91bnQubGVuZ3RoLTFdIT09Ii8iP21vdW50KyIvIitwYXRoOm1vdW50K3BhdGh9cGF0aD1wYXRoP25vZGUubmFtZSsiLyIrcGF0aDpub2RlLm5hbWU7bm9kZT1ub2RlLnBhcmVudH19KSxoYXNoTmFtZTooZnVuY3Rpb24ocGFyZW50aWQsbmFtZSl7dmFyIGhhc2g9MDtmb3IodmFyIGk9MDtpPG5hbWUubGVuZ3RoO2krKyl7aGFzaD0oaGFzaDw8NSktaGFzaCtuYW1lLmNoYXJDb2RlQXQoaSl8MH1yZXR1cm4ocGFyZW50aWQraGFzaD4+PjApJUZTLm5hbWVUYWJsZS5sZW5ndGh9KSxoYXNoQWRkTm9kZTooZnVuY3Rpb24obm9kZSl7dmFyIGhhc2g9RlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsbm9kZS5uYW1lKTtub2RlLm5hbWVfbmV4dD1GUy5uYW1lVGFibGVbaGFzaF07RlMubmFtZVRhYmxlW2hhc2hdPW5vZGV9KSxoYXNoUmVtb3ZlTm9kZTooZnVuY3Rpb24obm9kZSl7dmFyIGhhc2g9RlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsbm9kZS5uYW1lKTtpZihGUy5uYW1lVGFibGVbaGFzaF09PT1ub2RlKXtGUy5uYW1lVGFibGVbaGFzaF09bm9kZS5uYW1lX25leHR9ZWxzZXt2YXIgY3VycmVudD1GUy5uYW1lVGFibGVbaGFzaF07d2hpbGUoY3VycmVudCl7aWYoY3VycmVudC5uYW1lX25leHQ9PT1ub2RlKXtjdXJyZW50Lm5hbWVfbmV4dD1ub2RlLm5hbWVfbmV4dDticmVha31jdXJyZW50PWN1cnJlbnQubmFtZV9uZXh0fX19KSxsb29rdXBOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIGVycj1GUy5tYXlMb29rdXAocGFyZW50KTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9dmFyIGhhc2g9RlMuaGFzaE5hbWUocGFyZW50LmlkLG5hbWUpO2Zvcih2YXIgbm9kZT1GUy5uYW1lVGFibGVbaGFzaF07bm9kZTtub2RlPW5vZGUubmFtZV9uZXh0KXt2YXIgbm9kZU5hbWU9bm9kZS5uYW1lO2lmKG5vZGUucGFyZW50LmlkPT09cGFyZW50LmlkJiZub2RlTmFtZT09PW5hbWUpe3JldHVybiBub2RlfX1yZXR1cm4gRlMubG9va3VwKHBhcmVudCxuYW1lKX0pLGNyZWF0ZU5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUscmRldil7aWYoIUZTLkZTTm9kZSl7RlMuRlNOb2RlPShmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLHJkZXYpe2lmKCFwYXJlbnQpe3BhcmVudD10aGlzfXRoaXMucGFyZW50PXBhcmVudDt0aGlzLm1vdW50PXBhcmVudC5tb3VudDt0aGlzLm1vdW50ZWQ9bnVsbDt0aGlzLmlkPUZTLm5leHRJbm9kZSsrO3RoaXMubmFtZT1uYW1lO3RoaXMubW9kZT1tb2RlO3RoaXMubm9kZV9vcHM9e307dGhpcy5zdHJlYW1fb3BzPXt9O3RoaXMucmRldj1yZGV2fSk7RlMuRlNOb2RlLnByb3RvdHlwZT17fTt2YXIgcmVhZE1vZGU9MjkyfDczO3ZhciB3cml0ZU1vZGU9MTQ2O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZTLkZTTm9kZS5wcm90b3R5cGUse3JlYWQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5tb2RlJnJlYWRNb2RlKT09PXJlYWRNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXJlYWRNb2RlOnRoaXMubW9kZSY9fnJlYWRNb2RlfSl9LHdyaXRlOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZ3cml0ZU1vZGUpPT09d3JpdGVNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXdyaXRlTW9kZTp0aGlzLm1vZGUmPX53cml0ZU1vZGV9KX0saXNGb2xkZXI6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4gRlMuaXNEaXIodGhpcy5tb2RlKX0pfSxpc0RldmljZTp7Z2V0OihmdW5jdGlvbigpe3JldHVybiBGUy5pc0NocmRldih0aGlzLm1vZGUpfSl9fSl9dmFyIG5vZGU9bmV3IEZTLkZTTm9kZShwYXJlbnQsbmFtZSxtb2RlLHJkZXYpO0ZTLmhhc2hBZGROb2RlKG5vZGUpO3JldHVybiBub2RlfSksZGVzdHJveU5vZGU6KGZ1bmN0aW9uKG5vZGUpe0ZTLmhhc2hSZW1vdmVOb2RlKG5vZGUpfSksaXNSb290OihmdW5jdGlvbihub2RlKXtyZXR1cm4gbm9kZT09PW5vZGUucGFyZW50fSksaXNNb3VudHBvaW50OihmdW5jdGlvbihub2RlKXtyZXR1cm4hIW5vZGUubW91bnRlZH0pLGlzRmlsZTooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MzI3Njh9KSxpc0RpcjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MTYzODR9KSxpc0xpbms6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTYwfSksaXNDaHJkZXY6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTgxOTJ9KSxpc0Jsa2RldjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MjQ1NzZ9KSxpc0ZJRk86KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTZ9KSxpc1NvY2tldDooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNDkxNTIpPT09NDkxNTJ9KSxmbGFnTW9kZXM6eyJyIjowLCJycyI6MTA1MjY3MiwicisiOjIsInciOjU3Nywid3giOjcwNSwieHciOjcwNSwidysiOjU3OCwid3grIjo3MDYsInh3KyI6NzA2LCJhIjoxMDg5LCJheCI6MTIxNywieGEiOjEyMTcsImErIjoxMDkwLCJheCsiOjEyMTgsInhhKyI6MTIxOH0sbW9kZVN0cmluZ1RvRmxhZ3M6KGZ1bmN0aW9uKHN0cil7dmFyIGZsYWdzPUZTLmZsYWdNb2Rlc1tzdHJdO2lmKHR5cGVvZiBmbGFncz09PSJ1bmRlZmluZWQiKXt0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZmlsZSBvcGVuIG1vZGU6ICIrc3RyKX1yZXR1cm4gZmxhZ3N9KSxmbGFnc1RvUGVybWlzc2lvblN0cmluZzooZnVuY3Rpb24oZmxhZyl7dmFyIGFjY21vZGU9ZmxhZyYyMDk3MTU1O3ZhciBwZXJtcz1bInIiLCJ3IiwicnciXVthY2Ntb2RlXTtpZihmbGFnJjUxMil7cGVybXMrPSJ3In1yZXR1cm4gcGVybXN9KSxub2RlUGVybWlzc2lvbnM6KGZ1bmN0aW9uKG5vZGUscGVybXMpe2lmKEZTLmlnbm9yZVBlcm1pc3Npb25zKXtyZXR1cm4gMH1pZihwZXJtcy5pbmRleE9mKCJyIikhPT0tMSYmIShub2RlLm1vZGUmMjkyKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVBQ0NFU31lbHNlIGlmKHBlcm1zLmluZGV4T2YoInciKSE9PS0xJiYhKG5vZGUubW9kZSYxNDYpKXtyZXR1cm4gRVJSTk9fQ09ERVMuRUFDQ0VTfWVsc2UgaWYocGVybXMuaW5kZXhPZigieCIpIT09LTEmJiEobm9kZS5tb2RlJjczKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVBQ0NFU31yZXR1cm4gMH0pLG1heUxvb2t1cDooZnVuY3Rpb24oZGlyKXtyZXR1cm4gRlMubm9kZVBlcm1pc3Npb25zKGRpciwieCIpfSksbWF5Q3JlYXRlOihmdW5jdGlvbihkaXIsbmFtZSl7dHJ5e3ZhciBub2RlPUZTLmxvb2t1cE5vZGUoZGlyLG5hbWUpO3JldHVybiBFUlJOT19DT0RFUy5FRVhJU1R9Y2F0Y2goZSl7fXJldHVybiBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLCJ3eCIpfSksbWF5RGVsZXRlOihmdW5jdGlvbihkaXIsbmFtZSxpc2Rpcil7dmFyIG5vZGU7dHJ5e25vZGU9RlMubG9va3VwTm9kZShkaXIsbmFtZSl9Y2F0Y2goZSl7cmV0dXJuIGUuZXJybm99dmFyIGVycj1GUy5ub2RlUGVybWlzc2lvbnMoZGlyLCJ3eCIpO2lmKGVycil7cmV0dXJuIGVycn1pZihpc2Rpcil7aWYoIUZTLmlzRGlyKG5vZGUubW9kZSkpe3JldHVybiBFUlJOT19DT0RFUy5FTk9URElSfWlmKEZTLmlzUm9vdChub2RlKXx8RlMuZ2V0UGF0aChub2RlKT09PUZTLmN3ZCgpKXtyZXR1cm4gRVJSTk9fQ09ERVMuRUJVU1l9fWVsc2V7aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVJU0RJUn19cmV0dXJuIDB9KSxtYXlPcGVuOihmdW5jdGlvbihub2RlLGZsYWdzKXtpZighbm9kZSl7cmV0dXJuIEVSUk5PX0NPREVTLkVOT0VOVH1pZihGUy5pc0xpbmsobm9kZS5tb2RlKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVMT09QfWVsc2UgaWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7aWYoKGZsYWdzJjIwOTcxNTUpIT09MHx8ZmxhZ3MmNTEyKXtyZXR1cm4gRVJSTk9fQ09ERVMuRUlTRElSfX1yZXR1cm4gRlMubm9kZVBlcm1pc3Npb25zKG5vZGUsRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoZmxhZ3MpKX0pLE1BWF9PUEVOX0ZEUzo0MDk2LG5leHRmZDooZnVuY3Rpb24oZmRfc3RhcnQsZmRfZW5kKXtmZF9zdGFydD1mZF9zdGFydHx8MDtmZF9lbmQ9ZmRfZW5kfHxGUy5NQVhfT1BFTl9GRFM7Zm9yKHZhciBmZD1mZF9zdGFydDtmZDw9ZmRfZW5kO2ZkKyspe2lmKCFGUy5zdHJlYW1zW2ZkXSl7cmV0dXJuIGZkfX10aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTUZJTEUpfSksZ2V0U3RyZWFtOihmdW5jdGlvbihmZCl7cmV0dXJuIEZTLnN0cmVhbXNbZmRdfSksY3JlYXRlU3RyZWFtOihmdW5jdGlvbihzdHJlYW0sZmRfc3RhcnQsZmRfZW5kKXtpZighRlMuRlNTdHJlYW0pe0ZTLkZTU3RyZWFtPShmdW5jdGlvbigpe30pO0ZTLkZTU3RyZWFtLnByb3RvdHlwZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGUy5GU1N0cmVhbS5wcm90b3R5cGUse29iamVjdDp7Z2V0OihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGV9KSxzZXQ6KGZ1bmN0aW9uKHZhbCl7dGhpcy5ub2RlPXZhbH0pfSxpc1JlYWQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5mbGFncyYyMDk3MTU1KSE9PTF9KX0saXNXcml0ZTp7Z2V0OihmdW5jdGlvbigpe3JldHVybih0aGlzLmZsYWdzJjIwOTcxNTUpIT09MH0pfSxpc0FwcGVuZDp7Z2V0OihmdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9KX19KX12YXIgbmV3U3RyZWFtPW5ldyBGUy5GU1N0cmVhbTtmb3IodmFyIHAgaW4gc3RyZWFtKXtuZXdTdHJlYW1bcF09c3RyZWFtW3BdfXN0cmVhbT1uZXdTdHJlYW07dmFyIGZkPUZTLm5leHRmZChmZF9zdGFydCxmZF9lbmQpO3N0cmVhbS5mZD1mZDtGUy5zdHJlYW1zW2ZkXT1zdHJlYW07cmV0dXJuIHN0cmVhbX0pLGNsb3NlU3RyZWFtOihmdW5jdGlvbihmZCl7RlMuc3RyZWFtc1tmZF09bnVsbH0pLGdldFN0cmVhbUZyb21QdHI6KGZ1bmN0aW9uKHB0cil7cmV0dXJuIEZTLnN0cmVhbXNbcHRyLTFdfSksZ2V0UHRyRm9yU3RyZWFtOihmdW5jdGlvbihzdHJlYW0pe3JldHVybiBzdHJlYW0/c3RyZWFtLmZkKzE6MH0pLGNocmRldl9zdHJlYW1fb3BzOntvcGVuOihmdW5jdGlvbihzdHJlYW0pe3ZhciBkZXZpY2U9RlMuZ2V0RGV2aWNlKHN0cmVhbS5ub2RlLnJkZXYpO3N0cmVhbS5zdHJlYW1fb3BzPWRldmljZS5zdHJlYW1fb3BzO2lmKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pe3N0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKX19KSxsbHNlZWs6KGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX0pfSxtYWpvcjooZnVuY3Rpb24oZGV2KXtyZXR1cm4gZGV2Pj44fSksbWlub3I6KGZ1bmN0aW9uKGRldil7cmV0dXJuIGRldiYyNTV9KSxtYWtlZGV2OihmdW5jdGlvbihtYSxtaSl7cmV0dXJuIG1hPDw4fG1pfSkscmVnaXN0ZXJEZXZpY2U6KGZ1bmN0aW9uKGRldixvcHMpe0ZTLmRldmljZXNbZGV2XT17c3RyZWFtX29wczpvcHN9fSksZ2V0RGV2aWNlOihmdW5jdGlvbihkZXYpe3JldHVybiBGUy5kZXZpY2VzW2Rldl19KSxnZXRNb3VudHM6KGZ1bmN0aW9uKG1vdW50KXt2YXIgbW91bnRzPVtdO3ZhciBjaGVjaz1bbW91bnRdO3doaWxlKGNoZWNrLmxlbmd0aCl7dmFyIG09Y2hlY2sucG9wKCk7bW91bnRzLnB1c2gobSk7Y2hlY2sucHVzaC5hcHBseShjaGVjayxtLm1vdW50cyl9cmV0dXJuIG1vdW50c30pLHN5bmNmczooZnVuY3Rpb24ocG9wdWxhdGUsY2FsbGJhY2spe2lmKHR5cGVvZiBwb3B1bGF0ZT09PSJmdW5jdGlvbiIpe2NhbGxiYWNrPXBvcHVsYXRlO3BvcHVsYXRlPWZhbHNlfXZhciBtb3VudHM9RlMuZ2V0TW91bnRzKEZTLnJvb3QubW91bnQpO3ZhciBjb21wbGV0ZWQ9MDtmdW5jdGlvbiBkb25lKGVycil7aWYoZXJyKXtpZighZG9uZS5lcnJvcmVkKXtkb25lLmVycm9yZWQ9dHJ1ZTtyZXR1cm4gY2FsbGJhY2soZXJyKX1yZXR1cm59aWYoKytjb21wbGV0ZWQ+PW1vdW50cy5sZW5ndGgpe2NhbGxiYWNrKG51bGwpfX1tb3VudHMuZm9yRWFjaCgoZnVuY3Rpb24obW91bnQpe2lmKCFtb3VudC50eXBlLnN5bmNmcyl7cmV0dXJuIGRvbmUobnVsbCl9bW91bnQudHlwZS5zeW5jZnMobW91bnQscG9wdWxhdGUsZG9uZSl9KSl9KSxtb3VudDooZnVuY3Rpb24odHlwZSxvcHRzLG1vdW50cG9pbnQpe3ZhciByb290PW1vdW50cG9pbnQ9PT0iLyI7dmFyIHBzZXVkbz0hbW91bnRwb2ludDt2YXIgbm9kZTtpZihyb290JiZGUy5yb290KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQlVTWSl9ZWxzZSBpZighcm9vdCYmIXBzZXVkbyl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKG1vdW50cG9pbnQse2ZvbGxvd19tb3VudDpmYWxzZX0pO21vdW50cG9pbnQ9bG9va3VwLnBhdGg7bm9kZT1sb29rdXAubm9kZTtpZihGUy5pc01vdW50cG9pbnQobm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1pZighRlMuaXNEaXIobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVERJUil9fXZhciBtb3VudD17dHlwZTp0eXBlLG9wdHM6b3B0cyxtb3VudHBvaW50Om1vdW50cG9pbnQsbW91bnRzOltdfTt2YXIgbW91bnRSb290PXR5cGUubW91bnQobW91bnQpO21vdW50Um9vdC5tb3VudD1tb3VudDttb3VudC5yb290PW1vdW50Um9vdDtpZihyb290KXtGUy5yb290PW1vdW50Um9vdH1lbHNlIGlmKG5vZGUpe25vZGUubW91bnRlZD1tb3VudDtpZihub2RlLm1vdW50KXtub2RlLm1vdW50Lm1vdW50cy5wdXNoKG1vdW50KX19cmV0dXJuIG1vdW50Um9vdH0pLHVubW91bnQ6KGZ1bmN0aW9uKG1vdW50cG9pbnQpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChtb3VudHBvaW50LHtmb2xsb3dfbW91bnQ6ZmFsc2V9KTtpZighRlMuaXNNb3VudHBvaW50KGxvb2t1cC5ub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbm9kZT1sb29rdXAubm9kZTt2YXIgbW91bnQ9bm9kZS5tb3VudGVkO3ZhciBtb3VudHM9RlMuZ2V0TW91bnRzKG1vdW50KTtPYmplY3Qua2V5cyhGUy5uYW1lVGFibGUpLmZvckVhY2goKGZ1bmN0aW9uKGhhc2gpe3ZhciBjdXJyZW50PUZTLm5hbWVUYWJsZVtoYXNoXTt3aGlsZShjdXJyZW50KXt2YXIgbmV4dD1jdXJyZW50Lm5hbWVfbmV4dDtpZihtb3VudHMuaW5kZXhPZihjdXJyZW50Lm1vdW50KSE9PS0xKXtGUy5kZXN0cm95Tm9kZShjdXJyZW50KX1jdXJyZW50PW5leHR9fSkpO25vZGUubW91bnRlZD1udWxsO3ZhciBpZHg9bm9kZS5tb3VudC5tb3VudHMuaW5kZXhPZihtb3VudCk7YXNzZXJ0KGlkeCE9PS0xKTtub2RlLm1vdW50Lm1vdW50cy5zcGxpY2UoaWR4LDEpfSksbG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7cmV0dXJuIHBhcmVudC5ub2RlX29wcy5sb29rdXAocGFyZW50LG5hbWUpfSksbWtub2Q6KGZ1bmN0aW9uKHBhdGgsbW9kZSxkZXYpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgZXJyPUZTLm1heUNyZWF0ZShwYXJlbnQsbmFtZSk7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfWlmKCFwYXJlbnQubm9kZV9vcHMubWtub2Qpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1yZXR1cm4gcGFyZW50Lm5vZGVfb3BzLm1rbm9kKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0pLGNyZWF0ZTooZnVuY3Rpb24ocGF0aCxtb2RlKXttb2RlPW1vZGUhPT11bmRlZmluZWQ/bW9kZTo0Mzg7bW9kZSY9NDA5NTttb2RlfD0zMjc2ODtyZXR1cm4gRlMubWtub2QocGF0aCxtb2RlLDApfSksbWtkaXI6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7bW9kZT1tb2RlIT09dW5kZWZpbmVkP21vZGU6NTExO21vZGUmPTUxMXw1MTI7bW9kZXw9MTYzODQ7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSwwKX0pLG1rZGV2OihmdW5jdGlvbihwYXRoLG1vZGUsZGV2KXtpZih0eXBlb2YgZGV2PT09InVuZGVmaW5lZCIpe2Rldj1tb2RlO21vZGU9NDM4fW1vZGV8PTgxOTI7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSxkZXYpfSksc3ltbGluazooZnVuY3Rpb24ob2xkcGF0aCxuZXdwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgobmV3cGF0aCx7cGFyZW50OnRydWV9KTt2YXIgcGFyZW50PWxvb2t1cC5ub2RlO3ZhciBuZXduYW1lPVBBVEguYmFzZW5hbWUobmV3cGF0aCk7dmFyIGVycj1GUy5tYXlDcmVhdGUocGFyZW50LG5ld25hbWUpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLnN5bWxpbmspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1yZXR1cm4gcGFyZW50Lm5vZGVfb3BzLnN5bWxpbmsocGFyZW50LG5ld25hbWUsb2xkcGF0aCl9KSxyZW5hbWU6KGZ1bmN0aW9uKG9sZF9wYXRoLG5ld19wYXRoKXt2YXIgb2xkX2Rpcm5hbWU9UEFUSC5kaXJuYW1lKG9sZF9wYXRoKTt2YXIgbmV3X2Rpcm5hbWU9UEFUSC5kaXJuYW1lKG5ld19wYXRoKTt2YXIgb2xkX25hbWU9UEFUSC5iYXNlbmFtZShvbGRfcGF0aCk7dmFyIG5ld19uYW1lPVBBVEguYmFzZW5hbWUobmV3X3BhdGgpO3ZhciBsb29rdXAsb2xkX2RpcixuZXdfZGlyO3RyeXtsb29rdXA9RlMubG9va3VwUGF0aChvbGRfcGF0aCx7cGFyZW50OnRydWV9KTtvbGRfZGlyPWxvb2t1cC5ub2RlO2xvb2t1cD1GUy5sb29rdXBQYXRoKG5ld19wYXRoLHtwYXJlbnQ6dHJ1ZX0pO25ld19kaXI9bG9va3VwLm5vZGV9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfWlmKG9sZF9kaXIubW91bnQhPT1uZXdfZGlyLm1vdW50KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FWERFVil9dmFyIG9sZF9ub2RlPUZTLmxvb2t1cE5vZGUob2xkX2RpcixvbGRfbmFtZSk7dmFyIHJlbGF0aXZlPVBBVEgucmVsYXRpdmUob2xkX3BhdGgsbmV3X2Rpcm5hbWUpO2lmKHJlbGF0aXZlLmNoYXJBdCgwKSE9PSIuIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZWxhdGl2ZT1QQVRILnJlbGF0aXZlKG5ld19wYXRoLG9sZF9kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT0iLiIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RFTVBUWSl9dmFyIG5ld19ub2RlO3RyeXtuZXdfbm9kZT1GUy5sb29rdXBOb2RlKG5ld19kaXIsbmV3X25hbWUpfWNhdGNoKGUpe31pZihvbGRfbm9kZT09PW5ld19ub2RlKXtyZXR1cm59dmFyIGlzZGlyPUZTLmlzRGlyKG9sZF9ub2RlLm1vZGUpO3ZhciBlcnI9RlMubWF5RGVsZXRlKG9sZF9kaXIsb2xkX25hbWUsaXNkaXIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1lcnI9bmV3X25vZGU/RlMubWF5RGVsZXRlKG5ld19kaXIsbmV3X25hbWUsaXNkaXIpOkZTLm1heUNyZWF0ZShuZXdfZGlyLG5ld19uYW1lKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIW9sZF9kaXIubm9kZV9vcHMucmVuYW1lKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9aWYoRlMuaXNNb3VudHBvaW50KG9sZF9ub2RlKXx8bmV3X25vZGUmJkZTLmlzTW91bnRwb2ludChuZXdfbm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1pZihuZXdfZGlyIT09b2xkX2Rpcil7ZXJyPUZTLm5vZGVQZXJtaXNzaW9ucyhvbGRfZGlyLCJ3Iik7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfX10cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsid2lsbE1vdmVQYXRoIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxNb3ZlUGF0aCJdKG9sZF9wYXRoLG5ld19wYXRoKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ3dpbGxNb3ZlUGF0aCddKCciK29sZF9wYXRoKyInLCAnIituZXdfcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9RlMuaGFzaFJlbW92ZU5vZGUob2xkX25vZGUpO3RyeXtvbGRfZGlyLm5vZGVfb3BzLnJlbmFtZShvbGRfbm9kZSxuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt0aHJvdyBlfWZpbmFsbHl7RlMuaGFzaEFkZE5vZGUob2xkX25vZGUpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbk1vdmVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Nb3ZlUGF0aCJdKG9sZF9wYXRoLG5ld19wYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25Nb3ZlUGF0aCddKCciK29sZF9wYXRoKyInLCAnIituZXdfcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTt2YXIgZXJyPUZTLm1heURlbGV0ZShwYXJlbnQsbmFtZSx0cnVlKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIXBhcmVudC5ub2RlX29wcy5ybWRpcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKXtGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKHBhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMucm1kaXIocGFyZW50LG5hbWUpO0ZTLmRlc3Ryb3lOb2RlKG5vZGUpO3RyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXSlGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXShwYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25EZWxldGVQYXRoJ10oJyIrcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9fSkscmVhZGRpcjooZnVuY3Rpb24ocGF0aCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7aWYoIW5vZGUubm9kZV9vcHMucmVhZGRpcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVERJUil9cmV0dXJuIG5vZGUubm9kZV9vcHMucmVhZGRpcihub2RlKX0pLHVubGluazooZnVuY3Rpb24ocGF0aCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyIHBhcmVudD1sb29rdXAubm9kZTt2YXIgbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO3ZhciBlcnI9RlMubWF5RGVsZXRlKHBhcmVudCxuYW1lLGZhbHNlKTtpZihlcnIpe2lmKGVycj09PUVSUk5PX0NPREVTLkVJU0RJUillcnI9RVJSTk9fQ09ERVMuRVBFUk07dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLnVubGluayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKXtGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKHBhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMudW5saW5rKHBhcmVudCxuYW1lKTtGUy5kZXN0cm95Tm9kZShub2RlKTt0cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0ocGF0aCl9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uRGVsZXRlUGF0aCddKCciK3BhdGgrIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UpfX0pLHJlYWRsaW5rOihmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCk7dmFyIGxpbms9bG9va3VwLm5vZGU7aWYoIWxpbmsubm9kZV9vcHMucmVhZGxpbmspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuIGxpbmsubm9kZV9vcHMucmVhZGxpbmsobGluayl9KSxzdGF0OihmdW5jdGlvbihwYXRoLGRvbnRGb2xsb3cpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRGb2xsb3d9KTt2YXIgbm9kZT1sb29rdXAubm9kZTtpZighbm9kZS5ub2RlX29wcy5nZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9cmV0dXJuIG5vZGUubm9kZV9vcHMuZ2V0YXR0cihub2RlKX0pLGxzdGF0OihmdW5jdGlvbihwYXRoKXtyZXR1cm4gRlMuc3RhdChwYXRoLHRydWUpfSksY2htb2Q6KGZ1bmN0aW9uKHBhdGgsbW9kZSxkb250Rm9sbG93KXt2YXIgbm9kZTtpZih0eXBlb2YgcGF0aD09PSJzdHJpbmciKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse21vZGU6bW9kZSY0MDk1fG5vZGUubW9kZSZ+NDA5NSx0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSksbGNobW9kOihmdW5jdGlvbihwYXRoLG1vZGUpe0ZTLmNobW9kKHBhdGgsbW9kZSx0cnVlKX0pLGZjaG1vZDooZnVuY3Rpb24oZmQsbW9kZSl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1GUy5jaG1vZChzdHJlYW0ubm9kZSxtb2RlKX0pLGNob3duOihmdW5jdGlvbihwYXRoLHVpZCxnaWQsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzohZG9udEZvbGxvd30pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSksbGNob3duOihmdW5jdGlvbihwYXRoLHVpZCxnaWQpe0ZTLmNob3duKHBhdGgsdWlkLGdpZCx0cnVlKX0pLGZjaG93bjooZnVuY3Rpb24oZmQsdWlkLGdpZCl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1GUy5jaG93bihzdHJlYW0ubm9kZSx1aWQsZ2lkKX0pLHRydW5jYXRlOihmdW5jdGlvbihwYXRoLGxlbil7aWYobGVuPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTRElSKX1pZighRlMuaXNGaWxlKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIGVycj1GUy5ub2RlUGVybWlzc2lvbnMobm9kZSwidyIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1ub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSx7c2l6ZTpsZW4sdGltZXN0YW1wOkRhdGUubm93KCl9KX0pLGZ0cnVuY2F0ZTooZnVuY3Rpb24oZmQsbGVuKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfUZTLnRydW5jYXRlKHN0cmVhbS5ub2RlLGxlbil9KSx1dGltZTooZnVuY3Rpb24ocGF0aCxhdGltZSxtdGltZSl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse3RpbWVzdGFtcDpNYXRoLm1heChhdGltZSxtdGltZSl9KX0pLG9wZW46KGZ1bmN0aW9uKHBhdGgsZmxhZ3MsbW9kZSxmZF9zdGFydCxmZF9lbmQpe2ZsYWdzPXR5cGVvZiBmbGFncz09PSJzdHJpbmciP0ZTLm1vZGVTdHJpbmdUb0ZsYWdzKGZsYWdzKTpmbGFnczttb2RlPXR5cGVvZiBtb2RlPT09InVuZGVmaW5lZCI/NDM4Om1vZGU7aWYoZmxhZ3MmNjQpe21vZGU9bW9kZSY0MDk1fDMyNzY4fWVsc2V7bW9kZT0wfXZhciBub2RlO2lmKHR5cGVvZiBwYXRoPT09Im9iamVjdCIpe25vZGU9cGF0aH1lbHNle3BhdGg9UEFUSC5ub3JtYWxpemUocGF0aCk7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IShmbGFncyYxMzEwNzIpfSk7bm9kZT1sb29rdXAubm9kZX1jYXRjaChlKXt9fWlmKGZsYWdzJjY0KXtpZihub2RlKXtpZihmbGFncyYxMjgpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVFWElTVCl9fWVsc2V7bm9kZT1GUy5ta25vZChwYXRoLG1vZGUsMCl9fWlmKCFub2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfWlmKEZTLmlzQ2hyZGV2KG5vZGUubW9kZSkpe2ZsYWdzJj1+NTEyfXZhciBlcnI9RlMubWF5T3Blbihub2RlLGZsYWdzKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoZmxhZ3MmNTEyKXtGUy50cnVuY2F0ZShub2RlLDApfWZsYWdzJj1+KDEyOHw1MTIpO3ZhciBzdHJlYW09RlMuY3JlYXRlU3RyZWFtKHtub2RlOm5vZGUscGF0aDpGUy5nZXRQYXRoKG5vZGUpLGZsYWdzOmZsYWdzLHNlZWthYmxlOnRydWUscG9zaXRpb246MCxzdHJlYW1fb3BzOm5vZGUuc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjpmYWxzZX0sZmRfc3RhcnQsZmRfZW5kKTtpZihzdHJlYW0uc3RyZWFtX29wcy5vcGVuKXtzdHJlYW0uc3RyZWFtX29wcy5vcGVuKHN0cmVhbSl9aWYoTW9kdWxlWyJsb2dSZWFkRmlsZXMiXSYmIShmbGFncyYxKSl7aWYoIUZTLnJlYWRGaWxlcylGUy5yZWFkRmlsZXM9e307aWYoIShwYXRoIGluIEZTLnJlYWRGaWxlcykpe0ZTLnJlYWRGaWxlc1twYXRoXT0xO01vZHVsZVsicHJpbnRFcnIiXSgicmVhZCBmaWxlOiAiK3BhdGgpfX10cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25PcGVuRmlsZSJdKXt2YXIgdHJhY2tpbmdGbGFncz0wO2lmKChmbGFncyYyMDk3MTU1KSE9PTEpe3RyYWNraW5nRmxhZ3N8PUZTLnRyYWNraW5nLm9wZW5GbGFncy5SRUFEfWlmKChmbGFncyYyMDk3MTU1KSE9PTApe3RyYWNraW5nRmxhZ3N8PUZTLnRyYWNraW5nLm9wZW5GbGFncy5XUklURX1GUy50cmFja2luZ0RlbGVnYXRlWyJvbk9wZW5GaWxlIl0ocGF0aCx0cmFja2luZ0ZsYWdzKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uT3BlbkZpbGUnXSgnIitwYXRoKyInLCBmbGFncykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9cmV0dXJuIHN0cmVhbX0pLGNsb3NlOihmdW5jdGlvbihzdHJlYW0pe3RyeXtpZihzdHJlYW0uc3RyZWFtX29wcy5jbG9zZSl7c3RyZWFtLnN0cmVhbV9vcHMuY2xvc2Uoc3RyZWFtKX19Y2F0Y2goZSl7dGhyb3cgZX1maW5hbGx5e0ZTLmNsb3NlU3RyZWFtKHN0cmVhbS5mZCl9fSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7aWYoIXN0cmVhbS5zZWVrYWJsZXx8IXN0cmVhbS5zdHJlYW1fb3BzLmxsc2Vlayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMubGxzZWVrKHN0cmVhbSxvZmZzZXQsd2hlbmNlKX0pLHJlYWQ6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbil7aWYobGVuZ3RoPDB8fHBvc2l0aW9uPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTEpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTRElSKX1pZighc3RyZWFtLnN0cmVhbV9vcHMucmVhZCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgc2Vla2luZz10cnVlO2lmKHR5cGVvZiBwb3NpdGlvbj09PSJ1bmRlZmluZWQiKXtwb3NpdGlvbj1zdHJlYW0ucG9zaXRpb247c2Vla2luZz1mYWxzZX1lbHNlIGlmKCFzdHJlYW0uc2Vla2FibGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9dmFyIGJ5dGVzUmVhZD1zdHJlYW0uc3RyZWFtX29wcy5yZWFkKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbik7aWYoIXNlZWtpbmcpc3RyZWFtLnBvc2l0aW9uKz1ieXRlc1JlYWQ7cmV0dXJuIGJ5dGVzUmVhZH0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24sY2FuT3duKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1pZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSVNESVIpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy53cml0ZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgc2Vla2luZz10cnVlO2lmKHR5cGVvZiBwb3NpdGlvbj09PSJ1bmRlZmluZWQiKXtwb3NpdGlvbj1zdHJlYW0ucG9zaXRpb247c2Vla2luZz1mYWxzZX1lbHNlIGlmKCFzdHJlYW0uc2Vla2FibGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9aWYoc3RyZWFtLmZsYWdzJjEwMjQpe0ZTLmxsc2VlayhzdHJlYW0sMCwyKX12YXIgYnl0ZXNXcml0dGVuPXN0cmVhbS5zdHJlYW1fb3BzLndyaXRlKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixjYW5Pd24pO2lmKCFzZWVraW5nKXN0cmVhbS5wb3NpdGlvbis9Ynl0ZXNXcml0dGVuO3RyeXtpZihzdHJlYW0ucGF0aCYmRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Xcml0ZVRvRmlsZSJdKUZTLnRyYWNraW5nRGVsZWdhdGVbIm9uV3JpdGVUb0ZpbGUiXShzdHJlYW0ucGF0aCl9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uV3JpdGVUb0ZpbGUnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1yZXR1cm4gYnl0ZXNXcml0dGVufSksYWxsb2NhdGU6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKXtpZihvZmZzZXQ8MHx8bGVuZ3RoPD0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQkFERil9aWYoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSYmIUZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9aWYoIXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FT1BOT1RTVVBQKX1zdHJlYW0uc3RyZWFtX29wcy5hbGxvY2F0ZShzdHJlYW0sb2Zmc2V0LGxlbmd0aCl9KSxtbWFwOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24scHJvdCxmbGFncyl7aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTEpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVBQ0NFUyl9aWYoIXN0cmVhbS5zdHJlYW1fb3BzLm1tYXApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9cmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLm1tYXAoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLHByb3QsZmxhZ3MpfSksaW9jdGw6KGZ1bmN0aW9uKHN0cmVhbSxjbWQsYXJnKXtpZighc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RUWSl9cmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLmlvY3RsKHN0cmVhbSxjbWQsYXJnKX0pLHJlYWRGaWxlOihmdW5jdGlvbihwYXRoLG9wdHMpe29wdHM9b3B0c3x8e307b3B0cy5mbGFncz1vcHRzLmZsYWdzfHwiciI7b3B0cy5lbmNvZGluZz1vcHRzLmVuY29kaW5nfHwiYmluYXJ5IjtpZihvcHRzLmVuY29kaW5nIT09InV0ZjgiJiZvcHRzLmVuY29kaW5nIT09ImJpbmFyeSIpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmNvZGluZyB0eXBlICInK29wdHMuZW5jb2RpbmcrJyInKX12YXIgcmV0O3ZhciBzdHJlYW09RlMub3BlbihwYXRoLG9wdHMuZmxhZ3MpO3ZhciBzdGF0PUZTLnN0YXQocGF0aCk7dmFyIGxlbmd0aD1zdGF0LnNpemU7dmFyIGJ1Zj1uZXcgVWludDhBcnJheShsZW5ndGgpO0ZTLnJlYWQoc3RyZWFtLGJ1ZiwwLGxlbmd0aCwwKTtpZihvcHRzLmVuY29kaW5nPT09InV0ZjgiKXtyZXQ9IiI7dmFyIHV0Zjg9bmV3IFJ1bnRpbWUuVVRGOFByb2Nlc3Nvcjtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3JldCs9dXRmOC5wcm9jZXNzQ0NoYXIoYnVmW2ldKX19ZWxzZSBpZihvcHRzLmVuY29kaW5nPT09ImJpbmFyeSIpe3JldD1idWZ9RlMuY2xvc2Uoc3RyZWFtKTtyZXR1cm4gcmV0fSksd3JpdGVGaWxlOihmdW5jdGlvbihwYXRoLGRhdGEsb3B0cyl7b3B0cz1vcHRzfHx7fTtvcHRzLmZsYWdzPW9wdHMuZmxhZ3N8fCJ3IjtvcHRzLmVuY29kaW5nPW9wdHMuZW5jb2Rpbmd8fCJ1dGY4IjtpZihvcHRzLmVuY29kaW5nIT09InV0ZjgiJiZvcHRzLmVuY29kaW5nIT09ImJpbmFyeSIpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmNvZGluZyB0eXBlICInK29wdHMuZW5jb2RpbmcrJyInKX12YXIgc3RyZWFtPUZTLm9wZW4ocGF0aCxvcHRzLmZsYWdzLG9wdHMubW9kZSk7aWYob3B0cy5lbmNvZGluZz09PSJ1dGY4Iil7dmFyIHV0Zjg9bmV3IFJ1bnRpbWUuVVRGOFByb2Nlc3Nvcjt2YXIgYnVmPW5ldyBVaW50OEFycmF5KHV0ZjgucHJvY2Vzc0pTU3RyaW5nKGRhdGEpKTtGUy53cml0ZShzdHJlYW0sYnVmLDAsYnVmLmxlbmd0aCwwLG9wdHMuY2FuT3duKX1lbHNlIGlmKG9wdHMuZW5jb2Rpbmc9PT0iYmluYXJ5Iil7RlMud3JpdGUoc3RyZWFtLGRhdGEsMCxkYXRhLmxlbmd0aCwwLG9wdHMuY2FuT3duKX1GUy5jbG9zZShzdHJlYW0pfSksY3dkOihmdW5jdGlvbigpe3JldHVybiBGUy5jdXJyZW50UGF0aH0pLGNoZGlyOihmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTtpZighRlMuaXNEaXIobG9va3VwLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfXZhciBlcnI9RlMubm9kZVBlcm1pc3Npb25zKGxvb2t1cC5ub2RlLCJ4Iik7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfUZTLmN1cnJlbnRQYXRoPWxvb2t1cC5wYXRofSksY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzOihmdW5jdGlvbigpe0ZTLm1rZGlyKCIvdG1wIil9KSxjcmVhdGVEZWZhdWx0RGV2aWNlczooZnVuY3Rpb24oKXtGUy5ta2RpcigiL2RldiIpO0ZTLnJlZ2lzdGVyRGV2aWNlKEZTLm1ha2VkZXYoMSwzKSx7cmVhZDooZnVuY3Rpb24oKXtyZXR1cm4gMH0pLHdyaXRlOihmdW5jdGlvbigpe3JldHVybiAwfSl9KTtGUy5ta2RldigiL2Rldi9udWxsIixGUy5tYWtlZGV2KDEsMykpO1RUWS5yZWdpc3RlcihGUy5tYWtlZGV2KDUsMCksVFRZLmRlZmF1bHRfdHR5X29wcyk7VFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNiwwKSxUVFkuZGVmYXVsdF90dHkxX29wcyk7RlMubWtkZXYoIi9kZXYvdHR5IixGUy5tYWtlZGV2KDUsMCkpO0ZTLm1rZGV2KCIvZGV2L3R0eTEiLEZTLm1ha2VkZXYoNiwwKSk7RlMubWtkaXIoIi9kZXYvc2htIik7RlMubWtkaXIoIi9kZXYvc2htL3RtcCIpfSksY3JlYXRlU3RhbmRhcmRTdHJlYW1zOihmdW5jdGlvbigpe2lmKE1vZHVsZVsic3RkaW4iXSl7RlMuY3JlYXRlRGV2aWNlKCIvZGV2Iiwic3RkaW4iLE1vZHVsZVsic3RkaW4iXSl9ZWxzZXtGUy5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKX1pZihNb2R1bGVbInN0ZG91dCJdKXtGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRvdXQiLG51bGwsTW9kdWxlWyJzdGRvdXQiXSl9ZWxzZXtGUy5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0Iil9aWYoTW9kdWxlWyJzdGRlcnIiXSl7RlMuY3JlYXRlRGV2aWNlKCIvZGV2Iiwic3RkZXJyIixudWxsLE1vZHVsZVsic3RkZXJyIl0pfWVsc2V7RlMuc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKX12YXIgc3RkaW49RlMub3BlbigiL2Rldi9zdGRpbiIsInIiKTtIRUFQMzJbX3N0ZGluPj4yXT1GUy5nZXRQdHJGb3JTdHJlYW0oc3RkaW4pO2Fzc2VydChzdGRpbi5mZD09PTAsImludmFsaWQgaGFuZGxlIGZvciBzdGRpbiAoIitzdGRpbi5mZCsiKSIpO3ZhciBzdGRvdXQ9RlMub3BlbigiL2Rldi9zdGRvdXQiLCJ3Iik7SEVBUDMyW19zdGRvdXQ+PjJdPUZTLmdldFB0ckZvclN0cmVhbShzdGRvdXQpO2Fzc2VydChzdGRvdXQuZmQ9PT0xLCJpbnZhbGlkIGhhbmRsZSBmb3Igc3Rkb3V0ICgiK3N0ZG91dC5mZCsiKSIpO3ZhciBzdGRlcnI9RlMub3BlbigiL2Rldi9zdGRlcnIiLCJ3Iik7SEVBUDMyW19zdGRlcnI+PjJdPUZTLmdldFB0ckZvclN0cmVhbShzdGRlcnIpO2Fzc2VydChzdGRlcnIuZmQ9PT0yLCJpbnZhbGlkIGhhbmRsZSBmb3Igc3RkZXJyICgiK3N0ZGVyci5mZCsiKSIpfSksZW5zdXJlRXJybm9FcnJvcjooZnVuY3Rpb24oKXtpZihGUy5FcnJub0Vycm9yKXJldHVybjtGUy5FcnJub0Vycm9yPWZ1bmN0aW9uIEVycm5vRXJyb3IoZXJybm8pe3RoaXMuZXJybm89ZXJybm87Zm9yKHZhciBrZXkgaW4gRVJSTk9fQ09ERVMpe2lmKEVSUk5PX0NPREVTW2tleV09PT1lcnJubyl7dGhpcy5jb2RlPWtleTticmVha319dGhpcy5tZXNzYWdlPUVSUk5PX01FU1NBR0VTW2Vycm5vXX07RlMuRXJybm9FcnJvci5wcm90b3R5cGU9bmV3IEVycm9yO0ZTLkVycm5vRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZTLkVycm5vRXJyb3I7W0VSUk5PX0NPREVTLkVOT0VOVF0uZm9yRWFjaCgoZnVuY3Rpb24oY29kZSl7RlMuZ2VuZXJpY0Vycm9yc1tjb2RlXT1uZXcgRlMuRXJybm9FcnJvcihjb2RlKTtGUy5nZW5lcmljRXJyb3JzW2NvZGVdLnN0YWNrPSI8Z2VuZXJpYyBlcnJvciwgbm8gc3RhY2s+In0pKX0pLHN0YXRpY0luaXQ6KGZ1bmN0aW9uKCl7RlMuZW5zdXJlRXJybm9FcnJvcigpO0ZTLm5hbWVUYWJsZT1uZXcgQXJyYXkoNDA5Nik7RlMubW91bnQoTUVNRlMse30sIi8iKTtGUy5jcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKTtGUy5jcmVhdGVEZWZhdWx0RGV2aWNlcygpfSksaW5pdDooZnVuY3Rpb24oaW5wdXQsb3V0cHV0LGVycm9yKXthc3NlcnQoIUZTLmluaXQuaW5pdGlhbGl6ZWQsIkZTLmluaXQgd2FzIHByZXZpb3VzbHkgY2FsbGVkLiBJZiB5b3Ugd2FudCB0byBpbml0aWFsaXplIGxhdGVyIHdpdGggY3VzdG9tIHBhcmFtZXRlcnMsIHJlbW92ZSBhbnkgZWFybGllciBjYWxscyAobm90ZSB0aGF0IG9uZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgY29kZSkiKTtGUy5pbml0LmluaXRpYWxpemVkPXRydWU7RlMuZW5zdXJlRXJybm9FcnJvcigpO01vZHVsZVsic3RkaW4iXT1pbnB1dHx8TW9kdWxlWyJzdGRpbiJdO01vZHVsZVsic3Rkb3V0Il09b3V0cHV0fHxNb2R1bGVbInN0ZG91dCJdO01vZHVsZVsic3RkZXJyIl09ZXJyb3J8fE1vZHVsZVsic3RkZXJyIl07RlMuY3JlYXRlU3RhbmRhcmRTdHJlYW1zKCl9KSxxdWl0OihmdW5jdGlvbigpe0ZTLmluaXQuaW5pdGlhbGl6ZWQ9ZmFsc2U7Zm9yKHZhciBpPTA7aTxGUy5zdHJlYW1zLmxlbmd0aDtpKyspe3ZhciBzdHJlYW09RlMuc3RyZWFtc1tpXTtpZighc3RyZWFtKXtjb250aW51ZX1GUy5jbG9zZShzdHJlYW0pfX0pLGdldE1vZGU6KGZ1bmN0aW9uKGNhblJlYWQsY2FuV3JpdGUpe3ZhciBtb2RlPTA7aWYoY2FuUmVhZCltb2RlfD0yOTJ8NzM7aWYoY2FuV3JpdGUpbW9kZXw9MTQ2O3JldHVybiBtb2RlfSksam9pblBhdGg6KGZ1bmN0aW9uKHBhcnRzLGZvcmNlUmVsYXRpdmUpe3ZhciBwYXRoPVBBVEguam9pbi5hcHBseShudWxsLHBhcnRzKTtpZihmb3JjZVJlbGF0aXZlJiZwYXRoWzBdPT0iLyIpcGF0aD1wYXRoLnN1YnN0cigxKTtyZXR1cm4gcGF0aH0pLGFic29sdXRlUGF0aDooZnVuY3Rpb24ocmVsYXRpdmUsYmFzZSl7cmV0dXJuIFBBVEgucmVzb2x2ZShiYXNlLHJlbGF0aXZlKX0pLHN0YW5kYXJkaXplUGF0aDooZnVuY3Rpb24ocGF0aCl7cmV0dXJuIFBBVEgubm9ybWFsaXplKHBhdGgpfSksZmluZE9iamVjdDooZnVuY3Rpb24ocGF0aCxkb250UmVzb2x2ZUxhc3RMaW5rKXt2YXIgcmV0PUZTLmFuYWx5emVQYXRoKHBhdGgsZG9udFJlc29sdmVMYXN0TGluayk7aWYocmV0LmV4aXN0cyl7cmV0dXJuIHJldC5vYmplY3R9ZWxzZXtfX19zZXRFcnJObyhyZXQuZXJyb3IpO3JldHVybiBudWxsfX0pLGFuYWx5emVQYXRoOihmdW5jdGlvbihwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspe3RyeXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cGF0aD1sb29rdXAucGF0aH1jYXRjaChlKXt9dmFyIHJldD17aXNSb290OmZhbHNlLGV4aXN0czpmYWxzZSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOmZhbHNlLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3JldC5wYXJlbnRFeGlzdHM9dHJ1ZTtyZXQucGFyZW50UGF0aD1sb29rdXAucGF0aDtyZXQucGFyZW50T2JqZWN0PWxvb2t1cC5ub2RlO3JldC5uYW1lPVBBVEguYmFzZW5hbWUocGF0aCk7bG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cmV0LmV4aXN0cz10cnVlO3JldC5wYXRoPWxvb2t1cC5wYXRoO3JldC5vYmplY3Q9bG9va3VwLm5vZGU7cmV0Lm5hbWU9bG9va3VwLm5vZGUubmFtZTtyZXQuaXNSb290PWxvb2t1cC5wYXRoPT09Ii8ifWNhdGNoKGUpe3JldC5lcnJvcj1lLmVycm5vfXJldHVybiByZXR9KSxjcmVhdGVGb2xkZXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGNhblJlYWQsY2FuV3JpdGUpe3ZhciBwYXRoPVBBVEguam9pbjIodHlwZW9mIHBhcmVudD09PSJzdHJpbmciP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMubWtkaXIocGF0aCxtb2RlKX0pLGNyZWF0ZVBhdGg6KGZ1bmN0aW9uKHBhcmVudCxwYXRoLGNhblJlYWQsY2FuV3JpdGUpe3BhcmVudD10eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KTt2YXIgcGFydHM9cGF0aC5zcGxpdCgiLyIpLnJldmVyc2UoKTt3aGlsZShwYXJ0cy5sZW5ndGgpe3ZhciBwYXJ0PXBhcnRzLnBvcCgpO2lmKCFwYXJ0KWNvbnRpbnVlO3ZhciBjdXJyZW50PVBBVEguam9pbjIocGFyZW50LHBhcnQpO3RyeXtGUy5ta2RpcihjdXJyZW50KX1jYXRjaChlKXt9cGFyZW50PWN1cnJlbnR9cmV0dXJuIGN1cnJlbnR9KSxjcmVhdGVGaWxlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxwcm9wZXJ0aWVzLGNhblJlYWQsY2FuV3JpdGUpe3ZhciBwYXRoPVBBVEguam9pbjIodHlwZW9mIHBhcmVudD09PSJzdHJpbmciP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMuY3JlYXRlKHBhdGgsbW9kZSl9KSxjcmVhdGVEYXRhRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsZGF0YSxjYW5SZWFkLGNhbldyaXRlLGNhbk93bil7dmFyIHBhdGg9bmFtZT9QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT0ic3RyaW5nIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpLG5hbWUpOnBhcmVudDt2YXIgbW9kZT1GUy5nZXRNb2RlKGNhblJlYWQsY2FuV3JpdGUpO3ZhciBub2RlPUZTLmNyZWF0ZShwYXRoLG1vZGUpO2lmKGRhdGEpe2lmKHR5cGVvZiBkYXRhPT09InN0cmluZyIpe3ZhciBhcnI9bmV3IEFycmF5KGRhdGEubGVuZ3RoKTtmb3IodmFyIGk9MCxsZW49ZGF0YS5sZW5ndGg7aTxsZW47KytpKWFycltpXT1kYXRhLmNoYXJDb2RlQXQoaSk7ZGF0YT1hcnJ9RlMuY2htb2Qobm9kZSxtb2RlfDE0Nik7dmFyIHN0cmVhbT1GUy5vcGVuKG5vZGUsInciKTtGUy53cml0ZShzdHJlYW0sZGF0YSwwLGRhdGEubGVuZ3RoLDAsY2FuT3duKTtGUy5jbG9zZShzdHJlYW0pO0ZTLmNobW9kKG5vZGUsbW9kZSl9cmV0dXJuIG5vZGV9KSxjcmVhdGVEZXZpY2U6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGlucHV0LG91dHB1dCl7dmFyIHBhdGg9UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTt2YXIgbW9kZT1GUy5nZXRNb2RlKCEhaW5wdXQsISFvdXRwdXQpO2lmKCFGUy5jcmVhdGVEZXZpY2UubWFqb3IpRlMuY3JlYXRlRGV2aWNlLm1ham9yPTY0O3ZhciBkZXY9RlMubWFrZWRldihGUy5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtGUy5yZWdpc3RlckRldmljZShkZXYse29wZW46KGZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnNlZWthYmxlPWZhbHNlfSksY2xvc2U6KGZ1bmN0aW9uKHN0cmVhbSl7aWYob3V0cHV0JiZvdXRwdXQuYnVmZmVyJiZvdXRwdXQuYnVmZmVyLmxlbmd0aCl7b3V0cHV0KDEwKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXt2YXIgYnl0ZXNSZWFkPTA7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXt2YXIgcmVzdWx0O3RyeXtyZXN1bHQ9aW5wdXQoKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfWlmKHJlc3VsdD09PXVuZGVmaW5lZCYmYnl0ZXNSZWFkPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gYnl0ZXNSZWFkfSksd3JpdGU6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3Mpe2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dHJ5e291dHB1dChidWZmZXJbb2Zmc2V0K2ldKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfX1pZihsZW5ndGgpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBpfSl9KTtyZXR1cm4gRlMubWtkZXYocGF0aCxtb2RlLGRldil9KSxjcmVhdGVMaW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSx0YXJnZXQsY2FuUmVhZCxjYW5Xcml0ZSl7dmFyIHBhdGg9UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTtyZXR1cm4gRlMuc3ltbGluayh0YXJnZXQscGF0aCl9KSxmb3JjZUxvYWRGaWxlOihmdW5jdGlvbihvYmope2lmKG9iai5pc0RldmljZXx8b2JqLmlzRm9sZGVyfHxvYmoubGlua3x8b2JqLmNvbnRlbnRzKXJldHVybiB0cnVlO3ZhciBzdWNjZXNzPXRydWU7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT09InVuZGVmaW5lZCIpe3Rocm93IG5ldyBFcnJvcigiTGF6eSBsb2FkaW5nIHNob3VsZCBoYXZlIGJlZW4gcGVyZm9ybWVkIChjb250ZW50cyBzZXQpIGluIGNyZWF0ZUxhenlGaWxlLCBidXQgaXQgd2FzIG5vdC4gTGF6eSBsb2FkaW5nIG9ubHkgd29ya3MgaW4gd2ViIHdvcmtlcnMuIFVzZSAtLWVtYmVkLWZpbGUgb3IgLS1wcmVsb2FkLWZpbGUgaW4gZW1jYyBvbiB0aGUgbWFpbiB0aHJlYWQuIil9ZWxzZSBpZihNb2R1bGVbInJlYWQiXSl7dHJ5e29iai5jb250ZW50cz1pbnRBcnJheUZyb21TdHJpbmcoTW9kdWxlWyJyZWFkIl0ob2JqLnVybCksdHJ1ZSl9Y2F0Y2goZSl7c3VjY2Vzcz1mYWxzZX19ZWxzZXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfWlmKCFzdWNjZXNzKV9fX3NldEVyck5vKEVSUk5PX0NPREVTLkVJTyk7cmV0dXJuIHN1Y2Nlc3N9KSxjcmVhdGVMYXp5RmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsdXJsLGNhblJlYWQsY2FuV3JpdGUpe2Z1bmN0aW9uIExhenlVaW50OEFycmF5KCl7dGhpcy5sZW5ndGhLbm93bj1mYWxzZTt0aGlzLmNodW5rcz1bXX1MYXp5VWludDhBcnJheS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIExhenlVaW50OEFycmF5X2dldChpZHgpe2lmKGlkeD50aGlzLmxlbmd0aC0xfHxpZHg8MCl7cmV0dXJuIHVuZGVmaW5lZH12YXIgY2h1bmtPZmZzZXQ9aWR4JXRoaXMuY2h1bmtTaXplO3ZhciBjaHVua051bT1NYXRoLmZsb29yKGlkeC90aGlzLmNodW5rU2l6ZSk7cmV0dXJuIHRoaXMuZ2V0dGVyKGNodW5rTnVtKVtjaHVua09mZnNldF19O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5zZXREYXRhR2V0dGVyPWZ1bmN0aW9uIExhenlVaW50OEFycmF5X3NldERhdGFHZXR0ZXIoZ2V0dGVyKXt0aGlzLmdldHRlcj1nZXR0ZXJ9O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5jYWNoZUxlbmd0aD1mdW5jdGlvbiBMYXp5VWludDhBcnJheV9jYWNoZUxlbmd0aCgpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJIRUFEIix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIrdXJsKyIuIFN0YXR1czogIit4aHIuc3RhdHVzKTt2YXIgZGF0YWxlbmd0aD1OdW1iZXIoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LWxlbmd0aCIpKTt2YXIgaGVhZGVyO3ZhciBoYXNCeXRlU2VydmluZz0oaGVhZGVyPXhoci5nZXRSZXNwb25zZUhlYWRlcigiQWNjZXB0LVJhbmdlcyIpKSYmaGVhZGVyPT09ImJ5dGVzIjt2YXIgY2h1bmtTaXplPTEwMjQqMTAyNDtpZighaGFzQnl0ZVNlcnZpbmcpY2h1bmtTaXplPWRhdGFsZW5ndGg7dmFyIGRvWEhSPShmdW5jdGlvbihmcm9tLHRvKXtpZihmcm9tPnRvKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCByYW5nZSAoIitmcm9tKyIsICIrdG8rIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKHRvPmRhdGFsZW5ndGgtMSl0aHJvdyBuZXcgRXJyb3IoIm9ubHkgIitkYXRhbGVuZ3RoKyIgYnl0ZXMgYXZhaWxhYmxlISBwcm9ncmFtbWVyIGVycm9yISIpO3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7aWYoZGF0YWxlbmd0aCE9PWNodW5rU2l6ZSl4aHIuc2V0UmVxdWVzdEhlYWRlcigiUmFuZ2UiLCJieXRlcz0iK2Zyb20rIi0iK3RvKTtpZih0eXBlb2YgVWludDhBcnJheSE9InVuZGVmaW5lZCIpeGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO2lmKHhoci5vdmVycmlkZU1pbWVUeXBlKXt4aHIub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpfXhoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIrdXJsKyIuIFN0YXR1czogIit4aHIuc3RhdHVzKTtpZih4aHIucmVzcG9uc2UhPT11bmRlZmluZWQpe3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2V8fFtdKX1lbHNle3JldHVybiBpbnRBcnJheUZyb21TdHJpbmcoeGhyLnJlc3BvbnNlVGV4dHx8IiIsdHJ1ZSl9fSk7dmFyIGxhenlBcnJheT10aGlzO2xhenlBcnJheS5zZXREYXRhR2V0dGVyKChmdW5jdGlvbihjaHVua051bSl7dmFyIHN0YXJ0PWNodW5rTnVtKmNodW5rU2l6ZTt2YXIgZW5kPShjaHVua051bSsxKSpjaHVua1NpemUtMTtlbmQ9TWF0aC5taW4oZW5kLGRhdGFsZW5ndGgtMSk7aWYodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09InVuZGVmaW5lZCIpe2xhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPWRvWEhSKHN0YXJ0LGVuZCl9aWYodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09InVuZGVmaW5lZCIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dfSkpO3RoaXMuX2xlbmd0aD1kYXRhbGVuZ3RoO3RoaXMuX2NodW5rU2l6ZT1jaHVua1NpemU7dGhpcy5sZW5ndGhLbm93bj10cnVlfTtpZih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPT0idW5kZWZpbmVkIil7aWYoIUVOVklST05NRU5UX0lTX1dPUktFUil0aHJvdyJDYW5ub3QgZG8gc3luY2hyb25vdXMgYmluYXJ5IFhIUnMgb3V0c2lkZSB3ZWJ3b3JrZXJzIGluIG1vZGVybiBicm93c2Vycy4gVXNlIC0tZW1iZWQtZmlsZSBvciAtLXByZWxvYWQtZmlsZSBpbiBlbWNjIjt2YXIgbGF6eUFycmF5PW5ldyBMYXp5VWludDhBcnJheTtPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eUFycmF5LCJsZW5ndGgiLHtnZXQ6KGZ1bmN0aW9uKCl7aWYoIXRoaXMubGVuZ3RoS25vd24pe3RoaXMuY2FjaGVMZW5ndGgoKX1yZXR1cm4gdGhpcy5fbGVuZ3RofSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eUFycmF5LCJjaHVua1NpemUiLHtnZXQ6KGZ1bmN0aW9uKCl7aWYoIXRoaXMubGVuZ3RoS25vd24pe3RoaXMuY2FjaGVMZW5ndGgoKX1yZXR1cm4gdGhpcy5fY2h1bmtTaXplfSl9KTt2YXIgcHJvcGVydGllcz17aXNEZXZpY2U6ZmFsc2UsY29udGVudHM6bGF6eUFycmF5fX1lbHNle3ZhciBwcm9wZXJ0aWVzPXtpc0RldmljZTpmYWxzZSx1cmw6dXJsfX12YXIgbm9kZT1GUy5jcmVhdGVGaWxlKHBhcmVudCxuYW1lLHByb3BlcnRpZXMsY2FuUmVhZCxjYW5Xcml0ZSk7aWYocHJvcGVydGllcy5jb250ZW50cyl7bm9kZS5jb250ZW50cz1wcm9wZXJ0aWVzLmNvbnRlbnRzfWVsc2UgaWYocHJvcGVydGllcy51cmwpe25vZGUuY29udGVudHM9bnVsbDtub2RlLnVybD1wcm9wZXJ0aWVzLnVybH12YXIgc3RyZWFtX29wcz17fTt2YXIga2V5cz1PYmplY3Qua2V5cyhub2RlLnN0cmVhbV9vcHMpO2tleXMuZm9yRWFjaCgoZnVuY3Rpb24oa2V5KXt2YXIgZm49bm9kZS5zdHJlYW1fb3BzW2tleV07c3RyZWFtX29wc1trZXldPWZ1bmN0aW9uIGZvcmNlTG9hZExhenlGaWxlKCl7aWYoIUZTLmZvcmNlTG9hZEZpbGUobm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9cmV0dXJuIGZuLmFwcGx5KG51bGwsYXJndW1lbnRzKX19KSk7c3RyZWFtX29wcy5yZWFkPWZ1bmN0aW9uIHN0cmVhbV9vcHNfcmVhZChzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe2lmKCFGUy5mb3JjZUxvYWRGaWxlKG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfXZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50cztpZihwb3NpdGlvbj49Y29udGVudHMubGVuZ3RoKXJldHVybiAwO3ZhciBzaXplPU1hdGgubWluKGNvbnRlbnRzLmxlbmd0aC1wb3NpdGlvbixsZW5ndGgpO2Fzc2VydChzaXplPj0wKTtpZihjb250ZW50cy5zbGljZSl7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX19ZWxzZXtmb3IodmFyIGk9MDtpPHNpemU7aSsrKXtidWZmZXJbb2Zmc2V0K2ldPWNvbnRlbnRzLmdldChwb3NpdGlvbitpKX19cmV0dXJuIHNpemV9O25vZGUuc3RyZWFtX29wcz1zdHJlYW1fb3BzO3JldHVybiBub2RlfSksY3JlYXRlUHJlbG9hZGVkRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsdXJsLGNhblJlYWQsY2FuV3JpdGUsb25sb2FkLG9uZXJyb3IsZG9udENyZWF0ZUZpbGUsY2FuT3duKXtCcm93c2VyLmluaXQoKTt2YXIgZnVsbG5hbWU9bmFtZT9QQVRILnJlc29sdmUoUEFUSC5qb2luMihwYXJlbnQsbmFtZSkpOnBhcmVudDtmdW5jdGlvbiBwcm9jZXNzRGF0YShieXRlQXJyYXkpe2Z1bmN0aW9uIGZpbmlzaChieXRlQXJyYXkpe2lmKCFkb250Q3JlYXRlRmlsZSl7RlMuY3JlYXRlRGF0YUZpbGUocGFyZW50LG5hbWUsYnl0ZUFycmF5LGNhblJlYWQsY2FuV3JpdGUsY2FuT3duKX1pZihvbmxvYWQpb25sb2FkKCk7cmVtb3ZlUnVuRGVwZW5kZW5jeSgiY3AgIitmdWxsbmFtZSl9dmFyIGhhbmRsZWQ9ZmFsc2U7TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLmZvckVhY2goKGZ1bmN0aW9uKHBsdWdpbil7aWYoaGFuZGxlZClyZXR1cm47aWYocGx1Z2luWyJjYW5IYW5kbGUiXShmdWxsbmFtZSkpe3BsdWdpblsiaGFuZGxlIl0oYnl0ZUFycmF5LGZ1bGxuYW1lLGZpbmlzaCwoZnVuY3Rpb24oKXtpZihvbmVycm9yKW9uZXJyb3IoKTtyZW1vdmVSdW5EZXBlbmRlbmN5KCJjcCAiK2Z1bGxuYW1lKX0pKTtoYW5kbGVkPXRydWV9fSkpO2lmKCFoYW5kbGVkKWZpbmlzaChieXRlQXJyYXkpfWFkZFJ1bkRlcGVuZGVuY3koImNwICIrZnVsbG5hbWUpO2lmKHR5cGVvZiB1cmw9PSJzdHJpbmciKXtCcm93c2VyLmFzeW5jTG9hZCh1cmwsKGZ1bmN0aW9uKGJ5dGVBcnJheSl7cHJvY2Vzc0RhdGEoYnl0ZUFycmF5KX0pLG9uZXJyb3IpfWVsc2V7cHJvY2Vzc0RhdGEodXJsKX19KSxpbmRleGVkREI6KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbmRleGVkREJ8fHdpbmRvdy5tb3pJbmRleGVkREJ8fHdpbmRvdy53ZWJraXRJbmRleGVkREJ8fHdpbmRvdy5tc0luZGV4ZWREQn0pLERCX05BTUU6KGZ1bmN0aW9uKCl7cmV0dXJuIkVNX0ZTXyIrd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSksREJfVkVSU0lPTjoyMCxEQl9TVE9SRV9OQU1FOiJGSUxFX0RBVEEiLHNhdmVGaWxlc1RvREI6KGZ1bmN0aW9uKHBhdGhzLG9ubG9hZCxvbmVycm9yKXtvbmxvYWQ9b25sb2FkfHwoZnVuY3Rpb24oKXt9KTtvbmVycm9yPW9uZXJyb3J8fChmdW5jdGlvbigpe30pO3ZhciBpbmRleGVkREI9RlMuaW5kZXhlZERCKCk7dHJ5e3ZhciBvcGVuUmVxdWVzdD1pbmRleGVkREIub3BlbihGUy5EQl9OQU1FKCksRlMuREJfVkVSU0lPTil9Y2F0Y2goZSl7cmV0dXJuIG9uZXJyb3IoZSl9b3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkPWZ1bmN0aW9uIG9wZW5SZXF1ZXN0X29udXBncmFkZW5lZWRlZCgpe2NvbnNvbGUubG9nKCJjcmVhdGluZyBkYiIpO3ZhciBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7ZGIuY3JlYXRlT2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSl9O29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbRlMuREJfU1RPUkVfTkFNRV0sInJlYWR3cml0ZSIpO3ZhciBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXIgb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uIGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZSBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7dmFyIHB1dFJlcXVlc3Q9ZmlsZXMucHV0KEZTLmFuYWx5emVQYXRoKHBhdGgpLm9iamVjdC5jb250ZW50cyxwYXRoKTtwdXRSZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBwdXRSZXF1ZXN0X29uc3VjY2Vzcygpe29rKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9O3B1dFJlcXVlc3Qub25lcnJvcj1mdW5jdGlvbiBwdXRSZXF1ZXN0X29uZXJyb3IoKXtmYWlsKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9fSkpO3RyYW5zYWN0aW9uLm9uZXJyb3I9b25lcnJvcn07b3BlblJlcXVlc3Qub25lcnJvcj1vbmVycm9yfSksbG9hZEZpbGVzRnJvbURCOihmdW5jdGlvbihwYXRocyxvbmxvYWQsb25lcnJvcil7b25sb2FkPW9ubG9hZHx8KGZ1bmN0aW9uKCl7fSk7b25lcnJvcj1vbmVycm9yfHwoZnVuY3Rpb24oKXt9KTt2YXIgaW5kZXhlZERCPUZTLmluZGV4ZWREQigpO3RyeXt2YXIgb3BlblJlcXVlc3Q9aW5kZXhlZERCLm9wZW4oRlMuREJfTkFNRSgpLEZTLkRCX1ZFUlNJT04pfWNhdGNoKGUpe3JldHVybiBvbmVycm9yKGUpfW9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZD1vbmVycm9yO29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3RyeXt2YXIgdHJhbnNhY3Rpb249ZGIudHJhbnNhY3Rpb24oW0ZTLkRCX1NUT1JFX05BTUVdLCJyZWFkb25seSIpfWNhdGNoKGUpe29uZXJyb3IoZSk7cmV0dXJufXZhciBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXIgb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uIGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZSBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7dmFyIGdldFJlcXVlc3Q9ZmlsZXMuZ2V0KHBhdGgpO2dldFJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIGdldFJlcXVlc3Rfb25zdWNjZXNzKCl7aWYoRlMuYW5hbHl6ZVBhdGgocGF0aCkuZXhpc3RzKXtGUy51bmxpbmsocGF0aCl9RlMuY3JlYXRlRGF0YUZpbGUoUEFUSC5kaXJuYW1lKHBhdGgpLFBBVEguYmFzZW5hbWUocGF0aCksZ2V0UmVxdWVzdC5yZXN1bHQsdHJ1ZSx0cnVlLHRydWUpO29rKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9O2dldFJlcXVlc3Qub25lcnJvcj1mdW5jdGlvbiBnZXRSZXF1ZXN0X29uZXJyb3IoKXtmYWlsKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9fSkpO3RyYW5zYWN0aW9uLm9uZXJyb3I9b25lcnJvcn07b3BlblJlcXVlc3Qub25lcnJvcj1vbmVycm9yfSl9O2Z1bmN0aW9uIF9mZmx1c2goc3RyZWFtKXt9TW9kdWxlWyJfc3RybGVuIl09X3N0cmxlbjtmdW5jdGlvbiBfX3JlYWxseU5lZ2F0aXZlKHgpe3JldHVybiB4PDB8fHg9PT0wJiYxL3g9PT0tSW5maW5pdHl9ZnVuY3Rpb24gX19mb3JtYXRTdHJpbmcoZm9ybWF0LHZhcmFyZ3Mpe3ZhciB0ZXh0SW5kZXg9Zm9ybWF0O3ZhciBhcmdJbmRleD0wO2Z1bmN0aW9uIGdldE5leHRBcmcodHlwZSl7dmFyIHJldDtpZih0eXBlPT09ImRvdWJsZSIpe3JldD0oSEVBUDMyW3RlbXBEb3VibGVQdHI+PjJdPUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXSxIRUFQMzJbdGVtcERvdWJsZVB0cis0Pj4yXT1IRUFQMzJbdmFyYXJncysoYXJnSW5kZXgrNCk+PjJdLCtIRUFQRjY0W3RlbXBEb3VibGVQdHI+PjNdKX1lbHNlIGlmKHR5cGU9PSJpNjQiKXtyZXQ9W0hFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXSxIRUFQMzJbdmFyYXJncysoYXJnSW5kZXgrNCk+PjJdXX1lbHNle3R5cGU9ImkzMiI7cmV0PUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXX1hcmdJbmRleCs9UnVudGltZS5nZXROYXRpdmVGaWVsZFNpemUodHlwZSk7cmV0dXJuIHJldH12YXIgcmV0PVtdO3ZhciBjdXJyLG5leHQsY3VyckFyZzt3aGlsZSgxKXt2YXIgc3RhcnRUZXh0SW5kZXg9dGV4dEluZGV4O2N1cnI9SEVBUDhbdGV4dEluZGV4Pj4wXTtpZihjdXJyPT09MClicmVhaztuZXh0PUhFQVA4W3RleHRJbmRleCsxPj4wXTtpZihjdXJyPT0zNyl7dmFyIGZsYWdBbHdheXNTaWduZWQ9ZmFsc2U7dmFyIGZsYWdMZWZ0QWxpZ249ZmFsc2U7dmFyIGZsYWdBbHRlcm5hdGl2ZT1mYWxzZTt2YXIgZmxhZ1plcm9QYWQ9ZmFsc2U7dmFyIGZsYWdQYWRTaWduPWZhbHNlO2ZsYWdzTG9vcDp3aGlsZSgxKXtzd2l0Y2gobmV4dCl7Y2FzZSA0MzpmbGFnQWx3YXlzU2lnbmVkPXRydWU7YnJlYWs7Y2FzZSA0NTpmbGFnTGVmdEFsaWduPXRydWU7YnJlYWs7Y2FzZSAzNTpmbGFnQWx0ZXJuYXRpdmU9dHJ1ZTticmVhaztjYXNlIDQ4OmlmKGZsYWdaZXJvUGFkKXticmVhayBmbGFnc0xvb3B9ZWxzZXtmbGFnWmVyb1BhZD10cnVlO2JyZWFrfTtjYXNlIDMyOmZsYWdQYWRTaWduPXRydWU7YnJlYWs7ZGVmYXVsdDpicmVhayBmbGFnc0xvb3B9dGV4dEluZGV4Kys7bmV4dD1IRUFQOFt0ZXh0SW5kZXgrMT4+MF19dmFyIHdpZHRoPTA7aWYobmV4dD09NDIpe3dpZHRoPWdldE5leHRBcmcoImkzMiIpO3RleHRJbmRleCsrO25leHQ9SEVBUDhbdGV4dEluZGV4KzE+PjBdfWVsc2V7d2hpbGUobmV4dD49NDgmJm5leHQ8PTU3KXt3aWR0aD13aWR0aCoxMCsobmV4dC00OCk7dGV4dEluZGV4Kys7bmV4dD1IRUFQOFt0ZXh0SW5kZXgrMT4+MF19fXZhciBwcmVjaXNpb25TZXQ9ZmFsc2UscHJlY2lzaW9uPS0xO2lmKG5leHQ9PTQ2KXtwcmVjaXNpb249MDtwcmVjaXNpb25TZXQ9dHJ1ZTt0ZXh0SW5kZXgrKztuZXh0PUhFQVA4W3RleHRJbmRleCsxPj4wXTtpZihuZXh0PT00Mil7cHJlY2lzaW9uPWdldE5leHRBcmcoImkzMiIpO3RleHRJbmRleCsrfWVsc2V7d2hpbGUoMSl7dmFyIHByZWNpc2lvbkNocj1IRUFQOFt0ZXh0SW5kZXgrMT4+MF07aWYocHJlY2lzaW9uQ2hyPDQ4fHxwcmVjaXNpb25DaHI+NTcpYnJlYWs7cHJlY2lzaW9uPXByZWNpc2lvbioxMCsocHJlY2lzaW9uQ2hyLTQ4KTt0ZXh0SW5kZXgrK319bmV4dD1IRUFQOFt0ZXh0SW5kZXgrMT4+MF19aWYocHJlY2lzaW9uPDApe3ByZWNpc2lvbj02O3ByZWNpc2lvblNldD1mYWxzZX12YXIgYXJnU2l6ZTtzd2l0Y2goU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0KSl7Y2FzZSJoIjp2YXIgbmV4dE5leHQ9SEVBUDhbdGV4dEluZGV4KzI+PjBdO2lmKG5leHROZXh0PT0xMDQpe3RleHRJbmRleCsrO2FyZ1NpemU9MX1lbHNle2FyZ1NpemU9Mn1icmVhaztjYXNlImwiOnZhciBuZXh0TmV4dD1IRUFQOFt0ZXh0SW5kZXgrMj4+MF07aWYobmV4dE5leHQ9PTEwOCl7dGV4dEluZGV4Kys7YXJnU2l6ZT04fWVsc2V7YXJnU2l6ZT00fWJyZWFrO2Nhc2UiTCI6Y2FzZSJxIjpjYXNlImoiOmFyZ1NpemU9ODticmVhaztjYXNlInoiOmNhc2UidCI6Y2FzZSJJIjphcmdTaXplPTQ7YnJlYWs7ZGVmYXVsdDphcmdTaXplPW51bGx9aWYoYXJnU2l6ZSl0ZXh0SW5kZXgrKztuZXh0PUhFQVA4W3RleHRJbmRleCsxPj4wXTtzd2l0Y2goU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0KSl7Y2FzZSJkIjpjYXNlImkiOmNhc2UidSI6Y2FzZSJvIjpjYXNlIngiOmNhc2UiWCI6Y2FzZSJwIjp7dmFyIHNpZ25lZD1uZXh0PT0xMDB8fG5leHQ9PTEwNTthcmdTaXplPWFyZ1NpemV8fDQ7dmFyIGN1cnJBcmc9Z2V0TmV4dEFyZygiaSIrYXJnU2l6ZSo4KTt2YXIgb3JpZ0FyZz1jdXJyQXJnO3ZhciBhcmdUZXh0O2lmKGFyZ1NpemU9PTgpe2N1cnJBcmc9UnVudGltZS5tYWtlQmlnSW50KGN1cnJBcmdbMF0sY3VyckFyZ1sxXSxuZXh0PT0xMTcpfWlmKGFyZ1NpemU8PTQpe3ZhciBsaW1pdD1NYXRoLnBvdygyNTYsYXJnU2l6ZSktMTtjdXJyQXJnPShzaWduZWQ/cmVTaWduOnVuU2lnbikoY3VyckFyZyZsaW1pdCxhcmdTaXplKjgpfXZhciBjdXJyQWJzQXJnPU1hdGguYWJzKGN1cnJBcmcpO3ZhciBwcmVmaXg9IiI7aWYobmV4dD09MTAwfHxuZXh0PT0xMDUpe2lmKGFyZ1NpemU9PTgmJmk2NE1hdGgpYXJnVGV4dD1pNjRNYXRoLnN0cmluZ2lmeShvcmlnQXJnWzBdLG9yaWdBcmdbMV0sbnVsbCk7ZWxzZSBhcmdUZXh0PXJlU2lnbihjdXJyQXJnLDgqYXJnU2l6ZSwxKS50b1N0cmluZygxMCl9ZWxzZSBpZihuZXh0PT0xMTcpe2lmKGFyZ1NpemU9PTgmJmk2NE1hdGgpYXJnVGV4dD1pNjRNYXRoLnN0cmluZ2lmeShvcmlnQXJnWzBdLG9yaWdBcmdbMV0sdHJ1ZSk7ZWxzZSBhcmdUZXh0PXVuU2lnbihjdXJyQXJnLDgqYXJnU2l6ZSwxKS50b1N0cmluZygxMCk7Y3VyckFyZz1NYXRoLmFicyhjdXJyQXJnKX1lbHNlIGlmKG5leHQ9PTExMSl7YXJnVGV4dD0oZmxhZ0FsdGVybmF0aXZlPyIwIjoiIikrY3VyckFic0FyZy50b1N0cmluZyg4KX1lbHNlIGlmKG5leHQ9PTEyMHx8bmV4dD09ODgpe3ByZWZpeD1mbGFnQWx0ZXJuYXRpdmUmJmN1cnJBcmchPTA/IjB4IjoiIjtpZihhcmdTaXplPT04JiZpNjRNYXRoKXtpZihvcmlnQXJnWzFdKXthcmdUZXh0PShvcmlnQXJnWzFdPj4+MCkudG9TdHJpbmcoMTYpO3ZhciBsb3dlcj0ob3JpZ0FyZ1swXT4+PjApLnRvU3RyaW5nKDE2KTt3aGlsZShsb3dlci5sZW5ndGg8OClsb3dlcj0iMCIrbG93ZXI7YXJnVGV4dCs9bG93ZXJ9ZWxzZXthcmdUZXh0PShvcmlnQXJnWzBdPj4+MCkudG9TdHJpbmcoMTYpfX1lbHNlIGlmKGN1cnJBcmc8MCl7Y3VyckFyZz0tY3VyckFyZzthcmdUZXh0PShjdXJyQWJzQXJnLTEpLnRvU3RyaW5nKDE2KTt2YXIgYnVmZmVyPVtdO2Zvcih2YXIgaT0wO2k8YXJnVGV4dC5sZW5ndGg7aSsrKXtidWZmZXIucHVzaCgoMTUtcGFyc2VJbnQoYXJnVGV4dFtpXSwxNikpLnRvU3RyaW5nKDE2KSl9YXJnVGV4dD1idWZmZXIuam9pbigiIik7d2hpbGUoYXJnVGV4dC5sZW5ndGg8YXJnU2l6ZSoyKWFyZ1RleHQ9ImYiK2FyZ1RleHR9ZWxzZXthcmdUZXh0PWN1cnJBYnNBcmcudG9TdHJpbmcoMTYpfWlmKG5leHQ9PTg4KXtwcmVmaXg9cHJlZml4LnRvVXBwZXJDYXNlKCk7YXJnVGV4dD1hcmdUZXh0LnRvVXBwZXJDYXNlKCl9fWVsc2UgaWYobmV4dD09MTEyKXtpZihjdXJyQWJzQXJnPT09MCl7YXJnVGV4dD0iKG5pbCkifWVsc2V7cHJlZml4PSIweCI7YXJnVGV4dD1jdXJyQWJzQXJnLnRvU3RyaW5nKDE2KX19aWYocHJlY2lzaW9uU2V0KXt3aGlsZShhcmdUZXh0Lmxlbmd0aDxwcmVjaXNpb24pe2FyZ1RleHQ9IjAiK2FyZ1RleHR9fWlmKGN1cnJBcmc+PTApe2lmKGZsYWdBbHdheXNTaWduZWQpe3ByZWZpeD0iKyIrcHJlZml4fWVsc2UgaWYoZmxhZ1BhZFNpZ24pe3ByZWZpeD0iICIrcHJlZml4fX1pZihhcmdUZXh0LmNoYXJBdCgwKT09Ii0iKXtwcmVmaXg9Ii0iK3ByZWZpeDthcmdUZXh0PWFyZ1RleHQuc3Vic3RyKDEpfXdoaWxlKHByZWZpeC5sZW5ndGgrYXJnVGV4dC5sZW5ndGg8d2lkdGgpe2lmKGZsYWdMZWZ0QWxpZ24pe2FyZ1RleHQrPSIgIn1lbHNle2lmKGZsYWdaZXJvUGFkKXthcmdUZXh0PSIwIithcmdUZXh0fWVsc2V7cHJlZml4PSIgIitwcmVmaXh9fX1hcmdUZXh0PXByZWZpeCthcmdUZXh0O2FyZ1RleHQuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGNocil7cmV0LnB1c2goY2hyLmNoYXJDb2RlQXQoMCkpfSkpO2JyZWFrfTtjYXNlImYiOmNhc2UiRiI6Y2FzZSJlIjpjYXNlIkUiOmNhc2UiZyI6Y2FzZSJHIjp7dmFyIGN1cnJBcmc9Z2V0TmV4dEFyZygiZG91YmxlIik7dmFyIGFyZ1RleHQ7aWYoaXNOYU4oY3VyckFyZykpe2FyZ1RleHQ9Im5hbiI7ZmxhZ1plcm9QYWQ9ZmFsc2V9ZWxzZSBpZighaXNGaW5pdGUoY3VyckFyZykpe2FyZ1RleHQ9KGN1cnJBcmc8MD8iLSI6IiIpKyJpbmYiO2ZsYWdaZXJvUGFkPWZhbHNlfWVsc2V7dmFyIGlzR2VuZXJhbD1mYWxzZTt2YXIgZWZmZWN0aXZlUHJlY2lzaW9uPU1hdGgubWluKHByZWNpc2lvbiwyMCk7aWYobmV4dD09MTAzfHxuZXh0PT03MSl7aXNHZW5lcmFsPXRydWU7cHJlY2lzaW9uPXByZWNpc2lvbnx8MTt2YXIgZXhwb25lbnQ9cGFyc2VJbnQoY3VyckFyZy50b0V4cG9uZW50aWFsKGVmZmVjdGl2ZVByZWNpc2lvbikuc3BsaXQoImUiKVsxXSwxMCk7aWYocHJlY2lzaW9uPmV4cG9uZW50JiZleHBvbmVudD49LTQpe25leHQ9KG5leHQ9PTEwMz8iZiI6IkYiKS5jaGFyQ29kZUF0KDApO3ByZWNpc2lvbi09ZXhwb25lbnQrMX1lbHNle25leHQ9KG5leHQ9PTEwMz8iZSI6IkUiKS5jaGFyQ29kZUF0KDApO3ByZWNpc2lvbi0tfWVmZmVjdGl2ZVByZWNpc2lvbj1NYXRoLm1pbihwcmVjaXNpb24sMjApfWlmKG5leHQ9PTEwMXx8bmV4dD09Njkpe2FyZ1RleHQ9Y3VyckFyZy50b0V4cG9uZW50aWFsKGVmZmVjdGl2ZVByZWNpc2lvbik7aWYoL1tlRV1bLStdXGQkLy50ZXN0KGFyZ1RleHQpKXthcmdUZXh0PWFyZ1RleHQuc2xpY2UoMCwtMSkrIjAiK2FyZ1RleHQuc2xpY2UoLTEpfX1lbHNlIGlmKG5leHQ9PTEwMnx8bmV4dD09NzApe2FyZ1RleHQ9Y3VyckFyZy50b0ZpeGVkKGVmZmVjdGl2ZVByZWNpc2lvbik7aWYoY3VyckFyZz09PTAmJl9fcmVhbGx5TmVnYXRpdmUoY3VyckFyZykpe2FyZ1RleHQ9Ii0iK2FyZ1RleHR9fXZhciBwYXJ0cz1hcmdUZXh0LnNwbGl0KCJlIik7aWYoaXNHZW5lcmFsJiYhZmxhZ0FsdGVybmF0aXZlKXt3aGlsZShwYXJ0c1swXS5sZW5ndGg+MSYmcGFydHNbMF0uaW5kZXhPZigiLiIpIT0tMSYmKHBhcnRzWzBdLnNsaWNlKC0xKT09IjAifHxwYXJ0c1swXS5zbGljZSgtMSk9PSIuIikpe3BhcnRzWzBdPXBhcnRzWzBdLnNsaWNlKDAsLTEpfX1lbHNle2lmKGZsYWdBbHRlcm5hdGl2ZSYmYXJnVGV4dC5pbmRleE9mKCIuIik9PS0xKXBhcnRzWzBdKz0iLiI7d2hpbGUocHJlY2lzaW9uPmVmZmVjdGl2ZVByZWNpc2lvbisrKXBhcnRzWzBdKz0iMCJ9YXJnVGV4dD1wYXJ0c1swXSsocGFydHMubGVuZ3RoPjE/ImUiK3BhcnRzWzFdOiIiKTtpZihuZXh0PT02OSlhcmdUZXh0PWFyZ1RleHQudG9VcHBlckNhc2UoKTtpZihjdXJyQXJnPj0wKXtpZihmbGFnQWx3YXlzU2lnbmVkKXthcmdUZXh0PSIrIithcmdUZXh0fWVsc2UgaWYoZmxhZ1BhZFNpZ24pe2FyZ1RleHQ9IiAiK2FyZ1RleHR9fX13aGlsZShhcmdUZXh0Lmxlbmd0aDx3aWR0aCl7aWYoZmxhZ0xlZnRBbGlnbil7YXJnVGV4dCs9IiAifWVsc2V7aWYoZmxhZ1plcm9QYWQmJihhcmdUZXh0WzBdPT0iLSJ8fGFyZ1RleHRbMF09PSIrIikpe2FyZ1RleHQ9YXJnVGV4dFswXSsiMCIrYXJnVGV4dC5zbGljZSgxKX1lbHNle2FyZ1RleHQ9KGZsYWdaZXJvUGFkPyIwIjoiICIpK2FyZ1RleHR9fX1pZihuZXh0PDk3KWFyZ1RleHQ9YXJnVGV4dC50b1VwcGVyQ2FzZSgpO2FyZ1RleHQuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGNocil7cmV0LnB1c2goY2hyLmNoYXJDb2RlQXQoMCkpfSkpO2JyZWFrfTtjYXNlInMiOnt2YXIgYXJnPWdldE5leHRBcmcoImk4KiIpO3ZhciBhcmdMZW5ndGg9YXJnP19zdHJsZW4oYXJnKToiKG51bGwpIi5sZW5ndGg7aWYocHJlY2lzaW9uU2V0KWFyZ0xlbmd0aD1NYXRoLm1pbihhcmdMZW5ndGgscHJlY2lzaW9uKTtpZighZmxhZ0xlZnRBbGlnbil7d2hpbGUoYXJnTGVuZ3RoPHdpZHRoLS0pe3JldC5wdXNoKDMyKX19aWYoYXJnKXtmb3IodmFyIGk9MDtpPGFyZ0xlbmd0aDtpKyspe3JldC5wdXNoKEhFQVBVOFthcmcrKz4+MF0pfX1lbHNle3JldD1yZXQuY29uY2F0KGludEFycmF5RnJvbVN0cmluZygiKG51bGwpIi5zdWJzdHIoMCxhcmdMZW5ndGgpLHRydWUpKX1pZihmbGFnTGVmdEFsaWduKXt3aGlsZShhcmdMZW5ndGg8d2lkdGgtLSl7cmV0LnB1c2goMzIpfX1icmVha307Y2FzZSJjIjp7aWYoZmxhZ0xlZnRBbGlnbilyZXQucHVzaChnZXROZXh0QXJnKCJpOCIpKTt3aGlsZSgtLXdpZHRoPjApe3JldC5wdXNoKDMyKX1pZighZmxhZ0xlZnRBbGlnbilyZXQucHVzaChnZXROZXh0QXJnKCJpOCIpKTticmVha307Y2FzZSJuIjp7dmFyIHB0cj1nZXROZXh0QXJnKCJpMzIqIik7SEVBUDMyW3B0cj4+Ml09cmV0Lmxlbmd0aDticmVha307Y2FzZSIlIjp7cmV0LnB1c2goY3Vycik7YnJlYWt9O2RlZmF1bHQ6e2Zvcih2YXIgaT1zdGFydFRleHRJbmRleDtpPHRleHRJbmRleCsyO2krKyl7cmV0LnB1c2goSEVBUDhbaT4+MF0pfX19dGV4dEluZGV4Kz0yfWVsc2V7cmV0LnB1c2goY3Vycik7dGV4dEluZGV4Kz0xfX1yZXR1cm4gcmV0fWZ1bmN0aW9uIF9tYWxsb2MoYnl0ZXMpe3ZhciBwdHI9UnVudGltZS5keW5hbWljQWxsb2MoYnl0ZXMrOCk7cmV0dXJuIHB0cis4JjQyOTQ5NjcyODh9TW9kdWxlWyJfbWFsbG9jIl09X21hbGxvYztmdW5jdGlvbiBfc25wcmludGYocyxuLGZvcm1hdCx2YXJhcmdzKXt2YXIgcmVzdWx0PV9fZm9ybWF0U3RyaW5nKGZvcm1hdCx2YXJhcmdzKTt2YXIgbGltaXQ9bj09PXVuZGVmaW5lZD9yZXN1bHQubGVuZ3RoOk1hdGgubWluKHJlc3VsdC5sZW5ndGgsTWF0aC5tYXgobi0xLDApKTtpZihzPDApe3M9LXM7dmFyIGJ1Zj1fbWFsbG9jKGxpbWl0KzEpO0hFQVAzMltzPj4yXT1idWY7cz1idWZ9Zm9yKHZhciBpPTA7aTxsaW1pdDtpKyspe0hFQVA4W3MraT4+MF09cmVzdWx0W2ldfWlmKGxpbWl0PG58fG49PT11bmRlZmluZWQpSEVBUDhbcytpPj4wXT0wO3JldHVybiByZXN1bHQubGVuZ3RofWZ1bmN0aW9uIF9ta3BvcnQoKXt0aHJvdyJUT0RPIn12YXIgU09DS0ZTPXttb3VudDooZnVuY3Rpb24obW91bnQpe3JldHVybiBGUy5jcmVhdGVOb2RlKG51bGwsIi8iLDE2Mzg0fDUxMSwwKX0pLGNyZWF0ZVNvY2tldDooZnVuY3Rpb24oZmFtaWx5LHR5cGUscHJvdG9jb2wpe3ZhciBzdHJlYW1pbmc9dHlwZT09MTtpZihwcm90b2NvbCl7YXNzZXJ0KHN0cmVhbWluZz09KHByb3RvY29sPT02KSl9dmFyIHNvY2s9e2ZhbWlseTpmYW1pbHksdHlwZTp0eXBlLHByb3RvY29sOnByb3RvY29sLHNlcnZlcjpudWxsLHBlZXJzOnt9LHBlbmRpbmc6W10scmVjdl9xdWV1ZTpbXSxzb2NrX29wczpTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzfTt2YXIgbmFtZT1TT0NLRlMubmV4dG5hbWUoKTt2YXIgbm9kZT1GUy5jcmVhdGVOb2RlKFNPQ0tGUy5yb290LG5hbWUsNDkxNTIsMCk7bm9kZS5zb2NrPXNvY2s7dmFyIHN0cmVhbT1GUy5jcmVhdGVTdHJlYW0oe3BhdGg6bmFtZSxub2RlOm5vZGUsZmxhZ3M6RlMubW9kZVN0cmluZ1RvRmxhZ3MoInIrIiksc2Vla2FibGU6ZmFsc2Usc3RyZWFtX29wczpTT0NLRlMuc3RyZWFtX29wc30pO3NvY2suc3RyZWFtPXN0cmVhbTtyZXR1cm4gc29ja30pLGdldFNvY2tldDooZnVuY3Rpb24oZmQpe3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKGZkKTtpZighc3RyZWFtfHwhRlMuaXNTb2NrZXQoc3RyZWFtLm5vZGUubW9kZSkpe3JldHVybiBudWxsfXJldHVybiBzdHJlYW0ubm9kZS5zb2NrfSksc3RyZWFtX29wczp7cG9sbDooZnVuY3Rpb24oc3RyZWFtKXt2YXIgc29jaz1zdHJlYW0ubm9kZS5zb2NrO3JldHVybiBzb2NrLnNvY2tfb3BzLnBvbGwoc29jayl9KSxpb2N0bDooZnVuY3Rpb24oc3RyZWFtLHJlcXVlc3QsdmFyYXJncyl7dmFyIHNvY2s9c3RyZWFtLm5vZGUuc29jaztyZXR1cm4gc29jay5zb2NrX29wcy5pb2N0bChzb2NrLHJlcXVlc3QsdmFyYXJncyl9KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBzb2NrPXN0cmVhbS5ub2RlLnNvY2s7dmFyIG1zZz1zb2NrLnNvY2tfb3BzLnJlY3Ztc2coc29jayxsZW5ndGgpO2lmKCFtc2cpe3JldHVybiAwfWJ1ZmZlci5zZXQobXNnLmJ1ZmZlcixvZmZzZXQpO3JldHVybiBtc2cuYnVmZmVyLmxlbmd0aH0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBzb2NrPXN0cmVhbS5ub2RlLnNvY2s7cmV0dXJuIHNvY2suc29ja19vcHMuc2VuZG1zZyhzb2NrLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoKX0pLGNsb3NlOihmdW5jdGlvbihzdHJlYW0pe3ZhciBzb2NrPXN0cmVhbS5ub2RlLnNvY2s7c29jay5zb2NrX29wcy5jbG9zZShzb2NrKX0pfSxuZXh0bmFtZTooZnVuY3Rpb24oKXtpZighU09DS0ZTLm5leHRuYW1lLmN1cnJlbnQpe1NPQ0tGUy5uZXh0bmFtZS5jdXJyZW50PTB9cmV0dXJuInNvY2tldFsiK1NPQ0tGUy5uZXh0bmFtZS5jdXJyZW50KysgKyJdIn0pLHdlYnNvY2tldF9zb2NrX29wczp7Y3JlYXRlUGVlcjooZnVuY3Rpb24oc29jayxhZGRyLHBvcnQpe3ZhciB3cztpZih0eXBlb2YgYWRkcj09PSJvYmplY3QiKXt3cz1hZGRyO2FkZHI9bnVsbDtwb3J0PW51bGx9aWYod3Mpe2lmKHdzLl9zb2NrZXQpe2FkZHI9d3MuX3NvY2tldC5yZW1vdGVBZGRyZXNzO3BvcnQ9d3MuX3NvY2tldC5yZW1vdGVQb3J0fWVsc2V7dmFyIHJlc3VsdD0vd3Nbc10/OlwvXC8oW146XSspOihcZCspLy5leGVjKHdzLnVybCk7aWYoIXJlc3VsdCl7dGhyb3cgbmV3IEVycm9yKCJXZWJTb2NrZXQgVVJMIG11c3QgYmUgaW4gdGhlIGZvcm1hdCB3cyhzKTovL2FkZHJlc3M6cG9ydCIpfWFkZHI9cmVzdWx0WzFdO3BvcnQ9cGFyc2VJbnQocmVzdWx0WzJdLDEwKX19ZWxzZXt0cnl7dmFyIHJ1bnRpbWVDb25maWc9TW9kdWxlWyJ3ZWJzb2NrZXQiXSYmIm9iamVjdCI9PT10eXBlb2YgTW9kdWxlWyJ3ZWJzb2NrZXQiXTt2YXIgdXJsPSJ3czojIi5yZXBsYWNlKCIjIiwiLy8iKTtpZihydW50aW1lQ29uZmlnKXtpZigic3RyaW5nIj09PXR5cGVvZiBNb2R1bGVbIndlYnNvY2tldCJdWyJ1cmwiXSl7dXJsPU1vZHVsZVsid2Vic29ja2V0Il1bInVybCJdfX1pZih1cmw9PT0id3M6Ly8ifHx1cmw9PT0id3NzOi8vIil7dXJsPXVybCthZGRyKyI6Iitwb3J0fXZhciBzdWJQcm90b2NvbHM9ImJpbmFyeSI7aWYocnVudGltZUNvbmZpZyl7aWYoInN0cmluZyI9PT10eXBlb2YgTW9kdWxlWyJ3ZWJzb2NrZXQiXVsic3VicHJvdG9jb2wiXSl7c3ViUHJvdG9jb2xzPU1vZHVsZVsid2Vic29ja2V0Il1bInN1YnByb3RvY29sIl19fXN1YlByb3RvY29scz1zdWJQcm90b2NvbHMucmVwbGFjZSgvXiArfCArJC9nLCIiKS5zcGxpdCgvICosICovKTt2YXIgb3B0cz1FTlZJUk9OTUVOVF9JU19OT0RFP3sicHJvdG9jb2wiOnN1YlByb3RvY29scy50b1N0cmluZygpfTpzdWJQcm90b2NvbHM7dmFyIFdlYlNvY2tldD1FTlZJUk9OTUVOVF9JU19OT0RFP3JlcXVpcmUoIndzIik6d2luZG93WyJXZWJTb2NrZXQiXTt3cz1uZXcgV2ViU29ja2V0KHVybCxvcHRzKTt3cy5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciJ9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUhPU1RVTlJFQUNIKX19dmFyIHBlZXI9e2FkZHI6YWRkcixwb3J0OnBvcnQsc29ja2V0OndzLGRncmFtX3NlbmRfcXVldWU6W119O1NPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuYWRkUGVlcihzb2NrLHBlZXIpO1NPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuaGFuZGxlUGVlckV2ZW50cyhzb2NrLHBlZXIpO2lmKHNvY2sudHlwZT09PTImJnR5cGVvZiBzb2NrLnNwb3J0IT09InVuZGVmaW5lZCIpe3BlZXIuZGdyYW1fc2VuZF9xdWV1ZS5wdXNoKG5ldyBVaW50OEFycmF5KFsyNTUsMjU1LDI1NSwyNTUsInAiLmNoYXJDb2RlQXQoMCksIm8iLmNoYXJDb2RlQXQoMCksInIiLmNoYXJDb2RlQXQoMCksInQiLmNoYXJDb2RlQXQoMCksKHNvY2suc3BvcnQmNjUyODApPj44LHNvY2suc3BvcnQmMjU1XSkpfXJldHVybiBwZWVyfSksZ2V0UGVlcjooZnVuY3Rpb24oc29jayxhZGRyLHBvcnQpe3JldHVybiBzb2NrLnBlZXJzW2FkZHIrIjoiK3BvcnRdfSksYWRkUGVlcjooZnVuY3Rpb24oc29jayxwZWVyKXtzb2NrLnBlZXJzW3BlZXIuYWRkcisiOiIrcGVlci5wb3J0XT1wZWVyfSkscmVtb3ZlUGVlcjooZnVuY3Rpb24oc29jayxwZWVyKXtkZWxldGUgc29jay5wZWVyc1twZWVyLmFkZHIrIjoiK3BlZXIucG9ydF19KSxoYW5kbGVQZWVyRXZlbnRzOihmdW5jdGlvbihzb2NrLHBlZXIpe3ZhciBmaXJzdD10cnVlO3ZhciBoYW5kbGVPcGVuPShmdW5jdGlvbigpe3RyeXt2YXIgcXVldWVkPXBlZXIuZGdyYW1fc2VuZF9xdWV1ZS5zaGlmdCgpO3doaWxlKHF1ZXVlZCl7cGVlci5zb2NrZXQuc2VuZChxdWV1ZWQpO3F1ZXVlZD1wZWVyLmRncmFtX3NlbmRfcXVldWUuc2hpZnQoKX19Y2F0Y2goZSl7cGVlci5zb2NrZXQuY2xvc2UoKX19KTtmdW5jdGlvbiBoYW5kbGVNZXNzYWdlKGRhdGEpe2Fzc2VydCh0eXBlb2YgZGF0YSE9PSJzdHJpbmciJiZkYXRhLmJ5dGVMZW5ndGghPT11bmRlZmluZWQpO2RhdGE9bmV3IFVpbnQ4QXJyYXkoZGF0YSk7dmFyIHdhc2ZpcnN0PWZpcnN0O2ZpcnN0PWZhbHNlO2lmKHdhc2ZpcnN0JiZkYXRhLmxlbmd0aD09PTEwJiZkYXRhWzBdPT09MjU1JiZkYXRhWzFdPT09MjU1JiZkYXRhWzJdPT09MjU1JiZkYXRhWzNdPT09MjU1JiZkYXRhWzRdPT09InAiLmNoYXJDb2RlQXQoMCkmJmRhdGFbNV09PT0ibyIuY2hhckNvZGVBdCgwKSYmZGF0YVs2XT09PSJyIi5jaGFyQ29kZUF0KDApJiZkYXRhWzddPT09InQiLmNoYXJDb2RlQXQoMCkpe3ZhciBuZXdwb3J0PWRhdGFbOF08PDh8ZGF0YVs5XTtTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLnJlbW92ZVBlZXIoc29jayxwZWVyKTtwZWVyLnBvcnQ9bmV3cG9ydDtTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmFkZFBlZXIoc29jayxwZWVyKTtyZXR1cm59c29jay5yZWN2X3F1ZXVlLnB1c2goe2FkZHI6cGVlci5hZGRyLHBvcnQ6cGVlci5wb3J0LGRhdGE6ZGF0YX0pfWlmKEVOVklST05NRU5UX0lTX05PREUpe3BlZXIuc29ja2V0Lm9uKCJvcGVuIixoYW5kbGVPcGVuKTtwZWVyLnNvY2tldC5vbigibWVzc2FnZSIsKGZ1bmN0aW9uKGRhdGEsZmxhZ3Mpe2lmKCFmbGFncy5iaW5hcnkpe3JldHVybn1oYW5kbGVNZXNzYWdlKChuZXcgVWludDhBcnJheShkYXRhKSkuYnVmZmVyKX0pKTtwZWVyLnNvY2tldC5vbigiZXJyb3IiLChmdW5jdGlvbigpe30pKX1lbHNle3BlZXIuc29ja2V0Lm9ub3Blbj1oYW5kbGVPcGVuO3BlZXIuc29ja2V0Lm9ubWVzc2FnZT1mdW5jdGlvbiBwZWVyX3NvY2tldF9vbm1lc3NhZ2UoZXZlbnQpe2hhbmRsZU1lc3NhZ2UoZXZlbnQuZGF0YSl9fX0pLHBvbGw6KGZ1bmN0aW9uKHNvY2spe2lmKHNvY2sudHlwZT09PTEmJnNvY2suc2VydmVyKXtyZXR1cm4gc29jay5wZW5kaW5nLmxlbmd0aD82NHwxOjB9dmFyIG1hc2s9MDt2YXIgZGVzdD1zb2NrLnR5cGU9PT0xP1NPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuZ2V0UGVlcihzb2NrLHNvY2suZGFkZHIsc29jay5kcG9ydCk6bnVsbDtpZihzb2NrLnJlY3ZfcXVldWUubGVuZ3RofHwhZGVzdHx8ZGVzdCYmZGVzdC5zb2NrZXQucmVhZHlTdGF0ZT09PWRlc3Quc29ja2V0LkNMT1NJTkd8fGRlc3QmJmRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TRUQpe21hc2t8PTY0fDF9aWYoIWRlc3R8fGRlc3QmJmRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5PUEVOKXttYXNrfD00fWlmKGRlc3QmJmRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TSU5HfHxkZXN0JiZkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ0xPU0VEKXttYXNrfD0xNn1yZXR1cm4gbWFza30pLGlvY3RsOihmdW5jdGlvbihzb2NrLHJlcXVlc3QsYXJnKXtzd2l0Y2gocmVxdWVzdCl7Y2FzZSAyMTUzMTp2YXIgYnl0ZXM9MDtpZihzb2NrLnJlY3ZfcXVldWUubGVuZ3RoKXtieXRlcz1zb2NrLnJlY3ZfcXVldWVbMF0uZGF0YS5sZW5ndGh9SEVBUDMyW2FyZz4+Ml09Ynl0ZXM7cmV0dXJuIDA7ZGVmYXVsdDpyZXR1cm4gRVJSTk9fQ09ERVMuRUlOVkFMfX0pLGNsb3NlOihmdW5jdGlvbihzb2NrKXtpZihzb2NrLnNlcnZlcil7dHJ5e3NvY2suc2VydmVyLmNsb3NlKCl9Y2F0Y2goZSl7fXNvY2suc2VydmVyPW51bGx9dmFyIHBlZXJzPU9iamVjdC5rZXlzKHNvY2sucGVlcnMpO2Zvcih2YXIgaT0wO2k8cGVlcnMubGVuZ3RoO2krKyl7dmFyIHBlZXI9c29jay5wZWVyc1twZWVyc1tpXV07dHJ5e3BlZXIuc29ja2V0LmNsb3NlKCl9Y2F0Y2goZSl7fVNPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMucmVtb3ZlUGVlcihzb2NrLHBlZXIpfXJldHVybiAwfSksYmluZDooZnVuY3Rpb24oc29jayxhZGRyLHBvcnQpe2lmKHR5cGVvZiBzb2NrLnNhZGRyIT09InVuZGVmaW5lZCJ8fHR5cGVvZiBzb2NrLnNwb3J0IT09InVuZGVmaW5lZCIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9c29jay5zYWRkcj1hZGRyO3NvY2suc3BvcnQ9cG9ydHx8X21rcG9ydCgpO2lmKHNvY2sudHlwZT09PTIpe2lmKHNvY2suc2VydmVyKXtzb2NrLnNlcnZlci5jbG9zZSgpO3NvY2suc2VydmVyPW51bGx9dHJ5e3NvY2suc29ja19vcHMubGlzdGVuKHNvY2ssMCl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpdGhyb3cgZTtpZihlLmVycm5vIT09RVJSTk9fQ09ERVMuRU9QTk9UU1VQUCl0aHJvdyBlfX19KSxjb25uZWN0OihmdW5jdGlvbihzb2NrLGFkZHIscG9ydCl7aWYoc29jay5zZXJ2ZXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPRFMuRU9QTk9UU1VQUCl9aWYodHlwZW9mIHNvY2suZGFkZHIhPT0idW5kZWZpbmVkIiYmdHlwZW9mIHNvY2suZHBvcnQhPT0idW5kZWZpbmVkIil7dmFyIGRlc3Q9U09DS0ZTLndlYnNvY2tldF9zb2NrX29wcy5nZXRQZWVyKHNvY2ssc29jay5kYWRkcixzb2NrLmRwb3J0KTtpZihkZXN0KXtpZihkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ09OTkVDVElORyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFMUkVBRFkpfWVsc2V7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTQ09OTil9fX12YXIgcGVlcj1TT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmNyZWF0ZVBlZXIoc29jayxhZGRyLHBvcnQpO3NvY2suZGFkZHI9cGVlci5hZGRyO3NvY2suZHBvcnQ9cGVlci5wb3J0O3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlBST0dSRVNTKX0pLGxpc3RlbjooZnVuY3Rpb24oc29jayxiYWNrbG9nKXtpZighRU5WSVJPTk1FTlRfSVNfTk9ERSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU9QTk9UU1VQUCl9aWYoc29jay5zZXJ2ZXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIFdlYlNvY2tldFNlcnZlcj1yZXF1aXJlKCJ3cyIpLlNlcnZlcjt2YXIgaG9zdD1zb2NrLnNhZGRyO3NvY2suc2VydmVyPW5ldyBXZWJTb2NrZXRTZXJ2ZXIoe2hvc3Q6aG9zdCxwb3J0OnNvY2suc3BvcnR9KTtzb2NrLnNlcnZlci5vbigiY29ubmVjdGlvbiIsKGZ1bmN0aW9uKHdzKXtpZihzb2NrLnR5cGU9PT0xKXt2YXIgbmV3c29jaz1TT0NLRlMuY3JlYXRlU29ja2V0KHNvY2suZmFtaWx5LHNvY2sudHlwZSxzb2NrLnByb3RvY29sKTt2YXIgcGVlcj1TT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmNyZWF0ZVBlZXIobmV3c29jayx3cyk7bmV3c29jay5kYWRkcj1wZWVyLmFkZHI7bmV3c29jay5kcG9ydD1wZWVyLnBvcnQ7c29jay5wZW5kaW5nLnB1c2gobmV3c29jayl9ZWxzZXtTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmNyZWF0ZVBlZXIoc29jayx3cyl9fSkpO3NvY2suc2VydmVyLm9uKCJjbG9zZWQiLChmdW5jdGlvbigpe3NvY2suc2VydmVyPW51bGx9KSk7c29jay5zZXJ2ZXIub24oImVycm9yIiwoZnVuY3Rpb24oKXt9KSl9KSxhY2NlcHQ6KGZ1bmN0aW9uKGxpc3RlbnNvY2spe2lmKCFsaXN0ZW5zb2NrLnNlcnZlcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbmV3c29jaz1saXN0ZW5zb2NrLnBlbmRpbmcuc2hpZnQoKTtuZXdzb2NrLnN0cmVhbS5mbGFncz1saXN0ZW5zb2NrLnN0cmVhbS5mbGFncztyZXR1cm4gbmV3c29ja30pLGdldG5hbWU6KGZ1bmN0aW9uKHNvY2sscGVlcil7dmFyIGFkZHIscG9ydDtpZihwZWVyKXtpZihzb2NrLmRhZGRyPT09dW5kZWZpbmVkfHxzb2NrLmRwb3J0PT09dW5kZWZpbmVkKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9UQ09OTil9YWRkcj1zb2NrLmRhZGRyO3BvcnQ9c29jay5kcG9ydH1lbHNle2FkZHI9c29jay5zYWRkcnx8MDtwb3J0PXNvY2suc3BvcnR8fDB9cmV0dXJue2FkZHI6YWRkcixwb3J0OnBvcnR9fSksc2VuZG1zZzooZnVuY3Rpb24oc29jayxidWZmZXIsb2Zmc2V0LGxlbmd0aCxhZGRyLHBvcnQpe2lmKHNvY2sudHlwZT09PTIpe2lmKGFkZHI9PT11bmRlZmluZWR8fHBvcnQ9PT11bmRlZmluZWQpe2FkZHI9c29jay5kYWRkcjtwb3J0PXNvY2suZHBvcnR9aWYoYWRkcj09PXVuZGVmaW5lZHx8cG9ydD09PXVuZGVmaW5lZCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRURFU1RBRERSUkVRKX19ZWxzZXthZGRyPXNvY2suZGFkZHI7cG9ydD1zb2NrLmRwb3J0fXZhciBkZXN0PVNPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuZ2V0UGVlcihzb2NrLGFkZHIscG9ydCk7aWYoc29jay50eXBlPT09MSl7aWYoIWRlc3R8fGRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TSU5HfHxkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ0xPU0VEKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9UQ09OTil9ZWxzZSBpZihkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ09OTkVDVElORyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX19dmFyIGRhdGE7aWYoYnVmZmVyIGluc3RhbmNlb2YgQXJyYXl8fGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXtkYXRhPWJ1ZmZlci5zbGljZShvZmZzZXQsb2Zmc2V0K2xlbmd0aCl9ZWxzZXtkYXRhPWJ1ZmZlci5idWZmZXIuc2xpY2UoYnVmZmVyLmJ5dGVPZmZzZXQrb2Zmc2V0LGJ1ZmZlci5ieXRlT2Zmc2V0K29mZnNldCtsZW5ndGgpfWlmKHNvY2sudHlwZT09PTIpe2lmKCFkZXN0fHxkZXN0LnNvY2tldC5yZWFkeVN0YXRlIT09ZGVzdC5zb2NrZXQuT1BFTil7aWYoIWRlc3R8fGRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TSU5HfHxkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ0xPU0VEKXtkZXN0PVNPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuY3JlYXRlUGVlcihzb2NrLGFkZHIscG9ydCl9ZGVzdC5kZ3JhbV9zZW5kX3F1ZXVlLnB1c2goZGF0YSk7cmV0dXJuIGxlbmd0aH19dHJ5e2Rlc3Quc29ja2V0LnNlbmQoZGF0YSk7cmV0dXJuIGxlbmd0aH1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfX0pLHJlY3Ztc2c6KGZ1bmN0aW9uKHNvY2ssbGVuZ3RoKXtpZihzb2NrLnR5cGU9PT0xJiZzb2NrLnNlcnZlcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVENPTk4pfXZhciBxdWV1ZWQ9c29jay5yZWN2X3F1ZXVlLnNoaWZ0KCk7aWYoIXF1ZXVlZCl7aWYoc29jay50eXBlPT09MSl7dmFyIGRlc3Q9U09DS0ZTLndlYnNvY2tldF9zb2NrX29wcy5nZXRQZWVyKHNvY2ssc29jay5kYWRkcixzb2NrLmRwb3J0KTtpZighZGVzdCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVENPTk4pfWVsc2UgaWYoZGVzdC5zb2NrZXQucmVhZHlTdGF0ZT09PWRlc3Quc29ja2V0LkNMT1NJTkd8fGRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TRUQpe3JldHVybiBudWxsfWVsc2V7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX19ZWxzZXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUdBSU4pfX12YXIgcXVldWVkTGVuZ3RoPXF1ZXVlZC5kYXRhLmJ5dGVMZW5ndGh8fHF1ZXVlZC5kYXRhLmxlbmd0aDt2YXIgcXVldWVkT2Zmc2V0PXF1ZXVlZC5kYXRhLmJ5dGVPZmZzZXR8fDA7dmFyIHF1ZXVlZEJ1ZmZlcj1xdWV1ZWQuZGF0YS5idWZmZXJ8fHF1ZXVlZC5kYXRhO3ZhciBieXRlc1JlYWQ9TWF0aC5taW4obGVuZ3RoLHF1ZXVlZExlbmd0aCk7dmFyIHJlcz17YnVmZmVyOm5ldyBVaW50OEFycmF5KHF1ZXVlZEJ1ZmZlcixxdWV1ZWRPZmZzZXQsYnl0ZXNSZWFkKSxhZGRyOnF1ZXVlZC5hZGRyLHBvcnQ6cXVldWVkLnBvcnR9O2lmKHNvY2sudHlwZT09PTEmJmJ5dGVzUmVhZDxxdWV1ZWRMZW5ndGgpe3ZhciBieXRlc1JlbWFpbmluZz1xdWV1ZWRMZW5ndGgtYnl0ZXNSZWFkO3F1ZXVlZC5kYXRhPW5ldyBVaW50OEFycmF5KHF1ZXVlZEJ1ZmZlcixxdWV1ZWRPZmZzZXQrYnl0ZXNSZWFkLGJ5dGVzUmVtYWluaW5nKTtzb2NrLnJlY3ZfcXVldWUudW5zaGlmdChxdWV1ZWQpfXJldHVybiByZXN9KX19O2Z1bmN0aW9uIF9zZW5kKGZkLGJ1ZixsZW4sZmxhZ3Mpe3ZhciBzb2NrPVNPQ0tGUy5nZXRTb2NrZXQoZmQpO2lmKCFzb2NrKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuLTF9cmV0dXJuIF93cml0ZShmZCxidWYsbGVuKX1mdW5jdGlvbiBfcHdyaXRlKGZpbGRlcyxidWYsbmJ5dGUsb2Zmc2V0KXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmaWxkZXMpO2lmKCFzdHJlYW0pe19fX3NldEVyck5vKEVSUk5PX0NPREVTLkVCQURGKTtyZXR1cm4tMX10cnl7dmFyIHNsYWI9SEVBUDg7cmV0dXJuIEZTLndyaXRlKHN0cmVhbSxzbGFiLGJ1ZixuYnl0ZSxvZmZzZXQpfWNhdGNoKGUpe0ZTLmhhbmRsZUZTRXJyb3IoZSk7cmV0dXJuLTF9fWZ1bmN0aW9uIF93cml0ZShmaWxkZXMsYnVmLG5ieXRlKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmaWxkZXMpO2lmKCFzdHJlYW0pe19fX3NldEVyck5vKEVSUk5PX0NPREVTLkVCQURGKTtyZXR1cm4tMX10cnl7dmFyIHNsYWI9SEVBUDg7cmV0dXJuIEZTLndyaXRlKHN0cmVhbSxzbGFiLGJ1ZixuYnl0ZSl9Y2F0Y2goZSl7RlMuaGFuZGxlRlNFcnJvcihlKTtyZXR1cm4tMX19ZnVuY3Rpb24gX2ZpbGVubyhzdHJlYW0pe3N0cmVhbT1GUy5nZXRTdHJlYW1Gcm9tUHRyKHN0cmVhbSk7aWYoIXN0cmVhbSlyZXR1cm4tMTtyZXR1cm4gc3RyZWFtLmZkfWZ1bmN0aW9uIF9md3JpdGUocHRyLHNpemUsbml0ZW1zLHN0cmVhbSl7dmFyIGJ5dGVzVG9Xcml0ZT1uaXRlbXMqc2l6ZTtpZihieXRlc1RvV3JpdGU9PTApcmV0dXJuIDA7dmFyIGZkPV9maWxlbm8oc3RyZWFtKTt2YXIgYnl0ZXNXcml0dGVuPV93cml0ZShmZCxwdHIsYnl0ZXNUb1dyaXRlKTtpZihieXRlc1dyaXR0ZW49PS0xKXt2YXIgc3RyZWFtT2JqPUZTLmdldFN0cmVhbUZyb21QdHIoc3RyZWFtKTtpZihzdHJlYW1PYmopc3RyZWFtT2JqLmVycm9yPXRydWU7cmV0dXJuIDB9ZWxzZXtyZXR1cm4gTWF0aC5mbG9vcihieXRlc1dyaXR0ZW4vc2l6ZSl9fWZ1bmN0aW9uIF9yZWN2KGZkLGJ1ZixsZW4sZmxhZ3Mpe3ZhciBzb2NrPVNPQ0tGUy5nZXRTb2NrZXQoZmQpO2lmKCFzb2NrKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuLTF9cmV0dXJuIF9yZWFkKGZkLGJ1ZixsZW4pfWZ1bmN0aW9uIF9wcmVhZChmaWxkZXMsYnVmLG5ieXRlLG9mZnNldCl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmlsZGVzKTtpZighc3RyZWFtKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuLTF9dHJ5e3ZhciBzbGFiPUhFQVA4O3JldHVybiBGUy5yZWFkKHN0cmVhbSxzbGFiLGJ1ZixuYnl0ZSxvZmZzZXQpfWNhdGNoKGUpe0ZTLmhhbmRsZUZTRXJyb3IoZSk7cmV0dXJuLTF9fWZ1bmN0aW9uIF9yZWFkKGZpbGRlcyxidWYsbmJ5dGUpe3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKGZpbGRlcyk7aWYoIXN0cmVhbSl7X19fc2V0RXJyTm8oRVJSTk9fQ09ERVMuRUJBREYpO3JldHVybi0xfXRyeXt2YXIgc2xhYj1IRUFQODtyZXR1cm4gRlMucmVhZChzdHJlYW0sc2xhYixidWYsbmJ5dGUpfWNhdGNoKGUpe0ZTLmhhbmRsZUZTRXJyb3IoZSk7cmV0dXJuLTF9fWZ1bmN0aW9uIF9mcmVhZChwdHIsc2l6ZSxuaXRlbXMsc3RyZWFtKXt2YXIgYnl0ZXNUb1JlYWQ9bml0ZW1zKnNpemU7aWYoYnl0ZXNUb1JlYWQ9PTApe3JldHVybiAwfXZhciBieXRlc1JlYWQ9MDt2YXIgc3RyZWFtT2JqPUZTLmdldFN0cmVhbUZyb21QdHIoc3RyZWFtKTtpZighc3RyZWFtT2JqKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuIDB9d2hpbGUoc3RyZWFtT2JqLnVuZ290dGVuLmxlbmd0aCYmYnl0ZXNUb1JlYWQ+MCl7SEVBUDhbcHRyKys+PjBdPXN0cmVhbU9iai51bmdvdHRlbi5wb3AoKTtieXRlc1RvUmVhZC0tO2J5dGVzUmVhZCsrfXZhciBlcnI9X3JlYWQoc3RyZWFtT2JqLmZkLHB0cixieXRlc1RvUmVhZCk7aWYoZXJyPT0tMSl7aWYoc3RyZWFtT2JqKXN0cmVhbU9iai5lcnJvcj10cnVlO3JldHVybiAwfWJ5dGVzUmVhZCs9ZXJyO2lmKGJ5dGVzUmVhZDxieXRlc1RvUmVhZClzdHJlYW1PYmouZW9mPXRydWU7cmV0dXJuIE1hdGguZmxvb3IoYnl0ZXNSZWFkL3NpemUpfWZ1bmN0aW9uIF9mZ2V0YyhzdHJlYW0pe3ZhciBzdHJlYW1PYmo9RlMuZ2V0U3RyZWFtRnJvbVB0cihzdHJlYW0pO2lmKCFzdHJlYW1PYmopcmV0dXJuLTE7aWYoc3RyZWFtT2JqLmVvZnx8c3RyZWFtT2JqLmVycm9yKXJldHVybi0xO3ZhciByZXQ9X2ZyZWFkKF9mZ2V0Yy5yZXQsMSwxLHN0cmVhbSk7aWYocmV0PT0wKXtyZXR1cm4tMX1lbHNlIGlmKHJldD09LTEpe3N0cmVhbU9iai5lcnJvcj10cnVlO3JldHVybi0xfWVsc2V7cmV0dXJuIEhFQVBVOFtfZmdldGMucmV0Pj4wXX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW12YWwoKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfZW12YWwiKTthYm9ydCgtMSl9ZnVuY3Rpb24gX19fZ3h4X3BlcnNvbmFsaXR5X3YwKCl7fWZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpe3N3aXRjaChuYW1lKXtjYXNlIDMwOnJldHVybiBQQUdFX1NJWkU7Y2FzZSAxMzI6Y2FzZSAxMzM6Y2FzZSAxMjpjYXNlIDEzNzpjYXNlIDEzODpjYXNlIDE1OmNhc2UgMjM1OmNhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgMTk6Y2FzZSAyMDpjYXNlIDE0OTpjYXNlIDEzOmNhc2UgMTA6Y2FzZSAyMzY6Y2FzZSAxNTM6Y2FzZSA5OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDE1OTpjYXNlIDE1NDpjYXNlIDE0OmNhc2UgNzc6Y2FzZSA3ODpjYXNlIDEzOTpjYXNlIDgwOmNhc2UgODE6Y2FzZSA3OTpjYXNlIDgyOmNhc2UgNjg6Y2FzZSA2NzpjYXNlIDE2NDpjYXNlIDExOmNhc2UgMjk6Y2FzZSA0NzpjYXNlIDQ4OmNhc2UgOTU6Y2FzZSA1MjpjYXNlIDUxOmNhc2UgNDY6cmV0dXJuIDIwMDgwOTtjYXNlIDI3OmNhc2UgMjQ2OmNhc2UgMTI3OmNhc2UgMTI4OmNhc2UgMjM6Y2FzZSAyNDpjYXNlIDE2MDpjYXNlIDE2MTpjYXNlIDE4MTpjYXNlIDE4MjpjYXNlIDI0MjpjYXNlIDE4MzpjYXNlIDE4NDpjYXNlIDI0MzpjYXNlIDI0NDpjYXNlIDI0NTpjYXNlIDE2NTpjYXNlIDE3ODpjYXNlIDE3OTpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSAxNjg6Y2FzZSAxNjk6Y2FzZSAxNzU6Y2FzZSAxNzA6Y2FzZSAxNzE6Y2FzZSAxNzI6Y2FzZSA5NzpjYXNlIDc2OmNhc2UgMzI6Y2FzZSAxNzM6Y2FzZSAzNTpyZXR1cm4tMTtjYXNlIDE3NjpjYXNlIDE3NzpjYXNlIDc6Y2FzZSAxNTU6Y2FzZSA4OmNhc2UgMTU3OmNhc2UgMTI1OmNhc2UgMTI2OmNhc2UgOTI6Y2FzZSA5MzpjYXNlIDEyOTpjYXNlIDEzMDpjYXNlIDEzMTpjYXNlIDk0OmNhc2UgOTE6cmV0dXJuIDE7Y2FzZSA3NDpjYXNlIDYwOmNhc2UgNjk6Y2FzZSA3MDpjYXNlIDQ6cmV0dXJuIDEwMjQ7Y2FzZSAzMTpjYXNlIDQyOmNhc2UgNzI6cmV0dXJuIDMyO2Nhc2UgODc6Y2FzZSAyNjpjYXNlIDMzOnJldHVybiAyMTQ3NDgzNjQ3O2Nhc2UgMzQ6Y2FzZSAxOnJldHVybiA0NzgzOTtjYXNlIDM4OmNhc2UgMzY6cmV0dXJuIDk5O2Nhc2UgNDM6Y2FzZSAzNzpyZXR1cm4gMjA0ODtjYXNlIDA6cmV0dXJuIDIwOTcxNTI7Y2FzZSAzOnJldHVybiA2NTUzNjtjYXNlIDI4OnJldHVybiAzMjc2ODtjYXNlIDQ0OnJldHVybiAzMjc2NztjYXNlIDc1OnJldHVybiAxNjM4NDtjYXNlIDM5OnJldHVybiAxZTM7Y2FzZSA4OTpyZXR1cm4gNzAwO2Nhc2UgNzE6cmV0dXJuIDI1NjtjYXNlIDQwOnJldHVybiAyNTU7Y2FzZSAyOnJldHVybiAxMDA7Y2FzZSAxODA6cmV0dXJuIDY0O2Nhc2UgMjU6cmV0dXJuIDIwO2Nhc2UgNTpyZXR1cm4gMTY7Y2FzZSA2OnJldHVybiA2O2Nhc2UgNzM6cmV0dXJuIDQ7Y2FzZSA4NDpyZXR1cm4gMX1fX19zZXRFcnJObyhFUlJOT19DT0RFUy5FSU5WQUwpO3JldHVybi0xfU1vZHVsZVsiX2JpdHNoaWZ0NjRMc2hyIl09X2JpdHNoaWZ0NjRMc2hyO2Z1bmN0aW9uIF9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCl7cmV0dXJuIDB9ZnVuY3Rpb24gX19leGl0KHN0YXR1cyl7TW9kdWxlWyJleGl0Il0oc3RhdHVzKX1mdW5jdGlvbiBfZXhpdChzdGF0dXMpe19fZXhpdChzdGF0dXMpfWZ1bmN0aW9uIF9fWlN0OXRlcm1pbmF0ZXYoKXtfZXhpdCgtMTIzNCl9ZnVuY3Rpb24gX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCl7fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCxzcmMsbnVtKXtIRUFQVTguc2V0KEhFQVBVOC5zdWJhcnJheShzcmMsc3JjK251bSksZGVzdCk7cmV0dXJuIGRlc3R9TW9kdWxlWyJfbWVtY3B5Il09X21lbWNweTtmdW5jdGlvbiBfc2JyayhieXRlcyl7dmFyIHNlbGY9X3Nicms7aWYoIXNlbGYuY2FsbGVkKXtEWU5BTUlDVE9QPWFsaWduTWVtb3J5UGFnZShEWU5BTUlDVE9QKTtzZWxmLmNhbGxlZD10cnVlO2Fzc2VydChSdW50aW1lLmR5bmFtaWNBbGxvYyk7c2VsZi5hbGxvYz1SdW50aW1lLmR5bmFtaWNBbGxvYztSdW50aW1lLmR5bmFtaWNBbGxvYz0oZnVuY3Rpb24oKXthYm9ydCgiY2Fubm90IGR5bmFtaWNhbGx5IGFsbG9jYXRlLCBzYnJrIG5vdyBoYXMgY29udHJvbCIpfSl9dmFyIHJldD1EWU5BTUlDVE9QO2lmKGJ5dGVzIT0wKXNlbGYuYWxsb2MoYnl0ZXMpO3JldHVybiByZXR9ZnVuY3Rpb24gX25ld2xvY2FsZShtYXNrLGxvY2FsZSxiYXNlKXtyZXR1cm4gX21hbGxvYyg0KX1Nb2R1bGVbIl9tZW1tb3ZlIl09X21lbW1vdmU7ZnVuY3Rpb24gX19fZXJybm9fbG9jYXRpb24oKXtyZXR1cm4gX19fZXJybm9fc3RhdGV9ZnVuY3Rpb24gX3N0cmVycm9yX3IoZXJybnVtLHN0cmVycmJ1ZixidWZsZW4pe2lmKGVycm51bSBpbiBFUlJOT19NRVNTQUdFUyl7aWYoRVJSTk9fTUVTU0FHRVNbZXJybnVtXS5sZW5ndGg+YnVmbGVuLTEpe3JldHVybiBfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FUkFOR0UpfWVsc2V7dmFyIG1zZz1FUlJOT19NRVNTQUdFU1tlcnJudW1dO3dyaXRlQXNjaWlUb01lbW9yeShtc2csc3RyZXJyYnVmKTtyZXR1cm4gMH19ZWxzZXtyZXR1cm4gX19fc2V0RXJyTm8oRVJSTk9fQ09ERVMuRUlOVkFMKX19ZnVuY3Rpb24gX3N0cmVycm9yKGVycm51bSl7aWYoIV9zdHJlcnJvci5idWZmZXIpX3N0cmVycm9yLmJ1ZmZlcj1fbWFsbG9jKDI1Nik7X3N0cmVycm9yX3IoZXJybnVtLF9zdHJlcnJvci5idWZmZXIsMjU2KTtyZXR1cm4gX3N0cmVycm9yLmJ1ZmZlcn1mdW5jdGlvbiBfcHRocmVhZF9tdXRleF9kZXN0cm95KCl7fWZ1bmN0aW9uIF9jYXRjbG9zZShjYXRkKXtyZXR1cm4gMH1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldygpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldyIpO2Fib3J0KC0xKX1mdW5jdGlvbiBfX19jeGFfZ3VhcmRfcmVsZWFzZSgpe31mdW5jdGlvbiBfdW5nZXRjKGMsc3RyZWFtKXtzdHJlYW09RlMuZ2V0U3RyZWFtRnJvbVB0cihzdHJlYW0pO2lmKCFzdHJlYW0pe3JldHVybi0xfWlmKGM9PT0tMSl7cmV0dXJuIGN9Yz11blNpZ24oYyYyNTUpO3N0cmVhbS51bmdvdHRlbi5wdXNoKGMpO3N0cmVhbS5lb2Y9ZmFsc2U7cmV0dXJuIGN9ZnVuY3Rpb24gX3VzZWxvY2FsZShsb2NhbGUpe3JldHVybiAwfWZ1bmN0aW9uIF92c25wcmludGYocyxuLGZvcm1hdCx2YV9hcmcpe3JldHVybiBfc25wcmludGYocyxuLGZvcm1hdCxIRUFQMzJbdmFfYXJnPj4yXSl9ZnVuY3Rpb24gX19nZXRGbG9hdCh0ZXh0KXtyZXR1cm4vXlsrLV0/WzAtOV0qXC4/WzAtOV0rKFtlRV1bKy1dP1swLTldKyk/Ly5leGVjKHRleHQpfWZ1bmN0aW9uIF9fc2NhblN0cmluZyhmb3JtYXQsZ2V0LHVuZ2V0LHZhcmFyZ3Mpe2lmKCFfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSl7X19zY2FuU3RyaW5nLndoaXRlU3BhY2U9e307X19zY2FuU3RyaW5nLndoaXRlU3BhY2VbMzJdPTE7X19zY2FuU3RyaW5nLndoaXRlU3BhY2VbOV09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxMF09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxMV09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxMl09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxM109MX1mb3JtYXQ9UG9pbnRlcl9zdHJpbmdpZnkoZm9ybWF0KTt2YXIgc29GYXI9MDtpZihmb3JtYXQuaW5kZXhPZigiJW4iKT49MCl7dmFyIF9nZXQ9Z2V0O2dldD1mdW5jdGlvbiBnZXQoKXtzb0ZhcisrO3JldHVybiBfZ2V0KCl9O3ZhciBfdW5nZXQ9dW5nZXQ7dW5nZXQ9ZnVuY3Rpb24gdW5nZXQoKXtzb0Zhci0tO3JldHVybiBfdW5nZXQoKX19dmFyIGZvcm1hdEluZGV4PTA7dmFyIGFyZ3NpPTA7dmFyIGZpZWxkcz0wO3ZhciBhcmdJbmRleD0wO3ZhciBuZXh0O21haW5Mb29wOmZvcih2YXIgZm9ybWF0SW5kZXg9MDtmb3JtYXRJbmRleDxmb3JtYXQubGVuZ3RoOyl7aWYoZm9ybWF0W2Zvcm1hdEluZGV4XT09PSIlIiYmZm9ybWF0W2Zvcm1hdEluZGV4KzFdPT0ibiIpe3ZhciBhcmdQdHI9SEVBUDMyW3ZhcmFyZ3MrYXJnSW5kZXg+PjJdO2FyZ0luZGV4Kz1SdW50aW1lLmdldEFsaWduU2l6ZSgidm9pZCoiLG51bGwsdHJ1ZSk7SEVBUDMyW2FyZ1B0cj4+Ml09c29GYXI7Zm9ybWF0SW5kZXgrPTI7Y29udGludWV9aWYoZm9ybWF0W2Zvcm1hdEluZGV4XT09PSIlIil7dmFyIG5leHRDPWZvcm1hdC5pbmRleE9mKCJjIixmb3JtYXRJbmRleCsxKTtpZihuZXh0Qz4wKXt2YXIgbWF4eD0xO2lmKG5leHRDPmZvcm1hdEluZGV4KzEpe3ZhciBzdWI9Zm9ybWF0LnN1YnN0cmluZyhmb3JtYXRJbmRleCsxLG5leHRDKTttYXh4PXBhcnNlSW50KHN1Yik7aWYobWF4eCE9c3ViKW1heHg9MH1pZihtYXh4KXt2YXIgYXJnUHRyPUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXTthcmdJbmRleCs9UnVudGltZS5nZXRBbGlnblNpemUoInZvaWQqIixudWxsLHRydWUpO2ZpZWxkcysrO2Zvcih2YXIgaT0wO2k8bWF4eDtpKyspe25leHQ9Z2V0KCk7SEVBUDhbYXJnUHRyKys+PjBdPW5leHQ7aWYobmV4dD09PTApcmV0dXJuIGk+MD9maWVsZHM6ZmllbGRzLTF9Zm9ybWF0SW5kZXgrPW5leHRDLWZvcm1hdEluZGV4KzE7Y29udGludWV9fX1pZihmb3JtYXRbZm9ybWF0SW5kZXhdPT09IiUiJiZmb3JtYXQuaW5kZXhPZigiWyIsZm9ybWF0SW5kZXgrMSk+MCl7dmFyIG1hdGNoPS9cJShbMC05XSopXFsoXF4pPyhcXT9bXlxdXSopXF0vLmV4ZWMoZm9ybWF0LnN1YnN0cmluZyhmb3JtYXRJbmRleCkpO2lmKG1hdGNoKXt2YXIgbWF4TnVtQ2hhcmFjdGVycz1wYXJzZUludChtYXRjaFsxXSl8fEluZmluaXR5O3ZhciBuZWdhdGVTY2FuTGlzdD1tYXRjaFsyXT09PSJeIjt2YXIgc2Nhbkxpc3Q9bWF0Y2hbM107dmFyIG1pZGRsZURhc2hNYXRjaDt3aGlsZShtaWRkbGVEYXNoTWF0Y2g9LyhbXlwtXSlcLShbXlwtXSkvLmV4ZWMoc2Nhbkxpc3QpKXt2YXIgcmFuZ2VTdGFydENoYXJDb2RlPW1pZGRsZURhc2hNYXRjaFsxXS5jaGFyQ29kZUF0KDApO3ZhciByYW5nZUVuZENoYXJDb2RlPW1pZGRsZURhc2hNYXRjaFsyXS5jaGFyQ29kZUF0KDApO2Zvcih2YXIgZXhwYW5kZWQ9IiI7cmFuZ2VTdGFydENoYXJDb2RlPD1yYW5nZUVuZENoYXJDb2RlO2V4cGFuZGVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJhbmdlU3RhcnRDaGFyQ29kZSsrKSk7c2Nhbkxpc3Q9c2Nhbkxpc3QucmVwbGFjZShtaWRkbGVEYXNoTWF0Y2hbMV0rIi0iK21pZGRsZURhc2hNYXRjaFsyXSxleHBhbmRlZCl9dmFyIGFyZ1B0cj1IRUFQMzJbdmFyYXJncythcmdJbmRleD4+Ml07YXJnSW5kZXgrPVJ1bnRpbWUuZ2V0QWxpZ25TaXplKCJ2b2lkKiIsbnVsbCx0cnVlKTtmaWVsZHMrKztmb3IodmFyIGk9MDtpPG1heE51bUNoYXJhY3RlcnM7aSsrKXtuZXh0PWdldCgpO2lmKG5lZ2F0ZVNjYW5MaXN0KXtpZihzY2FuTGlzdC5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpPDApe0hFQVA4W2FyZ1B0cisrPj4wXT1uZXh0fWVsc2V7dW5nZXQoKTticmVha319ZWxzZXtpZihzY2FuTGlzdC5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpPj0wKXtIRUFQOFthcmdQdHIrKz4+MF09bmV4dH1lbHNle3VuZ2V0KCk7YnJlYWt9fX1IRUFQOFthcmdQdHIrKz4+MF09MDtmb3JtYXRJbmRleCs9bWF0Y2hbMF0ubGVuZ3RoO2NvbnRpbnVlfX13aGlsZSgxKXtuZXh0PWdldCgpO2lmKG5leHQ9PTApcmV0dXJuIGZpZWxkcztpZighKG5leHQgaW4gX19zY2FuU3RyaW5nLndoaXRlU3BhY2UpKWJyZWFrfXVuZ2V0KCk7aWYoZm9ybWF0W2Zvcm1hdEluZGV4XT09PSIlIil7Zm9ybWF0SW5kZXgrKzt2YXIgc3VwcHJlc3NBc3NpZ25tZW50PWZhbHNlO2lmKGZvcm1hdFtmb3JtYXRJbmRleF09PSIqIil7c3VwcHJlc3NBc3NpZ25tZW50PXRydWU7Zm9ybWF0SW5kZXgrK312YXIgbWF4U3BlY2lmaWVyU3RhcnQ9Zm9ybWF0SW5kZXg7d2hpbGUoZm9ybWF0W2Zvcm1hdEluZGV4XS5jaGFyQ29kZUF0KDApPj00OCYmZm9ybWF0W2Zvcm1hdEluZGV4XS5jaGFyQ29kZUF0KDApPD01Nyl7Zm9ybWF0SW5kZXgrK312YXIgbWF4XztpZihmb3JtYXRJbmRleCE9bWF4U3BlY2lmaWVyU3RhcnQpe21heF89cGFyc2VJbnQoZm9ybWF0LnNsaWNlKG1heFNwZWNpZmllclN0YXJ0LGZvcm1hdEluZGV4KSwxMCl9dmFyIGxvbmdfPWZhbHNlO3ZhciBoYWxmPWZhbHNlO3ZhciBxdWFydGVyPWZhbHNlO3ZhciBsb25nTG9uZz1mYWxzZTtpZihmb3JtYXRbZm9ybWF0SW5kZXhdPT0ibCIpe2xvbmdfPXRydWU7Zm9ybWF0SW5kZXgrKztpZihmb3JtYXRbZm9ybWF0SW5kZXhdPT0ibCIpe2xvbmdMb25nPXRydWU7Zm9ybWF0SW5kZXgrK319ZWxzZSBpZihmb3JtYXRbZm9ybWF0SW5kZXhdPT0iaCIpe2hhbGY9dHJ1ZTtmb3JtYXRJbmRleCsrO2lmKGZvcm1hdFtmb3JtYXRJbmRleF09PSJoIil7cXVhcnRlcj10cnVlO2Zvcm1hdEluZGV4Kyt9fXZhciB0eXBlPWZvcm1hdFtmb3JtYXRJbmRleF07Zm9ybWF0SW5kZXgrKzt2YXIgY3Vycj0wO3ZhciBidWZmZXI9W107aWYodHlwZT09ImYifHx0eXBlPT0iZSJ8fHR5cGU9PSJnInx8dHlwZT09IkYifHx0eXBlPT0iRSJ8fHR5cGU9PSJHIil7bmV4dD1nZXQoKTt3aGlsZShuZXh0PjAmJiEobmV4dCBpbiBfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSkpe2J1ZmZlci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpO25leHQ9Z2V0KCl9dmFyIG09X19nZXRGbG9hdChidWZmZXIuam9pbigiIikpO3ZhciBsYXN0PW0/bVswXS5sZW5ndGg6MDtmb3IodmFyIGk9MDtpPGJ1ZmZlci5sZW5ndGgtbGFzdCsxO2krKyl7dW5nZXQoKX1idWZmZXIubGVuZ3RoPWxhc3R9ZWxzZXtuZXh0PWdldCgpO3ZhciBmaXJzdD10cnVlO2lmKCh0eXBlPT0ieCJ8fHR5cGU9PSJYIikmJm5leHQ9PTQ4KXt2YXIgcGVlaz1nZXQoKTtpZihwZWVrPT0xMjB8fHBlZWs9PTg4KXtuZXh0PWdldCgpfWVsc2V7dW5nZXQoKX19d2hpbGUoKGN1cnI8bWF4X3x8aXNOYU4obWF4XykpJiZuZXh0PjApe2lmKCEobmV4dCBpbiBfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSkmJih0eXBlPT0icyJ8fCh0eXBlPT09ImQifHx0eXBlPT0idSJ8fHR5cGU9PSJpIikmJihuZXh0Pj00OCYmbmV4dDw9NTd8fGZpcnN0JiZuZXh0PT00NSl8fCh0eXBlPT09IngifHx0eXBlPT09IlgiKSYmKG5leHQ+PTQ4JiZuZXh0PD01N3x8bmV4dD49OTcmJm5leHQ8PTEwMnx8bmV4dD49NjUmJm5leHQ8PTcwKSkmJihmb3JtYXRJbmRleD49Zm9ybWF0Lmxlbmd0aHx8bmV4dCE9PWZvcm1hdFtmb3JtYXRJbmRleF0uY2hhckNvZGVBdCgwKSkpe2J1ZmZlci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpO25leHQ9Z2V0KCk7Y3VycisrO2ZpcnN0PWZhbHNlfWVsc2V7YnJlYWt9fXVuZ2V0KCl9aWYoYnVmZmVyLmxlbmd0aD09PTApcmV0dXJuIDA7aWYoc3VwcHJlc3NBc3NpZ25tZW50KWNvbnRpbnVlO3ZhciB0ZXh0PWJ1ZmZlci5qb2luKCIiKTt2YXIgYXJnUHRyPUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXTthcmdJbmRleCs9UnVudGltZS5nZXRBbGlnblNpemUoInZvaWQqIixudWxsLHRydWUpO3ZhciBiYXNlPTEwO3N3aXRjaCh0eXBlKXtjYXNlIlgiOmNhc2UieCI6YmFzZT0xNjtjYXNlImQiOmNhc2UidSI6Y2FzZSJpIjppZihxdWFydGVyKXtIRUFQOFthcmdQdHI+PjBdPXBhcnNlSW50KHRleHQsYmFzZSl9ZWxzZSBpZihoYWxmKXtIRUFQMTZbYXJnUHRyPj4xXT1wYXJzZUludCh0ZXh0LGJhc2UpfWVsc2UgaWYobG9uZ0xvbmcpe3RlbXBJNjQ9W3BhcnNlSW50KHRleHQsYmFzZSk+Pj4wLCh0ZW1wRG91YmxlPXBhcnNlSW50KHRleHQsYmFzZSksK01hdGhfYWJzKHRlbXBEb3VibGUpPj0rMT90ZW1wRG91YmxlPiswPyhNYXRoX21pbigrTWF0aF9mbG9vcih0ZW1wRG91YmxlLys0Mjk0OTY3Mjk2KSwrNDI5NDk2NzI5NSl8MCk+Pj4wOn5+K01hdGhfY2VpbCgodGVtcERvdWJsZS0gKyh+fnRlbXBEb3VibGU+Pj4wKSkvKzQyOTQ5NjcyOTYpPj4+MDowKV0sSEVBUDMyW2FyZ1B0cj4+Ml09dGVtcEk2NFswXSxIRUFQMzJbYXJnUHRyKzQ+PjJdPXRlbXBJNjRbMV19ZWxzZXtIRUFQMzJbYXJnUHRyPj4yXT1wYXJzZUludCh0ZXh0LGJhc2UpfWJyZWFrO2Nhc2UiRiI6Y2FzZSJmIjpjYXNlIkUiOmNhc2UiZSI6Y2FzZSJHIjpjYXNlImciOmNhc2UiRSI6aWYobG9uZ18pe0hFQVBGNjRbYXJnUHRyPj4zXT1wYXJzZUZsb2F0KHRleHQpfWVsc2V7SEVBUEYzMlthcmdQdHI+PjJdPXBhcnNlRmxvYXQodGV4dCl9YnJlYWs7Y2FzZSJzIjp2YXIgYXJyYXk9aW50QXJyYXlGcm9tU3RyaW5nKHRleHQpO2Zvcih2YXIgaj0wO2o8YXJyYXkubGVuZ3RoO2orKyl7SEVBUDhbYXJnUHRyK2o+PjBdPWFycmF5W2pdfWJyZWFrfWZpZWxkcysrfWVsc2UgaWYoZm9ybWF0W2Zvcm1hdEluZGV4XS5jaGFyQ29kZUF0KDApaW4gX19zY2FuU3RyaW5nLndoaXRlU3BhY2Upe25leHQ9Z2V0KCk7d2hpbGUobmV4dCBpbiBfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSl7aWYobmV4dDw9MClicmVhayBtYWluTG9vcDtuZXh0PWdldCgpfXVuZ2V0KG5leHQpO2Zvcm1hdEluZGV4Kyt9ZWxzZXtuZXh0PWdldCgpO2lmKGZvcm1hdFtmb3JtYXRJbmRleF0uY2hhckNvZGVBdCgwKSE9PW5leHQpe3VuZ2V0KG5leHQpO2JyZWFrIG1haW5Mb29wfWZvcm1hdEluZGV4Kyt9fXJldHVybiBmaWVsZHN9ZnVuY3Rpb24gX3NzY2FuZihzLGZvcm1hdCx2YXJhcmdzKXt2YXIgaW5kZXg9MDtmdW5jdGlvbiBnZXQoKXtyZXR1cm4gSEVBUDhbcytpbmRleCsrPj4wXX1mdW5jdGlvbiB1bmdldCgpe2luZGV4LS19cmV0dXJuIF9fc2NhblN0cmluZyhmb3JtYXQsZ2V0LHVuZ2V0LHZhcmFyZ3MpfWZ1bmN0aW9uIF92c3NjYW5mKHMsZm9ybWF0LHZhX2FyZyl7cmV0dXJuIF9zc2NhbmYocyxmb3JtYXQsSEVBUDMyW3ZhX2FyZz4+Ml0pfWZ1bmN0aW9uIF9fX2Fzc2VydF9mYWlsKGNvbmRpdGlvbixmaWxlbmFtZSxsaW5lLGZ1bmMpe0FCT1JUPXRydWU7dGhyb3ciQXNzZXJ0aW9uIGZhaWxlZDogIitQb2ludGVyX3N0cmluZ2lmeShjb25kaXRpb24pKyIsIGF0OiAiK1tmaWxlbmFtZT9Qb2ludGVyX3N0cmluZ2lmeShmaWxlbmFtZSk6InVua25vd24gZmlsZW5hbWUiLGxpbmUsZnVuYz9Qb2ludGVyX3N0cmluZ2lmeShmdW5jKToidW5rbm93biBmdW5jdGlvbiJdKyIgYXQgIitzdGFja1RyYWNlKCl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdm9pZCgpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl92b2lkIik7YWJvcnQoLTEpfU1vZHVsZVsiX21lbXNldCJdPV9tZW1zZXQ7dmFyIF9CSXRvRD10cnVlO2Z1bmN0aW9uIF9faXNMZWFwWWVhcih5ZWFyKXtyZXR1cm4geWVhciU0PT09MCYmKHllYXIlMTAwIT09MHx8eWVhciU0MDA9PT0wKX1mdW5jdGlvbiBfX2FycmF5U3VtKGFycmF5LGluZGV4KXt2YXIgc3VtPTA7Zm9yKHZhciBpPTA7aTw9aW5kZXg7c3VtKz1hcnJheVtpKytdKTtyZXR1cm4gc3VtfXZhciBfX01PTlRIX0RBWVNfTEVBUD1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO3ZhciBfX01PTlRIX0RBWVNfUkVHVUxBUj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIF9fYWRkRGF5cyhkYXRlLGRheXMpe3ZhciBuZXdEYXRlPW5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTt3aGlsZShkYXlzPjApe3ZhciBsZWFwPV9faXNMZWFwWWVhcihuZXdEYXRlLmdldEZ1bGxZZWFyKCkpO3ZhciBjdXJyZW50TW9udGg9bmV3RGF0ZS5nZXRNb250aCgpO3ZhciBkYXlzSW5DdXJyZW50TW9udGg9KGxlYXA/X19NT05USF9EQVlTX0xFQVA6X19NT05USF9EQVlTX1JFR1VMQVIpW2N1cnJlbnRNb250aF07aWYoZGF5cz5kYXlzSW5DdXJyZW50TW9udGgtbmV3RGF0ZS5nZXREYXRlKCkpe2RheXMtPWRheXNJbkN1cnJlbnRNb250aC1uZXdEYXRlLmdldERhdGUoKSsxO25ld0RhdGUuc2V0RGF0ZSgxKTtpZihjdXJyZW50TW9udGg8MTEpe25ld0RhdGUuc2V0TW9udGgoY3VycmVudE1vbnRoKzEpfWVsc2V7bmV3RGF0ZS5zZXRNb250aCgwKTtuZXdEYXRlLnNldEZ1bGxZZWFyKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSsxKX19ZWxzZXtuZXdEYXRlLnNldERhdGUobmV3RGF0ZS5nZXREYXRlKCkrZGF5cyk7cmV0dXJuIG5ld0RhdGV9fXJldHVybiBuZXdEYXRlfWZ1bmN0aW9uIF9zdHJmdGltZShzLG1heHNpemUsZm9ybWF0LHRtKXt2YXIgZGF0ZT17dG1fc2VjOkhFQVAzMlt0bT4+Ml0sdG1fbWluOkhFQVAzMlt0bSs0Pj4yXSx0bV9ob3VyOkhFQVAzMlt0bSs4Pj4yXSx0bV9tZGF5OkhFQVAzMlt0bSsxMj4+Ml0sdG1fbW9uOkhFQVAzMlt0bSsxNj4+Ml0sdG1feWVhcjpIRUFQMzJbdG0rMjA+PjJdLHRtX3dkYXk6SEVBUDMyW3RtKzI0Pj4yXSx0bV95ZGF5OkhFQVAzMlt0bSsyOD4+Ml0sdG1faXNkc3Q6SEVBUDMyW3RtKzMyPj4yXX07dmFyIHBhdHRlcm49UG9pbnRlcl9zdHJpbmdpZnkoZm9ybWF0KTt2YXIgRVhQQU5TSU9OX1JVTEVTXzE9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMifTtmb3IodmFyIHJ1bGUgaW4gRVhQQU5TSU9OX1JVTEVTXzEpe3BhdHRlcm49cGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwiZyIpLEVYUEFOU0lPTl9SVUxFU18xW3J1bGVdKX12YXIgV0VFS0RBWVM9WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdO3ZhciBNT05USFM9WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdO2Z1bmN0aW9uIGxlYWRpbmdTb21ldGhpbmcodmFsdWUsZGlnaXRzLGNoYXJhY3Rlcil7dmFyIHN0cj10eXBlb2YgdmFsdWU9PT0ibnVtYmVyIj92YWx1ZS50b1N0cmluZygpOnZhbHVlfHwiIjt3aGlsZShzdHIubGVuZ3RoPGRpZ2l0cyl7c3RyPWNoYXJhY3RlclswXStzdHJ9cmV0dXJuIHN0cn1mdW5jdGlvbiBsZWFkaW5nTnVsbHModmFsdWUsZGlnaXRzKXtyZXR1cm4gbGVhZGluZ1NvbWV0aGluZyh2YWx1ZSxkaWdpdHMsIjAiKX1mdW5jdGlvbiBjb21wYXJlQnlEYXkoZGF0ZTEsZGF0ZTIpe2Z1bmN0aW9uIHNnbih2YWx1ZSl7cmV0dXJuIHZhbHVlPDA/LTE6dmFsdWU+MD8xOjB9dmFyIGNvbXBhcmU7aWYoKGNvbXBhcmU9c2duKGRhdGUxLmdldEZ1bGxZZWFyKCktZGF0ZTIuZ2V0RnVsbFllYXIoKSkpPT09MCl7aWYoKGNvbXBhcmU9c2duKGRhdGUxLmdldE1vbnRoKCktZGF0ZTIuZ2V0TW9udGgoKSkpPT09MCl7Y29tcGFyZT1zZ24oZGF0ZTEuZ2V0RGF0ZSgpLWRhdGUyLmdldERhdGUoKSl9fXJldHVybiBjb21wYXJlfWZ1bmN0aW9uIGdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGgpe3N3aXRjaChqYW5Gb3VydGguZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCktMSwxMSwyOSk7Y2FzZSAxOnJldHVybiBqYW5Gb3VydGg7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCksMCwyKTtjYXNlIDQ6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpLTEsMTEsMzApfX1mdW5jdGlvbiBnZXRXZWVrQmFzZWRZZWFyKGRhdGUpe3ZhciB0aGlzRGF0ZT1fX2FkZERheXMobmV3IERhdGUoZGF0ZS50bV95ZWFyKzE5MDAsMCwxKSxkYXRlLnRtX3lkYXkpO3ZhciBqYW5Gb3VydGhUaGlzWWVhcj1uZXcgRGF0ZSh0aGlzRGF0ZS5nZXRGdWxsWWVhcigpLDAsNCk7dmFyIGphbkZvdXJ0aE5leHRZZWFyPW5ldyBEYXRlKHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkrMSwwLDQpO3ZhciBmaXJzdFdlZWtTdGFydFRoaXNZZWFyPWdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGhUaGlzWWVhcik7dmFyIGZpcnN0V2Vla1N0YXJ0TmV4dFllYXI9Z2V0Rmlyc3RXZWVrU3RhcnREYXRlKGphbkZvdXJ0aE5leHRZZWFyKTtpZihjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnRUaGlzWWVhcix0aGlzRGF0ZSk8PTApe2lmKGNvbXBhcmVCeURheShmaXJzdFdlZWtTdGFydE5leHRZZWFyLHRoaXNEYXRlKTw9MCl7cmV0dXJuIHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkrMX1lbHNle3JldHVybiB0aGlzRGF0ZS5nZXRGdWxsWWVhcigpfX1lbHNle3JldHVybiB0aGlzRGF0ZS5nZXRGdWxsWWVhcigpLTF9fXZhciBFWFBBTlNJT05fUlVMRVNfMj17IiVhIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIFdFRUtEQVlTW2RhdGUudG1fd2RheV0uc3Vic3RyaW5nKDAsMyl9KSwiJUEiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gV0VFS0RBWVNbZGF0ZS50bV93ZGF5XX0pLCIlYiI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBNT05USFNbZGF0ZS50bV9tb25dLnN1YnN0cmluZygwLDMpfSksIiVCIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIE1PTlRIU1tkYXRlLnRtX21vbl19KSwiJUMiOihmdW5jdGlvbihkYXRlKXt2YXIgeWVhcj1kYXRlLnRtX3llYXIrMTkwMDtyZXR1cm4gbGVhZGluZ051bGxzKE1hdGguZmxvb3IoeWVhci8xMDApLDIpfSksIiVkIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGxlYWRpbmdOdWxscyhkYXRlLnRtX21kYXksMil9KSwiJWUiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gbGVhZGluZ1NvbWV0aGluZyhkYXRlLnRtX21kYXksMiwiICIpfSksIiVnIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGdldFdlZWtCYXNlZFllYXIoZGF0ZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMil9KSwiJUciOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gZ2V0V2Vla0Jhc2VkWWVhcihkYXRlKX0pLCIlSCI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9ob3VyLDIpfSksIiVJIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGxlYWRpbmdOdWxscyhkYXRlLnRtX2hvdXI8MTM/ZGF0ZS50bV9ob3VyOmRhdGUudG1faG91ci0xMiwyKX0pLCIlaiI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9tZGF5K19fYXJyYXlTdW0oX19pc0xlYXBZZWFyKGRhdGUudG1feWVhcisxOTAwKT9fX01PTlRIX0RBWVNfTEVBUDpfX01PTlRIX0RBWVNfUkVHVUxBUixkYXRlLnRtX21vbi0xKSwzKX0pLCIlbSI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9tb24rMSwyKX0pLCIlTSI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9taW4sMil9KSwiJW4iOihmdW5jdGlvbigpe3JldHVybiJcbiJ9KSwiJXAiOihmdW5jdGlvbihkYXRlKXtpZihkYXRlLnRtX2hvdXI+MCYmZGF0ZS50bV9ob3VyPDEzKXtyZXR1cm4iQU0ifWVsc2V7cmV0dXJuIlBNIn19KSwiJVMiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gbGVhZGluZ051bGxzKGRhdGUudG1fc2VjLDIpfSksIiV0IjooZnVuY3Rpb24oKXtyZXR1cm4iXHQifSksIiV1IjooZnVuY3Rpb24oZGF0ZSl7dmFyIGRheT1uZXcgRGF0ZShkYXRlLnRtX3llYXIrMTkwMCxkYXRlLnRtX21vbisxLGRhdGUudG1fbWRheSwwLDAsMCwwKTtyZXR1cm4gZGF5LmdldERheSgpfHw3fSksIiVVIjooZnVuY3Rpb24oZGF0ZSl7dmFyIGphbkZpcnN0PW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAwLDAsMSk7dmFyIGZpcnN0U3VuZGF5PWphbkZpcnN0LmdldERheSgpPT09MD9qYW5GaXJzdDpfX2FkZERheXMoamFuRmlyc3QsNy1qYW5GaXJzdC5nZXREYXkoKSk7dmFyIGVuZERhdGU9bmV3IERhdGUoZGF0ZS50bV95ZWFyKzE5MDAsZGF0ZS50bV9tb24sZGF0ZS50bV9tZGF5KTtpZihjb21wYXJlQnlEYXkoZmlyc3RTdW5kYXksZW5kRGF0ZSk8MCl7dmFyIGZlYnJ1YXJ5Rmlyc3RVbnRpbEVuZE1vbnRoPV9fYXJyYXlTdW0oX19pc0xlYXBZZWFyKGVuZERhdGUuZ2V0RnVsbFllYXIoKSk/X19NT05USF9EQVlTX0xFQVA6X19NT05USF9EQVlTX1JFR1VMQVIsZW5kRGF0ZS5nZXRNb250aCgpLTEpLTMxO3ZhciBmaXJzdFN1bmRheVVudGlsRW5kSmFudWFyeT0zMS1maXJzdFN1bmRheS5nZXREYXRlKCk7dmFyIGRheXM9Zmlyc3RTdW5kYXlVbnRpbEVuZEphbnVhcnkrZmVicnVhcnlGaXJzdFVudGlsRW5kTW9udGgrZW5kRGF0ZS5nZXREYXRlKCk7cmV0dXJuIGxlYWRpbmdOdWxscyhNYXRoLmNlaWwoZGF5cy83KSwyKX1yZXR1cm4gY29tcGFyZUJ5RGF5KGZpcnN0U3VuZGF5LGphbkZpcnN0KT09PTA/IjAxIjoiMDAifSksIiVWIjooZnVuY3Rpb24oZGF0ZSl7dmFyIGphbkZvdXJ0aFRoaXNZZWFyPW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAwLDAsNCk7dmFyIGphbkZvdXJ0aE5leHRZZWFyPW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAxLDAsNCk7dmFyIGZpcnN0V2Vla1N0YXJ0VGhpc1llYXI9Z2V0Rmlyc3RXZWVrU3RhcnREYXRlKGphbkZvdXJ0aFRoaXNZZWFyKTt2YXIgZmlyc3RXZWVrU3RhcnROZXh0WWVhcj1nZXRGaXJzdFdlZWtTdGFydERhdGUoamFuRm91cnRoTmV4dFllYXIpO3ZhciBlbmREYXRlPV9fYWRkRGF5cyhuZXcgRGF0ZShkYXRlLnRtX3llYXIrMTkwMCwwLDEpLGRhdGUudG1feWRheSk7aWYoY29tcGFyZUJ5RGF5KGVuZERhdGUsZmlyc3RXZWVrU3RhcnRUaGlzWWVhcik8MCl7cmV0dXJuIjUzIn1pZihjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnROZXh0WWVhcixlbmREYXRlKTw9MCl7cmV0dXJuIjAxIn12YXIgZGF5c0RpZmZlcmVuY2U7aWYoZmlyc3RXZWVrU3RhcnRUaGlzWWVhci5nZXRGdWxsWWVhcigpPGRhdGUudG1feWVhcisxOTAwKXtkYXlzRGlmZmVyZW5jZT1kYXRlLnRtX3lkYXkrMzItZmlyc3RXZWVrU3RhcnRUaGlzWWVhci5nZXREYXRlKCl9ZWxzZXtkYXlzRGlmZmVyZW5jZT1kYXRlLnRtX3lkYXkrMS1maXJzdFdlZWtTdGFydFRoaXNZZWFyLmdldERhdGUoKX1yZXR1cm4gbGVhZGluZ051bGxzKE1hdGguY2VpbChkYXlzRGlmZmVyZW5jZS83KSwyKX0pLCIldyI6KGZ1bmN0aW9uKGRhdGUpe3ZhciBkYXk9bmV3IERhdGUoZGF0ZS50bV95ZWFyKzE5MDAsZGF0ZS50bV9tb24rMSxkYXRlLnRtX21kYXksMCwwLDAsMCk7cmV0dXJuIGRheS5nZXREYXkoKX0pLCIlVyI6KGZ1bmN0aW9uKGRhdGUpe3ZhciBqYW5GaXJzdD1uZXcgRGF0ZShkYXRlLnRtX3llYXIsMCwxKTt2YXIgZmlyc3RNb25kYXk9amFuRmlyc3QuZ2V0RGF5KCk9PT0xP2phbkZpcnN0Ol9fYWRkRGF5cyhqYW5GaXJzdCxqYW5GaXJzdC5nZXREYXkoKT09PTA/MTo3LWphbkZpcnN0LmdldERheSgpKzEpO3ZhciBlbmREYXRlPW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAwLGRhdGUudG1fbW9uLGRhdGUudG1fbWRheSk7aWYoY29tcGFyZUJ5RGF5KGZpcnN0TW9uZGF5LGVuZERhdGUpPDApe3ZhciBmZWJydWFyeUZpcnN0VW50aWxFbmRNb250aD1fX2FycmF5U3VtKF9faXNMZWFwWWVhcihlbmREYXRlLmdldEZ1bGxZZWFyKCkpP19fTU9OVEhfREFZU19MRUFQOl9fTU9OVEhfREFZU19SRUdVTEFSLGVuZERhdGUuZ2V0TW9udGgoKS0xKS0zMTt2YXIgZmlyc3RNb25kYXlVbnRpbEVuZEphbnVhcnk9MzEtZmlyc3RNb25kYXkuZ2V0RGF0ZSgpO3ZhciBkYXlzPWZpcnN0TW9uZGF5VW50aWxFbmRKYW51YXJ5K2ZlYnJ1YXJ5Rmlyc3RVbnRpbEVuZE1vbnRoK2VuZERhdGUuZ2V0RGF0ZSgpO3JldHVybiBsZWFkaW5nTnVsbHMoTWF0aC5jZWlsKGRheXMvNyksMil9cmV0dXJuIGNvbXBhcmVCeURheShmaXJzdE1vbmRheSxqYW5GaXJzdCk9PT0wPyIwMSI6IjAwIn0pLCIleSI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybihkYXRlLnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMil9KSwiJVkiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gZGF0ZS50bV95ZWFyKzE5MDB9KSwiJXoiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4iIn0pLCIlWiI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiIifSksIiUlIjooZnVuY3Rpb24oKXtyZXR1cm4iJSJ9KX07Zm9yKHZhciBydWxlIGluIEVYUEFOU0lPTl9SVUxFU18yKXtpZihwYXR0ZXJuLmluZGV4T2YocnVsZSk+PTApe3BhdHRlcm49cGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwiZyIpLEVYUEFOU0lPTl9SVUxFU18yW3J1bGVdKGRhdGUpKX19dmFyIGJ5dGVzPWludEFycmF5RnJvbVN0cmluZyhwYXR0ZXJuLGZhbHNlKTtpZihieXRlcy5sZW5ndGg+bWF4c2l6ZSl7cmV0dXJuIDB9d3JpdGVBcnJheVRvTWVtb3J5KGJ5dGVzLHMpO3JldHVybiBieXRlcy5sZW5ndGgtMX1mdW5jdGlvbiBfc3RyZnRpbWVfbChzLG1heHNpemUsZm9ybWF0LHRtKXtyZXR1cm4gX3N0cmZ0aW1lKHMsbWF4c2l6ZSxmb3JtYXQsdG0pfWZ1bmN0aW9uIF9hYm9ydCgpe01vZHVsZVsiYWJvcnQiXSgpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzKCl7TW9kdWxlWyJwcmludEVyciJdKCJtaXNzaW5nIGZ1bmN0aW9uOiBfZW1iaW5kX3JlZ2lzdGVyX2NsYXNzIik7YWJvcnQoLTEpfWZ1bmN0aW9uIF9wdGhyZWFkX2NvbmRfd2FpdCgpe3JldHVybiAwfXZhciBfZmFicz1NYXRoX2Ficzt2YXIgX2dldGM9X2ZnZXRjO2Z1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIoKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlciIpO2Fib3J0KC0xKX12YXIgQnJvd3Nlcj17bWFpbkxvb3A6e3NjaGVkdWxlcjpudWxsLG1ldGhvZDoiIixzaG91bGRQYXVzZTpmYWxzZSxwYXVzZWQ6ZmFsc2UscXVldWU6W10scGF1c2U6KGZ1bmN0aW9uKCl7QnJvd3Nlci5tYWluTG9vcC5zaG91bGRQYXVzZT10cnVlfSkscmVzdW1lOihmdW5jdGlvbigpe2lmKEJyb3dzZXIubWFpbkxvb3AucGF1c2VkKXtCcm93c2VyLm1haW5Mb29wLnBhdXNlZD1mYWxzZTtCcm93c2VyLm1haW5Mb29wLnNjaGVkdWxlcigpfUJyb3dzZXIubWFpbkxvb3Auc2hvdWxkUGF1c2U9ZmFsc2V9KSx1cGRhdGVTdGF0dXM6KGZ1bmN0aW9uKCl7aWYoTW9kdWxlWyJzZXRTdGF0dXMiXSl7dmFyIG1lc3NhZ2U9TW9kdWxlWyJzdGF0dXNNZXNzYWdlIl18fCJQbGVhc2Ugd2FpdC4uLiI7dmFyIHJlbWFpbmluZz1Ccm93c2VyLm1haW5Mb29wLnJlbWFpbmluZ0Jsb2NrZXJzO3ZhciBleHBlY3RlZD1Ccm93c2VyLm1haW5Mb29wLmV4cGVjdGVkQmxvY2tlcnM7aWYocmVtYWluaW5nKXtpZihyZW1haW5pbmc8ZXhwZWN0ZWQpe01vZHVsZVsic2V0U3RhdHVzIl0obWVzc2FnZSsiICgiKyhleHBlY3RlZC1yZW1haW5pbmcpKyIvIitleHBlY3RlZCsiKSIpfWVsc2V7TW9kdWxlWyJzZXRTdGF0dXMiXShtZXNzYWdlKX19ZWxzZXtNb2R1bGVbInNldFN0YXR1cyJdKCIiKX19fSl9LGlzRnVsbFNjcmVlbjpmYWxzZSxwb2ludGVyTG9jazpmYWxzZSxtb2R1bGVDb250ZXh0Q3JlYXRlZENhbGxiYWNrczpbXSx3b3JrZXJzOltdLGluaXQ6KGZ1bmN0aW9uKCl7aWYoIU1vZHVsZVsicHJlbG9hZFBsdWdpbnMiXSlNb2R1bGVbInByZWxvYWRQbHVnaW5zIl09W107aWYoQnJvd3Nlci5pbml0dGVkfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpcmV0dXJuO0Jyb3dzZXIuaW5pdHRlZD10cnVlO3RyeXtuZXcgQmxvYjtCcm93c2VyLmhhc0Jsb2JDb25zdHJ1Y3Rvcj10cnVlfWNhdGNoKGUpe0Jyb3dzZXIuaGFzQmxvYkNvbnN0cnVjdG9yPWZhbHNlO2NvbnNvbGUubG9nKCJ3YXJuaW5nOiBubyBibG9iIGNvbnN0cnVjdG9yLCBjYW5ub3QgY3JlYXRlIGJsb2JzIHdpdGggbWltZXR5cGVzIil9QnJvd3Nlci5CbG9iQnVpbGRlcj10eXBlb2YgTW96QmxvYkJ1aWxkZXIhPSJ1bmRlZmluZWQiP01vekJsb2JCdWlsZGVyOnR5cGVvZiBXZWJLaXRCbG9iQnVpbGRlciE9InVuZGVmaW5lZCI/V2ViS2l0QmxvYkJ1aWxkZXI6IUJyb3dzZXIuaGFzQmxvYkNvbnN0cnVjdG9yP2NvbnNvbGUubG9nKCJ3YXJuaW5nOiBubyBCbG9iQnVpbGRlciIpOm51bGw7QnJvd3Nlci5VUkxPYmplY3Q9dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCI/d2luZG93LlVSTD93aW5kb3cuVVJMOndpbmRvdy53ZWJraXRVUkw6dW5kZWZpbmVkO2lmKCFNb2R1bGUubm9JbWFnZURlY29kaW5nJiZ0eXBlb2YgQnJvd3Nlci5VUkxPYmplY3Q9PT0idW5kZWZpbmVkIil7Y29uc29sZS5sb2coIndhcm5pbmc6IEJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBjcmVhdGluZyBvYmplY3QgVVJMcy4gQnVpbHQtaW4gYnJvd3NlciBpbWFnZSBkZWNvZGluZyB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIik7TW9kdWxlLm5vSW1hZ2VEZWNvZGluZz10cnVlfXZhciBpbWFnZVBsdWdpbj17fTtpbWFnZVBsdWdpblsiY2FuSGFuZGxlIl09ZnVuY3Rpb24gaW1hZ2VQbHVnaW5fY2FuSGFuZGxlKG5hbWUpe3JldHVybiFNb2R1bGUubm9JbWFnZURlY29kaW5nJiYvXC4oanBnfGpwZWd8cG5nfGJtcCkkL2kudGVzdChuYW1lKX07aW1hZ2VQbHVnaW5bImhhbmRsZSJdPWZ1bmN0aW9uIGltYWdlUGx1Z2luX2hhbmRsZShieXRlQXJyYXksbmFtZSxvbmxvYWQsb25lcnJvcil7dmFyIGI9bnVsbDtpZihCcm93c2VyLmhhc0Jsb2JDb25zdHJ1Y3Rvcil7dHJ5e2I9bmV3IEJsb2IoW2J5dGVBcnJheV0se3R5cGU6QnJvd3Nlci5nZXRNaW1ldHlwZShuYW1lKX0pO2lmKGIuc2l6ZSE9PWJ5dGVBcnJheS5sZW5ndGgpe2I9bmV3IEJsb2IoWyhuZXcgVWludDhBcnJheShieXRlQXJyYXkpKS5idWZmZXJdLHt0eXBlOkJyb3dzZXIuZ2V0TWltZXR5cGUobmFtZSl9KX19Y2F0Y2goZSl7UnVudGltZS53YXJuT25jZSgiQmxvYiBjb25zdHJ1Y3RvciBwcmVzZW50IGJ1dCBmYWlsczogIitlKyI7IGZhbGxpbmcgYmFjayB0byBibG9iIGJ1aWxkZXIiKX19aWYoIWIpe3ZhciBiYj1uZXcgQnJvd3Nlci5CbG9iQnVpbGRlcjtiYi5hcHBlbmQoKG5ldyBVaW50OEFycmF5KGJ5dGVBcnJheSkpLmJ1ZmZlcik7Yj1iYi5nZXRCbG9iKCl9dmFyIHVybD1Ccm93c2VyLlVSTE9iamVjdC5jcmVhdGVPYmplY3RVUkwoYik7dmFyIGltZz1uZXcgSW1hZ2U7aW1nLm9ubG9hZD1mdW5jdGlvbiBpbWdfb25sb2FkKCl7YXNzZXJ0KGltZy5jb21wbGV0ZSwiSW1hZ2UgIituYW1lKyIgY291bGQgbm90IGJlIGRlY29kZWQiKTt2YXIgY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2NhbnZhcy53aWR0aD1pbWcud2lkdGg7Y2FudmFzLmhlaWdodD1pbWcuaGVpZ2h0O3ZhciBjdHg9Y2FudmFzLmdldENvbnRleHQoIjJkIik7Y3R4LmRyYXdJbWFnZShpbWcsMCwwKTtNb2R1bGVbInByZWxvYWRlZEltYWdlcyJdW25hbWVdPWNhbnZhcztCcm93c2VyLlVSTE9iamVjdC5yZXZva2VPYmplY3RVUkwodXJsKTtpZihvbmxvYWQpb25sb2FkKGJ5dGVBcnJheSl9O2ltZy5vbmVycm9yPWZ1bmN0aW9uIGltZ19vbmVycm9yKGV2ZW50KXtjb25zb2xlLmxvZygiSW1hZ2UgIit1cmwrIiBjb3VsZCBub3QgYmUgZGVjb2RlZCIpO2lmKG9uZXJyb3Ipb25lcnJvcigpfTtpbWcuc3JjPXVybH07TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLnB1c2goaW1hZ2VQbHVnaW4pO3ZhciBhdWRpb1BsdWdpbj17fTthdWRpb1BsdWdpblsiY2FuSGFuZGxlIl09ZnVuY3Rpb24gYXVkaW9QbHVnaW5fY2FuSGFuZGxlKG5hbWUpe3JldHVybiFNb2R1bGUubm9BdWRpb0RlY29kaW5nJiZuYW1lLnN1YnN0cigtNClpbnsiLm9nZyI6MSwiLndhdiI6MSwiLm1wMyI6MX19O2F1ZGlvUGx1Z2luWyJoYW5kbGUiXT1mdW5jdGlvbiBhdWRpb1BsdWdpbl9oYW5kbGUoYnl0ZUFycmF5LG5hbWUsb25sb2FkLG9uZXJyb3Ipe3ZhciBkb25lPWZhbHNlO2Z1bmN0aW9uIGZpbmlzaChhdWRpbyl7aWYoZG9uZSlyZXR1cm47ZG9uZT10cnVlO01vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl1bbmFtZV09YXVkaW87aWYob25sb2FkKW9ubG9hZChieXRlQXJyYXkpfWZ1bmN0aW9uIGZhaWwoKXtpZihkb25lKXJldHVybjtkb25lPXRydWU7TW9kdWxlWyJwcmVsb2FkZWRBdWRpb3MiXVtuYW1lXT1uZXcgQXVkaW87aWYob25lcnJvcilvbmVycm9yKCl9aWYoQnJvd3Nlci5oYXNCbG9iQ29uc3RydWN0b3Ipe3RyeXt2YXIgYj1uZXcgQmxvYihbYnl0ZUFycmF5XSx7dHlwZTpCcm93c2VyLmdldE1pbWV0eXBlKG5hbWUpfSl9Y2F0Y2goZSl7cmV0dXJuIGZhaWwoKX12YXIgdXJsPUJyb3dzZXIuVVJMT2JqZWN0LmNyZWF0ZU9iamVjdFVSTChiKTt2YXIgYXVkaW89bmV3IEF1ZGlvO2F1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoImNhbnBsYXl0aHJvdWdoIiwoZnVuY3Rpb24oKXtmaW5pc2goYXVkaW8pfSksZmFsc2UpO2F1ZGlvLm9uZXJyb3I9ZnVuY3Rpb24gYXVkaW9fb25lcnJvcihldmVudCl7aWYoZG9uZSlyZXR1cm47Y29uc29sZS5sb2coIndhcm5pbmc6IGJyb3dzZXIgY291bGQgbm90IGZ1bGx5IGRlY29kZSBhdWRpbyAiK25hbWUrIiwgdHJ5aW5nIHNsb3dlciBiYXNlNjQgYXBwcm9hY2giKTtmdW5jdGlvbiBlbmNvZGU2NChkYXRhKXt2YXIgQkFTRT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7dmFyIFBBRD0iPSI7dmFyIHJldD0iIjt2YXIgbGVmdGNoYXI9MDt2YXIgbGVmdGJpdHM9MDtmb3IodmFyIGk9MDtpPGRhdGEubGVuZ3RoO2krKyl7bGVmdGNoYXI9bGVmdGNoYXI8PDh8ZGF0YVtpXTtsZWZ0Yml0cys9ODt3aGlsZShsZWZ0Yml0cz49Nil7dmFyIGN1cnI9bGVmdGNoYXI+PmxlZnRiaXRzLTYmNjM7bGVmdGJpdHMtPTY7cmV0Kz1CQVNFW2N1cnJdfX1pZihsZWZ0Yml0cz09Mil7cmV0Kz1CQVNFWyhsZWZ0Y2hhciYzKTw8NF07cmV0Kz1QQUQrUEFEfWVsc2UgaWYobGVmdGJpdHM9PTQpe3JldCs9QkFTRVsobGVmdGNoYXImMTUpPDwyXTtyZXQrPVBBRH1yZXR1cm4gcmV0fWF1ZGlvLnNyYz0iZGF0YTphdWRpby94LSIrbmFtZS5zdWJzdHIoLTMpKyI7YmFzZTY0LCIrZW5jb2RlNjQoYnl0ZUFycmF5KTtmaW5pc2goYXVkaW8pfTthdWRpby5zcmM9dXJsO0Jyb3dzZXIuc2FmZVNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZmluaXNoKGF1ZGlvKX0pLDFlNCl9ZWxzZXtyZXR1cm4gZmFpbCgpfX07TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLnB1c2goYXVkaW9QbHVnaW4pO3ZhciBjYW52YXM9TW9kdWxlWyJjYW52YXMiXTtpZihjYW52YXMpe2NhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2s9Y2FudmFzWyJyZXF1ZXN0UG9pbnRlckxvY2siXXx8Y2FudmFzWyJtb3pSZXF1ZXN0UG9pbnRlckxvY2siXXx8Y2FudmFzWyJ3ZWJraXRSZXF1ZXN0UG9pbnRlckxvY2siXXx8Y2FudmFzWyJtc1JlcXVlc3RQb2ludGVyTG9jayJdfHwoZnVuY3Rpb24oKXt9KTtjYW52YXMuZXhpdFBvaW50ZXJMb2NrPWRvY3VtZW50WyJleGl0UG9pbnRlckxvY2siXXx8ZG9jdW1lbnRbIm1vekV4aXRQb2ludGVyTG9jayJdfHxkb2N1bWVudFsid2Via2l0RXhpdFBvaW50ZXJMb2NrIl18fGRvY3VtZW50WyJtc0V4aXRQb2ludGVyTG9jayJdfHwoZnVuY3Rpb24oKXt9KTtjYW52YXMuZXhpdFBvaW50ZXJMb2NrPWNhbnZhcy5leGl0UG9pbnRlckxvY2suYmluZChkb2N1bWVudCk7ZnVuY3Rpb24gcG9pbnRlckxvY2tDaGFuZ2UoKXtCcm93c2VyLnBvaW50ZXJMb2NrPWRvY3VtZW50WyJwb2ludGVyTG9ja0VsZW1lbnQiXT09PWNhbnZhc3x8ZG9jdW1lbnRbIm1velBvaW50ZXJMb2NrRWxlbWVudCJdPT09Y2FudmFzfHxkb2N1bWVudFsid2Via2l0UG9pbnRlckxvY2tFbGVtZW50Il09PT1jYW52YXN8fGRvY3VtZW50WyJtc1BvaW50ZXJMb2NrRWxlbWVudCJdPT09Y2FudmFzfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJsb2NrY2hhbmdlIixwb2ludGVyTG9ja0NoYW5nZSxmYWxzZSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW96cG9pbnRlcmxvY2tjaGFuZ2UiLHBvaW50ZXJMb2NrQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRwb2ludGVybG9ja2NoYW5nZSIscG9pbnRlckxvY2tDaGFuZ2UsZmFsc2UpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1zcG9pbnRlcmxvY2tjaGFuZ2UiLHBvaW50ZXJMb2NrQ2hhbmdlLGZhbHNlKTtpZihNb2R1bGVbImVsZW1lbnRQb2ludGVyTG9jayJdKXtjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihldil7aWYoIUJyb3dzZXIucG9pbnRlckxvY2smJmNhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2spe2NhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2soKTtldi5wcmV2ZW50RGVmYXVsdCgpfX0pLGZhbHNlKX19fSksY3JlYXRlQ29udGV4dDooZnVuY3Rpb24oY2FudmFzLHVzZVdlYkdMLHNldEluTW9kdWxlLHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpe3ZhciBjdHg7dmFyIGVycm9ySW5mbz0iPyI7ZnVuY3Rpb24gb25Db250ZXh0Q3JlYXRpb25FcnJvcihldmVudCl7ZXJyb3JJbmZvPWV2ZW50LnN0YXR1c01lc3NhZ2V8fGVycm9ySW5mb310cnl7aWYodXNlV2ViR0wpe3ZhciBjb250ZXh0QXR0cmlidXRlcz17YW50aWFsaWFzOmZhbHNlLGFscGhhOmZhbHNlfTtpZih3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKXtmb3IodmFyIGF0dHJpYnV0ZSBpbiB3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKXtjb250ZXh0QXR0cmlidXRlc1thdHRyaWJ1dGVdPXdlYkdMQ29udGV4dEF0dHJpYnV0ZXNbYXR0cmlidXRlXX19Y2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLG9uQ29udGV4dENyZWF0aW9uRXJyb3IsZmFsc2UpO3RyeXtbImV4cGVyaW1lbnRhbC13ZWJnbCIsIndlYmdsIl0uc29tZSgoZnVuY3Rpb24od2ViZ2xJZCl7cmV0dXJuIGN0eD1jYW52YXMuZ2V0Q29udGV4dCh3ZWJnbElkLGNvbnRleHRBdHRyaWJ1dGVzKX0pKX1maW5hbGx5e2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIixvbkNvbnRleHRDcmVhdGlvbkVycm9yLGZhbHNlKX19ZWxzZXtjdHg9Y2FudmFzLmdldENvbnRleHQoIjJkIil9aWYoIWN0eCl0aHJvdyI6KCJ9Y2F0Y2goZSl7TW9kdWxlLnByaW50KCJDb3VsZCBub3QgY3JlYXRlIGNhbnZhczogIitbZXJyb3JJbmZvLGVdKTtyZXR1cm4gbnVsbH1pZih1c2VXZWJHTCl7Y2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iYmxhY2sifWlmKHNldEluTW9kdWxlKXtHTGN0eD1Nb2R1bGUuY3R4PWN0eDtNb2R1bGUudXNlV2ViR0w9dXNlV2ViR0w7QnJvd3Nlci5tb2R1bGVDb250ZXh0Q3JlYXRlZENhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbihjYWxsYmFjayl7Y2FsbGJhY2soKX0pKTtCcm93c2VyLmluaXQoKX1yZXR1cm4gY3R4fSksZGVzdHJveUNvbnRleHQ6KGZ1bmN0aW9uKGNhbnZhcyx1c2VXZWJHTCxzZXRJbk1vZHVsZSl7fSksZnVsbFNjcmVlbkhhbmRsZXJzSW5zdGFsbGVkOmZhbHNlLGxvY2tQb2ludGVyOnVuZGVmaW5lZCxyZXNpemVDYW52YXM6dW5kZWZpbmVkLHJlcXVlc3RGdWxsU2NyZWVuOihmdW5jdGlvbihsb2NrUG9pbnRlcixyZXNpemVDYW52YXMpe0Jyb3dzZXIubG9ja1BvaW50ZXI9bG9ja1BvaW50ZXI7QnJvd3Nlci5yZXNpemVDYW52YXM9cmVzaXplQ2FudmFzO2lmKHR5cGVvZiBCcm93c2VyLmxvY2tQb2ludGVyPT09InVuZGVmaW5lZCIpQnJvd3Nlci5sb2NrUG9pbnRlcj10cnVlO2lmKHR5cGVvZiBCcm93c2VyLnJlc2l6ZUNhbnZhcz09PSJ1bmRlZmluZWQiKUJyb3dzZXIucmVzaXplQ2FudmFzPWZhbHNlO3ZhciBjYW52YXM9TW9kdWxlWyJjYW52YXMiXTtmdW5jdGlvbiBmdWxsU2NyZWVuQ2hhbmdlKCl7QnJvd3Nlci5pc0Z1bGxTY3JlZW49ZmFsc2U7dmFyIGNhbnZhc0NvbnRhaW5lcj1jYW52YXMucGFyZW50Tm9kZTtpZigoZG9jdW1lbnRbIndlYmtpdEZ1bGxTY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsibW96RnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1vekZ1bGxzY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJmdWxsU2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsiZnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCJdKT09PWNhbnZhc0NvbnRhaW5lcil7Y2FudmFzLmNhbmNlbEZ1bGxTY3JlZW49ZG9jdW1lbnRbImNhbmNlbEZ1bGxTY3JlZW4iXXx8ZG9jdW1lbnRbIm1vekNhbmNlbEZ1bGxTY3JlZW4iXXx8ZG9jdW1lbnRbIndlYmtpdENhbmNlbEZ1bGxTY3JlZW4iXXx8ZG9jdW1lbnRbIm1zRXhpdEZ1bGxzY3JlZW4iXXx8ZG9jdW1lbnRbImV4aXRGdWxsc2NyZWVuIl18fChmdW5jdGlvbigpe30pO2NhbnZhcy5jYW5jZWxGdWxsU2NyZWVuPWNhbnZhcy5jYW5jZWxGdWxsU2NyZWVuLmJpbmQoZG9jdW1lbnQpO2lmKEJyb3dzZXIubG9ja1BvaW50ZXIpY2FudmFzLnJlcXVlc3RQb2ludGVyTG9jaygpO0Jyb3dzZXIuaXNGdWxsU2NyZWVuPXRydWU7aWYoQnJvd3Nlci5yZXNpemVDYW52YXMpQnJvd3Nlci5zZXRGdWxsU2NyZWVuQ2FudmFzU2l6ZSgpfWVsc2V7Y2FudmFzQ29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNhbnZhcyxjYW52YXNDb250YWluZXIpO2NhbnZhc0NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNhbnZhc0NvbnRhaW5lcik7aWYoQnJvd3Nlci5yZXNpemVDYW52YXMpQnJvd3Nlci5zZXRXaW5kb3dlZENhbnZhc1NpemUoKX1pZihNb2R1bGVbIm9uRnVsbFNjcmVlbiJdKU1vZHVsZVsib25GdWxsU2NyZWVuIl0oQnJvd3Nlci5pc0Z1bGxTY3JlZW4pO0Jyb3dzZXIudXBkYXRlQ2FudmFzRGltZW5zaW9ucyhjYW52YXMpfWlmKCFCcm93c2VyLmZ1bGxTY3JlZW5IYW5kbGVyc0luc3RhbGxlZCl7QnJvd3Nlci5mdWxsU2NyZWVuSGFuZGxlcnNJbnN0YWxsZWQ9dHJ1ZTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIixmdWxsU2NyZWVuQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3pmdWxsc2NyZWVuY2hhbmdlIixmdWxsU2NyZWVuQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIixmdWxsU2NyZWVuQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJNU0Z1bGxzY3JlZW5DaGFuZ2UiLGZ1bGxTY3JlZW5DaGFuZ2UsZmFsc2UpfXZhciBjYW52YXNDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y2FudmFzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNhbnZhc0NvbnRhaW5lcixjYW52YXMpO2NhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpO2NhbnZhc0NvbnRhaW5lci5yZXF1ZXN0RnVsbFNjcmVlbj1jYW52YXNDb250YWluZXJbInJlcXVlc3RGdWxsU2NyZWVuIl18fGNhbnZhc0NvbnRhaW5lclsibW96UmVxdWVzdEZ1bGxTY3JlZW4iXXx8Y2FudmFzQ29udGFpbmVyWyJtc1JlcXVlc3RGdWxsc2NyZWVuIl18fChjYW52YXNDb250YWluZXJbIndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuIl0/KGZ1bmN0aW9uKCl7Y2FudmFzQ29udGFpbmVyWyJ3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbiJdKEVsZW1lbnRbIkFMTE9XX0tFWUJPQVJEX0lOUFVUIl0pfSk6bnVsbCk7Y2FudmFzQ29udGFpbmVyLnJlcXVlc3RGdWxsU2NyZWVuKCl9KSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWU6ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpe2lmKHR5cGVvZiB3aW5kb3c9PT0idW5kZWZpbmVkIil7c2V0VGltZW91dChmdW5jLDFlMy82MCl9ZWxzZXtpZighd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT13aW5kb3dbInJlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbIm1velJlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbIm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl18fHdpbmRvd1sib1JlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbInNldFRpbWVvdXQiXX13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpfX0sc2FmZUNhbGxiYWNrOihmdW5jdGlvbihmdW5jKXtyZXR1cm4oZnVuY3Rpb24oKXtpZighQUJPUlQpcmV0dXJuIGZ1bmMuYXBwbHkobnVsbCxhcmd1bWVudHMpfSl9KSxzYWZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOihmdW5jdGlvbihmdW5jKXtyZXR1cm4gQnJvd3Nlci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7aWYoIUFCT1JUKWZ1bmMoKX0pKX0pLHNhZmVTZXRUaW1lb3V0OihmdW5jdGlvbihmdW5jLHRpbWVvdXQpe01vZHVsZVsibm9FeGl0UnVudGltZSJdPXRydWU7cmV0dXJuIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYoIUFCT1JUKWZ1bmMoKX0pLHRpbWVvdXQpfSksc2FmZVNldEludGVydmFsOihmdW5jdGlvbihmdW5jLHRpbWVvdXQpe01vZHVsZVsibm9FeGl0UnVudGltZSJdPXRydWU7cmV0dXJuIHNldEludGVydmFsKChmdW5jdGlvbigpe2lmKCFBQk9SVClmdW5jKCl9KSx0aW1lb3V0KX0pLGdldE1pbWV0eXBlOihmdW5jdGlvbihuYW1lKXtyZXR1cm57ImpwZyI6ImltYWdlL2pwZWciLCJqcGVnIjoiaW1hZ2UvanBlZyIsInBuZyI6ImltYWdlL3BuZyIsImJtcCI6ImltYWdlL2JtcCIsIm9nZyI6ImF1ZGlvL29nZyIsIndhdiI6ImF1ZGlvL3dhdiIsIm1wMyI6ImF1ZGlvL21wZWcifVtuYW1lLnN1YnN0cihuYW1lLmxhc3RJbmRleE9mKCIuIikrMSldfSksZ2V0VXNlck1lZGlhOihmdW5jdGlvbihmdW5jKXtpZighd2luZG93LmdldFVzZXJNZWRpYSl7d2luZG93LmdldFVzZXJNZWRpYT1uYXZpZ2F0b3JbImdldFVzZXJNZWRpYSJdfHxuYXZpZ2F0b3JbIm1vekdldFVzZXJNZWRpYSJdfXdpbmRvdy5nZXRVc2VyTWVkaWEoZnVuYyl9KSxnZXRNb3ZlbWVudFg6KGZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4gZXZlbnRbIm1vdmVtZW50WCJdfHxldmVudFsibW96TW92ZW1lbnRYIl18fGV2ZW50WyJ3ZWJraXRNb3ZlbWVudFgiXXx8MH0pLGdldE1vdmVtZW50WTooZnVuY3Rpb24oZXZlbnQpe3JldHVybiBldmVudFsibW92ZW1lbnRZIl18fGV2ZW50WyJtb3pNb3ZlbWVudFkiXXx8ZXZlbnRbIndlYmtpdE1vdmVtZW50WSJdfHwwfSksZ2V0TW91c2VXaGVlbERlbHRhOihmdW5jdGlvbihldmVudCl7dmFyIGRlbHRhPTA7c3dpdGNoKGV2ZW50LnR5cGUpe2Nhc2UiRE9NTW91c2VTY3JvbGwiOmRlbHRhPWV2ZW50LmRldGFpbDticmVhaztjYXNlIm1vdXNld2hlZWwiOmRlbHRhPS1ldmVudC53aGVlbERlbHRhO2JyZWFrO2Nhc2Uid2hlZWwiOmRlbHRhPWV2ZW50LmRlbHRhWTticmVhaztkZWZhdWx0OnRocm93InVucmVjb2duaXplZCBtb3VzZSB3aGVlbCBldmVudDogIitldmVudC50eXBlfXJldHVybiBNYXRoLm1heCgtMSxNYXRoLm1pbigxLGRlbHRhKSl9KSxtb3VzZVg6MCxtb3VzZVk6MCxtb3VzZU1vdmVtZW50WDowLG1vdXNlTW92ZW1lbnRZOjAsdG91Y2hlczp7fSxsYXN0VG91Y2hlczp7fSxjYWxjdWxhdGVNb3VzZUV2ZW50OihmdW5jdGlvbihldmVudCl7aWYoQnJvd3Nlci5wb2ludGVyTG9jayl7aWYoZXZlbnQudHlwZSE9Im1vdXNlbW92ZSImJiJtb3pNb3ZlbWVudFgiaW4gZXZlbnQpe0Jyb3dzZXIubW91c2VNb3ZlbWVudFg9QnJvd3Nlci5tb3VzZU1vdmVtZW50WT0wfWVsc2V7QnJvd3Nlci5tb3VzZU1vdmVtZW50WD1Ccm93c2VyLmdldE1vdmVtZW50WChldmVudCk7QnJvd3Nlci5tb3VzZU1vdmVtZW50WT1Ccm93c2VyLmdldE1vdmVtZW50WShldmVudCl9aWYodHlwZW9mIFNETCE9InVuZGVmaW5lZCIpe0Jyb3dzZXIubW91c2VYPVNETC5tb3VzZVgrQnJvd3Nlci5tb3VzZU1vdmVtZW50WDtCcm93c2VyLm1vdXNlWT1TREwubW91c2VZK0Jyb3dzZXIubW91c2VNb3ZlbWVudFl9ZWxzZXtCcm93c2VyLm1vdXNlWCs9QnJvd3Nlci5tb3VzZU1vdmVtZW50WDtCcm93c2VyLm1vdXNlWSs9QnJvd3Nlci5tb3VzZU1vdmVtZW50WX19ZWxzZXt2YXIgcmVjdD1Nb2R1bGVbImNhbnZhcyJdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBjdz1Nb2R1bGVbImNhbnZhcyJdLndpZHRoO3ZhciBjaD1Nb2R1bGVbImNhbnZhcyJdLmhlaWdodDt2YXIgc2Nyb2xsWD10eXBlb2Ygd2luZG93LnNjcm9sbFghPT0idW5kZWZpbmVkIj93aW5kb3cuc2Nyb2xsWDp3aW5kb3cucGFnZVhPZmZzZXQ7dmFyIHNjcm9sbFk9dHlwZW9mIHdpbmRvdy5zY3JvbGxZIT09InVuZGVmaW5lZCI/d2luZG93LnNjcm9sbFk6d2luZG93LnBhZ2VZT2Zmc2V0O2lmKGV2ZW50LnR5cGU9PT0idG91Y2hzdGFydCJ8fGV2ZW50LnR5cGU9PT0idG91Y2hlbmQifHxldmVudC50eXBlPT09InRvdWNobW92ZSIpe3ZhciB0b3VjaD1ldmVudC50b3VjaDtpZih0b3VjaD09PXVuZGVmaW5lZCl7cmV0dXJufXZhciBhZGp1c3RlZFg9dG91Y2gucGFnZVgtKHNjcm9sbFgrcmVjdC5sZWZ0KTt2YXIgYWRqdXN0ZWRZPXRvdWNoLnBhZ2VZLShzY3JvbGxZK3JlY3QudG9wKTthZGp1c3RlZFg9YWRqdXN0ZWRYKihjdy9yZWN0LndpZHRoKTthZGp1c3RlZFk9YWRqdXN0ZWRZKihjaC9yZWN0LmhlaWdodCk7dmFyIGNvb3Jkcz17eDphZGp1c3RlZFgseTphZGp1c3RlZFl9O2lmKGV2ZW50LnR5cGU9PT0idG91Y2hzdGFydCIpe0Jyb3dzZXIubGFzdFRvdWNoZXNbdG91Y2guaWRlbnRpZmllcl09Y29vcmRzO0Jyb3dzZXIudG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXT1jb29yZHN9ZWxzZSBpZihldmVudC50eXBlPT09InRvdWNoZW5kInx8ZXZlbnQudHlwZT09PSJ0b3VjaG1vdmUiKXtCcm93c2VyLmxhc3RUb3VjaGVzW3RvdWNoLmlkZW50aWZpZXJdPUJyb3dzZXIudG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXTtCcm93c2VyLnRvdWNoZXNbdG91Y2guaWRlbnRpZmllcl09e3g6YWRqdXN0ZWRYLHk6YWRqdXN0ZWRZfX1yZXR1cm59dmFyIHg9ZXZlbnQucGFnZVgtKHNjcm9sbFgrcmVjdC5sZWZ0KTt2YXIgeT1ldmVudC5wYWdlWS0oc2Nyb2xsWStyZWN0LnRvcCk7eD14Kihjdy9yZWN0LndpZHRoKTt5PXkqKGNoL3JlY3QuaGVpZ2h0KTtCcm93c2VyLm1vdXNlTW92ZW1lbnRYPXgtQnJvd3Nlci5tb3VzZVg7QnJvd3Nlci5tb3VzZU1vdmVtZW50WT15LUJyb3dzZXIubW91c2VZO0Jyb3dzZXIubW91c2VYPXg7QnJvd3Nlci5tb3VzZVk9eX19KSx4aHJMb2FkOihmdW5jdGlvbih1cmwsb25sb2FkLG9uZXJyb3Ipe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCx0cnVlKTt4aHIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciI7eGhyLm9ubG9hZD1mdW5jdGlvbiB4aHJfb25sb2FkKCl7aWYoeGhyLnN0YXR1cz09MjAwfHx4aHIuc3RhdHVzPT0wJiZ4aHIucmVzcG9uc2Upe29ubG9hZCh4aHIucmVzcG9uc2UpfWVsc2V7b25lcnJvcigpfX07eGhyLm9uZXJyb3I9b25lcnJvcjt4aHIuc2VuZChudWxsKX0pLGFzeW5jTG9hZDooZnVuY3Rpb24odXJsLG9ubG9hZCxvbmVycm9yLG5vUnVuRGVwKXtCcm93c2VyLnhockxvYWQodXJsLChmdW5jdGlvbihhcnJheUJ1ZmZlcil7YXNzZXJ0KGFycmF5QnVmZmVyLCdMb2FkaW5nIGRhdGEgZmlsZSAiJyt1cmwrJyIgZmFpbGVkIChubyBhcnJheUJ1ZmZlcikuJyk7b25sb2FkKG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7aWYoIW5vUnVuRGVwKXJlbW92ZVJ1bkRlcGVuZGVuY3koImFsICIrdXJsKX0pLChmdW5jdGlvbihldmVudCl7aWYob25lcnJvcil7b25lcnJvcigpfWVsc2V7dGhyb3cnTG9hZGluZyBkYXRhIGZpbGUgIicrdXJsKyciIGZhaWxlZC4nfX0pKTtpZighbm9SdW5EZXApYWRkUnVuRGVwZW5kZW5jeSgiYWwgIit1cmwpfSkscmVzaXplTGlzdGVuZXJzOltdLHVwZGF0ZVJlc2l6ZUxpc3RlbmVyczooZnVuY3Rpb24oKXt2YXIgY2FudmFzPU1vZHVsZVsiY2FudmFzIl07QnJvd3Nlci5yZXNpemVMaXN0ZW5lcnMuZm9yRWFjaCgoZnVuY3Rpb24obGlzdGVuZXIpe2xpc3RlbmVyKGNhbnZhcy53aWR0aCxjYW52YXMuaGVpZ2h0KX0pKX0pLHNldENhbnZhc1NpemU6KGZ1bmN0aW9uKHdpZHRoLGhlaWdodCxub1VwZGF0ZXMpe3ZhciBjYW52YXM9TW9kdWxlWyJjYW52YXMiXTtCcm93c2VyLnVwZGF0ZUNhbnZhc0RpbWVuc2lvbnMoY2FudmFzLHdpZHRoLGhlaWdodCk7aWYoIW5vVXBkYXRlcylCcm93c2VyLnVwZGF0ZVJlc2l6ZUxpc3RlbmVycygpfSksd2luZG93ZWRXaWR0aDowLHdpbmRvd2VkSGVpZ2h0OjAsc2V0RnVsbFNjcmVlbkNhbnZhc1NpemU6KGZ1bmN0aW9uKCl7aWYodHlwZW9mIFNETCE9InVuZGVmaW5lZCIpe3ZhciBmbGFncz1IRUFQVTMyW1NETC5zY3JlZW4rUnVudGltZS5RVUFOVFVNX1NJWkUqMD4+Ml07ZmxhZ3M9ZmxhZ3N8ODM4ODYwODtIRUFQMzJbU0RMLnNjcmVlbitSdW50aW1lLlFVQU5UVU1fU0laRSowPj4yXT1mbGFnc31Ccm93c2VyLnVwZGF0ZVJlc2l6ZUxpc3RlbmVycygpfSksc2V0V2luZG93ZWRDYW52YXNTaXplOihmdW5jdGlvbigpe2lmKHR5cGVvZiBTREwhPSJ1bmRlZmluZWQiKXt2YXIgZmxhZ3M9SEVBUFUzMltTREwuc2NyZWVuK1J1bnRpbWUuUVVBTlRVTV9TSVpFKjA+PjJdO2ZsYWdzPWZsYWdzJn44Mzg4NjA4O0hFQVAzMltTREwuc2NyZWVuK1J1bnRpbWUuUVVBTlRVTV9TSVpFKjA+PjJdPWZsYWdzfUJyb3dzZXIudXBkYXRlUmVzaXplTGlzdGVuZXJzKCl9KSx1cGRhdGVDYW52YXNEaW1lbnNpb25zOihmdW5jdGlvbihjYW52YXMsd05hdGl2ZSxoTmF0aXZlKXtpZih3TmF0aXZlJiZoTmF0aXZlKXtjYW52YXMud2lkdGhOYXRpdmU9d05hdGl2ZTtjYW52YXMuaGVpZ2h0TmF0aXZlPWhOYXRpdmV9ZWxzZXt3TmF0aXZlPWNhbnZhcy53aWR0aE5hdGl2ZTtoTmF0aXZlPWNhbnZhcy5oZWlnaHROYXRpdmV9dmFyIHc9d05hdGl2ZTt2YXIgaD1oTmF0aXZlO2lmKE1vZHVsZVsiZm9yY2VkQXNwZWN0UmF0aW8iXSYmTW9kdWxlWyJmb3JjZWRBc3BlY3RSYXRpbyJdPjApe2lmKHcvaDxNb2R1bGVbImZvcmNlZEFzcGVjdFJhdGlvIl0pe3c9TWF0aC5yb3VuZChoKk1vZHVsZVsiZm9yY2VkQXNwZWN0UmF0aW8iXSl9ZWxzZXtoPU1hdGgucm91bmQody9Nb2R1bGVbImZvcmNlZEFzcGVjdFJhdGlvIl0pfX1pZigoZG9jdW1lbnRbIndlYmtpdEZ1bGxTY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsibW96RnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1vekZ1bGxzY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJmdWxsU2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsiZnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCJdKT09PWNhbnZhcy5wYXJlbnROb2RlJiZ0eXBlb2Ygc2NyZWVuIT0idW5kZWZpbmVkIil7dmFyIGZhY3Rvcj1NYXRoLm1pbihzY3JlZW4ud2lkdGgvdyxzY3JlZW4uaGVpZ2h0L2gpO3c9TWF0aC5yb3VuZCh3KmZhY3Rvcik7aD1NYXRoLnJvdW5kKGgqZmFjdG9yKX1pZihCcm93c2VyLnJlc2l6ZUNhbnZhcyl7aWYoY2FudmFzLndpZHRoIT13KWNhbnZhcy53aWR0aD13O2lmKGNhbnZhcy5oZWlnaHQhPWgpY2FudmFzLmhlaWdodD1oO2lmKHR5cGVvZiBjYW52YXMuc3R5bGUhPSJ1bmRlZmluZWQiKXtjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIndpZHRoIik7Y2FudmFzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKX19ZWxzZXtpZihjYW52YXMud2lkdGghPXdOYXRpdmUpY2FudmFzLndpZHRoPXdOYXRpdmU7aWYoY2FudmFzLmhlaWdodCE9aE5hdGl2ZSljYW52YXMuaGVpZ2h0PWhOYXRpdmU7aWYodHlwZW9mIGNhbnZhcy5zdHlsZSE9InVuZGVmaW5lZCIpe2lmKHchPXdOYXRpdmV8fGghPWhOYXRpdmUpe2NhbnZhcy5zdHlsZS5zZXRQcm9wZXJ0eSgid2lkdGgiLHcrInB4IiwiaW1wb3J0YW50Iik7Y2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCJoZWlnaHQiLGgrInB4IiwiaW1wb3J0YW50Iil9ZWxzZXtjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIndpZHRoIik7Y2FudmFzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKX19fX0pfTtmdW5jdGlvbiBfX19jdHlwZV9iX2xvYygpe3ZhciBtZT1fX19jdHlwZV9iX2xvYztpZighbWUucmV0KXt2YXIgdmFsdWVzPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwyLDIsMiwyLDIsMiwyLDIsODE5NSw4MTk0LDgxOTQsODE5NCw4MTk0LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDI0NTc3LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDU0NTM2LDU0NTM2LDU0NTM2LDU0NTM2LDU0NTM2LDU0NTM2LDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDU0NzkyLDU0NzkyLDU0NzkyLDU0NzkyLDU0NzkyLDU0NzkyLDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTt2YXIgaTE2c2l6ZT0yO3ZhciBhcnI9X21hbGxvYyh2YWx1ZXMubGVuZ3RoKmkxNnNpemUpO2Zvcih2YXIgaT0wO2k8dmFsdWVzLmxlbmd0aDtpKyspe0hFQVAxNlthcnIraSppMTZzaXplPj4xXT12YWx1ZXNbaV19bWUucmV0PWFsbG9jYXRlKFthcnIrMTI4KmkxNnNpemVdLCJpMTYqIixBTExPQ19OT1JNQUwpfXJldHVybiBtZS5yZXR9ZnVuY3Rpb24gX2ZyZWUoKXt9TW9kdWxlWyJfZnJlZSJdPV9mcmVlO2Z1bmN0aW9uIF9mcmVlbG9jYWxlKGxvY2FsZSl7X2ZyZWUobG9jYWxlKX1mdW5jdGlvbiBfX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uKHNpemUpe3ZhciBwdHI9X21hbGxvYyhzaXplK19fX2N4YV9leGNlcHRpb25faGVhZGVyX3NpemUpO3JldHVybiBwdHIrX19fY3hhX2V4Y2VwdGlvbl9oZWFkZXJfc2l6ZX1mdW5jdGlvbiBfZm1vZCh4LHkpe3JldHVybiB4JXl9dmFyIF9mbW9kbD1fZm1vZDtmdW5jdGlvbiBfY2F0b3BlbihuYW1lLG9mbGFnKXtyZXR1cm4tMX1mdW5jdGlvbiBfY2F0Z2V0cyhjYXRkLHNldF9pZCxtc2dfaWQscyl7cmV0dXJuIHN9ZnVuY3Rpb24gX3NwcmludGYocyxmb3JtYXQsdmFyYXJncyl7cmV0dXJuIF9zbnByaW50ZihzLHVuZGVmaW5lZCxmb3JtYXQsdmFyYXJncyl9ZnVuY3Rpb24gX2FzcHJpbnRmKHMsZm9ybWF0LHZhcmFyZ3Mpe3JldHVybiBfc3ByaW50Zigtcyxmb3JtYXQsdmFyYXJncyl9ZnVuY3Rpb24gX3Zhc3ByaW50ZihzLGZvcm1hdCx2YV9hcmcpe3JldHVybiBfYXNwcmludGYocyxmb3JtYXQsSEVBUDMyW3ZhX2FyZz4+Ml0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0KCl7TW9kdWxlWyJwcmludEVyciJdKCJtaXNzaW5nIGZ1bmN0aW9uOiBfZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0Iik7YWJvcnQoLTEpfWZ1bmN0aW9uIF90aW1lKHB0cil7dmFyIHJldD1NYXRoLmZsb29yKERhdGUubm93KCkvMWUzKTtpZihwdHIpe0hFQVAzMltwdHI+PjJdPXJldH1yZXR1cm4gcmV0fWZ1bmN0aW9uIF9jb3B5c2lnbihhLGIpe3JldHVybiBfX3JlYWxseU5lZ2F0aXZlKGEpPT09X19yZWFsbHlOZWdhdGl2ZShiKT9hOi1hfWZ1bmN0aW9uIF9fX2N0eXBlX3RvdXBwZXJfbG9jKCl7dmFyIG1lPV9fX2N0eXBlX3RvdXBwZXJfbG9jO2lmKCFtZS5yZXQpe3ZhciB2YWx1ZXM9WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwtMSwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDEyMywxMjQsMTI1LDEyNiwxMjcsMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NV07dmFyIGkzMnNpemU9NDt2YXIgYXJyPV9tYWxsb2ModmFsdWVzLmxlbmd0aCppMzJzaXplKTtmb3IodmFyIGk9MDtpPHZhbHVlcy5sZW5ndGg7aSsrKXtIRUFQMzJbYXJyK2kqaTMyc2l6ZT4+Ml09dmFsdWVzW2ldfW1lLnJldD1hbGxvY2F0ZShbYXJyKzEyOCppMzJzaXplXSwiaTMyKiIsQUxMT0NfTk9STUFMKX1yZXR1cm4gbWUucmV0fWZ1bmN0aW9uIF9fX2N4YV9ndWFyZF9hY3F1aXJlKHZhcmlhYmxlKXtpZighSEVBUDhbdmFyaWFibGU+PjBdKXtIRUFQOFt2YXJpYWJsZT4+MF09MTtyZXR1cm4gMX1yZXR1cm4gMH1mdW5jdGlvbiBfX19jdHlwZV90b2xvd2VyX2xvYygpe3ZhciBtZT1fX19jdHlwZV90b2xvd2VyX2xvYztpZighbWUucmV0KXt2YXIgdmFsdWVzPVsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsLTEsMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwLDExMSwxMTIsMTEzLDExNCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1XTt2YXIgaTMyc2l6ZT00O3ZhciBhcnI9X21hbGxvYyh2YWx1ZXMubGVuZ3RoKmkzMnNpemUpO2Zvcih2YXIgaT0wO2k8dmFsdWVzLmxlbmd0aDtpKyspe0hFQVAzMlthcnIraSppMzJzaXplPj4yXT12YWx1ZXNbaV19bWUucmV0PWFsbG9jYXRlKFthcnIrMTI4KmkzMnNpemVdLCJpMzIqIixBTExPQ19OT1JNQUwpfXJldHVybiBtZS5yZXR9dmFyIF9fX2N4YV9jYXVnaHRfZXhjZXB0aW9ucz1bXTtmdW5jdGlvbiBfX19jeGFfYmVnaW5fY2F0Y2gocHRyKXtfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udi51bmNhdWdodF9leGNlcHRpb24tLTtfX19jeGFfY2F1Z2h0X2V4Y2VwdGlvbnMucHVzaChfX19jeGFfbGFzdF90aHJvd25fZXhjZXB0aW9uKTtyZXR1cm4gcHRyfU1vZHVsZVsiX2JpdHNoaWZ0NjRTaGwiXT1fYml0c2hpZnQ2NFNobDtmdW5jdGlvbiBfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYoKXtpZighX19aTktTdDlleGNlcHRpb240d2hhdEV2LmJ1ZmZlcil7dmFyIG5hbWU9InN0ZDo6ZXhjZXB0aW9uIjtfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYuYnVmZmVyPV9tYWxsb2MobmFtZS5sZW5ndGgrMSk7d3JpdGVTdHJpbmdUb01lbW9yeShuYW1lLF9fWk5LU3Q5ZXhjZXB0aW9uNHdoYXRFdi5idWZmZXIpfXJldHVybiBfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYuYnVmZmVyfWZ1bmN0aW9uIF9fWk5TdDlleGNlcHRpb25EMkV2KCl7fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yKCl7TW9kdWxlWyJwcmludEVyciJdKCJtaXNzaW5nIGZ1bmN0aW9uOiBfZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yIik7YWJvcnQoLTEpfXZhciBfY29weXNpZ25sPV9jb3B5c2lnbjtmdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbigpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbiIpO2Fib3J0KC0xKX12YXIgX19aVElTdDlleGNlcHRpb249YWxsb2NhdGUoW2FsbG9jYXRlKFsxLDAsMCwwLDAsMCwwXSwiaTgiLEFMTE9DX1NUQVRJQykrOCwwXSwiaTMyIixBTExPQ19TVEFUSUMpO3ZhciBfX19kc29faGFuZGxlPWFsbG9jYXRlKDEsImkzMioiLEFMTE9DX1NUQVRJQyk7RlMuc3RhdGljSW5pdCgpO19fQVRJTklUX18udW5zaGlmdCh7ZnVuYzooZnVuY3Rpb24oKXtpZighTW9kdWxlWyJub0ZTSW5pdCJdJiYhRlMuaW5pdC5pbml0aWFsaXplZClGUy5pbml0KCl9KX0pO19fQVRNQUlOX18ucHVzaCh7ZnVuYzooZnVuY3Rpb24oKXtGUy5pZ25vcmVQZXJtaXNzaW9ucz1mYWxzZX0pfSk7X19BVEVYSVRfXy5wdXNoKHtmdW5jOihmdW5jdGlvbigpe0ZTLnF1aXQoKX0pfSk7TW9kdWxlWyJGU19jcmVhdGVGb2xkZXIiXT1GUy5jcmVhdGVGb2xkZXI7TW9kdWxlWyJGU19jcmVhdGVQYXRoIl09RlMuY3JlYXRlUGF0aDtNb2R1bGVbIkZTX2NyZWF0ZURhdGFGaWxlIl09RlMuY3JlYXRlRGF0YUZpbGU7TW9kdWxlWyJGU19jcmVhdGVQcmVsb2FkZWRGaWxlIl09RlMuY3JlYXRlUHJlbG9hZGVkRmlsZTtNb2R1bGVbIkZTX2NyZWF0ZUxhenlGaWxlIl09RlMuY3JlYXRlTGF6eUZpbGU7TW9kdWxlWyJGU19jcmVhdGVMaW5rIl09RlMuY3JlYXRlTGluaztNb2R1bGVbIkZTX2NyZWF0ZURldmljZSJdPUZTLmNyZWF0ZURldmljZTtfX19lcnJub19zdGF0ZT1SdW50aW1lLnN0YXRpY0FsbG9jKDQpO0hFQVAzMltfX19lcnJub19zdGF0ZT4+Ml09MDtfX0FUSU5JVF9fLnVuc2hpZnQoe2Z1bmM6KGZ1bmN0aW9uKCl7VFRZLmluaXQoKX0pfSk7X19BVEVYSVRfXy5wdXNoKHtmdW5jOihmdW5jdGlvbigpe1RUWS5zaHV0ZG93bigpfSl9KTtUVFkudXRmOD1uZXcgUnVudGltZS5VVEY4UHJvY2Vzc29yO2lmKEVOVklST05NRU5UX0lTX05PREUpe3ZhciBmcz1yZXF1aXJlKCJmcyIpO05PREVGUy5zdGF0aWNJbml0KCl9X19BVElOSVRfXy5wdXNoKHtmdW5jOihmdW5jdGlvbigpe1NPQ0tGUy5yb290PUZTLm1vdW50KFNPQ0tGUyx7fSxudWxsKX0pfSk7X2ZnZXRjLnJldD1hbGxvY2F0ZShbMF0sImk4IixBTExPQ19TVEFUSUMpO01vZHVsZVsicmVxdWVzdEZ1bGxTY3JlZW4iXT1mdW5jdGlvbiBNb2R1bGVfcmVxdWVzdEZ1bGxTY3JlZW4obG9ja1BvaW50ZXIscmVzaXplQ2FudmFzKXtCcm93c2VyLnJlcXVlc3RGdWxsU2NyZWVuKGxvY2tQb2ludGVyLHJlc2l6ZUNhbnZhcyl9O01vZHVsZVsicmVxdWVzdEFuaW1hdGlvbkZyYW1lIl09ZnVuY3Rpb24gTW9kdWxlX3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jKXtCcm93c2VyLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jKX07TW9kdWxlWyJzZXRDYW52YXNTaXplIl09ZnVuY3Rpb24gTW9kdWxlX3NldENhbnZhc1NpemUod2lkdGgsaGVpZ2h0LG5vVXBkYXRlcyl7QnJvd3Nlci5zZXRDYW52YXNTaXplKHdpZHRoLGhlaWdodCxub1VwZGF0ZXMpfTtNb2R1bGVbInBhdXNlTWFpbkxvb3AiXT1mdW5jdGlvbiBNb2R1bGVfcGF1c2VNYWluTG9vcCgpe0Jyb3dzZXIubWFpbkxvb3AucGF1c2UoKX07TW9kdWxlWyJyZXN1bWVNYWluTG9vcCJdPWZ1bmN0aW9uIE1vZHVsZV9yZXN1bWVNYWluTG9vcCgpe0Jyb3dzZXIubWFpbkxvb3AucmVzdW1lKCl9O01vZHVsZVsiZ2V0VXNlck1lZGlhIl09ZnVuY3Rpb24gTW9kdWxlX2dldFVzZXJNZWRpYSgpe0Jyb3dzZXIuZ2V0VXNlck1lZGlhKCl9O1NUQUNLX0JBU0U9U1RBQ0tUT1A9UnVudGltZS5hbGlnbk1lbW9yeShTVEFUSUNUT1ApO3N0YXRpY1NlYWxlZD10cnVlO1NUQUNLX01BWD1TVEFDS19CQVNFKzUyNDI4ODA7RFlOQU1JQ19CQVNFPURZTkFNSUNUT1A9UnVudGltZS5hbGlnbk1lbW9yeShTVEFDS19NQVgpO2Fzc2VydChEWU5BTUlDX0JBU0U8VE9UQUxfTUVNT1JZLCJUT1RBTF9NRU1PUlkgbm90IGJpZyBlbm91Z2ggZm9yIHN0YWNrIik7dmFyIGN0bHpfaTg9YWxsb2NhdGUoWzgsNyw2LDYsNSw1LDUsNSw0LDQsNCw0LDQsNCw0LDQsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLCJpOCIsQUxMT0NfRFlOQU1JQyk7dmFyIGN0dHpfaTg9YWxsb2NhdGUoWzgsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNiwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw3LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNSwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDYsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDBdLCJpOCIsQUxMT0NfRFlOQU1JQyk7dmFyIE1hdGhfbWluPU1hdGgubWluO2Z1bmN0aW9uIGludm9rZV9paWlpKGluZGV4LGExLGEyLGEzKXt0cnl7cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF9paWlpIl0oaW5kZXgsYTEsYTIsYTMpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2LGE3KXt0cnl7TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYsYTcpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpaWkiXShpbmRleCxhMSxhMixhMyxhNCxhNSl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfaShpbmRleCl7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaSJdKGluZGV4KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV92aShpbmRleCxhMSl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aSJdKGluZGV4LGExKX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV92aWkoaW5kZXgsYTEsYTIpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpIl0oaW5kZXgsYTEsYTIpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWkoaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYsYTcsYTgsYTkpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpaWlpaWlpaSJdKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4LGE5KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV9paShpbmRleCxhMSl7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaWkiXShpbmRleCxhMSl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaWQoaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYsYTcpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpaWlpaWQiXShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaShpbmRleCxhMSxhMixhMyl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpIl0oaW5kZXgsYTEsYTIsYTMpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWQoaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpaWlpZCJdKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV92KGluZGV4KXt0cnl7TW9kdWxlWyJkeW5DYWxsX3YiXShpbmRleCl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4KXt0cnl7cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWkiXShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfaWlpaWkoaW5kZXgsYTEsYTIsYTMsYTQpe3RyeXtyZXR1cm4gTW9kdWxlWyJkeW5DYWxsX2lpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpaWlpaWkiXShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSxhNil7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX2lpaShpbmRleCxhMSxhMil7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaWlpIl0oaW5kZXgsYTEsYTIpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX2lpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSl7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaWlpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQsYTUpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpKGluZGV4LGExLGEyLGEzLGE0KXt0cnl7TW9kdWxlWyJkeW5DYWxsX3ZpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gYXNtUHJpbnRJbnQoeCx5KXtNb2R1bGUucHJpbnQoImludCAiK3grIiwiK3kpfWZ1bmN0aW9uIGFzbVByaW50RmxvYXQoeCx5KXtNb2R1bGUucHJpbnQoImZsb2F0ICIreCsiLCIreSl9dmFyIGFzbT0oZnVuY3Rpb24oZ2xvYmFsLGVudixidWZmZXIpIHsKLy8gRU1TQ1JJUFRFTl9TVEFSVF9BU00KInVzZSBhc20iO3ZhciBhPW5ldyBnbG9iYWwuSW50OEFycmF5KGJ1ZmZlcik7dmFyIGI9bmV3IGdsb2JhbC5JbnQxNkFycmF5KGJ1ZmZlcik7dmFyIGM9bmV3IGdsb2JhbC5JbnQzMkFycmF5KGJ1ZmZlcik7dmFyIGQ9bmV3IGdsb2JhbC5VaW50OEFycmF5KGJ1ZmZlcik7dmFyIGU9bmV3IGdsb2JhbC5VaW50MTZBcnJheShidWZmZXIpO3ZhciBmPW5ldyBnbG9iYWwuVWludDMyQXJyYXkoYnVmZmVyKTt2YXIgZz1uZXcgZ2xvYmFsLkZsb2F0MzJBcnJheShidWZmZXIpO3ZhciBoPW5ldyBnbG9iYWwuRmxvYXQ2NEFycmF5KGJ1ZmZlcik7dmFyIGk9ZW52LlNUQUNLVE9QfDA7dmFyIGo9ZW52LlNUQUNLX01BWHwwO3ZhciBrPWVudi50ZW1wRG91YmxlUHRyfDA7dmFyIGw9ZW52LkFCT1JUfDA7dmFyIG09ZW52LmN0dHpfaTh8MDt2YXIgbj1lbnYuY3Rsel9pOHwwO3ZhciBvPWVudi5fX1pUSVN0OWV4Y2VwdGlvbnwwO3ZhciBwPWVudi5fX19kc29faGFuZGxlfDA7dmFyIHE9ZW52Ll9zdGRlcnJ8MDt2YXIgcj1lbnYuX3N0ZGlufDA7dmFyIHM9ZW52Ll9zdGRvdXR8MDt2YXIgdD0wO3ZhciB1PTA7dmFyIHY9MDt2YXIgdz0wO3ZhciB4PStlbnYuTmFOLHk9K2Vudi5JbmZpbml0eTt2YXIgej0wLEE9MCxCPTAsQz0wLEQ9MC4wLEU9MCxGPTAsRz0wLEg9MC4wO3ZhciBJPTA7dmFyIEo9MDt2YXIgSz0wO3ZhciBMPTA7dmFyIE09MDt2YXIgTj0wO3ZhciBPPTA7dmFyIFA9MDt2YXIgUT0wO3ZhciBSPTA7dmFyIFM9Z2xvYmFsLk1hdGguZmxvb3I7dmFyIFQ9Z2xvYmFsLk1hdGguYWJzO3ZhciBVPWdsb2JhbC5NYXRoLnNxcnQ7dmFyIFY9Z2xvYmFsLk1hdGgucG93O3ZhciBXPWdsb2JhbC5NYXRoLmNvczt2YXIgWD1nbG9iYWwuTWF0aC5zaW47dmFyIFk9Z2xvYmFsLk1hdGgudGFuO3ZhciBaPWdsb2JhbC5NYXRoLmFjb3M7dmFyIF89Z2xvYmFsLk1hdGguYXNpbjt2YXIgJD1nbG9iYWwuTWF0aC5hdGFuO3ZhciBhYT1nbG9iYWwuTWF0aC5hdGFuMjt2YXIgYmE9Z2xvYmFsLk1hdGguZXhwO3ZhciBjYT1nbG9iYWwuTWF0aC5sb2c7dmFyIGRhPWdsb2JhbC5NYXRoLmNlaWw7dmFyIGVhPWdsb2JhbC5NYXRoLmltdWw7dmFyIGZhPWVudi5hYm9ydDt2YXIgZ2E9ZW52LmFzc2VydDt2YXIgaGE9ZW52LmFzbVByaW50SW50O3ZhciBpYT1lbnYuYXNtUHJpbnRGbG9hdDt2YXIgamE9ZW52Lm1pbjt2YXIga2E9ZW52LmpzQ2FsbDt2YXIgbGE9ZW52Lmludm9rZV9paWlpO3ZhciBtYT1lbnYuaW52b2tlX3ZpaWlpaWlpO3ZhciBuYT1lbnYuaW52b2tlX3ZpaWlpaTt2YXIgb2E9ZW52Lmludm9rZV9pO3ZhciBwYT1lbnYuaW52b2tlX3ZpO3ZhciBxYT1lbnYuaW52b2tlX3ZpaTt2YXIgcmE9ZW52Lmludm9rZV92aWlpaWlpaWlpO3ZhciBzYT1lbnYuaW52b2tlX2lpO3ZhciB0YT1lbnYuaW52b2tlX3ZpaWlpaWlkO3ZhciB1YT1lbnYuaW52b2tlX3ZpaWk7dmFyIHZhPWVudi5pbnZva2VfdmlpaWlpZDt2YXIgd2E9ZW52Lmludm9rZV92O3ZhciB4YT1lbnYuaW52b2tlX2lpaWlpaWlpaTt2YXIgeWE9ZW52Lmludm9rZV9paWlpaTt2YXIgemE9ZW52Lmludm9rZV92aWlpaWlpaWk7dmFyIEFhPWVudi5pbnZva2VfdmlpaWlpaTt2YXIgQmE9ZW52Lmludm9rZV9paWk7dmFyIENhPWVudi5pbnZva2VfaWlpaWlpO3ZhciBEYT1lbnYuaW52b2tlX3ZpaWlpO3ZhciBFYT1lbnYuX2ZhYnM7dmFyIEZhPWVudi5fc3NjYW5mO3ZhciBHYT1lbnYuX3B0aHJlYWRfY29uZF93YWl0O3ZhciBIYT1lbnYuX19fY3R5cGVfdG9sb3dlcl9sb2M7dmFyIElhPWVudi5fYXNwcmludGY7dmFyIEphPWVudi5fX2VtYmluZF9yZWdpc3Rlcl92b2lkO3ZhciBLYT1lbnYuX3NlbmQ7dmFyIExhPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldzt2YXIgTWE9ZW52Ll92c3NjYW5mO3ZhciBOYT1lbnYuX19fY3R5cGVfYl9sb2M7dmFyIE9hPWVudi5fX1pTdDl0ZXJtaW5hdGV2O3ZhciBQYT1lbnYuX2Ztb2Q7dmFyIFFhPWVudi5fX19jeGFfZ3VhcmRfYWNxdWlyZTt2YXIgUmE9ZW52Ll9fX3NldEVyck5vO3ZhciBTYT1lbnYuX19fY3hhX2lzX251bWJlcl90eXBlO3ZhciBUYT1lbnYuX19fZ3h4X3BlcnNvbmFsaXR5X3YwO3ZhciBVYT1lbnYuX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcjt2YXIgVmE9ZW52Ll91bmdldGM7dmFyIFdhPWVudi5fX19hc3NlcnRfZmFpbDt2YXIgWGE9ZW52Ll9fX2N4YV9hbGxvY2F0ZV9leGNlcHRpb247dmFyIFlhPWVudi5fX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udjt2YXIgWmE9ZW52Ll9fX2N0eXBlX3RvdXBwZXJfbG9jO3ZhciBfYT1lbnYuX2ZmbHVzaDt2YXIgJGE9ZW52Ll9fX2N4YV9ndWFyZF9yZWxlYXNlO3ZhciBhYj1lbnYuX19hZGREYXlzO3ZhciBiYj1lbnYuX19fZXJybm9fbG9jYXRpb247dmFyIGNiPWVudi5fcHdyaXRlO3ZhciBkYj1lbnYuX3N0cmVycm9yX3I7dmFyIGViPWVudi5fc3RyZnRpbWVfbDt2YXIgZmI9ZW52Ll9fZm9ybWF0U3RyaW5nO3ZhciBnYj1lbnYuX19yZWFsbHlOZWdhdGl2ZTt2YXIgaGI9ZW52Ll9zYnJrO3ZhciBpYj1lbnYuX3VzZWxvY2FsZTt2YXIgamI9ZW52Ll9jYXRnZXRzO3ZhciBrYj1lbnYuX25ld2xvY2FsZTt2YXIgbGI9ZW52Ll9zbnByaW50Zjt2YXIgbWI9ZW52Ll9fX2N4YV9iZWdpbl9jYXRjaDt2YXIgbmI9ZW52Ll9lbXNjcmlwdGVuX21lbWNweV9iaWc7dmFyIG9iPWVudi5fZmlsZW5vO3ZhciBwYj1lbnYuX19lbWJpbmRfcmVnaXN0ZXJfYm9vbDt2YXIgcWI9ZW52Ll9fX3Jlc3VtZUV4Y2VwdGlvbjt2YXIgcmI9ZW52Ll9fX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoO3ZhciBzYj1lbnYuX3N5c2NvbmY7dmFyIHRiPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nO3ZhciB1Yj1lbnYuX3N0cmZ0aW1lO3ZhciB2Yj1lbnYuX19hcnJheVN1bTt2YXIgd2I9ZW52Ll9fX2N4YV90aHJvdzt2YXIgeGI9ZW52Ll9fZW1iaW5kX3JlZ2lzdGVyX2VtdmFsO3ZhciB5Yj1lbnYuX19leGl0O3ZhciB6Yj1lbnYuX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfZnVuY3Rpb247dmFyIEFiPWVudi5fX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXY7dmFyIEJiPWVudi5fcHRocmVhZF9tdXRleF9kZXN0cm95O3ZhciBDYj1lbnYuX3B0aHJlYWRfbXV0ZXhfdW5sb2NrO3ZhciBEYj1lbnYuX2ZyZWFkO3ZhciBFYj1lbnYuX3B0aHJlYWRfY29uZF9icm9hZGNhc3Q7dmFyIEZiPWVudi5fbWtwb3J0O3ZhciBHYj1lbnYuX3NwcmludGY7dmFyIEhiPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9jbGFzczt2YXIgSWI9ZW52Ll92YXNwcmludGY7dmFyIEpiPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZzt2YXIgS2I9ZW52Ll93cml0ZTt2YXIgTGI9ZW52Ll9faXNMZWFwWWVhcjt2YXIgTWI9ZW52Ll9fc2NhblN0cmluZzt2YXIgTmI9ZW52Ll9zdHJlcnJvcjt2YXIgT2I9ZW52Ll9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yO3ZhciBQYj1lbnYuX3JlY3Y7dmFyIFFiPWVudi5fdnNucHJpbnRmO3ZhciBSYj1lbnYuX19aTlN0OWV4Y2VwdGlvbkQyRXY7dmFyIFNiPWVudi5fY29weXNpZ247dmFyIFRiPWVudi5fZmdldGM7dmFyIFViPWVudi5fX19jeGFfZG9lc19pbmhlcml0O3ZhciBWYj1lbnYuX2ZyZWVsb2NhbGU7dmFyIFdiPWVudi5fcmVhZDt2YXIgWGI9ZW52Ll9hYm9ydDt2YXIgWWI9ZW52Ll9jYXRjbG9zZTt2YXIgWmI9ZW52Ll9md3JpdGU7dmFyIF9iPWVudi5fdGltZTt2YXIgJGI9ZW52Ll9wdGhyZWFkX211dGV4X2xvY2s7dmFyIGFjPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9mbG9hdDt2YXIgYmM9ZW52Ll9wcmVhZDt2YXIgY2M9ZW52Ll9hdGV4aXQ7dmFyIGRjPWVudi5fY2F0b3Blbjt2YXIgZWM9ZW52Ll9leGl0O3ZhciBmYz1lbnYuX19nZXRGbG9hdDt2YXIgZ2M9MC4wOwovLyBFTVNDUklQVEVOX1NUQVJUX0ZVTkNTCmZ1bmN0aW9uIEFjKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2k9aSthfDA7aT1pKzcmLTg7cmV0dXJuIGJ8MH1mdW5jdGlvbiBCYygpe3JldHVybiBpfDB9ZnVuY3Rpb24gQ2MoYSl7YT1hfDA7aT1hfWZ1bmN0aW9uIERjKGEsYil7YT1hfDA7Yj1ifDA7aWYoKHR8MCk9PTApe3Q9YTt1PWJ9fWZ1bmN0aW9uIEVjKGIpe2I9YnwwO2Fbaz4+MF09YVtiPj4wXTthW2srMT4+MF09YVtiKzE+PjBdO2FbaysyPj4wXT1hW2IrMj4+MF07YVtrKzM+PjBdPWFbYiszPj4wXX1mdW5jdGlvbiBGYyhiKXtiPWJ8MDthW2s+PjBdPWFbYj4+MF07YVtrKzE+PjBdPWFbYisxPj4wXTthW2srMj4+MF09YVtiKzI+PjBdO2FbayszPj4wXT1hW2IrMz4+MF07YVtrKzQ+PjBdPWFbYis0Pj4wXTthW2srNT4+MF09YVtiKzU+PjBdO2Fbays2Pj4wXT1hW2IrNj4+MF07YVtrKzc+PjBdPWFbYis3Pj4wXX1mdW5jdGlvbiBHYyhhKXthPWF8MDtJPWF9ZnVuY3Rpb24gSGMoKXtyZXR1cm4gSXwwfWZ1bmN0aW9uIEljKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtmPWk7aT1pKzE2fDA7bT1mO2w9U2MoamgoU2MoODM1Miw1MTY4KXwwLGUpfDAsNTE4NCl8MDtqPWNbbCsoKGNbKGNbbD4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO2g9ais0fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1ttPj4yXT0xMzQ1NjtjW20rND4+Ml09MjA4O2NbbSs4Pj4yXT0wO2NnKDEzNDU2LG0pfW09KGNbMTM0NjA+PjJdfDApKyAtMXwwO249Y1tqKzg+PjJdfDA7aWYoKGNbaisxMj4+Ml18MCktbj4+Mj4+PjA+bT4+PjA/KGs9Y1tuKyhtPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7az14Y1tjWyhjW2s+PjJdfDApKzI4Pj4yXSY2M10oaywxMCl8MDtuPWNbaD4+Ml18MDtjW2g+PjJdPW4rIC0xO2lmKChufDApPT0wKXtsY1tjWyhjW2o+PjJdfDApKzg+PjJdJjI1NV0oail9bGgobCxrKTtZZyhsKTt3aGlsZSgxKXtoPXVuKDIwKXwwO2lmKChofDApIT0wKXticmVha31oPWNbNTY2Nl18MDtjWzU2NjZdPWgrMDtpZigoaHwwKT09MCl7Zz0xNDticmVha31zY1toJjMxXSgpfWlmKChnfDApPT0xNCl7bj1YYSg0KXwwO2Nbbj4+Ml09MjI2ODA7d2IobnwwLDIyNzI4LDIwNil9Y1toPj4yXT1kO2NbaCs0Pj4yXT1lO2NbaCs4Pj4yXT0wO2FbaCsxMj4+MF09MDthW2grMTM+PjBdPTA7Y1toKzE2Pj4yXT0wO3doaWxlKDEpe2Q9dW4oMTYpfDA7aWYoKGR8MCkhPTApe2JyZWFrfWU9Y1s1NjY2XXwwO2NbNTY2Nl09ZSswO2lmKChlfDApPT0wKXtnPTIwO2JyZWFrfXNjW2UmMzFdKCl9aWYoKGd8MCk9PTIwKXtuPVhhKDQpfDA7Y1tuPj4yXT0yMjY4MDt3YihufDAsMjI3MjgsMjA2KX1jW2QrND4+Ml09MDtjW2QrOD4+Ml09MDtjW2Q+PjJdPTc0MDg7Y1tkKzEyPj4yXT1oO2NbYj4+Ml09aDtuPWIrNHwwO2U9Y1tuPj4yXXwwO2Nbbj4+Ml09ZDtpZigoZXwwKSE9MCl7bT1lKzR8MDtuPWNbbT4+Ml18MDtjW20+PjJdPW4rIC0xO2lmKChufDApPT0wPyhsY1tjWyhjW2U+PjJdfDApKzg+PjJdJjI1NV0oZSksbT1lKzh8MCxuPWNbbT4+Ml18MCxjW20+PjJdPW4rIC0xLChufDApPT0wKTowKXtsY1tjWyhjW2U+PjJdfDApKzE2Pj4yXSYyNTVdKGUpfWg9Y1tiPj4yXXwwfXdoaWxlKDEpe2U9dW4oMzUyKXwwO2lmKChlfDApIT0wKXticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7Zz0zMTticmVha31zY1tlJjMxXSgpfWlmKChnfDApPT0zMSl7bj1YYSg0KXwwO2Nbbj4+Ml09MjI2ODA7d2IobnwwLDIyNzI4LDIwNil9Y1tlPj4yXT1oO2NbZSs0Pj4yXT1oO2NbZSs4Pj4yXT0wO2NbZSsxMj4+Ml09MDtqPXVuKDEwNDg2NDQpfDA7aD1qKzY4Ji02NDtjW2grIC00Pj4yXT1qO2NbZSsxNj4+Ml09aDtoPWUrMjc5fDA7YVtoPj4wXT0wO2FbaCsxPj4wXT0wO2g9ZSsyODF8MDthW2g+PjBdPTA7YVtoKzE+PjBdPTA7YVtoKzI+PjBdPTA7YVtoKzM+PjBdPTA7aD1lKzM0NHwwO2o9ZSsyODh8MDtkPWorNTZ8MDtkb3tjW2o+PjJdPTA7aj1qKzR8MH13aGlsZSgoanwwKTwoZHwwKSk7bj1oO2Nbbj4+Ml09LTE7Y1tuKzQ+PjJdPS0xO29lKGUpO3doaWxlKDEpe2Q9dW4oMTYpfDA7aWYoKGR8MCkhPTApe2JyZWFrfWQ9Y1s1NjY2XXwwO2NbNTY2Nl09ZCswO2lmKChkfDApPT0wKXtnPTM3O2JyZWFrfXNjW2QmMzFdKCl9aWYoKGd8MCk9PTM3KXtuPVhhKDQpfDA7Y1tuPj4yXT0yMjY4MDt3YihufDAsMjI3MjgsMjA2KX1jW2QrND4+Ml09MDtjW2QrOD4+Ml09MDtjW2Q+PjJdPTcxMjg7Y1tkKzEyPj4yXT1lO2NbYis4Pj4yXT1lO249YisxMnwwO2c9Y1tuPj4yXXwwO2Nbbj4+Ml09ZDtpZigoZ3wwKT09MCl7aT1mO3JldHVybn1tPWcrNHwwO249Y1ttPj4yXXwwO2NbbT4+Ml09bisgLTE7aWYoKG58MCkhPTApe2k9ZjtyZXR1cm59bGNbY1soY1tnPj4yXXwwKSs4Pj4yXSYyNTVdKGcpO209Zys4fDA7bj1jW20+PjJdfDA7Y1ttPj4yXT1uKyAtMTtpZigobnwwKSE9MCl7aT1mO3JldHVybn1sY1tjWyhjW2c+PjJdfDApKzE2Pj4yXSYyNTVdKGcpO2k9ZjtyZXR1cm59bj1YYSg0KXwwO2Nbbj4+Ml09MjEzMDQ7d2IobnwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gSmMoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTA7aD1pO2k9aSsxNzZ8MDtnPWg7az1oKzMyfDA7aj1oKzI0fDA7Zj1oKzEyfDA7Yj1jW2IrOD4+Ml18MDttPWIrMzM2fDA7Qj1tO0M9YisyNTl8MDtsPWIrMzIwfDA7aWYoKCEoKGNbQis0Pj4yXXwwKT09MD8oY1tCPj4yXXwwKT09KGRbQz4+MF18ZFtDKzE+PjBdPDw4fGRbQysyPj4wXTw8MTZ8ZFtDKzM+PjBdPDwyNHwwKTowKT8obj1jW2w+PjJdfDAsKG58MCkhPTApOjApPyhjW2IrMzEyPj4yXXwwKSE9MDowKXt6PW47Qj1jW3o+PjJdfDA7Qj1jW0I+PjJdfDA7bWNbQiYxMjddKHosZSk7ej1tO0I9ejtCPWNbQj4+Ml18MDt6PXorNHwwO3o9Y1t6Pj4yXXwwO3o9SW4oQnwwLHp8MCwxLDApfDA7Qj1JO0M9bTtBPUM7Y1tBPj4yXT16O0M9Qys0fDA7Y1tDPj4yXT1CO2k9aDtyZXR1cm59Y1tsPj4yXT0wO249YiszMjR8MDtwPWNbbj4+Ml18MDtjW24+PjJdPTA7aWYoKChwfDApIT0wPyhCPXArNHwwLEM9Y1tCPj4yXXwwLGNbQj4+Ml09QysgLTEsKEN8MCk9PTApOjApPyhsY1tjWyhjW3A+PjJdfDApKzg+PjJdJjI1NV0ocCksQj1wKzh8MCxDPWNbQj4+Ml18MCxjW0I+PjJdPUMrIC0xLChDfDApPT0wKTowKXtsY1tjWyhjW3A+PjJdfDApKzE2Pj4yXSYyNTVdKHApfXM9YiszMTJ8MDtjW3M+PjJdPTA7cj1iKzMxNnwwO3A9Y1tyPj4yXXwwO2Nbcj4+Ml09MDtpZigoKHB8MCkhPTA/KEI9cCs0fDAsQz1jW0I+PjJdfDAsY1tCPj4yXT1DKyAtMSwoQ3wwKT09MCk6MCk/KGxjW2NbKGNbcD4+Ml18MCkrOD4+Ml0mMjU1XShwKSxCPXArOHwwLEM9Y1tCPj4yXXwwLGNbQj4+Ml09QysgLTEsKEN8MCk9PTApOjApe2xjW2NbKGNbcD4+Ml18MCkrMTY+PjJdJjI1NV0ocCl9d2hpbGUoMSl7cD11bigxMil8MDtpZigocHwwKSE9MCl7YnJlYWt9cD1jWzU2NjZdfDA7Y1s1NjY2XT1wKzA7aWYoKHB8MCk9PTApe289MTU7YnJlYWt9c2NbcCYzMV0oKX1pZigob3wwKT09MTUpe0M9WGEoNCl8MDtjW0M+PjJdPTIyNjgwO3diKEN8MCwyMjcyOCwyMDYpfWNbcD4+Ml09Yis0O2NbcCs0Pj4yXT0wO2NbcCs4Pj4yXT0tMTt3aGlsZSgxKXt0PXVuKDE2KXwwO2lmKCh0fDApIT0wKXticmVha310PWNbNTY2Nl18MDtjWzU2NjZdPXQrMDtpZigodHwwKT09MCl7bz0yMTticmVha31zY1t0JjMxXSgpfWlmKChvfDApPT0yMSl7Qz1YYSg0KXwwO2NbQz4+Ml09MjI2ODA7d2IoQ3wwLDIyNzI4LDIwNil9Y1t0KzQ+PjJdPTA7Y1t0Kzg+PjJdPTA7Y1t0Pj4yXT00ODQwO2NbdCsxMj4+Ml09cDtjW3M+PjJdPXA7dT1jW3I+PjJdfDA7Y1tyPj4yXT10O2lmKCh1fDApIT0wKXtCPXUrNHwwO0M9Y1tCPj4yXXwwO2NbQj4+Ml09QysgLTE7aWYoKEN8MCk9PTA/KGxjW2NbKGNbdT4+Ml18MCkrOD4+Ml0mMjU1XSh1KSxCPXUrOHwwLEM9Y1tCPj4yXXwwLGNbQj4+Ml09QysgLTEsKEN8MCk9PTApOjApe2xjW2NbKGNbdT4+Ml18MCkrMTY+PjJdJjI1NV0odSl9cD1jW3M+PjJdfDB9eT1rKzY0fDA7cz1rKzh8MDtjW3M+PjJdPTQ1MjA7dT1rKzEyfDA7Y1trPj4yXT00NjUyO2NbeT4+Ml09NDY3MjtjW2srND4+Ml09MDtyPWsrNjR8MDtjW2srODg+PjJdPXU7Y1trKzgwPj4yXT0wO2Nbays4ND4+Ml09MDtjW2srNjg+PjJdPTQwOTg7Y1trKzc2Pj4yXT0wO2Nbays3Mj4+Ml09Njt4PWsrOTJ8MDt0PWsrOTZ8MDt3PXQrNDB8MDtkb3tjW3Q+PjJdPTA7dD10KzR8MH13aGlsZSgodHwwKTwod3wwKSk7WGsoeCk7Y1trKzEzNj4+Ml09MDtjW2srMTQwPj4yXT0tMTtjW2s+PjJdPTQ1MDA7Y1t5Pj4yXT00NTQwO2Nbcz4+Ml09NDUyMDtjW3U+PjJdPTEwNjY0O3Q9aysxNnwwO1hrKHQpO3g9aysyMHwwO2NbeCswPj4yXT0wO2NbeCs0Pj4yXT0wO2NbeCs4Pj4yXT0wO2NbeCsxMj4+Ml09MDtjW3grMTY+PjJdPTA7Y1t4KzIwPj4yXT0wO2NbdT4+Ml09NDY4ODt1PWsrNDR8MDt5PWsrNjB8MDtjW3UrMD4+Ml09MDtjW3UrND4+Ml09MDtjW3UrOD4+Ml09MDtjW3UrMTI+PjJdPTA7Y1t5Pj4yXT0yNDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDthW3UrMT4+MF09MDtpZigoYVt1Pj4wXSYxKT09MCl7YVt1Pj4wXT0wfWVsc2V7Y1trKzQ4Pj4yXT0wfXc9ays1NnwwO2Nbdz4+Ml09MDt6PWFbdT4+MF18MDtpZigoeiYxKT09MCl7QT11KygoeiYyNTUpPj4+MSkrMXwwO2Nbdz4+Ml09QTt6PXUrMXwwfWVsc2V7ej1jW2srNTI+PjJdfDA7QT16KyhjW2srNDg+PjJdfDApfDA7Y1t3Pj4yXT1BfWNbeD4+Ml09ejtjW2srMjQ+PjJdPXo7Y1trKzI4Pj4yXT1BO0M9YVt1Pj4wXXwwO2lmKChDJjEpPT0wKXt6PShDJjI1NSk+Pj4xO2Nbdz4+Ml09dSt6KzE7QT0xMH1lbHNle3o9Y1trKzQ4Pj4yXXwwO2Nbdz4+Ml09KGNbays1Mj4+Ml18MCkrejtBPWNbdT4+Ml18MDtDPUEmMjU1O0E9KEEmLTIpKyAtMXwwfUI9KEMmMSk9PTA7aWYoQil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1trKzQ4Pj4yXXwwfWRve2lmKCEoQz4+PjA8QT4+PjApKXtpZihCKXthW3UrQSsxPj4wXT0wO2FbdT4+MF09QTw8MTticmVha31lbHNle2FbKGNbays1Mj4+Ml18MCkrQT4+MF09MDtjW2srNDg+PjJdPUE7YnJlYWt9fWVsc2V7aGcodSxBLUN8MCl9fXdoaWxlKDApO0I9YVt1Pj4wXXwwO2lmKChCJjEpPT0wKXtBPXUrMXwwO0I9KEImMjU1KT4+PjF9ZWxzZXtBPWNbays1Mj4+Ml18MDtCPWNbays0OD4+Ml18MH1DPWsrMzZ8MDtjW0M+PjJdPUE7Y1trKzMyPj4yXT1BO2Nbays0MD4+Ml09QStCO2lmKChjW3k+PjJdJjN8MCkhPTApe2NbQz4+Ml09QSt6fWlmKCEoKGFbZz4+MF0mMSk9PTApPyh2PWNbZys4Pj4yXXwwLCh2fDApIT0wKTowKXt2bih2KX1BPWNbYiszMDA+PjJdfDA7dj1jW2IrMzA0Pj4yXXwwO2lmKChBfDApIT0odnwwKSl7ej1rKzh8MDtkb3tCPWNbQT4+Ml18MDtDPWNbQSs0Pj4yXXwwO0Q9Y1tBKzg+PjJdfDA7aWgoU2MoaWgoU2MoaWgoU2Moeiw0NDY0KXwwLEQpfDAsNDQ3Mil8MCxCKXwwLDQ0ODApfDAsQyl8MDtBPUErMTJ8MH13aGlsZSgoQXwwKSE9KHZ8MCkpfXY9Y1t5Pj4yXXwwO2Rve2lmKCh2JjE2fDApPT0wKXtpZigodiY4fDApPT0wKXtjW2YrMD4+Ml09MDtjW2YrND4+Ml09MDtjW2YrOD4+Ml09MDticmVha314PWNbeD4+Ml18MDt3PWNbaysyOD4+Ml18MDt2PXg7QT13LXZ8MDtpZihBPj4+MD40Mjk0OTY3Mjc5KXtkZygpfWRve2lmKEE+Pj4wPDExKXthW2Y+PjBdPUE8PDE7Qj1mKzF8MH1lbHNle3o9QSsxNiYtMTY7eT0oenwwKT09MD8xOno7d2hpbGUoMSl7Qj11bih5KXwwO2lmKChCfDApIT0wKXtvPTkzO2JyZWFrfUI9Y1s1NjY2XXwwO2NbNTY2Nl09QiswO2lmKChCfDApPT0wKXticmVha31zY1tCJjMxXSgpfWlmKChvfDApPT05Myl7Y1tmKzg+PjJdPUI7Y1tmPj4yXT16fDE7Y1tmKzQ+PjJdPUE7YnJlYWt9RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKCh4fDApIT0od3wwKSl7bz1CO3doaWxlKDEpe2Fbbz4+MF09YVt4Pj4wXXwwO3g9eCsxfDA7aWYoKHh8MCk9PSh3fDApKXticmVha31lbHNle289bysxfDB9fUI9QisodysoMC12KSl8MH1hW0I+PjBdPTB9ZWxzZXt4PWNbdz4+Ml18MDt2PWNbayszNj4+Ml18MDtpZih4Pj4+MDx2Pj4+MCl7Y1t3Pj4yXT12fWVsc2V7dj14fXg9Y1trKzMyPj4yXXwwO3c9eDt6PXYtd3wwO2lmKHo+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9ZG97aWYoej4+PjA8MTEpe2FbZj4+MF09ejw8MTtCPWYrMXwwfWVsc2V7eT16KzE2Ji0xNjtBPSh5fDApPT0wPzE6eTt3aGlsZSgxKXtCPXVuKEEpfDA7aWYoKEJ8MCkhPTApe289NzY7YnJlYWt9Qj1jWzU2NjZdfDA7Y1s1NjY2XT1CKzA7aWYoKEJ8MCk9PTApe2JyZWFrfXNjW0ImMzFdKCl9aWYoKG98MCk9PTc2KXtjW2YrOD4+Ml09QjtjW2Y+PjJdPXl8MTtjW2YrND4+Ml09ejticmVha31EPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKHh8MCkhPSh2fDApKXtvPUI7d2hpbGUoMSl7YVtvPj4wXT1hW3g+PjBdfDA7eD14KzF8MDtpZigoeHwwKT09KHZ8MCkpe2JyZWFrfWVsc2V7bz1vKzF8MH19Qj1CKyh2KygwLXcpKXwwfWFbQj4+MF09MH19d2hpbGUoMCk7Y1trPj4yXT00NTAwO2Nbays2ND4+Ml09NDU0MDtjW3M+PjJdPTQ1MjA7bz1rKzEyfDA7Y1tvPj4yXT00Njg4O2lmKCEoKGFbdT4+MF0mMSk9PTApPyhxPWNbays1Mj4+Ml18MCwocXwwKSE9MCk6MCl7dm4ocSl9Y1tvPj4yXT0xMDY2NDtvPWNbdD4+Ml18MDtDPW8rNHwwO0Q9Y1tDPj4yXXwwO2NbQz4+Ml09RCsgLTE7aWYoKER8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1yZyhyKTtxPWFbZj4+MF18MDtyPShxJjEpPT0wO2lmKHIpe3Q9KHEmMjU1KT4+PjE7dj1mKzF8MH1lbHNle3Q9Y1tmKzQ+PjJdfDA7dj1jW2YrOD4+Ml18MH1zPXQ+Pj4wPjc7bz1zPzc6dDthOmRve2lmKChvfDApPT0wKXtvPTExMH1lbHNle3U9MTkyO3doaWxlKDEpe2lmKChhW3Y+PjBdfDApIT0oYVt1Pj4wXXwwKSl7bz0xMzA7YnJlYWsgYX1vPW8rIC0xfDA7aWYoKG98MCk9PTApe289MTEwO2JyZWFrfWVsc2V7dj12KzF8MDt1PXUrMXwwfX19fXdoaWxlKDApO2Rve2lmKChvfDApPT0xMTApe2lmKHQ+Pj4wPjYmKHNeMSkpe3doaWxlKDEpe2o9dW4oNDc4OCl8MDtpZigoanwwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe289MTE0O2JyZWFrfXNjW2cmMzFdKCl9aWYoKG98MCk9PTExNCl7RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9ZmQoaik7YVtqKzQ3ODQ+PjBdPTE7d2hpbGUoMSl7Zz11bigxMil8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe289MTIxO2JyZWFrfXNjW2cmMzFdKCl9aWYoKG98MCk9PTEyMSl7RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9Y1tnPj4yXT0zNjA4O2NbZys0Pj4yXT1wO2NbZys4Pj4yXT1qO3doaWxlKDEpe2o9dW4oMTYpfDA7aWYoKGp8MCkhPTApe289MTI5O2JyZWFrfWo9Y1s1NjY2XXwwO2NbNTY2Nl09aiswO2lmKChqfDApPT0wKXticmVha31zY1tqJjMxXSgpfWlmKChvfDApPT0xMjkpe2Nbais0Pj4yXT0wO2Nbais4Pj4yXT0wO2Nbaj4+Ml09Mzg3MjtjW2orMTI+PjJdPWc7YnJlYWt9RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9ZWxzZXtvPTEzMH19fXdoaWxlKDApO2I6ZG97aWYoKG98MCk9PTEzMCl7aWYocil7dD0ocSYyNTUpPj4+MTt3PWYrMXwwfWVsc2V7dD1jW2YrND4+Ml18MDt3PWNbZis4Pj4yXXwwfXM9dD4+PjA+MTM7dT1zPzEzOnQ7Yzpkb3tpZigodXwwKT09MCl7bz0xMzZ9ZWxzZXt2PTIwMDt3aGlsZSgxKXtpZigoYVt3Pj4wXXwwKSE9KGFbdj4+MF18MCkpe2JyZWFrIGN9dT11KyAtMXwwO2lmKCh1fDApPT0wKXtvPTEzNjticmVha31lbHNle3c9dysxfDA7dj12KzF8MH19fX13aGlsZSgwKTtkb3tpZigob3wwKT09MTM2KXtpZighKHQ+Pj4wPjEyJihzXjEpKSl7YnJlYWt9d2hpbGUoMSl7aj11big1MTE2KXwwO2lmKChqfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0xNDA7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MTQwKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1mZChqKTtlZChqKzQ3ODR8MCk7Y1tqKzQ5NTI+PjJdPTMyO2Nbais0OTU2Pj4yXT05O2Nbais0OTYwPj4yXT04O2Nbais0OTY0Pj4yXT0wO2Nbais0OTg0Pj4yXT0wO2Nbais0OTg4Pj4yXT0wO2Nbais0OTkyPj4yXT0wO2Nbais1MDA4Pj4yXT0xO2Nbais1MDEyPj4yXT0yO2Nbais1MDA0Pj4yXT00MDk2O2Nbais1ZTM+PjJdPTQ7Y1tqKzQ5OTY+PjJdPTQ7Y1tqKzUwMTY+PjJdPTA7Y1tqKzUwMjA+PjJdPTA7Y1tqKzUwMjQ+PjJdPTA7Y1tqKzQ5Njg+PjJdPTMyO2Nbais0OTcyPj4yXT0wO2Nbais0OTc2Pj4yXT0tMjE0NzQ4MzY0ODtjW2orNDk4MD4+Ml09MjE0NzQ4MzY0NztjW2orNDk0OD4+Ml09MDtjW2orNTAzMj4+Ml09MzI7Y1tqKzUwMzY+PjJdPTk7Y1tqKzUwNDA+PjJdPTg7Y1tqKzUwNDQ+PjJdPTA7Y1tqKzUwNjQ+PjJdPTA7Y1tqKzUwNjg+PjJdPTA7Y1tqKzUwNzI+PjJdPTA7Y1tqKzUwODg+PjJdPTE7Y1tqKzUwOTI+PjJdPTI7Y1tqKzUwODQ+PjJdPTQwOTY7Y1tqKzUwODA+PjJdPTQ7Y1tqKzUwNzY+PjJdPTQ7Y1tqKzUwOTY+PjJdPTA7Y1tqKzUxMDA+PjJdPTA7Y1tqKzUxMDQ+PjJdPTA7Y1tqKzUwNDg+PjJdPTMyO2Nbais1MDUyPj4yXT0wO2Nbais1MDU2Pj4yXT0tMjE0NzQ4MzY0ODtjW2orNTA2MD4+Ml09MjE0NzQ4MzY0NztjW2orNTAyOD4+Ml09MDthW2orNTEwOD4+MF09MDthW2orNTEwOT4+MF09MDthW2orNTExMj4+MF09MTt3aGlsZSgxKXtnPXVuKDEyKXwwO2lmKChnfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0xNDg7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MTQ4KXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1jW2c+PjJdPTI2NjQ7Y1tnKzQ+PjJdPXA7Y1tnKzg+PjJdPWo7d2hpbGUoMSl7aj11bigxNil8MDtpZigoanwwKSE9MCl7bz0xNTY7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2JyZWFrfXNjW2omMzFdKCl9aWYoKG98MCk9PTE1Nil7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7Y1tqPj4yXT0yOTUyO2NbaisxMj4+Ml09ZzticmVhayBifUQ9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihyKXt0PShxJjI1NSk+Pj4xO3Y9ZisxfDB9ZWxzZXt0PWNbZis0Pj4yXXwwO3Y9Y1tmKzg+PjJdfDB9cz10Pj4+MD4xMzt1PXM/MTM6dDtkOmRve2lmKCh1fDApPT0wKXtvPTE2M31lbHNle3c9MjE2O3doaWxlKDEpe2lmKChhW3Y+PjBdfDApIT0oYVt3Pj4wXXwwKSl7YnJlYWsgZH11PXUrIC0xfDA7aWYoKHV8MCk9PTApe289MTYzO2JyZWFrfWVsc2V7dj12KzF8MDt3PXcrMXwwfX19fXdoaWxlKDApO2Rve2lmKChvfDApPT0xNjMpe2lmKCEodD4+PjA+MTImKHNeMSkpKXticmVha313aGlsZSgxKXtqPXVuKDUxMDQpfDA7aWYoKGp8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtvPTE2NzticmVha31zY1tnJjMxXSgpfWlmKChvfDApPT0xNjcpe0Q9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfWZkKGopO2JkKGorNDc4NHwwKTthW2orNTEwMD4+MF09MTt3aGlsZSgxKXtnPXVuKDEyKXwwO2lmKChnfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0xNzU7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MTc1KXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1jW2c+PjJdPTE3MjA7Y1tnKzQ+PjJdPXA7Y1tnKzg+PjJdPWo7d2hpbGUoMSl7aj11bigxNil8MDtpZigoanwwKSE9MCl7bz0xODM7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2JyZWFrfXNjW2omMzFdKCl9aWYoKG98MCk9PTE4Myl7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7Y1tqPj4yXT0yMDA4O2NbaisxMj4+Ml09ZzticmVhayBifUQ9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihyKXtyPShxJjI1NSk+Pj4xO3Q9ZisxfDB9ZWxzZXtyPWNbZis0Pj4yXXwwO3Q9Y1tmKzg+PjJdfDB9cT1yPj4+MD4xOTtzPXE/MTk6cjtlOmRve2lmKChzfDApPT0wKXtvPTE5MH1lbHNle3U9MjMyO3doaWxlKDEpe2lmKChhW3Q+PjBdfDApIT0oYVt1Pj4wXXwwKSl7YnJlYWsgZX1zPXMrIC0xfDA7aWYoKHN8MCk9PTApe289MTkwO2JyZWFrfWVsc2V7dD10KzF8MDt1PXUrMXwwfX19fXdoaWxlKDApO2Rve2lmKChvfDApPT0xOTApe2lmKCEocj4+PjA+MTgmKHFeMSkpKXticmVha313aGlsZSgxKXtqPXVuKDU0MzIpfDA7aWYoKGp8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtvPTE5NDticmVha31zY1tnJjMxXSgpfWlmKChvfDApPT0xOTQpe0Q9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfWZkKGopO2VkKGorNDc4NHwwKTtjW2orNDk1Mj4+Ml09MzI7Y1tqKzQ5NTY+PjJdPTk7Y1tqKzQ5NjA+PjJdPTg7Y1tqKzQ5NjQ+PjJdPTA7Y1tqKzQ5ODQ+PjJdPTA7Y1tqKzQ5ODg+PjJdPTA7Y1tqKzQ5OTI+PjJdPTA7Y1tqKzUwMDg+PjJdPTE7Y1tqKzUwMTI+PjJdPTI7Y1tqKzUwMDQ+PjJdPTQwOTY7Y1tqKzVlMz4+Ml09NDtjW2orNDk5Nj4+Ml09NDtjW2orNTAxNj4+Ml09MDtjW2orNTAyMD4+Ml09MDtjW2orNTAyND4+Ml09MDtjW2orNDk2OD4+Ml09MzI7Y1tqKzQ5NzI+PjJdPTA7Y1tqKzQ5NzY+PjJdPS0yMTQ3NDgzNjQ4O2Nbais0OTgwPj4yXT0yMTQ3NDgzNjQ3O2Nbais0OTQ4Pj4yXT0wO2Nbais1MDMyPj4yXT0zMjtjW2orNTAzNj4+Ml09OTtjW2orNTA0MD4+Ml09ODtjW2orNTA0ND4+Ml09MDtjW2orNTA2ND4+Ml09MDtjW2orNTA2OD4+Ml09MDtjW2orNTA3Mj4+Ml09MDtjW2orNTA4OD4+Ml09MTtjW2orNTA5Mj4+Ml09MjtjW2orNTA4ND4+Ml09NDA5NjtjW2orNTA4MD4+Ml09NDtjW2orNTA3Nj4+Ml09NDtjW2orNTA5Nj4+Ml09MDtjW2orNTEwMD4+Ml09MDtjW2orNTEwND4+Ml09MDtjW2orNTA0OD4+Ml09MzI7Y1tqKzUwNTI+PjJdPTA7Y1tqKzUwNTY+PjJdPS0yMTQ3NDgzNjQ4O2Nbais1MDYwPj4yXT0yMTQ3NDgzNjQ3O2Nbais1MDI4Pj4yXT0wO2Fbais1MTA4Pj4wXT0wO2Fbais1MTA5Pj4wXT0wO2JkKGorNTExMnwwKTthW2orNTQyOD4+MF09MTt3aGlsZSgxKXtnPXVuKDEyKXwwO2lmKChnfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0yMDM7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MjAzKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1jW2c+PjJdPTQyNDtjW2crND4+Ml09cDtjW2crOD4+Ml09ajt3aGlsZSgxKXtqPXVuKDE2KXwwO2lmKChqfDApIT0wKXtvPTIxMTticmVha31qPWNbNTY2Nl18MDtjWzU2NjZdPWorMDtpZigoanwwKT09MCl7YnJlYWt9c2NbaiYzMV0oKX1pZigob3wwKT09MjExKXtjW2orND4+Ml09MDtjW2orOD4+Ml09MDtjW2o+PjJdPTEwMDg7Y1tqKzEyPj4yXT1nO2JyZWFrIGJ9RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2g9U2MoODM1MiwyNTYpfDA7YVtrPj4wXT0wO2Nbays0Pj4yXT1oO2U9Y1soY1toPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2grKGUrMTYpPj4yXXwwKT09MCl7ZT1jW2grKGUrNzIpPj4yXXwwO2lmKChlfDApIT0wKXtZZyhlKX1hW2s+PjBdPTE7ZT1hW2Y+PjBdfDA7ZG97aWYoKGUmMSk9PTApe289KGUmMjU1KT4+PjE7bT1jWyhjW2g+PjJdfDApKyAtMTI+PjJdfDA7bD1jW2grKG0rMjQpPj4yXXwwO249ZisxfDA7aWYoKGNbaCsobSs0KT4+Ml0mMTc2fDApIT0zMil7ZT1uO2I9bzticmVha31lPW47Yj1vO249ZitvKzF8MH1lbHNle249Y1tmKzQ+PjJdfDA7bT1jWyhjW2g+PjJdfDApKyAtMTI+PjJdfDA7bD1jW2grKG0rMjQpPj4yXXwwO2Y9Y1tmKzg+PjJdfDA7aWYoKGNbaCsobSs0KT4+Ml0mMTc2fDApIT0zMil7ZT1mO2I9bjtuPWY7YnJlYWt9ZT1mO2I9bjtuPWYrbnwwfX13aGlsZSgwKTtmPWgrbXwwO289aCsobSs3Nil8MDtwPWNbbz4+Ml18MDtmOmRve2lmKChwfDApPT0tMSl7cD1jW2grKG0rMjgpPj4yXXwwO209cCs0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tnPj4yXT0xMzQ1NjtjW2crND4+Ml09MjA4O2NbZys4Pj4yXT0wO2NnKDEzNDU2LGcpfXE9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3I9Y1twKzg+PjJdfDA7ZG97aWYoKGNbcCsxMj4+Ml18MCktcj4+Mj4+PjA+cT4+PjApe3E9Y1tyKyhxPDwyKT4+Ml18MDtpZigocXwwKT09MCl7YnJlYWt9cT14Y1tjWyhjW3E+PjJdfDApKzI4Pj4yXSY2M10ocSwzMil8MDtEPWNbbT4+Ml18MDtjW20+PjJdPUQrIC0xO2lmKChEfDApPT0wKXtsY1tjWyhjW3A+PjJdfDApKzg+PjJdJjI1NV0ocCl9cD1xPDwyND4+MjQ7Y1tvPj4yXT1wO2JyZWFrIGZ9fXdoaWxlKDApO0Q9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtXYyhqLGwsZSxuLGUrYnwwLGYscCYyNTUpO2lmKChjW2o+PjJdfDApIT0wKXticmVha31EPWNbKGNbaD4+Ml18MCkrIC0xMj4+Ml18MDtxZyhoK0R8MCxjW2grKEQrMTYpPj4yXXw1KX19d2hpbGUoMCk7Z2goayk7Zj1jW2grKChjWyhjW2g+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtlPWYrNHwwO2NbZT4+Ml09KGNbZT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZz4+Ml09MTM0NTY7Y1tnKzQ+PjJdPTIwODtjW2crOD4+Ml09MDtjZygxMzQ1NixnKX1qPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtnPWNbZis4Pj4yXXwwO2Rve2lmKChjW2YrMTI+PjJdfDApLWc+PjI+Pj4wPmo+Pj4wKXtnPWNbZysoajw8Mik+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWc9eGNbY1soY1tnPj4yXXwwKSsyOD4+Ml0mNjNdKGcsMTApfDA7RD1jW2U+PjJdfDA7Y1tlPj4yXT1EKyAtMTtpZigoRHwwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfWxoKGgsZyk7WWcoaCk7Zj1YYSg4KXwwO2NbZj4+Ml09OTkyODt3aGlsZSgxKXtnPXVuKDQ1KXwwO2lmKChnfDApIT0wKXtvPTI1MzticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0yNTE7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MjUxKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1lbHNlIGlmKChvfDApPT0yNTMpe2NbZys0Pj4yXT0zMjtjW2c+PjJdPTMyO3Q9ZysxMnwwO2NbZis0Pj4yXT10O2NbZys4Pj4yXT0wO3Q9dCswfDA7Zz0zMjB8MDt3PXQrMzN8MDtkb3thW3Q+PjBdPWFbZz4+MF18MDt0PXQrMXwwO2c9ZysxfDB9d2hpbGUoKHR8MCk8KHd8MCkpO2NbZj4+Ml09MzY4O3diKGZ8MCwzMDQsMjIpfX19d2hpbGUoMCk7RD1YYSg0KXwwO2NbRD4+Ml09MjEzMDQ7d2IoRHwwLDIxMzc2LDE5Nil9fXdoaWxlKDApO2Rve2lmKCEoKGFbZj4+MF0mMSk9PTApKXtmPWNbZis4Pj4yXXwwO2lmKChmfDApPT0wKXticmVha312bihmKX19d2hpbGUoMCk7Y1tsPj4yXT1nO2Y9Y1tuPj4yXXwwO2Nbbj4+Ml09ajtkb3tpZigoZnwwKSE9MCl7Qz1mKzR8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXticmVha31sY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZik7Qz1mKzh8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXticmVha31sY1tjWyhjW2Y+PjJdfDApKzE2Pj4yXSYyNTVdKGYpfX13aGlsZSgwKTtBPWIrMzI4fDA7Qz1BO0M9SW4oY1tDPj4yXXwwLGNbQys0Pj4yXXwwLDEsMCl8MDtjW0E+PjJdPUM7Y1tBKzQ+PjJdPUk7QT1tO2NbQT4+Ml09MDtjW0ErND4+Ml09MDtBPWNbbD4+Ml18MDtDPWNbQT4+Ml18MDtDPWNbQz4+Ml18MDttY1tDJjEyN10oQSxlKTtBPW07Qz1BO0M9Y1tDPj4yXXwwO0E9QSs0fDA7QT1jW0E+PjJdfDA7QT1JbihDfDAsQXwwLDEsMCl8MDtDPUk7RD1tO0I9RDtjW0I+PjJdPUE7RD1EKzR8MDtjW0Q+PjJdPUM7aT1oO3JldHVybn1mdW5jdGlvbiBLYyhhKXthPWF8MDthPShjW2ErOD4+Ml18MCkrMTI3fDA7cmV0dXJuIGRbYT4+MF18ZFthKzE+PjBdPDw4fGRbYSsyPj4wXTw8MTZ8ZFthKzM+PjBdPDwyNHwwfWZ1bmN0aW9uIExjKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGU9MCxmPTA7ZT1pO2Y9ZFthPj4wXXxkW2ErMT4+MF08PDh8ZFthKzI+PjBdPDwxNnxkW2ErMz4+MF08PDI0O2E9YSs0fDA7YT1kW2E+PjBdfGRbYSsxPj4wXTw8OHxkW2ErMj4+MF08PDE2fGRbYSszPj4wXTw8MjQ7Yj1iKyhhPj4xKXwwO2lmKChhJjF8MCk9PTApe2E9ZjthPW9jW2EmMTI3XShiKXwwO2k9ZTtyZXR1cm4gYXwwfWVsc2V7YT1jWyhjW2I+PjJdfDApK2Y+PjJdfDA7YT1vY1thJjEyN10oYil8MDtpPWU7cmV0dXJuIGF8MH1yZXR1cm4gMH1mdW5jdGlvbiBNYyhhLGIsZSl7YT1hfDA7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTA7Zj1pO2c9ZFthPj4wXXxkW2ErMT4+MF08PDh8ZFthKzI+PjBdPDwxNnxkW2ErMz4+MF08PDI0O2E9YSs0fDA7YT1kW2E+PjBdfGRbYSsxPj4wXTw8OHxkW2ErMj4+MF08PDE2fGRbYSszPj4wXTw8MjQ7Yj1iKyhhPj4xKXwwO2lmKChhJjF8MCk9PTApe2E9ZzttY1thJjEyN10oYixlKTtpPWY7cmV0dXJufWVsc2V7YT1jWyhjW2I+PjJdfDApK2c+PjJdfDA7bWNbYSYxMjddKGIsZSk7aT1mO3JldHVybn19ZnVuY3Rpb24gTmMoYSxiLGUsZil7YT1hfDA7Yj1ifDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTA7Zz1pO2g9ZFthPj4wXXxkW2ErMT4+MF08PDh8ZFthKzI+PjBdPDwxNnxkW2ErMz4+MF08PDI0O2E9YSs0fDA7YT1kW2E+PjBdfGRbYSsxPj4wXTw8OHxkW2ErMj4+MF08PDE2fGRbYSszPj4wXTw8MjQ7Yj1iKyhhPj4xKXwwO2lmKChhJjF8MCk9PTApe2E9aDtxY1thJjMxXShiLGUsZik7aT1nO3JldHVybn1lbHNle2E9Y1soY1tiPj4yXXwwKStoPj4yXXwwO3FjW2EmMzFdKGIsZSxmKTtpPWc7cmV0dXJufX1mdW5jdGlvbiBPYygpe3ZhciBhPTAsYj0wLGQ9MDtiPWk7d2hpbGUoMSl7ZD11bigxNil8MDtpZigoZHwwKSE9MCl7YT03O2JyZWFrfWQ9Y1s1NjY2XXwwO2NbNTY2Nl09ZCswO2lmKChkfDApPT0wKXticmVha31zY1tkJjMxXSgpfWlmKChhfDApPT03KXtjW2QrMD4+Ml09MDtjW2QrND4+Ml09MDtjW2QrOD4+Ml09MDtjW2QrMTI+PjJdPTA7aT1iO3JldHVybiBkfDB9ZD1YYSg0KXwwO2NbZD4+Ml09MjI2ODA7d2IoZHwwLDIyNzI4LDIwNik7cmV0dXJuIDB9ZnVuY3Rpb24gUGMoYSl7YT1hfDA7dmFyIGI9MDtiPWk7YT1rY1thJjMxXSgpfDA7aT1iO3JldHVybiBhfDB9ZnVuY3Rpb24gUWMoYSl7YT1hfDA7cmV0dXJuIDcyfWZ1bmN0aW9uIFJjKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufWQ9Y1thKzEyPj4yXXwwO2lmKCgoZHwwKSE9MD8oZj1kKzR8MCxlPWNbZj4+Ml18MCxjW2Y+PjJdPWUrIC0xLChlfDApPT0wKTowKT8obGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpLGU9ZCs4fDAsZj1jW2U+PjJdfDAsY1tlPj4yXT1mKyAtMSwoZnwwKT09MCk6MCl7bGNbY1soY1tkPj4yXXwwKSsxNj4+Ml0mMjU1XShkKX1kPWNbYSs0Pj4yXXwwO2lmKCgoZHwwKSE9MD8oZT1kKzR8MCxmPWNbZT4+Ml18MCxjW2U+PjJdPWYrIC0xLChmfDApPT0wKTowKT8obGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpLGU9ZCs4fDAsZj1jW2U+PjJdfDAsY1tlPj4yXT1mKyAtMSwoZnwwKT09MCk6MCl7bGNbY1soY1tkPj4yXXwwKSsxNj4+Ml0mMjU1XShkKX12bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFNjKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtmPWk7aT1pKzMyfDA7bz1mO2U9ZisxNnwwO2c9ZisxMnwwO2FbZT4+MF09MDtjW2UrND4+Ml09YjtwPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtpZigoY1tiKyhwKzE2KT4+Ml18MCk9PTApe2g9Y1tiKyhwKzcyKT4+Ml18MDtpZigoaHwwKSE9MCl7WWcoaCk7cD1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDB9YVtlPj4wXT0xO2o9Sm4oZHwwKXwwO209Y1tiKyhwKzI0KT4+Ml18MDtpZigoY1tiKyhwKzQpPj4yXSYxNzZ8MCk9PTMyKXtoPWQranwwfWVsc2V7aD1kfWw9YitwfDA7bj1iKyhwKzc2KXwwO3E9Y1tuPj4yXXwwO2Rve2lmKChxfDApPT0tMSl7cD1jW2IrKHArMjgpPj4yXXwwO3E9cCs0fDA7Y1txPj4yXT0oY1txPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tvPj4yXT0xMzQ1NjtjW28rND4+Ml09MjA4O2Nbbys4Pj4yXT0wO2NnKDEzNDU2LG8pfXI9KGNbMTM0NjA+PjJdfDApKyAtMXwwO289Y1twKzg+PjJdfDA7aWYoKGNbcCsxMj4+Ml18MCktbz4+Mj4+PjA+cj4+PjA/KGs9Y1tvKyhyPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7az14Y1tjWyhjW2s+PjJdfDApKzI4Pj4yXSY2M10oaywzMil8MDtyPWNbcT4+Ml18MDtjW3E+PjJdPXIrIC0xO2lmKChyfDApPT0wKXtsY1tjWyhjW3A+PjJdfDApKzg+PjJdJjI1NV0ocCl9cT1rPDwyND4+MjQ7Y1tuPj4yXT1xO2JyZWFrfXI9WGEoNCl8MDtjW3I+PjJdPTIxMzA0O3diKHJ8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtXYyhnLG0sZCxoLGQranwwLGwscSYyNTUpO2lmKChjW2c+PjJdfDApPT0wKXtyPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK3J8MCxjW2IrKHIrMTYpPj4yXXw1KX19Z2goZSk7aT1mO3JldHVybiBifDB9ZnVuY3Rpb24gVGMoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFVjKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gVmMoYSl7YT1hfDA7bWIoYXwwKXwwO09hKCl9ZnVuY3Rpb24gV2MoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MDtrPWk7aT1pKzE2fDA7bD1rO2lmKChkfDApPT0wKXtjW2I+PjJdPTA7aT1rO3JldHVybn1wPWU7bj1nLXB8MDtoPWgrMTJ8MDttPWNbaD4+Ml18MDtuPShtfDApPihufDApP20tbnwwOjA7bT1mO3A9bS1wfDA7aWYoKHB8MCk+MD8oaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsZSxwKXwwKSE9KHB8MCk6MCl7Y1tiPj4yXT0wO2k9aztyZXR1cm59ZG97aWYoKG58MCk+MCl7ZG97aWYobj4+PjA8MTEpe3A9bjw8MSYyNTU7YVtsPj4wXT1wO289bDtlPWwrMXwwfWVsc2V7cT1uKzE2Ji0xNjtwPShxfDApPT0wPzE6cTt3aGlsZSgxKXtlPXVuKHApfDA7aWYoKGV8MCkhPTApe289MTU7YnJlYWt9ZT1jWzU2NjZdfDA7Y1s1NjY2XT1lKzA7aWYoKGV8MCk9PTApe2JyZWFrfXNjW2UmMzFdKCl9aWYoKG98MCk9PTE1KXtjW2wrOD4+Ml09ZTtwPXF8MTtjW2w+PjJdPXA7Y1tsKzQ+PjJdPW47bz1sO3A9cCYyNTU7YnJlYWt9cT1YYSg0KXwwO2NbcT4+Ml09MjI2ODA7d2IocXwwLDIyNzI4LDIwNil9fXdoaWxlKDApO05uKGV8MCxqfDAsbnwwKXwwO2FbZStuPj4wXT0wO2lmKChwJjEpPT0wKXtqPWwrMXwwfWVsc2V7aj1jW2wrOD4+Ml18MH1pZigoaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsaixuKXwwKT09KG58MCkpe2lmKChhW28+PjBdJjEpPT0wKXticmVha31sPWNbbCs4Pj4yXXwwO2lmKChsfDApPT0wKXticmVha312bihsKTticmVha31jW2I+PjJdPTA7aWYoKGFbbz4+MF0mMSk9PTApe2k9aztyZXR1cm59Yj1jW2wrOD4+Ml18MDtpZigoYnwwKT09MCl7aT1rO3JldHVybn12bihiKTtpPWs7cmV0dXJufX13aGlsZSgwKTtsPWctbXwwO2lmKChsfDApPjA/KGhjW2NbKGNbZD4+Ml18MCkrNDg+PjJdJjYzXShkLGYsbCl8MCkhPShsfDApOjApe2NbYj4+Ml09MDtpPWs7cmV0dXJufWNbaD4+Ml09MDtjW2I+PjJdPWQ7aT1rO3JldHVybn1mdW5jdGlvbiBYYyhhKXthPWF8MDt2YXIgYj0wO2I9aTtfYyhhKzQ3Njh8MCk7X2MoYSs0NzM2fDApO19jKGErNDY4OHwwKTtfYyhhKzQ2NTZ8MCk7X2MoYSs0NjA4fDApO19jKGErNDU3NnwwKTtfYyhhKzQ1Mjh8MCk7X2MoYSs0NDk2fDApO19jKGErNDQ0OHwwKTtfYyhhKzQ0MTZ8MCk7WmMoYSs0MzAwfDApO1pjKGErNDIyMHwwKTtaYyhhKzQxNDB8MCk7WmMoYSs0MDYwfDApO1pjKGErMzk4MHwwKTtZYyhhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFljKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2Q9Y1thKzg5Nj4+Ml18MDtpZigoZHwwKSE9MCl7ZT1jW2QrOD4+Ml18MDtpZigoZXwwKSE9MCl7dm4oY1tlKyAtND4+Ml18MCl9ZT1jW2QrMTI+PjJdfDA7aWYoKGV8MCkhPTApe3ZuKGNbZSsgLTQ+PjJdfDApfWU9Y1tkKzE2Pj4yXXwwO2lmKChlfDApIT0wKXt2bihjW2UrIC00Pj4yXXwwKX12bihkKX1kPWNbYSs5MDA+PjJdfDA7aWYoKGR8MCk9PTApe2Q9MH1lbHNle2U9Y1tkKzg+PjJdfDA7aWYoKGV8MCkhPTApe3ZuKGNbZSsgLTQ+PjJdfDApfWU9Y1tkKzEyPj4yXXwwO2lmKChlfDApIT0wKXt2bihjW2UrIC00Pj4yXXwwKX1lPWNbZCsxNj4+Ml18MDtpZigoZXwwKSE9MCl7dm4oY1tlKyAtND4+Ml18MCl9dm4oZCk7ZD0wfWRve2U9Y1thKyhkPDwyKSs5MDQ+PjJdfDA7aWYoKGV8MCkhPTApe2Y9Y1tlKzg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlKzEyPj4yXXwwO2lmKChmfDApIT0wKXt2bihjW2YrIC00Pj4yXXwwKX1mPWNbZSsxNj4+Ml18MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9dm4oZSl9ZT1jW2ErKGQ8PDIpKzE5Mjg+PjJdfDA7aWYoKGV8MCkhPTApe2Y9Y1tlKzg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlKzEyPj4yXXwwO2lmKChmfDApIT0wKXt2bihjW2YrIC00Pj4yXXwwKX1mPWNbZSsxNj4+Ml18MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9dm4oZSl9ZT1jW2ErKGQ8PDIpKzI5NTI+PjJdfDA7aWYoKGV8MCkhPTApe2Y9Y1tlKzg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlKzEyPj4yXXwwO2lmKChmfDApIT0wKXt2bihjW2YrIC00Pj4yXXwwKX1mPWNbZSsxNj4+Ml18MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9dm4oZSl9ZD1kKzF8MH13aGlsZSgoZHwwKSE9MjU2KTtkPWNbYSs4NjA+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzg2ND4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9YT1jW2ErODY4Pj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufXZuKGNbYSsgLTQ+PjJdfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gWmMoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTAsaD0wO2I9aTtkPWErMzZ8MDtlPWNbZD4+Ml18MDtmPWErNDB8MDtnPWNbZj4+Ml18MDtpZigoZ3wwKSE9KGV8MCkpe2Rve2NbZj4+Ml09ZysgLTQ0O2g9Y1tnKyAtMzY+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWg9Y1tnKyAtMzI+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWc9Y1tnKyAtMjg+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWc9Y1tmPj4yXXwwfXdoaWxlKChnfDApIT0oZXwwKSl9Zj1hKzY4fDA7ZT1jW2Y+PjJdfDA7YT1hKzcyfDA7Zz1jW2E+PjJdfDA7aWYoKGd8MCk9PShlfDApKXtfYyhmKTtfYyhkKTtpPWI7cmV0dXJufWRve2NbYT4+Ml09ZysgLTQ0O2g9Y1tnKyAtMzY+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWg9Y1tnKyAtMzI+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWc9Y1tnKyAtMjg+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWc9Y1thPj4yXXwwfXdoaWxlKChnfDApIT0oZXwwKSk7X2MoZik7X2MoZCk7aT1iO3JldHVybn1mdW5jdGlvbiBfYyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MDtiPWk7ZD1jW2E+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59ZT1hKzR8MDtmPWNbZT4+Ml18MDtpZigoZnwwKSE9KGR8MCkpe2Rve2NbZT4+Ml09ZisgLTQ0O2c9Y1tmKyAtMzY+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWc9Y1tmKyAtMzI+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWY9Y1tmKyAtMjg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlPj4yXXwwfXdoaWxlKChmfDApIT0oZHwwKSk7ZD1jW2E+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59fXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gJGMoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1pO2Q9Y1thKzU2Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSs2MD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErNjQ+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzEyPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxNj4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9YT1jW2ErMjA+PjJdfDA7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oY1thKyAtND4+Ml18MCk7aT1iO3JldHVybn1mdW5jdGlvbiBhZChhKXthPWF8MDt2YXIgYj0wLGQ9MDtiPWk7ZD1jW2ErMjgwPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsyODQ+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzI4OD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMjM2Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsyNDA+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzI0ND4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTkyPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxOTY+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzIwMD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTQ4Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxNTI+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzE1Nj4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTA0Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxMDg+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzExMj4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErNjA+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzY0Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSs2OD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTY+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzIwPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1hPWNbYSsyND4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn12bihjW2ErIC00Pj4yXXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGJkKGIpe2I9YnwwO3ZhciBjPTAsZD0wO2M9aTtkPWIrOHwwO2FbYiswPj4wXT0wO2FbYisxPj4wXT0wO2FbYisyPj4wXT0wO2FbYiszPj4wXT0wO2FbYis0Pj4wXT0wO2FbYis1Pj4wXT0wO2FbYis2Pj4wXT0wO2NkKGQsMTI4KTtjZChiKzUyfDAsMjU2KTtjZChiKzk2fDAsMjU2KTtjZChiKzE0MHwwLDI1Nik7Y2QoYisxODR8MCwyNTYpO2NkKGIrMjI4fDAsMjU2KTtjZChiKzI3MnwwLDI1Nik7aT1jO3JldHVybn1mdW5jdGlvbiBjZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MDtlPWk7Y1tiPj4yXT1kO2FbYis0Pj4wXT0wO2o9Yis4fDA7Y1tqPj4yXT0wO2c9YisxMnwwO2NbZz4+Ml09MDtoPWIrMTZ8MDtjW2g+PjJdPTA7aWYoKGQrIC0yfDApPj4+MD4yMDQ2KXtiPVhhKDgpfDA7Y1tiPj4yXT05OTI4O3doaWxlKDEpe2U9dW4oMzgpfDA7aWYoKGV8MCkhPTApe2Y9ODticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7YnJlYWt9c2NbZSYzMV0oKX1pZigoZnwwKT09OCl7Y1tlKzQ+PjJdPTI1O2NbZT4+Ml09MjU7ZD1lKzEyfDA7Y1tiKzQ+PjJdPWQ7Y1tlKzg+PjJdPTA7ZT1kKzB8MDtkPTM4NHwwO2Y9ZSsyNnwwO2Rve2FbZT4+MF09YVtkPj4wXXwwO2U9ZSsxfDA7ZD1kKzF8MH13aGlsZSgoZXwwKTwoZnwwKSk7d2IoYnwwLDEwMDY0LDEwNil9aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9Y1tiKzMyPj4yXT1kKyAtMTtpZihkPj4+MD4xNil7Zj0zO3doaWxlKDEpe2lmKDE8PGYrMj4+PjA8ZD4+PjApe2Y9ZisxfDB9ZWxzZXticmVha319az0xPDxmO2NbYiszNj4+Ml09aztjW2IrNDA+PjJdPTE1LWY7az11bigoazw8MikrNzZ8MCl8MDtmPWsrNjgmLTY0O2NbZisgLTQ+PjJdPWs7Y1toPj4yXT1mfWVsc2V7Y1toPj4yXT0wO2NbYis0MD4+Ml09MDtjW2IrMzY+PjJdPTB9az0oZDw8MikrNjh8MDtoPXVuKGspfDA7Zj1oKzY4Ji02NDtjW2YrIC00Pj4yXT1oO2Nbaj4+Ml09ZjtrPXVuKGspfDA7Zj1rKzY4Ji02NDtjW2YrIC00Pj4yXT1rO2NbZz4+Ml09ZjtjW2IrMjA+PjJdPTA7Zz1iKzI0fDA7Y1tnPj4yXT1kO2lmKChkfDApPT0wKXtkZChiKTtqPWNbYj4+Ml18MDtqPWorNnwwO2o9aj4+PjE7Y1tnPj4yXT1qO2s9YisyOHwwO2Nbaz4+Ml09ajtpPWU7cmV0dXJufWVsc2V7ZD0wfWRve2NbZisoZDw8Mik+PjJdPTE7ZD1kKzF8MH13aGlsZShkPj4+MDwoY1tiPj4yXXwwKT4+PjApO2RkKGIpO2o9Y1tiPj4yXXwwO2o9ais2fDA7aj1qPj4+MTtjW2c+PjJdPWo7az1iKzI4fDA7Y1trPj4yXT1qO2k9ZTtyZXR1cm59ZnVuY3Rpb24gZGQoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2Q9aTtlPWIrMjR8MDtoPWIrMjB8MDtrPShjW2g+PjJdfDApKyhjW2U+PjJdfDApfDA7Y1toPj4yXT1rO2lmKGs+Pj4wPjMyNzY4KXtjW2g+PjJdPTA7aWYoKGNbYj4+Ml18MCk9PTApe2s9MH1lbHNle2w9Y1tiKzEyPj4yXXwwO2o9MDtkb3tzPWwrKGo8PDIpfDA7az0oKGNbcz4+Ml18MCkrMXwwKT4+PjE7Y1tzPj4yXT1rO2s9aysoY1toPj4yXXwwKXwwO2NbaD4+Ml09aztqPWorMXwwfXdoaWxlKGo+Pj4wPChjW2I+PjJdfDApPj4+MCl9fWg9MjE0NzQ4MzY0OC8oaz4+PjApfDA7aWYoKGFbYis0Pj4wXXwwKT09MD8oZj1iKzM2fDAsKGNbZj4+Ml18MCkhPTApOjApe2lmKChjW2I+PjJdfDApIT0wKXtvPWNbYis4Pj4yXXwwO209Y1tiKzEyPj4yXXwwO2s9Yis0MHwwO249YisxNnwwO2o9MDtzPTA7bD0wO3doaWxlKDEpe3I9KGVhKGwsaCl8MCk+Pj4xNjtjW28rKGo8PDIpPj4yXT1yO2w9KGNbbSsoajw8Mik+PjJdfDApK2x8MDtyPXI+Pj4oY1trPj4yXXwwKTtpZihzPj4+MDxyPj4+MCl7cD1qKyAtMXwwO3E9Y1tuPj4yXXwwO2Rve3M9cysxfDA7Y1txKyhzPDwyKT4+Ml09cH13aGlsZSgoc3wwKSE9KHJ8MCkpfWVsc2V7cj1zfWo9aisxfDA7aWYoIShqPj4+MDwoY1tiPj4yXXwwKT4+PjApKXticmVha31lbHNle3M9cn19aD1jW24+PjJdfDA7Y1toPj4yXT0wO2lmKCEocj4+PjA+KGNbZj4+Ml18MCk+Pj4wKSl7Zz0xOH19ZWxzZXtoPWNbYisxNj4+Ml18MDtjW2g+PjJdPTA7cj0wO2c9MTh9aWYoKGd8MCk9PTE4KXtkb3tyPXIrMXwwO2NbaCsocjw8Mik+PjJdPShjW2I+PjJdfDApKyAtMX13aGlsZSghKHI+Pj4wPihjW2Y+PjJdfDApPj4+MCkpfXM9Y1tiPj4yXXwwO3I9Y1tlPj4yXXwwO3I9cio1fDA7cj1yPj4+MjtzPXM8PDM7cz1zKzQ4fDA7cT1yPj4+MD5zPj4+MDtyPXE/czpyO2NbZT4+Ml09cjtzPWIrMjh8MDtjW3M+PjJdPXI7aT1kO3JldHVybn1pZigoY1tiPj4yXXwwKT09MCl7cz0wO3I9Y1tlPj4yXXwwO3I9cio1fDA7cj1yPj4+MjtzPXM8PDM7cz1zKzQ4fDA7cT1yPj4+MD5zPj4+MDtyPXE/czpyO2NbZT4+Ml09cjtzPWIrMjh8MDtjW3M+PjJdPXI7aT1kO3JldHVybn1qPWNbYis4Pj4yXXwwO2s9Y1tiKzEyPj4yXXwwO2w9MDtnPTA7ZG97Y1tqKyhsPDwyKT4+Ml09KGVhKGcsaCl8MCk+Pj4xNjtnPShjW2srKGw8PDIpPj4yXXwwKStnfDA7bD1sKzF8MDtmPWNbYj4+Ml18MH13aGlsZShsPj4+MDxmPj4+MCk7cj1jW2U+PjJdfDA7cj1yKjV8MDtyPXI+Pj4yO3M9Zjw8MztzPXMrNDh8MDtxPXI+Pj4wPnM+Pj4wO3I9cT9zOnI7Y1tlPj4yXT1yO3M9YisyOHwwO2Nbcz4+Ml09cjtpPWQ7cmV0dXJufWZ1bmN0aW9uIGVkKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wO2Q9aTthW2I+PjBdPTA7Y2QoYis0fDAsNTE2KTtlPWIrNDh8MDtjW2U+PjJdPTY7YVtiKzUyPj4wXT0wO2NbYis4MD4+Ml09NTtjW2IrNjQ+PjJdPTA7Y1tiKzg4Pj4yXT0wO2NbYis4ND4+Ml09MDtnPXVuKDkyKXwwO2Y9Zys2OCYtNjQ7Y1tmKyAtND4+Ml09ZztjW2IrNTY+PjJdPWY7Zj11big5Mil8MDtnPWYrNjgmLTY0O2NbZysgLTQ+PjJdPWY7Y1tiKzYwPj4yXT1nO2NbYis2OD4+Ml09MDtmPWIrNzJ8MDtjW2Y+PjJdPTY7aD0wO2Rve2NbZysoaDw8Mik+PjJdPTE7aD1oKzF8MH13aGlsZShoPj4+MDwoY1tlPj4yXXwwKT4+PjApO2RkKGUpO2U9KChjW2U+PjJdfDApKzZ8MCk+Pj4xO2NbZj4+Ml09ZTtjW2IrNzY+PjJdPWU7ZT1iKzkyfDA7Yj1lKzcyfDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KGJ8MCkpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZmQoZCl7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtlPWk7Zz1kKzUyfDA7aD1kKzcyfDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzc2fDA7Zz1kKzk2fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzEwMHwwO2g9ZCsxMjB8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrMTI0fDA7Zz1kKzE0NHwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCsxNDh8MDtoPWQrMTY4fDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzE3MnwwO2c9ZCsxOTJ8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrMTk2fDA7aD1kKzIxNnwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCsyMjB8MDtnPWQrMjQwfDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzI0NHwwO2g9ZCsyNjR8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrMjY4fDA7Zz1kKzI4OHwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCsyOTJ8MDtoPWQrMzEyfDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzMxNnwwO2c9ZCszMzZ8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrMzQwfDA7aD1kKzM2MHwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCszNjR8MDtnPWQrMzg0fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzM4OHwwO2g9ZCs0MDh8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrNDEyfDA7Zz1kKzQzMnwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCs0MzZ8MDtoPWQrNDU2fDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzQ2MHwwO2c9ZCs0ODB8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrNDg0fDA7aD1kKzUwNHwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCs1MDh8MDtnPWQrNTI4fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzUzMnwwO2g9ZCs1NTJ8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrNTU2fDA7Zz1kKzU3NnwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCs1ODB8MDtoPWQrNjAwfDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzYwNHwwO2c9ZCs2MjR8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrNjI4fDA7aD1kKzY0OHwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCs2NTJ8MDtnPWQrNjcyfDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzY3NnwwO2g9ZCs2OTZ8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrNzAwfDA7Zz1kKzcyMHwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCs3MjR8MDtoPWQrNzQ0fDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzc0OHwwO2c9ZCs3Njh8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrNzcyfDA7aD1kKzc5MnwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCs3OTZ8MDtnPWQrODE2fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Y2QoZCs4NTJ8MCw2NCk7YVtkKzM5NzY+PjBdPTA7Zz1kKzIwfDA7aD1nKzMyfDA7ZG97YltnPj4xXT0wO2c9ZysyfDB9d2hpbGUoKGd8MCk8KGh8MCkpO3doaWxlKDEpe2c9dW4oNDQpfDA7aWYoKGd8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtmPTU7YnJlYWt9c2NbZyYzMV0oKX1pZigoZnwwKT09NSl7aD1YYSg0KXwwO2NbaD4+Ml09MjI2ODA7d2IoaHwwLDIyNzI4LDIwNil9Y2QoZywyNTYpO2NbZCs4OTY+PjJdPWc7d2hpbGUoMSl7Zz11big0NCl8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2Y9MTI7YnJlYWt9c2NbZyYzMV0oKX1pZigoZnwwKT09MTIpe2g9WGEoNCl8MDtjW2g+PjJdPTIyNjgwO3diKGh8MCwyMjcyOCwyMDYpfWNkKGcsMjU2KTtjW2QrOTAwPj4yXT1nO2Y9ZCs4MjB8MDtjW2YrMD4+Ml09MDtjW2YrND4+Ml09MDtjW2YrOD4+Ml09MDtjW2YrMTI+PjJdPTA7Y1tmKzE2Pj4yXT0wO2NbZisyMD4+Ml09MDtjW2YrMjQ+PjJdPTA7Y1tmKzI4Pj4yXT0wO2Y9MDthOndoaWxlKDEpe3doaWxlKDEpe2c9dW4oNDQpfDA7aWYoKGd8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtmPTIwO2JyZWFrIGF9c2NbZyYzMV0oKX1jZChnLDI1Nik7Y1tkKyhmPDwyKSs5MDQ+PjJdPWc7d2hpbGUoMSl7Zz11big0NCl8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2Y9Mjc7YnJlYWsgYX1zY1tnJjMxXSgpfWNkKGcsMjU2KTtjW2QrKGY8PDIpKzE5Mjg+PjJdPWc7d2hpbGUoMSl7Zz11big0NCl8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2Y9MzQ7YnJlYWsgYX1zY1tnJjMxXSgpfWNkKGcsMjU2KTtjW2QrKGY8PDIpKzI5NTI+PjJdPWc7Zj1mKzF8MDtpZigoZnwwKT49MjU2KXtmPTM4O2JyZWFrfX1pZigoZnwwKT09MjApe2g9WGEoNCl8MDtjW2g+PjJdPTIyNjgwO3diKGh8MCwyMjcyOCwyMDYpfWVsc2UgaWYoKGZ8MCk9PTI3KXtoPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX1lbHNlIGlmKChmfDApPT0zNCl7aD1YYSg0KXwwO2NbaD4+Ml09MjI2ODA7d2IoaHwwLDIyNzI4LDIwNil9ZWxzZSBpZigoZnwwKT09Mzgpe2NbZCszOTg0Pj4yXT0xNjtjW2QrMzk4OD4+Ml09NDtjW2QrMzk5Mj4+Ml09ODtjW2QrMzk5Nj4+Ml09MDtjW2QrNDAxNj4+Ml09MDtjW2QrNDAyMD4+Ml09MDtjW2QrNDAyND4+Ml09MDtjW2QrNDA0MD4+Ml09MTtjW2QrNDA0ND4+Ml09MjtjW2QrNDAzNj4+Ml09NDA5NjtjW2QrNDAzMj4+Ml09NDtjW2QrNDAyOD4+Ml09NDtjW2QrNDA0OD4+Ml09MDtjW2QrNDA1Mj4+Ml09MDtjW2QrNDA1Nj4+Ml09MDtjW2QrNGUzPj4yXT0xNjtjW2QrNDAwND4+Ml09NjU1MzY7Y1tkKzQwMDg+PjJdPS0zMjc2ODtjW2QrNDAxMj4+Ml09MzI3Njc7Y1tkKzM5ODA+PjJdPTA7Y1tkKzQwNjQ+PjJdPTE2O2NbZCs0MDY4Pj4yXT0xO2NbZCs0MDcyPj4yXT04O2NbZCs0MDc2Pj4yXT0wO2NbZCs0MDk2Pj4yXT0wO2NbZCs0MTAwPj4yXT0wO2NbZCs0MTA0Pj4yXT0wO2NbZCs0MTIwPj4yXT0xO2NbZCs0MTI0Pj4yXT0yO2NbZCs0MTE2Pj4yXT00MDk2O2NbZCs0MTEyPj4yXT00O2NbZCs0MTA4Pj4yXT00O2NbZCs0MTI4Pj4yXT0wO2NbZCs0MTMyPj4yXT0wO2NbZCs0MTM2Pj4yXT0wO2NbZCs0MDgwPj4yXT0xNjtjW2QrNDA4ND4+Ml09NjU1MzY7Y1tkKzQwODg+PjJdPS0zMjc2ODtjW2QrNDA5Mj4+Ml09MzI3Njc7Y1tkKzQwNjA+PjJdPTA7Y1tkKzQxNDQ+PjJdPTMyO2NbZCs0MTQ4Pj4yXT0yO2NbZCs0MTUyPj4yXT04O2NbZCs0MTU2Pj4yXT0wO2NbZCs0MTc2Pj4yXT0wO2NbZCs0MTgwPj4yXT0wO2NbZCs0MTg0Pj4yXT0wO2NbZCs0MjAwPj4yXT0xO2NbZCs0MjA0Pj4yXT0yO2NbZCs0MTk2Pj4yXT00MDk2O2NbZCs0MTkyPj4yXT00O2NbZCs0MTg4Pj4yXT00O2NbZCs0MjA4Pj4yXT0wO2NbZCs0MjEyPj4yXT0wO2NbZCs0MjE2Pj4yXT0wO2NbZCs0MTYwPj4yXT0zMjtjW2QrNDE2ND4+Ml09MDtjW2QrNDE2OD4+Ml09LTIxNDc0ODM2NDg7Y1tkKzQxNzI+PjJdPTIxNDc0ODM2NDc7Y1tkKzQxNDA+PjJdPTA7Y1tkKzQyMjQ+PjJdPTMyO2NbZCs0MjI4Pj4yXT0yMjtjW2QrNDIzMj4+Ml09ODtjW2QrNDIzNj4+Ml09MDtjW2QrNDI1Nj4+Ml09MDtjW2QrNDI2MD4+Ml09MDtjW2QrNDI2ND4+Ml09MDtjW2QrNDI4MD4+Ml09MTtjW2QrNDI4ND4+Ml09MjtjW2QrNDI3Nj4+Ml09NDA5NjtjW2QrNDI3Mj4+Ml09NDtjW2QrNDI2OD4+Ml09NDtjW2QrNDI4OD4+Ml09MDtjW2QrNDI5Mj4+Ml09MDtjW2QrNDI5Nj4+Ml09MDtjW2QrNDI0MD4+Ml09MzI7Y1tkKzQyNDQ+PjJdPTA7Y1tkKzQyNDg+PjJdPS0yMTQ3NDgzNjQ4O2NbZCs0MjUyPj4yXT0yMTQ3NDgzNjQ3O2NbZCs0MjIwPj4yXT0wO2NbZCs0MzA0Pj4yXT0zMjtjW2QrNDMwOD4+Ml09MjA7Y1tkKzQzMTI+PjJdPTg7Y1tkKzQzMTY+PjJdPTA7Y1tkKzQzMzY+PjJdPTA7Y1tkKzQzNDA+PjJdPTA7Y1tkKzQzNDQ+PjJdPTA7Y1tkKzQzNjA+PjJdPTE7Y1tkKzQzNjQ+PjJdPTI7Y1tkKzQzNTY+PjJdPTQwOTY7Y1tkKzQzNTI+PjJdPTQ7Y1tkKzQzNDg+PjJdPTQ7Y1tkKzQzNjg+PjJdPTA7Y1tkKzQzNzI+PjJdPTA7Y1tkKzQzNzY+PjJdPTA7Y1tkKzQzMjA+PjJdPTMyO2NbZCs0MzI0Pj4yXT0wO2NbZCs0MzI4Pj4yXT0tMjE0NzQ4MzY0ODtjW2QrNDMzMj4+Ml09MjE0NzQ4MzY0NztjW2QrNDMwMD4+Ml09MDtjW2QrNDM4ND4+Ml09MTY7Y1tkKzQzODg+PjJdPTQ7Y1tkKzQzOTI+PjJdPTg7Y1tkKzQzOTY+PjJdPTA7Y1tkKzQ0MTY+PjJdPTA7Y1tkKzQ0MjA+PjJdPTA7Y1tkKzQ0MjQ+PjJdPTA7Y1tkKzQ0NDA+PjJdPTE7Y1tkKzQ0NDQ+PjJdPTI7Y1tkKzQ0MzY+PjJdPTQwOTY7Y1tkKzQ0MzI+PjJdPTQ7Y1tkKzQ0Mjg+PjJdPTQ7Y1tkKzQ0NDg+PjJdPTA7Y1tkKzQ0NTI+PjJdPTA7Y1tkKzQ0NTY+PjJdPTA7Y1tkKzQ0MDA+PjJdPTE2O2NbZCs0NDA0Pj4yXT02NTUzNjtjW2QrNDQwOD4+Ml09LTMyNzY4O2NbZCs0NDEyPj4yXT0zMjc2NztjW2QrNDM4MD4+Ml09MDtjW2QrNDQ2ND4+Ml09MTY7Y1tkKzQ0Njg+PjJdPTE7Y1tkKzQ0NzI+PjJdPTg7Y1tkKzQ0NzY+PjJdPTA7Y1tkKzQ0OTY+PjJdPTA7Y1tkKzQ1MDA+PjJdPTA7Y1tkKzQ1MDQ+PjJdPTA7Y1tkKzQ1MjA+PjJdPTE7Y1tkKzQ1MjQ+PjJdPTI7Y1tkKzQ1MTY+PjJdPTQwOTY7Y1tkKzQ1MTI+PjJdPTQ7Y1tkKzQ1MDg+PjJdPTQ7Y1tkKzQ1Mjg+PjJdPTA7Y1tkKzQ1MzI+PjJdPTA7Y1tkKzQ1MzY+PjJdPTA7Y1tkKzQ0ODA+PjJdPTE2O2NbZCs0NDg0Pj4yXT02NTUzNjtjW2QrNDQ4OD4+Ml09LTMyNzY4O2NbZCs0NDkyPj4yXT0zMjc2NztjW2QrNDQ2MD4+Ml09MDtjW2QrNDU0ND4+Ml09MzI7Y1tkKzQ1NDg+PjJdPTI7Y1tkKzQ1NTI+PjJdPTg7Y1tkKzQ1NTY+PjJdPTA7Y1tkKzQ1NzY+PjJdPTA7Y1tkKzQ1ODA+PjJdPTA7Y1tkKzQ1ODQ+PjJdPTA7Y1tkKzQ2MDA+PjJdPTE7Y1tkKzQ2MDQ+PjJdPTI7Y1tkKzQ1OTY+PjJdPTQwOTY7Y1tkKzQ1OTI+PjJdPTQ7Y1tkKzQ1ODg+PjJdPTQ7Y1tkKzQ2MDg+PjJdPTA7Y1tkKzQ2MTI+PjJdPTA7Y1tkKzQ2MTY+PjJdPTA7Y1tkKzQ1NjA+PjJdPTMyO2NbZCs0NTY0Pj4yXT0wO2NbZCs0NTY4Pj4yXT0tMjE0NzQ4MzY0ODtjW2QrNDU3Mj4+Ml09MjE0NzQ4MzY0NztjW2QrNDU0MD4+Ml09MDtjW2QrNDYyND4+Ml09MzI7Y1tkKzQ2Mjg+PjJdPTIyO2NbZCs0NjMyPj4yXT04O2NbZCs0NjM2Pj4yXT0wO2NbZCs0NjU2Pj4yXT0wO2NbZCs0NjYwPj4yXT0wO2NbZCs0NjY0Pj4yXT0wO2NbZCs0NjgwPj4yXT0xO2NbZCs0Njg0Pj4yXT0yO2NbZCs0Njc2Pj4yXT00MDk2O2NbZCs0NjcyPj4yXT00O2NbZCs0NjY4Pj4yXT00O2NbZCs0Njg4Pj4yXT0wO2NbZCs0NjkyPj4yXT0wO2NbZCs0Njk2Pj4yXT0wO2NbZCs0NjQwPj4yXT0zMjtjW2QrNDY0ND4+Ml09MDtjW2QrNDY0OD4+Ml09LTIxNDc0ODM2NDg7Y1tkKzQ2NTI+PjJdPTIxNDc0ODM2NDc7Y1tkKzQ2MjA+PjJdPTA7Y1tkKzQ3MDQ+PjJdPTMyO2NbZCs0NzA4Pj4yXT0yMDtjW2QrNDcxMj4+Ml09ODtjW2QrNDcxNj4+Ml09MDtjW2QrNDczNj4+Ml09MDtjW2QrNDc0MD4+Ml09MDtjW2QrNDc0ND4+Ml09MDtjW2QrNDc2MD4+Ml09MTtjW2QrNDc2ND4+Ml09MjtjW2QrNDc1Nj4+Ml09NDA5NjtjW2QrNDc1Mj4+Ml09NDtjW2QrNDc0OD4+Ml09NDtjW2QrNDc2OD4+Ml09MDtjW2QrNDc3Mj4+Ml09MDtjW2QrNDc3Nj4+Ml09MDtjW2QrNDcyMD4+Ml09MzI7Y1tkKzQ3MjQ+PjJdPTA7Y1tkKzQ3Mjg+PjJdPS0yMTQ3NDgzNjQ4O2NbZCs0NzMyPj4yXT0yMTQ3NDgzNjQ3O2NbZCs0NzAwPj4yXT0wO2FbZCs0NzgwPj4wXT0wO2FbZCs0NzgxPj4wXT0wO2k9ZTtyZXR1cm59fWZ1bmN0aW9uIGdkKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTA7ZT1pO2k9aSszMnwwO2g9ZTtmPWNbYis4Pj4yXXwwO2I9Y1tiKzQ+PjJdfDA7amQoaCxmLGIpO2c9Y1toPj4yXXwwO2FbZCszPj4wXT1nPj4+MjQ7YVtkKzI+PjBdPWc+Pj4xNjthW2QrMT4+MF09Zz4+Pjg7YVtkPj4wXT1nO2c9Y1toKzQ+PjJdfDA7YVtkKzc+PjBdPWc+Pj4yNDthW2QrNj4+MF09Zz4+PjE2O2FbZCs1Pj4wXT1nPj4+ODthW2QrND4+MF09ZztnPWNbaCs4Pj4yXXwwO2FbZCsxMT4+MF09Zz4+PjI0O2FbZCsxMD4+MF09Zz4+PjE2O2FbZCs5Pj4wXT1nPj4+ODthW2QrOD4+MF09ZztnPWNbaCsxMj4+Ml18MDthW2QrMTM+PjBdPShnJjY1NTM1KT4+Pjg7YVtkKzEyPj4wXT1nO2FbZCsxND4+MF09Zz4+PjE2O2FbZCsxNT4+MF09Zz4+PjI0O2g9Y1toKzE2Pj4yXXwwO2FbZCsxNj4+MF09aDthW2QrMTc+PjBdPShoJjY1NTM1KT4+Pjg7YVtkKzE5Pj4wXT1oPj4+MjQ7YVtkKzE4Pj4wXT1oPj4+MTY7aD1rZChmKzQ3ODR8MCxiKXwwO2c9STthW2QrMjM+PjBdPWg+Pj4yNDthW2QrMjI+PjBdPWg+Pj4xNjthW2QrMjE+PjBdPWg+Pj44O2FbZCsyMD4+MF09aDtqPUtuKGh8MCxnfDAsNTYpfDA7YVtkKzI3Pj4wXT1qO2o9S24oaHwwLGd8MCw0OCl8MDthW2QrMjY+PjBdPWo7aD1LbihofDAsZ3wwLDQwKXwwO2FbZCsyNT4+MF09aDthW2QrMjQ+PjBdPWc7bGQoZis1MTEyfDAsYixkKzI4fDApO2k9ZTtyZXR1cm59ZnVuY3Rpb24gaGQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7Y1thPj4yXT00MjQ7YT1jW2ErOD4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1hZChhKzUxMTJ8MCk7X2MoYSs1MDk2fDApO19jKGErNTA2NHwwKTtaYyhhKzQ5NDh8MCk7JGMoYSs0Nzg0fDApO1hjKGEpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gaWQoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1pO2NbYT4+Ml09NDI0O2Q9Y1thKzg+PjJdfDA7aWYoKGR8MCk9PTApe3ZuKGEpO2k9YjtyZXR1cm59YWQoZCs1MTEyfDApO19jKGQrNTA5NnwwKTtfYyhkKzUwNjR8MCk7WmMoZCs0OTQ4fDApOyRjKGQrNDc4NHwwKTtYYyhkKTt2bihkKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGpkKGYsZyxoKXtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wO2o9aTtpPWkrMzJ8MDtrPWo7bD1nKzQ3ODF8MDtpZigoYVtsPj4wXXwwKT09MCl7dGQoZys0MzgwfDApO3RkKGcrNDQ2MHwwKTt0ZChnKzQ1NDB8MCk7dGQoZys0NjIwfDApO3RkKGcrNDcwMHwwKTthW2w+PjBdPTF9bD1nKzM5NzZ8MDtpZigoYVtsPj4wXXwwKT09MCl7YVtsPj4wXT0xO3BkKGNbaD4+Ml18MCxrLDIwKTtyPWRbaysxPj4wXTw8OHxkW2s+PjBdfGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNDtvPWRbays1Pj4wXTw8OHxkW2srND4+MF18ZFtrKzY+PjBdPDwxNnxkW2srNz4+MF08PDI0O3A9ZFtrKzk+PjBdPDw4fGRbays4Pj4wXXxkW2srMTA+PjBdPDwxNnxkW2srMTE+PjBdPDwyNDtxPShhW2srMTM+PjBdPDw4fGRbaysxMj4+MF0pJjY1NTM1O3M9YVtrKzE0Pj4wXXwwO3Q9YVtrKzE1Pj4wXXwwO3U9YVtrKzE2Pj4wXXwwO2g9YVtrKzE3Pj4wXXwwO3Y9KGFbaysxOT4+MF08PDh8ZFtrKzE4Pj4wXSkmNjU1MzU7YVtnPj4wXT1yO2FbZysxPj4wXT1yPj44O2FbZysyPj4wXT1yPj4xNjthW2crMz4+MF09cj4+MjQ7cj1nKzR8MDthW3I+PjBdPW87YVtyKzE+PjBdPW8+Pjg7YVtyKzI+PjBdPW8+PjE2O2FbciszPj4wXT1vPj4yNDtyPWcrOHwwO2Fbcj4+MF09cDthW3IrMT4+MF09cD4+ODthW3IrMj4+MF09cD4+MTY7YVtyKzM+PjBdPXA+PjI0O3I9ZysxMnwwO2Fbcj4+MF09cTthW3IrMT4+MF09cT4+ODthW2crMTQ+PjBdPXM7YVtnKzE1Pj4wXT10O2FbZysxNj4+MF09dTthW2crMTc+PjBdPWg7aD1nKzE4fDA7YVtoPj4wXT12O2FbaCsxPj4wXT12Pj44O2Y9ZiswfDA7aD1nKzB8MDtnPWYrMjB8MDtkb3thW2Y+PjBdPWFbaD4+MF18MDtmPWYrMXwwO2g9aCsxfDB9d2hpbGUoKGZ8MCk8KGd8MCkpO2k9ajtyZXR1cm59bT1xZChoLGcrODUyfDApfDA7aWYoKG18MCkhPTApe289ZysxNHwwO2s9YVtvPj4wXXwwO2lmKChtJjMyfDApIT0wKXtrPShxZChoLGNbZysoKCgoayYyNTUpPj4+NyYyNTUpPDw3fGsmN3woKGsmMjU1KT4+PjYmMjU1KTw8NiY2NHwoKGsmMjU1KT4+PjMmMjU1KTw8MyY1Nik8PDIpKzkwND4+Ml18MCl8MCkmMjU1O2Fbbz4+MF09a31sPWsmNztrPShrJjI1NSk+Pj4zJjc7bj1kWzg3Misoazw8MykrbD4+MF18MDtsPWRbOTM2KyhrPDwzKStsPj4wXXwwO2lmKChtJjE2fDApPT0wKXt1PWJbZysobjw8MSkrMjA+PjFdfDA7dj1nKzEyfDA7YVt2Pj4wXT11O2FbdisxPj4wXT11Pj44fWVsc2V7cD1nKyhuPDwxKSsyMHwwO3E9ZVtwPj4xXXwwO3E9KHJkKGcrNDM4MHwwLGgsKGNbZys0NDE2Pj4yXXwwKSsoKG4+Pj4wPDM/bjozKSo0NHwwKXwwKXwwKStxfDA7cj1jW2crNDQwND4+Ml18MDtpZigocXwwKTwwKXtxPXErcnwwfWVsc2V7cT1xLShxPj4+MDxyPj4+MD8wOnIpfDB9dj1xJjY1NTM1O3U9ZysxMnwwO2FbdT4+MF09djthW3UrMT4+MF09dj4+ODtiW3A+PjFdPXZ9aWYoKG0mOHwwKSE9MCl7dj1nKzE1fDA7YVt2Pj4wXT1xZChoLGNbZysoZFt2Pj4wXTw8MikrMTkyOD4+Ml18MCl8MH1pZigobSY0fDApIT0wKXtwPXFkKGgsY1tnKygoKGRbbz4+MF18MCk+Pj42JjEpPDwyKSs4OTY+PjJdfDApfDA7bz1nKzE2fDA7cD0oYVtvPj4wXXwwKStwfDA7aWYoKHB8MCk8MCl7cD1wKzI1NnwwfWVsc2V7cD0ocHwwKT4yNTU/cCsgLTI1NnwwOnB9YVtvPj4wXT1wfWlmKChtJjJ8MCkhPTApe3Y9ZysxN3wwO2Fbdj4+MF09cWQoaCxjW2crKGRbdj4+MF08PDIpKzI5NTI+PjJdfDApfDB9aWYoKG0mMXwwKSE9MCl7bT1nKzE4fDA7cD0oZFttPj4wXXxkW20rMT4+MF08PDgpJjY1NTM1O3A9KHJkKGcrNDQ2MHwwLGgsY1tnKzQ0OTY+PjJdfDApfDApK3B8MDtvPWNbZys0NDg0Pj4yXXwwO2lmKChwfDApPDApe289cCtvfDB9ZWxzZXtvPXAtKHA+Pj4wPG8+Pj4wPzA6byl8MH12PW8mNjU1MzU7YVttPj4wXT12O2FbbSsxPj4wXT12Pj44fX1lbHNle2s9YVtnKzE0Pj4wXXwwO249ayY3O2s9KGsmMjU1KT4+PjMmNztsPWRbOTM2KyhrPDwzKStuPj4wXXwwO249ZFs4NzIrKGs8PDMpK24+PjBdfDB9cT1nKyhuKjI0fDApKzUyfDA7bz1nKyhuKjI0fDApKzYwfDA7cD1jW28+PjJdfDA7bT1nKzQ1NDB8MDtrPShrfDApPT0xJjE7cD0ocmQobSxoLChjW2crNDU3Nj4+Ml18MCkrKGsqNDR8MCl8MCl8MCkrcHwwO3I9Y1tnKzQ1NjQ+PjJdfDA7aWYoKHB8MCk8MCl7cD1wK3J8MH1lbHNle3A9cC0ocD4+PjA8cj4+PjA/MDpyKXwwfXI9KGRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNCkrcHwwO2FbZz4+MF09cjthW2crMT4+MF09cj4+ODthW2crMj4+MF09cj4+MTY7YVtnKzM+PjBdPXI+PjI0O3I9ZysobioyNHwwKSs3MnwwO3M9Y1tvPj4yXXwwO2Rve2lmKChhW3I+PjBdfDApPT0wKXt1PWcrKG4qMjR8MCkrNTZ8MDt0PWNbdT4+Ml18MDtpZigoc3wwKT49KHB8MCkpe2lmKCh0fDApPChwfDApKXtjW3E+PjJdPXQ7Y1t1Pj4yXT1wfWVsc2V7Y1txPj4yXT1wfWFbcj4+MF09MTticmVha31jW3E+PjJdPXQ7Y1t1Pj4yXT1zO3Q9ZysobioyNHwwKSs2OHwwO3E9Y1t0Pj4yXXwwO3M9ZysobioyNHwwKSs2NHwwO3I9Y1tzPj4yXXwwO2lmKChxfDApPChwfDApKXtjW28+PjJdPXI7Y1tzPj4yXT1xO2NbdD4+Ml09cDticmVha31pZigocnwwKTwocHwwKSl7Y1tvPj4yXT1yO2Nbcz4+Ml09cDticmVha31lbHNle2Nbbz4+Ml09cDticmVha319ZWxzZXt0PWcrKG4qMjR8MCkrNjR8MDt1PWNbdD4+Ml18MDtpZigocHwwKT49KHN8MCkpe289ZysobioyNHwwKSs2OHwwO2lmKChwfDApPCh1fDApKXtjW28+PjJdPXU7Y1t0Pj4yXT1wfWVsc2V7Y1tvPj4yXT1wfWFbcj4+MF09MDticmVha31jW2crKG4qMjR8MCkrNjg+PjJdPXU7Y1t0Pj4yXT1zO3M9Y1txPj4yXXwwO3Q9ZysobioyNHwwKSs1NnwwO3I9Y1t0Pj4yXXwwO2lmKChwfDApPChzfDApKXtjW28+PjJdPXI7Y1t0Pj4yXT1zO2NbcT4+Ml09cDticmVha31pZigocHwwKTwocnwwKSl7Y1tvPj4yXT1yO2NbdD4+Ml09cDticmVha31lbHNle2Nbbz4+Ml09cDticmVha319fXdoaWxlKDApO3I9ZysobioyNHwwKSs0MzZ8MDtwPWcrKG4qMjR8MCkrNDQ0fDA7cT1jW3A+PjJdfDA7cz1jW20+PjJdfDA7bz1nKzQ2MjB8MDtxPShyZChvLGgsKGNbZys0NjU2Pj4yXXwwKSsoKChzPj4+MDwyMD9zJi0yOjIwKXxrKSo0NHwwKXwwKXwwKStxfDA7cz1jW2crNDY0ND4+Ml18MDtpZigocXwwKTwwKXtxPXErc3wwfWVsc2V7cT1xLShxPj4+MDxzPj4+MD8wOnMpfDB9cz1nKzR8MDt0PShkW3M+PjBdfGRbcysxPj4wXTw8OHxkW3MrMj4+MF08PDE2fGRbcyszPj4wXTw8MjQpK3F8MDthW3M+PjBdPXQ7YVtzKzE+PjBdPXQ+Pjg7YVtzKzI+PjBdPXQ+PjE2O2FbcyszPj4wXT10Pj4yNDtzPWcrKG4qMjR8MCkrNDU2fDA7dD1jW3A+PjJdfDA7ZG97aWYoKGFbcz4+MF18MCk9PTApe3U9ZysobioyNHwwKSs0NDB8MDt2PWNbdT4+Ml18MDtpZigodHwwKT49KHF8MCkpe2lmKCh2fDApPChxfDApKXtjW3I+PjJdPXY7Y1t1Pj4yXT1xfWVsc2V7Y1tyPj4yXT1xfWFbcz4+MF09MTticmVha31jW3I+PjJdPXY7Y1t1Pj4yXT10O3M9ZysobioyNHwwKSs0NTJ8MDtyPWNbcz4+Ml18MDtuPWcrKG4qMjR8MCkrNDQ4fDA7dD1jW24+PjJdfDA7aWYoKHJ8MCk8KHF8MCkpe2NbcD4+Ml09dDtjW24+PjJdPXI7Y1tzPj4yXT1xO2JyZWFrfWlmKCh0fDApPChxfDApKXtjW3A+PjJdPXQ7Y1tuPj4yXT1xO2JyZWFrfWVsc2V7Y1twPj4yXT1xO2JyZWFrfX1lbHNle3U9ZysobioyNHwwKSs0NDh8MDt2PWNbdT4+Ml18MDtpZigocXwwKT49KHR8MCkpe249ZysobioyNHwwKSs0NTJ8MDtpZigocXwwKTwodnwwKSl7Y1tuPj4yXT12O2NbdT4+Ml09cX1lbHNle2Nbbj4+Ml09cX1hW3M+PjBdPTA7YnJlYWt9Y1tnKyhuKjI0fDApKzQ1Mj4+Ml09djtjW3U+PjJdPXQ7cz1jW3I+PjJdfDA7bj1nKyhuKjI0fDApKzQ0MHwwO3Q9Y1tuPj4yXXwwO2lmKChxfDApPChzfDApKXtjW3A+PjJdPXQ7Y1tuPj4yXT1zO2Nbcj4+Ml09cTticmVha31pZigocXwwKTwodHwwKSl7Y1twPj4yXT10O2Nbbj4+Ml09cTticmVha31lbHNle2NbcD4+Ml09cTticmVha319fXdoaWxlKDApO209KGNbbz4+Ml18MCkrKGNbbT4+Ml18MCl8MDtsPWcrKGw8PDIpKzgyMHwwO249Y1tsPj4yXXwwO2lmKG0+Pj4wPDM2KXttPW0+Pj4xJjIxNDc0ODM2NDZ9ZWxzZXttPTE4fWs9KHJkKGcrNDcwMHwwLGgsKGNbZys0NzM2Pj4yXXwwKSsoKG18aykqNDR8MCl8MCl8MCkrbnwwO2g9Y1tnKzQ3MjQ+PjJdfDA7aWYoKGt8MCk8MCl7aD1rK2h8MH1lbHNle2g9ay0oaz4+PjA8aD4+PjA/MDpoKXwwfXY9Zys4fDA7YVt2Pj4wXT1oO2FbdisxPj4wXT1oPj44O2FbdisyPj4wXT1oPj4xNjthW3YrMz4+MF09aD4+MjQ7Y1tsPj4yXT1oO2Y9ZiswfDA7aD1nKzB8MDtnPWYrMjB8MDtkb3thW2Y+PjBdPWFbaD4+MF18MDtmPWYrMXwwO2g9aCsxfDB9d2hpbGUoKGZ8MCk8KGd8MCkpO2k9ajtyZXR1cm59ZnVuY3Rpb24ga2QoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7Zj1pO2k9aSsxNnwwO2c9ZjtoPWIrMzI1fDA7aWYoKGFbaD4+MF18MCk9PTApe3RkKGIrMjQ0fDApO2FbaD4+MF09MX1pZigoYVtiPj4wXXwwKT09MCl7YVtiPj4wXT0xO3BkKGNbZT4+Ml18MCxnLDgpO249ZFtnKzE+PjBdPDw4fGRbZz4+MF18ZFtnKzI+PjBdPDwxNnxkW2crMz4+MF08PDI0O209ZFtnKzU+PjBdPDw4fGRbZys0Pj4wXXxkW2crNj4+MF08PDE2fGRbZys3Pj4wXTw8MjQ7bD1iKzEwMHwwO2s9bDthW2s+PjBdPW47YVtrKzE+PjBdPW4+Pjg7YVtrKzI+PjBdPW4+PjE2O2FbayszPj4wXT1uPj4yNDtsPWwrNHwwO2FbbD4+MF09bTthW2wrMT4+MF09bT4+ODthW2wrMj4+MF09bT4+MTY7YVtsKzM+PjBdPW0+PjI0O0k9bTtpPWY7cmV0dXJuIG58MH1nPWIrOTJ8MDtkb3tpZigoY1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdfDApPT0wKXtoPXFkKGUsYis0OHwwKXwwO2lmKChofDApPT0yKXtoPWIrOTZ8MDtjW2g+PjJdPShjW2g+PjJdfDApKzEmMztqPWIrKGNbZz4+Ml08PDMpKzEwNHwwO2o9ZFtqPj4wXXxkW2orMT4+MF08PDh8ZFtqKzI+PjBdPDwxNnxkW2orMz4+MF08PDI0O2o9KHJkKGIrMjQ0fDAsZSwoY1tiKzI4MD4+Ml18MCkrMzUyfDApfDApK2p8MDtrPWNbYisyNjg+PjJdfDA7aWYoKGp8MCk8MCl7aj1qK2t8MH1lbHNle2o9ai0oaj4+PjA8az4+PjA/MDprKXwwfW09KChqfDApPDApPDwzMT4+MzE7az1iKyhjW2g+PjJdPDwzKSsxMDB8MDtuPWs7YVtuPj4wXT1qO2FbbisxPj4wXT1qPj44O2FbbisyPj4wXT1qPj4xNjthW24rMz4+MF09aj4+MjQ7az1rKzR8MDthW2s+PjBdPW07YVtrKzE+PjBdPW0+Pjg7YVtrKzI+PjBdPW0+PjE2O2FbayszPj4wXT1tPj4yNDtrPWIrKGNbaD4+Ml08PDMpKzEwMHwwO209azttPWRbbT4+MF18ZFttKzE+PjBdPDw4fGRbbSsyPj4wXTw8MTZ8ZFttKzM+PjBdPDwyNDtqPWs7YVtqPj4wXT0wO2FbaisxPj4wXT0wO2FbaisyPj4wXT0wO2FbaiszPj4wXT0wO2s9ays0fDA7YVtrPj4wXT1tO2FbaysxPj4wXT1tPj44O2FbaysyPj4wXT1tPj4xNjthW2srMz4+MF09bT4+MjQ7az1lKzR8MDttPWNbaz4+Ml18MDtqPWUrOHwwO249KGNbaj4+Ml18MCk+Pj4xNjtjW2o+PjJdPW47bD0obT4+PjApLyhuPj4+MCl8MDtuPW0tKGVhKG4sbCl8MCl8MDtjW2s+PjJdPW47ZG97bj0obWQoY1tlPj4yXXwwKXwwKSYyNTV8bjw8ODtjW2s+PjJdPW47bT1jW2o+PjJdfDA7bz1tPDw4O2Nbaj4+Ml09b313aGlsZShvPj4+MDwxNjc3NzIxNik7bz1tPj4+OCY2NTUzNTtjW2o+PjJdPW87bT0obj4+PjApLyhvPj4+MCl8MDtuPW4tKGVhKG0sbyl8MCl8MDtjW2s+PjJdPW47ZG97bj0obWQoY1tlPj4yXXwwKXwwKSYyNTV8bjw8ODtjW2s+PjJdPW47bz1jW2o+PjJdPDw4O2Nbaj4+Ml09b313aGlsZShvPj4+MDwxNjc3NzIxNik7bz1iKyhjW2g+PjJdPDwzKSsxMDB8MDtuPW87az1uO249bis0fDA7bj1kW24+PjBdfGRbbisxPj4wXTw8OHxkW24rMj4+MF08PDE2fGRbbiszPj4wXTw8MjQ7bD1kW2s+PjBdfGRbaysxPj4wXTw8OHxkW2srMj4+MF08PDE2fGRbayszPj4wXTw8MjR8KG08PDE2fGwmNjU1MzUpO209bzthW20+PjBdPWw7YVttKzE+PjBdPWw+Pjg7YVttKzI+PjBdPWw+PjE2O2FbbSszPj4wXT1sPj4yNDtvPW8rNHwwO2Fbbz4+MF09bjthW28rMT4+MF09bj4+ODthW28rMj4+MF09bj4+MTY7YVtvKzM+PjBdPW4+PjI0O289Y1toPj4yXXwwO2NbZz4+Ml09bztjW2IrKG88PDIpKzEzMj4+Ml09MDtjW2IrKGNbZz4+Ml08PDIpKzE0OD4+Ml09MDticmVha31lbHNlIGlmKChofDApPT0xKXtlPXJkKGIrMjQ0fDAsZSxjW2IrMjgwPj4yXXwwKXwwO2g9Y1tiKzI2OD4+Ml18MDtpZigoZXwwKTwwKXtlPWgrZXwwfWVsc2V7ZT1lLShlPj4+MDxoPj4+MD8wOmgpfDB9Y1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdPWU7bz1jW2c+PjJdfDA7bD1jW2IrKG88PDIpKzEzMj4+Ml18MDtvPWIrKG88PDMpKzEwMHwwO249bzttPW47bj1uKzR8MDtsPUluKGRbbT4+MF18ZFttKzE+PjBdPDw4fGRbbSsyPj4wXTw8MTZ8ZFttKzM+PjBdPDwyNHwwLGRbbj4+MF18ZFtuKzE+PjBdPDw4fGRbbisyPj4wXTw8MTZ8ZFtuKzM+PjBdPDwyNHwwLGx8MCwoKGx8MCk8MCk8PDMxPj4zMXwwKXwwO249STttPW87YVttPj4wXT1sO2FbbSsxPj4wXT1sPj44O2FbbSsyPj4wXT1sPj4xNjthW20rMz4+MF09bD4+MjQ7bz1vKzR8MDthW28+PjBdPW47YVtvKzE+PjBdPW4+Pjg7YVtvKzI+PjBdPW4+PjE2O2FbbyszPj4wXT1uPj4yNDtjW2IrKGNbZz4+Ml08PDIpKzE0OD4+Ml09MDticmVha31lbHNle2lmKChofDApPD0yKXticmVha31jW2c+PjJdPWgrMisoY1tnPj4yXXwwKSYzO2tkKGIsZSl8MDticmVha319ZWxzZXtoPXFkKGUsYis0fDApfDA7aWYoKGh8MCk9PTEpe2g9Y1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdfDA7ZT0ocmQoYisyNDR8MCxlLChjW2IrMjgwPj4yXXwwKSs0NHwwKXwwKStofDA7aD1jW2IrMjY4Pj4yXXwwO2lmKChlfDApPDApe2U9ZStofDB9ZWxzZXtlPWUtKGU+Pj4wPGg+Pj4wPzA6aCl8MH1vPWIrKGNbZz4+Ml08PDMpKzEwMHwwO2w9bztuPWw7bD1sKzR8MDtsPUluKGRbbj4+MF18ZFtuKzE+PjBdPDw4fGRbbisyPj4wXTw8MTZ8ZFtuKzM+PjBdPDwyNHwwLGRbbD4+MF18ZFtsKzE+PjBdPDw4fGRbbCsyPj4wXTw8MTZ8ZFtsKzM+PjBdPDwyNHwwLGV8MCwoKGV8MCk8MCk8PDMxPj4zMXwwKXwwO249STttPW87YVttPj4wXT1sO2FbbSsxPj4wXT1sPj44O2FbbSsyPj4wXT1sPj4xNjthW20rMz4+MF09bD4+MjQ7bz1vKzR8MDthW28+PjBdPW47YVtvKzE+PjBdPW4+Pjg7YVtvKzI+PjBdPW4+PjE2O2FbbyszPj4wXT1uPj4yNDtjW2IrKGNbZz4+Ml08PDIpKzE0OD4+Ml09MDticmVha31pZigoaHwwKT49NTExKXtpZigoaHwwKSE9NTEyKXtpZigoaHwwKTw9NTExKXticmVha31jW2c+PjJdPShjW2c+PjJdfDApK2gmMztrZChiLGUpfDA7YnJlYWt9aD1iKzk2fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxJjM7az1iKyhjW2c+PjJdPDwzKSsxMDR8MDtrPWRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNDtrPShyZChiKzI0NHwwLGUsKGNbYisyODA+PjJdfDApKzM1MnwwKXwwKStrfDA7aj1jW2IrMjY4Pj4yXXwwO2lmKChrfDApPDApe2o9aytqfDB9ZWxzZXtqPWstKGs+Pj4wPGo+Pj4wPzA6ail8MH1vPSgoanwwKTwwKTw8MzE+PjMxO2s9YisoY1toPj4yXTw8MykrMTAwfDA7bD1rO2FbbD4+MF09ajthW2wrMT4+MF09aj4+ODthW2wrMj4+MF09aj4+MTY7YVtsKzM+PjBdPWo+PjI0O2s9ays0fDA7YVtrPj4wXT1vO2FbaysxPj4wXT1vPj44O2FbaysyPj4wXT1vPj4xNjthW2srMz4+MF09bz4+MjQ7az1iKyhjW2g+PjJdPDwzKSsxMDB8MDtvPWs7bz1kW28+PjBdfGRbbysxPj4wXTw8OHxkW28rMj4+MF08PDE2fGRbbyszPj4wXTw8MjQ7bD1rO2FbbD4+MF09MDthW2wrMT4+MF09MDthW2wrMj4+MF09MDthW2wrMz4+MF09MDtrPWsrNHwwO2Fbaz4+MF09bzthW2srMT4+MF09bz4+ODthW2srMj4+MF09bz4+MTY7YVtrKzM+PjBdPW8+PjI0O2s9ZSs0fDA7bz1jW2s+PjJdfDA7bD1lKzh8MDttPShjW2w+PjJdfDApPj4+MTY7Y1tsPj4yXT1tO2o9KG8+Pj4wKS8obT4+PjApfDA7bT1vLShlYShtLGopfDApfDA7Y1trPj4yXT1tO2Rve209KG1kKGNbZT4+Ml18MCl8MCkmMjU1fG08PDg7Y1trPj4yXT1tO249Y1tsPj4yXXwwO289bjw8ODtjW2w+PjJdPW99d2hpbGUobz4+PjA8MTY3NzcyMTYpO289bj4+PjgmNjU1MzU7Y1tsPj4yXT1vO249KG0+Pj4wKS8obz4+PjApfDA7bT1tLShlYShuLG8pfDApfDA7Y1trPj4yXT1tO2Rve209KG1kKGNbZT4+Ml18MCl8MCkmMjU1fG08PDg7Y1trPj4yXT1tO289Y1tsPj4yXTw8ODtjW2w+PjJdPW99d2hpbGUobz4+PjA8MTY3NzcyMTYpO289YisoY1toPj4yXTw8MykrMTAwfDA7bT1vO2w9bTttPW0rNHwwO209ZFttPj4wXXxkW20rMT4+MF08PDh8ZFttKzI+PjBdPDwxNnxkW20rMz4+MF08PDI0O2w9ZFtsPj4wXXxkW2wrMT4+MF08PDh8ZFtsKzI+PjBdPDwxNnxkW2wrMz4+MF08PDI0fChuPDwxNnxqJjY1NTM1KTtuPW87YVtuPj4wXT1sO2FbbisxPj4wXT1sPj44O2FbbisyPj4wXT1sPj4xNjthW24rMz4+MF09bD4+MjQ7bz1vKzR8MDthW28+PjBdPW07YVtvKzE+PjBdPW0+Pjg7YVtvKzI+PjBdPW0+PjE2O2FbbyszPj4wXT1tPj4yNDtvPWNbaD4+Ml18MDtjW2c+PjJdPW87Y1tiKyhvPDwyKSsxMzI+PjJdPTA7Y1tiKyhjW2c+PjJdPDwyKSsxNDg+PjJdPTA7YnJlYWt9ZG97aWYoKGh8MCk9PTApe2U9cmQoYisyNDR8MCxlLChjW2IrMjgwPj4yXXwwKSszMDh8MCl8MDtoPWNbYisyNjg+PjJdfDA7aWYoKGV8MCk8MCl7ZT1oK2V8MH1lbHNle2U9ZS0oZT4+PjA8aD4+PjA/MDpoKXwwfWg9YisoY1tnPj4yXTw8MikrMTQ4fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2g9Y1tnPj4yXXwwO2lmKChjW2IrKGg8PDIpKzE0OD4+Ml18MCk+Myl7Y1tiKyhoPDwyKSsxMzI+PjJdPWU7Y1tiKyhjW2c+PjJdPDwyKSsxNDg+PjJdPTB9fWVsc2V7aWYoKGh8MCk8NTAwKXtsPWIrMjQ0fDA7aj1lYShjW2IrKGNbZz4+Ml08PDIpKzEzMj4+Ml18MCxoKXwwO2s9Y1tiKzI4MD4+Ml18MDtpZigoaHwwKTwxMCl7aD0ocmQobCxlLGsrODh8MCl8MCkranwwO2U9Y1tiKzI2OD4+Ml18MDtpZigoaHwwKTwwKXtlPWgrZXwwO2JyZWFrfWVsc2V7ZT1oLShoPj4+MDxlPj4+MD8wOmUpfDA7YnJlYWt9fWVsc2V7aD0ocmQobCxlLGsrMTMyfDApfDApK2p8MDtlPWNbYisyNjg+PjJdfDA7aWYoKGh8MCk8MCl7ZT1oK2V8MDticmVha31lbHNle2U9aC0oaD4+PjA8ZT4+PjA/MDplKXwwO2JyZWFrfX19aWYoKGh8MCk9PTUwMCl7aD0oY1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdfDApKjUwMHwwO2g9KHJkKGIrMjQ0fDAsZSwoY1tiKzI4MD4+Ml18MCkrMTc2fDApfDApK2h8MDtlPWNbYisyNjg+PjJdfDA7aWYoKGh8MCk8MCl7ZT1oK2V8MH1lbHNle2U9aC0oaD4+PjA8ZT4+PjA/MDplKXwwfWg9YisoY1tnPj4yXTw8MikrMTQ4fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2g9Y1tnPj4yXXwwO2lmKChjW2IrKGg8PDIpKzE0OD4+Ml18MCk8PTMpe2JyZWFrfWNbYisoaDw8MikrMTMyPj4yXT1lO2NbYisoY1tnPj4yXTw8MikrMTQ4Pj4yXT0wO2JyZWFrfWg9NTAwLWh8MDtrPWIrMjQ0fDA7aj1jW2IrKGNbZz4+Ml08PDIpKzEzMj4+Ml18MDtpZigoaHwwKT4tMTApe2g9ZWEoaixoKXwwO2g9KHJkKGssZSwoY1tiKzI4MD4+Ml18MCkrMjIwfDApfDApK2h8MDtlPWNbYisyNjg+PjJdfDA7aWYoKGh8MCk8MCl7ZT1oK2V8MDticmVha31lbHNle2U9aC0oaD4+PjA8ZT4+PjA/MDplKXwwO2JyZWFrfX1oPWVhKGosLTEwKXwwO2U9KHJkKGssZSwoY1tiKzI4MD4+Ml18MCkrMjY0fDApfDApK2h8MDtoPWNbYisyNjg+PjJdfDA7aWYoKGV8MCk8MCl7aD1lK2h8MH1lbHNle2g9ZS0oZT4+PjA8aD4+PjA/MDpoKXwwfWU9YisoY1tnPj4yXTw8MikrMTQ4fDA7Y1tlPj4yXT0oY1tlPj4yXXwwKSsxO2U9Y1tnPj4yXXwwO2lmKChjW2IrKGU8PDIpKzE0OD4+Ml18MCk+Myl7Y1tiKyhlPDwyKSsxMzI+PjJdPWg7Y1tiKyhjW2c+PjJdPDwyKSsxNDg+PjJdPTA7ZT1ofWVsc2V7ZT1ofX19d2hpbGUoMCk7bz1iKyhjW2c+PjJdPDwzKSsxMDB8MDtsPW87bj1sO2w9bCs0fDA7bD1JbihkW24+PjBdfGRbbisxPj4wXTw8OHxkW24rMj4+MF08PDE2fGRbbiszPj4wXTw8MjR8MCxkW2w+PjBdfGRbbCsxPj4wXTw8OHxkW2wrMj4+MF08PDE2fGRbbCszPj4wXTw8MjR8MCxlfDAsKChlfDApPDApPDwzMT4+MzF8MCl8MDtuPUk7bT1vO2FbbT4+MF09bDthW20rMT4+MF09bD4+ODthW20rMj4+MF09bD4+MTY7YVttKzM+PjBdPWw+PjI0O289bys0fDA7YVtvPj4wXT1uO2FbbysxPj4wXT1uPj44O2FbbysyPj4wXT1uPj4xNjthW28rMz4+MF09bj4+MjR9fXdoaWxlKDApO249YisoY1tnPj4yXTw8MykrMTAwfDA7bz1uO249bis0fDA7bj1kW24+PjBdfGRbbisxPj4wXTw8OHxkW24rMj4+MF08PDE2fGRbbiszPj4wXTw8MjQ7bz1kW28+PjBdfGRbbysxPj4wXTw8OHxkW28rMj4+MF08PDE2fGRbbyszPj4wXTw8MjQ7ST1uO2k9ZjtyZXR1cm4gb3wwfWZ1bmN0aW9uIGxkKGIsZSxmKXtiPWJ8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtnPWk7aT1pKzE2fDA7aD1nO2lmKChhW2I+PjBdfDApPT0wKXthW2I+PjBdPTE7cGQoY1tlPj4yXXwwLGgsNik7dT1hW2grMT4+MF08PDh8ZFtoPj4wXTtqPXUmNjU1MzU7bD1hW2grMj4+MF18MDtrPShhW2grMz4+MF08PDh8bCYyNTUpJjY1NTM1O249YVtoKzQ+PjBdfDA7bT0oYVtoKzU+PjBdPDw4fG4mMjU1KSY2NTUzNTtoPWIrMXwwO2FbaD4+MF09ajthW2grMT4+MF09aj4+ODtoPWIrM3wwO2FbaD4+MF09azthW2grMT4+MF09az4+ODtoPWIrNXwwO2FbaD4+MF09bTthW2grMT4+MF09bT4+ODtoPXU7bT0obSY2NTUzNSk+Pj44JjI1NX1lbHNle2w9cWQoZSxiKzh8MCl8MDtpZigobCYxfDApPT0wKXttPWIrMXwwO209ZFttPj4wXXxkW20rMT4+MF08PDg7aD1tJjI1NX1lbHNle2g9KHFkKGUsYis1MnwwKXwwKSYyNTU7bT1iKzF8MDttPWRbbT4+MF18ZFttKzE+PjBdPDw4O2g9KG0mMjU1KStofDA7aD0oaHwwKT4yNTU/aCs2NTI4MHwwOmh9aWYoKGwmMnwwKT09MCl7aD1tJjY1MjgwfGgmNjU1MzV9ZWxzZXt1PShxZChlLGIrOTZ8MCl8MCkmMjU1O209YisxfDA7bT1kW20+PjBdfGRbbSsxPj4wXTw8ODt1PSgobSY2NTUzNSk+Pj44KSt1fDA7aD0oKHV8MCk+MjU1P3UrNjUyODB8MDp1KTw8OHxoJjY1NTM1fWo9aCY2NTUzNTtkb3tpZigobCY2NHwwKT09MCl7az1iKzF8MDtsPWIrNXwwO249ajttPWp9ZWxzZXtrPWIrMXwwO209KGgmMjU1KS0obSYyNTUpfDA7ZG97aWYoKGwmNHwwKSE9MCl7cD1xZChlLGIrMTQwfDApfDA7bj1wJjI1NTtvPWIrM3wwO289ZFtvPj4wXXxkW28rMT4+MF08PDg7cT1vJjY1NTM1O3I9KHEmMjU1KSttfDA7cz0ocnwwKTwxO2lmKChyKyAtMXwwKT4+PjA+MjUzKXt0PXM/MDoyNTV9ZWxzZXt0PXErbSYyNTV9aWYoKHQrbnwwKT4yNTUpe2lmKCFzKXtpZigocnwwKT4yNTQpe249MjU1fWVsc2V7bj1xK20mMjU1fX1lbHNle249MH1uPShwfC0yNTYpK258MDticmVha31lbHNle2lmKCFzKXtpZigocnwwKT4yNTQpe3A9MjU1fWVsc2V7cD1xK20mMjU1fX1lbHNle3A9MH1uPXArbnwwO2JyZWFrfX1lbHNle289YiszfDA7bz1kW28+PjBdfGRbbysxPj4wXTw8ODtuPW8mMjU1fX13aGlsZSgwKTtkb3tpZigobCYxNnwwKSE9MCl7cD1xZChlLGIrMjI4fDApfDA7bz1iKzN8MDtvPWRbbz4+MF18ZFtvKzE+PjBdPDw4O3I9KChuJjI1NSkrbS0obyYyNTUpfDApLzJ8MDttPXAmMjU1O3Q9Yis1fDA7dD0oZFt0Pj4wXXxkW3QrMT4+MF08PDgpJjY1NTM1O3U9KHQmMjU1KStyfDA7cz0odXwwKTwxO2lmKCh1KyAtMXwwKT4+PjA+MjUzKXtxPXM/MDoyNTV9ZWxzZXtxPXQrciYyNTV9aWYoKHErbXwwKT4yNTUpe2lmKCFzKXtpZigodXwwKT4yNTQpe209MjU1fWVsc2V7bT10K3ImMjU1fX1lbHNle209MH1tPShwfC0yNTYpK218MDtwPW87YnJlYWt9ZWxzZXtpZighcyl7aWYoKHV8MCk+MjU0KXtwPTI1NX1lbHNle3A9dCtyJjI1NX19ZWxzZXtwPTB9bT1wK218MDtwPW87YnJlYWt9fWVsc2V7bT1iKzV8MDttPShkW20+PjBdfGRbbSsxPj4wXTw8OCkmMjU1O3A9b319d2hpbGUoMCk7bz0oaD4+PjgmMjU1KS0oKChkW2s+PjBdfGRbaysxPj4wXTw8OCkmNjU1MzUpPj4+OCl8MDtpZigobCY4fDApPT0wKXtyPXAmNjUyODB8biY2NTUzNX1lbHNle3A9cWQoZSxiKzE4NHwwKXwwO3E9cCYyNTU7dD1iKzN8MDt0PSgoKGRbdD4+MF18ZFt0KzE+PjBdPDw4KSY2NTUzNSk+Pj44KStvfDA7cj0odHwwKTwxO2lmKHIpe3M9MH1lbHNle3M9KHR8MCk+MjU0PzI1NTp0JjI1NX1pZigocytxfDApPjI1NSl7aWYocil7cT0wfWVsc2V7cT0odHwwKT4yNTQ/MjU1OnQmMjU1fXA9KHB8LTI1NikrcXwwfWVsc2V7aWYocil7cD0wfWVsc2V7cD0odHwwKT4yNTQ/MjU1OnQmMjU1fXA9cCtxfDB9cj1wPDw4fG4mNjU1MzV9bj1yJjY1NTM1O2lmKChsJjMyfDApPT0wKXt1PWIrNXwwO2w9dTttPSgoZFt1Pj4wXXxkW3UrMT4+MF08PDgpJjY1MjgwfG0pJjY1NTM1O2JyZWFrfXE9cWQoZSxiKzI3MnwwKXwwO3U9YiszfDA7cD1xJjI1NTtsPWIrNXwwO3I9KCgoZFtsPj4wXXxkW2wrMT4+MF08PDgpJjY1NTM1KT4+PjgpKygoKHI+Pj44JjI1NSkrby0oKChkW3U+PjBdfGRbdSsxPj4wXTw8OCkmNjU1MzUpPj4+OCl8MCkvMnwwKXwwO289KHJ8MCk8MTtpZihvKXtzPTB9ZWxzZXtzPShyfDApPjI1ND8yNTU6ciYyNTV9aWYoKHMrcHwwKT4yNTUpe2lmKG8pe289MH1lbHNle289KHJ8MCk+MjU0PzI1NTpyJjI1NX1vPShxfC0yNTYpK298MH1lbHNle2lmKG8pe289MH1lbHNle289KHJ8MCk+MjU0PzI1NTpyJjI1NX1vPW8rcHwwfW09KG88PDh8bSkmNjU1MzV9fXdoaWxlKDApO2Fbaz4+MF09ajthW2srMT4+MF09aj4+ODtrPWIrM3wwO2Fbaz4+MF09bjthW2srMT4+MF09bj4+ODthW2w+PjBdPW07YVtsKzE+PjBdPW0+Pjg7az1uO2w9biYyNTU7bj1tJjI1NTttPShtJjY1NTM1KT4+PjgmMjU1fWFbZisxPj4wXT0oaiY2NTUzNSk+Pj44O2FbZj4+MF09aDthW2YrMz4+MF09KGsmNjU1MzUpPj4+ODthW2YrMj4+MF09bDthW2YrNT4+MF09bTthW2YrND4+MF09bjtmPWIrMzE2fDA7aWYoKGFbZj4+MF18MCk9PTApe2k9ZztyZXR1cm59dT0oKG1kKGNbZT4+Ml18MCl8MCkmMjU1KTw8MjQ7dT0oKG1kKGNbZT4+Ml18MCl8MCkmMjU1KTw8MTZ8dTt1PXV8KChtZChjW2U+PjJdfDApfDApJjI1NSk8PDg7Y1tlKzQ+PjJdPXV8KG1kKGNbZT4+Ml18MCl8MCkmMjU1O2FbZj4+MF09MDtpPWc7cmV0dXJufWZ1bmN0aW9uIG1kKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Zz1pO2U9Yis0fDA7aD1jW2U+PjJdfDA7Zj1iKzh8MDtpZigoaHwwKTwoY1tmPj4yXXwwKSl7aj1oO2g9aisxfDA7Y1tlPj4yXT1oO2g9YisxMnwwO2g9Y1toPj4yXXwwO2o9aCtqfDA7aj1hW2o+PjBdfDA7aT1nO3JldHVybiBqfDB9Y1tlPj4yXT0wO2o9Y1tiPj4yXXwwO2g9aisxM3wwO2lmKChhW2g+PjBdfDApPT0wKXtrPWorNHwwO249ais4fDA7bD1jW24+PjJdfDA7bT0oY1trPj4yXXwwKS1sfDA7bT0obXwwKTwxMDQ4NTc2P206MTA0ODU3NjtNbihjW2IrMTI+PjJdfDAsKGNbaj4+Ml18MCkrbHwwLG18MCl8MDtsPShjW24+PjJdfDApK218MDtjW24+PjJdPWw7Y1tqKzE2Pj4yXT1tO2lmKChsfDApPj0oY1trPj4yXXwwKSl7YVtoPj4wXT0xfX1lbHNle2FbaisxMj4+MF09MX1uPWNbKGNbYj4+Ml18MCkrMTY+PjJdfDA7Y1tmPj4yXT1uO2lmKChufDApIT0wKXtuPWNbZT4+Ml18MDttPW4rMXwwO2NbZT4+Ml09bTttPWIrMTJ8MDttPWNbbT4+Ml18MDtuPW0rbnwwO249YVtuPj4wXXwwO2k9ZztyZXR1cm4gbnwwfWI9WGEoOCl8MDtjW2I+PjJdPTk5Mjg7d2hpbGUoMSl7ZT11bigzMil8MDtpZigoZXwwKSE9MCl7ZD0xNDticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7YnJlYWt9c2NbZSYzMV0oKX1pZigoZHwwKT09MTQpe2NbZSs0Pj4yXT0xOTtjW2U+PjJdPTE5O2Y9ZSsxMnwwO2NbYis0Pj4yXT1mO2NbZSs4Pj4yXT0wO2Y9ZiswfDA7ZT04MjR8MDtkPWYrMjB8MDtkb3thW2Y+PjBdPWFbZT4+MF18MDtmPWYrMXwwO2U9ZSsxfDB9d2hpbGUoKGZ8MCk8KGR8MCkpO2NbYj4+Ml09ODU2O3diKGJ8MCw4MDgsMjYpfW49WGEoNCl8MDtjW24+PjJdPTIyNjgwO3diKG58MCwyMjcyOCwyMDYpO3JldHVybiAwfWZ1bmN0aW9uIG5kKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBvZChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHBkKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2Y9aTtnPWIrNHwwO2s9Y1tnPj4yXXwwO2o9Yis4fDA7ZG97aWYoKGt8MCk8KGNbaj4+Ml18MCkpe2o9a31lbHNle2NbZz4+Ml09MDtrPWNbYj4+Ml18MDtsPWsrMTN8MDtpZigoYVtsPj4wXXwwKT09MCl7bT1rKzR8MDtwPWsrOHwwO249Y1twPj4yXXwwO289KGNbbT4+Ml18MCktbnwwO289KG98MCk8MTA0ODU3Nj9vOjEwNDg1NzY7TW4oY1tiKzEyPj4yXXwwLChjW2s+PjJdfDApK258MCxvfDApfDA7bj0oY1twPj4yXXwwKStvfDA7Y1twPj4yXT1uO2NbaysxNj4+Ml09bztpZigobnwwKT49KGNbbT4+Ml18MCkpe2FbbD4+MF09MX19ZWxzZXthW2srMTI+PjBdPTF9cD1jWyhjW2I+PjJdfDApKzE2Pj4yXXwwO2Nbaj4+Ml09cDtpZigocHwwKSE9MCl7aj1jW2c+PjJdfDA7YnJlYWt9ZT1YYSg4KXwwO2NbZT4+Ml09OTkyODt3aGlsZSgxKXtmPXVuKDMyKXwwO2lmKChmfDApIT0wKXtoPTE0O2JyZWFrfWY9Y1s1NjY2XXwwO2NbNTY2Nl09ZiswO2lmKChmfDApPT0wKXticmVha31zY1tmJjMxXSgpfWlmKChofDApPT0xNCl7Y1tmKzQ+PjJdPTE5O2NbZj4+Ml09MTk7ZD1mKzEyfDA7Y1tlKzQ+PjJdPWQ7Y1tmKzg+PjJdPTA7ZD1kKzB8MDtnPTgyNHwwO2Y9ZCsyMHwwO2Rve2FbZD4+MF09YVtnPj4wXXwwO2Q9ZCsxfDA7Zz1nKzF8MH13aGlsZSgoZHwwKTwoZnwwKSk7Y1tlPj4yXT04NTY7d2IoZXwwLDgwOCwyNil9cD1YYSg0KXwwO2NbcD4+Ml09MjI2ODA7d2IocHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2I9Y1tiKzEyPj4yXXwwO2g9YisoaitlKXwwO2lmKChlfDApPT0wKXtwPWo7cD1wK2V8MDtjW2c+PjJdPXA7aT1mO3JldHVybn1iPWIranwwO3doaWxlKDEpe2FbZD4+MF09YVtiPj4wXXwwO2I9YisxfDA7aWYoKGJ8MCk9PShofDApKXticmVha31lbHNle2Q9ZCsxfDB9fXA9Y1tnPj4yXXwwO3A9cCtlfDA7Y1tnPj4yXT1wO2k9ZjtyZXR1cm59ZnVuY3Rpb24gcWQoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTA7ZT1pO2Q9YSs4fDA7Zj1jW2Q+PjJdfDA7aD1jW2IrMTY+PjJdfDA7aWYoKGh8MCkhPTApe2o9Y1thKzQ+PjJdfDA7Zz1mPj4+MTU7Y1tkPj4yXT1nO2w9KGo+Pj4wKS8oZz4+PjApfDA7bT1sPj4+KGNbYis0MD4+Ml18MCk7az1jW2grKG08PDIpPj4yXXwwO209KGNbaCsobSsxPDwyKT4+Ml18MCkrMXwwO249aysxfDA7aD1jW2IrOD4+Ml18MDtpZihtPj4+MD5uPj4+MCl7d2hpbGUoMSl7bj0obStrfDApPj4+MTtvPShjW2grKG48PDIpPj4yXXwwKT4+PjA+bD4+PjA7az1vP2s6bjttPW8/bjptO249aysxfDA7aWYoIShtPj4+MD5uPj4+MCkpe2w9bjticmVha319fWVsc2V7bD1ufW49ZWEoZyxjW2grKGs8PDIpPj4yXXwwKXwwO2lmKChrfDApIT0oY1tiKzMyPj4yXXwwKSl7Zj1lYShjW2grKGw8PDIpPj4yXXwwLGcpfDB9fWVsc2V7aD1mPj4+MTU7Y1tkPj4yXT1oO2w9Y1tiPj4yXXwwO2c9Y1tiKzg+PjJdfDA7aj1jW2ErND4+Ml18MDttPWw+Pj4xO2s9MDtuPTA7ZG97cD1lYShjW2crKG08PDIpPj4yXXwwLGgpfDA7bz1wPj4+MD5qPj4+MDtmPW8/cDpmO249bz9uOnA7az1vP2s6bTtsPW8/bTpsO209KGsrbHwwKT4+PjF9d2hpbGUoKG18MCkhPShrfDApKX1nPWErNHwwO2g9ai1ufDA7Y1tnPj4yXT1oO3A9Zi1ufDA7Y1tkPj4yXT1wO2lmKHA+Pj4wPDE2Nzc3MjE2KXtkb3toPShtZChjW2E+PjJdfDApfDApJjI1NXxoPDw4O2NbZz4+Ml09aDtwPWNbZD4+Ml08PDg7Y1tkPj4yXT1wfXdoaWxlKHA+Pj4wPDE2Nzc3MjE2KX1vPShjW2IrMTI+PjJdfDApKyhrPDwyKXwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtvPWIrMjh8MDtwPShjW28+PjJdfDApKyAtMXwwO2Nbbz4+Ml09cDtpZigocHwwKSE9MCl7aT1lO3JldHVybiBrfDB9ZGQoYik7aT1lO3JldHVybiBrfDB9ZnVuY3Rpb24gcmQoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2U9aTtmPXFkKGIsZCl8MDtjW2E+PjJdPWY7aWYoKGZ8MCkhPTApe2lmKCEoZj4+PjA8MzIpKXtsPWNbYSsyOD4+Ml18MDtpPWU7cmV0dXJuIGx8MH1kPWNbYSsxMj4+Ml18MDtpZihmPj4+MD5kPj4+MCl7ZD1mLWR8MDtsPXFkKGIsKGNbYSs2OD4+Ml18MCkrKChmKyAtMXwwKSo0NHwwKXwwKXwwO2Q9bDw8ZHwoc2QoYixkKXwwKX1lbHNle2Q9cWQoYiwoY1thKzY4Pj4yXXwwKSsoKGYrIC0xfDApKjQ0fDApfDApfDB9YT1jW2E+PjJdfDA7aWYoKGR8MCk8KDE8PGErIC0xfDApKXtsPWQrMSsoLTE8PGEpfDA7aT1lO3JldHVybiBsfDB9ZWxzZXtsPWQrMXwwO2k9ZTtyZXR1cm4gbHwwfX1mPWErNTZ8MDtoPWIrOHwwO2w9Y1toPj4yXXwwO2o9ZWEobD4+PjEzLGNbZj4+Ml18MCl8MDtnPWIrNHwwO2s9Y1tnPj4yXXwwO209az4+PjA+PWo+Pj4wO2Q9bSYxO2lmKG0pe2NbZz4+Ml09ay1qO2o9bC1qfDA7Y1toPj4yXT1qfWVsc2V7Y1toPj4yXT1qO2o9YSs2MHwwO2Nbaj4+Ml09KGNbaj4+Ml18MCkrMTtqPWNbaD4+Ml18MH1pZihqPj4+MDwxNjc3NzIxNil7aj1jW2c+PjJdfDA7ZG97aj0obWQoY1tiPj4yXXwwKXwwKSYyNTV8ajw8ODtjW2c+PjJdPWo7bT1jW2g+PjJdPDw4O2NbaD4+Ml09bX13aGlsZShtPj4+MDwxNjc3NzIxNil9aD1hKzUyfDA7bT0oY1toPj4yXXwwKSsgLTF8MDtjW2g+PjJdPW07aWYoKG18MCkhPTApe209ZDtpPWU7cmV0dXJuIG18MH1iPWErNDh8MDtnPWNbYj4+Ml18MDtqPWErNjR8MDtrPShjW2o+PjJdfDApK2d8MDtjW2o+PjJdPWs7aWYoaz4+PjA+ODE5Mil7az0oaysxfDApPj4+MTtjW2o+PjJdPWs7bT1hKzYwfDA7YT0oKGNbbT4+Ml18MCkrMXwwKT4+PjE7Y1ttPj4yXT1hO2lmKChhfDApPT0oa3wwKSl7bT1rKzF8MDtjW2o+PjJdPW07aj1tfWVsc2V7aj1rO2s9YX19ZWxzZXtqPWs7az1jW2ErNjA+PjJdfDB9Y1tmPj4yXT0oZWEoMjE0NzQ4MzY0OC8oaj4+PjApfDAsayl8MCk+Pj4xODttPWcqNXwwO209bT4+PjA+MjU5PzY0Om0+Pj4yO2NbYj4+Ml09bTtjW2g+PjJdPW07bT1kO2k9ZTtyZXR1cm4gbXwwfWZ1bmN0aW9uIHNkKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wO2Y9aTtkPWErNHwwO2c9Y1tkPj4yXXwwO2U9YSs4fDA7aD1jW2U+PjJdfDA7aWYoYj4+PjA+MTkpe2o9aD4+PjE2O2NbZT4+Ml09ajtoPShnPj4+MCkvKGo+Pj4wKXwwO2c9Zy0oZWEoaCxqKXwwKXwwO2NbZD4+Ml09Zztkb3tnPShtZChjW2E+PjJdfDApfDApJjI1NXxnPDw4O2NbZD4+Ml09ZztqPWNbZT4+Ml08PDg7Y1tlPj4yXT1qfXdoaWxlKGo+Pj4wPDE2Nzc3MjE2KTtqPShzZChhLGIrIC0xNnwwKXwwKTw8MTZ8aCY2NTUzNTtpPWY7cmV0dXJuIGp8MH1qPWg+Pj5iO2NbZT4+Ml09ajtiPShnPj4+MCkvKGo+Pj4wKXwwO2c9Zy0oZWEoYixqKXwwKXwwO2NbZD4+Ml09ZztpZighKGo+Pj4wPDE2Nzc3MjE2KSl7aT1mO3JldHVybiBifDB9ZG97Zz0obWQoY1thPj4yXXwwKXwwKSYyNTV8Zzw8ODtjW2Q+PjJdPWc7aj1jW2U+PjJdPDw4O2NbZT4+Ml09an13aGlsZShqPj4+MDwxNjc3NzIxNik7aT1mO3JldHVybiBifDB9ZnVuY3Rpb24gdGQoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTA7Zj1pO2k9aSs5NnwwO2g9Zis0NHwwO2Q9Zjt3PWIrMzZ8MDt1PWIrNDB8MDtpZigoY1t3Pj4yXXwwKSE9KGNbdT4+Ml18MCkpe2k9ZjtyZXR1cm59aj1iKzh8MDtlPWIrMjB8MDtpZigoY1tqPj4yXXwwKSE9MCl7Zz1iKzQ0fDA7bj1oKzR8MDttPWgrOHwwO2w9aCsxMnwwO2s9aCsxNnwwO289aCsyMHwwO3A9aCsyNHwwO3E9aCsyOHwwO3I9aCszMnwwO3M9aCszNnwwO3Q9aCs0MHwwO3Y9MDtkb3tjZChoLChjW2U+PjJdfDApKzF8MCk7eD1jW3U+PjJdfDA7aWYoeD4+PjA8KGNbZz4+Ml18MCk+Pj4wKXtpZigoeHwwKT09MCl7eD0wfWVsc2V7Y1t4Pj4yXT1jW2g+PjJdO2FbeCs0Pj4wXT1hW24+PjBdfDA7Y1t4Kzg+PjJdPWNbbT4+Ml07Y1t4KzEyPj4yXT1jW2w+PjJdO2NbeCsxNj4+Ml09Y1trPj4yXTtjW3grMjA+PjJdPWNbbz4+Ml07Y1t4KzI0Pj4yXT1jW3A+PjJdO2NbeCsyOD4+Ml09Y1txPj4yXTtjW3grMzI+PjJdPWNbcj4+Ml07Y1t4KzM2Pj4yXT1jW3M+PjJdO2NbeCs0MD4+Ml09Y1t0Pj4yXTtjW20rMD4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDt4PWNbdT4+Ml18MH1jW3U+PjJdPXgrNDR9ZWxzZXt1ZCh3LGgpfXg9Y1ttPj4yXXwwO2lmKCh4fDApIT0wKXt2bihjW3grIC00Pj4yXXwwKX14PWNbbD4+Ml18MDtpZigoeHwwKSE9MCl7dm4oY1t4KyAtND4+Ml18MCl9eD1jW2s+PjJdfDA7aWYoKHh8MCkhPTApe3ZuKGNbeCsgLTQ+PjJdfDApfXY9disxfDB9d2hpbGUodj4+PjA8KGNbaj4+Ml18MCk+Pj4wKX1pZigoY1tlPj4yXXwwKT09MCl7aT1mO3JldHVybn10PWIrMTJ8MDtrPWIrNzJ8MDtzPWIrNzZ8MDtsPWQrNHwwO2o9ZCs4fDA7bz1kKzEyfDA7aD1kKzE2fDA7bT1kKzIwfDA7bj1kKzI0fDA7Zz1kKzI4fDA7cD1kKzMyfDA7cT1kKzM2fDA7cj1kKzQwfDA7Yj1iKzY4fDA7dT0xO2Rve3Y9Y1t0Pj4yXXwwO2NkKGQsMTw8KHU+Pj4wPnY+Pj4wP3Y6dSkpO3Y9Y1trPj4yXXwwO2lmKHY+Pj4wPChjW3M+PjJdfDApPj4+MCl7aWYoKHZ8MCk9PTApe3Y9MH1lbHNle2Nbdj4+Ml09Y1tkPj4yXTthW3YrND4+MF09YVtsPj4wXXwwO2Nbdis4Pj4yXT1jW2o+PjJdO2NbdisxMj4+Ml09Y1tvPj4yXTtjW3YrMTY+PjJdPWNbaD4+Ml07Y1t2KzIwPj4yXT1jW20+PjJdO2NbdisyND4+Ml09Y1tuPj4yXTtjW3YrMjg+PjJdPWNbZz4+Ml07Y1t2KzMyPj4yXT1jW3A+PjJdO2NbdiszNj4+Ml09Y1txPj4yXTtjW3YrNDA+PjJdPWNbcj4+Ml07Y1tqKzA+PjJdPTA7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7dj1jW2s+PjJdfDB9Y1trPj4yXT12KzQ0fWVsc2V7dWQoYixkKX12PWNbaj4+Ml18MDtpZigodnwwKSE9MCl7dm4oY1t2KyAtND4+Ml18MCl9dj1jW28+PjJdfDA7aWYoKHZ8MCkhPTApe3ZuKGNbdisgLTQ+PjJdfDApfXY9Y1toPj4yXXwwO2lmKCh2fDApIT0wKXt2bihjW3YrIC00Pj4yXXwwKX11PXUrMXwwfXdoaWxlKCEodT4+PjA+KGNbZT4+Ml18MCk+Pj4wKSk7aT1mO3JldHVybn1mdW5jdGlvbiB1ZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2U9aTtmPWIrNHwwO209Y1tmPj4yXXwwO2s9Y1tiPj4yXXwwO2w9aztoPShtLWx8MCkvNDR8MDtqPWgrMXwwO2lmKGo+Pj4wPjk3NjEyODkzKXtUaygpfWc9Yis4fDA7bD0oKGNbZz4+Ml18MCktbHwwKS80NHwwO2lmKGw+Pj4wPDQ4ODA2NDQ2KXtvPWw8PDE7bz1vPj4+MDxqPj4+MD9qOm87aWYoKG98MCk9PTApe3A9MDtsPTB9ZWxzZXtuPTV9fWVsc2V7bz05NzYxMjg5MztuPTV9ZG97aWYoKG58MCk9PTUpe3A9byo0NHwwO3A9KHB8MCk9PTA/MTpwO3doaWxlKDEpe2w9dW4ocCl8MDtpZigobHwwKSE9MCl7bj0xMTticmVha31sPWNbNTY2Nl18MDtjWzU2NjZdPWwrMDtpZigobHwwKT09MCl7YnJlYWt9c2NbbCYzMV0oKX1pZigobnwwKT09MTEpe3A9bzticmVha31wPVhhKDQpfDA7Y1twPj4yXT0yMjY4MDt3YihwfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7bz1sKyhoKjQ0fDApfDA7bj1sKyhwKjQ0fDApfDA7aWYoKG98MCkhPTApe2Nbbz4+Ml09Y1tkPj4yXTthW2wrKGgqNDR8MCkrND4+MF09YVtkKzQ+PjBdfDA7bT1kKzh8MDtjW2wrKGgqNDR8MCkrOD4+Ml09Y1ttPj4yXTtjW2wrKGgqNDR8MCkrMTI+PjJdPWNbZCsxMj4+Ml07Y1tsKyhoKjQ0fDApKzE2Pj4yXT1jW2QrMTY+PjJdO2NbbCsoaCo0NHwwKSsyMD4+Ml09Y1tkKzIwPj4yXTtjW2wrKGgqNDR8MCkrMjQ+PjJdPWNbZCsyND4+Ml07Y1tsKyhoKjQ0fDApKzI4Pj4yXT1jW2QrMjg+PjJdO2NbbCsoaCo0NHwwKSszMj4+Ml09Y1tkKzMyPj4yXTtjW2wrKGgqNDR8MCkrMzY+PjJdPWNbZCszNj4+Ml07Y1tsKyhoKjQ0fDApKzQwPj4yXT1jW2QrNDA+PjJdO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO209Y1tmPj4yXXwwO2s9Y1tiPj4yXXwwfWo9bCsoaio0NHwwKXwwO2lmKChtfDApIT0oa3wwKSl7aD1oKyAtMS0oKChtKyAtNDQrKDAtayl8MCk+Pj4wKS80NHwwKXwwO3doaWxlKDEpe2Q9bTttPW0rIC00NHwwO2NbbysgLTQ0Pj4yXT1jW20+PjJdO2FbbysgLTQwPj4wXT1hW2QrIC00MD4+MF18MDtwPWQrIC0zNnwwO2NbbysgLTM2Pj4yXT1jW3A+PjJdO2NbbysgLTMyPj4yXT1jW2QrIC0zMj4+Ml07Y1tvKyAtMjg+PjJdPWNbZCsgLTI4Pj4yXTtjW28rIC0yND4+Ml09Y1tkKyAtMjQ+PjJdO2NbbysgLTIwPj4yXT1jW2QrIC0yMD4+Ml07Y1tvKyAtMTY+PjJdPWNbZCsgLTE2Pj4yXTtjW28rIC0xMj4+Ml09Y1tkKyAtMTI+PjJdO2NbbysgLTg+PjJdPWNbZCsgLTg+PjJdO2NbbysgLTQ+PjJdPWNbZCsgLTQ+PjJdO2NbcCswPj4yXT0wO2NbcCs0Pj4yXT0wO2NbcCs4Pj4yXT0wO2lmKChtfDApPT0oa3wwKSl7YnJlYWt9ZWxzZXtvPW8rIC00NHwwfX1tPWNbYj4+Ml18MDtrPWNbZj4+Ml18MDtjW2I+PjJdPWwrKGgqNDR8MCk7Y1tmPj4yXT1qO2NbZz4+Ml09bjtpZigoa3wwKSE9KG18MCkpe2Rve2Y9Y1trKyAtMzY+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1trKyAtMzI+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1trKyAtMjg+PjJdfDA7az1rKyAtNDR8MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9fXdoaWxlKChrfDApIT0obXwwKSl9fWVsc2V7Y1tiPj4yXT1vO2NbZj4+Ml09ajtjW2c+PjJdPW59aWYoKG18MCk9PTApe2k9ZTtyZXR1cm59dm4obSk7aT1lO3JldHVybn1mdW5jdGlvbiB2ZChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gd2QoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geGQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7YT1jW2ErMTI+PjJdfDA7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59bGNbY1soY1thPj4yXXwwKSs4Pj4yXSYyNTVdKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24geWQoYSxiKXthPWF8MDtiPWJ8MDtpZigoY1tiKzQ+PjJdfDApPT0xNDA4KXthPWErMTJ8MH1lbHNle2E9MH1yZXR1cm4gYXwwfWZ1bmN0aW9uIHpkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEFkKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtlPWk7aT1pKzMyfDA7Zz1lO2Y9Y1tiKzg+PjJdfDA7Yj1jW2IrND4+Ml18MDtqZChnLGYsYik7aD1jW2c+PjJdfDA7YVtkKzM+PjBdPWg+Pj4yNDthW2QrMj4+MF09aD4+PjE2O2FbZCsxPj4wXT1oPj4+ODthW2Q+PjBdPWg7aD1jW2crND4+Ml18MDthW2QrNz4+MF09aD4+PjI0O2FbZCs2Pj4wXT1oPj4+MTY7YVtkKzU+PjBdPWg+Pj44O2FbZCs0Pj4wXT1oO2g9Y1tnKzg+PjJdfDA7YVtkKzExPj4wXT1oPj4+MjQ7YVtkKzEwPj4wXT1oPj4+MTY7YVtkKzk+PjBdPWg+Pj44O2FbZCs4Pj4wXT1oO2g9Y1tnKzEyPj4yXXwwO2FbZCsxMz4+MF09KGgmNjU1MzUpPj4+ODthW2QrMTI+PjBdPWg7YVtkKzE0Pj4wXT1oPj4+MTY7YVtkKzE1Pj4wXT1oPj4+MjQ7Zz1jW2crMTY+PjJdfDA7YVtkKzE2Pj4wXT1nO2FbZCsxNz4+MF09KGcmNjU1MzUpPj4+ODthW2QrMTk+PjBdPWc+Pj4yNDthW2QrMTg+PjBdPWc+Pj4xNjtsZChmKzQ3ODR8MCxiLGQrMjB8MCk7aT1lO3JldHVybn1mdW5jdGlvbiBCZChhKXthPWF8MDt2YXIgYj0wO2I9aTtjW2E+PjJdPTE3MjA7YT1jW2ErOD4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1hZChhKzQ3ODR8MCk7WGMoYSk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBDZChhKXthPWF8MDt2YXIgYj0wLGQ9MDtiPWk7Y1thPj4yXT0xNzIwO2Q9Y1thKzg+PjJdfDA7aWYoKGR8MCk9PTApe3ZuKGEpO2k9YjtyZXR1cm59YWQoZCs0Nzg0fDApO1hjKGQpO3ZuKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gRGQoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEVkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEZkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2E9Y1thKzEyPj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEdkKGEsYil7YT1hfDA7Yj1ifDA7aWYoKGNbYis0Pj4yXXwwKT09MjM3Nil7YT1hKzEyfDB9ZWxzZXthPTB9cmV0dXJuIGF8MH1mdW5jdGlvbiBIZChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBJZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2U9aTtpPWkrMzJ8MDtoPWU7Zj1jW2IrOD4+Ml18MDtiPWNbYis0Pj4yXXwwO2pkKGgsZixiKTtnPWNbaD4+Ml18MDthW2QrMz4+MF09Zz4+PjI0O2FbZCsyPj4wXT1nPj4+MTY7YVtkKzE+PjBdPWc+Pj44O2FbZD4+MF09ZztnPWNbaCs0Pj4yXXwwO2FbZCs3Pj4wXT1nPj4+MjQ7YVtkKzY+PjBdPWc+Pj4xNjthW2QrNT4+MF09Zz4+Pjg7YVtkKzQ+PjBdPWc7Zz1jW2grOD4+Ml18MDthW2QrMTE+PjBdPWc+Pj4yNDthW2QrMTA+PjBdPWc+Pj4xNjthW2QrOT4+MF09Zz4+Pjg7YVtkKzg+PjBdPWc7Zz1jW2grMTI+PjJdfDA7YVtkKzEzPj4wXT0oZyY2NTUzNSk+Pj44O2FbZCsxMj4+MF09ZzthW2QrMTQ+PjBdPWc+Pj4xNjthW2QrMTU+PjBdPWc+Pj4yNDtoPWNbaCsxNj4+Ml18MDthW2QrMTY+PjBdPWg7YVtkKzE3Pj4wXT0oaCY2NTUzNSk+Pj44O2FbZCsxOT4+MF09aD4+PjI0O2FbZCsxOD4+MF09aD4+PjE2O2g9a2QoZis0Nzg0fDAsYil8MDtnPUk7YVtkKzIzPj4wXT1oPj4+MjQ7YVtkKzIyPj4wXT1oPj4+MTY7YVtkKzIxPj4wXT1oPj4+ODthW2QrMjA+PjBdPWg7aj1LbihofDAsZ3wwLDU2KXwwO2FbZCsyNz4+MF09ajtqPUtuKGh8MCxnfDAsNDgpfDA7YVtkKzI2Pj4wXT1qO2g9S24oaHwwLGd8MCw0MCl8MDthW2QrMjU+PjBdPWg7YVtkKzI0Pj4wXT1nO2Q9Zis1MTEyfDA7aWYoKGFbZD4+MF18MCk9PTApe2k9ZTtyZXR1cm59aj0oKG1kKGNbYj4+Ml18MCl8MCkmMjU1KTw8MjQ7aj0oKG1kKGNbYj4+Ml18MCl8MCkmMjU1KTw8MTZ8ajtqPWp8KChtZChjW2I+PjJdfDApfDApJjI1NSk8PDg7Y1tiKzQ+PjJdPWp8KG1kKGNbYj4+Ml18MCl8MCkmMjU1O2FbZD4+MF09MDtpPWU7cmV0dXJufWZ1bmN0aW9uIEpkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2NbYT4+Ml09MjY2NDthPWNbYSs4Pj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufV9jKGErNTA5NnwwKTtfYyhhKzUwNjR8MCk7WmMoYSs0OTQ4fDApOyRjKGErNDc4NHwwKTtYYyhhKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEtkKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2I9aTtjW2E+PjJdPTI2NjQ7ZD1jW2ErOD4+Ml18MDtpZigoZHwwKT09MCl7dm4oYSk7aT1iO3JldHVybn1fYyhkKzUwOTZ8MCk7X2MoZCs1MDY0fDApO1pjKGQrNDk0OHwwKTskYyhkKzQ3ODR8MCk7WGMoZCk7dm4oZCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBMZChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gTWQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gTmQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7YT1jW2ErMTI+PjJdfDA7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59bGNbY1soY1thPj4yXXwwKSs4Pj4yXSYyNTVdKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gT2QoYSxiKXthPWF8MDtiPWJ8MDtpZigoY1tiKzQ+PjJdfDApPT0zMzIwKXthPWErMTJ8MH1lbHNle2E9MH1yZXR1cm4gYXwwfWZ1bmN0aW9uIFBkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFFkKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtlPWk7aT1pKzMyfDA7Zz1lO2Y9Y1tiKzg+PjJdfDA7Yj1jW2IrND4+Ml18MDtqZChnLGYsYik7aD1jW2c+PjJdfDA7YVtkKzM+PjBdPWg+Pj4yNDthW2QrMj4+MF09aD4+PjE2O2FbZCsxPj4wXT1oPj4+ODthW2Q+PjBdPWg7aD1jW2crND4+Ml18MDthW2QrNz4+MF09aD4+PjI0O2FbZCs2Pj4wXT1oPj4+MTY7YVtkKzU+PjBdPWg+Pj44O2FbZCs0Pj4wXT1oO2g9Y1tnKzg+PjJdfDA7YVtkKzExPj4wXT1oPj4+MjQ7YVtkKzEwPj4wXT1oPj4+MTY7YVtkKzk+PjBdPWg+Pj44O2FbZCs4Pj4wXT1oO2g9Y1tnKzEyPj4yXXwwO2FbZCsxMz4+MF09KGgmNjU1MzUpPj4+ODthW2QrMTI+PjBdPWg7YVtkKzE0Pj4wXT1oPj4+MTY7YVtkKzE1Pj4wXT1oPj4+MjQ7Zz1jW2crMTY+PjJdfDA7YVtkKzE2Pj4wXT1nO2FbZCsxNz4+MF09KGcmNjU1MzUpPj4+ODthW2QrMTk+PjBdPWc+Pj4yNDthW2QrMTg+PjBdPWc+Pj4xNjtkPWYrNDc4NHwwO2lmKChhW2Q+PjBdfDApPT0wKXtpPWU7cmV0dXJufWg9KChtZChjW2I+PjJdfDApfDApJjI1NSk8PDI0O2g9KChtZChjW2I+PjJdfDApfDApJjI1NSk8PDE2fGg7aD1ofCgobWQoY1tiPj4yXXwwKXwwKSYyNTUpPDw4O2NbYis0Pj4yXT1ofChtZChjW2I+PjJdfDApfDApJjI1NTthW2Q+PjBdPTA7aT1lO3JldHVybn1mdW5jdGlvbiBSZChhKXthPWF8MDt2YXIgYj0wO2I9aTtjW2E+PjJdPTM2MDg7YT1jW2ErOD4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1YYyhhKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFNkKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2I9aTtjW2E+PjJdPTM2MDg7ZD1jW2ErOD4+Ml18MDtpZigoZHwwKT09MCl7dm4oYSk7aT1iO3JldHVybn1YYyhkKTt2bihkKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFRkKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBVZChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBWZChhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSsxMj4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1sY1tjWyhjW2E+PjJdfDApKzg+PjJdJjI1NV0oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBXZChhLGIpe2E9YXwwO2I9YnwwO2lmKChjW2IrND4+Ml18MCk9PTQyMTYpe2E9YSsxMnwwfWVsc2V7YT0wfXJldHVybiBhfDB9ZnVuY3Rpb24gWGQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gWWQoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7Y1tiPj4yXT00NTAwO2NbYis2ND4+Ml09NDU0MDtjW2IrOD4+Ml09NDUyMDtlPWIrMTJ8MDtjW2U+PjJdPTQ2ODg7aWYoISgoYVtiKzQ0Pj4wXSYxKT09MCk/KGY9Y1tiKzUyPj4yXXwwLChmfDApIT0wKTowKXt2bihmKX1jW2U+PjJdPTEwNjY0O2U9Y1tiKzE2Pj4yXXwwO2c9ZSs0fDA7Zj1jW2c+PjJdfDA7Y1tnPj4yXT1mKyAtMTtpZigoZnwwKSE9MCl7Zz1iKzY0fDA7cmcoZyk7aT1kO3JldHVybn1sY1tjWyhjW2U+PjJdfDApKzg+PjJdJjI1NV0oZSk7Zz1iKzY0fDA7cmcoZyk7aT1kO3JldHVybn1mdW5jdGlvbiBaZChiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wO2Q9aTtnPWIrIC04fDA7Y1tnPj4yXT00NTAwO2I9Zys2NHwwO2NbYj4+Ml09NDU0MDtjW2crOD4+Ml09NDUyMDtmPWcrMTJ8MDtjW2Y+PjJdPTQ2ODg7aWYoISgoYVtnKzQ0Pj4wXSYxKT09MCk/KGU9Y1tnKzUyPj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1jW2Y+PjJdPTEwNjY0O2U9Y1tnKzE2Pj4yXXwwO2Y9ZSs0fDA7Zz1jW2Y+PjJdfDA7Y1tmPj4yXT1nKyAtMTtpZigoZ3wwKSE9MCl7cmcoYik7aT1kO3JldHVybn1sY1tjWyhjW2U+PjJdfDApKzg+PjJdJjI1NV0oZSk7cmcoYik7aT1kO3JldHVybn1mdW5jdGlvbiBfZChiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MDtlPWk7Zz1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7Y1tiK2c+PjJdPTQ1MDA7ZD1iKyhnKzY0KXwwO2NbZD4+Ml09NDU0MDtjW2IrKGcrOCk+PjJdPTQ1MjA7Zj1iKyhnKzEyKXwwO2NbZj4+Ml09NDY4ODtpZighKChhW2IrKGcrNDQpPj4wXSYxKT09MCk/KGg9Y1tiKyhnKzUyKT4+Ml18MCwoaHwwKSE9MCk6MCl7dm4oaCl9Y1tmPj4yXT0xMDY2NDtiPWNbYisoZysxNik+PjJdfDA7Zz1iKzR8MDtoPWNbZz4+Ml18MDtjW2c+PjJdPWgrIC0xO2lmKChofDApIT0wKXtyZyhkKTtpPWU7cmV0dXJufWxjW2NbKGNbYj4+Ml18MCkrOD4+Ml0mMjU1XShiKTtyZyhkKTtpPWU7cmV0dXJufWZ1bmN0aW9uICRkKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTA7ZD1pO2NbYj4+Ml09NDUwMDtjW2IrNjQ+PjJdPTQ1NDA7Y1tiKzg+PjJdPTQ1MjA7ZT1iKzEyfDA7Y1tlPj4yXT00Njg4O2lmKCEoKGFbYis0ND4+MF0mMSk9PTApPyhmPWNbYis1Mj4+Ml18MCwoZnwwKSE9MCk6MCl7dm4oZil9Y1tlPj4yXT0xMDY2NDtlPWNbYisxNj4+Ml18MDtnPWUrNHwwO2Y9Y1tnPj4yXXwwO2NbZz4+Ml09ZisgLTE7aWYoKGZ8MCk9PTApe2xjW2NbKGNbZT4+Ml18MCkrOD4+Ml0mMjU1XShlKX1yZyhiKzY0fDApO2lmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gYWUoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7ZD1pO2Y9YisgLTh8MDtjW2Y+PjJdPTQ1MDA7Yj1mKzY0fDA7Y1tiPj4yXT00NTQwO2NbZis4Pj4yXT00NTIwO2c9ZisxMnwwO2NbZz4+Ml09NDY4ODtpZighKChhW2YrNDQ+PjBdJjEpPT0wKT8oZT1jW2YrNTI+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWNbZz4+Ml09MTA2NjQ7ZT1jW2YrMTY+PjJdfDA7aD1lKzR8MDtnPWNbaD4+Ml18MDtjW2g+PjJdPWcrIC0xO2lmKChnfDApIT0wKXtyZyhiKTt2bihmKTtpPWQ7cmV0dXJufWxjW2NbKGNbZT4+Ml18MCkrOD4+Ml0mMjU1XShlKTtyZyhiKTt2bihmKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIGJlKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MDtkPWk7aD1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7Zj1iK2h8MDtjW2Y+PjJdPTQ1MDA7ZT1iKyhoKzY0KXwwO2NbZT4+Ml09NDU0MDtjW2IrKGgrOCk+PjJdPTQ1MjA7Zz1iKyhoKzEyKXwwO2NbZz4+Ml09NDY4ODtpZighKChhW2IrKGgrNDQpPj4wXSYxKT09MCk/KGo9Y1tiKyhoKzUyKT4+Ml18MCwoanwwKSE9MCk6MCl7dm4oail9Y1tnPj4yXT0xMDY2NDtiPWNbYisoaCsxNik+PjJdfDA7aD1iKzR8MDtqPWNbaD4+Ml18MDtjW2g+PjJdPWorIC0xO2lmKChqfDApPT0wKXtsY1tjWyhjW2I+PjJdfDApKzg+PjJdJjI1NV0oYil9cmcoZSk7aWYoKGZ8MCk9PTApe2k9ZDtyZXR1cm59dm4oZik7aT1kO3JldHVybn1mdW5jdGlvbiBjZShiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTA7ZD1pO2NbYj4+Ml09NDY4ODtpZighKChhW2IrMzI+PjBdJjEpPT0wKT8oZT1jW2IrNDA+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWNbYj4+Ml09MTA2NjQ7Yj1jW2IrND4+Ml18MDtmPWIrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe2k9ZDtyZXR1cm59bGNbY1soY1tiPj4yXXwwKSs4Pj4yXSYyNTVdKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZGUoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7Y1tiPj4yXT00Njg4O2lmKCEoKGFbYiszMj4+MF0mMSk9PTApPyhlPWNbYis0MD4+Ml18MCwoZXwwKSE9MCk6MCl7dm4oZSl9Y1tiPj4yXT0xMDY2NDtlPWNbYis0Pj4yXXwwO2c9ZSs0fDA7Zj1jW2c+PjJdfDA7Y1tnPj4yXT1mKyAtMTtpZigoZnwwKT09MCl7bGNbY1soY1tlPj4yXXwwKSs4Pj4yXSYyNTVdKGUpfWlmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZWUoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MDtsPWk7bz1kKzQ0fDA7bT1jW28+PjJdfDA7az1kKzI0fDA7aj1jW2s+PjJdfDA7aWYobT4+PjA8aj4+PjApe2Nbbz4+Ml09ajttPWp9bz1oJjI0O2Rve2lmKChvfDApPT0wKXtvPWI7Y1tvPj4yXT0wO2Nbbys0Pj4yXT0wO289Yis4fDA7Y1tvPj4yXT0tMTtjW28rND4+Ml09LTE7aT1sO3JldHVybn1lbHNlIGlmKChvfDApIT0yNCl7aWYoKGd8MCk9PTIpe249MTE7YnJlYWt9ZWxzZSBpZigoZ3wwKT09MCl7Zz0wO289MDticmVha31lbHNlIGlmKChnfDApIT0xKXtuPTE1O2JyZWFrfWlmKChoJjh8MCk9PTApe289ai0oY1tkKzIwPj4yXXwwKXwwO2c9bztvPSgob3wwKTwwKTw8MzE+PjMxO2JyZWFrfWVsc2V7bz0oY1tkKzEyPj4yXXwwKS0oY1tkKzg+PjJdfDApfDA7Zz1vO289KChvfDApPDApPDwzMT4+MzE7YnJlYWt9fWVsc2V7aWYoKGd8MCk9PTIpe249MTE7YnJlYWt9ZWxzZSBpZigoZ3wwKT09MCl7Zz0wO289MDticmVha31lbHNlIGlmKChnfDApIT0xKXtuPTE1O2JyZWFrfW89YjtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7bz1iKzh8MDtjW28+PjJdPS0xO2Nbbys0Pj4yXT0tMTtpPWw7cmV0dXJufX13aGlsZSgwKTtpZigobnwwKT09MTUpe289YjtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7bz1iKzh8MDtjW28+PjJdPS0xO2Nbbys0Pj4yXT0tMTtpPWw7cmV0dXJufWlmKChufDApPT0xMSl7bj1kKzMyfDA7aWYoKGFbbj4+MF0mMSk9PTApe249bisxfDB9ZWxzZXtuPWNbZCs0MD4+Ml18MH1vPW0tbnwwO2c9bztvPSgob3wwKTwwKTw8MzE+PjMxfWY9SW4oZ3wwLG98MCxlfDAsZnwwKXwwO2U9STtpZigoZXwwKT49MCl7bj1kKzMyfDA7aWYoKGFbbj4+MF0mMSk9PTApe249bisxfDB9ZWxzZXtuPWNbZCs0MD4+Ml18MH1vPW0tbnwwO2c9KChvfDApPDApPDwzMT4+MzE7aWYoISgoZ3wwKTwoZXwwKXwoZ3wwKT09KGV8MCkmbz4+PjA8Zj4+PjApKXtuPWgmODtpZighKChmfDApPT0wJihlfDApPT0wKSl7aWYoKG58MCkhPTA/KGNbZCsxMj4+Ml18MCk9PTA6MCl7bz1iO2Nbbz4+Ml09MDtjW28rND4+Ml09MDtvPWIrOHwwO2Nbbz4+Ml09LTE7Y1tvKzQ+PjJdPS0xO2k9bDtyZXR1cm59aWYoKGgmMTZ8MCkhPTAmKGp8MCk9PTApe289YjtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7bz1iKzh8MDtjW28+PjJdPS0xO2Nbbys0Pj4yXT0tMTtpPWw7cmV0dXJufX1pZigobnwwKSE9MCl7Y1tkKzEyPj4yXT0oY1tkKzg+PjJdfDApK2Y7Y1tkKzE2Pj4yXT1tfWlmKChoJjE2fDApIT0wKXtjW2s+PjJdPShjW2QrMjA+PjJdfDApK2Z9bz1iO2Nbbz4+Ml09MDtjW28rND4+Ml09MDtvPWIrOHwwO2Nbbz4+Ml09ZjtjW28rND4+Ml09ZTtpPWw7cmV0dXJufX1vPWI7Y1tvPj4yXT0wO2Nbbys0Pj4yXT0wO289Yis4fDA7Y1tvPj4yXT0tMTtjW28rND4+Ml09LTE7aT1sO3JldHVybn1mdW5jdGlvbiBmZShhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wO2Y9aTtkPWQrOHwwO3djW2NbKGNbYj4+Ml18MCkrMTY+PjJdJjYzXShhLGIsY1tkPj4yXXwwLGNbZCs0Pj4yXXwwLDAsZSk7aT1mO3JldHVybn1mdW5jdGlvbiBnZShhKXthPWF8MDt2YXIgYj0wLGU9MCxmPTAsZz0wO2I9aTtmPWErNDR8MDtnPWNbZj4+Ml18MDtlPWNbYSsyND4+Ml18MDtpZihnPj4+MDxlPj4+MCl7Y1tmPj4yXT1lfWVsc2V7ZT1nfWlmKChjW2ErNDg+PjJdJjh8MCk9PTApe2c9LTE7aT1iO3JldHVybiBnfDB9Zj1hKzE2fDA7Zz1jW2Y+PjJdfDA7YT1jW2ErMTI+PjJdfDA7aWYoZz4+PjA8ZT4+PjApe2NbZj4+Ml09ZX1lbHNle2U9Z31pZighKGE+Pj4wPGU+Pj4wKSl7Zz0tMTtpPWI7cmV0dXJuIGd8MH1nPWRbYT4+MF18MDtpPWI7cmV0dXJuIGd8MH1mdW5jdGlvbiBoZShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7ZT1pO2c9Yis0NHwwO2Y9Y1tnPj4yXXwwO2o9Y1tiKzI0Pj4yXXwwO2lmKGY+Pj4wPGo+Pj4wKXtjW2c+PjJdPWp9ZWxzZXtqPWZ9Zj1iKzh8MDtnPWNbZj4+Ml18MDtoPWIrMTJ8MDtsPWNbaD4+Ml18MDtpZighKGc+Pj4wPGw+Pj4wKSl7bD0tMTtpPWU7cmV0dXJuIGx8MH1pZigoZHwwKT09LTEpe2NbZj4+Ml09ZztjW2g+PjJdPWwrIC0xO2NbYisxNj4+Ml09ajtsPTA7aT1lO3JldHVybiBsfDB9aWYoKGNbYis0OD4+Ml0mMTZ8MCk9PTApe2s9ZCYyNTU7bD1sKyAtMXwwO2lmKCEoazw8MjQ+PjI0PT0oYVtsPj4wXXwwKSkpe2w9LTE7aT1lO3JldHVybiBsfDB9fWVsc2V7az1kJjI1NTtsPWwrIC0xfDB9Y1tmPj4yXT1nO2NbaD4+Ml09bDtjW2IrMTY+PjJdPWo7YVtsPj4wXT1rO2w9ZDtpPWU7cmV0dXJuIGx8MH1mdW5jdGlvbiBpZShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7aj1pO2lmKChkfDApPT0tMSl7dT0wO2k9ajtyZXR1cm4gdXwwfWc9YisxMnwwO2U9Yis4fDA7Zj0oY1tnPj4yXXwwKS0oY1tlPj4yXXwwKXwwO2g9YisyNHwwO249Y1toPj4yXXwwO2s9YisyOHwwO209Y1trPj4yXXwwO2lmKChufDApPT0obXwwKSl7bD1iKzQ4fDA7aWYoKGNbbD4+Ml0mMTZ8MCk9PTApe3U9LTE7aT1qO3JldHVybiB1fDB9bT1iKzIwfDA7cD1jW20+PjJdfDA7bj1uLXB8MDtvPWIrNDR8MDtwPShjW28+PjJdfDApLXB8MDtxPWIrMzJ8MDtyPWFbcT4+MF18MDtzPShyJjEpIT0wO2lmKHMpe3Q9KGNbcT4+Ml0mLTIpKyAtMXwwO3I9Y1tiKzM2Pj4yXXwwfWVsc2V7dD0xMDtyPShyJjI1NSk+Pj4xfWlmKChyfDApPT0odHwwKSl7bGcocSx0LDEsdCx0LDApO2lmKChhW3E+PjBdJjEpPT0wKXtzPTEyfWVsc2V7cz0xM319ZWxzZXtpZihzKXtzPTEzfWVsc2V7cz0xMn19aWYoKHN8MCk9PTEyKXthW3E+PjBdPShyPDwxKSsyO3U9cSsxfDA7dD1yKzF8MH1lbHNlIGlmKChzfDApPT0xMyl7dT1jW2IrNDA+PjJdfDA7dD1yKzF8MDtjW2IrMzY+PjJdPXR9YVt1K3I+PjBdPTA7YVt1K3Q+PjBdPTA7dD1hW3E+PjBdfDA7aWYoKHQmMSk9PTApe3I9MTB9ZWxzZXtyPWNbcT4+Ml18MDt0PXImMjU1O3I9KHImLTIpKyAtMXwwfXM9KHQmMSk9PTA7aWYocyl7dD0odCYyNTUpPj4+MX1lbHNle3Q9Y1tiKzM2Pj4yXXwwfWRve2lmKCEodD4+PjA8cj4+PjApKXtpZihzKXthW3ErcisxPj4wXT0wO2FbcT4+MF09cjw8MTticmVha31lbHNle2FbKGNbYis0MD4+Ml18MCkrcj4+MF09MDtjW2IrMzY+PjJdPXI7YnJlYWt9fWVsc2V7aGcocSxyLXR8MCl9fXdoaWxlKDApO3I9YVtxPj4wXXwwO2lmKChyJjEpPT0wKXtxPXErMXwwO3I9KHImMjU1KT4+PjF9ZWxzZXtxPWNbYis0MD4+Ml18MDtyPWNbYiszNj4+Ml18MH10PXErcnwwO2NbbT4+Ml09cTtjW2s+PjJdPXQ7bj1xK258MDtjW2g+PjJdPW47dT1xK3B8MDtjW28+PjJdPXU7az10O289dX1lbHNle2w9Yis0OHwwO2s9bTtvPWNbYis0ND4+Ml18MH1tPW4rMXwwO289bT4+PjA8bz4+PjA/bzptO2NbYis0ND4+Ml09bztpZigoY1tsPj4yXSY4fDApIT0wKXtsPWIrMzJ8MDtpZigoYVtsPj4wXSYxKT09MCl7bD1sKzF8MH1lbHNle2w9Y1tiKzQwPj4yXXwwfWNbZT4+Ml09bDtjW2c+PjJdPWwrZjtjW2IrMTY+PjJdPW99aWYoKG58MCk9PShrfDApKXt1PXhjW2NbKGNbYj4+Ml18MCkrNTI+PjJdJjYzXShiLGQmMjU1KXwwO2k9ajtyZXR1cm4gdXwwfWVsc2V7Y1toPj4yXT1tO2Fbbj4+MF09ZDt1PWQmMjU1O2k9ajtyZXR1cm4gdXwwfXJldHVybiAwfWZ1bmN0aW9uIGplKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBrZShhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBsZShhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSsxMj4+Ml18MDtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBtZShhLGIpe2E9YXwwO2I9YnwwO2lmKChjW2IrND4+Ml18MCk9PTUwNDgpe2E9YSsxMnwwfWVsc2V7YT0wfXJldHVybiBhfDB9ZnVuY3Rpb24gbmUoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gb2UoYil7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGo9MCxsPTAsbT0wLG49MCxvPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsSj0wLjAsSz0wLjAsTD0wLjAsTT0wLjAsTj0wLjAsTz0wLjA7ZT1pO2k9aSsyNTZ8MDtmPWUrODB8MDtvPWU7bj1lKzEwNHwwO209ZSsyMjR8MDtqPWUrMjA4fDA7Zz1lKzEyOHwwO3g9ZSsyNDB8MDt2PWUrMTEyfDA7cz1lKzU2fDA7ej1jW2I+PjJdfDA7eT16KzEzfDA7aWYoKGFbeT4+MF18MCk9PTApe0g9eis0fDA7RT16Kzh8MDtHPWNbRT4+Ml18MDtGPShjW0g+PjJdfDApLUd8MDtGPShGfDApPDQ/Rjo0O01uKHh8MCwoY1t6Pj4yXXwwKStHfDAsRnwwKXwwO0c9KGNbRT4+Ml18MCkrRnwwO2NbRT4+Ml09RztjW3orMTY+PjJdPUY7aWYoKEd8MCk+PShjW0g+PjJdfDApKXthW3k+PjBdPTF9fWVsc2V7YVt6KzEyPj4wXT0xfWFbdj4+MF09ODtCPXYrMXwwO2FbQj4+MF09YVt4Pj4wXXwwO2FbdisyPj4wXT1hW3grMT4+MF18MDthW3YrMz4+MF09YVt4KzI+PjBdfDA7eT12KzR8MDthW3k+PjBdPWFbeCszPj4wXXwwO2FbdisoeCsoNC14KSkrMT4+MF09MDt6PWFbdj4+MF18MDt4PSh6JjEpPT0wO2lmKHgpe3k9KHomMjU1KT4+PjF9ZWxzZXtCPWNbdis4Pj4yXXwwO3k9Y1t5Pj4yXXwwfXo9eT4+PjA+NDtBPXo/NDp5O2E6ZG97aWYoKEF8MCkhPTApe0M9NTIzMjt3aGlsZSgxKXtEPWFbQj4+MF18MDtFPWFbQz4+MF18MDtpZighKEQ8PDI0Pj4yND09RTw8MjQ+PjI0KSl7YnJlYWt9QT1BKyAtMXwwO2lmKChBfDApPT0wKXtsPTEyO2JyZWFrIGF9ZWxzZXtCPUIrMXwwO0M9QysxfDB9fWlmKCEoRDw8MjQ+PjI0PT1FPDwyND4+MjQpKXt5PShEJjI1NSktKEUmMjU1KXwwfWVsc2V7bD0xMn19ZWxzZXtsPTEyfX13aGlsZSgwKTtpZigobHwwKT09MTIpe3k9eT4+PjA8ND8tMTp6JjF9eT0oeXwwKT09MDtpZigheD8odz1jW3YrOD4+Ml18MCwod3wwKSE9MCk6MCl7dm4odyl9aWYoIXkpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11bigzNil8MDtpZigoYnwwKSE9MCl7bD0yMzticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MjMpe2NbYis0Pj4yXT0yMztjW2I+PjJdPTIzO2Y9YisxMnwwO2NbZys0Pj4yXT1mO2NbYis4Pj4yXT0wO2Y9ZiswfDA7Yj03MDU2fDA7ZT1mKzI0fDA7ZG97YVtmPj4wXT1hW2I+PjBdfDA7Zj1mKzF8MDtiPWIrMXwwfXdoaWxlKChmfDApPChlfDApKTtjW2c+PjJdPTcwODg7d2IoZ3wwLDUyNzIsODYpfUg9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfXY9U2MoODM1Miw1Mjg4KXwwO3c9Y1t2KygoY1soY1t2Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7eD13KzR8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9ej0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7eT1jW3crOD4+Ml18MDtpZigoY1t3KzEyPj4yXXwwKS15Pj4yPj4+MD56Pj4+MD8odT1jW3krKHo8PDIpPj4yXXwwLCh1fDApIT0wKTowKXt1PXhjW2NbKGNbdT4+Ml18MCkrMjg+PjJdJjYzXSh1LDEwKXwwO0g9Y1t4Pj4yXXwwO2NbeD4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbdz4+Ml18MCkrOD4+Ml0mMjU1XSh3KX1saCh2LHUpO1lnKHYpO3U9Y1tiPj4yXXwwO2lmKChjW3UrND4+Ml18MCk+MCl7Y1t1Kzg+PjJdPTB9ZWxzZXthW3UrMTI+PjBdPTF9dj1jW2I+PjJdfDA7dT1iKzIwfDA7dz12KzEzfDA7aWYoKGFbdz4+MF18MCk9PTApe0g9dis0fDA7RT12Kzh8MDtHPWNbRT4+Ml18MDtGPShjW0g+PjJdfDApLUd8MDtGPShGfDApPDIyNz9GOjIyNztNbih1fDAsKGNbdj4+Ml18MCkrR3wwLEZ8MCl8MDtHPShjW0U+PjJdfDApK0Z8MDtjW0U+PjJdPUc7Y1t2KzE2Pj4yXT1GO2lmKChHfDApPj0oY1tIPj4yXXwwKSl7YVt3Pj4wXT0xfX1lbHNle2FbdisxMj4+MF09MX1DPWIrMTk5fDA7YVtrPj4wXT1hW0M+PjBdO2FbaysxPj4wXT1hW0MrMT4+MF07YVtrKzI+PjBdPWFbQysyPj4wXTthW2srMz4+MF09YVtDKzM+PjBdO2Fbays0Pj4wXT1hW0MrND4+MF07YVtrKzU+PjBdPWFbQys1Pj4wXTthW2srNj4+MF09YVtDKzY+PjBdO2Fbays3Pj4wXT1hW0MrNz4+MF07Tj0raFtrPj4zXTtFPWIrMjA3fDA7YVtrPj4wXT1hW0U+PjBdO2FbaysxPj4wXT1hW0UrMT4+MF07YVtrKzI+PjBdPWFbRSsyPj4wXTthW2srMz4+MF09YVtFKzM+PjBdO2Fbays0Pj4wXT1hW0UrND4+MF07YVtrKzU+PjBdPWFbRSs1Pj4wXTthW2srNj4+MF09YVtFKzY+PjBdO2Fbays3Pj4wXT1hW0UrNz4+MF07Tz0raFtrPj4zXTtHPWIrMjE1fDA7YVtrPj4wXT1hW0c+PjBdO2FbaysxPj4wXT1hW0crMT4+MF07YVtrKzI+PjBdPWFbRysyPj4wXTthW2srMz4+MF09YVtHKzM+PjBdO2Fbays0Pj4wXT1hW0crND4+MF07YVtrKzU+PjBdPWFbRys1Pj4wXTthW2srNj4+MF09YVtHKzY+PjBdO2Fbays3Pj4wXT1hW0crNz4+MF07TD0raFtrPj4zXTtEPWIrMjIzfDA7YVtrPj4wXT1hW0Q+PjBdO2FbaysxPj4wXT1hW0QrMT4+MF07YVtrKzI+PjBdPWFbRCsyPj4wXTthW2srMz4+MF09YVtEKzM+PjBdO2Fbays0Pj4wXT1hW0QrND4+MF07YVtrKzU+PjBdPWFbRCs1Pj4wXTthW2srNj4+MF09YVtEKzY+PjBdO2Fbays3Pj4wXT1hW0QrNz4+MF07TT0raFtrPj4zXTtGPWIrMjMxfDA7YVtrPj4wXT1hW0Y+PjBdO2FbaysxPj4wXT1hW0YrMT4+MF07YVtrKzI+PjBdPWFbRisyPj4wXTthW2srMz4+MF09YVtGKzM+PjBdO2Fbays0Pj4wXT1hW0YrND4+MF07YVtrKzU+PjBdPWFbRis1Pj4wXTthW2srNj4+MF09YVtGKzY+PjBdO2Fbays3Pj4wXT1hW0YrNz4+MF07Sj0raFtrPj4zXTtIPWIrMjM5fDA7YVtrPj4wXT1hW0g+PjBdO2FbaysxPj4wXT1hW0grMT4+MF07YVtrKzI+PjBdPWFbSCsyPj4wXTthW2srMz4+MF09YVtIKzM+PjBdO2Fbays0Pj4wXT1hW0grND4+MF07YVtrKzU+PjBdPWFbSCs1Pj4wXTthW2srNj4+MF09YVtIKzY+PjBdO2Fbays3Pj4wXT1hW0grNz4+MF07Sz0raFtrPj4zXTtoW2s+PjNdPU87YVtDPj4wXT1hW2s+PjBdO2FbQysxPj4wXT1hW2srMT4+MF07YVtDKzI+PjBdPWFbaysyPj4wXTthW0MrMz4+MF09YVtrKzM+PjBdO2FbQys0Pj4wXT1hW2srND4+MF07YVtDKzU+PjBdPWFbays1Pj4wXTthW0MrNj4+MF09YVtrKzY+PjBdO2FbQys3Pj4wXT1hW2srNz4+MF07aFtrPj4zXT1OO2FbRD4+MF09YVtrPj4wXTthW0QrMT4+MF09YVtrKzE+PjBdO2FbRCsyPj4wXT1hW2srMj4+MF07YVtEKzM+PjBdPWFbayszPj4wXTthW0QrND4+MF09YVtrKzQ+PjBdO2FbRCs1Pj4wXT1hW2srNT4+MF07YVtEKzY+PjBdPWFbays2Pj4wXTthW0QrNz4+MF09YVtrKzc+PjBdO2hbaz4+M109TTthW0U+PjBdPWFbaz4+MF07YVtFKzE+PjBdPWFbaysxPj4wXTthW0UrMj4+MF09YVtrKzI+PjBdO2FbRSszPj4wXT1hW2srMz4+MF07YVtFKzQ+PjBdPWFbays0Pj4wXTthW0UrNT4+MF09YVtrKzU+PjBdO2FbRSs2Pj4wXT1hW2srNj4+MF07YVtFKzc+PjBdPWFbays3Pj4wXTtoW2s+PjNdPUw7YVtGPj4wXT1hW2s+PjBdO2FbRisxPj4wXT1hW2srMT4+MF07YVtGKzI+PjBdPWFbaysyPj4wXTthW0YrMz4+MF09YVtrKzM+PjBdO2FbRis0Pj4wXT1hW2srND4+MF07YVtGKzU+PjBdPWFbays1Pj4wXTthW0YrNj4+MF09YVtrKzY+PjBdO2FbRis3Pj4wXT1hW2srNz4+MF07aFtrPj4zXT1LO2FbRz4+MF09YVtrPj4wXTthW0crMT4+MF09YVtrKzE+PjBdO2FbRysyPj4wXT1hW2srMj4+MF07YVtHKzM+PjBdPWFbayszPj4wXTthW0crND4+MF09YVtrKzQ+PjBdO2FbRys1Pj4wXT1hW2srNT4+MF07YVtHKzY+PjBdPWFbays2Pj4wXTthW0crNz4+MF09YVtrKzc+PjBdO2hbaz4+M109SjthW0g+PjBdPWFbaz4+MF07YVtIKzE+PjBdPWFbaysxPj4wXTthW0grMj4+MF09YVtrKzI+PjBdO2FbSCszPj4wXT1hW2srMz4+MF07YVtIKzQ+PjBdPWFbays0Pj4wXTthW0grNT4+MF09YVtrKzU+PjBdO2FbSCs2Pj4wXT1hW2srNj4+MF07YVtIKzc+PjBdPWFbays3Pj4wXTtpZigoYVs2MzY4XXwwKT09MD8oUWEoNjM2OCl8MCkhPTA6MCl7Y1sxNTg4XT0wO2NbNjM1Nj4+Ml09MDtjWzYzNjA+PjJdPTA7Y2MoMjA5LDYzNTIscHwwKXwwOyRhKDYzNjgpfWlmKChhWzY0MDBdfDApPT0wPyhRYSg2NDAwKXwwKSE9MDowKXtjYygyMTAsNjM3NixwfDApfDA7JGEoNjQwMCl9dz1jWzE1ODhdfDA7dj1jWzYzNTY+PjJdfDA7ZG97aWYoKHd8MCk9PSh2fDApKXt2PSRiKDYzNzYpfDA7aWYoKHZ8MCkhPTApe2I9WGEoMTYpfDA7ZG97aWYoKGFbMTAxMjBdfDApPT0wKXtpZigoUWEoMTAxMjApfDApPT0wKXticmVha31jWzI1MjhdPTEwMzg0OyRhKDEwMTIwKX19d2hpbGUoMCk7WWYoYix2LDEwMTEyLDEwNDcyKTt3YihifDAsMTAxODQsMTA5KX14PWNbMTU4OF18MDtkb3tpZigoeHwwKT09KGNbNjM1Nj4+Ml18MCkpe3Y9ZisxNnwwO2Nbdj4+Ml09ZjtjW2Y+PjJdPTY0MTY7dz1jWzYzNjA+PjJdfDA7ZG97aWYoeD4+PjA8dz4+PjApe2lmKCh4fDApPT0wKXt3PTB9ZWxzZXtjW3grMTY+PjJdPXg7dz1jW3Y+PjJdfDA7bWNbY1soY1t3Pj4yXXwwKSsxMj4+Ml0mMTI3XSh3LHgpO3c9Y1s2MzU2Pj4yXXwwfWNbNjM1Nj4+Ml09dysyNH1lbHNle3c9KHcteHwwKS8yNHwwO2lmKHc+Pj4wPDg5NDc4NDg1KXt3PXc8PDE7dz0od3wwKT09MD8xOnd9ZWxzZXt3PTE3ODk1Njk3MH14PXcqMjR8MDt4PSh4fDApPT0wPzE6eDt3aGlsZSgxKXt5PXVuKHgpfDA7aWYoKHl8MCkhPTApe2JyZWFrfXk9Y1s1NjY2XXwwO2NbNTY2Nl09eSswO2lmKCh5fDApPT0wKXtsPTY1O2JyZWFrfXNjW3kmMzFdKCl9aWYoKGx8MCk9PTY1KXtIPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX13PXkrKHcqMjR8MCl8MDtkb3tpZigoeXwwKSE9MCl7eD1jW3Y+PjJdfDA7aWYoKHh8MCk9PTApe2NbeSsxNj4+Ml09MDticmVha31pZigoeHwwKT09KGZ8MCkpe2NbeSsxNj4+Ml09eTttY1tjWyhjW2Y+PjJdfDApKzEyPj4yXSYxMjddKGYseSk7YnJlYWt9ZWxzZXtjW3krMTY+PjJdPXg7Y1t2Pj4yXT0wO2JyZWFrfX19d2hpbGUoMCk7eD15KzI0fDA7ej1jWzE1ODhdfDA7QT1jWzYzNTY+PjJdfDA7ZG97aWYoKEF8MCk9PSh6fDApKXtjWzE1ODhdPXk7Y1s2MzU2Pj4yXT14O2NbNjM2MD4+Ml09d31lbHNle2Rve0M9eTt5PXkrIC0yNHwwO0I9QSsgLTh8MDtBPUErIC0yNHwwO0Q9Y1tCPj4yXXwwO2Rve2lmKChEfDApIT0wKXtpZigoRHwwKT09KEF8MCkpe2NbQysgLTg+PjJdPXk7SD1jW0I+PjJdfDA7bWNbY1soY1tIPj4yXXwwKSsxMj4+Ml0mMTI3XShILHkpO2JyZWFrfWVsc2V7Y1tDKyAtOD4+Ml09RDtjW0I+PjJdPTA7YnJlYWt9fWVsc2V7Y1tDKyAtOD4+Ml09MH19d2hpbGUoMCl9d2hpbGUoKEF8MCkhPSh6fDApKTt6PWNbMTU4OF18MDtBPWNbNjM1Nj4+Ml18MDtjWzE1ODhdPXk7Y1s2MzU2Pj4yXT14O2NbNjM2MD4+Ml09dztpZigoQXwwKT09KHp8MCkpe2JyZWFrfWRve3c9Y1tBKyAtOD4+Ml18MDtBPUErIC0yNHwwO2Rve2lmKCh3fDApPT0oQXwwKSl7bGNbY1soY1t3Pj4yXXwwKSsxNj4+Ml0mMjU1XSh3KX1lbHNle2lmKCh3fDApPT0wKXticmVha31sY1tjWyhjW3c+PjJdfDApKzIwPj4yXSYyNTVdKHcpfX13aGlsZSgwKX13aGlsZSgoQXwwKSE9KHp8MCkpfX13aGlsZSgwKTtpZigoenwwKT09MCl7YnJlYWt9dm4oeil9fXdoaWxlKDApO3Y9Y1t2Pj4yXXwwO2lmKCh2fDApPT0oZnwwKSl7bGNbY1soY1tmPj4yXXwwKSsxNj4+Ml0mMjU1XShmKTticmVha31pZigodnwwKT09MCl7YnJlYWt9bGNbY1soY1t2Pj4yXXwwKSsyMD4+Ml0mMjU1XSh2KX19d2hpbGUoMCk7aWYoKENiKDYzNzYpfDApPT0wKXt0PWNbMTU4OF18MDtyPWNbNjM1Nj4+Ml18MDticmVha31XYSgxMDQ5NiwxMDUwNCw0NiwxMDU2MCl9ZWxzZXt0PXc7cj12fX13aGlsZSgwKTtiOmRve2lmKCh0fDApIT0ocnwwKSl7dj1zKzE2fDA7d2hpbGUoMSl7eD10KzE2fDA7dz1jW3g+PjJdfDA7aWYoKHd8MCk9PTApe2w9MTAxO2JyZWFrfWlmKCh3fDApPT0odHwwKSl7Y1t2Pj4yXT1zO3c9Y1t4Pj4yXXwwO21jW2NbKGNbdz4+Ml18MCkrMTI+PjJdJjEyN10odyxzKTt3PWNbdj4+Ml18MH1lbHNle3c9b2NbY1soY1t3Pj4yXXwwKSs4Pj4yXSYxMjddKHcpfDA7Y1t2Pj4yXT13fWlmKCh3fDApPT0wKXticmVha31tY1tjWyhjW3c+PjJdfDApKzI0Pj4yXSYxMjddKHcsdSk7dz1jW3Y+PjJdfDA7ZG97aWYoKHd8MCk9PShzfDApKXtsY1tjWyhjW3M+PjJdfDApKzE2Pj4yXSYyNTVdKHMpfWVsc2V7aWYoKHd8MCk9PTApe2JyZWFrfWxjW2NbKGNbdz4+Ml18MCkrMjA+PjJdJjI1NV0odyl9fXdoaWxlKDApO3Q9dCsyNHwwO2lmKCh0fDApPT0ocnwwKSl7YnJlYWsgYn19aWYoKGx8MCk9PTEwMSl7Y1t2Pj4yXT0wfUg9WGEoNCl8MDtjW0g+PjJdPTYzMzY7d2IoSHwwLDYzMTIsNzYpfX13aGlsZSgwKTtzPVNjKDgzNTIsNTMwNCl8MDtyPWNbcysoKGNbKGNbcz4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO3Q9cis0fDA7Y1t0Pj4yXT0oY1t0Pj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tmPj4yXT0xMzQ1NjtjW2YrND4+Ml09MjA4O2NbZis4Pj4yXT0wO2NnKDEzNDU2LGYpfXU9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3Y9Y1tyKzg+PjJdfDA7aWYoKGNbcisxMj4+Ml18MCktdj4+Mj4+PjA+dT4+PjA/KHE9Y1t2Kyh1PDwyKT4+Ml18MCwocXwwKSE9MCk6MCl7cT14Y1tjWyhjW3E+PjJdfDApKzI4Pj4yXSY2M10ocSwxMCl8MDtIPWNbdD4+Ml18MDtjW3Q+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW3I+PjJdfDApKzg+PjJdJjI1NV0ocil9bGgocyxxKTtZZyhzKTtyPWNbYj4+Ml18MDtxPWIrMTE0fDA7cT1kW3E+PjBdfGRbcSsxPj4wXTw8ODtIPWNbcis0Pj4yXXwwO0c9KChIfDApPDApPDwzMT4+MzE7aWYoMDwoR3wwKXwwPT0oR3wwKSYocSY2NTUzNSk+Pj4wPEg+Pj4wKXtjW3IrOD4+Ml09cSY2NTUzNX1lbHNle2FbcisxMj4+MF09MX1yPWIrMTIwfDA7Yzpkb3tpZigoZFtyPj4wXXxkW3IrMT4+MF08PDh8ZFtyKzI+PjBdPDwxNnxkW3IrMz4+MF08PDI0fDApIT0wKXt3PW8rMnwwO3U9bysxNnwwO3Q9bysxOHwwO3E9bysyMHwwO3g9Zis0fDA7dj1mKzh8MDtzPTA7d2hpbGUoMSl7Rz0oY1tiPj4yXXwwKSsxMnwwO0g9YVtHPj4wXXwwO2FbRz4+MF09MDtpZighKEg8PDI0Pj4yND09MCkpe2JyZWFrIGN9eT1jW2I+PjJdfDA7ej15KzEzfDA7aWYoKGFbej4+MF18MCkhPTApe2JyZWFrIGN9SD15KzR8MDtFPXkrOHwwO0c9Y1tFPj4yXXwwO0Y9KGNbSD4+Ml18MCktR3wwO0Y9KEZ8MCk8NTQ/Rjo1NDtNbihvfDAsKGNbeT4+Ml18MCkrR3wwLEZ8MCl8MDtHPShjW0U+PjJdfDApK0Z8MDtjW0U+PjJdPUc7Y1t5KzE2Pj4yXT1GO2lmKChHfDApPj0oY1tIPj4yXXwwKSl7YVt6Pj4wXT0xfXk9U2MoODM1Miw1ODcyKXwwO3o9Y1t5KygoY1soY1t5Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7QT16KzR8MDtjW0E+PjJdPShjW0E+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbeD4+Ml09MjA4O2Nbdj4+Ml09MDtjZygxMzQ1NixmKX1DPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtCPWNbeis4Pj4yXXwwO2lmKCEoKGNbeisxMj4+Ml18MCktQj4+Mj4+PjA+Qz4+PjApKXtsPTEzNjticmVha31CPWNbQisoQzw8Mik+PjJdfDA7aWYoKEJ8MCk9PTApe2w9MTM2O2JyZWFrfUI9eGNbY1soY1tCPj4yXXwwKSsyOD4+Ml0mNjNdKEIsMTApfDA7SD1jW0E+PjJdfDA7Y1tBPj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1t6Pj4yXXwwKSs4Pj4yXSYyNTVdKHopfWxoKHksQik7WWcoeSk7eT13O3o9NTg1Njt3aGlsZSgxKXtpZigoYVt5Pj4wXXwwKSE9KGFbej4+MF18MCkpe2JyZWFrfXk9eSsxfDA7aWYoKHl8MCk9PSh1fDApKXtsPTE0NDticmVha31lbHNle3o9eisxfDB9fWlmKChsfDApPT0xNDQ/KGw9MCwoZFt0Pj4wXXxkW3QrMT4+MF08PDgpPDwxNj4+MTY9PTIyMjA0KTowKXticmVha31BPWNbYj4+Ml18MDt5PUErOHwwO3o9Y1t5Pj4yXXwwO3o9SW4oenwwLCgoenwwKTwwKTw8MzE+PjMxfDAsKGRbcT4+MF18ZFtxKzE+PjBdPDw4KSY2NTUzNXwwLDApfDA7SD1JO0c9Y1tBKzQ+PjJdfDA7Rj0oKEd8MCk8MCk8PDMxPj4zMTtBPUErMTJ8MDtpZigoSHwwKT4oRnwwKXwoSHwwKT09KEZ8MCkmej4+PjA+PUc+Pj4wfChIfDApPDApe2FbQT4+MF09MX1lbHNle2FbQT4+MF09MDtjW3k+PjJdPXp9cz1zKzF8MDtpZighKHM+Pj4wPChkW3I+PjBdfGRbcisxPj4wXTw8OHxkW3IrMj4+MF08PDE2fGRbciszPj4wXTw8MjQpPj4+MCkpe2JyZWFrIGN9fWlmKChsfDApPT0xMzYpe0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfXI9U2MoODM1Miw1ODk2KXwwO3M9Y1tyKygoY1soY1tyPj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dD1zKzR8MDtjW3Q+PjJdPShjW3Q+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9dT0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7dj1jW3MrOD4+Ml18MDtkb3tpZigoY1tzKzEyPj4yXXwwKS12Pj4yPj4+MD51Pj4+MCl7dT1jW3YrKHU8PDIpPj4yXXwwO2lmKCh1fDApPT0wKXticmVha311PXhjW2NbKGNbdT4+Ml18MCkrMjg+PjJdJjYzXSh1LDEwKXwwO0g9Y1t0Pj4yXXwwO2NbdD4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbcz4+Ml18MCkrOD4+Ml0mMjU1XShzKX1saChyLHUpO1lnKHIpO3I9ZFtxPj4wXXxkW3ErMT4+MF08PDg7cT1yJjY1NTM1O3I9cjw8MTY+PjE2PT0wPzE6cTt3aGlsZSgxKXtzPXVuKHIpfDA7aWYoKHN8MCkhPTApe2JyZWFrfXM9Y1s1NjY2XXwwO2NbNTY2Nl09cyswO2lmKChzfDApPT0wKXtsPTE1ODticmVha31zY1tzJjMxXSgpfWlmKChsfDApPT0xNTgpe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfXQ9Y1tiPj4yXXwwO3I9dCsxM3wwO2Rve2lmKChhW3I+PjBdfDApPT0wKXtIPXQrNHwwO0U9dCs4fDA7Rz1jW0U+PjJdfDA7Rj0oY1tIPj4yXXwwKS1HfDA7Rj0oRnwwKTwocXwwKT9GOnE7TW4oc3wwLChjW3Q+PjJdfDApK0d8MCxGfDApfDA7Rz0oY1tFPj4yXXwwKStGfDA7Y1tFPj4yXT1HO2NbdCsxNj4+Ml09RjtpZigoR3wwKTwoY1tIPj4yXXwwKSl7YnJlYWt9YVtyPj4wXT0xfWVsc2V7YVt0KzEyPj4wXT0xfX13aGlsZSgwKTt0PXMrMzR8MDtxPWIrMjQ3fDA7TW4ocXwwLHN8MCwzNCl8MDtpZighKChkW3E+PjBdfGRbcSsxPj4wXTw8OCk8PDE2Pj4xNj09Mikpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11big2OCl8MDtpZigoYnwwKSE9MCl7bD0xNzE7YnJlYWt9Yj1jWzU2NjZdfDA7Y1s1NjY2XT1iKzA7aWYoKGJ8MCk9PTApe2JyZWFrfXNjW2ImMzFdKCl9aWYoKGx8MCk9PTE3MSl7Y1tiKzQ+PjJdPTU1O2NbYj4+Ml09NTU7Zj1iKzEyfDA7Y1tnKzQ+PjJdPWY7Y1tiKzg+PjJdPTA7Zj1mKzB8MDtiPTYyMDB8MDtlPWYrNTZ8MDtkb3thW2Y+PjBdPWFbYj4+MF18MDtmPWYrMXwwO2I9YisxfDB9d2hpbGUoKGZ8MCk8KGV8MCkpO2NbZz4+Ml09NjI2NDt3YihnfDAsNjA5Niw3NCl9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9cj1TYyg4MzUyLDYxMTIpfDA7cT1oaChyLGRbcT4+MF18ZFtxKzE+PjBdPDw4KXwwO3I9Y1txKygoY1soY1txPj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dT1yKzR8MDtjW3U+PjJdPShjW3U+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9dj0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7dz1jW3IrOD4+Ml18MDtkb3tpZigoY1tyKzEyPj4yXXwwKS13Pj4yPj4+MD52Pj4+MCl7dj1jW3crKHY8PDIpPj4yXXwwO2lmKCh2fDApPT0wKXticmVha312PXhjW2NbKGNbdj4+Ml18MCkrMjg+PjJdJjYzXSh2LDEwKXwwO0g9Y1t1Pj4yXXwwO2NbdT4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbcj4+Ml18MCkrOD4+Ml0mMjU1XShyKX1saChxLHYpO1lnKHEpO3Y9U2MoODM1Miw2MTI4KXwwO3E9YisyNzl8MDt2PWhoKHYsZFtxPj4wXXxkW3ErMT4+MF08PDgpfDA7cj1jW3YrKChjWyhjW3Y+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDt1PXIrNHwwO2NbdT4+Ml09KGNbdT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tmKzQ+PjJdPTIwODtjW2YrOD4+Ml09MDtjZygxMzQ1NixmKX13PShjWzEzNDYwPj4yXXwwKSsgLTF8MDt4PWNbcis4Pj4yXXwwO2Rve2lmKChjW3IrMTI+PjJdfDApLXg+PjI+Pj4wPnc+Pj4wKXt3PWNbeCsodzw8Mik+PjJdfDA7aWYoKHd8MCk9PTApe2JyZWFrfXc9eGNbY1soY1t3Pj4yXXwwKSsyOD4+Ml0mNjNdKHcsMTApfDA7SD1jW3U+PjJdfDA7Y1t1Pj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1tyPj4yXXwwKSs4Pj4yXSYyNTVdKHIpfWxoKHYsdyk7WWcodik7cj0oKGRbcT4+MF18ZFtxKzE+PjBdPDw4KSY2NTUzNSkqNnwwO3I9KHJ8MCk9PTA/MTpyO3doaWxlKDEpe3U9dW4ocil8MDtpZigodXwwKSE9MCl7YnJlYWt9dT1jWzU2NjZdfDA7Y1s1NjY2XT11KzA7aWYoKHV8MCk9PTApe2w9MTk0O2JyZWFrfXNjW3UmMzFdKCl9aWYoKGx8MCk9PTE5NCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9cj1iKzI4MXwwO2Fbcj4+MF09dTthW3IrMT4+MF09dT4+ODthW3IrMj4+MF09dT4+MTY7YVtyKzM+PjBdPXU+PjI0O3U9U2MoODM1Miw2MTQ0KXwwO3Y9Y1t1KygoY1soY1t1Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dz12KzR8MDtjW3c+PjJdPShjW3c+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9eD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7eT1jW3YrOD4+Ml18MDtkb3tpZigoY1t2KzEyPj4yXXwwKS15Pj4yPj4+MD54Pj4+MCl7eD1jW3krKHg8PDIpPj4yXXwwO2lmKCh4fDApPT0wKXticmVha314PXhjW2NbKGNbeD4+Ml18MCkrMjg+PjJdJjYzXSh4LDEwKXwwO0g9Y1t3Pj4yXXwwO2Nbdz4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbdj4+Ml18MCkrOD4+Ml0mMjU1XSh2KX1saCh1LHgpO1lnKHUpO2Q6ZG97aWYoISgoZFtxPj4wXXxkW3ErMT4+MF08PDgpPDwxNj4+MTY9PTApKXt2PWYrNHwwO3U9Zis4fDA7dz0wO3doaWxlKDEpe01uKChkW3I+PjBdfGRbcisxPj4wXTw8OHxkW3IrMj4+MF08PDE2fGRbciszPj4wXTw8MjQpKyh3KjZ8MCl8MCx0fDAsNil8MDt6PWloKFNjKDgzNTIsNjE3Nil8MCx3KXwwO3k9Y1t6KygoY1soY1t6Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7eD15KzR8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2Nbdj4+Ml09MjA4O2NbdT4+Ml09MDtjZygxMzQ1NixmKX1BPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtCPWNbeSs4Pj4yXXwwO2lmKCEoKGNbeSsxMj4+Ml18MCktQj4+Mj4+PjA+QT4+PjApKXticmVha31BPWNbQisoQTw8Mik+PjJdfDA7aWYoKEF8MCk9PTApe2JyZWFrfUE9eGNbY1soY1tBPj4yXXwwKSsyOD4+Ml0mNjNdKEEsMTApfDA7SD1jW3g+PjJdfDA7Y1t4Pj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1t5Pj4yXXwwKSs4Pj4yXSYyNTVdKHkpfWxoKHosQSk7WWcoeik7dz13KzF8MDtpZigod3wwKT49KChkW3E+PjBdfGRbcSsxPj4wXTw8OCkmNjU1MzV8MCkpe2JyZWFrIGR9ZWxzZXt0PXQrNnwwfX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7dm4ocyk7ZTpkb3tpZighKChkW3E+PjBdfGRbcSsxPj4wXTw8OCk8PDE2Pj4xNj09MCkpe3c9YiszMDR8MDt2PWIrMzA4fDA7eD1iKzMwMHwwO3U9Zis0fDA7dD1mKzh8MDtzPTA7Zjp3aGlsZSgxKXt5PVNjKDgzNTIsNTk2OCl8MDtBPWNbeSsoKGNbKGNbeT4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO3o9QSs0fDA7Y1t6Pj4yXT0oY1t6Pj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tmPj4yXT0xMzQ1NjtjW3U+PjJdPTIwODtjW3Q+PjJdPTA7Y2coMTM0NTYsZil9Qj0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7Qz1jW0ErOD4+Ml18MDtpZighKChjW0ErMTI+PjJdfDApLUM+PjI+Pj4wPkI+Pj4wKSl7bD0yMzQ7YnJlYWt9Qj1jW0MrKEI8PDIpPj4yXXwwO2lmKChCfDApPT0wKXtsPTIzNDticmVha31CPXhjW2NbKGNbQj4+Ml18MCkrMjg+PjJdJjYzXShCLDEwKXwwO0g9Y1t6Pj4yXXwwO2Nbej4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbQT4+Ml18MCkrOD4+Ml0mMjU1XShBKX1saCh5LEIpO1lnKHkpO0E9ZFtyPj4wXXxkW3IrMT4+MF08PDh8ZFtyKzI+PjBdPDwxNnxkW3IrMz4+MF08PDI0O3k9QSsocyo2fDApfDA7eT0oZFt5Pj4wXXxkW3krMT4+MF08PDgpJjY1NTM1O3o9QSsocyo2fDApKzJ8MDt6PShkW3o+PjBdfGRbeisxPj4wXTw8OCkmNjU1MzU7QT1BKyhzKjZ8MCkrNHwwO0E9KGRbQT4+MF18ZFtBKzE+PjBdPDw4KSY2NTUzNTtDPWNbdz4+Ml18MDtkb3tpZigoQ3wwKT09KGNbdj4+Ml18MCkpe0I9Y1t4Pj4yXXwwO0U9Qy1CfDA7Qz0oRXwwKS8xMnwwO0Q9QysxfDA7aWYoRD4+PjA+MzU3OTEzOTQxKXtsPTI0NDticmVhayBmfWlmKEM+Pj4wPDE3ODk1Njk3MCl7Rj1DPDwxO0Y9Rj4+PjA8RD4+PjA/RDpGO2lmKChGfDApPT0wKXtGPTA7Rz0wfWVsc2V7bD0yNDd9fWVsc2V7Rj0zNTc5MTM5NDE7bD0yNDd9aWYoKGx8MCk9PTI0Nyl7bD0wO0g9RioxMnwwO0g9KEh8MCk9PTA/MTpIO3doaWxlKDEpe0c9dW4oSCl8MDtpZigoR3wwKSE9MCl7YnJlYWt9Rz1jWzU2NjZdfDA7Y1s1NjY2XT1HKzA7aWYoKEd8MCk9PTApe2w9MjUxO2JyZWFrIGZ9c2NbRyYzMV0oKX19SD1HKyhDKjEyfDApfDA7aWYoKEh8MCkhPTApe2NbSD4+Ml09eTtjW0crKEMqMTJ8MCkrND4+Ml09ejtjW0crKEMqMTJ8MCkrOD4+Ml09QX1IPUcrKCgoKEV8MCkvLTEyfDApK0N8MCkqMTJ8MCl8MDtMbihIfDAsQnwwLEV8MCl8MDtjW3g+PjJdPUg7Y1t3Pj4yXT1HKyhEKjEyfDApO2Nbdj4+Ml09RysoRioxMnwwKTtpZigoQnwwKT09MCl7YnJlYWt9dm4oQil9ZWxzZXtpZigoQ3wwKT09MCl7eT0wfWVsc2V7Y1tDPj4yXT15O2NbQys0Pj4yXT16O2NbQys4Pj4yXT1BO3k9Y1t3Pj4yXXwwfWNbdz4+Ml09eSsxMn19d2hpbGUoMCk7cz1zKzF8MDtpZigoc3wwKT49KChkW3E+PjBdfGRbcSsxPj4wXTw8OCkmNjU1MzV8MCkpe2JyZWFrIGV9fWlmKChsfDApPT0yMzQpe0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfWVsc2UgaWYoKGx8MCk9PTI0NCl7VGsoKX1lbHNlIGlmKChsfDApPT0yNTEpe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfX19d2hpbGUoMCk7cz1TYyg4MzUyLDUzMjApfDA7cj1jW3MrKChjWyhjW3M+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtxPXIrNHwwO2NbcT4+Ml09KGNbcT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tmKzQ+PjJdPTIwODtjW2YrOD4+Ml09MDtjZygxMzQ1NixmKX11PShjWzEzNDYwPj4yXXwwKSsgLTF8MDt0PWNbcis4Pj4yXXwwO2Rve2lmKChjW3IrMTI+PjJdfDApLXQ+PjI+Pj4wPnU+Pj4wKXt0PWNbdCsodTw8Mik+PjJdfDA7aWYoKHR8MCk9PTApe2JyZWFrfXQ9eGNbY1soY1t0Pj4yXXwwKSsyOD4+Ml0mNjNdKHQsMTApfDA7SD1jW3E+PjJdfDA7Y1txPj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1tyPj4yXXwwKSs4Pj4yXSYyNTVdKHIpfWxoKHMsdCk7WWcocyk7cj1jW2I+PjJdfDA7cT1iKzExNnwwO3M9ZFtxPj4wXXxkW3ErMT4+MF08PDh8ZFtxKzI+PjBdPDwxNnxkW3ErMz4+MF08PDI0O0g9Y1tyKzQ+PjJdfDA7Rz0oKEh8MCk8MCk8PDMxPj4zMTtpZigwPChHfDApfDA9PShHfDApJnM+Pj4wPEg+Pj4wKXtjW3IrOD4+Ml09c31lbHNle2FbcisxMj4+MF09MX1zPW87Y1tzPj4yXT0wO2Nbcys0Pj4yXT0wO3M9Y1tiPj4yXXwwO3I9cysxM3wwO2Rve2lmKChhW3I+PjBdfDApPT0wKXtIPWNbcys0Pj4yXXwwO0U9cys4fDA7Rz1jW0U+PjJdfDA7Rj1ILUd8MDtGPShGfDApPDg/Rjo4O0xuKG98MCwoY1tzPj4yXXwwKStHfDAsRnwwKXwwO0c9RytGfDA7Y1tFPj4yXT1HO2NbcysxNj4+Ml09RjtpZigoR3wwKTwoSHwwKSl7YnJlYWt9YVtyPj4wXT0xfWVsc2V7YVtzKzEyPj4wXT0xfX13aGlsZSgwKTtHPShjW2I+PjJdfDApKzEyfDA7SD1hW0c+PjBdfDA7YVtHPj4wXT0wO2lmKCEoSDw8MjQ+PjI0PT0wKSl7Zz1YYSg4KXwwO2NbZz4+Ml09OTkyODt3aGlsZSgxKXtiPXVuKDU2KXwwO2lmKChifDApIT0wKXtsPTI4MjticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MjgyKXtjW2IrND4+Ml09NDM7Y1tiPj4yXT00MztmPWIrMTJ8MDtjW2crND4+Ml09ZjtjW2IrOD4+Ml09MDtmPWYrMHwwO2I9NTc4NHwwO2U9Zis0NHwwO2Rve2FbZj4+MF09YVtiPj4wXXwwO2Y9ZisxfDA7Yj1iKzF8MH13aGlsZSgoZnwwKTwoZXwwKSk7Y1tnPj4yXT01ODQwO3diKGd8MCw1Mzg0LDcwKX1IPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX1zPWNbbz4+Ml18MDtvPWNbbys0Pj4yXXwwO2lmKChzfDApPT0tMSYob3wwKT09LTEpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11big2Nyl8MDtpZigoYnwwKSE9MCl7bD0yOTA7YnJlYWt9Yj1jWzU2NjZdfDA7Y1s1NjY2XT1iKzA7aWYoKGJ8MCk9PTApe2JyZWFrfXNjW2ImMzFdKCl9aWYoKGx8MCk9PTI5MCl7Y1tiKzQ+PjJdPTU0O2NbYj4+Ml09NTQ7Zj1iKzEyfDA7Y1tnKzQ+PjJdPWY7Y1tiKzg+PjJdPTA7Zj1mKzB8MDtiPTU0MDB8MDtlPWYrNTV8MDtkb3thW2Y+PjBdPWFbYj4+MF18MDtmPWYrMXwwO2I9YisxfDB9d2hpbGUoKGZ8MCk8KGV8MCkpO2NbZz4+Ml09NTc2ODt3YihnfDAsNTQ4OCw2OCl9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9cj1jW2I+PjJdfDA7SD1jW3IrND4+Ml18MDtHPSgoSHwwKTwwKTw8MzE+PjMxO2lmKChvfDApPChHfDApfChvfDApPT0oR3wwKSZzPj4+MDxIPj4+MCl7Y1tyKzg+PjJdPXN9ZWxzZXthW3IrMTI+PjBdPTF9Rz0oY1tiPj4yXXwwKSsxMnwwO0g9YVtHPj4wXXwwO2FbRz4+MF09MDtpZighKEg8PDI0Pj4yND09MCkpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11big1Nil8MDtpZigoYnwwKSE9MCl7bD0zMDE7YnJlYWt9Yj1jWzU2NjZdfDA7Y1s1NjY2XT1iKzA7aWYoKGJ8MCk9PTApe2JyZWFrfXNjW2ImMzFdKCl9aWYoKGx8MCk9PTMwMSl7Y1tiKzQ+PjJdPTQzO2NbYj4+Ml09NDM7Zj1iKzEyfDA7Y1tnKzQ+PjJdPWY7Y1tiKzg+PjJdPTA7Zj1mKzB8MDtiPTU3ODR8MDtlPWYrNDR8MDtkb3thW2Y+PjBdPWFbYj4+MF18MDtmPWYrMXwwO2I9YisxfDB9d2hpbGUoKGZ8MCk8KGV8MCkpO2NbZz4+Ml09NTg0MDt3YihnfDAsNTM4NCw3MCl9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9bz1jW2I+PjJdfDA7cj1vKzEzfDA7ZG97aWYoKGFbcj4+MF18MCk9PTApe0g9Y1tvKzQ+PjJdfDA7RT1vKzh8MDtHPWNbRT4+Ml18MDtGPUgtR3wwO0Y9KEZ8MCk8OD9GOjg7TG4obnwwLChjW28+PjJdfDApK0d8MCxGfDApfDA7Rz1HK0Z8MDtjW0U+PjJdPUc7Y1tvKzE2Pj4yXT1GO2lmKChHfDApPChIfDApKXticmVha31hW3I+PjBdPTF9ZWxzZXthW28rMTI+PjBdPTF9fXdoaWxlKDApO0c9KGNbYj4+Ml18MCkrMTJ8MDtIPWFbRz4+MF18MDthW0c+PjBdPTA7aWYoIShIPDwyND4+MjQ9PTApKXtnPVhhKDgpfDA7Y1tnPj4yXT05OTI4O3doaWxlKDEpe2I9dW4oNTYpfDA7aWYoKGJ8MCkhPTApe2w9MzEzO2JyZWFrfWI9Y1s1NjY2XXwwO2NbNTY2Nl09YiswO2lmKChifDApPT0wKXticmVha31zY1tiJjMxXSgpfWlmKChsfDApPT0zMTMpe2NbYis0Pj4yXT00MztjW2I+PjJdPTQzO2Y9YisxMnwwO2NbZys0Pj4yXT1mO2NbYis4Pj4yXT0wO2Y9ZiswfDA7Yj01Nzg0fDA7ZT1mKzQ0fDA7ZG97YVtmPj4wXT1hW2I+PjBdfDA7Zj1mKzF8MDtiPWIrMXwwfXdoaWxlKChmfDApPChlfDApKTtjW2c+PjJdPTU4NDA7d2IoZ3wwLDUzODQsNzApfUg9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfWlmKChjW24+PjJdfDApIT0wKXtnPVhhKDgpfDA7Y1tnPj4yXT05OTI4O3doaWxlKDEpe2I9dW4oNTQpfDA7aWYoKGJ8MCkhPTApe2w9MzIxO2JyZWFrfWI9Y1s1NjY2XXwwO2NbNTY2Nl09YiswO2lmKChifDApPT0wKXticmVha31zY1tiJjMxXSgpfWlmKChsfDApPT0zMjEpe2NbYis0Pj4yXT00MTtjW2I+PjJdPTQxO2Y9YisxMnwwO2NbZys0Pj4yXT1mO2NbYis4Pj4yXT0wO2Y9ZiswfDA7Yj01Njg4fDA7ZT1mKzQyfDA7ZG97YVtmPj4wXT1hW2I+PjBdfDA7Zj1mKzF8MDtiPWIrMXwwfXdoaWxlKChmfDApPChlfDApKTtjW2c+PjJdPTU3NDQ7d2IoZ3wwLDU1NDQsNjYpfUg9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfW89YisyODh8MDtzPWNbbz4+Ml18MDtyPWIrMjkyfDA7dD1jW3I+PjJdfDA7aWYoKHR8MCk9PShzfDApKXt3PXN9ZWxzZXt3PXQrKH4oKHQrIC04KygwLXMpfDApPj4+Myk8PDMpfDA7Y1tyPj4yXT13fUg9YisyNTl8MDtpZigoZFtIPj4wXXxkW0grMT4+MF08PDh8ZFtIKzI+PjBdPDwxNnxkW0grMz4+MF08PDI0fDApPT0tMSl7Zz1YYSg4KXwwO2NbZz4+Ml09OTkyODt3aGlsZSgxKXtiPXVuKDk2KXwwO2lmKChifDApIT0wKXtsPTMzMTticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MzMxKXtjW2IrND4+Ml09ODM7Y1tiPj4yXT04MztmPWIrMTJ8MDtjW2crND4+Ml09ZjtjW2IrOD4+Ml09MDtmPWYrMHwwO2I9NTU2MHwwO2U9Zis4NHwwO2Rve2FbZj4+MF09YVtiPj4wXXwwO2Y9ZisxfDA7Yj1iKzF8MH13aGlsZSgoZnwwKTwoZXwwKSk7Y1tnPj4yXT01NzY4O3diKGd8MCw1NDg4LDY4KX1IPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX12PW4rNHwwO249Y1t2Pj4yXXwwO3U9bisxfDA7ej1zO3Q9dy16Pj4zO2Rve2lmKHQ+Pj4wPHU+Pj4wKXt1PXUtdHwwO3Q9YisyOTZ8MDtBPWNbdD4+Ml18MDt4PXc7aWYoIShBLXg+PjM+Pj4wPHU+Pj4wKSl7dD11O2w9dzt3aGlsZSgxKXtpZigobHwwKSE9MCl7SD1sO2NbSD4+Ml09MDtjW0grND4+Ml09MH10PXQrIC0xfDA7aWYoKHR8MCk9PTApe2JyZWFrfWVsc2V7bD1sKzh8MH19Y1tyPj4yXT13Kyh1PDwzKTticmVha314PXgtenwwO3k9eD4+Mzt3PXkrdXwwO2lmKHc+Pj4wPjUzNjg3MDkxMSl7VGsoKX16PUEtenwwO2lmKHo+PjM+Pj4wPDI2ODQzNTQ1NSl7ej16Pj4yO3o9ej4+PjA8dz4+PjA/dzp6O2lmKCh6fDApPT0wKXt6PTA7Qj0wfWVsc2V7bD0zNDJ9fWVsc2V7ej01MzY4NzA5MTE7bD0zNDJ9ZG97aWYoKGx8MCk9PTM0Mil7QT16PDwzO0E9KEF8MCk9PTA/MTpBO3doaWxlKDEpe0I9dW4oQSl8MDtpZigoQnwwKSE9MCl7bD0zNDg7YnJlYWt9Qj1jWzU2NjZdfDA7Y1s1NjY2XT1CKzA7aWYoKEJ8MCk9PTApe2JyZWFrfXNjW0ImMzFdKCl9aWYoKGx8MCk9PTM0OCl7YnJlYWt9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2w9QisoeTw8Myl8MDt3aGlsZSgxKXtpZigobHwwKSE9MCl7SD1sO2NbSD4+Ml09MDtjW0grND4+Ml09MH11PXUrIC0xfDA7aWYoKHV8MCk9PTApe2JyZWFrfWVsc2V7bD1sKzh8MH19TG4oQnwwLHN8MCx4fDApfDA7Y1tvPj4yXT1CO2Nbcj4+Ml09Qisodzw8Myk7Y1t0Pj4yXT1CKyh6PDwzKTtpZigoc3wwKT09MCl7cz1CO2JyZWFrfXZuKHMpO3M9Y1tvPj4yXXwwfWVsc2V7aWYoISh0Pj4+MD51Pj4+MCkpe2JyZWFrfWw9cysodTw8Myl8MDtpZigod3wwKT09KGx8MCkpe2JyZWFrfWNbcj4+Ml09dysofigodysgLTgrKDAtbCl8MCk+Pj4zKTw8Myl9fXdoaWxlKDApO2w9ZFtxPj4wXXxkW3ErMT4+MF08PDh8ZFtxKzI+PjBdPDwxNnxkW3ErMz4+MF08PDI0O0g9cztjW0g+PjJdPWwrODtjW0grND4+Ml09MDtnOmRve2lmKG4+Pj4wPjEpe2NbbT4+Ml09Y1tiPj4yXTtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtsPW0rMTJ8MDtzPXVuKDEwNDg2NDQpfDA7eT1zKzY4Ji02NDtjW3krIC00Pj4yXT1zO2NbbD4+Ml09eTtjW2o+PjJdPW07eT1qKzR8MDtjW3k+PjJdPTA7Y1tqKzg+PjJdPS0xO2NbZys0Pj4yXT0zMjtjW2crOD4+Ml09MjtjW2crMTI+PjJdPTg7Y1tnKzE2Pj4yXT0wO3M9ZyszNnwwO2Nbcz4+Ml09MDtuPWcrNDB8MDtjW24+PjJdPTA7Y1tnKzQ0Pj4yXT0wO2NbZys2MD4+Ml09MTtjW2crNjQ+PjJdPTI7Y1tnKzU2Pj4yXT00MDk2O2NbZys1Mj4+Ml09NDtjW2crNDg+PjJdPTQ7dT1nKzY4fDA7Y1t1Pj4yXT0wO3Q9Zys3MnwwO2NbdD4+Ml09MDtjW2crNzY+PjJdPTA7Y1tnKzIwPj4yXT0zMjt3PWcrMjR8MDtjW3c+PjJdPTA7Y1tnKzI4Pj4yXT0tMjE0NzQ4MzY0ODtjW2crMzI+PjJdPTIxNDc0ODM2NDc7Y1tnPj4yXT0wO0g9bWQobSl8MDtHPW1kKG0pfDA7eD1tZChtKXwwO2NbeT4+Ml09KEcmMjU1KTw8MTZ8KEgmMjU1KTw8MjR8KHgmMjU1KTw8OHwobWQobSl8MCkmMjU1O3RkKGcpO3k9U2MoODM1Miw1NjQ4KXwwO209Y1t2Pj4yXXwwO3k9amgoeSxtKXwwO3g9Y1t5KygoY1soY1t5Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dj14KzR8MDtjW3Y+PjJdPShjW3Y+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9QT0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7ej1jW3grOD4+Ml18MDtkb3tpZigoY1t4KzEyPj4yXXwwKS16Pj4yPj4+MD5BPj4+MCl7ej1jW3orKEE8PDIpPj4yXXwwO2lmKCh6fDApPT0wKXticmVha316PXhjW2NbKGNbej4+Ml18MCkrMjg+PjJdJjYzXSh6LDEwKXwwO0g9Y1t2Pj4yXXwwO2Nbdj4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbeD4+Ml18MCkrOD4+Ml0mMjU1XSh4KX1saCh5LHopO1lnKHkpO2g6ZG97aWYoKG18MCkhPTApe3g9Zis0fDA7dj1mKzh8MDt5PTE7d2hpbGUoMSl7aWYoeT4+PjA+MSl7ej1jWyhjW28+PjJdfDApKyh5KyAtMTw8Myk+PjJdfDB9ZWxzZXt6PTB9QT0ocmQoZyxqLChjW3M+PjJdfDApKzQ0fDApfDApK3p8MDt6PWNbdz4+Ml18MDtpZigoQXwwKTwwKXt6PXorQXwwfWVsc2V7ej1BLShBPj4+MDx6Pj4+MD8wOnopfDB9QT0oY1tvPj4yXXwwKSsoeTw8Myl8MDtjW0E+PjJdPXo7Y1tBKzQ+PjJdPSgoenwwKTwwKTw8MzE+PjMxO0E9U2MoamgoU2MoODM1Miw1NjcyKXwwLHkpfDAsNTY4MCl8MDt6PShjW28+PjJdfDApKyh5PDwzKXwwO3o9a2goQSxjW3o+PjJdfDAsY1t6KzQ+PjJdfDApfDA7QT1jW3orKChjWyhjW3o+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtCPUErNHwwO2NbQj4+Ml09KGNbQj4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1t4Pj4yXT0yMDg7Y1t2Pj4yXT0wO2NnKDEzNDU2LGYpfUM9KGNbMTM0NjA+PjJdfDApKyAtMXwwO0Q9Y1tBKzg+PjJdfDA7aWYoISgoY1tBKzEyPj4yXXwwKS1EPj4yPj4+MD5DPj4+MCkpe2JyZWFrfUM9Y1tEKyhDPDwyKT4+Ml18MDtpZigoQ3wwKT09MCl7YnJlYWt9Qz14Y1tjWyhjW0M+PjJdfDApKzI4Pj4yXSY2M10oQywxMCl8MDtIPWNbQj4+Ml18MDtjW0I+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW0E+PjJdfDApKzg+PjJdJjI1NV0oQSl9bGgoeixDKTtZZyh6KTt5PXkrMXwwO2lmKHk+Pj4wPm0+Pj4wKXticmVhayBofX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7dj1jW28+PjJdfDA7aTpkb3tpZigoY1tyPj4yXXwwKS12Pj4zPj4+MD4xKXtqPWYrNHwwO2c9Zis4fDA7bT0xO3doaWxlKDEpe3c9disobSsgLTE8PDMpfDA7dj12KyhtPDwzKXwwO3g9djt3PUluKGNbeD4+Ml18MCxjW3grND4+Ml18MCxjW3c+PjJdfDAsY1t3KzQ+PjJdfDApfDA7Y1t2Pj4yXT13O2Nbdis0Pj4yXT1JO3Y9U2MoamgoU2MoODM1Miw1NjcyKXwwLG0pfDAsNTY4MCl8MDt3PShjW28+PjJdfDApKyhtPDwzKXwwO3c9a2godixjW3c+PjJdfDAsY1t3KzQ+PjJdfDApfDA7dj1jW3crKChjWyhjW3c+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDt4PXYrNHwwO2NbeD4+Ml09KGNbeD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tqPj4yXT0yMDg7Y1tnPj4yXT0wO2NnKDEzNDU2LGYpfXo9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3k9Y1t2Kzg+PjJdfDA7aWYoISgoY1t2KzEyPj4yXXwwKS15Pj4yPj4+MD56Pj4+MCkpe2JyZWFrfXk9Y1t5Kyh6PDwyKT4+Ml18MDtpZigoeXwwKT09MCl7YnJlYWt9eT14Y1tjWyhjW3k+PjJdfDApKzI4Pj4yXSY2M10oeSwxMCl8MDtIPWNbeD4+Ml18MDtjW3g+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW3Y+PjJdfDApKzg+PjJdJjI1NV0odil9bGgodyx5KTtZZyh3KTttPW0rMXwwO3Y9Y1tvPj4yXXwwO2lmKCEobT4+PjA8KGNbcj4+Ml18MCktdj4+Mz4+PjApKXticmVhayBpfX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Zj1jW3U+PjJdfDA7ZG97aWYoKGZ8MCkhPTApe2c9Y1t0Pj4yXXwwO2lmKChnfDApIT0oZnwwKSl7ZG97Y1t0Pj4yXT1nKyAtNDQ7aj1jW2crIC0zNj4+Ml18MDtpZigoanwwKSE9MCl7dm4oY1tqKyAtND4+Ml18MCl9aj1jW2crIC0zMj4+Ml18MDtpZigoanwwKSE9MCl7dm4oY1tqKyAtND4+Ml18MCl9Zz1jW2crIC0yOD4+Ml18MDtpZigoZ3wwKSE9MCl7dm4oY1tnKyAtND4+Ml18MCl9Zz1jW3Q+PjJdfDB9d2hpbGUoKGd8MCkhPShmfDApKTtmPWNbdT4+Ml18MDtpZigoZnwwKT09MCl7YnJlYWt9fXZuKGYpfX13aGlsZSgwKTtmPWNbcz4+Ml18MDtkb3tpZigoZnwwKSE9MCl7Zz1jW24+PjJdfDA7aWYoKGd8MCkhPShmfDApKXtkb3tjW24+PjJdPWcrIC00NDtqPWNbZysgLTM2Pj4yXXwwO2lmKChqfDApIT0wKXt2bihjW2orIC00Pj4yXXwwKX1qPWNbZysgLTMyPj4yXXwwO2lmKChqfDApIT0wKXt2bihjW2orIC00Pj4yXXwwKX1nPWNbZysgLTI4Pj4yXXwwO2lmKChnfDApIT0wKXt2bihjW2crIC00Pj4yXXwwKX1nPWNbbj4+Ml18MH13aGlsZSgoZ3wwKSE9KGZ8MCkpO2Y9Y1tzPj4yXXwwO2lmKChmfDApPT0wKXticmVha319dm4oZil9fXdoaWxlKDApO3ZuKGNbKGNbbD4+Ml18MCkrIC00Pj4yXXwwKTtsPWRbcT4+MF18ZFtxKzE+PjBdPDw4fGRbcSsyPj4wXTw8MTZ8ZFtxKzM+PjBdPDwyNDticmVhayBnfX13aGlsZSgwKTtIPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Zj1jW2I+PjJdfDA7YVtmKzEyPj4wXT0wO2FbZisxMz4+MF09MDtmPWNbYj4+Ml18MDtnPWwrOHwwO0g9Y1tmKzQ+PjJdfDA7Rz0oKEh8MCk8MCk8PDMxPj4zMTtpZigwPChHfDApfDA9PShHfDApJmc+Pj4wPEg+Pj4wKXtjW2YrOD4+Ml09ZztIPWIrMTJ8MDtjW0g+PjJdPTA7SD1iKzh8MDtjW0g+PjJdPTA7aT1lO3JldHVybn1lbHNle2FbZisxMj4+MF09MTtIPWIrMTJ8MDtjW0g+PjJdPTA7SD1iKzh8MDtjW0g+PjJdPTA7aT1lO3JldHVybn19fXdoaWxlKDApO0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtIPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7SD1YYSg0KXwwO2NbSD4+Ml09MjEzMDQ7d2IoSHwwLDIxMzc2LDE5Nil9fXdoaWxlKDApO0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtIPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Zz1YYSg4KXwwO2NbZz4+Ml09OTkyODt3aGlsZSgxKXtiPXVuKDU2KXwwO2lmKChifDApIT0wKXtsPTIyOTticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MjI5KXtjW2IrND4+Ml09NDM7Y1tiPj4yXT00MztmPWIrMTJ8MDtjW2crND4+Ml09ZjtjW2IrOD4+Ml09MDtmPWYrMHwwO2I9NTk4NHwwO2U9Zis0NHwwO2Rve2FbZj4+MF09YVtiPj4wXXwwO2Y9ZisxfDA7Yj1iKzF8MH13aGlsZSgoZnwwKTwoZXwwKSk7Y1tnPj4yXT02MDQwO3diKGd8MCw1OTUyLDcyKX1IPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBwZShhKXthPWF8MDt2YXIgYj0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7Yj1pO2k9aSsxNnwwO2Y9YjtnPVNjKDgzNTIsNTE5Mil8MDtoPWNbZysoKGNbKGNbZz4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO2o9aCs0fDA7Y1tqPj4yXT0oY1tqPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tmPj4yXT0xMzQ1NjtjW2YrND4+Ml09MjA4O2NbZis4Pj4yXT0wO2NnKDEzNDU2LGYpfWw9KGNbMTM0NjA+PjJdfDApKyAtMXwwO209Y1toKzg+PjJdfDA7aWYoKGNbaCsxMj4+Ml18MCktbT4+Mj4+PjA+bD4+PjA/KGs9Y1ttKyhsPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7az14Y1tjWyhjW2s+PjJdfDApKzI4Pj4yXSY2M10oaywxMCl8MDttPWNbaj4+Ml18MDtjW2o+PjJdPW0rIC0xO2lmKChtfDApPT0wKXtsY1tjWyhjW2g+PjJdfDApKzg+PjJdJjI1NV0oaCl9bGgoZyxrKTtZZyhnKTtnPWErMzR8MDtnPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNDtpZigoZ3wwKSE9MCl7dm4oZyl9Zz1TYyg4MzUyLDUyMDgpfDA7aD1jW2crKChjWyhjW2c+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtqPWgrNHwwO2Nbaj4+Ml09KGNbaj4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tmKzQ+PjJdPTIwODtjW2YrOD4+Ml09MDtjZygxMzQ1NixmKX1mPShjWzEzNDYwPj4yXXwwKSsgLTF8MDthPWNbaCs4Pj4yXXwwO2lmKChjW2grMTI+PjJdfDApLWE+PjI+Pj4wPmY+Pj4wPyhlPWNbYSsoZjw8Mik+PjJdfDAsKGV8MCkhPTApOjApe2U9eGNbY1soY1tlPj4yXXwwKSsyOD4+Ml0mNjNdKGUsMTApfDA7bT1jW2o+PjJdfDA7Y1tqPj4yXT1tKyAtMTtpZigobXwwKT09MCl7bGNbY1soY1toPj4yXXwwKSs4Pj4yXSYyNTVdKGgpfWxoKGcsZSk7WWcoZyk7aT1iO3JldHVybn1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBxZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gcmUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHNlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiB0ZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gdWUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApfVJiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiB2ZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHdlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24geGUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHllKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gemUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEFlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gQmUoYSl7YT1hfDA7dmFyIGI9MDtiPWk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIENlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1JiKGF8MCk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gRGUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTA7Yj1pO2Q9Y1thPj4yXXwwO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufWU9YSs0fDA7Zj1jW2U+PjJdfDA7aWYoKGZ8MCkhPShkfDApKXtkb3tnPWYrIC0yNHwwO2NbZT4+Ml09ZztmPWNbZisgLTg+PjJdfDA7aWYoKGZ8MCkhPShnfDApKXtpZigoZnwwKSE9MCl7bGNbY1soY1tmPj4yXXwwKSsyMD4+Ml0mMjU1XShmKX19ZWxzZXtsY1tjWyhjW2Y+PjJdfDApKzE2Pj4yXSYyNTVdKGYpfWY9Y1tlPj4yXXwwfXdoaWxlKChmfDApIT0oZHwwKSk7ZD1jW2E+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59fXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gRWUoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEZlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEdlKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2E9aTt3aGlsZSgxKXtkPXVuKDgpfDA7aWYoKGR8MCkhPTApe2I9NzticmVha31kPWNbNTY2Nl18MDtjWzU2NjZdPWQrMDtpZigoZHwwKT09MCl7YnJlYWt9c2NbZCYzMV0oKX1pZigoYnwwKT09Nyl7Y1tkPj4yXT02NDE2O2k9YTtyZXR1cm4gZHwwfWQ9WGEoNCl8MDtjW2Q+PjJdPTIyNjgwO3diKGR8MCwyMjcyOCwyMDYpO3JldHVybiAwfWZ1bmN0aW9uIEhlKGEsYil7YT1hfDA7Yj1ifDA7aWYoKGJ8MCkhPTApe2NbYj4+Ml09NjQxNn1yZXR1cm59ZnVuY3Rpb24gSWUoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEplKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEtlKGIsZSl7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MDtiPWk7aj1lKzEwNHwwO2c9ZFtqPj4wXXwwO2U9Zz4+Pjc7aD1nPj4+NiYxO2lmKCEoKGV8MCkhPTF8KGh8MCk9PTApKXtiPVhhKDgpfDA7Y1tiPj4yXT05OTI4O3doaWxlKDEpe2U9dW4oODApfDA7aWYoKGV8MCkhPTApe2Y9ODticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7YnJlYWt9c2NbZSYzMV0oKX1pZigoZnwwKT09OCl7Y1tlKzQ+PjJdPTY3O2NbZT4+Ml09Njc7Zz1lKzEyfDA7Y1tiKzQ+PjJdPWc7Y1tlKzg+PjJdPTA7Zz1nKzB8MDtlPTY5NjB8MDtmPWcrNjh8MDtkb3thW2c+PjBdPWFbZT4+MF18MDtnPWcrMXwwO2U9ZSsxfDB9d2hpbGUoKGd8MCk8KGZ8MCkpO2NbYj4+Ml09NzA0MDt3YihifDAsNjgzMiw4NCl9aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9aWYoKGV8MCkhPShofDApKXthW2o+PjBdPWcmNjM7aT1iO3JldHVybn1iPVhhKDgpfDA7Y1tiPj4yXT05OTI4O3doaWxlKDEpe2U9dW4oNTEpfDA7aWYoKGV8MCkhPTApe2Y9MTY7YnJlYWt9ZT1jWzU2NjZdfDA7Y1s1NjY2XT1lKzA7aWYoKGV8MCk9PTApe2JyZWFrfXNjW2UmMzFdKCl9aWYoKGZ8MCk9PTE2KXtjW2UrND4+Ml09Mzg7Y1tlPj4yXT0zODtnPWUrMTJ8MDtjW2IrND4+Ml09ZztjW2UrOD4+Ml09MDtnPWcrMHwwO2U9Njg5NnwwO2Y9ZyszOXwwO2Rve2FbZz4+MF09YVtlPj4wXXwwO2c9ZysxfDA7ZT1lKzF8MH13aGlsZSgoZ3wwKTwoZnwwKSk7Y1tiPj4yXT02OTQ0O3diKGJ8MCw2ODgwLDgyKX1qPVhhKDQpfDA7Y1tqPj4yXT0yMjY4MDt3YihqfDAsMjI3MjgsMjA2KX1mdW5jdGlvbiBMZShhLGIpe2E9YXwwO2I9YnwwO3JldHVybigoY1tiKzQ+PjJdfDApPT02Njg4P2ErNHwwOjApfDB9ZnVuY3Rpb24gTWUoYSl7YT1hfDA7cmV0dXJuIDY3ODR9ZnVuY3Rpb24gTmUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIE9lKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBQZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFFlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gUmUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApfVJiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBTZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wO2I9aTtpPWkrMTZ8MDtoPWI7ZD1TYyg4MzUyLDcxMDQpfDA7ZT1jW2QrKChjWyhjW2Q+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtmPWUrNHwwO2NbZj4+Ml09KGNbZj4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbaD4+Ml09MTM0NTY7Y1toKzQ+PjJdPTIwODtjW2grOD4+Ml09MDtjZygxMzQ1NixoKX1oPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtqPWNbZSs4Pj4yXXwwO2lmKChjW2UrMTI+PjJdfDApLWo+PjI+Pj4wPmg+Pj4wPyhnPWNbaisoaDw8Mik+PjJdfDAsKGd8MCkhPTApOjApe2c9eGNbY1soY1tnPj4yXXwwKSsyOD4+Ml0mNjNdKGcsMTApfDA7aj1jW2Y+PjJdfDA7Y1tmPj4yXT1qKyAtMTtpZigoanwwKT09MCl7bGNbY1soY1tlPj4yXXwwKSs4Pj4yXSYyNTVdKGUpfWxoKGQsZyk7WWcoZCk7ZD1jW2ErMzI0Pj4yXXwwO2lmKCgoZHwwKSE9MD8oaD1kKzR8MCxqPWNbaD4+Ml18MCxjW2g+PjJdPWorIC0xLChqfDApPT0wKTowKT8obGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpLGg9ZCs4fDAsaj1jW2g+PjJdfDAsY1toPj4yXT1qKyAtMSwoanwwKT09MCk6MCl7bGNbY1soY1tkPj4yXXwwKSsxNj4+Ml0mMjU1XShkKX1kPWNbYSszMTY+PjJdfDA7aWYoKChkfDApIT0wPyhoPWQrNHwwLGo9Y1toPj4yXXwwLGNbaD4+Ml09aisgLTEsKGp8MCk9PTApOjApPyhsY1tjWyhjW2Q+PjJdfDApKzg+PjJdJjI1NV0oZCksaD1kKzh8MCxqPWNbaD4+Ml18MCxjW2g+PjJdPWorIC0xLChqfDApPT0wKTowKXtsY1tjWyhjW2Q+PjJdfDApKzE2Pj4yXSYyNTVdKGQpfWQ9Y1thKzMwMD4+Ml18MDtpZigoZHwwKSE9MCl7ZT1hKzMwNHwwO2Y9Y1tlPj4yXXwwO2lmKChmfDApIT0oZHwwKSl7Y1tlPj4yXT1mKyh+KCgoZisgLTEyKygwLWQpfDApPj4+MCkvMTJ8MCkqMTJ8MCl9dm4oZCl9ZD1jW2ErMjg4Pj4yXXwwO2lmKChkfDApPT0wKXtqPWErMjQ3fDA7cGUoaik7aj1hKzE2fDA7aj1jW2o+PjJdfDA7aj1qKyAtNHwwO2o9Y1tqPj4yXXwwO3ZuKGopO2k9YjtyZXR1cm59ZT1hKzI5MnwwO2Y9Y1tlPj4yXXwwO2lmKChmfDApIT0oZHwwKSl7Y1tlPj4yXT1mKyh+KChmKyAtOCsoMC1kKXwwKT4+PjMpPDwzKX12bihkKTtqPWErMjQ3fDA7cGUoaik7aj1hKzE2fDA7aj1jW2o+PjJdfDA7aj1qKyAtNHwwO2o9Y1tqPj4yXXwwO3ZuKGopO2k9YjtyZXR1cm59aj1YYSg0KXwwO2Nbaj4+Ml09MjEzMDQ7d2IoanwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gVGUoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFVlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFZlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2E9Y1thKzEyPj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufVNlKGEpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gV2UoYSxiKXthPWF8MDtiPWJ8MDtpZigoY1tiKzQ+PjJdfDApPT03MzEyKXthPWErMTJ8MH1lbHNle2E9MH1yZXR1cm4gYXwwfWZ1bmN0aW9uIFhlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFllKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBaZShhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBfZShhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSsxMj4+Ml18MDtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiAkZShhLGIpe2E9YXwwO2I9YnwwO2lmKChjW2IrND4+Ml18MCk9PTc1NjApe2E9YSsxMnwwfWVsc2V7YT0wfXJldHVybiBhfDB9ZnVuY3Rpb24gYWYoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gYmYoKXt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MDtiPWk7aT1pKzMyfDA7ZD1iO0hiKDcyLDk2LDE3NiwwLDE1Miw5MSwxNDQsMCwxNDQsMCw4LDEzNiwyMTEpO2NbZD4+Ml09MTtlPWQrNHwwO2NbZT4+Ml09OTY7T2IoNzIsMSxlfDAsMTI4LDkyLDIyKTtjW2Q+PjJdPTQ7ZT1kKzR8MDtjW2U+PjJdPTIxNzc2O2NbZCs4Pj4yXT05NjtjW2QrMTI+PjJdPTIxOTA0O2NbZCsxNj4+Ml09MjE5MDQ7Zj11big4KXwwO2lmKChmfDApIT0wKXthW2Y+PjBdPTI3O2FbZisxPj4wXT0wO2FbZisyPj4wXT0wO2FbZiszPj4wXT0wO2c9Zis0fDA7YVtnPj4wXT0wO2FbZysxPj4wXT0wO2FbZysyPj4wXT0wO2FbZyszPj4wXT0wfXpiKDcyLDE2LDQsZXwwLDEyMCwzMCxmfDAsMCk7Y1tkPj4yXT0zO2U9ZCs0fDA7Y1tlPj4yXT0yMTc3NjtjW2QrOD4+Ml09OTY7Y1tkKzEyPj4yXT0yMTg4ODtmPXVuKDgpfDA7aWYoKGZ8MCkhPTApe2FbZj4+MF09NjY7YVtmKzE+PjBdPTA7YVtmKzI+PjBdPTA7YVtmKzM+PjBdPTA7Zz1mKzR8MDthW2c+PjBdPTA7YVtnKzE+PjBdPTA7YVtnKzI+PjBdPTA7YVtnKzM+PjBdPTB9emIoNzIsMjQsMyxlfDAsMTEyLDI4LGZ8MCwwKTtjW2Q+PjJdPTI7ZT1kKzR8MDtjW2U+PjJdPTIxOTA0O2NbZCs4Pj4yXT05NjtkPXVuKDgpfDA7aWYoKGR8MCk9PTApe3piKDcyLDQwLDIsZXwwLDU2LDQ2LGR8MCwwKTtpPWI7cmV0dXJufWFbZD4+MF09OTM7YVtkKzE+PjBdPTA7YVtkKzI+PjBdPTA7YVtkKzM+PjBdPTA7Zz1kKzR8MDthW2c+PjBdPTA7YVtnKzE+PjBdPTA7YVtnKzI+PjBdPTA7YVtnKzM+PjBdPTA7emIoNzIsNDAsMixlfDAsNTYsNDYsZHwwLDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gY2YoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtkPWNbYSs0Pj4yXXwwO2U9KEpuKGR8MCl8MCkrMXwwO2E9dW4oZSl8MDtpZigoYXwwKT09MCl7ZT0wO2k9YjtyZXR1cm4gZXwwfUxuKGF8MCxkfDAsZXwwKXwwO2U9YTtpPWI7cmV0dXJuIGV8MH1mdW5jdGlvbiBkZigpe3ZhciBhPTA7YT1pO0phKDIxNzc2LDc2MjQpO3BiKDIxODA4LDc2MzIsMSwxLDApO1VhKDIxODI0LDc2NDAsMSwtMTI4LDEyNyk7VWEoMjE4NTYsNzY0OCwxLC0xMjgsMTI3KTtVYSgyMTg0MCw3NjY0LDEsMCwyNTUpO1VhKDIxODY0LDc2ODAsMiwtMzI3NjgsMzI3NjcpO1VhKDIxODcyLDc2ODgsMiwwLDY1NTM1KTtVYSgyMTg4OCw3NzA0LDQsLTIxNDc0ODM2NDgsMjE0NzQ4MzY0Nyk7VWEoMjE5MDQsNzcxMiw0LDAsLTEpO1VhKDIxOTIwLDc3MjgsNCwtMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ3KTtVYSgyMTkzNiw3NzM2LDQsMCwtMSk7YWMoMjE5NTIsNzc1Miw0KTthYygyMTk2OCw3NzYwLDgpO3RiKDgyNDAsNzc2OCk7dGIoODE1Miw3Nzg0KTtKYig4MDY0LDQsNzgyNCk7eGIoNzk0NCw3ODQwKTtMYSg3OTEyLDc4NTYpO2k9YTtyZXR1cm59ZnVuY3Rpb24gZWYoYSl7YT1hfDA7YT1pO1lnKDgzNTIpO1lnKDg1MjgpO2JoKDg3MDQpO2JoKDg4ODApO2k9YTtyZXR1cm59ZnVuY3Rpb24gZmYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNzI4O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGdmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA3Mjg7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gaGYoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wO2U9aTtvY1tjWyhjW2I+PjJdfDApKzI0Pj4yXSYxMjddKGIpfDA7ZD1ZayhjW2Q+PjJdfDAsMTM1MjgpfDA7Y1tiKzM2Pj4yXT1kO2FbYis0ND4+MF09KG9jW2NbKGNbZD4+Ml18MCkrMjg+PjJdJjEyN10oZCl8MCkmMTtpPWU7cmV0dXJufWZ1bmN0aW9uIGpmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtiPWk7aT1pKzE2fDA7Zz1iKzh8MDtkPWI7ZT1hKzM2fDA7Zj1hKzQwfDA7aD1nKzh8MDtqPWc7YT1hKzMyfDA7d2hpbGUoMSl7az1jW2U+PjJdfDA7az15Y1tjWyhjW2s+PjJdfDApKzIwPj4yXSY2M10oayxjW2Y+PjJdfDAsZyxoLGQpfDA7bD0oY1tkPj4yXXwwKS1qfDA7aWYoKFpiKGd8MCwxLGx8MCxjW2E+PjJdfDApfDApIT0obHwwKSl7ZT0tMTtkPTU7YnJlYWt9aWYoKGt8MCk9PTIpe2U9LTE7ZD01O2JyZWFrfWVsc2UgaWYoKGt8MCkhPTEpe2Q9NDticmVha319aWYoKGR8MCk9PTQpe2w9KChfYShjW2E+PjJdfDApfDApIT0wKTw8MzE+PjMxO2k9YjtyZXR1cm4gbHwwfWVsc2UgaWYoKGR8MCk9PTUpe2k9YjtyZXR1cm4gZXwwfXJldHVybiAwfWZ1bmN0aW9uIGtmKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MDtmPWk7aWYoKGFbYis0ND4+MF18MCkhPTApe2c9WmIoZHwwLDQsZXwwLGNbYiszMj4+Ml18MCl8MDtpPWY7cmV0dXJuIGd8MH1pZigoZXwwKT4wKXtnPTB9ZWxzZXtnPTA7aT1mO3JldHVybiBnfDB9d2hpbGUoMSl7aWYoKHhjW2NbKGNbYj4+Ml18MCkrNTI+PjJdJjYzXShiLGNbZD4+Ml18MCl8MCk9PS0xKXtlPTY7YnJlYWt9Zz1nKzF8MDtpZigoZ3wwKTwoZXwwKSl7ZD1kKzR8MH1lbHNle2U9NjticmVha319aWYoKGV8MCk9PTYpe2k9ZjtyZXR1cm4gZ3wwfXJldHVybiAwfWZ1bmN0aW9uIGxmKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtlPWk7aT1pKzMyfDA7az1lKzE2fDA7cD1lKzh8MDtqPWUrNHwwO2g9ZTtmPShkfDApPT0tMTthOmRve2lmKCFmKXtjW3A+PjJdPWQ7aWYoKGFbYis0ND4+MF18MCkhPTApe2lmKChaYihwfDAsNCwxLGNbYiszMj4+Ml18MCl8MCk9PTEpe2JyZWFrfWVsc2V7ZD0tMX1pPWU7cmV0dXJuIGR8MH1jW2o+PjJdPWs7bD1wKzR8MDtuPWIrMzZ8MDtvPWIrNDB8MDtnPWsrOHwwO209aztiPWIrMzJ8MDt3aGlsZSgxKXtxPWNbbj4+Ml18MDtxPXRjW2NbKGNbcT4+Ml18MCkrMTI+PjJdJjMxXShxLGNbbz4+Ml18MCxwLGwsaCxrLGcsail8MDtpZigoY1toPj4yXXwwKT09KHB8MCkpe2Q9LTE7Zz0xMjticmVha31pZigocXwwKT09Myl7Zz03O2JyZWFrfXI9KHF8MCk9PTE7aWYoIShxPj4+MDwyKSl7ZD0tMTtnPTEyO2JyZWFrfXE9KGNbaj4+Ml18MCktbXwwO2lmKChaYihrfDAsMSxxfDAsY1tiPj4yXXwwKXwwKSE9KHF8MCkpe2Q9LTE7Zz0xMjticmVha31pZihyKXtwPXI/Y1toPj4yXXwwOnB9ZWxzZXticmVhayBhfX1pZigoZ3wwKT09Nyl7aWYoKFpiKHB8MCwxLDEsY1tiPj4yXXwwKXwwKT09MSl7YnJlYWt9ZWxzZXtkPS0xfWk9ZTtyZXR1cm4gZHwwfWVsc2UgaWYoKGd8MCk9PTEyKXtpPWU7cmV0dXJuIGR8MH19fXdoaWxlKDApO3I9Zj8wOmQ7aT1lO3JldHVybiByfDB9ZnVuY3Rpb24gbWYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNzI4O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIG5mKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA3Mjg7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gb2YoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTA7ZT1pO2c9WWsoY1tkPj4yXXwwLDEzNTI4KXwwO2Y9YiszNnwwO2NbZj4+Ml09ZztkPWIrNDR8MDtjW2Q+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MDtmPWNbZj4+Ml18MDthW2IrNTM+PjBdPShvY1tjWyhjW2Y+PjJdfDApKzI4Pj4yXSYxMjddKGYpfDApJjE7aWYoKGNbZD4+Ml18MCk+OCl7b2soOTU0NCl9ZWxzZXtpPWU7cmV0dXJufX1mdW5jdGlvbiBwZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPXNmKGEsMCl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBxZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPXNmKGEsMSl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiByZihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2U9aTtpPWkrMzJ8MDtqPWUrMTZ8MDtmPWUrOHwwO2w9ZSs0fDA7az1lO2c9Yis1MnwwO209KGFbZz4+MF18MCkhPTA7aWYoKGR8MCk9PS0xKXtpZihtKXttPS0xO2k9ZTtyZXR1cm4gbXwwfW09Y1tiKzQ4Pj4yXXwwO2FbZz4+MF09KG18MCkhPS0xJjE7aT1lO3JldHVybiBtfDB9aD1iKzQ4fDA7YTpkb3tpZihtKXtjW2w+PjJdPWNbaD4+Ml07bT1jW2IrMzY+PjJdfDA7az10Y1tjWyhjW20+PjJdfDApKzEyPj4yXSYzMV0obSxjW2IrNDA+PjJdfDAsbCxsKzR8MCxrLGosais4fDAsZil8MDtpZigoa3wwKT09Myl7YVtqPj4wXT1jW2g+PjJdO2NbZj4+Ml09aisxfWVsc2UgaWYoKGt8MCk9PTF8KGt8MCk9PTIpe209LTE7aT1lO3JldHVybiBtfDB9Yj1iKzMyfDA7d2hpbGUoMSl7az1jW2Y+PjJdfDA7aWYoIShrPj4+MD5qPj4+MCkpe2JyZWFrIGF9bT1rKyAtMXwwO2NbZj4+Ml09bTtpZigoVmEoYVttPj4wXXwwLGNbYj4+Ml18MCl8MCk9PS0xKXtmPS0xO2JyZWFrfX1pPWU7cmV0dXJuIGZ8MH19d2hpbGUoMCk7Y1toPj4yXT1kO2FbZz4+MF09MTttPWQ7aT1lO3JldHVybiBtfDB9ZnVuY3Rpb24gc2YoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTA7ZT1pO2k9aSszMnwwO2c9ZSsxNnwwO2o9ZSs4fDA7bT1lKzR8MDtsPWU7bj1iKzUyfDA7aWYoKGFbbj4+MF18MCkhPTApe2Y9Yis0OHwwO2c9Y1tmPj4yXXwwO2lmKCFkKXt2PWc7aT1lO3JldHVybiB2fDB9Y1tmPj4yXT0tMTthW24+PjBdPTA7dj1nO2k9ZTtyZXR1cm4gdnwwfXM9Y1tiKzQ0Pj4yXXwwO3M9KHN8MCk+MT9zOjE7YTpkb3tpZigoc3wwKT4wKXtwPWIrMzJ8MDtuPTA7d2hpbGUoMSl7bz1UYihjW3A+PjJdfDApfDA7aWYoKG98MCk9PS0xKXtoPS0xO2JyZWFrfWFbZytuPj4wXT1vO249bisxfDA7aWYoKG58MCk+PShzfDApKXticmVhayBhfX1pPWU7cmV0dXJuIGh8MH19d2hpbGUoMCk7Yjpkb3tpZigoYVtiKzUzPj4wXXwwKT09MCl7cD1iKzQwfDA7cT1iKzM2fDA7bj1qKzR8MDtvPWIrMzJ8MDt3aGlsZSgxKXt2PWNbcD4+Ml18MDt1PXY7dD1jW3U+PjJdfDA7dT1jW3UrND4+Ml18MDt3PWNbcT4+Ml18MDtyPWcrc3wwO3Y9dGNbY1soY1t3Pj4yXXwwKSsxNj4+Ml0mMzFdKHcsdixnLHIsbSxqLG4sbCl8MDtpZigodnwwKT09Myl7Zj0xNDticmVha31lbHNlIGlmKCh2fDApPT0yKXtoPS0xO2Y9MjI7YnJlYWt9ZWxzZSBpZigodnwwKSE9MSl7az1zO2JyZWFrIGJ9dz1jW3A+PjJdfDA7Y1t3Pj4yXT10O2Nbdys0Pj4yXT11O2lmKChzfDApPT04KXtoPS0xO2Y9MjI7YnJlYWt9dD1UYihjW28+PjJdfDApfDA7aWYoKHR8MCk9PS0xKXtoPS0xO2Y9MjI7YnJlYWt9YVtyPj4wXT10O3M9cysxfDB9aWYoKGZ8MCk9PTE0KXtjW2o+PjJdPWFbZz4+MF18MDtrPXM7YnJlYWt9ZWxzZSBpZigoZnwwKT09MjIpe2k9ZTtyZXR1cm4gaHwwfX1lbHNle2Nbaj4+Ml09YVtnPj4wXXwwO2s9c319d2hpbGUoMCk7aWYoZCl7dz1jW2o+PjJdfDA7Y1tiKzQ4Pj4yXT13O2k9ZTtyZXR1cm4gd3wwfWQ9YiszMnwwO3doaWxlKDEpe2lmKChrfDApPD0wKXticmVha31rPWsrIC0xfDA7aWYoKFZhKGFbZytrPj4wXXwwLGNbZD4+Ml18MCl8MCk9PS0xKXtoPS0xO2Y9MjI7YnJlYWt9fWlmKChmfDApPT0yMil7aT1lO3JldHVybiBofDB9dz1jW2o+PjJdfDA7aT1lO3JldHVybiB3fDB9ZnVuY3Rpb24gdGYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNjY0O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHVmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA2NjQ7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gdmYoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wO2U9aTtvY1tjWyhjW2I+PjJdfDApKzI0Pj4yXSYxMjddKGIpfDA7ZD1ZayhjW2Q+PjJdfDAsMTM1MjApfDA7Y1tiKzM2Pj4yXT1kO2FbYis0ND4+MF09KG9jW2NbKGNbZD4+Ml18MCkrMjg+PjJdJjEyN10oZCl8MCkmMTtpPWU7cmV0dXJufWZ1bmN0aW9uIHdmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtiPWk7aT1pKzE2fDA7Zz1iKzh8MDtkPWI7ZT1hKzM2fDA7Zj1hKzQwfDA7aD1nKzh8MDtqPWc7YT1hKzMyfDA7d2hpbGUoMSl7az1jW2U+PjJdfDA7az15Y1tjWyhjW2s+PjJdfDApKzIwPj4yXSY2M10oayxjW2Y+PjJdfDAsZyxoLGQpfDA7bD0oY1tkPj4yXXwwKS1qfDA7aWYoKFpiKGd8MCwxLGx8MCxjW2E+PjJdfDApfDApIT0obHwwKSl7ZT0tMTtkPTU7YnJlYWt9aWYoKGt8MCk9PTIpe2U9LTE7ZD01O2JyZWFrfWVsc2UgaWYoKGt8MCkhPTEpe2Q9NDticmVha319aWYoKGR8MCk9PTQpe2w9KChfYShjW2E+PjJdfDApfDApIT0wKTw8MzE+PjMxO2k9YjtyZXR1cm4gbHwwfWVsc2UgaWYoKGR8MCk9PTUpe2k9YjtyZXR1cm4gZXwwfXJldHVybiAwfWZ1bmN0aW9uIHhmKGIsZSxmKXtiPWJ8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MDtnPWk7aWYoKGFbYis0ND4+MF18MCkhPTApe2g9WmIoZXwwLDEsZnwwLGNbYiszMj4+Ml18MCl8MDtpPWc7cmV0dXJuIGh8MH1pZigoZnwwKT4wKXtoPTB9ZWxzZXtoPTA7aT1nO3JldHVybiBofDB9d2hpbGUoMSl7aWYoKHhjW2NbKGNbYj4+Ml18MCkrNTI+PjJdJjYzXShiLGRbZT4+MF18MCl8MCk9PS0xKXtmPTY7YnJlYWt9aD1oKzF8MDtpZigoaHwwKTwoZnwwKSl7ZT1lKzF8MH1lbHNle2Y9NjticmVha319aWYoKGZ8MCk9PTYpe2k9ZztyZXR1cm4gaHwwfXJldHVybiAwfWZ1bmN0aW9uIHlmKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtlPWk7aT1pKzMyfDA7az1lKzE2fDA7cD1lKzh8MDtqPWUrNHwwO2g9ZTtmPShkfDApPT0tMTthOmRve2lmKCFmKXthW3A+PjBdPWQ7aWYoKGFbYis0ND4+MF18MCkhPTApe2lmKChaYihwfDAsMSwxLGNbYiszMj4+Ml18MCl8MCk9PTEpe2JyZWFrfWVsc2V7ZD0tMX1pPWU7cmV0dXJuIGR8MH1jW2o+PjJdPWs7bD1wKzF8MDtuPWIrMzZ8MDtvPWIrNDB8MDtnPWsrOHwwO209aztiPWIrMzJ8MDt3aGlsZSgxKXtxPWNbbj4+Ml18MDtxPXRjW2NbKGNbcT4+Ml18MCkrMTI+PjJdJjMxXShxLGNbbz4+Ml18MCxwLGwsaCxrLGcsail8MDtpZigoY1toPj4yXXwwKT09KHB8MCkpe2Q9LTE7Zz0xMjticmVha31pZigocXwwKT09Myl7Zz03O2JyZWFrfXI9KHF8MCk9PTE7aWYoIShxPj4+MDwyKSl7ZD0tMTtnPTEyO2JyZWFrfXE9KGNbaj4+Ml18MCktbXwwO2lmKChaYihrfDAsMSxxfDAsY1tiPj4yXXwwKXwwKSE9KHF8MCkpe2Q9LTE7Zz0xMjticmVha31pZihyKXtwPXI/Y1toPj4yXXwwOnB9ZWxzZXticmVhayBhfX1pZigoZ3wwKT09Nyl7aWYoKFpiKHB8MCwxLDEsY1tiPj4yXXwwKXwwKT09MSl7YnJlYWt9ZWxzZXtkPS0xfWk9ZTtyZXR1cm4gZHwwfWVsc2UgaWYoKGd8MCk9PTEyKXtpPWU7cmV0dXJuIGR8MH19fXdoaWxlKDApO3I9Zj8wOmQ7aT1lO3JldHVybiByfDB9ZnVuY3Rpb24gemYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNjY0O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEFmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA2NjQ7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gQmYoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTA7ZT1pO2c9WWsoY1tkPj4yXXwwLDEzNTIwKXwwO2Y9YiszNnwwO2NbZj4+Ml09ZztkPWIrNDR8MDtjW2Q+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MDtmPWNbZj4+Ml18MDthW2IrNTM+PjBdPShvY1tjWyhjW2Y+PjJdfDApKzI4Pj4yXSYxMjddKGYpfDApJjE7aWYoKGNbZD4+Ml18MCk+OCl7b2soOTU0NCl9ZWxzZXtpPWU7cmV0dXJufX1mdW5jdGlvbiBDZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPUZmKGEsMCl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBEZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPUZmKGEsMSl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBFZihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2U9aTtpPWkrMzJ8MDtqPWUrMTZ8MDtmPWUrNHwwO2w9ZSs4fDA7az1lO2c9Yis1MnwwO209KGFbZz4+MF18MCkhPTA7aWYoKGR8MCk9PS0xKXtpZihtKXttPS0xO2k9ZTtyZXR1cm4gbXwwfW09Y1tiKzQ4Pj4yXXwwO2FbZz4+MF09KG18MCkhPS0xJjE7aT1lO3JldHVybiBtfDB9aD1iKzQ4fDA7YTpkb3tpZihtKXthW2w+PjBdPWNbaD4+Ml07bT1jW2IrMzY+PjJdfDA7az10Y1tjWyhjW20+PjJdfDApKzEyPj4yXSYzMV0obSxjW2IrNDA+PjJdfDAsbCxsKzF8MCxrLGosais4fDAsZil8MDtpZigoa3wwKT09MXwoa3wwKT09Mil7bT0tMTtpPWU7cmV0dXJuIG18MH1lbHNlIGlmKChrfDApPT0zKXthW2o+PjBdPWNbaD4+Ml07Y1tmPj4yXT1qKzF9Yj1iKzMyfDA7d2hpbGUoMSl7az1jW2Y+PjJdfDA7aWYoIShrPj4+MD5qPj4+MCkpe2JyZWFrIGF9bT1rKyAtMXwwO2NbZj4+Ml09bTtpZigoVmEoYVttPj4wXXwwLGNbYj4+Ml18MCl8MCk9PS0xKXtmPS0xO2JyZWFrfX1pPWU7cmV0dXJuIGZ8MH19d2hpbGUoMCk7Y1toPj4yXT1kO2FbZz4+MF09MTttPWQ7aT1lO3JldHVybiBtfDB9ZnVuY3Rpb24gRmYoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTA7Zj1pO2k9aSszMnwwO2g9ZisxNnwwO2o9Zis4fDA7bj1mKzR8MDttPWY7bz1iKzUyfDA7aWYoKGFbbz4+MF18MCkhPTApe2c9Yis0OHwwO2g9Y1tnPj4yXXwwO2lmKCFlKXt3PWg7aT1mO3JldHVybiB3fDB9Y1tnPj4yXT0tMTthW28+PjBdPTA7dz1oO2k9ZjtyZXR1cm4gd3wwfXA9Y1tiKzQ0Pj4yXXwwO3A9KHB8MCk+MT9wOjE7YTpkb3tpZigocHwwKT4wKXtyPWIrMzJ8MDtvPTA7d2hpbGUoMSl7cT1UYihjW3I+PjJdfDApfDA7aWYoKHF8MCk9PS0xKXtrPS0xO2JyZWFrfWFbaCtvPj4wXT1xO289bysxfDA7aWYoKG98MCk+PShwfDApKXticmVhayBhfX1pPWY7cmV0dXJuIGt8MH19d2hpbGUoMCk7Yjpkb3tpZigoYVtiKzUzPj4wXXwwKT09MCl7cj1iKzQwfDA7cz1iKzM2fDA7bz1qKzF8MDtxPWIrMzJ8MDt3aGlsZSgxKXt3PWNbcj4+Ml18MDt2PXc7dT1jW3Y+PjJdfDA7dj1jW3YrND4+Ml18MDt4PWNbcz4+Ml18MDt0PWgrcHwwO3c9dGNbY1soY1t4Pj4yXXwwKSsxNj4+Ml0mMzFdKHgsdyxoLHQsbixqLG8sbSl8MDtpZigod3wwKT09Mil7az0tMTttPTIzO2JyZWFrfWVsc2UgaWYoKHd8MCk9PTMpe209MTQ7YnJlYWt9ZWxzZSBpZigod3wwKSE9MSl7bD1wO2JyZWFrIGJ9eD1jW3I+PjJdfDA7Y1t4Pj4yXT11O2NbeCs0Pj4yXT12O2lmKChwfDApPT04KXtrPS0xO209MjM7YnJlYWt9dT1UYihjW3E+PjJdfDApfDA7aWYoKHV8MCk9PS0xKXtrPS0xO209MjM7YnJlYWt9YVt0Pj4wXT11O3A9cCsxfDB9aWYoKG18MCk9PTE0KXthW2o+PjBdPWFbaD4+MF18MDtsPXA7YnJlYWt9ZWxzZSBpZigobXwwKT09MjMpe2k9ZjtyZXR1cm4ga3wwfX1lbHNle2Fbaj4+MF09YVtoPj4wXXwwO2w9cH19d2hpbGUoMCk7ZG97aWYoIWUpe2U9YiszMnwwO3doaWxlKDEpe2lmKChsfDApPD0wKXttPTIxO2JyZWFrfWw9bCsgLTF8MDtpZigoVmEoZFtoK2w+PjBdfDAsY1tlPj4yXXwwKXwwKT09LTEpe2s9LTE7bT0yMzticmVha319aWYoKG18MCk9PTIxKXtnPWFbaj4+MF18MDticmVha31lbHNlIGlmKChtfDApPT0yMyl7aT1mO3JldHVybiBrfDB9fWVsc2V7Zz1hW2o+PjBdfDA7Y1tiKzQ4Pj4yXT1nJjI1NX19d2hpbGUoMCk7eD1nJjI1NTtpPWY7cmV0dXJuIHh8MH1mdW5jdGlvbiBHZigpe3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2I9aTtpPWkrMTZ8MDtkPWI7Zj1jW3I+PjJdfDA7Y1syMjQ0XT0xMDY2NDtYayg4OTgwfDApO2NbODk4ND4+Ml09MDtjWzg5ODg+PjJdPTA7Y1s4OTkyPj4yXT0wO2NbODk5Nj4+Ml09MDtjWzllMz4+Ml09MDtjWzkwMDQ+PjJdPTA7Y1syMjQ0XT05NzA0O2NbOTAwOD4+Ml09ZjtjWzkwMTY+PjJdPTkwMzI7Y1s5MDI0Pj4yXT0tMTthWzkwMjg+PjBdPTA7bj1jWzg5ODA+PjJdfDA7bT1uKzR8MDtjW20+PjJdPShjW20+PjJdfDApKzE7aWYoISgoY1szMzgwXXwwKT09LTEpKXtjW2Q+PjJdPTEzNTIwO2NbZCs0Pj4yXT0yMDg7Y1tkKzg+PjJdPTA7Y2coMTM1MjAsZCl9bD0oY1sxMzUyND4+Ml18MCkrIC0xfDA7az1jW24rOD4+Ml18MDtpZigoY1tuKzEyPj4yXXwwKS1rPj4yPj4+MD5sPj4+MD8oaj1jW2srKGw8PDIpPj4yXXwwLChqfDApIT0wKTowKXtjWzkwMTI+PjJdPWo7Y1s5MDIwPj4yXT1vY1tjWyhjW2o+PjJdfDApKzI0Pj4yXSYxMjddKGopfDA7bD1jWzkwMTI+PjJdfDA7YVs5MDI5Pj4wXT0ob2NbY1soY1tsPj4yXXwwKSsyOD4+Ml0mMTI3XShsKXwwKSYxO2lmKChjWzkwMjA+PjJdfDApPjgpe29rKDk1NDQpfWw9Y1ttPj4yXXwwO2NbbT4+Ml09bCsgLTE7aWYoKGx8MCk9PTApe2xjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKX1jWzIwNjZdPTEwNzk2O2NbODI3Mj4+Ml09MTA4MTY7Y1s4MjY4Pj4yXT0wO2NbODI5Nj4+Ml09ODk3NjtjWzgyODg+PjJdPTA7Y1s4MjkyPj4yXT0wO2NbODI3Nj4+Ml09NDA5ODtjWzgyODQ+PjJdPTA7Y1s4MjgwPj4yXT02O2s9ODMwNHwwO2w9ays0MHwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChsfDApKTtYayg4MzAwfDApO2NbODM0ND4+Ml09MDtjWzgzNDg+PjJdPS0xO2o9Y1tzPj4yXXwwO2NbMjI3MF09MTA2NjQ7WGsoOTA4NHwwKTtjWzkwODg+PjJdPTA7Y1s5MDkyPj4yXT0wO2NbOTA5Nj4+Ml09MDtjWzkxMDA+PjJdPTA7Y1s5MTA0Pj4yXT0wO2NbOTEwOD4+Ml09MDtjWzIyNzBdPTk1OTI7Y1s5MTEyPj4yXT1qO2s9Y1s5MDg0Pj4yXXwwO2w9ays0fDA7Y1tsPj4yXT0oY1tsPj4yXXwwKSsxO2lmKCEoKGNbMzM4MF18MCk9PS0xKSl7Y1tkPj4yXT0xMzUyMDtjW2QrND4+Ml09MjA4O2NbZCs4Pj4yXT0wO2NnKDEzNTIwLGQpfW09KGNbMTM1MjQ+PjJdfDApKyAtMXwwO249Y1trKzg+PjJdfDA7aWYoKGNbaysxMj4+Ml18MCktbj4+Mj4+PjA+bT4+PjA/KGg9Y1tuKyhtPDwyKT4+Ml18MCwoaHwwKSE9MCk6MCl7bj1jW2w+PjJdfDA7Y1tsPj4yXT1uKyAtMTtpZigobnwwKT09MCl7bGNbY1soY1trPj4yXXwwKSs4Pj4yXSYyNTVdKGspfWNbOTExNj4+Ml09aDtjWzkxMjA+PjJdPTkwNDA7YVs5MTI0Pj4wXT0ob2NbY1soY1toPj4yXXwwKSsyOD4+Ml0mMTI3XShoKXwwKSYxO2NbMjA4OF09MTA4NzY7Y1s4MzU2Pj4yXT0xMDg5NjtjWzgzODA+PjJdPTkwODA7Y1s4MzcyPj4yXT0wO2NbODM3Nj4+Ml09MDtjWzgzNjA+PjJdPTQwOTg7Y1s4MzY4Pj4yXT0wO2NbODM2ND4+Ml09NjtrPTgzODh8MDtsPWsrNDB8MDtkb3tjW2s+PjJdPTA7az1rKzR8MH13aGlsZSgoa3wwKTwobHwwKSk7WGsoODM4NHwwKTtjWzg0Mjg+PjJdPTA7Y1s4NDMyPj4yXT0tMTtoPWNbcT4+Ml18MDtjWzIyODJdPTEwNjY0O1hrKDkxMzJ8MCk7Y1s5MTM2Pj4yXT0wO2NbOTE0MD4+Ml09MDtjWzkxNDQ+PjJdPTA7Y1s5MTQ4Pj4yXT0wO2NbOTE1Mj4+Ml09MDtjWzkxNTY+PjJdPTA7Y1syMjgyXT05NTkyO2NbOTE2MD4+Ml09aDttPWNbOTEzMj4+Ml18MDtuPW0rNHwwO2Nbbj4+Ml09KGNbbj4+Ml18MCkrMTtpZighKChjWzMzODBdfDApPT0tMSkpe2NbZD4+Ml09MTM1MjA7Y1tkKzQ+PjJdPTIwODtjW2QrOD4+Ml09MDtjZygxMzUyMCxkKX1sPShjWzEzNTI0Pj4yXXwwKSsgLTF8MDtrPWNbbSs4Pj4yXXwwO2lmKChjW20rMTI+PjJdfDApLWs+PjI+Pj4wPmw+Pj4wPyhnPWNbaysobDw8Mik+PjJdfDAsKGd8MCkhPTApOjApe2w9Y1tuPj4yXXwwO2Nbbj4+Ml09bCsgLTE7aWYoKGx8MCk9PTApe2xjW2NbKGNbbT4+Ml18MCkrOD4+Ml0mMjU1XShtKX1jWzkxNjQ+PjJdPWc7Y1s5MTY4Pj4yXT05MDQ4O2FbOTE3Mj4+MF09KG9jW2NbKGNbZz4+Ml18MCkrMjg+PjJdJjEyN10oZyl8MCkmMTtjWzIxMTBdPTEwODc2O2NbODQ0ND4+Ml09MTA4OTY7Y1s4NDY4Pj4yXT05MTI4O2NbODQ2MD4+Ml09MDtjWzg0NjQ+PjJdPTA7Y1s4NDQ4Pj4yXT00MDk4O2NbODQ1Nj4+Ml09MDtjWzg0NTI+PjJdPTY7az04NDc2fDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg0NzJ8MCk7Y1s4NTE2Pj4yXT0wO2NbODUyMD4+Ml09LTE7az1jWyhjWyhjWzIxMTBdfDApKyAtMTI+PjJdfDApKzg0NjQ+PjJdfDA7Y1syMTMyXT0xMDg3NjtjWzg1MzI+PjJdPTEwODk2O2NbODU1Nj4+Ml09aztjWzg1NDg+PjJdPShrfDApPT0wJjE7Y1s4NTUyPj4yXT0wO2NbODUzNj4+Ml09NDA5ODtjWzg1NDQ+PjJdPTA7Y1s4NTQwPj4yXT02O2s9ODU2NHwwO2w9ays0MHwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChsfDApKTtYayg4NTYwfDApO2NbODYwND4+Ml09MDtjWzg2MDg+PjJdPS0xO2NbKGNbKGNbMjA2Nl18MCkrIC0xMj4+Ml18MCkrODMzNj4+Ml09ODM1MjtnPShjWyhjWzIxMTBdfDApKyAtMTI+PjJdfDApKzg0NDR8MDtjW2c+PjJdPWNbZz4+Ml18ODE5MjtjWyhjWyhjWzIxMTBdfDApKyAtMTI+PjJdfDApKzg1MTI+PjJdPTgzNTI7Y1syMjk0XT0xMDcyODtYayg5MTgwfDApO2NbOTE4ND4+Ml09MDtjWzkxODg+PjJdPTA7Y1s5MTkyPj4yXT0wO2NbOTE5Nj4+Ml09MDtjWzkyMDA+PjJdPTA7Y1s5MjA0Pj4yXT0wO2NbMjI5NF09OTQ0ODtjWzkyMDg+PjJdPWY7Y1s5MjE2Pj4yXT05MDU2O2NbOTIyND4+Ml09LTE7YVs5MjI4Pj4wXT0wO2Y9Y1s5MTgwPj4yXXwwO2c9Zis0fDA7Y1tnPj4yXT0oY1tnPj4yXXwwKSsxO2lmKCEoKGNbMzM4Ml18MCk9PS0xKSl7Y1tkPj4yXT0xMzUyODtjW2QrND4+Ml09MjA4O2NbZCs4Pj4yXT0wO2NnKDEzNTI4LGQpfWs9KGNbMTM1MzI+PjJdfDApKyAtMXwwO2w9Y1tmKzg+PjJdfDA7aWYoKGNbZisxMj4+Ml18MCktbD4+Mj4+PjA+az4+PjA/KGU9Y1tsKyhrPDwyKT4+Ml18MCwoZXwwKSE9MCk6MCl7Y1s5MjEyPj4yXT1lO2NbOTIyMD4+Ml09b2NbY1soY1tlPj4yXXwwKSsyND4+Ml0mMTI3XShlKXwwO249Y1s5MjEyPj4yXXwwO2FbOTIyOT4+MF09KG9jW2NbKGNbbj4+Ml18MCkrMjg+PjJdJjEyN10obil8MCkmMTtpZigoY1s5MjIwPj4yXXwwKT44KXtvayg5NTQ0KX1uPWNbZz4+Ml18MDtjW2c+PjJdPW4rIC0xO2lmKChufDApPT0wKXtsY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZil9Y1syMTU0XT0xMDgzNjtjWzg2MjQ+PjJdPTEwODU2O2NbODYyMD4+Ml09MDtjWzg2NDg+PjJdPTkxNzY7Y1s4NjQwPj4yXT0wO2NbODY0ND4+Ml09MDtjWzg2Mjg+PjJdPTQwOTg7Y1s4NjM2Pj4yXT0wO2NbODYzMj4+Ml09NjtrPTg2NTZ8MDtsPWsrNDB8MDtkb3tjW2s+PjJdPTA7az1rKzR8MH13aGlsZSgoa3wwKTwobHwwKSk7WGsoODY1MnwwKTtjWzg2OTY+PjJdPTA7Y1s4NzAwPj4yXT0tMTtjWzIzMDhdPTEwNzI4O1hrKDkyMzZ8MCk7Y1s5MjQwPj4yXT0wO2NbOTI0ND4+Ml09MDtjWzkyNDg+PjJdPTA7Y1s5MjUyPj4yXT0wO2NbOTI1Nj4+Ml09MDtjWzkyNjA+PjJdPTA7Y1syMzA4XT05MzM2O2NbOTI2ND4+Ml09ajtlPWNbOTIzNj4+Ml18MDtmPWUrNHwwO2NbZj4+Ml09KGNbZj4+Ml18MCkrMTtpZighKChjWzMzODJdfDApPT0tMSkpe2NbZD4+Ml09MTM1Mjg7Y1tkKzQ+PjJdPTIwODtjW2QrOD4+Ml09MDtjZygxMzUyOCxkKX1nPShjWzEzNTMyPj4yXXwwKSsgLTF8MDtqPWNbZSs4Pj4yXXwwO2Rve2lmKChjW2UrMTI+PjJdfDApLWo+PjI+Pj4wPmc+Pj4wKXtnPWNbaisoZzw8Mik+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfW49Y1tmPj4yXXwwO2NbZj4+Ml09bisgLTE7aWYoKG58MCk9PTApe2xjW2NbKGNbZT4+Ml18MCkrOD4+Ml0mMjU1XShlKX1jWzkyNjg+PjJdPWc7Y1s5MjcyPj4yXT05MDY0O2FbOTI3Nj4+MF09KG9jW2NbKGNbZz4+Ml18MCkrMjg+PjJdJjEyN10oZyl8MCkmMTtjWzIxNzZdPTEwOTE2O2NbODcwOD4+Ml09MTA5MzY7Y1s4NzMyPj4yXT05MjMyO2NbODcyND4+Ml09MDtjWzg3Mjg+PjJdPTA7Y1s4NzEyPj4yXT00MDk4O2NbODcyMD4+Ml09MDtjWzg3MTY+PjJdPTY7az04NzQwfDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg3MzZ8MCk7Y1s4NzgwPj4yXT0wO2NbODc4ND4+Ml09LTE7Y1syMzIwXT0xMDcyODtYayg5Mjg0fDApO2NbOTI4OD4+Ml09MDtjWzkyOTI+PjJdPTA7Y1s5Mjk2Pj4yXT0wO2NbOTMwMD4+Ml09MDtjWzkzMDQ+PjJdPTA7Y1s5MzA4Pj4yXT0wO2NbMjMyMF09OTMzNjtjWzkzMTI+PjJdPWg7Zj1jWzkyODQ+PjJdfDA7ZT1mKzR8MDtjW2U+PjJdPShjW2U+PjJdfDApKzE7aWYoISgoY1szMzgyXXwwKT09LTEpKXtjW2Q+PjJdPTEzNTI4O2NbZCs0Pj4yXT0yMDg7Y1tkKzg+PjJdPTA7Y2coMTM1MjgsZCl9ZD0oY1sxMzUzMj4+Ml18MCkrIC0xfDA7Zz1jW2YrOD4+Ml18MDtkb3tpZigoY1tmKzEyPj4yXXwwKS1nPj4yPj4+MD5kPj4+MCl7ZD1jW2crKGQ8PDIpPj4yXXwwO2lmKChkfDApPT0wKXticmVha31uPWNbZT4+Ml18MDtjW2U+PjJdPW4rIC0xO2lmKChufDApIT0wKXtjWzkzMTY+PjJdPWQ7Y1s5MzIwPj4yXT05MDcyO2s9Y1tkPj4yXXwwO2s9aysyOHwwO2s9Y1trPj4yXXwwO2s9b2NbayYxMjddKGQpfDA7az1rJjE7YVs5MzI0Pj4wXT1rO2NbMjE5OF09MTA5MTY7Y1s4Nzk2Pj4yXT0xMDkzNjtjWzg4MjA+PjJdPTkyODA7Y1s4ODEyPj4yXT0wO2NbODgxNj4+Ml09MDtjWzg4MDA+PjJdPTQwOTg7Y1s4ODA4Pj4yXT0wO2NbODgwND4+Ml09NjtrPTg4Mjh8MDtsPWsrNDB8MDtkb3tjW2s+PjJdPTA7az1rKzR8MH13aGlsZSgoa3wwKTwobHwwKSk7WGsoODgyNHwwKTtjWzg4Njg+PjJdPTA7Y1s4ODcyPj4yXT0tMTtrPWNbMjE5OF18MDtrPWsrIC0xMnwwO2s9Y1trPj4yXXwwO2s9aysyNHwwO2s9ODc5MitrfDA7az1jW2s+PjJdfDA7Y1syMjIwXT0xMDkxNjtjWzg4ODQ+PjJdPTEwOTM2O2NbODkwOD4+Ml09aztrPShrfDApPT0wO2s9ayYxO2NbODkwMD4+Ml09aztjWzg5MDQ+PjJdPTA7Y1s4ODg4Pj4yXT00MDk4O2NbODg5Nj4+Ml09MDtjWzg4OTI+PjJdPTY7az04OTE2fDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg5MTJ8MCk7Y1s4OTU2Pj4yXT0wO2NbODk2MD4+Ml09LTE7bj1jWzIxNTRdfDA7bj1uKyAtMTJ8MDtuPWNbbj4+Ml18MDtuPW4rNzJ8MDtuPTg2MTYrbnwwO2Nbbj4+Ml09ODcwNDtuPWNbMjE5OF18MDtuPW4rIC0xMnwwO249Y1tuPj4yXXwwO249bis0fDA7bj04NzkyK258MDttPWNbbj4+Ml18MDttPW18ODE5MjtjW24+PjJdPW07bj1jWzIxOThdfDA7bj1uKyAtMTJ8MDtuPWNbbj4+Ml18MDtuPW4rNzJ8MDtuPTg3OTIrbnwwO2Nbbj4+Ml09ODcwNDtjYygyMTIsODk2OCxwfDApfDA7aT1iO3JldHVybn1sY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZik7Y1s5MzE2Pj4yXT1kO2NbOTMyMD4+Ml09OTA3MjtrPWNbZD4+Ml18MDtrPWsrMjh8MDtrPWNbaz4+Ml18MDtrPW9jW2smMTI3XShkKXwwO2s9ayYxO2FbOTMyND4+MF09aztjWzIxOThdPTEwOTE2O2NbODc5Nj4+Ml09MTA5MzY7Y1s4ODIwPj4yXT05MjgwO2NbODgxMj4+Ml09MDtjWzg4MTY+PjJdPTA7Y1s4ODAwPj4yXT00MDk4O2NbODgwOD4+Ml09MDtjWzg4MDQ+PjJdPTY7az04ODI4fDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg4MjR8MCk7Y1s4ODY4Pj4yXT0wO2NbODg3Mj4+Ml09LTE7az1jWzIxOThdfDA7az1rKyAtMTJ8MDtrPWNbaz4+Ml18MDtrPWsrMjR8MDtrPTg3OTIra3wwO2s9Y1trPj4yXXwwO2NbMjIyMF09MTA5MTY7Y1s4ODg0Pj4yXT0xMDkzNjtjWzg5MDg+PjJdPWs7az0oa3wwKT09MDtrPWsmMTtjWzg5MDA+PjJdPWs7Y1s4OTA0Pj4yXT0wO2NbODg4OD4+Ml09NDA5ODtjWzg4OTY+PjJdPTA7Y1s4ODkyPj4yXT02O2s9ODkxNnwwO2w9ays0MHwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChsfDApKTtYayg4OTEyfDApO2NbODk1Nj4+Ml09MDtjWzg5NjA+PjJdPS0xO249Y1syMTU0XXwwO249bisgLTEyfDA7bj1jW24+PjJdfDA7bj1uKzcyfDA7bj04NjE2K258MDtjW24+PjJdPTg3MDQ7bj1jWzIxOThdfDA7bj1uKyAtMTJ8MDtuPWNbbj4+Ml18MDtuPW4rNHwwO249ODc5MitufDA7bT1jW24+PjJdfDA7bT1tfDgxOTI7Y1tuPj4yXT1tO249Y1syMTk4XXwwO249bisgLTEyfDA7bj1jW24+PjJdfDA7bj1uKzcyfDA7bj04NzkyK258MDtjW24+PjJdPTg3MDQ7Y2MoMjEyLDg5NjgscHwwKXwwO2k9YjtyZXR1cm59fXdoaWxlKDApO249WGEoNCl8MDtjW24+PjJdPTIxMzA0O3diKG58MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtuPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBIZihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5MDQ7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWVsc2V7UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufX1mdW5jdGlvbiBJZihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5MDQ7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gSmYoYSl7YT1hfDA7cmV0dXJuIGNbYSs0Pj4yXXwwfWZ1bmN0aW9uIEtmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZWxzZXtSYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59fWZ1bmN0aW9uIExmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBNZihhKXthPWF8MDtyZXR1cm4gY1thKzQ+PjJdfDB9ZnVuY3Rpb24gTmYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTA0O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1lbHNle1JiKGF8MCk7dm4oYSk7aT1iO3JldHVybn19ZnVuY3Rpb24gT2YoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO2NbYT4+Ml09ZDtjW2ErND4+Ml09YjtyZXR1cm59ZnVuY3Rpb24gUGYoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wO2U9aTtpPWkrMTZ8MDtmPWU7cWNbY1soY1thPj4yXXwwKSsxMj4+Ml0mMzFdKGYsYSxiKTtpZigoY1tmKzQ+PjJdfDApIT0oY1tkKzQ+PjJdfDApKXthPTA7aT1lO3JldHVybiBhfDB9YT0oY1tmPj4yXXwwKT09KGNbZD4+Ml18MCk7aT1lO3JldHVybiBhfDB9ZnVuY3Rpb24gUWYoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTA7ZT1pO2lmKChjW2IrND4+Ml18MCkhPShhfDApKXthPTA7aT1lO3JldHVybiBhfDB9YT0oY1tiPj4yXXwwKT09KGR8MCk7aT1lO3JldHVybiBhfDB9ZnVuY3Rpb24gUmYoYSl7YT1hfDA7cmV0dXJuIDEwMDgwfWZ1bmN0aW9uIFNmKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wO2Q9aTtlPU5iKGV8MCl8MDtmPUpuKGV8MCl8MDtpZihmPj4+MD40Mjk0OTY3Mjc5KXtkZygpfWlmKGY+Pj4wPDExKXthW2I+PjBdPWY8PDE7aj1iKzF8MDtMbihqfDAsZXwwLGZ8MCl8MDtqPWorZnwwO2Fbaj4+MF09MDtpPWQ7cmV0dXJufWc9ZisxNiYtMTY7aD0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aj11bihoKXwwO2lmKChqfDApIT0wKXtoPTExO2JyZWFrfWo9Y1s1NjY2XXwwO2NbNTY2Nl09aiswO2lmKChqfDApPT0wKXtoPTk7YnJlYWt9c2NbaiYzMV0oKX1pZigoaHwwKT09OSl7aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9ZWxzZSBpZigoaHwwKT09MTEpe2NbYis4Pj4yXT1qO2NbYj4+Ml09Z3wxO2NbYis0Pj4yXT1mO0xuKGp8MCxlfDAsZnwwKXwwO2o9aitmfDA7YVtqPj4wXT0wO2k9ZDtyZXR1cm59fWZ1bmN0aW9uIFRmKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBVZihhKXthPWF8MDtyZXR1cm4gMTAxMDR9ZnVuY3Rpb24gVmYoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTA7ZD1pO2U9TmIoZXwwKXwwO2Y9Sm4oZXwwKXwwO2lmKGY+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9aWYoZj4+PjA8MTEpe2FbYj4+MF09Zjw8MTtqPWIrMXwwO0xuKGp8MCxlfDAsZnwwKXwwO2o9aitmfDA7YVtqPj4wXT0wO2k9ZDtyZXR1cm59Zz1mKzE2Ji0xNjtoPShnfDApPT0wPzE6Zzt3aGlsZSgxKXtqPXVuKGgpfDA7aWYoKGp8MCkhPTApe2g9MTE7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2g9OTticmVha31zY1tqJjMxXSgpfWlmKChofDApPT05KXtqPVhhKDQpfDA7Y1tqPj4yXT0yMjY4MDt3YihqfDAsMjI3MjgsMjA2KX1lbHNlIGlmKChofDApPT0xMSl7Y1tiKzg+PjJdPWo7Y1tiPj4yXT1nfDE7Y1tiKzQ+PjJdPWY7TG4oanwwLGV8MCxmfDApfDA7aj1qK2Z8MDthW2o+PjBdPTA7aT1kO3JldHVybn19ZnVuY3Rpb24gV2YoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Q9aTtpZigoYVsxMDA5Nl18MCk9PTA/KFFhKDEwMDk2KXwwKSE9MDowKXtjWzI1MjJdPTEwMjg4OyRhKDEwMDk2KX1jW2I+PjJdPWU7Y1tiKzQ+PjJdPTEwMDg4O2k9ZDtyZXR1cm59ZnVuY3Rpb24gWGYoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFlmKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wO2c9aTtpPWkrNDh8MDtvPWcrMjR8MDtsPWcrMTJ8MDtoPWc7cD1KbihmfDApfDA7aWYocD4+PjA+NDI5NDk2NzI3OSl7ZGcoKX1kb3tpZihwPj4+MDwxMSl7YVtoPj4wXT1wPDwxO209aDtxPWgrMXwwfWVsc2V7bT1wKzE2Ji0xNjtyPShtfDApPT0wPzE6bTt3aGlsZSgxKXtxPXVuKHIpfDA7aWYoKHF8MCkhPTApe2o9MTE7YnJlYWt9cT1jWzU2NjZdfDA7Y1s1NjY2XT1xKzA7aWYoKHF8MCk9PTApe2JyZWFrfXNjW3EmMzFdKCl9aWYoKGp8MCk9PTExKXtjW2grOD4+Ml09cTtjW2g+PjJdPW18MTtjW2grND4+Ml09cDttPWg7YnJlYWt9cj1YYSg0KXwwO2Nbcj4+Ml09MjI2ODA7d2IocnwwLDIyNzI4LDIwNil9fXdoaWxlKDApO0xuKHF8MCxmfDAscHwwKXwwO2FbcStwPj4wXT0wO2lmKChkfDApIT0wKXtwPWFbbT4+MF18MDtpZigocCYxKT09MCl7cD0ocCYyNTUpPj4+MX1lbHNle3A9Y1toKzQ+PjJdfDB9aWYoKHB8MCkhPTApe2pnKGgsMTAxMjgsMil9cWNbY1soY1tlPj4yXXwwKSsyND4+Ml0mMzFdKG8sZSxkKTtmPWFbbz4+MF18MDtpZigoZiYxKT09MCl7cD1vKzF8MDtmPShmJjI1NSk+Pj4xfWVsc2V7cD1jW28rOD4+Ml18MDtmPWNbbys0Pj4yXXwwfWpnKGgscCxmKTtpZighKChhW28+PjBdJjEpPT0wKT8obj1jW28rOD4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9fWNbbCswPj4yXT1jW20rMD4+Ml07Y1tsKzQ+PjJdPWNbbSs0Pj4yXTtjW2wrOD4+Ml09Y1ttKzg+PjJdO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2NbYj4+Ml09OTkyODtuPWIrNHwwO2lmKChhW2w+PjBdJjEpPT0wKXtmPWwrMXwwfWVsc2V7Zj1jW2wrOD4+Ml18MH1wPUpuKGZ8MCl8MDtvPXArMTN8MDtvPShvfDApPT0wPzE6bzt3aGlsZSgxKXtxPXVuKG8pfDA7aWYoKHF8MCkhPTApe2JyZWFrfXE9Y1s1NjY2XXwwO2NbNTY2Nl09cSswO2lmKChxfDApPT0wKXtqPTMzO2JyZWFrfXNjW3EmMzFdKCl9aWYoKGp8MCk9PTMzKXtyPVhhKDQpfDA7Y1tyPj4yXT0yMjY4MDt3YihyfDAsMjI3MjgsMjA2KX1jW3ErND4+Ml09cDtjW3E+PjJdPXA7cj1xKzEyfDA7Y1tuPj4yXT1yO2NbcSs4Pj4yXT0wO0xuKHJ8MCxmfDAscCsxfDApfDA7aWYoISgoYVtsPj4wXSYxKT09MCk/KGs9Y1tsKzg+PjJdfDAsKGt8MCkhPTApOjApe3ZuKGspfWlmKChhW20+PjBdJjEpPT0wKXtjW2I+PjJdPTEwMTQ0O3I9Yis4fDA7cT1lO2Y9cjtjW2Y+PjJdPWQ7cj1yKzR8MDtjW3I+PjJdPXE7aT1nO3JldHVybn1oPWNbaCs4Pj4yXXwwO2lmKChofDApPT0wKXtjW2I+PjJdPTEwMTQ0O3I9Yis4fDA7cT1lO2Y9cjtjW2Y+PjJdPWQ7cj1yKzR8MDtjW3I+PjJdPXE7aT1nO3JldHVybn12bihoKTtjW2I+PjJdPTEwMTQ0O3I9Yis4fDA7cT1lO2Y9cjtjW2Y+PjJdPWQ7cj1yKzR8MDtjW3I+PjJdPXE7aT1nO3JldHVybn1mdW5jdGlvbiBaZihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIF9mKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiAkZihhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBhZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn0KCgoKZnVuY3Rpb24gYmcoYSl7YT1hfDA7dmFyIGI9MDtiPWk7QmIoYXwwKXwwO2k9YjtyZXR1cm59ZnVuY3Rpb24gY2coYSxiKXthPWF8MDtiPWJ8MDt2YXIgZT0wLGY9MCxnPTA7ZT1pOyRiKDEwNTY4KXwwO2lmKChjW2E+PjJdfDApPT0xKXtkb3tHYSgxMDU5MiwxMDU2OCl8MH13aGlsZSgoY1thPj4yXXwwKT09MSl9aWYoKGNbYT4+Ml18MCkhPTApe0NiKDEwNTY4KXwwO2k9ZTtyZXR1cm59Y1thPj4yXT0xO0NiKDEwNTY4KXwwO2c9Yis0fDA7Zj1kW2c+PjBdfGRbZysxPj4wXTw8OHxkW2crMj4+MF08PDE2fGRbZyszPj4wXTw8MjQ7Zz1nKzR8MDtnPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNDtiPShjW2I+PjJdfDApKyhnPj4xKXwwO2lmKChnJjF8MCkhPTApe2Y9Y1soY1tiPj4yXXwwKStmPj4yXXwwfWxjW2YmMjU1XShiKTskYigxMDU2OCl8MDtjW2E+PjJdPS0xO0NiKDEwNTY4KXwwO0ViKDEwNTkyKXwwO2k9ZTtyZXR1cm59ZnVuY3Rpb24gZGcoKXt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9WGEoOCl8MDtjW2I+PjJdPTk5MDQ7d2hpbGUoMSl7ZT11bigyNSl8MDtpZigoZXwwKSE9MCl7ZD03O2JyZWFrfWU9Y1s1NjY2XXwwO2NbNTY2Nl09ZSswO2lmKChlfDApPT0wKXticmVha31zY1tlJjMxXSgpfWlmKChkfDApPT03KXtjW2UrND4+Ml09MTI7Y1tlPj4yXT0xMjtmPWUrMTJ8MDtjW2IrND4+Ml09ZjtjW2UrOD4+Ml09MDtmPWYrMHwwO2U9MTA2NDB8MDtkPWYrMTN8MDtkb3thW2Y+PjBdPWFbZT4+MF18MDtmPWYrMXwwO2U9ZSsxfDB9d2hpbGUoKGZ8MCk8KGR8MCkpO2NbYj4+Ml09OTk4NDt3YihifDAsMTAwMjQsMTA0KX1mPVhhKDQpfDA7Y1tmPj4yXT0yMjY4MDt3YihmfDAsMjI3MjgsMjA2KX1mdW5jdGlvbiBlZyhiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MDtmPWk7aWYoZT4+PjA+NDI5NDk2NzI3OSl7ZGcoKX1pZihlPj4+MDwxMSl7YVtiPj4wXT1lPDwxO2o9YisxfDA7TG4oanwwLGR8MCxlfDApfDA7aj1qK2V8MDthW2o+PjBdPTA7aT1mO3JldHVybn1nPWUrMTYmLTE2O2g9KGd8MCk9PTA/MTpnO3doaWxlKDEpe2o9dW4oaCl8MDtpZigoanwwKSE9MCl7aD0xMTticmVha31qPWNbNTY2Nl18MDtjWzU2NjZdPWorMDtpZigoanwwKT09MCl7aD05O2JyZWFrfXNjW2omMzFdKCl9aWYoKGh8MCk9PTkpe2o9WGEoNCl8MDtjW2o+PjJdPTIyNjgwO3diKGp8MCwyMjcyOCwyMDYpfWVsc2UgaWYoKGh8MCk9PTExKXtjW2IrOD4+Ml09ajtjW2I+PjJdPWd8MTtjW2IrND4+Ml09ZTtMbihqfDAsZHwwLGV8MCl8MDtqPWorZXwwO2Fbaj4+MF09MDtpPWY7cmV0dXJufX1mdW5jdGlvbiBmZyhiKXtiPWJ8MDt2YXIgZD0wLGU9MDtkPWk7aWYoISgoYVtiPj4wXSYxKT09MCk/KGU9Y1tiKzg+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWk9ZDtyZXR1cm59ZnVuY3Rpb24gZ2coYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MDtmPWk7ZT1KbihkfDApfDA7aD1hW2I+PjBdfDA7aWYoKGgmMSk9PTApe2c9MTB9ZWxzZXtnPWNbYj4+Ml18MDtoPWcmMjU1O2c9KGcmLTIpKyAtMXwwfWo9KGgmMSk9PTA7aWYoZz4+PjA8ZT4+PjApe2lmKGope2g9KGgmMjU1KT4+PjF9ZWxzZXtoPWNbYis0Pj4yXXwwfWtnKGIsZyxlLWd8MCxoLDAsaCxlLGQpO2k9ZjtyZXR1cm59aWYoail7Zz1iKzF8MH1lbHNle2c9Y1tiKzg+PjJdfDB9TW4oZ3wwLGR8MCxlfDApfDA7YVtnK2U+PjBdPTA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09ZTw8MTtpPWY7cmV0dXJufWVsc2V7Y1tiKzQ+PjJdPWU7aT1mO3JldHVybn19ZnVuY3Rpb24gaGcoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wO2U9aTtpZigoZHwwKT09MCl7aT1lO3JldHVybn1oPWFbYj4+MF18MDtpZigoaCYxKT09MCl7Zz0xMH1lbHNle2g9Y1tiPj4yXXwwO2c9KGgmLTIpKyAtMXwwO2g9aCYyNTV9aWYoKGgmMSk9PTApe2Y9KGgmMjU1KT4+PjF9ZWxzZXtmPWNbYis0Pj4yXXwwfWlmKChnLWZ8MCk+Pj4wPGQ+Pj4wKXtsZyhiLGcsZC1nK2Z8MCxmLGYsMCk7aD1hW2I+PjBdfDB9aWYoKGgmMSk9PTApe2c9YisxfDB9ZWxzZXtnPWNbYis4Pj4yXXwwfU5uKGcrZnwwLDAsZHwwKXwwO2Q9ZitkfDA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09ZDw8MX1lbHNle2NbYis0Pj4yXT1kfWFbZytkPj4wXT0wO2k9ZTtyZXR1cm59ZnVuY3Rpb24gaWcoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7ZD1pO2g9YVtiPj4wXXwwO2lmKChoJjEpPT0wKXtsPTEwfWVsc2V7aD1jW2I+PjJdfDA7bD0oaCYtMikrIC0xfDA7aD1oJjI1NX1qPShoJjEpPT0wO2lmKGope2Y9KGgmMjU1KT4+PjF9ZWxzZXtmPWNbYis0Pj4yXXwwfWlmKGY+Pj4wPDExKXtlPTEwfWVsc2V7ZT0oZisxNiYtMTYpKyAtMXwwfWlmKChlfDApPT0obHwwKSl7aT1kO3JldHVybn1kb3tpZigoZXwwKT09MTApe2s9YisxfDA7Zz1jW2IrOD4+Ml18MDtpZihqKXtMbihrfDAsZ3wwLCgoaCYyNTUpPj4+MSkrMXwwKXwwO2g9aztrPTA7aj1nO2c9Mjd9ZWxzZXtoPWs7az0wO2o9ZztnPTI1fX1lbHNle2s9ZSsxfDA7az0oa3wwKT09MD8xOms7YTpkb3tpZihlPj4+MD5sPj4+MCl7d2hpbGUoMSl7bD11bihrKXwwO2lmKChsfDApIT0wKXticmVhayBhfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXticmVha31zY1tsJjMxXSgpfWw9WGEoNCl8MDtjW2w+PjJdPTIyNjgwO3diKGx8MCwyMjcyOCwyMDYpfWVsc2V7d2hpbGUoMSl7bD11bihrKXwwO2lmKChsfDApIT0wKXticmVhayBhfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXticmVha31zY1tsJjMxXSgpfWw9WGEoNCl8MDtjW2w+PjJdPTIyNjgwO3diKGx8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihqKXtMbihsfDAsYisxfDAsKChoJjI1NSk+Pj4xKSsxfDApfDA7aD1sO2JyZWFrfWVsc2V7aD1sO2s9MTtqPWNbYis4Pj4yXXwwO2c9MjU7YnJlYWt9fX13aGlsZSgwKTtpZigoZ3wwKT09MjUpe0xuKGh8MCxqfDAsKGNbYis0Pj4yXXwwKSsxfDApfDA7Zz0yN31kb3tpZigoZ3wwKT09Mjcpe2lmKChqfDApPT0wKXtpZihrKXticmVha319ZWxzZXt2bihqKTtpZihrKXticmVha319YVtiPj4wXT1mPDwxO2k9ZDtyZXR1cm59fXdoaWxlKDApO2NbYj4+Ml09ZSsxfDE7Y1tiKzQ+PjJdPWY7Y1tiKzg+PjJdPWg7aT1kO3JldHVybn1mdW5jdGlvbiBqZyhiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MDtmPWk7aj1hW2I+PjBdfDA7aWYoKGomMSk9PTApe2c9MTB9ZWxzZXtqPWNbYj4+Ml18MDtnPShqJi0yKSsgLTF8MDtqPWomMjU1fWg9KGomMSk9PTA7aWYoaCl7aj0oaiYyNTUpPj4+MX1lbHNle2o9Y1tiKzQ+PjJdfDB9aWYoKGctanwwKT4+PjA8ZT4+PjApe2tnKGIsZyxlLWcranwwLGosaiwwLGUsZCk7aT1mO3JldHVybn1pZigoZXwwKT09MCl7aT1mO3JldHVybn1pZihoKXtnPWIrMXwwfWVsc2V7Zz1jW2IrOD4+Ml18MH1MbihnK2p8MCxkfDAsZXwwKXwwO2U9aitlfDA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09ZTw8MX1lbHNle2NbYis0Pj4yXT1lfWFbZytlPj4wXT0wO2k9ZjtyZXR1cm59ZnVuY3Rpb24ga2coYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MDtsPWk7aWYoKC0xOC1kfDApPj4+MDxlPj4+MCl7ZGcoKX1pZigoYVtiPj4wXSYxKT09MCl7bT1iKzF8MH1lbHNle209Y1tiKzg+PjJdfDB9aWYoZD4+PjA8MjE0NzQ4MzYyMyl7ZT1lK2R8MDtwPWQ8PDE7ZT1lPj4+MDxwPj4+MD9wOmU7aWYoZT4+PjA8MTEpe2U9MTF9ZWxzZXtlPWUrMTYmLTE2fX1lbHNle2U9LTE3fW89KGV8MCk9PTA/MTplO3doaWxlKDEpe3A9dW4obyl8MDtpZigocHwwKSE9MCl7YnJlYWt9cD1jWzU2NjZdfDA7Y1s1NjY2XT1wKzA7aWYoKHB8MCk9PTApe249MTM7YnJlYWt9c2NbcCYzMV0oKX1pZigobnwwKT09MTMpe3A9WGEoNCl8MDtjW3A+PjJdPTIyNjgwO3diKHB8MCwyMjcyOCwyMDYpfWlmKChnfDApIT0wKXtMbihwfDAsbXwwLGd8MCl8MH1pZigoanwwKSE9MCl7TG4ocCtnfDAsa3wwLGp8MCl8MH1uPWYtaHwwO2lmKChufDApIT0oZ3wwKSl7TG4ocCsoaitnKXwwLG0rKGgrZyl8MCxuLWd8MCl8MH1pZigoZHwwKT09MTB8KG18MCk9PTApe289Yis4fDA7Y1tvPj4yXT1wO289ZXwxO2NbYj4+Ml09bztvPW4ranwwO2U9Yis0fDA7Y1tlPj4yXT1vO3A9cCtvfDA7YVtwPj4wXT0wO2k9bDtyZXR1cm59dm4obSk7bz1iKzh8MDtjW28+PjJdPXA7bz1lfDE7Y1tiPj4yXT1vO289bitqfDA7ZT1iKzR8MDtjW2U+PjJdPW87cD1wK298MDthW3A+PjBdPTA7aT1sO3JldHVybn1mdW5jdGlvbiBsZyhiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTA7bD1pO2lmKCgtMTctZHwwKT4+PjA8ZT4+PjApe2RnKCl9aWYoKGFbYj4+MF0mMSk9PTApe2s9YisxfDB9ZWxzZXtrPWNbYis4Pj4yXXwwfWlmKGQ+Pj4wPDIxNDc0ODM2MjMpe2U9ZStkfDA7bj1kPDwxO2U9ZT4+PjA8bj4+PjA/bjplO2lmKGU+Pj4wPDExKXtlPTExfWVsc2V7ZT1lKzE2Ji0xNn19ZWxzZXtlPS0xN31tPShlfDApPT0wPzE6ZTt3aGlsZSgxKXtuPXVuKG0pfDA7aWYoKG58MCkhPTApe2JyZWFrfW49Y1s1NjY2XXwwO2NbNTY2Nl09biswO2lmKChufDApPT0wKXtqPTEzO2JyZWFrfXNjW24mMzFdKCl9aWYoKGp8MCk9PTEzKXtuPVhhKDQpfDA7Y1tuPj4yXT0yMjY4MDt3YihufDAsMjI3MjgsMjA2KX1pZigoZ3wwKSE9MCl7TG4obnwwLGt8MCxnfDApfDB9aWYoKGZ8MCkhPShnfDApKXtMbihuKyhoK2cpfDAsaytnfDAsZi1nfDApfDB9aWYoKGR8MCk9PTEwfChrfDApPT0wKXttPWIrOHwwO2NbbT4+Ml09bjtuPWV8MTtjW2I+PjJdPW47aT1sO3JldHVybn12bihrKTttPWIrOHwwO2NbbT4+Ml09bjtuPWV8MTtjW2I+PjJdPW47aT1sO3JldHVybn1mdW5jdGlvbiBtZyhiKXtiPWJ8MDt2YXIgZD0wLGU9MDtkPWk7aWYoISgoYVtiPj4wXSYxKT09MCk/KGU9Y1tiKzg+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWk9ZDtyZXR1cm59ZnVuY3Rpb24gbmcoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtlPWk7Zj1kO3doaWxlKDEpe2lmKChjW2Y+PjJdfDApPT0wKXticmVha31lbHNle2Y9Zis0fDB9fWs9ZDtqPWYta3wwO2Y9aj4+MjtsPWFbYj4+MF18MDtpZigobCYxKT09MCl7Zz0xfWVsc2V7bD1jW2I+PjJdfDA7Zz0obCYtMikrIC0xfDA7bD1sJjI1NX1pZighKGc+Pj4wPGY+Pj4wKSl7aWYoKGwmMSk9PTApe2c9Yis0fDB9ZWxzZXtnPWNbYis4Pj4yXXwwfWg9KGZ8MCk9PTA7aWYoZy1rPj4yPj4+MDxmPj4+MCl7aWYoIWgpe2g9Zjtkb3toPWgrIC0xfDA7Y1tnKyhoPDwyKT4+Ml09Y1tkKyhoPDwyKT4+Ml19d2hpbGUoKGh8MCkhPTApfX1lbHNle2lmKCFoKXtoPWc7az1mO3doaWxlKDEpe2s9aysgLTF8MDtjW2g+PjJdPWNbZD4+Ml07aWYoKGt8MCk9PTApe2JyZWFrfWVsc2V7ZD1kKzR8MDtoPWgrNHwwfX19fWNbZysoZjw8Mik+PjJdPTA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09aj4+PjE7aT1lO3JldHVybn1lbHNle2NbYis0Pj4yXT1mO2k9ZTtyZXR1cm59fWlmKCgxMDczNzQxODA2LWd8MCk+Pj4wPChmLWd8MCk+Pj4wKXtkZygpfWlmKChsJjEpPT0wKXtqPWIrNHwwfWVsc2V7aj1jW2IrOD4+Ml18MH1pZihnPj4+MDw1MzY4NzA4ODcpe2s9Zzw8MTtrPWY+Pj4wPGs+Pj4wP2s6ZjtpZihrPj4+MDwyKXtrPTJ9ZWxzZXtrPWsrNCYtNH19ZWxzZXtrPTEwNzM3NDE4MDd9bT1rPDwyO209KG18MCk9PTA/MTptO3doaWxlKDEpe2w9dW4obSl8MDtpZigobHwwKSE9MCl7YnJlYWt9bD1jWzU2NjZdfDA7Y1s1NjY2XT1sKzA7aWYoKGx8MCk9PTApe2g9Mjk7YnJlYWt9c2NbbCYzMV0oKX1pZigoaHwwKT09Mjkpe209WGEoNCl8MDtjW20+PjJdPTIyNjgwO3diKG18MCwyMjcyOCwyMDYpfWlmKChmfDApIT0wKXtoPWY7bT1sO3doaWxlKDEpe2g9aCsgLTF8MDtjW20+PjJdPWNbZD4+Ml07aWYoKGh8MCk9PTApe2JyZWFrfWVsc2V7ZD1kKzR8MDttPW0rNHwwfX19aWYoISgoZ3wwKT09MXwoanwwKT09MCkpe3ZuKGopfWNbYis4Pj4yXT1sO2NbYj4+Ml09a3wxO2NbYis0Pj4yXT1mO2NbbCsoZjw8Mik+PjJdPTA7aT1lO3JldHVybn1mdW5jdGlvbiBvZyhiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2Q9aTtnPWFbYj4+MF18MDtpZigoZyYxKT09MCl7az0xfWVsc2V7Zz1jW2I+PjJdfDA7az0oZyYtMikrIC0xfDA7Zz1nJjI1NX1oPShnJjEpPT0wO2lmKGgpe2Y9KGcmMjU1KT4+PjF9ZWxzZXtmPWNbYis0Pj4yXXwwfWlmKGY+Pj4wPDIpe2U9MX1lbHNle2U9KGYrNCYtNCkrIC0xfDB9aWYoKGV8MCk9PShrfDApKXtpPWQ7cmV0dXJufWRve2lmKChlfDApPT0xKXtuPWIrNHwwO2w9Y1tiKzg+PjJdfDA7aWYoaCl7aj0wO209MTtoPTI2fWVsc2V7Zz1uO2o9MDttPTE7aD0yNX19ZWxzZXtqPShlPDwyKSs0fDA7aj0oanwwKT09MD8xOmo7YTpkb3tpZihlPj4+MD5rPj4+MCl7d2hpbGUoMSl7bj11bihqKXwwO2lmKChufDApIT0wKXticmVhayBhfWs9Y1s1NjY2XXwwO2NbNTY2Nl09ayswO2lmKChrfDApPT0wKXticmVha31zY1trJjMxXSgpfW49WGEoNCl8MDtjW24+PjJdPTIyNjgwO3diKG58MCwyMjcyOCwyMDYpfWVsc2V7d2hpbGUoMSl7bj11bihqKXwwO2lmKChufDApIT0wKXticmVhayBhfWs9Y1s1NjY2XXwwO2NbNTY2Nl09ayswO2lmKChrfDApPT0wKXticmVha31zY1trJjMxXSgpfW49WGEoNCl8MDtjW24+PjJdPTIyNjgwO3diKG58MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihoKXtqPTE7bD1iKzR8MDttPTA7aD0yNjticmVha31lbHNle2c9bjtqPTE7bD1jW2IrOD4+Ml18MDttPTE7aD0yNTticmVha319fXdoaWxlKDApO2lmKChofDApPT0yNSl7az1jW2IrND4+Ml18MH1lbHNlIGlmKChofDApPT0yNil7az0oZyYyNTUpPj4+MTtnPW59az1rKzF8MDtpZigoa3wwKSE9MCl7bj1sO2g9Zzt3aGlsZSgxKXtrPWsrIC0xfDA7Y1toPj4yXT1jW24+PjJdO2lmKChrfDApPT0wKXticmVha31lbHNle249bis0fDA7aD1oKzR8MH19fWlmKCEobV4xfChsfDApPT0wKSl7dm4obCl9aWYoail7Y1tiPj4yXT1lKzF8MTtjW2IrND4+Ml09ZjtjW2IrOD4+Ml09ZztpPWQ7cmV0dXJufWVsc2V7YVtiPj4wXT1mPDwxO2k9ZDtyZXR1cm59fWZ1bmN0aW9uIHBnKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MDtrPWk7aWYoKDEwNzM3NDE4MDctZHwwKT4+PjA8ZT4+PjApe2RnKCl9aWYoKGFbYj4+MF0mMSk9PTApe2w9Yis0fDB9ZWxzZXtsPWNbYis4Pj4yXXwwfWlmKGQ+Pj4wPDUzNjg3MDg4Nyl7ZT1lK2R8MDtwPWQ8PDE7ZT1lPj4+MDxwPj4+MD9wOmU7aWYoZT4+PjA8Mil7ZT0yfWVsc2V7ZT1lKzQmLTR9fWVsc2V7ZT0xMDczNzQxODA3fW89ZTw8MjtvPShvfDApPT0wPzE6bzt3aGlsZSgxKXttPXVuKG8pfDA7aWYoKG18MCkhPTApe2JyZWFrfW09Y1s1NjY2XXwwO2NbNTY2Nl09bSswO2lmKChtfDApPT0wKXtuPTEzO2JyZWFrfXNjW20mMzFdKCl9aWYoKG58MCk9PTEzKXtwPVhhKDQpfDA7Y1twPj4yXT0yMjY4MDt3YihwfDAsMjI3MjgsMjA2KX1pZigoZ3wwKSE9MCl7bz1nO249bDtwPW07d2hpbGUoMSl7bz1vKyAtMXwwO2NbcD4+Ml09Y1tuPj4yXTtpZigob3wwKT09MCl7YnJlYWt9ZWxzZXtuPW4rNHwwO3A9cCs0fDB9fX1mPWYtaHwwO2lmKChmfDApIT0oZ3wwKSl7Zj1mLWd8MDtoPWwrKGgrZzw8Mil8MDtnPW0rKGorZzw8Mil8MDt3aGlsZSgxKXtmPWYrIC0xfDA7Y1tnPj4yXT1jW2g+PjJdO2lmKChmfDApPT0wKXticmVha31lbHNle2g9aCs0fDA7Zz1nKzR8MH19fWlmKChkfDApPT0xfChsfDApPT0wKXtwPWIrOHwwO2NbcD4+Ml09bTtwPWV8MTtjW2I+PjJdPXA7aT1rO3JldHVybn12bihsKTtwPWIrOHwwO2NbcD4+Ml09bTtwPWV8MTtjW2I+PjJdPXA7aT1rO3JldHVybn1mdW5jdGlvbiBxZyhiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTA7ZT0oY1tiKzI0Pj4yXXwwKT09MDtpZihlKXtjW2IrMTY+PjJdPWR8MX1lbHNle2NbYisxNj4+Ml09ZH1pZigoKGUmMXxkKSZjW2IrMjA+PjJdfDApPT0wKXtyZXR1cm59ZD1YYSgxNil8MDtpZigoYVsxMTAwOF18MCk9PTA/KFFhKDExMDA4KXwwKSE9MDowKXtjWzI3NTBdPTExNzg0OyRhKDExMDA4KX1ZZihkLDEsMTFlMywxMTA1Nik7Y1tkPj4yXT0xMTAyNDt3YihkfDAsMTExMDQsMTMxKX1mdW5jdGlvbiByZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTA7ZT1pO2NbYT4+Ml09MTEwNDg7Zj1jW2ErNDA+PjJdfDA7Yj1hKzMyfDA7ZD1hKzM2fDA7aWYoKGZ8MCkhPTApe2Rve2Y9ZisgLTF8MDtxY1tjWyhjW2I+PjJdfDApKyhmPDwyKT4+Ml0mMzFdKDAsYSxjWyhjW2Q+PjJdfDApKyhmPDwyKT4+Ml18MCl9d2hpbGUoKGZ8MCkhPTApfWY9Y1thKzI4Pj4yXXwwO2g9Zis0fDA7Zz1jW2g+PjJdfDA7Y1toPj4yXT1nKyAtMTtpZigoZ3wwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfXZuKGNbYj4+Ml18MCk7dm4oY1tkPj4yXXwwKTt2bihjW2ErNDg+PjJdfDApO3ZuKGNbYSs2MD4+Ml18MCk7aT1lO3JldHVybn1mdW5jdGlvbiBzZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTEwNjY0O2Q9Y1thKzQ+PjJdfDA7Zj1kKzR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlfDApIT0wKXt2bihhKTtpPWI7cmV0dXJufWxjW2NbKGNbZD4+Ml18MCkrOD4+Ml0mMjU1XShkKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHRnKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MDtiPWk7Y1thPj4yXT0xMDY2NDthPWNbYSs0Pj4yXXwwO2U9YSs0fDA7ZD1jW2U+PjJdfDA7Y1tlPj4yXT1kKyAtMTtpZigoZHwwKSE9MCl7aT1iO3JldHVybn1sY1tjWyhjW2E+PjJdfDApKzg+PjJdJjI1NV0oYSk7aT1iO3JldHVybn1mdW5jdGlvbiB1ZyhhLGIpe2E9YXwwO2I9YnwwO3JldHVybn1mdW5jdGlvbiB2ZyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGF8MH1mdW5jdGlvbiB3ZyhhLGIsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7Zz1hO2NbZz4+Ml09MDtjW2crND4+Ml09MDtnPWErOHwwO2NbZz4+Ml09LTE7Y1tnKzQ+PjJdPS0xO3JldHVybn1mdW5jdGlvbiB4ZyhhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtlPWE7Y1tlPj4yXT0wO2NbZSs0Pj4yXT0wO2U9YSs4fDA7Y1tlPj4yXT0tMTtjW2UrND4+Ml09LTE7cmV0dXJufWZ1bmN0aW9uIHlnKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIHpnKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIEFnKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MDtmPWk7aWYoKGV8MCk8PTApe2s9MDtpPWY7cmV0dXJuIGt8MH1nPWIrMTJ8MDtoPWIrMTZ8MDtqPTA7d2hpbGUoMSl7az1jW2c+PjJdfDA7aWYoaz4+PjA8KGNbaD4+Ml18MCk+Pj4wKXtjW2c+PjJdPWsrMTtrPWFbaz4+MF18MH1lbHNle2s9b2NbY1soY1tiPj4yXXwwKSs0MD4+Ml0mMTI3XShiKXwwO2lmKChrfDApPT0tMSl7ZT04O2JyZWFrfWs9ayYyNTV9YVtkPj4wXT1rO2o9aisxfDA7aWYoKGp8MCk8KGV8MCkpe2Q9ZCsxfDB9ZWxzZXtlPTg7YnJlYWt9fWlmKChlfDApPT04KXtpPWY7cmV0dXJuIGp8MH1yZXR1cm4gMH1mdW5jdGlvbiBCZyhhKXthPWF8MDtyZXR1cm4tMX1mdW5jdGlvbiBDZyhhKXthPWF8MDt2YXIgYj0wLGU9MDtiPWk7aWYoKG9jW2NbKGNbYT4+Ml18MCkrMzY+PjJdJjEyN10oYSl8MCk9PS0xKXthPS0xO2k9YjtyZXR1cm4gYXwwfWU9YSsxMnwwO2E9Y1tlPj4yXXwwO2NbZT4+Ml09YSsxO2E9ZFthPj4wXXwwO2k9YjtyZXR1cm4gYXwwfWZ1bmN0aW9uIERnKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuLTF9ZnVuY3Rpb24gRWcoYixlLGYpe2I9YnwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtnPWk7aWYoKGZ8MCk8PTApe2w9MDtpPWc7cmV0dXJuIGx8MH1qPWIrMjR8MDtoPWIrMjh8MDtrPTA7d2hpbGUoMSl7bD1jW2o+PjJdfDA7aWYoIShsPj4+MDwoY1toPj4yXXwwKT4+PjApKXtpZigoeGNbY1soY1tiPj4yXXwwKSs1Mj4+Ml0mNjNdKGIsZFtlPj4wXXwwKXwwKT09LTEpe2g9NzticmVha319ZWxzZXttPWFbZT4+MF18MDtjW2o+PjJdPWwrMTthW2w+PjBdPW19az1rKzF8MDtpZigoa3wwKTwoZnwwKSl7ZT1lKzF8MH1lbHNle2g9NzticmVha319aWYoKGh8MCk9PTcpe2k9ZztyZXR1cm4ga3wwfXJldHVybiAwfWZ1bmN0aW9uIEZnKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuLTF9ZnVuY3Rpb24gR2coYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT0xMDcyODtkPWNbYSs0Pj4yXXwwO2Y9ZCs0fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZXwwKSE9MCl7dm4oYSk7aT1iO3JldHVybn1sY1tjWyhjW2Q+PjJdfDApKzg+PjJdJjI1NV0oZCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBIZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2NbYT4+Ml09MTA3Mjg7YT1jW2ErND4+Ml18MDtlPWErNHwwO2Q9Y1tlPj4yXXwwO2NbZT4+Ml09ZCsgLTE7aWYoKGR8MCkhPTApe2k9YjtyZXR1cm59bGNbY1soY1thPj4yXXwwKSs4Pj4yXSYyNTVdKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gSWcoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm59ZnVuY3Rpb24gSmcoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBhfDB9ZnVuY3Rpb24gS2coYSxiLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2c9YTtjW2c+PjJdPTA7Y1tnKzQ+PjJdPTA7Zz1hKzh8MDtjW2c+PjJdPS0xO2NbZys0Pj4yXT0tMTtyZXR1cm59ZnVuY3Rpb24gTGcoYSxiLGQsZSl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7ZT1hO2NbZT4+Ml09MDtjW2UrND4+Ml09MDtlPWErOHwwO2NbZT4+Ml09LTE7Y1tlKzQ+PjJdPS0xO3JldHVybn1mdW5jdGlvbiBNZyhhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBOZyhhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBPZyhhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTA7ZT1pO2lmKChkfDApPD0wKXtqPTA7aT1lO3JldHVybiBqfDB9Zz1hKzEyfDA7Zj1hKzE2fDA7aD0wO3doaWxlKDEpe2o9Y1tnPj4yXXwwO2lmKCEoaj4+PjA8KGNbZj4+Ml18MCk+Pj4wKSl7aj1vY1tjWyhjW2E+PjJdfDApKzQwPj4yXSYxMjddKGEpfDA7aWYoKGp8MCk9PS0xKXthPTg7YnJlYWt9fWVsc2V7Y1tnPj4yXT1qKzQ7aj1jW2o+PjJdfDB9Y1tiPj4yXT1qO2g9aCsxfDA7aWYoKGh8MCk+PShkfDApKXthPTg7YnJlYWt9Yj1iKzR8MH1pZigoYXwwKT09OCl7aT1lO3JldHVybiBofDB9cmV0dXJuIDB9ZnVuY3Rpb24gUGcoYSl7YT1hfDA7cmV0dXJuLTF9ZnVuY3Rpb24gUWcoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1pO2lmKChvY1tjWyhjW2E+PjJdfDApKzM2Pj4yXSYxMjddKGEpfDApPT0tMSl7YT0tMTtpPWI7cmV0dXJuIGF8MH1kPWErMTJ8MDthPWNbZD4+Ml18MDtjW2Q+PjJdPWErNDthPWNbYT4+Ml18MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBSZyhhLGIpe2E9YXwwO2I9YnwwO3JldHVybi0xfWZ1bmN0aW9uIFNnKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTA7ZT1pO2lmKChkfDApPD0wKXtqPTA7aT1lO3JldHVybiBqfDB9Zz1hKzI0fDA7Zj1hKzI4fDA7aD0wO3doaWxlKDEpe2o9Y1tnPj4yXXwwO2lmKCEoaj4+PjA8KGNbZj4+Ml18MCk+Pj4wKSl7aWYoKHhjW2NbKGNbYT4+Ml18MCkrNTI+PjJdJjYzXShhLGNbYj4+Ml18MCl8MCk9PS0xKXtmPTg7YnJlYWt9fWVsc2V7az1jW2I+PjJdfDA7Y1tnPj4yXT1qKzQ7Y1tqPj4yXT1rfWg9aCsxfDA7aWYoKGh8MCk+PShkfDApKXtmPTg7YnJlYWt9Yj1iKzR8MH1pZigoZnwwKT09OCl7aT1lO3JldHVybiBofDB9cmV0dXJuIDB9ZnVuY3Rpb24gVGcoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4tMX1mdW5jdGlvbiBVZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBWZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBXZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2U9Y1soY1thPj4yXXwwKSsgLTEyPj4yXXwwO2Q9YStlfDA7cmcoYSsoZSs4KXwwKTtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFhnKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErKChjWyhjW2E+PjJdfDApKyAtMTI+PjJdfDApKzgpfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gWWcoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7aT1pKzE2fDA7ZT1kO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2lmKChjW2IrKGYrMjQpPj4yXXwwKT09MCl7aT1kO3JldHVybn1hW2U+PjBdPTA7Y1tlKzQ+PjJdPWI7aWYoKGNbYisoZisxNik+PjJdfDApPT0wKXtnPWNbYisoZis3Mik+PjJdfDA7aWYoKGd8MCkhPTApe1lnKGcpO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwfWFbZT4+MF09MTtnPWNbYisoZisyNCk+PjJdfDA7aWYoKG9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MCk9PS0xKXtnPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK2d8MCxjW2IrKGcrMTYpPj4yXXwxKX19Z2goZSk7aT1kO3JldHVybn1mdW5jdGlvbiBaZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBfZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aT1iO3JldHVybn1mdW5jdGlvbiAkZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2U9Y1soY1thPj4yXXwwKSsgLTEyPj4yXXwwO2Q9YStlfDA7cmcoYSsoZSs4KXwwKTtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGFoKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErKChjWyhjW2E+PjJdfDApKyAtMTI+PjJdfDApKzgpfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gYmgoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7aT1pKzE2fDA7ZT1kO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2lmKChjW2IrKGYrMjQpPj4yXXwwKT09MCl7aT1kO3JldHVybn1hW2U+PjBdPTA7Y1tlKzQ+PjJdPWI7aWYoKGNbYisoZisxNik+PjJdfDApPT0wKXtnPWNbYisoZis3Mik+PjJdfDA7aWYoKGd8MCkhPTApe2JoKGcpO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwfWFbZT4+MF09MTtnPWNbYisoZisyNCk+PjJdfDA7aWYoKG9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MCk9PS0xKXtnPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK2d8MCxjW2IrKGcrMTYpPj4yXXwxKX19cWgoZSk7aT1kO3JldHVybn1mdW5jdGlvbiBjaChhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzR8MCk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBkaChhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzR8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBlaChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2U9Y1soY1thPj4yXXwwKSsgLTEyPj4yXXwwO2Q9YStlfDA7cmcoYSsoZSs0KXwwKTtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGZoKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErKChjWyhjW2E+PjJdfDApKyAtMTI+PjJdfDApKzQpfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gZ2goYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTthPWErNHwwO2Q9Y1thPj4yXXwwO2U9Y1soY1tkPj4yXXwwKSsgLTEyPj4yXXwwO2lmKChjW2QrKGUrMjQpPj4yXXwwKT09MCl7aT1iO3JldHVybn1pZigoY1tkKyhlKzE2KT4+Ml18MCkhPTApe2k9YjtyZXR1cm59aWYoKGNbZCsoZSs0KT4+Ml0mODE5MnwwKT09MCl7aT1iO3JldHVybn1pZihZYSgpfDApe2k9YjtyZXR1cm59ZT1jW2E+PjJdfDA7ZT1jW2UrKChjWyhjW2U+PjJdfDApKyAtMTI+PjJdfDApKzI0KT4+Ml18MDtpZighKChvY1tjWyhjW2U+PjJdfDApKzI0Pj4yXSYxMjddKGUpfDApPT0tMSkpe2k9YjtyZXR1cm59ZD1jW2E+PjJdfDA7ZT1jWyhjW2Q+PjJdfDApKyAtMTI+PjJdfDA7cWcoZCtlfDAsY1tkKyhlKzE2KT4+Ml18MSk7aT1iO3JldHVybn1mdW5jdGlvbiBoaChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2g9aTtpPWkrMzJ8MDtrPWg7aj1oKzI0fDA7Zz1oKzE2fDA7Zj1oKzEyfDA7YVtnPj4wXT0wO2NbZys0Pj4yXT1iO249Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2IrKG4rMTYpPj4yXXwwKT09MCl7bT1jW2IrKG4rNzIpPj4yXXwwO2lmKChtfDApIT0wKXtZZyhtKTtuPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MH1hW2c+PjBdPTE7bz1jW2IrKG4rMjgpPj4yXXwwO3A9bys0fDA7Y1twPj4yXT0oY1twPj4yXXwwKSsxO2lmKCEoKGNbMzA0OF18MCk9PS0xKSl7Y1trPj4yXT0xMjE5MjtjW2srND4+Ml09MjA4O2Nbays4Pj4yXT0wO2NnKDEyMTkyLGspfW49KGNbMTIxOTY+PjJdfDApKyAtMXwwO209Y1tvKzg+PjJdfDA7aWYoKGNbbysxMj4+Ml18MCktbT4+Mj4+PjA+bj4+PjA/KGU9Y1ttKyhuPDwyKT4+Ml18MCwoZXwwKSE9MCk6MCl7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfXE9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO209Y1tiKyhxKzI0KT4+Ml18MDtuPWIrcXwwO289YisocSs3Nil8MDtwPWNbbz4+Ml18MDtkb3tpZigocHwwKT09LTEpe3E9Y1tiKyhxKzI4KT4+Ml18MDtwPXErNHwwO2NbcD4+Ml09KGNbcD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NTY7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ1NixrKX1yPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtzPWNbcSs4Pj4yXXwwO2lmKChjW3ErMTI+PjJdfDApLXM+PjI+Pj4wPnI+Pj4wPyhsPWNbcysocjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe2w9eGNbY1soY1tsPj4yXXwwKSsyOD4+Ml0mNjNdKGwsMzIpfDA7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfXA9bDw8MjQ+PjI0O2Nbbz4+Ml09cDticmVha31zPVhhKDQpfDA7Y1tzPj4yXT0yMTMwNDt3YihzfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7cj1wJjI1NTtzPWQmNjU1MzU7cT1jWyhjW2U+PjJdfDApKzI0Pj4yXXwwO2Nbaj4+Ml09bTtjW2srMD4+Ml09Y1tqKzA+PjJdO3djW3EmNjNdKGYsZSxrLG4scixzKTtpZigoY1tmPj4yXXwwKSE9MCl7YnJlYWt9cz1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7cWcoYitzfDAsY1tiKyhzKzE2KT4+Ml18NSk7YnJlYWt9cz1YYSg0KXwwO2Nbcz4+Ml09MjEzMDQ7d2Ioc3wwLDIxMzc2LDE5Nil9fXdoaWxlKDApO2doKGcpO2k9aDtyZXR1cm4gYnwwfWZ1bmN0aW9uIGloKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7aD1pO2k9aSszMnwwO2s9aDtqPWgrMjR8MDtnPWgrMTZ8MDtmPWgrMTJ8MDthW2c+PjBdPTA7Y1tnKzQ+PjJdPWI7bj1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7ZG97aWYoKGNbYisobisxNik+PjJdfDApPT0wKXttPWNbYisobis3Mik+PjJdfDA7aWYoKG18MCkhPTApe1lnKG0pO249Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwfWFbZz4+MF09MTtvPWNbYisobisyOCk+PjJdfDA7cD1vKzR8MDtjW3A+PjJdPShjW3A+PjJdfDApKzE7aWYoISgoY1szMDQ4XXwwKT09LTEpKXtjW2s+PjJdPTEyMTkyO2Nbays0Pj4yXT0yMDg7Y1trKzg+PjJdPTA7Y2coMTIxOTIsayl9bj0oY1sxMjE5Nj4+Ml18MCkrIC0xfDA7bT1jW28rOD4+Ml18MDtpZigoY1tvKzEyPj4yXXwwKS1tPj4yPj4+MD5uPj4+MD8oZT1jW20rKG48PDIpPj4yXXwwLChlfDApIT0wKTowKXtzPWNbcD4+Ml18MDtjW3A+PjJdPXMrIC0xO2lmKChzfDApPT0wKXtsY1tjWyhjW28+PjJdfDApKzg+PjJdJjI1NV0obyl9cT1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7bT1jW2IrKHErMjQpPj4yXXwwO249YitxfDA7bz1iKyhxKzc2KXwwO3A9Y1tvPj4yXXwwO2Rve2lmKChwfDApPT0tMSl7cT1jW2IrKHErMjgpPj4yXXwwO3A9cSs0fDA7Y1twPj4yXT0oY1twPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1trPj4yXT0xMzQ1NjtjW2srND4+Ml09MjA4O2Nbays4Pj4yXT0wO2NnKDEzNDU2LGspfXI9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3M9Y1txKzg+PjJdfDA7aWYoKGNbcSsxMj4+Ml18MCktcz4+Mj4+PjA+cj4+PjA/KGw9Y1tzKyhyPDwyKT4+Ml18MCwobHwwKSE9MCk6MCl7bD14Y1tjWyhjW2w+PjJdfDApKzI4Pj4yXSY2M10obCwzMil8MDtzPWNbcD4+Ml18MDtjW3A+PjJdPXMrIC0xO2lmKChzfDApPT0wKXtsY1tjWyhjW3E+PjJdfDApKzg+PjJdJjI1NV0ocSl9cD1sPDwyND4+MjQ7Y1tvPj4yXT1wO2JyZWFrfXM9WGEoNCl8MDtjW3M+PjJdPTIxMzA0O3diKHN8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtzPXAmMjU1O3I9Y1soY1tlPj4yXXwwKSsxNj4+Ml18MDtjW2o+PjJdPW07Y1trKzA+PjJdPWNbaiswPj4yXTt3Y1tyJjYzXShmLGUsayxuLHMsZCk7aWYoKGNbZj4+Ml18MCkhPTApe2JyZWFrfXM9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO3FnKGIrc3wwLGNbYisocysxNik+PjJdfDUpO2JyZWFrfXM9WGEoNCl8MDtjW3M+PjJdPTIxMzA0O3diKHN8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtnaChnKTtpPWg7cmV0dXJuIGJ8MH1mdW5jdGlvbiBqaChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2g9aTtpPWkrMzJ8MDtrPWg7aj1oKzI0fDA7Zz1oKzE2fDA7Zj1oKzEyfDA7YVtnPj4wXT0wO2NbZys0Pj4yXT1iO249Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2IrKG4rMTYpPj4yXXwwKT09MCl7bT1jW2IrKG4rNzIpPj4yXXwwO2lmKChtfDApIT0wKXtZZyhtKTtuPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MH1hW2c+PjBdPTE7bz1jW2IrKG4rMjgpPj4yXXwwO3A9bys0fDA7Y1twPj4yXT0oY1twPj4yXXwwKSsxO2lmKCEoKGNbMzA0OF18MCk9PS0xKSl7Y1trPj4yXT0xMjE5MjtjW2srND4+Ml09MjA4O2Nbays4Pj4yXT0wO2NnKDEyMTkyLGspfW49KGNbMTIxOTY+PjJdfDApKyAtMXwwO209Y1tvKzg+PjJdfDA7aWYoKGNbbysxMj4+Ml18MCktbT4+Mj4+PjA+bj4+PjA/KGU9Y1ttKyhuPDwyKT4+Ml18MCwoZXwwKSE9MCk6MCl7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfXE9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO209Y1tiKyhxKzI0KT4+Ml18MDtuPWIrcXwwO289YisocSs3Nil8MDtwPWNbbz4+Ml18MDtkb3tpZigocHwwKT09LTEpe3E9Y1tiKyhxKzI4KT4+Ml18MDtwPXErNHwwO2NbcD4+Ml09KGNbcD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NTY7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ1NixrKX1yPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtzPWNbcSs4Pj4yXXwwO2lmKChjW3ErMTI+PjJdfDApLXM+PjI+Pj4wPnI+Pj4wPyhsPWNbcysocjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe2w9eGNbY1soY1tsPj4yXXwwKSsyOD4+Ml0mNjNdKGwsMzIpfDA7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfXA9bDw8MjQ+PjI0O2Nbbz4+Ml09cDticmVha31zPVhhKDQpfDA7Y1tzPj4yXT0yMTMwNDt3YihzfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7cz1wJjI1NTtyPWNbKGNbZT4+Ml18MCkrMjQ+PjJdfDA7Y1tqPj4yXT1tO2NbayswPj4yXT1jW2orMD4+Ml07d2NbciY2M10oZixlLGssbixzLGQpO2lmKChjW2Y+PjJdfDApIT0wKXticmVha31zPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK3N8MCxjW2IrKHMrMTYpPj4yXXw1KTticmVha31zPVhhKDQpfDA7Y1tzPj4yXT0yMTMwNDt3YihzfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Z2goZyk7aT1oO3JldHVybiBifDB9ZnVuY3Rpb24ga2goYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wO2g9aTtpPWkrMzJ8MDtsPWg7aj1oKzI0fDA7Zz1oKzE2fDA7Zj1oKzEyfDA7YVtnPj4wXT0wO2NbZys0Pj4yXT1iO289Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2IrKG8rMTYpPj4yXXwwKT09MCl7bj1jW2IrKG8rNzIpPj4yXXwwO2lmKChufDApIT0wKXtZZyhuKTtvPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MH1hW2c+PjBdPTE7cD1jW2IrKG8rMjgpPj4yXXwwO3E9cCs0fDA7Y1txPj4yXT0oY1txPj4yXXwwKSsxO2lmKCEoKGNbMzA0OF18MCk9PS0xKSl7Y1tsPj4yXT0xMjE5MjtjW2wrND4+Ml09MjA4O2NbbCs4Pj4yXT0wO2NnKDEyMTkyLGwpfW89KGNbMTIxOTY+PjJdfDApKyAtMXwwO249Y1twKzg+PjJdfDA7aWYoKGNbcCsxMj4+Ml18MCktbj4+Mj4+PjA+bz4+PjA/KGs9Y1tuKyhvPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7dD1jW3E+PjJdfDA7Y1txPj4yXT10KyAtMTtpZigodHwwKT09MCl7bGNbY1soY1twPj4yXXwwKSs4Pj4yXSYyNTVdKHApfXI9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO249Y1tiKyhyKzI0KT4+Ml18MDtvPWIrcnwwO3A9Yisocis3Nil8MDtxPWNbcD4+Ml18MDtkb3tpZigocXwwKT09LTEpe3I9Y1tiKyhyKzI4KT4+Ml18MDtxPXIrNHwwO2NbcT4+Ml09KGNbcT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1zPShjWzEzNDYwPj4yXXwwKSsgLTF8MDt0PWNbcis4Pj4yXXwwO2lmKChjW3IrMTI+PjJdfDApLXQ+PjI+Pj4wPnM+Pj4wPyhtPWNbdCsoczw8Mik+PjJdfDAsKG18MCkhPTApOjApe209eGNbY1soY1ttPj4yXXwwKSsyOD4+Ml0mNjNdKG0sMzIpfDA7dD1jW3E+PjJdfDA7Y1txPj4yXT10KyAtMTtpZigodHwwKT09MCl7bGNbY1soY1tyPj4yXXwwKSs4Pj4yXSYyNTVdKHIpfXE9bTw8MjQ+PjI0O2NbcD4+Ml09cTticmVha310PVhhKDQpfDA7Y1t0Pj4yXT0yMTMwNDt3Yih0fDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7dD1xJjI1NTtzPWNbKGNbaz4+Ml18MCkrMjg+PjJdfDA7Y1tqPj4yXT1uO2NbbCswPj4yXT1jW2orMD4+Ml07aWNbcyY2M10oZixrLGwsbyx0LGQsZSk7aWYoKGNbZj4+Ml18MCkhPTApe2JyZWFrfXQ9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO3FnKGIrdHwwLGNbYisodCsxNik+PjJdfDUpO2JyZWFrfXQ9WGEoNCl8MDtjW3Q+PjJdPTIxMzA0O3diKHR8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtnaChnKTtpPWg7cmV0dXJuIGJ8MH1mdW5jdGlvbiBsaChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2U9aTtpPWkrMTZ8MDtmPWU7YVtmPj4wXT0wO2NbZis0Pj4yXT1iO2g9Y1tiPj4yXXwwO2c9Y1toKyAtMTI+PjJdfDA7ZG97aWYoKGNbYisoZysxNik+PjJdfDApPT0wKXtqPWNbYisoZys3Mik+PjJdfDA7aWYoKGp8MCkhPTApe1lnKGopO2c9Y1tiPj4yXXwwO2g9ZztnPWNbZysgLTEyPj4yXXwwfWFbZj4+MF09MTtnPWNbYisoZysyNCk+PjJdfDA7aWYoKGd8MCkhPTApe2o9ZysyNHwwO2g9Y1tqPj4yXXwwO2lmKChofDApIT0oY1tnKzI4Pj4yXXwwKSl7Y1tqPj4yXT1oKzE7YVtoPj4wXT1kO2JyZWFrfWlmKCEoKHhjW2NbKGNbZz4+Ml18MCkrNTI+PjJdJjYzXShnLGQmMjU1KXwwKT09LTEpKXticmVha31oPWNbYj4+Ml18MH1qPWNbaCsgLTEyPj4yXXwwO3FnKGIranwwLGNbYisoaisxNik+PjJdfDEpfX13aGlsZSgwKTtnaChmKTtpPWU7cmV0dXJufWZ1bmN0aW9uIG1oKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErNHwwKTtpZigoYXwwKT09MCl7aT1iO3JldHVybn12bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIG5oKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErNHwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIG9oKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MDtiPWk7ZT1jWyhjW2E+PjJdfDApKyAtMTI+PjJdfDA7ZD1hK2V8MDtyZyhhKyhlKzQpfDApO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gcGgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7cmcoYSsoKGNbKGNbYT4+Ml18MCkrIC0xMj4+Ml18MCkrNCl8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBxaChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2E9YSs0fDA7ZD1jW2E+PjJdfDA7ZT1jWyhjW2Q+PjJdfDApKyAtMTI+PjJdfDA7aWYoKGNbZCsoZSsyNCk+PjJdfDApPT0wKXtpPWI7cmV0dXJufWlmKChjW2QrKGUrMTYpPj4yXXwwKSE9MCl7aT1iO3JldHVybn1pZigoY1tkKyhlKzQpPj4yXSY4MTkyfDApPT0wKXtpPWI7cmV0dXJufWlmKFlhKCl8MCl7aT1iO3JldHVybn1lPWNbYT4+Ml18MDtlPWNbZSsoKGNbKGNbZT4+Ml18MCkrIC0xMj4+Ml18MCkrMjQpPj4yXXwwO2lmKCEoKG9jW2NbKGNbZT4+Ml18MCkrMjQ+PjJdJjEyN10oZSl8MCk9PS0xKSl7aT1iO3JldHVybn1kPWNbYT4+Ml18MDtlPWNbKGNbZD4+Ml18MCkrIC0xMj4+Ml18MDtxZyhkK2V8MCxjW2QrKGUrMTYpPj4yXXwxKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHJoKGEpe2E9YXwwO3JldHVybiAxMDk0NH1mdW5jdGlvbiBzaChiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTA7ZD1pO2lmKChlfDApPT0xKXtlZyhiLDEwOTYwLDM1KTtpPWQ7cmV0dXJufWc9TmIoZXwwKXwwO2U9Sm4oZ3wwKXwwO2lmKGU+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9ZG97aWYoZT4+PjA8MTEpe2FbYj4+MF09ZTw8MTtrPWIrMXwwfWVsc2V7aD1lKzE2Ji0xNjtqPShofDApPT0wPzE6aDt3aGlsZSgxKXtrPXVuKGopfDA7aWYoKGt8MCkhPTApe2Y9MTI7YnJlYWt9az1jWzU2NjZdfDA7Y1s1NjY2XT1rKzA7aWYoKGt8MCk9PTApe2JyZWFrfXNjW2smMzFdKCl9aWYoKGZ8MCk9PTEyKXtjW2IrOD4+Ml09aztjW2I+PjJdPWh8MTtjW2IrND4+Ml09ZTticmVha31rPVhhKDQpfDA7Y1trPj4yXT0yMjY4MDt3YihrfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7TG4oa3wwLGd8MCxlfDApfDA7YVtrK2U+PjBdPTA7aT1kO3JldHVybn1mdW5jdGlvbiB0aChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gdWgoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApfVJiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiB2aChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gd2goYSl7YT1hfDA7dmFyIGI9MDtiPWk7cmcoYSk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geGgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geWgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gemgoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEFoKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBCaChiLGMsZCxlLGYpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MDtiPWk7YTpkb3tpZigoZXwwKT09KGZ8MCkpe2c9Nn1lbHNle3doaWxlKDEpe2lmKChjfDApPT0oZHwwKSl7ZD0tMTticmVhayBhfWg9YVtjPj4wXXwwO2o9YVtlPj4wXXwwO2lmKGg8PDI0Pj4yNDxqPDwyND4+MjQpe2Q9LTE7YnJlYWsgYX1pZihqPDwyND4+MjQ8aDw8MjQ+PjI0KXtkPTE7YnJlYWsgYX1jPWMrMXwwO2U9ZSsxfDA7aWYoKGV8MCk9PShmfDApKXtnPTY7YnJlYWt9fX19d2hpbGUoMCk7aWYoKGd8MCk9PTYpe2Q9KGN8MCkhPShkfDApJjF9aT1iO3JldHVybiBkfDB9ZnVuY3Rpb24gQ2goYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2Q9aTtnPWU7aj1mLWd8MDtpZihqPj4+MD40Mjk0OTY3Mjc5KXtkZygpfWRve2lmKGo+Pj4wPDExKXthW2I+PjBdPWo8PDE7bT1iKzF8MH1lbHNle2s9aisxNiYtMTY7bD0oa3wwKT09MD8xOms7d2hpbGUoMSl7bT11bihsKXwwO2lmKChtfDApIT0wKXtoPTExO2JyZWFrfW09Y1s1NjY2XXwwO2NbNTY2Nl09bSswO2lmKChtfDApPT0wKXticmVha31zY1ttJjMxXSgpfWlmKChofDApPT0xMSl7Y1tiKzg+PjJdPW07Y1tiPj4yXT1rfDE7Y1tiKzQ+PjJdPWo7YnJlYWt9bT1YYSg0KXwwO2NbbT4+Ml09MjI2ODA7d2IobXwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKChlfDApPT0oZnwwKSl7YVttPj4wXT0wO2k9ZDtyZXR1cm59ZWxzZXtiPW19d2hpbGUoMSl7YVtiPj4wXT1hW2U+PjBdfDA7ZT1lKzF8MDtpZigoZXwwKT09KGZ8MCkpe2JyZWFrfWVsc2V7Yj1iKzF8MH19bT1tKyhmKygwLWcpKXwwO2FbbT4+MF09MDtpPWQ7cmV0dXJufWZ1bmN0aW9uIERoKGIsYyxkKXtiPWJ8MDtjPWN8MDtkPWR8MDt2YXIgZT0wLGY9MDtiPWk7aWYoKGN8MCk9PShkfDApKXtlPTA7aT1iO3JldHVybiBlfDB9ZWxzZXtlPTB9ZG97ZT0oYVtjPj4wXXwwKSsoZTw8NCl8MDtmPWUmLTI2ODQzNTQ1NjtlPShmPj4+MjR8ZileZTtjPWMrMXwwfXdoaWxlKChjfDApIT0oZHwwKSk7aT1iO3JldHVybiBlfDB9ZnVuY3Rpb24gRWgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gRmgoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEdoKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wO2E9aTthOmRve2lmKChlfDApPT0oZnwwKSl7Zz02fWVsc2V7d2hpbGUoMSl7aWYoKGJ8MCk9PShkfDApKXtkPS0xO2JyZWFrIGF9aD1jW2I+PjJdfDA7aj1jW2U+PjJdfDA7aWYoKGh8MCk8KGp8MCkpe2Q9LTE7YnJlYWsgYX1pZigoanwwKTwoaHwwKSl7ZD0xO2JyZWFrIGF9Yj1iKzR8MDtlPWUrNHwwO2lmKChlfDApPT0oZnwwKSl7Zz02O2JyZWFrfX19fXdoaWxlKDApO2lmKChnfDApPT02KXtkPShifDApIT0oZHwwKSYxfWk9YTtyZXR1cm4gZHwwfWZ1bmN0aW9uIEhoKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtkPWk7aD1lO2s9Zi1ofDA7aj1rPj4yO2lmKGo+Pj4wPjEwNzM3NDE4MDcpe2RnKCl9ZG97aWYoaj4+PjA8Mil7YVtiPj4wXT1rPj4+MTttPWIrNHwwfWVsc2V7az1qKzQmLTQ7bD1rPDwyO2w9KGx8MCk9PTA/MTpsO3doaWxlKDEpe209dW4obCl8MDtpZigobXwwKSE9MCl7Zz0xMTticmVha31tPWNbNTY2Nl18MDtjWzU2NjZdPW0rMDtpZigobXwwKT09MCl7YnJlYWt9c2NbbSYzMV0oKX1pZigoZ3wwKT09MTEpe2NbYis4Pj4yXT1tO2NbYj4+Ml09a3wxO2NbYis0Pj4yXT1qO2JyZWFrfW09WGEoNCl8MDtjW20+PjJdPTIyNjgwO3diKG18MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZigoZXwwKT09KGZ8MCkpe2NbbT4+Ml09MDtpPWQ7cmV0dXJufWI9ZisgLTQrKDAtaCl8MDtnPW07d2hpbGUoMSl7Y1tnPj4yXT1jW2U+PjJdO2U9ZSs0fDA7aWYoKGV8MCk9PShmfDApKXticmVha31lbHNle2c9Zys0fDB9fW09bSsoKGI+Pj4yKSsxPDwyKXwwO2NbbT4+Ml09MDtpPWQ7cmV0dXJufWZ1bmN0aW9uIEloKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MDthPWk7aWYoKGJ8MCk9PShkfDApKXtlPTA7aT1hO3JldHVybiBlfDB9ZWxzZXtlPTB9ZG97ZT0oY1tiPj4yXXwwKSsoZTw8NCl8MDtmPWUmLTI2ODQzNTQ1NjtlPShmPj4+MjR8ZileZTtiPWIrNHwwfXdoaWxlKChifDApIT0oZHwwKSk7aT1hO3JldHVybiBlfDB9ZnVuY3Rpb24gSmgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gS2goYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIExoKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2s9aTtpPWkrNjR8MDtwPWs7dT1rKzQ4fDA7cT1rKzUyfDA7dD1rKzU2fDA7cz1rKzE2fDA7cj1rKzEyfDA7bD1rKzI0fDA7aWYoKGNbZys0Pj4yXSYxfDApPT0wKXtjW3E+PjJdPS0xO2w9Y1soY1tkPj4yXXwwKSsxNj4+Ml18MDtjW3M+PjJdPWNbZT4+Ml07Y1tyPj4yXT1jW2Y+PjJdO2NbdSswPj4yXT1jW3MrMD4+Ml07Y1twKzA+PjJdPWNbciswPj4yXTtpY1tsJjYzXSh0LGQsdSxwLGcsaCxxKTtsPWNbdD4+Ml18MDtjW2U+PjJdPWw7ZT1jW3E+PjJdfDA7aWYoKGV8MCk9PTApe2Fbaj4+MF09MH1lbHNlIGlmKChlfDApPT0xKXthW2o+PjBdPTF9ZWxzZXthW2o+PjBdPTE7Y1toPj4yXT00fWNbYj4+Ml09bDtpPWs7cmV0dXJufXE9ZysyOHwwO3I9Y1txPj4yXXwwO2Q9cis0fDA7Y1tkPj4yXT0oY1tkPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1twPj4yXT0xMzQ1NjtjW3ArND4+Ml09MjA4O2NbcCs4Pj4yXT0wO2NnKDEzNDU2LHApfXM9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3Q9Y1tyKzg+PjJdfDA7aWYoKGNbcisxMj4+Ml18MCktdD4+Mj4+PjA+cz4+PjA/KG89Y1t0KyhzPDwyKT4+Ml18MCwob3wwKSE9MCk6MCl7dT1yKzR8MDtkPWNbdT4+Ml18MDtjW3U+PjJdPWQrIC0xO2lmKChkfDApPT0wKXtsY1tjWyhjW3I+PjJdfDApKzg+PjJdJjI1NV0ocil9cT1jW3E+PjJdfDA7ZD1xKzR8MDtjW2Q+PjJdPShjW2Q+PjJdfDApKzE7aWYoISgoY1szNDAwXXwwKT09LTEpKXtjW3A+PjJdPTEzNjAwO2NbcCs0Pj4yXT0yMDg7Y1twKzg+PjJdPTA7Y2coMTM2MDAscCl9cD0oY1sxMzYwND4+Ml18MCkrIC0xfDA7cj1jW3ErOD4+Ml18MDtpZigoY1txKzEyPj4yXXwwKS1yPj4yPj4+MD5wPj4+MD8obj1jW3IrKHA8PDIpPj4yXXwwLChufDApIT0wKTowKXt1PXErNHwwO2Q9Y1t1Pj4yXXwwO2NbdT4+Ml09ZCsgLTE7aWYoKGR8MCk9PTApe2xjW2NbKGNbcT4+Ml18MCkrOD4+Ml0mMjU1XShxKX1tY1tjWyhjW24+PjJdfDApKzI0Pj4yXSYxMjddKGwsbik7ZD1sKzEyfDA7bWNbY1soY1tuPj4yXXwwKSsyOD4+Ml0mMTI3XShkLG4pO2Fbaj4+MF09KE1oKGUsY1tmPj4yXXwwLGwsbCsyNHwwLG8saCwxKXwwKT09KGx8MCkmMTtjW2I+PjJdPWNbZT4+Ml07aWYoISgoYVtkPj4wXSYxKT09MCk/KG09Y1tsKzIwPj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZigoYVtsPj4wXSYxKT09MCl7aT1rO3JldHVybn1iPWNbbCs4Pj4yXXwwO2lmKChifDApPT0wKXtpPWs7cmV0dXJufXZuKGIpO2k9aztyZXR1cm59ZD1YYSg0KXwwO2NbZD4+Ml09MjEzMDQ7d2IoZHwwLDIxMzc2LDE5Nil9ZD1YYSg0KXwwO2NbZD4+Ml09MjEzMDQ7d2IoZHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gTWgoYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MDttPWk7aT1pKzExMnwwO289bTt0PShnLWZ8MCkvMTJ8MDtpZih0Pj4+MD4xMDApe289dW4odCl8MDtpZigob3wwKT09MCl7QT1YYSg0KXwwO2NbQT4+Ml09MjI2ODA7d2IoQXwwLDIyNzI4LDIwNil9ZWxzZXtsPW99fWVsc2V7bD0wfXA9KGZ8MCk9PShnfDApO2lmKHApe3U9MH1lbHNle3E9Zjt1PTA7cj1vO3doaWxlKDEpe3M9YVtxPj4wXXwwO2lmKChzJjEpPT0wKXtzPShzJjI1NSk+Pj4xfWVsc2V7cz1jW3ErND4+Ml18MH1pZigoc3wwKT09MCl7YVtyPj4wXT0yO3U9dSsxfDA7dD10KyAtMXwwfWVsc2V7YVtyPj4wXT0xfXE9cSsxMnwwO2lmKChxfDApPT0oZ3wwKSl7YnJlYWt9ZWxzZXtyPXIrMXwwfX19cT0wO2E6d2hpbGUoMSl7dj0odHwwKSE9MDtyPXE7d2hpbGUoMSl7cT1jW2I+PjJdfDA7ZG97aWYoKHF8MCkhPTApe2lmKChjW3ErMTI+PjJdfDApPT0oY1txKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbcT4+Ml18MCkrMzY+PjJdJjEyN10ocSl8MCk9PS0xKXtjW2I+PjJdPTA7cT0wO2JyZWFrfWVsc2V7cT1jW2I+PjJdfDA7YnJlYWt9fX1lbHNle3E9MH19d2hpbGUoMCk7dz0ocXwwKT09MDtpZigoZXwwKSE9MCl7aWYoKGNbZSsxMj4+Ml18MCk9PShjW2UrMTY+PjJdfDApKXtBPShvY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDApPT0tMTtxPUE/MDplO2U9QT8wOmV9ZWxzZXtxPWV9fWVsc2V7cT0wO2U9MH1zPShxfDApPT0wO3g9Y1tiPj4yXXwwO2lmKCEoKHdecykmdikpe2JyZWFrIGF9cT1jW3grMTI+PjJdfDA7aWYoKHF8MCk9PShjW3grMTY+PjJdfDApKXtxPW9jW2NbKGNbeD4+Ml18MCkrMzY+PjJdJjEyN10oeCl8MH1lbHNle3E9ZFtxPj4wXXwwfXM9cSYyNTU7aWYoIWspe3M9eGNbY1soY1toPj4yXXwwKSsxMj4+Ml0mNjNdKGgscyl8MH1xPXIrMXwwO2lmKHApe3I9cX1lbHNle2JyZWFrfX1iOmRve2lmKGspe3g9MDt2PWY7dz1vO3doaWxlKDEpe2Rve2lmKChhW3c+PjBdfDApPT0xKXt5PWFbdj4+MF18MDt6PSh5JjEpPT0wO2lmKHope0E9disxfDB9ZWxzZXtBPWNbdis4Pj4yXXwwfWlmKCEoczw8MjQ+PjI0PT0oYVtBK3I+PjBdfDApKSl7YVt3Pj4wXT0wO3Q9dCsgLTF8MDticmVha31pZih6KXt4PSh5JjI1NSk+Pj4xfWVsc2V7eD1jW3YrND4+Ml18MH1pZigoeHwwKT09KHF8MCkpe2Fbdz4+MF09Mjt4PTE7dT11KzF8MDt0PXQrIC0xfDB9ZWxzZXt4PTF9fX13aGlsZSgwKTt2PXYrMTJ8MDtpZigodnwwKT09KGd8MCkpe2JyZWFrIGJ9dz13KzF8MH19ZWxzZXt4PTA7dj1mO3c9bzt3aGlsZSgxKXtkb3tpZigoYVt3Pj4wXXwwKT09MSl7aWYoKGFbdj4+MF0mMSk9PTApe3k9disxfDB9ZWxzZXt5PWNbdis4Pj4yXXwwfWlmKCEoczw8MjQ+PjI0PT0oeGNbY1soY1toPj4yXXwwKSsxMj4+Ml0mNjNdKGgsYVt5K3I+PjBdfDApfDApPDwyND4+MjQpKXthW3c+PjBdPTA7dD10KyAtMXwwO2JyZWFrfXg9YVt2Pj4wXXwwO2lmKCh4JjEpPT0wKXt4PSh4JjI1NSk+Pj4xfWVsc2V7eD1jW3YrND4+Ml18MH1pZigoeHwwKT09KHF8MCkpe2Fbdz4+MF09Mjt4PTE7dT11KzF8MDt0PXQrIC0xfDB9ZWxzZXt4PTF9fX13aGlsZSgwKTt2PXYrMTJ8MDtpZigodnwwKT09KGd8MCkpe2JyZWFrIGJ9dz13KzF8MH19fXdoaWxlKDApO2lmKCF4KXtjb250aW51ZX12PWNbYj4+Ml18MDtzPXYrMTJ8MDtyPWNbcz4+Ml18MDtpZigocnwwKT09KGNbdisxNj4+Ml18MCkpe29jW2NbKGNbdj4+Ml18MCkrNDA+PjJdJjEyN10odil8MH1lbHNle2Nbcz4+Ml09cisxfWlmKCh0K3V8MCk+Pj4wPDIpe2NvbnRpbnVlfWVsc2V7cz1mO3I9b313aGlsZSgxKXtpZigoYVtyPj4wXXwwKT09Mil7dj1hW3M+PjBdfDA7aWYoKHYmMSk9PTApe3Y9KHYmMjU1KT4+PjF9ZWxzZXt2PWNbcys0Pj4yXXwwfWlmKCh2fDApIT0ocXwwKSl7YVtyPj4wXT0wO3U9dSsgLTF8MH19cz1zKzEyfDA7aWYoKHN8MCk9PShnfDApKXtjb250aW51ZSBhfWVsc2V7cj1yKzF8MH19fWRve2lmKCh4fDApIT0wKXtpZigoY1t4KzEyPj4yXXwwKT09KGNbeCsxNj4+Ml18MCkpe2lmKChvY1tjWyhjW3g+PjJdfDApKzM2Pj4yXSYxMjddKHgpfDApPT0tMSl7Y1tiPj4yXT0wO3g9MDticmVha31lbHNle3g9Y1tiPj4yXXwwO2JyZWFrfX19ZWxzZXt4PTB9fXdoaWxlKDApO2g9KHh8MCk9PTA7ZG97aWYoIXMpe2lmKChjW3ErMTI+PjJdfDApIT0oY1txKzE2Pj4yXXwwKSl7aWYoaCl7YnJlYWt9ZWxzZXtuPTg1O2JyZWFrfX1pZighKChvY1tjWyhjW3E+PjJdfDApKzM2Pj4yXSYxMjddKHEpfDApPT0tMSkpe2lmKCFoKXtuPTg1fX1lbHNle249ODN9fWVsc2V7bj04M319d2hpbGUoMCk7aWYoKG58MCk9PTgzP2g6MCl7bj04NX1pZigobnwwKT09ODUpe2Nbaj4+Ml09Y1tqPj4yXXwyfWM6ZG97aWYoIXApe2lmKChhW28+PjBdfDApPT0yKXtnPWZ9ZWxzZXt3aGlsZSgxKXtmPWYrMTJ8MDtvPW8rMXwwO2lmKChmfDApPT0oZ3wwKSl7bj05MDticmVhayBjfWlmKChhW28+PjBdfDApPT0yKXtnPWY7YnJlYWt9fX19ZWxzZXtuPTkwfX13aGlsZSgwKTtpZigobnwwKT09OTApe2Nbaj4+Ml09Y1tqPj4yXXw0fWlmKChsfDApPT0wKXtpPW07cmV0dXJuIGd8MH12bihsKTtpPW07cmV0dXJuIGd8MH1mdW5jdGlvbiBOaChiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MDtlPWk7aT1pKzIyNHwwO3Y9ZSsxOTh8MDt1PWUrMTk2fDA7bj1lKzE2fDA7bz1lKzR8MDtxPWUrMTkyfDA7cz1lKzMyfDA7cj1lO3Q9ZSsyOHwwO3k9Y1tmPj4yXXwwO0E9Y1tnPj4yXXwwO2c9Y1toKzQ+PjJdJjc0O2lmKChnfDApPT04KXtnPTE2fWVsc2UgaWYoKGd8MCk9PTApe2c9MH1lbHNlIGlmKChnfDApPT02NCl7Zz04fWVsc2V7Zz0xMH1taShuLGgsdix1KTtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtoZyhvLDEwKTtpZigoYVtvPj4wXSYxKT09MCl7Qj1vKzF8MDt3PUI7Zj1vKzh8MH1lbHNle0I9bys4fDA7dz1vKzF8MDtmPUI7Qj1jW0I+PjJdfDB9Y1txPj4yXT1CO2Nbcj4+Ml09cztjW3Q+PjJdPTA7aD1vKzR8MDt4PWFbdT4+MF18MDt1PW8rOHwwO2E6d2hpbGUoMSl7aWYoKHl8MCkhPTApe2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RT0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7eT1FPzA6eX19ZWxzZXt5PTB9ej0oeXwwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZih6KXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xKSl7aWYoIXope2JyZWFrIGF9fWVsc2V7bD0xOX19ZWxzZXtsPTE5fX13aGlsZSgwKTtpZigobHwwKT09MTkpe2w9MDtpZih6KXtBPTA7YnJlYWt9ZWxzZXtBPTB9fUQ9YVtvPj4wXXwwO0M9KEQmMSk9PTA7aWYoQyl7RT0oRCYyNTUpPj4+MX1lbHNle0U9Y1toPj4yXXwwfWlmKCgoY1txPj4yXXwwKS1CfDApPT0oRXwwKSl7aWYoQyl7Qj0oRCYyNTUpPj4+MTtFPShEJjI1NSk+Pj4xO0Q9Qjw8MX1lbHNle0I9Y1toPj4yXXwwO0U9Y1toPj4yXXwwO0Q9Qjw8MX1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUI8PDI7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtFPWFbbz4+MF18MDtpZigoRSYxKT09MCl7RD0xMH1lbHNle0Q9Y1tvPj4yXXwwO0U9RCYyNTU7RD0oRCYtMikrIC0xfDB9Qz0oRSYxKT09MDtpZihDKXtFPShFJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9ZG97aWYoIShFPj4+MDxEPj4+MCkpe2lmKEMpe2FbbytEKzE+PjBdPTA7YVtvPj4wXT1EPDwxO2JyZWFrfWVsc2V7YVsoY1t1Pj4yXXwwKStEPj4wXT0wO2NbaD4+Ml09RDticmVha319ZWxzZXtoZyhvLEQtRXwwKX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9d31lbHNle0M9Y1tmPj4yXXwwfWNbcT4+Ml09QytCO0I9Q31EPXkrMTJ8MDtFPWNbRD4+Ml18MDtDPXkrMTZ8MDtpZigoRXwwKT09KGNbQz4+Ml18MCkpe0U9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7RT1kW0U+PjBdfDB9aWYoKFhoKEUmMjU1LGcsQixxLHQseCxuLHMscix2KXwwKSE9MCl7YnJlYWt9ej1jW0Q+PjJdfDA7aWYoKHp8MCk9PShjW0M+PjJdfDApKXtvY1tjWyhjW3k+PjJdfDApKzQwPj4yXSYxMjddKHkpfDA7Y29udGludWV9ZWxzZXtjW0Q+PjJdPXorMTtjb250aW51ZX19dj1hW24+PjBdfDA7aWYoKHYmMSk9PTApe3Y9KHYmMjU1KT4+PjF9ZWxzZXt2PWNbbis0Pj4yXXwwfWlmKCh2fDApIT0wPyhwPWNbcj4+Ml18MCwocC1zfDApPDE2MCk6MCl7RT1jW3Q+PjJdfDA7Y1tyPj4yXT1wKzQ7Y1twPj4yXT1FfWNbaz4+Ml09Tm0oQixjW3E+PjJdfDAsaixnKXwwO3FrKG4scyxjW3I+PjJdfDAsaik7aWYoIXope2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RT0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7eT1FPzA6eX19ZWxzZXt5PTB9cD0oeXwwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZihwKXticmVha31lbHNle2w9NzE7YnJlYWt9fWlmKCEoKG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xKSl7aWYoIXApe2w9NzF9fWVsc2V7bD02OX19ZWxzZXtsPTY5fX13aGlsZSgwKTtpZigobHwwKT09Njk/cDowKXtsPTcxfWlmKChsfDApPT03MSl7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT15O2lmKCEoKGFbbz4+MF0mMSk9PTApPyhtPWNbdT4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoKGFbbj4+MF0mMSk9PTApe2k9ZTtyZXR1cm59bD1jW24rOD4+Ml18MDtpZigobHwwKT09MCl7aT1lO3JldHVybn12bihsKTtpPWU7cmV0dXJufWZ1bmN0aW9uIE9oKGIsZSxmLGcsaCxqLGspe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wO2U9aTtpPWkrMjI0fDA7dj1lKzE5OHwwO3U9ZSsxOTZ8MDtuPWUrMTZ8MDtvPWUrNHwwO3E9ZSsxOTJ8MDtzPWUrMzJ8MDtyPWU7dD1lKzI4fDA7eT1jW2Y+PjJdfDA7QT1jW2c+PjJdfDA7Zz1jW2grND4+Ml0mNzQ7aWYoKGd8MCk9PTApe2c9MH1lbHNlIGlmKChnfDApPT04KXtnPTE2fWVsc2UgaWYoKGd8MCk9PTY0KXtnPTh9ZWxzZXtnPTEwfW1pKG4saCx2LHUpO2NbbyswPj4yXT0wO2Nbbys0Pj4yXT0wO2Nbbys4Pj4yXT0wO2hnKG8sMTApO2lmKChhW28+PjBdJjEpPT0wKXtCPW8rMXwwO3c9QjtmPW8rOHwwfWVsc2V7Qj1vKzh8MDt3PW8rMXwwO2Y9QjtCPWNbQj4+Ml18MH1jW3E+PjJdPUI7Y1tyPj4yXT1zO2NbdD4+Ml09MDtoPW8rNHwwO3g9YVt1Pj4wXXwwO3U9bys4fDA7YTp3aGlsZSgxKXtpZigoeXwwKSE9MCl7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH16PSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHope2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZigheil7YnJlYWsgYX19ZWxzZXtsPTE5fX1lbHNle2w9MTl9fXdoaWxlKDApO2lmKChsfDApPT0xOSl7bD0wO2lmKHope0E9MDticmVha31lbHNle0E9MH19RD1hW28+PjBdfDA7Qz0oRCYxKT09MDtpZihDKXtFPShEJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9aWYoKChjW3E+PjJdfDApLUJ8MCk9PShFfDApKXtpZihDKXtCPShEJjI1NSk+Pj4xO0U9KEQmMjU1KT4+PjE7RD1CPDwxfWVsc2V7Qj1jW2g+PjJdfDA7RT1jW2g+PjJdfDA7RD1CPDwxfWRve2lmKCEoRT4+PjA8RD4+PjApKXtpZihDKXthW28rRCsxPj4wXT0wO2Fbbz4+MF09Qjw8MjticmVha31lbHNle2FbKGNbdT4+Ml18MCkrRD4+MF09MDtjW2g+PjJdPUQ7YnJlYWt9fWVsc2V7aGcobyxELUV8MCl9fXdoaWxlKDApO0U9YVtvPj4wXXwwO2lmKChFJjEpPT0wKXtEPTEwfWVsc2V7RD1jW28+PjJdfDA7RT1EJjI1NTtEPShEJi0yKSsgLTF8MH1DPShFJjEpPT0wO2lmKEMpe0U9KEUmMjU1KT4+PjF9ZWxzZXtFPWNbaD4+Ml18MH1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUQ8PDE7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz13fWVsc2V7Qz1jW2Y+PjJdfDB9Y1txPj4yXT1DK0I7Qj1DfUQ9eSsxMnwwO0U9Y1tEPj4yXXwwO0M9eSsxNnwwO2lmKChFfDApPT0oY1tDPj4yXXwwKSl7RT1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXtFPWRbRT4+MF18MH1pZigoWGgoRSYyNTUsZyxCLHEsdCx4LG4scyxyLHYpfDApIT0wKXticmVha316PWNbRD4+Ml18MDtpZigoenwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbeT4+Ml18MCkrNDA+PjJdJjEyN10oeSl8MDtjb250aW51ZX1lbHNle2NbRD4+Ml09eisxO2NvbnRpbnVlfX12PWFbbj4+MF18MDtpZigodiYxKT09MCl7dj0odiYyNTUpPj4+MX1lbHNle3Y9Y1tuKzQ+PjJdfDB9aWYoKHZ8MCkhPTA/KHA9Y1tyPj4yXXwwLChwLXN8MCk8MTYwKTowKXtFPWNbdD4+Ml18MDtjW3I+PjJdPXArNDtjW3A+PjJdPUV9RD1NbShCLGNbcT4+Ml18MCxqLGcpfDA7RT1rO2NbRT4+Ml09RDtjW0UrND4+Ml09STtxayhuLHMsY1tyPj4yXXwwLGopO2lmKCF6KXtpZigoY1t5KzEyPj4yXXwwKT09KGNbeSsxNj4+Ml18MCkpe0U9KG9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MCk9PS0xO3k9RT8wOnl9fWVsc2V7eT0wfXA9KHl8MCk9PTA7ZG97aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApIT0oY1tBKzE2Pj4yXXwwKSl7aWYocCl7YnJlYWt9ZWxzZXtsPTcxO2JyZWFrfX1pZighKChvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMSkpe2lmKCFwKXtsPTcxfX1lbHNle2w9Njl9fWVsc2V7bD02OX19d2hpbGUoMCk7aWYoKGx8MCk9PTY5P3A6MCl7bD03MX1pZigobHwwKT09NzEpe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09eTtpZighKChhW28+PjBdJjEpPT0wKT8obT1jW3U+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKChhW24+PjBdJjEpPT0wKXtpPWU7cmV0dXJufWw9Y1tuKzg+PjJdfDA7aWYoKGx8MCk9PTApe2k9ZTtyZXR1cm59dm4obCk7aT1lO3JldHVybn1mdW5jdGlvbiBQaChlLGYsZyxoLGosayxsKXtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MDtmPWk7aT1pKzIyNHwwO3c9ZisxOTh8MDt2PWYrMTk2fDA7bz1mKzE2fDA7cD1mKzR8MDtyPWYrMTkyfDA7dD1mKzMyfDA7cz1mO3U9ZisyOHwwO3o9Y1tnPj4yXXwwO0I9Y1toPj4yXXwwO2g9Y1tqKzQ+PjJdJjc0O2lmKChofDApPT04KXtoPTE2fWVsc2UgaWYoKGh8MCk9PTY0KXtoPTh9ZWxzZSBpZigoaHwwKT09MCl7aD0wfWVsc2V7aD0xMH1taShvLGosdyx2KTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDtoZyhwLDEwKTtpZigoYVtwPj4wXSYxKT09MCl7Qz1wKzF8MDt4PUM7Zz1wKzh8MH1lbHNle0M9cCs4fDA7eD1wKzF8MDtnPUM7Qz1jW0M+PjJdfDB9Y1tyPj4yXT1DO2Nbcz4+Ml09dDtjW3U+PjJdPTA7aj1wKzR8MDt5PWFbdj4+MF18MDt2PXArOHwwO2E6d2hpbGUoMSl7aWYoKHp8MCkhPTApe2lmKChjW3orMTI+PjJdfDApPT0oY1t6KzE2Pj4yXXwwKSl7Rj0ob2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwKT09LTE7ej1GPzA6en19ZWxzZXt6PTB9QT0oenwwKT09MDtkb3tpZigoQnwwKSE9MCl7aWYoKGNbQisxMj4+Ml18MCkhPShjW0IrMTY+PjJdfDApKXtpZihBKXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MCk9PS0xKSl7aWYoIUEpe2JyZWFrIGF9fWVsc2V7bT0xOX19ZWxzZXttPTE5fX13aGlsZSgwKTtpZigobXwwKT09MTkpe209MDtpZihBKXtCPTA7YnJlYWt9ZWxzZXtCPTB9fUU9YVtwPj4wXXwwO0Q9KEUmMSk9PTA7aWYoRCl7Rj0oRSYyNTUpPj4+MX1lbHNle0Y9Y1tqPj4yXXwwfWlmKCgoY1tyPj4yXXwwKS1DfDApPT0oRnwwKSl7aWYoRCl7Qz0oRSYyNTUpPj4+MTtGPShFJjI1NSk+Pj4xO0U9Qzw8MX1lbHNle0M9Y1tqPj4yXXwwO0Y9Y1tqPj4yXXwwO0U9Qzw8MX1kb3tpZighKEY+Pj4wPEU+Pj4wKSl7aWYoRCl7YVtwK0UrMT4+MF09MDthW3A+PjBdPUM8PDI7YnJlYWt9ZWxzZXthWyhjW3Y+PjJdfDApK0U+PjBdPTA7Y1tqPj4yXT1FO2JyZWFrfX1lbHNle2hnKHAsRS1GfDApfX13aGlsZSgwKTtGPWFbcD4+MF18MDtpZigoRiYxKT09MCl7RT0xMH1lbHNle0U9Y1twPj4yXXwwO0Y9RSYyNTU7RT0oRSYtMikrIC0xfDB9RD0oRiYxKT09MDtpZihEKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW2o+PjJdfDB9ZG97aWYoIShGPj4+MDxFPj4+MCkpe2lmKEQpe2FbcCtFKzE+PjBdPTA7YVtwPj4wXT1FPDwxO2JyZWFrfWVsc2V7YVsoY1t2Pj4yXXwwKStFPj4wXT0wO2Nbaj4+Ml09RTticmVha319ZWxzZXtoZyhwLEUtRnwwKX19d2hpbGUoMCk7aWYoKGFbcD4+MF0mMSk9PTApe0Q9eH1lbHNle0Q9Y1tnPj4yXXwwfWNbcj4+Ml09RCtDO0M9RH1FPXorMTJ8MDtGPWNbRT4+Ml18MDtEPXorMTZ8MDtpZigoRnwwKT09KGNbRD4+Ml18MCkpe0Y9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7Rj1kW0Y+PjBdfDB9aWYoKFhoKEYmMjU1LGgsQyxyLHUseSxvLHQscyx3KXwwKSE9MCl7YnJlYWt9QT1jW0U+PjJdfDA7aWYoKEF8MCk9PShjW0Q+PjJdfDApKXtvY1tjWyhjW3o+PjJdfDApKzQwPj4yXSYxMjddKHopfDA7Y29udGludWV9ZWxzZXtjW0U+PjJdPUErMTtjb250aW51ZX19dz1hW28+PjBdfDA7aWYoKHcmMSk9PTApe3c9KHcmMjU1KT4+PjF9ZWxzZXt3PWNbbys0Pj4yXXwwfWlmKCh3fDApIT0wPyhxPWNbcz4+Ml18MCwocS10fDApPDE2MCk6MCl7Rj1jW3U+PjJdfDA7Y1tzPj4yXT1xKzQ7Y1txPj4yXT1GfWJbbD4+MV09TG0oQyxjW3I+PjJdfDAsayxoKXwwO3FrKG8sdCxjW3M+PjJdfDAsayk7aWYoIUEpe2lmKChjW3orMTI+PjJdfDApPT0oY1t6KzE2Pj4yXXwwKSl7Rj0ob2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwKT09LTE7ej1GPzA6en19ZWxzZXt6PTB9cT0oenwwKT09MDtkb3tpZigoQnwwKSE9MCl7aWYoKGNbQisxMj4+Ml18MCkhPShjW0IrMTY+PjJdfDApKXtpZihxKXticmVha31lbHNle209NzE7YnJlYWt9fWlmKCEoKG9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MCk9PS0xKSl7aWYoIXEpe209NzF9fWVsc2V7bT02OX19ZWxzZXttPTY5fX13aGlsZSgwKTtpZigobXwwKT09Njk/cTowKXttPTcxfWlmKChtfDApPT03MSl7Y1trPj4yXT1jW2s+PjJdfDJ9Y1tlPj4yXT16O2lmKCEoKGFbcD4+MF0mMSk9PTApPyhuPWNbdj4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoKGFbbz4+MF0mMSk9PTApe2k9ZjtyZXR1cm59bT1jW28rOD4+Ml18MDtpZigobXwwKT09MCl7aT1mO3JldHVybn12bihtKTtpPWY7cmV0dXJufWZ1bmN0aW9uIFFoKGIsZSxmLGcsaCxqLGspe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wO2U9aTtpPWkrMjI0fDA7dj1lKzE5OHwwO3U9ZSsxOTZ8MDtuPWUrMTZ8MDtvPWUrNHwwO3E9ZSsxOTJ8MDtzPWUrMzJ8MDtyPWU7dD1lKzI4fDA7eT1jW2Y+PjJdfDA7QT1jW2c+PjJdfDA7Zz1jW2grND4+Ml0mNzQ7aWYoKGd8MCk9PTY0KXtnPTh9ZWxzZSBpZigoZ3wwKT09OCl7Zz0xNn1lbHNlIGlmKChnfDApPT0wKXtnPTB9ZWxzZXtnPTEwfW1pKG4saCx2LHUpO2NbbyswPj4yXT0wO2Nbbys0Pj4yXT0wO2Nbbys4Pj4yXT0wO2hnKG8sMTApO2lmKChhW28+PjBdJjEpPT0wKXtCPW8rMXwwO3c9QjtmPW8rOHwwfWVsc2V7Qj1vKzh8MDt3PW8rMXwwO2Y9QjtCPWNbQj4+Ml18MH1jW3E+PjJdPUI7Y1tyPj4yXT1zO2NbdD4+Ml09MDtoPW8rNHwwO3g9YVt1Pj4wXXwwO3U9bys4fDA7YTp3aGlsZSgxKXtpZigoeXwwKSE9MCl7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH16PSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHope2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZigheil7YnJlYWsgYX19ZWxzZXtsPTE5fX1lbHNle2w9MTl9fXdoaWxlKDApO2lmKChsfDApPT0xOSl7bD0wO2lmKHope0E9MDticmVha31lbHNle0E9MH19RD1hW28+PjBdfDA7Qz0oRCYxKT09MDtpZihDKXtFPShEJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9aWYoKChjW3E+PjJdfDApLUJ8MCk9PShFfDApKXtpZihDKXtCPShEJjI1NSk+Pj4xO0U9KEQmMjU1KT4+PjE7RD1CPDwxfWVsc2V7Qj1jW2g+PjJdfDA7RT1jW2g+PjJdfDA7RD1CPDwxfWRve2lmKCEoRT4+PjA8RD4+PjApKXtpZihDKXthW28rRCsxPj4wXT0wO2Fbbz4+MF09Qjw8MjticmVha31lbHNle2FbKGNbdT4+Ml18MCkrRD4+MF09MDtjW2g+PjJdPUQ7YnJlYWt9fWVsc2V7aGcobyxELUV8MCl9fXdoaWxlKDApO0U9YVtvPj4wXXwwO2lmKChFJjEpPT0wKXtEPTEwfWVsc2V7RD1jW28+PjJdfDA7RT1EJjI1NTtEPShEJi0yKSsgLTF8MH1DPShFJjEpPT0wO2lmKEMpe0U9KEUmMjU1KT4+PjF9ZWxzZXtFPWNbaD4+Ml18MH1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUQ8PDE7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz13fWVsc2V7Qz1jW2Y+PjJdfDB9Y1txPj4yXT1DK0I7Qj1DfUQ9eSsxMnwwO0U9Y1tEPj4yXXwwO0M9eSsxNnwwO2lmKChFfDApPT0oY1tDPj4yXXwwKSl7RT1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXtFPWRbRT4+MF18MH1pZigoWGgoRSYyNTUsZyxCLHEsdCx4LG4scyxyLHYpfDApIT0wKXticmVha316PWNbRD4+Ml18MDtpZigoenwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbeT4+Ml18MCkrNDA+PjJdJjEyN10oeSl8MDtjb250aW51ZX1lbHNle2NbRD4+Ml09eisxO2NvbnRpbnVlfX12PWFbbj4+MF18MDtpZigodiYxKT09MCl7dj0odiYyNTUpPj4+MX1lbHNle3Y9Y1tuKzQ+PjJdfDB9aWYoKHZ8MCkhPTA/KHA9Y1tyPj4yXXwwLChwLXN8MCk8MTYwKTowKXtFPWNbdD4+Ml18MDtjW3I+PjJdPXArNDtjW3A+PjJdPUV9Y1trPj4yXT1LbShCLGNbcT4+Ml18MCxqLGcpfDA7cWsobixzLGNbcj4+Ml18MCxqKTtpZigheil7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH1wPSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHApe2JyZWFrfWVsc2V7bD03MTticmVha319aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZighcCl7bD03MX19ZWxzZXtsPTY5fX1lbHNle2w9Njl9fXdoaWxlKDApO2lmKChsfDApPT02OT9wOjApe2w9NzF9aWYoKGx8MCk9PTcxKXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPXk7aWYoISgoYVtvPj4wXSYxKT09MCk/KG09Y1t1Pj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZigoYVtuPj4wXSYxKT09MCl7aT1lO3JldHVybn1sPWNbbis4Pj4yXXwwO2lmKChsfDApPT0wKXtpPWU7cmV0dXJufXZuKGwpO2k9ZTtyZXR1cm59ZnVuY3Rpb24gUmgoYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTA7ZT1pO2k9aSsyMjR8MDt2PWUrMTk4fDA7dT1lKzE5NnwwO249ZSsxNnwwO289ZSs0fDA7cT1lKzE5MnwwO3M9ZSszMnwwO3I9ZTt0PWUrMjh8MDt5PWNbZj4+Ml18MDtBPWNbZz4+Ml18MDtnPWNbaCs0Pj4yXSY3NDtpZigoZ3wwKT09OCl7Zz0xNn1lbHNlIGlmKChnfDApPT0wKXtnPTB9ZWxzZSBpZigoZ3wwKT09NjQpe2c9OH1lbHNle2c9MTB9bWkobixoLHYsdSk7Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTA7aGcobywxMCk7aWYoKGFbbz4+MF0mMSk9PTApe0I9bysxfDA7dz1CO2Y9bys4fDB9ZWxzZXtCPW8rOHwwO3c9bysxfDA7Zj1CO0I9Y1tCPj4yXXwwfWNbcT4+Ml09QjtjW3I+PjJdPXM7Y1t0Pj4yXT0wO2g9bys0fDA7eD1hW3U+PjBdfDA7dT1vKzh8MDthOndoaWxlKDEpe2lmKCh5fDApIT0wKXtpZigoY1t5KzEyPj4yXXwwKT09KGNbeSsxNj4+Ml18MCkpe0U9KG9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MCk9PS0xO3k9RT8wOnl9fWVsc2V7eT0wfXo9KHl8MCk9PTA7ZG97aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApIT0oY1tBKzE2Pj4yXXwwKSl7aWYoeil7YnJlYWt9ZWxzZXticmVhayBhfX1pZighKChvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMSkpe2lmKCF6KXticmVhayBhfX1lbHNle2w9MTl9fWVsc2V7bD0xOX19d2hpbGUoMCk7aWYoKGx8MCk9PTE5KXtsPTA7aWYoeil7QT0wO2JyZWFrfWVsc2V7QT0wfX1EPWFbbz4+MF18MDtDPShEJjEpPT0wO2lmKEMpe0U9KEQmMjU1KT4+PjF9ZWxzZXtFPWNbaD4+Ml18MH1pZigoKGNbcT4+Ml18MCktQnwwKT09KEV8MCkpe2lmKEMpe0I9KEQmMjU1KT4+PjE7RT0oRCYyNTUpPj4+MTtEPUI8PDF9ZWxzZXtCPWNbaD4+Ml18MDtFPWNbaD4+Ml18MDtEPUI8PDF9ZG97aWYoIShFPj4+MDxEPj4+MCkpe2lmKEMpe2FbbytEKzE+PjBdPTA7YVtvPj4wXT1CPDwyO2JyZWFrfWVsc2V7YVsoY1t1Pj4yXXwwKStEPj4wXT0wO2NbaD4+Ml09RDticmVha319ZWxzZXtoZyhvLEQtRXwwKX19d2hpbGUoMCk7RT1hW28+PjBdfDA7aWYoKEUmMSk9PTApe0Q9MTB9ZWxzZXtEPWNbbz4+Ml18MDtFPUQmMjU1O0Q9KEQmLTIpKyAtMXwwfUM9KEUmMSk9PTA7aWYoQyl7RT0oRSYyNTUpPj4+MX1lbHNle0U9Y1toPj4yXXwwfWRve2lmKCEoRT4+PjA8RD4+PjApKXtpZihDKXthW28rRCsxPj4wXT0wO2Fbbz4+MF09RDw8MTticmVha31lbHNle2FbKGNbdT4+Ml18MCkrRD4+MF09MDtjW2g+PjJdPUQ7YnJlYWt9fWVsc2V7aGcobyxELUV8MCl9fXdoaWxlKDApO2lmKChhW28+PjBdJjEpPT0wKXtDPXd9ZWxzZXtDPWNbZj4+Ml18MH1jW3E+PjJdPUMrQjtCPUN9RD15KzEyfDA7RT1jW0Q+PjJdfDA7Qz15KzE2fDA7aWYoKEV8MCk9PShjW0M+PjJdfDApKXtFPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle0U9ZFtFPj4wXXwwfWlmKChYaChFJjI1NSxnLEIscSx0LHgsbixzLHIsdil8MCkhPTApe2JyZWFrfXo9Y1tEPj4yXXwwO2lmKCh6fDApPT0oY1tDPj4yXXwwKSl7b2NbY1soY1t5Pj4yXXwwKSs0MD4+Ml0mMTI3XSh5KXwwO2NvbnRpbnVlfWVsc2V7Y1tEPj4yXT16KzE7Y29udGludWV9fXY9YVtuPj4wXXwwO2lmKCh2JjEpPT0wKXt2PSh2JjI1NSk+Pj4xfWVsc2V7dj1jW24rND4+Ml18MH1pZigodnwwKSE9MD8ocD1jW3I+PjJdfDAsKHAtc3wwKTwxNjApOjApe0U9Y1t0Pj4yXXwwO2Nbcj4+Ml09cCs0O2NbcD4+Ml09RX1jW2s+PjJdPUptKEIsY1txPj4yXXwwLGosZyl8MDtxayhuLHMsY1tyPj4yXXwwLGopO2lmKCF6KXtpZigoY1t5KzEyPj4yXXwwKT09KGNbeSsxNj4+Ml18MCkpe0U9KG9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MCk9PS0xO3k9RT8wOnl9fWVsc2V7eT0wfXA9KHl8MCk9PTA7ZG97aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApIT0oY1tBKzE2Pj4yXXwwKSl7aWYocCl7YnJlYWt9ZWxzZXtsPTcxO2JyZWFrfX1pZighKChvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMSkpe2lmKCFwKXtsPTcxfX1lbHNle2w9Njl9fWVsc2V7bD02OX19d2hpbGUoMCk7aWYoKGx8MCk9PTY5P3A6MCl7bD03MX1pZigobHwwKT09NzEpe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09eTtpZighKChhW28+PjBdJjEpPT0wKT8obT1jW3U+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKChhW24+PjBdJjEpPT0wKXtpPWU7cmV0dXJufWw9Y1tuKzg+PjJdfDA7aWYoKGx8MCk9PTApe2k9ZTtyZXR1cm59dm4obCk7aT1lO3JldHVybn1mdW5jdGlvbiBTaChiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MDtlPWk7aT1pKzIyNHwwO3Y9ZSsxOTh8MDt1PWUrMTk2fDA7bj1lKzE2fDA7bz1lKzR8MDtxPWUrMTkyfDA7cz1lKzMyfDA7cj1lO3Q9ZSsyOHwwO3k9Y1tmPj4yXXwwO0E9Y1tnPj4yXXwwO2c9Y1toKzQ+PjJdJjc0O2lmKChnfDApPT0wKXtnPTB9ZWxzZSBpZigoZ3wwKT09OCl7Zz0xNn1lbHNlIGlmKChnfDApPT02NCl7Zz04fWVsc2V7Zz0xMH1taShuLGgsdix1KTtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtoZyhvLDEwKTtpZigoYVtvPj4wXSYxKT09MCl7Qj1vKzF8MDt3PUI7Zj1vKzh8MH1lbHNle0I9bys4fDA7dz1vKzF8MDtmPUI7Qj1jW0I+PjJdfDB9Y1txPj4yXT1CO2Nbcj4+Ml09cztjW3Q+PjJdPTA7aD1vKzR8MDt4PWFbdT4+MF18MDt1PW8rOHwwO2E6d2hpbGUoMSl7aWYoKHl8MCkhPTApe2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RT0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7eT1FPzA6eX19ZWxzZXt5PTB9ej0oeXwwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZih6KXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xKSl7aWYoIXope2JyZWFrIGF9fWVsc2V7bD0xOX19ZWxzZXtsPTE5fX13aGlsZSgwKTtpZigobHwwKT09MTkpe2w9MDtpZih6KXtBPTA7YnJlYWt9ZWxzZXtBPTB9fUQ9YVtvPj4wXXwwO0M9KEQmMSk9PTA7aWYoQyl7RT0oRCYyNTUpPj4+MX1lbHNle0U9Y1toPj4yXXwwfWlmKCgoY1txPj4yXXwwKS1CfDApPT0oRXwwKSl7aWYoQyl7Qj0oRCYyNTUpPj4+MTtFPShEJjI1NSk+Pj4xO0Q9Qjw8MX1lbHNle0I9Y1toPj4yXXwwO0U9Y1toPj4yXXwwO0Q9Qjw8MX1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUI8PDI7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtFPWFbbz4+MF18MDtpZigoRSYxKT09MCl7RD0xMH1lbHNle0Q9Y1tvPj4yXXwwO0U9RCYyNTU7RD0oRCYtMikrIC0xfDB9Qz0oRSYxKT09MDtpZihDKXtFPShFJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9ZG97aWYoIShFPj4+MDxEPj4+MCkpe2lmKEMpe2FbbytEKzE+PjBdPTA7YVtvPj4wXT1EPDwxO2JyZWFrfWVsc2V7YVsoY1t1Pj4yXXwwKStEPj4wXT0wO2NbaD4+Ml09RDticmVha319ZWxzZXtoZyhvLEQtRXwwKX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9d31lbHNle0M9Y1tmPj4yXXwwfWNbcT4+Ml09QytCO0I9Q31EPXkrMTJ8MDtFPWNbRD4+Ml18MDtDPXkrMTZ8MDtpZigoRXwwKT09KGNbQz4+Ml18MCkpe0U9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7RT1kW0U+PjBdfDB9aWYoKFhoKEUmMjU1LGcsQixxLHQseCxuLHMscix2KXwwKSE9MCl7YnJlYWt9ej1jW0Q+PjJdfDA7aWYoKHp8MCk9PShjW0M+PjJdfDApKXtvY1tjWyhjW3k+PjJdfDApKzQwPj4yXSYxMjddKHkpfDA7Y29udGludWV9ZWxzZXtjW0Q+PjJdPXorMTtjb250aW51ZX19dj1hW24+PjBdfDA7aWYoKHYmMSk9PTApe3Y9KHYmMjU1KT4+PjF9ZWxzZXt2PWNbbis0Pj4yXXwwfWlmKCh2fDApIT0wPyhwPWNbcj4+Ml18MCwocC1zfDApPDE2MCk6MCl7RT1jW3Q+PjJdfDA7Y1tyPj4yXT1wKzQ7Y1twPj4yXT1FfUQ9SW0oQixjW3E+PjJdfDAsaixnKXwwO0U9aztjW0U+PjJdPUQ7Y1tFKzQ+PjJdPUk7cWsobixzLGNbcj4+Ml18MCxqKTtpZigheil7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH1wPSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHApe2JyZWFrfWVsc2V7bD03MTticmVha319aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZighcCl7bD03MX19ZWxzZXtsPTY5fX1lbHNle2w9Njl9fXdoaWxlKDApO2lmKChsfDApPT02OT9wOjApe2w9NzF9aWYoKGx8MCk9PTcxKXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPXk7aWYoISgoYVtvPj4wXSYxKT09MCk/KG09Y1t1Pj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZigoYVtuPj4wXSYxKT09MCl7aT1lO3JldHVybn1sPWNbbis4Pj4yXXwwO2lmKChsfDApPT0wKXtpPWU7cmV0dXJufXZuKGwpO2k9ZTtyZXR1cm59ZnVuY3Rpb24gVGgoYixlLGYsaCxqLGssbCl7Yj1ifDA7ZT1lfDA7Zj1mfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7dmFyIG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MDtlPWk7aT1pKzI1NnwwO3g9ZSsyMDh8MDt6PWUrMjAwfDA7dz1lKzI0MHwwO289ZTtwPWUrMTg4fDA7dj1lKzE4NHwwO3Q9ZSsxNnwwO3M9ZSsxNzZ8MDtyPWUrMTgwfDA7dT1lKzI0MXwwO3k9ZSsyNDJ8MDtBPWNbZj4+Ml18MDtEPWNbaD4+Ml18MDtuaShvLGoseCx6LHcpO2NbcCswPj4yXT0wO2NbcCs0Pj4yXT0wO2NbcCs4Pj4yXT0wO2hnKHAsMTApO2lmKChhW3A+PjBdJjEpPT0wKXtFPXArMXwwO2g9RTtmPXArOHwwfWVsc2V7RT1wKzh8MDtoPXArMXwwO2Y9RTtFPWNbRT4+Ml18MH1jW3Y+PjJdPUU7Y1tzPj4yXT10O2Nbcj4+Ml09MDthW3U+PjBdPTE7YVt5Pj4wXT02OTtqPXArNHwwO3o9YVt6Pj4wXXwwO0I9YVt3Pj4wXXwwO3c9cCs4fDA7YTp3aGlsZSgxKXtpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCk9PShjW0ErMTY+PjJdfDApKXtIPShvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMTtBPUg/MDpBfX1lbHNle0E9MH1DPShBfDApPT0wO2Rve2lmKChEfDApIT0wKXtpZigoY1tEKzEyPj4yXXwwKSE9KGNbRCsxNj4+Ml18MCkpe2lmKEMpe2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tEPj4yXXwwKSszNj4+Ml0mMTI3XShEKXwwKT09LTEpKXtpZighQyl7YnJlYWsgYX19ZWxzZXttPTE1fX1lbHNle209MTV9fXdoaWxlKDApO2lmKChtfDApPT0xNSl7bT0wO2lmKEMpe0Q9MDticmVha31lbHNle0Q9MH19Rz1hW3A+PjBdfDA7Rj0oRyYxKT09MDtpZihGKXtIPShHJjI1NSk+Pj4xfWVsc2V7SD1jW2o+PjJdfDB9aWYoKChjW3Y+PjJdfDApLUV8MCk9PShIfDApKXtpZihGKXtFPShHJjI1NSk+Pj4xO0c9KEcmMjU1KT4+PjE7SD1FPDwxfWVsc2V7RT1jW2o+PjJdfDA7Rz1jW2o+PjJdfDA7SD1FPDwxfWRve2lmKCEoRz4+PjA8SD4+PjApKXtpZihGKXthW3ArSCsxPj4wXT0wO2FbcD4+MF09RTw8MjticmVha31lbHNle2FbKGNbdz4+Ml18MCkrSD4+MF09MDtjW2o+PjJdPUg7YnJlYWt9fWVsc2V7aGcocCxILUd8MCl9fXdoaWxlKDApO0g9YVtwPj4wXXwwO2lmKChIJjEpPT0wKXtHPTEwfWVsc2V7Rz1jW3A+PjJdfDA7SD1HJjI1NTtHPShHJi0yKSsgLTF8MH1GPShIJjEpPT0wO2lmKEYpe0g9KEgmMjU1KT4+PjF9ZWxzZXtIPWNbaj4+Ml18MH1kb3tpZighKEg+Pj4wPEc+Pj4wKSl7aWYoRil7YVtwK0crMT4+MF09MDthW3A+PjBdPUc8PDE7YnJlYWt9ZWxzZXthWyhjW3c+PjJdfDApK0c+PjBdPTA7Y1tqPj4yXT1HO2JyZWFrfX1lbHNle2hnKHAsRy1IfDApfX13aGlsZSgwKTtpZigoYVtwPj4wXSYxKT09MCl7Rj1ofWVsc2V7Rj1jW2Y+PjJdfDB9Y1t2Pj4yXT1GK0U7RT1GfUc9QSsxMnwwO0g9Y1tHPj4yXXwwO0Y9QSsxNnwwO2lmKChIfDApPT0oY1tGPj4yXXwwKSl7SD1vY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDB9ZWxzZXtIPWRbSD4+MF18MH1pZigob2koSCYyNTUsdSx5LEUsdix6LEIsbyx0LHMscix4KXwwKSE9MCl7YnJlYWt9Qz1jW0c+PjJdfDA7aWYoKEN8MCk9PShjW0Y+PjJdfDApKXtvY1tjWyhjW0E+PjJdfDApKzQwPj4yXSYxMjddKEEpfDA7Y29udGludWV9ZWxzZXtjW0c+PjJdPUMrMTtjb250aW51ZX19eD1hW28+PjBdfDA7aWYoKHgmMSk9PTApe3g9KHgmMjU1KT4+PjF9ZWxzZXt4PWNbbys0Pj4yXXwwfWlmKCgoeHwwKSE9MD8oYVt1Pj4wXXwwKSE9MDowKT8ocT1jW3M+PjJdfDAsKHEtdHwwKTwxNjApOjApe0g9Y1tyPj4yXXwwO2Nbcz4+Ml09cSs0O2NbcT4+Ml09SH1nW2w+PjJdPStIbShFLGNbdj4+Ml18MCxrKTtxayhvLHQsY1tzPj4yXXwwLGspO2lmKCFDKXtpZigoY1tBKzEyPj4yXXwwKT09KGNbQSsxNj4+Ml18MCkpe0g9KG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xO0E9SD8wOkF9fWVsc2V7QT0wfWw9KEF8MCk9PTA7ZG97aWYoKER8MCkhPTApe2lmKChjW0QrMTI+PjJdfDApIT0oY1tEKzE2Pj4yXXwwKSl7aWYobCl7YnJlYWt9ZWxzZXttPTY4O2JyZWFrfX1pZighKChvY1tjWyhjW0Q+PjJdfDApKzM2Pj4yXSYxMjddKEQpfDApPT0tMSkpe2lmKCFsKXttPTY4fX1lbHNle209NjZ9fWVsc2V7bT02Nn19d2hpbGUoMCk7aWYoKG18MCk9PTY2P2w6MCl7bT02OH1pZigobXwwKT09Njgpe2Nbaz4+Ml09Y1trPj4yXXwyfWNbYj4+Ml09QTtpZighKChhW3A+PjBdJjEpPT0wKT8obj1jW3c+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKChhW28+PjBdJjEpPT0wKXtpPWU7cmV0dXJufW09Y1tvKzg+PjJdfDA7aWYoKG18MCk9PTApe2k9ZTtyZXR1cm59dm4obSk7aT1lO3JldHVybn1mdW5jdGlvbiBVaChiLGUsZixnLGosayxsKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wO2U9aTtpPWkrMjU2fDA7eD1lKzIwOHwwO3o9ZSsyMDB8MDt3PWUrMjQwfDA7bz1lO3A9ZSsxODh8MDt2PWUrMTg0fDA7dD1lKzE2fDA7cz1lKzE3NnwwO3I9ZSsxODB8MDt1PWUrMjQxfDA7eT1lKzI0MnwwO0E9Y1tmPj4yXXwwO0Q9Y1tnPj4yXXwwO25pKG8saix4LHosdyk7Y1twKzA+PjJdPTA7Y1twKzQ+PjJdPTA7Y1twKzg+PjJdPTA7aGcocCwxMCk7aWYoKGFbcD4+MF0mMSk9PTApe0U9cCsxfDA7Zz1FO2Y9cCs4fDB9ZWxzZXtFPXArOHwwO2c9cCsxfDA7Zj1FO0U9Y1tFPj4yXXwwfWNbdj4+Ml09RTtjW3M+PjJdPXQ7Y1tyPj4yXT0wO2FbdT4+MF09MTthW3k+PjBdPTY5O2o9cCs0fDA7ej1hW3o+PjBdfDA7Qj1hW3c+PjBdfDA7dz1wKzh8MDthOndoaWxlKDEpe2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKT09KGNbQSsxNj4+Ml18MCkpe0g9KG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xO0E9SD8wOkF9fWVsc2V7QT0wfUM9KEF8MCk9PTA7ZG97aWYoKER8MCkhPTApe2lmKChjW0QrMTI+PjJdfDApIT0oY1tEKzE2Pj4yXXwwKSl7aWYoQyl7YnJlYWt9ZWxzZXticmVhayBhfX1pZighKChvY1tjWyhjW0Q+PjJdfDApKzM2Pj4yXSYxMjddKEQpfDApPT0tMSkpe2lmKCFDKXticmVhayBhfX1lbHNle209MTV9fWVsc2V7bT0xNX19d2hpbGUoMCk7aWYoKG18MCk9PTE1KXttPTA7aWYoQyl7RD0wO2JyZWFrfWVsc2V7RD0wfX1HPWFbcD4+MF18MDtGPShHJjEpPT0wO2lmKEYpe0g9KEcmMjU1KT4+PjF9ZWxzZXtIPWNbaj4+Ml18MH1pZigoKGNbdj4+Ml18MCktRXwwKT09KEh8MCkpe2lmKEYpe0U9KEcmMjU1KT4+PjE7Rz0oRyYyNTUpPj4+MTtIPUU8PDF9ZWxzZXtFPWNbaj4+Ml18MDtHPWNbaj4+Ml18MDtIPUU8PDF9ZG97aWYoIShHPj4+MDxIPj4+MCkpe2lmKEYpe2FbcCtIKzE+PjBdPTA7YVtwPj4wXT1FPDwyO2JyZWFrfWVsc2V7YVsoY1t3Pj4yXXwwKStIPj4wXT0wO2Nbaj4+Ml09SDticmVha319ZWxzZXtoZyhwLEgtR3wwKX19d2hpbGUoMCk7SD1hW3A+PjBdfDA7aWYoKEgmMSk9PTApe0c9MTB9ZWxzZXtHPWNbcD4+Ml18MDtIPUcmMjU1O0c9KEcmLTIpKyAtMXwwfUY9KEgmMSk9PTA7aWYoRil7SD0oSCYyNTUpPj4+MX1lbHNle0g9Y1tqPj4yXXwwfWRve2lmKCEoSD4+PjA8Rz4+PjApKXtpZihGKXthW3ArRysxPj4wXT0wO2FbcD4+MF09Rzw8MTticmVha31lbHNle2FbKGNbdz4+Ml18MCkrRz4+MF09MDtjW2o+PjJdPUc7YnJlYWt9fWVsc2V7aGcocCxHLUh8MCl9fXdoaWxlKDApO2lmKChhW3A+PjBdJjEpPT0wKXtGPWd9ZWxzZXtGPWNbZj4+Ml18MH1jW3Y+PjJdPUYrRTtFPUZ9Rz1BKzEyfDA7SD1jW0c+PjJdfDA7Rj1BKzE2fDA7aWYoKEh8MCk9PShjW0Y+PjJdfDApKXtIPW9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MH1lbHNle0g9ZFtIPj4wXXwwfWlmKChvaShIJjI1NSx1LHksRSx2LHosQixvLHQscyxyLHgpfDApIT0wKXticmVha31DPWNbRz4+Ml18MDtpZigoQ3wwKT09KGNbRj4+Ml18MCkpe29jW2NbKGNbQT4+Ml18MCkrNDA+PjJdJjEyN10oQSl8MDtjb250aW51ZX1lbHNle2NbRz4+Ml09QysxO2NvbnRpbnVlfX14PWFbbz4+MF18MDtpZigoeCYxKT09MCl7eD0oeCYyNTUpPj4+MX1lbHNle3g9Y1tvKzQ+PjJdfDB9aWYoKCh4fDApIT0wPyhhW3U+PjBdfDApIT0wOjApPyhxPWNbcz4+Ml18MCwocS10fDApPDE2MCk6MCl7SD1jW3I+PjJdfDA7Y1tzPj4yXT1xKzQ7Y1txPj4yXT1IfWhbbD4+M109K0dtKEUsY1t2Pj4yXXwwLGspO3FrKG8sdCxjW3M+PjJdfDAsayk7aWYoIUMpe2lmKChjW0ErMTI+PjJdfDApPT0oY1tBKzE2Pj4yXXwwKSl7SD0ob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTE7QT1IPzA6QX19ZWxzZXtBPTB9bD0oQXwwKT09MDtkb3tpZigoRHwwKSE9MCl7aWYoKGNbRCsxMj4+Ml18MCkhPShjW0QrMTY+PjJdfDApKXtpZihsKXticmVha31lbHNle209Njg7YnJlYWt9fWlmKCEoKG9jW2NbKGNbRD4+Ml18MCkrMzY+PjJdJjEyN10oRCl8MCk9PS0xKSl7aWYoIWwpe209Njh9fWVsc2V7bT02Nn19ZWxzZXttPTY2fX13aGlsZSgwKTtpZigobXwwKT09NjY/bDowKXttPTY4fWlmKChtfDApPT02OCl7Y1trPj4yXT1jW2s+PjJdfDJ9Y1tiPj4yXT1BO2lmKCEoKGFbcD4+MF0mMSk9PTApPyhuPWNbdz4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoKGFbbz4+MF0mMSk9PTApe2k9ZTtyZXR1cm59bT1jW28rOD4+Ml18MDtpZigobXwwKT09MCl7aT1lO3JldHVybn12bihtKTtpPWU7cmV0dXJufWZ1bmN0aW9uIFZoKGIsZSxmLGcsaixrLGwpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9anwwO2s9a3wwO2w9bHwwO3ZhciBtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTA7ZT1pO2k9aSsyNTZ8MDt4PWUrMjA4fDA7ej1lKzIwMHwwO3c9ZSsyNDB8MDtvPWU7cD1lKzE4OHwwO3Y9ZSsxODR8MDt0PWUrMTZ8MDtzPWUrMTc2fDA7cj1lKzE4MHwwO3U9ZSsyNDF8MDt5PWUrMjQyfDA7QT1jW2Y+PjJdfDA7RD1jW2c+PjJdfDA7bmkobyxqLHgseix3KTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDtoZyhwLDEwKTtpZigoYVtwPj4wXSYxKT09MCl7RT1wKzF8MDtnPUU7Zj1wKzh8MH1lbHNle0U9cCs4fDA7Zz1wKzF8MDtmPUU7RT1jW0U+PjJdfDB9Y1t2Pj4yXT1FO2Nbcz4+Ml09dDtjW3I+PjJdPTA7YVt1Pj4wXT0xO2FbeT4+MF09Njk7aj1wKzR8MDt6PWFbej4+MF18MDtCPWFbdz4+MF18MDt3PXArOHwwO2E6d2hpbGUoMSl7aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApPT0oY1tBKzE2Pj4yXXwwKSl7SD0ob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTE7QT1IPzA6QX19ZWxzZXtBPTB9Qz0oQXwwKT09MDtkb3tpZigoRHwwKSE9MCl7aWYoKGNbRCsxMj4+Ml18MCkhPShjW0QrMTY+PjJdfDApKXtpZihDKXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbRD4+Ml18MCkrMzY+PjJdJjEyN10oRCl8MCk9PS0xKSl7aWYoIUMpe2JyZWFrIGF9fWVsc2V7bT0xNX19ZWxzZXttPTE1fX13aGlsZSgwKTtpZigobXwwKT09MTUpe209MDtpZihDKXtEPTA7YnJlYWt9ZWxzZXtEPTB9fUc9YVtwPj4wXXwwO0Y9KEcmMSk9PTA7aWYoRil7SD0oRyYyNTUpPj4+MX1lbHNle0g9Y1tqPj4yXXwwfWlmKCgoY1t2Pj4yXXwwKS1FfDApPT0oSHwwKSl7aWYoRil7RT0oRyYyNTUpPj4+MTtHPShHJjI1NSk+Pj4xO0g9RTw8MX1lbHNle0U9Y1tqPj4yXXwwO0c9Y1tqPj4yXXwwO0g9RTw8MX1kb3tpZighKEc+Pj4wPEg+Pj4wKSl7aWYoRil7YVtwK0grMT4+MF09MDthW3A+PjBdPUU8PDI7YnJlYWt9ZWxzZXthWyhjW3c+PjJdfDApK0g+PjBdPTA7Y1tqPj4yXT1IO2JyZWFrfX1lbHNle2hnKHAsSC1HfDApfX13aGlsZSgwKTtIPWFbcD4+MF18MDtpZigoSCYxKT09MCl7Rz0xMH1lbHNle0c9Y1twPj4yXXwwO0g9RyYyNTU7Rz0oRyYtMikrIC0xfDB9Rj0oSCYxKT09MDtpZihGKXtIPShIJjI1NSk+Pj4xfWVsc2V7SD1jW2o+PjJdfDB9ZG97aWYoIShIPj4+MDxHPj4+MCkpe2lmKEYpe2FbcCtHKzE+PjBdPTA7YVtwPj4wXT1HPDwxO2JyZWFrfWVsc2V7YVsoY1t3Pj4yXXwwKStHPj4wXT0wO2Nbaj4+Ml09RzticmVha319ZWxzZXtoZyhwLEctSHwwKX19d2hpbGUoMCk7aWYoKGFbcD4+MF0mMSk9PTApe0Y9Z31lbHNle0Y9Y1tmPj4yXXwwfWNbdj4+Ml09RitFO0U9Rn1HPUErMTJ8MDtIPWNbRz4+Ml18MDtGPUErMTZ8MDtpZigoSHwwKT09KGNbRj4+Ml18MCkpe0g9b2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwfWVsc2V7SD1kW0g+PjBdfDB9aWYoKG9pKEgmMjU1LHUseSxFLHYseixCLG8sdCxzLHIseCl8MCkhPTApe2JyZWFrfUM9Y1tHPj4yXXwwO2lmKChDfDApPT0oY1tGPj4yXXwwKSl7b2NbY1soY1tBPj4yXXwwKSs0MD4+Ml0mMTI3XShBKXwwO2NvbnRpbnVlfWVsc2V7Y1tHPj4yXT1DKzE7Y29udGludWV9fXg9YVtvPj4wXXwwO2lmKCh4JjEpPT0wKXt4PSh4JjI1NSk+Pj4xfWVsc2V7eD1jW28rND4+Ml18MH1pZigoKHh8MCkhPTA/KGFbdT4+MF18MCkhPTA6MCk/KHE9Y1tzPj4yXXwwLChxLXR8MCk8MTYwKTowKXtIPWNbcj4+Ml18MDtjW3M+PjJdPXErNDtjW3E+PjJdPUh9aFtsPj4zXT0rRm0oRSxjW3Y+PjJdfDAsayk7cWsobyx0LGNbcz4+Ml18MCxrKTtpZighQyl7aWYoKGNbQSsxMj4+Ml18MCk9PShjW0ErMTY+PjJdfDApKXtIPShvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMTtBPUg/MDpBfX1lbHNle0E9MH1sPShBfDApPT0wO2Rve2lmKChEfDApIT0wKXtpZigoY1tEKzEyPj4yXXwwKSE9KGNbRCsxNj4+Ml18MCkpe2lmKGwpe2JyZWFrfWVsc2V7bT02ODticmVha319aWYoISgob2NbY1soY1tEPj4yXXwwKSszNj4+Ml0mMTI3XShEKXwwKT09LTEpKXtpZighbCl7bT02OH19ZWxzZXttPTY2fX1lbHNle209NjZ9fXdoaWxlKDApO2lmKChtfDApPT02Nj9sOjApe209Njh9aWYoKG18MCk9PTY4KXtjW2s+PjJdPWNbaz4+Ml18Mn1jW2I+PjJdPUE7aWYoISgoYVtwPj4wXSYxKT09MCk/KG49Y1t3Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZigoYVtvPj4wXSYxKT09MCl7aT1lO3JldHVybn1tPWNbbys4Pj4yXXwwO2lmKChtfDApPT0wKXtpPWU7cmV0dXJufXZuKG0pO2k9ZTtyZXR1cm59ZnVuY3Rpb24gV2goYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtlPWk7aT1pKzIyNHwwO249ZTtvPWUrMTg4fDA7bT1lKzE3NnwwO3c9ZSsxNnwwO3E9Y1toKzI4Pj4yXXwwO0Q9cSs0fDA7Y1tEPj4yXT0oY1tEPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tuPj4yXT0xMzQ1NjtjW24rND4+Ml09MjA4O2Nbbis4Pj4yXT0wO2NnKDEzNDU2LG4pfWg9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3I9Y1txKzg+PjJdfDA7aWYoKGNbcSsxMj4+Ml18MCktcj4+Mj4+PjA+aD4+PjA/KHA9Y1tyKyhoPDwyKT4+Ml18MCwocHwwKSE9MCk6MCl7dWNbY1soY1twPj4yXXwwKSszMj4+Ml0mMzFdKHAsMTIwMTYsMTIwNDJ8MCxvKXwwO0M9cSs0fDA7RD1jW0M+PjJdfDA7Y1tDPj4yXT1EKyAtMTtpZigoRHwwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfWNbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2hnKG0sMTApO2lmKChhW20+PjBdJjEpPT0wKXt6PW0rMXwwO2g9ejtxPW0rOHwwfWVsc2V7ej1tKzh8MDtoPW0rMXwwO3E9ejt6PWNbej4+Ml18MH11PW0rNHwwO3Y9bysyNHwwO3M9bysyNXwwO3Q9bysyNnwwO3I9bztwPW0rOHwwO3k9Y1tmPj4yXXwwO3g9MDtBPXo7YTp3aGlsZSgxKXtpZigoeXwwKSE9MCl7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApPyhvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTowKXtjW2Y+PjJdPTA7eT0wfX1lbHNle3k9MH1DPSh5fDApPT0wO0I9Y1tnPj4yXXwwO2Rve2lmKChCfDApIT0wKXtpZigoY1tCKzEyPj4yXXwwKSE9KGNbQisxNj4+Ml18MCkpe2lmKEMpe2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tCPj4yXXwwKSszNj4+Ml0mMTI3XShCKXwwKT09LTEpKXtpZihDKXticmVha31lbHNle2JyZWFrIGF9fWVsc2V7Y1tnPj4yXT0wO2w9MjY7YnJlYWt9fWVsc2V7bD0yNn19d2hpbGUoMCk7aWYoKGx8MCk9PTI2PyhsPTAsQyk6MCl7YnJlYWt9RD1hW20+PjBdfDA7Qj0oRCYxKT09MDtpZihCKXtDPShEJjI1NSk+Pj4xfWVsc2V7Qz1jW3U+PjJdfDB9aWYoKEEtenwwKT09KEN8MCkpe2lmKEIpe0E9KEQmMjU1KT4+PjE7Qz0oRCYyNTUpPj4+MTt6PUE8PDF9ZWxzZXtBPWNbdT4+Ml18MDtDPWNbdT4+Ml18MDt6PUE8PDF9ZG97aWYoIShDPj4+MDx6Pj4+MCkpe2lmKEIpe2FbbSt6KzE+PjBdPTA7YVttPj4wXT1BPDwyO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKSt6Pj4wXT0wO2NbdT4+Ml09ejticmVha319ZWxzZXtoZyhtLHotQ3wwKX19d2hpbGUoMCk7Qz1hW20+PjBdfDA7aWYoKEMmMSk9PTApe3o9MTB9ZWxzZXt6PWNbbT4+Ml18MDtDPXomMjU1O3o9KHomLTIpKyAtMXwwfUI9KEMmMSk9PTA7aWYoQil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1t1Pj4yXXwwfWRve2lmKCEoQz4+PjA8ej4+PjApKXtpZihCKXthW20reisxPj4wXT0wO2FbbT4+MF09ejw8MTticmVha31lbHNle2FbKGNbcD4+Ml18MCkrej4+MF09MDtjW3U+PjJdPXo7YnJlYWt9fWVsc2V7aGcobSx6LUN8MCl9fXdoaWxlKDApO2lmKChhW20+PjBdJjEpPT0wKXt6PWh9ZWxzZXt6PWNbcT4+Ml18MH1BPXorQXwwfUI9Y1t5KzEyPj4yXXwwO2lmKChCfDApPT0oY1t5KzE2Pj4yXXwwKSl7eT1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXt5PWRbQj4+MF18MH1CPXkmMjU1O3k9KEF8MCk9PSh6fDApO2Rve2lmKHkpe0M9KGFbdj4+MF18MCk9PUI8PDI0Pj4yNDtpZighQz8hKChhW3M+PjBdfDApPT1CPDwyND4+MjQpOjApe0M9bztsPTYxO2JyZWFrfWFbQT4+MF09Qz80Mzo0NTtBPUErMXwwO3g9MH1lbHNle0M9bztsPTYxfX13aGlsZSgwKTtkb3tpZigobHwwKT09NjEpe3doaWxlKDEpe2w9MDtpZigoYVtDPj4wXXwwKT09Qjw8MjQ+PjI0KXticmVha31DPUMrMXwwO2lmKChDfDApPT0odHwwKSl7Qz10O2JyZWFrfWVsc2V7bD02MX19Qj1DLXJ8MDtpZigoQnwwKT4yMyl7YnJlYWsgYX1pZigoQnwwKTwyMil7YVtBPj4wXT1hWzEyMDE2K0I+PjBdfDA7QT1BKzF8MDt4PXgrMXwwO2JyZWFrfWlmKHkpe3o9QTticmVhayBhfWlmKChBLXp8MCk+PTMpe2JyZWFrIGF9aWYoKGFbQSsgLTE+PjBdfDApIT00OCl7YnJlYWsgYX1hW0E+PjBdPWFbMTIwMTYrQj4+MF18MDtBPUErMXwwO3g9MH19d2hpbGUoMCk7eT1jW2Y+PjJdfDA7Qj15KzEyfDA7Qz1jW0I+PjJdfDA7aWYoKEN8MCk9PShjW3krMTY+PjJdfDApKXtvY1tjWyhjW3k+PjJdfDApKzQwPj4yXSYxMjddKHkpfDA7RD13O3c9RDtjb250aW51ZX1lbHNle2NbQj4+Ml09QysxO0Q9dzt3PUQ7Y29udGludWV9fWFbeiszPj4wXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1EPWNbMzM0MF18MDtjW24+PjJdPWs7aWYoKFloKHosRCxuKXwwKSE9MSl7Y1tqPj4yXT00fWs9Y1tmPj4yXXwwO2lmKChrfDApIT0wKXtpZigoY1trKzEyPj4yXXwwKT09KGNbaysxNj4+Ml18MCk/KG9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MCk9PS0xOjApe2NbZj4+Ml09MDtmPTB9ZWxzZXtmPWt9fWVsc2V7Zj0wfWs9KGZ8MCk9PTA7bj1jW2c+PjJdfDA7ZG97aWYoKG58MCkhPTApe2lmKChjW24rMTI+PjJdfDApIT0oY1tuKzE2Pj4yXXwwKSl7aWYoayl7YnJlYWt9ZWxzZXtsPTkyO2JyZWFrfX1pZighKChvY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDApPT0tMSkpe2lmKGspe2JyZWFrfWVsc2V7bD05MjticmVha319ZWxzZXtjW2c+PjJdPTA7bD05MDticmVha319ZWxzZXtsPTkwfX13aGlsZSgwKTtpZigobHwwKT09OTA/azowKXtsPTkyfWlmKChsfDApPT05Mil7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT1mO2lmKChhW20+PjBdJjEpPT0wKXtpPWU7cmV0dXJufWo9Y1twPj4yXXwwO2lmKChqfDApPT0wKXtpPWU7cmV0dXJufXZuKGopO2k9ZTtyZXR1cm59RD1YYSg0KXwwO2NbRD4+Ml09MjEzMDQ7d2IoRHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gWGgoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MDtuPWk7cD1jW2Y+PjJdfDA7bz0ocHwwKT09KGV8MCk7ZG97aWYobyl7cT0oYVttKzI0Pj4wXXwwKT09Yjw8MjQ+PjI0O2lmKCFxPyEoKGFbbSsyNT4+MF18MCk9PWI8PDI0Pj4yNCk6MCl7YnJlYWt9Y1tmPj4yXT1lKzE7YVtlPj4wXT1xPzQzOjQ1O2NbZz4+Ml09MDtxPTA7aT1uO3JldHVybiBxfDB9fXdoaWxlKDApO3E9YVtqPj4wXXwwO2lmKChxJjEpPT0wKXtqPShxJjI1NSk+Pj4xfWVsc2V7aj1jW2orND4+Ml18MH1pZigoanwwKSE9MD9iPDwyND4+MjQ9PWg8PDI0Pj4yNDowKXtvPWNbbD4+Ml18MDtpZigoby1rfDApPj0xNjApe3E9MDtpPW47cmV0dXJuIHF8MH1xPWNbZz4+Ml18MDtjW2w+PjJdPW8rNDtjW28+PjJdPXE7Y1tnPj4yXT0wO3E9MDtpPW47cmV0dXJuIHF8MH1sPW0rMjZ8MDtrPW07d2hpbGUoMSl7aWYoKGFbaz4+MF18MCk9PWI8PDI0Pj4yNCl7YnJlYWt9az1rKzF8MDtpZigoa3wwKT09KGx8MCkpe2s9bDticmVha319bT1rLW18MDtpZigobXwwKT4yMyl7cT0tMTtpPW47cmV0dXJuIHF8MH1pZigoZHwwKT09MTB8KGR8MCk9PTgpe2lmKChtfDApPj0oZHwwKSl7cT0tMTtpPW47cmV0dXJuIHF8MH19ZWxzZSBpZigoZHwwKT09MTY/KG18MCk+PTIyOjApe2lmKG8pe3E9LTE7aT1uO3JldHVybiBxfDB9aWYoKHAtZXwwKT49Myl7cT0tMTtpPW47cmV0dXJuIHF8MH1pZigoYVtwKyAtMT4+MF18MCkhPTQ4KXtxPS0xO2k9bjtyZXR1cm4gcXwwfWNbZz4+Ml09MDtxPWFbMTIwMTYrbT4+MF18MDtjW2Y+PjJdPXArMTthW3A+PjBdPXE7cT0wO2k9bjtyZXR1cm4gcXwwfXE9YVsxMjAxNittPj4wXXwwO2NbZj4+Ml09cCsxO2FbcD4+MF09cTtjW2c+PjJdPShjW2c+PjJdfDApKzE7cT0wO2k9bjtyZXR1cm4gcXwwfWZ1bmN0aW9uIFloKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MDtlPWk7aT1pKzE2fDA7Zj1lO2NbZj4+Ml09ZDtiPWliKGJ8MCl8MDthPU1hKGF8MCwxMjA1NixmfDApfDA7aWYoKGJ8MCk9PTApe2k9ZTtyZXR1cm4gYXwwfWliKGJ8MCl8MDtpPWU7cmV0dXJuIGF8MH1mdW5jdGlvbiBaaChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBfaChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gJGgoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7az1pO2k9aSs2NHwwO3A9azt1PWsrNDh8MDtxPWsrNTJ8MDt0PWsrNTZ8MDtzPWsrMTZ8MDtyPWsrMTJ8MDtsPWsrMjR8MDtpZigoY1tnKzQ+PjJdJjF8MCk9PTApe2NbcT4+Ml09LTE7bD1jWyhjW2Q+PjJdfDApKzE2Pj4yXXwwO2Nbcz4+Ml09Y1tlPj4yXTtjW3I+PjJdPWNbZj4+Ml07Y1t1KzA+PjJdPWNbcyswPj4yXTtjW3ArMD4+Ml09Y1tyKzA+PjJdO2ljW2wmNjNdKHQsZCx1LHAsZyxoLHEpO2w9Y1t0Pj4yXXwwO2NbZT4+Ml09bDtlPWNbcT4+Ml18MDtpZigoZXwwKT09MSl7YVtqPj4wXT0xfWVsc2UgaWYoKGV8MCk9PTApe2Fbaj4+MF09MH1lbHNle2Fbaj4+MF09MTtjW2g+PjJdPTR9Y1tiPj4yXT1sO2k9aztyZXR1cm59cT1nKzI4fDA7cj1jW3E+PjJdfDA7ZD1yKzR8MDtjW2Q+PjJdPShjW2Q+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW3A+PjJdPTEzNDQ4O2NbcCs0Pj4yXT0yMDg7Y1twKzg+PjJdPTA7Y2coMTM0NDgscCl9cz0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dD1jW3IrOD4+Ml18MDtpZigoY1tyKzEyPj4yXXwwKS10Pj4yPj4+MD5zPj4+MD8obz1jW3QrKHM8PDIpPj4yXXwwLChvfDApIT0wKTowKXt1PXIrNHwwO2Q9Y1t1Pj4yXXwwO2NbdT4+Ml09ZCsgLTE7aWYoKGR8MCk9PTApe2xjW2NbKGNbcj4+Ml18MCkrOD4+Ml0mMjU1XShyKX1xPWNbcT4+Ml18MDtkPXErNHwwO2NbZD4+Ml09KGNbZD4+Ml18MCkrMTtpZighKChjWzM0MDJdfDApPT0tMSkpe2NbcD4+Ml09MTM2MDg7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzYwOCxwKX1wPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtyPWNbcSs4Pj4yXXwwO2lmKChjW3ErMTI+PjJdfDApLXI+PjI+Pj4wPnA+Pj4wPyhuPWNbcisocDw8Mik+PjJdfDAsKG58MCkhPTApOjApe3U9cSs0fDA7ZD1jW3U+PjJdfDA7Y1t1Pj4yXT1kKyAtMTtpZigoZHwwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfW1jW2NbKGNbbj4+Ml18MCkrMjQ+PjJdJjEyN10obCxuKTtkPWwrMTJ8MDttY1tjWyhjW24+PjJdfDApKzI4Pj4yXSYxMjddKGQsbik7YVtqPj4wXT0oYWkoZSxjW2Y+PjJdfDAsbCxsKzI0fDAsbyxoLDEpfDApPT0obHwwKSYxO2NbYj4+Ml09Y1tlPj4yXTtpZighKChhW2Q+PjBdJjEpPT0wKT8obT1jW2wrMjA+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKChhW2w+PjBdJjEpPT0wKXtpPWs7cmV0dXJufWI9Y1tsKzg+PjJdfDA7aWYoKGJ8MCk9PTApe2k9aztyZXR1cm59dm4oYik7aT1rO3JldHVybn1kPVhhKDQpfDA7Y1tkPj4yXT0yMTMwNDt3YihkfDAsMjEzNzYsMTk2KX1kPVhhKDQpfDA7Y1tkPj4yXT0yMTMwNDt3YihkfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBhaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO2w9aTtpPWkrMTEyfDA7bj1sO3M9KGYtZXwwKS8xMnwwO2lmKHM+Pj4wPjEwMCl7bj11bihzKXwwO2lmKChufDApPT0wKXt6PVhhKDQpfDA7Y1t6Pj4yXT0yMjY4MDt3Yih6fDAsMjI3MjgsMjA2KX1lbHNle2s9bn19ZWxzZXtrPTB9bz0oZXwwKT09KGZ8MCk7aWYobyl7dD0wfWVsc2V7cD1lO3Q9MDtxPW47d2hpbGUoMSl7cj1hW3A+PjBdfDA7aWYoKHImMSk9PTApe3I9KHImMjU1KT4+PjF9ZWxzZXtyPWNbcCs0Pj4yXXwwfWlmKChyfDApPT0wKXthW3E+PjBdPTI7dD10KzF8MDtzPXMrIC0xfDB9ZWxzZXthW3E+PjBdPTF9cD1wKzEyfDA7aWYoKHB8MCk9PShmfDApKXticmVha31lbHNle3E9cSsxfDB9fX1wPTA7YTp3aGlsZSgxKXt1PShzfDApIT0wO3E9cDt3aGlsZSgxKXtyPWNbYj4+Ml18MDtkb3tpZigocnwwKSE9MCl7cD1jW3IrMTI+PjJdfDA7aWYoKHB8MCk9PShjW3IrMTY+PjJdfDApKXtwPW9jW2NbKGNbcj4+Ml18MCkrMzY+PjJdJjEyN10ocil8MH1lbHNle3A9Y1twPj4yXXwwfWlmKChwfDApPT0tMSl7Y1tiPj4yXT0wO3I9MTticmVha31lbHNle3I9KGNbYj4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7cj0xfX13aGlsZSgwKTtpZigoZHwwKT09MCl7cD0wO3c9MTtkPTB9ZWxzZXtwPWNbZCsxMj4+Ml18MDtpZigocHwwKT09KGNbZCsxNj4+Ml18MCkpe3A9b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7cD1jW3A+PjJdfDB9ej0ocHwwKT09LTE7cD16PzA6ZDt3PXo/MTowO2Q9ej8wOmR9dj1jW2I+PjJdfDA7aWYoISgocl53KSZ1KSl7YnJlYWsgYX1wPWNbdisxMj4+Ml18MDtpZigocHwwKT09KGNbdisxNj4+Ml18MCkpe3I9b2NbY1soY1t2Pj4yXXwwKSszNj4+Ml0mMTI3XSh2KXwwfWVsc2V7cj1jW3A+PjJdfDB9aWYoIWope3I9eGNbY1soY1tnPj4yXXwwKSsyOD4+Ml0mNjNdKGcscil8MH1wPXErMXwwO2lmKG8pe3E9cH1lbHNle2JyZWFrfX1iOmRve2lmKGope3c9MDt1PWU7dj1uO3doaWxlKDEpe2Rve2lmKChhW3Y+PjBdfDApPT0xKXt4PWFbdT4+MF18MDt5PSh4JjEpPT0wO2lmKHkpe3o9dSs0fDB9ZWxzZXt6PWNbdSs4Pj4yXXwwfWlmKChyfDApIT0oY1t6KyhxPDwyKT4+Ml18MCkpe2Fbdj4+MF09MDtzPXMrIC0xfDA7YnJlYWt9aWYoeSl7dz0oeCYyNTUpPj4+MX1lbHNle3c9Y1t1KzQ+PjJdfDB9aWYoKHd8MCk9PShwfDApKXthW3Y+PjBdPTI7dz0xO3Q9dCsxfDA7cz1zKyAtMXwwfWVsc2V7dz0xfX19d2hpbGUoMCk7dT11KzEyfDA7aWYoKHV8MCk9PShmfDApKXticmVhayBifXY9disxfDB9fWVsc2V7dz0wO3U9ZTt2PW47d2hpbGUoMSl7ZG97aWYoKGFbdj4+MF18MCk9PTEpe2lmKChhW3U+PjBdJjEpPT0wKXt4PXUrNHwwfWVsc2V7eD1jW3UrOD4+Ml18MH1pZigocnwwKSE9KHhjW2NbKGNbZz4+Ml18MCkrMjg+PjJdJjYzXShnLGNbeCsocTw8Mik+PjJdfDApfDApKXthW3Y+PjBdPTA7cz1zKyAtMXwwO2JyZWFrfXc9YVt1Pj4wXXwwO2lmKCh3JjEpPT0wKXt3PSh3JjI1NSk+Pj4xfWVsc2V7dz1jW3UrND4+Ml18MH1pZigod3wwKT09KHB8MCkpe2Fbdj4+MF09Mjt3PTE7dD10KzF8MDtzPXMrIC0xfDB9ZWxzZXt3PTF9fX13aGlsZSgwKTt1PXUrMTJ8MDtpZigodXwwKT09KGZ8MCkpe2JyZWFrIGJ9dj12KzF8MH19fXdoaWxlKDApO2lmKCF3KXtjb250aW51ZX11PWNbYj4+Ml18MDtyPXUrMTJ8MDtxPWNbcj4+Ml18MDtpZigocXwwKT09KGNbdSsxNj4+Ml18MCkpe29jW2NbKGNbdT4+Ml18MCkrNDA+PjJdJjEyN10odSl8MH1lbHNle2Nbcj4+Ml09cSs0fWlmKChzK3R8MCk+Pj4wPDIpe2NvbnRpbnVlfWVsc2V7cj1lO3E9bn13aGlsZSgxKXtpZigoYVtxPj4wXXwwKT09Mil7dT1hW3I+PjBdfDA7aWYoKHUmMSk9PTApe3U9KHUmMjU1KT4+PjF9ZWxzZXt1PWNbcis0Pj4yXXwwfWlmKCh1fDApIT0ocHwwKSl7YVtxPj4wXT0wO3Q9dCsgLTF8MH19cj1yKzEyfDA7aWYoKHJ8MCk9PShmfDApKXtjb250aW51ZSBhfWVsc2V7cT1xKzF8MH19fWRve2lmKCh2fDApIT0wKXtqPWNbdisxMj4+Ml18MDtpZigoanwwKT09KGNbdisxNj4+Ml18MCkpe2o9b2NbY1soY1t2Pj4yXXwwKSszNj4+Ml0mMTI3XSh2KXwwfWVsc2V7aj1jW2o+PjJdfDB9aWYoKGp8MCk9PS0xKXtjW2I+PjJdPTA7Yj0xO2JyZWFrfWVsc2V7Yj0oY1tiPj4yXXwwKT09MDticmVha319ZWxzZXtiPTF9fXdoaWxlKDApO2lmKChwfDApIT0wKXtqPWNbcCsxMj4+Ml18MDtpZigoanwwKT09KGNbcCsxNj4+Ml18MCkpe2o9b2NbY1soY1twPj4yXXwwKSszNj4+Ml0mMTI3XShwKXwwfWVsc2V7aj1jW2o+PjJdfDB9aWYoISgoanwwKT09LTEpKXtpZighYil7bT04OH19ZWxzZXttPTg2fX1lbHNle209ODZ9aWYoKG18MCk9PTg2P2I6MCl7bT04OH1pZigobXwwKT09ODgpe2NbaD4+Ml09Y1toPj4yXXwyfWM6ZG97aWYoIW8pe2lmKChhW24+PjBdfDApPT0yKXtmPWV9ZWxzZXt3aGlsZSgxKXtlPWUrMTJ8MDtuPW4rMXwwO2lmKChlfDApPT0oZnwwKSl7bT05MzticmVhayBjfWlmKChhW24+PjBdfDApPT0yKXtmPWU7YnJlYWt9fX19ZWxzZXttPTkzfX13aGlsZSgwKTtpZigobXwwKT09OTMpe2NbaD4+Ml09Y1toPj4yXXw0fWlmKChrfDApPT0wKXtpPWw7cmV0dXJuIGZ8MH12bihrKTtpPWw7cmV0dXJuIGZ8MH1mdW5jdGlvbiBiaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtkPWk7aT1pKzMwNHwwO3U9ZCsxNjB8MDtvPWQrMjgwfDA7bj1kKzI2NHwwO209ZCsyODR8MDt0PWQrMzAwfDA7cj1kO3M9ZCsyNzZ8MDtxPWQrMjk2fDA7dz1jW2U+PjJdfDA7eT1jW2Y+PjJdfDA7Zj1jW2crND4+Ml0mNzQ7aWYoKGZ8MCk9PTY0KXtmPTh9ZWxzZSBpZigoZnwwKT09MCl7Zj0wfWVsc2UgaWYoKGZ8MCk9PTgpe2Y9MTZ9ZWxzZXtmPTEwfXBpKG4sZyx1LG8pO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2hnKG0sMTApO2lmKChhW20+PjBdJjEpPT0wKXt6PW0rMXwwO2U9ejtnPW0rOHwwfWVsc2V7ej1tKzh8MDtlPW0rMXwwO2c9ejt6PWNbej4+Ml18MH1jW3Q+PjJdPXo7Y1tzPj4yXT1yO2NbcT4+Ml09MDt2PW0rNHwwO3g9Y1tvPj4yXXwwO289bSs4fDA7d2hpbGUoMSl7aWYoKHd8MCk9PTApe0E9MTt3PTB9ZWxzZXtBPWNbdysxMj4+Ml18MDtpZigoQXwwKT09KGNbdysxNj4+Ml18MCkpe0E9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7QT1jW0E+PjJdfDB9Qz0oQXwwKT09LTE7QT1DPzE6MDt3PUM/MDp3fWlmKCh5fDApIT0wKXtCPWNbeSsxMj4+Ml18MDtpZigoQnwwKT09KGNbeSsxNj4+Ml18MCkpe0I9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7Qj1jW0I+PjJdfDB9aWYoISgoQnwwKT09LTEpKXtpZighQSl7YnJlYWt9fWVsc2V7az0yMH19ZWxzZXtrPTIwfWlmKChrfDApPT0yMCl7az0wO2lmKEEpe3k9MDticmVha31lbHNle3k9MH19QT1hW20+PjBdfDA7Qj0oQSYxKT09MDtpZihCKXtDPShBJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9aWYoKChjW3Q+PjJdfDApLXp8MCk9PShDfDApKXtpZihCKXtEPShBJjI1NSk+Pj4xO3o9KEEmMjU1KT4+PjE7Qz1EPDwxO0E9RH1lbHNle0E9Y1t2Pj4yXXwwO3o9Y1t2Pj4yXXwwO0M9QTw8MX1kb3tpZighKHo+Pj4wPEM+Pj4wKSl7aWYoQil7YVttK0MrMT4+MF09MDthW20+PjBdPUE8PDI7YnJlYWt9ZWxzZXthWyhjW28+PjJdfDApK0M+PjBdPTA7Y1t2Pj4yXT1DO2JyZWFrfX1lbHNle2hnKG0sQy16fDApfX13aGlsZSgwKTtDPWFbbT4+MF18MDtpZigoQyYxKT09MCl7Qj0xMH1lbHNle0I9Y1ttPj4yXXwwO0M9QiYyNTU7Qj0oQiYtMikrIC0xfDB9ej0oQyYxKT09MDtpZih6KXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9ZG97aWYoIShDPj4+MDxCPj4+MCkpe2lmKHope2FbbStCKzE+PjBdPTA7YVttPj4wXT1CPDwxO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStCPj4wXT0wO2Nbdj4+Ml09QjticmVha319ZWxzZXtoZyhtLEItQ3wwKX19d2hpbGUoMCk7aWYoKGFbbT4+MF0mMSk9PTApe3o9ZX1lbHNle3o9Y1tnPj4yXXwwfWNbdD4+Ml09eitBfUE9dysxMnwwO0M9Y1tBPj4yXXwwO0I9dysxNnwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7Qz1vY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSYxMjddKHcpfDB9ZWxzZXtDPWNbQz4+Ml18MH1pZigobGkoQyxmLHosdCxxLHgsbixyLHMsdSl8MCkhPTApe2JyZWFrfUM9Y1tBPj4yXXwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7b2NbY1soY1t3Pj4yXXwwKSs0MD4+Ml0mMTI3XSh3KXwwO2NvbnRpbnVlfWVsc2V7Y1tBPj4yXT1DKzQ7Y29udGludWV9fXU9YVtuPj4wXXwwO2lmKCh1JjEpPT0wKXt1PSh1JjI1NSk+Pj4xfWVsc2V7dT1jW24rND4+Ml18MH1pZigodXwwKSE9MD8ocD1jW3M+PjJdfDAsKHAtcnwwKTwxNjApOjApe0Q9Y1txPj4yXXwwO2Nbcz4+Ml09cCs0O2NbcD4+Ml09RH1jW2o+PjJdPU5tKHosY1t0Pj4yXXwwLGgsZil8MDtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gY2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTA7ZD1pO2k9aSszMDR8MDt1PWQrMTYwfDA7bz1kKzI4MHwwO249ZCsyNjR8MDttPWQrMjg0fDA7dD1kKzMwMHwwO3I9ZDtzPWQrMjc2fDA7cT1kKzI5NnwwO3c9Y1tlPj4yXXwwO3k9Y1tmPj4yXXwwO2Y9Y1tnKzQ+PjJdJjc0O2lmKChmfDApPT04KXtmPTE2fWVsc2UgaWYoKGZ8MCk9PTY0KXtmPTh9ZWxzZSBpZigoZnwwKT09MCl7Zj0wfWVsc2V7Zj0xMH1waShuLGcsdSxvKTtjW20rMD4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtoZyhtLDEwKTtpZigoYVttPj4wXSYxKT09MCl7ej1tKzF8MDtlPXo7Zz1tKzh8MH1lbHNle3o9bSs4fDA7ZT1tKzF8MDtnPXo7ej1jW3o+PjJdfDB9Y1t0Pj4yXT16O2Nbcz4+Ml09cjtjW3E+PjJdPTA7dj1tKzR8MDt4PWNbbz4+Ml18MDtvPW0rOHwwO3doaWxlKDEpe2lmKCh3fDApPT0wKXtBPTE7dz0wfWVsc2V7QT1jW3crMTI+PjJdfDA7aWYoKEF8MCk9PShjW3crMTY+PjJdfDApKXtBPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle0E9Y1tBPj4yXXwwfUM9KEF8MCk9PS0xO0E9Qz8xOjA7dz1DPzA6d31pZigoeXwwKSE9MCl7Qj1jW3krMTI+PjJdfDA7aWYoKEJ8MCk9PShjW3krMTY+PjJdfDApKXtCPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle0I9Y1tCPj4yXXwwfWlmKCEoKEJ8MCk9PS0xKSl7aWYoIUEpe2JyZWFrfX1lbHNle2s9MjB9fWVsc2V7az0yMH1pZigoa3wwKT09MjApe2s9MDtpZihBKXt5PTA7YnJlYWt9ZWxzZXt5PTB9fUE9YVttPj4wXXwwO0I9KEEmMSk9PTA7aWYoQil7Qz0oQSYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWlmKCgoY1t0Pj4yXXwwKS16fDApPT0oQ3wwKSl7aWYoQil7RD0oQSYyNTUpPj4+MTt6PShBJjI1NSk+Pj4xO0M9RDw8MTtBPUR9ZWxzZXtBPWNbdj4+Ml18MDt6PWNbdj4+Ml18MDtDPUE8PDF9ZG97aWYoISh6Pj4+MDxDPj4+MCkpe2lmKEIpe2FbbStDKzE+PjBdPTA7YVttPj4wXT1BPDwyO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStDPj4wXT0wO2Nbdj4+Ml09QzticmVha319ZWxzZXtoZyhtLEMtenwwKX19d2hpbGUoMCk7Qz1hW20+PjBdfDA7aWYoKEMmMSk9PTApe0I9MTB9ZWxzZXtCPWNbbT4+Ml18MDtDPUImMjU1O0I9KEImLTIpKyAtMXwwfXo9KEMmMSk9PTA7aWYoeil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWRve2lmKCEoQz4+PjA8Qj4+PjApKXtpZih6KXthW20rQisxPj4wXT0wO2FbbT4+MF09Qjw8MTticmVha31lbHNle2FbKGNbbz4+Ml18MCkrQj4+MF09MDtjW3Y+PjJdPUI7YnJlYWt9fWVsc2V7aGcobSxCLUN8MCl9fXdoaWxlKDApO2lmKChhW20+PjBdJjEpPT0wKXt6PWV9ZWxzZXt6PWNbZz4+Ml18MH1jW3Q+PjJdPXorQX1BPXcrMTJ8MDtDPWNbQT4+Ml18MDtCPXcrMTZ8MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe0M9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7Qz1jW0M+PjJdfDB9aWYoKGxpKEMsZix6LHQscSx4LG4scixzLHUpfDApIT0wKXticmVha31DPWNbQT4+Ml18MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe29jW2NbKGNbdz4+Ml18MCkrNDA+PjJdJjEyN10odyl8MDtjb250aW51ZX1lbHNle2NbQT4+Ml09Qys0O2NvbnRpbnVlfX11PWFbbj4+MF18MDtpZigodSYxKT09MCl7dT0odSYyNTUpPj4+MX1lbHNle3U9Y1tuKzQ+PjJdfDB9aWYoKHV8MCkhPTA/KHA9Y1tzPj4yXXwwLChwLXJ8MCk8MTYwKTowKXtEPWNbcT4+Ml18MDtjW3M+PjJdPXArNDtjW3A+PjJdPUR9Qz1NbSh6LGNbdD4+Ml18MCxoLGYpfDA7RD1qO2NbRD4+Ml09QztjW0QrND4+Ml09STtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZGkoZCxlLGYsZyxoLGosayl7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTA7ZT1pO2k9aSszMDR8MDt2PWUrMTYwfDA7cD1lKzI4MHwwO289ZSsyNjR8MDtuPWUrMjg0fDA7dT1lKzMwMHwwO3M9ZTt0PWUrMjc2fDA7cj1lKzI5NnwwO3g9Y1tmPj4yXXwwO3o9Y1tnPj4yXXwwO2c9Y1toKzQ+PjJdJjc0O2lmKChnfDApPT0wKXtnPTB9ZWxzZSBpZigoZ3wwKT09NjQpe2c9OH1lbHNlIGlmKChnfDApPT04KXtnPTE2fWVsc2V7Zz0xMH1waShvLGgsdixwKTtjW24rMD4+Ml09MDtjW24rND4+Ml09MDtjW24rOD4+Ml09MDtoZyhuLDEwKTtpZigoYVtuPj4wXSYxKT09MCl7QT1uKzF8MDtmPUE7aD1uKzh8MH1lbHNle0E9bis4fDA7Zj1uKzF8MDtoPUE7QT1jW0E+PjJdfDB9Y1t1Pj4yXT1BO2NbdD4+Ml09cztjW3I+PjJdPTA7dz1uKzR8MDt5PWNbcD4+Ml18MDtwPW4rOHwwO3doaWxlKDEpe2lmKCh4fDApPT0wKXtCPTE7eD0wfWVsc2V7Qj1jW3grMTI+PjJdfDA7aWYoKEJ8MCk9PShjW3grMTY+PjJdfDApKXtCPW9jW2NbKGNbeD4+Ml18MCkrMzY+PjJdJjEyN10oeCl8MH1lbHNle0I9Y1tCPj4yXXwwfUQ9KEJ8MCk9PS0xO0I9RD8xOjA7eD1EPzA6eH1pZigoenwwKSE9MCl7Qz1jW3orMTI+PjJdfDA7aWYoKEN8MCk9PShjW3orMTY+PjJdfDApKXtDPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle0M9Y1tDPj4yXXwwfWlmKCEoKEN8MCk9PS0xKSl7aWYoIUIpe2JyZWFrfX1lbHNle2w9MjB9fWVsc2V7bD0yMH1pZigobHwwKT09MjApe2w9MDtpZihCKXt6PTA7YnJlYWt9ZWxzZXt6PTB9fUI9YVtuPj4wXXwwO0M9KEImMSk9PTA7aWYoQyl7RD0oQiYyNTUpPj4+MX1lbHNle0Q9Y1t3Pj4yXXwwfWlmKCgoY1t1Pj4yXXwwKS1BfDApPT0oRHwwKSl7aWYoQyl7RT0oQiYyNTUpPj4+MTtBPShCJjI1NSk+Pj4xO0Q9RTw8MTtCPUV9ZWxzZXtCPWNbdz4+Ml18MDtBPWNbdz4+Ml18MDtEPUI8PDF9ZG97aWYoIShBPj4+MDxEPj4+MCkpe2lmKEMpe2FbbitEKzE+PjBdPTA7YVtuPj4wXT1CPDwyO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKStEPj4wXT0wO2Nbdz4+Ml09RDticmVha319ZWxzZXtoZyhuLEQtQXwwKX19d2hpbGUoMCk7RD1hW24+PjBdfDA7aWYoKEQmMSk9PTApe0M9MTB9ZWxzZXtDPWNbbj4+Ml18MDtEPUMmMjU1O0M9KEMmLTIpKyAtMXwwfUE9KEQmMSk9PTA7aWYoQSl7RD0oRCYyNTUpPj4+MX1lbHNle0Q9Y1t3Pj4yXXwwfWRve2lmKCEoRD4+PjA8Qz4+PjApKXtpZihBKXthW24rQysxPj4wXT0wO2Fbbj4+MF09Qzw8MTticmVha31lbHNle2FbKGNbcD4+Ml18MCkrQz4+MF09MDtjW3c+PjJdPUM7YnJlYWt9fWVsc2V7aGcobixDLUR8MCl9fXdoaWxlKDApO2lmKChhW24+PjBdJjEpPT0wKXtBPWZ9ZWxzZXtBPWNbaD4+Ml18MH1jW3U+PjJdPUErQn1CPXgrMTJ8MDtEPWNbQj4+Ml18MDtDPXgrMTZ8MDtpZigoRHwwKT09KGNbQz4+Ml18MCkpe0Q9b2NbY1soY1t4Pj4yXXwwKSszNj4+Ml0mMTI3XSh4KXwwfWVsc2V7RD1jW0Q+PjJdfDB9aWYoKGxpKEQsZyxBLHUscix5LG8scyx0LHYpfDApIT0wKXticmVha31EPWNbQj4+Ml18MDtpZigoRHwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbeD4+Ml18MCkrNDA+PjJdJjEyN10oeCl8MDtjb250aW51ZX1lbHNle2NbQj4+Ml09RCs0O2NvbnRpbnVlfX12PWFbbz4+MF18MDtpZigodiYxKT09MCl7dj0odiYyNTUpPj4+MX1lbHNle3Y9Y1tvKzQ+PjJdfDB9aWYoKHZ8MCkhPTA/KHE9Y1t0Pj4yXXwwLChxLXN8MCk8MTYwKTowKXtFPWNbcj4+Ml18MDtjW3Q+PjJdPXErNDtjW3E+PjJdPUV9YltrPj4xXT1MbShBLGNbdT4+Ml18MCxqLGcpfDA7cWsobyxzLGNbdD4+Ml18MCxqKTtpZigoeHwwKT09MCl7az0wO3E9MX1lbHNle2s9Y1t4KzEyPj4yXXwwO2lmKChrfDApPT0oY1t4KzE2Pj4yXXwwKSl7az1vY1tjWyhjW3g+PjJdfDApKzM2Pj4yXSYxMjddKHgpfDB9ZWxzZXtrPWNbaz4+Ml18MH1xPShrfDApPT0tMTtrPXE/MDp4O3E9cT8xOjB9aWYoKHp8MCkhPTApe3I9Y1t6KzEyPj4yXXwwO2lmKChyfDApPT0oY1t6KzE2Pj4yXXwwKSl7cj1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtyPWNbcj4+Ml18MH1pZighKChyfDApPT0tMSkpe2lmKCFxKXtsPTczfX1lbHNle2w9NzF9fWVsc2V7bD03MX1pZigobHwwKT09NzE/cTowKXtsPTczfWlmKChsfDApPT03Myl7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tkPj4yXT1rO2lmKCEoKGFbbj4+MF0mMSk9PTApPyhtPWNbcD4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoKGFbbz4+MF0mMSk9PTApe2k9ZTtyZXR1cm59aj1jW28rOD4+Ml18MDtpZigoanwwKT09MCl7aT1lO3JldHVybn12bihqKTtpPWU7cmV0dXJufWZ1bmN0aW9uIGVpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wO2Q9aTtpPWkrMzA0fDA7dT1kKzE2MHwwO289ZCsyODB8MDtuPWQrMjY0fDA7bT1kKzI4NHwwO3Q9ZCszMDB8MDtyPWQ7cz1kKzI3NnwwO3E9ZCsyOTZ8MDt3PWNbZT4+Ml18MDt5PWNbZj4+Ml18MDtmPWNbZys0Pj4yXSY3NDtpZigoZnwwKT09OCl7Zj0xNn1lbHNlIGlmKChmfDApPT02NCl7Zj04fWVsc2UgaWYoKGZ8MCk9PTApe2Y9MH1lbHNle2Y9MTB9cGkobixnLHUsbyk7Y1ttKzA+PjJdPTA7Y1ttKzQ+PjJdPTA7Y1ttKzg+PjJdPTA7aGcobSwxMCk7aWYoKGFbbT4+MF0mMSk9PTApe3o9bSsxfDA7ZT16O2c9bSs4fDB9ZWxzZXt6PW0rOHwwO2U9bSsxfDA7Zz16O3o9Y1t6Pj4yXXwwfWNbdD4+Ml09ejtjW3M+PjJdPXI7Y1txPj4yXT0wO3Y9bSs0fDA7eD1jW28+PjJdfDA7bz1tKzh8MDt3aGlsZSgxKXtpZigod3wwKT09MCl7QT0xO3c9MH1lbHNle0E9Y1t3KzEyPj4yXXwwO2lmKChBfDApPT0oY1t3KzE2Pj4yXXwwKSl7QT1vY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSYxMjddKHcpfDB9ZWxzZXtBPWNbQT4+Ml18MH1DPShBfDApPT0tMTtBPUM/MTowO3c9Qz8wOnd9aWYoKHl8MCkhPTApe0I9Y1t5KzEyPj4yXXwwO2lmKChCfDApPT0oY1t5KzE2Pj4yXXwwKSl7Qj1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXtCPWNbQj4+Ml18MH1pZighKChCfDApPT0tMSkpe2lmKCFBKXticmVha319ZWxzZXtrPTIwfX1lbHNle2s9MjB9aWYoKGt8MCk9PTIwKXtrPTA7aWYoQSl7eT0wO2JyZWFrfWVsc2V7eT0wfX1BPWFbbT4+MF18MDtCPShBJjEpPT0wO2lmKEIpe0M9KEEmMjU1KT4+PjF9ZWxzZXtDPWNbdj4+Ml18MH1pZigoKGNbdD4+Ml18MCktenwwKT09KEN8MCkpe2lmKEIpe0Q9KEEmMjU1KT4+PjE7ej0oQSYyNTUpPj4+MTtDPUQ8PDE7QT1EfWVsc2V7QT1jW3Y+PjJdfDA7ej1jW3Y+PjJdfDA7Qz1BPDwxfWRve2lmKCEoej4+PjA8Qz4+PjApKXtpZihCKXthW20rQysxPj4wXT0wO2FbbT4+MF09QTw8MjticmVha31lbHNle2FbKGNbbz4+Ml18MCkrQz4+MF09MDtjW3Y+PjJdPUM7YnJlYWt9fWVsc2V7aGcobSxDLXp8MCl9fXdoaWxlKDApO0M9YVttPj4wXXwwO2lmKChDJjEpPT0wKXtCPTEwfWVsc2V7Qj1jW20+PjJdfDA7Qz1CJjI1NTtCPShCJi0yKSsgLTF8MH16PShDJjEpPT0wO2lmKHope0M9KEMmMjU1KT4+PjF9ZWxzZXtDPWNbdj4+Ml18MH1kb3tpZighKEM+Pj4wPEI+Pj4wKSl7aWYoeil7YVttK0IrMT4+MF09MDthW20+PjBdPUI8PDE7YnJlYWt9ZWxzZXthWyhjW28+PjJdfDApK0I+PjBdPTA7Y1t2Pj4yXT1CO2JyZWFrfX1lbHNle2hnKG0sQi1DfDApfX13aGlsZSgwKTtpZigoYVttPj4wXSYxKT09MCl7ej1lfWVsc2V7ej1jW2c+PjJdfDB9Y1t0Pj4yXT16K0F9QT13KzEyfDA7Qz1jW0E+PjJdfDA7Qj13KzE2fDA7aWYoKEN8MCk9PShjW0I+PjJdfDApKXtDPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle0M9Y1tDPj4yXXwwfWlmKChsaShDLGYseix0LHEseCxuLHIscyx1KXwwKSE9MCl7YnJlYWt9Qz1jW0E+PjJdfDA7aWYoKEN8MCk9PShjW0I+PjJdfDApKXtvY1tjWyhjW3c+PjJdfDApKzQwPj4yXSYxMjddKHcpfDA7Y29udGludWV9ZWxzZXtjW0E+PjJdPUMrNDtjb250aW51ZX19dT1hW24+PjBdfDA7aWYoKHUmMSk9PTApe3U9KHUmMjU1KT4+PjF9ZWxzZXt1PWNbbis0Pj4yXXwwfWlmKCh1fDApIT0wPyhwPWNbcz4+Ml18MCwocC1yfDApPDE2MCk6MCl7RD1jW3E+PjJdfDA7Y1tzPj4yXT1wKzQ7Y1twPj4yXT1EfWNbaj4+Ml09S20oeixjW3Q+PjJdfDAsaCxmKXwwO3FrKG4scixjW3M+PjJdfDAsaCk7aWYoKHd8MCk9PTApe2o9MDtwPTF9ZWxzZXtqPWNbdysxMj4+Ml18MDtpZigoanwwKT09KGNbdysxNj4+Ml18MCkpe2o9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7aj1jW2o+PjJdfDB9cD0oanwwKT09LTE7aj1wPzA6dztwPXA/MTowfWlmKCh5fDApIT0wKXtxPWNbeSsxMj4+Ml18MDtpZigocXwwKT09KGNbeSsxNj4+Ml18MCkpe3E9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7cT1jW3E+PjJdfDB9aWYoISgocXwwKT09LTEpKXtpZighcCl7az03M319ZWxzZXtrPTcxfX1lbHNle2s9NzF9aWYoKGt8MCk9PTcxP3A6MCl7az03M31pZigoa3wwKT09NzMpe2NbaD4+Ml09Y1toPj4yXXwyfWNbYj4+Ml09ajtpZighKChhW20+PjBdJjEpPT0wKT8obD1jW28+PjJdfDAsKGx8MCkhPTApOjApe3ZuKGwpfWlmKChhW24+PjBdJjEpPT0wKXtpPWQ7cmV0dXJufWg9Y1tuKzg+PjJdfDA7aWYoKGh8MCk9PTApe2k9ZDtyZXR1cm59dm4oaCk7aT1kO3JldHVybn1mdW5jdGlvbiBmaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtkPWk7aT1pKzMwNHwwO3U9ZCsxNjB8MDtvPWQrMjgwfDA7bj1kKzI2NHwwO209ZCsyODR8MDt0PWQrMzAwfDA7cj1kO3M9ZCsyNzZ8MDtxPWQrMjk2fDA7dz1jW2U+PjJdfDA7eT1jW2Y+PjJdfDA7Zj1jW2crND4+Ml0mNzQ7aWYoKGZ8MCk9PTApe2Y9MH1lbHNlIGlmKChmfDApPT02NCl7Zj04fWVsc2UgaWYoKGZ8MCk9PTgpe2Y9MTZ9ZWxzZXtmPTEwfXBpKG4sZyx1LG8pO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2hnKG0sMTApO2lmKChhW20+PjBdJjEpPT0wKXt6PW0rMXwwO2U9ejtnPW0rOHwwfWVsc2V7ej1tKzh8MDtlPW0rMXwwO2c9ejt6PWNbej4+Ml18MH1jW3Q+PjJdPXo7Y1tzPj4yXT1yO2NbcT4+Ml09MDt2PW0rNHwwO3g9Y1tvPj4yXXwwO289bSs4fDA7d2hpbGUoMSl7aWYoKHd8MCk9PTApe0E9MTt3PTB9ZWxzZXtBPWNbdysxMj4+Ml18MDtpZigoQXwwKT09KGNbdysxNj4+Ml18MCkpe0E9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7QT1jW0E+PjJdfDB9Qz0oQXwwKT09LTE7QT1DPzE6MDt3PUM/MDp3fWlmKCh5fDApIT0wKXtCPWNbeSsxMj4+Ml18MDtpZigoQnwwKT09KGNbeSsxNj4+Ml18MCkpe0I9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7Qj1jW0I+PjJdfDB9aWYoISgoQnwwKT09LTEpKXtpZighQSl7YnJlYWt9fWVsc2V7az0yMH19ZWxzZXtrPTIwfWlmKChrfDApPT0yMCl7az0wO2lmKEEpe3k9MDticmVha31lbHNle3k9MH19QT1hW20+PjBdfDA7Qj0oQSYxKT09MDtpZihCKXtDPShBJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9aWYoKChjW3Q+PjJdfDApLXp8MCk9PShDfDApKXtpZihCKXtEPShBJjI1NSk+Pj4xO3o9KEEmMjU1KT4+PjE7Qz1EPDwxO0E9RH1lbHNle0E9Y1t2Pj4yXXwwO3o9Y1t2Pj4yXXwwO0M9QTw8MX1kb3tpZighKHo+Pj4wPEM+Pj4wKSl7aWYoQil7YVttK0MrMT4+MF09MDthW20+PjBdPUE8PDI7YnJlYWt9ZWxzZXthWyhjW28+PjJdfDApK0M+PjBdPTA7Y1t2Pj4yXT1DO2JyZWFrfX1lbHNle2hnKG0sQy16fDApfX13aGlsZSgwKTtDPWFbbT4+MF18MDtpZigoQyYxKT09MCl7Qj0xMH1lbHNle0I9Y1ttPj4yXXwwO0M9QiYyNTU7Qj0oQiYtMikrIC0xfDB9ej0oQyYxKT09MDtpZih6KXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9ZG97aWYoIShDPj4+MDxCPj4+MCkpe2lmKHope2FbbStCKzE+PjBdPTA7YVttPj4wXT1CPDwxO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStCPj4wXT0wO2Nbdj4+Ml09QjticmVha319ZWxzZXtoZyhtLEItQ3wwKX19d2hpbGUoMCk7aWYoKGFbbT4+MF0mMSk9PTApe3o9ZX1lbHNle3o9Y1tnPj4yXXwwfWNbdD4+Ml09eitBfUE9dysxMnwwO0M9Y1tBPj4yXXwwO0I9dysxNnwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7Qz1vY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSYxMjddKHcpfDB9ZWxzZXtDPWNbQz4+Ml18MH1pZigobGkoQyxmLHosdCxxLHgsbixyLHMsdSl8MCkhPTApe2JyZWFrfUM9Y1tBPj4yXXwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7b2NbY1soY1t3Pj4yXXwwKSs0MD4+Ml0mMTI3XSh3KXwwO2NvbnRpbnVlfWVsc2V7Y1tBPj4yXT1DKzQ7Y29udGludWV9fXU9YVtuPj4wXXwwO2lmKCh1JjEpPT0wKXt1PSh1JjI1NSk+Pj4xfWVsc2V7dT1jW24rND4+Ml18MH1pZigodXwwKSE9MD8ocD1jW3M+PjJdfDAsKHAtcnwwKTwxNjApOjApe0Q9Y1txPj4yXXwwO2Nbcz4+Ml09cCs0O2NbcD4+Ml09RH1jW2o+PjJdPUptKHosY1t0Pj4yXXwwLGgsZil8MDtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZ2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTA7ZD1pO2k9aSszMDR8MDt1PWQrMTYwfDA7bz1kKzI4MHwwO249ZCsyNjR8MDttPWQrMjg0fDA7dD1kKzMwMHwwO3I9ZDtzPWQrMjc2fDA7cT1kKzI5NnwwO3c9Y1tlPj4yXXwwO3k9Y1tmPj4yXXwwO2Y9Y1tnKzQ+PjJdJjc0O2lmKChmfDApPT04KXtmPTE2fWVsc2UgaWYoKGZ8MCk9PTApe2Y9MH1lbHNlIGlmKChmfDApPT02NCl7Zj04fWVsc2V7Zj0xMH1waShuLGcsdSxvKTtjW20rMD4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtoZyhtLDEwKTtpZigoYVttPj4wXSYxKT09MCl7ej1tKzF8MDtlPXo7Zz1tKzh8MH1lbHNle3o9bSs4fDA7ZT1tKzF8MDtnPXo7ej1jW3o+PjJdfDB9Y1t0Pj4yXT16O2Nbcz4+Ml09cjtjW3E+PjJdPTA7dj1tKzR8MDt4PWNbbz4+Ml18MDtvPW0rOHwwO3doaWxlKDEpe2lmKCh3fDApPT0wKXtBPTE7dz0wfWVsc2V7QT1jW3crMTI+PjJdfDA7aWYoKEF8MCk9PShjW3crMTY+PjJdfDApKXtBPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle0E9Y1tBPj4yXXwwfUM9KEF8MCk9PS0xO0E9Qz8xOjA7dz1DPzA6d31pZigoeXwwKSE9MCl7Qj1jW3krMTI+PjJdfDA7aWYoKEJ8MCk9PShjW3krMTY+PjJdfDApKXtCPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle0I9Y1tCPj4yXXwwfWlmKCEoKEJ8MCk9PS0xKSl7aWYoIUEpe2JyZWFrfX1lbHNle2s9MjB9fWVsc2V7az0yMH1pZigoa3wwKT09MjApe2s9MDtpZihBKXt5PTA7YnJlYWt9ZWxzZXt5PTB9fUE9YVttPj4wXXwwO0I9KEEmMSk9PTA7aWYoQil7Qz0oQSYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWlmKCgoY1t0Pj4yXXwwKS16fDApPT0oQ3wwKSl7aWYoQil7RD0oQSYyNTUpPj4+MTt6PShBJjI1NSk+Pj4xO0M9RDw8MTtBPUR9ZWxzZXtBPWNbdj4+Ml18MDt6PWNbdj4+Ml18MDtDPUE8PDF9ZG97aWYoISh6Pj4+MDxDPj4+MCkpe2lmKEIpe2FbbStDKzE+PjBdPTA7YVttPj4wXT1BPDwyO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStDPj4wXT0wO2Nbdj4+Ml09QzticmVha319ZWxzZXtoZyhtLEMtenwwKX19d2hpbGUoMCk7Qz1hW20+PjBdfDA7aWYoKEMmMSk9PTApe0I9MTB9ZWxzZXtCPWNbbT4+Ml18MDtDPUImMjU1O0I9KEImLTIpKyAtMXwwfXo9KEMmMSk9PTA7aWYoeil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWRve2lmKCEoQz4+PjA8Qj4+PjApKXtpZih6KXthW20rQisxPj4wXT0wO2FbbT4+MF09Qjw8MTticmVha31lbHNle2FbKGNbbz4+Ml18MCkrQj4+MF09MDtjW3Y+PjJdPUI7YnJlYWt9fWVsc2V7aGcobSxCLUN8MCl9fXdoaWxlKDApO2lmKChhW20+PjBdJjEpPT0wKXt6PWV9ZWxzZXt6PWNbZz4+Ml18MH1jW3Q+PjJdPXorQX1BPXcrMTJ8MDtDPWNbQT4+Ml18MDtCPXcrMTZ8MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe0M9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7Qz1jW0M+PjJdfDB9aWYoKGxpKEMsZix6LHQscSx4LG4scixzLHUpfDApIT0wKXticmVha31DPWNbQT4+Ml18MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe29jW2NbKGNbdz4+Ml18MCkrNDA+PjJdJjEyN10odyl8MDtjb250aW51ZX1lbHNle2NbQT4+Ml09Qys0O2NvbnRpbnVlfX11PWFbbj4+MF18MDtpZigodSYxKT09MCl7dT0odSYyNTUpPj4+MX1lbHNle3U9Y1tuKzQ+PjJdfDB9aWYoKHV8MCkhPTA/KHA9Y1tzPj4yXXwwLChwLXJ8MCk8MTYwKTowKXtEPWNbcT4+Ml18MDtjW3M+PjJdPXArNDtjW3A+PjJdPUR9Qz1JbSh6LGNbdD4+Ml18MCxoLGYpfDA7RD1qO2NbRD4+Ml09QztjW0QrND4+Ml09STtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gaGkoYixkLGUsZixoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MDtkPWk7aT1pKzM1MnwwO3c9ZCsyMDh8MDt5PWQrMTg0fDA7cD1kKzR8MDtuPWQrOHwwO289ZCsxOTZ8MDt1PWQ7dD1kKzI0fDA7cz1kKzE5MnwwO3Y9ZCsxODh8MDtyPWQrMzM3fDA7eD1kKzMzNnwwO3o9Y1tlPj4yXXwwO0I9Y1tmPj4yXXwwO3FpKG4saCx3LHkscCk7Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTA7aGcobywxMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9bysxfDA7ZT1DO2Y9bys4fDB9ZWxzZXtDPW8rOHwwO2U9bysxfDA7Zj1DO0M9Y1tDPj4yXXwwfWNbdT4+Ml09QztjW3M+PjJdPXQ7Y1t2Pj4yXT0wO2Fbcj4+MF09MTthW3g+PjBdPTY5O2g9bys0fDA7eT1jW3k+PjJdfDA7QT1jW3A+PjJdfDA7cD1vKzh8MDt3aGlsZSgxKXtpZigoenwwKT09MCl7RD0xO3o9MH1lbHNle0Q9Y1t6KzEyPj4yXXwwO2lmKChEfDApPT0oY1t6KzE2Pj4yXXwwKSl7RD1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtEPWNbRD4+Ml18MH1GPShEfDApPT0tMTtEPUY/MTowO3o9Rj8wOnp9aWYoKEJ8MCkhPTApe0U9Y1tCKzEyPj4yXXwwO2lmKChFfDApPT0oY1tCKzE2Pj4yXXwwKSl7RT1vY1tjWyhjW0I+PjJdfDApKzM2Pj4yXSYxMjddKEIpfDB9ZWxzZXtFPWNbRT4+Ml18MH1pZighKChFfDApPT0tMSkpe2lmKCFEKXticmVha319ZWxzZXttPTE2fX1lbHNle209MTZ9aWYoKG18MCk9PTE2KXttPTA7aWYoRCl7Qj0wO2JyZWFrfWVsc2V7Qj0wfX1EPWFbbz4+MF18MDtFPShEJjEpPT0wO2lmKEUpe0Y9KEQmMjU1KT4+PjF9ZWxzZXtGPWNbaD4+Ml18MH1pZigoKGNbdT4+Ml18MCktQ3wwKT09KEZ8MCkpe2lmKEUpe0c9KEQmMjU1KT4+PjE7Rj0oRCYyNTUpPj4+MTtDPUc8PDE7RD1HfWVsc2V7RD1jW2g+PjJdfDA7Rj1jW2g+PjJdfDA7Qz1EPDwxfWRve2lmKCEoRj4+PjA8Qz4+PjApKXtpZihFKXthW28rQysxPj4wXT0wO2Fbbz4+MF09RDw8MjticmVha31lbHNle2FbKGNbcD4+Ml18MCkrQz4+MF09MDtjW2g+PjJdPUM7YnJlYWt9fWVsc2V7aGcobyxDLUZ8MCl9fXdoaWxlKDApO0Y9YVtvPj4wXXwwO2lmKChGJjEpPT0wKXtFPTEwfWVsc2V7RT1jW28+PjJdfDA7Rj1FJjI1NTtFPShFJi0yKSsgLTF8MH1DPShGJjEpPT0wO2lmKEMpe0Y9KEYmMjU1KT4+PjF9ZWxzZXtGPWNbaD4+Ml18MH1kb3tpZighKEY+Pj4wPEU+Pj4wKSl7aWYoQyl7YVtvK0UrMT4+MF09MDthW28+PjBdPUU8PDE7YnJlYWt9ZWxzZXthWyhjW3A+PjJdfDApK0U+PjBdPTA7Y1toPj4yXT1FO2JyZWFrfX1lbHNle2hnKG8sRS1GfDApfX13aGlsZSgwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz1lfWVsc2V7Qz1jW2Y+PjJdfDB9Y1t1Pj4yXT1DK0R9RT16KzEyfDA7Rj1jW0U+PjJdfDA7RD16KzE2fDA7aWYoKEZ8MCk9PShjW0Q+PjJdfDApKXtGPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle0Y9Y1tGPj4yXXwwfWlmKChyaShGLHIseCxDLHUseSxBLG4sdCxzLHYsdyl8MCkhPTApe2JyZWFrfUY9Y1tFPj4yXXwwO2lmKChGfDApPT0oY1tEPj4yXXwwKSl7b2NbY1soY1t6Pj4yXXwwKSs0MD4+Ml0mMTI3XSh6KXwwO2NvbnRpbnVlfWVsc2V7Y1tFPj4yXT1GKzQ7Y29udGludWV9fXc9YVtuPj4wXXwwO2lmKCh3JjEpPT0wKXt3PSh3JjI1NSk+Pj4xfWVsc2V7dz1jW24rND4+Ml18MH1pZigoKHd8MCkhPTA/KGFbcj4+MF18MCkhPTA6MCk/KHE9Y1tzPj4yXXwwLChxLXR8MCk8MTYwKTowKXtHPWNbdj4+Ml18MDtjW3M+PjJdPXErNDtjW3E+PjJdPUd9Z1trPj4yXT0rSG0oQyxjW3U+PjJdfDAsaik7cWsobix0LGNbcz4+Ml18MCxqKTtpZigoenwwKT09MCl7az0wO3E9MX1lbHNle2s9Y1t6KzEyPj4yXXwwO2lmKChrfDApPT0oY1t6KzE2Pj4yXXwwKSl7az1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtrPWNbaz4+Ml18MH1xPShrfDApPT0tMTtrPXE/MDp6O3E9cT8xOjB9aWYoKEJ8MCkhPTApe3I9Y1tCKzEyPj4yXXwwO2lmKChyfDApPT0oY1tCKzE2Pj4yXXwwKSl7cj1vY1tjWyhjW0I+PjJdfDApKzM2Pj4yXSYxMjddKEIpfDB9ZWxzZXtyPWNbcj4+Ml18MH1pZighKChyfDApPT0tMSkpe2lmKCFxKXttPTcwfX1lbHNle209Njh9fWVsc2V7bT02OH1pZigobXwwKT09Njg/cTowKXttPTcwfWlmKChtfDApPT03MCl7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT1rO2lmKCEoKGFbbz4+MF0mMSk9PTApPyhsPWNbcD4+Ml18MCwobHwwKSE9MCk6MCl7dm4obCl9aWYoKGFbbj4+MF0mMSk9PTApe2k9ZDtyZXR1cm59aj1jW24rOD4+Ml18MDtpZigoanwwKT09MCl7aT1kO3JldHVybn12bihqKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIGlpKGIsZCxlLGYsZyxqLGspe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTA7ZD1pO2k9aSszNTJ8MDt3PWQrMjA4fDA7eT1kKzE4NHwwO3A9ZCs0fDA7bj1kKzh8MDtvPWQrMTk2fDA7dT1kO3Q9ZCsyNHwwO3M9ZCsxOTJ8MDt2PWQrMTg4fDA7cj1kKzMzN3wwO3g9ZCszMzZ8MDt6PWNbZT4+Ml18MDtCPWNbZj4+Ml18MDtxaShuLGcsdyx5LHApO2NbbyswPj4yXT0wO2Nbbys0Pj4yXT0wO2Nbbys4Pj4yXT0wO2hnKG8sMTApO2lmKChhW28+PjBdJjEpPT0wKXtDPW8rMXwwO2U9QztmPW8rOHwwfWVsc2V7Qz1vKzh8MDtlPW8rMXwwO2Y9QztDPWNbQz4+Ml18MH1jW3U+PjJdPUM7Y1tzPj4yXT10O2Nbdj4+Ml09MDthW3I+PjBdPTE7YVt4Pj4wXT02OTtnPW8rNHwwO3k9Y1t5Pj4yXXwwO0E9Y1twPj4yXXwwO3A9bys4fDA7d2hpbGUoMSl7aWYoKHp8MCk9PTApe0Q9MTt6PTB9ZWxzZXtEPWNbeisxMj4+Ml18MDtpZigoRHwwKT09KGNbeisxNj4+Ml18MCkpe0Q9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7RD1jW0Q+PjJdfDB9Rj0oRHwwKT09LTE7RD1GPzE6MDt6PUY/MDp6fWlmKChCfDApIT0wKXtFPWNbQisxMj4+Ml18MDtpZigoRXwwKT09KGNbQisxNj4+Ml18MCkpe0U9b2NbY1soY1tCPj4yXXwwKSszNj4+Ml0mMTI3XShCKXwwfWVsc2V7RT1jW0U+PjJdfDB9aWYoISgoRXwwKT09LTEpKXtpZighRCl7YnJlYWt9fWVsc2V7bT0xNn19ZWxzZXttPTE2fWlmKChtfDApPT0xNil7bT0wO2lmKEQpe0I9MDticmVha31lbHNle0I9MH19RD1hW28+PjBdfDA7RT0oRCYxKT09MDtpZihFKXtGPShEJjI1NSk+Pj4xfWVsc2V7Rj1jW2c+PjJdfDB9aWYoKChjW3U+PjJdfDApLUN8MCk9PShGfDApKXtpZihFKXtHPShEJjI1NSk+Pj4xO0Y9KEQmMjU1KT4+PjE7Qz1HPDwxO0Q9R31lbHNle0Q9Y1tnPj4yXXwwO0Y9Y1tnPj4yXXwwO0M9RDw8MX1kb3tpZighKEY+Pj4wPEM+Pj4wKSl7aWYoRSl7YVtvK0MrMT4+MF09MDthW28+PjBdPUQ8PDI7YnJlYWt9ZWxzZXthWyhjW3A+PjJdfDApK0M+PjBdPTA7Y1tnPj4yXT1DO2JyZWFrfX1lbHNle2hnKG8sQy1GfDApfX13aGlsZSgwKTtGPWFbbz4+MF18MDtpZigoRiYxKT09MCl7RT0xMH1lbHNle0U9Y1tvPj4yXXwwO0Y9RSYyNTU7RT0oRSYtMikrIC0xfDB9Qz0oRiYxKT09MDtpZihDKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW2c+PjJdfDB9ZG97aWYoIShGPj4+MDxFPj4+MCkpe2lmKEMpe2FbbytFKzE+PjBdPTA7YVtvPj4wXT1FPDwxO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKStFPj4wXT0wO2NbZz4+Ml09RTticmVha319ZWxzZXtoZyhvLEUtRnwwKX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9ZX1lbHNle0M9Y1tmPj4yXXwwfWNbdT4+Ml09QytEfUU9eisxMnwwO0Y9Y1tFPj4yXXwwO0Q9eisxNnwwO2lmKChGfDApPT0oY1tEPj4yXXwwKSl7Rj1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtGPWNbRj4+Ml18MH1pZigocmkoRixyLHgsQyx1LHksQSxuLHQscyx2LHcpfDApIT0wKXticmVha31GPWNbRT4+Ml18MDtpZigoRnwwKT09KGNbRD4+Ml18MCkpe29jW2NbKGNbej4+Ml18MCkrNDA+PjJdJjEyN10oeil8MDtjb250aW51ZX1lbHNle2NbRT4+Ml09Ris0O2NvbnRpbnVlfX13PWFbbj4+MF18MDtpZigodyYxKT09MCl7dz0odyYyNTUpPj4+MX1lbHNle3c9Y1tuKzQ+PjJdfDB9aWYoKCh3fDApIT0wPyhhW3I+PjBdfDApIT0wOjApPyhxPWNbcz4+Ml18MCwocS10fDApPDE2MCk6MCl7Rz1jW3Y+PjJdfDA7Y1tzPj4yXT1xKzQ7Y1txPj4yXT1HfWhbaz4+M109K0dtKEMsY1t1Pj4yXXwwLGopO3FrKG4sdCxjW3M+PjJdfDAsaik7aWYoKHp8MCk9PTApe2s9MDtxPTF9ZWxzZXtrPWNbeisxMj4+Ml18MDtpZigoa3wwKT09KGNbeisxNj4+Ml18MCkpe2s9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7az1jW2s+PjJdfDB9cT0oa3wwKT09LTE7az1xPzA6ejtxPXE/MTowfWlmKChCfDApIT0wKXtyPWNbQisxMj4+Ml18MDtpZigocnwwKT09KGNbQisxNj4+Ml18MCkpe3I9b2NbY1soY1tCPj4yXXwwKSszNj4+Ml0mMTI3XShCKXwwfWVsc2V7cj1jW3I+PjJdfDB9aWYoISgocnwwKT09LTEpKXtpZighcSl7bT03MH19ZWxzZXttPTY4fX1lbHNle209Njh9aWYoKG18MCk9PTY4P3E6MCl7bT03MH1pZigobXwwKT09NzApe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09aztpZighKChhW28+PjBdJjEpPT0wKT8obD1jW3A+PjJdfDAsKGx8MCkhPTApOjApe3ZuKGwpfWlmKChhW24+PjBdJjEpPT0wKXtpPWQ7cmV0dXJufWo9Y1tuKzg+PjJdfDA7aWYoKGp8MCk9PTApe2k9ZDtyZXR1cm59dm4oaik7aT1kO3JldHVybn1mdW5jdGlvbiBqaShiLGQsZSxmLGcsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wO2Q9aTtpPWkrMzUyfDA7dz1kKzIwOHwwO3k9ZCsxODR8MDtwPWQrNHwwO249ZCs4fDA7bz1kKzE5NnwwO3U9ZDt0PWQrMjR8MDtzPWQrMTkyfDA7dj1kKzE4OHwwO3I9ZCszMzd8MDt4PWQrMzM2fDA7ej1jW2U+PjJdfDA7Qj1jW2Y+PjJdfDA7cWkobixnLHcseSxwKTtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtoZyhvLDEwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz1vKzF8MDtlPUM7Zj1vKzh8MH1lbHNle0M9bys4fDA7ZT1vKzF8MDtmPUM7Qz1jW0M+PjJdfDB9Y1t1Pj4yXT1DO2Nbcz4+Ml09dDtjW3Y+PjJdPTA7YVtyPj4wXT0xO2FbeD4+MF09Njk7Zz1vKzR8MDt5PWNbeT4+Ml18MDtBPWNbcD4+Ml18MDtwPW8rOHwwO3doaWxlKDEpe2lmKCh6fDApPT0wKXtEPTE7ej0wfWVsc2V7RD1jW3orMTI+PjJdfDA7aWYoKER8MCk9PShjW3orMTY+PjJdfDApKXtEPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle0Q9Y1tEPj4yXXwwfUY9KER8MCk9PS0xO0Q9Rj8xOjA7ej1GPzA6en1pZigoQnwwKSE9MCl7RT1jW0IrMTI+PjJdfDA7aWYoKEV8MCk9PShjW0IrMTY+PjJdfDApKXtFPW9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MH1lbHNle0U9Y1tFPj4yXXwwfWlmKCEoKEV8MCk9PS0xKSl7aWYoIUQpe2JyZWFrfX1lbHNle209MTZ9fWVsc2V7bT0xNn1pZigobXwwKT09MTYpe209MDtpZihEKXtCPTA7YnJlYWt9ZWxzZXtCPTB9fUQ9YVtvPj4wXXwwO0U9KEQmMSk9PTA7aWYoRSl7Rj0oRCYyNTUpPj4+MX1lbHNle0Y9Y1tnPj4yXXwwfWlmKCgoY1t1Pj4yXXwwKS1DfDApPT0oRnwwKSl7aWYoRSl7Rz0oRCYyNTUpPj4+MTtGPShEJjI1NSk+Pj4xO0M9Rzw8MTtEPUd9ZWxzZXtEPWNbZz4+Ml18MDtGPWNbZz4+Ml18MDtDPUQ8PDF9ZG97aWYoIShGPj4+MDxDPj4+MCkpe2lmKEUpe2FbbytDKzE+PjBdPTA7YVtvPj4wXT1EPDwyO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKStDPj4wXT0wO2NbZz4+Ml09QzticmVha319ZWxzZXtoZyhvLEMtRnwwKX19d2hpbGUoMCk7Rj1hW28+PjBdfDA7aWYoKEYmMSk9PTApe0U9MTB9ZWxzZXtFPWNbbz4+Ml18MDtGPUUmMjU1O0U9KEUmLTIpKyAtMXwwfUM9KEYmMSk9PTA7aWYoQyl7Rj0oRiYyNTUpPj4+MX1lbHNle0Y9Y1tnPj4yXXwwfWRve2lmKCEoRj4+PjA8RT4+PjApKXtpZihDKXthW28rRSsxPj4wXT0wO2Fbbz4+MF09RTw8MTticmVha31lbHNle2FbKGNbcD4+Ml18MCkrRT4+MF09MDtjW2c+PjJdPUU7YnJlYWt9fWVsc2V7aGcobyxFLUZ8MCl9fXdoaWxlKDApO2lmKChhW28+PjBdJjEpPT0wKXtDPWV9ZWxzZXtDPWNbZj4+Ml18MH1jW3U+PjJdPUMrRH1FPXorMTJ8MDtGPWNbRT4+Ml18MDtEPXorMTZ8MDtpZigoRnwwKT09KGNbRD4+Ml18MCkpe0Y9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7Rj1jW0Y+PjJdfDB9aWYoKHJpKEYscix4LEMsdSx5LEEsbix0LHMsdix3KXwwKSE9MCl7YnJlYWt9Rj1jW0U+PjJdfDA7aWYoKEZ8MCk9PShjW0Q+PjJdfDApKXtvY1tjWyhjW3o+PjJdfDApKzQwPj4yXSYxMjddKHopfDA7Y29udGludWV9ZWxzZXtjW0U+PjJdPUYrNDtjb250aW51ZX19dz1hW24+PjBdfDA7aWYoKHcmMSk9PTApe3c9KHcmMjU1KT4+PjF9ZWxzZXt3PWNbbis0Pj4yXXwwfWlmKCgod3wwKSE9MD8oYVtyPj4wXXwwKSE9MDowKT8ocT1jW3M+PjJdfDAsKHEtdHwwKTwxNjApOjApe0c9Y1t2Pj4yXXwwO2Nbcz4+Ml09cSs0O2NbcT4+Ml09R31oW2s+PjNdPStGbShDLGNbdT4+Ml18MCxqKTtxayhuLHQsY1tzPj4yXXwwLGopO2lmKCh6fDApPT0wKXtrPTA7cT0xfWVsc2V7az1jW3orMTI+PjJdfDA7aWYoKGt8MCk9PShjW3orMTY+PjJdfDApKXtrPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle2s9Y1trPj4yXXwwfXE9KGt8MCk9PS0xO2s9cT8wOno7cT1xPzE6MH1pZigoQnwwKSE9MCl7cj1jW0IrMTI+PjJdfDA7aWYoKHJ8MCk9PShjW0IrMTY+PjJdfDApKXtyPW9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MH1lbHNle3I9Y1tyPj4yXXwwfWlmKCEoKHJ8MCk9PS0xKSl7aWYoIXEpe209NzB9fWVsc2V7bT02OH19ZWxzZXttPTY4fWlmKChtfDApPT02OD9xOjApe209NzB9aWYoKG18MCk9PTcwKXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPWs7aWYoISgoYVtvPj4wXSYxKT09MCk/KGw9Y1twPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1qPWNbbis4Pj4yXXwwO2lmKChqfDApPT0wKXtpPWQ7cmV0dXJufXZuKGopO2k9ZDtyZXR1cm59ZnVuY3Rpb24ga2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MDtkPWk7aT1pKzMwNHwwO249ZDtvPWQrMTkyfDA7bD1kKzE3NnwwO3Y9ZCsxNnwwO3E9Y1tnKzI4Pj4yXXwwO0M9cSs0fDA7Y1tDPj4yXT0oY1tDPj4yXXwwKSsxO2lmKCEoKGNbMzM2Ml18MCk9PS0xKSl7Y1tuPj4yXT0xMzQ0ODtjW24rND4+Ml09MjA4O2Nbbis4Pj4yXT0wO2NnKDEzNDQ4LG4pfWc9KGNbMTM0NTI+PjJdfDApKyAtMXwwO3A9Y1txKzg+PjJdfDA7aWYoKGNbcSsxMj4+Ml18MCktcD4+Mj4+PjA+Zz4+PjA/KG09Y1twKyhnPDwyKT4+Ml18MCwobXwwKSE9MCk6MCl7dWNbY1soY1ttPj4yXXwwKSs0OD4+Ml0mMzFdKG0sMTIwMTYsMTIwNDJ8MCxvKXwwO0I9cSs0fDA7Qz1jW0I+PjJdfDA7Y1tCPj4yXT1DKyAtMTtpZigoQ3wwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfWNbbCswPj4yXT0wO2NbbCs0Pj4yXT0wO2NbbCs4Pj4yXT0wO2hnKGwsMTApO2lmKChhW2w+PjBdJjEpPT0wKXt5PWwrMXwwO3A9eTtxPWwrOHwwfWVsc2V7eT1sKzh8MDtwPWwrMXwwO3E9eTt5PWNbeT4+Ml18MH1yPWwrNHwwO3Q9bys5NnwwO3U9bysxMDB8MDtzPW8rMTA0fDA7Zz1vO209bCs4fDA7eD1jW2U+PjJdfDA7dz0wO3o9eTthOndoaWxlKDEpe2lmKCh4fDApIT0wKXtBPWNbeCsxMj4+Ml18MDtpZigoQXwwKT09KGNbeCsxNj4+Ml18MCkpe0E9b2NbY1soY1t4Pj4yXXwwKSszNj4+Ml0mMTI3XSh4KXwwfWVsc2V7QT1jW0E+PjJdfDB9aWYoKEF8MCk9PS0xKXtjW2U+PjJdPTA7eD0wO0E9MX1lbHNle0E9MH19ZWxzZXt4PTA7QT0xfUM9Y1tmPj4yXXwwO2Rve2lmKChDfDApIT0wKXtCPWNbQysxMj4+Ml18MDtpZigoQnwwKT09KGNbQysxNj4+Ml18MCkpe0I9b2NbY1soY1tDPj4yXXwwKSszNj4+Ml0mMTI3XShDKXwwfWVsc2V7Qj1jW0I+PjJdfDB9aWYoISgoQnwwKT09LTEpKXtpZihBKXticmVha31lbHNle2JyZWFrIGF9fWVsc2V7Y1tmPj4yXT0wO2s9Mjc7YnJlYWt9fWVsc2V7az0yN319d2hpbGUoMCk7aWYoKGt8MCk9PTI3PyhrPTAsQSk6MCl7YnJlYWt9Qz1hW2w+PjBdfDA7QT0oQyYxKT09MDtpZihBKXtCPShDJjI1NSk+Pj4xfWVsc2V7Qj1jW3I+PjJdfDB9aWYoKHoteXwwKT09KEJ8MCkpe2lmKEEpe3o9KEMmMjU1KT4+PjE7Qj0oQyYyNTUpPj4+MTt5PXo8PDF9ZWxzZXt6PWNbcj4+Ml18MDtCPWNbcj4+Ml18MDt5PXo8PDF9ZG97aWYoIShCPj4+MDx5Pj4+MCkpe2lmKEEpe2FbbCt5KzE+PjBdPTA7YVtsPj4wXT16PDwyO2JyZWFrfWVsc2V7YVsoY1ttPj4yXXwwKSt5Pj4wXT0wO2Nbcj4+Ml09eTticmVha319ZWxzZXtoZyhsLHktQnwwKX19d2hpbGUoMCk7Qj1hW2w+PjBdfDA7aWYoKEImMSk9PTApe0E9MTB9ZWxzZXtBPWNbbD4+Ml18MDtCPUEmMjU1O0E9KEEmLTIpKyAtMXwwfXk9KEImMSk9PTA7aWYoeSl7Qj0oQiYyNTUpPj4+MX1lbHNle0I9Y1tyPj4yXXwwfWRve2lmKCEoQj4+PjA8QT4+PjApKXtpZih5KXthW2wrQSsxPj4wXT0wO2FbbD4+MF09QTw8MTticmVha31lbHNle2FbKGNbbT4+Ml18MCkrQT4+MF09MDtjW3I+PjJdPUE7YnJlYWt9fWVsc2V7aGcobCxBLUJ8MCl9fXdoaWxlKDApO2lmKChhW2w+PjBdJjEpPT0wKXt5PXB9ZWxzZXt5PWNbcT4+Ml18MH16PXkrenwwfUE9Y1t4KzEyPj4yXXwwO2lmKChBfDApPT0oY1t4KzE2Pj4yXXwwKSl7QT1vY1tjWyhjW3g+PjJdfDApKzM2Pj4yXSYxMjddKHgpfDB9ZWxzZXtBPWNbQT4+Ml18MH14PSh6fDApPT0oeXwwKTtkb3tpZih4KXtCPShjW3Q+PjJdfDApPT0oQXwwKTtpZighQj8oY1t1Pj4yXXwwKSE9KEF8MCk6MCl7Qj1vO2s9NjI7YnJlYWt9YVt6Pj4wXT1CPzQzOjQ1O3o9eisxfDA7dz0wfWVsc2V7Qj1vO2s9NjJ9fXdoaWxlKDApO2Rve2lmKChrfDApPT02Mil7d2hpbGUoMSl7az0wO2lmKChjW0I+PjJdfDApPT0oQXwwKSl7YnJlYWt9Qj1CKzR8MDtpZigoQnwwKT09KHN8MCkpe0I9czticmVha31lbHNle2s9NjJ9fUI9Qi1nfDA7QT1CPj4yO2lmKChCfDApPjkyKXticmVhayBhfWlmKChCfDApPDg4KXthW3o+PjBdPWFbMTIwMTYrQT4+MF18MDt6PXorMXwwO3c9dysxfDA7YnJlYWt9aWYoeCl7eT16O2JyZWFrIGF9aWYoKHoteXwwKT49Myl7YnJlYWsgYX1pZigoYVt6KyAtMT4+MF18MCkhPTQ4KXticmVhayBhfWFbej4+MF09YVsxMjAxNitBPj4wXXwwO3o9eisxfDA7dz0wfX13aGlsZSgwKTt4PWNbZT4+Ml18MDtCPXgrMTJ8MDtBPWNbQj4+Ml18MDtpZigoQXwwKT09KGNbeCsxNj4+Ml18MCkpe29jW2NbKGNbeD4+Ml18MCkrNDA+PjJdJjEyN10oeCl8MDtDPXY7dj1DO2NvbnRpbnVlfWVsc2V7Y1tCPj4yXT1BKzQ7Qz12O3Y9Qztjb250aW51ZX19YVt5KzM+PjBdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfUM9Y1szMzQwXXwwO2Nbbj4+Ml09ajtpZigoWWgoeSxDLG4pfDApIT0xKXtjW2g+PjJdPTR9aj1jW2U+PjJdfDA7aWYoKGp8MCkhPTApe249Y1tqKzEyPj4yXXwwO2lmKChufDApPT0oY1tqKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW2o+PjJdfDApKzM2Pj4yXSYxMjddKGopfDB9ZWxzZXtuPWNbbj4+Ml18MH1pZigobnwwKT09LTEpe2NbZT4+Ml09MDtqPTA7ZT0xfWVsc2V7ZT0wfX1lbHNle2o9MDtlPTF9bj1jW2Y+PjJdfDA7ZG97aWYoKG58MCkhPTApe289Y1tuKzEyPj4yXXwwO2lmKChvfDApPT0oY1tuKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDB9ZWxzZXtuPWNbbz4+Ml18MH1pZighKChufDApPT0tMSkpe2lmKGUpe2JyZWFrfWVsc2V7az05NDticmVha319ZWxzZXtjW2Y+PjJdPTA7az05MjticmVha319ZWxzZXtrPTkyfX13aGlsZSgwKTtpZigoa3wwKT09OTI/ZTowKXtrPTk0fWlmKChrfDApPT05NCl7Y1toPj4yXT1jW2g+PjJdfDJ9Y1tiPj4yXT1qO2lmKChhW2w+PjBdJjEpPT0wKXtpPWQ7cmV0dXJufWY9Y1ttPj4yXXwwO2lmKChmfDApPT0wKXtpPWQ7cmV0dXJufXZuKGYpO2k9ZDtyZXR1cm59Qz1YYSg0KXwwO2NbQz4+Ml09MjEzMDQ7d2IoQ3wwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gbGkoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MDtuPWk7cD1jW2Y+PjJdfDA7bz0ocHwwKT09KGV8MCk7ZG97aWYobyl7cT0oY1ttKzk2Pj4yXXwwKT09KGJ8MCk7aWYoIXE/KGNbbSsxMDA+PjJdfDApIT0oYnwwKTowKXticmVha31jW2Y+PjJdPWUrMTthW2U+PjBdPXE/NDM6NDU7Y1tnPj4yXT0wO3E9MDtpPW47cmV0dXJuIHF8MH19d2hpbGUoMCk7cT1hW2o+PjBdfDA7aWYoKHEmMSk9PTApe2o9KHEmMjU1KT4+PjF9ZWxzZXtqPWNbais0Pj4yXXwwfWlmKChqfDApIT0wJihifDApPT0oaHwwKSl7bz1jW2w+PjJdfDA7aWYoKG8ta3wwKT49MTYwKXtxPTA7aT1uO3JldHVybiBxfDB9cT1jW2c+PjJdfDA7Y1tsPj4yXT1vKzQ7Y1tvPj4yXT1xO2NbZz4+Ml09MDtxPTA7aT1uO3JldHVybiBxfDB9bD1tKzEwNHwwO2s9bTt3aGlsZSgxKXtpZigoY1trPj4yXXwwKT09KGJ8MCkpe2JyZWFrfWs9ays0fDA7aWYoKGt8MCk9PShsfDApKXtrPWw7YnJlYWt9fWI9ay1tfDA7bT1iPj4yO2lmKChifDApPjkyKXtxPS0xO2k9bjtyZXR1cm4gcXwwfWlmKChkfDApPT0xMHwoZHwwKT09OCl7aWYoKG18MCk+PShkfDApKXtxPS0xO2k9bjtyZXR1cm4gcXwwfX1lbHNlIGlmKChkfDApPT0xNj8oYnwwKT49ODg6MCl7aWYobyl7cT0tMTtpPW47cmV0dXJuIHF8MH1pZigocC1lfDApPj0zKXtxPS0xO2k9bjtyZXR1cm4gcXwwfWlmKChhW3ArIC0xPj4wXXwwKSE9NDgpe3E9LTE7aT1uO3JldHVybiBxfDB9Y1tnPj4yXT0wO3E9YVsxMjAxNittPj4wXXwwO2NbZj4+Ml09cCsxO2FbcD4+MF09cTtxPTA7aT1uO3JldHVybiBxfDB9cT1hWzEyMDE2K20+PjBdfDA7Y1tmPj4yXT1wKzE7YVtwPj4wXT1xO2NbZz4+Ml09KGNbZz4+Ml18MCkrMTtxPTA7aT1uO3JldHVybiBxfDB9ZnVuY3Rpb24gbWkoYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7aD1pO2k9aSsxNnwwO2w9aDtkPWNbZCsyOD4+Ml18MDtvPWQrNHwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1uPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtqPWQrMTJ8MDttPWQrOHwwO289Y1ttPj4yXXwwO2lmKChjW2o+PjJdfDApLW8+PjI+Pj4wPm4+Pj4wPyhrPWNbbysobjw8Mik+PjJdfDAsKGt8MCkhPTApOjApe3VjW2NbKGNbaz4+Ml18MCkrMzI+PjJdJjMxXShrLDEyMDE2LDEyMDQyfDAsZSl8MDtpZighKChjWzM0MDBdfDApPT0tMSkpe2NbbD4+Ml09MTM2MDA7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzYwMCxsKX1lPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDtrPWNbbT4+Ml18MDtpZigoY1tqPj4yXXwwKS1rPj4yPj4+MD5lPj4+MD8oZz1jW2srKGU8PDIpPj4yXXwwLChnfDApIT0wKTowKXthW2Y+PjBdPW9jW2NbKGNbZz4+Ml18MCkrMTY+PjJdJjEyN10oZyl8MDttY1tjWyhjW2c+PjJdfDApKzIwPj4yXSYxMjddKGIsZyk7bj1kKzR8MDtvPWNbbj4+Ml18MDtjW24+PjJdPW8rIC0xO2lmKChvfDApIT0wKXtpPWg7cmV0dXJufWxjW2NbKGNbZD4+Ml18MCkrOD4+Ml0mMjU1XShkKTtpPWg7cmV0dXJufW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIG5pKGIsZCxlLGYsZyl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTA7aj1pO2k9aSsxNnwwO2w9ajtkPWNbZCsyOD4+Ml18MDtwPWQrNHwwO2NbcD4+Ml09KGNbcD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1vPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtrPWQrMTJ8MDtuPWQrOHwwO3A9Y1tuPj4yXXwwO2lmKChjW2s+PjJdfDApLXA+PjI+Pj4wPm8+Pj4wPyhtPWNbcCsobzw8Mik+PjJdfDAsKG18MCkhPTApOjApe3VjW2NbKGNbbT4+Ml18MCkrMzI+PjJdJjMxXShtLDEyMDE2LDEyMDQ4fDAsZSl8MDtpZighKChjWzM0MDBdfDApPT0tMSkpe2NbbD4+Ml09MTM2MDA7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzYwMCxsKX1lPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDtsPWNbbj4+Ml18MDtpZigoY1trPj4yXXwwKS1sPj4yPj4+MD5lPj4+MD8oaD1jW2wrKGU8PDIpPj4yXXwwLChofDApIT0wKTowKXthW2Y+PjBdPW9jW2NbKGNbaD4+Ml18MCkrMTI+PjJdJjEyN10oaCl8MDthW2c+PjBdPW9jW2NbKGNbaD4+Ml18MCkrMTY+PjJdJjEyN10oaCl8MDttY1tjWyhjW2g+PjJdfDApKzIwPj4yXSYxMjddKGIsaCk7bz1kKzR8MDtwPWNbbz4+Ml18MDtjW28+PjJdPXArIC0xO2lmKChwfDApIT0wKXtpPWo7cmV0dXJufWxjW2NbKGNbZD4+Ml18MCkrOD4+Ml0mMjU1XShkKTtpPWo7cmV0dXJufXA9WGEoNCl8MDtjW3A+PjJdPTIxMzA0O3diKHB8MCwyMTM3NiwxOTYpfXA9WGEoNCl8MDtjW3A+PjJdPTIxMzA0O3diKHB8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIG9pKGIsZCxlLGYsZyxoLGosayxsLG0sbixvKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDtvPW98MDt2YXIgcD0wLHE9MDtwPWk7aWYoYjw8MjQ+PjI0PT1oPDwyND4+MjQpe2lmKChhW2Q+PjBdfDApPT0wKXtqPS0xO2k9cDtyZXR1cm4ganwwfWFbZD4+MF09MDtqPWNbZz4+Ml18MDtjW2c+PjJdPWorMTthW2o+PjBdPTQ2O2c9YVtrPj4wXXwwO2lmKChnJjEpPT0wKXtnPShnJjI1NSk+Pj4xfWVsc2V7Zz1jW2srND4+Ml18MH1pZigoZ3wwKT09MCl7aj0wO2k9cDtyZXR1cm4ganwwfWc9Y1ttPj4yXXwwO2lmKChnLWx8MCk+PTE2MCl7aj0wO2k9cDtyZXR1cm4ganwwfWo9Y1tuPj4yXXwwO2NbbT4+Ml09Zys0O2NbZz4+Ml09ajtqPTA7aT1wO3JldHVybiBqfDB9aWYoYjw8MjQ+PjI0PT1qPDwyND4+MjQpe2g9YVtrPj4wXXwwO2lmKChoJjEpPT0wKXtoPShoJjI1NSk+Pj4xfWVsc2V7aD1jW2srND4+Ml18MH1pZigoaHwwKSE9MCl7aWYoKGFbZD4+MF18MCk9PTApe2o9LTE7aT1wO3JldHVybiBqfDB9Zz1jW20+PjJdfDA7aWYoKGctbHwwKT49MTYwKXtqPTA7aT1wO3JldHVybiBqfDB9aj1jW24+PjJdfDA7Y1ttPj4yXT1nKzQ7Y1tnPj4yXT1qO2Nbbj4+Ml09MDtqPTA7aT1wO3JldHVybiBqfDB9fWg9byszMnwwO2o9bztkb3tpZigoYVtqPj4wXXwwKT09Yjw8MjQ+PjI0KXtoPWo7YnJlYWt9aj1qKzF8MH13aGlsZSgoanwwKSE9KGh8MCkpO2I9aC1vfDA7aWYoKGJ8MCk+MzEpe2o9LTE7aT1wO3JldHVybiBqfDB9bz1hWzEyMDE2K2I+PjBdfDA7aWYoKGJ8MCk9PTIzfChifDApPT0yMil7YVtlPj4wXT04MDtqPWNbZz4+Ml18MDtjW2c+PjJdPWorMTthW2o+PjBdPW87aj0wO2k9cDtyZXR1cm4ganwwfWVsc2UgaWYoKGJ8MCk9PTI0fChifDApPT0yNSl7bj1jW2c+PjJdfDA7aWYoKG58MCkhPShmfDApPyhhW24rIC0xPj4wXSY5NXwwKSE9KGFbZT4+MF0mMTI3fDApOjApe2o9LTE7aT1wO3JldHVybiBqfDB9Y1tnPj4yXT1uKzE7YVtuPj4wXT1vO2o9MDtpPXA7cmV0dXJuIGp8MH1lbHNle2Y9byY5NTtpZigoZnwwKT09KGFbZT4+MF18MCk/KGFbZT4+MF09ZnwxMjgsKGFbZD4+MF18MCkhPTApOjApe2FbZD4+MF09MDtlPWFbaz4+MF18MDtpZigoZSYxKT09MCl7az0oZSYyNTUpPj4+MX1lbHNle2s9Y1trKzQ+PjJdfDB9aWYoKGt8MCkhPTA/KHE9Y1ttPj4yXXwwLChxLWx8MCk8MTYwKTowKXtqPWNbbj4+Ml18MDtjW20+PjJdPXErNDtjW3E+PjJdPWp9fWo9Y1tnPj4yXXwwO2NbZz4+Ml09aisxO2Fbaj4+MF09bztpZigoYnwwKT4yMSl7aj0wO2k9cDtyZXR1cm4ganwwfWNbbj4+Ml09KGNbbj4+Ml18MCkrMTtqPTA7aT1wO3JldHVybiBqfDB9cmV0dXJuIDB9ZnVuY3Rpb24gcGkoYSxiLGQsZSl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Zz1pO2k9aSsxNnwwO2s9ZztiPWNbYisyOD4+Ml18MDtuPWIrNHwwO2Nbbj4+Ml09KGNbbj4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ0OCxrKX1tPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtoPWIrMTJ8MDtsPWIrOHwwO249Y1tsPj4yXXwwO2lmKChjW2g+PjJdfDApLW4+PjI+Pj4wPm0+Pj4wPyhqPWNbbisobTw8Mik+PjJdfDAsKGp8MCkhPTApOjApe3VjW2NbKGNbaj4+Ml18MCkrNDg+PjJdJjMxXShqLDEyMDE2LDEyMDQyfDAsZCl8MDtpZighKChjWzM0MDJdfDApPT0tMSkpe2Nbaz4+Ml09MTM2MDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzYwOCxrKX1kPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtqPWNbbD4+Ml18MDtpZigoY1toPj4yXXwwKS1qPj4yPj4+MD5kPj4+MD8oZj1jW2orKGQ8PDIpPj4yXXwwLChmfDApIT0wKTowKXtjW2U+PjJdPW9jW2NbKGNbZj4+Ml18MCkrMTY+PjJdJjEyN10oZil8MDttY1tjWyhjW2Y+PjJdfDApKzIwPj4yXSYxMjddKGEsZik7bT1iKzR8MDtuPWNbbT4+Ml18MDtjW20+PjJdPW4rIC0xO2lmKChufDApIT0wKXtpPWc7cmV0dXJufWxjW2NbKGNbYj4+Ml18MCkrOD4+Ml0mMjU1XShiKTtpPWc7cmV0dXJufW49WGEoNCl8MDtjW24+PjJdPTIxMzA0O3diKG58MCwyMTM3NiwxOTYpfW49WGEoNCl8MDtjW24+PjJdPTIxMzA0O3diKG58MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHFpKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7aD1pO2k9aSsxNnwwO2s9aDtiPWNbYisyOD4+Ml18MDtvPWIrNHwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ0OCxrKX1uPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtqPWIrMTJ8MDttPWIrOHwwO289Y1ttPj4yXXwwO2lmKChjW2o+PjJdfDApLW8+PjI+Pj4wPm4+Pj4wPyhsPWNbbysobjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe3VjW2NbKGNbbD4+Ml18MCkrNDg+PjJdJjMxXShsLDEyMDE2LDEyMDQ4fDAsZCl8MDtpZighKChjWzM0MDJdfDApPT0tMSkpe2Nbaz4+Ml09MTM2MDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzYwOCxrKX1kPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtrPWNbbT4+Ml18MDtpZigoY1tqPj4yXXwwKS1rPj4yPj4+MD5kPj4+MD8oZz1jW2srKGQ8PDIpPj4yXXwwLChnfDApIT0wKTowKXtjW2U+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMTI+PjJdJjEyN10oZyl8MDtjW2Y+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMTY+PjJdJjEyN10oZyl8MDttY1tjWyhjW2c+PjJdfDApKzIwPj4yXSYxMjddKGEsZyk7bj1iKzR8MDtvPWNbbj4+Ml18MDtjW24+PjJdPW8rIC0xO2lmKChvfDApIT0wKXtpPWg7cmV0dXJufWxjW2NbKGNbYj4+Ml18MCkrOD4+Ml0mMjU1XShiKTtpPWg7cmV0dXJufW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHJpKGIsZCxlLGYsZyxoLGosayxsLG0sbixvKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDtvPW98MDt2YXIgcD0wLHE9MDtwPWk7aWYoKGJ8MCk9PShofDApKXtpZigoYVtkPj4wXXwwKT09MCl7aj0tMTtpPXA7cmV0dXJuIGp8MH1hW2Q+PjBdPTA7aj1jW2c+PjJdfDA7Y1tnPj4yXT1qKzE7YVtqPj4wXT00NjtnPWFbaz4+MF18MDtpZigoZyYxKT09MCl7Zz0oZyYyNTUpPj4+MX1lbHNle2c9Y1trKzQ+PjJdfDB9aWYoKGd8MCk9PTApe2o9MDtpPXA7cmV0dXJuIGp8MH1nPWNbbT4+Ml18MDtpZigoZy1sfDApPj0xNjApe2o9MDtpPXA7cmV0dXJuIGp8MH1qPWNbbj4+Ml18MDtjW20+PjJdPWcrNDtjW2c+PjJdPWo7aj0wO2k9cDtyZXR1cm4ganwwfWlmKChifDApPT0oanwwKSl7aD1hW2s+PjBdfDA7aWYoKGgmMSk9PTApe2g9KGgmMjU1KT4+PjF9ZWxzZXtoPWNbays0Pj4yXXwwfWlmKChofDApIT0wKXtpZigoYVtkPj4wXXwwKT09MCl7aj0tMTtpPXA7cmV0dXJuIGp8MH1nPWNbbT4+Ml18MDtpZigoZy1sfDApPj0xNjApe2o9MDtpPXA7cmV0dXJuIGp8MH1qPWNbbj4+Ml18MDtjW20+PjJdPWcrNDtjW2c+PjJdPWo7Y1tuPj4yXT0wO2o9MDtpPXA7cmV0dXJuIGp8MH19aD1vKzEyOHwwO2o9bztkb3tpZigoY1tqPj4yXXwwKT09KGJ8MCkpe2g9ajticmVha31qPWorNHwwfXdoaWxlKChqfDApIT0oaHwwKSk7Yj1oLW98MDtoPWI+PjI7aWYoKGJ8MCk+MTI0KXtqPS0xO2k9cDtyZXR1cm4ganwwfW89YVsxMjAxNitoPj4wXXwwO2lmKChofDApPT0yNHwoaHwwKT09MjUpe249Y1tnPj4yXXwwO2lmKChufDApIT0oZnwwKT8oYVtuKyAtMT4+MF0mOTV8MCkhPShhW2U+PjBdJjEyN3wwKTowKXtqPS0xO2k9cDtyZXR1cm4ganwwfWNbZz4+Ml09bisxO2Fbbj4+MF09bztqPTA7aT1wO3JldHVybiBqfDB9ZWxzZSBpZighKChofDApPT0yM3woaHwwKT09MjIpKXtmPW8mOTU7aWYoKGZ8MCk9PShhW2U+PjBdfDApPyhhW2U+PjBdPWZ8MTI4LChhW2Q+PjBdfDApIT0wKTowKXthW2Q+PjBdPTA7ZT1hW2s+PjBdfDA7aWYoKGUmMSk9PTApe2s9KGUmMjU1KT4+PjF9ZWxzZXtrPWNbays0Pj4yXXwwfWlmKChrfDApIT0wPyhxPWNbbT4+Ml18MCwocS1sfDApPDE2MCk6MCl7aj1jW24+PjJdfDA7Y1ttPj4yXT1xKzQ7Y1txPj4yXT1qfX19ZWxzZXthW2U+PjBdPTgwfWo9Y1tnPj4yXXwwO2NbZz4+Ml09aisxO2Fbaj4+MF09bztpZigoYnwwKT44NCl7aj0wO2k9cDtyZXR1cm4ganwwfWNbbj4+Ml09KGNbbj4+Ml18MCkrMTtqPTA7aT1wO3JldHVybiBqfDB9ZnVuY3Rpb24gc2koYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gdGkoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIHVpKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7aj1pO2k9aSszMnwwO209ajtuPWorMjR8MDtrPWorMTJ8MDtpZigoY1tmKzQ+PjJdJjF8MCk9PTApe2w9Y1soY1tkPj4yXXwwKSsyND4+Ml18MDtjW24+PjJdPWNbZT4+Ml07bz1oJjE7Y1ttKzA+PjJdPWNbbiswPj4yXTt3Y1tsJjYzXShiLGQsbSxmLGcsbyk7aT1qO3JldHVybn1kPWNbZisyOD4+Ml18MDtvPWQrNHwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtpZighKChjWzM0MDBdfDApPT0tMSkpe2NbbT4+Ml09MTM2MDA7Y1ttKzQ+PjJdPTIwODtjW20rOD4+Ml09MDtjZygxMzYwMCxtKX1mPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDttPWNbZCs4Pj4yXXwwO2lmKChjW2QrMTI+PjJdfDApLW0+PjI+Pj4wPmY+Pj4wPyhsPWNbbSsoZjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe2c9ZCs0fDA7bz1jW2c+PjJdfDA7Y1tnPj4yXT1vKyAtMTtpZigob3wwKT09MCl7bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpfW09Y1tsPj4yXXwwO2lmKGgpe21jW2NbbSsyND4+Ml0mMTI3XShrLGwpfWVsc2V7bWNbY1ttKzI4Pj4yXSYxMjddKGssbCl9bj1hW2s+PjBdfDA7aWYoKG4mMSk9PTApe2g9aysxfDA7ZD1oO2w9ays4fDB9ZWxzZXtsPWsrOHwwO2Q9Y1tsPj4yXXwwO2g9aysxfDB9bT1rKzR8MDt3aGlsZSgxKXtmPShuJjEpPT0wO2lmKGYpe2c9aDtuPShuJjI1NSk+Pj4xfWVsc2V7Zz1jW2w+PjJdfDA7bj1jW20+PjJdfDB9aWYoKGR8MCk9PShnK258MCkpe2JyZWFrfW89YVtkPj4wXXwwO249Y1tlPj4yXXwwO2Rve2lmKChufDApIT0wKXtmPW4rMjR8MDtnPWNbZj4+Ml18MDtpZigoZ3wwKSE9KGNbbisyOD4+Ml18MCkpe2NbZj4+Ml09ZysxO2FbZz4+MF09bzticmVha31pZigoeGNbY1soY1tuPj4yXXwwKSs1Mj4+Ml0mNjNdKG4sbyYyNTUpfDApPT0tMSl7Y1tlPj4yXT0wfX19d2hpbGUoMCk7bj1hW2s+PjBdfDA7ZD1kKzF8MH1jW2I+PjJdPWNbZT4+Ml07aWYoZil7aT1qO3JldHVybn1rPWNbays4Pj4yXXwwO2lmKChrfDApPT0wKXtpPWo7cmV0dXJufXZuKGspO2k9ajtyZXR1cm59bz1YYSg0KXwwO2Nbbz4+Ml09MjEzMDQ7d2Iob3wwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gdmkoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtkPWk7aT1pKzY0fDA7cj1kO3E9ZCsxNnwwO249ZCsyNHwwO209ZCszNnwwO2s9ZCs4fDA7bD1kKzR8MDtvPWQrMTJ8MDthW3ErMD4+MF09YVsxMjI2ND4+MF18MDthW3ErMT4+MF09YVsxMjI2NT4+MF18MDthW3ErMj4+MF09YVsxMjI2Nj4+MF18MDthW3ErMz4+MF09YVsxMjI2Nz4+MF18MDthW3ErND4+MF09YVsxMjI2OD4+MF18MDthW3ErNT4+MF09YVsxMjI2OT4+MF18MDt0PXErMXwwO3A9Zis0fDA7cz1jW3A+PjJdfDA7aWYoKHMmMjA0OHwwKSE9MCl7YVt0Pj4wXT00Mzt0PXErMnwwfWlmKChzJjUxMnwwKSE9MCl7YVt0Pj4wXT0zNTt0PXQrMXwwfWFbdD4+MF09MTA4O3Q9dCsxfDA7dT1zJjc0O2Rve2lmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZSBpZigodXwwKT09OCl7aWYoKHMmMTYzODR8MCk9PTApe2FbdD4+MF09MTIwO2JyZWFrfWVsc2V7YVt0Pj4wXT04ODticmVha319ZWxzZXthW3Q+PjBdPTEwMH19d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO2Nbcj4+Ml09aDtxPXdpKG4sMTIsdSxxLHIpfDA7aD1uK3F8MDtwPWNbcD4+Ml0mMTc2O2Rve2lmKChwfDApPT0zMil7cD1ofWVsc2UgaWYoKHB8MCk9PTE2KXtwPWFbbj4+MF18MDtpZihwPDwyND4+MjQ9PTQzfHA8PDI0Pj4yND09NDUpe3A9bisxfDA7YnJlYWt9aWYoKHF8MCk+MSZwPDwyND4+MjQ9PTQ4Pyh1PWFbbisxPj4wXXwwLHU8PDI0Pj4yND09ODh8dTw8MjQ+PjI0PT0xMjApOjApe3A9bisyfDB9ZWxzZXtqPTIxfX1lbHNle2o9MjF9fXdoaWxlKDApO2lmKChqfDApPT0yMSl7cD1ufWo9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09ajtqPWorNHwwO2Nbaj4+Ml09KGNbaj4+Ml18MCkrMTt4aShuLHAsaCxtLGssbCxvKTtqPWNbbz4+Ml18MDt0PWorNHwwO3U9Y1t0Pj4yXXwwO2NbdD4+Ml09dSsgLTE7aWYoKHV8MCkhPTApe3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1tsPj4yXXwwO1djKGIscyxtLHQsdSxmLGcpO2k9ZDtyZXR1cm59bGNbY1soY1tqPj4yXXwwKSs4Pj4yXSYyNTVdKGopO3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1tsPj4yXXwwO1djKGIscyxtLHQsdSxmLGcpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gd2koYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MDtnPWk7aT1pKzE2fDA7aD1nO2NbaD4+Ml09ZjtkPWliKGR8MCl8MDtlPVFiKGF8MCxifDAsZXwwLGh8MCl8MDtpZigoZHwwKT09MCl7aT1nO3JldHVybiBlfDB9aWIoZHwwKXwwO2k9ZztyZXR1cm4gZXwwfWZ1bmN0aW9uIHhpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTA7az1pO2k9aSszMnwwO3A9aztsPWsrMTJ8MDtuPWNbaj4+Ml18MDtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbcD4+Ml09MTM0NTY7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzQ1NixwKX1yPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtzPWNbbis4Pj4yXXwwO2lmKCEoKGNbbisxMj4+Ml18MCktcz4+Mj4+PjA+cj4+PjApKXt2PVhhKDQpfDA7Y1t2Pj4yXT0yMTMwNDt3Yih2fDAsMjEzNzYsMTk2KX1uPWNbcysocjw8Mik+PjJdfDA7aWYoKG58MCk9PTApe3Y9WGEoNCl8MDtjW3Y+PjJdPTIxMzA0O3diKHZ8MCwyMTM3NiwxOTYpfWo9Y1tqPj4yXXwwO2lmKCEoKGNbMzQwMF18MCk9PS0xKSl7Y1twPj4yXT0xMzYwMDtjW3ArND4+Ml09MjA4O2NbcCs4Pj4yXT0wO2NnKDEzNjAwLHApfXA9KGNbMTM2MDQ+PjJdfDApKyAtMXwwO3I9Y1tqKzg+PjJdfDA7aWYoISgoY1tqKzEyPj4yXXwwKS1yPj4yPj4+MD5wPj4+MCkpe3Y9WGEoNCl8MDtjW3Y+PjJdPTIxMzA0O3diKHZ8MCwyMTM3NiwxOTYpfWo9Y1tyKyhwPDwyKT4+Ml18MDtpZigoanwwKT09MCl7dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9bWNbY1soY1tqPj4yXXwwKSsyMD4+Ml0mMTI3XShsLGopO3A9YVtsPj4wXXwwO2lmKChwJjEpPT0wKXtwPShwJjI1NSk+Pj4xfWVsc2V7cD1jW2wrND4+Ml18MH1pZigocHwwKSE9MCl7Y1toPj4yXT1mO3A9YVtiPj4wXXwwO2lmKHA8PDI0Pj4yND09NDN8cDw8MjQ+PjI0PT00NSl7dj14Y1tjWyhjW24+PjJdfDApKzI4Pj4yXSY2M10obixwKXwwO3A9Y1toPj4yXXwwO2NbaD4+Ml09cCsxO2FbcD4+MF09djtwPWIrMXwwfWVsc2V7cD1ifWlmKCgoZS1wfDApPjE/KGFbcD4+MF18MCk9PTQ4OjApPyhxPXArMXwwLHY9YVtxPj4wXXwwLHY8PDI0Pj4yND09ODh8djw8MjQ+PjI0PT0xMjApOjApe3Y9eGNbY1soY1tuPj4yXXwwKSsyOD4+Ml0mNjNdKG4sNDgpfDA7dT1jW2g+PjJdfDA7Y1toPj4yXT11KzE7YVt1Pj4wXT12O3U9eGNbY1soY1tuPj4yXXwwKSsyOD4+Ml0mNjNdKG4sYVtxPj4wXXwwKXwwO3Y9Y1toPj4yXXwwO2NbaD4+Ml09disxO2Fbdj4+MF09dTtwPXArMnwwfWlmKChwfDApIT0oZXwwKT8obz1lKyAtMXwwLG8+Pj4wPnA+Pj4wKTowKXtxPXA7ZG97dj1hW3E+PjBdfDA7YVtxPj4wXT1hW28+PjBdfDA7YVtvPj4wXT12O3E9cSsxfDA7bz1vKyAtMXwwfXdoaWxlKHE+Pj4wPG8+Pj4wKX1qPW9jW2NbKGNbaj4+Ml18MCkrMTY+PjJdJjEyN10oail8MDtpZihwPj4+MDxlPj4+MCl7cT1sKzF8MDtzPWwrNHwwO289bCs4fDA7dT0wO3Q9MDtyPXA7d2hpbGUoMSl7dj1hWygoYVtsPj4wXSYxKT09MD9xOmNbbz4+Ml18MCkrdD4+MF18MDtpZih2PDwyND4+MjQhPTAmKHV8MCk9PSh2PDwyND4+MjR8MCkpe3U9Y1toPj4yXXwwO2NbaD4+Ml09dSsxO2FbdT4+MF09ajt1PWFbbD4+MF18MDtpZigodSYxKT09MCl7dj0odSYyNTUpPj4+MX1lbHNle3Y9Y1tzPj4yXXwwfXU9MDt0PSh0Pj4+MDwodisgLTF8MCk+Pj4wJjEpK3R8MH13PXhjW2NbKGNbbj4+Ml18MCkrMjg+PjJdJjYzXShuLGFbcj4+MF18MCl8MDt2PWNbaD4+Ml18MDtjW2g+PjJdPXYrMTthW3Y+PjBdPXc7cj1yKzF8MDtpZighKHI+Pj4wPGU+Pj4wKSl7YnJlYWt9ZWxzZXt1PXUrMXwwfX19bz1mKyhwLWIpfDA7bj1jW2g+PjJdfDA7aWYoKG98MCkhPShufDApPyhtPW4rIC0xfDAsbT4+PjA+bz4+PjApOjApe2Rve3c9YVtvPj4wXXwwO2Fbbz4+MF09YVttPj4wXXwwO2FbbT4+MF09dztvPW8rMXwwO209bSsgLTF8MH13aGlsZShvPj4+MDxtPj4+MCl9fWVsc2V7dWNbY1soY1tuPj4yXXwwKSszMj4+Ml0mMzFdKG4sYixlLGYpfDA7Y1toPj4yXT1mKyhlLWIpfWlmKChkfDApPT0oZXwwKSl7Yj1jW2g+PjJdfDB9ZWxzZXtiPWYrKGQtYil8MH1jW2c+PjJdPWI7aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59bD1jW2wrOD4+Ml18MDtpZigobHwwKT09MCl7aT1rO3JldHVybn12bihsKTtpPWs7cmV0dXJufWZ1bmN0aW9uIHlpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2Q9aTtpPWkrOTZ8MDtuPWQrOHwwO3M9ZDtvPWQrNjR8MDtrPWQrNjB8MDttPWQrNTZ8MDtwPWQrNTJ8MDt1PXM7Y1t1Pj4yXT0zNztjW3UrND4+Ml09MDt1PXMrMXwwO3E9Zis0fDA7cj1jW3E+PjJdfDA7aWYoKHImMjA0OHwwKSE9MCl7YVt1Pj4wXT00Mzt1PXMrMnwwfWlmKChyJjUxMnwwKSE9MCl7YVt1Pj4wXT0zNTt1PXUrMXwwfXQ9dSsyfDA7YVt1Pj4wXT0xMDg7YVt1KzE+PjBdPTEwODt1PXImNzQ7ZG97aWYoKHV8MCk9PTY0KXthW3Q+PjBdPTExMX1lbHNlIGlmKCh1fDApPT04KXtpZigociYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNle2FbdD4+MF09MTAwfX13aGlsZSgwKTtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dT1jWzMzNDBdfDA7dD1uO2NbdD4+Ml09aDtjW3QrND4+Ml09ajtqPXdpKG8sMjIsdSxzLG4pfDA7aD1vK2p8MDtxPWNbcT4+Ml0mMTc2O2Rve2lmKChxfDApPT0zMil7cT1ofWVsc2UgaWYoKHF8MCk9PTE2KXtxPWFbbz4+MF18MDtpZihxPDwyND4+MjQ9PTQzfHE8PDI0Pj4yND09NDUpe3E9bysxfDA7YnJlYWt9aWYoKGp8MCk+MSZxPDwyND4+MjQ9PTQ4Pyh1PWFbbysxPj4wXXwwLHU8PDI0Pj4yND09ODh8dTw8MjQ+PjI0PT0xMjApOjApe3E9bysyfDB9ZWxzZXtsPTIxfX1lbHNle2w9MjF9fXdoaWxlKDApO2lmKChsfDApPT0yMSl7cT1vfWw9Y1tmKzI4Pj4yXXwwO2NbcD4+Ml09bDtsPWwrNHwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTt4aShvLHEsaCxuLGssbSxwKTtsPWNbcD4+Ml18MDt0PWwrNHwwO3U9Y1t0Pj4yXXwwO2NbdD4+Ml09dSsgLTE7aWYoKHV8MCkhPTApe3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1ttPj4yXXwwO1djKGIscyxuLHQsdSxmLGcpO2k9ZDtyZXR1cm59bGNbY1soY1tsPj4yXXwwKSs4Pj4yXSYyNTVdKGwpO3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1ttPj4yXXwwO1djKGIscyxuLHQsdSxmLGcpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gemkoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDttPWk7aT1pKzY0fDA7cj1tO3E9bSsxNnwwO249bSsyNHwwO2s9bSszNnwwO2Q9bSs4fDA7aj1tKzR8MDtvPW0rMTJ8MDthW3ErMD4+MF09YVsxMjI2ND4+MF18MDthW3ErMT4+MF09YVsxMjI2NT4+MF18MDthW3ErMj4+MF09YVsxMjI2Nj4+MF18MDthW3ErMz4+MF09YVsxMjI2Nz4+MF18MDthW3ErND4+MF09YVsxMjI2OD4+MF18MDthW3ErNT4+MF09YVsxMjI2OT4+MF18MDt0PXErMXwwO3A9Zis0fDA7cz1jW3A+PjJdfDA7aWYoKHMmMjA0OHwwKSE9MCl7YVt0Pj4wXT00Mzt0PXErMnwwfWlmKChzJjUxMnwwKSE9MCl7YVt0Pj4wXT0zNTt0PXQrMXwwfWFbdD4+MF09MTA4O3Q9dCsxfDA7dT1zJjc0O2Rve2lmKCh1fDApPT04KXtpZigocyYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNlIGlmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZXthW3Q+PjBdPTExN319d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO2Nbcj4+Ml09aDtxPXdpKG4sMTIsdSxxLHIpfDA7aD1uK3F8MDtwPWNbcD4+Ml0mMTc2O2Rve2lmKChwfDApPT0zMil7cD1ofWVsc2UgaWYoKHB8MCk9PTE2KXtwPWFbbj4+MF18MDtpZihwPDwyND4+MjQ9PTQzfHA8PDI0Pj4yND09NDUpe3A9bisxfDA7YnJlYWt9aWYoKHF8MCk+MSZwPDwyND4+MjQ9PTQ4Pyh1PWFbbisxPj4wXXwwLHU8PDI0Pj4yND09ODh8dTw8MjQ+PjI0PT0xMjApOjApe3A9bisyfDB9ZWxzZXtsPTIxfX1lbHNle2w9MjF9fXdoaWxlKDApO2lmKChsfDApPT0yMSl7cD1ufWw9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09bDtsPWwrNHwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTt4aShuLHAsaCxrLGQsaixvKTtsPWNbbz4+Ml18MDt0PWwrNHwwO3U9Y1t0Pj4yXXwwO2NbdD4+Ml09dSsgLTE7aWYoKHV8MCkhPTApe3M9Y1tlPj4yXXwwO3Q9Y1tkPj4yXXwwO3U9Y1tqPj4yXXwwO1djKGIscyxrLHQsdSxmLGcpO2k9bTtyZXR1cm59bGNbY1soY1tsPj4yXXwwKSs4Pj4yXSYyNTVdKGwpO3M9Y1tlPj4yXXwwO3Q9Y1tkPj4yXXwwO3U9Y1tqPj4yXXwwO1djKGIscyxrLHQsdSxmLGcpO2k9bTtyZXR1cm59ZnVuY3Rpb24gQWkoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7ZD1pO2k9aSs5NnwwO249ZCs4fDA7cz1kO289ZCs2NHwwO2s9ZCs2MHwwO209ZCs1NnwwO3A9ZCs1MnwwO3U9cztjW3U+PjJdPTM3O2NbdSs0Pj4yXT0wO3U9cysxfDA7cT1mKzR8MDtyPWNbcT4+Ml18MDtpZigociYyMDQ4fDApIT0wKXthW3U+PjBdPTQzO3U9cysyfDB9aWYoKHImNTEyfDApIT0wKXthW3U+PjBdPTM1O3U9dSsxfDB9dD11KzJ8MDthW3U+PjBdPTEwODthW3UrMT4+MF09MTA4O3U9ciY3NDtkb3tpZigodXwwKT09NjQpe2FbdD4+MF09MTExfWVsc2UgaWYoKHV8MCk9PTgpe2lmKChyJjE2Mzg0fDApPT0wKXthW3Q+PjBdPTEyMDticmVha31lbHNle2FbdD4+MF09ODg7YnJlYWt9fWVsc2V7YVt0Pj4wXT0xMTd9fXdoaWxlKDApO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX11PWNbMzM0MF18MDt0PW47Y1t0Pj4yXT1oO2NbdCs0Pj4yXT1qO2o9d2kobywyMyx1LHMsbil8MDtoPW8ranwwO3E9Y1txPj4yXSYxNzY7ZG97aWYoKHF8MCk9PTMyKXtxPWh9ZWxzZSBpZigocXwwKT09MTYpe3E9YVtvPj4wXXwwO2lmKHE8PDI0Pj4yND09NDN8cTw8MjQ+PjI0PT00NSl7cT1vKzF8MDticmVha31pZigoanwwKT4xJnE8PDI0Pj4yND09NDg/KHU9YVtvKzE+PjBdfDAsdTw8MjQ+PjI0PT04OHx1PDwyND4+MjQ9PTEyMCk6MCl7cT1vKzJ8MH1lbHNle2w9MjF9fWVsc2V7bD0yMX19d2hpbGUoMCk7aWYoKGx8MCk9PTIxKXtxPW99bD1jW2YrMjg+PjJdfDA7Y1twPj4yXT1sO2w9bCs0fDA7Y1tsPj4yXT0oY1tsPj4yXXwwKSsxO3hpKG8scSxoLG4sayxtLHApO2w9Y1twPj4yXXwwO3Q9bCs0fDA7dT1jW3Q+PjJdfDA7Y1t0Pj4yXT11KyAtMTtpZigodXwwKSE9MCl7cz1jW2U+PjJdfDA7dD1jW2s+PjJdfDA7dT1jW20+PjJdfDA7V2MoYixzLG4sdCx1LGYsZyk7aT1kO3JldHVybn1sY1tjWyhjW2w+PjJdfDApKzg+PjJdJjI1NV0obCk7cz1jW2U+PjJdfDA7dD1jW2s+PjJdfDA7dT1jW20+PjJdfDA7V2MoYixzLG4sdCx1LGYsZyk7aT1kO3JldHVybn1mdW5jdGlvbiBCaShiLGQsZSxmLGcsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aj0rajt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MDtkPWk7aT1pKzEyOHwwO3A9ZDt1PWQrNjR8MDtyPWQrOTJ8MDt0PWQrODB8MDtsPWQrNzZ8MDtuPWQrNzJ8MDtvPWQrODR8MDttPWQrODh8MDt2PXU7Y1t2Pj4yXT0zNztjW3YrND4+Ml09MDt2PXUrMXwwO3M9Zis0fDA7dz1jW3M+PjJdfDA7aWYoKHcmMjA0OHwwKSE9MCl7YVt2Pj4wXT00Mzt2PXUrMnwwfWlmKCh3JjEwMjR8MCkhPTApe2Fbdj4+MF09MzU7dj12KzF8MH14PXcmMjYwO3k9dz4+PjE0O2Rve2lmKCh4fDApPT0yNjApe2lmKCh5JjF8MCk9PTApe2Fbdj4+MF09OTc7dj0wO2JyZWFrfWVsc2V7YVt2Pj4wXT02NTt2PTA7YnJlYWt9fWVsc2V7YVt2Pj4wXT00Njt3PXYrMnwwO2FbdisxPj4wXT00MjtpZigoeHwwKT09NCl7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDI7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MDt2PTE7YnJlYWt9fWVsc2UgaWYoKHh8MCk9PTI1Nil7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDE7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT02OTt2PTE7YnJlYWt9fWVsc2V7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDM7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MTt2PTE7YnJlYWt9fX19d2hpbGUoMCk7Y1t0Pj4yXT1yO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtpZih2KXtjW3A+PjJdPWNbZis4Pj4yXTt5PXArNHwwO2hbaz4+M109ajtjW3k+PjJdPWNbaz4+Ml07Y1t5KzQ+PjJdPWNbays0Pj4yXTt3PXdpKHIsMzAsdyx1LHApfDB9ZWxzZXtoW2s+PjNdPWo7Y1twPj4yXT1jW2s+PjJdO2NbcCs0Pj4yXT1jW2srND4+Ml07dz13aShyLDMwLHcsdSxwKXwwfWlmKCh3fDApPjI5KXt3PShhWzEzMzY4XXwwKT09MDtpZih2KXtpZih3PyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2NbcD4+Ml09Y1tmKzg+PjJdO3k9cCs0fDA7aFtrPj4zXT1qO2NbeT4+Ml09Y1trPj4yXTtjW3krND4+Ml09Y1trKzQ+PjJdO3c9Q2kodCx3LHUscCl8MH1lbHNle2lmKHc/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7Y1twPj4yXT1jW2YrOD4+Ml07eT1wKzR8MDtoW2s+PjNdPWo7Y1t5Pj4yXT1jW2s+PjJdO2NbeSs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfXQ9Y1t0Pj4yXXwwO2lmKCh0fDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3Y9dH19ZWxzZXt2PWNbdD4+Ml18MDt0PTB9dT12K3d8MDtzPWNbcz4+Ml0mMTc2O2Rve2lmKChzfDApPT0xNil7cz1hW3Y+PjBdfDA7aWYoczw8MjQ+PjI0PT00M3xzPDwyND4+MjQ9PTQ1KXtzPXYrMXwwO2JyZWFrfWlmKCh3fDApPjEmczw8MjQ+PjI0PT00OD8oeT1hW3YrMT4+MF18MCx5PDwyND4+MjQ9PTg4fHk8PDI0Pj4yND09MTIwKTowKXtzPXYrMnwwfWVsc2V7cT00OH19ZWxzZSBpZigoc3wwKT09MzIpe3M9dX1lbHNle3E9NDh9fXdoaWxlKDApO2lmKChxfDApPT00OCl7cz12fWlmKCh2fDApIT0ocnwwKSl7cD11bih3PDwxKXwwO2lmKChwfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3I9djtxPXB9fWVsc2V7cT0wfXg9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09eDt4PXgrNHwwO2NbeD4+Ml09KGNbeD4+Ml18MCkrMTtEaShyLHMsdSxwLGwsbixvKTtvPWNbbz4+Ml18MDt4PW8rNHwwO3k9Y1t4Pj4yXXwwO2NbeD4+Ml09eSsgLTE7aWYoKHl8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1XYyhtLGNbZT4+Ml18MCxwLGNbbD4+Ml18MCxjW24+PjJdfDAsZixnKTt5PWNbbT4+Ml18MDtjW2U+PjJdPXk7Y1tiPj4yXT15O2lmKChxfDApIT0wKXt2bihxKX1pZigodHwwKT09MCl7aT1kO3JldHVybn12bih0KTtpPWQ7cmV0dXJufWZ1bmN0aW9uIENpKGEsYixkLGUpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wO2Y9aTtpPWkrMTZ8MDtnPWY7Y1tnPj4yXT1lO2I9aWIoYnwwKXwwO2Q9SWIoYXwwLGR8MCxnfDApfDA7aWYoKGJ8MCk9PTApe2k9ZjtyZXR1cm4gZHwwfWliKGJ8MCl8MDtpPWY7cmV0dXJuIGR8MH1mdW5jdGlvbiBEaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO2s9aTtpPWkrMzJ8MDtvPWs7bD1rKzEyfDA7bT1jW2o+PjJdfDA7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW28+PjJdPTEzNDU2O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM0NTYsbyl9dD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7cj1jW20rOD4+Ml18MDtpZighKChjW20rMTI+PjJdfDApLXI+PjI+Pj4wPnQ+Pj4wKSl7eT1YYSg0KXwwO2NbeT4+Ml09MjEzMDQ7d2IoeXwwLDIxMzc2LDE5Nil9bT1jW3IrKHQ8PDIpPj4yXXwwO2lmKChtfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1qPWNbaj4+Ml18MDtpZighKChjWzM0MDBdfDApPT0tMSkpe2Nbbz4+Ml09MTM2MDA7Y1tvKzQ+PjJdPTIwODtjW28rOD4+Ml09MDtjZygxMzYwMCxvKX1vPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDtyPWNbais4Pj4yXXwwO2lmKCEoKGNbaisxMj4+Ml18MCktcj4+Mj4+PjA+bz4+PjApKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1vPWNbcisobzw8Mik+PjJdfDA7aWYoKG98MCk9PTApe3k9WGEoNCl8MDtjW3k+PjJdPTIxMzA0O3diKHl8MCwyMTM3NiwxOTYpfW1jW2NbKGNbbz4+Ml18MCkrMjA+PjJdJjEyN10obCxvKTtjW2g+PjJdPWY7aj1hW2I+PjBdfDA7aWYoajw8MjQ+PjI0PT00M3xqPDwyND4+MjQ9PTQ1KXt5PXhjW2NbKGNbbT4+Ml18MCkrMjg+PjJdJjYzXShtLGopfDA7dD1jW2g+PjJdfDA7Y1toPj4yXT10KzE7YVt0Pj4wXT15O3Q9YisxfDB9ZWxzZXt0PWJ9aj1lO2E6ZG97aWYoKChqLXR8MCk+MT8oYVt0Pj4wXXwwKT09NDg6MCk/KHA9dCsxfDAseT1hW3A+PjBdfDAseTw8MjQ+PjI0PT04OHx5PDwyND4+MjQ9PTEyMCk6MCl7eT14Y1tjWyhjW20+PjJdfDApKzI4Pj4yXSY2M10obSw0OCl8MDt4PWNbaD4+Ml18MDtjW2g+PjJdPXgrMTthW3g+PjBdPXk7dD10KzJ8MDt4PXhjW2NbKGNbbT4+Ml18MCkrMjg+PjJdJjYzXShtLGFbcD4+MF18MCl8MDt5PWNbaD4+Ml18MDtjW2g+PjJdPXkrMTthW3k+PjBdPXg7aWYodD4+PjA8ZT4+PjApe3I9dDt3aGlsZSgxKXtwPWFbcj4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9eT1wPDwyND4+MjQ7aWYoISgoeSsgLTQ4fDApPj4+MDwxMCk/ISgoKHl8MzIpKyAtOTd8MCk+Pj4wPDYpOjApe3A9dDticmVhayBhfXI9cisxfDA7aWYoIShyPj4+MDxlPj4+MCkpe3A9dDticmVha319fWVsc2V7cD10O3I9dH19ZWxzZXtzPTE1fX13aGlsZSgwKTtiOmRve2lmKChzfDApPT0xNSl7aWYodD4+PjA8ZT4+PjApe3I9dDt3aGlsZSgxKXtwPWFbcj4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9cz1yKzF8MDtpZighKCgocDw8MjQ+PjI0KSsgLTQ4fDApPj4+MDwxMCkpe3A9dDticmVhayBifWlmKHM+Pj4wPGU+Pj4wKXtyPXN9ZWxzZXtwPXQ7cj1zO2JyZWFrfX19ZWxzZXtwPXQ7cj10fX19d2hpbGUoMCk7cz1hW2w+PjBdfDA7aWYoKHMmMSk9PTApe3M9KHMmMjU1KT4+PjF9ZWxzZXtzPWNbbCs0Pj4yXXwwfWlmKChzfDApIT0wKXtpZigocHwwKSE9KHJ8MCk/KHE9cisgLTF8MCxxPj4+MD5wPj4+MCk6MCl7cz1wO2Rve3k9YVtzPj4wXXwwO2Fbcz4+MF09YVtxPj4wXXwwO2FbcT4+MF09eTtzPXMrMXwwO3E9cSsgLTF8MH13aGlsZShzPj4+MDxxPj4+MCl9dT1vY1tjWyhjW28+PjJdfDApKzE2Pj4yXSYxMjddKG8pfDA7aWYocD4+PjA8cj4+PjApe3E9bCsxfDA7dD1sKzR8MDtzPWwrOHwwO3g9MDt3PTA7dj1wO3doaWxlKDEpe3k9YVsoKGFbbD4+MF0mMSk9PTA/cTpjW3M+PjJdfDApK3c+PjBdfDA7aWYoeTw8MjQ+PjI0PjAmKHh8MCk9PSh5PDwyND4+MjR8MCkpe3g9Y1toPj4yXXwwO2NbaD4+Ml09eCsxO2FbeD4+MF09dTt4PWFbbD4+MF18MDtpZigoeCYxKT09MCl7eT0oeCYyNTUpPj4+MX1lbHNle3k9Y1t0Pj4yXXwwfXg9MDt3PSh3Pj4+MDwoeSsgLTF8MCk+Pj4wJjEpK3d8MH16PXhjW2NbKGNbbT4+Ml18MCkrMjg+PjJdJjYzXShtLGFbdj4+MF18MCl8MDt5PWNbaD4+Ml18MDtjW2g+PjJdPXkrMTthW3k+PjBdPXo7dj12KzF8MDtpZighKHY+Pj4wPHI+Pj4wKSl7YnJlYWt9ZWxzZXt4PXgrMXwwfX19cD1mKyhwLWIpfDA7cT1jW2g+PjJdfDA7aWYoKHB8MCkhPShxfDApPyhuPXErIC0xfDAsbj4+PjA+cD4+PjApOjApe2Rve3o9YVtwPj4wXXwwO2FbcD4+MF09YVtuPj4wXXwwO2Fbbj4+MF09ejtwPXArMXwwO249bisgLTF8MH13aGlsZShwPj4+MDxuPj4+MCl9fWVsc2V7dWNbY1soY1ttPj4yXXwwKSszMj4+Ml0mMzFdKG0scCxyLGNbaD4+Ml18MCl8MDtjW2g+PjJdPShjW2g+PjJdfDApKyhyLXApfWM6ZG97aWYocj4+PjA8ZT4+PjApe3doaWxlKDEpe249YVtyPj4wXXwwO2lmKG48PDI0Pj4yND09NDYpe2JyZWFrfXk9eGNbY1soY1ttPj4yXXwwKSsyOD4+Ml0mNjNdKG0sbil8MDt6PWNbaD4+Ml18MDtjW2g+PjJdPXorMTthW3o+PjBdPXk7cj1yKzF8MDtpZighKHI+Pj4wPGU+Pj4wKSl7YnJlYWsgY319eT1vY1tjWyhjW28+PjJdfDApKzEyPj4yXSYxMjddKG8pfDA7ej1jW2g+PjJdfDA7Y1toPj4yXT16KzE7YVt6Pj4wXT15O3I9cisxfDB9fXdoaWxlKDApO3VjW2NbKGNbbT4+Ml18MCkrMzI+PjJdJjMxXShtLHIsZSxjW2g+PjJdfDApfDA7bT0oY1toPj4yXXwwKSsoai1yKXwwO2NbaD4+Ml09bTtpZigoZHwwKSE9KGV8MCkpe209ZisoZC1iKXwwfWNbZz4+Ml09bTtpZigoYVtsPj4wXSYxKT09MCl7aT1rO3JldHVybn1sPWNbbCs4Pj4yXXwwO2lmKChsfDApPT0wKXtpPWs7cmV0dXJufXZuKGwpO2k9aztyZXR1cm59ZnVuY3Rpb24gRWkoYixkLGUsZixnLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9K2o7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MDtkPWk7aT1pKzEyOHwwO3A9ZDt1PWQrNjR8MDtyPWQrOTJ8MDt0PWQrODB8MDtsPWQrNzZ8MDttPWQrNzJ8MDtvPWQrODR8MDtuPWQrODh8MDt4PXU7Y1t4Pj4yXT0zNztjW3grND4+Ml09MDt4PXUrMXwwO3M9Zis0fDA7dj1jW3M+PjJdfDA7aWYoKHYmMjA0OHwwKSE9MCl7YVt4Pj4wXT00Mzt4PXUrMnwwfWlmKCh2JjEwMjR8MCkhPTApe2FbeD4+MF09MzU7eD14KzF8MH13PXYmMjYwO3Y9dj4+PjE0O2Rve2lmKCh3fDApPT0yNjApe2FbeD4+MF09NzY7dz14KzF8MDtpZigodiYxfDApPT0wKXthW3c+PjBdPTk3O3Y9MDticmVha31lbHNle2Fbdz4+MF09NjU7dj0wO2JyZWFrfX1lbHNle2FbeD4+MF09NDY7YVt4KzE+PjBdPTQyO2FbeCsyPj4wXT03Njt4PXgrM3wwO2lmKCh3fDApPT0yNTYpe2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAxO3Y9MTticmVha31lbHNle2FbeD4+MF09Njk7dj0xO2JyZWFrfX1lbHNlIGlmKCh3fDApPT00KXtpZigodiYxfDApPT0wKXthW3g+PjBdPTEwMjt2PTE7YnJlYWt9ZWxzZXthW3g+PjBdPTcwO3Y9MTticmVha319ZWxzZXtpZigodiYxfDApPT0wKXthW3g+PjBdPTEwMzt2PTE7YnJlYWt9ZWxzZXthW3g+PjBdPTcxO3Y9MTticmVha319fX13aGlsZSgwKTtjW3Q+PjJdPXI7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2lmKHYpe2NbcD4+Ml09Y1tmKzg+PjJdO3g9cCs0fDA7aFtrPj4zXT1qO2NbeD4+Ml09Y1trPj4yXTtjW3grND4+Ml09Y1trKzQ+PjJdO3c9d2kociwzMCx3LHUscCl8MH1lbHNle2hbaz4+M109ajtjW3A+PjJdPWNbaz4+Ml07Y1twKzQ+PjJdPWNbays0Pj4yXTt3PXdpKHIsMzAsdyx1LHApfDB9aWYoKHd8MCk+Mjkpe3c9KGFbMTMzNjhdfDApPT0wO2lmKHYpe2lmKHc/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7Y1twPj4yXT1jW2YrOD4+Ml07eD1wKzR8MDtoW2s+PjNdPWo7Y1t4Pj4yXT1jW2s+PjJdO2NbeCs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfWVsc2V7aWYodz8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtoW2s+PjNdPWo7Y1twPj4yXT1jW2s+PjJdO2NbcCs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfXQ9Y1t0Pj4yXXwwO2lmKCh0fDApPT0wKXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNle3Y9dH19ZWxzZXt2PWNbdD4+Ml18MDt0PTB9dT12K3d8MDtzPWNbcz4+Ml0mMTc2O2Rve2lmKChzfDApPT0xNil7cz1hW3Y+PjBdfDA7aWYoczw8MjQ+PjI0PT00M3xzPDwyND4+MjQ9PTQ1KXtzPXYrMXwwO2JyZWFrfWlmKCh3fDApPjEmczw8MjQ+PjI0PT00OD8oeD1hW3YrMT4+MF18MCx4PDwyND4+MjQ9PTg4fHg8PDI0Pj4yND09MTIwKTowKXtzPXYrMnwwfWVsc2V7cT00OH19ZWxzZSBpZigoc3wwKT09MzIpe3M9dX1lbHNle3E9NDh9fXdoaWxlKDApO2lmKChxfDApPT00OCl7cz12fWlmKCh2fDApIT0ocnwwKSl7cD11bih3PDwxKXwwO2lmKChwfDApPT0wKXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNle3I9djtxPXB9fWVsc2V7cT0wfXc9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09dzt3PXcrNHwwO2Nbdz4+Ml09KGNbdz4+Ml18MCkrMTtEaShyLHMsdSxwLGwsbSxvKTtvPWNbbz4+Ml18MDt3PW8rNHwwO3g9Y1t3Pj4yXXwwO2Nbdz4+Ml09eCsgLTE7aWYoKHh8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1XYyhuLGNbZT4+Ml18MCxwLGNbbD4+Ml18MCxjW20+PjJdfDAsZixnKTt4PWNbbj4+Ml18MDtjW2U+PjJdPXg7Y1tiPj4yXT14O2lmKChxfDApIT0wKXt2bihxKX1pZigodHwwKT09MCl7aT1kO3JldHVybn12bih0KTtpPWQ7cmV0dXJufWZ1bmN0aW9uIEZpKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MDtsPWk7aT1pKzgwfDA7bj1sO289bCs3MnwwO2Q9bCs1MnwwO2s9bCsxMnwwO2FbbyswPj4wXT1hWzEyMjcyPj4wXXwwO2FbbysxPj4wXT1hWzEyMjczPj4wXXwwO2FbbysyPj4wXT1hWzEyMjc0Pj4wXXwwO2FbbyszPj4wXT1hWzEyMjc1Pj4wXXwwO2Fbbys0Pj4wXT1hWzEyMjc2Pj4wXXwwO2Fbbys1Pj4wXT1hWzEyMjc3Pj4wXXwwO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1wPWNbMzM0MF18MDtjW24+PjJdPWg7bz13aShkLDIwLHAsbyxuKXwwO2g9ZCtvfDA7cD1jW2YrND4+Ml0mMTc2O2Rve2lmKChwfDApPT0xNil7cD1hW2Q+PjBdfDA7aWYocDw8MjQ+PjI0PT00M3xwPDwyND4+MjQ9PTQ1KXtwPWQrMXwwO2JyZWFrfWlmKChvfDApPjEmcDw8MjQ+PjI0PT00OD8ocT1hW2QrMT4+MF18MCxxPDwyND4+MjQ9PTg4fHE8PDI0Pj4yND09MTIwKTowKXtwPWQrMnwwfWVsc2V7bT0xMX19ZWxzZSBpZigocHwwKT09MzIpe3A9aH1lbHNle209MTF9fXdoaWxlKDApO2lmKChtfDApPT0xMSl7cD1kfW09Y1tmKzI4Pj4yXXwwO3E9bSs0fDA7Y1txPj4yXT0oY1txPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tuPj4yXT0xMzQ1NjtjW24rND4+Ml09MjA4O2Nbbis4Pj4yXT0wO2NnKDEzNDU2LG4pfXE9KGNbMTM0NjA+PjJdfDApKyAtMXwwO249Y1ttKzg+PjJdfDA7aWYoKGNbbSsxMj4+Ml18MCktbj4+Mj4+PjA+cT4+PjA/KGo9Y1tuKyhxPDwyKT4+Ml18MCwoanwwKSE9MCk6MCl7bj1tKzR8MDtxPWNbbj4+Ml18MDtjW24+PjJdPXErIC0xO2lmKChxfDApPT0wKXtsY1tjWyhjW20+PjJdfDApKzg+PjJdJjI1NV0obSl9dWNbY1soY1tqPj4yXXwwKSszMj4+Ml0mMzFdKGosZCxoLGspfDA7aj1rK298MDtpZigocHwwKT09KGh8MCkpe3E9ajtwPWNbZT4+Ml18MDtXYyhiLHAsayxxLGosZixnKTtpPWw7cmV0dXJufXE9aysocC1kKXwwO3A9Y1tlPj4yXXwwO1djKGIscCxrLHEsaixmLGcpO2k9bDtyZXR1cm59cT1YYSg0KXwwO2NbcT4+Ml09MjEzMDQ7d2IocXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gR2koYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gSGkoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIElpKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MDtqPWk7aT1pKzMyfDA7bT1qO249aisyNHwwO2s9aisxMnwwO2lmKChjW2YrND4+Ml0mMXwwKT09MCl7az1jWyhjW2Q+PjJdfDApKzI0Pj4yXXwwO2Nbbj4+Ml09Y1tlPj4yXTtsPWgmMTtjW20rMD4+Ml09Y1tuKzA+PjJdO3djW2smNjNdKGIsZCxtLGYsZyxsKTtpPWo7cmV0dXJufW49Y1tmKzI4Pj4yXXwwO2Q9bis0fDA7Y1tkPj4yXT0oY1tkPj4yXXwwKSsxO2lmKCEoKGNbMzQwMl18MCk9PS0xKSl7Y1ttPj4yXT0xMzYwODtjW20rND4+Ml09MjA4O2NbbSs4Pj4yXT0wO2NnKDEzNjA4LG0pfWc9KGNbMTM2MTI+PjJdfDApKyAtMXwwO209Y1tuKzg+PjJdfDA7aWYoKGNbbisxMj4+Ml18MCktbT4+Mj4+PjA+Zz4+PjA/KGw9Y1ttKyhnPDwyKT4+Ml18MCwobHwwKSE9MCk6MCl7Zj1uKzR8MDtkPWNbZj4+Ml18MDtjW2Y+PjJdPWQrIC0xO2lmKChkfDApPT0wKXtsY1tjWyhjW24+PjJdfDApKzg+PjJdJjI1NV0obil9bT1jW2w+PjJdfDA7aWYoaCl7bWNbY1ttKzI0Pj4yXSYxMjddKGssbCl9ZWxzZXttY1tjW20rMjg+PjJdJjEyN10oayxsKX1nPWFbaz4+MF18MDtpZigoZyYxKT09MCl7aD1rKzR8MDttPWg7bD1rKzh8MH1lbHNle2w9ays4fDA7bT1jW2w+PjJdfDA7aD1rKzR8MH13aGlsZSgxKXtmPShnJjEpPT0wO2lmKGYpe249aDtnPShnJjI1NSk+Pj4xfWVsc2V7bj1jW2w+PjJdfDA7Zz1jW2g+PjJdfDB9aWYoKG18MCk9PShuKyhnPDwyKXwwKSl7YnJlYWt9Zz1jW20+PjJdfDA7Zj1jW2U+PjJdfDA7aWYoKGZ8MCkhPTApe2Q9ZisyNHwwO249Y1tkPj4yXXwwO2lmKChufDApPT0oY1tmKzI4Pj4yXXwwKSl7Zz14Y1tjWyhjW2Y+PjJdfDApKzUyPj4yXSY2M10oZixnKXwwfWVsc2V7Y1tkPj4yXT1uKzQ7Y1tuPj4yXT1nfWlmKChnfDApPT0tMSl7Y1tlPj4yXT0wfX1nPWFbaz4+MF18MDttPW0rNHwwfWNbYj4+Ml09Y1tlPj4yXTtpZihmKXtpPWo7cmV0dXJufWs9Y1trKzg+PjJdfDA7aWYoKGt8MCk9PTApe2k9ajtyZXR1cm59dm4oayk7aT1qO3JldHVybn1kPVhhKDQpfDA7Y1tkPj4yXT0yMTMwNDt3YihkfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBKaShiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTA7bT1pO2k9aSsxMjh8MDtsPW07cj1tKzEwOHwwO249bSs5NnwwO2Q9bSs5MnwwO2o9bSs4OHwwO289bSs4NHwwO2FbciswPj4wXT1hWzEyMjY0Pj4wXXwwO2FbcisxPj4wXT1hWzEyMjY1Pj4wXXwwO2FbcisyPj4wXT1hWzEyMjY2Pj4wXXwwO2FbciszPj4wXT1hWzEyMjY3Pj4wXXwwO2Fbcis0Pj4wXT1hWzEyMjY4Pj4wXXwwO2Fbcis1Pj4wXT1hWzEyMjY5Pj4wXXwwO3M9cisxfDA7cD1mKzR8MDtxPWNbcD4+Ml18MDtpZigocSYyMDQ4fDApIT0wKXthW3M+PjBdPTQzO3M9cisyfDB9aWYoKHEmNTEyfDApIT0wKXthW3M+PjBdPTM1O3M9cysxfDB9YVtzPj4wXT0xMDg7cz1zKzF8MDt0PXEmNzQ7ZG97aWYoKHR8MCk9PTgpe2lmKChxJjE2Mzg0fDApPT0wKXthW3M+PjBdPTEyMDticmVha31lbHNle2Fbcz4+MF09ODg7YnJlYWt9fWVsc2UgaWYoKHR8MCk9PTY0KXthW3M+PjBdPTExMX1lbHNle2Fbcz4+MF09MTAwfX13aGlsZSgwKTtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9cT1jWzMzNDBdfDA7Y1tsPj4yXT1oO3E9d2kobiwxMixxLHIsbCl8MDtoPW4rcXwwO3A9Y1twPj4yXSYxNzY7ZG97aWYoKHB8MCk9PTE2KXtwPWFbbj4+MF18MDtpZihwPDwyND4+MjQ9PTQzfHA8PDI0Pj4yND09NDUpe3A9bisxfDA7YnJlYWt9aWYoKHF8MCk+MSZwPDwyND4+MjQ9PTQ4Pyh0PWFbbisxPj4wXXwwLHQ8PDI0Pj4yND09ODh8dDw8MjQ+PjI0PT0xMjApOjApe3A9bisyfDB9ZWxzZXtrPTIxfX1lbHNlIGlmKChwfDApPT0zMil7cD1ofWVsc2V7az0yMX19d2hpbGUoMCk7aWYoKGt8MCk9PTIxKXtwPW59az1jW2YrMjg+PjJdfDA7Y1tvPj4yXT1rO2s9ays0fDA7Y1trPj4yXT0oY1trPj4yXXwwKSsxO0tpKG4scCxoLGwsZCxqLG8pO2s9Y1tvPj4yXXwwO3M9ays0fDA7dD1jW3M+PjJdfDA7Y1tzPj4yXT10KyAtMTtpZigodHwwKSE9MCl7cj1jW2U+PjJdfDA7cz1jW2Q+PjJdfDA7dD1jW2o+PjJdfDA7TGkoYixyLGwscyx0LGYsZyk7aT1tO3JldHVybn1sY1tjWyhjW2s+PjJdfDApKzg+PjJdJjI1NV0oayk7cj1jW2U+PjJdfDA7cz1jW2Q+PjJdfDA7dD1jW2o+PjJdfDA7TGkoYixyLGwscyx0LGYsZyk7aT1tO3JldHVybn1mdW5jdGlvbiBLaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MDtrPWk7aT1pKzMyfDA7bz1rO2w9aysxMnwwO249Y1tqPj4yXXwwO2lmKCEoKGNbMzM2Ml18MCk9PS0xKSl7Y1tvPj4yXT0xMzQ0ODtjW28rND4+Ml09MjA4O2Nbbys4Pj4yXT0wO2NnKDEzNDQ4LG8pfXM9KGNbMTM0NTI+PjJdfDApKyAtMXwwO3I9Y1tuKzg+PjJdfDA7aWYoISgoY1tuKzEyPj4yXXwwKS1yPj4yPj4+MD5zPj4+MCkpe3Y9WGEoNCl8MDtjW3Y+PjJdPTIxMzA0O3diKHZ8MCwyMTM3NiwxOTYpfW49Y1tyKyhzPDwyKT4+Ml18MDtpZigobnwwKT09MCl7dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9aj1jW2o+PjJdfDA7aWYoISgoY1szNDAyXXwwKT09LTEpKXtjW28+PjJdPTEzNjA4O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM2MDgsbyl9bz0oY1sxMzYxMj4+Ml18MCkrIC0xfDA7cj1jW2orOD4+Ml18MDtpZighKChjW2orMTI+PjJdfDApLXI+PjI+Pj4wPm8+Pj4wKSl7dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9aj1jW3IrKG88PDIpPj4yXXwwO2lmKChqfDApPT0wKXt2PVhhKDQpfDA7Y1t2Pj4yXT0yMTMwNDt3Yih2fDAsMjEzNzYsMTk2KX1tY1tjWyhjW2o+PjJdfDApKzIwPj4yXSYxMjddKGwsaik7bz1hW2w+PjBdfDA7aWYoKG8mMSk9PTApe289KG8mMjU1KT4+PjF9ZWxzZXtvPWNbbCs0Pj4yXXwwfWlmKChvfDApIT0wKXtjW2g+PjJdPWY7bz1hW2I+PjBdfDA7aWYobzw8MjQ+PjI0PT00M3xvPDwyND4+MjQ9PTQ1KXt2PXhjW2NbKGNbbj4+Ml18MCkrNDQ+PjJdJjYzXShuLG8pfDA7bz1jW2g+PjJdfDA7Y1toPj4yXT1vKzQ7Y1tvPj4yXT12O289YisxfDB9ZWxzZXtvPWJ9aWYoKChlLW98MCk+MT8oYVtvPj4wXXwwKT09NDg6MCk/KHE9bysxfDAsdj1hW3E+PjBdfDAsdjw8MjQ+PjI0PT04OHx2PDwyND4+MjQ9PTEyMCk6MCl7dj14Y1tjWyhjW24+PjJdfDApKzQ0Pj4yXSY2M10obiw0OCl8MDt1PWNbaD4+Ml18MDtjW2g+PjJdPXUrNDtjW3U+PjJdPXY7dT14Y1tjWyhjW24+PjJdfDApKzQ0Pj4yXSY2M10obixhW3E+PjBdfDApfDA7dj1jW2g+PjJdfDA7Y1toPj4yXT12KzQ7Y1t2Pj4yXT11O289bysyfDB9aWYoKG98MCkhPShlfDApPyhwPWUrIC0xfDAscD4+PjA+bz4+PjApOjApe3E9bztkb3t2PWFbcT4+MF18MDthW3E+PjBdPWFbcD4+MF18MDthW3A+PjBdPXY7cT1xKzF8MDtwPXArIC0xfDB9d2hpbGUocT4+PjA8cD4+PjApfXE9b2NbY1soY1tqPj4yXXwwKSsxNj4+Ml0mMTI3XShqKXwwO2lmKG8+Pj4wPGU+Pj4wKXtwPWwrMXwwO3M9bCs0fDA7aj1sKzh8MDt1PTA7dD0wO3I9bzt3aGlsZSgxKXt2PWFbKChhW2w+PjBdJjEpPT0wP3A6Y1tqPj4yXXwwKSt0Pj4wXXwwO2lmKHY8PDI0Pj4yNCE9MCYodXwwKT09KHY8PDI0Pj4yNHwwKSl7dT1jW2g+PjJdfDA7Y1toPj4yXT11KzQ7Y1t1Pj4yXT1xO3U9YVtsPj4wXXwwO2lmKCh1JjEpPT0wKXt2PSh1JjI1NSk+Pj4xfWVsc2V7dj1jW3M+PjJdfDB9dT0wO3Q9KHQ+Pj4wPCh2KyAtMXwwKT4+PjAmMSkrdHwwfXg9eGNbY1soY1tuPj4yXXwwKSs0ND4+Ml0mNjNdKG4sYVtyPj4wXXwwKXwwO3c9Y1toPj4yXXwwO3Y9dys0fDA7Y1toPj4yXT12O2Nbdz4+Ml09eDtyPXIrMXwwO2lmKCEocj4+PjA8ZT4+PjApKXticmVha31lbHNle3U9dSsxfDB9fX1lbHNle3Y9Y1toPj4yXXwwfWg9Zisoby1iPDwyKXwwO2lmKChofDApIT0odnwwKT8obT12KyAtNHwwLG0+Pj4wPmg+Pj4wKTowKXtkb3t4PWNbaD4+Ml18MDtjW2g+PjJdPWNbbT4+Ml07Y1ttPj4yXT14O2g9aCs0fDA7bT1tKyAtNHwwfXdoaWxlKGg+Pj4wPG0+Pj4wKX19ZWxzZXt1Y1tjWyhjW24+PjJdfDApKzQ4Pj4yXSYzMV0obixiLGUsZil8MDt2PWYrKGUtYjw8Mil8MDtjW2g+PjJdPXZ9aWYoKGR8MCkhPShlfDApKXt2PWYrKGQtYjw8Mil8MH1jW2c+PjJdPXY7aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59bD1jW2wrOD4+Ml18MDtpZigobHwwKT09MCl7aT1rO3JldHVybn12bihsKTtpPWs7cmV0dXJufWZ1bmN0aW9uIExpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7az1pO2k9aSsxNnwwO2w9aztpZigoZHwwKT09MCl7Y1tiPj4yXT0wO2k9aztyZXR1cm59cT1lO249Zy1xPj4yO2g9aCsxMnwwO209Y1toPj4yXXwwO249KG18MCk+KG58MCk/bS1ufDA6MDttPWY7cT1tLXF8MDtwPXE+PjI7aWYoKHF8MCk+MD8oaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsZSxwKXwwKSE9KHB8MCk6MCl7Y1tiPj4yXT0wO2k9aztyZXR1cm59ZG97aWYoKG58MCk+MCl7aWYobj4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihuPj4+MDwyKXthW2w+PjBdPW48PDE7ZT1sKzR8MDtvPTE4fWVsc2V7ZT1uKzQmLTQ7cD1lPDwyO3A9KHB8MCk9PTA/MTpwO3doaWxlKDEpe3E9dW4ocCl8MDtpZigocXwwKSE9MCl7bz0xNzticmVha31xPWNbNTY2Nl18MDtjWzU2NjZdPXErMDtpZigocXwwKT09MCl7YnJlYWt9c2NbcSYzMV0oKX1pZigob3wwKT09MTcpe2NbbCs4Pj4yXT1xO2NbbD4+Ml09ZXwxO2NbbCs0Pj4yXT1uO2lmKChufDApPT0wKXtlPXE7YnJlYWt9ZWxzZXtlPXE7bz0xODticmVha319cT1YYSg0KXwwO2NbcT4+Ml09MjI2ODA7d2IocXwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKChvfDApPT0xOCl7bz1uO3A9ZTt3aGlsZSgxKXtvPW8rIC0xfDA7Y1twPj4yXT1qO2lmKChvfDApPT0wKXticmVha31lbHNle3A9cCs0fDB9fX1jW2UrKG48PDIpPj4yXT0wO2lmKChhW2w+PjBdJjEpPT0wKXtqPWwrNHwwfWVsc2V7aj1jW2wrOD4+Ml18MH1pZigoaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsaixuKXwwKT09KG58MCkpe2lmKChhW2w+PjBdJjEpPT0wKXticmVha31sPWNbbCs4Pj4yXXwwO2lmKChsfDApPT0wKXticmVha312bihsKTticmVha31jW2I+PjJdPTA7aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59Yj1jW2wrOD4+Ml18MDtpZigoYnwwKT09MCl7aT1rO3JldHVybn12bihiKTtpPWs7cmV0dXJufX13aGlsZSgwKTtxPWctbXwwO2w9cT4+MjtpZigocXwwKT4wPyhoY1tjWyhjW2Q+PjJdfDApKzQ4Pj4yXSY2M10oZCxmLGwpfDApIT0obHwwKTowKXtjW2I+PjJdPTA7aT1rO3JldHVybn1jW2g+PjJdPTA7Y1tiPj4yXT1kO2k9aztyZXR1cm59ZnVuY3Rpb24gTWkoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7bT1pO2k9aSsyMDh8MDtsPW0rOHwwO3M9bTtvPW0rMTg0fDA7ZD1tKzE4MHwwO2s9bSsxNzZ8MDtwPW0rMTcyfDA7dT1zO2NbdT4+Ml09Mzc7Y1t1KzQ+PjJdPTA7dT1zKzF8MDtxPWYrNHwwO3I9Y1txPj4yXXwwO2lmKChyJjIwNDh8MCkhPTApe2FbdT4+MF09NDM7dT1zKzJ8MH1pZigociY1MTJ8MCkhPTApe2FbdT4+MF09MzU7dT11KzF8MH10PXUrMnwwO2FbdT4+MF09MTA4O2FbdSsxPj4wXT0xMDg7dT1yJjc0O2Rve2lmKCh1fDApPT04KXtpZigociYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNlIGlmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZXthW3Q+PjBdPTEwMH19d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO3Q9bDtjW3Q+PjJdPWg7Y1t0KzQ+PjJdPWo7aD13aShvLDIyLHUscyxsKXwwO2o9bytofDA7cT1jW3E+PjJdJjE3Njtkb3tpZigocXwwKT09MzIpe3E9an1lbHNlIGlmKChxfDApPT0xNil7cT1hW28+PjBdfDA7aWYocTw8MjQ+PjI0PT00M3xxPDwyND4+MjQ9PTQ1KXtxPW8rMXwwO2JyZWFrfWlmKChofDApPjEmcTw8MjQ+PjI0PT00OD8odT1hW28rMT4+MF18MCx1PDwyND4+MjQ9PTg4fHU8PDI0Pj4yND09MTIwKTowKXtxPW8rMnwwfWVsc2V7bj0yMX19ZWxzZXtuPTIxfX13aGlsZSgwKTtpZigobnwwKT09MjEpe3E9b31uPWNbZisyOD4+Ml18MDtjW3A+PjJdPW47bj1uKzR8MDtjW24+PjJdPShjW24+PjJdfDApKzE7S2kobyxxLGosbCxkLGsscCk7bj1jW3A+PjJdfDA7dD1uKzR8MDt1PWNbdD4+Ml18MDtjW3Q+PjJdPXUrIC0xO2lmKCh1fDApIT0wKXtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWxjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKTtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWZ1bmN0aW9uIE5pKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MDtkPWk7aT1pKzEyOHwwO2w9ZDtxPWQrMTA4fDA7bj1kKzk2fDA7az1kKzkyfDA7bT1kKzg4fDA7bz1kKzg0fDA7YVtxKzA+PjBdPWFbMTIyNjQ+PjBdfDA7YVtxKzE+PjBdPWFbMTIyNjU+PjBdfDA7YVtxKzI+PjBdPWFbMTIyNjY+PjBdfDA7YVtxKzM+PjBdPWFbMTIyNjc+PjBdfDA7YVtxKzQ+PjBdPWFbMTIyNjg+PjBdfDA7YVtxKzU+PjBdPWFbMTIyNjk+PjBdfDA7cz1xKzF8MDtwPWYrNHwwO3I9Y1twPj4yXXwwO2lmKChyJjIwNDh8MCkhPTApe2Fbcz4+MF09NDM7cz1xKzJ8MH1pZigociY1MTJ8MCkhPTApe2Fbcz4+MF09MzU7cz1zKzF8MH1hW3M+PjBdPTEwODt0PXMrMXwwO3M9ciY3NDtkb3tpZigoc3wwKT09NjQpe2FbdD4+MF09MTExfWVsc2UgaWYoKHN8MCk9PTgpe2lmKChyJjE2Mzg0fDApPT0wKXthW3Q+PjBdPTEyMDticmVha31lbHNle2FbdD4+MF09ODg7YnJlYWt9fWVsc2V7YVt0Pj4wXT0xMTd9fXdoaWxlKDApO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX10PWNbMzM0MF18MDtjW2w+PjJdPWg7cT13aShuLDEyLHQscSxsKXwwO2g9bitxfDA7cD1jW3A+PjJdJjE3Njtkb3tpZigocHwwKT09MzIpe3A9aH1lbHNlIGlmKChwfDApPT0xNil7cD1hW24+PjBdfDA7aWYocDw8MjQ+PjI0PT00M3xwPDwyND4+MjQ9PTQ1KXtwPW4rMXwwO2JyZWFrfWlmKChxfDApPjEmcDw8MjQ+PjI0PT00OD8odD1hW24rMT4+MF18MCx0PDwyND4+MjQ9PTg4fHQ8PDI0Pj4yND09MTIwKTowKXtwPW4rMnwwfWVsc2V7aj0yMX19ZWxzZXtqPTIxfX13aGlsZSgwKTtpZigoanwwKT09MjEpe3A9bn1qPWNbZisyOD4+Ml18MDtjW28+PjJdPWo7aj1qKzR8MDtjW2o+PjJdPShjW2o+PjJdfDApKzE7S2kobixwLGgsbCxrLG0sbyk7aj1jW28+PjJdfDA7cz1qKzR8MDt0PWNbcz4+Ml18MDtjW3M+PjJdPXQrIC0xO2lmKCh0fDApIT0wKXtyPWNbZT4+Ml18MDtzPWNbaz4+Ml18MDt0PWNbbT4+Ml18MDtMaShiLHIsbCxzLHQsZixnKTtpPWQ7cmV0dXJufWxjW2NbKGNbaj4+Ml18MCkrOD4+Ml0mMjU1XShqKTtyPWNbZT4+Ml18MDtzPWNbaz4+Ml18MDt0PWNbbT4+Ml18MDtMaShiLHIsbCxzLHQsZixnKTtpPWQ7cmV0dXJufQoKCgpmdW5jdGlvbiBYayhiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MDtkPWk7aT1pKzE2fDA7ZT1kO2lmKChhWzEzNDMyXXwwKSE9MCl7aD1jWzMzNTZdfDA7Y1tiPj4yXT1oO2g9aCs0fDA7Zz1jW2g+PjJdfDA7Y1toPj4yXT1nKzE7aT1kO3JldHVybn1pZigoUWEoMTM0MzIpfDApPT0wKXtoPWNbMzM1Nl18MDtjW2I+PjJdPWg7aD1oKzR8MDtnPWNbaD4+Ml18MDtjW2g+PjJdPWcrMTtpPWQ7cmV0dXJufWlmKChhWzEzNDE2XXwwKT09MD8oUWEoMTM0MTYpfDApIT0wOjApe2NbMTc3NjQ+PjJdPTA7Y1s0NDQwXT0xMzM5MjthWzE3ODk2Pj4wXT0xO2NbMTc3NzI+PjJdPTE3Nzg0O2NbMTc3Njg+PjJdPTE3Nzg0O2NbMTc3NzY+PjJdPTE3ODk2O2g9Mjg7Zj0xNzc4NHwwO2Rve2NbZj4+Ml09MDtnPWNbMTc3NzI+PjJdfDA7Zj1nKzR8MDtjWzE3NzcyPj4yXT1mO2g9aCsgLTF8MH13aGlsZSgoaHwwKSE9MCk7YVsxNzkwND4+MF09MjthWzE3OTA1Pj4wXT02NzthWzE3OTA2Pj4wXT0wO2g9Y1sxNzc2OD4+Ml18MDtpZigoZnwwKSE9KGh8MCkpe2NbMTc3NzI+PjJdPWcrKDAtKChnKygwLWgpfDApPj4+Mik8PDIpfWNbMTgyMjg+PjJdPTA7Y1s0NTU2XT0xMTg3MjtpZighKChjWzI5NzRdfDApPT0tMSkpe2NbZT4+Ml09MTE4OTY7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMTg5NixlKX1VaygxNzc2MCwxODIyNCwoY1sxMTkwMD4+Ml18MCkrIC0xfDApO2NbMTgyMjA+PjJdPTA7Y1s0NTU0XT0xMTkxMjtpZighKChjWzI5ODRdfDApPT0tMSkpe2NbZT4+Ml09MTE5MzY7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMTkzNixlKX1VaygxNzc2MCwxODIxNiwoY1sxMTk0MD4+Ml18MCkrIC0xfDApO2NbMTgyMDQ+PjJdPTA7Y1s0NTUwXT0xMzQ3MjtjWzE4MjA4Pj4yXT0wO2FbMTgyMTI+PjBdPTA7Y1sxODIwOD4+Ml09Y1soTmEoKXwwKT4+Ml07aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2U+PjJdPTEzNDU2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM0NTYsZSl9VWsoMTc3NjAsMTgyMDAsKGNbMTM0NjA+PjJdfDApKyAtMXwwKTtjWzE4MTk2Pj4yXT0wO2NbNDU0OF09MTQzOTI7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW2U+PjJdPTEzNDQ4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM0NDgsZSl9VWsoMTc3NjAsMTgxOTIsKGNbMTM0NTI+PjJdfDApKyAtMXwwKTtjWzE4MTg4Pj4yXT0wO2NbNDU0Nl09MTQ2MDg7aWYoISgoY1szMzgwXXwwKT09LTEpKXtjW2U+PjJdPTEzNTIwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1MjAsZSl9VWsoMTc3NjAsMTgxODQsKGNbMTM1MjQ+PjJdfDApKyAtMXwwKTtjWzE4MTcyPj4yXT0wO2NbNDU0Ml09MTM1NDQ7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWNbMTgxNzY+PjJdPWNbMzM0MF07aWYoISgoY1szMzgyXXwwKT09LTEpKXtjW2U+PjJdPTEzNTI4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1MjgsZSl9VWsoMTc3NjAsMTgxNjgsKGNbMTM1MzI+PjJdfDApKyAtMXwwKTtjWzE4MTY0Pj4yXT0wO2NbNDU0MF09MTQ4MzI7aWYoISgoY1szMzk2XXwwKT09LTEpKXtjW2U+PjJdPTEzNTg0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1ODQsZSl9VWsoMTc3NjAsMTgxNjAsKGNbMTM1ODg+PjJdfDApKyAtMXwwKTtjWzE4MTU2Pj4yXT0wO2NbNDUzOF09MTQ5NTI7aWYoISgoY1szMzk4XXwwKT09LTEpKXtjW2U+PjJdPTEzNTkyO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1OTIsZSl9VWsoMTc3NjAsMTgxNTIsKGNbMTM1OTY+PjJdfDApKyAtMXwwKTtjWzE4MTMyPj4yXT0wO2NbNDUzMl09MTM2MjQ7YVsxODEzNj4+MF09NDY7YVsxODEzNz4+MF09NDQ7Y1sxODE0MD4+Ml09MDtjWzE4MTQ0Pj4yXT0wO2NbMTgxNDg+PjJdPTA7aWYoISgoY1szNDAwXXwwKT09LTEpKXtjW2U+PjJdPTEzNjAwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM2MDAsZSl9VWsoMTc3NjAsMTgxMjgsKGNbMTM2MDQ+PjJdfDApKyAtMXwwKTtjWzE4MTAwPj4yXT0wO2NbNDUyNF09MTM2NjQ7Y1sxODEwND4+Ml09NDY7Y1sxODEwOD4+Ml09NDQ7Y1sxODExMj4+Ml09MDtjWzE4MTE2Pj4yXT0wO2NbMTgxMjA+PjJdPTA7aWYoISgoY1szNDAyXXwwKT09LTEpKXtjW2U+PjJdPTEzNjA4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM2MDgsZSl9VWsoMTc3NjAsMTgwOTYsKGNbMTM2MTI+PjJdfDApKyAtMXwwKTtjWzE4MDkyPj4yXT0wO2NbNDUyMl09MTE5NTI7aWYoISgoY1szMDAyXXwwKT09LTEpKXtjW2U+PjJdPTEyMDA4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIwMDgsZSl9VWsoMTc3NjAsMTgwODgsKGNbMTIwMTI+PjJdfDApKyAtMXwwKTtjWzE4MDg0Pj4yXT0wO2NbNDUyMF09MTIwNzI7aWYoISgoY1szMDMyXXwwKT09LTEpKXtjW2U+PjJdPTEyMTI4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIxMjgsZSl9VWsoMTc3NjAsMTgwODAsKGNbMTIxMzI+PjJdfDApKyAtMXwwKTtjWzE4MDc2Pj4yXT0wO2NbNDUxOF09MTIxNDQ7aWYoISgoY1szMDQ4XXwwKT09LTEpKXtjW2U+PjJdPTEyMTkyO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIxOTIsZSl9VWsoMTc3NjAsMTgwNzIsKGNbMTIxOTY+PjJdfDApKyAtMXwwKTtjWzE4MDY4Pj4yXT0wO2NbNDUxNl09MTIyMDg7aWYoISgoY1szMDY0XXwwKT09LTEpKXtjW2U+PjJdPTEyMjU2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIyNTYsZSl9VWsoMTc3NjAsMTgwNjQsKGNbMTIyNjA+PjJdfDApKyAtMXwwKTtjWzE4MDYwPj4yXT0wO2NbNDUxNF09MTI4MDA7aWYoISgoY1szMjEyXXwwKT09LTEpKXtjW2U+PjJdPTEyODQ4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI4NDgsZSl9VWsoMTc3NjAsMTgwNTYsKGNbMTI4NTI+PjJdfDApKyAtMXwwKTtjWzE4MDUyPj4yXT0wO2NbNDUxMl09MTI4NjQ7aWYoISgoY1szMjI4XXwwKT09LTEpKXtjW2U+PjJdPTEyOTEyO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI5MTIsZSl9VWsoMTc3NjAsMTgwNDgsKGNbMTI5MTY+PjJdfDApKyAtMXwwKTtjWzE4MDQ0Pj4yXT0wO2NbNDUxMF09MTI5Mjg7aWYoISgoY1szMjQ0XXwwKT09LTEpKXtjW2U+PjJdPTEyOTc2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI5NzYsZSl9VWsoMTc3NjAsMTgwNDAsKGNbMTI5ODA+PjJdfDApKyAtMXwwKTtjWzE4MDM2Pj4yXT0wO2NbNDUwOF09MTI5OTI7aWYoISgoY1szMjYwXXwwKT09LTEpKXtjW2U+PjJdPTEzMDQwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMwNDAsZSl9VWsoMTc3NjAsMTgwMzIsKGNbMTMwNDQ+PjJdfDApKyAtMXwwKTtjWzE4MDI4Pj4yXT0wO2NbNDUwNl09MTMwNTY7aWYoISgoY1szMjcwXXwwKT09LTEpKXtjW2U+PjJdPTEzMDgwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMwODAsZSl9VWsoMTc3NjAsMTgwMjQsKGNbMTMwODQ+PjJdfDApKyAtMXwwKTtjWzE4MDIwPj4yXT0wO2NbNDUwNF09MTMxMzY7aWYoISgoY1szMjkwXXwwKT09LTEpKXtjW2U+PjJdPTEzMTYwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMxNjAsZSl9VWsoMTc3NjAsMTgwMTYsKGNbMTMxNjQ+PjJdfDApKyAtMXwwKTtjWzE4MDEyPj4yXT0wO2NbNDUwMl09MTMxOTI7aWYoISgoY1szMzA0XXwwKT09LTEpKXtjW2U+PjJdPTEzMjE2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMyMTYsZSl9VWsoMTc3NjAsMTgwMDgsKGNbMTMyMjA+PjJdfDApKyAtMXwwKTtjWzE4MDA0Pj4yXT0wO2NbNDUwMF09MTMyNDA7aWYoISgoY1szMzE2XXwwKT09LTEpKXtjW2U+PjJdPTEzMjY0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMyNjQsZSl9VWsoMTc3NjAsMThlMywoY1sxMzI2OD4+Ml18MCkrIC0xfDApO2NbMTc5ODg+PjJdPTA7Y1s0NDk2XT0xMjI4ODtjWzE3OTkyPj4yXT0xMjMzNjtpZighKChjWzMwOTJdfDApPT0tMSkpe2NbZT4+Ml09MTIzNjg7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMjM2OCxlKX1VaygxNzc2MCwxNzk4NCwoY1sxMjM3Mj4+Ml18MCkrIC0xfDApO2NbMTc5NzI+PjJdPTA7Y1s0NDkyXT0xMjQ0MDtjWzE3OTc2Pj4yXT0xMjQ4ODtpZighKChjWzMxMzBdfDApPT0tMSkpe2NbZT4+Ml09MTI1MjA7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMjUyMCxlKX1VaygxNzc2MCwxNzk2OCwoY1sxMjUyND4+Ml18MCkrIC0xfDApO2NbMTc5NTY+PjJdPTA7Y1s0NDg4XT0xNDMyODtkb3tpZigoYVsxMzM2OF18MCk9PTApe2lmKChRYSgxMzM2OCl8MCk9PTApe2JyZWFrfWNbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX19d2hpbGUoMCk7Y1sxNzk2MD4+Ml09Y1szMzQwXTtjWzQ0ODhdPTEyNzM2O2lmKCEoKGNbMzE4OF18MCk9PS0xKSl7Y1tlPj4yXT0xMjc1MjtjW2UrND4+Ml09MjA4O2NbZSs4Pj4yXT0wO2NnKDEyNzUyLGUpfVVrKDE3NzYwLDE3OTUyLChjWzEyNzU2Pj4yXXwwKSsgLTF8MCk7Y1sxNzk0MD4+Ml09MDtjWzQ0ODRdPTE0MzI4O2Rve2lmKChhWzEzMzY4XXwwKT09MCl7aWYoKFFhKDEzMzY4KXwwKT09MCl7YnJlYWt9Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfX13aGlsZSgwKTtjWzE3OTQ0Pj4yXT1jWzMzNDBdO2NbNDQ4NF09MTI3Njg7aWYoISgoY1szMTk2XXwwKT09LTEpKXtjW2U+PjJdPTEyNzg0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI3ODQsZSl9VWsoMTc3NjAsMTc5MzYsKGNbMTI3ODg+PjJdfDApKyAtMXwwKTtjWzE3OTMyPj4yXT0wO2NbNDQ4Ml09MTMyODA7aWYoISgoY1szMzI2XXwwKT09LTEpKXtjW2U+PjJdPTEzMzA0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMzMDQsZSl9VWsoMTc3NjAsMTc5MjgsKGNbMTMzMDg+PjJdfDApKyAtMXwwKTtjWzE3OTI0Pj4yXT0wO2NbNDQ4MF09MTMzMjA7aWYoISgoY1szMzM2XXwwKT09LTEpKXtjW2U+PjJdPTEzMzQ0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMzNDQsZSl9VWsoMTc3NjAsMTc5MjAsKGNbMTMzNDg+PjJdfDApKyAtMXwwKTtjWzMzNTJdPTE3NzYwOyRhKDEzNDE2KX1oPWNbMzM1Ml18MDtjWzMzNTZdPWg7aD1oKzR8MDtjW2g+PjJdPShjW2g+PjJdfDApKzE7JGEoMTM0MzIpO2g9Y1szMzU2XXwwO2NbYj4+Ml09aDtoPWgrNHwwO2c9Y1toPj4yXXwwO2NbaD4+Ml09ZysxO2k9ZDtyZXR1cm59ZnVuY3Rpb24gWWsoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MDtkPWk7aT1pKzE2fDA7ZT1kO2lmKCEoKGNbYj4+Ml18MCk9PS0xKSl7Y1tlPj4yXT1iO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coYixlKX1lPShjW2IrND4+Ml18MCkrIC0xfDA7Yj1jW2ErOD4+Ml18MDtpZighKChjW2ErMTI+PjJdfDApLWI+PjI+Pj4wPmU+Pj4wKSl7ZT1YYSg0KXwwO2NbZT4+Ml09MjEzMDQ7d2IoZXwwLDIxMzc2LDE5Nil9YT1jW2IrKGU8PDIpPj4yXXwwO2lmKChhfDApPT0wKXtlPVhhKDQpfDA7Y1tlPj4yXT0yMTMwNDt3YihlfDAsMjEzNzYsMTk2KX1lbHNle2k9ZDtyZXR1cm4gYXwwfXJldHVybiAwfWZ1bmN0aW9uIFprKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIF9rKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrND4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uICRrKGEpe2E9YXwwO3ZhciBiPTA7Yj1jWzMzNjBdfDA7Y1szMzYwXT1iKzE7Y1thKzQ+PjJdPWIrMTtyZXR1cm59ZnVuY3Rpb24gYWwoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gYmwoYSxkLGUpe2E9YXwwO2Q9ZHwwO2U9ZXwwO2E9aTtpZighKGU+Pj4wPDEyOCkpe2Q9MDtpPWE7cmV0dXJuIGR8MH1kPShiWyhjWyhOYSgpfDApPj4yXXwwKSsoZTw8MSk+PjFdJmQpPDwxNj4+MTYhPTA7aT1hO3JldHVybiBkfDB9ZnVuY3Rpb24gY2woYSxkLGUsZil7YT1hfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MDthPWk7aWYoKGR8MCk9PShlfDApKXtnPWQ7aT1hO3JldHVybiBnfDB9d2hpbGUoMSl7Zz1jW2Q+PjJdfDA7aWYoZz4+PjA8MTI4KXtnPWJbKGNbKE5hKCl8MCk+PjJdfDApKyhnPDwxKT4+MV18MH1lbHNle2c9MH1iW2Y+PjFdPWc7ZD1kKzR8MDtpZigoZHwwKT09KGV8MCkpe2JyZWFrfWVsc2V7Zj1mKzJ8MH19aT1hO3JldHVybiBlfDB9ZnVuY3Rpb24gZGwoYSxkLGUsZil7YT1hfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MDthPWk7YTpkb3tpZigoZXwwKT09KGZ8MCkpe2Y9ZX1lbHNle2Rve2c9Y1tlPj4yXXwwO2lmKGc+Pj4wPDEyOD8hKChiWyhjWyhOYSgpfDApPj4yXXwwKSsoZzw8MSk+PjFdJmQpPDwxNj4+MTY9PTApOjApe2Y9ZTticmVhayBhfWU9ZSs0fDB9d2hpbGUoKGV8MCkhPShmfDApKX19d2hpbGUoMCk7aT1hO3JldHVybiBmfDB9ZnVuY3Rpb24gZWwoYSxkLGUsZil7YT1hfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MDthPWk7YTpkb3tpZigoZXwwKT09KGZ8MCkpe2Y9ZX1lbHNle2Rve2c9Y1tlPj4yXXwwO2lmKCEoZz4+PjA8MTI4KSl7Zj1lO2JyZWFrIGF9aWYoKGJbKGNbKE5hKCl8MCk+PjJdfDApKyhnPDwxKT4+MV0mZCk8PDE2Pj4xNj09MCl7Zj1lO2JyZWFrIGF9ZT1lKzR8MH13aGlsZSgoZXwwKSE9KGZ8MCkpfX13aGlsZSgwKTtpPWE7cmV0dXJuIGZ8MH1mdW5jdGlvbiBmbChhLGIpe2E9YXwwO2I9YnwwO2E9aTtpZighKGI+Pj4wPDEyOCkpe2k9YTtyZXR1cm4gYnwwfWI9Y1soY1soWmEoKXwwKT4+Ml18MCkrKGI8PDIpPj4yXXwwO2k9YTtyZXR1cm4gYnwwfWZ1bmN0aW9uIGdsKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wO2E9aTtpZigoYnwwKT09KGR8MCkpe2U9YjtpPWE7cmV0dXJuIGV8MH1kb3tlPWNbYj4+Ml18MDtpZihlPj4+MDwxMjgpe2U9Y1soY1soWmEoKXwwKT4+Ml18MCkrKGU8PDIpPj4yXXwwfWNbYj4+Ml09ZTtiPWIrNHwwfXdoaWxlKChifDApIT0oZHwwKSk7aT1hO3JldHVybiBkfDB9ZnVuY3Rpb24gaGwoYSxiKXthPWF8MDtiPWJ8MDthPWk7aWYoIShiPj4+MDwxMjgpKXtpPWE7cmV0dXJuIGJ8MH1iPWNbKGNbKEhhKCl8MCk+PjJdfDApKyhiPDwyKT4+Ml18MDtpPWE7cmV0dXJuIGJ8MH1mdW5jdGlvbiBpbChhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MDthPWk7aWYoKGJ8MCk9PShkfDApKXtlPWI7aT1hO3JldHVybiBlfDB9ZG97ZT1jW2I+PjJdfDA7aWYoZT4+PjA8MTI4KXtlPWNbKGNbKEhhKCl8MCk+PjJdfDApKyhlPDwyKT4+Ml18MH1jW2I+PjJdPWU7Yj1iKzR8MH13aGlsZSgoYnwwKSE9KGR8MCkpO2k9YTtyZXR1cm4gZHwwfWZ1bmN0aW9uIGpsKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGI8PDI0Pj4yNHwwfWZ1bmN0aW9uIGtsKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2I9aTtpZigoZHwwKT09KGV8MCkpe2k9YjtyZXR1cm4gZHwwfXdoaWxlKDEpe2NbZj4+Ml09YVtkPj4wXXwwO2Q9ZCsxfDA7aWYoKGR8MCk9PShlfDApKXticmVha31lbHNle2Y9Zis0fDB9fWk9YjtyZXR1cm4gZXwwfWZ1bmN0aW9uIGxsKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4oYj4+PjA8MTI4P2ImMjU1OmMpfDB9ZnVuY3Rpb24gbWwoYixkLGUsZixnKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wLGo9MCxrPTA7Yj1pO2lmKChkfDApPT0oZXwwKSl7aj1kO2k9YjtyZXR1cm4ganwwfWg9KChlKyAtNCsoMC1kKXwwKT4+PjIpKzF8MDtqPWQ7d2hpbGUoMSl7az1jW2o+PjJdfDA7YVtnPj4wXT1rPj4+MDwxMjg/ayYyNTU6ZjtqPWorNHwwO2lmKChqfDApPT0oZXwwKSl7YnJlYWt9ZWxzZXtnPWcrMXwwfX1rPWQrKGg8PDIpfDA7aT1iO3JldHVybiBrfDB9ZnVuY3Rpb24gbmwoYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2NbYj4+Ml09MTM0NzI7ZT1jW2IrOD4+Ml18MDtpZigoZXwwKSE9MCl7aWYoKGFbYisxMj4+MF18MCkhPTApe3ZuKGUpfWlmKChifDApPT0wKXtpPWQ7cmV0dXJufX12bihiKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIG9sKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNDcyO2U9Y1tiKzg+PjJdfDA7aWYoKGV8MCkhPTA/KGFbYisxMj4+MF18MCkhPTA6MCl7dm4oZSl9aT1kO3JldHVybn1mdW5jdGlvbiBwbChhLGIpe2E9YXwwO2I9YnwwO2E9aTtpZighKGI8PDI0Pj4yND4tMSkpe2k9YTtyZXR1cm4gYnwwfWI9Y1soY1soWmEoKXwwKT4+Ml18MCkrKChiJjI1NSk8PDIpPj4yXSYyNTU7aT1hO3JldHVybiBifDB9ZnVuY3Rpb24gcWwoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTA7Yj1pO2lmKChkfDApPT0oZXwwKSl7Zj1kO2k9YjtyZXR1cm4gZnwwfWRve2Y9YVtkPj4wXXwwO2lmKGY8PDI0Pj4yND4tMSl7Zj1jWyhjWyhaYSgpfDApPj4yXXwwKSsoZjw8MjQ+PjI0PDwyKT4+Ml0mMjU1fWFbZD4+MF09ZjtkPWQrMXwwfXdoaWxlKChkfDApIT0oZXwwKSk7aT1iO3JldHVybiBlfDB9ZnVuY3Rpb24gcmwoYSxiKXthPWF8MDtiPWJ8MDthPWk7aWYoIShiPDwyND4+MjQ+LTEpKXtpPWE7cmV0dXJuIGJ8MH1iPWNbKGNbKEhhKCl8MCk+PjJdfDApKyhiPDwyND4+MjQ8PDIpPj4yXSYyNTU7aT1hO3JldHVybiBifDB9ZnVuY3Rpb24gc2woYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTA7Yj1pO2lmKChkfDApPT0oZXwwKSl7Zj1kO2k9YjtyZXR1cm4gZnwwfWRve2Y9YVtkPj4wXXwwO2lmKGY8PDI0Pj4yND4tMSl7Zj1jWyhjWyhIYSgpfDApPj4yXXwwKSsoZjw8MjQ+PjI0PDwyKT4+Ml0mMjU1fWFbZD4+MF09ZjtkPWQrMXwwfXdoaWxlKChkfDApIT0oZXwwKSk7aT1iO3JldHVybiBlfDB9ZnVuY3Rpb24gdGwoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4gYnwwfWZ1bmN0aW9uIHVsKGIsYyxkLGUpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2I9aTtpZigoY3wwKT09KGR8MCkpe2Q9Y31lbHNle3doaWxlKDEpe2FbZT4+MF09YVtjPj4wXXwwO2M9YysxfDA7aWYoKGN8MCk9PShkfDApKXticmVha31lbHNle2U9ZSsxfDB9fX1pPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB2bChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuKGI8PDI0Pj4yND4tMT9iOmMpfDB9ZnVuY3Rpb24gd2woYixjLGQsZSxmKXtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wO2I9aTtpZigoY3wwKT09KGR8MCkpe2k9YjtyZXR1cm4gY3wwfXdoaWxlKDEpe2c9YVtjPj4wXXwwO2FbZj4+MF09Zzw8MjQ+PjI0Pi0xP2c6ZTtjPWMrMXwwO2lmKChjfDApPT0oZHwwKSl7YnJlYWt9ZWxzZXtmPWYrMXwwfX1pPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB4bChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiB5bChhLGIsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2NbZj4+Ml09ZDtjW2k+PjJdPWc7cmV0dXJuIDN9ZnVuY3Rpb24gemwoYSxiLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtjW2Y+PjJdPWQ7Y1tpPj4yXT1nO3JldHVybiAzfWZ1bmN0aW9uIEFsKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Y1tmPj4yXT1kO3JldHVybiAzfWZ1bmN0aW9uIEJsKGEpe2E9YXwwO3JldHVybiAxfWZ1bmN0aW9uIENsKGEpe2E9YXwwO3JldHVybiAxfWZ1bmN0aW9uIERsKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Yj1kLWN8MDtyZXR1cm4oYj4+PjA8ZT4+PjA/YjplKXwwfWZ1bmN0aW9uIEVsKGEpe2E9YXwwO3JldHVybiAxfWZ1bmN0aW9uIEZsKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1NrKGEpO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEdsKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTA7ZD1pO2k9aSsyNzJ8MDtsPWQrMjY0fDA7bj1kKzh8MDtvPWQ7YTpkb3tpZigoZXwwKSE9KGZ8MCkpe3E9ZTt3aGlsZSgxKXtpZigoY1txPj4yXXwwKT09MCl7YnJlYWt9cT1xKzR8MDtpZigocXwwKT09KGZ8MCkpe3E9ZjticmVha319Y1trPj4yXT1oO2NbZz4+Ml09ZTtpZigoaHwwKSE9KGp8MCkpe3A9ajtiPWIrOHwwO3doaWxlKDEpe3c9cS1lPj4yO3M9aWIoY1tiPj4yXXwwKXwwO3k9Y1tnPj4yXXwwO3I9KGh8MCkhPTA7dj1yP3AtaHwwOjI1Njt1PXI/aDpuO2I6ZG97aWYoKHl8MCk9PTB8KHZ8MCk9PTApe3Q9MH1lbHNle3Q9MDtkb3t4PXc+Pj4wPj12Pj4+MDtpZighKHh8dz4+PjA+MzIpKXticmVhayBifXg9eD92Onc7dz13LXh8MDtjOmRve2lmKCh1fDApPT0wKXtBPWNbeT4+Ml18MDtpZigoQXwwKT09MCl7ej0wfWVsc2V7ej0wO3g9eTt3aGlsZSgxKXtpZihBPj4+MD4xMjcpe0E9V20obCxBKXwwO2lmKChBfDApPT0tMSl7dj0wO3Q9LTE7YnJlYWsgYn19ZWxzZXtBPTF9ej1BK3p8MDt4PXgrNHwwO0E9Y1t4Pj4yXXwwO2lmKChBfDApPT0wKXttPTMyO2JyZWFrfX19fWVsc2V7ZDpkb3tpZih4Pj4+MD4zKXt6PXU7QT14O3doaWxlKDEpe0I9Y1t5Pj4yXXwwO2lmKChCfDApPT0wKXttPTIyO2JyZWFrIGR9aWYoQj4+PjA+MTI3KXtCPVdtKHosQil8MDtpZigoQnwwKT09LTEpe3Y9MDt0PS0xO2JyZWFrIGJ9ej16K0J8MDtBPUEtQnwwfWVsc2V7YVt6Pj4wXT1CO3o9eisxfDA7QT1BKyAtMXwwfXk9eSs0fDA7aWYoIShBPj4+MD4zKSl7bT0xNjticmVha319fWVsc2V7ej11O0E9eDttPTE2fX13aGlsZSgwKTtpZigobXwwKT09MTYpe209MDtpZigoQXwwKT09MCl7QT0wfWVsc2V7bT0yMn19ZTpkb3tpZigobXwwKT09MjIpe3doaWxlKDEpe209MDtCPWNbeT4+Ml18MDtpZigoQnwwKT09MCl7bT0zMDticmVha31pZihCPj4+MD4xMjcpe0I9V20obCxCKXwwO2lmKChCfDApPT0tMSl7dj0wO3Q9LTE7YnJlYWsgYn1pZihCPj4+MD5BPj4+MCl7bT0yNjticmVha31XbSh6LGNbeT4+Ml18MCl8MDt6PXorQnwwO0E9QS1CfDB9ZWxzZXthW3o+PjBdPUI7ej16KzF8MDtBPUErIC0xfDB9aWYoKEF8MCk9PTApe0E9MDticmVhayBlfWVsc2V7eT15KzR8MDttPTIyfX1pZigobXwwKT09MjYpe3o9eC1BfDA7bT0zMjticmVhayBjfWVsc2UgaWYoKG18MCk9PTMwKXthW3o+PjBdPTA7YnJlYWt9fX13aGlsZSgwKTt6PXgtQXwwO3k9MDttPTMyfX13aGlsZSgwKTtpZigobXwwKT09MzIpe209MDtpZigoenwwKT09LTEpe3Y9MDt0PS0xO2JyZWFrIGJ9fWlmKCh1fDApPT0obnwwKSl7dT1ufWVsc2V7dj12LXp8MDt1PXUrenwwfXQ9eit0fDB9d2hpbGUoISgoeXwwKT09MHwodnwwKT09MCkpfX13aGlsZSgwKTtmOmRve2lmKCh5fDApIT0wPyEoKHZ8MCk9PTB8KHd8MCk9PTApOjApe3doaWxlKDEpe3g9V20odSxjW3k+PjJdfDApfDA7aWYoKHgrMXwwKT4+PjA8Mil7YnJlYWt9eT15KzR8MDt3PXcrIC0xfDA7dD10KzF8MDtpZigodnwwKT09KHh8MCl8KHd8MCk9PTApe2JyZWFrIGZ9ZWxzZXt2PXYteHwwO3U9dSt4fDB9fUI9KHh8MCk9PTA7dD1CP3Q6LTE7eT1CPzA6eX19d2hpbGUoMCk7aWYocil7Y1tnPj4yXT15fWlmKChzfDApIT0wKXtpYihzfDApfDB9aWYoKHR8MCk9PTApe2c9MTttPTY3O2JyZWFrfWVsc2UgaWYoKHR8MCk9PS0xKXttPTQ2O2JyZWFrfWg9KGNbaz4+Ml18MCkrdHwwO2Nbaz4+Ml09aDtpZigoaHwwKT09KGp8MCkpe209NjU7YnJlYWt9aWYoKHF8MCk9PShmfDApKXtlPWNbZz4+Ml18MDtxPWZ9ZWxzZXtlPWliKGNbYj4+Ml18MCl8MDthW28+PjBdPTA7aWYoKGV8MCkhPTApe2liKGV8MCl8MH1oPWNbaz4+Ml18MDtpZigoaHwwKT09KGp8MCkpe2c9MTttPTY3O2JyZWFrfWVsc2V7ZT0wO3E9MDtyPW99d2hpbGUoMSl7Y1trPj4yXT1oKzE7YVtoPj4wXT1lO2lmKChxfDApPT0wKXticmVha31CPXIrMXwwO2g9Y1trPj4yXXwwO2U9YVtCPj4wXXwwO3E9cSsgLTF8MDtyPUJ9ZT0oY1tnPj4yXXwwKSs0fDA7Y1tnPj4yXT1lO2c6ZG97aWYoKGV8MCk9PShmfDApKXtxPWZ9ZWxzZXtxPWU7d2hpbGUoMSl7aWYoKGNbcT4+Ml18MCk9PTApe2JyZWFrIGd9cT1xKzR8MDtpZigocXwwKT09KGZ8MCkpe3E9ZjticmVha319fX13aGlsZSgwKTtoPWNbaz4+Ml18MH1pZigoZXwwKT09KGZ8MCl8KGh8MCk9PShqfDApKXticmVhayBhfX1pZigobXwwKT09NDYpe2Nbaz4+Ml09aDtoOmRve2lmKChlfDApIT0oY1tnPj4yXXwwKSl7ZG97aj1jW2U+PjJdfDA7Zj1pYihjW2I+PjJdfDApfDA7aj1XbShoLGopfDA7aWYoKGZ8MCkhPTApe2liKGZ8MCl8MH1pZigoanwwKT09LTEpe2JyZWFrIGh9aD0oY1trPj4yXXwwKStqfDA7Y1trPj4yXT1oO2U9ZSs0fDB9d2hpbGUoKGV8MCkhPShjW2c+PjJdfDApKX19d2hpbGUoMCk7Y1tnPj4yXT1lO0I9MjtpPWQ7cmV0dXJuIEJ8MH1lbHNlIGlmKChtfDApPT02NSl7ZT1jW2c+PjJdfDA7YnJlYWt9ZWxzZSBpZigobXwwKT09Njcpe2k9ZDtyZXR1cm4gZ3wwfX19ZWxzZXtjW2s+PjJdPWg7Y1tnPj4yXT1lfX13aGlsZSgwKTtCPShlfDApIT0oZnwwKSYxO2k9ZDtyZXR1cm4gQnwwfWZ1bmN0aW9uIEhsKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MDtsPWk7aT1pKzEwNDB8MDtuPWwrMTZ8MDtvPWwrOHwwO209bDthOmRve2lmKChlfDApIT0oZnwwKSl7cj1lO3doaWxlKDEpe2lmKChhW3I+PjBdfDApPT0wKXticmVha31yPXIrMXwwO2lmKChyfDApPT0oZnwwKSl7cj1mO2JyZWFrfX1jW2s+PjJdPWg7Y1tnPj4yXT1lO2lmKChofDApIT0oanwwKSl7cD1qO2I9Yis4fDA7d2hpbGUoMSl7dD1kO3U9Y1t0KzQ+PjJdfDA7cT1tO2NbcT4+Ml09Y1t0Pj4yXTtjW3ErND4+Ml09dTtxPXI7dT1xLWV8MDt0PWliKGNbYj4+Ml18MCl8MDt5PWNbZz4+Ml18MDtjW28+PjJdPXk7cz0oaHwwKSE9MDt3PXM/cC1oPj4yOjI1Njt4PXM/aDpuO2I6ZG97aWYoKHl8MCk9PTB8KHd8MCk9PTApe3Y9MH1lbHNle3Y9MDt3aGlsZSgxKXt6PXU+Pj4yO0E9ej4+PjA+PXc+Pj4wO2lmKCEoQXx1Pj4+MD4xMzEpKXticmVhayBifXk9QT93Ono7dT11LXl8MDt5PVZtKHgsbyx5LGQpfDA7aWYoKHl8MCk9PS0xKXticmVha31pZigoeHwwKT09KG58MCkpe3g9bn1lbHNle3c9dy15fDA7eD14Kyh5PDwyKXwwfXY9eSt2fDA7eT1jW28+PjJdfDA7aWYoKHl8MCk9PTB8KHd8MCk9PTApe2JyZWFrIGJ9fXc9MDt5PWNbbz4+Ml18MDt2PS0xfX13aGlsZSgwKTtjOmRve2lmKCh5fDApIT0wKXtpZighKCh3fDApPT0wfCh1fDApPT0wKSl7d2hpbGUoMSl7ej1VbSh4LHksdSxkKXwwO2lmKCh6KzJ8MCk+Pj4wPDMpe2JyZWFrfXk9eSt6fDA7Y1tvPj4yXT15O3c9dysgLTF8MDt2PXYrMXwwO2lmKCh3fDApPT0wfCh1fDApPT0oenwwKSl7YnJlYWsgY31lbHNle3U9dS16fDA7eD14KzR8MH19aWYoKHp8MCk9PS0xKXt2PS0xO2JyZWFrfWVsc2UgaWYoKHp8MCk9PTApe2Nbbz4+Ml09MDt5PTA7YnJlYWt9ZWxzZXtjW2Q+PjJdPTA7YnJlYWt9fX1lbHNle3k9MH19d2hpbGUoMCk7aWYocyl7Y1tnPj4yXT15fWlmKCh0fDApIT0wKXtpYih0fDApfDB9aWYoKHZ8MCk9PTApe2Y9MjtkPTQ4O2JyZWFrfWVsc2UgaWYoKHZ8MCk9PS0xKXtkPTI2O2JyZWFrfWg9KGNbaz4+Ml18MCkrKHY8PDIpfDA7Y1trPj4yXT1oO2lmKChofDApPT0oanwwKSl7ZD00NjticmVha31lPWNbZz4+Ml18MDtpZigocnwwKT09KGZ8MCkpe3I9Zn1lbHNle3E9aWIoY1tiPj4yXXwwKXwwO2U9VW0oaCxlLDEsZCl8MDtpZigocXwwKSE9MCl7aWIocXwwKXwwfWlmKChlfDApIT0wKXtmPTI7ZD00ODticmVha31jW2s+PjJdPShjW2s+PjJdfDApKzQ7ZT0oY1tnPj4yXXwwKSsxfDA7Y1tnPj4yXT1lO2Q6ZG97aWYoKGV8MCk9PShmfDApKXtyPWZ9ZWxzZXtyPWU7d2hpbGUoMSl7aWYoKGFbcj4+MF18MCk9PTApe2JyZWFrIGR9cj1yKzF8MDtpZigocnwwKT09KGZ8MCkpe3I9ZjticmVha319fX13aGlsZSgwKTtoPWNbaz4+Ml18MH1pZigoZXwwKT09KGZ8MCl8KGh8MCk9PShqfDApKXticmVhayBhfX1pZigoZHwwKT09MjYpe2Nbaz4+Ml09aDtlOmRve2lmKChlfDApIT0oY1tnPj4yXXwwKSl7d2hpbGUoMSl7ZD1pYihjW2I+PjJdfDApfDA7bj1VbShoLGUscS1lfDAsbSl8MDtpZigoZHwwKSE9MCl7aWIoZHwwKXwwfWlmKChufDApPT0tMSl7ZD0zMTticmVha31lbHNlIGlmKChufDApPT0tMil7ZD0zMjticmVha31lbHNlIGlmKChufDApPT0wKXtlPWUrMXwwfWVsc2V7ZT1lK258MH1oPShjW2s+PjJdfDApKzR8MDtjW2s+PjJdPWg7aWYoKGV8MCk9PShjW2c+PjJdfDApKXticmVhayBlfX1pZigoZHwwKT09MzEpe2NbZz4+Ml09ZTtBPTI7aT1sO3JldHVybiBBfDB9ZWxzZSBpZigoZHwwKT09MzIpe2NbZz4+Ml09ZTtBPTE7aT1sO3JldHVybiBBfDB9fX13aGlsZSgwKTtjW2c+PjJdPWU7QT0oZXwwKSE9KGZ8MCkmMTtpPWw7cmV0dXJuIEF8MH1lbHNlIGlmKChkfDApPT00Nil7ZT1jW2c+PjJdfDA7YnJlYWt9ZWxzZSBpZigoZHwwKT09NDgpe2k9bDtyZXR1cm4gZnwwfX19ZWxzZXtjW2s+PjJdPWg7Y1tnPj4yXT1lfX13aGlsZSgwKTtBPShlfDApIT0oZnwwKSYxO2k9bDtyZXR1cm4gQXwwfWZ1bmN0aW9uIElsKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Yj1pO2NbZj4+Ml09ZDthPWliKGNbYSs4Pj4yXXwwKXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJuIDB9aWIoYXwwKXwwO2k9YjtyZXR1cm4gMH1mdW5jdGlvbiBKbChhKXthPWF8MDt2YXIgYj0wLGQ9MDtiPWk7YT1hKzh8MDtkPWliKGNbYT4+Ml18MCl8MDtpZigoZHwwKSE9MCl7aWIoZHwwKXwwfWE9Y1thPj4yXXwwO2lmKChhfDApIT0wKXthPWliKGF8MCl8MDtpZigoYXwwKT09MCl7YT0wfWVsc2V7aWIoYXwwKXwwO2E9MH19ZWxzZXthPTF9aT1iO3JldHVybiBhfDB9ZnVuY3Rpb24gS2woYSl7YT1hfDA7cmV0dXJuIDB9ZnVuY3Rpb24gTGwoYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7Zz1pO2lmKChmfDApPT0wfChkfDApPT0oZXwwKSl7bT0wO2k9ZztyZXR1cm4gbXwwfWg9ZTthPWErOHwwO2I9KGJ8MCkhPTA/YjoyMTI4MDtrPTA7aj0wO3doaWxlKDEpe209aWIoY1thPj4yXXwwKXwwO2w9VW0oMCxkLGgtZHwwLGIpfDA7aWYoKG18MCkhPTApe2liKG18MCl8MH1pZigobHwwKT09MCl7ZD1kKzF8MDtsPTF9ZWxzZSBpZigobHwwKT09LTJ8KGx8MCk9PS0xKXtmPTk7YnJlYWt9ZWxzZXtkPWQrbHwwfWs9bCtrfDA7aj1qKzF8MDtpZihqPj4+MD49Zj4+PjB8KGR8MCk9PShlfDApKXtmPTk7YnJlYWt9fWlmKChmfDApPT05KXtpPWc7cmV0dXJuIGt8MH1yZXR1cm4gMH1mdW5jdGlvbiBNbChhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSs4Pj4yXXwwO2lmKChhfDApIT0wKXthPWliKGF8MCl8MDtpZigoYXwwKT09MCl7YT00fWVsc2V7aWIoYXwwKXwwO2E9NH19ZWxzZXthPTF9aT1iO3JldHVybiBhfDB9ZnVuY3Rpb24gTmwoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gT2woZCxmLGcsaCxqLGssbCxtKXtkPWR8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDt2YXIgbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7Zj1pO2Q9aDthOmRve2lmKGc+Pj4wPGg+Pj4wKXtvPWc7bj1rO3doaWxlKDEpe3E9YltvPj4xXXwwO3A9cSY2NTUzNTtkb3tpZigocSY2NTUzNSk8MTI4KXtpZigobC1ufDApPDEpe2g9MTticmVhayBhfWFbbj4+MF09cTtuPW4rMXwwfWVsc2V7aWYoKHEmNjU1MzUpPDIwNDgpe2lmKChsLW58MCk8Mil7aD0xO2JyZWFrIGF9YVtuPj4wXT1wPj4+NnwxOTI7YVtuKzE+PjBdPXAmNjN8MTI4O249bisyfDA7YnJlYWt9aWYoKHEmNjU1MzUpPDU1Mjk2KXtpZigobC1ufDApPDMpe2g9MTticmVhayBhfWFbbj4+MF09cD4+PjEyfDIyNDthW24rMT4+MF09cD4+PjYmNjN8MTI4O2FbbisyPj4wXT1wJjYzfDEyODtuPW4rM3wwO2JyZWFrfWlmKCEoKHEmNjU1MzUpPDU2MzIwKSl7aWYoKHEmNjU1MzUpPDU3MzQ0KXtoPTI7YnJlYWsgYX1pZigobC1ufDApPDMpe2g9MTticmVhayBhfWFbbj4+MF09cD4+PjEyfDIyNDthW24rMT4+MF09cD4+PjYmNjN8MTI4O2FbbisyPj4wXT1wJjYzfDEyODtuPW4rM3wwO2JyZWFrfWlmKChkLW98MCk8NCl7aD0xO2JyZWFrIGF9cT1vKzJ8MDtyPWVbcT4+MV18MDtpZigociY2NDUxMnwwKSE9NTYzMjApe2g9MjticmVhayBhfWlmKChsLW58MCk8NCl7aD0xO2JyZWFrIGF9cz1wJjk2MDtpZigoKHM8PDEwKSs2NTUzNnwwKT4+PjA+MTExNDExMSl7aD0yO2JyZWFrIGF9bz0ocz4+PjYpKzF8MDthW24+PjBdPW8+Pj4yfDI0MDthW24rMT4+MF09cD4+PjImMTV8bzw8NCY0OHwxMjg7YVtuKzI+PjBdPXA8PDQmNDh8cj4+PjYmMTV8MTI4O2FbbiszPj4wXT1yJjYzfDEyODtvPXE7bj1uKzR8MH19d2hpbGUoMCk7bz1vKzJ8MDtpZighKG8+Pj4wPGg+Pj4wKSl7aD0wO2JyZWFrfX19ZWxzZXtoPTA7bz1nO249a319d2hpbGUoMCk7Y1tqPj4yXT1nKyhvLWc+PjE8PDEpO2NbbT4+Ml09aysobi1rKTtpPWY7cmV0dXJuIGh8MH1mdW5jdGlvbiBQbChlLGYsZyxoLGosayxsLG0pe2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO2w9bHwwO209bXwwO3ZhciBuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2Y9aTthOmRve2lmKGc+Pj4wPGg+Pj4wKXtvPWg7cD1sO3E9ZztlPWs7d2hpbGUoMSl7aWYoIShlPj4+MDxsPj4+MCkpe249MzE7YnJlYWsgYX1zPWFbcT4+MF18MDtyPXMmMjU1O2Rve2lmKHM8PDI0Pj4yND4tMSl7YltlPj4xXT1zJjI1NTtxPXErMXwwfWVsc2V7aWYoKHMmMjU1KTwxOTQpe2g9MjticmVhayBhfWlmKChzJjI1NSk8MjI0KXtpZigoby1xfDApPDIpe2g9MTticmVhayBhfXM9ZFtxKzE+PjBdfDA7aWYoKHMmMTkyfDApIT0xMjgpe2g9MjticmVhayBhfWJbZT4+MV09cyY2M3xyPDw2JjE5ODQ7cT1xKzJ8MDticmVha31pZigocyYyNTUpPDI0MCl7aWYoKG8tcXwwKTwzKXtoPTE7YnJlYWsgYX1zPWFbcSsxPj4wXXwwO3Q9YVtxKzI+PjBdfDA7aWYoKHJ8MCk9PTIzNyl7aWYoISgocyYtMzIpPDwyND4+MjQ9PS0xMjgpKXtoPTI7YnJlYWsgYX19ZWxzZSBpZigocnwwKT09MjI0KXtpZighKChzJi0zMik8PDI0Pj4yND09LTk2KSl7aD0yO2JyZWFrIGF9fWVsc2V7aWYoISgocyYtNjQpPDwyND4+MjQ9PS0xMjgpKXtoPTI7YnJlYWsgYX19dD10JjI1NTtpZigodCYxOTJ8MCkhPTEyOCl7aD0yO2JyZWFrIGF9YltlPj4xXT0ocyYyNTUpPDw2JjQwMzJ8cjw8MTJ8dCY2MztxPXErM3wwO2JyZWFrfWlmKCEoKHMmMjU1KTwyNDUpKXtoPTI7YnJlYWsgYX1pZigoby1xfDApPDQpe2g9MTticmVhayBhfXM9YVtxKzE+PjBdfDA7dD1hW3ErMj4+MF18MDt1PWFbcSszPj4wXXwwO2lmKChyfDApPT0yNDApe2lmKCEoKHMrMTEyPDwyND4+MjQmMjU1KTw0OCkpe2g9MjticmVhayBhfX1lbHNlIGlmKChyfDApPT0yNDQpe2lmKCEoKHMmLTE2KTw8MjQ+PjI0PT0tMTI4KSl7aD0yO2JyZWFrIGF9fWVsc2V7aWYoISgocyYtNjQpPDwyND4+MjQ9PS0xMjgpKXtoPTI7YnJlYWsgYX19dD10JjI1NTtpZigodCYxOTJ8MCkhPTEyOCl7aD0yO2JyZWFrIGF9dT11JjI1NTtpZigodSYxOTJ8MCkhPTEyOCl7aD0yO2JyZWFrIGF9aWYoKHAtZXwwKTw0KXtoPTE7YnJlYWsgYX1yPXImNztzPXMmMjU1O2lmKChzPDwxMiYxOTY2MDh8cjw8MTgpPj4+MD4xMTE0MTExKXtoPTI7YnJlYWsgYX1iW2U+PjFdPXM8PDImNjB8dD4+PjQmM3woKHM+Pj40JjN8cjw8Mik8PDYpKzE2MzIwfDU1Mjk2O2U9ZSsyfDA7YltlPj4xXT11JjYzfHQ8PDYmOTYwfDU2MzIwO3E9cSs0fDB9fXdoaWxlKDApO2U9ZSsyfDA7aWYoIShxPj4+MDxoPj4+MCkpe249MzE7YnJlYWt9fX1lbHNle3E9ZztlPWs7bj0zMX19d2hpbGUoMCk7aWYoKG58MCk9PTMxKXtoPXE+Pj4wPGg+Pj4wJjF9Y1tqPj4yXT1nKyhxLWcpO2NbbT4+Ml09aysoZS1rPj4xPDwxKTtpPWY7cmV0dXJuIGh8MH1mdW5jdGlvbiBRbChhLGIsZCxlLGYpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2NbZj4+Ml09ZDtyZXR1cm4gM31mdW5jdGlvbiBSbChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBTbChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBUbChiLGMsZCxlLGYpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Yz1pO2E6ZG97aWYoZD4+PjA8ZT4+PjAmKGZ8MCkhPTApe2I9ZTtoPWQ7Zz0wO2I6d2hpbGUoMSl7az1hW2g+PjBdfDA7aj1rJjI1NTtkb3tpZihrPDwyND4+MjQ+LTEpe2g9aCsxfDB9ZWxzZXtpZigoayYyNTUpPDE5NCl7YnJlYWsgYX1pZigoayYyNTUpPDIyNCl7aWYoKGItaHwwKTwyKXticmVhayBhfWlmKCEoKGFbaCsxPj4wXSYtNjQpPDwyND4+MjQ9PS0xMjgpKXticmVhayBhfWg9aCsyfDA7YnJlYWt9aWYoKGsmMjU1KTwyNDApe2s9aDtpZigoYi1rfDApPDMpe2JyZWFrIGF9bT1hW2grMT4+MF18MDtsPWFbaCsyPj4wXXwwO2lmKChqfDApPT0yMjQpe2lmKCEoKG0mLTMyKTw8MjQ+PjI0PT0tOTYpKXtlPTE0O2JyZWFrIGJ9fWVsc2UgaWYoKGp8MCk9PTIzNyl7aWYoISgobSYtMzIpPDwyND4+MjQ9PS0xMjgpKXtlPTE2O2JyZWFrIGJ9fWVsc2V7aWYoISgobSYtNjQpPDwyND4+MjQ9PS0xMjgpKXtlPTE4O2JyZWFrIGJ9fWlmKCEoKGwmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7YnJlYWsgYX1oPWgrM3wwO2JyZWFrfWlmKCEoKGsmMjU1KTwyNDUpKXticmVhayBhfWs9aDtpZigoYi1rfDApPDQpe2JyZWFrIGF9aWYoKGYtZ3wwKT4+PjA8Mil7YnJlYWsgYX1uPWFbaCsxPj4wXXwwO2w9YVtoKzI+PjBdfDA7bT1hW2grMz4+MF18MDtpZigoanwwKT09MjQ0KXtpZighKChuJi0xNik8PDI0Pj4yND09LTEyOCkpe2U9Mjg7YnJlYWsgYn19ZWxzZSBpZigoanwwKT09MjQwKXtpZighKChuKzExMjw8MjQ+PjI0JjI1NSk8NDgpKXtlPTI2O2JyZWFrIGJ9fWVsc2V7aWYoISgobiYtNjQpPDwyND4+MjQ9PS0xMjgpKXtlPTMwO2JyZWFrIGJ9fWlmKCEoKGwmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7YnJlYWsgYX1pZighKChtJi02NCk8PDI0Pj4yND09LTEyOCkpe2JyZWFrIGF9aWYoKChuJjI1NSk8PDEyJjE5NjYwOHxqPDwxOCYxODM1MDA4KT4+PjA+MTExNDExMSl7YnJlYWsgYX1oPWgrNHwwO2c9ZysxfDB9fXdoaWxlKDApO2c9ZysxfDA7aWYoIShoPj4+MDxlPj4+MCZnPj4+MDxmPj4+MCkpe2JyZWFrIGF9fWlmKChlfDApPT0xNCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0xNil7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0xOCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0yNil7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0yOCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0zMCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH19ZWxzZXtoPWR9fXdoaWxlKDApO249aC1kfDA7aT1jO3JldHVybiBufDB9ZnVuY3Rpb24gVWwoYSl7YT1hfDA7cmV0dXJuIDR9ZnVuY3Rpb24gVmwoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gV2woYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTA7ZD1pO2E6ZG97aWYoZT4+PjA8Zj4+PjApe2I9ZTtsPWg7d2hpbGUoMSl7bT1jW2I+PjJdfDA7aWYoKG0mLTIwNDh8MCk9PTU1Mjk2fG0+Pj4wPjExMTQxMTEpe2Y9MjticmVhayBhfWRve2lmKCEobT4+PjA8MTI4KSl7aWYobT4+PjA8MjA0OCl7aWYoKGotbHwwKTwyKXtmPTE7YnJlYWsgYX1hW2w+PjBdPW0+Pj42fDE5MjthW2wrMT4+MF09bSY2M3wxMjg7bD1sKzJ8MDticmVha31uPWotbHwwO2lmKG0+Pj4wPDY1NTM2KXtpZigobnwwKTwzKXtmPTE7YnJlYWsgYX1hW2w+PjBdPW0+Pj4xMnwyMjQ7YVtsKzE+PjBdPW0+Pj42JjYzfDEyODthW2wrMj4+MF09bSY2M3wxMjg7bD1sKzN8MDticmVha31lbHNle2lmKChufDApPDQpe2Y9MTticmVhayBhfWFbbD4+MF09bT4+PjE4fDI0MDthW2wrMT4+MF09bT4+PjEyJjYzfDEyODthW2wrMj4+MF09bT4+PjYmNjN8MTI4O2FbbCszPj4wXT1tJjYzfDEyODtsPWwrNHwwO2JyZWFrfX1lbHNle2lmKChqLWx8MCk8MSl7Zj0xO2JyZWFrIGF9YVtsPj4wXT1tO2w9bCsxfDB9fXdoaWxlKDApO2I9Yis0fDA7aWYoIShiPj4+MDxmPj4+MCkpe2Y9MDticmVha319fWVsc2V7Zj0wO2I9ZTtsPWh9fXdoaWxlKDApO2NbZz4+Ml09ZSsoYi1lPj4yPDwyKTtjW2s+PjJdPWgrKGwtaCk7aT1kO3JldHVybiBmfDB9ZnVuY3Rpb24gWGwoYixlLGYsZyxoLGosayxsKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2U9aTthOmRve2lmKGY+Pj4wPGc+Pj4wKXtvPWc7bj1mO2I9ajt3aGlsZSgxKXtpZighKGI+Pj4wPGs+Pj4wKSl7bT0zMDticmVhayBhfXE9YVtuPj4wXXwwO3A9cSYyNTU7ZG97aWYocTw8MjQ+PjI0Pi0xKXtjW2I+PjJdPXA7bj1uKzF8MH1lbHNle2lmKChxJjI1NSk8MTk0KXtnPTI7YnJlYWsgYX1pZigocSYyNTUpPDIyNCl7aWYoKG8tbnwwKTwyKXtnPTE7YnJlYWsgYX1xPWRbbisxPj4wXXwwO2lmKChxJjE5MnwwKSE9MTI4KXtnPTI7YnJlYWsgYX1jW2I+PjJdPXEmNjN8cDw8NiYxOTg0O249bisyfDA7YnJlYWt9aWYoKHEmMjU1KTwyNDApe2lmKChvLW58MCk8Myl7Zz0xO2JyZWFrIGF9cT1hW24rMT4+MF18MDtyPWFbbisyPj4wXXwwO2lmKChwfDApPT0yMjQpe2lmKCEoKHEmLTMyKTw8MjQ+PjI0PT0tOTYpKXtnPTI7YnJlYWsgYX19ZWxzZSBpZigocHwwKT09MjM3KXtpZighKChxJi0zMik8PDI0Pj4yND09LTEyOCkpe2c9MjticmVhayBhfX1lbHNle2lmKCEoKHEmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7Zz0yO2JyZWFrIGF9fXI9ciYyNTU7aWYoKHImMTkyfDApIT0xMjgpe2c9MjticmVhayBhfWNbYj4+Ml09KHEmMjU1KTw8NiY0MDMyfHA8PDEyJjYxNDQwfHImNjM7bj1uKzN8MDticmVha31pZighKChxJjI1NSk8MjQ1KSl7Zz0yO2JyZWFrIGF9aWYoKG8tbnwwKTw0KXtnPTE7YnJlYWsgYX1xPWFbbisxPj4wXXwwO3I9YVtuKzI+PjBdfDA7cz1hW24rMz4+MF18MDtpZigocHwwKT09MjQ0KXtpZighKChxJi0xNik8PDI0Pj4yND09LTEyOCkpe2c9MjticmVhayBhfX1lbHNlIGlmKChwfDApPT0yNDApe2lmKCEoKHErMTEyPDwyND4+MjQmMjU1KTw0OCkpe2c9MjticmVhayBhfX1lbHNle2lmKCEoKHEmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7Zz0yO2JyZWFrIGF9fXI9ciYyNTU7aWYoKHImMTkyfDApIT0xMjgpe2c9MjticmVhayBhfXM9cyYyNTU7aWYoKHMmMTkyfDApIT0xMjgpe2c9MjticmVhayBhfXA9KHEmMjU1KTw8MTImMjU4MDQ4fHA8PDE4JjE4MzUwMDh8cjw8NiY0MDMyfHMmNjM7aWYocD4+PjA+MTExNDExMSl7Zz0yO2JyZWFrIGF9Y1tiPj4yXT1wO249bis0fDB9fXdoaWxlKDApO2I9Yis0fDA7aWYoIShuPj4+MDxnPj4+MCkpe209MzA7YnJlYWt9fX1lbHNle249ZjtiPWo7bT0zMH19d2hpbGUoMCk7aWYoKG18MCk9PTMwKXtnPW4+Pj4wPGc+Pj4wJjF9Y1toPj4yXT1mKyhuLWYpO2NbbD4+Ml09aisoYi1qPj4yPDwyKTtpPWU7cmV0dXJuIGd8MH1mdW5jdGlvbiBZbChhLGIsZCxlLGYpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2NbZj4+Ml09ZDtyZXR1cm4gM31mdW5jdGlvbiBabChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBfbChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiAkbChiLGMsZCxlLGYpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Yz1pO2E6ZG97aWYoZD4+PjA8ZT4+PjAmKGZ8MCkhPTApe2c9ZTtqPWQ7Yj0xO2I6d2hpbGUoMSl7az1hW2o+PjBdfDA7aD1rJjI1NTtkb3tpZihrPDwyND4+MjQ+LTEpe2o9aisxfDB9ZWxzZXtpZigoayYyNTUpPDE5NCl7YnJlYWsgYX1pZigoayYyNTUpPDIyNCl7aWYoKGctanwwKTwyKXticmVhayBhfWlmKCEoKGFbaisxPj4wXSYtNjQpPDwyND4+MjQ9PS0xMjgpKXticmVhayBhfWo9aisyfDA7YnJlYWt9aWYoKGsmMjU1KTwyNDApe2s9ajtpZigoZy1rfDApPDMpe2JyZWFrIGF9bT1hW2orMT4+MF18MDtsPWFbaisyPj4wXXwwO2lmKChofDApPT0yMjQpe2lmKCEoKG0mLTMyKTw8MjQ+PjI0PT0tOTYpKXtlPTE0O2JyZWFrIGJ9fWVsc2UgaWYoKGh8MCk9PTIzNyl7aWYoISgobSYtMzIpPDwyND4+MjQ9PS0xMjgpKXtlPTE2O2JyZWFrIGJ9fWVsc2V7aWYoISgobSYtNjQpPDwyND4+MjQ9PS0xMjgpKXtlPTE4O2JyZWFrIGJ9fWlmKCEoKGwmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7YnJlYWsgYX1qPWorM3wwO2JyZWFrfWlmKCEoKGsmMjU1KTwyNDUpKXticmVhayBhfWs9ajtpZigoZy1rfDApPDQpe2JyZWFrIGF9bT1hW2orMT4+MF18MDtuPWFbaisyPj4wXXwwO2w9YVtqKzM+PjBdfDA7aWYoKGh8MCk9PTI0MCl7aWYoISgobSsxMTI8PDI0Pj4yNCYyNTUpPDQ4KSl7ZT0yNTticmVhayBifX1lbHNlIGlmKChofDApPT0yNDQpe2lmKCEoKG0mLTE2KTw8MjQ+PjI0PT0tMTI4KSl7ZT0yNzticmVhayBifX1lbHNle2lmKCEoKG0mLTY0KTw8MjQ+PjI0PT0tMTI4KSl7ZT0yOTticmVhayBifX1pZighKChuJi02NCk8PDI0Pj4yND09LTEyOCkpe2JyZWFrIGF9aWYoISgobCYtNjQpPDwyND4+MjQ9PS0xMjgpKXticmVhayBhfWlmKCgobSYyNTUpPDwxMiYxOTY2MDh8aDw8MTgmMTgzNTAwOCk+Pj4wPjExMTQxMTEpe2JyZWFrIGF9aj1qKzR8MH19d2hpbGUoMCk7aWYoIShqPj4+MDxlPj4+MCZiPj4+MDxmPj4+MCkpe2JyZWFrIGF9Yj1iKzF8MH1pZigoZXwwKT09MTQpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09MTYpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09MTgpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09MjUpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09Mjcpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09Mjkpe249ay1kfDA7aT1jO3JldHVybiBufDB9fWVsc2V7aj1kfX13aGlsZSgwKTtuPWotZHwwO2k9YztyZXR1cm4gbnwwfWZ1bmN0aW9uIGFtKGEpe2E9YXwwO3JldHVybiA0fWZ1bmN0aW9uIGJtKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIGNtKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIGRtKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNjI0O2lmKCEoKGFbYisxMj4+MF0mMSk9PTApKXtlPWNbYisyMD4+Ml18MDtpZigoZXwwKSE9MCl7dm4oZSl9aWYoKGJ8MCk9PTApe2k9ZDtyZXR1cm59fXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2NbYj4+Ml09MTM2MjQ7aWYoISgoYVtiKzEyPj4wXSYxKT09MCk/KGU9Y1tiKzIwPj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pPWQ7cmV0dXJufWZ1bmN0aW9uIGZtKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNjY0O2lmKCEoKGFbYisxNj4+MF0mMSk9PTApKXtlPWNbYisyND4+Ml18MDtpZigoZXwwKSE9MCl7dm4oZSl9aWYoKGJ8MCk9PTApe2k9ZDtyZXR1cm59fXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZ20oYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2NbYj4+Ml09MTM2NjQ7aWYoISgoYVtiKzE2Pj4wXSYxKT09MCk/KGU9Y1tiKzI0Pj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pPWQ7cmV0dXJufWZ1bmN0aW9uIGhtKGIpe2I9YnwwO3JldHVybiBhW2IrOD4+MF18MH1mdW5jdGlvbiBpbShhKXthPWF8MDtyZXR1cm4gY1thKzg+PjJdfDB9ZnVuY3Rpb24gam0oYil7Yj1ifDA7cmV0dXJuIGFbYis5Pj4wXXwwfWZ1bmN0aW9uIGttKGEpe2E9YXwwO3JldHVybiBjW2ErMTI+PjJdfDB9ZnVuY3Rpb24gbG0oYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTA7ZT1pO2c9ZCsxMnwwO2lmKChhW2c+PjBdJjEpPT0wKXtjW2IrMD4+Ml09Y1tnKzA+PjJdO2NbYis0Pj4yXT1jW2crND4+Ml07Y1tiKzg+PjJdPWNbZys4Pj4yXTtpPWU7cmV0dXJufWc9Y1tkKzIwPj4yXXwwO2Q9Y1tkKzE2Pj4yXXwwO2lmKGQ+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9ZG97aWYoZD4+PjA8MTEpe2FbYj4+MF09ZDw8MTtrPWIrMXwwfWVsc2V7aD1kKzE2Ji0xNjtqPShofDApPT0wPzE6aDt3aGlsZSgxKXtrPXVuKGopfDA7aWYoKGt8MCkhPTApe2Y9MTM7YnJlYWt9az1jWzU2NjZdfDA7Y1s1NjY2XT1rKzA7aWYoKGt8MCk9PTApe2JyZWFrfXNjW2smMzFdKCl9aWYoKGZ8MCk9PTEzKXtjW2IrOD4+Ml09aztjW2I+PjJdPWh8MTtjW2IrND4+Ml09ZDticmVha31rPVhhKDQpfDA7Y1trPj4yXT0yMjY4MDt3YihrfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7TG4oa3wwLGd8MCxkfDApfDA7YVtrK2Q+PjBdPTA7aT1lO3JldHVybn1mdW5jdGlvbiBtbShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MDtlPWk7Zz1kKzE2fDA7aWYoKGFbZz4+MF0mMSk9PTApe2NbYiswPj4yXT1jW2crMD4+Ml07Y1tiKzQ+PjJdPWNbZys0Pj4yXTtjW2IrOD4+Ml09Y1tnKzg+PjJdO2k9ZTtyZXR1cm59Zz1jW2QrMjQ+PjJdfDA7ZD1jW2QrMjA+PjJdfDA7aWYoZD4+PjA+NDI5NDk2NzI3OSl7ZGcoKX1kb3tpZihkPj4+MDwxMSl7YVtiPj4wXT1kPDwxO2s9YisxfDB9ZWxzZXtoPWQrMTYmLTE2O2o9KGh8MCk9PTA/MTpoO3doaWxlKDEpe2s9dW4oail8MDtpZigoa3wwKSE9MCl7Zj0xMzticmVha31rPWNbNTY2Nl18MDtjWzU2NjZdPWsrMDtpZigoa3wwKT09MCl7YnJlYWt9c2NbayYzMV0oKX1pZigoZnwwKT09MTMpe2NbYis4Pj4yXT1rO2NbYj4+Ml09aHwxO2NbYis0Pj4yXT1kO2JyZWFrfWs9WGEoNCl8MDtjW2s+PjJdPTIyNjgwO3diKGt8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtMbihrfDAsZ3wwLGR8MCl8MDthW2srZD4+MF09MDtpPWU7cmV0dXJufWZ1bmN0aW9uIG5tKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT04O2M9YisxfDA7YVtjPj4wXT0xNzAyMTk1ODI4O2FbYysxPj4wXT02NjQ5MjAyO2FbYysyPj4wXT0yNTk3MzthW2MrMz4+MF09MTAxO2FbYis1Pj4wXT0wO3JldHVybn1mdW5jdGlvbiBvbShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2Q9aTtlPTEzNjk2O3doaWxlKDEpe2lmKChjW2U+PjJdfDApPT0wKXticmVha31lbHNle2U9ZSs0fDB9fWc9ZS0xMzY5NnwwO2U9Zz4+MjtpZihlPj4+MD4xMDczNzQxODA3KXtkZygpfWRve2lmKGU+Pj4wPDIpe2FbYj4+MF09Zz4+PjE7aj1iKzR8MH1lbHNle2c9ZSs0Ji00O2g9Zzw8MjtoPShofDApPT0wPzE6aDt3aGlsZSgxKXtqPXVuKGgpfDA7aWYoKGp8MCkhPTApe2Y9MTM7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2JyZWFrfXNjW2omMzFdKCl9aWYoKGZ8MCk9PTEzKXtjW2IrOD4+Ml09ajtjW2I+PjJdPWd8MTtjW2IrND4+Ml09ZTticmVha31qPVhhKDQpfDA7Y1tqPj4yXT0yMjY4MDt3YihqfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGV8MCk9PTApe2o9aisoZTw8Mil8MDtjW2o+PjJdPTA7aT1kO3JldHVybn1lbHNle2Y9ZTtnPTEzNjk2O2I9an13aGlsZSgxKXtmPWYrIC0xfDA7Y1tiPj4yXT1jW2c+PjJdO2lmKChmfDApPT0wKXticmVha31lbHNle2c9Zys0fDA7Yj1iKzR8MH19aj1qKyhlPDwyKXwwO2Nbaj4+Ml09MDtpPWQ7cmV0dXJufWZ1bmN0aW9uIHBtKGIsYyl7Yj1ifDA7Yz1jfDA7dmFyIGQ9MDtjPWk7YVtiPj4wXT0xMDtkPWIrMXwwO2FbZCswPj4wXT1hWzEzNzIwPj4wXXwwO2FbZCsxPj4wXT1hWzEzNzIxPj4wXXwwO2FbZCsyPj4wXT1hWzEzNzIyPj4wXXwwO2FbZCszPj4wXT1hWzEzNzIzPj4wXXwwO2FbZCs0Pj4wXT1hWzEzNzI0Pj4wXXwwO2FbYis2Pj4wXT0wO2k9YztyZXR1cm59ZnVuY3Rpb24gcW0oYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MDtkPWk7ZT0xMzcyODt3aGlsZSgxKXtpZigoY1tlPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtlPWUrNHwwfX1nPWUtMTM3Mjh8MDtlPWc+PjI7aWYoZT4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihlPj4+MDwyKXthW2I+PjBdPWc+Pj4xO2o9Yis0fDB9ZWxzZXtnPWUrNCYtNDtoPWc8PDI7aD0oaHwwKT09MD8xOmg7d2hpbGUoMSl7aj11bihoKXwwO2lmKChqfDApIT0wKXtmPTEzO2JyZWFrfWo9Y1s1NjY2XXwwO2NbNTY2Nl09aiswO2lmKChqfDApPT0wKXticmVha31zY1tqJjMxXSgpfWlmKChmfDApPT0xMyl7Y1tiKzg+PjJdPWo7Y1tiPj4yXT1nfDE7Y1tiKzQ+PjJdPWU7YnJlYWt9aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKChlfDApPT0wKXtqPWorKGU8PDIpfDA7Y1tqPj4yXT0wO2k9ZDtyZXR1cm59ZWxzZXtmPWU7Zz0xMzcyODtiPWp9d2hpbGUoMSl7Zj1mKyAtMXwwO2NbYj4+Ml09Y1tnPj4yXTtpZigoZnwwKT09MCl7YnJlYWt9ZWxzZXtnPWcrNHwwO2I9Yis0fDB9fWo9aisoZTw8Mil8MDtjW2o+PjJdPTA7aT1kO3JldHVybn1mdW5jdGlvbiBybShiKXtiPWJ8MDt2YXIgZD0wO2I9aTtpZigoYVsxMzc2MF18MCkhPTApe2Q9Y1szNDM4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChRYSgxMzc2MCl8MCk9PTApe2Q9Y1szNDM4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChhWzIwOTI4XXwwKT09MD8oUWEoMjA5MjgpfDApIT0wOjApe05uKDIwNzYwLDAsMTY4KXwwO2NjKDIxNSwwLHB8MCl8MDskYSgyMDkyOCl9Z2coMjA3NjAsMjA5MzYpO2dnKDIwNzcyfDAsMjA5NDQpO2dnKDIwNzg0fDAsMjA5NTIpO2dnKDIwNzk2fDAsMjA5NjApO2dnKDIwODA4fDAsMjA5NzYpO2dnKDIwODIwfDAsMjA5OTIpO2dnKDIwODMyfDAsMjFlMyk7Z2coMjA4NDR8MCwyMTAxNik7Z2coMjA4NTZ8MCwyMTAyNCk7Z2coMjA4Njh8MCwyMTAzMik7Z2coMjA4ODB8MCwyMTA0MCk7Z2coMjA4OTJ8MCwyMTA0OCk7Z2coMjA5MDR8MCwyMTA1Nik7Z2coMjA5MTZ8MCwyMTA2NCk7Y1szNDM4XT0yMDc2MDskYSgxMzc2MCk7ZD1jWzM0MzhdfDA7aT1iO3JldHVybiBkfDB9ZnVuY3Rpb24gc20oYil7Yj1ifDA7dmFyIGQ9MDtiPWk7aWYoKGFbMTM3NzZdfDApIT0wKXtkPWNbMzQ0Ml18MDtpPWI7cmV0dXJuIGR8MH1pZigoUWEoMTM3NzYpfDApPT0wKXtkPWNbMzQ0Ml18MDtpPWI7cmV0dXJuIGR8MH1pZigoYVsyMDM5Ml18MCk9PTA/KFFhKDIwMzkyKXwwKSE9MDowKXtObigyMDIyNCwwLDE2OCl8MDtjYygyMTYsMCxwfDApfDA7JGEoMjAzOTIpfW5nKDIwMjI0LDIwNDAwKTtuZygyMDIzNnwwLDIwNDMyKTtuZygyMDI0OHwwLDIwNDY0KTtuZygyMDI2MHwwLDIwNDk2KTtuZygyMDI3MnwwLDIwNTM2KTtuZygyMDI4NHwwLDIwNTc2KTtuZygyMDI5NnwwLDIwNjA4KTtuZygyMDMwOHwwLDIwNjQ4KTtuZygyMDMyMHwwLDIwNjY0KTtuZygyMDMzMnwwLDIwNjgwKTtuZygyMDM0NHwwLDIwNjk2KTtuZygyMDM1NnwwLDIwNzEyKTtuZygyMDM2OHwwLDIwNzI4KTtuZygyMDM4MHwwLDIwNzQ0KTtjWzM0NDJdPTIwMjI0OyRhKDEzNzc2KTtkPWNbMzQ0Ml18MDtpPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB0bShiKXtiPWJ8MDt2YXIgZD0wO2I9aTtpZigoYVsxMzc5Ml18MCkhPTApe2Q9Y1szNDQ2XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChRYSgxMzc5Mil8MCk9PTApe2Q9Y1szNDQ2XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChhWzJlNF18MCk9PTA/KFFhKDJlNCl8MCkhPTA6MCl7Tm4oMTk3MTIsMCwyODgpfDA7Y2MoMjE3LDAscHwwKXwwOyRhKDJlNCl9Z2coMTk3MTIsMjAwMDgpO2dnKDE5NzI0fDAsMjAwMTYpO2dnKDE5NzM2fDAsMjAwMzIpO2dnKDE5NzQ4fDAsMjAwNDApO2dnKDE5NzYwfDAsMjAwNDgpO2dnKDE5NzcyfDAsMjAwNTYpO2dnKDE5Nzg0fDAsMjAwNjQpO2dnKDE5Nzk2fDAsMjAwNzIpO2dnKDE5ODA4fDAsMjAwODApO2dnKDE5ODIwfDAsMjAwOTYpO2dnKDE5ODMyfDAsMjAxMDQpO2dnKDE5ODQ0fDAsMjAxMjApO2dnKDE5ODU2fDAsMjAxMzYpO2dnKDE5ODY4fDAsMjAxNDQpO2dnKDE5ODgwfDAsMjAxNTIpO2dnKDE5ODkyfDAsMjAxNjApO2dnKDE5OTA0fDAsMjAwNDgpO2dnKDE5OTE2fDAsMjAxNjgpO2dnKDE5OTI4fDAsMjAxNzYpO2dnKDE5OTQwfDAsMjAxODQpO2dnKDE5OTUyfDAsMjAxOTIpO2dnKDE5OTY0fDAsMjAyMDApO2dnKDE5OTc2fDAsMjAyMDgpO2dnKDE5OTg4fDAsMjAyMTYpO2NbMzQ0Nl09MTk3MTI7JGEoMTM3OTIpO2Q9Y1szNDQ2XXwwO2k9YjtyZXR1cm4gZHwwfWZ1bmN0aW9uIHVtKGIpe2I9YnwwO3ZhciBkPTA7Yj1pO2lmKChhWzEzODA4XXwwKSE9MCl7ZD1jWzM0NTBdfDA7aT1iO3JldHVybiBkfDB9aWYoKFFhKDEzODA4KXwwKT09MCl7ZD1jWzM0NTBdfDA7aT1iO3JldHVybiBkfDB9aWYoKGFbMTkxNjBdfDApPT0wPyhRYSgxOTE2MCl8MCkhPTA6MCl7Tm4oMTg4NzIsMCwyODgpfDA7Y2MoMjE4LDAscHwwKXwwOyRhKDE5MTYwKX1uZygxODg3MiwxOTE2OCk7bmcoMTg4ODR8MCwxOTIwMCk7bmcoMTg4OTZ8MCwxOTI0MCk7bmcoMTg5MDh8MCwxOTI2NCk7bmcoMTg5MjB8MCwxOTU4NCk7bmcoMTg5MzJ8MCwxOTI4OCk7bmcoMTg5NDR8MCwxOTMxMik7bmcoMTg5NTZ8MCwxOTMzNik7bmcoMTg5Njh8MCwxOTM2OCk7bmcoMTg5ODB8MCwxOTQwOCk7bmcoMTg5OTJ8MCwxOTQ0MCk7bmcoMTkwMDR8MCwxOTQ4MCk7bmcoMTkwMTZ8MCwxOTUyMCk7bmcoMTkwMjh8MCwxOTUzNik7bmcoMTkwNDB8MCwxOTU1Mik7bmcoMTkwNTJ8MCwxOTU2OCk7bmcoMTkwNjR8MCwxOTU4NCk7bmcoMTkwNzZ8MCwxOTYwMCk7bmcoMTkwODh8MCwxOTYxNik7bmcoMTkxMDB8MCwxOTYzMik7bmcoMTkxMTJ8MCwxOTY0OCk7bmcoMTkxMjR8MCwxOTY2NCk7bmcoMTkxMzZ8MCwxOTY4MCk7bmcoMTkxNDh8MCwxOTY5Nik7Y1szNDUwXT0xODg3MjskYSgxMzgwOCk7ZD1jWzM0NTBdfDA7aT1iO3JldHVybiBkfDB9ZnVuY3Rpb24gdm0oYil7Yj1ifDA7dmFyIGQ9MDtiPWk7aWYoKGFbMTM4MjRdfDApIT0wKXtkPWNbMzQ1NF18MDtpPWI7cmV0dXJuIGR8MH1pZigoUWEoMTM4MjQpfDApPT0wKXtkPWNbMzQ1NF18MDtpPWI7cmV0dXJuIGR8MH1pZigoYVsxODg0OF18MCk9PTA/KFFhKDE4ODQ4KXwwKSE9MDowKXtObigxODU2MCwwLDI4OCl8MDtjYygyMTksMCxwfDApfDA7JGEoMTg4NDgpfWdnKDE4NTYwLDE4ODU2KTtnZygxODU3MnwwLDE4ODY0KTtjWzM0NTRdPTE4NTYwOyRhKDEzODI0KTtkPWNbMzQ1NF18MDtpPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB3bShiKXtiPWJ8MDt2YXIgZD0wO2I9aTtpZigoYVsxMzg0MF18MCkhPTApe2Q9Y1szNDU4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChRYSgxMzg0MCl8MCk9PTApe2Q9Y1szNDU4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChhWzE4NTIwXXwwKT09MD8oUWEoMTg1MjApfDApIT0wOjApe05uKDE4MjMyLDAsMjg4KXwwO2NjKDIyMCwwLHB8MCl8MDskYSgxODUyMCl9bmcoMTgyMzIsMTg1MjgpO25nKDE4MjQ0fDAsMTg1NDQpO2NbMzQ1OF09MTgyMzI7JGEoMTM4NDApO2Q9Y1szNDU4XXwwO2k9YjtyZXR1cm4gZHwwfWZ1bmN0aW9uIHhtKGIpe2I9YnwwO3ZhciBjPTAsZD0wO2I9aTtpZigoYVsxMzg2NF18MCkhPTApe2k9YjtyZXR1cm4gMTM4NDh9aWYoKFFhKDEzODY0KXwwKT09MCl7aT1iO3JldHVybiAxMzg0OH1hWzEzODQ4XT0xNjtjPTEzODQ5fDA7ZD1jO2FbZD4+MF09NjIzODY1MTI1O2FbZCsxPj4wXT0yNDM2OTczO2FbZCsyPj4wXT05NTE5O2FbZCszPj4wXT0zNztjPWMrNHwwO2FbYz4+MF09MjAzMjQ4MDEwMDthW2MrMT4+MF09NzkzOTM3NTthW2MrMj4+MF09MzEwMTM7YVtjKzM+PjBdPTEyMTthWzEzODU3Pj4wXT0wO2NjKDIyMSwxMzg0OCxwfDApfDA7JGEoMTM4NjQpO2k9YjtyZXR1cm4gMTM4NDh9ZnVuY3Rpb24geW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzEzODg4XXwwKSE9MCl7aT1iO3JldHVybiAxMzg3Mn1pZigoUWEoMTM4ODgpfDApPT0wKXtpPWI7cmV0dXJuIDEzODcyfWVsc2V7ZD0xMzg5Nn13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTM4OTZ8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzEzODcyXT1mPj4+MTtlPTEzODc2fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxMzg4MD4+Ml09aDtjWzM0NjhdPWZ8MTtjWzEzODc2Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTEzODk2O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDEzODcyLHB8MCl8MDskYSgxMzg4OCk7aT1iO3JldHVybiAxMzg3Mn1mdW5jdGlvbiB6bShiKXtiPWJ8MDt2YXIgYz0wLGQ9MDtiPWk7aWYoKGFbMTM5NTJdfDApIT0wKXtpPWI7cmV0dXJuIDEzOTM2fWlmKChRYSgxMzk1Mil8MCk9PTApe2k9YjtyZXR1cm4gMTM5MzZ9YVsxMzkzNl09MTY7Yz0xMzkzN3wwO2Q9YzthW2Q+PjBdPTYyNDU3NjU0OTthW2QrMT4+MF09MjQzOTc1MjthW2QrMj4+MF09OTUzMDthW2QrMz4+MF09Mzc7Yz1jKzR8MDthW2M+PjBdPTEzOTQ5NDg2ODU7YVtjKzE+PjBdPTU0NDkwMTg7YVtjKzI+PjBdPTIxMjg1O2FbYyszPj4wXT04MzthWzEzOTQ1Pj4wXT0wO2NjKDIyMSwxMzkzNixwfDApfDA7JGEoMTM5NTIpO2k9YjtyZXR1cm4gMTM5MzZ9ZnVuY3Rpb24gQW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzEzOTc2XXwwKSE9MCl7aT1iO3JldHVybiAxMzk2MH1pZigoUWEoMTM5NzYpfDApPT0wKXtpPWI7cmV0dXJuIDEzOTYwfWVsc2V7ZD0xMzk4NH13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTM5ODR8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzEzOTYwXT1mPj4+MTtlPTEzOTY0fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxMzk2OD4+Ml09aDtjWzM0OTBdPWZ8MTtjWzEzOTY0Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTEzOTg0O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDEzOTYwLHB8MCl8MDskYSgxMzk3Nik7aT1iO3JldHVybiAxMzk2MH1mdW5jdGlvbiBCbShiKXtiPWJ8MDtiPWk7aWYoKGFbMTQwNDBdfDApPT0wPyhRYSgxNDA0MCl8MCkhPTA6MCl7ZWcoMTQwMjQsMTQwNDgsMjApO2NjKDIyMSwxNDAyNCxwfDApfDA7JGEoMTQwNDApfWk9YjtyZXR1cm4gMTQwMjR9ZnVuY3Rpb24gQ20oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzE0MDg4XXwwKSE9MCl7aT1iO3JldHVybiAxNDA3Mn1pZigoUWEoMTQwODgpfDApPT0wKXtpPWI7cmV0dXJuIDE0MDcyfWVsc2V7ZD0xNDA5Nn13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTQwOTZ8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzE0MDcyXT1mPj4+MTtlPTE0MDc2fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxNDA4MD4+Ml09aDtjWzM1MThdPWZ8MTtjWzE0MDc2Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTE0MDk2O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDE0MDcyLHB8MCl8MDskYSgxNDA4OCk7aT1iO3JldHVybiAxNDA3Mn1mdW5jdGlvbiBEbShiKXtiPWJ8MDtiPWk7aWYoKGFbMTQyMDBdfDApPT0wPyhRYSgxNDIwMCl8MCkhPTA6MCl7ZWcoMTQxODQsMTQyMDgsMTEpO2NjKDIyMSwxNDE4NCxwfDApfDA7JGEoMTQyMDApfWk9YjtyZXR1cm4gMTQxODR9ZnVuY3Rpb24gRW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzE0MjQwXXwwKSE9MCl7aT1iO3JldHVybiAxNDIyNH1pZigoUWEoMTQyNDApfDApPT0wKXtpPWI7cmV0dXJuIDE0MjI0fWVsc2V7ZD0xNDI0OH13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTQyNDh8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzE0MjI0XT1mPj4+MTtlPTE0MjI4fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxNDIzMj4+Ml09aDtjWzM1NTZdPWZ8MTtjWzE0MjI4Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTE0MjQ4O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDE0MjI0LHB8MCl8MDskYSgxNDI0MCk7aT1iO3JldHVybiAxNDIyNH1mdW5jdGlvbiBGbShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAuMDtmPWk7aT1pKzE2fDA7Zz1mO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O2s9MC4wO2k9ZjtyZXR1cm4ra31qPWJiKCl8MDtoPWNbaj4+Ml18MDtjW2o+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWs9K0ZuKGIsZyk7Yj1jW2o+PjJdfDA7aWYoKGJ8MCk9PTApe2Nbaj4+Ml09aH1pZigoY1tnPj4yXXwwKSE9KGR8MCkpe2NbZT4+Ml09NDtrPTAuMDtpPWY7cmV0dXJuK2t9aWYoKGJ8MCkhPTM0KXtpPWY7cmV0dXJuK2t9Y1tlPj4yXT00O2k9ZjtyZXR1cm4ra31mdW5jdGlvbiBHbShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAuMDtmPWk7aT1pKzE2fDA7Zz1mO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O2s9MC4wO2k9ZjtyZXR1cm4ra31qPWJiKCl8MDtoPWNbaj4+Ml18MDtjW2o+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWs9K0ZuKGIsZyk7Yj1jW2o+PjJdfDA7aWYoKGJ8MCk9PTApe2Nbaj4+Ml09aH1pZigoY1tnPj4yXXwwKSE9KGR8MCkpe2NbZT4+Ml09NDtrPTAuMDtpPWY7cmV0dXJuK2t9aWYoKGJ8MCkhPTM0KXtpPWY7cmV0dXJuK2t9Y1tlPj4yXT00O2k9ZjtyZXR1cm4ra31mdW5jdGlvbiBIbShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAuMDtmPWk7aT1pKzE2fDA7Zz1mO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O2s9MC4wO2k9ZjtyZXR1cm4ra31qPWJiKCl8MDtoPWNbaj4+Ml18MDtjW2o+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWs9K0ZuKGIsZyk7Yj1jW2o+PjJdfDA7aWYoKGJ8MCk9PTApe2Nbaj4+Ml09aH1pZigoY1tnPj4yXXwwKSE9KGR8MCkpe2NbZT4+Ml09NDtrPTAuMDtpPWY7cmV0dXJuK2t9aWYoKGJ8MCk9PTM0KXtjW2U+PjJdPTR9aT1mO3JldHVybitrfWZ1bmN0aW9uIEltKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7aD1pO2k9aSsxMTJ8MDtrPWg7aWYoKGJ8MCk9PShkfDApKXtjW2U+PjJdPTQ7Zj0wO209MDtJPWY7aT1oO3JldHVybiBtfDB9aWYoKGFbYj4+MF18MCk9PTQ1KXtjW2U+PjJdPTQ7Zj0wO209MDtJPWY7aT1oO3JldHVybiBtfDB9Zz1iYigpfDA7aj1jW2c+PjJdfDA7Y1tnPj4yXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1jW2s+PjJdPTA7bD1rKzR8MDtjW2w+PjJdPWI7Y1trKzQ0Pj4yXT1iO2lmKChifDApPDApe2Nbays4Pj4yXT0tMTttPS0xfWVsc2V7bT1iKzIxNDc0ODM2NDd8MDtjW2srOD4+Ml09bX1jW2srNzY+PjJdPS0xO2NbaysxMDQ+PjJdPTA7bj1rKzEwOHwwO2Nbbj4+Ml09bS1iO2NbaysxMDA+PjJdPW07bT1CbihrLGYsLTEsLTEpfDA7Zj1JO2s9YisoKGNbbD4+Ml18MCkrKGNbbj4+Ml18MCktKGNbays4Pj4yXXwwKSl8MDtiPWNbZz4+Ml18MDtpZigoYnwwKT09MCl7Y1tnPj4yXT1qfWlmKChrfDApIT0oZHwwKSl7Y1tlPj4yXT00O209MDtuPTA7ST1tO2k9aDtyZXR1cm4gbnwwfWlmKChifDApIT0zNCl7bj1tO0k9ZjtpPWg7cmV0dXJuIG58MH1jW2U+PjJdPTQ7bT0tMTtuPS0xO0k9bTtpPWg7cmV0dXJuIG58MH1mdW5jdGlvbiBKbShiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2g9aTtpPWkrMTEyfDA7az1oO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O209MDtpPWg7cmV0dXJuIG18MH1pZigoYVtiPj4wXXwwKT09NDUpe2NbZT4+Ml09NDttPTA7aT1oO3JldHVybiBtfDB9Zz1iYigpfDA7aj1jW2c+PjJdfDA7Y1tnPj4yXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1jW2s+PjJdPTA7bD1rKzR8MDtjW2w+PjJdPWI7Y1trKzQ0Pj4yXT1iO2lmKChifDApPDApe2Nbays4Pj4yXT0tMTttPS0xfWVsc2V7bT1iKzIxNDc0ODM2NDd8MDtjW2srOD4+Ml09bX1jW2srNzY+PjJdPS0xO2NbaysxMDQ+PjJdPTA7bj1rKzEwOHwwO2Nbbj4+Ml09bS1iO2NbaysxMDA+PjJdPW07bT1CbihrLGYsLTEsLTEpfDA7Zj1JO2s9YisoKGNbbD4+Ml18MCkrKGNbbj4+Ml18MCktKGNbays4Pj4yXXwwKSl8MDtiPWNbZz4+Ml18MDtpZigoYnwwKT09MCl7Y1tnPj4yXT1qfWlmKChrfDApIT0oZHwwKSl7Y1tlPj4yXT00O249MDtpPWg7cmV0dXJuIG58MH1pZigoYnwwKT09MzR8KGY+Pj4wPjB8KGZ8MCk9PTAmbT4+PjA+NDI5NDk2NzI5NSkpe2NbZT4+Ml09NDtuPS0xO2k9aDtyZXR1cm4gbnwwfWVsc2V7bj1tO2k9aDtyZXR1cm4gbnwwfXJldHVybiAwfWZ1bmN0aW9uIEttKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7aD1pO2k9aSsxMTJ8MDtrPWg7aWYoKGJ8MCk9PShkfDApKXtjW2U+PjJdPTQ7bT0wO2k9aDtyZXR1cm4gbXwwfWlmKChhW2I+PjBdfDApPT00NSl7Y1tlPj4yXT00O209MDtpPWg7cmV0dXJuIG18MH1nPWJiKCl8MDtqPWNbZz4+Ml18MDtjW2c+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWNbaz4+Ml09MDtsPWsrNHwwO2NbbD4+Ml09YjtjW2srNDQ+PjJdPWI7aWYoKGJ8MCk8MCl7Y1trKzg+PjJdPS0xO209LTF9ZWxzZXttPWIrMjE0NzQ4MzY0N3wwO2Nbays4Pj4yXT1tfWNbays3Nj4+Ml09LTE7Y1trKzEwND4+Ml09MDtuPWsrMTA4fDA7Y1tuPj4yXT1tLWI7Y1trKzEwMD4+Ml09bTttPUJuKGssZiwtMSwtMSl8MDtmPUk7az1iKygoY1tsPj4yXXwwKSsoY1tuPj4yXXwwKS0oY1trKzg+PjJdfDApKXwwO2I9Y1tnPj4yXXwwO2lmKChifDApPT0wKXtjW2c+PjJdPWp9aWYoKGt8MCkhPShkfDApKXtjW2U+PjJdPTQ7bj0wO2k9aDtyZXR1cm4gbnwwfWlmKChifDApPT0zNHwoZj4+PjA+MHwoZnwwKT09MCZtPj4+MD40Mjk0OTY3Mjk1KSl7Y1tlPj4yXT00O249LTE7aT1oO3JldHVybiBufDB9ZWxzZXtuPW07aT1oO3JldHVybiBufDB9cmV0dXJuIDB9ZnVuY3Rpb24gTG0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtoPWk7aT1pKzExMnwwO2s9aDtpZigoYnwwKT09KGR8MCkpe2NbZT4+Ml09NDttPTA7aT1oO3JldHVybiBtfDB9aWYoKGFbYj4+MF18MCk9PTQ1KXtjW2U+PjJdPTQ7bT0wO2k9aDtyZXR1cm4gbXwwfWc9YmIoKXwwO2o9Y1tnPj4yXXwwO2NbZz4+Ml09MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9Y1trPj4yXT0wO2w9ays0fDA7Y1tsPj4yXT1iO2Nbays0ND4+Ml09YjtpZigoYnwwKTwwKXtjW2srOD4+Ml09LTE7bT0tMX1lbHNle209YisyMTQ3NDgzNjQ3fDA7Y1trKzg+PjJdPW19Y1trKzc2Pj4yXT0tMTtjW2srMTA0Pj4yXT0wO249aysxMDh8MDtjW24+PjJdPW0tYjtjW2srMTAwPj4yXT1tO209Qm4oayxmLC0xLC0xKXwwO2Y9STtrPWIrKChjW2w+PjJdfDApKyhjW24+PjJdfDApLShjW2srOD4+Ml18MCkpfDA7Yj1jW2c+PjJdfDA7aWYoKGJ8MCk9PTApe2NbZz4+Ml09an1pZigoa3wwKSE9KGR8MCkpe2NbZT4+Ml09NDtuPTA7aT1oO3JldHVybiBufDB9aWYoKGJ8MCk9PTM0fChmPj4+MD4wfChmfDApPT0wJm0+Pj4wPjY1NTM1KSl7Y1tlPj4yXT00O249LTE7aT1oO3JldHVybiBufDB9ZWxzZXtuPW0mNjU1MzU7aT1oO3JldHVybiBufDB9cmV0dXJuIDB9ZnVuY3Rpb24gTW0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtoPWk7aT1pKzExMnwwO2s9aDtpZigoYnwwKT09KGR8MCkpe2NbZT4+Ml09NDtmPTA7bT0wO0k9ZjtpPWg7cmV0dXJuIG18MH1nPWJiKCl8MDtqPWNbZz4+Ml18MDtjW2c+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWNbaz4+Ml09MDtsPWsrNHwwO2NbbD4+Ml09YjtjW2srNDQ+PjJdPWI7aWYoKGJ8MCk8MCl7Y1trKzg+PjJdPS0xO209LTF9ZWxzZXttPWIrMjE0NzQ4MzY0N3wwO2Nbays4Pj4yXT1tfWNbays3Nj4+Ml09LTE7Y1trKzEwND4+Ml09MDtuPWsrMTA4fDA7Y1tuPj4yXT1tLWI7Y1trKzEwMD4+Ml09bTttPUJuKGssZiwwLC0yMTQ3NDgzNjQ4KXwwO2Y9STtrPWIrKChjW2w+PjJdfDApKyhjW24+PjJdfDApLShjW2srOD4+Ml18MCkpfDA7Yj1jW2c+PjJdfDA7aWYoKGJ8MCk9PTApe2NbZz4+Ml09an1pZigoa3wwKSE9KGR8MCkpe2NbZT4+Ml09NDttPTA7bj0wO0k9bTtpPWg7cmV0dXJuIG58MH1pZigoYnwwKT09MzQpe2NbZT4+Ml09NDtuPShmfDApPjB8KGZ8MCk9PTAmbT4+PjA+MDtJPW4/MjE0NzQ4MzY0NzotMjE0NzQ4MzY0ODtpPWg7cmV0dXJuKG4/LTE6MCl8MH1lbHNle249bTtJPWY7aT1oO3JldHVybiBufDB9cmV0dXJuIDB9ZnVuY3Rpb24gTm0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtoPWk7aT1pKzExMnwwO2s9aDtpZigoYnwwKT09KGR8MCkpe2NbZT4+Ml09NDttPTA7aT1oO3JldHVybiBtfDB9Zz1iYigpfDA7aj1jW2c+PjJdfDA7Y1tnPj4yXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1jW2s+PjJdPTA7bD1rKzR8MDtjW2w+PjJdPWI7Y1trKzQ0Pj4yXT1iO2lmKChifDApPDApe2Nbays4Pj4yXT0tMTttPS0xfWVsc2V7bT1iKzIxNDc0ODM2NDd8MDtjW2srOD4+Ml09bX1jW2srNzY+PjJdPS0xO2NbaysxMDQ+PjJdPTA7bj1rKzEwOHwwO2Nbbj4+Ml09bS1iO2NbaysxMDA+PjJdPW07bT1CbihrLGYsMCwtMjE0NzQ4MzY0OCl8MDtmPUk7az1iKygoY1tsPj4yXXwwKSsoY1tuPj4yXXwwKS0oY1trKzg+PjJdfDApKXwwO2I9Y1tnPj4yXXwwO2lmKChifDApPT0wKXtjW2c+PjJdPWp9aWYoKGt8MCkhPShkfDApKXtjW2U+PjJdPTQ7bj0wO2k9aDtyZXR1cm4gbnwwfWRve2lmKChifDApPT0zNCl7Y1tlPj4yXT00O2lmKChmfDApPjB8KGZ8MCk9PTAmbT4+PjA+MCl7bj0yMTQ3NDgzNjQ3O2k9aDtyZXR1cm4gbnwwfX1lbHNle2lmKChmfDApPC0xfChmfDApPT0tMSZtPj4+MDwyMTQ3NDgzNjQ4KXtjW2U+PjJdPTQ7YnJlYWt9aWYoKGZ8MCk+MHwoZnwwKT09MCZtPj4+MD4yMTQ3NDgzNjQ3KXtjW2U+PjJdPTQ7bj0yMTQ3NDgzNjQ3O2k9aDtyZXR1cm4gbnwwfWVsc2V7bj1tO2k9aDtyZXR1cm4gbnwwfX19d2hpbGUoMCk7bj0tMjE0NzQ4MzY0ODtpPWg7cmV0dXJuIG58MH1mdW5jdGlvbiBPbShiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTA7Yj1pO2lmKCEoKGFbMTg1MDg+PjBdJjEpPT0wKT8odj1jWzE4NTE2Pj4yXXwwLCh2fDApIT0wKTowKXt2bih2KX1pZighKChhWzE4NDk2Pj4wXSYxKT09MCk/KHU9Y1sxODUwND4+Ml18MCwodXwwKSE9MCk6MCl7dm4odSl9aWYoISgoYVsxODQ4ND4+MF0mMSk9PTApPyh0PWNbMTg0OTI+PjJdfDAsKHR8MCkhPTApOjApe3ZuKHQpfWlmKCEoKGFbMTg0NzI+PjBdJjEpPT0wKT8ocz1jWzE4NDgwPj4yXXwwLChzfDApIT0wKTowKXt2bihzKX1pZighKChhWzE4NDYwPj4wXSYxKT09MCk/KHI9Y1sxODQ2OD4+Ml18MCwocnwwKSE9MCk6MCl7dm4ocil9aWYoISgoYVsxODQ0OD4+MF0mMSk9PTApPyhkPWNbMTg0NTY+PjJdfDAsKGR8MCkhPTApOjApe3ZuKGQpfWlmKCEoKGFbMTg0MzY+PjBdJjEpPT0wKT8ocD1jWzE4NDQ0Pj4yXXwwLChwfDApIT0wKTowKXt2bihwKX1pZighKChhWzE4NDI0Pj4wXSYxKT09MCk/KG89Y1sxODQzMj4+Ml18MCwob3wwKSE9MCk6MCl7dm4obyl9aWYoISgoYVsxODQxMj4+MF0mMSk9PTApPyhuPWNbMTg0MjA+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKCEoKGFbMTg0MDA+PjBdJjEpPT0wKT8obT1jWzE4NDA4Pj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZighKChhWzE4Mzg4Pj4wXSYxKT09MCk/KGw9Y1sxODM5Nj4+Ml18MCwobHwwKSE9MCk6MCl7dm4obCl9aWYoISgoYVsxODM3Nj4+MF0mMSk9PTApPyhrPWNbMTgzODQ+PjJdfDAsKGt8MCkhPTApOjApe3ZuKGspfWlmKCEoKGFbMTgzNjQ+PjBdJjEpPT0wKT8oaj1jWzE4MzcyPj4yXXwwLChqfDApIT0wKTowKXt2bihqKX1pZighKChhWzE4MzUyPj4wXSYxKT09MCk/KGg9Y1sxODM2MD4+Ml18MCwoaHwwKSE9MCk6MCl7dm4oaCl9aWYoISgoYVsxODM0MD4+MF0mMSk9PTApPyhnPWNbMTgzNDg+PjJdfDAsKGd8MCkhPTApOjApe3ZuKGcpfWlmKCEoKGFbMTgzMjg+PjBdJjEpPT0wKT8oZj1jWzE4MzM2Pj4yXXwwLChmfDApIT0wKTowKXt2bihmKX1pZighKChhWzE4MzE2Pj4wXSYxKT09MCk/KGU9Y1sxODMyND4+Ml18MCwoZXwwKSE9MCk6MCl7dm4oZSl9aWYoISgoYVsxODMwND4+MF0mMSk9PTApPyhxPWNbMTgzMTI+PjJdfDAsKHF8MCkhPTApOjApe3ZuKHEpfWRve2lmKCEoKGFbMTgyOTI+PjBdJjEpPT0wKSl7ZD1jWzE4MzAwPj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODI4MD4+MF0mMSk9PTApKXtkPWNbMTgyODg+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE4MjY4Pj4wXSYxKT09MCkpe2Q9Y1sxODI3Nj4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTgyNTY+PjBdJjEpPT0wKSl7ZD1jWzE4MjY0Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODI0ND4+MF0mMSk9PTApKXtkPWNbMTgyNTI+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtpZigoYVsxODIzMl0mMSk9PTApe2k9YjtyZXR1cm59ZD1jWzE4MjQwPj4yXXwwO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gUG0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wO2I9aTtpZighKChhWzE4ODM2Pj4wXSYxKT09MCk/KHY9Y1sxODg0ND4+Ml18MCwodnwwKSE9MCk6MCl7dm4odil9aWYoISgoYVsxODgyND4+MF0mMSk9PTApPyh1PWNbMTg4MzI+PjJdfDAsKHV8MCkhPTApOjApe3ZuKHUpfWlmKCEoKGFbMTg4MTI+PjBdJjEpPT0wKT8odD1jWzE4ODIwPj4yXXwwLCh0fDApIT0wKTowKXt2bih0KX1pZighKChhWzE4ODAwPj4wXSYxKT09MCk/KHM9Y1sxODgwOD4+Ml18MCwoc3wwKSE9MCk6MCl7dm4ocyl9aWYoISgoYVsxODc4OD4+MF0mMSk9PTApPyhyPWNbMTg3OTY+PjJdfDAsKHJ8MCkhPTApOjApe3ZuKHIpfWlmKCEoKGFbMTg3NzY+PjBdJjEpPT0wKT8oZD1jWzE4Nzg0Pj4yXXwwLChkfDApIT0wKTowKXt2bihkKX1pZighKChhWzE4NzY0Pj4wXSYxKT09MCk/KHA9Y1sxODc3Mj4+Ml18MCwocHwwKSE9MCk6MCl7dm4ocCl9aWYoISgoYVsxODc1Mj4+MF0mMSk9PTApPyhvPWNbMTg3NjA+PjJdfDAsKG98MCkhPTApOjApe3ZuKG8pfWlmKCEoKGFbMTg3NDA+PjBdJjEpPT0wKT8obj1jWzE4NzQ4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhWzE4NzI4Pj4wXSYxKT09MCk/KG09Y1sxODczNj4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoISgoYVsxODcxNj4+MF0mMSk9PTApPyhsPWNbMTg3MjQ+PjJdfDAsKGx8MCkhPTApOjApe3ZuKGwpfWlmKCEoKGFbMTg3MDQ+PjBdJjEpPT0wKT8oaz1jWzE4NzEyPj4yXXwwLChrfDApIT0wKTowKXt2bihrKX1pZighKChhWzE4NjkyPj4wXSYxKT09MCk/KGo9Y1sxODcwMD4+Ml18MCwoanwwKSE9MCk6MCl7dm4oail9aWYoISgoYVsxODY4MD4+MF0mMSk9PTApPyhoPWNbMTg2ODg+PjJdfDAsKGh8MCkhPTApOjApe3ZuKGgpfWlmKCEoKGFbMTg2Njg+PjBdJjEpPT0wKT8oZz1jWzE4Njc2Pj4yXXwwLChnfDApIT0wKTowKXt2bihnKX1pZighKChhWzE4NjU2Pj4wXSYxKT09MCk/KGY9Y1sxODY2ND4+Ml18MCwoZnwwKSE9MCk6MCl7dm4oZil9aWYoISgoYVsxODY0ND4+MF0mMSk9PTApPyhlPWNbMTg2NTI+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWlmKCEoKGFbMTg2MzI+PjBdJjEpPT0wKT8ocT1jWzE4NjQwPj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1kb3tpZighKChhWzE4NjIwPj4wXSYxKT09MCkpe2Q9Y1sxODYyOD4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg2MDg+PjBdJjEpPT0wKSl7ZD1jWzE4NjE2Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODU5Nj4+MF0mMSk9PTApKXtkPWNbMTg2MDQ+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE4NTg0Pj4wXSYxKT09MCkpe2Q9Y1sxODU5Mj4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg1NzI+PjBdJjEpPT0wKSl7ZD1jWzE4NTgwPj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7aWYoKGFbMTg1NjBdJjEpPT0wKXtpPWI7cmV0dXJufWQ9Y1sxODU2OD4+Ml18MDtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFFtKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MDtiPWk7aWYoISgoYVsxOTE0OD4+MF0mMSk9PTApPyh2PWNbMTkxNTY+PjJdfDAsKHZ8MCkhPTApOjApe3ZuKHYpfWlmKCEoKGFbMTkxMzY+PjBdJjEpPT0wKT8odT1jWzE5MTQ0Pj4yXXwwLCh1fDApIT0wKTowKXt2bih1KX1pZighKChhWzE5MTI0Pj4wXSYxKT09MCk/KHQ9Y1sxOTEzMj4+Ml18MCwodHwwKSE9MCk6MCl7dm4odCl9aWYoISgoYVsxOTExMj4+MF0mMSk9PTApPyhzPWNbMTkxMjA+PjJdfDAsKHN8MCkhPTApOjApe3ZuKHMpfWlmKCEoKGFbMTkxMDA+PjBdJjEpPT0wKT8ocj1jWzE5MTA4Pj4yXXwwLChyfDApIT0wKTowKXt2bihyKX1pZighKChhWzE5MDg4Pj4wXSYxKT09MCk/KGQ9Y1sxOTA5Nj4+Ml18MCwoZHwwKSE9MCk6MCl7dm4oZCl9aWYoISgoYVsxOTA3Nj4+MF0mMSk9PTApPyhwPWNbMTkwODQ+PjJdfDAsKHB8MCkhPTApOjApe3ZuKHApfWlmKCEoKGFbMTkwNjQ+PjBdJjEpPT0wKT8obz1jWzE5MDcyPj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhWzE5MDUyPj4wXSYxKT09MCk/KG49Y1sxOTA2MD4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoISgoYVsxOTA0MD4+MF0mMSk9PTApPyhtPWNbMTkwNDg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbMTkwMjg+PjBdJjEpPT0wKT8obD1jWzE5MDM2Pj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZighKChhWzE5MDE2Pj4wXSYxKT09MCk/KGs9Y1sxOTAyND4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9aWYoISgoYVsxOTAwND4+MF0mMSk9PTApPyhqPWNbMTkwMTI+PjJdfDAsKGp8MCkhPTApOjApe3ZuKGopfWlmKCEoKGFbMTg5OTI+PjBdJjEpPT0wKT8oaD1jWzE5ZTM+PjJdfDAsKGh8MCkhPTApOjApe3ZuKGgpfWlmKCEoKGFbMTg5ODA+PjBdJjEpPT0wKT8oZz1jWzE4OTg4Pj4yXXwwLChnfDApIT0wKTowKXt2bihnKX1pZighKChhWzE4OTY4Pj4wXSYxKT09MCk/KGY9Y1sxODk3Nj4+Ml18MCwoZnwwKSE9MCk6MCl7dm4oZil9aWYoISgoYVsxODk1Nj4+MF0mMSk9PTApPyhlPWNbMTg5NjQ+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWlmKCEoKGFbMTg5NDQ+PjBdJjEpPT0wKT8ocT1jWzE4OTUyPj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1kb3tpZighKChhWzE4OTMyPj4wXSYxKT09MCkpe2Q9Y1sxODk0MD4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg5MjA+PjBdJjEpPT0wKSl7ZD1jWzE4OTI4Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODkwOD4+MF0mMSk9PTApKXtkPWNbMTg5MTY+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE4ODk2Pj4wXSYxKT09MCkpe2Q9Y1sxODkwND4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg4ODQ+PjBdJjEpPT0wKSl7ZD1jWzE4ODkyPj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7aWYoKGFbMTg4NzJdJjEpPT0wKXtpPWI7cmV0dXJufWQ9Y1sxODg4MD4+Ml18MDtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFJtKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MDtiPWk7aWYoISgoYVsxOTk4OD4+MF0mMSk9PTApPyh2PWNbMTk5OTY+PjJdfDAsKHZ8MCkhPTApOjApe3ZuKHYpfWlmKCEoKGFbMTk5NzY+PjBdJjEpPT0wKT8odT1jWzE5OTg0Pj4yXXwwLCh1fDApIT0wKTowKXt2bih1KX1pZighKChhWzE5OTY0Pj4wXSYxKT09MCk/KHQ9Y1sxOTk3Mj4+Ml18MCwodHwwKSE9MCk6MCl7dm4odCl9aWYoISgoYVsxOTk1Mj4+MF0mMSk9PTApPyhzPWNbMTk5NjA+PjJdfDAsKHN8MCkhPTApOjApe3ZuKHMpfWlmKCEoKGFbMTk5NDA+PjBdJjEpPT0wKT8ocj1jWzE5OTQ4Pj4yXXwwLChyfDApIT0wKTowKXt2bihyKX1pZighKChhWzE5OTI4Pj4wXSYxKT09MCk/KGQ9Y1sxOTkzNj4+Ml18MCwoZHwwKSE9MCk6MCl7dm4oZCl9aWYoISgoYVsxOTkxNj4+MF0mMSk9PTApPyhwPWNbMTk5MjQ+PjJdfDAsKHB8MCkhPTApOjApe3ZuKHApfWlmKCEoKGFbMTk5MDQ+PjBdJjEpPT0wKT8obz1jWzE5OTEyPj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhWzE5ODkyPj4wXSYxKT09MCk/KG49Y1sxOTkwMD4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoISgoYVsxOTg4MD4+MF0mMSk9PTApPyhtPWNbMTk4ODg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbMTk4Njg+PjBdJjEpPT0wKT8obD1jWzE5ODc2Pj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZighKChhWzE5ODU2Pj4wXSYxKT09MCk/KGs9Y1sxOTg2ND4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9aWYoISgoYVsxOTg0ND4+MF0mMSk9PTApPyhqPWNbMTk4NTI+PjJdfDAsKGp8MCkhPTApOjApe3ZuKGopfWlmKCEoKGFbMTk4MzI+PjBdJjEpPT0wKT8oaD1jWzE5ODQwPj4yXXwwLChofDApIT0wKTowKXt2bihoKX1pZighKChhWzE5ODIwPj4wXSYxKT09MCk/KGc9Y1sxOTgyOD4+Ml18MCwoZ3wwKSE9MCk6MCl7dm4oZyl9aWYoISgoYVsxOTgwOD4+MF0mMSk9PTApPyhmPWNbMTk4MTY+PjJdfDAsKGZ8MCkhPTApOjApe3ZuKGYpfWlmKCEoKGFbMTk3OTY+PjBdJjEpPT0wKT8oZT1jWzE5ODA0Pj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pZighKChhWzE5Nzg0Pj4wXSYxKT09MCk/KHE9Y1sxOTc5Mj4+Ml18MCwocXwwKSE9MCk6MCl7dm4ocSl9ZG97aWYoISgoYVsxOTc3Mj4+MF0mMSk9PTApKXtkPWNbMTk3ODA+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE5NzYwPj4wXSYxKT09MCkpe2Q9Y1sxOTc2OD4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTk3NDg+PjBdJjEpPT0wKSl7ZD1jWzE5NzU2Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxOTczNj4+MF0mMSk9PTApKXtkPWNbMTk3NDQ+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE5NzI0Pj4wXSYxKT09MCkpe2Q9Y1sxOTczMj4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2lmKChhWzE5NzEyXSYxKT09MCl7aT1iO3JldHVybn1kPWNbMTk3MjA+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59dm4oZCk7aT1iO3JldHVybn1mdW5jdGlvbiBTbShiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wO2I9aTtpZighKChhWzIwMzgwPj4wXSYxKT09MCk/KHE9Y1syMDM4OD4+Ml18MCwocXwwKSE9MCk6MCl7dm4ocSl9aWYoISgoYVsyMDM2OD4+MF0mMSk9PTApPyhwPWNbMjAzNzY+PjJdfDAsKHB8MCkhPTApOjApe3ZuKHApfWlmKCEoKGFbMjAzNTY+PjBdJjEpPT0wKT8obz1jWzIwMzY0Pj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhWzIwMzQ0Pj4wXSYxKT09MCk/KG49Y1syMDM1Mj4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoISgoYVsyMDMzMj4+MF0mMSk9PTApPyhtPWNbMjAzNDA+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbMjAzMjA+PjBdJjEpPT0wKT8oZD1jWzIwMzI4Pj4yXXwwLChkfDApIT0wKTowKXt2bihkKX1pZighKChhWzIwMzA4Pj4wXSYxKT09MCk/KGw9Y1syMDMxNj4+Ml18MCwobHwwKSE9MCk6MCl7dm4obCl9aWYoISgoYVsyMDI5Nj4+MF0mMSk9PTApPyhrPWNbMjAzMDQ+PjJdfDAsKGt8MCkhPTApOjApe3ZuKGspfWlmKCEoKGFbMjAyODQ+PjBdJjEpPT0wKT8oaj1jWzIwMjkyPj4yXXwwLChqfDApIT0wKTowKXt2bihqKX1pZighKChhWzIwMjcyPj4wXSYxKT09MCk/KGg9Y1syMDI4MD4+Ml18MCwoaHwwKSE9MCk6MCl7dm4oaCl9aWYoISgoYVsyMDI2MD4+MF0mMSk9PTApPyhnPWNbMjAyNjg+PjJdfDAsKGd8MCkhPTApOjApe3ZuKGcpfWlmKCEoKGFbMjAyNDg+PjBdJjEpPT0wKT8oZj1jWzIwMjU2Pj4yXXwwLChmfDApIT0wKTowKXt2bihmKX1pZighKChhWzIwMjM2Pj4wXSYxKT09MCk/KGU9Y1syMDI0ND4+Ml18MCwoZXwwKSE9MCk6MCl7dm4oZSl9aWYoKGFbMjAyMjRdJjEpPT0wKXtpPWI7cmV0dXJufWQ9Y1syMDIzMj4+Ml18MDtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFRtKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7Yj1pO2lmKCEoKGFbMjA5MTY+PjBdJjEpPT0wKT8ocT1jWzIwOTI0Pj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1pZighKChhWzIwOTA0Pj4wXSYxKT09MCk/KHA9Y1syMDkxMj4+Ml18MCwocHwwKSE9MCk6MCl7dm4ocCl9aWYoISgoYVsyMDg5Mj4+MF0mMSk9PTApPyhvPWNbMjA5MDA+PjJdfDAsKG98MCkhPTApOjApe3ZuKG8pfWlmKCEoKGFbMjA4ODA+PjBdJjEpPT0wKT8obj1jWzIwODg4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhWzIwODY4Pj4wXSYxKT09MCk/KG09Y1syMDg3Nj4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoISgoYVsyMDg1Nj4+MF0mMSk9PTApPyhkPWNbMjA4NjQ+PjJdfDAsKGR8MCkhPTApOjApe3ZuKGQpfWlmKCEoKGFbMjA4NDQ+PjBdJjEpPT0wKT8obD1jWzIwODUyPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZighKChhWzIwODMyPj4wXSYxKT09MCk/KGs9Y1syMDg0MD4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9aWYoISgoYVsyMDgyMD4+MF0mMSk9PTApPyhqPWNbMjA4Mjg+PjJdfDAsKGp8MCkhPTApOjApe3ZuKGopfWlmKCEoKGFbMjA4MDg+PjBdJjEpPT0wKT8oaD1jWzIwODE2Pj4yXXwwLChofDApIT0wKTowKXt2bihoKX1pZighKChhWzIwNzk2Pj4wXSYxKT09MCk/KGc9Y1syMDgwND4+Ml18MCwoZ3wwKSE9MCk6MCl7dm4oZyl9aWYoISgoYVsyMDc4ND4+MF0mMSk9PTApPyhmPWNbMjA3OTI+PjJdfDAsKGZ8MCkhPTApOjApe3ZuKGYpfWlmKCEoKGFbMjA3NzI+PjBdJjEpPT0wKT8oZT1jWzIwNzgwPj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pZigoYVsyMDc2MF0mMSk9PTApe2k9YjtyZXR1cm59ZD1jWzIwNzY4Pj4yXXwwO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gVW0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTA7Zz1pO2k9aSsxNnwwO2g9ZztjW2g+PjJdPWI7Zj0oZnwwKT09MD8yMTI4ODpmO2o9Y1tmPj4yXXwwO2E6ZG97aWYoKGR8MCk9PTApe2lmKChqfDApPT0wKXtrPTA7aT1nO3JldHVybiBrfDB9fWVsc2V7aWYoKGJ8MCk9PTApe2NbaD4+Ml09aH1lbHNle2g9Yn1pZigoZXwwKT09MCl7az0tMjtpPWc7cmV0dXJuIGt8MH1kb3tpZigoanwwKT09MCl7Yj1hW2Q+PjBdfDA7aj1iJjI1NTtpZihiPDwyND4+MjQ+LTEpe2NbaD4+Ml09ajtrPWI8PDI0Pj4yNCE9MCYxO2k9ZztyZXR1cm4ga3wwfWVsc2V7aj1qKyAtMTk0fDA7aWYoaj4+PjA+NTApe2JyZWFrIGF9Yj1lKyAtMXwwO2o9Y1syMTA3Misoajw8Mik+PjJdfDA7ZD1kKzF8MDticmVha319ZWxzZXtiPWV9fXdoaWxlKDApO2I6ZG97aWYoKGJ8MCkhPTApe2s9YVtkPj4wXXwwO2w9KGsmMjU1KT4+PjM7aWYoKGwrIC0xNnxsKyhqPj4yNikpPj4+MD43KXticmVhayBhfXdoaWxlKDEpe2Q9ZCsxfDA7aj0oayYyNTUpKyAtMTI4fGo8PDY7Yj1iKyAtMXwwO2lmKChqfDApPj0wKXticmVha31pZigoYnwwKT09MCl7YnJlYWsgYn1rPWFbZD4+MF18MDtpZigoKGsmMjU1KSsgLTEyOHwwKT4+PjA+NjMpe2JyZWFrIGF9fWNbZj4+Ml09MDtjW2g+PjJdPWo7bD1lLWJ8MDtpPWc7cmV0dXJuIGx8MH19d2hpbGUoMCk7Y1tmPj4yXT1qO2w9LTI7aT1nO3JldHVybiBsfDB9fXdoaWxlKDApO2NbZj4+Ml09MDtjWyhiYigpfDApPj4yXT04NDtsPS0xO2k9ZztyZXR1cm4gbHwwfWZ1bmN0aW9uIFZtKGIsZSxmLGcpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MCxsPTAsbT0wO2g9aTtrPWNbZT4+Ml18MDtpZigoZ3wwKSE9MD8obD1jW2c+PjJdfDAsKGx8MCkhPTApOjApe2lmKChifDApPT0wKXtqPWY7Zz0xNn1lbHNle2NbZz4+Ml09MDtqPWY7Zz0zNX19ZWxzZXtpZigoYnwwKT09MCl7aj1mO2c9N31lbHNle2o9ZjtnPTZ9fWE6d2hpbGUoMSl7aWYoKGd8MCk9PTYpe2lmKChqfDApPT0wKXtnPTUzO2JyZWFrfXdoaWxlKDEpe2c9YVtrPj4wXXwwO2I6ZG97aWYoKChnJjI1NSkrIC0xfDApPj4+MDwxMjc/KGsmM3wwKT09MCZqPj4+MD4zOjApe2Rve2c9Y1trPj4yXXwwO2lmKCgoZysgLTE2ODQzMDA5fGcpJi0yMTM5MDYyMTQ0fDApIT0wKXtnPWcmMjU1O2JyZWFrIGJ9Y1tiPj4yXT1nJjI1NTtjW2IrND4+Ml09ZFtrKzE+PjBdfDA7Y1tiKzg+PjJdPWRbaysyPj4wXXwwO2w9aztrPWsrNHwwO209YjtiPWIrMTZ8MDtjW20rMTI+PjJdPWRbbCszPj4wXXwwO2o9aisgLTR8MH13aGlsZShqPj4+MD4zKTtnPWFbaz4+MF18MH19d2hpbGUoMCk7bD1nJjI1NTtpZighKChsKyAtMXwwKT4+PjA8MTI3KSl7YnJlYWt9Y1tiPj4yXT1sO2o9aisgLTF8MDtpZigoanwwKT09MCl7Zz01MzticmVhayBhfWVsc2V7Yj1iKzR8MDtrPWsrMXwwfX1sPWwrIC0xOTR8MDtpZihsPj4+MD41MCl7bD1nO2c9NDc7YnJlYWt9bD1jWzIxMDcyKyhsPDwyKT4+Ml18MDtrPWsrMXwwO2c9MzU7Y29udGludWV9ZWxzZSBpZigoZ3wwKT09Nyl7bD1hW2s+PjBdfDA7aWYoKChsJjI1NSkrIC0xfDApPj4+MDwxMjc/KGsmM3wwKT09MDowKXtsPWNbaz4+Ml18MDtpZigoKGwrIC0xNjg0MzAwOXxsKSYtMjEzOTA2MjE0NHwwKT09MCl7ZG97az1rKzR8MDtqPWorIC00fDA7bD1jW2s+PjJdfDB9d2hpbGUoKChsKyAtMTY4NDMwMDl8bCkmLTIxMzkwNjIxNDR8MCk9PTApfWc9bCYyNTU7bD1sJjI1NX1lbHNle2c9bH1sPWwmMjU1O2lmKChsKyAtMXwwKT4+PjA8MTI3KXtqPWorIC0xfDA7az1rKzF8MDtnPTc7Y29udGludWV9bD1sKyAtMTk0fDA7aWYobD4+PjA+NTApe2w9ZztnPTQ3O2JyZWFrfWw9Y1syMTA3MisobDw8Mik+PjJdfDA7az1rKzF8MDtnPTE2O2NvbnRpbnVlfWVsc2UgaWYoKGd8MCk9PTE2KXttPShkW2s+PjBdfDApPj4+MztpZigobSsgLTE2fG0rKGw+PjI2KSk+Pj4wPjcpe2c9MTc7YnJlYWt9Zz1rKzF8MDtpZigobCYzMzU1NDQzMnwwKSE9MCl7aWYoKChkW2c+PjBdfDApKyAtMTI4fDApPj4+MD42Myl7Zz0yMDticmVha31nPWsrMnwwO2lmKChsJjUyNDI4OHwwKT09MCl7az1nfWVsc2V7aWYoKChkW2c+PjBdfDApKyAtMTI4fDApPj4+MD42Myl7Zz0yMzticmVha31rPWsrM3wwfX1lbHNle2s9Z31qPWorIC0xfDA7Zz03O2NvbnRpbnVlfWVsc2UgaWYoKGd8MCk9PTM1KXttPWRbaz4+MF18MDtnPW0+Pj4zO2lmKChnKyAtMTZ8ZysobD4+MjYpKT4+PjA+Nyl7Zz0zNjticmVha31nPWsrMXwwO2w9bSsgLTEyOHxsPDw2O2lmKChsfDApPDApe209KGRbZz4+MF18MCkrIC0xMjh8MDtpZihtPj4+MD42Myl7Zz0zOTticmVha31nPWsrMnwwO2w9bXxsPDw2O2lmKChsfDApPDApe2c9KGRbZz4+MF18MCkrIC0xMjh8MDtpZihnPj4+MD42Myl7Zz00MjticmVha31sPWd8bDw8NjtrPWsrM3wwfWVsc2V7az1nfX1lbHNle2s9Z31jW2I+PjJdPWw7Yj1iKzR8MDtqPWorIC0xfDA7Zz02O2NvbnRpbnVlfX1pZigoZ3wwKT09MTcpe2s9aysgLTF8MDtnPTQ1fWVsc2UgaWYoKGd8MCk9PTIwKXtrPWsrIC0xfDA7Zz00NX1lbHNlIGlmKChnfDApPT0yMyl7az1rKyAtMXwwO2c9NDV9ZWxzZSBpZigoZ3wwKT09MzYpe2s9aysgLTF8MDtnPTQ1fWVsc2UgaWYoKGd8MCk9PTM5KXtrPWsrIC0xfDA7Zz00NX1lbHNlIGlmKChnfDApPT00Mil7az1rKyAtMXwwO2c9NDV9ZWxzZSBpZigoZ3wwKT09NTMpe2k9aDtyZXR1cm4gZnwwfWlmKChnfDApPT00NSl7aWYoKGx8MCk9PTApe2w9YVtrPj4wXXwwO2c9NDd9fWlmKChnfDApPT00Nyl7aWYobDw8MjQ+PjI0PT0wKXtpZigoYnwwKSE9MCl7Y1tiPj4yXT0wO2NbZT4+Ml09MH1tPWYtanwwO2k9aDtyZXR1cm4gbXwwfX1jWyhiYigpfDApPj4yXT04NDtpZigoYnwwKT09MCl7bT0tMTtpPWg7cmV0dXJuIG18MH1jW2U+PjJdPWs7bT0tMTtpPWg7cmV0dXJuIG18MH1mdW5jdGlvbiBXbShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTA7ZT1pO2lmKChifDApPT0wKXtiPTE7aT1lO3JldHVybiBifDB9aWYoZD4+PjA8MTI4KXthW2I+PjBdPWQ7Yj0xO2k9ZTtyZXR1cm4gYnwwfWlmKGQ+Pj4wPDIwNDgpe2FbYj4+MF09ZD4+PjZ8MTkyO2FbYisxPj4wXT1kJjYzfDEyODtiPTI7aT1lO3JldHVybiBifDB9aWYoZD4+PjA8NTUyOTZ8KGQrIC01NzM0NHwwKT4+PjA8ODE5Mil7YVtiPj4wXT1kPj4+MTJ8MjI0O2FbYisxPj4wXT1kPj4+NiY2M3wxMjg7YVtiKzI+PjBdPWQmNjN8MTI4O2I9MztpPWU7cmV0dXJuIGJ8MH1pZigoZCsgLTY1NTM2fDApPj4+MDwxMDQ4NTc2KXthW2I+PjBdPWQ+Pj4xOHwyNDA7YVtiKzE+PjBdPWQ+Pj4xMiY2M3wxMjg7YVtiKzI+PjBdPWQ+Pj42JjYzfDEyODthW2IrMz4+MF09ZCY2M3wxMjg7Yj00O2k9ZTtyZXR1cm4gYnwwfWVsc2V7Y1soYmIoKXwwKT4+Ml09ODQ7Yj0tMTtpPWU7cmV0dXJuIGJ8MH1yZXR1cm4gMH1mdW5jdGlvbiBYbShhKXthPWF8MDt2YXIgYj0wO2I9aTtSYihhfDApO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFltKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBabShhKXthPWF8MDtyZXR1cm4gMjEzMjB9ZnVuY3Rpb24gX20oYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uICRtKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBhbihhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gYm4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gY24oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZG4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZW4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZm4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZ24oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybihhfDApPT0oYnwwKXwwfWZ1bmN0aW9uIGhuKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wO2U9aTtpPWkrNjR8MDtmPWU7aWYoKGF8MCk9PShifDApKXtoPTE7aT1lO3JldHVybiBofDB9aWYoKGJ8MCk9PTApe2g9MDtpPWU7cmV0dXJuIGh8MH1iPW5uKGIsMjE0ODgpfDA7aWYoKGJ8MCk9PTApe2g9MDtpPWU7cmV0dXJuIGh8MH1oPWYrMHwwO2c9aCs1NnwwO2Rve2NbaD4+Ml09MDtoPWgrNHwwfXdoaWxlKChofDApPChnfDApKTtjW2Y+PjJdPWI7Y1tmKzg+PjJdPWE7Y1tmKzEyPj4yXT0tMTtjW2YrNDg+PjJdPTE7emNbY1soY1tiPj4yXXwwKSsyOD4+Ml0mMzFdKGIsZixjW2Q+PjJdfDAsMSk7aWYoKGNbZisyND4+Ml18MCkhPTEpe2g9MDtpPWU7cmV0dXJuIGh8MH1jW2Q+PjJdPWNbZisxNj4+Ml07aD0xO2k9ZTtyZXR1cm4gaHwwfWZ1bmN0aW9uIGpuKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wO2c9aTtpZigoY1tkKzg+PjJdfDApIT0oYnwwKSl7aT1nO3JldHVybn1iPWQrMTZ8MDtoPWNbYj4+Ml18MDtpZigoaHwwKT09MCl7Y1tiPj4yXT1lO2NbZCsyND4+Ml09ZjtjW2QrMzY+PjJdPTE7aT1nO3JldHVybn1pZigoaHwwKSE9KGV8MCkpe2g9ZCszNnwwO2NbaD4+Ml09KGNbaD4+Ml18MCkrMTtjW2QrMjQ+PjJdPTI7YVtkKzU0Pj4wXT0xO2k9ZztyZXR1cm59ZT1kKzI0fDA7aWYoKGNbZT4+Ml18MCkhPTIpe2k9ZztyZXR1cm59Y1tlPj4yXT1mO2k9ZztyZXR1cm59ZnVuY3Rpb24ga24oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTA7Zz1pO2lmKChifDApIT0oY1tkKzg+PjJdfDApKXtoPWNbYis4Pj4yXXwwO3pjW2NbKGNbaD4+Ml18MCkrMjg+PjJdJjMxXShoLGQsZSxmKTtpPWc7cmV0dXJufWI9ZCsxNnwwO2g9Y1tiPj4yXXwwO2lmKChofDApPT0wKXtjW2I+PjJdPWU7Y1tkKzI0Pj4yXT1mO2NbZCszNj4+Ml09MTtpPWc7cmV0dXJufWlmKChofDApIT0oZXwwKSl7aD1kKzM2fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2NbZCsyND4+Ml09MjthW2QrNTQ+PjBdPTE7aT1nO3JldHVybn1lPWQrMjR8MDtpZigoY1tlPj4yXXwwKSE9Mil7aT1nO3JldHVybn1jW2U+PjJdPWY7aT1nO3JldHVybn1mdW5jdGlvbiBsbihiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7Zz1pO2lmKChifDApPT0oY1tkKzg+PjJdfDApKXtiPWQrMTZ8MDtoPWNbYj4+Ml18MDtpZigoaHwwKT09MCl7Y1tiPj4yXT1lO2NbZCsyND4+Ml09ZjtjW2QrMzY+PjJdPTE7aT1nO3JldHVybn1pZigoaHwwKSE9KGV8MCkpe2w9ZCszNnwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTtjW2QrMjQ+PjJdPTI7YVtkKzU0Pj4wXT0xO2k9ZztyZXR1cm59ZT1kKzI0fDA7aWYoKGNbZT4+Ml18MCkhPTIpe2k9ZztyZXR1cm59Y1tlPj4yXT1mO2k9ZztyZXR1cm59aj1jW2IrMTI+PjJdfDA7aD1iKyhqPDwzKSsxNnwwO2s9Y1tiKzIwPj4yXXwwO2w9az4+ODtpZigoayYxfDApIT0wKXtsPWNbKGNbZT4+Ml18MCkrbD4+Ml18MH1tPWNbYisxNj4+Ml18MDt6Y1tjWyhjW20+PjJdfDApKzI4Pj4yXSYzMV0obSxkLGUrbHwwLChrJjJ8MCkhPTA/ZjoyKTtpZigoanwwKTw9MSl7aT1nO3JldHVybn1qPWQrNTR8MDtrPWIrMjR8MDt3aGlsZSgxKXtiPWNbays0Pj4yXXwwO2w9Yj4+ODtpZigoYiYxfDApIT0wKXtsPWNbKGNbZT4+Ml18MCkrbD4+Ml18MH1tPWNbaz4+Ml18MDt6Y1tjWyhjW20+PjJdfDApKzI4Pj4yXSYzMV0obSxkLGUrbHwwLChiJjJ8MCkhPTA/ZjoyKTtpZigoYVtqPj4wXXwwKSE9MCl7Zj0xNjticmVha31rPWsrOHwwO2lmKCEoaz4+PjA8aD4+PjApKXtmPTE2O2JyZWFrfX1pZigoZnwwKT09MTYpe2k9ZztyZXR1cm59fWZ1bmN0aW9uIG1uKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTA7ZT1pO2k9aSs2NHwwO2g9ZTtjW2Q+PjJdPWNbY1tkPj4yXT4+Ml07aWYoISgoYXwwKT09KGJ8MCl8KGJ8MCk9PTIxNzkyKSl7aWYoKChifDApIT0wPyhrPW5uKGIsMjE2MDApfDAsKGt8MCkhPTApOjApPyhjW2srOD4+Ml0mfmNbYSs4Pj4yXXwwKT09MDowKXtiPWNbYSsxMj4+Ml18MDtrPWsrMTJ8MDtpZighKChifDApPT0yMTc3Nj8xOihifDApPT0oY1trPj4yXXwwKSkpe2lmKCgoKGJ8MCkhPTA/KGc9bm4oYiwyMTQ4OCl8MCwoZ3wwKSE9MCk6MCk/KGo9Y1trPj4yXXwwLChqfDApIT0wKTowKT8oZj1ubihqLDIxNDg4KXwwLChmfDApIT0wKTowKXtrPWgrMHwwO2o9ays1NnwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChqfDApKTtjW2g+PjJdPWY7Y1toKzg+PjJdPWc7Y1toKzEyPj4yXT0tMTtjW2grNDg+PjJdPTE7emNbY1soY1tmPj4yXXwwKSsyOD4+Ml0mMzFdKGYsaCxjW2Q+PjJdfDAsMSk7aWYoKGNbaCsyND4+Ml18MCk9PTEpe2NbZD4+Ml09Y1toKzE2Pj4yXTtkPTF9ZWxzZXtkPTB9fWVsc2V7ZD0wfX1lbHNle2Q9MX19ZWxzZXtkPTB9fWVsc2V7ZD0xfWk9ZTtyZXR1cm4gZHwwfWZ1bmN0aW9uIG5uKGQsZSl7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wO2Y9aTtpPWkrNjR8MDttPWY7Zz1jW2Q+PjJdfDA7aD1kKyhjW2crIC04Pj4yXXwwKXwwO2c9Y1tnKyAtND4+Ml18MDtjW20+PjJdPWU7Y1ttKzQ+PjJdPWQ7Y1ttKzg+PjJdPTIxNDMyO3A9bSsxMnwwO249bSsxNnwwO289bSsyMHwwO2o9bSsyNHwwO2Q9bSsyOHwwO2s9bSszMnwwO2w9bSs0MHwwO3I9KGd8MCk9PShlfDApO2U9cCswfDA7cT1lKzQwfDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KHF8MCkpO2JbcCs0MD4+MV09MDthW3ArNDI+PjBdPTA7ZG97aWYocil7Y1ttKzQ4Pj4yXT0xO3djW2NbKGNbZz4+Ml18MCkrMjA+PjJdJjYzXShnLG0saCxoLDEsMCk7ZD0oY1tqPj4yXXwwKT09MT9oOjB9ZWxzZXtqY1tjWyhjW2c+PjJdfDApKzI0Pj4yXSYzMV0oZyxtLGgsMSwwKTtnPWNbbSszNj4+Ml18MDtpZigoZ3wwKT09MCl7aWYoKGNbbD4+Ml18MCkhPTEpe2Q9MDticmVha31pZigoY1tkPj4yXXwwKSE9MSl7ZD0wO2JyZWFrfWQ9KGNbaz4+Ml18MCk9PTE/Y1tvPj4yXXwwOjA7YnJlYWt9ZWxzZSBpZigoZ3wwKSE9MSl7ZD0wO2JyZWFrfWlmKChjW2o+PjJdfDApIT0xKXtpZigoY1tsPj4yXXwwKSE9MCl7ZD0wO2JyZWFrfWlmKChjW2Q+PjJdfDApIT0xKXtkPTA7YnJlYWt9aWYoKGNbaz4+Ml18MCkhPTEpe2Q9MDticmVha319ZD1jW24+PjJdfDB9fXdoaWxlKDApO2k9ZjtyZXR1cm4gZHwwfWZ1bmN0aW9uIG9uKGIsZCxlLGYsZyl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MDtoPWk7aWYoKGJ8MCk9PShjW2QrOD4+Ml18MCkpe2lmKChjW2QrND4+Ml18MCkhPShlfDApKXtpPWg7cmV0dXJufWU9ZCsyOHwwO2lmKChjW2U+PjJdfDApPT0xKXtpPWg7cmV0dXJufWNbZT4+Ml09ZjtpPWg7cmV0dXJufWlmKChifDApPT0oY1tkPj4yXXwwKSl7aWYoKGNbZCsxNj4+Ml18MCkhPShlfDApPyhsPWQrMjB8MCwoY1tsPj4yXXwwKSE9KGV8MCkpOjApe2NbZCszMj4+Ml09ZjtrPWQrNDR8MDtpZigoY1trPj4yXXwwKT09NCl7aT1oO3JldHVybn13PWNbYisxMj4+Ml18MDtwPWIrKHc8PDMpKzE2fDA7YTpkb3tpZigod3wwKT4wKXtuPWQrNTJ8MDtxPWQrNTN8MDtvPWQrNTR8MDt0PWIrOHwwO3I9ZCsyNHwwO3U9MDtzPTA7Yj1iKzE2fDA7Yjpkb3thW24+PjBdPTA7YVtxPj4wXT0wO3Y9Y1tiKzQ+PjJdfDA7dz12Pj44O2lmKCh2JjF8MCkhPTApe3c9Y1soY1tlPj4yXXwwKSt3Pj4yXXwwfXg9Y1tiPj4yXXwwO3djW2NbKGNbeD4+Ml18MCkrMjA+PjJdJjYzXSh4LGQsZSxlK3d8MCwyLSh2Pj4+MSYxKXwwLGcpO2lmKChhW28+PjBdfDApIT0wKXticmVha31kb3tpZigoYVtxPj4wXXwwKSE9MCl7aWYoKGFbbj4+MF18MCk9PTApe2lmKChjW3Q+PjJdJjF8MCk9PTApe3M9MTticmVhayBifWVsc2V7cz0xO2JyZWFrfX1pZigoY1tyPj4yXXwwKT09MSl7Yj0yNzticmVhayBhfWlmKChjW3Q+PjJdJjJ8MCk9PTApe2I9Mjc7YnJlYWsgYX1lbHNle3U9MTtzPTF9fX13aGlsZSgwKTtiPWIrOHwwfXdoaWxlKGI+Pj4wPHA+Pj4wKTtpZih1KXtqPXM7Yj0yNn1lbHNle209cztiPTIzfX1lbHNle209MDtiPTIzfX13aGlsZSgwKTtpZigoYnwwKT09MjMpe2NbbD4+Ml09ZTt4PWQrNDB8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoKGNbZCszNj4+Ml18MCk9PTE/KGNbZCsyND4+Ml18MCk9PTI6MCl7YVtkKzU0Pj4wXT0xO2lmKG0pe2I9Mjd9ZWxzZXtiPTI4fX1lbHNle2o9bTtiPTI2fX1pZigoYnwwKT09MjYpe2lmKGope2I9Mjd9ZWxzZXtiPTI4fX1pZigoYnwwKT09Mjcpe2Nbaz4+Ml09MztpPWg7cmV0dXJufWVsc2UgaWYoKGJ8MCk9PTI4KXtjW2s+PjJdPTQ7aT1oO3JldHVybn19aWYoKGZ8MCkhPTEpe2k9aDtyZXR1cm59Y1tkKzMyPj4yXT0xO2k9aDtyZXR1cm59bT1jW2IrMTI+PjJdfDA7aj1iKyhtPDwzKSsxNnwwO2w9Y1tiKzIwPj4yXXwwO249bD4+ODtpZigobCYxfDApIT0wKXtuPWNbKGNbZT4+Ml18MCkrbj4+Ml18MH14PWNbYisxNj4+Ml18MDtqY1tjWyhjW3g+PjJdfDApKzI0Pj4yXSYzMV0oeCxkLGUrbnwwLChsJjJ8MCkhPTA/ZjoyLGcpO2w9YisyNHwwO2lmKChtfDApPD0xKXtpPWg7cmV0dXJufW09Y1tiKzg+PjJdfDA7aWYoKG0mMnwwKT09MD8oaz1kKzM2fDAsKGNbaz4+Ml18MCkhPTEpOjApe2lmKChtJjF8MCk9PTApe209ZCs1NHwwO2I9bDt3aGlsZSgxKXtpZigoYVttPj4wXXwwKSE9MCl7Yj01MzticmVha31pZigoY1trPj4yXXwwKT09MSl7Yj01MzticmVha31uPWNbYis0Pj4yXXwwO289bj4+ODtpZigobiYxfDApIT0wKXtvPWNbKGNbZT4+Ml18MCkrbz4+Ml18MH14PWNbYj4+Ml18MDtqY1tjWyhjW3g+PjJdfDApKzI0Pj4yXSYzMV0oeCxkLGUrb3wwLChuJjJ8MCkhPTA/ZjoyLGcpO2I9Yis4fDA7aWYoIShiPj4+MDxqPj4+MCkpe2I9NTM7YnJlYWt9fWlmKChifDApPT01Myl7aT1oO3JldHVybn19bj1kKzI0fDA7bz1kKzU0fDA7Yj1sO3doaWxlKDEpe2lmKChhW28+PjBdfDApIT0wKXtiPTUzO2JyZWFrfWlmKChjW2s+PjJdfDApPT0xPyhjW24+PjJdfDApPT0xOjApe2I9NTM7YnJlYWt9bT1jW2IrND4+Ml18MDtwPW0+Pjg7aWYoKG0mMXwwKSE9MCl7cD1jWyhjW2U+PjJdfDApK3A+PjJdfDB9eD1jW2I+PjJdfDA7amNbY1soY1t4Pj4yXXwwKSsyND4+Ml0mMzFdKHgsZCxlK3B8MCwobSYyfDApIT0wP2Y6MixnKTtiPWIrOHwwO2lmKCEoYj4+PjA8aj4+PjApKXtiPTUzO2JyZWFrfX1pZigoYnwwKT09NTMpe2k9aDtyZXR1cm59fWs9ZCs1NHwwO3doaWxlKDEpe2lmKChhW2s+PjBdfDApIT0wKXtiPTUzO2JyZWFrfW09Y1tsKzQ+PjJdfDA7Yj1tPj44O2lmKChtJjF8MCkhPTApe2I9Y1soY1tlPj4yXXwwKStiPj4yXXwwfXg9Y1tsPj4yXXwwO2pjW2NbKGNbeD4+Ml18MCkrMjQ+PjJdJjMxXSh4LGQsZStifDAsKG0mMnwwKSE9MD9mOjIsZyk7bD1sKzh8MDtpZighKGw+Pj4wPGo+Pj4wKSl7Yj01MzticmVha319aWYoKGJ8MCk9PTUzKXtpPWg7cmV0dXJufX1mdW5jdGlvbiBwbihiLGQsZSxmLGcpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MCxsPTAsbT0wO2g9aTtpZigoYnwwKT09KGNbZCs4Pj4yXXwwKSl7aWYoKGNbZCs0Pj4yXXwwKSE9KGV8MCkpe2k9aDtyZXR1cm59aj1kKzI4fDA7aWYoKGNbaj4+Ml18MCk9PTEpe2k9aDtyZXR1cm59Y1tqPj4yXT1mO2k9aDtyZXR1cm59aWYoKGJ8MCkhPShjW2Q+PjJdfDApKXtsPWNbYis4Pj4yXXwwO2pjW2NbKGNbbD4+Ml18MCkrMjQ+PjJdJjMxXShsLGQsZSxmLGcpO2k9aDtyZXR1cm59aWYoKGNbZCsxNj4+Ml18MCkhPShlfDApPyhrPWQrMjB8MCwoY1trPj4yXXwwKSE9KGV8MCkpOjApe2NbZCszMj4+Ml09ZjtmPWQrNDR8MDtpZigoY1tmPj4yXXwwKT09NCl7aT1oO3JldHVybn1sPWQrNTJ8MDthW2w+PjBdPTA7bT1kKzUzfDA7YVttPj4wXT0wO2I9Y1tiKzg+PjJdfDA7d2NbY1soY1tiPj4yXXwwKSsyMD4+Ml0mNjNdKGIsZCxlLGUsMSxnKTtpZigoYVttPj4wXXwwKSE9MCl7aWYoKGFbbD4+MF18MCk9PTApe2I9MTtqPTEzfX1lbHNle2I9MDtqPTEzfWRve2lmKChqfDApPT0xMyl7Y1trPj4yXT1lO209ZCs0MHwwO2NbbT4+Ml09KGNbbT4+Ml18MCkrMTtpZigoY1tkKzM2Pj4yXXwwKT09MT8oY1tkKzI0Pj4yXXwwKT09MjowKXthW2QrNTQ+PjBdPTE7aWYoYil7YnJlYWt9fWVsc2V7aj0xNn1pZigoanwwKT09MTY/YjowKXticmVha31jW2Y+PjJdPTQ7aT1oO3JldHVybn19d2hpbGUoMCk7Y1tmPj4yXT0zO2k9aDtyZXR1cm59aWYoKGZ8MCkhPTEpe2k9aDtyZXR1cm59Y1tkKzMyPj4yXT0xO2k9aDtyZXR1cm59ZnVuY3Rpb24gcW4oYixkLGUsZixnKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wO2c9aTtpZigoY1tkKzg+PjJdfDApPT0oYnwwKSl7aWYoKGNbZCs0Pj4yXXwwKSE9KGV8MCkpe2k9ZztyZXR1cm59ZD1kKzI4fDA7aWYoKGNbZD4+Ml18MCk9PTEpe2k9ZztyZXR1cm59Y1tkPj4yXT1mO2k9ZztyZXR1cm59aWYoKGNbZD4+Ml18MCkhPShifDApKXtpPWc7cmV0dXJufWlmKChjW2QrMTY+PjJdfDApIT0oZXwwKT8oaD1kKzIwfDAsKGNbaD4+Ml18MCkhPShlfDApKTowKXtjW2QrMzI+PjJdPWY7Y1toPj4yXT1lO2I9ZCs0MHwwO2NbYj4+Ml09KGNbYj4+Ml18MCkrMTtpZigoY1tkKzM2Pj4yXXwwKT09MT8oY1tkKzI0Pj4yXXwwKT09MjowKXthW2QrNTQ+PjBdPTF9Y1tkKzQ0Pj4yXT00O2k9ZztyZXR1cm59aWYoKGZ8MCkhPTEpe2k9ZztyZXR1cm59Y1tkKzMyPj4yXT0xO2k9ZztyZXR1cm59ZnVuY3Rpb24gcm4oYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtqPWk7aWYoKGJ8MCkhPShjW2QrOD4+Ml18MCkpe209ZCs1MnwwO2w9YVttPj4wXXwwO289ZCs1M3wwO249YVtvPj4wXXwwO3E9Y1tiKzEyPj4yXXwwO2s9YisocTw8MykrMTZ8MDthW20+PjBdPTA7YVtvPj4wXT0wO3A9Y1tiKzIwPj4yXXwwO3I9cD4+ODtpZigocCYxfDApIT0wKXtyPWNbKGNbZj4+Ml18MCkrcj4+Ml18MH10PWNbYisxNj4+Ml18MDt3Y1tjWyhjW3Q+PjJdfDApKzIwPj4yXSY2M10odCxkLGUsZityfDAsKHAmMnwwKSE9MD9nOjIsaCk7YTpkb3tpZigocXwwKT4xKXtxPWQrMjR8MDtwPWIrOHwwO3I9ZCs1NHwwO2I9YisyNHwwO2Rve2lmKChhW3I+PjBdfDApIT0wKXticmVhayBhfWlmKChhW20+PjBdfDApPT0wKXtpZigoYVtvPj4wXXwwKSE9MD8oY1twPj4yXSYxfDApPT0wOjApe2JyZWFrIGF9fWVsc2V7aWYoKGNbcT4+Ml18MCk9PTEpe2JyZWFrIGF9aWYoKGNbcD4+Ml0mMnwwKT09MCl7YnJlYWsgYX19YVttPj4wXT0wO2Fbbz4+MF09MDtzPWNbYis0Pj4yXXwwO3Q9cz4+ODtpZigocyYxfDApIT0wKXt0PWNbKGNbZj4+Ml18MCkrdD4+Ml18MH11PWNbYj4+Ml18MDt3Y1tjWyhjW3U+PjJdfDApKzIwPj4yXSY2M10odSxkLGUsZit0fDAsKHMmMnwwKSE9MD9nOjIsaCk7Yj1iKzh8MH13aGlsZShiPj4+MDxrPj4+MCl9fXdoaWxlKDApO2FbbT4+MF09bDthW28+PjBdPW47aT1qO3JldHVybn1hW2QrNTM+PjBdPTE7aWYoKGNbZCs0Pj4yXXwwKSE9KGZ8MCkpe2k9ajtyZXR1cm59YVtkKzUyPj4wXT0xO2s9ZCsxNnwwO2Y9Y1trPj4yXXwwO2lmKChmfDApPT0wKXtjW2s+PjJdPWU7Y1tkKzI0Pj4yXT1nO2NbZCszNj4+Ml09MTtpZighKChnfDApPT0xPyhjW2QrNDg+PjJdfDApPT0xOjApKXtpPWo7cmV0dXJufWFbZCs1ND4+MF09MTtpPWo7cmV0dXJufWlmKChmfDApIT0oZXwwKSl7dT1kKzM2fDA7Y1t1Pj4yXT0oY1t1Pj4yXXwwKSsxO2FbZCs1ND4+MF09MTtpPWo7cmV0dXJufWU9ZCsyNHwwO2s9Y1tlPj4yXXwwO2lmKChrfDApPT0yKXtjW2U+PjJdPWd9ZWxzZXtnPWt9aWYoISgoZ3wwKT09MT8oY1tkKzQ4Pj4yXXwwKT09MTowKSl7aT1qO3JldHVybn1hW2QrNTQ+PjBdPTE7aT1qO3JldHVybn1mdW5jdGlvbiBzbihiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MDtqPWk7aWYoKGJ8MCkhPShjW2QrOD4+Ml18MCkpe2I9Y1tiKzg+PjJdfDA7d2NbY1soY1tiPj4yXXwwKSsyMD4+Ml0mNjNdKGIsZCxlLGYsZyxoKTtpPWo7cmV0dXJufWFbZCs1Mz4+MF09MTtpZigoY1tkKzQ+PjJdfDApIT0oZnwwKSl7aT1qO3JldHVybn1hW2QrNTI+PjBdPTE7Yj1kKzE2fDA7Zj1jW2I+PjJdfDA7aWYoKGZ8MCk9PTApe2NbYj4+Ml09ZTtjW2QrMjQ+PjJdPWc7Y1tkKzM2Pj4yXT0xO2lmKCEoKGd8MCk9PTE/KGNbZCs0OD4+Ml18MCk9PTE6MCkpe2k9ajtyZXR1cm59YVtkKzU0Pj4wXT0xO2k9ajtyZXR1cm59aWYoKGZ8MCkhPShlfDApKXtoPWQrMzZ8MDtjW2g+PjJdPShjW2g+PjJdfDApKzE7YVtkKzU0Pj4wXT0xO2k9ajtyZXR1cm59ZT1kKzI0fDA7Yj1jW2U+PjJdfDA7aWYoKGJ8MCk9PTIpe2NbZT4+Ml09Z31lbHNle2c9Yn1pZighKChnfDApPT0xPyhjW2QrNDg+PjJdfDApPT0xOjApKXtpPWo7cmV0dXJufWFbZCs1ND4+MF09MTtpPWo7cmV0dXJufWZ1bmN0aW9uIHRuKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtoPWk7aWYoKGNbZCs4Pj4yXXwwKSE9KGJ8MCkpe2k9aDtyZXR1cm59YVtkKzUzPj4wXT0xO2lmKChjW2QrND4+Ml18MCkhPShmfDApKXtpPWg7cmV0dXJufWFbZCs1Mj4+MF09MTtmPWQrMTZ8MDtiPWNbZj4+Ml18MDtpZigoYnwwKT09MCl7Y1tmPj4yXT1lO2NbZCsyND4+Ml09ZztjW2QrMzY+PjJdPTE7aWYoISgoZ3wwKT09MT8oY1tkKzQ4Pj4yXXwwKT09MTowKSl7aT1oO3JldHVybn1hW2QrNTQ+PjBdPTE7aT1oO3JldHVybn1pZigoYnwwKSE9KGV8MCkpe2I9ZCszNnwwO2NbYj4+Ml09KGNbYj4+Ml18MCkrMTthW2QrNTQ+PjBdPTE7aT1oO3JldHVybn1lPWQrMjR8MDtmPWNbZT4+Ml18MDtpZigoZnwwKT09Mil7Y1tlPj4yXT1nfWVsc2V7Zz1mfWlmKCEoKGd8MCk9PTE/KGNbZCs0OD4+Ml18MCk9PTE6MCkpe2k9aDtyZXR1cm59YVtkKzU0Pj4wXT0xO2k9aDtyZXR1cm59ZnVuY3Rpb24gdW4oYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MDtiPWk7ZG97aWYoYT4+PjA8MjQ1KXtpZihhPj4+MDwxMSl7YT0xNn1lbHNle2E9YSsxMSYtOH12PWE+Pj4zO3A9Y1s1NTQyXXwwO3c9cD4+PnY7aWYoKHcmM3wwKSE9MCl7aD0odyYxXjEpK3Z8MDtnPWg8PDE7ZT0yMjIwOCsoZzw8Mil8MDtnPTIyMjA4KyhnKzI8PDIpfDA7aj1jW2c+PjJdfDA7ZD1qKzh8MDtmPWNbZD4+Ml18MDtkb3tpZigoZXwwKSE9KGZ8MCkpe2lmKGY+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9az1mKzEyfDA7aWYoKGNbaz4+Ml18MCk9PShqfDApKXtjW2s+PjJdPWU7Y1tnPj4yXT1mO2JyZWFrfWVsc2V7WGIoKX19ZWxzZXtjWzU1NDJdPXAmfigxPDxoKX19d2hpbGUoMCk7SD1oPDwzO2Nbais0Pj4yXT1IfDM7SD1qKyhIfDQpfDA7Y1tIPj4yXT1jW0g+PjJdfDE7SD1kO2k9YjtyZXR1cm4gSHwwfWlmKGE+Pj4wPihjWzIyMTc2Pj4yXXwwKT4+PjApe2lmKCh3fDApIT0wKXtoPTI8PHY7aD13PDx2JihofDAtaCk7aD0oaCYwLWgpKyAtMXwwO2Q9aD4+PjEyJjE2O2g9aD4+PmQ7Zj1oPj4+NSY4O2g9aD4+PmY7Zz1oPj4+MiY0O2g9aD4+Pmc7ZT1oPj4+MSYyO2g9aD4+PmU7aj1oPj4+MSYxO2o9KGZ8ZHxnfGV8aikrKGg+Pj5qKXwwO2g9ajw8MTtlPTIyMjA4KyhoPDwyKXwwO2g9MjIyMDgrKGgrMjw8Mil8MDtnPWNbaD4+Ml18MDtkPWcrOHwwO2Y9Y1tkPj4yXXwwO2Rve2lmKChlfDApIT0oZnwwKSl7aWYoZj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1rPWYrMTJ8MDtpZigoY1trPj4yXXwwKT09KGd8MCkpe2Nbaz4+Ml09ZTtjW2g+PjJdPWY7YnJlYWt9ZWxzZXtYYigpfX1lbHNle2NbNTU0Ml09cCZ+KDE8PGopfX13aGlsZSgwKTtoPWo8PDM7Zj1oLWF8MDtjW2crND4+Ml09YXwzO2U9ZythfDA7Y1tnKyhhfDQpPj4yXT1mfDE7Y1tnK2g+PjJdPWY7aD1jWzIyMTc2Pj4yXXwwO2lmKChofDApIT0wKXtnPWNbMjIxODg+PjJdfDA7az1oPj4+MztqPWs8PDE7aD0yMjIwOCsoajw8Mil8MDtsPWNbNTU0Ml18MDtrPTE8PGs7aWYoKGwma3wwKSE9MCl7aj0yMjIwOCsoaisyPDwyKXwwO2s9Y1tqPj4yXXwwO2lmKGs+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtEPWo7Qz1rfX1lbHNle2NbNTU0Ml09bHxrO0Q9MjIyMDgrKGorMjw8Mil8MDtDPWh9Y1tEPj4yXT1nO2NbQysxMj4+Ml09ZztjW2crOD4+Ml09QztjW2crMTI+PjJdPWh9Y1syMjE3Nj4+Ml09ZjtjWzIyMTg4Pj4yXT1lO0g9ZDtpPWI7cmV0dXJuIEh8MH1wPWNbMjIxNzI+PjJdfDA7aWYoKHB8MCkhPTApe2U9KHAmMC1wKSsgLTF8MDtHPWU+Pj4xMiYxNjtlPWU+Pj5HO0Y9ZT4+PjUmODtlPWU+Pj5GO0g9ZT4+PjImNDtlPWU+Pj5IO2Y9ZT4+PjEmMjtlPWU+Pj5mO2Q9ZT4+PjEmMTtkPWNbMjI0NzIrKChGfEd8SHxmfGQpKyhlPj4+ZCk8PDIpPj4yXXwwO2U9KGNbZCs0Pj4yXSYtOCktYXwwO2Y9ZDt3aGlsZSgxKXtnPWNbZisxNj4+Ml18MDtpZigoZ3wwKT09MCl7Zz1jW2YrMjA+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfX1mPShjW2crND4+Ml0mLTgpLWF8MDtIPWY+Pj4wPGU+Pj4wO2U9SD9mOmU7Zj1nO2Q9SD9nOmR9aD1jWzIyMTg0Pj4yXXwwO2lmKGQ+Pj4wPGg+Pj4wKXtYYigpfWY9ZCthfDA7aWYoIShkPj4+MDxmPj4+MCkpe1hiKCl9Zz1jW2QrMjQ+PjJdfDA7az1jW2QrMTI+PjJdfDA7ZG97aWYoKGt8MCk9PShkfDApKXtrPWQrMjB8MDtqPWNbaz4+Ml18MDtpZigoanwwKT09MCl7az1kKzE2fDA7aj1jW2s+PjJdfDA7aWYoKGp8MCk9PTApe0I9MDticmVha319d2hpbGUoMSl7bD1qKzIwfDA7bT1jW2w+PjJdfDA7aWYoKG18MCkhPTApe2o9bTtrPWw7Y29udGludWV9bT1qKzE2fDA7bD1jW20+PjJdfDA7aWYoKGx8MCk9PTApe2JyZWFrfWVsc2V7aj1sO2s9bX19aWYoaz4+PjA8aD4+PjApe1hiKCl9ZWxzZXtjW2s+PjJdPTA7Qj1qO2JyZWFrfX1lbHNle2o9Y1tkKzg+PjJdfDA7aWYoaj4+PjA8aD4+PjApe1hiKCl9aD1qKzEyfDA7aWYoKGNbaD4+Ml18MCkhPShkfDApKXtYYigpfWw9ays4fDA7aWYoKGNbbD4+Ml18MCk9PShkfDApKXtjW2g+PjJdPWs7Y1tsPj4yXT1qO0I9azticmVha31lbHNle1hiKCl9fX13aGlsZSgwKTtkb3tpZigoZ3wwKSE9MCl7aD1jW2QrMjg+PjJdfDA7aj0yMjQ3MisoaDw8Mil8MDtpZigoZHwwKT09KGNbaj4+Ml18MCkpe2Nbaj4+Ml09QjtpZigoQnwwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxoKTticmVha319ZWxzZXtpZihnPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWg9ZysxNnwwO2lmKChjW2g+PjJdfDApPT0oZHwwKSl7Y1toPj4yXT1CfWVsc2V7Y1tnKzIwPj4yXT1CfWlmKChCfDApPT0wKXticmVha319aWYoQj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW0IrMjQ+PjJdPWc7Zz1jW2QrMTY+PjJdfDA7ZG97aWYoKGd8MCkhPTApe2lmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW0IrMTY+PjJdPWc7Y1tnKzI0Pj4yXT1CO2JyZWFrfX19d2hpbGUoMCk7Zz1jW2QrMjA+PjJdfDA7aWYoKGd8MCkhPTApe2lmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW0IrMjA+PjJdPWc7Y1tnKzI0Pj4yXT1CO2JyZWFrfX19fXdoaWxlKDApO2lmKGU+Pj4wPDE2KXtIPWUrYXwwO2NbZCs0Pj4yXT1IfDM7SD1kKyhIKzQpfDA7Y1tIPj4yXT1jW0g+PjJdfDF9ZWxzZXtjW2QrND4+Ml09YXwzO2NbZCsoYXw0KT4+Ml09ZXwxO2NbZCsoZSthKT4+Ml09ZTtoPWNbMjIxNzY+PjJdfDA7aWYoKGh8MCkhPTApe2c9Y1syMjE4OD4+Ml18MDtsPWg+Pj4zO2o9bDw8MTtoPTIyMjA4KyhqPDwyKXwwO2s9Y1s1NTQyXXwwO2w9MTw8bDtpZigoayZsfDApIT0wKXtqPTIyMjA4KyhqKzI8PDIpfDA7az1jW2o+PjJdfDA7aWYoaz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle0E9ajt6PWt9fWVsc2V7Y1s1NTQyXT1rfGw7QT0yMjIwOCsoaisyPDwyKXwwO3o9aH1jW0E+PjJdPWc7Y1t6KzEyPj4yXT1nO2NbZys4Pj4yXT16O2NbZysxMj4+Ml09aH1jWzIyMTc2Pj4yXT1lO2NbMjIxODg+PjJdPWZ9SD1kKzh8MDtpPWI7cmV0dXJuIEh8MH19fWVsc2V7aWYoIShhPj4+MD40Mjk0OTY3MjMxKSl7ej1hKzExfDA7YT16Ji04O0I9Y1syMjE3Mj4+Ml18MDtpZigoQnwwKSE9MCl7QT0wLWF8MDt6PXo+Pj44O2lmKCh6fDApIT0wKXtpZihhPj4+MD4xNjc3NzIxNSl7Qz0zMX1lbHNle0c9KHorMTA0ODMyMHwwKT4+PjE2Jjg7SD16PDxHO0Y9KEgrNTIwMTkyfDApPj4+MTYmNDtIPUg8PEY7Qz0oSCsyNDU3NjB8MCk+Pj4xNiYyO0M9MTQtKEZ8R3xDKSsoSDw8Qz4+PjE1KXwwO0M9YT4+PihDKzd8MCkmMXxDPDwxfX1lbHNle0M9MH1EPWNbMjI0NzIrKEM8PDIpPj4yXXwwO2E6ZG97aWYoKER8MCk9PTApe0Y9MDt6PTB9ZWxzZXtpZigoQ3wwKT09MzEpe3o9MH1lbHNle3o9MjUtKEM+Pj4xKXwwfUY9MDtFPWE8PHo7ej0wO3doaWxlKDEpe0g9Y1tEKzQ+PjJdJi04O0c9SC1hfDA7aWYoRz4+PjA8QT4+PjApe2lmKChIfDApPT0oYXwwKSl7QT1HO0Y9RDt6PUQ7YnJlYWsgYX1lbHNle0E9Rzt6PUR9fUg9Y1tEKzIwPj4yXXwwO0Q9Y1tEKyhFPj4+MzE8PDIpKzE2Pj4yXXwwO0Y9KEh8MCk9PTB8KEh8MCk9PShEfDApP0Y6SDtpZigoRHwwKT09MCl7YnJlYWt9ZWxzZXtFPUU8PDF9fX19d2hpbGUoMCk7aWYoKEZ8MCk9PTAmKHp8MCk9PTApe0g9Mjw8QztCPUImKEh8MC1IKTtpZigoQnwwKT09MCl7YnJlYWt9SD0oQiYwLUIpKyAtMXwwO0Q9SD4+PjEyJjE2O0g9SD4+PkQ7Qz1IPj4+NSY4O0g9SD4+PkM7RT1IPj4+MiY0O0g9SD4+PkU7Rz1IPj4+MSYyO0g9SD4+Pkc7Rj1IPj4+MSYxO0Y9Y1syMjQ3MisoKEN8RHxFfEd8RikrKEg+Pj5GKTw8Mik+PjJdfDB9aWYoKEZ8MCkhPTApe3doaWxlKDEpe0g9KGNbRis0Pj4yXSYtOCktYXwwO0I9SD4+PjA8QT4+PjA7QT1CP0g6QTt6PUI/Rjp6O0I9Y1tGKzE2Pj4yXXwwO2lmKChCfDApIT0wKXtGPUI7Y29udGludWV9Rj1jW0YrMjA+PjJdfDA7aWYoKEZ8MCk9PTApe2JyZWFrfX19aWYoKHp8MCkhPTA/QT4+PjA8KChjWzIyMTc2Pj4yXXwwKS1hfDApPj4+MDowKXtmPWNbMjIxODQ+PjJdfDA7aWYoej4+PjA8Zj4+PjApe1hiKCl9ZD16K2F8MDtpZighKHo+Pj4wPGQ+Pj4wKSl7WGIoKX1lPWNbeisyND4+Ml18MDtoPWNbeisxMj4+Ml18MDtkb3tpZigoaHwwKT09KHp8MCkpe2g9eisyMHwwO2c9Y1toPj4yXXwwO2lmKChnfDApPT0wKXtoPXorMTZ8MDtnPWNbaD4+Ml18MDtpZigoZ3wwKT09MCl7eD0wO2JyZWFrfX13aGlsZSgxKXtqPWcrMjB8MDtrPWNbaj4+Ml18MDtpZigoa3wwKSE9MCl7Zz1rO2g9ajtjb250aW51ZX1qPWcrMTZ8MDtrPWNbaj4+Ml18MDtpZigoa3wwKT09MCl7YnJlYWt9ZWxzZXtnPWs7aD1qfX1pZihoPj4+MDxmPj4+MCl7WGIoKX1lbHNle2NbaD4+Ml09MDt4PWc7YnJlYWt9fWVsc2V7Zz1jW3orOD4+Ml18MDtpZihnPj4+MDxmPj4+MCl7WGIoKX1mPWcrMTJ8MDtpZigoY1tmPj4yXXwwKSE9KHp8MCkpe1hiKCl9aj1oKzh8MDtpZigoY1tqPj4yXXwwKT09KHp8MCkpe2NbZj4+Ml09aDtjW2o+PjJdPWc7eD1oO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2Rve2lmKChlfDApIT0wKXtnPWNbeisyOD4+Ml18MDtmPTIyNDcyKyhnPDwyKXwwO2lmKCh6fDApPT0oY1tmPj4yXXwwKSl7Y1tmPj4yXT14O2lmKCh4fDApPT0wKXtjWzIyMTcyPj4yXT1jWzIyMTcyPj4yXSZ+KDE8PGcpO2JyZWFrfX1lbHNle2lmKGU+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9Zj1lKzE2fDA7aWYoKGNbZj4+Ml18MCk9PSh6fDApKXtjW2Y+PjJdPXh9ZWxzZXtjW2UrMjA+PjJdPXh9aWYoKHh8MCk9PTApe2JyZWFrfX1pZih4Pj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWNbeCsyND4+Ml09ZTtlPWNbeisxNj4+Ml18MDtkb3tpZigoZXwwKSE9MCl7aWYoZT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbeCsxNj4+Ml09ZTtjW2UrMjQ+PjJdPXg7YnJlYWt9fX13aGlsZSgwKTtlPWNbeisyMD4+Ml18MDtpZigoZXwwKSE9MCl7aWYoZT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbeCsyMD4+Ml09ZTtjW2UrMjQ+PjJdPXg7YnJlYWt9fX19d2hpbGUoMCk7Yjpkb3tpZighKEE+Pj4wPDE2KSl7Y1t6KzQ+PjJdPWF8MztjW3orKGF8NCk+PjJdPUF8MTtjW3orKEErYSk+PjJdPUE7Zj1BPj4+MztpZihBPj4+MDwyNTYpe2g9Zjw8MTtlPTIyMjA4KyhoPDwyKXwwO2c9Y1s1NTQyXXwwO2Y9MTw8Zjtkb3tpZigoZyZmfDApPT0wKXtjWzU1NDJdPWd8Zjt3PTIyMjA4KyhoKzI8PDIpfDA7dj1lfWVsc2V7Zj0yMjIwOCsoaCsyPDwyKXwwO2c9Y1tmPj4yXXwwO2lmKCEoZz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCkpe3c9Zjt2PWc7YnJlYWt9WGIoKX19d2hpbGUoMCk7Y1t3Pj4yXT1kO2NbdisxMj4+Ml09ZDtjW3orKGErOCk+PjJdPXY7Y1t6KyhhKzEyKT4+Ml09ZTticmVha31lPUE+Pj44O2lmKChlfDApIT0wKXtpZihBPj4+MD4xNjc3NzIxNSl7ZT0zMX1lbHNle0c9KGUrMTA0ODMyMHwwKT4+PjE2Jjg7SD1lPDxHO0Y9KEgrNTIwMTkyfDApPj4+MTYmNDtIPUg8PEY7ZT0oSCsyNDU3NjB8MCk+Pj4xNiYyO2U9MTQtKEZ8R3xlKSsoSDw8ZT4+PjE1KXwwO2U9QT4+PihlKzd8MCkmMXxlPDwxfX1lbHNle2U9MH1mPTIyNDcyKyhlPDwyKXwwO2NbeisoYSsyOCk+PjJdPWU7Y1t6KyhhKzIwKT4+Ml09MDtjW3orKGErMTYpPj4yXT0wO2g9Y1syMjE3Mj4+Ml18MDtnPTE8PGU7aWYoKGgmZ3wwKT09MCl7Y1syMjE3Mj4+Ml09aHxnO2NbZj4+Ml09ZDtjW3orKGErMjQpPj4yXT1mO2NbeisoYSsxMik+PjJdPWQ7Y1t6KyhhKzgpPj4yXT1kO2JyZWFrfWY9Y1tmPj4yXXwwO2lmKChlfDApPT0zMSl7ZT0wfWVsc2V7ZT0yNS0oZT4+PjEpfDB9Yzpkb3tpZigoY1tmKzQ+PjJdJi04fDApIT0oQXwwKSl7ZT1BPDxlO3doaWxlKDEpe2c9ZisoZT4+PjMxPDwyKSsxNnwwO2g9Y1tnPj4yXXwwO2lmKChofDApPT0wKXticmVha31pZigoY1toKzQ+PjJdJi04fDApPT0oQXwwKSl7cD1oO2JyZWFrIGN9ZWxzZXtlPWU8PDE7Zj1ofX1pZihnPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1tnPj4yXT1kO2NbeisoYSsyNCk+PjJdPWY7Y1t6KyhhKzEyKT4+Ml09ZDtjW3orKGErOCk+PjJdPWQ7YnJlYWsgYn19ZWxzZXtwPWZ9fXdoaWxlKDApO2Y9cCs4fDA7ZT1jW2Y+PjJdfDA7Zz1jWzIyMTg0Pj4yXXwwO2lmKHA+Pj4wPGc+Pj4wKXtYYigpfWlmKGU+Pj4wPGc+Pj4wKXtYYigpfWVsc2V7Y1tlKzEyPj4yXT1kO2NbZj4+Ml09ZDtjW3orKGErOCk+PjJdPWU7Y1t6KyhhKzEyKT4+Ml09cDtjW3orKGErMjQpPj4yXT0wO2JyZWFrfX1lbHNle0g9QSthfDA7Y1t6KzQ+PjJdPUh8MztIPXorKEgrNCl8MDtjW0g+PjJdPWNbSD4+Ml18MX19d2hpbGUoMCk7SD16Kzh8MDtpPWI7cmV0dXJuIEh8MH19fWVsc2V7YT0tMX19fXdoaWxlKDApO3A9Y1syMjE3Nj4+Ml18MDtpZighKGE+Pj4wPnA+Pj4wKSl7ZT1wLWF8MDtkPWNbMjIxODg+PjJdfDA7aWYoZT4+PjA+MTUpe2NbMjIxODg+PjJdPWQrYTtjWzIyMTc2Pj4yXT1lO2NbZCsoYSs0KT4+Ml09ZXwxO2NbZCtwPj4yXT1lO2NbZCs0Pj4yXT1hfDN9ZWxzZXtjWzIyMTc2Pj4yXT0wO2NbMjIxODg+PjJdPTA7Y1tkKzQ+PjJdPXB8MztIPWQrKHArNCl8MDtjW0g+PjJdPWNbSD4+Ml18MX1IPWQrOHwwO2k9YjtyZXR1cm4gSHwwfXA9Y1syMjE4MD4+Ml18MDtpZihhPj4+MDxwPj4+MCl7Rz1wLWF8MDtjWzIyMTgwPj4yXT1HO0g9Y1syMjE5Mj4+Ml18MDtjWzIyMTkyPj4yXT1IK2E7Y1tIKyhhKzQpPj4yXT1HfDE7Y1tIKzQ+PjJdPWF8MztIPUgrOHwwO2k9YjtyZXR1cm4gSHwwfWRve2lmKChjWzU2NjBdfDApPT0wKXtwPXNiKDMwKXwwO2lmKChwKyAtMSZwfDApPT0wKXtjWzIyNjQ4Pj4yXT1wO2NbMjI2NDQ+PjJdPXA7Y1syMjY1Mj4+Ml09LTE7Y1syMjY1Nj4+Ml09LTE7Y1syMjY2MD4+Ml09MDtjWzIyNjEyPj4yXT0wO2NbNTY2MF09KF9iKDApfDApJi0xNl4xNDMxNjU1NzY4O2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO3c9YSs0OHwwO3A9Y1syMjY0OD4+Ml18MDt4PWErNDd8MDt6PXAreHwwO3A9MC1wfDA7dj16JnA7aWYoISh2Pj4+MD5hPj4+MCkpe0g9MDtpPWI7cmV0dXJuIEh8MH1BPWNbMjI2MDg+PjJdfDA7aWYoKEF8MCkhPTA/KEc9Y1syMjYwMD4+Ml18MCxIPUcrdnwwLEg+Pj4wPD1HPj4+MHxIPj4+MD5BPj4+MCk6MCl7SD0wO2k9YjtyZXR1cm4gSHwwfWQ6ZG97aWYoKGNbMjI2MTI+PjJdJjR8MCk9PTApe0I9Y1syMjE5Mj4+Ml18MDtlOmRve2lmKChCfDApIT0wKXtBPTIyNjE2fDA7d2hpbGUoMSl7Qz1jW0E+PjJdfDA7aWYoIShDPj4+MD5CPj4+MCk/KHk9QSs0fDAsKEMrKGNbeT4+Ml18MCl8MCk+Pj4wPkI+Pj4wKTowKXticmVha31BPWNbQSs4Pj4yXXwwO2lmKChBfDApPT0wKXtvPTE4MjticmVhayBlfX1pZigoQXwwKSE9MCl7Qj16LShjWzIyMTgwPj4yXXwwKSZwO2lmKEI+Pj4wPDIxNDc0ODM2NDcpe3A9aGIoQnwwKXwwO0E9KHB8MCk9PSgoY1tBPj4yXXwwKSsoY1t5Pj4yXXwwKXwwKTt5PXA7ej1CO3A9QT9wOi0xO0E9QT9COjA7bz0xOTF9ZWxzZXtBPTB9fWVsc2V7bz0xODJ9fWVsc2V7bz0xODJ9fXdoaWxlKDApO2Rve2lmKChvfDApPT0xODIpe3A9aGIoMCl8MDtpZigocHwwKSE9KC0xfDApKXt6PXA7QT1jWzIyNjQ0Pj4yXXwwO3k9QSsgLTF8MDtpZigoeSZ6fDApPT0wKXtBPXZ9ZWxzZXtBPXYteisoeSt6JjAtQSl8MH15PWNbMjI2MDA+PjJdfDA7ej15K0F8MDtpZihBPj4+MD5hPj4+MCZBPj4+MDwyMTQ3NDgzNjQ3KXtIPWNbMjI2MDg+PjJdfDA7aWYoKEh8MCkhPTA/ej4+PjA8PXk+Pj4wfHo+Pj4wPkg+Pj4wOjApe0E9MDticmVha315PWhiKEF8MCl8MDtvPSh5fDApPT0ocHwwKTt6PUE7cD1vP3A6LTE7QT1vP0E6MDtvPTE5MX1lbHNle0E9MH19ZWxzZXtBPTB9fX13aGlsZSgwKTtmOmRve2lmKChvfDApPT0xOTEpe289MC16fDA7aWYoKHB8MCkhPSgtMXwwKSl7cT1BO289MjAyO2JyZWFrIGR9ZG97aWYoKHl8MCkhPSgtMXwwKSZ6Pj4+MDwyMTQ3NDgzNjQ3Jno+Pj4wPHc+Pj4wPyh1PWNbMjI2NDg+PjJdfDAsdT14LXordSYwLXUsdT4+PjA8MjE0NzQ4MzY0Nyk6MCl7aWYoKGhiKHV8MCl8MCk9PSgtMXwwKSl7aGIob3wwKXwwO2JyZWFrIGZ9ZWxzZXt6PXUrenwwO2JyZWFrfX19d2hpbGUoMCk7aWYoKHl8MCkhPSgtMXwwKSl7cD15O3E9ejtvPTIwMjticmVhayBkfX19d2hpbGUoMCk7Y1syMjYxMj4+Ml09Y1syMjYxMj4+Ml18NDtvPTE5OX1lbHNle0E9MDtvPTE5OX19d2hpbGUoMCk7aWYoKCgob3wwKT09MTk5P3Y+Pj4wPDIxNDc0ODM2NDc6MCk/KHQ9aGIodnwwKXwwLHM9aGIoMCl8MCwoc3wwKSE9KC0xfDApJih0fDApIT0oLTF8MCkmdD4+PjA8cz4+PjApOjApPyhyPXMtdHwwLHE9cj4+PjA+KGErNDB8MCk+Pj4wLHEpOjApe3A9dDtxPXE/cjpBO289MjAyfWlmKChvfDApPT0yMDIpe3I9KGNbMjI2MDA+PjJdfDApK3F8MDtjWzIyNjAwPj4yXT1yO2lmKHI+Pj4wPihjWzIyNjA0Pj4yXXwwKT4+PjApe2NbMjI2MDQ+PjJdPXJ9cj1jWzIyMTkyPj4yXXwwO2c6ZG97aWYoKHJ8MCkhPTApe3Y9MjI2MTZ8MDt3aGlsZSgxKXt0PWNbdj4+Ml18MDt1PXYrNHwwO3M9Y1t1Pj4yXXwwO2lmKChwfDApPT0odCtzfDApKXtvPTIxNDticmVha313PWNbdis4Pj4yXXwwO2lmKCh3fDApPT0wKXticmVha31lbHNle3Y9d319aWYoKChvfDApPT0yMTQ/KGNbdisxMj4+Ml0mOHwwKT09MDowKT9yPj4+MD49dD4+PjAmcj4+PjA8cD4+PjA6MCl7Y1t1Pj4yXT1zK3E7ZD0oY1syMjE4MD4+Ml18MCkrcXwwO2U9cis4fDA7aWYoKGUmN3wwKT09MCl7ZT0wfWVsc2V7ZT0wLWUmN31IPWQtZXwwO2NbMjIxOTI+PjJdPXIrZTtjWzIyMTgwPj4yXT1IO2NbcisoZSs0KT4+Ml09SHwxO2NbcisoZCs0KT4+Ml09NDA7Y1syMjE5Nj4+Ml09Y1syMjY1Nj4+Ml07YnJlYWt9aWYocD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7Y1syMjE4ND4+Ml09cH10PXArcXwwO3M9MjI2MTZ8MDt3aGlsZSgxKXtpZigoY1tzPj4yXXwwKT09KHR8MCkpe289MjI0O2JyZWFrfXU9Y1tzKzg+PjJdfDA7aWYoKHV8MCk9PTApe2JyZWFrfWVsc2V7cz11fX1pZigob3wwKT09MjI0PyhjW3MrMTI+PjJdJjh8MCk9PTA6MCl7Y1tzPj4yXT1wO2g9cys0fDA7Y1toPj4yXT0oY1toPj4yXXwwKStxO2g9cCs4fDA7aWYoKGgmN3wwKT09MCl7aD0wfWVsc2V7aD0wLWgmN31qPXArKHErOCl8MDtpZigoaiY3fDApPT0wKXtuPTB9ZWxzZXtuPTAtaiY3fW89cCsobitxKXwwO2o9aCthfDA7az1wK2p8MDttPW8tKHAraCktYXwwO2NbcCsoaCs0KT4+Ml09YXwzO2g6ZG97aWYoKG98MCkhPShjWzIyMTkyPj4yXXwwKSl7aWYoKG98MCk9PShjWzIyMTg4Pj4yXXwwKSl7SD0oY1syMjE3Nj4+Ml18MCkrbXwwO2NbMjIxNzY+PjJdPUg7Y1syMjE4OD4+Ml09aztjW3ArKGorNCk+PjJdPUh8MTtjW3ArKEgraik+PjJdPUg7YnJlYWt9cj1xKzR8MDt0PWNbcCsocituKT4+Ml18MDtpZigodCYzfDApPT0xKXthPXQmLTg7cz10Pj4+MztpOmRve2lmKCEodD4+PjA8MjU2KSl7bD1jW3ArKChufDI0KStxKT4+Ml18MDt1PWNbcCsocSsxMituKT4+Ml18MDtkb3tpZigodXwwKT09KG98MCkpe3U9bnwxNjt0PXArKHIrdSl8MDtzPWNbdD4+Ml18MDtpZigoc3wwKT09MCl7dD1wKyh1K3EpfDA7cz1jW3Q+PjJdfDA7aWYoKHN8MCk9PTApe2c9MDticmVha319d2hpbGUoMSl7dT1zKzIwfDA7dj1jW3U+PjJdfDA7aWYoKHZ8MCkhPTApe3M9djt0PXU7Y29udGludWV9dT1zKzE2fDA7dj1jW3U+PjJdfDA7aWYoKHZ8MCk9PTApe2JyZWFrfWVsc2V7cz12O3Q9dX19aWYodD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbdD4+Ml09MDtnPXM7YnJlYWt9fWVsc2V7dD1jW3ArKChufDgpK3EpPj4yXXwwO2lmKHQ+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9dj10KzEyfDA7aWYoKGNbdj4+Ml18MCkhPShvfDApKXtYYigpfXM9dSs4fDA7aWYoKGNbcz4+Ml18MCk9PShvfDApKXtjW3Y+PjJdPXU7Y1tzPj4yXT10O2c9dTticmVha31lbHNle1hiKCl9fX13aGlsZSgwKTtpZigobHwwKT09MCl7YnJlYWt9dD1jW3ArKHErMjgrbik+PjJdfDA7cz0yMjQ3MisodDw8Mil8MDtkb3tpZigob3wwKSE9KGNbcz4+Ml18MCkpe2lmKGw+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9cz1sKzE2fDA7aWYoKGNbcz4+Ml18MCk9PShvfDApKXtjW3M+PjJdPWd9ZWxzZXtjW2wrMjA+PjJdPWd9aWYoKGd8MCk9PTApe2JyZWFrIGl9fWVsc2V7Y1tzPj4yXT1nO2lmKChnfDApIT0wKXticmVha31jWzIyMTcyPj4yXT1jWzIyMTcyPj4yXSZ+KDE8PHQpO2JyZWFrIGl9fXdoaWxlKDApO2lmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9Y1tnKzI0Pj4yXT1sO2w9bnwxNjtvPWNbcCsobCtxKT4+Ml18MDtkb3tpZigob3wwKSE9MCl7aWYobz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbZysxNj4+Ml09bztjW28rMjQ+PjJdPWc7YnJlYWt9fX13aGlsZSgwKTtsPWNbcCsocitsKT4+Ml18MDtpZigobHwwKT09MCl7YnJlYWt9aWYobD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbZysyMD4+Ml09bDtjW2wrMjQ+PjJdPWc7YnJlYWt9fWVsc2V7cj1jW3ArKChufDgpK3EpPj4yXXwwO2c9Y1twKyhxKzEyK24pPj4yXXwwO3Q9MjIyMDgrKHM8PDE8PDIpfDA7ZG97aWYoKHJ8MCkhPSh0fDApKXtpZihyPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWlmKChjW3IrMTI+PjJdfDApPT0ob3wwKSl7YnJlYWt9WGIoKX19d2hpbGUoMCk7aWYoKGd8MCk9PShyfDApKXtjWzU1NDJdPWNbNTU0Ml0mfigxPDxzKTticmVha31kb3tpZigoZ3wwKT09KHR8MCkpe2w9Zys4fDB9ZWxzZXtpZihnPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfXM9Zys4fDA7aWYoKGNbcz4+Ml18MCk9PShvfDApKXtsPXM7YnJlYWt9WGIoKX19d2hpbGUoMCk7Y1tyKzEyPj4yXT1nO2NbbD4+Ml09cn19d2hpbGUoMCk7bz1wKygoYXxuKStxKXwwO209YSttfDB9Zz1vKzR8MDtjW2c+PjJdPWNbZz4+Ml0mLTI7Y1twKyhqKzQpPj4yXT1tfDE7Y1twKyhtK2opPj4yXT1tO2c9bT4+PjM7aWYobT4+PjA8MjU2KXttPWc8PDE7ZD0yMjIwOCsobTw8Mil8MDtsPWNbNTU0Ml18MDtnPTE8PGc7ZG97aWYoKGwmZ3wwKT09MCl7Y1s1NTQyXT1sfGc7Zj0yMjIwOCsobSsyPDwyKXwwO2U9ZH1lbHNle2w9MjIyMDgrKG0rMjw8Mil8MDtnPWNbbD4+Ml18MDtpZighKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApKXtmPWw7ZT1nO2JyZWFrfVhiKCl9fXdoaWxlKDApO2NbZj4+Ml09aztjW2UrMTI+PjJdPWs7Y1twKyhqKzgpPj4yXT1lO2NbcCsoaisxMik+PjJdPWQ7YnJlYWt9ZT1tPj4+ODtkb3tpZigoZXwwKT09MCl7ZT0wfWVsc2V7aWYobT4+PjA+MTY3NzcyMTUpe2U9MzE7YnJlYWt9Rz0oZSsxMDQ4MzIwfDApPj4+MTYmODtIPWU8PEc7Rj0oSCs1MjAxOTJ8MCk+Pj4xNiY0O0g9SDw8RjtlPShIKzI0NTc2MHwwKT4+PjE2JjI7ZT0xNC0oRnxHfGUpKyhIPDxlPj4+MTUpfDA7ZT1tPj4+KGUrN3wwKSYxfGU8PDF9fXdoaWxlKDApO2w9MjI0NzIrKGU8PDIpfDA7Y1twKyhqKzI4KT4+Ml09ZTtjW3ArKGorMjApPj4yXT0wO2NbcCsoaisxNik+PjJdPTA7Zj1jWzIyMTcyPj4yXXwwO2c9MTw8ZTtpZigoZiZnfDApPT0wKXtjWzIyMTcyPj4yXT1mfGc7Y1tsPj4yXT1rO2NbcCsoaisyNCk+PjJdPWw7Y1twKyhqKzEyKT4+Ml09aztjW3ArKGorOCk+PjJdPWs7YnJlYWt9bD1jW2w+PjJdfDA7aWYoKGV8MCk9PTMxKXtlPTB9ZWxzZXtlPTI1LShlPj4+MSl8MH1qOmRve2lmKChjW2wrND4+Ml0mLTh8MCkhPShtfDApKXtlPW08PGU7d2hpbGUoMSl7Zz1sKyhlPj4+MzE8PDIpKzE2fDA7Zj1jW2c+PjJdfDA7aWYoKGZ8MCk9PTApe2JyZWFrfWlmKChjW2YrND4+Ml0mLTh8MCk9PShtfDApKXtkPWY7YnJlYWsgan1lbHNle2U9ZTw8MTtsPWZ9fWlmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2c+PjJdPWs7Y1twKyhqKzI0KT4+Ml09bDtjW3ArKGorMTIpPj4yXT1rO2NbcCsoais4KT4+Ml09azticmVhayBofX1lbHNle2Q9bH19d2hpbGUoMCk7Zj1kKzh8MDtlPWNbZj4+Ml18MDtnPWNbMjIxODQ+PjJdfDA7aWYoZD4+PjA8Zz4+PjApe1hiKCl9aWYoZT4+PjA8Zz4+PjApe1hiKCl9ZWxzZXtjW2UrMTI+PjJdPWs7Y1tmPj4yXT1rO2NbcCsoais4KT4+Ml09ZTtjW3ArKGorMTIpPj4yXT1kO2NbcCsoaisyNCk+PjJdPTA7YnJlYWt9fWVsc2V7SD0oY1syMjE4MD4+Ml18MCkrbXwwO2NbMjIxODA+PjJdPUg7Y1syMjE5Mj4+Ml09aztjW3ArKGorNCk+PjJdPUh8MX19d2hpbGUoMCk7SD1wKyhofDgpfDA7aT1iO3JldHVybiBIfDB9ZT0yMjYxNnwwO3doaWxlKDEpe2Q9Y1tlPj4yXXwwO2lmKCEoZD4+PjA+cj4+PjApPyhuPWNbZSs0Pj4yXXwwLG09ZCtufDAsbT4+PjA+cj4+PjApOjApe2JyZWFrfWU9Y1tlKzg+PjJdfDB9ZT1kKyhuKyAtMzkpfDA7aWYoKGUmN3wwKT09MCl7ZT0wfWVsc2V7ZT0wLWUmN31kPWQrKG4rIC00NytlKXwwO2Q9ZD4+PjA8KHIrMTZ8MCk+Pj4wP3I6ZDtlPWQrOHwwO2Y9cCs4fDA7aWYoKGYmN3wwKT09MCl7Zj0wfWVsc2V7Zj0wLWYmN31IPXErIC00MC1mfDA7Y1syMjE5Mj4+Ml09cCtmO2NbMjIxODA+PjJdPUg7Y1twKyhmKzQpPj4yXT1IfDE7Y1twKyhxKyAtMzYpPj4yXT00MDtjWzIyMTk2Pj4yXT1jWzIyNjU2Pj4yXTtjW2QrND4+Ml09Mjc7Y1tlKzA+PjJdPWNbMjI2MTY+PjJdO2NbZSs0Pj4yXT1jWzIyNjIwPj4yXTtjW2UrOD4+Ml09Y1syMjYyND4+Ml07Y1tlKzEyPj4yXT1jWzIyNjI4Pj4yXTtjWzIyNjE2Pj4yXT1wO2NbMjI2MjA+PjJdPXE7Y1syMjYyOD4+Ml09MDtjWzIyNjI0Pj4yXT1lO2U9ZCsyOHwwO2NbZT4+Ml09NztpZigoZCszMnwwKT4+PjA8bT4+PjApe2Rve0g9ZTtlPWUrNHwwO2NbZT4+Ml09N313aGlsZSgoSCs4fDApPj4+MDxtPj4+MCl9aWYoKGR8MCkhPShyfDApKXtkPWQtcnwwO2U9cisoZCs0KXwwO2NbZT4+Ml09Y1tlPj4yXSYtMjtjW3IrND4+Ml09ZHwxO2NbcitkPj4yXT1kO2U9ZD4+PjM7aWYoZD4+PjA8MjU2KXtnPWU8PDE7ZD0yMjIwOCsoZzw8Mil8MDtmPWNbNTU0Ml18MDtlPTE8PGU7ZG97aWYoKGYmZXwwKT09MCl7Y1s1NTQyXT1mfGU7az0yMjIwOCsoZysyPDwyKXwwO2o9ZH1lbHNle2Y9MjIyMDgrKGcrMjw8Mil8MDtlPWNbZj4+Ml18MDtpZighKGU+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApKXtrPWY7aj1lO2JyZWFrfVhiKCl9fXdoaWxlKDApO2Nbaz4+Ml09cjtjW2orMTI+PjJdPXI7Y1tyKzg+PjJdPWo7Y1tyKzEyPj4yXT1kO2JyZWFrfWU9ZD4+Pjg7aWYoKGV8MCkhPTApe2lmKGQ+Pj4wPjE2Nzc3MjE1KXtlPTMxfWVsc2V7Rz0oZSsxMDQ4MzIwfDApPj4+MTYmODtIPWU8PEc7Rj0oSCs1MjAxOTJ8MCk+Pj4xNiY0O0g9SDw8RjtlPShIKzI0NTc2MHwwKT4+PjE2JjI7ZT0xNC0oRnxHfGUpKyhIPDxlPj4+MTUpfDA7ZT1kPj4+KGUrN3wwKSYxfGU8PDF9fWVsc2V7ZT0wfWo9MjI0NzIrKGU8PDIpfDA7Y1tyKzI4Pj4yXT1lO2NbcisyMD4+Ml09MDtjW3IrMTY+PjJdPTA7Zj1jWzIyMTcyPj4yXXwwO2c9MTw8ZTtpZigoZiZnfDApPT0wKXtjWzIyMTcyPj4yXT1mfGc7Y1tqPj4yXT1yO2NbcisyND4+Ml09ajtjW3IrMTI+PjJdPXI7Y1tyKzg+PjJdPXI7YnJlYWt9Zj1jW2o+PjJdfDA7aWYoKGV8MCk9PTMxKXtlPTB9ZWxzZXtlPTI1LShlPj4+MSl8MH1rOmRve2lmKChjW2YrND4+Ml0mLTh8MCkhPShkfDApKXtlPWQ8PGU7d2hpbGUoMSl7aj1mKyhlPj4+MzE8PDIpKzE2fDA7Zz1jW2o+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWlmKChjW2crND4+Ml0mLTh8MCk9PShkfDApKXtoPWc7YnJlYWsga31lbHNle2U9ZTw8MTtmPWd9fWlmKGo+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2o+PjJdPXI7Y1tyKzI0Pj4yXT1mO2NbcisxMj4+Ml09cjtjW3IrOD4+Ml09cjticmVhayBnfX1lbHNle2g9Zn19d2hpbGUoMCk7Zj1oKzh8MDtlPWNbZj4+Ml18MDtkPWNbMjIxODQ+PjJdfDA7aWYoaD4+PjA8ZD4+PjApe1hiKCl9aWYoZT4+PjA8ZD4+PjApe1hiKCl9ZWxzZXtjW2UrMTI+PjJdPXI7Y1tmPj4yXT1yO2Nbcis4Pj4yXT1lO2NbcisxMj4+Ml09aDtjW3IrMjQ+PjJdPTA7YnJlYWt9fX1lbHNle0g9Y1syMjE4ND4+Ml18MDtpZigoSHwwKT09MHxwPj4+MDxIPj4+MCl7Y1syMjE4ND4+Ml09cH1jWzIyNjE2Pj4yXT1wO2NbMjI2MjA+PjJdPXE7Y1syMjYyOD4+Ml09MDtjWzIyMjA0Pj4yXT1jWzU2NjBdO2NbMjIyMDA+PjJdPS0xO2Q9MDtkb3tIPWQ8PDE7Rz0yMjIwOCsoSDw8Mil8MDtjWzIyMjA4KyhIKzM8PDIpPj4yXT1HO2NbMjIyMDgrKEgrMjw8Mik+PjJdPUc7ZD1kKzF8MH13aGlsZSgoZHwwKSE9MzIpO2Q9cCs4fDA7aWYoKGQmN3wwKT09MCl7ZD0wfWVsc2V7ZD0wLWQmN31IPXErIC00MC1kfDA7Y1syMjE5Mj4+Ml09cCtkO2NbMjIxODA+PjJdPUg7Y1twKyhkKzQpPj4yXT1IfDE7Y1twKyhxKyAtMzYpPj4yXT00MDtjWzIyMTk2Pj4yXT1jWzIyNjU2Pj4yXX19d2hpbGUoMCk7ZD1jWzIyMTgwPj4yXXwwO2lmKGQ+Pj4wPmE+Pj4wKXtHPWQtYXwwO2NbMjIxODA+PjJdPUc7SD1jWzIyMTkyPj4yXXwwO2NbMjIxOTI+PjJdPUgrYTtjW0grKGErNCk+PjJdPUd8MTtjW0grND4+Ml09YXwzO0g9SCs4fDA7aT1iO3JldHVybiBIfDB9fWNbKGJiKCl8MCk+PjJdPTEyO0g9MDtpPWI7cmV0dXJuIEh8MH1mdW5jdGlvbiB2bihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MDtiPWk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59cT1hKyAtOHwwO3I9Y1syMjE4ND4+Ml18MDtpZihxPj4+MDxyPj4+MCl7WGIoKX1vPWNbYSsgLTQ+PjJdfDA7bj1vJjM7aWYoKG58MCk9PTEpe1hiKCl9aj1vJi04O2g9YSsoaisgLTgpfDA7ZG97aWYoKG8mMXwwKT09MCl7dT1jW3E+PjJdfDA7aWYoKG58MCk9PTApe2k9YjtyZXR1cm59cT0tOC11fDA7bz1hK3F8MDtuPXUranwwO2lmKG8+Pj4wPHI+Pj4wKXtYYigpfWlmKChvfDApPT0oY1syMjE4OD4+Ml18MCkpe2Q9YSsoaisgLTQpfDA7aWYoKGNbZD4+Ml0mM3wwKSE9Myl7ZD1vO209bjticmVha31jWzIyMTc2Pj4yXT1uO2NbZD4+Ml09Y1tkPj4yXSYtMjtjW2ErKHErNCk+PjJdPW58MTtjW2g+PjJdPW47aT1iO3JldHVybn10PXU+Pj4zO2lmKHU+Pj4wPDI1Nil7ZD1jW2ErKHErOCk+PjJdfDA7bT1jW2ErKHErMTIpPj4yXXwwO3A9MjIyMDgrKHQ8PDE8PDIpfDA7aWYoKGR8MCkhPShwfDApKXtpZihkPj4+MDxyPj4+MCl7WGIoKX1pZigoY1tkKzEyPj4yXXwwKSE9KG98MCkpe1hiKCl9fWlmKChtfDApPT0oZHwwKSl7Y1s1NTQyXT1jWzU1NDJdJn4oMTw8dCk7ZD1vO209bjticmVha31pZigobXwwKSE9KHB8MCkpe2lmKG0+Pj4wPHI+Pj4wKXtYYigpfXA9bSs4fDA7aWYoKGNbcD4+Ml18MCk9PShvfDApKXtzPXB9ZWxzZXtYYigpfX1lbHNle3M9bSs4fDB9Y1tkKzEyPj4yXT1tO2Nbcz4+Ml09ZDtkPW87bT1uO2JyZWFrfXM9Y1thKyhxKzI0KT4+Ml18MDt0PWNbYSsocSsxMik+PjJdfDA7ZG97aWYoKHR8MCk9PShvfDApKXt1PWErKHErMjApfDA7dD1jW3U+PjJdfDA7aWYoKHR8MCk9PTApe3U9YSsocSsxNil8MDt0PWNbdT4+Ml18MDtpZigodHwwKT09MCl7cD0wO2JyZWFrfX13aGlsZSgxKXt3PXQrMjB8MDt2PWNbdz4+Ml18MDtpZigodnwwKSE9MCl7dD12O3U9dztjb250aW51ZX12PXQrMTZ8MDt3PWNbdj4+Ml18MDtpZigod3wwKT09MCl7YnJlYWt9ZWxzZXt0PXc7dT12fX1pZih1Pj4+MDxyPj4+MCl7WGIoKX1lbHNle2NbdT4+Ml09MDtwPXQ7YnJlYWt9fWVsc2V7dT1jW2ErKHErOCk+PjJdfDA7aWYodT4+PjA8cj4+PjApe1hiKCl9cj11KzEyfDA7aWYoKGNbcj4+Ml18MCkhPShvfDApKXtYYigpfXY9dCs4fDA7aWYoKGNbdj4+Ml18MCk9PShvfDApKXtjW3I+PjJdPXQ7Y1t2Pj4yXT11O3A9dDticmVha31lbHNle1hiKCl9fX13aGlsZSgwKTtpZigoc3wwKSE9MCl7dD1jW2ErKHErMjgpPj4yXXwwO3I9MjI0NzIrKHQ8PDIpfDA7aWYoKG98MCk9PShjW3I+PjJdfDApKXtjW3I+PjJdPXA7aWYoKHB8MCk9PTApe2NbMjIxNzI+PjJdPWNbMjIxNzI+PjJdJn4oMTw8dCk7ZD1vO209bjticmVha319ZWxzZXtpZihzPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfXI9cysxNnwwO2lmKChjW3I+PjJdfDApPT0ob3wwKSl7Y1tyPj4yXT1wfWVsc2V7Y1tzKzIwPj4yXT1wfWlmKChwfDApPT0wKXtkPW87bT1uO2JyZWFrfX1pZihwPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWNbcCsyND4+Ml09cztyPWNbYSsocSsxNik+PjJdfDA7ZG97aWYoKHJ8MCkhPTApe2lmKHI+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW3ArMTY+PjJdPXI7Y1tyKzI0Pj4yXT1wO2JyZWFrfX19d2hpbGUoMCk7cT1jW2ErKHErMjApPj4yXXwwO2lmKChxfDApIT0wKXtpZihxPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1twKzIwPj4yXT1xO2NbcSsyND4+Ml09cDtkPW87bT1uO2JyZWFrfX1lbHNle2Q9bzttPW59fWVsc2V7ZD1vO209bn19ZWxzZXtkPXE7bT1qfX13aGlsZSgwKTtpZighKGQ+Pj4wPGg+Pj4wKSl7WGIoKX1uPWErKGorIC00KXwwO289Y1tuPj4yXXwwO2lmKChvJjF8MCk9PTApe1hiKCl9aWYoKG8mMnwwKT09MCl7aWYoKGh8MCk9PShjWzIyMTkyPj4yXXwwKSl7dz0oY1syMjE4MD4+Ml18MCkrbXwwO2NbMjIxODA+PjJdPXc7Y1syMjE5Mj4+Ml09ZDtjW2QrND4+Ml09d3wxO2lmKChkfDApIT0oY1syMjE4OD4+Ml18MCkpe2k9YjtyZXR1cm59Y1syMjE4OD4+Ml09MDtjWzIyMTc2Pj4yXT0wO2k9YjtyZXR1cm59aWYoKGh8MCk9PShjWzIyMTg4Pj4yXXwwKSl7dz0oY1syMjE3Nj4+Ml18MCkrbXwwO2NbMjIxNzY+PjJdPXc7Y1syMjE4OD4+Ml09ZDtjW2QrND4+Ml09d3wxO2NbZCt3Pj4yXT13O2k9YjtyZXR1cm59bT0obyYtOCkrbXwwO249bz4+PjM7ZG97aWYoIShvPj4+MDwyNTYpKXtsPWNbYSsoaisxNik+PjJdfDA7cT1jW2ErKGp8NCk+PjJdfDA7ZG97aWYoKHF8MCk9PShofDApKXtvPWErKGorMTIpfDA7bj1jW28+PjJdfDA7aWYoKG58MCk9PTApe289YSsoais4KXwwO249Y1tvPj4yXXwwO2lmKChufDApPT0wKXtrPTA7YnJlYWt9fXdoaWxlKDEpe3A9bisyMHwwO3E9Y1twPj4yXXwwO2lmKChxfDApIT0wKXtuPXE7bz1wO2NvbnRpbnVlfXA9bisxNnwwO3E9Y1twPj4yXXwwO2lmKChxfDApPT0wKXticmVha31lbHNle249cTtvPXB9fWlmKG8+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW28+PjJdPTA7az1uO2JyZWFrfX1lbHNle289Y1thK2o+PjJdfDA7aWYobz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1wPW8rMTJ8MDtpZigoY1twPj4yXXwwKSE9KGh8MCkpe1hiKCl9bj1xKzh8MDtpZigoY1tuPj4yXXwwKT09KGh8MCkpe2NbcD4+Ml09cTtjW24+PjJdPW87az1xO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2lmKChsfDApIT0wKXtuPWNbYSsoaisyMCk+PjJdfDA7bz0yMjQ3Misobjw8Mil8MDtpZigoaHwwKT09KGNbbz4+Ml18MCkpe2Nbbz4+Ml09aztpZigoa3wwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxuKTticmVha319ZWxzZXtpZihsPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfW49bCsxNnwwO2lmKChjW24+PjJdfDApPT0oaHwwKSl7Y1tuPj4yXT1rfWVsc2V7Y1tsKzIwPj4yXT1rfWlmKChrfDApPT0wKXticmVha319aWYoaz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2srMjQ+PjJdPWw7aD1jW2ErKGorOCk+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKGg+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2srMTY+PjJdPWg7Y1toKzI0Pj4yXT1rO2JyZWFrfX19d2hpbGUoMCk7aD1jW2ErKGorMTIpPj4yXXwwO2lmKChofDApIT0wKXtpZihoPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1trKzIwPj4yXT1oO2NbaCsyND4+Ml09azticmVha319fX1lbHNle2s9Y1thK2o+PjJdfDA7YT1jW2ErKGp8NCk+PjJdfDA7aj0yMjIwOCsobjw8MTw8Mil8MDtpZigoa3wwKSE9KGp8MCkpe2lmKGs+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9aWYoKGNbaysxMj4+Ml18MCkhPShofDApKXtYYigpfX1pZigoYXwwKT09KGt8MCkpe2NbNTU0Ml09Y1s1NTQyXSZ+KDE8PG4pO2JyZWFrfWlmKChhfDApIT0oanwwKSl7aWYoYT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1qPWErOHwwO2lmKChjW2o+PjJdfDApPT0oaHwwKSl7bD1qfWVsc2V7WGIoKX19ZWxzZXtsPWErOHwwfWNbaysxMj4+Ml09YTtjW2w+PjJdPWt9fXdoaWxlKDApO2NbZCs0Pj4yXT1tfDE7Y1tkK20+PjJdPW07aWYoKGR8MCk9PShjWzIyMTg4Pj4yXXwwKSl7Y1syMjE3Nj4+Ml09bTtpPWI7cmV0dXJufX1lbHNle2Nbbj4+Ml09byYtMjtjW2QrND4+Ml09bXwxO2NbZCttPj4yXT1tfWg9bT4+PjM7aWYobT4+PjA8MjU2KXthPWg8PDE7ZT0yMjIwOCsoYTw8Mil8MDtqPWNbNTU0Ml18MDtoPTE8PGg7aWYoKGomaHwwKSE9MCl7aD0yMjIwOCsoYSsyPDwyKXwwO2E9Y1toPj4yXXwwO2lmKGE+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtmPWg7Zz1hfX1lbHNle2NbNTU0Ml09anxoO2Y9MjIyMDgrKGErMjw8Mil8MDtnPWV9Y1tmPj4yXT1kO2NbZysxMj4+Ml09ZDtjW2QrOD4+Ml09ZztjW2QrMTI+PjJdPWU7aT1iO3JldHVybn1mPW0+Pj44O2lmKChmfDApIT0wKXtpZihtPj4+MD4xNjc3NzIxNSl7Zj0zMX1lbHNle3Y9KGYrMTA0ODMyMHwwKT4+PjE2Jjg7dz1mPDx2O3U9KHcrNTIwMTkyfDApPj4+MTYmNDt3PXc8PHU7Zj0odysyNDU3NjB8MCk+Pj4xNiYyO2Y9MTQtKHV8dnxmKSsodzw8Zj4+PjE1KXwwO2Y9bT4+PihmKzd8MCkmMXxmPDwxfX1lbHNle2Y9MH1nPTIyNDcyKyhmPDwyKXwwO2NbZCsyOD4+Ml09ZjtjW2QrMjA+PjJdPTA7Y1tkKzE2Pj4yXT0wO2E9Y1syMjE3Mj4+Ml18MDtoPTE8PGY7YTpkb3tpZigoYSZofDApIT0wKXtnPWNbZz4+Ml18MDtpZigoZnwwKT09MzEpe2Y9MH1lbHNle2Y9MjUtKGY+Pj4xKXwwfWI6ZG97aWYoKGNbZys0Pj4yXSYtOHwwKSE9KG18MCkpe2Y9bTw8ZjthPWc7d2hpbGUoMSl7aD1hKyhmPj4+MzE8PDIpKzE2fDA7Zz1jW2g+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWlmKChjW2crND4+Ml0mLTh8MCk9PShtfDApKXtlPWc7YnJlYWsgYn1lbHNle2Y9Zjw8MTthPWd9fWlmKGg+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2g+PjJdPWQ7Y1tkKzI0Pj4yXT1hO2NbZCsxMj4+Ml09ZDtjW2QrOD4+Ml09ZDticmVhayBhfX1lbHNle2U9Z319d2hpbGUoMCk7Zz1lKzh8MDtmPWNbZz4+Ml18MDtoPWNbMjIxODQ+PjJdfDA7aWYoZT4+PjA8aD4+PjApe1hiKCl9aWYoZj4+PjA8aD4+PjApe1hiKCl9ZWxzZXtjW2YrMTI+PjJdPWQ7Y1tnPj4yXT1kO2NbZCs4Pj4yXT1mO2NbZCsxMj4+Ml09ZTtjW2QrMjQ+PjJdPTA7YnJlYWt9fWVsc2V7Y1syMjE3Mj4+Ml09YXxoO2NbZz4+Ml09ZDtjW2QrMjQ+PjJdPWc7Y1tkKzEyPj4yXT1kO2NbZCs4Pj4yXT1kfX13aGlsZSgwKTt3PShjWzIyMjAwPj4yXXwwKSsgLTF8MDtjWzIyMjAwPj4yXT13O2lmKCh3fDApPT0wKXtkPTIyNjI0fDB9ZWxzZXtpPWI7cmV0dXJufXdoaWxlKDEpe2Q9Y1tkPj4yXXwwO2lmKChkfDApPT0wKXticmVha31lbHNle2Q9ZCs4fDB9fWNbMjIyMDA+PjJdPS0xO2k9YjtyZXR1cm59ZnVuY3Rpb24gd24oYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtkPWk7aWYoKGF8MCk9PTApe3I9dW4oYil8MDtpPWQ7cmV0dXJuIHJ8MH1pZihiPj4+MD40Mjk0OTY3MjMxKXtjWyhiYigpfDApPj4yXT0xMjtyPTA7aT1kO3JldHVybiByfDB9aWYoYj4+PjA8MTEpe2Y9MTZ9ZWxzZXtmPWIrMTEmLTh9ZT1hKyAtNHwwO2s9Y1tlPj4yXXwwO2w9ayYtODtvPWwrIC04fDA7aD1hK298MDttPWNbMjIxODQ+PjJdfDA7aWYoKGErIC04fDApPj4+MDxtPj4+MCl7WGIoKX1yPWsmMztpZighKChyfDApIT0xJihvfDApPi04KSl7WGIoKX1vPWx8NDtxPWErKG8rIC04KXwwO3A9Y1txPj4yXXwwO2lmKChwJjF8MCk9PTApe1hiKCl9ZG97aWYoKHJ8MCk9PTApe2lmKCEoZj4+PjA8MjU2fGw+Pj4wPChmfDQpPj4+MCk/ISgobC1mfDApPj4+MD5jWzIyNjQ4Pj4yXTw8MT4+PjApOjApe3I9YTtpPWQ7cmV0dXJuIHJ8MH19ZWxzZXtpZighKGw+Pj4wPGY+Pj4wKSl7Zz1sLWZ8MDtpZighKGc+Pj4wPjE1KSl7cj1hO2k9ZDtyZXR1cm4gcnwwfWNbZT4+Ml09ayYxfGZ8MjtjW2ErKChmfDQpKyAtOCk+PjJdPWd8MztjW3E+PjJdPWNbcT4+Ml18MTt4bihhKyhmKyAtOCl8MCxnKTtyPWE7aT1kO3JldHVybiByfDB9aWYoKGh8MCk9PShjWzIyMTkyPj4yXXwwKSl7Zz0oY1syMjE4MD4+Ml18MCkrbHwwO2lmKCEoZz4+PjA+Zj4+PjApKXticmVha31yPWctZnwwO2NbZT4+Ml09ayYxfGZ8MjtjW2ErKChmfDQpKyAtOCk+PjJdPXJ8MTtjWzIyMTkyPj4yXT1hKyhmKyAtOCk7Y1syMjE4MD4+Ml09cjtyPWE7aT1kO3JldHVybiByfDB9aWYoKGh8MCk9PShjWzIyMTg4Pj4yXXwwKSl7Zz0oY1syMjE3Nj4+Ml18MCkrbHwwO2lmKGc+Pj4wPGY+Pj4wKXticmVha31oPWctZnwwO2lmKGg+Pj4wPjE1KXtjW2U+PjJdPWsmMXxmfDI7Y1thKygoZnw0KSsgLTgpPj4yXT1ofDE7Y1thKyhnKyAtOCk+PjJdPWg7ZT1hKyhnKyAtNCl8MDtjW2U+PjJdPWNbZT4+Ml0mLTI7ZT1hKyhmKyAtOCl8MH1lbHNle2NbZT4+Ml09ayYxfGd8MjtlPWErKGcrIC00KXwwO2NbZT4+Ml09Y1tlPj4yXXwxO2U9MDtoPTB9Y1syMjE3Nj4+Ml09aDtjWzIyMTg4Pj4yXT1lO3I9YTtpPWQ7cmV0dXJuIHJ8MH1pZigocCYyfDApPT0wPyhnPShwJi04KStsfDAsIShnPj4+MDxmPj4+MCkpOjApe2s9Zy1mfDA7Yj1wPj4+Mztkb3tpZighKHA+Pj4wPDI1Nikpe249Y1thKyhsKzE2KT4+Ml18MDtvPWNbYStvPj4yXXwwO2Rve2lmKChvfDApPT0oaHwwKSl7Yj1hKyhsKzEyKXwwO289Y1tiPj4yXXwwO2lmKChvfDApPT0wKXtiPWErKGwrOCl8MDtvPWNbYj4+Ml18MDtpZigob3wwKT09MCl7aj0wO2JyZWFrfX13aGlsZSgxKXtxPW8rMjB8MDtwPWNbcT4+Ml18MDtpZigocHwwKSE9MCl7bz1wO2I9cTtjb250aW51ZX1wPW8rMTZ8MDtxPWNbcD4+Ml18MDtpZigocXwwKT09MCl7YnJlYWt9ZWxzZXtvPXE7Yj1wfX1pZihiPj4+MDxtPj4+MCl7WGIoKX1lbHNle2NbYj4+Ml09MDtqPW87YnJlYWt9fWVsc2V7Yj1jW2ErbD4+Ml18MDtpZihiPj4+MDxtPj4+MCl7WGIoKX1wPWIrMTJ8MDtpZigoY1twPj4yXXwwKSE9KGh8MCkpe1hiKCl9bT1vKzh8MDtpZigoY1ttPj4yXXwwKT09KGh8MCkpe2NbcD4+Ml09bztjW20+PjJdPWI7aj1vO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2lmKChufDApIT0wKXtvPWNbYSsobCsyMCk+PjJdfDA7bT0yMjQ3Misobzw8Mil8MDtpZigoaHwwKT09KGNbbT4+Ml18MCkpe2NbbT4+Ml09ajtpZigoanwwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxvKTticmVha319ZWxzZXtpZihuPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfW09bisxNnwwO2lmKChjW20+PjJdfDApPT0oaHwwKSl7Y1ttPj4yXT1qfWVsc2V7Y1tuKzIwPj4yXT1qfWlmKChqfDApPT0wKXticmVha319aWYoaj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2orMjQ+PjJdPW47aD1jW2ErKGwrOCk+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKGg+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2orMTY+PjJdPWg7Y1toKzI0Pj4yXT1qO2JyZWFrfX19d2hpbGUoMCk7aD1jW2ErKGwrMTIpPj4yXXwwO2lmKChofDApPT0wKXticmVha31pZihoPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1tqKzIwPj4yXT1oO2NbaCsyND4+Ml09ajticmVha319fWVsc2V7aj1jW2ErbD4+Ml18MDtsPWNbYStvPj4yXXwwO289MjIyMDgrKGI8PDE8PDIpfDA7aWYoKGp8MCkhPShvfDApKXtpZihqPj4+MDxtPj4+MCl7WGIoKX1pZigoY1tqKzEyPj4yXXwwKSE9KGh8MCkpe1hiKCl9fWlmKChsfDApPT0oanwwKSl7Y1s1NTQyXT1jWzU1NDJdJn4oMTw8Yik7YnJlYWt9ZG97aWYoKGx8MCk9PShvfDApKXtuPWwrOHwwfWVsc2V7aWYobD4+PjA8bT4+PjApe1hiKCl9bT1sKzh8MDtpZigoY1ttPj4yXXwwKT09KGh8MCkpe249bTticmVha31YYigpfX13aGlsZSgwKTtjW2orMTI+PjJdPWw7Y1tuPj4yXT1qfX13aGlsZSgwKTtpZihrPj4+MDwxNil7Y1tlPj4yXT1nfGNbZT4+Ml0mMXwyO3I9YSsoKGd8NCkrIC04KXwwO2Nbcj4+Ml09Y1tyPj4yXXwxO3I9YTtpPWQ7cmV0dXJuIHJ8MH1lbHNle2NbZT4+Ml09Y1tlPj4yXSYxfGZ8MjtjW2ErKChmfDQpKyAtOCk+PjJdPWt8MztyPWErKChnfDQpKyAtOCl8MDtjW3I+PjJdPWNbcj4+Ml18MTt4bihhKyhmKyAtOCl8MCxrKTtyPWE7aT1kO3JldHVybiByfDB9fX19d2hpbGUoMCk7Zj11bihiKXwwO2lmKChmfDApPT0wKXtyPTA7aT1kO3JldHVybiByfDB9cj1jW2U+PjJdfDA7cj0ociYtOCktKChyJjN8MCk9PTA/ODo0KXwwO0xuKGZ8MCxhfDAsKHI+Pj4wPGI+Pj4wP3I6Yil8MCl8MDt2bihhKTtyPWY7aT1kO3JldHVybiByfDB9ZnVuY3Rpb24geG4oYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTA7ZD1pO2g9YStifDA7bD1jW2ErND4+Ml18MDtkb3tpZigobCYxfDApPT0wKXtwPWNbYT4+Ml18MDtpZigobCYzfDApPT0wKXtpPWQ7cmV0dXJufWw9YSsoMC1wKXwwO209cCtifDA7cT1jWzIyMTg0Pj4yXXwwO2lmKGw+Pj4wPHE+Pj4wKXtYYigpfWlmKChsfDApPT0oY1syMjE4OD4+Ml18MCkpe2U9YSsoYis0KXwwO2lmKChjW2U+PjJdJjN8MCkhPTMpe2U9bDtuPW07YnJlYWt9Y1syMjE3Nj4+Ml09bTtjW2U+PjJdPWNbZT4+Ml0mLTI7Y1thKyg0LXApPj4yXT1tfDE7Y1toPj4yXT1tO2k9ZDtyZXR1cm59cz1wPj4+MztpZihwPj4+MDwyNTYpe2U9Y1thKyg4LXApPj4yXXwwO249Y1thKygxMi1wKT4+Ml18MDtvPTIyMjA4KyhzPDwxPDwyKXwwO2lmKChlfDApIT0ob3wwKSl7aWYoZT4+PjA8cT4+PjApe1hiKCl9aWYoKGNbZSsxMj4+Ml18MCkhPShsfDApKXtYYigpfX1pZigobnwwKT09KGV8MCkpe2NbNTU0Ml09Y1s1NTQyXSZ+KDE8PHMpO2U9bDtuPW07YnJlYWt9aWYoKG58MCkhPShvfDApKXtpZihuPj4+MDxxPj4+MCl7WGIoKX1vPW4rOHwwO2lmKChjW28+PjJdfDApPT0obHwwKSl7cj1vfWVsc2V7WGIoKX19ZWxzZXtyPW4rOHwwfWNbZSsxMj4+Ml09bjtjW3I+PjJdPWU7ZT1sO249bTticmVha31yPWNbYSsoMjQtcCk+PjJdfDA7dD1jW2ErKDEyLXApPj4yXXwwO2Rve2lmKCh0fDApPT0obHwwKSl7dT0xNi1wfDA7dD1hKyh1KzQpfDA7cz1jW3Q+PjJdfDA7aWYoKHN8MCk9PTApe3Q9YSt1fDA7cz1jW3Q+PjJdfDA7aWYoKHN8MCk9PTApe289MDticmVha319d2hpbGUoMSl7dT1zKzIwfDA7dj1jW3U+PjJdfDA7aWYoKHZ8MCkhPTApe3M9djt0PXU7Y29udGludWV9dj1zKzE2fDA7dT1jW3Y+PjJdfDA7aWYoKHV8MCk9PTApe2JyZWFrfWVsc2V7cz11O3Q9dn19aWYodD4+PjA8cT4+PjApe1hiKCl9ZWxzZXtjW3Q+PjJdPTA7bz1zO2JyZWFrfX1lbHNle3M9Y1thKyg4LXApPj4yXXwwO2lmKHM+Pj4wPHE+Pj4wKXtYYigpfXU9cysxMnwwO2lmKChjW3U+PjJdfDApIT0obHwwKSl7WGIoKX1xPXQrOHwwO2lmKChjW3E+PjJdfDApPT0obHwwKSl7Y1t1Pj4yXT10O2NbcT4+Ml09cztvPXQ7YnJlYWt9ZWxzZXtYYigpfX19d2hpbGUoMCk7aWYoKHJ8MCkhPTApe3E9Y1thKygyOC1wKT4+Ml18MDtzPTIyNDcyKyhxPDwyKXwwO2lmKChsfDApPT0oY1tzPj4yXXwwKSl7Y1tzPj4yXT1vO2lmKChvfDApPT0wKXtjWzIyMTcyPj4yXT1jWzIyMTcyPj4yXSZ+KDE8PHEpO2U9bDtuPW07YnJlYWt9fWVsc2V7aWYocj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1xPXIrMTZ8MDtpZigoY1txPj4yXXwwKT09KGx8MCkpe2NbcT4+Ml09b31lbHNle2NbcisyMD4+Ml09b31pZigob3wwKT09MCl7ZT1sO249bTticmVha319aWYobz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW28rMjQ+PjJdPXI7cD0xNi1wfDA7cT1jW2ErcD4+Ml18MDtkb3tpZigocXwwKSE9MCl7aWYocT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbbysxNj4+Ml09cTtjW3ErMjQ+PjJdPW87YnJlYWt9fX13aGlsZSgwKTtwPWNbYSsocCs0KT4+Ml18MDtpZigocHwwKSE9MCl7aWYocD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbbysyMD4+Ml09cDtjW3ArMjQ+PjJdPW87ZT1sO249bTticmVha319ZWxzZXtlPWw7bj1tfX1lbHNle2U9bDtuPW19fWVsc2V7ZT1hO249Yn19d2hpbGUoMCk7bD1jWzIyMTg0Pj4yXXwwO2lmKGg+Pj4wPGw+Pj4wKXtYYigpfW09YSsoYis0KXwwO289Y1ttPj4yXXwwO2lmKChvJjJ8MCk9PTApe2lmKChofDApPT0oY1syMjE5Mj4+Ml18MCkpe3Y9KGNbMjIxODA+PjJdfDApK258MDtjWzIyMTgwPj4yXT12O2NbMjIxOTI+PjJdPWU7Y1tlKzQ+PjJdPXZ8MTtpZigoZXwwKSE9KGNbMjIxODg+PjJdfDApKXtpPWQ7cmV0dXJufWNbMjIxODg+PjJdPTA7Y1syMjE3Nj4+Ml09MDtpPWQ7cmV0dXJufWlmKChofDApPT0oY1syMjE4OD4+Ml18MCkpe3Y9KGNbMjIxNzY+PjJdfDApK258MDtjWzIyMTc2Pj4yXT12O2NbMjIxODg+PjJdPWU7Y1tlKzQ+PjJdPXZ8MTtjW2Urdj4+Ml09djtpPWQ7cmV0dXJufW49KG8mLTgpK258MDttPW8+Pj4zO2Rve2lmKCEobz4+PjA8MjU2KSl7az1jW2ErKGIrMjQpPj4yXXwwO209Y1thKyhiKzEyKT4+Ml18MDtkb3tpZigobXwwKT09KGh8MCkpe289YSsoYisyMCl8MDttPWNbbz4+Ml18MDtpZigobXwwKT09MCl7bz1hKyhiKzE2KXwwO209Y1tvPj4yXXwwO2lmKChtfDApPT0wKXtqPTA7YnJlYWt9fXdoaWxlKDEpe3E9bSsyMHwwO3A9Y1txPj4yXXwwO2lmKChwfDApIT0wKXttPXA7bz1xO2NvbnRpbnVlfXA9bSsxNnwwO3E9Y1twPj4yXXwwO2lmKChxfDApPT0wKXticmVha31lbHNle209cTtvPXB9fWlmKG8+Pj4wPGw+Pj4wKXtYYigpfWVsc2V7Y1tvPj4yXT0wO2o9bTticmVha319ZWxzZXtvPWNbYSsoYis4KT4+Ml18MDtpZihvPj4+MDxsPj4+MCl7WGIoKX1sPW8rMTJ8MDtpZigoY1tsPj4yXXwwKSE9KGh8MCkpe1hiKCl9cD1tKzh8MDtpZigoY1twPj4yXXwwKT09KGh8MCkpe2NbbD4+Ml09bTtjW3A+PjJdPW87aj1tO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2lmKChrfDApIT0wKXtsPWNbYSsoYisyOCk+PjJdfDA7bT0yMjQ3MisobDw8Mil8MDtpZigoaHwwKT09KGNbbT4+Ml18MCkpe2NbbT4+Ml09ajtpZigoanwwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxsKTticmVha319ZWxzZXtpZihrPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWw9aysxNnwwO2lmKChjW2w+PjJdfDApPT0oaHwwKSl7Y1tsPj4yXT1qfWVsc2V7Y1trKzIwPj4yXT1qfWlmKChqfDApPT0wKXticmVha319aWYoaj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2orMjQ+PjJdPWs7aD1jW2ErKGIrMTYpPj4yXXwwO2Rve2lmKChofDApIT0wKXtpZihoPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1tqKzE2Pj4yXT1oO2NbaCsyND4+Ml09ajticmVha319fXdoaWxlKDApO2g9Y1thKyhiKzIwKT4+Ml18MDtpZigoaHwwKSE9MCl7aWYoaD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbaisyMD4+Ml09aDtjW2grMjQ+PjJdPWo7YnJlYWt9fX19ZWxzZXtqPWNbYSsoYis4KT4+Ml18MDthPWNbYSsoYisxMik+PjJdfDA7Yj0yMjIwOCsobTw8MTw8Mil8MDtpZigoanwwKSE9KGJ8MCkpe2lmKGo+Pj4wPGw+Pj4wKXtYYigpfWlmKChjW2orMTI+PjJdfDApIT0oaHwwKSl7WGIoKX19aWYoKGF8MCk9PShqfDApKXtjWzU1NDJdPWNbNTU0Ml0mfigxPDxtKTticmVha31pZigoYXwwKSE9KGJ8MCkpe2lmKGE+Pj4wPGw+Pj4wKXtYYigpfWI9YSs4fDA7aWYoKGNbYj4+Ml18MCk9PShofDApKXtrPWJ9ZWxzZXtYYigpfX1lbHNle2s9YSs4fDB9Y1tqKzEyPj4yXT1hO2Nbaz4+Ml09an19d2hpbGUoMCk7Y1tlKzQ+PjJdPW58MTtjW2Urbj4+Ml09bjtpZigoZXwwKT09KGNbMjIxODg+PjJdfDApKXtjWzIyMTc2Pj4yXT1uO2k9ZDtyZXR1cm59fWVsc2V7Y1ttPj4yXT1vJi0yO2NbZSs0Pj4yXT1ufDE7Y1tlK24+PjJdPW59YT1uPj4+MztpZihuPj4+MDwyNTYpe2I9YTw8MTtoPTIyMjA4KyhiPDwyKXwwO2o9Y1s1NTQyXXwwO2E9MTw8YTtpZigoaiZhfDApIT0wKXtiPTIyMjA4KyhiKzI8PDIpfDA7YT1jW2I+PjJdfDA7aWYoYT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2c9YjtmPWF9fWVsc2V7Y1s1NTQyXT1qfGE7Zz0yMjIwOCsoYisyPDwyKXwwO2Y9aH1jW2c+PjJdPWU7Y1tmKzEyPj4yXT1lO2NbZSs4Pj4yXT1mO2NbZSsxMj4+Ml09aDtpPWQ7cmV0dXJufWY9bj4+Pjg7aWYoKGZ8MCkhPTApe2lmKG4+Pj4wPjE2Nzc3MjE1KXtmPTMxfWVsc2V7dT0oZisxMDQ4MzIwfDApPj4+MTYmODt2PWY8PHU7dD0odis1MjAxOTJ8MCk+Pj4xNiY0O3Y9djw8dDtmPSh2KzI0NTc2MHwwKT4+PjE2JjI7Zj0xNC0odHx1fGYpKyh2PDxmPj4+MTUpfDA7Zj1uPj4+KGYrN3wwKSYxfGY8PDF9fWVsc2V7Zj0wfWE9MjI0NzIrKGY8PDIpfDA7Y1tlKzI4Pj4yXT1mO2NbZSsyMD4+Ml09MDtjW2UrMTY+PjJdPTA7aD1jWzIyMTcyPj4yXXwwO2c9MTw8ZjtpZigoaCZnfDApPT0wKXtjWzIyMTcyPj4yXT1ofGc7Y1thPj4yXT1lO2NbZSsyND4+Ml09YTtjW2UrMTI+PjJdPWU7Y1tlKzg+PjJdPWU7aT1kO3JldHVybn1nPWNbYT4+Ml18MDtpZigoZnwwKT09MzEpe2Y9MH1lbHNle2Y9MjUtKGY+Pj4xKXwwfWE6ZG97aWYoKGNbZys0Pj4yXSYtOHwwKSE9KG58MCkpe2Y9bjw8ZjthPWc7d2hpbGUoMSl7aD1hKyhmPj4+MzE8PDIpKzE2fDA7Zz1jW2g+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWlmKChjW2crND4+Ml0mLTh8MCk9PShufDApKXticmVhayBhfWVsc2V7Zj1mPDwxO2E9Z319aWYoaD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2g+PjJdPWU7Y1tlKzI0Pj4yXT1hO2NbZSsxMj4+Ml09ZTtjW2UrOD4+Ml09ZTtpPWQ7cmV0dXJufX13aGlsZSgwKTtmPWcrOHwwO2E9Y1tmPj4yXXwwO2g9Y1syMjE4ND4+Ml18MDtpZihnPj4+MDxoPj4+MCl7WGIoKX1pZihhPj4+MDxoPj4+MCl7WGIoKX1jW2ErMTI+PjJdPWU7Y1tmPj4yXT1lO2NbZSs4Pj4yXT1hO2NbZSsxMj4+Ml09ZztjW2UrMjQ+PjJdPTA7aT1kO3JldHVybn1mdW5jdGlvbiB5bihhKXthPWF8MDt2YXIgYj0wO2I9aTtSYihhfDApO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIHpuKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBBbihhKXthPWF8MDtyZXR1cm4gMjI2OTZ9ZnVuY3Rpb24gQm4oYixlLGYsZyl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wO2g9aTtpZihlPj4+MD4zNil7Y1soYmIoKXwwKT4+Ml09MjI7cz0wO3Q9MDtJPXM7aT1oO3JldHVybiB0fDB9az1iKzR8MDtqPWIrMTAwfDA7ZG97bD1jW2s+PjJdfDA7aWYobD4+PjA8KGNbaj4+Ml18MCk+Pj4wKXtjW2s+PjJdPWwrMTtvPWRbbD4+MF18MH1lbHNle289RG4oYil8MH19d2hpbGUoKG98MCk9PTMyfChvKyAtOXwwKT4+PjA8NSk7ZG97aWYoKG98MCk9PTQzfChvfDApPT00NSl7bD0oKG98MCk9PTQ1KTw8MzE+PjMxO209Y1trPj4yXXwwO2lmKG0+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1tKzE7bz1kW20+PjBdfDA7YnJlYWt9ZWxzZXtvPURuKGIpfDA7YnJlYWt9fWVsc2V7bD0wfX13aGlsZSgwKTttPShlfDApPT0wO2Rve2lmKChlJi0xN3wwKT09MCYob3wwKT09NDgpe249Y1trPj4yXXwwO2lmKG4+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1uKzE7bz1kW24+PjBdfDB9ZWxzZXtvPURuKGIpfDB9aWYoKG98MzJ8MCkhPTEyMCl7ZT1tPzg6ZTttPTI4O2JyZWFrfWU9Y1trPj4yXXwwO2lmKGU+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1lKzE7bz1kW2U+PjBdfDB9ZWxzZXtvPURuKGIpfDB9aWYoKGRbbysyMjc0NT4+MF18MCk+MTUpe2lmKChjW2o+PjJdfDApPT0wKXtzPTA7dD0wO0k9cztpPWg7cmV0dXJuIHR8MH1jW2s+PjJdPShjW2s+PjJdfDApKyAtMjtzPTA7dD0wO0k9cztpPWg7cmV0dXJuIHR8MH1lbHNle2U9MTY7bT00M319ZWxzZXtlPW0/MTA6ZTtpZigoZFtvKzIyNzQ1Pj4wXXwwKT4+PjA8ZT4+PjApe209Mjh9ZWxzZXtmPWNbaz4+Ml18MDtpZigoY1tqPj4yXXwwKSE9MCl7Zj1mKyAtMXwwO2Nbaz4+Ml09Zn1jW2IrMTA0Pj4yXT0wO3M9Y1tiKzg+PjJdfDA7Y1tiKzEwOD4+Ml09cy1mO2Nbaj4+Ml09cztjWyhiYigpfDApPj4yXT0yMjtzPTA7dD0wO0k9cztpPWg7cmV0dXJuIHR8MH19fXdoaWxlKDApO2lmKChtfDApPT0yOCl7aWYoKGV8MCk9PTEwKXtlPW8rIC00OHwwO2lmKGU+Pj4wPDEwKXtuPTA7d2hpbGUoMSl7bj1uK2V8MDtlPWNbaz4+Ml18MDtpZihlPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09ZSsxO289ZFtlPj4wXXwwfWVsc2V7bz1EbihiKXwwfWU9bysgLTQ4fDA7aWYoIShlPj4+MDwxMCZuPj4+MDw0Mjk0OTY3MjkpKXticmVha31uPW4qMTB8MH1wPTB9ZWxzZXtuPTA7cD0wfWU9bysgLTQ4fDA7aWYoZT4+PjA8MTApe2Rve3M9Vm4obnwwLHB8MCwxMCwwKXwwO3I9STtxPSgoZXwwKTwwKTw8MzE+PjMxO3Q9fnE7aWYocj4+PjA+dD4+PjB8KHJ8MCk9PSh0fDApJnM+Pj4wPn5lPj4+MCl7YnJlYWt9bj1JbihzfDAscnwwLGV8MCxxfDApfDA7cD1JO2U9Y1trPj4yXXwwO2lmKGU+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1lKzE7bz1kW2U+PjBdfDB9ZWxzZXtvPURuKGIpfDB9ZT1vKyAtNDh8MH13aGlsZShlPj4+MDwxMCYocD4+PjA8NDI5NDk2NzI5fChwfDApPT00Mjk0OTY3Mjkmbj4+PjA8MjU3Njk4MDM3OCkpO2lmKCEoZT4+PjA+OSkpe2U9MTA7bT02OX19fWVsc2V7bT00M319YTpkb3tpZigobXwwKT09NDMpe2lmKChlKyAtMSZlfDApPT0wKXttPWFbMjMwMDgrKChlKjIzfDApPj4+NSY3KT4+MF18MDtyPWFbbysyMjc0NT4+MF18MDtuPXImMjU1O2lmKG4+Pj4wPGU+Pj4wKXtvPW47bj0wO2Rve249b3xuPDxtO289Y1trPj4yXXwwO2lmKG8+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1vKzE7cz1kW28+PjBdfDB9ZWxzZXtzPURuKGIpfDB9cj1hW3MrMjI3NDU+PjBdfDA7bz1yJjI1NX13aGlsZShvPj4+MDxlPj4+MCZuPj4+MDwxMzQyMTc3MjgpO3A9MH1lbHNle3A9MDtuPTA7cz1vfXE9S24oLTEsLTEsbXwwKXwwO289STtpZigociYyNTUpPj4+MD49ZT4+PjB8KHA+Pj4wPm8+Pj4wfChwfDApPT0ob3wwKSZuPj4+MD5xPj4+MCkpe289czttPTY5O2JyZWFrfXdoaWxlKDEpe249T24obnwwLHB8MCxtfDApfDA7cD1JO249ciYyNTV8bjtyPWNbaz4+Ml18MDtpZihyPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09cisxO3M9ZFtyPj4wXXwwfWVsc2V7cz1EbihiKXwwfXI9YVtzKzIyNzQ1Pj4wXXwwO2lmKChyJjI1NSk+Pj4wPj1lPj4+MHwocD4+PjA+bz4+PjB8KHB8MCk9PShvfDApJm4+Pj4wPnE+Pj4wKSl7bz1zO209Njk7YnJlYWsgYX19fXE9YVtvKzIyNzQ1Pj4wXXwwO209cSYyNTU7aWYobT4+PjA8ZT4+PjApe249MDtkb3tuPW0rKGVhKG4sZSl8MCl8MDttPWNbaz4+Ml18MDtpZihtPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09bSsxO3I9ZFttPj4wXXwwfWVsc2V7cj1EbihiKXwwfXE9YVtyKzIyNzQ1Pj4wXXwwO209cSYyNTV9d2hpbGUobT4+PjA8ZT4+PjAmbj4+PjA8MTE5MzA0NjQ3KTtwPTB9ZWxzZXtuPTA7cD0wO3I9b31pZigocSYyNTUpPj4+MDxlPj4+MCl7bT1XbigtMSwtMSxlfDAsMCl8MDtvPUk7d2hpbGUoMSl7aWYocD4+PjA+bz4+PjB8KHB8MCk9PShvfDApJm4+Pj4wPm0+Pj4wKXtvPXI7bT02OTticmVhayBhfXM9Vm4obnwwLHB8MCxlfDAsMCl8MDt0PUk7cT1xJjI1NTtpZih0Pj4+MD40Mjk0OTY3Mjk1fCh0fDApPT0tMSZzPj4+MD5+cT4+PjApe289cjttPTY5O2JyZWFrIGF9bj1JbihxfDAsMCxzfDAsdHwwKXwwO3A9STtxPWNbaz4+Ml18MDtpZihxPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09cSsxO3I9ZFtxPj4wXXwwfWVsc2V7cj1EbihiKXwwfXE9YVtyKzIyNzQ1Pj4wXXwwO2lmKCEoKHEmMjU1KT4+PjA8ZT4+PjApKXtvPXI7bT02OTticmVha319fWVsc2V7bz1yO209Njl9fX13aGlsZSgwKTtpZigobXwwKT09Njkpe2lmKChkW28rMjI3NDU+PjBdfDApPj4+MDxlPj4+MCl7ZG97bT1jW2s+PjJdfDA7aWYobT4+PjA8KGNbaj4+Ml18MCk+Pj4wKXtjW2s+PjJdPW0rMTttPWRbbT4+MF18MH1lbHNle209RG4oYil8MH19d2hpbGUoKGRbbSsyMjc0NT4+MF18MCk+Pj4wPGU+Pj4wKTtjWyhiYigpfDApPj4yXT0zNDtwPWc7bj1mfX1pZigoY1tqPj4yXXwwKSE9MCl7Y1trPj4yXT0oY1trPj4yXXwwKSsgLTF9aWYoIShwPj4+MDxnPj4+MHwocHwwKT09KGd8MCkmbj4+PjA8Zj4+PjApKXtpZigoZiYxfDApPT0wJjA9PTAmKGx8MCk9PTApe2NbKGJiKCl8MCk+PjJdPTM0O3Q9SW4oZnwwLGd8MCwtMSwtMSl8MDtzPUk7ST1zO2k9aDtyZXR1cm4gdHwwfWlmKHA+Pj4wPmc+Pj4wfChwfDApPT0oZ3wwKSZuPj4+MD5mPj4+MCl7Y1soYmIoKXwwKT4+Ml09MzQ7cz1nO3Q9ZjtJPXM7aT1oO3JldHVybiB0fDB9fXQ9KChsfDApPDApPDwzMT4+MzE7dD1IbihuXmx8MCxwXnR8MCxsfDAsdHwwKXwwO3M9STtJPXM7aT1oO3JldHVybiB0fDB9ZnVuY3Rpb24gQ24oYSl7YT1hfDA7dmFyIGI9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7ZT1pO2Y9YSs0fDA7Zz1jW2Y+PjJdfDA7Yj1hKzEwMHwwO2lmKGc+Pj4wPChjW2I+PjJdfDApPj4+MCl7Y1tmPj4yXT1nKzE7aj1kW2c+PjBdfDB9ZWxzZXtqPURuKGEpfDB9aWYoKGp8MCk9PTQzfChqfDApPT00NSl7Zz0oanwwKT09NDUmMTtoPWNbZj4+Ml18MDtpZihoPj4+MDwoY1tiPj4yXXwwKT4+PjApe2NbZj4+Ml09aCsxO2o9ZFtoPj4wXXwwfWVsc2V7aj1EbihhKXwwfWlmKCEoKGorIC00OHwwKT4+PjA8MTApPyhjW2I+PjJdfDApIT0wOjApe2NbZj4+Ml09KGNbZj4+Ml18MCkrIC0xfX1lbHNle2c9MH1pZigoaisgLTQ4fDApPj4+MD45KXtpZigoY1tiPj4yXXwwKT09MCl7az0tMjE0NzQ4MzY0ODtsPTA7ST1rO2k9ZTtyZXR1cm4gbHwwfWNbZj4+Ml09KGNbZj4+Ml18MCkrIC0xO2s9LTIxNDc0ODM2NDg7bD0wO0k9aztpPWU7cmV0dXJuIGx8MH1lbHNle2g9MH13aGlsZSgxKXtoPWorIC00OCtofDA7aj1jW2Y+PjJdfDA7aWYoaj4+PjA8KGNbYj4+Ml18MCk+Pj4wKXtjW2Y+PjJdPWorMTtqPWRbaj4+MF18MH1lbHNle2o9RG4oYSl8MH1sPShqKyAtNDh8MCk+Pj4wPDEwO2lmKCEobCYoaHwwKTwyMTQ3NDgzNjQpKXticmVha31oPWgqMTB8MH1rPSgoaHwwKTwwKTw8MzE+PjMxO2lmKGwpe2Rve2s9Vm4oaHwwLGt8MCwxMCwwKXwwO2g9STtqPUluKGp8MCwoKGp8MCk8MCk8PDMxPj4zMXwwLC00OCwtMSl8MDtoPUluKGp8MCxJfDAsa3wwLGh8MCl8MDtrPUk7aj1jW2Y+PjJdfDA7aWYoaj4+PjA8KGNbYj4+Ml18MCk+Pj4wKXtjW2Y+PjJdPWorMTtqPWRbaj4+MF18MH1lbHNle2o9RG4oYSl8MH19d2hpbGUoKGorIC00OHwwKT4+PjA8MTAmKChrfDApPDIxNDc0ODM2fChrfDApPT0yMTQ3NDgzNiZoPj4+MDwyMDYxNTg0MzAyKSl9aWYoKGorIC00OHwwKT4+PjA8MTApe2Rve2o9Y1tmPj4yXXwwO2lmKGo+Pj4wPChjW2I+PjJdfDApPj4+MCl7Y1tmPj4yXT1qKzE7aj1kW2o+PjBdfDB9ZWxzZXtqPURuKGEpfDB9fXdoaWxlKChqKyAtNDh8MCk+Pj4wPDEwKX1pZigoY1tiPj4yXXwwKSE9MCl7Y1tmPj4yXT0oY1tmPj4yXXwwKSsgLTF9aj0oZ3wwKSE9MDtsPUhuKDAsMCxofDAsa3wwKXwwO2s9aj9JOms7bD1qP2w6aDtJPWs7aT1lO3JldHVybiBsfDB9ZnVuY3Rpb24gRG4oYil7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtlPWk7aD1iKzEwNHwwO2w9Y1toPj4yXXwwO2lmKCEoKGx8MCkhPTA/KGNbYisxMDg+PjJdfDApPj0obHwwKTowKSl7Zz0zfWlmKChnfDApPT0zPyhmPUVuKGIpfDAsKGZ8MCk+PTApOjApe2w9Y1toPj4yXXwwO2g9Y1tiKzg+PjJdfDA7az1jW2IrND4+Ml18MDtpZigobHwwKSE9MD8oaj1sLShjW2IrMTA4Pj4yXXwwKSsgLTF8MCwoaC1rfDApPihqfDApKTowKXtjW2IrMTAwPj4yXT1rK2p9ZWxzZXtnPTh9aWYoKGd8MCk9PTgpe2NbYisxMDA+PjJdPWh9aWYoKGh8MCkhPTApe2w9YisxMDh8MDtjW2w+PjJdPWgrMS1rKyhjW2w+PjJdfDApfWI9aysgLTF8MDtpZigoZFtiPj4wXXwwfDApPT0oZnwwKSl7bD1mO2k9ZTtyZXR1cm4gbHwwfWFbYj4+MF09ZjtsPWY7aT1lO3JldHVybiBsfDB9Y1tiKzEwMD4+Ml09MDtsPS0xO2k9ZTtyZXR1cm4gbHwwfWZ1bmN0aW9uIEVuKGIpe2I9YnwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2c9aTtpPWkrMTZ8MDtlPWc7Zj1iKzh8MDtkb3tpZigoY1tmPj4yXXwwKT09MCl7aj1iKzc0fDA7aD1hW2o+PjBdfDA7YVtqPj4wXT1oKzI1NXxoO2o9YisyMHwwO2g9Yis0NHwwO2lmKChjW2o+PjJdfDApPj4+MD4oY1toPj4yXXwwKT4+PjApe2hjW2NbYiszNj4+Ml0mNjNdKGIsMCwwKXwwfWNbYisxNj4+Ml09MDtjW2IrMjg+PjJdPTA7Y1tqPj4yXT0wO2o9Y1tiPj4yXXwwO2lmKChqJjIwfDApPT0wKXtqPWNbaD4+Ml18MDtjW2Y+PjJdPWo7Y1tiKzQ+PjJdPWo7YnJlYWt9aWYoKGomNHwwKT09MCl7aj0tMTtpPWc7cmV0dXJuIGp8MH1jW2I+PjJdPWp8MzI7aj0tMTtpPWc7cmV0dXJuIGp8MH19d2hpbGUoMCk7aWYoKGhjW2NbYiszMj4+Ml0mNjNdKGIsZSwxKXwwKSE9MSl7aj0tMTtpPWc7cmV0dXJuIGp8MH1qPWRbZT4+MF18MDtpPWc7cmV0dXJuIGp8MH1mdW5jdGlvbiBGbihiLGUpe2I9YnwwO2U9ZXwwO3ZhciBmPTAsZz0wLGo9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MC4wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLjAsSj0wLEs9MCxMPTAuMCxNPTAuMCxOPTAuMCxPPTAuMDtmPWk7aT1pKzYyNHwwO289ZisxMTJ8MDtxPWY7bD1xKzB8MDtqPWwrMTA4fDA7ZG97Y1tsPj4yXT0wO2w9bCs0fDB9d2hpbGUoKGx8MCk8KGp8MCkpO209cSs0fDA7Y1ttPj4yXT1iO2w9cSs4fDA7Y1tsPj4yXT0tMTtjW3ErNDQ+PjJdPWI7Y1txKzc2Pj4yXT0tMTtzPXErMTA0fDA7Y1tzPj4yXT0wO2o9cSsxMDh8MDtjW2o+PjJdPX5iO3A9cSsxMDB8MDtjW3A+PjJdPS0xO249Yjt6PS0xO3doaWxlKDEpe2lmKG4+Pj4wPHo+Pj4wKXtjW20+PjJdPW4rMTt6PWRbbj4+MF18MH1lbHNle3o9RG4ocSl8MH1pZighKCh6fDApPT0zMnwoeisgLTl8MCk+Pj4wPDUpKXticmVha31uPWNbbT4+Ml18MDt6PWNbcD4+Ml18MH1kb3tpZigoenwwKT09NDN8KHp8MCk9PTQ1KXtuPTEtKCgoenwwKT09NDUmMSk8PDEpfDA7ej1jW20+PjJdfDA7aWYoej4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPXorMTt6PWRbej4+MF18MDticmVha31lbHNle3o9RG4ocSl8MDticmVha319ZWxzZXtuPTF9fXdoaWxlKDApO0I9MDtkb3tpZigoenwzMnwwKSE9KGFbMjMwMjQrQj4+MF18MCkpe2JyZWFrfWRve2lmKEI+Pj4wPDcpe3o9Y1ttPj4yXXwwO2lmKHo+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT16KzE7ej1kW3o+PjBdfDA7YnJlYWt9ZWxzZXt6PURuKHEpfDA7YnJlYWt9fX13aGlsZSgwKTtCPUIrMXwwfXdoaWxlKEI+Pj4wPDgpO2E6ZG97aWYoKEJ8MCk9PTMpe2c9MjF9ZWxzZSBpZigoQnwwKSE9OCl7aWYoIShCPj4+MDw0KSl7aWYoKEJ8MCk9PTgpe2c9MjU7YnJlYWt9ZWxzZXtnPTIxO2JyZWFrfX1iOmRve2lmKChCfDApPT0wKXtCPTA7ZG97aWYoKHp8MzJ8MCkhPShhWzIzMDQwK0I+PjBdfDApKXticmVhayBifWRve2lmKEI+Pj4wPDIpe3o9Y1ttPj4yXXwwO2lmKHo+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT16KzE7ej1kW3o+PjBdfDA7YnJlYWt9ZWxzZXt6PURuKHEpfDA7YnJlYWt9fX13aGlsZSgwKTtCPUIrMXwwfXdoaWxlKEI+Pj4wPDMpfX13aGlsZSgwKTtpZigoQnwwKT09MCl7ZG97aWYoKHp8MCk9PTQ4KXt6PWNbbT4+Ml18MDtpZih6Pj4+MDwoY1twPj4yXXwwKT4+PjApe2NbbT4+Ml09eisxO3o9ZFt6Pj4wXXwwfWVsc2V7ej1EbihxKXwwfWlmKCh6fDMyfDApIT0xMjApe2lmKChjW3A+PjJdfDApPT0wKXt6PTQ4O2JyZWFrfWNbbT4+Ml09KGNbbT4+Ml18MCkrIC0xO3o9NDg7YnJlYWt9bz1jW20+PjJdfDA7aWYobz4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPW8rMTtGPWRbbz4+MF18MDtEPTB9ZWxzZXtGPURuKHEpfDA7RD0wfXdoaWxlKDEpe2lmKChGfDApPT00Nil7Zz02NTticmVha31lbHNlIGlmKChGfDApIT00OCl7bz0wO3M9MDtBPTA7ej0wO0M9MDtFPTA7SD0xLjA7Qj0wO3c9MC4wO2JyZWFrfW89Y1ttPj4yXXwwO2lmKG8+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT1vKzE7Rj1kW28+PjBdfDA7RD0xO2NvbnRpbnVlfWVsc2V7Rj1EbihxKXwwO0Q9MTtjb250aW51ZX19Yzpkb3tpZigoZ3wwKT09NjUpe289Y1ttPj4yXXwwO2lmKG8+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT1vKzE7Rj1kW28+PjBdfDB9ZWxzZXtGPURuKHEpfDB9aWYoKEZ8MCk9PTQ4KXtBPS0xO3o9LTE7d2hpbGUoMSl7bz1jW20+PjJdfDA7aWYobz4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPW8rMTtGPWRbbz4+MF18MH1lbHNle0Y9RG4ocSl8MH1pZigoRnwwKSE9NDgpe289MDtzPTA7RD0xO0M9MTtFPTA7SD0xLjA7Qj0wO3c9MC4wO2JyZWFrIGN9Sz1JbihBfDAsenwwLC0xLC0xKXwwO0E9Szt6PUl9fWVsc2V7bz0wO3M9MDtBPTA7ej0wO0M9MTtFPTA7SD0xLjA7Qj0wO3c9MC4wfX19d2hpbGUoMCk7ZDp3aGlsZSgxKXtLPUYrIC00OHwwO2Rve2lmKCEoSz4+PjA8MTApKXtHPUZ8MzI7Sj0oRnwwKT09NDY7aWYoISgoRysgLTk3fDApPj4+MDw2fEopKXticmVhayBkfWlmKEope2lmKChDfDApPT0wKXtBPXM7ej1vO0M9MTticmVha31lbHNle0Y9NDY7YnJlYWsgZH19ZWxzZXtLPShGfDApPjU3P0crIC04N3wwOks7Zz03OTticmVha319ZWxzZXtnPTc5fX13aGlsZSgwKTtpZigoZ3wwKT09Nzkpe2c9MDtkb3tpZighKChvfDApPDB8KG98MCk9PTAmcz4+PjA8OCkpe2lmKChvfDApPDB8KG98MCk9PTAmcz4+PjA8MTQpe049SCouMDYyNTtMPU47dz13K04qKyhLfDApO2JyZWFrfWlmKChLfDApIT0wJihFfDApPT0wKXtFPTE7TD1IO3c9dytIKi41fWVsc2V7TD1IfX1lbHNle0w9SDtCPUsrKEI8PDQpfDB9fXdoaWxlKDApO3M9SW4oc3wwLG98MCwxLDApfDA7bz1JO0Q9MTtIPUx9Rj1jW20+PjJdfDA7aWYoRj4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPUYrMTtGPWRbRj4+MF18MDtjb250aW51ZX1lbHNle0Y9RG4ocSl8MDtjb250aW51ZX19aWYoKER8MCk9PTApe2lmKChjW3A+PjJdfDApIT0wPyh2PWNbbT4+Ml18MCxjW20+PjJdPXYrIC0yLChDfDApIT0wKTowKXtjW20+PjJdPXYrIC0zfXc9KyhufDApKjAuMDticmVhayBhfUs9KEN8MCk9PTA7dj1LP3M6QTt6PUs/bzp6O2lmKChvfDApPDB8KG98MCk9PTAmcz4+PjA8OCl7ZG97Qj1CPDw0O3M9SW4oc3wwLG98MCwxLDApfDA7bz1JfXdoaWxlKChvfDApPDB8KG98MCk9PTAmcz4+PjA8OCl9aWYoISgoRnwzMnwwKT09MTEyPyh1PUNuKHEpfDAsdD1JLCEoKHV8MCk9PTAmKHR8MCk9PS0yMTQ3NDgzNjQ4KSk6MCkpe2lmKChjW3A+PjJdfDApPT0wKXt1PTA7dD0wfWVsc2V7Y1ttPj4yXT0oY1ttPj4yXXwwKSsgLTE7dT0wO3Q9MH19bz1Pbih2fDAsenwwLDIpfDA7bz1JbihvfDAsSXwwLC0zMiwtMSl8MDtvPUluKG98MCxJfDAsdXwwLHR8MCl8MDtwPUk7aWYoKEJ8MCk9PTApe3c9KyhufDApKjAuMDticmVhayBhfWlmKChwfDApPjB8KHB8MCk9PTAmbz4+PjA+MTA3NCl7Y1soYmIoKXwwKT4+Ml09MzQ7dz0rKG58MCkqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7YnJlYWsgYX1pZigocHwwKTwtMXwocHwwKT09LTEmbz4+PjA8NDI5NDk2NjExNil7Y1soYmIoKXwwKT4+Ml09MzQ7dz0rKG58MCkqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7YnJlYWsgYX1pZigoQnwwKT4tMSl7ZG97Qj1CPDwxO2lmKCEodz49LjUpKXtIPXd9ZWxzZXtIPXcrLTEuMDtCPUJ8MX13PXcrSDtvPUluKG98MCxwfDAsLTEsLTEpfDA7cD1JfXdoaWxlKChCfDApPi0xKX1wPUluKG98MCxwfDAsMTEwNiwwKXwwO0s9STtkb3tpZigoS3wwKTwwfChLfDApPT0wJnA+Pj4wPDUzPyhyPShwfDApPDA/MDpwLChyfDApPDUzKTowKXtwPTg0LXJ8MDtkb3tpZigocHwwKT4xMDIzKXtxPXArIC0xMDIzfDA7aWYoKHF8MCk8PTEwMjMpe3A9cTtIPTguOTg4NDY1Njc0MzExNThlKzMwNzticmVha31wPXArIC0yMDQ2fDA7cD0ocHwwKT4xMDIzPzEwMjM6cDtIPXl9ZWxzZXtpZighKChwfDApPC0xMDIyKSl7SD0xLjA7YnJlYWt9cT1wKzEwMjJ8MDtpZighKChxfDApPC0xMDIyKSl7cD1xO0g9Mi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7YnJlYWt9cD1wKzIwNDR8MDtwPShwfDApPC0xMDIyPy0xMDIyOnA7SD0wLjB9fXdoaWxlKDApO0o9T24ocCsxMDIzfDAsMCw1Mil8MDtLPUk7Y1trPj4yXT1KO2Nbays0Pj4yXT1LO009KyhufDApO0w9K1NiKCsoSCoraFtrPj4zXSksK00pO2lmKCEoKHJ8MCk8MzImdyE9MC4wKSl7SD1NO2JyZWFrfUs9QiYxO0g9TTtCPShLXjEpK0J8MDt3PShLfDApPT0wPzAuMDp3fWVsc2V7Zz0xMTR9fXdoaWxlKDApO2lmKChnfDApPT0xMTQpe0g9KyhufDApO0w9MC4wfXc9SCp3KyhMK0gqKyhCPj4+MCkpLUw7aWYoISh3IT0wLjApKXtjWyhiYigpfDApPj4yXT0zNH1kb3tpZigob3wwKT4xMDIzKXt3PXcqOC45ODg0NjU2NzQzMTE1OGUrMzA3O249bysgLTEwMjN8MDtpZigobnwwKTw9MTAyMyl7bz1uO2JyZWFrfW89bysgLTIwNDZ8MDtvPShvfDApPjEwMjM/MTAyMzpvO3c9dyo4Ljk4ODQ2NTY3NDMxMTU4ZSszMDd9ZWxzZXtpZighKChvfDApPC0xMDIyKSl7YnJlYWt9dz13KjIuMjI1MDczODU4NTA3MjAxNGUtMzA4O249bysxMDIyfDA7aWYoISgobnwwKTwtMTAyMikpe289bjticmVha31vPW8rMjA0NHwwO289KG98MCk8LTEwMjI/LTEwMjI6bzt3PXcqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDh9fXdoaWxlKDApO0o9T24obysxMDIzfDAsMCw1Mil8MDtLPUk7Y1trPj4yXT1KO2Nbays0Pj4yXT1LO3c9dyoraFtrPj4zXTticmVhayBhfX13aGlsZSgwKTtHPTA7d2hpbGUoMSl7aWYoKHp8MCk9PTQ2KXtnPTEzOTticmVha31lbHNlIGlmKCh6fDApIT00OCl7cj0wO0Y9MDtDPTA7YnJlYWt9cj1jW20+PjJdfDA7aWYocj4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPXIrMTt6PWRbcj4+MF18MDtHPTE7Y29udGludWV9ZWxzZXt6PURuKHEpfDA7Rz0xO2NvbnRpbnVlfX1lOmRve2lmKChnfDApPT0xMzkpe3I9Y1ttPj4yXXwwO2lmKHI+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT1yKzE7ej1kW3I+PjBdfDB9ZWxzZXt6PURuKHEpfDB9aWYoKHp8MCk9PTQ4KXtyPS0xO0Y9LTE7d2hpbGUoMSl7dD1jW20+PjJdfDA7aWYodD4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPXQrMTt6PWRbdD4+MF18MH1lbHNle3o9RG4ocSl8MH1pZigoenwwKSE9NDgpe0c9MTtDPTE7YnJlYWsgZX1LPUluKHJ8MCxGfDAsLTEsLTEpfDA7cj1LO0Y9SX19ZWxzZXtyPTA7Rj0wO0M9MX19fXdoaWxlKDApO2Nbbz4+Ml09MDtEPXorIC00OHwwO0o9KHp8MCk9PTQ2O2Y6ZG97aWYoRD4+PjA8MTB8Sil7dD1vKzQ5NnwwO0U9MDtCPTA7QT0wO3Y9MDt1PTA7d2hpbGUoMSl7ZG97aWYoSil7aWYoKEN8MCk9PTApe3I9RTtGPUI7Qz0xfWVsc2V7YnJlYWsgZn19ZWxzZXtKPUluKEV8MCxCfDAsMSwwKXwwO0I9STtLPSh6fDApIT00ODtpZigodnwwKT49MTI1KXtpZighSyl7RT1KO2JyZWFrfWNbdD4+Ml09Y1t0Pj4yXXwxO0U9SjticmVha31FPW8rKHY8PDIpfDA7aWYoKEF8MCkhPTApe0Q9eisgLTQ4KygoY1tFPj4yXXwwKSoxMHwwKXwwfWNbRT4+Ml09RDtBPUErMXwwO0Q9KEF8MCk9PTk7RT1KO0c9MTtBPUQ/MDpBO3Y9KEQmMSkrdnwwO3U9Sz9KOnV9fXdoaWxlKDApO3o9Y1ttPj4yXXwwO2lmKHo+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT16KzE7ej1kW3o+PjBdfDB9ZWxzZXt6PURuKHEpfDB9RD16KyAtNDh8MDtKPSh6fDApPT00NjtpZighKEQ+Pj4wPDEwfEopKXtnPTE2MjticmVha319fWVsc2V7RT0wO0I9MDtBPTA7dj0wO3U9MDtnPTE2Mn19d2hpbGUoMCk7aWYoKGd8MCk9PTE2Mil7Sz0oQ3wwKT09MDtyPUs/RTpyO0Y9Sz9COkZ9dD0oR3wwKSE9MDtpZih0Pyh6fDMyfDApPT0xMDE6MCl7ej1DbihxKXwwO3E9STtpZigoenwwKT09MCYocXwwKT09LTIxNDc0ODM2NDgpe2lmKChjW3A+PjJdfDApPT0wKXt6PTA7cT0wfWVsc2V7Y1ttPj4yXT0oY1ttPj4yXXwwKSsgLTE7ej0wO3E9MH19cj1Jbih6fDAscXwwLHJ8MCxGfDApfDA7Rj1JfWVsc2V7aWYoKHp8MCk+LTE/KGNbcD4+Ml18MCkhPTA6MCl7Y1ttPj4yXT0oY1ttPj4yXXwwKSsgLTF9fWlmKCF0KXtjWyhiYigpfDApPj4yXT0yMjtjW3M+PjJdPTA7Sz1jW2w+PjJdfDA7Y1tqPj4yXT1LLShjW20+PjJdfDApO2NbcD4+Ml09Szt3PTAuMDticmVha31wPWNbbz4+Ml18MDtpZigocHwwKT09MCl7dz0rKG58MCkqMC4wO2JyZWFrfWlmKChyfDApPT0oRXwwKSYoRnwwKT09KEJ8MCkmKChCfDApPDB8KEJ8MCk9PTAmRT4+PjA8MTApKXt3PSsobnwwKSorKHA+Pj4wKTticmVha31pZigoRnwwKT4wfChGfDApPT0wJnI+Pj4wPjUzNyl7Y1soYmIoKXwwKT4+Ml09MzQ7dz0rKG58MCkqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7YnJlYWt9aWYoKEZ8MCk8LTF8KEZ8MCk9PS0xJnI+Pj4wPDQyOTQ5NjYxMTYpe2NbKGJiKCl8MCk+PjJdPTM0O3c9KyhufDApKjIuMjI1MDczODU4NTA3MjAxNGUtMzA4KjIuMjI1MDczODU4NTA3MjAxNGUtMzA4O2JyZWFrfWlmKChBfDApIT0wKXtpZigoQXwwKTw5KXtxPW8rKHY8PDIpfDA7cD1jW3E+PjJdfDA7ZG97cD1wKjEwfDA7QT1BKzF8MH13aGlsZSgoQXwwKSE9OSk7Y1txPj4yXT1wfXY9disxfDB9ZG97aWYoKHV8MCk8OT8odXwwKTw9KHJ8MCkmKHJ8MCk8MTg6MCl7aWYoKHJ8MCk9PTkpe3c9KyhufDApKisoKGNbbz4+Ml18MCk+Pj4wKTticmVhayBhfWlmKChyfDApPDkpe3c9KyhufDApKisoKGNbbz4+Ml18MCk+Pj4wKS8rKGNbMjMwNTYrKDgtcjw8Mik+PjJdfDApO2JyZWFrIGF9Sz0oZWEociwtMyl8MCkrODB8MDtwPWNbbz4+Ml18MDtpZigoS3wwKTw9MzA/KHA+Pj5LfDApIT0wOjApe2JyZWFrfXc9KyhufDApKisocD4+PjApKisoY1syMzA1NisocisgLTEwPDwyKT4+Ml18MCk7YnJlYWsgYX19d2hpbGUoMCk7cD0ocnwwKSU5fDA7aWYoKHB8MCk9PTApe3A9MDtxPTB9ZWxzZXtzPShyfDApPi0xP3A6cCs5fDA7cT1jWzIzMDU2Kyg4LXM8PDIpPj4yXXwwO2lmKCh2fDApIT0wKXt0PTFlOS8ocXwwKXwwO3A9MDt6PTA7dT0wO2Rve0c9bysodTw8Mil8MDtKPWNbRz4+Ml18MDtLPSgoSj4+PjApLyhxPj4+MCl8MCkrenwwO2NbRz4+Ml09Szt6PWVhKChKPj4+MCklKHE+Pj4wKXwwLHQpfDA7Sj11O3U9dSsxfDA7aWYoKEp8MCk9PShwfDApJihLfDApPT0wKXtwPXUmMTI3O3I9cisgLTl8MH19d2hpbGUoKHV8MCkhPSh2fDApKTtpZigoenwwKSE9MCl7Y1tvKyh2PDwyKT4+Ml09ejt2PXYrMXwwfX1lbHNle3A9MDt2PTB9cT0wO3I9OS1zK3J8MH1nOndoaWxlKDEpe3M9bysocDw8Mil8MDtpZigocnwwKTwxOCl7ZG97dT0wO3M9disxMjd8MDt3aGlsZSgxKXtzPXMmMTI3O3Q9bysoczw8Mil8MDt6PU9uKGNbdD4+Ml18MCwwLDI5KXwwO3o9SW4oenwwLEl8MCx1fDAsMCl8MDt1PUk7aWYodT4+PjA+MHwodXwwKT09MCZ6Pj4+MD4xZTkpe0s9V24oenwwLHV8MCwxZTksMCl8MDt6PVhuKHp8MCx1fDAsMWU5LDApfDA7dT1LfWVsc2V7dT0wfWNbdD4+Ml09ejt0PShzfDApPT0ocHwwKTtpZighKChzfDApIT0odisxMjcmMTI3fDApfHQpKXt2PSh6fDApPT0wP3M6dn1pZih0KXticmVha31lbHNle3M9cysgLTF8MH19cT1xKyAtMjl8MH13aGlsZSgodXwwKT09MCl9ZWxzZXtpZigocnwwKSE9MTgpe2JyZWFrfWRve2lmKCEoKGNbcz4+Ml18MCk+Pj4wPDkwMDcxOTkpKXtyPTE4O2JyZWFrIGd9dT0wO3Q9disxMjd8MDt3aGlsZSgxKXt0PXQmMTI3O3o9bysodDw8Mil8MDtBPU9uKGNbej4+Ml18MCwwLDI5KXwwO0E9SW4oQXwwLEl8MCx1fDAsMCl8MDt1PUk7aWYodT4+PjA+MHwodXwwKT09MCZBPj4+MD4xZTkpe0s9V24oQXwwLHV8MCwxZTksMCl8MDtBPVhuKEF8MCx1fDAsMWU5LDApfDA7dT1LfWVsc2V7dT0wfWNbej4+Ml09QTt6PSh0fDApPT0ocHwwKTtpZighKCh0fDApIT0odisxMjcmMTI3fDApfHopKXt2PShBfDApPT0wP3Q6dn1pZih6KXticmVha31lbHNle3Q9dCsgLTF8MH19cT1xKyAtMjl8MH13aGlsZSgodXwwKT09MCl9cD1wKzEyNyYxMjc7aWYoKHB8MCk9PSh2fDApKXtLPXYrMTI3JjEyNzt2PW8rKCh2KzEyNiYxMjcpPDwyKXwwO2Nbdj4+Ml09Y1t2Pj4yXXxjW28rKEs8PDIpPj4yXTt2PUt9Y1tvKyhwPDwyKT4+Ml09dTtyPXIrOXwwfWg6d2hpbGUoMSl7cz12KzEmMTI3O3Q9bysoKHYrMTI3JjEyNyk8PDIpfDA7d2hpbGUoMSl7ej0ocnwwKT09MTg7dT0ocnwwKT4yNz85OjE7d2hpbGUoMSl7QT0wO3doaWxlKDEpe0I9QStwJjEyNztpZigoQnwwKT09KHZ8MCkpe0E9MjticmVha31CPWNbbysoQjw8Mik+PjJdfDA7RD1jWzIzMDQ4KyhBPDwyKT4+Ml18MDtpZihCPj4+MDxEPj4+MCl7QT0yO2JyZWFrfUM9QSsxfDA7aWYoQj4+PjA+RD4+PjApe2JyZWFrfWlmKChDfDApPDIpe0E9Q31lbHNle0E9QzticmVha319aWYoKEF8MCk9PTImeil7YnJlYWsgaH1xPXUrcXwwO2lmKChwfDApPT0odnwwKSl7cD12fWVsc2V7YnJlYWt9fXo9KDE8PHUpKyAtMXwwO0E9MWU5Pj4+dTtCPXA7Qz0wO2Rve0c9bysocDw8Mil8MDtKPWNbRz4+Ml18MDtLPShKPj4+dSkrQ3wwO2NbRz4+Ml09SztDPWVhKEomeixBKXwwO0s9KHB8MCk9PShCfDApJihLfDApPT0wO3A9cCsxJjEyNztyPUs/cisgLTl8MDpyO0I9Sz9wOkJ9d2hpbGUoKHB8MCkhPSh2fDApKTtpZigoQ3wwKT09MCl7cD1CO2NvbnRpbnVlfWlmKChzfDApIT0oQnwwKSl7YnJlYWt9Y1t0Pj4yXT1jW3Q+PjJdfDE7cD1CfWNbbysodjw8Mik+PjJdPUM7cD1CO3Y9c31yPXAmMTI3O2lmKChyfDApPT0odnwwKSl7Y1tvKyhzKyAtMTw8Mik+PjJdPTA7dj1zfUg9KygoY1tvKyhyPDwyKT4+Ml18MCk+Pj4wKTtyPXArMSYxMjc7aWYoKHJ8MCk9PSh2fDApKXt2PXYrMSYxMjc7Y1tvKyh2KyAtMTw8Mik+PjJdPTB9dz0rKG58MCk7SD13KihIKjEuMGU5KyArKChjW28rKHI8PDIpPj4yXXwwKT4+PjApKTtuPXErNTN8MDtyPXErMTEyN3wwO2Rve2lmKChyfDApPDUzKXtzPShyfDApPDA/MDpyO2lmKChzfDApPj01Myl7TT0wLjA7dD0xO049MC4wO2JyZWFrfXQ9MTA1LXN8MDtkb3tpZigodHwwKT4xMDIzKXt1PXQrIC0xMDIzfDA7aWYoKHV8MCk8PTEwMjMpe3Q9dTtMPTguOTg4NDY1Njc0MzExNThlKzMwNzticmVha310PXQrIC0yMDQ2fDA7dD0odHwwKT4xMDIzPzEwMjM6dDtMPXl9ZWxzZXtpZighKCh0fDApPC0xMDIyKSl7TD0xLjA7YnJlYWt9dT10KzEwMjJ8MDtpZighKCh1fDApPC0xMDIyKSl7dD11O0w9Mi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7YnJlYWt9dD10KzIwNDR8MDt0PSh0fDApPC0xMDIyPy0xMDIyOnQ7TD0wLjB9fXdoaWxlKDApO0s9T24odCsxMDIzfDAsMCw1Mil8MDt0PUk7Y1trPj4yXT1LO2Nbays0Pj4yXT10O0w9K1NiKCsoTCoraFtrPj4zXSksK0gpO3Q9NTMtc3wwO2Rve2lmKCh0fDApPjEwMjMpe3U9dCsgLTEwMjN8MDtpZigodXwwKTw9MTAyMyl7dD11O009OC45ODg0NjU2NzQzMTE1OGUrMzA3O2JyZWFrfXQ9dCsgLTIwNDZ8MDt0PSh0fDApPjEwMjM/MTAyMzp0O009eX1lbHNle2lmKCEoKHR8MCk8LTEwMjIpKXtNPTEuMDticmVha311PXQrMTAyMnwwO2lmKCEoKHV8MCk8LTEwMjIpKXt0PXU7TT0yLjIyNTA3Mzg1ODUwNzIwMTRlLTMwODticmVha310PXQrMjA0NHwwO3Q9KHR8MCk8LTEwMjI/LTEwMjI6dDtNPTAuMH19d2hpbGUoMCk7Sz1Pbih0KzEwMjN8MCwwLDUyKXwwO3Q9STtjW2s+PjJdPUs7Y1trKzQ+PjJdPXQ7Tz0rUGEoK0gsKyhNKitoW2s+PjNdKSk7TT1MO3Q9MTtOPU87SD1MKyhILU8pfWVsc2V7cz01MztNPTAuMDt0PTA7Tj0wLjB9fXdoaWxlKDApO3U9cCsyJjEyNztkb3tpZigodXwwKSE9KHZ8MCkpe289Y1tvKyh1PDwyKT4+Ml18MDtkb3tpZighKG8+Pj4wPDVlOCkpe2lmKG8+Pj4wPjVlOCl7Tj13Ki43NStOO2JyZWFrfWlmKChwKzMmMTI3fDApPT0odnwwKSl7Tj13Ki41K047YnJlYWt9ZWxzZXtOPXcqLjc1K047YnJlYWt9fWVsc2V7aWYoKG98MCk9PTA/KHArMyYxMjd8MCk9PSh2fDApOjApe2JyZWFrfU49dyouMjUrTn19d2hpbGUoMCk7aWYoKDUzLXN8MCk8PTEpe2JyZWFrfWlmKCtQYSgrTiwxLjApIT0wLjApe2JyZWFrfU49TisxLjB9fXdoaWxlKDApO3c9SCtOLU07ZG97aWYoKG4mMjE0NzQ4MzY0NCk+Pj4wPjEwMTkpe2lmKCtUKCt3KT49OTAwNzE5OTI1NDc0MDk5Mi4wKXt0PSh0fDApIT0wJihzfDApPT0ocnwwKT8wOnQ7cT1xKzF8MDt3PXcqLjV9aWYoKHErNTB8MCk8PTEwMjE/ISgodHwwKSE9MCZOIT0wLjApOjApe2JyZWFrfWNbKGJiKCl8MCk+PjJdPTM0fX13aGlsZSgwKTtkb3tpZigocXwwKT4xMDIzKXt3PXcqOC45ODg0NjU2NzQzMTE1OGUrMzA3O249cSsgLTEwMjN8MDtpZigobnwwKTw9MTAyMyl7cT1uO2JyZWFrfXE9cSsgLTIwNDZ8MDtxPShxfDApPjEwMjM/MTAyMzpxO3c9dyo4Ljk4ODQ2NTY3NDMxMTU4ZSszMDd9ZWxzZXtpZighKChxfDApPC0xMDIyKSl7YnJlYWt9dz13KjIuMjI1MDczODU4NTA3MjAxNGUtMzA4O249cSsxMDIyfDA7aWYoISgobnwwKTwtMTAyMikpe3E9bjticmVha31xPXErMjA0NHwwO3E9KHF8MCk8LTEwMjI/LTEwMjI6cTt3PXcqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDh9fXdoaWxlKDApO0o9T24ocSsxMDIzfDAsMCw1Mil8MDtLPUk7Y1trPj4yXT1KO2Nbays0Pj4yXT1LO3c9dyoraFtrPj4zXTticmVha31lbHNlIGlmKChCfDApPT0zKXtuPWNbbT4+Ml18MDtpZihuPj4+MDwoY1twPj4yXXwwKT4+PjApe2NbbT4+Ml09bisxO249ZFtuPj4wXXwwfWVsc2V7bj1EbihxKXwwfWlmKChufDApPT00MCl7bj0xfWVsc2V7aWYoKGNbcD4+Ml18MCk9PTApe3c9eDticmVha31jW20+PjJdPShjW20+PjJdfDApKyAtMTt3PXg7YnJlYWt9d2hpbGUoMSl7bz1jW20+PjJdfDA7aWYobz4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPW8rMTtvPWRbbz4+MF18MH1lbHNle289RG4ocSl8MH1pZighKChvKyAtNDh8MCk+Pj4wPDEwfChvKyAtNjV8MCk+Pj4wPDI2KT8hKChvKyAtOTd8MCk+Pj4wPDI2fChvfDApPT05NSk6MCl7YnJlYWt9bj1uKzF8MH1pZigob3wwKT09NDEpe3c9eDticmVha31pZigoY1twPj4yXXwwKT09MCl7dz14O2JyZWFrfW89KGNbbT4+Ml18MCkrIC0xfDA7Y1ttPj4yXT1vO2lmKChufDApPT0wKXt3PXg7YnJlYWt9ZG97bj1uKyAtMXwwO289bysgLTF8MH13aGlsZSgobnwwKSE9MCk7Y1ttPj4yXT1vO3c9eDticmVha31lbHNle249Y1ttPj4yXXwwO2lmKChjW3A+PjJdfDApIT0wKXtuPW4rIC0xfDA7Y1ttPj4yXT1ufWNbKGJiKCl8MCk+PjJdPTIyO2Nbcz4+Ml09MDtLPWNbbD4+Ml18MDtjW2o+PjJdPUstbjtjW3A+PjJdPUs7dz0wLjA7YnJlYWt9fWVsc2V7Zz0yNX19d2hpbGUoMCk7aWYoKGd8MCk9PTIxKXtpZigoY1twPj4yXXwwKSE9MD8oQT0oY1ttPj4yXXwwKSsgLTF8MCxjW20+PjJdPUEsIShCPj4+MDw0KSk6MCl7ZG97QT1BKyAtMXwwO0I9QisgLTF8MH13aGlsZShCPj4+MD4zKTtjW20+PjJdPUE7Zz0yNX1lbHNle2c9MjV9fWlmKChnfDApPT0yNSl7dz0rKG58MCkqeX1nPShjW20+PjJdfDApLShjW2w+PjJdfDApKyhjW2o+PjJdfDApfDA7aWYoKGV8MCk9PTApe2k9ZjtyZXR1cm4rd31pZigoZ3wwKSE9MCl7Yj1iK2d8MH1jW2U+PjJdPWI7aT1mO3JldHVybit3fWZ1bmN0aW9uIEduKCl7Y1sxNTgwXT1vO2NbMjQ5Ml09bztjWzI1MThdPW87Y1s1MzQ2XT1vO2NbNTY4NF09b31mdW5jdGlvbiBIbihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtiPWItZC0oYz4+PjA+YT4+PjB8MCk+Pj4wO3JldHVybihJPWIsYS1jPj4+MHwwKXwwfWZ1bmN0aW9uIEluKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2M9YStjPj4+MDtyZXR1cm4oST1iK2QrKGM+Pj4wPGE+Pj4wfDApPj4+MCxjfDApfDB9ZnVuY3Rpb24gSm4oYil7Yj1ifDA7dmFyIGM9MDtjPWI7d2hpbGUoYVtjPj4wXXwwKXtjPWMrMXwwfXJldHVybiBjLWJ8MH1mdW5jdGlvbiBLbihhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7aWYoKGN8MCk8MzIpe0k9Yj4+PmM7cmV0dXJuIGE+Pj5jfChiJigxPDxjKS0xKTw8MzItY31JPTA7cmV0dXJuIGI+Pj5jLTMyfDB9ZnVuY3Rpb24gTG4oYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTA7aWYoKGV8MCk+PTQwOTYpcmV0dXJuIG5iKGJ8MCxkfDAsZXwwKXwwO2Y9YnwwO2lmKChiJjMpPT0oZCYzKSl7d2hpbGUoYiYzKXtpZigoZXwwKT09MClyZXR1cm4gZnwwO2FbYj4+MF09YVtkPj4wXXwwO2I9YisxfDA7ZD1kKzF8MDtlPWUtMXwwfXdoaWxlKChlfDApPj00KXtjW2I+PjJdPWNbZD4+Ml07Yj1iKzR8MDtkPWQrNHwwO2U9ZS00fDB9fXdoaWxlKChlfDApPjApe2FbYj4+MF09YVtkPj4wXXwwO2I9YisxfDA7ZD1kKzF8MDtlPWUtMXwwfXJldHVybiBmfDB9ZnVuY3Rpb24gTW4oYixjLGQpe2I9YnwwO2M9Y3wwO2Q9ZHwwO3ZhciBlPTA7aWYoKGN8MCk8KGJ8MCkmKGJ8MCk8KGMrZHwwKSl7ZT1iO2M9YytkfDA7Yj1iK2R8MDt3aGlsZSgoZHwwKT4wKXtiPWItMXwwO2M9Yy0xfDA7ZD1kLTF8MDthW2I+PjBdPWFbYz4+MF18MH1iPWV9ZWxzZXtMbihiLGMsZCl8MH1yZXR1cm4gYnwwfWZ1bmN0aW9uIE5uKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaT0wO2Y9YitlfDA7aWYoKGV8MCk+PTIwKXtkPWQmMjU1O2k9YiYzO2g9ZHxkPDw4fGQ8PDE2fGQ8PDI0O2c9ZiZ+MztpZihpKXtpPWIrNC1pfDA7d2hpbGUoKGJ8MCk8KGl8MCkpe2FbYj4+MF09ZDtiPWIrMXwwfX13aGlsZSgoYnwwKTwoZ3wwKSl7Y1tiPj4yXT1oO2I9Yis0fDB9fXdoaWxlKChifDApPChmfDApKXthW2I+PjBdPWQ7Yj1iKzF8MH1yZXR1cm4gYi1lfDB9ZnVuY3Rpb24gT24oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtJPWI8PGN8KGEmKDE8PGMpLTE8PDMyLWMpPj4+MzItYztyZXR1cm4gYTw8Y31JPWE8PGMtMzI7cmV0dXJuIDB9ZnVuY3Rpb24gUG4oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtJPWI+PmM7cmV0dXJuIGE+Pj5jfChiJigxPDxjKS0xKTw8MzItY31JPShifDApPDA/LTE6MDtyZXR1cm4gYj4+Yy0zMnwwfWZ1bmN0aW9uIFFuKGIpe2I9YnwwO3ZhciBjPTA7Yz1hW24rKGI+Pj4yNCk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gY3wwO2M9YVtuKyhiPj4xNiYyNTUpPj4wXXwwO2lmKChjfDApPDgpcmV0dXJuIGMrOHwwO2M9YVtuKyhiPj44JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYysxNnwwO3JldHVybihhW24rKGImMjU1KT4+MF18MCkrMjR8MH1mdW5jdGlvbiBSbihiKXtiPWJ8MDt2YXIgYz0wO2M9YVttKyhiJjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gY3wwO2M9YVttKyhiPj44JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYys4fDA7Yz1hW20rKGI+PjE2JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYysxNnwwO3JldHVybihhW20rKGI+Pj4yNCk+PjBdfDApKzI0fDB9ZnVuY3Rpb24gU24oYSxiKXthPWF8MDtiPWJ8MDt2YXIgYz0wLGQ9MCxlPTAsZj0wO2Y9YSY2NTUzNTtkPWImNjU1MzU7Yz1lYShkLGYpfDA7ZT1hPj4+MTY7ZD0oYz4+PjE2KSsoZWEoZCxlKXwwKXwwO2I9Yj4+PjE2O2E9ZWEoYixmKXwwO3JldHVybihJPShkPj4+MTYpKyhlYShiLGUpfDApKygoKGQmNjU1MzUpK2F8MCk+Pj4xNil8MCxkK2E8PDE2fGMmNjU1MzV8MCl8MH1mdW5jdGlvbiBUbihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTA7aj1iPj4zMXwoKGJ8MCk8MD8tMTowKTw8MTtpPSgoYnwwKTwwPy0xOjApPj4zMXwoKGJ8MCk8MD8tMTowKTw8MTtmPWQ+PjMxfCgoZHwwKTwwPy0xOjApPDwxO2U9KChkfDApPDA/LTE6MCk+PjMxfCgoZHwwKTwwPy0xOjApPDwxO2g9SG4oal5hLGleYixqLGkpfDA7Zz1JO2I9Zl5qO2E9ZV5pO2E9SG4oKFluKGgsZyxIbihmXmMsZV5kLGYsZSl8MCxJLDApfDApXmIsSV5hLGIsYSl8MDtyZXR1cm4gYXwwfWZ1bmN0aW9uIFVuKGEsYixkLGUpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtmPWk7aT1pKzh8MDtqPWZ8MDtoPWI+PjMxfCgoYnwwKTwwPy0xOjApPDwxO2c9KChifDApPDA/LTE6MCk+PjMxfCgoYnwwKTwwPy0xOjApPDwxO2w9ZT4+MzF8KChlfDApPDA/LTE6MCk8PDE7az0oKGV8MCk8MD8tMTowKT4+MzF8KChlfDApPDA/LTE6MCk8PDE7Yj1IbihoXmEsZ15iLGgsZyl8MDthPUk7WW4oYixhLEhuKGxeZCxrXmUsbCxrKXwwLEksail8MDthPUhuKGNbaj4+Ml1eaCxjW2orND4+Ml1eZyxoLGcpfDA7Yj1JO2k9ZjtyZXR1cm4oST1iLGEpfDB9ZnVuY3Rpb24gVm4oYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7dmFyIGU9MCxmPTA7ZT1hO2Y9YzthPVNuKGUsZil8MDtjPUk7cmV0dXJuKEk9KGVhKGIsZil8MCkrKGVhKGQsZSl8MCkrY3xjJjAsYXwwfDApfDB9ZnVuY3Rpb24gV24oYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7YT1ZbihhLGIsYyxkLDApfDA7cmV0dXJuIGF8MH1mdW5jdGlvbiBYbihhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MDtnPWk7aT1pKzh8MDtmPWd8MDtZbihhLGIsZCxlLGYpfDA7aT1nO3JldHVybihJPWNbZis0Pj4yXXwwLGNbZj4+Ml18MCl8MH1mdW5jdGlvbiBZbihhLGIsZCxlLGYpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTA7aD1hO2o9YjtpPWo7bD1kO2c9ZTtrPWc7aWYoKGl8MCk9PTApe2c9KGZ8MCkhPTA7aWYoKGt8MCk9PTApe2lmKGcpe2NbZj4+Ml09KGg+Pj4wKSUobD4+PjApO2NbZis0Pj4yXT0wfWs9MDttPShoPj4+MCkvKGw+Pj4wKT4+PjA7cmV0dXJuKEk9ayxtKXwwfWVsc2V7aWYoIWcpe2w9MDttPTA7cmV0dXJuKEk9bCxtKXwwfWNbZj4+Ml09YXwwO2NbZis0Pj4yXT1iJjA7bD0wO209MDtyZXR1cm4oST1sLG0pfDB9fW09KGt8MCk9PTA7ZG97aWYoKGx8MCkhPTApe2lmKCFtKXtrPShRbihrfDApfDApLShRbihpfDApfDApfDA7aWYoaz4+PjA8PTMxKXttPWsrMXwwO2w9MzEta3wwO2E9ay0zMT4+MzE7aj1tO2I9aD4+PihtPj4+MCkmYXxpPDxsO2E9aT4+PihtPj4+MCkmYTtrPTA7bD1oPDxsO2JyZWFrfWlmKChmfDApPT0wKXtsPTA7bT0wO3JldHVybihJPWwsbSl8MH1jW2Y+PjJdPWF8MDtjW2YrND4+Ml09anxiJjA7bD0wO209MDtyZXR1cm4oST1sLG0pfDB9az1sLTF8MDtpZigoayZsfDApIT0wKXtsPShRbihsfDApfDApKzMzLShRbihpfDApfDApfDA7cD02NC1sfDA7bT0zMi1sfDA7bj1tPj4zMTtvPWwtMzJ8MDthPW8+PjMxO2o9bDtiPW0tMT4+MzEmaT4+PihvPj4+MCl8KGk8PG18aD4+PihsPj4+MCkpJmE7YT1hJmk+Pj4obD4+PjApO2s9aDw8cCZuO2w9KGk8PHB8aD4+PihvPj4+MCkpJm58aDw8bSZsLTMzPj4zMTticmVha31pZigoZnwwKSE9MCl7Y1tmPj4yXT1rJmg7Y1tmKzQ+PjJdPTB9aWYoKGx8MCk9PTEpe289anxiJjA7cD1hfDB8MDtyZXR1cm4oST1vLHApfDB9ZWxzZXtwPVJuKGx8MCl8MDtvPWk+Pj4ocD4+PjApfDA7cD1pPDwzMi1wfGg+Pj4ocD4+PjApfDA7cmV0dXJuKEk9byxwKXwwfX1lbHNle2lmKG0pe2lmKChmfDApIT0wKXtjW2Y+PjJdPShpPj4+MCklKGw+Pj4wKTtjW2YrND4+Ml09MH1vPTA7cD0oaT4+PjApLyhsPj4+MCk+Pj4wO3JldHVybihJPW8scCl8MH1pZigoaHwwKT09MCl7aWYoKGZ8MCkhPTApe2NbZj4+Ml09MDtjW2YrND4+Ml09KGk+Pj4wKSUoaz4+PjApfW89MDtwPShpPj4+MCkvKGs+Pj4wKT4+PjA7cmV0dXJuKEk9byxwKXwwfWw9ay0xfDA7aWYoKGwma3wwKT09MCl7aWYoKGZ8MCkhPTApe2NbZj4+Ml09YXwwO2NbZis0Pj4yXT1sJml8YiYwfW89MDtwPWk+Pj4oKFJuKGt8MCl8MCk+Pj4wKTtyZXR1cm4oST1vLHApfDB9az0oUW4oa3wwKXwwKS0oUW4oaXwwKXwwKXwwO2lmKGs+Pj4wPD0zMCl7YT1rKzF8MDtsPTMxLWt8MDtqPWE7Yj1pPDxsfGg+Pj4oYT4+PjApO2E9aT4+PihhPj4+MCk7az0wO2w9aDw8bDticmVha31pZigoZnwwKT09MCl7bz0wO3A9MDtyZXR1cm4oST1vLHApfDB9Y1tmPj4yXT1hfDA7Y1tmKzQ+PjJdPWp8YiYwO289MDtwPTA7cmV0dXJuKEk9byxwKXwwfX13aGlsZSgwKTtpZigoanwwKT09MCl7Zz1sO2U9MDtpPTB9ZWxzZXtoPWR8MHwwO2c9Z3xlJjA7ZT1JbihoLGcsLTEsLTEpfDA7ZD1JO2k9MDtkb3ttPWw7bD1rPj4+MzF8bDw8MTtrPWl8azw8MTttPWI8PDF8bT4+PjMxfDA7bj1iPj4+MzF8YTw8MXwwO0huKGUsZCxtLG4pfDA7cD1JO289cD4+MzF8KChwfDApPDA/LTE6MCk8PDE7aT1vJjE7Yj1IbihtLG4sbyZoLCgoKHB8MCk8MD8tMTowKT4+MzF8KChwfDApPDA/LTE6MCk8PDEpJmcpfDA7YT1JO2o9ai0xfDB9d2hpbGUoKGp8MCkhPTApO2c9bDtlPTB9aD0wO2lmKChmfDApIT0wKXtjW2Y+PjJdPWI7Y1tmKzQ+PjJdPWF9bz0oa3wwKT4+PjMxfChnfGgpPDwxfChoPDwxfGs+Pj4zMSkmMHxlO3A9KGs8PDF8MD4+PjMxKSYtMnxpO3JldHVybihJPW8scCl8MH0KCgoKZnVuY3Rpb24gT2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7bT1pO2k9aSsyMjR8MDtsPW0rOHwwO3M9bTtvPW0rMTkyfDA7ZD1tKzE4OHwwO2s9bSsxODR8MDtwPW0rMTgwfDA7dT1zO2NbdT4+Ml09Mzc7Y1t1KzQ+PjJdPTA7dT1zKzF8MDtxPWYrNHwwO3I9Y1txPj4yXXwwO2lmKChyJjIwNDh8MCkhPTApe2FbdT4+MF09NDM7dT1zKzJ8MH1pZigociY1MTJ8MCkhPTApe2FbdT4+MF09MzU7dT11KzF8MH10PXUrMnwwO2FbdT4+MF09MTA4O2FbdSsxPj4wXT0xMDg7dT1yJjc0O2Rve2lmKCh1fDApPT04KXtpZigociYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNlIGlmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZXthW3Q+PjBdPTExN319d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO3Q9bDtjW3Q+PjJdPWg7Y1t0KzQ+PjJdPWo7aD13aShvLDIzLHUscyxsKXwwO2o9bytofDA7cT1jW3E+PjJdJjE3Njtkb3tpZigocXwwKT09MzIpe3E9an1lbHNlIGlmKChxfDApPT0xNil7cT1hW28+PjBdfDA7aWYocTw8MjQ+PjI0PT00M3xxPDwyND4+MjQ9PTQ1KXtxPW8rMXwwO2JyZWFrfWlmKChofDApPjEmcTw8MjQ+PjI0PT00OD8odT1hW28rMT4+MF18MCx1PDwyND4+MjQ9PTg4fHU8PDI0Pj4yND09MTIwKTowKXtxPW8rMnwwfWVsc2V7bj0yMX19ZWxzZXtuPTIxfX13aGlsZSgwKTtpZigobnwwKT09MjEpe3E9b31uPWNbZisyOD4+Ml18MDtjW3A+PjJdPW47bj1uKzR8MDtjW24+PjJdPShjW24+PjJdfDApKzE7S2kobyxxLGosbCxkLGsscCk7bj1jW3A+PjJdfDA7dD1uKzR8MDt1PWNbdD4+Ml18MDtjW3Q+PjJdPXUrIC0xO2lmKCh1fDApIT0wKXtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWxjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKTtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWZ1bmN0aW9uIFBpKGIsZCxlLGYsZyxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPStqO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wO2w9aTtpPWkrMzA0fDA7cD1sO3U9bCsyMzJ8MDtyPWwrMjYwfDA7dD1sKzI0OHwwO2Q9bCsyNDR8MDtuPWwrMjQwfDA7bz1sKzI1MnwwO209bCsyNTZ8MDt2PXU7Y1t2Pj4yXT0zNztjW3YrND4+Ml09MDt2PXUrMXwwO3M9Zis0fDA7dz1jW3M+PjJdfDA7aWYoKHcmMjA0OHwwKSE9MCl7YVt2Pj4wXT00Mzt2PXUrMnwwfWlmKCh3JjEwMjR8MCkhPTApe2Fbdj4+MF09MzU7dj12KzF8MH14PXcmMjYwO3k9dz4+PjE0O2Rve2lmKCh4fDApPT0yNjApe2lmKCh5JjF8MCk9PTApe2Fbdj4+MF09OTc7dj0wO2JyZWFrfWVsc2V7YVt2Pj4wXT02NTt2PTA7YnJlYWt9fWVsc2V7YVt2Pj4wXT00Njt3PXYrMnwwO2FbdisxPj4wXT00MjtpZigoeHwwKT09MjU2KXtpZigoeSYxfDApPT0wKXthW3c+PjBdPTEwMTt2PTE7YnJlYWt9ZWxzZXthW3c+PjBdPTY5O3Y9MTticmVha319ZWxzZSBpZigoeHwwKT09NCl7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDI7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MDt2PTE7YnJlYWt9fWVsc2V7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDM7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MTt2PTE7YnJlYWt9fX19d2hpbGUoMCk7Y1t0Pj4yXT1yO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtpZih2KXtjW3A+PjJdPWNbZis4Pj4yXTt5PXArNHwwO2hbaz4+M109ajtjW3k+PjJdPWNbaz4+Ml07Y1t5KzQ+PjJdPWNbays0Pj4yXTt3PXdpKHIsMzAsdyx1LHApfDB9ZWxzZXtoW2s+PjNdPWo7Y1twPj4yXT1jW2s+PjJdO2NbcCs0Pj4yXT1jW2srND4+Ml07dz13aShyLDMwLHcsdSxwKXwwfWlmKCh3fDApPjI5KXt3PShhWzEzMzY4XXwwKT09MDtpZih2KXtpZih3PyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2NbcD4+Ml09Y1tmKzg+PjJdO3k9cCs0fDA7aFtrPj4zXT1qO2NbeT4+Ml09Y1trPj4yXTtjW3krND4+Ml09Y1trKzQ+PjJdO3c9Q2kodCx3LHUscCl8MH1lbHNle2lmKHc/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7Y1twPj4yXT1jW2YrOD4+Ml07eT1wKzR8MDtoW2s+PjNdPWo7Y1t5Pj4yXT1jW2s+PjJdO2NbeSs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfXQ9Y1t0Pj4yXXwwO2lmKCh0fDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3Y9dH19ZWxzZXt2PWNbdD4+Ml18MDt0PTB9dT12K3d8MDtzPWNbcz4+Ml0mMTc2O2Rve2lmKChzfDApPT0zMil7cz11fWVsc2UgaWYoKHN8MCk9PTE2KXtzPWFbdj4+MF18MDtpZihzPDwyND4+MjQ9PTQzfHM8PDI0Pj4yND09NDUpe3M9disxfDA7YnJlYWt9aWYoKHd8MCk+MSZzPDwyND4+MjQ9PTQ4Pyh5PWFbdisxPj4wXXwwLHk8PDI0Pj4yND09ODh8eTw8MjQ+PjI0PT0xMjApOjApe3M9disyfDB9ZWxzZXtxPTQ4fX1lbHNle3E9NDh9fXdoaWxlKDApO2lmKChxfDApPT00OCl7cz12fWlmKCh2fDApIT0ocnwwKSl7cD11bih3PDwzKXwwO2lmKChwfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3I9djtxPXB9fWVsc2V7cT0wfXg9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09eDt4PXgrNHwwO2NbeD4+Ml09KGNbeD4+Ml18MCkrMTtRaShyLHMsdSxwLGQsbixvKTtvPWNbbz4+Ml18MDt4PW8rNHwwO3k9Y1t4Pj4yXXwwO2NbeD4+Ml09eSsgLTE7aWYoKHl8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1MaShtLGNbZT4+Ml18MCxwLGNbZD4+Ml18MCxjW24+PjJdfDAsZixnKTt5PWNbbT4+Ml18MDtjW2U+PjJdPXk7Y1tiPj4yXT15O2lmKChxfDApIT0wKXt2bihxKX1pZigodHwwKT09MCl7aT1sO3JldHVybn12bih0KTtpPWw7cmV0dXJufWZ1bmN0aW9uIFFpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wO2s9aTtpPWkrMzJ8MDtvPWs7bD1rKzEyfDA7cT1jW2o+PjJdfDA7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW28+PjJdPTEzNDQ4O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM0NDgsbyl9bT0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dD1jW3ErOD4+Ml18MDtpZighKChjW3ErMTI+PjJdfDApLXQ+PjI+Pj4wPm0+Pj4wKSl7eT1YYSg0KXwwO2NbeT4+Ml09MjEzMDQ7d2IoeXwwLDIxMzc2LDE5Nil9bT1jW3QrKG08PDIpPj4yXXwwO2lmKChtfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1qPWNbaj4+Ml18MDtpZighKChjWzM0MDJdfDApPT0tMSkpe2Nbbz4+Ml09MTM2MDg7Y1tvKzQ+PjJdPTIwODtjW28rOD4+Ml09MDtjZygxMzYwOCxvKX1vPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtxPWNbais4Pj4yXXwwO2lmKCEoKGNbaisxMj4+Ml18MCktcT4+Mj4+PjA+bz4+PjApKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1qPWNbcSsobzw8Mik+PjJdfDA7aWYoKGp8MCk9PTApe3k9WGEoNCl8MDtjW3k+PjJdPTIxMzA0O3diKHl8MCwyMTM3NiwxOTYpfW1jW2NbKGNbaj4+Ml18MCkrMjA+PjJdJjEyN10obCxqKTtjW2g+PjJdPWY7bz1hW2I+PjBdfDA7aWYobzw8MjQ+PjI0PT00M3xvPDwyND4+MjQ9PTQ1KXt5PXhjW2NbKGNbbT4+Ml18MCkrNDQ+PjJdJjYzXShtLG8pfDA7dD1jW2g+PjJdfDA7Y1toPj4yXT10KzQ7Y1t0Pj4yXT15O3Q9YisxfDB9ZWxzZXt0PWJ9bz1lO2E6ZG97aWYoKChvLXR8MCk+MT8oYVt0Pj4wXXwwKT09NDg6MCk/KHA9dCsxfDAseT1hW3A+PjBdfDAseTw8MjQ+PjI0PT04OHx5PDwyND4+MjQ9PTEyMCk6MCl7eT14Y1tjWyhjW20+PjJdfDApKzQ0Pj4yXSY2M10obSw0OCl8MDt4PWNbaD4+Ml18MDtjW2g+PjJdPXgrNDtjW3g+PjJdPXk7dD10KzJ8MDt4PXhjW2NbKGNbbT4+Ml18MCkrNDQ+PjJdJjYzXShtLGFbcD4+MF18MCl8MDt5PWNbaD4+Ml18MDtjW2g+PjJdPXkrNDtjW3k+PjJdPXg7aWYodD4+PjA8ZT4+PjApe3E9dDt3aGlsZSgxKXtwPWFbcT4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9eT1wPDwyND4+MjQ7aWYoISgoeSsgLTQ4fDApPj4+MDwxMCk/ISgoKHl8MzIpKyAtOTd8MCk+Pj4wPDYpOjApe3A9dDticmVhayBhfXE9cSsxfDA7aWYoIShxPj4+MDxlPj4+MCkpe3A9dDticmVha319fWVsc2V7cD10O3E9dH19ZWxzZXtzPTE1fX13aGlsZSgwKTtiOmRve2lmKChzfDApPT0xNSl7aWYodD4+PjA8ZT4+PjApe3E9dDt3aGlsZSgxKXtwPWFbcT4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9cz1xKzF8MDtpZighKCgocDw8MjQ+PjI0KSsgLTQ4fDApPj4+MDwxMCkpe3A9dDticmVhayBifWlmKHM+Pj4wPGU+Pj4wKXtxPXN9ZWxzZXtwPXQ7cT1zO2JyZWFrfX19ZWxzZXtwPXQ7cT10fX19d2hpbGUoMCk7cz1hW2w+PjBdfDA7aWYoKHMmMSk9PTApe3M9KHMmMjU1KT4+PjF9ZWxzZXtzPWNbbCs0Pj4yXXwwfWlmKChzfDApIT0wKXtpZigocHwwKSE9KHF8MCk/KHI9cSsgLTF8MCxyPj4+MD5wPj4+MCk6MCl7cz1wO2Rve3k9YVtzPj4wXXwwO2Fbcz4+MF09YVtyPj4wXXwwO2Fbcj4+MF09eTtzPXMrMXwwO3I9cisgLTF8MH13aGlsZShzPj4+MDxyPj4+MCl9dj1vY1tjWyhjW2o+PjJdfDApKzE2Pj4yXSYxMjddKGopfDA7aWYocD4+PjA8cT4+PjApe3Q9bCsxfDA7cj1sKzR8MDt1PWwrOHwwO3g9MDt3PTA7cz1wO3doaWxlKDEpe3k9YVsoKGFbbD4+MF0mMSk9PTA/dDpjW3U+PjJdfDApK3c+PjBdfDA7aWYoeTw8MjQ+PjI0PjAmKHh8MCk9PSh5PDwyND4+MjR8MCkpe3g9Y1toPj4yXXwwO2NbaD4+Ml09eCs0O2NbeD4+Ml09djt4PWFbbD4+MF18MDtpZigoeCYxKT09MCl7eT0oeCYyNTUpPj4+MX1lbHNle3k9Y1tyPj4yXXwwfXg9MDt3PSh3Pj4+MDwoeSsgLTF8MCk+Pj4wJjEpK3d8MH1BPXhjW2NbKGNbbT4+Ml18MCkrNDQ+PjJdJjYzXShtLGFbcz4+MF18MCl8MDt6PWNbaD4+Ml18MDt5PXorNHwwO2NbaD4+Ml09eTtjW3o+PjJdPUE7cz1zKzF8MDtpZighKHM+Pj4wPHE+Pj4wKSl7YnJlYWt9ZWxzZXt4PXgrMXwwfX19ZWxzZXt5PWNbaD4+Ml18MH1wPWYrKHAtYjw8Mil8MDtpZigocHwwKSE9KHl8MCk/KG49eSsgLTR8MCxuPj4+MD5wPj4+MCk6MCl7ZG97QT1jW3A+PjJdfDA7Y1twPj4yXT1jW24+PjJdO2Nbbj4+Ml09QTtwPXArNHwwO249bisgLTR8MH13aGlsZShwPj4+MDxuPj4+MCl9fWVsc2V7dWNbY1soY1ttPj4yXXwwKSs0OD4+Ml0mMzFdKG0scCxxLGNbaD4+Ml18MCl8MDt5PShjW2g+PjJdfDApKyhxLXA8PDIpfDA7Y1toPj4yXT15fWM6ZG97aWYocT4+PjA8ZT4+PjApe3doaWxlKDEpe249YVtxPj4wXXwwO2lmKG48PDI0Pj4yND09NDYpe2JyZWFrfXo9eGNbY1soY1ttPj4yXXwwKSs0ND4+Ml0mNjNdKG0sbil8MDtBPWNbaD4+Ml18MDt5PUErNHwwO2NbaD4+Ml09eTtjW0E+PjJdPXo7cT1xKzF8MDtpZighKHE+Pj4wPGU+Pj4wKSl7YnJlYWsgY319ej1vY1tjWyhjW2o+PjJdfDApKzEyPj4yXSYxMjddKGopfDA7QT1jW2g+PjJdfDA7eT1BKzR8MDtjW2g+PjJdPXk7Y1tBPj4yXT16O3E9cSsxfDB9fXdoaWxlKDApO3VjW2NbKGNbbT4+Ml18MCkrNDg+PjJdJjMxXShtLHEsZSx5KXwwO209KGNbaD4+Ml18MCkrKG8tcTw8Mil8MDtjW2g+PjJdPW07aWYoKGR8MCkhPShlfDApKXttPWYrKGQtYjw8Mil8MH1jW2c+PjJdPW07aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59Zz1jW2wrOD4+Ml18MDtpZigoZ3wwKT09MCl7aT1rO3JldHVybn12bihnKTtpPWs7cmV0dXJufWZ1bmN0aW9uIFJpKGIsZCxlLGYsZyxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPStqO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTA7bD1pO2k9aSszMDR8MDtwPWw7dT1sKzIzMnwwO3I9bCsyNjB8MDt0PWwrMjQ4fDA7bT1sKzI0NHwwO2Q9bCsyNDB8MDtvPWwrMjUyfDA7bj1sKzI1NnwwO3g9dTtjW3g+PjJdPTM3O2NbeCs0Pj4yXT0wO3g9dSsxfDA7cz1mKzR8MDt2PWNbcz4+Ml18MDtpZigodiYyMDQ4fDApIT0wKXthW3g+PjBdPTQzO3g9dSsyfDB9aWYoKHYmMTAyNHwwKSE9MCl7YVt4Pj4wXT0zNTt4PXgrMXwwfXc9diYyNjA7dj12Pj4+MTQ7ZG97aWYoKHd8MCk9PTI2MCl7YVt4Pj4wXT03Njt3PXgrMXwwO2lmKCh2JjF8MCk9PTApe2Fbdz4+MF09OTc7dj0wO2JyZWFrfWVsc2V7YVt3Pj4wXT02NTt2PTA7YnJlYWt9fWVsc2V7YVt4Pj4wXT00NjthW3grMT4+MF09NDI7YVt4KzI+PjBdPTc2O3g9eCszfDA7aWYoKHd8MCk9PTQpe2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAyO3Y9MTticmVha31lbHNle2FbeD4+MF09NzA7dj0xO2JyZWFrfX1lbHNlIGlmKCh3fDApPT0yNTYpe2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAxO3Y9MTticmVha31lbHNle2FbeD4+MF09Njk7dj0xO2JyZWFrfX1lbHNle2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAzO3Y9MTticmVha31lbHNle2FbeD4+MF09NzE7dj0xO2JyZWFrfX19fXdoaWxlKDApO2NbdD4+Ml09cjtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7aWYodil7Y1twPj4yXT1jW2YrOD4+Ml07eD1wKzR8MDtoW2s+PjNdPWo7Y1t4Pj4yXT1jW2s+PjJdO2NbeCs0Pj4yXT1jW2srND4+Ml07dz13aShyLDMwLHcsdSxwKXwwfWVsc2V7aFtrPj4zXT1qO2NbcD4+Ml09Y1trPj4yXTtjW3ArND4+Ml09Y1trKzQ+PjJdO3c9d2kociwzMCx3LHUscCl8MH1pZigod3wwKT4yOSl7dz0oYVsxMzM2OF18MCk9PTA7aWYodil7aWYodz8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtjW3A+PjJdPWNbZis4Pj4yXTt4PXArNHwwO2hbaz4+M109ajtjW3g+PjJdPWNbaz4+Ml07Y1t4KzQ+PjJdPWNbays0Pj4yXTt3PUNpKHQsdyx1LHApfDB9ZWxzZXtpZih3PyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2hbaz4+M109ajtjW3A+PjJdPWNbaz4+Ml07Y1twKzQ+PjJdPWNbays0Pj4yXTt3PUNpKHQsdyx1LHApfDB9dD1jW3Q+PjJdfDA7aWYoKHR8MCk9PTApe3g9WGEoNCl8MDtjW3g+PjJdPTIyNjgwO3diKHh8MCwyMjcyOCwyMDYpfWVsc2V7dj10fX1lbHNle3Y9Y1t0Pj4yXXwwO3Q9MH11PXYrd3wwO3M9Y1tzPj4yXSYxNzY7ZG97aWYoKHN8MCk9PTMyKXtzPXV9ZWxzZSBpZigoc3wwKT09MTYpe3M9YVt2Pj4wXXwwO2lmKHM8PDI0Pj4yND09NDN8czw8MjQ+PjI0PT00NSl7cz12KzF8MDticmVha31pZigod3wwKT4xJnM8PDI0Pj4yND09NDg/KHg9YVt2KzE+PjBdfDAseDw8MjQ+PjI0PT04OHx4PDwyND4+MjQ9PTEyMCk6MCl7cz12KzJ8MH1lbHNle3E9NDh9fWVsc2V7cT00OH19d2hpbGUoMCk7aWYoKHF8MCk9PTQ4KXtzPXZ9aWYoKHZ8MCkhPShyfDApKXtwPXVuKHc8PDMpfDA7aWYoKHB8MCk9PTApe3g9WGEoNCl8MDtjW3g+PjJdPTIyNjgwO3diKHh8MCwyMjcyOCwyMDYpfWVsc2V7cj12O3E9cH19ZWxzZXtxPTB9dz1jW2YrMjg+PjJdfDA7Y1tvPj4yXT13O3c9dys0fDA7Y1t3Pj4yXT0oY1t3Pj4yXXwwKSsxO1FpKHIscyx1LHAsbSxkLG8pO289Y1tvPj4yXXwwO3c9bys0fDA7eD1jW3c+PjJdfDA7Y1t3Pj4yXT14KyAtMTtpZigoeHwwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfUxpKG4sY1tlPj4yXXwwLHAsY1ttPj4yXXwwLGNbZD4+Ml18MCxmLGcpO3g9Y1tuPj4yXXwwO2NbZT4+Ml09eDtjW2I+PjJdPXg7aWYoKHF8MCkhPTApe3ZuKHEpfWlmKCh0fDApPT0wKXtpPWw7cmV0dXJufXZuKHQpO2k9bDtyZXR1cm59ZnVuY3Rpb24gU2koYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wO2Q9aTtpPWkrMTkyfDA7bj1kO289ZCsxODB8MDtrPWQrMTYwfDA7bD1kKzEyfDA7YVtvKzA+PjBdPWFbMTIyNzI+PjBdfDA7YVtvKzE+PjBdPWFbMTIyNzM+PjBdfDA7YVtvKzI+PjBdPWFbMTIyNzQ+PjBdfDA7YVtvKzM+PjBdPWFbMTIyNzU+PjBdfDA7YVtvKzQ+PjBdPWFbMTIyNzY+PjBdfDA7YVtvKzU+PjBdPWFbMTIyNzc+PjBdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXA9Y1szMzQwXXwwO2Nbbj4+Ml09aDtvPXdpKGssMjAscCxvLG4pfDA7aD1rK298MDtwPWNbZis0Pj4yXSYxNzY7ZG97aWYoKHB8MCk9PTMyKXtwPWh9ZWxzZSBpZigocHwwKT09MTYpe3A9YVtrPj4wXXwwO2lmKHA8PDI0Pj4yND09NDN8cDw8MjQ+PjI0PT00NSl7cD1rKzF8MDticmVha31pZigob3wwKT4xJnA8PDI0Pj4yND09NDg/KHE9YVtrKzE+PjBdfDAscTw8MjQ+PjI0PT04OHxxPDwyND4+MjQ9PTEyMCk6MCl7cD1rKzJ8MH1lbHNle209MTF9fWVsc2V7bT0xMX19d2hpbGUoMCk7aWYoKG18MCk9PTExKXtwPWt9bT1jW2YrMjg+PjJdfDA7cT1tKzR8MDtjW3E+PjJdPShjW3E+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW24+PjJdPTEzNDQ4O2Nbbis0Pj4yXT0yMDg7Y1tuKzg+PjJdPTA7Y2coMTM0NDgsbil9cT0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7bj1jW20rOD4+Ml18MDtpZigoY1ttKzEyPj4yXXwwKS1uPj4yPj4+MD5xPj4+MD8oaj1jW24rKHE8PDIpPj4yXXwwLChqfDApIT0wKTowKXtuPW0rNHwwO3E9Y1tuPj4yXXwwO2Nbbj4+Ml09cSsgLTE7aWYoKHF8MCk9PTApe2xjW2NbKGNbbT4+Ml18MCkrOD4+Ml0mMjU1XShtKX11Y1tjWyhjW2o+PjJdfDApKzQ4Pj4yXSYzMV0oaixrLGgsbCl8MDtqPWwrKG88PDIpfDA7aWYoKHB8MCk9PShofDApKXtxPWo7cD1jW2U+PjJdfDA7TGkoYixwLGwscSxqLGYsZyk7aT1kO3JldHVybn1xPWwrKHAtazw8Mil8MDtwPWNbZT4+Ml18MDtMaShiLHAsbCxxLGosZixnKTtpPWQ7cmV0dXJufXE9WGEoNCl8MDtjW3E+PjJdPTIxMzA0O3diKHF8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIFRpKGUsZixnLGgsaixrLGwsbSxuKXtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDt2YXIgbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wO3A9aTtpPWkrMzJ8MDtxPXA7cj1wKzI0fDA7dT1wKzIwfDA7dD1wKzE2fDA7cz1wKzEyfDA7eT1jW2orMjg+PjJdfDA7RD15KzR8MDtjW0Q+PjJdPShjW0Q+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW3E+PjJdPTEzNDU2O2NbcSs0Pj4yXT0yMDg7Y1txKzg+PjJdPTA7Y2coMTM0NTYscSl9eD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7ej1jW3krOD4+Ml18MDtpZigoY1t5KzEyPj4yXXwwKS16Pj4yPj4+MD54Pj4+MD8odz1jW3orKHg8PDIpPj4yXXwwLCh3fDApIT0wKTowKXtDPXkrNHwwO0Q9Y1tDPj4yXXwwO2NbQz4+Ml09RCsgLTE7aWYoKER8MCk9PTApe2xjW2NbKGNbeT4+Ml18MCkrOD4+Ml0mMjU1XSh5KX1jW2s+PjJdPTA7YTpkb3tpZigobXwwKSE9KG58MCkpe3g9dys4fDA7eT0wO2I6d2hpbGUoMSl7ej15O3k9Zzt3aGlsZSgxKXtpZigoenwwKSE9MCl7Zz15O2JyZWFrIGF9aWYoKHl8MCkhPTApe2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RD0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7Zz1EPzA6eTt5PUQ/MDp5fWVsc2V7Zz15fX1lbHNle2c9MDt5PTB9ej0oZ3wwKT09MDtkb3tpZigoaHwwKSE9MCl7aWYoKGNbaCsxMj4+Ml18MCk9PShjW2grMTY+PjJdfDApPyhvY1tjWyhjW2g+PjJdfDApKzM2Pj4yXSYxMjddKGgpfDApPT0tMTowKXtvPTIwO2JyZWFrfWlmKCF6KXtvPTIxO2JyZWFrIGJ9fWVsc2V7bz0yMH19d2hpbGUoMCk7aWYoKG98MCk9PTIwKXtvPTA7aWYoeil7aD0wO289MjE7YnJlYWsgYn1lbHNle2g9MH19aWYoKGhjW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjYzXSh3LGFbbT4+MF18MCwwKXwwKTw8MjQ+PjI0PT0zNyl7bz0yMzticmVha316PWFbbT4+MF18MDtpZih6PDwyND4+MjQ+LTE/KHY9Y1t4Pj4yXXwwLCEoKGJbdisoejw8MjQ+PjI0PDwxKT4+MV0mODE5Mik9PTApKTowKXtvPTM0O2JyZWFrfXo9ZysxMnwwO0I9Y1t6Pj4yXXwwO0E9ZysxNnwwO2lmKChCfDApPT0oY1tBPj4yXXwwKSl7Qj1vY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSYxMjddKGcpfDB9ZWxzZXtCPWRbQj4+MF18MH1EPXhjW2NbKGNbdz4+Ml18MCkrMTI+PjJdJjYzXSh3LEImMjU1KXwwO2lmKEQ8PDI0Pj4yND09KHhjW2NbKGNbdz4+Ml18MCkrMTI+PjJdJjYzXSh3LGFbbT4+MF18MCl8MCk8PDI0Pj4yNCl7bz01OTticmVha31jW2s+PjJdPTQ7ej00fWM6ZG97aWYoKG98MCk9PTIzKXtvPTA7ej1tKzF8MDtpZigoenwwKT09KG58MCkpe289MjQ7YnJlYWsgYn15PWhjW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjYzXSh3LGFbej4+MF18MCwwKXwwO2lmKHk8PDI0Pj4yND09NDh8eTw8MjQ+PjI0PT02OSl7ej1tKzJ8MDtpZigoenwwKT09KG58MCkpe289Mjc7YnJlYWsgYn1tPXo7ej1oY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSY2M10odyxhW3o+PjBdfDAsMCl8MH1lbHNle209ejt6PXk7eT0wfUQ9Y1soY1tmPj4yXXwwKSszNj4+Ml18MDtjW3Q+PjJdPWc7Y1tzPj4yXT1oO2NbciswPj4yXT1jW3QrMD4+Ml07Y1txKzA+PjJdPWNbcyswPj4yXTtuY1tEJjMxXSh1LGYscixxLGosayxsLHoseSk7bT1tKzF8MDtnPWNbdT4+Ml18MH1lbHNlIGlmKChvfDApPT0zNCl7d2hpbGUoMSl7bz0wO209bSsxfDA7aWYoKG18MCk9PShufDApKXttPW47YnJlYWt9ej1hW20+PjBdfDA7aWYoISh6PDwyND4+MjQ+LTEpKXticmVha31pZigoYlt2Kyh6PDwyND4+MjQ8PDEpPj4xXSY4MTkyKT09MCl7YnJlYWt9ZWxzZXtvPTM0fX1CPWg7QT1oO3doaWxlKDEpe2lmKChnfDApIT0wKXtpZigoY1tnKzEyPj4yXXwwKT09KGNbZysxNj4+Ml18MCkpe0Q9KG9jW2NbKGNbZz4+Ml18MCkrMzY+PjJdJjEyN10oZyl8MCk9PS0xO2c9RD8wOmc7eT1EPzA6eX19ZWxzZXtnPTB9Qz0oZ3wwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZihDKXt6PUI7YnJlYWt9ZWxzZXtnPXk7YnJlYWsgY319aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZihDXihCfDApPT0wKXt6PUI7QT1CfWVsc2V7Zz15O2JyZWFrIGN9fWVsc2V7ej0wO2g9MDtvPTQ1fX1lbHNle3o9QjtvPTQ1fX13aGlsZSgwKTtpZigob3wwKT09NDUpe289MDtpZihDKXtnPXk7YnJlYWsgY31lbHNle0E9MH19Qj1nKzEyfDA7RD1jW0I+PjJdfDA7Qz1nKzE2fDA7aWYoKER8MCk9PShjW0M+PjJdfDApKXtEPW9jW2NbKGNbZz4+Ml18MCkrMzY+PjJdJjEyN10oZyl8MH1lbHNle0Q9ZFtEPj4wXXwwfWlmKCEoKEQmMjU1KTw8MjQ+PjI0Pi0xKSl7Zz15O2JyZWFrIGN9aWYoKGJbKGNbeD4+Ml18MCkrKEQ8PDI0Pj4yNDw8MSk+PjFdJjgxOTIpPT0wKXtnPXk7YnJlYWsgY31EPWNbQj4+Ml18MDtpZigoRHwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbZz4+Ml18MCkrNDA+PjJdJjEyN10oZyl8MDtCPXo7Y29udGludWV9ZWxzZXtjW0I+PjJdPUQrMTtCPXo7Y29udGludWV9fX1lbHNlIGlmKChvfDApPT01OSl7bz0wO0I9Y1t6Pj4yXXwwO2lmKChCfDApPT0oY1tBPj4yXXwwKSl7b2NbY1soY1tnPj4yXXwwKSs0MD4+Ml0mMTI3XShnKXwwfWVsc2V7Y1t6Pj4yXT1CKzF9bT1tKzF8MDtnPXl9fXdoaWxlKDApO2lmKChtfDApPT0obnwwKSl7YnJlYWsgYX15PWNbaz4+Ml18MH1pZigob3wwKT09MjEpe2Nbaz4+Ml09NDticmVha31lbHNlIGlmKChvfDApPT0yNCl7Y1trPj4yXT00O2JyZWFrfWVsc2UgaWYoKG98MCk9PTI3KXtjW2s+PjJdPTQ7YnJlYWt9fX13aGlsZSgwKTtpZigoZ3wwKSE9MCl7aWYoKGNbZysxMj4+Ml18MCk9PShjW2crMTY+PjJdfDApKXtEPShvY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSYxMjddKGcpfDApPT0tMTtnPUQ/MDpnfX1lbHNle2c9MH1mPShnfDApPT0wO2Rve2lmKChofDApIT0wKXtpZigoY1toKzEyPj4yXXwwKT09KGNbaCsxNj4+Ml18MCk/KG9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MCk9PS0xOjApe289NzE7YnJlYWt9aWYoZil7Y1tlPj4yXT1nO2k9cDtyZXR1cm59fWVsc2V7bz03MX19d2hpbGUoMCk7aWYoKG98MCk9PTcxPyFmOjApe2NbZT4+Ml09ZztpPXA7cmV0dXJufWNbaz4+Ml09Y1trPj4yXXwyO2NbZT4+Ml09ZztpPXA7cmV0dXJufUQ9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIFVpKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFZpKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBXaShhKXthPWF8MDtyZXR1cm4gMn1mdW5jdGlvbiBYaShhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wO2o9aTtUaShhLGIsY1tkPj4yXXwwLGNbZT4+Ml18MCxmLGcsaCwxMjM3NiwxMjM4NHwwKTtpPWo7cmV0dXJufWZ1bmN0aW9uIFlpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTA7az1pO209ZCs4fDA7bT1vY1tjWyhjW20+PjJdfDApKzIwPj4yXSYxMjddKG0pfDA7bj1hW20+PjBdfDA7aWYoKG4mMSk9PTApe2w9bSsxfDA7bT0obiYyNTUpPj4+MX1lbHNle2w9Y1ttKzg+PjJdfDA7bT1jW20rND4+Ml18MH1UaShiLGQsY1tlPj4yXXwwLGNbZj4+Ml18MCxnLGgsaixsLGwrbXwwKTtpPWs7cmV0dXJufWZ1bmN0aW9uIFppKGEsYixkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTA7aj1pO2k9aSsxNnwwO2w9ajtmPWNbZisyOD4+Ml18MDttPWYrNHwwO2NbbT4+Ml09KGNbbT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1sPShjWzEzNDYwPj4yXXwwKSsgLTF8MDttPWNbZis4Pj4yXXwwO2lmKChjW2YrMTI+PjJdfDApLW0+PjI+Pj4wPmw+Pj4wPyhrPWNbbSsobDw8Mik+PjJdfDAsKGt8MCkhPTApOjApe2w9Zis0fDA7bT1jW2w+PjJdfDA7Y1tsPj4yXT1tKyAtMTtpZigobXwwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfW09Y1tlPj4yXXwwO2I9Yis4fDA7Yj1vY1tjW2NbYj4+Ml0+PjJdJjEyN10oYil8MDtiPShNaChkLG0sYixiKzE2OHwwLGssZywwKXwwKS1ifDA7aWYoKGJ8MCk+PTE2OCl7bT1jW2Q+PjJdfDA7Y1thPj4yXT1tO2k9ajtyZXR1cm59Y1toKzI0Pj4yXT0oKGJ8MCkvMTJ8MHwwKSU3fDA7bT1jW2Q+PjJdfDA7Y1thPj4yXT1tO2k9ajtyZXR1cm59bT1YYSg0KXwwO2NbbT4+Ml09MjEzMDQ7d2IobXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gX2koYSxiLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MDtqPWk7aT1pKzE2fDA7bD1qO2Y9Y1tmKzI4Pj4yXXwwO209Zis0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tsPj4yXT0xMzQ1NjtjW2wrND4+Ml09MjA4O2NbbCs4Pj4yXT0wO2NnKDEzNDU2LGwpfWw9KGNbMTM0NjA+PjJdfDApKyAtMXwwO209Y1tmKzg+PjJdfDA7aWYoKGNbZisxMj4+Ml18MCktbT4+Mj4+PjA+bD4+PjA/KGs9Y1ttKyhsPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7bD1mKzR8MDttPWNbbD4+Ml18MDtjW2w+PjJdPW0rIC0xO2lmKChtfDApPT0wKXtsY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZil9bT1jW2U+PjJdfDA7Yj1iKzh8MDtiPW9jW2NbKGNbYj4+Ml18MCkrND4+Ml0mMTI3XShiKXwwO2I9KE1oKGQsbSxiLGIrMjg4fDAsayxnLDApfDApLWJ8MDtpZigoYnwwKT49Mjg4KXttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1jW2grMTY+PjJdPSgoYnwwKS8xMnwwfDApJTEyfDA7bT1jW2Q+PjJdfDA7Y1thPj4yXT1tO2k9ajtyZXR1cm59bT1YYSg0KXwwO2NbbT4+Ml09MjEzMDQ7d2IobXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gJGkoYSxiLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wO2I9aTtpPWkrMTZ8MDtrPWI7Zj1jW2YrMjg+PjJdfDA7bD1mKzR8MDtjW2w+PjJdPShjW2w+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2s+PjJdPTEzNDU2O2Nbays0Pj4yXT0yMDg7Y1trKzg+PjJdPTA7Y2coMTM0NTYsayl9az0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7bD1jW2YrOD4+Ml18MDtpZigoY1tmKzEyPj4yXXwwKS1sPj4yPj4+MD5rPj4+MD8oaj1jW2wrKGs8PDIpPj4yXXwwLChqfDApIT0wKTowKXtrPWYrNHwwO2w9Y1trPj4yXXwwO2Nbaz4+Ml09bCsgLTE7aWYoKGx8MCk9PTApe2xjW2NbKGNbZj4+Ml18MCkrOD4+Ml0mMjU1XShmKX1lPWJqKGQsY1tlPj4yXXwwLGcsaiw0KXwwO2lmKChjW2c+PjJdJjR8MCkhPTApe2w9Y1tkPj4yXXwwO2NbYT4+Ml09bDtpPWI7cmV0dXJufWlmKChlfDApPDY5KXtnPWUrMmUzfDB9ZWxzZXtnPShlKyAtNjl8MCk+Pj4wPDMxP2UrMTkwMHwwOmV9Y1toKzIwPj4yXT1nKyAtMTkwMDtsPWNbZD4+Ml18MDtjW2E+PjJdPWw7aT1iO3JldHVybn1sPVhhKDQpfDA7Y1tsPj4yXT0yMTMwNDt3YihsfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBhaihlLGYsZyxoLGosayxsLG0sbil7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7dmFyIG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTA7bj1pO2k9aSs2NHwwO3c9bjtFPW4rMTZ8MDtyPW4rMjh8MDt1PW4rMjR8MDt2PW4rMzJ8MDt5PW4rMTJ8MDt6PW4rMjB8MDt4PW4rMzZ8MDtCPW4rNDB8MDt0PW4rNDR8MDtzPW4rNDh8MDtjW2s+PjJdPTA7QT1jW2orMjg+PjJdfDA7RD1BKzR8MDtjW0Q+PjJdPShjW0Q+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW3c+PjJdPTEzNDU2O2Nbdys0Pj4yXT0yMDg7Y1t3Kzg+PjJdPTA7Y2coMTM0NTYsdyl9Qz0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7RD1jW0ErOD4+Ml18MDtpZigoY1tBKzEyPj4yXXwwKS1EPj4yPj4+MD5DPj4+MD8ocD1jW0QrKEM8PDIpPj4yXXwwLChwfDApIT0wKTowKXtDPUErNHwwO0Q9Y1tDPj4yXXwwO2NbQz4+Ml09RCsgLTE7aWYoKER8MCk9PTApe2xjW2NbKGNbQT4+Ml18MCkrOD4+Ml0mMjU1XShBKX1hOmRve3N3aXRjaChtPDwyND4+MjR8MCl7Y2FzZSAxMTI6e289bCs4fDA7bD1jW2g+PjJdfDA7aD1mKzh8MDtoPW9jW2NbKGNbaD4+Ml18MCkrOD4+Ml0mMTI3XShoKXwwO2Y9YVtoPj4wXXwwO2lmKChmJjEpPT0wKXtmPShmJjI1NSk+Pj4xfWVsc2V7Zj1jW2grND4+Ml18MH1qPWFbaCsxMj4+MF18MDtpZigoaiYxKT09MCl7aj0oaiYyNTUpPj4+MX1lbHNle2o9Y1toKzE2Pj4yXXwwfWlmKChmfDApPT0oMC1qfDApKXtjW2s+PjJdPWNbaz4+Ml18NDticmVhayBhfUU9TWgoZyxsLGgsaCsyNHwwLHAsaywwKXwwO2s9RS1ofDA7aWYoKEV8MCk9PShofDApPyhjW28+PjJdfDApPT0xMjowKXtjW28+PjJdPTA7YnJlYWsgYX1pZigoa3wwKT09MTI/KHE9Y1tvPj4yXXwwLChxfDApPDEyKTowKXtjW28+PjJdPXErMTJ9YnJlYWt9O2Nhc2UgMTIwOntEPWNbKGNbZj4+Ml18MCkrMjA+PjJdfDA7Y1tCPj4yXT1jW2c+PjJdO2NbdD4+Ml09Y1toPj4yXTtjW0UrMD4+Ml09Y1tCKzA+PjJdO2NbdyswPj4yXT1jW3QrMD4+Ml07aWNbRCY2M10oZSxmLEUsdyxqLGssbCk7aT1uO3JldHVybn07Y2FzZSA4ODp7cT1mKzh8MDtxPW9jW2NbKGNbcT4+Ml18MCkrMjQ+PjJdJjEyN10ocSl8MDtwPWFbcT4+MF18MDtpZigocCYxKT09MCl7bz1xKzF8MDtwPShwJjI1NSk+Pj4xfWVsc2V7bz1jW3ErOD4+Ml18MDtwPWNbcSs0Pj4yXXwwfVRpKHMsZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLG8sbytwfDApO2NbZz4+Ml09Y1tzPj4yXTticmVha307Y2FzZSAxMjE6e289bCsyMHwwO2w9YmooZyxjW2g+PjJdfDAsayxwLDQpfDA7aWYoKGNbaz4+Ml0mNHwwKT09MCl7aWYoKGx8MCk8Njkpe2s9bCsyZTN8MH1lbHNle2s9KGwrIC02OXwwKT4+PjA8MzE/bCsxOTAwfDA6bH1jW28+PjJdPWsrIC0xOTAwfWJyZWFrfTtjYXNlIDgzOntvPWJqKGcsY1toPj4yXXwwLGsscCwyKXwwO3A9Y1trPj4yXXwwO2lmKChwJjR8MCk9PTAmKG98MCk8NjEpe2NbbD4+Ml09bzticmVhayBhfWVsc2V7Y1trPj4yXT1wfDQ7YnJlYWsgYX19O2Nhc2UgODI6e1RpKHosZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLDEyNDE2LDEyNDIxfDApO2NbZz4+Ml09Y1t6Pj4yXTticmVha307Y2FzZSAxMTQ6e1RpKHksZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLDEyNDAwLDEyNDExfDApO2NbZz4+Ml09Y1t5Pj4yXTticmVha307Y2FzZSA4OTp7bz1iaihnLGNbaD4+Ml18MCxrLHAsNCl8MDtpZigoY1trPj4yXSY0fDApPT0wKXtjW2wrMjA+PjJdPW8rIC0xOTAwfWJyZWFrfTtjYXNlIDM3OntsPWNbaD4+Ml18MDtoPWNbZz4+Ml18MDtkb3tpZigoaHwwKSE9MCl7aWYoKGNbaCsxMj4+Ml18MCk9PShjW2grMTY+PjJdfDApKXtpZigob2NbY1soY1toPj4yXXwwKSszNj4+Ml0mMTI3XShoKXwwKT09LTEpe2NbZz4+Ml09MDtoPTA7YnJlYWt9ZWxzZXtoPWNbZz4+Ml18MDticmVha319fWVsc2V7aD0wfX13aGlsZSgwKTtoPShofDApPT0wO2Rve2lmKChsfDApIT0wKXtpZigoY1tsKzEyPj4yXXwwKT09KGNbbCsxNj4+Ml18MCk/KG9jW2NbKGNbbD4+Ml18MCkrMzY+PjJdJjEyN10obCl8MCk9PS0xOjApe289MTE1O2JyZWFrfWlmKCFoKXtvPTExNn19ZWxzZXtvPTExNX19d2hpbGUoMCk7aWYoKG98MCk9PTExNSl7aWYoaCl7bz0xMTZ9ZWxzZXtsPTB9fWlmKChvfDApPT0xMTYpe2Nbaz4+Ml09Y1trPj4yXXw2O2JyZWFrIGF9aD1jW2c+PjJdfDA7Zj1jW2grMTI+PjJdfDA7aWYoKGZ8MCk9PShjW2grMTY+PjJdfDApKXtoPW9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MH1lbHNle2g9ZFtmPj4wXXwwfWlmKCEoKGhjW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjYzXShwLGgmMjU1LDApfDApPDwyND4+MjQ9PTM3KSl7Y1trPj4yXT1jW2s+PjJdfDQ7YnJlYWsgYX1wPWNbZz4+Ml18MDtoPXArMTJ8MDtmPWNbaD4+Ml18MDtpZigoZnwwKT09KGNbcCsxNj4+Ml18MCkpe29jW2NbKGNbcD4+Ml18MCkrNDA+PjJdJjEyN10ocCl8MH1lbHNle2NbaD4+Ml09ZisxfXA9Y1tnPj4yXXwwO2Rve2lmKChwfDApIT0wKXtpZigoY1twKzEyPj4yXXwwKT09KGNbcCsxNj4+Ml18MCkpe2lmKChvY1tjWyhjW3A+PjJdfDApKzM2Pj4yXSYxMjddKHApfDApPT0tMSl7Y1tnPj4yXT0wO3A9MDticmVha31lbHNle3A9Y1tnPj4yXXwwO2JyZWFrfX19ZWxzZXtwPTB9fXdoaWxlKDApO3A9KHB8MCk9PTA7ZG97aWYoKGx8MCkhPTApe2lmKChjW2wrMTI+PjJdfDApPT0oY1tsKzE2Pj4yXXwwKT8ob2NbY1soY1tsPj4yXXwwKSszNj4+Ml0mMTI3XShsKXwwKT09LTE6MCl7bz0xMzQ7YnJlYWt9aWYocCl7YnJlYWsgYX19ZWxzZXtvPTEzNH19d2hpbGUoMCk7aWYoKG98MCk9PTEzND8hcDowKXticmVhayBhfWNbaz4+Ml09Y1trPj4yXXwyO2JyZWFrfTtjYXNlIDg0OntUaSh4LGYsY1tnPj4yXXwwLGNbaD4+Ml18MCxqLGssbCwxMjQyNCwxMjQzMnwwKTtjW2c+PjJdPWNbeD4+Ml07YnJlYWt9O2Nhc2UgMTE5OntvPWJqKGcsY1toPj4yXXwwLGsscCwxKXwwO3A9Y1trPj4yXXwwO2lmKChwJjR8MCk9PTAmKG98MCk8Nyl7Y1tsKzI0Pj4yXT1vO2JyZWFrIGF9ZWxzZXtjW2s+PjJdPXB8NDticmVhayBhfX07Y2FzZSAxMDk6e289YmooZyxjW2g+PjJdfDAsayxwLDIpfDA7cD1jW2s+PjJdfDA7aWYoKHAmNHwwKT09MCYob3wwKTwxMyl7Y1tsKzE2Pj4yXT1vKyAtMTticmVhayBhfWVsc2V7Y1trPj4yXT1wfDQ7YnJlYWsgYX19O2Nhc2UgNzc6e289YmooZyxjW2g+PjJdfDAsayxwLDIpfDA7cD1jW2s+PjJdfDA7aWYoKHAmNHwwKT09MCYob3wwKTw2MCl7Y1tsKzQ+PjJdPW87YnJlYWsgYX1lbHNle2Nbaz4+Ml09cHw0O2JyZWFrIGF9fTtjYXNlIDEwNjp7bz1iaihnLGNbaD4+Ml18MCxrLHAsMyl8MDtwPWNbaz4+Ml18MDtpZigocCY0fDApPT0wJihvfDApPDM2Nil7Y1tsKzI4Pj4yXT1vO2JyZWFrIGF9ZWxzZXtjW2s+PjJdPXB8NDticmVhayBhfX07Y2FzZSA3Mjp7cD1iaihnLGNbaD4+Ml18MCxrLHAsMil8MDtvPWNbaz4+Ml18MDtpZigobyY0fDApPT0wJihwfDApPDI0KXtjW2wrOD4+Ml09cDticmVhayBhfWVsc2V7Y1trPj4yXT1vfDQ7YnJlYWsgYX19O2Nhc2UgNzA6e1RpKHYsZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLDEyMzkyLDEyNDAwfDApO2NbZz4+Ml09Y1t2Pj4yXTticmVha307Y2FzZSA2ODp7VGkodSxmLGNbZz4+Ml18MCxjW2g+PjJdfDAsaixrLGwsMTIzODQsMTIzOTJ8MCk7Y1tnPj4yXT1jW3U+PjJdO2JyZWFrfTtjYXNlIDEwNDpjYXNlIDY2OmNhc2UgOTg6e0Q9Y1toPj4yXXwwO0U9Zis4fDA7RT1vY1tjWyhjW0U+PjJdfDApKzQ+PjJdJjEyN10oRSl8MDtrPShNaChnLEQsRSxFKzI4OHwwLHAsaywwKXwwKS1FfDA7aWYoKGt8MCk8Mjg4KXtjW2wrMTY+PjJdPSgoa3wwKS8xMnwwfDApJTEyfDB9YnJlYWt9O2Nhc2UgNzM6e289bCs4fDA7bD1iaihnLGNbaD4+Ml18MCxrLHAsMil8MDtwPWNbaz4+Ml18MDtpZigocCY0fDApPT0wPyhsKyAtMXwwKT4+PjA8MTI6MCl7Y1tvPj4yXT1sO2JyZWFrIGF9Y1trPj4yXT1wfDQ7YnJlYWt9O2Nhc2UgNjU6Y2FzZSA5Nzp7RD1jW2g+PjJdfDA7RT1mKzh8MDtFPW9jW2NbY1tFPj4yXT4+Ml0mMTI3XShFKXwwO2s9KE1oKGcsRCxFLEUrMTY4fDAscCxrLDApfDApLUV8MDtpZigoa3wwKTwxNjgpe2NbbCsyND4+Ml09KChrfDApLzEyfDB8MCklN3wwfWJyZWFrfTtjYXNlIDEwMTpjYXNlIDEwMDp7bz1sKzEyfDA7bD1iaihnLGNbaD4+Ml18MCxrLHAsMil8MDtwPWNbaz4+Ml18MDtpZigocCY0fDApPT0wPyhsKyAtMXwwKT4+PjA8MzE6MCl7Y1tvPj4yXT1sO2JyZWFrIGF9Y1trPj4yXT1wfDQ7YnJlYWt9O2Nhc2UgMTE2OmNhc2UgMTEwOntsPXArOHwwO3A9Y1toPj4yXXwwO2I6d2hpbGUoMSl7aD1jW2c+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKChjW2grMTI+PjJdfDApPT0oY1toKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MCk9PS0xKXtjW2c+PjJdPTA7aD0wO2JyZWFrfWVsc2V7aD1jW2c+PjJdfDA7YnJlYWt9fX1lbHNle2g9MH19d2hpbGUoMCk7aD0oaHwwKT09MDtkb3tpZigocHwwKSE9MCl7aWYoKGNbcCsxMj4+Ml18MCkhPShjW3ArMTY+PjJdfDApKXtpZihoKXticmVha31lbHNle2JyZWFrIGJ9fWlmKCEoKG9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MCk9PS0xKSl7aWYoIWgpe2JyZWFrIGJ9fWVsc2V7bz01MH19ZWxzZXtvPTUwfX13aGlsZSgwKTtpZigob3wwKT09NTApe289MDtpZihoKXtwPTA7YnJlYWt9ZWxzZXtwPTB9fWg9Y1tnPj4yXXwwO2Y9Y1toKzEyPj4yXXwwO2lmKChmfDApPT0oY1toKzE2Pj4yXXwwKSl7aD1vY1tjWyhjW2g+PjJdfDApKzM2Pj4yXSYxMjddKGgpfDB9ZWxzZXtoPWRbZj4+MF18MH1pZighKChoJjI1NSk8PDI0Pj4yND4tMSkpe2JyZWFrfWlmKChiWyhjW2w+PjJdfDApKyhoPDwyND4+MjQ8PDEpPj4xXSY4MTkyKT09MCl7YnJlYWt9aj1jW2c+PjJdfDA7aD1qKzEyfDA7Zj1jW2g+PjJdfDA7aWYoKGZ8MCk9PShjW2orMTY+PjJdfDApKXtvY1tjWyhjW2o+PjJdfDApKzQwPj4yXSYxMjddKGopfDA7Y29udGludWV9ZWxzZXtjW2g+PjJdPWYrMTtjb250aW51ZX19bD1jW2c+PjJdfDA7ZG97aWYoKGx8MCkhPTApe2lmKChjW2wrMTI+PjJdfDApPT0oY1tsKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbbD4+Ml18MCkrMzY+PjJdJjEyN10obCl8MCk9PS0xKXtjW2c+PjJdPTA7bD0wO2JyZWFrfWVsc2V7bD1jW2c+PjJdfDA7YnJlYWt9fX1lbHNle2w9MH19d2hpbGUoMCk7bD0obHwwKT09MDtkb3tpZigocHwwKSE9MCl7aWYoKGNbcCsxMj4+Ml18MCk9PShjW3ArMTY+PjJdfDApPyhvY1tjWyhjW3A+PjJdfDApKzM2Pj4yXSYxMjddKHApfDApPT0tMTowKXtvPTY5O2JyZWFrfWlmKGwpe2JyZWFrIGF9fWVsc2V7bz02OX19d2hpbGUoMCk7aWYoKG98MCk9PTY5PyFsOjApe2JyZWFrIGF9Y1trPj4yXT1jW2s+PjJdfDI7YnJlYWt9O2Nhc2UgOTk6e3E9Zis4fDA7cT1vY1tjWyhjW3E+PjJdfDApKzEyPj4yXSYxMjddKHEpfDA7cD1hW3E+PjBdfDA7aWYoKHAmMSk9PTApe289cSsxfDA7cD0ocCYyNTUpPj4+MX1lbHNle289Y1txKzg+PjJdfDA7cD1jW3ErND4+Ml18MH1UaShyLGYsY1tnPj4yXXwwLGNbaD4+Ml18MCxqLGssbCxvLG8rcHwwKTtjW2c+PjJdPWNbcj4+Ml07YnJlYWt9O2RlZmF1bHQ6e2Nbaz4+Ml09Y1trPj4yXXw0fX19d2hpbGUoMCk7Y1tlPj4yXT1jW2c+PjJdO2k9bjtyZXR1cm59RT1YYSg0KXwwO2NbRT4+Ml09MjEzMDQ7d2IoRXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gYmooYSxlLGYsZyxoKXthPWF8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2o9aTtsPWNbYT4+Ml18MDtkb3tpZigobHwwKSE9MCl7aWYoKGNbbCsxMj4+Ml18MCk9PShjW2wrMTY+PjJdfDApKXtpZigob2NbY1soY1tsPj4yXXwwKSszNj4+Ml0mMTI3XShsKXwwKT09LTEpe2NbYT4+Ml09MDtsPTA7YnJlYWt9ZWxzZXtsPWNbYT4+Ml18MDticmVha319fWVsc2V7bD0wfX13aGlsZSgwKTtsPShsfDApPT0wO2Rve2lmKChlfDApIT0wKXtpZigoY1tlKzEyPj4yXXwwKT09KGNbZSsxNj4+Ml18MCk/KG9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MCk9PS0xOjApe209MTA7YnJlYWt9aWYoIWwpe209MTF9fWVsc2V7bT0xMH19d2hpbGUoMCk7aWYoKG18MCk9PTEwKXtpZihsKXttPTExfWVsc2V7ZT0wfX1pZigobXwwKT09MTEpe2NbZj4+Ml09Y1tmPj4yXXw2O3A9MDtpPWo7cmV0dXJuIHB8MH1tPWNbYT4+Ml18MDtsPWNbbSsxMj4+Ml18MDtpZigobHwwKT09KGNbbSsxNj4+Ml18MCkpe209b2NbY1soY1ttPj4yXXwwKSszNj4+Ml0mMTI3XShtKXwwfWVsc2V7bT1kW2w+PjBdfDB9bD1tJjI1NTtpZihsPDwyND4+MjQ+LTE/KGs9Zys4fDAsISgoYlsoY1trPj4yXXwwKSsobTw8MjQ+PjI0PDwxKT4+MV0mMjA0OCk9PTApKTowKXtsPShoY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSY2M10oZyxsLDApfDApPDwyND4+MjQ7bz1jW2E+PjJdfDA7bT1vKzEyfDA7bj1jW20+PjJdfDA7aWYoKG58MCk9PShjW28rMTY+PjJdfDApKXtvY1tjWyhjW28+PjJdfDApKzQwPj4yXSYxMjddKG8pfDA7bj1lO209ZX1lbHNle2NbbT4+Ml09bisxO249ZTttPWV9d2hpbGUoMSl7bD1sKyAtNDh8MDtoPWgrIC0xfDA7ZT1jW2E+PjJdfDA7ZG97aWYoKGV8MCkhPTApe2lmKChjW2UrMTI+PjJdfDApPT0oY1tlKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MCk9PS0xKXtjW2E+PjJdPTA7ZT0wO2JyZWFrfWVsc2V7ZT1jW2E+PjJdfDA7YnJlYWt9fX1lbHNle2U9MH19d2hpbGUoMCk7bz0oZXwwKT09MDtpZigobXwwKSE9MCl7aWYoKGNbbSsxMj4+Ml18MCk9PShjW20rMTY+PjJdfDApKXttPShvY1tjWyhjW20+PjJdfDApKzM2Pj4yXSYxMjddKG0pfDApPT0tMTtlPW0/MDpuO209bT8wOm59ZWxzZXtlPW59fWVsc2V7ZT1uO209MH1uPWNbYT4+Ml18MDtpZighKChvXihtfDApPT0wKSYoaHwwKT4wKSl7bT0zODticmVha31vPWNbbisxMj4+Ml18MDtpZigob3wwKT09KGNbbisxNj4+Ml18MCkpe249b2NbY1soY1tuPj4yXXwwKSszNj4+Ml0mMTI3XShuKXwwfWVsc2V7bj1kW28+PjBdfDB9bz1uJjI1NTtpZighKG88PDI0Pj4yND4tMSkpe209NDk7YnJlYWt9aWYoKGJbKGNbaz4+Ml18MCkrKG48PDI0Pj4yNDw8MSk+PjFdJjIwNDgpPT0wKXttPTQ5O2JyZWFrfWw9KChoY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSY2M10oZyxvLDApfDApPDwyND4+MjQpKyhsKjEwfDApfDA7bj1jW2E+PjJdfDA7cD1uKzEyfDA7bz1jW3A+PjJdfDA7aWYoKG98MCk9PShjW24rMTY+PjJdfDApKXtvY1tjWyhjW24+PjJdfDApKzQwPj4yXSYxMjddKG4pfDA7bj1lO2NvbnRpbnVlfWVsc2V7Y1twPj4yXT1vKzE7bj1lO2NvbnRpbnVlfX1pZigobXwwKT09Mzgpe2Rve2lmKChufDApIT0wKXtpZigoY1tuKzEyPj4yXXwwKT09KGNbbisxNj4+Ml18MCkpe2lmKChvY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDApPT0tMSl7Y1thPj4yXT0wO249MDticmVha31lbHNle249Y1thPj4yXXwwO2JyZWFrfX19ZWxzZXtuPTB9fXdoaWxlKDApO2c9KG58MCk9PTA7ZG97aWYoKGV8MCkhPTApe2lmKChjW2UrMTI+PjJdfDApPT0oY1tlKzE2Pj4yXXwwKT8ob2NbY1soY1tlPj4yXXwwKSszNj4+Ml0mMTI3XShlKXwwKT09LTE6MCl7bT00NzticmVha31pZihnKXtwPWw7aT1qO3JldHVybiBwfDB9fWVsc2V7bT00N319d2hpbGUoMCk7aWYoKG18MCk9PTQ3PyFnOjApe3A9bDtpPWo7cmV0dXJuIHB8MH1jW2Y+PjJdPWNbZj4+Ml18MjtwPWw7aT1qO3JldHVybiBwfDB9ZWxzZSBpZigobXwwKT09NDkpe2k9ajtyZXR1cm4gbHwwfX1jW2Y+PjJdPWNbZj4+Ml18NDtwPTA7aT1qO3JldHVybiBwfDB9ZnVuY3Rpb24gY2ooYSxiLGQsZSxmLGcsaCxqLGspe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wO209aTtpPWkrMzJ8MDtvPW07cD1tKzI0fDA7bj1tKzIwfDA7cj1tKzE2fDA7cT1tKzEyfDA7dD1jW2YrMjg+PjJdfDA7eT10KzR8MDtjW3k+PjJdPShjW3k+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW28+PjJdPTEzNDQ4O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM0NDgsbyl9dT0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dj1jW3QrOD4+Ml18MDtpZigoY1t0KzEyPj4yXXwwKS12Pj4yPj4+MD51Pj4+MD8ocz1jW3YrKHU8PDIpPj4yXXwwLChzfDApIT0wKTowKXt4PXQrNHwwO3k9Y1t4Pj4yXXwwO2NbeD4+Ml09eSsgLTE7aWYoKHl8MCk9PTApe2xjW2NbKGNbdD4+Ml18MCkrOD4+Ml0mMjU1XSh0KX1jW2c+PjJdPTA7YTpkb3tpZigoanwwKSE9KGt8MCkpe3Q9MDtiOndoaWxlKDEpe3U9dDt0PWQ7d2hpbGUoMSl7aWYoKHV8MCkhPTApe2Q9dDticmVhayBhfWlmKCh0fDApPT0wKXt1PTE7ZD0wO3Q9MH1lbHNle2Q9Y1t0KzEyPj4yXXwwO2lmKChkfDApPT0oY1t0KzE2Pj4yXXwwKSl7ZD1vY1tjWyhjW3Q+PjJdfDApKzM2Pj4yXSYxMjddKHQpfDB9ZWxzZXtkPWNbZD4+Ml18MH15PShkfDApPT0tMTt1PXk/MTowO2Q9eT8wOnQ7dD15PzA6dH1pZigoZXwwKSE9MCl7dj1jW2UrMTI+PjJdfDA7aWYoKHZ8MCk9PShjW2UrMTY+PjJdfDApKXt2PW9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MH1lbHNle3Y9Y1t2Pj4yXXwwfWlmKCEoKHZ8MCk9PS0xKSl7aWYoIXUpe2w9MjU7YnJlYWsgYn19ZWxzZXtsPTIzfX1lbHNle2w9MjN9aWYoKGx8MCk9PTIzKXtsPTA7aWYodSl7ZT0wO2w9MjU7YnJlYWsgYn1lbHNle2U9MH19aWYoKGhjW2NbKGNbcz4+Ml18MCkrNTI+PjJdJjYzXShzLGNbaj4+Ml18MCwwKXwwKTw8MjQ+PjI0PT0zNyl7bD0yNzticmVha31pZihoY1tjWyhjW3M+PjJdfDApKzEyPj4yXSY2M10ocyw4MTkyLGNbaj4+Ml18MCl8MCl7bD0zNzticmVha311PWQrMTJ8MDt3PWNbdT4+Ml18MDt2PWQrMTZ8MDtpZigod3wwKT09KGNbdj4+Ml18MCkpe3c9b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7dz1jW3c+PjJdfDB9eT14Y1tjWyhjW3M+PjJdfDApKzI4Pj4yXSY2M10ocyx3KXwwO2lmKCh5fDApPT0oeGNbY1soY1tzPj4yXXwwKSsyOD4+Ml0mNjNdKHMsY1tqPj4yXXwwKXwwKSl7bD02MzticmVha31jW2c+PjJdPTQ7dT00fWM6ZG97aWYoKGx8MCk9PTI3KXtsPTA7dT1qKzR8MDtpZigodXwwKT09KGt8MCkpe2w9Mjg7YnJlYWsgYn10PWhjW2NbKGNbcz4+Ml18MCkrNTI+PjJdJjYzXShzLGNbdT4+Ml18MCwwKXwwO2lmKHQ8PDI0Pj4yND09NDh8dDw8MjQ+PjI0PT02OSl7dT1qKzh8MDtpZigodXwwKT09KGt8MCkpe2w9MzE7YnJlYWsgYn1qPXU7dT1oY1tjWyhjW3M+PjJdfDApKzUyPj4yXSY2M10ocyxjW3U+PjJdfDAsMCl8MH1lbHNle2o9dTt1PXQ7dD0wfXk9Y1soY1tiPj4yXXwwKSszNj4+Ml18MDtjW3I+PjJdPWQ7Y1txPj4yXT1lO2NbcCswPj4yXT1jW3IrMD4+Ml07Y1tvKzA+PjJdPWNbcSswPj4yXTtuY1t5JjMxXShuLGIscCxvLGYsZyxoLHUsdCk7aj1qKzR8MDtkPWNbbj4+Ml18MH1lbHNlIGlmKChsfDApPT0zNyl7d2hpbGUoMSl7bD0wO2o9ais0fDA7aWYoKGp8MCk9PShrfDApKXtqPWs7YnJlYWt9aWYoaGNbY1soY1tzPj4yXXwwKSsxMj4+Ml0mNjNdKHMsODE5MixjW2o+PjJdfDApfDApe2w9Mzd9ZWxzZXticmVha319dT1lO3c9ZTt3aGlsZSgxKXtpZigoZHwwKT09MCl7dj0xO2Q9MH1lbHNle3Y9Y1tkKzEyPj4yXXwwO2lmKCh2fDApPT0oY1tkKzE2Pj4yXXwwKSl7dj1vY1tjWyhjW2Q+PjJdfDApKzM2Pj4yXSYxMjddKGQpfDB9ZWxzZXt2PWNbdj4+Ml18MH15PSh2fDApPT0tMTt2PXk/MTowO2Q9eT8wOmQ7dD15PzA6dH1pZigod3wwKSE9MCl7eD1jW3crMTI+PjJdfDA7aWYoKHh8MCk9PShjW3crMTY+PjJdfDApKXt3PW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle3c9Y1t4Pj4yXXwwfWlmKCEoKHd8MCk9PS0xKSl7aWYodl4odXwwKT09MCl7dj11O3c9dX1lbHNle2Q9dDticmVhayBjfX1lbHNle3U9MDtlPTA7bD01MH19ZWxzZXtsPTUwfWlmKChsfDApPT01MCl7bD0wO2lmKHYpe2Q9dDticmVhayBjfWVsc2V7dj11O3c9MH19eD1kKzEyfDA7eT1jW3g+PjJdfDA7dT1kKzE2fDA7aWYoKHl8MCk9PShjW3U+PjJdfDApKXt5PW9jW2NbKGNbZD4+Ml18MCkrMzY+PjJdJjEyN10oZCl8MH1lbHNle3k9Y1t5Pj4yXXwwfWlmKCEoaGNbY1soY1tzPj4yXXwwKSsxMj4+Ml0mNjNdKHMsODE5Mix5KXwwKSl7ZD10O2JyZWFrIGN9eT1jW3g+PjJdfDA7aWYoKHl8MCk9PShjW3U+PjJdfDApKXtvY1tjWyhjW2Q+PjJdfDApKzQwPj4yXSYxMjddKGQpfDA7dT12O2NvbnRpbnVlfWVsc2V7Y1t4Pj4yXT15KzQ7dT12O2NvbnRpbnVlfX19ZWxzZSBpZigobHwwKT09NjMpe2w9MDt3PWNbdT4+Ml18MDtpZigod3wwKT09KGNbdj4+Ml18MCkpe29jW2NbKGNbZD4+Ml18MCkrNDA+PjJdJjEyN10oZCl8MH1lbHNle2NbdT4+Ml09dys0fWo9ais0fDA7ZD10fX13aGlsZSgwKTtpZigoanwwKT09KGt8MCkpe2JyZWFrIGF9dD1jW2c+PjJdfDB9aWYoKGx8MCk9PTI1KXtjW2c+PjJdPTQ7YnJlYWt9ZWxzZSBpZigobHwwKT09Mjgpe2NbZz4+Ml09NDticmVha31lbHNlIGlmKChsfDApPT0zMSl7Y1tnPj4yXT00O2JyZWFrfX19d2hpbGUoMCk7aWYoKGR8MCk9PTApe249MDtvPTF9ZWxzZXtuPWNbZCsxMj4+Ml18MDtpZigobnwwKT09KGNbZCsxNj4+Ml18MCkpe249b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7bj1jW24+PjJdfDB9bz0obnwwKT09LTE7bj1vPzA6ZDtvPW8/MTowfWlmKChlfDApIT0wKXtwPWNbZSsxMj4+Ml18MDtpZigocHwwKT09KGNbZSsxNj4+Ml18MCkpe3A9b2NbY1soY1tlPj4yXXwwKSszNj4+Ml0mMTI3XShlKXwwfWVsc2V7cD1jW3A+PjJdfDB9aWYoISgocHwwKT09LTEpKXtpZihvKXtjW2E+PjJdPW47aT1tO3JldHVybn19ZWxzZXtsPTc4fX1lbHNle2w9Nzh9aWYoKGx8MCk9PTc4PyFvOjApe2NbYT4+Ml09bjtpPW07cmV0dXJufWNbZz4+Ml09Y1tnPj4yXXwyO2NbYT4+Ml09bjtpPW07cmV0dXJufXk9WGEoNCl8MDtjW3k+PjJdPTIxMzA0O3diKHl8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIGRqKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIGVqKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBmaihhKXthPWF8MDtyZXR1cm4gMn1mdW5jdGlvbiBnaihhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wO2o9aTtjaihhLGIsY1tkPj4yXXwwLGNbZT4+Ml18MCxmLGcsaCwxMjUyOCwxMjU2MHwwKTtpPWo7cmV0dXJufWZ1bmN0aW9uIGhqKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTA7az1pO209ZCs4fDA7bT1vY1tjWyhjW20+PjJdfDApKzIwPj4yXSYxMjddKG0pfDA7bj1hW20+PjBdfDA7aWYoKG4mMSk9PTApe2w9bSs0fDA7bT0obiYyNTUpPj4+MX1lbHNle2w9Y1ttKzg+PjJdfDA7bT1jW20rND4+Ml18MH1jaihiLGQsY1tlPj4yXXwwLGNbZj4+Ml18MCxnLGgsaixsLGwrKG08PDIpfDApO2k9aztyZXR1cm59ZnVuY3Rpb24gaWooYSxiLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MDtqPWk7aT1pKzE2fDA7bD1qO2Y9Y1tmKzI4Pj4yXXwwO209Zis0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKSsxO2lmKCEoKGNbMzM2Ml18MCk9PS0xKSl7Y1tsPj4yXT0xMzQ0ODtjW2wrND4+Ml09MjA4O2NbbCs4Pj4yXT0wO2NnKDEzNDQ4LGwpfWw9KGNbMTM0NTI+PjJdfDApKyAtMXwwO209Y1tmKzg+PjJdfDA7aWYoKGNbZisxMj4+Ml18MCktbT4+Mj4+PjA+bD4+PjA/KGs9Y1ttKyhsPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7bD1mKzR8MDttPWNbbD4+Ml18MDtjW2w+PjJdPW0rIC0xO2lmKChtfDApPT0wKXtsY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZil9bT1jW2U+PjJdfDA7Yj1iKzh8MDtiPW9jW2NbY1tiPj4yXT4+Ml0mMTI3XShiKXwwO2I9KGFpKGQsbSxiLGIrMTY4fDAsayxnLDApfDApLWJ8MDtpZigoYnwwKT49MTY4KXttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1jW2grMjQ+PjJdPSgoYnwwKS8xMnwwfDApJTd8MDttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBqaihhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wO2o9aTtpPWkrMTZ8MDtsPWo7Zj1jW2YrMjg+PjJdfDA7bT1mKzR8MDtjW20+PjJdPShjW20+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW2w+PjJdPTEzNDQ4O2NbbCs0Pj4yXT0yMDg7Y1tsKzg+PjJdPTA7Y2coMTM0NDgsbCl9bD0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7bT1jW2YrOD4+Ml18MDtpZigoY1tmKzEyPj4yXXwwKS1tPj4yPj4+MD5sPj4+MD8oaz1jW20rKGw8PDIpPj4yXXwwLChrfDApIT0wKTowKXtsPWYrNHwwO209Y1tsPj4yXXwwO2NbbD4+Ml09bSsgLTE7aWYoKG18MCk9PTApe2xjW2NbKGNbZj4+Ml18MCkrOD4+Ml0mMjU1XShmKX1tPWNbZT4+Ml18MDtiPWIrOHwwO2I9b2NbY1soY1tiPj4yXXwwKSs0Pj4yXSYxMjddKGIpfDA7Yj0oYWkoZCxtLGIsYisyODh8MCxrLGcsMCl8MCktYnwwO2lmKChifDApPj0yODgpe209Y1tkPj4yXXwwO2NbYT4+Ml09bTtpPWo7cmV0dXJufWNbaCsxNj4+Ml09KChifDApLzEyfDB8MCklMTJ8MDttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBraihhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTA7Yj1pO2k9aSsxNnwwO2s9YjtmPWNbZisyOD4+Ml18MDtsPWYrNHwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ0OCxrKX1rPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtsPWNbZis4Pj4yXXwwO2lmKChjW2YrMTI+PjJdfDApLWw+PjI+Pj4wPms+Pj4wPyhqPWNbbCsoazw8Mik+PjJdfDAsKGp8MCkhPTApOjApe2s9Zis0fDA7bD1jW2s+PjJdfDA7Y1trPj4yXT1sKyAtMTtpZigobHwwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfWU9bWooZCxjW2U+PjJdfDAsZyxqLDQpfDA7aWYoKGNbZz4+Ml0mNHwwKSE9MCl7bD1jW2Q+PjJdfDA7Y1thPj4yXT1sO2k9YjtyZXR1cm59aWYoKGV8MCk8Njkpe2c9ZSsyZTN8MH1lbHNle2c9KGUrIC02OXwwKT4+PjA8MzE/ZSsxOTAwfDA6ZX1jW2grMjA+PjJdPWcrIC0xOTAwO2w9Y1tkPj4yXXwwO2NbYT4+Ml09bDtpPWI7cmV0dXJufWw9WGEoNCl8MDtjW2w+PjJdPTIxMzA0O3diKGx8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIGxqKGIsZCxlLGYsZyxoLGosayxsKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MDtsPWk7aT1pKzY0fDA7eT1sO3g9bCsxNnwwO3A9bCsyOHwwO3Y9bCsyNHwwO3c9bCszMnwwO0M9bCsxMnwwO3I9bCsyMHwwO3M9bCszNnwwO3Q9bCs0MHwwO3o9bCs0NHwwO3E9bCs0OHwwO2NbaD4+Ml09MDt1PWNbZysyOD4+Ml18MDtCPXUrNHwwO2NbQj4+Ml09KGNbQj4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbeT4+Ml09MTM0NDg7Y1t5KzQ+PjJdPTIwODtjW3krOD4+Ml09MDtjZygxMzQ0OCx5KX1BPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtCPWNbdSs4Pj4yXXwwO2lmKChjW3UrMTI+PjJdfDApLUI+PjI+Pj4wPkE+Pj4wPyhuPWNbQisoQTw8Mik+PjJdfDAsKG58MCkhPTApOjApe0E9dSs0fDA7Qj1jW0E+PjJdfDA7Y1tBPj4yXT1CKyAtMTtpZigoQnwwKT09MCl7bGNbY1soY1t1Pj4yXXwwKSs4Pj4yXSYyNTVdKHUpfWE6ZG97c3dpdGNoKGs8PDI0Pj4yNHwwKXtjYXNlIDgzOntuPW1qKGUsY1tmPj4yXXwwLGgsbiwyKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8NjEpe2Nbaj4+Ml09bjticmVhayBhfWVsc2V7Y1toPj4yXT1tfDQ7YnJlYWsgYX19O2Nhc2UgODQ6e2NqKHMsZCxjW2U+PjJdfDAsY1tmPj4yXXwwLGcsaCxqLDEyNjk2LDEyNzI4fDApO2NbZT4+Ml09Y1tzPj4yXTticmVha307Y2FzZSA4Mjp7Y2oocixkLGNbZT4+Ml18MCxjW2Y+PjJdfDAsZyxoLGosMTI2NzIsMTI2OTJ8MCk7Y1tlPj4yXT1jW3I+PjJdO2JyZWFrfTtjYXNlIDExMjp7bT1qKzh8MDtqPWNbZj4+Ml18MDtmPWQrOHwwO2Y9b2NbY1soY1tmPj4yXXwwKSs4Pj4yXSYxMjddKGYpfDA7ZD1hW2Y+PjBdfDA7aWYoKGQmMSk9PTApe2Q9KGQmMjU1KT4+PjF9ZWxzZXtkPWNbZis0Pj4yXXwwfWc9YVtmKzEyPj4wXXwwO2lmKChnJjEpPT0wKXtnPShnJjI1NSk+Pj4xfWVsc2V7Zz1jW2YrMTY+PjJdfDB9aWYoKGR8MCk9PSgwLWd8MCkpe2NbaD4+Ml09Y1toPj4yXXw0O2JyZWFrIGF9Qz1haShlLGosZixmKzI0fDAsbixoLDApfDA7aD1DLWZ8MDtpZigoQ3wwKT09KGZ8MCk/KGNbbT4+Ml18MCk9PTEyOjApe2NbbT4+Ml09MDticmVhayBhfWlmKChofDApPT0xMj8obz1jW20+PjJdfDAsKG98MCk8MTIpOjApe2NbbT4+Ml09bysxMn1icmVha307Y2FzZSAxMTQ6e2NqKEMsZCxjW2U+PjJdfDAsY1tmPj4yXXwwLGcsaCxqLDEyNjI0LDEyNjY4fDApO2NbZT4+Ml09Y1tDPj4yXTticmVha307Y2FzZSAxMjA6e0M9Y1soY1tkPj4yXXwwKSsyMD4+Ml18MDtjW3Q+PjJdPWNbZT4+Ml07Y1t6Pj4yXT1jW2Y+PjJdO2NbeCswPj4yXT1jW3QrMD4+Ml07Y1t5KzA+PjJdPWNbeiswPj4yXTtpY1tDJjYzXShiLGQseCx5LGcsaCxqKTtpPWw7cmV0dXJufTtjYXNlIDg4OntvPWQrOHwwO289b2NbY1soY1tvPj4yXXwwKSsyND4+Ml0mMTI3XShvKXwwO249YVtvPj4wXXwwO2lmKChuJjEpPT0wKXttPW8rNHwwO249KG4mMjU1KT4+PjF9ZWxzZXttPWNbbys4Pj4yXXwwO249Y1tvKzQ+PjJdfDB9Y2oocSxkLGNbZT4+Ml18MCxjW2Y+PjJdfDAsZyxoLGosbSxtKyhuPDwyKXwwKTtjW2U+PjJdPWNbcT4+Ml07YnJlYWt9O2Nhc2UgMTE5OntuPW1qKGUsY1tmPj4yXXwwLGgsbiwxKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8Nyl7Y1tqKzI0Pj4yXT1uO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSAxMjE6e209aisyMHwwO249bWooZSxjW2Y+PjJdfDAsaCxuLDQpfDA7aWYoKGNbaD4+Ml0mNHwwKT09MCl7aWYoKG58MCk8Njkpe2g9bisyZTN8MH1lbHNle2g9KG4rIC02OXwwKT4+PjA8MzE/bisxOTAwfDA6bn1jW20+PjJdPWgrIC0xOTAwfWJyZWFrfTtjYXNlIDg5OnttPW1qKGUsY1tmPj4yXXwwLGgsbiw0KXwwO2lmKChjW2g+PjJdJjR8MCk9PTApe2NbaisyMD4+Ml09bSsgLTE5MDB9YnJlYWt9O2Nhc2UgMzc6e2o9Y1tmPj4yXXwwO2Y9Y1tlPj4yXXwwO2Rve2lmKChmfDApIT0wKXtkPWNbZisxMj4+Ml18MDtpZigoZHwwKT09KGNbZisxNj4+Ml18MCkpe2Y9b2NbY1soY1tmPj4yXXwwKSszNj4+Ml0mMTI3XShmKXwwfWVsc2V7Zj1jW2Q+PjJdfDB9aWYoKGZ8MCk9PS0xKXtjW2U+PjJdPTA7Zj0xO2JyZWFrfWVsc2V7Zj0oY1tlPj4yXXwwKT09MDticmVha319ZWxzZXtmPTF9fXdoaWxlKDApO2lmKChqfDApIT0wKXtkPWNbaisxMj4+Ml18MDtpZigoZHwwKT09KGNbaisxNj4+Ml18MCkpe2Q9b2NbY1soY1tqPj4yXXwwKSszNj4+Ml0mMTI3XShqKXwwfWVsc2V7ZD1jW2Q+PjJdfDB9aWYoISgoZHwwKT09LTEpKXtpZighZil7bT0xMjZ9fWVsc2V7bT0xMjR9fWVsc2V7bT0xMjR9aWYoKG18MCk9PTEyNCl7aWYoZil7bT0xMjZ9ZWxzZXtqPTB9fWlmKChtfDApPT0xMjYpe2NbaD4+Ml09Y1toPj4yXXw2O2JyZWFrIGF9ZD1jW2U+PjJdfDA7Zj1jW2QrMTI+PjJdfDA7aWYoKGZ8MCk9PShjW2QrMTY+PjJdfDApKXtmPW9jW2NbKGNbZD4+Ml18MCkrMzY+PjJdJjEyN10oZCl8MH1lbHNle2Y9Y1tmPj4yXXwwfWlmKCEoKGhjW2NbKGNbbj4+Ml18MCkrNTI+PjJdJjYzXShuLGYsMCl8MCk8PDI0Pj4yND09MzcpKXtjW2g+PjJdPWNbaD4+Ml18NDticmVhayBhfWQ9Y1tlPj4yXXwwO2Y9ZCsxMnwwO249Y1tmPj4yXXwwO2lmKChufDApPT0oY1tkKzE2Pj4yXXwwKSl7b2NbY1soY1tkPj4yXXwwKSs0MD4+Ml0mMTI3XShkKXwwfWVsc2V7Y1tmPj4yXT1uKzR9bj1jW2U+PjJdfDA7ZG97aWYoKG58MCkhPTApe2Y9Y1tuKzEyPj4yXXwwO2lmKChmfDApPT0oY1tuKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDB9ZWxzZXtuPWNbZj4+Ml18MH1pZigobnwwKT09LTEpe2NbZT4+Ml09MDtuPTE7YnJlYWt9ZWxzZXtuPShjW2U+PjJdfDApPT0wO2JyZWFrfX1lbHNle249MX19d2hpbGUoMCk7aWYoKGp8MCkhPTApe2Y9Y1tqKzEyPj4yXXwwO2lmKChmfDApPT0oY1tqKzE2Pj4yXXwwKSl7aj1vY1tjWyhjW2o+PjJdfDApKzM2Pj4yXSYxMjddKGopfDB9ZWxzZXtqPWNbZj4+Ml18MH1pZighKChqfDApPT0tMSkpe2lmKG4pe2JyZWFrIGF9fWVsc2V7bT0xNDd9fWVsc2V7bT0xNDd9aWYoKG18MCk9PTE0Nz8hbjowKXticmVhayBhfWNbaD4+Ml09Y1toPj4yXXwyO2JyZWFrfTtjYXNlIDEwOTp7bj1taihlLGNbZj4+Ml18MCxoLG4sMil8MDttPWNbaD4+Ml18MDtpZigobSY0fDApPT0wJihufDApPDEzKXtjW2orMTY+PjJdPW4rIC0xO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSA3MDp7Y2oodyxkLGNbZT4+Ml18MCxjW2Y+PjJdfDAsZyxoLGosMTI1OTIsMTI2MjR8MCk7Y1tlPj4yXT1jW3c+PjJdO2JyZWFrfTtjYXNlIDY4Ontjaih2LGQsY1tlPj4yXXwwLGNbZj4+Ml18MCxnLGgsaiwxMjU2MCwxMjU5MnwwKTtjW2U+PjJdPWNbdj4+Ml07YnJlYWt9O2Nhc2UgMTA0OmNhc2UgNjY6Y2FzZSA5ODp7Qj1jW2Y+PjJdfDA7Qz1kKzh8MDtDPW9jW2NbKGNbQz4+Ml18MCkrND4+Ml0mMTI3XShDKXwwO2g9KGFpKGUsQixDLEMrMjg4fDAsbixoLDApfDApLUN8MDtpZigoaHwwKTwyODgpe2NbaisxNj4+Ml09KChofDApLzEyfDB8MCklMTJ8MH1icmVha307Y2FzZSAxMTY6Y2FzZSAxMTA6e2o9Y1tmPj4yXXwwO3doaWxlKDEpe2Q9Y1tlPj4yXXwwO2Rve2lmKChkfDApIT0wKXtmPWNbZCsxMj4+Ml18MDtpZigoZnwwKT09KGNbZCsxNj4+Ml18MCkpe2Y9b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7Zj1jW2Y+PjJdfDB9aWYoKGZ8MCk9PS0xKXtjW2U+PjJdPTA7Zj0xO2JyZWFrfWVsc2V7Zj0oY1tlPj4yXXwwKT09MDticmVha319ZWxzZXtmPTF9fXdoaWxlKDApO2lmKChqfDApIT0wKXtkPWNbaisxMj4+Ml18MDtpZigoZHwwKT09KGNbaisxNj4+Ml18MCkpe2Q9b2NbY1soY1tqPj4yXXwwKSszNj4+Ml0mMTI3XShqKXwwfWVsc2V7ZD1jW2Q+PjJdfDB9aWYoISgoZHwwKT09LTEpKXtpZighZil7YnJlYWt9fWVsc2V7bT01M319ZWxzZXttPTUzfWlmKChtfDApPT01Myl7bT0wO2lmKGYpe2o9MDticmVha31lbHNle2o9MH19ZD1jW2U+PjJdfDA7Zj1jW2QrMTI+PjJdfDA7aWYoKGZ8MCk9PShjW2QrMTY+PjJdfDApKXtmPW9jW2NbKGNbZD4+Ml18MCkrMzY+PjJdJjEyN10oZCl8MH1lbHNle2Y9Y1tmPj4yXXwwfWlmKCEoaGNbY1soY1tuPj4yXXwwKSsxMj4+Ml0mNjNdKG4sODE5MixmKXwwKSl7YnJlYWt9bz1jW2U+PjJdfDA7ZD1vKzEyfDA7Zj1jW2Q+PjJdfDA7aWYoKGZ8MCk9PShjW28rMTY+PjJdfDApKXtvY1tjWyhjW28+PjJdfDApKzQwPj4yXSYxMjddKG8pfDA7Y29udGludWV9ZWxzZXtjW2Q+PjJdPWYrNDtjb250aW51ZX19Zj1jW2U+PjJdfDA7ZG97aWYoKGZ8MCkhPTApe249Y1tmKzEyPj4yXXwwO2lmKChufDApPT0oY1tmKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW2Y+PjJdfDApKzM2Pj4yXSYxMjddKGYpfDB9ZWxzZXtuPWNbbj4+Ml18MH1pZigobnwwKT09LTEpe2NbZT4+Ml09MDtuPTE7YnJlYWt9ZWxzZXtuPShjW2U+PjJdfDApPT0wO2JyZWFrfX1lbHNle249MX19d2hpbGUoMCk7aWYoKGp8MCkhPTApe2Y9Y1tqKzEyPj4yXXwwO2lmKChmfDApPT0oY1tqKzE2Pj4yXXwwKSl7aj1vY1tjWyhjW2o+PjJdfDApKzM2Pj4yXSYxMjddKGopfDB9ZWxzZXtqPWNbZj4+Ml18MH1pZighKChqfDApPT0tMSkpe2lmKG4pe2JyZWFrIGF9fWVsc2V7bT03NH19ZWxzZXttPTc0fWlmKChtfDApPT03ND8hbjowKXticmVhayBhfWNbaD4+Ml09Y1toPj4yXXwyO2JyZWFrfTtjYXNlIDY1OmNhc2UgOTc6e0I9Y1tmPj4yXXwwO0M9ZCs4fDA7Qz1vY1tjW2NbQz4+Ml0+PjJdJjEyN10oQyl8MDtoPShhaShlLEIsQyxDKzE2OHwwLG4saCwwKXwwKS1DfDA7aWYoKGh8MCk8MTY4KXtjW2orMjQ+PjJdPSgoaHwwKS8xMnwwfDApJTd8MH1icmVha307Y2FzZSA5OTp7bz1kKzh8MDtvPW9jW2NbKGNbbz4+Ml18MCkrMTI+PjJdJjEyN10obyl8MDtuPWFbbz4+MF18MDtpZigobiYxKT09MCl7bT1vKzR8MDtuPShuJjI1NSk+Pj4xfWVsc2V7bT1jW28rOD4+Ml18MDtuPWNbbys0Pj4yXXwwfWNqKHAsZCxjW2U+PjJdfDAsY1tmPj4yXXwwLGcsaCxqLG0sbSsobjw8Mil8MCk7Y1tlPj4yXT1jW3A+PjJdO2JyZWFrfTtjYXNlIDcyOntuPW1qKGUsY1tmPj4yXXwwLGgsbiwyKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8MjQpe2Nbais4Pj4yXT1uO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSAxMDE6Y2FzZSAxMDA6e209aisxMnwwO2o9bWooZSxjW2Y+PjJdfDAsaCxuLDIpfDA7bj1jW2g+PjJdfDA7aWYoKG4mNHwwKT09MD8oaisgLTF8MCk+Pj4wPDMxOjApe2NbbT4+Ml09ajticmVhayBhfWNbaD4+Ml09bnw0O2JyZWFrfTtjYXNlIDczOnttPWorOHwwO249bWooZSxjW2Y+PjJdfDAsaCxuLDIpfDA7aj1jW2g+PjJdfDA7aWYoKGomNHwwKT09MD8obisgLTF8MCk+Pj4wPDEyOjApe2NbbT4+Ml09bjticmVhayBhfWNbaD4+Ml09anw0O2JyZWFrfTtjYXNlIDc3OntuPW1qKGUsY1tmPj4yXXwwLGgsbiwyKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8NjApe2Nbais0Pj4yXT1uO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSAxMDY6e249bWooZSxjW2Y+PjJdfDAsaCxuLDMpfDA7bT1jW2g+PjJdfDA7aWYoKG0mNHwwKT09MCYobnwwKTwzNjYpe2NbaisyOD4+Ml09bjticmVhayBhfWVsc2V7Y1toPj4yXT1tfDQ7YnJlYWsgYX19O2RlZmF1bHQ6e2NbaD4+Ml09Y1toPj4yXXw0fX19d2hpbGUoMCk7Y1tiPj4yXT1jW2U+PjJdO2k9bDtyZXR1cm59Qz1YYSg0KXwwO2NbQz4+Ml09MjEzMDQ7d2IoQ3wwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gbWooYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2g9aTtrPWNbYT4+Ml18MDtkb3tpZigoa3wwKSE9MCl7aj1jW2srMTI+PjJdfDA7aWYoKGp8MCk9PShjW2srMTY+PjJdfDApKXtqPW9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MH1lbHNle2o9Y1tqPj4yXXwwfWlmKChqfDApPT0tMSl7Y1thPj4yXT0wO2o9MTticmVha31lbHNle2o9KGNbYT4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7aj0xfX13aGlsZSgwKTtpZigoYnwwKSE9MCl7az1jW2IrMTI+PjJdfDA7aWYoKGt8MCk9PShjW2IrMTY+PjJdfDApKXtrPW9jW2NbKGNbYj4+Ml18MCkrMzY+PjJdJjEyN10oYil8MH1lbHNle2s9Y1trPj4yXXwwfWlmKCEoKGt8MCk9PS0xKSl7aWYoIWope2c9MTV9fWVsc2V7Zz0xM319ZWxzZXtnPTEzfWlmKChnfDApPT0xMyl7aWYoail7Zz0xNX1lbHNle2I9MH19aWYoKGd8MCk9PTE1KXtjW2Q+PjJdPWNbZD4+Ml18NjtuPTA7aT1oO3JldHVybiBufDB9aj1jW2E+PjJdfDA7az1jW2orMTI+PjJdfDA7aWYoKGt8MCk9PShjW2orMTY+PjJdfDApKXtqPW9jW2NbKGNbaj4+Ml18MCkrMzY+PjJdJjEyN10oail8MH1lbHNle2o9Y1trPj4yXXwwfWlmKCEoaGNbY1soY1tlPj4yXXwwKSsxMj4+Ml0mNjNdKGUsMjA0OCxqKXwwKSl7Y1tkPj4yXT1jW2Q+PjJdfDQ7bj0wO2k9aDtyZXR1cm4gbnwwfWo9KGhjW2NbKGNbZT4+Ml18MCkrNTI+PjJdJjYzXShlLGosMCl8MCk8PDI0Pj4yNDtsPWNbYT4+Ml18MDtrPWwrMTJ8MDttPWNbaz4+Ml18MDtpZigobXwwKT09KGNbbCsxNj4+Ml18MCkpe29jW2NbKGNbbD4+Ml18MCkrNDA+PjJdJjEyN10obCl8MDtrPWI7bD1iO2I9an1lbHNle2Nbaz4+Ml09bSs0O2s9YjtsPWI7Yj1qfXdoaWxlKDEpe2I9YisgLTQ4fDA7Zj1mKyAtMXwwO2o9Y1thPj4yXXwwO2Rve2lmKChqfDApIT0wKXttPWNbaisxMj4+Ml18MDtpZigobXwwKT09KGNbaisxNj4+Ml18MCkpe2o9b2NbY1soY1tqPj4yXXwwKSszNj4+Ml0mMTI3XShqKXwwfWVsc2V7aj1jW20+PjJdfDB9aWYoKGp8MCk9PS0xKXtjW2E+PjJdPTA7bT0xO2JyZWFrfWVsc2V7bT0oY1thPj4yXXwwKT09MDticmVha319ZWxzZXttPTF9fXdoaWxlKDApO2lmKChsfDApPT0wKXtqPWs7bD0wO249MX1lbHNle2o9Y1tsKzEyPj4yXXwwO2lmKChqfDApPT0oY1tsKzE2Pj4yXXwwKSl7aj1vY1tjWyhjW2w+PjJdfDApKzM2Pj4yXSYxMjddKGwpfDB9ZWxzZXtqPWNbaj4+Ml18MH1uPShqfDApPT0tMTtqPW4/MDprO2w9bj8wOms7bj1uPzE6KGt8MCk9PTB9az1jW2E+PjJdfDA7aWYoISgobV5uKSYoZnwwKT4wKSl7YnJlYWt9bT1jW2srMTI+PjJdfDA7aWYoKG18MCk9PShjW2srMTY+PjJdfDApKXtrPW9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MH1lbHNle2s9Y1ttPj4yXXwwfWlmKCEoaGNbY1soY1tlPj4yXXwwKSsxMj4+Ml0mNjNdKGUsMjA0OCxrKXwwKSl7Zz01OTticmVha31iPSgoaGNbY1soY1tlPj4yXXwwKSs1Mj4+Ml0mNjNdKGUsaywwKXwwKTw8MjQ+PjI0KSsoYioxMHwwKXwwO209Y1thPj4yXXwwO249bSsxMnwwO2s9Y1tuPj4yXXwwO2lmKChrfDApPT0oY1ttKzE2Pj4yXXwwKSl7b2NbY1soY1ttPj4yXXwwKSs0MD4+Ml0mMTI3XShtKXwwO2s9ajtjb250aW51ZX1lbHNle2Nbbj4+Ml09ays0O2s9ajtjb250aW51ZX19aWYoKGd8MCk9PTU5KXtpPWg7cmV0dXJuIGJ8MH1kb3tpZigoa3wwKSE9MCl7ZT1jW2srMTI+PjJdfDA7aWYoKGV8MCk9PShjW2srMTY+PjJdfDApKXtlPW9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MH1lbHNle2U9Y1tlPj4yXXwwfWlmKChlfDApPT0tMSl7Y1thPj4yXT0wO2E9MTticmVha31lbHNle2E9KGNbYT4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7YT0xfX13aGlsZSgwKTtpZigoanwwKSE9MCl7ZT1jW2orMTI+PjJdfDA7aWYoKGV8MCk9PShjW2orMTY+PjJdfDApKXtlPW9jW2NbKGNbaj4+Ml18MCkrMzY+PjJdJjEyN10oail8MH1lbHNle2U9Y1tlPj4yXXwwfWlmKCEoKGV8MCk9PS0xKSl7aWYoYSl7bj1iO2k9aDtyZXR1cm4gbnwwfX1lbHNle2c9NTZ9fWVsc2V7Zz01Nn1pZigoZ3wwKT09NTY/IWE6MCl7bj1iO2k9aDtyZXR1cm4gbnwwfWNbZD4+Ml09Y1tkPj4yXXwyO249YjtpPWg7cmV0dXJuIG58MH1mdW5jdGlvbiBuaihiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTA7ZD1pO2U9Yis4fDA7Zj1jW2U+PjJdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWlmKChmfDApIT0oY1szMzQwXXwwKSl7VmIoY1tlPj4yXXwwKX1pZigoYnwwKT09MCl7aT1kO3JldHVybn12bihiKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIG9qKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtiPWIrOHwwO2U9Y1tiPj4yXXwwO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1pZigoZXwwKT09KGNbMzM0MF18MCkpe2k9ZDtyZXR1cm59VmIoY1tiPj4yXXwwKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIHBqKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wO2Y9aTtpPWkrMTEyfDA7bj1mKzEwMHwwO2c9ZjthW24+PjBdPTM3O2w9bisxfDA7YVtsPj4wXT1qO209bisyfDA7YVttPj4wXT1rO2FbbiszPj4wXT0wO2lmKCEoazw8MjQ+PjI0PT0wKSl7YVtsPj4wXT1rO2FbbT4+MF09an1uPWViKGd8MCwxMDAsbnwwLGh8MCxjW2QrOD4+Ml18MCl8MDtoPWcrbnwwO2Q9Y1tlPj4yXXwwO2lmKChufDApPT0wKXtuPWQ7Y1tiPj4yXT1uO2k9ZjtyZXR1cm59ZWxzZXtlPWQ7bD1kfWRve2o9YVtnPj4wXXwwO2Rve2lmKChlfDApIT0wKXtrPWUrMjR8MDtkPWNbaz4+Ml18MDtpZigoZHwwKT09KGNbZSsyOD4+Ml18MCkpe249KHhjW2NbKGNbZT4+Ml18MCkrNTI+PjJdJjYzXShlLGomMjU1KXwwKT09LTE7bD1uPzA6bDtlPW4/MDplO2JyZWFrfWVsc2V7Y1trPj4yXT1kKzE7YVtkPj4wXT1qO2JyZWFrfX1lbHNle2U9MH19d2hpbGUoMCk7Zz1nKzF8MH13aGlsZSgoZ3wwKSE9KGh8MCkpO2NbYj4+Ml09bDtpPWY7cmV0dXJufWZ1bmN0aW9uIHFqKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MDtkPWk7ZT1iKzh8MDtmPWNbZT4+Ml18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9aWYoKGZ8MCkhPShjWzMzNDBdfDApKXtWYihjW2U+PjJdfDApfWlmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gcmooYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2I9Yis4fDA7ZT1jW2I+PjJdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWlmKChlfDApPT0oY1szMzQwXXwwKSl7aT1kO3JldHVybn1WYihjW2I+PjJdfDApO2k9ZDtyZXR1cm59ZnVuY3Rpb24gc2ooYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7Zj1pO2k9aSs1Mjh8MDtvPWYrNTEyfDA7cD1mKzQxMnwwO209ZjtsPWYrNDA4fDA7Zz1mKzh8MDthW28+PjBdPTM3O249bysxfDA7YVtuPj4wXT1qO3E9bysyfDA7YVtxPj4wXT1rO2FbbyszPj4wXT0wO2lmKCEoazw8MjQ+PjI0PT0wKSl7YVtuPj4wXT1rO2FbcT4+MF09an1qPWQrOHwwO2ViKHB8MCwxMDAsb3wwLGh8MCxjW2o+PjJdfDApfDA7az1tO2Nbaz4+Ml09MDtjW2srND4+Ml09MDtjW2w+PjJdPXA7aj1pYihjW2o+PjJdfDApfDA7az1WbShnLGwsMTAwLG0pfDA7aWYoKGp8MCkhPTApe2liKGp8MCl8MH1pZigoa3wwKT09LTEpe29rKDE0Mjk2KX1qPWcrKGs8PDIpfDA7ZD1jW2U+PjJdfDA7aWYoKGt8MCk9PTApe3E9ZDtjW2I+PjJdPXE7aT1mO3JldHVybn1lbHNle2U9ZDtrPWR9ZG97ZD1jW2c+PjJdfDA7aWYoKGV8MCk9PTApe2U9MH1lbHNle2g9ZSsyNHwwO2w9Y1toPj4yXXwwO2lmKChsfDApPT0oY1tlKzI4Pj4yXXwwKSl7ZD14Y1tjWyhjW2U+PjJdfDApKzUyPj4yXSY2M10oZSxkKXwwfWVsc2V7Y1toPj4yXT1sKzQ7Y1tsPj4yXT1kfXE9KGR8MCk9PS0xO2s9cT8wOms7ZT1xPzA6ZX1nPWcrNHwwfXdoaWxlKChnfDApIT0oanwwKSk7Y1tiPj4yXT1rO2k9ZjtyZXR1cm59ZnVuY3Rpb24gdGooYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gdWooYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIHZqKGEpe2E9YXwwO3JldHVybiAxMjd9ZnVuY3Rpb24gd2ooYSl7YT1hfDA7cmV0dXJuIDEyN31mdW5jdGlvbiB4aihhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIHlqKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gemooYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBBaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09MjthW2IrMT4+MF09NDU7YVtiKzI+PjBdPTA7cmV0dXJufWZ1bmN0aW9uIEJqKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIENqKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT02NzEwOTYzNDthW2IrMT4+MF09MjYyMTQ3O2FbYisyPj4wXT0xMDI0O2FbYiszPj4wXT00O3JldHVybn1mdW5jdGlvbiBEaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09NjcxMDk2MzQ7YVtiKzE+PjBdPTI2MjE0NzthW2IrMj4+MF09MTAyNDthW2IrMz4+MF09NDtyZXR1cm59ZnVuY3Rpb24gRWooYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gRmooYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEdqKGEpe2E9YXwwO3JldHVybiAxMjd9ZnVuY3Rpb24gSGooYSl7YT1hfDA7cmV0dXJuIDEyN31mdW5jdGlvbiBJaihhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIEpqKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gS2ooYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBMaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09MjthW2IrMT4+MF09NDU7YVtiKzI+PjBdPTA7cmV0dXJufWZ1bmN0aW9uIE1qKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIE5qKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT02NzEwOTYzNDthW2IrMT4+MF09MjYyMTQ3O2FbYisyPj4wXT0xMDI0O2FbYiszPj4wXT00O3JldHVybn1mdW5jdGlvbiBPaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09NjcxMDk2MzQ7YVtiKzE+PjBdPTI2MjE0NzthW2IrMj4+MF09MTAyNDthW2IrMz4+MF09NDtyZXR1cm59ZnVuY3Rpb24gUGooYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gUWooYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFJqKGEpe2E9YXwwO3JldHVybiAyMTQ3NDgzNjQ3fWZ1bmN0aW9uIFNqKGEpe2E9YXwwO3JldHVybiAyMTQ3NDgzNjQ3fWZ1bmN0aW9uIFRqKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gVWooYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBWaihhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIFdqKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTA7ZD1pO2FbYj4+MF09MjtiPWIrNHwwO2Y9MTtlPWI7d2hpbGUoMSl7Zj1mKyAtMXwwO2NbZT4+Ml09NDU7aWYoKGZ8MCk9PTApe2JyZWFrfWVsc2V7ZT1lKzR8MH19Y1tiKzQ+PjJdPTA7aT1kO3JldHVybn1mdW5jdGlvbiBYaihhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBZaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09NjcxMDk2MzQ7YVtiKzE+PjBdPTI2MjE0NzthW2IrMj4+MF09MTAyNDthW2IrMz4+MF09NDtyZXR1cm59ZnVuY3Rpb24gWmooYixjKXtiPWJ8MDtjPWN8MDthW2I+PjBdPTY3MTA5NjM0O2FbYisxPj4wXT0yNjIxNDc7YVtiKzI+PjBdPTEwMjQ7YVtiKzM+PjBdPTQ7cmV0dXJufWZ1bmN0aW9uIF9qKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uICRqKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBhayhhKXthPWF8MDtyZXR1cm4gMjE0NzQ4MzY0N31mdW5jdGlvbiBiayhhKXthPWF8MDtyZXR1cm4gMjE0NzQ4MzY0N31mdW5jdGlvbiBjayhhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIGRrKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gZWsoYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBmayhiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wO2Q9aTthW2I+PjBdPTI7Yj1iKzR8MDtmPTE7ZT1iO3doaWxlKDEpe2Y9ZisgLTF8MDtjW2U+PjJdPTQ1O2lmKChmfDApPT0wKXticmVha31lbHNle2U9ZSs0fDB9fWNbYis0Pj4yXT0wO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZ2soYSl7YT1hfDA7cmV0dXJuIDB9ZnVuY3Rpb24gaGsoYixjKXtiPWJ8MDtjPWN8MDthW2I+PjBdPTY3MTA5NjM0O2FbYisxPj4wXT0yNjIxNDc7YVtiKzI+PjBdPTEwMjQ7YVtiKzM+PjBdPTQ7cmV0dXJufWZ1bmN0aW9uIGlrKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT02NzEwOTYzNDthW2IrMT4+MF09MjYyMTQ3O2FbYisyPj4wXT0xMDI0O2FbYiszPj4wXT00O3JldHVybn1mdW5jdGlvbiBqayhhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBrayhhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gbGsoYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wO249aTtpPWkrMjQwfDA7cD1uO3g9bisxNDB8MDtkPW4rMTZ8MDtyPW4rMjR8MDt1PW4rMTM4fDA7cz1uKzEyOHwwO3E9bisyOHwwO2NbZD4+Ml09eDttPWQrNHwwO2NbbT4+Ml09MjEzO3g9eCsxMDB8MDtvPWNbaCsyOD4+Ml18MDt3PW8rNHwwO2Nbdz4+Ml09KGNbdz4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbcD4+Ml09MTM0NTY7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzQ1NixwKX13PShjWzEzNDYwPj4yXXwwKSsgLTF8MDt2PWNbbys4Pj4yXXwwO2lmKChjW28rMTI+PjJdfDApLXY+PjI+Pj4wPnc+Pj4wPyh0PWNbdisodzw8Mik+PjJdfDAsKHR8MCkhPTApOjApe2FbdT4+MF09MDtkb3tpZihuayhlLGNbZj4+Ml18MCxnLG8sY1toKzQ+PjJdfDAsaix1LHQsZCxyLHgpfDApe3VjW2NbKGNbdD4+Ml18MCkrMzI+PjJdJjMxXSh0LDEzMDg4LDEzMDk4fDAscyl8MDtnPWNbcj4+Ml18MDtoPWNbZD4+Ml18MDt0PWctaHwwO2lmKCh0fDApPjk4KXt2PXVuKHQrMnwwKXwwO2lmKCh2fDApPT0wKXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNle3Q9dn19ZWxzZXt0PTA7dj1xfWlmKChhW3U+PjBdfDApIT0wKXthW3Y+PjBdPTQ1O3Y9disxfDB9aWYoaD4+PjA8Zz4+PjApe3U9cysxMHwwO2c9cztkb3t3PWFbaD4+MF18MDt4PXM7d2hpbGUoMSl7aWYoKGFbeD4+MF18MCk9PXc8PDI0Pj4yNCl7YnJlYWt9eD14KzF8MDtpZigoeHwwKT09KHV8MCkpe3g9dTticmVha319YVt2Pj4wXT1hWzEzMDg4Kyh4LWcpPj4wXXwwO2g9aCsxfDA7dj12KzF8MH13aGlsZShoPj4+MDwoY1tyPj4yXXwwKT4+PjApfWFbdj4+MF09MDtjW3A+PjJdPWs7aWYoKEZhKHF8MCwxMzEwNCxwfDApfDApPT0xKXtpZigodHwwKT09MCl7YnJlYWt9dm4odCk7YnJlYWt9Zj1YYSg4KXwwO2NbZj4+Ml09OTkyODt3aGlsZSgxKXtqPXVuKDI4KXwwO2lmKChqfDApIT0wKXtsPTI5O2JyZWFrfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXtsPTI3O2JyZWFrfXNjW2wmMzFdKCl9aWYoKGx8MCk9PTI3KXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNlIGlmKChsfDApPT0yOSl7Y1tqKzQ+PjJdPTE1O2Nbaj4+Ml09MTU7bD1qKzEyfDA7Y1tmKzQ+PjJdPWw7Y1tqKzg+PjJdPTA7aj1sKzB8MDtsPTEzMTEyfDA7Yj1qKzE2fDA7ZG97YVtqPj4wXT1hW2w+PjBdfDA7aj1qKzF8MDtsPWwrMXwwfXdoaWxlKChqfDApPChifDApKTt3YihmfDAsMTAwNjQsMTA2KX19fXdoaWxlKDApO3A9Y1tlPj4yXXwwO2lmKChwfDApIT0wKXtpZigoY1twKzEyPj4yXXwwKT09KGNbcCsxNj4+Ml18MCk/KG9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MCk9PS0xOjApe2NbZT4+Ml09MDtwPTB9fWVsc2V7cD0wfWs9KHB8MCk9PTA7ZT1jW2Y+PjJdfDA7ZG97aWYoKGV8MCkhPTApe2lmKChjW2UrMTI+PjJdfDApIT0oY1tlKzE2Pj4yXXwwKSl7aWYoayl7YnJlYWt9ZWxzZXtsPTQ2O2JyZWFrfX1pZighKChvY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDApPT0tMSkpe2lmKGspe2JyZWFrfWVsc2V7bD00NjticmVha319ZWxzZXtjW2Y+PjJdPTA7bD00NDticmVha319ZWxzZXtsPTQ0fX13aGlsZSgwKTtpZigobHwwKT09NDQ/azowKXtsPTQ2fWlmKChsfDApPT00Nil7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT1wO3c9bys0fDA7eD1jW3c+PjJdfDA7Y1t3Pj4yXT14KyAtMTtpZigoeHwwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfWw9Y1tkPj4yXXwwO2NbZD4+Ml09MDtpZigobHwwKT09MCl7aT1uO3JldHVybn1sY1tjW20+PjJdJjI1NV0obCk7aT1uO3JldHVybn14PVhhKDQpfDA7Y1t4Pj4yXT0yMTMwNDt3Yih4fDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBtayhhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gbmsoZSxmLGcsaCxqLGssbCxtLG4sbyxwKXtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDtvPW98MDtwPXB8MDt2YXIgcT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MDt1PWk7aT1pKzU5MnwwO1E9dTtPPXUrMTEyfDA7Rz11KzEyfDA7TT11KzEwMHwwO0o9dSs0MHwwO0s9dSsyNHwwO0w9dSszNnwwO1A9dSs4OHwwO049dSs3NnwwO0g9dSs1MnwwO0k9dSs2NHwwO1Q9dSsxMjB8MDtGPXUrNTIwfDA7dD11KzUyNHwwO3k9dSs1MzZ8MDt4PXUrNTQ4fDA7cz11KzU2MHwwO3c9dSs1NzJ8MDtCPXUrNTg0fDA7Y1tGPj4yXT0wO2NbdCswPj4yXT0wO2NbdCs0Pj4yXT0wO2NbdCs4Pj4yXT0wO2NbeSswPj4yXT0wO2NbeSs0Pj4yXT0wO2NbeSs4Pj4yXT0wO2NbeCswPj4yXT0wO2NbeCs0Pj4yXT0wO2NbeCs4Pj4yXT0wO2NbcyswPj4yXT0wO2Nbcys0Pj4yXT0wO2Nbcys4Pj4yXT0wO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wO2Rve2lmKGcpe2lmKCEoKGNbMzIyOF18MCk9PS0xKSl7Y1tRPj4yXT0xMjkxMjtjW1ErND4+Ml09MjA4O2NbUSs4Pj4yXT0wO2NnKDEyOTEyLFEpfUg9KGNbMTI5MTY+PjJdfDApKyAtMXwwO0U9Y1toKzg+PjJdfDA7aWYoKGNbaCsxMj4+Ml18MCktRT4+Mj4+PjA+SD4+PjA/KEQ9Y1tFKyhIPDwyKT4+Ml18MCwoRHwwKSE9MCk6MCl7bWNbY1soY1tEPj4yXXwwKSs0ND4+Ml0mMTI3XShPLEQpO2NbRj4+Ml09Y1tPPj4yXTttY1tjWyhjW0Q+PjJdfDApKzMyPj4yXSYxMjddKEcsRCk7aWYoKGFbcz4+MF0mMSk9PTApe2FbcysxPj4wXT0wO2Fbcz4+MF09MH1lbHNle2FbY1tzKzg+PjJdPj4wXT0wO2Nbcys0Pj4yXT0wfWlnKHMpO2NbcyswPj4yXT1jW0crMD4+Ml07Y1tzKzQ+PjJdPWNbRys0Pj4yXTtjW3MrOD4+Ml09Y1tHKzg+PjJdO2NbRyswPj4yXT0wO2NbRys0Pj4yXT0wO2NbRys4Pj4yXT0wO21jW2NbKGNbRD4+Ml18MCkrMjg+PjJdJjEyN10oTSxEKTtpZigoYVt4Pj4wXSYxKT09MCl7YVt4KzE+PjBdPTA7YVt4Pj4wXT0wfWVsc2V7YVtjW3grOD4+Ml0+PjBdPTA7Y1t4KzQ+PjJdPTB9aWcoeCk7Y1t4KzA+PjJdPWNbTSswPj4yXTtjW3grND4+Ml09Y1tNKzQ+PjJdO2NbeCs4Pj4yXT1jW00rOD4+Ml07Y1tNKzA+PjJdPTA7Y1tNKzQ+PjJdPTA7Y1tNKzg+PjJdPTA7aD1vY1tjWyhjW0Q+PjJdfDApKzEyPj4yXSYxMjddKEQpfDA7Rz1vY1tjWyhjW0Q+PjJdfDApKzE2Pj4yXSYxMjddKEQpfDA7bWNbY1soY1tEPj4yXXwwKSsyMD4+Ml0mMTI3XShKLEQpO2lmKChhW3Q+PjBdJjEpPT0wKXthW3QrMT4+MF09MDthW3Q+PjBdPTB9ZWxzZXthW2NbdCs4Pj4yXT4+MF09MDtjW3QrND4+Ml09MH1pZyh0KTtjW3QrMD4+Ml09Y1tKKzA+PjJdO2NbdCs0Pj4yXT1jW0orND4+Ml07Y1t0Kzg+PjJdPWNbSis4Pj4yXTtjW0orMD4+Ml09MDtjW0orND4+Ml09MDtjW0orOD4+Ml09MDttY1tjWyhjW0Q+PjJdfDApKzI0Pj4yXSYxMjddKEssRCk7aWYoKGFbeT4+MF0mMSk9PTApe2FbeSsxPj4wXT0wO2FbeT4+MF09MH1lbHNle2FbY1t5Kzg+PjJdPj4wXT0wO2NbeSs0Pj4yXT0wfWlnKHkpO2NbeSswPj4yXT1jW0srMD4+Ml07Y1t5KzQ+PjJdPWNbSys0Pj4yXTtjW3krOD4+Ml09Y1tLKzg+PjJdO2NbSyswPj4yXT0wO2NbSys0Pj4yXT0wO2NbSys4Pj4yXT0wO1Y9b2NbY1soY1tEPj4yXXwwKSszNj4+Ml0mMTI3XShEKXwwO2JyZWFrfWVhPVhhKDQpfDA7Y1tlYT4+Ml09MjEzMDQ7d2IoZWF8MCwyMTM3NiwxOTYpfWVsc2V7aWYoISgoY1szMjEyXXwwKT09LTEpKXtjW1E+PjJdPTEyODQ4O2NbUSs0Pj4yXT0yMDg7Y1tRKzg+PjJdPTA7Y2coMTI4NDgsUSl9Rz0oY1sxMjg1Mj4+Ml18MCkrIC0xfDA7RD1jW2grOD4+Ml18MDtpZigoY1toKzEyPj4yXXwwKS1EPj4yPj4+MD5HPj4+MD8oRT1jW0QrKEc8PDIpPj4yXXwwLChFfDApIT0wKTowKXttY1tjWyhjW0U+PjJdfDApKzQ0Pj4yXSYxMjddKEwsRSk7Y1tGPj4yXT1jW0w+PjJdO21jW2NbKGNbRT4+Ml18MCkrMzI+PjJdJjEyN10oUCxFKTtpZigoYVtzPj4wXSYxKT09MCl7YVtzKzE+PjBdPTA7YVtzPj4wXT0wfWVsc2V7YVtjW3MrOD4+Ml0+PjBdPTA7Y1tzKzQ+PjJdPTB9aWcocyk7Y1tzKzA+PjJdPWNbUCswPj4yXTtjW3MrND4+Ml09Y1tQKzQ+PjJdO2Nbcys4Pj4yXT1jW1ArOD4+Ml07Y1tQKzA+PjJdPTA7Y1tQKzQ+PjJdPTA7Y1tQKzg+PjJdPTA7bWNbY1soY1tFPj4yXXwwKSsyOD4+Ml0mMTI3XShOLEUpO2lmKChhW3g+PjBdJjEpPT0wKXthW3grMT4+MF09MDthW3g+PjBdPTB9ZWxzZXthW2NbeCs4Pj4yXT4+MF09MDtjW3grND4+Ml09MH1pZyh4KTtjW3grMD4+Ml09Y1tOKzA+PjJdO2NbeCs0Pj4yXT1jW04rND4+Ml07Y1t4Kzg+PjJdPWNbTis4Pj4yXTtjW04rMD4+Ml09MDtjW04rND4+Ml09MDtjW04rOD4+Ml09MDtoPW9jW2NbKGNbRT4+Ml18MCkrMTI+PjJdJjEyN10oRSl8MDtHPW9jW2NbKGNbRT4+Ml18MCkrMTY+PjJdJjEyN10oRSl8MDttY1tjWyhjW0U+PjJdfDApKzIwPj4yXSYxMjddKEgsRSk7aWYoKGFbdD4+MF0mMSk9PTApe2FbdCsxPj4wXT0wO2FbdD4+MF09MH1lbHNle2FbY1t0Kzg+PjJdPj4wXT0wO2NbdCs0Pj4yXT0wfWlnKHQpO2NbdCswPj4yXT1jW0grMD4+Ml07Y1t0KzQ+PjJdPWNbSCs0Pj4yXTtjW3QrOD4+Ml09Y1tIKzg+PjJdO2NbSCswPj4yXT0wO2NbSCs0Pj4yXT0wO2NbSCs4Pj4yXT0wO21jW2NbKGNbRT4+Ml18MCkrMjQ+PjJdJjEyN10oSSxFKTtpZigoYVt5Pj4wXSYxKT09MCl7YVt5KzE+PjBdPTA7YVt5Pj4wXT0wfWVsc2V7YVtjW3krOD4+Ml0+PjBdPTA7Y1t5KzQ+PjJdPTB9aWcoeSk7Y1t5KzA+PjJdPWNbSSswPj4yXTtjW3krND4+Ml09Y1tJKzQ+PjJdO2NbeSs4Pj4yXT1jW0krOD4+Ml07Y1tJKzA+PjJdPTA7Y1tJKzQ+PjJdPTA7Y1tJKzg+PjJdPTA7Vj1vY1tjWyhjW0U+PjJdfDApKzM2Pj4yXSYxMjddKEUpfDA7YnJlYWt9ZWE9WGEoNCl8MDtjW2VhPj4yXT0yMTMwNDt3YihlYXwwLDIxMzc2LDE5Nil9fXdoaWxlKDApO2Nbbz4+Ml09Y1tuPj4yXTtKPW0rOHwwO0k9cysxfDA7TD1zKzR8MDttPXMrOHwwO0s9eCsxfDA7SD14KzR8MDtEPXgrOHwwO009KGomNTEyfDApIT0wO1M9eSsxfDA7aj15Kzh8MDtRPXkrNHwwO2c9dysxfDA7RT13Kzh8MDtPPXcrNHwwO049RiszfDA7Uj1uKzR8MDtQPXQrNHwwO1g9VCs0MDB8MDtZPVQ7Wj1UO1U9MDtUPTA7Vz0yMTM7YTp3aGlsZSgxKXtfPWNbZT4+Ml18MDtkb3tpZigoX3wwKSE9MCl7aWYoKGNbXysxMj4+Ml18MCk9PShjW18rMTY+PjJdfDApKXtpZigob2NbY1soY1tfPj4yXXwwKSszNj4+Ml0mMTI3XShfKXwwKT09LTEpe2NbZT4+Ml09MDtfPTA7YnJlYWt9ZWxzZXtfPWNbZT4+Ml18MDticmVha319fWVsc2V7Xz0wfX13aGlsZSgwKTtfPShffDApPT0wO2Rve2lmKChmfDApIT0wKXtpZigoY1tmKzEyPj4yXXwwKSE9KGNbZisxNj4+Ml18MCkpe2lmKF8pe2JyZWFrfWVsc2V7Qz0zNjM7YnJlYWsgYX19aWYoISgob2NbY1soY1tmPj4yXXwwKSszNj4+Ml0mMTI3XShmKXwwKT09LTEpKXtpZighXyl7Qz0zNjM7YnJlYWsgYX19ZWxzZXtDPTc0fX1lbHNle0M9NzR9fXdoaWxlKDApO2lmKChDfDApPT03NCl7Qz0wO2lmKF8pe2Y9MDtDPTM2MzticmVha31lbHNle2Y9MH19Yjpkb3tzd2l0Y2goYVtGK1U+PjBdfDApe2Nhc2UgMjp7aWYoISgoVHwwKSE9MHxVPj4+MDwyKSl7aWYoKFV8MCk9PTIpe189KGFbTj4+MF18MCkhPTB9ZWxzZXtfPTB9aWYoIShNfF8pKXtUPTA7YnJlYWsgYn19JD1hW3k+PjBdfDA7YWE9KCQmMSk9PTA7Xz1hYT9TOmNbaj4+Ml18MDtjOmRve2lmKChVfDApIT0wPyhkW0YrKFUrIC0xKT4+MF18MCk8MjowKXtiYT1fKyhhYT8oJCYyNTUpPj4+MTpjW1E+PjJdfDApfDA7Y2E9Xzt3aGlsZSgxKXtpZigoY2F8MCk9PShiYXwwKSl7YnJlYWt9YWE9YVtjYT4+MF18MDtpZighKGFhPDwyND4+MjQ+LTEpKXtiYT1jYTticmVha31pZigoYlsoY1tKPj4yXXwwKSsoYWE8PDI0Pj4yNDw8MSk+PjFdJjgxOTIpPT0wKXtiYT1jYTticmVha31lbHNle2NhPWNhKzF8MH19YWE9YmEtX3wwO2NhPWFbdz4+MF18MDtkYT0oY2EmMSk9PTA7aWYoZGEpe2VhPShjYSYyNTUpPj4+MX1lbHNle2VhPWNbTz4+Ml18MH1pZighKGFhPj4+MD5lYT4+PjApKXtpZihkYSl7ZGE9KGNhJjI1NSk+Pj4xO2NhPWc7ZWE9ZGE7ZGE9dysoZGEtYWEpKzF8MH1lbHNle2ZhPWNbRT4+Ml18MDtkYT1jW08+PjJdfDA7Y2E9ZmE7ZWE9ZGE7ZGE9ZmErKGRhLWFhKXwwfWFhPWNhK2VhfDA7aWYoKGRhfDApPT0oYWF8MCkpe2FhPWY7Xz1iYTtiYT1mfWVsc2V7Y2E9Xzt3aGlsZSgxKXtpZigoYVtkYT4+MF18MCkhPShhW2NhPj4wXXwwKSl7YWE9ZjtiYT1mO2JyZWFrIGN9ZGE9ZGErMXwwO2lmKChkYXwwKT09KGFhfDApKXthYT1mO189YmE7YmE9ZjticmVha31lbHNle2NhPWNhKzF8MH19fX1lbHNle2FhPWY7YmE9Zn19ZWxzZXthYT1mO2JhPWZ9fXdoaWxlKDApO2Q6d2hpbGUoMSl7aWYoKCQmMSk9PTApe2NhPVM7JD0oJCYyNTUpPj4+MX1lbHNle2NhPWNbaj4+Ml18MDskPWNbUT4+Ml18MH1pZigoX3wwKT09KGNhKyR8MCkpe2JyZWFrfSQ9Y1tlPj4yXXwwO2Rve2lmKCgkfDApIT0wKXtpZigoY1skKzEyPj4yXXwwKT09KGNbJCsxNj4+Ml18MCkpe2lmKChvY1tjWyhjWyQ+PjJdfDApKzM2Pj4yXSYxMjddKCQpfDApPT0tMSl7Y1tlPj4yXT0wOyQ9MDticmVha31lbHNleyQ9Y1tlPj4yXXwwO2JyZWFrfX19ZWxzZXskPTB9fXdoaWxlKDApOyQ9KCR8MCk9PTA7ZG97aWYoKGJhfDApIT0wKXtpZigoY1tiYSsxMj4+Ml18MCkhPShjW2JhKzE2Pj4yXXwwKSl7aWYoJCl7JD1hYTticmVha31lbHNle2JyZWFrIGR9fWlmKCEoKG9jW2NbKGNbYmE+PjJdfDApKzM2Pj4yXSYxMjddKGJhKXwwKT09LTEpKXtpZigkXihhYXwwKT09MCl7JD1hYTtiYT1hYX1lbHNle2JyZWFrIGR9fWVsc2V7YWE9MDtmPTA7Qz0yMzJ9fWVsc2V7Qz0yMzJ9fXdoaWxlKDApO2lmKChDfDApPT0yMzIpe0M9MDtpZigkKXticmVha31lbHNleyQ9YWE7YmE9MH19YWE9Y1tlPj4yXXwwO2NhPWNbYWErMTI+PjJdfDA7aWYoKGNhfDApPT0oY1thYSsxNj4+Ml18MCkpe2FhPW9jW2NbKGNbYWE+PjJdfDApKzM2Pj4yXSYxMjddKGFhKXwwfWVsc2V7YWE9ZFtjYT4+MF18MH1pZighKChhYSYyNTUpPDwyND4+MjQ9PShhW18+PjBdfDApKSl7YnJlYWt9ZGE9Y1tlPj4yXXwwO2NhPWRhKzEyfDA7YWE9Y1tjYT4+Ml18MDtpZigoYWF8MCk9PShjW2RhKzE2Pj4yXXwwKSl7b2NbY1soY1tkYT4+Ml18MCkrNDA+PjJdJjEyN10oZGEpfDB9ZWxzZXtjW2NhPj4yXT1hYSsxfWFhPSQ7JD1hW3k+PjBdfDA7Xz1fKzF8MH1pZihNKXthYT1hW3k+PjBdfDA7aWYoKGFhJjEpPT0wKXskPVM7YWE9KGFhJjI1NSk+Pj4xfWVsc2V7JD1jW2o+PjJdfDA7YWE9Y1tRPj4yXXwwfWlmKChffDApIT0oJCthYXwwKSl7Qz0yNDc7YnJlYWsgYX19YnJlYWt9O2Nhc2UgMDp7Qz05NzticmVha307Y2FzZSAzOntfPWFbeD4+MF18MDthYT0oXyYxKT09MDtpZihhYSl7ZGE9KF8mMjU1KT4+PjF9ZWxzZXtkYT1jW0g+PjJdfDB9JD1hW3M+PjBdfDA7YmE9KCQmMSk9PTA7aWYoYmEpe2NhPSgkJjI1NSk+Pj4xfWVsc2V7Y2E9Y1tMPj4yXXwwfWlmKChkYXwwKSE9KDAtY2F8MCkpe2lmKGFhKXtjYT0oXyYyNTUpPj4+MX1lbHNle2NhPWNbSD4+Ml18MH1pZigoY2F8MCkhPTApe2lmKGJhKXtiYT0oJCYyNTUpPj4+MX1lbHNle2JhPWNbTD4+Ml18MH1pZigoYmF8MCkhPTApe2FhPWNbZT4+Ml18MDtiYT1jW2FhKzEyPj4yXXwwO2NhPWNbYWErMTY+PjJdfDA7aWYoKGJhfDApPT0oY2F8MCkpeyQ9b2NbY1soY1thYT4+Ml18MCkrMzY+PjJdJjEyN10oYWEpfDA7Y2E9Y1tlPj4yXXwwO189YVt4Pj4wXXwwO2FhPWNhO2JhPWNbY2ErMTI+PjJdfDA7Y2E9Y1tjYSsxNj4+Ml18MH1lbHNleyQ9ZFtiYT4+MF18MH1kYT1hYSsxMnwwO2NhPShiYXwwKT09KGNhfDApO2lmKCgkJjI1NSk8PDI0Pj4yND09KGFbKChfJjEpPT0wP0s6Y1tEPj4yXXwwKT4+MF18MCkpe2lmKGNhKXtvY1tjWyhjW2FhPj4yXXwwKSs0MD4+Ml0mMTI3XShhYSl8MH1lbHNle2NbZGE+PjJdPWJhKzF9Xz1hW3g+PjBdfDA7aWYoKF8mMSk9PTApe189KF8mMjU1KT4+PjF9ZWxzZXtfPWNbSD4+Ml18MH1UPV8+Pj4wPjE/eDpUO2JyZWFrIGJ9aWYoY2Epe189b2NbY1soY1thYT4+Ml18MCkrMzY+PjJdJjEyN10oYWEpfDB9ZWxzZXtfPWRbYmE+PjBdfDB9aWYoISgoXyYyNTUpPDwyND4+MjQ9PShhWygoYVtzPj4wXSYxKT09MD9JOmNbbT4+Ml18MCk+PjBdfDApKSl7Qz0xOTY7YnJlYWsgYX1hYT1jW2U+PjJdfDA7Xz1hYSsxMnwwOyQ9Y1tfPj4yXXwwO2lmKCgkfDApPT0oY1thYSsxNj4+Ml18MCkpe29jW2NbKGNbYWE+PjJdfDApKzQwPj4yXSYxMjddKGFhKXwwfWVsc2V7Y1tfPj4yXT0kKzF9YVtsPj4wXT0xO189YVtzPj4wXXwwO2lmKChfJjEpPT0wKXtfPShfJjI1NSk+Pj4xfWVsc2V7Xz1jW0w+PjJdfDB9VD1fPj4+MD4xP3M6VDticmVhayBifX1pZihhYSl7YWE9KF8mMjU1KT4+PjF9ZWxzZXthYT1jW0g+PjJdfDB9YmE9Y1tlPj4yXXwwO2NhPWNbYmErMTI+PjJdfDA7ZGE9KGNhfDApPT0oY1tiYSsxNj4+Ml18MCk7aWYoKGFhfDApPT0wKXtpZihkYSl7Xz1vY1tjWyhjW2JhPj4yXXwwKSszNj4+Ml0mMTI3XShiYSl8MDskPWFbcz4+MF18MH1lbHNle189ZFtjYT4+MF18MH1pZighKChfJjI1NSk8PDI0Pj4yND09KGFbKCgkJjEpPT0wP0k6Y1ttPj4yXXwwKT4+MF18MCkpKXticmVhayBifWFhPWNbZT4+Ml18MDtfPWFhKzEyfDA7JD1jW18+PjJdfDA7aWYoKCR8MCk9PShjW2FhKzE2Pj4yXXwwKSl7b2NbY1soY1thYT4+Ml18MCkrNDA+PjJdJjEyN10oYWEpfDB9ZWxzZXtjW18+PjJdPSQrMX1hW2w+PjBdPTE7Xz1hW3M+PjBdfDA7aWYoKF8mMSk9PTApe189KF8mMjU1KT4+PjF9ZWxzZXtfPWNbTD4+Ml18MH1UPV8+Pj4wPjE/czpUO2JyZWFrIGJ9aWYoZGEpeyQ9b2NbY1soY1tiYT4+Ml18MCkrMzY+PjJdJjEyN10oYmEpfDA7Xz1hW3g+PjBdfDB9ZWxzZXskPWRbY2E+PjBdfDB9aWYoISgoJCYyNTUpPDwyND4+MjQ9PShhWygoXyYxKT09MD9LOmNbRD4+Ml18MCk+PjBdfDApKSl7YVtsPj4wXT0xO2JyZWFrIGJ9Xz1jW2U+PjJdfDA7JD1fKzEyfDA7YWE9Y1skPj4yXXwwO2lmKChhYXwwKT09KGNbXysxNj4+Ml18MCkpe29jW2NbKGNbXz4+Ml18MCkrNDA+PjJdJjEyN10oXyl8MH1lbHNle2NbJD4+Ml09YWErMX1fPWFbeD4+MF18MDtpZigoXyYxKT09MCl7Xz0oXyYyNTUpPj4+MX1lbHNle189Y1tIPj4yXXwwfVQ9Xz4+PjA+MT94OlR9YnJlYWt9O2Nhc2UgNDp7Xz0wO2U6d2hpbGUoMSl7JD1jW2U+PjJdfDA7ZG97aWYoKCR8MCkhPTApe2lmKChjWyQrMTI+PjJdfDApPT0oY1skKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbJD4+Ml18MCkrMzY+PjJdJjEyN10oJCl8MCk9PS0xKXtjW2U+PjJdPTA7JD0wO2JyZWFrfWVsc2V7JD1jW2U+PjJdfDA7YnJlYWt9fX1lbHNleyQ9MH19d2hpbGUoMCk7JD0oJHwwKT09MDtkb3tpZigoZnwwKSE9MCl7aWYoKGNbZisxMj4+Ml18MCkhPShjW2YrMTY+PjJdfDApKXtpZigkKXticmVha31lbHNle2JyZWFrIGV9fWlmKCEoKG9jW2NbKGNbZj4+Ml18MCkrMzY+PjJdJjEyN10oZil8MCk9PS0xKSl7aWYoISQpe2JyZWFrIGV9fWVsc2V7Qz0yNTl9fWVsc2V7Qz0yNTl9fXdoaWxlKDApO2lmKChDfDApPT0yNTkpe0M9MDtpZigkKXtmPTA7YnJlYWt9ZWxzZXtmPTB9fSQ9Y1tlPj4yXXwwO2FhPWNbJCsxMj4+Ml18MDtpZigoYWF8MCk9PShjWyQrMTY+PjJdfDApKXthYT1vY1tjWyhjWyQ+PjJdfDApKzM2Pj4yXSYxMjddKCQpfDB9ZWxzZXthYT1kW2FhPj4wXXwwfSQ9YWEmMjU1O2lmKCQ8PDI0Pj4yND4tMT8hKChiWyhjW0o+PjJdfDApKyhhYTw8MjQ+PjI0PDwxKT4+MV0mMjA0OCk9PTApOjApe2FhPWNbbz4+Ml18MDtpZigoYWF8MCk9PShwfDApKXtiYT0oY1tSPj4yXXwwKSE9MjEzO2NhPWNbbj4+Ml18MDthYT1wLWNhfDA7cD1hYT4+PjA8MjE0NzQ4MzY0Nz9hYTw8MTotMTtjYT13bihiYT9jYTowLHApfDA7aWYoKGNhfDApPT0wKXtDPTI2ODticmVhayBhfWlmKCFiYSl7YmE9Y1tuPj4yXXwwO2Nbbj4+Ml09Y2E7aWYoKGJhfDApIT0wKXtsY1tjW1I+PjJdJjI1NV0oYmEpO2NhPWNbbj4+Ml18MH19ZWxzZXtjW24+PjJdPWNhfWNbUj4+Ml09MjE0O2FhPWNhK2FhfDA7Y1tvPj4yXT1hYTtwPShjW24+PjJdfDApK3B8MH1jW28+PjJdPWFhKzE7YVthYT4+MF09JDtfPV8rMXwwfWVsc2V7YWE9YVt0Pj4wXXwwO2lmKChhYSYxKT09MCl7YWE9KGFhJjI1NSk+Pj4xfWVsc2V7YWE9Y1tQPj4yXXwwfWlmKCEoKCgoYWF8MCk9PTB8KF98MCk9PTApXjEpJiQ8PDI0Pj4yND09Rzw8MjQ+PjI0KSl7YnJlYWt9aWYoKFl8MCk9PShYfDApKXtZPVktWnwwO1g9WT4+PjA8MjE0NzQ4MzY0Nz9ZPDwxOi0xO2lmKChXfDApPT0yMTMpe1o9MH1XPXduKFosWCl8MDtpZigoV3wwKT09MCl7Qz0yODU7YnJlYWsgYX1aPVc7WD1XKyhYPj4+Mjw8Mil8MDtZPVcrKFk+PjI8PDIpfDA7Vz0yMTR9Y1tZPj4yXT1fO1k9WSs0fDA7Xz0wfSQ9Y1tlPj4yXXwwO2FhPSQrMTJ8MDtiYT1jW2FhPj4yXXwwO2lmKChiYXwwKT09KGNbJCsxNj4+Ml18MCkpe29jW2NbKGNbJD4+Ml18MCkrNDA+PjJdJjEyN10oJCl8MDtjb250aW51ZX1lbHNle2NbYWE+PjJdPWJhKzE7Y29udGludWV9fWlmKCEoKFp8MCk9PShZfDApfChffDApPT0wKSl7aWYoKFl8MCk9PShYfDApKXtZPVktWnwwO1g9WT4+PjA8MjE0NzQ4MzY0Nz9ZPDwxOi0xO2lmKChXfDApPT0yMTMpe1o9MH1XPXduKFosWCl8MDtpZigoV3wwKT09MCl7Qz0yOTc7YnJlYWsgYX1aPVc7WD1XKyhYPj4+Mjw8Mil8MDtZPVcrKFk+PjI8PDIpfDA7Vz0yMTR9Y1tZPj4yXT1fO1k9WSs0fDB9aWYoKFZ8MCk+MCl7Xz1jW2U+PjJdfDA7ZG97aWYoKF98MCkhPTApe2lmKChjW18rMTI+PjJdfDApPT0oY1tfKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbXz4+Ml18MCkrMzY+PjJdJjEyN10oXyl8MCk9PS0xKXtjW2U+PjJdPTA7Xz0wO2JyZWFrfWVsc2V7Xz1jW2U+PjJdfDA7YnJlYWt9fX1lbHNle189MH19d2hpbGUoMCk7Xz0oX3wwKT09MDtkb3tpZigoZnwwKSE9MCl7aWYoKGNbZisxMj4+Ml18MCkhPShjW2YrMTY+PjJdfDApKXtpZihfKXticmVha31lbHNle0M9MzE5O2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbZj4+Ml18MCkrMzY+PjJdJjEyN10oZil8MCk9PS0xKSl7aWYoIV8pe0M9MzE5O2JyZWFrIGF9fWVsc2V7Qz0zMTN9fWVsc2V7Qz0zMTN9fXdoaWxlKDApO2lmKChDfDApPT0zMTMpe0M9MDtpZihfKXtDPTMxOTticmVhayBhfWVsc2V7Zj0wfX1fPWNbZT4+Ml18MDskPWNbXysxMj4+Ml18MDtpZigoJHwwKT09KGNbXysxNj4+Ml18MCkpe189b2NbY1soY1tfPj4yXXwwKSszNj4+Ml0mMTI3XShfKXwwfWVsc2V7Xz1kWyQ+PjBdfDB9aWYoISgoXyYyNTUpPDwyND4+MjQ9PWg8PDI0Pj4yNCkpe0M9MzE5O2JyZWFrIGF9Xz1jW2U+PjJdfDA7JD1fKzEyfDA7YWE9Y1skPj4yXXwwO2lmKChhYXwwKT09KGNbXysxNj4+Ml18MCkpe29jW2NbKGNbXz4+Ml18MCkrNDA+PjJdJjEyN10oXyl8MDthYT1mOyQ9Zn1lbHNle2NbJD4+Ml09YWErMTthYT1mOyQ9Zn13aGlsZSgxKXtfPWNbZT4+Ml18MDtkb3tpZigoX3wwKSE9MCl7aWYoKGNbXysxMj4+Ml18MCk9PShjW18rMTY+PjJdfDApKXtpZigob2NbY1soY1tfPj4yXXwwKSszNj4+Ml0mMTI3XShfKXwwKT09LTEpe2NbZT4+Ml09MDtfPTA7YnJlYWt9ZWxzZXtfPWNbZT4+Ml18MDticmVha319fWVsc2V7Xz0wfX13aGlsZSgwKTtiYT0oX3wwKT09MDtkb3tpZigoJHwwKSE9MCl7aWYoKGNbJCsxMj4+Ml18MCkhPShjWyQrMTY+PjJdfDApKXtpZihiYSl7Xz1hYTticmVha31lbHNle0M9MzQxO2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbJD4+Ml18MCkrMzY+PjJdJjEyN10oJCl8MCk9PS0xKSl7aWYoYmFeKGFhfDApPT0wKXtfPWFhOyQ9YWF9ZWxzZXtDPTM0MTticmVhayBhfX1lbHNle189MDtmPTA7Qz0zMzR9fWVsc2V7Xz1hYTtDPTMzNH19d2hpbGUoMCk7aWYoKEN8MCk9PTMzNCl7Qz0wO2lmKGJhKXtDPTM0MTticmVhayBhfWVsc2V7JD0wfX1hYT1jW2U+PjJdfDA7YmE9Y1thYSsxMj4+Ml18MDtpZigoYmF8MCk9PShjW2FhKzE2Pj4yXXwwKSl7YWE9b2NbY1soY1thYT4+Ml18MCkrMzY+PjJdJjEyN10oYWEpfDB9ZWxzZXthYT1kW2JhPj4wXXwwfWlmKCEoKGFhJjI1NSk8PDI0Pj4yND4tMSkpe0M9MzQxO2JyZWFrIGF9aWYoKGJbKGNbSj4+Ml18MCkrKGFhPDwyND4+MjQ8PDEpPj4xXSYyMDQ4KT09MCl7Qz0zNDE7YnJlYWsgYX1hYT1jW28+PjJdfDA7aWYoKGFhfDApPT0ocHwwKSl7YmE9KGNbUj4+Ml18MCkhPTIxMztjYT1jW24+PjJdfDA7YWE9cC1jYXwwO3A9YWE+Pj4wPDIxNDc0ODM2NDc/YWE8PDE6LTE7Y2E9d24oYmE/Y2E6MCxwKXwwO2lmKChjYXwwKT09MCl7Qz0zNDQ7YnJlYWsgYX1kb3tpZihiYSl7Y1tuPj4yXT1jYX1lbHNle2JhPWNbbj4+Ml18MDtjW24+PjJdPWNhO2lmKChiYXwwKT09MCl7YnJlYWt9bGNbY1tSPj4yXSYyNTVdKGJhKTtjYT1jW24+PjJdfDB9fXdoaWxlKDApO2NbUj4+Ml09MjE0O2FhPWNhK2FhfDA7Y1tvPj4yXT1hYTtwPShjW24+PjJdfDApK3B8MH1jYT1jW2U+PjJdfDA7YmE9Y1tjYSsxMj4+Ml18MDtpZigoYmF8MCk9PShjW2NhKzE2Pj4yXXwwKSl7YmE9b2NbY1soY1tjYT4+Ml18MCkrMzY+PjJdJjEyN10oY2EpfDA7YWE9Y1tvPj4yXXwwfWVsc2V7YmE9ZFtiYT4+MF18MH1jW28+PjJdPWFhKzE7YVthYT4+MF09YmE7Vj1WKyAtMXwwO2NhPWNbZT4+Ml18MDthYT1jYSsxMnwwO2JhPWNbYWE+PjJdfDA7aWYoKGJhfDApPT0oY1tjYSsxNj4+Ml18MCkpe29jW2NbKGNbY2E+PjJdfDApKzQwPj4yXSYxMjddKGNhKXwwfWVsc2V7Y1thYT4+Ml09YmErMX1pZigoVnwwKT4wKXthYT1ffWVsc2V7YnJlYWt9fX1pZigoY1tvPj4yXXwwKT09KGNbbj4+Ml18MCkpe0M9MzYxO2JyZWFrIGF9YnJlYWt9O2Nhc2UgMTp7aWYoKFV8MCk9PTMpe0M9MzYzO2JyZWFrIGF9Qz1jW2U+PjJdfDA7Xz1jW0MrMTI+PjJdfDA7aWYoKF98MCk9PShjW0MrMTY+PjJdfDApKXtDPW9jW2NbKGNbQz4+Ml18MCkrMzY+PjJdJjEyN10oQyl8MH1lbHNle0M9ZFtfPj4wXXwwfWlmKCEoKEMmMjU1KTw8MjQ+PjI0Pi0xKSl7Qz05NjticmVhayBhfWlmKChiWyhjW0o+PjJdfDApKyhDPDwyND4+MjQ8PDEpPj4xXSY4MTkyKT09MCl7Qz05NjticmVhayBhfUM9Y1tlPj4yXXwwOyQ9QysxMnwwO189Y1skPj4yXXwwO2lmKChffDApPT0oY1tDKzE2Pj4yXXwwKSl7Qz1vY1tjWyhjW0M+PjJdfDApKzQwPj4yXSYxMjddKEMpfDB9ZWxzZXtjWyQ+PjJdPV8rMTtDPWRbXz4+MF18MH1fPUMmMjU1OyQ9YVt3Pj4wXXwwO0M9KCQmMSkhPTA7aWYoQyl7YWE9KGNbdz4+Ml0mLTIpKyAtMXwwOyQ9Y1tPPj4yXXwwfWVsc2V7YWE9MTA7JD0oJCYyNTUpPj4+MX1pZigoJHwwKT09KGFhfDApKXtsZyh3LGFhLDEsYWEsYWEsMCk7aWYoKGFbdz4+MF0mMSk9PTApe0M9OTN9ZWxzZXtDPTk0fX1lbHNle2lmKEMpe0M9OTR9ZWxzZXtDPTkzfX1pZigoQ3wwKT09OTMpe2Fbdz4+MF09KCQ8PDEpKzI7YmE9ZzthYT0kKzF8MH1lbHNlIGlmKChDfDApPT05NCl7YmE9Y1tFPj4yXXwwO2FhPSQrMXwwO2NbTz4+Ml09YWF9YVtiYSskPj4wXT1fO2FbYmErYWE+PjBdPTA7Qz05NzticmVha307ZGVmYXVsdDp7fX19d2hpbGUoMCk7Zjpkb3tpZigoQ3wwKT09OTcpe0M9MDtpZigoVXwwKT09Myl7Qz0zNjM7YnJlYWsgYX1lbHNle2FhPWY7JD1mfXdoaWxlKDEpe189Y1tlPj4yXXwwO2Rve2lmKChffDApIT0wKXtpZigoY1tfKzEyPj4yXXwwKT09KGNbXysxNj4+Ml18MCkpe2lmKChvY1tjWyhjW18+PjJdfDApKzM2Pj4yXSYxMjddKF8pfDApPT0tMSl7Y1tlPj4yXT0wO189MDticmVha31lbHNle189Y1tlPj4yXXwwO2JyZWFrfX19ZWxzZXtfPTB9fXdoaWxlKDApO2JhPShffDApPT0wO2Rve2lmKCgkfDApIT0wKXtpZigoY1skKzEyPj4yXXwwKSE9KGNbJCsxNj4+Ml18MCkpe2lmKGJhKXtfPWFhO2JyZWFrfWVsc2V7YnJlYWsgZn19aWYoISgob2NbY1soY1skPj4yXXwwKSszNj4+Ml0mMTI3XSgkKXwwKT09LTEpKXtpZihiYV4oYWF8MCk9PTApe189YWE7JD1hYX1lbHNle2JyZWFrIGZ9fWVsc2V7Xz0wO2Y9MDtDPTEwOX19ZWxzZXtfPWFhO0M9MTA5fX13aGlsZSgwKTtpZigoQ3wwKT09MTA5KXtDPTA7aWYoYmEpe2JyZWFrIGZ9ZWxzZXskPTB9fWJhPWNbZT4+Ml18MDthYT1jW2JhKzEyPj4yXXwwO2lmKChhYXwwKT09KGNbYmErMTY+PjJdfDApKXthYT1vY1tjWyhjW2JhPj4yXXwwKSszNj4+Ml0mMTI3XShiYSl8MH1lbHNle2FhPWRbYWE+PjBdfDB9aWYoISgoYWEmMjU1KTw8MjQ+PjI0Pi0xKSl7YnJlYWsgZn1pZigoYlsoY1tKPj4yXXwwKSsoYWE8PDI0Pj4yNDw8MSk+PjFdJjgxOTIpPT0wKXticmVhayBmfWJhPWNbZT4+Ml18MDtDPWJhKzEyfDA7YWE9Y1tDPj4yXXwwO2lmKChhYXwwKT09KGNbYmErMTY+PjJdfDApKXtDPW9jW2NbKGNbYmE+PjJdfDApKzQwPj4yXSYxMjddKGJhKXwwfWVsc2V7Y1tDPj4yXT1hYSsxO0M9ZFthYT4+MF18MH1hYT1DJjI1NTtiYT1hW3c+PjBdfDA7Y2E9KGJhJjEpIT0wO2lmKGNhKXtDPShjW3c+PjJdJi0yKSsgLTF8MDtiYT1jW08+PjJdfDB9ZWxzZXtDPTEwO2JhPShiYSYyNTUpPj4+MX1pZigoYmF8MCk9PShDfDApKXtsZyh3LEMsMSxDLEMsMCk7aWYoKGFbdz4+MF0mMSk9PTApe0M9MTI2fWVsc2V7Qz0xMjd9fWVsc2V7aWYoY2Epe0M9MTI3fWVsc2V7Qz0xMjZ9fWlmKChDfDApPT0xMjYpe0M9MDthW3c+PjBdPShiYTw8MSkrMjtjYT1nO2RhPWJhKzF8MH1lbHNlIGlmKChDfDApPT0xMjcpe0M9MDtjYT1jW0U+PjJdfDA7ZGE9YmErMXwwO2NbTz4+Ml09ZGF9YVtjYStiYT4+MF09YWE7YVtjYStkYT4+MF09MDthYT1ffX19d2hpbGUoMCk7VT1VKzF8MDtpZighKFU+Pj4wPDQpKXtDPTM2MzticmVha319Zzpzd2l0Y2goQ3wwKXtjYXNlIDk2OntjW2s+PjJdPWNbaz4+Ml18NDtlPTA7WT1aO2JyZWFrfTtjYXNlIDE5Njp7Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVha307Y2FzZSAyNDc6e2Nbaz4+Ml09Y1trPj4yXXw0O2U9MDtZPVo7YnJlYWt9O2Nhc2UgMjY4OntmYT1YYSg0KXwwO2NbZmE+PjJdPTIyNjgwO3diKGZhfDAsMjI3MjgsMjA2KX07Y2FzZSAyODU6e2ZhPVhhKDQpfDA7Y1tmYT4+Ml09MjI2ODA7d2IoZmF8MCwyMjcyOCwyMDYpfTtjYXNlIDI5Nzp7ZmE9WGEoNCl8MDtjW2ZhPj4yXT0yMjY4MDt3YihmYXwwLDIyNzI4LDIwNil9O2Nhc2UgMzE5OntjW2s+PjJdPWNbaz4+Ml18NDtlPTA7WT1aO2JyZWFrfTtjYXNlIDM0MTp7Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVha307Y2FzZSAzNDQ6e2ZhPVhhKDQpfDA7Y1tmYT4+Ml09MjI2ODA7d2IoZmF8MCwyMjcyOCwyMDYpfTtjYXNlIDM2MTp7Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVha307Y2FzZSAzNjM6e2g6ZG97aWYoKFR8MCkhPTApe0Y9VCsxfDA7bj1UKzh8MDtsPVQrNHwwO289MTtpOndoaWxlKDEpe2g9YVtUPj4wXXwwO2lmKChoJjEpPT0wKXtoPShoJjI1NSk+Pj4xfWVsc2V7aD1jW2w+PjJdfDB9aWYoIShvPj4+MDxoPj4+MCkpe2JyZWFrIGh9aD1jW2U+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKChjW2grMTI+PjJdfDApPT0oY1toKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MCk9PS0xKXtjW2U+PjJdPTA7aD0wO2JyZWFrfWVsc2V7aD1jW2U+PjJdfDA7YnJlYWt9fX1lbHNle2g9MH19d2hpbGUoMCk7aD0oaHwwKT09MDtkb3tpZigoZnwwKSE9MCl7aWYoKGNbZisxMj4+Ml18MCkhPShjW2YrMTY+PjJdfDApKXtpZihoKXticmVha31lbHNle2JyZWFrIGl9fWlmKCEoKG9jW2NbKGNbZj4+Ml18MCkrMzY+PjJdJjEyN10oZil8MCk9PS0xKSl7aWYoIWgpe2JyZWFrIGl9fWVsc2V7Qz0zODB9fWVsc2V7Qz0zODB9fXdoaWxlKDApO2lmKChDfDApPT0zODApe0M9MDtpZihoKXticmVha31lbHNle2Y9MH19aD1jW2U+PjJdfDA7Rz1jW2grMTI+PjJdfDA7aWYoKEd8MCk9PShjW2grMTY+PjJdfDApKXtoPW9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MH1lbHNle2g9ZFtHPj4wXXwwfWlmKChhW1Q+PjBdJjEpPT0wKXtHPUZ9ZWxzZXtHPWNbbj4+Ml18MH1pZighKChoJjI1NSk8PDI0Pj4yND09KGFbRytvPj4wXXwwKSkpe2JyZWFrfW89bysxfDA7aD1jW2U+PjJdfDA7Rz1oKzEyfDA7SD1jW0c+PjJdfDA7aWYoKEh8MCk9PShjW2grMTY+PjJdfDApKXtvY1tjWyhjW2g+PjJdfDApKzQwPj4yXSYxMjddKGgpfDA7Y29udGludWV9ZWxzZXtjW0c+PjJdPUgrMTtjb250aW51ZX19Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVhayBnfX13aGlsZSgwKTtpZigoWnwwKSE9KFl8MCkpe2NbQj4+Ml09MDtxayh0LFosWSxCKTtpZigoY1tCPj4yXXwwKT09MCl7ZT0xO1k9Wn1lbHNle2Nbaz4+Ml09Y1trPj4yXXw0O2U9MDtZPVp9fWVsc2V7ZT0xfWJyZWFrfX1pZighKChhW3c+PjBdJjEpPT0wKT8odj1jW0U+PjJdfDAsKHZ8MCkhPTApOjApe3ZuKHYpfWlmKCEoKGFbcz4+MF0mMSk9PTApPyh6PWNbbT4+Ml18MCwoenwwKSE9MCk6MCl7dm4oeil9aWYoISgoYVt4Pj4wXSYxKT09MCk/KEE9Y1tEPj4yXXwwLChBfDApIT0wKTowKXt2bihBKX1pZighKChhW3k+PjBdJjEpPT0wKT8ocj1jW2o+PjJdfDAsKHJ8MCkhPTApOjApe3ZuKHIpfWlmKCEoKGFbdD4+MF0mMSk9PTApPyhxPWNbdCs4Pj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1pZigoWXwwKT09MCl7aT11O3JldHVybiBlfDB9bGNbVyYyNTVdKFkpO2k9dTtyZXR1cm4gZXwwfWZ1bmN0aW9uIG9rKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wO2Q9WGEoOCl8MDtjW2Q+PjJdPTk5Mjg7Yj1KbihhfDApfDA7ZT1iKzEzfDA7ZT0oZXwwKT09MD8xOmU7d2hpbGUoMSl7Zz11bihlKXwwO2lmKChnfDApIT0wKXtmPTc7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2JyZWFrfXNjW2cmMzFdKCl9aWYoKGZ8MCk9PTcpe2NbZys0Pj4yXT1iO2NbZz4+Ml09YjtmPWcrMTJ8MDtjW2QrND4+Ml09ZjtjW2crOD4+Ml09MDtMbihmfDAsYXwwLGIrMXwwKXwwO3diKGR8MCwxMDA2NCwxMDYpfWc9WGEoNCl8MDtjW2c+PjJdPTIyNjgwO3diKGd8MCwyMjcyOCwyMDYpfWZ1bmN0aW9uIHBrKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDttPWk7aT1pKzEyOHwwO3A9bTtzPW0rMjh8MDtkPW0rMTZ8MDtxPW0rMTJ8MDt0PW0rMjR8MDtjW2Q+PjJdPXM7bD1kKzR8MDtjW2w+PjJdPTIxMztzPXMrMTAwfDA7bj1jW2grMjg+PjJdfDA7dT1uKzR8MDtjW3U+PjJdPShjW3U+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW3A+PjJdPTEzNDU2O2NbcCs0Pj4yXT0yMDg7Y1twKzg+PjJdPTA7Y2coMTM0NTYscCl9cD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7dT1jW24rOD4+Ml18MDtpZigoY1tuKzEyPj4yXXwwKS11Pj4yPj4+MD5wPj4+MD8ocj1jW3UrKHA8PDIpPj4yXXwwLChyfDApIT0wKTowKXthW3Q+PjBdPTA7cD1jW2Y+PjJdfDA7ZG97aWYobmsoZSxwLGcsbixjW2grND4+Ml18MCxqLHQscixkLHEscyl8MCl7aWYoKGFbaz4+MF0mMSk9PTApe2FbaysxPj4wXT0wO2Fbaz4+MF09MH1lbHNle2FbY1trKzg+PjJdPj4wXT0wO2Nbays0Pj4yXT0wfWlmKChhW3Q+PjBdfDApIT0wKXtnPXhjW2NbKGNbcj4+Ml18MCkrMjg+PjJdJjYzXShyLDQ1KXwwO2g9YVtrPj4wXXwwO289KGgmMSkhPTA7aWYobyl7cz0oY1trPj4yXSYtMikrIC0xfDA7aD1jW2srND4+Ml18MH1lbHNle3M9MTA7aD0oaCYyNTUpPj4+MX1pZigoaHwwKT09KHN8MCkpe2xnKGsscywxLHMscywwKTtpZigoYVtrPj4wXSYxKT09MCl7bz0yMX1lbHNle289MjJ9fWVsc2V7aWYobyl7bz0yMn1lbHNle289MjF9fWlmKChvfDApPT0yMSl7YVtrPj4wXT0oaDw8MSkrMjtzPWsrMXwwO3Q9aCsxfDB9ZWxzZSBpZigob3wwKT09MjIpe3M9Y1trKzg+PjJdfDA7dD1oKzF8MDtjW2srND4+Ml09dH1hW3MraD4+MF09ZzthW3MrdD4+MF09MH1yPXhjW2NbKGNbcj4+Ml18MCkrMjg+PjJdJjYzXShyLDQ4KXwwO2g9Y1tkPj4yXXwwO3E9Y1txPj4yXXwwO2c9cSsgLTF8MDthOmRve2lmKGg+Pj4wPGc+Pj4wKXt3aGlsZSgxKXtzPWgrMXwwO2lmKCEoKGFbaD4+MF18MCk9PXI8PDI0Pj4yNCkpe2JyZWFrIGF9aWYocz4+PjA8Zz4+PjApe2g9c31lbHNle2g9czticmVha319fX13aGlsZSgwKTtzPWg7cj1hW2s+PjBdfDA7aWYoKHImMSk9PTApe3Q9cjt1PTEwO3I9KHImMjU1KT4+PjF9ZWxzZXt1PWNbaz4+Ml18MDt0PXUmMjU1O3U9KHUmLTIpKyAtMXwwO3I9Y1trKzQ+PjJdfDB9Zz1xLXN8MDtpZigocXwwKSE9KGh8MCkpe2lmKCh1LXJ8MCk+Pj4wPGc+Pj4wKXtsZyhrLHUscitnLXV8MCxyLHIsMCk7dD1hW2s+PjBdfDB9aWYoKHQmMSk9PTApe3Q9aysxfDB9ZWxzZXt0PWNbays4Pj4yXXwwfXM9cSsoci1zKXwwO3U9dCtyfDA7d2hpbGUoMSl7YVt1Pj4wXT1hW2g+PjBdfDA7aD1oKzF8MDtpZigoaHwwKT09KHF8MCkpe2JyZWFrfXU9dSsxfDB9YVt0K3M+PjBdPTA7cT1yK2d8MDtpZigoYVtrPj4wXSYxKT09MCl7YVtrPj4wXT1xPDwxO2JyZWFrfWVsc2V7Y1trKzQ+PjJdPXE7YnJlYWt9fX19d2hpbGUoMCk7az1jW2U+PjJdfDA7aWYoKGt8MCkhPTApe2lmKChjW2srMTI+PjJdfDApPT0oY1trKzE2Pj4yXXwwKT8ob2NbY1soY1trPj4yXXwwKSszNj4+Ml0mMTI3XShrKXwwKT09LTE6MCl7Y1tlPj4yXT0wO2s9MH19ZWxzZXtrPTB9ZT0oa3wwKT09MDtkb3tpZigocHwwKSE9MCl7aWYoKGNbcCsxMj4+Ml18MCkhPShjW3ArMTY+PjJdfDApKXtpZihlKXticmVha31lbHNle289NTc7YnJlYWt9fWlmKCEoKG9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MCk9PS0xKSl7aWYoZSl7YnJlYWt9ZWxzZXtvPTU3O2JyZWFrfX1lbHNle2NbZj4+Ml09MDtvPTU1O2JyZWFrfX1lbHNle289NTV9fXdoaWxlKDApO2lmKChvfDApPT01NT9lOjApe289NTd9aWYoKG98MCk9PTU3KXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPWs7dD1uKzR8MDt1PWNbdD4+Ml18MDtjW3Q+PjJdPXUrIC0xO2lmKCh1fDApPT0wKXtsY1tjWyhjW24+PjJdfDApKzg+PjJdJjI1NV0obil9aj1jW2Q+PjJdfDA7Y1tkPj4yXT0wO2lmKChqfDApPT0wKXtpPW07cmV0dXJufWxjW2NbbD4+Ml0mMjU1XShqKTtpPW07cmV0dXJufXU9WGEoNCl8MDtjW3U+PjJdPTIxMzA0O3diKHV8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHFrKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTA7Zz1pO2s9YVtiPj4wXXwwO2lmKChrJjEpPT0wKXtqPShrJjI1NSk+Pj4xfWVsc2V7aj1jW2IrND4+Ml18MH1pZigoanwwKT09MCl7aT1nO3JldHVybn1pZigoZHwwKSE9KGV8MCk/KGg9ZSsgLTR8MCxoPj4+MD5kPj4+MCk6MCl7aj1kO2Rve2s9Y1tqPj4yXXwwO2Nbaj4+Ml09Y1toPj4yXTtjW2g+PjJdPWs7aj1qKzR8MDtoPWgrIC00fDB9d2hpbGUoaj4+PjA8aD4+PjApO2s9YVtiPj4wXXwwfWlmKChrJjEpPT0wKXtoPWIrMXwwO2I9KGsmMjU1KT4+PjF9ZWxzZXtoPWNbYis4Pj4yXXwwO2I9Y1tiKzQ+PjJdfDB9ZT1lKyAtNHwwO2s9YVtoPj4wXXwwO2o9azw8MjQ+PjI0PDF8azw8MjQ+PjI0PT0xMjc7YTpkb3tpZihlPj4+MD5kPj4+MCl7Yj1oK2J8MDt3aGlsZSgxKXtpZighaj8oazw8MjQ+PjI0fDApIT0oY1tkPj4yXXwwKTowKXticmVha31oPShiLWh8MCk+MT9oKzF8MDpoO2Q9ZCs0fDA7az1hW2g+PjBdfDA7aj1rPDwyND4+MjQ8MXxrPDwyND4+MjQ9PTEyNztpZighKGQ+Pj4wPGU+Pj4wKSl7YnJlYWsgYX19Y1tmPj4yXT00O2k9ZztyZXR1cm59fXdoaWxlKDApO2lmKGope2k9ZztyZXR1cm59aj1jW2U+PjJdfDA7aWYoIShrPDwyND4+MjQ+Pj4wPGo+Pj4wfChqfDApPT0wKSl7aT1nO3JldHVybn1jW2Y+PjJdPTQ7aT1nO3JldHVybn1mdW5jdGlvbiByayhhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBzayhhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gdGsoYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wO249aTtpPWkrNTc2fDA7cT1uO3Y9bisyNHwwO2Q9bisxNnwwO3I9bis0NjR8MDt1PW4rNTY4fDA7cz1uKzQyNHwwO3A9bis0Njh8MDtjW2Q+PjJdPXY7bT1kKzR8MDtjW20+PjJdPTIxMzt2PXYrNDAwfDA7bz1jW2grMjg+PjJdfDA7eD1vKzR8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW3E+PjJdPTEzNDQ4O2NbcSs0Pj4yXT0yMDg7Y1txKzg+PjJdPTA7Y2coMTM0NDgscSl9eD0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dz1jW28rOD4+Ml18MDtpZigoY1tvKzEyPj4yXXwwKS13Pj4yPj4+MD54Pj4+MD8odD1jW3crKHg8PDIpPj4yXXwwLCh0fDApIT0wKTowKXthW3U+PjBdPTA7ZG97aWYodWsoZSxjW2Y+PjJdfDAsZyxvLGNbaCs0Pj4yXXwwLGosdSx0LGQscix2KXwwKXt1Y1tjWyhjW3Q+PjJdfDApKzQ4Pj4yXSYzMV0odCwxMzE2OCwxMzE3OHwwLHMpfDA7aD1jW3I+PjJdfDA7Zz1jW2Q+PjJdfDA7dD1oLWd8MDtpZigodHwwKT4zOTIpe3Y9dW4oKHQ+PjIpKzJ8MCl8MDtpZigodnwwKT09MCl7eD1YYSg0KXwwO2NbeD4+Ml09MjI2ODA7d2IoeHwwLDIyNzI4LDIwNil9ZWxzZXt0PXZ9fWVsc2V7dD0wO3Y9cH1pZigoYVt1Pj4wXXwwKSE9MCl7YVt2Pj4wXT00NTt2PXYrMXwwfWlmKGc+Pj4wPGg+Pj4wKXtoPXMrNDB8MDt1PXM7ZG97eD1jW2c+PjJdfDA7dz1zO3doaWxlKDEpe2lmKChjW3c+PjJdfDApPT0oeHwwKSl7YnJlYWt9dz13KzR8MDtpZigod3wwKT09KGh8MCkpe3c9aDticmVha319YVt2Pj4wXT1hWzEzMTY4Kyh3LXU+PjIpPj4wXXwwO2c9Zys0fDA7dj12KzF8MH13aGlsZShnPj4+MDwoY1tyPj4yXXwwKT4+PjApfWFbdj4+MF09MDtjW3E+PjJdPWs7aWYoKEZhKHB8MCwxMzEwNCxxfDApfDApPT0xKXtpZigodHwwKT09MCl7YnJlYWt9dm4odCk7YnJlYWt9aj1YYSg4KXwwO2Nbaj4+Ml09OTkyODt3aGlsZSgxKXtkPXVuKDI4KXwwO2lmKChkfDApIT0wKXtsPTI5O2JyZWFrfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXtsPTI3O2JyZWFrfXNjW2wmMzFdKCl9aWYoKGx8MCk9PTI3KXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNlIGlmKChsfDApPT0yOSl7Y1tkKzQ+PjJdPTE1O2NbZD4+Ml09MTU7Yj1kKzEyfDA7Y1tqKzQ+PjJdPWI7Y1tkKzg+PjJdPTA7Yj1iKzB8MDtkPTEzMTEyfDA7bD1iKzE2fDA7ZG97YVtiPj4wXT1hW2Q+PjBdfDA7Yj1iKzF8MDtkPWQrMXwwfXdoaWxlKChifDApPChsfDApKTt3YihqfDAsMTAwNjQsMTA2KX19fXdoaWxlKDApO2s9Y1tlPj4yXXwwO2lmKChrfDApIT0wKXtwPWNbaysxMj4+Ml18MDtpZigocHwwKT09KGNbaysxNj4+Ml18MCkpe3A9b2NbY1soY1trPj4yXXwwKSszNj4+Ml0mMTI3XShrKXwwfWVsc2V7cD1jW3A+PjJdfDB9aWYoKHB8MCk9PS0xKXtjW2U+PjJdPTA7ZT0wO2s9MX1lbHNle2U9aztrPTB9fWVsc2V7ZT0wO2s9MX1xPWNbZj4+Ml18MDtkb3tpZigocXwwKSE9MCl7cD1jW3ErMTI+PjJdfDA7aWYoKHB8MCk9PShjW3ErMTY+PjJdfDApKXtwPW9jW2NbKGNbcT4+Ml18MCkrMzY+PjJdJjEyN10ocSl8MH1lbHNle3A9Y1twPj4yXXwwfWlmKCEoKHB8MCk9PS0xKSl7aWYoayl7YnJlYWt9ZWxzZXtsPTQ3O2JyZWFrfX1lbHNle2NbZj4+Ml09MDtsPTQ1O2JyZWFrfX1lbHNle2w9NDV9fXdoaWxlKDApO2lmKChsfDApPT00NT9rOjApe2w9NDd9aWYoKGx8MCk9PTQ3KXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPWU7dz1vKzR8MDt4PWNbdz4+Ml18MDtjW3c+PjJdPXgrIC0xO2lmKCh4fDApPT0wKXtsY1tjWyhjW28+PjJdfDApKzg+PjJdJjI1NV0obyl9bD1jW2Q+PjJdfDA7Y1tkPj4yXT0wO2lmKChsfDApPT0wKXtpPW47cmV0dXJufWxjW2NbbT4+Ml0mMjU1XShsKTtpPW47cmV0dXJufXg9WGEoNCl8MDtjW3g+PjJdPTIxMzA0O3diKHh8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHVrKGIsZSxmLGcsaCxqLGssbCxtLG4sbyl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7bz1vfDA7dmFyIHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTA7dj1pO2k9aSs1OTJ8MDtRPXY7Tz12KzExMnwwO0s9disxMnwwO0c9disxMDB8MDtIPXYrNDB8MDtFPXYrMjR8MDtOPXYrMzZ8MDtNPXYrODh8MDtMPXYrNzZ8MDtKPXYrNTJ8MDtJPXYrNjR8MDtQPXYrMTIwfDA7Rj12KzUyMHwwO3Q9dis1MjR8MDt3PXYrNTM2fDA7eD12KzU0OHwwO3I9dis1NjB8MDtzPXYrNTcyfDA7QT12KzU4NHwwO2NbRj4+Ml09MDtjW3QrMD4+Ml09MDtjW3QrND4+Ml09MDtjW3QrOD4+Ml09MDtjW3crMD4+Ml09MDtjW3crND4+Ml09MDtjW3crOD4+Ml09MDtjW3grMD4+Ml09MDtjW3grND4+Ml09MDtjW3grOD4+Ml09MDtjW3IrMD4+Ml09MDtjW3IrND4+Ml09MDtjW3IrOD4+Ml09MDtjW3MrMD4+Ml09MDtjW3MrND4+Ml09MDtjW3MrOD4+Ml09MDtkb3tpZihmKXtpZighKChjWzMyNjBdfDApPT0tMSkpe2NbUT4+Ml09MTMwNDA7Y1tRKzQ+PjJdPTIwODtjW1ErOD4+Ml09MDtjZygxMzA0MCxRKX1DPShjWzEzMDQ0Pj4yXXwwKSsgLTF8MDtJPWNbZys4Pj4yXXwwO2lmKChjW2crMTI+PjJdfDApLUk+PjI+Pj4wPkM+Pj4wPyhEPWNbSSsoQzw8Mik+PjJdfDAsKER8MCkhPTApOjApe21jW2NbKGNbRD4+Ml18MCkrNDQ+PjJdJjEyN10oTyxEKTtjW0Y+PjJdPWNbTz4+Ml07bWNbY1soY1tEPj4yXXwwKSszMj4+Ml0mMTI3XShLLEQpO2lmKChhW3I+PjBdJjEpPT0wKXtjW3IrND4+Ml09MDthW3I+PjBdPTB9ZWxzZXtjW2Nbcis4Pj4yXT4+Ml09MDtjW3IrND4+Ml09MH1vZyhyKTtjW3IrMD4+Ml09Y1tLKzA+PjJdO2Nbcis0Pj4yXT1jW0srND4+Ml07Y1tyKzg+PjJdPWNbSys4Pj4yXTtjW0srMD4+Ml09MDtjW0srND4+Ml09MDtjW0srOD4+Ml09MDttY1tjWyhjW0Q+PjJdfDApKzI4Pj4yXSYxMjddKEcsRCk7aWYoKGFbeD4+MF0mMSk9PTApe2NbeCs0Pj4yXT0wO2FbeD4+MF09MH1lbHNle2NbY1t4Kzg+PjJdPj4yXT0wO2NbeCs0Pj4yXT0wfW9nKHgpO2NbeCswPj4yXT1jW0crMD4+Ml07Y1t4KzQ+PjJdPWNbRys0Pj4yXTtjW3grOD4+Ml09Y1tHKzg+PjJdO2NbRyswPj4yXT0wO2NbRys0Pj4yXT0wO2NbRys4Pj4yXT0wO2c9b2NbY1soY1tEPj4yXXwwKSsxMj4+Ml0mMTI3XShEKXwwO0c9b2NbY1soY1tEPj4yXXwwKSsxNj4+Ml0mMTI3XShEKXwwO21jW2NbKGNbRD4+Ml18MCkrMjA+PjJdJjEyN10oSCxEKTtpZigoYVt0Pj4wXSYxKT09MCl7YVt0KzE+PjBdPTA7YVt0Pj4wXT0wfWVsc2V7YVtjW3QrOD4+Ml0+PjBdPTA7Y1t0KzQ+PjJdPTB9aWcodCk7Y1t0KzA+PjJdPWNbSCswPj4yXTtjW3QrND4+Ml09Y1tIKzQ+PjJdO2NbdCs4Pj4yXT1jW0grOD4+Ml07Y1tIKzA+PjJdPTA7Y1tIKzQ+PjJdPTA7Y1tIKzg+PjJdPTA7bWNbY1soY1tEPj4yXXwwKSsyND4+Ml0mMTI3XShFLEQpO2lmKChhW3c+PjBdJjEpPT0wKXtjW3crND4+Ml09MDthW3c+PjBdPTB9ZWxzZXtjW2Nbdys4Pj4yXT4+Ml09MDtjW3crND4+Ml09MH1vZyh3KTtjW3crMD4+Ml09Y1tFKzA+PjJdO2Nbdys0Pj4yXT1jW0UrND4+Ml07Y1t3Kzg+PjJdPWNbRSs4Pj4yXTtjW0UrMD4+Ml09MDtjW0UrND4+Ml09MDtjW0UrOD4+Ml09MDtmPW9jW2NbKGNbRD4+Ml18MCkrMzY+PjJdJjEyN10oRCl8MDticmVha30kPVhhKDQpfDA7Y1skPj4yXT0yMTMwNDt3YigkfDAsMjEzNzYsMTk2KX1lbHNle2lmKCEoKGNbMzI0NF18MCk9PS0xKSl7Y1tRPj4yXT0xMjk3NjtjW1ErND4+Ml09MjA4O2NbUSs4Pj4yXT0wO2NnKDEyOTc2LFEpfUQ9KGNbMTI5ODA+PjJdfDApKyAtMXwwO0U9Y1tnKzg+PjJdfDA7aWYoKGNbZysxMj4+Ml18MCktRT4+Mj4+PjA+RD4+PjA/KEM9Y1tFKyhEPDwyKT4+Ml18MCwoQ3wwKSE9MCk6MCl7bWNbY1soY1tDPj4yXXwwKSs0ND4+Ml0mMTI3XShOLEMpO2NbRj4+Ml09Y1tOPj4yXTttY1tjWyhjW0M+PjJdfDApKzMyPj4yXSYxMjddKE0sQyk7aWYoKGFbcj4+MF0mMSk9PTApe2Nbcis0Pj4yXT0wO2Fbcj4+MF09MH1lbHNle2NbY1tyKzg+PjJdPj4yXT0wO2Nbcis0Pj4yXT0wfW9nKHIpO2NbciswPj4yXT1jW00rMD4+Ml07Y1tyKzQ+PjJdPWNbTSs0Pj4yXTtjW3IrOD4+Ml09Y1tNKzg+PjJdO2NbTSswPj4yXT0wO2NbTSs0Pj4yXT0wO2NbTSs4Pj4yXT0wO21jW2NbKGNbQz4+Ml18MCkrMjg+PjJdJjEyN10oTCxDKTtpZigoYVt4Pj4wXSYxKT09MCl7Y1t4KzQ+PjJdPTA7YVt4Pj4wXT0wfWVsc2V7Y1tjW3grOD4+Ml0+PjJdPTA7Y1t4KzQ+PjJdPTB9b2coeCk7Y1t4KzA+PjJdPWNbTCswPj4yXTtjW3grND4+Ml09Y1tMKzQ+PjJdO2NbeCs4Pj4yXT1jW0wrOD4+Ml07Y1tMKzA+PjJdPTA7Y1tMKzQ+PjJdPTA7Y1tMKzg+PjJdPTA7Zz1vY1tjWyhjW0M+PjJdfDApKzEyPj4yXSYxMjddKEMpfDA7Rz1vY1tjWyhjW0M+PjJdfDApKzE2Pj4yXSYxMjddKEMpfDA7bWNbY1soY1tDPj4yXXwwKSsyMD4+Ml0mMTI3XShKLEMpO2lmKChhW3Q+PjBdJjEpPT0wKXthW3QrMT4+MF09MDthW3Q+PjBdPTB9ZWxzZXthW2NbdCs4Pj4yXT4+MF09MDtjW3QrND4+Ml09MH1pZyh0KTtjW3QrMD4+Ml09Y1tKKzA+PjJdO2NbdCs0Pj4yXT1jW0orND4+Ml07Y1t0Kzg+PjJdPWNbSis4Pj4yXTtjW0orMD4+Ml09MDtjW0orND4+Ml09MDtjW0orOD4+Ml09MDttY1tjWyhjW0M+PjJdfDApKzI0Pj4yXSYxMjddKEksQyk7aWYoKGFbdz4+MF0mMSk9PTApe2Nbdys0Pj4yXT0wO2Fbdz4+MF09MH1lbHNle2NbY1t3Kzg+PjJdPj4yXT0wO2Nbdys0Pj4yXT0wfW9nKHcpO2NbdyswPj4yXT1jW0krMD4+Ml07Y1t3KzQ+PjJdPWNbSSs0Pj4yXTtjW3crOD4+Ml09Y1tJKzg+PjJdO2NbSSswPj4yXT0wO2NbSSs0Pj4yXT0wO2NbSSs4Pj4yXT0wO2Y9b2NbY1soY1tDPj4yXXwwKSszNj4+Ml0mMTI3XShDKXwwO2JyZWFrfSQ9WGEoNCl8MDtjWyQ+PjJdPTIxMzA0O3diKCR8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtjW24+PjJdPWNbbT4+Ml07ST1yKzR8MDtEPXIrOHwwO0g9eCs0fDA7Qz14Kzh8MDtMPShoJjUxMnwwKSE9MDtKPXcrNHwwO2g9dys4fDA7TT1zKzR8MDtFPXMrOHwwO049RiszfDA7Sz1tKzR8MDtPPXQrNHwwO1M9UCs0MDB8MDtVPVA7VD1QO1E9MDtQPTA7Uj0yMTM7YTp3aGlsZSgxKXtWPWNbYj4+Ml18MDtkb3tpZigoVnwwKSE9MCl7Vz1jW1YrMTI+PjJdfDA7aWYoKFd8MCk9PShjW1YrMTY+PjJdfDApKXtWPW9jW2NbKGNbVj4+Ml18MCkrMzY+PjJdJjEyN10oVil8MH1lbHNle1Y9Y1tXPj4yXXwwfWlmKChWfDApPT0tMSl7Y1tiPj4yXT0wO1Y9MTticmVha31lbHNle1Y9KGNbYj4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7Vj0xfX13aGlsZSgwKTtpZigoZXwwKSE9MCl7Vz1jW2UrMTI+PjJdfDA7aWYoKFd8MCk9PShjW2UrMTY+PjJdfDApKXtXPW9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MH1lbHNle1c9Y1tXPj4yXXwwfWlmKCEoKFd8MCk9PS0xKSl7aWYoIVYpe0I9Mzc4O2JyZWFrfX1lbHNle0I9NzV9fWVsc2V7Qj03NX1pZigoQnwwKT09NzUpe0I9MDtpZihWKXtlPTA7Qj0zNzg7YnJlYWt9ZWxzZXtlPTB9fWI6ZG97c3dpdGNoKGFbRitRPj4wXXwwKXtjYXNlIDE6e2lmKChRfDApPT0zKXtCPTM3ODticmVhayBhfUI9Y1tiPj4yXXwwO1Y9Y1tCKzEyPj4yXXwwO2lmKChWfDApPT0oY1tCKzE2Pj4yXXwwKSl7Qj1vY1tjWyhjW0I+PjJdfDApKzM2Pj4yXSYxMjddKEIpfDB9ZWxzZXtCPWNbVj4+Ml18MH1pZighKGhjW2NbKGNbbD4+Ml18MCkrMTI+PjJdJjYzXShsLDgxOTIsQil8MCkpe0I9OTc7YnJlYWsgYX1XPWNbYj4+Ml18MDtCPVcrMTJ8MDtWPWNbQj4+Ml18MDtpZigoVnwwKT09KGNbVysxNj4+Ml18MCkpe1Y9b2NbY1soY1tXPj4yXXwwKSs0MD4+Ml0mMTI3XShXKXwwfWVsc2V7Y1tCPj4yXT1WKzQ7Vj1jW1Y+PjJdfDB9Vz1hW3M+PjBdfDA7Qj0oVyYxKSE9MDtpZihCKXtYPShjW3M+PjJdJi0yKSsgLTF8MDtXPWNbTT4+Ml18MH1lbHNle1g9MTtXPShXJjI1NSk+Pj4xfWlmKChXfDApPT0oWHwwKSl7cGcocyxYLDEsWCxYLDAsMCk7aWYoKGFbcz4+MF0mMSk9PTApe0I9OTR9ZWxzZXtCPTk1fX1lbHNle2lmKEIpe0I9OTV9ZWxzZXtCPTk0fX1pZigoQnwwKT09OTQpe2Fbcz4+MF09KFc8PDEpKzI7WD1NO1k9VysxfDB9ZWxzZSBpZigoQnwwKT09OTUpe1g9Y1tFPj4yXXwwO1k9VysxfDA7Y1tNPj4yXT1ZfWNbWCsoVzw8Mik+PjJdPVY7Y1tYKyhZPDwyKT4+Ml09MDtCPTk4O2JyZWFrfTtjYXNlIDI6e2lmKCEoKFB8MCkhPTB8UT4+PjA8Mikpe2lmKChRfDApPT0yKXtWPShhW04+PjBdfDApIT0wfWVsc2V7Vj0wfWlmKCEoTHxWKSl7UD0wO2JyZWFrIGJ9fVk9YVt3Pj4wXXwwO1Y9KFkmMSk9PTA/SjpjW2g+PjJdfDA7Yzpkb3tpZigoUXwwKSE9MD8oZFtGKyhRKyAtMSk+PjBdfDApPDI6MCl7d2hpbGUoMSl7aWYoKFkmMSk9PTApe1g9SjtXPShZJjI1NSk+Pj4xfWVsc2V7WD1jW2g+PjJdfDA7Vz1jW0o+PjJdfDB9aWYoKFZ8MCk9PShYKyhXPDwyKXwwKSl7YnJlYWt9aWYoIShoY1tjWyhjW2w+PjJdfDApKzEyPj4yXSY2M10obCw4MTkyLGNbVj4+Ml18MCl8MCkpe0I9MjEyO2JyZWFrfVk9YVt3Pj4wXXwwO1Y9Vis0fDB9aWYoKEJ8MCk9PTIxMil7Qj0wO1k9YVt3Pj4wXXwwfVg9KFkmMSk9PTA/SjpjW2g+PjJdfDA7Vz1WLVg+PjI7Wj1hW3M+PjBdfDA7JD0oWiYxKT09MDtpZigkKXtfPShaJjI1NSk+Pj4xfWVsc2V7Xz1jW00+PjJdfDB9aWYoIShXPj4+MD5fPj4+MCkpe2lmKCQpe189KFomMjU1KT4+PjE7JD1NO1o9XztfPU0rKF8tVzw8Mil8MH1lbHNle2FhPWNbRT4+Ml18MDtfPWNbTT4+Ml18MDskPWFhO1o9XztfPWFhKyhfLVc8PDIpfDB9Vz0kKyhaPDwyKXwwO2lmKChffDApPT0oV3wwKSl7Vz1lO1g9ZX1lbHNle1o9WDt3aGlsZSgxKXtpZigoY1tfPj4yXXwwKSE9KGNbWj4+Ml18MCkpe1c9ZTtWPVg7WD1lO2JyZWFrIGN9Xz1fKzR8MDtpZigoX3wwKT09KFd8MCkpe1c9ZTtYPWU7YnJlYWsgY31aPVorNHwwfX19ZWxzZXtXPWU7Vj1YO1g9ZX19ZWxzZXtXPWU7WD1lfX13aGlsZSgwKTt3aGlsZSgxKXtpZigoWSYxKT09MCl7Wj1KO1k9KFkmMjU1KT4+PjF9ZWxzZXtaPWNbaD4+Ml18MDtZPWNbSj4+Ml18MH1pZigoVnwwKT09KForKFk8PDIpfDApKXticmVha31ZPWNbYj4+Ml18MDtkb3tpZigoWXwwKSE9MCl7Wj1jW1krMTI+PjJdfDA7aWYoKFp8MCk9PShjW1krMTY+PjJdfDApKXtZPW9jW2NbKGNbWT4+Ml18MCkrMzY+PjJdJjEyN10oWSl8MH1lbHNle1k9Y1taPj4yXXwwfWlmKChZfDApPT0tMSl7Y1tiPj4yXT0wO1k9MTticmVha31lbHNle1k9KGNbYj4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7WT0xfX13aGlsZSgwKTtpZigoWHwwKSE9MCl7Wj1jW1grMTI+PjJdfDA7aWYoKFp8MCk9PShjW1grMTY+PjJdfDApKXtYPW9jW2NbKGNbWD4+Ml18MCkrMzY+PjJdJjEyN10oWCl8MH1lbHNle1g9Y1taPj4yXXwwfWlmKCEoKFh8MCk9PS0xKSl7aWYoWV4oV3wwKT09MCl7WT1XO1g9V31lbHNle2JyZWFrfX1lbHNle1c9MDtlPTA7Qj0yNDB9fWVsc2V7Qj0yNDB9aWYoKEJ8MCk9PTI0MCl7Qj0wO2lmKFkpe2JyZWFrfWVsc2V7WT1XO1g9MH19Wj1jW2I+PjJdfDA7Vz1jW1orMTI+PjJdfDA7aWYoKFd8MCk9PShjW1orMTY+PjJdfDApKXtXPW9jW2NbKGNbWj4+Ml18MCkrMzY+PjJdJjEyN10oWil8MH1lbHNle1c9Y1tXPj4yXXwwfWlmKChXfDApIT0oY1tWPj4yXXwwKSl7YnJlYWt9Xz1jW2I+PjJdfDA7Vz1fKzEyfDA7Wj1jW1c+PjJdfDA7aWYoKFp8MCk9PShjW18rMTY+PjJdfDApKXtvY1tjWyhjW18+PjJdfDApKzQwPj4yXSYxMjddKF8pfDB9ZWxzZXtjW1c+PjJdPVorNH1XPVk7WT1hW3c+PjBdfDA7Vj1WKzR8MH1pZihMKXtYPWFbdz4+MF18MDtpZigoWCYxKT09MCl7Vz1KO1g9KFgmMjU1KT4+PjF9ZWxzZXtXPWNbaD4+Ml18MDtYPWNbSj4+Ml18MH1pZigoVnwwKSE9KFcrKFg8PDIpfDApKXtCPTI1NTticmVhayBhfX1icmVha307Y2FzZSAwOntCPTk4O2JyZWFrfTtjYXNlIDM6e1Y9YVt4Pj4wXXwwO1g9KFYmMSk9PTA7aWYoWCl7Wj0oViYyNTUpPj4+MX1lbHNle1o9Y1tIPj4yXXwwfVc9YVtyPj4wXXwwO1k9KFcmMSk9PTA7aWYoWSl7Xz0oVyYyNTUpPj4+MX1lbHNle189Y1tJPj4yXXwwfWlmKChafDApIT0oMC1ffDApKXtpZihYKXtaPShWJjI1NSk+Pj4xfWVsc2V7Wj1jW0g+PjJdfDB9aWYoKFp8MCkhPTApe2lmKFkpe1k9KFcmMjU1KT4+PjF9ZWxzZXtZPWNbST4+Ml18MH1pZigoWXwwKSE9MCl7WD1jW2I+PjJdfDA7WT1jW1grMTI+PjJdfDA7Wj1jW1grMTY+PjJdfDA7aWYoKFl8MCk9PShafDApKXtXPW9jW2NbKGNbWD4+Ml18MCkrMzY+PjJdJjEyN10oWCl8MDtaPWNbYj4+Ml18MDtWPWFbeD4+MF18MDtYPVo7WT1jW1orMTI+PjJdfDA7Wj1jW1orMTY+PjJdfDB9ZWxzZXtXPWNbWT4+Ml18MH1fPVgrMTJ8MDtaPShZfDApPT0oWnwwKTtpZigoV3wwKT09KGNbKChWJjEpPT0wP0g6Y1tDPj4yXXwwKT4+Ml18MCkpe2lmKFope29jW2NbKGNbWD4+Ml18MCkrNDA+PjJdJjEyN10oWCl8MH1lbHNle2NbXz4+Ml09WSs0fVY9YVt4Pj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0g+PjJdfDB9UD1WPj4+MD4xP3g6UDticmVhayBifWlmKFope1Y9b2NbY1soY1tYPj4yXXwwKSszNj4+Ml0mMTI3XShYKXwwfWVsc2V7Vj1jW1k+PjJdfDB9aWYoKFZ8MCkhPShjWygoYVtyPj4wXSYxKT09MD9JOmNbRD4+Ml18MCk+PjJdfDApKXtCPTE5ODticmVhayBhfVY9Y1tiPj4yXXwwO1c9VisxMnwwO1g9Y1tXPj4yXXwwO2lmKChYfDApPT0oY1tWKzE2Pj4yXXwwKSl7b2NbY1soY1tWPj4yXXwwKSs0MD4+Ml0mMTI3XShWKXwwfWVsc2V7Y1tXPj4yXT1YKzR9YVtrPj4wXT0xO1Y9YVtyPj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0k+PjJdfDB9UD1WPj4+MD4xP3I6UDticmVhayBifX1pZihYKXtYPShWJjI1NSk+Pj4xfWVsc2V7WD1jW0g+PjJdfDB9WT1jW2I+PjJdfDA7Wj1jW1krMTI+PjJdfDA7Xz0oWnwwKT09KGNbWSsxNj4+Ml18MCk7aWYoKFh8MCk9PTApe2lmKF8pe1Y9b2NbY1soY1tZPj4yXXwwKSszNj4+Ml0mMTI3XShZKXwwO1c9YVtyPj4wXXwwfWVsc2V7Vj1jW1o+PjJdfDB9aWYoKFZ8MCkhPShjWygoVyYxKT09MD9JOmNbRD4+Ml18MCk+PjJdfDApKXticmVhayBifVg9Y1tiPj4yXXwwO1c9WCsxMnwwO1Y9Y1tXPj4yXXwwO2lmKChWfDApPT0oY1tYKzE2Pj4yXXwwKSl7b2NbY1soY1tYPj4yXXwwKSs0MD4+Ml0mMTI3XShYKXwwfWVsc2V7Y1tXPj4yXT1WKzR9YVtrPj4wXT0xO1Y9YVtyPj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0k+PjJdfDB9UD1WPj4+MD4xP3I6UDticmVhayBifWlmKF8pe1c9b2NbY1soY1tZPj4yXXwwKSszNj4+Ml0mMTI3XShZKXwwO1Y9YVt4Pj4wXXwwfWVsc2V7Vz1jW1o+PjJdfDB9aWYoKFd8MCkhPShjWygoViYxKT09MD9IOmNbQz4+Ml18MCk+PjJdfDApKXthW2s+PjBdPTE7YnJlYWsgYn1YPWNbYj4+Ml18MDtXPVgrMTJ8MDtWPWNbVz4+Ml18MDtpZigoVnwwKT09KGNbWCsxNj4+Ml18MCkpe29jW2NbKGNbWD4+Ml18MCkrNDA+PjJdJjEyN10oWCl8MH1lbHNle2NbVz4+Ml09Vis0fVY9YVt4Pj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0g+PjJdfDB9UD1WPj4+MD4xP3g6UH1icmVha307Y2FzZSA0OntWPTA7d2hpbGUoMSl7WD1jW2I+PjJdfDA7ZG97aWYoKFh8MCkhPTApe1c9Y1tYKzEyPj4yXXwwO2lmKChXfDApPT0oY1tYKzE2Pj4yXXwwKSl7Vz1vY1tjWyhjW1g+PjJdfDApKzM2Pj4yXSYxMjddKFgpfDB9ZWxzZXtXPWNbVz4+Ml18MH1pZigoV3wwKT09LTEpe2NbYj4+Ml09MDtXPTE7YnJlYWt9ZWxzZXtXPShjW2I+PjJdfDApPT0wO2JyZWFrfX1lbHNle1c9MX19d2hpbGUoMCk7aWYoKGV8MCkhPTApe1g9Y1tlKzEyPj4yXXwwO2lmKChYfDApPT0oY1tlKzE2Pj4yXXwwKSl7WD1vY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDB9ZWxzZXtYPWNbWD4+Ml18MH1pZighKChYfDApPT0tMSkpe2lmKCFXKXticmVha319ZWxzZXtCPTI2OH19ZWxzZXtCPTI2OH1pZigoQnwwKT09MjY4KXtCPTA7aWYoVyl7ZT0wO2JyZWFrfWVsc2V7ZT0wfX1YPWNbYj4+Ml18MDtXPWNbWCsxMj4+Ml18MDtpZigoV3wwKT09KGNbWCsxNj4+Ml18MCkpe1c9b2NbY1soY1tYPj4yXXwwKSszNj4+Ml0mMTI3XShYKXwwfWVsc2V7Vz1jW1c+PjJdfDB9aWYoaGNbY1soY1tsPj4yXXwwKSsxMj4+Ml0mNjNdKGwsMjA0OCxXKXwwKXtYPWNbbj4+Ml18MDtpZigoWHwwKT09KG98MCkpe1k9KGNbSz4+Ml18MCkhPTIxMztaPWNbbT4+Ml18MDtvPW8tWnwwO1g9bz4+PjA8MjE0NzQ4MzY0Nz9vPDwxOi0xO289bz4+MjtpZighWSl7Wj0wfVo9d24oWixYKXwwO2lmKChafDApPT0wKXtCPTI3OTticmVhayBhfWlmKCFZKXtZPWNbbT4+Ml18MDtjW20+PjJdPVo7aWYoKFl8MCkhPTApe2xjW2NbSz4+Ml0mMjU1XShZKTtaPWNbbT4+Ml18MH19ZWxzZXtjW20+PjJdPVp9Y1tLPj4yXT0yMTQ7YWE9Wisobzw8Mil8MDtjW24+PjJdPWFhO289KGNbbT4+Ml18MCkrKFg+Pj4yPDwyKXwwO1g9YWF9Y1tuPj4yXT1YKzQ7Y1tYPj4yXT1XO1Y9VisxfDB9ZWxzZXtYPWFbdD4+MF18MDtpZigoWCYxKT09MCl7WD0oWCYyNTUpPj4+MX1lbHNle1g9Y1tPPj4yXXwwfWlmKCEoKCgoWHwwKT09MHwoVnwwKT09MCleMSkmKFd8MCk9PShHfDApKSl7YnJlYWt9aWYoKFV8MCk9PShTfDApKXtVPVUtVHwwO1M9VT4+PjA8MjE0NzQ4MzY0Nz9VPDwxOi0xO2lmKChSfDApPT0yMTMpe1Q9MH1SPXduKFQsUyl8MDtpZigoUnwwKT09MCl7Qj0yOTY7YnJlYWsgYX1UPVI7Uz1SKyhTPj4+Mjw8Mil8MDtVPVIrKFU+PjI8PDIpfDA7Uj0yMTR9Y1tVPj4yXT1WO1U9VSs0fDA7Vj0wfVc9Y1tiPj4yXXwwO1g9VysxMnwwO1k9Y1tYPj4yXXwwO2lmKChZfDApPT0oY1tXKzE2Pj4yXXwwKSl7b2NbY1soY1tXPj4yXXwwKSs0MD4+Ml0mMTI3XShXKXwwO2NvbnRpbnVlfWVsc2V7Y1tYPj4yXT1ZKzQ7Y29udGludWV9fWlmKCEoKFR8MCk9PShVfDApfChWfDApPT0wKSl7aWYoKFV8MCk9PShTfDApKXtVPVUtVHwwO1M9VT4+PjA8MjE0NzQ4MzY0Nz9VPDwxOi0xO2lmKChSfDApPT0yMTMpe1Q9MH1SPXduKFQsUyl8MDtpZigoUnwwKT09MCl7Qj0zMDg7YnJlYWsgYX1UPVI7Uz1SKyhTPj4+Mjw8Mil8MDtVPVIrKFU+PjI8PDIpfDA7Uj0yMTR9Y1tVPj4yXT1WO1U9VSs0fDB9aWYoKGZ8MCk+MCl7Vz1jW2I+PjJdfDA7ZG97aWYoKFd8MCkhPTApe1Y9Y1tXKzEyPj4yXXwwO2lmKChWfDApPT0oY1tXKzE2Pj4yXXwwKSl7Vj1vY1tjWyhjW1c+PjJdfDApKzM2Pj4yXSYxMjddKFcpfDB9ZWxzZXtWPWNbVj4+Ml18MH1pZigoVnwwKT09LTEpe2NbYj4+Ml09MDtWPTE7YnJlYWt9ZWxzZXtWPShjW2I+PjJdfDApPT0wO2JyZWFrfX1lbHNle1Y9MX19d2hpbGUoMCk7aWYoKGV8MCkhPTApe1c9Y1tlKzEyPj4yXXwwO2lmKChXfDApPT0oY1tlKzE2Pj4yXXwwKSl7Vz1vY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDB9ZWxzZXtXPWNbVz4+Ml18MH1pZighKChXfDApPT0tMSkpe2lmKCFWKXtCPTMzMTticmVhayBhfX1lbHNle0I9MzI1fX1lbHNle0I9MzI1fWlmKChCfDApPT0zMjUpe0I9MDtpZihWKXtCPTMzMTticmVhayBhfWVsc2V7ZT0wfX1XPWNbYj4+Ml18MDtWPWNbVysxMj4+Ml18MDtpZigoVnwwKT09KGNbVysxNj4+Ml18MCkpe1Y9b2NbY1soY1tXPj4yXXwwKSszNj4+Ml0mMTI3XShXKXwwfWVsc2V7Vj1jW1Y+PjJdfDB9aWYoKFZ8MCkhPShnfDApKXtCPTMzMTticmVhayBhfVY9Y1tiPj4yXXwwO1c9VisxMnwwO1g9Y1tXPj4yXXwwO2lmKChYfDApPT0oY1tWKzE2Pj4yXXwwKSl7b2NbY1soY1tWPj4yXXwwKSs0MD4+Ml0mMTI3XShWKXwwO1g9ZTtXPWV9ZWxzZXtjW1c+PjJdPVgrNDtYPWU7Vz1lfXdoaWxlKDEpe1k9Y1tiPj4yXXwwO2Rve2lmKChZfDApIT0wKXtWPWNbWSsxMj4+Ml18MDtpZigoVnwwKT09KGNbWSsxNj4+Ml18MCkpe1Y9b2NbY1soY1tZPj4yXXwwKSszNj4+Ml0mMTI3XShZKXwwfWVsc2V7Vj1jW1Y+PjJdfDB9aWYoKFZ8MCk9PS0xKXtjW2I+PjJdPTA7WT0xO2JyZWFrfWVsc2V7WT0oY1tiPj4yXXwwKT09MDticmVha319ZWxzZXtZPTF9fXdoaWxlKDApO2lmKChXfDApIT0wKXtWPWNbVysxMj4+Ml18MDtpZigoVnwwKT09KGNbVysxNj4+Ml18MCkpe1Y9b2NbY1soY1tXPj4yXXwwKSszNj4+Ml0mMTI3XShXKXwwfWVsc2V7Vj1jW1Y+PjJdfDB9aWYoISgoVnwwKT09LTEpKXtpZihZXihYfDApPT0wKXtWPVg7Vz1YfWVsc2V7Qj0zNTQ7YnJlYWsgYX19ZWxzZXtWPTA7ZT0wO0I9MzQ3fX1lbHNle1Y9WDtCPTM0N31pZigoQnwwKT09MzQ3KXtCPTA7aWYoWSl7Qj0zNTQ7YnJlYWsgYX1lbHNle1c9MH19WT1jW2I+PjJdfDA7WD1jW1krMTI+PjJdfDA7aWYoKFh8MCk9PShjW1krMTY+PjJdfDApKXtYPW9jW2NbKGNbWT4+Ml18MCkrMzY+PjJdJjEyN10oWSl8MH1lbHNle1g9Y1tYPj4yXXwwfWlmKCEoaGNbY1soY1tsPj4yXXwwKSsxMj4+Ml0mNjNdKGwsMjA0OCxYKXwwKSl7Qj0zNTQ7YnJlYWsgYX1YPWNbbj4+Ml18MDtpZigoWHwwKT09KG98MCkpe1k9KGNbSz4+Ml18MCkhPTIxMztaPWNbbT4+Ml18MDtYPW8tWnwwO289WD4+PjA8MjE0NzQ4MzY0Nz9YPDwxOi0xO1g9WD4+MjtpZighWSl7Wj0wfVo9d24oWixvKXwwO2lmKChafDApPT0wKXtCPTM1OTticmVhayBhfWRve2lmKFkpe2NbbT4+Ml09Wn1lbHNle1k9Y1ttPj4yXXwwO2NbbT4+Ml09WjtpZigoWXwwKT09MCl7YnJlYWt9bGNbY1tLPj4yXSYyNTVdKFkpO1o9Y1ttPj4yXXwwfX13aGlsZSgwKTtjW0s+PjJdPTIxNDtYPVorKFg8PDIpfDA7Y1tuPj4yXT1YO289KGNbbT4+Ml18MCkrKG8+Pj4yPDwyKXwwfVk9Y1tiPj4yXXwwO1o9Y1tZKzEyPj4yXXwwO2lmKChafDApPT0oY1tZKzE2Pj4yXXwwKSl7WT1vY1tjWyhjW1k+PjJdfDApKzM2Pj4yXSYxMjddKFkpfDA7WD1jW24+PjJdfDB9ZWxzZXtZPWNbWj4+Ml18MH1jW24+PjJdPVgrNDtjW1g+PjJdPVk7Zj1mKyAtMXwwO1g9Y1tiPj4yXXwwO1k9WCsxMnwwO1o9Y1tZPj4yXXwwO2lmKChafDApPT0oY1tYKzE2Pj4yXXwwKSl7b2NbY1soY1tYPj4yXXwwKSs0MD4+Ml0mMTI3XShYKXwwfWVsc2V7Y1tZPj4yXT1aKzR9aWYoKGZ8MCk+MCl7WD1WfWVsc2V7YnJlYWt9fX1pZigoY1tuPj4yXXwwKT09KGNbbT4+Ml18MCkpe0I9Mzc2O2JyZWFrIGF9YnJlYWt9O2RlZmF1bHQ6e319fXdoaWxlKDApO2Q6ZG97aWYoKEJ8MCk9PTk4KXtCPTA7aWYoKFF8MCk9PTMpe0I9Mzc4O2JyZWFrIGF9ZWxzZXtYPWU7Vj1lfXdoaWxlKDEpe1c9Y1tiPj4yXXwwO2Rve2lmKChXfDApIT0wKXtZPWNbVysxMj4+Ml18MDtpZigoWXwwKT09KGNbVysxNj4+Ml18MCkpe1c9b2NbY1soY1tXPj4yXXwwKSszNj4+Ml0mMTI3XShXKXwwfWVsc2V7Vz1jW1k+PjJdfDB9aWYoKFd8MCk9PS0xKXtjW2I+PjJdPTA7WT0xO2JyZWFrfWVsc2V7WT0oY1tiPj4yXXwwKT09MDticmVha319ZWxzZXtZPTF9fXdoaWxlKDApO2lmKChWfDApIT0wKXtXPWNbVisxMj4+Ml18MDtpZigoV3wwKT09KGNbVisxNj4+Ml18MCkpe1Y9b2NbY1soY1tWPj4yXXwwKSszNj4+Ml0mMTI3XShWKXwwfWVsc2V7Vj1jW1c+PjJdfDB9aWYoISgoVnwwKT09LTEpKXtpZihZXihYfDApPT0wKXtXPVg7Vj1YfWVsc2V7YnJlYWsgZH19ZWxzZXtXPTA7ZT0wO0I9MTExfX1lbHNle1c9WDtCPTExMX1pZigoQnwwKT09MTExKXtCPTA7aWYoWSl7YnJlYWsgZH1lbHNle1Y9MH19WT1jW2I+PjJdfDA7WD1jW1krMTI+PjJdfDA7aWYoKFh8MCk9PShjW1krMTY+PjJdfDApKXtYPW9jW2NbKGNbWT4+Ml18MCkrMzY+PjJdJjEyN10oWSl8MH1lbHNle1g9Y1tYPj4yXXwwfWlmKCEoaGNbY1soY1tsPj4yXXwwKSsxMj4+Ml0mNjNdKGwsODE5MixYKXwwKSl7YnJlYWsgZH1CPWNbYj4+Ml18MDtYPUIrMTJ8MDtZPWNbWD4+Ml18MDtpZigoWXwwKT09KGNbQisxNj4+Ml18MCkpe1g9b2NbY1soY1tCPj4yXXwwKSs0MD4+Ml0mMTI3XShCKXwwfWVsc2V7Y1tYPj4yXT1ZKzQ7WD1jW1k+PjJdfDB9WT1hW3M+PjBdfDA7Wj0oWSYxKSE9MDtpZihaKXtCPShjW3M+PjJdJi0yKSsgLTF8MDtZPWNbTT4+Ml18MH1lbHNle0I9MTtZPShZJjI1NSk+Pj4xfWlmKChZfDApPT0oQnwwKSl7cGcocyxCLDEsQixCLDAsMCk7aWYoKGFbcz4+MF0mMSk9PTApe0I9MTI4fWVsc2V7Qj0xMjl9fWVsc2V7aWYoWil7Qj0xMjl9ZWxzZXtCPTEyOH19aWYoKEJ8MCk9PTEyOCl7Qj0wO2Fbcz4+MF09KFk8PDEpKzI7Wj1NO189WSsxfDB9ZWxzZSBpZigoQnwwKT09MTI5KXtCPTA7Wj1jW0U+PjJdfDA7Xz1ZKzF8MDtjW00+PjJdPV99Y1taKyhZPDwyKT4+Ml09WDtjW1orKF88PDIpPj4yXT0wO1g9V319fXdoaWxlKDApO1E9USsxfDA7aWYoIShRPj4+MDw0KSl7Qj0zNzg7YnJlYWt9fWU6c3dpdGNoKEJ8MCl7Y2FzZSA5Nzp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDE5ODp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDI1NTp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDI3OTp7YWE9WGEoNCl8MDtjW2FhPj4yXT0yMjY4MDt3YihhYXwwLDIyNzI4LDIwNil9O2Nhc2UgMjk2OnthYT1YYSg0KXwwO2NbYWE+PjJdPTIyNjgwO3diKGFhfDAsMjI3MjgsMjA2KX07Y2FzZSAzMDg6e2FhPVhhKDQpfDA7Y1thYT4+Ml09MjI2ODA7d2IoYWF8MCwyMjcyOCwyMDYpfTtjYXNlIDMzMTp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDM1NDp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDM1OTp7YWE9WGEoNCl8MDtjW2FhPj4yXT0yMjY4MDt3YihhYXwwLDIyNzI4LDIwNil9O2Nhc2UgMzc2OntjW2o+PjJdPWNbaj4+Ml18NDtiPTA7YnJlYWt9O2Nhc2UgMzc4OntmOmRve2lmKChQfDApIT0wKXtsPVArNHwwO0Y9UCs4fDA7az0xO3doaWxlKDEpe209YVtQPj4wXXwwO2lmKChtJjEpPT0wKXttPShtJjI1NSk+Pj4xfWVsc2V7bT1jW2w+PjJdfDB9aWYoIShrPj4+MDxtPj4+MCkpe2JyZWFrIGZ9bj1jW2I+PjJdfDA7ZG97aWYoKG58MCkhPTApe209Y1tuKzEyPj4yXXwwO2lmKChtfDApPT0oY1tuKzE2Pj4yXXwwKSl7bT1vY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDB9ZWxzZXttPWNbbT4+Ml18MH1pZigobXwwKT09LTEpe2NbYj4+Ml09MDttPTE7YnJlYWt9ZWxzZXttPShjW2I+PjJdfDApPT0wO2JyZWFrfX1lbHNle209MX19d2hpbGUoMCk7aWYoKGV8MCkhPTApe249Y1tlKzEyPj4yXXwwO2lmKChufDApPT0oY1tlKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDB9ZWxzZXtuPWNbbj4+Ml18MH1pZighKChufDApPT0tMSkpe2lmKCFtKXticmVha319ZWxzZXtCPTM5Nn19ZWxzZXtCPTM5Nn1pZigoQnwwKT09Mzk2KXtCPTA7aWYobSl7YnJlYWt9ZWxzZXtlPTB9fW09Y1tiPj4yXXwwO249Y1ttKzEyPj4yXXwwO2lmKChufDApPT0oY1ttKzE2Pj4yXXwwKSl7bT1vY1tjWyhjW20+PjJdfDApKzM2Pj4yXSYxMjddKG0pfDB9ZWxzZXttPWNbbj4+Ml18MH1pZigoYVtQPj4wXSYxKT09MCl7bj1sfWVsc2V7bj1jW0Y+PjJdfDB9aWYoKG18MCkhPShjW24rKGs8PDIpPj4yXXwwKSl7YnJlYWt9az1rKzF8MDtnPWNbYj4+Ml18MDtuPWcrMTJ8MDttPWNbbj4+Ml18MDtpZigobXwwKT09KGNbZysxNj4+Ml18MCkpe29jW2NbKGNbZz4+Ml18MCkrNDA+PjJdJjEyN10oZyl8MDtjb250aW51ZX1lbHNle2Nbbj4+Ml09bSs0O2NvbnRpbnVlfX1jW2o+PjJdPWNbaj4+Ml18NDtiPTA7YnJlYWsgZX19d2hpbGUoMCk7aWYoKFR8MCkhPShVfDApKXtjW0E+PjJdPTA7cWsodCxULFUsQSk7aWYoKGNbQT4+Ml18MCk9PTApe2I9MX1lbHNle2Nbaj4+Ml09Y1tqPj4yXXw0O2I9MH19ZWxzZXtiPTE7VD1VfWJyZWFrfX1pZighKChhW3M+PjBdJjEpPT0wKT8oej1jW0U+PjJdfDAsKHp8MCkhPTApOjApe3ZuKHopfWlmKCEoKGFbcj4+MF0mMSk9PTApPyh5PWNbRD4+Ml18MCwoeXwwKSE9MCk6MCl7dm4oeSl9aWYoISgoYVt4Pj4wXSYxKT09MCk/KHU9Y1tDPj4yXXwwLCh1fDApIT0wKTowKXt2bih1KX1pZighKChhW3c+PjBdJjEpPT0wKT8ocT1jW2g+PjJdfDAsKHF8MCkhPTApOjApe3ZuKHEpfWlmKCEoKGFbdD4+MF0mMSk9PTApPyhwPWNbdCs4Pj4yXXwwLChwfDApIT0wKTowKXt2bihwKX1pZigoVHwwKT09MCl7aT12O3JldHVybiBifDB9bGNbUiYyNTVdKFQpO2k9djtyZXR1cm4gYnwwfWZ1bmN0aW9uIHZrKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTA7bT1pO2k9aSs0MzJ8MDtwPW07cz1tKzI0fDA7ZD1tKzE2fDA7cT1tKzEyfDA7dD1tKzQyNHwwO2NbZD4+Ml09cztsPWQrNHwwO2NbbD4+Ml09MjEzO3M9cys0MDB8MDtuPWNbaCsyOD4+Ml18MDt2PW4rNHwwO2Nbdj4+Ml09KGNbdj4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbcD4+Ml09MTM0NDg7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzQ0OCxwKX1wPShjWzEzNDUyPj4yXXwwKSsgLTF8MDt1PWNbbis4Pj4yXXwwO2lmKChjW24rMTI+PjJdfDApLXU+PjI+Pj4wPnA+Pj4wPyhyPWNbdSsocDw8Mik+PjJdfDAsKHJ8MCkhPTApOjApe2FbdD4+MF09MDtwPWNbZj4+Ml18MDtkb3tpZih1ayhlLHAsZyxuLGNbaCs0Pj4yXXwwLGosdCxyLGQscSxzKXwwKXtpZigoYVtrPj4wXSYxKT09MCl7Y1trKzQ+PjJdPTA7YVtrPj4wXT0wfWVsc2V7Y1tjW2srOD4+Ml0+PjJdPTA7Y1trKzQ+PjJdPTB9aWYoKGFbdD4+MF18MCkhPTApe2c9eGNbY1soY1tyPj4yXXwwKSs0ND4+Ml0mNjNdKHIsNDUpfDA7aD1hW2s+PjBdfDA7bz0oaCYxKSE9MDtpZihvKXtzPShjW2s+PjJdJi0yKSsgLTF8MDtoPWNbays0Pj4yXXwwfWVsc2V7cz0xO2g9KGgmMjU1KT4+PjF9aWYoKGh8MCk9PShzfDApKXtwZyhrLHMsMSxzLHMsMCwwKTtpZigoYVtrPj4wXSYxKT09MCl7bz0yMX1lbHNle289MjJ9fWVsc2V7aWYobyl7bz0yMn1lbHNle289MjF9fWlmKChvfDApPT0yMSl7YVtrPj4wXT0oaDw8MSkrMjt0PWsrNHwwO3M9aCsxfDB9ZWxzZSBpZigob3wwKT09MjIpe3Q9Y1trKzg+PjJdfDA7cz1oKzF8MDtjW2srND4+Ml09c31jW3QrKGg8PDIpPj4yXT1nO2NbdCsoczw8Mik+PjJdPTB9cj14Y1tjWyhjW3I+PjJdfDApKzQ0Pj4yXSY2M10ociw0OCl8MDtzPWNbZD4+Ml18MDtxPWNbcT4+Ml18MDtoPXErIC00fDA7YTpkb3tpZihzPj4+MDxoPj4+MCl7d2hpbGUoMSl7Zz1zKzR8MDtpZigoY1tzPj4yXXwwKSE9KHJ8MCkpe2JyZWFrIGF9aWYoZz4+PjA8aD4+PjApe3M9Z31lbHNle3M9ZzticmVha319fX13aGlsZSgwKTt0PXM7cj1hW2s+PjBdfDA7aWYoKHImMSk9PTApe3Y9cjt1PTE7Zz0ociYyNTUpPj4+MX1lbHNle3U9Y1trPj4yXXwwO3Y9dSYyNTU7dT0odSYtMikrIC0xfDA7Zz1jW2srND4+Ml18MH1yPXEtdD4+MjtpZigocnwwKSE9MCl7aWYoKHUtZ3wwKT4+PjA8cj4+PjApe3BnKGssdSxnK3ItdXwwLGcsZywwLDApO3Y9YVtrPj4wXXwwfWlmKCh2JjEpPT0wKXt1PWsrNHwwfWVsc2V7dT1jW2srOD4+Ml18MH12PXUrKGc8PDIpfDA7aWYoKHN8MCkhPShxfDApKXtoPWcrKChoKygwLXQpfDApPj4+MikrMXwwO3doaWxlKDEpe2Nbdj4+Ml09Y1tzPj4yXTtzPXMrNHwwO2lmKChzfDApPT0ocXwwKSl7YnJlYWt9dj12KzR8MH12PXUrKGg8PDIpfDB9Y1t2Pj4yXT0wO3E9ZytyfDA7aWYoKGFbaz4+MF0mMSk9PTApe2Fbaz4+MF09cTw8MTticmVha31lbHNle2Nbays0Pj4yXT1xO2JyZWFrfX19fXdoaWxlKDApO2s9Y1tlPj4yXXwwO2lmKChrfDApIT0wKXtxPWNbaysxMj4+Ml18MDtpZigocXwwKT09KGNbaysxNj4+Ml18MCkpe3E9b2NbY1soY1trPj4yXXwwKSszNj4+Ml0mMTI3XShrKXwwfWVsc2V7cT1jW3E+PjJdfDB9aWYoKHF8MCk9PS0xKXtjW2U+PjJdPTA7az0wO2U9MX1lbHNle2U9MH19ZWxzZXtrPTA7ZT0xfWRve2lmKChwfDApIT0wKXtxPWNbcCsxMj4+Ml18MDtpZigocXwwKT09KGNbcCsxNj4+Ml18MCkpe3A9b2NbY1soY1twPj4yXXwwKSszNj4+Ml0mMTI3XShwKXwwfWVsc2V7cD1jW3E+PjJdfDB9aWYoISgocHwwKT09LTEpKXtpZihlKXticmVha31lbHNle289NjA7YnJlYWt9fWVsc2V7Y1tmPj4yXT0wO289NTg7YnJlYWt9fWVsc2V7bz01OH19d2hpbGUoMCk7aWYoKG98MCk9PTU4P2U6MCl7bz02MH1pZigob3wwKT09NjApe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09azt1PW4rNHwwO3Y9Y1t1Pj4yXXwwO2NbdT4+Ml09disgLTE7aWYoKHZ8MCk9PTApe2xjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKX1qPWNbZD4+Ml18MDtjW2Q+PjJdPTA7aWYoKGp8MCk9PTApe2k9bTtyZXR1cm59bGNbY1tsPj4yXSYyNTVdKGopO2k9bTtyZXR1cm59dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gd2soYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geGsoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIHlrKGIsZCxlLGYsZyxqLGwpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9anwwO2w9K2w7dmFyIG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MDtxPWk7aT1pKzM2OHwwO0E9cTtDPXErMTU2fDA7RT1xKzEzMnwwO0I9cSsyNTZ8MDt0PXErMTQ4fDA7cz1xKzM1NnwwO3I9cSszNTd8MDt4PXErMTM2fDA7ZD1xKzEwNHwwO3c9cSsxMTZ8MDtGPXErMTAwfDA7dj1xKzEyOHwwO3U9cSsxNTJ8MDtjW0U+PjJdPUM7aFtrPj4zXT1sO2NbQT4+Ml09Y1trPj4yXTtjW0ErND4+Ml09Y1trKzQ+PjJdO0M9bGIoQ3wwLDEwMCwxMzIyNCxBfDApfDA7aWYoQz4+PjA+OTkpe2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1DPWNbMzM0MF18MDtoW2s+PjNdPWw7Y1tBPj4yXT1jW2s+PjJdO2NbQSs0Pj4yXT1jW2srND4+Ml07Qz1DaShFLEMsMTMyMjQsQSl8MDt6PWNbRT4+Ml18MDtpZigoenwwKT09MCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9Qj11bihDKXwwO2lmKChCfDApPT0wKXtIPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX1lbHNle3k9Qn19ZWxzZXt5PTA7ej0wfUQ9Y1tnKzI4Pj4yXXwwO0g9RCs0fDA7Y1tIPj4yXT0oY1tIPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tBPj4yXT0xMzQ1NjtjW0ErND4+Ml09MjA4O2NbQSs4Pj4yXT0wO2NnKDEzNDU2LEEpfUc9KGNbMTM0NjA+PjJdfDApKyAtMXwwO0g9Y1tEKzg+PjJdfDA7aWYoKGNbRCsxMj4+Ml18MCktSD4+Mj4+PjA+Rz4+PjA/KHA9Y1tIKyhHPDwyKT4+Ml18MCwocHwwKSE9MCk6MCl7SD1jW0U+PjJdfDA7dWNbY1soY1twPj4yXXwwKSszMj4+Ml0mMzFdKHAsSCxIK0N8MCxCKXwwO2lmKChDfDApPT0wKXtFPTB9ZWxzZXtFPShhW2NbRT4+Ml0+PjBdfDApPT00NX1jW3Q+PjJdPTA7Y1t4KzA+PjJdPTA7Y1t4KzQ+PjJdPTA7Y1t4Kzg+PjJdPTA7Y1tkKzA+PjJdPTA7Y1tkKzQ+PjJdPTA7Y1tkKzg+PjJdPTA7Y1t3KzA+PjJdPTA7Y1t3KzQ+PjJdPTA7Y1t3Kzg+PjJdPTA7emsoZixFLEQsdCxzLHIseCxkLHcsRik7Zj1jW0Y+PjJdfDA7aWYoKEN8MCk+KGZ8MCkpe0Y9YVt3Pj4wXXwwO2lmKChGJjEpPT0wKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW3crND4+Ml18MH1HPWFbZD4+MF18MDtpZigoRyYxKT09MCl7Rz0oRyYyNTUpPj4+MX1lbHNle0c9Y1tkKzQ+PjJdfDB9Rj1GKyhDLWY8PDF8MSkrR3wwfWVsc2V7Rj1hW3c+PjBdfDA7aWYoKEYmMSk9PTApe0Y9KEYmMjU1KT4+PjF9ZWxzZXtGPWNbdys0Pj4yXXwwfUc9YVtkPj4wXXwwO2lmKChHJjEpPT0wKXtHPShHJjI1NSk+Pj4xfWVsc2V7Rz1jW2QrND4+Ml18MH1GPUYrMitHfDB9Rj1GK2Z8MDtpZihGPj4+MD4xMDApe0E9dW4oRil8MDtpZigoQXwwKT09MCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9ZWxzZXtGPUF9fWVsc2V7Rj0wfUFrKEEsdix1LGNbZys0Pj4yXXwwLEIsQitDfDAscCxFLHQsYVtzPj4wXXwwLGFbcj4+MF18MCx4LGQsdyxmKTtXYyhiLGNbZT4+Ml18MCxBLGNbdj4+Ml18MCxjW3U+PjJdfDAsZyxqKTtpZigoRnwwKSE9MCl7dm4oRil9aWYoISgoYVt3Pj4wXSYxKT09MCk/KG49Y1t3Kzg+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKCEoKGFbZD4+MF0mMSk9PTApPyhvPWNbZCs4Pj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhW3g+PjBdJjEpPT0wKT8obT1jW3grOD4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9Rz1EKzR8MDtIPWNbRz4+Ml18MDtjW0c+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW0Q+PjJdfDApKzg+PjJdJjI1NV0oRCl9aWYoKHl8MCkhPTApe3ZuKHkpfWlmKCh6fDApPT0wKXtpPXE7cmV0dXJufXZuKHopO2k9cTtyZXR1cm59SD1YYSg0KXwwO2NbSD4+Ml09MjEzMDQ7d2IoSHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gemsoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTA7bj1pO2k9aSsxMjh8MDtBPW47eD1uKzEyfDA7bz1uKzQwfDA7dj1uKzUyfDA7dz1uKzU2fDA7dT1uKzE2fDA7ej1uKzI4fDA7cj1uKzY4fDA7cT1uKzcyfDA7dD1uKzg0fDA7cz1uKzg4fDA7cD1uKzEwMHwwO3k9bisxMTJ8MDtpZihiKXtpZighKChjWzMyMjhdfDApPT0tMSkpe2NbQT4+Ml09MTI5MTI7Y1tBKzQ+PjJdPTIwODtjW0ErOD4+Ml09MDtjZygxMjkxMixBKX1xPShjWzEyOTE2Pj4yXXwwKSsgLTF8MDtwPWNbZSs4Pj4yXXwwO2lmKCEoKGNbZSsxMj4+Ml18MCktcD4+Mj4+PjA+cT4+PjApKXtiPVhhKDQpfDA7Y1tiPj4yXT0yMTMwNDt3YihifDAsMjEzNzYsMTk2KX1wPWNbcCsocTw8Mik+PjJdfDA7aWYoKHB8MCk9PTApe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfXE9Y1twPj4yXXwwO2lmKGQpe21jW2NbcSs0ND4+Ml0mMTI3XSh4LHApO2I9Y1t4Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbcD4+Ml18MCkrMzI+PjJdJjEyN10obyxwKTtpZigoYVtsPj4wXSYxKT09MCl7YVtsKzE+PjBdPTA7YVtsPj4wXT0wfWVsc2V7YVtjW2wrOD4+Ml0+PjBdPTA7Y1tsKzQ+PjJdPTB9aWcobCk7Y1tsKzA+PjJdPWNbbyswPj4yXTtjW2wrND4+Ml09Y1tvKzQ+PjJdO2NbbCs4Pj4yXT1jW28rOD4+Ml07Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTB9ZWxzZXttY1tjW3ErNDA+PjJdJjEyN10odixwKTtiPWNbdj4+Ml18MDthW2Y+PjBdPWI7YVtmKzE+PjBdPWI+Pjg7YVtmKzI+PjBdPWI+PjE2O2FbZiszPj4wXT1iPj4yNDttY1tjWyhjW3A+PjJdfDApKzI4Pj4yXSYxMjddKHcscCk7aWYoKGFbbD4+MF0mMSk9PTApe2FbbCsxPj4wXT0wO2FbbD4+MF09MH1lbHNle2FbY1tsKzg+PjJdPj4wXT0wO2NbbCs0Pj4yXT0wfWlnKGwpO2NbbCswPj4yXT1jW3crMD4+Ml07Y1tsKzQ+PjJdPWNbdys0Pj4yXTtjW2wrOD4+Ml09Y1t3Kzg+PjJdO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wfWFbZz4+MF09b2NbY1soY1twPj4yXXwwKSsxMj4+Ml0mMTI3XShwKXwwO2FbaD4+MF09b2NbY1soY1twPj4yXXwwKSsxNj4+Ml0mMTI3XShwKXwwO21jW2NbKGNbcD4+Ml18MCkrMjA+PjJdJjEyN10odSxwKTtpZigoYVtqPj4wXSYxKT09MCl7YVtqKzE+PjBdPTA7YVtqPj4wXT0wfWVsc2V7YVtjW2orOD4+Ml0+PjBdPTA7Y1tqKzQ+PjJdPTB9aWcoaik7Y1tqKzA+PjJdPWNbdSswPj4yXTtjW2orND4+Ml09Y1t1KzQ+PjJdO2Nbais4Pj4yXT1jW3UrOD4+Ml07Y1t1KzA+PjJdPTA7Y1t1KzQ+PjJdPTA7Y1t1Kzg+PjJdPTA7bWNbY1soY1twPj4yXXwwKSsyND4+Ml0mMTI3XSh6LHApO2lmKChhW2s+PjBdJjEpPT0wKXthW2srMT4+MF09MDthW2s+PjBdPTB9ZWxzZXthW2Nbays4Pj4yXT4+MF09MDtjW2srND4+Ml09MH1pZyhrKTtjW2srMD4+Ml09Y1t6KzA+PjJdO2Nbays0Pj4yXT1jW3orND4+Ml07Y1trKzg+PjJdPWNbeis4Pj4yXTtjW3orMD4+Ml09MDtjW3orND4+Ml09MDtjW3orOD4+Ml09MDtiPW9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MDtjW20+PjJdPWI7aT1uO3JldHVybn1lbHNle2lmKCEoKGNbMzIxMl18MCk9PS0xKSl7Y1tBPj4yXT0xMjg0ODtjW0ErND4+Ml09MjA4O2NbQSs4Pj4yXT0wO2NnKDEyODQ4LEEpfXU9KGNbMTI4NTI+PjJdfDApKyAtMXwwO289Y1tlKzg+PjJdfDA7aWYoISgoY1tlKzEyPj4yXXwwKS1vPj4yPj4+MD51Pj4+MCkpe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfW89Y1tvKyh1PDwyKT4+Ml18MDtpZigob3wwKT09MCl7Yj1YYSg0KXwwO2NbYj4+Ml09MjEzMDQ7d2IoYnwwLDIxMzc2LDE5Nil9ZT1jW28+PjJdfDA7aWYoZCl7bWNbY1tlKzQ0Pj4yXSYxMjddKHIsbyk7Yj1jW3I+PjJdfDA7YVtmPj4wXT1iO2FbZisxPj4wXT1iPj44O2FbZisyPj4wXT1iPj4xNjthW2YrMz4+MF09Yj4+MjQ7bWNbY1soY1tvPj4yXXwwKSszMj4+Ml0mMTI3XShxLG8pO2lmKChhW2w+PjBdJjEpPT0wKXthW2wrMT4+MF09MDthW2w+PjBdPTB9ZWxzZXthW2NbbCs4Pj4yXT4+MF09MDtjW2wrND4+Ml09MH1pZyhsKTtjW2wrMD4+Ml09Y1txKzA+PjJdO2NbbCs0Pj4yXT1jW3ErND4+Ml07Y1tsKzg+PjJdPWNbcSs4Pj4yXTtjW3ErMD4+Ml09MDtjW3ErND4+Ml09MDtjW3ErOD4+Ml09MH1lbHNle21jW2NbZSs0MD4+Ml0mMTI3XSh0LG8pO2I9Y1t0Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbbz4+Ml18MCkrMjg+PjJdJjEyN10ocyxvKTtpZigoYVtsPj4wXSYxKT09MCl7YVtsKzE+PjBdPTA7YVtsPj4wXT0wfWVsc2V7YVtjW2wrOD4+Ml0+PjBdPTA7Y1tsKzQ+PjJdPTB9aWcobCk7Y1tsKzA+PjJdPWNbcyswPj4yXTtjW2wrND4+Ml09Y1tzKzQ+PjJdO2NbbCs4Pj4yXT1jW3MrOD4+Ml07Y1tzKzA+PjJdPTA7Y1tzKzQ+PjJdPTA7Y1tzKzg+PjJdPTB9YVtnPj4wXT1vY1tjWyhjW28+PjJdfDApKzEyPj4yXSYxMjddKG8pfDA7YVtoPj4wXT1vY1tjWyhjW28+PjJdfDApKzE2Pj4yXSYxMjddKG8pfDA7bWNbY1soY1tvPj4yXXwwKSsyMD4+Ml0mMTI3XShwLG8pO2lmKChhW2o+PjBdJjEpPT0wKXthW2orMT4+MF09MDthW2o+PjBdPTB9ZWxzZXthW2Nbais4Pj4yXT4+MF09MDtjW2orND4+Ml09MH1pZyhqKTtjW2orMD4+Ml09Y1twKzA+PjJdO2Nbais0Pj4yXT1jW3ArND4+Ml07Y1tqKzg+PjJdPWNbcCs4Pj4yXTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDttY1tjWyhjW28+PjJdfDApKzI0Pj4yXSYxMjddKHksbyk7aWYoKGFbaz4+MF0mMSk9PTApe2FbaysxPj4wXT0wO2Fbaz4+MF09MH1lbHNle2FbY1trKzg+PjJdPj4wXT0wO2Nbays0Pj4yXT0wfWlnKGspO2NbayswPj4yXT1jW3krMD4+Ml07Y1trKzQ+PjJdPWNbeSs0Pj4yXTtjW2srOD4+Ml09Y1t5Kzg+PjJdO2NbeSswPj4yXT0wO2NbeSs0Pj4yXT0wO2NbeSs4Pj4yXT0wO2I9b2NbY1soY1tvPj4yXXwwKSszNj4+Ml0mMTI3XShvKXwwO2NbbT4+Ml09YjtpPW47cmV0dXJufX1mdW5jdGlvbiBBayhkLGUsZixnLGgsaixrLGwsbSxuLG8scCxxLHIscyl7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7bz1vfDA7cD1wfDA7cT1xfDA7cj1yfDA7cz1zfDA7dmFyIHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MDt0PWk7Y1tmPj4yXT1kO3Y9cisxfDA7dz1yKzh8MDt1PXIrNHwwO3g9KGcmNTEyfDApPT0wO0Q9cSsxfDA7SD1xKzh8MDtJPXErNHwwO0E9KHN8MCk+MDtCPXArMXwwO0U9cCs4fDA7eT1wKzR8MDtDPWsrOHwwO3o9MC1zfDA7Sj0wO2Rve3N3aXRjaChhW20rSj4+MF18MCl7Y2FzZSAwOntjW2U+PjJdPWNbZj4+Ml07YnJlYWt9O2Nhc2UgNDp7Sz1jW2Y+PjJdfDA7aD1sP2grMXwwOmg7YTpkb3tpZihoPj4+MDxqPj4+MCl7TD1oO3doaWxlKDEpe049YVtMPj4wXXwwO2lmKCEoTjw8MjQ+PjI0Pi0xKSl7YnJlYWsgYX1NPUwrMXwwO2lmKChiWyhjW0M+PjJdfDApKyhOPDwyND4+MjQ8PDEpPj4xXSYyMDQ4KT09MCl7YnJlYWsgYX1pZihNPj4+MDxqPj4+MCl7TD1NfWVsc2V7TD1NO2JyZWFrfX19ZWxzZXtMPWh9fXdoaWxlKDApO009TDtpZihBKXtpZihMPj4+MD5oPj4+MCl7Tj1oKygwLU0pfDA7Tj1OPj4+MDx6Pj4+MD96Ok47TT1OK3N8MDtRPUs7UD1MO089czt3aGlsZSgxKXtQPVArIC0xfDA7Uj1hW1A+PjBdfDA7Y1tmPj4yXT1RKzE7YVtRPj4wXT1SO089TysgLTF8MDtRPShPfDApPjA7aWYoIShQPj4+MD5oPj4+MCZRKSl7YnJlYWt9UT1jW2Y+PjJdfDB9TD1MK058MDtpZihRKXtHPTMyfWVsc2V7Tj0wfX1lbHNle009cztHPTMyfWlmKChHfDApPT0zMil7Rz0wO049eGNbY1soY1trPj4yXXwwKSsyOD4+Ml0mNjNdKGssNDgpfDB9Tz1jW2Y+PjJdfDA7Y1tmPj4yXT1PKzE7aWYoKE18MCk+MCl7ZG97YVtPPj4wXT1OO009TSsgLTF8MDtPPWNbZj4+Ml18MDtjW2Y+PjJdPU8rMX13aGlsZSgoTXwwKT4wKX1hW08+PjBdPW59aWYoKEx8MCk9PShofDApKXtRPXhjW2NbKGNbaz4+Ml18MCkrMjg+PjJdJjYzXShrLDQ4KXwwO1I9Y1tmPj4yXXwwO2NbZj4+Ml09UisxO2FbUj4+MF09UX1lbHNle049YVtwPj4wXXwwO009KE4mMSk9PTA7aWYoTSl7Tj0oTiYyNTUpPj4+MX1lbHNle049Y1t5Pj4yXXwwfWlmKChOfDApPT0wKXtNPS0xO049MDtPPTB9ZWxzZXtpZihNKXtNPUJ9ZWxzZXtNPWNbRT4+Ml18MH1NPWFbTT4+MF18MDtOPTA7Tz0wfXdoaWxlKDEpe2lmKChPfDApPT0oTXwwKSl7UD1jW2Y+PjJdfDA7Y1tmPj4yXT1QKzE7YVtQPj4wXT1vO049TisxfDA7UD1hW3A+PjBdfDA7Tz0oUCYxKT09MDtpZihPKXtQPShQJjI1NSk+Pj4xfWVsc2V7UD1jW3k+PjJdfDB9aWYoTj4+PjA8UD4+PjApe2lmKE8pe009Qn1lbHNle009Y1tFPj4yXXwwfWlmKChhW00rTj4+MF18MCk9PTEyNyl7TT0tMTtPPTB9ZWxzZXtpZihPKXtNPUJ9ZWxzZXtNPWNbRT4+Ml18MH1NPWFbTStOPj4wXXwwO089MH19ZWxzZXtPPTB9fUw9TCsgLTF8MDtRPWFbTD4+MF18MDtSPWNbZj4+Ml18MDtjW2Y+PjJdPVIrMTthW1I+PjBdPVE7aWYoKEx8MCk9PShofDApKXticmVha31lbHNle089TysxfDB9fX1MPWNbZj4+Ml18MDtpZigoS3wwKSE9KEx8MCk/KEY9TCsgLTF8MCxGPj4+MD5LPj4+MCk6MCl7TD1GO2Rve1I9YVtLPj4wXXwwO2FbSz4+MF09YVtMPj4wXXwwO2FbTD4+MF09UjtLPUsrMXwwO0w9TCsgLTF8MH13aGlsZShLPj4+MDxMPj4+MCl9YnJlYWt9O2Nhc2UgMjp7TD1hW3E+PjBdfDA7TT0oTCYxKT09MDtpZihNKXtLPShMJjI1NSk+Pj4xfWVsc2V7Sz1jW0k+PjJdfDB9aWYoISgoS3wwKT09MHx4KSl7aWYoTSl7Sz1EO0w9KEwmMjU1KT4+PjF9ZWxzZXtLPWNbSD4+Ml18MDtMPWNbST4+Ml18MH1MPUsrTHwwO009Y1tmPj4yXXwwO2lmKChLfDApIT0oTHwwKSl7ZG97YVtNPj4wXT1hW0s+PjBdfDA7Sz1LKzF8MDtNPU0rMXwwfXdoaWxlKChLfDApIT0oTHwwKSl9Y1tmPj4yXT1NfWJyZWFrfTtjYXNlIDM6e0w9YVtyPj4wXXwwO0s9KEwmMSk9PTA7aWYoSyl7TD0oTCYyNTUpPj4+MX1lbHNle0w9Y1t1Pj4yXXwwfWlmKChMfDApIT0wKXtpZihLKXtLPXZ9ZWxzZXtLPWNbdz4+Ml18MH1RPWFbSz4+MF18MDtSPWNbZj4+Ml18MDtjW2Y+PjJdPVIrMTthW1I+PjBdPVF9YnJlYWt9O2Nhc2UgMTp7Y1tlPj4yXT1jW2Y+PjJdO1E9eGNbY1soY1trPj4yXXwwKSsyOD4+Ml0mNjNdKGssMzIpfDA7Uj1jW2Y+PjJdfDA7Y1tmPj4yXT1SKzE7YVtSPj4wXT1RO2JyZWFrfTtkZWZhdWx0Ont9fUo9SisxfDB9d2hpbGUoKEp8MCkhPTQpO2s9YVtyPj4wXXwwO3g9KGsmMSk9PTA7aWYoeCl7cj0oayYyNTUpPj4+MX1lbHNle3I9Y1t1Pj4yXXwwfWlmKHI+Pj4wPjEpe2lmKHgpe3U9KGsmMjU1KT4+PjF9ZWxzZXt2PWNbdz4+Ml18MDt1PWNbdT4+Ml18MH13PXYrMXwwO3U9dit1fDA7dj1jW2Y+PjJdfDA7aWYoKHd8MCkhPSh1fDApKXtkb3thW3Y+PjBdPWFbdz4+MF18MDt3PXcrMXwwO3Y9disxfDB9d2hpbGUoKHd8MCkhPSh1fDApKX1jW2Y+PjJdPXZ9Zz1nJjE3NjtpZigoZ3wwKT09MTYpe2k9dDtyZXR1cm59ZWxzZSBpZigoZ3wwKT09MzIpe2NbZT4+Ml09Y1tmPj4yXTtpPXQ7cmV0dXJufWVsc2V7Y1tlPj4yXT1kO2k9dDtyZXR1cm59fWZ1bmN0aW9uIEJrKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wO3A9aTtpPWkrMTYwfDA7eD1wO3Q9cCsxNDB8MDtzPXArMTUyfDA7cj1wKzE1M3wwO3E9cCsxMTJ8MDt2PXArMTAwfDA7ZD1wKzEyOHwwO3o9cCsxMjR8MDt3PXArMTQ0fDA7dT1wKzE0OHwwO289Y1tnKzI4Pj4yXXwwO0Q9bys0fDA7Y1tEPj4yXT0oY1tEPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1t4Pj4yXT0xMzQ1NjtjW3grND4+Ml09MjA4O2NbeCs4Pj4yXT0wO2NnKDEzNDU2LHgpfXk9KGNbMTM0NjA+PjJdfDApKyAtMXwwO0E9Y1tvKzg+PjJdfDA7aWYoKGNbbysxMj4+Ml18MCktQT4+Mj4+PjA+eT4+PjA/KGw9Y1tBKyh5PDwyKT4+Ml18MCwobHwwKSE9MCk6MCl7QT1hW2o+PjBdfDA7eT0oQSYxKT09MDtpZih5KXtBPShBJjI1NSk+Pj4xfWVsc2V7QT1jW2orND4+Ml18MH1pZigoQXwwKT09MCl7eT0wfWVsc2V7aWYoeSl7eT1qKzF8MH1lbHNle3k9Y1tqKzg+PjJdfDB9eT1hW3k+PjBdfDA7eT15PDwyND4+MjQ9PSh4Y1tjWyhjW2w+PjJdfDApKzI4Pj4yXSY2M10obCw0NSl8MCk8PDI0Pj4yNH1jW3Q+PjJdPTA7Y1txKzA+PjJdPTA7Y1txKzQ+PjJdPTA7Y1txKzg+PjJdPTA7Y1t2KzA+PjJdPTA7Y1t2KzQ+PjJdPTA7Y1t2Kzg+PjJdPTA7Y1tkKzA+PjJdPTA7Y1tkKzQ+PjJdPTA7Y1tkKzg+PjJdPTA7emsoZix5LG8sdCxzLHIscSx2LGQseik7Zj1hW2o+PjBdfDA7QT0oZiYxKT09MDtpZihBKXtCPShmJjI1NSk+Pj4xfWVsc2V7Qj1jW2orND4+Ml18MH16PWNbej4+Ml18MDtpZigoQnwwKT4oenwwKSl7aWYoQSl7Qj0oZiYyNTUpPj4+MX1lbHNle0I9Y1tqKzQ+PjJdfDB9Qz1hW2Q+PjBdfDA7aWYoKEMmMSk9PTApe0M9KEMmMjU1KT4+PjF9ZWxzZXtDPWNbZCs0Pj4yXXwwfUQ9YVt2Pj4wXXwwO2lmKChEJjEpPT0wKXtEPShEJjI1NSk+Pj4xfWVsc2V7RD1jW3YrND4+Ml18MH1CPUMrKEItejw8MXwxKStEfDB9ZWxzZXtCPWFbZD4+MF18MDtpZigoQiYxKT09MCl7Qj0oQiYyNTUpPj4+MX1lbHNle0I9Y1tkKzQ+PjJdfDB9Qz1hW3Y+PjBdfDA7aWYoKEMmMSk9PTApe0M9KEMmMjU1KT4+PjF9ZWxzZXtDPWNbdis0Pj4yXXwwfUI9QisyK0N8MH1CPUIrenwwO2lmKEI+Pj4wPjEwMCl7eD11bihCKXwwO2lmKCh4fDApPT0wKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1lbHNle0I9eH19ZWxzZXtCPTB9aWYoQSl7QT1qKzF8MDtqPShmJjI1NSk+Pj4xfWVsc2V7QT1jW2orOD4+Ml18MDtqPWNbais0Pj4yXXwwfUFrKHgsdyx1LGNbZys0Pj4yXXwwLEEsQStqfDAsbCx5LHQsYVtzPj4wXXwwLGFbcj4+MF18MCxxLHYsZCx6KTtXYyhiLGNbZT4+Ml18MCx4LGNbdz4+Ml18MCxjW3U+PjJdfDAsZyxoKTtpZigoQnwwKSE9MCl7dm4oQil9aWYoISgoYVtkPj4wXSYxKT09MCk/KG09Y1tkKzg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbdj4+MF0mMSk9PTApPyhuPWNbdis4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhW3E+PjBdJjEpPT0wKT8oaz1jW3ErOD4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9Qz1vKzR8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXtpPXA7cmV0dXJufWxjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKTtpPXA7cmV0dXJufUQ9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIENrKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIERrKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBFayhiLGQsZSxmLGcsaixsKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPWp8MDtsPStsO3ZhciBtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTA7cT1pO2k9aSs5NzZ8MDtBPXE7Qz1xKzg2OHwwO0U9cSs4MTZ8MDtCPXErNDE2fDA7dD1xKzQwOHwwO3M9cSs4NjB8MDtyPXErNDAwfDA7eD1xKzgyNHwwO2Q9cSs4MzZ8MDt3PXErODQ4fDA7Rj1xKzgyMHwwO3Y9cSs0MDR8MDt1PXErODY0fDA7Y1tFPj4yXT1DO2hbaz4+M109bDtjW0E+PjJdPWNbaz4+Ml07Y1tBKzQ+PjJdPWNbays0Pj4yXTtDPWxiKEN8MCwxMDAsMTMyMjQsQXwwKXwwO2lmKEM+Pj4wPjk5KXtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9Qz1jWzMzNDBdfDA7aFtrPj4zXT1sO2NbQT4+Ml09Y1trPj4yXTtjW0ErND4+Ml09Y1trKzQ+PjJdO0M9Q2koRSxDLDEzMjI0LEEpfDA7ej1jW0U+PjJdfDA7aWYoKHp8MCk9PTApe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfUI9dW4oQzw8Mil8MDtpZigoQnwwKT09MCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9ZWxzZXt5PUJ9fWVsc2V7eT0wO3o9MH1EPWNbZysyOD4+Ml18MDtIPUQrNHwwO2NbSD4+Ml09KGNbSD4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbQT4+Ml09MTM0NDg7Y1tBKzQ+PjJdPTIwODtjW0ErOD4+Ml09MDtjZygxMzQ0OCxBKX1HPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtIPWNbRCs4Pj4yXXwwO2lmKChjW0QrMTI+PjJdfDApLUg+PjI+Pj4wPkc+Pj4wPyhwPWNbSCsoRzw8Mik+PjJdfDAsKHB8MCkhPTApOjApe0g9Y1tFPj4yXXwwO3VjW2NbKGNbcD4+Ml18MCkrNDg+PjJdJjMxXShwLEgsSCtDfDAsQil8MDtpZigoQ3wwKT09MCl7RT0wfWVsc2V7RT0oYVtjW0U+PjJdPj4wXXwwKT09NDV9Y1t0Pj4yXT0wO2NbeCswPj4yXT0wO2NbeCs0Pj4yXT0wO2NbeCs4Pj4yXT0wO2NbZCswPj4yXT0wO2NbZCs0Pj4yXT0wO2NbZCs4Pj4yXT0wO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wO0ZrKGYsRSxELHQscyxyLHgsZCx3LEYpO2Y9Y1tGPj4yXXwwO2lmKChDfDApPihmfDApKXtGPWFbdz4+MF18MDtpZigoRiYxKT09MCl7Rj0oRiYyNTUpPj4+MX1lbHNle0Y9Y1t3KzQ+PjJdfDB9Rz1hW2Q+PjBdfDA7aWYoKEcmMSk9PTApe0c9KEcmMjU1KT4+PjF9ZWxzZXtHPWNbZCs0Pj4yXXwwfUY9RisoQy1mPDwxfDEpK0d8MH1lbHNle0Y9YVt3Pj4wXXwwO2lmKChGJjEpPT0wKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW3crND4+Ml18MH1HPWFbZD4+MF18MDtpZigoRyYxKT09MCl7Rz0oRyYyNTUpPj4+MX1lbHNle0c9Y1tkKzQ+PjJdfDB9Rj1GKzIrR3wwfUY9RitmfDA7aWYoRj4+PjA+MTAwKXtBPXVuKEY8PDIpfDA7aWYoKEF8MCk9PTApe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfWVsc2V7Rj1BfX1lbHNle0Y9MH1HayhBLHYsdSxjW2crND4+Ml18MCxCLEIrKEM8PDIpfDAscCxFLHQsY1tzPj4yXXwwLGNbcj4+Ml18MCx4LGQsdyxmKTtMaShiLGNbZT4+Ml18MCxBLGNbdj4+Ml18MCxjW3U+PjJdfDAsZyxqKTtpZigoRnwwKSE9MCl7dm4oRil9aWYoISgoYVt3Pj4wXSYxKT09MCk/KG49Y1t3Kzg+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKCEoKGFbZD4+MF0mMSk9PTApPyhvPWNbZCs4Pj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhW3g+PjBdJjEpPT0wKT8obT1jW3grOD4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9Rz1EKzR8MDtIPWNbRz4+Ml18MDtjW0c+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW0Q+PjJdfDApKzg+PjJdJjI1NV0oRCl9aWYoKHl8MCkhPTApe3ZuKHkpfWlmKCh6fDApPT0wKXtpPXE7cmV0dXJufXZuKHopO2k9cTtyZXR1cm59SD1YYSg0KXwwO2NbSD4+Ml09MjEzMDQ7d2IoSHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gRmsoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTA7bj1pO2k9aSsxMjh8MDtBPW47eD1uKzEyfDA7bz1uKzQwfDA7dj1uKzUyfDA7dz1uKzU2fDA7dT1uKzE2fDA7ej1uKzI4fDA7cj1uKzY4fDA7cT1uKzcyfDA7dD1uKzg0fDA7cz1uKzg4fDA7cD1uKzEwMHwwO3k9bisxMTJ8MDtpZihiKXtpZighKChjWzMyNjBdfDApPT0tMSkpe2NbQT4+Ml09MTMwNDA7Y1tBKzQ+PjJdPTIwODtjW0ErOD4+Ml09MDtjZygxMzA0MCxBKX1xPShjWzEzMDQ0Pj4yXXwwKSsgLTF8MDtwPWNbZSs4Pj4yXXwwO2lmKCEoKGNbZSsxMj4+Ml18MCktcD4+Mj4+PjA+cT4+PjApKXtiPVhhKDQpfDA7Y1tiPj4yXT0yMTMwNDt3YihifDAsMjEzNzYsMTk2KX1wPWNbcCsocTw8Mik+PjJdfDA7aWYoKHB8MCk9PTApe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfXE9Y1twPj4yXXwwO2lmKGQpe21jW2NbcSs0ND4+Ml0mMTI3XSh4LHApO2I9Y1t4Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbcD4+Ml18MCkrMzI+PjJdJjEyN10obyxwKTtpZigoYVtsPj4wXSYxKT09MCl7Y1tsKzQ+PjJdPTA7YVtsPj4wXT0wfWVsc2V7Y1tjW2wrOD4+Ml0+PjJdPTA7Y1tsKzQ+PjJdPTB9b2cobCk7Y1tsKzA+PjJdPWNbbyswPj4yXTtjW2wrND4+Ml09Y1tvKzQ+PjJdO2NbbCs4Pj4yXT1jW28rOD4+Ml07Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTB9ZWxzZXttY1tjW3ErNDA+PjJdJjEyN10odixwKTtiPWNbdj4+Ml18MDthW2Y+PjBdPWI7YVtmKzE+PjBdPWI+Pjg7YVtmKzI+PjBdPWI+PjE2O2FbZiszPj4wXT1iPj4yNDttY1tjWyhjW3A+PjJdfDApKzI4Pj4yXSYxMjddKHcscCk7aWYoKGFbbD4+MF0mMSk9PTApe2NbbCs0Pj4yXT0wO2FbbD4+MF09MH1lbHNle2NbY1tsKzg+PjJdPj4yXT0wO2NbbCs0Pj4yXT0wfW9nKGwpO2NbbCswPj4yXT1jW3crMD4+Ml07Y1tsKzQ+PjJdPWNbdys0Pj4yXTtjW2wrOD4+Ml09Y1t3Kzg+PjJdO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wfWNbZz4+Ml09b2NbY1soY1twPj4yXXwwKSsxMj4+Ml0mMTI3XShwKXwwO2NbaD4+Ml09b2NbY1soY1twPj4yXXwwKSsxNj4+Ml0mMTI3XShwKXwwO21jW2NbKGNbcD4+Ml18MCkrMjA+PjJdJjEyN10odSxwKTtpZigoYVtqPj4wXSYxKT09MCl7YVtqKzE+PjBdPTA7YVtqPj4wXT0wfWVsc2V7YVtjW2orOD4+Ml0+PjBdPTA7Y1tqKzQ+PjJdPTB9aWcoaik7Y1tqKzA+PjJdPWNbdSswPj4yXTtjW2orND4+Ml09Y1t1KzQ+PjJdO2Nbais4Pj4yXT1jW3UrOD4+Ml07Y1t1KzA+PjJdPTA7Y1t1KzQ+PjJdPTA7Y1t1Kzg+PjJdPTA7bWNbY1soY1twPj4yXXwwKSsyND4+Ml0mMTI3XSh6LHApO2lmKChhW2s+PjBdJjEpPT0wKXtjW2srND4+Ml09MDthW2s+PjBdPTB9ZWxzZXtjW2Nbays4Pj4yXT4+Ml09MDtjW2srND4+Ml09MH1vZyhrKTtjW2srMD4+Ml09Y1t6KzA+PjJdO2Nbays0Pj4yXT1jW3orND4+Ml07Y1trKzg+PjJdPWNbeis4Pj4yXTtjW3orMD4+Ml09MDtjW3orND4+Ml09MDtjW3orOD4+Ml09MDtiPW9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MDtjW20+PjJdPWI7aT1uO3JldHVybn1lbHNle2lmKCEoKGNbMzI0NF18MCk9PS0xKSl7Y1tBPj4yXT0xMjk3NjtjW0ErND4+Ml09MjA4O2NbQSs4Pj4yXT0wO2NnKDEyOTc2LEEpfXU9KGNbMTI5ODA+PjJdfDApKyAtMXwwO289Y1tlKzg+PjJdfDA7aWYoISgoY1tlKzEyPj4yXXwwKS1vPj4yPj4+MD51Pj4+MCkpe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfW89Y1tvKyh1PDwyKT4+Ml18MDtpZigob3wwKT09MCl7Yj1YYSg0KXwwO2NbYj4+Ml09MjEzMDQ7d2IoYnwwLDIxMzc2LDE5Nil9ZT1jW28+PjJdfDA7aWYoZCl7bWNbY1tlKzQ0Pj4yXSYxMjddKHIsbyk7Yj1jW3I+PjJdfDA7YVtmPj4wXT1iO2FbZisxPj4wXT1iPj44O2FbZisyPj4wXT1iPj4xNjthW2YrMz4+MF09Yj4+MjQ7bWNbY1soY1tvPj4yXXwwKSszMj4+Ml0mMTI3XShxLG8pO2lmKChhW2w+PjBdJjEpPT0wKXtjW2wrND4+Ml09MDthW2w+PjBdPTB9ZWxzZXtjW2NbbCs4Pj4yXT4+Ml09MDtjW2wrND4+Ml09MH1vZyhsKTtjW2wrMD4+Ml09Y1txKzA+PjJdO2NbbCs0Pj4yXT1jW3ErND4+Ml07Y1tsKzg+PjJdPWNbcSs4Pj4yXTtjW3ErMD4+Ml09MDtjW3ErND4+Ml09MDtjW3ErOD4+Ml09MH1lbHNle21jW2NbZSs0MD4+Ml0mMTI3XSh0LG8pO2I9Y1t0Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbbz4+Ml18MCkrMjg+PjJdJjEyN10ocyxvKTtpZigoYVtsPj4wXSYxKT09MCl7Y1tsKzQ+PjJdPTA7YVtsPj4wXT0wfWVsc2V7Y1tjW2wrOD4+Ml0+PjJdPTA7Y1tsKzQ+PjJdPTB9b2cobCk7Y1tsKzA+PjJdPWNbcyswPj4yXTtjW2wrND4+Ml09Y1tzKzQ+PjJdO2NbbCs4Pj4yXT1jW3MrOD4+Ml07Y1tzKzA+PjJdPTA7Y1tzKzQ+PjJdPTA7Y1tzKzg+PjJdPTB9Y1tnPj4yXT1vY1tjWyhjW28+PjJdfDApKzEyPj4yXSYxMjddKG8pfDA7Y1toPj4yXT1vY1tjWyhjW28+PjJdfDApKzE2Pj4yXSYxMjddKG8pfDA7bWNbY1soY1tvPj4yXXwwKSsyMD4+Ml0mMTI3XShwLG8pO2lmKChhW2o+PjBdJjEpPT0wKXthW2orMT4+MF09MDthW2o+PjBdPTB9ZWxzZXthW2Nbais4Pj4yXT4+MF09MDtjW2orND4+Ml09MH1pZyhqKTtjW2orMD4+Ml09Y1twKzA+PjJdO2Nbais0Pj4yXT1jW3ArND4+Ml07Y1tqKzg+PjJdPWNbcCs4Pj4yXTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDttY1tjWyhjW28+PjJdfDApKzI0Pj4yXSYxMjddKHksbyk7aWYoKGFbaz4+MF0mMSk9PTApe2Nbays0Pj4yXT0wO2Fbaz4+MF09MH1lbHNle2NbY1trKzg+PjJdPj4yXT0wO2Nbays0Pj4yXT0wfW9nKGspO2NbayswPj4yXT1jW3krMD4+Ml07Y1trKzQ+PjJdPWNbeSs0Pj4yXTtjW2srOD4+Ml09Y1t5Kzg+PjJdO2NbeSswPj4yXT0wO2NbeSs0Pj4yXT0wO2NbeSs4Pj4yXT0wO2I9b2NbY1soY1tvPj4yXXwwKSszNj4+Ml0mMTI3XShvKXwwO2NbbT4+Ml09YjtpPW47cmV0dXJufX1mdW5jdGlvbiBHayhiLGQsZSxmLGcsaCxqLGssbCxtLG4sbyxwLHEscil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7bz1vfDA7cD1wfDA7cT1xfDA7cj1yfDA7dmFyIHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wO3M9aTtjW2U+PjJdPWI7dD1xKzR8MDt1PXErOHwwO3k9KGYmNTEyfDApPT0wO3g9cCs0fDA7QT1wKzh8MDt3PShyfDApPjA7Qj1vKzF8MDtDPW8rOHwwO0Q9bys0fDA7RT0wO2Rve3N3aXRjaChhW2wrRT4+MF18MCl7Y2FzZSAyOntGPWFbcD4+MF18MDtIPShGJjEpPT0wO2lmKEgpe0c9KEYmMjU1KT4+PjF9ZWxzZXtHPWNbeD4+Ml18MH1pZighKChHfDApPT0wfHkpKXtpZihIKXtIPXg7ST0oRiYyNTUpPj4+MX1lbHNle0g9Y1tBPj4yXXwwO0k9Y1t4Pj4yXXwwfUc9SCsoSTw8Mil8MDtGPWNbZT4+Ml18MDtpZigoSHwwKSE9KEd8MCkpe0o9KEgrKEkrIC0xPDwyKSsoMC1IKXwwKT4+PjI7ST1GO3doaWxlKDEpe2NbST4+Ml09Y1tIPj4yXTtIPUgrNHwwO2lmKChIfDApPT0oR3wwKSl7YnJlYWt9ST1JKzR8MH1GPUYrKEorMTw8Mil8MH1jW2U+PjJdPUZ9YnJlYWt9O2Nhc2UgMzp7Rz1hW3E+PjBdfDA7Rj0oRyYxKT09MDtpZihGKXtHPShHJjI1NSk+Pj4xfWVsc2V7Rz1jW3Q+PjJdfDB9aWYoKEd8MCkhPTApe2lmKEYpe0Y9dH1lbHNle0Y9Y1t1Pj4yXXwwfUw9Y1tGPj4yXXwwO009Y1tlPj4yXXwwO2NbZT4+Ml09TSs0O2NbTT4+Ml09TH1icmVha307Y2FzZSA0OntGPWNbZT4+Ml18MDtnPWs/Zys0fDA6ZzthOmRve2lmKGc+Pj4wPGg+Pj4wKXtHPWc7d2hpbGUoMSl7SD1HKzR8MDtpZighKGhjW2NbKGNbaj4+Ml18MCkrMTI+PjJdJjYzXShqLDIwNDgsY1tHPj4yXXwwKXwwKSl7YnJlYWsgYX1pZihIPj4+MDxoPj4+MCl7Rz1IfWVsc2V7Rz1IO2JyZWFrfX19ZWxzZXtHPWd9fXdoaWxlKDApO2lmKHcpe2lmKEc+Pj4wPmc+Pj4wKXtIPWNbZT4+Ml18MDtJPXI7d2hpbGUoMSl7Rz1HKyAtNHwwO0s9SCs0fDA7Y1tIPj4yXT1jW0c+PjJdO0k9SSsgLTF8MDtKPShJfDApPjA7aWYoIShHPj4+MD5nPj4+MCZKKSl7YnJlYWt9ZWxzZXtIPUt9fWNbZT4+Ml09SztpZihKKXt6PTM0fWVsc2V7Y1tlPj4yXT1IKzh9fWVsc2V7ST1yO3o9MzR9aWYoKHp8MCk9PTM0KXt6PTA7Sj14Y1tjWyhjW2o+PjJdfDApKzQ0Pj4yXSY2M10oaiw0OCl8MDtLPWNbZT4+Ml18MDtNPUsrNHwwO2NbZT4+Ml09TTtpZigoSXwwKT4wKXtIPUs7TD1JO3doaWxlKDEpe2NbSD4+Ml09SjtMPUwrIC0xfDA7aWYoKEx8MCk8PTApe2JyZWFrfWVsc2V7SD1NO009TSs0fDB9fWNbZT4+Ml09SysoSSsxPDwyKTtLPUsrKEk8PDIpfDB9fWNbSz4+Ml09bX1pZigoR3wwKT09KGd8MCkpe0s9eGNbY1soY1tqPj4yXXwwKSs0ND4+Ml0mNjNdKGosNDgpfDA7TT1jW2U+PjJdfDA7TD1NKzR8MDtjW2U+PjJdPUw7Y1tNPj4yXT1LfWVsc2V7ST1hW28+PjBdfDA7SD0oSSYxKT09MDtpZihIKXtJPShJJjI1NSk+Pj4xfWVsc2V7ST1jW0Q+PjJdfDB9aWYoKEl8MCk9PTApe0g9LTF9ZWxzZXtpZihIKXtIPUJ9ZWxzZXtIPWNbQz4+Ml18MH1IPWFbSD4+MF18MH1JPWNbZT4+Ml18MDtLPTA7Sj0wO3doaWxlKDEpe2lmKChKfDApPT0oSHwwKSl7Sj1JKzR8MDtjW2U+PjJdPUo7Y1tJPj4yXT1uO0s9SysxfDA7TD1hW28+PjBdfDA7ST0oTCYxKT09MDtpZihJKXtMPShMJjI1NSk+Pj4xfWVsc2V7TD1jW0Q+PjJdfDB9aWYoSz4+PjA8TD4+PjApe2lmKEkpe0g9Qn1lbHNle0g9Y1tDPj4yXXwwfWlmKChhW0grSz4+MF18MCk9PTEyNyl7ST1KO0g9LTE7Sj0wfWVsc2V7aWYoSSl7SD1CfWVsc2V7SD1jW0M+PjJdfDB9ST1KO0g9YVtIK0s+PjBdfDA7Sj0wfX1lbHNle0k9SjtKPTB9fUc9RysgLTR8MDtNPWNbRz4+Ml18MDtMPUkrNHwwO2NbZT4+Ml09TDtjW0k+PjJdPU07aWYoKEd8MCk9PShnfDApKXticmVha31lbHNle0k9TDtKPUorMXwwfX19aWYoKEZ8MCkhPShMfDApPyh2PUwrIC00fDAsdj4+PjA+Rj4+PjApOjApe0c9djtkb3tNPWNbRj4+Ml18MDtjW0Y+PjJdPWNbRz4+Ml07Y1tHPj4yXT1NO0Y9Ris0fDA7Rz1HKyAtNHwwfXdoaWxlKEY+Pj4wPEc+Pj4wKX1icmVha307Y2FzZSAxOntjW2Q+PjJdPWNbZT4+Ml07TD14Y1tjWyhjW2o+PjJdfDApKzQ0Pj4yXSY2M10oaiwzMil8MDtNPWNbZT4+Ml18MDtjW2U+PjJdPU0rNDtjW00+PjJdPUw7YnJlYWt9O2Nhc2UgMDp7Y1tkPj4yXT1jW2U+PjJdO2JyZWFrfTtkZWZhdWx0Ont9fUU9RSsxfDB9d2hpbGUoKEV8MCkhPTQpO3c9YVtxPj4wXXwwO3Y9KHcmMSk9PTA7aWYodil7cT0odyYyNTUpPj4+MX1lbHNle3E9Y1t0Pj4yXXwwfWlmKHE+Pj4wPjEpe2lmKHYpe3Y9dDtxPSh3JjI1NSk+Pj4xfWVsc2V7dj1jW3U+PjJdfDA7cT1jW3Q+PjJdfDB9dz12KzR8MDt1PXYrKHE8PDIpfDA7dD1jW2U+PjJdfDA7aWYoKHd8MCkhPSh1fDApKXtxPSh2KyhxKyAtMTw8MikrKDAtdyl8MCk+Pj4yO3Y9dDt3aGlsZSgxKXtjW3Y+PjJdPWNbdz4+Ml07dz13KzR8MDtpZigod3wwKT09KHV8MCkpe2JyZWFrfWVsc2V7dj12KzR8MH19dD10KyhxKzE8PDIpfDB9Y1tlPj4yXT10fWY9ZiYxNzY7aWYoKGZ8MCk9PTE2KXtpPXM7cmV0dXJufWVsc2UgaWYoKGZ8MCk9PTMyKXtjW2Q+PjJdPWNbZT4+Ml07aT1zO3JldHVybn1lbHNle2NbZD4+Ml09YjtpPXM7cmV0dXJufX1mdW5jdGlvbiBIayhiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtwPWk7aT1pKzQ2NHwwO3g9cDt0PXArNDM2fDA7cz1wKzQ0MHwwO3I9cCs0NDR8MDtxPXArNDEyfDA7dj1wKzQwMHwwO2Q9cCs0MjR8MDt6PXArNDQ4fDA7dz1wKzQ1MnwwO3U9cCs0NTZ8MDtvPWNbZysyOD4+Ml18MDtEPW8rNHwwO2NbRD4+Ml09KGNbRD4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbeD4+Ml09MTM0NDg7Y1t4KzQ+PjJdPTIwODtjW3grOD4+Ml09MDtjZygxMzQ0OCx4KX15PShjWzEzNDUyPj4yXXwwKSsgLTF8MDtBPWNbbys4Pj4yXXwwO2lmKChjW28rMTI+PjJdfDApLUE+PjI+Pj4wPnk+Pj4wPyhsPWNbQSsoeTw8Mik+PjJdfDAsKGx8MCkhPTApOjApe0E9YVtqPj4wXXwwO3k9KEEmMSk9PTA7aWYoeSl7QT0oQSYyNTUpPj4+MX1lbHNle0E9Y1tqKzQ+PjJdfDB9aWYoKEF8MCk9PTApe3k9MH1lbHNle2lmKHkpe3k9ais0fDB9ZWxzZXt5PWNbais4Pj4yXXwwfXk9Y1t5Pj4yXXwwO3k9KHl8MCk9PSh4Y1tjWyhjW2w+PjJdfDApKzQ0Pj4yXSY2M10obCw0NSl8MCl9Y1t0Pj4yXT0wO2NbcSswPj4yXT0wO2NbcSs0Pj4yXT0wO2NbcSs4Pj4yXT0wO2NbdiswPj4yXT0wO2Nbdis0Pj4yXT0wO2Nbdis4Pj4yXT0wO2NbZCswPj4yXT0wO2NbZCs0Pj4yXT0wO2NbZCs4Pj4yXT0wO0ZrKGYseSxvLHQscyxyLHEsdixkLHopO2Y9YVtqPj4wXXwwO0E9KGYmMSk9PTA7aWYoQSl7Qj0oZiYyNTUpPj4+MX1lbHNle0I9Y1tqKzQ+PjJdfDB9ej1jW3o+PjJdfDA7aWYoKEJ8MCk+KHp8MCkpe2lmKEEpe0I9KGYmMjU1KT4+PjF9ZWxzZXtCPWNbais0Pj4yXXwwfUM9YVtkPj4wXXwwO2lmKChDJjEpPT0wKXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW2QrND4+Ml18MH1EPWFbdj4+MF18MDtpZigoRCYxKT09MCl7RD0oRCYyNTUpPj4+MX1lbHNle0Q9Y1t2KzQ+PjJdfDB9Qj1DKyhCLXo8PDF8MSkrRHwwfWVsc2V7Qj1hW2Q+PjBdfDA7aWYoKEImMSk9PTApe0I9KEImMjU1KT4+PjF9ZWxzZXtCPWNbZCs0Pj4yXXwwfUM9YVt2Pj4wXXwwO2lmKChDJjEpPT0wKXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW3YrND4+Ml18MH1CPUIrMitDfDB9Qj1CK3p8MDtpZihCPj4+MD4xMDApe3g9dW4oQjw8Mil8MDtpZigoeHwwKT09MCl7RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9ZWxzZXtCPXh9fWVsc2V7Qj0wfWlmKEEpe0E9ais0fDA7aj0oZiYyNTUpPj4+MX1lbHNle0E9Y1tqKzg+PjJdfDA7aj1jW2orND4+Ml18MH1Hayh4LHcsdSxjW2crND4+Ml18MCxBLEErKGo8PDIpfDAsbCx5LHQsY1tzPj4yXXwwLGNbcj4+Ml18MCxxLHYsZCx6KTtMaShiLGNbZT4+Ml18MCx4LGNbdz4+Ml18MCxjW3U+PjJdfDAsZyxoKTtpZigoQnwwKSE9MCl7dm4oQil9aWYoISgoYVtkPj4wXSYxKT09MCk/KG09Y1tkKzg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbdj4+MF0mMSk9PTApPyhuPWNbdis4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhW3E+PjBdJjEpPT0wKT8oaz1jW3ErOD4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9Qz1vKzR8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXtpPXA7cmV0dXJufWxjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKTtpPXA7cmV0dXJufUQ9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIElrKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEprKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBLayhiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Yj1pO2lmKChhW2Q+PjBdJjEpPT0wKXtkPWQrMXwwfWVsc2V7ZD1jW2QrOD4+Ml18MH1lPWRjKGR8MCwxKXwwO2k9YjtyZXR1cm4gZT4+PigoZXwwKSE9KC0xfDApJjEpfDB9ZnVuY3Rpb24gTGsoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7ZD1pO2k9aSsxNnwwO2o9ZDtjW2orMD4+Ml09MDtjW2orND4+Ml09MDtjW2orOD4+Ml09MDtrPWFbaD4+MF18MDtpZigoayYxKT09MCl7cD1oKzF8MDtoPShrJjI1NSk+Pj4xfWVsc2V7cD1jW2grOD4+Ml18MDtoPWNbaCs0Pj4yXXwwfW09cCtofDA7aWYocD4+PjA8bT4+PjApe249ais0fDA7bD1qKzF8MDtrPWorOHwwO3E9MDtkb3tvPWFbcD4+MF18MDtoPShxJjEpIT0wO2lmKGgpe3I9KGNbaj4+Ml0mLTIpKyAtMXwwO3E9Y1tuPj4yXXwwfWVsc2V7cj0xMDtxPShxJjI1NSk+Pj4xfWlmKChxfDApPT0ocnwwKSl7bGcoaixyLDEscixyLDApO2lmKChhW2o+PjBdJjEpPT0wKXtoPTE0fWVsc2V7aD0xNX19ZWxzZXtpZihoKXtoPTE1fWVsc2V7aD0xNH19aWYoKGh8MCk9PTE0KXthW2o+PjBdPShxPDwxKSsyO3I9bDtzPXErMXwwfWVsc2UgaWYoKGh8MCk9PTE1KXtyPWNbaz4+Ml18MDtzPXErMXwwO2Nbbj4+Ml09c31hW3IrcT4+MF09bzthW3Ircz4+MF09MDtwPXArMXwwO3E9YVtqPj4wXXwwfXdoaWxlKChwfDApIT0obXwwKSk7aD0oZXwwKT09LTE/LTE6ZTw8MTtlPShxJjEpPT0wP2w6Y1trPj4yXXwwfWVsc2V7aD0oZXwwKT09LTE/LTE6ZTw8MTtlPWorMXwwfWw9amIoaHwwLGZ8MCxnfDAsZXwwKXwwO2NbYiswPj4yXT0wO2NbYis0Pj4yXT0wO2NbYis4Pj4yXT0wO3M9Sm4obHwwKXwwO2s9bCtzfDA7YTpkb3tpZigoc3wwKT4wKXtmPWIrNHwwO2c9YisxfDA7ZT1iKzh8MDtuPTA7d2hpbGUoMSl7bT1hW2w+PjBdfDA7aD0obiYxKSE9MDtpZihoKXtvPShjW2I+PjJdJi0yKSsgLTF8MDtuPWNbZj4+Ml18MH1lbHNle289MTA7bj0obiYyNTUpPj4+MX1pZigobnwwKT09KG98MCkpe2xnKGIsbywxLG8sbywwKTtpZigoYVtiPj4wXSYxKT09MCl7aD0yOH1lbHNle2g9Mjl9fWVsc2V7aWYoaCl7aD0yOX1lbHNle2g9Mjh9fWlmKChofDApPT0yOCl7YVtiPj4wXT0objw8MSkrMjtwPWc7bz1uKzF8MH1lbHNlIGlmKChofDApPT0yOSl7cD1jW2U+PjJdfDA7bz1uKzF8MDtjW2Y+PjJdPW99YVtwK24+PjBdPW07YVtwK28+PjBdPTA7bD1sKzF8MDtpZigobHwwKT09KGt8MCkpe2JyZWFrIGF9bj1hW2I+PjBdfDB9fX13aGlsZSgwKTtpZigoYVtqPj4wXSYxKT09MCl7aT1kO3JldHVybn1iPWNbais4Pj4yXXwwO2lmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gTWsoYSxiKXthPWF8MDtiPWJ8MDthPWk7WWIoKChifDApPT0tMT8tMTpiPDwxKXwwKXwwO2k9YTtyZXR1cm59ZnVuY3Rpb24gTmsoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gT2soYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFBrKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDtiPWk7aWYoKGFbZD4+MF0mMSk9PTApe2Q9ZCsxfDB9ZWxzZXtkPWNbZCs4Pj4yXXwwfWU9ZGMoZHwwLDEpfDA7aT1iO3JldHVybiBlPj4+KChlfDApIT0oLTF8MCkmMSl8MH1mdW5jdGlvbiBRayhiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wO2Q9aTtpPWkrMTc2fDA7bT1kO249ZCs0MHwwO2s9ZCsxNjh8MDtsPWQrMTcyfDA7bz1kKzE2fDA7cj1kKzh8MDtqPWQrMzJ8MDtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtjW3IrND4+Ml09MDtjW3I+PjJdPTE1MDcyO3M9YVtoPj4wXXwwO2lmKChzJjEpPT0wKXt3PWgrNHwwO2g9KHMmMjU1KT4+PjF9ZWxzZXt3PWNbaCs4Pj4yXXwwO2g9Y1toKzQ+PjJdfDB9dj13KyhoPDwyKXwwO0E9bTtjW0E+PjJdPTA7Y1tBKzQ+PjJdPTA7ZG97aWYodz4+PjA8dj4+PjApe3Q9biszMnwwO3U9bys0fDA7cz1vKzF8MDtoPW8rOHwwO3g9MTUwNzJ8MDt3aGlsZSgxKXtjW2w+PjJdPXc7QT0odGNbY1t4KzEyPj4yXSYzMV0ocixtLHcsdixsLG4sdCxrKXwwKT09Mjt4PWNbbD4+Ml18MDtpZihBfCh4fDApPT0od3wwKSl7YnJlYWt9aWYobj4+PjA8KGNbaz4+Ml18MCk+Pj4wKXt4PW47ZG97dz1hW3g+PjBdfDA7eT1hW28+PjBdfDA7ej0oeSYxKSE9MDtpZih6KXtwPShjW28+PjJdJi0yKSsgLTF8MDt5PWNbdT4+Ml18MH1lbHNle3A9MTA7eT0oeSYyNTUpPj4+MX1pZigoeXwwKT09KHB8MCkpe2xnKG8scCwxLHAscCwwKTtpZigoYVtvPj4wXSYxKT09MCl7cD0xOH1lbHNle3A9MTl9fWVsc2V7aWYoeil7cD0xOX1lbHNle3A9MTh9fWlmKChwfDApPT0xOCl7cD0wO2Fbbz4+MF09KHk8PDEpKzI7QT1zO3o9eSsxfDB9ZWxzZSBpZigocHwwKT09MTkpe3A9MDtBPWNbaD4+Ml18MDt6PXkrMXwwO2NbdT4+Ml09en1hW0EreT4+MF09dzthW0Erej4+MF09MDt4PXgrMXwwfXdoaWxlKHg+Pj4wPChjW2s+PjJdfDApPj4+MCk7dz1jW2w+PjJdfDB9ZWxzZXt3PXh9aWYoISh3Pj4+MDx2Pj4+MCkpe3A9MjQ7YnJlYWt9eD1jW3I+PjJdfDB9aWYoKHB8MCk9PTI0KXtxPShhW28+PjBdJjEpPT0wO2JyZWFrfW9rKDE0Mjk2KX1lbHNle3E9MX19d2hpbGUoMCk7aWYocSl7cD1vKzF8MH1lbHNle3A9Y1tvKzg+PjJdfDB9cD1qYigoKGV8MCk9PS0xPy0xOmU8PDEpfDAsZnwwLGd8MCxwfDApfDA7Y1tiKzA+PjJdPTA7Y1tiKzQ+PjJdPTA7Y1tiKzg+PjJdPTA7Y1tqKzQ+PjJdPTA7Y1tqPj4yXT0xNTE3NjtBPUpuKHB8MCl8MDtxPXArQXwwO3o9bTtjW3o+PjJdPTA7Y1t6KzQ+PjJdPTA7YTpkb3tpZigoQXwwKT4wKXtlPXE7cj1uKzEyOHwwO2c9Yis0fDA7Zj1iKzh8MDtoPTE1MTc2fDA7d2hpbGUoMSl7Y1tsPj4yXT1wO0E9KHRjW2NbaCsxNj4+Ml0mMzFdKGosbSxwLChlLXB8MCk+MzI/cCszMnwwOnEsbCxuLHIsayl8MCk9PTI7aD1jW2w+PjJdfDA7aWYoQXwoaHwwKT09KHB8MCkpe2JyZWFrfWlmKG4+Pj4wPChjW2s+PjJdfDApPj4+MCl7cz1uO2Rve2g9Y1tzPj4yXXwwO3Q9YVtiPj4wXXwwO3U9KHQmMSkhPTA7aWYodSl7cD0oY1tiPj4yXSYtMikrIC0xfDA7dD1jW2c+PjJdfDB9ZWxzZXtwPTE7dD0odCYyNTUpPj4+MX1pZigodHwwKT09KHB8MCkpe3BnKGIscCwxLHAscCwwLDApO2lmKChhW2I+PjBdJjEpPT0wKXtwPTQzfWVsc2V7cD00NH19ZWxzZXtpZih1KXtwPTQ0fWVsc2V7cD00M319aWYoKHB8MCk9PTQzKXthW2I+PjBdPSh0PDwxKSsyO3Y9Zzt1PXQrMXwwfWVsc2UgaWYoKHB8MCk9PTQ0KXt2PWNbZj4+Ml18MDt1PXQrMXwwO2NbZz4+Ml09dX1jW3YrKHQ8PDIpPj4yXT1oO2NbdisodTw8Mik+PjJdPTA7cz1zKzR8MH13aGlsZShzPj4+MDwoY1trPj4yXXwwKT4+PjApO3A9Y1tsPj4yXXwwfWVsc2V7cD1ofWlmKCEocD4+PjA8cT4+PjApKXticmVhayBhfWg9Y1tqPj4yXXwwfW9rKDE0Mjk2KX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe2k9ZDtyZXR1cm59Yj1jW28rOD4+Ml18MDtpZigoYnwwKT09MCl7aT1kO3JldHVybn12bihiKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIFJrKGEsYil7YT1hfDA7Yj1ifDA7YT1pO1liKCgoYnwwKT09LTE/LTE6Yjw8MSl8MCl8MDtpPWE7cmV0dXJufWZ1bmN0aW9uIFNrKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNTQ0O2I9Yis4fDA7ZT1jW2I+PjJdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWlmKChlfDApPT0oY1szMzQwXXwwKSl7aT1kO3JldHVybn1WYihjW2I+PjJdfDApO2k9ZDtyZXR1cm59ZnVuY3Rpb24gVGsoKXt2YXIgYj0wLGQ9MCxlPTA7ZD1YYSg4KXwwO2NbZD4+Ml09OTkwNDt3aGlsZSgxKXtlPXVuKDE5KXwwO2lmKChlfDApIT0wKXtiPTc7YnJlYWt9ZT1jWzU2NjZdfDA7Y1s1NjY2XT1lKzA7aWYoKGV8MCk9PTApe2JyZWFrfXNjW2UmMzFdKCl9aWYoKGJ8MCk9PTcpe2NbZSs0Pj4yXT02O2NbZT4+Ml09NjtiPWUrMTJ8MDtjW2QrND4+Ml09YjtjW2UrOD4+Ml09MDthW2IrMD4+MF09YVsxMzM1Mj4+MF18MDthW2IrMT4+MF09YVsxMzM1Mz4+MF18MDthW2IrMj4+MF09YVsxMzM1ND4+MF18MDthW2IrMz4+MF09YVsxMzM1NT4+MF18MDthW2IrND4+MF09YVsxMzM1Nj4+MF18MDthW2IrNT4+MF09YVsxMzM1Nz4+MF18MDthW2IrNj4+MF09YVsxMzM1OD4+MF18MDtjW2Q+PjJdPTk5ODQ7d2IoZHwwLDEwMDI0LDEwNCl9ZT1YYSg0KXwwO2NbZT4+Ml09MjI2ODA7d2IoZXwwLDIyNzI4LDIwNil9ZnVuY3Rpb24gVWsoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtmPWk7aD1kKzR8MDtjW2g+PjJdPShjW2g+PjJdfDApKzE7aD1iKzEyfDA7bD1jW2g+PjJdfDA7Zz1iKzh8MDtrPWNbZz4+Ml18MDtxPWw7cD1rO2o9cS1wPj4yO2Rve2lmKCEoaj4+PjA+ZT4+PjApKXtvPWUrMXwwO2lmKCEoaj4+PjA8bz4+PjApKXtpZighKGo+Pj4wPm8+Pj4wKSl7YnJlYWt9aj1rKyhvPDwyKXwwO2lmKChsfDApPT0oanwwKSl7YnJlYWt9Y1toPj4yXT1sKyh+KChsKyAtNCsoMC1qKXwwKT4+PjIpPDwyKTticmVha31uPW8tanwwO2s9YisxNnwwO3I9Y1trPj4yXXwwO2Rve2lmKHItcT4+Mj4+PjA8bj4+PjApe2w9YisyNHwwO2lmKG8+Pj4wPjEwNzM3NDE4MjMpe1RrKCl9cD1yLXB8MDtpZihwPj4yPj4+MDw1MzY4NzA5MTEpe3I9cD4+MTtvPXI+Pj4wPG8+Pj4wP286cjtpZigob3wwKSE9MCl7cD1iKzEzNnwwO2lmKChhW3A+PjBdfDApPT0wJm8+Pj4wPDI5KXthW3A+PjBdPTE7cD1sfWVsc2V7bT0xNH19ZWxzZXtvPTA7cD0wfX1lbHNle289MTA3Mzc0MTgyMzttPTE0fWRve2lmKChtfDApPT0xNCl7cT1vPDwyO3E9KHF8MCk9PTA/MTpxO3doaWxlKDEpe3A9dW4ocSl8MDtpZigocHwwKSE9MCl7bT0yMDticmVha31wPWNbNTY2Nl18MDtjWzU2NjZdPXArMDtpZigocHwwKT09MCl7YnJlYWt9c2NbcCYzMV0oKX1pZigobXwwKT09MjApe2JyZWFrfXI9WGEoNCl8MDtjW3I+PjJdPTIyNjgwO3diKHJ8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTttPXArKGo8PDIpfDA7ZG97aWYoKG18MCk9PTApe209MH1lbHNle2NbbT4+Ml09MH1tPW0rNHwwO249bisgLTF8MH13aGlsZSgobnwwKSE9MCk7bj1jW2c+PjJdfDA7cT0oY1toPj4yXXwwKS1ufDA7cj1wKyhqLShxPj4yKTw8Mil8MDtMbihyfDAsbnwwLHF8MCl8MDtjW2c+PjJdPXI7Y1toPj4yXT1tO2Nbaz4+Ml09cCsobzw8Mik7aWYoKG58MCkhPTApe2lmKChsfDApPT0obnwwKSl7YVtiKzEzNj4+MF09MDticmVha31lbHNle3ZuKG4pO2JyZWFrfX19ZWxzZXtkb3tpZigobHwwKT09MCl7aj0wfWVsc2V7Y1tsPj4yXT0wO2o9Y1toPj4yXXwwfWw9ais0fDA7Y1toPj4yXT1sO249bisgLTF8MH13aGlsZSgobnwwKSE9MCl9fXdoaWxlKDApO2s9Y1tnPj4yXXwwfX13aGlsZSgwKTtoPWNbaysoZTw8Mik+PjJdfDA7aWYoKGh8MCk9PTApe3I9aztyPXIrKGU8PDIpfDA7Y1tyPj4yXT1kO2k9ZjtyZXR1cm59cT1oKzR8MDtyPWNbcT4+Ml18MDtjW3E+PjJdPXIrIC0xO2lmKChyfDApPT0wKXtsY1tjWyhjW2g+PjJdfDApKzg+PjJdJjI1NV0oaCl9cj1jW2c+PjJdfDA7cj1yKyhlPDwyKXwwO2Nbcj4+Ml09ZDtpPWY7cmV0dXJufWZ1bmN0aW9uIFZrKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1drKGEpO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFdrKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wO2U9aTtjW2I+PjJdPTEzMzkyO2Q9YisxMnwwO2o9Y1tkPj4yXXwwO2Y9Yis4fDA7az1jW2Y+PjJdfDA7aWYoKGp8MCkhPShrfDApKXtoPTA7d2hpbGUoMSl7bD1jW2srKGg8PDIpPj4yXXwwO2lmKChsfDApIT0wKXtqPWwrNHwwO2s9Y1tqPj4yXXwwO2Nbaj4+Ml09aysgLTE7aWYoKGt8MCk9PTApe2xjW2NbKGNbbD4+Ml18MCkrOD4+Ml0mMjU1XShsKX1qPWNbZD4+Ml18MDtrPWNbZj4+Ml18MH1oPWgrMXwwO2lmKCEoaD4+PjA8ai1rPj4yPj4+MCkpe2o9azticmVha319fWlmKCEoKGFbYisxNDQ+PjBdJjEpPT0wKT8oZz1jW2IrMTUyPj4yXXwwLChnfDApIT0wKTowKXt2bihnKTtqPWNbZj4+Ml18MH1pZigoanwwKT09MCl7aT1lO3JldHVybn1mPWNbZD4+Ml18MDtpZigoZnwwKSE9KGp8MCkpe2NbZD4+Ml09ZisofigoZisgLTQrKDAtail8MCk+Pj4yKTw8Mil9aWYoKGIrMjR8MCk9PShqfDApKXthW2IrMTM2Pj4wXT0wO2k9ZTtyZXR1cm59ZWxzZXt2bihqKTtpPWU7cmV0dXJufX0KCgoKZnVuY3Rpb24gWm4oYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGhjW2EmNjNdKGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIF9uKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoMCxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiAkbihhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGthKDEsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gYW8oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBrYSgyLGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIGJvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoMyxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBjbyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGthKDQsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gZW8oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBrYSg1LGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIGZvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoNixhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBnbyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGthKDcsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gaG8oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBrYSg4LGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIGlvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoOSxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBqbyhhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2ljW2EmNjNdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24ga28oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIGxvKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwKX1mdW5jdGlvbiBtbyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gbm8oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIG9vKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwKX1mdW5jdGlvbiBwbyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gcW8oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIHJvKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwKX1mdW5jdGlvbiBzbyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gdG8oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIHVvKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtqY1thJjMxXShifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiB2byhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gd28oYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtrYSgxLGF8MCxifDAsY3wwLGR8MCxlfDApfWZ1bmN0aW9uIHhvKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7a2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwKX1mdW5jdGlvbiB5byhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gem8oYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtrYSg0LGF8MCxifDAsY3wwLGR8MCxlfDApfWZ1bmN0aW9uIEFvKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7a2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwKX1mdW5jdGlvbiBCbyhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gQ28oYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtrYSg3LGF8MCxifDAsY3wwLGR8MCxlfDApfWZ1bmN0aW9uIERvKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7a2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwKX1mdW5jdGlvbiBFbyhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gRm8oYSl7YT1hfDA7cmV0dXJuIGtjW2EmMzFdKCl8MH1mdW5jdGlvbiBHbygpe3JldHVybiBrYSgwKXwwfWZ1bmN0aW9uIEhvKCl7cmV0dXJuIGthKDEpfDB9ZnVuY3Rpb24gSW8oKXtyZXR1cm4ga2EoMil8MH1mdW5jdGlvbiBKbygpe3JldHVybiBrYSgzKXwwfWZ1bmN0aW9uIEtvKCl7cmV0dXJuIGthKDQpfDB9ZnVuY3Rpb24gTG8oKXtyZXR1cm4ga2EoNSl8MH1mdW5jdGlvbiBNbygpe3JldHVybiBrYSg2KXwwfWZ1bmN0aW9uIE5vKCl7cmV0dXJuIGthKDcpfDB9ZnVuY3Rpb24gT28oKXtyZXR1cm4ga2EoOCl8MH1mdW5jdGlvbiBQbygpe3JldHVybiBrYSg5KXwwfWZ1bmN0aW9uIFFvKGEsYil7YT1hfDA7Yj1ifDA7bGNbYSYyNTVdKGJ8MCl9ZnVuY3Rpb24gUm8oYSl7YT1hfDA7a2EoMCxhfDApfWZ1bmN0aW9uIFNvKGEpe2E9YXwwO2thKDEsYXwwKX1mdW5jdGlvbiBUbyhhKXthPWF8MDtrYSgyLGF8MCl9ZnVuY3Rpb24gVW8oYSl7YT1hfDA7a2EoMyxhfDApfWZ1bmN0aW9uIFZvKGEpe2E9YXwwO2thKDQsYXwwKX1mdW5jdGlvbiBXbyhhKXthPWF8MDtrYSg1LGF8MCl9ZnVuY3Rpb24gWG8oYSl7YT1hfDA7a2EoNixhfDApfWZ1bmN0aW9uIFlvKGEpe2E9YXwwO2thKDcsYXwwKX1mdW5jdGlvbiBabyhhKXthPWF8MDtrYSg4LGF8MCl9ZnVuY3Rpb24gX28oYSl7YT1hfDA7a2EoOSxhfDApfWZ1bmN0aW9uICRvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDttY1thJjEyN10oYnwwLGN8MCl9ZnVuY3Rpb24gYXAoYSxiKXthPWF8MDtiPWJ8MDtrYSgwLGF8MCxifDApfWZ1bmN0aW9uIGJwKGEsYil7YT1hfDA7Yj1ifDA7a2EoMSxhfDAsYnwwKX1mdW5jdGlvbiBjcChhLGIpe2E9YXwwO2I9YnwwO2thKDIsYXwwLGJ8MCl9ZnVuY3Rpb24gZHAoYSxiKXthPWF8MDtiPWJ8MDtrYSgzLGF8MCxifDApfWZ1bmN0aW9uIGVwKGEsYil7YT1hfDA7Yj1ifDA7a2EoNCxhfDAsYnwwKX1mdW5jdGlvbiBmcChhLGIpe2E9YXwwO2I9YnwwO2thKDUsYXwwLGJ8MCl9ZnVuY3Rpb24gZ3AoYSxiKXthPWF8MDtiPWJ8MDtrYSg2LGF8MCxifDApfWZ1bmN0aW9uIGhwKGEsYil7YT1hfDA7Yj1ifDA7a2EoNyxhfDAsYnwwKX1mdW5jdGlvbiBpcChhLGIpe2E9YXwwO2I9YnwwO2thKDgsYXwwLGJ8MCl9ZnVuY3Rpb24ganAoYSxiKXthPWF8MDtiPWJ8MDtrYSg5LGF8MCxifDApfWZ1bmN0aW9uIGtwKGEsYixjLGQsZSxmLGcsaCxpLGope2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2o9anwwO25jW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDAsanwwKX1mdW5jdGlvbiBscChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gbXAoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIG5wKGEsYixjLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDAsaXwwKX1mdW5jdGlvbiBvcChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gcHAoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIHFwKGEsYixjLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDAsaXwwKX1mdW5jdGlvbiBycChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gc3AoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIHRwKGEsYixjLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDAsaXwwKX1mdW5jdGlvbiB1cChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gdnAoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4gb2NbYSYxMjddKGJ8MCl8MH1mdW5jdGlvbiB3cChhKXthPWF8MDtyZXR1cm4ga2EoMCxhfDApfDB9ZnVuY3Rpb24geHAoYSl7YT1hfDA7cmV0dXJuIGthKDEsYXwwKXwwfWZ1bmN0aW9uIHlwKGEpe2E9YXwwO3JldHVybiBrYSgyLGF8MCl8MH1mdW5jdGlvbiB6cChhKXthPWF8MDtyZXR1cm4ga2EoMyxhfDApfDB9ZnVuY3Rpb24gQXAoYSl7YT1hfDA7cmV0dXJuIGthKDQsYXwwKXwwfWZ1bmN0aW9uIEJwKGEpe2E9YXwwO3JldHVybiBrYSg1LGF8MCl8MH1mdW5jdGlvbiBDcChhKXthPWF8MDtyZXR1cm4ga2EoNixhfDApfDB9ZnVuY3Rpb24gRHAoYSl7YT1hfDA7cmV0dXJuIGthKDcsYXwwKXwwfWZ1bmN0aW9uIEVwKGEpe2E9YXwwO3JldHVybiBrYSg4LGF8MCl8MH1mdW5jdGlvbiBGcChhKXthPWF8MDtyZXR1cm4ga2EoOSxhfDApfDB9ZnVuY3Rpb24gR3AoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPStoO3BjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLCtoKX1mdW5jdGlvbiBIcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIElwKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9K2c7a2EoMSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCwrZyl9ZnVuY3Rpb24gSnAoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBLcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIExwKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9K2c7a2EoNCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCwrZyl9ZnVuY3Rpb24gTXAoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBOcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIE9wKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9K2c7a2EoNyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCwrZyl9ZnVuY3Rpb24gUHAoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBRcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIFJwKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3FjW2EmMzFdKGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBTcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoMCxhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gVHAoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2thKDEsYXwwLGJ8MCxjfDApfWZ1bmN0aW9uIFVwKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtrYSgyLGF8MCxifDAsY3wwKX1mdW5jdGlvbiBWcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoMyxhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gV3AoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2thKDQsYXwwLGJ8MCxjfDApfWZ1bmN0aW9uIFhwKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtrYSg1LGF8MCxifDAsY3wwKX1mdW5jdGlvbiBZcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoNixhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gWnAoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2thKDcsYXwwLGJ8MCxjfDApfWZ1bmN0aW9uIF9wKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtrYSg4LGF8MCxifDAsY3wwKX1mdW5jdGlvbiAkcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoOSxhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gYXEoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztyY1thJjMxXShifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBicShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSgwLGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGNxKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPStmO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCwrZil9ZnVuY3Rpb24gZHEoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9K2Y7a2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwLCtmKX1mdW5jdGlvbiBlcShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSgzLGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGZxKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPStmO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCwrZil9ZnVuY3Rpb24gZ3EoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9K2Y7a2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwLCtmKX1mdW5jdGlvbiBocShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSg2LGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGlxKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPStmO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCwrZil9ZnVuY3Rpb24ganEoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9K2Y7a2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwLCtmKX1mdW5jdGlvbiBrcShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSg5LGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGxxKGEpe2E9YXwwO3NjW2EmMzFdKCl9ZnVuY3Rpb24gbXEoKXtrYSgwKX1mdW5jdGlvbiBucSgpe2thKDEpfWZ1bmN0aW9uIG9xKCl7a2EoMil9ZnVuY3Rpb24gcHEoKXtrYSgzKX1mdW5jdGlvbiBxcSgpe2thKDQpfWZ1bmN0aW9uIHJxKCl7a2EoNSl9ZnVuY3Rpb24gc3EoKXtrYSg2KX1mdW5jdGlvbiB0cSgpe2thKDcpfWZ1bmN0aW9uIHVxKCl7a2EoOCl9ZnVuY3Rpb24gdnEoKXtrYSg5KX1mdW5jdGlvbiB3cShhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7cmV0dXJuIHRjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfDB9ZnVuY3Rpb24geHEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIHlxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7cmV0dXJuIGthKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl8MH1mdW5jdGlvbiB6cShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3JldHVybiBrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfDB9ZnVuY3Rpb24gQXEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIEJxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7cmV0dXJuIGthKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl8MH1mdW5jdGlvbiBDcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3JldHVybiBrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfDB9ZnVuY3Rpb24gRHEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIEVxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7cmV0dXJuIGthKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl8MH1mdW5jdGlvbiBGcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3JldHVybiBrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfDB9ZnVuY3Rpb24gR3EoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIEhxKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIHVjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBJcShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoMCxhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gSnEoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGthKDEsYXwwLGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIEtxKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3JldHVybiBrYSgyLGF8MCxifDAsY3wwLGR8MCl8MH1mdW5jdGlvbiBMcShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoMyxhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gTXEoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGthKDQsYXwwLGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIE5xKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3JldHVybiBrYSg1LGF8MCxifDAsY3wwLGR8MCl8MH1mdW5jdGlvbiBPcShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoNixhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gUHEoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGthKDcsYXwwLGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIFFxKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3JldHVybiBrYSg4LGF8MCxifDAsY3wwLGR8MCl8MH1mdW5jdGlvbiBScShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoOSxhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gU3EoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO3ZjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIFRxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBVcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24gVnEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfWZ1bmN0aW9uIFdxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBYcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24gWXEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfWZ1bmN0aW9uIFpxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBfcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24gJHEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfWZ1bmN0aW9uIGFyKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBicihhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt3Y1thJjYzXShifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gY3IoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIGRyKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtrYSgxLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiBlcihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7a2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCl9ZnVuY3Rpb24gZnIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIGdyKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtrYSg0LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiBocihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7a2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCl9ZnVuY3Rpb24gaXIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIGpyKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtrYSg3LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiBrcihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7a2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCl9ZnVuY3Rpb24gbHIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIG1yKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4geGNbYSY2M10oYnwwLGN8MCl8MH1mdW5jdGlvbiBucihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSgwLGF8MCxifDApfDB9ZnVuY3Rpb24gb3IoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4ga2EoMSxhfDAsYnwwKXwwfWZ1bmN0aW9uIHByKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGthKDIsYXwwLGJ8MCl8MH1mdW5jdGlvbiBxcihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSgzLGF8MCxifDApfDB9ZnVuY3Rpb24gcnIoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4ga2EoNCxhfDAsYnwwKXwwfWZ1bmN0aW9uIHNyKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGthKDUsYXwwLGJ8MCl8MH1mdW5jdGlvbiB0cihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSg2LGF8MCxifDApfDB9ZnVuY3Rpb24gdXIoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4ga2EoNyxhfDAsYnwwKXwwfWZ1bmN0aW9uIHZyKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGthKDgsYXwwLGJ8MCl8MH1mdW5jdGlvbiB3cihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSg5LGF8MCxifDApfDB9ZnVuY3Rpb24geHIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3JldHVybiB5Y1thJjYzXShifDAsY3wwLGR8MCxlfDAsZnwwKXwwfWZ1bmN0aW9uIHlyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiB6cihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBrYSgxLGF8MCxifDAsY3wwLGR8MCxlfDApfDB9ZnVuY3Rpb24gQXIoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4ga2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwKXwwfWZ1bmN0aW9uIEJyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBDcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBrYSg0LGF8MCxifDAsY3wwLGR8MCxlfDApfDB9ZnVuY3Rpb24gRHIoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4ga2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwKXwwfWZ1bmN0aW9uIEVyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBGcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBrYSg3LGF8MCxifDAsY3wwLGR8MCxlfDApfDB9ZnVuY3Rpb24gR3IoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4ga2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwKXwwfWZ1bmN0aW9uIEhyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBJcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3pjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gSnIoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoMCxhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIEtyKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2thKDEsYXwwLGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBMcihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCl9ZnVuY3Rpb24gTXIoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoMyxhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIE5yKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2thKDQsYXwwLGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBPcihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCl9ZnVuY3Rpb24gUHIoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoNixhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIFFyKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2thKDcsYXwwLGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBScihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCl9ZnVuY3Rpb24gU3IoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoOSxhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIFRyKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtmYSgwKTtyZXR1cm4gMH1mdW5jdGlvbiBVcihhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtmYSgxKX1mdW5jdGlvbiBWcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2ZhKDIpfWZ1bmN0aW9uIFdyKCl7ZmEoMyk7cmV0dXJuIDB9ZnVuY3Rpb24gWHIoYSl7YT1hfDA7ZmEoNCl9ZnVuY3Rpb24gWXIoYSxiKXthPWF8MDtiPWJ8MDtmYSg1KX1mdW5jdGlvbiBacihhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7ZmEoNil9ZnVuY3Rpb24gX3IoYSl7YT1hfDA7ZmEoNyk7cmV0dXJuIDB9ZnVuY3Rpb24gJHIoYSl7YT1hfDA7cmV0dXJuIEFiKGF8MCl8MH1mdW5jdGlvbiBhcyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2ZhKDgpfWZ1bmN0aW9uIGJzKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtmYSg5KX1mdW5jdGlvbiBjcyhhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtmYSgxMCl9ZnVuY3Rpb24gZHMoKXtmYSgxMSl9ZnVuY3Rpb24gZXMoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtmYSgxMik7cmV0dXJuIDB9ZnVuY3Rpb24gZnMoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZmEoMTMpO3JldHVybiAwfWZ1bmN0aW9uIGdzKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7ZmEoMTQpfWZ1bmN0aW9uIGhzKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtmYSgxNSl9ZnVuY3Rpb24gaXMoYSxiKXthPWF8MDtiPWJ8MDtmYSgxNik7cmV0dXJuIDB9ZnVuY3Rpb24ganMoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmYSgxNyk7cmV0dXJuIDB9ZnVuY3Rpb24ga3MoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZmEoMTgpfQoKCgoKLy8gRU1TQ1JJUFRFTl9FTkRfRlVOQ1MKdmFyIGhjPVtUcixUcixfbixUciwkbixUcixhbyxUcixibyxUcixjbyxUcixlbyxUcixmbyxUcixnbyxUcixobyxUcixpbyxUcix2ZyxBZyxFZyxKZyxPZyxrZixTZyx4ZixQZixRZixEaCxJaCxLayxQayxxbCxzbCx2bCxibCxnbCxpbCxsbCxobixtbixnbixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcl07dmFyIGljPVtVcixVcixrbyxVcixsbyxVcixtbyxVcixubyxVcixvbyxVcixwbyxVcixxbyxVcixybyxVcixzbyxVcix0byxVcixMaCxOaCxPaCxQaCxRaCxSaCxTaCxUaCxVaCxWaCxXaCwkaCxiaSxjaSxkaSxlaSxmaSxnaSxoaSxpaSxqaSxraSx5aSxBaSxNaSxPaSxYaSxZaSxaaSxfaSwkaSxnaixoaixpaixqaixraixCayxIayxVcixVcixVcixVcl07dmFyIGpjPVtWcixWcix2byxWcix3byxWcix4byxWcix5byxWcix6byxWcixBbyxWcixCbyxWcixDbyxWcixEbyxWcixFbyxWcixxbixwbixvbixWcixWcixWcixWcixWcixWcixWcl07dmFyIGtjPVtXcixXcixHbyxXcixIbyxXcixJbyxXcixKbyxXcixLbyxXcixMbyxXcixNbyxXcixObyxXcixPbyxXcixQbyxXcixPYyxXcixXcixXcixXcixXcixXcixXcixXcixXcl07dmFyIGxjPVtYcixYcixSbyxYcixTbyxYcixUbyxYcixVbyxYcixWbyxYcixXbyxYcixYbyxYcixZbyxYcixabyxYcixfbyxYcixUYyxVYyxoZCxpZCxuZCxvZCx2ZCx3ZCx4ZCx6ZCxCZCxDZCxEZCxFZCxGZCxIZCxKZCxLZCxMZCxNZCxOZCxQZCxSZCxTZCxUZCxVZCxWZCxYZCxZZCwkZCxaZCxhZSxfZCxiZSxWZyxVZyxYZyxXZyxjZSxkZSxqZSxrZSxsZSxuZSx0ZSx1ZSxzZSx2ZSxyZSx3ZSx4ZSx5ZSx6ZSxBZSxCZSxDZSxFZSxGZSxJZSxKZSxPZSxQZSxOZSxRZSxxZSxSZSxUZSxVZSxWZSxYZSxZZSxaZSxfZSxhZixmZixnZixtZixuZix0Zix1Zix6ZixBZixJZixIZixMZixLZixOZixfZixaZixUZiwkZixYZixhZyx0ZyxzZyxIZyxHZyxfZyxaZyxhaCwkZyxkaCxjaCxmaCxlaCxuaCxtaCxwaCxvaCx2aCx1aCxyZyx3aCx0aCx4aCx6aCx5aCxfayxGaCxFaCxLaCxKaCxfaCxaaCx0aSxzaSxIaSxHaSxWaSxVaSxlaixkaixvaixuaixyaixxaix1aix0aixGaixFaixRaixQaiwkaixfaixrayxqayxzayxyayx4ayx3ayxEayxDayxKayxJayxPayxOayxXayxWayxvbCxubCxTayxGbCxlbSxkbSxnbSxmbSxBaCxaayxhbCx4bCxObCxWbCxibSxjbSxZbSxYbSxfbSxjbiwkbSxhbixmbixibixkbixlbix6bix5biwkayxEZSxiZyxSYyxlZixtayx2bixUbSxTbSxSbSxRbSxQbSxPbSxmZyxtZyxYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcl07dmFyIG1jPVtZcixZcixhcCxZcixicCxZcixjcCxZcixkcCxZcixlcCxZcixmcCxZcixncCxZcixocCxZcixpcCxZcixqcCxZcixnZCxBZCxJZCxRZCx1ZyxIZSxLZSxoZixvZix2ZixCZixJZyx4aix5aix6aixBaixDaixEaixJaixKaixLaixMaixOaixPaixUaixVaixWaixXaixZaixaaixjayxkayxlayxmayxoayxpayxNayxSayxsbSxubSxwbSxtbSxvbSxxbSxKYyxZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcl07dmFyIG5jPVtacixacixscCxacixtcCxacixucCxacixvcCxacixwcCxacixxcCxacixycCxacixzcCxacix0cCxacix1cCxacixhaixsaixacixacixacixacixacixacixacixacl07dmFyIG9jPVtfcixfcix3cCxfcix4cCxfcix5cCxfcix6cCxfcixBcCxfcixCcCxfcixDcCxfcixEcCxfcixFcCxfcixGcCxfcixNZix5Zyx6ZyxnZSxDZywkcixHZSxNZSxqZixOZyxQZyxRZyxNZyxwZixxZix3ZixCZyxDZixEZixKZixSZixVZixyaCxXaSxybSx0bSx2bSxCbSxEbSx4bSx6bSxmaixzbSx1bSx3bSxDbSxFbSx5bSxBbSx2aix3aixCaixHaixIaixNaixSaixTaixYaixhayxiayxnayxKbCxLbCxNbCxobSxqbSxpbSxrbSxCbCxDbCxFbCxSbCxTbCxVbCxabCxfbCxhbSxabSxBbixRYyxQYyxLYyxfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcl07dmFyIHBjPVthcyxhcyxIcCxhcyxJcCxhcyxKcCxhcyxLcCxhcyxMcCxhcyxNcCxhcyxOcCxhcyxPcCxhcyxQcCxhcyxRcCxhcyx5ayxFayxhcyxhcyxhcyxhcyxhcyxhcyxhcyxhc107dmFyIHFjPVticyxicyxTcCxicyxUcCxicyxVcCxicyxWcCxicyxXcCxicyxYcCxicyxZcCxicyxacCxicyxfcCxicywkcCxicyxPZixTZixXZixWZixzaCxJYyxNYyxicyxicyxic107dmFyIHJjPVtjcyxjcyxicSxjcyxjcSxjcyxkcSxjcyxlcSxjcyxmcSxjcyxncSxjcyxocSxjcyxpcSxjcyxqcSxjcyxrcSxjcyxCaSxFaSxQaSxSaSxjcyxjcyxjcyxjcyxjcyxjc107dmFyIHNjPVtkcyxkcyxtcSxkcyxucSxkcyxvcSxkcyxwcSxkcyxxcSxkcyxycSxkcyxzcSxkcyx0cSxkcyx1cSxkcyx2cSxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkc107dmFyIHRjPVtlcyxlcyx4cSxlcyx5cSxlcyx6cSxlcyxBcSxlcyxCcSxlcyxDcSxlcyxEcSxlcyxFcSxlcyxGcSxlcyxHcSxlcyxHbCxIbCx5bCx6bCxPbCxQbCxXbCxYbCxlcyxlc107dmFyIHVjPVtmcyxmcyxJcSxmcyxKcSxmcyxLcSxmcyxMcSxmcyxNcSxmcyxOcSxmcyxPcSxmcyxQcSxmcyxRcSxmcyxScSxmcyx1bCxjbCxkbCxlbCxrbCxmcyxmcyxmcyxmcyxmc107dmFyIHZjPVtncyxncyxUcSxncyxVcSxncyxWcSxncyxXcSxncyxYcSxncyxZcSxncyxacSxncyxfcSxncywkcSxncyxhcixncyxwaixzaixsayxwayx0ayx2ayxncyxncyxncyxnc107dmFyIHdjPVtocyxocyxjcixocyxkcixocyxlcixocyxmcixocyxncixocyxocixocyxpcixocyxqcixocyxrcixocyxscixocyxlZSxLZyx3Zyx1aSx2aSx6aSxGaSxJaSxKaSxOaSxTaSxMayxRayx0bixzbixybixocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxoc107dmFyIHhjPVtpcyxpcyxucixpcyxvcixpcyxwcixpcyxxcixpcyxycixpcyxzcixpcyx0cixpcyx1cixpcyx2cixpcyx3cixpcyx5ZCxHZCxPZCxXZCxoZSxpZSxtZSxMZSxXZSwkZSxSZyxsZixyZixUZyxEZyx5ZixFZixGZyxwbCxybCx0bCxmbCxobCxqbCxMYyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpc107dmFyIHljPVtqcyxqcyx5cixqcyx6cixqcyxBcixqcyxCcixqcyxDcixqcyxEcixqcyxFcixqcyxGcixqcyxHcixqcyxIcixqcyxCaCxHaCx3bCxJbCxMbCxtbCxBbCxEbCxRbCxUbCxZbCwkbCxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqc107dmFyIHpjPVtrcyxrcyxKcixrcyxLcixrcyxMcixrcyxNcixrcyxOcixrcyxPcixrcyxQcixrcyxRcixrcyxScixrcyxTcixrcyxmZSxMZyx4ZyxDaCxIaCxqbixrbixsbixOYyxrc107cmV0dXJue19pNjRTdWJ0cmFjdDpIbixfZnJlZTp2bixfcmVhbGxvYzp3bixfaTY0QWRkOkluLF9tZW1tb3ZlOk1uLF9zdHJsZW46Sm4sX21lbXNldDpObixfbWFsbG9jOnVuLF9tZW1jcHk6TG4sX19fZ2V0VHlwZU5hbWU6Y2YsX2JpdHNoaWZ0NjRMc2hyOktuLF9iaXRzaGlmdDY0U2hsOk9uLF9fR0xPQkFMX19JX2E6YmYsX19HTE9CQUxfX0lfYTY1OmRmLF9fR0xPQkFMX19JX2ExNTM6R2YscnVuUG9zdFNldHM6R24sc3RhY2tBbGxvYzpBYyxzdGFja1NhdmU6QmMsc3RhY2tSZXN0b3JlOkNjLHNldFRocmV3OkRjLHNldFRlbXBSZXQwOkdjLGdldFRlbXBSZXQwOkhjLGR5bkNhbGxfaWlpaTpabixkeW5DYWxsX3ZpaWlpaWlpOmpvLGR5bkNhbGxfdmlpaWlpOnVvLGR5bkNhbGxfaTpGbyxkeW5DYWxsX3ZpOlFvLGR5bkNhbGxfdmlpOiRvLGR5bkNhbGxfdmlpaWlpaWlpaTprcCxkeW5DYWxsX2lpOnZwLGR5bkNhbGxfdmlpaWlpaWQ6R3AsZHluQ2FsbF92aWlpOlJwLGR5bkNhbGxfdmlpaWlpZDphcSxkeW5DYWxsX3Y6bHEsZHluQ2FsbF9paWlpaWlpaWk6d3EsZHluQ2FsbF9paWlpaTpIcSxkeW5DYWxsX3ZpaWlpaWlpaTpTcSxkeW5DYWxsX3ZpaWlpaWk6YnIsZHluQ2FsbF9paWk6bXIsZHluQ2FsbF9paWlpaWk6eHIsZHluQ2FsbF92aWlpaTpJcn0KLy8gRU1TQ1JJUFRFTl9FTkRfQVNNCgp9KSh7Ik1hdGgiOk1hdGgsIkludDhBcnJheSI6SW50OEFycmF5LCJJbnQxNkFycmF5IjpJbnQxNkFycmF5LCJJbnQzMkFycmF5IjpJbnQzMkFycmF5LCJVaW50OEFycmF5IjpVaW50OEFycmF5LCJVaW50MTZBcnJheSI6VWludDE2QXJyYXksIlVpbnQzMkFycmF5IjpVaW50MzJBcnJheSwiRmxvYXQzMkFycmF5IjpGbG9hdDMyQXJyYXksIkZsb2F0NjRBcnJheSI6RmxvYXQ2NEFycmF5fSx7ImFib3J0IjphYm9ydCwiYXNzZXJ0Ijphc3NlcnQsImFzbVByaW50SW50Ijphc21QcmludEludCwiYXNtUHJpbnRGbG9hdCI6YXNtUHJpbnRGbG9hdCwibWluIjpNYXRoX21pbiwianNDYWxsIjpqc0NhbGwsImludm9rZV9paWlpIjppbnZva2VfaWlpaSwiaW52b2tlX3ZpaWlpaWlpIjppbnZva2VfdmlpaWlpaWksImludm9rZV92aWlpaWkiOmludm9rZV92aWlpaWksImludm9rZV9pIjppbnZva2VfaSwiaW52b2tlX3ZpIjppbnZva2VfdmksImludm9rZV92aWkiOmludm9rZV92aWksImludm9rZV92aWlpaWlpaWlpIjppbnZva2VfdmlpaWlpaWlpaSwiaW52b2tlX2lpIjppbnZva2VfaWksImludm9rZV92aWlpaWlpZCI6aW52b2tlX3ZpaWlpaWlkLCJpbnZva2VfdmlpaSI6aW52b2tlX3ZpaWksImludm9rZV92aWlpaWlkIjppbnZva2VfdmlpaWlpZCwiaW52b2tlX3YiOmludm9rZV92LCJpbnZva2VfaWlpaWlpaWlpIjppbnZva2VfaWlpaWlpaWlpLCJpbnZva2VfaWlpaWkiOmludm9rZV9paWlpaSwiaW52b2tlX3ZpaWlpaWlpaSI6aW52b2tlX3ZpaWlpaWlpaSwiaW52b2tlX3ZpaWlpaWkiOmludm9rZV92aWlpaWlpLCJpbnZva2VfaWlpIjppbnZva2VfaWlpLCJpbnZva2VfaWlpaWlpIjppbnZva2VfaWlpaWlpLCJpbnZva2VfdmlpaWkiOmludm9rZV92aWlpaSwiX2ZhYnMiOl9mYWJzLCJfc3NjYW5mIjpfc3NjYW5mLCJfcHRocmVhZF9jb25kX3dhaXQiOl9wdGhyZWFkX2NvbmRfd2FpdCwiX19fY3R5cGVfdG9sb3dlcl9sb2MiOl9fX2N0eXBlX3RvbG93ZXJfbG9jLCJfYXNwcmludGYiOl9hc3ByaW50ZiwiX19lbWJpbmRfcmVnaXN0ZXJfdm9pZCI6X19lbWJpbmRfcmVnaXN0ZXJfdm9pZCwiX3NlbmQiOl9zZW5kLCJfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldyI6X19lbWJpbmRfcmVnaXN0ZXJfbWVtb3J5X3ZpZXcsIl92c3NjYW5mIjpfdnNzY2FuZiwiX19fY3R5cGVfYl9sb2MiOl9fX2N0eXBlX2JfbG9jLCJfX1pTdDl0ZXJtaW5hdGV2IjpfX1pTdDl0ZXJtaW5hdGV2LCJfZm1vZCI6X2Ztb2QsIl9fX2N4YV9ndWFyZF9hY3F1aXJlIjpfX19jeGFfZ3VhcmRfYWNxdWlyZSwiX19fc2V0RXJyTm8iOl9fX3NldEVyck5vLCJfX19jeGFfaXNfbnVtYmVyX3R5cGUiOl9fX2N4YV9pc19udW1iZXJfdHlwZSwiX19fZ3h4X3BlcnNvbmFsaXR5X3YwIjpfX19neHhfcGVyc29uYWxpdHlfdjAsIl9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIiOl9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIsIl91bmdldGMiOl91bmdldGMsIl9fX2Fzc2VydF9mYWlsIjpfX19hc3NlcnRfZmFpbCwiX19fY3hhX2FsbG9jYXRlX2V4Y2VwdGlvbiI6X19fY3hhX2FsbG9jYXRlX2V4Y2VwdGlvbiwiX19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYiOl9fWlN0MTh1bmNhdWdodF9leGNlcHRpb252LCJfX19jdHlwZV90b3VwcGVyX2xvYyI6X19fY3R5cGVfdG91cHBlcl9sb2MsIl9mZmx1c2giOl9mZmx1c2gsIl9fX2N4YV9ndWFyZF9yZWxlYXNlIjpfX19jeGFfZ3VhcmRfcmVsZWFzZSwiX19hZGREYXlzIjpfX2FkZERheXMsIl9fX2Vycm5vX2xvY2F0aW9uIjpfX19lcnJub19sb2NhdGlvbiwiX3B3cml0ZSI6X3B3cml0ZSwiX3N0cmVycm9yX3IiOl9zdHJlcnJvcl9yLCJfc3RyZnRpbWVfbCI6X3N0cmZ0aW1lX2wsIl9fZm9ybWF0U3RyaW5nIjpfX2Zvcm1hdFN0cmluZywiX19yZWFsbHlOZWdhdGl2ZSI6X19yZWFsbHlOZWdhdGl2ZSwiX3NicmsiOl9zYnJrLCJfdXNlbG9jYWxlIjpfdXNlbG9jYWxlLCJfY2F0Z2V0cyI6X2NhdGdldHMsIl9uZXdsb2NhbGUiOl9uZXdsb2NhbGUsIl9zbnByaW50ZiI6X3NucHJpbnRmLCJfX19jeGFfYmVnaW5fY2F0Y2giOl9fX2N4YV9iZWdpbl9jYXRjaCwiX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZywiX2ZpbGVubyI6X2ZpbGVubywiX19lbWJpbmRfcmVnaXN0ZXJfYm9vbCI6X19lbWJpbmRfcmVnaXN0ZXJfYm9vbCwiX19fcmVzdW1lRXhjZXB0aW9uIjpfX19yZXN1bWVFeGNlcHRpb24sIl9fX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoIjpfX19jeGFfZmluZF9tYXRjaGluZ19jYXRjaCwiX3N5c2NvbmYiOl9zeXNjb25mLCJfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nIjpfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nLCJfc3RyZnRpbWUiOl9zdHJmdGltZSwiX19hcnJheVN1bSI6X19hcnJheVN1bSwiX19fY3hhX3Rocm93IjpfX19jeGFfdGhyb3csIl9fZW1iaW5kX3JlZ2lzdGVyX2VtdmFsIjpfX2VtYmluZF9yZWdpc3Rlcl9lbXZhbCwiX19leGl0IjpfX2V4aXQsIl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uIjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbiwiX19aTktTdDlleGNlcHRpb240d2hhdEV2IjpfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYsIl9wdGhyZWFkX211dGV4X2Rlc3Ryb3kiOl9wdGhyZWFkX211dGV4X2Rlc3Ryb3ksIl9wdGhyZWFkX211dGV4X3VubG9jayI6X3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCJfZnJlYWQiOl9mcmVhZCwiX3B0aHJlYWRfY29uZF9icm9hZGNhc3QiOl9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0LCJfbWtwb3J0IjpfbWtwb3J0LCJfc3ByaW50ZiI6X3NwcmludGYsIl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzIjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzcywiX3Zhc3ByaW50ZiI6X3Zhc3ByaW50ZiwiX19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmciOl9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF93c3RyaW5nLCJfd3JpdGUiOl93cml0ZSwiX19pc0xlYXBZZWFyIjpfX2lzTGVhcFllYXIsIl9fc2NhblN0cmluZyI6X19zY2FuU3RyaW5nLCJfc3RyZXJyb3IiOl9zdHJlcnJvciwiX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IiOl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yLCJfcmVjdiI6X3JlY3YsIl92c25wcmludGYiOl92c25wcmludGYsIl9fWk5TdDlleGNlcHRpb25EMkV2IjpfX1pOU3Q5ZXhjZXB0aW9uRDJFdiwiX2NvcHlzaWduIjpfY29weXNpZ24sIl9mZ2V0YyI6X2ZnZXRjLCJfX19jeGFfZG9lc19pbmhlcml0IjpfX19jeGFfZG9lc19pbmhlcml0LCJfZnJlZWxvY2FsZSI6X2ZyZWVsb2NhbGUsIl9yZWFkIjpfcmVhZCwiX2Fib3J0IjpfYWJvcnQsIl9jYXRjbG9zZSI6X2NhdGNsb3NlLCJfZndyaXRlIjpfZndyaXRlLCJfdGltZSI6X3RpbWUsIl9wdGhyZWFkX211dGV4X2xvY2siOl9wdGhyZWFkX211dGV4X2xvY2ssIl9fZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0IjpfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdCwiX3ByZWFkIjpfcHJlYWQsIl9hdGV4aXQiOl9hdGV4aXQsIl9jYXRvcGVuIjpfY2F0b3BlbiwiX2V4aXQiOl9leGl0LCJfX2dldEZsb2F0IjpfX2dldEZsb2F0LCJTVEFDS1RPUCI6U1RBQ0tUT1AsIlNUQUNLX01BWCI6U1RBQ0tfTUFYLCJ0ZW1wRG91YmxlUHRyIjp0ZW1wRG91YmxlUHRyLCJBQk9SVCI6QUJPUlQsImN0dHpfaTgiOmN0dHpfaTgsImN0bHpfaTgiOmN0bHpfaTgsIk5hTiI6TmFOLCJJbmZpbml0eSI6SW5maW5pdHksIl9fWlRJU3Q5ZXhjZXB0aW9uIjpfX1pUSVN0OWV4Y2VwdGlvbiwiX19fZHNvX2hhbmRsZSI6X19fZHNvX2hhbmRsZSwiX3N0ZGVyciI6X3N0ZGVyciwiX3N0ZGluIjpfc3RkaW4sIl9zdGRvdXQiOl9zdGRvdXR9LGJ1ZmZlcik7dmFyIF9pNjRTdWJ0cmFjdD1Nb2R1bGVbIl9pNjRTdWJ0cmFjdCJdPWFzbVsiX2k2NFN1YnRyYWN0Il07dmFyIF9mcmVlPU1vZHVsZVsiX2ZyZWUiXT1hc21bIl9mcmVlIl07dmFyIF9yZWFsbG9jPU1vZHVsZVsiX3JlYWxsb2MiXT1hc21bIl9yZWFsbG9jIl07dmFyIF9pNjRBZGQ9TW9kdWxlWyJfaTY0QWRkIl09YXNtWyJfaTY0QWRkIl07dmFyIF9tZW1tb3ZlPU1vZHVsZVsiX21lbW1vdmUiXT1hc21bIl9tZW1tb3ZlIl07dmFyIF9zdHJsZW49TW9kdWxlWyJfc3RybGVuIl09YXNtWyJfc3RybGVuIl07dmFyIF9tZW1zZXQ9TW9kdWxlWyJfbWVtc2V0Il09YXNtWyJfbWVtc2V0Il07dmFyIF9tYWxsb2M9TW9kdWxlWyJfbWFsbG9jIl09YXNtWyJfbWFsbG9jIl07dmFyIF9tZW1jcHk9TW9kdWxlWyJfbWVtY3B5Il09YXNtWyJfbWVtY3B5Il07dmFyIF9fX2dldFR5cGVOYW1lPU1vZHVsZVsiX19fZ2V0VHlwZU5hbWUiXT1hc21bIl9fX2dldFR5cGVOYW1lIl07dmFyIF9iaXRzaGlmdDY0THNocj1Nb2R1bGVbIl9iaXRzaGlmdDY0THNociJdPWFzbVsiX2JpdHNoaWZ0NjRMc2hyIl07dmFyIF9iaXRzaGlmdDY0U2hsPU1vZHVsZVsiX2JpdHNoaWZ0NjRTaGwiXT1hc21bIl9iaXRzaGlmdDY0U2hsIl07dmFyIF9fR0xPQkFMX19JX2E9TW9kdWxlWyJfX0dMT0JBTF9fSV9hIl09YXNtWyJfX0dMT0JBTF9fSV9hIl07dmFyIF9fR0xPQkFMX19JX2E2NT1Nb2R1bGVbIl9fR0xPQkFMX19JX2E2NSJdPWFzbVsiX19HTE9CQUxfX0lfYTY1Il07dmFyIF9fR0xPQkFMX19JX2ExNTM9TW9kdWxlWyJfX0dMT0JBTF9fSV9hMTUzIl09YXNtWyJfX0dMT0JBTF9fSV9hMTUzIl07dmFyIHJ1blBvc3RTZXRzPU1vZHVsZVsicnVuUG9zdFNldHMiXT1hc21bInJ1blBvc3RTZXRzIl07dmFyIGR5bkNhbGxfaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaSJdPWFzbVsiZHluQ2FsbF9paWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaWlpIl09YXNtWyJkeW5DYWxsX3ZpaWlpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWkiXT1hc21bImR5bkNhbGxfdmlpaWlpIl07dmFyIGR5bkNhbGxfaT1Nb2R1bGVbImR5bkNhbGxfaSJdPWFzbVsiZHluQ2FsbF9pIl07dmFyIGR5bkNhbGxfdmk9TW9kdWxlWyJkeW5DYWxsX3ZpIl09YXNtWyJkeW5DYWxsX3ZpIl07dmFyIGR5bkNhbGxfdmlpPU1vZHVsZVsiZHluQ2FsbF92aWkiXT1hc21bImR5bkNhbGxfdmlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpaWlpaSJdPWFzbVsiZHluQ2FsbF92aWlpaWlpaWlpIl07dmFyIGR5bkNhbGxfaWk9TW9kdWxlWyJkeW5DYWxsX2lpIl09YXNtWyJkeW5DYWxsX2lpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWQ9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaWlkIl09YXNtWyJkeW5DYWxsX3ZpaWlpaWlkIl07dmFyIGR5bkNhbGxfdmlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaSJdPWFzbVsiZHluQ2FsbF92aWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpZD1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpZCJdPWFzbVsiZHluQ2FsbF92aWlpaWlkIl07dmFyIGR5bkNhbGxfdj1Nb2R1bGVbImR5bkNhbGxfdiJdPWFzbVsiZHluQ2FsbF92Il07dmFyIGR5bkNhbGxfaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWkiXT1hc21bImR5bkNhbGxfaWlpaWlpaWlpIl07dmFyIGR5bkNhbGxfaWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpIl09YXNtWyJkeW5DYWxsX2lpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWlpaWkiXT1hc21bImR5bkNhbGxfdmlpaWlpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpaSJdPWFzbVsiZHluQ2FsbF92aWlpaWlpIl07dmFyIGR5bkNhbGxfaWlpPU1vZHVsZVsiZHluQ2FsbF9paWkiXT1hc21bImR5bkNhbGxfaWlpIl07dmFyIGR5bkNhbGxfaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWkiXT1hc21bImR5bkNhbGxfaWlpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpIl09YXNtWyJkeW5DYWxsX3ZpaWlpIl07UnVudGltZS5zdGFja0FsbG9jPWFzbVsic3RhY2tBbGxvYyJdO1J1bnRpbWUuc3RhY2tTYXZlPWFzbVsic3RhY2tTYXZlIl07UnVudGltZS5zdGFja1Jlc3RvcmU9YXNtWyJzdGFja1Jlc3RvcmUiXTtSdW50aW1lLnNldFRlbXBSZXQwPWFzbVsic2V0VGVtcFJldDAiXTtSdW50aW1lLmdldFRlbXBSZXQwPWFzbVsiZ2V0VGVtcFJldDAiXTt2YXIgaTY0TWF0aD0oZnVuY3Rpb24oKXt2YXIgZ29vZz17bWF0aDp7fX07Z29vZy5tYXRoLkxvbmc9KGZ1bmN0aW9uKGxvdyxoaWdoKXt0aGlzLmxvd189bG93fDA7dGhpcy5oaWdoXz1oaWdofDB9KTtnb29nLm1hdGguTG9uZy5JbnRDYWNoZV89e307Z29vZy5tYXRoLkxvbmcuZnJvbUludD0oZnVuY3Rpb24odmFsdWUpe2lmKC0xMjg8PXZhbHVlJiZ2YWx1ZTwxMjgpe3ZhciBjYWNoZWRPYmo9Z29vZy5tYXRoLkxvbmcuSW50Q2FjaGVfW3ZhbHVlXTtpZihjYWNoZWRPYmope3JldHVybiBjYWNoZWRPYmp9fXZhciBvYmo9bmV3IGdvb2cubWF0aC5Mb25nKHZhbHVlfDAsdmFsdWU8MD8tMTowKTtpZigtMTI4PD12YWx1ZSYmdmFsdWU8MTI4KXtnb29nLm1hdGguTG9uZy5JbnRDYWNoZV9bdmFsdWVdPW9ian1yZXR1cm4gb2JqfSk7Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcj0oZnVuY3Rpb24odmFsdWUpe2lmKGlzTmFOKHZhbHVlKXx8IWlzRmluaXRlKHZhbHVlKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk99ZWxzZSBpZih2YWx1ZTw9LWdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjNfREJMXyl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRX1lbHNlIGlmKHZhbHVlKzE+PWdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjNfREJMXyl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLk1BWF9WQUxVRX1lbHNlIGlmKHZhbHVlPDApe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKC12YWx1ZSkubmVnYXRlKCl9ZWxzZXtyZXR1cm4gbmV3IGdvb2cubWF0aC5Mb25nKHZhbHVlJWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMX3wwLHZhbHVlL2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMX3wwKX19KTtnb29nLm1hdGguTG9uZy5mcm9tQml0cz0oZnVuY3Rpb24obG93Qml0cyxoaWdoQml0cyl7cmV0dXJuIG5ldyBnb29nLm1hdGguTG9uZyhsb3dCaXRzLGhpZ2hCaXRzKX0pO2dvb2cubWF0aC5Mb25nLmZyb21TdHJpbmc9KGZ1bmN0aW9uKHN0cixvcHRfcmFkaXgpe2lmKHN0ci5sZW5ndGg9PTApe3Rocm93IEVycm9yKCJudW1iZXIgZm9ybWF0IGVycm9yOiBlbXB0eSBzdHJpbmciKX12YXIgcmFkaXg9b3B0X3JhZGl4fHwxMDtpZihyYWRpeDwyfHwzNjxyYWRpeCl7dGhyb3cgRXJyb3IoInJhZGl4IG91dCBvZiByYW5nZTogIityYWRpeCl9aWYoc3RyLmNoYXJBdCgwKT09Ii0iKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLHJhZGl4KS5uZWdhdGUoKX1lbHNlIGlmKHN0ci5pbmRleE9mKCItIik+PTApe3Rocm93IEVycm9yKCdudW1iZXIgZm9ybWF0IGVycm9yOiBpbnRlcmlvciAiLSIgY2hhcmFjdGVyOiAnK3N0cil9dmFyIHJhZGl4VG9Qb3dlcj1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKE1hdGgucG93KHJhZGl4LDgpKTt2YXIgcmVzdWx0PWdvb2cubWF0aC5Mb25nLlpFUk87Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoO2krPTgpe3ZhciBzaXplPU1hdGgubWluKDgsc3RyLmxlbmd0aC1pKTt2YXIgdmFsdWU9cGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpLGkrc2l6ZSkscmFkaXgpO2lmKHNpemU8OCl7dmFyIHBvd2VyPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoTWF0aC5wb3cocmFkaXgsc2l6ZSkpO3Jlc3VsdD1yZXN1bHQubXVsdGlwbHkocG93ZXIpLmFkZChnb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKHZhbHVlKSl9ZWxzZXtyZXN1bHQ9cmVzdWx0Lm11bHRpcGx5KHJhZGl4VG9Qb3dlcik7cmVzdWx0PXJlc3VsdC5hZGQoZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcih2YWx1ZSkpfX1yZXR1cm4gcmVzdWx0fSk7Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl8xNl9EQkxfPTE8PDE2O2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfREJMXz0xPDwyNDtnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF89Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl8xNl9EQkxfKmdvb2cubWF0aC5Mb25nLlRXT19QV1JfMTZfREJMXztnb29nLm1hdGguTG9uZy5UV09fUFdSXzMxX0RCTF89Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl8zMl9EQkxfLzI7Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl80OF9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXypnb29nLm1hdGguTG9uZy5UV09fUFdSXzE2X0RCTF87Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl82NF9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXypnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF87Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl82M19EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjRfREJMXy8yO2dvb2cubWF0aC5Mb25nLlpFUk89Z29vZy5tYXRoLkxvbmcuZnJvbUludCgwKTtnb29nLm1hdGguTG9uZy5PTkU9Z29vZy5tYXRoLkxvbmcuZnJvbUludCgxKTtnb29nLm1hdGguTG9uZy5ORUdfT05FPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoLTEpO2dvb2cubWF0aC5Mb25nLk1BWF9WQUxVRT1nb29nLm1hdGguTG9uZy5mcm9tQml0cyg0Mjk0OTY3Mjk1fDAsMjE0NzQ4MzY0N3wwKTtnb29nLm1hdGguTG9uZy5NSU5fVkFMVUU9Z29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoMCwyMTQ3NDgzNjQ4fDApO2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoMTw8MjQpO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS50b0ludD0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dffSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnRvTnVtYmVyPShmdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hfKmdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXyt0aGlzLmdldExvd0JpdHNVbnNpZ25lZCgpfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nPShmdW5jdGlvbihvcHRfcmFkaXgpe3ZhciByYWRpeD1vcHRfcmFkaXh8fDEwO2lmKHJhZGl4PDJ8fDM2PHJhZGl4KXt0aHJvdyBFcnJvcigicmFkaXggb3V0IG9mIHJhbmdlOiAiK3JhZGl4KX1pZih0aGlzLmlzWmVybygpKXtyZXR1cm4iMCJ9aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpe3ZhciByYWRpeExvbmc9Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcihyYWRpeCk7dmFyIGRpdj10aGlzLmRpdihyYWRpeExvbmcpO3ZhciByZW09ZGl2Lm11bHRpcGx5KHJhZGl4TG9uZykuc3VidHJhY3QodGhpcyk7cmV0dXJuIGRpdi50b1N0cmluZyhyYWRpeCkrcmVtLnRvSW50KCkudG9TdHJpbmcocmFkaXgpfWVsc2V7cmV0dXJuIi0iK3RoaXMubmVnYXRlKCkudG9TdHJpbmcocmFkaXgpfX12YXIgcmFkaXhUb1Bvd2VyPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoTWF0aC5wb3cocmFkaXgsNikpO3ZhciByZW09dGhpczt2YXIgcmVzdWx0PSIiO3doaWxlKHRydWUpe3ZhciByZW1EaXY9cmVtLmRpdihyYWRpeFRvUG93ZXIpO3ZhciBpbnR2YWw9cmVtLnN1YnRyYWN0KHJlbURpdi5tdWx0aXBseShyYWRpeFRvUG93ZXIpKS50b0ludCgpO3ZhciBkaWdpdHM9aW50dmFsLnRvU3RyaW5nKHJhZGl4KTtyZW09cmVtRGl2O2lmKHJlbS5pc1plcm8oKSl7cmV0dXJuIGRpZ2l0cytyZXN1bHR9ZWxzZXt3aGlsZShkaWdpdHMubGVuZ3RoPDYpe2RpZ2l0cz0iMCIrZGlnaXRzfXJlc3VsdD0iIitkaWdpdHMrcmVzdWx0fX19KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0SGlnaEJpdHM9KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGlnaF99KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0TG93Qml0cz0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dffSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmdldExvd0JpdHNVbnNpZ25lZD0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dfPj0wP3RoaXMubG93Xzpnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8rdGhpcy5sb3dffSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmdldE51bUJpdHNBYnM9KGZ1bmN0aW9uKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpe3JldHVybiA2NH1lbHNle3JldHVybiB0aGlzLm5lZ2F0ZSgpLmdldE51bUJpdHNBYnMoKX19ZWxzZXt2YXIgdmFsPXRoaXMuaGlnaF8hPTA/dGhpcy5oaWdoXzp0aGlzLmxvd187Zm9yKHZhciBiaXQ9MzE7Yml0PjA7Yml0LS0pe2lmKCh2YWwmMTw8Yml0KSE9MCl7YnJlYWt9fXJldHVybiB0aGlzLmhpZ2hfIT0wP2JpdCszMzpiaXQrMX19KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNaZXJvPShmdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hfPT0wJiZ0aGlzLmxvd189PTB9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNOZWdhdGl2ZT0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoXzwwfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmlzT2RkPShmdW5jdGlvbigpe3JldHVybih0aGlzLmxvd18mMSk9PTF9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZXF1YWxzPShmdW5jdGlvbihvdGhlcil7cmV0dXJuIHRoaXMuaGlnaF89PW90aGVyLmhpZ2hfJiZ0aGlzLmxvd189PW90aGVyLmxvd199KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubm90RXF1YWxzPShmdW5jdGlvbihvdGhlcil7cmV0dXJuIHRoaXMuaGlnaF8hPW90aGVyLmhpZ2hffHx0aGlzLmxvd18hPW90aGVyLmxvd199KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubGVzc1RoYW49KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gdGhpcy5jb21wYXJlKG90aGVyKTwwfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbD0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiB0aGlzLmNvbXBhcmUob3RoZXIpPD0wfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmdyZWF0ZXJUaGFuPShmdW5jdGlvbihvdGhlcil7cmV0dXJuIHRoaXMuY29tcGFyZShvdGhlcik+MH0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw9KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gdGhpcy5jb21wYXJlKG90aGVyKT49MH0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5jb21wYXJlPShmdW5jdGlvbihvdGhlcil7aWYodGhpcy5lcXVhbHMob3RoZXIpKXtyZXR1cm4gMH12YXIgdGhpc05lZz10aGlzLmlzTmVnYXRpdmUoKTt2YXIgb3RoZXJOZWc9b3RoZXIuaXNOZWdhdGl2ZSgpO2lmKHRoaXNOZWcmJiFvdGhlck5lZyl7cmV0dXJuLTF9aWYoIXRoaXNOZWcmJm90aGVyTmVnKXtyZXR1cm4gMX1pZih0aGlzLnN1YnRyYWN0KG90aGVyKS5pc05lZ2F0aXZlKCkpe3JldHVybi0xfWVsc2V7cmV0dXJuIDF9fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLm5lZ2F0ZT0oZnVuY3Rpb24oKXtpZih0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFfWVsc2V7cmV0dXJuIHRoaXMubm90KCkuYWRkKGdvb2cubWF0aC5Mb25nLk9ORSl9fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmFkZD0oZnVuY3Rpb24ob3RoZXIpe3ZhciBhNDg9dGhpcy5oaWdoXz4+PjE2O3ZhciBhMzI9dGhpcy5oaWdoXyY2NTUzNTt2YXIgYTE2PXRoaXMubG93Xz4+PjE2O3ZhciBhMDA9dGhpcy5sb3dfJjY1NTM1O3ZhciBiNDg9b3RoZXIuaGlnaF8+Pj4xNjt2YXIgYjMyPW90aGVyLmhpZ2hfJjY1NTM1O3ZhciBiMTY9b3RoZXIubG93Xz4+PjE2O3ZhciBiMDA9b3RoZXIubG93XyY2NTUzNTt2YXIgYzQ4PTAsYzMyPTAsYzE2PTAsYzAwPTA7YzAwKz1hMDArYjAwO2MxNis9YzAwPj4+MTY7YzAwJj02NTUzNTtjMTYrPWExNitiMTY7YzMyKz1jMTY+Pj4xNjtjMTYmPTY1NTM1O2MzMis9YTMyK2IzMjtjNDgrPWMzMj4+PjE2O2MzMiY9NjU1MzU7YzQ4Kz1hNDgrYjQ4O2M0OCY9NjU1MzU7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGMxNjw8MTZ8YzAwLGM0ODw8MTZ8YzMyKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5zdWJ0cmFjdD0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiB0aGlzLmFkZChvdGhlci5uZWdhdGUoKSl9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubXVsdGlwbHk9KGZ1bmN0aW9uKG90aGVyKXtpZih0aGlzLmlzWmVybygpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuWkVST31lbHNlIGlmKG90aGVyLmlzWmVybygpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuWkVST31pZih0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gb3RoZXIuaXNPZGQoKT9nb29nLm1hdGguTG9uZy5NSU5fVkFMVUU6Z29vZy5tYXRoLkxvbmcuWkVST31lbHNlIGlmKG90aGVyLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gdGhpcy5pc09kZCgpP2dvb2cubWF0aC5Mb25nLk1JTl9WQUxVRTpnb29nLm1hdGguTG9uZy5aRVJPfWlmKHRoaXMuaXNOZWdhdGl2ZSgpKXtpZihvdGhlci5pc05lZ2F0aXZlKCkpe3JldHVybiB0aGlzLm5lZ2F0ZSgpLm11bHRpcGx5KG90aGVyLm5lZ2F0ZSgpKX1lbHNle3JldHVybiB0aGlzLm5lZ2F0ZSgpLm11bHRpcGx5KG90aGVyKS5uZWdhdGUoKX19ZWxzZSBpZihvdGhlci5pc05lZ2F0aXZlKCkpe3JldHVybiB0aGlzLm11bHRpcGx5KG90aGVyLm5lZ2F0ZSgpKS5uZWdhdGUoKX1pZih0aGlzLmxlc3NUaGFuKGdvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfKSYmb3RoZXIubGVzc1RoYW4oZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8yNF8pKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkqb3RoZXIudG9OdW1iZXIoKSl9dmFyIGE0OD10aGlzLmhpZ2hfPj4+MTY7dmFyIGEzMj10aGlzLmhpZ2hfJjY1NTM1O3ZhciBhMTY9dGhpcy5sb3dfPj4+MTY7dmFyIGEwMD10aGlzLmxvd18mNjU1MzU7dmFyIGI0OD1vdGhlci5oaWdoXz4+PjE2O3ZhciBiMzI9b3RoZXIuaGlnaF8mNjU1MzU7dmFyIGIxNj1vdGhlci5sb3dfPj4+MTY7dmFyIGIwMD1vdGhlci5sb3dfJjY1NTM1O3ZhciBjNDg9MCxjMzI9MCxjMTY9MCxjMDA9MDtjMDArPWEwMCpiMDA7YzE2Kz1jMDA+Pj4xNjtjMDAmPTY1NTM1O2MxNis9YTE2KmIwMDtjMzIrPWMxNj4+PjE2O2MxNiY9NjU1MzU7YzE2Kz1hMDAqYjE2O2MzMis9YzE2Pj4+MTY7YzE2Jj02NTUzNTtjMzIrPWEzMipiMDA7YzQ4Kz1jMzI+Pj4xNjtjMzImPTY1NTM1O2MzMis9YTE2KmIxNjtjNDgrPWMzMj4+PjE2O2MzMiY9NjU1MzU7YzMyKz1hMDAqYjMyO2M0OCs9YzMyPj4+MTY7YzMyJj02NTUzNTtjNDgrPWE0OCpiMDArYTMyKmIxNithMTYqYjMyK2EwMCpiNDg7YzQ4Jj02NTUzNTtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoYzE2PDwxNnxjMDAsYzQ4PDwxNnxjMzIpfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmRpdj0oZnVuY3Rpb24ob3RoZXIpe2lmKG90aGVyLmlzWmVybygpKXt0aHJvdyBFcnJvcigiZGl2aXNpb24gYnkgemVybyIpfWVsc2UgaWYodGhpcy5pc1plcm8oKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk99aWYodGhpcy5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSl7aWYob3RoZXIuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk9ORSl8fG90aGVyLmVxdWFscyhnb29nLm1hdGguTG9uZy5ORUdfT05FKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRX1lbHNlIGlmKG90aGVyLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuT05FfWVsc2V7dmFyIGhhbGZUaGlzPXRoaXMuc2hpZnRSaWdodCgxKTt2YXIgYXBwcm94PWhhbGZUaGlzLmRpdihvdGhlcikuc2hpZnRMZWZ0KDEpO2lmKGFwcHJveC5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuWkVSTykpe3JldHVybiBvdGhlci5pc05lZ2F0aXZlKCk/Z29vZy5tYXRoLkxvbmcuT05FOmdvb2cubWF0aC5Mb25nLk5FR19PTkV9ZWxzZXt2YXIgcmVtPXRoaXMuc3VidHJhY3Qob3RoZXIubXVsdGlwbHkoYXBwcm94KSk7dmFyIHJlc3VsdD1hcHByb3guYWRkKHJlbS5kaXYob3RoZXIpKTtyZXR1cm4gcmVzdWx0fX19ZWxzZSBpZihvdGhlci5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk99aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKG90aGVyLmlzTmVnYXRpdmUoKSl7cmV0dXJuIHRoaXMubmVnYXRlKCkuZGl2KG90aGVyLm5lZ2F0ZSgpKX1lbHNle3JldHVybiB0aGlzLm5lZ2F0ZSgpLmRpdihvdGhlcikubmVnYXRlKCl9fWVsc2UgaWYob3RoZXIuaXNOZWdhdGl2ZSgpKXtyZXR1cm4gdGhpcy5kaXYob3RoZXIubmVnYXRlKCkpLm5lZ2F0ZSgpfXZhciByZXM9Z29vZy5tYXRoLkxvbmcuWkVSTzt2YXIgcmVtPXRoaXM7d2hpbGUocmVtLmdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikpe3ZhciBhcHByb3g9TWF0aC5tYXgoMSxNYXRoLmZsb29yKHJlbS50b051bWJlcigpL290aGVyLnRvTnVtYmVyKCkpKTt2YXIgbG9nMj1NYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KS9NYXRoLkxOMik7dmFyIGRlbHRhPWxvZzI8PTQ4PzE6TWF0aC5wb3coMixsb2cyLTQ4KTt2YXIgYXBwcm94UmVzPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoYXBwcm94KTt2YXIgYXBwcm94UmVtPWFwcHJveFJlcy5tdWx0aXBseShvdGhlcik7d2hpbGUoYXBwcm94UmVtLmlzTmVnYXRpdmUoKXx8YXBwcm94UmVtLmdyZWF0ZXJUaGFuKHJlbSkpe2FwcHJveC09ZGVsdGE7YXBwcm94UmVzPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoYXBwcm94KTthcHByb3hSZW09YXBwcm94UmVzLm11bHRpcGx5KG90aGVyKX1pZihhcHByb3hSZXMuaXNaZXJvKCkpe2FwcHJveFJlcz1nb29nLm1hdGguTG9uZy5PTkV9cmVzPXJlcy5hZGQoYXBwcm94UmVzKTtyZW09cmVtLnN1YnRyYWN0KGFwcHJveFJlbSl9cmV0dXJuIHJlc30pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5tb2R1bG89KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gdGhpcy5zdWJ0cmFjdCh0aGlzLmRpdihvdGhlcikubXVsdGlwbHkob3RoZXIpKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ub3Q9KGZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKH50aGlzLmxvd18sfnRoaXMuaGlnaF8pfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmFuZD0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyh0aGlzLmxvd18mb3RoZXIubG93Xyx0aGlzLmhpZ2hfJm90aGVyLmhpZ2hfKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5vcj0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyh0aGlzLmxvd198b3RoZXIubG93Xyx0aGlzLmhpZ2hffG90aGVyLmhpZ2hfKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS54b3I9KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHModGhpcy5sb3dfXm90aGVyLmxvd18sdGhpcy5oaWdoX15vdGhlci5oaWdoXyl9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuc2hpZnRMZWZ0PShmdW5jdGlvbihudW1CaXRzKXtudW1CaXRzJj02MztpZihudW1CaXRzPT0wKXtyZXR1cm4gdGhpc31lbHNle3ZhciBsb3c9dGhpcy5sb3dfO2lmKG51bUJpdHM8MzIpe3ZhciBoaWdoPXRoaXMuaGlnaF87cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGxvdzw8bnVtQml0cyxoaWdoPDxudW1CaXRzfGxvdz4+PjMyLW51bUJpdHMpfWVsc2V7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKDAsbG93PDxudW1CaXRzLTMyKX19fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnNoaWZ0UmlnaHQ9KGZ1bmN0aW9uKG51bUJpdHMpe251bUJpdHMmPTYzO2lmKG51bUJpdHM9PTApe3JldHVybiB0aGlzfWVsc2V7dmFyIGhpZ2g9dGhpcy5oaWdoXztpZihudW1CaXRzPDMyKXt2YXIgbG93PXRoaXMubG93XztyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHMobG93Pj4+bnVtQml0c3xoaWdoPDwzMi1udW1CaXRzLGhpZ2g+Pm51bUJpdHMpfWVsc2V7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGhpZ2g+Pm51bUJpdHMtMzIsaGlnaD49MD8wOi0xKX19fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZD0oZnVuY3Rpb24obnVtQml0cyl7bnVtQml0cyY9NjM7aWYobnVtQml0cz09MCl7cmV0dXJuIHRoaXN9ZWxzZXt2YXIgaGlnaD10aGlzLmhpZ2hfO2lmKG51bUJpdHM8MzIpe3ZhciBsb3c9dGhpcy5sb3dfO3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyhsb3c+Pj5udW1CaXRzfGhpZ2g8PDMyLW51bUJpdHMsaGlnaD4+Pm51bUJpdHMpfWVsc2UgaWYobnVtQml0cz09MzIpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyhoaWdoLDApfWVsc2V7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGhpZ2g+Pj5udW1CaXRzLTMyLDApfX19KTt2YXIgbmF2aWdhdG9yPXthcHBOYW1lOiJNb2Rlcm4gQnJvd3NlciJ9O3ZhciBkYml0czt2YXIgY2FuYXJ5PTB4ZGVhZGJlZWZjYWZlO3ZhciBqX2xtPShjYW5hcnkmMTY3NzcyMTUpPT0xNTcxNTA3MDtmdW5jdGlvbiBCaWdJbnRlZ2VyKGEsYixjKXtpZihhIT1udWxsKWlmKCJudW1iZXIiPT10eXBlb2YgYSl0aGlzLmZyb21OdW1iZXIoYSxiLGMpO2Vsc2UgaWYoYj09bnVsbCYmInN0cmluZyIhPXR5cGVvZiBhKXRoaXMuZnJvbVN0cmluZyhhLDI1Nik7ZWxzZSB0aGlzLmZyb21TdHJpbmcoYSxiKX1mdW5jdGlvbiBuYmkoKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCl9ZnVuY3Rpb24gYW0xKGkseCx3LGosYyxuKXt3aGlsZSgtLW4+PTApe3ZhciB2PXgqdGhpc1tpKytdK3dbal0rYztjPU1hdGguZmxvb3Iodi82NzEwODg2NCk7d1tqKytdPXYmNjcxMDg4NjN9cmV0dXJuIGN9ZnVuY3Rpb24gYW0yKGkseCx3LGosYyxuKXt2YXIgeGw9eCYzMjc2Nyx4aD14Pj4xNTt3aGlsZSgtLW4+PTApe3ZhciBsPXRoaXNbaV0mMzI3Njc7dmFyIGg9dGhpc1tpKytdPj4xNTt2YXIgbT14aCpsK2gqeGw7bD14bCpsKygobSYzMjc2Nyk8PDE1KSt3W2pdKyhjJjEwNzM3NDE4MjMpO2M9KGw+Pj4zMCkrKG0+Pj4xNSkreGgqaCsoYz4+PjMwKTt3W2orK109bCYxMDczNzQxODIzfXJldHVybiBjfWZ1bmN0aW9uIGFtMyhpLHgsdyxqLGMsbil7dmFyIHhsPXgmMTYzODMseGg9eD4+MTQ7d2hpbGUoLS1uPj0wKXt2YXIgbD10aGlzW2ldJjE2MzgzO3ZhciBoPXRoaXNbaSsrXT4+MTQ7dmFyIG09eGgqbCtoKnhsO2w9eGwqbCsoKG0mMTYzODMpPDwxNCkrd1tqXStjO2M9KGw+PjI4KSsobT4+MTQpK3hoKmg7d1tqKytdPWwmMjY4NDM1NDU1fXJldHVybiBjfWlmKGpfbG0mJm5hdmlnYXRvci5hcHBOYW1lPT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIil7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0yO2RiaXRzPTMwfWVsc2UgaWYoal9sbSYmbmF2aWdhdG9yLmFwcE5hbWUhPSJOZXRzY2FwZSIpe0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMTtkYml0cz0yNn1lbHNle0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMztkYml0cz0yOH1CaWdJbnRlZ2VyLnByb3RvdHlwZS5EQj1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5ETT0oMTw8ZGJpdHMpLTE7QmlnSW50ZWdlci5wcm90b3R5cGUuRFY9MTw8ZGJpdHM7dmFyIEJJX0ZQPTUyO0JpZ0ludGVnZXIucHJvdG90eXBlLkZWPU1hdGgucG93KDIsQklfRlApO0JpZ0ludGVnZXIucHJvdG90eXBlLkYxPUJJX0ZQLWRiaXRzO0JpZ0ludGVnZXIucHJvdG90eXBlLkYyPTIqZGJpdHMtQklfRlA7dmFyIEJJX1JNPSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiO3ZhciBCSV9SQz1uZXcgQXJyYXk7dmFyIHJyLHZ2O3JyPSIwIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0wO3Z2PD05OysrdnYpQklfUkNbcnIrK109dnY7cnI9ImEiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpQklfUkNbcnIrK109dnY7cnI9IkEiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpQklfUkNbcnIrK109dnY7ZnVuY3Rpb24gaW50MmNoYXIobil7cmV0dXJuIEJJX1JNLmNoYXJBdChuKX1mdW5jdGlvbiBpbnRBdChzLGkpe3ZhciBjPUJJX1JDW3MuY2hhckNvZGVBdChpKV07cmV0dXJuIGM9PW51bGw/LTE6Y31mdW5jdGlvbiBibnBDb3B5VG8ocil7Zm9yKHZhciBpPXRoaXMudC0xO2k+PTA7LS1pKXJbaV09dGhpc1tpXTtyLnQ9dGhpcy50O3Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wRnJvbUludCh4KXt0aGlzLnQ9MTt0aGlzLnM9eDwwPy0xOjA7aWYoeD4wKXRoaXNbMF09eDtlbHNlIGlmKHg8LTEpdGhpc1swXT14K0RWO2Vsc2UgdGhpcy50PTB9ZnVuY3Rpb24gbmJ2KGkpe3ZhciByPW5iaSgpO3IuZnJvbUludChpKTtyZXR1cm4gcn1mdW5jdGlvbiBibnBGcm9tU3RyaW5nKHMsYil7dmFyIGs7aWYoYj09MTYpaz00O2Vsc2UgaWYoYj09OClrPTM7ZWxzZSBpZihiPT0yNTYpaz04O2Vsc2UgaWYoYj09MilrPTE7ZWxzZSBpZihiPT0zMilrPTU7ZWxzZSBpZihiPT00KWs9MjtlbHNle3RoaXMuZnJvbVJhZGl4KHMsYik7cmV0dXJufXRoaXMudD0wO3RoaXMucz0wO3ZhciBpPXMubGVuZ3RoLG1pPWZhbHNlLHNoPTA7d2hpbGUoLS1pPj0wKXt2YXIgeD1rPT04P3NbaV0mMjU1OmludEF0KHMsaSk7aWYoeDwwKXtpZihzLmNoYXJBdChpKT09Ii0iKW1pPXRydWU7Y29udGludWV9bWk9ZmFsc2U7aWYoc2g9PTApdGhpc1t0aGlzLnQrK109eDtlbHNlIGlmKHNoK2s+dGhpcy5EQil7dGhpc1t0aGlzLnQtMV18PSh4JigxPDx0aGlzLkRCLXNoKS0xKTw8c2g7dGhpc1t0aGlzLnQrK109eD4+dGhpcy5EQi1zaH1lbHNlIHRoaXNbdGhpcy50LTFdfD14PDxzaDtzaCs9aztpZihzaD49dGhpcy5EQilzaC09dGhpcy5EQn1pZihrPT04JiYoc1swXSYxMjgpIT0wKXt0aGlzLnM9LTE7aWYoc2g+MCl0aGlzW3RoaXMudC0xXXw9KDE8PHRoaXMuREItc2gpLTE8PHNofXRoaXMuY2xhbXAoKTtpZihtaSlCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX1mdW5jdGlvbiBibnBDbGFtcCgpe3ZhciBjPXRoaXMucyZ0aGlzLkRNO3doaWxlKHRoaXMudD4wJiZ0aGlzW3RoaXMudC0xXT09YyktLXRoaXMudH1mdW5jdGlvbiBiblRvU3RyaW5nKGIpe2lmKHRoaXMuczwwKXJldHVybiItIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGIpO3ZhciBrO2lmKGI9PTE2KWs9NDtlbHNlIGlmKGI9PTgpaz0zO2Vsc2UgaWYoYj09MilrPTE7ZWxzZSBpZihiPT0zMilrPTU7ZWxzZSBpZihiPT00KWs9MjtlbHNlIHJldHVybiB0aGlzLnRvUmFkaXgoYik7dmFyIGttPSgxPDxrKS0xLGQsbT1mYWxzZSxyPSIiLGk9dGhpcy50O3ZhciBwPXRoaXMuREItaSp0aGlzLkRCJWs7aWYoaS0tPjApe2lmKHA8dGhpcy5EQiYmKGQ9dGhpc1tpXT4+cCk+MCl7bT10cnVlO3I9aW50MmNoYXIoZCl9d2hpbGUoaT49MCl7aWYocDxrKXtkPSh0aGlzW2ldJigxPDxwKS0xKTw8ay1wO2R8PXRoaXNbLS1pXT4+KHArPXRoaXMuREItayl9ZWxzZXtkPXRoaXNbaV0+PihwLT1rKSZrbTtpZihwPD0wKXtwKz10aGlzLkRCOy0taX19aWYoZD4wKW09dHJ1ZTtpZihtKXIrPWludDJjaGFyKGQpfX1yZXR1cm4gbT9yOiIwIn1mdW5jdGlvbiBibk5lZ2F0ZSgpe3ZhciByPW5iaSgpO0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHIpO3JldHVybiByfWZ1bmN0aW9uIGJuQWJzKCl7cmV0dXJuIHRoaXMuczwwP3RoaXMubmVnYXRlKCk6dGhpc31mdW5jdGlvbiBibkNvbXBhcmVUbyhhKXt2YXIgcj10aGlzLnMtYS5zO2lmKHIhPTApcmV0dXJuIHI7dmFyIGk9dGhpcy50O3I9aS1hLnQ7aWYociE9MClyZXR1cm4gdGhpcy5zPDA/LXI6cjt3aGlsZSgtLWk+PTApaWYoKHI9dGhpc1tpXS1hW2ldKSE9MClyZXR1cm4gcjtyZXR1cm4gMH1mdW5jdGlvbiBuYml0cyh4KXt2YXIgcj0xLHQ7aWYoKHQ9eD4+PjE2KSE9MCl7eD10O3IrPTE2fWlmKCh0PXg+PjgpIT0wKXt4PXQ7cis9OH1pZigodD14Pj40KSE9MCl7eD10O3IrPTR9aWYoKHQ9eD4+MikhPTApe3g9dDtyKz0yfWlmKCh0PXg+PjEpIT0wKXt4PXQ7cis9MX1yZXR1cm4gcn1mdW5jdGlvbiBibkJpdExlbmd0aCgpe2lmKHRoaXMudDw9MClyZXR1cm4gMDtyZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXnRoaXMucyZ0aGlzLkRNKX1mdW5jdGlvbiBibnBETFNoaWZ0VG8obixyKXt2YXIgaTtmb3IoaT10aGlzLnQtMTtpPj0wOy0taSlyW2krbl09dGhpc1tpXTtmb3IoaT1uLTE7aT49MDstLWkpcltpXT0wO3IudD10aGlzLnQrbjtyLnM9dGhpcy5zfWZ1bmN0aW9uIGJucERSU2hpZnRUbyhuLHIpe2Zvcih2YXIgaT1uO2k8dGhpcy50OysraSlyW2ktbl09dGhpc1tpXTtyLnQ9TWF0aC5tYXgodGhpcy50LW4sMCk7ci5zPXRoaXMuc31mdW5jdGlvbiBibnBMU2hpZnRUbyhuLHIpe3ZhciBicz1uJXRoaXMuREI7dmFyIGNicz10aGlzLkRCLWJzO3ZhciBibT0oMTw8Y2JzKS0xO3ZhciBkcz1NYXRoLmZsb29yKG4vdGhpcy5EQiksYz10aGlzLnM8PGJzJnRoaXMuRE0saTtmb3IoaT10aGlzLnQtMTtpPj0wOy0taSl7cltpK2RzKzFdPXRoaXNbaV0+PmNic3xjO2M9KHRoaXNbaV0mYm0pPDxic31mb3IoaT1kcy0xO2k+PTA7LS1pKXJbaV09MDtyW2RzXT1jO3IudD10aGlzLnQrZHMrMTtyLnM9dGhpcy5zO3IuY2xhbXAoKX1mdW5jdGlvbiBibnBSU2hpZnRUbyhuLHIpe3Iucz10aGlzLnM7dmFyIGRzPU1hdGguZmxvb3Iobi90aGlzLkRCKTtpZihkcz49dGhpcy50KXtyLnQ9MDtyZXR1cm59dmFyIGJzPW4ldGhpcy5EQjt2YXIgY2JzPXRoaXMuREItYnM7dmFyIGJtPSgxPDxicyktMTtyWzBdPXRoaXNbZHNdPj5icztmb3IodmFyIGk9ZHMrMTtpPHRoaXMudDsrK2kpe3JbaS1kcy0xXXw9KHRoaXNbaV0mYm0pPDxjYnM7cltpLWRzXT10aGlzW2ldPj5ic31pZihicz4wKXJbdGhpcy50LWRzLTFdfD0odGhpcy5zJmJtKTw8Y2JzO3IudD10aGlzLnQtZHM7ci5jbGFtcCgpfWZ1bmN0aW9uIGJucFN1YlRvKGEscil7dmFyIGk9MCxjPTAsbT1NYXRoLm1pbihhLnQsdGhpcy50KTt3aGlsZShpPG0pe2MrPXRoaXNbaV0tYVtpXTtyW2krK109YyZ0aGlzLkRNO2M+Pj10aGlzLkRCfWlmKGEudDx0aGlzLnQpe2MtPWEuczt3aGlsZShpPHRoaXMudCl7Yys9dGhpc1tpXTtyW2krK109YyZ0aGlzLkRNO2M+Pj10aGlzLkRCfWMrPXRoaXMuc31lbHNle2MrPXRoaXMuczt3aGlsZShpPGEudCl7Yy09YVtpXTtyW2krK109YyZ0aGlzLkRNO2M+Pj10aGlzLkRCfWMtPWEuc31yLnM9YzwwPy0xOjA7aWYoYzwtMSlyW2krK109dGhpcy5EVitjO2Vsc2UgaWYoYz4wKXJbaSsrXT1jO3IudD1pO3IuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVRvKGEscil7dmFyIHg9dGhpcy5hYnMoKSx5PWEuYWJzKCk7dmFyIGk9eC50O3IudD1pK3kudDt3aGlsZSgtLWk+PTApcltpXT0wO2ZvcihpPTA7aTx5LnQ7KytpKXJbaSt4LnRdPXguYW0oMCx5W2ldLHIsaSwwLHgudCk7ci5zPTA7ci5jbGFtcCgpO2lmKHRoaXMucyE9YS5zKUJpZ0ludGVnZXIuWkVSTy5zdWJUbyhyLHIpfWZ1bmN0aW9uIGJucFNxdWFyZVRvKHIpe3ZhciB4PXRoaXMuYWJzKCk7dmFyIGk9ci50PTIqeC50O3doaWxlKC0taT49MClyW2ldPTA7Zm9yKGk9MDtpPHgudC0xOysraSl7dmFyIGM9eC5hbShpLHhbaV0sciwyKmksMCwxKTtpZigocltpK3gudF0rPXguYW0oaSsxLDIqeFtpXSxyLDIqaSsxLGMseC50LWktMSkpPj14LkRWKXtyW2kreC50XS09eC5EVjtyW2kreC50KzFdPTF9fWlmKHIudD4wKXJbci50LTFdKz14LmFtKGkseFtpXSxyLDIqaSwwLDEpO3Iucz0wO3IuY2xhbXAoKX1mdW5jdGlvbiBibnBEaXZSZW1UbyhtLHEscil7dmFyIHBtPW0uYWJzKCk7aWYocG0udDw9MClyZXR1cm47dmFyIHB0PXRoaXMuYWJzKCk7aWYocHQudDxwbS50KXtpZihxIT1udWxsKXEuZnJvbUludCgwKTtpZihyIT1udWxsKXRoaXMuY29weVRvKHIpO3JldHVybn1pZihyPT1udWxsKXI9bmJpKCk7dmFyIHk9bmJpKCksdHM9dGhpcy5zLG1zPW0uczt2YXIgbnNoPXRoaXMuREItbmJpdHMocG1bcG0udC0xXSk7aWYobnNoPjApe3BtLmxTaGlmdFRvKG5zaCx5KTtwdC5sU2hpZnRUbyhuc2gscil9ZWxzZXtwbS5jb3B5VG8oeSk7cHQuY29weVRvKHIpfXZhciB5cz15LnQ7dmFyIHkwPXlbeXMtMV07aWYoeTA9PTApcmV0dXJuO3ZhciB5dD15MCooMTw8dGhpcy5GMSkrKHlzPjE/eVt5cy0yXT4+dGhpcy5GMjowKTt2YXIgZDE9dGhpcy5GVi95dCxkMj0oMTw8dGhpcy5GMSkveXQsZT0xPDx0aGlzLkYyO3ZhciBpPXIudCxqPWkteXMsdD1xPT1udWxsP25iaSgpOnE7eS5kbFNoaWZ0VG8oaix0KTtpZihyLmNvbXBhcmVUbyh0KT49MCl7cltyLnQrK109MTtyLnN1YlRvKHQscil9QmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKHlzLHQpO3Quc3ViVG8oeSx5KTt3aGlsZSh5LnQ8eXMpeVt5LnQrK109MDt3aGlsZSgtLWo+PTApe3ZhciBxZD1yWy0taV09PXkwP3RoaXMuRE06TWF0aC5mbG9vcihyW2ldKmQxKyhyW2ktMV0rZSkqZDIpO2lmKChyW2ldKz15LmFtKDAscWQscixqLDAseXMpKTxxZCl7eS5kbFNoaWZ0VG8oaix0KTtyLnN1YlRvKHQscik7d2hpbGUocltpXTwtLXFkKXIuc3ViVG8odCxyKX19aWYocSE9bnVsbCl7ci5kclNoaWZ0VG8oeXMscSk7aWYodHMhPW1zKUJpZ0ludGVnZXIuWkVSTy5zdWJUbyhxLHEpfXIudD15cztyLmNsYW1wKCk7aWYobnNoPjApci5yU2hpZnRUbyhuc2gscik7aWYodHM8MClCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKX1mdW5jdGlvbiBibk1vZChhKXt2YXIgcj1uYmkoKTt0aGlzLmFicygpLmRpdlJlbVRvKGEsbnVsbCxyKTtpZih0aGlzLnM8MCYmci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKT4wKWEuc3ViVG8ocixyKTtyZXR1cm4gcn1mdW5jdGlvbiBDbGFzc2ljKG0pe3RoaXMubT1tfWZ1bmN0aW9uIGNDb252ZXJ0KHgpe2lmKHguczwwfHx4LmNvbXBhcmVUbyh0aGlzLm0pPj0wKXJldHVybiB4Lm1vZCh0aGlzLm0pO2Vsc2UgcmV0dXJuIHh9ZnVuY3Rpb24gY1JldmVydCh4KXtyZXR1cm4geH1mdW5jdGlvbiBjUmVkdWNlKHgpe3guZGl2UmVtVG8odGhpcy5tLG51bGwseCl9ZnVuY3Rpb24gY011bFRvKHgseSxyKXt4Lm11bHRpcGx5VG8oeSxyKTt0aGlzLnJlZHVjZShyKX1mdW5jdGlvbiBjU3FyVG8oeCxyKXt4LnNxdWFyZVRvKHIpO3RoaXMucmVkdWNlKHIpfUNsYXNzaWMucHJvdG90eXBlLmNvbnZlcnQ9Y0NvbnZlcnQ7Q2xhc3NpYy5wcm90b3R5cGUucmV2ZXJ0PWNSZXZlcnQ7Q2xhc3NpYy5wcm90b3R5cGUucmVkdWNlPWNSZWR1Y2U7Q2xhc3NpYy5wcm90b3R5cGUubXVsVG89Y011bFRvO0NsYXNzaWMucHJvdG90eXBlLnNxclRvPWNTcXJUbztmdW5jdGlvbiBibnBJbnZEaWdpdCgpe2lmKHRoaXMudDwxKXJldHVybiAwO3ZhciB4PXRoaXNbMF07aWYoKHgmMSk9PTApcmV0dXJuIDA7dmFyIHk9eCYzO3k9eSooMi0oeCYxNSkqeSkmMTU7eT15KigyLSh4JjI1NSkqeSkmMjU1O3k9eSooMi0oKHgmNjU1MzUpKnkmNjU1MzUpKSY2NTUzNTt5PXkqKDIteCp5JXRoaXMuRFYpJXRoaXMuRFY7cmV0dXJuIHk+MD90aGlzLkRWLXk6LXl9ZnVuY3Rpb24gTW9udGdvbWVyeShtKXt0aGlzLm09bTt0aGlzLm1wPW0uaW52RGlnaXQoKTt0aGlzLm1wbD10aGlzLm1wJjMyNzY3O3RoaXMubXBoPXRoaXMubXA+PjE1O3RoaXMudW09KDE8PG0uREItMTUpLTE7dGhpcy5tdDI9MiptLnR9ZnVuY3Rpb24gbW9udENvbnZlcnQoeCl7dmFyIHI9bmJpKCk7eC5hYnMoKS5kbFNoaWZ0VG8odGhpcy5tLnQscik7ci5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxyKTtpZih4LnM8MCYmci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKT4wKXRoaXMubS5zdWJUbyhyLHIpO3JldHVybiByfWZ1bmN0aW9uIG1vbnRSZXZlcnQoeCl7dmFyIHI9bmJpKCk7eC5jb3B5VG8ocik7dGhpcy5yZWR1Y2Uocik7cmV0dXJuIHJ9ZnVuY3Rpb24gbW9udFJlZHVjZSh4KXt3aGlsZSh4LnQ8PXRoaXMubXQyKXhbeC50KytdPTA7Zm9yKHZhciBpPTA7aTx0aGlzLm0udDsrK2kpe3ZhciBqPXhbaV0mMzI3Njc7dmFyIHUwPWoqdGhpcy5tcGwrKChqKnRoaXMubXBoKyh4W2ldPj4xNSkqdGhpcy5tcGwmdGhpcy51bSk8PDE1KSZ4LkRNO2o9aSt0aGlzLm0udDt4W2pdKz10aGlzLm0uYW0oMCx1MCx4LGksMCx0aGlzLm0udCk7d2hpbGUoeFtqXT49eC5EVil7eFtqXS09eC5EVjt4Wysral0rK319eC5jbGFtcCgpO3guZHJTaGlmdFRvKHRoaXMubS50LHgpO2lmKHguY29tcGFyZVRvKHRoaXMubSk+PTApeC5zdWJUbyh0aGlzLm0seCl9ZnVuY3Rpb24gbW9udFNxclRvKHgscil7eC5zcXVhcmVUbyhyKTt0aGlzLnJlZHVjZShyKX1mdW5jdGlvbiBtb250TXVsVG8oeCx5LHIpe3gubXVsdGlwbHlUbyh5LHIpO3RoaXMucmVkdWNlKHIpfU1vbnRnb21lcnkucHJvdG90eXBlLmNvbnZlcnQ9bW9udENvbnZlcnQ7TW9udGdvbWVyeS5wcm90b3R5cGUucmV2ZXJ0PW1vbnRSZXZlcnQ7TW9udGdvbWVyeS5wcm90b3R5cGUucmVkdWNlPW1vbnRSZWR1Y2U7TW9udGdvbWVyeS5wcm90b3R5cGUubXVsVG89bW9udE11bFRvO01vbnRnb21lcnkucHJvdG90eXBlLnNxclRvPW1vbnRTcXJUbztmdW5jdGlvbiBibnBJc0V2ZW4oKXtyZXR1cm4odGhpcy50PjA/dGhpc1swXSYxOnRoaXMucyk9PTB9ZnVuY3Rpb24gYm5wRXhwKGUseil7aWYoZT40Mjk0OTY3Mjk1fHxlPDEpcmV0dXJuIEJpZ0ludGVnZXIuT05FO3ZhciByPW5iaSgpLHIyPW5iaSgpLGc9ei5jb252ZXJ0KHRoaXMpLGk9bmJpdHMoZSktMTtnLmNvcHlUbyhyKTt3aGlsZSgtLWk+PTApe3ouc3FyVG8ocixyMik7aWYoKGUmMTw8aSk+MCl6Lm11bFRvKHIyLGcscik7ZWxzZXt2YXIgdD1yO3I9cjI7cjI9dH19cmV0dXJuIHoucmV2ZXJ0KHIpfWZ1bmN0aW9uIGJuTW9kUG93SW50KGUsbSl7dmFyIHo7aWYoZTwyNTZ8fG0uaXNFdmVuKCkpej1uZXcgQ2xhc3NpYyhtKTtlbHNlIHo9bmV3IE1vbnRnb21lcnkobSk7cmV0dXJuIHRoaXMuZXhwKGUseil9QmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvPWJucENvcHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50PWJucEZyb21JbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZz1ibnBGcm9tU3RyaW5nO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wPWJucENsYW1wO0JpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbz1ibnBETFNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvPWJucERSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbz1ibnBMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbz1ibnBSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbz1ibnBTdWJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvPWJucE11bHRpcGx5VG87QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG89Ym5wU3F1YXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG89Ym5wRGl2UmVtVG87QmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQ9Ym5wSW52RGlnaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuPWJucElzRXZlbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHA9Ym5wRXhwO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nPWJuVG9TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlPWJuTmVnYXRlO0JpZ0ludGVnZXIucHJvdG90eXBlLmFicz1ibkFicztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG89Ym5Db21wYXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoPWJuQml0TGVuZ3RoO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZD1ibk1vZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQ9Ym5Nb2RQb3dJbnQ7QmlnSW50ZWdlci5aRVJPPW5idigwKTtCaWdJbnRlZ2VyLk9ORT1uYnYoMSk7ZnVuY3Rpb24gYm5wRnJvbVJhZGl4KHMsYil7dGhpcy5mcm9tSW50KDApO2lmKGI9PW51bGwpYj0xMDt2YXIgY3M9dGhpcy5jaHVua1NpemUoYik7dmFyIGQ9TWF0aC5wb3coYixjcyksbWk9ZmFsc2Usaj0wLHc9MDtmb3IodmFyIGk9MDtpPHMubGVuZ3RoOysraSl7dmFyIHg9aW50QXQocyxpKTtpZih4PDApe2lmKHMuY2hhckF0KGkpPT0iLSImJnRoaXMuc2lnbnVtKCk9PTApbWk9dHJ1ZTtjb250aW51ZX13PWIqdyt4O2lmKCsraj49Y3Mpe3RoaXMuZE11bHRpcGx5KGQpO3RoaXMuZEFkZE9mZnNldCh3LDApO2o9MDt3PTB9fWlmKGo+MCl7dGhpcy5kTXVsdGlwbHkoTWF0aC5wb3coYixqKSk7dGhpcy5kQWRkT2Zmc2V0KHcsMCl9aWYobWkpQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyl9ZnVuY3Rpb24gYm5wQ2h1bmtTaXplKHIpe3JldHVybiBNYXRoLmZsb29yKE1hdGguTE4yKnRoaXMuREIvTWF0aC5sb2cocikpfWZ1bmN0aW9uIGJuU2lnTnVtKCl7aWYodGhpcy5zPDApcmV0dXJuLTE7ZWxzZSBpZih0aGlzLnQ8PTB8fHRoaXMudD09MSYmdGhpc1swXTw9MClyZXR1cm4gMDtlbHNlIHJldHVybiAxfWZ1bmN0aW9uIGJucERNdWx0aXBseShuKXt0aGlzW3RoaXMudF09dGhpcy5hbSgwLG4tMSx0aGlzLDAsMCx0aGlzLnQpOysrdGhpcy50O3RoaXMuY2xhbXAoKX1mdW5jdGlvbiBibnBEQWRkT2Zmc2V0KG4sdyl7aWYobj09MClyZXR1cm47d2hpbGUodGhpcy50PD13KXRoaXNbdGhpcy50KytdPTA7dGhpc1t3XSs9bjt3aGlsZSh0aGlzW3ddPj10aGlzLkRWKXt0aGlzW3ddLT10aGlzLkRWO2lmKCsrdz49dGhpcy50KXRoaXNbdGhpcy50KytdPTA7Kyt0aGlzW3ddfX1mdW5jdGlvbiBibnBUb1JhZGl4KGIpe2lmKGI9PW51bGwpYj0xMDtpZih0aGlzLnNpZ251bSgpPT0wfHxiPDJ8fGI+MzYpcmV0dXJuIjAiO3ZhciBjcz10aGlzLmNodW5rU2l6ZShiKTt2YXIgYT1NYXRoLnBvdyhiLGNzKTt2YXIgZD1uYnYoYSkseT1uYmkoKSx6PW5iaSgpLHI9IiI7dGhpcy5kaXZSZW1UbyhkLHkseik7d2hpbGUoeS5zaWdudW0oKT4wKXtyPShhK3ouaW50VmFsdWUoKSkudG9TdHJpbmcoYikuc3Vic3RyKDEpK3I7eS5kaXZSZW1UbyhkLHkseil9cmV0dXJuIHouaW50VmFsdWUoKS50b1N0cmluZyhiKStyfWZ1bmN0aW9uIGJuSW50VmFsdWUoKXtpZih0aGlzLnM8MCl7aWYodGhpcy50PT0xKXJldHVybiB0aGlzWzBdLXRoaXMuRFY7ZWxzZSBpZih0aGlzLnQ9PTApcmV0dXJuLTF9ZWxzZSBpZih0aGlzLnQ9PTEpcmV0dXJuIHRoaXNbMF07ZWxzZSBpZih0aGlzLnQ9PTApcmV0dXJuIDA7cmV0dXJuKHRoaXNbMV0mKDE8PDMyLXRoaXMuREIpLTEpPDx0aGlzLkRCfHRoaXNbMF19ZnVuY3Rpb24gYm5wQWRkVG8oYSxyKXt2YXIgaT0wLGM9MCxtPU1hdGgubWluKGEudCx0aGlzLnQpO3doaWxlKGk8bSl7Yys9dGhpc1tpXSthW2ldO3JbaSsrXT1jJnRoaXMuRE07Yz4+PXRoaXMuREJ9aWYoYS50PHRoaXMudCl7Yys9YS5zO3doaWxlKGk8dGhpcy50KXtjKz10aGlzW2ldO3JbaSsrXT1jJnRoaXMuRE07Yz4+PXRoaXMuREJ9Yys9dGhpcy5zfWVsc2V7Yys9dGhpcy5zO3doaWxlKGk8YS50KXtjKz1hW2ldO3JbaSsrXT1jJnRoaXMuRE07Yz4+PXRoaXMuREJ9Yys9YS5zfXIucz1jPDA/LTE6MDtpZihjPjApcltpKytdPWM7ZWxzZSBpZihjPC0xKXJbaSsrXT10aGlzLkRWK2M7ci50PWk7ci5jbGFtcCgpfUJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeD1ibnBGcm9tUmFkaXg7QmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplPWJucENodW5rU2l6ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaWdudW09Ym5TaWdOdW07QmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5PWJucERNdWx0aXBseTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kQWRkT2Zmc2V0PWJucERBZGRPZmZzZXQ7QmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeD1ibnBUb1JhZGl4O0JpZ0ludGVnZXIucHJvdG90eXBlLmludFZhbHVlPWJuSW50VmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG89Ym5wQWRkVG87dmFyIFdyYXBwZXI9e2FiczooZnVuY3Rpb24obCxoKXt2YXIgeD1uZXcgZ29vZy5tYXRoLkxvbmcobCxoKTt2YXIgcmV0O2lmKHguaXNOZWdhdGl2ZSgpKXtyZXQ9eC5uZWdhdGUoKX1lbHNle3JldD14fUhFQVAzMlt0ZW1wRG91YmxlUHRyPj4yXT1yZXQubG93XztIRUFQMzJbdGVtcERvdWJsZVB0cis0Pj4yXT1yZXQuaGlnaF99KSxlbnN1cmVUZW1wczooZnVuY3Rpb24oKXtpZihXcmFwcGVyLmVuc3VyZWRUZW1wcylyZXR1cm47V3JhcHBlci5lbnN1cmVkVGVtcHM9dHJ1ZTtXcmFwcGVyLnR3bzMyPW5ldyBCaWdJbnRlZ2VyO1dyYXBwZXIudHdvMzIuZnJvbVN0cmluZygiNDI5NDk2NzI5NiIsMTApO1dyYXBwZXIudHdvNjQ9bmV3IEJpZ0ludGVnZXI7V3JhcHBlci50d282NC5mcm9tU3RyaW5nKCIxODQ0Njc0NDA3MzcwOTU1MTYxNiIsMTApO1dyYXBwZXIudGVtcDE9bmV3IEJpZ0ludGVnZXI7V3JhcHBlci50ZW1wMj1uZXcgQmlnSW50ZWdlcn0pLGxoMmJpZ251bTooZnVuY3Rpb24obCxoKXt2YXIgYT1uZXcgQmlnSW50ZWdlcjthLmZyb21TdHJpbmcoaC50b1N0cmluZygpLDEwKTt2YXIgYj1uZXcgQmlnSW50ZWdlcjthLm11bHRpcGx5VG8oV3JhcHBlci50d28zMixiKTt2YXIgYz1uZXcgQmlnSW50ZWdlcjtjLmZyb21TdHJpbmcobC50b1N0cmluZygpLDEwKTt2YXIgZD1uZXcgQmlnSW50ZWdlcjtjLmFkZFRvKGIsZCk7cmV0dXJuIGR9KSxzdHJpbmdpZnk6KGZ1bmN0aW9uKGwsaCx1bnNpZ25lZCl7dmFyIHJldD0obmV3IGdvb2cubWF0aC5Mb25nKGwsaCkpLnRvU3RyaW5nKCk7aWYodW5zaWduZWQmJnJldFswXT09Ii0iKXtXcmFwcGVyLmVuc3VyZVRlbXBzKCk7dmFyIGJpZ251bT1uZXcgQmlnSW50ZWdlcjtiaWdudW0uZnJvbVN0cmluZyhyZXQsMTApO3JldD1uZXcgQmlnSW50ZWdlcjtXcmFwcGVyLnR3bzY0LmFkZFRvKGJpZ251bSxyZXQpO3JldD1yZXQudG9TdHJpbmcoMTApfXJldHVybiByZXR9KSxmcm9tU3RyaW5nOihmdW5jdGlvbihzdHIsYmFzZSxtaW4sbWF4LHVuc2lnbmVkKXtXcmFwcGVyLmVuc3VyZVRlbXBzKCk7dmFyIGJpZ251bT1uZXcgQmlnSW50ZWdlcjtiaWdudW0uZnJvbVN0cmluZyhzdHIsYmFzZSk7dmFyIGJpZ21pbj1uZXcgQmlnSW50ZWdlcjtiaWdtaW4uZnJvbVN0cmluZyhtaW4sMTApO3ZhciBiaWdtYXg9bmV3IEJpZ0ludGVnZXI7YmlnbWF4LmZyb21TdHJpbmcobWF4LDEwKTtpZih1bnNpZ25lZCYmYmlnbnVtLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPDApe3ZhciB0ZW1wPW5ldyBCaWdJbnRlZ2VyO2JpZ251bS5hZGRUbyhXcmFwcGVyLnR3bzY0LHRlbXApO2JpZ251bT10ZW1wfXZhciBlcnJvcj1mYWxzZTtpZihiaWdudW0uY29tcGFyZVRvKGJpZ21pbik8MCl7YmlnbnVtPWJpZ21pbjtlcnJvcj10cnVlfWVsc2UgaWYoYmlnbnVtLmNvbXBhcmVUbyhiaWdtYXgpPjApe2JpZ251bT1iaWdtYXg7ZXJyb3I9dHJ1ZX12YXIgcmV0PWdvb2cubWF0aC5Mb25nLmZyb21TdHJpbmcoYmlnbnVtLnRvU3RyaW5nKCkpO0hFQVAzMlt0ZW1wRG91YmxlUHRyPj4yXT1yZXQubG93XztIRUFQMzJbdGVtcERvdWJsZVB0cis0Pj4yXT1yZXQuaGlnaF87aWYoZXJyb3IpdGhyb3cicmFuZ2UgZXJyb3IifSl9O3JldHVybiBXcmFwcGVyfSkoKTtpZihtZW1vcnlJbml0aWFsaXplcil7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERXx8RU5WSVJPTk1FTlRfSVNfU0hFTEwpe3ZhciBkYXRhPU1vZHVsZVsicmVhZEJpbmFyeSJdKG1lbW9yeUluaXRpYWxpemVyKTtIRUFQVTguc2V0KGRhdGEsU1RBVElDX0JBU0UpfWVsc2V7YWRkUnVuRGVwZW5kZW5jeSgibWVtb3J5IGluaXRpYWxpemVyIik7QnJvd3Nlci5hc3luY0xvYWQobWVtb3J5SW5pdGlhbGl6ZXIsKGZ1bmN0aW9uKGRhdGEpe0hFQVBVOC5zZXQoZGF0YSxTVEFUSUNfQkFTRSk7cmVtb3ZlUnVuRGVwZW5kZW5jeSgibWVtb3J5IGluaXRpYWxpemVyIil9KSwoZnVuY3Rpb24oZGF0YSl7dGhyb3ciY291bGQgbm90IGxvYWQgbWVtb3J5IGluaXRpYWxpemVyICIrbWVtb3J5SW5pdGlhbGl6ZXJ9KSl9fWZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiO3RoaXMubWVzc2FnZT0iUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiK3N0YXR1cysiKSI7dGhpcy5zdGF0dXM9c3RhdHVzfUV4aXRTdGF0dXMucHJvdG90eXBlPW5ldyBFcnJvcjtFeGl0U3RhdHVzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FeGl0U3RhdHVzO3ZhciBpbml0aWFsU3RhY2tUb3A7dmFyIHByZWxvYWRTdGFydFRpbWU9bnVsbDt2YXIgY2FsbGVkTWFpbj1mYWxzZTtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9ZnVuY3Rpb24gcnVuQ2FsbGVyKCl7aWYoIU1vZHVsZVsiY2FsbGVkUnVuIl0mJnNob3VsZFJ1bk5vdylydW4oKTtpZighTW9kdWxlWyJjYWxsZWRSdW4iXSlkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtNb2R1bGVbImNhbGxNYWluIl09TW9kdWxlLmNhbGxNYWluPWZ1bmN0aW9uIGNhbGxNYWluKGFyZ3Mpe2Fzc2VydChydW5EZXBlbmRlbmNpZXM9PTAsImNhbm5vdCBjYWxsIG1haW4gd2hlbiBhc3luYyBkZXBlbmRlbmNpZXMgcmVtYWluISAobGlzdGVuIG9uIF9fQVRNQUlOX18pIik7YXNzZXJ0KF9fQVRQUkVSVU5fXy5sZW5ndGg9PTAsImNhbm5vdCBjYWxsIG1haW4gd2hlbiBwcmVSdW4gZnVuY3Rpb25zIHJlbWFpbiB0byBiZSBjYWxsZWQiKTthcmdzPWFyZ3N8fFtdO2Vuc3VyZUluaXRSdW50aW1lKCk7dmFyIGFyZ2M9YXJncy5sZW5ndGgrMTtmdW5jdGlvbiBwYWQoKXtmb3IodmFyIGk9MDtpPDQtMTtpKyspe2FyZ3YucHVzaCgwKX19dmFyIGFyZ3Y9W2FsbG9jYXRlKGludEFycmF5RnJvbVN0cmluZygiL2Jpbi90aGlzLnByb2dyYW0iKSwiaTgiLEFMTE9DX05PUk1BTCldO3BhZCgpO2Zvcih2YXIgaT0wO2k8YXJnYy0xO2k9aSsxKXthcmd2LnB1c2goYWxsb2NhdGUoaW50QXJyYXlGcm9tU3RyaW5nKGFyZ3NbaV0pLCJpOCIsQUxMT0NfTk9STUFMKSk7cGFkKCl9YXJndi5wdXNoKDApO2FyZ3Y9YWxsb2NhdGUoYXJndiwiaTMyIixBTExPQ19OT1JNQUwpO2luaXRpYWxTdGFja1RvcD1TVEFDS1RPUDt0cnl7dmFyIHJldD1Nb2R1bGVbIl9tYWluIl0oYXJnYyxhcmd2LDApO2lmKCFNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSl7ZXhpdChyZXQpfX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgRXhpdFN0YXR1cyl7cmV0dXJufWVsc2UgaWYoZT09IlNpbXVsYXRlSW5maW5pdGVMb29wIil7TW9kdWxlWyJub0V4aXRSdW50aW1lIl09dHJ1ZTtyZXR1cm59ZWxzZXtpZihlJiZ0eXBlb2YgZT09PSJvYmplY3QiJiZlLnN0YWNrKU1vZHVsZS5wcmludEVycigiZXhjZXB0aW9uIHRocm93bjogIitbZSxlLnN0YWNrXSk7dGhyb3cgZX19ZmluYWxseXtjYWxsZWRNYWluPXRydWV9fTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxNb2R1bGVbImFyZ3VtZW50cyJdO2lmKHByZWxvYWRTdGFydFRpbWU9PT1udWxsKXByZWxvYWRTdGFydFRpbWU9RGF0ZS5ub3coKTtpZihydW5EZXBlbmRlbmNpZXM+MCl7TW9kdWxlLnByaW50RXJyKCJydW4oKSBjYWxsZWQsIGJ1dCBkZXBlbmRlbmNpZXMgcmVtYWluLCBzbyBub3QgcnVubmluZyIpO3JldHVybn1wcmVSdW4oKTtpZihydW5EZXBlbmRlbmNpZXM+MClyZXR1cm47aWYoTW9kdWxlWyJjYWxsZWRSdW4iXSlyZXR1cm47ZnVuY3Rpb24gZG9SdW4oKXtpZihNb2R1bGVbImNhbGxlZFJ1biJdKXJldHVybjtNb2R1bGVbImNhbGxlZFJ1biJdPXRydWU7ZW5zdXJlSW5pdFJ1bnRpbWUoKTtwcmVNYWluKCk7aWYoRU5WSVJPTk1FTlRfSVNfV0VCJiZwcmVsb2FkU3RhcnRUaW1lIT09bnVsbCl7TW9kdWxlLnByaW50RXJyKCJwcmUtbWFpbiBwcmVwIHRpbWU6ICIrKERhdGUubm93KCktcHJlbG9hZFN0YXJ0VGltZSkrIiBtcyIpfWlmKE1vZHVsZVsiX21haW4iXSYmc2hvdWxkUnVuTm93KXtNb2R1bGVbImNhbGxNYWluIl0oYXJncyl9cG9zdFJ1bigpfWlmKE1vZHVsZVsic2V0U3RhdHVzIl0pe01vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7TW9kdWxlWyJzZXRTdGF0dXMiXSgiIil9KSwxKTtpZighQUJPUlQpZG9SdW4oKX0pLDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlWyJydW4iXT1Nb2R1bGUucnVuPXJ1bjtmdW5jdGlvbiBleGl0KHN0YXR1cyl7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPXN0YXR1cztTVEFDS1RPUD1pbml0aWFsU3RhY2tUb3A7ZXhpdFJ1bnRpbWUoKTt0aHJvdyBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpfU1vZHVsZVsiZXhpdCJdPU1vZHVsZS5leGl0PWV4aXQ7ZnVuY3Rpb24gYWJvcnQodGV4dCl7aWYodGV4dCl7TW9kdWxlLnByaW50KHRleHQpO01vZHVsZS5wcmludEVycih0ZXh0KX1BQk9SVD10cnVlO0VYSVRTVEFUVVM9MTt2YXIgZXh0cmE9IlxuSWYgdGhpcyBhYm9ydCgpIGlzIHVuZXhwZWN0ZWQsIGJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIHdoaWNoIGNhbiBnaXZlIG1vcmUgaW5mb3JtYXRpb24uIjt0aHJvdyJhYm9ydCgpIGF0ICIrc3RhY2tUcmFjZSgpK2V4dHJhfU1vZHVsZVsiYWJvcnQiXT1Nb2R1bGUuYWJvcnQ9YWJvcnQ7dmFyIEludGVybmFsRXJyb3I9TW9kdWxlWyJJbnRlcm5hbEVycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIkludGVybmFsRXJyb3IiKTt2YXIgQmluZGluZ0Vycm9yPU1vZHVsZVsiQmluZGluZ0Vycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIkJpbmRpbmdFcnJvciIpO3ZhciBVbmJvdW5kVHlwZUVycm9yPU1vZHVsZVsiVW5ib3VuZFR5cGVFcnJvciJdPWV4dGVuZEVycm9yKEJpbmRpbmdFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpO3ZhciBQdXJlVmlydHVhbEVycm9yPU1vZHVsZVsiUHVyZVZpcnR1YWxFcnJvciJdPWV4dGVuZEVycm9yKEJpbmRpbmdFcnJvciwiUHVyZVZpcnR1YWxFcnJvciIpO2Z1bmN0aW9uIHRocm93SW50ZXJuYWxFcnJvcihtZXNzYWdlKXt0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihtZXNzYWdlKX1mdW5jdGlvbiB0aHJvd0JpbmRpbmdFcnJvcihtZXNzYWdlKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKG1lc3NhZ2UpfWZ1bmN0aW9uIHRocm93VW5ib3VuZFR5cGVFcnJvcihtZXNzYWdlLHR5cGVzKXt2YXIgdW5ib3VuZFR5cGVzPVtdO3ZhciBzZWVuPXt9O2Z1bmN0aW9uIHZpc2l0KHR5cGUpe2lmKHNlZW5bdHlwZV0pe3JldHVybn1pZihyZWdpc3RlcmVkVHlwZXNbdHlwZV0pe3JldHVybn1pZih0eXBlRGVwZW5kZW5jaWVzW3R5cGVdKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdLmZvckVhY2godmlzaXQpO3JldHVybn11bmJvdW5kVHlwZXMucHVzaCh0eXBlKTtzZWVuW3R5cGVdPXRydWV9dHlwZXMuZm9yRWFjaCh2aXNpdCk7dGhyb3cgbmV3IFVuYm91bmRUeXBlRXJyb3IobWVzc2FnZSsiOiAiK3VuYm91bmRUeXBlcy5tYXAoZ2V0VHlwZU5hbWUpLmpvaW4oWyIsICJdKSl9ZnVuY3Rpb24gZW5zdXJlT3ZlcmxvYWRUYWJsZShwcm90byxtZXRob2ROYW1lLGh1bWFuTmFtZSl7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7dmFyIHByZXZGdW5jPXByb3RvW21ldGhvZE5hbWVdO3Byb3RvW21ldGhvZE5hbWVdPShmdW5jdGlvbigpe2lmKCFwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGFyZ3VtZW50cy5sZW5ndGgpKXt0aHJvd0JpbmRpbmdFcnJvcigiRnVuY3Rpb24gJyIraHVtYW5OYW1lKyInIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIithcmd1bWVudHMubGVuZ3RoKyIpIC0gZXhwZWN0cyBvbmUgb2YgKCIrcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSsiKSEiKX1yZXR1cm4gcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVthcmd1bWVudHMubGVuZ3RoXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlPVtdO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbcHJldkZ1bmMuYXJnQ291bnRdPXByZXZGdW5jfX1mdW5jdGlvbiBleHBvc2VQdWJsaWNTeW1ib2wobmFtZSx2YWx1ZSxudW1Bcmd1bWVudHMpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7aWYodW5kZWZpbmVkPT09bnVtQXJndW1lbnRzfHx1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZSYmdW5kZWZpbmVkIT09TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBwdWJsaWMgbmFtZSAnIituYW1lKyInIHR3aWNlIil9ZW5zdXJlT3ZlcmxvYWRUYWJsZShNb2R1bGUsbmFtZSxuYW1lKTtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkobnVtQXJndW1lbnRzKSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBvdmVybG9hZHMgb2YgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgKCIrbnVtQXJndW1lbnRzKyIpISIpfU1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlW251bUFyZ3VtZW50c109dmFsdWV9ZWxzZXtNb2R1bGVbbmFtZV09dmFsdWU7aWYodW5kZWZpbmVkIT09bnVtQXJndW1lbnRzKXtNb2R1bGVbbmFtZV0ubnVtQXJndW1lbnRzPW51bUFyZ3VtZW50c319fWZ1bmN0aW9uIHJlcGxhY2VQdWJsaWNTeW1ib2wobmFtZSx2YWx1ZSxudW1Bcmd1bWVudHMpe2lmKCFNb2R1bGUuaGFzT3duUHJvcGVydHkobmFtZSkpe3Rocm93SW50ZXJuYWxFcnJvcigiUmVwbGFjaW5nIG5vbmV4aXN0YW50IHB1YmxpYyBzeW1ib2wiKX1pZih1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZSYmdW5kZWZpbmVkIT09bnVtQXJndW1lbnRzKXtNb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZVtudW1Bcmd1bWVudHNdPXZhbHVlfWVsc2V7TW9kdWxlW25hbWVdPXZhbHVlfX1mdW5jdGlvbiBleHRlbmRFcnJvcihiYXNlRXJyb3JUeXBlLGVycm9yTmFtZSl7dmFyIGVycm9yQ2xhc3M9Y3JlYXRlTmFtZWRGdW5jdGlvbihlcnJvck5hbWUsKGZ1bmN0aW9uKG1lc3NhZ2Upe3RoaXMubmFtZT1lcnJvck5hbWU7dGhpcy5tZXNzYWdlPW1lc3NhZ2U7dmFyIHN0YWNrPShuZXcgRXJyb3IobWVzc2FnZSkpLnN0YWNrO2lmKHN0YWNrIT09dW5kZWZpbmVkKXt0aGlzLnN0YWNrPXRoaXMudG9TdHJpbmcoKSsiXG4iK3N0YWNrLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpfX0pKTtlcnJvckNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGJhc2VFcnJvclR5cGUucHJvdG90eXBlKTtlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lcnJvckNsYXNzO2Vycm9yQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPShmdW5jdGlvbigpe2lmKHRoaXMubWVzc2FnZT09PXVuZGVmaW5lZCl7cmV0dXJuIHRoaXMubmFtZX1lbHNle3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9fSk7cmV0dXJuIGVycm9yQ2xhc3N9ZnVuY3Rpb24gY3JlYXRlTmFtZWRGdW5jdGlvbihuYW1lLGJvZHkpe25hbWU9bWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpO3JldHVybihuZXcgRnVuY3Rpb24oImJvZHkiLCJyZXR1cm4gZnVuY3Rpb24gIituYW1lKyIoKSB7XG4iKycgICAgInVzZSBzdHJpY3QiOycrIiAgICByZXR1cm4gYm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuIisifTtcbiIpKShib2R5KX1mdW5jdGlvbiBfZW1iaW5kX3JlcHIodil7dmFyIHQ9dHlwZW9mIHY7aWYodD09PSJvYmplY3QifHx0PT09ImFycmF5Inx8dD09PSJmdW5jdGlvbiIpe3JldHVybiB2LnRvU3RyaW5nKCl9ZWxzZXtyZXR1cm4iIit2fX12YXIgcmVnaXN0ZXJlZEluc3RhbmNlcz17fTtmdW5jdGlvbiBnZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpe2lmKHB0cj09PXVuZGVmaW5lZCl7dGhyb3dCaW5kaW5nRXJyb3IoInB0ciBzaG91bGQgbm90IGJlIHVuZGVmaW5lZCIpfXdoaWxlKGNsYXNzXy5iYXNlQ2xhc3Mpe3B0cj1jbGFzc18udXBjYXN0KHB0cik7Y2xhc3NfPWNsYXNzXy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiByZWdpc3RlckluaGVyaXRlZEluc3RhbmNlKGNsYXNzXyxwdHIsaW5zdGFuY2Upe3B0cj1nZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpO2lmKHJlZ2lzdGVyZWRJbnN0YW5jZXMuaGFzT3duUHJvcGVydHkocHRyKSl7dGhyb3dCaW5kaW5nRXJyb3IoIlRyaWVkIHRvIHJlZ2lzdGVyIHJlZ2lzdGVyZWQgaW5zdGFuY2U6ICIrcHRyKX1lbHNle3JlZ2lzdGVyZWRJbnN0YW5jZXNbcHRyXT1pbnN0YW5jZX19ZnVuY3Rpb24gdW5yZWdpc3RlckluaGVyaXRlZEluc3RhbmNlKGNsYXNzXyxwdHIpe3B0cj1nZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpO2lmKHJlZ2lzdGVyZWRJbnN0YW5jZXMuaGFzT3duUHJvcGVydHkocHRyKSl7ZGVsZXRlIHJlZ2lzdGVyZWRJbnN0YW5jZXNbcHRyXX1lbHNle3Rocm93QmluZGluZ0Vycm9yKCJUcmllZCB0byB1bnJlZ2lzdGVyIHVucmVnaXN0ZXJlZCBpbnN0YW5jZTogIitwdHIpfX1mdW5jdGlvbiBnZXRJbmhlcml0ZWRJbnN0YW5jZShjbGFzc18scHRyKXtwdHI9Z2V0QmFzZXN0UG9pbnRlcihjbGFzc18scHRyKTtyZXR1cm4gcmVnaXN0ZXJlZEluc3RhbmNlc1twdHJdfWZ1bmN0aW9uIGdldEluaGVyaXRlZEluc3RhbmNlQ291bnQoKXtyZXR1cm4gT2JqZWN0LmtleXMocmVnaXN0ZXJlZEluc3RhbmNlcykubGVuZ3RofU1vZHVsZVsiZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudCJdPWdldEluaGVyaXRlZEluc3RhbmNlQ291bnQ7ZnVuY3Rpb24gZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcygpe3ZhciBydj1bXTtmb3IodmFyIGsgaW4gcmVnaXN0ZXJlZEluc3RhbmNlcyl7aWYocmVnaXN0ZXJlZEluc3RhbmNlcy5oYXNPd25Qcm9wZXJ0eShrKSl7cnYucHVzaChyZWdpc3RlcmVkSW5zdGFuY2VzW2tdKX19cmV0dXJuIHJ2fU1vZHVsZVsiZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcyJdPWdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM7dmFyIHJlZ2lzdGVyZWRUeXBlcz17fTt2YXIgYXdhaXRpbmdEZXBlbmRlbmNpZXM9e307dmFyIHR5cGVEZXBlbmRlbmNpZXM9e307dmFyIHJlZ2lzdGVyZWRQb2ludGVycz17fTtmdW5jdGlvbiByZWdpc3RlclR5cGUocmF3VHlwZSxyZWdpc3RlcmVkSW5zdGFuY2Upe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHJlZ2lzdGVyZWRJbnN0YW5jZSkpe3Rocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKX12YXIgbmFtZT1yZWdpc3RlcmVkSW5zdGFuY2UubmFtZTtpZighcmF3VHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoJ3R5cGUgIicrbmFtZSsnIiBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHR5cGVpZCBwb2ludGVyJyl9aWYocmVnaXN0ZXJlZFR5cGVzLmhhc093blByb3BlcnR5KHJhd1R5cGUpKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHR5cGUgJyIrbmFtZSsiJyB0d2ljZSIpfXJlZ2lzdGVyZWRUeXBlc1tyYXdUeXBlXT1yZWdpc3RlcmVkSW5zdGFuY2U7ZGVsZXRlIHR5cGVEZXBlbmRlbmNpZXNbcmF3VHlwZV07aWYoYXdhaXRpbmdEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocmF3VHlwZSkpe3ZhciBjYWxsYmFja3M9YXdhaXRpbmdEZXBlbmRlbmNpZXNbcmF3VHlwZV07ZGVsZXRlIGF3YWl0aW5nRGVwZW5kZW5jaWVzW3Jhd1R5cGVdO2NhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbihjYil7Y2IoKX0pKX19ZnVuY3Rpb24gd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQobXlUeXBlcyxkZXBlbmRlbnRUeXBlcyxnZXRUeXBlQ29udmVydGVycyl7bXlUeXBlcy5mb3JFYWNoKChmdW5jdGlvbih0eXBlKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdPWRlcGVuZGVudFR5cGVzfSkpO2Z1bmN0aW9uIG9uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpe3ZhciBteVR5cGVDb252ZXJ0ZXJzPWdldFR5cGVDb252ZXJ0ZXJzKHR5cGVDb252ZXJ0ZXJzKTtpZihteVR5cGVDb252ZXJ0ZXJzLmxlbmd0aCE9PW15VHlwZXMubGVuZ3RoKXt0aHJvd0ludGVybmFsRXJyb3IoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKX1mb3IodmFyIGk9MDtpPG15VHlwZXMubGVuZ3RoOysraSl7cmVnaXN0ZXJUeXBlKG15VHlwZXNbaV0sbXlUeXBlQ29udmVydGVyc1tpXSl9fXZhciB0eXBlQ29udmVydGVycz1uZXcgQXJyYXkoZGVwZW5kZW50VHlwZXMubGVuZ3RoKTt2YXIgdW5yZWdpc3RlcmVkVHlwZXM9W107dmFyIHJlZ2lzdGVyZWQ9MDtkZXBlbmRlbnRUeXBlcy5mb3JFYWNoKChmdW5jdGlvbihkdCxpKXtpZihyZWdpc3RlcmVkVHlwZXMuaGFzT3duUHJvcGVydHkoZHQpKXt0eXBlQ29udmVydGVyc1tpXT1yZWdpc3RlcmVkVHlwZXNbZHRdfWVsc2V7dW5yZWdpc3RlcmVkVHlwZXMucHVzaChkdCk7aWYoIWF3YWl0aW5nRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KGR0KSl7YXdhaXRpbmdEZXBlbmRlbmNpZXNbZHRdPVtdfWF3YWl0aW5nRGVwZW5kZW5jaWVzW2R0XS5wdXNoKChmdW5jdGlvbigpe3R5cGVDb252ZXJ0ZXJzW2ldPXJlZ2lzdGVyZWRUeXBlc1tkdF07KytyZWdpc3RlcmVkO2lmKHJlZ2lzdGVyZWQ9PT11bnJlZ2lzdGVyZWRUeXBlcy5sZW5ndGgpe29uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpfX0pKX19KSk7aWYoMD09PXVucmVnaXN0ZXJlZFR5cGVzLmxlbmd0aCl7b25Db21wbGV0ZSh0eXBlQ29udmVydGVycyl9fXZhciBfX2NoYXJDb2Rlcz0oZnVuY3Rpb24oKXt2YXIgY29kZXM9bmV3IEFycmF5KDI1Nik7Zm9yKHZhciBpPTA7aTwyNTY7KytpKXtjb2Rlc1tpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfXJldHVybiBjb2Rlc30pKCk7ZnVuY3Rpb24gcmVhZExhdGluMVN0cmluZyhwdHIpe3ZhciByZXQ9IiI7dmFyIGM9cHRyO3doaWxlKEhFQVBVOFtjXSl7cmV0Kz1fX2NoYXJDb2Rlc1tIRUFQVThbYysrXV19cmV0dXJuIHJldH1mdW5jdGlvbiBnZXRUeXBlTmFtZSh0eXBlKXt2YXIgcHRyPV9fX2dldFR5cGVOYW1lKHR5cGUpO3ZhciBydj1yZWFkTGF0aW4xU3RyaW5nKHB0cik7X2ZyZWUocHRyKTtyZXR1cm4gcnZ9ZnVuY3Rpb24gaGVhcDMyVmVjdG9yVG9BcnJheShjb3VudCxmaXJzdEVsZW1lbnQpe3ZhciBhcnJheT1bXTtmb3IodmFyIGk9MDtpPGNvdW50O2krKyl7YXJyYXkucHVzaChIRUFQMzJbKGZpcnN0RWxlbWVudD4+MikraV0pfXJldHVybiBhcnJheX1mdW5jdGlvbiByZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmF3VHlwZSxodW1hbk5hbWUpe3ZhciBpbXBsPXJlZ2lzdGVyZWRUeXBlc1tyYXdUeXBlXTtpZih1bmRlZmluZWQ9PT1pbXBsKXt0aHJvd0JpbmRpbmdFcnJvcihodW1hbk5hbWUrIiBoYXMgdW5rbm93biB0eXBlICIrZ2V0VHlwZU5hbWUocmF3VHlwZSkpfXJldHVybiBpbXBsfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3ZvaWQocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiYXJnUGFja0FkdmFuY2UiOjAsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKCl7cmV0dXJuIHVuZGVmaW5lZH0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7cmV0dXJuIHVuZGVmaW5lZH0pfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfYm9vbChyYXdUeXBlLG5hbWUsc2l6ZSx0cnVlVmFsdWUsZmFsc2VWYWx1ZSl7dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKHd0KXtyZXR1cm4hIXd0fSksInRvV2lyZVR5cGUiOihmdW5jdGlvbihkZXN0cnVjdG9ycyxvKXtyZXR1cm4gbz90cnVlVmFsdWU6ZmFsc2VWYWx1ZX0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOihmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcDtpZihzaXplPT09MSl7aGVhcD1IRUFQOH1lbHNlIGlmKHNpemU9PT0yKXtoZWFwPUhFQVAxNn1lbHNlIGlmKHNpemU9PT00KXtoZWFwPUhFQVAzMn1lbHNle3Rocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gYm9vbGVhbiB0eXBlIHNpemU6ICIrbmFtZSl9cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+c2hpZnRdKX0pLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gZ2V0U2hpZnRGcm9tU2l6ZShzaXplKXtzd2l0Y2goc2l6ZSl7Y2FzZSAxOnJldHVybiAwO2Nhc2UgMjpyZXR1cm4gMTtjYXNlIDQ6cmV0dXJuIDI7Y2FzZSA4OnJldHVybiAzO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB0eXBlIHNpemU6ICIrc2l6ZSl9fWZ1bmN0aW9uIGludGVnZXJSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LHNpZ25lZCl7c3dpdGNoKHNoaWZ0KXtjYXNlIDA6cmV0dXJuKGZ1bmN0aW9uKHBvaW50ZXIpe3ZhciBoZWFwPXNpZ25lZD9IRUFQODpIRUFQVTg7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcl0pfSk7Y2FzZSAxOnJldHVybihmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDE2OkhFQVBVMTY7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+MV0pfSk7Y2FzZSAyOnJldHVybihmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDMyOkhFQVBVMzI7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+Ml0pfSk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGludGVnZXIgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gZmxvYXRSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0KXtzd2l0Y2goc2hpZnQpe2Nhc2UgMjpyZXR1cm4oZnVuY3Rpb24ocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBGMzJbcG9pbnRlcj4+Ml0pfSk7Y2FzZSAzOnJldHVybihmdW5jdGlvbihwb2ludGVyKXtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oSEVBUEY2NFtwb2ludGVyPj4zXSl9KTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZmxvYXQgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcihwcmltaXRpdmVUeXBlLG5hbWUsc2l6ZSxtaW5SYW5nZSxtYXhSYW5nZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO2lmKG1heFJhbmdlPT09LTEpe21heFJhbmdlPTQyOTQ5NjcyOTV9dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7cmVnaXN0ZXJUeXBlKHByaW1pdGl2ZVR5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZX0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe2lmKHR5cGVvZiB2YWx1ZSE9PSJudW1iZXIiJiZ0eXBlb2YgdmFsdWUhPT0iYm9vbGVhbiIpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK19lbWJpbmRfcmVwcih2YWx1ZSkrJyIgdG8gJyt0aGlzLm5hbWUpfWlmKHZhbHVlPG1pblJhbmdlfHx2YWx1ZT5tYXhSYW5nZSl7dGhyb3cgbmV3IFR5cGVFcnJvcignUGFzc2luZyBhIG51bWJlciAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIGZyb20gSlMgc2lkZSB0byBDL0MrKyBzaWRlIHRvIGFuIGFyZ3VtZW50IG9mIHR5cGUgIicrbmFtZSsnIiwgd2hpY2ggaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UgWycrbWluUmFuZ2UrIiwgIittYXhSYW5nZSsiXSEiKX1yZXR1cm4gdmFsdWV8MH0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmludGVnZXJSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LG1pblJhbmdlIT09MCksZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdChyYXdUeXBlLG5hbWUsc2l6ZSl7dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWV9KSwidG9XaXJlVHlwZSI6KGZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtpZih0eXBlb2YgdmFsdWUhPT0ibnVtYmVyIiYmdHlwZW9mIHZhbHVlIT09ImJvb2xlYW4iKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIHRvICcrdGhpcy5uYW1lKX1yZXR1cm4gdmFsdWV9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpmbG9hdFJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gc2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBVMzJbcG9pbnRlcj4+Ml0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24odmFsdWUpe3ZhciBsZW5ndGg9SEVBUFUzMlt2YWx1ZT4+Ml07dmFyIGE9bmV3IEFycmF5KGxlbmd0aCk7Zm9yKHZhciBpPTA7aTxsZW5ndGg7KytpKXthW2ldPVN0cmluZy5mcm9tQ2hhckNvZGUoSEVBUFU4W3ZhbHVlKzQraV0pfV9mcmVlKHZhbHVlKTtyZXR1cm4gYS5qb2luKCIiKX0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe2lmKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe3ZhbHVlPW5ldyBVaW50OEFycmF5KHZhbHVlKX1mdW5jdGlvbiBnZXRUQUVsZW1lbnQodGEsaW5kZXgpe3JldHVybiB0YVtpbmRleF19ZnVuY3Rpb24gZ2V0U3RyaW5nRWxlbWVudChzdHJpbmcsaW5kZXgpe3JldHVybiBzdHJpbmcuY2hhckNvZGVBdChpbmRleCl9dmFyIGdldEVsZW1lbnQ7aWYodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtnZXRFbGVtZW50PWdldFRBRWxlbWVudH1lbHNlIGlmKHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5KXtnZXRFbGVtZW50PWdldFRBRWxlbWVudH1lbHNlIGlmKHR5cGVvZiB2YWx1ZT09PSJzdHJpbmciKXtnZXRFbGVtZW50PWdldFN0cmluZ0VsZW1lbnR9ZWxzZXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBzdGQ6OnN0cmluZyIpfXZhciBsZW5ndGg9dmFsdWUubGVuZ3RoO3ZhciBwdHI9X21hbGxvYyg0K2xlbmd0aCk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aDtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe3ZhciBjaGFyQ29kZT1nZXRFbGVtZW50KHZhbHVlLGkpO2lmKGNoYXJDb2RlPjI1NSl7X2ZyZWUocHRyKTt0aHJvd0JpbmRpbmdFcnJvcigiU3RyaW5nIGhhcyBVVEYtMTYgY29kZSB1bml0cyB0aGF0IGRvIG5vdCBmaXQgaW4gOCBiaXRzIil9SEVBUFU4W3B0cis0K2ldPWNoYXJDb2RlfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpzaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcixkZXN0cnVjdG9yRnVuY3Rpb246KGZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX0pfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcocmF3VHlwZSxjaGFyU2l6ZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7dmFyIEhFQVAsc2hpZnQ7aWYoY2hhclNpemU9PT0yKXtIRUFQPUhFQVBVMTY7c2hpZnQ9MX1lbHNlIGlmKGNoYXJTaXplPT09NCl7SEVBUD1IRUFQVTMyO3NoaWZ0PTJ9cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24odmFsdWUpe3ZhciBsZW5ndGg9SEVBUFUzMlt2YWx1ZT4+Ml07dmFyIGE9bmV3IEFycmF5KGxlbmd0aCk7dmFyIHN0YXJ0PXZhbHVlKzQ+PnNoaWZ0O2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7YVtpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKEhFQVBbc3RhcnQraV0pfV9mcmVlKHZhbHVlKTtyZXR1cm4gYS5qb2luKCIiKX0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe3ZhciBsZW5ndGg9dmFsdWUubGVuZ3RoO3ZhciBwdHI9X21hbGxvYyg0K2xlbmd0aCpjaGFyU2l6ZSk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aDt2YXIgc3RhcnQ9cHRyKzQ+PnNoaWZ0O2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7SEVBUFtzdGFydCtpXT12YWx1ZS5jaGFyQ29kZUF0KGkpfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpzaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcixkZXN0cnVjdG9yRnVuY3Rpb246KGZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX0pfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW12YWwocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24oaGFuZGxlKXt2YXIgcnY9X2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlO19fZW12YWxfZGVjcmVmKGhhbmRsZSk7cmV0dXJuIHJ2fSksInRvV2lyZVR5cGUiOihmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIodmFsdWUpfSksImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldyhyYXdUeXBlLG5hbWUpe3ZhciB0eXBlTWFwcGluZz1bSW50OEFycmF5LFVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXldO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOihmdW5jdGlvbihoYW5kbGUpe3ZhciB0eXBlPUhFQVBVMzJbaGFuZGxlPj4yXTt2YXIgc2l6ZT1IRUFQVTMyWyhoYW5kbGU+PjIpKzFdO3ZhciBkYXRhPUhFQVBVMzJbKGhhbmRsZT4+MikrMl07dmFyIFRBPXR5cGVNYXBwaW5nW3R5cGVdO3JldHVybiBuZXcgVEEoSEVBUDguYnVmZmVyLGRhdGEsc2l6ZSl9KSwiYXJnUGFja0FkdmFuY2UiOjE2LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6KGZ1bmN0aW9uKHB0cil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKHB0cil9KX0pfWZ1bmN0aW9uIHJ1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKXt3aGlsZShkZXN0cnVjdG9ycy5sZW5ndGgpe3ZhciBwdHI9ZGVzdHJ1Y3RvcnMucG9wKCk7dmFyIGRlbD1kZXN0cnVjdG9ycy5wb3AoKTtkZWwocHRyKX19ZnVuY3Rpb24gbmV3Xyhjb25zdHJ1Y3Rvcixhcmd1bWVudExpc3Qpe2lmKCEoY29uc3RydWN0b3IgaW5zdGFuY2VvZiBGdW5jdGlvbikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIm5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAiK3R5cGVvZiBjb25zdHJ1Y3RvcisiIHdoaWNoIGlzIG5vdCBhIGZ1bmN0aW9uIil9dmFyIGR1bW15PWNyZWF0ZU5hbWVkRnVuY3Rpb24oY29uc3RydWN0b3IubmFtZSwoZnVuY3Rpb24oKXt9KSk7ZHVtbXkucHJvdG90eXBlPWNvbnN0cnVjdG9yLnByb3RvdHlwZTt2YXIgb2JqPW5ldyBkdW1teTt2YXIgcj1jb25zdHJ1Y3Rvci5hcHBseShvYmosYXJndW1lbnRMaXN0KTtyZXR1cm4gciBpbnN0YW5jZW9mIE9iamVjdD9yOm9ian1mdW5jdGlvbiBjcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLGNwcEludm9rZXJGdW5jLGNwcFRhcmdldEZ1bmMpe3ZhciBhcmdDb3VudD1hcmdUeXBlcy5sZW5ndGg7aWYoYXJnQ291bnQ8Mil7dGhyb3dCaW5kaW5nRXJyb3IoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpfXZhciBpc0NsYXNzTWV0aG9kRnVuYz1hcmdUeXBlc1sxXSE9PW51bGwmJmNsYXNzVHlwZSE9PW51bGw7dmFyIGFyZ3NMaXN0PSIiO3ZhciBhcmdzTGlzdFdpcmVkPSIiO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMjsrK2kpe2FyZ3NMaXN0Kz0oaSE9PTA/IiwgIjoiIikrImFyZyIraTthcmdzTGlzdFdpcmVkKz0oaSE9PTA/IiwgIjoiIikrImFyZyIraSsiV2lyZWQifXZhciBpbnZva2VyRm5Cb2R5PSJyZXR1cm4gZnVuY3Rpb24gIittYWtlTGVnYWxGdW5jdGlvbk5hbWUoaHVtYW5OYW1lKSsiKCIrYXJnc0xpc3QrIikge1xuIisiaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09ICIrKGFyZ0NvdW50LTIpKyIpIHtcbiIrInRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAiK2h1bWFuTmFtZSsiIGNhbGxlZCB3aXRoICcgKyBhcmd1bWVudHMubGVuZ3RoICsgJyBhcmd1bWVudHMsIGV4cGVjdGVkICIrKGFyZ0NvdW50LTIpKyIgYXJncyEnKTtcbiIrIn1cbiI7dmFyIG5lZWRzRGVzdHJ1Y3RvclN0YWNrPWZhbHNlO2Zvcih2YXIgaT0xO2k8YXJnVHlwZXMubGVuZ3RoOysraSl7aWYoYXJnVHlwZXNbaV0hPT1udWxsJiZhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb249PT11bmRlZmluZWQpe25lZWRzRGVzdHJ1Y3RvclN0YWNrPXRydWU7YnJlYWt9fWlmKG5lZWRzRGVzdHJ1Y3RvclN0YWNrKXtpbnZva2VyRm5Cb2R5Kz0idmFyIGRlc3RydWN0b3JzID0gW107XG4ifXZhciBkdG9yU3RhY2s9bmVlZHNEZXN0cnVjdG9yU3RhY2s/ImRlc3RydWN0b3JzIjoibnVsbCI7dmFyIGFyZ3MxPVsidGhyb3dCaW5kaW5nRXJyb3IiLCJpbnZva2VyIiwiZm4iLCJydW5EZXN0cnVjdG9ycyIsInJldFR5cGUiLCJjbGFzc1BhcmFtIl07dmFyIGFyZ3MyPVt0aHJvd0JpbmRpbmdFcnJvcixjcHBJbnZva2VyRnVuYyxjcHBUYXJnZXRGdW5jLHJ1bkRlc3RydWN0b3JzLGFyZ1R5cGVzWzBdLGFyZ1R5cGVzWzFdXTtpZihpc0NsYXNzTWV0aG9kRnVuYyl7aW52b2tlckZuQm9keSs9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtLnRvV2lyZVR5cGUoIitkdG9yU3RhY2srIiwgdGhpcyk7XG4ifWZvcih2YXIgaT0wO2k8YXJnQ291bnQtMjsrK2kpe2ludm9rZXJGbkJvZHkrPSJ2YXIgYXJnIitpKyJXaXJlZCA9IGFyZ1R5cGUiK2krIi50b1dpcmVUeXBlKCIrZHRvclN0YWNrKyIsIGFyZyIraSsiKTsgLy8gIithcmdUeXBlc1tpKzJdLm5hbWUrIlxuIjthcmdzMS5wdXNoKCJhcmdUeXBlIitpKTthcmdzMi5wdXNoKGFyZ1R5cGVzW2krMl0pfWlmKGlzQ2xhc3NNZXRob2RGdW5jKXthcmdzTGlzdFdpcmVkPSJ0aGlzV2lyZWQiKyhhcmdzTGlzdFdpcmVkLmxlbmd0aD4wPyIsICI6IiIpK2FyZ3NMaXN0V2lyZWR9dmFyIHJldHVybnM9YXJnVHlwZXNbMF0ubmFtZSE9PSJ2b2lkIjtpbnZva2VyRm5Cb2R5Kz0ocmV0dXJucz8idmFyIHJ2ID0gIjoiIikrImludm9rZXIoZm4iKyhhcmdzTGlzdFdpcmVkLmxlbmd0aD4wPyIsICI6IiIpK2FyZ3NMaXN0V2lyZWQrIik7XG4iO2lmKG5lZWRzRGVzdHJ1Y3RvclN0YWNrKXtpbnZva2VyRm5Cb2R5Kz0icnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO1xuIn1lbHNle2Zvcih2YXIgaT1pc0NsYXNzTWV0aG9kRnVuYz8xOjI7aTxhcmdUeXBlcy5sZW5ndGg7KytpKXt2YXIgcGFyYW1OYW1lPWk9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyhpLTIpKyJXaXJlZCI7aWYoYXJnVHlwZXNbaV0uZGVzdHJ1Y3RvckZ1bmN0aW9uIT09bnVsbCl7aW52b2tlckZuQm9keSs9cGFyYW1OYW1lKyJfZHRvcigiK3BhcmFtTmFtZSsiKTsgLy8gIithcmdUeXBlc1tpXS5uYW1lKyJcbiI7YXJnczEucHVzaChwYXJhbU5hbWUrIl9kdG9yIik7YXJnczIucHVzaChhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb24pfX19aWYocmV0dXJucyl7aW52b2tlckZuQm9keSs9InJldHVybiByZXRUeXBlLmZyb21XaXJlVHlwZShydik7XG4ifWludm9rZXJGbkJvZHkrPSJ9XG4iO2FyZ3MxLnB1c2goaW52b2tlckZuQm9keSk7dmFyIGludm9rZXJGdW5jdGlvbj1uZXdfKEZ1bmN0aW9uLGFyZ3MxKS5hcHBseShudWxsLGFyZ3MyKTtyZXR1cm4gaW52b2tlckZ1bmN0aW9ufWZ1bmN0aW9uIHJlcXVpcmVGdW5jdGlvbihzaWduYXR1cmUscmF3RnVuY3Rpb24pe3NpZ25hdHVyZT1yZWFkTGF0aW4xU3RyaW5nKHNpZ25hdHVyZSk7dmFyIGZwO2lmKHR5cGVvZiBGVU5DVElPTl9UQUJMRT09PSJ1bmRlZmluZWQiKXt2YXIgZGM9YXNtWyJkeW5DYWxsXyIrc2lnbmF0dXJlXTtpZihkYz09PXVuZGVmaW5lZCl7ZGM9YXNtWyJkeW5DYWxsXyIrc2lnbmF0dXJlLnJlcGxhY2UoL2YvZywiZCIpXTtpZihkYz09PXVuZGVmaW5lZCl7dGhyb3dCaW5kaW5nRXJyb3IoIk5vIGR5bkNhbGwgaW52b2tlciBmb3Igc2lnbmF0dXJlOiAiK3NpZ25hdHVyZSl9fWZwPWRjLmJpbmQodW5kZWZpbmVkLHJhd0Z1bmN0aW9uKX1lbHNle2ZwPUZVTkNUSU9OX1RBQkxFW3Jhd0Z1bmN0aW9uXX1pZih0eXBlb2YgZnAhPT0iZnVuY3Rpb24iKXt0aHJvd0JpbmRpbmdFcnJvcigidW5rbm93biBmdW5jdGlvbiBwb2ludGVyIHdpdGggc2lnbmF0dXJlICIrc2lnbmF0dXJlKyI6ICIrcmF3RnVuY3Rpb24pfXJldHVybiBmcH1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mdW5jdGlvbihuYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixzaWduYXR1cmUscmF3SW52b2tlcixmbil7dmFyIGFyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmF3SW52b2tlcj1yZXF1aXJlRnVuY3Rpb24oc2lnbmF0dXJlLHJhd0ludm9rZXIpO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLChmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgIituYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLGFyZ1R5cGVzKX0pLGFyZ0NvdW50LTEpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLGFyZ1R5cGVzLChmdW5jdGlvbihhcmdUeXBlcyl7dmFyIGludm9rZXJBcmdzQXJyYXk9W2FyZ1R5cGVzWzBdLG51bGxdLmNvbmNhdChhcmdUeXBlcy5zbGljZSgxKSk7cmVwbGFjZVB1YmxpY1N5bWJvbChuYW1lLGNyYWZ0SW52b2tlckZ1bmN0aW9uKG5hbWUsaW52b2tlckFyZ3NBcnJheSxudWxsLHJhd0ludm9rZXIsZm4pLGFyZ0NvdW50LTEpO3JldHVybltdfSkpfXZhciB0dXBsZVJlZ2lzdHJhdGlvbnM9e307ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfYXJyYXkocmF3VHlwZSxuYW1lLGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yLGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3Rvcil7dHVwbGVSZWdpc3RyYXRpb25zW3Jhd1R5cGVdPXtuYW1lOnJlYWRMYXRpbjFTdHJpbmcobmFtZSkscmF3Q29uc3RydWN0b3I6cmVxdWlyZUZ1bmN0aW9uKGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yKSxyYXdEZXN0cnVjdG9yOnJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpLGVsZW1lbnRzOltdfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9hcnJheV9lbGVtZW50KHJhd1R1cGxlVHlwZSxnZXR0ZXJSZXR1cm5UeXBlLGdldHRlclNpZ25hdHVyZSxnZXR0ZXIsZ2V0dGVyQ29udGV4dCxzZXR0ZXJBcmd1bWVudFR5cGUsc2V0dGVyU2lnbmF0dXJlLHNldHRlcixzZXR0ZXJDb250ZXh0KXt0dXBsZVJlZ2lzdHJhdGlvbnNbcmF3VHVwbGVUeXBlXS5lbGVtZW50cy5wdXNoKHtnZXR0ZXJSZXR1cm5UeXBlOmdldHRlclJldHVyblR5cGUsZ2V0dGVyOnJlcXVpcmVGdW5jdGlvbihnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyKSxnZXR0ZXJDb250ZXh0OmdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlOnNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXI6cmVxdWlyZUZ1bmN0aW9uKHNldHRlclNpZ25hdHVyZSxzZXR0ZXIpLHNldHRlckNvbnRleHQ6c2V0dGVyQ29udGV4dH0pfWZ1bmN0aW9uIF9fZW1iaW5kX2ZpbmFsaXplX3ZhbHVlX2FycmF5KHJhd1R1cGxlVHlwZSl7dmFyIHJlZz10dXBsZVJlZ2lzdHJhdGlvbnNbcmF3VHVwbGVUeXBlXTtkZWxldGUgdHVwbGVSZWdpc3RyYXRpb25zW3Jhd1R1cGxlVHlwZV07dmFyIGVsZW1lbnRzPXJlZy5lbGVtZW50czt2YXIgZWxlbWVudHNMZW5ndGg9ZWxlbWVudHMubGVuZ3RoO3ZhciBlbGVtZW50VHlwZXM9ZWxlbWVudHMubWFwKChmdW5jdGlvbihlbHQpe3JldHVybiBlbHQuZ2V0dGVyUmV0dXJuVHlwZX0pKS5jb25jYXQoZWxlbWVudHMubWFwKChmdW5jdGlvbihlbHQpe3JldHVybiBlbHQuc2V0dGVyQXJndW1lbnRUeXBlfSkpKTt2YXIgcmF3Q29uc3RydWN0b3I9cmVnLnJhd0NvbnN0cnVjdG9yO3ZhciByYXdEZXN0cnVjdG9yPXJlZy5yYXdEZXN0cnVjdG9yO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtyYXdUdXBsZVR5cGVdLGVsZW1lbnRUeXBlcywoZnVuY3Rpb24oZWxlbWVudFR5cGVzKXtlbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbihlbHQsaSl7dmFyIGdldHRlclJldHVyblR5cGU9ZWxlbWVudFR5cGVzW2ldO3ZhciBnZXR0ZXI9ZWx0LmdldHRlcjt2YXIgZ2V0dGVyQ29udGV4dD1lbHQuZ2V0dGVyQ29udGV4dDt2YXIgc2V0dGVyQXJndW1lbnRUeXBlPWVsZW1lbnRUeXBlc1tpK2VsZW1lbnRzTGVuZ3RoXTt2YXIgc2V0dGVyPWVsdC5zZXR0ZXI7dmFyIHNldHRlckNvbnRleHQ9ZWx0LnNldHRlckNvbnRleHQ7ZWx0LnJlYWQ9KGZ1bmN0aW9uKHB0cil7cmV0dXJuIGdldHRlclJldHVyblR5cGVbImZyb21XaXJlVHlwZSJdKGdldHRlcihnZXR0ZXJDb250ZXh0LHB0cikpfSk7ZWx0LndyaXRlPShmdW5jdGlvbihwdHIsbyl7dmFyIGRlc3RydWN0b3JzPVtdO3NldHRlcihzZXR0ZXJDb250ZXh0LHB0cixzZXR0ZXJBcmd1bWVudFR5cGVbInRvV2lyZVR5cGUiXShkZXN0cnVjdG9ycyxvKSk7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpfSl9KSk7cmV0dXJuW3tuYW1lOnJlZy5uYW1lLCJmcm9tV2lyZVR5cGUiOihmdW5jdGlvbihwdHIpe3ZhciBydj1uZXcgQXJyYXkoZWxlbWVudHNMZW5ndGgpO2Zvcih2YXIgaT0wO2k8ZWxlbWVudHNMZW5ndGg7KytpKXtydltpXT1lbGVtZW50c1tpXS5yZWFkKHB0cil9cmF3RGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7aWYoZWxlbWVudHNMZW5ndGghPT1vLmxlbmd0aCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW5jb3JyZWN0IG51bWJlciBvZiB0dXBsZSBlbGVtZW50cyBmb3IgIityZWcubmFtZSsiOiBleHBlY3RlZD0iK2VsZW1lbnRzTGVuZ3RoKyIsIGFjdHVhbD0iK28ubGVuZ3RoKX12YXIgcHRyPXJhd0NvbnN0cnVjdG9yKCk7Zm9yKHZhciBpPTA7aTxlbGVtZW50c0xlbmd0aDsrK2kpe2VsZW1lbnRzW2ldLndyaXRlKHB0cixvW2ldKX1pZihkZXN0cnVjdG9ycyE9PW51bGwpe2Rlc3RydWN0b3JzLnB1c2gocmF3RGVzdHJ1Y3RvcixwdHIpfXJldHVybiBwdHJ9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpzaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcixkZXN0cnVjdG9yRnVuY3Rpb246cmF3RGVzdHJ1Y3Rvcn1dfSkpfXZhciBzdHJ1Y3RSZWdpc3RyYXRpb25zPXt9O2Z1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX29iamVjdChyYXdUeXBlLG5hbWUsY29uc3RydWN0b3JTaWduYXR1cmUscmF3Q29uc3RydWN0b3IsZGVzdHJ1Y3RvclNpZ25hdHVyZSxyYXdEZXN0cnVjdG9yKXtzdHJ1Y3RSZWdpc3RyYXRpb25zW3Jhd1R5cGVdPXtuYW1lOnJlYWRMYXRpbjFTdHJpbmcobmFtZSkscmF3Q29uc3RydWN0b3I6cmVxdWlyZUZ1bmN0aW9uKGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yKSxyYXdEZXN0cnVjdG9yOnJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpLGZpZWxkczpbXX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0X2ZpZWxkKHN0cnVjdFR5cGUsZmllbGROYW1lLGdldHRlclJldHVyblR5cGUsZ2V0dGVyU2lnbmF0dXJlLGdldHRlcixnZXR0ZXJDb250ZXh0LHNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXJTaWduYXR1cmUsc2V0dGVyLHNldHRlckNvbnRleHQpe3N0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV0uZmllbGRzLnB1c2goe2ZpZWxkTmFtZTpyZWFkTGF0aW4xU3RyaW5nKGZpZWxkTmFtZSksZ2V0dGVyUmV0dXJuVHlwZTpnZXR0ZXJSZXR1cm5UeXBlLGdldHRlcjpyZXF1aXJlRnVuY3Rpb24oZ2V0dGVyU2lnbmF0dXJlLGdldHRlciksZ2V0dGVyQ29udGV4dDpnZXR0ZXJDb250ZXh0LHNldHRlckFyZ3VtZW50VHlwZTpzZXR0ZXJBcmd1bWVudFR5cGUsc2V0dGVyOnJlcXVpcmVGdW5jdGlvbihzZXR0ZXJTaWduYXR1cmUsc2V0dGVyKSxzZXR0ZXJDb250ZXh0OnNldHRlckNvbnRleHR9KX1mdW5jdGlvbiBfX2VtYmluZF9maW5hbGl6ZV92YWx1ZV9vYmplY3Qoc3RydWN0VHlwZSl7dmFyIHJlZz1zdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO2RlbGV0ZSBzdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO3ZhciByYXdDb25zdHJ1Y3Rvcj1yZWcucmF3Q29uc3RydWN0b3I7dmFyIHJhd0Rlc3RydWN0b3I9cmVnLnJhd0Rlc3RydWN0b3I7dmFyIGZpZWxkUmVjb3Jkcz1yZWcuZmllbGRzO3ZhciBmaWVsZFR5cGVzPWZpZWxkUmVjb3Jkcy5tYXAoKGZ1bmN0aW9uKGZpZWxkKXtyZXR1cm4gZmllbGQuZ2V0dGVyUmV0dXJuVHlwZX0pKS5jb25jYXQoZmllbGRSZWNvcmRzLm1hcCgoZnVuY3Rpb24oZmllbGQpe3JldHVybiBmaWVsZC5zZXR0ZXJBcmd1bWVudFR5cGV9KSkpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtzdHJ1Y3RUeXBlXSxmaWVsZFR5cGVzLChmdW5jdGlvbihmaWVsZFR5cGVzKXt2YXIgZmllbGRzPXt9O2ZpZWxkUmVjb3Jkcy5mb3JFYWNoKChmdW5jdGlvbihmaWVsZCxpKXt2YXIgZmllbGROYW1lPWZpZWxkLmZpZWxkTmFtZTt2YXIgZ2V0dGVyUmV0dXJuVHlwZT1maWVsZFR5cGVzW2ldO3ZhciBnZXR0ZXI9ZmllbGQuZ2V0dGVyO3ZhciBnZXR0ZXJDb250ZXh0PWZpZWxkLmdldHRlckNvbnRleHQ7dmFyIHNldHRlckFyZ3VtZW50VHlwZT1maWVsZFR5cGVzW2krZmllbGRSZWNvcmRzLmxlbmd0aF07dmFyIHNldHRlcj1maWVsZC5zZXR0ZXI7dmFyIHNldHRlckNvbnRleHQ9ZmllbGQuc2V0dGVyQ29udGV4dDtmaWVsZHNbZmllbGROYW1lXT17cmVhZDooZnVuY3Rpb24ocHRyKXtyZXR1cm4gZ2V0dGVyUmV0dXJuVHlwZVsiZnJvbVdpcmVUeXBlIl0oZ2V0dGVyKGdldHRlckNvbnRleHQscHRyKSl9KSx3cml0ZTooZnVuY3Rpb24ocHRyLG8pe3ZhciBkZXN0cnVjdG9ycz1bXTtzZXR0ZXIoc2V0dGVyQ29udGV4dCxwdHIsc2V0dGVyQXJndW1lbnRUeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsbykpO3J1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKX0pfX0pKTtyZXR1cm5be25hbWU6cmVnLm5hbWUsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKHB0cil7dmFyIHJ2PXt9O2Zvcih2YXIgaSBpbiBmaWVsZHMpe3J2W2ldPWZpZWxkc1tpXS5yZWFkKHB0cil9cmF3RGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7Zm9yKHZhciBmaWVsZE5hbWUgaW4gZmllbGRzKXtpZighKGZpZWxkTmFtZSBpbiBvKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBmaWVsZCIpfX12YXIgcHRyPXJhd0NvbnN0cnVjdG9yKCk7Zm9yKGZpZWxkTmFtZSBpbiBmaWVsZHMpe2ZpZWxkc1tmaWVsZE5hbWVdLndyaXRlKHB0cixvW2ZpZWxkTmFtZV0pfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChyYXdEZXN0cnVjdG9yLHB0cil9cmV0dXJuIHB0cn0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpyYXdEZXN0cnVjdG9yfV19KSl9dmFyIGdlbmVyaWNQb2ludGVyVG9XaXJlVHlwZT0oZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsaGFuZGxlKXtpZihoYW5kbGU9PT1udWxsKXtpZih0aGlzLmlzUmVmZXJlbmNlKXt0aHJvd0JpbmRpbmdFcnJvcigibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7dmFyIHB0cj10aGlzLnJhd0NvbnN0cnVjdG9yKCk7aWYoZGVzdHJ1Y3RvcnMhPT1udWxsKXtkZXN0cnVjdG9ycy5wdXNoKHRoaXMucmF3RGVzdHJ1Y3RvcixwdHIpfXJldHVybiBwdHJ9ZWxzZXtyZXR1cm4gMH19aWYoIWhhbmRsZS4kJCl7dGhyb3dCaW5kaW5nRXJyb3IoJ0Nhbm5vdCBwYXNzICInK19lbWJpbmRfcmVwcihoYW5kbGUpKyciIGFzIGEgJyt0aGlzLm5hbWUpfWlmKCFoYW5kbGUuJCQucHRyKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgIit0aGlzLm5hbWUpfWlmKCF0aGlzLmlzQ29uc3QmJmhhbmRsZS4kJC5wdHJUeXBlLmlzQ29uc3Qpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlICIrKGhhbmRsZS4kJC5zbWFydFB0clR5cGU/aGFuZGxlLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOmhhbmRsZS4kJC5wdHJUeXBlLm5hbWUpKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO2lmKHRoaXMuaXNTbWFydFBvaW50ZXIpe2lmKHVuZGVmaW5lZD09PWhhbmRsZS4kJC5zbWFydFB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3NpbmcgcmF3IHBvaW50ZXIgdG8gc21hcnQgcG9pbnRlciBpcyBpbGxlZ2FsIil9c3dpdGNoKHRoaXMuc2hhcmluZ1BvbGljeSl7Y2FzZSAwOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIisoaGFuZGxlLiQkLnNtYXJ0UHRyVHlwZT9oYW5kbGUuJCQuc21hcnRQdHJUeXBlLm5hbWU6aGFuZGxlLiQkLnB0clR5cGUubmFtZSkrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSl9YnJlYWs7Y2FzZSAxOnB0cj1oYW5kbGUuJCQuc21hcnRQdHI7YnJlYWs7Y2FzZSAyOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dmFyIGNsb25lZEhhbmRsZT1oYW5kbGVbImNsb25lIl0oKTtwdHI9dGhpcy5yYXdTaGFyZShwdHIsX19lbXZhbF9yZWdpc3RlcigoZnVuY3Rpb24oKXtjbG9uZWRIYW5kbGVbImRlbGV0ZSJdKCl9KSkpO2lmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IscHRyKX19YnJlYWs7ZGVmYXVsdDp0aHJvd0JpbmRpbmdFcnJvcigiVW5zdXBwb3J0aW5nIHNoYXJpbmcgcG9saWN5Iil9fXJldHVybiBwdHJ9KTt2YXIgY29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGU9KGZ1bmN0aW9uKGRlc3RydWN0b3JzLGhhbmRsZSl7aWYoaGFuZGxlPT09bnVsbCl7aWYodGhpcy5pc1JlZmVyZW5jZSl7dGhyb3dCaW5kaW5nRXJyb3IoIm51bGwgaXMgbm90IGEgdmFsaWQgIit0aGlzLm5hbWUpfXJldHVybiAwfWlmKCFoYW5kbGUuJCQpe3Rocm93QmluZGluZ0Vycm9yKCdDYW5ub3QgcGFzcyAiJytfZW1iaW5kX3JlcHIoaGFuZGxlKSsnIiBhcyBhICcrdGhpcy5uYW1lKX1pZighaGFuZGxlLiQkLnB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICIrdGhpcy5uYW1lKX12YXIgaGFuZGxlQ2xhc3M9aGFuZGxlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3ZhciBwdHI9dXBjYXN0UG9pbnRlcihoYW5kbGUuJCQucHRyLGhhbmRsZUNsYXNzLHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gcHRyfSk7dmFyIG5vbkNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlPShmdW5jdGlvbihkZXN0cnVjdG9ycyxoYW5kbGUpe2lmKGhhbmRsZT09PW51bGwpe2lmKHRoaXMuaXNSZWZlcmVuY2Upe3Rocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKX1yZXR1cm4gMH1pZighaGFuZGxlLiQkKXt0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicrX2VtYmluZF9yZXByKGhhbmRsZSkrJyIgYXMgYSAnK3RoaXMubmFtZSl9aWYoIWhhbmRsZS4kJC5wdHIpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSl9aWYoaGFuZGxlLiQkLnB0clR5cGUuaXNDb25zdCl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIitoYW5kbGUuJCQucHRyVHlwZS5uYW1lKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiBwdHJ9KTtmdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHJlZ2lzdGVyZWRDbGFzcyxpc1JlZmVyZW5jZSxpc0NvbnN0LGlzU21hcnRQb2ludGVyLHBvaW50ZWVUeXBlLHNoYXJpbmdQb2xpY3kscmF3R2V0UG9pbnRlZSxyYXdDb25zdHJ1Y3RvcixyYXdTaGFyZSxyYXdEZXN0cnVjdG9yKXt0aGlzLm5hbWU9bmFtZTt0aGlzLnJlZ2lzdGVyZWRDbGFzcz1yZWdpc3RlcmVkQ2xhc3M7dGhpcy5pc1JlZmVyZW5jZT1pc1JlZmVyZW5jZTt0aGlzLmlzQ29uc3Q9aXNDb25zdDt0aGlzLmlzU21hcnRQb2ludGVyPWlzU21hcnRQb2ludGVyO3RoaXMucG9pbnRlZVR5cGU9cG9pbnRlZVR5cGU7dGhpcy5zaGFyaW5nUG9saWN5PXNoYXJpbmdQb2xpY3k7dGhpcy5yYXdHZXRQb2ludGVlPXJhd0dldFBvaW50ZWU7dGhpcy5yYXdDb25zdHJ1Y3Rvcj1yYXdDb25zdHJ1Y3Rvcjt0aGlzLnJhd1NoYXJlPXJhd1NoYXJlO3RoaXMucmF3RGVzdHJ1Y3Rvcj1yYXdEZXN0cnVjdG9yO2lmKCFpc1NtYXJ0UG9pbnRlciYmcmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzcz09PXVuZGVmaW5lZCl7aWYoaXNDb25zdCl7dGhpc1sidG9XaXJlVHlwZSJdPWNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlO3RoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGx9ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09bm9uQ29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGU7dGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbH19ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09Z2VuZXJpY1BvaW50ZXJUb1dpcmVUeXBlfX1SZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGUuZ2V0UG9pbnRlZT1mdW5jdGlvbiBnZXRQb2ludGVlKHB0cil7aWYodGhpcy5yYXdHZXRQb2ludGVlKXtwdHI9dGhpcy5yYXdHZXRQb2ludGVlKHB0cil9cmV0dXJuIHB0cn07UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlLmRlc3RydWN0b3I9ZnVuY3Rpb24gZGVzdHJ1Y3RvcihwdHIpe2lmKHRoaXMucmF3RGVzdHJ1Y3Rvcil7dGhpcy5yYXdEZXN0cnVjdG9yKHB0cil9fTtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImFyZ1BhY2tBZHZhbmNlIl09ODtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl09c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXI7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlWyJkZWxldGVPYmplY3QiXT1mdW5jdGlvbiBkZWxldGVPYmplY3QoaGFuZGxlKXtpZihoYW5kbGUhPT1udWxsKXtoYW5kbGVbImRlbGV0ZSJdKCl9fTtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImZyb21XaXJlVHlwZSJdPWZ1bmN0aW9uIGZyb21XaXJlVHlwZShwdHIpe3ZhciByYXdQb2ludGVyPXRoaXMuZ2V0UG9pbnRlZShwdHIpO2lmKCFyYXdQb2ludGVyKXt0aGlzLmRlc3RydWN0b3IocHRyKTtyZXR1cm4gbnVsbH12YXIgcmVnaXN0ZXJlZEluc3RhbmNlPWdldEluaGVyaXRlZEluc3RhbmNlKHRoaXMucmVnaXN0ZXJlZENsYXNzLHJhd1BvaW50ZXIpO2lmKHVuZGVmaW5lZCE9PXJlZ2lzdGVyZWRJbnN0YW5jZSl7aWYoMD09PXJlZ2lzdGVyZWRJbnN0YW5jZS4kJC5jb3VudC52YWx1ZSl7cmVnaXN0ZXJlZEluc3RhbmNlLiQkLnB0cj1yYXdQb2ludGVyO3JlZ2lzdGVyZWRJbnN0YW5jZS4kJC5zbWFydFB0cj1wdHI7cmV0dXJuIHJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpfWVsc2V7dmFyIHJ2PXJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpO3RoaXMuZGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn19ZnVuY3Rpb24gbWFrZURlZmF1bHRIYW5kbGUoKXtpZih0aGlzLmlzU21hcnRQb2ludGVyKXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnJhd1BvaW50ZXIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOnB0cn0pfX12YXIgYWN0dWFsVHlwZT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHJhd1BvaW50ZXIpO3ZhciByZWdpc3RlcmVkUG9pbnRlclJlY29yZD1yZWdpc3RlcmVkUG9pbnRlcnNbYWN0dWFsVHlwZV07aWYoIXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkKXtyZXR1cm4gbWFrZURlZmF1bHRIYW5kbGUuY2FsbCh0aGlzKX12YXIgdG9UeXBlO2lmKHRoaXMuaXNDb25zdCl7dG9UeXBlPXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkLmNvbnN0UG9pbnRlclR5cGV9ZWxzZXt0b1R5cGU9cmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQucG9pbnRlclR5cGV9dmFyIGRwPWRvd25jYXN0UG9pbnRlcihyYXdQb2ludGVyLHRoaXMucmVnaXN0ZXJlZENsYXNzLHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MpO2lmKGRwPT09bnVsbCl7cmV0dXJuIG1ha2VEZWZhdWx0SGFuZGxlLmNhbGwodGhpcyl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0b1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRvVHlwZSxwdHI6ZHAsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUse3B0clR5cGU6dG9UeXBlLHB0cjpkcH0pfX07ZnVuY3Rpb24gbWFrZUNsYXNzSGFuZGxlKHByb3RvdHlwZSxyZWNvcmQpe2lmKCFyZWNvcmQucHRyVHlwZXx8IXJlY29yZC5wdHIpe3Rocm93SW50ZXJuYWxFcnJvcigibWFrZUNsYXNzSGFuZGxlIHJlcXVpcmVzIHB0ciBhbmQgcHRyVHlwZSIpfXZhciBoYXNTbWFydFB0clR5cGU9ISFyZWNvcmQuc21hcnRQdHJUeXBlO3ZhciBoYXNTbWFydFB0cj0hIXJlY29yZC5zbWFydFB0cjtpZihoYXNTbWFydFB0clR5cGUhPT1oYXNTbWFydFB0cil7dGhyb3dJbnRlcm5hbEVycm9yKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKX1yZWNvcmQuY291bnQ9e3ZhbHVlOjF9O3JldHVybiBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSx7JCQ6e3ZhbHVlOnJlY29yZH19KX1mdW5jdGlvbiBDbGFzc0hhbmRsZSgpe31mdW5jdGlvbiBnZXRJbnN0YW5jZVR5cGVOYW1lKGhhbmRsZSl7cmV0dXJuIGhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcy5uYW1lfUNsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNBbGlhc09mIl09ZnVuY3Rpb24gaXNBbGlhc09mKG90aGVyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBDbGFzc0hhbmRsZSkpe3JldHVybiBmYWxzZX1pZighKG90aGVyIGluc3RhbmNlb2YgQ2xhc3NIYW5kbGUpKXtyZXR1cm4gZmFsc2V9dmFyIGxlZnRDbGFzcz10aGlzLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3ZhciBsZWZ0PXRoaXMuJCQucHRyO3ZhciByaWdodENsYXNzPW90aGVyLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3ZhciByaWdodD1vdGhlci4kJC5wdHI7d2hpbGUobGVmdENsYXNzLmJhc2VDbGFzcyl7bGVmdD1sZWZ0Q2xhc3MudXBjYXN0KGxlZnQpO2xlZnRDbGFzcz1sZWZ0Q2xhc3MuYmFzZUNsYXNzfXdoaWxlKHJpZ2h0Q2xhc3MuYmFzZUNsYXNzKXtyaWdodD1yaWdodENsYXNzLnVwY2FzdChyaWdodCk7cmlnaHRDbGFzcz1yaWdodENsYXNzLmJhc2VDbGFzc31yZXR1cm4gbGVmdENsYXNzPT09cmlnaHRDbGFzcyYmbGVmdD09PXJpZ2h0fTtmdW5jdGlvbiB0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQob2JqKXt0aHJvd0JpbmRpbmdFcnJvcihnZXRJbnN0YW5jZVR5cGVOYW1lKG9iaikrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX1DbGFzc0hhbmRsZS5wcm90b3R5cGVbImNsb25lIl09ZnVuY3Rpb24gY2xvbmUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXt0aGlzLiQkLmNvdW50LnZhbHVlKz0xO3JldHVybiB0aGlzfWVsc2V7dmFyIGNsb25lPU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLHskJDp7dmFsdWU6c2hhbGxvd0NvcHkodGhpcy4kJCl9fSk7Y2xvbmUuJCQuY291bnQudmFsdWUrPTE7cmV0dXJuIGNsb25lfX07ZnVuY3Rpb24gcnVuRGVzdHJ1Y3RvcihoYW5kbGUpe3ZhciAkJD1oYW5kbGUuJCQ7aWYoJCQuc21hcnRQdHIpeyQkLnNtYXJ0UHRyVHlwZS5yYXdEZXN0cnVjdG9yKCQkLnNtYXJ0UHRyKX1lbHNleyQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoJCQucHRyKX19Q2xhc3NIYW5kbGUucHJvdG90eXBlWyJkZWxldGUiXT1mdW5jdGlvbiBDbGFzc0hhbmRsZV9kZWxldGUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCYmIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3Rocm93QmluZGluZ0Vycm9yKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIil9dGhpcy4kJC5jb3VudC52YWx1ZS09MTt2YXIgdG9EZWxldGU9MD09PXRoaXMuJCQuY291bnQudmFsdWU7aWYodG9EZWxldGUpe3J1bkRlc3RydWN0b3IodGhpcyl9aWYoIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3RoaXMuJCQuc21hcnRQdHI9dW5kZWZpbmVkO3RoaXMuJCQucHRyPXVuZGVmaW5lZH19O3ZhciBkZWxldGlvblF1ZXVlPVtdO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNEZWxldGVkIl09ZnVuY3Rpb24gaXNEZWxldGVkKCl7cmV0dXJuIXRoaXMuJCQucHRyfTtDbGFzc0hhbmRsZS5wcm90b3R5cGVbImRlbGV0ZUxhdGVyIl09ZnVuY3Rpb24gZGVsZXRlTGF0ZXIoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCYmIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3Rocm93QmluZGluZ0Vycm9yKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIil9ZGVsZXRpb25RdWV1ZS5wdXNoKHRoaXMpO2lmKGRlbGV0aW9uUXVldWUubGVuZ3RoPT09MSYmZGVsYXlGdW5jdGlvbil7ZGVsYXlGdW5jdGlvbihmbHVzaFBlbmRpbmdEZWxldGVzKX10aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD10cnVlO3JldHVybiB0aGlzfTtmdW5jdGlvbiBmbHVzaFBlbmRpbmdEZWxldGVzKCl7d2hpbGUoZGVsZXRpb25RdWV1ZS5sZW5ndGgpe3ZhciBvYmo9ZGVsZXRpb25RdWV1ZS5wb3AoKTtvYmouJCQuZGVsZXRlU2NoZWR1bGVkPWZhbHNlO29ialsiZGVsZXRlIl0oKX19TW9kdWxlWyJmbHVzaFBlbmRpbmdEZWxldGVzIl09Zmx1c2hQZW5kaW5nRGVsZXRlczt2YXIgZGVsYXlGdW5jdGlvbjtNb2R1bGVbInNldERlbGF5RnVuY3Rpb24iXT1mdW5jdGlvbiBzZXREZWxheUZ1bmN0aW9uKGZuKXtkZWxheUZ1bmN0aW9uPWZuO2lmKGRlbGV0aW9uUXVldWUubGVuZ3RoJiZkZWxheUZ1bmN0aW9uKXtkZWxheUZ1bmN0aW9uKGZsdXNoUGVuZGluZ0RlbGV0ZXMpfX07ZnVuY3Rpb24gUmVnaXN0ZXJlZENsYXNzKG5hbWUsY29uc3RydWN0b3IsaW5zdGFuY2VQcm90b3R5cGUscmF3RGVzdHJ1Y3RvcixiYXNlQ2xhc3MsZ2V0QWN0dWFsVHlwZSx1cGNhc3QsZG93bmNhc3Qpe3RoaXMubmFtZT1uYW1lO3RoaXMuY29uc3RydWN0b3I9Y29uc3RydWN0b3I7dGhpcy5pbnN0YW5jZVByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt0aGlzLnJhd0Rlc3RydWN0b3I9cmF3RGVzdHJ1Y3Rvcjt0aGlzLmJhc2VDbGFzcz1iYXNlQ2xhc3M7dGhpcy5nZXRBY3R1YWxUeXBlPWdldEFjdHVhbFR5cGU7dGhpcy51cGNhc3Q9dXBjYXN0O3RoaXMuZG93bmNhc3Q9ZG93bmNhc3Q7dGhpcy5wdXJlVmlydHVhbEZ1bmN0aW9ucz1bXX1mdW5jdGlvbiBzaGFsbG93Q29weShvKXt2YXIgcnY9e307Zm9yKHZhciBrIGluIG8pe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLGspKXtydltrXT1vW2tdfX1yZXR1cm4gcnZ9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3MocmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlLGJhc2VDbGFzc1Jhd1R5cGUsZ2V0QWN0dWFsVHlwZVNpZ25hdHVyZSxnZXRBY3R1YWxUeXBlLHVwY2FzdFNpZ25hdHVyZSx1cGNhc3QsZG93bmNhc3RTaWduYXR1cmUsZG93bmNhc3QsbmFtZSxkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtnZXRBY3R1YWxUeXBlPXJlcXVpcmVGdW5jdGlvbihnZXRBY3R1YWxUeXBlU2lnbmF0dXJlLGdldEFjdHVhbFR5cGUpO2lmKHVwY2FzdCl7dXBjYXN0PXJlcXVpcmVGdW5jdGlvbih1cGNhc3RTaWduYXR1cmUsdXBjYXN0KX1pZihkb3duY2FzdCl7ZG93bmNhc3Q9cmVxdWlyZUZ1bmN0aW9uKGRvd25jYXN0U2lnbmF0dXJlLGRvd25jYXN0KX1yYXdEZXN0cnVjdG9yPXJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpO3ZhciBsZWdhbEZ1bmN0aW9uTmFtZT1tYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSk7ZXhwb3NlUHVibGljU3ltYm9sKGxlZ2FsRnVuY3Rpb25OYW1lLChmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNvbnN0cnVjdCAiK25hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsW2Jhc2VDbGFzc1Jhd1R5cGVdKX0pKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbcmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlXSxiYXNlQ2xhc3NSYXdUeXBlP1tiYXNlQ2xhc3NSYXdUeXBlXTpbXSwoZnVuY3Rpb24oYmFzZSl7YmFzZT1iYXNlWzBdO3ZhciBiYXNlQ2xhc3M7dmFyIGJhc2VQcm90b3R5cGU7aWYoYmFzZUNsYXNzUmF3VHlwZSl7YmFzZUNsYXNzPWJhc2UucmVnaXN0ZXJlZENsYXNzO2Jhc2VQcm90b3R5cGU9YmFzZUNsYXNzLmluc3RhbmNlUHJvdG90eXBlfWVsc2V7YmFzZVByb3RvdHlwZT1DbGFzc0hhbmRsZS5wcm90b3R5cGV9dmFyIGNvbnN0cnVjdG9yPWNyZWF0ZU5hbWVkRnVuY3Rpb24obGVnYWxGdW5jdGlvbk5hbWUsKGZ1bmN0aW9uKCl7aWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpIT09aW5zdGFuY2VQcm90b3R5cGUpe3Rocm93IG5ldyBCaW5kaW5nRXJyb3IoIlVzZSAnbmV3JyB0byBjb25zdHJ1Y3QgIituYW1lKX1pZih1bmRlZmluZWQ9PT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keSl7dGhyb3cgbmV3IEJpbmRpbmdFcnJvcihuYW1lKyIgaGFzIG5vIGFjY2Vzc2libGUgY29uc3RydWN0b3IiKX12YXIgYm9keT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmd1bWVudHMubGVuZ3RoXTtpZih1bmRlZmluZWQ9PT1ib2R5KXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJUcmllZCB0byBpbnZva2UgY3RvciBvZiAiK25hbWUrIiB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIrYXJndW1lbnRzLmxlbmd0aCsiKSAtIGV4cGVjdGVkICgiK09iamVjdC5rZXlzKHJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KS50b1N0cmluZygpKyIpIHBhcmFtZXRlcnMgaW5zdGVhZCEiKX1yZXR1cm4gYm9keS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSk7dmFyIGluc3RhbmNlUHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYmFzZVByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmNvbnN0cnVjdG9yfX0pO2NvbnN0cnVjdG9yLnByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt2YXIgcmVnaXN0ZXJlZENsYXNzPW5ldyBSZWdpc3RlcmVkQ2xhc3MobmFtZSxjb25zdHJ1Y3RvcixpbnN0YW5jZVByb3RvdHlwZSxyYXdEZXN0cnVjdG9yLGJhc2VDbGFzcyxnZXRBY3R1YWxUeXBlLHVwY2FzdCxkb3duY2FzdCk7dmFyIHJlZmVyZW5jZUNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSxyZWdpc3RlcmVkQ2xhc3MsdHJ1ZSxmYWxzZSxmYWxzZSk7dmFyIHBvaW50ZXJDb252ZXJ0ZXI9bmV3IFJlZ2lzdGVyZWRQb2ludGVyKG5hbWUrIioiLHJlZ2lzdGVyZWRDbGFzcyxmYWxzZSxmYWxzZSxmYWxzZSk7dmFyIGNvbnN0UG9pbnRlckNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSsiIGNvbnN0KiIscmVnaXN0ZXJlZENsYXNzLGZhbHNlLHRydWUsZmFsc2UpO3JlZ2lzdGVyZWRQb2ludGVyc1tyYXdUeXBlXT17cG9pbnRlclR5cGU6cG9pbnRlckNvbnZlcnRlcixjb25zdFBvaW50ZXJUeXBlOmNvbnN0UG9pbnRlckNvbnZlcnRlcn07cmVwbGFjZVB1YmxpY1N5bWJvbChsZWdhbEZ1bmN0aW9uTmFtZSxjb25zdHJ1Y3Rvcik7cmV0dXJuW3JlZmVyZW5jZUNvbnZlcnRlcixwb2ludGVyQ29udmVydGVyLGNvbnN0UG9pbnRlckNvbnZlcnRlcl19KSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IocmF3Q2xhc3NUeXBlLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLGludm9rZXIscmF3Q29uc3RydWN0b3Ipe3ZhciByYXdBcmdUeXBlcz1oZWFwMzJWZWN0b3JUb0FycmF5KGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcik7aW52b2tlcj1yZXF1aXJlRnVuY3Rpb24oaW52b2tlclNpZ25hdHVyZSxpbnZva2VyKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbcmF3Q2xhc3NUeXBlXSwoZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9ImNvbnN0cnVjdG9yICIrY2xhc3NUeXBlLm5hbWU7aWYodW5kZWZpbmVkPT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9W119aWYodW5kZWZpbmVkIT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgiKyhhcmdDb3VudC0xKSsiKSBmb3IgY2xhc3MgJyIrY2xhc3NUeXBlLm5hbWUrIichIE92ZXJsb2FkIHJlc29sdXRpb24gaXMgY3VycmVudGx5IG9ubHkgcGVyZm9ybWVkIHVzaW5nIHRoZSBwYXJhbWV0ZXIgY291bnQsIG5vdCBhY3R1YWwgdHlwZSBpbmZvISIpfWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmdDb3VudC0xXT1mdW5jdGlvbiB1bmJvdW5kVHlwZUhhbmRsZXIoKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjb25zdHJ1Y3QgIitjbGFzc1R5cGUubmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixyYXdBcmdUeXBlcyl9O3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLHJhd0FyZ1R5cGVzLChmdW5jdGlvbihhcmdUeXBlcyl7Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdPWZ1bmN0aW9uIGNvbnN0cnVjdG9yX2JvZHkoKXtpZihhcmd1bWVudHMubGVuZ3RoIT09YXJnQ291bnQtMSl7dGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lKyIgY2FsbGVkIHdpdGggIithcmd1bWVudHMubGVuZ3RoKyIgYXJndW1lbnRzLCBleHBlY3RlZCAiKyhhcmdDb3VudC0xKSl9dmFyIGRlc3RydWN0b3JzPVtdO3ZhciBhcmdzPW5ldyBBcnJheShhcmdDb3VudCk7YXJnc1swXT1yYXdDb25zdHJ1Y3Rvcjtmb3IodmFyIGk9MTtpPGFyZ0NvdW50OysraSl7YXJnc1tpXT1hcmdUeXBlc1tpXVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLGFyZ3VtZW50c1tpLTFdKX12YXIgcHRyPWludm9rZXIuYXBwbHkobnVsbCxhcmdzKTtydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7cmV0dXJuIGFyZ1R5cGVzWzBdWyJmcm9tV2lyZVR5cGUiXShwdHIpfTtyZXR1cm5bXX0pKTtyZXR1cm5bXX0pKX1mdW5jdGlvbiBkb3duY2FzdFBvaW50ZXIocHRyLHB0ckNsYXNzLGRlc2lyZWRDbGFzcyl7aWYocHRyQ2xhc3M9PT1kZXNpcmVkQ2xhc3Mpe3JldHVybiBwdHJ9aWYodW5kZWZpbmVkPT09ZGVzaXJlZENsYXNzLmJhc2VDbGFzcyl7cmV0dXJuIG51bGx9dmFyIHJ2PWRvd25jYXN0UG9pbnRlcihwdHIscHRyQ2xhc3MsZGVzaXJlZENsYXNzLmJhc2VDbGFzcyk7aWYocnY9PT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gZGVzaXJlZENsYXNzLmRvd25jYXN0KHJ2KX1mdW5jdGlvbiB1cGNhc3RQb2ludGVyKHB0cixwdHJDbGFzcyxkZXNpcmVkQ2xhc3Mpe3doaWxlKHB0ckNsYXNzIT09ZGVzaXJlZENsYXNzKXtpZighcHRyQ2xhc3MudXBjYXN0KXt0aHJvd0JpbmRpbmdFcnJvcigiRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAiK2Rlc2lyZWRDbGFzcy5uYW1lKyIsIGdvdCBhbiBpbnN0YW5jZSBvZiAiK3B0ckNsYXNzLm5hbWUpfXB0cj1wdHJDbGFzcy51cGNhc3QocHRyKTtwdHJDbGFzcz1wdHJDbGFzcy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiB2YWxpZGF0ZVRoaXModGhpc18sY2xhc3NUeXBlLGh1bWFuTmFtZSl7aWYoISh0aGlzXyBpbnN0YW5jZW9mIE9iamVjdCkpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsnIHdpdGggaW52YWxpZCAidGhpcyI6ICcrdGhpc18pfWlmKCEodGhpc18gaW5zdGFuY2VvZiBjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yKSl7dGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lKycgaW5jb21wYXRpYmxlIHdpdGggInRoaXMiIG9mIHR5cGUgJyt0aGlzXy5jb25zdHJ1Y3Rvci5uYW1lKX1pZighdGhpc18uJCQucHRyKXt0aHJvd0JpbmRpbmdFcnJvcigiY2Fubm90IGNhbGwgZW1zY3JpcHRlbiBiaW5kaW5nIG1ldGhvZCAiK2h1bWFuTmFtZSsiIG9uIGRlbGV0ZWQgb2JqZWN0Iil9cmV0dXJuIHVwY2FzdFBvaW50ZXIodGhpc18uJCQucHRyLHRoaXNfLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLGNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uKHJhd0NsYXNzVHlwZSxtZXRob2ROYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIsY29udGV4dCxpc1B1cmVWaXJ0dWFsKXt2YXIgcmF3QXJnVHlwZXM9aGVhcDMyVmVjdG9yVG9BcnJheShhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIpO21ldGhvZE5hbWU9cmVhZExhdGluMVN0cmluZyhtZXRob2ROYW1lKTtyYXdJbnZva2VyPXJlcXVpcmVGdW5jdGlvbihpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFtyYXdDbGFzc1R5cGVdLChmdW5jdGlvbihjbGFzc1R5cGUpe2NsYXNzVHlwZT1jbGFzc1R5cGVbMF07dmFyIGh1bWFuTmFtZT1jbGFzc1R5cGUubmFtZSsiLiIrbWV0aG9kTmFtZTtpZihpc1B1cmVWaXJ0dWFsKXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLnB1cmVWaXJ0dWFsRnVuY3Rpb25zLnB1c2gobWV0aG9kTmFtZSl9ZnVuY3Rpb24gdW5ib3VuZFR5cGVzSGFuZGxlcigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgIitodW1hbk5hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIscmF3QXJnVHlwZXMpfXZhciBwcm90bz1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlO3ZhciBtZXRob2Q9cHJvdG9bbWV0aG9kTmFtZV07aWYodW5kZWZpbmVkPT09bWV0aG9kfHx1bmRlZmluZWQ9PT1tZXRob2Qub3ZlcmxvYWRUYWJsZSYmbWV0aG9kLmNsYXNzTmFtZSE9PWNsYXNzVHlwZS5uYW1lJiZtZXRob2QuYXJnQ291bnQ9PT1hcmdDb3VudC0yKXt1bmJvdW5kVHlwZXNIYW5kbGVyLmFyZ0NvdW50PWFyZ0NvdW50LTI7dW5ib3VuZFR5cGVzSGFuZGxlci5jbGFzc05hbWU9Y2xhc3NUeXBlLm5hbWU7cHJvdG9bbWV0aG9kTmFtZV09dW5ib3VuZFR5cGVzSGFuZGxlcn1lbHNle2Vuc3VyZU92ZXJsb2FkVGFibGUocHJvdG8sbWV0aG9kTmFtZSxodW1hbk5hbWUpO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMl09dW5ib3VuZFR5cGVzSGFuZGxlcn13aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxyYXdBcmdUeXBlcywoZnVuY3Rpb24oYXJnVHlwZXMpe3ZhciBtZW1iZXJGdW5jdGlvbj1jcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLHJhd0ludm9rZXIsY29udGV4dCk7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7cHJvdG9bbWV0aG9kTmFtZV09bWVtYmVyRnVuY3Rpb259ZWxzZXtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlW2FyZ0NvdW50LTJdPW1lbWJlckZ1bmN0aW9ufXJldHVybltdfSkpO3JldHVybltdfSkpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX3Byb3BlcnR5KGNsYXNzVHlwZSxmaWVsZE5hbWUsZ2V0dGVyUmV0dXJuVHlwZSxnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyLGdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlLHNldHRlclNpZ25hdHVyZSxzZXR0ZXIsc2V0dGVyQ29udGV4dCl7ZmllbGROYW1lPXJlYWRMYXRpbjFTdHJpbmcoZmllbGROYW1lKTtnZXR0ZXI9cmVxdWlyZUZ1bmN0aW9uKGdldHRlclNpZ25hdHVyZSxnZXR0ZXIpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFtjbGFzc1R5cGVdLChmdW5jdGlvbihjbGFzc1R5cGUpe2NsYXNzVHlwZT1jbGFzc1R5cGVbMF07dmFyIGh1bWFuTmFtZT1jbGFzc1R5cGUubmFtZSsiLiIrZmllbGROYW1lO3ZhciBkZXNjPXtnZXQ6KGZ1bmN0aW9uKCl7dGhyb3dVbmJvdW5kVHlwZUVycm9yKCJDYW5ub3QgYWNjZXNzICIraHVtYW5OYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLFtnZXR0ZXJSZXR1cm5UeXBlLHNldHRlckFyZ3VtZW50VHlwZV0pfSksZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfTtpZihzZXR0ZXIpe2Rlc2Muc2V0PShmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGFjY2VzcyAiK2h1bWFuTmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixbZ2V0dGVyUmV0dXJuVHlwZSxzZXR0ZXJBcmd1bWVudFR5cGVdKX0pfWVsc2V7ZGVzYy5zZXQ9KGZ1bmN0aW9uKHYpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5Iil9KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSxmaWVsZE5hbWUsZGVzYyk7d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sc2V0dGVyP1tnZXR0ZXJSZXR1cm5UeXBlLHNldHRlckFyZ3VtZW50VHlwZV06W2dldHRlclJldHVyblR5cGVdLChmdW5jdGlvbih0eXBlcyl7dmFyIGdldHRlclJldHVyblR5cGU9dHlwZXNbMF07dmFyIGRlc2M9e2dldDooZnVuY3Rpb24oKXt2YXIgcHRyPXZhbGlkYXRlVGhpcyh0aGlzLGNsYXNzVHlwZSxodW1hbk5hbWUrIiBnZXR0ZXIiKTtyZXR1cm4gZ2V0dGVyUmV0dXJuVHlwZVsiZnJvbVdpcmVUeXBlIl0oZ2V0dGVyKGdldHRlckNvbnRleHQscHRyKSl9KSxlbnVtZXJhYmxlOnRydWV9O2lmKHNldHRlcil7c2V0dGVyPXJlcXVpcmVGdW5jdGlvbihzZXR0ZXJTaWduYXR1cmUsc2V0dGVyKTt2YXIgc2V0dGVyQXJndW1lbnRUeXBlPXR5cGVzWzFdO2Rlc2Muc2V0PShmdW5jdGlvbih2KXt2YXIgcHRyPXZhbGlkYXRlVGhpcyh0aGlzLGNsYXNzVHlwZSxodW1hbk5hbWUrIiBzZXR0ZXIiKTt2YXIgZGVzdHJ1Y3RvcnM9W107c2V0dGVyKHNldHRlckNvbnRleHQscHRyLHNldHRlckFyZ3VtZW50VHlwZVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLHYpKTtydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyl9KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSxmaWVsZE5hbWUsZGVzYyk7cmV0dXJuW119KSk7cmV0dXJuW119KSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY2xhc3NfZnVuY3Rpb24ocmF3Q2xhc3NUeXBlLG1ldGhvZE5hbWUsYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyLGludm9rZXJTaWduYXR1cmUscmF3SW52b2tlcixmbil7dmFyIHJhd0FyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTttZXRob2ROYW1lPXJlYWRMYXRpbjFTdHJpbmcobWV0aG9kTmFtZSk7cmF3SW52b2tlcj1yZXF1aXJlRnVuY3Rpb24oaW52b2tlclNpZ25hdHVyZSxyYXdJbnZva2VyKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbcmF3Q2xhc3NUeXBlXSwoZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9Y2xhc3NUeXBlLm5hbWUrIi4iK21ldGhvZE5hbWU7ZnVuY3Rpb24gdW5ib3VuZFR5cGVzSGFuZGxlcigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgIitodW1hbk5hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIscmF3QXJnVHlwZXMpfXZhciBwcm90bz1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yO2lmKHVuZGVmaW5lZD09PXByb3RvW21ldGhvZE5hbWVdKXt1bmJvdW5kVHlwZXNIYW5kbGVyLmFyZ0NvdW50PWFyZ0NvdW50LTE7cHJvdG9bbWV0aG9kTmFtZV09dW5ib3VuZFR5cGVzSGFuZGxlcn1lbHNle2Vuc3VyZU92ZXJsb2FkVGFibGUocHJvdG8sbWV0aG9kTmFtZSxodW1hbk5hbWUpO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMV09dW5ib3VuZFR5cGVzSGFuZGxlcn13aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxyYXdBcmdUeXBlcywoZnVuY3Rpb24oYXJnVHlwZXMpe3ZhciBpbnZva2VyQXJnc0FycmF5PVthcmdUeXBlc1swXSxudWxsXS5jb25jYXQoYXJnVHlwZXMuc2xpY2UoMSkpO3ZhciBmdW5jPWNyYWZ0SW52b2tlckZ1bmN0aW9uKGh1bWFuTmFtZSxpbnZva2VyQXJnc0FycmF5LG51bGwscmF3SW52b2tlcixmbik7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7cHJvdG9bbWV0aG9kTmFtZV09ZnVuY31lbHNle3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMV09ZnVuY31yZXR1cm5bXX0pKTtyZXR1cm5bXX0pKX1mdW5jdGlvbiBfX2VtYmluZF9jcmVhdGVfaW5oZXJpdGluZ19jb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvck5hbWUsd3JhcHBlclR5cGUscHJvcGVydGllcyl7Y29uc3RydWN0b3JOYW1lPXJlYWRMYXRpbjFTdHJpbmcoY29uc3RydWN0b3JOYW1lKTt3cmFwcGVyVHlwZT1yZXF1aXJlUmVnaXN0ZXJlZFR5cGUod3JhcHBlclR5cGUsIndyYXBwZXIiKTtwcm9wZXJ0aWVzPXJlcXVpcmVIYW5kbGUocHJvcGVydGllcyk7dmFyIGFycmF5U2xpY2U9W10uc2xpY2U7dmFyIHJlZ2lzdGVyZWRDbGFzcz13cmFwcGVyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHdyYXBwZXJQcm90b3R5cGU9cmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlO3ZhciBiYXNlQ2xhc3M9cmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzczt2YXIgYmFzZUNsYXNzUHJvdG90eXBlPWJhc2VDbGFzcy5pbnN0YW5jZVByb3RvdHlwZTt2YXIgYmFzZUNvbnN0cnVjdG9yPXJlZ2lzdGVyZWRDbGFzcy5iYXNlQ2xhc3MuY29uc3RydWN0b3I7dmFyIGN0b3I9Y3JlYXRlTmFtZWRGdW5jdGlvbihjb25zdHJ1Y3Rvck5hbWUsKGZ1bmN0aW9uKCl7cmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzcy5wdXJlVmlydHVhbEZ1bmN0aW9ucy5mb3JFYWNoKChmdW5jdGlvbihuYW1lKXtpZih0aGlzW25hbWVdPT09YmFzZUNsYXNzUHJvdG90eXBlW25hbWVdKXt0aHJvdyBuZXcgUHVyZVZpcnR1YWxFcnJvcigiUHVyZSB2aXJ0dWFsIGZ1bmN0aW9uICIrbmFtZSsiIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCIpfX0pLmJpbmQodGhpcykpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfX3BhcmVudCIse3ZhbHVlOndyYXBwZXJQcm90b3R5cGV9KTt0aGlzLl9fY29uc3RydWN0LmFwcGx5KHRoaXMsYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpfSkpO3dyYXBwZXJQcm90b3R5cGUuX19jb25zdHJ1Y3Q9ZnVuY3Rpb24gX19jb25zdHJ1Y3QoKXtpZih0aGlzPT09d3JhcHBlclByb3RvdHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3MgY29ycmVjdCAndGhpcycgdG8gX19jb25zdHJ1Y3QiKX12YXIgaW5uZXI9YmFzZUNvbnN0cnVjdG9yLmltcGxlbWVudC5hcHBseSh1bmRlZmluZWQsW3RoaXNdLmNvbmNhdChhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO3ZhciAkJD1pbm5lci4kJDtpbm5lci5ub3RpZnlPbkRlc3RydWN0aW9uKCk7JCQucHJlc2VydmVQb2ludGVyT25EZWxldGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJCQiLHt2YWx1ZTokJH0pO3JlZ2lzdGVySW5oZXJpdGVkSW5zdGFuY2UocmVnaXN0ZXJlZENsYXNzLCQkLnB0cix0aGlzKX07d3JhcHBlclByb3RvdHlwZS5fX2Rlc3RydWN0PWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKXtpZih0aGlzPT09d3JhcHBlclByb3RvdHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3MgY29ycmVjdCAndGhpcycgdG8gX19kZXN0cnVjdCIpfXVucmVnaXN0ZXJJbmhlcml0ZWRJbnN0YW5jZShyZWdpc3RlcmVkQ2xhc3MsdGhpcy4kJC5wdHIpfTtjdG9yLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHdyYXBwZXJQcm90b3R5cGUpO2Zvcih2YXIgcCBpbiBwcm9wZXJ0aWVzKXtjdG9yLnByb3RvdHlwZVtwXT1wcm9wZXJ0aWVzW3BdfXJldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGN0b3IpfXZhciBjaGFyXzA9IjAiLmNoYXJDb2RlQXQoMCk7dmFyIGNoYXJfOT0iOSIuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiBtYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSl7bmFtZT1uYW1lLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywiJCIpO3ZhciBmPW5hbWUuY2hhckNvZGVBdCgwKTtpZihmPj1jaGFyXzAmJmY8PWNoYXJfOSl7cmV0dXJuIl8iK25hbWV9ZWxzZXtyZXR1cm4gbmFtZX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfc21hcnRfcHRyKHJhd1R5cGUscmF3UG9pbnRlZVR5cGUsbmFtZSxzaGFyaW5nUG9saWN5LGdldFBvaW50ZWVTaWduYXR1cmUscmF3R2V0UG9pbnRlZSxjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3RvcixzaGFyZVNpZ25hdHVyZSxyYXdTaGFyZSxkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyYXdHZXRQb2ludGVlPXJlcXVpcmVGdW5jdGlvbihnZXRQb2ludGVlU2lnbmF0dXJlLHJhd0dldFBvaW50ZWUpO3Jhd0NvbnN0cnVjdG9yPXJlcXVpcmVGdW5jdGlvbihjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3Rvcik7cmF3U2hhcmU9cmVxdWlyZUZ1bmN0aW9uKHNoYXJlU2lnbmF0dXJlLHJhd1NoYXJlKTtyYXdEZXN0cnVjdG9yPXJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtyYXdUeXBlXSxbcmF3UG9pbnRlZVR5cGVdLChmdW5jdGlvbihwb2ludGVlVHlwZSl7cG9pbnRlZVR5cGU9cG9pbnRlZVR5cGVbMF07dmFyIHJlZ2lzdGVyZWRQb2ludGVyPW5ldyBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHBvaW50ZWVUeXBlLnJlZ2lzdGVyZWRDbGFzcyxmYWxzZSxmYWxzZSx0cnVlLHBvaW50ZWVUeXBlLHNoYXJpbmdQb2xpY3kscmF3R2V0UG9pbnRlZSxyYXdDb25zdHJ1Y3RvcixyYXdTaGFyZSxyYXdEZXN0cnVjdG9yKTtyZXR1cm5bcmVnaXN0ZXJlZFBvaW50ZXJdfSkpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2VudW0ocmF3VHlwZSxuYW1lLHNpemUsaXNTaWduZWQpe3ZhciBzaGlmdD1nZXRTaGlmdEZyb21TaXplKHNpemUpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtmdW5jdGlvbiBjb25zdHJ1Y3Rvcigpe31jb25zdHJ1Y3Rvci52YWx1ZXM9e307cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSxjb25zdHJ1Y3Rvcjpjb25zdHJ1Y3RvciwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudmFsdWVzW2NdfSksInRvV2lyZVR5cGUiOihmdW5jdGlvbihkZXN0cnVjdG9ycyxjKXtyZXR1cm4gYy52YWx1ZX0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmludGVnZXJSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LGlzU2lnbmVkKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLGNvbnN0cnVjdG9yKX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbnVtX3ZhbHVlKHJhd0VudW1UeXBlLG5hbWUsZW51bVZhbHVlKXt2YXIgZW51bVR5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJhd0VudW1UeXBlLCJlbnVtIik7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3ZhciBFbnVtPWVudW1UeXBlLmNvbnN0cnVjdG9yO3ZhciBWYWx1ZT1PYmplY3QuY3JlYXRlKGVudW1UeXBlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx7dmFsdWU6e3ZhbHVlOmVudW1WYWx1ZX0sY29uc3RydWN0b3I6e3ZhbHVlOmNyZWF0ZU5hbWVkRnVuY3Rpb24oZW51bVR5cGUubmFtZSsiXyIrbmFtZSwoZnVuY3Rpb24oKXt9KSl9fSk7RW51bS52YWx1ZXNbZW51bVZhbHVlXT1WYWx1ZTtFbnVtW25hbWVdPVZhbHVlfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NvbnN0YW50KG5hbWUsdHlwZSx2YWx1ZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFt0eXBlXSwoZnVuY3Rpb24odHlwZSl7dHlwZT10eXBlWzBdO01vZHVsZVtuYW1lXT10eXBlWyJmcm9tV2lyZVR5cGUiXSh2YWx1ZSk7cmV0dXJuW119KSl9dmFyIE1vZHVsZT1Nb2R1bGV8fHt9O3ZhciBfZW12YWxfaGFuZGxlX2FycmF5PVt7fV07dmFyIF9lbXZhbF9mcmVlX2xpc3Q9W107TW9kdWxlLmNvdW50X2VtdmFsX2hhbmRsZXM9KGZ1bmN0aW9uKCl7dmFyIGNvdW50PTA7Zm9yKHZhciBpPTE7aTxfZW12YWxfaGFuZGxlX2FycmF5Lmxlbmd0aDsrK2kpe2lmKF9lbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpeysrY291bnR9fXJldHVybiBjb3VudH0pO01vZHVsZS5nZXRfZmlyc3RfZW12YWw9KGZ1bmN0aW9uKCl7Zm9yKHZhciBpPTE7aTxfZW12YWxfaGFuZGxlX2FycmF5Lmxlbmd0aDsrK2kpe2lmKF9lbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpe3JldHVybiBfZW12YWxfaGFuZGxlX2FycmF5W2ldfX1yZXR1cm4gbnVsbH0pO3ZhciBfZW12YWxfc3ltYm9scz17fTtmdW5jdGlvbiBfX2VtdmFsX3JlZ2lzdGVyX3N5bWJvbChhZGRyZXNzKXtfZW12YWxfc3ltYm9sc1thZGRyZXNzXT1yZWFkTGF0aW4xU3RyaW5nKGFkZHJlc3MpfWZ1bmN0aW9uIGdldFN0cmluZ09yU3ltYm9sKGFkZHJlc3Mpe3ZhciBzeW1ib2w9X2VtdmFsX3N5bWJvbHNbYWRkcmVzc107aWYoc3ltYm9sPT09dW5kZWZpbmVkKXtyZXR1cm4gcmVhZExhdGluMVN0cmluZyhhZGRyZXNzKX1lbHNle3JldHVybiBzeW1ib2x9fWZ1bmN0aW9uIHJlcXVpcmVIYW5kbGUoaGFuZGxlKXtpZighaGFuZGxlKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHVzZSBkZWxldGVkIHZhbC4gaGFuZGxlID0gIitoYW5kbGUpfXJldHVybiBfZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0udmFsdWV9ZnVuY3Rpb24gX19lbXZhbF9yZWdpc3Rlcih2YWx1ZSl7dmFyIGhhbmRsZT1fZW12YWxfZnJlZV9saXN0Lmxlbmd0aD9fZW12YWxfZnJlZV9saXN0LnBvcCgpOl9lbXZhbF9oYW5kbGVfYXJyYXkubGVuZ3RoO19lbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXT17cmVmY291bnQ6MSx2YWx1ZTp2YWx1ZX07cmV0dXJuIGhhbmRsZX1mdW5jdGlvbiBfX2VtdmFsX2luY3JlZihoYW5kbGUpe2lmKGhhbmRsZSl7X2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnJlZmNvdW50Kz0xfX1mdW5jdGlvbiBfX2VtdmFsX2RlY3JlZihoYW5kbGUpe2lmKGhhbmRsZSYmMD09PS0tX2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnJlZmNvdW50KXtfZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV09dW5kZWZpbmVkO19lbXZhbF9mcmVlX2xpc3QucHVzaChoYW5kbGUpfX1mdW5jdGlvbiBfX2VtdmFsX3J1bl9kZXN0cnVjdG9ycyhoYW5kbGUpe3ZhciBkZXN0cnVjdG9ycz1fZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0udmFsdWU7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO19fZW12YWxfZGVjcmVmKGhhbmRsZSl9ZnVuY3Rpb24gX19lbXZhbF9uZXdfYXJyYXkoKXtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihbXSl9ZnVuY3Rpb24gX19lbXZhbF9uZXdfb2JqZWN0KCl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoe30pfWZ1bmN0aW9uIF9fZW12YWxfdW5kZWZpbmVkKCl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIodW5kZWZpbmVkKX1mdW5jdGlvbiBfX2VtdmFsX251bGwoKXtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihudWxsKX1mdW5jdGlvbiBfX2VtdmFsX25ld19jc3RyaW5nKHYpe3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGdldFN0cmluZ09yU3ltYm9sKHYpKX1mdW5jdGlvbiBfX2VtdmFsX3Rha2VfdmFsdWUodHlwZSxhcmd2KXt0eXBlPXJlcXVpcmVSZWdpc3RlcmVkVHlwZSh0eXBlLCJfZW12YWxfdGFrZV92YWx1ZSIpO3ZhciB2PXR5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl0oYXJndik7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIodil9dmFyIF9fbmV3ZXJzPXt9O2Z1bmN0aW9uIGNyYWZ0RW12YWxBbGxvY2F0b3IoYXJnQ291bnQpe3ZhciBhcmdzTGlzdD0iIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50OysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpfXZhciBmdW5jdGlvbkJvZHk9InJldHVybiBmdW5jdGlvbiBlbXZhbF9hbGxvY2F0b3JfIithcmdDb3VudCsiKGNvbnN0cnVjdG9yLCBhcmdUeXBlcywgYXJncykge1xuIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50OysraSl7ZnVuY3Rpb25Cb2R5Kz0idmFyIGFyZ1R5cGUiK2krIiA9IHJlcXVpcmVSZWdpc3RlcmVkVHlwZShIRUFQMzJbKGFyZ1R5cGVzID4+IDIpICsgIitpKyddLCAicGFyYW1ldGVyICcraSsnIik7XG4nKyJ2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7XG4iKyJhcmdzICs9IGFyZ1R5cGUiK2krIi5hcmdQYWNrQWR2YW5jZTtcbiJ9ZnVuY3Rpb25Cb2R5Kz0idmFyIG9iaiA9IG5ldyBjb25zdHJ1Y3RvcigiK2FyZ3NMaXN0KyIpO1xuIisicmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIob2JqKTtcbiIrIn1cbiI7cmV0dXJuKG5ldyBGdW5jdGlvbigicmVxdWlyZVJlZ2lzdGVyZWRUeXBlIiwiSEVBUDMyIiwiX19lbXZhbF9yZWdpc3RlciIsZnVuY3Rpb25Cb2R5KSkocmVxdWlyZVJlZ2lzdGVyZWRUeXBlLEhFQVAzMixfX2VtdmFsX3JlZ2lzdGVyKX1mdW5jdGlvbiBfX2VtdmFsX25ldyhoYW5kbGUsYXJnQ291bnQsYXJnVHlwZXMsYXJncyl7aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTt2YXIgbmV3ZXI9X19uZXdlcnNbYXJnQ291bnRdO2lmKCFuZXdlcil7bmV3ZXI9Y3JhZnRFbXZhbEFsbG9jYXRvcihhcmdDb3VudCk7X19uZXdlcnNbYXJnQ291bnRdPW5ld2VyfXJldHVybiBuZXdlcihoYW5kbGUsYXJnVHlwZXMsYXJncyl9dmFyIGdsb2JhbD0oZnVuY3Rpb24oKXtyZXR1cm4gRnVuY3Rpb259KSgpKCJyZXR1cm4gdGhpcyIpKCk7ZnVuY3Rpb24gX19lbXZhbF9nZXRfZ2xvYmFsKG5hbWUpe25hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobmFtZSk7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZ2xvYmFsW25hbWVdKX1mdW5jdGlvbiBfX2VtdmFsX2dldF9tb2R1bGVfcHJvcGVydHkobmFtZSl7bmFtZT1nZXRTdHJpbmdPclN5bWJvbChuYW1lKTtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihNb2R1bGVbbmFtZV0pfWZ1bmN0aW9uIF9fZW12YWxfZ2V0X3Byb3BlcnR5KGhhbmRsZSxrZXkpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7a2V5PXJlcXVpcmVIYW5kbGUoa2V5KTtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihoYW5kbGVba2V5XSl9ZnVuY3Rpb24gX19lbXZhbF9zZXRfcHJvcGVydHkoaGFuZGxlLGtleSx2YWx1ZSl7aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTtrZXk9cmVxdWlyZUhhbmRsZShrZXkpO3ZhbHVlPXJlcXVpcmVIYW5kbGUodmFsdWUpO2hhbmRsZVtrZXldPXZhbHVlfWZ1bmN0aW9uIF9fZW12YWxfYXMoaGFuZGxlLHJldHVyblR5cGUsZGVzdHJ1Y3RvcnNSZWYpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7cmV0dXJuVHlwZT1yZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmV0dXJuVHlwZSwiZW12YWw6OmFzIik7dmFyIGRlc3RydWN0b3JzPVtdO3ZhciByZD1fX2VtdmFsX3JlZ2lzdGVyKGRlc3RydWN0b3JzKTtIRUFQMzJbZGVzdHJ1Y3RvcnNSZWY+PjJdPXJkO3JldHVybiByZXR1cm5UeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsaGFuZGxlKX1mdW5jdGlvbiBfX2VtdmFsX2NhbGwoaGFuZGxlLGFyZ0NvdW50LGFyZ1R5cGVzLGFyZ3Ype2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7dmFyIHR5cGVzPWxvb2t1cFR5cGVzKGFyZ0NvdW50LGFyZ1R5cGVzKTt2YXIgYXJncz1uZXcgQXJyYXkoYXJnQ291bnQpO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXt2YXIgdHlwZT10eXBlc1tpXTthcmdzW2ldPXR5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl0oYXJndik7YXJndis9dHlwZS5hcmdQYWNrQWR2YW5jZX12YXIgcnY9aGFuZGxlLmFwcGx5KHVuZGVmaW5lZCxhcmdzKTtyZXR1cm4gX19lbXZhbF9yZWdpc3Rlcihydil9ZnVuY3Rpb24gbG9va3VwVHlwZXMoYXJnQ291bnQsYXJnVHlwZXMsYXJnV2lyZVR5cGVzKXt2YXIgYT1uZXcgQXJyYXkoYXJnQ291bnQpO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXthW2ldPXJlcXVpcmVSZWdpc3RlcmVkVHlwZShIRUFQMzJbKGFyZ1R5cGVzPj4yKStpXSwicGFyYW1ldGVyICIraSl9cmV0dXJuIGF9ZnVuY3Rpb24gYWxsb2NhdGVEZXN0cnVjdG9ycyhkZXN0cnVjdG9yc1JlZil7dmFyIGRlc3RydWN0b3JzPVtdO0hFQVAzMltkZXN0cnVjdG9yc1JlZj4+Ml09X19lbXZhbF9yZWdpc3RlcihkZXN0cnVjdG9ycyk7cmV0dXJuIGRlc3RydWN0b3JzfXZhciBtZXRob2RDYWxsZXJzPVt1bmRlZmluZWRdO2Z1bmN0aW9uIGFkZE1ldGhvZENhbGxlcihjYWxsZXIpe3ZhciBpZD1tZXRob2RDYWxsZXJzLmxlbmd0aDttZXRob2RDYWxsZXJzLnB1c2goY2FsbGVyKTtyZXR1cm4gaWR9ZnVuY3Rpb24gX19lbXZhbF9nZXRfbWV0aG9kX2NhbGxlcihhcmdDb3VudCxhcmdUeXBlcyl7dmFyIHR5cGVzPWxvb2t1cFR5cGVzKGFyZ0NvdW50LGFyZ1R5cGVzKTt2YXIgcmV0VHlwZT10eXBlc1swXTt2YXIgc2lnbmF0dXJlTmFtZT1yZXRUeXBlLm5hbWUrIl8kIit0eXBlcy5zbGljZSgxKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWV9KSkuam9pbigiXyIpKyIkIjt2YXIgcGFyYW1zPVsicmV0VHlwZSJdO3ZhciBhcmdzPVtyZXRUeXBlXTt2YXIgYXJnc0xpc3Q9IiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpO3BhcmFtcy5wdXNoKCJhcmdUeXBlIitpKTthcmdzLnB1c2godHlwZXNbMStpXSl9dmFyIGZ1bmN0aW9uQm9keT0icmV0dXJuIGZ1bmN0aW9uIChoYW5kbGUsIG5hbWUsIGRlc3RydWN0b3JzLCBhcmdzKSB7XG4iO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMTsrK2kpe2Z1bmN0aW9uQm9keSs9IiAgICB2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7XG4iKyIgICAgYXJncyArPSBhcmdUeXBlIitpKyIuYXJnUGFja0FkdmFuY2U7XG4ifWZ1bmN0aW9uQm9keSs9IiAgICB2YXIgcnYgPSBoYW5kbGVbbmFtZV0oIithcmdzTGlzdCsiKTtcbiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7aWYodHlwZXNbaSsxXVsiZGVsZXRlT2JqZWN0Il0pe2Z1bmN0aW9uQm9keSs9IiAgICBhcmdUeXBlIitpKyIuZGVsZXRlT2JqZWN0KGFyZyIraSsiKTtcbiJ9fWZ1bmN0aW9uQm9keSs9IiAgICByZXR1cm4gcmV0VHlwZS50b1dpcmVUeXBlKGRlc3RydWN0b3JzLCBydik7XG4iKyJ9O1xuIjtwYXJhbXMucHVzaChmdW5jdGlvbkJvZHkpO3ZhciBpbnZva2VyRnVuY3Rpb249bmV3XyhGdW5jdGlvbixwYXJhbXMpLmFwcGx5KG51bGwsYXJncyk7cmV0dXJuIGFkZE1ldGhvZENhbGxlcihjcmVhdGVOYW1lZEZ1bmN0aW9uKHNpZ25hdHVyZU5hbWUsaW52b2tlckZ1bmN0aW9uKSl9ZnVuY3Rpb24gX19lbXZhbF9jYWxsX21ldGhvZChjYWxsZXIsaGFuZGxlLG1ldGhvZE5hbWUsZGVzdHJ1Y3RvcnNSZWYsYXJncyl7Y2FsbGVyPW1ldGhvZENhbGxlcnNbY2FsbGVyXTtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO21ldGhvZE5hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobWV0aG9kTmFtZSk7cmV0dXJuIGNhbGxlcihoYW5kbGUsbWV0aG9kTmFtZSxhbGxvY2F0ZURlc3RydWN0b3JzKGRlc3RydWN0b3JzUmVmKSxhcmdzKX1mdW5jdGlvbiBfX2VtdmFsX2hhc19mdW5jdGlvbihoYW5kbGUsbmFtZSxjbGFzc1R5cGUpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7bmFtZT1nZXRTdHJpbmdPclN5bWJvbChuYW1lKTtjbGFzc1R5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKGNsYXNzVHlwZSwiY2xhc3Mgd3JhcHBlciBmaWx0ZXIiKTt2YXIgZmlsdGVyPWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGVbbmFtZV07cmV0dXJuIGhhbmRsZVtuYW1lXWluc3RhbmNlb2YgRnVuY3Rpb24mJihmaWx0ZXI9PT11bmRlZmluZWR8fGhhbmRsZVtuYW1lXSE9PWZpbHRlcil9ZnVuY3Rpb24gX19lbXZhbF90eXBlb2YoaGFuZGxlKXtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKHR5cGVvZiBoYW5kbGUpfWlmKE1vZHVsZVsicHJlSW5pdCJdKXtpZih0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il09PSJmdW5jdGlvbiIpTW9kdWxlWyJwcmVJbml0Il09W01vZHVsZVsicHJlSW5pdCJdXTt3aGlsZShNb2R1bGVbInByZUluaXQiXS5sZW5ndGg+MCl7TW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKX19dmFyIHNob3VsZFJ1bk5vdz10cnVlO2lmKE1vZHVsZVsibm9Jbml0aWFsUnVuIl0pe3Nob3VsZFJ1bk5vdz1mYWxzZX1ydW4oKQoKCgoKLy8gbGF6LWxvYWRlci13b3JrZXIuanMKLy8KCi8vaW1wb3J0U2NyaXB0cygnbGF6LXBlcmYuanMnKTsKCnZhciBpbnN0YW5jZSA9IG51bGw7IC8vIGxhei1wZXJmIGluc3RhbmNlCgpmdW5jdGlvbiByZWFkQXMoYnVmLCBUeXBlLCBvZmZzZXQsIGNvdW50KSB7Cgljb3VudCA9IChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IGNvdW50ID09PSAwID8gMSA6IGNvdW50KTsKCXZhciBzdWIgPSBidWYuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBUeXBlLkJZVEVTX1BFUl9FTEVNRU5UICogY291bnQpOwoKCXZhciByID0gbmV3IFR5cGUoc3ViKTsKCWlmIChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IGNvdW50ID09PSAxKQoJCXJldHVybiByWzBdOwoKCXZhciByZXQgPSBbXTsKCWZvciAodmFyIGkgPSAwIDsgaSA8IGNvdW50IDsgaSArKykgewoJCXJldC5wdXNoKHJbaV0pOwoJfQoKCXJldHVybiByZXQ7Cn0KCmZ1bmN0aW9uIHBhcnNlTEFTSGVhZGVyKGFycmF5YnVmZmVyKSB7Cgl2YXIgbyA9IHt9OwoKCW8ucG9pbnRzT2Zmc2V0ID0gcmVhZEFzKGFycmF5YnVmZmVyLCBVaW50MzJBcnJheSwgMzIqMyk7CglvLnBvaW50c0Zvcm1hdElkID0gcmVhZEFzKGFycmF5YnVmZmVyLCBVaW50OEFycmF5LCAzMiozKzgpOwoJby5wb2ludHNTdHJ1Y3RTaXplID0gcmVhZEFzKGFycmF5YnVmZmVyLCBVaW50MTZBcnJheSwgMzIqMys4KzEpOwoJby5wb2ludHNDb3VudCA9IHJlYWRBcyhhcnJheWJ1ZmZlciwgVWludDMyQXJyYXksIDMyKjMgKyAxMSk7CgoKCXZhciBzdGFydCA9IDMyKjMgKyAzNTsKCW8uc2NhbGUgPSByZWFkQXMoYXJyYXlidWZmZXIsIEZsb2F0NjRBcnJheSwgc3RhcnQsIDMpOyBzdGFydCArPSAyNDsgLy8gOCozCglvLm9mZnNldCA9IHJlYWRBcyhhcnJheWJ1ZmZlciwgRmxvYXQ2NEFycmF5LCBzdGFydCwgMyk7IHN0YXJ0ICs9IDI0OwoKCXZhciBib3VuZHMgPSByZWFkQXMoYXJyYXlidWZmZXIsIEZsb2F0NjRBcnJheSwgc3RhcnQsIDYpOyBzdGFydCArPSA0ODsgLy8gOCo2OwoJby5tYXhzID0gW2JvdW5kc1swXSwgYm91bmRzWzJdLCBib3VuZHNbNF1dOwoJby5taW5zID0gW2JvdW5kc1sxXSwgYm91bmRzWzNdLCBib3VuZHNbNV1dOwoKCXJldHVybiBvOwp9CgpmdW5jdGlvbiBoYW5kbGVFdmVudChtc2cpIHsKCXN3aXRjaChtc2cudHlwZSkgewoJCWNhc2UgIm9wZW4iOgoJCQl0cnkgewoJCQkJaW5zdGFuY2UgPSBuZXcgTW9kdWxlLkxBU1ppcCgpOwoJCQkJdmFyIGFiSW50ID0gbmV3IFVpbnQ4QXJyYXkobXNnLmFycmF5YnVmZmVyKTsKCQkJCXZhciBidWYgPSBNb2R1bGUuX21hbGxvYyhtc2cuYXJyYXlidWZmZXIuYnl0ZUxlbmd0aCk7CgoJCQkJaW5zdGFuY2UuYXJyYXlidWZmZXIgPSBtc2cuYXJyYXlidWZmZXI7CgkJCQlpbnN0YW5jZS5idWYgPSBidWY7CgkJCQlNb2R1bGUuSEVBUFU4LnNldChhYkludCwgYnVmKTsKCQkJCWluc3RhbmNlLm9wZW4oYnVmLCBtc2cuYXJyYXlidWZmZXIuYnl0ZUxlbmd0aCk7CgoJCQkJaW5zdGFuY2UucmVhZE9mZnNldCA9IDA7CgoJCQkJcG9zdE1lc3NhZ2UoeyB0eXBlOiAib3BlbiIsIHN0YXR1czogMX0pOwoJCQl9CgkJCWNhdGNoKGUpIHsKCQkJCXBvc3RNZXNzYWdlKHsgdHlwZTogIm9wZW4iLCBzdGF0dXM6IDAsIGRldGFpbHM6IGUgfSk7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgImhlYWRlciI6CgkJCWlmICghaW5zdGFuY2UpCgkJCQl0aHJvdyBuZXcgRXJyb3IoIllvdSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgYmVmb3JlIHRyeWluZyB0byByZWFkIGhlYWRlciIpOwoKCgoJCQl2YXIgaGVhZGVyID0gcGFyc2VMQVNIZWFkZXIoaW5zdGFuY2UuYXJyYXlidWZmZXIpOwoJCQloZWFkZXIucG9pbnRzRm9ybWF0SWQgJj0gMHgzZjsKCQkJaW5zdGFuY2UuaGVhZGVyID0gaGVhZGVyOwoJCQlwb3N0TWVzc2FnZSh7dHlwZTogImhlYWRlciIsIHN0YXR1czogMSwgaGVhZGVyOiBoZWFkZXJ9KTsKCQkJYnJlYWs7CgoJCWNhc2UgInJlYWQiOgoJCQlpZiAoIWluc3RhbmNlKQoJCQkJdGhyb3cgbmV3IEVycm9yKCJZb3UgbmVlZCB0byBvcGVuIHRoZSBmaWxlIGJlZm9yZSB0cnlpbmcgdG8gcmVhZCBzdHVmZiIpOwoKCQkJdmFyIHN0YXJ0ID0gbXNnLnN0YXJ0LCBjb3VudCA9IG1zZy5jb3VudCwgc2tpcCA9IG1zZy5za2lwOwoJCQl2YXIgbyA9IGluc3RhbmNlOwoKCQkJaWYgKCFvLmhlYWRlcikKCQkJCXRocm93IG5ldyBFcnJvcigiWW91IG5lZWQgdG8gcXVlcnkgaGVhZGVyIGJlZm9yZSByZWFkaW5nLCBJIG1haW50YWluIHN0YXRlIHRoYXQgd2F5LCBzb3JyeSA6KCIpOwoKCQkJdmFyIHBvaW50c1RvUmVhZCA9IE1hdGgubWluKGNvdW50ICogc2tpcCwgby5oZWFkZXIucG9pbnRzQ291bnQgLSBvLnJlYWRPZmZzZXQpOwoJCQl2YXIgYnVmZmVyU2l6ZSA9IE1hdGguY2VpbChwb2ludHNUb1JlYWQgLyBza2lwKTsKCQkJdmFyIHBvaW50c1JlYWQgPSAwOwoKCQkJdmFyIHRoaXNfYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyU2l6ZSAqIG8uaGVhZGVyLnBvaW50c1N0cnVjdFNpemUpOwoJCQl2YXIgYnVmX3JlYWQgPSBNb2R1bGUuX21hbGxvYyhvLmhlYWRlci5wb2ludHNTdHJ1Y3RTaXplKTsKCQkJZm9yICh2YXIgaSA9IDAgOyBpIDwgcG9pbnRzVG9SZWFkIDsgaSArKykgewoJCQkJby5nZXRQb2ludChidWZfcmVhZCk7CgoJCQkJaWYgKGkgJSBza2lwID09PSAwKSB7CgkJCQkJdmFyIGEgPSBuZXcgVWludDhBcnJheShNb2R1bGUuSEVBUFU4LmJ1ZmZlciwgYnVmX3JlYWQsIG8uaGVhZGVyLnBvaW50c1N0cnVjdFNpemUpOwoJCQkJCXRoaXNfYnVmLnNldChhLCBwb2ludHNSZWFkICogby5oZWFkZXIucG9pbnRzU3RydWN0U2l6ZSwgby5oZWFkZXIucG9pbnRzU3RydWN0U2l6ZSk7CgkJCQkJcG9pbnRzUmVhZCArKzsKCQkJCX0KCgkJCQlvLnJlYWRPZmZzZXQgKys7CgkJCX0KCgkJCXBvc3RNZXNzYWdlKHsKCQkJCXR5cGU6ICdoZWFkZXInLAoJCQkJc3RhdHVzOiAxLAoJCQkJYnVmZmVyOiB0aGlzX2J1Zi5idWZmZXIsCgkJCQljb3VudDogcG9pbnRzUmVhZCwKCQkJCWhhc01vcmVEYXRhOiBvLnJlYWRPZmZzZXQgPCBvLmhlYWRlci5wb2ludHNDb3VudAoJCQl9KTsKCgkJCWJyZWFrOwoKCgkJY2FzZSAiY2xvc2UiOgoJCQlpZiAoaW5zdGFuY2UgIT09IG51bGwpIHsKCQkJCWluc3RhbmNlLmRlbGV0ZSgpOwoJCQkJaW5zdGFuY2UgPSBudWxsOwoJCQl9CgkJCXBvc3RNZXNzYWdlKHsgdHlwZTogImNsb3NlIiwgc3RhdHVzOiAxfSk7CgkJCWJyZWFrOwoJfQp9Cgpvbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkgewoJdHJ5IHsKCQloYW5kbGVFdmVudChldmVudC5kYXRhKTsKCX0gY2F0Y2goZSkgewoJCXBvc3RNZXNzYWdlKHt0eXBlOiBldmVudC5kYXRhLnR5cGUsIHN0YXR1czogMCwgZGV0YWlsczogZX0pOwoJfQp9OwoKCg==")), -Potree.workers.lasdecoder=new Potree.WorkerManager(atob("CgovL3ZhciBwb2ludEZvcm1hdFJlYWRlcnMgPSB7Ci8vCTA6IGZ1bmN0aW9uKGR2KSB7Ci8vCQlyZXR1cm4gewovLwkJCSJwb3NpdGlvbiI6IFsgZHYuZ2V0SW50MzIoMCwgdHJ1ZSksIGR2LmdldEludDMyKDQsIHRydWUpLCBkdi5nZXRJbnQzMig4LCB0cnVlKV0sCi8vCQkJImludGVuc2l0eSI6IGR2LmdldFVpbnQxNigxMiwgdHJ1ZSksCi8vCQkJImNsYXNzaWZpY2F0aW9uIjogZHYuZ2V0VWludDgoMTYsIHRydWUpCi8vCQl9OwovLwl9LAovLwkxOiBmdW5jdGlvbihkdikgewovLwkJcmV0dXJuIHsKLy8JCQkicG9zaXRpb24iOiBbIGR2LmdldEludDMyKDAsIHRydWUpLCBkdi5nZXRJbnQzMig0LCB0cnVlKSwgZHYuZ2V0SW50MzIoOCwgdHJ1ZSldLAovLwkJCSJpbnRlbnNpdHkiOiBkdi5nZXRVaW50MTYoMTIsIHRydWUpLAovLwkJCSJjbGFzc2lmaWNhdGlvbiI6IGR2LmdldFVpbnQ4KDE2LCB0cnVlKQovLwkJfTsKLy8JfSwKLy8JMjogZnVuY3Rpb24oZHYpIHsKLy8JCXJldHVybiB7Ci8vCQkJInBvc2l0aW9uIjogWyBkdi5nZXRJbnQzMigwLCB0cnVlKSwgZHYuZ2V0SW50MzIoNCwgdHJ1ZSksIGR2LmdldEludDMyKDgsIHRydWUpXSwKLy8JCQkiaW50ZW5zaXR5IjogZHYuZ2V0VWludDE2KDEyLCB0cnVlKSwKLy8JCQkiY2xhc3NpZmljYXRpb24iOiBkdi5nZXRVaW50OCgxNiwgdHJ1ZSksCi8vCQkJImNvbG9yIjogW2R2LmdldFVpbnQxNigyMCwgdHJ1ZSksIGR2LmdldFVpbnQxNigyMiwgdHJ1ZSksIGR2LmdldFVpbnQxNigyNCwgdHJ1ZSldCi8vCQl9OwovLwl9LAovLwkzOiBmdW5jdGlvbihkdikgewovLwkJcmV0dXJuIHsKLy8JCQkicG9zaXRpb24iOiBbIGR2LmdldEludDMyKDAsIHRydWUpLCBkdi5nZXRJbnQzMig0LCB0cnVlKSwgZHYuZ2V0SW50MzIoOCwgdHJ1ZSldLAovLwkJCSJpbnRlbnNpdHkiOiBkdi5nZXRVaW50MTYoMTIsIHRydWUpLAovLwkJCSJjbGFzc2lmaWNhdGlvbiI6IGR2LmdldFVpbnQ4KDE2LCB0cnVlKSwKLy8JCQkiY29sb3IiOiBbZHYuZ2V0VWludDE2KDI4LCB0cnVlKSwgZHYuZ2V0VWludDE2KDMwLCB0cnVlKSwgZHYuZ2V0VWludDE2KDMyLCB0cnVlKV0KLy8JCX07Ci8vCX0KLy99OwovLwkKLy8JCi8vIERlY29kZXMgTEFTIHJlY29yZHMgaW50byBwb2ludHMKLy8KLy92YXIgTEFTRGVjb2RlciA9IGZ1bmN0aW9uKGJ1ZmZlciwgcG9pbnRGb3JtYXRJRCwgcG9pbnRTaXplLCBwb2ludHNDb3VudCwgc2NhbGUsIG9mZnNldCkgewovLwl0aGlzLmFycmF5YiA9IGJ1ZmZlcjsKLy8JdGhpcy5kZWNvZGVyID0gcG9pbnRGb3JtYXRSZWFkZXJzW3BvaW50Rm9ybWF0SURdOwovLwl0aGlzLnBvaW50c0NvdW50ID0gcG9pbnRzQ291bnQ7Ci8vCXRoaXMucG9pbnRTaXplID0gcG9pbnRTaXplOwovLwl0aGlzLnNjYWxlID0gc2NhbGU7Ci8vCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwovL307Ci8vCi8vTEFTRGVjb2Rlci5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbihpbmRleCkgewovLwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucG9pbnRzQ291bnQpCi8vCQl0aHJvdyBuZXcgRXJyb3IoIlBvaW50IGluZGV4IG91dCBvZiByYW5nZSIpOwovLwovLwl2YXIgZHYgPSBuZXcgRGF0YVZpZXcodGhpcy5hcnJheWIsIGluZGV4ICogdGhpcy5wb2ludFNpemUsIHRoaXMucG9pbnRTaXplKTsKLy8JcmV0dXJuIHRoaXMuZGVjb2Rlcihkdik7Ci8vfTsKCm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KXsKCXZhciBidWZmZXIgPSBldmVudC5kYXRhLmJ1ZmZlcjsKCXZhciBudW1Qb2ludHMgPSBldmVudC5kYXRhLm51bVBvaW50czsKCXZhciBwb2ludFNpemUgPSBldmVudC5kYXRhLnBvaW50U2l6ZTsKCXZhciBwb2ludEZvcm1hdElEID0gZXZlbnQuZGF0YS5wb2ludEZvcm1hdElEOwoJdmFyIHNjYWxlID0gZXZlbnQuZGF0YS5zY2FsZTsKCXZhciBvZmZzZXQgPSBldmVudC5kYXRhLm9mZnNldDsKCXZhciBtaW5zID0gZXZlbnQuZGF0YS5taW5zOwoJdmFyIG1heHMgPSBldmVudC5kYXRhLm1heHM7Cgl2YXIgYmJPZmZzZXQgPSBldmVudC5kYXRhLmJiT2Zmc2V0OwoJCgl2YXIgdGVtcCA9IG5ldyBBcnJheUJ1ZmZlcig0KTsKCXZhciB0ZW1wVWludDggPSBuZXcgVWludDhBcnJheSh0ZW1wKTsKCXZhciB0ZW1wVWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRlbXApOwoJdmFyIHRlbXBGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0ZW1wKTsKCXZhciB0ZW1wSW50MzIgPSBuZXcgSW50MzJBcnJheSh0ZW1wKTsKCXZhciBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTsKCQoJdmFyIHBCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyozKjQpOwoJdmFyIGNCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyozKjQpOwoJdmFyIGlCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KTsKCXZhciBjbEJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBybkJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBuckJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBwc0J1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzICogMik7CgkKCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KHBCdWZmKTsKCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KGNCdWZmKTsKCXZhciBpbnRlbnNpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmYpOwoJdmFyIGNsYXNzaWZpY2F0aW9ucyA9IG5ldyBVaW50OEFycmF5KGNsQnVmZik7Cgl2YXIgcmV0dXJuTnVtYmVycyA9IG5ldyBVaW50OEFycmF5KHJuQnVmZik7Cgl2YXIgbnVtYmVyT2ZSZXR1cm5zID0gbmV3IFVpbnQ4QXJyYXkobnJCdWZmKTsKCXZhciBwb2ludFNvdXJjZUlEcyA9IG5ldyBVaW50MTZBcnJheShwc0J1ZmYpOwoJdmFyIHRpZ2h0Qm91bmRpbmdCb3ggPSB7CgkJbWluOiBbIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFldLAoJCW1heDogWyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgXQoJfTsKCQoJCgkvLyB0ZW1wIGFycmF5cyBzZWVtIHRvIGJlIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gRGF0YVZpZXdzCgkvLyBhdCB0aGUgbW9tZW50OiBodHRwOi8vanNwZXJmLmNvbS9kYXRhdmlldy12cy10ZW1wb3JhcnktZmxvYXQ2NGFycmF5Cglmb3IodmFyIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKyspewoJCgkJLy8gUE9TSVRJT04KCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzBdOwoJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMV07CgkJdGVtcFVpbnQ4WzJdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyXTsKCQl0ZW1wVWludDhbM10gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzNdOwoJCXZhciB4ID0gdGVtcEludDMyWzBdOwoJCQoJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrNF07CgkJdGVtcFVpbnQ4WzFdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSs1XTsKCQl0ZW1wVWludDhbMl0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzZdOwoJCXRlbXBVaW50OFszXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrN107CgkJdmFyIHkgPSB0ZW1wSW50MzJbMF07CgkJCgkJdGVtcFVpbnQ4WzBdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSs4XTsKCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzldOwoJCXRlbXBVaW50OFsyXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTBdOwoJCXRlbXBVaW50OFszXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTFdOwoJCXZhciB6ID0gdGVtcEludDMyWzBdOwoJCQoJCXBvc2l0aW9uc1szKmkrMF0gPSB4ICogc2NhbGVbMF0gKyBvZmZzZXRbMF0gKyBiYk9mZnNldFswXTsKCQlwb3NpdGlvbnNbMyppKzFdID0geSAqIHNjYWxlWzFdICsgb2Zmc2V0WzFdICsgYmJPZmZzZXRbMV07CgkJcG9zaXRpb25zWzMqaSsyXSA9IHogKiBzY2FsZVsyXSArIG9mZnNldFsyXSArIGJiT2Zmc2V0WzJdOwoJCQoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzBdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMF0sIHBvc2l0aW9uc1szKmkrMF0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzFdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMV0sIHBvc2l0aW9uc1szKmkrMV0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzJdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMl0sIHBvc2l0aW9uc1szKmkrMl0pOwoJCQoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzBdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMF0sIHBvc2l0aW9uc1szKmkrMF0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzFdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMV0sIHBvc2l0aW9uc1szKmkrMV0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzJdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMl0sIHBvc2l0aW9uc1szKmkrMl0pOwoJCQoJCS8vIElOVEVOU0lUWQoJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTJdOwoJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTNdOwoJCXZhciBpbnRlbnNpdHkgPSB0ZW1wVWludDE2WzBdOwoJCWludGVuc2l0aWVzW2ldID0gaW50ZW5zaXR5OwoJCQoJCS8vIFJFVFVSTiBOVU1CRVIsIHN0b3JlZCBpbiB0aGUgZmlyc3QgMyBiaXRzIC0gMDAwMDAxMTEKCQl2YXIgcmV0dXJuTnVtYmVyID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsxNF0gJiA3OwoJCXJldHVybk51bWJlcnNbaV0gPSByZXR1cm5OdW1iZXI7CgkJCgkJLy8gTlVNQkVSIE9GIFJFVFVSTlMsIHN0b3JlZCBpbiAwMDExMTAwMAoJCW51bWJlck9mUmV0dXJuc1tpXSA9IChidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE0XSAmIDU2KSAvIDg7CgkJCgkJLy8gQ0xBU1NJRklDQVRJT04KCQl2YXIgY2xhc3NpZmljYXRpb24gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE1XTsKCQljbGFzc2lmaWNhdGlvbnNbaV0gPSBjbGFzc2lmaWNhdGlvbjsKCQkKCQkvLyBQT0lOVCBTT1VSQ0UgSUQKCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE4XTsKCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE5XTsKCQl2YXIgcG9pbnRTb3VyY2VJRCA9IHRlbXBVaW50MTZbMF07CgkJcG9pbnRTb3VyY2VJRHNbaV0gPSBwb2ludFNvdXJjZUlEOwoJCQoJCS8vIENPTE9SLCBpZiBhdmFpbGFibGUKCQlpZihwb2ludEZvcm1hdElEID09PSAyKXsKCQkJdGVtcFVpbnQ4WzBdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyMF07CgkJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMjFdOwoJCQl2YXIgciA9IHRlbXBVaW50MTZbMF07CgkJCQoJCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzIyXTsKCQkJdGVtcFVpbnQ4WzFdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyM107CgkJCXZhciBnID0gdGVtcFVpbnQxNlswXTsKCQkJCgkJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMjRdOwoJCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzI1XTsKCQkJdmFyIGIgPSB0ZW1wVWludDE2WzBdOwoJCQkKCQkJY29sb3JzWzMqaSswXSA9IHIgLyA2NTUzNjsKCQkJY29sb3JzWzMqaSsxXSA9IGcgLyA2NTUzNjsKCQkJY29sb3JzWzMqaSsyXSA9IGIgLyA2NTUzNjsKCQl9Cgl9CgkKCXZhciBtZXNzYWdlID0gewoJCXBvc2l0aW9uOiBwQnVmZiwgCgkJY29sb3I6IGNCdWZmLCAKCQlpbnRlbnNpdHk6IGlCdWZmLAoJCWNsYXNzaWZpY2F0aW9uOiBjbEJ1ZmYsCgkJcmV0dXJuTnVtYmVyOiBybkJ1ZmYsCgkJbnVtYmVyT2ZSZXR1cm5zOiBuckJ1ZmYsCgkJcG9pbnRTb3VyY2VJRDogcHNCdWZmLAoJCXRpZ2h0Qm91bmRpbmdCb3g6IHRpZ2h0Qm91bmRpbmdCb3gKCX07CgkJCgl2YXIgdHJhbnNmZXJhYmxlcyA9IFsKCQltZXNzYWdlLnBvc2l0aW9uLAoJCW1lc3NhZ2UuY29sb3IsIAoJCW1lc3NhZ2UuaW50ZW5zaXR5LAoJCW1lc3NhZ2UuY2xhc3NpZmljYXRpb24sCgkJbWVzc2FnZS5yZXR1cm5OdW1iZXIsCgkJbWVzc2FnZS5udW1iZXJPZlJldHVybnMsCgkJbWVzc2FnZS5wb2ludFNvdXJjZUlEXTsKCQkKCXBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyYWJsZXMpOwp9Cg==")); \ No newline at end of file diff --git a/PotreeConverter/resources/page_template/build/js/potree.js b/PotreeConverter/resources/page_template/build/js/potree.js index afb32d2e..c04a45c4 100644 --- a/PotreeConverter/resources/page_template/build/js/potree.js +++ b/PotreeConverter/resources/page_template/build/js/potree.js @@ -17,7 +17,7 @@ Potree.WorkerManager = function(code){ this.code = code; this.instances = []; this.createdInstances = 0; -} +}; Potree.WorkerManager.prototype.getWorker = function(){ var ww = this.instances.pop(); @@ -28,12 +28,12 @@ Potree.WorkerManager.prototype.getWorker = function(){ } return ww; -} +}; Potree.WorkerManager.prototype.returnWorker = function(worker){ this.instances.push(worker); -} +}; /** * urls point to WebWorker code. @@ -58,8 +58,8 @@ Potree.WorkerManager.fromUrls = function(urls){ } return new Potree.WorkerManager(code); -} -Potree.workers.binaryDecoder = new Potree.WorkerManager(atob("Ci8vIGh0dHA6Ly9qc3BlcmYuY29tL3VpbnQ4YXJyYXktdnMtZGF0YXZpZXczLzMKZnVuY3Rpb24gQ3VzdG9tVmlldyhidWZmZXIpIHsKCXRoaXMuYnVmZmVyID0gYnVmZmVyOwoJdGhpcy51OCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7CgkKCXZhciB0bXAgPSBuZXcgQXJyYXlCdWZmZXIoNCk7Cgl2YXIgdG1wZiA9IG5ldyBGbG9hdDMyQXJyYXkodG1wKTsKCXZhciB0bXB1OCA9IG5ldyBVaW50OEFycmF5KHRtcCk7CgkKCXRoaXMuZ2V0VWludDMyID0gZnVuY3Rpb24gKGkpIHsKCQlyZXR1cm4gKHRoaXMudThbaSszXSA8PCAyNCkgfCAodGhpcy51OFtpKzJdIDw8IDE2KSB8ICh0aGlzLnU4W2krMV0gPDwgOCkgfCB0aGlzLnU4W2ldOwoJfQoJCgl0aGlzLmdldFVpbnQxNiA9IGZ1bmN0aW9uIChpKSB7CgkJcmV0dXJuICh0aGlzLnU4W2krMV0gPDwgOCkgfCB0aGlzLnU4W2ldOwoJfQoJCgl0aGlzLmdldEZsb2F0ID0gZnVuY3Rpb24oaSl7CgkJdG1wdThbMF0gPSB0aGlzLnU4W2krMF07CgkJdG1wdThbMV0gPSB0aGlzLnU4W2krMV07CgkJdG1wdThbMl0gPSB0aGlzLnU4W2krMl07CgkJdG1wdThbM10gPSB0aGlzLnU4W2krM107CgkJCgkJcmV0dXJuIHRtcGZbMF07Cgl9CgkKCXRoaXMuZ2V0VWludDggPSBmdW5jdGlvbihpKXsKCQlyZXR1cm4gdGhpcy51OFtpXTsKCX0KfQoKUG90cmVlID0ge307CgoKb25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpewoJdmFyIGJ1ZmZlciA9IGV2ZW50LmRhdGEuYnVmZmVyOwoJdmFyIHBvaW50QXR0cmlidXRlcyA9IGV2ZW50LmRhdGEucG9pbnRBdHRyaWJ1dGVzOwoJdmFyIG51bVBvaW50cyA9IGJ1ZmZlci5ieXRlTGVuZ3RoIC8gcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplOwoJdmFyIGN2ID0gbmV3IEN1c3RvbVZpZXcoYnVmZmVyKTsKCXZhciB2ZXJzaW9uID0gbmV3IFBvdHJlZS5WZXJzaW9uKGV2ZW50LmRhdGEudmVyc2lvbik7Cgl2YXIgbWluID0gZXZlbnQuZGF0YS5taW47Cgl2YXIgbm9kZU9mZnNldCA9IGV2ZW50LmRhdGEub2Zmc2V0OwoJdmFyIHNjYWxlID0gZXZlbnQuZGF0YS5zY2FsZTsKCXZhciB0aWdodEJveE1pbiA9IFsgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWV07Cgl2YXIgdGlnaHRCb3hNYXggPSBbIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAsIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAsIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSBdOwoJCgl2YXIgYXR0cmlidXRlQnVmZmVycyA9IHt9OwoJCgl2YXIgb2Zmc2V0ID0gMDsKCWZvcih2YXIgaSA9IDA7IGkgPCBwb2ludEF0dHJpYnV0ZXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKyl7CgkJdmFyIHBvaW50QXR0cmlidXRlID0gcG9pbnRBdHRyaWJ1dGVzLmF0dHJpYnV0ZXNbaV07CgkKCQlpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuUE9TSVRJT05fQ0FSVEVTSUFOLm5hbWUpewoJCQkKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQqMyk7CgkJCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmYpOwoJCQkKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCWlmKHZlcnNpb24ubmV3ZXJUaGFuKCIxLjMiKSl7CgkJCQkJcG9zaXRpb25zWzMqaiswXSA9IChjdi5nZXRVaW50MzIob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrMCkgKiBzY2FsZSkgKyBtaW5bMF07CgkJCQkJcG9zaXRpb25zWzMqaisxXSA9IChjdi5nZXRVaW50MzIob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrNCkgKiBzY2FsZSkgKyBtaW5bMV07CgkJCQkJcG9zaXRpb25zWzMqaisyXSA9IChjdi5nZXRVaW50MzIob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrOCkgKiBzY2FsZSkgKyBtaW5bMl07CgkJCQl9ZWxzZXsKCQkJCQlwb3NpdGlvbnNbMypqKzBdID0gY3YuZ2V0RmxvYXQoaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrMCkgKyBub2RlT2Zmc2V0WzBdOwoJCQkJCXBvc2l0aW9uc1szKmorMV0gPSBjdi5nZXRGbG9hdChqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSs0KSArIG5vZGVPZmZzZXRbMV07CgkJCQkJcG9zaXRpb25zWzMqaisyXSA9IGN2LmdldEZsb2F0KGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplKzgpICsgbm9kZU9mZnNldFsyXTsKCQkJCX0KCQkJCQoJCQkJdGlnaHRCb3hNaW5bMF0gPSBNYXRoLm1pbih0aWdodEJveE1pblswXSwgcG9zaXRpb25zWzMqaiswXSk7CgkJCQl0aWdodEJveE1pblsxXSA9IE1hdGgubWluKHRpZ2h0Qm94TWluWzFdLCBwb3NpdGlvbnNbMypqKzFdKTsKCQkJCXRpZ2h0Qm94TWluWzJdID0gTWF0aC5taW4odGlnaHRCb3hNaW5bMl0sIHBvc2l0aW9uc1szKmorMl0pOwoJCQkJCgkJCQl0aWdodEJveE1heFswXSA9IE1hdGgubWF4KHRpZ2h0Qm94TWF4WzBdLCBwb3NpdGlvbnNbMypqKzBdKTsKCQkJCXRpZ2h0Qm94TWF4WzFdID0gTWF0aC5tYXgodGlnaHRCb3hNYXhbMV0sIHBvc2l0aW9uc1szKmorMV0pOwoJCQkJdGlnaHRCb3hNYXhbMl0gPSBNYXRoLm1heCh0aWdodEJveE1heFsyXSwgcG9zaXRpb25zWzMqaisyXSk7CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJCQoJCX1lbHNlIGlmKHBvaW50QXR0cmlidXRlLm5hbWUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5DT0xPUl9QQUNLRUQubmFtZSl7CgkJCQoJCQl2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihudW1Qb2ludHMqNCozKTsKCQkJdmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCQoJCQlmb3IodmFyIGogPSAwOyBqIDwgbnVtUG9pbnRzOyBqKyspewoJCQkJY29sb3JzWzMqaiswXSA9IGN2LmdldFVpbnQ4KG9mZnNldCArIGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMCkgLyAyNTU7CgkJCQljb2xvcnNbMypqKzFdID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyAxKSAvIDI1NTsKCQkJCWNvbG9yc1szKmorMl0gPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDIpIC8gMjU1OwoJCQl9CgkJCQoJCQlhdHRyaWJ1dGVCdWZmZXJzW3BvaW50QXR0cmlidXRlLm5hbWVdID0geyBidWZmZXI6IGJ1ZmYsIGF0dHJpYnV0ZTogcG9pbnRBdHRyaWJ1dGV9OwoJCQkKCQl9ZWxzZSBpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuSU5URU5TSVRZLm5hbWUpewoKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJCQl2YXIgaW50ZW5zaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmYpOwoJCQkKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCXZhciBpbnRlbnNpdHkgPSBjdi5nZXRVaW50MTYob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUpOwoJCQkJaW50ZW5zaXRpZXNbal0gPSBpbnRlbnNpdHk7CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJCgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLkNMQVNTSUZJQ0FUSU9OLm5hbWUpewoKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJCQl2YXIgY2xhc3NpZmljYXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShidWZmKTsKCQkJCgkJCWZvcih2YXIgaiA9IDA7IGogPCBudW1Qb2ludHM7IGorKyl7CgkJCQl2YXIgY2xhc3NpZmljYXRpb24gPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSk7CgkJCQljbGFzc2lmaWNhdGlvbnNbal0gPSBjbGFzc2lmaWNhdGlvbjsKCQkJfQoJCQkKCQkJYXR0cmlidXRlQnVmZmVyc1twb2ludEF0dHJpYnV0ZS5uYW1lXSA9IHsgYnVmZmVyOiBidWZmLCBhdHRyaWJ1dGU6IHBvaW50QXR0cmlidXRlfTsKCQkKCQl9ZWxzZSBpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX1NQSEVSRU1BUFBFRC5uYW1lKXsKCgkJCXZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KjMpOwoJCQl2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCQoJCQlmb3IodmFyIGogPSAwOyBqIDwgbnVtUG9pbnRzOyBqKyspewoJCQkJdmFyIGJ4ID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDApOwoJCQkJdmFyIGJ5ID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDEpOwoJCQkKCQkJCXZhciBleCA9IGJ4IC8gMjU1OwoJCQkJdmFyIGV5ID0gYnkgLyAyNTU7CgkJCQkKCQkJCXZhciBueCA9IGV4ICogMiAtIDE7CgkJCQl2YXIgbnkgPSBleSAqIDIgLSAxOwoJCQkJdmFyIG56ID0gMTsKCQkJCXZhciBudyA9IC0xOwoJCQkJCgkJCQl2YXIgbCA9IChueCAqICgtbngpKSArIChueSAqICgtbnkpKSArIChueiAqICgtbncpKTsKCQkJCW56ID0gbDsKCQkJCW54ID0gbnggKiBNYXRoLnNxcnQobCk7CgkJCQlueSA9IG55ICogTWF0aC5zcXJ0KGwpOwoJCQkJCgkJCQlueCA9IG54ICogMjsKCQkJCW55ID0gbnkgKiAyOwoJCQkJbnogPSBueiAqIDIgLSAxOwoJCQkJCgkJCQlub3JtYWxzWzMqaiArIDBdID0gbng7CgkJCQlub3JtYWxzWzMqaiArIDFdID0gbnk7CgkJCQlub3JtYWxzWzMqaiArIDJdID0gbno7CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9PQ1QxNi5uYW1lKXsKCQkJCgkJCXZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KjMpOwoJCQl2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCWZvcih2YXIgaiA9IDA7IGogPCBudW1Qb2ludHM7IGorKyl7CgkJCQl2YXIgYnggPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMCk7CgkJCQl2YXIgYnkgPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMSk7CgkJCQkKCQkJCXZhciB1ID0gKGJ4IC8gMjU1KSAqIDIgLSAxOwoJCQkJdmFyIHYgPSAoYnkgLyAyNTUpICogMiAtIDE7CgkJCQkKCQkJCXZhciB6ID0gMSAtIE1hdGguYWJzKHUpIC0gTWF0aC5hYnModik7CgkJCQkKCQkJCWlmKHogPj0gMCl7CgkJCQkJdmFyIHggPSB1OwoJCQkJCXZhciB5ID0gdjsKCQkJCX1lbHNlewoJCQkJCXZhciB4ID0gLSAodi9NYXRoLnNpZ24odikgLSAxKSAvIE1hdGguc2lnbih1KTsKCQkJCQl2YXIgeSA9IC0gKHUvTWF0aC5zaWduKHUpIC0gMSkgLyBNYXRoLnNpZ24odik7CgkJCQl9CgkJCQkKCQkJCXZhciBsZW5ndGggPSBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTsKCQkJCXggPSB4IC8gbGVuZ3RoOwoJCQkJeSA9IHkgLyBsZW5ndGg7CgkJCQl6ID0geiAvIGxlbmd0aDsKCQkJCQoJCQkJbm9ybWFsc1szKmogKyAwXSA9IHg7CgkJCQlub3JtYWxzWzMqaiArIDFdID0geTsKCQkJCW5vcm1hbHNbMypqICsgMl0gPSB6OwoJCQl9CgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTC5uYW1lKXsKCQkKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQqMyk7CgkJCXZhciBub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShidWZmKTsKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCXZhciB4ID0gY3YuZ2V0RmxvYXQob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDApOwoJCQkJdmFyIHkgPSBjdi5nZXRGbG9hdChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgNCk7CgkJCQl2YXIgeiA9IGN2LmdldEZsb2F0KG9mZnNldCArIGogKiBwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyA4KTsKCQkJCQoJCQkJbm9ybWFsc1szKmogKyAwXSA9IHg7CgkJCQlub3JtYWxzWzMqaiArIDFdID0geTsKCQkJCW5vcm1hbHNbMypqICsgMl0gPSB6OwoJCQl9CgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfQoJCQoJCW9mZnNldCArPSBwb2ludEF0dHJpYnV0ZS5ieXRlU2l6ZTsKCX0KCQoJdmFyIGluZGljZXMgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJdmFyIGlJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KGluZGljZXMpOwoJZm9yKHZhciBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKXsKCQlpSW5kaWNlc1tpXSA9IGk7Cgl9CgkKCXZhciBtZXNzYWdlID0gewoJCWF0dHJpYnV0ZUJ1ZmZlcnM6IGF0dHJpYnV0ZUJ1ZmZlcnMsCgkJdGlnaHRCb3VuZGluZ0JveDogeyBtaW46IHRpZ2h0Qm94TWluLCBtYXg6IHRpZ2h0Qm94TWF4IH0sCgkJaW5kaWNlczogaW5kaWNlcwoJfTsKCQkKCXZhciB0cmFuc2ZlcmFibGVzID0gW107CgkKCWZvcih2YXIgcHJvcGVydHkgaW4gbWVzc2FnZS5hdHRyaWJ1dGVCdWZmZXJzKXsKCQlpZihtZXNzYWdlLmF0dHJpYnV0ZUJ1ZmZlcnMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKXsKCQkJdHJhbnNmZXJhYmxlcy5wdXNoKG1lc3NhZ2UuYXR0cmlidXRlQnVmZmVyc1twcm9wZXJ0eV0uYnVmZmVyKTsKCQl9Cgl9CgkKCXRyYW5zZmVyYWJsZXMucHVzaChtZXNzYWdlLmluZGljZXMpOwoJCQoJcG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJhYmxlcyk7CgkKfTsKUG90cmVlLlZlcnNpb24gPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Cgl2YXIgdm1MZW5ndGggPSAodmVyc2lvbi5pbmRleE9mKCIuIikgPT09IC0xKSA/IHZlcnNpb24ubGVuZ3RoIDogdmVyc2lvbi5pbmRleE9mKCIuIik7Cgl0aGlzLnZlcnNpb25NYWpvciA9IHBhcnNlSW50KHZlcnNpb24uc3Vic3RyKDAsIHZtTGVuZ3RoKSk7Cgl0aGlzLnZlcnNpb25NaW5vciA9IHBhcnNlSW50KHZlcnNpb24uc3Vic3RyKHZtTGVuZ3RoICsgMSkpOwoJaWYodGhpcy52ZXJzaW9uTWlub3IubGVuZ3RoID09PSAwKXsKCQl0aGlzLnZlcnNpb25NaW5vciA9IDA7Cgl9CgkKfTsKClBvdHJlZS5WZXJzaW9uLnByb3RvdHlwZS5uZXdlclRoYW4gPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXZhciB2ID0gbmV3IFBvdHJlZS5WZXJzaW9uKHZlcnNpb24pOwoJCglpZiggdGhpcy52ZXJzaW9uTWFqb3IgPiB2LnZlcnNpb25NYWpvcil7CgkJcmV0dXJuIHRydWU7Cgl9ZWxzZSBpZiggdGhpcy52ZXJzaW9uTWFqb3IgPT09IHYudmVyc2lvbk1ham9yICYmIHRoaXMudmVyc2lvbk1pbm9yID4gdi52ZXJzaW9uTWlub3IpewoJCXJldHVybiB0cnVlOwoJfWVsc2V7CgkJcmV0dXJuIGZhbHNlOwoJfQp9OwoKUG90cmVlLlZlcnNpb24ucHJvdG90eXBlLmVxdWFsT3JIaWdoZXIgPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXZhciB2ID0gbmV3IFBvdHJlZS5WZXJzaW9uKHZlcnNpb24pOwoJCglpZiggdGhpcy52ZXJzaW9uTWFqb3IgPiB2LnZlcnNpb25NYWpvcil7CgkJcmV0dXJuIHRydWU7Cgl9ZWxzZSBpZiggdGhpcy52ZXJzaW9uTWFqb3IgPT09IHYudmVyc2lvbk1ham9yICYmIHRoaXMudmVyc2lvbk1pbm9yID49IHYudmVyc2lvbk1pbm9yKXsKCQlyZXR1cm4gdHJ1ZTsKCX1lbHNlewoJCXJldHVybiBmYWxzZTsKCX0KfTsKClBvdHJlZS5WZXJzaW9uLnByb3RvdHlwZS51cFRvID0gZnVuY3Rpb24odmVyc2lvbil7CglyZXR1cm4gIXRoaXMubmV3ZXJUaGFuKHZlcnNpb24pOwp9ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzID0ge307CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5QT1NJVElPTl9DQVJURVNJQU4gCT0gMDsJLy8gZmxvYXQgeCwgeSwgejsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuQ09MT1JfUEFDS0VECQk9IDE7CS8vIGJ5dGUgciwgZywgYiwgYTsgCUkgPSBbMCwxXQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9GTE9BVFNfMQkJPSAyOwkvLyBmbG9hdCByLCBnLCBiOyAJCUkgPSBbMCwxXQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9GTE9BVFNfMjU1CT0gMzsJLy8gZmxvYXQgciwgZywgYjsgCQlJID0gWzAsMjU1XQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUxfRkxPQVRTCQk9IDQ7ICAJLy8gZmxvYXQgeCwgeSwgejsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuRklMTEVSCQkJCT0gNTsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuSU5URU5TSVRZCQkJPSA2OwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DTEFTU0lGSUNBVElPTgkJPSA3OwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUxfU1BIRVJFTUFQUEVECT0gODsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuTk9STUFMX09DVDE2CQk9IDk7ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTAkJCQk9IDEwOwoKLyoqCiAqIFNvbWUgdHlwZXMgb2YgcG9zc2libGUgcG9pbnQgYXR0cmlidXRlIGRhdGEgZm9ybWF0cwogKiAKICogQGNsYXNzCiAqLwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcyA9IHsKCURBVEFfVFlQRV9ET1VCTEUJOiB7b3JkaW5hbCA6IDAsIHNpemU6IDh9LAoJREFUQV9UWVBFX0ZMT0FUCQk6IHtvcmRpbmFsIDogMSwgc2l6ZTogNH0sCglEQVRBX1RZUEVfSU5UOAkJOiB7b3JkaW5hbCA6IDIsIHNpemU6IDF9LAoJREFUQV9UWVBFX1VJTlQ4CQk6IHtvcmRpbmFsIDogMywgc2l6ZTogMX0sCglEQVRBX1RZUEVfSU5UMTYJCToge29yZGluYWwgOiA0LCBzaXplOiAyfSwKCURBVEFfVFlQRV9VSU5UMTYJOiB7b3JkaW5hbCA6IDUsIHNpemU6IDJ9LAoJREFUQV9UWVBFX0lOVDMyCQk6IHtvcmRpbmFsIDogNiwgc2l6ZTogNH0sCglEQVRBX1RZUEVfVUlOVDMyCToge29yZGluYWwgOiA3LCBzaXplOiA0fSwKCURBVEFfVFlQRV9JTlQ2NAkJOiB7b3JkaW5hbCA6IDgsIHNpemU6IDh9LAoJREFUQV9UWVBFX1VJTlQ2NAk6IHtvcmRpbmFsIDogOSwgc2l6ZTogOH0KfTsKCnZhciBpID0gMDsKZm9yKHZhciBvYmogaW4gUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMpewoJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXNbaV0gPSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlc1tvYmpdOwoJaSsrOwp9CgovKioKICogQSBzaW5nbGUgcG9pbnQgYXR0cmlidXRlIHN1Y2ggYXMgY29sb3Ivbm9ybWFsLy4uIGFuZCBpdHMgZGF0YSBmb3JtYXQvbnVtYmVyIG9mIGVsZW1lbnRzLy4uLiAKICogCiAqIEBjbGFzcwogKiBAcGFyYW0gbmFtZSAKICogQHBhcmFtIHR5cGUKICogQHBhcmFtIHNpemUKICogQHJldHVybnMKICovClBvdHJlZS5Qb2ludEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIG51bUVsZW1lbnRzKXsKCXRoaXMubmFtZSA9IG5hbWU7Cgl0aGlzLnR5cGUgPSB0eXBlOyAKCXRoaXMubnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKCXRoaXMuYnl0ZVNpemUgPSB0aGlzLm51bUVsZW1lbnRzICogdGhpcy50eXBlLnNpemU7Cn0KClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5QT1NJVElPTl9DQVJURVNJQU4gPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLlBPU0lUSU9OX0NBUlRFU0lBTiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfRkxPQVQsIDMpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLlJHQkFfUEFDS0VEID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9QQUNLRUQsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX0lOVDgsIDQpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLkNPTE9SX1BBQ0tFRCA9IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5SR0JBX1BBQ0tFRDsKClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5SR0JfUEFDS0VEID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9QQUNLRUQsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX0lOVDgsIDMpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9GTE9BVFMgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTF9GTE9BVFMsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX0ZMT0FULCAzKTsKClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5GSUxMRVJfMUIgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkZJTExFUiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfVUlOVDgsIDEpOwoJCQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuSU5URU5TSVRZID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5JTlRFTlNJVFksCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX1VJTlQxNiwgMSk7CQkKCQkKUG90cmVlLlBvaW50QXR0cmlidXRlLkNMQVNTSUZJQ0FUSU9OID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DTEFTU0lGSUNBVElPTiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfVUlOVDgsIDEpOwkKCQkKUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9TUEhFUkVNQVBQRUQgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTF9TUEhFUkVNQVBQRUQsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX1VJTlQ4LCAyKTsJCQoJCQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX09DVDE2ID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUxfT0NUMTYsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX1VJTlQ4LCAyKTsJCgkJClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5OT1JNQUwgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTCwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfRkxPQVQsIDMpOwoKLyoqCiAqIE9yZGVyZWQgbGlzdCBvZiBQb2ludEF0dHJpYnV0ZXMgdXNlZCB0byBpZGVudGlmeSBob3cgcG9pbnRzIGFyZSBhbGlnbmVkIGluIGEgYnVmZmVyLgogKiAKICogQGNsYXNzCiAqIAogKi8KUG90cmVlLlBvaW50QXR0cmlidXRlcyA9IGZ1bmN0aW9uKHBvaW50QXR0cmlidXRlcyl7Cgl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgQXJyYXkoKTsKCXRoaXMuYnl0ZVNpemUgPSAwOwoJdGhpcy5zaXplID0gMDsKCQoJaWYocG9pbnRBdHRyaWJ1dGVzICE9IG51bGwpewkKCQlmb3IodmFyIGkgPSAwOyBpIDwgcG9pbnRBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKXsKCQkJdmFyIHBvaW50QXR0cmlidXRlTmFtZSA9IHBvaW50QXR0cmlidXRlc1tpXTsKCQkJdmFyIHBvaW50QXR0cmlidXRlID0gUG90cmVlLlBvaW50QXR0cmlidXRlW3BvaW50QXR0cmlidXRlTmFtZV07CgkJCXRoaXMuYXR0cmlidXRlcy5wdXNoKHBvaW50QXR0cmlidXRlKTsKCQkJdGhpcy5ieXRlU2l6ZSArPSBwb2ludEF0dHJpYnV0ZS5ieXRlU2l6ZTsKCQkJdGhpcy5zaXplKys7CgkJfQoJfQp9CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVzLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihwb2ludEF0dHJpYnV0ZSl7Cgl0aGlzLmF0dHJpYnV0ZXMucHVzaChwb2ludEF0dHJpYnV0ZSk7Cgl0aGlzLmJ5dGVTaXplICs9IHBvaW50QXR0cmlidXRlLmJ5dGVTaXplOwoJdGhpcy5zaXplKys7Cn07CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVzLnByb3RvdHlwZS5oYXNDb2xvcnMgPSBmdW5jdGlvbigpewoJZm9yKHZhciBuYW1lIGluIHRoaXMuYXR0cmlidXRlcyl7CgkJdmFyIHBvaW50QXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzW25hbWVdOwoJCWlmKHBvaW50QXR0cmlidXRlLm5hbWUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkNPTE9SX1BBQ0tFRCl7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCQoJcmV0dXJuIGZhbHNlOwp9OwoKUG90cmVlLlBvaW50QXR0cmlidXRlcy5wcm90b3R5cGUuaGFzTm9ybWFscyA9IGZ1bmN0aW9uKCl7Cglmb3IodmFyIG5hbWUgaW4gdGhpcy5hdHRyaWJ1dGVzKXsKCQl2YXIgcG9pbnRBdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07CgkJaWYoCgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX1NQSEVSRU1BUFBFRCB8fCAKCQkJcG9pbnRBdHRyaWJ1dGUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5OT1JNQUxfRkxPQVRTIHx8CgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMIHx8CgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX09DVDE2KXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoJCglyZXR1cm4gZmFsc2U7Cn07CgoK")); +}; +Potree.workers.binaryDecoder = new Potree.WorkerManager(atob("Ci8vIGh0dHA6Ly9qc3BlcmYuY29tL3VpbnQ4YXJyYXktdnMtZGF0YXZpZXczLzMKZnVuY3Rpb24gQ3VzdG9tVmlldyhidWZmZXIpIHsKCXRoaXMuYnVmZmVyID0gYnVmZmVyOwoJdGhpcy51OCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7CgkKCXZhciB0bXAgPSBuZXcgQXJyYXlCdWZmZXIoNCk7Cgl2YXIgdG1wZiA9IG5ldyBGbG9hdDMyQXJyYXkodG1wKTsKCXZhciB0bXB1OCA9IG5ldyBVaW50OEFycmF5KHRtcCk7CgkKCXRoaXMuZ2V0VWludDMyID0gZnVuY3Rpb24gKGkpIHsKCQlyZXR1cm4gKHRoaXMudThbaSszXSA8PCAyNCkgfCAodGhpcy51OFtpKzJdIDw8IDE2KSB8ICh0aGlzLnU4W2krMV0gPDwgOCkgfCB0aGlzLnU4W2ldOwoJfTsKCQoJdGhpcy5nZXRVaW50MTYgPSBmdW5jdGlvbiAoaSkgewoJCXJldHVybiAodGhpcy51OFtpKzFdIDw8IDgpIHwgdGhpcy51OFtpXTsKCX07CgkKCXRoaXMuZ2V0RmxvYXQgPSBmdW5jdGlvbihpKXsKCQl0bXB1OFswXSA9IHRoaXMudThbaSswXTsKCQl0bXB1OFsxXSA9IHRoaXMudThbaSsxXTsKCQl0bXB1OFsyXSA9IHRoaXMudThbaSsyXTsKCQl0bXB1OFszXSA9IHRoaXMudThbaSszXTsKCQkKCQlyZXR1cm4gdG1wZlswXTsKCX07CgkKCXRoaXMuZ2V0VWludDggPSBmdW5jdGlvbihpKXsKCQlyZXR1cm4gdGhpcy51OFtpXTsKCX07Cn0KClBvdHJlZSA9IHt9OwoKCm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KXsKCXZhciBidWZmZXIgPSBldmVudC5kYXRhLmJ1ZmZlcjsKCXZhciBwb2ludEF0dHJpYnV0ZXMgPSBldmVudC5kYXRhLnBvaW50QXR0cmlidXRlczsKCXZhciBudW1Qb2ludHMgPSBidWZmZXIuYnl0ZUxlbmd0aCAvIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZTsKCXZhciBjdiA9IG5ldyBDdXN0b21WaWV3KGJ1ZmZlcik7Cgl2YXIgdmVyc2lvbiA9IG5ldyBQb3RyZWUuVmVyc2lvbihldmVudC5kYXRhLnZlcnNpb24pOwoJdmFyIG1pbiA9IGV2ZW50LmRhdGEubWluOwoJdmFyIG5vZGVPZmZzZXQgPSBldmVudC5kYXRhLm9mZnNldDsKCXZhciBzY2FsZSA9IGV2ZW50LmRhdGEuc2NhbGU7Cgl2YXIgdGlnaHRCb3hNaW4gPSBbIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFldOwoJdmFyIHRpZ2h0Qm94TWF4ID0gWyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgXTsKCQoJdmFyIGF0dHJpYnV0ZUJ1ZmZlcnMgPSB7fTsKCQoJdmFyIG9mZnNldCA9IDA7Cglmb3IodmFyIGkgPSAwOyBpIDwgcG9pbnRBdHRyaWJ1dGVzLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspewoJCXZhciBwb2ludEF0dHJpYnV0ZSA9IHBvaW50QXR0cmlidXRlcy5hdHRyaWJ1dGVzW2ldOwoJCgkJaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLlBPU0lUSU9OX0NBUlRFU0lBTi5uYW1lKXsKCQkJCgkJCXZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KjMpOwoJCQl2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShidWZmKTsKCQkJCgkJCWZvcih2YXIgaiA9IDA7IGogPCBudW1Qb2ludHM7IGorKyl7CgkJCQlpZih2ZXJzaW9uLm5ld2VyVGhhbigiMS4zIikpewoJCQkJCXBvc2l0aW9uc1szKmorMF0gPSAoY3YuZ2V0VWludDMyKG9mZnNldCArIGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplKzApICogc2NhbGUpICsgbWluWzBdOwoJCQkJCXBvc2l0aW9uc1szKmorMV0gPSAoY3YuZ2V0VWludDMyKG9mZnNldCArIGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplKzQpICogc2NhbGUpICsgbWluWzFdOwoJCQkJCXBvc2l0aW9uc1szKmorMl0gPSAoY3YuZ2V0VWludDMyKG9mZnNldCArIGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplKzgpICogc2NhbGUpICsgbWluWzJdOwoJCQkJfWVsc2V7CgkJCQkJcG9zaXRpb25zWzMqaiswXSA9IGN2LmdldEZsb2F0KGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplKzApICsgbm9kZU9mZnNldFswXTsKCQkJCQlwb3NpdGlvbnNbMypqKzFdID0gY3YuZ2V0RmxvYXQoaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrNCkgKyBub2RlT2Zmc2V0WzFdOwoJCQkJCXBvc2l0aW9uc1szKmorMl0gPSBjdi5nZXRGbG9hdChqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSs4KSArIG5vZGVPZmZzZXRbMl07CgkJCQl9CgkJCQkKCQkJCXRpZ2h0Qm94TWluWzBdID0gTWF0aC5taW4odGlnaHRCb3hNaW5bMF0sIHBvc2l0aW9uc1szKmorMF0pOwoJCQkJdGlnaHRCb3hNaW5bMV0gPSBNYXRoLm1pbih0aWdodEJveE1pblsxXSwgcG9zaXRpb25zWzMqaisxXSk7CgkJCQl0aWdodEJveE1pblsyXSA9IE1hdGgubWluKHRpZ2h0Qm94TWluWzJdLCBwb3NpdGlvbnNbMypqKzJdKTsKCQkJCQoJCQkJdGlnaHRCb3hNYXhbMF0gPSBNYXRoLm1heCh0aWdodEJveE1heFswXSwgcG9zaXRpb25zWzMqaiswXSk7CgkJCQl0aWdodEJveE1heFsxXSA9IE1hdGgubWF4KHRpZ2h0Qm94TWF4WzFdLCBwb3NpdGlvbnNbMypqKzFdKTsKCQkJCXRpZ2h0Qm94TWF4WzJdID0gTWF0aC5tYXgodGlnaHRCb3hNYXhbMl0sIHBvc2l0aW9uc1szKmorMl0pOwoJCQl9CgkJCQoJCQlhdHRyaWJ1dGVCdWZmZXJzW3BvaW50QXR0cmlidXRlLm5hbWVdID0geyBidWZmZXI6IGJ1ZmYsIGF0dHJpYnV0ZTogcG9pbnRBdHRyaWJ1dGV9OwoJCQkKCQl9ZWxzZSBpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuQ09MT1JfUEFDS0VELm5hbWUpewoJCQkKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQqMyk7CgkJCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmYpOwoJCQkKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCWNvbG9yc1szKmorMF0gPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDApIC8gMjU1OwoJCQkJY29sb3JzWzMqaisxXSA9IGN2LmdldFVpbnQ4KG9mZnNldCArIGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMSkgLyAyNTU7CgkJCQljb2xvcnNbMypqKzJdID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyAyKSAvIDI1NTsKCQkJfQoJCQkKCQkJYXR0cmlidXRlQnVmZmVyc1twb2ludEF0dHJpYnV0ZS5uYW1lXSA9IHsgYnVmZmVyOiBidWZmLCBhdHRyaWJ1dGU6IHBvaW50QXR0cmlidXRlfTsKCQkJCgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLklOVEVOU0lUWS5uYW1lKXsKCgkJCXZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KTsKCQkJdmFyIGludGVuc2l0aWVzID0gbmV3IEZsb2F0MzJBcnJheShidWZmKTsKCQkJCgkJCWZvcih2YXIgaiA9IDA7IGogPCBudW1Qb2ludHM7IGorKyl7CgkJCQl2YXIgaW50ZW5zaXR5ID0gY3YuZ2V0VWludDE2KG9mZnNldCArIGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplKTsKCQkJCWludGVuc2l0aWVzW2pdID0gaW50ZW5zaXR5OwoJCQl9CgkJCQoJCQlhdHRyaWJ1dGVCdWZmZXJzW3BvaW50QXR0cmlidXRlLm5hbWVdID0geyBidWZmZXI6IGJ1ZmYsIGF0dHJpYnV0ZTogcG9pbnRBdHRyaWJ1dGV9OwoJCQoJCX1lbHNlIGlmKHBvaW50QXR0cmlidXRlLm5hbWUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5DTEFTU0lGSUNBVElPTi5uYW1lKXsKCgkJCXZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KTsKCQkJdmFyIGNsYXNzaWZpY2F0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCQoJCQlmb3IodmFyIGogPSAwOyBqIDwgbnVtUG9pbnRzOyBqKyspewoJCQkJdmFyIGNsYXNzaWZpY2F0aW9uID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUpOwoJCQkJY2xhc3NpZmljYXRpb25zW2pdID0gY2xhc3NpZmljYXRpb247CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJCgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9TUEhFUkVNQVBQRUQubmFtZSl7CgoJCQl2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihudW1Qb2ludHMqNCozKTsKCQkJdmFyIG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmYpOwoJCQkKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCXZhciBieCA9IGN2LmdldFVpbnQ4KG9mZnNldCArIGogKiBwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyAwKTsKCQkJCXZhciBieSA9IGN2LmdldFVpbnQ4KG9mZnNldCArIGogKiBwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyAxKTsKCQkJCgkJCQl2YXIgZXggPSBieCAvIDI1NTsKCQkJCXZhciBleSA9IGJ5IC8gMjU1OwoJCQkJCgkJCQl2YXIgbnggPSBleCAqIDIgLSAxOwoJCQkJdmFyIG55ID0gZXkgKiAyIC0gMTsKCQkJCXZhciBueiA9IDE7CgkJCQl2YXIgbncgPSAtMTsKCQkJCQoJCQkJdmFyIGwgPSAobnggKiAoLW54KSkgKyAobnkgKiAoLW55KSkgKyAobnogKiAoLW53KSk7CgkJCQlueiA9IGw7CgkJCQlueCA9IG54ICogTWF0aC5zcXJ0KGwpOwoJCQkJbnkgPSBueSAqIE1hdGguc3FydChsKTsKCQkJCQoJCQkJbnggPSBueCAqIDI7CgkJCQlueSA9IG55ICogMjsKCQkJCW56ID0gbnogKiAyIC0gMTsKCQkJCQoJCQkJbm9ybWFsc1szKmogKyAwXSA9IG54OwoJCQkJbm9ybWFsc1szKmogKyAxXSA9IG55OwoJCQkJbm9ybWFsc1szKmogKyAyXSA9IG56OwoJCQl9CgkJCQoJCQlhdHRyaWJ1dGVCdWZmZXJzW3BvaW50QXR0cmlidXRlLm5hbWVdID0geyBidWZmZXI6IGJ1ZmYsIGF0dHJpYnV0ZTogcG9pbnRBdHRyaWJ1dGV9OwoJCX1lbHNlIGlmKHBvaW50QXR0cmlidXRlLm5hbWUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5OT1JNQUxfT0NUMTYubmFtZSl7CgkJCQoJCQl2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihudW1Qb2ludHMqNCozKTsKCQkJdmFyIG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmYpOwoJCQlmb3IodmFyIGogPSAwOyBqIDwgbnVtUG9pbnRzOyBqKyspewoJCQkJdmFyIGJ4ID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDApOwoJCQkJdmFyIGJ5ID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDEpOwoJCQkJCgkJCQl2YXIgdSA9IChieCAvIDI1NSkgKiAyIC0gMTsKCQkJCXZhciB2ID0gKGJ5IC8gMjU1KSAqIDIgLSAxOwoJCQkJCgkJCQl2YXIgeiA9IDEgLSBNYXRoLmFicyh1KSAtIE1hdGguYWJzKHYpOwoJCQkJCgkJCQl2YXIgeCA9IDA7CgkJCQl2YXIgeSA9IDA7CgkJCQlpZih6ID49IDApewoJCQkJCXggPSB1OwoJCQkJCXkgPSB2OwoJCQkJfWVsc2V7CgkJCQkJeCA9IC0gKHYvTWF0aC5zaWduKHYpIC0gMSkgLyBNYXRoLnNpZ24odSk7CgkJCQkJeSA9IC0gKHUvTWF0aC5zaWduKHUpIC0gMSkgLyBNYXRoLnNpZ24odik7CgkJCQl9CgkJCQkKCQkJCXZhciBsZW5ndGggPSBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTsKCQkJCXggPSB4IC8gbGVuZ3RoOwoJCQkJeSA9IHkgLyBsZW5ndGg7CgkJCQl6ID0geiAvIGxlbmd0aDsKCQkJCQoJCQkJbm9ybWFsc1szKmogKyAwXSA9IHg7CgkJCQlub3JtYWxzWzMqaiArIDFdID0geTsKCQkJCW5vcm1hbHNbMypqICsgMl0gPSB6OwoJCQl9CgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTC5uYW1lKXsKCQkKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQqMyk7CgkJCXZhciBub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShidWZmKTsKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCXZhciB4ID0gY3YuZ2V0RmxvYXQob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDApOwoJCQkJdmFyIHkgPSBjdi5nZXRGbG9hdChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgNCk7CgkJCQl2YXIgeiA9IGN2LmdldEZsb2F0KG9mZnNldCArIGogKiBwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyA4KTsKCQkJCQoJCQkJbm9ybWFsc1szKmogKyAwXSA9IHg7CgkJCQlub3JtYWxzWzMqaiArIDFdID0geTsKCQkJCW5vcm1hbHNbMypqICsgMl0gPSB6OwoJCQl9CgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfQoJCQoJCW9mZnNldCArPSBwb2ludEF0dHJpYnV0ZS5ieXRlU2l6ZTsKCX0KCQoJdmFyIGluZGljZXMgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJdmFyIGlJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KGluZGljZXMpOwoJZm9yKHZhciBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKXsKCQlpSW5kaWNlc1tpXSA9IGk7Cgl9CgkKCXZhciBtZXNzYWdlID0gewoJCWF0dHJpYnV0ZUJ1ZmZlcnM6IGF0dHJpYnV0ZUJ1ZmZlcnMsCgkJdGlnaHRCb3VuZGluZ0JveDogeyBtaW46IHRpZ2h0Qm94TWluLCBtYXg6IHRpZ2h0Qm94TWF4IH0sCgkJaW5kaWNlczogaW5kaWNlcwoJfTsKCQkKCXZhciB0cmFuc2ZlcmFibGVzID0gW107CgkKCWZvcih2YXIgcHJvcGVydHkgaW4gbWVzc2FnZS5hdHRyaWJ1dGVCdWZmZXJzKXsKCQlpZihtZXNzYWdlLmF0dHJpYnV0ZUJ1ZmZlcnMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKXsKCQkJdHJhbnNmZXJhYmxlcy5wdXNoKG1lc3NhZ2UuYXR0cmlidXRlQnVmZmVyc1twcm9wZXJ0eV0uYnVmZmVyKTsKCQl9Cgl9CgkKCXRyYW5zZmVyYWJsZXMucHVzaChtZXNzYWdlLmluZGljZXMpOwoJCQoJcG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJhYmxlcyk7CgkKfTsKUG90cmVlLlZlcnNpb24gPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Cgl2YXIgdm1MZW5ndGggPSAodmVyc2lvbi5pbmRleE9mKCIuIikgPT09IC0xKSA/IHZlcnNpb24ubGVuZ3RoIDogdmVyc2lvbi5pbmRleE9mKCIuIik7Cgl0aGlzLnZlcnNpb25NYWpvciA9IHBhcnNlSW50KHZlcnNpb24uc3Vic3RyKDAsIHZtTGVuZ3RoKSk7Cgl0aGlzLnZlcnNpb25NaW5vciA9IHBhcnNlSW50KHZlcnNpb24uc3Vic3RyKHZtTGVuZ3RoICsgMSkpOwoJaWYodGhpcy52ZXJzaW9uTWlub3IubGVuZ3RoID09PSAwKXsKCQl0aGlzLnZlcnNpb25NaW5vciA9IDA7Cgl9CgkKfTsKClBvdHJlZS5WZXJzaW9uLnByb3RvdHlwZS5uZXdlclRoYW4gPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXZhciB2ID0gbmV3IFBvdHJlZS5WZXJzaW9uKHZlcnNpb24pOwoJCglpZiggdGhpcy52ZXJzaW9uTWFqb3IgPiB2LnZlcnNpb25NYWpvcil7CgkJcmV0dXJuIHRydWU7Cgl9ZWxzZSBpZiggdGhpcy52ZXJzaW9uTWFqb3IgPT09IHYudmVyc2lvbk1ham9yICYmIHRoaXMudmVyc2lvbk1pbm9yID4gdi52ZXJzaW9uTWlub3IpewoJCXJldHVybiB0cnVlOwoJfWVsc2V7CgkJcmV0dXJuIGZhbHNlOwoJfQp9OwoKUG90cmVlLlZlcnNpb24ucHJvdG90eXBlLmVxdWFsT3JIaWdoZXIgPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXZhciB2ID0gbmV3IFBvdHJlZS5WZXJzaW9uKHZlcnNpb24pOwoJCglpZiggdGhpcy52ZXJzaW9uTWFqb3IgPiB2LnZlcnNpb25NYWpvcil7CgkJcmV0dXJuIHRydWU7Cgl9ZWxzZSBpZiggdGhpcy52ZXJzaW9uTWFqb3IgPT09IHYudmVyc2lvbk1ham9yICYmIHRoaXMudmVyc2lvbk1pbm9yID49IHYudmVyc2lvbk1pbm9yKXsKCQlyZXR1cm4gdHJ1ZTsKCX1lbHNlewoJCXJldHVybiBmYWxzZTsKCX0KfTsKClBvdHJlZS5WZXJzaW9uLnByb3RvdHlwZS51cFRvID0gZnVuY3Rpb24odmVyc2lvbil7CglyZXR1cm4gIXRoaXMubmV3ZXJUaGFuKHZlcnNpb24pOwp9OwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcyA9IHt9OwoKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuUE9TSVRJT05fQ0FSVEVTSUFOIAk9IDA7CS8vIGZsb2F0IHgsIHksIHo7ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkNPTE9SX1BBQ0tFRAkJPSAxOwkvLyBieXRlIHIsIGcsIGIsIGE7IAlJID0gWzAsMV0KUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuQ09MT1JfRkxPQVRTXzEJCT0gMjsJLy8gZmxvYXQgciwgZywgYjsgCQlJID0gWzAsMV0KUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuQ09MT1JfRkxPQVRTXzI1NQk9IDM7CS8vIGZsb2F0IHIsIGcsIGI7IAkJSSA9IFswLDI1NV0KUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuTk9STUFMX0ZMT0FUUwkJPSA0OyAgCS8vIGZsb2F0IHgsIHksIHo7ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkZJTExFUgkJCQk9IDU7ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLklOVEVOU0lUWQkJCT0gNjsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuQ0xBU1NJRklDQVRJT04JCT0gNzsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuTk9STUFMX1NQSEVSRU1BUFBFRAk9IDg7ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTF9PQ1QxNgkJPSA5OwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUwJCQkJPSAxMDsKCi8qKgogKiBTb21lIHR5cGVzIG9mIHBvc3NpYmxlIHBvaW50IGF0dHJpYnV0ZSBkYXRhIGZvcm1hdHMKICogCiAqIEBjbGFzcwogKi8KUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMgPSB7CglEQVRBX1RZUEVfRE9VQkxFCToge29yZGluYWwgOiAwLCBzaXplOiA4fSwKCURBVEFfVFlQRV9GTE9BVAkJOiB7b3JkaW5hbCA6IDEsIHNpemU6IDR9LAoJREFUQV9UWVBFX0lOVDgJCToge29yZGluYWwgOiAyLCBzaXplOiAxfSwKCURBVEFfVFlQRV9VSU5UOAkJOiB7b3JkaW5hbCA6IDMsIHNpemU6IDF9LAoJREFUQV9UWVBFX0lOVDE2CQk6IHtvcmRpbmFsIDogNCwgc2l6ZTogMn0sCglEQVRBX1RZUEVfVUlOVDE2CToge29yZGluYWwgOiA1LCBzaXplOiAyfSwKCURBVEFfVFlQRV9JTlQzMgkJOiB7b3JkaW5hbCA6IDYsIHNpemU6IDR9LAoJREFUQV9UWVBFX1VJTlQzMgk6IHtvcmRpbmFsIDogNywgc2l6ZTogNH0sCglEQVRBX1RZUEVfSU5UNjQJCToge29yZGluYWwgOiA4LCBzaXplOiA4fSwKCURBVEFfVFlQRV9VSU5UNjQJOiB7b3JkaW5hbCA6IDksIHNpemU6IDh9Cn07Cgp2YXIgaSA9IDA7CmZvcih2YXIgb2JqIGluIFBvdHJlZS5Qb2ludEF0dHJpYnV0ZVR5cGVzKXsKCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZVR5cGVzW2ldID0gUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXNbb2JqXTsKCWkrKzsKfQoKLyoqCiAqIEEgc2luZ2xlIHBvaW50IGF0dHJpYnV0ZSBzdWNoIGFzIGNvbG9yL25vcm1hbC8uLiBhbmQgaXRzIGRhdGEgZm9ybWF0L251bWJlciBvZiBlbGVtZW50cy8uLi4gCiAqIAogKiBAY2xhc3MKICogQHBhcmFtIG5hbWUgCiAqIEBwYXJhbSB0eXBlCiAqIEBwYXJhbSBzaXplCiAqIEByZXR1cm5zCiAqLwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBudW1FbGVtZW50cyl7Cgl0aGlzLm5hbWUgPSBuYW1lOwoJdGhpcy50eXBlID0gdHlwZTsgCgl0aGlzLm51bUVsZW1lbnRzID0gbnVtRWxlbWVudHM7Cgl0aGlzLmJ5dGVTaXplID0gdGhpcy5udW1FbGVtZW50cyAqIHRoaXMudHlwZS5zaXplOwp9OwoKUG90cmVlLlBvaW50QXR0cmlidXRlLlBPU0lUSU9OX0NBUlRFU0lBTiA9IG5ldyBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUoCgkJUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuUE9TSVRJT05fQ0FSVEVTSUFOLAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZVR5cGVzLkRBVEFfVFlQRV9GTE9BVCwgMyk7CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuUkdCQV9QQUNLRUQgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkNPTE9SX1BBQ0tFRCwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfSU5UOCwgNCk7CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuQ09MT1JfUEFDS0VEID0gUG90cmVlLlBvaW50QXR0cmlidXRlLlJHQkFfUEFDS0VEOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLlJHQl9QQUNLRUQgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkNPTE9SX1BBQ0tFRCwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfSU5UOCwgMyk7CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX0ZMT0FUUyA9IG5ldyBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUoCgkJUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuTk9STUFMX0ZMT0FUUywKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfRkxPQVQsIDMpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLkZJTExFUl8xQiA9IG5ldyBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUoCgkJUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuRklMTEVSLAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZVR5cGVzLkRBVEFfVFlQRV9VSU5UOCwgMSk7CgkJClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5JTlRFTlNJVFkgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLklOVEVOU0lUWSwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfVUlOVDE2LCAxKTsJCQoJCQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuQ0xBU1NJRklDQVRJT04gPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkNMQVNTSUZJQ0FUSU9OLAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZVR5cGVzLkRBVEFfVFlQRV9VSU5UOCwgMSk7CQoJCQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX1NQSEVSRU1BUFBFRCA9IG5ldyBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUoCgkJUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuTk9STUFMX1NQSEVSRU1BUFBFRCwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfVUlOVDgsIDIpOwkJCgkJClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5OT1JNQUxfT0NUMTYgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTF9PQ1QxNiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfVUlOVDgsIDIpOwkKCQkKUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTCA9IG5ldyBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUoCgkJUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuTk9STUFMLAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZVR5cGVzLkRBVEFfVFlQRV9GTE9BVCwgMyk7CgovKioKICogT3JkZXJlZCBsaXN0IG9mIFBvaW50QXR0cmlidXRlcyB1c2VkIHRvIGlkZW50aWZ5IGhvdyBwb2ludHMgYXJlIGFsaWduZWQgaW4gYSBidWZmZXIuCiAqIAogKiBAY2xhc3MKICogCiAqLwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVzID0gZnVuY3Rpb24ocG9pbnRBdHRyaWJ1dGVzKXsKCXRoaXMuYXR0cmlidXRlcyA9IFtdOwoJdGhpcy5ieXRlU2l6ZSA9IDA7Cgl0aGlzLnNpemUgPSAwOwoJCglpZihwb2ludEF0dHJpYnV0ZXMgIT0gbnVsbCl7CQoJCWZvcih2YXIgaSA9IDA7IGkgPCBwb2ludEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspewoJCQl2YXIgcG9pbnRBdHRyaWJ1dGVOYW1lID0gcG9pbnRBdHRyaWJ1dGVzW2ldOwoJCQl2YXIgcG9pbnRBdHRyaWJ1dGUgPSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGVbcG9pbnRBdHRyaWJ1dGVOYW1lXTsKCQkJdGhpcy5hdHRyaWJ1dGVzLnB1c2gocG9pbnRBdHRyaWJ1dGUpOwoJCQl0aGlzLmJ5dGVTaXplICs9IHBvaW50QXR0cmlidXRlLmJ5dGVTaXplOwoJCQl0aGlzLnNpemUrKzsKCQl9Cgl9Cn07CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVzLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihwb2ludEF0dHJpYnV0ZSl7Cgl0aGlzLmF0dHJpYnV0ZXMucHVzaChwb2ludEF0dHJpYnV0ZSk7Cgl0aGlzLmJ5dGVTaXplICs9IHBvaW50QXR0cmlidXRlLmJ5dGVTaXplOwoJdGhpcy5zaXplKys7Cn07CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVzLnByb3RvdHlwZS5oYXNDb2xvcnMgPSBmdW5jdGlvbigpewoJZm9yKHZhciBuYW1lIGluIHRoaXMuYXR0cmlidXRlcyl7CgkJdmFyIHBvaW50QXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzW25hbWVdOwoJCWlmKHBvaW50QXR0cmlidXRlLm5hbWUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkNPTE9SX1BBQ0tFRCl7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCQoJcmV0dXJuIGZhbHNlOwp9OwoKUG90cmVlLlBvaW50QXR0cmlidXRlcy5wcm90b3R5cGUuaGFzTm9ybWFscyA9IGZ1bmN0aW9uKCl7Cglmb3IodmFyIG5hbWUgaW4gdGhpcy5hdHRyaWJ1dGVzKXsKCQl2YXIgcG9pbnRBdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07CgkJaWYoCgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX1NQSEVSRU1BUFBFRCB8fCAKCQkJcG9pbnRBdHRyaWJ1dGUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5OT1JNQUxfRkxPQVRTIHx8CgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMIHx8CgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX09DVDE2KXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoJCglyZXR1cm4gZmFsc2U7Cn07CgoK")); Potree.Shaders["pointcloud.vs"] = [ "", "// the following is an incomplete list of attributes, uniforms and defines", @@ -322,16 +322,9 @@ Potree.Shaders["pointcloud.vs"] = [ " #elif defined color_type_classification", " float c = mod(classification, 16.0);", " vec2 uv = vec2(c / 255.0, 0.5);", - " vColor = texture2D(classificationLUT, uv).rgb;", - " ", - " // TODO only for testing - removing points with class 7", - " if(classification == 7.0){", - " gl_Position = vec4(100.0, 100.0, 100.0, 0.0);", - " }", + " vec4 classColor = texture2D(classificationLUT, uv);", + " vColor = classColor.rgb;", " #elif defined color_type_return_number", - " //float w = (returnNumber - 1.0) / 4.0 + 0.1;", - " //vColor = texture2D(gradient, vec2(w, 1.0 - w)).rgb;", - " ", " if(numberOfReturns == 1.0){", " vColor = vec3(1.0, 1.0, 0.0);", " }else{", @@ -343,7 +336,6 @@ Potree.Shaders["pointcloud.vs"] = [ " vColor = vec3(0.0, 1.0, 0.0);", " }", " }", - " ", " #elif defined color_type_source", " float w = mod(pointSourceID, 10.0) / 10.0;", " vColor = texture2D(gradient, vec2(w,1.0 - w)).rgb;", @@ -353,6 +345,16 @@ Potree.Shaders["pointcloud.vs"] = [ " vColor = color;", " #endif", " ", + " {", + " // TODO might want to combine with the define block above to avoid reading same LUT two times", + " float c = mod(classification, 16.0);", + " vec2 uv = vec2(c / 255.0, 0.5);", + " ", + " if(texture2D(classificationLUT, uv).a == 0.0){", + " gl_Position = vec4(100.0, 100.0, 100.0, 0.0);", + " }", + " }", + " ", " //if(vNormal.z < 0.0){", " // gl_Position = vec4(1000.0, 1000.0, 1000.0, 1.0);", " //}", @@ -756,7 +758,9 @@ Potree.Shaders["edl.fs"] = [ "uniform vec2 neighbours[NEIGHBOUR_COUNT];", "uniform vec3 lightDir;", "uniform float expScale;", + "uniform float edlScale;", "uniform float radius;", + "uniform float opacity;", "", "//uniform sampler2D depthMap;", "uniform sampler2D colorMap;", @@ -815,14 +819,14 @@ Potree.Shaders["edl.fs"] = [ " float linearDepth = logToLinear(texture2D(colorMap, vUv).a);", " ", " float f = computeObscurance(linearDepth);", - " f = exp(-expScale * f);", + " f = exp(-expScale * edlScale * f);", " ", " vec4 color = texture2D(colorMap, vUv);", " if(color.a == 0.0 && f >= 1.0){", " discard;", " }", " ", - " gl_FragColor = vec4(color.rgb * f, 1.0);", + " gl_FragColor = vec4(color.rgb * f, opacity);", "}", "", ].join("\n"); @@ -880,36 +884,39 @@ Potree.Shaders["blur.fs"] = [ THREE.PerspectiveCamera.prototype.zoomTo = function( node, factor ){ - if ( !node.geometry && !node.boundingSphere) { - + if ( !node.geometry && !node.boundingSphere && !node.boundingBox) { return; - } if ( node.geometry && node.geometry.boundingSphere === null ) { - node.geometry.computeBoundingSphere(); - } node.updateMatrixWorld(); + + var bs; + + if(node.boundingSphere){ + bs = node.boundingSphere; + }else if(node.geometry && node.geometry.boundingSphere){ + bs = node.geometry.boundingSphere; + }else{ + bs = node.boundingBox.getBoundingSphere(); + } var _factor = factor || 1; - var bs = node.boundingSphere || node.geometry.boundingSphere; + bs = bs.clone().applyMatrix4(node.matrixWorld); var radius = bs.radius; var fovr = this.fov * Math.PI / 180; if( this.aspect < 1 ){ - fovr = fovr * this.aspect; - } var distanceFactor = Math.abs( radius / Math.sin( fovr / 2 ) ) * _factor ; - var dir = new THREE.Vector3( 0, 0, -1 ).applyQuaternion( this.quaternion ); - var offset = dir.multiplyScalar( -distanceFactor ); + var offset = this.getWorldDirection().multiplyScalar( -distanceFactor ); this.position.copy(bs.center.clone().add( offset )); }; @@ -966,10 +973,10 @@ THREE.PerspectiveCamera.prototype.zoomTo = function( node, factor ){ //} THREE.Ray.prototype.distanceToPlaneWithNegative = function ( plane ) { var denominator = plane.normal.dot( this.direction ); - if ( denominator == 0 ) { + if ( denominator === 0 ) { // line is coplanar, return origin - if( plane.distanceToPoint( this.origin ) == 0 ) { + if( plane.distanceToPoint( this.origin ) === 0 ) { return 0; } @@ -979,7 +986,7 @@ THREE.Ray.prototype.distanceToPlaneWithNegative = function ( plane ) { var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; return t; -} +}; /** @@ -990,7 +997,7 @@ THREE.Ray.prototype.distanceToPlaneWithNegative = function ( plane ) { */ Potree.POCLoader = function(){ -} +}; /** * @return a point cloud octree with the root node data loaded. @@ -1045,7 +1052,7 @@ Potree.POCLoader.load = function load(url, callback) { tightBoundingBox.max.add(offset); pco.boundingBox = boundingBox; - pco.tightBoundingBox = tightBoundingBox + pco.tightBoundingBox = tightBoundingBox; pco.boundingSphere = boundingBox.getBoundingSphere(); pco.tightBoundingSphere = tightBoundingBox.getBoundingSphere(); pco.offset = offset; @@ -1099,7 +1106,7 @@ Potree.POCLoader.load = function load(url, callback) { callback(pco); } - } + }; xhr.send(null); }catch(e){ @@ -1219,7 +1226,7 @@ Potree.PointAttribute = function(name, type, numElements){ this.type = type; this.numElements = numElements; this.byteSize = this.numElements * this.type.size; -} +}; Potree.PointAttribute.POSITION_CARTESIAN = new Potree.PointAttribute( Potree.PointAttributeNames.POSITION_CARTESIAN, @@ -1270,7 +1277,7 @@ Potree.PointAttribute.NORMAL = new Potree.PointAttribute( * */ Potree.PointAttributes = function(pointAttributes){ - this.attributes = new Array(); + this.attributes = []; this.byteSize = 0; this.size = 0; @@ -1283,7 +1290,7 @@ Potree.PointAttributes = function(pointAttributes){ this.size++; } } -} +}; Potree.PointAttributes.prototype.add = function(pointAttribute){ this.attributes.push(pointAttribute); @@ -1425,7 +1432,7 @@ Potree.BinaryLoader.prototype.parse = function(node, buffer){ node.loaded = true; node.loading = false; node.pcoGeometry.numNodesLoading--; - } + }; var message = { buffer: buffer, @@ -1456,7 +1463,7 @@ Potree.LasLazLoader = function(version){ }else{ this.version = version; } -} +}; Potree.LasLazLoader.prototype.load = function(node){ @@ -1493,7 +1500,7 @@ Potree.LasLazLoader.prototype.load = function(node){ }; xhr.send(null); -} +}; Potree.LasLazLoader.progressCB = function(arg){ @@ -1605,7 +1612,7 @@ Potree.LasLazBatcher = function(node){ var endsWith = function(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; - } + }; var positions = e.data.position; var colors = e.data.color; @@ -1674,7 +1681,7 @@ Potree.LasLazBatcher = function(node){ bbOffset: [node.pcoGeometry.offset.x, node.pcoGeometry.offset.y, node.pcoGeometry.offset.z] }; ww.postMessage(message, [message.buffer]); - } + }; }; @@ -1704,18 +1711,18 @@ Potree.Gradients = { Potree.Classification = { "DEFAULT": { - 0: new THREE.Color(0.5, 0.5,0.5), - 1: new THREE.Color(0.5, 0.5,0.5), - 2: new THREE.Color(0.63, 0.32, 0.18), - 3: new THREE.Color(0.0, 1.0, 0.0), - 4: new THREE.Color(0.0, 0.8, 0.0), - 5: new THREE.Color(0.0, 0.6, 0.0 ), - 6: new THREE.Color(1.0, 0.66, 0.0), - 7: new THREE.Color(1.0, 0, 1.0 ), - 8: new THREE.Color(1.0, 0, 0.0 ), - 9: new THREE.Color(0.0, 0.0, 1.0 ), - 12: new THREE.Color(1.0, 1.0, 0.0 ), - "DEFAULT": new THREE.Color(0.3, 0.6, 0.6 ) + 0: new THREE.Vector4(0.5, 0.5,0.5, 1.0), + 1: new THREE.Vector4(0.5, 0.5,0.5, 1.0), + 2: new THREE.Vector4(0.63, 0.32, 0.18, 1.0), + 3: new THREE.Vector4(0.0, 1.0, 0.0, 1.0), + 4: new THREE.Vector4(0.0, 0.8, 0.0, 1.0), + 5: new THREE.Vector4(0.0, 0.6, 0.0, 1.0), + 6: new THREE.Vector4(1.0, 0.66, 0.0, 1.0), + 7: new THREE.Vector4(1.0, 0, 1.0, 1.0), + 8: new THREE.Vector4(1.0, 0, 0.0, 1.0), + 9: new THREE.Vector4(0.0, 0.0, 1.0, 1.0), + 12: new THREE.Vector4(1.0, 1.0, 0.0, 1.0), + "DEFAULT": new THREE.Vector4(0.3, 0.6, 0.6, 1.0) } }; @@ -1745,8 +1752,7 @@ Potree.PointColorType = { RETURN_NUMBER: 9, SOURCE: 10, NORMAL: 11, - PHONG: 12, - TREE_DEPTH: 13 + PHONG: 12 }; Potree.ClipMode = { @@ -1784,7 +1790,7 @@ Potree.PointCloudMaterial = function(parameters){ this.numClipBoxes = 0; this._clipMode = Potree.ClipMode.DISABLED; this._weighted = false; - this._depthMap; + this._depthMap = null; this._gradient = Potree.Gradients.RAINBOW; this._classification = Potree.Classification.DEFAULT; this.gradientTexture = Potree.PointCloudMaterial.generateGradientTexture(this._gradient); @@ -1794,9 +1800,6 @@ Potree.PointCloudMaterial = function(parameters){ this._useLogarithmicDepthBuffer = false; this._useEDL = false; - - - var attributes = {}; var uniforms = { spacing: { type: "f", value: 1.0 }, @@ -1845,6 +1848,7 @@ Potree.PointCloudMaterial = function(parameters){ }; this.defaultAttributeValues.normal = [0,0,0]; + this.defaultAttributeValues.classification = [0,0,0]; this.setValues({ uniforms: uniforms, @@ -1870,7 +1874,7 @@ Potree.PointCloudMaterial.prototype.updateShaderSource = function(){ || this.pointColorType === Potree.PointColorType.INTENSITY_GRADIENT){ attributes.intensity = { type: "f", value: [] }; }else if(this.pointColorType === Potree.PointColorType.CLASSIFICATION){ - attributes.classification = { type: "f", value: [] }; + //attributes.classification = { type: "f", value: [] }; }else if(this.pointColorType === Potree.PointColorType.RETURN_NUMBER){ attributes.returnNumber = { type: "f", value: [] }; attributes.numberOfReturns = { type: "f", value: [] }; @@ -1879,6 +1883,7 @@ Potree.PointCloudMaterial.prototype.updateShaderSource = function(){ }else if(this.pointColorType === Potree.PointColorType.NORMAL || this.pointColorType === Potree.PointColorType.PHONG){ attributes.normal = { type: "f", value: [] }; } + attributes.classification = { type: "f", value: 0 }; var vs = this.getDefines() + Potree.Shaders["pointcloud.vs"]; var fs = this.getDefines() + Potree.Shaders["pointcloud.fs"]; @@ -2053,11 +2058,11 @@ Object.defineProperty(Potree.PointCloudMaterial.prototype, "classification", { return this._classification; }, set: function(value){ - if(this._classification !== value){ + //if(this._classification !== value){ this._classification = value; this.classificationTexture = Potree.PointCloudMaterial.generateClassificationTexture(this._classification); this.uniforms.classificationLUT.value = this.classificationTexture; - } + //} } }); @@ -2412,9 +2417,9 @@ Potree.PointCloudMaterial.generateGradientTexture = function(gradient) { Potree.PointCloudMaterial.generateClassificationTexture = function(classification){ var width = 256; var height = 256; - var map = THREE.ImageUtils.generateDataTexture( width, height, new THREE.Color() ); - map.magFilter = THREE.NearestFilter; - var data = map.image.data; + var size = width*height; + + var data = new Uint8Array(4*size); for(var x = 0; x < width; x++){ for(var y = 0; y < height; y++){ @@ -2431,14 +2436,18 @@ Potree.PointCloudMaterial.generateClassificationTexture = function(classificati } - data[3*i+0] = 255 * color.r; - data[3*i+1] = 255 * color.g; - data[3*i+2] = 255 * color.b; + data[4*i+0] = 255 * color.x; + data[4*i+1] = 255 * color.y; + data[4*i+2] = 255 * color.z; + data[4*i+3] = 255 * color.w; } } - return map; + var texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat); + texture.magFilter = THREE.NearestFilter; + texture.needsUpdate = true; + return texture; }; // @@ -2481,11 +2490,13 @@ Potree.EyeDomeLightingMaterial = function(parameters){ near: { type: "f", value: 0 }, far: { type: "f", value: 0 }, expScale: { type: "f", value: 100.0 }, + edlScale: { type: "f", value: 1.0 }, radius: { type: "f", value: 3.0 }, lightDir: { type: "v3", value: lightDir }, neighbours: { type: "2fv", value: neighbours }, depthMap: { type: "t", value: null }, - colorMap: { type: "t", value: null } + colorMap: { type: "t", value: null }, + opacity: { type: "f", value: 1.0} }; this.setValues({ @@ -3777,7 +3788,7 @@ THREE.EarthControls = function ( camera, renderer, scene ) { x: ( (event.clientX - rect.left) / scope.domElement.clientWidth ) * 2 - 1, y: - ( (event.clientY - rect.top) / scope.domElement.clientHeight ) * 2 + 1 }; - var I = getMousePointCloudIntersection(mouse, scope.camera, scope.renderer, scope.pointclouds) + var I = getMousePointCloudIntersection(mouse, scope.camera, scope.renderer, scope.pointclouds); if(!I){ return; } @@ -3849,7 +3860,7 @@ THREE.EarthControls = function ( camera, renderer, scene ) { x: ( (event.clientX - rect.left) / scope.domElement.clientWidth ) * 2 - 1, y: - ( (event.clientY - rect.top) / scope.domElement.clientHeight ) * 2 + 1 }; - var I = getMousePointCloudIntersection(mouse, scope.camera, scope.renderer, scope.pointclouds) + var I = getMousePointCloudIntersection(mouse, scope.camera, scope.renderer, scope.pointclouds); if(I){ var distance = I.distanceTo(scope.camera.position); @@ -4054,7 +4065,7 @@ LRU.prototype.freeMemory = function(){ var node = element.node; this.disposeDescendants(node); - }; + } }; LRU.prototype.disposeDescendants = function(node){ @@ -4063,6 +4074,8 @@ LRU.prototype.disposeDescendants = function(node){ while(stack.length > 0){ var current = stack.pop(); + //console.log(current); + current.dispose(); this.remove(current); @@ -4076,11 +4089,488 @@ LRU.prototype.disposeDescendants = function(node){ } } }; +Potree.Annotation = function(viewer, args){ + var scope = this; + + Potree.Annotation.counter++; + + this.viewer = viewer; + this.ordinal = args.ordinal || Potree.Annotation.counter; + this.title = args.title || "No Title"; + this.description = args.description || ""; + this.scene = args.scene || null; + this.position = args.position || new THREE.Vector3(0,0,0); + this.cameraPosition = args.cameraPosition; + this.cameraTarget = args.cameraTarget || this.position; + this.view = args.view || null; + this.keepOpen = false; + + this.domElement = document.createElement("div"); + this.domElement.style.position = "fixed"; + this.domElement.style.opacity = "0.5"; + this.domElement.className = "annotation"; + + this.elOrdinal = document.createElement("div"); + this.elOrdinal.style.position = "absolute"; + this.elOrdinal.style.width = "1.5em"; + this.elOrdinal.style.height = "1.5em"; + this.elOrdinal.style.color = "white"; + this.elOrdinal.style.backgroundColor = "black"; + this.elOrdinal.style.borderRadius = "1.5em"; + this.elOrdinal.style.fontSize = "1em"; + this.elOrdinal.style.opacity = "1"; + this.elOrdinal.style.zIndex = "100"; + this.domElement.appendChild(this.elOrdinal); + this.elOrdinal.onmouseenter = function(){ + //scope.openBar(); + }; + this.elOrdinal.onmouseleave = function(){ + + }; + this.elOrdinal.onclick = function(){ + scope.moveHere(scope.viewer.camera); + //scope.openBar(); + //scope.keepOpen = true; + }; + this.domElement.onmouseleave = function(){ + //scope.closeBar(); + }; + + + this.elOrdinalText = document.createElement("span"); + this.elOrdinalText.style.display = "inline-block"; + this.elOrdinalText.style.verticalAlign = "middle"; + this.elOrdinalText.style.lineHeight = "1.5em"; + this.elOrdinalText.style.textAlign = "center"; + this.elOrdinalText.style.width = "100%"; + //this.elOrdinalText.style.fontWeight = "bold"; + this.elOrdinalText.style.fontFamily = "Arial"; + this.elOrdinalText.style.cursor = "default"; + this.elOrdinalText.innerHTML = this.ordinal; + this.elOrdinalText.userSelect = "none"; + this.elOrdinal.appendChild(this.elOrdinalText); + + + this.elButtons = document.createElement("div"); + this.elButtons.style.position = "absolute"; + this.elButtons.style.display = "block"; + this.elButtons.style.height = "1.5em"; + this.elButtons.style.backgroundColor = "#333333"; + this.elButtons.style.zIndex = "50"; + this.elButtons.style.borderRadius = "1.5em 1.5em 1.5em 1.5em"; + this.elButtons.style.cursor = "default"; + this.elButtons.style.padding = "0.0em 0.0em 0em 1.5em"; + this.elButtons.style.whiteSpace = "nowrap"; + this.domElement.appendChild(this.elButtons); + + + if(this.description){ + this.elButtonsInfo = document.createElement("img"); + this.elButtonsInfo.src = "../resources/icons/info_32x32.png"; + this.elButtonsInfo.style.width = "1.5em"; + this.elButtonsInfo.style.padding = "0em 0em 0em 0.2em"; + this.elButtons.appendChild(this.elButtonsInfo); + this.elButtonsInfo.onclick = function(){ + scope.openDescriptionWindow(); + }; + } + + if(this.scene){ + this.elButtonsScene = document.createElement("img"); + this.elButtonsScene.src = "../resources/icons/goto_32x32.png"; + this.elButtonsScene.style.width = "1.5em"; + this.elButtonsScene.style.padding = "0em 0em 0em 0.2em"; + this.elButtonsScene.onclick = function(){loadScene(scope.scene)}; + + this.elButtons.appendChild(this.elButtonsScene); + } + + this.domElement.onmouseenter = function(){ + scope.domElement.style.opacity = "0.8"; + }; + this.domElement.onmouseleave = function(){ + scope.domElement.style.opacity = "0.5"; + }; + + this.openBar = function(){ + scope.elOrdinal.style.opacity = 0.8; + scope.elButtons.style.display = "block"; + }; + + this.closeBar = function(){ + if(!this.keepOpen){ + scope.elOrdinal.style.opacity = 0.5; + scope.elButtons.style.display = "none"; + } + }; + + this.openDescriptionWindow = function(){ + if(this.elDescription){ + this.elDescription.style.display = "block"; + }else{ + this.elDescription = document.createElement("div"); + this.elDescription.className = "description"; + + this.elDescriptionHeader = document.createElement("div"); + this.elDescriptionHeader.className = "description-header"; + this.elDescription.appendChild(this.elDescriptionHeader); + + this.elDescriptionTitle = document.createElement("span"); + this.elDescriptionTitle.className = "description-title"; + this.elDescriptionTitle.innerHTML = scope.title; + this.elDescriptionHeader.appendChild(this.elDescriptionTitle); + + this.elDescriptionButtons = document.createElement("span"); + this.elDescriptionButtons.className = "description-buttons"; + this.elDescriptionHeader.appendChild(this.elDescriptionButtons); + + this.elDescriptionClose = document.createElement("img"); + this.elDescriptionClose.src = "../resources/icons/close_32x32_black.png"; + this.elDescriptionClose.onmouseenter = function(){this.src = '../resources/icons/close_32x32_black_shadow.png'}; + this.elDescriptionClose.onmouseleave = function(){this.src = '../resources/icons/close_32x32_black.png'}; + this.elDescriptionClose.style.height = "1.5em"; + this.elDescriptionClose.onclick = function(){ + scope.elDescription.style.display = "none"; + }; + this.elDescriptionButtons.appendChild(this.elDescriptionClose); + + this.elDescriptionContent = document.createElement("div"); + this.elDescriptionContent.className = "description-content"; + this.elDescriptionContent.innerHTML = this.description; + this.elDescription.appendChild(this.elDescriptionContent); + + document.body.appendChild(this.elDescription); + } + + }; + + this.moveHere = function(camera){ + var animationDuration = 800; + var easing = TWEEN.Easing.Quartic.Out; + + // animate camera position + var tween = new TWEEN.Tween(camera.position).to(scope.cameraPosition, animationDuration); + tween.easing(easing); + tween.start(); + + // animate camera target + var camTargetDistance = camera.position.distanceTo(scope.cameraTarget); + var target = new THREE.Vector3().addVectors( + camera.position, + camera.getWorldDirection().clone().multiplyScalar(camTargetDistance) + ); + var tween = new TWEEN.Tween(target).to(scope.cameraTarget, animationDuration); + tween.easing(easing); + tween.onUpdate(function(){ + camera.lookAt(target); + scope.viewer.orbitControls.target.copy(target); + }); + tween.onComplete(function(){ + camera.lookAt(target); + scope.viewer.orbitControls.target.copy(target); + }); + + tween.start(); + }; + + this.dispose = function(){ + if(this.descriptionDialog){ + var id = "annotation_description_" + scope.ordinal; + $( ("#" + id) ).dialog('destroy'); + } + + if(this.domElement.parentElement){ + this.domElement.parentElement.removeChild(this.domElement); + } + + if(this.elDescription){ + if(this.elDescription.parentElement){ + this.elDescription.parentElement.removeChild(this.elDescription); + } + } + }; +}; + +Potree.Annotation.counter = 0; + +Potree.ProfileData = function(profile){ + this.profile = profile; + + this.segments = []; + this.boundingBox = new THREE.Box3(); + this.projectedBoundingBox = new THREE.Box2(); + + var mileage = new THREE.Vector3(); + for(var i = 0; i < profile.points.length - 1; i++){ + var start = profile.points[i]; + var end = profile.points[i+1]; + + var center = new THREE.Vector3().addVectors(end, start).multiplyScalar(0.5); + var length = new THREE.Vector3(start.x, 0, start.z).distanceTo(new THREE.Vector3(end.x, 0, end.z)); + var side = new THREE.Vector3().subVectors(end, start).normalize(); + var up = new THREE.Vector3(0, 1, 0); + var forward = new THREE.Vector3().crossVectors(side, up).normalize(); + var N = forward; + var cutPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(N, start); + var halfPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(side, center); + + var project = function(_start, _end, _mileage){ + var start = _start; + var end = _end; + var mileage = _mileage; + + var xAxis = new THREE.Vector3(1,0,0); + var dir = new THREE.Vector3().subVectors(end, start); + dir.y = 0; + dir.normalize(); + var alpha = Math.acos(xAxis.dot(dir)); + if(dir.z > 0){ + alpha = -alpha; + } + + + return function(position){ + var toOrigin = new THREE.Matrix4().makeTranslation(-start.x, 0, -start.z); + var alignWithX = new THREE.Matrix4().makeRotationY(-alpha); + var applyMileage = new THREE.Matrix4().makeTranslation(mileage.x, 0, 0); + + var pos = position.clone(); + pos.applyMatrix4(toOrigin); + pos.applyMatrix4(alignWithX); + pos.applyMatrix4(applyMileage); + + return pos; + }; + + }(start, end, mileage.clone()); + + var segment = { + start: start, + end: end, + cutPlane: cutPlane, + halfPlane: halfPlane, + length: length, + points: null, + project: project + }; + + this.segments.push(segment); + + mileage.x += new THREE.Vector3(start.x, 0, start.z).distanceTo(new THREE.Vector3(end.x, 0, end.z)); + mileage.y += end.y - start.y; + } + + this.projectedBoundingBox.min.x = 0; + this.projectedBoundingBox.min.y = Number.POSITIVE_INFINITY; + this.projectedBoundingBox.max.x = mileage.x; + this.projectedBoundingBox.max.y = Number.NEGATIVE_INFINITY; + + this.size = function(){ + var size = 0; + for(var i = 0; i < this.segments.length; i++){ + if(this.segments[i].points){ + size += this.segments[i].points.numPoints; + } + } + return size; + } + +}; + +Potree.ProfileRequest = function(pointcloud, profile, maxDepth, callback){ + + this.pointcloud = pointcloud; + this.profile = profile; + this.maxDepth = maxDepth || Number.MAX_VALUE; + this.callback = callback; + this.temporaryResult = new Potree.ProfileData(this.profile); + this.pointsServed = 0; + + this.priorityQueue = new BinaryHeap(function(x){return 1 / x.weight;}); + + this.initialize = function(){ + this.priorityQueue.push({node: pointcloud.pcoGeometry.root, weight: 1}); + this.traverse(pointcloud.pcoGeometry.root); + }; + + // traverse the node and add intersecting descendants to queue + this.traverse = function(node){ + + var stack = []; + for(var i = 0; i < 8; i++){ + var child = node.children[i]; + if(child && pointcloud.nodeIntersectsProfile(child, this.profile)){ + stack.push(child); + } + } + + while(stack.length > 0){ + var node = stack.pop(); + var weight = node.boundingSphere.radius; + + this.priorityQueue.push({node: node, weight: weight}); + + // add children that intersect the cutting plane + if(node.level < this.maxDepth){ + for(var i = 0; i < 8; i++){ + var child = node.children[i]; + if(child && pointcloud.nodeIntersectsProfile(child, this.profile)){ + stack.push(child); + } + } + } + } + }; + + this.update = function(){ + + // load nodes in queue + // if hierarchy expands, also load nodes from expanded hierarchy + // once loaded, add data to this.points and remove node from queue + // only evaluate 1-50 nodes per frame to maintain responsiveness + + var intersectedNodes = []; + + for(var i = 0; i < Math.min(2, this.priorityQueue.size()); i++){ + var element = this.priorityQueue.pop(); + var node = element.node; + + + if(node.loaded){ + // add points to result + intersectedNodes.push(node); + Potree.PointCloudOctree.lru.touch(node); + + if((node.level % node.pcoGeometry.hierarchyStepSize) === 0 && node.hasChildren){ + this.traverse(node); + } + }else{ + node.load(); + this.priorityQueue.push(element); + } + } + + if(intersectedNodes.length > 0){ + this.getPointsInsideProfile(intersectedNodes, this.temporaryResult); + if(this.temporaryResult.size() > 100){ + this.pointsServed += this.temporaryResult.size(); + callback.onProgress({request: this, points: this.temporaryResult}); + this.temporaryResult = new Potree.ProfileData(this.profile); + } + } + + if(this.priorityQueue.size() === 0){ + // we're done! inform callback and remove from pending requests + if(this.temporaryResult.size() > 0){ + this.pointsServed += this.temporaryResult.size(); + callback.onProgress({request: this, points: this.temporaryResult}); + this.temporaryResult = new Potree.ProfileData(this.profile); + } + + callback.onFinish({request: this}); + + var index = pointcloud.profileRequests.indexOf(this); + if(index >= 0){ + pointcloud.profileRequests.splice(index, 1); + } + } + }; + + this.getPointsInsideProfile = function(nodes, target){ + + for(var pi = 0; pi < target.segments.length; pi++){ + var segment = target.segments[pi]; + + for(var ni = 0; ni < nodes.length; ni++){ + var node = nodes[ni]; + + var geometry = node.geometry; + var positions = geometry.attributes.position; + var p = positions.array; + var numPoints = node.numPoints; + + if(!segment.points){ + segment.points = {}; + segment.points.boundingBox = new THREE.Box3(); + + for (var property in geometry.attributes) { + if (geometry.attributes.hasOwnProperty(property)) { + if(property === "indices"){ + + }else{ + segment.points[property] = []; + } + } + } + } + + for(var i = 0; i < numPoints; i++){ + var pos = new THREE.Vector3(p[3*i], p[3*i+1], p[3*i+2]); + pos.applyMatrix4(pointcloud.matrixWorld); + var distance = Math.abs(segment.cutPlane.distanceToPoint(pos)); + var centerDistance = Math.abs(segment.halfPlane.distanceToPoint(pos)); + + if(distance < profile.width / 2 && centerDistance < segment.length / 2){ + segment.points.boundingBox.expandByPoint(pos); + + for (var property in geometry.attributes) { + if (geometry.attributes.hasOwnProperty(property)) { + + if(property === "position"){ + segment.points[property].push(pos); + }else if(property === "indices"){ + // skip indices + }else{ + var values = geometry.attributes[property]; + if(values.itemSize === 1){ + segment.points[property].push(values.array[i + j]); + }else{ + var value = []; + for(var j = 0; j < values.itemSize; j++){ + value.push(values.array[i*values.itemSize + j]); + } + segment.points[property].push(value); + } + } + + } + } + } + } + } + + segment.points.numPoints = segment.points.position.length; + + if(segment.points.numPoints > 0){ + target.boundingBox.expandByPoint(segment.points.boundingBox.min); + target.boundingBox.expandByPoint(segment.points.boundingBox.max); + + target.projectedBoundingBox.expandByPoint(new THREE.Vector2(0, target.boundingBox.min.y)); + target.projectedBoundingBox.expandByPoint(new THREE.Vector2(0, target.boundingBox.max.y)); + } + } + }; + + this.cancel = function(){ + callback.onCancel(); + + this.priorityQueue = new BinaryHeap(function(x){return 1 / x.weight;}); + + var index = pointcloud.profileRequests.indexOf(this); + if(index >= 0){ + pointcloud.profileRequests.splice(index, 1); + } + }; + + this.initialize(); + +}; Potree.PointCloudOctreeNode = function(){ this.children = {}; this.sceneNode = null; + this.octree = null; }; @@ -4105,11 +4595,12 @@ Potree.PointCloudOctree = function(geometry, material){ this.visibleBounds = new THREE.Box3(); this.visibleNodes = []; this.visibleGeometry = []; - this.pickTarget; + this.pickTarget = null; this.generateDEM = false; + this.profileRequests = []; this.root = this.pcoGeometry.root; -} +}; Potree.PointCloudOctree.prototype = Object.create(THREE.Object3D.prototype); @@ -4134,7 +4625,7 @@ Potree.PointCloudOctree.prototype.updateVisibility = function(camera, renderer){ var camObjPos = new THREE.Vector3().setFromMatrixPosition( camMatrixObject ); // traverse nodes with highest weight(depends on node size and distance to camera) first - var priorityQueue = new BinaryHeap(function(x){return 1 / x.weight}); + var priorityQueue = new BinaryHeap(function(x){return 1 / x.weight;}); priorityQueue.push({node: this.root, weight: 1}); var visibleNodes = []; @@ -4162,6 +4653,13 @@ Potree.PointCloudOctree.prototype.updateVisibility = function(camera, renderer){ var visible = insideFrustum; visible = visible && !(this.numVisiblePoints + node.numPoints > this.visiblePointsTarget); + //if(node instanceof Potree.PointCloudOctreeNode && viewer.profileTool.profiles.length > 0){ + // var profile = viewer.profileTool.profiles[0]; + // visible = this.nodeIntersectsProfile(node, profile); + //} + + //visible = "r06642222234".indexOf(node.name) >= 0; + if(!visible){ continue; } @@ -4179,6 +4677,7 @@ Potree.PointCloudOctree.prototype.updateVisibility = function(camera, renderer){ var sceneNode = new THREE.PointCloud(geometry, this.material); sceneNode.visible = false; + pcoNode.octree = this; pcoNode.name = geometryNode.name; pcoNode.level = geometryNode.level; pcoNode.numPoints = geometryNode.numPoints; @@ -4187,7 +4686,11 @@ Potree.PointCloudOctree.prototype.updateVisibility = function(camera, renderer){ pcoNode.boundingSphere = pcoNode.boundingBox.getBoundingSphere(); pcoNode.geometryNode = geometryNode; pcoNode.parent = parent; - pcoNode.children = geometryNode.children; + pcoNode.children = {}; + for(var key in geometryNode.children){ + pcoNode.children[key] = geometryNode.children[key]; + } + sceneNode.boundingBox = pcoNode.boundingBox; sceneNode.boundingSphere = pcoNode.boundingSphere; sceneNode.numPoints = pcoNode.numPoints; @@ -4208,6 +4711,18 @@ Potree.PointCloudOctree.prototype.updateVisibility = function(camera, renderer){ sceneNode.matrixWorld.multiplyMatrices( parent.sceneNode.matrixWorld, sceneNode.matrix ); } + // when a PointCloudOctreeGeometryNode is disposed, + // then replace reference to PointCloudOctreeNode with PointCloudOctreeGeometryNode + // as it was before it was loaded + var disposeListener = function(parent, pcoNode, geometryNode){ + return function(){ + var childIndex = parseInt(pcoNode.name[pcoNode.name.length - 1]); + parent.sceneNode.remove(pcoNode.sceneNode); + parent.children[childIndex] = geometryNode; + } + }(parent, pcoNode, node); + pcoNode.geometryNode.oneTimeDisposeHandlers.push(disposeListener); + node = pcoNode; } @@ -4320,7 +4835,7 @@ Potree.PointCloudOctree.prototype.updateVisibleBounds = function(){ this.visibleBounds.expandByPoint(node.boundingBox.max); } -} +}; Potree.PointCloudOctree.prototype.updateMaterial = function(material, visibleNodes, camera, renderer){ material.fov = camera.fov * (Math.PI / 180); @@ -4339,9 +4854,13 @@ Potree.PointCloudOctree.prototype.updateMaterial = function(material, visibleNod this.updateVisibilityTexture(material, visibleNodes); } } -} +}; Potree.PointCloudOctree.prototype.update = function(camera, renderer){ + + for(var i = 0; i < this.profileRequests.length; i++){ + this.profileRequests[i].update(); + } this.updateVisibility(camera, renderer); @@ -4352,8 +4871,6 @@ Potree.PointCloudOctree.prototype.update = function(camera, renderer){ Potree.PointCloudOctree.lru.freeMemory(); // TODO bounds - // TODO free memory - }; @@ -4387,7 +4904,7 @@ Potree.PointCloudOctree.prototype.updateVisibilityTexture = function(material, v var children = []; for(var j = 0; j < 8; j++){ var child = node.children[j]; - if(child instanceof Potree.PointCloudOctreeNode && child.sceneNode.visible){ + if(child instanceof Potree.PointCloudOctreeNode && child.sceneNode.visible && visibleNodes.indexOf(child) >= 0){ children.push(child); } } @@ -4415,15 +4932,46 @@ Potree.PointCloudOctree.prototype.updateVisibilityTexture = function(material, v texture.needsUpdate = true; -} - - - - - +}; +Potree.PointCloudOctree.prototype.nodeIntersectsProfile = function(node, profile){ + var bbWorld = node.boundingBox.clone().applyMatrix4(this.matrixWorld); + var bsWorld = bbWorld.getBoundingSphere(); + + for(var i = 0; i < profile.points.length - 1; i++){ + var start = new THREE.Vector3(profile.points[i].x, bsWorld.center.y, profile.points[i].z); + var end = new THREE.Vector3(profile.points[i+1].x, bsWorld.center.y, profile.points[i+1].z); + + var ray1 = new THREE.Ray(start, new THREE.Vector3().subVectors(end, start).normalize()); + var ray2 = new THREE.Ray(end, new THREE.Vector3().subVectors(start, end).normalize()); + + if(ray1.isIntersectionSphere(bsWorld) && ray2.isIntersectionSphere(bsWorld)){ + return true; + } + } + + return false; +}; +//Potree.PointCloudOctreeNode.prototype.intersectsProfile = function(profile){ +// var bbWorld = this.boundingBox.clone().applyMatrix4(this.octree.matrixWorld); +// var bsWorld = bbWorld.getBoundingSphere(); +// +// for(var i = 0; i < profile.points.length - 1; i++){ +// var start = new THREE.Vector3(profile.points[i].x, bsWorld.center.y, profile.points[i].z); +// var end = new THREE.Vector3(profile.points[i+1].x, bsWorld.center.y, profile.points[i+1].z); +// +// var ray1 = new THREE.Ray(start, new THREE.Vector3().subVectors(end, start).normalize()); +// var ray2 = new THREE.Ray(end, new THREE.Vector3().subVectors(start, end).normalize()); +// +// if(ray1.isIntersectionSphere(bsWorld) && ray2.isIntersectionSphere(bsWorld)){ +// return true; +// } +// } +// +// return false; +//}; @@ -4506,7 +5054,7 @@ Potree.PointCloudOctree.prototype.hideDescendants = function(object){ } } } -} +}; Potree.PointCloudOctree.prototype.moveToOrigin = function(){ this.position.set(0,0,0); @@ -4515,7 +5063,7 @@ Potree.PointCloudOctree.prototype.moveToOrigin = function(){ var transform = this.matrixWorld; var tBox = Potree.utils.computeTransformedBoundingBox(box, transform); this.position.set(0,0,0).sub(tBox.center()); -} +}; Potree.PointCloudOctree.prototype.moveToGroundPlane = function(){ this.updateMatrixWorld(true); @@ -4523,7 +5071,7 @@ Potree.PointCloudOctree.prototype.moveToGroundPlane = function(){ var transform = this.matrixWorld; var tBox = Potree.utils.computeTransformedBoundingBox(box, transform); this.position.y += -tBox.min.y; -} +}; Potree.PointCloudOctree.prototype.getBoundingBoxWorld = function(){ this.updateMatrixWorld(true); @@ -4532,7 +5080,7 @@ Potree.PointCloudOctree.prototype.getBoundingBoxWorld = function(){ var tBox = Potree.utils.computeTransformedBoundingBox(box, transform); return tBox; -} +}; /** * returns points inside the profile points @@ -4553,7 +5101,15 @@ Potree.PointCloudOctree.prototype.getBoundingBoxWorld = function(){ * * */ -Potree.PointCloudOctree.prototype.getPointsInProfile = function(profile, maxDepth){ +Potree.PointCloudOctree.prototype.getPointsInProfile = function(profile, maxDepth, callback){ + + if(callback){ + var request = new Potree.ProfileRequest(this, profile, maxDepth, callback); + this.profileRequests.push(request); + + return request; + } + var points = { segments: [], boundingBox: new THREE.Box3(), @@ -4645,7 +5201,8 @@ Potree.PointCloudOctree.prototype.getPointsInProfile = function(profile, maxDept */ Potree.PointCloudOctree.prototype.getProfile = function(start, end, width, depth, callback){ if(callback !== undefined){ - this.profileRequests.push(new Potree.ProfileRequest(start, end, width, depth, callback)); + var request = new Potree.ProfileRequest(start, end, width, depth, callback); + this.profileRequests.push(request); }else{ var stack = []; stack.push(this); @@ -4771,14 +5328,14 @@ Potree.PointCloudOctree.prototype.getProfile = function(start, end, width, depth return pos; }; - }(start, end) + }(start, end); inside.project = project; inside.boundingBox = boundingBox; return inside; } -} +}; Potree.PointCloudOctree.prototype.getVisibleExtent = function(){ return this.visibleBounds.applyMatrix4(this.matrixWorld); @@ -4816,7 +5373,7 @@ Potree.PointCloudOctree.prototype.pick = function(renderer, camera, ray, params) var pixelPos = new THREE.Vector3().addVectors(camera.position, ray.direction).project(camera); pixelPos.addScalar(1).multiplyScalar(0.5); pixelPos.x *= width; - pixelPos.y *= height + pixelPos.y *= height; if(!this.pickTarget){ this.pickTarget = new THREE.WebGLRenderTarget( @@ -4849,6 +5406,7 @@ Potree.PointCloudOctree.prototype.pick = function(renderer, camera, ray, params) this.pickMaterial.interpolate = this.material.interpolate; this.pickMaterial.minSize = this.material.minSize; this.pickMaterial.maxSize = this.material.maxSize; + this.pickMaterial.classification = this.material.classification; this.updateMaterial(this.pickMaterial, nodes, camera, renderer); @@ -4863,7 +5421,7 @@ Potree.PointCloudOctree.prototype.pick = function(renderer, camera, ray, params) renderer.setRenderTarget( this.pickTarget ); renderer.state.setDepthTest( material.depthTest ); - renderer.state.setDepthWrite( material.depthWrite ) + renderer.state.setDepthWrite( material.depthWrite ); renderer.state.setBlending( THREE.NoBlending ); renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); @@ -4918,6 +5476,25 @@ Potree.PointCloudOctree.prototype.pick = function(renderer, camera, ray, params) pickWindowSize, pickWindowSize, renderer.context.RGBA, renderer.context.UNSIGNED_BYTE, pixels); + + //{ // show big render target for debugging purposes + // var br = new ArrayBuffer(width*height*4); + // var bp = new Uint8Array(br); + // renderer.context.readPixels( 0, 0, width, height, + // renderer.context.RGBA, renderer.context.UNSIGNED_BYTE, bp); + // + // var img = pixelsArrayToImage(bp, width, height); + // img.style.boder = "2px solid red"; + // img.style.position = "absolute"; + // img.style.top = "0px"; + // img.style.width = width + "px"; + // img.style.height = height + "px"; + // img.onclick = function(){document.body.removeChild(img)}; + // document.body.appendChild(img); + //} + + + // find closest hit inside pixelWindow boundaries var min = Number.MAX_VALUE; var hit = null; @@ -4950,7 +5527,7 @@ Potree.PointCloudOctree.prototype.pick = function(renderer, camera, ray, params) for (var property in attributes) { if (attributes.hasOwnProperty(property)) { - var values = geometry.attributes[property]; + var values = pc.geometry.attributes[property]; if(property === "position"){ var positionArray = pc.geometry.attributes.position.array; @@ -4982,7 +5559,7 @@ Potree.PointCloudOctree.prototype.pick = function(renderer, camera, ray, params) }else{ return null; } -} +}; var demTime = 0; @@ -5163,7 +5740,7 @@ Potree.PointCloudOctree.prototype.createDEM = function(node){ demTime += duration; return result; -} +}; Potree.PointCloudOctree.prototype.getDEMHeight = function(position){ var pos2 = new THREE.Vector2(position.x, position.z); @@ -5261,7 +5838,7 @@ Potree.PointCloudOctree.prototype.getDEMHeight = function(position){ return height; -} +}; Potree.PointCloudOctree.prototype.generateTerain = function(){ var bb = this.boundingBox.clone().applyMatrix4(this.matrixWorld); @@ -5326,7 +5903,7 @@ Potree.PointCloudOctreeGeometry = function(){ this.pointAttributes = null; this.hierarchyStepSize = -1; this.loader = null; -} +}; Potree.PointCloudOctreeGeometryNode = function(name, pcoGeometry, boundingBox){ this.id = Potree.PointCloudOctreeGeometryNode.IDCount++; @@ -5339,7 +5916,9 @@ Potree.PointCloudOctreeGeometryNode = function(name, pcoGeometry, boundingBox){ this.children = {}; this.numPoints = 0; this.level = null; -} + this.loaded = false; + this.oneTimeDisposeHandlers = []; +}; Potree.PointCloudOctreeGeometryNode.IDCount = 0; @@ -5357,7 +5936,7 @@ Potree.PointCloudOctreeGeometryNode.prototype.getURL = function(){ } return url; -} +}; Potree.PointCloudOctreeGeometryNode.prototype.getHierarchyPath = function(){ var path = "r/"; @@ -5373,15 +5952,15 @@ Potree.PointCloudOctreeGeometryNode.prototype.getHierarchyPath = function(){ path = path.slice(0,-1); return path; -} +}; Potree.PointCloudOctreeGeometryNode.prototype.addChild = function(child){ this.children[child.index] = child; child.parent = this; -} +}; Potree.PointCloudOctreeGeometryNode.prototype.load = function(){ - if(this.loading === true || this.pcoGeometry.numNodesLoading > 3){ + if(this.loading === true || this.loaded === true ||this.pcoGeometry.numNodesLoading > 3){ return; } @@ -5405,7 +5984,7 @@ Potree.PointCloudOctreeGeometryNode.prototype.load = function(){ } -} +}; Potree.PointCloudOctreeGeometryNode.prototype.loadPoints = function(){ this.pcoGeometry.loader.load(this); @@ -5515,14 +6094,21 @@ Potree.PointCloudOctreeGeometryNode.prototype.loadHierachyThenPoints = function( Potree.PointCloudOctreeGeometryNode.prototype.dispose = function(){ - if(this.geometry){ + if(this.geometry && this.parent != null){ this.geometry.dispose(); this.geometry = null; this.loaded = false; + + //this.dispatchEvent( { type: 'dispose' } ); + for(var i = 0; i < this.oneTimeDisposeHandlers.length; i++){ + var handler = this.oneTimeDisposeHandlers[i]; + handler(); + } + this.oneTimeDisposeHandlers = []; } -} - +}; +THREE.EventDispatcher.prototype.apply( Potree.PointCloudOctreeGeometryNode.prototype ); Potree.utils = function(){ @@ -5536,7 +6122,7 @@ Potree.utils.pathExists = function(url){ return false; } return true; -} +}; /** * adapted from mhluska at https://github.com/mrdoob/three.js/issues/1561 @@ -5559,7 +6145,7 @@ Potree.utils.computeTransformedBoundingBox = function (box, transform) { boundingBox.setFromPoints( vertices ); return boundingBox; -} +}; /** * add separators to large numbers @@ -5577,7 +6163,7 @@ Potree.utils.addCommas = function(nStr){ x1 = x1.replace(rgx, '$1' + ',' + '$2'); } return x1 + x2; -} +}; /** * create worker from a string @@ -5589,7 +6175,7 @@ Potree.utils.createWorker = function(code){ var worker = new Worker(URL.createObjectURL(blob)); return worker; -} +}; Potree.utils.loadSkybox = function(path){ var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 100000 ); @@ -5624,7 +6210,7 @@ Potree.utils.loadSkybox = function(path){ scene.add(mesh); return {"camera": camera, "scene": scene}; -} +}; Potree.utils.createGrid = function createGrid(width, length, spacing, color){ var material = new THREE.LineBasicMaterial({ @@ -5645,7 +6231,7 @@ Potree.utils.createGrid = function createGrid(width, length, spacing, color){ var line = new THREE.Line(geometry, material, THREE.LinePieces); line.receiveShadow = true; return line; -} +}; Potree.utils.createBackgroundTexture = function(width, height){ @@ -5716,7 +6302,7 @@ function getMousePointCloudIntersection(mouse, camera, renderer, pointclouds){ } return closestPoint ? closestPoint.position : null; -} +}; function pixelsArrayToImage(pixels, width, height){ @@ -5741,7 +6327,7 @@ function pixelsArrayToImage(pixels, width, height){ img.style.transform = "scaleY(-1)"; return img; -} +}; function projectedRadius(radius, fov, distance, screenHeight){ var projFactor = (1 / Math.tan(fov / 2)) / distance; @@ -5751,54 +6337,30 @@ function projectedRadius(radius, fov, distance, screenHeight){ }; -Potree.utils.topView = function(camera, controls, pointcloud){ +Potree.utils.topView = function(camera, node){ camera.position.set(0, 1, 0); camera.rotation.set(-Math.PI / 2, 0, 0); - camera.zoomTo(pointcloud, 1); - - if(controls.target){ - var sg = pointcloud.boundingSphere.clone().applyMatrix4(pointcloud.matrixWorld); - var target = new THREE.Vector3(camera.position.x, sg.center.y, camera.position.z); - controls.target.copy(target); - } -} + camera.zoomTo(node, 1); +}; -Potree.utils.frontView = function(camera, controls, pointcloud){ +Potree.utils.frontView = function(camera, node){ camera.position.set(0, 0, 1); camera.rotation.set(0, 0, 0); - camera.zoomTo(pointcloud, 1); - - if(controls.target){ - var sg = pointcloud.boundingSphere.clone().applyMatrix4(pointcloud.matrixWorld); - var target = new THREE.Vector3(camera.position.x, camera.position.y, sg.center.z); - controls.target.copy(target); - } -} + camera.zoomTo(node, 1); +}; -Potree.utils.leftView = function(camera, controls, pointcloud){ +Potree.utils.leftView = function(camera, node){ camera.position.set(-1, 0, 0); camera.rotation.set(0, -Math.PI / 2, 0); - camera.zoomTo(pointcloud, 1); - - if(controls.target){ - var sg = pointcloud.boundingSphere.clone().applyMatrix4(pointcloud.matrixWorld); - var target = new THREE.Vector3(sg.center.x, camera.position.y, camera.position.z); - controls.target.copy(target); - } -} + camera.zoomTo(node, 1); +}; -Potree.utils.rightView = function(camera, controls, pointcloud){ +Potree.utils.rightView = function(camera, node){ camera.position.set(1, 0, 0); camera.rotation.set(0, Math.PI / 2, 0); - camera.zoomTo(pointcloud, 1); - - if(controls.target){ - var sg = pointcloud.boundingSphere.clone().applyMatrix4(pointcloud.matrixWorld); - var target = new THREE.Vector3(sg.center.x, camera.position.y, camera.position.z); - controls.target.copy(target); - } -} + camera.zoomTo(node, 1); +}; /** * @@ -5849,7 +6411,7 @@ Potree.utils.screenPass = new function(){ }else{ renderer.render(this.screenScene, this.camera, target); } - } + }; }(); @@ -5945,7 +6507,7 @@ Potree.Features = function(){ }, precision: precision - } + }; }(); @@ -5960,8 +6522,11 @@ Potree.TextSprite = function(text){ var texture = new THREE.Texture(); texture.minFilter = THREE.LinearFilter; texture.magFilter = THREE.LinearFilter; - var spriteMaterial = new THREE.SpriteMaterial( - { map: texture, useScreenCoordinates: false} ); + var spriteMaterial = new THREE.SpriteMaterial( { + map: texture, + useScreenCoordinates: false, + depthTest: false, + depthWrite: false} ); this.material = spriteMaterial; this.sprite = new THREE.Sprite(spriteMaterial); @@ -5986,25 +6551,25 @@ Potree.TextSprite.prototype.setText = function(text){ this.text = text; this.update(); -} +}; Potree.TextSprite.prototype.setTextColor = function(color){ this.textColor = color; this.update(); -} +}; Potree.TextSprite.prototype.setBorderColor = function(color){ this.borderColor = color; this.update(); -} +}; Potree.TextSprite.prototype.setBackgroundColor = function(color){ this.backgroundColor = color; this.update(); -} +}; Potree.TextSprite.prototype.update = function(){ @@ -6056,7 +6621,7 @@ Potree.TextSprite.prototype.update = function(){ this.sprite.scale.set(spriteWidth*0.01,spriteHeight*0.01,1.0); //this.material = spriteMaterial; -} +}; Potree.TextSprite.prototype.roundRect = function(ctx, x, y, w, h, r) { ctx.beginPath(); @@ -6072,7 +6637,7 @@ Potree.TextSprite.prototype.roundRect = function(ctx, x, y, w, h, r) { ctx.closePath(); ctx.fill(); ctx.stroke(); -} +}; @@ -6114,7 +6679,7 @@ Potree.Version.prototype.equalOrHigher = function(version){ Potree.Version.prototype.upTo = function(version){ return !this.newerThan(version); -} +}; Potree.Measure = function(){ var scope = this; @@ -6176,7 +6741,7 @@ Potree.Measure = function(){ scope.setPosition(index, I); } - //event.event.stopImmediatePropagation(); + event.event.stopImmediatePropagation(); }; var dropEvent = function(event){ @@ -6248,7 +6813,7 @@ Potree.Measure = function(){ this.remove(this.spheres[index]); - var edgeIndex = (index == 0) ? 0 : (index - 1); + var edgeIndex = (index === 0) ? 0 : (index - 1); this.remove(this.edges[edgeIndex]); this.edges.splice(edgeIndex, 1); @@ -6401,7 +6966,7 @@ Potree.Measure = function(){ I.distance = raycaster.ray.origin.distanceTo(I.point); } intersects.sort( function ( a, b ) { return a.distance - b.distance;} ); - } + }; }; Potree.Measure.prototype = Object.create( THREE.Object3D.prototype ); @@ -6454,7 +7019,7 @@ Potree.MeasuringTool = function(scene, camera, renderer){ var state = STATE.DEFAULT; - this.activeMeasurement; + this.activeMeasurement= null; this.measurements = []; this.sceneMeasurement = new THREE.Scene(); this.sceneRoot = new THREE.Object3D(); @@ -6547,7 +7112,7 @@ Potree.MeasuringTool = function(scene, camera, renderer){ // TODO remove return state; - } + }; function onMouseDown(event){ @@ -6662,7 +7227,7 @@ Potree.MeasuringTool = function(scene, camera, renderer){ } return closestPoint ? closestPoint.position : null; - } + }; this.startInsertion = function(args){ state = STATE.INSERT; @@ -6934,7 +7499,7 @@ Potree.HeightProfile = function(){ this.remove(this.spheres[index]); - var edgeIndex = (index == 0) ? 0 : (index - 1); + var edgeIndex = (index === 0) ? 0 : (index - 1); this.remove(this.edges[edgeIndex]); this.edges.splice(edgeIndex, 1); this.remove(this.boxes[edgeIndex]); @@ -6986,6 +7551,13 @@ Potree.HeightProfile = function(){ this.setWidth = function(width){ this.width = width; + var event = { + type: 'width_changed', + profile: this, + width: width + }; + this.dispatchEvent(event); + this.update(); }; @@ -7092,10 +7664,10 @@ Potree.HeightProfile = function(){ I.distance = raycaster.ray.origin.distanceTo(I.point); } intersects.sort( function ( a, b ) { return a.distance - b.distance;} ); - } + }; -} +}; Potree.HeightProfile.prototype = Object.create( THREE.Object3D.prototype ); @@ -7140,7 +7712,7 @@ Potree.ProfileTool = function(scene, camera, renderer){ var sphereGeometry = new THREE.SphereGeometry(0.4, 10, 10); - this.activeProfile; + this.activeProfile = null; this.profiles = []; this.sceneProfile = new THREE.Scene(); this.sceneRoot = new THREE.Object3D(); @@ -7354,7 +7926,7 @@ Potree.ProfileTool = function(scene, camera, renderer){ } return closestPoint ? closestPoint.position : null; - } + }; this.startInsertion = function(args){ state = STATE.INSERT; @@ -7410,14 +7982,14 @@ Potree.ProfileTool = function(scene, camera, renderer){ } this.dispatchEvent({"type": "profile_removed", profile: profile}); - } + }; this.reset = function(){ for(var i = this.profiles.length - 1; i >= 0; i--){ var profile = this.profiles[i]; this.removeProfile(profile); } - } + }; this.update = function(){ @@ -7505,7 +8077,7 @@ Potree.TransformationTool = function(scene, camera, renderer){ ROTATE_X : {name: "rotate_x", object: undefined, color: new THREE.Color( 0xff0000 ), state: this.STATE.ROTATE_X}, ROTATE_Z : {name: "rotate_z", object: undefined, color: new THREE.Color( 0x0000ff ), state: this.STATE.ROTATE_Z}, ROTATE_Y : {name: "rotate_y", object: undefined, color: new THREE.Color( 0x00ff00 ), state: this.STATE.ROTATE_Y} - } + }; this.buildTranslationNode = function(){ var arrowX = scope.createArrow(scope.parts.ARROW_X, scope.parts.ARROW_X.color); @@ -7533,7 +8105,7 @@ Potree.TransformationTool = function(scene, camera, renderer){ this.scaleNode.add(xHandle); this.scaleNode.add(yHandle); this.scaleNode.add(zHandle); - } + }; this.buildRotationNode = function(){ var xHandle = this.createRotationCircle(scope.parts.ROTATE_X, 0xff0000); @@ -7600,7 +8172,7 @@ Potree.TransformationTool = function(scene, camera, renderer){ sphere.addEventListener("mousedrag", dragEvent); sphere.addEventListener("drop", dropEvent); - } + }; @@ -8129,7 +8701,7 @@ Potree.TransformationTool = function(scene, camera, renderer){ //} - } + }; this.update = function(){ var node = this.sceneRoot; @@ -8172,6 +8744,10 @@ Potree.TransformationTool = function(scene, camera, renderer){ this.rotationNode.visible = true; }; + this.reset = function(){ + this.setTargets([]); + }; + this.buildTranslationNode(); this.buildScaleNode(); this.buildRotationNode(); @@ -8228,7 +8804,12 @@ Potree.Volume = function(args){ boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5)); this.dimension = new THREE.Vector3(1,1,1); - var material = new THREE.MeshBasicMaterial( {color: 0x00ff00, transparent: true, opacity: 0.3} ); + var material = new THREE.MeshBasicMaterial( { + color: 0x00ff00, + transparent: true, + opacity: 0.3, + depthTest: true, + depthWrite: true} ); this.box = new THREE.Mesh( boxGeometry, material); this.box.geometry.computeBoundingBox(); this.boundingBox = this.box.geometry.boundingBox; @@ -8242,6 +8823,8 @@ Potree.Volume = function(args){ this.label.setBorderColor({r:0, g:255, b:0, a:0.0}); this.label.setBackgroundColor({r:0, g:255, b:0, a:0.0}); this.label.material.depthTest = false; + this.label.material.depthWrite = false; + this.label.material.transparent = true; this.label.position.y -= 0.5; this.add(this.label); @@ -8272,6 +8855,7 @@ Potree.Volume = function(args){ this.update = function(){ this.boundingBox = this.box.geometry.boundingBox; + this.boundingSphere = this.boundingBox.getBoundingSphere(); if(this._clip){ this.box.visible = false; @@ -8328,7 +8912,7 @@ Object.defineProperty(Potree.Volume.prototype, "modifiable", { }); -Potree.VolumeTool = function(scene, camera, renderer){ +Potree.VolumeTool = function(scene, camera, renderer, transformationTool){ var scope = this; this.enabled = false; @@ -8337,7 +8921,8 @@ Potree.VolumeTool = function(scene, camera, renderer){ this.sceneVolume = new THREE.Scene(); this.camera = camera; this.renderer = renderer; - this.domElement = renderer.domElement; + this.transformationTool = transformationTool; + this.domElement = this.renderer.domElement; this.mouse = {x: 0, y: 0}; this.volumes = []; @@ -8382,7 +8967,7 @@ Potree.VolumeTool = function(scene, camera, renderer){ var I = getHoveredElement(); if(I && I.object.modifiable){ - transformationTool.setTargets([I.object]); + scope.transformationTool.setTargets([I.object]); } } @@ -8508,7 +9093,7 @@ Potree.VolumeTool = function(scene, camera, renderer){ label.setText(msg); var distance = scope.camera.position.distanceTo(label.getWorldPosition()); - var pr = projectedRadius(1, scope.camera.fov * Math.PI / 180, distance, renderer.domElement.clientHeight); + var pr = projectedRadius(1, scope.camera.fov * Math.PI / 180, distance, scope.renderer.domElement.clientHeight); var scale = (70 / pr); label.scale.set(scale, scale, scale); } @@ -8525,10 +9110,10 @@ Potree.VolumeTool = function(scene, camera, renderer){ this.activeVolume.clip = clip; this.sceneVolume.add(this.activeVolume); this.volumes.push(this.activeVolume); - } + }; this.finishInsertion = function(){ - transformationTool.setTargets([this.activeVolume]); + scope.transformationTool.setTargets([this.activeVolume]); var event = { type: "insertion_finished", @@ -8538,7 +9123,7 @@ Potree.VolumeTool = function(scene, camera, renderer){ this.activeVolume = null; state = STATE.DEFAULT; - } + }; this.addVolume = function(volume){ this.sceneVolume.add(volume); @@ -8558,12 +9143,12 @@ Potree.VolumeTool = function(scene, camera, renderer){ var volume = this.volumes[i]; this.removeVolume(volume); } - } + }; - this.render = function(){ - - renderer.render(this.sceneVolume, this.camera); + this.render = function(target){ + + scope.renderer.render(this.sceneVolume, this.camera, target); }; @@ -8585,7 +9170,7 @@ Potree.PointCloudArena4DProxyNode = function(geometryNode){ this.number = geometryNode.name; this.numPoints = geometryNode.numPoints; this.level = geometryNode.level; -} +}; Potree.PointCloudArena4DProxyNode.prototype = Object.create(THREE.Object3D.prototype); @@ -8667,7 +9252,7 @@ Potree.PointCloudArena4D.prototype.hideDescendants = function(object){ } } } -} +}; Potree.PointCloudArena4D.prototype.updateMatrixWorld = function( force ){ //node.matrixWorld.multiplyMatrices( node.parent.matrixWorld, node.matrix ); @@ -8954,7 +9539,7 @@ Potree.PointCloudArena4D.prototype.replaceProxy = function(proxy){ return node; } -} +}; Potree.PointCloudArena4D.prototype.updateLoadQueue = function(vn){ if(this.loadQueue.length > 0){ @@ -8966,7 +9551,7 @@ Potree.PointCloudArena4D.prototype.updateLoadQueue = function(vn){ this.loadQueue[i].node.geometryNode.load(); } } -} +}; Potree.PointCloudArena4D.prototype.getVisibleGeometry = function(camera){ var visibleGeometry = []; @@ -9062,7 +9647,7 @@ Potree.PointCloudArena4D.prototype.pick = function(renderer, camera, ray, params var pixelPos = new THREE.Vector3().addVectors(camera.position, ray.direction).project(camera); pixelPos.addScalar(1).multiplyScalar(0.5); pixelPos.x *= width; - pixelPos.y *= height + pixelPos.y *= height; if(!this.pickTarget){ this.pickTarget = new THREE.WebGLRenderTarget( @@ -9119,7 +9704,7 @@ Potree.PointCloudArena4D.prototype.pick = function(renderer, camera, ray, params renderer.setRenderTarget( this.pickTarget ); renderer.state.setDepthTest( material.depthTest ); - renderer.state.setDepthWrite( material.depthWrite ) + renderer.state.setDepthWrite( material.depthWrite ); renderer.state.setBlending( THREE.NoBlending ); renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); @@ -9204,7 +9789,7 @@ Potree.PointCloudArena4D.prototype.pick = function(renderer, camera, ray, params for (var property in attributes) { if (attributes.hasOwnProperty(property)) { - var values = geometry.attributes[property]; + var values = pc.geometry.attributes[property]; if(property === "position"){ var positionArray = pc.geometry.attributes.position.array; @@ -9302,7 +9887,7 @@ Potree.PointCloudArena4D.prototype.updateVisibilityTexture = function(material, texture.needsUpdate = true; -} +}; @@ -9473,7 +10058,7 @@ Potree.PointCloudArena4DGeometry.load = function(url, callback){ var offset = geometry.boundingBox.min.clone().multiplyScalar(-1); - geometry.boundingBox.min.add(offset) + geometry.boundingBox.min.add(offset); geometry.boundingBox.max.add(offset); geometry.offset = offset; @@ -9619,7 +10204,7 @@ Potree.PointCloudArena4DGeometry.prototype.loadHierarchy = function(){ scope.levels = levels; //console.log(this.root); - } + }; xhr.send(null); diff --git a/PotreeConverter/resources/page_template/build/js/potree.min.js b/PotreeConverter/resources/page_template/build/js/potree.min.js deleted file mode 100644 index bc4b6cff..00000000 --- a/PotreeConverter/resources/page_template/build/js/potree.min.js +++ /dev/null @@ -1,6 +0,0 @@ -function Potree(){}function LRUItem(e){this.previous=null,this.next=null,this.node=e}function LRU(){this.first=null,this.last=null,this.items={},this.elements=0,this.numPoints=0}function getMousePointCloudIntersection(e,t,i,o){var n=new THREE.Vector3(e.x,e.y,.5);n.unproject(t);for(var r=n.sub(t.position).normalize(),a=new THREE.Ray(t.position,r),s=null,l=null,d=0;dh)&&(s=u,l=h)}}return s?s.position:null}function pixelsArrayToImage(e,t,i){var o=document.createElement("canvas");o.width=t,o.height=i;var n=o.getContext("2d");e=new e.constructor(e);for(var r=0;r 0",""," uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];"," uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];"," uniform float pointLightDistance[ MAX_POINT_LIGHTS ];"," uniform float pointLightDecay[ MAX_POINT_LIGHTS ];",""," #endif",""," #if MAX_DIR_LIGHTS > 0",""," uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];"," uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",""," #endif","","#endif","","//#if MAX_SPOT_LIGHTS > 0","//","// uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];","// uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];","// uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];","// uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];","// uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];","//","// uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];","//","//#endif","","uniform float fov;","uniform float spacing;","uniform float near;","uniform float far;","uniform float pcIndex;","uniform float screenWidth;","uniform float screenHeight;","","uniform sampler2D depthMap;","","varying vec3 vColor;","varying float vOpacity;","varying float vLinearDepth;","varying float vLogDepth;","varying vec3 vViewPosition;","varying float vRadius;","varying vec3 vWorldPosition;","varying vec3 vNormal;","","float specularStrength = 1.0;","","void main() {",""," vec3 color = vColor;"," float depth = gl_FragCoord.z;",""," #if defined(circle_point_shape) || defined(use_interpolation) || defined (weighted_splats)"," float u = 2.0 * gl_PointCoord.x - 1.0;"," float v = 2.0 * gl_PointCoord.y - 1.0;"," #endif"," "," #if defined(circle_point_shape) || defined (weighted_splats)"," float cc = u*u + v*v;"," if(cc > 1.0){"," discard;"," }"," #endif"," "," #if defined weighted_splats"," vec2 uv = gl_FragCoord.xy / vec2(screenWidth, screenHeight);"," float sDepth = texture2D(depthMap, uv).r;"," if(vLinearDepth > sDepth + vRadius){"," discard;"," }"," #endif"," "," #if defined use_interpolation"," float wi = 0.0 - ( u*u + v*v);"," vec4 pos = vec4(-vViewPosition, 1.0);"," pos.z += wi * vRadius;"," float linearDepth = pos.z;"," pos = projectionMatrix * pos;"," pos = pos / pos.w;"," float expDepth = pos.z;"," depth = (pos.z + 1.0) / 2.0;"," gl_FragDepthEXT = depth;"," "," #if defined(color_type_depth)"," color.r = linearDepth;"," color.g = expDepth;"," #endif"," "," #endif"," "," #if defined color_type_point_index"," gl_FragColor = vec4(color, pcIndex / 255.0);"," #else"," gl_FragColor = vec4(color, vOpacity);"," #endif"," "," #if defined weighted_splats"," float w = pow(1.0 - (u*u + v*v), 2.0);"," gl_FragColor.rgb = gl_FragColor.rgb * w;"," gl_FragColor.a = w;"," #endif"," "," vec3 normal = normalize( vNormal );"," normal.z = abs(normal.z);"," vec3 viewPosition = normalize( vViewPosition );"," "," #if defined(color_type_phong)",""," // code taken from three.js phong light fragment shader"," "," #if MAX_POINT_LIGHTS > 0",""," vec3 pointDiffuse = vec3( 0.0 );"," vec3 pointSpecular = vec3( 0.0 );",""," for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",""," vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );"," vec3 lVector = lPosition.xyz + vViewPosition.xyz;",""," float lDistance = 1.0;"," if ( pointLightDistance[ i ] > 0.0 )"," lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",""," lVector = normalize( lVector );",""," // diffuse",""," float dotProduct = dot( normal, lVector );",""," #ifdef WRAP_AROUND",""," float pointDiffuseWeightFull = max( dotProduct, 0.0 );"," float pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",""," vec3 pointDiffuseWeight = mix( vec3( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );",""," #else",""," float pointDiffuseWeight = max( dotProduct, 0.0 );",""," #endif",""," pointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;",""," // specular",""," vec3 pointHalfVector = normalize( lVector + viewPosition );"," float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );"," float pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );",""," float specularNormalization = ( shininess + 2.0 ) / 8.0;",""," vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, pointHalfVector ), 0.0 ), 5.0 );"," pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;"," pointSpecular = vec3(0.0, 0.0, 0.0);"," }"," "," #endif"," "," #if MAX_DIR_LIGHTS > 0",""," vec3 dirDiffuse = vec3( 0.0 );"," vec3 dirSpecular = vec3( 0.0 );",""," for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {",""," vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );"," vec3 dirVector = normalize( lDirection.xyz );",""," // diffuse",""," float dotProduct = dot( normal, dirVector );",""," #ifdef WRAP_AROUND",""," float dirDiffuseWeightFull = max( dotProduct, 0.0 );"," float dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",""," vec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );",""," #else",""," float dirDiffuseWeight = max( dotProduct, 0.0 );",""," #endif",""," dirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;",""," // specular",""," vec3 dirHalfVector = normalize( dirVector + viewPosition );"," float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );"," float dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );",""," float specularNormalization = ( shininess + 2.0 ) / 8.0;",""," vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( dirVector, dirHalfVector ), 0.0 ), 5.0 );"," dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;"," }",""," #endif"," "," vec3 totalDiffuse = vec3( 0.0 );"," vec3 totalSpecular = vec3( 0.0 );"," "," #if MAX_POINT_LIGHTS > 0",""," totalDiffuse += pointDiffuse;"," totalSpecular += pointSpecular;",""," #endif"," "," #if MAX_DIR_LIGHTS > 0",""," totalDiffuse += dirDiffuse;"," totalSpecular += dirSpecular;",""," #endif"," "," gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;",""," #endif"," "," "," #if defined(use_edl)"," gl_FragColor.a = vLogDepth;"," #endif"," ","}","","",""].join("\n"), -Potree.Shaders["normalize.vs"]=["","varying vec2 vUv;","","void main() {"," vUv = uv;",""," gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);","}"].join("\n"),Potree.Shaders["normalize.fs"]=["","#extension GL_EXT_frag_depth : enable","","uniform sampler2D depthMap;","uniform sampler2D texture;","","varying vec2 vUv;","","void main() {"," float depth = texture2D(depthMap, vUv).g; "," "," if(depth <= 0.0){"," discard;"," }"," "," vec4 color = texture2D(texture, vUv); "," color = color / color.w;"," "," gl_FragColor = vec4(color.xyz, 1.0); "," "," gl_FragDepthEXT = depth;","}"].join("\n"),Potree.Shaders["edl.vs"]=["","","varying vec2 vUv;","","void main() {"," vUv = uv;"," "," vec4 mvPosition = modelViewMatrix * vec4(position,1.0);",""," gl_Position = projectionMatrix * mvPosition;","}"].join("\n"),Potree.Shaders["edl.fs"]=["","// ","// adapted from the EDL shader code from Christian Boucheny in cloud compare:","// https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL","//","","#define NEIGHBOUR_COUNT 8","","uniform mat4 projectionMatrix;","","uniform float screenWidth;","uniform float screenHeight;","uniform float near;","uniform float far;","uniform vec2 neighbours[NEIGHBOUR_COUNT];","uniform vec3 lightDir;","uniform float expScale;","uniform float radius;","","//uniform sampler2D depthMap;","uniform sampler2D colorMap;","","varying vec2 vUv;","","/**"," * transform linear depth to [0,1] interval with 1 beeing closest to the camera."," */","float ztransform(float linearDepth){"," return 1.0 - (linearDepth - near) / (far - near);","}","","float expToLinear(float z){"," z = 2.0 * z - 1.0;"," float linear = (2.0 * near * far) / (far + near - z * (far - near));",""," return linear;","}","","// this actually only returns linear depth values if LOG_BIAS is 1.0","// lower values work out more nicely, though.","#define LOG_BIAS 0.01","float logToLinear(float z){"," return (pow((1.0 + LOG_BIAS * far), z) - 1.0) / LOG_BIAS;","}","","float obscurance(float z, float dist){"," return max(0.0, z) / dist;","}","","float computeObscurance(float linearDepth){"," vec4 P = vec4(0, 0, 1, -ztransform(linearDepth));"," vec2 uvRadius = radius / vec2(screenWidth, screenHeight);"," "," float sum = 0.0;"," "," for(int c = 0; c < NEIGHBOUR_COUNT; c++){"," vec2 N_rel_pos = uvRadius * neighbours[c];"," vec2 N_abs_pos = vUv + N_rel_pos;"," "," float neighbourDepth = logToLinear(texture2D(colorMap, N_abs_pos).a);"," "," if(neighbourDepth != 0.0){"," float Zn = ztransform(neighbourDepth);"," float Znp = dot( vec4( N_rel_pos, Zn, 1.0), P );"," "," sum += obscurance( Znp, 0.05 * linearDepth );"," }"," }"," "," return sum;","}","","void main(){"," float linearDepth = logToLinear(texture2D(colorMap, vUv).a);"," "," float f = computeObscurance(linearDepth);"," f = exp(-expScale * f);"," "," vec4 color = texture2D(colorMap, vUv);"," if(color.a == 0.0 && f >= 1.0){"," discard;"," }"," "," gl_FragColor = vec4(color.rgb * f, 1.0);","}",""].join("\n"),Potree.Shaders["blur.vs"]=["","varying vec2 vUv;","","void main() {"," vUv = uv;",""," gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);","}"].join("\n"),Potree.Shaders["blur.fs"]=["","uniform mat4 projectionMatrix;","","uniform float screenWidth;","uniform float screenHeight;","uniform float near;","uniform float far;","","uniform sampler2D map;","","varying vec2 vUv;","","void main() {",""," float dx = 1.0 / screenWidth;"," float dy = 1.0 / screenHeight;",""," vec3 color = vec3(0.0, 0.0, 0.0);"," color += texture2D(map, vUv + vec2(-dx, -dy)).rgb;"," color += texture2D(map, vUv + vec2( 0, -dy)).rgb;"," color += texture2D(map, vUv + vec2(+dx, -dy)).rgb;"," color += texture2D(map, vUv + vec2(-dx, 0)).rgb;"," color += texture2D(map, vUv + vec2( 0, 0)).rgb;"," color += texture2D(map, vUv + vec2(+dx, 0)).rgb;"," color += texture2D(map, vUv + vec2(-dx, dy)).rgb;"," color += texture2D(map, vUv + vec2( 0, dy)).rgb;"," color += texture2D(map, vUv + vec2(+dx, dy)).rgb;"," "," color = color / 9.0;"," "," gl_FragColor = vec4(color, 1.0);"," "," ","}"].join("\n"),THREE.PerspectiveCamera.prototype.zoomTo=function(e,t){if(e.geometry||e.boundingSphere){e.geometry&&null===e.geometry.boundingSphere&&e.geometry.computeBoundingSphere(),e.updateMatrixWorld();var i=t||1,o=e.boundingSphere||e.geometry.boundingSphere;o=o.clone().applyMatrix4(e.matrixWorld);var n=o.radius,r=this.fov*Math.PI/180;this.aspect<1&&(r*=this.aspect);var a=Math.abs(n/Math.sin(r/2))*i,s=new THREE.Vector3(0,0,-1).applyQuaternion(this.quaternion),l=s.multiplyScalar(-a);this.position.copy(o.center.clone().add(l))}},THREE.Ray.prototype.distanceToPlaneWithNegative=function(e){var t=e.normal.dot(this.direction);if(0==t)return 0==e.distanceToPoint(this.origin)?0:null;var i=-(this.origin.dot(e.normal)+e.constant)/t;return i},Potree.POCLoader=function(){},Potree.POCLoader.load=function(e,t){try{var i=new Potree.PointCloudOctreeGeometry;i.url=e;var o=new XMLHttpRequest;o.open("GET",e,!0),o.onreadystatechange=function(){if(4===o.readyState&&(200===o.status||0===o.status)){var n=JSON.parse(o.responseText),r=new Potree.Version(n.version);0===n.octreeDir.indexOf("http")?i.octreeDir=n.octreeDir:i.octreeDir=e+"/../"+n.octreeDir,i.spacing=n.spacing,i.hierarchyStepSize=n.hierarchyStepSize,i.pointAttributes=n.pointAttributes;var a=new THREE.Vector3(n.boundingBox.lx,n.boundingBox.ly,n.boundingBox.lz),s=new THREE.Vector3(n.boundingBox.ux,n.boundingBox.uy,n.boundingBox.uz),l=new THREE.Box3(a,s),d=l.clone();n.tightBoundingBox&&(d.min.copy(new THREE.Vector3(n.tightBoundingBox.lx,n.tightBoundingBox.ly,n.tightBoundingBox.lz)),d.max.copy(new THREE.Vector3(n.tightBoundingBox.ux,n.tightBoundingBox.uy,n.tightBoundingBox.uz)));var c=new THREE.Vector3(0,0,0);c.set(-a.x,-a.y,-a.z),l.min.add(c),l.max.add(c),d.min.add(c),d.max.add(c),i.boundingBox=l,i.tightBoundingBox=d,i.boundingSphere=l.getBoundingSphere(),i.tightBoundingSphere=d.getBoundingSphere(),i.offset=c,"LAS"===n.pointAttributes?i.loader=new Potree.LasLazLoader(n.version):"LAZ"===n.pointAttributes?i.loader=new Potree.LasLazLoader(n.version):(i.loader=new Potree.BinaryLoader(n.version,l,n.scale),i.pointAttributes=new Potree.PointAttributes(i.pointAttributes));var u={},h="r",p=new Potree.PointCloudOctreeGeometryNode(h,i,l);if(p.level=0,p.hasChildren=!0,r.upTo("1.5")?p.numPoints=n.hierarchy[0][1]:p.numPoints=0,i.root=p,i.root.load(),u[h]=p,r.upTo("1.4"))for(var m=1;m=n?i.pointsCount:i.pointsCount/n,s=function(){var e=t.readData(1e6,0,n);return e.then(function(e){return o.push(new LASDecoder(e.buffer,i.pointsFormatId,i.pointsStructSize,e.count,i.scale,i.offset,i.mins,i.maxs)),r+=e.count,Potree.LasLazLoader.progressCB(r/a),e.hasMoreData?s():(i.totalRead=r,i.versionAsString=t.versionAsString,i.isCompressed=t.isCompressed,[t,i,o])})};return s()}).then(function(e){var t=e[0];return Potree.LasLazLoader.progressCB(1),t.close().then(function(){return t.isOpen=!1,Promise.delay(200).cancellable()}).then(function(){return e.slice(1)})})["catch"](Promise.CancellationError,function(e){if(i.isOpen)return i.close().then(function(){throw i.isOpen=!1,e});throw e})},Potree.LasLazLoader.prototype.handle=function(e,t){},Potree.LasLazBatcher=function(e){this.push=function(t){var i=Potree.workers.lasdecoder.getWorker(),o=new THREE.Vector3(t.mins[0],t.mins[1],t.mins[2]),n=new THREE.Vector3(t.maxs[0],t.maxs[1],t.maxs[2]);o.add(e.pcoGeometry.offset),n.add(e.pcoGeometry.offset),i.onmessage=function(r){for(var a=new THREE.BufferGeometry,s=t.pointsCount,l=r.data.position,d=r.data.color,c=r.data.intensity,u=new Uint8Array(r.data.classification),h=new Float32Array(u.byteLength),p=new Uint8Array(r.data.returnNumber),m=new Uint8Array(r.data.numberOfReturns),f=new Float32Array(p.byteLength),v=new Float32Array(m.byteLength),g=new Uint16Array(r.data.pointSourceID),E=new Float32Array(g.length),y=new ArrayBuffer(4*s),b=new Uint32Array(y),T=new THREE.Box3,P=new Float32Array(l),R=0;s>R;R++)h[R]=u[R],f[R]=p[R],v[R]=m[R],E[R]=g[R],b[R]=R,T.expandByPoint(new THREE.Vector3(P[3*R+0],P[3*R+1],P[3*R+2]));a.addAttribute("position",new THREE.BufferAttribute(new Float32Array(l),3)),a.addAttribute("color",new THREE.BufferAttribute(new Float32Array(d),3)),a.addAttribute("intensity",new THREE.BufferAttribute(new Float32Array(c),1)),a.addAttribute("classification",new THREE.BufferAttribute(new Float32Array(h),1)),a.addAttribute("returnNumber",new THREE.BufferAttribute(new Float32Array(f),1)),a.addAttribute("numberOfReturns",new THREE.BufferAttribute(new Float32Array(v),1)),a.addAttribute("pointSourceID",new THREE.BufferAttribute(new Float32Array(E),1)),a.addAttribute("indices",new THREE.BufferAttribute(y,1)),a.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(3*s),3));var C=new THREE.Box3((new THREE.Vector3).fromArray(r.data.tightBoundingBox.min),(new THREE.Vector3).fromArray(r.data.tightBoundingBox.max));a.boundingBox=new THREE.Box3(o,n),e.tightBoundingBox=C,e.geometry=a,e.loaded=!0,e.loading=!1,e.pcoGeometry.numNodesLoading--,Potree.workers.lasdecoder.returnWorker(i)};var r={buffer:t.arrayb,numPoints:t.pointsCount,pointSize:t.pointSize,pointFormatID:2,scale:t.scale,offset:t.offset,mins:[e.pcoGeometry.boundingBox.min.x,e.pcoGeometry.boundingBox.min.y,e.pcoGeometry.boundingBox.min.z],maxs:[e.pcoGeometry.boundingBox.max.x,e.pcoGeometry.boundingBox.max.y,e.pcoGeometry.boundingBox.max.z],bbOffset:[e.pcoGeometry.offset.x,e.pcoGeometry.offset.y,e.pcoGeometry.offset.z]};i.postMessage(r,[r.buffer])}},Potree.Gradients={RAINBOW:[[0,new THREE.Color(.278,0,.714)],[1/6,new THREE.Color(0,0,1)],[2/6,new THREE.Color(0,1,1)],[.5,new THREE.Color(0,1,0)],[4/6,new THREE.Color(1,1,0)],[5/6,new THREE.Color(1,.64,0)],[1,new THREE.Color(1,0,0)]],GRAYSCALE:[[0,new THREE.Color(0,0,0)],[1,new THREE.Color(1,1,1)]]},Potree.Classification={DEFAULT:{0:new THREE.Color(.5,.5,.5),1:new THREE.Color(.5,.5,.5),2:new THREE.Color(.63,.32,.18),3:new THREE.Color(0,1,0),4:new THREE.Color(0,.8,0),5:new THREE.Color(0,.6,0),6:new THREE.Color(1,.66,0),7:new THREE.Color(1,0,1),8:new THREE.Color(1,0,0),9:new THREE.Color(0,0,1),12:new THREE.Color(1,1,0),DEFAULT:new THREE.Color(.3,.6,.6)}},Potree.PointSizeType={FIXED:0,ATTENUATED:1,ADAPTIVE:2},Potree.PointShape={SQUARE:0,CIRCLE:1},Potree.PointColorType={RGB:0,COLOR:1,DEPTH:2,HEIGHT:3,INTENSITY:4,INTENSITY_GRADIENT:5,TREE_DEPTH:6,POINT_INDEX:7,CLASSIFICATION:8,RETURN_NUMBER:9,SOURCE:10,NORMAL:11,PHONG:12,TREE_DEPTH:13},Potree.ClipMode={DISABLED:0,CLIP_OUTSIDE:1,HIGHLIGHT_INSIDE:2},Potree.TreeType={OCTREE:0,KDTREE:1},Potree.PointCloudMaterial=function(e){THREE.Material.call(this),e=e||{};var t=new THREE.Color(16777215),i=THREE.ImageUtils.generateDataTexture(2048,1,t);i.magFilter=THREE.NearestFilter,this.visibleNodesTexture=i;var o=e.size||1,n=e.minSize||1,r=e.maxSize||50,a=e.treeType||Potree.TreeType.OCTREE,s=1;this._pointSizeType=Potree.PointSizeType.ATTENUATED,this._pointShape=Potree.PointShape.SQUARE,this._interpolate=!1,this._pointColorType=Potree.PointColorType.RGB,this._useClipBox=!1,this.numClipBoxes=0,this._clipMode=Potree.ClipMode.DISABLED,this._weighted=!1,this._depthMap,this._gradient=Potree.Gradients.RAINBOW,this._classification=Potree.Classification.DEFAULT,this.gradientTexture=Potree.PointCloudMaterial.generateGradientTexture(this._gradient),this.classificationTexture=Potree.PointCloudMaterial.generateClassificationTexture(this._classification),this.lights=!0,this._treeType=a,this._useLogarithmicDepthBuffer=!1,this._useEDL=!1;var l={},d={spacing:{type:"f",value:1},fov:{type:"f",value:1},screenWidth:{type:"f",value:1},screenHeight:{type:"f",value:1},near:{type:"f",value:.1},far:{type:"f",value:1},uColor:{type:"c",value:new THREE.Color(16777215)},opacity:{type:"f",value:1},size:{type:"f",value:10},minSize:{type:"f",value:2},maxSize:{type:"f",value:2},octreeSize:{type:"f",value:0},bbSize:{type:"fv",value:[0,0,0]},heightMin:{type:"f",value:0},heightMax:{type:"f",value:1},intensityMin:{type:"f",value:0},intensityMax:{type:"f",value:1},clipBoxCount:{type:"f",value:0},visibleNodes:{type:"t",value:this.visibleNodesTexture},pcIndex:{type:"f",value:0},gradient:{type:"t",value:this.gradientTexture},classificationLUT:{type:"t",value:this.classificationTexture},clipBoxes:{type:"Matrix4fv",value:[]},depthMap:{type:"t",value:null},diffuse:{type:"fv",value:[1,1,1]},ambient:{type:"fv",value:[.1,.1,.1]},ambientLightColor:{type:"fv",value:[1,1,1]},directionalLightColor:{type:"fv",value:null},directionalLightDirection:{type:"fv",value:null},pointLightColor:{type:"fv",value:null},pointLightPosition:{type:"fv",value:null},pointLightDistance:{type:"fv1",value:null},pointLightDecay:{type:"fv1",value:null},spotLightColor:{type:"fv",value:null},spotLightPosition:{type:"fv",value:null},spotLightDistance:{type:"fv1",value:null},spotLightDecay:{type:"fv1",value:null},spotLightDirection:{type:"fv",value:null},spotLightAngleCos:{type:"fv1",value:null},spotLightExponent:{type:"fv1",value:null},hemisphereLightSkyColor:{type:"fv",value:null},hemisphereLightGroundColor:{type:"fv",value:null},hemisphereLightDirection:{type:"fv",value:null}};this.defaultAttributeValues.normal=[0,0,0],this.setValues({uniforms:d,attributes:l,vertexShader:this.getDefines()+Potree.Shaders["pointcloud.vs"],fragmentShader:this.getDefines()+Potree.Shaders["pointcloud.fs"],vertexColors:THREE.VertexColors,size:o,minSize:n,maxSize:r,nodeSize:s,pcIndex:0,alphaTest:.9})},Potree.PointCloudMaterial.prototype=new THREE.ShaderMaterial,Potree.PointCloudMaterial.prototype.updateShaderSource=function(){var e={};this.pointColorType===Potree.PointColorType.INTENSITY||this.pointColorType===Potree.PointColorType.INTENSITY_GRADIENT?e.intensity={type:"f",value:[]}:this.pointColorType===Potree.PointColorType.CLASSIFICATION?e.classification={type:"f",value:[]}:this.pointColorType===Potree.PointColorType.RETURN_NUMBER?(e.returnNumber={type:"f",value:[]},e.numberOfReturns={type:"f",value:[]}):this.pointColorType===Potree.PointColorType.SOURCE?e.pointSourceID={type:"f",value:[]}:(this.pointColorType===Potree.PointColorType.NORMAL||this.pointColorType===Potree.PointColorType.PHONG)&&(e.normal={type:"f",value:[]});var t=this.getDefines()+Potree.Shaders["pointcloud.vs"],i=this.getDefines()+Potree.Shaders["pointcloud.fs"];this.setValues({attributes:e,vertexShader:t,fragmentShader:i}),this.depthMap&&(this.uniforms.depthMap.value=this.depthMap,this.setValues({depthMap:this.depthMap})),1===this.opacity?this.setValues({blending:THREE.NoBlending,transparent:!1,depthTest:!0,depthWrite:!0}):this.setValues({blending:THREE.AdditiveBlending,transparent:!0,depthTest:!1,depthWrite:!0}),this.weighted&&this.setValues({blending:THREE.AdditiveBlending,transparent:!0,depthTest:!0,depthWrite:!1}),this.needsUpdate=!0},Potree.PointCloudMaterial.prototype.getDefines=function(){var e="";return this.pointSizeType===Potree.PointSizeType.FIXED?e+="#define fixed_point_size\n":this.pointSizeType===Potree.PointSizeType.ATTENUATED?e+="#define attenuated_point_size\n":this.pointSizeType===Potree.PointSizeType.ADAPTIVE&&(e+="#define adaptive_point_size\n"),this.pointShape===Potree.PointShape.SQUARE?e+="#define square_point_shape\n":this.pointShape===Potree.PointShape.CIRCLE&&(e+="#define circle_point_shape\n"),this._interpolate&&(e+="#define use_interpolation\n"),this._useLogarithmicDepthBuffer&&(e+="#define use_logarithmic_depth_buffer\n"),this._useEDL&&(e+="#define use_edl\n"),this._pointColorType===Potree.PointColorType.RGB?e+="#define color_type_rgb\n":this._pointColorType===Potree.PointColorType.COLOR?e+="#define color_type_color\n":this._pointColorType===Potree.PointColorType.DEPTH?e+="#define color_type_depth\n":this._pointColorType===Potree.PointColorType.HEIGHT?e+="#define color_type_height\n":this._pointColorType===Potree.PointColorType.INTENSITY?e+="#define color_type_intensity\n":this._pointColorType===Potree.PointColorType.INTENSITY_GRADIENT?e+="#define color_type_intensity_gradient\n":this._pointColorType===Potree.PointColorType.TREE_DEPTH?e+="#define color_type_tree_depth\n":this._pointColorType===Potree.PointColorType.POINT_INDEX?e+="#define color_type_point_index\n":this._pointColorType===Potree.PointColorType.CLASSIFICATION?e+="#define color_type_classification\n":this._pointColorType===Potree.PointColorType.RETURN_NUMBER?e+="#define color_type_return_number\n":this._pointColorType===Potree.PointColorType.SOURCE?e+="#define color_type_source\n":this._pointColorType===Potree.PointColorType.NORMAL?e+="#define color_type_normal\n":this._pointColorType===Potree.PointColorType.PHONG&&(e+="#define color_type_phong\n"),this.clipMode===Potree.ClipMode.DISABLED?e+="#define clip_disabled\n":this.clipMode===Potree.ClipMode.CLIP_OUTSIDE?e+="#define clip_outside\n":this.clipMode===Potree.ClipMode.HIGHLIGHT_INSIDE&&(e+="#define clip_highlight_inside\n"),this._treeType===Potree.TreeType.OCTREE?e+="#define tree_type_octree\n":this._treeType===Potree.TreeType.KDTREE&&(e+="#define tree_type_kdtree\n"),this.weighted&&(e+="#define weighted_splats\n"),this.numClipBoxes>0&&(e+="#define use_clip_box\n"),e},Potree.PointCloudMaterial.prototype.setClipBoxes=function(e){if(e){this.clipBoxes=e;var t=this.numClipBoxes!=e.length&&(0===e.length||0===this.numClipBoxes);this.numClipBoxes=e.length,this.uniforms.clipBoxCount.value=this.numClipBoxes,t&&this.updateShaderSource(),this.uniforms.clipBoxes.value=new Float32Array(16*this.numClipBoxes);for(var i=0;ir;r++)for(var a=0;i>a;a++){var s,l=r+t*a;s=e[r]?e[r]:e.DEFAULT,n[3*l+0]=255*s.r,n[3*l+1]=255*s.g,n[3*l+2]=255*s.b}return o},Potree.EyeDomeLightingMaterial=function(e){THREE.Material.call(this),e=e||{};for(var t=8,i=new Float32Array(2*t),o=0;t>o;o++)i[2*o+0]=Math.cos(2*o*Math.PI/t),i[2*o+1]=Math.sin(2*o*Math.PI/t);var n=new THREE.Vector3(0,0,1).normalize(),r={screenWidth:{type:"f",value:0},screenHeight:{type:"f",value:0},near:{type:"f",value:0},far:{type:"f",value:0},expScale:{type:"f",value:100},radius:{type:"f",value:3},lightDir:{type:"v3",value:n},neighbours:{type:"2fv",value:i},depthMap:{type:"t",value:null},colorMap:{type:"t",value:null}};this.setValues({uniforms:r,vertexShader:Potree.Shaders["edl.vs"],fragmentShader:Potree.Shaders["edl.fs"]})},Potree.EyeDomeLightingMaterial.prototype=new THREE.ShaderMaterial,Potree.BlurMaterial=function(e){THREE.Material.call(this),e=e||{};var t={near:{type:"f",value:0},far:{type:"f",value:0},screenWidth:{type:"f",value:0},screenHeight:{type:"f",value:0},map:{type:"t",value:null}};this.setValues({uniforms:t,vertexShader:Potree.Shaders["blur.vs"],fragmentShader:Potree.Shaders["blur.fs"]})},Potree.BlurMaterial.prototype=new THREE.ShaderMaterial,THREE.FirstPersonControls=function(e,t){function i(e){l.enabled!==!1&&(e.preventDefault(),0===e.button?(P=T.ROTATE,d.set(e.clientX,e.clientY)):2===e.button&&(P=T.PAN,h.set(e.clientX,e.clientY)),l.domElement.addEventListener("mousemove",o,!1),l.domElement.addEventListener("mouseup",n,!1),l.dispatchEvent(C))}function o(e){if(l.enabled!==!1){e.preventDefault();var t=l.domElement===document?l.domElement.body:l.domElement;P===T.ROTATE?(c.set(e.clientX,e.clientY),u.subVectors(c,d),l.rotateLeft(2*Math.PI*u.x/t.clientWidth*l.rotateSpeed),l.rotateUp(2*Math.PI*u.y/t.clientHeight*l.rotateSpeed),d.copy(c)):P===T.PAN&&(p.set(e.clientX,e.clientY),m.subVectors(p,h),m.multiplyScalar(5e-4).multiplyScalar(l.moveSpeed),l.pan(m.x,m.y),h.copy(p))}}function n(){l.enabled!==!1&&(l.domElement.removeEventListener("mousemove",o,!1),l.domElement.removeEventListener("mouseup",n,!1),l.dispatchEvent(x),P=T.NONE)}function r(e){if(l.enabled!==!1&&l.noZoom!==!0){e.preventDefault();var t=e.detail<0||e.wheelDelta>0?1:-1;l.moveSpeed+=.1*l.moveSpeed*t,l.moveSpeed=Math.max(.1,l.moveSpeed),l.dispatchEvent(C),l.dispatchEvent(x)}}function a(e){if(l.enabled!==!1)switch(e.keyCode){case l.keys.UP:l.moveForward=!0;break;case l.keys.BOTTOM:l.moveBackward=!0;break;case l.keys.LEFT:l.moveLeft=!0;break;case l.keys.RIGHT:l.moveRight=!0;break;case l.keys.W:l.moveForward=!0;break;case l.keys.S:l.moveBackward=!0;break;case l.keys.A:l.moveLeft=!0;break;case l.keys.D:l.moveRight=!0}}function s(e){switch(e.keyCode){case l.keys.W:l.moveForward=!1;break;case l.keys.S:l.moveBackward=!1;break;case l.keys.A:l.moveLeft=!1;break;case l.keys.D:l.moveRight=!1;break;case l.keys.UP:l.moveForward=!1;break;case l.keys.BOTTOM:l.moveBackward=!1;break;case l.keys.LEFT:l.moveLeft=!1;break;case l.keys.RIGHT:l.moveRight=!1}}this.object=e,this.domElement=void 0!==t?t:document,this.enabled=!0,this.rotateSpeed=1,this.moveSpeed=10,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40,A:"A".charCodeAt(0),S:"S".charCodeAt(0),D:"D".charCodeAt(0),W:"W".charCodeAt(0)};var l=this,d=new THREE.Vector2,c=new THREE.Vector2,u=new THREE.Vector2,h=new THREE.Vector2,p=new THREE.Vector2,m=new THREE.Vector2,f=new THREE.Vector3,v=(new THREE.Vector3,0),g=0,E=1,y=new THREE.Vector3,b=new THREE.Vector3,T={NONE:-1,ROTATE:0,SPEEDCHANGE:1,PAN:2},P=T.NONE;this.position0=this.object.position.clone();var R={type:"change"},C={type:"start"},x={type:"end"};this.rotateLeft=function(e){g-=e},this.rotateUp=function(e){v-=e},this.panLeft=function(e){var t=this.object.matrix.elements;f.set(t[0],t[1],t[2]),f.multiplyScalar(-e),y.add(f)},this.panUp=function(e){var t=this.object.matrix.elements;f.set(t[4],t[5],t[6]),f.multiplyScalar(e),y.add(f)},this.panForward=function(e){var t=this.object.matrix.elements;f.set(t[8],t[9],t[10]),f.multiplyScalar(e),y.add(f)},this.pan=function(e,t){var i=l.domElement===document?l.domElement.body:l.domElement;if(void 0!==l.object.fov){var o=l.object.position,n=o.clone(),r=n.length();r*=Math.tan(l.object.fov/2*Math.PI/180),l.panLeft(2*e*r/i.clientHeight),l.panUp(2*t*r/i.clientHeight)}else void 0!==l.object.top?(l.panLeft(e*(l.object.right-l.object.left)/i.clientWidth),l.panUp(t*(l.object.top-l.object.bottom)/i.clientHeight)):console.warn("WARNING: FirstPersonControls.js encountered an unknown camera type - pan disabled.")},this.update=function(e){this.object.rotation.order="ZYX";var t=this.object;this.object=new THREE.Object3D,this.object.position.copy(t.position),this.object.rotation.copy(t.rotation),this.object.updateMatrix(),this.object.updateMatrixWorld();var i=this.object.position;if(void 0!==e&&(this.moveRight&&this.panLeft(-e*this.moveSpeed),this.moveLeft&&this.panLeft(e*this.moveSpeed),this.moveForward&&this.panForward(-e*this.moveSpeed),this.moveBackward&&this.panForward(e*this.moveSpeed)),!y.equals(new THREE.Vector3(0,0,0))){var o={type:"move",translation:y.clone()};this.dispatchEvent(o)}if(i.add(y),0!==g||0!==v){var o={type:"rotate",thetaDelta:g,phiDelta:v};this.dispatchEvent(o)}this.object.updateMatrix();var n=(new THREE.Matrix4).makeRotationY(g),r=(new THREE.Matrix4).multiplyMatrices(n,this.object.matrix);this.object.quaternion.setFromRotationMatrix(r),this.object.rotation.x+=v,this.object.updateMatrixWorld();var a={type:"proposeTransform",oldPosition:t.position,newPosition:this.object.position,objections:0,counterProposals:[]};if(this.dispatchEvent(a),a.objections>0&&a.counterProposals.length>0){var s=a.counterProposals;this.object.position.copy(s[0]),a.objections=0,a.counterProposals=[]}a.objections>0||t.position.copy(this.object.position),t.rotation.copy(this.object.rotation),this.object=t,g=0,v=0,E=1,y.set(0,0,0),b.distanceTo(this.object.position)>0&&(this.dispatchEvent(R),b.copy(this.object.position))},this.reset=function(){P=T.NONE,this.object.position.copy(this.position0)},this.domElement.addEventListener("contextmenu",function(e){e.preventDefault()},!1),this.domElement.addEventListener("mousedown",i,!1),this.domElement.addEventListener("mousewheel",r,!1),this.domElement.addEventListener("DOMMouseScroll",r,!1),window.addEventListener("keydown",a,!1),window.addEventListener("keyup",s,!1)},THREE.FirstPersonControls.prototype=Object.create(THREE.EventDispatcher.prototype),Potree.OrbitControls=function(e,t){function i(){return 2*Math.PI/60/60*h.autoRotateSpeed}function o(){return Math.pow(.95,h.zoomSpeed)}function n(e){if(h.enabled!==!1){if(e.preventDefault(),0===e.button){if(h.noRotate===!0)return;A=V.ROTATE,m.set(e.clientX,e.clientY)}else if(1===e.button){if(h.noZoom===!0)return;A=V.DOLLY,P.set(e.clientX,e.clientY)}else if(2===e.button){if(h.noPan===!0)return;A=V.PAN,g.set(e.clientX,e.clientY)}h.domElement.addEventListener("mousemove",r,!1),h.domElement.addEventListener("mouseup",a,!1),h.dispatchEvent(I)}}function r(e){if(h.enabled!==!1){e.preventDefault();var t=h.domElement===document?h.domElement.body:h.domElement;if(A===V.ROTATE){if(h.noRotate===!0)return;f.set(e.clientX,e.clientY),v.subVectors(f,m),h.rotateLeft(2*Math.PI*v.x/t.clientWidth*h.rotateSpeed),h.rotateUp(2*Math.PI*v.y/t.clientHeight*h.rotateSpeed),m.copy(f)}else if(A===V.DOLLY){if(h.noZoom===!0)return;R.set(e.clientX,e.clientY),C.subVectors(R,P),C.y>0?h.dollyIn():h.dollyOut(),P.copy(R)}else if(A===V.PAN){if(h.noPan===!0)return;E.set(e.clientX,e.clientY),y.subVectors(E,g),h.pan(y.x,y.y),g.copy(E)}}}function a(){h.enabled!==!1&&(h.domElement.removeEventListener("mousemove",r,!1),h.domElement.removeEventListener("mouseup",a,!1),h.dispatchEvent(L),A=V.NONE)}function s(e){if(h.enabled!==!1&&h.noZoom!==!0){e.preventDefault();var t=0;void 0!==e.wheelDelta?t=e.wheelDelta:void 0!==e.detail&&(t=-e.detail),t>0?h.dollyOut():h.dollyIn(),h.dispatchEvent(I),h.dispatchEvent(L)}}function l(e){if(h.enabled!==!1&&h.noKeys!==!0&&h.noPan!==!0)switch(e.keyCode){case h.keys.UP:h.pan(0,h.keyPanSpeed);break;case h.keys.BOTTOM:h.pan(0,-h.keyPanSpeed);break;case h.keys.LEFT:h.pan(h.keyPanSpeed,0);break;case h.keys.RIGHT:h.pan(-h.keyPanSpeed,0)}}function d(e){if(h.enabled!==!1){switch(e.touches.length){case 1:if(h.noRotate===!0)return;A=V.TOUCH_ROTATE,m.set(e.touches[0].pageX,e.touches[0].pageY);break;case 2:if(h.noZoom===!0)return;A=V.TOUCH_DOLLY;var t=e.touches[0].pageX-e.touches[1].pageX,i=e.touches[0].pageY-e.touches[1].pageY,o=Math.sqrt(t*t+i*i);P.set(0,o);break;case 3:if(h.noPan===!0)return;A=V.TOUCH_PAN,g.set(e.touches[0].pageX,e.touches[0].pageY);break;default:A=V.NONE}h.dispatchEvent(I)}}function c(e){if(h.enabled!==!1){e.preventDefault(),e.stopPropagation();var t=h.domElement===document?h.domElement.body:h.domElement;switch(e.touches.length){case 1:if(h.noRotate===!0)return;if(A!==V.TOUCH_ROTATE)return;f.set(e.touches[0].pageX,e.touches[0].pageY),v.subVectors(f,m),h.rotateLeft(2*Math.PI*v.x/t.clientWidth*h.rotateSpeed),h.rotateUp(2*Math.PI*v.y/t.clientHeight*h.rotateSpeed),m.copy(f);break;case 2:if(h.noZoom===!0)return;if(A!==V.TOUCH_DOLLY)return;var i=e.touches[0].pageX-e.touches[1].pageX,o=e.touches[0].pageY-e.touches[1].pageY,n=Math.sqrt(i*i+o*o);R.set(0,n),C.subVectors(R,P);var r=t.clientWidth,a=t.clientHeight,s=Math.sqrt(r*r+a*a),l=C.y/s;C.y>0?h.dollyOut(1-l):h.dollyIn(1+l),P.copy(R);break;case 3:if(h.noPan===!0)return;if(A!==V.TOUCH_PAN)return;E.set(e.touches[0].pageX,e.touches[0].pageY),y.subVectors(E,g),h.pan(y.x,y.y),g.copy(E);break;default:A=V.NONE}}}function u(){h.enabled!==!1&&(h.dispatchEvent(L),A=V.NONE)}this.object=e,this.domElement=void 0!==t?t:document,this.enabled=!0,this.target=new THREE.Vector3,this.center=this.target,this.noZoom=!1,this.zoomSpeed=1,this.minDistance=0,this.maxDistance=1/0,this.noRotate=!1,this.rotateSpeed=1,this.noPan=!1,this.keyPanSpeed=7,this.autoRotate=!1,this.autoRotateSpeed=2,this.fadeFactor=10,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.noKeys=!1,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40};var h=this,p=1e-6,m=new THREE.Vector2,f=new THREE.Vector2,v=new THREE.Vector2,g=new THREE.Vector2,E=new THREE.Vector2,y=new THREE.Vector2,b=new THREE.Vector3,T=new THREE.Vector3,P=new THREE.Vector2,R=new THREE.Vector2,C=new THREE.Vector2,x=0,w=0,H=1,S=new THREE.Vector3,B=new THREE.Vector3,V={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5},A=V.NONE;this.target0=this.target.clone(),this.position0=this.object.position.clone();var M={type:"change"},I={type:"start"},L={type:"end"};this.rotateLeft=function(e){void 0===e&&(e=i()),w-=e},this.rotateUp=function(e){void 0===e&&(e=i()),x-=e},this.panLeft=function(e){var t=this.object.matrix.elements;b.set(t[0],t[1],t[2]),b.multiplyScalar(-e),S.add(b)},this.panUp=function(e){var t=this.object.matrix.elements;b.set(t[4],t[5],t[6]),b.multiplyScalar(e),S.add(b)},this.pan=function(e,t){var i=h.domElement===document?h.domElement.body:h.domElement;if(void 0!==h.object.fov){var o=h.object.position,n=o.clone().sub(h.target),r=n.length();r*=Math.tan(h.object.fov/2*Math.PI/180),h.panLeft(2*e*r/i.clientHeight),h.panUp(2*t*r/i.clientHeight)}else void 0!==h.object.top?(h.panLeft(e*(h.object.right-h.object.left)/i.clientWidth),h.panUp(t*(h.object.top-h.object.bottom)/i.clientHeight)):console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.")},this.dollyIn=function(e){void 0===e&&(e=o()),H/=e},this.dollyOut=function(e){void 0===e&&(e=o()),H*=e},this.update=function(e){var t=this.object.position.clone();T.copy(t).sub(this.target);var o=Math.atan2(T.x,T.z),n=Math.atan2(Math.sqrt(T.x*T.x+T.z*T.z),T.y);this.autoRotate&&this.rotateLeft(i());var r=Math.min(1,this.fadeFactor*e);o+=r*w,n+=r*x,n=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,n)),n=Math.max(p,Math.min(Math.PI-p,n));var a=T.length();a+=(H-1)*a*r,a=Math.max(this.minDistance,Math.min(this.maxDistance,a)),this.target.add(S.clone().multiplyScalar(r)),T.x=a*Math.sin(n)*Math.sin(o),T.y=a*Math.cos(n),T.z=a*Math.sin(n)*Math.cos(o),t.copy(this.target).add(T);var s={type:"proposeTransform",oldPosition:this.object.position,newPosition:t,objections:0,counterProposals:[]};if(this.dispatchEvent(s),s.objections>0&&s.counterProposals.length>0){var l=s.counterProposals;t.copy(l[0]),s.objections=0,s.counterProposals=[]}if(s.objections>0)w=0,x=0,H=1,S.set(0,0,0);else{this.object.position.copy(t),this.object.lookAt(this.target);var d=Math.max(0,1-this.fadeFactor*e);w*=d,x*=d,H=1+(H-1)*d,S.multiplyScalar(d)}B.distanceTo(this.object.position)>0&&(this.dispatchEvent(M),B.copy(this.object.position))},this.reset=function(){A=V.NONE,this.target.copy(this.target0),this.object.position.copy(this.position0),this.update()},this.domElement.addEventListener("contextmenu",function(e){e.preventDefault()},!1),this.domElement.addEventListener("mousedown",n,!1),this.domElement.addEventListener("mousewheel",s,!1),this.domElement.addEventListener("DOMMouseScroll",s,!1),this.domElement.addEventListener("touchstart",d,!1),this.domElement.addEventListener("touchend",u,!1),this.domElement.addEventListener("touchmove",c,!1),window.addEventListener("keydown",l,!1)},Potree.OrbitControls.prototype=Object.create(THREE.EventDispatcher.prototype),THREE.EarthControls=function(e,t,i){function o(e){if(s.enabled!==!1){e.preventDefault();var t=s.domElement.getBoundingClientRect(),i={x:(e.clientX-t.left)/s.domElement.clientWidth*2-1,y:2*-((e.clientY-t.top)/s.domElement.clientHeight)+1},o=getMousePointCloudIntersection(i,s.camera,s.renderer,s.pointclouds);if(o){var a=(new THREE.Plane).setFromNormalAndCoplanarPoint(new THREE.Vector3(0,1,0),o),h=new THREE.Vector3(i.x,i.y,.5);h.unproject(s.camera);var p=h.sub(s.camera.position).normalize(),m=new THREE.Ray(s.camera.position,p);v=m.intersectPlane(a),f=s.camera.clone(),f.rotation.copy(s.camera.rotation),c.set(e.clientX-t.left,e.clientY-t.top),u.set(e.clientX-t.left,e.clientY-t.top),s.scene.add(s.pivotNode),s.pivotNode.position.copy(v),0===e.button?d=l.DRAG:2===e.button&&(d=l.ROTATE),s.domElement.addEventListener("mousemove",n,!1),s.domElement.addEventListener("mouseup",r,!1)}}}function n(e){if(s.enabled!==!1){e.preventDefault();var t=s.domElement.getBoundingClientRect();s.domElement===document?s.domElement.body:s.domElement;m.set(e.clientX-t.left-u.x,e.clientY-t.top-u.y),u.set(e.clientX-t.left,e.clientY-t.top)}}function r(){s.enabled!==!1&&(s.domElement.removeEventListener("mousemove",n,!1),s.domElement.removeEventListener("mouseup",r,!1),d=l.NONE,s.scene.remove(s.pivotNode))}function a(e){if(s.enabled!==!1&&s.noZoom!==!0){e.preventDefault();var t=s.domElement.getBoundingClientRect(),i=e.detail<0||e.wheelDelta>0?1:-1,o={x:(e.clientX-t.left)/s.domElement.clientWidth*2-1,y:2*-((e.clientY-t.top)/s.domElement.clientHeight)+1},n=getMousePointCloudIntersection(o,s.camera,s.renderer,s.pointclouds);if(n){var r=n.distanceTo(s.camera.position),a=(new THREE.Vector3).subVectors(n,s.camera.position).normalize();s.camera.position.add(a.multiplyScalar(.1*r*i))}}}this.camera=e,this.renderer=t,this.pointclouds=[],this.domElement=t.domElement,this.scene=i,this.enabled=!0;var s=this,l={NONE:-1,DRAG:0,ROTATE:1},d=l.NONE,c=new THREE.Vector2,u=new THREE.Vector2,h=new THREE.SphereGeometry(1,32,32),p=new THREE.MeshNormalMaterial({shading:THREE.SmoothShading,transparent:!0,opacity:.5});this.pivotNode=new THREE.Mesh(h,p);var m=new THREE.Vector2,f=null,v=null;this.minAngle=10/180*Math.PI,this.maxAngle=70/180*Math.PI,this.update=function(e){this.camera.position;this.camera.updateMatrixWorld();var t=new THREE.Object3D;if(t.position.copy(this.camera.position),t.rotation.copy(this.camera.rotation),t.updateMatrix(),t.updateMatrixWorld(),v){if(d===l.DRAG){var i=(new THREE.Plane).setFromNormalAndCoplanarPoint(new THREE.Vector3(0,1,0),v),o={x:u.x/this.domElement.clientWidth*2-1,y:2*-(u.y/this.domElement.clientHeight)+1},n=new THREE.Vector3(o.x,o.y,.5);n.unproject(f);var r=n.sub(f.position).normalize(),a=new THREE.Ray(f.position,r),s=a.distanceToPlane(i);if(s>0){var c=(new THREE.Vector3).subVectors(v,r.clone().multiplyScalar(s));t.position.copy(c)}}else if(d===l.ROTATE){var h=m.clone().multiplyScalar(e);h.x*=.3,h.y*=.2;var p=new THREE.Object3D,g=new THREE.Object3D;p.add(g),p.position.copy(v),g.position.copy(this.camera.position).sub(v),g.rotation.copy(this.camera.rotation),p.rotation.y+=-h.x;var r=this.camera.getWorldDirection(),E=new THREE.Vector3(0,1,0),y=(new THREE.Vector3).crossVectors(E,r),b=g.position.clone();b.y=0,b.normalize();var T=b.dot(g.position.clone().normalize()),P=Math.acos(T);g.position.y<0&&(P=-P);var R=0;R=h.y>0?h.y-Math.max(0,this.minAngle-(P-h.y)):h.y+Math.max(0,P-h.y-this.maxAngle),p.rotateOnAxis(y,-R),p.updateMatrixWorld(),t.position.copy(g.getWorldPosition()),t.quaternion.copy(g.getWorldQuaternion())}var C={type:"proposeTransform",oldPosition:this.camera.position,newPosition:t.position,objections:0};this.dispatchEvent(C),C.objections>0||(this.camera.position.copy(t.position),this.camera.rotation.copy(t.rotation));var x=this.pivotNode.getWorldPosition().applyMatrix4(this.camera.matrixWorldInverse),w=Math.abs(x.z/30),H=this.pivotNode.scale.length();this.pivotNode.scale.multiplyScalar(w/H)}m.set(0,0)},this.reset=function(){d=l.NONE,this.camera.position.copy(this.position0)},this.domElement.addEventListener("contextmenu",function(e){e.preventDefault()},!1),this.domElement.addEventListener("mousedown",o,!1),this.domElement.addEventListener("mousewheel",a,!1),this.domElement.addEventListener("DOMMouseScroll",a,!1)},THREE.EarthControls.prototype=Object.create(THREE.EventDispatcher.prototype),LRU.prototype.size=function(){return this.elements},LRU.prototype.contains=function(e){return null==this.items[e.id]},LRU.prototype.touch=function(e){if(e.loaded){var t;null==this.items[e.id]?(t=new LRUItem(e),t.previous=this.last,this.last=t,null!==t.previous&&(t.previous.next=t),this.items[e.id]=t,this.elements++,null===this.first&&(this.first=t),this.numPoints+=e.numPoints):(t=this.items[e.id],null===t.previous?null!==t.next&&(this.first=t.next,this.first.previous=null,t.previous=this.last,t.next=null,this.last=t,t.previous.next=t):null===t.next||(t.previous.next=t.next,t.next.previous=t.previous,t.previous=this.last,t.next=null,this.last=t,t.previous.next=t))}},LRU.prototype.remove=function(e){var t=this.items[e.id];t&&(1===this.elements?(this.first=null,this.last=null):(t.previous||(this.first=t.next,this.first.previous=null),t.next||(this.last=t.previous,this.last.next=null),t.previous&&t.next&&(t.previous.next=t.next,t.next.previous=t.previous)),delete this.items[e.id],this.elements--,this.numPoints-=e.numPoints)},LRU.prototype.getLRUItem=function(){if(null===this.first)return null;var e=this.first;return e.node},LRU.prototype.toString=function(){for(var e="{ ",t=this.first;null!==t;)e+=t.node.id,null!==t.next&&(e+=", "),t=t.next;return e+="}",e+="("+this.size()+")"},LRU.prototype.freeMemory=function(){if(!(this.elements<=1))for(;this.numPoints>Potree.pointLoadLimit;){var e=this.first,t=e.node;this.disposeDescendants(t)}},LRU.prototype.disposeDescendants=function(e){var t=[];for(t.push(e);t.length>0;){var i=t.pop();i.dispose(),this.remove(i);for(var o in i.children)if(i.children.hasOwnProperty(o)){var n=i.children[o];n.loaded&&t.push(i.children[o])}}},Potree.PointCloudOctreeNode=function(){this.children={},this.sceneNode=null},Potree.PointCloudOctree=function(e,t){THREE.Object3D.call(this),Potree.PointCloudOctree.lru=Potree.PointCloudOctree.lru||new LRU,this.pcoGeometry=e,this.boundingBox=this.pcoGeometry.tightBoundingBox,this.boundingSphere=this.boundingBox.getBoundingSphere(),this.material=t||new Potree.PointCloudMaterial,this.visiblePointsTarget=2e6,this.minimumNodePixelSize=150,this.level=0,this.position.sub(e.offset),this.updateMatrix(),this.showBoundingBox=!1,this.boundingBoxNodes=[],this.loadQueue=[],this.visibleBounds=new THREE.Box3,this.visibleNodes=[],this.visibleGeometry=[],this.pickTarget,this.generateDEM=!1,this.root=this.pcoGeometry.root},Potree.PointCloudOctree.prototype=Object.create(THREE.Object3D.prototype),Potree.PointCloudOctree.prototype.updateVisibility=function(e,t){this.numVisibleNodes=0,this.numVisiblePoints=0,e.updateMatrixWorld();var i=new THREE.Frustum,o=e.matrixWorldInverse,n=this.matrixWorld,r=e.projectionMatrix,a=(new THREE.Matrix4).multiply(r).multiply(o).multiply(n);i.setFromMatrix(a);var s=e.matrixWorld,l=(new THREE.Matrix4).getInverse(n),d=(new THREE.Matrix4).multiply(l).multiply(s),c=(new THREE.Vector3).setFromMatrixPosition(d),u=new BinaryHeap(function(e){return 1/e.weight});u.push({node:this.root,weight:1});var h=[],p=[],m=[];this.root instanceof Potree.PointCloudOctreeNode&&this.hideDescendants(this.root.sceneNode);for(var f=0;f0;){var v=u.pop(),g=v.node,E=v.parent,y=g.boundingBox,b=i.intersectsBox(y),T=b;if(T=T&&!(this.numVisiblePoints+g.numPoints>this.visiblePointsTarget)){if(this.numVisibleNodes++,this.numVisiblePoints+=g.numPoints,g instanceof Potree.PointCloudOctreeGeometryNode){var P=g,R=P.geometry;if(("undefined"==typeof E||E instanceof Potree.PointCloudOctreeNode)&&P.loaded){var C=new Potree.PointCloudOctreeNode,x=new THREE.PointCloud(R,this.material);if(x.visible=!1,C.name=P.name,C.level=P.level,C.numPoints=P.numPoints,C.boundingBox=R.boundingBox,C.tightBoundingBox=R.tightBoundingBox,C.boundingSphere=C.boundingBox.getBoundingSphere(),C.geometryNode=P,C.parent=E,C.children=P.children,x.boundingBox=C.boundingBox,x.boundingSphere=C.boundingSphere,x.numPoints=C.numPoints,x.level=C.level,C.sceneNode=x,"undefined"==typeof g.parent)this.root=C,this.add(C.sceneNode),x.matrixWorld.multiplyMatrices(this.matrixWorld,x.matrix);else{var w=parseInt(C.name[C.name.length-1]);E.sceneNode.add(x),E.children[w]=C,x.matrixWorld.multiplyMatrices(E.sceneNode.matrixWorld,x.matrix)}g=C}P.loaded||(m.push(g),p.push(g))}if(g instanceof Potree.PointCloudOctreeNode){if(Potree.PointCloudOctree.lru.touch(g.geometryNode),g.sceneNode.visible=!0,g.sceneNode.material=this.material,h.push(g),p.push(g.geometryNode),g.parent?g.sceneNode.matrixWorld.multiplyMatrices(g.parent.sceneNode.matrixWorld,g.sceneNode.matrix):g.sceneNode.matrixWorld.multiplyMatrices(this.matrixWorld,g.sceneNode.matrix),this.showBoundingBox&&!g.boundingBoxNode){var H=new THREE.BoxHelper(g.sceneNode);this.add(H),this.boundingBoxNodes.push(H),g.boundingBoxNode=H,g.boundingBoxNode.matrixWorld.copy(g.sceneNode.matrixWorld)}else this.showBoundingBox?(g.boundingBoxNode.visible=!0,g.boundingBoxNode.matrixWorld.copy(g.sceneNode.matrixWorld)):!this.showBoundingBox&&g.boundingBoxNode&&(g.boundingBoxNode.visible=!1);this.generateDEM&&g.level<=2&&(g.dem||(g.dem=this.createDEM(g)))}for(var f=0;8>f;f++)if(g.children[f]){var S=g.children[f],B=S.boundingSphere,V=B.center.distanceTo(c),A=B.radius,M=e.fov/2*Math.PI/180,I=1/Math.tan(M)*A/Math.sqrt(V*V-A*A),L=t.domElement.clientHeight*I;if(!(LV-A&&(W=Number.MAX_VALUE),u.push({node:S,parent:g,weight:W})}}}}this.visibleNodes=h,this.visibleGeometry=p;for(var f=0;fi?-1:i>o?1:0};t.sort(n);for(var r=0;rl;l++){var d=a.children[l];d instanceof Potree.PointCloudOctreeNode&&d.sceneNode.visible&&s.push(d)}s.sort(function(e,t){return e.namet.name?1:0}),o[3*r+0]=0,o[3*r+1]=0,o[3*r+2]=0;for(var l=0;l0;){var e=t.shift();e.visible=!1;for(var i=0;i0&&(c=-c),function(e){var t=(new THREE.Matrix4).makeTranslation(-n.x,-s.min.y,-n.z),i=(new THREE.Matrix4).makeRotationY(-c),o=(new THREE.Matrix4).makeTranslation(a.x,0,0),r=e.clone();return r.applyMatrix4(t),r.applyMatrix4(i),r.applyMatrix4(o),r}}(n,r,l.clone(),i.boundingBox.clone());s.project=d,l.x+=new THREE.Vector3(n.x,0,n.z).distanceTo(new THREE.Vector3(r.x,0,r.z)),l.y+=r.y-n.y}return i.projectedBoundingBox.min.x=0,i.projectedBoundingBox.min.y=i.boundingBox.min.y,i.projectedBoundingBox.max.x=l.x,i.projectedBoundingBox.max.y=i.boundingBox.max.y,i},Potree.PointCloudOctree.prototype.getProfile=function(e,t,i,o,n){if(void 0===n){var r=[];r.push(this);for(var a=(new THREE.Vector3).addVectors(t,e).multiplyScalar(.5),s=(new THREE.Vector3).subVectors(t,e).length(),l=(new THREE.Vector3).subVectors(t,e).normalize(),d=new THREE.Vector3(0,1,0),c=(new THREE.Vector3).crossVectors(l,d).normalize(),u=c,h=(new THREE.Plane).setFromNormalAndCoplanarPoint(u,e),p=(new THREE.Plane).setFromNormalAndCoplanarPoint(l,a),m=null,f=new THREE.Box3;r.length>0;){var v=r.shift(),g=0;if(v instanceof THREE.PointCloud){var E=v.geometry,y=E.attributes.position,b=y.array,T=v.numPoints;if(!m){m={};for(var P in E.attributes)E.attributes.hasOwnProperty(P)&&("indices"===P||(m[P]=[]))}for(var R=0;T>R;R++){var C=new THREE.Vector3(b[3*R],b[3*R+1],b[3*R+2]);C.applyMatrix4(this.matrixWorld);var x=Math.abs(h.distanceToPoint(C)),w=Math.abs(p.distanceToPoint(C));if(i/2>x&&s/2>w){f.expandByPoint(C);for(var P in E.attributes)if(E.attributes.hasOwnProperty(P))if("position"===P)m[P].push(C);else if("indices"===P);else{var H=E.attributes[P];if(1===H.itemSize)m[P].push(H.array[R+B]);else{for(var S=[],B=0;B0&&(a=-a),function(e){var t=(new THREE.Matrix4).makeTranslation(-i.x,-i.y,-i.z),o=(new THREE.Matrix4).makeRotationY(-a),n=e.clone();return n.applyMatrix4(t),n.applyMatrix4(o),n}}(e,t);return m.project=M,m.boundingBox=f,m}this.profileRequests.push(new Potree.ProfileRequest(e,t,i,o,n))},Potree.PointCloudOctree.prototype.getVisibleExtent=function(){return this.visibleBounds.applyMatrix4(this.matrixWorld)},Potree.PointCloudOctree.prototype.pick=function(e,t,i,o){var o=o||{},n=o.pickWindowSize||17,r=this.nodesOnRay(this.visibleNodes,i);if(0===r.length)return null;var a=Math.ceil(e.domElement.clientWidth),s=Math.ceil(e.domElement.clientHeight),l=(new THREE.Vector3).addVectors(t.position,i.direction).project(t);l.addScalar(1).multiplyScalar(.5),l.x*=a,l.y*=s,this.pickTarget?(this.pickTarget.width!=a||this.pickTarget.height!=s)&&(this.pickTarget.dispose(),this.pickTarget=new THREE.WebGLRenderTarget(1,1,{minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat})):this.pickTarget=new THREE.WebGLRenderTarget(1,1,{minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat}),this.pickTarget.setSize(a,s),this.pickMaterial||(this.pickMaterial=new Potree.PointCloudMaterial,this.pickMaterial.pointColorType=Potree.PointColorType.POINT_INDEX),this.pickMaterial.pointSizeType=this.material.pointSizeType,this.pickMaterial.size=this.material.size,this.pickMaterial.pointShape=this.material.pointShape,this.pickMaterial.interpolate=this.material.interpolate,this.pickMaterial.minSize=this.material.minSize,this.pickMaterial.maxSize=this.material.maxSize,this.updateMaterial(this.pickMaterial,r,t,e);var d=e.context;d.enable(d.SCISSOR_TEST), -d.scissor(l.x-(n-1)/2,l.y-(n-1)/2,n,n),d.disable(d.SCISSOR_TEST);var c=this.pickMaterial;e.setRenderTarget(this.pickTarget),e.state.setDepthTest(c.depthTest),e.state.setDepthWrite(c.depthWrite),e.state.setBlending(THREE.NoBlending),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),r.length>0&&r.push(r[0]);for(var u=0;uR;R++)for(var C=0;n>C;C++){var x=R+C*n,w=Math.pow(R-(n-1)/2,2)+Math.pow(C-(n-1)/2,2),H=y[4*x+3];y[4*x+3]=0;var S=b[x];(0!==S||0!==H)&&T>w&&(P={pIndex:S,pcIndex:H},T=w)}if(P){var B={},V=r[P.pcIndex].sceneNode,A=V.geometry.attributes;for(var M in A)if(A.hasOwnProperty(M)){var I=p.attributes[M];if("position"===M){var L=V.geometry.attributes.position.array,W=L[3*P.pIndex+0],N=L[3*P.pIndex+1],G=L[3*P.pIndex+2],X=new THREE.Vector3(W,N,G);X.applyMatrix4(this.matrixWorld),B[M]=X}else if("indices"===M);else if(1===I.itemSize)B[M]=I.array[u+O];else{for(var D=[],O=0;Ou;u++){var h=a[3*u+0],p=a[3*u+1],m=a[3*u+2],f=new THREE.Vector3(h,p,m).applyMatrix4(o),v=parseInt(s*(f.x-n.min.x)/r.x),g=parseInt(s*(f.z-n.min.z)/r.z);v=Math.min(v,s-1),g=Math.min(g,s-1);var E=v+g*s;l[E]||(l[E]=[]),l[E].push(f.y)}for(var u=0;u.5&&r.x.5&&r.y0;){var r=n.shift(),a=r.dem,s=(a.demSize,a.boundingBox2D);s.containsPoint(t);if(s.containsPoint(t)){var l=i(a);if(o?null!=l&&l>0&&(o=l):o=l,r.level<=2)for(var d=0;da;a++)for(var s=0;i>s;s++){var l=a/t,d=s/i,c=l*e.size().x+e.min.x,u=d*e.size().z+e.min.z,h=this.getDEMHeight(new THREE.Vector3(c,0,u));h||(h=0),n[r+0]=c,n[r+1]=h,n[r+2]=u,r+=3}o.addAttribute("position",new THREE.BufferAttribute(n,3));var p=new THREE.PointCloudMaterial({size:20,color:65280}),m=new THREE.PointCloud(o,p);scene.add(m)},Object.defineProperty(Potree.PointCloudOctree.prototype,"progress",{get:function(){return this.visibleNodes.length/this.visibleGeometry.length}});var nodesLoadTimes={};Potree.PointCloudOctreeGeometry=function(){Potree.PointCloudOctree.lru=Potree.PointCloudOctree.lru||new LRU,this.url=null,this.octreeDir=null,this.spacing=0,this.boundingBox=null,this.root=null,this.numNodesLoading=0,this.nodes=null,this.pointAttributes=null,this.hierarchyStepSize=-1,this.loader=null},Potree.PointCloudOctreeGeometryNode=function(e,t,i){this.id=Potree.PointCloudOctreeGeometryNode.IDCount++,this.name=e,this.index=parseInt(e.charAt(e.length-1)),this.pcoGeometry=t,this.geometry=null,this.boundingBox=i,this.boundingSphere=i.getBoundingSphere(),this.children={},this.numPoints=0,this.level=null},Potree.PointCloudOctreeGeometryNode.IDCount=0,Potree.PointCloudOctreeGeometryNode.prototype.getURL=function(){var e="",t=this.pcoGeometry.loader.version;return t.equalOrHigher("1.5")?e=this.pcoGeometry.octreeDir+"/"+this.getHierarchyPath()+"/"+this.name:t.equalOrHigher("1.4")?e=this.pcoGeometry.octreeDir+"/"+this.name:t.upTo("1.3")&&(e=this.pcoGeometry.octreeDir+"/"+this.name),e},Potree.PointCloudOctreeGeometryNode.prototype.getHierarchyPath=function(){for(var e="r/",t=this.pcoGeometry.hierarchyStepSize,i=this.name.substr(1),o=Math.floor(i.length/t),n=0;o>n;n++)e+=i.substr(n*t,t)+"/";return e=e.slice(0,-1)},Potree.PointCloudOctreeGeometryNode.prototype.addChild=function(e){this.children[e.index]=e,e.parent=this},Potree.PointCloudOctreeGeometryNode.prototype.load=function(){this.loading===!0||this.pcoGeometry.numNodesLoading>3||(this.loading=!0,this.pcoGeometry.numNodesLoading++,this.pcoGeometry.loader.version.equalOrHigher("1.5")&&this.level%this.pcoGeometry.hierarchyStepSize===0&&this.hasChildren?this.loadHierachyThenPoints():this.loadPoints())},Potree.PointCloudOctreeGeometryNode.prototype.loadPoints=function(){this.pcoGeometry.loader.load(this)},Potree.PointCloudOctreeGeometryNode.prototype.loadHierachyThenPoints=function(){var e=this,t=function(e,t){var i=(t.byteLength/5,new DataView(t)),o=[],n=i.getUint8(0),r=i.getUint32(1,!0);e.numPoints=r,o.push({children:n,numPoints:r,name:e.name});for(var a=[],s=5;o.length>0;){for(var l=o.shift(),d=1,c=0;8>c;c++){if(0!==(l.children&d)){var u=l.name+c,h=i.getUint8(s),p=i.getUint32(s+1,!0);o.push({children:h,numPoints:p,name:u}),a.push({children:h,numPoints:p,name:u}),s+=5}d=2*d}if(s===t.byteLength)break}var m={};m[e.name]=e;for(var f=e.pcoGeometry,c=0;c0,y.addChild(P),m[v]=P}e.loadPoints()};if(e.level%e.pcoGeometry.hierarchyStepSize===0){var i=e.pcoGeometry.octreeDir+"/"+e.getHierarchyPath()+"/"+e.name+".hrc",o=new XMLHttpRequest;o.open("GET",i,!0),o.responseType="arraybuffer",o.overrideMimeType("text/plain; charset=x-user-defined"),o.onreadystatechange=function(){if(4===o.readyState)if(200===o.status||0===o.status){var i=o.response;t(e,i)}else console.log("Failed to load file! HTTP status: "+o.status+", file: "+url)};try{o.send(null)}catch(n){console.log("fehler beim laden der punktwolke: "+n)}}},Potree.PointCloudOctreeGeometryNode.prototype.dispose=function(){this.geometry&&(this.geometry.dispose(),this.geometry=null,this.loaded=!1)},Potree.utils=function(){},Potree.utils.pathExists=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),200!==t.status?!1:!0},Potree.utils.computeTransformedBoundingBox=function(e,t){var i=[new THREE.Vector3(e.min.x,e.min.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.min.x,e.min.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.max.x,e.min.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.min.x,e.max.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.min.x,e.min.y,e.max.z).applyMatrix4(t),new THREE.Vector3(e.min.x,e.max.y,e.max.z).applyMatrix4(t),new THREE.Vector3(e.max.x,e.max.y,e.min.z).applyMatrix4(t),new THREE.Vector3(e.max.x,e.min.y,e.max.z).applyMatrix4(t),new THREE.Vector3(e.max.x,e.max.y,e.max.z).applyMatrix4(t)],o=new THREE.Box3;return o.setFromPoints(i),o},Potree.utils.addCommas=function(e){e+="",x=e.split("."),x1=x[0],x2=x.length>1?"."+x[1]:"";for(var t=/(\d+)(\d{3})/;t.test(x1);)x1=x1.replace(t,"$1,$2");return x1+x2},Potree.utils.createWorker=function(e){var t=new Blob([e],{type:"application/javascript"}),i=new Worker(URL.createObjectURL(t));return i},Potree.utils.loadSkybox=function(e){var t=new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,1,1e5),i=new THREE.Scene,o=".jpg",n=[e+"px"+o,e+"nx"+o,e+"py"+o,e+"ny"+o,e+"pz"+o,e+"nz"+o],r=THREE.ImageUtils.loadTextureCube(n,THREE.CubeRefractionMapping),a={uniforms:{tCube:{type:"t",value:r},tFlip:{type:"f",value:-1}},vertexShader:THREE.ShaderLib.cube.vertexShader,fragmentShader:THREE.ShaderLib.cube.fragmentShader},s=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:a.uniforms,depthWrite:!1,side:THREE.BackSide}),l=new THREE.Mesh(new THREE.BoxGeometry(100,100,100),s);return i.add(l),{camera:t,scene:i}},Potree.utils.createGrid=function(e,t,i,o){for(var n=new THREE.LineBasicMaterial({color:o||8947848}),r=new THREE.Geometry,a=0;t>=a;a++)r.vertices.push(new THREE.Vector3(-(i*e)/2,0,a*i-i*t/2)),r.vertices.push(new THREE.Vector3(+(i*e)/2,0,a*i-i*t/2));for(var a=0;e>=a;a++)r.vertices.push(new THREE.Vector3(a*i-i*e/2,0,-(i*t)/2)),r.vertices.push(new THREE.Vector3(a*i-i*e/2,0,+(i*t)/2));var s=new THREE.Line(r,n,THREE.LinePieces);return s.receiveShadow=!0,s},Potree.utils.createBackgroundTexture=function(e,t){function i(e,t){return 1/(2*Math.PI)*Math.exp(-(e*e+t*t)/2)}var o=THREE.ImageUtils.generateDataTexture(e,t,new THREE.Color);o.magFilter=THREE.NearestFilter;for(var n=o.image.data,r=[1,1.5,1.7],a=i(0,0),s=0;e>s;s++)for(var l=0;t>l;l++){var d=2*(s/e)-1,c=2*(l/t)-1,u=s+e*l,h=i(2*d,2*c)/a,p=(Math.random()+Math.random()+Math.random())/3;p=(.5*h+.5)*p*.03,p=.4*p,n[3*u+0]=255*(h/15+.05+p)*r[0],n[3*u+1]=255*(h/15+.05+p)*r[1],n[3*u+2]=255*(h/15+.05+p)*r[2]}return o},Potree.utils.topView=function(e,t,i){if(e.position.set(0,1,0),e.rotation.set(-Math.PI/2,0,0),e.zoomTo(i,1),t.target){var o=i.boundingSphere.clone().applyMatrix4(i.matrixWorld),n=new THREE.Vector3(e.position.x,o.center.y,e.position.z);t.target.copy(n)}},Potree.utils.frontView=function(e,t,i){if(e.position.set(0,0,1),e.rotation.set(0,0,0),e.zoomTo(i,1),t.target){var o=i.boundingSphere.clone().applyMatrix4(i.matrixWorld),n=new THREE.Vector3(e.position.x,e.position.y,o.center.z);t.target.copy(n)}},Potree.utils.leftView=function(e,t,i){if(e.position.set(-1,0,0),e.rotation.set(0,-Math.PI/2,0),e.zoomTo(i,1),t.target){var o=i.boundingSphere.clone().applyMatrix4(i.matrixWorld),n=new THREE.Vector3(o.center.x,e.position.y,e.position.z);t.target.copy(n)}},Potree.utils.rightView=function(e,t,i){if(e.position.set(1,0,0),e.rotation.set(0,Math.PI/2,0),e.zoomTo(i,1),t.target){var o=i.boundingSphere.clone().applyMatrix4(i.matrixWorld),n=new THREE.Vector3(o.center.x,e.position.y,e.position.z);t.target.copy(n)}},Potree.utils.frustumSphereIntersection=function(e,t){for(var i=e.planes,o=t.center,n=-t.radius,r=Number.MAX_VALUE,a=0;6>a;a++){var s=i[a].distanceToPoint(o);if(n>s)return 0;r=Math.min(r,s)}return r>=t.radius?2:1},Potree.utils.screenPass=new function(){this.screenScene=new THREE.Scene,this.screenQuad=new THREE.Mesh(new THREE.PlaneBufferGeometry(2,2,0)),this.screenQuad.material.depthTest=!0,this.screenQuad.material.depthWrite=!0,this.screenQuad.material.transparent=!0,this.screenScene.add(this.screenQuad),this.camera=new THREE.Camera,this.render=function(e,t,i){this.screenQuad.material=t,void 0===typeof i?e.render(this.screenScene,this.camera):e.render(this.screenScene,this.camera,i)}},Potree.Features=function(){var e=document.createElement("canvas"),t=e.getContext("webgl")||e.getContext("experimental-webgl");if(null===t)return null;var i,o=t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.HIGH_FLOAT),n=t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.MEDIUM_FLOAT),r=(t.getShaderPrecisionFormat(t.VERTEX_SHADER,t.LOW_FLOAT),t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.HIGH_FLOAT)),a=t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.MEDIUM_FLOAT),s=(t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.LOW_FLOAT),o.precision>0&&r.precision>0),l=n.precision>0&&a.precision>0;return i=s?"highp":l?"mediump":"lowp",{SHADER_INTERPOLATION:{isSupported:function(){var e=!0;return e=e&&t.getExtension("EXT_frag_depth"),e=e&&t.getParameter(t.MAX_VARYING_VECTORS)>=8}},SHADER_SPLATS:{isSupported:function(){var e=!0;return e=e&&t.getExtension("EXT_frag_depth"),e=e&&t.getExtension("OES_texture_float"),e=e&&t.getParameter(t.MAX_VARYING_VECTORS)>=8}},SHADER_EDL:{isSupported:function(){var e=!0;return e=e&&t.getExtension("EXT_frag_depth"),e=e&&t.getExtension("OES_texture_float"),e=e&&t.getParameter(t.MAX_VARYING_VECTORS)>=8}},precision:i}}(),Potree.TextSprite=function(e){THREE.Object3D.call(this);var t=new THREE.Texture;t.minFilter=THREE.LinearFilter,t.magFilter=THREE.LinearFilter;var i=new THREE.SpriteMaterial({map:t,useScreenCoordinates:!1});this.material=i,this.sprite=new THREE.Sprite(i),this.add(this.sprite),this.borderThickness=4,this.fontface="Arial",this.fontsize=28,this.borderColor={r:0,g:0,b:0,a:1},this.backgroundColor={r:255,g:255,b:255,a:1},this.textColor={r:255,g:255,b:255,a:1},this.text="",this.setText(e)},Potree.TextSprite.prototype=new THREE.Object3D,Potree.TextSprite.prototype.setText=function(e){this.text=e,this.update()},Potree.TextSprite.prototype.setTextColor=function(e){this.textColor=e,this.update()},Potree.TextSprite.prototype.setBorderColor=function(e){this.borderColor=e,this.update()},Potree.TextSprite.prototype.setBackgroundColor=function(e){this.backgroundColor=e,this.update()},Potree.TextSprite.prototype.update=function(){var e=document.createElement("canvas"),t=e.getContext("2d");t.font="Bold "+this.fontsize+"px "+this.fontface;var i=t.measureText(this.text),o=i.width,n=o+2*this.borderThickness,r=1.4*this.fontsize+2*this.borderThickness,e=document.createElement("canvas"),t=e.getContext("2d");t.canvas.width=n,t.canvas.height=r,t.font="Bold "+this.fontsize+"px "+this.fontface,t.fillStyle="rgba("+this.backgroundColor.r+","+this.backgroundColor.g+","+this.backgroundColor.b+","+this.backgroundColor.a+")",t.strokeStyle="rgba("+this.borderColor.r+","+this.borderColor.g+","+this.borderColor.b+","+this.borderColor.a+")",t.lineWidth=this.borderThickness,this.roundRect(t,this.borderThickness/2,this.borderThickness/2,o+this.borderThickness,1.4*this.fontsize+this.borderThickness,6),t.strokeStyle="rgba(0, 0, 0, 1.0)",t.strokeText(this.text,this.borderThickness,this.fontsize+this.borderThickness),t.fillStyle="rgba("+this.textColor.r+","+this.textColor.g+","+this.textColor.b+","+this.textColor.a+")",t.fillText(this.text,this.borderThickness,this.fontsize+this.borderThickness);var a=new THREE.Texture(e);a.minFilter=THREE.LinearFilter,a.magFilter=THREE.LinearFilter,a.needsUpdate=!0,this.sprite.material.map=a,this.sprite.scale.set(.01*n,.01*r,1)},Potree.TextSprite.prototype.roundRect=function(e,t,i,o,n,r){e.beginPath(),e.moveTo(t+r,i),e.lineTo(t+o-r,i),e.quadraticCurveTo(t+o,i,t+o,i+r),e.lineTo(t+o,i+n-r),e.quadraticCurveTo(t+o,i+n,t+o-r,i+n),e.lineTo(t+r,i+n),e.quadraticCurveTo(t,i+n,t,i+n-r),e.lineTo(t,i+r),e.quadraticCurveTo(t,i,t+r,i),e.closePath(),e.fill(),e.stroke()},Potree.Version=function(e){this.version=e;var t=-1===e.indexOf(".")?e.length:e.indexOf(".");this.versionMajor=parseInt(e.substr(0,t)),this.versionMinor=parseInt(e.substr(t+1)),0===this.versionMinor.length&&(this.versionMinor=0)},Potree.Version.prototype.newerThan=function(e){var t=new Potree.Version(e);return this.versionMajor>t.versionMajor?!0:this.versionMajor===t.versionMajor&&this.versionMinor>t.versionMinor?!0:!1},Potree.Version.prototype.equalOrHigher=function(e){var t=new Potree.Version(e);return this.versionMajor>t.versionMajor?!0:this.versionMajor===t.versionMajor&&this.versionMinor>=t.versionMinor?!0:!1},Potree.Version.prototype.upTo=function(e){return!this.newerThan(e)},Potree.Measure=function(){var e=this;THREE.Object3D.call(this),this.points=[],this._showDistances=!0,this._showArea=!0,this._closed=!0,this.maxMarkers=Number.MAX_SAFE_INTEGER,this.spheres=[],this.edges=[],this.sphereLabels=[],this.edgeLabels=[],this.angleLabels=[],this.areaLabel=new Potree.TextSprite(""),this.areaLabel.setBorderColor({r:0,g:255,b:0,a:0}),this.areaLabel.setBackgroundColor({r:0,g:255,b:0,a:0}),this.areaLabel.setTextColor({r:180,g:220,b:180,a:1}),this.areaLabel.material.depthTest=!1,this.areaLabel.material.opacity=1,this.add(this.areaLabel);var t=new THREE.SphereGeometry(.4,10,10);this.color=new THREE.Color(16711680);var i=function(){var t=new THREE.MeshLambertMaterial({shading:THREE.SmoothShading,color:e.color,ambient:11184810,depthTest:!1,depthWrite:!1});return t},o=function(e){e.target.material.emissive.setHex(8947848)},n=function(e){e.target.material.emissive.setHex(0)},r=function(t){var i=t.tool,o=(i.dragstart,i.mouse,i.getMousePointCloudIntersection());if(o){var n=e.spheres.indexOf(i.dragstart.object);e.setPosition(n,o)}},a=function(e){};this.addMarker=function(e){this.points.push(e);var s=new THREE.Mesh(t,i());s.addEventListener("move",o),s.addEventListener("leave",n),s.addEventListener("drag",r),s.addEventListener("drop",a),this.add(s),this.spheres.push(s);var l=new THREE.Geometry;l.vertices.push(new THREE.Vector3,new THREE.Vector3),l.colors.push(this.color,this.color,this.color);var d=new THREE.LineBasicMaterial({linewidth:1});d.depthTest=!1;var c=new THREE.Line(l,d);c.visible=!0,this.add(c),this.edges.push(c);var u=new Potree.TextSprite(0);u.setBorderColor({r:0,g:255,b:0,a:0}),u.setBackgroundColor({r:0,g:255,b:0,a:0}),u.material.depthTest=!1,u.visible=!1,this.edgeLabels.push(u),this.add(u);var h=new Potree.TextSprite;h.setBorderColor({r:0,g:255,b:0,a:0}),h.setBackgroundColor({r:0,g:255,b:0,a:0}),h.material.depthTest=!1,h.material.opacity=1,h.visible=!1,this.angleLabels.push(h),this.add(h);var p={type:"marker_added",measurement:this};this.dispatchEvent(p),this.setPosition(this.points.length-1,e)},this.removeMarker=function(e){this.points.splice(e,1),this.remove(this.spheres[e]);var t=0==e?0:e-1;this.remove(this.edges[t]),this.edges.splice(t,1),this.remove(this.edgeLabels[t]),this.edgeLabels.splice(t,1),this.spheres.splice(e,1),this.update()},this.setPosition=function(e,t){var i=this.points[e];i.copy(t);var o={type:"marker_moved",measure:this,index:e,position:t.clone()};this.dispatchEvent(o),this.update()},this.getArea=function(){for(var e=0,t=this.points.length-1,i=0;i=n;n++){var t=this.points[n];o.add(t)}o.divideScalar(this.points.length);for(var n=0;i>=n;n++){var r=n,a=n+1>i?0:n+1,s=0===n?i:n-1,t=this.points[r],l=this.points[a],d=this.points[s],c=this.spheres[r];c.position.copy(t),c.material.color=e.color;var u=this.edges[r];u.material.color=this.color,u.geometry.vertices[0].copy(t),u.geometry.vertices[1].copy(l),u.geometry.verticesNeedUpdate=!0,u.geometry.computeBoundingSphere(),u.visible=i>r||this.closed;var h=this.edgeLabels[n],p=(new THREE.Vector3).add(t);p.add(l),p=p.multiplyScalar(.5);var m=t.distanceTo(l);h.position.copy(p),h.setText(m.toFixed(2)),h.visible=this.showDistances&&(i>r||this.closed)&&this.points.length>=2&&m>0;var f=this.angleLabels[n],v=this.getAngleBetweenLines(t,d,l),g=l.clone().sub(d);g.multiplyScalar(.5),g=d.clone().add(g).sub(t).normalize();var E=Math.min(t.distanceTo(d),t.distanceTo(l));E/=9;var y=t.clone().add(g.multiplyScalar(E));f.position.copy(y);var b=Potree.utils.addCommas((v*(180/Math.PI)).toFixed(1))+"°";f.setText(b),f.visible=this.showAngles&&(i>r||this.closed)&&this.points.length>=3&&v>0}this.areaLabel.position.copy(o),this.areaLabel.visible=this.showArea&&this.points.length>=3;var b=Potree.utils.addCommas(this.getArea().toFixed(1))+"²";this.areaLabel.setText(b)}},this.raycast=function(e,t){for(var i=0;ic.activeMeasurement.maxMarkers&&c.finishInsertion()}}}function n(e){var t=c.domElement.getBoundingClientRect();if(c.mouse.x=(e.clientX-t.left)/c.domElement.clientWidth*2-1,c.mouse.y=2*-((e.clientY-t.top)/c.domElement.clientHeight)+1,c.dragstart){var i={type:"drag",event:e,tool:c};c.dragstart.object.dispatchEvent(i)}else if(h==u.INSERT&&c.activeMeasurement){var o=c.getMousePointCloudIntersection();if(o){var n=c.activeMeasurement.points.length-1;c.activeMeasurement.setPosition(n,o)}}else{var o=d();o?(o.object.dispatchEvent({type:"move",target:o.object,event:e}),c.hoveredElement&&c.hoveredElement!==o.object&&c.hoveredElement.dispatchEvent({type:"leave",target:c.hoveredElement,event:e}),c.hoveredElement=o.object):(c.hoveredElement&&c.hoveredElement.dispatchEvent({type:"leave",target:c.hoveredElement,event:e}),c.hoveredElement=null)}}function r(e){h==u.INSERT&&c.finishInsertion()}function a(e){if(1===e.which){h!==u.DEFAULT&&e.stopImmediatePropagation();var t=d();t&&(c.dragstart={object:t.object,sceneClickPos:t.point,sceneStartPos:c.sceneRoot.position.clone(),mousePos:{x:c.mouse.x,y:c.mouse.y}},e.stopImmediatePropagation())}else 3===e.which&&r(e)}function s(e){window.getSelection?window.getSelection().removeAllRanges():document.selection&&document.selection.empty(),c.activeMeasurement&&h===u.INSERT&&(c.activeMeasurement.removeMarker(c.activeMeasurement.points.length-1),c.finishInsertion())}function l(e){c.dragstart&&(c.dragstart.object.dispatchEvent({type:"drop",event:e}),c.dragstart=null)}function d(){var e=new THREE.Vector3(c.mouse.x,c.mouse.y,.5);e.unproject(c.camera);var t=new THREE.Raycaster;t.ray.set(c.camera.position,e.sub(c.camera.position).normalize());for(var i=[],o=0;o0?a[0]:!1}var c=this;this.enabled=!1,this.scene=e,this.camera=t,this.renderer=i,this.domElement=i.domElement,this.mouse={x:0,y:0};var u={DEFAULT:0,INSERT:1},h=u.DEFAULT;this.activeMeasurement,this.measurements=[],this.sceneMeasurement=new THREE.Scene,this.sceneRoot=new THREE.Object3D,this.sceneMeasurement.add(this.sceneRoot),this.light=new THREE.DirectionalLight(16777215,1),this.light.position.set(0,0,10),this.light.lookAt(new THREE.Vector3(0,0,0)),this.sceneMeasurement.add(this.light),this.hoveredElement=null,this.getState=function(){return h},this.getMousePointCloudIntersection=function(){var e=new THREE.Vector3(c.mouse.x,c.mouse.y,.5);e.unproject(c.camera);var t=e.sub(c.camera.position).normalize(),i=new THREE.Ray(c.camera.position,t),o=[];c.scene.traverse(function(e){(e instanceof Potree.PointCloudOctree||e instanceof Potree.PointCloudArena4D)&&o.push(e)});for(var n=null,r=null,a=0;ad)&&(n=l,r=d)}}return n?n.position:null},this.startInsertion=function(e){h=u.INSERT;var e=e||{},t="undefined"!=typeof e.showDistances?e.showDistances:!0,i="undefined"!=typeof e.showArea?e.showArea:!1,o="undefined"!=typeof e.showAngles?e.showAngles:!1,n="undefined"!=typeof e.closed?e.closed:!1,r=e.maxMarkers||Number.MAX_SAFE_INTEGER,a=new Potree.Measure;a.showDistances=t,a.showArea=i,a.showAngles=o,a.closed=n,a.maxMarkers=r,this.addMeasurement(a),a.addMarker(new THREE.Vector3(0,0,0)),this.activeMeasurement=a},this.finishInsertion=function(){this.activeMeasurement.removeMarker(this.activeMeasurement.points.length-1);var e={type:"insertion_finished",measurement:this.activeMeasurement};this.dispatchEvent(e),this.activeMeasurement=null,h=u.DEFAULT},this.addMeasurement=function(e){this.sceneMeasurement.add(e),this.measurements.push(e),this.dispatchEvent({type:"measurement_added",measurement:e}),e.addEventListener("marker_added",function(e){c.dispatchEvent(e)}),e.addEventListener("marker_removed",function(e){c.dispatchEvent(e)}),e.addEventListener("marker_moved",function(e){c.dispatchEvent(e)})},this.removeMeasurement=function(e){this.sceneMeasurement.remove(e);var t=this.measurements.indexOf(e);t>=0&&this.measurements.splice(t,1)},this.reset=function(){for(var e=this.measurements.length-1;e>=0;e--){var t=this.measurements[e];this.removeMeasurement(t)}},this.update=function(){for(var e=[],t=0;t1){var d=new THREE.Geometry;d.vertices.push(new THREE.Vector3,new THREE.Vector3),d.colors.push(i,i,i);var c=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors,linewidth:2,transparent:!0,opacity:.4});c.depthTest=!1;var u=new THREE.Line(d,c);u.visible=!1,this.add(u),this.edges.push(u);var h=new THREE.BoxGeometry(1,1,1),p=new THREE.MeshBasicMaterial({color:16711680,transparent:!0,opacity:.2}),m=new THREE.Mesh(h,p);m.visible=!1,this.add(m),this.boxes.push(m)}var f={type:"marker_added",profile:this};this.dispatchEvent(f),this.setPosition(this.points.length-1,e)},this.removeMarker=function(e){this.points.splice(e,1),this.remove(this.spheres[e]);var t=0==e?0:e-1;this.remove(this.edges[t]),this.edges.splice(t,1),this.remove(this.boxes[t]),this.boxes.splice(t,1),this.spheres.splice(e,1),this.update();var i={type:"marker_removed",profile:this};this.dispatchEvent(i)},this.getArea=function(){for(var e=0,t=this.points.length-1,i=0;i=r;r++){var e=this.points[r],a=this.spheres[r],s=0===r?n:r-1,l=r===n?0:r+1,d=this.points[s],c=this.points[l],u=this.edges[s],h=this.edges[r],p=this.boxes[s];this.boxes[r],e.distanceTo(d),e.distanceTo(c),(new THREE.Vector3).addVectors(d,e).multiplyScalar(.5),(new THREE.Vector3).addVectors(e,c).multiplyScalar(.5);if(a.position.copy(e),this._modifiable?a.visible=!0:a.visible=!1,u&&(u.geometry.vertices[1].copy(e),u.geometry.verticesNeedUpdate=!0,u.geometry.computeBoundingSphere()),h&&(h.geometry.vertices[0].copy(e),h.geometry.verticesNeedUpdate=!0,h.geometry.computeBoundingSphere()),p){var m=d,f=e,v=m.clone().setY(0).distanceTo(f.clone().setY(0));p.scale.set(v,this.height,this.width);var g=(new THREE.Vector3).addVectors(m,f).multiplyScalar(.5),E=(new THREE.Vector3).subVectors(f,m),y=new THREE.Vector3(E.z,0,-E.x);p.position.set(0,0,0),p.lookAt(y),p.position.copy(g)}o.add(e),t.min(e),i.max(e)}o.multiplyScalar(1/this.points.length);for(var r=0;r0?i[0]:!1}var c=this;this.enabled=!1,this.scene=e,this.camera=t,this.renderer=i,this.domElement=i.domElement,this.mouse={x:0,y:0};var u={DEFAULT:0,INSERT:1},h=u.DEFAULT;new THREE.SphereGeometry(.4,10,10);this.activeProfile,this.profiles=[],this.sceneProfile=new THREE.Scene,this.sceneRoot=new THREE.Object3D,this.sceneProfile.add(this.sceneRoot),this.light=new THREE.DirectionalLight(16777215,1),this.light.position.set(0,0,10),this.light.lookAt(new THREE.Vector3(0,0,0)),this.sceneProfile.add(this.light),this.hoveredElement=null,this.getMousePointCloudIntersection=function(){var e=new THREE.Vector3(c.mouse.x,c.mouse.y,.5);e.unproject(c.camera);var t=e.sub(c.camera.position).normalize(),i=new THREE.Ray(c.camera.position,t),o=[];c.scene.traverse(function(e){(e instanceof Potree.PointCloudOctree||e instanceof Potree.PointCloudArena4D)&&o.push(e)});for(var n=null,r=null,a=0;ad)&&(n=l,r=d)}}return n?n.position:null},this.startInsertion=function(e){h=u.INSERT;var e=e||{},t=e.clip||!1,i=e.width||1;return this.activeProfile=new Potree.HeightProfile,this.activeProfile.clip=t,this.activeProfile.setWidth(i),this.addProfile(this.activeProfile),this.activeProfile.addMarker(new THREE.Vector3(0,0,0)),this.activeProfile},this.finishInsertion=function(){this.activeProfile.removeMarker(this.activeProfile.points.length-1);var e={type:"insertion_finished",profile:this.activeProfile};this.dispatchEvent(e),this.activeProfile=null,h=u.DEFAULT},this.addProfile=function(e){this.profiles.push(e),this.sceneProfile.add(e),e.update(),this.dispatchEvent({type:"profile_added",profile:e}),e.addEventListener("marker_added",function(e){c.dispatchEvent(e)}),e.addEventListener("marker_removed",function(e){c.dispatchEvent(e)}),e.addEventListener("marker_moved",function(e){c.dispatchEvent(e)})},this.removeProfile=function(e){this.sceneProfile.remove(e);var t=this.profiles.indexOf(e);t>=0&&this.profiles.splice(t,1),this.dispatchEvent({type:"profile_removed",profile:e})},this.reset=function(){for(var e=this.profiles.length-1;e>=0;e--){var t=this.profiles[e];this.removeProfile(t)}},this.update=function(){for(var e=0;e0?o[0]:!1}}var s=this;this.enabled=!1,this.scene=e,this.camera=t,this.renderer=i,this.domElement=i.domElement,this.mouse={x:0,y:0},this.dragstart=null,this.sceneTransformation=new THREE.Scene,this.sceneRoot=new THREE.Object3D,this.sceneTransformation.add(this.sceneRoot),this.sceneRotation=new THREE.Scene,this.translationNode=new THREE.Object3D,this.rotationNode=new THREE.Object3D,this.scaleNode=new THREE.Object3D,this.sceneRoot.add(this.translationNode),this.sceneRoot.add(this.rotationNode),this.sceneRoot.add(this.scaleNode),this.sceneRoot.visible=!1,this.hoveredElement=null,this.STATE={DEFAULT:0,TRANSLATE_X:1,TRANSLATE_Y:2,TRANSLATE_Z:3,SCALE_X:1,SCALE_Y:2,SCALE_Z:3},this.parts={ARROW_X:{name:"arrow_x",object:void 0,color:new THREE.Color(16711680),state:this.STATE.TRANSLATE_X},ARROW_Z:{name:"arrow_z",object:void 0,color:new THREE.Color(255),state:this.STATE.TRANSLATE_Z},ARROW_Y:{name:"arrow_y",object:void 0,color:new THREE.Color(65280),state:this.STATE.TRANSLATE_Y},SCALE_X:{name:"scale_x",object:void 0,color:new THREE.Color(16711680),state:this.STATE.SCALE_X},SCALE_Z:{name:"scale_z",object:void 0,color:new THREE.Color(255),state:this.STATE.SCALE_Z},SCALE_Y:{name:"scale_y",object:void 0,color:new THREE.Color(65280),state:this.STATE.SCALE_Y},ROTATE_X:{name:"rotate_x",object:void 0,color:new THREE.Color(16711680),state:this.STATE.ROTATE_X},ROTATE_Z:{name:"rotate_z",object:void 0,color:new THREE.Color(255),state:this.STATE.ROTATE_Z},ROTATE_Y:{name:"rotate_y",object:void 0,color:new THREE.Color(65280),state:this.STATE.ROTATE_Y}},this.buildTranslationNode=function(){var e=s.createArrow(s.parts.ARROW_X,s.parts.ARROW_X.color);e.rotation.z=-Math.PI/2;var t=s.createArrow(s.parts.ARROW_Y,s.parts.ARROW_Y.color),i=s.createArrow(s.parts.ARROW_Z,s.parts.ARROW_Z.color);i.rotation.x=-Math.PI/2,this.translationNode.add(e),this.translationNode.add(t),this.translationNode.add(i)},this.buildScaleNode=function(){var e=this.createScaleHandle(s.parts.SCALE_X,16711680);e.rotation.z=-Math.PI/2;var t=this.createScaleHandle(s.parts.SCALE_Y,65280),i=this.createScaleHandle(s.parts.SCALE_Z,255);i.rotation.x=-Math.PI/2,this.scaleNode.add(e),this.scaleNode.add(t),this.scaleNode.add(i)},this.buildRotationNode=function(){var e=this.createRotationCircle(s.parts.ROTATE_X,16711680);e.rotation.y=-Math.PI/2;var t=this.createRotationCircle(s.parts.ROTATE_Y,65280),i=this.createRotationCircle(s.parts.ROTATE_Z,255);t.rotation.x=-Math.PI/2,this.rotationNode.add(e),this.rotationNode.add(t),this.rotationNode.add(i);var o=new THREE.SphereGeometry(2.9,24,24),n=new THREE.Mesh(o,new THREE.MeshBasicMaterial({color:11184810,transparent:!0,opacity:.4}));this.sceneRotation.add(n);var r=function(e){n.material.color.setHex(5592405)},a=function(e){n.material.color.setHex(11184810)},l=function(e){e.event.stopImmediatePropagation();for(var t=new THREE.Vector3(s.dragstart.mousePos.x,s.dragstart.mousePos.y,.1),i=new THREE.Vector3(s.mouse.x,s.mouse.y,.1),o=(new THREE.Vector3).subVectors(i,t),n=t.clone().unproject(s.camera),r=i.clone().unproject(s.camera),a=(new THREE.Vector3).subVectors(r,n),l=a.clone().normalize(),d=(new THREE.Vector3).subVectors(s.camera.position,n).normalize(),c=d.clone().cross(l),u=6*o.length(),h=0;h=n;n++){var r=2*Math.PI*n/o,a=3*Math.cos(r),l=3*Math.sin(r);i.push(new THREE.Vector3(a,l,0))}for(var d=new THREE.Geometry,n=0;nt;t++)n.label.children[t].updateMatrixWorld(!0)},this.setDimension=function(e,t,i){this.dimension.set(e,t,i),this.box.scale.set(e,t,i),this.frame.scale.set(e,t,i)},this.volume=function(){return Math.abs(this.scale.x*this.scale.y*this.scale.z)},this.update=function(){this.boundingBox=this.box.geometry.boundingBox,this._clip?(this.box.visible=!1,this.label.visible=!1):(this.box.visible=!0,this.label.visible=!0)},this.raycast=function(e,t){var i=[];if(this.box.raycast(e,i),i.length>0){var o=i[0];t.push({distance:o.distance,object:this,point:o.point.clone()})}},this.update()},Potree.Volume.prototype=Object.create(THREE.Object3D.prototype),Object.defineProperty(Potree.Volume.prototype,"clip",{get:function(){return this._clip},set:function(e){this._clip=e,this.update()}}),Object.defineProperty(Potree.Volume.prototype,"modifiable",{get:function(){return this._modifiable},set:function(e){this._modifiable=e,this.update()}}),Potree.VolumeTool=function(e,t,i){function o(e){var t=d.domElement.getBoundingClientRect();d.mouse.x=(e.clientX-t.left)/d.domElement.clientWidth*2-1,d.mouse.y=2*-((e.clientY-t.top)/d.domElement.clientHeight)+1}function n(e){}function r(e){if(u!==c.DEFAULT&&e.stopImmediatePropagation(),u===c.INSERT_VOLUME)d.finishInsertion();else if(1===e.which){var t=s();t&&t.object.modifiable&&transformationTool.setTargets([t.object])}3===e.which}function a(e){return e.preventDefault(),!1}function s(){var e=new THREE.Vector3(d.mouse.x,d.mouse.y,.5);e.unproject(d.camera);var t=new THREE.Raycaster;t.ray.set(d.camera.position,e.sub(d.camera.position).normalize());for(var i=[],o=0;o0?r[0]:!1}function l(){var e=new THREE.Vector3(d.mouse.x,d.mouse.y,.5);e.unproject(d.camera);var t=e.sub(d.camera.position).normalize(),i=new THREE.Ray(d.camera.position,t),o=[];d.scene.traverse(function(e){(e instanceof Potree.PointCloudOctree||e instanceof Potree.PointCloudArena4D)&&o.push(e)});for(var n=null,r=null,a=0;ac)&&(n=l,r=c)}}return n?n.position:null}var d=this;this.enabled=!1,this.scene=e,this.sceneVolume=new THREE.Scene,this.camera=t,this.renderer=i,this.domElement=i.domElement,this.mouse={x:0,y:0},this.volumes=[];var c={DEFAULT:0,INSERT_VOLUME:1},u=c.DEFAULT;this.update=function(e){if(u===c.INSERT_VOLUME){var t=l();if(t){this.activeVolume.position.copy(t);var o=this.activeVolume.getWorldPosition().applyMatrix4(this.camera.matrixWorldInverse),n=(new THREE.Vector4(o.x,o.y,o.z).applyMatrix4(this.camera.projectionMatrix),Math.abs(o.z/10));this.activeVolume.scale.set(n,n,n)}}for(var r=[],a=0;a=0&&this.volumes.splice(t,1)},this.reset=function(){for(var e=this.volumes.length-1;e>=0;e--){var t=this.volumes[e];this.removeVolume(t)}},this.render=function(){i.render(this.sceneVolume,this.camera)},this.domElement.addEventListener("click",n,!1),this.domElement.addEventListener("mousedown",r,!1),this.domElement.addEventListener("mousemove",o,!1),this.domElement.addEventListener("contextmenu",a,!1)},Potree.VolumeTool.prototype=Object.create(THREE.EventDispatcher.prototype),Potree.PointCloudArena4DProxyNode=function(e){THREE.Object3D.call(this),this.geometryNode=e,this.pcoGeometry=e,this.boundingBox=e.boundingBox,this.boundingSphere=e.boundingSphere,this.number=e.name,this.numPoints=e.numPoints,this.level=e.level},Potree.PointCloudArena4DProxyNode.prototype=Object.create(THREE.Object3D.prototype),Potree.PointCloudArena4D=function(e){THREE.Object3D.call(this),this.root=null,this.visiblePointsTarget=2e6,this.minimumNodePixelSize=150,this.position.sub(e.offset),this.updateMatrix(),this.numVisibleNodes=0,this.numVisiblePoints=0,this.boundingBoxNodes=[],this.loadQueue=[],this.visibleNodes=[],this.pcoGeometry=e,this.boundingBox=this.pcoGeometry.boundingBox,this.boundingSphere=this.pcoGeometry.boundingSphere,this.material=new Potree.PointCloudMaterial({vertexColors:THREE.VertexColors,size:.05,treeType:Potree.TreeType.KDTREE}),this.material.sizeType=Potree.PointSizeType.ATTENUATED,this.material.size=.05,this.pickTarget,this.pickMaterial,this.updateMatrixWorld()},Potree.PointCloudArena4D.prototype=Object.create(THREE.Object3D.prototype),Potree.PointCloudArena4D.prototype.updateMaterial=function(e,t){this.material.fov=e.fov*(Math.PI/180),this.material.screenWidth=t.domElement.clientWidth,this.material.screenHeight=t.domElement.clientHeight,this.material.spacing=this.pcoGeometry.spacing,this.material.near=e.near,this.material.far=e.far,this.maxLevel>this.material.levels&&(this.material.levels=this.maxLevel+2),this.material.minSize=3;var i=this.boundingBox.size();this.material.bbSize=[i.x,i.y,i.z]},Potree.PointCloudArena4D.prototype.hideDescendants=function(e){for(var t=[],i=0;i0;){var e=t.shift();e.visible=!1,e.boundingBoxNode&&(e.boundingBoxNode.visible=!1);for(var i=0;i0;){var v=f.shift(),g=v.node,E=v.weight;g.matrixWorld.multiplyMatrices(this.matrixWorld,g.matrix);var y=g.boundingBox.clone(),b=a.intersectsBox(y),T=b;if(g.visible=T,T){var P=0;if(8===P&&dbgFullyInside++,g instanceof Potree.PointCloudArena4DProxyNode){var R=g.geometryNode;R.loaded===!0?this.replaceProxy(g):this.loadQueue.push(v)}else if(g instanceof THREE.PointCloud){if(this.numVisiblePoints+g.pcoGeometry.numPoints>pointcloud.visiblePointsTarget)break;if(this.numVisibleNodes++,this.numVisiblePoints+=g.pcoGeometry.numPoints,this.visibleNodes.push({node:g,weight:E}),this.showBoundingBox&&!g.boundingBoxNode){var C=new THREE.BoxHelper(g);this.add(C),this.boundingBoxNodes.push(C),g.boundingBoxNode=C,g.boundingBoxNode.matrixWorld.copy(g.matrixWorld)}else this.showBoundingBox&&g.boundingBoxNode?g.boundingBoxNode.visible=!0:this.showBoundingBox||delete g.boundingBoxNode;for(var n=0;nH&&(V=Number.MAX_VALUE);var A=t.domElement.clientHeight*V;if(!(Af[I].weight){var M=I;break}if(I==f.length-1){M=f.length;break}}f.splice(M,0,{node:x,weight:E})}}}}}}this.updateLoadQueue(),this.maxLevel=0;for(var n=0;n0){this.loadQueue.length>=2&&this.loadQueue.sort(function(e,t){return t.weight-e.weight});for(var t=0;t0&&!(t.length>12);){var d=s.shift(),c=d.boundingBox.clone();c.max.sub(c.min),c.min.sub(c.min);var u=i.intersectsBox(c),h=u;if(h){if(l+d.numPoints>this.visiblePointsTarget)break;l+=d.numPoints,t.push(d),d.loaded&&(d.left&&s.push(d.left),d.right&&s.push(d.right))}}return t},Potree.PointCloudArena4D.prototype.nodesOnRay=function(e,t){for(var i=[],o=t.clone(),n=0;n0&&r.push(r[0]);for(var u=0;uR;R++)for(var C=0;n>C;C++){var x=R+C*n,w=Math.pow(R-(n-1)/2,2)+Math.pow(C-(n-1)/2,2),H=y[4*x+3];y[4*x+3]=0;var S=b[x];(0!==S||0!==H)&&T>w&&(P={pIndex:S,pcIndex:H},T=w)}if(P){var B={},V=r[P.pcIndex],A=V.geometry.attributes;for(var M in A)if(A.hasOwnProperty(M)){var I=p.attributes[M];if("position"===M){var L=V.geometry.attributes.position.array,W=L[3*P.pIndex+0],N=L[3*P.pIndex+1],G=L[3*P.pIndex+2],X=new THREE.Vector3(W,N,G);X.applyMatrix4(this.matrixWorld),B[M]=X}else if("indices"===M);else if(1===I.itemSize)B[M]=I.array[u+O];else{for(var D=[],O=0;On?-1:n>r?1:0};t.sort(n);for(var r=[],a=0;a0&&(l+=1,d=r.indexOf(s.pcoGeometry.left.number)-a),s.pcoGeometry.right&&r.indexOf(s.pcoGeometry.right.number)>0&&(l+=2,d=0===d?r.indexOf(s.pcoGeometry.right.number)-a:d),"X"===s.pcoGeometry.split?c=1:"Y"===s.pcoGeometry.split?c=2:"Z"===s.pcoGeometry.split&&(c=4),o[3*a+0]=l,o[3*a+1]=d,o[3*a+2]=c}i.needsUpdate=!0}},Object.defineProperty(Potree.PointCloudArena4D.prototype,"progress",{get:function(){return this.pcoGeometry.root?Potree.PointCloudArena4DGeometryNode.nodesLoading>0?0:1:0}}),Potree.PointCloudArena4DGeometryNode=function(){this.left=null,this.right=null,this.boundingBox=null,this.number=null,this.pcoGeometry=null,this.loaded=!1,this.numPoints=0,this.level=0},Potree.PointCloudArena4DGeometryNode.nodesLoading=0,Potree.PointCloudArena4DGeometryNode.prototype.load=function(){if(!(this.loaded||this.loading||Potree.PointCloudArena4DGeometryNode.nodesLoading>=5)){Potree.PointCloudArena4DGeometryNode.nodesLoading++;var e=this.pcoGeometry.url+"?node="+this.number,t=new XMLHttpRequest;t.open("GET",e,!0),t.responseType="arraybuffer";var i=this;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status){for(var e=t.response,o=new DataView(e),n=e.byteLength/17,r=new Float32Array(3*n),a=new Float32Array(3*n),s=new Uint32Array(n),l=0;n>l;l++){var d=o.getFloat32(17*l+0,!0)+i.boundingBox.min.x,c=o.getFloat32(17*l+4,!0)+i.boundingBox.min.y,u=o.getFloat32(17*l+8,!0)+i.boundingBox.min.z,h=o.getUint8(17*l+12,!0)/256,p=o.getUint8(17*l+13,!0)/256,m=o.getUint8(17*l+14,!0)/256;r[3*l+0]=d,r[3*l+1]=c,r[3*l+2]=u,a[3*l+0]=h,a[3*l+1]=p,a[3*l+2]=m,s[l]=l}var f=new THREE.BufferGeometry;f.addAttribute("position",new THREE.BufferAttribute(r,3)),f.addAttribute("color",new THREE.BufferAttribute(a,3)),f.addAttribute("indices",new THREE.BufferAttribute(s,1)),f.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(3*n),3)),i.geometry=f,i.loaded=!0,Potree.PointCloudArena4DGeometryNode.nodesLoading--,f.boundingBox=i.boundingBox,f.boundingSphere=i.boundingSphere,i.numPoints=n}},t.send(null)}},Potree.PointCloudArena4DGeometry=function(){this.numPoints=0,this.version=0,this.boundingBox=null,this.numNodes=0,this.name=null,this.provider=null,this.url=null,this.root=null,this.levels=0,this._spacing=null,this.pointAttributes=new Potree.PointAttributes(["POSITION_CARTESIAN","COLOR_PACKED"])},Potree.PointCloudArena4DGeometry.load=function(e,t){var i=new XMLHttpRequest;i.open("GET",e+"?info",!0),i.onreadystatechange=function(){try{if(4===i.readyState&&200===i.status){var o=JSON.parse(i.responseText),n=new Potree.PointCloudArena4DGeometry;n.url=e,n.name=o.Name,n.provider=o.Provider,n.numNodes=o.Nodes,n.numPoints=o.Points,n.version=o.Version,n.boundingBox=new THREE.Box3((new THREE.Vector3).fromArray(o.BoundingBox.slice(0,3)),(new THREE.Vector3).fromArray(o.BoundingBox.slice(3,6))),o.Spacing&&(n.spacing=o.Spacing);var r=n.boundingBox.min.clone().multiplyScalar(-1);n.boundingBox.min.add(r),n.boundingBox.max.add(r),n.offset=r;var a=n.boundingBox.center(),s=n.boundingBox.size().length()/2;n.boundingSphere=new THREE.Sphere(a,s),n.loadHierarchy(),t(n)}else 4===i.readyState&&t(null)}catch(l){t(null)}},i.send(null)},Potree.PointCloudArena4DGeometry.prototype.loadHierarchy=function(){var e=this.url+"?tree",t=new XMLHttpRequest;t.open("GET",e,!0),t.responseType="arraybuffer";var i=this;t.onreadystatechange=function(){if(4===t.readyState&&200===t.status){for(var e=t.response,o=e.byteLength/3,n=new DataView(e),r=[],a=null,s=0,l=((new Date).getTime(),0);o>l;l++){var d=n.getUint8(3*l+0,!0),c=(n.getUint16(3*l+1,!0),(1&d)>0),u=(2&d)>0,h=(4&d)>0,p=(8&d)>0,m=(16&d)>0,f=null;h?f="X":p&&(f="Y"),m&&(f="Z");var v=new Potree.PointCloudArena4DGeometryNode;if(v.hasLeft=c,v.hasRight=u,v.split=f,v.isLeaf=!c&&!u,v.number=l,v.left=null,v.right=null,v.pcoGeometry=i,v.level=r.length,s=Math.max(s,v.level),r.length>0){var g=r[r.length-1];v.boundingBox=g.boundingBox.clone();var E=g.boundingBox.size();if(g.hasLeft&&!g.left){g.left=v,"X"===g.split?v.boundingBox.max.x=v.boundingBox.min.x+E.x/2:"Y"===g.split?v.boundingBox.max.y=v.boundingBox.min.y+E.y/2:"Z"===g.split&&(v.boundingBox.max.z=v.boundingBox.min.z+E.z/2);var y=v.boundingBox.center(),b=v.boundingBox.size().length()/2;v.boundingSphere=new THREE.Sphere(y,b)}else{g.right=v,"X"===g.split?v.boundingBox.min.x=v.boundingBox.min.x+E.x/2:"Y"===g.split?v.boundingBox.min.y=v.boundingBox.min.y+E.y/2:"Z"===g.split&&(v.boundingBox.min.z=v.boundingBox.min.z+E.z/2);var y=v.boundingBox.center(),b=v.boundingBox.size().length()/2;v.boundingSphere=new THREE.Sphere(y,b)}}else{a=v,a.boundingBox=i.boundingBox.clone();var y=a.boundingBox.center(),b=a.boundingBox.size().length()/2;a.boundingSphere=new THREE.Sphere(y,b)}var T=v.boundingBox.size();if(v.spacing=(T.x+T.y+T.z)/3/75,r.push(v),v.isLeaf)for(var P=!1;!P&&r.length>0;){r.pop();var R=r[r.length-1];P=r.length>0&&R.hasRight&&null==R.right}}(new Date).getTime();i.root=a,i.levels=s}},t.send(null)},Object.defineProperty(Potree.PointCloudArena4DGeometry.prototype,"spacing",{get:function(){return this._spacing?this._spacing:this.root?this.root.spacing:void 0},set:function(e){this._spacing=e}}); \ No newline at end of file diff --git a/PotreeConverter/resources/page_template/build/shaders/shaders.js b/PotreeConverter/resources/page_template/build/shaders/shaders.js index 282eef0a..644372d3 100644 --- a/PotreeConverter/resources/page_template/build/shaders/shaders.js +++ b/PotreeConverter/resources/page_template/build/shaders/shaders.js @@ -260,16 +260,9 @@ Potree.Shaders["pointcloud.vs"] = [ " #elif defined color_type_classification", " float c = mod(classification, 16.0);", " vec2 uv = vec2(c / 255.0, 0.5);", - " vColor = texture2D(classificationLUT, uv).rgb;", - " ", - " // TODO only for testing - removing points with class 7", - " if(classification == 7.0){", - " gl_Position = vec4(100.0, 100.0, 100.0, 0.0);", - " }", + " vec4 classColor = texture2D(classificationLUT, uv);", + " vColor = classColor.rgb;", " #elif defined color_type_return_number", - " //float w = (returnNumber - 1.0) / 4.0 + 0.1;", - " //vColor = texture2D(gradient, vec2(w, 1.0 - w)).rgb;", - " ", " if(numberOfReturns == 1.0){", " vColor = vec3(1.0, 1.0, 0.0);", " }else{", @@ -281,7 +274,6 @@ Potree.Shaders["pointcloud.vs"] = [ " vColor = vec3(0.0, 1.0, 0.0);", " }", " }", - " ", " #elif defined color_type_source", " float w = mod(pointSourceID, 10.0) / 10.0;", " vColor = texture2D(gradient, vec2(w,1.0 - w)).rgb;", @@ -291,6 +283,16 @@ Potree.Shaders["pointcloud.vs"] = [ " vColor = color;", " #endif", " ", + " {", + " // TODO might want to combine with the define block above to avoid reading same LUT two times", + " float c = mod(classification, 16.0);", + " vec2 uv = vec2(c / 255.0, 0.5);", + " ", + " if(texture2D(classificationLUT, uv).a == 0.0){", + " gl_Position = vec4(100.0, 100.0, 100.0, 0.0);", + " }", + " }", + " ", " //if(vNormal.z < 0.0){", " // gl_Position = vec4(1000.0, 1000.0, 1000.0, 1.0);", " //}", @@ -694,7 +696,9 @@ Potree.Shaders["edl.fs"] = [ "uniform vec2 neighbours[NEIGHBOUR_COUNT];", "uniform vec3 lightDir;", "uniform float expScale;", + "uniform float edlScale;", "uniform float radius;", + "uniform float opacity;", "", "//uniform sampler2D depthMap;", "uniform sampler2D colorMap;", @@ -753,14 +757,14 @@ Potree.Shaders["edl.fs"] = [ " float linearDepth = logToLinear(texture2D(colorMap, vUv).a);", " ", " float f = computeObscurance(linearDepth);", - " f = exp(-expScale * f);", + " f = exp(-expScale * edlScale * f);", " ", " vec4 color = texture2D(colorMap, vUv);", " if(color.a == 0.0 && f >= 1.0){", " discard;", " }", " ", - " gl_FragColor = vec4(color.rgb * f, 1.0);", + " gl_FragColor = vec4(color.rgb * f, opacity);", "}", "", ].join("\n"); diff --git a/PotreeConverter/resources/page_template/build/workers/BinaryDecoderWorker.js b/PotreeConverter/resources/page_template/build/workers/BinaryDecoderWorker.js deleted file mode 100644 index b976cc0d..00000000 --- a/PotreeConverter/resources/page_template/build/workers/BinaryDecoderWorker.js +++ /dev/null @@ -1 +0,0 @@ -Potree.workers.binaryDecoder = new Potree.WorkerManager(atob("Ci8vIGh0dHA6Ly9qc3BlcmYuY29tL3VpbnQ4YXJyYXktdnMtZGF0YXZpZXczLzMKZnVuY3Rpb24gQ3VzdG9tVmlldyhidWZmZXIpIHsKCXRoaXMuYnVmZmVyID0gYnVmZmVyOwoJdGhpcy51OCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7CgkKCXZhciB0bXAgPSBuZXcgQXJyYXlCdWZmZXIoNCk7Cgl2YXIgdG1wZiA9IG5ldyBGbG9hdDMyQXJyYXkodG1wKTsKCXZhciB0bXB1OCA9IG5ldyBVaW50OEFycmF5KHRtcCk7CgkKCXRoaXMuZ2V0VWludDMyID0gZnVuY3Rpb24gKGkpIHsKCQlyZXR1cm4gKHRoaXMudThbaSszXSA8PCAyNCkgfCAodGhpcy51OFtpKzJdIDw8IDE2KSB8ICh0aGlzLnU4W2krMV0gPDwgOCkgfCB0aGlzLnU4W2ldOwoJfQoJCgl0aGlzLmdldFVpbnQxNiA9IGZ1bmN0aW9uIChpKSB7CgkJcmV0dXJuICh0aGlzLnU4W2krMV0gPDwgOCkgfCB0aGlzLnU4W2ldOwoJfQoJCgl0aGlzLmdldEZsb2F0ID0gZnVuY3Rpb24oaSl7CgkJdG1wdThbMF0gPSB0aGlzLnU4W2krMF07CgkJdG1wdThbMV0gPSB0aGlzLnU4W2krMV07CgkJdG1wdThbMl0gPSB0aGlzLnU4W2krMl07CgkJdG1wdThbM10gPSB0aGlzLnU4W2krM107CgkJCgkJcmV0dXJuIHRtcGZbMF07Cgl9CgkKCXRoaXMuZ2V0VWludDggPSBmdW5jdGlvbihpKXsKCQlyZXR1cm4gdGhpcy51OFtpXTsKCX0KfQoKUG90cmVlID0ge307CgoKb25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpewoJdmFyIGJ1ZmZlciA9IGV2ZW50LmRhdGEuYnVmZmVyOwoJdmFyIHBvaW50QXR0cmlidXRlcyA9IGV2ZW50LmRhdGEucG9pbnRBdHRyaWJ1dGVzOwoJdmFyIG51bVBvaW50cyA9IGJ1ZmZlci5ieXRlTGVuZ3RoIC8gcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplOwoJdmFyIGN2ID0gbmV3IEN1c3RvbVZpZXcoYnVmZmVyKTsKCXZhciB2ZXJzaW9uID0gbmV3IFBvdHJlZS5WZXJzaW9uKGV2ZW50LmRhdGEudmVyc2lvbik7Cgl2YXIgbWluID0gZXZlbnQuZGF0YS5taW47Cgl2YXIgbm9kZU9mZnNldCA9IGV2ZW50LmRhdGEub2Zmc2V0OwoJdmFyIHNjYWxlID0gZXZlbnQuZGF0YS5zY2FsZTsKCXZhciB0aWdodEJveE1pbiA9IFsgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWV07Cgl2YXIgdGlnaHRCb3hNYXggPSBbIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAsIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSAsIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSBdOwoJCgl2YXIgYXR0cmlidXRlQnVmZmVycyA9IHt9OwoJCgl2YXIgb2Zmc2V0ID0gMDsKCWZvcih2YXIgaSA9IDA7IGkgPCBwb2ludEF0dHJpYnV0ZXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKyl7CgkJdmFyIHBvaW50QXR0cmlidXRlID0gcG9pbnRBdHRyaWJ1dGVzLmF0dHJpYnV0ZXNbaV07CgkKCQlpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuUE9TSVRJT05fQ0FSVEVTSUFOLm5hbWUpewoJCQkKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQqMyk7CgkJCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmYpOwoJCQkKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCWlmKHZlcnNpb24ubmV3ZXJUaGFuKCIxLjMiKSl7CgkJCQkJcG9zaXRpb25zWzMqaiswXSA9IChjdi5nZXRVaW50MzIob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrMCkgKiBzY2FsZSkgKyBtaW5bMF07CgkJCQkJcG9zaXRpb25zWzMqaisxXSA9IChjdi5nZXRVaW50MzIob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrNCkgKiBzY2FsZSkgKyBtaW5bMV07CgkJCQkJcG9zaXRpb25zWzMqaisyXSA9IChjdi5nZXRVaW50MzIob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrOCkgKiBzY2FsZSkgKyBtaW5bMl07CgkJCQl9ZWxzZXsKCQkJCQlwb3NpdGlvbnNbMypqKzBdID0gY3YuZ2V0RmxvYXQoaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUrMCkgKyBub2RlT2Zmc2V0WzBdOwoJCQkJCXBvc2l0aW9uc1szKmorMV0gPSBjdi5nZXRGbG9hdChqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSs0KSArIG5vZGVPZmZzZXRbMV07CgkJCQkJcG9zaXRpb25zWzMqaisyXSA9IGN2LmdldEZsb2F0KGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplKzgpICsgbm9kZU9mZnNldFsyXTsKCQkJCX0KCQkJCQoJCQkJdGlnaHRCb3hNaW5bMF0gPSBNYXRoLm1pbih0aWdodEJveE1pblswXSwgcG9zaXRpb25zWzMqaiswXSk7CgkJCQl0aWdodEJveE1pblsxXSA9IE1hdGgubWluKHRpZ2h0Qm94TWluWzFdLCBwb3NpdGlvbnNbMypqKzFdKTsKCQkJCXRpZ2h0Qm94TWluWzJdID0gTWF0aC5taW4odGlnaHRCb3hNaW5bMl0sIHBvc2l0aW9uc1szKmorMl0pOwoJCQkJCgkJCQl0aWdodEJveE1heFswXSA9IE1hdGgubWF4KHRpZ2h0Qm94TWF4WzBdLCBwb3NpdGlvbnNbMypqKzBdKTsKCQkJCXRpZ2h0Qm94TWF4WzFdID0gTWF0aC5tYXgodGlnaHRCb3hNYXhbMV0sIHBvc2l0aW9uc1szKmorMV0pOwoJCQkJdGlnaHRCb3hNYXhbMl0gPSBNYXRoLm1heCh0aWdodEJveE1heFsyXSwgcG9zaXRpb25zWzMqaisyXSk7CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJCQoJCX1lbHNlIGlmKHBvaW50QXR0cmlidXRlLm5hbWUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5DT0xPUl9QQUNLRUQubmFtZSl7CgkJCQoJCQl2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihudW1Qb2ludHMqNCozKTsKCQkJdmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCQoJCQlmb3IodmFyIGogPSAwOyBqIDwgbnVtUG9pbnRzOyBqKyspewoJCQkJY29sb3JzWzMqaiswXSA9IGN2LmdldFVpbnQ4KG9mZnNldCArIGoqcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMCkgLyAyNTU7CgkJCQljb2xvcnNbMypqKzFdID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyAxKSAvIDI1NTsKCQkJCWNvbG9yc1szKmorMl0gPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDIpIC8gMjU1OwoJCQl9CgkJCQoJCQlhdHRyaWJ1dGVCdWZmZXJzW3BvaW50QXR0cmlidXRlLm5hbWVdID0geyBidWZmZXI6IGJ1ZmYsIGF0dHJpYnV0ZTogcG9pbnRBdHRyaWJ1dGV9OwoJCQkKCQl9ZWxzZSBpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuSU5URU5TSVRZLm5hbWUpewoKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJCQl2YXIgaW50ZW5zaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmYpOwoJCQkKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCXZhciBpbnRlbnNpdHkgPSBjdi5nZXRVaW50MTYob2Zmc2V0ICsgaipwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUpOwoJCQkJaW50ZW5zaXRpZXNbal0gPSBpbnRlbnNpdHk7CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJCgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLkNMQVNTSUZJQ0FUSU9OLm5hbWUpewoKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJCQl2YXIgY2xhc3NpZmljYXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShidWZmKTsKCQkJCgkJCWZvcih2YXIgaiA9IDA7IGogPCBudW1Qb2ludHM7IGorKyl7CgkJCQl2YXIgY2xhc3NpZmljYXRpb24gPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqKnBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSk7CgkJCQljbGFzc2lmaWNhdGlvbnNbal0gPSBjbGFzc2lmaWNhdGlvbjsKCQkJfQoJCQkKCQkJYXR0cmlidXRlQnVmZmVyc1twb2ludEF0dHJpYnV0ZS5uYW1lXSA9IHsgYnVmZmVyOiBidWZmLCBhdHRyaWJ1dGU6IHBvaW50QXR0cmlidXRlfTsKCQkKCQl9ZWxzZSBpZihwb2ludEF0dHJpYnV0ZS5uYW1lID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX1NQSEVSRU1BUFBFRC5uYW1lKXsKCgkJCXZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KjMpOwoJCQl2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCQoJCQlmb3IodmFyIGogPSAwOyBqIDwgbnVtUG9pbnRzOyBqKyspewoJCQkJdmFyIGJ4ID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDApOwoJCQkJdmFyIGJ5ID0gY3YuZ2V0VWludDgob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDEpOwoJCQkKCQkJCXZhciBleCA9IGJ4IC8gMjU1OwoJCQkJdmFyIGV5ID0gYnkgLyAyNTU7CgkJCQkKCQkJCXZhciBueCA9IGV4ICogMiAtIDE7CgkJCQl2YXIgbnkgPSBleSAqIDIgLSAxOwoJCQkJdmFyIG56ID0gMTsKCQkJCXZhciBudyA9IC0xOwoJCQkJCgkJCQl2YXIgbCA9IChueCAqICgtbngpKSArIChueSAqICgtbnkpKSArIChueiAqICgtbncpKTsKCQkJCW56ID0gbDsKCQkJCW54ID0gbnggKiBNYXRoLnNxcnQobCk7CgkJCQlueSA9IG55ICogTWF0aC5zcXJ0KGwpOwoJCQkJCgkJCQlueCA9IG54ICogMjsKCQkJCW55ID0gbnkgKiAyOwoJCQkJbnogPSBueiAqIDIgLSAxOwoJCQkJCgkJCQlub3JtYWxzWzMqaiArIDBdID0gbng7CgkJCQlub3JtYWxzWzMqaiArIDFdID0gbnk7CgkJCQlub3JtYWxzWzMqaiArIDJdID0gbno7CgkJCX0KCQkJCgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9PQ1QxNi5uYW1lKXsKCQkJCgkJCXZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KjMpOwoJCQl2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZik7CgkJCWZvcih2YXIgaiA9IDA7IGogPCBudW1Qb2ludHM7IGorKyl7CgkJCQl2YXIgYnggPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMCk7CgkJCQl2YXIgYnkgPSBjdi5nZXRVaW50OChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgMSk7CgkJCQkKCQkJCXZhciB1ID0gKGJ4IC8gMjU1KSAqIDIgLSAxOwoJCQkJdmFyIHYgPSAoYnkgLyAyNTUpICogMiAtIDE7CgkJCQkKCQkJCXZhciB6ID0gMSAtIE1hdGguYWJzKHUpIC0gTWF0aC5hYnModik7CgkJCQkKCQkJCWlmKHogPj0gMCl7CgkJCQkJdmFyIHggPSB1OwoJCQkJCXZhciB5ID0gdjsKCQkJCX1lbHNlewoJCQkJCXZhciB4ID0gLSAodi9NYXRoLnNpZ24odikgLSAxKSAvIE1hdGguc2lnbih1KTsKCQkJCQl2YXIgeSA9IC0gKHUvTWF0aC5zaWduKHUpIC0gMSkgLyBNYXRoLnNpZ24odik7CgkJCQl9CgkJCQkKCQkJCXZhciBsZW5ndGggPSBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTsKCQkJCXggPSB4IC8gbGVuZ3RoOwoJCQkJeSA9IHkgLyBsZW5ndGg7CgkJCQl6ID0geiAvIGxlbmd0aDsKCQkJCQoJCQkJbm9ybWFsc1szKmogKyAwXSA9IHg7CgkJCQlub3JtYWxzWzMqaiArIDFdID0geTsKCQkJCW5vcm1hbHNbMypqICsgMl0gPSB6OwoJCQl9CgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfWVsc2UgaWYocG9pbnRBdHRyaWJ1dGUubmFtZSA9PT0gUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTC5uYW1lKXsKCQkKCQkJdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQqMyk7CgkJCXZhciBub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheShidWZmKTsKCQkJZm9yKHZhciBqID0gMDsgaiA8IG51bVBvaW50czsgaisrKXsKCQkJCXZhciB4ID0gY3YuZ2V0RmxvYXQob2Zmc2V0ICsgaiAqIHBvaW50QXR0cmlidXRlcy5ieXRlU2l6ZSArIDApOwoJCQkJdmFyIHkgPSBjdi5nZXRGbG9hdChvZmZzZXQgKyBqICogcG9pbnRBdHRyaWJ1dGVzLmJ5dGVTaXplICsgNCk7CgkJCQl2YXIgeiA9IGN2LmdldEZsb2F0KG9mZnNldCArIGogKiBwb2ludEF0dHJpYnV0ZXMuYnl0ZVNpemUgKyA4KTsKCQkJCQoJCQkJbm9ybWFsc1szKmogKyAwXSA9IHg7CgkJCQlub3JtYWxzWzMqaiArIDFdID0geTsKCQkJCW5vcm1hbHNbMypqICsgMl0gPSB6OwoJCQl9CgkJCWF0dHJpYnV0ZUJ1ZmZlcnNbcG9pbnRBdHRyaWJ1dGUubmFtZV0gPSB7IGJ1ZmZlcjogYnVmZiwgYXR0cmlidXRlOiBwb2ludEF0dHJpYnV0ZX07CgkJfQoJCQoJCW9mZnNldCArPSBwb2ludEF0dHJpYnV0ZS5ieXRlU2l6ZTsKCX0KCQoJdmFyIGluZGljZXMgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKjQpOwoJdmFyIGlJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KGluZGljZXMpOwoJZm9yKHZhciBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKXsKCQlpSW5kaWNlc1tpXSA9IGk7Cgl9CgkKCXZhciBtZXNzYWdlID0gewoJCWF0dHJpYnV0ZUJ1ZmZlcnM6IGF0dHJpYnV0ZUJ1ZmZlcnMsCgkJdGlnaHRCb3VuZGluZ0JveDogeyBtaW46IHRpZ2h0Qm94TWluLCBtYXg6IHRpZ2h0Qm94TWF4IH0sCgkJaW5kaWNlczogaW5kaWNlcwoJfTsKCQkKCXZhciB0cmFuc2ZlcmFibGVzID0gW107CgkKCWZvcih2YXIgcHJvcGVydHkgaW4gbWVzc2FnZS5hdHRyaWJ1dGVCdWZmZXJzKXsKCQlpZihtZXNzYWdlLmF0dHJpYnV0ZUJ1ZmZlcnMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKXsKCQkJdHJhbnNmZXJhYmxlcy5wdXNoKG1lc3NhZ2UuYXR0cmlidXRlQnVmZmVyc1twcm9wZXJ0eV0uYnVmZmVyKTsKCQl9Cgl9CgkKCXRyYW5zZmVyYWJsZXMucHVzaChtZXNzYWdlLmluZGljZXMpOwoJCQoJcG9zdE1lc3NhZ2UobWVzc2FnZSwgdHJhbnNmZXJhYmxlcyk7CgkKfTsKUG90cmVlLlZlcnNpb24gPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Cgl2YXIgdm1MZW5ndGggPSAodmVyc2lvbi5pbmRleE9mKCIuIikgPT09IC0xKSA/IHZlcnNpb24ubGVuZ3RoIDogdmVyc2lvbi5pbmRleE9mKCIuIik7Cgl0aGlzLnZlcnNpb25NYWpvciA9IHBhcnNlSW50KHZlcnNpb24uc3Vic3RyKDAsIHZtTGVuZ3RoKSk7Cgl0aGlzLnZlcnNpb25NaW5vciA9IHBhcnNlSW50KHZlcnNpb24uc3Vic3RyKHZtTGVuZ3RoICsgMSkpOwoJaWYodGhpcy52ZXJzaW9uTWlub3IubGVuZ3RoID09PSAwKXsKCQl0aGlzLnZlcnNpb25NaW5vciA9IDA7Cgl9CgkKfTsKClBvdHJlZS5WZXJzaW9uLnByb3RvdHlwZS5uZXdlclRoYW4gPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXZhciB2ID0gbmV3IFBvdHJlZS5WZXJzaW9uKHZlcnNpb24pOwoJCglpZiggdGhpcy52ZXJzaW9uTWFqb3IgPiB2LnZlcnNpb25NYWpvcil7CgkJcmV0dXJuIHRydWU7Cgl9ZWxzZSBpZiggdGhpcy52ZXJzaW9uTWFqb3IgPT09IHYudmVyc2lvbk1ham9yICYmIHRoaXMudmVyc2lvbk1pbm9yID4gdi52ZXJzaW9uTWlub3IpewoJCXJldHVybiB0cnVlOwoJfWVsc2V7CgkJcmV0dXJuIGZhbHNlOwoJfQp9OwoKUG90cmVlLlZlcnNpb24ucHJvdG90eXBlLmVxdWFsT3JIaWdoZXIgPSBmdW5jdGlvbih2ZXJzaW9uKXsKCXZhciB2ID0gbmV3IFBvdHJlZS5WZXJzaW9uKHZlcnNpb24pOwoJCglpZiggdGhpcy52ZXJzaW9uTWFqb3IgPiB2LnZlcnNpb25NYWpvcil7CgkJcmV0dXJuIHRydWU7Cgl9ZWxzZSBpZiggdGhpcy52ZXJzaW9uTWFqb3IgPT09IHYudmVyc2lvbk1ham9yICYmIHRoaXMudmVyc2lvbk1pbm9yID49IHYudmVyc2lvbk1pbm9yKXsKCQlyZXR1cm4gdHJ1ZTsKCX1lbHNlewoJCXJldHVybiBmYWxzZTsKCX0KfTsKClBvdHJlZS5WZXJzaW9uLnByb3RvdHlwZS51cFRvID0gZnVuY3Rpb24odmVyc2lvbil7CglyZXR1cm4gIXRoaXMubmV3ZXJUaGFuKHZlcnNpb24pOwp9ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzID0ge307CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5QT1NJVElPTl9DQVJURVNJQU4gCT0gMDsJLy8gZmxvYXQgeCwgeSwgejsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuQ09MT1JfUEFDS0VECQk9IDE7CS8vIGJ5dGUgciwgZywgYiwgYTsgCUkgPSBbMCwxXQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9GTE9BVFNfMQkJPSAyOwkvLyBmbG9hdCByLCBnLCBiOyAJCUkgPSBbMCwxXQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9GTE9BVFNfMjU1CT0gMzsJLy8gZmxvYXQgciwgZywgYjsgCQlJID0gWzAsMjU1XQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUxfRkxPQVRTCQk9IDQ7ICAJLy8gZmxvYXQgeCwgeSwgejsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuRklMTEVSCQkJCT0gNTsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuSU5URU5TSVRZCQkJPSA2OwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DTEFTU0lGSUNBVElPTgkJPSA3OwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUxfU1BIRVJFTUFQUEVECT0gODsKUG90cmVlLlBvaW50QXR0cmlidXRlTmFtZXMuTk9STUFMX09DVDE2CQk9IDk7ClBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTAkJCQk9IDEwOwoKLyoqCiAqIFNvbWUgdHlwZXMgb2YgcG9zc2libGUgcG9pbnQgYXR0cmlidXRlIGRhdGEgZm9ybWF0cwogKiAKICogQGNsYXNzCiAqLwpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcyA9IHsKCURBVEFfVFlQRV9ET1VCTEUJOiB7b3JkaW5hbCA6IDAsIHNpemU6IDh9LAoJREFUQV9UWVBFX0ZMT0FUCQk6IHtvcmRpbmFsIDogMSwgc2l6ZTogNH0sCglEQVRBX1RZUEVfSU5UOAkJOiB7b3JkaW5hbCA6IDIsIHNpemU6IDF9LAoJREFUQV9UWVBFX1VJTlQ4CQk6IHtvcmRpbmFsIDogMywgc2l6ZTogMX0sCglEQVRBX1RZUEVfSU5UMTYJCToge29yZGluYWwgOiA0LCBzaXplOiAyfSwKCURBVEFfVFlQRV9VSU5UMTYJOiB7b3JkaW5hbCA6IDUsIHNpemU6IDJ9LAoJREFUQV9UWVBFX0lOVDMyCQk6IHtvcmRpbmFsIDogNiwgc2l6ZTogNH0sCglEQVRBX1RZUEVfVUlOVDMyCToge29yZGluYWwgOiA3LCBzaXplOiA0fSwKCURBVEFfVFlQRV9JTlQ2NAkJOiB7b3JkaW5hbCA6IDgsIHNpemU6IDh9LAoJREFUQV9UWVBFX1VJTlQ2NAk6IHtvcmRpbmFsIDogOSwgc2l6ZTogOH0KfTsKCnZhciBpID0gMDsKZm9yKHZhciBvYmogaW4gUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMpewoJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXNbaV0gPSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlc1tvYmpdOwoJaSsrOwp9CgovKioKICogQSBzaW5nbGUgcG9pbnQgYXR0cmlidXRlIHN1Y2ggYXMgY29sb3Ivbm9ybWFsLy4uIGFuZCBpdHMgZGF0YSBmb3JtYXQvbnVtYmVyIG9mIGVsZW1lbnRzLy4uLiAKICogCiAqIEBjbGFzcwogKiBAcGFyYW0gbmFtZSAKICogQHBhcmFtIHR5cGUKICogQHBhcmFtIHNpemUKICogQHJldHVybnMKICovClBvdHJlZS5Qb2ludEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIG51bUVsZW1lbnRzKXsKCXRoaXMubmFtZSA9IG5hbWU7Cgl0aGlzLnR5cGUgPSB0eXBlOyAKCXRoaXMubnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKCXRoaXMuYnl0ZVNpemUgPSB0aGlzLm51bUVsZW1lbnRzICogdGhpcy50eXBlLnNpemU7Cn0KClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5QT1NJVElPTl9DQVJURVNJQU4gPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLlBPU0lUSU9OX0NBUlRFU0lBTiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfRkxPQVQsIDMpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLlJHQkFfUEFDS0VEID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9QQUNLRUQsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX0lOVDgsIDQpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLkNPTE9SX1BBQ0tFRCA9IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5SR0JBX1BBQ0tFRDsKClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5SR0JfUEFDS0VEID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DT0xPUl9QQUNLRUQsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX0lOVDgsIDMpOwoKUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9GTE9BVFMgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTF9GTE9BVFMsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX0ZMT0FULCAzKTsKClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5GSUxMRVJfMUIgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkZJTExFUiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfVUlOVDgsIDEpOwoJCQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuSU5URU5TSVRZID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5JTlRFTlNJVFksCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX1VJTlQxNiwgMSk7CQkKCQkKUG90cmVlLlBvaW50QXR0cmlidXRlLkNMQVNTSUZJQ0FUSU9OID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5DTEFTU0lGSUNBVElPTiwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfVUlOVDgsIDEpOwkKCQkKUG90cmVlLlBvaW50QXR0cmlidXRlLk5PUk1BTF9TUEhFUkVNQVBQRUQgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTF9TUEhFUkVNQVBQRUQsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX1VJTlQ4LCAyKTsJCQoJCQpQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX09DVDE2ID0gbmV3IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZSgKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVOYW1lcy5OT1JNQUxfT0NUMTYsCgkJUG90cmVlLlBvaW50QXR0cmlidXRlVHlwZXMuREFUQV9UWVBFX1VJTlQ4LCAyKTsJCgkJClBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5OT1JNQUwgPSBuZXcgUG90cmVlLlBvaW50QXR0cmlidXRlKAoJCVBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLk5PUk1BTCwKCQlQb3RyZWUuUG9pbnRBdHRyaWJ1dGVUeXBlcy5EQVRBX1RZUEVfRkxPQVQsIDMpOwoKLyoqCiAqIE9yZGVyZWQgbGlzdCBvZiBQb2ludEF0dHJpYnV0ZXMgdXNlZCB0byBpZGVudGlmeSBob3cgcG9pbnRzIGFyZSBhbGlnbmVkIGluIGEgYnVmZmVyLgogKiAKICogQGNsYXNzCiAqIAogKi8KUG90cmVlLlBvaW50QXR0cmlidXRlcyA9IGZ1bmN0aW9uKHBvaW50QXR0cmlidXRlcyl7Cgl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgQXJyYXkoKTsKCXRoaXMuYnl0ZVNpemUgPSAwOwoJdGhpcy5zaXplID0gMDsKCQoJaWYocG9pbnRBdHRyaWJ1dGVzICE9IG51bGwpewkKCQlmb3IodmFyIGkgPSAwOyBpIDwgcG9pbnRBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKXsKCQkJdmFyIHBvaW50QXR0cmlidXRlTmFtZSA9IHBvaW50QXR0cmlidXRlc1tpXTsKCQkJdmFyIHBvaW50QXR0cmlidXRlID0gUG90cmVlLlBvaW50QXR0cmlidXRlW3BvaW50QXR0cmlidXRlTmFtZV07CgkJCXRoaXMuYXR0cmlidXRlcy5wdXNoKHBvaW50QXR0cmlidXRlKTsKCQkJdGhpcy5ieXRlU2l6ZSArPSBwb2ludEF0dHJpYnV0ZS5ieXRlU2l6ZTsKCQkJdGhpcy5zaXplKys7CgkJfQoJfQp9CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVzLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihwb2ludEF0dHJpYnV0ZSl7Cgl0aGlzLmF0dHJpYnV0ZXMucHVzaChwb2ludEF0dHJpYnV0ZSk7Cgl0aGlzLmJ5dGVTaXplICs9IHBvaW50QXR0cmlidXRlLmJ5dGVTaXplOwoJdGhpcy5zaXplKys7Cn07CgpQb3RyZWUuUG9pbnRBdHRyaWJ1dGVzLnByb3RvdHlwZS5oYXNDb2xvcnMgPSBmdW5jdGlvbigpewoJZm9yKHZhciBuYW1lIGluIHRoaXMuYXR0cmlidXRlcyl7CgkJdmFyIHBvaW50QXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzW25hbWVdOwoJCWlmKHBvaW50QXR0cmlidXRlLm5hbWUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZU5hbWVzLkNPTE9SX1BBQ0tFRCl7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCQoJcmV0dXJuIGZhbHNlOwp9OwoKUG90cmVlLlBvaW50QXR0cmlidXRlcy5wcm90b3R5cGUuaGFzTm9ybWFscyA9IGZ1bmN0aW9uKCl7Cglmb3IodmFyIG5hbWUgaW4gdGhpcy5hdHRyaWJ1dGVzKXsKCQl2YXIgcG9pbnRBdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07CgkJaWYoCgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX1NQSEVSRU1BUFBFRCB8fCAKCQkJcG9pbnRBdHRyaWJ1dGUgPT09IFBvdHJlZS5Qb2ludEF0dHJpYnV0ZS5OT1JNQUxfRkxPQVRTIHx8CgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMIHx8CgkJCXBvaW50QXR0cmlidXRlID09PSBQb3RyZWUuUG9pbnRBdHRyaWJ1dGUuTk9STUFMX09DVDE2KXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoJCglyZXR1cm4gZmFsc2U7Cn07CgoK")); \ No newline at end of file diff --git a/PotreeConverter/resources/page_template/build/workers/lasdecoder-worker.js b/PotreeConverter/resources/page_template/build/workers/lasdecoder-worker.js deleted file mode 100644 index 28ade582..00000000 --- a/PotreeConverter/resources/page_template/build/workers/lasdecoder-worker.js +++ /dev/null @@ -1 +0,0 @@ -Potree.workers.lasdecoder = new Potree.WorkerManager(atob("CgovL3ZhciBwb2ludEZvcm1hdFJlYWRlcnMgPSB7Ci8vCTA6IGZ1bmN0aW9uKGR2KSB7Ci8vCQlyZXR1cm4gewovLwkJCSJwb3NpdGlvbiI6IFsgZHYuZ2V0SW50MzIoMCwgdHJ1ZSksIGR2LmdldEludDMyKDQsIHRydWUpLCBkdi5nZXRJbnQzMig4LCB0cnVlKV0sCi8vCQkJImludGVuc2l0eSI6IGR2LmdldFVpbnQxNigxMiwgdHJ1ZSksCi8vCQkJImNsYXNzaWZpY2F0aW9uIjogZHYuZ2V0VWludDgoMTYsIHRydWUpCi8vCQl9OwovLwl9LAovLwkxOiBmdW5jdGlvbihkdikgewovLwkJcmV0dXJuIHsKLy8JCQkicG9zaXRpb24iOiBbIGR2LmdldEludDMyKDAsIHRydWUpLCBkdi5nZXRJbnQzMig0LCB0cnVlKSwgZHYuZ2V0SW50MzIoOCwgdHJ1ZSldLAovLwkJCSJpbnRlbnNpdHkiOiBkdi5nZXRVaW50MTYoMTIsIHRydWUpLAovLwkJCSJjbGFzc2lmaWNhdGlvbiI6IGR2LmdldFVpbnQ4KDE2LCB0cnVlKQovLwkJfTsKLy8JfSwKLy8JMjogZnVuY3Rpb24oZHYpIHsKLy8JCXJldHVybiB7Ci8vCQkJInBvc2l0aW9uIjogWyBkdi5nZXRJbnQzMigwLCB0cnVlKSwgZHYuZ2V0SW50MzIoNCwgdHJ1ZSksIGR2LmdldEludDMyKDgsIHRydWUpXSwKLy8JCQkiaW50ZW5zaXR5IjogZHYuZ2V0VWludDE2KDEyLCB0cnVlKSwKLy8JCQkiY2xhc3NpZmljYXRpb24iOiBkdi5nZXRVaW50OCgxNiwgdHJ1ZSksCi8vCQkJImNvbG9yIjogW2R2LmdldFVpbnQxNigyMCwgdHJ1ZSksIGR2LmdldFVpbnQxNigyMiwgdHJ1ZSksIGR2LmdldFVpbnQxNigyNCwgdHJ1ZSldCi8vCQl9OwovLwl9LAovLwkzOiBmdW5jdGlvbihkdikgewovLwkJcmV0dXJuIHsKLy8JCQkicG9zaXRpb24iOiBbIGR2LmdldEludDMyKDAsIHRydWUpLCBkdi5nZXRJbnQzMig0LCB0cnVlKSwgZHYuZ2V0SW50MzIoOCwgdHJ1ZSldLAovLwkJCSJpbnRlbnNpdHkiOiBkdi5nZXRVaW50MTYoMTIsIHRydWUpLAovLwkJCSJjbGFzc2lmaWNhdGlvbiI6IGR2LmdldFVpbnQ4KDE2LCB0cnVlKSwKLy8JCQkiY29sb3IiOiBbZHYuZ2V0VWludDE2KDI4LCB0cnVlKSwgZHYuZ2V0VWludDE2KDMwLCB0cnVlKSwgZHYuZ2V0VWludDE2KDMyLCB0cnVlKV0KLy8JCX07Ci8vCX0KLy99OwovLwkKLy8JCi8vIERlY29kZXMgTEFTIHJlY29yZHMgaW50byBwb2ludHMKLy8KLy92YXIgTEFTRGVjb2RlciA9IGZ1bmN0aW9uKGJ1ZmZlciwgcG9pbnRGb3JtYXRJRCwgcG9pbnRTaXplLCBwb2ludHNDb3VudCwgc2NhbGUsIG9mZnNldCkgewovLwl0aGlzLmFycmF5YiA9IGJ1ZmZlcjsKLy8JdGhpcy5kZWNvZGVyID0gcG9pbnRGb3JtYXRSZWFkZXJzW3BvaW50Rm9ybWF0SURdOwovLwl0aGlzLnBvaW50c0NvdW50ID0gcG9pbnRzQ291bnQ7Ci8vCXRoaXMucG9pbnRTaXplID0gcG9pbnRTaXplOwovLwl0aGlzLnNjYWxlID0gc2NhbGU7Ci8vCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwovL307Ci8vCi8vTEFTRGVjb2Rlci5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbihpbmRleCkgewovLwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucG9pbnRzQ291bnQpCi8vCQl0aHJvdyBuZXcgRXJyb3IoIlBvaW50IGluZGV4IG91dCBvZiByYW5nZSIpOwovLwovLwl2YXIgZHYgPSBuZXcgRGF0YVZpZXcodGhpcy5hcnJheWIsIGluZGV4ICogdGhpcy5wb2ludFNpemUsIHRoaXMucG9pbnRTaXplKTsKLy8JcmV0dXJuIHRoaXMuZGVjb2Rlcihkdik7Ci8vfTsKCm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KXsKCXZhciBidWZmZXIgPSBldmVudC5kYXRhLmJ1ZmZlcjsKCXZhciBudW1Qb2ludHMgPSBldmVudC5kYXRhLm51bVBvaW50czsKCXZhciBwb2ludFNpemUgPSBldmVudC5kYXRhLnBvaW50U2l6ZTsKCXZhciBwb2ludEZvcm1hdElEID0gZXZlbnQuZGF0YS5wb2ludEZvcm1hdElEOwoJdmFyIHNjYWxlID0gZXZlbnQuZGF0YS5zY2FsZTsKCXZhciBvZmZzZXQgPSBldmVudC5kYXRhLm9mZnNldDsKCXZhciBtaW5zID0gZXZlbnQuZGF0YS5taW5zOwoJdmFyIG1heHMgPSBldmVudC5kYXRhLm1heHM7Cgl2YXIgYmJPZmZzZXQgPSBldmVudC5kYXRhLmJiT2Zmc2V0OwoJCgl2YXIgdGVtcCA9IG5ldyBBcnJheUJ1ZmZlcig0KTsKCXZhciB0ZW1wVWludDggPSBuZXcgVWludDhBcnJheSh0ZW1wKTsKCXZhciB0ZW1wVWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRlbXApOwoJdmFyIHRlbXBGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0ZW1wKTsKCXZhciB0ZW1wSW50MzIgPSBuZXcgSW50MzJBcnJheSh0ZW1wKTsKCXZhciBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTsKCQoJdmFyIHBCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyozKjQpOwoJdmFyIGNCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyozKjQpOwoJdmFyIGlCdWZmID0gbmV3IEFycmF5QnVmZmVyKG51bVBvaW50cyo0KTsKCXZhciBjbEJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBybkJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBuckJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzKTsKCXZhciBwc0J1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobnVtUG9pbnRzICogMik7CgkKCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KHBCdWZmKTsKCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KGNCdWZmKTsKCXZhciBpbnRlbnNpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmYpOwoJdmFyIGNsYXNzaWZpY2F0aW9ucyA9IG5ldyBVaW50OEFycmF5KGNsQnVmZik7Cgl2YXIgcmV0dXJuTnVtYmVycyA9IG5ldyBVaW50OEFycmF5KHJuQnVmZik7Cgl2YXIgbnVtYmVyT2ZSZXR1cm5zID0gbmV3IFVpbnQ4QXJyYXkobnJCdWZmKTsKCXZhciBwb2ludFNvdXJjZUlEcyA9IG5ldyBVaW50MTZBcnJheShwc0J1ZmYpOwoJdmFyIHRpZ2h0Qm91bmRpbmdCb3ggPSB7CgkJbWluOiBbIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFldLAoJCW1heDogWyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgXQoJfTsKCQoJCgkvLyB0ZW1wIGFycmF5cyBzZWVtIHRvIGJlIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gRGF0YVZpZXdzCgkvLyBhdCB0aGUgbW9tZW50OiBodHRwOi8vanNwZXJmLmNvbS9kYXRhdmlldy12cy10ZW1wb3JhcnktZmxvYXQ2NGFycmF5Cglmb3IodmFyIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKyspewoJCgkJLy8gUE9TSVRJT04KCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzBdOwoJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMV07CgkJdGVtcFVpbnQ4WzJdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyXTsKCQl0ZW1wVWludDhbM10gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzNdOwoJCXZhciB4ID0gdGVtcEludDMyWzBdOwoJCQoJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrNF07CgkJdGVtcFVpbnQ4WzFdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSs1XTsKCQl0ZW1wVWludDhbMl0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzZdOwoJCXRlbXBVaW50OFszXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrN107CgkJdmFyIHkgPSB0ZW1wSW50MzJbMF07CgkJCgkJdGVtcFVpbnQ4WzBdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSs4XTsKCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzldOwoJCXRlbXBVaW50OFsyXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTBdOwoJCXRlbXBVaW50OFszXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTFdOwoJCXZhciB6ID0gdGVtcEludDMyWzBdOwoJCQoJCXBvc2l0aW9uc1szKmkrMF0gPSB4ICogc2NhbGVbMF0gKyBvZmZzZXRbMF0gKyBiYk9mZnNldFswXTsKCQlwb3NpdGlvbnNbMyppKzFdID0geSAqIHNjYWxlWzFdICsgb2Zmc2V0WzFdICsgYmJPZmZzZXRbMV07CgkJcG9zaXRpb25zWzMqaSsyXSA9IHogKiBzY2FsZVsyXSArIG9mZnNldFsyXSArIGJiT2Zmc2V0WzJdOwoJCQoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzBdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMF0sIHBvc2l0aW9uc1szKmkrMF0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzFdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMV0sIHBvc2l0aW9uc1szKmkrMV0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWluWzJdID0gTWF0aC5taW4odGlnaHRCb3VuZGluZ0JveC5taW5bMl0sIHBvc2l0aW9uc1szKmkrMl0pOwoJCQoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzBdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMF0sIHBvc2l0aW9uc1szKmkrMF0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzFdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMV0sIHBvc2l0aW9uc1szKmkrMV0pOwoJCXRpZ2h0Qm91bmRpbmdCb3gubWF4WzJdID0gTWF0aC5tYXgodGlnaHRCb3VuZGluZ0JveC5tYXhbMl0sIHBvc2l0aW9uc1szKmkrMl0pOwoJCQoJCS8vIElOVEVOU0lUWQoJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTJdOwoJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMTNdOwoJCXZhciBpbnRlbnNpdHkgPSB0ZW1wVWludDE2WzBdOwoJCWludGVuc2l0aWVzW2ldID0gaW50ZW5zaXR5OwoJCQoJCS8vIFJFVFVSTiBOVU1CRVIsIHN0b3JlZCBpbiB0aGUgZmlyc3QgMyBiaXRzIC0gMDAwMDAxMTEKCQl2YXIgcmV0dXJuTnVtYmVyID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsxNF0gJiA3OwoJCXJldHVybk51bWJlcnNbaV0gPSByZXR1cm5OdW1iZXI7CgkJCgkJLy8gTlVNQkVSIE9GIFJFVFVSTlMsIHN0b3JlZCBpbiAwMDExMTAwMAoJCW51bWJlck9mUmV0dXJuc1tpXSA9IChidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE0XSAmIDU2KSAvIDg7CgkJCgkJLy8gQ0xBU1NJRklDQVRJT04KCQl2YXIgY2xhc3NpZmljYXRpb24gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE1XTsKCQljbGFzc2lmaWNhdGlvbnNbaV0gPSBjbGFzc2lmaWNhdGlvbjsKCQkKCQkvLyBQT0lOVCBTT1VSQ0UgSUQKCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE4XTsKCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzE5XTsKCQl2YXIgcG9pbnRTb3VyY2VJRCA9IHRlbXBVaW50MTZbMF07CgkJcG9pbnRTb3VyY2VJRHNbaV0gPSBwb2ludFNvdXJjZUlEOwoJCQoJCS8vIENPTE9SLCBpZiBhdmFpbGFibGUKCQlpZihwb2ludEZvcm1hdElEID09PSAyKXsKCQkJdGVtcFVpbnQ4WzBdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyMF07CgkJCXRlbXBVaW50OFsxXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMjFdOwoJCQl2YXIgciA9IHRlbXBVaW50MTZbMF07CgkJCQoJCQl0ZW1wVWludDhbMF0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzIyXTsKCQkJdGVtcFVpbnQ4WzFdID0gYnVmZmVyVmlld1tpKnBvaW50U2l6ZSsyM107CgkJCXZhciBnID0gdGVtcFVpbnQxNlswXTsKCQkJCgkJCXRlbXBVaW50OFswXSA9IGJ1ZmZlclZpZXdbaSpwb2ludFNpemUrMjRdOwoJCQl0ZW1wVWludDhbMV0gPSBidWZmZXJWaWV3W2kqcG9pbnRTaXplKzI1XTsKCQkJdmFyIGIgPSB0ZW1wVWludDE2WzBdOwoJCQkKCQkJY29sb3JzWzMqaSswXSA9IHIgLyA2NTUzNjsKCQkJY29sb3JzWzMqaSsxXSA9IGcgLyA2NTUzNjsKCQkJY29sb3JzWzMqaSsyXSA9IGIgLyA2NTUzNjsKCQl9Cgl9CgkKCXZhciBtZXNzYWdlID0gewoJCXBvc2l0aW9uOiBwQnVmZiwgCgkJY29sb3I6IGNCdWZmLCAKCQlpbnRlbnNpdHk6IGlCdWZmLAoJCWNsYXNzaWZpY2F0aW9uOiBjbEJ1ZmYsCgkJcmV0dXJuTnVtYmVyOiBybkJ1ZmYsCgkJbnVtYmVyT2ZSZXR1cm5zOiBuckJ1ZmYsCgkJcG9pbnRTb3VyY2VJRDogcHNCdWZmLAoJCXRpZ2h0Qm91bmRpbmdCb3g6IHRpZ2h0Qm91bmRpbmdCb3gKCX07CgkJCgl2YXIgdHJhbnNmZXJhYmxlcyA9IFsKCQltZXNzYWdlLnBvc2l0aW9uLAoJCW1lc3NhZ2UuY29sb3IsIAoJCW1lc3NhZ2UuaW50ZW5zaXR5LAoJCW1lc3NhZ2UuY2xhc3NpZmljYXRpb24sCgkJbWVzc2FnZS5yZXR1cm5OdW1iZXIsCgkJbWVzc2FnZS5udW1iZXJPZlJldHVybnMsCgkJbWVzc2FnZS5wb2ludFNvdXJjZUlEXTsKCQkKCXBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRyYW5zZmVyYWJsZXMpOwp9Cg==")); \ No newline at end of file diff --git a/PotreeConverter/resources/page_template/build/workers/laslaz-worker.js b/PotreeConverter/resources/page_template/build/workers/laslaz-worker.js deleted file mode 100644 index 3d17cdbd..00000000 --- a/PotreeConverter/resources/page_template/build/workers/laslaz-worker.js +++ /dev/null @@ -1 +0,0 @@ -Potree.workers.laslaz = new Potree.WorkerManager(atob("dmFyIE1vZHVsZTtpZighTW9kdWxlKU1vZHVsZT0odHlwZW9mIE1vZHVsZSE9PSJ1bmRlZmluZWQiP01vZHVsZTpudWxsKXx8e307dmFyIG1vZHVsZU92ZXJyaWRlcz17fTtmb3IodmFyIGtleSBpbiBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyIEVOVklST05NRU5UX0lTX05PREU9dHlwZW9mIHByb2Nlc3M9PT0ib2JqZWN0IiYmdHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iO3ZhciBFTlZJUk9OTUVOVF9JU19XRUI9dHlwZW9mIHdpbmRvdz09PSJvYmplY3QiO3ZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVI9dHlwZW9mIGltcG9ydFNjcmlwdHM9PT0iZnVuY3Rpb24iO3ZhciBFTlZJUk9OTUVOVF9JU19TSEVMTD0hRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfTk9ERSYmIUVOVklST05NRU5UX0lTX1dPUktFUjtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtpZighTW9kdWxlWyJwcmludCJdKU1vZHVsZVsicHJpbnQiXT1mdW5jdGlvbiBwcmludCh4KXtwcm9jZXNzWyJzdGRvdXQiXS53cml0ZSh4KyJcbiIpfTtpZighTW9kdWxlWyJwcmludEVyciJdKU1vZHVsZVsicHJpbnRFcnIiXT1mdW5jdGlvbiBwcmludEVycih4KXtwcm9jZXNzWyJzdGRlcnIiXS53cml0ZSh4KyJcbiIpfTt2YXIgbm9kZUZTPXJlcXVpcmUoImZzIik7dmFyIG5vZGVQYXRoPXJlcXVpcmUoInBhdGgiKTtNb2R1bGVbInJlYWQiXT1mdW5jdGlvbiByZWFkKGZpbGVuYW1lLGJpbmFyeSl7ZmlsZW5hbWU9bm9kZVBhdGhbIm5vcm1hbGl6ZSJdKGZpbGVuYW1lKTt2YXIgcmV0PW5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUpO2lmKCFyZXQmJmZpbGVuYW1lIT1ub2RlUGF0aFsicmVzb2x2ZSJdKGZpbGVuYW1lKSl7ZmlsZW5hbWU9cGF0aC5qb2luKF9fZGlybmFtZSwiLi4iLCJzcmMiLGZpbGVuYW1lKTtyZXQ9bm9kZUZTWyJyZWFkRmlsZVN5bmMiXShmaWxlbmFtZSl9aWYocmV0JiYhYmluYXJ5KXJldD1yZXQudG9TdHJpbmcoKTtyZXR1cm4gcmV0fTtNb2R1bGVbInJlYWRCaW5hcnkiXT1mdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKXtyZXR1cm4gTW9kdWxlWyJyZWFkIl0oZmlsZW5hbWUsdHJ1ZSl9O01vZHVsZVsibG9hZCJdPWZ1bmN0aW9uIGxvYWQoZil7Z2xvYmFsRXZhbChyZWFkKGYpKX07TW9kdWxlWyJhcmd1bWVudHMiXT1wcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7bW9kdWxlWyJleHBvcnRzIl09TW9kdWxlfWVsc2UgaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKCFNb2R1bGVbInByaW50Il0pTW9kdWxlWyJwcmludCJdPXByaW50O2lmKHR5cGVvZiBwcmludEVyciE9InVuZGVmaW5lZCIpTW9kdWxlWyJwcmludEVyciJdPXByaW50RXJyO2lmKHR5cGVvZiByZWFkIT0idW5kZWZpbmVkIil7TW9kdWxlWyJyZWFkIl09cmVhZH1lbHNle01vZHVsZVsicmVhZCJdPWZ1bmN0aW9uIHJlYWQoKXt0aHJvdyJubyByZWFkKCkgYXZhaWxhYmxlIChqc2M/KSJ9fU1vZHVsZVsicmVhZEJpbmFyeSJdPWZ1bmN0aW9uIHJlYWRCaW5hcnkoZil7cmV0dXJuIHJlYWQoZiwiYmluYXJ5Iil9O2lmKHR5cGVvZiBzY3JpcHRBcmdzIT0idW5kZWZpbmVkIil7TW9kdWxlWyJhcmd1bWVudHMiXT1zY3JpcHRBcmdzfWVsc2UgaWYodHlwZW9mIGFyZ3VtZW50cyE9InVuZGVmaW5lZCIpe01vZHVsZVsiYXJndW1lbnRzIl09YXJndW1lbnRzfXRoaXNbIk1vZHVsZSJdPU1vZHVsZTtldmFsKCJpZiAodHlwZW9mIGdjID09PSAnZnVuY3Rpb24nICYmIGdjLnRvU3RyaW5nKCkuaW5kZXhPZignW25hdGl2ZSBjb2RlXScpID4gMCkgdmFyIGdjID0gdW5kZWZpbmVkIil9ZWxzZSBpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7TW9kdWxlWyJyZWFkIl09ZnVuY3Rpb24gcmVhZCh1cmwpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7eGhyLnNlbmQobnVsbCk7cmV0dXJuIHhoci5yZXNwb25zZVRleHR9O2lmKHR5cGVvZiBhcmd1bWVudHMhPSJ1bmRlZmluZWQiKXtNb2R1bGVbImFyZ3VtZW50cyJdPWFyZ3VtZW50c31pZih0eXBlb2YgY29uc29sZSE9PSJ1bmRlZmluZWQiKXtpZighTW9kdWxlWyJwcmludCJdKU1vZHVsZVsicHJpbnQiXT1mdW5jdGlvbiBwcmludCh4KXt9O2lmKCFNb2R1bGVbInByaW50RXJyIl0pTW9kdWxlWyJwcmludEVyciJdPWZ1bmN0aW9uIHByaW50RXJyKHgpe319ZWxzZXt2YXIgVFJZX1VTRV9EVU1QPWZhbHNlO2lmKCFNb2R1bGVbInByaW50Il0pTW9kdWxlWyJwcmludCJdPVRSWV9VU0VfRFVNUCYmdHlwZW9mIGR1bXAhPT0idW5kZWZpbmVkIj8oZnVuY3Rpb24oeCl7ZHVtcCh4KX0pOihmdW5jdGlvbih4KXt9KX1pZihFTlZJUk9OTUVOVF9JU19XRUIpe3dpbmRvd1siTW9kdWxlIl09TW9kdWxlfWVsc2V7TW9kdWxlWyJsb2FkIl09aW1wb3J0U2NyaXB0c319ZWxzZXt0aHJvdyJVbmtub3duIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFdoZXJlIGFyZSB3ZT8ifWZ1bmN0aW9uIGdsb2JhbEV2YWwoeCl7ZXZhbC5jYWxsKG51bGwseCl9aWYoIU1vZHVsZVsibG9hZCJdPT0idW5kZWZpbmVkIiYmTW9kdWxlWyJyZWFkIl0pe01vZHVsZVsibG9hZCJdPWZ1bmN0aW9uIGxvYWQoZil7Z2xvYmFsRXZhbChNb2R1bGVbInJlYWQiXShmKSl9fWlmKCFNb2R1bGVbInByaW50Il0pe01vZHVsZVsicHJpbnQiXT0oZnVuY3Rpb24oKXt9KX1pZighTW9kdWxlWyJwcmludEVyciJdKXtNb2R1bGVbInByaW50RXJyIl09TW9kdWxlWyJwcmludCJdfWlmKCFNb2R1bGVbImFyZ3VtZW50cyJdKXtNb2R1bGVbImFyZ3VtZW50cyJdPVtdfU1vZHVsZS5wcmludD1Nb2R1bGVbInByaW50Il07TW9kdWxlLnByaW50RXJyPU1vZHVsZVsicHJpbnRFcnIiXTtNb2R1bGVbInByZVJ1biJdPVtdO01vZHVsZVsicG9zdFJ1biJdPVtdO2Zvcih2YXIga2V5IGluIG1vZHVsZU92ZXJyaWRlcyl7aWYobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpe01vZHVsZVtrZXldPW1vZHVsZU92ZXJyaWRlc1trZXldfX12YXIgUnVudGltZT17c2V0VGVtcFJldDA6KGZ1bmN0aW9uKHZhbHVlKXt0ZW1wUmV0MD12YWx1ZX0pLGdldFRlbXBSZXQwOihmdW5jdGlvbigpe3JldHVybiB0ZW1wUmV0MH0pLHN0YWNrU2F2ZTooZnVuY3Rpb24oKXtyZXR1cm4gU1RBQ0tUT1B9KSxzdGFja1Jlc3RvcmU6KGZ1bmN0aW9uKHN0YWNrVG9wKXtTVEFDS1RPUD1zdGFja1RvcH0pLGZvcmNlQWxpZ246KGZ1bmN0aW9uKHRhcmdldCxxdWFudHVtKXtxdWFudHVtPXF1YW50dW18fDQ7aWYocXVhbnR1bT09MSlyZXR1cm4gdGFyZ2V0O2lmKGlzTnVtYmVyKHRhcmdldCkmJmlzTnVtYmVyKHF1YW50dW0pKXtyZXR1cm4gTWF0aC5jZWlsKHRhcmdldC9xdWFudHVtKSpxdWFudHVtfWVsc2UgaWYoaXNOdW1iZXIocXVhbnR1bSkmJmlzUG93ZXJPZlR3byhxdWFudHVtKSl7cmV0dXJuIigoKCIrdGFyZ2V0KyIpKyIrKHF1YW50dW0tMSkrIikmIisgLXF1YW50dW0rIikifXJldHVybiJNYXRoLmNlaWwoKCIrdGFyZ2V0KyIpLyIrcXVhbnR1bSsiKSoiK3F1YW50dW19KSxpc051bWJlclR5cGU6KGZ1bmN0aW9uKHR5cGUpe3JldHVybiB0eXBlIGluIFJ1bnRpbWUuSU5UX1RZUEVTfHx0eXBlIGluIFJ1bnRpbWUuRkxPQVRfVFlQRVN9KSxpc1BvaW50ZXJUeXBlOmZ1bmN0aW9uIGlzUG9pbnRlclR5cGUodHlwZSl7cmV0dXJuIHR5cGVbdHlwZS5sZW5ndGgtMV09PSIqIn0saXNTdHJ1Y3RUeXBlOmZ1bmN0aW9uIGlzU3RydWN0VHlwZSh0eXBlKXtpZihpc1BvaW50ZXJUeXBlKHR5cGUpKXJldHVybiBmYWxzZTtpZihpc0FycmF5VHlwZSh0eXBlKSlyZXR1cm4gdHJ1ZTtpZigvPD9ceyA/W159XSogP1x9Pj8vLnRlc3QodHlwZSkpcmV0dXJuIHRydWU7cmV0dXJuIHR5cGVbMF09PSIlIn0sSU5UX1RZUEVTOnsiaTEiOjAsImk4IjowLCJpMTYiOjAsImkzMiI6MCwiaTY0IjowfSxGTE9BVF9UWVBFUzp7ImZsb2F0IjowLCJkb3VibGUiOjB9LG9yNjQ6KGZ1bmN0aW9uKHgseSl7dmFyIGw9eHwwfCh5fDApO3ZhciBoPShNYXRoLnJvdW5kKHgvNDI5NDk2NzI5Nil8TWF0aC5yb3VuZCh5LzQyOTQ5NjcyOTYpKSo0Mjk0OTY3Mjk2O3JldHVybiBsK2h9KSxhbmQ2NDooZnVuY3Rpb24oeCx5KXt2YXIgbD0oeHwwKSYoeXwwKTt2YXIgaD0oTWF0aC5yb3VuZCh4LzQyOTQ5NjcyOTYpJk1hdGgucm91bmQoeS80Mjk0OTY3Mjk2KSkqNDI5NDk2NzI5NjtyZXR1cm4gbCtofSkseG9yNjQ6KGZ1bmN0aW9uKHgseSl7dmFyIGw9KHh8MCleKHl8MCk7dmFyIGg9KE1hdGgucm91bmQoeC80Mjk0OTY3Mjk2KV5NYXRoLnJvdW5kKHkvNDI5NDk2NzI5NikpKjQyOTQ5NjcyOTY7cmV0dXJuIGwraH0pLGdldE5hdGl2ZVR5cGVTaXplOihmdW5jdGlvbih0eXBlKXtzd2l0Y2godHlwZSl7Y2FzZSJpMSI6Y2FzZSJpOCI6cmV0dXJuIDE7Y2FzZSJpMTYiOnJldHVybiAyO2Nhc2UiaTMyIjpyZXR1cm4gNDtjYXNlImk2NCI6cmV0dXJuIDg7Y2FzZSJmbG9hdCI6cmV0dXJuIDQ7Y2FzZSJkb3VibGUiOnJldHVybiA4O2RlZmF1bHQ6e2lmKHR5cGVbdHlwZS5sZW5ndGgtMV09PT0iKiIpe3JldHVybiBSdW50aW1lLlFVQU5UVU1fU0laRX1lbHNlIGlmKHR5cGVbMF09PT0iaSIpe3ZhciBiaXRzPXBhcnNlSW50KHR5cGUuc3Vic3RyKDEpKTthc3NlcnQoYml0cyU4PT09MCk7cmV0dXJuIGJpdHMvOH1lbHNle3JldHVybiAwfX19fSksZ2V0TmF0aXZlRmllbGRTaXplOihmdW5jdGlvbih0eXBlKXtyZXR1cm4gTWF0aC5tYXgoUnVudGltZS5nZXROYXRpdmVUeXBlU2l6ZSh0eXBlKSxSdW50aW1lLlFVQU5UVU1fU0laRSl9KSxkZWR1cDpmdW5jdGlvbiBkZWR1cChpdGVtcyxpZGVudCl7dmFyIHNlZW49e307aWYoaWRlbnQpe3JldHVybiBpdGVtcy5maWx0ZXIoKGZ1bmN0aW9uKGl0ZW0pe2lmKHNlZW5baXRlbVtpZGVudF1dKXJldHVybiBmYWxzZTtzZWVuW2l0ZW1baWRlbnRdXT10cnVlO3JldHVybiB0cnVlfSkpfWVsc2V7cmV0dXJuIGl0ZW1zLmZpbHRlcigoZnVuY3Rpb24oaXRlbSl7aWYoc2VlbltpdGVtXSlyZXR1cm4gZmFsc2U7c2VlbltpdGVtXT10cnVlO3JldHVybiB0cnVlfSkpfX0sc2V0OmZ1bmN0aW9uIHNldCgpe3ZhciBhcmdzPXR5cGVvZiBhcmd1bWVudHNbMF09PT0ib2JqZWN0Ij9hcmd1bWVudHNbMF06YXJndW1lbnRzO3ZhciByZXQ9e307Zm9yKHZhciBpPTA7aTxhcmdzLmxlbmd0aDtpKyspe3JldFthcmdzW2ldXT0wfXJldHVybiByZXR9LFNUQUNLX0FMSUdOOjgsZ2V0QWxpZ25TaXplOihmdW5jdGlvbih0eXBlLHNpemUsdmFyYXJnKXtpZighdmFyYXJnJiYodHlwZT09Imk2NCJ8fHR5cGU9PSJkb3VibGUiKSlyZXR1cm4gODtpZighdHlwZSlyZXR1cm4gTWF0aC5taW4oc2l6ZSw4KTtyZXR1cm4gTWF0aC5taW4oc2l6ZXx8KHR5cGU/UnVudGltZS5nZXROYXRpdmVGaWVsZFNpemUodHlwZSk6MCksUnVudGltZS5RVUFOVFVNX1NJWkUpfSksY2FsY3VsYXRlU3RydWN0QWxpZ25tZW50OmZ1bmN0aW9uIGNhbGN1bGF0ZVN0cnVjdEFsaWdubWVudCh0eXBlKXt0eXBlLmZsYXRTaXplPTA7dHlwZS5hbGlnblNpemU9MDt2YXIgZGlmZnM9W107dmFyIHByZXY9LTE7dmFyIGluZGV4PTA7dHlwZS5mbGF0SW5kZXhlcz10eXBlLmZpZWxkcy5tYXAoKGZ1bmN0aW9uKGZpZWxkKXtpbmRleCsrO3ZhciBzaXplLGFsaWduU2l6ZTtpZihSdW50aW1lLmlzTnVtYmVyVHlwZShmaWVsZCl8fFJ1bnRpbWUuaXNQb2ludGVyVHlwZShmaWVsZCkpe3NpemU9UnVudGltZS5nZXROYXRpdmVUeXBlU2l6ZShmaWVsZCk7YWxpZ25TaXplPVJ1bnRpbWUuZ2V0QWxpZ25TaXplKGZpZWxkLHNpemUpfWVsc2UgaWYoUnVudGltZS5pc1N0cnVjdFR5cGUoZmllbGQpKXtpZihmaWVsZFsxXT09PSIwIil7c2l6ZT0wO2lmKFR5cGVzLnR5cGVzW2ZpZWxkXSl7YWxpZ25TaXplPVJ1bnRpbWUuZ2V0QWxpZ25TaXplKG51bGwsVHlwZXMudHlwZXNbZmllbGRdLmFsaWduU2l6ZSl9ZWxzZXthbGlnblNpemU9dHlwZS5hbGlnblNpemV8fFFVQU5UVU1fU0laRX19ZWxzZXtzaXplPVR5cGVzLnR5cGVzW2ZpZWxkXS5mbGF0U2l6ZTthbGlnblNpemU9UnVudGltZS5nZXRBbGlnblNpemUobnVsbCxUeXBlcy50eXBlc1tmaWVsZF0uYWxpZ25TaXplKX19ZWxzZSBpZihmaWVsZFswXT09ImIiKXtzaXplPWZpZWxkLnN1YnN0cigxKXwwO2FsaWduU2l6ZT0xfWVsc2UgaWYoZmllbGRbMF09PT0iPCIpe3NpemU9YWxpZ25TaXplPVR5cGVzLnR5cGVzW2ZpZWxkXS5mbGF0U2l6ZX1lbHNlIGlmKGZpZWxkWzBdPT09ImkiKXtzaXplPWFsaWduU2l6ZT1wYXJzZUludChmaWVsZC5zdWJzdHIoMSkpLzg7YXNzZXJ0KHNpemUlMT09PTAsImNhbm5vdCBoYW5kbGUgbm9uLWJ5dGUtc2l6ZSBmaWVsZCAiK2ZpZWxkKX1lbHNle2Fzc2VydChmYWxzZSwiaW52YWxpZCB0eXBlIGZvciBjYWxjdWxhdGVTdHJ1Y3RBbGlnbm1lbnQiKX1pZih0eXBlLnBhY2tlZClhbGlnblNpemU9MTt0eXBlLmFsaWduU2l6ZT1NYXRoLm1heCh0eXBlLmFsaWduU2l6ZSxhbGlnblNpemUpO3ZhciBjdXJyPVJ1bnRpbWUuYWxpZ25NZW1vcnkodHlwZS5mbGF0U2l6ZSxhbGlnblNpemUpO3R5cGUuZmxhdFNpemU9Y3VycitzaXplO2lmKHByZXY+PTApe2RpZmZzLnB1c2goY3Vyci1wcmV2KX1wcmV2PWN1cnI7cmV0dXJuIGN1cnJ9KSk7aWYodHlwZS5uYW1lXyYmdHlwZS5uYW1lX1swXT09PSJbIil7dHlwZS5mbGF0U2l6ZT1wYXJzZUludCh0eXBlLm5hbWVfLnN1YnN0cigxKSkqdHlwZS5mbGF0U2l6ZS8yfXR5cGUuZmxhdFNpemU9UnVudGltZS5hbGlnbk1lbW9yeSh0eXBlLmZsYXRTaXplLHR5cGUuYWxpZ25TaXplKTtpZihkaWZmcy5sZW5ndGg9PTApe3R5cGUuZmxhdEZhY3Rvcj10eXBlLmZsYXRTaXplfWVsc2UgaWYoUnVudGltZS5kZWR1cChkaWZmcykubGVuZ3RoPT0xKXt0eXBlLmZsYXRGYWN0b3I9ZGlmZnNbMF19dHlwZS5uZWVkc0ZsYXR0ZW5pbmc9dHlwZS5mbGF0RmFjdG9yIT0xO3JldHVybiB0eXBlLmZsYXRJbmRleGVzfSxnZW5lcmF0ZVN0cnVjdEluZm86KGZ1bmN0aW9uKHN0cnVjdCx0eXBlTmFtZSxvZmZzZXQpe3ZhciB0eXBlLGFsaWdubWVudDtpZih0eXBlTmFtZSl7b2Zmc2V0PW9mZnNldHx8MDt0eXBlPSh0eXBlb2YgVHlwZXM9PT0idW5kZWZpbmVkIj9SdW50aW1lLnR5cGVJbmZvOlR5cGVzLnR5cGVzKVt0eXBlTmFtZV07aWYoIXR5cGUpcmV0dXJuIG51bGw7aWYodHlwZS5maWVsZHMubGVuZ3RoIT1zdHJ1Y3QubGVuZ3RoKXtwcmludEVycigiTnVtYmVyIG9mIG5hbWVkIGZpZWxkcyBtdXN0IG1hdGNoIHRoZSB0eXBlIGZvciAiK3R5cGVOYW1lKyI6IHBvc3NpYmx5IGR1cGxpY2F0ZSBzdHJ1Y3QgbmFtZXMuIENhbm5vdCByZXR1cm4gc3RydWN0SW5mbyIpO3JldHVybiBudWxsfWFsaWdubWVudD10eXBlLmZsYXRJbmRleGVzfWVsc2V7dmFyIHR5cGU9e2ZpZWxkczpzdHJ1Y3QubWFwKChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbVswXX0pKX07YWxpZ25tZW50PVJ1bnRpbWUuY2FsY3VsYXRlU3RydWN0QWxpZ25tZW50KHR5cGUpfXZhciByZXQ9e19fc2l6ZV9fOnR5cGUuZmxhdFNpemV9O2lmKHR5cGVOYW1lKXtzdHJ1Y3QuZm9yRWFjaCgoZnVuY3Rpb24oaXRlbSxpKXtpZih0eXBlb2YgaXRlbT09PSJzdHJpbmciKXtyZXRbaXRlbV09YWxpZ25tZW50W2ldK29mZnNldH1lbHNle3ZhciBrZXk7Zm9yKHZhciBrIGluIGl0ZW0pa2V5PWs7cmV0W2tleV09UnVudGltZS5nZW5lcmF0ZVN0cnVjdEluZm8oaXRlbVtrZXldLHR5cGUuZmllbGRzW2ldLGFsaWdubWVudFtpXSl9fSkpfWVsc2V7c3RydWN0LmZvckVhY2goKGZ1bmN0aW9uKGl0ZW0saSl7cmV0W2l0ZW1bMV1dPWFsaWdubWVudFtpXX0pKX1yZXR1cm4gcmV0fSksZHluQ2FsbDooZnVuY3Rpb24oc2lnLHB0cixhcmdzKXtpZihhcmdzJiZhcmdzLmxlbmd0aCl7aWYoIWFyZ3Muc3BsaWNlKWFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7YXJncy5zcGxpY2UoMCwwLHB0cik7cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF8iK3NpZ10uYXBwbHkobnVsbCxhcmdzKX1lbHNle3JldHVybiBNb2R1bGVbImR5bkNhbGxfIitzaWddLmNhbGwobnVsbCxwdHIpfX0pLGZ1bmN0aW9uUG9pbnRlcnM6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLGFkZEZ1bmN0aW9uOihmdW5jdGlvbihmdW5jKXtmb3IodmFyIGk9MDtpPFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVycy5sZW5ndGg7aSsrKXtpZighUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2ldKXtSdW50aW1lLmZ1bmN0aW9uUG9pbnRlcnNbaV09ZnVuYztyZXR1cm4gMiooMStpKX19dGhyb3ciRmluaXNoZWQgdXAgYWxsIHJlc2VydmVkIGZ1bmN0aW9uIHBvaW50ZXJzLiBVc2UgYSBoaWdoZXIgdmFsdWUgZm9yIFJFU0VSVkVEX0ZVTkNUSU9OX1BPSU5URVJTLiJ9KSxyZW1vdmVGdW5jdGlvbjooZnVuY3Rpb24oaW5kZXgpe1J1bnRpbWUuZnVuY3Rpb25Qb2ludGVyc1soaW5kZXgtMikvMl09bnVsbH0pLGdldEFzbUNvbnN0OihmdW5jdGlvbihjb2RlLG51bUFyZ3Mpe2lmKCFSdW50aW1lLmFzbUNvbnN0Q2FjaGUpUnVudGltZS5hc21Db25zdENhY2hlPXt9O3ZhciBmdW5jPVJ1bnRpbWUuYXNtQ29uc3RDYWNoZVtjb2RlXTtpZihmdW5jKXJldHVybiBmdW5jO3ZhciBhcmdzPVtdO2Zvcih2YXIgaT0wO2k8bnVtQXJncztpKyspe2FyZ3MucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDM2KStpKX12YXIgc291cmNlPVBvaW50ZXJfc3RyaW5naWZ5KGNvZGUpO2lmKHNvdXJjZVswXT09PSciJyl7aWYoc291cmNlLmluZGV4T2YoJyInLDEpPT09c291cmNlLmxlbmd0aC0xKXtzb3VyY2U9c291cmNlLnN1YnN0cigxLHNvdXJjZS5sZW5ndGgtMil9ZWxzZXthYm9ydCgiaW52YWxpZCBFTV9BU00gaW5wdXQgfCIrc291cmNlKyJ8LiBQbGVhc2UgdXNlIEVNX0FTTSguLmNvZGUuLikgKG5vIHF1b3Rlcykgb3IgRU1fQVNNKHsgLi5jb2RlKCQwKS4uIH0sIGlucHV0KSAodG8gaW5wdXQgdmFsdWVzKSIpfX10cnl7dmFyIGV2YWxsZWQ9ZXZhbCgiKGZ1bmN0aW9uKCIrYXJncy5qb2luKCIsIikrIil7ICIrc291cmNlKyIgfSkiKX1jYXRjaChlKXtNb2R1bGUucHJpbnRFcnIoImVycm9yIGluIGV4ZWN1dGluZyBpbmxpbmUgRU1fQVNNIGNvZGU6ICIrZSsiIG9uOiBcblxuIitzb3VyY2UrIlxuXG53aXRoIGFyZ3MgfCIrYXJncysifCAobWFrZSBzdXJlIHRvIHVzZSB0aGUgcmlnaHQgb25lIG91dCBvZiBFTV9BU00sIEVNX0FTTV9BUkdTLCBldGMuKSIpO3Rocm93IGV9cmV0dXJuIFJ1bnRpbWUuYXNtQ29uc3RDYWNoZVtjb2RlXT1ldmFsbGVkfSksd2Fybk9uY2U6KGZ1bmN0aW9uKHRleHQpe2lmKCFSdW50aW1lLndhcm5PbmNlLnNob3duKVJ1bnRpbWUud2Fybk9uY2Uuc2hvd249e307aWYoIVJ1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF0pe1J1bnRpbWUud2Fybk9uY2Uuc2hvd25bdGV4dF09MTtNb2R1bGUucHJpbnRFcnIodGV4dCl9fSksZnVuY1dyYXBwZXJzOnt9LGdldEZ1bmNXcmFwcGVyOihmdW5jdGlvbihmdW5jLHNpZyl7YXNzZXJ0KHNpZyk7aWYoIVJ1bnRpbWUuZnVuY1dyYXBwZXJzW2Z1bmNdKXtSdW50aW1lLmZ1bmNXcmFwcGVyc1tmdW5jXT1mdW5jdGlvbiBkeW5DYWxsX3dyYXBwZXIoKXtyZXR1cm4gUnVudGltZS5keW5DYWxsKHNpZyxmdW5jLGFyZ3VtZW50cyl9fXJldHVybiBSdW50aW1lLmZ1bmNXcmFwcGVyc1tmdW5jXX0pLFVURjhQcm9jZXNzb3I6KGZ1bmN0aW9uKCl7dmFyIGJ1ZmZlcj1bXTt2YXIgbmVlZGVkPTA7dGhpcy5wcm9jZXNzQ0NoYXI9KGZ1bmN0aW9uKGNvZGUpe2NvZGU9Y29kZSYyNTU7aWYoYnVmZmVyLmxlbmd0aD09MCl7aWYoKGNvZGUmMTI4KT09MCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSl9YnVmZmVyLnB1c2goY29kZSk7aWYoKGNvZGUmMjI0KT09MTkyKXtuZWVkZWQ9MX1lbHNlIGlmKChjb2RlJjI0MCk9PTIyNCl7bmVlZGVkPTJ9ZWxzZXtuZWVkZWQ9M31yZXR1cm4iIn1pZihuZWVkZWQpe2J1ZmZlci5wdXNoKGNvZGUpO25lZWRlZC0tO2lmKG5lZWRlZD4wKXJldHVybiIifXZhciBjMT1idWZmZXJbMF07dmFyIGMyPWJ1ZmZlclsxXTt2YXIgYzM9YnVmZmVyWzJdO3ZhciBjND1idWZmZXJbM107dmFyIHJldDtpZihidWZmZXIubGVuZ3RoPT0yKXtyZXQ9U3RyaW5nLmZyb21DaGFyQ29kZSgoYzEmMzEpPDw2fGMyJjYzKX1lbHNlIGlmKGJ1ZmZlci5sZW5ndGg9PTMpe3JldD1TdHJpbmcuZnJvbUNoYXJDb2RlKChjMSYxNSk8PDEyfChjMiY2Myk8PDZ8YzMmNjMpfWVsc2V7dmFyIGNvZGVQb2ludD0oYzEmNyk8PDE4fChjMiY2Myk8PDEyfChjMyY2Myk8PDZ8YzQmNjM7cmV0PVN0cmluZy5mcm9tQ2hhckNvZGUoTWF0aC5mbG9vcigoY29kZVBvaW50LTY1NTM2KS8xMDI0KSs1NTI5NiwoY29kZVBvaW50LTY1NTM2KSUxMDI0KzU2MzIwKX1idWZmZXIubGVuZ3RoPTA7cmV0dXJuIHJldH0pO3RoaXMucHJvY2Vzc0pTU3RyaW5nPWZ1bmN0aW9uIHByb2Nlc3NKU1N0cmluZyhzdHJpbmcpe3N0cmluZz11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nKSk7dmFyIHJldD1bXTtmb3IodmFyIGk9MDtpPHN0cmluZy5sZW5ndGg7aSsrKXtyZXQucHVzaChzdHJpbmcuY2hhckNvZGVBdChpKSl9cmV0dXJuIHJldH19KSxnZXRDb21waWxlclNldHRpbmc6KGZ1bmN0aW9uKG5hbWUpe3Rocm93IllvdSBtdXN0IGJ1aWxkIHdpdGggLXMgUkVUQUlOX0NPTVBJTEVSX1NFVFRJTkdTPTEgZm9yIFJ1bnRpbWUuZ2V0Q29tcGlsZXJTZXR0aW5nIG9yIGVtc2NyaXB0ZW5fZ2V0X2NvbXBpbGVyX3NldHRpbmcgdG8gd29yayJ9KSxzdGFja0FsbG9jOihmdW5jdGlvbihzaXplKXt2YXIgcmV0PVNUQUNLVE9QO1NUQUNLVE9QPVNUQUNLVE9QK3NpemV8MDtTVEFDS1RPUD1TVEFDS1RPUCs3Ji04O3JldHVybiByZXR9KSxzdGF0aWNBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyIHJldD1TVEFUSUNUT1A7U1RBVElDVE9QPVNUQVRJQ1RPUCtzaXplfDA7U1RBVElDVE9QPVNUQVRJQ1RPUCs3Ji04O3JldHVybiByZXR9KSxkeW5hbWljQWxsb2M6KGZ1bmN0aW9uKHNpemUpe3ZhciByZXQ9RFlOQU1JQ1RPUDtEWU5BTUlDVE9QPURZTkFNSUNUT1Arc2l6ZXwwO0RZTkFNSUNUT1A9RFlOQU1JQ1RPUCs3Ji04O2lmKERZTkFNSUNUT1A+PVRPVEFMX01FTU9SWSllbmxhcmdlTWVtb3J5KCk7cmV0dXJuIHJldH0pLGFsaWduTWVtb3J5OihmdW5jdGlvbihzaXplLHF1YW50dW0pe3ZhciByZXQ9c2l6ZT1NYXRoLmNlaWwoc2l6ZS8ocXVhbnR1bT9xdWFudHVtOjgpKSoocXVhbnR1bT9xdWFudHVtOjgpO3JldHVybiByZXR9KSxtYWtlQmlnSW50OihmdW5jdGlvbihsb3csaGlnaCx1bnNpZ25lZCl7dmFyIHJldD11bnNpZ25lZD8rKGxvdz4+PjApKyArKGhpZ2g+Pj4wKSorNDI5NDk2NzI5NjorKGxvdz4+PjApKyArKGhpZ2h8MCkqKzQyOTQ5NjcyOTY7cmV0dXJuIHJldH0pLEdMT0JBTF9CQVNFOjgsUVVBTlRVTV9TSVpFOjQsX19kdW1teV9fOjB9O01vZHVsZVsiUnVudGltZSJdPVJ1bnRpbWU7ZnVuY3Rpb24ganNDYWxsKCl7dmFyIGFyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2FyZ3NbMF1dLmFwcGx5KG51bGwsYXJncy5zbGljZSgxKSl9dmFyIF9fVEhSRVdfXz0wO3ZhciBBQk9SVD1mYWxzZTt2YXIgRVhJVFNUQVRVUz0wO3ZhciB1bmRlZj0wO3ZhciB0ZW1wVmFsdWUsdGVtcEludCx0ZW1wQmlnSW50LHRlbXBJbnQyLHRlbXBCaWdJbnQyLHRlbXBQYWlyLHRlbXBCaWdJbnRJLHRlbXBCaWdJbnRSLHRlbXBCaWdJbnRTLHRlbXBCaWdJbnRQLHRlbXBCaWdJbnRELHRlbXBEb3VibGUsdGVtcEZsb2F0O3ZhciB0ZW1wSTY0LHRlbXBJNjRiO3ZhciB0ZW1wUmV0MCx0ZW1wUmV0MSx0ZW1wUmV0Mix0ZW1wUmV0Myx0ZW1wUmV0NCx0ZW1wUmV0NSx0ZW1wUmV0Nix0ZW1wUmV0Nyx0ZW1wUmV0OCx0ZW1wUmV0OTtmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiK3RleHQpfX12YXIgZ2xvYmFsU2NvcGU9dGhpcztmdW5jdGlvbiBnZXRDRnVuYyhpZGVudCl7dHJ5e3ZhciBmdW5jPU1vZHVsZVsiXyIraWRlbnRdO2lmKCFmdW5jKWZ1bmM9ZXZhbCgiXyIraWRlbnQpfWNhdGNoKGUpe31hc3NlcnQoZnVuYywiQ2Fubm90IGNhbGwgdW5rbm93biBmdW5jdGlvbiAiK2lkZW50KyIgKHBlcmhhcHMgTExWTSBvcHRpbWl6YXRpb25zIG9yIGNsb3N1cmUgcmVtb3ZlZCBpdD8pIik7cmV0dXJuIGZ1bmN9dmFyIGN3cmFwLGNjYWxsOygoZnVuY3Rpb24oKXt2YXIgc3RhY2s9MDt2YXIgSlNmdW5jcz17InN0YWNrU2F2ZSI6KGZ1bmN0aW9uKCl7c3RhY2s9UnVudGltZS5zdGFja1NhdmUoKX0pLCJzdGFja1Jlc3RvcmUiOihmdW5jdGlvbigpe1J1bnRpbWUuc3RhY2tSZXN0b3JlKHN0YWNrKX0pLCJhcnJheVRvQyI6KGZ1bmN0aW9uKGFycil7dmFyIHJldD1SdW50aW1lLnN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVybiByZXR9KSwic3RyaW5nVG9DIjooZnVuY3Rpb24oc3RyKXt2YXIgcmV0PTA7aWYoc3RyIT09bnVsbCYmc3RyIT09dW5kZWZpbmVkJiZzdHIhPT0wKXtyZXQ9UnVudGltZS5zdGFja0FsbG9jKHN0ci5sZW5ndGgrMSk7d3JpdGVTdHJpbmdUb01lbW9yeShzdHIscmV0KX1yZXR1cm4gcmV0fSl9O3ZhciB0b0M9eyJzdHJpbmciOkpTZnVuY3NbInN0cmluZ1RvQyJdLCJhcnJheSI6SlNmdW5jc1siYXJyYXlUb0MiXX07Y2NhbGw9ZnVuY3Rpb24gY2NhbGxGdW5jKGlkZW50LHJldHVyblR5cGUsYXJnVHlwZXMsYXJncyl7dmFyIGZ1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBjQXJncz1bXTtpZihhcmdzKXtmb3IodmFyIGk9MDtpPGFyZ3MubGVuZ3RoO2krKyl7dmFyIGNvbnZlcnRlcj10b0NbYXJnVHlwZXNbaV1dO2lmKGNvbnZlcnRlcil7aWYoc3RhY2s9PT0wKXN0YWNrPVJ1bnRpbWUuc3RhY2tTYXZlKCk7Y0FyZ3NbaV09Y29udmVydGVyKGFyZ3NbaV0pfWVsc2V7Y0FyZ3NbaV09YXJnc1tpXX19fXZhciByZXQ9ZnVuYy5hcHBseShudWxsLGNBcmdzKTtpZihyZXR1cm5UeXBlPT09InN0cmluZyIpcmV0PVBvaW50ZXJfc3RyaW5naWZ5KHJldCk7aWYoc3RhY2shPT0wKUpTZnVuY3NbInN0YWNrUmVzdG9yZSJdKCk7cmV0dXJuIHJldH07dmFyIHNvdXJjZVJlZ2V4PS9eZnVuY3Rpb25cc1woKFteKV0qKVwpXHMqe1xzKihbXipdKj8pW1xzO10qKD86cmV0dXJuXHMqKC4qPylbO1xzXSopP30kLztmdW5jdGlvbiBwYXJzZUpTRnVuYyhqc2Z1bmMpe3ZhciBwYXJzZWQ9anNmdW5jLnRvU3RyaW5nKCkubWF0Y2goc291cmNlUmVnZXgpLnNsaWNlKDEpO3JldHVybnthcmd1bWVudHM6cGFyc2VkWzBdLGJvZHk6cGFyc2VkWzFdLHJldHVyblZhbHVlOnBhcnNlZFsyXX19dmFyIEpTc291cmNlPXt9O2Zvcih2YXIgZnVuIGluIEpTZnVuY3Mpe2lmKEpTZnVuY3MuaGFzT3duUHJvcGVydHkoZnVuKSl7SlNzb3VyY2VbZnVuXT1wYXJzZUpTRnVuYyhKU2Z1bmNzW2Z1bl0pfX1jd3JhcD1mdW5jdGlvbiBjd3JhcChpZGVudCxyZXR1cm5UeXBlLGFyZ1R5cGVzKXt2YXIgY2Z1bmM9Z2V0Q0Z1bmMoaWRlbnQpO3ZhciBudW1lcmljQXJncz1hcmdUeXBlcy5ldmVyeSgoZnVuY3Rpb24odHlwZSl7cmV0dXJuIHR5cGU9PT0ibnVtYmVyIn0pKTt2YXIgbnVtZXJpY1JldD1yZXR1cm5UeXBlIT09InN0cmluZyI7aWYobnVtZXJpY1JldCYmbnVtZXJpY0FyZ3Mpe3JldHVybiBjZnVuY312YXIgYXJnTmFtZXM9YXJnVHlwZXMubWFwKChmdW5jdGlvbih4LGkpe3JldHVybiIkIitpfSkpO3ZhciBmdW5jc3RyPSIoZnVuY3Rpb24oIithcmdOYW1lcy5qb2luKCIsIikrIikgeyI7dmFyIG5hcmdzPWFyZ1R5cGVzLmxlbmd0aDtpZighbnVtZXJpY0FyZ3Mpe2Z1bmNzdHIrPUpTc291cmNlWyJzdGFja1NhdmUiXS5ib2R5KyI7Ijtmb3IodmFyIGk9MDtpPG5hcmdzO2krKyl7dmFyIGFyZz1hcmdOYW1lc1tpXSx0eXBlPWFyZ1R5cGVzW2ldO2lmKHR5cGU9PT0ibnVtYmVyIiljb250aW51ZTt2YXIgY29udmVydENvZGU9SlNzb3VyY2VbdHlwZSsiVG9DIl07ZnVuY3N0cis9InZhciAiK2NvbnZlcnRDb2RlLmFyZ3VtZW50cysiID0gIithcmcrIjsiO2Z1bmNzdHIrPWNvbnZlcnRDb2RlLmJvZHkrIjsiO2Z1bmNzdHIrPWFyZysiPSIrY29udmVydENvZGUucmV0dXJuVmFsdWUrIjsifX12YXIgY2Z1bmNuYW1lPXBhcnNlSlNGdW5jKChmdW5jdGlvbigpe3JldHVybiBjZnVuY30pKS5yZXR1cm5WYWx1ZTtmdW5jc3RyKz0idmFyIHJldCA9ICIrY2Z1bmNuYW1lKyIoIithcmdOYW1lcy5qb2luKCIsIikrIik7IjtpZighbnVtZXJpY1JldCl7dmFyIHN0cmdmeT1wYXJzZUpTRnVuYygoZnVuY3Rpb24oKXtyZXR1cm4gUG9pbnRlcl9zdHJpbmdpZnl9KSkucmV0dXJuVmFsdWU7ZnVuY3N0cis9InJldCA9ICIrc3RyZ2Z5KyIocmV0KTsifWlmKCFudW1lcmljQXJncyl7ZnVuY3N0cis9SlNzb3VyY2VbInN0YWNrUmVzdG9yZSJdLmJvZHkrIjsifWZ1bmNzdHIrPSJyZXR1cm4gcmV0fSkiO3JldHVybiBldmFsKGZ1bmNzdHIpfX0pKSgpO01vZHVsZVsiY3dyYXAiXT1jd3JhcDtNb2R1bGVbImNjYWxsIl09Y2NhbGw7ZnVuY3Rpb24gc2V0VmFsdWUocHRyLHZhbHVlLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fCJpOCI7aWYodHlwZS5jaGFyQXQodHlwZS5sZW5ndGgtMSk9PT0iKiIpdHlwZT0iaTMyIjtzd2l0Y2godHlwZSl7Y2FzZSJpMSI6SEVBUDhbcHRyPj4wXT12YWx1ZTticmVhaztjYXNlImk4IjpIRUFQOFtwdHI+PjBdPXZhbHVlO2JyZWFrO2Nhc2UiaTE2IjpIRUFQMTZbcHRyPj4xXT12YWx1ZTticmVhaztjYXNlImkzMiI6SEVBUDMyW3B0cj4+Ml09dmFsdWU7YnJlYWs7Y2FzZSJpNjQiOnRlbXBJNjQ9W3ZhbHVlPj4+MCwodGVtcERvdWJsZT12YWx1ZSwrTWF0aF9hYnModGVtcERvdWJsZSk+PSsxP3RlbXBEb3VibGU+KzA/KE1hdGhfbWluKCtNYXRoX2Zsb29yKHRlbXBEb3VibGUvKzQyOTQ5NjcyOTYpLCs0Mjk0OTY3Mjk1KXwwKT4+PjA6fn4rTWF0aF9jZWlsKCh0ZW1wRG91YmxlLSArKH5+dGVtcERvdWJsZT4+PjApKS8rNDI5NDk2NzI5Nik+Pj4wOjApXSxIRUFQMzJbcHRyPj4yXT10ZW1wSTY0WzBdLEhFQVAzMltwdHIrND4+Ml09dGVtcEk2NFsxXTticmVhaztjYXNlImZsb2F0IjpIRUFQRjMyW3B0cj4+Ml09dmFsdWU7YnJlYWs7Y2FzZSJkb3VibGUiOkhFQVBGNjRbcHRyPj4zXT12YWx1ZTticmVhaztkZWZhdWx0OmFib3J0KCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiAiK3R5cGUpfX1Nb2R1bGVbInNldFZhbHVlIl09c2V0VmFsdWU7ZnVuY3Rpb24gZ2V0VmFsdWUocHRyLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fCJpOCI7aWYodHlwZS5jaGFyQXQodHlwZS5sZW5ndGgtMSk9PT0iKiIpdHlwZT0iaTMyIjtzd2l0Y2godHlwZSl7Y2FzZSJpMSI6cmV0dXJuIEhFQVA4W3B0cj4+MF07Y2FzZSJpOCI6cmV0dXJuIEhFQVA4W3B0cj4+MF07Y2FzZSJpMTYiOnJldHVybiBIRUFQMTZbcHRyPj4xXTtjYXNlImkzMiI6cmV0dXJuIEhFQVAzMltwdHI+PjJdO2Nhc2UiaTY0IjpyZXR1cm4gSEVBUDMyW3B0cj4+Ml07Y2FzZSJmbG9hdCI6cmV0dXJuIEhFQVBGMzJbcHRyPj4yXTtjYXNlImRvdWJsZSI6cmV0dXJuIEhFQVBGNjRbcHRyPj4zXTtkZWZhdWx0OmFib3J0KCJpbnZhbGlkIHR5cGUgZm9yIHNldFZhbHVlOiAiK3R5cGUpfXJldHVybiBudWxsfU1vZHVsZVsiZ2V0VmFsdWUiXT1nZXRWYWx1ZTt2YXIgQUxMT0NfTk9STUFMPTA7dmFyIEFMTE9DX1NUQUNLPTE7dmFyIEFMTE9DX1NUQVRJQz0yO3ZhciBBTExPQ19EWU5BTUlDPTM7dmFyIEFMTE9DX05PTkU9NDtNb2R1bGVbIkFMTE9DX05PUk1BTCJdPUFMTE9DX05PUk1BTDtNb2R1bGVbIkFMTE9DX1NUQUNLIl09QUxMT0NfU1RBQ0s7TW9kdWxlWyJBTExPQ19TVEFUSUMiXT1BTExPQ19TVEFUSUM7TW9kdWxlWyJBTExPQ19EWU5BTUlDIl09QUxMT0NfRFlOQU1JQztNb2R1bGVbIkFMTE9DX05PTkUiXT1BTExPQ19OT05FO2Z1bmN0aW9uIGFsbG9jYXRlKHNsYWIsdHlwZXMsYWxsb2NhdG9yLHB0cil7dmFyIHplcm9pbml0LHNpemU7aWYodHlwZW9mIHNsYWI9PT0ibnVtYmVyIil7emVyb2luaXQ9dHJ1ZTtzaXplPXNsYWJ9ZWxzZXt6ZXJvaW5pdD1mYWxzZTtzaXplPXNsYWIubGVuZ3RofXZhciBzaW5nbGVUeXBlPXR5cGVvZiB0eXBlcz09PSJzdHJpbmciP3R5cGVzOm51bGw7dmFyIHJldDtpZihhbGxvY2F0b3I9PUFMTE9DX05PTkUpe3JldD1wdHJ9ZWxzZXtyZXQ9W19tYWxsb2MsUnVudGltZS5zdGFja0FsbG9jLFJ1bnRpbWUuc3RhdGljQWxsb2MsUnVudGltZS5keW5hbWljQWxsb2NdW2FsbG9jYXRvcj09PXVuZGVmaW5lZD9BTExPQ19TVEFUSUM6YWxsb2NhdG9yXShNYXRoLm1heChzaXplLHNpbmdsZVR5cGU/MTp0eXBlcy5sZW5ndGgpKX1pZih6ZXJvaW5pdCl7dmFyIHB0cj1yZXQsc3RvcDthc3NlcnQoKHJldCYzKT09MCk7c3RvcD1yZXQrKHNpemUmfjMpO2Zvcig7cHRyPHN0b3A7cHRyKz00KXtIRUFQMzJbcHRyPj4yXT0wfXN0b3A9cmV0K3NpemU7d2hpbGUocHRyPHN0b3Ape0hFQVA4W3B0cisrPj4wXT0wfXJldHVybiByZXR9aWYoc2luZ2xlVHlwZT09PSJpOCIpe2lmKHNsYWIuc3ViYXJyYXl8fHNsYWIuc2xpY2Upe0hFQVBVOC5zZXQoc2xhYixyZXQpfWVsc2V7SEVBUFU4LnNldChuZXcgVWludDhBcnJheShzbGFiKSxyZXQpfXJldHVybiByZXR9dmFyIGk9MCx0eXBlLHR5cGVTaXplLHByZXZpb3VzVHlwZTt3aGlsZShpPHNpemUpe3ZhciBjdXJyPXNsYWJbaV07aWYodHlwZW9mIGN1cnI9PT0iZnVuY3Rpb24iKXtjdXJyPVJ1bnRpbWUuZ2V0RnVuY3Rpb25JbmRleChjdXJyKX10eXBlPXNpbmdsZVR5cGV8fHR5cGVzW2ldO2lmKHR5cGU9PT0wKXtpKys7Y29udGludWV9aWYodHlwZT09Imk2NCIpdHlwZT0iaTMyIjtzZXRWYWx1ZShyZXQraSxjdXJyLHR5cGUpO2lmKHByZXZpb3VzVHlwZSE9PXR5cGUpe3R5cGVTaXplPVJ1bnRpbWUuZ2V0TmF0aXZlVHlwZVNpemUodHlwZSk7cHJldmlvdXNUeXBlPXR5cGV9aSs9dHlwZVNpemV9cmV0dXJuIHJldH1Nb2R1bGVbImFsbG9jYXRlIl09YWxsb2NhdGU7ZnVuY3Rpb24gUG9pbnRlcl9zdHJpbmdpZnkocHRyLGxlbmd0aCl7dmFyIGhhc1V0Zj1mYWxzZTt2YXIgdDt2YXIgaT0wO3doaWxlKDEpe3Q9SEVBUFU4W3B0citpPj4wXTtpZih0Pj0xMjgpaGFzVXRmPXRydWU7ZWxzZSBpZih0PT0wJiYhbGVuZ3RoKWJyZWFrO2krKztpZihsZW5ndGgmJmk9PWxlbmd0aClicmVha31pZighbGVuZ3RoKWxlbmd0aD1pO3ZhciByZXQ9IiI7aWYoIWhhc1V0Zil7dmFyIE1BWF9DSFVOSz0xMDI0O3ZhciBjdXJyO3doaWxlKGxlbmd0aD4wKXtjdXJyPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLEhFQVBVOC5zdWJhcnJheShwdHIscHRyK01hdGgubWluKGxlbmd0aCxNQVhfQ0hVTkspKSk7cmV0PXJldD9yZXQrY3VycjpjdXJyO3B0cis9TUFYX0NIVU5LO2xlbmd0aC09TUFYX0NIVU5LfXJldHVybiByZXR9dmFyIHV0Zjg9bmV3IFJ1bnRpbWUuVVRGOFByb2Nlc3Nvcjtmb3IoaT0wO2k8bGVuZ3RoO2krKyl7dD1IRUFQVThbcHRyK2k+PjBdO3JldCs9dXRmOC5wcm9jZXNzQ0NoYXIodCl9cmV0dXJuIHJldH1Nb2R1bGVbIlBvaW50ZXJfc3RyaW5naWZ5Il09UG9pbnRlcl9zdHJpbmdpZnk7ZnVuY3Rpb24gVVRGMTZUb1N0cmluZyhwdHIpe3ZhciBpPTA7dmFyIHN0cj0iIjt3aGlsZSgxKXt2YXIgY29kZVVuaXQ9SEVBUDE2W3B0citpKjI+PjFdO2lmKGNvZGVVbml0PT0wKXJldHVybiBzdHI7KytpO3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZShjb2RlVW5pdCl9fU1vZHVsZVsiVVRGMTZUb1N0cmluZyJdPVVURjE2VG9TdHJpbmc7ZnVuY3Rpb24gc3RyaW5nVG9VVEYxNihzdHIsb3V0UHRyKXtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXt2YXIgY29kZVVuaXQ9c3RyLmNoYXJDb2RlQXQoaSk7SEVBUDE2W291dFB0citpKjI+PjFdPWNvZGVVbml0fUhFQVAxNltvdXRQdHIrc3RyLmxlbmd0aCoyPj4xXT0wfU1vZHVsZVsic3RyaW5nVG9VVEYxNiJdPXN0cmluZ1RvVVRGMTY7ZnVuY3Rpb24gVVRGMzJUb1N0cmluZyhwdHIpe3ZhciBpPTA7dmFyIHN0cj0iIjt3aGlsZSgxKXt2YXIgdXRmMzI9SEVBUDMyW3B0citpKjQ+PjJdO2lmKHV0ZjMyPT0wKXJldHVybiBzdHI7KytpO2lmKHV0ZjMyPj02NTUzNil7dmFyIGNoPXV0ZjMyLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9ZWxzZXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodXRmMzIpfX19TW9kdWxlWyJVVEYzMlRvU3RyaW5nIl09VVRGMzJUb1N0cmluZztmdW5jdGlvbiBzdHJpbmdUb1VURjMyKHN0cixvdXRQdHIpe3ZhciBpQ2hhcj0wO2Zvcih2YXIgaUNvZGVVbml0PTA7aUNvZGVVbml0PHN0ci5sZW5ndGg7KytpQ29kZVVuaXQpe3ZhciBjb2RlVW5pdD1zdHIuY2hhckNvZGVBdChpQ29kZVVuaXQpO2lmKGNvZGVVbml0Pj01NTI5NiYmY29kZVVuaXQ8PTU3MzQzKXt2YXIgdHJhaWxTdXJyb2dhdGU9c3RyLmNoYXJDb2RlQXQoKytpQ29kZVVuaXQpO2NvZGVVbml0PTY1NTM2KygoY29kZVVuaXQmMTAyMyk8PDEwKXx0cmFpbFN1cnJvZ2F0ZSYxMDIzfUhFQVAzMltvdXRQdHIraUNoYXIqND4+Ml09Y29kZVVuaXQ7KytpQ2hhcn1IRUFQMzJbb3V0UHRyK2lDaGFyKjQ+PjJdPTB9TW9kdWxlWyJzdHJpbmdUb1VURjMyIl09c3RyaW5nVG9VVEYzMjtmdW5jdGlvbiBkZW1hbmdsZShmdW5jKXt2YXIgaT0zO3ZhciBiYXNpY1R5cGVzPXsidiI6InZvaWQiLCJiIjoiYm9vbCIsImMiOiJjaGFyIiwicyI6InNob3J0IiwiaSI6ImludCIsImwiOiJsb25nIiwiZiI6ImZsb2F0IiwiZCI6ImRvdWJsZSIsInciOiJ3Y2hhcl90IiwiYSI6InNpZ25lZCBjaGFyIiwiaCI6InVuc2lnbmVkIGNoYXIiLCJ0IjoidW5zaWduZWQgc2hvcnQiLCJqIjoidW5zaWduZWQgaW50IiwibSI6InVuc2lnbmVkIGxvbmciLCJ4IjoibG9uZyBsb25nIiwieSI6InVuc2lnbmVkIGxvbmcgbG9uZyIsInoiOiIuLi4ifTt2YXIgc3Vicz1bXTt2YXIgZmlyc3Q9dHJ1ZTtmdW5jdGlvbiBkdW1wKHgpe2lmKHgpTW9kdWxlLnByaW50KHgpO01vZHVsZS5wcmludChmdW5jKTt2YXIgcHJlPSIiO2Zvcih2YXIgYT0wO2E8aTthKyspcHJlKz0iICI7TW9kdWxlLnByaW50KHByZSsiXiIpfWZ1bmN0aW9uIHBhcnNlTmVzdGVkKCl7aSsrO2lmKGZ1bmNbaV09PT0iSyIpaSsrO3ZhciBwYXJ0cz1bXTt3aGlsZShmdW5jW2ldIT09IkUiKXtpZihmdW5jW2ldPT09IlMiKXtpKys7dmFyIG5leHQ9ZnVuYy5pbmRleE9mKCJfIixpKTt2YXIgbnVtPWZ1bmMuc3Vic3RyaW5nKGksbmV4dCl8fDA7cGFydHMucHVzaChzdWJzW251bV18fCI/Iik7aT1uZXh0KzE7Y29udGludWV9aWYoZnVuY1tpXT09PSJDIil7cGFydHMucHVzaChwYXJ0c1twYXJ0cy5sZW5ndGgtMV0pO2krPTI7Y29udGludWV9dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO3ZhciBwcmU9c2l6ZS50b1N0cmluZygpLmxlbmd0aDtpZighc2l6ZXx8IXByZSl7aS0tO2JyZWFrfXZhciBjdXJyPWZ1bmMuc3Vic3RyKGkrcHJlLHNpemUpO3BhcnRzLnB1c2goY3Vycik7c3Vicy5wdXNoKGN1cnIpO2krPXByZStzaXplfWkrKztyZXR1cm4gcGFydHN9ZnVuY3Rpb24gcGFyc2UocmF3TGlzdCxsaW1pdCxhbGxvd1ZvaWQpe2xpbWl0PWxpbWl0fHxJbmZpbml0eTt2YXIgcmV0PSIiLGxpc3Q9W107ZnVuY3Rpb24gZmx1c2hMaXN0KCl7cmV0dXJuIigiK2xpc3Quam9pbigiLCAiKSsiKSJ9dmFyIG5hbWU7aWYoZnVuY1tpXT09PSJOIil7bmFtZT1wYXJzZU5lc3RlZCgpLmpvaW4oIjo6Iik7bGltaXQtLTtpZihsaW1pdD09PTApcmV0dXJuIHJhd0xpc3Q/W25hbWVdOm5hbWV9ZWxzZXtpZihmdW5jW2ldPT09IksifHxmaXJzdCYmZnVuY1tpXT09PSJMIilpKys7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2lmKHNpemUpe3ZhciBwcmU9c2l6ZS50b1N0cmluZygpLmxlbmd0aDtuYW1lPWZ1bmMuc3Vic3RyKGkrcHJlLHNpemUpO2krPXByZStzaXplfX1maXJzdD1mYWxzZTtpZihmdW5jW2ldPT09IkkiKXtpKys7dmFyIGlMaXN0PXBhcnNlKHRydWUpO3ZhciBpUmV0PXBhcnNlKHRydWUsMSx0cnVlKTtyZXQrPWlSZXRbMF0rIiAiK25hbWUrIjwiK2lMaXN0LmpvaW4oIiwgIikrIj4ifWVsc2V7cmV0PW5hbWV9cGFyYW1Mb29wOndoaWxlKGk8ZnVuYy5sZW5ndGgmJmxpbWl0LS0+MCl7dmFyIGM9ZnVuY1tpKytdO2lmKGMgaW4gYmFzaWNUeXBlcyl7bGlzdC5wdXNoKGJhc2ljVHlwZXNbY10pfWVsc2V7c3dpdGNoKGMpe2Nhc2UiUCI6bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXSsiKiIpO2JyZWFrO2Nhc2UiUiI6bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXSsiJiIpO2JyZWFrO2Nhc2UiTCI6e2krKzt2YXIgZW5kPWZ1bmMuaW5kZXhPZigiRSIsaSk7dmFyIHNpemU9ZW5kLWk7bGlzdC5wdXNoKGZ1bmMuc3Vic3RyKGksc2l6ZSkpO2krPXNpemUrMjticmVha307Y2FzZSJBIjp7dmFyIHNpemU9cGFyc2VJbnQoZnVuYy5zdWJzdHIoaSkpO2krPXNpemUudG9TdHJpbmcoKS5sZW5ndGg7aWYoZnVuY1tpXSE9PSJfIil0aHJvdyI/IjtpKys7bGlzdC5wdXNoKHBhcnNlKHRydWUsMSx0cnVlKVswXSsiIFsiK3NpemUrIl0iKTticmVha307Y2FzZSJFIjpicmVhayBwYXJhbUxvb3A7ZGVmYXVsdDpyZXQrPSI/IitjO2JyZWFrIHBhcmFtTG9vcH19fWlmKCFhbGxvd1ZvaWQmJmxpc3QubGVuZ3RoPT09MSYmbGlzdFswXT09PSJ2b2lkIilsaXN0PVtdO2lmKHJhd0xpc3Qpe2lmKHJldCl7bGlzdC5wdXNoKHJldCsiPyIpfXJldHVybiBsaXN0fWVsc2V7cmV0dXJuIHJldCtmbHVzaExpc3QoKX19dHJ5e2lmKGZ1bmM9PSJPYmplY3QuX21haW4ifHxmdW5jPT0iX21haW4iKXtyZXR1cm4ibWFpbigpIn1pZih0eXBlb2YgZnVuYz09PSJudW1iZXIiKWZ1bmM9UG9pbnRlcl9zdHJpbmdpZnkoZnVuYyk7aWYoZnVuY1swXSE9PSJfIilyZXR1cm4gZnVuYztpZihmdW5jWzFdIT09Il8iKXJldHVybiBmdW5jO2lmKGZ1bmNbMl0hPT0iWiIpcmV0dXJuIGZ1bmM7c3dpdGNoKGZ1bmNbM10pe2Nhc2UibiI6cmV0dXJuIm9wZXJhdG9yIG5ldygpIjtjYXNlImQiOnJldHVybiJvcGVyYXRvciBkZWxldGUoKSJ9cmV0dXJuIHBhcnNlKCl9Y2F0Y2goZSl7cmV0dXJuIGZ1bmN9fWZ1bmN0aW9uIGRlbWFuZ2xlQWxsKHRleHQpe3JldHVybiB0ZXh0LnJlcGxhY2UoL19fWltcd1xkX10rL2csKGZ1bmN0aW9uKHgpe3ZhciB5PWRlbWFuZ2xlKHgpO3JldHVybiB4PT09eT94OngrIiBbIit5KyJdIn0pKX1mdW5jdGlvbiBzdGFja1RyYWNlKCl7dmFyIHN0YWNrPShuZXcgRXJyb3IpLnN0YWNrO3JldHVybiBzdGFjaz9kZW1hbmdsZUFsbChzdGFjayk6IihubyBzdGFjayB0cmFjZSBhdmFpbGFibGUpIn12YXIgUEFHRV9TSVpFPTQwOTY7ZnVuY3Rpb24gYWxpZ25NZW1vcnlQYWdlKHgpe3JldHVybiB4KzQwOTUmLTQwOTZ9dmFyIEhFQVA7dmFyIEhFQVA4LEhFQVBVOCxIRUFQMTYsSEVBUFUxNixIRUFQMzIsSEVBUFUzMixIRUFQRjMyLEhFQVBGNjQ7dmFyIFNUQVRJQ19CQVNFPTAsU1RBVElDVE9QPTAsc3RhdGljU2VhbGVkPWZhbHNlO3ZhciBTVEFDS19CQVNFPTAsU1RBQ0tUT1A9MCxTVEFDS19NQVg9MDt2YXIgRFlOQU1JQ19CQVNFPTAsRFlOQU1JQ1RPUD0wO2Z1bmN0aW9uIGVubGFyZ2VNZW1vcnkoKXthYm9ydCgiQ2Fubm90IGVubGFyZ2UgbWVtb3J5IGFycmF5cy4gRWl0aGVyICgxKSBjb21waWxlIHdpdGggLXMgVE9UQUxfTUVNT1JZPVggd2l0aCBYIGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlICIrVE9UQUxfTUVNT1JZKyIsICgyKSBjb21waWxlIHdpdGggQUxMT1dfTUVNT1JZX0dST1dUSCB3aGljaCBhZGp1c3RzIHRoZSBzaXplIGF0IHJ1bnRpbWUgYnV0IHByZXZlbnRzIHNvbWUgb3B0aW1pemF0aW9ucywgb3IgKDMpIHNldCBNb2R1bGUuVE9UQUxfTUVNT1JZIGJlZm9yZSB0aGUgcHJvZ3JhbSBydW5zLiIpfXZhciBUT1RBTF9TVEFDSz1Nb2R1bGVbIlRPVEFMX1NUQUNLIl18fDUyNDI4ODA7dmFyIFRPVEFMX01FTU9SWT1Nb2R1bGVbIlRPVEFMX01FTU9SWSJdfHwxNjc3NzIxNjA7dmFyIEZBU1RfTUVNT1JZPU1vZHVsZVsiRkFTVF9NRU1PUlkiXXx8MTA0ODU3NjA7dmFyIHRvdGFsTWVtb3J5PTQwOTY7d2hpbGUodG90YWxNZW1vcnk8VE9UQUxfTUVNT1JZfHx0b3RhbE1lbW9yeTwyKlRPVEFMX1NUQUNLKXtpZih0b3RhbE1lbW9yeTwxNioxMDI0KjEwMjQpe3RvdGFsTWVtb3J5Kj0yfWVsc2V7dG90YWxNZW1vcnkrPTE2KjEwMjQqMTAyNH19aWYodG90YWxNZW1vcnkhPT1UT1RBTF9NRU1PUlkpe01vZHVsZS5wcmludEVycigiaW5jcmVhc2luZyBUT1RBTF9NRU1PUlkgdG8gIit0b3RhbE1lbW9yeSsiIHRvIGJlIG1vcmUgcmVhc29uYWJsZSIpO1RPVEFMX01FTU9SWT10b3RhbE1lbW9yeX1hc3NlcnQodHlwZW9mIEludDMyQXJyYXkhPT0idW5kZWZpbmVkIiYmdHlwZW9mIEZsb2F0NjRBcnJheSE9PSJ1bmRlZmluZWQiJiYhIShuZXcgSW50MzJBcnJheSgxKSlbInN1YmFycmF5Il0mJiEhKG5ldyBJbnQzMkFycmF5KDEpKVsic2V0Il0sIkpTIGVuZ2luZSBkb2VzIG5vdCBwcm92aWRlIGZ1bGwgdHlwZWQgYXJyYXkgc3VwcG9ydCIpO3ZhciBidWZmZXI9bmV3IEFycmF5QnVmZmVyKFRPVEFMX01FTU9SWSk7SEVBUDg9bmV3IEludDhBcnJheShidWZmZXIpO0hFQVAxNj1uZXcgSW50MTZBcnJheShidWZmZXIpO0hFQVAzMj1uZXcgSW50MzJBcnJheShidWZmZXIpO0hFQVBVOD1uZXcgVWludDhBcnJheShidWZmZXIpO0hFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGJ1ZmZlcik7SEVBUFUzMj1uZXcgVWludDMyQXJyYXkoYnVmZmVyKTtIRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtIRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkoYnVmZmVyKTtIRUFQMzJbMF09MjU1O2Fzc2VydChIRUFQVThbMF09PT0yNTUmJkhFQVBVOFszXT09PTAsIlR5cGVkIGFycmF5cyAyIG11c3QgYmUgcnVuIG9uIGEgbGl0dGxlLWVuZGlhbiBzeXN0ZW0iKTtNb2R1bGVbIkhFQVAiXT1IRUFQO01vZHVsZVsiSEVBUDgiXT1IRUFQODtNb2R1bGVbIkhFQVAxNiJdPUhFQVAxNjtNb2R1bGVbIkhFQVAzMiJdPUhFQVAzMjtNb2R1bGVbIkhFQVBVOCJdPUhFQVBVODtNb2R1bGVbIkhFQVBVMTYiXT1IRUFQVTE2O01vZHVsZVsiSEVBUFUzMiJdPUhFQVBVMzI7TW9kdWxlWyJIRUFQRjMyIl09SEVBUEYzMjtNb2R1bGVbIkhFQVBGNjQiXT1IRUFQRjY0O2Z1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcyl7d2hpbGUoY2FsbGJhY2tzLmxlbmd0aD4wKXt2YXIgY2FsbGJhY2s9Y2FsbGJhY2tzLnNoaWZ0KCk7aWYodHlwZW9mIGNhbGxiYWNrPT0iZnVuY3Rpb24iKXtjYWxsYmFjaygpO2NvbnRpbnVlfXZhciBmdW5jPWNhbGxiYWNrLmZ1bmM7aWYodHlwZW9mIGZ1bmM9PT0ibnVtYmVyIil7aWYoY2FsbGJhY2suYXJnPT09dW5kZWZpbmVkKXtSdW50aW1lLmR5bkNhbGwoInYiLGZ1bmMpfWVsc2V7UnVudGltZS5keW5DYWxsKCJ2aSIsZnVuYyxbY2FsbGJhY2suYXJnXSl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19dmFyIF9fQVRQUkVSVU5fXz1bXTt2YXIgX19BVElOSVRfXz1bXTt2YXIgX19BVE1BSU5fXz1bXTt2YXIgX19BVEVYSVRfXz1bXTt2YXIgX19BVFBPU1RSVU5fXz1bXTt2YXIgcnVudGltZUluaXRpYWxpemVkPWZhbHNlO2Z1bmN0aW9uIHByZVJ1bigpe2lmKE1vZHVsZVsicHJlUnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdPT0iZnVuY3Rpb24iKU1vZHVsZVsicHJlUnVuIl09W01vZHVsZVsicHJlUnVuIl1dO3doaWxlKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKXthZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uIGVuc3VyZUluaXRSdW50aW1lKCl7aWYocnVudGltZUluaXRpYWxpemVkKXJldHVybjtydW50aW1lSW5pdGlhbGl6ZWQ9dHJ1ZTtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKX1mdW5jdGlvbiBwcmVNYWluKCl7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyl9ZnVuY3Rpb24gZXhpdFJ1bnRpbWUoKXtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FURVhJVF9fKX1mdW5jdGlvbiBwb3N0UnVuKCl7aWYoTW9kdWxlWyJwb3N0UnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInBvc3RSdW4iXT09ImZ1bmN0aW9uIilNb2R1bGVbInBvc3RSdW4iXT1bTW9kdWxlWyJwb3N0UnVuIl1dO3doaWxlKE1vZHVsZVsicG9zdFJ1biJdLmxlbmd0aCl7YWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKX1mdW5jdGlvbiBhZGRPblByZVJ1bihjYil7X19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25QcmVSdW4iXT1Nb2R1bGUuYWRkT25QcmVSdW49YWRkT25QcmVSdW47ZnVuY3Rpb24gYWRkT25Jbml0KGNiKXtfX0FUSU5JVF9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25Jbml0Il09TW9kdWxlLmFkZE9uSW5pdD1hZGRPbkluaXQ7ZnVuY3Rpb24gYWRkT25QcmVNYWluKGNiKXtfX0FUTUFJTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25QcmVNYWluIl09TW9kdWxlLmFkZE9uUHJlTWFpbj1hZGRPblByZU1haW47ZnVuY3Rpb24gYWRkT25FeGl0KGNiKXtfX0FURVhJVF9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25FeGl0Il09TW9kdWxlLmFkZE9uRXhpdD1hZGRPbkV4aXQ7ZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVsiYWRkT25Qb3N0UnVuIl09TW9kdWxlLmFkZE9uUG9zdFJ1bj1hZGRPblBvc3RSdW47ZnVuY3Rpb24gaW50QXJyYXlGcm9tU3RyaW5nKHN0cmluZ3ksZG9udEFkZE51bGwsbGVuZ3RoKXt2YXIgcmV0PShuZXcgUnVudGltZS5VVEY4UHJvY2Vzc29yKS5wcm9jZXNzSlNTdHJpbmcoc3RyaW5neSk7aWYobGVuZ3RoKXtyZXQubGVuZ3RoPWxlbmd0aH1pZighZG9udEFkZE51bGwpe3JldC5wdXNoKDApfXJldHVybiByZXR9TW9kdWxlWyJpbnRBcnJheUZyb21TdHJpbmciXT1pbnRBcnJheUZyb21TdHJpbmc7ZnVuY3Rpb24gaW50QXJyYXlUb1N0cmluZyhhcnJheSl7dmFyIHJldD1bXTtmb3IodmFyIGk9MDtpPGFycmF5Lmxlbmd0aDtpKyspe3ZhciBjaHI9YXJyYXlbaV07aWYoY2hyPjI1NSl7Y2hyJj0yNTV9cmV0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaHIpKX1yZXR1cm4gcmV0LmpvaW4oIiIpfU1vZHVsZVsiaW50QXJyYXlUb1N0cmluZyJdPWludEFycmF5VG9TdHJpbmc7ZnVuY3Rpb24gd3JpdGVTdHJpbmdUb01lbW9yeShzdHJpbmcsYnVmZmVyLGRvbnRBZGROdWxsKXt2YXIgYXJyYXk9aW50QXJyYXlGcm9tU3RyaW5nKHN0cmluZyxkb250QWRkTnVsbCk7dmFyIGk9MDt3aGlsZShpPGFycmF5Lmxlbmd0aCl7dmFyIGNocj1hcnJheVtpXTtIRUFQOFtidWZmZXIraT4+MF09Y2hyO2k9aSsxfX1Nb2R1bGVbIndyaXRlU3RyaW5nVG9NZW1vcnkiXT13cml0ZVN0cmluZ1RvTWVtb3J5O2Z1bmN0aW9uIHdyaXRlQXJyYXlUb01lbW9yeShhcnJheSxidWZmZXIpe2Zvcih2YXIgaT0wO2k8YXJyYXkubGVuZ3RoO2krKyl7SEVBUDhbYnVmZmVyK2k+PjBdPWFycmF5W2ldfX1Nb2R1bGVbIndyaXRlQXJyYXlUb01lbW9yeSJdPXdyaXRlQXJyYXlUb01lbW9yeTtmdW5jdGlvbiB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyLGJ1ZmZlcixkb250QWRkTnVsbCl7Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoO2krKyl7SEVBUDhbYnVmZmVyK2k+PjBdPXN0ci5jaGFyQ29kZUF0KGkpfWlmKCFkb250QWRkTnVsbClIRUFQOFtidWZmZXIrc3RyLmxlbmd0aD4+MF09MH1Nb2R1bGVbIndyaXRlQXNjaWlUb01lbW9yeSJdPXdyaXRlQXNjaWlUb01lbW9yeTtmdW5jdGlvbiB1blNpZ24odmFsdWUsYml0cyxpZ25vcmUpe2lmKHZhbHVlPj0wKXtyZXR1cm4gdmFsdWV9cmV0dXJuIGJpdHM8PTMyPzIqTWF0aC5hYnMoMTw8Yml0cy0xKSt2YWx1ZTpNYXRoLnBvdygyLGJpdHMpK3ZhbHVlfWZ1bmN0aW9uIHJlU2lnbih2YWx1ZSxiaXRzLGlnbm9yZSl7aWYodmFsdWU8PTApe3JldHVybiB2YWx1ZX12YXIgaGFsZj1iaXRzPD0zMj9NYXRoLmFicygxPDxiaXRzLTEpOk1hdGgucG93KDIsYml0cy0xKTtpZih2YWx1ZT49aGFsZiYmKGJpdHM8PTMyfHx2YWx1ZT5oYWxmKSl7dmFsdWU9LTIqaGFsZit2YWx1ZX1yZXR1cm4gdmFsdWV9aWYoIU1hdGhbImltdWwiXXx8TWF0aFsiaW11bCJdKDQyOTQ5NjcyOTUsNSkhPT0tNSlNYXRoWyJpbXVsIl09ZnVuY3Rpb24gaW11bChhLGIpe3ZhciBhaD1hPj4+MTY7dmFyIGFsPWEmNjU1MzU7dmFyIGJoPWI+Pj4xNjt2YXIgYmw9YiY2NTUzNTtyZXR1cm4gYWwqYmwrKGFoKmJsK2FsKmJoPDwxNil8MH07TWF0aC5pbXVsPU1hdGhbImltdWwiXTt2YXIgTWF0aF9hYnM9TWF0aC5hYnM7dmFyIE1hdGhfY29zPU1hdGguY29zO3ZhciBNYXRoX3Npbj1NYXRoLnNpbjt2YXIgTWF0aF90YW49TWF0aC50YW47dmFyIE1hdGhfYWNvcz1NYXRoLmFjb3M7dmFyIE1hdGhfYXNpbj1NYXRoLmFzaW47dmFyIE1hdGhfYXRhbj1NYXRoLmF0YW47dmFyIE1hdGhfYXRhbjI9TWF0aC5hdGFuMjt2YXIgTWF0aF9leHA9TWF0aC5leHA7dmFyIE1hdGhfbG9nPU1hdGgubG9nO3ZhciBNYXRoX3NxcnQ9TWF0aC5zcXJ0O3ZhciBNYXRoX2NlaWw9TWF0aC5jZWlsO3ZhciBNYXRoX2Zsb29yPU1hdGguZmxvb3I7dmFyIE1hdGhfcG93PU1hdGgucG93O3ZhciBNYXRoX2ltdWw9TWF0aC5pbXVsO3ZhciBNYXRoX2Zyb3VuZD1NYXRoLmZyb3VuZDt2YXIgTWF0aF9taW49TWF0aC5taW47dmFyIHJ1bkRlcGVuZGVuY2llcz0wO3ZhciBydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsO3ZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMrKztpZihNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSl7TW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKX19TW9kdWxlWyJhZGRSdW5EZXBlbmRlbmN5Il09YWRkUnVuRGVwZW5kZW5jeTtmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKXtydW5EZXBlbmRlbmNpZXMtLTtpZihNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSl7TW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKX1pZihydW5EZXBlbmRlbmNpZXM9PTApe2lmKHJ1bkRlcGVuZGVuY3lXYXRjaGVyIT09bnVsbCl7Y2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7cnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbH1pZihkZXBlbmRlbmNpZXNGdWxmaWxsZWQpe3ZhciBjYWxsYmFjaz1kZXBlbmRlbmNpZXNGdWxmaWxsZWQ7ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7Y2FsbGJhY2soKX19fU1vZHVsZVsicmVtb3ZlUnVuRGVwZW5kZW5jeSJdPXJlbW92ZVJ1bkRlcGVuZGVuY3k7TW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXT17fTtNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdPXt9O3ZhciBtZW1vcnlJbml0aWFsaXplcj1udWxsO3ZhciBfX1pUSXQ9MjE4NzI7dmFyIF9fWlRJcz0yMTg2NDt2YXIgX19aVEltPTIxOTM2O3ZhciBfX1pUSWw9MjE5MjA7dmFyIF9fWlRWTjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0U9MjE2NTY7dmFyIF9fWlRJaT0yMTg4ODt2YXIgX19aVEloPTIxODQwO3ZhciBfX1pUSWo9MjE5MDQ7dmFyIF9fWlRJZD0yMTk2ODt2YXIgX19aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0U9MjE2MTY7dmFyIF9fWlRJZj0yMTk1Mjt2YXIgX19aVElhPTIxODU2O3ZhciBfX1pUVk4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRT0yMTk3Njt2YXIgX19aVEljPTIxODI0O1NUQVRJQ19CQVNFPTg7U1RBVElDVE9QPVNUQVRJQ19CQVNFK1J1bnRpbWUuYWxpZ25NZW1vcnkoMjMwODMpO19fQVRJTklUX18ucHVzaCh7ZnVuYzooZnVuY3Rpb24oKXtfX0dMT0JBTF9fSV9hKCl9KX0se2Z1bmM6KGZ1bmN0aW9uKCl7X19HTE9CQUxfX0lfYTY1KCl9KX0se2Z1bmM6KGZ1bmN0aW9uKCl7X19HTE9CQUxfX0lfYTE1MygpfSl9KTthbGxvY2F0ZShbNzYsNjUsODMsOTAsMTA1LDExMiwwLDAsMTExLDExMiwxMDEsMTEwLDAsMCwwLDAsMTAzLDEwMSwxMTYsODAsMTExLDEwNSwxMTAsMTE2LDAsMCwwLDAsMCwwLDAsMCwxMDMsMTAxLDExNiw2NywxMTEsMTE3LDExMCwxMTYsMCwwLDAsMCwwLDAsMCwwLDEwNSwxMDUsMTA1LDAsMCwwLDAsMCw1NCw3Niw2NSw4Myw5MCwxMDUsMTEyLDAsMTIwLDg0LDAsMCw2NCwwLDAsMCw4MCw1NCw3Niw2NSw4Myw5MCwxMDUsMTEyLDAsMCwwLDAsMCwwLDAsMCwxNjAsODQsMCwwLDgwLDAsMCwwLDAsMCwwLDAsNzIsMCwwLDAsMTE4LDEwNSwxMDUsMTA1LDAsMCwwLDAsMTE4LDEwNSwxMDUsMTA1LDEwNSwwLDAsMCwxMDUsMTA1LDAsMCwwLDAsMCwwLDExOCwxMDUsMCwwLDAsMCwwLDAsMTE4LDAsMCwwLDAsMCwwLDAsMTA1LDEwNSwwLDAsMCwwLDAsMCw4MCw3NSw1NCw3Niw2NSw4Myw5MCwxMDUsMTEyLDAsMCwwLDAsMCwwLDAsMTYwLDg0LDAsMCwxNjAsMCwwLDAsMSwwLDAsMCw3MiwwLDAsMCwxMTgsNTAsMTE2LDU0LDExNSw1MCw0OCwwLDExOCw1MCwxMTYsNTQsMTE1LDUwLDQ4LDExOCw1MCwxMTYsNTUsMTE1LDU2LDAsMCwwLDExOCw1MCwxMTYsNTQsMTE1LDUwLDQ4LDExOCw1MCwxMTYsNTYsMTE1LDU0LDAsMCwwLDExOCw1MCwxMTYsNTQsMTE1LDUwLDQ4LDExOCw1MCwxMTYsNTUsMTE1LDU2LDExOCw1MCwxMTYsNTYsMTE1LDU0LDAsMCwwLDAsMCwxMDQsOTcsMTE1LDMyLDEwNSwxMTUsNTgsMzIsMCwwLDAsMCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNDksNTcsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDk1LDExNSw5OSwxMDQsMTAxLDEwOSw5Nyw5NSwxMTYsMTIxLDExMiwxMDEsNjksMCwwLDIyNCw4NSwwLDAsMTYsMSwwLDAsODAsMzksMCwwLDAsMCwwLDAsODQsMTA0LDEwMSwzMiw3Niw2NSw5MCwzMiwxMTUsOTksMTA0LDEwMSwxMDksOTcsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTQsMTAxLDk5LDExMSwxMDMsMTEwLDEwNSwxMjIsMTAxLDEwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OCwxLDAsMCwyMiwwLDAsMCwyMywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDczLDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMTEsMTAyLDMyLDExNSwxMjEsMTA5LDk4LDExMSwxMDgsMTE1LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDIyLDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw0OCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNDgsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw0OCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNDgsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDY4LDk1LDY5LDY5LDY5LDY5LDc4LDgzLDY2LDk1LDczLDc4LDgzLDY3LDk1LDU1LDEwMywxMTIsMTE1LDExNiwxMDUsMTA5LDEwMSw2OSw3OCw4Myw2OSw5NSw3Myw4Myw3Miw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2Niw5NSw3Myw3OCw4Myw2Nyw5NSw1MSwxMTQsMTAzLDk4LDY5LDc4LDgzLDY5LDk1LDczLDgzLDc1LDk1LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OCwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNjksMCwxMjAsODQsMCwwLDIwOCwyLDAsMCwyMjQsODUsMCwwLDE4NCwxLDAsMCwyNDgsMiwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDQ5LDQ5LDEwMSwxMTAsMTAwLDk1LDExMSwxMDIsOTUsMTAyLDEwNSwxMDgsMTAxLDY5LDAsMCwyMjQsODUsMCwwLDE2LDMsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDgyLDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw2OSwxMTAsMTAwLDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDAsMCwwLDAsMCwwLDAsMCwwLDQwLDMsMCwwLDI2LDAsMCwwLDI3LDAsMCwwLDIyLDAsMCwwLDAsMCwwLDAsMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDE0LDAsMSwzLDYsMTAsMTAsOSwxMywxLDIsNCw3LDExLDExLDEwLDEyLDMsNCw1LDgsMTIsMTIsMTEsMTEsNiw3LDgsOSwxMywxMywxMiwxMCwxMCwxMSwxMiwxMywxNCwxNCwxMyw5LDEwLDExLDEyLDEzLDE0LDE1LDE0LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwwLDEsMiwzLDQsNSw2LDcsMSwwLDEsMiwzLDQsNSw2LDIsMSwwLDEsMiwzLDQsNSwzLDIsMSwwLDEsMiwzLDQsNCwzLDIsMSwwLDEsMiwzLDUsNCwzLDIsMSwwLDEsMiw2LDUsNCwzLDIsMSwwLDEsNyw2LDUsNCwzLDIsMSwwLDAsMCwwLDAsMTEyLDUsMCwwLDI4LDAsMCwwLDI5LDAsMCwwLDMwLDAsMCwwLDIyLDAsMCwwLDMxLDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUwLDQ4LDk1LDk1LDExNSwxMDQsOTcsMTE0LDEwMSwxMDAsOTUsMTEyLDExNiwxMTQsOTUsMTEyLDExMSwxMDUsMTEwLDExNiwxMDEsMTE0LDczLDgwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2OCw5NSw3Myw3OCw4Myw2OSw5NSw1NSwxMDMsMTEyLDExNSwxMTYsMTA1LDEwOSwxMDEsNjksNzgsODMsNzEsOTUsNzMsODMsNzQsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3Nyw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw4MSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw4MSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsOCw0LDAsMCwxNDQsMzgsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDk1LDEwMCwxMDEsMTA4LDEwMSwxMTYsMTAxLDczLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2OCw5NSw3Myw3OCw4Myw2OSw5NSw1NSwxMDMsMTEyLDExNSwxMTYsMTA1LDEwOSwxMDEsNjksNzgsODMsNzEsOTUsNzMsODMsNzQsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3Nyw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwxOTIsNywwLDAsMjMsMCwwLDAsMzIsMCwwLDAsMzMsMCwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU1LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE1LDUwLDQ5LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw0OSw3Myw3OCw4Myw5NSw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDc4LDgzLDQ4LDk1LDQ5LDU3LDExNCwxMDEsOTksMTExLDExNCwxMDAsOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw3Myw3NCw3OCw4Myw0OCw5NSw1MywxMDIsMTA1LDEwMSwxMDgsMTAwLDczLDc4LDgzLDQ4LDk1LDUxLDEwOCw5NywxMTUsNTUsMTEyLDExMSwxMDUsMTEwLDExNiw0OSw0OCw2OSw3OCw4Myw0OCw5NSw1MCw0OCwxMTUsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw5NSwxMDAsMTA1LDEwMiwxMDIsOTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsNzMsODMsNjgsOTUsNjksNjksNjksNjksNzgsODMsNjYsOTUsNzMsNzgsODMsNjcsOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw2OSw5NSw3Myw4Myw3Miw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMjI0LDg1LDAsMCwyMDAsNiwwLDAsMjQ4LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCw1Niw5LDAsMCwzNCwwLDAsMCwzNSwwLDAsMCwzNiwwLDAsMCwyMywwLDAsMCwzNywwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTUsMTA0LDk3LDExNCwxMDEsMTAwLDk1LDExMiwxMTYsMTE0LDk1LDExMiwxMTEsMTA1LDExMCwxMTYsMTAxLDExNCw3Myw4MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU1LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE1LDUwLDQ5LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw0OSw3Myw3OCw4Myw0OSw5NSw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw0OSw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDc4LDgzLDUwLDk1LDQ5LDU3LDExNCwxMDEsOTksMTExLDExNCwxMDAsOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw3Myw3NCw3OCw4Myw1MCw5NSw1MywxMDIsMTA1LDEwMSwxMDgsMTAwLDczLDc4LDgzLDUwLDk1LDUxLDEwOCw5NywxMTUsNTUsMTEyLDExMSwxMDUsMTEwLDExNiw0OSw0OCw2OSw3OCw4Myw1MCw5NSw1MCw0OCwxMTUsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw5NSwxMDAsMTA1LDEwMiwxMDIsOTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsNzMsODMsNzAsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3NCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw3OCw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw3OCw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMjI0LDg1LDAsMCwyNDAsNywwLDAsMTQ0LDM4LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU1LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE1LDUwLDQ5LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw0OSw3Myw3OCw4Myw0OSw5NSw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw0OSw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDc4LDgzLDUwLDk1LDQ5LDU3LDExNCwxMDEsOTksMTExLDExNCwxMDAsOTUsMTAwLDEwMSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTExLDExNCw3Myw3NCw3OCw4Myw1MCw5NSw1MywxMDIsMTA1LDEwMSwxMDgsMTAwLDczLDc4LDgzLDUwLDk1LDUxLDEwOCw5NywxMTUsNTUsMTEyLDExMSwxMDUsMTEwLDExNiw0OSw0OCw2OSw3OCw4Myw1MCw5NSw1MCw0OCwxMTUsMTE2LDk3LDExMCwxMDAsOTcsMTE0LDEwMCw5NSwxMDAsMTA1LDEwMiwxMDIsOTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsNzMsODMsNzAsOTUsNjksNjksNjksNjksNzgsODMsNjgsOTUsNzMsNzgsODMsNjksOTUsNTEsMTE0LDEwMyw5OCw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3NCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMTIsMTEsMCwwLDI0LDAsMCwwLDM4LDAsMCwwLDM5LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw0OCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNDgsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw0OCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNDgsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDY4LDk1LDY5LDY5LDY5LDY5LDc4LDgzLDY2LDk1LDczLDc4LDgzLDY3LDk1LDU1LDEwMywxMTIsMTE1LDExNiwxMDUsMTA5LDEwMSw2OSw3OCw4Myw2OSw5NSw3Myw4Myw3Miw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDIyNCw4NSwwLDAsMTIwLDEwLDAsMCwyNDgsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDIzMiwxMiwwLDAsNDAsMCwwLDAsNDEsMCwwLDAsNDIsMCwwLDAsMjQsMCwwLDAsNDMsMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNDgsOTUsOTUsMTE1LDEwNCw5NywxMTQsMTAxLDEwMCw5NSwxMTIsMTE2LDExNCw5NSwxMTIsMTExLDEwNSwxMTAsMTE2LDEwMSwxMTQsNzMsODAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsNDksOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsNDksOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsNDksOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw1MCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNTAsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw1MCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNTAsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDcwLDk1LDY5LDY5LDY5LDY5LDc4LDgzLDY4LDk1LDczLDc4LDgzLDY5LDk1LDU1LDEwMywxMTIsMTE1LDExNiwxMDUsMTA5LDEwMSw2OSw3OCw4Myw3MSw5NSw3Myw4Myw3NCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw3OCw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw3OCw5NSw2OSw2OSw2OSw2OSwwLDIyNCw4NSwwLDAsMTYwLDExLDAsMCwxNDQsMzgsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDk1LDEwMCwxMDEsMTA4LDEwMSwxMTYsMTAxLDczLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw3OCw4Myw2OCw5NSw3Myw3OCw4Myw2OSw5NSw1NSwxMDMsMTEyLDExNSwxMTYsMTA1LDEwOSwxMDEsNjksNzgsODMsNzEsOTUsNzMsODMsNzQsOTUsNjksNjksNjksNjksNjksNjksNjksNjksNjksNjksNjksMCwwLDAsMCwwLDAsMCwwLDgsMTUsMCwwLDI1LDAsMCwwLDQ0LDAsMCwwLDQ1LDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw0OCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNDgsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw0OCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNDgsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDY4LDk1LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCw0MCwxNCwwLDAsMjQ4LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMDQsMTYsMCwwLDQ2LDAsMCwwLDQ3LDAsMCwwLDQ4LDAsMCwwLDI1LDAsMCwwLDQ5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUwLDQ4LDk1LDk1LDExNSwxMDQsOTcsMTE0LDEwMSwxMDAsOTUsMTEyLDExNiwxMTQsOTUsMTEyLDExMSwxMDUsMTEwLDExNiwxMDEsMTE0LDczLDgwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTUsNTAsNDksMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDQ5LDczLDc4LDgzLDQ5LDk1LDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsNTAsOTUsNDksNTcsMTE0LDEwMSw5OSwxMTEsMTE0LDEwMCw5NSwxMDAsMTAxLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDczLDc0LDc4LDgzLDUwLDk1LDUzLDEwMiwxMDUsMTAxLDEwOCwxMDAsNzMsNzgsODMsNTAsOTUsNTEsMTA4LDk3LDExNSw1NSwxMTIsMTExLDEwNSwxMTAsMTE2LDQ5LDQ4LDY5LDc4LDgzLDUwLDk1LDUwLDQ4LDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDk1LDEwMCwxMDUsMTAyLDEwMiw5NSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCw3Myw4Myw3MCw5NSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw3NSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw3NSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsNTYsMTUsMCwwLDE0NCwzOCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNSw1MCw0OSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNDksNzMsNzgsODMsNDksOTUsNTYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE1LDQ5LDQ4LDk3LDExNCwxMDUsMTE2LDEwNCwxMDksMTAxLDExNiwxMDUsOTksNzMsNzgsODMsNDksOTUsNTAsMTA1LDExMSw0OSw1Niw5NSw5NSwxMDUsMTAyLDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNzMsNzgsODMsNDksOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw2OSw2OSw3OCw4Myw1MCw5NSw0OSw1NywxMTQsMTAxLDk5LDExMSwxMTQsMTAwLDk1LDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsNzMsNzQsNzgsODMsNTAsOTUsNTMsMTAyLDEwNSwxMDEsMTA4LDEwMCw3Myw3OCw4Myw1MCw5NSw1MSwxMDgsOTcsMTE1LDU1LDExMiwxMTEsMTA1LDExMCwxMTYsNDksNDgsNjksNzgsODMsNTAsOTUsNTAsNDgsMTE1LDExNiw5NywxMTAsMTAwLDk3LDExNCwxMDAsOTUsMTAwLDEwNSwxMDIsMTAyLDk1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDczLDgzLDcwLDk1LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwxMTgsMCwwLDAsMCwwLDAsMCwxMTYsMCwwLDAsMCwwLDAsMCwxMTUsMCwwLDAsMCwwLDAsMCw2NCwwLDAsMCwwLDAsMCwwLDE2LDE4LDAsMCw1MCwwLDAsMCw1MSwwLDAsMCw1NiwwLDAsMCwyNDgsMjU1LDI1NSwyNTUsMTYsMTgsMCwwLDUyLDAsMCwwLDUzLDAsMCwwLDE5MiwyNTUsMjU1LDI1NSwxOTIsMjU1LDI1NSwyNTUsMTYsMTgsMCwwLDU0LDAsMCwwLDU1LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU2LDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNzgsODMsOTUsNTcsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDExMSwxMTQsNzMsOTksNjksNjksNjksNjksMCwwLDAsMCwyMjQsODUsMCwwLDIwMCwxNywwLDAsMjI0LDQ1LDAsMCwwLDAsMCwwLDY0LDAsMCwwLDAsMCwwLDAsMTkyLDQ0LDAsMCw1NiwwLDAsMCw1NywwLDAsMCwxOTIsMjU1LDI1NSwyNTUsMTkyLDI1NSwyNTUsMjU1LDE5Miw0NCwwLDAsNTgsMCwwLDAsNTksMCwwLDAsMCwwLDAsMCwyMDgsMTgsMCwwLDYwLDAsMCwwLDYxLDAsMCwwLDI2LDAsMCwwLDIyLDAsMCwwLDIyLDAsMCwwLDIyLDAsMCwwLDIzLDAsMCwwLDI0LDAsMCwwLDIzLDAsMCwwLDI1LDAsMCwwLDI2LDAsMCwwLDI2LDAsMCwwLDI0LDAsMCwwLDI3LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Myw5OCw5NywxMTUsMTA1LDk5LDk1LDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDk4LDExNywxMDIsNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDc4LDgzLDk1LDU3LDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMTEsMTE0LDczLDk5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxMzYsMTgsMCwwLDcyLDQ0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMTY4LDE5LDAsMCw2MiwwLDAsMCw2MywwLDAsMCw2NCwwLDAsMCwyOCwwLDAsMCw2NSwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTUsMTA0LDk3LDExNCwxMDEsMTAwLDk1LDExMiwxMTYsMTE0LDk1LDExMiwxMTEsMTA1LDExMCwxMTYsMTAxLDExNCw3Myw4MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDU2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNSw0OSw0OCw5NywxMTQsMTA1LDExNiwxMDQsMTA5LDEwMSwxMTYsMTA1LDk5LDczLDc4LDgzLDQ5LDk1LDUwLDEwNSwxMTEsNDksNTYsOTUsOTUsMTA1LDEwMiwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDczLDc4LDgzLDQ5LDk1LDU1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksMTE1LDQ5LDUxLDEwOSwxMDEsMTA5LDExMSwxMTQsMTIxLDk1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNjksNjksNjksNjksNjksNzgsODMsOTUsNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsODMsNTcsOTUsNjksNjksNzgsODMsOTUsNTcsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDExMSwxMTQsNzMsODMsNTcsOTUsNjksNjksNjksNjksMCwyMjQsODUsMCwwLDAsMTksMCwwLDE0NCwzOCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTUsNDksNDgsOTcsMTE0LDEwNSwxMTYsMTA0LDEwOSwxMDEsMTE2LDEwNSw5OSw3Myw3OCw4Myw0OSw5NSw1MCwxMDUsMTExLDQ5LDU2LDk1LDk1LDEwNSwxMDIsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsNzEsMTExLDExNiwzMiwxMDAsOTcsMTE2LDk3LDMyLDAsMCwwLDAsMCwwLDAsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDAsMCwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwNSwxMTAsMTAzLDMyLDExNSwxMDQsMTA1LDExNiwzMywwLDAsMTAwLDExMSwxMTAsMTAxLDMyLDEwMCwxMDEsMTA4LDEwMSwxMTYsMTA1LDExMCwxMDMsMzIsMTE1LDEwNCwxMDUsMTE2LDMzLDAsMCwwLDAsMCw3Niw2NSw4Myw3MCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNDksNTEsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTUsMTA5LDk3LDEwMywxMDUsOTksNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTIwLDIwLDAsMCw4MCwzOSwwLDAsMCwwLDAsMCw3Nyw5NywxMDMsMTA1LDk5LDMyLDExNCwxMDEsOTcsMTAwLDMzLDAsMCwwLDAsMCwxMTIsOTcsMTE0LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDAsMCwxMTIsOTcsMTE0LDExNSwxMDUsMTEwLDEwMywzMiw5OSwxMDQsMTE3LDExMCwxMDcsMzIsMTE2LDk3LDk4LDEwOCwxMDEsMCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTAsNTAsOTksMTA0LDExNywxMTAsMTA3LDk1LDExNiw5Nyw5OCwxMDgsMTAxLDk1LDExNCwxMDEsOTcsMTAwLDk1LDEwMSwxMTQsMTE0LDExMSwxMTQsNjksMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDIyNCwyMCwwLDAsODAsMzksMCwwLDAsMCwwLDAsNjcsMTA0LDExNywxMTAsMTA3LDMyLDExNiw5Nyw5OCwxMDgsMTAxLDMyLDExMSwxMDIsMTAyLDExNSwxMDEsMTE2LDMyLDYxLDYxLDMyLDQ1LDQ5LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsOTcsMTE2LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTYsMTA1LDEwOSwxMDEsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNDksNTEsMTEwLDExMSwxMTYsOTUsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsODAsMjEsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTAsNTQsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDk1LDk5LDEwNCwxMTcsMTEwLDEwNyw5NSwxMTYsOTcsOTgsMTA4LDEwMSw5NSwxMDIsMTExLDExNCwxMDksOTcsMTE2LDY5LDAsMCwwLDIyNCw4NSwwLDAsMTI4LDIxLDAsMCw4MCwzOSwwLDAsMCwwLDAsMCw5OSwxMDQsMTE3LDExMCwxMDcsOTUsMTE1LDEwNSwxMjIsMTAxLDMyLDYxLDYxLDMyLDExNywxMDUsMTEwLDExNiw0NiwxMDksOTcsMTIwLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsOTcsMTE2LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTYsMTA1LDEwOSwxMDEsNDQsMzIsOTksOTcsMTA4LDEwOCwzMiw0OSw0NSw1Niw0OCw0OCw0NSw2OCw2NSw3MCw4NSw4MSwzMiwxMDIsMTExLDExNCwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsNDYsMCwwLDAsMCwwLDk5LDEwNCwxMTcsMTEwLDEwNywzMiwxMTYsOTcsOTgsMTA4LDEwMSwzMiw5OSwxMTEsMTE3LDExMCwxMTYsMzIsMTA1LDExNSw1OCwzMiwwLDAsOTksMTE2LDExMSw5MSwwLDAsMCwwLDkzLDU4LDMyLDAsMCwwLDAsMCw4NCwxMDQsMTAxLDMyLDk5LDEwNCwxMTcsMTEwLDEwNywzMiwxMTYsOTcsOTgsMTA4LDEwMSwzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDExNywxMTAsMTA3LDExMCwxMTEsMTE5LDExMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTY4LDIxLDAsMCw2NiwwLDAsMCw2NywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTEyLDIxLDAsMCw2OCwwLDAsMCw2OSwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDg0LDEwNCwxMDEsMTE0LDEwMSwzMiwxMTksOTcsMTE1LDMyLDk3LDMyLDExMiwxMTQsMTExLDk4LDEwOCwxMDEsMTA5LDMyLDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDk5LDEwNCwxMTcsMTEwLDEwNywzMiwxMTYsOTcsOTgsMTA4LDEwMSwwLDAsMCwwLDAsMCwwLDAsMCw4LDIxLDAsMCw3MCwwLDAsMCw3MSwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsMzIsMTAxLDExMCw5OSwxMTEsMTAwLDEwMSwxMDAsMCwwLDExOCwxMDgsMTE0LDMyLDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMzIsMTE0LDEwMSw5NywxMDAsMzMsMCwwLDAsMCwwLDAsMCwwLDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsMzIsMTE4LDEwOCwxMTQsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwwLDAsMCwwLDAsMCwwLDAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw0OSw1MSwxMTAsMTExLDk1LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsOTUsMTE4LDEwOCwxMTQsNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMzIsMjMsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDExMiwxMTcsMTE1LDEwNCwxMDUsMTEwLDEwMywzMywwLDAsMCwwLDAsMCwwLDAsNzgsMTExLDMyLDc2LDY1LDgzLDEyMiwxMDUsMTEyLDMyLDg2LDc2LDgyLDMyLDExOSw5NywxMTUsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDg2LDc2LDgyLDExNSwzMiwxMTUsMTAxLDk5LDExNiwxMDUsMTExLDExMCwwLDAsMCwwLDAsMCwwLDAsMCw2NCwyMywwLDAsNzIsMCwwLDAsNzMsMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDUzLDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsOTUsMTAyLDExMSwxMTQsMTA5LDk3LDExNiw5NSwxMTcsMTEwLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDY5LDAsMCwwLDAsMjI0LDg1LDAsMCwxNjgsMjMsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMTEsMTE0LDMyLDEwNSwxMTUsNTgsMzIsMCwxMTYsMTExLDExNiw5NywxMDgsMzIsMTA1LDExNiwxMDEsMTA5LDExNSw1OCwzMiwwLDAsMCw4MCw5NywxMTQsMTE1LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTE0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDUsMTE2LDEwMSwxMDksMTE1LDMyLDExMCwxMTEsMTE5LDMzLDAsMCwwLDAsMCwwLDgwLDExNywxMTUsMTA0LDEwNSwxMTAsMTAzLDMyLDEwNSwxMTYsMTAxLDEwOSwzMiw5NywxMTYsMzIsMTA1LDExMCwxMDAsMTAxLDEyMCw1OCwzMiwwLDc5LDExMCwxMDgsMTIxLDMyLDc2LDY1LDgzLDEyMiwxMDUsMTEyLDMyLDgwLDc5LDczLDc4LDg0LDg3LDczLDgzLDY5LDMyLDY3LDcyLDg1LDc4LDc1LDY5LDY4LDMyLDEwMCwxMDEsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwwLDAsMCwwLDAsMjA4LDIzLDAsMCw3NCwwLDAsMCw3NSwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1NSw5OCw5NywxMDAsOTUsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDk1LDk5LDk3LDEwOCwxMDgsNjksMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTM2LDI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNjgsMjQsMCwwLDc2LDAsMCwwLDc3LDAsMCwwLDI3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTYsMjYsMCwwLDc4LDAsMCwwLDc5LDAsMCwwLDI4LDAsMCwwLDI3LDAsMCwwLDgwLDAsMCwwLDgxLDAsMCwwLDI4LDAsMCwwLDI5LDAsMCwwLDI5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDk1LDk1LDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCw1NCw5NSw5NSwxMDIsMTE3LDExMCw5OSw3Myw5MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDEwNSwxMTEsNTQsMTE0LDEwMSw5NywxMDAsMTAxLDExNCw0OSw0OCw5OCw5NywxMTUsMTA1LDk5LDk1LDEwMiwxMDUsMTA4LDEwMSw3Myw3OCw4Myw1MCw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDQ5LDQ5LDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTExLDExNCwxMTUsNjksMTE4LDY5LDg1LDEwOCw4Miw3OCw4Myw1MSw5NSw1NCwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDY5LDY5LDk1LDc4LDgzLDk1LDU3LDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMTEsMTE0LDczLDgzLDY2LDk1LDY5LDY5LDcwLDExOCw4Myw2NSw5NSw2OSw2OSw2OSwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCw5NSw5NSwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsNTQsOTUsOTUsOTgsOTcsMTE1LDEwMSw3Myw3MCwxMTgsODIsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1MCwxMDUsMTExLDU0LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsNjksNjksNjksNjksMCwwLDAsMCwxMjAsODQsMCwwLDIwOCwyNSwwLDAsMjI0LDg1LDAsMCw1NiwyNSwwLDAsOCwyNiwwLDAsMCwwLDAsMCw5MCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDEwNSwxMTEsNTQsMTE0LDEwMSw5NywxMDAsMTAxLDExNCw0OSw0OCw5OCw5NywxMTUsMTA1LDk5LDk1LDEwMiwxMDUsMTA4LDEwMSw3Myw3OCw4Myw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDQ5LDQ5LDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTExLDExNCwxMTUsNjksMTE4LDY5LDg1LDEwOCw4Miw3OCw4Myw0OCw5NSw1NCwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDY5LDY5LDk1LDAsMCwwLDEyMCw4NCwwLDAsMzIsMjYsMCwwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTAsNDksMTExLDEwOCwxMDAsOTUsMTE1LDExNiwxMjEsMTA4LDEwMSw5NSw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTA1LDExMSwxMTAsNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTM2LDI2LDAsMCw4MCwzOSwwLDAsMCwwLDAsMCw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDQ5LDUyLDExMCwxMTEsMTE2LDk1LDk5LDExMSwxMDksMTEyLDExNCwxMDEsMTE1LDExNSwxMDEsMTAwLDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxOTIsMjYsMCwwLDgwLDM5LDAsMCwwLDAsMCwwLDg0LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwxMTAsMzksMTE2LDMyLDExNSwxMDEsMTAxLDEwOSwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiw5OSwxMTEsMTA5LDExMiwxMTQsMTAxLDExNSwxMTUsMTAxLDEwMCwwLDAsMCwwLDAsMCwyMjQsMjYsMCwwLDgyLDAsMCwwLDgzLDAsMCwwLDIyLDAsMCwwLDAsMCwwLDAsODQsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEwMSwxMDEsMTA5LDExNSwzMiwxMTYsMTExLDMyLDEwNCw5NywxMTgsMTAxLDMyLDExMSwxMDgsMTAwLDMyLDExNSwxMTYsMTIxLDEwOCwxMDEsMzIsOTksMTExLDEwOSwxMTIsMTE0LDEwMSwxMTUsMTE1LDEwNSwxMTEsMTEwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDAsMCwwLDAsMCwwLDAsMCwwLDE3NiwyNiwwLDAsODQsMCwwLDAsODUsMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCw3MCwxMDUsMTA4LDEwMSwzMiwxMDksOTcsMTAzLDEwNSw5OSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExOCw5NywxMDgsMTA1LDEwMCwwLDAsMCwwLDAsMTUyLDIwLDAsMCw4NiwwLDAsMCw4NywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDEwMywxMTEsMTA1LDExMCwxMDMsMzIsMTAwLDExMSwxMTksMTEwLDMzLDAsMCwwLDAsMCwwLDAsMCwwLDEyOCwyOCwwLDAsODgsMCwwLDAsODksMCwwLDAsOTAsMCwwLDAsMzAsMCwwLDAsOTEsMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNDgsOTUsOTUsMTE1LDEwNCw5NywxMTQsMTAxLDEwMCw5NSwxMTIsMTE2LDExNCw5NSwxMTIsMTExLDEwNSwxMTAsMTE2LDEwMSwxMTQsNzMsODAsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1MCwxMDUsMTExLDU0LDExNCwxMDEsOTcsMTAwLDEwMSwxMTQsNDksNDgsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDIsMTA1LDEwOCwxMDEsNzMsNzgsODMsNDksOTUsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw2OSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw1NSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw1NSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDI0MCwyNywwLDAsMTQ0LDM4LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw3OCw1NCwxMDgsOTcsMTE1LDEyMiwxMDUsMTEyLDUwLDEwNSwxMTEsNTQsMTE0LDEwMSw5NywxMDAsMTAxLDExNCw0OSw0OCw5OCw5NywxMTUsMTA1LDk5LDk1LDEwMiwxMDUsMTA4LDEwMSw3Myw3OCw4Myw0OSw5NSw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwxMjAsMjksMCwwLDkyLDAsMCwwLDkzLDAsMCwwLDk0LDAsMCwwLDMxLDAsMCwwLDk1LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUwLDQ4LDk1LDk1LDExNSwxMDQsOTcsMTE0LDEwMSwxMDAsOTUsMTEyLDExNiwxMTQsOTUsMTEyLDExMSwxMDUsMTEwLDExNiwxMDEsMTE0LDczLDgwLDc4LDU0LDEwOCw5NywxMTUsMTIyLDEwNSwxMTIsNTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwxMTUsNDksNTEsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw2OSw3OCw4Myw5NSw0OSw1MiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiw5NSwxMDAsMTAxLDEwOCwxMDEsMTE2LDEwMSw3Myw4Myw1MSw5NSw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3Myw4Myw1MSw5NSw2OSw2OSw2OSw2OSwwLDAsMCwyMjQsODUsMCwwLDgsMjksMCwwLDE0NCwzOCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsOTUsMTAwLDEwMSwxMDgsMTAxLDExNiwxMDEsNzMsNzgsNTQsMTA4LDk3LDExNSwxMjIsMTA1LDExMiw1NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDExNSw0OSw1MSwxMDksMTAxLDEwOSwxMTEsMTE0LDEyMSw5NSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDExOCwxMTEsMTA1LDEwMCwwLDAsMCwwLDk4LDExMSwxMTEsMTA4LDAsMCwwLDAsOTksMTA0LDk3LDExNCwwLDAsMCwwLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDk5LDEwNCw5NywxMTQsMCwwLDAsMCwwLDExNywxMTAsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsOTksMTA0LDk3LDExNCwwLDAsMCwxMTUsMTA0LDExMSwxMTQsMTE2LDAsMCwwLDExNywxMTAsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTE1LDEwNCwxMTEsMTE0LDExNiwwLDAsMTA1LDExMCwxMTYsMCwwLDAsMCwwLDExNywxMTAsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTA1LDExMCwxMTYsMCwwLDAsMCwxMDgsMTExLDExMCwxMDMsMCwwLDAsMCwxMTcsMTEwLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDEwOCwxMTEsMTEwLDEwMywwLDAsMCwxMDIsMTA4LDExMSw5NywxMTYsMCwwLDAsMTAwLDExMSwxMTcsOTgsMTA4LDEwMSwwLDAsMTE1LDExNiwxMDAsNTgsNTgsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMCwwLDAsMCwwLDExNSwxMTYsMTAwLDU4LDU4LDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNjAsMTE3LDExMCwxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwzMiw5OSwxMDQsOTcsMTE0LDYyLDAsMCwwLDAsMCwwLDAsMCwxMTUsMTE2LDEwMCw1OCw1OCwxMTksMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMCwwLDAsMCwxMDEsMTA5LDExNSw5OSwxMTQsMTA1LDExMiwxMTYsMTAxLDExMCw1OCw1OCwxMTgsOTcsMTA4LDAsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNTgsNTgsMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE4LDEwNSwxMDEsMTE5LDAsNzgsNDksNDgsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNDksNDksMTA5LDEwMSwxMDksMTExLDExNCwxMjEsOTUsMTE4LDEwNSwxMDEsMTE5LDY5LDAsMCwwLDAsMCwxMjAsODQsMCwwLDIwMCwzMCwwLDAsNzgsNDksNDgsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNTEsMTE4LDk3LDEwOCw2OSwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDI0MCwzMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUwLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNzMsMTE5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3MywxMTksNjksNjksNzgsODMsOTUsNTcsOTcsMTA4LDEwOCwxMTEsOTksOTcsMTE2LDExMSwxMTQsNzMsMTE5LDY5LDY5LDY5LDY5LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNDksOTUsOTUsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw5NSw5OSwxMTEsMTA5LDEwOSwxMTEsMTEwLDczLDc2LDk4LDQ5LDY5LDY5LDY5LDAsMCwwLDEyMCw4NCwwLDAsODAsMzEsMCwwLDY0LDg2LDAsMCwxNiwzMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDEyMCwzMSwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTAsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw3MywxMDQsNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDEwNCw2OSw2OSw3OCw4Myw5NSw1Nyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTExLDExNCw3MywxMDQsNjksNjksNjksNjksMCwwLDY0LDg2LDAsMCwxNTIsMzEsMCwwLDAsMCwwLDAsMSwwLDAsMCwxMjAsMzEsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUwLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDc4LDgzLDk1LDU3LDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMTEsMTE0LDczLDk5LDY5LDY5LDY5LDY5LDAsMCw2NCw4NiwwLDAsMjQwLDMxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMTIwLDMxXSwiaTgiLEFMTE9DX05PTkUsUnVudGltZS5HTE9CQUxfQkFTRSk7YWxsb2NhdGUoWzIwOCwzNiwwLDAsOTYsMCwwLDAsOTcsMCwwLDAsMjksMCwwLDAsMjUsMCwwLDAsMjMsMCwwLDAsMjMsMCwwLDAsMzAsMCwwLDAsMzEsMCwwLDAsMjYsMCwwLDAsMzIsMCwwLDAsMzMsMCwwLDAsMzIsMCwwLDAsMjcsMCwwLDAsMzMsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDExNSwxMTYsMTAwLDExMSwxMTcsMTE2LDk4LDExNywxMDIsNzMsMTE5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDE3NiwzNiwwLDAsMTM2LDQ0LDAsMCwwLDAsMCwwLDAsMCwwLDAsNTYsMzcsMCwwLDk4LDAsMCwwLDk5LDAsMCwwLDMwLDAsMCwwLDI1LDAsMCwwLDIzLDAsMCwwLDIzLDAsMCwwLDM0LDAsMCwwLDMxLDAsMCwwLDI2LDAsMCwwLDM1LDAsMCwwLDM2LDAsMCwwLDM0LDAsMCwwLDI4LDAsMCwwLDM1LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCw5NSw5NSwxMTUsMTE2LDEwMCwxMDUsMTEwLDk4LDExNywxMDIsNzMsMTE5LDY5LDY5LDAsMjI0LDg1LDAsMCwzMiwzNywwLDAsMTM2LDQ0LDAsMCwwLDAsMCwwLDExNywxMTAsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsMTA4LDExMSw5OSw5NywxMDgsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMTYsOTcsMTEwLDEwMCw5NywxMTQsMTAwLDMyLDEwNSwxMTAsMTEyLDExNywxMTYsMCwwLDAsMCwwLDAsMCwyMDgsMzcsMCwwLDEwMCwwLDAsMCwxMDEsMCwwLDAsMzEsMCwwLDAsMjIsMCwwLDAsMjQsMCwwLDAsMjQsMCwwLDAsMzcsMCwwLDAsMjQsMCwwLDAsMjMsMCwwLDAsMzgsMCwwLDAsMjYsMCwwLDAsMzYsMCwwLDAsMjksMCwwLDAsMzcsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDExNSwxMTYsMTAwLDExMSwxMTcsMTE2LDk4LDExNywxMDIsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMTc2LDM3LDAsMCw3Miw0NCwwLDAsMCwwLDAsMCwwLDAsMCwwLDU2LDM4LDAsMCwxMDIsMCwwLDAsMTAzLDAsMCwwLDMyLDAsMCwwLDIyLDAsMCwwLDI0LDAsMCwwLDI0LDAsMCwwLDIzLDAsMCwwLDI0LDAsMCwwLDIzLDAsMCwwLDM5LDAsMCwwLDQwLDAsMCwwLDM4LDAsMCwwLDI0LDAsMCwwLDM5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCw5NSw5NSwxMTUsMTE2LDEwMCwxMDUsMTEwLDk4LDExNywxMDIsNzMsOTksNjksNjksMCwyMjQsODUsMCwwLDMyLDM4LDAsMCw3Miw0NCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsOTUsOTUsMTE1LDEwNCw5NywxMTQsMTAxLDEwMCw5NSw5OSwxMTEsMTE3LDExMCwxMTYsNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsNzIsMzgsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Nyw5NSw5NSwxMTUsMTA0LDk3LDExNCwxMDEsMTAwLDk1LDExOSwxMDEsOTcsMTA3LDk1LDk5LDExMSwxMTcsMTEwLDExNiw2OSwwLDAsMCw2NCw4NiwwLDAsMTEyLDM4LDAsMCwwLDAsMCwwLDEsMCwwLDAsMTA0LDM4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMjMyLDM4LDAsMCwxMDQsMCwwLDAsMTA1LDAsMCwwLDQxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MCwzOSwwLDAsMTA2LDAsMCwwLDEwNywwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDgzLDExNiw0OSw0OSwxMDgsMTExLDEwMywxMDUsOTksOTUsMTAxLDExNCwxMTQsMTExLDExNCwwLDIyNCw4NSwwLDAsMjE2LDM4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0MCwzOSwwLDAsMTA0LDAsMCwwLDEwOCwwLDAsMCw0MSwwLDAsMCwwLDAsMCwwLDgzLDExNiw0OSw1MCwxMDgsMTAxLDExMCwxMDMsMTE2LDEwNCw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDE2LDM5LDAsMCwyMzIsMzgsMCwwLDAsMCwwLDAsODMsMTE2LDQ5LDUxLDExNCwxMTcsMTEwLDExNiwxMDUsMTA5LDEwMSw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCw1NiwzOSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEwMywxMDEsMTEwLDEwMSwxMTQsMTA1LDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw1OCwzMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDIwMCwzOSwwLDAsMTA5LDAsMCwwLDExMCwwLDAsMCwyMiwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MCwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDY5LDAsMCwyMjQsODUsMCwwLDE3NiwzOSwwLDAsODAsMzksMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUyLDEwMSwxMTQsMTE0LDExMSwxMTQsOTUsOTksOTcsMTE2LDEwMSwxMDMsMTExLDExNCwxMjEsNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsMjE2LDM5LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTAsOTUsOTUsMTAwLDExMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSw2OSwwLDAsMjI0LDg1LDAsMCwwLDQwLDAsMCwyNDgsMzksMCwwLDAsMCwwLDAsMCwwLDAsMCwxMjAsNDAsMCwwLDExMSwwLDAsMCwxMTIsMCwwLDAsNDIsMCwwLDAsMjIsMCwwLDAsMzAsMCwwLDAsMzEsMCwwLDAsMjMsMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTAsNTIsOTUsOTUsMTAzLDEwMSwxMTAsMTAxLDExNCwxMDUsOTksOTUsMTAxLDExNCwxMTQsMTExLDExNCw5NSw5OSw5NywxMTYsMTAxLDEwMywxMTEsMTE0LDEyMSw2OSwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDgwLDQwLDAsMCwyNCw0MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIxNiw0MCwwLDAsMTEzLDAsMCwwLDExNCwwLDAsMCw0MywwLDAsMCwyNCwwLDAsMCwzMCwwLDAsMCwzMSwwLDAsMCwyNSwwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw1MSw5NSw5NSwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSw5NSwxMDEsMTE0LDExNCwxMTEsMTE0LDk1LDk5LDk3LDExNiwxMDEsMTAzLDExMSwxMTQsMTIxLDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxNzYsNDAsMCwwLDI0LDQwLDAsMCwwLDAsMCwwLDEwOSwxMTcsMTE2LDEwMSwxMjAsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTAyLDk3LDEwNSwxMDgsMTAxLDEwMCwwLDAsMCwwLDAsMCwwLDEwMSw5OSwzMiw2MSw2MSwzMiw0OCwwLDQ3LDg1LDExNSwxMDEsMTE0LDExNSw0NywxMTgsMTAxLDExNCwxMDksOTcsNDcsMTE2LDEwOSwxMTIsNDcsMTAxLDEwOSwxMTUsOTksMTE0LDEwNSwxMTIsMTE2LDEwMSwxMTAsNDcsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksNDcsMTA4LDEwNSw5OCw0NywxMDgsMTA1LDk4LDk5LDEyMCwxMjAsNDcsMTA5LDExNywxMTYsMTAxLDEyMCw0Niw5OSwxMTIsMTEyLDAsMTE3LDExMCwxMDgsMTExLDk5LDEwNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywwLDAsMCwwLDAsMCwwLDAsNzIsNDQsMCwwLDExNSwwLDAsMCwxMTYsMCwwLDAsMjYsMCwwLDAsMjIsMCwwLDAsMjQsMCwwLDAsMjQsMCwwLDAsMjMsMCwwLDAsMjQsMCwwLDAsMjMsMCwwLDAsMzgsMCwwLDAsMjYsMCwwLDAsMzYsMCwwLDAsMjQsMCwwLDAsMzksMCwwLDAsMCwwLDAsMCwxMzYsNDQsMCwwLDExNywwLDAsMCwxMTgsMCwwLDAsMzMsMCwwLDAsMjUsMCwwLDAsMjMsMCwwLDAsMjMsMCwwLDAsMzQsMCwwLDAsMzEsMCwwLDAsMjYsMCwwLDAsMzIsMCwwLDAsMzMsMCwwLDAsMzIsMCwwLDAsMjgsMCwwLDAsMzUsMCwwLDAsOCwwLDAsMCwwLDAsMCwwLDE5Miw0NCwwLDAsNTYsMCwwLDAsNTcsMCwwLDAsMjQ4LDI1NSwyNTUsMjU1LDI0OCwyNTUsMjU1LDI1NSwxOTIsNDQsMCwwLDU4LDAsMCwwLDU5LDAsMCwwLDgsMCwwLDAsMCwwLDAsMCw4LDQ1LDAsMCwxMTksMCwwLDAsMTIwLDAsMCwwLDI0OCwyNTUsMjU1LDI1NSwyNDgsMjU1LDI1NSwyNTUsOCw0NSwwLDAsMTIxLDAsMCwwLDEyMiwwLDAsMCw0LDAsMCwwLDAsMCwwLDAsODAsNDUsMCwwLDEyMywwLDAsMCwxMjQsMCwwLDAsMjUyLDI1NSwyNTUsMjU1LDI1MiwyNTUsMjU1LDI1NSw4MCw0NSwwLDAsMTI1LDAsMCwwLDEyNiwwLDAsMCw0LDAsMCwwLDAsMCwwLDAsMTUyLDQ1LDAsMCwxMjcsMCwwLDAsMTI4LDAsMCwwLDI1MiwyNTUsMjU1LDI1NSwyNTIsMjU1LDI1NSwyNTUsMTUyLDQ1LDAsMCwxMjksMCwwLDAsMTMwLDAsMCwwLDEwNSwxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSwwLDAsMCwwLDAsMCwwLDAsMTE3LDExMCwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwNSwxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSw5OSw5NywxMTYsMTAxLDEwMywxMTEsMTE0LDEyMSwzMiwxMDEsMTE0LDExNCwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsOTYsNDMsMCwwLDEzMSwwLDAsMCwxMzIsMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEzNiw0MywwLDAsMTMzLDAsMCwwLDEzNCwwLDAsMCwxMDUsMTExLDExNSw5NSw5OCw5NywxMTUsMTAxLDU4LDU4LDk5LDEwOCwxMDEsOTcsMTE0LDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDEwNSwxMTEsMTE1LDk1LDk4LDk3LDExNSwxMDEsNTUsMTAyLDk3LDEwNSwxMDgsMTE3LDExNCwxMDEsNjksMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDY0LDQzLDAsMCwyMDAsMzksMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDEwNSwxMTEsMTE1LDk1LDk4LDk3LDExNSwxMDEsNjksMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDExMiw0MywwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk4LDk3LDExNSwxMDUsOTksOTUsMTA1LDExMSwxMTUsNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxNDQsNDMsMCwwLDEzNiw0MywwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDUsMTExLDExNSw3MywxMTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDExOSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMjA4LDQzLDAsMCwxMzYsNDMsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUzLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwxNiw0NCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUzLDk4LDk3LDExNSwxMDUsOTksOTUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDgwLDQ0LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTEsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksMCwwLDY0LDg2LDAsMCwxNDQsNDQsMCwwLDAsMCwwLDAsMSwwLDAsMCwxOTIsNDMsMCwwLDMsMjQ0LDI1NSwyNTUsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUxLDk4LDk3LDExNSwxMDUsOTksOTUsMTA1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksNzMsMTE5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3MywxMTksNjksNjksNjksNjksMCwwLDY0LDg2LDAsMCwyMTYsNDQsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDQ0LDAsMCwzLDI0NCwyNTUsMjU1LDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MSw5OCw5NywxMTUsMTA1LDk5LDk1LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSwwLDAsNjQsODYsMCwwLDMyLDQ1LDAsMCwwLDAsMCwwLDEsMCwwLDAsMTkyLDQzLDAsMCwzLDI0NCwyNTUsMjU1LDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1MSw5OCw5NywxMTUsMTA1LDk5LDk1LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDAsMCw2NCw4NiwwLDAsMTA0LDQ1LDAsMCwwLDAsMCwwLDEsMCwwLDAsMCw0NCwwLDAsMywyNDQsMjU1LDI1NSw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTIsOTgsOTcsMTE1LDEwNSw5OSw5NSwxMDUsMTExLDExNSwxMTYsMTE0LDEwMSw5NywxMDksNzMsOTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDk5LDY5LDY5LDY5LDY5LDAsNjQsODYsMCwwLDE3Niw0NSwwLDAsMywwLDAsMCwyLDAsMCwwLDE5Miw0NCwwLDAsMiwwLDAsMCw4MCw0NSwwLDAsMiw4LDAsMCwwLDAsMCwwLDcyLDQ2LDAsMCwxMzUsMCwwLDAsMTM2LDAsMCwwLDQ0LDAsMCwwLDIyLDAsMCwwLDMwLDAsMCwwLDMxLDAsMCwwLDI2LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU3LDk1LDk1LDEwNSwxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5NSw5OSw5NywxMTYsMTAxLDEwMywxMTEsMTE0LDEyMSw2OSwwLDAsMCwyMjQsODUsMCwwLDQwLDQ2LDAsMCwyNCw0MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDU2LDYwLDAsMCwxMzcsMCwwLDAsMTM4LDAsMCwwLDEzOSwwLDAsMCwyMiwwLDAsMCwyNSwwLDAsMCwzMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw5Niw2MCwwLDAsMTQwLDAsMCwwLDE0MSwwLDAsMCwxMzksMCwwLDAsMjMsMCwwLDAsMjYsMCwwLDAsMzMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTYsNjUsMCwwLDE0MiwwLDAsMCwxNDMsMCwwLDAsMTM5LDAsMCwwLDIyLDAsMCwwLDIzLDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDI2LDAsMCwwLDI3LDAsMCwwLDI4LDAsMCwwLDI5LDAsMCwwLDMwLDAsMCwwLDMxLDAsMCwwLDMyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw5Nyw5OCw5OSwxMDAsMTAxLDEwMiw2NSw2Niw2Nyw2OCw2OSw3MCwxMjAsODgsNDMsNDUsMTEyLDgwLDEwNSw3MywxMTAsNzgsMCwwLDAsMCwwLDAsMCwwLDM3LDExMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDE2OCw2NSwwLDAsMTQ0LDAsMCwwLDE0NSwwLDAsMCwxMzksMCwwLDAsMzMsMCwwLDAsMzQsMCwwLDAsMzUsMCwwLDAsMzYsMCwwLDAsMzcsMCwwLDAsMzgsMCwwLDAsMzksMCwwLDAsNDAsMCwwLDAsNDEsMCwwLDAsNDIsMCwwLDAsNDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTA0LDY2LDAsMCwxNDYsMCwwLDAsMTQ3LDAsMCwwLDEzOSwwLDAsMCwyNSwwLDAsMCwyNiwwLDAsMCw0NCwwLDAsMCwyNywwLDAsMCw0NSwwLDAsMCwyMiwwLDAsMCwyMywwLDAsMCwyOCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNjcsMCwwLDE0OCwwLDAsMCwxNDksMCwwLDAsMTM5LDAsMCwwLDI5LDAsMCwwLDMwLDAsMCwwLDQ2LDAsMCwwLDMxLDAsMCwwLDQ3LDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDMyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDM3LDAsMCwwLDAsMCwwLDAsMzcsMTEyLDAsMCwwLDAsMCwwLDAsMCwwLDAsNDAsNjIsMCwwLDE1MCwwLDAsMCwxNTEsMCwwLDAsMTM5LDAsMCwwLDQ1LDAsMCwwLDQ4LDAsMCwwLDQ5LDAsMCwwLDUwLDAsMCwwLDUxLDAsMCwwLDUyLDAsMCwwLDIyLDAsMCwwLDI0OCwyNTUsMjU1LDI1NSw0MCw2MiwwLDAsNDYsMCwwLDAsNDcsMCwwLDAsNDgsMCwwLDAsNDksMCwwLDAsNTAsMCwwLDAsNTEsMCwwLDAsNTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzcsNzIsNTgsMzcsNzcsNTgsMzcsODMsMzcsMTA5LDQ3LDM3LDEwMCw0NywzNywxMjEsMzcsODksNDUsMzcsMTA5LDQ1LDM3LDEwMCwzNyw3Myw1OCwzNyw3Nyw1OCwzNyw4MywzMiwzNywxMTIsMCwwLDAsMCwwLDM3LDcyLDU4LDM3LDc3LDAsMCwwLDM3LDcyLDU4LDM3LDc3LDU4LDM3LDgzLDAsMCwwLDAsMjAwLDYyLDAsMCwxNTIsMCwwLDAsMTUzLDAsMCwwLDEzOSwwLDAsMCw1MywwLDAsMCw1MywwLDAsMCw1NCwwLDAsMCw1NSwwLDAsMCw1NiwwLDAsMCw1NywwLDAsMCwyMywwLDAsMCwyNDgsMjU1LDI1NSwyNTUsMjAwLDYyLDAsMCw1NCwwLDAsMCw1NSwwLDAsMCw1NiwwLDAsMCw1NywwLDAsMCw1OCwwLDAsMCw1OSwwLDAsMCw2MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNywwLDAsMCw3MiwwLDAsMCw1OCwwLDAsMCwzNywwLDAsMCw3NywwLDAsMCw1OCwwLDAsMCwzNywwLDAsMCw4MywwLDAsMCwzNywwLDAsMCwxMDksMCwwLDAsNDcsMCwwLDAsMzcsMCwwLDAsMTAwLDAsMCwwLDQ3LDAsMCwwLDM3LDAsMCwwLDEyMSwwLDAsMCwzNywwLDAsMCw4OSwwLDAsMCw0NSwwLDAsMCwzNywwLDAsMCwxMDksMCwwLDAsNDUsMCwwLDAsMzcsMCwwLDAsMTAwLDAsMCwwLDM3LDAsMCwwLDczLDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDc3LDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDgzLDAsMCwwLDMyLDAsMCwwLDM3LDAsMCwwLDExMiwwLDAsMCwwLDAsMCwwLDM3LDAsMCwwLDcyLDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDc3LDAsMCwwLDAsMCwwLDAsMzcsMCwwLDAsNzIsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsNzcsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsODMsMCwwLDAsMCwwLDAsMCw4OCw2MywwLDAsMTU0LDAsMCwwLDE1NSwwLDAsMCwxMzksMCwwLDAsMjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTkyLDYzLDAsMCwxNTYsMCwwLDAsMTU3LDAsMCwwLDEzOSwwLDAsMCwyMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNzYsNjAsMCwwLDE1OCwwLDAsMCwxNTksMCwwLDAsMTM5LDAsMCwwLDYxLDAsMCwwLDYyLDAsMCwwLDM0LDAsMCwwLDM1LDAsMCwwLDM2LDAsMCwwLDM3LDAsMCwwLDYzLDAsMCwwLDM4LDAsMCwwLDM5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDI0MCw2MCwwLDAsMTYwLDAsMCwwLDE2MSwwLDAsMCwxMzksMCwwLDAsNjQsMCwwLDAsNjUsMCwwLDAsNDAsMCwwLDAsNDEsMCwwLDAsNDIsMCwwLDAsNDMsMCwwLDAsNjYsMCwwLDAsNDQsMCwwLDAsNDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNDgsNjEsMCwwLDE2MiwwLDAsMCwxNjMsMCwwLDAsMTM5LDAsMCwwLDY3LDAsMCwwLDY4LDAsMCwwLDQ2LDAsMCwwLDQ3LDAsMCwwLDQ4LDAsMCwwLDQ5LDAsMCwwLDY5LDAsMCwwLDUwLDAsMCwwLDUxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDExMiw2MSwwLDAsMTY0LDAsMCwwLDE2NSwwLDAsMCwxMzksMCwwLDAsNzAsMCwwLDAsNzEsMCwwLDAsNTIsMCwwLDAsNTMsMCwwLDAsNTQsMCwwLDAsNTUsMCwwLDAsNzIsMCwwLDAsNTYsMCwwLDAsNTcsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTQ0LDY3LDAsMCwxNjYsMCwwLDAsMTY3LDAsMCwwLDEzOSwwLDAsMCwyNCwwLDAsMCwyNSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1NywwLDAsMCwwLDAsMCwzNyw3NiwxMDIsMCwwLDAsMCwwLDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTAzLDEwMSwxMTYsMzIsMTAxLDExNCwxMTQsMTExLDExNCwwLDAsMCwwLDAsMzIsNjgsMCwwLDE2OCwwLDAsMCwxNjksMCwwLDAsMTM5LDAsMCwwLDI2LDAsMCwwLDI3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMTc2LDY4LDAsMCwxNzAsMCwwLDAsMTcxLDAsMCwwLDEzOSwwLDAsMCwyMiwwLDAsMCw1OCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNyw0Niw0OCw3NiwxMDIsMCwwLDAsMCwwLDAsMCw2NCw2OSwwLDAsMTcyLDAsMCwwLDE3MywwLDAsMCwxMzksMCwwLDAsMjMsMCwwLDAsNTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNCw2NCwwLDAsMTc0LDAsMCwwLDE3NSwwLDAsMCwxMzksMCwwLDAsMzQsMCwwLDAsMzMsMCwwLDAsNTgsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODAsNjQsMCwwLDE3NiwwLDAsMCwxNzcsMCwwLDAsMTM5LDAsMCwwLDM1LDAsMCwwLDM0LDAsMCwwLDU5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMTgsMTAxLDk5LDExNiwxMTEsMTE0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDY3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNiw2MCwwLDAsMTc4LDAsMCwwLDE3OSwwLDAsMCwxMzksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyMzIsNTYsMCwwLDE4MCwwLDAsMCwxODEsMCwwLDAsMTM5LDAsMCwwLDQwLDAsMCwwLDM2LDAsMCwwLDQxLDAsMCwwLDM3LDAsMCwwLDQyLDAsMCwwLDIyLDAsMCwwLDM4LDAsMCwwLDI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIwMCw1NywwLDAsMTgyLDAsMCwwLDE4MywwLDAsMCwxMzksMCwwLDAsMjIsMCwwLDAsMjMsMCwwLDAsMjUsMCwwLDAsNzMsMCwwLDAsNzQsMCwwLDAsMjYsMCwwLDAsNzUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTkyLDU5LDAsMCwxODQsMCwwLDAsMTg1LDAsMCwwLDEzOSwwLDAsMCw3NiwwLDAsMCw3NywwLDAsMCw2MCwwLDAsMCw2MSwwLDAsMCw2MiwwLDAsMCwwLDAsMCwwLDIzMiw1OSwwLDAsMTg2LDAsMCwwLDE4NywwLDAsMCwxMzksMCwwLDAsNzgsMCwwLDAsNzksMCwwLDAsNjMsMCwwLDAsNjQsMCwwLDAsNjUsMCwwLDAsMTE2LDAsMCwwLDExNCwwLDAsMCwxMTcsMCwwLDAsMTAxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMDIsOTcsMTA4LDExNSwxMDEsMCwwLDAsMTAyLDAsMCwwLDk3LDAsMCwwLDEwOCwwLDAsMCwxMTUsMCwwLDAsMTAxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzcsMCwwLDAsMTA5LDAsMCwwLDQ3LDAsMCwwLDM3LDAsMCwwLDEwMCwwLDAsMCw0NywwLDAsMCwzNywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDM3LDAsMCwwLDcyLDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDc3LDAsMCwwLDU4LDAsMCwwLDM3LDAsMCwwLDgzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNyw5NywzMiwzNyw5OCwzMiwzNywxMDAsMzIsMzcsNzIsNTgsMzcsNzcsNTgsMzcsODMsMzIsMzcsODksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzNywwLDAsMCw5NywwLDAsMCwzMiwwLDAsMCwzNywwLDAsMCw5OCwwLDAsMCwzMiwwLDAsMCwzNywwLDAsMCwxMDAsMCwwLDAsMzIsMCwwLDAsMzcsMCwwLDAsNzIsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsNzcsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsODMsMCwwLDAsMzIsMCwwLDAsMzcsMCwwLDAsODksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDM3LDczLDU4LDM3LDc3LDU4LDM3LDgzLDMyLDM3LDExMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMzcsMCwwLDAsNzMsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsNzcsMCwwLDAsNTgsMCwwLDAsMzcsMCwwLDAsODMsMCwwLDAsMzIsMCwwLDAsMzcsMCwwLDAsMTEyLDAsMCwwLDAsMCwwLDAsMTA4LDExMSw5OSw5NywxMDgsMTAxLDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDAsMCwwLDAsMCwwLDAsMCwzMiw1NiwwLDAsMTg4LDAsMCwwLDE4OSwwLDAsMCwxMzksMCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTQsMTA4LDExMSw5OSw5NywxMDgsMTAxLDUzLDEwMiw5Nyw5OSwxMDEsMTE2LDY5LDAsMCwwLDIyNCw4NSwwLDAsOCw1NiwwLDAsMTA0LDM4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMTc2LDU2LDAsMCwxODgsMCwwLDAsMTkwLDAsMCwwLDEzOSwwLDAsMCwzOSwwLDAsMCwyMywwLDAsMCwyNCwwLDAsMCwyNSwwLDAsMCw0MywwLDAsMCw0MCwwLDAsMCw0NCwwLDAsMCw0MSwwLDAsMCw0NSwwLDAsMCwyNiwwLDAsMCw0MiwwLDAsMCwyNywwLDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1Myw5OSwxMTYsMTIxLDExMiwxMDEsNzMsMTE5LDY5LDY5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDk5LDExNiwxMjEsMTEyLDEwMSw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMTIwLDg0LDAsMCwxNDQsNTYsMCwwLDY0LDg2LDAsMCwxMjAsNTYsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNTYsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDUzLDk5LDExNiwxMjEsMTEyLDEwMSw3Myw5OSw2OSw2OSwwLDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwyMDgsNTYsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNTYsMCwwLDIsMCwwLDAsMCwwLDAsMCwxMjgsNTcsMCwwLDE4OCwwLDAsMCwxOTEsMCwwLDAsMTM5LDAsMCwwLDI0LDAsMCwwLDI1LDAsMCwwLDI4LDAsMCwwLDgwLDAsMCwwLDgxLDAsMCwwLDI5LDAsMCwwLDgyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSw5OSwxMTEsMTAwLDEwMSw5OSwxMTgsMTE2LDczLDk5LDk5LDQ5LDQ5LDk1LDk1LDEwOSw5OCwxMTUsMTE2LDk3LDExNiwxMDEsOTUsMTE2LDY5LDY5LDAsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDUwLDk5LDExMSwxMDAsMTAxLDk5LDExOCwxMTYsOTUsOTgsOTcsMTE1LDEwMSw2OSwwLDAsMTIwLDg0LDAsMCw5Niw1NywwLDAsNjQsODYsMCwwLDU2LDU3LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMTIwLDU3LDAsMCwyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSw5OSwxMTEsMTAwLDEwMSw5OSwxMTgsMTE2LDczLDExOSw5OSw0OSw0OSw5NSw5NSwxMDksOTgsMTE1LDExNiw5NywxMTYsMTAxLDk1LDExNiw2OSw2OSwwLDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwxNjAsNTcsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxMjAsNTcsMCwwLDIsMCwwLDAsMCwwLDAsMCw2NCw1OCwwLDAsMTg4LDAsMCwwLDE5MiwwLDAsMCwxMzksMCwwLDAsMjYsMCwwLDAsMjcsMCwwLDAsMzAsMCwwLDAsODMsMCwwLDAsODQsMCwwLDAsMzEsMCwwLDAsODUsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDk5LDExMSwxMDAsMTAxLDk5LDExOCwxMTYsNzMsNjgsMTE1LDk5LDQ5LDQ5LDk1LDk1LDEwOSw5OCwxMTUsMTE2LDk3LDExNiwxMDEsOTUsMTE2LDY5LDY5LDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwyNCw1OCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDEyMCw1NywwLDAsMiwwLDAsMCwwLDAsMCwwLDE4NCw1OCwwLDAsMTg4LDAsMCwwLDE5MywwLDAsMCwxMzksMCwwLDAsMjgsMCwwLDAsMjksMCwwLDAsMzIsMCwwLDAsODYsMCwwLDAsODcsMCwwLDAsMzMsMCwwLDAsODgsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDk5LDExMSwxMDAsMTAxLDk5LDExOCwxMTYsNzMsNjgsMTA1LDk5LDQ5LDQ5LDk1LDk1LDEwOSw5OCwxMTUsMTE2LDk3LDExNiwxMDEsOTUsMTE2LDY5LDY5LDAsMCwwLDAsMCwwLDY0LDg2LDAsMCwxNDQsNTgsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxMjAsNTcsMCwwLDIsMCwwLDAsMCwwLDAsMCw0OCw1OSwwLDAsMTg4LDAsMCwwLDE5NCwwLDAsMCwxMzksMCwwLDAsMjgsMCwwLDAsMjksMCwwLDAsMzIsMCwwLDAsODYsMCwwLDAsODcsMCwwLDAsMzMsMCwwLDAsODgsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU0LDk1LDk1LDExMCw5NywxMTQsMTE0LDExMSwxMTksOTUsMTE2LDExMSw5NSwxMTcsMTE2LDEwMiw1Niw3Myw3NiwxMDYsNTEsNTAsNjksNjksNjksMCwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDgsNTksMCwwLDE4NCw1OCwwLDAsMCwwLDAsMCwwLDAsMCwwLDE1Miw1OSwwLDAsMTg4LDAsMCwwLDE5NSwwLDAsMCwxMzksMCwwLDAsMjgsMCwwLDAsMjksMCwwLDAsMzIsMCwwLDAsODYsMCwwLDAsODcsMCwwLDAsMzMsMCwwLDAsODgsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDU1LDk1LDk1LDExOSwxMDUsMTAwLDEwMSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExNywxMTYsMTAyLDU2LDczLDc2LDEwNiw1MSw1MCw2OSw2OSw2OSwwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDExMiw1OSwwLDAsMTg0LDU4LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMTAsMTE3LDEwOSwxMTIsMTE3LDExMCw5OSwxMTYsNzMsOTksNjksNjksMCwwLDAsMCwyMjQsODUsMCwwLDE2OCw1OSwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDExMCwxMTcsMTA5LDExMiwxMTcsMTEwLDk5LDExNiw3MywxMTksNjksNjksMCwwLDAsMCwyMjQsODUsMCwwLDIwOCw1OSwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU0LDEwOCwxMTEsOTksOTcsMTA4LDEwMSw1Myw5NSw5NSwxMDUsMTA5LDExMiw2OSwwLDAsMCwyMjQsODUsMCwwLDI0OCw1OSwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDk5LDExMSwxMDgsMTA4LDk3LDExNiwxMDEsNzMsOTksNjksNjksMCwwLDAsMCwwLDIyNCw4NSwwLDAsMzIsNjAsMCwwLDMyLDU2LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSw5OSwxMTEsMTA4LDEwOCw5NywxMTYsMTAxLDczLDExOSw2OSw2OSwwLDAsMCwwLDAsMjI0LDg1LDAsMCw3Miw2MCwwLDAsMzIsNTYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDEwOSwxMTEsMTEwLDEwMSwxMjEsMTEyLDExNywxMTAsOTksMTE2LDczLDk5LDc2LDk4LDQ4LDY5LDY5LDY5LDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNDgsMTA5LDExMSwxMTAsMTAxLDEyMSw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMTIwLDg0LDAsMCwxNDQsNjAsMCwwLDY0LDg2LDAsMCwxMTIsNjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNjAsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ4LDEwOSwxMTEsMTEwLDEwMSwxMjEsMTEyLDExNywxMTAsOTksMTE2LDczLDk5LDc2LDk4LDQ5LDY5LDY5LDY5LDAsMCwwLDAsMCw2NCw4NiwwLDAsMjA4LDYwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMTY4LDYwLDAsMCwyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OCwxMDksMTExLDExMCwxMDEsMTIxLDExMiwxMTcsMTEwLDk5LDExNiw3MywxMTksNzYsOTgsNDgsNjksNjksNjksMCwwLDAsMCwwLDY0LDg2LDAsMCwxNiw2MSwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDE2OCw2MCwwLDAsMiwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNDgsMTA5LDExMSwxMTAsMTAxLDEyMSwxMTIsMTE3LDExMCw5OSwxMTYsNzMsMTE5LDc2LDk4LDQ5LDY5LDY5LDY5LDAsMCwwLDAsMCw2NCw4NiwwLDAsODAsNjEsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNjAsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDExNiwxMDUsMTA5LDEwMSw5NSwxMDMsMTAxLDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsMTE2LDEwNSwxMDksMTAxLDk1LDk4LDk3LDExNSwxMDEsNjksMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwyMTYsNjEsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTYsMTA1LDEwOSwxMDEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTUsMTE1LDExNiwxMTEsMTE0LDk3LDEwMywxMDEsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDI0OCw2MSwwLDAsNjQsODYsMCwwLDE0NCw2MSwwLDAsMCwwLDAsMCwzLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDI0MCw2MSwwLDAsMiwwLDAsMCwzMiw2MiwwLDAsMCw4LDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTYsMTE2LDEwNSwxMDksMTAxLDk1LDEwMywxMDEsMTE2LDczLDExOSw3OCw4Myw5NSw0OSw1NywxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3MywxMTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDExOSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1MCw0OCw5NSw5NSwxMTYsMTA1LDEwOSwxMDEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTUsMTE1LDExNiwxMTEsMTE0LDk3LDEwMywxMDEsNzMsMTE5LDY5LDY5LDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwxNTIsNjIsMCwwLDY0LDg2LDAsMCw4MCw2MiwwLDAsMCwwLDAsMCwzLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDI0MCw2MSwwLDAsMiwwLDAsMCwxOTIsNjIsMCwwLDAsOCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU2LDExNiwxMDUsMTA5LDEwMSw5NSwxMTIsMTE3LDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNDgsOTUsOTUsMTE2LDEwNSwxMDksMTAxLDk1LDExMiwxMTcsMTE2LDY5LDAsMCwwLDAsMTIwLDg0LDAsMCw1Niw2MywwLDAsNjQsODYsMCwwLDI0MCw2MiwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDgwLDYzLDAsMCwwLDgsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMTYsMTA1LDEwOSwxMDEsOTUsMTEyLDExNywxMTYsNzMsMTE5LDc4LDgzLDk1LDQ5LDU3LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDAsNjQsODYsMCwwLDEyMCw2MywwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDgwLDYzLDAsMCwwLDgsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTUsNzMsOTksNjksNjksMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNDksNTEsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMTE1LDk1LDk4LDk3LDExNSwxMDEsNjksMCwxMjAsODQsMCwwLDI0OCw2MywwLDAsNjQsODYsMCwwLDIyNCw2MywwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDE2LDY0LDAsMCwyLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTUsNzMsMTE5LDY5LDY5LDAsMCwwLDAsNjQsODYsMCwwLDU2LDY0LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMTYsNjQsMCwwLDIsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDExMCwxMTcsMTA5LDk1LDEwMywxMDEsMTE2LDczLDk5LDc4LDgzLDk1LDQ5LDU3LDEwNSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk1LDk1LDExMCwxMTcsMTA5LDk1LDEwMywxMDEsMTE2LDczLDk5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Miw5NSw5NSwxMTAsMTE3LDEwOSw5NSwxMDMsMTAxLDExNiw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDIwOCw2NCwwLDAsNjQsODYsMCwwLDE4NCw2NCwwLDAsMCwwLDAsMCwxLDAsMCwwLDI0MCw2NCwwLDAsMCwwLDAsMCw2NCw4NiwwLDAsMTEyLDY0LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsMjQ4LDY0LDAsMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1NSwxMTAsMTE3LDEwOSw5NSwxMDMsMTAxLDExNiw3MywxMTksNzgsODMsOTUsNDksNTcsMTA1LDExNSwxMTYsMTE0LDEwMSw5NywxMDksOTgsMTE3LDEwMiw5NSwxMDUsMTE2LDEwMSwxMTQsOTcsMTE2LDExMSwxMTQsNzMsMTE5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3MywxMTksNjksNjksNjksNjksNjksNjksMCwwLDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw1Nyw5NSw5NSwxMTAsMTE3LDEwOSw5NSwxMDMsMTAxLDExNiw3MywxMTksNjksNjksMCwwLDAsNjQsODYsMCwwLDEyMCw2NSwwLDAsMCwwLDAsMCwxLDAsMCwwLDI0MCw2NCwwLDAsMCwwLDAsMCw2NCw4NiwwLDAsNDgsNjUsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNDQsNjUsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDk5LDc4LDgzLDk1LDQ5LDU3LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDk5LDc4LDgzLDk1LDQ5LDQ5LDk5LDEwNCw5NywxMTQsOTUsMTE2LDExNCw5NywxMDUsMTE2LDExNSw3Myw5OSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk1LDk1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDk5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw1Miw5NSw5NSwxMTAsMTE3LDEwOSw5NSwxMTIsMTE3LDExNiw5NSw5OCw5NywxMTUsMTAxLDY5LDAsMCwwLDAsMCwwLDAsMCwxMjAsODQsMCwwLDQwLDY2LDAsMCw2NCw4NiwwLDAsMTYsNjYsMCwwLDAsMCwwLDAsMSwwLDAsMCw3Miw2NiwwLDAsMCwwLDAsMCw2NCw4NiwwLDAsMjAwLDY1LDAsMCwwLDAsMCwwLDIsMCwwLDAsMzIsNTYsMCwwLDIsMCwwLDAsODAsNjYsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDExOSw3OCw4Myw5NSw0OSw1NywxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3MywxMTksNzgsODMsOTUsNDksNDksOTksMTA0LDk3LDExNCw5NSwxMTYsMTE0LDk3LDEwNSwxMTYsMTE1LDczLDExOSw2OSw2OSw2OSw2OSw2OSw2OSwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDk1LDk1LDExMCwxMTcsMTA5LDk1LDExMiwxMTcsMTE2LDczLDExOSw2OSw2OSwwLDAsMCw2NCw4NiwwLDAsMjA4LDY2LDAsMCwwLDAsMCwwLDEsMCwwLDAsNzIsNjYsMCwwLDAsMCwwLDAsNjQsODYsMCwwLDEzNiw2NiwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDIzMiw2NiwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsMTA5LDExMSwxMTAsMTAxLDEyMSw5NSwxMDMsMTAxLDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMDUsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTAzLDEwMSwxMTYsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsMTA0LDY3LDAsMCw2NCw4NiwwLDAsMzIsNjcsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxMzYsNjcsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTAzLDEwMSwxMTYsNzMsMTE5LDc4LDgzLDk1LDQ5LDU3LDEwNSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OSw5NSw5NSwxMDksMTExLDExMCwxMDEsMTIxLDk1LDEwMywxMDEsMTE2LDczLDExOSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwyNDgsNjcsMCwwLDY0LDg2LDAsMCwxNzYsNjcsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwyNCw2OCwwLDAsMCwwLDAsMCw3OCw4MywxMTYsNTEsOTUsOTUsNDksNTcsMTA5LDExMSwxMTAsMTAxLDEyMSw5NSwxMTIsMTE3LDExNiw3Myw5OSw3OCw4Myw5NSw0OSw1NywxMTEsMTE1LDExNiwxMTQsMTAxLDk3LDEwOSw5OCwxMTcsMTAyLDk1LDEwNSwxMTYsMTAxLDExNCw5NywxMTYsMTExLDExNCw3Myw5OSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsOTksNjksNjksNjksNjksNjksNjksMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDQ5LDQ5LDk1LDk1LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTEyLDExNywxMTYsNzMsOTksNjksNjksMCwwLDAsMCwwLDAsMCwwLDEyMCw4NCwwLDAsMTM2LDY4LDAsMCw2NCw4NiwwLDAsNjQsNjgsMCwwLDAsMCwwLDAsMiwwLDAsMCwzMiw1NiwwLDAsMiwwLDAsMCwxNjgsNjgsMCwwLDAsMCwwLDAsNzgsODMsMTE2LDUxLDk1LDk1LDQ5LDU3LDEwOSwxMTEsMTEwLDEwMSwxMjEsOTUsMTEyLDExNywxMTYsNzMsMTE5LDc4LDgzLDk1LDQ5LDU3LDExMSwxMTUsMTE2LDExNCwxMDEsOTcsMTA5LDk4LDExNywxMDIsOTUsMTA1LDExNiwxMDEsMTE0LDk3LDExNiwxMTEsMTE0LDczLDExOSw3OCw4Myw5NSw0OSw0OSw5OSwxMDQsOTcsMTE0LDk1LDExNiwxMTQsOTcsMTA1LDExNiwxMTUsNzMsMTE5LDY5LDY5LDY5LDY5LDY5LDY5LDAsMCwwLDc4LDgzLDExNiw1MSw5NSw5NSw0OSw0OSw0OSw5NSw5NSwxMDksMTExLDExMCwxMDEsMTIxLDk1LDExMiwxMTcsMTE2LDczLDExOSw2OSw2OSwwLDAsMCwwLDAsMCwwLDAsMTIwLDg0LDAsMCwyNCw2OSwwLDAsNjQsODYsMCwwLDIwOCw2OCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMyLDU2LDAsMCwyLDAsMCwwLDU2LDY5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDY1LDAsMCwwLDc3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MCwwLDAsMCw3NywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDY1LDc3LDAsMCwwLDAsMCwwLDgwLDc3LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3NCwwLDAsMCw5NywwLDAsMCwxMTAsMCwwLDAsMTE3LDAsMCwwLDk3LDAsMCwwLDExNCwwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCw3MCwwLDAsMCwxMDEsMCwwLDAsOTgsMCwwLDAsMTE0LDAsMCwwLDExNywwLDAsMCw5NywwLDAsMCwxMTQsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3NywwLDAsMCw5NywwLDAsMCwxMTQsMCwwLDAsOTksMCwwLDAsMTA0LDAsMCwwLDAsMCwwLDAsNjUsMCwwLDAsMTEyLDAsMCwwLDExNCwwLDAsMCwxMDUsMCwwLDAsMTA4LDAsMCwwLDAsMCwwLDAsNzQsMCwwLDAsMTE3LDAsMCwwLDExMCwwLDAsMCwxMDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDc0LDAsMCwwLDExNywwLDAsMCwxMDgsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw2NSwwLDAsMCwxMTcsMCwwLDAsMTAzLDAsMCwwLDExNywwLDAsMCwxMTUsMCwwLDAsMTE2LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCwxMDEsMCwwLDAsMTEyLDAsMCwwLDExNiwwLDAsMCwxMDEsMCwwLDAsMTA5LDAsMCwwLDk4LDAsMCwwLDEwMSwwLDAsMCwxMTQsMCwwLDAsMCwwLDAsMCw3OSwwLDAsMCw5OSwwLDAsMCwxMTYsMCwwLDAsMTExLDAsMCwwLDk4LDAsMCwwLDEwMSwwLDAsMCwxMTQsMCwwLDAsMCwwLDAsMCw3OCwwLDAsMCwxMTEsMCwwLDAsMTE4LDAsMCwwLDEwMSwwLDAsMCwxMDksMCwwLDAsOTgsMCwwLDAsMTAxLDAsMCwwLDExNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNjgsMCwwLDAsMTAxLDAsMCwwLDk5LDAsMCwwLDEwMSwwLDAsMCwxMDksMCwwLDAsOTgsMCwwLDAsMTAxLDAsMCwwLDExNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzQsMCwwLDAsOTcsMCwwLDAsMTEwLDAsMCwwLDAsMCwwLDAsNzAsMCwwLDAsMTAxLDAsMCwwLDk4LDAsMCwwLDAsMCwwLDAsNzcsMCwwLDAsOTcsMCwwLDAsMTE0LDAsMCwwLDAsMCwwLDAsNjVdLCJpOCIsQUxMT0NfTk9ORSxSdW50aW1lLkdMT0JBTF9CQVNFKzkzMjQpO2FsbG9jYXRlKFsxMTIsMCwwLDAsMTE0LDAsMCwwLDAsMCwwLDAsNzcsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsNzQsMCwwLDAsMTE3LDAsMCwwLDExMCwwLDAsMCwwLDAsMCwwLDc0LDAsMCwwLDExNywwLDAsMCwxMDgsMCwwLDAsMCwwLDAsMCw2NSwwLDAsMCwxMTcsMCwwLDAsMTAzLDAsMCwwLDAsMCwwLDAsODMsMCwwLDAsMTAxLDAsMCwwLDExMiwwLDAsMCwwLDAsMCwwLDc5LDAsMCwwLDk5LDAsMCwwLDExNiwwLDAsMCwwLDAsMCwwLDc4LDAsMCwwLDExMSwwLDAsMCwxMTgsMCwwLDAsMCwwLDAsMCw2OCwwLDAsMCwxMDEsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzQsOTcsMTEwLDExNyw5NywxMTQsMTIxLDAsNzAsMTAxLDk4LDExNCwxMTcsOTcsMTE0LDEyMSwwLDAsMCwwLDAsMCwwLDAsNzcsOTcsMTE0LDk5LDEwNCwwLDAsMCw2NSwxMTIsMTE0LDEwNSwxMDgsMCwwLDAsNzcsOTcsMTIxLDAsMCwwLDAsMCw3NCwxMTcsMTEwLDEwMSwwLDAsMCwwLDc0LDExNywxMDgsMTIxLDAsMCwwLDAsNjUsMTE3LDEwMywxMTcsMTE1LDExNiwwLDAsODMsMTAxLDExMiwxMTYsMTAxLDEwOSw5OCwxMDEsMTE0LDAsMCwwLDAsMCwwLDAsNzksOTksMTE2LDExMSw5OCwxMDEsMTE0LDAsNzgsMTExLDExOCwxMDEsMTA5LDk4LDEwMSwxMTQsMCwwLDAsMCwwLDAsMCwwLDY4LDEwMSw5OSwxMDEsMTA5LDk4LDEwMSwxMTQsMCwwLDAsMCwwLDAsMCwwLDc0LDk3LDExMCwwLDAsMCwwLDAsNzAsMTAxLDk4LDAsMCwwLDAsMCw3Nyw5NywxMTQsMCwwLDAsMCwwLDY1LDExMiwxMTQsMCwwLDAsMCwwLDc0LDExNywxMTAsMCwwLDAsMCwwLDc0LDExNywxMDgsMCwwLDAsMCwwLDY1LDExNywxMDMsMCwwLDAsMCwwLDgzLDEwMSwxMTIsMCwwLDAsMCwwLDc5LDk5LDExNiwwLDAsMCwwLDAsNzgsMTExLDExOCwwLDAsMCwwLDAsNjgsMTAxLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODMsMCwwLDAsMTE3LDAsMCwwLDExMCwwLDAsMCwxMDAsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3NywwLDAsMCwxMTEsMCwwLDAsMTEwLDAsMCwwLDEwMCwwLDAsMCw5NywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDg0LDAsMCwwLDExNywwLDAsMCwxMDEsMCwwLDAsMTE1LDAsMCwwLDEwMCwwLDAsMCw5NywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCw4NywwLDAsMCwxMDEsMCwwLDAsMTAwLDAsMCwwLDExMCwwLDAsMCwxMDEsMCwwLDAsMTE1LDAsMCwwLDEwMCwwLDAsMCw5NywwLDAsMCwxMjEsMCwwLDAsMCwwLDAsMCw4NCwwLDAsMCwxMDQsMCwwLDAsMTE3LDAsMCwwLDExNCwwLDAsMCwxMTUsMCwwLDAsMTAwLDAsMCwwLDk3LDAsMCwwLDEyMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzAsMCwwLDAsMTE0LDAsMCwwLDEwNSwwLDAsMCwxMDAsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCw5NywwLDAsMCwxMTYsMCwwLDAsMTE3LDAsMCwwLDExNCwwLDAsMCwxMDAsMCwwLDAsOTcsMCwwLDAsMTIxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCwxMTcsMCwwLDAsMTEwLDAsMCwwLDAsMCwwLDAsNzcsMCwwLDAsMTExLDAsMCwwLDExMCwwLDAsMCwwLDAsMCwwLDg0LDAsMCwwLDExNywwLDAsMCwxMDEsMCwwLDAsMCwwLDAsMCw4NywwLDAsMCwxMDEsMCwwLDAsMTAwLDAsMCwwLDAsMCwwLDAsODQsMCwwLDAsMTA0LDAsMCwwLDExNywwLDAsMCwwLDAsMCwwLDcwLDAsMCwwLDExNCwwLDAsMCwxMDUsMCwwLDAsMCwwLDAsMCw4MywwLDAsMCw5NywwLDAsMCwxMTYsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODMsMTE3LDExMCwxMDAsOTcsMTIxLDAsMCw3NywxMTEsMTEwLDEwMCw5NywxMjEsMCwwLDg0LDExNywxMDEsMTE1LDEwMCw5NywxMjEsMCw4NywxMDEsMTAwLDExMCwxMDEsMTE1LDEwMCw5NywxMjEsMCwwLDAsMCwwLDAsMCw4NCwxMDQsMTE3LDExNCwxMTUsMTAwLDk3LDEyMSwwLDAsMCwwLDAsMCwwLDAsNzAsMTE0LDEwNSwxMDAsOTcsMTIxLDAsMCw4Myw5NywxMTYsMTE3LDExNCwxMDAsOTcsMTIxLDAsMCwwLDAsMCwwLDAsMCw4MywxMTcsMTEwLDAsMCwwLDAsMCw3NywxMTEsMTEwLDAsMCwwLDAsMCw4NCwxMTcsMTAxLDAsMCwwLDAsMCw4NywxMDEsMTAwLDAsMCwwLDAsMCw4NCwxMDQsMTE3LDAsMCwwLDAsMCw3MCwxMTQsMTA1LDAsMCwwLDAsMCw4Myw5NywxMTYsMCwwLDAsMCwwLDIsMCwwLDE5MiwzLDAsMCwxOTIsNCwwLDAsMTkyLDUsMCwwLDE5Miw2LDAsMCwxOTIsNywwLDAsMTkyLDgsMCwwLDE5Miw5LDAsMCwxOTIsMTAsMCwwLDE5MiwxMSwwLDAsMTkyLDEyLDAsMCwxOTIsMTMsMCwwLDE5MiwxNCwwLDAsMTkyLDE1LDAsMCwxOTIsMTYsMCwwLDE5MiwxNywwLDAsMTkyLDE4LDAsMCwxOTIsMTksMCwwLDE5MiwyMCwwLDAsMTkyLDIxLDAsMCwxOTIsMjIsMCwwLDE5MiwyMywwLDAsMTkyLDI0LDAsMCwxOTIsMjUsMCwwLDE5MiwyNiwwLDAsMTkyLDI3LDAsMCwxOTIsMjgsMCwwLDE5MiwyOSwwLDAsMTkyLDMwLDAsMCwxOTIsMzEsMCwwLDE5MiwwLDAsMCwxNzksMSwwLDAsMTk1LDIsMCwwLDE5NSwzLDAsMCwxOTUsNCwwLDAsMTk1LDUsMCwwLDE5NSw2LDAsMCwxOTUsNywwLDAsMTk1LDgsMCwwLDE5NSw5LDAsMCwxOTUsMTAsMCwwLDE5NSwxMSwwLDAsMTk1LDEyLDAsMCwxOTUsMTMsMCwwLDIxMSwxNCwwLDAsMTk1LDE1LDAsMCwxOTUsMCwwLDEyLDE4NywxLDAsMTIsMTk1LDIsMCwxMiwxOTUsMywwLDEyLDE5NSw0LDAsMTIsMjExLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEyOCw4MywwLDAsMTk2LDAsMCwwLDE5NywwLDAsMCw4OSwwLDAsMCwwLDAsMCwwLDExNSwxMTYsMTAwLDU4LDU4LDk4LDk3LDEwMCw5NSw5OSw5NywxMTUsMTE2LDAsMCwwLDgzLDExNiw1NywxMTYsMTIxLDExMiwxMDEsOTUsMTA1LDExMCwxMDIsMTExLDAsMCwwLDAsMTIwLDg0LDAsMCw4OCw4MywwLDAsODMsMTE2LDU2LDk4LDk3LDEwMCw5NSw5OSw5NywxMTUsMTE2LDAsMCwwLDAsMCwyMjQsODUsMCwwLDExMiw4MywwLDAsMCwwLDAsMCwwLDAsMCwwLDc4LDQ5LDQ4LDk1LDk1LDk5LDEyMCwxMjAsOTcsOTgsMTA1LDExOCw0OSw0OSw1NCw5NSw5NSwxMTUsMTA0LDEwNSwxMDksOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwwLDAsMCwwLDAsMjI0LDg1LDAsMCwxNDQsODMsMCwwLDEwNCw4MywwLDAsMCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNDksNTUsOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsMjAwLDgzLDAsMCwxODQsODMsMCwwLDAsMCwwLDAsNzgsNDksNDgsOTUsOTUsOTksMTIwLDEyMCw5Nyw5OCwxMDUsMTE4LDQ5LDQ5LDU3LDk1LDk1LDExMiwxMTEsMTA1LDExMCwxMTYsMTAxLDExNCw5NSwxMTYsMTIxLDExMiwxMDEsOTUsMTA1LDExMCwxMDIsMTExLDY5LDAsMCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNDksNTUsOTUsOTUsMTEyLDk4LDk3LDExNSwxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwwLDAsMCwwLDIyNCw4NSwwLDAsNDAsODQsMCwwLDE4NCw4MywwLDAsMCwwLDAsMCwyMjQsODUsMCwwLDAsODQsMCwwLDgwLDg0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMjQwLDgzLDAsMCwxOTgsMCwwLDAsMTk5LDAsMCwwLDIwMCwwLDAsMCwyMDEsMCwwLDAsNDMsMCwwLDAsMzUsMCwwLDAsMjIsMCwwLDAsMjcsMCwwLDAsMCwwLDAsMCw5Niw4NCwwLDAsMTk4LDAsMCwwLDIwMiwwLDAsMCwyMDAsMCwwLDAsMjAxLDAsMCwwLDQ0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDg1LDAsMCwxOTgsMCwwLDAsMjAzLDAsMCwwLDIwMCwwLDAsMCwyMDEsMCwwLDAsNDUsMCwwLDAsMCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNTAsNTEsOTUsOTUsMTAyLDExNywxMTAsMTAwLDk3LDEwOSwxMDEsMTEwLDExNiw5NywxMDgsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDIyNCw4NSwwLDAsMjE2LDg0LDAsMCwxODQsODMsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCwxMTIsMTcsMCwwLDY4LDExMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDI0LDg1LDAsMCw5OCwwLDAsMCwwLDAsMCwwLDE5Miw4NCwwLDAsNDAsODUsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCw1Niw4NSwwLDAsMTA0LDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCw3Miw4NSwwLDAsOTcsMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDg4LDg1LDAsMCwxOTIsODQsMCwwLDEyOCwxNywwLDAsMTkyLDg0LDAsMCwxMjAsMTcsMCwwLDEwNSwwLDAsMCwwLDAsMCwwLDE5Miw4NCwwLDAsMTIwLDg1LDAsMCwxMDYsMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDEzNiw4NSwwLDAsMTA4LDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCwxNTIsODUsMCwwLDEwOSwwLDAsMCwwLDAsMCwwLDE5Miw4NCwwLDAsMTY4LDg1LDAsMCwxMDIsMCwwLDAsMCwwLDAsMCwxOTIsODQsMCwwLDE4NCw4NSwwLDAsMTAwLDAsMCwwLDAsMCwwLDAsMTkyLDg0LDAsMCwyMDAsODUsMCwwLDAsMCwwLDAsNDAsODYsMCwwLDE5OCwwLDAsMCwyMDQsMCwwLDAsMjAwLDAsMCwwLDIwMSwwLDAsMCw0MywwLDAsMCwzNiwwLDAsMCwyMywwLDAsMCwyOCwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNTAsNDgsOTUsOTUsMTE1LDEwNSw5NSw5OSwxMDgsOTcsMTE1LDExNSw5NSwxMTYsMTIxLDExMiwxMDEsOTUsMTA1LDExMCwxMDIsMTExLDY5LDAsMCwwLDAsMjI0LDg1LDAsMCwwLDg2LDAsMCwyNDAsODMsMCwwLDAsMCwwLDAsMCwwLDAsMCwxMzYsODYsMCwwLDE5OCwwLDAsMCwyMDUsMCwwLDAsMjAwLDAsMCwwLDIwMSwwLDAsMCw0MywwLDAsMCwzNywwLDAsMCwyNCwwLDAsMCwyOSwwLDAsMCw3OCw0OSw0OCw5NSw5NSw5OSwxMjAsMTIwLDk3LDk4LDEwNSwxMTgsNDksNTAsNDksOTUsOTUsMTE4LDEwOSwxMDUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsMTE2LDEyMSwxMTIsMTAxLDk1LDEwNSwxMTAsMTAyLDExMSw2OSwwLDAsMCwyMjQsODUsMCwwLDk2LDg2LDAsMCwyNDAsODMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyMDAsODgsMCwwLDIwNiwwLDAsMCwyMDcsMCwwLDAsOTAsMCwwLDAsMCwwLDAsMCwxMTUsMTE2LDEwMCw1OCw1OCw5OCw5NywxMDAsOTUsOTcsMTA4LDEwOCwxMTEsOTksMCwwLDgzLDExNiw1Nyw5OCw5NywxMDAsOTUsOTcsMTA4LDEwOCwxMTEsOTksMCwwLDAsMCwyMjQsODUsMCwwLDE4NCw4OCwwLDAsMCwwLDAsMCwwLDAsMCwwLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwwLDEsMiwzLDQsNSw2LDcsOCw5LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMCwwLDAsMCwwLDAsMCwwLDEsMiw0LDcsMyw2LDUsMCwwLDAsMCwwLDAsMCwwLDEwNSwxMTAsMTAyLDEwNSwxMTAsMTA1LDExNiwxMjEsMCwwLDAsMCwwLDAsMCwwLDExMCw5NywxMTAsMCwwLDAsMCwwLDk1LDExMiwxMzcsMCwyNTUsOSw0NywxNSwxMCwwLDAsMCwxMDAsMCwwLDAsMjMyLDMsMCwwLDE2LDM5LDAsMCwxNjAsMTM0LDEsMCw2NCw2NiwxNSwwLDEyOCwxNTAsMTUyLDAsMCwyMjUsMjQ1LDVdLCJpOCIsQUxMT0NfTk9ORSxSdW50aW1lLkdMT0JBTF9CQVNFKzE5NTY0KTt2YXIgdGVtcERvdWJsZVB0cj1SdW50aW1lLmFsaWduTWVtb3J5KGFsbG9jYXRlKDEyLCJpOCIsQUxMT0NfU1RBVElDKSw4KTthc3NlcnQodGVtcERvdWJsZVB0ciU4PT0wKTtmdW5jdGlvbiBjb3B5VGVtcEZsb2F0KHB0cil7SEVBUDhbdGVtcERvdWJsZVB0cl09SEVBUDhbcHRyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzFdPUhFQVA4W3B0cisxXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzJdPUhFQVA4W3B0cisyXTtIRUFQOFt0ZW1wRG91YmxlUHRyKzNdPUhFQVA4W3B0ciszXX1mdW5jdGlvbiBjb3B5VGVtcERvdWJsZShwdHIpe0hFQVA4W3RlbXBEb3VibGVQdHJdPUhFQVA4W3B0cl07SEVBUDhbdGVtcERvdWJsZVB0cisxXT1IRUFQOFtwdHIrMV07SEVBUDhbdGVtcERvdWJsZVB0cisyXT1IRUFQOFtwdHIrMl07SEVBUDhbdGVtcERvdWJsZVB0ciszXT1IRUFQOFtwdHIrM107SEVBUDhbdGVtcERvdWJsZVB0cis0XT1IRUFQOFtwdHIrNF07SEVBUDhbdGVtcERvdWJsZVB0cis1XT1IRUFQOFtwdHIrNV07SEVBUDhbdGVtcERvdWJsZVB0cis2XT1IRUFQOFtwdHIrNl07SEVBUDhbdGVtcERvdWJsZVB0cis3XT1IRUFQOFtwdHIrN119ZnVuY3Rpb24gX2F0ZXhpdChmdW5jLGFyZyl7X19BVEVYSVRfXy51bnNoaWZ0KHtmdW5jOmZ1bmMsYXJnOmFyZ30pfXZhciBfX19jeGFfYXRleGl0PV9hdGV4aXQ7TW9kdWxlWyJfaTY0U3VidHJhY3QiXT1faTY0U3VidHJhY3Q7TW9kdWxlWyJfaTY0QWRkIl09X2k2NEFkZDtmdW5jdGlvbiBfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udigpe3JldHVybiEhX19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYudW5jYXVnaHRfZXhjZXB0aW9ufWZ1bmN0aW9uIF9fX2N4YV9pc19udW1iZXJfdHlwZSh0eXBlKXt2YXIgaXNOdW1iZXI9ZmFsc2U7dHJ5e2lmKHR5cGU9PV9fWlRJaSlpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVElqKWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSWwpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJbSlpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVEl4KWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSXkpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJZilpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVElkKWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSWUpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJYylpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVElhKWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXRyeXtpZih0eXBlPT1fX1pUSWgpaXNOdW1iZXI9dHJ1ZX1jYXRjaChlKXt9dHJ5e2lmKHR5cGU9PV9fWlRJcylpc051bWJlcj10cnVlfWNhdGNoKGUpe310cnl7aWYodHlwZT09X19aVEl0KWlzTnVtYmVyPXRydWV9Y2F0Y2goZSl7fXJldHVybiBpc051bWJlcn1mdW5jdGlvbiBfX19jeGFfZG9lc19pbmhlcml0KGRlZmluaXRlVHlwZSxwb3NzaWJpbGl0eVR5cGUscG9zc2liaWxpdHkpe2lmKHBvc3NpYmlsaXR5PT0wKXJldHVybiBmYWxzZTtpZihwb3NzaWJpbGl0eVR5cGU9PTB8fHBvc3NpYmlsaXR5VHlwZT09ZGVmaW5pdGVUeXBlKXJldHVybiB0cnVlO3ZhciBwb3NzaWJpbGl0eV90eXBlX2luZm87aWYoX19fY3hhX2lzX251bWJlcl90eXBlKHBvc3NpYmlsaXR5VHlwZSkpe3Bvc3NpYmlsaXR5X3R5cGVfaW5mbz1wb3NzaWJpbGl0eVR5cGV9ZWxzZXt2YXIgcG9zc2liaWxpdHlfdHlwZV9pbmZvQWRkcj1IRUFQMzJbcG9zc2liaWxpdHlUeXBlPj4yXS04O3Bvc3NpYmlsaXR5X3R5cGVfaW5mbz1IRUFQMzJbcG9zc2liaWxpdHlfdHlwZV9pbmZvQWRkcj4+Ml19c3dpdGNoKHBvc3NpYmlsaXR5X3R5cGVfaW5mbyl7Y2FzZSAwOnZhciBkZWZpbml0ZV90eXBlX2luZm9BZGRyPUhFQVAzMltkZWZpbml0ZVR5cGU+PjJdLTg7dmFyIGRlZmluaXRlX3R5cGVfaW5mbz1IRUFQMzJbZGVmaW5pdGVfdHlwZV9pbmZvQWRkcj4+Ml07aWYoZGVmaW5pdGVfdHlwZV9pbmZvPT0wKXt2YXIgZGVmUG9pbnRlckJhc2VBZGRyPWRlZmluaXRlVHlwZSs4O3ZhciBkZWZQb2ludGVyQmFzZVR5cGU9SEVBUDMyW2RlZlBvaW50ZXJCYXNlQWRkcj4+Ml07dmFyIHBvc3NQb2ludGVyQmFzZUFkZHI9cG9zc2liaWxpdHlUeXBlKzg7dmFyIHBvc3NQb2ludGVyQmFzZVR5cGU9SEVBUDMyW3Bvc3NQb2ludGVyQmFzZUFkZHI+PjJdO3JldHVybiBfX19jeGFfZG9lc19pbmhlcml0KGRlZlBvaW50ZXJCYXNlVHlwZSxwb3NzUG9pbnRlckJhc2VUeXBlLHBvc3NpYmlsaXR5KX1lbHNlIHJldHVybiBmYWxzZTtjYXNlIDE6cmV0dXJuIGZhbHNlO2Nhc2UgMjp2YXIgcGFyZW50VHlwZUFkZHI9cG9zc2liaWxpdHlUeXBlKzg7dmFyIHBhcmVudFR5cGU9SEVBUDMyW3BhcmVudFR5cGVBZGRyPj4yXTtyZXR1cm4gX19fY3hhX2RvZXNfaW5oZXJpdChkZWZpbml0ZVR5cGUscGFyZW50VHlwZSxwb3NzaWJpbGl0eSk7ZGVmYXVsdDpyZXR1cm4gZmFsc2V9fXZhciBfX19jeGFfbGFzdF90aHJvd25fZXhjZXB0aW9uPTA7ZnVuY3Rpb24gX19fcmVzdW1lRXhjZXB0aW9uKHB0cil7TW9kdWxlLnByaW50KCJSZXN1bWluZyBleGNlcHRpb24iKTtpZighX19fY3hhX2xhc3RfdGhyb3duX2V4Y2VwdGlvbil7X19fY3hhX2xhc3RfdGhyb3duX2V4Y2VwdGlvbj1wdHJ9dGhyb3cgcHRyfXZhciBfX19jeGFfZXhjZXB0aW9uX2hlYWRlcl9zaXplPTg7ZnVuY3Rpb24gX19fY3hhX2ZpbmRfbWF0Y2hpbmdfY2F0Y2godGhyb3duLHRocm93bnR5cGUpe2lmKHRocm93bj09LTEpdGhyb3duPV9fX2N4YV9sYXN0X3Rocm93bl9leGNlcHRpb247aGVhZGVyPXRocm93bi1fX19jeGFfZXhjZXB0aW9uX2hlYWRlcl9zaXplO2lmKHRocm93bnR5cGU9PS0xKXRocm93bnR5cGU9SEVBUDMyW2hlYWRlcj4+Ml07dmFyIHR5cGVBcnJheT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7aWYodGhyb3dudHlwZSE9MCYmIV9fX2N4YV9pc19udW1iZXJfdHlwZSh0aHJvd250eXBlKSl7dmFyIHRocm93bnR5cGVJbmZvQWRkcj1IRUFQMzJbdGhyb3dudHlwZT4+Ml0tODt2YXIgdGhyb3dudHlwZUluZm89SEVBUDMyW3Rocm93bnR5cGVJbmZvQWRkcj4+Ml07aWYodGhyb3dudHlwZUluZm89PTApdGhyb3duPUhFQVAzMlt0aHJvd24+PjJdfWZvcih2YXIgaT0wO2k8dHlwZUFycmF5Lmxlbmd0aDtpKyspe2lmKF9fX2N4YV9kb2VzX2luaGVyaXQodHlwZUFycmF5W2ldLHRocm93bnR5cGUsdGhyb3duKSlyZXR1cm4oYXNtWyJzZXRUZW1wUmV0MCJdKHR5cGVBcnJheVtpXSksdGhyb3duKXwwfXJldHVybihhc21bInNldFRlbXBSZXQwIl0odGhyb3dudHlwZSksdGhyb3duKXwwfWZ1bmN0aW9uIF9fX2N4YV90aHJvdyhwdHIsdHlwZSxkZXN0cnVjdG9yKXtpZighX19fY3hhX3Rocm93LmluaXRpYWxpemVkKXt0cnl7SEVBUDMyW19fWlRWTjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0U+PjJdPTB9Y2F0Y2goZSl7fXRyeXtIRUFQMzJbX19aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0U+PjJdPTF9Y2F0Y2goZSl7fXRyeXtIRUFQMzJbX19aVFZOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0U+PjJdPTJ9Y2F0Y2goZSl7fV9fX2N4YV90aHJvdy5pbml0aWFsaXplZD10cnVlfU1vZHVsZS5wcmludEVycigiQ29tcGlsZWQgY29kZSB0aHJvd2luZyBhbiBleGNlcHRpb24sICIrW3B0cix0eXBlLGRlc3RydWN0b3JdKyIsIGF0ICIrc3RhY2tUcmFjZSgpKTt2YXIgaGVhZGVyPXB0ci1fX19jeGFfZXhjZXB0aW9uX2hlYWRlcl9zaXplO0hFQVAzMltoZWFkZXI+PjJdPXR5cGU7SEVBUDMyW2hlYWRlcis0Pj4yXT1kZXN0cnVjdG9yO19fX2N4YV9sYXN0X3Rocm93bl9leGNlcHRpb249cHRyO2lmKCEoInVuY2F1Z2h0X2V4Y2VwdGlvbiJpbiBfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udikpe19fWlN0MTh1bmNhdWdodF9leGNlcHRpb252LnVuY2F1Z2h0X2V4Y2VwdGlvbj0xfWVsc2V7X19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYudW5jYXVnaHRfZXhjZXB0aW9uKyt9dGhyb3cgcHRyfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Jvb2woKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfYm9vbCIpO2Fib3J0KC0xKX1mdW5jdGlvbiBfcHRocmVhZF9tdXRleF9sb2NrKCl7fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcoKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfc3RkX3N0cmluZyIpO2Fib3J0KC0xKX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZygpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZyIpO2Fib3J0KC0xKX12YXIgRVJSTk9fQ09ERVM9e0VQRVJNOjEsRU5PRU5UOjIsRVNSQ0g6MyxFSU5UUjo0LEVJTzo1LEVOWElPOjYsRTJCSUc6NyxFTk9FWEVDOjgsRUJBREY6OSxFQ0hJTEQ6MTAsRUFHQUlOOjExLEVXT1VMREJMT0NLOjExLEVOT01FTToxMixFQUNDRVM6MTMsRUZBVUxUOjE0LEVOT1RCTEs6MTUsRUJVU1k6MTYsRUVYSVNUOjE3LEVYREVWOjE4LEVOT0RFVjoxOSxFTk9URElSOjIwLEVJU0RJUjoyMSxFSU5WQUw6MjIsRU5GSUxFOjIzLEVNRklMRToyNCxFTk9UVFk6MjUsRVRYVEJTWToyNixFRkJJRzoyNyxFTk9TUEM6MjgsRVNQSVBFOjI5LEVST0ZTOjMwLEVNTElOSzozMSxFUElQRTozMixFRE9NOjMzLEVSQU5HRTozNCxFTk9NU0c6NDIsRUlEUk06NDMsRUNIUk5HOjQ0LEVMMk5TWU5DOjQ1LEVMM0hMVDo0NixFTDNSU1Q6NDcsRUxOUk5HOjQ4LEVVTkFUQ0g6NDksRU5PQ1NJOjUwLEVMMkhMVDo1MSxFREVBRExLOjM1LEVOT0xDSzozNyxFQkFERTo1MixFQkFEUjo1MyxFWEZVTEw6NTQsRU5PQU5POjU1LEVCQURSUUM6NTYsRUJBRFNMVDo1NyxFREVBRExPQ0s6MzUsRUJGT05UOjU5LEVOT1NUUjo2MCxFTk9EQVRBOjYxLEVUSU1FOjYyLEVOT1NSOjYzLEVOT05FVDo2NCxFTk9QS0c6NjUsRVJFTU9URTo2NixFTk9MSU5LOjY3LEVBRFY6NjgsRVNSTU5UOjY5LEVDT01NOjcwLEVQUk9UTzo3MSxFTVVMVElIT1A6NzIsRURPVERPVDo3MyxFQkFETVNHOjc0LEVOT1RVTklROjc2LEVCQURGRDo3NyxFUkVNQ0hHOjc4LEVMSUJBQ0M6NzksRUxJQkJBRDo4MCxFTElCU0NOOjgxLEVMSUJNQVg6ODIsRUxJQkVYRUM6ODMsRU5PU1lTOjM4LEVOT1RFTVBUWTozOSxFTkFNRVRPT0xPTkc6MzYsRUxPT1A6NDAsRU9QTk9UU1VQUDo5NSxFUEZOT1NVUFBPUlQ6OTYsRUNPTk5SRVNFVDoxMDQsRU5PQlVGUzoxMDUsRUFGTk9TVVBQT1JUOjk3LEVQUk9UT1RZUEU6OTEsRU5PVFNPQ0s6ODgsRU5PUFJPVE9PUFQ6OTIsRVNIVVRET1dOOjEwOCxFQ09OTlJFRlVTRUQ6MTExLEVBRERSSU5VU0U6OTgsRUNPTk5BQk9SVEVEOjEwMyxFTkVUVU5SRUFDSDoxMDEsRU5FVERPV046MTAwLEVUSU1FRE9VVDoxMTAsRUhPU1RET1dOOjExMixFSE9TVFVOUkVBQ0g6MTEzLEVJTlBST0dSRVNTOjExNSxFQUxSRUFEWToxMTQsRURFU1RBRERSUkVROjg5LEVNU0dTSVpFOjkwLEVQUk9UT05PU1VQUE9SVDo5MyxFU09DS1ROT1NVUFBPUlQ6OTQsRUFERFJOT1RBVkFJTDo5OSxFTkVUUkVTRVQ6MTAyLEVJU0NPTk46MTA2LEVOT1RDT05OOjEwNyxFVE9PTUFOWVJFRlM6MTA5LEVVU0VSUzo4NyxFRFFVT1Q6MTIyLEVTVEFMRToxMTYsRU5PVFNVUDo5NSxFTk9NRURJVU06MTIzLEVJTFNFUTo4NCxFT1ZFUkZMT1c6NzUsRUNBTkNFTEVEOjEyNSxFTk9UUkVDT1ZFUkFCTEU6MTMxLEVPV05FUkRFQUQ6MTMwLEVTVFJQSVBFOjg2fTt2YXIgRVJSTk9fTUVTU0FHRVM9ezA6IlN1Y2Nlc3MiLDE6Ik5vdCBzdXBlci11c2VyIiwyOiJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiwzOiJObyBzdWNoIHByb2Nlc3MiLDQ6IkludGVycnVwdGVkIHN5c3RlbSBjYWxsIiw1OiJJL08gZXJyb3IiLDY6Ik5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiLDc6IkFyZyBsaXN0IHRvbyBsb25nIiw4OiJFeGVjIGZvcm1hdCBlcnJvciIsOToiQmFkIGZpbGUgbnVtYmVyIiwxMDoiTm8gY2hpbGRyZW4iLDExOiJObyBtb3JlIHByb2Nlc3NlcyIsMTI6Ik5vdCBlbm91Z2ggY29yZSIsMTM6IlBlcm1pc3Npb24gZGVuaWVkIiwxNDoiQmFkIGFkZHJlc3MiLDE1OiJCbG9jayBkZXZpY2UgcmVxdWlyZWQiLDE2OiJNb3VudCBkZXZpY2UgYnVzeSIsMTc6IkZpbGUgZXhpc3RzIiwxODoiQ3Jvc3MtZGV2aWNlIGxpbmsiLDE5OiJObyBzdWNoIGRldmljZSIsMjA6Ik5vdCBhIGRpcmVjdG9yeSIsMjE6IklzIGEgZGlyZWN0b3J5IiwyMjoiSW52YWxpZCBhcmd1bWVudCIsMjM6IlRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtIiwyNDoiVG9vIG1hbnkgb3BlbiBmaWxlcyIsMjU6Ik5vdCBhIHR5cGV3cml0ZXIiLDI2OiJUZXh0IGZpbGUgYnVzeSIsMjc6IkZpbGUgdG9vIGxhcmdlIiwyODoiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiLDI5OiJJbGxlZ2FsIHNlZWsiLDMwOiJSZWFkIG9ubHkgZmlsZSBzeXN0ZW0iLDMxOiJUb28gbWFueSBsaW5rcyIsMzI6IkJyb2tlbiBwaXBlIiwzMzoiTWF0aCBhcmcgb3V0IG9mIGRvbWFpbiBvZiBmdW5jIiwzNDoiTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUiLDM1OiJGaWxlIGxvY2tpbmcgZGVhZGxvY2sgZXJyb3IiLDM2OiJGaWxlIG9yIHBhdGggbmFtZSB0b28gbG9uZyIsMzc6Ik5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUiLDM4OiJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiLDM5OiJEaXJlY3Rvcnkgbm90IGVtcHR5Iiw0MDoiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MiLDQyOiJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSIsNDM6IklkZW50aWZpZXIgcmVtb3ZlZCIsNDQ6IkNoYW5uZWwgbnVtYmVyIG91dCBvZiByYW5nZSIsNDU6IkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIsNDY6IkxldmVsIDMgaGFsdGVkIiw0NzoiTGV2ZWwgMyByZXNldCIsNDg6IkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZSIsNDk6IlByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQiLDUwOiJObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSIsNTE6IkxldmVsIDIgaGFsdGVkIiw1MjoiSW52YWxpZCBleGNoYW5nZSIsNTM6IkludmFsaWQgcmVxdWVzdCBkZXNjcmlwdG9yIiw1NDoiRXhjaGFuZ2UgZnVsbCIsNTU6Ik5vIGFub2RlIiw1NjoiSW52YWxpZCByZXF1ZXN0IGNvZGUiLDU3OiJJbnZhbGlkIHNsb3QiLDU5OiJCYWQgZm9udCBmaWxlIGZtdCIsNjA6IkRldmljZSBub3QgYSBzdHJlYW0iLDYxOiJObyBkYXRhIChmb3Igbm8gZGVsYXkgaW8pIiw2MjoiVGltZXIgZXhwaXJlZCIsNjM6Ik91dCBvZiBzdHJlYW1zIHJlc291cmNlcyIsNjQ6Ik1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIiw2NToiUGFja2FnZSBub3QgaW5zdGFsbGVkIiw2NjoiVGhlIG9iamVjdCBpcyByZW1vdGUiLDY3OiJUaGUgbGluayBoYXMgYmVlbiBzZXZlcmVkIiw2ODoiQWR2ZXJ0aXNlIGVycm9yIiw2OToiU3Jtb3VudCBlcnJvciIsNzA6IkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIsNzE6IlByb3RvY29sIGVycm9yIiw3MjoiTXVsdGlob3AgYXR0ZW1wdGVkIiw3MzoiQ3Jvc3MgbW91bnQgcG9pbnQgKG5vdCByZWFsbHkgZXJyb3IpIiw3NDoiVHJ5aW5nIHRvIHJlYWQgdW5yZWFkYWJsZSBtZXNzYWdlIiw3NToiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIsNzY6IkdpdmVuIGxvZy4gbmFtZSBub3QgdW5pcXVlIiw3NzoiZi5kLiBpbnZhbGlkIGZvciB0aGlzIG9wZXJhdGlvbiIsNzg6IlJlbW90ZSBhZGRyZXNzIGNoYW5nZWQiLDc5OiJDYW4gICBhY2Nlc3MgYSBuZWVkZWQgc2hhcmVkIGxpYiIsODA6IkFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGliIiw4MToiLmxpYiBzZWN0aW9uIGluIGEub3V0IGNvcnJ1cHRlZCIsODI6IkF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBsaWJzIiw4MzoiQXR0ZW1wdGluZyB0byBleGVjIGEgc2hhcmVkIGxpYnJhcnkiLDg0OiJJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UiLDg2OiJTdHJlYW1zIHBpcGUgZXJyb3IiLDg3OiJUb28gbWFueSB1c2VycyIsODg6IlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIsODk6IkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiLDkwOiJNZXNzYWdlIHRvbyBsb25nIiw5MToiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Iiw5MjoiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIsOTM6IlVua25vd24gcHJvdG9jb2wiLDk0OiJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIiw5NToiTm90IHN1cHBvcnRlZCIsOTY6IlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIiw5NzoiQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCBmYW1pbHkiLDk4OiJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIiw5OToiQWRkcmVzcyBub3QgYXZhaWxhYmxlIiwxMDA6Ik5ldHdvcmsgaW50ZXJmYWNlIGlzIG5vdCBjb25maWd1cmVkIiwxMDE6Ik5ldHdvcmsgaXMgdW5yZWFjaGFibGUiLDEwMjoiQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrIiwxMDM6IkNvbm5lY3Rpb24gYWJvcnRlZCIsMTA0OiJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiLDEwNToiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIsMTA2OiJTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiLDEwNzoiU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiLDEwODoiQ2FuJ3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24iLDEwOToiVG9vIG1hbnkgcmVmZXJlbmNlcyIsMTEwOiJDb25uZWN0aW9uIHRpbWVkIG91dCIsMTExOiJDb25uZWN0aW9uIHJlZnVzZWQiLDExMjoiSG9zdCBpcyBkb3duIiwxMTM6Ikhvc3QgaXMgdW5yZWFjaGFibGUiLDExNDoiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIiwxMTU6IkNvbm5lY3Rpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIsMTE2OiJTdGFsZSBmaWxlIGhhbmRsZSIsMTIyOiJRdW90YSBleGNlZWRlZCIsMTIzOiJObyBtZWRpdW0gKGluIHRhcGUgZHJpdmUpIiwxMjU6Ik9wZXJhdGlvbiBjYW5jZWxlZCIsMTMwOiJQcmV2aW91cyBvd25lciBkaWVkIiwxMzE6IlN0YXRlIG5vdCByZWNvdmVyYWJsZSJ9O3ZhciBfX19lcnJub19zdGF0ZT0wO2Z1bmN0aW9uIF9fX3NldEVyck5vKHZhbHVlKXtIRUFQMzJbX19fZXJybm9fc3RhdGU+PjJdPXZhbHVlO3JldHVybiB2YWx1ZX12YXIgUEFUSD17c3BsaXRQYXRoOihmdW5jdGlvbihmaWxlbmFtZSl7dmFyIHNwbGl0UGF0aFJlPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSl9KSxub3JtYWxpemVBcnJheTooZnVuY3Rpb24ocGFydHMsYWxsb3dBYm92ZVJvb3Qpe3ZhciB1cD0wO2Zvcih2YXIgaT1wYXJ0cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGxhc3Q9cGFydHNbaV07aWYobGFzdD09PSIuIil7cGFydHMuc3BsaWNlKGksMSl9ZWxzZSBpZihsYXN0PT09Ii4uIil7cGFydHMuc3BsaWNlKGksMSk7dXArK31lbHNlIGlmKHVwKXtwYXJ0cy5zcGxpY2UoaSwxKTt1cC0tfX1pZihhbGxvd0Fib3ZlUm9vdCl7Zm9yKDt1cC0tO3VwKXtwYXJ0cy51bnNoaWZ0KCIuLiIpfX1yZXR1cm4gcGFydHN9KSxub3JtYWxpemU6KGZ1bmN0aW9uKHBhdGgpe3ZhciBpc0Fic29sdXRlPXBhdGguY2hhckF0KDApPT09Ii8iLHRyYWlsaW5nU2xhc2g9cGF0aC5zdWJzdHIoLTEpPT09Ii8iO3BhdGg9UEFUSC5ub3JtYWxpemVBcnJheShwYXRoLnNwbGl0KCIvIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIWlzQWJzb2x1dGUpLmpvaW4oIi8iKTtpZighcGF0aCYmIWlzQWJzb2x1dGUpe3BhdGg9Ii4ifWlmKHBhdGgmJnRyYWlsaW5nU2xhc2gpe3BhdGgrPSIvIn1yZXR1cm4oaXNBYnNvbHV0ZT8iLyI6IiIpK3BhdGh9KSxkaXJuYW1lOihmdW5jdGlvbihwYXRoKXt2YXIgcmVzdWx0PVBBVEguc3BsaXRQYXRoKHBhdGgpLHJvb3Q9cmVzdWx0WzBdLGRpcj1yZXN1bHRbMV07aWYoIXJvb3QmJiFkaXIpe3JldHVybiIuIn1pZihkaXIpe2Rpcj1kaXIuc3Vic3RyKDAsZGlyLmxlbmd0aC0xKX1yZXR1cm4gcm9vdCtkaXJ9KSxiYXNlbmFtZTooZnVuY3Rpb24ocGF0aCl7aWYocGF0aD09PSIvIilyZXR1cm4iLyI7dmFyIGxhc3RTbGFzaD1wYXRoLmxhc3RJbmRleE9mKCIvIik7aWYobGFzdFNsYXNoPT09LTEpcmV0dXJuIHBhdGg7cmV0dXJuIHBhdGguc3Vic3RyKGxhc3RTbGFzaCsxKX0pLGV4dG5hbWU6KGZ1bmN0aW9uKHBhdGgpe3JldHVybiBQQVRILnNwbGl0UGF0aChwYXRoKVszXX0pLGpvaW46KGZ1bmN0aW9uKCl7dmFyIHBhdGhzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aHMuam9pbigiLyIpKX0pLGpvaW4yOihmdW5jdGlvbihsLHIpe3JldHVybiBQQVRILm5vcm1hbGl6ZShsKyIvIityKX0pLHJlc29sdmU6KGZ1bmN0aW9uKCl7dmFyIHJlc29sdmVkUGF0aD0iIixyZXNvbHZlZEFic29sdXRlPWZhbHNlO2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLTE7aT49LTEmJiFyZXNvbHZlZEFic29sdXRlO2ktLSl7dmFyIHBhdGg9aT49MD9hcmd1bWVudHNbaV06RlMuY3dkKCk7aWYodHlwZW9mIHBhdGghPT0ic3RyaW5nIil7dGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKX1lbHNlIGlmKCFwYXRoKXtjb250aW51ZX1yZXNvbHZlZFBhdGg9cGF0aCsiLyIrcmVzb2x2ZWRQYXRoO3Jlc29sdmVkQWJzb2x1dGU9cGF0aC5jaGFyQXQoMCk9PT0iLyJ9cmVzb2x2ZWRQYXRoPVBBVEgubm9ybWFsaXplQXJyYXkocmVzb2x2ZWRQYXRoLnNwbGl0KCIvIikuZmlsdGVyKChmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSksIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oIi8iKTtyZXR1cm4ocmVzb2x2ZWRBYnNvbHV0ZT8iLyI6IiIpK3Jlc29sdmVkUGF0aHx8Ii4ifSkscmVsYXRpdmU6KGZ1bmN0aW9uKGZyb20sdG8pe2Zyb209UEFUSC5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTt0bz1QQVRILnJlc29sdmUodG8pLnN1YnN0cigxKTtmdW5jdGlvbiB0cmltKGFycil7dmFyIHN0YXJ0PTA7Zm9yKDtzdGFydDxhcnIubGVuZ3RoO3N0YXJ0Kyspe2lmKGFycltzdGFydF0hPT0iIilicmVha312YXIgZW5kPWFyci5sZW5ndGgtMTtmb3IoO2VuZD49MDtlbmQtLSl7aWYoYXJyW2VuZF0hPT0iIilicmVha31pZihzdGFydD5lbmQpcmV0dXJuW107cmV0dXJuIGFyci5zbGljZShzdGFydCxlbmQtc3RhcnQrMSl9dmFyIGZyb21QYXJ0cz10cmltKGZyb20uc3BsaXQoIi8iKSk7dmFyIHRvUGFydHM9dHJpbSh0by5zcGxpdCgiLyIpKTt2YXIgbGVuZ3RoPU1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsdG9QYXJ0cy5sZW5ndGgpO3ZhciBzYW1lUGFydHNMZW5ndGg9bGVuZ3RoO2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7aWYoZnJvbVBhcnRzW2ldIT09dG9QYXJ0c1tpXSl7c2FtZVBhcnRzTGVuZ3RoPWk7YnJlYWt9fXZhciBvdXRwdXRQYXJ0cz1bXTtmb3IodmFyIGk9c2FtZVBhcnRzTGVuZ3RoO2k8ZnJvbVBhcnRzLmxlbmd0aDtpKyspe291dHB1dFBhcnRzLnB1c2goIi4uIil9b3V0cHV0UGFydHM9b3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7cmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oIi8iKX0pfTt2YXIgVFRZPXt0dHlzOltdLGluaXQ6KGZ1bmN0aW9uKCl7fSksc2h1dGRvd246KGZ1bmN0aW9uKCl7fSkscmVnaXN0ZXI6KGZ1bmN0aW9uKGRldixvcHMpe1RUWS50dHlzW2Rldl09e2lucHV0OltdLG91dHB1dDpbXSxvcHM6b3BzfTtGUy5yZWdpc3RlckRldmljZShkZXYsVFRZLnN0cmVhbV9vcHMpfSksc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgdHR5PVRUWS50dHlzW3N0cmVhbS5ub2RlLnJkZXZdO2lmKCF0dHkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9c3RyZWFtLnR0eT10dHk7c3RyZWFtLnNlZWthYmxlPWZhbHNlfSksY2xvc2U6KGZ1bmN0aW9uKHN0cmVhbSl7aWYoc3RyZWFtLnR0eS5vdXRwdXQubGVuZ3RoKXtzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcihzdHJlYW0udHR5LDEwKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXtpZighc3RyZWFtLnR0eXx8IXN0cmVhbS50dHkub3BzLmdldF9jaGFyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTlhJTyl9dmFyIGJ5dGVzUmVhZD0wO2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dmFyIHJlc3VsdDt0cnl7cmVzdWx0PXN0cmVhbS50dHkub3BzLmdldF9jaGFyKHN0cmVhbS50dHkpfWNhdGNoKGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUdBSU4pfWlmKHJlc3VsdD09PW51bGx8fHJlc3VsdD09PXVuZGVmaW5lZClicmVhaztieXRlc1JlYWQrKztidWZmZXJbb2Zmc2V0K2ldPXJlc3VsdH1pZihieXRlc1JlYWQpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBieXRlc1JlYWR9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7aWYoIXN0cmVhbS50dHl8fCFzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5YSU8pfWZvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dHJ5e3N0cmVhbS50dHkub3BzLnB1dF9jaGFyKHN0cmVhbS50dHksYnVmZmVyW29mZnNldCtpXSl9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlPKX19aWYobGVuZ3RoKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gaX0pfSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyOihmdW5jdGlvbih0dHkpe2lmKCF0dHkuaW5wdXQubGVuZ3RoKXt2YXIgcmVzdWx0PW51bGw7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7cmVzdWx0PXByb2Nlc3NbInN0ZGluIl1bInJlYWQiXSgpO2lmKCFyZXN1bHQpe2lmKHByb2Nlc3NbInN0ZGluIl1bIl9yZWFkYWJsZVN0YXRlIl0mJnByb2Nlc3NbInN0ZGluIl1bIl9yZWFkYWJsZVN0YXRlIl1bImVuZGVkIl0pe3JldHVybiBudWxsfXJldHVybiB1bmRlZmluZWR9fWVsc2UgaWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiB3aW5kb3cucHJvbXB0PT0iZnVuY3Rpb24iKXtyZXN1bHQ9d2luZG93LnByb21wdCgiSW5wdXQ6ICIpO2lmKHJlc3VsdCE9PW51bGwpe3Jlc3VsdCs9IlxuIn19ZWxzZSBpZih0eXBlb2YgcmVhZGxpbmU9PSJmdW5jdGlvbiIpe3Jlc3VsdD1yZWFkbGluZSgpO2lmKHJlc3VsdCE9PW51bGwpe3Jlc3VsdCs9IlxuIn19aWYoIXJlc3VsdCl7cmV0dXJuIG51bGx9dHR5LmlucHV0PWludEFycmF5RnJvbVN0cmluZyhyZXN1bHQsdHJ1ZSl9cmV0dXJuIHR0eS5pbnB1dC5zaGlmdCgpfSkscHV0X2NoYXI6KGZ1bmN0aW9uKHR0eSx2YWwpe2lmKHZhbD09PW51bGx8fHZhbD09PTEwKXtNb2R1bGVbInByaW50Il0odHR5Lm91dHB1dC5qb2luKCIiKSk7dHR5Lm91dHB1dD1bXX1lbHNle3R0eS5vdXRwdXQucHVzaChUVFkudXRmOC5wcm9jZXNzQ0NoYXIodmFsKSl9fSl9LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyOihmdW5jdGlvbih0dHksdmFsKXtpZih2YWw9PT1udWxsfHx2YWw9PT0xMCl7TW9kdWxlWyJwcmludEVyciJdKHR0eS5vdXRwdXQuam9pbigiIikpO3R0eS5vdXRwdXQ9W119ZWxzZXt0dHkub3V0cHV0LnB1c2goVFRZLnV0ZjgucHJvY2Vzc0NDaGFyKHZhbCkpfX0pfX07dmFyIE1FTUZTPXtvcHNfdGFibGU6bnVsbCxDT05URU5UX09XTklORzoxLENPTlRFTlRfRkxFWElCTEU6MixDT05URU5UX0ZJWEVEOjMsbW91bnQ6KGZ1bmN0aW9uKG1vdW50KXtyZXR1cm4gTUVNRlMuY3JlYXRlTm9kZShudWxsLCIvIiwxNjM4NHw1MTEsMCl9KSxjcmVhdGVOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLGRldil7aWYoRlMuaXNCbGtkZXYobW9kZSl8fEZTLmlzRklGTyhtb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKCFNRU1GUy5vcHNfdGFibGUpe01FTUZTLm9wc190YWJsZT17ZGlyOntub2RlOntnZXRhdHRyOk1FTUZTLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpNRU1GUy5ub2RlX29wcy5zZXRhdHRyLGxvb2t1cDpNRU1GUy5ub2RlX29wcy5sb29rdXAsbWtub2Q6TUVNRlMubm9kZV9vcHMubWtub2QscmVuYW1lOk1FTUZTLm5vZGVfb3BzLnJlbmFtZSx1bmxpbms6TUVNRlMubm9kZV9vcHMudW5saW5rLHJtZGlyOk1FTUZTLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6TUVNRlMubm9kZV9vcHMucmVhZGRpcixzeW1saW5rOk1FTUZTLm5vZGVfb3BzLnN5bWxpbmt9LHN0cmVhbTp7bGxzZWVrOk1FTUZTLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cn0sc3RyZWFtOntsbHNlZWs6TUVNRlMuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpNRU1GUy5zdHJlYW1fb3BzLnJlYWQsd3JpdGU6TUVNRlMuc3RyZWFtX29wcy53cml0ZSxhbGxvY2F0ZTpNRU1GUy5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6TUVNRlMuc3RyZWFtX29wcy5tbWFwfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cixyZWFkbGluazpNRU1GUy5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6TUVNRlMubm9kZV9vcHMuZ2V0YXR0cixzZXRhdHRyOk1FTUZTLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTpGUy5jaHJkZXZfc3RyZWFtX29wc319fXZhciBub2RlPUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSxkZXYpO2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmRpci5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUuZGlyLnN0cmVhbTtub2RlLmNvbnRlbnRzPXt9fWVsc2UgaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmZpbGUubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmZpbGUuc3RyZWFtO25vZGUuY29udGVudHM9W107bm9kZS5jb250ZW50TW9kZT1NRU1GUy5DT05URU5UX0ZMRVhJQkxFfWVsc2UgaWYoRlMuaXNMaW5rKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmxpbmsubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmxpbmsuc3RyZWFtfWVsc2UgaWYoRlMuaXNDaHJkZXYobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuY2hyZGV2Lm5vZGU7bm9kZS5zdHJlYW1fb3BzPU1FTUZTLm9wc190YWJsZS5jaHJkZXYuc3RyZWFtfW5vZGUudGltZXN0YW1wPURhdGUubm93KCk7aWYocGFyZW50KXtwYXJlbnQuY29udGVudHNbbmFtZV09bm9kZX1yZXR1cm4gbm9kZX0pLGVuc3VyZUZsZXhpYmxlOihmdW5jdGlvbihub2RlKXtpZihub2RlLmNvbnRlbnRNb2RlIT09TUVNRlMuQ09OVEVOVF9GTEVYSUJMRSl7dmFyIGNvbnRlbnRzPW5vZGUuY29udGVudHM7bm9kZS5jb250ZW50cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb250ZW50cyk7bm9kZS5jb250ZW50TW9kZT1NRU1GUy5DT05URU5UX0ZMRVhJQkxFfX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXt2YXIgYXR0cj17fTthdHRyLmRldj1GUy5pc0NocmRldihub2RlLm1vZGUpP25vZGUuaWQ6MTthdHRyLmlubz1ub2RlLmlkO2F0dHIubW9kZT1ub2RlLm1vZGU7YXR0ci5ubGluaz0xO2F0dHIudWlkPTA7YXR0ci5naWQ9MDthdHRyLnJkZXY9bm9kZS5yZGV2O2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT00MDk2fWVsc2UgaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT1ub2RlLmNvbnRlbnRzLmxlbmd0aH1lbHNlIGlmKEZTLmlzTGluayhub2RlLm1vZGUpKXthdHRyLnNpemU9bm9kZS5saW5rLmxlbmd0aH1lbHNle2F0dHIuc2l6ZT0wfWF0dHIuYXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIubXRpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuY3RpbWU9bmV3IERhdGUobm9kZS50aW1lc3RhbXApO2F0dHIuYmxrc2l6ZT00MDk2O2F0dHIuYmxvY2tzPU1hdGguY2VpbChhdHRyLnNpemUvYXR0ci5ibGtzaXplKTtyZXR1cm4gYXR0cn0pLHNldGF0dHI6KGZ1bmN0aW9uKG5vZGUsYXR0cil7aWYoYXR0ci5tb2RlIT09dW5kZWZpbmVkKXtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXtub2RlLnRpbWVzdGFtcD1hdHRyLnRpbWVzdGFtcH1pZihhdHRyLnNpemUhPT11bmRlZmluZWQpe01FTUZTLmVuc3VyZUZsZXhpYmxlKG5vZGUpO3ZhciBjb250ZW50cz1ub2RlLmNvbnRlbnRzO2lmKGF0dHIuc2l6ZTxjb250ZW50cy5sZW5ndGgpY29udGVudHMubGVuZ3RoPWF0dHIuc2l6ZTtlbHNlIHdoaWxlKGF0dHIuc2l6ZT5jb250ZW50cy5sZW5ndGgpY29udGVudHMucHVzaCgwKX19KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt0aHJvdyBGUy5nZW5lcmljRXJyb3JzW0VSUk5PX0NPREVTLkVOT0VOVF19KSxta25vZDooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe3JldHVybiBNRU1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkX25vZGUsbmV3X2RpcixuZXdfbmFtZSl7aWYoRlMuaXNEaXIob2xkX25vZGUubW9kZSkpe3ZhciBuZXdfbm9kZTt0cnl7bmV3X25vZGU9RlMubG9va3VwTm9kZShuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt9aWYobmV3X25vZGUpe2Zvcih2YXIgaSBpbiBuZXdfbm9kZS5jb250ZW50cyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKX19fWRlbGV0ZSBvbGRfbm9kZS5wYXJlbnQuY29udGVudHNbb2xkX25vZGUubmFtZV07b2xkX25vZGUubmFtZT1uZXdfbmFtZTtuZXdfZGlyLmNvbnRlbnRzW25ld19uYW1lXT1vbGRfbm9kZTtvbGRfbm9kZS5wYXJlbnQ9bmV3X2Rpcn0pLHVubGluazooZnVuY3Rpb24ocGFyZW50LG5hbWUpe2RlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxybWRpcjooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO2Zvcih2YXIgaSBpbiBub2RlLmNvbnRlbnRzKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URU1QVFkpfWRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV19KSxyZWFkZGlyOihmdW5jdGlvbihub2RlKXt2YXIgZW50cmllcz1bIi4iLCIuLiJdO2Zvcih2YXIga2V5IGluIG5vZGUuY29udGVudHMpe2lmKCFub2RlLmNvbnRlbnRzLmhhc093blByb3BlcnR5KGtleSkpe2NvbnRpbnVlfWVudHJpZXMucHVzaChrZXkpfXJldHVybiBlbnRyaWVzfSksc3ltbGluazooZnVuY3Rpb24ocGFyZW50LG5ld25hbWUsb2xkcGF0aCl7dmFyIG5vZGU9TUVNRlMuY3JlYXRlTm9kZShwYXJlbnQsbmV3bmFtZSw1MTF8NDA5NjAsMCk7bm9kZS5saW5rPW9sZHBhdGg7cmV0dXJuIG5vZGV9KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7aWYoIUZTLmlzTGluayhub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXJldHVybiBub2RlLmxpbmt9KX0sc3RyZWFtX29wczp7cmVhZDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXt2YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYocG9zaXRpb24+PWNvbnRlbnRzLmxlbmd0aClyZXR1cm4gMDt2YXIgc2l6ZT1NYXRoLm1pbihjb250ZW50cy5sZW5ndGgtcG9zaXRpb24sbGVuZ3RoKTthc3NlcnQoc2l6ZT49MCk7aWYoc2l6ZT44JiZjb250ZW50cy5zdWJhcnJheSl7YnVmZmVyLnNldChjb250ZW50cy5zdWJhcnJheShwb3NpdGlvbixwb3NpdGlvbitzaXplKSxvZmZzZXQpfWVsc2V7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX19cmV0dXJuIHNpemV9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLGNhbk93bil7dmFyIG5vZGU9c3RyZWFtLm5vZGU7bm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKTt2YXIgY29udGVudHM9bm9kZS5jb250ZW50cztpZihsZW5ndGgmJmNvbnRlbnRzLmxlbmd0aD09PTAmJnBvc2l0aW9uPT09MCYmYnVmZmVyLnN1YmFycmF5KXtpZihjYW5Pd24mJm9mZnNldD09PTApe25vZGUuY29udGVudHM9YnVmZmVyO25vZGUuY29udGVudE1vZGU9YnVmZmVyLmJ1ZmZlcj09PUhFQVA4LmJ1ZmZlcj9NRU1GUy5DT05URU5UX09XTklORzpNRU1GUy5DT05URU5UX0ZJWEVEfWVsc2V7bm9kZS5jb250ZW50cz1uZXcgVWludDhBcnJheShidWZmZXIuc3ViYXJyYXkob2Zmc2V0LG9mZnNldCtsZW5ndGgpKTtub2RlLmNvbnRlbnRNb2RlPU1FTUZTLkNPTlRFTlRfRklYRUR9cmV0dXJuIGxlbmd0aH1NRU1GUy5lbnN1cmVGbGV4aWJsZShub2RlKTt2YXIgY29udGVudHM9bm9kZS5jb250ZW50czt3aGlsZShjb250ZW50cy5sZW5ndGg8cG9zaXRpb24pY29udGVudHMucHVzaCgwKTtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe2NvbnRlbnRzW3Bvc2l0aW9uK2ldPWJ1ZmZlcltvZmZzZXQraV19cmV0dXJuIGxlbmd0aH0pLGxsc2VlazooZnVuY3Rpb24oc3RyZWFtLG9mZnNldCx3aGVuY2Upe3ZhciBwb3NpdGlvbj1vZmZzZXQ7aWYod2hlbmNlPT09MSl7cG9zaXRpb24rPXN0cmVhbS5wb3NpdGlvbn1lbHNlIGlmKHdoZW5jZT09PTIpe2lmKEZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSl7cG9zaXRpb24rPXN0cmVhbS5ub2RlLmNvbnRlbnRzLmxlbmd0aH19aWYocG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1zdHJlYW0udW5nb3R0ZW49W107c3RyZWFtLnBvc2l0aW9uPXBvc2l0aW9uO3JldHVybiBwb3NpdGlvbn0pLGFsbG9jYXRlOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LGxlbmd0aCl7TUVNRlMuZW5zdXJlRmxleGlibGUoc3RyZWFtLm5vZGUpO3ZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50czt2YXIgbGltaXQ9b2Zmc2V0K2xlbmd0aDt3aGlsZShsaW1pdD5jb250ZW50cy5sZW5ndGgpY29udGVudHMucHVzaCgwKX0pLG1tYXA6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixwcm90LGZsYWdzKXtpZighRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9ERVYpfXZhciBwdHI7dmFyIGFsbG9jYXRlZDt2YXIgY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYoIShmbGFncyYyKSYmKGNvbnRlbnRzLmJ1ZmZlcj09PWJ1ZmZlcnx8Y29udGVudHMuYnVmZmVyPT09YnVmZmVyLmJ1ZmZlcikpe2FsbG9jYXRlZD1mYWxzZTtwdHI9Y29udGVudHMuYnl0ZU9mZnNldH1lbHNle2lmKHBvc2l0aW9uPjB8fHBvc2l0aW9uK2xlbmd0aDxjb250ZW50cy5sZW5ndGgpe2lmKGNvbnRlbnRzLnN1YmFycmF5KXtjb250ZW50cz1jb250ZW50cy5zdWJhcnJheShwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpfWVsc2V7Y29udGVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY29udGVudHMscG9zaXRpb24scG9zaXRpb24rbGVuZ3RoKX19YWxsb2NhdGVkPXRydWU7cHRyPV9tYWxsb2MobGVuZ3RoKTtpZighcHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9NRU0pfWJ1ZmZlci5zZXQoY29udGVudHMscHRyKX1yZXR1cm57cHRyOnB0cixhbGxvY2F0ZWQ6YWxsb2NhdGVkfX0pfX07dmFyIElEQkZTPXtkYnM6e30saW5kZXhlZERCOihmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW5kZXhlZERCfHx3aW5kb3cubW96SW5kZXhlZERCfHx3aW5kb3cud2Via2l0SW5kZXhlZERCfHx3aW5kb3cubXNJbmRleGVkREJ9KSxEQl9WRVJTSU9OOjIxLERCX1NUT1JFX05BTUU6IkZJTEVfREFUQSIsbW91bnQ6KGZ1bmN0aW9uKG1vdW50KXtyZXR1cm4gTUVNRlMubW91bnQuYXBwbHkobnVsbCxhcmd1bWVudHMpfSksc3luY2ZzOihmdW5jdGlvbihtb3VudCxwb3B1bGF0ZSxjYWxsYmFjayl7SURCRlMuZ2V0TG9jYWxTZXQobW91bnQsKGZ1bmN0aW9uKGVycixsb2NhbCl7aWYoZXJyKXJldHVybiBjYWxsYmFjayhlcnIpO0lEQkZTLmdldFJlbW90ZVNldChtb3VudCwoZnVuY3Rpb24oZXJyLHJlbW90ZSl7aWYoZXJyKXJldHVybiBjYWxsYmFjayhlcnIpO3ZhciBzcmM9cG9wdWxhdGU/cmVtb3RlOmxvY2FsO3ZhciBkc3Q9cG9wdWxhdGU/bG9jYWw6cmVtb3RlO0lEQkZTLnJlY29uY2lsZShzcmMsZHN0LGNhbGxiYWNrKX0pKX0pKX0pLGdldERCOihmdW5jdGlvbihuYW1lLGNhbGxiYWNrKXt2YXIgZGI9SURCRlMuZGJzW25hbWVdO2lmKGRiKXtyZXR1cm4gY2FsbGJhY2sobnVsbCxkYil9dmFyIHJlcTt0cnl7cmVxPUlEQkZTLmluZGV4ZWREQigpLm9wZW4obmFtZSxJREJGUy5EQl9WRVJTSU9OKX1jYXRjaChlKXtyZXR1cm4gY2FsbGJhY2soZSl9cmVxLm9udXBncmFkZW5lZWRlZD0oZnVuY3Rpb24oZSl7dmFyIGRiPWUudGFyZ2V0LnJlc3VsdDt2YXIgdHJhbnNhY3Rpb249ZS50YXJnZXQudHJhbnNhY3Rpb247dmFyIGZpbGVTdG9yZTtpZihkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKElEQkZTLkRCX1NUT1JFX05BTUUpKXtmaWxlU3RvcmU9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSl9ZWxzZXtmaWxlU3RvcmU9ZGIuY3JlYXRlT2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSl9ZmlsZVN0b3JlLmNyZWF0ZUluZGV4KCJ0aW1lc3RhbXAiLCJ0aW1lc3RhbXAiLHt1bmlxdWU6ZmFsc2V9KX0pO3JlcS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKCl7ZGI9cmVxLnJlc3VsdDtJREJGUy5kYnNbbmFtZV09ZGI7Y2FsbGJhY2sobnVsbCxkYil9KTtyZXEub25lcnJvcj0oZnVuY3Rpb24oKXtjYWxsYmFjayh0aGlzLmVycm9yKX0pfSksZ2V0TG9jYWxTZXQ6KGZ1bmN0aW9uKG1vdW50LGNhbGxiYWNrKXt2YXIgZW50cmllcz17fTtmdW5jdGlvbiBpc1JlYWxEaXIocCl7cmV0dXJuIHAhPT0iLiImJnAhPT0iLi4ifWZ1bmN0aW9uIHRvQWJzb2x1dGUocm9vdCl7cmV0dXJuKGZ1bmN0aW9uKHApe3JldHVybiBQQVRILmpvaW4yKHJvb3QscCl9KX12YXIgY2hlY2s9RlMucmVhZGRpcihtb3VudC5tb3VudHBvaW50KS5maWx0ZXIoaXNSZWFsRGlyKS5tYXAodG9BYnNvbHV0ZShtb3VudC5tb3VudHBvaW50KSk7d2hpbGUoY2hlY2subGVuZ3RoKXt2YXIgcGF0aD1jaGVjay5wb3AoKTt2YXIgc3RhdDt0cnl7c3RhdD1GUy5zdGF0KHBhdGgpfWNhdGNoKGUpe3JldHVybiBjYWxsYmFjayhlKX1pZihGUy5pc0RpcihzdGF0Lm1vZGUpKXtjaGVjay5wdXNoLmFwcGx5KGNoZWNrLEZTLnJlYWRkaXIocGF0aCkuZmlsdGVyKGlzUmVhbERpcikubWFwKHRvQWJzb2x1dGUocGF0aCkpKX1lbnRyaWVzW3BhdGhdPXt0aW1lc3RhbXA6c3RhdC5tdGltZX19cmV0dXJuIGNhbGxiYWNrKG51bGwse3R5cGU6ImxvY2FsIixlbnRyaWVzOmVudHJpZXN9KX0pLGdldFJlbW90ZVNldDooZnVuY3Rpb24obW91bnQsY2FsbGJhY2spe3ZhciBlbnRyaWVzPXt9O0lEQkZTLmdldERCKG1vdW50Lm1vdW50cG9pbnQsKGZ1bmN0aW9uKGVycixkYil7aWYoZXJyKXJldHVybiBjYWxsYmFjayhlcnIpO3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbSURCRlMuREJfU1RPUkVfTkFNRV0sInJlYWRvbmx5Iik7dHJhbnNhY3Rpb24ub25lcnJvcj0oZnVuY3Rpb24oKXtjYWxsYmFjayh0aGlzLmVycm9yKX0pO3ZhciBzdG9yZT10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShJREJGUy5EQl9TVE9SRV9OQU1FKTt2YXIgaW5kZXg9c3RvcmUuaW5kZXgoInRpbWVzdGFtcCIpO2luZGV4Lm9wZW5LZXlDdXJzb3IoKS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKGV2ZW50KXt2YXIgY3Vyc29yPWV2ZW50LnRhcmdldC5yZXN1bHQ7aWYoIWN1cnNvcil7cmV0dXJuIGNhbGxiYWNrKG51bGwse3R5cGU6InJlbW90ZSIsZGI6ZGIsZW50cmllczplbnRyaWVzfSl9ZW50cmllc1tjdXJzb3IucHJpbWFyeUtleV09e3RpbWVzdGFtcDpjdXJzb3Iua2V5fTtjdXJzb3IuY29udGludWUoKX0pfSkpfSksbG9hZExvY2FsRW50cnk6KGZ1bmN0aW9uKHBhdGgsY2FsbGJhY2spe3ZhciBzdGF0LG5vZGU7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTtub2RlPWxvb2t1cC5ub2RlO3N0YXQ9RlMuc3RhdChwYXRoKX1jYXRjaChlKXtyZXR1cm4gY2FsbGJhY2soZSl9aWYoRlMuaXNEaXIoc3RhdC5tb2RlKSl7cmV0dXJuIGNhbGxiYWNrKG51bGwse3RpbWVzdGFtcDpzdGF0Lm10aW1lLG1vZGU6c3RhdC5tb2RlfSl9ZWxzZSBpZihGUy5pc0ZpbGUoc3RhdC5tb2RlKSl7cmV0dXJuIGNhbGxiYWNrKG51bGwse3RpbWVzdGFtcDpzdGF0Lm10aW1lLG1vZGU6c3RhdC5tb2RlLGNvbnRlbnRzOm5vZGUuY29udGVudHN9KX1lbHNle3JldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIikpfX0pLHN0b3JlTG9jYWxFbnRyeTooZnVuY3Rpb24ocGF0aCxlbnRyeSxjYWxsYmFjayl7dHJ5e2lmKEZTLmlzRGlyKGVudHJ5Lm1vZGUpKXtGUy5ta2RpcihwYXRoLGVudHJ5Lm1vZGUpfWVsc2UgaWYoRlMuaXNGaWxlKGVudHJ5Lm1vZGUpKXtGUy53cml0ZUZpbGUocGF0aCxlbnRyeS5jb250ZW50cyx7ZW5jb2Rpbmc6ImJpbmFyeSIsY2FuT3duOnRydWV9KX1lbHNle3JldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoIm5vZGUgdHlwZSBub3Qgc3VwcG9ydGVkIikpfUZTLnV0aW1lKHBhdGgsZW50cnkudGltZXN0YW1wLGVudHJ5LnRpbWVzdGFtcCl9Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfWNhbGxiYWNrKG51bGwpfSkscmVtb3ZlTG9jYWxFbnRyeTooZnVuY3Rpb24ocGF0aCxjYWxsYmFjayl7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoKTt2YXIgc3RhdD1GUy5zdGF0KHBhdGgpO2lmKEZTLmlzRGlyKHN0YXQubW9kZSkpe0ZTLnJtZGlyKHBhdGgpfWVsc2UgaWYoRlMuaXNGaWxlKHN0YXQubW9kZSkpe0ZTLnVubGluayhwYXRoKX19Y2F0Y2goZSl7cmV0dXJuIGNhbGxiYWNrKGUpfWNhbGxiYWNrKG51bGwpfSksbG9hZFJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLmdldChwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbihldmVudCl7Y2FsbGJhY2sobnVsbCxldmVudC50YXJnZXQucmVzdWx0KX0pO3JlcS5vbmVycm9yPShmdW5jdGlvbigpe2NhbGxiYWNrKHRoaXMuZXJyb3IpfSl9KSxzdG9yZVJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGVudHJ5LGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLnB1dChlbnRyeSxwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKCl7Y2FsbGJhY2sodGhpcy5lcnJvcil9KX0pLHJlbW92ZVJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGNhbGxiYWNrKXt2YXIgcmVxPXN0b3JlLmRlbGV0ZShwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKCl7Y2FsbGJhY2sodGhpcy5lcnJvcil9KX0pLHJlY29uY2lsZTooZnVuY3Rpb24oc3JjLGRzdCxjYWxsYmFjayl7dmFyIHRvdGFsPTA7dmFyIGNyZWF0ZT1bXTtPYmplY3Qua2V5cyhzcmMuZW50cmllcykuZm9yRWFjaCgoZnVuY3Rpb24oa2V5KXt2YXIgZT1zcmMuZW50cmllc1trZXldO3ZhciBlMj1kc3QuZW50cmllc1trZXldO2lmKCFlMnx8ZS50aW1lc3RhbXA+ZTIudGltZXN0YW1wKXtjcmVhdGUucHVzaChrZXkpO3RvdGFsKyt9fSkpO3ZhciByZW1vdmU9W107T2JqZWN0LmtleXMoZHN0LmVudHJpZXMpLmZvckVhY2goKGZ1bmN0aW9uKGtleSl7dmFyIGU9ZHN0LmVudHJpZXNba2V5XTt2YXIgZTI9c3JjLmVudHJpZXNba2V5XTtpZighZTIpe3JlbW92ZS5wdXNoKGtleSk7dG90YWwrK319KSk7aWYoIXRvdGFsKXtyZXR1cm4gY2FsbGJhY2sobnVsbCl9dmFyIGVycm9yZWQ9ZmFsc2U7dmFyIGNvbXBsZXRlZD0wO3ZhciBkYj1zcmMudHlwZT09PSJyZW1vdGUiP3NyYy5kYjpkc3QuZGI7dmFyIHRyYW5zYWN0aW9uPWRiLnRyYW5zYWN0aW9uKFtJREJGUy5EQl9TVE9SRV9OQU1FXSwicmVhZHdyaXRlIik7dmFyIHN0b3JlPXRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpO2Z1bmN0aW9uIGRvbmUoZXJyKXtpZihlcnIpe2lmKCFkb25lLmVycm9yZWQpe2RvbmUuZXJyb3JlZD10cnVlO3JldHVybiBjYWxsYmFjayhlcnIpfXJldHVybn1pZigrK2NvbXBsZXRlZD49dG90YWwpe3JldHVybiBjYWxsYmFjayhudWxsKX19dHJhbnNhY3Rpb24ub25lcnJvcj0oZnVuY3Rpb24oKXtkb25lKHRoaXMuZXJyb3IpfSk7Y3JlYXRlLnNvcnQoKS5mb3JFYWNoKChmdW5jdGlvbihwYXRoKXtpZihkc3QudHlwZT09PSJsb2NhbCIpe0lEQkZTLmxvYWRSZW1vdGVFbnRyeShzdG9yZSxwYXRoLChmdW5jdGlvbihlcnIsZW50cnkpe2lmKGVycilyZXR1cm4gZG9uZShlcnIpO0lEQkZTLnN0b3JlTG9jYWxFbnRyeShwYXRoLGVudHJ5LGRvbmUpfSkpfWVsc2V7SURCRlMubG9hZExvY2FsRW50cnkocGF0aCwoZnVuY3Rpb24oZXJyLGVudHJ5KXtpZihlcnIpcmV0dXJuIGRvbmUoZXJyKTtJREJGUy5zdG9yZVJlbW90ZUVudHJ5KHN0b3JlLHBhdGgsZW50cnksZG9uZSl9KSl9fSkpO3JlbW92ZS5zb3J0KCkucmV2ZXJzZSgpLmZvckVhY2goKGZ1bmN0aW9uKHBhdGgpe2lmKGRzdC50eXBlPT09ImxvY2FsIil7SURCRlMucmVtb3ZlTG9jYWxFbnRyeShwYXRoLGRvbmUpfWVsc2V7SURCRlMucmVtb3ZlUmVtb3RlRW50cnkoc3RvcmUscGF0aCxkb25lKX19KSl9KX07dmFyIE5PREVGUz17aXNXaW5kb3dzOmZhbHNlLHN0YXRpY0luaXQ6KGZ1bmN0aW9uKCl7Tk9ERUZTLmlzV2luZG93cz0hIXByb2Nlc3MucGxhdGZvcm0ubWF0Y2goL153aW4vKX0pLG1vdW50OihmdW5jdGlvbihtb3VudCl7YXNzZXJ0KEVOVklST05NRU5UX0lTX05PREUpO3JldHVybiBOT0RFRlMuY3JlYXRlTm9kZShudWxsLCIvIixOT0RFRlMuZ2V0TW9kZShtb3VudC5vcHRzLnJvb3QpLDApfSksY3JlYXRlTm9kZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe2lmKCFGUy5pc0Rpcihtb2RlKSYmIUZTLmlzRmlsZShtb2RlKSYmIUZTLmlzTGluayhtb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbm9kZT1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUpO25vZGUubm9kZV9vcHM9Tk9ERUZTLm5vZGVfb3BzO25vZGUuc3RyZWFtX29wcz1OT0RFRlMuc3RyZWFtX29wcztyZXR1cm4gbm9kZX0pLGdldE1vZGU6KGZ1bmN0aW9uKHBhdGgpe3ZhciBzdGF0O3RyeXtzdGF0PWZzLmxzdGF0U3luYyhwYXRoKTtpZihOT0RFRlMuaXNXaW5kb3dzKXtzdGF0Lm1vZGU9c3RhdC5tb2RlfChzdGF0Lm1vZGUmMTQ2KT4+MX19Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfXJldHVybiBzdGF0Lm1vZGV9KSxyZWFsUGF0aDooZnVuY3Rpb24obm9kZSl7dmFyIHBhcnRzPVtdO3doaWxlKG5vZGUucGFyZW50IT09bm9kZSl7cGFydHMucHVzaChub2RlLm5hbWUpO25vZGU9bm9kZS5wYXJlbnR9cGFydHMucHVzaChub2RlLm1vdW50Lm9wdHMucm9vdCk7cGFydHMucmV2ZXJzZSgpO3JldHVybiBQQVRILmpvaW4uYXBwbHkobnVsbCxwYXJ0cyl9KSxmbGFnc1RvUGVybWlzc2lvblN0cmluZ01hcDp7MDoiciIsMToicisiLDI6InIrIiw2NDoiciIsNjU6InIrIiw2NjoicisiLDEyOToicngrIiwxOTM6InJ4KyIsNTE0OiJ3KyIsNTc3OiJ3Iiw1Nzg6IncrIiw3MDU6Ind4Iiw3MDY6Ind4KyIsMTAyNDoiYSIsMTAyNToiYSIsMTAyNjoiYSsiLDEwODk6ImEiLDEwOTA6ImErIiwxMTUzOiJheCIsMTE1NDoiYXgrIiwxMjE3OiJheCIsMTIxODoiYXgrIiw0MDk2OiJycyIsNDA5ODoicnMrIn0sZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmc6KGZ1bmN0aW9uKGZsYWdzKXtpZihmbGFncyBpbiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXApe3JldHVybiBOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXBbZmxhZ3NdfWVsc2V7cmV0dXJuIGZsYWdzfX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dmFyIHN0YXQ7dHJ5e3N0YXQ9ZnMubHN0YXRTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1pZihOT0RFRlMuaXNXaW5kb3dzJiYhc3RhdC5ibGtzaXplKXtzdGF0LmJsa3NpemU9NDA5Nn1pZihOT0RFRlMuaXNXaW5kb3dzJiYhc3RhdC5ibG9ja3Mpe3N0YXQuYmxvY2tzPShzdGF0LnNpemUrc3RhdC5ibGtzaXplLTEpL3N0YXQuYmxrc2l6ZXwwfXJldHVybntkZXY6c3RhdC5kZXYsaW5vOnN0YXQuaW5vLG1vZGU6c3RhdC5tb2RlLG5saW5rOnN0YXQubmxpbmssdWlkOnN0YXQudWlkLGdpZDpzdGF0LmdpZCxyZGV2OnN0YXQucmRldixzaXplOnN0YXQuc2l6ZSxhdGltZTpzdGF0LmF0aW1lLG10aW1lOnN0YXQubXRpbWUsY3RpbWU6c3RhdC5jdGltZSxibGtzaXplOnN0YXQuYmxrc2l6ZSxibG9ja3M6c3RhdC5ibG9ja3N9fSksc2V0YXR0cjooZnVuY3Rpb24obm9kZSxhdHRyKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dHJ5e2lmKGF0dHIubW9kZSE9PXVuZGVmaW5lZCl7ZnMuY2htb2RTeW5jKHBhdGgsYXR0ci5tb2RlKTtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXt2YXIgZGF0ZT1uZXcgRGF0ZShhdHRyLnRpbWVzdGFtcCk7ZnMudXRpbWVzU3luYyhwYXRoLGRhdGUsZGF0ZSl9aWYoYXR0ci5zaXplIT09dW5kZWZpbmVkKXtmcy50cnVuY2F0ZVN5bmMocGF0aCxhdHRyLnNpemUpfX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksbG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt2YXIgbW9kZT1OT0RFRlMuZ2V0TW9kZShwYXRoKTtyZXR1cm4gTk9ERUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSl9KSxta25vZDooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe3ZhciBub2RlPU5PREVGUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KTt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dHJ5e2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2ZzLm1rZGlyU3luYyhwYXRoLG5vZGUubW9kZSl9ZWxzZXtmcy53cml0ZUZpbGVTeW5jKHBhdGgsIiIse21vZGU6bm9kZS5tb2RlfSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gbm9kZX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkTm9kZSxuZXdEaXIsbmV3TmFtZSl7dmFyIG9sZFBhdGg9Tk9ERUZTLnJlYWxQYXRoKG9sZE5vZGUpO3ZhciBuZXdQYXRoPVBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKG5ld0RpciksbmV3TmFtZSk7dHJ5e2ZzLnJlbmFtZVN5bmMob2xkUGF0aCxuZXdQYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksdW5saW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt0cnl7ZnMudW5saW5rU3luYyhwYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93IGU7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXIgcGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5hbWUpO3RyeXtmcy5ybWRpclN5bmMocGF0aCl9Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvdyBlO3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfX0pLHJlYWRkaXI6KGZ1bmN0aW9uKG5vZGUpe3ZhciBwYXRoPU5PREVGUy5yZWFsUGF0aChub2RlKTt0cnl7cmV0dXJuIGZzLnJlYWRkaXJTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxzeW1saW5rOihmdW5jdGlvbihwYXJlbnQsbmV3TmFtZSxvbGRQYXRoKXt2YXIgbmV3UGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5ld05hbWUpO3RyeXtmcy5zeW1saW5rU3luYyhvbGRQYXRoLG5ld1BhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtyZXR1cm4gZnMucmVhZGxpbmtTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KX0sc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXIgcGF0aD1OT0RFRlMucmVhbFBhdGgoc3RyZWFtLm5vZGUpO3RyeXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3N0cmVhbS5uZmQ9ZnMub3BlblN5bmMocGF0aCxOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoc3RyZWFtLmZsYWdzKSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXt0cnl7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpJiZzdHJlYW0ubmZkKXtmcy5jbG9zZVN5bmMoc3RyZWFtLm5mZCl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3cgZTt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBuYnVmZmVyPW5ldyBCdWZmZXIobGVuZ3RoKTt2YXIgcmVzO3RyeXtyZXM9ZnMucmVhZFN5bmMoc3RyZWFtLm5mZCxuYnVmZmVyLDAsbGVuZ3RoLHBvc2l0aW9uKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1pZihyZXM+MCl7Zm9yKHZhciBpPTA7aTxyZXM7aSsrKXtidWZmZXJbb2Zmc2V0K2ldPW5idWZmZXJbaV19fXJldHVybiByZXN9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uKXt2YXIgbmJ1ZmZlcj1uZXcgQnVmZmVyKGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsb2Zmc2V0K2xlbmd0aCkpO3ZhciByZXM7dHJ5e3Jlcz1mcy53cml0ZVN5bmMoc3RyZWFtLm5mZCxuYnVmZmVyLDAsbGVuZ3RoLHBvc2l0aW9uKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm4gcmVzfSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7dmFyIHBvc2l0aW9uPW9mZnNldDtpZih3aGVuY2U9PT0xKXtwb3NpdGlvbis9c3RyZWFtLnBvc2l0aW9ufWVsc2UgaWYod2hlbmNlPT09Mil7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXt0cnl7dmFyIHN0YXQ9ZnMuZnN0YXRTeW5jKHN0cmVhbS5uZmQpO3Bvc2l0aW9uKz1zdGF0LnNpemV9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fX1pZihwb3NpdGlvbjwwKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXN0cmVhbS5wb3NpdGlvbj1wb3NpdGlvbjtyZXR1cm4gcG9zaXRpb259KX19O3ZhciBfc3RkaW49YWxsb2NhdGUoMSwiaTMyKiIsQUxMT0NfU1RBVElDKTt2YXIgX3N0ZG91dD1hbGxvY2F0ZSgxLCJpMzIqIixBTExPQ19TVEFUSUMpO3ZhciBfc3RkZXJyPWFsbG9jYXRlKDEsImkzMioiLEFMTE9DX1NUQVRJQyk7dmFyIEZTPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6W251bGxdLHN0cmVhbXM6W10sbmV4dElub2RlOjEsbmFtZVRhYmxlOm51bGwsY3VycmVudFBhdGg6Ii8iLGluaXRpYWxpemVkOmZhbHNlLGlnbm9yZVBlcm1pc3Npb25zOnRydWUsdHJhY2tpbmdEZWxlZ2F0ZTp7fSx0cmFja2luZzp7b3BlbkZsYWdzOntSRUFEOjEsV1JJVEU6Mn19LEVycm5vRXJyb3I6bnVsbCxnZW5lcmljRXJyb3JzOnt9LGhhbmRsZUZTRXJyb3I6KGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIEZTLkVycm5vRXJyb3IpKXRocm93IGUrIiA6ICIrc3RhY2tUcmFjZSgpO3JldHVybiBfX19zZXRFcnJObyhlLmVycm5vKX0pLGxvb2t1cFBhdGg6KGZ1bmN0aW9uKHBhdGgsb3B0cyl7cGF0aD1QQVRILnJlc29sdmUoRlMuY3dkKCkscGF0aCk7b3B0cz1vcHRzfHx7fTt2YXIgZGVmYXVsdHM9e2ZvbGxvd19tb3VudDp0cnVlLHJlY3Vyc2VfY291bnQ6MH07Zm9yKHZhciBrZXkgaW4gZGVmYXVsdHMpe2lmKG9wdHNba2V5XT09PXVuZGVmaW5lZCl7b3B0c1trZXldPWRlZmF1bHRzW2tleV19fWlmKG9wdHMucmVjdXJzZV9jb3VudD44KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTE9PUCl9dmFyIHBhcnRzPVBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdCgiLyIpLmZpbHRlcigoZnVuY3Rpb24ocCl7cmV0dXJuISFwfSkpLGZhbHNlKTt2YXIgY3VycmVudD1GUy5yb290O3ZhciBjdXJyZW50X3BhdGg9Ii8iO2Zvcih2YXIgaT0wO2k8cGFydHMubGVuZ3RoO2krKyl7dmFyIGlzbGFzdD1pPT09cGFydHMubGVuZ3RoLTE7aWYoaXNsYXN0JiZvcHRzLnBhcmVudCl7YnJlYWt9Y3VycmVudD1GUy5sb29rdXBOb2RlKGN1cnJlbnQscGFydHNbaV0pO2N1cnJlbnRfcGF0aD1QQVRILmpvaW4yKGN1cnJlbnRfcGF0aCxwYXJ0c1tpXSk7aWYoRlMuaXNNb3VudHBvaW50KGN1cnJlbnQpKXtpZighaXNsYXN0fHxpc2xhc3QmJm9wdHMuZm9sbG93X21vdW50KXtjdXJyZW50PWN1cnJlbnQubW91bnRlZC5yb290fX1pZighaXNsYXN0fHxvcHRzLmZvbGxvdyl7dmFyIGNvdW50PTA7d2hpbGUoRlMuaXNMaW5rKGN1cnJlbnQubW9kZSkpe3ZhciBsaW5rPUZTLnJlYWRsaW5rKGN1cnJlbnRfcGF0aCk7Y3VycmVudF9wYXRoPVBBVEgucmVzb2x2ZShQQVRILmRpcm5hbWUoY3VycmVudF9wYXRoKSxsaW5rKTt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgoY3VycmVudF9wYXRoLHtyZWN1cnNlX2NvdW50Om9wdHMucmVjdXJzZV9jb3VudH0pO2N1cnJlbnQ9bG9va3VwLm5vZGU7aWYoY291bnQrKz40MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUxPT1ApfX19fXJldHVybntwYXRoOmN1cnJlbnRfcGF0aCxub2RlOmN1cnJlbnR9fSksZ2V0UGF0aDooZnVuY3Rpb24obm9kZSl7dmFyIHBhdGg7d2hpbGUodHJ1ZSl7aWYoRlMuaXNSb290KG5vZGUpKXt2YXIgbW91bnQ9bm9kZS5tb3VudC5tb3VudHBvaW50O2lmKCFwYXRoKXJldHVybiBtb3VudDtyZXR1cm4gbW91bnRbbW91bnQubGVuZ3RoLTFdIT09Ii8iP21vdW50KyIvIitwYXRoOm1vdW50K3BhdGh9cGF0aD1wYXRoP25vZGUubmFtZSsiLyIrcGF0aDpub2RlLm5hbWU7bm9kZT1ub2RlLnBhcmVudH19KSxoYXNoTmFtZTooZnVuY3Rpb24ocGFyZW50aWQsbmFtZSl7dmFyIGhhc2g9MDtmb3IodmFyIGk9MDtpPG5hbWUubGVuZ3RoO2krKyl7aGFzaD0oaGFzaDw8NSktaGFzaCtuYW1lLmNoYXJDb2RlQXQoaSl8MH1yZXR1cm4ocGFyZW50aWQraGFzaD4+PjApJUZTLm5hbWVUYWJsZS5sZW5ndGh9KSxoYXNoQWRkTm9kZTooZnVuY3Rpb24obm9kZSl7dmFyIGhhc2g9RlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsbm9kZS5uYW1lKTtub2RlLm5hbWVfbmV4dD1GUy5uYW1lVGFibGVbaGFzaF07RlMubmFtZVRhYmxlW2hhc2hdPW5vZGV9KSxoYXNoUmVtb3ZlTm9kZTooZnVuY3Rpb24obm9kZSl7dmFyIGhhc2g9RlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsbm9kZS5uYW1lKTtpZihGUy5uYW1lVGFibGVbaGFzaF09PT1ub2RlKXtGUy5uYW1lVGFibGVbaGFzaF09bm9kZS5uYW1lX25leHR9ZWxzZXt2YXIgY3VycmVudD1GUy5uYW1lVGFibGVbaGFzaF07d2hpbGUoY3VycmVudCl7aWYoY3VycmVudC5uYW1lX25leHQ9PT1ub2RlKXtjdXJyZW50Lm5hbWVfbmV4dD1ub2RlLm5hbWVfbmV4dDticmVha31jdXJyZW50PWN1cnJlbnQubmFtZV9uZXh0fX19KSxsb29rdXBOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyIGVycj1GUy5tYXlMb29rdXAocGFyZW50KTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9dmFyIGhhc2g9RlMuaGFzaE5hbWUocGFyZW50LmlkLG5hbWUpO2Zvcih2YXIgbm9kZT1GUy5uYW1lVGFibGVbaGFzaF07bm9kZTtub2RlPW5vZGUubmFtZV9uZXh0KXt2YXIgbm9kZU5hbWU9bm9kZS5uYW1lO2lmKG5vZGUucGFyZW50LmlkPT09cGFyZW50LmlkJiZub2RlTmFtZT09PW5hbWUpe3JldHVybiBub2RlfX1yZXR1cm4gRlMubG9va3VwKHBhcmVudCxuYW1lKX0pLGNyZWF0ZU5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUscmRldil7aWYoIUZTLkZTTm9kZSl7RlMuRlNOb2RlPShmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLHJkZXYpe2lmKCFwYXJlbnQpe3BhcmVudD10aGlzfXRoaXMucGFyZW50PXBhcmVudDt0aGlzLm1vdW50PXBhcmVudC5tb3VudDt0aGlzLm1vdW50ZWQ9bnVsbDt0aGlzLmlkPUZTLm5leHRJbm9kZSsrO3RoaXMubmFtZT1uYW1lO3RoaXMubW9kZT1tb2RlO3RoaXMubm9kZV9vcHM9e307dGhpcy5zdHJlYW1fb3BzPXt9O3RoaXMucmRldj1yZGV2fSk7RlMuRlNOb2RlLnByb3RvdHlwZT17fTt2YXIgcmVhZE1vZGU9MjkyfDczO3ZhciB3cml0ZU1vZGU9MTQ2O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZTLkZTTm9kZS5wcm90b3R5cGUse3JlYWQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5tb2RlJnJlYWRNb2RlKT09PXJlYWRNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXJlYWRNb2RlOnRoaXMubW9kZSY9fnJlYWRNb2RlfSl9LHdyaXRlOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZ3cml0ZU1vZGUpPT09d3JpdGVNb2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3ZhbD90aGlzLm1vZGV8PXdyaXRlTW9kZTp0aGlzLm1vZGUmPX53cml0ZU1vZGV9KX0saXNGb2xkZXI6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4gRlMuaXNEaXIodGhpcy5tb2RlKX0pfSxpc0RldmljZTp7Z2V0OihmdW5jdGlvbigpe3JldHVybiBGUy5pc0NocmRldih0aGlzLm1vZGUpfSl9fSl9dmFyIG5vZGU9bmV3IEZTLkZTTm9kZShwYXJlbnQsbmFtZSxtb2RlLHJkZXYpO0ZTLmhhc2hBZGROb2RlKG5vZGUpO3JldHVybiBub2RlfSksZGVzdHJveU5vZGU6KGZ1bmN0aW9uKG5vZGUpe0ZTLmhhc2hSZW1vdmVOb2RlKG5vZGUpfSksaXNSb290OihmdW5jdGlvbihub2RlKXtyZXR1cm4gbm9kZT09PW5vZGUucGFyZW50fSksaXNNb3VudHBvaW50OihmdW5jdGlvbihub2RlKXtyZXR1cm4hIW5vZGUubW91bnRlZH0pLGlzRmlsZTooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MzI3Njh9KSxpc0RpcjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MTYzODR9KSxpc0xpbms6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTYwfSksaXNDaHJkZXY6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTgxOTJ9KSxpc0Jsa2RldjooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNjE0NDApPT09MjQ1NzZ9KSxpc0ZJRk86KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTQwOTZ9KSxpc1NvY2tldDooZnVuY3Rpb24obW9kZSl7cmV0dXJuKG1vZGUmNDkxNTIpPT09NDkxNTJ9KSxmbGFnTW9kZXM6eyJyIjowLCJycyI6MTA1MjY3MiwicisiOjIsInciOjU3Nywid3giOjcwNSwieHciOjcwNSwidysiOjU3OCwid3grIjo3MDYsInh3KyI6NzA2LCJhIjoxMDg5LCJheCI6MTIxNywieGEiOjEyMTcsImErIjoxMDkwLCJheCsiOjEyMTgsInhhKyI6MTIxOH0sbW9kZVN0cmluZ1RvRmxhZ3M6KGZ1bmN0aW9uKHN0cil7dmFyIGZsYWdzPUZTLmZsYWdNb2Rlc1tzdHJdO2lmKHR5cGVvZiBmbGFncz09PSJ1bmRlZmluZWQiKXt0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZmlsZSBvcGVuIG1vZGU6ICIrc3RyKX1yZXR1cm4gZmxhZ3N9KSxmbGFnc1RvUGVybWlzc2lvblN0cmluZzooZnVuY3Rpb24oZmxhZyl7dmFyIGFjY21vZGU9ZmxhZyYyMDk3MTU1O3ZhciBwZXJtcz1bInIiLCJ3IiwicnciXVthY2Ntb2RlXTtpZihmbGFnJjUxMil7cGVybXMrPSJ3In1yZXR1cm4gcGVybXN9KSxub2RlUGVybWlzc2lvbnM6KGZ1bmN0aW9uKG5vZGUscGVybXMpe2lmKEZTLmlnbm9yZVBlcm1pc3Npb25zKXtyZXR1cm4gMH1pZihwZXJtcy5pbmRleE9mKCJyIikhPT0tMSYmIShub2RlLm1vZGUmMjkyKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVBQ0NFU31lbHNlIGlmKHBlcm1zLmluZGV4T2YoInciKSE9PS0xJiYhKG5vZGUubW9kZSYxNDYpKXtyZXR1cm4gRVJSTk9fQ09ERVMuRUFDQ0VTfWVsc2UgaWYocGVybXMuaW5kZXhPZigieCIpIT09LTEmJiEobm9kZS5tb2RlJjczKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVBQ0NFU31yZXR1cm4gMH0pLG1heUxvb2t1cDooZnVuY3Rpb24oZGlyKXtyZXR1cm4gRlMubm9kZVBlcm1pc3Npb25zKGRpciwieCIpfSksbWF5Q3JlYXRlOihmdW5jdGlvbihkaXIsbmFtZSl7dHJ5e3ZhciBub2RlPUZTLmxvb2t1cE5vZGUoZGlyLG5hbWUpO3JldHVybiBFUlJOT19DT0RFUy5FRVhJU1R9Y2F0Y2goZSl7fXJldHVybiBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLCJ3eCIpfSksbWF5RGVsZXRlOihmdW5jdGlvbihkaXIsbmFtZSxpc2Rpcil7dmFyIG5vZGU7dHJ5e25vZGU9RlMubG9va3VwTm9kZShkaXIsbmFtZSl9Y2F0Y2goZSl7cmV0dXJuIGUuZXJybm99dmFyIGVycj1GUy5ub2RlUGVybWlzc2lvbnMoZGlyLCJ3eCIpO2lmKGVycil7cmV0dXJuIGVycn1pZihpc2Rpcil7aWYoIUZTLmlzRGlyKG5vZGUubW9kZSkpe3JldHVybiBFUlJOT19DT0RFUy5FTk9URElSfWlmKEZTLmlzUm9vdChub2RlKXx8RlMuZ2V0UGF0aChub2RlKT09PUZTLmN3ZCgpKXtyZXR1cm4gRVJSTk9fQ09ERVMuRUJVU1l9fWVsc2V7aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVJU0RJUn19cmV0dXJuIDB9KSxtYXlPcGVuOihmdW5jdGlvbihub2RlLGZsYWdzKXtpZighbm9kZSl7cmV0dXJuIEVSUk5PX0NPREVTLkVOT0VOVH1pZihGUy5pc0xpbmsobm9kZS5tb2RlKSl7cmV0dXJuIEVSUk5PX0NPREVTLkVMT09QfWVsc2UgaWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7aWYoKGZsYWdzJjIwOTcxNTUpIT09MHx8ZmxhZ3MmNTEyKXtyZXR1cm4gRVJSTk9fQ09ERVMuRUlTRElSfX1yZXR1cm4gRlMubm9kZVBlcm1pc3Npb25zKG5vZGUsRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoZmxhZ3MpKX0pLE1BWF9PUEVOX0ZEUzo0MDk2LG5leHRmZDooZnVuY3Rpb24oZmRfc3RhcnQsZmRfZW5kKXtmZF9zdGFydD1mZF9zdGFydHx8MDtmZF9lbmQ9ZmRfZW5kfHxGUy5NQVhfT1BFTl9GRFM7Zm9yKHZhciBmZD1mZF9zdGFydDtmZDw9ZmRfZW5kO2ZkKyspe2lmKCFGUy5zdHJlYW1zW2ZkXSl7cmV0dXJuIGZkfX10aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTUZJTEUpfSksZ2V0U3RyZWFtOihmdW5jdGlvbihmZCl7cmV0dXJuIEZTLnN0cmVhbXNbZmRdfSksY3JlYXRlU3RyZWFtOihmdW5jdGlvbihzdHJlYW0sZmRfc3RhcnQsZmRfZW5kKXtpZighRlMuRlNTdHJlYW0pe0ZTLkZTU3RyZWFtPShmdW5jdGlvbigpe30pO0ZTLkZTU3RyZWFtLnByb3RvdHlwZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGUy5GU1N0cmVhbS5wcm90b3R5cGUse29iamVjdDp7Z2V0OihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGV9KSxzZXQ6KGZ1bmN0aW9uKHZhbCl7dGhpcy5ub2RlPXZhbH0pfSxpc1JlYWQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5mbGFncyYyMDk3MTU1KSE9PTF9KX0saXNXcml0ZTp7Z2V0OihmdW5jdGlvbigpe3JldHVybih0aGlzLmZsYWdzJjIwOTcxNTUpIT09MH0pfSxpc0FwcGVuZDp7Z2V0OihmdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9KX19KX12YXIgbmV3U3RyZWFtPW5ldyBGUy5GU1N0cmVhbTtmb3IodmFyIHAgaW4gc3RyZWFtKXtuZXdTdHJlYW1bcF09c3RyZWFtW3BdfXN0cmVhbT1uZXdTdHJlYW07dmFyIGZkPUZTLm5leHRmZChmZF9zdGFydCxmZF9lbmQpO3N0cmVhbS5mZD1mZDtGUy5zdHJlYW1zW2ZkXT1zdHJlYW07cmV0dXJuIHN0cmVhbX0pLGNsb3NlU3RyZWFtOihmdW5jdGlvbihmZCl7RlMuc3RyZWFtc1tmZF09bnVsbH0pLGdldFN0cmVhbUZyb21QdHI6KGZ1bmN0aW9uKHB0cil7cmV0dXJuIEZTLnN0cmVhbXNbcHRyLTFdfSksZ2V0UHRyRm9yU3RyZWFtOihmdW5jdGlvbihzdHJlYW0pe3JldHVybiBzdHJlYW0/c3RyZWFtLmZkKzE6MH0pLGNocmRldl9zdHJlYW1fb3BzOntvcGVuOihmdW5jdGlvbihzdHJlYW0pe3ZhciBkZXZpY2U9RlMuZ2V0RGV2aWNlKHN0cmVhbS5ub2RlLnJkZXYpO3N0cmVhbS5zdHJlYW1fb3BzPWRldmljZS5zdHJlYW1fb3BzO2lmKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pe3N0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKX19KSxsbHNlZWs6KGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX0pfSxtYWpvcjooZnVuY3Rpb24oZGV2KXtyZXR1cm4gZGV2Pj44fSksbWlub3I6KGZ1bmN0aW9uKGRldil7cmV0dXJuIGRldiYyNTV9KSxtYWtlZGV2OihmdW5jdGlvbihtYSxtaSl7cmV0dXJuIG1hPDw4fG1pfSkscmVnaXN0ZXJEZXZpY2U6KGZ1bmN0aW9uKGRldixvcHMpe0ZTLmRldmljZXNbZGV2XT17c3RyZWFtX29wczpvcHN9fSksZ2V0RGV2aWNlOihmdW5jdGlvbihkZXYpe3JldHVybiBGUy5kZXZpY2VzW2Rldl19KSxnZXRNb3VudHM6KGZ1bmN0aW9uKG1vdW50KXt2YXIgbW91bnRzPVtdO3ZhciBjaGVjaz1bbW91bnRdO3doaWxlKGNoZWNrLmxlbmd0aCl7dmFyIG09Y2hlY2sucG9wKCk7bW91bnRzLnB1c2gobSk7Y2hlY2sucHVzaC5hcHBseShjaGVjayxtLm1vdW50cyl9cmV0dXJuIG1vdW50c30pLHN5bmNmczooZnVuY3Rpb24ocG9wdWxhdGUsY2FsbGJhY2spe2lmKHR5cGVvZiBwb3B1bGF0ZT09PSJmdW5jdGlvbiIpe2NhbGxiYWNrPXBvcHVsYXRlO3BvcHVsYXRlPWZhbHNlfXZhciBtb3VudHM9RlMuZ2V0TW91bnRzKEZTLnJvb3QubW91bnQpO3ZhciBjb21wbGV0ZWQ9MDtmdW5jdGlvbiBkb25lKGVycil7aWYoZXJyKXtpZighZG9uZS5lcnJvcmVkKXtkb25lLmVycm9yZWQ9dHJ1ZTtyZXR1cm4gY2FsbGJhY2soZXJyKX1yZXR1cm59aWYoKytjb21wbGV0ZWQ+PW1vdW50cy5sZW5ndGgpe2NhbGxiYWNrKG51bGwpfX1tb3VudHMuZm9yRWFjaCgoZnVuY3Rpb24obW91bnQpe2lmKCFtb3VudC50eXBlLnN5bmNmcyl7cmV0dXJuIGRvbmUobnVsbCl9bW91bnQudHlwZS5zeW5jZnMobW91bnQscG9wdWxhdGUsZG9uZSl9KSl9KSxtb3VudDooZnVuY3Rpb24odHlwZSxvcHRzLG1vdW50cG9pbnQpe3ZhciByb290PW1vdW50cG9pbnQ9PT0iLyI7dmFyIHBzZXVkbz0hbW91bnRwb2ludDt2YXIgbm9kZTtpZihyb290JiZGUy5yb290KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQlVTWSl9ZWxzZSBpZighcm9vdCYmIXBzZXVkbyl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKG1vdW50cG9pbnQse2ZvbGxvd19tb3VudDpmYWxzZX0pO21vdW50cG9pbnQ9bG9va3VwLnBhdGg7bm9kZT1sb29rdXAubm9kZTtpZihGUy5pc01vdW50cG9pbnQobm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1pZighRlMuaXNEaXIobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVERJUil9fXZhciBtb3VudD17dHlwZTp0eXBlLG9wdHM6b3B0cyxtb3VudHBvaW50Om1vdW50cG9pbnQsbW91bnRzOltdfTt2YXIgbW91bnRSb290PXR5cGUubW91bnQobW91bnQpO21vdW50Um9vdC5tb3VudD1tb3VudDttb3VudC5yb290PW1vdW50Um9vdDtpZihyb290KXtGUy5yb290PW1vdW50Um9vdH1lbHNlIGlmKG5vZGUpe25vZGUubW91bnRlZD1tb3VudDtpZihub2RlLm1vdW50KXtub2RlLm1vdW50Lm1vdW50cy5wdXNoKG1vdW50KX19cmV0dXJuIG1vdW50Um9vdH0pLHVubW91bnQ6KGZ1bmN0aW9uKG1vdW50cG9pbnQpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChtb3VudHBvaW50LHtmb2xsb3dfbW91bnQ6ZmFsc2V9KTtpZighRlMuaXNNb3VudHBvaW50KGxvb2t1cC5ub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbm9kZT1sb29rdXAubm9kZTt2YXIgbW91bnQ9bm9kZS5tb3VudGVkO3ZhciBtb3VudHM9RlMuZ2V0TW91bnRzKG1vdW50KTtPYmplY3Qua2V5cyhGUy5uYW1lVGFibGUpLmZvckVhY2goKGZ1bmN0aW9uKGhhc2gpe3ZhciBjdXJyZW50PUZTLm5hbWVUYWJsZVtoYXNoXTt3aGlsZShjdXJyZW50KXt2YXIgbmV4dD1jdXJyZW50Lm5hbWVfbmV4dDtpZihtb3VudHMuaW5kZXhPZihjdXJyZW50Lm1vdW50KSE9PS0xKXtGUy5kZXN0cm95Tm9kZShjdXJyZW50KX1jdXJyZW50PW5leHR9fSkpO25vZGUubW91bnRlZD1udWxsO3ZhciBpZHg9bm9kZS5tb3VudC5tb3VudHMuaW5kZXhPZihtb3VudCk7YXNzZXJ0KGlkeCE9PS0xKTtub2RlLm1vdW50Lm1vdW50cy5zcGxpY2UoaWR4LDEpfSksbG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7cmV0dXJuIHBhcmVudC5ub2RlX29wcy5sb29rdXAocGFyZW50LG5hbWUpfSksbWtub2Q6KGZ1bmN0aW9uKHBhdGgsbW9kZSxkZXYpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgZXJyPUZTLm1heUNyZWF0ZShwYXJlbnQsbmFtZSk7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfWlmKCFwYXJlbnQubm9kZV9vcHMubWtub2Qpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1yZXR1cm4gcGFyZW50Lm5vZGVfb3BzLm1rbm9kKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0pLGNyZWF0ZTooZnVuY3Rpb24ocGF0aCxtb2RlKXttb2RlPW1vZGUhPT11bmRlZmluZWQ/bW9kZTo0Mzg7bW9kZSY9NDA5NTttb2RlfD0zMjc2ODtyZXR1cm4gRlMubWtub2QocGF0aCxtb2RlLDApfSksbWtkaXI6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7bW9kZT1tb2RlIT09dW5kZWZpbmVkP21vZGU6NTExO21vZGUmPTUxMXw1MTI7bW9kZXw9MTYzODQ7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSwwKX0pLG1rZGV2OihmdW5jdGlvbihwYXRoLG1vZGUsZGV2KXtpZih0eXBlb2YgZGV2PT09InVuZGVmaW5lZCIpe2Rldj1tb2RlO21vZGU9NDM4fW1vZGV8PTgxOTI7cmV0dXJuIEZTLm1rbm9kKHBhdGgsbW9kZSxkZXYpfSksc3ltbGluazooZnVuY3Rpb24ob2xkcGF0aCxuZXdwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgobmV3cGF0aCx7cGFyZW50OnRydWV9KTt2YXIgcGFyZW50PWxvb2t1cC5ub2RlO3ZhciBuZXduYW1lPVBBVEguYmFzZW5hbWUobmV3cGF0aCk7dmFyIGVycj1GUy5tYXlDcmVhdGUocGFyZW50LG5ld25hbWUpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLnN5bWxpbmspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1yZXR1cm4gcGFyZW50Lm5vZGVfb3BzLnN5bWxpbmsocGFyZW50LG5ld25hbWUsb2xkcGF0aCl9KSxyZW5hbWU6KGZ1bmN0aW9uKG9sZF9wYXRoLG5ld19wYXRoKXt2YXIgb2xkX2Rpcm5hbWU9UEFUSC5kaXJuYW1lKG9sZF9wYXRoKTt2YXIgbmV3X2Rpcm5hbWU9UEFUSC5kaXJuYW1lKG5ld19wYXRoKTt2YXIgb2xkX25hbWU9UEFUSC5iYXNlbmFtZShvbGRfcGF0aCk7dmFyIG5ld19uYW1lPVBBVEguYmFzZW5hbWUobmV3X3BhdGgpO3ZhciBsb29rdXAsb2xkX2RpcixuZXdfZGlyO3RyeXtsb29rdXA9RlMubG9va3VwUGF0aChvbGRfcGF0aCx7cGFyZW50OnRydWV9KTtvbGRfZGlyPWxvb2t1cC5ub2RlO2xvb2t1cD1GUy5sb29rdXBQYXRoKG5ld19wYXRoLHtwYXJlbnQ6dHJ1ZX0pO25ld19kaXI9bG9va3VwLm5vZGV9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfWlmKG9sZF9kaXIubW91bnQhPT1uZXdfZGlyLm1vdW50KXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FWERFVil9dmFyIG9sZF9ub2RlPUZTLmxvb2t1cE5vZGUob2xkX2RpcixvbGRfbmFtZSk7dmFyIHJlbGF0aXZlPVBBVEgucmVsYXRpdmUob2xkX3BhdGgsbmV3X2Rpcm5hbWUpO2lmKHJlbGF0aXZlLmNoYXJBdCgwKSE9PSIuIil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1yZWxhdGl2ZT1QQVRILnJlbGF0aXZlKG5ld19wYXRoLG9sZF9kaXJuYW1lKTtpZihyZWxhdGl2ZS5jaGFyQXQoMCkhPT0iLiIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RFTVBUWSl9dmFyIG5ld19ub2RlO3RyeXtuZXdfbm9kZT1GUy5sb29rdXBOb2RlKG5ld19kaXIsbmV3X25hbWUpfWNhdGNoKGUpe31pZihvbGRfbm9kZT09PW5ld19ub2RlKXtyZXR1cm59dmFyIGlzZGlyPUZTLmlzRGlyKG9sZF9ub2RlLm1vZGUpO3ZhciBlcnI9RlMubWF5RGVsZXRlKG9sZF9kaXIsb2xkX25hbWUsaXNkaXIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1lcnI9bmV3X25vZGU/RlMubWF5RGVsZXRlKG5ld19kaXIsbmV3X25hbWUsaXNkaXIpOkZTLm1heUNyZWF0ZShuZXdfZGlyLG5ld19uYW1lKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIW9sZF9kaXIubm9kZV9vcHMucmVuYW1lKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9aWYoRlMuaXNNb3VudHBvaW50KG9sZF9ub2RlKXx8bmV3X25vZGUmJkZTLmlzTW91bnRwb2ludChuZXdfbm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1pZihuZXdfZGlyIT09b2xkX2Rpcil7ZXJyPUZTLm5vZGVQZXJtaXNzaW9ucyhvbGRfZGlyLCJ3Iik7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfX10cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsid2lsbE1vdmVQYXRoIl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxNb3ZlUGF0aCJdKG9sZF9wYXRoLG5ld19wYXRoKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ3dpbGxNb3ZlUGF0aCddKCciK29sZF9wYXRoKyInLCAnIituZXdfcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9RlMuaGFzaFJlbW92ZU5vZGUob2xkX25vZGUpO3RyeXtvbGRfZGlyLm5vZGVfb3BzLnJlbmFtZShvbGRfbm9kZSxuZXdfZGlyLG5ld19uYW1lKX1jYXRjaChlKXt0aHJvdyBlfWZpbmFsbHl7RlMuaGFzaEFkZE5vZGUob2xkX25vZGUpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbk1vdmVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Nb3ZlUGF0aCJdKG9sZF9wYXRoLG5ld19wYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25Nb3ZlUGF0aCddKCciK29sZF9wYXRoKyInLCAnIituZXdfcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhdGgpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3ZhciBwYXJlbnQ9bG9va3VwLm5vZGU7dmFyIG5hbWU9UEFUSC5iYXNlbmFtZShwYXRoKTt2YXIgbm9kZT1GUy5sb29rdXBOb2RlKHBhcmVudCxuYW1lKTt2YXIgZXJyPUZTLm1heURlbGV0ZShwYXJlbnQsbmFtZSx0cnVlKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoIXBhcmVudC5ub2RlX29wcy5ybWRpcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKXtGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKHBhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMucm1kaXIocGFyZW50LG5hbWUpO0ZTLmRlc3Ryb3lOb2RlKG5vZGUpO3RyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXSlGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXShwYXRoKX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25EZWxldGVQYXRoJ10oJyIrcGF0aCsiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9fSkscmVhZGRpcjooZnVuY3Rpb24ocGF0aCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7aWYoIW5vZGUubm9kZV9vcHMucmVhZGRpcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVERJUil9cmV0dXJuIG5vZGUubm9kZV9vcHMucmVhZGRpcihub2RlKX0pLHVubGluazooZnVuY3Rpb24ocGF0aCl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyIHBhcmVudD1sb29rdXAubm9kZTt2YXIgbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO3ZhciBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO3ZhciBlcnI9RlMubWF5RGVsZXRlKHBhcmVudCxuYW1lLGZhbHNlKTtpZihlcnIpe2lmKGVycj09PUVSUk5PX0NPREVTLkVJU0RJUillcnI9RVJSTk9fQ09ERVMuRVBFUk07dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLnVubGluayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKXtGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKHBhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMudW5saW5rKHBhcmVudCxuYW1lKTtGUy5kZXN0cm95Tm9kZShub2RlKTt0cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0ocGF0aCl9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uRGVsZXRlUGF0aCddKCciK3BhdGgrIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UpfX0pLHJlYWRsaW5rOihmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCk7dmFyIGxpbms9bG9va3VwLm5vZGU7aWYoIWxpbmsubm9kZV9vcHMucmVhZGxpbmspe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuIGxpbmsubm9kZV9vcHMucmVhZGxpbmsobGluayl9KSxzdGF0OihmdW5jdGlvbihwYXRoLGRvbnRGb2xsb3cpe3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRGb2xsb3d9KTt2YXIgbm9kZT1sb29rdXAubm9kZTtpZighbm9kZS5ub2RlX29wcy5nZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9cmV0dXJuIG5vZGUubm9kZV9vcHMuZ2V0YXR0cihub2RlKX0pLGxzdGF0OihmdW5jdGlvbihwYXRoKXtyZXR1cm4gRlMuc3RhdChwYXRoLHRydWUpfSksY2htb2Q6KGZ1bmN0aW9uKHBhdGgsbW9kZSxkb250Rm9sbG93KXt2YXIgbm9kZTtpZih0eXBlb2YgcGF0aD09PSJzdHJpbmciKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse21vZGU6bW9kZSY0MDk1fG5vZGUubW9kZSZ+NDA5NSx0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSksbGNobW9kOihmdW5jdGlvbihwYXRoLG1vZGUpe0ZTLmNobW9kKHBhdGgsbW9kZSx0cnVlKX0pLGZjaG1vZDooZnVuY3Rpb24oZmQsbW9kZSl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1GUy5jaG1vZChzdHJlYW0ubm9kZSxtb2RlKX0pLGNob3duOihmdW5jdGlvbihwYXRoLHVpZCxnaWQsZG9udEZvbGxvdyl7dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzohZG9udEZvbGxvd30pO25vZGU9bG9va3VwLm5vZGV9ZWxzZXtub2RlPXBhdGh9aWYoIW5vZGUubm9kZV9vcHMuc2V0YXR0cil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSksbGNob3duOihmdW5jdGlvbihwYXRoLHVpZCxnaWQpe0ZTLmNob3duKHBhdGgsdWlkLGdpZCx0cnVlKX0pLGZjaG93bjooZnVuY3Rpb24oZmQsdWlkLGdpZCl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1GUy5jaG93bihzdHJlYW0ubm9kZSx1aWQsZ2lkKX0pLHRydW5jYXRlOihmdW5jdGlvbihwYXRoLGxlbil7aWYobGVuPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIG5vZGU7aWYodHlwZW9mIHBhdGg9PT0ic3RyaW5nIil7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTRElSKX1pZighRlMuaXNGaWxlKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIGVycj1GUy5ub2RlUGVybWlzc2lvbnMobm9kZSwidyIpO2lmKGVycil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyKX1ub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSx7c2l6ZTpsZW4sdGltZXN0YW1wOkRhdGUubm93KCl9KX0pLGZ0cnVuY2F0ZTooZnVuY3Rpb24oZmQsbGVuKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfUZTLnRydW5jYXRlKHN0cmVhbS5ub2RlLGxlbil9KSx1dGltZTooZnVuY3Rpb24ocGF0aCxhdGltZSxtdGltZSl7dmFyIGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7dmFyIG5vZGU9bG9va3VwLm5vZGU7bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse3RpbWVzdGFtcDpNYXRoLm1heChhdGltZSxtdGltZSl9KX0pLG9wZW46KGZ1bmN0aW9uKHBhdGgsZmxhZ3MsbW9kZSxmZF9zdGFydCxmZF9lbmQpe2ZsYWdzPXR5cGVvZiBmbGFncz09PSJzdHJpbmciP0ZTLm1vZGVTdHJpbmdUb0ZsYWdzKGZsYWdzKTpmbGFnczttb2RlPXR5cGVvZiBtb2RlPT09InVuZGVmaW5lZCI/NDM4Om1vZGU7aWYoZmxhZ3MmNjQpe21vZGU9bW9kZSY0MDk1fDMyNzY4fWVsc2V7bW9kZT0wfXZhciBub2RlO2lmKHR5cGVvZiBwYXRoPT09Im9iamVjdCIpe25vZGU9cGF0aH1lbHNle3BhdGg9UEFUSC5ub3JtYWxpemUocGF0aCk7dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IShmbGFncyYxMzEwNzIpfSk7bm9kZT1sb29rdXAubm9kZX1jYXRjaChlKXt9fWlmKGZsYWdzJjY0KXtpZihub2RlKXtpZihmbGFncyYxMjgpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVFWElTVCl9fWVsc2V7bm9kZT1GUy5ta25vZChwYXRoLG1vZGUsMCl9fWlmKCFub2RlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfWlmKEZTLmlzQ2hyZGV2KG5vZGUubW9kZSkpe2ZsYWdzJj1+NTEyfXZhciBlcnI9RlMubWF5T3Blbihub2RlLGZsYWdzKTtpZihlcnIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycil9aWYoZmxhZ3MmNTEyKXtGUy50cnVuY2F0ZShub2RlLDApfWZsYWdzJj1+KDEyOHw1MTIpO3ZhciBzdHJlYW09RlMuY3JlYXRlU3RyZWFtKHtub2RlOm5vZGUscGF0aDpGUy5nZXRQYXRoKG5vZGUpLGZsYWdzOmZsYWdzLHNlZWthYmxlOnRydWUscG9zaXRpb246MCxzdHJlYW1fb3BzOm5vZGUuc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjpmYWxzZX0sZmRfc3RhcnQsZmRfZW5kKTtpZihzdHJlYW0uc3RyZWFtX29wcy5vcGVuKXtzdHJlYW0uc3RyZWFtX29wcy5vcGVuKHN0cmVhbSl9aWYoTW9kdWxlWyJsb2dSZWFkRmlsZXMiXSYmIShmbGFncyYxKSl7aWYoIUZTLnJlYWRGaWxlcylGUy5yZWFkRmlsZXM9e307aWYoIShwYXRoIGluIEZTLnJlYWRGaWxlcykpe0ZTLnJlYWRGaWxlc1twYXRoXT0xO01vZHVsZVsicHJpbnRFcnIiXSgicmVhZCBmaWxlOiAiK3BhdGgpfX10cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25PcGVuRmlsZSJdKXt2YXIgdHJhY2tpbmdGbGFncz0wO2lmKChmbGFncyYyMDk3MTU1KSE9PTEpe3RyYWNraW5nRmxhZ3N8PUZTLnRyYWNraW5nLm9wZW5GbGFncy5SRUFEfWlmKChmbGFncyYyMDk3MTU1KSE9PTApe3RyYWNraW5nRmxhZ3N8PUZTLnRyYWNraW5nLm9wZW5GbGFncy5XUklURX1GUy50cmFja2luZ0RlbGVnYXRlWyJvbk9wZW5GaWxlIl0ocGF0aCx0cmFja2luZ0ZsYWdzKX19Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uT3BlbkZpbGUnXSgnIitwYXRoKyInLCBmbGFncykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiK2UubWVzc2FnZSl9cmV0dXJuIHN0cmVhbX0pLGNsb3NlOihmdW5jdGlvbihzdHJlYW0pe3RyeXtpZihzdHJlYW0uc3RyZWFtX29wcy5jbG9zZSl7c3RyZWFtLnN0cmVhbV9vcHMuY2xvc2Uoc3RyZWFtKX19Y2F0Y2goZSl7dGhyb3cgZX1maW5hbGx5e0ZTLmNsb3NlU3RyZWFtKHN0cmVhbS5mZCl9fSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7aWYoIXN0cmVhbS5zZWVrYWJsZXx8IXN0cmVhbS5zdHJlYW1fb3BzLmxsc2Vlayl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX1yZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMubGxzZWVrKHN0cmVhbSxvZmZzZXQsd2hlbmNlKX0pLHJlYWQ6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbil7aWYobGVuZ3RoPDB8fHBvc2l0aW9uPDApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTEpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTRElSKX1pZighc3RyZWFtLnN0cmVhbV9vcHMucmVhZCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgc2Vla2luZz10cnVlO2lmKHR5cGVvZiBwb3NpdGlvbj09PSJ1bmRlZmluZWQiKXtwb3NpdGlvbj1zdHJlYW0ucG9zaXRpb247c2Vla2luZz1mYWxzZX1lbHNlIGlmKCFzdHJlYW0uc2Vla2FibGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9dmFyIGJ5dGVzUmVhZD1zdHJlYW0uc3RyZWFtX29wcy5yZWFkKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbik7aWYoIXNlZWtpbmcpc3RyZWFtLnBvc2l0aW9uKz1ieXRlc1JlYWQ7cmV0dXJuIGJ5dGVzUmVhZH0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24sY2FuT3duKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1pZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSVNESVIpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy53cml0ZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgc2Vla2luZz10cnVlO2lmKHR5cGVvZiBwb3NpdGlvbj09PSJ1bmRlZmluZWQiKXtwb3NpdGlvbj1zdHJlYW0ucG9zaXRpb247c2Vla2luZz1mYWxzZX1lbHNlIGlmKCFzdHJlYW0uc2Vla2FibGUpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9aWYoc3RyZWFtLmZsYWdzJjEwMjQpe0ZTLmxsc2VlayhzdHJlYW0sMCwyKX12YXIgYnl0ZXNXcml0dGVuPXN0cmVhbS5zdHJlYW1fb3BzLndyaXRlKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixjYW5Pd24pO2lmKCFzZWVraW5nKXN0cmVhbS5wb3NpdGlvbis9Ynl0ZXNXcml0dGVuO3RyeXtpZihzdHJlYW0ucGF0aCYmRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Xcml0ZVRvRmlsZSJdKUZTLnRyYWNraW5nRGVsZWdhdGVbIm9uV3JpdGVUb0ZpbGUiXShzdHJlYW0ucGF0aCl9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ29uV3JpdGVUb0ZpbGUnXSgnIitwYXRoKyInKSB0aHJldyBhbiBleGNlcHRpb246ICIrZS5tZXNzYWdlKX1yZXR1cm4gYnl0ZXNXcml0dGVufSksYWxsb2NhdGU6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKXtpZihvZmZzZXQ8MHx8bGVuZ3RoPD0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQkFERil9aWYoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSYmIUZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9aWYoIXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FT1BOT1RTVVBQKX1zdHJlYW0uc3RyZWFtX29wcy5hbGxvY2F0ZShzdHJlYW0sb2Zmc2V0LGxlbmd0aCl9KSxtbWFwOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24scHJvdCxmbGFncyl7aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTEpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVBQ0NFUyl9aWYoIXN0cmVhbS5zdHJlYW1fb3BzLm1tYXApe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0RFVil9cmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLm1tYXAoc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLHByb3QsZmxhZ3MpfSksaW9jdGw6KGZ1bmN0aW9uKHN0cmVhbSxjbWQsYXJnKXtpZighc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RUWSl9cmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLmlvY3RsKHN0cmVhbSxjbWQsYXJnKX0pLHJlYWRGaWxlOihmdW5jdGlvbihwYXRoLG9wdHMpe29wdHM9b3B0c3x8e307b3B0cy5mbGFncz1vcHRzLmZsYWdzfHwiciI7b3B0cy5lbmNvZGluZz1vcHRzLmVuY29kaW5nfHwiYmluYXJ5IjtpZihvcHRzLmVuY29kaW5nIT09InV0ZjgiJiZvcHRzLmVuY29kaW5nIT09ImJpbmFyeSIpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmNvZGluZyB0eXBlICInK29wdHMuZW5jb2RpbmcrJyInKX12YXIgcmV0O3ZhciBzdHJlYW09RlMub3BlbihwYXRoLG9wdHMuZmxhZ3MpO3ZhciBzdGF0PUZTLnN0YXQocGF0aCk7dmFyIGxlbmd0aD1zdGF0LnNpemU7dmFyIGJ1Zj1uZXcgVWludDhBcnJheShsZW5ndGgpO0ZTLnJlYWQoc3RyZWFtLGJ1ZiwwLGxlbmd0aCwwKTtpZihvcHRzLmVuY29kaW5nPT09InV0ZjgiKXtyZXQ9IiI7dmFyIHV0Zjg9bmV3IFJ1bnRpbWUuVVRGOFByb2Nlc3Nvcjtmb3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe3JldCs9dXRmOC5wcm9jZXNzQ0NoYXIoYnVmW2ldKX19ZWxzZSBpZihvcHRzLmVuY29kaW5nPT09ImJpbmFyeSIpe3JldD1idWZ9RlMuY2xvc2Uoc3RyZWFtKTtyZXR1cm4gcmV0fSksd3JpdGVGaWxlOihmdW5jdGlvbihwYXRoLGRhdGEsb3B0cyl7b3B0cz1vcHRzfHx7fTtvcHRzLmZsYWdzPW9wdHMuZmxhZ3N8fCJ3IjtvcHRzLmVuY29kaW5nPW9wdHMuZW5jb2Rpbmd8fCJ1dGY4IjtpZihvcHRzLmVuY29kaW5nIT09InV0ZjgiJiZvcHRzLmVuY29kaW5nIT09ImJpbmFyeSIpe3Rocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmNvZGluZyB0eXBlICInK29wdHMuZW5jb2RpbmcrJyInKX12YXIgc3RyZWFtPUZTLm9wZW4ocGF0aCxvcHRzLmZsYWdzLG9wdHMubW9kZSk7aWYob3B0cy5lbmNvZGluZz09PSJ1dGY4Iil7dmFyIHV0Zjg9bmV3IFJ1bnRpbWUuVVRGOFByb2Nlc3Nvcjt2YXIgYnVmPW5ldyBVaW50OEFycmF5KHV0ZjgucHJvY2Vzc0pTU3RyaW5nKGRhdGEpKTtGUy53cml0ZShzdHJlYW0sYnVmLDAsYnVmLmxlbmd0aCwwLG9wdHMuY2FuT3duKX1lbHNlIGlmKG9wdHMuZW5jb2Rpbmc9PT0iYmluYXJ5Iil7RlMud3JpdGUoc3RyZWFtLGRhdGEsMCxkYXRhLmxlbmd0aCwwLG9wdHMuY2FuT3duKX1GUy5jbG9zZShzdHJlYW0pfSksY3dkOihmdW5jdGlvbigpe3JldHVybiBGUy5jdXJyZW50UGF0aH0pLGNoZGlyOihmdW5jdGlvbihwYXRoKXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTtpZighRlMuaXNEaXIobG9va3VwLm5vZGUubW9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfXZhciBlcnI9RlMubm9kZVBlcm1pc3Npb25zKGxvb2t1cC5ub2RlLCJ4Iik7aWYoZXJyKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpfUZTLmN1cnJlbnRQYXRoPWxvb2t1cC5wYXRofSksY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzOihmdW5jdGlvbigpe0ZTLm1rZGlyKCIvdG1wIil9KSxjcmVhdGVEZWZhdWx0RGV2aWNlczooZnVuY3Rpb24oKXtGUy5ta2RpcigiL2RldiIpO0ZTLnJlZ2lzdGVyRGV2aWNlKEZTLm1ha2VkZXYoMSwzKSx7cmVhZDooZnVuY3Rpb24oKXtyZXR1cm4gMH0pLHdyaXRlOihmdW5jdGlvbigpe3JldHVybiAwfSl9KTtGUy5ta2RldigiL2Rldi9udWxsIixGUy5tYWtlZGV2KDEsMykpO1RUWS5yZWdpc3RlcihGUy5tYWtlZGV2KDUsMCksVFRZLmRlZmF1bHRfdHR5X29wcyk7VFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNiwwKSxUVFkuZGVmYXVsdF90dHkxX29wcyk7RlMubWtkZXYoIi9kZXYvdHR5IixGUy5tYWtlZGV2KDUsMCkpO0ZTLm1rZGV2KCIvZGV2L3R0eTEiLEZTLm1ha2VkZXYoNiwwKSk7RlMubWtkaXIoIi9kZXYvc2htIik7RlMubWtkaXIoIi9kZXYvc2htL3RtcCIpfSksY3JlYXRlU3RhbmRhcmRTdHJlYW1zOihmdW5jdGlvbigpe2lmKE1vZHVsZVsic3RkaW4iXSl7RlMuY3JlYXRlRGV2aWNlKCIvZGV2Iiwic3RkaW4iLE1vZHVsZVsic3RkaW4iXSl9ZWxzZXtGUy5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKX1pZihNb2R1bGVbInN0ZG91dCJdKXtGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRvdXQiLG51bGwsTW9kdWxlWyJzdGRvdXQiXSl9ZWxzZXtGUy5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0Iil9aWYoTW9kdWxlWyJzdGRlcnIiXSl7RlMuY3JlYXRlRGV2aWNlKCIvZGV2Iiwic3RkZXJyIixudWxsLE1vZHVsZVsic3RkZXJyIl0pfWVsc2V7RlMuc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKX12YXIgc3RkaW49RlMub3BlbigiL2Rldi9zdGRpbiIsInIiKTtIRUFQMzJbX3N0ZGluPj4yXT1GUy5nZXRQdHJGb3JTdHJlYW0oc3RkaW4pO2Fzc2VydChzdGRpbi5mZD09PTAsImludmFsaWQgaGFuZGxlIGZvciBzdGRpbiAoIitzdGRpbi5mZCsiKSIpO3ZhciBzdGRvdXQ9RlMub3BlbigiL2Rldi9zdGRvdXQiLCJ3Iik7SEVBUDMyW19zdGRvdXQ+PjJdPUZTLmdldFB0ckZvclN0cmVhbShzdGRvdXQpO2Fzc2VydChzdGRvdXQuZmQ9PT0xLCJpbnZhbGlkIGhhbmRsZSBmb3Igc3Rkb3V0ICgiK3N0ZG91dC5mZCsiKSIpO3ZhciBzdGRlcnI9RlMub3BlbigiL2Rldi9zdGRlcnIiLCJ3Iik7SEVBUDMyW19zdGRlcnI+PjJdPUZTLmdldFB0ckZvclN0cmVhbShzdGRlcnIpO2Fzc2VydChzdGRlcnIuZmQ9PT0yLCJpbnZhbGlkIGhhbmRsZSBmb3Igc3RkZXJyICgiK3N0ZGVyci5mZCsiKSIpfSksZW5zdXJlRXJybm9FcnJvcjooZnVuY3Rpb24oKXtpZihGUy5FcnJub0Vycm9yKXJldHVybjtGUy5FcnJub0Vycm9yPWZ1bmN0aW9uIEVycm5vRXJyb3IoZXJybm8pe3RoaXMuZXJybm89ZXJybm87Zm9yKHZhciBrZXkgaW4gRVJSTk9fQ09ERVMpe2lmKEVSUk5PX0NPREVTW2tleV09PT1lcnJubyl7dGhpcy5jb2RlPWtleTticmVha319dGhpcy5tZXNzYWdlPUVSUk5PX01FU1NBR0VTW2Vycm5vXX07RlMuRXJybm9FcnJvci5wcm90b3R5cGU9bmV3IEVycm9yO0ZTLkVycm5vRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZTLkVycm5vRXJyb3I7W0VSUk5PX0NPREVTLkVOT0VOVF0uZm9yRWFjaCgoZnVuY3Rpb24oY29kZSl7RlMuZ2VuZXJpY0Vycm9yc1tjb2RlXT1uZXcgRlMuRXJybm9FcnJvcihjb2RlKTtGUy5nZW5lcmljRXJyb3JzW2NvZGVdLnN0YWNrPSI8Z2VuZXJpYyBlcnJvciwgbm8gc3RhY2s+In0pKX0pLHN0YXRpY0luaXQ6KGZ1bmN0aW9uKCl7RlMuZW5zdXJlRXJybm9FcnJvcigpO0ZTLm5hbWVUYWJsZT1uZXcgQXJyYXkoNDA5Nik7RlMubW91bnQoTUVNRlMse30sIi8iKTtGUy5jcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKTtGUy5jcmVhdGVEZWZhdWx0RGV2aWNlcygpfSksaW5pdDooZnVuY3Rpb24oaW5wdXQsb3V0cHV0LGVycm9yKXthc3NlcnQoIUZTLmluaXQuaW5pdGlhbGl6ZWQsIkZTLmluaXQgd2FzIHByZXZpb3VzbHkgY2FsbGVkLiBJZiB5b3Ugd2FudCB0byBpbml0aWFsaXplIGxhdGVyIHdpdGggY3VzdG9tIHBhcmFtZXRlcnMsIHJlbW92ZSBhbnkgZWFybGllciBjYWxscyAobm90ZSB0aGF0IG9uZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgY29kZSkiKTtGUy5pbml0LmluaXRpYWxpemVkPXRydWU7RlMuZW5zdXJlRXJybm9FcnJvcigpO01vZHVsZVsic3RkaW4iXT1pbnB1dHx8TW9kdWxlWyJzdGRpbiJdO01vZHVsZVsic3Rkb3V0Il09b3V0cHV0fHxNb2R1bGVbInN0ZG91dCJdO01vZHVsZVsic3RkZXJyIl09ZXJyb3J8fE1vZHVsZVsic3RkZXJyIl07RlMuY3JlYXRlU3RhbmRhcmRTdHJlYW1zKCl9KSxxdWl0OihmdW5jdGlvbigpe0ZTLmluaXQuaW5pdGlhbGl6ZWQ9ZmFsc2U7Zm9yKHZhciBpPTA7aTxGUy5zdHJlYW1zLmxlbmd0aDtpKyspe3ZhciBzdHJlYW09RlMuc3RyZWFtc1tpXTtpZighc3RyZWFtKXtjb250aW51ZX1GUy5jbG9zZShzdHJlYW0pfX0pLGdldE1vZGU6KGZ1bmN0aW9uKGNhblJlYWQsY2FuV3JpdGUpe3ZhciBtb2RlPTA7aWYoY2FuUmVhZCltb2RlfD0yOTJ8NzM7aWYoY2FuV3JpdGUpbW9kZXw9MTQ2O3JldHVybiBtb2RlfSksam9pblBhdGg6KGZ1bmN0aW9uKHBhcnRzLGZvcmNlUmVsYXRpdmUpe3ZhciBwYXRoPVBBVEguam9pbi5hcHBseShudWxsLHBhcnRzKTtpZihmb3JjZVJlbGF0aXZlJiZwYXRoWzBdPT0iLyIpcGF0aD1wYXRoLnN1YnN0cigxKTtyZXR1cm4gcGF0aH0pLGFic29sdXRlUGF0aDooZnVuY3Rpb24ocmVsYXRpdmUsYmFzZSl7cmV0dXJuIFBBVEgucmVzb2x2ZShiYXNlLHJlbGF0aXZlKX0pLHN0YW5kYXJkaXplUGF0aDooZnVuY3Rpb24ocGF0aCl7cmV0dXJuIFBBVEgubm9ybWFsaXplKHBhdGgpfSksZmluZE9iamVjdDooZnVuY3Rpb24ocGF0aCxkb250UmVzb2x2ZUxhc3RMaW5rKXt2YXIgcmV0PUZTLmFuYWx5emVQYXRoKHBhdGgsZG9udFJlc29sdmVMYXN0TGluayk7aWYocmV0LmV4aXN0cyl7cmV0dXJuIHJldC5vYmplY3R9ZWxzZXtfX19zZXRFcnJObyhyZXQuZXJyb3IpO3JldHVybiBudWxsfX0pLGFuYWx5emVQYXRoOihmdW5jdGlvbihwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspe3RyeXt2YXIgbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cGF0aD1sb29rdXAucGF0aH1jYXRjaChlKXt9dmFyIHJldD17aXNSb290OmZhbHNlLGV4aXN0czpmYWxzZSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOmZhbHNlLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3JldC5wYXJlbnRFeGlzdHM9dHJ1ZTtyZXQucGFyZW50UGF0aD1sb29rdXAucGF0aDtyZXQucGFyZW50T2JqZWN0PWxvb2t1cC5ub2RlO3JldC5uYW1lPVBBVEguYmFzZW5hbWUocGF0aCk7bG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cmV0LmV4aXN0cz10cnVlO3JldC5wYXRoPWxvb2t1cC5wYXRoO3JldC5vYmplY3Q9bG9va3VwLm5vZGU7cmV0Lm5hbWU9bG9va3VwLm5vZGUubmFtZTtyZXQuaXNSb290PWxvb2t1cC5wYXRoPT09Ii8ifWNhdGNoKGUpe3JldC5lcnJvcj1lLmVycm5vfXJldHVybiByZXR9KSxjcmVhdGVGb2xkZXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGNhblJlYWQsY2FuV3JpdGUpe3ZhciBwYXRoPVBBVEguam9pbjIodHlwZW9mIHBhcmVudD09PSJzdHJpbmciP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMubWtkaXIocGF0aCxtb2RlKX0pLGNyZWF0ZVBhdGg6KGZ1bmN0aW9uKHBhcmVudCxwYXRoLGNhblJlYWQsY2FuV3JpdGUpe3BhcmVudD10eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KTt2YXIgcGFydHM9cGF0aC5zcGxpdCgiLyIpLnJldmVyc2UoKTt3aGlsZShwYXJ0cy5sZW5ndGgpe3ZhciBwYXJ0PXBhcnRzLnBvcCgpO2lmKCFwYXJ0KWNvbnRpbnVlO3ZhciBjdXJyZW50PVBBVEguam9pbjIocGFyZW50LHBhcnQpO3RyeXtGUy5ta2RpcihjdXJyZW50KX1jYXRjaChlKXt9cGFyZW50PWN1cnJlbnR9cmV0dXJuIGN1cnJlbnR9KSxjcmVhdGVGaWxlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxwcm9wZXJ0aWVzLGNhblJlYWQsY2FuV3JpdGUpe3ZhciBwYXRoPVBBVEguam9pbjIodHlwZW9mIHBhcmVudD09PSJzdHJpbmciP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyIG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm4gRlMuY3JlYXRlKHBhdGgsbW9kZSl9KSxjcmVhdGVEYXRhRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsZGF0YSxjYW5SZWFkLGNhbldyaXRlLGNhbk93bil7dmFyIHBhdGg9bmFtZT9QQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQ9PT0ic3RyaW5nIj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpLG5hbWUpOnBhcmVudDt2YXIgbW9kZT1GUy5nZXRNb2RlKGNhblJlYWQsY2FuV3JpdGUpO3ZhciBub2RlPUZTLmNyZWF0ZShwYXRoLG1vZGUpO2lmKGRhdGEpe2lmKHR5cGVvZiBkYXRhPT09InN0cmluZyIpe3ZhciBhcnI9bmV3IEFycmF5KGRhdGEubGVuZ3RoKTtmb3IodmFyIGk9MCxsZW49ZGF0YS5sZW5ndGg7aTxsZW47KytpKWFycltpXT1kYXRhLmNoYXJDb2RlQXQoaSk7ZGF0YT1hcnJ9RlMuY2htb2Qobm9kZSxtb2RlfDE0Nik7dmFyIHN0cmVhbT1GUy5vcGVuKG5vZGUsInciKTtGUy53cml0ZShzdHJlYW0sZGF0YSwwLGRhdGEubGVuZ3RoLDAsY2FuT3duKTtGUy5jbG9zZShzdHJlYW0pO0ZTLmNobW9kKG5vZGUsbW9kZSl9cmV0dXJuIG5vZGV9KSxjcmVhdGVEZXZpY2U6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGlucHV0LG91dHB1dCl7dmFyIHBhdGg9UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTt2YXIgbW9kZT1GUy5nZXRNb2RlKCEhaW5wdXQsISFvdXRwdXQpO2lmKCFGUy5jcmVhdGVEZXZpY2UubWFqb3IpRlMuY3JlYXRlRGV2aWNlLm1ham9yPTY0O3ZhciBkZXY9RlMubWFrZWRldihGUy5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtGUy5yZWdpc3RlckRldmljZShkZXYse29wZW46KGZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnNlZWthYmxlPWZhbHNlfSksY2xvc2U6KGZ1bmN0aW9uKHN0cmVhbSl7aWYob3V0cHV0JiZvdXRwdXQuYnVmZmVyJiZvdXRwdXQuYnVmZmVyLmxlbmd0aCl7b3V0cHV0KDEwKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXt2YXIgYnl0ZXNSZWFkPTA7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXt2YXIgcmVzdWx0O3RyeXtyZXN1bHQ9aW5wdXQoKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfWlmKHJlc3VsdD09PXVuZGVmaW5lZCYmYnl0ZXNSZWFkPT09MCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm4gYnl0ZXNSZWFkfSksd3JpdGU6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3Mpe2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dHJ5e291dHB1dChidWZmZXJbb2Zmc2V0K2ldKX1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfX1pZihsZW5ndGgpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVybiBpfSl9KTtyZXR1cm4gRlMubWtkZXYocGF0aCxtb2RlLGRldil9KSxjcmVhdGVMaW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSx0YXJnZXQsY2FuUmVhZCxjYW5Xcml0ZSl7dmFyIHBhdGg9UEFUSC5qb2luMih0eXBlb2YgcGFyZW50PT09InN0cmluZyI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTtyZXR1cm4gRlMuc3ltbGluayh0YXJnZXQscGF0aCl9KSxmb3JjZUxvYWRGaWxlOihmdW5jdGlvbihvYmope2lmKG9iai5pc0RldmljZXx8b2JqLmlzRm9sZGVyfHxvYmoubGlua3x8b2JqLmNvbnRlbnRzKXJldHVybiB0cnVlO3ZhciBzdWNjZXNzPXRydWU7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT09InVuZGVmaW5lZCIpe3Rocm93IG5ldyBFcnJvcigiTGF6eSBsb2FkaW5nIHNob3VsZCBoYXZlIGJlZW4gcGVyZm9ybWVkIChjb250ZW50cyBzZXQpIGluIGNyZWF0ZUxhenlGaWxlLCBidXQgaXQgd2FzIG5vdC4gTGF6eSBsb2FkaW5nIG9ubHkgd29ya3MgaW4gd2ViIHdvcmtlcnMuIFVzZSAtLWVtYmVkLWZpbGUgb3IgLS1wcmVsb2FkLWZpbGUgaW4gZW1jYyBvbiB0aGUgbWFpbiB0aHJlYWQuIil9ZWxzZSBpZihNb2R1bGVbInJlYWQiXSl7dHJ5e29iai5jb250ZW50cz1pbnRBcnJheUZyb21TdHJpbmcoTW9kdWxlWyJyZWFkIl0ob2JqLnVybCksdHJ1ZSl9Y2F0Y2goZSl7c3VjY2Vzcz1mYWxzZX19ZWxzZXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfWlmKCFzdWNjZXNzKV9fX3NldEVyck5vKEVSUk5PX0NPREVTLkVJTyk7cmV0dXJuIHN1Y2Nlc3N9KSxjcmVhdGVMYXp5RmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsdXJsLGNhblJlYWQsY2FuV3JpdGUpe2Z1bmN0aW9uIExhenlVaW50OEFycmF5KCl7dGhpcy5sZW5ndGhLbm93bj1mYWxzZTt0aGlzLmNodW5rcz1bXX1MYXp5VWludDhBcnJheS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIExhenlVaW50OEFycmF5X2dldChpZHgpe2lmKGlkeD50aGlzLmxlbmd0aC0xfHxpZHg8MCl7cmV0dXJuIHVuZGVmaW5lZH12YXIgY2h1bmtPZmZzZXQ9aWR4JXRoaXMuY2h1bmtTaXplO3ZhciBjaHVua051bT1NYXRoLmZsb29yKGlkeC90aGlzLmNodW5rU2l6ZSk7cmV0dXJuIHRoaXMuZ2V0dGVyKGNodW5rTnVtKVtjaHVua09mZnNldF19O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5zZXREYXRhR2V0dGVyPWZ1bmN0aW9uIExhenlVaW50OEFycmF5X3NldERhdGFHZXR0ZXIoZ2V0dGVyKXt0aGlzLmdldHRlcj1nZXR0ZXJ9O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5jYWNoZUxlbmd0aD1mdW5jdGlvbiBMYXp5VWludDhBcnJheV9jYWNoZUxlbmd0aCgpe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJIRUFEIix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIrdXJsKyIuIFN0YXR1czogIit4aHIuc3RhdHVzKTt2YXIgZGF0YWxlbmd0aD1OdW1iZXIoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LWxlbmd0aCIpKTt2YXIgaGVhZGVyO3ZhciBoYXNCeXRlU2VydmluZz0oaGVhZGVyPXhoci5nZXRSZXNwb25zZUhlYWRlcigiQWNjZXB0LVJhbmdlcyIpKSYmaGVhZGVyPT09ImJ5dGVzIjt2YXIgY2h1bmtTaXplPTEwMjQqMTAyNDtpZighaGFzQnl0ZVNlcnZpbmcpY2h1bmtTaXplPWRhdGFsZW5ndGg7dmFyIGRvWEhSPShmdW5jdGlvbihmcm9tLHRvKXtpZihmcm9tPnRvKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCByYW5nZSAoIitmcm9tKyIsICIrdG8rIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKHRvPmRhdGFsZW5ndGgtMSl0aHJvdyBuZXcgRXJyb3IoIm9ubHkgIitkYXRhbGVuZ3RoKyIgYnl0ZXMgYXZhaWxhYmxlISBwcm9ncmFtbWVyIGVycm9yISIpO3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCxmYWxzZSk7aWYoZGF0YWxlbmd0aCE9PWNodW5rU2l6ZSl4aHIuc2V0UmVxdWVzdEhlYWRlcigiUmFuZ2UiLCJieXRlcz0iK2Zyb20rIi0iK3RvKTtpZih0eXBlb2YgVWludDhBcnJheSE9InVuZGVmaW5lZCIpeGhyLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiO2lmKHhoci5vdmVycmlkZU1pbWVUeXBlKXt4aHIub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpfXhoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIrdXJsKyIuIFN0YXR1czogIit4aHIuc3RhdHVzKTtpZih4aHIucmVzcG9uc2UhPT11bmRlZmluZWQpe3JldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2V8fFtdKX1lbHNle3JldHVybiBpbnRBcnJheUZyb21TdHJpbmcoeGhyLnJlc3BvbnNlVGV4dHx8IiIsdHJ1ZSl9fSk7dmFyIGxhenlBcnJheT10aGlzO2xhenlBcnJheS5zZXREYXRhR2V0dGVyKChmdW5jdGlvbihjaHVua051bSl7dmFyIHN0YXJ0PWNodW5rTnVtKmNodW5rU2l6ZTt2YXIgZW5kPShjaHVua051bSsxKSpjaHVua1NpemUtMTtlbmQ9TWF0aC5taW4oZW5kLGRhdGFsZW5ndGgtMSk7aWYodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09InVuZGVmaW5lZCIpe2xhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPWRvWEhSKHN0YXJ0LGVuZCl9aWYodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09InVuZGVmaW5lZCIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dfSkpO3RoaXMuX2xlbmd0aD1kYXRhbGVuZ3RoO3RoaXMuX2NodW5rU2l6ZT1jaHVua1NpemU7dGhpcy5sZW5ndGhLbm93bj10cnVlfTtpZih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPT0idW5kZWZpbmVkIil7aWYoIUVOVklST05NRU5UX0lTX1dPUktFUil0aHJvdyJDYW5ub3QgZG8gc3luY2hyb25vdXMgYmluYXJ5IFhIUnMgb3V0c2lkZSB3ZWJ3b3JrZXJzIGluIG1vZGVybiBicm93c2Vycy4gVXNlIC0tZW1iZWQtZmlsZSBvciAtLXByZWxvYWQtZmlsZSBpbiBlbWNjIjt2YXIgbGF6eUFycmF5PW5ldyBMYXp5VWludDhBcnJheTtPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eUFycmF5LCJsZW5ndGgiLHtnZXQ6KGZ1bmN0aW9uKCl7aWYoIXRoaXMubGVuZ3RoS25vd24pe3RoaXMuY2FjaGVMZW5ndGgoKX1yZXR1cm4gdGhpcy5fbGVuZ3RofSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eUFycmF5LCJjaHVua1NpemUiLHtnZXQ6KGZ1bmN0aW9uKCl7aWYoIXRoaXMubGVuZ3RoS25vd24pe3RoaXMuY2FjaGVMZW5ndGgoKX1yZXR1cm4gdGhpcy5fY2h1bmtTaXplfSl9KTt2YXIgcHJvcGVydGllcz17aXNEZXZpY2U6ZmFsc2UsY29udGVudHM6bGF6eUFycmF5fX1lbHNle3ZhciBwcm9wZXJ0aWVzPXtpc0RldmljZTpmYWxzZSx1cmw6dXJsfX12YXIgbm9kZT1GUy5jcmVhdGVGaWxlKHBhcmVudCxuYW1lLHByb3BlcnRpZXMsY2FuUmVhZCxjYW5Xcml0ZSk7aWYocHJvcGVydGllcy5jb250ZW50cyl7bm9kZS5jb250ZW50cz1wcm9wZXJ0aWVzLmNvbnRlbnRzfWVsc2UgaWYocHJvcGVydGllcy51cmwpe25vZGUuY29udGVudHM9bnVsbDtub2RlLnVybD1wcm9wZXJ0aWVzLnVybH12YXIgc3RyZWFtX29wcz17fTt2YXIga2V5cz1PYmplY3Qua2V5cyhub2RlLnN0cmVhbV9vcHMpO2tleXMuZm9yRWFjaCgoZnVuY3Rpb24oa2V5KXt2YXIgZm49bm9kZS5zdHJlYW1fb3BzW2tleV07c3RyZWFtX29wc1trZXldPWZ1bmN0aW9uIGZvcmNlTG9hZExhenlGaWxlKCl7aWYoIUZTLmZvcmNlTG9hZEZpbGUobm9kZSkpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9cmV0dXJuIGZuLmFwcGx5KG51bGwsYXJndW1lbnRzKX19KSk7c3RyZWFtX29wcy5yZWFkPWZ1bmN0aW9uIHN0cmVhbV9vcHNfcmVhZChzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe2lmKCFGUy5mb3JjZUxvYWRGaWxlKG5vZGUpKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfXZhciBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50cztpZihwb3NpdGlvbj49Y29udGVudHMubGVuZ3RoKXJldHVybiAwO3ZhciBzaXplPU1hdGgubWluKGNvbnRlbnRzLmxlbmd0aC1wb3NpdGlvbixsZW5ndGgpO2Fzc2VydChzaXplPj0wKTtpZihjb250ZW50cy5zbGljZSl7Zm9yKHZhciBpPTA7aTxzaXplO2krKyl7YnVmZmVyW29mZnNldCtpXT1jb250ZW50c1twb3NpdGlvbitpXX19ZWxzZXtmb3IodmFyIGk9MDtpPHNpemU7aSsrKXtidWZmZXJbb2Zmc2V0K2ldPWNvbnRlbnRzLmdldChwb3NpdGlvbitpKX19cmV0dXJuIHNpemV9O25vZGUuc3RyZWFtX29wcz1zdHJlYW1fb3BzO3JldHVybiBub2RlfSksY3JlYXRlUHJlbG9hZGVkRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsdXJsLGNhblJlYWQsY2FuV3JpdGUsb25sb2FkLG9uZXJyb3IsZG9udENyZWF0ZUZpbGUsY2FuT3duKXtCcm93c2VyLmluaXQoKTt2YXIgZnVsbG5hbWU9bmFtZT9QQVRILnJlc29sdmUoUEFUSC5qb2luMihwYXJlbnQsbmFtZSkpOnBhcmVudDtmdW5jdGlvbiBwcm9jZXNzRGF0YShieXRlQXJyYXkpe2Z1bmN0aW9uIGZpbmlzaChieXRlQXJyYXkpe2lmKCFkb250Q3JlYXRlRmlsZSl7RlMuY3JlYXRlRGF0YUZpbGUocGFyZW50LG5hbWUsYnl0ZUFycmF5LGNhblJlYWQsY2FuV3JpdGUsY2FuT3duKX1pZihvbmxvYWQpb25sb2FkKCk7cmVtb3ZlUnVuRGVwZW5kZW5jeSgiY3AgIitmdWxsbmFtZSl9dmFyIGhhbmRsZWQ9ZmFsc2U7TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLmZvckVhY2goKGZ1bmN0aW9uKHBsdWdpbil7aWYoaGFuZGxlZClyZXR1cm47aWYocGx1Z2luWyJjYW5IYW5kbGUiXShmdWxsbmFtZSkpe3BsdWdpblsiaGFuZGxlIl0oYnl0ZUFycmF5LGZ1bGxuYW1lLGZpbmlzaCwoZnVuY3Rpb24oKXtpZihvbmVycm9yKW9uZXJyb3IoKTtyZW1vdmVSdW5EZXBlbmRlbmN5KCJjcCAiK2Z1bGxuYW1lKX0pKTtoYW5kbGVkPXRydWV9fSkpO2lmKCFoYW5kbGVkKWZpbmlzaChieXRlQXJyYXkpfWFkZFJ1bkRlcGVuZGVuY3koImNwICIrZnVsbG5hbWUpO2lmKHR5cGVvZiB1cmw9PSJzdHJpbmciKXtCcm93c2VyLmFzeW5jTG9hZCh1cmwsKGZ1bmN0aW9uKGJ5dGVBcnJheSl7cHJvY2Vzc0RhdGEoYnl0ZUFycmF5KX0pLG9uZXJyb3IpfWVsc2V7cHJvY2Vzc0RhdGEodXJsKX19KSxpbmRleGVkREI6KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbmRleGVkREJ8fHdpbmRvdy5tb3pJbmRleGVkREJ8fHdpbmRvdy53ZWJraXRJbmRleGVkREJ8fHdpbmRvdy5tc0luZGV4ZWREQn0pLERCX05BTUU6KGZ1bmN0aW9uKCl7cmV0dXJuIkVNX0ZTXyIrd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSksREJfVkVSU0lPTjoyMCxEQl9TVE9SRV9OQU1FOiJGSUxFX0RBVEEiLHNhdmVGaWxlc1RvREI6KGZ1bmN0aW9uKHBhdGhzLG9ubG9hZCxvbmVycm9yKXtvbmxvYWQ9b25sb2FkfHwoZnVuY3Rpb24oKXt9KTtvbmVycm9yPW9uZXJyb3J8fChmdW5jdGlvbigpe30pO3ZhciBpbmRleGVkREI9RlMuaW5kZXhlZERCKCk7dHJ5e3ZhciBvcGVuUmVxdWVzdD1pbmRleGVkREIub3BlbihGUy5EQl9OQU1FKCksRlMuREJfVkVSU0lPTil9Y2F0Y2goZSl7cmV0dXJuIG9uZXJyb3IoZSl9b3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkPWZ1bmN0aW9uIG9wZW5SZXF1ZXN0X29udXBncmFkZW5lZWRlZCgpe2NvbnNvbGUubG9nKCJjcmVhdGluZyBkYiIpO3ZhciBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7ZGIuY3JlYXRlT2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSl9O29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3ZhciB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbRlMuREJfU1RPUkVfTkFNRV0sInJlYWR3cml0ZSIpO3ZhciBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXIgb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uIGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZSBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7dmFyIHB1dFJlcXVlc3Q9ZmlsZXMucHV0KEZTLmFuYWx5emVQYXRoKHBhdGgpLm9iamVjdC5jb250ZW50cyxwYXRoKTtwdXRSZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBwdXRSZXF1ZXN0X29uc3VjY2Vzcygpe29rKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9O3B1dFJlcXVlc3Qub25lcnJvcj1mdW5jdGlvbiBwdXRSZXF1ZXN0X29uZXJyb3IoKXtmYWlsKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9fSkpO3RyYW5zYWN0aW9uLm9uZXJyb3I9b25lcnJvcn07b3BlblJlcXVlc3Qub25lcnJvcj1vbmVycm9yfSksbG9hZEZpbGVzRnJvbURCOihmdW5jdGlvbihwYXRocyxvbmxvYWQsb25lcnJvcil7b25sb2FkPW9ubG9hZHx8KGZ1bmN0aW9uKCl7fSk7b25lcnJvcj1vbmVycm9yfHwoZnVuY3Rpb24oKXt9KTt2YXIgaW5kZXhlZERCPUZTLmluZGV4ZWREQigpO3RyeXt2YXIgb3BlblJlcXVlc3Q9aW5kZXhlZERCLm9wZW4oRlMuREJfTkFNRSgpLEZTLkRCX1ZFUlNJT04pfWNhdGNoKGUpe3JldHVybiBvbmVycm9yKGUpfW9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZD1vbmVycm9yO29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXIgZGI9b3BlblJlcXVlc3QucmVzdWx0O3RyeXt2YXIgdHJhbnNhY3Rpb249ZGIudHJhbnNhY3Rpb24oW0ZTLkRCX1NUT1JFX05BTUVdLCJyZWFkb25seSIpfWNhdGNoKGUpe29uZXJyb3IoZSk7cmV0dXJufXZhciBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXIgb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uIGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZSBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7dmFyIGdldFJlcXVlc3Q9ZmlsZXMuZ2V0KHBhdGgpO2dldFJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uIGdldFJlcXVlc3Rfb25zdWNjZXNzKCl7aWYoRlMuYW5hbHl6ZVBhdGgocGF0aCkuZXhpc3RzKXtGUy51bmxpbmsocGF0aCl9RlMuY3JlYXRlRGF0YUZpbGUoUEFUSC5kaXJuYW1lKHBhdGgpLFBBVEguYmFzZW5hbWUocGF0aCksZ2V0UmVxdWVzdC5yZXN1bHQsdHJ1ZSx0cnVlLHRydWUpO29rKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9O2dldFJlcXVlc3Qub25lcnJvcj1mdW5jdGlvbiBnZXRSZXF1ZXN0X29uZXJyb3IoKXtmYWlsKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9fSkpO3RyYW5zYWN0aW9uLm9uZXJyb3I9b25lcnJvcn07b3BlblJlcXVlc3Qub25lcnJvcj1vbmVycm9yfSl9O2Z1bmN0aW9uIF9mZmx1c2goc3RyZWFtKXt9TW9kdWxlWyJfc3RybGVuIl09X3N0cmxlbjtmdW5jdGlvbiBfX3JlYWxseU5lZ2F0aXZlKHgpe3JldHVybiB4PDB8fHg9PT0wJiYxL3g9PT0tSW5maW5pdHl9ZnVuY3Rpb24gX19mb3JtYXRTdHJpbmcoZm9ybWF0LHZhcmFyZ3Mpe3ZhciB0ZXh0SW5kZXg9Zm9ybWF0O3ZhciBhcmdJbmRleD0wO2Z1bmN0aW9uIGdldE5leHRBcmcodHlwZSl7dmFyIHJldDtpZih0eXBlPT09ImRvdWJsZSIpe3JldD0oSEVBUDMyW3RlbXBEb3VibGVQdHI+PjJdPUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXSxIRUFQMzJbdGVtcERvdWJsZVB0cis0Pj4yXT1IRUFQMzJbdmFyYXJncysoYXJnSW5kZXgrNCk+PjJdLCtIRUFQRjY0W3RlbXBEb3VibGVQdHI+PjNdKX1lbHNlIGlmKHR5cGU9PSJpNjQiKXtyZXQ9W0hFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXSxIRUFQMzJbdmFyYXJncysoYXJnSW5kZXgrNCk+PjJdXX1lbHNle3R5cGU9ImkzMiI7cmV0PUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXX1hcmdJbmRleCs9UnVudGltZS5nZXROYXRpdmVGaWVsZFNpemUodHlwZSk7cmV0dXJuIHJldH12YXIgcmV0PVtdO3ZhciBjdXJyLG5leHQsY3VyckFyZzt3aGlsZSgxKXt2YXIgc3RhcnRUZXh0SW5kZXg9dGV4dEluZGV4O2N1cnI9SEVBUDhbdGV4dEluZGV4Pj4wXTtpZihjdXJyPT09MClicmVhaztuZXh0PUhFQVA4W3RleHRJbmRleCsxPj4wXTtpZihjdXJyPT0zNyl7dmFyIGZsYWdBbHdheXNTaWduZWQ9ZmFsc2U7dmFyIGZsYWdMZWZ0QWxpZ249ZmFsc2U7dmFyIGZsYWdBbHRlcm5hdGl2ZT1mYWxzZTt2YXIgZmxhZ1plcm9QYWQ9ZmFsc2U7dmFyIGZsYWdQYWRTaWduPWZhbHNlO2ZsYWdzTG9vcDp3aGlsZSgxKXtzd2l0Y2gobmV4dCl7Y2FzZSA0MzpmbGFnQWx3YXlzU2lnbmVkPXRydWU7YnJlYWs7Y2FzZSA0NTpmbGFnTGVmdEFsaWduPXRydWU7YnJlYWs7Y2FzZSAzNTpmbGFnQWx0ZXJuYXRpdmU9dHJ1ZTticmVhaztjYXNlIDQ4OmlmKGZsYWdaZXJvUGFkKXticmVhayBmbGFnc0xvb3B9ZWxzZXtmbGFnWmVyb1BhZD10cnVlO2JyZWFrfTtjYXNlIDMyOmZsYWdQYWRTaWduPXRydWU7YnJlYWs7ZGVmYXVsdDpicmVhayBmbGFnc0xvb3B9dGV4dEluZGV4Kys7bmV4dD1IRUFQOFt0ZXh0SW5kZXgrMT4+MF19dmFyIHdpZHRoPTA7aWYobmV4dD09NDIpe3dpZHRoPWdldE5leHRBcmcoImkzMiIpO3RleHRJbmRleCsrO25leHQ9SEVBUDhbdGV4dEluZGV4KzE+PjBdfWVsc2V7d2hpbGUobmV4dD49NDgmJm5leHQ8PTU3KXt3aWR0aD13aWR0aCoxMCsobmV4dC00OCk7dGV4dEluZGV4Kys7bmV4dD1IRUFQOFt0ZXh0SW5kZXgrMT4+MF19fXZhciBwcmVjaXNpb25TZXQ9ZmFsc2UscHJlY2lzaW9uPS0xO2lmKG5leHQ9PTQ2KXtwcmVjaXNpb249MDtwcmVjaXNpb25TZXQ9dHJ1ZTt0ZXh0SW5kZXgrKztuZXh0PUhFQVA4W3RleHRJbmRleCsxPj4wXTtpZihuZXh0PT00Mil7cHJlY2lzaW9uPWdldE5leHRBcmcoImkzMiIpO3RleHRJbmRleCsrfWVsc2V7d2hpbGUoMSl7dmFyIHByZWNpc2lvbkNocj1IRUFQOFt0ZXh0SW5kZXgrMT4+MF07aWYocHJlY2lzaW9uQ2hyPDQ4fHxwcmVjaXNpb25DaHI+NTcpYnJlYWs7cHJlY2lzaW9uPXByZWNpc2lvbioxMCsocHJlY2lzaW9uQ2hyLTQ4KTt0ZXh0SW5kZXgrK319bmV4dD1IRUFQOFt0ZXh0SW5kZXgrMT4+MF19aWYocHJlY2lzaW9uPDApe3ByZWNpc2lvbj02O3ByZWNpc2lvblNldD1mYWxzZX12YXIgYXJnU2l6ZTtzd2l0Y2goU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0KSl7Y2FzZSJoIjp2YXIgbmV4dE5leHQ9SEVBUDhbdGV4dEluZGV4KzI+PjBdO2lmKG5leHROZXh0PT0xMDQpe3RleHRJbmRleCsrO2FyZ1NpemU9MX1lbHNle2FyZ1NpemU9Mn1icmVhaztjYXNlImwiOnZhciBuZXh0TmV4dD1IRUFQOFt0ZXh0SW5kZXgrMj4+MF07aWYobmV4dE5leHQ9PTEwOCl7dGV4dEluZGV4Kys7YXJnU2l6ZT04fWVsc2V7YXJnU2l6ZT00fWJyZWFrO2Nhc2UiTCI6Y2FzZSJxIjpjYXNlImoiOmFyZ1NpemU9ODticmVhaztjYXNlInoiOmNhc2UidCI6Y2FzZSJJIjphcmdTaXplPTQ7YnJlYWs7ZGVmYXVsdDphcmdTaXplPW51bGx9aWYoYXJnU2l6ZSl0ZXh0SW5kZXgrKztuZXh0PUhFQVA4W3RleHRJbmRleCsxPj4wXTtzd2l0Y2goU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0KSl7Y2FzZSJkIjpjYXNlImkiOmNhc2UidSI6Y2FzZSJvIjpjYXNlIngiOmNhc2UiWCI6Y2FzZSJwIjp7dmFyIHNpZ25lZD1uZXh0PT0xMDB8fG5leHQ9PTEwNTthcmdTaXplPWFyZ1NpemV8fDQ7dmFyIGN1cnJBcmc9Z2V0TmV4dEFyZygiaSIrYXJnU2l6ZSo4KTt2YXIgb3JpZ0FyZz1jdXJyQXJnO3ZhciBhcmdUZXh0O2lmKGFyZ1NpemU9PTgpe2N1cnJBcmc9UnVudGltZS5tYWtlQmlnSW50KGN1cnJBcmdbMF0sY3VyckFyZ1sxXSxuZXh0PT0xMTcpfWlmKGFyZ1NpemU8PTQpe3ZhciBsaW1pdD1NYXRoLnBvdygyNTYsYXJnU2l6ZSktMTtjdXJyQXJnPShzaWduZWQ/cmVTaWduOnVuU2lnbikoY3VyckFyZyZsaW1pdCxhcmdTaXplKjgpfXZhciBjdXJyQWJzQXJnPU1hdGguYWJzKGN1cnJBcmcpO3ZhciBwcmVmaXg9IiI7aWYobmV4dD09MTAwfHxuZXh0PT0xMDUpe2lmKGFyZ1NpemU9PTgmJmk2NE1hdGgpYXJnVGV4dD1pNjRNYXRoLnN0cmluZ2lmeShvcmlnQXJnWzBdLG9yaWdBcmdbMV0sbnVsbCk7ZWxzZSBhcmdUZXh0PXJlU2lnbihjdXJyQXJnLDgqYXJnU2l6ZSwxKS50b1N0cmluZygxMCl9ZWxzZSBpZihuZXh0PT0xMTcpe2lmKGFyZ1NpemU9PTgmJmk2NE1hdGgpYXJnVGV4dD1pNjRNYXRoLnN0cmluZ2lmeShvcmlnQXJnWzBdLG9yaWdBcmdbMV0sdHJ1ZSk7ZWxzZSBhcmdUZXh0PXVuU2lnbihjdXJyQXJnLDgqYXJnU2l6ZSwxKS50b1N0cmluZygxMCk7Y3VyckFyZz1NYXRoLmFicyhjdXJyQXJnKX1lbHNlIGlmKG5leHQ9PTExMSl7YXJnVGV4dD0oZmxhZ0FsdGVybmF0aXZlPyIwIjoiIikrY3VyckFic0FyZy50b1N0cmluZyg4KX1lbHNlIGlmKG5leHQ9PTEyMHx8bmV4dD09ODgpe3ByZWZpeD1mbGFnQWx0ZXJuYXRpdmUmJmN1cnJBcmchPTA/IjB4IjoiIjtpZihhcmdTaXplPT04JiZpNjRNYXRoKXtpZihvcmlnQXJnWzFdKXthcmdUZXh0PShvcmlnQXJnWzFdPj4+MCkudG9TdHJpbmcoMTYpO3ZhciBsb3dlcj0ob3JpZ0FyZ1swXT4+PjApLnRvU3RyaW5nKDE2KTt3aGlsZShsb3dlci5sZW5ndGg8OClsb3dlcj0iMCIrbG93ZXI7YXJnVGV4dCs9bG93ZXJ9ZWxzZXthcmdUZXh0PShvcmlnQXJnWzBdPj4+MCkudG9TdHJpbmcoMTYpfX1lbHNlIGlmKGN1cnJBcmc8MCl7Y3VyckFyZz0tY3VyckFyZzthcmdUZXh0PShjdXJyQWJzQXJnLTEpLnRvU3RyaW5nKDE2KTt2YXIgYnVmZmVyPVtdO2Zvcih2YXIgaT0wO2k8YXJnVGV4dC5sZW5ndGg7aSsrKXtidWZmZXIucHVzaCgoMTUtcGFyc2VJbnQoYXJnVGV4dFtpXSwxNikpLnRvU3RyaW5nKDE2KSl9YXJnVGV4dD1idWZmZXIuam9pbigiIik7d2hpbGUoYXJnVGV4dC5sZW5ndGg8YXJnU2l6ZSoyKWFyZ1RleHQ9ImYiK2FyZ1RleHR9ZWxzZXthcmdUZXh0PWN1cnJBYnNBcmcudG9TdHJpbmcoMTYpfWlmKG5leHQ9PTg4KXtwcmVmaXg9cHJlZml4LnRvVXBwZXJDYXNlKCk7YXJnVGV4dD1hcmdUZXh0LnRvVXBwZXJDYXNlKCl9fWVsc2UgaWYobmV4dD09MTEyKXtpZihjdXJyQWJzQXJnPT09MCl7YXJnVGV4dD0iKG5pbCkifWVsc2V7cHJlZml4PSIweCI7YXJnVGV4dD1jdXJyQWJzQXJnLnRvU3RyaW5nKDE2KX19aWYocHJlY2lzaW9uU2V0KXt3aGlsZShhcmdUZXh0Lmxlbmd0aDxwcmVjaXNpb24pe2FyZ1RleHQ9IjAiK2FyZ1RleHR9fWlmKGN1cnJBcmc+PTApe2lmKGZsYWdBbHdheXNTaWduZWQpe3ByZWZpeD0iKyIrcHJlZml4fWVsc2UgaWYoZmxhZ1BhZFNpZ24pe3ByZWZpeD0iICIrcHJlZml4fX1pZihhcmdUZXh0LmNoYXJBdCgwKT09Ii0iKXtwcmVmaXg9Ii0iK3ByZWZpeDthcmdUZXh0PWFyZ1RleHQuc3Vic3RyKDEpfXdoaWxlKHByZWZpeC5sZW5ndGgrYXJnVGV4dC5sZW5ndGg8d2lkdGgpe2lmKGZsYWdMZWZ0QWxpZ24pe2FyZ1RleHQrPSIgIn1lbHNle2lmKGZsYWdaZXJvUGFkKXthcmdUZXh0PSIwIithcmdUZXh0fWVsc2V7cHJlZml4PSIgIitwcmVmaXh9fX1hcmdUZXh0PXByZWZpeCthcmdUZXh0O2FyZ1RleHQuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGNocil7cmV0LnB1c2goY2hyLmNoYXJDb2RlQXQoMCkpfSkpO2JyZWFrfTtjYXNlImYiOmNhc2UiRiI6Y2FzZSJlIjpjYXNlIkUiOmNhc2UiZyI6Y2FzZSJHIjp7dmFyIGN1cnJBcmc9Z2V0TmV4dEFyZygiZG91YmxlIik7dmFyIGFyZ1RleHQ7aWYoaXNOYU4oY3VyckFyZykpe2FyZ1RleHQ9Im5hbiI7ZmxhZ1plcm9QYWQ9ZmFsc2V9ZWxzZSBpZighaXNGaW5pdGUoY3VyckFyZykpe2FyZ1RleHQ9KGN1cnJBcmc8MD8iLSI6IiIpKyJpbmYiO2ZsYWdaZXJvUGFkPWZhbHNlfWVsc2V7dmFyIGlzR2VuZXJhbD1mYWxzZTt2YXIgZWZmZWN0aXZlUHJlY2lzaW9uPU1hdGgubWluKHByZWNpc2lvbiwyMCk7aWYobmV4dD09MTAzfHxuZXh0PT03MSl7aXNHZW5lcmFsPXRydWU7cHJlY2lzaW9uPXByZWNpc2lvbnx8MTt2YXIgZXhwb25lbnQ9cGFyc2VJbnQoY3VyckFyZy50b0V4cG9uZW50aWFsKGVmZmVjdGl2ZVByZWNpc2lvbikuc3BsaXQoImUiKVsxXSwxMCk7aWYocHJlY2lzaW9uPmV4cG9uZW50JiZleHBvbmVudD49LTQpe25leHQ9KG5leHQ9PTEwMz8iZiI6IkYiKS5jaGFyQ29kZUF0KDApO3ByZWNpc2lvbi09ZXhwb25lbnQrMX1lbHNle25leHQ9KG5leHQ9PTEwMz8iZSI6IkUiKS5jaGFyQ29kZUF0KDApO3ByZWNpc2lvbi0tfWVmZmVjdGl2ZVByZWNpc2lvbj1NYXRoLm1pbihwcmVjaXNpb24sMjApfWlmKG5leHQ9PTEwMXx8bmV4dD09Njkpe2FyZ1RleHQ9Y3VyckFyZy50b0V4cG9uZW50aWFsKGVmZmVjdGl2ZVByZWNpc2lvbik7aWYoL1tlRV1bLStdXGQkLy50ZXN0KGFyZ1RleHQpKXthcmdUZXh0PWFyZ1RleHQuc2xpY2UoMCwtMSkrIjAiK2FyZ1RleHQuc2xpY2UoLTEpfX1lbHNlIGlmKG5leHQ9PTEwMnx8bmV4dD09NzApe2FyZ1RleHQ9Y3VyckFyZy50b0ZpeGVkKGVmZmVjdGl2ZVByZWNpc2lvbik7aWYoY3VyckFyZz09PTAmJl9fcmVhbGx5TmVnYXRpdmUoY3VyckFyZykpe2FyZ1RleHQ9Ii0iK2FyZ1RleHR9fXZhciBwYXJ0cz1hcmdUZXh0LnNwbGl0KCJlIik7aWYoaXNHZW5lcmFsJiYhZmxhZ0FsdGVybmF0aXZlKXt3aGlsZShwYXJ0c1swXS5sZW5ndGg+MSYmcGFydHNbMF0uaW5kZXhPZigiLiIpIT0tMSYmKHBhcnRzWzBdLnNsaWNlKC0xKT09IjAifHxwYXJ0c1swXS5zbGljZSgtMSk9PSIuIikpe3BhcnRzWzBdPXBhcnRzWzBdLnNsaWNlKDAsLTEpfX1lbHNle2lmKGZsYWdBbHRlcm5hdGl2ZSYmYXJnVGV4dC5pbmRleE9mKCIuIik9PS0xKXBhcnRzWzBdKz0iLiI7d2hpbGUocHJlY2lzaW9uPmVmZmVjdGl2ZVByZWNpc2lvbisrKXBhcnRzWzBdKz0iMCJ9YXJnVGV4dD1wYXJ0c1swXSsocGFydHMubGVuZ3RoPjE/ImUiK3BhcnRzWzFdOiIiKTtpZihuZXh0PT02OSlhcmdUZXh0PWFyZ1RleHQudG9VcHBlckNhc2UoKTtpZihjdXJyQXJnPj0wKXtpZihmbGFnQWx3YXlzU2lnbmVkKXthcmdUZXh0PSIrIithcmdUZXh0fWVsc2UgaWYoZmxhZ1BhZFNpZ24pe2FyZ1RleHQ9IiAiK2FyZ1RleHR9fX13aGlsZShhcmdUZXh0Lmxlbmd0aDx3aWR0aCl7aWYoZmxhZ0xlZnRBbGlnbil7YXJnVGV4dCs9IiAifWVsc2V7aWYoZmxhZ1plcm9QYWQmJihhcmdUZXh0WzBdPT0iLSJ8fGFyZ1RleHRbMF09PSIrIikpe2FyZ1RleHQ9YXJnVGV4dFswXSsiMCIrYXJnVGV4dC5zbGljZSgxKX1lbHNle2FyZ1RleHQ9KGZsYWdaZXJvUGFkPyIwIjoiICIpK2FyZ1RleHR9fX1pZihuZXh0PDk3KWFyZ1RleHQ9YXJnVGV4dC50b1VwcGVyQ2FzZSgpO2FyZ1RleHQuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGNocil7cmV0LnB1c2goY2hyLmNoYXJDb2RlQXQoMCkpfSkpO2JyZWFrfTtjYXNlInMiOnt2YXIgYXJnPWdldE5leHRBcmcoImk4KiIpO3ZhciBhcmdMZW5ndGg9YXJnP19zdHJsZW4oYXJnKToiKG51bGwpIi5sZW5ndGg7aWYocHJlY2lzaW9uU2V0KWFyZ0xlbmd0aD1NYXRoLm1pbihhcmdMZW5ndGgscHJlY2lzaW9uKTtpZighZmxhZ0xlZnRBbGlnbil7d2hpbGUoYXJnTGVuZ3RoPHdpZHRoLS0pe3JldC5wdXNoKDMyKX19aWYoYXJnKXtmb3IodmFyIGk9MDtpPGFyZ0xlbmd0aDtpKyspe3JldC5wdXNoKEhFQVBVOFthcmcrKz4+MF0pfX1lbHNle3JldD1yZXQuY29uY2F0KGludEFycmF5RnJvbVN0cmluZygiKG51bGwpIi5zdWJzdHIoMCxhcmdMZW5ndGgpLHRydWUpKX1pZihmbGFnTGVmdEFsaWduKXt3aGlsZShhcmdMZW5ndGg8d2lkdGgtLSl7cmV0LnB1c2goMzIpfX1icmVha307Y2FzZSJjIjp7aWYoZmxhZ0xlZnRBbGlnbilyZXQucHVzaChnZXROZXh0QXJnKCJpOCIpKTt3aGlsZSgtLXdpZHRoPjApe3JldC5wdXNoKDMyKX1pZighZmxhZ0xlZnRBbGlnbilyZXQucHVzaChnZXROZXh0QXJnKCJpOCIpKTticmVha307Y2FzZSJuIjp7dmFyIHB0cj1nZXROZXh0QXJnKCJpMzIqIik7SEVBUDMyW3B0cj4+Ml09cmV0Lmxlbmd0aDticmVha307Y2FzZSIlIjp7cmV0LnB1c2goY3Vycik7YnJlYWt9O2RlZmF1bHQ6e2Zvcih2YXIgaT1zdGFydFRleHRJbmRleDtpPHRleHRJbmRleCsyO2krKyl7cmV0LnB1c2goSEVBUDhbaT4+MF0pfX19dGV4dEluZGV4Kz0yfWVsc2V7cmV0LnB1c2goY3Vycik7dGV4dEluZGV4Kz0xfX1yZXR1cm4gcmV0fWZ1bmN0aW9uIF9tYWxsb2MoYnl0ZXMpe3ZhciBwdHI9UnVudGltZS5keW5hbWljQWxsb2MoYnl0ZXMrOCk7cmV0dXJuIHB0cis4JjQyOTQ5NjcyODh9TW9kdWxlWyJfbWFsbG9jIl09X21hbGxvYztmdW5jdGlvbiBfc25wcmludGYocyxuLGZvcm1hdCx2YXJhcmdzKXt2YXIgcmVzdWx0PV9fZm9ybWF0U3RyaW5nKGZvcm1hdCx2YXJhcmdzKTt2YXIgbGltaXQ9bj09PXVuZGVmaW5lZD9yZXN1bHQubGVuZ3RoOk1hdGgubWluKHJlc3VsdC5sZW5ndGgsTWF0aC5tYXgobi0xLDApKTtpZihzPDApe3M9LXM7dmFyIGJ1Zj1fbWFsbG9jKGxpbWl0KzEpO0hFQVAzMltzPj4yXT1idWY7cz1idWZ9Zm9yKHZhciBpPTA7aTxsaW1pdDtpKyspe0hFQVA4W3MraT4+MF09cmVzdWx0W2ldfWlmKGxpbWl0PG58fG49PT11bmRlZmluZWQpSEVBUDhbcytpPj4wXT0wO3JldHVybiByZXN1bHQubGVuZ3RofWZ1bmN0aW9uIF9ta3BvcnQoKXt0aHJvdyJUT0RPIn12YXIgU09DS0ZTPXttb3VudDooZnVuY3Rpb24obW91bnQpe3JldHVybiBGUy5jcmVhdGVOb2RlKG51bGwsIi8iLDE2Mzg0fDUxMSwwKX0pLGNyZWF0ZVNvY2tldDooZnVuY3Rpb24oZmFtaWx5LHR5cGUscHJvdG9jb2wpe3ZhciBzdHJlYW1pbmc9dHlwZT09MTtpZihwcm90b2NvbCl7YXNzZXJ0KHN0cmVhbWluZz09KHByb3RvY29sPT02KSl9dmFyIHNvY2s9e2ZhbWlseTpmYW1pbHksdHlwZTp0eXBlLHByb3RvY29sOnByb3RvY29sLHNlcnZlcjpudWxsLHBlZXJzOnt9LHBlbmRpbmc6W10scmVjdl9xdWV1ZTpbXSxzb2NrX29wczpTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzfTt2YXIgbmFtZT1TT0NLRlMubmV4dG5hbWUoKTt2YXIgbm9kZT1GUy5jcmVhdGVOb2RlKFNPQ0tGUy5yb290LG5hbWUsNDkxNTIsMCk7bm9kZS5zb2NrPXNvY2s7dmFyIHN0cmVhbT1GUy5jcmVhdGVTdHJlYW0oe3BhdGg6bmFtZSxub2RlOm5vZGUsZmxhZ3M6RlMubW9kZVN0cmluZ1RvRmxhZ3MoInIrIiksc2Vla2FibGU6ZmFsc2Usc3RyZWFtX29wczpTT0NLRlMuc3RyZWFtX29wc30pO3NvY2suc3RyZWFtPXN0cmVhbTtyZXR1cm4gc29ja30pLGdldFNvY2tldDooZnVuY3Rpb24oZmQpe3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKGZkKTtpZighc3RyZWFtfHwhRlMuaXNTb2NrZXQoc3RyZWFtLm5vZGUubW9kZSkpe3JldHVybiBudWxsfXJldHVybiBzdHJlYW0ubm9kZS5zb2NrfSksc3RyZWFtX29wczp7cG9sbDooZnVuY3Rpb24oc3RyZWFtKXt2YXIgc29jaz1zdHJlYW0ubm9kZS5zb2NrO3JldHVybiBzb2NrLnNvY2tfb3BzLnBvbGwoc29jayl9KSxpb2N0bDooZnVuY3Rpb24oc3RyZWFtLHJlcXVlc3QsdmFyYXJncyl7dmFyIHNvY2s9c3RyZWFtLm5vZGUuc29jaztyZXR1cm4gc29jay5zb2NrX29wcy5pb2N0bChzb2NrLHJlcXVlc3QsdmFyYXJncyl9KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBzb2NrPXN0cmVhbS5ub2RlLnNvY2s7dmFyIG1zZz1zb2NrLnNvY2tfb3BzLnJlY3Ztc2coc29jayxsZW5ndGgpO2lmKCFtc2cpe3JldHVybiAwfWJ1ZmZlci5zZXQobXNnLmJ1ZmZlcixvZmZzZXQpO3JldHVybiBtc2cuYnVmZmVyLmxlbmd0aH0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3ZhciBzb2NrPXN0cmVhbS5ub2RlLnNvY2s7cmV0dXJuIHNvY2suc29ja19vcHMuc2VuZG1zZyhzb2NrLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoKX0pLGNsb3NlOihmdW5jdGlvbihzdHJlYW0pe3ZhciBzb2NrPXN0cmVhbS5ub2RlLnNvY2s7c29jay5zb2NrX29wcy5jbG9zZShzb2NrKX0pfSxuZXh0bmFtZTooZnVuY3Rpb24oKXtpZighU09DS0ZTLm5leHRuYW1lLmN1cnJlbnQpe1NPQ0tGUy5uZXh0bmFtZS5jdXJyZW50PTB9cmV0dXJuInNvY2tldFsiK1NPQ0tGUy5uZXh0bmFtZS5jdXJyZW50KysgKyJdIn0pLHdlYnNvY2tldF9zb2NrX29wczp7Y3JlYXRlUGVlcjooZnVuY3Rpb24oc29jayxhZGRyLHBvcnQpe3ZhciB3cztpZih0eXBlb2YgYWRkcj09PSJvYmplY3QiKXt3cz1hZGRyO2FkZHI9bnVsbDtwb3J0PW51bGx9aWYod3Mpe2lmKHdzLl9zb2NrZXQpe2FkZHI9d3MuX3NvY2tldC5yZW1vdGVBZGRyZXNzO3BvcnQ9d3MuX3NvY2tldC5yZW1vdGVQb3J0fWVsc2V7dmFyIHJlc3VsdD0vd3Nbc10/OlwvXC8oW146XSspOihcZCspLy5leGVjKHdzLnVybCk7aWYoIXJlc3VsdCl7dGhyb3cgbmV3IEVycm9yKCJXZWJTb2NrZXQgVVJMIG11c3QgYmUgaW4gdGhlIGZvcm1hdCB3cyhzKTovL2FkZHJlc3M6cG9ydCIpfWFkZHI9cmVzdWx0WzFdO3BvcnQ9cGFyc2VJbnQocmVzdWx0WzJdLDEwKX19ZWxzZXt0cnl7dmFyIHJ1bnRpbWVDb25maWc9TW9kdWxlWyJ3ZWJzb2NrZXQiXSYmIm9iamVjdCI9PT10eXBlb2YgTW9kdWxlWyJ3ZWJzb2NrZXQiXTt2YXIgdXJsPSJ3czojIi5yZXBsYWNlKCIjIiwiLy8iKTtpZihydW50aW1lQ29uZmlnKXtpZigic3RyaW5nIj09PXR5cGVvZiBNb2R1bGVbIndlYnNvY2tldCJdWyJ1cmwiXSl7dXJsPU1vZHVsZVsid2Vic29ja2V0Il1bInVybCJdfX1pZih1cmw9PT0id3M6Ly8ifHx1cmw9PT0id3NzOi8vIil7dXJsPXVybCthZGRyKyI6Iitwb3J0fXZhciBzdWJQcm90b2NvbHM9ImJpbmFyeSI7aWYocnVudGltZUNvbmZpZyl7aWYoInN0cmluZyI9PT10eXBlb2YgTW9kdWxlWyJ3ZWJzb2NrZXQiXVsic3VicHJvdG9jb2wiXSl7c3ViUHJvdG9jb2xzPU1vZHVsZVsid2Vic29ja2V0Il1bInN1YnByb3RvY29sIl19fXN1YlByb3RvY29scz1zdWJQcm90b2NvbHMucmVwbGFjZSgvXiArfCArJC9nLCIiKS5zcGxpdCgvICosICovKTt2YXIgb3B0cz1FTlZJUk9OTUVOVF9JU19OT0RFP3sicHJvdG9jb2wiOnN1YlByb3RvY29scy50b1N0cmluZygpfTpzdWJQcm90b2NvbHM7dmFyIFdlYlNvY2tldD1FTlZJUk9OTUVOVF9JU19OT0RFP3JlcXVpcmUoIndzIik6d2luZG93WyJXZWJTb2NrZXQiXTt3cz1uZXcgV2ViU29ja2V0KHVybCxvcHRzKTt3cy5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciJ9Y2F0Y2goZSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUhPU1RVTlJFQUNIKX19dmFyIHBlZXI9e2FkZHI6YWRkcixwb3J0OnBvcnQsc29ja2V0OndzLGRncmFtX3NlbmRfcXVldWU6W119O1NPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuYWRkUGVlcihzb2NrLHBlZXIpO1NPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuaGFuZGxlUGVlckV2ZW50cyhzb2NrLHBlZXIpO2lmKHNvY2sudHlwZT09PTImJnR5cGVvZiBzb2NrLnNwb3J0IT09InVuZGVmaW5lZCIpe3BlZXIuZGdyYW1fc2VuZF9xdWV1ZS5wdXNoKG5ldyBVaW50OEFycmF5KFsyNTUsMjU1LDI1NSwyNTUsInAiLmNoYXJDb2RlQXQoMCksIm8iLmNoYXJDb2RlQXQoMCksInIiLmNoYXJDb2RlQXQoMCksInQiLmNoYXJDb2RlQXQoMCksKHNvY2suc3BvcnQmNjUyODApPj44LHNvY2suc3BvcnQmMjU1XSkpfXJldHVybiBwZWVyfSksZ2V0UGVlcjooZnVuY3Rpb24oc29jayxhZGRyLHBvcnQpe3JldHVybiBzb2NrLnBlZXJzW2FkZHIrIjoiK3BvcnRdfSksYWRkUGVlcjooZnVuY3Rpb24oc29jayxwZWVyKXtzb2NrLnBlZXJzW3BlZXIuYWRkcisiOiIrcGVlci5wb3J0XT1wZWVyfSkscmVtb3ZlUGVlcjooZnVuY3Rpb24oc29jayxwZWVyKXtkZWxldGUgc29jay5wZWVyc1twZWVyLmFkZHIrIjoiK3BlZXIucG9ydF19KSxoYW5kbGVQZWVyRXZlbnRzOihmdW5jdGlvbihzb2NrLHBlZXIpe3ZhciBmaXJzdD10cnVlO3ZhciBoYW5kbGVPcGVuPShmdW5jdGlvbigpe3RyeXt2YXIgcXVldWVkPXBlZXIuZGdyYW1fc2VuZF9xdWV1ZS5zaGlmdCgpO3doaWxlKHF1ZXVlZCl7cGVlci5zb2NrZXQuc2VuZChxdWV1ZWQpO3F1ZXVlZD1wZWVyLmRncmFtX3NlbmRfcXVldWUuc2hpZnQoKX19Y2F0Y2goZSl7cGVlci5zb2NrZXQuY2xvc2UoKX19KTtmdW5jdGlvbiBoYW5kbGVNZXNzYWdlKGRhdGEpe2Fzc2VydCh0eXBlb2YgZGF0YSE9PSJzdHJpbmciJiZkYXRhLmJ5dGVMZW5ndGghPT11bmRlZmluZWQpO2RhdGE9bmV3IFVpbnQ4QXJyYXkoZGF0YSk7dmFyIHdhc2ZpcnN0PWZpcnN0O2ZpcnN0PWZhbHNlO2lmKHdhc2ZpcnN0JiZkYXRhLmxlbmd0aD09PTEwJiZkYXRhWzBdPT09MjU1JiZkYXRhWzFdPT09MjU1JiZkYXRhWzJdPT09MjU1JiZkYXRhWzNdPT09MjU1JiZkYXRhWzRdPT09InAiLmNoYXJDb2RlQXQoMCkmJmRhdGFbNV09PT0ibyIuY2hhckNvZGVBdCgwKSYmZGF0YVs2XT09PSJyIi5jaGFyQ29kZUF0KDApJiZkYXRhWzddPT09InQiLmNoYXJDb2RlQXQoMCkpe3ZhciBuZXdwb3J0PWRhdGFbOF08PDh8ZGF0YVs5XTtTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLnJlbW92ZVBlZXIoc29jayxwZWVyKTtwZWVyLnBvcnQ9bmV3cG9ydDtTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmFkZFBlZXIoc29jayxwZWVyKTtyZXR1cm59c29jay5yZWN2X3F1ZXVlLnB1c2goe2FkZHI6cGVlci5hZGRyLHBvcnQ6cGVlci5wb3J0LGRhdGE6ZGF0YX0pfWlmKEVOVklST05NRU5UX0lTX05PREUpe3BlZXIuc29ja2V0Lm9uKCJvcGVuIixoYW5kbGVPcGVuKTtwZWVyLnNvY2tldC5vbigibWVzc2FnZSIsKGZ1bmN0aW9uKGRhdGEsZmxhZ3Mpe2lmKCFmbGFncy5iaW5hcnkpe3JldHVybn1oYW5kbGVNZXNzYWdlKChuZXcgVWludDhBcnJheShkYXRhKSkuYnVmZmVyKX0pKTtwZWVyLnNvY2tldC5vbigiZXJyb3IiLChmdW5jdGlvbigpe30pKX1lbHNle3BlZXIuc29ja2V0Lm9ub3Blbj1oYW5kbGVPcGVuO3BlZXIuc29ja2V0Lm9ubWVzc2FnZT1mdW5jdGlvbiBwZWVyX3NvY2tldF9vbm1lc3NhZ2UoZXZlbnQpe2hhbmRsZU1lc3NhZ2UoZXZlbnQuZGF0YSl9fX0pLHBvbGw6KGZ1bmN0aW9uKHNvY2spe2lmKHNvY2sudHlwZT09PTEmJnNvY2suc2VydmVyKXtyZXR1cm4gc29jay5wZW5kaW5nLmxlbmd0aD82NHwxOjB9dmFyIG1hc2s9MDt2YXIgZGVzdD1zb2NrLnR5cGU9PT0xP1NPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuZ2V0UGVlcihzb2NrLHNvY2suZGFkZHIsc29jay5kcG9ydCk6bnVsbDtpZihzb2NrLnJlY3ZfcXVldWUubGVuZ3RofHwhZGVzdHx8ZGVzdCYmZGVzdC5zb2NrZXQucmVhZHlTdGF0ZT09PWRlc3Quc29ja2V0LkNMT1NJTkd8fGRlc3QmJmRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TRUQpe21hc2t8PTY0fDF9aWYoIWRlc3R8fGRlc3QmJmRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5PUEVOKXttYXNrfD00fWlmKGRlc3QmJmRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TSU5HfHxkZXN0JiZkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ0xPU0VEKXttYXNrfD0xNn1yZXR1cm4gbWFza30pLGlvY3RsOihmdW5jdGlvbihzb2NrLHJlcXVlc3QsYXJnKXtzd2l0Y2gocmVxdWVzdCl7Y2FzZSAyMTUzMTp2YXIgYnl0ZXM9MDtpZihzb2NrLnJlY3ZfcXVldWUubGVuZ3RoKXtieXRlcz1zb2NrLnJlY3ZfcXVldWVbMF0uZGF0YS5sZW5ndGh9SEVBUDMyW2FyZz4+Ml09Ynl0ZXM7cmV0dXJuIDA7ZGVmYXVsdDpyZXR1cm4gRVJSTk9fQ09ERVMuRUlOVkFMfX0pLGNsb3NlOihmdW5jdGlvbihzb2NrKXtpZihzb2NrLnNlcnZlcil7dHJ5e3NvY2suc2VydmVyLmNsb3NlKCl9Y2F0Y2goZSl7fXNvY2suc2VydmVyPW51bGx9dmFyIHBlZXJzPU9iamVjdC5rZXlzKHNvY2sucGVlcnMpO2Zvcih2YXIgaT0wO2k8cGVlcnMubGVuZ3RoO2krKyl7dmFyIHBlZXI9c29jay5wZWVyc1twZWVyc1tpXV07dHJ5e3BlZXIuc29ja2V0LmNsb3NlKCl9Y2F0Y2goZSl7fVNPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMucmVtb3ZlUGVlcihzb2NrLHBlZXIpfXJldHVybiAwfSksYmluZDooZnVuY3Rpb24oc29jayxhZGRyLHBvcnQpe2lmKHR5cGVvZiBzb2NrLnNhZGRyIT09InVuZGVmaW5lZCJ8fHR5cGVvZiBzb2NrLnNwb3J0IT09InVuZGVmaW5lZCIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9c29jay5zYWRkcj1hZGRyO3NvY2suc3BvcnQ9cG9ydHx8X21rcG9ydCgpO2lmKHNvY2sudHlwZT09PTIpe2lmKHNvY2suc2VydmVyKXtzb2NrLnNlcnZlci5jbG9zZSgpO3NvY2suc2VydmVyPW51bGx9dHJ5e3NvY2suc29ja19vcHMubGlzdGVuKHNvY2ssMCl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpdGhyb3cgZTtpZihlLmVycm5vIT09RVJSTk9fQ09ERVMuRU9QTk9UU1VQUCl0aHJvdyBlfX19KSxjb25uZWN0OihmdW5jdGlvbihzb2NrLGFkZHIscG9ydCl7aWYoc29jay5zZXJ2ZXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPRFMuRU9QTk9UU1VQUCl9aWYodHlwZW9mIHNvY2suZGFkZHIhPT0idW5kZWZpbmVkIiYmdHlwZW9mIHNvY2suZHBvcnQhPT0idW5kZWZpbmVkIil7dmFyIGRlc3Q9U09DS0ZTLndlYnNvY2tldF9zb2NrX29wcy5nZXRQZWVyKHNvY2ssc29jay5kYWRkcixzb2NrLmRwb3J0KTtpZihkZXN0KXtpZihkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ09OTkVDVElORyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFMUkVBRFkpfWVsc2V7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTQ09OTil9fX12YXIgcGVlcj1TT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmNyZWF0ZVBlZXIoc29jayxhZGRyLHBvcnQpO3NvY2suZGFkZHI9cGVlci5hZGRyO3NvY2suZHBvcnQ9cGVlci5wb3J0O3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlBST0dSRVNTKX0pLGxpc3RlbjooZnVuY3Rpb24oc29jayxiYWNrbG9nKXtpZighRU5WSVJPTk1FTlRfSVNfTk9ERSl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU9QTk9UU1VQUCl9aWYoc29jay5zZXJ2ZXIpe3Rocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyIFdlYlNvY2tldFNlcnZlcj1yZXF1aXJlKCJ3cyIpLlNlcnZlcjt2YXIgaG9zdD1zb2NrLnNhZGRyO3NvY2suc2VydmVyPW5ldyBXZWJTb2NrZXRTZXJ2ZXIoe2hvc3Q6aG9zdCxwb3J0OnNvY2suc3BvcnR9KTtzb2NrLnNlcnZlci5vbigiY29ubmVjdGlvbiIsKGZ1bmN0aW9uKHdzKXtpZihzb2NrLnR5cGU9PT0xKXt2YXIgbmV3c29jaz1TT0NLRlMuY3JlYXRlU29ja2V0KHNvY2suZmFtaWx5LHNvY2sudHlwZSxzb2NrLnByb3RvY29sKTt2YXIgcGVlcj1TT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmNyZWF0ZVBlZXIobmV3c29jayx3cyk7bmV3c29jay5kYWRkcj1wZWVyLmFkZHI7bmV3c29jay5kcG9ydD1wZWVyLnBvcnQ7c29jay5wZW5kaW5nLnB1c2gobmV3c29jayl9ZWxzZXtTT0NLRlMud2Vic29ja2V0X3NvY2tfb3BzLmNyZWF0ZVBlZXIoc29jayx3cyl9fSkpO3NvY2suc2VydmVyLm9uKCJjbG9zZWQiLChmdW5jdGlvbigpe3NvY2suc2VydmVyPW51bGx9KSk7c29jay5zZXJ2ZXIub24oImVycm9yIiwoZnVuY3Rpb24oKXt9KSl9KSxhY2NlcHQ6KGZ1bmN0aW9uKGxpc3RlbnNvY2spe2lmKCFsaXN0ZW5zb2NrLnNlcnZlcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXIgbmV3c29jaz1saXN0ZW5zb2NrLnBlbmRpbmcuc2hpZnQoKTtuZXdzb2NrLnN0cmVhbS5mbGFncz1saXN0ZW5zb2NrLnN0cmVhbS5mbGFncztyZXR1cm4gbmV3c29ja30pLGdldG5hbWU6KGZ1bmN0aW9uKHNvY2sscGVlcil7dmFyIGFkZHIscG9ydDtpZihwZWVyKXtpZihzb2NrLmRhZGRyPT09dW5kZWZpbmVkfHxzb2NrLmRwb3J0PT09dW5kZWZpbmVkKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9UQ09OTil9YWRkcj1zb2NrLmRhZGRyO3BvcnQ9c29jay5kcG9ydH1lbHNle2FkZHI9c29jay5zYWRkcnx8MDtwb3J0PXNvY2suc3BvcnR8fDB9cmV0dXJue2FkZHI6YWRkcixwb3J0OnBvcnR9fSksc2VuZG1zZzooZnVuY3Rpb24oc29jayxidWZmZXIsb2Zmc2V0LGxlbmd0aCxhZGRyLHBvcnQpe2lmKHNvY2sudHlwZT09PTIpe2lmKGFkZHI9PT11bmRlZmluZWR8fHBvcnQ9PT11bmRlZmluZWQpe2FkZHI9c29jay5kYWRkcjtwb3J0PXNvY2suZHBvcnR9aWYoYWRkcj09PXVuZGVmaW5lZHx8cG9ydD09PXVuZGVmaW5lZCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRURFU1RBRERSUkVRKX19ZWxzZXthZGRyPXNvY2suZGFkZHI7cG9ydD1zb2NrLmRwb3J0fXZhciBkZXN0PVNPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuZ2V0UGVlcihzb2NrLGFkZHIscG9ydCk7aWYoc29jay50eXBlPT09MSl7aWYoIWRlc3R8fGRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TSU5HfHxkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ0xPU0VEKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9UQ09OTil9ZWxzZSBpZihkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ09OTkVDVElORyl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX19dmFyIGRhdGE7aWYoYnVmZmVyIGluc3RhbmNlb2YgQXJyYXl8fGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXtkYXRhPWJ1ZmZlci5zbGljZShvZmZzZXQsb2Zmc2V0K2xlbmd0aCl9ZWxzZXtkYXRhPWJ1ZmZlci5idWZmZXIuc2xpY2UoYnVmZmVyLmJ5dGVPZmZzZXQrb2Zmc2V0LGJ1ZmZlci5ieXRlT2Zmc2V0K29mZnNldCtsZW5ndGgpfWlmKHNvY2sudHlwZT09PTIpe2lmKCFkZXN0fHxkZXN0LnNvY2tldC5yZWFkeVN0YXRlIT09ZGVzdC5zb2NrZXQuT1BFTil7aWYoIWRlc3R8fGRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TSU5HfHxkZXN0LnNvY2tldC5yZWFkeVN0YXRlPT09ZGVzdC5zb2NrZXQuQ0xPU0VEKXtkZXN0PVNPQ0tGUy53ZWJzb2NrZXRfc29ja19vcHMuY3JlYXRlUGVlcihzb2NrLGFkZHIscG9ydCl9ZGVzdC5kZ3JhbV9zZW5kX3F1ZXVlLnB1c2goZGF0YSk7cmV0dXJuIGxlbmd0aH19dHJ5e2Rlc3Quc29ja2V0LnNlbmQoZGF0YSk7cmV0dXJuIGxlbmd0aH1jYXRjaChlKXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfX0pLHJlY3Ztc2c6KGZ1bmN0aW9uKHNvY2ssbGVuZ3RoKXtpZihzb2NrLnR5cGU9PT0xJiZzb2NrLnNlcnZlcil7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVENPTk4pfXZhciBxdWV1ZWQ9c29jay5yZWN2X3F1ZXVlLnNoaWZ0KCk7aWYoIXF1ZXVlZCl7aWYoc29jay50eXBlPT09MSl7dmFyIGRlc3Q9U09DS0ZTLndlYnNvY2tldF9zb2NrX29wcy5nZXRQZWVyKHNvY2ssc29jay5kYWRkcixzb2NrLmRwb3J0KTtpZighZGVzdCl7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVENPTk4pfWVsc2UgaWYoZGVzdC5zb2NrZXQucmVhZHlTdGF0ZT09PWRlc3Quc29ja2V0LkNMT1NJTkd8fGRlc3Quc29ja2V0LnJlYWR5U3RhdGU9PT1kZXN0LnNvY2tldC5DTE9TRUQpe3JldHVybiBudWxsfWVsc2V7dGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX19ZWxzZXt0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUdBSU4pfX12YXIgcXVldWVkTGVuZ3RoPXF1ZXVlZC5kYXRhLmJ5dGVMZW5ndGh8fHF1ZXVlZC5kYXRhLmxlbmd0aDt2YXIgcXVldWVkT2Zmc2V0PXF1ZXVlZC5kYXRhLmJ5dGVPZmZzZXR8fDA7dmFyIHF1ZXVlZEJ1ZmZlcj1xdWV1ZWQuZGF0YS5idWZmZXJ8fHF1ZXVlZC5kYXRhO3ZhciBieXRlc1JlYWQ9TWF0aC5taW4obGVuZ3RoLHF1ZXVlZExlbmd0aCk7dmFyIHJlcz17YnVmZmVyOm5ldyBVaW50OEFycmF5KHF1ZXVlZEJ1ZmZlcixxdWV1ZWRPZmZzZXQsYnl0ZXNSZWFkKSxhZGRyOnF1ZXVlZC5hZGRyLHBvcnQ6cXVldWVkLnBvcnR9O2lmKHNvY2sudHlwZT09PTEmJmJ5dGVzUmVhZDxxdWV1ZWRMZW5ndGgpe3ZhciBieXRlc1JlbWFpbmluZz1xdWV1ZWRMZW5ndGgtYnl0ZXNSZWFkO3F1ZXVlZC5kYXRhPW5ldyBVaW50OEFycmF5KHF1ZXVlZEJ1ZmZlcixxdWV1ZWRPZmZzZXQrYnl0ZXNSZWFkLGJ5dGVzUmVtYWluaW5nKTtzb2NrLnJlY3ZfcXVldWUudW5zaGlmdChxdWV1ZWQpfXJldHVybiByZXN9KX19O2Z1bmN0aW9uIF9zZW5kKGZkLGJ1ZixsZW4sZmxhZ3Mpe3ZhciBzb2NrPVNPQ0tGUy5nZXRTb2NrZXQoZmQpO2lmKCFzb2NrKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuLTF9cmV0dXJuIF93cml0ZShmZCxidWYsbGVuKX1mdW5jdGlvbiBfcHdyaXRlKGZpbGRlcyxidWYsbmJ5dGUsb2Zmc2V0KXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmaWxkZXMpO2lmKCFzdHJlYW0pe19fX3NldEVyck5vKEVSUk5PX0NPREVTLkVCQURGKTtyZXR1cm4tMX10cnl7dmFyIHNsYWI9SEVBUDg7cmV0dXJuIEZTLndyaXRlKHN0cmVhbSxzbGFiLGJ1ZixuYnl0ZSxvZmZzZXQpfWNhdGNoKGUpe0ZTLmhhbmRsZUZTRXJyb3IoZSk7cmV0dXJuLTF9fWZ1bmN0aW9uIF93cml0ZShmaWxkZXMsYnVmLG5ieXRlKXt2YXIgc3RyZWFtPUZTLmdldFN0cmVhbShmaWxkZXMpO2lmKCFzdHJlYW0pe19fX3NldEVyck5vKEVSUk5PX0NPREVTLkVCQURGKTtyZXR1cm4tMX10cnl7dmFyIHNsYWI9SEVBUDg7cmV0dXJuIEZTLndyaXRlKHN0cmVhbSxzbGFiLGJ1ZixuYnl0ZSl9Y2F0Y2goZSl7RlMuaGFuZGxlRlNFcnJvcihlKTtyZXR1cm4tMX19ZnVuY3Rpb24gX2ZpbGVubyhzdHJlYW0pe3N0cmVhbT1GUy5nZXRTdHJlYW1Gcm9tUHRyKHN0cmVhbSk7aWYoIXN0cmVhbSlyZXR1cm4tMTtyZXR1cm4gc3RyZWFtLmZkfWZ1bmN0aW9uIF9md3JpdGUocHRyLHNpemUsbml0ZW1zLHN0cmVhbSl7dmFyIGJ5dGVzVG9Xcml0ZT1uaXRlbXMqc2l6ZTtpZihieXRlc1RvV3JpdGU9PTApcmV0dXJuIDA7dmFyIGZkPV9maWxlbm8oc3RyZWFtKTt2YXIgYnl0ZXNXcml0dGVuPV93cml0ZShmZCxwdHIsYnl0ZXNUb1dyaXRlKTtpZihieXRlc1dyaXR0ZW49PS0xKXt2YXIgc3RyZWFtT2JqPUZTLmdldFN0cmVhbUZyb21QdHIoc3RyZWFtKTtpZihzdHJlYW1PYmopc3RyZWFtT2JqLmVycm9yPXRydWU7cmV0dXJuIDB9ZWxzZXtyZXR1cm4gTWF0aC5mbG9vcihieXRlc1dyaXR0ZW4vc2l6ZSl9fWZ1bmN0aW9uIF9yZWN2KGZkLGJ1ZixsZW4sZmxhZ3Mpe3ZhciBzb2NrPVNPQ0tGUy5nZXRTb2NrZXQoZmQpO2lmKCFzb2NrKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuLTF9cmV0dXJuIF9yZWFkKGZkLGJ1ZixsZW4pfWZ1bmN0aW9uIF9wcmVhZChmaWxkZXMsYnVmLG5ieXRlLG9mZnNldCl7dmFyIHN0cmVhbT1GUy5nZXRTdHJlYW0oZmlsZGVzKTtpZighc3RyZWFtKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuLTF9dHJ5e3ZhciBzbGFiPUhFQVA4O3JldHVybiBGUy5yZWFkKHN0cmVhbSxzbGFiLGJ1ZixuYnl0ZSxvZmZzZXQpfWNhdGNoKGUpe0ZTLmhhbmRsZUZTRXJyb3IoZSk7cmV0dXJuLTF9fWZ1bmN0aW9uIF9yZWFkKGZpbGRlcyxidWYsbmJ5dGUpe3ZhciBzdHJlYW09RlMuZ2V0U3RyZWFtKGZpbGRlcyk7aWYoIXN0cmVhbSl7X19fc2V0RXJyTm8oRVJSTk9fQ09ERVMuRUJBREYpO3JldHVybi0xfXRyeXt2YXIgc2xhYj1IRUFQODtyZXR1cm4gRlMucmVhZChzdHJlYW0sc2xhYixidWYsbmJ5dGUpfWNhdGNoKGUpe0ZTLmhhbmRsZUZTRXJyb3IoZSk7cmV0dXJuLTF9fWZ1bmN0aW9uIF9mcmVhZChwdHIsc2l6ZSxuaXRlbXMsc3RyZWFtKXt2YXIgYnl0ZXNUb1JlYWQ9bml0ZW1zKnNpemU7aWYoYnl0ZXNUb1JlYWQ9PTApe3JldHVybiAwfXZhciBieXRlc1JlYWQ9MDt2YXIgc3RyZWFtT2JqPUZTLmdldFN0cmVhbUZyb21QdHIoc3RyZWFtKTtpZighc3RyZWFtT2JqKXtfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FQkFERik7cmV0dXJuIDB9d2hpbGUoc3RyZWFtT2JqLnVuZ290dGVuLmxlbmd0aCYmYnl0ZXNUb1JlYWQ+MCl7SEVBUDhbcHRyKys+PjBdPXN0cmVhbU9iai51bmdvdHRlbi5wb3AoKTtieXRlc1RvUmVhZC0tO2J5dGVzUmVhZCsrfXZhciBlcnI9X3JlYWQoc3RyZWFtT2JqLmZkLHB0cixieXRlc1RvUmVhZCk7aWYoZXJyPT0tMSl7aWYoc3RyZWFtT2JqKXN0cmVhbU9iai5lcnJvcj10cnVlO3JldHVybiAwfWJ5dGVzUmVhZCs9ZXJyO2lmKGJ5dGVzUmVhZDxieXRlc1RvUmVhZClzdHJlYW1PYmouZW9mPXRydWU7cmV0dXJuIE1hdGguZmxvb3IoYnl0ZXNSZWFkL3NpemUpfWZ1bmN0aW9uIF9mZ2V0YyhzdHJlYW0pe3ZhciBzdHJlYW1PYmo9RlMuZ2V0U3RyZWFtRnJvbVB0cihzdHJlYW0pO2lmKCFzdHJlYW1PYmopcmV0dXJuLTE7aWYoc3RyZWFtT2JqLmVvZnx8c3RyZWFtT2JqLmVycm9yKXJldHVybi0xO3ZhciByZXQ9X2ZyZWFkKF9mZ2V0Yy5yZXQsMSwxLHN0cmVhbSk7aWYocmV0PT0wKXtyZXR1cm4tMX1lbHNlIGlmKHJldD09LTEpe3N0cmVhbU9iai5lcnJvcj10cnVlO3JldHVybi0xfWVsc2V7cmV0dXJuIEhFQVBVOFtfZmdldGMucmV0Pj4wXX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW12YWwoKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfZW12YWwiKTthYm9ydCgtMSl9ZnVuY3Rpb24gX19fZ3h4X3BlcnNvbmFsaXR5X3YwKCl7fWZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpe3N3aXRjaChuYW1lKXtjYXNlIDMwOnJldHVybiBQQUdFX1NJWkU7Y2FzZSAxMzI6Y2FzZSAxMzM6Y2FzZSAxMjpjYXNlIDEzNzpjYXNlIDEzODpjYXNlIDE1OmNhc2UgMjM1OmNhc2UgMTY6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgMTk6Y2FzZSAyMDpjYXNlIDE0OTpjYXNlIDEzOmNhc2UgMTA6Y2FzZSAyMzY6Y2FzZSAxNTM6Y2FzZSA5OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDE1OTpjYXNlIDE1NDpjYXNlIDE0OmNhc2UgNzc6Y2FzZSA3ODpjYXNlIDEzOTpjYXNlIDgwOmNhc2UgODE6Y2FzZSA3OTpjYXNlIDgyOmNhc2UgNjg6Y2FzZSA2NzpjYXNlIDE2NDpjYXNlIDExOmNhc2UgMjk6Y2FzZSA0NzpjYXNlIDQ4OmNhc2UgOTU6Y2FzZSA1MjpjYXNlIDUxOmNhc2UgNDY6cmV0dXJuIDIwMDgwOTtjYXNlIDI3OmNhc2UgMjQ2OmNhc2UgMTI3OmNhc2UgMTI4OmNhc2UgMjM6Y2FzZSAyNDpjYXNlIDE2MDpjYXNlIDE2MTpjYXNlIDE4MTpjYXNlIDE4MjpjYXNlIDI0MjpjYXNlIDE4MzpjYXNlIDE4NDpjYXNlIDI0MzpjYXNlIDI0NDpjYXNlIDI0NTpjYXNlIDE2NTpjYXNlIDE3ODpjYXNlIDE3OTpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSAxNjg6Y2FzZSAxNjk6Y2FzZSAxNzU6Y2FzZSAxNzA6Y2FzZSAxNzE6Y2FzZSAxNzI6Y2FzZSA5NzpjYXNlIDc2OmNhc2UgMzI6Y2FzZSAxNzM6Y2FzZSAzNTpyZXR1cm4tMTtjYXNlIDE3NjpjYXNlIDE3NzpjYXNlIDc6Y2FzZSAxNTU6Y2FzZSA4OmNhc2UgMTU3OmNhc2UgMTI1OmNhc2UgMTI2OmNhc2UgOTI6Y2FzZSA5MzpjYXNlIDEyOTpjYXNlIDEzMDpjYXNlIDEzMTpjYXNlIDk0OmNhc2UgOTE6cmV0dXJuIDE7Y2FzZSA3NDpjYXNlIDYwOmNhc2UgNjk6Y2FzZSA3MDpjYXNlIDQ6cmV0dXJuIDEwMjQ7Y2FzZSAzMTpjYXNlIDQyOmNhc2UgNzI6cmV0dXJuIDMyO2Nhc2UgODc6Y2FzZSAyNjpjYXNlIDMzOnJldHVybiAyMTQ3NDgzNjQ3O2Nhc2UgMzQ6Y2FzZSAxOnJldHVybiA0NzgzOTtjYXNlIDM4OmNhc2UgMzY6cmV0dXJuIDk5O2Nhc2UgNDM6Y2FzZSAzNzpyZXR1cm4gMjA0ODtjYXNlIDA6cmV0dXJuIDIwOTcxNTI7Y2FzZSAzOnJldHVybiA2NTUzNjtjYXNlIDI4OnJldHVybiAzMjc2ODtjYXNlIDQ0OnJldHVybiAzMjc2NztjYXNlIDc1OnJldHVybiAxNjM4NDtjYXNlIDM5OnJldHVybiAxZTM7Y2FzZSA4OTpyZXR1cm4gNzAwO2Nhc2UgNzE6cmV0dXJuIDI1NjtjYXNlIDQwOnJldHVybiAyNTU7Y2FzZSAyOnJldHVybiAxMDA7Y2FzZSAxODA6cmV0dXJuIDY0O2Nhc2UgMjU6cmV0dXJuIDIwO2Nhc2UgNTpyZXR1cm4gMTY7Y2FzZSA2OnJldHVybiA2O2Nhc2UgNzM6cmV0dXJuIDQ7Y2FzZSA4NDpyZXR1cm4gMX1fX19zZXRFcnJObyhFUlJOT19DT0RFUy5FSU5WQUwpO3JldHVybi0xfU1vZHVsZVsiX2JpdHNoaWZ0NjRMc2hyIl09X2JpdHNoaWZ0NjRMc2hyO2Z1bmN0aW9uIF9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCl7cmV0dXJuIDB9ZnVuY3Rpb24gX19leGl0KHN0YXR1cyl7TW9kdWxlWyJleGl0Il0oc3RhdHVzKX1mdW5jdGlvbiBfZXhpdChzdGF0dXMpe19fZXhpdChzdGF0dXMpfWZ1bmN0aW9uIF9fWlN0OXRlcm1pbmF0ZXYoKXtfZXhpdCgtMTIzNCl9ZnVuY3Rpb24gX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCl7fWZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCxzcmMsbnVtKXtIRUFQVTguc2V0KEhFQVBVOC5zdWJhcnJheShzcmMsc3JjK251bSksZGVzdCk7cmV0dXJuIGRlc3R9TW9kdWxlWyJfbWVtY3B5Il09X21lbWNweTtmdW5jdGlvbiBfc2JyayhieXRlcyl7dmFyIHNlbGY9X3Nicms7aWYoIXNlbGYuY2FsbGVkKXtEWU5BTUlDVE9QPWFsaWduTWVtb3J5UGFnZShEWU5BTUlDVE9QKTtzZWxmLmNhbGxlZD10cnVlO2Fzc2VydChSdW50aW1lLmR5bmFtaWNBbGxvYyk7c2VsZi5hbGxvYz1SdW50aW1lLmR5bmFtaWNBbGxvYztSdW50aW1lLmR5bmFtaWNBbGxvYz0oZnVuY3Rpb24oKXthYm9ydCgiY2Fubm90IGR5bmFtaWNhbGx5IGFsbG9jYXRlLCBzYnJrIG5vdyBoYXMgY29udHJvbCIpfSl9dmFyIHJldD1EWU5BTUlDVE9QO2lmKGJ5dGVzIT0wKXNlbGYuYWxsb2MoYnl0ZXMpO3JldHVybiByZXR9ZnVuY3Rpb24gX25ld2xvY2FsZShtYXNrLGxvY2FsZSxiYXNlKXtyZXR1cm4gX21hbGxvYyg0KX1Nb2R1bGVbIl9tZW1tb3ZlIl09X21lbW1vdmU7ZnVuY3Rpb24gX19fZXJybm9fbG9jYXRpb24oKXtyZXR1cm4gX19fZXJybm9fc3RhdGV9ZnVuY3Rpb24gX3N0cmVycm9yX3IoZXJybnVtLHN0cmVycmJ1ZixidWZsZW4pe2lmKGVycm51bSBpbiBFUlJOT19NRVNTQUdFUyl7aWYoRVJSTk9fTUVTU0FHRVNbZXJybnVtXS5sZW5ndGg+YnVmbGVuLTEpe3JldHVybiBfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FUkFOR0UpfWVsc2V7dmFyIG1zZz1FUlJOT19NRVNTQUdFU1tlcnJudW1dO3dyaXRlQXNjaWlUb01lbW9yeShtc2csc3RyZXJyYnVmKTtyZXR1cm4gMH19ZWxzZXtyZXR1cm4gX19fc2V0RXJyTm8oRVJSTk9fQ09ERVMuRUlOVkFMKX19ZnVuY3Rpb24gX3N0cmVycm9yKGVycm51bSl7aWYoIV9zdHJlcnJvci5idWZmZXIpX3N0cmVycm9yLmJ1ZmZlcj1fbWFsbG9jKDI1Nik7X3N0cmVycm9yX3IoZXJybnVtLF9zdHJlcnJvci5idWZmZXIsMjU2KTtyZXR1cm4gX3N0cmVycm9yLmJ1ZmZlcn1mdW5jdGlvbiBfcHRocmVhZF9tdXRleF9kZXN0cm95KCl7fWZ1bmN0aW9uIF9jYXRjbG9zZShjYXRkKXtyZXR1cm4gMH1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldygpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldyIpO2Fib3J0KC0xKX1mdW5jdGlvbiBfX19jeGFfZ3VhcmRfcmVsZWFzZSgpe31mdW5jdGlvbiBfdW5nZXRjKGMsc3RyZWFtKXtzdHJlYW09RlMuZ2V0U3RyZWFtRnJvbVB0cihzdHJlYW0pO2lmKCFzdHJlYW0pe3JldHVybi0xfWlmKGM9PT0tMSl7cmV0dXJuIGN9Yz11blNpZ24oYyYyNTUpO3N0cmVhbS51bmdvdHRlbi5wdXNoKGMpO3N0cmVhbS5lb2Y9ZmFsc2U7cmV0dXJuIGN9ZnVuY3Rpb24gX3VzZWxvY2FsZShsb2NhbGUpe3JldHVybiAwfWZ1bmN0aW9uIF92c25wcmludGYocyxuLGZvcm1hdCx2YV9hcmcpe3JldHVybiBfc25wcmludGYocyxuLGZvcm1hdCxIRUFQMzJbdmFfYXJnPj4yXSl9ZnVuY3Rpb24gX19nZXRGbG9hdCh0ZXh0KXtyZXR1cm4vXlsrLV0/WzAtOV0qXC4/WzAtOV0rKFtlRV1bKy1dP1swLTldKyk/Ly5leGVjKHRleHQpfWZ1bmN0aW9uIF9fc2NhblN0cmluZyhmb3JtYXQsZ2V0LHVuZ2V0LHZhcmFyZ3Mpe2lmKCFfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSl7X19zY2FuU3RyaW5nLndoaXRlU3BhY2U9e307X19zY2FuU3RyaW5nLndoaXRlU3BhY2VbMzJdPTE7X19zY2FuU3RyaW5nLndoaXRlU3BhY2VbOV09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxMF09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxMV09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxMl09MTtfX3NjYW5TdHJpbmcud2hpdGVTcGFjZVsxM109MX1mb3JtYXQ9UG9pbnRlcl9zdHJpbmdpZnkoZm9ybWF0KTt2YXIgc29GYXI9MDtpZihmb3JtYXQuaW5kZXhPZigiJW4iKT49MCl7dmFyIF9nZXQ9Z2V0O2dldD1mdW5jdGlvbiBnZXQoKXtzb0ZhcisrO3JldHVybiBfZ2V0KCl9O3ZhciBfdW5nZXQ9dW5nZXQ7dW5nZXQ9ZnVuY3Rpb24gdW5nZXQoKXtzb0Zhci0tO3JldHVybiBfdW5nZXQoKX19dmFyIGZvcm1hdEluZGV4PTA7dmFyIGFyZ3NpPTA7dmFyIGZpZWxkcz0wO3ZhciBhcmdJbmRleD0wO3ZhciBuZXh0O21haW5Mb29wOmZvcih2YXIgZm9ybWF0SW5kZXg9MDtmb3JtYXRJbmRleDxmb3JtYXQubGVuZ3RoOyl7aWYoZm9ybWF0W2Zvcm1hdEluZGV4XT09PSIlIiYmZm9ybWF0W2Zvcm1hdEluZGV4KzFdPT0ibiIpe3ZhciBhcmdQdHI9SEVBUDMyW3ZhcmFyZ3MrYXJnSW5kZXg+PjJdO2FyZ0luZGV4Kz1SdW50aW1lLmdldEFsaWduU2l6ZSgidm9pZCoiLG51bGwsdHJ1ZSk7SEVBUDMyW2FyZ1B0cj4+Ml09c29GYXI7Zm9ybWF0SW5kZXgrPTI7Y29udGludWV9aWYoZm9ybWF0W2Zvcm1hdEluZGV4XT09PSIlIil7dmFyIG5leHRDPWZvcm1hdC5pbmRleE9mKCJjIixmb3JtYXRJbmRleCsxKTtpZihuZXh0Qz4wKXt2YXIgbWF4eD0xO2lmKG5leHRDPmZvcm1hdEluZGV4KzEpe3ZhciBzdWI9Zm9ybWF0LnN1YnN0cmluZyhmb3JtYXRJbmRleCsxLG5leHRDKTttYXh4PXBhcnNlSW50KHN1Yik7aWYobWF4eCE9c3ViKW1heHg9MH1pZihtYXh4KXt2YXIgYXJnUHRyPUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXTthcmdJbmRleCs9UnVudGltZS5nZXRBbGlnblNpemUoInZvaWQqIixudWxsLHRydWUpO2ZpZWxkcysrO2Zvcih2YXIgaT0wO2k8bWF4eDtpKyspe25leHQ9Z2V0KCk7SEVBUDhbYXJnUHRyKys+PjBdPW5leHQ7aWYobmV4dD09PTApcmV0dXJuIGk+MD9maWVsZHM6ZmllbGRzLTF9Zm9ybWF0SW5kZXgrPW5leHRDLWZvcm1hdEluZGV4KzE7Y29udGludWV9fX1pZihmb3JtYXRbZm9ybWF0SW5kZXhdPT09IiUiJiZmb3JtYXQuaW5kZXhPZigiWyIsZm9ybWF0SW5kZXgrMSk+MCl7dmFyIG1hdGNoPS9cJShbMC05XSopXFsoXF4pPyhcXT9bXlxdXSopXF0vLmV4ZWMoZm9ybWF0LnN1YnN0cmluZyhmb3JtYXRJbmRleCkpO2lmKG1hdGNoKXt2YXIgbWF4TnVtQ2hhcmFjdGVycz1wYXJzZUludChtYXRjaFsxXSl8fEluZmluaXR5O3ZhciBuZWdhdGVTY2FuTGlzdD1tYXRjaFsyXT09PSJeIjt2YXIgc2Nhbkxpc3Q9bWF0Y2hbM107dmFyIG1pZGRsZURhc2hNYXRjaDt3aGlsZShtaWRkbGVEYXNoTWF0Y2g9LyhbXlwtXSlcLShbXlwtXSkvLmV4ZWMoc2Nhbkxpc3QpKXt2YXIgcmFuZ2VTdGFydENoYXJDb2RlPW1pZGRsZURhc2hNYXRjaFsxXS5jaGFyQ29kZUF0KDApO3ZhciByYW5nZUVuZENoYXJDb2RlPW1pZGRsZURhc2hNYXRjaFsyXS5jaGFyQ29kZUF0KDApO2Zvcih2YXIgZXhwYW5kZWQ9IiI7cmFuZ2VTdGFydENoYXJDb2RlPD1yYW5nZUVuZENoYXJDb2RlO2V4cGFuZGVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJhbmdlU3RhcnRDaGFyQ29kZSsrKSk7c2Nhbkxpc3Q9c2Nhbkxpc3QucmVwbGFjZShtaWRkbGVEYXNoTWF0Y2hbMV0rIi0iK21pZGRsZURhc2hNYXRjaFsyXSxleHBhbmRlZCl9dmFyIGFyZ1B0cj1IRUFQMzJbdmFyYXJncythcmdJbmRleD4+Ml07YXJnSW5kZXgrPVJ1bnRpbWUuZ2V0QWxpZ25TaXplKCJ2b2lkKiIsbnVsbCx0cnVlKTtmaWVsZHMrKztmb3IodmFyIGk9MDtpPG1heE51bUNoYXJhY3RlcnM7aSsrKXtuZXh0PWdldCgpO2lmKG5lZ2F0ZVNjYW5MaXN0KXtpZihzY2FuTGlzdC5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpPDApe0hFQVA4W2FyZ1B0cisrPj4wXT1uZXh0fWVsc2V7dW5nZXQoKTticmVha319ZWxzZXtpZihzY2FuTGlzdC5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpPj0wKXtIRUFQOFthcmdQdHIrKz4+MF09bmV4dH1lbHNle3VuZ2V0KCk7YnJlYWt9fX1IRUFQOFthcmdQdHIrKz4+MF09MDtmb3JtYXRJbmRleCs9bWF0Y2hbMF0ubGVuZ3RoO2NvbnRpbnVlfX13aGlsZSgxKXtuZXh0PWdldCgpO2lmKG5leHQ9PTApcmV0dXJuIGZpZWxkcztpZighKG5leHQgaW4gX19zY2FuU3RyaW5nLndoaXRlU3BhY2UpKWJyZWFrfXVuZ2V0KCk7aWYoZm9ybWF0W2Zvcm1hdEluZGV4XT09PSIlIil7Zm9ybWF0SW5kZXgrKzt2YXIgc3VwcHJlc3NBc3NpZ25tZW50PWZhbHNlO2lmKGZvcm1hdFtmb3JtYXRJbmRleF09PSIqIil7c3VwcHJlc3NBc3NpZ25tZW50PXRydWU7Zm9ybWF0SW5kZXgrK312YXIgbWF4U3BlY2lmaWVyU3RhcnQ9Zm9ybWF0SW5kZXg7d2hpbGUoZm9ybWF0W2Zvcm1hdEluZGV4XS5jaGFyQ29kZUF0KDApPj00OCYmZm9ybWF0W2Zvcm1hdEluZGV4XS5jaGFyQ29kZUF0KDApPD01Nyl7Zm9ybWF0SW5kZXgrK312YXIgbWF4XztpZihmb3JtYXRJbmRleCE9bWF4U3BlY2lmaWVyU3RhcnQpe21heF89cGFyc2VJbnQoZm9ybWF0LnNsaWNlKG1heFNwZWNpZmllclN0YXJ0LGZvcm1hdEluZGV4KSwxMCl9dmFyIGxvbmdfPWZhbHNlO3ZhciBoYWxmPWZhbHNlO3ZhciBxdWFydGVyPWZhbHNlO3ZhciBsb25nTG9uZz1mYWxzZTtpZihmb3JtYXRbZm9ybWF0SW5kZXhdPT0ibCIpe2xvbmdfPXRydWU7Zm9ybWF0SW5kZXgrKztpZihmb3JtYXRbZm9ybWF0SW5kZXhdPT0ibCIpe2xvbmdMb25nPXRydWU7Zm9ybWF0SW5kZXgrK319ZWxzZSBpZihmb3JtYXRbZm9ybWF0SW5kZXhdPT0iaCIpe2hhbGY9dHJ1ZTtmb3JtYXRJbmRleCsrO2lmKGZvcm1hdFtmb3JtYXRJbmRleF09PSJoIil7cXVhcnRlcj10cnVlO2Zvcm1hdEluZGV4Kyt9fXZhciB0eXBlPWZvcm1hdFtmb3JtYXRJbmRleF07Zm9ybWF0SW5kZXgrKzt2YXIgY3Vycj0wO3ZhciBidWZmZXI9W107aWYodHlwZT09ImYifHx0eXBlPT0iZSJ8fHR5cGU9PSJnInx8dHlwZT09IkYifHx0eXBlPT0iRSJ8fHR5cGU9PSJHIil7bmV4dD1nZXQoKTt3aGlsZShuZXh0PjAmJiEobmV4dCBpbiBfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSkpe2J1ZmZlci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpO25leHQ9Z2V0KCl9dmFyIG09X19nZXRGbG9hdChidWZmZXIuam9pbigiIikpO3ZhciBsYXN0PW0/bVswXS5sZW5ndGg6MDtmb3IodmFyIGk9MDtpPGJ1ZmZlci5sZW5ndGgtbGFzdCsxO2krKyl7dW5nZXQoKX1idWZmZXIubGVuZ3RoPWxhc3R9ZWxzZXtuZXh0PWdldCgpO3ZhciBmaXJzdD10cnVlO2lmKCh0eXBlPT0ieCJ8fHR5cGU9PSJYIikmJm5leHQ9PTQ4KXt2YXIgcGVlaz1nZXQoKTtpZihwZWVrPT0xMjB8fHBlZWs9PTg4KXtuZXh0PWdldCgpfWVsc2V7dW5nZXQoKX19d2hpbGUoKGN1cnI8bWF4X3x8aXNOYU4obWF4XykpJiZuZXh0PjApe2lmKCEobmV4dCBpbiBfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSkmJih0eXBlPT0icyJ8fCh0eXBlPT09ImQifHx0eXBlPT0idSJ8fHR5cGU9PSJpIikmJihuZXh0Pj00OCYmbmV4dDw9NTd8fGZpcnN0JiZuZXh0PT00NSl8fCh0eXBlPT09IngifHx0eXBlPT09IlgiKSYmKG5leHQ+PTQ4JiZuZXh0PD01N3x8bmV4dD49OTcmJm5leHQ8PTEwMnx8bmV4dD49NjUmJm5leHQ8PTcwKSkmJihmb3JtYXRJbmRleD49Zm9ybWF0Lmxlbmd0aHx8bmV4dCE9PWZvcm1hdFtmb3JtYXRJbmRleF0uY2hhckNvZGVBdCgwKSkpe2J1ZmZlci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dCkpO25leHQ9Z2V0KCk7Y3VycisrO2ZpcnN0PWZhbHNlfWVsc2V7YnJlYWt9fXVuZ2V0KCl9aWYoYnVmZmVyLmxlbmd0aD09PTApcmV0dXJuIDA7aWYoc3VwcHJlc3NBc3NpZ25tZW50KWNvbnRpbnVlO3ZhciB0ZXh0PWJ1ZmZlci5qb2luKCIiKTt2YXIgYXJnUHRyPUhFQVAzMlt2YXJhcmdzK2FyZ0luZGV4Pj4yXTthcmdJbmRleCs9UnVudGltZS5nZXRBbGlnblNpemUoInZvaWQqIixudWxsLHRydWUpO3ZhciBiYXNlPTEwO3N3aXRjaCh0eXBlKXtjYXNlIlgiOmNhc2UieCI6YmFzZT0xNjtjYXNlImQiOmNhc2UidSI6Y2FzZSJpIjppZihxdWFydGVyKXtIRUFQOFthcmdQdHI+PjBdPXBhcnNlSW50KHRleHQsYmFzZSl9ZWxzZSBpZihoYWxmKXtIRUFQMTZbYXJnUHRyPj4xXT1wYXJzZUludCh0ZXh0LGJhc2UpfWVsc2UgaWYobG9uZ0xvbmcpe3RlbXBJNjQ9W3BhcnNlSW50KHRleHQsYmFzZSk+Pj4wLCh0ZW1wRG91YmxlPXBhcnNlSW50KHRleHQsYmFzZSksK01hdGhfYWJzKHRlbXBEb3VibGUpPj0rMT90ZW1wRG91YmxlPiswPyhNYXRoX21pbigrTWF0aF9mbG9vcih0ZW1wRG91YmxlLys0Mjk0OTY3Mjk2KSwrNDI5NDk2NzI5NSl8MCk+Pj4wOn5+K01hdGhfY2VpbCgodGVtcERvdWJsZS0gKyh+fnRlbXBEb3VibGU+Pj4wKSkvKzQyOTQ5NjcyOTYpPj4+MDowKV0sSEVBUDMyW2FyZ1B0cj4+Ml09dGVtcEk2NFswXSxIRUFQMzJbYXJnUHRyKzQ+PjJdPXRlbXBJNjRbMV19ZWxzZXtIRUFQMzJbYXJnUHRyPj4yXT1wYXJzZUludCh0ZXh0LGJhc2UpfWJyZWFrO2Nhc2UiRiI6Y2FzZSJmIjpjYXNlIkUiOmNhc2UiZSI6Y2FzZSJHIjpjYXNlImciOmNhc2UiRSI6aWYobG9uZ18pe0hFQVBGNjRbYXJnUHRyPj4zXT1wYXJzZUZsb2F0KHRleHQpfWVsc2V7SEVBUEYzMlthcmdQdHI+PjJdPXBhcnNlRmxvYXQodGV4dCl9YnJlYWs7Y2FzZSJzIjp2YXIgYXJyYXk9aW50QXJyYXlGcm9tU3RyaW5nKHRleHQpO2Zvcih2YXIgaj0wO2o8YXJyYXkubGVuZ3RoO2orKyl7SEVBUDhbYXJnUHRyK2o+PjBdPWFycmF5W2pdfWJyZWFrfWZpZWxkcysrfWVsc2UgaWYoZm9ybWF0W2Zvcm1hdEluZGV4XS5jaGFyQ29kZUF0KDApaW4gX19zY2FuU3RyaW5nLndoaXRlU3BhY2Upe25leHQ9Z2V0KCk7d2hpbGUobmV4dCBpbiBfX3NjYW5TdHJpbmcud2hpdGVTcGFjZSl7aWYobmV4dDw9MClicmVhayBtYWluTG9vcDtuZXh0PWdldCgpfXVuZ2V0KG5leHQpO2Zvcm1hdEluZGV4Kyt9ZWxzZXtuZXh0PWdldCgpO2lmKGZvcm1hdFtmb3JtYXRJbmRleF0uY2hhckNvZGVBdCgwKSE9PW5leHQpe3VuZ2V0KG5leHQpO2JyZWFrIG1haW5Mb29wfWZvcm1hdEluZGV4Kyt9fXJldHVybiBmaWVsZHN9ZnVuY3Rpb24gX3NzY2FuZihzLGZvcm1hdCx2YXJhcmdzKXt2YXIgaW5kZXg9MDtmdW5jdGlvbiBnZXQoKXtyZXR1cm4gSEVBUDhbcytpbmRleCsrPj4wXX1mdW5jdGlvbiB1bmdldCgpe2luZGV4LS19cmV0dXJuIF9fc2NhblN0cmluZyhmb3JtYXQsZ2V0LHVuZ2V0LHZhcmFyZ3MpfWZ1bmN0aW9uIF92c3NjYW5mKHMsZm9ybWF0LHZhX2FyZyl7cmV0dXJuIF9zc2NhbmYocyxmb3JtYXQsSEVBUDMyW3ZhX2FyZz4+Ml0pfWZ1bmN0aW9uIF9fX2Fzc2VydF9mYWlsKGNvbmRpdGlvbixmaWxlbmFtZSxsaW5lLGZ1bmMpe0FCT1JUPXRydWU7dGhyb3ciQXNzZXJ0aW9uIGZhaWxlZDogIitQb2ludGVyX3N0cmluZ2lmeShjb25kaXRpb24pKyIsIGF0OiAiK1tmaWxlbmFtZT9Qb2ludGVyX3N0cmluZ2lmeShmaWxlbmFtZSk6InVua25vd24gZmlsZW5hbWUiLGxpbmUsZnVuYz9Qb2ludGVyX3N0cmluZ2lmeShmdW5jKToidW5rbm93biBmdW5jdGlvbiJdKyIgYXQgIitzdGFja1RyYWNlKCl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdm9pZCgpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl92b2lkIik7YWJvcnQoLTEpfU1vZHVsZVsiX21lbXNldCJdPV9tZW1zZXQ7dmFyIF9CSXRvRD10cnVlO2Z1bmN0aW9uIF9faXNMZWFwWWVhcih5ZWFyKXtyZXR1cm4geWVhciU0PT09MCYmKHllYXIlMTAwIT09MHx8eWVhciU0MDA9PT0wKX1mdW5jdGlvbiBfX2FycmF5U3VtKGFycmF5LGluZGV4KXt2YXIgc3VtPTA7Zm9yKHZhciBpPTA7aTw9aW5kZXg7c3VtKz1hcnJheVtpKytdKTtyZXR1cm4gc3VtfXZhciBfX01PTlRIX0RBWVNfTEVBUD1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO3ZhciBfX01PTlRIX0RBWVNfUkVHVUxBUj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIF9fYWRkRGF5cyhkYXRlLGRheXMpe3ZhciBuZXdEYXRlPW5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTt3aGlsZShkYXlzPjApe3ZhciBsZWFwPV9faXNMZWFwWWVhcihuZXdEYXRlLmdldEZ1bGxZZWFyKCkpO3ZhciBjdXJyZW50TW9udGg9bmV3RGF0ZS5nZXRNb250aCgpO3ZhciBkYXlzSW5DdXJyZW50TW9udGg9KGxlYXA/X19NT05USF9EQVlTX0xFQVA6X19NT05USF9EQVlTX1JFR1VMQVIpW2N1cnJlbnRNb250aF07aWYoZGF5cz5kYXlzSW5DdXJyZW50TW9udGgtbmV3RGF0ZS5nZXREYXRlKCkpe2RheXMtPWRheXNJbkN1cnJlbnRNb250aC1uZXdEYXRlLmdldERhdGUoKSsxO25ld0RhdGUuc2V0RGF0ZSgxKTtpZihjdXJyZW50TW9udGg8MTEpe25ld0RhdGUuc2V0TW9udGgoY3VycmVudE1vbnRoKzEpfWVsc2V7bmV3RGF0ZS5zZXRNb250aCgwKTtuZXdEYXRlLnNldEZ1bGxZZWFyKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSsxKX19ZWxzZXtuZXdEYXRlLnNldERhdGUobmV3RGF0ZS5nZXREYXRlKCkrZGF5cyk7cmV0dXJuIG5ld0RhdGV9fXJldHVybiBuZXdEYXRlfWZ1bmN0aW9uIF9zdHJmdGltZShzLG1heHNpemUsZm9ybWF0LHRtKXt2YXIgZGF0ZT17dG1fc2VjOkhFQVAzMlt0bT4+Ml0sdG1fbWluOkhFQVAzMlt0bSs0Pj4yXSx0bV9ob3VyOkhFQVAzMlt0bSs4Pj4yXSx0bV9tZGF5OkhFQVAzMlt0bSsxMj4+Ml0sdG1fbW9uOkhFQVAzMlt0bSsxNj4+Ml0sdG1feWVhcjpIRUFQMzJbdG0rMjA+PjJdLHRtX3dkYXk6SEVBUDMyW3RtKzI0Pj4yXSx0bV95ZGF5OkhFQVAzMlt0bSsyOD4+Ml0sdG1faXNkc3Q6SEVBUDMyW3RtKzMyPj4yXX07dmFyIHBhdHRlcm49UG9pbnRlcl9zdHJpbmdpZnkoZm9ybWF0KTt2YXIgRVhQQU5TSU9OX1JVTEVTXzE9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMifTtmb3IodmFyIHJ1bGUgaW4gRVhQQU5TSU9OX1JVTEVTXzEpe3BhdHRlcm49cGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwiZyIpLEVYUEFOU0lPTl9SVUxFU18xW3J1bGVdKX12YXIgV0VFS0RBWVM9WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdO3ZhciBNT05USFM9WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdO2Z1bmN0aW9uIGxlYWRpbmdTb21ldGhpbmcodmFsdWUsZGlnaXRzLGNoYXJhY3Rlcil7dmFyIHN0cj10eXBlb2YgdmFsdWU9PT0ibnVtYmVyIj92YWx1ZS50b1N0cmluZygpOnZhbHVlfHwiIjt3aGlsZShzdHIubGVuZ3RoPGRpZ2l0cyl7c3RyPWNoYXJhY3RlclswXStzdHJ9cmV0dXJuIHN0cn1mdW5jdGlvbiBsZWFkaW5nTnVsbHModmFsdWUsZGlnaXRzKXtyZXR1cm4gbGVhZGluZ1NvbWV0aGluZyh2YWx1ZSxkaWdpdHMsIjAiKX1mdW5jdGlvbiBjb21wYXJlQnlEYXkoZGF0ZTEsZGF0ZTIpe2Z1bmN0aW9uIHNnbih2YWx1ZSl7cmV0dXJuIHZhbHVlPDA/LTE6dmFsdWU+MD8xOjB9dmFyIGNvbXBhcmU7aWYoKGNvbXBhcmU9c2duKGRhdGUxLmdldEZ1bGxZZWFyKCktZGF0ZTIuZ2V0RnVsbFllYXIoKSkpPT09MCl7aWYoKGNvbXBhcmU9c2duKGRhdGUxLmdldE1vbnRoKCktZGF0ZTIuZ2V0TW9udGgoKSkpPT09MCl7Y29tcGFyZT1zZ24oZGF0ZTEuZ2V0RGF0ZSgpLWRhdGUyLmdldERhdGUoKSl9fXJldHVybiBjb21wYXJlfWZ1bmN0aW9uIGdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGgpe3N3aXRjaChqYW5Gb3VydGguZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCktMSwxMSwyOSk7Y2FzZSAxOnJldHVybiBqYW5Gb3VydGg7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCksMCwyKTtjYXNlIDQ6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGphbkZvdXJ0aC5nZXRGdWxsWWVhcigpLTEsMTEsMzApfX1mdW5jdGlvbiBnZXRXZWVrQmFzZWRZZWFyKGRhdGUpe3ZhciB0aGlzRGF0ZT1fX2FkZERheXMobmV3IERhdGUoZGF0ZS50bV95ZWFyKzE5MDAsMCwxKSxkYXRlLnRtX3lkYXkpO3ZhciBqYW5Gb3VydGhUaGlzWWVhcj1uZXcgRGF0ZSh0aGlzRGF0ZS5nZXRGdWxsWWVhcigpLDAsNCk7dmFyIGphbkZvdXJ0aE5leHRZZWFyPW5ldyBEYXRlKHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkrMSwwLDQpO3ZhciBmaXJzdFdlZWtTdGFydFRoaXNZZWFyPWdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGhUaGlzWWVhcik7dmFyIGZpcnN0V2Vla1N0YXJ0TmV4dFllYXI9Z2V0Rmlyc3RXZWVrU3RhcnREYXRlKGphbkZvdXJ0aE5leHRZZWFyKTtpZihjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnRUaGlzWWVhcix0aGlzRGF0ZSk8PTApe2lmKGNvbXBhcmVCeURheShmaXJzdFdlZWtTdGFydE5leHRZZWFyLHRoaXNEYXRlKTw9MCl7cmV0dXJuIHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkrMX1lbHNle3JldHVybiB0aGlzRGF0ZS5nZXRGdWxsWWVhcigpfX1lbHNle3JldHVybiB0aGlzRGF0ZS5nZXRGdWxsWWVhcigpLTF9fXZhciBFWFBBTlNJT05fUlVMRVNfMj17IiVhIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIFdFRUtEQVlTW2RhdGUudG1fd2RheV0uc3Vic3RyaW5nKDAsMyl9KSwiJUEiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gV0VFS0RBWVNbZGF0ZS50bV93ZGF5XX0pLCIlYiI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBNT05USFNbZGF0ZS50bV9tb25dLnN1YnN0cmluZygwLDMpfSksIiVCIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIE1PTlRIU1tkYXRlLnRtX21vbl19KSwiJUMiOihmdW5jdGlvbihkYXRlKXt2YXIgeWVhcj1kYXRlLnRtX3llYXIrMTkwMDtyZXR1cm4gbGVhZGluZ051bGxzKE1hdGguZmxvb3IoeWVhci8xMDApLDIpfSksIiVkIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGxlYWRpbmdOdWxscyhkYXRlLnRtX21kYXksMil9KSwiJWUiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gbGVhZGluZ1NvbWV0aGluZyhkYXRlLnRtX21kYXksMiwiICIpfSksIiVnIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGdldFdlZWtCYXNlZFllYXIoZGF0ZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMil9KSwiJUciOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gZ2V0V2Vla0Jhc2VkWWVhcihkYXRlKX0pLCIlSCI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9ob3VyLDIpfSksIiVJIjooZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGxlYWRpbmdOdWxscyhkYXRlLnRtX2hvdXI8MTM/ZGF0ZS50bV9ob3VyOmRhdGUudG1faG91ci0xMiwyKX0pLCIlaiI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9tZGF5K19fYXJyYXlTdW0oX19pc0xlYXBZZWFyKGRhdGUudG1feWVhcisxOTAwKT9fX01PTlRIX0RBWVNfTEVBUDpfX01PTlRIX0RBWVNfUkVHVUxBUixkYXRlLnRtX21vbi0xKSwzKX0pLCIlbSI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9tb24rMSwyKX0pLCIlTSI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9taW4sMil9KSwiJW4iOihmdW5jdGlvbigpe3JldHVybiJcbiJ9KSwiJXAiOihmdW5jdGlvbihkYXRlKXtpZihkYXRlLnRtX2hvdXI+MCYmZGF0ZS50bV9ob3VyPDEzKXtyZXR1cm4iQU0ifWVsc2V7cmV0dXJuIlBNIn19KSwiJVMiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gbGVhZGluZ051bGxzKGRhdGUudG1fc2VjLDIpfSksIiV0IjooZnVuY3Rpb24oKXtyZXR1cm4iXHQifSksIiV1IjooZnVuY3Rpb24oZGF0ZSl7dmFyIGRheT1uZXcgRGF0ZShkYXRlLnRtX3llYXIrMTkwMCxkYXRlLnRtX21vbisxLGRhdGUudG1fbWRheSwwLDAsMCwwKTtyZXR1cm4gZGF5LmdldERheSgpfHw3fSksIiVVIjooZnVuY3Rpb24oZGF0ZSl7dmFyIGphbkZpcnN0PW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAwLDAsMSk7dmFyIGZpcnN0U3VuZGF5PWphbkZpcnN0LmdldERheSgpPT09MD9qYW5GaXJzdDpfX2FkZERheXMoamFuRmlyc3QsNy1qYW5GaXJzdC5nZXREYXkoKSk7dmFyIGVuZERhdGU9bmV3IERhdGUoZGF0ZS50bV95ZWFyKzE5MDAsZGF0ZS50bV9tb24sZGF0ZS50bV9tZGF5KTtpZihjb21wYXJlQnlEYXkoZmlyc3RTdW5kYXksZW5kRGF0ZSk8MCl7dmFyIGZlYnJ1YXJ5Rmlyc3RVbnRpbEVuZE1vbnRoPV9fYXJyYXlTdW0oX19pc0xlYXBZZWFyKGVuZERhdGUuZ2V0RnVsbFllYXIoKSk/X19NT05USF9EQVlTX0xFQVA6X19NT05USF9EQVlTX1JFR1VMQVIsZW5kRGF0ZS5nZXRNb250aCgpLTEpLTMxO3ZhciBmaXJzdFN1bmRheVVudGlsRW5kSmFudWFyeT0zMS1maXJzdFN1bmRheS5nZXREYXRlKCk7dmFyIGRheXM9Zmlyc3RTdW5kYXlVbnRpbEVuZEphbnVhcnkrZmVicnVhcnlGaXJzdFVudGlsRW5kTW9udGgrZW5kRGF0ZS5nZXREYXRlKCk7cmV0dXJuIGxlYWRpbmdOdWxscyhNYXRoLmNlaWwoZGF5cy83KSwyKX1yZXR1cm4gY29tcGFyZUJ5RGF5KGZpcnN0U3VuZGF5LGphbkZpcnN0KT09PTA/IjAxIjoiMDAifSksIiVWIjooZnVuY3Rpb24oZGF0ZSl7dmFyIGphbkZvdXJ0aFRoaXNZZWFyPW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAwLDAsNCk7dmFyIGphbkZvdXJ0aE5leHRZZWFyPW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAxLDAsNCk7dmFyIGZpcnN0V2Vla1N0YXJ0VGhpc1llYXI9Z2V0Rmlyc3RXZWVrU3RhcnREYXRlKGphbkZvdXJ0aFRoaXNZZWFyKTt2YXIgZmlyc3RXZWVrU3RhcnROZXh0WWVhcj1nZXRGaXJzdFdlZWtTdGFydERhdGUoamFuRm91cnRoTmV4dFllYXIpO3ZhciBlbmREYXRlPV9fYWRkRGF5cyhuZXcgRGF0ZShkYXRlLnRtX3llYXIrMTkwMCwwLDEpLGRhdGUudG1feWRheSk7aWYoY29tcGFyZUJ5RGF5KGVuZERhdGUsZmlyc3RXZWVrU3RhcnRUaGlzWWVhcik8MCl7cmV0dXJuIjUzIn1pZihjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnROZXh0WWVhcixlbmREYXRlKTw9MCl7cmV0dXJuIjAxIn12YXIgZGF5c0RpZmZlcmVuY2U7aWYoZmlyc3RXZWVrU3RhcnRUaGlzWWVhci5nZXRGdWxsWWVhcigpPGRhdGUudG1feWVhcisxOTAwKXtkYXlzRGlmZmVyZW5jZT1kYXRlLnRtX3lkYXkrMzItZmlyc3RXZWVrU3RhcnRUaGlzWWVhci5nZXREYXRlKCl9ZWxzZXtkYXlzRGlmZmVyZW5jZT1kYXRlLnRtX3lkYXkrMS1maXJzdFdlZWtTdGFydFRoaXNZZWFyLmdldERhdGUoKX1yZXR1cm4gbGVhZGluZ051bGxzKE1hdGguY2VpbChkYXlzRGlmZmVyZW5jZS83KSwyKX0pLCIldyI6KGZ1bmN0aW9uKGRhdGUpe3ZhciBkYXk9bmV3IERhdGUoZGF0ZS50bV95ZWFyKzE5MDAsZGF0ZS50bV9tb24rMSxkYXRlLnRtX21kYXksMCwwLDAsMCk7cmV0dXJuIGRheS5nZXREYXkoKX0pLCIlVyI6KGZ1bmN0aW9uKGRhdGUpe3ZhciBqYW5GaXJzdD1uZXcgRGF0ZShkYXRlLnRtX3llYXIsMCwxKTt2YXIgZmlyc3RNb25kYXk9amFuRmlyc3QuZ2V0RGF5KCk9PT0xP2phbkZpcnN0Ol9fYWRkRGF5cyhqYW5GaXJzdCxqYW5GaXJzdC5nZXREYXkoKT09PTA/MTo3LWphbkZpcnN0LmdldERheSgpKzEpO3ZhciBlbmREYXRlPW5ldyBEYXRlKGRhdGUudG1feWVhcisxOTAwLGRhdGUudG1fbW9uLGRhdGUudG1fbWRheSk7aWYoY29tcGFyZUJ5RGF5KGZpcnN0TW9uZGF5LGVuZERhdGUpPDApe3ZhciBmZWJydWFyeUZpcnN0VW50aWxFbmRNb250aD1fX2FycmF5U3VtKF9faXNMZWFwWWVhcihlbmREYXRlLmdldEZ1bGxZZWFyKCkpP19fTU9OVEhfREFZU19MRUFQOl9fTU9OVEhfREFZU19SRUdVTEFSLGVuZERhdGUuZ2V0TW9udGgoKS0xKS0zMTt2YXIgZmlyc3RNb25kYXlVbnRpbEVuZEphbnVhcnk9MzEtZmlyc3RNb25kYXkuZ2V0RGF0ZSgpO3ZhciBkYXlzPWZpcnN0TW9uZGF5VW50aWxFbmRKYW51YXJ5K2ZlYnJ1YXJ5Rmlyc3RVbnRpbEVuZE1vbnRoK2VuZERhdGUuZ2V0RGF0ZSgpO3JldHVybiBsZWFkaW5nTnVsbHMoTWF0aC5jZWlsKGRheXMvNyksMil9cmV0dXJuIGNvbXBhcmVCeURheShmaXJzdE1vbmRheSxqYW5GaXJzdCk9PT0wPyIwMSI6IjAwIn0pLCIleSI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybihkYXRlLnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMil9KSwiJVkiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4gZGF0ZS50bV95ZWFyKzE5MDB9KSwiJXoiOihmdW5jdGlvbihkYXRlKXtyZXR1cm4iIn0pLCIlWiI6KGZ1bmN0aW9uKGRhdGUpe3JldHVybiIifSksIiUlIjooZnVuY3Rpb24oKXtyZXR1cm4iJSJ9KX07Zm9yKHZhciBydWxlIGluIEVYUEFOU0lPTl9SVUxFU18yKXtpZihwYXR0ZXJuLmluZGV4T2YocnVsZSk+PTApe3BhdHRlcm49cGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwiZyIpLEVYUEFOU0lPTl9SVUxFU18yW3J1bGVdKGRhdGUpKX19dmFyIGJ5dGVzPWludEFycmF5RnJvbVN0cmluZyhwYXR0ZXJuLGZhbHNlKTtpZihieXRlcy5sZW5ndGg+bWF4c2l6ZSl7cmV0dXJuIDB9d3JpdGVBcnJheVRvTWVtb3J5KGJ5dGVzLHMpO3JldHVybiBieXRlcy5sZW5ndGgtMX1mdW5jdGlvbiBfc3RyZnRpbWVfbChzLG1heHNpemUsZm9ybWF0LHRtKXtyZXR1cm4gX3N0cmZ0aW1lKHMsbWF4c2l6ZSxmb3JtYXQsdG0pfWZ1bmN0aW9uIF9hYm9ydCgpe01vZHVsZVsiYWJvcnQiXSgpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzKCl7TW9kdWxlWyJwcmludEVyciJdKCJtaXNzaW5nIGZ1bmN0aW9uOiBfZW1iaW5kX3JlZ2lzdGVyX2NsYXNzIik7YWJvcnQoLTEpfWZ1bmN0aW9uIF9wdGhyZWFkX2NvbmRfd2FpdCgpe3JldHVybiAwfXZhciBfZmFicz1NYXRoX2Ficzt2YXIgX2dldGM9X2ZnZXRjO2Z1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIoKXtNb2R1bGVbInByaW50RXJyIl0oIm1pc3NpbmcgZnVuY3Rpb246IF9lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlciIpO2Fib3J0KC0xKX12YXIgQnJvd3Nlcj17bWFpbkxvb3A6e3NjaGVkdWxlcjpudWxsLG1ldGhvZDoiIixzaG91bGRQYXVzZTpmYWxzZSxwYXVzZWQ6ZmFsc2UscXVldWU6W10scGF1c2U6KGZ1bmN0aW9uKCl7QnJvd3Nlci5tYWluTG9vcC5zaG91bGRQYXVzZT10cnVlfSkscmVzdW1lOihmdW5jdGlvbigpe2lmKEJyb3dzZXIubWFpbkxvb3AucGF1c2VkKXtCcm93c2VyLm1haW5Mb29wLnBhdXNlZD1mYWxzZTtCcm93c2VyLm1haW5Mb29wLnNjaGVkdWxlcigpfUJyb3dzZXIubWFpbkxvb3Auc2hvdWxkUGF1c2U9ZmFsc2V9KSx1cGRhdGVTdGF0dXM6KGZ1bmN0aW9uKCl7aWYoTW9kdWxlWyJzZXRTdGF0dXMiXSl7dmFyIG1lc3NhZ2U9TW9kdWxlWyJzdGF0dXNNZXNzYWdlIl18fCJQbGVhc2Ugd2FpdC4uLiI7dmFyIHJlbWFpbmluZz1Ccm93c2VyLm1haW5Mb29wLnJlbWFpbmluZ0Jsb2NrZXJzO3ZhciBleHBlY3RlZD1Ccm93c2VyLm1haW5Mb29wLmV4cGVjdGVkQmxvY2tlcnM7aWYocmVtYWluaW5nKXtpZihyZW1haW5pbmc8ZXhwZWN0ZWQpe01vZHVsZVsic2V0U3RhdHVzIl0obWVzc2FnZSsiICgiKyhleHBlY3RlZC1yZW1haW5pbmcpKyIvIitleHBlY3RlZCsiKSIpfWVsc2V7TW9kdWxlWyJzZXRTdGF0dXMiXShtZXNzYWdlKX19ZWxzZXtNb2R1bGVbInNldFN0YXR1cyJdKCIiKX19fSl9LGlzRnVsbFNjcmVlbjpmYWxzZSxwb2ludGVyTG9jazpmYWxzZSxtb2R1bGVDb250ZXh0Q3JlYXRlZENhbGxiYWNrczpbXSx3b3JrZXJzOltdLGluaXQ6KGZ1bmN0aW9uKCl7aWYoIU1vZHVsZVsicHJlbG9hZFBsdWdpbnMiXSlNb2R1bGVbInByZWxvYWRQbHVnaW5zIl09W107aWYoQnJvd3Nlci5pbml0dGVkfHxFTlZJUk9OTUVOVF9JU19XT1JLRVIpcmV0dXJuO0Jyb3dzZXIuaW5pdHRlZD10cnVlO3RyeXtuZXcgQmxvYjtCcm93c2VyLmhhc0Jsb2JDb25zdHJ1Y3Rvcj10cnVlfWNhdGNoKGUpe0Jyb3dzZXIuaGFzQmxvYkNvbnN0cnVjdG9yPWZhbHNlO2NvbnNvbGUubG9nKCJ3YXJuaW5nOiBubyBibG9iIGNvbnN0cnVjdG9yLCBjYW5ub3QgY3JlYXRlIGJsb2JzIHdpdGggbWltZXR5cGVzIil9QnJvd3Nlci5CbG9iQnVpbGRlcj10eXBlb2YgTW96QmxvYkJ1aWxkZXIhPSJ1bmRlZmluZWQiP01vekJsb2JCdWlsZGVyOnR5cGVvZiBXZWJLaXRCbG9iQnVpbGRlciE9InVuZGVmaW5lZCI/V2ViS2l0QmxvYkJ1aWxkZXI6IUJyb3dzZXIuaGFzQmxvYkNvbnN0cnVjdG9yP2NvbnNvbGUubG9nKCJ3YXJuaW5nOiBubyBCbG9iQnVpbGRlciIpOm51bGw7QnJvd3Nlci5VUkxPYmplY3Q9dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCI/d2luZG93LlVSTD93aW5kb3cuVVJMOndpbmRvdy53ZWJraXRVUkw6dW5kZWZpbmVkO2lmKCFNb2R1bGUubm9JbWFnZURlY29kaW5nJiZ0eXBlb2YgQnJvd3Nlci5VUkxPYmplY3Q9PT0idW5kZWZpbmVkIil7Y29uc29sZS5sb2coIndhcm5pbmc6IEJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBjcmVhdGluZyBvYmplY3QgVVJMcy4gQnVpbHQtaW4gYnJvd3NlciBpbWFnZSBkZWNvZGluZyB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIik7TW9kdWxlLm5vSW1hZ2VEZWNvZGluZz10cnVlfXZhciBpbWFnZVBsdWdpbj17fTtpbWFnZVBsdWdpblsiY2FuSGFuZGxlIl09ZnVuY3Rpb24gaW1hZ2VQbHVnaW5fY2FuSGFuZGxlKG5hbWUpe3JldHVybiFNb2R1bGUubm9JbWFnZURlY29kaW5nJiYvXC4oanBnfGpwZWd8cG5nfGJtcCkkL2kudGVzdChuYW1lKX07aW1hZ2VQbHVnaW5bImhhbmRsZSJdPWZ1bmN0aW9uIGltYWdlUGx1Z2luX2hhbmRsZShieXRlQXJyYXksbmFtZSxvbmxvYWQsb25lcnJvcil7dmFyIGI9bnVsbDtpZihCcm93c2VyLmhhc0Jsb2JDb25zdHJ1Y3Rvcil7dHJ5e2I9bmV3IEJsb2IoW2J5dGVBcnJheV0se3R5cGU6QnJvd3Nlci5nZXRNaW1ldHlwZShuYW1lKX0pO2lmKGIuc2l6ZSE9PWJ5dGVBcnJheS5sZW5ndGgpe2I9bmV3IEJsb2IoWyhuZXcgVWludDhBcnJheShieXRlQXJyYXkpKS5idWZmZXJdLHt0eXBlOkJyb3dzZXIuZ2V0TWltZXR5cGUobmFtZSl9KX19Y2F0Y2goZSl7UnVudGltZS53YXJuT25jZSgiQmxvYiBjb25zdHJ1Y3RvciBwcmVzZW50IGJ1dCBmYWlsczogIitlKyI7IGZhbGxpbmcgYmFjayB0byBibG9iIGJ1aWxkZXIiKX19aWYoIWIpe3ZhciBiYj1uZXcgQnJvd3Nlci5CbG9iQnVpbGRlcjtiYi5hcHBlbmQoKG5ldyBVaW50OEFycmF5KGJ5dGVBcnJheSkpLmJ1ZmZlcik7Yj1iYi5nZXRCbG9iKCl9dmFyIHVybD1Ccm93c2VyLlVSTE9iamVjdC5jcmVhdGVPYmplY3RVUkwoYik7dmFyIGltZz1uZXcgSW1hZ2U7aW1nLm9ubG9hZD1mdW5jdGlvbiBpbWdfb25sb2FkKCl7YXNzZXJ0KGltZy5jb21wbGV0ZSwiSW1hZ2UgIituYW1lKyIgY291bGQgbm90IGJlIGRlY29kZWQiKTt2YXIgY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2NhbnZhcy53aWR0aD1pbWcud2lkdGg7Y2FudmFzLmhlaWdodD1pbWcuaGVpZ2h0O3ZhciBjdHg9Y2FudmFzLmdldENvbnRleHQoIjJkIik7Y3R4LmRyYXdJbWFnZShpbWcsMCwwKTtNb2R1bGVbInByZWxvYWRlZEltYWdlcyJdW25hbWVdPWNhbnZhcztCcm93c2VyLlVSTE9iamVjdC5yZXZva2VPYmplY3RVUkwodXJsKTtpZihvbmxvYWQpb25sb2FkKGJ5dGVBcnJheSl9O2ltZy5vbmVycm9yPWZ1bmN0aW9uIGltZ19vbmVycm9yKGV2ZW50KXtjb25zb2xlLmxvZygiSW1hZ2UgIit1cmwrIiBjb3VsZCBub3QgYmUgZGVjb2RlZCIpO2lmKG9uZXJyb3Ipb25lcnJvcigpfTtpbWcuc3JjPXVybH07TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLnB1c2goaW1hZ2VQbHVnaW4pO3ZhciBhdWRpb1BsdWdpbj17fTthdWRpb1BsdWdpblsiY2FuSGFuZGxlIl09ZnVuY3Rpb24gYXVkaW9QbHVnaW5fY2FuSGFuZGxlKG5hbWUpe3JldHVybiFNb2R1bGUubm9BdWRpb0RlY29kaW5nJiZuYW1lLnN1YnN0cigtNClpbnsiLm9nZyI6MSwiLndhdiI6MSwiLm1wMyI6MX19O2F1ZGlvUGx1Z2luWyJoYW5kbGUiXT1mdW5jdGlvbiBhdWRpb1BsdWdpbl9oYW5kbGUoYnl0ZUFycmF5LG5hbWUsb25sb2FkLG9uZXJyb3Ipe3ZhciBkb25lPWZhbHNlO2Z1bmN0aW9uIGZpbmlzaChhdWRpbyl7aWYoZG9uZSlyZXR1cm47ZG9uZT10cnVlO01vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl1bbmFtZV09YXVkaW87aWYob25sb2FkKW9ubG9hZChieXRlQXJyYXkpfWZ1bmN0aW9uIGZhaWwoKXtpZihkb25lKXJldHVybjtkb25lPXRydWU7TW9kdWxlWyJwcmVsb2FkZWRBdWRpb3MiXVtuYW1lXT1uZXcgQXVkaW87aWYob25lcnJvcilvbmVycm9yKCl9aWYoQnJvd3Nlci5oYXNCbG9iQ29uc3RydWN0b3Ipe3RyeXt2YXIgYj1uZXcgQmxvYihbYnl0ZUFycmF5XSx7dHlwZTpCcm93c2VyLmdldE1pbWV0eXBlKG5hbWUpfSl9Y2F0Y2goZSl7cmV0dXJuIGZhaWwoKX12YXIgdXJsPUJyb3dzZXIuVVJMT2JqZWN0LmNyZWF0ZU9iamVjdFVSTChiKTt2YXIgYXVkaW89bmV3IEF1ZGlvO2F1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoImNhbnBsYXl0aHJvdWdoIiwoZnVuY3Rpb24oKXtmaW5pc2goYXVkaW8pfSksZmFsc2UpO2F1ZGlvLm9uZXJyb3I9ZnVuY3Rpb24gYXVkaW9fb25lcnJvcihldmVudCl7aWYoZG9uZSlyZXR1cm47Y29uc29sZS5sb2coIndhcm5pbmc6IGJyb3dzZXIgY291bGQgbm90IGZ1bGx5IGRlY29kZSBhdWRpbyAiK25hbWUrIiwgdHJ5aW5nIHNsb3dlciBiYXNlNjQgYXBwcm9hY2giKTtmdW5jdGlvbiBlbmNvZGU2NChkYXRhKXt2YXIgQkFTRT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7dmFyIFBBRD0iPSI7dmFyIHJldD0iIjt2YXIgbGVmdGNoYXI9MDt2YXIgbGVmdGJpdHM9MDtmb3IodmFyIGk9MDtpPGRhdGEubGVuZ3RoO2krKyl7bGVmdGNoYXI9bGVmdGNoYXI8PDh8ZGF0YVtpXTtsZWZ0Yml0cys9ODt3aGlsZShsZWZ0Yml0cz49Nil7dmFyIGN1cnI9bGVmdGNoYXI+PmxlZnRiaXRzLTYmNjM7bGVmdGJpdHMtPTY7cmV0Kz1CQVNFW2N1cnJdfX1pZihsZWZ0Yml0cz09Mil7cmV0Kz1CQVNFWyhsZWZ0Y2hhciYzKTw8NF07cmV0Kz1QQUQrUEFEfWVsc2UgaWYobGVmdGJpdHM9PTQpe3JldCs9QkFTRVsobGVmdGNoYXImMTUpPDwyXTtyZXQrPVBBRH1yZXR1cm4gcmV0fWF1ZGlvLnNyYz0iZGF0YTphdWRpby94LSIrbmFtZS5zdWJzdHIoLTMpKyI7YmFzZTY0LCIrZW5jb2RlNjQoYnl0ZUFycmF5KTtmaW5pc2goYXVkaW8pfTthdWRpby5zcmM9dXJsO0Jyb3dzZXIuc2FmZVNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZmluaXNoKGF1ZGlvKX0pLDFlNCl9ZWxzZXtyZXR1cm4gZmFpbCgpfX07TW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdLnB1c2goYXVkaW9QbHVnaW4pO3ZhciBjYW52YXM9TW9kdWxlWyJjYW52YXMiXTtpZihjYW52YXMpe2NhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2s9Y2FudmFzWyJyZXF1ZXN0UG9pbnRlckxvY2siXXx8Y2FudmFzWyJtb3pSZXF1ZXN0UG9pbnRlckxvY2siXXx8Y2FudmFzWyJ3ZWJraXRSZXF1ZXN0UG9pbnRlckxvY2siXXx8Y2FudmFzWyJtc1JlcXVlc3RQb2ludGVyTG9jayJdfHwoZnVuY3Rpb24oKXt9KTtjYW52YXMuZXhpdFBvaW50ZXJMb2NrPWRvY3VtZW50WyJleGl0UG9pbnRlckxvY2siXXx8ZG9jdW1lbnRbIm1vekV4aXRQb2ludGVyTG9jayJdfHxkb2N1bWVudFsid2Via2l0RXhpdFBvaW50ZXJMb2NrIl18fGRvY3VtZW50WyJtc0V4aXRQb2ludGVyTG9jayJdfHwoZnVuY3Rpb24oKXt9KTtjYW52YXMuZXhpdFBvaW50ZXJMb2NrPWNhbnZhcy5leGl0UG9pbnRlckxvY2suYmluZChkb2N1bWVudCk7ZnVuY3Rpb24gcG9pbnRlckxvY2tDaGFuZ2UoKXtCcm93c2VyLnBvaW50ZXJMb2NrPWRvY3VtZW50WyJwb2ludGVyTG9ja0VsZW1lbnQiXT09PWNhbnZhc3x8ZG9jdW1lbnRbIm1velBvaW50ZXJMb2NrRWxlbWVudCJdPT09Y2FudmFzfHxkb2N1bWVudFsid2Via2l0UG9pbnRlckxvY2tFbGVtZW50Il09PT1jYW52YXN8fGRvY3VtZW50WyJtc1BvaW50ZXJMb2NrRWxlbWVudCJdPT09Y2FudmFzfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJsb2NrY2hhbmdlIixwb2ludGVyTG9ja0NoYW5nZSxmYWxzZSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW96cG9pbnRlcmxvY2tjaGFuZ2UiLHBvaW50ZXJMb2NrQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRwb2ludGVybG9ja2NoYW5nZSIscG9pbnRlckxvY2tDaGFuZ2UsZmFsc2UpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1zcG9pbnRlcmxvY2tjaGFuZ2UiLHBvaW50ZXJMb2NrQ2hhbmdlLGZhbHNlKTtpZihNb2R1bGVbImVsZW1lbnRQb2ludGVyTG9jayJdKXtjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihldil7aWYoIUJyb3dzZXIucG9pbnRlckxvY2smJmNhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2spe2NhbnZhcy5yZXF1ZXN0UG9pbnRlckxvY2soKTtldi5wcmV2ZW50RGVmYXVsdCgpfX0pLGZhbHNlKX19fSksY3JlYXRlQ29udGV4dDooZnVuY3Rpb24oY2FudmFzLHVzZVdlYkdMLHNldEluTW9kdWxlLHdlYkdMQ29udGV4dEF0dHJpYnV0ZXMpe3ZhciBjdHg7dmFyIGVycm9ySW5mbz0iPyI7ZnVuY3Rpb24gb25Db250ZXh0Q3JlYXRpb25FcnJvcihldmVudCl7ZXJyb3JJbmZvPWV2ZW50LnN0YXR1c01lc3NhZ2V8fGVycm9ySW5mb310cnl7aWYodXNlV2ViR0wpe3ZhciBjb250ZXh0QXR0cmlidXRlcz17YW50aWFsaWFzOmZhbHNlLGFscGhhOmZhbHNlfTtpZih3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKXtmb3IodmFyIGF0dHJpYnV0ZSBpbiB3ZWJHTENvbnRleHRBdHRyaWJ1dGVzKXtjb250ZXh0QXR0cmlidXRlc1thdHRyaWJ1dGVdPXdlYkdMQ29udGV4dEF0dHJpYnV0ZXNbYXR0cmlidXRlXX19Y2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLG9uQ29udGV4dENyZWF0aW9uRXJyb3IsZmFsc2UpO3RyeXtbImV4cGVyaW1lbnRhbC13ZWJnbCIsIndlYmdsIl0uc29tZSgoZnVuY3Rpb24od2ViZ2xJZCl7cmV0dXJuIGN0eD1jYW52YXMuZ2V0Q29udGV4dCh3ZWJnbElkLGNvbnRleHRBdHRyaWJ1dGVzKX0pKX1maW5hbGx5e2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIixvbkNvbnRleHRDcmVhdGlvbkVycm9yLGZhbHNlKX19ZWxzZXtjdHg9Y2FudmFzLmdldENvbnRleHQoIjJkIil9aWYoIWN0eCl0aHJvdyI6KCJ9Y2F0Y2goZSl7TW9kdWxlLnByaW50KCJDb3VsZCBub3QgY3JlYXRlIGNhbnZhczogIitbZXJyb3JJbmZvLGVdKTtyZXR1cm4gbnVsbH1pZih1c2VXZWJHTCl7Y2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iYmxhY2sifWlmKHNldEluTW9kdWxlKXtHTGN0eD1Nb2R1bGUuY3R4PWN0eDtNb2R1bGUudXNlV2ViR0w9dXNlV2ViR0w7QnJvd3Nlci5tb2R1bGVDb250ZXh0Q3JlYXRlZENhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbihjYWxsYmFjayl7Y2FsbGJhY2soKX0pKTtCcm93c2VyLmluaXQoKX1yZXR1cm4gY3R4fSksZGVzdHJveUNvbnRleHQ6KGZ1bmN0aW9uKGNhbnZhcyx1c2VXZWJHTCxzZXRJbk1vZHVsZSl7fSksZnVsbFNjcmVlbkhhbmRsZXJzSW5zdGFsbGVkOmZhbHNlLGxvY2tQb2ludGVyOnVuZGVmaW5lZCxyZXNpemVDYW52YXM6dW5kZWZpbmVkLHJlcXVlc3RGdWxsU2NyZWVuOihmdW5jdGlvbihsb2NrUG9pbnRlcixyZXNpemVDYW52YXMpe0Jyb3dzZXIubG9ja1BvaW50ZXI9bG9ja1BvaW50ZXI7QnJvd3Nlci5yZXNpemVDYW52YXM9cmVzaXplQ2FudmFzO2lmKHR5cGVvZiBCcm93c2VyLmxvY2tQb2ludGVyPT09InVuZGVmaW5lZCIpQnJvd3Nlci5sb2NrUG9pbnRlcj10cnVlO2lmKHR5cGVvZiBCcm93c2VyLnJlc2l6ZUNhbnZhcz09PSJ1bmRlZmluZWQiKUJyb3dzZXIucmVzaXplQ2FudmFzPWZhbHNlO3ZhciBjYW52YXM9TW9kdWxlWyJjYW52YXMiXTtmdW5jdGlvbiBmdWxsU2NyZWVuQ2hhbmdlKCl7QnJvd3Nlci5pc0Z1bGxTY3JlZW49ZmFsc2U7dmFyIGNhbnZhc0NvbnRhaW5lcj1jYW52YXMucGFyZW50Tm9kZTtpZigoZG9jdW1lbnRbIndlYmtpdEZ1bGxTY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsibW96RnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1vekZ1bGxzY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJmdWxsU2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsiZnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCJdKT09PWNhbnZhc0NvbnRhaW5lcil7Y2FudmFzLmNhbmNlbEZ1bGxTY3JlZW49ZG9jdW1lbnRbImNhbmNlbEZ1bGxTY3JlZW4iXXx8ZG9jdW1lbnRbIm1vekNhbmNlbEZ1bGxTY3JlZW4iXXx8ZG9jdW1lbnRbIndlYmtpdENhbmNlbEZ1bGxTY3JlZW4iXXx8ZG9jdW1lbnRbIm1zRXhpdEZ1bGxzY3JlZW4iXXx8ZG9jdW1lbnRbImV4aXRGdWxsc2NyZWVuIl18fChmdW5jdGlvbigpe30pO2NhbnZhcy5jYW5jZWxGdWxsU2NyZWVuPWNhbnZhcy5jYW5jZWxGdWxsU2NyZWVuLmJpbmQoZG9jdW1lbnQpO2lmKEJyb3dzZXIubG9ja1BvaW50ZXIpY2FudmFzLnJlcXVlc3RQb2ludGVyTG9jaygpO0Jyb3dzZXIuaXNGdWxsU2NyZWVuPXRydWU7aWYoQnJvd3Nlci5yZXNpemVDYW52YXMpQnJvd3Nlci5zZXRGdWxsU2NyZWVuQ2FudmFzU2l6ZSgpfWVsc2V7Y2FudmFzQ29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNhbnZhcyxjYW52YXNDb250YWluZXIpO2NhbnZhc0NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNhbnZhc0NvbnRhaW5lcik7aWYoQnJvd3Nlci5yZXNpemVDYW52YXMpQnJvd3Nlci5zZXRXaW5kb3dlZENhbnZhc1NpemUoKX1pZihNb2R1bGVbIm9uRnVsbFNjcmVlbiJdKU1vZHVsZVsib25GdWxsU2NyZWVuIl0oQnJvd3Nlci5pc0Z1bGxTY3JlZW4pO0Jyb3dzZXIudXBkYXRlQ2FudmFzRGltZW5zaW9ucyhjYW52YXMpfWlmKCFCcm93c2VyLmZ1bGxTY3JlZW5IYW5kbGVyc0luc3RhbGxlZCl7QnJvd3Nlci5mdWxsU2NyZWVuSGFuZGxlcnNJbnN0YWxsZWQ9dHJ1ZTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmdWxsc2NyZWVuY2hhbmdlIixmdWxsU2NyZWVuQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3pmdWxsc2NyZWVuY2hhbmdlIixmdWxsU2NyZWVuQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIixmdWxsU2NyZWVuQ2hhbmdlLGZhbHNlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJNU0Z1bGxzY3JlZW5DaGFuZ2UiLGZ1bGxTY3JlZW5DaGFuZ2UsZmFsc2UpfXZhciBjYW52YXNDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y2FudmFzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNhbnZhc0NvbnRhaW5lcixjYW52YXMpO2NhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpO2NhbnZhc0NvbnRhaW5lci5yZXF1ZXN0RnVsbFNjcmVlbj1jYW52YXNDb250YWluZXJbInJlcXVlc3RGdWxsU2NyZWVuIl18fGNhbnZhc0NvbnRhaW5lclsibW96UmVxdWVzdEZ1bGxTY3JlZW4iXXx8Y2FudmFzQ29udGFpbmVyWyJtc1JlcXVlc3RGdWxsc2NyZWVuIl18fChjYW52YXNDb250YWluZXJbIndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuIl0/KGZ1bmN0aW9uKCl7Y2FudmFzQ29udGFpbmVyWyJ3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbiJdKEVsZW1lbnRbIkFMTE9XX0tFWUJPQVJEX0lOUFVUIl0pfSk6bnVsbCk7Y2FudmFzQ29udGFpbmVyLnJlcXVlc3RGdWxsU2NyZWVuKCl9KSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWU6ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpe2lmKHR5cGVvZiB3aW5kb3c9PT0idW5kZWZpbmVkIil7c2V0VGltZW91dChmdW5jLDFlMy82MCl9ZWxzZXtpZighd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT13aW5kb3dbInJlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbIm1velJlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbIm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl18fHdpbmRvd1sib1JlcXVlc3RBbmltYXRpb25GcmFtZSJdfHx3aW5kb3dbInNldFRpbWVvdXQiXX13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpfX0sc2FmZUNhbGxiYWNrOihmdW5jdGlvbihmdW5jKXtyZXR1cm4oZnVuY3Rpb24oKXtpZighQUJPUlQpcmV0dXJuIGZ1bmMuYXBwbHkobnVsbCxhcmd1bWVudHMpfSl9KSxzYWZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOihmdW5jdGlvbihmdW5jKXtyZXR1cm4gQnJvd3Nlci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7aWYoIUFCT1JUKWZ1bmMoKX0pKX0pLHNhZmVTZXRUaW1lb3V0OihmdW5jdGlvbihmdW5jLHRpbWVvdXQpe01vZHVsZVsibm9FeGl0UnVudGltZSJdPXRydWU7cmV0dXJuIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYoIUFCT1JUKWZ1bmMoKX0pLHRpbWVvdXQpfSksc2FmZVNldEludGVydmFsOihmdW5jdGlvbihmdW5jLHRpbWVvdXQpe01vZHVsZVsibm9FeGl0UnVudGltZSJdPXRydWU7cmV0dXJuIHNldEludGVydmFsKChmdW5jdGlvbigpe2lmKCFBQk9SVClmdW5jKCl9KSx0aW1lb3V0KX0pLGdldE1pbWV0eXBlOihmdW5jdGlvbihuYW1lKXtyZXR1cm57ImpwZyI6ImltYWdlL2pwZWciLCJqcGVnIjoiaW1hZ2UvanBlZyIsInBuZyI6ImltYWdlL3BuZyIsImJtcCI6ImltYWdlL2JtcCIsIm9nZyI6ImF1ZGlvL29nZyIsIndhdiI6ImF1ZGlvL3dhdiIsIm1wMyI6ImF1ZGlvL21wZWcifVtuYW1lLnN1YnN0cihuYW1lLmxhc3RJbmRleE9mKCIuIikrMSldfSksZ2V0VXNlck1lZGlhOihmdW5jdGlvbihmdW5jKXtpZighd2luZG93LmdldFVzZXJNZWRpYSl7d2luZG93LmdldFVzZXJNZWRpYT1uYXZpZ2F0b3JbImdldFVzZXJNZWRpYSJdfHxuYXZpZ2F0b3JbIm1vekdldFVzZXJNZWRpYSJdfXdpbmRvdy5nZXRVc2VyTWVkaWEoZnVuYyl9KSxnZXRNb3ZlbWVudFg6KGZ1bmN0aW9uKGV2ZW50KXtyZXR1cm4gZXZlbnRbIm1vdmVtZW50WCJdfHxldmVudFsibW96TW92ZW1lbnRYIl18fGV2ZW50WyJ3ZWJraXRNb3ZlbWVudFgiXXx8MH0pLGdldE1vdmVtZW50WTooZnVuY3Rpb24oZXZlbnQpe3JldHVybiBldmVudFsibW92ZW1lbnRZIl18fGV2ZW50WyJtb3pNb3ZlbWVudFkiXXx8ZXZlbnRbIndlYmtpdE1vdmVtZW50WSJdfHwwfSksZ2V0TW91c2VXaGVlbERlbHRhOihmdW5jdGlvbihldmVudCl7dmFyIGRlbHRhPTA7c3dpdGNoKGV2ZW50LnR5cGUpe2Nhc2UiRE9NTW91c2VTY3JvbGwiOmRlbHRhPWV2ZW50LmRldGFpbDticmVhaztjYXNlIm1vdXNld2hlZWwiOmRlbHRhPS1ldmVudC53aGVlbERlbHRhO2JyZWFrO2Nhc2Uid2hlZWwiOmRlbHRhPWV2ZW50LmRlbHRhWTticmVhaztkZWZhdWx0OnRocm93InVucmVjb2duaXplZCBtb3VzZSB3aGVlbCBldmVudDogIitldmVudC50eXBlfXJldHVybiBNYXRoLm1heCgtMSxNYXRoLm1pbigxLGRlbHRhKSl9KSxtb3VzZVg6MCxtb3VzZVk6MCxtb3VzZU1vdmVtZW50WDowLG1vdXNlTW92ZW1lbnRZOjAsdG91Y2hlczp7fSxsYXN0VG91Y2hlczp7fSxjYWxjdWxhdGVNb3VzZUV2ZW50OihmdW5jdGlvbihldmVudCl7aWYoQnJvd3Nlci5wb2ludGVyTG9jayl7aWYoZXZlbnQudHlwZSE9Im1vdXNlbW92ZSImJiJtb3pNb3ZlbWVudFgiaW4gZXZlbnQpe0Jyb3dzZXIubW91c2VNb3ZlbWVudFg9QnJvd3Nlci5tb3VzZU1vdmVtZW50WT0wfWVsc2V7QnJvd3Nlci5tb3VzZU1vdmVtZW50WD1Ccm93c2VyLmdldE1vdmVtZW50WChldmVudCk7QnJvd3Nlci5tb3VzZU1vdmVtZW50WT1Ccm93c2VyLmdldE1vdmVtZW50WShldmVudCl9aWYodHlwZW9mIFNETCE9InVuZGVmaW5lZCIpe0Jyb3dzZXIubW91c2VYPVNETC5tb3VzZVgrQnJvd3Nlci5tb3VzZU1vdmVtZW50WDtCcm93c2VyLm1vdXNlWT1TREwubW91c2VZK0Jyb3dzZXIubW91c2VNb3ZlbWVudFl9ZWxzZXtCcm93c2VyLm1vdXNlWCs9QnJvd3Nlci5tb3VzZU1vdmVtZW50WDtCcm93c2VyLm1vdXNlWSs9QnJvd3Nlci5tb3VzZU1vdmVtZW50WX19ZWxzZXt2YXIgcmVjdD1Nb2R1bGVbImNhbnZhcyJdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBjdz1Nb2R1bGVbImNhbnZhcyJdLndpZHRoO3ZhciBjaD1Nb2R1bGVbImNhbnZhcyJdLmhlaWdodDt2YXIgc2Nyb2xsWD10eXBlb2Ygd2luZG93LnNjcm9sbFghPT0idW5kZWZpbmVkIj93aW5kb3cuc2Nyb2xsWDp3aW5kb3cucGFnZVhPZmZzZXQ7dmFyIHNjcm9sbFk9dHlwZW9mIHdpbmRvdy5zY3JvbGxZIT09InVuZGVmaW5lZCI/d2luZG93LnNjcm9sbFk6d2luZG93LnBhZ2VZT2Zmc2V0O2lmKGV2ZW50LnR5cGU9PT0idG91Y2hzdGFydCJ8fGV2ZW50LnR5cGU9PT0idG91Y2hlbmQifHxldmVudC50eXBlPT09InRvdWNobW92ZSIpe3ZhciB0b3VjaD1ldmVudC50b3VjaDtpZih0b3VjaD09PXVuZGVmaW5lZCl7cmV0dXJufXZhciBhZGp1c3RlZFg9dG91Y2gucGFnZVgtKHNjcm9sbFgrcmVjdC5sZWZ0KTt2YXIgYWRqdXN0ZWRZPXRvdWNoLnBhZ2VZLShzY3JvbGxZK3JlY3QudG9wKTthZGp1c3RlZFg9YWRqdXN0ZWRYKihjdy9yZWN0LndpZHRoKTthZGp1c3RlZFk9YWRqdXN0ZWRZKihjaC9yZWN0LmhlaWdodCk7dmFyIGNvb3Jkcz17eDphZGp1c3RlZFgseTphZGp1c3RlZFl9O2lmKGV2ZW50LnR5cGU9PT0idG91Y2hzdGFydCIpe0Jyb3dzZXIubGFzdFRvdWNoZXNbdG91Y2guaWRlbnRpZmllcl09Y29vcmRzO0Jyb3dzZXIudG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXT1jb29yZHN9ZWxzZSBpZihldmVudC50eXBlPT09InRvdWNoZW5kInx8ZXZlbnQudHlwZT09PSJ0b3VjaG1vdmUiKXtCcm93c2VyLmxhc3RUb3VjaGVzW3RvdWNoLmlkZW50aWZpZXJdPUJyb3dzZXIudG91Y2hlc1t0b3VjaC5pZGVudGlmaWVyXTtCcm93c2VyLnRvdWNoZXNbdG91Y2guaWRlbnRpZmllcl09e3g6YWRqdXN0ZWRYLHk6YWRqdXN0ZWRZfX1yZXR1cm59dmFyIHg9ZXZlbnQucGFnZVgtKHNjcm9sbFgrcmVjdC5sZWZ0KTt2YXIgeT1ldmVudC5wYWdlWS0oc2Nyb2xsWStyZWN0LnRvcCk7eD14Kihjdy9yZWN0LndpZHRoKTt5PXkqKGNoL3JlY3QuaGVpZ2h0KTtCcm93c2VyLm1vdXNlTW92ZW1lbnRYPXgtQnJvd3Nlci5tb3VzZVg7QnJvd3Nlci5tb3VzZU1vdmVtZW50WT15LUJyb3dzZXIubW91c2VZO0Jyb3dzZXIubW91c2VYPXg7QnJvd3Nlci5tb3VzZVk9eX19KSx4aHJMb2FkOihmdW5jdGlvbih1cmwsb25sb2FkLG9uZXJyb3Ipe3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKCJHRVQiLHVybCx0cnVlKTt4aHIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciI7eGhyLm9ubG9hZD1mdW5jdGlvbiB4aHJfb25sb2FkKCl7aWYoeGhyLnN0YXR1cz09MjAwfHx4aHIuc3RhdHVzPT0wJiZ4aHIucmVzcG9uc2Upe29ubG9hZCh4aHIucmVzcG9uc2UpfWVsc2V7b25lcnJvcigpfX07eGhyLm9uZXJyb3I9b25lcnJvcjt4aHIuc2VuZChudWxsKX0pLGFzeW5jTG9hZDooZnVuY3Rpb24odXJsLG9ubG9hZCxvbmVycm9yLG5vUnVuRGVwKXtCcm93c2VyLnhockxvYWQodXJsLChmdW5jdGlvbihhcnJheUJ1ZmZlcil7YXNzZXJ0KGFycmF5QnVmZmVyLCdMb2FkaW5nIGRhdGEgZmlsZSAiJyt1cmwrJyIgZmFpbGVkIChubyBhcnJheUJ1ZmZlcikuJyk7b25sb2FkKG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7aWYoIW5vUnVuRGVwKXJlbW92ZVJ1bkRlcGVuZGVuY3koImFsICIrdXJsKX0pLChmdW5jdGlvbihldmVudCl7aWYob25lcnJvcil7b25lcnJvcigpfWVsc2V7dGhyb3cnTG9hZGluZyBkYXRhIGZpbGUgIicrdXJsKyciIGZhaWxlZC4nfX0pKTtpZighbm9SdW5EZXApYWRkUnVuRGVwZW5kZW5jeSgiYWwgIit1cmwpfSkscmVzaXplTGlzdGVuZXJzOltdLHVwZGF0ZVJlc2l6ZUxpc3RlbmVyczooZnVuY3Rpb24oKXt2YXIgY2FudmFzPU1vZHVsZVsiY2FudmFzIl07QnJvd3Nlci5yZXNpemVMaXN0ZW5lcnMuZm9yRWFjaCgoZnVuY3Rpb24obGlzdGVuZXIpe2xpc3RlbmVyKGNhbnZhcy53aWR0aCxjYW52YXMuaGVpZ2h0KX0pKX0pLHNldENhbnZhc1NpemU6KGZ1bmN0aW9uKHdpZHRoLGhlaWdodCxub1VwZGF0ZXMpe3ZhciBjYW52YXM9TW9kdWxlWyJjYW52YXMiXTtCcm93c2VyLnVwZGF0ZUNhbnZhc0RpbWVuc2lvbnMoY2FudmFzLHdpZHRoLGhlaWdodCk7aWYoIW5vVXBkYXRlcylCcm93c2VyLnVwZGF0ZVJlc2l6ZUxpc3RlbmVycygpfSksd2luZG93ZWRXaWR0aDowLHdpbmRvd2VkSGVpZ2h0OjAsc2V0RnVsbFNjcmVlbkNhbnZhc1NpemU6KGZ1bmN0aW9uKCl7aWYodHlwZW9mIFNETCE9InVuZGVmaW5lZCIpe3ZhciBmbGFncz1IRUFQVTMyW1NETC5zY3JlZW4rUnVudGltZS5RVUFOVFVNX1NJWkUqMD4+Ml07ZmxhZ3M9ZmxhZ3N8ODM4ODYwODtIRUFQMzJbU0RMLnNjcmVlbitSdW50aW1lLlFVQU5UVU1fU0laRSowPj4yXT1mbGFnc31Ccm93c2VyLnVwZGF0ZVJlc2l6ZUxpc3RlbmVycygpfSksc2V0V2luZG93ZWRDYW52YXNTaXplOihmdW5jdGlvbigpe2lmKHR5cGVvZiBTREwhPSJ1bmRlZmluZWQiKXt2YXIgZmxhZ3M9SEVBUFUzMltTREwuc2NyZWVuK1J1bnRpbWUuUVVBTlRVTV9TSVpFKjA+PjJdO2ZsYWdzPWZsYWdzJn44Mzg4NjA4O0hFQVAzMltTREwuc2NyZWVuK1J1bnRpbWUuUVVBTlRVTV9TSVpFKjA+PjJdPWZsYWdzfUJyb3dzZXIudXBkYXRlUmVzaXplTGlzdGVuZXJzKCl9KSx1cGRhdGVDYW52YXNEaW1lbnNpb25zOihmdW5jdGlvbihjYW52YXMsd05hdGl2ZSxoTmF0aXZlKXtpZih3TmF0aXZlJiZoTmF0aXZlKXtjYW52YXMud2lkdGhOYXRpdmU9d05hdGl2ZTtjYW52YXMuaGVpZ2h0TmF0aXZlPWhOYXRpdmV9ZWxzZXt3TmF0aXZlPWNhbnZhcy53aWR0aE5hdGl2ZTtoTmF0aXZlPWNhbnZhcy5oZWlnaHROYXRpdmV9dmFyIHc9d05hdGl2ZTt2YXIgaD1oTmF0aXZlO2lmKE1vZHVsZVsiZm9yY2VkQXNwZWN0UmF0aW8iXSYmTW9kdWxlWyJmb3JjZWRBc3BlY3RSYXRpbyJdPjApe2lmKHcvaDxNb2R1bGVbImZvcmNlZEFzcGVjdFJhdGlvIl0pe3c9TWF0aC5yb3VuZChoKk1vZHVsZVsiZm9yY2VkQXNwZWN0UmF0aW8iXSl9ZWxzZXtoPU1hdGgucm91bmQody9Nb2R1bGVbImZvcmNlZEFzcGVjdFJhdGlvIl0pfX1pZigoZG9jdW1lbnRbIndlYmtpdEZ1bGxTY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsibW96RnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1vekZ1bGxzY3JlZW5FbGVtZW50Il18fGRvY3VtZW50WyJmdWxsU2NyZWVuRWxlbWVudCJdfHxkb2N1bWVudFsiZnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbFNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIm1zRnVsbHNjcmVlbkVsZW1lbnQiXXx8ZG9jdW1lbnRbIndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCJdKT09PWNhbnZhcy5wYXJlbnROb2RlJiZ0eXBlb2Ygc2NyZWVuIT0idW5kZWZpbmVkIil7dmFyIGZhY3Rvcj1NYXRoLm1pbihzY3JlZW4ud2lkdGgvdyxzY3JlZW4uaGVpZ2h0L2gpO3c9TWF0aC5yb3VuZCh3KmZhY3Rvcik7aD1NYXRoLnJvdW5kKGgqZmFjdG9yKX1pZihCcm93c2VyLnJlc2l6ZUNhbnZhcyl7aWYoY2FudmFzLndpZHRoIT13KWNhbnZhcy53aWR0aD13O2lmKGNhbnZhcy5oZWlnaHQhPWgpY2FudmFzLmhlaWdodD1oO2lmKHR5cGVvZiBjYW52YXMuc3R5bGUhPSJ1bmRlZmluZWQiKXtjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIndpZHRoIik7Y2FudmFzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKX19ZWxzZXtpZihjYW52YXMud2lkdGghPXdOYXRpdmUpY2FudmFzLndpZHRoPXdOYXRpdmU7aWYoY2FudmFzLmhlaWdodCE9aE5hdGl2ZSljYW52YXMuaGVpZ2h0PWhOYXRpdmU7aWYodHlwZW9mIGNhbnZhcy5zdHlsZSE9InVuZGVmaW5lZCIpe2lmKHchPXdOYXRpdmV8fGghPWhOYXRpdmUpe2NhbnZhcy5zdHlsZS5zZXRQcm9wZXJ0eSgid2lkdGgiLHcrInB4IiwiaW1wb3J0YW50Iik7Y2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCJoZWlnaHQiLGgrInB4IiwiaW1wb3J0YW50Iil9ZWxzZXtjYW52YXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoIndpZHRoIik7Y2FudmFzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKX19fX0pfTtmdW5jdGlvbiBfX19jdHlwZV9iX2xvYygpe3ZhciBtZT1fX19jdHlwZV9iX2xvYztpZighbWUucmV0KXt2YXIgdmFsdWVzPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwyLDIsMiwyLDIsMiwyLDIsODE5NSw4MTk0LDgxOTQsODE5NCw4MTk0LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDI0NTc3LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDU1MzA0LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDU0NTM2LDU0NTM2LDU0NTM2LDU0NTM2LDU0NTM2LDU0NTM2LDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDUwNDQwLDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDU0NzkyLDU0NzkyLDU0NzkyLDU0NzkyLDU0NzkyLDU0NzkyLDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDUwNjk2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDQ5MTU2LDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTt2YXIgaTE2c2l6ZT0yO3ZhciBhcnI9X21hbGxvYyh2YWx1ZXMubGVuZ3RoKmkxNnNpemUpO2Zvcih2YXIgaT0wO2k8dmFsdWVzLmxlbmd0aDtpKyspe0hFQVAxNlthcnIraSppMTZzaXplPj4xXT12YWx1ZXNbaV19bWUucmV0PWFsbG9jYXRlKFthcnIrMTI4KmkxNnNpemVdLCJpMTYqIixBTExPQ19OT1JNQUwpfXJldHVybiBtZS5yZXR9ZnVuY3Rpb24gX2ZyZWUoKXt9TW9kdWxlWyJfZnJlZSJdPV9mcmVlO2Z1bmN0aW9uIF9mcmVlbG9jYWxlKGxvY2FsZSl7X2ZyZWUobG9jYWxlKX1mdW5jdGlvbiBfX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uKHNpemUpe3ZhciBwdHI9X21hbGxvYyhzaXplK19fX2N4YV9leGNlcHRpb25faGVhZGVyX3NpemUpO3JldHVybiBwdHIrX19fY3hhX2V4Y2VwdGlvbl9oZWFkZXJfc2l6ZX1mdW5jdGlvbiBfZm1vZCh4LHkpe3JldHVybiB4JXl9dmFyIF9mbW9kbD1fZm1vZDtmdW5jdGlvbiBfY2F0b3BlbihuYW1lLG9mbGFnKXtyZXR1cm4tMX1mdW5jdGlvbiBfY2F0Z2V0cyhjYXRkLHNldF9pZCxtc2dfaWQscyl7cmV0dXJuIHN9ZnVuY3Rpb24gX3NwcmludGYocyxmb3JtYXQsdmFyYXJncyl7cmV0dXJuIF9zbnByaW50ZihzLHVuZGVmaW5lZCxmb3JtYXQsdmFyYXJncyl9ZnVuY3Rpb24gX2FzcHJpbnRmKHMsZm9ybWF0LHZhcmFyZ3Mpe3JldHVybiBfc3ByaW50Zigtcyxmb3JtYXQsdmFyYXJncyl9ZnVuY3Rpb24gX3Zhc3ByaW50ZihzLGZvcm1hdCx2YV9hcmcpe3JldHVybiBfYXNwcmludGYocyxmb3JtYXQsSEVBUDMyW3ZhX2FyZz4+Ml0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0KCl7TW9kdWxlWyJwcmludEVyciJdKCJtaXNzaW5nIGZ1bmN0aW9uOiBfZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0Iik7YWJvcnQoLTEpfWZ1bmN0aW9uIF90aW1lKHB0cil7dmFyIHJldD1NYXRoLmZsb29yKERhdGUubm93KCkvMWUzKTtpZihwdHIpe0hFQVAzMltwdHI+PjJdPXJldH1yZXR1cm4gcmV0fWZ1bmN0aW9uIF9jb3B5c2lnbihhLGIpe3JldHVybiBfX3JlYWxseU5lZ2F0aXZlKGEpPT09X19yZWFsbHlOZWdhdGl2ZShiKT9hOi1hfWZ1bmN0aW9uIF9fX2N0eXBlX3RvdXBwZXJfbG9jKCl7dmFyIG1lPV9fX2N0eXBlX3RvdXBwZXJfbG9jO2lmKCFtZS5yZXQpe3ZhciB2YWx1ZXM9WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwtMSwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDEyMywxMjQsMTI1LDEyNiwxMjcsMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NV07dmFyIGkzMnNpemU9NDt2YXIgYXJyPV9tYWxsb2ModmFsdWVzLmxlbmd0aCppMzJzaXplKTtmb3IodmFyIGk9MDtpPHZhbHVlcy5sZW5ndGg7aSsrKXtIRUFQMzJbYXJyK2kqaTMyc2l6ZT4+Ml09dmFsdWVzW2ldfW1lLnJldD1hbGxvY2F0ZShbYXJyKzEyOCppMzJzaXplXSwiaTMyKiIsQUxMT0NfTk9STUFMKX1yZXR1cm4gbWUucmV0fWZ1bmN0aW9uIF9fX2N4YV9ndWFyZF9hY3F1aXJlKHZhcmlhYmxlKXtpZighSEVBUDhbdmFyaWFibGU+PjBdKXtIRUFQOFt2YXJpYWJsZT4+MF09MTtyZXR1cm4gMX1yZXR1cm4gMH1mdW5jdGlvbiBfX19jdHlwZV90b2xvd2VyX2xvYygpe3ZhciBtZT1fX19jdHlwZV90b2xvd2VyX2xvYztpZighbWUucmV0KXt2YXIgdmFsdWVzPVsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsLTEsMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwLDExMSwxMTIsMTEzLDExNCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1XTt2YXIgaTMyc2l6ZT00O3ZhciBhcnI9X21hbGxvYyh2YWx1ZXMubGVuZ3RoKmkzMnNpemUpO2Zvcih2YXIgaT0wO2k8dmFsdWVzLmxlbmd0aDtpKyspe0hFQVAzMlthcnIraSppMzJzaXplPj4yXT12YWx1ZXNbaV19bWUucmV0PWFsbG9jYXRlKFthcnIrMTI4KmkzMnNpemVdLCJpMzIqIixBTExPQ19OT1JNQUwpfXJldHVybiBtZS5yZXR9dmFyIF9fX2N4YV9jYXVnaHRfZXhjZXB0aW9ucz1bXTtmdW5jdGlvbiBfX19jeGFfYmVnaW5fY2F0Y2gocHRyKXtfX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udi51bmNhdWdodF9leGNlcHRpb24tLTtfX19jeGFfY2F1Z2h0X2V4Y2VwdGlvbnMucHVzaChfX19jeGFfbGFzdF90aHJvd25fZXhjZXB0aW9uKTtyZXR1cm4gcHRyfU1vZHVsZVsiX2JpdHNoaWZ0NjRTaGwiXT1fYml0c2hpZnQ2NFNobDtmdW5jdGlvbiBfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYoKXtpZighX19aTktTdDlleGNlcHRpb240d2hhdEV2LmJ1ZmZlcil7dmFyIG5hbWU9InN0ZDo6ZXhjZXB0aW9uIjtfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYuYnVmZmVyPV9tYWxsb2MobmFtZS5sZW5ndGgrMSk7d3JpdGVTdHJpbmdUb01lbW9yeShuYW1lLF9fWk5LU3Q5ZXhjZXB0aW9uNHdoYXRFdi5idWZmZXIpfXJldHVybiBfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYuYnVmZmVyfWZ1bmN0aW9uIF9fWk5TdDlleGNlcHRpb25EMkV2KCl7fWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yKCl7TW9kdWxlWyJwcmludEVyciJdKCJtaXNzaW5nIGZ1bmN0aW9uOiBfZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yIik7YWJvcnQoLTEpfXZhciBfY29weXNpZ25sPV9jb3B5c2lnbjtmdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbigpe01vZHVsZVsicHJpbnRFcnIiXSgibWlzc2luZyBmdW5jdGlvbjogX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbiIpO2Fib3J0KC0xKX12YXIgX19aVElTdDlleGNlcHRpb249YWxsb2NhdGUoW2FsbG9jYXRlKFsxLDAsMCwwLDAsMCwwXSwiaTgiLEFMTE9DX1NUQVRJQykrOCwwXSwiaTMyIixBTExPQ19TVEFUSUMpO3ZhciBfX19kc29faGFuZGxlPWFsbG9jYXRlKDEsImkzMioiLEFMTE9DX1NUQVRJQyk7RlMuc3RhdGljSW5pdCgpO19fQVRJTklUX18udW5zaGlmdCh7ZnVuYzooZnVuY3Rpb24oKXtpZighTW9kdWxlWyJub0ZTSW5pdCJdJiYhRlMuaW5pdC5pbml0aWFsaXplZClGUy5pbml0KCl9KX0pO19fQVRNQUlOX18ucHVzaCh7ZnVuYzooZnVuY3Rpb24oKXtGUy5pZ25vcmVQZXJtaXNzaW9ucz1mYWxzZX0pfSk7X19BVEVYSVRfXy5wdXNoKHtmdW5jOihmdW5jdGlvbigpe0ZTLnF1aXQoKX0pfSk7TW9kdWxlWyJGU19jcmVhdGVGb2xkZXIiXT1GUy5jcmVhdGVGb2xkZXI7TW9kdWxlWyJGU19jcmVhdGVQYXRoIl09RlMuY3JlYXRlUGF0aDtNb2R1bGVbIkZTX2NyZWF0ZURhdGFGaWxlIl09RlMuY3JlYXRlRGF0YUZpbGU7TW9kdWxlWyJGU19jcmVhdGVQcmVsb2FkZWRGaWxlIl09RlMuY3JlYXRlUHJlbG9hZGVkRmlsZTtNb2R1bGVbIkZTX2NyZWF0ZUxhenlGaWxlIl09RlMuY3JlYXRlTGF6eUZpbGU7TW9kdWxlWyJGU19jcmVhdGVMaW5rIl09RlMuY3JlYXRlTGluaztNb2R1bGVbIkZTX2NyZWF0ZURldmljZSJdPUZTLmNyZWF0ZURldmljZTtfX19lcnJub19zdGF0ZT1SdW50aW1lLnN0YXRpY0FsbG9jKDQpO0hFQVAzMltfX19lcnJub19zdGF0ZT4+Ml09MDtfX0FUSU5JVF9fLnVuc2hpZnQoe2Z1bmM6KGZ1bmN0aW9uKCl7VFRZLmluaXQoKX0pfSk7X19BVEVYSVRfXy5wdXNoKHtmdW5jOihmdW5jdGlvbigpe1RUWS5zaHV0ZG93bigpfSl9KTtUVFkudXRmOD1uZXcgUnVudGltZS5VVEY4UHJvY2Vzc29yO2lmKEVOVklST05NRU5UX0lTX05PREUpe3ZhciBmcz1yZXF1aXJlKCJmcyIpO05PREVGUy5zdGF0aWNJbml0KCl9X19BVElOSVRfXy5wdXNoKHtmdW5jOihmdW5jdGlvbigpe1NPQ0tGUy5yb290PUZTLm1vdW50KFNPQ0tGUyx7fSxudWxsKX0pfSk7X2ZnZXRjLnJldD1hbGxvY2F0ZShbMF0sImk4IixBTExPQ19TVEFUSUMpO01vZHVsZVsicmVxdWVzdEZ1bGxTY3JlZW4iXT1mdW5jdGlvbiBNb2R1bGVfcmVxdWVzdEZ1bGxTY3JlZW4obG9ja1BvaW50ZXIscmVzaXplQ2FudmFzKXtCcm93c2VyLnJlcXVlc3RGdWxsU2NyZWVuKGxvY2tQb2ludGVyLHJlc2l6ZUNhbnZhcyl9O01vZHVsZVsicmVxdWVzdEFuaW1hdGlvbkZyYW1lIl09ZnVuY3Rpb24gTW9kdWxlX3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jKXtCcm93c2VyLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jKX07TW9kdWxlWyJzZXRDYW52YXNTaXplIl09ZnVuY3Rpb24gTW9kdWxlX3NldENhbnZhc1NpemUod2lkdGgsaGVpZ2h0LG5vVXBkYXRlcyl7QnJvd3Nlci5zZXRDYW52YXNTaXplKHdpZHRoLGhlaWdodCxub1VwZGF0ZXMpfTtNb2R1bGVbInBhdXNlTWFpbkxvb3AiXT1mdW5jdGlvbiBNb2R1bGVfcGF1c2VNYWluTG9vcCgpe0Jyb3dzZXIubWFpbkxvb3AucGF1c2UoKX07TW9kdWxlWyJyZXN1bWVNYWluTG9vcCJdPWZ1bmN0aW9uIE1vZHVsZV9yZXN1bWVNYWluTG9vcCgpe0Jyb3dzZXIubWFpbkxvb3AucmVzdW1lKCl9O01vZHVsZVsiZ2V0VXNlck1lZGlhIl09ZnVuY3Rpb24gTW9kdWxlX2dldFVzZXJNZWRpYSgpe0Jyb3dzZXIuZ2V0VXNlck1lZGlhKCl9O1NUQUNLX0JBU0U9U1RBQ0tUT1A9UnVudGltZS5hbGlnbk1lbW9yeShTVEFUSUNUT1ApO3N0YXRpY1NlYWxlZD10cnVlO1NUQUNLX01BWD1TVEFDS19CQVNFKzUyNDI4ODA7RFlOQU1JQ19CQVNFPURZTkFNSUNUT1A9UnVudGltZS5hbGlnbk1lbW9yeShTVEFDS19NQVgpO2Fzc2VydChEWU5BTUlDX0JBU0U8VE9UQUxfTUVNT1JZLCJUT1RBTF9NRU1PUlkgbm90IGJpZyBlbm91Z2ggZm9yIHN0YWNrIik7dmFyIGN0bHpfaTg9YWxsb2NhdGUoWzgsNyw2LDYsNSw1LDUsNSw0LDQsNCw0LDQsNCw0LDQsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLCJpOCIsQUxMT0NfRFlOQU1JQyk7dmFyIGN0dHpfaTg9YWxsb2NhdGUoWzgsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNiwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw3LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNSwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw0LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDYsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMCw1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDBdLCJpOCIsQUxMT0NfRFlOQU1JQyk7dmFyIE1hdGhfbWluPU1hdGgubWluO2Z1bmN0aW9uIGludm9rZV9paWlpKGluZGV4LGExLGEyLGEzKXt0cnl7cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF9paWlpIl0oaW5kZXgsYTEsYTIsYTMpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2LGE3KXt0cnl7TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYsYTcpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpaWkiXShpbmRleCxhMSxhMixhMyxhNCxhNSl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfaShpbmRleCl7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaSJdKGluZGV4KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV92aShpbmRleCxhMSl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aSJdKGluZGV4LGExKX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV92aWkoaW5kZXgsYTEsYTIpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpIl0oaW5kZXgsYTEsYTIpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaWkoaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYsYTcsYTgsYTkpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpaWlpaWlpaSJdKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4LGE5KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV9paShpbmRleCxhMSl7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaWkiXShpbmRleCxhMSl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaWQoaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYsYTcpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpaWlpaWQiXShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaShpbmRleCxhMSxhMixhMyl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpIl0oaW5kZXgsYTEsYTIsYTMpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWQoaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYpe3RyeXtNb2R1bGVbImR5bkNhbGxfdmlpaWlpZCJdKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2KX1jYXRjaChlKXtpZih0eXBlb2YgZSE9PSJudW1iZXIiJiZlIT09ImxvbmdqbXAiKXRocm93IGU7YXNtWyJzZXRUaHJldyJdKDEsMCl9fWZ1bmN0aW9uIGludm9rZV92KGluZGV4KXt0cnl7TW9kdWxlWyJkeW5DYWxsX3YiXShpbmRleCl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfaWlpaWlpaWlpKGluZGV4LGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4KXt0cnl7cmV0dXJuIE1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWkiXShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfaWlpaWkoaW5kZXgsYTEsYTIsYTMsYTQpe3RyeXtyZXR1cm4gTW9kdWxlWyJkeW5DYWxsX2lpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCl7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpaWlpaWkiXShpbmRleCxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCl9Y2F0Y2goZSl7aWYodHlwZW9mIGUhPT0ibnVtYmVyIiYmZSE9PSJsb25nam1wIil0aHJvdyBlO2FzbVsic2V0VGhyZXciXSgxLDApfX1mdW5jdGlvbiBpbnZva2VfdmlpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSxhNil7dHJ5e01vZHVsZVsiZHluQ2FsbF92aWlpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQsYTUsYTYpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX2lpaShpbmRleCxhMSxhMil7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaWlpIl0oaW5kZXgsYTEsYTIpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX2lpaWlpaShpbmRleCxhMSxhMixhMyxhNCxhNSl7dHJ5e3JldHVybiBNb2R1bGVbImR5bkNhbGxfaWlpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQsYTUpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gaW52b2tlX3ZpaWlpKGluZGV4LGExLGEyLGEzLGE0KXt0cnl7TW9kdWxlWyJkeW5DYWxsX3ZpaWlpIl0oaW5kZXgsYTEsYTIsYTMsYTQpfWNhdGNoKGUpe2lmKHR5cGVvZiBlIT09Im51bWJlciImJmUhPT0ibG9uZ2ptcCIpdGhyb3cgZTthc21bInNldFRocmV3Il0oMSwwKX19ZnVuY3Rpb24gYXNtUHJpbnRJbnQoeCx5KXtNb2R1bGUucHJpbnQoImludCAiK3grIiwiK3kpfWZ1bmN0aW9uIGFzbVByaW50RmxvYXQoeCx5KXtNb2R1bGUucHJpbnQoImZsb2F0ICIreCsiLCIreSl9dmFyIGFzbT0oZnVuY3Rpb24oZ2xvYmFsLGVudixidWZmZXIpIHsKLy8gRU1TQ1JJUFRFTl9TVEFSVF9BU00KInVzZSBhc20iO3ZhciBhPW5ldyBnbG9iYWwuSW50OEFycmF5KGJ1ZmZlcik7dmFyIGI9bmV3IGdsb2JhbC5JbnQxNkFycmF5KGJ1ZmZlcik7dmFyIGM9bmV3IGdsb2JhbC5JbnQzMkFycmF5KGJ1ZmZlcik7dmFyIGQ9bmV3IGdsb2JhbC5VaW50OEFycmF5KGJ1ZmZlcik7dmFyIGU9bmV3IGdsb2JhbC5VaW50MTZBcnJheShidWZmZXIpO3ZhciBmPW5ldyBnbG9iYWwuVWludDMyQXJyYXkoYnVmZmVyKTt2YXIgZz1uZXcgZ2xvYmFsLkZsb2F0MzJBcnJheShidWZmZXIpO3ZhciBoPW5ldyBnbG9iYWwuRmxvYXQ2NEFycmF5KGJ1ZmZlcik7dmFyIGk9ZW52LlNUQUNLVE9QfDA7dmFyIGo9ZW52LlNUQUNLX01BWHwwO3ZhciBrPWVudi50ZW1wRG91YmxlUHRyfDA7dmFyIGw9ZW52LkFCT1JUfDA7dmFyIG09ZW52LmN0dHpfaTh8MDt2YXIgbj1lbnYuY3Rsel9pOHwwO3ZhciBvPWVudi5fX1pUSVN0OWV4Y2VwdGlvbnwwO3ZhciBwPWVudi5fX19kc29faGFuZGxlfDA7dmFyIHE9ZW52Ll9zdGRlcnJ8MDt2YXIgcj1lbnYuX3N0ZGlufDA7dmFyIHM9ZW52Ll9zdGRvdXR8MDt2YXIgdD0wO3ZhciB1PTA7dmFyIHY9MDt2YXIgdz0wO3ZhciB4PStlbnYuTmFOLHk9K2Vudi5JbmZpbml0eTt2YXIgej0wLEE9MCxCPTAsQz0wLEQ9MC4wLEU9MCxGPTAsRz0wLEg9MC4wO3ZhciBJPTA7dmFyIEo9MDt2YXIgSz0wO3ZhciBMPTA7dmFyIE09MDt2YXIgTj0wO3ZhciBPPTA7dmFyIFA9MDt2YXIgUT0wO3ZhciBSPTA7dmFyIFM9Z2xvYmFsLk1hdGguZmxvb3I7dmFyIFQ9Z2xvYmFsLk1hdGguYWJzO3ZhciBVPWdsb2JhbC5NYXRoLnNxcnQ7dmFyIFY9Z2xvYmFsLk1hdGgucG93O3ZhciBXPWdsb2JhbC5NYXRoLmNvczt2YXIgWD1nbG9iYWwuTWF0aC5zaW47dmFyIFk9Z2xvYmFsLk1hdGgudGFuO3ZhciBaPWdsb2JhbC5NYXRoLmFjb3M7dmFyIF89Z2xvYmFsLk1hdGguYXNpbjt2YXIgJD1nbG9iYWwuTWF0aC5hdGFuO3ZhciBhYT1nbG9iYWwuTWF0aC5hdGFuMjt2YXIgYmE9Z2xvYmFsLk1hdGguZXhwO3ZhciBjYT1nbG9iYWwuTWF0aC5sb2c7dmFyIGRhPWdsb2JhbC5NYXRoLmNlaWw7dmFyIGVhPWdsb2JhbC5NYXRoLmltdWw7dmFyIGZhPWVudi5hYm9ydDt2YXIgZ2E9ZW52LmFzc2VydDt2YXIgaGE9ZW52LmFzbVByaW50SW50O3ZhciBpYT1lbnYuYXNtUHJpbnRGbG9hdDt2YXIgamE9ZW52Lm1pbjt2YXIga2E9ZW52LmpzQ2FsbDt2YXIgbGE9ZW52Lmludm9rZV9paWlpO3ZhciBtYT1lbnYuaW52b2tlX3ZpaWlpaWlpO3ZhciBuYT1lbnYuaW52b2tlX3ZpaWlpaTt2YXIgb2E9ZW52Lmludm9rZV9pO3ZhciBwYT1lbnYuaW52b2tlX3ZpO3ZhciBxYT1lbnYuaW52b2tlX3ZpaTt2YXIgcmE9ZW52Lmludm9rZV92aWlpaWlpaWlpO3ZhciBzYT1lbnYuaW52b2tlX2lpO3ZhciB0YT1lbnYuaW52b2tlX3ZpaWlpaWlkO3ZhciB1YT1lbnYuaW52b2tlX3ZpaWk7dmFyIHZhPWVudi5pbnZva2VfdmlpaWlpZDt2YXIgd2E9ZW52Lmludm9rZV92O3ZhciB4YT1lbnYuaW52b2tlX2lpaWlpaWlpaTt2YXIgeWE9ZW52Lmludm9rZV9paWlpaTt2YXIgemE9ZW52Lmludm9rZV92aWlpaWlpaWk7dmFyIEFhPWVudi5pbnZva2VfdmlpaWlpaTt2YXIgQmE9ZW52Lmludm9rZV9paWk7dmFyIENhPWVudi5pbnZva2VfaWlpaWlpO3ZhciBEYT1lbnYuaW52b2tlX3ZpaWlpO3ZhciBFYT1lbnYuX2ZhYnM7dmFyIEZhPWVudi5fc3NjYW5mO3ZhciBHYT1lbnYuX3B0aHJlYWRfY29uZF93YWl0O3ZhciBIYT1lbnYuX19fY3R5cGVfdG9sb3dlcl9sb2M7dmFyIElhPWVudi5fYXNwcmludGY7dmFyIEphPWVudi5fX2VtYmluZF9yZWdpc3Rlcl92b2lkO3ZhciBLYT1lbnYuX3NlbmQ7dmFyIExhPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldzt2YXIgTWE9ZW52Ll92c3NjYW5mO3ZhciBOYT1lbnYuX19fY3R5cGVfYl9sb2M7dmFyIE9hPWVudi5fX1pTdDl0ZXJtaW5hdGV2O3ZhciBQYT1lbnYuX2Ztb2Q7dmFyIFFhPWVudi5fX19jeGFfZ3VhcmRfYWNxdWlyZTt2YXIgUmE9ZW52Ll9fX3NldEVyck5vO3ZhciBTYT1lbnYuX19fY3hhX2lzX251bWJlcl90eXBlO3ZhciBUYT1lbnYuX19fZ3h4X3BlcnNvbmFsaXR5X3YwO3ZhciBVYT1lbnYuX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcjt2YXIgVmE9ZW52Ll91bmdldGM7dmFyIFdhPWVudi5fX19hc3NlcnRfZmFpbDt2YXIgWGE9ZW52Ll9fX2N4YV9hbGxvY2F0ZV9leGNlcHRpb247dmFyIFlhPWVudi5fX1pTdDE4dW5jYXVnaHRfZXhjZXB0aW9udjt2YXIgWmE9ZW52Ll9fX2N0eXBlX3RvdXBwZXJfbG9jO3ZhciBfYT1lbnYuX2ZmbHVzaDt2YXIgJGE9ZW52Ll9fX2N4YV9ndWFyZF9yZWxlYXNlO3ZhciBhYj1lbnYuX19hZGREYXlzO3ZhciBiYj1lbnYuX19fZXJybm9fbG9jYXRpb247dmFyIGNiPWVudi5fcHdyaXRlO3ZhciBkYj1lbnYuX3N0cmVycm9yX3I7dmFyIGViPWVudi5fc3RyZnRpbWVfbDt2YXIgZmI9ZW52Ll9fZm9ybWF0U3RyaW5nO3ZhciBnYj1lbnYuX19yZWFsbHlOZWdhdGl2ZTt2YXIgaGI9ZW52Ll9zYnJrO3ZhciBpYj1lbnYuX3VzZWxvY2FsZTt2YXIgamI9ZW52Ll9jYXRnZXRzO3ZhciBrYj1lbnYuX25ld2xvY2FsZTt2YXIgbGI9ZW52Ll9zbnByaW50Zjt2YXIgbWI9ZW52Ll9fX2N4YV9iZWdpbl9jYXRjaDt2YXIgbmI9ZW52Ll9lbXNjcmlwdGVuX21lbWNweV9iaWc7dmFyIG9iPWVudi5fZmlsZW5vO3ZhciBwYj1lbnYuX19lbWJpbmRfcmVnaXN0ZXJfYm9vbDt2YXIgcWI9ZW52Ll9fX3Jlc3VtZUV4Y2VwdGlvbjt2YXIgcmI9ZW52Ll9fX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoO3ZhciBzYj1lbnYuX3N5c2NvbmY7dmFyIHRiPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nO3ZhciB1Yj1lbnYuX3N0cmZ0aW1lO3ZhciB2Yj1lbnYuX19hcnJheVN1bTt2YXIgd2I9ZW52Ll9fX2N4YV90aHJvdzt2YXIgeGI9ZW52Ll9fZW1iaW5kX3JlZ2lzdGVyX2VtdmFsO3ZhciB5Yj1lbnYuX19leGl0O3ZhciB6Yj1lbnYuX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfZnVuY3Rpb247dmFyIEFiPWVudi5fX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXY7dmFyIEJiPWVudi5fcHRocmVhZF9tdXRleF9kZXN0cm95O3ZhciBDYj1lbnYuX3B0aHJlYWRfbXV0ZXhfdW5sb2NrO3ZhciBEYj1lbnYuX2ZyZWFkO3ZhciBFYj1lbnYuX3B0aHJlYWRfY29uZF9icm9hZGNhc3Q7dmFyIEZiPWVudi5fbWtwb3J0O3ZhciBHYj1lbnYuX3NwcmludGY7dmFyIEhiPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9jbGFzczt2YXIgSWI9ZW52Ll92YXNwcmludGY7dmFyIEpiPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9zdGRfd3N0cmluZzt2YXIgS2I9ZW52Ll93cml0ZTt2YXIgTGI9ZW52Ll9faXNMZWFwWWVhcjt2YXIgTWI9ZW52Ll9fc2NhblN0cmluZzt2YXIgTmI9ZW52Ll9zdHJlcnJvcjt2YXIgT2I9ZW52Ll9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yO3ZhciBQYj1lbnYuX3JlY3Y7dmFyIFFiPWVudi5fdnNucHJpbnRmO3ZhciBSYj1lbnYuX19aTlN0OWV4Y2VwdGlvbkQyRXY7dmFyIFNiPWVudi5fY29weXNpZ247dmFyIFRiPWVudi5fZmdldGM7dmFyIFViPWVudi5fX19jeGFfZG9lc19pbmhlcml0O3ZhciBWYj1lbnYuX2ZyZWVsb2NhbGU7dmFyIFdiPWVudi5fcmVhZDt2YXIgWGI9ZW52Ll9hYm9ydDt2YXIgWWI9ZW52Ll9jYXRjbG9zZTt2YXIgWmI9ZW52Ll9md3JpdGU7dmFyIF9iPWVudi5fdGltZTt2YXIgJGI9ZW52Ll9wdGhyZWFkX211dGV4X2xvY2s7dmFyIGFjPWVudi5fX2VtYmluZF9yZWdpc3Rlcl9mbG9hdDt2YXIgYmM9ZW52Ll9wcmVhZDt2YXIgY2M9ZW52Ll9hdGV4aXQ7dmFyIGRjPWVudi5fY2F0b3Blbjt2YXIgZWM9ZW52Ll9leGl0O3ZhciBmYz1lbnYuX19nZXRGbG9hdDt2YXIgZ2M9MC4wOwovLyBFTVNDUklQVEVOX1NUQVJUX0ZVTkNTCmZ1bmN0aW9uIEFjKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2k9aSthfDA7aT1pKzcmLTg7cmV0dXJuIGJ8MH1mdW5jdGlvbiBCYygpe3JldHVybiBpfDB9ZnVuY3Rpb24gQ2MoYSl7YT1hfDA7aT1hfWZ1bmN0aW9uIERjKGEsYil7YT1hfDA7Yj1ifDA7aWYoKHR8MCk9PTApe3Q9YTt1PWJ9fWZ1bmN0aW9uIEVjKGIpe2I9YnwwO2Fbaz4+MF09YVtiPj4wXTthW2srMT4+MF09YVtiKzE+PjBdO2FbaysyPj4wXT1hW2IrMj4+MF07YVtrKzM+PjBdPWFbYiszPj4wXX1mdW5jdGlvbiBGYyhiKXtiPWJ8MDthW2s+PjBdPWFbYj4+MF07YVtrKzE+PjBdPWFbYisxPj4wXTthW2srMj4+MF09YVtiKzI+PjBdO2FbayszPj4wXT1hW2IrMz4+MF07YVtrKzQ+PjBdPWFbYis0Pj4wXTthW2srNT4+MF09YVtiKzU+PjBdO2Fbays2Pj4wXT1hW2IrNj4+MF07YVtrKzc+PjBdPWFbYis3Pj4wXX1mdW5jdGlvbiBHYyhhKXthPWF8MDtJPWF9ZnVuY3Rpb24gSGMoKXtyZXR1cm4gSXwwfWZ1bmN0aW9uIEljKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtmPWk7aT1pKzE2fDA7bT1mO2w9U2MoamgoU2MoODM1Miw1MTY4KXwwLGUpfDAsNTE4NCl8MDtqPWNbbCsoKGNbKGNbbD4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO2g9ais0fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1ttPj4yXT0xMzQ1NjtjW20rND4+Ml09MjA4O2NbbSs4Pj4yXT0wO2NnKDEzNDU2LG0pfW09KGNbMTM0NjA+PjJdfDApKyAtMXwwO249Y1tqKzg+PjJdfDA7aWYoKGNbaisxMj4+Ml18MCktbj4+Mj4+PjA+bT4+PjA/KGs9Y1tuKyhtPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7az14Y1tjWyhjW2s+PjJdfDApKzI4Pj4yXSY2M10oaywxMCl8MDtuPWNbaD4+Ml18MDtjW2g+PjJdPW4rIC0xO2lmKChufDApPT0wKXtsY1tjWyhjW2o+PjJdfDApKzg+PjJdJjI1NV0oail9bGgobCxrKTtZZyhsKTt3aGlsZSgxKXtoPXVuKDIwKXwwO2lmKChofDApIT0wKXticmVha31oPWNbNTY2Nl18MDtjWzU2NjZdPWgrMDtpZigoaHwwKT09MCl7Zz0xNDticmVha31zY1toJjMxXSgpfWlmKChnfDApPT0xNCl7bj1YYSg0KXwwO2Nbbj4+Ml09MjI2ODA7d2IobnwwLDIyNzI4LDIwNil9Y1toPj4yXT1kO2NbaCs0Pj4yXT1lO2NbaCs4Pj4yXT0wO2FbaCsxMj4+MF09MDthW2grMTM+PjBdPTA7Y1toKzE2Pj4yXT0wO3doaWxlKDEpe2Q9dW4oMTYpfDA7aWYoKGR8MCkhPTApe2JyZWFrfWU9Y1s1NjY2XXwwO2NbNTY2Nl09ZSswO2lmKChlfDApPT0wKXtnPTIwO2JyZWFrfXNjW2UmMzFdKCl9aWYoKGd8MCk9PTIwKXtuPVhhKDQpfDA7Y1tuPj4yXT0yMjY4MDt3YihufDAsMjI3MjgsMjA2KX1jW2QrND4+Ml09MDtjW2QrOD4+Ml09MDtjW2Q+PjJdPTc0MDg7Y1tkKzEyPj4yXT1oO2NbYj4+Ml09aDtuPWIrNHwwO2U9Y1tuPj4yXXwwO2Nbbj4+Ml09ZDtpZigoZXwwKSE9MCl7bT1lKzR8MDtuPWNbbT4+Ml18MDtjW20+PjJdPW4rIC0xO2lmKChufDApPT0wPyhsY1tjWyhjW2U+PjJdfDApKzg+PjJdJjI1NV0oZSksbT1lKzh8MCxuPWNbbT4+Ml18MCxjW20+PjJdPW4rIC0xLChufDApPT0wKTowKXtsY1tjWyhjW2U+PjJdfDApKzE2Pj4yXSYyNTVdKGUpfWg9Y1tiPj4yXXwwfXdoaWxlKDEpe2U9dW4oMzUyKXwwO2lmKChlfDApIT0wKXticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7Zz0zMTticmVha31zY1tlJjMxXSgpfWlmKChnfDApPT0zMSl7bj1YYSg0KXwwO2Nbbj4+Ml09MjI2ODA7d2IobnwwLDIyNzI4LDIwNil9Y1tlPj4yXT1oO2NbZSs0Pj4yXT1oO2NbZSs4Pj4yXT0wO2NbZSsxMj4+Ml09MDtqPXVuKDEwNDg2NDQpfDA7aD1qKzY4Ji02NDtjW2grIC00Pj4yXT1qO2NbZSsxNj4+Ml09aDtoPWUrMjc5fDA7YVtoPj4wXT0wO2FbaCsxPj4wXT0wO2g9ZSsyODF8MDthW2g+PjBdPTA7YVtoKzE+PjBdPTA7YVtoKzI+PjBdPTA7YVtoKzM+PjBdPTA7aD1lKzM0NHwwO2o9ZSsyODh8MDtkPWorNTZ8MDtkb3tjW2o+PjJdPTA7aj1qKzR8MH13aGlsZSgoanwwKTwoZHwwKSk7bj1oO2Nbbj4+Ml09LTE7Y1tuKzQ+PjJdPS0xO29lKGUpO3doaWxlKDEpe2Q9dW4oMTYpfDA7aWYoKGR8MCkhPTApe2JyZWFrfWQ9Y1s1NjY2XXwwO2NbNTY2Nl09ZCswO2lmKChkfDApPT0wKXtnPTM3O2JyZWFrfXNjW2QmMzFdKCl9aWYoKGd8MCk9PTM3KXtuPVhhKDQpfDA7Y1tuPj4yXT0yMjY4MDt3YihufDAsMjI3MjgsMjA2KX1jW2QrND4+Ml09MDtjW2QrOD4+Ml09MDtjW2Q+PjJdPTcxMjg7Y1tkKzEyPj4yXT1lO2NbYis4Pj4yXT1lO249YisxMnwwO2c9Y1tuPj4yXXwwO2Nbbj4+Ml09ZDtpZigoZ3wwKT09MCl7aT1mO3JldHVybn1tPWcrNHwwO249Y1ttPj4yXXwwO2NbbT4+Ml09bisgLTE7aWYoKG58MCkhPTApe2k9ZjtyZXR1cm59bGNbY1soY1tnPj4yXXwwKSs4Pj4yXSYyNTVdKGcpO209Zys4fDA7bj1jW20+PjJdfDA7Y1ttPj4yXT1uKyAtMTtpZigobnwwKSE9MCl7aT1mO3JldHVybn1sY1tjWyhjW2c+PjJdfDApKzE2Pj4yXSYyNTVdKGcpO2k9ZjtyZXR1cm59bj1YYSg0KXwwO2Nbbj4+Ml09MjEzMDQ7d2IobnwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gSmMoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTA7aD1pO2k9aSsxNzZ8MDtnPWg7az1oKzMyfDA7aj1oKzI0fDA7Zj1oKzEyfDA7Yj1jW2IrOD4+Ml18MDttPWIrMzM2fDA7Qj1tO0M9YisyNTl8MDtsPWIrMzIwfDA7aWYoKCEoKGNbQis0Pj4yXXwwKT09MD8oY1tCPj4yXXwwKT09KGRbQz4+MF18ZFtDKzE+PjBdPDw4fGRbQysyPj4wXTw8MTZ8ZFtDKzM+PjBdPDwyNHwwKTowKT8obj1jW2w+PjJdfDAsKG58MCkhPTApOjApPyhjW2IrMzEyPj4yXXwwKSE9MDowKXt6PW47Qj1jW3o+PjJdfDA7Qj1jW0I+PjJdfDA7bWNbQiYxMjddKHosZSk7ej1tO0I9ejtCPWNbQj4+Ml18MDt6PXorNHwwO3o9Y1t6Pj4yXXwwO3o9SW4oQnwwLHp8MCwxLDApfDA7Qj1JO0M9bTtBPUM7Y1tBPj4yXT16O0M9Qys0fDA7Y1tDPj4yXT1CO2k9aDtyZXR1cm59Y1tsPj4yXT0wO249YiszMjR8MDtwPWNbbj4+Ml18MDtjW24+PjJdPTA7aWYoKChwfDApIT0wPyhCPXArNHwwLEM9Y1tCPj4yXXwwLGNbQj4+Ml09QysgLTEsKEN8MCk9PTApOjApPyhsY1tjWyhjW3A+PjJdfDApKzg+PjJdJjI1NV0ocCksQj1wKzh8MCxDPWNbQj4+Ml18MCxjW0I+PjJdPUMrIC0xLChDfDApPT0wKTowKXtsY1tjWyhjW3A+PjJdfDApKzE2Pj4yXSYyNTVdKHApfXM9YiszMTJ8MDtjW3M+PjJdPTA7cj1iKzMxNnwwO3A9Y1tyPj4yXXwwO2Nbcj4+Ml09MDtpZigoKHB8MCkhPTA/KEI9cCs0fDAsQz1jW0I+PjJdfDAsY1tCPj4yXT1DKyAtMSwoQ3wwKT09MCk6MCk/KGxjW2NbKGNbcD4+Ml18MCkrOD4+Ml0mMjU1XShwKSxCPXArOHwwLEM9Y1tCPj4yXXwwLGNbQj4+Ml09QysgLTEsKEN8MCk9PTApOjApe2xjW2NbKGNbcD4+Ml18MCkrMTY+PjJdJjI1NV0ocCl9d2hpbGUoMSl7cD11bigxMil8MDtpZigocHwwKSE9MCl7YnJlYWt9cD1jWzU2NjZdfDA7Y1s1NjY2XT1wKzA7aWYoKHB8MCk9PTApe289MTU7YnJlYWt9c2NbcCYzMV0oKX1pZigob3wwKT09MTUpe0M9WGEoNCl8MDtjW0M+PjJdPTIyNjgwO3diKEN8MCwyMjcyOCwyMDYpfWNbcD4+Ml09Yis0O2NbcCs0Pj4yXT0wO2NbcCs4Pj4yXT0tMTt3aGlsZSgxKXt0PXVuKDE2KXwwO2lmKCh0fDApIT0wKXticmVha310PWNbNTY2Nl18MDtjWzU2NjZdPXQrMDtpZigodHwwKT09MCl7bz0yMTticmVha31zY1t0JjMxXSgpfWlmKChvfDApPT0yMSl7Qz1YYSg0KXwwO2NbQz4+Ml09MjI2ODA7d2IoQ3wwLDIyNzI4LDIwNil9Y1t0KzQ+PjJdPTA7Y1t0Kzg+PjJdPTA7Y1t0Pj4yXT00ODQwO2NbdCsxMj4+Ml09cDtjW3M+PjJdPXA7dT1jW3I+PjJdfDA7Y1tyPj4yXT10O2lmKCh1fDApIT0wKXtCPXUrNHwwO0M9Y1tCPj4yXXwwO2NbQj4+Ml09QysgLTE7aWYoKEN8MCk9PTA/KGxjW2NbKGNbdT4+Ml18MCkrOD4+Ml0mMjU1XSh1KSxCPXUrOHwwLEM9Y1tCPj4yXXwwLGNbQj4+Ml09QysgLTEsKEN8MCk9PTApOjApe2xjW2NbKGNbdT4+Ml18MCkrMTY+PjJdJjI1NV0odSl9cD1jW3M+PjJdfDB9eT1rKzY0fDA7cz1rKzh8MDtjW3M+PjJdPTQ1MjA7dT1rKzEyfDA7Y1trPj4yXT00NjUyO2NbeT4+Ml09NDY3MjtjW2srND4+Ml09MDtyPWsrNjR8MDtjW2srODg+PjJdPXU7Y1trKzgwPj4yXT0wO2Nbays4ND4+Ml09MDtjW2srNjg+PjJdPTQwOTg7Y1trKzc2Pj4yXT0wO2Nbays3Mj4+Ml09Njt4PWsrOTJ8MDt0PWsrOTZ8MDt3PXQrNDB8MDtkb3tjW3Q+PjJdPTA7dD10KzR8MH13aGlsZSgodHwwKTwod3wwKSk7WGsoeCk7Y1trKzEzNj4+Ml09MDtjW2srMTQwPj4yXT0tMTtjW2s+PjJdPTQ1MDA7Y1t5Pj4yXT00NTQwO2Nbcz4+Ml09NDUyMDtjW3U+PjJdPTEwNjY0O3Q9aysxNnwwO1hrKHQpO3g9aysyMHwwO2NbeCswPj4yXT0wO2NbeCs0Pj4yXT0wO2NbeCs4Pj4yXT0wO2NbeCsxMj4+Ml09MDtjW3grMTY+PjJdPTA7Y1t4KzIwPj4yXT0wO2NbdT4+Ml09NDY4ODt1PWsrNDR8MDt5PWsrNjB8MDtjW3UrMD4+Ml09MDtjW3UrND4+Ml09MDtjW3UrOD4+Ml09MDtjW3UrMTI+PjJdPTA7Y1t5Pj4yXT0yNDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDthW3UrMT4+MF09MDtpZigoYVt1Pj4wXSYxKT09MCl7YVt1Pj4wXT0wfWVsc2V7Y1trKzQ4Pj4yXT0wfXc9ays1NnwwO2Nbdz4+Ml09MDt6PWFbdT4+MF18MDtpZigoeiYxKT09MCl7QT11KygoeiYyNTUpPj4+MSkrMXwwO2Nbdz4+Ml09QTt6PXUrMXwwfWVsc2V7ej1jW2srNTI+PjJdfDA7QT16KyhjW2srNDg+PjJdfDApfDA7Y1t3Pj4yXT1BfWNbeD4+Ml09ejtjW2srMjQ+PjJdPXo7Y1trKzI4Pj4yXT1BO0M9YVt1Pj4wXXwwO2lmKChDJjEpPT0wKXt6PShDJjI1NSk+Pj4xO2Nbdz4+Ml09dSt6KzE7QT0xMH1lbHNle3o9Y1trKzQ4Pj4yXXwwO2Nbdz4+Ml09KGNbays1Mj4+Ml18MCkrejtBPWNbdT4+Ml18MDtDPUEmMjU1O0E9KEEmLTIpKyAtMXwwfUI9KEMmMSk9PTA7aWYoQil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1trKzQ4Pj4yXXwwfWRve2lmKCEoQz4+PjA8QT4+PjApKXtpZihCKXthW3UrQSsxPj4wXT0wO2FbdT4+MF09QTw8MTticmVha31lbHNle2FbKGNbays1Mj4+Ml18MCkrQT4+MF09MDtjW2srNDg+PjJdPUE7YnJlYWt9fWVsc2V7aGcodSxBLUN8MCl9fXdoaWxlKDApO0I9YVt1Pj4wXXwwO2lmKChCJjEpPT0wKXtBPXUrMXwwO0I9KEImMjU1KT4+PjF9ZWxzZXtBPWNbays1Mj4+Ml18MDtCPWNbays0OD4+Ml18MH1DPWsrMzZ8MDtjW0M+PjJdPUE7Y1trKzMyPj4yXT1BO2Nbays0MD4+Ml09QStCO2lmKChjW3k+PjJdJjN8MCkhPTApe2NbQz4+Ml09QSt6fWlmKCEoKGFbZz4+MF0mMSk9PTApPyh2PWNbZys4Pj4yXXwwLCh2fDApIT0wKTowKXt2bih2KX1BPWNbYiszMDA+PjJdfDA7dj1jW2IrMzA0Pj4yXXwwO2lmKChBfDApIT0odnwwKSl7ej1rKzh8MDtkb3tCPWNbQT4+Ml18MDtDPWNbQSs0Pj4yXXwwO0Q9Y1tBKzg+PjJdfDA7aWgoU2MoaWgoU2MoaWgoU2Moeiw0NDY0KXwwLEQpfDAsNDQ3Mil8MCxCKXwwLDQ0ODApfDAsQyl8MDtBPUErMTJ8MH13aGlsZSgoQXwwKSE9KHZ8MCkpfXY9Y1t5Pj4yXXwwO2Rve2lmKCh2JjE2fDApPT0wKXtpZigodiY4fDApPT0wKXtjW2YrMD4+Ml09MDtjW2YrND4+Ml09MDtjW2YrOD4+Ml09MDticmVha314PWNbeD4+Ml18MDt3PWNbaysyOD4+Ml18MDt2PXg7QT13LXZ8MDtpZihBPj4+MD40Mjk0OTY3Mjc5KXtkZygpfWRve2lmKEE+Pj4wPDExKXthW2Y+PjBdPUE8PDE7Qj1mKzF8MH1lbHNle3o9QSsxNiYtMTY7eT0oenwwKT09MD8xOno7d2hpbGUoMSl7Qj11bih5KXwwO2lmKChCfDApIT0wKXtvPTkzO2JyZWFrfUI9Y1s1NjY2XXwwO2NbNTY2Nl09QiswO2lmKChCfDApPT0wKXticmVha31zY1tCJjMxXSgpfWlmKChvfDApPT05Myl7Y1tmKzg+PjJdPUI7Y1tmPj4yXT16fDE7Y1tmKzQ+PjJdPUE7YnJlYWt9RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKCh4fDApIT0od3wwKSl7bz1CO3doaWxlKDEpe2Fbbz4+MF09YVt4Pj4wXXwwO3g9eCsxfDA7aWYoKHh8MCk9PSh3fDApKXticmVha31lbHNle289bysxfDB9fUI9QisodysoMC12KSl8MH1hW0I+PjBdPTB9ZWxzZXt4PWNbdz4+Ml18MDt2PWNbayszNj4+Ml18MDtpZih4Pj4+MDx2Pj4+MCl7Y1t3Pj4yXT12fWVsc2V7dj14fXg9Y1trKzMyPj4yXXwwO3c9eDt6PXYtd3wwO2lmKHo+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9ZG97aWYoej4+PjA8MTEpe2FbZj4+MF09ejw8MTtCPWYrMXwwfWVsc2V7eT16KzE2Ji0xNjtBPSh5fDApPT0wPzE6eTt3aGlsZSgxKXtCPXVuKEEpfDA7aWYoKEJ8MCkhPTApe289NzY7YnJlYWt9Qj1jWzU2NjZdfDA7Y1s1NjY2XT1CKzA7aWYoKEJ8MCk9PTApe2JyZWFrfXNjW0ImMzFdKCl9aWYoKG98MCk9PTc2KXtjW2YrOD4+Ml09QjtjW2Y+PjJdPXl8MTtjW2YrND4+Ml09ejticmVha31EPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKHh8MCkhPSh2fDApKXtvPUI7d2hpbGUoMSl7YVtvPj4wXT1hW3g+PjBdfDA7eD14KzF8MDtpZigoeHwwKT09KHZ8MCkpe2JyZWFrfWVsc2V7bz1vKzF8MH19Qj1CKyh2KygwLXcpKXwwfWFbQj4+MF09MH19d2hpbGUoMCk7Y1trPj4yXT00NTAwO2Nbays2ND4+Ml09NDU0MDtjW3M+PjJdPTQ1MjA7bz1rKzEyfDA7Y1tvPj4yXT00Njg4O2lmKCEoKGFbdT4+MF0mMSk9PTApPyhxPWNbays1Mj4+Ml18MCwocXwwKSE9MCk6MCl7dm4ocSl9Y1tvPj4yXT0xMDY2NDtvPWNbdD4+Ml18MDtDPW8rNHwwO0Q9Y1tDPj4yXXwwO2NbQz4+Ml09RCsgLTE7aWYoKER8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1yZyhyKTtxPWFbZj4+MF18MDtyPShxJjEpPT0wO2lmKHIpe3Q9KHEmMjU1KT4+PjE7dj1mKzF8MH1lbHNle3Q9Y1tmKzQ+PjJdfDA7dj1jW2YrOD4+Ml18MH1zPXQ+Pj4wPjc7bz1zPzc6dDthOmRve2lmKChvfDApPT0wKXtvPTExMH1lbHNle3U9MTkyO3doaWxlKDEpe2lmKChhW3Y+PjBdfDApIT0oYVt1Pj4wXXwwKSl7bz0xMzA7YnJlYWsgYX1vPW8rIC0xfDA7aWYoKG98MCk9PTApe289MTEwO2JyZWFrfWVsc2V7dj12KzF8MDt1PXUrMXwwfX19fXdoaWxlKDApO2Rve2lmKChvfDApPT0xMTApe2lmKHQ+Pj4wPjYmKHNeMSkpe3doaWxlKDEpe2o9dW4oNDc4OCl8MDtpZigoanwwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe289MTE0O2JyZWFrfXNjW2cmMzFdKCl9aWYoKG98MCk9PTExNCl7RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9ZmQoaik7YVtqKzQ3ODQ+PjBdPTE7d2hpbGUoMSl7Zz11bigxMil8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe289MTIxO2JyZWFrfXNjW2cmMzFdKCl9aWYoKG98MCk9PTEyMSl7RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9Y1tnPj4yXT0zNjA4O2NbZys0Pj4yXT1wO2NbZys4Pj4yXT1qO3doaWxlKDEpe2o9dW4oMTYpfDA7aWYoKGp8MCkhPTApe289MTI5O2JyZWFrfWo9Y1s1NjY2XXwwO2NbNTY2Nl09aiswO2lmKChqfDApPT0wKXticmVha31zY1tqJjMxXSgpfWlmKChvfDApPT0xMjkpe2Nbais0Pj4yXT0wO2Nbais4Pj4yXT0wO2Nbaj4+Ml09Mzg3MjtjW2orMTI+PjJdPWc7YnJlYWt9RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9ZWxzZXtvPTEzMH19fXdoaWxlKDApO2I6ZG97aWYoKG98MCk9PTEzMCl7aWYocil7dD0ocSYyNTUpPj4+MTt3PWYrMXwwfWVsc2V7dD1jW2YrND4+Ml18MDt3PWNbZis4Pj4yXXwwfXM9dD4+PjA+MTM7dT1zPzEzOnQ7Yzpkb3tpZigodXwwKT09MCl7bz0xMzZ9ZWxzZXt2PTIwMDt3aGlsZSgxKXtpZigoYVt3Pj4wXXwwKSE9KGFbdj4+MF18MCkpe2JyZWFrIGN9dT11KyAtMXwwO2lmKCh1fDApPT0wKXtvPTEzNjticmVha31lbHNle3c9dysxfDA7dj12KzF8MH19fX13aGlsZSgwKTtkb3tpZigob3wwKT09MTM2KXtpZighKHQ+Pj4wPjEyJihzXjEpKSl7YnJlYWt9d2hpbGUoMSl7aj11big1MTE2KXwwO2lmKChqfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0xNDA7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MTQwKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1mZChqKTtlZChqKzQ3ODR8MCk7Y1tqKzQ5NTI+PjJdPTMyO2Nbais0OTU2Pj4yXT05O2Nbais0OTYwPj4yXT04O2Nbais0OTY0Pj4yXT0wO2Nbais0OTg0Pj4yXT0wO2Nbais0OTg4Pj4yXT0wO2Nbais0OTkyPj4yXT0wO2Nbais1MDA4Pj4yXT0xO2Nbais1MDEyPj4yXT0yO2Nbais1MDA0Pj4yXT00MDk2O2Nbais1ZTM+PjJdPTQ7Y1tqKzQ5OTY+PjJdPTQ7Y1tqKzUwMTY+PjJdPTA7Y1tqKzUwMjA+PjJdPTA7Y1tqKzUwMjQ+PjJdPTA7Y1tqKzQ5Njg+PjJdPTMyO2Nbais0OTcyPj4yXT0wO2Nbais0OTc2Pj4yXT0tMjE0NzQ4MzY0ODtjW2orNDk4MD4+Ml09MjE0NzQ4MzY0NztjW2orNDk0OD4+Ml09MDtjW2orNTAzMj4+Ml09MzI7Y1tqKzUwMzY+PjJdPTk7Y1tqKzUwNDA+PjJdPTg7Y1tqKzUwNDQ+PjJdPTA7Y1tqKzUwNjQ+PjJdPTA7Y1tqKzUwNjg+PjJdPTA7Y1tqKzUwNzI+PjJdPTA7Y1tqKzUwODg+PjJdPTE7Y1tqKzUwOTI+PjJdPTI7Y1tqKzUwODQ+PjJdPTQwOTY7Y1tqKzUwODA+PjJdPTQ7Y1tqKzUwNzY+PjJdPTQ7Y1tqKzUwOTY+PjJdPTA7Y1tqKzUxMDA+PjJdPTA7Y1tqKzUxMDQ+PjJdPTA7Y1tqKzUwNDg+PjJdPTMyO2Nbais1MDUyPj4yXT0wO2Nbais1MDU2Pj4yXT0tMjE0NzQ4MzY0ODtjW2orNTA2MD4+Ml09MjE0NzQ4MzY0NztjW2orNTAyOD4+Ml09MDthW2orNTEwOD4+MF09MDthW2orNTEwOT4+MF09MDthW2orNTExMj4+MF09MTt3aGlsZSgxKXtnPXVuKDEyKXwwO2lmKChnfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0xNDg7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MTQ4KXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1jW2c+PjJdPTI2NjQ7Y1tnKzQ+PjJdPXA7Y1tnKzg+PjJdPWo7d2hpbGUoMSl7aj11bigxNil8MDtpZigoanwwKSE9MCl7bz0xNTY7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2JyZWFrfXNjW2omMzFdKCl9aWYoKG98MCk9PTE1Nil7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7Y1tqPj4yXT0yOTUyO2NbaisxMj4+Ml09ZzticmVhayBifUQ9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihyKXt0PShxJjI1NSk+Pj4xO3Y9ZisxfDB9ZWxzZXt0PWNbZis0Pj4yXXwwO3Y9Y1tmKzg+PjJdfDB9cz10Pj4+MD4xMzt1PXM/MTM6dDtkOmRve2lmKCh1fDApPT0wKXtvPTE2M31lbHNle3c9MjE2O3doaWxlKDEpe2lmKChhW3Y+PjBdfDApIT0oYVt3Pj4wXXwwKSl7YnJlYWsgZH11PXUrIC0xfDA7aWYoKHV8MCk9PTApe289MTYzO2JyZWFrfWVsc2V7dj12KzF8MDt3PXcrMXwwfX19fXdoaWxlKDApO2Rve2lmKChvfDApPT0xNjMpe2lmKCEodD4+PjA+MTImKHNeMSkpKXticmVha313aGlsZSgxKXtqPXVuKDUxMDQpfDA7aWYoKGp8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtvPTE2NzticmVha31zY1tnJjMxXSgpfWlmKChvfDApPT0xNjcpe0Q9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfWZkKGopO2JkKGorNDc4NHwwKTthW2orNTEwMD4+MF09MTt3aGlsZSgxKXtnPXVuKDEyKXwwO2lmKChnfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0xNzU7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MTc1KXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1jW2c+PjJdPTE3MjA7Y1tnKzQ+PjJdPXA7Y1tnKzg+PjJdPWo7d2hpbGUoMSl7aj11bigxNil8MDtpZigoanwwKSE9MCl7bz0xODM7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2JyZWFrfXNjW2omMzFdKCl9aWYoKG98MCk9PTE4Myl7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7Y1tqPj4yXT0yMDA4O2NbaisxMj4+Ml09ZzticmVhayBifUQ9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihyKXtyPShxJjI1NSk+Pj4xO3Q9ZisxfDB9ZWxzZXtyPWNbZis0Pj4yXXwwO3Q9Y1tmKzg+PjJdfDB9cT1yPj4+MD4xOTtzPXE/MTk6cjtlOmRve2lmKChzfDApPT0wKXtvPTE5MH1lbHNle3U9MjMyO3doaWxlKDEpe2lmKChhW3Q+PjBdfDApIT0oYVt1Pj4wXXwwKSl7YnJlYWsgZX1zPXMrIC0xfDA7aWYoKHN8MCk9PTApe289MTkwO2JyZWFrfWVsc2V7dD10KzF8MDt1PXUrMXwwfX19fXdoaWxlKDApO2Rve2lmKChvfDApPT0xOTApe2lmKCEocj4+PjA+MTgmKHFeMSkpKXticmVha313aGlsZSgxKXtqPXVuKDU0MzIpfDA7aWYoKGp8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtvPTE5NDticmVha31zY1tnJjMxXSgpfWlmKChvfDApPT0xOTQpe0Q9WGEoNCl8MDtjW0Q+PjJdPTIyNjgwO3diKER8MCwyMjcyOCwyMDYpfWZkKGopO2VkKGorNDc4NHwwKTtjW2orNDk1Mj4+Ml09MzI7Y1tqKzQ5NTY+PjJdPTk7Y1tqKzQ5NjA+PjJdPTg7Y1tqKzQ5NjQ+PjJdPTA7Y1tqKzQ5ODQ+PjJdPTA7Y1tqKzQ5ODg+PjJdPTA7Y1tqKzQ5OTI+PjJdPTA7Y1tqKzUwMDg+PjJdPTE7Y1tqKzUwMTI+PjJdPTI7Y1tqKzUwMDQ+PjJdPTQwOTY7Y1tqKzVlMz4+Ml09NDtjW2orNDk5Nj4+Ml09NDtjW2orNTAxNj4+Ml09MDtjW2orNTAyMD4+Ml09MDtjW2orNTAyND4+Ml09MDtjW2orNDk2OD4+Ml09MzI7Y1tqKzQ5NzI+PjJdPTA7Y1tqKzQ5NzY+PjJdPS0yMTQ3NDgzNjQ4O2Nbais0OTgwPj4yXT0yMTQ3NDgzNjQ3O2Nbais0OTQ4Pj4yXT0wO2Nbais1MDMyPj4yXT0zMjtjW2orNTAzNj4+Ml09OTtjW2orNTA0MD4+Ml09ODtjW2orNTA0ND4+Ml09MDtjW2orNTA2ND4+Ml09MDtjW2orNTA2OD4+Ml09MDtjW2orNTA3Mj4+Ml09MDtjW2orNTA4OD4+Ml09MTtjW2orNTA5Mj4+Ml09MjtjW2orNTA4ND4+Ml09NDA5NjtjW2orNTA4MD4+Ml09NDtjW2orNTA3Nj4+Ml09NDtjW2orNTA5Nj4+Ml09MDtjW2orNTEwMD4+Ml09MDtjW2orNTEwND4+Ml09MDtjW2orNTA0OD4+Ml09MzI7Y1tqKzUwNTI+PjJdPTA7Y1tqKzUwNTY+PjJdPS0yMTQ3NDgzNjQ4O2Nbais1MDYwPj4yXT0yMTQ3NDgzNjQ3O2Nbais1MDI4Pj4yXT0wO2Fbais1MTA4Pj4wXT0wO2Fbais1MTA5Pj4wXT0wO2JkKGorNTExMnwwKTthW2orNTQyOD4+MF09MTt3aGlsZSgxKXtnPXVuKDEyKXwwO2lmKChnfDApIT0wKXticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0yMDM7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MjAzKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1jW2c+PjJdPTQyNDtjW2crND4+Ml09cDtjW2crOD4+Ml09ajt3aGlsZSgxKXtqPXVuKDE2KXwwO2lmKChqfDApIT0wKXtvPTIxMTticmVha31qPWNbNTY2Nl18MDtjWzU2NjZdPWorMDtpZigoanwwKT09MCl7YnJlYWt9c2NbaiYzMV0oKX1pZigob3wwKT09MjExKXtjW2orND4+Ml09MDtjW2orOD4+Ml09MDtjW2o+PjJdPTEwMDg7Y1tqKzEyPj4yXT1nO2JyZWFrIGJ9RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2g9U2MoODM1MiwyNTYpfDA7YVtrPj4wXT0wO2Nbays0Pj4yXT1oO2U9Y1soY1toPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2grKGUrMTYpPj4yXXwwKT09MCl7ZT1jW2grKGUrNzIpPj4yXXwwO2lmKChlfDApIT0wKXtZZyhlKX1hW2s+PjBdPTE7ZT1hW2Y+PjBdfDA7ZG97aWYoKGUmMSk9PTApe289KGUmMjU1KT4+PjE7bT1jWyhjW2g+PjJdfDApKyAtMTI+PjJdfDA7bD1jW2grKG0rMjQpPj4yXXwwO249ZisxfDA7aWYoKGNbaCsobSs0KT4+Ml0mMTc2fDApIT0zMil7ZT1uO2I9bzticmVha31lPW47Yj1vO249ZitvKzF8MH1lbHNle249Y1tmKzQ+PjJdfDA7bT1jWyhjW2g+PjJdfDApKyAtMTI+PjJdfDA7bD1jW2grKG0rMjQpPj4yXXwwO2Y9Y1tmKzg+PjJdfDA7aWYoKGNbaCsobSs0KT4+Ml0mMTc2fDApIT0zMil7ZT1mO2I9bjtuPWY7YnJlYWt9ZT1mO2I9bjtuPWYrbnwwfX13aGlsZSgwKTtmPWgrbXwwO289aCsobSs3Nil8MDtwPWNbbz4+Ml18MDtmOmRve2lmKChwfDApPT0tMSl7cD1jW2grKG0rMjgpPj4yXXwwO209cCs0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tnPj4yXT0xMzQ1NjtjW2crND4+Ml09MjA4O2NbZys4Pj4yXT0wO2NnKDEzNDU2LGcpfXE9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3I9Y1twKzg+PjJdfDA7ZG97aWYoKGNbcCsxMj4+Ml18MCktcj4+Mj4+PjA+cT4+PjApe3E9Y1tyKyhxPDwyKT4+Ml18MDtpZigocXwwKT09MCl7YnJlYWt9cT14Y1tjWyhjW3E+PjJdfDApKzI4Pj4yXSY2M10ocSwzMil8MDtEPWNbbT4+Ml18MDtjW20+PjJdPUQrIC0xO2lmKChEfDApPT0wKXtsY1tjWyhjW3A+PjJdfDApKzg+PjJdJjI1NV0ocCl9cD1xPDwyND4+MjQ7Y1tvPj4yXT1wO2JyZWFrIGZ9fXdoaWxlKDApO0Q9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtXYyhqLGwsZSxuLGUrYnwwLGYscCYyNTUpO2lmKChjW2o+PjJdfDApIT0wKXticmVha31EPWNbKGNbaD4+Ml18MCkrIC0xMj4+Ml18MDtxZyhoK0R8MCxjW2grKEQrMTYpPj4yXXw1KX19d2hpbGUoMCk7Z2goayk7Zj1jW2grKChjWyhjW2g+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtlPWYrNHwwO2NbZT4+Ml09KGNbZT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZz4+Ml09MTM0NTY7Y1tnKzQ+PjJdPTIwODtjW2crOD4+Ml09MDtjZygxMzQ1NixnKX1qPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtnPWNbZis4Pj4yXXwwO2Rve2lmKChjW2YrMTI+PjJdfDApLWc+PjI+Pj4wPmo+Pj4wKXtnPWNbZysoajw8Mik+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWc9eGNbY1soY1tnPj4yXXwwKSsyOD4+Ml0mNjNdKGcsMTApfDA7RD1jW2U+PjJdfDA7Y1tlPj4yXT1EKyAtMTtpZigoRHwwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfWxoKGgsZyk7WWcoaCk7Zj1YYSg4KXwwO2NbZj4+Ml09OTkyODt3aGlsZSgxKXtnPXVuKDQ1KXwwO2lmKChnfDApIT0wKXtvPTI1MzticmVha31nPWNbNTY2Nl18MDtjWzU2NjZdPWcrMDtpZigoZ3wwKT09MCl7bz0yNTE7YnJlYWt9c2NbZyYzMV0oKX1pZigob3wwKT09MjUxKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1lbHNlIGlmKChvfDApPT0yNTMpe2NbZys0Pj4yXT0zMjtjW2c+PjJdPTMyO3Q9ZysxMnwwO2NbZis0Pj4yXT10O2NbZys4Pj4yXT0wO3Q9dCswfDA7Zz0zMjB8MDt3PXQrMzN8MDtkb3thW3Q+PjBdPWFbZz4+MF18MDt0PXQrMXwwO2c9ZysxfDB9d2hpbGUoKHR8MCk8KHd8MCkpO2NbZj4+Ml09MzY4O3diKGZ8MCwzMDQsMjIpfX19d2hpbGUoMCk7RD1YYSg0KXwwO2NbRD4+Ml09MjEzMDQ7d2IoRHwwLDIxMzc2LDE5Nil9fXdoaWxlKDApO2Rve2lmKCEoKGFbZj4+MF0mMSk9PTApKXtmPWNbZis4Pj4yXXwwO2lmKChmfDApPT0wKXticmVha312bihmKX19d2hpbGUoMCk7Y1tsPj4yXT1nO2Y9Y1tuPj4yXXwwO2Nbbj4+Ml09ajtkb3tpZigoZnwwKSE9MCl7Qz1mKzR8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXticmVha31sY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZik7Qz1mKzh8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXticmVha31sY1tjWyhjW2Y+PjJdfDApKzE2Pj4yXSYyNTVdKGYpfX13aGlsZSgwKTtBPWIrMzI4fDA7Qz1BO0M9SW4oY1tDPj4yXXwwLGNbQys0Pj4yXXwwLDEsMCl8MDtjW0E+PjJdPUM7Y1tBKzQ+PjJdPUk7QT1tO2NbQT4+Ml09MDtjW0ErND4+Ml09MDtBPWNbbD4+Ml18MDtDPWNbQT4+Ml18MDtDPWNbQz4+Ml18MDttY1tDJjEyN10oQSxlKTtBPW07Qz1BO0M9Y1tDPj4yXXwwO0E9QSs0fDA7QT1jW0E+PjJdfDA7QT1JbihDfDAsQXwwLDEsMCl8MDtDPUk7RD1tO0I9RDtjW0I+PjJdPUE7RD1EKzR8MDtjW0Q+PjJdPUM7aT1oO3JldHVybn1mdW5jdGlvbiBLYyhhKXthPWF8MDthPShjW2ErOD4+Ml18MCkrMTI3fDA7cmV0dXJuIGRbYT4+MF18ZFthKzE+PjBdPDw4fGRbYSsyPj4wXTw8MTZ8ZFthKzM+PjBdPDwyNHwwfWZ1bmN0aW9uIExjKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGU9MCxmPTA7ZT1pO2Y9ZFthPj4wXXxkW2ErMT4+MF08PDh8ZFthKzI+PjBdPDwxNnxkW2ErMz4+MF08PDI0O2E9YSs0fDA7YT1kW2E+PjBdfGRbYSsxPj4wXTw8OHxkW2ErMj4+MF08PDE2fGRbYSszPj4wXTw8MjQ7Yj1iKyhhPj4xKXwwO2lmKChhJjF8MCk9PTApe2E9ZjthPW9jW2EmMTI3XShiKXwwO2k9ZTtyZXR1cm4gYXwwfWVsc2V7YT1jWyhjW2I+PjJdfDApK2Y+PjJdfDA7YT1vY1thJjEyN10oYil8MDtpPWU7cmV0dXJuIGF8MH1yZXR1cm4gMH1mdW5jdGlvbiBNYyhhLGIsZSl7YT1hfDA7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTA7Zj1pO2c9ZFthPj4wXXxkW2ErMT4+MF08PDh8ZFthKzI+PjBdPDwxNnxkW2ErMz4+MF08PDI0O2E9YSs0fDA7YT1kW2E+PjBdfGRbYSsxPj4wXTw8OHxkW2ErMj4+MF08PDE2fGRbYSszPj4wXTw8MjQ7Yj1iKyhhPj4xKXwwO2lmKChhJjF8MCk9PTApe2E9ZzttY1thJjEyN10oYixlKTtpPWY7cmV0dXJufWVsc2V7YT1jWyhjW2I+PjJdfDApK2c+PjJdfDA7bWNbYSYxMjddKGIsZSk7aT1mO3JldHVybn19ZnVuY3Rpb24gTmMoYSxiLGUsZil7YT1hfDA7Yj1ifDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTA7Zz1pO2g9ZFthPj4wXXxkW2ErMT4+MF08PDh8ZFthKzI+PjBdPDwxNnxkW2ErMz4+MF08PDI0O2E9YSs0fDA7YT1kW2E+PjBdfGRbYSsxPj4wXTw8OHxkW2ErMj4+MF08PDE2fGRbYSszPj4wXTw8MjQ7Yj1iKyhhPj4xKXwwO2lmKChhJjF8MCk9PTApe2E9aDtxY1thJjMxXShiLGUsZik7aT1nO3JldHVybn1lbHNle2E9Y1soY1tiPj4yXXwwKStoPj4yXXwwO3FjW2EmMzFdKGIsZSxmKTtpPWc7cmV0dXJufX1mdW5jdGlvbiBPYygpe3ZhciBhPTAsYj0wLGQ9MDtiPWk7d2hpbGUoMSl7ZD11bigxNil8MDtpZigoZHwwKSE9MCl7YT03O2JyZWFrfWQ9Y1s1NjY2XXwwO2NbNTY2Nl09ZCswO2lmKChkfDApPT0wKXticmVha31zY1tkJjMxXSgpfWlmKChhfDApPT03KXtjW2QrMD4+Ml09MDtjW2QrND4+Ml09MDtjW2QrOD4+Ml09MDtjW2QrMTI+PjJdPTA7aT1iO3JldHVybiBkfDB9ZD1YYSg0KXwwO2NbZD4+Ml09MjI2ODA7d2IoZHwwLDIyNzI4LDIwNik7cmV0dXJuIDB9ZnVuY3Rpb24gUGMoYSl7YT1hfDA7dmFyIGI9MDtiPWk7YT1rY1thJjMxXSgpfDA7aT1iO3JldHVybiBhfDB9ZnVuY3Rpb24gUWMoYSl7YT1hfDA7cmV0dXJuIDcyfWZ1bmN0aW9uIFJjKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufWQ9Y1thKzEyPj4yXXwwO2lmKCgoZHwwKSE9MD8oZj1kKzR8MCxlPWNbZj4+Ml18MCxjW2Y+PjJdPWUrIC0xLChlfDApPT0wKTowKT8obGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpLGU9ZCs4fDAsZj1jW2U+PjJdfDAsY1tlPj4yXT1mKyAtMSwoZnwwKT09MCk6MCl7bGNbY1soY1tkPj4yXXwwKSsxNj4+Ml0mMjU1XShkKX1kPWNbYSs0Pj4yXXwwO2lmKCgoZHwwKSE9MD8oZT1kKzR8MCxmPWNbZT4+Ml18MCxjW2U+PjJdPWYrIC0xLChmfDApPT0wKTowKT8obGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpLGU9ZCs4fDAsZj1jW2U+PjJdfDAsY1tlPj4yXT1mKyAtMSwoZnwwKT09MCk6MCl7bGNbY1soY1tkPj4yXXwwKSsxNj4+Ml0mMjU1XShkKX12bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFNjKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtmPWk7aT1pKzMyfDA7bz1mO2U9ZisxNnwwO2c9ZisxMnwwO2FbZT4+MF09MDtjW2UrND4+Ml09YjtwPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtpZigoY1tiKyhwKzE2KT4+Ml18MCk9PTApe2g9Y1tiKyhwKzcyKT4+Ml18MDtpZigoaHwwKSE9MCl7WWcoaCk7cD1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDB9YVtlPj4wXT0xO2o9Sm4oZHwwKXwwO209Y1tiKyhwKzI0KT4+Ml18MDtpZigoY1tiKyhwKzQpPj4yXSYxNzZ8MCk9PTMyKXtoPWQranwwfWVsc2V7aD1kfWw9YitwfDA7bj1iKyhwKzc2KXwwO3E9Y1tuPj4yXXwwO2Rve2lmKChxfDApPT0tMSl7cD1jW2IrKHArMjgpPj4yXXwwO3E9cCs0fDA7Y1txPj4yXT0oY1txPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tvPj4yXT0xMzQ1NjtjW28rND4+Ml09MjA4O2Nbbys4Pj4yXT0wO2NnKDEzNDU2LG8pfXI9KGNbMTM0NjA+PjJdfDApKyAtMXwwO289Y1twKzg+PjJdfDA7aWYoKGNbcCsxMj4+Ml18MCktbz4+Mj4+PjA+cj4+PjA/KGs9Y1tvKyhyPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7az14Y1tjWyhjW2s+PjJdfDApKzI4Pj4yXSY2M10oaywzMil8MDtyPWNbcT4+Ml18MDtjW3E+PjJdPXIrIC0xO2lmKChyfDApPT0wKXtsY1tjWyhjW3A+PjJdfDApKzg+PjJdJjI1NV0ocCl9cT1rPDwyND4+MjQ7Y1tuPj4yXT1xO2JyZWFrfXI9WGEoNCl8MDtjW3I+PjJdPTIxMzA0O3diKHJ8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtXYyhnLG0sZCxoLGQranwwLGwscSYyNTUpO2lmKChjW2c+PjJdfDApPT0wKXtyPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK3J8MCxjW2IrKHIrMTYpPj4yXXw1KX19Z2goZSk7aT1mO3JldHVybiBifDB9ZnVuY3Rpb24gVGMoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFVjKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gVmMoYSl7YT1hfDA7bWIoYXwwKXwwO09hKCl9ZnVuY3Rpb24gV2MoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MDtrPWk7aT1pKzE2fDA7bD1rO2lmKChkfDApPT0wKXtjW2I+PjJdPTA7aT1rO3JldHVybn1wPWU7bj1nLXB8MDtoPWgrMTJ8MDttPWNbaD4+Ml18MDtuPShtfDApPihufDApP20tbnwwOjA7bT1mO3A9bS1wfDA7aWYoKHB8MCk+MD8oaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsZSxwKXwwKSE9KHB8MCk6MCl7Y1tiPj4yXT0wO2k9aztyZXR1cm59ZG97aWYoKG58MCk+MCl7ZG97aWYobj4+PjA8MTEpe3A9bjw8MSYyNTU7YVtsPj4wXT1wO289bDtlPWwrMXwwfWVsc2V7cT1uKzE2Ji0xNjtwPShxfDApPT0wPzE6cTt3aGlsZSgxKXtlPXVuKHApfDA7aWYoKGV8MCkhPTApe289MTU7YnJlYWt9ZT1jWzU2NjZdfDA7Y1s1NjY2XT1lKzA7aWYoKGV8MCk9PTApe2JyZWFrfXNjW2UmMzFdKCl9aWYoKG98MCk9PTE1KXtjW2wrOD4+Ml09ZTtwPXF8MTtjW2w+PjJdPXA7Y1tsKzQ+PjJdPW47bz1sO3A9cCYyNTU7YnJlYWt9cT1YYSg0KXwwO2NbcT4+Ml09MjI2ODA7d2IocXwwLDIyNzI4LDIwNil9fXdoaWxlKDApO05uKGV8MCxqfDAsbnwwKXwwO2FbZStuPj4wXT0wO2lmKChwJjEpPT0wKXtqPWwrMXwwfWVsc2V7aj1jW2wrOD4+Ml18MH1pZigoaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsaixuKXwwKT09KG58MCkpe2lmKChhW28+PjBdJjEpPT0wKXticmVha31sPWNbbCs4Pj4yXXwwO2lmKChsfDApPT0wKXticmVha312bihsKTticmVha31jW2I+PjJdPTA7aWYoKGFbbz4+MF0mMSk9PTApe2k9aztyZXR1cm59Yj1jW2wrOD4+Ml18MDtpZigoYnwwKT09MCl7aT1rO3JldHVybn12bihiKTtpPWs7cmV0dXJufX13aGlsZSgwKTtsPWctbXwwO2lmKChsfDApPjA/KGhjW2NbKGNbZD4+Ml18MCkrNDg+PjJdJjYzXShkLGYsbCl8MCkhPShsfDApOjApe2NbYj4+Ml09MDtpPWs7cmV0dXJufWNbaD4+Ml09MDtjW2I+PjJdPWQ7aT1rO3JldHVybn1mdW5jdGlvbiBYYyhhKXthPWF8MDt2YXIgYj0wO2I9aTtfYyhhKzQ3Njh8MCk7X2MoYSs0NzM2fDApO19jKGErNDY4OHwwKTtfYyhhKzQ2NTZ8MCk7X2MoYSs0NjA4fDApO19jKGErNDU3NnwwKTtfYyhhKzQ1Mjh8MCk7X2MoYSs0NDk2fDApO19jKGErNDQ0OHwwKTtfYyhhKzQ0MTZ8MCk7WmMoYSs0MzAwfDApO1pjKGErNDIyMHwwKTtaYyhhKzQxNDB8MCk7WmMoYSs0MDYwfDApO1pjKGErMzk4MHwwKTtZYyhhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFljKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2Q9Y1thKzg5Nj4+Ml18MDtpZigoZHwwKSE9MCl7ZT1jW2QrOD4+Ml18MDtpZigoZXwwKSE9MCl7dm4oY1tlKyAtND4+Ml18MCl9ZT1jW2QrMTI+PjJdfDA7aWYoKGV8MCkhPTApe3ZuKGNbZSsgLTQ+PjJdfDApfWU9Y1tkKzE2Pj4yXXwwO2lmKChlfDApIT0wKXt2bihjW2UrIC00Pj4yXXwwKX12bihkKX1kPWNbYSs5MDA+PjJdfDA7aWYoKGR8MCk9PTApe2Q9MH1lbHNle2U9Y1tkKzg+PjJdfDA7aWYoKGV8MCkhPTApe3ZuKGNbZSsgLTQ+PjJdfDApfWU9Y1tkKzEyPj4yXXwwO2lmKChlfDApIT0wKXt2bihjW2UrIC00Pj4yXXwwKX1lPWNbZCsxNj4+Ml18MDtpZigoZXwwKSE9MCl7dm4oY1tlKyAtND4+Ml18MCl9dm4oZCk7ZD0wfWRve2U9Y1thKyhkPDwyKSs5MDQ+PjJdfDA7aWYoKGV8MCkhPTApe2Y9Y1tlKzg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlKzEyPj4yXXwwO2lmKChmfDApIT0wKXt2bihjW2YrIC00Pj4yXXwwKX1mPWNbZSsxNj4+Ml18MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9dm4oZSl9ZT1jW2ErKGQ8PDIpKzE5Mjg+PjJdfDA7aWYoKGV8MCkhPTApe2Y9Y1tlKzg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlKzEyPj4yXXwwO2lmKChmfDApIT0wKXt2bihjW2YrIC00Pj4yXXwwKX1mPWNbZSsxNj4+Ml18MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9dm4oZSl9ZT1jW2ErKGQ8PDIpKzI5NTI+PjJdfDA7aWYoKGV8MCkhPTApe2Y9Y1tlKzg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlKzEyPj4yXXwwO2lmKChmfDApIT0wKXt2bihjW2YrIC00Pj4yXXwwKX1mPWNbZSsxNj4+Ml18MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9dm4oZSl9ZD1kKzF8MH13aGlsZSgoZHwwKSE9MjU2KTtkPWNbYSs4NjA+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzg2ND4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9YT1jW2ErODY4Pj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufXZuKGNbYSsgLTQ+PjJdfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gWmMoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTAsaD0wO2I9aTtkPWErMzZ8MDtlPWNbZD4+Ml18MDtmPWErNDB8MDtnPWNbZj4+Ml18MDtpZigoZ3wwKSE9KGV8MCkpe2Rve2NbZj4+Ml09ZysgLTQ0O2g9Y1tnKyAtMzY+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWg9Y1tnKyAtMzI+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWc9Y1tnKyAtMjg+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWc9Y1tmPj4yXXwwfXdoaWxlKChnfDApIT0oZXwwKSl9Zj1hKzY4fDA7ZT1jW2Y+PjJdfDA7YT1hKzcyfDA7Zz1jW2E+PjJdfDA7aWYoKGd8MCk9PShlfDApKXtfYyhmKTtfYyhkKTtpPWI7cmV0dXJufWRve2NbYT4+Ml09ZysgLTQ0O2g9Y1tnKyAtMzY+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWg9Y1tnKyAtMzI+PjJdfDA7aWYoKGh8MCkhPTApe3ZuKGNbaCsgLTQ+PjJdfDApfWc9Y1tnKyAtMjg+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWc9Y1thPj4yXXwwfXdoaWxlKChnfDApIT0oZXwwKSk7X2MoZik7X2MoZCk7aT1iO3JldHVybn1mdW5jdGlvbiBfYyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MDtiPWk7ZD1jW2E+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59ZT1hKzR8MDtmPWNbZT4+Ml18MDtpZigoZnwwKSE9KGR8MCkpe2Rve2NbZT4+Ml09ZisgLTQ0O2c9Y1tmKyAtMzY+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWc9Y1tmKyAtMzI+PjJdfDA7aWYoKGd8MCkhPTApe3ZuKGNbZysgLTQ+PjJdfDApfWY9Y1tmKyAtMjg+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1tlPj4yXXwwfXdoaWxlKChmfDApIT0oZHwwKSk7ZD1jW2E+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59fXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gJGMoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1pO2Q9Y1thKzU2Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSs2MD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErNjQ+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzEyPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxNj4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9YT1jW2ErMjA+PjJdfDA7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oY1thKyAtND4+Ml18MCk7aT1iO3JldHVybn1mdW5jdGlvbiBhZChhKXthPWF8MDt2YXIgYj0wLGQ9MDtiPWk7ZD1jW2ErMjgwPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsyODQ+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzI4OD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMjM2Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsyNDA+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzI0ND4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTkyPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxOTY+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzIwMD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTQ4Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxNTI+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzE1Nj4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTA0Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSsxMDg+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzExMj4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErNjA+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzY0Pj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1kPWNbYSs2OD4+Ml18MDtpZigoZHwwKSE9MCl7dm4oY1tkKyAtND4+Ml18MCl9ZD1jW2ErMTY+PjJdfDA7aWYoKGR8MCkhPTApe3ZuKGNbZCsgLTQ+PjJdfDApfWQ9Y1thKzIwPj4yXXwwO2lmKChkfDApIT0wKXt2bihjW2QrIC00Pj4yXXwwKX1hPWNbYSsyND4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn12bihjW2ErIC00Pj4yXXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGJkKGIpe2I9YnwwO3ZhciBjPTAsZD0wO2M9aTtkPWIrOHwwO2FbYiswPj4wXT0wO2FbYisxPj4wXT0wO2FbYisyPj4wXT0wO2FbYiszPj4wXT0wO2FbYis0Pj4wXT0wO2FbYis1Pj4wXT0wO2FbYis2Pj4wXT0wO2NkKGQsMTI4KTtjZChiKzUyfDAsMjU2KTtjZChiKzk2fDAsMjU2KTtjZChiKzE0MHwwLDI1Nik7Y2QoYisxODR8MCwyNTYpO2NkKGIrMjI4fDAsMjU2KTtjZChiKzI3MnwwLDI1Nik7aT1jO3JldHVybn1mdW5jdGlvbiBjZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MDtlPWk7Y1tiPj4yXT1kO2FbYis0Pj4wXT0wO2o9Yis4fDA7Y1tqPj4yXT0wO2c9YisxMnwwO2NbZz4+Ml09MDtoPWIrMTZ8MDtjW2g+PjJdPTA7aWYoKGQrIC0yfDApPj4+MD4yMDQ2KXtiPVhhKDgpfDA7Y1tiPj4yXT05OTI4O3doaWxlKDEpe2U9dW4oMzgpfDA7aWYoKGV8MCkhPTApe2Y9ODticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7YnJlYWt9c2NbZSYzMV0oKX1pZigoZnwwKT09OCl7Y1tlKzQ+PjJdPTI1O2NbZT4+Ml09MjU7ZD1lKzEyfDA7Y1tiKzQ+PjJdPWQ7Y1tlKzg+PjJdPTA7ZT1kKzB8MDtkPTM4NHwwO2Y9ZSsyNnwwO2Rve2FbZT4+MF09YVtkPj4wXXwwO2U9ZSsxfDA7ZD1kKzF8MH13aGlsZSgoZXwwKTwoZnwwKSk7d2IoYnwwLDEwMDY0LDEwNil9aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9Y1tiKzMyPj4yXT1kKyAtMTtpZihkPj4+MD4xNil7Zj0zO3doaWxlKDEpe2lmKDE8PGYrMj4+PjA8ZD4+PjApe2Y9ZisxfDB9ZWxzZXticmVha319az0xPDxmO2NbYiszNj4+Ml09aztjW2IrNDA+PjJdPTE1LWY7az11bigoazw8MikrNzZ8MCl8MDtmPWsrNjgmLTY0O2NbZisgLTQ+PjJdPWs7Y1toPj4yXT1mfWVsc2V7Y1toPj4yXT0wO2NbYis0MD4+Ml09MDtjW2IrMzY+PjJdPTB9az0oZDw8MikrNjh8MDtoPXVuKGspfDA7Zj1oKzY4Ji02NDtjW2YrIC00Pj4yXT1oO2Nbaj4+Ml09ZjtrPXVuKGspfDA7Zj1rKzY4Ji02NDtjW2YrIC00Pj4yXT1rO2NbZz4+Ml09ZjtjW2IrMjA+PjJdPTA7Zz1iKzI0fDA7Y1tnPj4yXT1kO2lmKChkfDApPT0wKXtkZChiKTtqPWNbYj4+Ml18MDtqPWorNnwwO2o9aj4+PjE7Y1tnPj4yXT1qO2s9YisyOHwwO2Nbaz4+Ml09ajtpPWU7cmV0dXJufWVsc2V7ZD0wfWRve2NbZisoZDw8Mik+PjJdPTE7ZD1kKzF8MH13aGlsZShkPj4+MDwoY1tiPj4yXXwwKT4+PjApO2RkKGIpO2o9Y1tiPj4yXXwwO2o9ais2fDA7aj1qPj4+MTtjW2c+PjJdPWo7az1iKzI4fDA7Y1trPj4yXT1qO2k9ZTtyZXR1cm59ZnVuY3Rpb24gZGQoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2Q9aTtlPWIrMjR8MDtoPWIrMjB8MDtrPShjW2g+PjJdfDApKyhjW2U+PjJdfDApfDA7Y1toPj4yXT1rO2lmKGs+Pj4wPjMyNzY4KXtjW2g+PjJdPTA7aWYoKGNbYj4+Ml18MCk9PTApe2s9MH1lbHNle2w9Y1tiKzEyPj4yXXwwO2o9MDtkb3tzPWwrKGo8PDIpfDA7az0oKGNbcz4+Ml18MCkrMXwwKT4+PjE7Y1tzPj4yXT1rO2s9aysoY1toPj4yXXwwKXwwO2NbaD4+Ml09aztqPWorMXwwfXdoaWxlKGo+Pj4wPChjW2I+PjJdfDApPj4+MCl9fWg9MjE0NzQ4MzY0OC8oaz4+PjApfDA7aWYoKGFbYis0Pj4wXXwwKT09MD8oZj1iKzM2fDAsKGNbZj4+Ml18MCkhPTApOjApe2lmKChjW2I+PjJdfDApIT0wKXtvPWNbYis4Pj4yXXwwO209Y1tiKzEyPj4yXXwwO2s9Yis0MHwwO249YisxNnwwO2o9MDtzPTA7bD0wO3doaWxlKDEpe3I9KGVhKGwsaCl8MCk+Pj4xNjtjW28rKGo8PDIpPj4yXT1yO2w9KGNbbSsoajw8Mik+PjJdfDApK2x8MDtyPXI+Pj4oY1trPj4yXXwwKTtpZihzPj4+MDxyPj4+MCl7cD1qKyAtMXwwO3E9Y1tuPj4yXXwwO2Rve3M9cysxfDA7Y1txKyhzPDwyKT4+Ml09cH13aGlsZSgoc3wwKSE9KHJ8MCkpfWVsc2V7cj1zfWo9aisxfDA7aWYoIShqPj4+MDwoY1tiPj4yXXwwKT4+PjApKXticmVha31lbHNle3M9cn19aD1jW24+PjJdfDA7Y1toPj4yXT0wO2lmKCEocj4+PjA+KGNbZj4+Ml18MCk+Pj4wKSl7Zz0xOH19ZWxzZXtoPWNbYisxNj4+Ml18MDtjW2g+PjJdPTA7cj0wO2c9MTh9aWYoKGd8MCk9PTE4KXtkb3tyPXIrMXwwO2NbaCsocjw8Mik+PjJdPShjW2I+PjJdfDApKyAtMX13aGlsZSghKHI+Pj4wPihjW2Y+PjJdfDApPj4+MCkpfXM9Y1tiPj4yXXwwO3I9Y1tlPj4yXXwwO3I9cio1fDA7cj1yPj4+MjtzPXM8PDM7cz1zKzQ4fDA7cT1yPj4+MD5zPj4+MDtyPXE/czpyO2NbZT4+Ml09cjtzPWIrMjh8MDtjW3M+PjJdPXI7aT1kO3JldHVybn1pZigoY1tiPj4yXXwwKT09MCl7cz0wO3I9Y1tlPj4yXXwwO3I9cio1fDA7cj1yPj4+MjtzPXM8PDM7cz1zKzQ4fDA7cT1yPj4+MD5zPj4+MDtyPXE/czpyO2NbZT4+Ml09cjtzPWIrMjh8MDtjW3M+PjJdPXI7aT1kO3JldHVybn1qPWNbYis4Pj4yXXwwO2s9Y1tiKzEyPj4yXXwwO2w9MDtnPTA7ZG97Y1tqKyhsPDwyKT4+Ml09KGVhKGcsaCl8MCk+Pj4xNjtnPShjW2srKGw8PDIpPj4yXXwwKStnfDA7bD1sKzF8MDtmPWNbYj4+Ml18MH13aGlsZShsPj4+MDxmPj4+MCk7cj1jW2U+PjJdfDA7cj1yKjV8MDtyPXI+Pj4yO3M9Zjw8MztzPXMrNDh8MDtxPXI+Pj4wPnM+Pj4wO3I9cT9zOnI7Y1tlPj4yXT1yO3M9YisyOHwwO2Nbcz4+Ml09cjtpPWQ7cmV0dXJufWZ1bmN0aW9uIGVkKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wO2Q9aTthW2I+PjBdPTA7Y2QoYis0fDAsNTE2KTtlPWIrNDh8MDtjW2U+PjJdPTY7YVtiKzUyPj4wXT0wO2NbYis4MD4+Ml09NTtjW2IrNjQ+PjJdPTA7Y1tiKzg4Pj4yXT0wO2NbYis4ND4+Ml09MDtnPXVuKDkyKXwwO2Y9Zys2OCYtNjQ7Y1tmKyAtND4+Ml09ZztjW2IrNTY+PjJdPWY7Zj11big5Mil8MDtnPWYrNjgmLTY0O2NbZysgLTQ+PjJdPWY7Y1tiKzYwPj4yXT1nO2NbYis2OD4+Ml09MDtmPWIrNzJ8MDtjW2Y+PjJdPTY7aD0wO2Rve2NbZysoaDw8Mik+PjJdPTE7aD1oKzF8MH13aGlsZShoPj4+MDwoY1tlPj4yXXwwKT4+PjApO2RkKGUpO2U9KChjW2U+PjJdfDApKzZ8MCk+Pj4xO2NbZj4+Ml09ZTtjW2IrNzY+PjJdPWU7ZT1iKzkyfDA7Yj1lKzcyfDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KGJ8MCkpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZmQoZCl7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtlPWk7Zz1kKzUyfDA7aD1kKzcyfDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzc2fDA7Zz1kKzk2fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzEwMHwwO2g9ZCsxMjB8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrMTI0fDA7Zz1kKzE0NHwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCsxNDh8MDtoPWQrMTY4fDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzE3MnwwO2c9ZCsxOTJ8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrMTk2fDA7aD1kKzIxNnwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCsyMjB8MDtnPWQrMjQwfDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzI0NHwwO2g9ZCsyNjR8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrMjY4fDA7Zz1kKzI4OHwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCsyOTJ8MDtoPWQrMzEyfDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzMxNnwwO2c9ZCszMzZ8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrMzQwfDA7aD1kKzM2MHwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCszNjR8MDtnPWQrMzg0fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzM4OHwwO2g9ZCs0MDh8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrNDEyfDA7Zz1kKzQzMnwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCs0MzZ8MDtoPWQrNDU2fDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzQ2MHwwO2c9ZCs0ODB8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrNDg0fDA7aD1kKzUwNHwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCs1MDh8MDtnPWQrNTI4fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzUzMnwwO2g9ZCs1NTJ8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrNTU2fDA7Zz1kKzU3NnwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCs1ODB8MDtoPWQrNjAwfDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzYwNHwwO2c9ZCs2MjR8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrNjI4fDA7aD1kKzY0OHwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCs2NTJ8MDtnPWQrNjcyfDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Zz1kKzY3NnwwO2g9ZCs2OTZ8MDtjW2crMD4+Ml09MDtjW2crND4+Ml09MDtjW2crOD4+Ml09MDtjW2crMTI+PjJdPTA7Y1tnKzE2Pj4yXT0wO2FbaD4+MF09MTtoPWQrNzAwfDA7Zz1kKzcyMHwwO2NbaCswPj4yXT0wO2NbaCs0Pj4yXT0wO2NbaCs4Pj4yXT0wO2NbaCsxMj4+Ml09MDtjW2grMTY+PjJdPTA7YVtnPj4wXT0xO2c9ZCs3MjR8MDtoPWQrNzQ0fDA7Y1tnKzA+PjJdPTA7Y1tnKzQ+PjJdPTA7Y1tnKzg+PjJdPTA7Y1tnKzEyPj4yXT0wO2NbZysxNj4+Ml09MDthW2g+PjBdPTE7aD1kKzc0OHwwO2c9ZCs3Njh8MDtjW2grMD4+Ml09MDtjW2grND4+Ml09MDtjW2grOD4+Ml09MDtjW2grMTI+PjJdPTA7Y1toKzE2Pj4yXT0wO2FbZz4+MF09MTtnPWQrNzcyfDA7aD1kKzc5MnwwO2NbZyswPj4yXT0wO2NbZys0Pj4yXT0wO2NbZys4Pj4yXT0wO2NbZysxMj4+Ml09MDtjW2crMTY+PjJdPTA7YVtoPj4wXT0xO2g9ZCs3OTZ8MDtnPWQrODE2fDA7Y1toKzA+PjJdPTA7Y1toKzQ+PjJdPTA7Y1toKzg+PjJdPTA7Y1toKzEyPj4yXT0wO2NbaCsxNj4+Ml09MDthW2c+PjBdPTE7Y2QoZCs4NTJ8MCw2NCk7YVtkKzM5NzY+PjBdPTA7Zz1kKzIwfDA7aD1nKzMyfDA7ZG97YltnPj4xXT0wO2c9ZysyfDB9d2hpbGUoKGd8MCk8KGh8MCkpO3doaWxlKDEpe2c9dW4oNDQpfDA7aWYoKGd8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtmPTU7YnJlYWt9c2NbZyYzMV0oKX1pZigoZnwwKT09NSl7aD1YYSg0KXwwO2NbaD4+Ml09MjI2ODA7d2IoaHwwLDIyNzI4LDIwNil9Y2QoZywyNTYpO2NbZCs4OTY+PjJdPWc7d2hpbGUoMSl7Zz11big0NCl8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2Y9MTI7YnJlYWt9c2NbZyYzMV0oKX1pZigoZnwwKT09MTIpe2g9WGEoNCl8MDtjW2g+PjJdPTIyNjgwO3diKGh8MCwyMjcyOCwyMDYpfWNkKGcsMjU2KTtjW2QrOTAwPj4yXT1nO2Y9ZCs4MjB8MDtjW2YrMD4+Ml09MDtjW2YrND4+Ml09MDtjW2YrOD4+Ml09MDtjW2YrMTI+PjJdPTA7Y1tmKzE2Pj4yXT0wO2NbZisyMD4+Ml09MDtjW2YrMjQ+PjJdPTA7Y1tmKzI4Pj4yXT0wO2Y9MDthOndoaWxlKDEpe3doaWxlKDEpe2c9dW4oNDQpfDA7aWYoKGd8MCkhPTApe2JyZWFrfWc9Y1s1NjY2XXwwO2NbNTY2Nl09ZyswO2lmKChnfDApPT0wKXtmPTIwO2JyZWFrIGF9c2NbZyYzMV0oKX1jZChnLDI1Nik7Y1tkKyhmPDwyKSs5MDQ+PjJdPWc7d2hpbGUoMSl7Zz11big0NCl8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2Y9Mjc7YnJlYWsgYX1zY1tnJjMxXSgpfWNkKGcsMjU2KTtjW2QrKGY8PDIpKzE5Mjg+PjJdPWc7d2hpbGUoMSl7Zz11big0NCl8MDtpZigoZ3wwKSE9MCl7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2Y9MzQ7YnJlYWsgYX1zY1tnJjMxXSgpfWNkKGcsMjU2KTtjW2QrKGY8PDIpKzI5NTI+PjJdPWc7Zj1mKzF8MDtpZigoZnwwKT49MjU2KXtmPTM4O2JyZWFrfX1pZigoZnwwKT09MjApe2g9WGEoNCl8MDtjW2g+PjJdPTIyNjgwO3diKGh8MCwyMjcyOCwyMDYpfWVsc2UgaWYoKGZ8MCk9PTI3KXtoPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX1lbHNlIGlmKChmfDApPT0zNCl7aD1YYSg0KXwwO2NbaD4+Ml09MjI2ODA7d2IoaHwwLDIyNzI4LDIwNil9ZWxzZSBpZigoZnwwKT09Mzgpe2NbZCszOTg0Pj4yXT0xNjtjW2QrMzk4OD4+Ml09NDtjW2QrMzk5Mj4+Ml09ODtjW2QrMzk5Nj4+Ml09MDtjW2QrNDAxNj4+Ml09MDtjW2QrNDAyMD4+Ml09MDtjW2QrNDAyND4+Ml09MDtjW2QrNDA0MD4+Ml09MTtjW2QrNDA0ND4+Ml09MjtjW2QrNDAzNj4+Ml09NDA5NjtjW2QrNDAzMj4+Ml09NDtjW2QrNDAyOD4+Ml09NDtjW2QrNDA0OD4+Ml09MDtjW2QrNDA1Mj4+Ml09MDtjW2QrNDA1Nj4+Ml09MDtjW2QrNGUzPj4yXT0xNjtjW2QrNDAwND4+Ml09NjU1MzY7Y1tkKzQwMDg+PjJdPS0zMjc2ODtjW2QrNDAxMj4+Ml09MzI3Njc7Y1tkKzM5ODA+PjJdPTA7Y1tkKzQwNjQ+PjJdPTE2O2NbZCs0MDY4Pj4yXT0xO2NbZCs0MDcyPj4yXT04O2NbZCs0MDc2Pj4yXT0wO2NbZCs0MDk2Pj4yXT0wO2NbZCs0MTAwPj4yXT0wO2NbZCs0MTA0Pj4yXT0wO2NbZCs0MTIwPj4yXT0xO2NbZCs0MTI0Pj4yXT0yO2NbZCs0MTE2Pj4yXT00MDk2O2NbZCs0MTEyPj4yXT00O2NbZCs0MTA4Pj4yXT00O2NbZCs0MTI4Pj4yXT0wO2NbZCs0MTMyPj4yXT0wO2NbZCs0MTM2Pj4yXT0wO2NbZCs0MDgwPj4yXT0xNjtjW2QrNDA4ND4+Ml09NjU1MzY7Y1tkKzQwODg+PjJdPS0zMjc2ODtjW2QrNDA5Mj4+Ml09MzI3Njc7Y1tkKzQwNjA+PjJdPTA7Y1tkKzQxNDQ+PjJdPTMyO2NbZCs0MTQ4Pj4yXT0yO2NbZCs0MTUyPj4yXT04O2NbZCs0MTU2Pj4yXT0wO2NbZCs0MTc2Pj4yXT0wO2NbZCs0MTgwPj4yXT0wO2NbZCs0MTg0Pj4yXT0wO2NbZCs0MjAwPj4yXT0xO2NbZCs0MjA0Pj4yXT0yO2NbZCs0MTk2Pj4yXT00MDk2O2NbZCs0MTkyPj4yXT00O2NbZCs0MTg4Pj4yXT00O2NbZCs0MjA4Pj4yXT0wO2NbZCs0MjEyPj4yXT0wO2NbZCs0MjE2Pj4yXT0wO2NbZCs0MTYwPj4yXT0zMjtjW2QrNDE2ND4+Ml09MDtjW2QrNDE2OD4+Ml09LTIxNDc0ODM2NDg7Y1tkKzQxNzI+PjJdPTIxNDc0ODM2NDc7Y1tkKzQxNDA+PjJdPTA7Y1tkKzQyMjQ+PjJdPTMyO2NbZCs0MjI4Pj4yXT0yMjtjW2QrNDIzMj4+Ml09ODtjW2QrNDIzNj4+Ml09MDtjW2QrNDI1Nj4+Ml09MDtjW2QrNDI2MD4+Ml09MDtjW2QrNDI2ND4+Ml09MDtjW2QrNDI4MD4+Ml09MTtjW2QrNDI4ND4+Ml09MjtjW2QrNDI3Nj4+Ml09NDA5NjtjW2QrNDI3Mj4+Ml09NDtjW2QrNDI2OD4+Ml09NDtjW2QrNDI4OD4+Ml09MDtjW2QrNDI5Mj4+Ml09MDtjW2QrNDI5Nj4+Ml09MDtjW2QrNDI0MD4+Ml09MzI7Y1tkKzQyNDQ+PjJdPTA7Y1tkKzQyNDg+PjJdPS0yMTQ3NDgzNjQ4O2NbZCs0MjUyPj4yXT0yMTQ3NDgzNjQ3O2NbZCs0MjIwPj4yXT0wO2NbZCs0MzA0Pj4yXT0zMjtjW2QrNDMwOD4+Ml09MjA7Y1tkKzQzMTI+PjJdPTg7Y1tkKzQzMTY+PjJdPTA7Y1tkKzQzMzY+PjJdPTA7Y1tkKzQzNDA+PjJdPTA7Y1tkKzQzNDQ+PjJdPTA7Y1tkKzQzNjA+PjJdPTE7Y1tkKzQzNjQ+PjJdPTI7Y1tkKzQzNTY+PjJdPTQwOTY7Y1tkKzQzNTI+PjJdPTQ7Y1tkKzQzNDg+PjJdPTQ7Y1tkKzQzNjg+PjJdPTA7Y1tkKzQzNzI+PjJdPTA7Y1tkKzQzNzY+PjJdPTA7Y1tkKzQzMjA+PjJdPTMyO2NbZCs0MzI0Pj4yXT0wO2NbZCs0MzI4Pj4yXT0tMjE0NzQ4MzY0ODtjW2QrNDMzMj4+Ml09MjE0NzQ4MzY0NztjW2QrNDMwMD4+Ml09MDtjW2QrNDM4ND4+Ml09MTY7Y1tkKzQzODg+PjJdPTQ7Y1tkKzQzOTI+PjJdPTg7Y1tkKzQzOTY+PjJdPTA7Y1tkKzQ0MTY+PjJdPTA7Y1tkKzQ0MjA+PjJdPTA7Y1tkKzQ0MjQ+PjJdPTA7Y1tkKzQ0NDA+PjJdPTE7Y1tkKzQ0NDQ+PjJdPTI7Y1tkKzQ0MzY+PjJdPTQwOTY7Y1tkKzQ0MzI+PjJdPTQ7Y1tkKzQ0Mjg+PjJdPTQ7Y1tkKzQ0NDg+PjJdPTA7Y1tkKzQ0NTI+PjJdPTA7Y1tkKzQ0NTY+PjJdPTA7Y1tkKzQ0MDA+PjJdPTE2O2NbZCs0NDA0Pj4yXT02NTUzNjtjW2QrNDQwOD4+Ml09LTMyNzY4O2NbZCs0NDEyPj4yXT0zMjc2NztjW2QrNDM4MD4+Ml09MDtjW2QrNDQ2ND4+Ml09MTY7Y1tkKzQ0Njg+PjJdPTE7Y1tkKzQ0NzI+PjJdPTg7Y1tkKzQ0NzY+PjJdPTA7Y1tkKzQ0OTY+PjJdPTA7Y1tkKzQ1MDA+PjJdPTA7Y1tkKzQ1MDQ+PjJdPTA7Y1tkKzQ1MjA+PjJdPTE7Y1tkKzQ1MjQ+PjJdPTI7Y1tkKzQ1MTY+PjJdPTQwOTY7Y1tkKzQ1MTI+PjJdPTQ7Y1tkKzQ1MDg+PjJdPTQ7Y1tkKzQ1Mjg+PjJdPTA7Y1tkKzQ1MzI+PjJdPTA7Y1tkKzQ1MzY+PjJdPTA7Y1tkKzQ0ODA+PjJdPTE2O2NbZCs0NDg0Pj4yXT02NTUzNjtjW2QrNDQ4OD4+Ml09LTMyNzY4O2NbZCs0NDkyPj4yXT0zMjc2NztjW2QrNDQ2MD4+Ml09MDtjW2QrNDU0ND4+Ml09MzI7Y1tkKzQ1NDg+PjJdPTI7Y1tkKzQ1NTI+PjJdPTg7Y1tkKzQ1NTY+PjJdPTA7Y1tkKzQ1NzY+PjJdPTA7Y1tkKzQ1ODA+PjJdPTA7Y1tkKzQ1ODQ+PjJdPTA7Y1tkKzQ2MDA+PjJdPTE7Y1tkKzQ2MDQ+PjJdPTI7Y1tkKzQ1OTY+PjJdPTQwOTY7Y1tkKzQ1OTI+PjJdPTQ7Y1tkKzQ1ODg+PjJdPTQ7Y1tkKzQ2MDg+PjJdPTA7Y1tkKzQ2MTI+PjJdPTA7Y1tkKzQ2MTY+PjJdPTA7Y1tkKzQ1NjA+PjJdPTMyO2NbZCs0NTY0Pj4yXT0wO2NbZCs0NTY4Pj4yXT0tMjE0NzQ4MzY0ODtjW2QrNDU3Mj4+Ml09MjE0NzQ4MzY0NztjW2QrNDU0MD4+Ml09MDtjW2QrNDYyND4+Ml09MzI7Y1tkKzQ2Mjg+PjJdPTIyO2NbZCs0NjMyPj4yXT04O2NbZCs0NjM2Pj4yXT0wO2NbZCs0NjU2Pj4yXT0wO2NbZCs0NjYwPj4yXT0wO2NbZCs0NjY0Pj4yXT0wO2NbZCs0NjgwPj4yXT0xO2NbZCs0Njg0Pj4yXT0yO2NbZCs0Njc2Pj4yXT00MDk2O2NbZCs0NjcyPj4yXT00O2NbZCs0NjY4Pj4yXT00O2NbZCs0Njg4Pj4yXT0wO2NbZCs0NjkyPj4yXT0wO2NbZCs0Njk2Pj4yXT0wO2NbZCs0NjQwPj4yXT0zMjtjW2QrNDY0ND4+Ml09MDtjW2QrNDY0OD4+Ml09LTIxNDc0ODM2NDg7Y1tkKzQ2NTI+PjJdPTIxNDc0ODM2NDc7Y1tkKzQ2MjA+PjJdPTA7Y1tkKzQ3MDQ+PjJdPTMyO2NbZCs0NzA4Pj4yXT0yMDtjW2QrNDcxMj4+Ml09ODtjW2QrNDcxNj4+Ml09MDtjW2QrNDczNj4+Ml09MDtjW2QrNDc0MD4+Ml09MDtjW2QrNDc0ND4+Ml09MDtjW2QrNDc2MD4+Ml09MTtjW2QrNDc2ND4+Ml09MjtjW2QrNDc1Nj4+Ml09NDA5NjtjW2QrNDc1Mj4+Ml09NDtjW2QrNDc0OD4+Ml09NDtjW2QrNDc2OD4+Ml09MDtjW2QrNDc3Mj4+Ml09MDtjW2QrNDc3Nj4+Ml09MDtjW2QrNDcyMD4+Ml09MzI7Y1tkKzQ3MjQ+PjJdPTA7Y1tkKzQ3Mjg+PjJdPS0yMTQ3NDgzNjQ4O2NbZCs0NzMyPj4yXT0yMTQ3NDgzNjQ3O2NbZCs0NzAwPj4yXT0wO2FbZCs0NzgwPj4wXT0wO2FbZCs0NzgxPj4wXT0wO2k9ZTtyZXR1cm59fWZ1bmN0aW9uIGdkKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTA7ZT1pO2k9aSszMnwwO2g9ZTtmPWNbYis4Pj4yXXwwO2I9Y1tiKzQ+PjJdfDA7amQoaCxmLGIpO2c9Y1toPj4yXXwwO2FbZCszPj4wXT1nPj4+MjQ7YVtkKzI+PjBdPWc+Pj4xNjthW2QrMT4+MF09Zz4+Pjg7YVtkPj4wXT1nO2c9Y1toKzQ+PjJdfDA7YVtkKzc+PjBdPWc+Pj4yNDthW2QrNj4+MF09Zz4+PjE2O2FbZCs1Pj4wXT1nPj4+ODthW2QrND4+MF09ZztnPWNbaCs4Pj4yXXwwO2FbZCsxMT4+MF09Zz4+PjI0O2FbZCsxMD4+MF09Zz4+PjE2O2FbZCs5Pj4wXT1nPj4+ODthW2QrOD4+MF09ZztnPWNbaCsxMj4+Ml18MDthW2QrMTM+PjBdPShnJjY1NTM1KT4+Pjg7YVtkKzEyPj4wXT1nO2FbZCsxND4+MF09Zz4+PjE2O2FbZCsxNT4+MF09Zz4+PjI0O2g9Y1toKzE2Pj4yXXwwO2FbZCsxNj4+MF09aDthW2QrMTc+PjBdPShoJjY1NTM1KT4+Pjg7YVtkKzE5Pj4wXT1oPj4+MjQ7YVtkKzE4Pj4wXT1oPj4+MTY7aD1rZChmKzQ3ODR8MCxiKXwwO2c9STthW2QrMjM+PjBdPWg+Pj4yNDthW2QrMjI+PjBdPWg+Pj4xNjthW2QrMjE+PjBdPWg+Pj44O2FbZCsyMD4+MF09aDtqPUtuKGh8MCxnfDAsNTYpfDA7YVtkKzI3Pj4wXT1qO2o9S24oaHwwLGd8MCw0OCl8MDthW2QrMjY+PjBdPWo7aD1LbihofDAsZ3wwLDQwKXwwO2FbZCsyNT4+MF09aDthW2QrMjQ+PjBdPWc7bGQoZis1MTEyfDAsYixkKzI4fDApO2k9ZTtyZXR1cm59ZnVuY3Rpb24gaGQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7Y1thPj4yXT00MjQ7YT1jW2ErOD4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1hZChhKzUxMTJ8MCk7X2MoYSs1MDk2fDApO19jKGErNTA2NHwwKTtaYyhhKzQ5NDh8MCk7JGMoYSs0Nzg0fDApO1hjKGEpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gaWQoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1pO2NbYT4+Ml09NDI0O2Q9Y1thKzg+PjJdfDA7aWYoKGR8MCk9PTApe3ZuKGEpO2k9YjtyZXR1cm59YWQoZCs1MTEyfDApO19jKGQrNTA5NnwwKTtfYyhkKzUwNjR8MCk7WmMoZCs0OTQ4fDApOyRjKGQrNDc4NHwwKTtYYyhkKTt2bihkKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGpkKGYsZyxoKXtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wO2o9aTtpPWkrMzJ8MDtrPWo7bD1nKzQ3ODF8MDtpZigoYVtsPj4wXXwwKT09MCl7dGQoZys0MzgwfDApO3RkKGcrNDQ2MHwwKTt0ZChnKzQ1NDB8MCk7dGQoZys0NjIwfDApO3RkKGcrNDcwMHwwKTthW2w+PjBdPTF9bD1nKzM5NzZ8MDtpZigoYVtsPj4wXXwwKT09MCl7YVtsPj4wXT0xO3BkKGNbaD4+Ml18MCxrLDIwKTtyPWRbaysxPj4wXTw8OHxkW2s+PjBdfGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNDtvPWRbays1Pj4wXTw8OHxkW2srND4+MF18ZFtrKzY+PjBdPDwxNnxkW2srNz4+MF08PDI0O3A9ZFtrKzk+PjBdPDw4fGRbays4Pj4wXXxkW2srMTA+PjBdPDwxNnxkW2srMTE+PjBdPDwyNDtxPShhW2srMTM+PjBdPDw4fGRbaysxMj4+MF0pJjY1NTM1O3M9YVtrKzE0Pj4wXXwwO3Q9YVtrKzE1Pj4wXXwwO3U9YVtrKzE2Pj4wXXwwO2g9YVtrKzE3Pj4wXXwwO3Y9KGFbaysxOT4+MF08PDh8ZFtrKzE4Pj4wXSkmNjU1MzU7YVtnPj4wXT1yO2FbZysxPj4wXT1yPj44O2FbZysyPj4wXT1yPj4xNjthW2crMz4+MF09cj4+MjQ7cj1nKzR8MDthW3I+PjBdPW87YVtyKzE+PjBdPW8+Pjg7YVtyKzI+PjBdPW8+PjE2O2FbciszPj4wXT1vPj4yNDtyPWcrOHwwO2Fbcj4+MF09cDthW3IrMT4+MF09cD4+ODthW3IrMj4+MF09cD4+MTY7YVtyKzM+PjBdPXA+PjI0O3I9ZysxMnwwO2Fbcj4+MF09cTthW3IrMT4+MF09cT4+ODthW2crMTQ+PjBdPXM7YVtnKzE1Pj4wXT10O2FbZysxNj4+MF09dTthW2crMTc+PjBdPWg7aD1nKzE4fDA7YVtoPj4wXT12O2FbaCsxPj4wXT12Pj44O2Y9ZiswfDA7aD1nKzB8MDtnPWYrMjB8MDtkb3thW2Y+PjBdPWFbaD4+MF18MDtmPWYrMXwwO2g9aCsxfDB9d2hpbGUoKGZ8MCk8KGd8MCkpO2k9ajtyZXR1cm59bT1xZChoLGcrODUyfDApfDA7aWYoKG18MCkhPTApe289ZysxNHwwO2s9YVtvPj4wXXwwO2lmKChtJjMyfDApIT0wKXtrPShxZChoLGNbZysoKCgoayYyNTUpPj4+NyYyNTUpPDw3fGsmN3woKGsmMjU1KT4+PjYmMjU1KTw8NiY2NHwoKGsmMjU1KT4+PjMmMjU1KTw8MyY1Nik8PDIpKzkwND4+Ml18MCl8MCkmMjU1O2Fbbz4+MF09a31sPWsmNztrPShrJjI1NSk+Pj4zJjc7bj1kWzg3Misoazw8MykrbD4+MF18MDtsPWRbOTM2KyhrPDwzKStsPj4wXXwwO2lmKChtJjE2fDApPT0wKXt1PWJbZysobjw8MSkrMjA+PjFdfDA7dj1nKzEyfDA7YVt2Pj4wXT11O2FbdisxPj4wXT11Pj44fWVsc2V7cD1nKyhuPDwxKSsyMHwwO3E9ZVtwPj4xXXwwO3E9KHJkKGcrNDM4MHwwLGgsKGNbZys0NDE2Pj4yXXwwKSsoKG4+Pj4wPDM/bjozKSo0NHwwKXwwKXwwKStxfDA7cj1jW2crNDQwND4+Ml18MDtpZigocXwwKTwwKXtxPXErcnwwfWVsc2V7cT1xLShxPj4+MDxyPj4+MD8wOnIpfDB9dj1xJjY1NTM1O3U9ZysxMnwwO2FbdT4+MF09djthW3UrMT4+MF09dj4+ODtiW3A+PjFdPXZ9aWYoKG0mOHwwKSE9MCl7dj1nKzE1fDA7YVt2Pj4wXT1xZChoLGNbZysoZFt2Pj4wXTw8MikrMTkyOD4+Ml18MCl8MH1pZigobSY0fDApIT0wKXtwPXFkKGgsY1tnKygoKGRbbz4+MF18MCk+Pj42JjEpPDwyKSs4OTY+PjJdfDApfDA7bz1nKzE2fDA7cD0oYVtvPj4wXXwwKStwfDA7aWYoKHB8MCk8MCl7cD1wKzI1NnwwfWVsc2V7cD0ocHwwKT4yNTU/cCsgLTI1NnwwOnB9YVtvPj4wXT1wfWlmKChtJjJ8MCkhPTApe3Y9ZysxN3wwO2Fbdj4+MF09cWQoaCxjW2crKGRbdj4+MF08PDIpKzI5NTI+PjJdfDApfDB9aWYoKG0mMXwwKSE9MCl7bT1nKzE4fDA7cD0oZFttPj4wXXxkW20rMT4+MF08PDgpJjY1NTM1O3A9KHJkKGcrNDQ2MHwwLGgsY1tnKzQ0OTY+PjJdfDApfDApK3B8MDtvPWNbZys0NDg0Pj4yXXwwO2lmKChwfDApPDApe289cCtvfDB9ZWxzZXtvPXAtKHA+Pj4wPG8+Pj4wPzA6byl8MH12PW8mNjU1MzU7YVttPj4wXT12O2FbbSsxPj4wXT12Pj44fX1lbHNle2s9YVtnKzE0Pj4wXXwwO249ayY3O2s9KGsmMjU1KT4+PjMmNztsPWRbOTM2KyhrPDwzKStuPj4wXXwwO249ZFs4NzIrKGs8PDMpK24+PjBdfDB9cT1nKyhuKjI0fDApKzUyfDA7bz1nKyhuKjI0fDApKzYwfDA7cD1jW28+PjJdfDA7bT1nKzQ1NDB8MDtrPShrfDApPT0xJjE7cD0ocmQobSxoLChjW2crNDU3Nj4+Ml18MCkrKGsqNDR8MCl8MCl8MCkrcHwwO3I9Y1tnKzQ1NjQ+PjJdfDA7aWYoKHB8MCk8MCl7cD1wK3J8MH1lbHNle3A9cC0ocD4+PjA8cj4+PjA/MDpyKXwwfXI9KGRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNCkrcHwwO2FbZz4+MF09cjthW2crMT4+MF09cj4+ODthW2crMj4+MF09cj4+MTY7YVtnKzM+PjBdPXI+PjI0O3I9ZysobioyNHwwKSs3MnwwO3M9Y1tvPj4yXXwwO2Rve2lmKChhW3I+PjBdfDApPT0wKXt1PWcrKG4qMjR8MCkrNTZ8MDt0PWNbdT4+Ml18MDtpZigoc3wwKT49KHB8MCkpe2lmKCh0fDApPChwfDApKXtjW3E+PjJdPXQ7Y1t1Pj4yXT1wfWVsc2V7Y1txPj4yXT1wfWFbcj4+MF09MTticmVha31jW3E+PjJdPXQ7Y1t1Pj4yXT1zO3Q9ZysobioyNHwwKSs2OHwwO3E9Y1t0Pj4yXXwwO3M9ZysobioyNHwwKSs2NHwwO3I9Y1tzPj4yXXwwO2lmKChxfDApPChwfDApKXtjW28+PjJdPXI7Y1tzPj4yXT1xO2NbdD4+Ml09cDticmVha31pZigocnwwKTwocHwwKSl7Y1tvPj4yXT1yO2Nbcz4+Ml09cDticmVha31lbHNle2Nbbz4+Ml09cDticmVha319ZWxzZXt0PWcrKG4qMjR8MCkrNjR8MDt1PWNbdD4+Ml18MDtpZigocHwwKT49KHN8MCkpe289ZysobioyNHwwKSs2OHwwO2lmKChwfDApPCh1fDApKXtjW28+PjJdPXU7Y1t0Pj4yXT1wfWVsc2V7Y1tvPj4yXT1wfWFbcj4+MF09MDticmVha31jW2crKG4qMjR8MCkrNjg+PjJdPXU7Y1t0Pj4yXT1zO3M9Y1txPj4yXXwwO3Q9ZysobioyNHwwKSs1NnwwO3I9Y1t0Pj4yXXwwO2lmKChwfDApPChzfDApKXtjW28+PjJdPXI7Y1t0Pj4yXT1zO2NbcT4+Ml09cDticmVha31pZigocHwwKTwocnwwKSl7Y1tvPj4yXT1yO2NbdD4+Ml09cDticmVha31lbHNle2Nbbz4+Ml09cDticmVha319fXdoaWxlKDApO3I9ZysobioyNHwwKSs0MzZ8MDtwPWcrKG4qMjR8MCkrNDQ0fDA7cT1jW3A+PjJdfDA7cz1jW20+PjJdfDA7bz1nKzQ2MjB8MDtxPShyZChvLGgsKGNbZys0NjU2Pj4yXXwwKSsoKChzPj4+MDwyMD9zJi0yOjIwKXxrKSo0NHwwKXwwKXwwKStxfDA7cz1jW2crNDY0ND4+Ml18MDtpZigocXwwKTwwKXtxPXErc3wwfWVsc2V7cT1xLShxPj4+MDxzPj4+MD8wOnMpfDB9cz1nKzR8MDt0PShkW3M+PjBdfGRbcysxPj4wXTw8OHxkW3MrMj4+MF08PDE2fGRbcyszPj4wXTw8MjQpK3F8MDthW3M+PjBdPXQ7YVtzKzE+PjBdPXQ+Pjg7YVtzKzI+PjBdPXQ+PjE2O2FbcyszPj4wXT10Pj4yNDtzPWcrKG4qMjR8MCkrNDU2fDA7dD1jW3A+PjJdfDA7ZG97aWYoKGFbcz4+MF18MCk9PTApe3U9ZysobioyNHwwKSs0NDB8MDt2PWNbdT4+Ml18MDtpZigodHwwKT49KHF8MCkpe2lmKCh2fDApPChxfDApKXtjW3I+PjJdPXY7Y1t1Pj4yXT1xfWVsc2V7Y1tyPj4yXT1xfWFbcz4+MF09MTticmVha31jW3I+PjJdPXY7Y1t1Pj4yXT10O3M9ZysobioyNHwwKSs0NTJ8MDtyPWNbcz4+Ml18MDtuPWcrKG4qMjR8MCkrNDQ4fDA7dD1jW24+PjJdfDA7aWYoKHJ8MCk8KHF8MCkpe2NbcD4+Ml09dDtjW24+PjJdPXI7Y1tzPj4yXT1xO2JyZWFrfWlmKCh0fDApPChxfDApKXtjW3A+PjJdPXQ7Y1tuPj4yXT1xO2JyZWFrfWVsc2V7Y1twPj4yXT1xO2JyZWFrfX1lbHNle3U9ZysobioyNHwwKSs0NDh8MDt2PWNbdT4+Ml18MDtpZigocXwwKT49KHR8MCkpe249ZysobioyNHwwKSs0NTJ8MDtpZigocXwwKTwodnwwKSl7Y1tuPj4yXT12O2NbdT4+Ml09cX1lbHNle2Nbbj4+Ml09cX1hW3M+PjBdPTA7YnJlYWt9Y1tnKyhuKjI0fDApKzQ1Mj4+Ml09djtjW3U+PjJdPXQ7cz1jW3I+PjJdfDA7bj1nKyhuKjI0fDApKzQ0MHwwO3Q9Y1tuPj4yXXwwO2lmKChxfDApPChzfDApKXtjW3A+PjJdPXQ7Y1tuPj4yXT1zO2Nbcj4+Ml09cTticmVha31pZigocXwwKTwodHwwKSl7Y1twPj4yXT10O2Nbbj4+Ml09cTticmVha31lbHNle2NbcD4+Ml09cTticmVha319fXdoaWxlKDApO209KGNbbz4+Ml18MCkrKGNbbT4+Ml18MCl8MDtsPWcrKGw8PDIpKzgyMHwwO249Y1tsPj4yXXwwO2lmKG0+Pj4wPDM2KXttPW0+Pj4xJjIxNDc0ODM2NDZ9ZWxzZXttPTE4fWs9KHJkKGcrNDcwMHwwLGgsKGNbZys0NzM2Pj4yXXwwKSsoKG18aykqNDR8MCl8MCl8MCkrbnwwO2g9Y1tnKzQ3MjQ+PjJdfDA7aWYoKGt8MCk8MCl7aD1rK2h8MH1lbHNle2g9ay0oaz4+PjA8aD4+PjA/MDpoKXwwfXY9Zys4fDA7YVt2Pj4wXT1oO2FbdisxPj4wXT1oPj44O2FbdisyPj4wXT1oPj4xNjthW3YrMz4+MF09aD4+MjQ7Y1tsPj4yXT1oO2Y9ZiswfDA7aD1nKzB8MDtnPWYrMjB8MDtkb3thW2Y+PjBdPWFbaD4+MF18MDtmPWYrMXwwO2g9aCsxfDB9d2hpbGUoKGZ8MCk8KGd8MCkpO2k9ajtyZXR1cm59ZnVuY3Rpb24ga2QoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7Zj1pO2k9aSsxNnwwO2c9ZjtoPWIrMzI1fDA7aWYoKGFbaD4+MF18MCk9PTApe3RkKGIrMjQ0fDApO2FbaD4+MF09MX1pZigoYVtiPj4wXXwwKT09MCl7YVtiPj4wXT0xO3BkKGNbZT4+Ml18MCxnLDgpO249ZFtnKzE+PjBdPDw4fGRbZz4+MF18ZFtnKzI+PjBdPDwxNnxkW2crMz4+MF08PDI0O209ZFtnKzU+PjBdPDw4fGRbZys0Pj4wXXxkW2crNj4+MF08PDE2fGRbZys3Pj4wXTw8MjQ7bD1iKzEwMHwwO2s9bDthW2s+PjBdPW47YVtrKzE+PjBdPW4+Pjg7YVtrKzI+PjBdPW4+PjE2O2FbayszPj4wXT1uPj4yNDtsPWwrNHwwO2FbbD4+MF09bTthW2wrMT4+MF09bT4+ODthW2wrMj4+MF09bT4+MTY7YVtsKzM+PjBdPW0+PjI0O0k9bTtpPWY7cmV0dXJuIG58MH1nPWIrOTJ8MDtkb3tpZigoY1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdfDApPT0wKXtoPXFkKGUsYis0OHwwKXwwO2lmKChofDApPT0yKXtoPWIrOTZ8MDtjW2g+PjJdPShjW2g+PjJdfDApKzEmMztqPWIrKGNbZz4+Ml08PDMpKzEwNHwwO2o9ZFtqPj4wXXxkW2orMT4+MF08PDh8ZFtqKzI+PjBdPDwxNnxkW2orMz4+MF08PDI0O2o9KHJkKGIrMjQ0fDAsZSwoY1tiKzI4MD4+Ml18MCkrMzUyfDApfDApK2p8MDtrPWNbYisyNjg+PjJdfDA7aWYoKGp8MCk8MCl7aj1qK2t8MH1lbHNle2o9ai0oaj4+PjA8az4+PjA/MDprKXwwfW09KChqfDApPDApPDwzMT4+MzE7az1iKyhjW2g+PjJdPDwzKSsxMDB8MDtuPWs7YVtuPj4wXT1qO2FbbisxPj4wXT1qPj44O2FbbisyPj4wXT1qPj4xNjthW24rMz4+MF09aj4+MjQ7az1rKzR8MDthW2s+PjBdPW07YVtrKzE+PjBdPW0+Pjg7YVtrKzI+PjBdPW0+PjE2O2FbayszPj4wXT1tPj4yNDtrPWIrKGNbaD4+Ml08PDMpKzEwMHwwO209azttPWRbbT4+MF18ZFttKzE+PjBdPDw4fGRbbSsyPj4wXTw8MTZ8ZFttKzM+PjBdPDwyNDtqPWs7YVtqPj4wXT0wO2FbaisxPj4wXT0wO2FbaisyPj4wXT0wO2FbaiszPj4wXT0wO2s9ays0fDA7YVtrPj4wXT1tO2FbaysxPj4wXT1tPj44O2FbaysyPj4wXT1tPj4xNjthW2srMz4+MF09bT4+MjQ7az1lKzR8MDttPWNbaz4+Ml18MDtqPWUrOHwwO249KGNbaj4+Ml18MCk+Pj4xNjtjW2o+PjJdPW47bD0obT4+PjApLyhuPj4+MCl8MDtuPW0tKGVhKG4sbCl8MCl8MDtjW2s+PjJdPW47ZG97bj0obWQoY1tlPj4yXXwwKXwwKSYyNTV8bjw8ODtjW2s+PjJdPW47bT1jW2o+PjJdfDA7bz1tPDw4O2Nbaj4+Ml09b313aGlsZShvPj4+MDwxNjc3NzIxNik7bz1tPj4+OCY2NTUzNTtjW2o+PjJdPW87bT0obj4+PjApLyhvPj4+MCl8MDtuPW4tKGVhKG0sbyl8MCl8MDtjW2s+PjJdPW47ZG97bj0obWQoY1tlPj4yXXwwKXwwKSYyNTV8bjw8ODtjW2s+PjJdPW47bz1jW2o+PjJdPDw4O2Nbaj4+Ml09b313aGlsZShvPj4+MDwxNjc3NzIxNik7bz1iKyhjW2g+PjJdPDwzKSsxMDB8MDtuPW87az1uO249bis0fDA7bj1kW24+PjBdfGRbbisxPj4wXTw8OHxkW24rMj4+MF08PDE2fGRbbiszPj4wXTw8MjQ7bD1kW2s+PjBdfGRbaysxPj4wXTw8OHxkW2srMj4+MF08PDE2fGRbayszPj4wXTw8MjR8KG08PDE2fGwmNjU1MzUpO209bzthW20+PjBdPWw7YVttKzE+PjBdPWw+Pjg7YVttKzI+PjBdPWw+PjE2O2FbbSszPj4wXT1sPj4yNDtvPW8rNHwwO2Fbbz4+MF09bjthW28rMT4+MF09bj4+ODthW28rMj4+MF09bj4+MTY7YVtvKzM+PjBdPW4+PjI0O289Y1toPj4yXXwwO2NbZz4+Ml09bztjW2IrKG88PDIpKzEzMj4+Ml09MDtjW2IrKGNbZz4+Ml08PDIpKzE0OD4+Ml09MDticmVha31lbHNlIGlmKChofDApPT0xKXtlPXJkKGIrMjQ0fDAsZSxjW2IrMjgwPj4yXXwwKXwwO2g9Y1tiKzI2OD4+Ml18MDtpZigoZXwwKTwwKXtlPWgrZXwwfWVsc2V7ZT1lLShlPj4+MDxoPj4+MD8wOmgpfDB9Y1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdPWU7bz1jW2c+PjJdfDA7bD1jW2IrKG88PDIpKzEzMj4+Ml18MDtvPWIrKG88PDMpKzEwMHwwO249bzttPW47bj1uKzR8MDtsPUluKGRbbT4+MF18ZFttKzE+PjBdPDw4fGRbbSsyPj4wXTw8MTZ8ZFttKzM+PjBdPDwyNHwwLGRbbj4+MF18ZFtuKzE+PjBdPDw4fGRbbisyPj4wXTw8MTZ8ZFtuKzM+PjBdPDwyNHwwLGx8MCwoKGx8MCk8MCk8PDMxPj4zMXwwKXwwO249STttPW87YVttPj4wXT1sO2FbbSsxPj4wXT1sPj44O2FbbSsyPj4wXT1sPj4xNjthW20rMz4+MF09bD4+MjQ7bz1vKzR8MDthW28+PjBdPW47YVtvKzE+PjBdPW4+Pjg7YVtvKzI+PjBdPW4+PjE2O2FbbyszPj4wXT1uPj4yNDtjW2IrKGNbZz4+Ml08PDIpKzE0OD4+Ml09MDticmVha31lbHNle2lmKChofDApPD0yKXticmVha31jW2c+PjJdPWgrMisoY1tnPj4yXXwwKSYzO2tkKGIsZSl8MDticmVha319ZWxzZXtoPXFkKGUsYis0fDApfDA7aWYoKGh8MCk9PTEpe2g9Y1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdfDA7ZT0ocmQoYisyNDR8MCxlLChjW2IrMjgwPj4yXXwwKSs0NHwwKXwwKStofDA7aD1jW2IrMjY4Pj4yXXwwO2lmKChlfDApPDApe2U9ZStofDB9ZWxzZXtlPWUtKGU+Pj4wPGg+Pj4wPzA6aCl8MH1vPWIrKGNbZz4+Ml08PDMpKzEwMHwwO2w9bztuPWw7bD1sKzR8MDtsPUluKGRbbj4+MF18ZFtuKzE+PjBdPDw4fGRbbisyPj4wXTw8MTZ8ZFtuKzM+PjBdPDwyNHwwLGRbbD4+MF18ZFtsKzE+PjBdPDw4fGRbbCsyPj4wXTw8MTZ8ZFtsKzM+PjBdPDwyNHwwLGV8MCwoKGV8MCk8MCk8PDMxPj4zMXwwKXwwO249STttPW87YVttPj4wXT1sO2FbbSsxPj4wXT1sPj44O2FbbSsyPj4wXT1sPj4xNjthW20rMz4+MF09bD4+MjQ7bz1vKzR8MDthW28+PjBdPW47YVtvKzE+PjBdPW4+Pjg7YVtvKzI+PjBdPW4+PjE2O2FbbyszPj4wXT1uPj4yNDtjW2IrKGNbZz4+Ml08PDIpKzE0OD4+Ml09MDticmVha31pZigoaHwwKT49NTExKXtpZigoaHwwKSE9NTEyKXtpZigoaHwwKTw9NTExKXticmVha31jW2c+PjJdPShjW2c+PjJdfDApK2gmMztrZChiLGUpfDA7YnJlYWt9aD1iKzk2fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxJjM7az1iKyhjW2c+PjJdPDwzKSsxMDR8MDtrPWRbaz4+MF18ZFtrKzE+PjBdPDw4fGRbaysyPj4wXTw8MTZ8ZFtrKzM+PjBdPDwyNDtrPShyZChiKzI0NHwwLGUsKGNbYisyODA+PjJdfDApKzM1MnwwKXwwKStrfDA7aj1jW2IrMjY4Pj4yXXwwO2lmKChrfDApPDApe2o9aytqfDB9ZWxzZXtqPWstKGs+Pj4wPGo+Pj4wPzA6ail8MH1vPSgoanwwKTwwKTw8MzE+PjMxO2s9YisoY1toPj4yXTw8MykrMTAwfDA7bD1rO2FbbD4+MF09ajthW2wrMT4+MF09aj4+ODthW2wrMj4+MF09aj4+MTY7YVtsKzM+PjBdPWo+PjI0O2s9ays0fDA7YVtrPj4wXT1vO2FbaysxPj4wXT1vPj44O2FbaysyPj4wXT1vPj4xNjthW2srMz4+MF09bz4+MjQ7az1iKyhjW2g+PjJdPDwzKSsxMDB8MDtvPWs7bz1kW28+PjBdfGRbbysxPj4wXTw8OHxkW28rMj4+MF08PDE2fGRbbyszPj4wXTw8MjQ7bD1rO2FbbD4+MF09MDthW2wrMT4+MF09MDthW2wrMj4+MF09MDthW2wrMz4+MF09MDtrPWsrNHwwO2Fbaz4+MF09bzthW2srMT4+MF09bz4+ODthW2srMj4+MF09bz4+MTY7YVtrKzM+PjBdPW8+PjI0O2s9ZSs0fDA7bz1jW2s+PjJdfDA7bD1lKzh8MDttPShjW2w+PjJdfDApPj4+MTY7Y1tsPj4yXT1tO2o9KG8+Pj4wKS8obT4+PjApfDA7bT1vLShlYShtLGopfDApfDA7Y1trPj4yXT1tO2Rve209KG1kKGNbZT4+Ml18MCl8MCkmMjU1fG08PDg7Y1trPj4yXT1tO249Y1tsPj4yXXwwO289bjw8ODtjW2w+PjJdPW99d2hpbGUobz4+PjA8MTY3NzcyMTYpO289bj4+PjgmNjU1MzU7Y1tsPj4yXT1vO249KG0+Pj4wKS8obz4+PjApfDA7bT1tLShlYShuLG8pfDApfDA7Y1trPj4yXT1tO2Rve209KG1kKGNbZT4+Ml18MCl8MCkmMjU1fG08PDg7Y1trPj4yXT1tO289Y1tsPj4yXTw8ODtjW2w+PjJdPW99d2hpbGUobz4+PjA8MTY3NzcyMTYpO289YisoY1toPj4yXTw8MykrMTAwfDA7bT1vO2w9bTttPW0rNHwwO209ZFttPj4wXXxkW20rMT4+MF08PDh8ZFttKzI+PjBdPDwxNnxkW20rMz4+MF08PDI0O2w9ZFtsPj4wXXxkW2wrMT4+MF08PDh8ZFtsKzI+PjBdPDwxNnxkW2wrMz4+MF08PDI0fChuPDwxNnxqJjY1NTM1KTtuPW87YVtuPj4wXT1sO2FbbisxPj4wXT1sPj44O2FbbisyPj4wXT1sPj4xNjthW24rMz4+MF09bD4+MjQ7bz1vKzR8MDthW28+PjBdPW07YVtvKzE+PjBdPW0+Pjg7YVtvKzI+PjBdPW0+PjE2O2FbbyszPj4wXT1tPj4yNDtvPWNbaD4+Ml18MDtjW2c+PjJdPW87Y1tiKyhvPDwyKSsxMzI+PjJdPTA7Y1tiKyhjW2c+PjJdPDwyKSsxNDg+PjJdPTA7YnJlYWt9ZG97aWYoKGh8MCk9PTApe2U9cmQoYisyNDR8MCxlLChjW2IrMjgwPj4yXXwwKSszMDh8MCl8MDtoPWNbYisyNjg+PjJdfDA7aWYoKGV8MCk8MCl7ZT1oK2V8MH1lbHNle2U9ZS0oZT4+PjA8aD4+PjA/MDpoKXwwfWg9YisoY1tnPj4yXTw8MikrMTQ4fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2g9Y1tnPj4yXXwwO2lmKChjW2IrKGg8PDIpKzE0OD4+Ml18MCk+Myl7Y1tiKyhoPDwyKSsxMzI+PjJdPWU7Y1tiKyhjW2c+PjJdPDwyKSsxNDg+PjJdPTB9fWVsc2V7aWYoKGh8MCk8NTAwKXtsPWIrMjQ0fDA7aj1lYShjW2IrKGNbZz4+Ml08PDIpKzEzMj4+Ml18MCxoKXwwO2s9Y1tiKzI4MD4+Ml18MDtpZigoaHwwKTwxMCl7aD0ocmQobCxlLGsrODh8MCl8MCkranwwO2U9Y1tiKzI2OD4+Ml18MDtpZigoaHwwKTwwKXtlPWgrZXwwO2JyZWFrfWVsc2V7ZT1oLShoPj4+MDxlPj4+MD8wOmUpfDA7YnJlYWt9fWVsc2V7aD0ocmQobCxlLGsrMTMyfDApfDApK2p8MDtlPWNbYisyNjg+PjJdfDA7aWYoKGh8MCk8MCl7ZT1oK2V8MDticmVha31lbHNle2U9aC0oaD4+PjA8ZT4+PjA/MDplKXwwO2JyZWFrfX19aWYoKGh8MCk9PTUwMCl7aD0oY1tiKyhjW2c+PjJdPDwyKSsxMzI+PjJdfDApKjUwMHwwO2g9KHJkKGIrMjQ0fDAsZSwoY1tiKzI4MD4+Ml18MCkrMTc2fDApfDApK2h8MDtlPWNbYisyNjg+PjJdfDA7aWYoKGh8MCk8MCl7ZT1oK2V8MH1lbHNle2U9aC0oaD4+PjA8ZT4+PjA/MDplKXwwfWg9YisoY1tnPj4yXTw8MikrMTQ4fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2g9Y1tnPj4yXXwwO2lmKChjW2IrKGg8PDIpKzE0OD4+Ml18MCk8PTMpe2JyZWFrfWNbYisoaDw8MikrMTMyPj4yXT1lO2NbYisoY1tnPj4yXTw8MikrMTQ4Pj4yXT0wO2JyZWFrfWg9NTAwLWh8MDtrPWIrMjQ0fDA7aj1jW2IrKGNbZz4+Ml08PDIpKzEzMj4+Ml18MDtpZigoaHwwKT4tMTApe2g9ZWEoaixoKXwwO2g9KHJkKGssZSwoY1tiKzI4MD4+Ml18MCkrMjIwfDApfDApK2h8MDtlPWNbYisyNjg+PjJdfDA7aWYoKGh8MCk8MCl7ZT1oK2V8MDticmVha31lbHNle2U9aC0oaD4+PjA8ZT4+PjA/MDplKXwwO2JyZWFrfX1oPWVhKGosLTEwKXwwO2U9KHJkKGssZSwoY1tiKzI4MD4+Ml18MCkrMjY0fDApfDApK2h8MDtoPWNbYisyNjg+PjJdfDA7aWYoKGV8MCk8MCl7aD1lK2h8MH1lbHNle2g9ZS0oZT4+PjA8aD4+PjA/MDpoKXwwfWU9YisoY1tnPj4yXTw8MikrMTQ4fDA7Y1tlPj4yXT0oY1tlPj4yXXwwKSsxO2U9Y1tnPj4yXXwwO2lmKChjW2IrKGU8PDIpKzE0OD4+Ml18MCk+Myl7Y1tiKyhlPDwyKSsxMzI+PjJdPWg7Y1tiKyhjW2c+PjJdPDwyKSsxNDg+PjJdPTA7ZT1ofWVsc2V7ZT1ofX19d2hpbGUoMCk7bz1iKyhjW2c+PjJdPDwzKSsxMDB8MDtsPW87bj1sO2w9bCs0fDA7bD1JbihkW24+PjBdfGRbbisxPj4wXTw8OHxkW24rMj4+MF08PDE2fGRbbiszPj4wXTw8MjR8MCxkW2w+PjBdfGRbbCsxPj4wXTw8OHxkW2wrMj4+MF08PDE2fGRbbCszPj4wXTw8MjR8MCxlfDAsKChlfDApPDApPDwzMT4+MzF8MCl8MDtuPUk7bT1vO2FbbT4+MF09bDthW20rMT4+MF09bD4+ODthW20rMj4+MF09bD4+MTY7YVttKzM+PjBdPWw+PjI0O289bys0fDA7YVtvPj4wXT1uO2FbbysxPj4wXT1uPj44O2FbbysyPj4wXT1uPj4xNjthW28rMz4+MF09bj4+MjR9fXdoaWxlKDApO249YisoY1tnPj4yXTw8MykrMTAwfDA7bz1uO249bis0fDA7bj1kW24+PjBdfGRbbisxPj4wXTw8OHxkW24rMj4+MF08PDE2fGRbbiszPj4wXTw8MjQ7bz1kW28+PjBdfGRbbysxPj4wXTw8OHxkW28rMj4+MF08PDE2fGRbbyszPj4wXTw8MjQ7ST1uO2k9ZjtyZXR1cm4gb3wwfWZ1bmN0aW9uIGxkKGIsZSxmKXtiPWJ8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtnPWk7aT1pKzE2fDA7aD1nO2lmKChhW2I+PjBdfDApPT0wKXthW2I+PjBdPTE7cGQoY1tlPj4yXXwwLGgsNik7dT1hW2grMT4+MF08PDh8ZFtoPj4wXTtqPXUmNjU1MzU7bD1hW2grMj4+MF18MDtrPShhW2grMz4+MF08PDh8bCYyNTUpJjY1NTM1O249YVtoKzQ+PjBdfDA7bT0oYVtoKzU+PjBdPDw4fG4mMjU1KSY2NTUzNTtoPWIrMXwwO2FbaD4+MF09ajthW2grMT4+MF09aj4+ODtoPWIrM3wwO2FbaD4+MF09azthW2grMT4+MF09az4+ODtoPWIrNXwwO2FbaD4+MF09bTthW2grMT4+MF09bT4+ODtoPXU7bT0obSY2NTUzNSk+Pj44JjI1NX1lbHNle2w9cWQoZSxiKzh8MCl8MDtpZigobCYxfDApPT0wKXttPWIrMXwwO209ZFttPj4wXXxkW20rMT4+MF08PDg7aD1tJjI1NX1lbHNle2g9KHFkKGUsYis1MnwwKXwwKSYyNTU7bT1iKzF8MDttPWRbbT4+MF18ZFttKzE+PjBdPDw4O2g9KG0mMjU1KStofDA7aD0oaHwwKT4yNTU/aCs2NTI4MHwwOmh9aWYoKGwmMnwwKT09MCl7aD1tJjY1MjgwfGgmNjU1MzV9ZWxzZXt1PShxZChlLGIrOTZ8MCl8MCkmMjU1O209YisxfDA7bT1kW20+PjBdfGRbbSsxPj4wXTw8ODt1PSgobSY2NTUzNSk+Pj44KSt1fDA7aD0oKHV8MCk+MjU1P3UrNjUyODB8MDp1KTw8OHxoJjY1NTM1fWo9aCY2NTUzNTtkb3tpZigobCY2NHwwKT09MCl7az1iKzF8MDtsPWIrNXwwO249ajttPWp9ZWxzZXtrPWIrMXwwO209KGgmMjU1KS0obSYyNTUpfDA7ZG97aWYoKGwmNHwwKSE9MCl7cD1xZChlLGIrMTQwfDApfDA7bj1wJjI1NTtvPWIrM3wwO289ZFtvPj4wXXxkW28rMT4+MF08PDg7cT1vJjY1NTM1O3I9KHEmMjU1KSttfDA7cz0ocnwwKTwxO2lmKChyKyAtMXwwKT4+PjA+MjUzKXt0PXM/MDoyNTV9ZWxzZXt0PXErbSYyNTV9aWYoKHQrbnwwKT4yNTUpe2lmKCFzKXtpZigocnwwKT4yNTQpe249MjU1fWVsc2V7bj1xK20mMjU1fX1lbHNle249MH1uPShwfC0yNTYpK258MDticmVha31lbHNle2lmKCFzKXtpZigocnwwKT4yNTQpe3A9MjU1fWVsc2V7cD1xK20mMjU1fX1lbHNle3A9MH1uPXArbnwwO2JyZWFrfX1lbHNle289YiszfDA7bz1kW28+PjBdfGRbbysxPj4wXTw8ODtuPW8mMjU1fX13aGlsZSgwKTtkb3tpZigobCYxNnwwKSE9MCl7cD1xZChlLGIrMjI4fDApfDA7bz1iKzN8MDtvPWRbbz4+MF18ZFtvKzE+PjBdPDw4O3I9KChuJjI1NSkrbS0obyYyNTUpfDApLzJ8MDttPXAmMjU1O3Q9Yis1fDA7dD0oZFt0Pj4wXXxkW3QrMT4+MF08PDgpJjY1NTM1O3U9KHQmMjU1KStyfDA7cz0odXwwKTwxO2lmKCh1KyAtMXwwKT4+PjA+MjUzKXtxPXM/MDoyNTV9ZWxzZXtxPXQrciYyNTV9aWYoKHErbXwwKT4yNTUpe2lmKCFzKXtpZigodXwwKT4yNTQpe209MjU1fWVsc2V7bT10K3ImMjU1fX1lbHNle209MH1tPShwfC0yNTYpK218MDtwPW87YnJlYWt9ZWxzZXtpZighcyl7aWYoKHV8MCk+MjU0KXtwPTI1NX1lbHNle3A9dCtyJjI1NX19ZWxzZXtwPTB9bT1wK218MDtwPW87YnJlYWt9fWVsc2V7bT1iKzV8MDttPShkW20+PjBdfGRbbSsxPj4wXTw8OCkmMjU1O3A9b319d2hpbGUoMCk7bz0oaD4+PjgmMjU1KS0oKChkW2s+PjBdfGRbaysxPj4wXTw8OCkmNjU1MzUpPj4+OCl8MDtpZigobCY4fDApPT0wKXtyPXAmNjUyODB8biY2NTUzNX1lbHNle3A9cWQoZSxiKzE4NHwwKXwwO3E9cCYyNTU7dD1iKzN8MDt0PSgoKGRbdD4+MF18ZFt0KzE+PjBdPDw4KSY2NTUzNSk+Pj44KStvfDA7cj0odHwwKTwxO2lmKHIpe3M9MH1lbHNle3M9KHR8MCk+MjU0PzI1NTp0JjI1NX1pZigocytxfDApPjI1NSl7aWYocil7cT0wfWVsc2V7cT0odHwwKT4yNTQ/MjU1OnQmMjU1fXA9KHB8LTI1NikrcXwwfWVsc2V7aWYocil7cD0wfWVsc2V7cD0odHwwKT4yNTQ/MjU1OnQmMjU1fXA9cCtxfDB9cj1wPDw4fG4mNjU1MzV9bj1yJjY1NTM1O2lmKChsJjMyfDApPT0wKXt1PWIrNXwwO2w9dTttPSgoZFt1Pj4wXXxkW3UrMT4+MF08PDgpJjY1MjgwfG0pJjY1NTM1O2JyZWFrfXE9cWQoZSxiKzI3MnwwKXwwO3U9YiszfDA7cD1xJjI1NTtsPWIrNXwwO3I9KCgoZFtsPj4wXXxkW2wrMT4+MF08PDgpJjY1NTM1KT4+PjgpKygoKHI+Pj44JjI1NSkrby0oKChkW3U+PjBdfGRbdSsxPj4wXTw8OCkmNjU1MzUpPj4+OCl8MCkvMnwwKXwwO289KHJ8MCk8MTtpZihvKXtzPTB9ZWxzZXtzPShyfDApPjI1ND8yNTU6ciYyNTV9aWYoKHMrcHwwKT4yNTUpe2lmKG8pe289MH1lbHNle289KHJ8MCk+MjU0PzI1NTpyJjI1NX1vPShxfC0yNTYpK298MH1lbHNle2lmKG8pe289MH1lbHNle289KHJ8MCk+MjU0PzI1NTpyJjI1NX1vPW8rcHwwfW09KG88PDh8bSkmNjU1MzV9fXdoaWxlKDApO2Fbaz4+MF09ajthW2srMT4+MF09aj4+ODtrPWIrM3wwO2Fbaz4+MF09bjthW2srMT4+MF09bj4+ODthW2w+PjBdPW07YVtsKzE+PjBdPW0+Pjg7az1uO2w9biYyNTU7bj1tJjI1NTttPShtJjY1NTM1KT4+PjgmMjU1fWFbZisxPj4wXT0oaiY2NTUzNSk+Pj44O2FbZj4+MF09aDthW2YrMz4+MF09KGsmNjU1MzUpPj4+ODthW2YrMj4+MF09bDthW2YrNT4+MF09bTthW2YrND4+MF09bjtmPWIrMzE2fDA7aWYoKGFbZj4+MF18MCk9PTApe2k9ZztyZXR1cm59dT0oKG1kKGNbZT4+Ml18MCl8MCkmMjU1KTw8MjQ7dT0oKG1kKGNbZT4+Ml18MCl8MCkmMjU1KTw8MTZ8dTt1PXV8KChtZChjW2U+PjJdfDApfDApJjI1NSk8PDg7Y1tlKzQ+PjJdPXV8KG1kKGNbZT4+Ml18MCl8MCkmMjU1O2FbZj4+MF09MDtpPWc7cmV0dXJufWZ1bmN0aW9uIG1kKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Zz1pO2U9Yis0fDA7aD1jW2U+PjJdfDA7Zj1iKzh8MDtpZigoaHwwKTwoY1tmPj4yXXwwKSl7aj1oO2g9aisxfDA7Y1tlPj4yXT1oO2g9YisxMnwwO2g9Y1toPj4yXXwwO2o9aCtqfDA7aj1hW2o+PjBdfDA7aT1nO3JldHVybiBqfDB9Y1tlPj4yXT0wO2o9Y1tiPj4yXXwwO2g9aisxM3wwO2lmKChhW2g+PjBdfDApPT0wKXtrPWorNHwwO249ais4fDA7bD1jW24+PjJdfDA7bT0oY1trPj4yXXwwKS1sfDA7bT0obXwwKTwxMDQ4NTc2P206MTA0ODU3NjtNbihjW2IrMTI+PjJdfDAsKGNbaj4+Ml18MCkrbHwwLG18MCl8MDtsPShjW24+PjJdfDApK218MDtjW24+PjJdPWw7Y1tqKzE2Pj4yXT1tO2lmKChsfDApPj0oY1trPj4yXXwwKSl7YVtoPj4wXT0xfX1lbHNle2FbaisxMj4+MF09MX1uPWNbKGNbYj4+Ml18MCkrMTY+PjJdfDA7Y1tmPj4yXT1uO2lmKChufDApIT0wKXtuPWNbZT4+Ml18MDttPW4rMXwwO2NbZT4+Ml09bTttPWIrMTJ8MDttPWNbbT4+Ml18MDtuPW0rbnwwO249YVtuPj4wXXwwO2k9ZztyZXR1cm4gbnwwfWI9WGEoOCl8MDtjW2I+PjJdPTk5Mjg7d2hpbGUoMSl7ZT11bigzMil8MDtpZigoZXwwKSE9MCl7ZD0xNDticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7YnJlYWt9c2NbZSYzMV0oKX1pZigoZHwwKT09MTQpe2NbZSs0Pj4yXT0xOTtjW2U+PjJdPTE5O2Y9ZSsxMnwwO2NbYis0Pj4yXT1mO2NbZSs4Pj4yXT0wO2Y9ZiswfDA7ZT04MjR8MDtkPWYrMjB8MDtkb3thW2Y+PjBdPWFbZT4+MF18MDtmPWYrMXwwO2U9ZSsxfDB9d2hpbGUoKGZ8MCk8KGR8MCkpO2NbYj4+Ml09ODU2O3diKGJ8MCw4MDgsMjYpfW49WGEoNCl8MDtjW24+PjJdPTIyNjgwO3diKG58MCwyMjcyOCwyMDYpO3JldHVybiAwfWZ1bmN0aW9uIG5kKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBvZChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHBkKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2Y9aTtnPWIrNHwwO2s9Y1tnPj4yXXwwO2o9Yis4fDA7ZG97aWYoKGt8MCk8KGNbaj4+Ml18MCkpe2o9a31lbHNle2NbZz4+Ml09MDtrPWNbYj4+Ml18MDtsPWsrMTN8MDtpZigoYVtsPj4wXXwwKT09MCl7bT1rKzR8MDtwPWsrOHwwO249Y1twPj4yXXwwO289KGNbbT4+Ml18MCktbnwwO289KG98MCk8MTA0ODU3Nj9vOjEwNDg1NzY7TW4oY1tiKzEyPj4yXXwwLChjW2s+PjJdfDApK258MCxvfDApfDA7bj0oY1twPj4yXXwwKStvfDA7Y1twPj4yXT1uO2NbaysxNj4+Ml09bztpZigobnwwKT49KGNbbT4+Ml18MCkpe2FbbD4+MF09MX19ZWxzZXthW2srMTI+PjBdPTF9cD1jWyhjW2I+PjJdfDApKzE2Pj4yXXwwO2Nbaj4+Ml09cDtpZigocHwwKSE9MCl7aj1jW2c+PjJdfDA7YnJlYWt9ZT1YYSg4KXwwO2NbZT4+Ml09OTkyODt3aGlsZSgxKXtmPXVuKDMyKXwwO2lmKChmfDApIT0wKXtoPTE0O2JyZWFrfWY9Y1s1NjY2XXwwO2NbNTY2Nl09ZiswO2lmKChmfDApPT0wKXticmVha31zY1tmJjMxXSgpfWlmKChofDApPT0xNCl7Y1tmKzQ+PjJdPTE5O2NbZj4+Ml09MTk7ZD1mKzEyfDA7Y1tlKzQ+PjJdPWQ7Y1tmKzg+PjJdPTA7ZD1kKzB8MDtnPTgyNHwwO2Y9ZCsyMHwwO2Rve2FbZD4+MF09YVtnPj4wXXwwO2Q9ZCsxfDA7Zz1nKzF8MH13aGlsZSgoZHwwKTwoZnwwKSk7Y1tlPj4yXT04NTY7d2IoZXwwLDgwOCwyNil9cD1YYSg0KXwwO2NbcD4+Ml09MjI2ODA7d2IocHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2I9Y1tiKzEyPj4yXXwwO2g9YisoaitlKXwwO2lmKChlfDApPT0wKXtwPWo7cD1wK2V8MDtjW2c+PjJdPXA7aT1mO3JldHVybn1iPWIranwwO3doaWxlKDEpe2FbZD4+MF09YVtiPj4wXXwwO2I9YisxfDA7aWYoKGJ8MCk9PShofDApKXticmVha31lbHNle2Q9ZCsxfDB9fXA9Y1tnPj4yXXwwO3A9cCtlfDA7Y1tnPj4yXT1wO2k9ZjtyZXR1cm59ZnVuY3Rpb24gcWQoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTA7ZT1pO2Q9YSs4fDA7Zj1jW2Q+PjJdfDA7aD1jW2IrMTY+PjJdfDA7aWYoKGh8MCkhPTApe2o9Y1thKzQ+PjJdfDA7Zz1mPj4+MTU7Y1tkPj4yXT1nO2w9KGo+Pj4wKS8oZz4+PjApfDA7bT1sPj4+KGNbYis0MD4+Ml18MCk7az1jW2grKG08PDIpPj4yXXwwO209KGNbaCsobSsxPDwyKT4+Ml18MCkrMXwwO249aysxfDA7aD1jW2IrOD4+Ml18MDtpZihtPj4+MD5uPj4+MCl7d2hpbGUoMSl7bj0obStrfDApPj4+MTtvPShjW2grKG48PDIpPj4yXXwwKT4+PjA+bD4+PjA7az1vP2s6bjttPW8/bjptO249aysxfDA7aWYoIShtPj4+MD5uPj4+MCkpe2w9bjticmVha319fWVsc2V7bD1ufW49ZWEoZyxjW2grKGs8PDIpPj4yXXwwKXwwO2lmKChrfDApIT0oY1tiKzMyPj4yXXwwKSl7Zj1lYShjW2grKGw8PDIpPj4yXXwwLGcpfDB9fWVsc2V7aD1mPj4+MTU7Y1tkPj4yXT1oO2w9Y1tiPj4yXXwwO2c9Y1tiKzg+PjJdfDA7aj1jW2ErND4+Ml18MDttPWw+Pj4xO2s9MDtuPTA7ZG97cD1lYShjW2crKG08PDIpPj4yXXwwLGgpfDA7bz1wPj4+MD5qPj4+MDtmPW8/cDpmO249bz9uOnA7az1vP2s6bTtsPW8/bTpsO209KGsrbHwwKT4+PjF9d2hpbGUoKG18MCkhPShrfDApKX1nPWErNHwwO2g9ai1ufDA7Y1tnPj4yXT1oO3A9Zi1ufDA7Y1tkPj4yXT1wO2lmKHA+Pj4wPDE2Nzc3MjE2KXtkb3toPShtZChjW2E+PjJdfDApfDApJjI1NXxoPDw4O2NbZz4+Ml09aDtwPWNbZD4+Ml08PDg7Y1tkPj4yXT1wfXdoaWxlKHA+Pj4wPDE2Nzc3MjE2KX1vPShjW2IrMTI+PjJdfDApKyhrPDwyKXwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtvPWIrMjh8MDtwPShjW28+PjJdfDApKyAtMXwwO2Nbbz4+Ml09cDtpZigocHwwKSE9MCl7aT1lO3JldHVybiBrfDB9ZGQoYik7aT1lO3JldHVybiBrfDB9ZnVuY3Rpb24gcmQoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2U9aTtmPXFkKGIsZCl8MDtjW2E+PjJdPWY7aWYoKGZ8MCkhPTApe2lmKCEoZj4+PjA8MzIpKXtsPWNbYSsyOD4+Ml18MDtpPWU7cmV0dXJuIGx8MH1kPWNbYSsxMj4+Ml18MDtpZihmPj4+MD5kPj4+MCl7ZD1mLWR8MDtsPXFkKGIsKGNbYSs2OD4+Ml18MCkrKChmKyAtMXwwKSo0NHwwKXwwKXwwO2Q9bDw8ZHwoc2QoYixkKXwwKX1lbHNle2Q9cWQoYiwoY1thKzY4Pj4yXXwwKSsoKGYrIC0xfDApKjQ0fDApfDApfDB9YT1jW2E+PjJdfDA7aWYoKGR8MCk8KDE8PGErIC0xfDApKXtsPWQrMSsoLTE8PGEpfDA7aT1lO3JldHVybiBsfDB9ZWxzZXtsPWQrMXwwO2k9ZTtyZXR1cm4gbHwwfX1mPWErNTZ8MDtoPWIrOHwwO2w9Y1toPj4yXXwwO2o9ZWEobD4+PjEzLGNbZj4+Ml18MCl8MDtnPWIrNHwwO2s9Y1tnPj4yXXwwO209az4+PjA+PWo+Pj4wO2Q9bSYxO2lmKG0pe2NbZz4+Ml09ay1qO2o9bC1qfDA7Y1toPj4yXT1qfWVsc2V7Y1toPj4yXT1qO2o9YSs2MHwwO2Nbaj4+Ml09KGNbaj4+Ml18MCkrMTtqPWNbaD4+Ml18MH1pZihqPj4+MDwxNjc3NzIxNil7aj1jW2c+PjJdfDA7ZG97aj0obWQoY1tiPj4yXXwwKXwwKSYyNTV8ajw8ODtjW2c+PjJdPWo7bT1jW2g+PjJdPDw4O2NbaD4+Ml09bX13aGlsZShtPj4+MDwxNjc3NzIxNil9aD1hKzUyfDA7bT0oY1toPj4yXXwwKSsgLTF8MDtjW2g+PjJdPW07aWYoKG18MCkhPTApe209ZDtpPWU7cmV0dXJuIG18MH1iPWErNDh8MDtnPWNbYj4+Ml18MDtqPWErNjR8MDtrPShjW2o+PjJdfDApK2d8MDtjW2o+PjJdPWs7aWYoaz4+PjA+ODE5Mil7az0oaysxfDApPj4+MTtjW2o+PjJdPWs7bT1hKzYwfDA7YT0oKGNbbT4+Ml18MCkrMXwwKT4+PjE7Y1ttPj4yXT1hO2lmKChhfDApPT0oa3wwKSl7bT1rKzF8MDtjW2o+PjJdPW07aj1tfWVsc2V7aj1rO2s9YX19ZWxzZXtqPWs7az1jW2ErNjA+PjJdfDB9Y1tmPj4yXT0oZWEoMjE0NzQ4MzY0OC8oaj4+PjApfDAsayl8MCk+Pj4xODttPWcqNXwwO209bT4+PjA+MjU5PzY0Om0+Pj4yO2NbYj4+Ml09bTtjW2g+PjJdPW07bT1kO2k9ZTtyZXR1cm4gbXwwfWZ1bmN0aW9uIHNkKGEsYil7YT1hfDA7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wO2Y9aTtkPWErNHwwO2c9Y1tkPj4yXXwwO2U9YSs4fDA7aD1jW2U+PjJdfDA7aWYoYj4+PjA+MTkpe2o9aD4+PjE2O2NbZT4+Ml09ajtoPShnPj4+MCkvKGo+Pj4wKXwwO2c9Zy0oZWEoaCxqKXwwKXwwO2NbZD4+Ml09Zztkb3tnPShtZChjW2E+PjJdfDApfDApJjI1NXxnPDw4O2NbZD4+Ml09ZztqPWNbZT4+Ml08PDg7Y1tlPj4yXT1qfXdoaWxlKGo+Pj4wPDE2Nzc3MjE2KTtqPShzZChhLGIrIC0xNnwwKXwwKTw8MTZ8aCY2NTUzNTtpPWY7cmV0dXJuIGp8MH1qPWg+Pj5iO2NbZT4+Ml09ajtiPShnPj4+MCkvKGo+Pj4wKXwwO2c9Zy0oZWEoYixqKXwwKXwwO2NbZD4+Ml09ZztpZighKGo+Pj4wPDE2Nzc3MjE2KSl7aT1mO3JldHVybiBifDB9ZG97Zz0obWQoY1thPj4yXXwwKXwwKSYyNTV8Zzw8ODtjW2Q+PjJdPWc7aj1jW2U+PjJdPDw4O2NbZT4+Ml09an13aGlsZShqPj4+MDwxNjc3NzIxNik7aT1mO3JldHVybiBifDB9ZnVuY3Rpb24gdGQoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTA7Zj1pO2k9aSs5NnwwO2g9Zis0NHwwO2Q9Zjt3PWIrMzZ8MDt1PWIrNDB8MDtpZigoY1t3Pj4yXXwwKSE9KGNbdT4+Ml18MCkpe2k9ZjtyZXR1cm59aj1iKzh8MDtlPWIrMjB8MDtpZigoY1tqPj4yXXwwKSE9MCl7Zz1iKzQ0fDA7bj1oKzR8MDttPWgrOHwwO2w9aCsxMnwwO2s9aCsxNnwwO289aCsyMHwwO3A9aCsyNHwwO3E9aCsyOHwwO3I9aCszMnwwO3M9aCszNnwwO3Q9aCs0MHwwO3Y9MDtkb3tjZChoLChjW2U+PjJdfDApKzF8MCk7eD1jW3U+PjJdfDA7aWYoeD4+PjA8KGNbZz4+Ml18MCk+Pj4wKXtpZigoeHwwKT09MCl7eD0wfWVsc2V7Y1t4Pj4yXT1jW2g+PjJdO2FbeCs0Pj4wXT1hW24+PjBdfDA7Y1t4Kzg+PjJdPWNbbT4+Ml07Y1t4KzEyPj4yXT1jW2w+PjJdO2NbeCsxNj4+Ml09Y1trPj4yXTtjW3grMjA+PjJdPWNbbz4+Ml07Y1t4KzI0Pj4yXT1jW3A+PjJdO2NbeCsyOD4+Ml09Y1txPj4yXTtjW3grMzI+PjJdPWNbcj4+Ml07Y1t4KzM2Pj4yXT1jW3M+PjJdO2NbeCs0MD4+Ml09Y1t0Pj4yXTtjW20rMD4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDt4PWNbdT4+Ml18MH1jW3U+PjJdPXgrNDR9ZWxzZXt1ZCh3LGgpfXg9Y1ttPj4yXXwwO2lmKCh4fDApIT0wKXt2bihjW3grIC00Pj4yXXwwKX14PWNbbD4+Ml18MDtpZigoeHwwKSE9MCl7dm4oY1t4KyAtND4+Ml18MCl9eD1jW2s+PjJdfDA7aWYoKHh8MCkhPTApe3ZuKGNbeCsgLTQ+PjJdfDApfXY9disxfDB9d2hpbGUodj4+PjA8KGNbaj4+Ml18MCk+Pj4wKX1pZigoY1tlPj4yXXwwKT09MCl7aT1mO3JldHVybn10PWIrMTJ8MDtrPWIrNzJ8MDtzPWIrNzZ8MDtsPWQrNHwwO2o9ZCs4fDA7bz1kKzEyfDA7aD1kKzE2fDA7bT1kKzIwfDA7bj1kKzI0fDA7Zz1kKzI4fDA7cD1kKzMyfDA7cT1kKzM2fDA7cj1kKzQwfDA7Yj1iKzY4fDA7dT0xO2Rve3Y9Y1t0Pj4yXXwwO2NkKGQsMTw8KHU+Pj4wPnY+Pj4wP3Y6dSkpO3Y9Y1trPj4yXXwwO2lmKHY+Pj4wPChjW3M+PjJdfDApPj4+MCl7aWYoKHZ8MCk9PTApe3Y9MH1lbHNle2Nbdj4+Ml09Y1tkPj4yXTthW3YrND4+MF09YVtsPj4wXXwwO2Nbdis4Pj4yXT1jW2o+PjJdO2NbdisxMj4+Ml09Y1tvPj4yXTtjW3YrMTY+PjJdPWNbaD4+Ml07Y1t2KzIwPj4yXT1jW20+PjJdO2NbdisyND4+Ml09Y1tuPj4yXTtjW3YrMjg+PjJdPWNbZz4+Ml07Y1t2KzMyPj4yXT1jW3A+PjJdO2NbdiszNj4+Ml09Y1txPj4yXTtjW3YrNDA+PjJdPWNbcj4+Ml07Y1tqKzA+PjJdPTA7Y1tqKzQ+PjJdPTA7Y1tqKzg+PjJdPTA7dj1jW2s+PjJdfDB9Y1trPj4yXT12KzQ0fWVsc2V7dWQoYixkKX12PWNbaj4+Ml18MDtpZigodnwwKSE9MCl7dm4oY1t2KyAtND4+Ml18MCl9dj1jW28+PjJdfDA7aWYoKHZ8MCkhPTApe3ZuKGNbdisgLTQ+PjJdfDApfXY9Y1toPj4yXXwwO2lmKCh2fDApIT0wKXt2bihjW3YrIC00Pj4yXXwwKX11PXUrMXwwfXdoaWxlKCEodT4+PjA+KGNbZT4+Ml18MCk+Pj4wKSk7aT1mO3JldHVybn1mdW5jdGlvbiB1ZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2U9aTtmPWIrNHwwO209Y1tmPj4yXXwwO2s9Y1tiPj4yXXwwO2w9aztoPShtLWx8MCkvNDR8MDtqPWgrMXwwO2lmKGo+Pj4wPjk3NjEyODkzKXtUaygpfWc9Yis4fDA7bD0oKGNbZz4+Ml18MCktbHwwKS80NHwwO2lmKGw+Pj4wPDQ4ODA2NDQ2KXtvPWw8PDE7bz1vPj4+MDxqPj4+MD9qOm87aWYoKG98MCk9PTApe3A9MDtsPTB9ZWxzZXtuPTV9fWVsc2V7bz05NzYxMjg5MztuPTV9ZG97aWYoKG58MCk9PTUpe3A9byo0NHwwO3A9KHB8MCk9PTA/MTpwO3doaWxlKDEpe2w9dW4ocCl8MDtpZigobHwwKSE9MCl7bj0xMTticmVha31sPWNbNTY2Nl18MDtjWzU2NjZdPWwrMDtpZigobHwwKT09MCl7YnJlYWt9c2NbbCYzMV0oKX1pZigobnwwKT09MTEpe3A9bzticmVha31wPVhhKDQpfDA7Y1twPj4yXT0yMjY4MDt3YihwfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7bz1sKyhoKjQ0fDApfDA7bj1sKyhwKjQ0fDApfDA7aWYoKG98MCkhPTApe2Nbbz4+Ml09Y1tkPj4yXTthW2wrKGgqNDR8MCkrND4+MF09YVtkKzQ+PjBdfDA7bT1kKzh8MDtjW2wrKGgqNDR8MCkrOD4+Ml09Y1ttPj4yXTtjW2wrKGgqNDR8MCkrMTI+PjJdPWNbZCsxMj4+Ml07Y1tsKyhoKjQ0fDApKzE2Pj4yXT1jW2QrMTY+PjJdO2NbbCsoaCo0NHwwKSsyMD4+Ml09Y1tkKzIwPj4yXTtjW2wrKGgqNDR8MCkrMjQ+PjJdPWNbZCsyND4+Ml07Y1tsKyhoKjQ0fDApKzI4Pj4yXT1jW2QrMjg+PjJdO2NbbCsoaCo0NHwwKSszMj4+Ml09Y1tkKzMyPj4yXTtjW2wrKGgqNDR8MCkrMzY+PjJdPWNbZCszNj4+Ml07Y1tsKyhoKjQ0fDApKzQwPj4yXT1jW2QrNDA+PjJdO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO209Y1tmPj4yXXwwO2s9Y1tiPj4yXXwwfWo9bCsoaio0NHwwKXwwO2lmKChtfDApIT0oa3wwKSl7aD1oKyAtMS0oKChtKyAtNDQrKDAtayl8MCk+Pj4wKS80NHwwKXwwO3doaWxlKDEpe2Q9bTttPW0rIC00NHwwO2NbbysgLTQ0Pj4yXT1jW20+PjJdO2FbbysgLTQwPj4wXT1hW2QrIC00MD4+MF18MDtwPWQrIC0zNnwwO2NbbysgLTM2Pj4yXT1jW3A+PjJdO2NbbysgLTMyPj4yXT1jW2QrIC0zMj4+Ml07Y1tvKyAtMjg+PjJdPWNbZCsgLTI4Pj4yXTtjW28rIC0yND4+Ml09Y1tkKyAtMjQ+PjJdO2NbbysgLTIwPj4yXT1jW2QrIC0yMD4+Ml07Y1tvKyAtMTY+PjJdPWNbZCsgLTE2Pj4yXTtjW28rIC0xMj4+Ml09Y1tkKyAtMTI+PjJdO2NbbysgLTg+PjJdPWNbZCsgLTg+PjJdO2NbbysgLTQ+PjJdPWNbZCsgLTQ+PjJdO2NbcCswPj4yXT0wO2NbcCs0Pj4yXT0wO2NbcCs4Pj4yXT0wO2lmKChtfDApPT0oa3wwKSl7YnJlYWt9ZWxzZXtvPW8rIC00NHwwfX1tPWNbYj4+Ml18MDtrPWNbZj4+Ml18MDtjW2I+PjJdPWwrKGgqNDR8MCk7Y1tmPj4yXT1qO2NbZz4+Ml09bjtpZigoa3wwKSE9KG18MCkpe2Rve2Y9Y1trKyAtMzY+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1trKyAtMzI+PjJdfDA7aWYoKGZ8MCkhPTApe3ZuKGNbZisgLTQ+PjJdfDApfWY9Y1trKyAtMjg+PjJdfDA7az1rKyAtNDR8MDtpZigoZnwwKSE9MCl7dm4oY1tmKyAtND4+Ml18MCl9fXdoaWxlKChrfDApIT0obXwwKSl9fWVsc2V7Y1tiPj4yXT1vO2NbZj4+Ml09ajtjW2c+PjJdPW59aWYoKG18MCk9PTApe2k9ZTtyZXR1cm59dm4obSk7aT1lO3JldHVybn1mdW5jdGlvbiB2ZChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gd2QoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geGQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7YT1jW2ErMTI+PjJdfDA7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59bGNbY1soY1thPj4yXXwwKSs4Pj4yXSYyNTVdKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24geWQoYSxiKXthPWF8MDtiPWJ8MDtpZigoY1tiKzQ+PjJdfDApPT0xNDA4KXthPWErMTJ8MH1lbHNle2E9MH1yZXR1cm4gYXwwfWZ1bmN0aW9uIHpkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEFkKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtlPWk7aT1pKzMyfDA7Zz1lO2Y9Y1tiKzg+PjJdfDA7Yj1jW2IrND4+Ml18MDtqZChnLGYsYik7aD1jW2c+PjJdfDA7YVtkKzM+PjBdPWg+Pj4yNDthW2QrMj4+MF09aD4+PjE2O2FbZCsxPj4wXT1oPj4+ODthW2Q+PjBdPWg7aD1jW2crND4+Ml18MDthW2QrNz4+MF09aD4+PjI0O2FbZCs2Pj4wXT1oPj4+MTY7YVtkKzU+PjBdPWg+Pj44O2FbZCs0Pj4wXT1oO2g9Y1tnKzg+PjJdfDA7YVtkKzExPj4wXT1oPj4+MjQ7YVtkKzEwPj4wXT1oPj4+MTY7YVtkKzk+PjBdPWg+Pj44O2FbZCs4Pj4wXT1oO2g9Y1tnKzEyPj4yXXwwO2FbZCsxMz4+MF09KGgmNjU1MzUpPj4+ODthW2QrMTI+PjBdPWg7YVtkKzE0Pj4wXT1oPj4+MTY7YVtkKzE1Pj4wXT1oPj4+MjQ7Zz1jW2crMTY+PjJdfDA7YVtkKzE2Pj4wXT1nO2FbZCsxNz4+MF09KGcmNjU1MzUpPj4+ODthW2QrMTk+PjBdPWc+Pj4yNDthW2QrMTg+PjBdPWc+Pj4xNjtsZChmKzQ3ODR8MCxiLGQrMjB8MCk7aT1lO3JldHVybn1mdW5jdGlvbiBCZChhKXthPWF8MDt2YXIgYj0wO2I9aTtjW2E+PjJdPTE3MjA7YT1jW2ErOD4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1hZChhKzQ3ODR8MCk7WGMoYSk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBDZChhKXthPWF8MDt2YXIgYj0wLGQ9MDtiPWk7Y1thPj4yXT0xNzIwO2Q9Y1thKzg+PjJdfDA7aWYoKGR8MCk9PTApe3ZuKGEpO2k9YjtyZXR1cm59YWQoZCs0Nzg0fDApO1hjKGQpO3ZuKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gRGQoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEVkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEZkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2E9Y1thKzEyPj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEdkKGEsYil7YT1hfDA7Yj1ifDA7aWYoKGNbYis0Pj4yXXwwKT09MjM3Nil7YT1hKzEyfDB9ZWxzZXthPTB9cmV0dXJuIGF8MH1mdW5jdGlvbiBIZChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBJZChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2U9aTtpPWkrMzJ8MDtoPWU7Zj1jW2IrOD4+Ml18MDtiPWNbYis0Pj4yXXwwO2pkKGgsZixiKTtnPWNbaD4+Ml18MDthW2QrMz4+MF09Zz4+PjI0O2FbZCsyPj4wXT1nPj4+MTY7YVtkKzE+PjBdPWc+Pj44O2FbZD4+MF09ZztnPWNbaCs0Pj4yXXwwO2FbZCs3Pj4wXT1nPj4+MjQ7YVtkKzY+PjBdPWc+Pj4xNjthW2QrNT4+MF09Zz4+Pjg7YVtkKzQ+PjBdPWc7Zz1jW2grOD4+Ml18MDthW2QrMTE+PjBdPWc+Pj4yNDthW2QrMTA+PjBdPWc+Pj4xNjthW2QrOT4+MF09Zz4+Pjg7YVtkKzg+PjBdPWc7Zz1jW2grMTI+PjJdfDA7YVtkKzEzPj4wXT0oZyY2NTUzNSk+Pj44O2FbZCsxMj4+MF09ZzthW2QrMTQ+PjBdPWc+Pj4xNjthW2QrMTU+PjBdPWc+Pj4yNDtoPWNbaCsxNj4+Ml18MDthW2QrMTY+PjBdPWg7YVtkKzE3Pj4wXT0oaCY2NTUzNSk+Pj44O2FbZCsxOT4+MF09aD4+PjI0O2FbZCsxOD4+MF09aD4+PjE2O2g9a2QoZis0Nzg0fDAsYil8MDtnPUk7YVtkKzIzPj4wXT1oPj4+MjQ7YVtkKzIyPj4wXT1oPj4+MTY7YVtkKzIxPj4wXT1oPj4+ODthW2QrMjA+PjBdPWg7aj1LbihofDAsZ3wwLDU2KXwwO2FbZCsyNz4+MF09ajtqPUtuKGh8MCxnfDAsNDgpfDA7YVtkKzI2Pj4wXT1qO2g9S24oaHwwLGd8MCw0MCl8MDthW2QrMjU+PjBdPWg7YVtkKzI0Pj4wXT1nO2Q9Zis1MTEyfDA7aWYoKGFbZD4+MF18MCk9PTApe2k9ZTtyZXR1cm59aj0oKG1kKGNbYj4+Ml18MCl8MCkmMjU1KTw8MjQ7aj0oKG1kKGNbYj4+Ml18MCl8MCkmMjU1KTw8MTZ8ajtqPWp8KChtZChjW2I+PjJdfDApfDApJjI1NSk8PDg7Y1tiKzQ+PjJdPWp8KG1kKGNbYj4+Ml18MCl8MCkmMjU1O2FbZD4+MF09MDtpPWU7cmV0dXJufWZ1bmN0aW9uIEpkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2NbYT4+Ml09MjY2NDthPWNbYSs4Pj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufV9jKGErNTA5NnwwKTtfYyhhKzUwNjR8MCk7WmMoYSs0OTQ4fDApOyRjKGErNDc4NHwwKTtYYyhhKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEtkKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2I9aTtjW2E+PjJdPTI2NjQ7ZD1jW2ErOD4+Ml18MDtpZigoZHwwKT09MCl7dm4oYSk7aT1iO3JldHVybn1fYyhkKzUwOTZ8MCk7X2MoZCs1MDY0fDApO1pjKGQrNDk0OHwwKTskYyhkKzQ3ODR8MCk7WGMoZCk7dm4oZCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBMZChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gTWQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gTmQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7YT1jW2ErMTI+PjJdfDA7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59bGNbY1soY1thPj4yXXwwKSs4Pj4yXSYyNTVdKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gT2QoYSxiKXthPWF8MDtiPWJ8MDtpZigoY1tiKzQ+PjJdfDApPT0zMzIwKXthPWErMTJ8MH1lbHNle2E9MH1yZXR1cm4gYXwwfWZ1bmN0aW9uIFBkKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFFkKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MDtlPWk7aT1pKzMyfDA7Zz1lO2Y9Y1tiKzg+PjJdfDA7Yj1jW2IrND4+Ml18MDtqZChnLGYsYik7aD1jW2c+PjJdfDA7YVtkKzM+PjBdPWg+Pj4yNDthW2QrMj4+MF09aD4+PjE2O2FbZCsxPj4wXT1oPj4+ODthW2Q+PjBdPWg7aD1jW2crND4+Ml18MDthW2QrNz4+MF09aD4+PjI0O2FbZCs2Pj4wXT1oPj4+MTY7YVtkKzU+PjBdPWg+Pj44O2FbZCs0Pj4wXT1oO2g9Y1tnKzg+PjJdfDA7YVtkKzExPj4wXT1oPj4+MjQ7YVtkKzEwPj4wXT1oPj4+MTY7YVtkKzk+PjBdPWg+Pj44O2FbZCs4Pj4wXT1oO2g9Y1tnKzEyPj4yXXwwO2FbZCsxMz4+MF09KGgmNjU1MzUpPj4+ODthW2QrMTI+PjBdPWg7YVtkKzE0Pj4wXT1oPj4+MTY7YVtkKzE1Pj4wXT1oPj4+MjQ7Zz1jW2crMTY+PjJdfDA7YVtkKzE2Pj4wXT1nO2FbZCsxNz4+MF09KGcmNjU1MzUpPj4+ODthW2QrMTk+PjBdPWc+Pj4yNDthW2QrMTg+PjBdPWc+Pj4xNjtkPWYrNDc4NHwwO2lmKChhW2Q+PjBdfDApPT0wKXtpPWU7cmV0dXJufWg9KChtZChjW2I+PjJdfDApfDApJjI1NSk8PDI0O2g9KChtZChjW2I+PjJdfDApfDApJjI1NSk8PDE2fGg7aD1ofCgobWQoY1tiPj4yXXwwKXwwKSYyNTUpPDw4O2NbYis0Pj4yXT1ofChtZChjW2I+PjJdfDApfDApJjI1NTthW2Q+PjBdPTA7aT1lO3JldHVybn1mdW5jdGlvbiBSZChhKXthPWF8MDt2YXIgYj0wO2I9aTtjW2E+PjJdPTM2MDg7YT1jW2ErOD4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1YYyhhKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFNkKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2I9aTtjW2E+PjJdPTM2MDg7ZD1jW2ErOD4+Ml18MDtpZigoZHwwKT09MCl7dm4oYSk7aT1iO3JldHVybn1YYyhkKTt2bihkKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFRkKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBVZChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBWZChhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSsxMj4+Ml18MDtpZigoYXwwKT09MCl7aT1iO3JldHVybn1sY1tjWyhjW2E+PjJdfDApKzg+PjJdJjI1NV0oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBXZChhLGIpe2E9YXwwO2I9YnwwO2lmKChjW2IrND4+Ml18MCk9PTQyMTYpe2E9YSsxMnwwfWVsc2V7YT0wfXJldHVybiBhfDB9ZnVuY3Rpb24gWGQoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gWWQoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7Y1tiPj4yXT00NTAwO2NbYis2ND4+Ml09NDU0MDtjW2IrOD4+Ml09NDUyMDtlPWIrMTJ8MDtjW2U+PjJdPTQ2ODg7aWYoISgoYVtiKzQ0Pj4wXSYxKT09MCk/KGY9Y1tiKzUyPj4yXXwwLChmfDApIT0wKTowKXt2bihmKX1jW2U+PjJdPTEwNjY0O2U9Y1tiKzE2Pj4yXXwwO2c9ZSs0fDA7Zj1jW2c+PjJdfDA7Y1tnPj4yXT1mKyAtMTtpZigoZnwwKSE9MCl7Zz1iKzY0fDA7cmcoZyk7aT1kO3JldHVybn1sY1tjWyhjW2U+PjJdfDApKzg+PjJdJjI1NV0oZSk7Zz1iKzY0fDA7cmcoZyk7aT1kO3JldHVybn1mdW5jdGlvbiBaZChiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wO2Q9aTtnPWIrIC04fDA7Y1tnPj4yXT00NTAwO2I9Zys2NHwwO2NbYj4+Ml09NDU0MDtjW2crOD4+Ml09NDUyMDtmPWcrMTJ8MDtjW2Y+PjJdPTQ2ODg7aWYoISgoYVtnKzQ0Pj4wXSYxKT09MCk/KGU9Y1tnKzUyPj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1jW2Y+PjJdPTEwNjY0O2U9Y1tnKzE2Pj4yXXwwO2Y9ZSs0fDA7Zz1jW2Y+PjJdfDA7Y1tmPj4yXT1nKyAtMTtpZigoZ3wwKSE9MCl7cmcoYik7aT1kO3JldHVybn1sY1tjWyhjW2U+PjJdfDApKzg+PjJdJjI1NV0oZSk7cmcoYik7aT1kO3JldHVybn1mdW5jdGlvbiBfZChiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MDtlPWk7Zz1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7Y1tiK2c+PjJdPTQ1MDA7ZD1iKyhnKzY0KXwwO2NbZD4+Ml09NDU0MDtjW2IrKGcrOCk+PjJdPTQ1MjA7Zj1iKyhnKzEyKXwwO2NbZj4+Ml09NDY4ODtpZighKChhW2IrKGcrNDQpPj4wXSYxKT09MCk/KGg9Y1tiKyhnKzUyKT4+Ml18MCwoaHwwKSE9MCk6MCl7dm4oaCl9Y1tmPj4yXT0xMDY2NDtiPWNbYisoZysxNik+PjJdfDA7Zz1iKzR8MDtoPWNbZz4+Ml18MDtjW2c+PjJdPWgrIC0xO2lmKChofDApIT0wKXtyZyhkKTtpPWU7cmV0dXJufWxjW2NbKGNbYj4+Ml18MCkrOD4+Ml0mMjU1XShiKTtyZyhkKTtpPWU7cmV0dXJufWZ1bmN0aW9uICRkKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTA7ZD1pO2NbYj4+Ml09NDUwMDtjW2IrNjQ+PjJdPTQ1NDA7Y1tiKzg+PjJdPTQ1MjA7ZT1iKzEyfDA7Y1tlPj4yXT00Njg4O2lmKCEoKGFbYis0ND4+MF0mMSk9PTApPyhmPWNbYis1Mj4+Ml18MCwoZnwwKSE9MCk6MCl7dm4oZil9Y1tlPj4yXT0xMDY2NDtlPWNbYisxNj4+Ml18MDtnPWUrNHwwO2Y9Y1tnPj4yXXwwO2NbZz4+Ml09ZisgLTE7aWYoKGZ8MCk9PTApe2xjW2NbKGNbZT4+Ml18MCkrOD4+Ml0mMjU1XShlKX1yZyhiKzY0fDApO2lmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gYWUoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7ZD1pO2Y9YisgLTh8MDtjW2Y+PjJdPTQ1MDA7Yj1mKzY0fDA7Y1tiPj4yXT00NTQwO2NbZis4Pj4yXT00NTIwO2c9ZisxMnwwO2NbZz4+Ml09NDY4ODtpZighKChhW2YrNDQ+PjBdJjEpPT0wKT8oZT1jW2YrNTI+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWNbZz4+Ml09MTA2NjQ7ZT1jW2YrMTY+PjJdfDA7aD1lKzR8MDtnPWNbaD4+Ml18MDtjW2g+PjJdPWcrIC0xO2lmKChnfDApIT0wKXtyZyhiKTt2bihmKTtpPWQ7cmV0dXJufWxjW2NbKGNbZT4+Ml18MCkrOD4+Ml0mMjU1XShlKTtyZyhiKTt2bihmKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIGJlKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MDtkPWk7aD1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7Zj1iK2h8MDtjW2Y+PjJdPTQ1MDA7ZT1iKyhoKzY0KXwwO2NbZT4+Ml09NDU0MDtjW2IrKGgrOCk+PjJdPTQ1MjA7Zz1iKyhoKzEyKXwwO2NbZz4+Ml09NDY4ODtpZighKChhW2IrKGgrNDQpPj4wXSYxKT09MCk/KGo9Y1tiKyhoKzUyKT4+Ml18MCwoanwwKSE9MCk6MCl7dm4oail9Y1tnPj4yXT0xMDY2NDtiPWNbYisoaCsxNik+PjJdfDA7aD1iKzR8MDtqPWNbaD4+Ml18MDtjW2g+PjJdPWorIC0xO2lmKChqfDApPT0wKXtsY1tjWyhjW2I+PjJdfDApKzg+PjJdJjI1NV0oYil9cmcoZSk7aWYoKGZ8MCk9PTApe2k9ZDtyZXR1cm59dm4oZik7aT1kO3JldHVybn1mdW5jdGlvbiBjZShiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTA7ZD1pO2NbYj4+Ml09NDY4ODtpZighKChhW2IrMzI+PjBdJjEpPT0wKT8oZT1jW2IrNDA+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWNbYj4+Ml09MTA2NjQ7Yj1jW2IrND4+Ml18MDtmPWIrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe2k9ZDtyZXR1cm59bGNbY1soY1tiPj4yXXwwKSs4Pj4yXSYyNTVdKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZGUoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7Y1tiPj4yXT00Njg4O2lmKCEoKGFbYiszMj4+MF0mMSk9PTApPyhlPWNbYis0MD4+Ml18MCwoZXwwKSE9MCk6MCl7dm4oZSl9Y1tiPj4yXT0xMDY2NDtlPWNbYis0Pj4yXXwwO2c9ZSs0fDA7Zj1jW2c+PjJdfDA7Y1tnPj4yXT1mKyAtMTtpZigoZnwwKT09MCl7bGNbY1soY1tlPj4yXXwwKSs4Pj4yXSYyNTVdKGUpfWlmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZWUoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MDtsPWk7bz1kKzQ0fDA7bT1jW28+PjJdfDA7az1kKzI0fDA7aj1jW2s+PjJdfDA7aWYobT4+PjA8aj4+PjApe2Nbbz4+Ml09ajttPWp9bz1oJjI0O2Rve2lmKChvfDApPT0wKXtvPWI7Y1tvPj4yXT0wO2Nbbys0Pj4yXT0wO289Yis4fDA7Y1tvPj4yXT0tMTtjW28rND4+Ml09LTE7aT1sO3JldHVybn1lbHNlIGlmKChvfDApIT0yNCl7aWYoKGd8MCk9PTIpe249MTE7YnJlYWt9ZWxzZSBpZigoZ3wwKT09MCl7Zz0wO289MDticmVha31lbHNlIGlmKChnfDApIT0xKXtuPTE1O2JyZWFrfWlmKChoJjh8MCk9PTApe289ai0oY1tkKzIwPj4yXXwwKXwwO2c9bztvPSgob3wwKTwwKTw8MzE+PjMxO2JyZWFrfWVsc2V7bz0oY1tkKzEyPj4yXXwwKS0oY1tkKzg+PjJdfDApfDA7Zz1vO289KChvfDApPDApPDwzMT4+MzE7YnJlYWt9fWVsc2V7aWYoKGd8MCk9PTIpe249MTE7YnJlYWt9ZWxzZSBpZigoZ3wwKT09MCl7Zz0wO289MDticmVha31lbHNlIGlmKChnfDApIT0xKXtuPTE1O2JyZWFrfW89YjtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7bz1iKzh8MDtjW28+PjJdPS0xO2Nbbys0Pj4yXT0tMTtpPWw7cmV0dXJufX13aGlsZSgwKTtpZigobnwwKT09MTUpe289YjtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7bz1iKzh8MDtjW28+PjJdPS0xO2Nbbys0Pj4yXT0tMTtpPWw7cmV0dXJufWlmKChufDApPT0xMSl7bj1kKzMyfDA7aWYoKGFbbj4+MF0mMSk9PTApe249bisxfDB9ZWxzZXtuPWNbZCs0MD4+Ml18MH1vPW0tbnwwO2c9bztvPSgob3wwKTwwKTw8MzE+PjMxfWY9SW4oZ3wwLG98MCxlfDAsZnwwKXwwO2U9STtpZigoZXwwKT49MCl7bj1kKzMyfDA7aWYoKGFbbj4+MF0mMSk9PTApe249bisxfDB9ZWxzZXtuPWNbZCs0MD4+Ml18MH1vPW0tbnwwO2c9KChvfDApPDApPDwzMT4+MzE7aWYoISgoZ3wwKTwoZXwwKXwoZ3wwKT09KGV8MCkmbz4+PjA8Zj4+PjApKXtuPWgmODtpZighKChmfDApPT0wJihlfDApPT0wKSl7aWYoKG58MCkhPTA/KGNbZCsxMj4+Ml18MCk9PTA6MCl7bz1iO2Nbbz4+Ml09MDtjW28rND4+Ml09MDtvPWIrOHwwO2Nbbz4+Ml09LTE7Y1tvKzQ+PjJdPS0xO2k9bDtyZXR1cm59aWYoKGgmMTZ8MCkhPTAmKGp8MCk9PTApe289YjtjW28+PjJdPTA7Y1tvKzQ+PjJdPTA7bz1iKzh8MDtjW28+PjJdPS0xO2Nbbys0Pj4yXT0tMTtpPWw7cmV0dXJufX1pZigobnwwKSE9MCl7Y1tkKzEyPj4yXT0oY1tkKzg+PjJdfDApK2Y7Y1tkKzE2Pj4yXT1tfWlmKChoJjE2fDApIT0wKXtjW2s+PjJdPShjW2QrMjA+PjJdfDApK2Z9bz1iO2Nbbz4+Ml09MDtjW28rND4+Ml09MDtvPWIrOHwwO2Nbbz4+Ml09ZjtjW28rND4+Ml09ZTtpPWw7cmV0dXJufX1vPWI7Y1tvPj4yXT0wO2Nbbys0Pj4yXT0wO289Yis4fDA7Y1tvPj4yXT0tMTtjW28rND4+Ml09LTE7aT1sO3JldHVybn1mdW5jdGlvbiBmZShhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wO2Y9aTtkPWQrOHwwO3djW2NbKGNbYj4+Ml18MCkrMTY+PjJdJjYzXShhLGIsY1tkPj4yXXwwLGNbZCs0Pj4yXXwwLDAsZSk7aT1mO3JldHVybn1mdW5jdGlvbiBnZShhKXthPWF8MDt2YXIgYj0wLGU9MCxmPTAsZz0wO2I9aTtmPWErNDR8MDtnPWNbZj4+Ml18MDtlPWNbYSsyND4+Ml18MDtpZihnPj4+MDxlPj4+MCl7Y1tmPj4yXT1lfWVsc2V7ZT1nfWlmKChjW2ErNDg+PjJdJjh8MCk9PTApe2c9LTE7aT1iO3JldHVybiBnfDB9Zj1hKzE2fDA7Zz1jW2Y+PjJdfDA7YT1jW2ErMTI+PjJdfDA7aWYoZz4+PjA8ZT4+PjApe2NbZj4+Ml09ZX1lbHNle2U9Z31pZighKGE+Pj4wPGU+Pj4wKSl7Zz0tMTtpPWI7cmV0dXJuIGd8MH1nPWRbYT4+MF18MDtpPWI7cmV0dXJuIGd8MH1mdW5jdGlvbiBoZShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7ZT1pO2c9Yis0NHwwO2Y9Y1tnPj4yXXwwO2o9Y1tiKzI0Pj4yXXwwO2lmKGY+Pj4wPGo+Pj4wKXtjW2c+PjJdPWp9ZWxzZXtqPWZ9Zj1iKzh8MDtnPWNbZj4+Ml18MDtoPWIrMTJ8MDtsPWNbaD4+Ml18MDtpZighKGc+Pj4wPGw+Pj4wKSl7bD0tMTtpPWU7cmV0dXJuIGx8MH1pZigoZHwwKT09LTEpe2NbZj4+Ml09ZztjW2g+PjJdPWwrIC0xO2NbYisxNj4+Ml09ajtsPTA7aT1lO3JldHVybiBsfDB9aWYoKGNbYis0OD4+Ml0mMTZ8MCk9PTApe2s9ZCYyNTU7bD1sKyAtMXwwO2lmKCEoazw8MjQ+PjI0PT0oYVtsPj4wXXwwKSkpe2w9LTE7aT1lO3JldHVybiBsfDB9fWVsc2V7az1kJjI1NTtsPWwrIC0xfDB9Y1tmPj4yXT1nO2NbaD4+Ml09bDtjW2IrMTY+PjJdPWo7YVtsPj4wXT1rO2w9ZDtpPWU7cmV0dXJuIGx8MH1mdW5jdGlvbiBpZShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7aj1pO2lmKChkfDApPT0tMSl7dT0wO2k9ajtyZXR1cm4gdXwwfWc9YisxMnwwO2U9Yis4fDA7Zj0oY1tnPj4yXXwwKS0oY1tlPj4yXXwwKXwwO2g9YisyNHwwO249Y1toPj4yXXwwO2s9YisyOHwwO209Y1trPj4yXXwwO2lmKChufDApPT0obXwwKSl7bD1iKzQ4fDA7aWYoKGNbbD4+Ml0mMTZ8MCk9PTApe3U9LTE7aT1qO3JldHVybiB1fDB9bT1iKzIwfDA7cD1jW20+PjJdfDA7bj1uLXB8MDtvPWIrNDR8MDtwPShjW28+PjJdfDApLXB8MDtxPWIrMzJ8MDtyPWFbcT4+MF18MDtzPShyJjEpIT0wO2lmKHMpe3Q9KGNbcT4+Ml0mLTIpKyAtMXwwO3I9Y1tiKzM2Pj4yXXwwfWVsc2V7dD0xMDtyPShyJjI1NSk+Pj4xfWlmKChyfDApPT0odHwwKSl7bGcocSx0LDEsdCx0LDApO2lmKChhW3E+PjBdJjEpPT0wKXtzPTEyfWVsc2V7cz0xM319ZWxzZXtpZihzKXtzPTEzfWVsc2V7cz0xMn19aWYoKHN8MCk9PTEyKXthW3E+PjBdPShyPDwxKSsyO3U9cSsxfDA7dD1yKzF8MH1lbHNlIGlmKChzfDApPT0xMyl7dT1jW2IrNDA+PjJdfDA7dD1yKzF8MDtjW2IrMzY+PjJdPXR9YVt1K3I+PjBdPTA7YVt1K3Q+PjBdPTA7dD1hW3E+PjBdfDA7aWYoKHQmMSk9PTApe3I9MTB9ZWxzZXtyPWNbcT4+Ml18MDt0PXImMjU1O3I9KHImLTIpKyAtMXwwfXM9KHQmMSk9PTA7aWYocyl7dD0odCYyNTUpPj4+MX1lbHNle3Q9Y1tiKzM2Pj4yXXwwfWRve2lmKCEodD4+PjA8cj4+PjApKXtpZihzKXthW3ErcisxPj4wXT0wO2FbcT4+MF09cjw8MTticmVha31lbHNle2FbKGNbYis0MD4+Ml18MCkrcj4+MF09MDtjW2IrMzY+PjJdPXI7YnJlYWt9fWVsc2V7aGcocSxyLXR8MCl9fXdoaWxlKDApO3I9YVtxPj4wXXwwO2lmKChyJjEpPT0wKXtxPXErMXwwO3I9KHImMjU1KT4+PjF9ZWxzZXtxPWNbYis0MD4+Ml18MDtyPWNbYiszNj4+Ml18MH10PXErcnwwO2NbbT4+Ml09cTtjW2s+PjJdPXQ7bj1xK258MDtjW2g+PjJdPW47dT1xK3B8MDtjW28+PjJdPXU7az10O289dX1lbHNle2w9Yis0OHwwO2s9bTtvPWNbYis0ND4+Ml18MH1tPW4rMXwwO289bT4+PjA8bz4+PjA/bzptO2NbYis0ND4+Ml09bztpZigoY1tsPj4yXSY4fDApIT0wKXtsPWIrMzJ8MDtpZigoYVtsPj4wXSYxKT09MCl7bD1sKzF8MH1lbHNle2w9Y1tiKzQwPj4yXXwwfWNbZT4+Ml09bDtjW2c+PjJdPWwrZjtjW2IrMTY+PjJdPW99aWYoKG58MCk9PShrfDApKXt1PXhjW2NbKGNbYj4+Ml18MCkrNTI+PjJdJjYzXShiLGQmMjU1KXwwO2k9ajtyZXR1cm4gdXwwfWVsc2V7Y1toPj4yXT1tO2Fbbj4+MF09ZDt1PWQmMjU1O2k9ajtyZXR1cm4gdXwwfXJldHVybiAwfWZ1bmN0aW9uIGplKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBrZShhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBsZShhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSsxMj4+Ml18MDtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBtZShhLGIpe2E9YXwwO2I9YnwwO2lmKChjW2IrND4+Ml18MCk9PTUwNDgpe2E9YSsxMnwwfWVsc2V7YT0wfXJldHVybiBhfDB9ZnVuY3Rpb24gbmUoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gb2UoYil7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGo9MCxsPTAsbT0wLG49MCxvPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsSj0wLjAsSz0wLjAsTD0wLjAsTT0wLjAsTj0wLjAsTz0wLjA7ZT1pO2k9aSsyNTZ8MDtmPWUrODB8MDtvPWU7bj1lKzEwNHwwO209ZSsyMjR8MDtqPWUrMjA4fDA7Zz1lKzEyOHwwO3g9ZSsyNDB8MDt2PWUrMTEyfDA7cz1lKzU2fDA7ej1jW2I+PjJdfDA7eT16KzEzfDA7aWYoKGFbeT4+MF18MCk9PTApe0g9eis0fDA7RT16Kzh8MDtHPWNbRT4+Ml18MDtGPShjW0g+PjJdfDApLUd8MDtGPShGfDApPDQ/Rjo0O01uKHh8MCwoY1t6Pj4yXXwwKStHfDAsRnwwKXwwO0c9KGNbRT4+Ml18MCkrRnwwO2NbRT4+Ml09RztjW3orMTY+PjJdPUY7aWYoKEd8MCk+PShjW0g+PjJdfDApKXthW3k+PjBdPTF9fWVsc2V7YVt6KzEyPj4wXT0xfWFbdj4+MF09ODtCPXYrMXwwO2FbQj4+MF09YVt4Pj4wXXwwO2FbdisyPj4wXT1hW3grMT4+MF18MDthW3YrMz4+MF09YVt4KzI+PjBdfDA7eT12KzR8MDthW3k+PjBdPWFbeCszPj4wXXwwO2FbdisoeCsoNC14KSkrMT4+MF09MDt6PWFbdj4+MF18MDt4PSh6JjEpPT0wO2lmKHgpe3k9KHomMjU1KT4+PjF9ZWxzZXtCPWNbdis4Pj4yXXwwO3k9Y1t5Pj4yXXwwfXo9eT4+PjA+NDtBPXo/NDp5O2E6ZG97aWYoKEF8MCkhPTApe0M9NTIzMjt3aGlsZSgxKXtEPWFbQj4+MF18MDtFPWFbQz4+MF18MDtpZighKEQ8PDI0Pj4yND09RTw8MjQ+PjI0KSl7YnJlYWt9QT1BKyAtMXwwO2lmKChBfDApPT0wKXtsPTEyO2JyZWFrIGF9ZWxzZXtCPUIrMXwwO0M9QysxfDB9fWlmKCEoRDw8MjQ+PjI0PT1FPDwyND4+MjQpKXt5PShEJjI1NSktKEUmMjU1KXwwfWVsc2V7bD0xMn19ZWxzZXtsPTEyfX13aGlsZSgwKTtpZigobHwwKT09MTIpe3k9eT4+PjA8ND8tMTp6JjF9eT0oeXwwKT09MDtpZigheD8odz1jW3YrOD4+Ml18MCwod3wwKSE9MCk6MCl7dm4odyl9aWYoIXkpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11bigzNil8MDtpZigoYnwwKSE9MCl7bD0yMzticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MjMpe2NbYis0Pj4yXT0yMztjW2I+PjJdPTIzO2Y9YisxMnwwO2NbZys0Pj4yXT1mO2NbYis4Pj4yXT0wO2Y9ZiswfDA7Yj03MDU2fDA7ZT1mKzI0fDA7ZG97YVtmPj4wXT1hW2I+PjBdfDA7Zj1mKzF8MDtiPWIrMXwwfXdoaWxlKChmfDApPChlfDApKTtjW2c+PjJdPTcwODg7d2IoZ3wwLDUyNzIsODYpfUg9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfXY9U2MoODM1Miw1Mjg4KXwwO3c9Y1t2KygoY1soY1t2Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7eD13KzR8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9ej0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7eT1jW3crOD4+Ml18MDtpZigoY1t3KzEyPj4yXXwwKS15Pj4yPj4+MD56Pj4+MD8odT1jW3krKHo8PDIpPj4yXXwwLCh1fDApIT0wKTowKXt1PXhjW2NbKGNbdT4+Ml18MCkrMjg+PjJdJjYzXSh1LDEwKXwwO0g9Y1t4Pj4yXXwwO2NbeD4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbdz4+Ml18MCkrOD4+Ml0mMjU1XSh3KX1saCh2LHUpO1lnKHYpO3U9Y1tiPj4yXXwwO2lmKChjW3UrND4+Ml18MCk+MCl7Y1t1Kzg+PjJdPTB9ZWxzZXthW3UrMTI+PjBdPTF9dj1jW2I+PjJdfDA7dT1iKzIwfDA7dz12KzEzfDA7aWYoKGFbdz4+MF18MCk9PTApe0g9dis0fDA7RT12Kzh8MDtHPWNbRT4+Ml18MDtGPShjW0g+PjJdfDApLUd8MDtGPShGfDApPDIyNz9GOjIyNztNbih1fDAsKGNbdj4+Ml18MCkrR3wwLEZ8MCl8MDtHPShjW0U+PjJdfDApK0Z8MDtjW0U+PjJdPUc7Y1t2KzE2Pj4yXT1GO2lmKChHfDApPj0oY1tIPj4yXXwwKSl7YVt3Pj4wXT0xfX1lbHNle2FbdisxMj4+MF09MX1DPWIrMTk5fDA7YVtrPj4wXT1hW0M+PjBdO2FbaysxPj4wXT1hW0MrMT4+MF07YVtrKzI+PjBdPWFbQysyPj4wXTthW2srMz4+MF09YVtDKzM+PjBdO2Fbays0Pj4wXT1hW0MrND4+MF07YVtrKzU+PjBdPWFbQys1Pj4wXTthW2srNj4+MF09YVtDKzY+PjBdO2Fbays3Pj4wXT1hW0MrNz4+MF07Tj0raFtrPj4zXTtFPWIrMjA3fDA7YVtrPj4wXT1hW0U+PjBdO2FbaysxPj4wXT1hW0UrMT4+MF07YVtrKzI+PjBdPWFbRSsyPj4wXTthW2srMz4+MF09YVtFKzM+PjBdO2Fbays0Pj4wXT1hW0UrND4+MF07YVtrKzU+PjBdPWFbRSs1Pj4wXTthW2srNj4+MF09YVtFKzY+PjBdO2Fbays3Pj4wXT1hW0UrNz4+MF07Tz0raFtrPj4zXTtHPWIrMjE1fDA7YVtrPj4wXT1hW0c+PjBdO2FbaysxPj4wXT1hW0crMT4+MF07YVtrKzI+PjBdPWFbRysyPj4wXTthW2srMz4+MF09YVtHKzM+PjBdO2Fbays0Pj4wXT1hW0crND4+MF07YVtrKzU+PjBdPWFbRys1Pj4wXTthW2srNj4+MF09YVtHKzY+PjBdO2Fbays3Pj4wXT1hW0crNz4+MF07TD0raFtrPj4zXTtEPWIrMjIzfDA7YVtrPj4wXT1hW0Q+PjBdO2FbaysxPj4wXT1hW0QrMT4+MF07YVtrKzI+PjBdPWFbRCsyPj4wXTthW2srMz4+MF09YVtEKzM+PjBdO2Fbays0Pj4wXT1hW0QrND4+MF07YVtrKzU+PjBdPWFbRCs1Pj4wXTthW2srNj4+MF09YVtEKzY+PjBdO2Fbays3Pj4wXT1hW0QrNz4+MF07TT0raFtrPj4zXTtGPWIrMjMxfDA7YVtrPj4wXT1hW0Y+PjBdO2FbaysxPj4wXT1hW0YrMT4+MF07YVtrKzI+PjBdPWFbRisyPj4wXTthW2srMz4+MF09YVtGKzM+PjBdO2Fbays0Pj4wXT1hW0YrND4+MF07YVtrKzU+PjBdPWFbRis1Pj4wXTthW2srNj4+MF09YVtGKzY+PjBdO2Fbays3Pj4wXT1hW0YrNz4+MF07Sj0raFtrPj4zXTtIPWIrMjM5fDA7YVtrPj4wXT1hW0g+PjBdO2FbaysxPj4wXT1hW0grMT4+MF07YVtrKzI+PjBdPWFbSCsyPj4wXTthW2srMz4+MF09YVtIKzM+PjBdO2Fbays0Pj4wXT1hW0grND4+MF07YVtrKzU+PjBdPWFbSCs1Pj4wXTthW2srNj4+MF09YVtIKzY+PjBdO2Fbays3Pj4wXT1hW0grNz4+MF07Sz0raFtrPj4zXTtoW2s+PjNdPU87YVtDPj4wXT1hW2s+PjBdO2FbQysxPj4wXT1hW2srMT4+MF07YVtDKzI+PjBdPWFbaysyPj4wXTthW0MrMz4+MF09YVtrKzM+PjBdO2FbQys0Pj4wXT1hW2srND4+MF07YVtDKzU+PjBdPWFbays1Pj4wXTthW0MrNj4+MF09YVtrKzY+PjBdO2FbQys3Pj4wXT1hW2srNz4+MF07aFtrPj4zXT1OO2FbRD4+MF09YVtrPj4wXTthW0QrMT4+MF09YVtrKzE+PjBdO2FbRCsyPj4wXT1hW2srMj4+MF07YVtEKzM+PjBdPWFbayszPj4wXTthW0QrND4+MF09YVtrKzQ+PjBdO2FbRCs1Pj4wXT1hW2srNT4+MF07YVtEKzY+PjBdPWFbays2Pj4wXTthW0QrNz4+MF09YVtrKzc+PjBdO2hbaz4+M109TTthW0U+PjBdPWFbaz4+MF07YVtFKzE+PjBdPWFbaysxPj4wXTthW0UrMj4+MF09YVtrKzI+PjBdO2FbRSszPj4wXT1hW2srMz4+MF07YVtFKzQ+PjBdPWFbays0Pj4wXTthW0UrNT4+MF09YVtrKzU+PjBdO2FbRSs2Pj4wXT1hW2srNj4+MF07YVtFKzc+PjBdPWFbays3Pj4wXTtoW2s+PjNdPUw7YVtGPj4wXT1hW2s+PjBdO2FbRisxPj4wXT1hW2srMT4+MF07YVtGKzI+PjBdPWFbaysyPj4wXTthW0YrMz4+MF09YVtrKzM+PjBdO2FbRis0Pj4wXT1hW2srND4+MF07YVtGKzU+PjBdPWFbays1Pj4wXTthW0YrNj4+MF09YVtrKzY+PjBdO2FbRis3Pj4wXT1hW2srNz4+MF07aFtrPj4zXT1LO2FbRz4+MF09YVtrPj4wXTthW0crMT4+MF09YVtrKzE+PjBdO2FbRysyPj4wXT1hW2srMj4+MF07YVtHKzM+PjBdPWFbayszPj4wXTthW0crND4+MF09YVtrKzQ+PjBdO2FbRys1Pj4wXT1hW2srNT4+MF07YVtHKzY+PjBdPWFbays2Pj4wXTthW0crNz4+MF09YVtrKzc+PjBdO2hbaz4+M109SjthW0g+PjBdPWFbaz4+MF07YVtIKzE+PjBdPWFbaysxPj4wXTthW0grMj4+MF09YVtrKzI+PjBdO2FbSCszPj4wXT1hW2srMz4+MF07YVtIKzQ+PjBdPWFbays0Pj4wXTthW0grNT4+MF09YVtrKzU+PjBdO2FbSCs2Pj4wXT1hW2srNj4+MF07YVtIKzc+PjBdPWFbays3Pj4wXTtpZigoYVs2MzY4XXwwKT09MD8oUWEoNjM2OCl8MCkhPTA6MCl7Y1sxNTg4XT0wO2NbNjM1Nj4+Ml09MDtjWzYzNjA+PjJdPTA7Y2MoMjA5LDYzNTIscHwwKXwwOyRhKDYzNjgpfWlmKChhWzY0MDBdfDApPT0wPyhRYSg2NDAwKXwwKSE9MDowKXtjYygyMTAsNjM3NixwfDApfDA7JGEoNjQwMCl9dz1jWzE1ODhdfDA7dj1jWzYzNTY+PjJdfDA7ZG97aWYoKHd8MCk9PSh2fDApKXt2PSRiKDYzNzYpfDA7aWYoKHZ8MCkhPTApe2I9WGEoMTYpfDA7ZG97aWYoKGFbMTAxMjBdfDApPT0wKXtpZigoUWEoMTAxMjApfDApPT0wKXticmVha31jWzI1MjhdPTEwMzg0OyRhKDEwMTIwKX19d2hpbGUoMCk7WWYoYix2LDEwMTEyLDEwNDcyKTt3YihifDAsMTAxODQsMTA5KX14PWNbMTU4OF18MDtkb3tpZigoeHwwKT09KGNbNjM1Nj4+Ml18MCkpe3Y9ZisxNnwwO2Nbdj4+Ml09ZjtjW2Y+PjJdPTY0MTY7dz1jWzYzNjA+PjJdfDA7ZG97aWYoeD4+PjA8dz4+PjApe2lmKCh4fDApPT0wKXt3PTB9ZWxzZXtjW3grMTY+PjJdPXg7dz1jW3Y+PjJdfDA7bWNbY1soY1t3Pj4yXXwwKSsxMj4+Ml0mMTI3XSh3LHgpO3c9Y1s2MzU2Pj4yXXwwfWNbNjM1Nj4+Ml09dysyNH1lbHNle3c9KHcteHwwKS8yNHwwO2lmKHc+Pj4wPDg5NDc4NDg1KXt3PXc8PDE7dz0od3wwKT09MD8xOnd9ZWxzZXt3PTE3ODk1Njk3MH14PXcqMjR8MDt4PSh4fDApPT0wPzE6eDt3aGlsZSgxKXt5PXVuKHgpfDA7aWYoKHl8MCkhPTApe2JyZWFrfXk9Y1s1NjY2XXwwO2NbNTY2Nl09eSswO2lmKCh5fDApPT0wKXtsPTY1O2JyZWFrfXNjW3kmMzFdKCl9aWYoKGx8MCk9PTY1KXtIPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX13PXkrKHcqMjR8MCl8MDtkb3tpZigoeXwwKSE9MCl7eD1jW3Y+PjJdfDA7aWYoKHh8MCk9PTApe2NbeSsxNj4+Ml09MDticmVha31pZigoeHwwKT09KGZ8MCkpe2NbeSsxNj4+Ml09eTttY1tjWyhjW2Y+PjJdfDApKzEyPj4yXSYxMjddKGYseSk7YnJlYWt9ZWxzZXtjW3krMTY+PjJdPXg7Y1t2Pj4yXT0wO2JyZWFrfX19d2hpbGUoMCk7eD15KzI0fDA7ej1jWzE1ODhdfDA7QT1jWzYzNTY+PjJdfDA7ZG97aWYoKEF8MCk9PSh6fDApKXtjWzE1ODhdPXk7Y1s2MzU2Pj4yXT14O2NbNjM2MD4+Ml09d31lbHNle2Rve0M9eTt5PXkrIC0yNHwwO0I9QSsgLTh8MDtBPUErIC0yNHwwO0Q9Y1tCPj4yXXwwO2Rve2lmKChEfDApIT0wKXtpZigoRHwwKT09KEF8MCkpe2NbQysgLTg+PjJdPXk7SD1jW0I+PjJdfDA7bWNbY1soY1tIPj4yXXwwKSsxMj4+Ml0mMTI3XShILHkpO2JyZWFrfWVsc2V7Y1tDKyAtOD4+Ml09RDtjW0I+PjJdPTA7YnJlYWt9fWVsc2V7Y1tDKyAtOD4+Ml09MH19d2hpbGUoMCl9d2hpbGUoKEF8MCkhPSh6fDApKTt6PWNbMTU4OF18MDtBPWNbNjM1Nj4+Ml18MDtjWzE1ODhdPXk7Y1s2MzU2Pj4yXT14O2NbNjM2MD4+Ml09dztpZigoQXwwKT09KHp8MCkpe2JyZWFrfWRve3c9Y1tBKyAtOD4+Ml18MDtBPUErIC0yNHwwO2Rve2lmKCh3fDApPT0oQXwwKSl7bGNbY1soY1t3Pj4yXXwwKSsxNj4+Ml0mMjU1XSh3KX1lbHNle2lmKCh3fDApPT0wKXticmVha31sY1tjWyhjW3c+PjJdfDApKzIwPj4yXSYyNTVdKHcpfX13aGlsZSgwKX13aGlsZSgoQXwwKSE9KHp8MCkpfX13aGlsZSgwKTtpZigoenwwKT09MCl7YnJlYWt9dm4oeil9fXdoaWxlKDApO3Y9Y1t2Pj4yXXwwO2lmKCh2fDApPT0oZnwwKSl7bGNbY1soY1tmPj4yXXwwKSsxNj4+Ml0mMjU1XShmKTticmVha31pZigodnwwKT09MCl7YnJlYWt9bGNbY1soY1t2Pj4yXXwwKSsyMD4+Ml0mMjU1XSh2KX19d2hpbGUoMCk7aWYoKENiKDYzNzYpfDApPT0wKXt0PWNbMTU4OF18MDtyPWNbNjM1Nj4+Ml18MDticmVha31XYSgxMDQ5NiwxMDUwNCw0NiwxMDU2MCl9ZWxzZXt0PXc7cj12fX13aGlsZSgwKTtiOmRve2lmKCh0fDApIT0ocnwwKSl7dj1zKzE2fDA7d2hpbGUoMSl7eD10KzE2fDA7dz1jW3g+PjJdfDA7aWYoKHd8MCk9PTApe2w9MTAxO2JyZWFrfWlmKCh3fDApPT0odHwwKSl7Y1t2Pj4yXT1zO3c9Y1t4Pj4yXXwwO21jW2NbKGNbdz4+Ml18MCkrMTI+PjJdJjEyN10odyxzKTt3PWNbdj4+Ml18MH1lbHNle3c9b2NbY1soY1t3Pj4yXXwwKSs4Pj4yXSYxMjddKHcpfDA7Y1t2Pj4yXT13fWlmKCh3fDApPT0wKXticmVha31tY1tjWyhjW3c+PjJdfDApKzI0Pj4yXSYxMjddKHcsdSk7dz1jW3Y+PjJdfDA7ZG97aWYoKHd8MCk9PShzfDApKXtsY1tjWyhjW3M+PjJdfDApKzE2Pj4yXSYyNTVdKHMpfWVsc2V7aWYoKHd8MCk9PTApe2JyZWFrfWxjW2NbKGNbdz4+Ml18MCkrMjA+PjJdJjI1NV0odyl9fXdoaWxlKDApO3Q9dCsyNHwwO2lmKCh0fDApPT0ocnwwKSl7YnJlYWsgYn19aWYoKGx8MCk9PTEwMSl7Y1t2Pj4yXT0wfUg9WGEoNCl8MDtjW0g+PjJdPTYzMzY7d2IoSHwwLDYzMTIsNzYpfX13aGlsZSgwKTtzPVNjKDgzNTIsNTMwNCl8MDtyPWNbcysoKGNbKGNbcz4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO3Q9cis0fDA7Y1t0Pj4yXT0oY1t0Pj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tmPj4yXT0xMzQ1NjtjW2YrND4+Ml09MjA4O2NbZis4Pj4yXT0wO2NnKDEzNDU2LGYpfXU9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3Y9Y1tyKzg+PjJdfDA7aWYoKGNbcisxMj4+Ml18MCktdj4+Mj4+PjA+dT4+PjA/KHE9Y1t2Kyh1PDwyKT4+Ml18MCwocXwwKSE9MCk6MCl7cT14Y1tjWyhjW3E+PjJdfDApKzI4Pj4yXSY2M10ocSwxMCl8MDtIPWNbdD4+Ml18MDtjW3Q+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW3I+PjJdfDApKzg+PjJdJjI1NV0ocil9bGgocyxxKTtZZyhzKTtyPWNbYj4+Ml18MDtxPWIrMTE0fDA7cT1kW3E+PjBdfGRbcSsxPj4wXTw8ODtIPWNbcis0Pj4yXXwwO0c9KChIfDApPDApPDwzMT4+MzE7aWYoMDwoR3wwKXwwPT0oR3wwKSYocSY2NTUzNSk+Pj4wPEg+Pj4wKXtjW3IrOD4+Ml09cSY2NTUzNX1lbHNle2FbcisxMj4+MF09MX1yPWIrMTIwfDA7Yzpkb3tpZigoZFtyPj4wXXxkW3IrMT4+MF08PDh8ZFtyKzI+PjBdPDwxNnxkW3IrMz4+MF08PDI0fDApIT0wKXt3PW8rMnwwO3U9bysxNnwwO3Q9bysxOHwwO3E9bysyMHwwO3g9Zis0fDA7dj1mKzh8MDtzPTA7d2hpbGUoMSl7Rz0oY1tiPj4yXXwwKSsxMnwwO0g9YVtHPj4wXXwwO2FbRz4+MF09MDtpZighKEg8PDI0Pj4yND09MCkpe2JyZWFrIGN9eT1jW2I+PjJdfDA7ej15KzEzfDA7aWYoKGFbej4+MF18MCkhPTApe2JyZWFrIGN9SD15KzR8MDtFPXkrOHwwO0c9Y1tFPj4yXXwwO0Y9KGNbSD4+Ml18MCktR3wwO0Y9KEZ8MCk8NTQ/Rjo1NDtNbihvfDAsKGNbeT4+Ml18MCkrR3wwLEZ8MCl8MDtHPShjW0U+PjJdfDApK0Z8MDtjW0U+PjJdPUc7Y1t5KzE2Pj4yXT1GO2lmKChHfDApPj0oY1tIPj4yXXwwKSl7YVt6Pj4wXT0xfXk9U2MoODM1Miw1ODcyKXwwO3o9Y1t5KygoY1soY1t5Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7QT16KzR8MDtjW0E+PjJdPShjW0E+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbeD4+Ml09MjA4O2Nbdj4+Ml09MDtjZygxMzQ1NixmKX1DPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtCPWNbeis4Pj4yXXwwO2lmKCEoKGNbeisxMj4+Ml18MCktQj4+Mj4+PjA+Qz4+PjApKXtsPTEzNjticmVha31CPWNbQisoQzw8Mik+PjJdfDA7aWYoKEJ8MCk9PTApe2w9MTM2O2JyZWFrfUI9eGNbY1soY1tCPj4yXXwwKSsyOD4+Ml0mNjNdKEIsMTApfDA7SD1jW0E+PjJdfDA7Y1tBPj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1t6Pj4yXXwwKSs4Pj4yXSYyNTVdKHopfWxoKHksQik7WWcoeSk7eT13O3o9NTg1Njt3aGlsZSgxKXtpZigoYVt5Pj4wXXwwKSE9KGFbej4+MF18MCkpe2JyZWFrfXk9eSsxfDA7aWYoKHl8MCk9PSh1fDApKXtsPTE0NDticmVha31lbHNle3o9eisxfDB9fWlmKChsfDApPT0xNDQ/KGw9MCwoZFt0Pj4wXXxkW3QrMT4+MF08PDgpPDwxNj4+MTY9PTIyMjA0KTowKXticmVha31BPWNbYj4+Ml18MDt5PUErOHwwO3o9Y1t5Pj4yXXwwO3o9SW4oenwwLCgoenwwKTwwKTw8MzE+PjMxfDAsKGRbcT4+MF18ZFtxKzE+PjBdPDw4KSY2NTUzNXwwLDApfDA7SD1JO0c9Y1tBKzQ+PjJdfDA7Rj0oKEd8MCk8MCk8PDMxPj4zMTtBPUErMTJ8MDtpZigoSHwwKT4oRnwwKXwoSHwwKT09KEZ8MCkmej4+PjA+PUc+Pj4wfChIfDApPDApe2FbQT4+MF09MX1lbHNle2FbQT4+MF09MDtjW3k+PjJdPXp9cz1zKzF8MDtpZighKHM+Pj4wPChkW3I+PjBdfGRbcisxPj4wXTw8OHxkW3IrMj4+MF08PDE2fGRbciszPj4wXTw8MjQpPj4+MCkpe2JyZWFrIGN9fWlmKChsfDApPT0xMzYpe0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfXI9U2MoODM1Miw1ODk2KXwwO3M9Y1tyKygoY1soY1tyPj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dD1zKzR8MDtjW3Q+PjJdPShjW3Q+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9dT0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7dj1jW3MrOD4+Ml18MDtkb3tpZigoY1tzKzEyPj4yXXwwKS12Pj4yPj4+MD51Pj4+MCl7dT1jW3YrKHU8PDIpPj4yXXwwO2lmKCh1fDApPT0wKXticmVha311PXhjW2NbKGNbdT4+Ml18MCkrMjg+PjJdJjYzXSh1LDEwKXwwO0g9Y1t0Pj4yXXwwO2NbdD4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbcz4+Ml18MCkrOD4+Ml0mMjU1XShzKX1saChyLHUpO1lnKHIpO3I9ZFtxPj4wXXxkW3ErMT4+MF08PDg7cT1yJjY1NTM1O3I9cjw8MTY+PjE2PT0wPzE6cTt3aGlsZSgxKXtzPXVuKHIpfDA7aWYoKHN8MCkhPTApe2JyZWFrfXM9Y1s1NjY2XXwwO2NbNTY2Nl09cyswO2lmKChzfDApPT0wKXtsPTE1ODticmVha31zY1tzJjMxXSgpfWlmKChsfDApPT0xNTgpe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfXQ9Y1tiPj4yXXwwO3I9dCsxM3wwO2Rve2lmKChhW3I+PjBdfDApPT0wKXtIPXQrNHwwO0U9dCs4fDA7Rz1jW0U+PjJdfDA7Rj0oY1tIPj4yXXwwKS1HfDA7Rj0oRnwwKTwocXwwKT9GOnE7TW4oc3wwLChjW3Q+PjJdfDApK0d8MCxGfDApfDA7Rz0oY1tFPj4yXXwwKStGfDA7Y1tFPj4yXT1HO2NbdCsxNj4+Ml09RjtpZigoR3wwKTwoY1tIPj4yXXwwKSl7YnJlYWt9YVtyPj4wXT0xfWVsc2V7YVt0KzEyPj4wXT0xfX13aGlsZSgwKTt0PXMrMzR8MDtxPWIrMjQ3fDA7TW4ocXwwLHN8MCwzNCl8MDtpZighKChkW3E+PjBdfGRbcSsxPj4wXTw8OCk8PDE2Pj4xNj09Mikpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11big2OCl8MDtpZigoYnwwKSE9MCl7bD0xNzE7YnJlYWt9Yj1jWzU2NjZdfDA7Y1s1NjY2XT1iKzA7aWYoKGJ8MCk9PTApe2JyZWFrfXNjW2ImMzFdKCl9aWYoKGx8MCk9PTE3MSl7Y1tiKzQ+PjJdPTU1O2NbYj4+Ml09NTU7Zj1iKzEyfDA7Y1tnKzQ+PjJdPWY7Y1tiKzg+PjJdPTA7Zj1mKzB8MDtiPTYyMDB8MDtlPWYrNTZ8MDtkb3thW2Y+PjBdPWFbYj4+MF18MDtmPWYrMXwwO2I9YisxfDB9d2hpbGUoKGZ8MCk8KGV8MCkpO2NbZz4+Ml09NjI2NDt3YihnfDAsNjA5Niw3NCl9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9cj1TYyg4MzUyLDYxMTIpfDA7cT1oaChyLGRbcT4+MF18ZFtxKzE+PjBdPDw4KXwwO3I9Y1txKygoY1soY1txPj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dT1yKzR8MDtjW3U+PjJdPShjW3U+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9dj0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7dz1jW3IrOD4+Ml18MDtkb3tpZigoY1tyKzEyPj4yXXwwKS13Pj4yPj4+MD52Pj4+MCl7dj1jW3crKHY8PDIpPj4yXXwwO2lmKCh2fDApPT0wKXticmVha312PXhjW2NbKGNbdj4+Ml18MCkrMjg+PjJdJjYzXSh2LDEwKXwwO0g9Y1t1Pj4yXXwwO2NbdT4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbcj4+Ml18MCkrOD4+Ml0mMjU1XShyKX1saChxLHYpO1lnKHEpO3Y9U2MoODM1Miw2MTI4KXwwO3E9YisyNzl8MDt2PWhoKHYsZFtxPj4wXXxkW3ErMT4+MF08PDgpfDA7cj1jW3YrKChjWyhjW3Y+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDt1PXIrNHwwO2NbdT4+Ml09KGNbdT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tmKzQ+PjJdPTIwODtjW2YrOD4+Ml09MDtjZygxMzQ1NixmKX13PShjWzEzNDYwPj4yXXwwKSsgLTF8MDt4PWNbcis4Pj4yXXwwO2Rve2lmKChjW3IrMTI+PjJdfDApLXg+PjI+Pj4wPnc+Pj4wKXt3PWNbeCsodzw8Mik+PjJdfDA7aWYoKHd8MCk9PTApe2JyZWFrfXc9eGNbY1soY1t3Pj4yXXwwKSsyOD4+Ml0mNjNdKHcsMTApfDA7SD1jW3U+PjJdfDA7Y1t1Pj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1tyPj4yXXwwKSs4Pj4yXSYyNTVdKHIpfWxoKHYsdyk7WWcodik7cj0oKGRbcT4+MF18ZFtxKzE+PjBdPDw4KSY2NTUzNSkqNnwwO3I9KHJ8MCk9PTA/MTpyO3doaWxlKDEpe3U9dW4ocil8MDtpZigodXwwKSE9MCl7YnJlYWt9dT1jWzU2NjZdfDA7Y1s1NjY2XT11KzA7aWYoKHV8MCk9PTApe2w9MTk0O2JyZWFrfXNjW3UmMzFdKCl9aWYoKGx8MCk9PTE5NCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9cj1iKzI4MXwwO2Fbcj4+MF09dTthW3IrMT4+MF09dT4+ODthW3IrMj4+MF09dT4+MTY7YVtyKzM+PjBdPXU+PjI0O3U9U2MoODM1Miw2MTQ0KXwwO3Y9Y1t1KygoY1soY1t1Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dz12KzR8MDtjW3c+PjJdPShjW3c+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9eD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7eT1jW3YrOD4+Ml18MDtkb3tpZigoY1t2KzEyPj4yXXwwKS15Pj4yPj4+MD54Pj4+MCl7eD1jW3krKHg8PDIpPj4yXXwwO2lmKCh4fDApPT0wKXticmVha314PXhjW2NbKGNbeD4+Ml18MCkrMjg+PjJdJjYzXSh4LDEwKXwwO0g9Y1t3Pj4yXXwwO2Nbdz4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbdj4+Ml18MCkrOD4+Ml0mMjU1XSh2KX1saCh1LHgpO1lnKHUpO2Q6ZG97aWYoISgoZFtxPj4wXXxkW3ErMT4+MF08PDgpPDwxNj4+MTY9PTApKXt2PWYrNHwwO3U9Zis4fDA7dz0wO3doaWxlKDEpe01uKChkW3I+PjBdfGRbcisxPj4wXTw8OHxkW3IrMj4+MF08PDE2fGRbciszPj4wXTw8MjQpKyh3KjZ8MCl8MCx0fDAsNil8MDt6PWloKFNjKDgzNTIsNjE3Nil8MCx3KXwwO3k9Y1t6KygoY1soY1t6Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7eD15KzR8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2Nbdj4+Ml09MjA4O2NbdT4+Ml09MDtjZygxMzQ1NixmKX1BPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtCPWNbeSs4Pj4yXXwwO2lmKCEoKGNbeSsxMj4+Ml18MCktQj4+Mj4+PjA+QT4+PjApKXticmVha31BPWNbQisoQTw8Mik+PjJdfDA7aWYoKEF8MCk9PTApe2JyZWFrfUE9eGNbY1soY1tBPj4yXXwwKSsyOD4+Ml0mNjNdKEEsMTApfDA7SD1jW3g+PjJdfDA7Y1t4Pj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1t5Pj4yXXwwKSs4Pj4yXSYyNTVdKHkpfWxoKHosQSk7WWcoeik7dz13KzF8MDtpZigod3wwKT49KChkW3E+PjBdfGRbcSsxPj4wXTw8OCkmNjU1MzV8MCkpe2JyZWFrIGR9ZWxzZXt0PXQrNnwwfX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7dm4ocyk7ZTpkb3tpZighKChkW3E+PjBdfGRbcSsxPj4wXTw8OCk8PDE2Pj4xNj09MCkpe3c9YiszMDR8MDt2PWIrMzA4fDA7eD1iKzMwMHwwO3U9Zis0fDA7dD1mKzh8MDtzPTA7Zjp3aGlsZSgxKXt5PVNjKDgzNTIsNTk2OCl8MDtBPWNbeSsoKGNbKGNbeT4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO3o9QSs0fDA7Y1t6Pj4yXT0oY1t6Pj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tmPj4yXT0xMzQ1NjtjW3U+PjJdPTIwODtjW3Q+PjJdPTA7Y2coMTM0NTYsZil9Qj0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7Qz1jW0ErOD4+Ml18MDtpZighKChjW0ErMTI+PjJdfDApLUM+PjI+Pj4wPkI+Pj4wKSl7bD0yMzQ7YnJlYWt9Qj1jW0MrKEI8PDIpPj4yXXwwO2lmKChCfDApPT0wKXtsPTIzNDticmVha31CPXhjW2NbKGNbQj4+Ml18MCkrMjg+PjJdJjYzXShCLDEwKXwwO0g9Y1t6Pj4yXXwwO2Nbej4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbQT4+Ml18MCkrOD4+Ml0mMjU1XShBKX1saCh5LEIpO1lnKHkpO0E9ZFtyPj4wXXxkW3IrMT4+MF08PDh8ZFtyKzI+PjBdPDwxNnxkW3IrMz4+MF08PDI0O3k9QSsocyo2fDApfDA7eT0oZFt5Pj4wXXxkW3krMT4+MF08PDgpJjY1NTM1O3o9QSsocyo2fDApKzJ8MDt6PShkW3o+PjBdfGRbeisxPj4wXTw8OCkmNjU1MzU7QT1BKyhzKjZ8MCkrNHwwO0E9KGRbQT4+MF18ZFtBKzE+PjBdPDw4KSY2NTUzNTtDPWNbdz4+Ml18MDtkb3tpZigoQ3wwKT09KGNbdj4+Ml18MCkpe0I9Y1t4Pj4yXXwwO0U9Qy1CfDA7Qz0oRXwwKS8xMnwwO0Q9QysxfDA7aWYoRD4+PjA+MzU3OTEzOTQxKXtsPTI0NDticmVhayBmfWlmKEM+Pj4wPDE3ODk1Njk3MCl7Rj1DPDwxO0Y9Rj4+PjA8RD4+PjA/RDpGO2lmKChGfDApPT0wKXtGPTA7Rz0wfWVsc2V7bD0yNDd9fWVsc2V7Rj0zNTc5MTM5NDE7bD0yNDd9aWYoKGx8MCk9PTI0Nyl7bD0wO0g9RioxMnwwO0g9KEh8MCk9PTA/MTpIO3doaWxlKDEpe0c9dW4oSCl8MDtpZigoR3wwKSE9MCl7YnJlYWt9Rz1jWzU2NjZdfDA7Y1s1NjY2XT1HKzA7aWYoKEd8MCk9PTApe2w9MjUxO2JyZWFrIGZ9c2NbRyYzMV0oKX19SD1HKyhDKjEyfDApfDA7aWYoKEh8MCkhPTApe2NbSD4+Ml09eTtjW0crKEMqMTJ8MCkrND4+Ml09ejtjW0crKEMqMTJ8MCkrOD4+Ml09QX1IPUcrKCgoKEV8MCkvLTEyfDApK0N8MCkqMTJ8MCl8MDtMbihIfDAsQnwwLEV8MCl8MDtjW3g+PjJdPUg7Y1t3Pj4yXT1HKyhEKjEyfDApO2Nbdj4+Ml09RysoRioxMnwwKTtpZigoQnwwKT09MCl7YnJlYWt9dm4oQil9ZWxzZXtpZigoQ3wwKT09MCl7eT0wfWVsc2V7Y1tDPj4yXT15O2NbQys0Pj4yXT16O2NbQys4Pj4yXT1BO3k9Y1t3Pj4yXXwwfWNbdz4+Ml09eSsxMn19d2hpbGUoMCk7cz1zKzF8MDtpZigoc3wwKT49KChkW3E+PjBdfGRbcSsxPj4wXTw8OCkmNjU1MzV8MCkpe2JyZWFrIGV9fWlmKChsfDApPT0yMzQpe0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfWVsc2UgaWYoKGx8MCk9PTI0NCl7VGsoKX1lbHNlIGlmKChsfDApPT0yNTEpe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfX19d2hpbGUoMCk7cz1TYyg4MzUyLDUzMjApfDA7cj1jW3MrKChjWyhjW3M+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtxPXIrNHwwO2NbcT4+Ml09KGNbcT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tmKzQ+PjJdPTIwODtjW2YrOD4+Ml09MDtjZygxMzQ1NixmKX11PShjWzEzNDYwPj4yXXwwKSsgLTF8MDt0PWNbcis4Pj4yXXwwO2Rve2lmKChjW3IrMTI+PjJdfDApLXQ+PjI+Pj4wPnU+Pj4wKXt0PWNbdCsodTw8Mik+PjJdfDA7aWYoKHR8MCk9PTApe2JyZWFrfXQ9eGNbY1soY1t0Pj4yXXwwKSsyOD4+Ml0mNjNdKHQsMTApfDA7SD1jW3E+PjJdfDA7Y1txPj4yXT1IKyAtMTtpZigoSHwwKT09MCl7bGNbY1soY1tyPj4yXXwwKSs4Pj4yXSYyNTVdKHIpfWxoKHMsdCk7WWcocyk7cj1jW2I+PjJdfDA7cT1iKzExNnwwO3M9ZFtxPj4wXXxkW3ErMT4+MF08PDh8ZFtxKzI+PjBdPDwxNnxkW3ErMz4+MF08PDI0O0g9Y1tyKzQ+PjJdfDA7Rz0oKEh8MCk8MCk8PDMxPj4zMTtpZigwPChHfDApfDA9PShHfDApJnM+Pj4wPEg+Pj4wKXtjW3IrOD4+Ml09c31lbHNle2FbcisxMj4+MF09MX1zPW87Y1tzPj4yXT0wO2Nbcys0Pj4yXT0wO3M9Y1tiPj4yXXwwO3I9cysxM3wwO2Rve2lmKChhW3I+PjBdfDApPT0wKXtIPWNbcys0Pj4yXXwwO0U9cys4fDA7Rz1jW0U+PjJdfDA7Rj1ILUd8MDtGPShGfDApPDg/Rjo4O0xuKG98MCwoY1tzPj4yXXwwKStHfDAsRnwwKXwwO0c9RytGfDA7Y1tFPj4yXT1HO2NbcysxNj4+Ml09RjtpZigoR3wwKTwoSHwwKSl7YnJlYWt9YVtyPj4wXT0xfWVsc2V7YVtzKzEyPj4wXT0xfX13aGlsZSgwKTtHPShjW2I+PjJdfDApKzEyfDA7SD1hW0c+PjBdfDA7YVtHPj4wXT0wO2lmKCEoSDw8MjQ+PjI0PT0wKSl7Zz1YYSg4KXwwO2NbZz4+Ml09OTkyODt3aGlsZSgxKXtiPXVuKDU2KXwwO2lmKChifDApIT0wKXtsPTI4MjticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MjgyKXtjW2IrND4+Ml09NDM7Y1tiPj4yXT00MztmPWIrMTJ8MDtjW2crND4+Ml09ZjtjW2IrOD4+Ml09MDtmPWYrMHwwO2I9NTc4NHwwO2U9Zis0NHwwO2Rve2FbZj4+MF09YVtiPj4wXXwwO2Y9ZisxfDA7Yj1iKzF8MH13aGlsZSgoZnwwKTwoZXwwKSk7Y1tnPj4yXT01ODQwO3diKGd8MCw1Mzg0LDcwKX1IPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX1zPWNbbz4+Ml18MDtvPWNbbys0Pj4yXXwwO2lmKChzfDApPT0tMSYob3wwKT09LTEpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11big2Nyl8MDtpZigoYnwwKSE9MCl7bD0yOTA7YnJlYWt9Yj1jWzU2NjZdfDA7Y1s1NjY2XT1iKzA7aWYoKGJ8MCk9PTApe2JyZWFrfXNjW2ImMzFdKCl9aWYoKGx8MCk9PTI5MCl7Y1tiKzQ+PjJdPTU0O2NbYj4+Ml09NTQ7Zj1iKzEyfDA7Y1tnKzQ+PjJdPWY7Y1tiKzg+PjJdPTA7Zj1mKzB8MDtiPTU0MDB8MDtlPWYrNTV8MDtkb3thW2Y+PjBdPWFbYj4+MF18MDtmPWYrMXwwO2I9YisxfDB9d2hpbGUoKGZ8MCk8KGV8MCkpO2NbZz4+Ml09NTc2ODt3YihnfDAsNTQ4OCw2OCl9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9cj1jW2I+PjJdfDA7SD1jW3IrND4+Ml18MDtHPSgoSHwwKTwwKTw8MzE+PjMxO2lmKChvfDApPChHfDApfChvfDApPT0oR3wwKSZzPj4+MDxIPj4+MCl7Y1tyKzg+PjJdPXN9ZWxzZXthW3IrMTI+PjBdPTF9Rz0oY1tiPj4yXXwwKSsxMnwwO0g9YVtHPj4wXXwwO2FbRz4+MF09MDtpZighKEg8PDI0Pj4yND09MCkpe2c9WGEoOCl8MDtjW2c+PjJdPTk5Mjg7d2hpbGUoMSl7Yj11big1Nil8MDtpZigoYnwwKSE9MCl7bD0zMDE7YnJlYWt9Yj1jWzU2NjZdfDA7Y1s1NjY2XT1iKzA7aWYoKGJ8MCk9PTApe2JyZWFrfXNjW2ImMzFdKCl9aWYoKGx8MCk9PTMwMSl7Y1tiKzQ+PjJdPTQzO2NbYj4+Ml09NDM7Zj1iKzEyfDA7Y1tnKzQ+PjJdPWY7Y1tiKzg+PjJdPTA7Zj1mKzB8MDtiPTU3ODR8MDtlPWYrNDR8MDtkb3thW2Y+PjBdPWFbYj4+MF18MDtmPWYrMXwwO2I9YisxfDB9d2hpbGUoKGZ8MCk8KGV8MCkpO2NbZz4+Ml09NTg0MDt3YihnfDAsNTM4NCw3MCl9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9bz1jW2I+PjJdfDA7cj1vKzEzfDA7ZG97aWYoKGFbcj4+MF18MCk9PTApe0g9Y1tvKzQ+PjJdfDA7RT1vKzh8MDtHPWNbRT4+Ml18MDtGPUgtR3wwO0Y9KEZ8MCk8OD9GOjg7TG4obnwwLChjW28+PjJdfDApK0d8MCxGfDApfDA7Rz1HK0Z8MDtjW0U+PjJdPUc7Y1tvKzE2Pj4yXT1GO2lmKChHfDApPChIfDApKXticmVha31hW3I+PjBdPTF9ZWxzZXthW28rMTI+PjBdPTF9fXdoaWxlKDApO0c9KGNbYj4+Ml18MCkrMTJ8MDtIPWFbRz4+MF18MDthW0c+PjBdPTA7aWYoIShIPDwyND4+MjQ9PTApKXtnPVhhKDgpfDA7Y1tnPj4yXT05OTI4O3doaWxlKDEpe2I9dW4oNTYpfDA7aWYoKGJ8MCkhPTApe2w9MzEzO2JyZWFrfWI9Y1s1NjY2XXwwO2NbNTY2Nl09YiswO2lmKChifDApPT0wKXticmVha31zY1tiJjMxXSgpfWlmKChsfDApPT0zMTMpe2NbYis0Pj4yXT00MztjW2I+PjJdPTQzO2Y9YisxMnwwO2NbZys0Pj4yXT1mO2NbYis4Pj4yXT0wO2Y9ZiswfDA7Yj01Nzg0fDA7ZT1mKzQ0fDA7ZG97YVtmPj4wXT1hW2I+PjBdfDA7Zj1mKzF8MDtiPWIrMXwwfXdoaWxlKChmfDApPChlfDApKTtjW2c+PjJdPTU4NDA7d2IoZ3wwLDUzODQsNzApfUg9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfWlmKChjW24+PjJdfDApIT0wKXtnPVhhKDgpfDA7Y1tnPj4yXT05OTI4O3doaWxlKDEpe2I9dW4oNTQpfDA7aWYoKGJ8MCkhPTApe2w9MzIxO2JyZWFrfWI9Y1s1NjY2XXwwO2NbNTY2Nl09YiswO2lmKChifDApPT0wKXticmVha31zY1tiJjMxXSgpfWlmKChsfDApPT0zMjEpe2NbYis0Pj4yXT00MTtjW2I+PjJdPTQxO2Y9YisxMnwwO2NbZys0Pj4yXT1mO2NbYis4Pj4yXT0wO2Y9ZiswfDA7Yj01Njg4fDA7ZT1mKzQyfDA7ZG97YVtmPj4wXT1hW2I+PjBdfDA7Zj1mKzF8MDtiPWIrMXwwfXdoaWxlKChmfDApPChlfDApKTtjW2c+PjJdPTU3NDQ7d2IoZ3wwLDU1NDQsNjYpfUg9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfW89YisyODh8MDtzPWNbbz4+Ml18MDtyPWIrMjkyfDA7dD1jW3I+PjJdfDA7aWYoKHR8MCk9PShzfDApKXt3PXN9ZWxzZXt3PXQrKH4oKHQrIC04KygwLXMpfDApPj4+Myk8PDMpfDA7Y1tyPj4yXT13fUg9YisyNTl8MDtpZigoZFtIPj4wXXxkW0grMT4+MF08PDh8ZFtIKzI+PjBdPDwxNnxkW0grMz4+MF08PDI0fDApPT0tMSl7Zz1YYSg4KXwwO2NbZz4+Ml09OTkyODt3aGlsZSgxKXtiPXVuKDk2KXwwO2lmKChifDApIT0wKXtsPTMzMTticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MzMxKXtjW2IrND4+Ml09ODM7Y1tiPj4yXT04MztmPWIrMTJ8MDtjW2crND4+Ml09ZjtjW2IrOD4+Ml09MDtmPWYrMHwwO2I9NTU2MHwwO2U9Zis4NHwwO2Rve2FbZj4+MF09YVtiPj4wXXwwO2Y9ZisxfDA7Yj1iKzF8MH13aGlsZSgoZnwwKTwoZXwwKSk7Y1tnPj4yXT01NzY4O3diKGd8MCw1NDg4LDY4KX1IPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX12PW4rNHwwO249Y1t2Pj4yXXwwO3U9bisxfDA7ej1zO3Q9dy16Pj4zO2Rve2lmKHQ+Pj4wPHU+Pj4wKXt1PXUtdHwwO3Q9YisyOTZ8MDtBPWNbdD4+Ml18MDt4PXc7aWYoIShBLXg+PjM+Pj4wPHU+Pj4wKSl7dD11O2w9dzt3aGlsZSgxKXtpZigobHwwKSE9MCl7SD1sO2NbSD4+Ml09MDtjW0grND4+Ml09MH10PXQrIC0xfDA7aWYoKHR8MCk9PTApe2JyZWFrfWVsc2V7bD1sKzh8MH19Y1tyPj4yXT13Kyh1PDwzKTticmVha314PXgtenwwO3k9eD4+Mzt3PXkrdXwwO2lmKHc+Pj4wPjUzNjg3MDkxMSl7VGsoKX16PUEtenwwO2lmKHo+PjM+Pj4wPDI2ODQzNTQ1NSl7ej16Pj4yO3o9ej4+PjA8dz4+PjA/dzp6O2lmKCh6fDApPT0wKXt6PTA7Qj0wfWVsc2V7bD0zNDJ9fWVsc2V7ej01MzY4NzA5MTE7bD0zNDJ9ZG97aWYoKGx8MCk9PTM0Mil7QT16PDwzO0E9KEF8MCk9PTA/MTpBO3doaWxlKDEpe0I9dW4oQSl8MDtpZigoQnwwKSE9MCl7bD0zNDg7YnJlYWt9Qj1jWzU2NjZdfDA7Y1s1NjY2XT1CKzA7aWYoKEJ8MCk9PTApe2JyZWFrfXNjW0ImMzFdKCl9aWYoKGx8MCk9PTM0OCl7YnJlYWt9SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2w9QisoeTw8Myl8MDt3aGlsZSgxKXtpZigobHwwKSE9MCl7SD1sO2NbSD4+Ml09MDtjW0grND4+Ml09MH11PXUrIC0xfDA7aWYoKHV8MCk9PTApe2JyZWFrfWVsc2V7bD1sKzh8MH19TG4oQnwwLHN8MCx4fDApfDA7Y1tvPj4yXT1CO2Nbcj4+Ml09Qisodzw8Myk7Y1t0Pj4yXT1CKyh6PDwzKTtpZigoc3wwKT09MCl7cz1CO2JyZWFrfXZuKHMpO3M9Y1tvPj4yXXwwfWVsc2V7aWYoISh0Pj4+MD51Pj4+MCkpe2JyZWFrfWw9cysodTw8Myl8MDtpZigod3wwKT09KGx8MCkpe2JyZWFrfWNbcj4+Ml09dysofigodysgLTgrKDAtbCl8MCk+Pj4zKTw8Myl9fXdoaWxlKDApO2w9ZFtxPj4wXXxkW3ErMT4+MF08PDh8ZFtxKzI+PjBdPDwxNnxkW3ErMz4+MF08PDI0O0g9cztjW0g+PjJdPWwrODtjW0grND4+Ml09MDtnOmRve2lmKG4+Pj4wPjEpe2NbbT4+Ml09Y1tiPj4yXTtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtsPW0rMTJ8MDtzPXVuKDEwNDg2NDQpfDA7eT1zKzY4Ji02NDtjW3krIC00Pj4yXT1zO2NbbD4+Ml09eTtjW2o+PjJdPW07eT1qKzR8MDtjW3k+PjJdPTA7Y1tqKzg+PjJdPS0xO2NbZys0Pj4yXT0zMjtjW2crOD4+Ml09MjtjW2crMTI+PjJdPTg7Y1tnKzE2Pj4yXT0wO3M9ZyszNnwwO2Nbcz4+Ml09MDtuPWcrNDB8MDtjW24+PjJdPTA7Y1tnKzQ0Pj4yXT0wO2NbZys2MD4+Ml09MTtjW2crNjQ+PjJdPTI7Y1tnKzU2Pj4yXT00MDk2O2NbZys1Mj4+Ml09NDtjW2crNDg+PjJdPTQ7dT1nKzY4fDA7Y1t1Pj4yXT0wO3Q9Zys3MnwwO2NbdD4+Ml09MDtjW2crNzY+PjJdPTA7Y1tnKzIwPj4yXT0zMjt3PWcrMjR8MDtjW3c+PjJdPTA7Y1tnKzI4Pj4yXT0tMjE0NzQ4MzY0ODtjW2crMzI+PjJdPTIxNDc0ODM2NDc7Y1tnPj4yXT0wO0g9bWQobSl8MDtHPW1kKG0pfDA7eD1tZChtKXwwO2NbeT4+Ml09KEcmMjU1KTw8MTZ8KEgmMjU1KTw8MjR8KHgmMjU1KTw8OHwobWQobSl8MCkmMjU1O3RkKGcpO3k9U2MoODM1Miw1NjQ4KXwwO209Y1t2Pj4yXXwwO3k9amgoeSxtKXwwO3g9Y1t5KygoY1soY1t5Pj4yXXwwKSsgLTEyPj4yXXwwKSsyOCk+PjJdfDA7dj14KzR8MDtjW3Y+PjJdPShjW3Y+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2Y+PjJdPTEzNDU2O2NbZis0Pj4yXT0yMDg7Y1tmKzg+PjJdPTA7Y2coMTM0NTYsZil9QT0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7ej1jW3grOD4+Ml18MDtkb3tpZigoY1t4KzEyPj4yXXwwKS16Pj4yPj4+MD5BPj4+MCl7ej1jW3orKEE8PDIpPj4yXXwwO2lmKCh6fDApPT0wKXticmVha316PXhjW2NbKGNbej4+Ml18MCkrMjg+PjJdJjYzXSh6LDEwKXwwO0g9Y1t2Pj4yXXwwO2Nbdj4+Ml09SCsgLTE7aWYoKEh8MCk9PTApe2xjW2NbKGNbeD4+Ml18MCkrOD4+Ml0mMjU1XSh4KX1saCh5LHopO1lnKHkpO2g6ZG97aWYoKG18MCkhPTApe3g9Zis0fDA7dj1mKzh8MDt5PTE7d2hpbGUoMSl7aWYoeT4+PjA+MSl7ej1jWyhjW28+PjJdfDApKyh5KyAtMTw8Myk+PjJdfDB9ZWxzZXt6PTB9QT0ocmQoZyxqLChjW3M+PjJdfDApKzQ0fDApfDApK3p8MDt6PWNbdz4+Ml18MDtpZigoQXwwKTwwKXt6PXorQXwwfWVsc2V7ej1BLShBPj4+MDx6Pj4+MD8wOnopfDB9QT0oY1tvPj4yXXwwKSsoeTw8Myl8MDtjW0E+PjJdPXo7Y1tBKzQ+PjJdPSgoenwwKTwwKTw8MzE+PjMxO0E9U2MoamgoU2MoODM1Miw1NjcyKXwwLHkpfDAsNTY4MCl8MDt6PShjW28+PjJdfDApKyh5PDwzKXwwO3o9a2goQSxjW3o+PjJdfDAsY1t6KzQ+PjJdfDApfDA7QT1jW3orKChjWyhjW3o+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtCPUErNHwwO2NbQj4+Ml09KGNbQj4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1t4Pj4yXT0yMDg7Y1t2Pj4yXT0wO2NnKDEzNDU2LGYpfUM9KGNbMTM0NjA+PjJdfDApKyAtMXwwO0Q9Y1tBKzg+PjJdfDA7aWYoISgoY1tBKzEyPj4yXXwwKS1EPj4yPj4+MD5DPj4+MCkpe2JyZWFrfUM9Y1tEKyhDPDwyKT4+Ml18MDtpZigoQ3wwKT09MCl7YnJlYWt9Qz14Y1tjWyhjW0M+PjJdfDApKzI4Pj4yXSY2M10oQywxMCl8MDtIPWNbQj4+Ml18MDtjW0I+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW0E+PjJdfDApKzg+PjJdJjI1NV0oQSl9bGgoeixDKTtZZyh6KTt5PXkrMXwwO2lmKHk+Pj4wPm0+Pj4wKXticmVhayBofX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7dj1jW28+PjJdfDA7aTpkb3tpZigoY1tyPj4yXXwwKS12Pj4zPj4+MD4xKXtqPWYrNHwwO2c9Zis4fDA7bT0xO3doaWxlKDEpe3c9disobSsgLTE8PDMpfDA7dj12KyhtPDwzKXwwO3g9djt3PUluKGNbeD4+Ml18MCxjW3grND4+Ml18MCxjW3c+PjJdfDAsY1t3KzQ+PjJdfDApfDA7Y1t2Pj4yXT13O2Nbdis0Pj4yXT1JO3Y9U2MoamgoU2MoODM1Miw1NjcyKXwwLG0pfDAsNTY4MCl8MDt3PShjW28+PjJdfDApKyhtPDwzKXwwO3c9a2godixjW3c+PjJdfDAsY1t3KzQ+PjJdfDApfDA7dj1jW3crKChjWyhjW3c+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDt4PXYrNHwwO2NbeD4+Ml09KGNbeD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tqPj4yXT0yMDg7Y1tnPj4yXT0wO2NnKDEzNDU2LGYpfXo9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3k9Y1t2Kzg+PjJdfDA7aWYoISgoY1t2KzEyPj4yXXwwKS15Pj4yPj4+MD56Pj4+MCkpe2JyZWFrfXk9Y1t5Kyh6PDwyKT4+Ml18MDtpZigoeXwwKT09MCl7YnJlYWt9eT14Y1tjWyhjW3k+PjJdfDApKzI4Pj4yXSY2M10oeSwxMCl8MDtIPWNbeD4+Ml18MDtjW3g+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW3Y+PjJdfDApKzg+PjJdJjI1NV0odil9bGgodyx5KTtZZyh3KTttPW0rMXwwO3Y9Y1tvPj4yXXwwO2lmKCEobT4+PjA8KGNbcj4+Ml18MCktdj4+Mz4+PjApKXticmVhayBpfX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Zj1jW3U+PjJdfDA7ZG97aWYoKGZ8MCkhPTApe2c9Y1t0Pj4yXXwwO2lmKChnfDApIT0oZnwwKSl7ZG97Y1t0Pj4yXT1nKyAtNDQ7aj1jW2crIC0zNj4+Ml18MDtpZigoanwwKSE9MCl7dm4oY1tqKyAtND4+Ml18MCl9aj1jW2crIC0zMj4+Ml18MDtpZigoanwwKSE9MCl7dm4oY1tqKyAtND4+Ml18MCl9Zz1jW2crIC0yOD4+Ml18MDtpZigoZ3wwKSE9MCl7dm4oY1tnKyAtND4+Ml18MCl9Zz1jW3Q+PjJdfDB9d2hpbGUoKGd8MCkhPShmfDApKTtmPWNbdT4+Ml18MDtpZigoZnwwKT09MCl7YnJlYWt9fXZuKGYpfX13aGlsZSgwKTtmPWNbcz4+Ml18MDtkb3tpZigoZnwwKSE9MCl7Zz1jW24+PjJdfDA7aWYoKGd8MCkhPShmfDApKXtkb3tjW24+PjJdPWcrIC00NDtqPWNbZysgLTM2Pj4yXXwwO2lmKChqfDApIT0wKXt2bihjW2orIC00Pj4yXXwwKX1qPWNbZysgLTMyPj4yXXwwO2lmKChqfDApIT0wKXt2bihjW2orIC00Pj4yXXwwKX1nPWNbZysgLTI4Pj4yXXwwO2lmKChnfDApIT0wKXt2bihjW2crIC00Pj4yXXwwKX1nPWNbbj4+Ml18MH13aGlsZSgoZ3wwKSE9KGZ8MCkpO2Y9Y1tzPj4yXXwwO2lmKChmfDApPT0wKXticmVha319dm4oZil9fXdoaWxlKDApO3ZuKGNbKGNbbD4+Ml18MCkrIC00Pj4yXXwwKTtsPWRbcT4+MF18ZFtxKzE+PjBdPDw4fGRbcSsyPj4wXTw8MTZ8ZFtxKzM+PjBdPDwyNDticmVhayBnfX13aGlsZSgwKTtIPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Zj1jW2I+PjJdfDA7YVtmKzEyPj4wXT0wO2FbZisxMz4+MF09MDtmPWNbYj4+Ml18MDtnPWwrOHwwO0g9Y1tmKzQ+PjJdfDA7Rz0oKEh8MCk8MCk8PDMxPj4zMTtpZigwPChHfDApfDA9PShHfDApJmc+Pj4wPEg+Pj4wKXtjW2YrOD4+Ml09ZztIPWIrMTJ8MDtjW0g+PjJdPTA7SD1iKzh8MDtjW0g+PjJdPTA7aT1lO3JldHVybn1lbHNle2FbZisxMj4+MF09MTtIPWIrMTJ8MDtjW0g+PjJdPTA7SD1iKzh8MDtjW0g+PjJdPTA7aT1lO3JldHVybn19fXdoaWxlKDApO0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtIPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7SD1YYSg0KXwwO2NbSD4+Ml09MjEzMDQ7d2IoSHwwLDIxMzc2LDE5Nil9fXdoaWxlKDApO0g9WGEoNCl8MDtjW0g+PjJdPTIxMzA0O3diKEh8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtIPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Zz1YYSg4KXwwO2NbZz4+Ml09OTkyODt3aGlsZSgxKXtiPXVuKDU2KXwwO2lmKChifDApIT0wKXtsPTIyOTticmVha31iPWNbNTY2Nl18MDtjWzU2NjZdPWIrMDtpZigoYnwwKT09MCl7YnJlYWt9c2NbYiYzMV0oKX1pZigobHwwKT09MjI5KXtjW2IrND4+Ml09NDM7Y1tiPj4yXT00MztmPWIrMTJ8MDtjW2crND4+Ml09ZjtjW2IrOD4+Ml09MDtmPWYrMHwwO2I9NTk4NHwwO2U9Zis0NHwwO2Rve2FbZj4+MF09YVtiPj4wXXwwO2Y9ZisxfDA7Yj1iKzF8MH13aGlsZSgoZnwwKTwoZXwwKSk7Y1tnPj4yXT02MDQwO3diKGd8MCw1OTUyLDcyKX1IPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX1IPVhhKDQpfDA7Y1tIPj4yXT0yMTMwNDt3YihIfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBwZShhKXthPWF8MDt2YXIgYj0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7Yj1pO2k9aSsxNnwwO2Y9YjtnPVNjKDgzNTIsNTE5Mil8MDtoPWNbZysoKGNbKGNbZz4+Ml18MCkrIC0xMj4+Ml18MCkrMjgpPj4yXXwwO2o9aCs0fDA7Y1tqPj4yXT0oY1tqPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tmPj4yXT0xMzQ1NjtjW2YrND4+Ml09MjA4O2NbZis4Pj4yXT0wO2NnKDEzNDU2LGYpfWw9KGNbMTM0NjA+PjJdfDApKyAtMXwwO209Y1toKzg+PjJdfDA7aWYoKGNbaCsxMj4+Ml18MCktbT4+Mj4+PjA+bD4+PjA/KGs9Y1ttKyhsPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7az14Y1tjWyhjW2s+PjJdfDApKzI4Pj4yXSY2M10oaywxMCl8MDttPWNbaj4+Ml18MDtjW2o+PjJdPW0rIC0xO2lmKChtfDApPT0wKXtsY1tjWyhjW2g+PjJdfDApKzg+PjJdJjI1NV0oaCl9bGgoZyxrKTtZZyhnKTtnPWErMzR8MDtnPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNDtpZigoZ3wwKSE9MCl7dm4oZyl9Zz1TYyg4MzUyLDUyMDgpfDA7aD1jW2crKChjWyhjW2c+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtqPWgrNHwwO2Nbaj4+Ml09KGNbaj4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbZj4+Ml09MTM0NTY7Y1tmKzQ+PjJdPTIwODtjW2YrOD4+Ml09MDtjZygxMzQ1NixmKX1mPShjWzEzNDYwPj4yXXwwKSsgLTF8MDthPWNbaCs4Pj4yXXwwO2lmKChjW2grMTI+PjJdfDApLWE+PjI+Pj4wPmY+Pj4wPyhlPWNbYSsoZjw8Mik+PjJdfDAsKGV8MCkhPTApOjApe2U9eGNbY1soY1tlPj4yXXwwKSsyOD4+Ml0mNjNdKGUsMTApfDA7bT1jW2o+PjJdfDA7Y1tqPj4yXT1tKyAtMTtpZigobXwwKT09MCl7bGNbY1soY1toPj4yXXwwKSs4Pj4yXSYyNTVdKGgpfWxoKGcsZSk7WWcoZyk7aT1iO3JldHVybn1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBxZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gcmUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHNlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiB0ZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gdWUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApfVJiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiB2ZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHdlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24geGUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHllKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gemUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEFlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gQmUoYSl7YT1hfDA7dmFyIGI9MDtiPWk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIENlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1JiKGF8MCk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gRGUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTA7Yj1pO2Q9Y1thPj4yXXwwO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufWU9YSs0fDA7Zj1jW2U+PjJdfDA7aWYoKGZ8MCkhPShkfDApKXtkb3tnPWYrIC0yNHwwO2NbZT4+Ml09ZztmPWNbZisgLTg+PjJdfDA7aWYoKGZ8MCkhPShnfDApKXtpZigoZnwwKSE9MCl7bGNbY1soY1tmPj4yXXwwKSsyMD4+Ml0mMjU1XShmKX19ZWxzZXtsY1tjWyhjW2Y+PjJdfDApKzE2Pj4yXSYyNTVdKGYpfWY9Y1tlPj4yXXwwfXdoaWxlKChmfDApIT0oZHwwKSk7ZD1jW2E+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59fXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gRWUoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEZlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEdlKGEpe2E9YXwwO3ZhciBiPTAsZD0wO2E9aTt3aGlsZSgxKXtkPXVuKDgpfDA7aWYoKGR8MCkhPTApe2I9NzticmVha31kPWNbNTY2Nl18MDtjWzU2NjZdPWQrMDtpZigoZHwwKT09MCl7YnJlYWt9c2NbZCYzMV0oKX1pZigoYnwwKT09Nyl7Y1tkPj4yXT02NDE2O2k9YTtyZXR1cm4gZHwwfWQ9WGEoNCl8MDtjW2Q+PjJdPTIyNjgwO3diKGR8MCwyMjcyOCwyMDYpO3JldHVybiAwfWZ1bmN0aW9uIEhlKGEsYil7YT1hfDA7Yj1ifDA7aWYoKGJ8MCkhPTApe2NbYj4+Ml09NjQxNn1yZXR1cm59ZnVuY3Rpb24gSWUoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEplKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEtlKGIsZSl7Yj1ifDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MDtiPWk7aj1lKzEwNHwwO2c9ZFtqPj4wXXwwO2U9Zz4+Pjc7aD1nPj4+NiYxO2lmKCEoKGV8MCkhPTF8KGh8MCk9PTApKXtiPVhhKDgpfDA7Y1tiPj4yXT05OTI4O3doaWxlKDEpe2U9dW4oODApfDA7aWYoKGV8MCkhPTApe2Y9ODticmVha31lPWNbNTY2Nl18MDtjWzU2NjZdPWUrMDtpZigoZXwwKT09MCl7YnJlYWt9c2NbZSYzMV0oKX1pZigoZnwwKT09OCl7Y1tlKzQ+PjJdPTY3O2NbZT4+Ml09Njc7Zz1lKzEyfDA7Y1tiKzQ+PjJdPWc7Y1tlKzg+PjJdPTA7Zz1nKzB8MDtlPTY5NjB8MDtmPWcrNjh8MDtkb3thW2c+PjBdPWFbZT4+MF18MDtnPWcrMXwwO2U9ZSsxfDB9d2hpbGUoKGd8MCk8KGZ8MCkpO2NbYj4+Ml09NzA0MDt3YihifDAsNjgzMiw4NCl9aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9aWYoKGV8MCkhPShofDApKXthW2o+PjBdPWcmNjM7aT1iO3JldHVybn1iPVhhKDgpfDA7Y1tiPj4yXT05OTI4O3doaWxlKDEpe2U9dW4oNTEpfDA7aWYoKGV8MCkhPTApe2Y9MTY7YnJlYWt9ZT1jWzU2NjZdfDA7Y1s1NjY2XT1lKzA7aWYoKGV8MCk9PTApe2JyZWFrfXNjW2UmMzFdKCl9aWYoKGZ8MCk9PTE2KXtjW2UrND4+Ml09Mzg7Y1tlPj4yXT0zODtnPWUrMTJ8MDtjW2IrND4+Ml09ZztjW2UrOD4+Ml09MDtnPWcrMHwwO2U9Njg5NnwwO2Y9ZyszOXwwO2Rve2FbZz4+MF09YVtlPj4wXXwwO2c9ZysxfDA7ZT1lKzF8MH13aGlsZSgoZ3wwKTwoZnwwKSk7Y1tiPj4yXT02OTQ0O3diKGJ8MCw2ODgwLDgyKX1qPVhhKDQpfDA7Y1tqPj4yXT0yMjY4MDt3YihqfDAsMjI3MjgsMjA2KX1mdW5jdGlvbiBMZShhLGIpe2E9YXwwO2I9YnwwO3JldHVybigoY1tiKzQ+PjJdfDApPT02Njg4P2ErNHwwOjApfDB9ZnVuY3Rpb24gTWUoYSl7YT1hfDA7cmV0dXJuIDY3ODR9ZnVuY3Rpb24gTmUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKT49MCl7UmIoYXwwKTtpPWI7cmV0dXJufXZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIE9lKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBQZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFFlKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKX1SYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gUmUoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApfVJiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBTZShhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wO2I9aTtpPWkrMTZ8MDtoPWI7ZD1TYyg4MzUyLDcxMDQpfDA7ZT1jW2QrKChjWyhjW2Q+PjJdfDApKyAtMTI+PjJdfDApKzI4KT4+Ml18MDtmPWUrNHwwO2NbZj4+Ml09KGNbZj4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbaD4+Ml09MTM0NTY7Y1toKzQ+PjJdPTIwODtjW2grOD4+Ml09MDtjZygxMzQ1NixoKX1oPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtqPWNbZSs4Pj4yXXwwO2lmKChjW2UrMTI+PjJdfDApLWo+PjI+Pj4wPmg+Pj4wPyhnPWNbaisoaDw8Mik+PjJdfDAsKGd8MCkhPTApOjApe2c9eGNbY1soY1tnPj4yXXwwKSsyOD4+Ml0mNjNdKGcsMTApfDA7aj1jW2Y+PjJdfDA7Y1tmPj4yXT1qKyAtMTtpZigoanwwKT09MCl7bGNbY1soY1tlPj4yXXwwKSs4Pj4yXSYyNTVdKGUpfWxoKGQsZyk7WWcoZCk7ZD1jW2ErMzI0Pj4yXXwwO2lmKCgoZHwwKSE9MD8oaD1kKzR8MCxqPWNbaD4+Ml18MCxjW2g+PjJdPWorIC0xLChqfDApPT0wKTowKT8obGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpLGg9ZCs4fDAsaj1jW2g+PjJdfDAsY1toPj4yXT1qKyAtMSwoanwwKT09MCk6MCl7bGNbY1soY1tkPj4yXXwwKSsxNj4+Ml0mMjU1XShkKX1kPWNbYSszMTY+PjJdfDA7aWYoKChkfDApIT0wPyhoPWQrNHwwLGo9Y1toPj4yXXwwLGNbaD4+Ml09aisgLTEsKGp8MCk9PTApOjApPyhsY1tjWyhjW2Q+PjJdfDApKzg+PjJdJjI1NV0oZCksaD1kKzh8MCxqPWNbaD4+Ml18MCxjW2g+PjJdPWorIC0xLChqfDApPT0wKTowKXtsY1tjWyhjW2Q+PjJdfDApKzE2Pj4yXSYyNTVdKGQpfWQ9Y1thKzMwMD4+Ml18MDtpZigoZHwwKSE9MCl7ZT1hKzMwNHwwO2Y9Y1tlPj4yXXwwO2lmKChmfDApIT0oZHwwKSl7Y1tlPj4yXT1mKyh+KCgoZisgLTEyKygwLWQpfDApPj4+MCkvMTJ8MCkqMTJ8MCl9dm4oZCl9ZD1jW2ErMjg4Pj4yXXwwO2lmKChkfDApPT0wKXtqPWErMjQ3fDA7cGUoaik7aj1hKzE2fDA7aj1jW2o+PjJdfDA7aj1qKyAtNHwwO2o9Y1tqPj4yXXwwO3ZuKGopO2k9YjtyZXR1cm59ZT1hKzI5MnwwO2Y9Y1tlPj4yXXwwO2lmKChmfDApIT0oZHwwKSl7Y1tlPj4yXT1mKyh+KChmKyAtOCsoMC1kKXwwKT4+PjMpPDwzKX12bihkKTtqPWErMjQ3fDA7cGUoaik7aj1hKzE2fDA7aj1jW2o+PjJdfDA7aj1qKyAtNHwwO2o9Y1tqPj4yXXwwO3ZuKGopO2k9YjtyZXR1cm59aj1YYSg0KXwwO2Nbaj4+Ml09MjEzMDQ7d2IoanwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gVGUoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFVlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFZlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2E9Y1thKzEyPj4yXXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufVNlKGEpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gV2UoYSxiKXthPWF8MDtiPWJ8MDtpZigoY1tiKzQ+PjJdfDApPT03MzEyKXthPWErMTJ8MH1lbHNle2E9MH1yZXR1cm4gYXwwfWZ1bmN0aW9uIFhlKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFllKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBaZShhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBfZShhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSsxMj4+Ml18MDtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiAkZShhLGIpe2E9YXwwO2I9YnwwO2lmKChjW2IrND4+Ml18MCk9PTc1NjApe2E9YSsxMnwwfWVsc2V7YT0wfXJldHVybiBhfDB9ZnVuY3Rpb24gYWYoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gYmYoKXt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MDtiPWk7aT1pKzMyfDA7ZD1iO0hiKDcyLDk2LDE3NiwwLDE1Miw5MSwxNDQsMCwxNDQsMCw4LDEzNiwyMTEpO2NbZD4+Ml09MTtlPWQrNHwwO2NbZT4+Ml09OTY7T2IoNzIsMSxlfDAsMTI4LDkyLDIyKTtjW2Q+PjJdPTQ7ZT1kKzR8MDtjW2U+PjJdPTIxNzc2O2NbZCs4Pj4yXT05NjtjW2QrMTI+PjJdPTIxOTA0O2NbZCsxNj4+Ml09MjE5MDQ7Zj11big4KXwwO2lmKChmfDApIT0wKXthW2Y+PjBdPTI3O2FbZisxPj4wXT0wO2FbZisyPj4wXT0wO2FbZiszPj4wXT0wO2c9Zis0fDA7YVtnPj4wXT0wO2FbZysxPj4wXT0wO2FbZysyPj4wXT0wO2FbZyszPj4wXT0wfXpiKDcyLDE2LDQsZXwwLDEyMCwzMCxmfDAsMCk7Y1tkPj4yXT0zO2U9ZCs0fDA7Y1tlPj4yXT0yMTc3NjtjW2QrOD4+Ml09OTY7Y1tkKzEyPj4yXT0yMTg4ODtmPXVuKDgpfDA7aWYoKGZ8MCkhPTApe2FbZj4+MF09NjY7YVtmKzE+PjBdPTA7YVtmKzI+PjBdPTA7YVtmKzM+PjBdPTA7Zz1mKzR8MDthW2c+PjBdPTA7YVtnKzE+PjBdPTA7YVtnKzI+PjBdPTA7YVtnKzM+PjBdPTB9emIoNzIsMjQsMyxlfDAsMTEyLDI4LGZ8MCwwKTtjW2Q+PjJdPTI7ZT1kKzR8MDtjW2U+PjJdPTIxOTA0O2NbZCs4Pj4yXT05NjtkPXVuKDgpfDA7aWYoKGR8MCk9PTApe3piKDcyLDQwLDIsZXwwLDU2LDQ2LGR8MCwwKTtpPWI7cmV0dXJufWFbZD4+MF09OTM7YVtkKzE+PjBdPTA7YVtkKzI+PjBdPTA7YVtkKzM+PjBdPTA7Zz1kKzR8MDthW2c+PjBdPTA7YVtnKzE+PjBdPTA7YVtnKzI+PjBdPTA7YVtnKzM+PjBdPTA7emIoNzIsNDAsMixlfDAsNTYsNDYsZHwwLDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gY2YoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtkPWNbYSs0Pj4yXXwwO2U9KEpuKGR8MCl8MCkrMXwwO2E9dW4oZSl8MDtpZigoYXwwKT09MCl7ZT0wO2k9YjtyZXR1cm4gZXwwfUxuKGF8MCxkfDAsZXwwKXwwO2U9YTtpPWI7cmV0dXJuIGV8MH1mdW5jdGlvbiBkZigpe3ZhciBhPTA7YT1pO0phKDIxNzc2LDc2MjQpO3BiKDIxODA4LDc2MzIsMSwxLDApO1VhKDIxODI0LDc2NDAsMSwtMTI4LDEyNyk7VWEoMjE4NTYsNzY0OCwxLC0xMjgsMTI3KTtVYSgyMTg0MCw3NjY0LDEsMCwyNTUpO1VhKDIxODY0LDc2ODAsMiwtMzI3NjgsMzI3NjcpO1VhKDIxODcyLDc2ODgsMiwwLDY1NTM1KTtVYSgyMTg4OCw3NzA0LDQsLTIxNDc0ODM2NDgsMjE0NzQ4MzY0Nyk7VWEoMjE5MDQsNzcxMiw0LDAsLTEpO1VhKDIxOTIwLDc3MjgsNCwtMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ3KTtVYSgyMTkzNiw3NzM2LDQsMCwtMSk7YWMoMjE5NTIsNzc1Miw0KTthYygyMTk2OCw3NzYwLDgpO3RiKDgyNDAsNzc2OCk7dGIoODE1Miw3Nzg0KTtKYig4MDY0LDQsNzgyNCk7eGIoNzk0NCw3ODQwKTtMYSg3OTEyLDc4NTYpO2k9YTtyZXR1cm59ZnVuY3Rpb24gZWYoYSl7YT1hfDA7YT1pO1lnKDgzNTIpO1lnKDg1MjgpO2JoKDg3MDQpO2JoKDg4ODApO2k9YTtyZXR1cm59ZnVuY3Rpb24gZmYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNzI4O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGdmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA3Mjg7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gaGYoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wO2U9aTtvY1tjWyhjW2I+PjJdfDApKzI0Pj4yXSYxMjddKGIpfDA7ZD1ZayhjW2Q+PjJdfDAsMTM1MjgpfDA7Y1tiKzM2Pj4yXT1kO2FbYis0ND4+MF09KG9jW2NbKGNbZD4+Ml18MCkrMjg+PjJdJjEyN10oZCl8MCkmMTtpPWU7cmV0dXJufWZ1bmN0aW9uIGpmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtiPWk7aT1pKzE2fDA7Zz1iKzh8MDtkPWI7ZT1hKzM2fDA7Zj1hKzQwfDA7aD1nKzh8MDtqPWc7YT1hKzMyfDA7d2hpbGUoMSl7az1jW2U+PjJdfDA7az15Y1tjWyhjW2s+PjJdfDApKzIwPj4yXSY2M10oayxjW2Y+PjJdfDAsZyxoLGQpfDA7bD0oY1tkPj4yXXwwKS1qfDA7aWYoKFpiKGd8MCwxLGx8MCxjW2E+PjJdfDApfDApIT0obHwwKSl7ZT0tMTtkPTU7YnJlYWt9aWYoKGt8MCk9PTIpe2U9LTE7ZD01O2JyZWFrfWVsc2UgaWYoKGt8MCkhPTEpe2Q9NDticmVha319aWYoKGR8MCk9PTQpe2w9KChfYShjW2E+PjJdfDApfDApIT0wKTw8MzE+PjMxO2k9YjtyZXR1cm4gbHwwfWVsc2UgaWYoKGR8MCk9PTUpe2k9YjtyZXR1cm4gZXwwfXJldHVybiAwfWZ1bmN0aW9uIGtmKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MDtmPWk7aWYoKGFbYis0ND4+MF18MCkhPTApe2c9WmIoZHwwLDQsZXwwLGNbYiszMj4+Ml18MCl8MDtpPWY7cmV0dXJuIGd8MH1pZigoZXwwKT4wKXtnPTB9ZWxzZXtnPTA7aT1mO3JldHVybiBnfDB9d2hpbGUoMSl7aWYoKHhjW2NbKGNbYj4+Ml18MCkrNTI+PjJdJjYzXShiLGNbZD4+Ml18MCl8MCk9PS0xKXtlPTY7YnJlYWt9Zz1nKzF8MDtpZigoZ3wwKTwoZXwwKSl7ZD1kKzR8MH1lbHNle2U9NjticmVha319aWYoKGV8MCk9PTYpe2k9ZjtyZXR1cm4gZ3wwfXJldHVybiAwfWZ1bmN0aW9uIGxmKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtlPWk7aT1pKzMyfDA7az1lKzE2fDA7cD1lKzh8MDtqPWUrNHwwO2g9ZTtmPShkfDApPT0tMTthOmRve2lmKCFmKXtjW3A+PjJdPWQ7aWYoKGFbYis0ND4+MF18MCkhPTApe2lmKChaYihwfDAsNCwxLGNbYiszMj4+Ml18MCl8MCk9PTEpe2JyZWFrfWVsc2V7ZD0tMX1pPWU7cmV0dXJuIGR8MH1jW2o+PjJdPWs7bD1wKzR8MDtuPWIrMzZ8MDtvPWIrNDB8MDtnPWsrOHwwO209aztiPWIrMzJ8MDt3aGlsZSgxKXtxPWNbbj4+Ml18MDtxPXRjW2NbKGNbcT4+Ml18MCkrMTI+PjJdJjMxXShxLGNbbz4+Ml18MCxwLGwsaCxrLGcsail8MDtpZigoY1toPj4yXXwwKT09KHB8MCkpe2Q9LTE7Zz0xMjticmVha31pZigocXwwKT09Myl7Zz03O2JyZWFrfXI9KHF8MCk9PTE7aWYoIShxPj4+MDwyKSl7ZD0tMTtnPTEyO2JyZWFrfXE9KGNbaj4+Ml18MCktbXwwO2lmKChaYihrfDAsMSxxfDAsY1tiPj4yXXwwKXwwKSE9KHF8MCkpe2Q9LTE7Zz0xMjticmVha31pZihyKXtwPXI/Y1toPj4yXXwwOnB9ZWxzZXticmVhayBhfX1pZigoZ3wwKT09Nyl7aWYoKFpiKHB8MCwxLDEsY1tiPj4yXXwwKXwwKT09MSl7YnJlYWt9ZWxzZXtkPS0xfWk9ZTtyZXR1cm4gZHwwfWVsc2UgaWYoKGd8MCk9PTEyKXtpPWU7cmV0dXJuIGR8MH19fXdoaWxlKDApO3I9Zj8wOmQ7aT1lO3JldHVybiByfDB9ZnVuY3Rpb24gbWYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNzI4O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIG5mKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA3Mjg7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gb2YoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTA7ZT1pO2c9WWsoY1tkPj4yXXwwLDEzNTI4KXwwO2Y9YiszNnwwO2NbZj4+Ml09ZztkPWIrNDR8MDtjW2Q+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MDtmPWNbZj4+Ml18MDthW2IrNTM+PjBdPShvY1tjWyhjW2Y+PjJdfDApKzI4Pj4yXSYxMjddKGYpfDApJjE7aWYoKGNbZD4+Ml18MCk+OCl7b2soOTU0NCl9ZWxzZXtpPWU7cmV0dXJufX1mdW5jdGlvbiBwZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPXNmKGEsMCl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBxZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPXNmKGEsMSl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiByZihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2U9aTtpPWkrMzJ8MDtqPWUrMTZ8MDtmPWUrOHwwO2w9ZSs0fDA7az1lO2c9Yis1MnwwO209KGFbZz4+MF18MCkhPTA7aWYoKGR8MCk9PS0xKXtpZihtKXttPS0xO2k9ZTtyZXR1cm4gbXwwfW09Y1tiKzQ4Pj4yXXwwO2FbZz4+MF09KG18MCkhPS0xJjE7aT1lO3JldHVybiBtfDB9aD1iKzQ4fDA7YTpkb3tpZihtKXtjW2w+PjJdPWNbaD4+Ml07bT1jW2IrMzY+PjJdfDA7az10Y1tjWyhjW20+PjJdfDApKzEyPj4yXSYzMV0obSxjW2IrNDA+PjJdfDAsbCxsKzR8MCxrLGosais4fDAsZil8MDtpZigoa3wwKT09Myl7YVtqPj4wXT1jW2g+PjJdO2NbZj4+Ml09aisxfWVsc2UgaWYoKGt8MCk9PTF8KGt8MCk9PTIpe209LTE7aT1lO3JldHVybiBtfDB9Yj1iKzMyfDA7d2hpbGUoMSl7az1jW2Y+PjJdfDA7aWYoIShrPj4+MD5qPj4+MCkpe2JyZWFrIGF9bT1rKyAtMXwwO2NbZj4+Ml09bTtpZigoVmEoYVttPj4wXXwwLGNbYj4+Ml18MCl8MCk9PS0xKXtmPS0xO2JyZWFrfX1pPWU7cmV0dXJuIGZ8MH19d2hpbGUoMCk7Y1toPj4yXT1kO2FbZz4+MF09MTttPWQ7aT1lO3JldHVybiBtfDB9ZnVuY3Rpb24gc2YoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTA7ZT1pO2k9aSszMnwwO2c9ZSsxNnwwO2o9ZSs4fDA7bT1lKzR8MDtsPWU7bj1iKzUyfDA7aWYoKGFbbj4+MF18MCkhPTApe2Y9Yis0OHwwO2c9Y1tmPj4yXXwwO2lmKCFkKXt2PWc7aT1lO3JldHVybiB2fDB9Y1tmPj4yXT0tMTthW24+PjBdPTA7dj1nO2k9ZTtyZXR1cm4gdnwwfXM9Y1tiKzQ0Pj4yXXwwO3M9KHN8MCk+MT9zOjE7YTpkb3tpZigoc3wwKT4wKXtwPWIrMzJ8MDtuPTA7d2hpbGUoMSl7bz1UYihjW3A+PjJdfDApfDA7aWYoKG98MCk9PS0xKXtoPS0xO2JyZWFrfWFbZytuPj4wXT1vO249bisxfDA7aWYoKG58MCk+PShzfDApKXticmVhayBhfX1pPWU7cmV0dXJuIGh8MH19d2hpbGUoMCk7Yjpkb3tpZigoYVtiKzUzPj4wXXwwKT09MCl7cD1iKzQwfDA7cT1iKzM2fDA7bj1qKzR8MDtvPWIrMzJ8MDt3aGlsZSgxKXt2PWNbcD4+Ml18MDt1PXY7dD1jW3U+PjJdfDA7dT1jW3UrND4+Ml18MDt3PWNbcT4+Ml18MDtyPWcrc3wwO3Y9dGNbY1soY1t3Pj4yXXwwKSsxNj4+Ml0mMzFdKHcsdixnLHIsbSxqLG4sbCl8MDtpZigodnwwKT09Myl7Zj0xNDticmVha31lbHNlIGlmKCh2fDApPT0yKXtoPS0xO2Y9MjI7YnJlYWt9ZWxzZSBpZigodnwwKSE9MSl7az1zO2JyZWFrIGJ9dz1jW3A+PjJdfDA7Y1t3Pj4yXT10O2Nbdys0Pj4yXT11O2lmKChzfDApPT04KXtoPS0xO2Y9MjI7YnJlYWt9dD1UYihjW28+PjJdfDApfDA7aWYoKHR8MCk9PS0xKXtoPS0xO2Y9MjI7YnJlYWt9YVtyPj4wXT10O3M9cysxfDB9aWYoKGZ8MCk9PTE0KXtjW2o+PjJdPWFbZz4+MF18MDtrPXM7YnJlYWt9ZWxzZSBpZigoZnwwKT09MjIpe2k9ZTtyZXR1cm4gaHwwfX1lbHNle2Nbaj4+Ml09YVtnPj4wXXwwO2s9c319d2hpbGUoMCk7aWYoZCl7dz1jW2o+PjJdfDA7Y1tiKzQ4Pj4yXT13O2k9ZTtyZXR1cm4gd3wwfWQ9YiszMnwwO3doaWxlKDEpe2lmKChrfDApPD0wKXticmVha31rPWsrIC0xfDA7aWYoKFZhKGFbZytrPj4wXXwwLGNbZD4+Ml18MCl8MCk9PS0xKXtoPS0xO2Y9MjI7YnJlYWt9fWlmKChmfDApPT0yMil7aT1lO3JldHVybiBofDB9dz1jW2o+PjJdfDA7aT1lO3JldHVybiB3fDB9ZnVuY3Rpb24gdGYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNjY0O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHVmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA2NjQ7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gdmYoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wO2U9aTtvY1tjWyhjW2I+PjJdfDApKzI0Pj4yXSYxMjddKGIpfDA7ZD1ZayhjW2Q+PjJdfDAsMTM1MjApfDA7Y1tiKzM2Pj4yXT1kO2FbYis0ND4+MF09KG9jW2NbKGNbZD4+Ml18MCkrMjg+PjJdJjEyN10oZCl8MCkmMTtpPWU7cmV0dXJufWZ1bmN0aW9uIHdmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtiPWk7aT1pKzE2fDA7Zz1iKzh8MDtkPWI7ZT1hKzM2fDA7Zj1hKzQwfDA7aD1nKzh8MDtqPWc7YT1hKzMyfDA7d2hpbGUoMSl7az1jW2U+PjJdfDA7az15Y1tjWyhjW2s+PjJdfDApKzIwPj4yXSY2M10oayxjW2Y+PjJdfDAsZyxoLGQpfDA7bD0oY1tkPj4yXXwwKS1qfDA7aWYoKFpiKGd8MCwxLGx8MCxjW2E+PjJdfDApfDApIT0obHwwKSl7ZT0tMTtkPTU7YnJlYWt9aWYoKGt8MCk9PTIpe2U9LTE7ZD01O2JyZWFrfWVsc2UgaWYoKGt8MCkhPTEpe2Q9NDticmVha319aWYoKGR8MCk9PTQpe2w9KChfYShjW2E+PjJdfDApfDApIT0wKTw8MzE+PjMxO2k9YjtyZXR1cm4gbHwwfWVsc2UgaWYoKGR8MCk9PTUpe2k9YjtyZXR1cm4gZXwwfXJldHVybiAwfWZ1bmN0aW9uIHhmKGIsZSxmKXtiPWJ8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MDtnPWk7aWYoKGFbYis0ND4+MF18MCkhPTApe2g9WmIoZXwwLDEsZnwwLGNbYiszMj4+Ml18MCl8MDtpPWc7cmV0dXJuIGh8MH1pZigoZnwwKT4wKXtoPTB9ZWxzZXtoPTA7aT1nO3JldHVybiBofDB9d2hpbGUoMSl7aWYoKHhjW2NbKGNbYj4+Ml18MCkrNTI+PjJdJjYzXShiLGRbZT4+MF18MCl8MCk9PS0xKXtmPTY7YnJlYWt9aD1oKzF8MDtpZigoaHwwKTwoZnwwKSl7ZT1lKzF8MH1lbHNle2Y9NjticmVha319aWYoKGZ8MCk9PTYpe2k9ZztyZXR1cm4gaHwwfXJldHVybiAwfWZ1bmN0aW9uIHlmKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtlPWk7aT1pKzMyfDA7az1lKzE2fDA7cD1lKzh8MDtqPWUrNHwwO2g9ZTtmPShkfDApPT0tMTthOmRve2lmKCFmKXthW3A+PjBdPWQ7aWYoKGFbYis0ND4+MF18MCkhPTApe2lmKChaYihwfDAsMSwxLGNbYiszMj4+Ml18MCl8MCk9PTEpe2JyZWFrfWVsc2V7ZD0tMX1pPWU7cmV0dXJuIGR8MH1jW2o+PjJdPWs7bD1wKzF8MDtuPWIrMzZ8MDtvPWIrNDB8MDtnPWsrOHwwO209aztiPWIrMzJ8MDt3aGlsZSgxKXtxPWNbbj4+Ml18MDtxPXRjW2NbKGNbcT4+Ml18MCkrMTI+PjJdJjMxXShxLGNbbz4+Ml18MCxwLGwsaCxrLGcsail8MDtpZigoY1toPj4yXXwwKT09KHB8MCkpe2Q9LTE7Zz0xMjticmVha31pZigocXwwKT09Myl7Zz03O2JyZWFrfXI9KHF8MCk9PTE7aWYoIShxPj4+MDwyKSl7ZD0tMTtnPTEyO2JyZWFrfXE9KGNbaj4+Ml18MCktbXwwO2lmKChaYihrfDAsMSxxfDAsY1tiPj4yXXwwKXwwKSE9KHF8MCkpe2Q9LTE7Zz0xMjticmVha31pZihyKXtwPXI/Y1toPj4yXXwwOnB9ZWxzZXticmVhayBhfX1pZigoZ3wwKT09Nyl7aWYoKFpiKHB8MCwxLDEsY1tiPj4yXXwwKXwwKT09MSl7YnJlYWt9ZWxzZXtkPS0xfWk9ZTtyZXR1cm4gZHwwfWVsc2UgaWYoKGd8MCk9PTEyKXtpPWU7cmV0dXJuIGR8MH19fXdoaWxlKDApO3I9Zj8wOmQ7aT1lO3JldHVybiByfDB9ZnVuY3Rpb24gemYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTtjW2E+PjJdPTEwNjY0O2E9Y1thKzQ+PjJdfDA7ZT1hKzR8MDtkPWNbZT4+Ml18MDtjW2U+PjJdPWQrIC0xO2lmKChkfDApIT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrOD4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIEFmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09MTA2NjQ7ZD1jW2ErND4+Ml18MDtmPWQrNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGV8MCkhPTApe3ZuKGEpO2k9YjtyZXR1cm59bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpO3ZuKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gQmYoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTA7ZT1pO2c9WWsoY1tkPj4yXXwwLDEzNTIwKXwwO2Y9YiszNnwwO2NbZj4+Ml09ZztkPWIrNDR8MDtjW2Q+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MDtmPWNbZj4+Ml18MDthW2IrNTM+PjBdPShvY1tjWyhjW2Y+PjJdfDApKzI4Pj4yXSYxMjddKGYpfDApJjE7aWYoKGNbZD4+Ml18MCk+OCl7b2soOTU0NCl9ZWxzZXtpPWU7cmV0dXJufX1mdW5jdGlvbiBDZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPUZmKGEsMCl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBEZihhKXthPWF8MDt2YXIgYj0wO2I9aTthPUZmKGEsMSl8MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBFZihiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2U9aTtpPWkrMzJ8MDtqPWUrMTZ8MDtmPWUrNHwwO2w9ZSs4fDA7az1lO2c9Yis1MnwwO209KGFbZz4+MF18MCkhPTA7aWYoKGR8MCk9PS0xKXtpZihtKXttPS0xO2k9ZTtyZXR1cm4gbXwwfW09Y1tiKzQ4Pj4yXXwwO2FbZz4+MF09KG18MCkhPS0xJjE7aT1lO3JldHVybiBtfDB9aD1iKzQ4fDA7YTpkb3tpZihtKXthW2w+PjBdPWNbaD4+Ml07bT1jW2IrMzY+PjJdfDA7az10Y1tjWyhjW20+PjJdfDApKzEyPj4yXSYzMV0obSxjW2IrNDA+PjJdfDAsbCxsKzF8MCxrLGosais4fDAsZil8MDtpZigoa3wwKT09MXwoa3wwKT09Mil7bT0tMTtpPWU7cmV0dXJuIG18MH1lbHNlIGlmKChrfDApPT0zKXthW2o+PjBdPWNbaD4+Ml07Y1tmPj4yXT1qKzF9Yj1iKzMyfDA7d2hpbGUoMSl7az1jW2Y+PjJdfDA7aWYoIShrPj4+MD5qPj4+MCkpe2JyZWFrIGF9bT1rKyAtMXwwO2NbZj4+Ml09bTtpZigoVmEoYVttPj4wXXwwLGNbYj4+Ml18MCl8MCk9PS0xKXtmPS0xO2JyZWFrfX1pPWU7cmV0dXJuIGZ8MH19d2hpbGUoMCk7Y1toPj4yXT1kO2FbZz4+MF09MTttPWQ7aT1lO3JldHVybiBtfDB9ZnVuY3Rpb24gRmYoYixlKXtiPWJ8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTA7Zj1pO2k9aSszMnwwO2g9ZisxNnwwO2o9Zis4fDA7bj1mKzR8MDttPWY7bz1iKzUyfDA7aWYoKGFbbz4+MF18MCkhPTApe2c9Yis0OHwwO2g9Y1tnPj4yXXwwO2lmKCFlKXt3PWg7aT1mO3JldHVybiB3fDB9Y1tnPj4yXT0tMTthW28+PjBdPTA7dz1oO2k9ZjtyZXR1cm4gd3wwfXA9Y1tiKzQ0Pj4yXXwwO3A9KHB8MCk+MT9wOjE7YTpkb3tpZigocHwwKT4wKXtyPWIrMzJ8MDtvPTA7d2hpbGUoMSl7cT1UYihjW3I+PjJdfDApfDA7aWYoKHF8MCk9PS0xKXtrPS0xO2JyZWFrfWFbaCtvPj4wXT1xO289bysxfDA7aWYoKG98MCk+PShwfDApKXticmVhayBhfX1pPWY7cmV0dXJuIGt8MH19d2hpbGUoMCk7Yjpkb3tpZigoYVtiKzUzPj4wXXwwKT09MCl7cj1iKzQwfDA7cz1iKzM2fDA7bz1qKzF8MDtxPWIrMzJ8MDt3aGlsZSgxKXt3PWNbcj4+Ml18MDt2PXc7dT1jW3Y+PjJdfDA7dj1jW3YrND4+Ml18MDt4PWNbcz4+Ml18MDt0PWgrcHwwO3c9dGNbY1soY1t4Pj4yXXwwKSsxNj4+Ml0mMzFdKHgsdyxoLHQsbixqLG8sbSl8MDtpZigod3wwKT09Mil7az0tMTttPTIzO2JyZWFrfWVsc2UgaWYoKHd8MCk9PTMpe209MTQ7YnJlYWt9ZWxzZSBpZigod3wwKSE9MSl7bD1wO2JyZWFrIGJ9eD1jW3I+PjJdfDA7Y1t4Pj4yXT11O2NbeCs0Pj4yXT12O2lmKChwfDApPT04KXtrPS0xO209MjM7YnJlYWt9dT1UYihjW3E+PjJdfDApfDA7aWYoKHV8MCk9PS0xKXtrPS0xO209MjM7YnJlYWt9YVt0Pj4wXT11O3A9cCsxfDB9aWYoKG18MCk9PTE0KXthW2o+PjBdPWFbaD4+MF18MDtsPXA7YnJlYWt9ZWxzZSBpZigobXwwKT09MjMpe2k9ZjtyZXR1cm4ga3wwfX1lbHNle2Fbaj4+MF09YVtoPj4wXXwwO2w9cH19d2hpbGUoMCk7ZG97aWYoIWUpe2U9YiszMnwwO3doaWxlKDEpe2lmKChsfDApPD0wKXttPTIxO2JyZWFrfWw9bCsgLTF8MDtpZigoVmEoZFtoK2w+PjBdfDAsY1tlPj4yXXwwKXwwKT09LTEpe2s9LTE7bT0yMzticmVha319aWYoKG18MCk9PTIxKXtnPWFbaj4+MF18MDticmVha31lbHNlIGlmKChtfDApPT0yMyl7aT1mO3JldHVybiBrfDB9fWVsc2V7Zz1hW2o+PjBdfDA7Y1tiKzQ4Pj4yXT1nJjI1NX19d2hpbGUoMCk7eD1nJjI1NTtpPWY7cmV0dXJuIHh8MH1mdW5jdGlvbiBHZigpe3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2I9aTtpPWkrMTZ8MDtkPWI7Zj1jW3I+PjJdfDA7Y1syMjQ0XT0xMDY2NDtYayg4OTgwfDApO2NbODk4ND4+Ml09MDtjWzg5ODg+PjJdPTA7Y1s4OTkyPj4yXT0wO2NbODk5Nj4+Ml09MDtjWzllMz4+Ml09MDtjWzkwMDQ+PjJdPTA7Y1syMjQ0XT05NzA0O2NbOTAwOD4+Ml09ZjtjWzkwMTY+PjJdPTkwMzI7Y1s5MDI0Pj4yXT0tMTthWzkwMjg+PjBdPTA7bj1jWzg5ODA+PjJdfDA7bT1uKzR8MDtjW20+PjJdPShjW20+PjJdfDApKzE7aWYoISgoY1szMzgwXXwwKT09LTEpKXtjW2Q+PjJdPTEzNTIwO2NbZCs0Pj4yXT0yMDg7Y1tkKzg+PjJdPTA7Y2coMTM1MjAsZCl9bD0oY1sxMzUyND4+Ml18MCkrIC0xfDA7az1jW24rOD4+Ml18MDtpZigoY1tuKzEyPj4yXXwwKS1rPj4yPj4+MD5sPj4+MD8oaj1jW2srKGw8PDIpPj4yXXwwLChqfDApIT0wKTowKXtjWzkwMTI+PjJdPWo7Y1s5MDIwPj4yXT1vY1tjWyhjW2o+PjJdfDApKzI0Pj4yXSYxMjddKGopfDA7bD1jWzkwMTI+PjJdfDA7YVs5MDI5Pj4wXT0ob2NbY1soY1tsPj4yXXwwKSsyOD4+Ml0mMTI3XShsKXwwKSYxO2lmKChjWzkwMjA+PjJdfDApPjgpe29rKDk1NDQpfWw9Y1ttPj4yXXwwO2NbbT4+Ml09bCsgLTE7aWYoKGx8MCk9PTApe2xjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKX1jWzIwNjZdPTEwNzk2O2NbODI3Mj4+Ml09MTA4MTY7Y1s4MjY4Pj4yXT0wO2NbODI5Nj4+Ml09ODk3NjtjWzgyODg+PjJdPTA7Y1s4MjkyPj4yXT0wO2NbODI3Nj4+Ml09NDA5ODtjWzgyODQ+PjJdPTA7Y1s4MjgwPj4yXT02O2s9ODMwNHwwO2w9ays0MHwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChsfDApKTtYayg4MzAwfDApO2NbODM0ND4+Ml09MDtjWzgzNDg+PjJdPS0xO2o9Y1tzPj4yXXwwO2NbMjI3MF09MTA2NjQ7WGsoOTA4NHwwKTtjWzkwODg+PjJdPTA7Y1s5MDkyPj4yXT0wO2NbOTA5Nj4+Ml09MDtjWzkxMDA+PjJdPTA7Y1s5MTA0Pj4yXT0wO2NbOTEwOD4+Ml09MDtjWzIyNzBdPTk1OTI7Y1s5MTEyPj4yXT1qO2s9Y1s5MDg0Pj4yXXwwO2w9ays0fDA7Y1tsPj4yXT0oY1tsPj4yXXwwKSsxO2lmKCEoKGNbMzM4MF18MCk9PS0xKSl7Y1tkPj4yXT0xMzUyMDtjW2QrND4+Ml09MjA4O2NbZCs4Pj4yXT0wO2NnKDEzNTIwLGQpfW09KGNbMTM1MjQ+PjJdfDApKyAtMXwwO249Y1trKzg+PjJdfDA7aWYoKGNbaysxMj4+Ml18MCktbj4+Mj4+PjA+bT4+PjA/KGg9Y1tuKyhtPDwyKT4+Ml18MCwoaHwwKSE9MCk6MCl7bj1jW2w+PjJdfDA7Y1tsPj4yXT1uKyAtMTtpZigobnwwKT09MCl7bGNbY1soY1trPj4yXXwwKSs4Pj4yXSYyNTVdKGspfWNbOTExNj4+Ml09aDtjWzkxMjA+PjJdPTkwNDA7YVs5MTI0Pj4wXT0ob2NbY1soY1toPj4yXXwwKSsyOD4+Ml0mMTI3XShoKXwwKSYxO2NbMjA4OF09MTA4NzY7Y1s4MzU2Pj4yXT0xMDg5NjtjWzgzODA+PjJdPTkwODA7Y1s4MzcyPj4yXT0wO2NbODM3Nj4+Ml09MDtjWzgzNjA+PjJdPTQwOTg7Y1s4MzY4Pj4yXT0wO2NbODM2ND4+Ml09NjtrPTgzODh8MDtsPWsrNDB8MDtkb3tjW2s+PjJdPTA7az1rKzR8MH13aGlsZSgoa3wwKTwobHwwKSk7WGsoODM4NHwwKTtjWzg0Mjg+PjJdPTA7Y1s4NDMyPj4yXT0tMTtoPWNbcT4+Ml18MDtjWzIyODJdPTEwNjY0O1hrKDkxMzJ8MCk7Y1s5MTM2Pj4yXT0wO2NbOTE0MD4+Ml09MDtjWzkxNDQ+PjJdPTA7Y1s5MTQ4Pj4yXT0wO2NbOTE1Mj4+Ml09MDtjWzkxNTY+PjJdPTA7Y1syMjgyXT05NTkyO2NbOTE2MD4+Ml09aDttPWNbOTEzMj4+Ml18MDtuPW0rNHwwO2Nbbj4+Ml09KGNbbj4+Ml18MCkrMTtpZighKChjWzMzODBdfDApPT0tMSkpe2NbZD4+Ml09MTM1MjA7Y1tkKzQ+PjJdPTIwODtjW2QrOD4+Ml09MDtjZygxMzUyMCxkKX1sPShjWzEzNTI0Pj4yXXwwKSsgLTF8MDtrPWNbbSs4Pj4yXXwwO2lmKChjW20rMTI+PjJdfDApLWs+PjI+Pj4wPmw+Pj4wPyhnPWNbaysobDw8Mik+PjJdfDAsKGd8MCkhPTApOjApe2w9Y1tuPj4yXXwwO2Nbbj4+Ml09bCsgLTE7aWYoKGx8MCk9PTApe2xjW2NbKGNbbT4+Ml18MCkrOD4+Ml0mMjU1XShtKX1jWzkxNjQ+PjJdPWc7Y1s5MTY4Pj4yXT05MDQ4O2FbOTE3Mj4+MF09KG9jW2NbKGNbZz4+Ml18MCkrMjg+PjJdJjEyN10oZyl8MCkmMTtjWzIxMTBdPTEwODc2O2NbODQ0ND4+Ml09MTA4OTY7Y1s4NDY4Pj4yXT05MTI4O2NbODQ2MD4+Ml09MDtjWzg0NjQ+PjJdPTA7Y1s4NDQ4Pj4yXT00MDk4O2NbODQ1Nj4+Ml09MDtjWzg0NTI+PjJdPTY7az04NDc2fDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg0NzJ8MCk7Y1s4NTE2Pj4yXT0wO2NbODUyMD4+Ml09LTE7az1jWyhjWyhjWzIxMTBdfDApKyAtMTI+PjJdfDApKzg0NjQ+PjJdfDA7Y1syMTMyXT0xMDg3NjtjWzg1MzI+PjJdPTEwODk2O2NbODU1Nj4+Ml09aztjWzg1NDg+PjJdPShrfDApPT0wJjE7Y1s4NTUyPj4yXT0wO2NbODUzNj4+Ml09NDA5ODtjWzg1NDQ+PjJdPTA7Y1s4NTQwPj4yXT02O2s9ODU2NHwwO2w9ays0MHwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChsfDApKTtYayg4NTYwfDApO2NbODYwND4+Ml09MDtjWzg2MDg+PjJdPS0xO2NbKGNbKGNbMjA2Nl18MCkrIC0xMj4+Ml18MCkrODMzNj4+Ml09ODM1MjtnPShjWyhjWzIxMTBdfDApKyAtMTI+PjJdfDApKzg0NDR8MDtjW2c+PjJdPWNbZz4+Ml18ODE5MjtjWyhjWyhjWzIxMTBdfDApKyAtMTI+PjJdfDApKzg1MTI+PjJdPTgzNTI7Y1syMjk0XT0xMDcyODtYayg5MTgwfDApO2NbOTE4ND4+Ml09MDtjWzkxODg+PjJdPTA7Y1s5MTkyPj4yXT0wO2NbOTE5Nj4+Ml09MDtjWzkyMDA+PjJdPTA7Y1s5MjA0Pj4yXT0wO2NbMjI5NF09OTQ0ODtjWzkyMDg+PjJdPWY7Y1s5MjE2Pj4yXT05MDU2O2NbOTIyND4+Ml09LTE7YVs5MjI4Pj4wXT0wO2Y9Y1s5MTgwPj4yXXwwO2c9Zis0fDA7Y1tnPj4yXT0oY1tnPj4yXXwwKSsxO2lmKCEoKGNbMzM4Ml18MCk9PS0xKSl7Y1tkPj4yXT0xMzUyODtjW2QrND4+Ml09MjA4O2NbZCs4Pj4yXT0wO2NnKDEzNTI4LGQpfWs9KGNbMTM1MzI+PjJdfDApKyAtMXwwO2w9Y1tmKzg+PjJdfDA7aWYoKGNbZisxMj4+Ml18MCktbD4+Mj4+PjA+az4+PjA/KGU9Y1tsKyhrPDwyKT4+Ml18MCwoZXwwKSE9MCk6MCl7Y1s5MjEyPj4yXT1lO2NbOTIyMD4+Ml09b2NbY1soY1tlPj4yXXwwKSsyND4+Ml0mMTI3XShlKXwwO249Y1s5MjEyPj4yXXwwO2FbOTIyOT4+MF09KG9jW2NbKGNbbj4+Ml18MCkrMjg+PjJdJjEyN10obil8MCkmMTtpZigoY1s5MjIwPj4yXXwwKT44KXtvayg5NTQ0KX1uPWNbZz4+Ml18MDtjW2c+PjJdPW4rIC0xO2lmKChufDApPT0wKXtsY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZil9Y1syMTU0XT0xMDgzNjtjWzg2MjQ+PjJdPTEwODU2O2NbODYyMD4+Ml09MDtjWzg2NDg+PjJdPTkxNzY7Y1s4NjQwPj4yXT0wO2NbODY0ND4+Ml09MDtjWzg2Mjg+PjJdPTQwOTg7Y1s4NjM2Pj4yXT0wO2NbODYzMj4+Ml09NjtrPTg2NTZ8MDtsPWsrNDB8MDtkb3tjW2s+PjJdPTA7az1rKzR8MH13aGlsZSgoa3wwKTwobHwwKSk7WGsoODY1MnwwKTtjWzg2OTY+PjJdPTA7Y1s4NzAwPj4yXT0tMTtjWzIzMDhdPTEwNzI4O1hrKDkyMzZ8MCk7Y1s5MjQwPj4yXT0wO2NbOTI0ND4+Ml09MDtjWzkyNDg+PjJdPTA7Y1s5MjUyPj4yXT0wO2NbOTI1Nj4+Ml09MDtjWzkyNjA+PjJdPTA7Y1syMzA4XT05MzM2O2NbOTI2ND4+Ml09ajtlPWNbOTIzNj4+Ml18MDtmPWUrNHwwO2NbZj4+Ml09KGNbZj4+Ml18MCkrMTtpZighKChjWzMzODJdfDApPT0tMSkpe2NbZD4+Ml09MTM1Mjg7Y1tkKzQ+PjJdPTIwODtjW2QrOD4+Ml09MDtjZygxMzUyOCxkKX1nPShjWzEzNTMyPj4yXXwwKSsgLTF8MDtqPWNbZSs4Pj4yXXwwO2Rve2lmKChjW2UrMTI+PjJdfDApLWo+PjI+Pj4wPmc+Pj4wKXtnPWNbaisoZzw8Mik+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfW49Y1tmPj4yXXwwO2NbZj4+Ml09bisgLTE7aWYoKG58MCk9PTApe2xjW2NbKGNbZT4+Ml18MCkrOD4+Ml0mMjU1XShlKX1jWzkyNjg+PjJdPWc7Y1s5MjcyPj4yXT05MDY0O2FbOTI3Nj4+MF09KG9jW2NbKGNbZz4+Ml18MCkrMjg+PjJdJjEyN10oZyl8MCkmMTtjWzIxNzZdPTEwOTE2O2NbODcwOD4+Ml09MTA5MzY7Y1s4NzMyPj4yXT05MjMyO2NbODcyND4+Ml09MDtjWzg3Mjg+PjJdPTA7Y1s4NzEyPj4yXT00MDk4O2NbODcyMD4+Ml09MDtjWzg3MTY+PjJdPTY7az04NzQwfDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg3MzZ8MCk7Y1s4NzgwPj4yXT0wO2NbODc4ND4+Ml09LTE7Y1syMzIwXT0xMDcyODtYayg5Mjg0fDApO2NbOTI4OD4+Ml09MDtjWzkyOTI+PjJdPTA7Y1s5Mjk2Pj4yXT0wO2NbOTMwMD4+Ml09MDtjWzkzMDQ+PjJdPTA7Y1s5MzA4Pj4yXT0wO2NbMjMyMF09OTMzNjtjWzkzMTI+PjJdPWg7Zj1jWzkyODQ+PjJdfDA7ZT1mKzR8MDtjW2U+PjJdPShjW2U+PjJdfDApKzE7aWYoISgoY1szMzgyXXwwKT09LTEpKXtjW2Q+PjJdPTEzNTI4O2NbZCs0Pj4yXT0yMDg7Y1tkKzg+PjJdPTA7Y2coMTM1MjgsZCl9ZD0oY1sxMzUzMj4+Ml18MCkrIC0xfDA7Zz1jW2YrOD4+Ml18MDtkb3tpZigoY1tmKzEyPj4yXXwwKS1nPj4yPj4+MD5kPj4+MCl7ZD1jW2crKGQ8PDIpPj4yXXwwO2lmKChkfDApPT0wKXticmVha31uPWNbZT4+Ml18MDtjW2U+PjJdPW4rIC0xO2lmKChufDApIT0wKXtjWzkzMTY+PjJdPWQ7Y1s5MzIwPj4yXT05MDcyO2s9Y1tkPj4yXXwwO2s9aysyOHwwO2s9Y1trPj4yXXwwO2s9b2NbayYxMjddKGQpfDA7az1rJjE7YVs5MzI0Pj4wXT1rO2NbMjE5OF09MTA5MTY7Y1s4Nzk2Pj4yXT0xMDkzNjtjWzg4MjA+PjJdPTkyODA7Y1s4ODEyPj4yXT0wO2NbODgxNj4+Ml09MDtjWzg4MDA+PjJdPTQwOTg7Y1s4ODA4Pj4yXT0wO2NbODgwND4+Ml09NjtrPTg4Mjh8MDtsPWsrNDB8MDtkb3tjW2s+PjJdPTA7az1rKzR8MH13aGlsZSgoa3wwKTwobHwwKSk7WGsoODgyNHwwKTtjWzg4Njg+PjJdPTA7Y1s4ODcyPj4yXT0tMTtrPWNbMjE5OF18MDtrPWsrIC0xMnwwO2s9Y1trPj4yXXwwO2s9aysyNHwwO2s9ODc5MitrfDA7az1jW2s+PjJdfDA7Y1syMjIwXT0xMDkxNjtjWzg4ODQ+PjJdPTEwOTM2O2NbODkwOD4+Ml09aztrPShrfDApPT0wO2s9ayYxO2NbODkwMD4+Ml09aztjWzg5MDQ+PjJdPTA7Y1s4ODg4Pj4yXT00MDk4O2NbODg5Nj4+Ml09MDtjWzg4OTI+PjJdPTY7az04OTE2fDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg5MTJ8MCk7Y1s4OTU2Pj4yXT0wO2NbODk2MD4+Ml09LTE7bj1jWzIxNTRdfDA7bj1uKyAtMTJ8MDtuPWNbbj4+Ml18MDtuPW4rNzJ8MDtuPTg2MTYrbnwwO2Nbbj4+Ml09ODcwNDtuPWNbMjE5OF18MDtuPW4rIC0xMnwwO249Y1tuPj4yXXwwO249bis0fDA7bj04NzkyK258MDttPWNbbj4+Ml18MDttPW18ODE5MjtjW24+PjJdPW07bj1jWzIxOThdfDA7bj1uKyAtMTJ8MDtuPWNbbj4+Ml18MDtuPW4rNzJ8MDtuPTg3OTIrbnwwO2Nbbj4+Ml09ODcwNDtjYygyMTIsODk2OCxwfDApfDA7aT1iO3JldHVybn1sY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZik7Y1s5MzE2Pj4yXT1kO2NbOTMyMD4+Ml09OTA3MjtrPWNbZD4+Ml18MDtrPWsrMjh8MDtrPWNbaz4+Ml18MDtrPW9jW2smMTI3XShkKXwwO2s9ayYxO2FbOTMyND4+MF09aztjWzIxOThdPTEwOTE2O2NbODc5Nj4+Ml09MTA5MzY7Y1s4ODIwPj4yXT05MjgwO2NbODgxMj4+Ml09MDtjWzg4MTY+PjJdPTA7Y1s4ODAwPj4yXT00MDk4O2NbODgwOD4+Ml09MDtjWzg4MDQ+PjJdPTY7az04ODI4fDA7bD1rKzQwfDA7ZG97Y1trPj4yXT0wO2s9ays0fDB9d2hpbGUoKGt8MCk8KGx8MCkpO1hrKDg4MjR8MCk7Y1s4ODY4Pj4yXT0wO2NbODg3Mj4+Ml09LTE7az1jWzIxOThdfDA7az1rKyAtMTJ8MDtrPWNbaz4+Ml18MDtrPWsrMjR8MDtrPTg3OTIra3wwO2s9Y1trPj4yXXwwO2NbMjIyMF09MTA5MTY7Y1s4ODg0Pj4yXT0xMDkzNjtjWzg5MDg+PjJdPWs7az0oa3wwKT09MDtrPWsmMTtjWzg5MDA+PjJdPWs7Y1s4OTA0Pj4yXT0wO2NbODg4OD4+Ml09NDA5ODtjWzg4OTY+PjJdPTA7Y1s4ODkyPj4yXT02O2s9ODkxNnwwO2w9ays0MHwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChsfDApKTtYayg4OTEyfDApO2NbODk1Nj4+Ml09MDtjWzg5NjA+PjJdPS0xO249Y1syMTU0XXwwO249bisgLTEyfDA7bj1jW24+PjJdfDA7bj1uKzcyfDA7bj04NjE2K258MDtjW24+PjJdPTg3MDQ7bj1jWzIxOThdfDA7bj1uKyAtMTJ8MDtuPWNbbj4+Ml18MDtuPW4rNHwwO249ODc5MitufDA7bT1jW24+PjJdfDA7bT1tfDgxOTI7Y1tuPj4yXT1tO249Y1syMTk4XXwwO249bisgLTEyfDA7bj1jW24+PjJdfDA7bj1uKzcyfDA7bj04NzkyK258MDtjW24+PjJdPTg3MDQ7Y2MoMjEyLDg5NjgscHwwKXwwO2k9YjtyZXR1cm59fXdoaWxlKDApO249WGEoNCl8MDtjW24+PjJdPTIxMzA0O3diKG58MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtuPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1uPVhhKDQpfDA7Y1tuPj4yXT0yMTMwNDt3YihufDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBIZihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5MDQ7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCk7UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWVsc2V7UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufX1mdW5jdGlvbiBJZihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5MDQ7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gSmYoYSl7YT1hfDA7cmV0dXJuIGNbYSs0Pj4yXXwwfWZ1bmN0aW9uIEtmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk8MCl7dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59ZWxzZXtSYihhfDApO3ZuKGEpO2k9YjtyZXR1cm59fWZ1bmN0aW9uIExmKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBNZihhKXthPWF8MDtyZXR1cm4gY1thKzQ+PjJdfDB9ZnVuY3Rpb24gTmYoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTA0O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1lbHNle1JiKGF8MCk7dm4oYSk7aT1iO3JldHVybn19ZnVuY3Rpb24gT2YoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO2NbYT4+Ml09ZDtjW2ErND4+Ml09YjtyZXR1cm59ZnVuY3Rpb24gUGYoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wO2U9aTtpPWkrMTZ8MDtmPWU7cWNbY1soY1thPj4yXXwwKSsxMj4+Ml0mMzFdKGYsYSxiKTtpZigoY1tmKzQ+PjJdfDApIT0oY1tkKzQ+PjJdfDApKXthPTA7aT1lO3JldHVybiBhfDB9YT0oY1tmPj4yXXwwKT09KGNbZD4+Ml18MCk7aT1lO3JldHVybiBhfDB9ZnVuY3Rpb24gUWYoYSxiLGQpe2E9YXwwO2I9YnwwO2Q9ZHwwO3ZhciBlPTA7ZT1pO2lmKChjW2IrND4+Ml18MCkhPShhfDApKXthPTA7aT1lO3JldHVybiBhfDB9YT0oY1tiPj4yXXwwKT09KGR8MCk7aT1lO3JldHVybiBhfDB9ZnVuY3Rpb24gUmYoYSl7YT1hfDA7cmV0dXJuIDEwMDgwfWZ1bmN0aW9uIFNmKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wO2Q9aTtlPU5iKGV8MCl8MDtmPUpuKGV8MCl8MDtpZihmPj4+MD40Mjk0OTY3Mjc5KXtkZygpfWlmKGY+Pj4wPDExKXthW2I+PjBdPWY8PDE7aj1iKzF8MDtMbihqfDAsZXwwLGZ8MCl8MDtqPWorZnwwO2Fbaj4+MF09MDtpPWQ7cmV0dXJufWc9ZisxNiYtMTY7aD0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aj11bihoKXwwO2lmKChqfDApIT0wKXtoPTExO2JyZWFrfWo9Y1s1NjY2XXwwO2NbNTY2Nl09aiswO2lmKChqfDApPT0wKXtoPTk7YnJlYWt9c2NbaiYzMV0oKX1pZigoaHwwKT09OSl7aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9ZWxzZSBpZigoaHwwKT09MTEpe2NbYis4Pj4yXT1qO2NbYj4+Ml09Z3wxO2NbYis0Pj4yXT1mO0xuKGp8MCxlfDAsZnwwKXwwO2o9aitmfDA7YVtqPj4wXT0wO2k9ZDtyZXR1cm59fWZ1bmN0aW9uIFRmKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBVZihhKXthPWF8MDtyZXR1cm4gMTAxMDR9ZnVuY3Rpb24gVmYoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTA7ZD1pO2U9TmIoZXwwKXwwO2Y9Sm4oZXwwKXwwO2lmKGY+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9aWYoZj4+PjA8MTEpe2FbYj4+MF09Zjw8MTtqPWIrMXwwO0xuKGp8MCxlfDAsZnwwKXwwO2o9aitmfDA7YVtqPj4wXT0wO2k9ZDtyZXR1cm59Zz1mKzE2Ji0xNjtoPShnfDApPT0wPzE6Zzt3aGlsZSgxKXtqPXVuKGgpfDA7aWYoKGp8MCkhPTApe2g9MTE7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2g9OTticmVha31zY1tqJjMxXSgpfWlmKChofDApPT05KXtqPVhhKDQpfDA7Y1tqPj4yXT0yMjY4MDt3YihqfDAsMjI3MjgsMjA2KX1lbHNlIGlmKChofDApPT0xMSl7Y1tiKzg+PjJdPWo7Y1tiPj4yXT1nfDE7Y1tiKzQ+PjJdPWY7TG4oanwwLGV8MCxmfDApfDA7aj1qK2Z8MDthW2o+PjBdPTA7aT1kO3JldHVybn19ZnVuY3Rpb24gV2YoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Q9aTtpZigoYVsxMDA5Nl18MCk9PTA/KFFhKDEwMDk2KXwwKSE9MDowKXtjWzI1MjJdPTEwMjg4OyRhKDEwMDk2KX1jW2I+PjJdPWU7Y1tiKzQ+PjJdPTEwMDg4O2k9ZDtyZXR1cm59ZnVuY3Rpb24gWGYoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFlmKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wO2c9aTtpPWkrNDh8MDtvPWcrMjR8MDtsPWcrMTJ8MDtoPWc7cD1KbihmfDApfDA7aWYocD4+PjA+NDI5NDk2NzI3OSl7ZGcoKX1kb3tpZihwPj4+MDwxMSl7YVtoPj4wXT1wPDwxO209aDtxPWgrMXwwfWVsc2V7bT1wKzE2Ji0xNjtyPShtfDApPT0wPzE6bTt3aGlsZSgxKXtxPXVuKHIpfDA7aWYoKHF8MCkhPTApe2o9MTE7YnJlYWt9cT1jWzU2NjZdfDA7Y1s1NjY2XT1xKzA7aWYoKHF8MCk9PTApe2JyZWFrfXNjW3EmMzFdKCl9aWYoKGp8MCk9PTExKXtjW2grOD4+Ml09cTtjW2g+PjJdPW18MTtjW2grND4+Ml09cDttPWg7YnJlYWt9cj1YYSg0KXwwO2Nbcj4+Ml09MjI2ODA7d2IocnwwLDIyNzI4LDIwNil9fXdoaWxlKDApO0xuKHF8MCxmfDAscHwwKXwwO2FbcStwPj4wXT0wO2lmKChkfDApIT0wKXtwPWFbbT4+MF18MDtpZigocCYxKT09MCl7cD0ocCYyNTUpPj4+MX1lbHNle3A9Y1toKzQ+PjJdfDB9aWYoKHB8MCkhPTApe2pnKGgsMTAxMjgsMil9cWNbY1soY1tlPj4yXXwwKSsyND4+Ml0mMzFdKG8sZSxkKTtmPWFbbz4+MF18MDtpZigoZiYxKT09MCl7cD1vKzF8MDtmPShmJjI1NSk+Pj4xfWVsc2V7cD1jW28rOD4+Ml18MDtmPWNbbys0Pj4yXXwwfWpnKGgscCxmKTtpZighKChhW28+PjBdJjEpPT0wKT8obj1jW28rOD4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9fWNbbCswPj4yXT1jW20rMD4+Ml07Y1tsKzQ+PjJdPWNbbSs0Pj4yXTtjW2wrOD4+Ml09Y1ttKzg+PjJdO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2NbYj4+Ml09OTkyODtuPWIrNHwwO2lmKChhW2w+PjBdJjEpPT0wKXtmPWwrMXwwfWVsc2V7Zj1jW2wrOD4+Ml18MH1wPUpuKGZ8MCl8MDtvPXArMTN8MDtvPShvfDApPT0wPzE6bzt3aGlsZSgxKXtxPXVuKG8pfDA7aWYoKHF8MCkhPTApe2JyZWFrfXE9Y1s1NjY2XXwwO2NbNTY2Nl09cSswO2lmKChxfDApPT0wKXtqPTMzO2JyZWFrfXNjW3EmMzFdKCl9aWYoKGp8MCk9PTMzKXtyPVhhKDQpfDA7Y1tyPj4yXT0yMjY4MDt3YihyfDAsMjI3MjgsMjA2KX1jW3ErND4+Ml09cDtjW3E+PjJdPXA7cj1xKzEyfDA7Y1tuPj4yXT1yO2NbcSs4Pj4yXT0wO0xuKHJ8MCxmfDAscCsxfDApfDA7aWYoISgoYVtsPj4wXSYxKT09MCk/KGs9Y1tsKzg+PjJdfDAsKGt8MCkhPTApOjApe3ZuKGspfWlmKChhW20+PjBdJjEpPT0wKXtjW2I+PjJdPTEwMTQ0O3I9Yis4fDA7cT1lO2Y9cjtjW2Y+PjJdPWQ7cj1yKzR8MDtjW3I+PjJdPXE7aT1nO3JldHVybn1oPWNbaCs4Pj4yXXwwO2lmKChofDApPT0wKXtjW2I+PjJdPTEwMTQ0O3I9Yis4fDA7cT1lO2Y9cjtjW2Y+PjJdPWQ7cj1yKzR8MDtjW3I+PjJdPXE7aT1nO3JldHVybn12bihoKTtjW2I+PjJdPTEwMTQ0O3I9Yis4fDA7cT1lO2Y9cjtjW2Y+PjJdPWQ7cj1yKzR8MDtjW3I+PjJdPXE7aT1nO3JldHVybn1mdW5jdGlvbiBaZihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPDApe3ZuKChjW2Q+PjJdfDApKyAtMTJ8MCl9UmIoYXwwKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIF9mKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTA7Yj1pO2NbYT4+Ml09OTkyODtkPWErNHwwO2Y9KGNbZD4+Ml18MCkrIC00fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZSsgLTF8MCk+PTApe1JiKGF8MCk7aT1iO3JldHVybn12bigoY1tkPj4yXXwwKSsgLTEyfDApO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiAkZihhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBhZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn0KCgoKZnVuY3Rpb24gYmcoYSl7YT1hfDA7dmFyIGI9MDtiPWk7QmIoYXwwKXwwO2k9YjtyZXR1cm59ZnVuY3Rpb24gY2coYSxiKXthPWF8MDtiPWJ8MDt2YXIgZT0wLGY9MCxnPTA7ZT1pOyRiKDEwNTY4KXwwO2lmKChjW2E+PjJdfDApPT0xKXtkb3tHYSgxMDU5MiwxMDU2OCl8MH13aGlsZSgoY1thPj4yXXwwKT09MSl9aWYoKGNbYT4+Ml18MCkhPTApe0NiKDEwNTY4KXwwO2k9ZTtyZXR1cm59Y1thPj4yXT0xO0NiKDEwNTY4KXwwO2c9Yis0fDA7Zj1kW2c+PjBdfGRbZysxPj4wXTw8OHxkW2crMj4+MF08PDE2fGRbZyszPj4wXTw8MjQ7Zz1nKzR8MDtnPWRbZz4+MF18ZFtnKzE+PjBdPDw4fGRbZysyPj4wXTw8MTZ8ZFtnKzM+PjBdPDwyNDtiPShjW2I+PjJdfDApKyhnPj4xKXwwO2lmKChnJjF8MCkhPTApe2Y9Y1soY1tiPj4yXXwwKStmPj4yXXwwfWxjW2YmMjU1XShiKTskYigxMDU2OCl8MDtjW2E+PjJdPS0xO0NiKDEwNTY4KXwwO0ViKDEwNTkyKXwwO2k9ZTtyZXR1cm59ZnVuY3Rpb24gZGcoKXt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9WGEoOCl8MDtjW2I+PjJdPTk5MDQ7d2hpbGUoMSl7ZT11bigyNSl8MDtpZigoZXwwKSE9MCl7ZD03O2JyZWFrfWU9Y1s1NjY2XXwwO2NbNTY2Nl09ZSswO2lmKChlfDApPT0wKXticmVha31zY1tlJjMxXSgpfWlmKChkfDApPT03KXtjW2UrND4+Ml09MTI7Y1tlPj4yXT0xMjtmPWUrMTJ8MDtjW2IrND4+Ml09ZjtjW2UrOD4+Ml09MDtmPWYrMHwwO2U9MTA2NDB8MDtkPWYrMTN8MDtkb3thW2Y+PjBdPWFbZT4+MF18MDtmPWYrMXwwO2U9ZSsxfDB9d2hpbGUoKGZ8MCk8KGR8MCkpO2NbYj4+Ml09OTk4NDt3YihifDAsMTAwMjQsMTA0KX1mPVhhKDQpfDA7Y1tmPj4yXT0yMjY4MDt3YihmfDAsMjI3MjgsMjA2KX1mdW5jdGlvbiBlZyhiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MDtmPWk7aWYoZT4+PjA+NDI5NDk2NzI3OSl7ZGcoKX1pZihlPj4+MDwxMSl7YVtiPj4wXT1lPDwxO2o9YisxfDA7TG4oanwwLGR8MCxlfDApfDA7aj1qK2V8MDthW2o+PjBdPTA7aT1mO3JldHVybn1nPWUrMTYmLTE2O2g9KGd8MCk9PTA/MTpnO3doaWxlKDEpe2o9dW4oaCl8MDtpZigoanwwKSE9MCl7aD0xMTticmVha31qPWNbNTY2Nl18MDtjWzU2NjZdPWorMDtpZigoanwwKT09MCl7aD05O2JyZWFrfXNjW2omMzFdKCl9aWYoKGh8MCk9PTkpe2o9WGEoNCl8MDtjW2o+PjJdPTIyNjgwO3diKGp8MCwyMjcyOCwyMDYpfWVsc2UgaWYoKGh8MCk9PTExKXtjW2IrOD4+Ml09ajtjW2I+PjJdPWd8MTtjW2IrND4+Ml09ZTtMbihqfDAsZHwwLGV8MCl8MDtqPWorZXwwO2Fbaj4+MF09MDtpPWY7cmV0dXJufX1mdW5jdGlvbiBmZyhiKXtiPWJ8MDt2YXIgZD0wLGU9MDtkPWk7aWYoISgoYVtiPj4wXSYxKT09MCk/KGU9Y1tiKzg+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWk9ZDtyZXR1cm59ZnVuY3Rpb24gZ2coYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MDtmPWk7ZT1KbihkfDApfDA7aD1hW2I+PjBdfDA7aWYoKGgmMSk9PTApe2c9MTB9ZWxzZXtnPWNbYj4+Ml18MDtoPWcmMjU1O2c9KGcmLTIpKyAtMXwwfWo9KGgmMSk9PTA7aWYoZz4+PjA8ZT4+PjApe2lmKGope2g9KGgmMjU1KT4+PjF9ZWxzZXtoPWNbYis0Pj4yXXwwfWtnKGIsZyxlLWd8MCxoLDAsaCxlLGQpO2k9ZjtyZXR1cm59aWYoail7Zz1iKzF8MH1lbHNle2c9Y1tiKzg+PjJdfDB9TW4oZ3wwLGR8MCxlfDApfDA7YVtnK2U+PjBdPTA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09ZTw8MTtpPWY7cmV0dXJufWVsc2V7Y1tiKzQ+PjJdPWU7aT1mO3JldHVybn19ZnVuY3Rpb24gaGcoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wO2U9aTtpZigoZHwwKT09MCl7aT1lO3JldHVybn1oPWFbYj4+MF18MDtpZigoaCYxKT09MCl7Zz0xMH1lbHNle2g9Y1tiPj4yXXwwO2c9KGgmLTIpKyAtMXwwO2g9aCYyNTV9aWYoKGgmMSk9PTApe2Y9KGgmMjU1KT4+PjF9ZWxzZXtmPWNbYis0Pj4yXXwwfWlmKChnLWZ8MCk+Pj4wPGQ+Pj4wKXtsZyhiLGcsZC1nK2Z8MCxmLGYsMCk7aD1hW2I+PjBdfDB9aWYoKGgmMSk9PTApe2c9YisxfDB9ZWxzZXtnPWNbYis4Pj4yXXwwfU5uKGcrZnwwLDAsZHwwKXwwO2Q9ZitkfDA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09ZDw8MX1lbHNle2NbYis0Pj4yXT1kfWFbZytkPj4wXT0wO2k9ZTtyZXR1cm59ZnVuY3Rpb24gaWcoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7ZD1pO2g9YVtiPj4wXXwwO2lmKChoJjEpPT0wKXtsPTEwfWVsc2V7aD1jW2I+PjJdfDA7bD0oaCYtMikrIC0xfDA7aD1oJjI1NX1qPShoJjEpPT0wO2lmKGope2Y9KGgmMjU1KT4+PjF9ZWxzZXtmPWNbYis0Pj4yXXwwfWlmKGY+Pj4wPDExKXtlPTEwfWVsc2V7ZT0oZisxNiYtMTYpKyAtMXwwfWlmKChlfDApPT0obHwwKSl7aT1kO3JldHVybn1kb3tpZigoZXwwKT09MTApe2s9YisxfDA7Zz1jW2IrOD4+Ml18MDtpZihqKXtMbihrfDAsZ3wwLCgoaCYyNTUpPj4+MSkrMXwwKXwwO2g9aztrPTA7aj1nO2c9Mjd9ZWxzZXtoPWs7az0wO2o9ZztnPTI1fX1lbHNle2s9ZSsxfDA7az0oa3wwKT09MD8xOms7YTpkb3tpZihlPj4+MD5sPj4+MCl7d2hpbGUoMSl7bD11bihrKXwwO2lmKChsfDApIT0wKXticmVhayBhfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXticmVha31zY1tsJjMxXSgpfWw9WGEoNCl8MDtjW2w+PjJdPTIyNjgwO3diKGx8MCwyMjcyOCwyMDYpfWVsc2V7d2hpbGUoMSl7bD11bihrKXwwO2lmKChsfDApIT0wKXticmVhayBhfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXticmVha31zY1tsJjMxXSgpfWw9WGEoNCl8MDtjW2w+PjJdPTIyNjgwO3diKGx8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihqKXtMbihsfDAsYisxfDAsKChoJjI1NSk+Pj4xKSsxfDApfDA7aD1sO2JyZWFrfWVsc2V7aD1sO2s9MTtqPWNbYis4Pj4yXXwwO2c9MjU7YnJlYWt9fX13aGlsZSgwKTtpZigoZ3wwKT09MjUpe0xuKGh8MCxqfDAsKGNbYis0Pj4yXXwwKSsxfDApfDA7Zz0yN31kb3tpZigoZ3wwKT09Mjcpe2lmKChqfDApPT0wKXtpZihrKXticmVha319ZWxzZXt2bihqKTtpZihrKXticmVha319YVtiPj4wXT1mPDwxO2k9ZDtyZXR1cm59fXdoaWxlKDApO2NbYj4+Ml09ZSsxfDE7Y1tiKzQ+PjJdPWY7Y1tiKzg+PjJdPWg7aT1kO3JldHVybn1mdW5jdGlvbiBqZyhiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MDtmPWk7aj1hW2I+PjBdfDA7aWYoKGomMSk9PTApe2c9MTB9ZWxzZXtqPWNbYj4+Ml18MDtnPShqJi0yKSsgLTF8MDtqPWomMjU1fWg9KGomMSk9PTA7aWYoaCl7aj0oaiYyNTUpPj4+MX1lbHNle2o9Y1tiKzQ+PjJdfDB9aWYoKGctanwwKT4+PjA8ZT4+PjApe2tnKGIsZyxlLWcranwwLGosaiwwLGUsZCk7aT1mO3JldHVybn1pZigoZXwwKT09MCl7aT1mO3JldHVybn1pZihoKXtnPWIrMXwwfWVsc2V7Zz1jW2IrOD4+Ml18MH1MbihnK2p8MCxkfDAsZXwwKXwwO2U9aitlfDA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09ZTw8MX1lbHNle2NbYis0Pj4yXT1lfWFbZytlPj4wXT0wO2k9ZjtyZXR1cm59ZnVuY3Rpb24ga2coYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MDtsPWk7aWYoKC0xOC1kfDApPj4+MDxlPj4+MCl7ZGcoKX1pZigoYVtiPj4wXSYxKT09MCl7bT1iKzF8MH1lbHNle209Y1tiKzg+PjJdfDB9aWYoZD4+PjA8MjE0NzQ4MzYyMyl7ZT1lK2R8MDtwPWQ8PDE7ZT1lPj4+MDxwPj4+MD9wOmU7aWYoZT4+PjA8MTEpe2U9MTF9ZWxzZXtlPWUrMTYmLTE2fX1lbHNle2U9LTE3fW89KGV8MCk9PTA/MTplO3doaWxlKDEpe3A9dW4obyl8MDtpZigocHwwKSE9MCl7YnJlYWt9cD1jWzU2NjZdfDA7Y1s1NjY2XT1wKzA7aWYoKHB8MCk9PTApe249MTM7YnJlYWt9c2NbcCYzMV0oKX1pZigobnwwKT09MTMpe3A9WGEoNCl8MDtjW3A+PjJdPTIyNjgwO3diKHB8MCwyMjcyOCwyMDYpfWlmKChnfDApIT0wKXtMbihwfDAsbXwwLGd8MCl8MH1pZigoanwwKSE9MCl7TG4ocCtnfDAsa3wwLGp8MCl8MH1uPWYtaHwwO2lmKChufDApIT0oZ3wwKSl7TG4ocCsoaitnKXwwLG0rKGgrZyl8MCxuLWd8MCl8MH1pZigoZHwwKT09MTB8KG18MCk9PTApe289Yis4fDA7Y1tvPj4yXT1wO289ZXwxO2NbYj4+Ml09bztvPW4ranwwO2U9Yis0fDA7Y1tlPj4yXT1vO3A9cCtvfDA7YVtwPj4wXT0wO2k9bDtyZXR1cm59dm4obSk7bz1iKzh8MDtjW28+PjJdPXA7bz1lfDE7Y1tiPj4yXT1vO289bitqfDA7ZT1iKzR8MDtjW2U+PjJdPW87cD1wK298MDthW3A+PjBdPTA7aT1sO3JldHVybn1mdW5jdGlvbiBsZyhiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTA7bD1pO2lmKCgtMTctZHwwKT4+PjA8ZT4+PjApe2RnKCl9aWYoKGFbYj4+MF0mMSk9PTApe2s9YisxfDB9ZWxzZXtrPWNbYis4Pj4yXXwwfWlmKGQ+Pj4wPDIxNDc0ODM2MjMpe2U9ZStkfDA7bj1kPDwxO2U9ZT4+PjA8bj4+PjA/bjplO2lmKGU+Pj4wPDExKXtlPTExfWVsc2V7ZT1lKzE2Ji0xNn19ZWxzZXtlPS0xN31tPShlfDApPT0wPzE6ZTt3aGlsZSgxKXtuPXVuKG0pfDA7aWYoKG58MCkhPTApe2JyZWFrfW49Y1s1NjY2XXwwO2NbNTY2Nl09biswO2lmKChufDApPT0wKXtqPTEzO2JyZWFrfXNjW24mMzFdKCl9aWYoKGp8MCk9PTEzKXtuPVhhKDQpfDA7Y1tuPj4yXT0yMjY4MDt3YihufDAsMjI3MjgsMjA2KX1pZigoZ3wwKSE9MCl7TG4obnwwLGt8MCxnfDApfDB9aWYoKGZ8MCkhPShnfDApKXtMbihuKyhoK2cpfDAsaytnfDAsZi1nfDApfDB9aWYoKGR8MCk9PTEwfChrfDApPT0wKXttPWIrOHwwO2NbbT4+Ml09bjtuPWV8MTtjW2I+PjJdPW47aT1sO3JldHVybn12bihrKTttPWIrOHwwO2NbbT4+Ml09bjtuPWV8MTtjW2I+PjJdPW47aT1sO3JldHVybn1mdW5jdGlvbiBtZyhiKXtiPWJ8MDt2YXIgZD0wLGU9MDtkPWk7aWYoISgoYVtiPj4wXSYxKT09MCk/KGU9Y1tiKzg+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWk9ZDtyZXR1cm59ZnVuY3Rpb24gbmcoYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtlPWk7Zj1kO3doaWxlKDEpe2lmKChjW2Y+PjJdfDApPT0wKXticmVha31lbHNle2Y9Zis0fDB9fWs9ZDtqPWYta3wwO2Y9aj4+MjtsPWFbYj4+MF18MDtpZigobCYxKT09MCl7Zz0xfWVsc2V7bD1jW2I+PjJdfDA7Zz0obCYtMikrIC0xfDA7bD1sJjI1NX1pZighKGc+Pj4wPGY+Pj4wKSl7aWYoKGwmMSk9PTApe2c9Yis0fDB9ZWxzZXtnPWNbYis4Pj4yXXwwfWg9KGZ8MCk9PTA7aWYoZy1rPj4yPj4+MDxmPj4+MCl7aWYoIWgpe2g9Zjtkb3toPWgrIC0xfDA7Y1tnKyhoPDwyKT4+Ml09Y1tkKyhoPDwyKT4+Ml19d2hpbGUoKGh8MCkhPTApfX1lbHNle2lmKCFoKXtoPWc7az1mO3doaWxlKDEpe2s9aysgLTF8MDtjW2g+PjJdPWNbZD4+Ml07aWYoKGt8MCk9PTApe2JyZWFrfWVsc2V7ZD1kKzR8MDtoPWgrNHwwfX19fWNbZysoZjw8Mik+PjJdPTA7aWYoKGFbYj4+MF0mMSk9PTApe2FbYj4+MF09aj4+PjE7aT1lO3JldHVybn1lbHNle2NbYis0Pj4yXT1mO2k9ZTtyZXR1cm59fWlmKCgxMDczNzQxODA2LWd8MCk+Pj4wPChmLWd8MCk+Pj4wKXtkZygpfWlmKChsJjEpPT0wKXtqPWIrNHwwfWVsc2V7aj1jW2IrOD4+Ml18MH1pZihnPj4+MDw1MzY4NzA4ODcpe2s9Zzw8MTtrPWY+Pj4wPGs+Pj4wP2s6ZjtpZihrPj4+MDwyKXtrPTJ9ZWxzZXtrPWsrNCYtNH19ZWxzZXtrPTEwNzM3NDE4MDd9bT1rPDwyO209KG18MCk9PTA/MTptO3doaWxlKDEpe2w9dW4obSl8MDtpZigobHwwKSE9MCl7YnJlYWt9bD1jWzU2NjZdfDA7Y1s1NjY2XT1sKzA7aWYoKGx8MCk9PTApe2g9Mjk7YnJlYWt9c2NbbCYzMV0oKX1pZigoaHwwKT09Mjkpe209WGEoNCl8MDtjW20+PjJdPTIyNjgwO3diKG18MCwyMjcyOCwyMDYpfWlmKChmfDApIT0wKXtoPWY7bT1sO3doaWxlKDEpe2g9aCsgLTF8MDtjW20+PjJdPWNbZD4+Ml07aWYoKGh8MCk9PTApe2JyZWFrfWVsc2V7ZD1kKzR8MDttPW0rNHwwfX19aWYoISgoZ3wwKT09MXwoanwwKT09MCkpe3ZuKGopfWNbYis4Pj4yXT1sO2NbYj4+Ml09a3wxO2NbYis0Pj4yXT1mO2NbbCsoZjw8Mik+PjJdPTA7aT1lO3JldHVybn1mdW5jdGlvbiBvZyhiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2Q9aTtnPWFbYj4+MF18MDtpZigoZyYxKT09MCl7az0xfWVsc2V7Zz1jW2I+PjJdfDA7az0oZyYtMikrIC0xfDA7Zz1nJjI1NX1oPShnJjEpPT0wO2lmKGgpe2Y9KGcmMjU1KT4+PjF9ZWxzZXtmPWNbYis0Pj4yXXwwfWlmKGY+Pj4wPDIpe2U9MX1lbHNle2U9KGYrNCYtNCkrIC0xfDB9aWYoKGV8MCk9PShrfDApKXtpPWQ7cmV0dXJufWRve2lmKChlfDApPT0xKXtuPWIrNHwwO2w9Y1tiKzg+PjJdfDA7aWYoaCl7aj0wO209MTtoPTI2fWVsc2V7Zz1uO2o9MDttPTE7aD0yNX19ZWxzZXtqPShlPDwyKSs0fDA7aj0oanwwKT09MD8xOmo7YTpkb3tpZihlPj4+MD5rPj4+MCl7d2hpbGUoMSl7bj11bihqKXwwO2lmKChufDApIT0wKXticmVhayBhfWs9Y1s1NjY2XXwwO2NbNTY2Nl09ayswO2lmKChrfDApPT0wKXticmVha31zY1trJjMxXSgpfW49WGEoNCl8MDtjW24+PjJdPTIyNjgwO3diKG58MCwyMjcyOCwyMDYpfWVsc2V7d2hpbGUoMSl7bj11bihqKXwwO2lmKChufDApIT0wKXticmVhayBhfWs9Y1s1NjY2XXwwO2NbNTY2Nl09ayswO2lmKChrfDApPT0wKXticmVha31zY1trJjMxXSgpfW49WGEoNCl8MDtjW24+PjJdPTIyNjgwO3diKG58MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZihoKXtqPTE7bD1iKzR8MDttPTA7aD0yNjticmVha31lbHNle2c9bjtqPTE7bD1jW2IrOD4+Ml18MDttPTE7aD0yNTticmVha319fXdoaWxlKDApO2lmKChofDApPT0yNSl7az1jW2IrND4+Ml18MH1lbHNlIGlmKChofDApPT0yNil7az0oZyYyNTUpPj4+MTtnPW59az1rKzF8MDtpZigoa3wwKSE9MCl7bj1sO2g9Zzt3aGlsZSgxKXtrPWsrIC0xfDA7Y1toPj4yXT1jW24+PjJdO2lmKChrfDApPT0wKXticmVha31lbHNle249bis0fDA7aD1oKzR8MH19fWlmKCEobV4xfChsfDApPT0wKSl7dm4obCl9aWYoail7Y1tiPj4yXT1lKzF8MTtjW2IrND4+Ml09ZjtjW2IrOD4+Ml09ZztpPWQ7cmV0dXJufWVsc2V7YVtiPj4wXT1mPDwxO2k9ZDtyZXR1cm59fWZ1bmN0aW9uIHBnKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MDtrPWk7aWYoKDEwNzM3NDE4MDctZHwwKT4+PjA8ZT4+PjApe2RnKCl9aWYoKGFbYj4+MF0mMSk9PTApe2w9Yis0fDB9ZWxzZXtsPWNbYis4Pj4yXXwwfWlmKGQ+Pj4wPDUzNjg3MDg4Nyl7ZT1lK2R8MDtwPWQ8PDE7ZT1lPj4+MDxwPj4+MD9wOmU7aWYoZT4+PjA8Mil7ZT0yfWVsc2V7ZT1lKzQmLTR9fWVsc2V7ZT0xMDczNzQxODA3fW89ZTw8MjtvPShvfDApPT0wPzE6bzt3aGlsZSgxKXttPXVuKG8pfDA7aWYoKG18MCkhPTApe2JyZWFrfW09Y1s1NjY2XXwwO2NbNTY2Nl09bSswO2lmKChtfDApPT0wKXtuPTEzO2JyZWFrfXNjW20mMzFdKCl9aWYoKG58MCk9PTEzKXtwPVhhKDQpfDA7Y1twPj4yXT0yMjY4MDt3YihwfDAsMjI3MjgsMjA2KX1pZigoZ3wwKSE9MCl7bz1nO249bDtwPW07d2hpbGUoMSl7bz1vKyAtMXwwO2NbcD4+Ml09Y1tuPj4yXTtpZigob3wwKT09MCl7YnJlYWt9ZWxzZXtuPW4rNHwwO3A9cCs0fDB9fX1mPWYtaHwwO2lmKChmfDApIT0oZ3wwKSl7Zj1mLWd8MDtoPWwrKGgrZzw8Mil8MDtnPW0rKGorZzw8Mil8MDt3aGlsZSgxKXtmPWYrIC0xfDA7Y1tnPj4yXT1jW2g+PjJdO2lmKChmfDApPT0wKXticmVha31lbHNle2g9aCs0fDA7Zz1nKzR8MH19fWlmKChkfDApPT0xfChsfDApPT0wKXtwPWIrOHwwO2NbcD4+Ml09bTtwPWV8MTtjW2I+PjJdPXA7aT1rO3JldHVybn12bihsKTtwPWIrOHwwO2NbcD4+Ml09bTtwPWV8MTtjW2I+PjJdPXA7aT1rO3JldHVybn1mdW5jdGlvbiBxZyhiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTA7ZT0oY1tiKzI0Pj4yXXwwKT09MDtpZihlKXtjW2IrMTY+PjJdPWR8MX1lbHNle2NbYisxNj4+Ml09ZH1pZigoKGUmMXxkKSZjW2IrMjA+PjJdfDApPT0wKXtyZXR1cm59ZD1YYSgxNil8MDtpZigoYVsxMTAwOF18MCk9PTA/KFFhKDExMDA4KXwwKSE9MDowKXtjWzI3NTBdPTExNzg0OyRhKDExMDA4KX1ZZihkLDEsMTFlMywxMTA1Nik7Y1tkPj4yXT0xMTAyNDt3YihkfDAsMTExMDQsMTMxKX1mdW5jdGlvbiByZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTA7ZT1pO2NbYT4+Ml09MTEwNDg7Zj1jW2ErNDA+PjJdfDA7Yj1hKzMyfDA7ZD1hKzM2fDA7aWYoKGZ8MCkhPTApe2Rve2Y9ZisgLTF8MDtxY1tjWyhjW2I+PjJdfDApKyhmPDwyKT4+Ml0mMzFdKDAsYSxjWyhjW2Q+PjJdfDApKyhmPDwyKT4+Ml18MCl9d2hpbGUoKGZ8MCkhPTApfWY9Y1thKzI4Pj4yXXwwO2g9Zis0fDA7Zz1jW2g+PjJdfDA7Y1toPj4yXT1nKyAtMTtpZigoZ3wwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfXZuKGNbYj4+Ml18MCk7dm4oY1tkPj4yXXwwKTt2bihjW2ErNDg+PjJdfDApO3ZuKGNbYSs2MD4+Ml18MCk7aT1lO3JldHVybn1mdW5jdGlvbiBzZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTEwNjY0O2Q9Y1thKzQ+PjJdfDA7Zj1kKzR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlfDApIT0wKXt2bihhKTtpPWI7cmV0dXJufWxjW2NbKGNbZD4+Ml18MCkrOD4+Ml0mMjU1XShkKTt2bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHRnKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MDtiPWk7Y1thPj4yXT0xMDY2NDthPWNbYSs0Pj4yXXwwO2U9YSs0fDA7ZD1jW2U+PjJdfDA7Y1tlPj4yXT1kKyAtMTtpZigoZHwwKSE9MCl7aT1iO3JldHVybn1sY1tjWyhjW2E+PjJdfDApKzg+PjJdJjI1NV0oYSk7aT1iO3JldHVybn1mdW5jdGlvbiB1ZyhhLGIpe2E9YXwwO2I9YnwwO3JldHVybn1mdW5jdGlvbiB2ZyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGF8MH1mdW5jdGlvbiB3ZyhhLGIsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7Zz1hO2NbZz4+Ml09MDtjW2crND4+Ml09MDtnPWErOHwwO2NbZz4+Ml09LTE7Y1tnKzQ+PjJdPS0xO3JldHVybn1mdW5jdGlvbiB4ZyhhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtlPWE7Y1tlPj4yXT0wO2NbZSs0Pj4yXT0wO2U9YSs4fDA7Y1tlPj4yXT0tMTtjW2UrND4+Ml09LTE7cmV0dXJufWZ1bmN0aW9uIHlnKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIHpnKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIEFnKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaj0wLGs9MDtmPWk7aWYoKGV8MCk8PTApe2s9MDtpPWY7cmV0dXJuIGt8MH1nPWIrMTJ8MDtoPWIrMTZ8MDtqPTA7d2hpbGUoMSl7az1jW2c+PjJdfDA7aWYoaz4+PjA8KGNbaD4+Ml18MCk+Pj4wKXtjW2c+PjJdPWsrMTtrPWFbaz4+MF18MH1lbHNle2s9b2NbY1soY1tiPj4yXXwwKSs0MD4+Ml0mMTI3XShiKXwwO2lmKChrfDApPT0tMSl7ZT04O2JyZWFrfWs9ayYyNTV9YVtkPj4wXT1rO2o9aisxfDA7aWYoKGp8MCk8KGV8MCkpe2Q9ZCsxfDB9ZWxzZXtlPTg7YnJlYWt9fWlmKChlfDApPT04KXtpPWY7cmV0dXJuIGp8MH1yZXR1cm4gMH1mdW5jdGlvbiBCZyhhKXthPWF8MDtyZXR1cm4tMX1mdW5jdGlvbiBDZyhhKXthPWF8MDt2YXIgYj0wLGU9MDtiPWk7aWYoKG9jW2NbKGNbYT4+Ml18MCkrMzY+PjJdJjEyN10oYSl8MCk9PS0xKXthPS0xO2k9YjtyZXR1cm4gYXwwfWU9YSsxMnwwO2E9Y1tlPj4yXXwwO2NbZT4+Ml09YSsxO2E9ZFthPj4wXXwwO2k9YjtyZXR1cm4gYXwwfWZ1bmN0aW9uIERnKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuLTF9ZnVuY3Rpb24gRWcoYixlLGYpe2I9YnwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtnPWk7aWYoKGZ8MCk8PTApe2w9MDtpPWc7cmV0dXJuIGx8MH1qPWIrMjR8MDtoPWIrMjh8MDtrPTA7d2hpbGUoMSl7bD1jW2o+PjJdfDA7aWYoIShsPj4+MDwoY1toPj4yXXwwKT4+PjApKXtpZigoeGNbY1soY1tiPj4yXXwwKSs1Mj4+Ml0mNjNdKGIsZFtlPj4wXXwwKXwwKT09LTEpe2g9NzticmVha319ZWxzZXttPWFbZT4+MF18MDtjW2o+PjJdPWwrMTthW2w+PjBdPW19az1rKzF8MDtpZigoa3wwKTwoZnwwKSl7ZT1lKzF8MH1lbHNle2g9NzticmVha319aWYoKGh8MCk9PTcpe2k9ZztyZXR1cm4ga3wwfXJldHVybiAwfWZ1bmN0aW9uIEZnKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuLTF9ZnVuY3Rpb24gR2coYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT0xMDcyODtkPWNbYSs0Pj4yXXwwO2Y9ZCs0fDA7ZT1jW2Y+PjJdfDA7Y1tmPj4yXT1lKyAtMTtpZigoZXwwKSE9MCl7dm4oYSk7aT1iO3JldHVybn1sY1tjWyhjW2Q+PjJdfDApKzg+PjJdJjI1NV0oZCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBIZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2NbYT4+Ml09MTA3Mjg7YT1jW2ErND4+Ml18MDtlPWErNHwwO2Q9Y1tlPj4yXXwwO2NbZT4+Ml09ZCsgLTE7aWYoKGR8MCkhPTApe2k9YjtyZXR1cm59bGNbY1soY1thPj4yXXwwKSs4Pj4yXSYyNTVdKGEpO2k9YjtyZXR1cm59ZnVuY3Rpb24gSWcoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm59ZnVuY3Rpb24gSmcoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBhfDB9ZnVuY3Rpb24gS2coYSxiLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2c9YTtjW2c+PjJdPTA7Y1tnKzQ+PjJdPTA7Zz1hKzh8MDtjW2c+PjJdPS0xO2NbZys0Pj4yXT0tMTtyZXR1cm59ZnVuY3Rpb24gTGcoYSxiLGQsZSl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7ZT1hO2NbZT4+Ml09MDtjW2UrND4+Ml09MDtlPWErOHwwO2NbZT4+Ml09LTE7Y1tlKzQ+PjJdPS0xO3JldHVybn1mdW5jdGlvbiBNZyhhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBOZyhhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBPZyhhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTA7ZT1pO2lmKChkfDApPD0wKXtqPTA7aT1lO3JldHVybiBqfDB9Zz1hKzEyfDA7Zj1hKzE2fDA7aD0wO3doaWxlKDEpe2o9Y1tnPj4yXXwwO2lmKCEoaj4+PjA8KGNbZj4+Ml18MCk+Pj4wKSl7aj1vY1tjWyhjW2E+PjJdfDApKzQwPj4yXSYxMjddKGEpfDA7aWYoKGp8MCk9PS0xKXthPTg7YnJlYWt9fWVsc2V7Y1tnPj4yXT1qKzQ7aj1jW2o+PjJdfDB9Y1tiPj4yXT1qO2g9aCsxfDA7aWYoKGh8MCk+PShkfDApKXthPTg7YnJlYWt9Yj1iKzR8MH1pZigoYXwwKT09OCl7aT1lO3JldHVybiBofDB9cmV0dXJuIDB9ZnVuY3Rpb24gUGcoYSl7YT1hfDA7cmV0dXJuLTF9ZnVuY3Rpb24gUWcoYSl7YT1hfDA7dmFyIGI9MCxkPTA7Yj1pO2lmKChvY1tjWyhjW2E+PjJdfDApKzM2Pj4yXSYxMjddKGEpfDApPT0tMSl7YT0tMTtpPWI7cmV0dXJuIGF8MH1kPWErMTJ8MDthPWNbZD4+Ml18MDtjW2Q+PjJdPWErNDthPWNbYT4+Ml18MDtpPWI7cmV0dXJuIGF8MH1mdW5jdGlvbiBSZyhhLGIpe2E9YXwwO2I9YnwwO3JldHVybi0xfWZ1bmN0aW9uIFNnKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTA7ZT1pO2lmKChkfDApPD0wKXtqPTA7aT1lO3JldHVybiBqfDB9Zz1hKzI0fDA7Zj1hKzI4fDA7aD0wO3doaWxlKDEpe2o9Y1tnPj4yXXwwO2lmKCEoaj4+PjA8KGNbZj4+Ml18MCk+Pj4wKSl7aWYoKHhjW2NbKGNbYT4+Ml18MCkrNTI+PjJdJjYzXShhLGNbYj4+Ml18MCl8MCk9PS0xKXtmPTg7YnJlYWt9fWVsc2V7az1jW2I+PjJdfDA7Y1tnPj4yXT1qKzQ7Y1tqPj4yXT1rfWg9aCsxfDA7aWYoKGh8MCk+PShkfDApKXtmPTg7YnJlYWt9Yj1iKzR8MH1pZigoZnwwKT09OCl7aT1lO3JldHVybiBofDB9cmV0dXJuIDB9ZnVuY3Rpb24gVGcoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4tMX1mdW5jdGlvbiBVZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBWZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBXZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2U9Y1soY1thPj4yXXwwKSsgLTEyPj4yXXwwO2Q9YStlfDA7cmcoYSsoZSs4KXwwKTtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFhnKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErKChjWyhjW2E+PjJdfDApKyAtMTI+PjJdfDApKzgpfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gWWcoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7aT1pKzE2fDA7ZT1kO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2lmKChjW2IrKGYrMjQpPj4yXXwwKT09MCl7aT1kO3JldHVybn1hW2U+PjBdPTA7Y1tlKzQ+PjJdPWI7aWYoKGNbYisoZisxNik+PjJdfDApPT0wKXtnPWNbYisoZis3Mik+PjJdfDA7aWYoKGd8MCkhPTApe1lnKGcpO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwfWFbZT4+MF09MTtnPWNbYisoZisyNCk+PjJdfDA7aWYoKG9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MCk9PS0xKXtnPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK2d8MCxjW2IrKGcrMTYpPj4yXXwxKX19Z2goZSk7aT1kO3JldHVybn1mdW5jdGlvbiBaZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBfZyhhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzh8MCk7aT1iO3JldHVybn1mdW5jdGlvbiAkZyhhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2U9Y1soY1thPj4yXXwwKSsgLTEyPj4yXXwwO2Q9YStlfDA7cmcoYSsoZSs4KXwwKTtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGFoKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErKChjWyhjW2E+PjJdfDApKyAtMTI+PjJdfDApKzgpfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gYmgoYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MDtkPWk7aT1pKzE2fDA7ZT1kO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2lmKChjW2IrKGYrMjQpPj4yXXwwKT09MCl7aT1kO3JldHVybn1hW2U+PjBdPTA7Y1tlKzQ+PjJdPWI7aWYoKGNbYisoZisxNik+PjJdfDApPT0wKXtnPWNbYisoZis3Mik+PjJdfDA7aWYoKGd8MCkhPTApe2JoKGcpO2Y9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwfWFbZT4+MF09MTtnPWNbYisoZisyNCk+PjJdfDA7aWYoKG9jW2NbKGNbZz4+Ml18MCkrMjQ+PjJdJjEyN10oZyl8MCk9PS0xKXtnPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK2d8MCxjW2IrKGcrMTYpPj4yXXwxKX19cWgoZSk7aT1kO3JldHVybn1mdW5jdGlvbiBjaChhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzR8MCk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiBkaChhKXthPWF8MDt2YXIgYj0wO2I9aTtyZyhhKzR8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBlaChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2U9Y1soY1thPj4yXXwwKSsgLTEyPj4yXXwwO2Q9YStlfDA7cmcoYSsoZSs0KXwwKTtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIGZoKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErKChjWyhjW2E+PjJdfDApKyAtMTI+PjJdfDApKzQpfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gZ2goYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wO2I9aTthPWErNHwwO2Q9Y1thPj4yXXwwO2U9Y1soY1tkPj4yXXwwKSsgLTEyPj4yXXwwO2lmKChjW2QrKGUrMjQpPj4yXXwwKT09MCl7aT1iO3JldHVybn1pZigoY1tkKyhlKzE2KT4+Ml18MCkhPTApe2k9YjtyZXR1cm59aWYoKGNbZCsoZSs0KT4+Ml0mODE5MnwwKT09MCl7aT1iO3JldHVybn1pZihZYSgpfDApe2k9YjtyZXR1cm59ZT1jW2E+PjJdfDA7ZT1jW2UrKChjWyhjW2U+PjJdfDApKyAtMTI+PjJdfDApKzI0KT4+Ml18MDtpZighKChvY1tjWyhjW2U+PjJdfDApKzI0Pj4yXSYxMjddKGUpfDApPT0tMSkpe2k9YjtyZXR1cm59ZD1jW2E+PjJdfDA7ZT1jWyhjW2Q+PjJdfDApKyAtMTI+PjJdfDA7cWcoZCtlfDAsY1tkKyhlKzE2KT4+Ml18MSk7aT1iO3JldHVybn1mdW5jdGlvbiBoaChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2g9aTtpPWkrMzJ8MDtrPWg7aj1oKzI0fDA7Zz1oKzE2fDA7Zj1oKzEyfDA7YVtnPj4wXT0wO2NbZys0Pj4yXT1iO249Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2IrKG4rMTYpPj4yXXwwKT09MCl7bT1jW2IrKG4rNzIpPj4yXXwwO2lmKChtfDApIT0wKXtZZyhtKTtuPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MH1hW2c+PjBdPTE7bz1jW2IrKG4rMjgpPj4yXXwwO3A9bys0fDA7Y1twPj4yXT0oY1twPj4yXXwwKSsxO2lmKCEoKGNbMzA0OF18MCk9PS0xKSl7Y1trPj4yXT0xMjE5MjtjW2srND4+Ml09MjA4O2Nbays4Pj4yXT0wO2NnKDEyMTkyLGspfW49KGNbMTIxOTY+PjJdfDApKyAtMXwwO209Y1tvKzg+PjJdfDA7aWYoKGNbbysxMj4+Ml18MCktbT4+Mj4+PjA+bj4+PjA/KGU9Y1ttKyhuPDwyKT4+Ml18MCwoZXwwKSE9MCk6MCl7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfXE9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO209Y1tiKyhxKzI0KT4+Ml18MDtuPWIrcXwwO289YisocSs3Nil8MDtwPWNbbz4+Ml18MDtkb3tpZigocHwwKT09LTEpe3E9Y1tiKyhxKzI4KT4+Ml18MDtwPXErNHwwO2NbcD4+Ml09KGNbcD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NTY7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ1NixrKX1yPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtzPWNbcSs4Pj4yXXwwO2lmKChjW3ErMTI+PjJdfDApLXM+PjI+Pj4wPnI+Pj4wPyhsPWNbcysocjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe2w9eGNbY1soY1tsPj4yXXwwKSsyOD4+Ml0mNjNdKGwsMzIpfDA7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfXA9bDw8MjQ+PjI0O2Nbbz4+Ml09cDticmVha31zPVhhKDQpfDA7Y1tzPj4yXT0yMTMwNDt3YihzfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7cj1wJjI1NTtzPWQmNjU1MzU7cT1jWyhjW2U+PjJdfDApKzI0Pj4yXXwwO2Nbaj4+Ml09bTtjW2srMD4+Ml09Y1tqKzA+PjJdO3djW3EmNjNdKGYsZSxrLG4scixzKTtpZigoY1tmPj4yXXwwKSE9MCl7YnJlYWt9cz1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7cWcoYitzfDAsY1tiKyhzKzE2KT4+Ml18NSk7YnJlYWt9cz1YYSg0KXwwO2Nbcz4+Ml09MjEzMDQ7d2Ioc3wwLDIxMzc2LDE5Nil9fXdoaWxlKDApO2doKGcpO2k9aDtyZXR1cm4gYnwwfWZ1bmN0aW9uIGloKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7aD1pO2k9aSszMnwwO2s9aDtqPWgrMjR8MDtnPWgrMTZ8MDtmPWgrMTJ8MDthW2c+PjBdPTA7Y1tnKzQ+PjJdPWI7bj1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7ZG97aWYoKGNbYisobisxNik+PjJdfDApPT0wKXttPWNbYisobis3Mik+PjJdfDA7aWYoKG18MCkhPTApe1lnKG0pO249Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwfWFbZz4+MF09MTtvPWNbYisobisyOCk+PjJdfDA7cD1vKzR8MDtjW3A+PjJdPShjW3A+PjJdfDApKzE7aWYoISgoY1szMDQ4XXwwKT09LTEpKXtjW2s+PjJdPTEyMTkyO2Nbays0Pj4yXT0yMDg7Y1trKzg+PjJdPTA7Y2coMTIxOTIsayl9bj0oY1sxMjE5Nj4+Ml18MCkrIC0xfDA7bT1jW28rOD4+Ml18MDtpZigoY1tvKzEyPj4yXXwwKS1tPj4yPj4+MD5uPj4+MD8oZT1jW20rKG48PDIpPj4yXXwwLChlfDApIT0wKTowKXtzPWNbcD4+Ml18MDtjW3A+PjJdPXMrIC0xO2lmKChzfDApPT0wKXtsY1tjWyhjW28+PjJdfDApKzg+PjJdJjI1NV0obyl9cT1jWyhjW2I+PjJdfDApKyAtMTI+PjJdfDA7bT1jW2IrKHErMjQpPj4yXXwwO249YitxfDA7bz1iKyhxKzc2KXwwO3A9Y1tvPj4yXXwwO2Rve2lmKChwfDApPT0tMSl7cT1jW2IrKHErMjgpPj4yXXwwO3A9cSs0fDA7Y1twPj4yXT0oY1twPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1trPj4yXT0xMzQ1NjtjW2srND4+Ml09MjA4O2Nbays4Pj4yXT0wO2NnKDEzNDU2LGspfXI9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3M9Y1txKzg+PjJdfDA7aWYoKGNbcSsxMj4+Ml18MCktcz4+Mj4+PjA+cj4+PjA/KGw9Y1tzKyhyPDwyKT4+Ml18MCwobHwwKSE9MCk6MCl7bD14Y1tjWyhjW2w+PjJdfDApKzI4Pj4yXSY2M10obCwzMil8MDtzPWNbcD4+Ml18MDtjW3A+PjJdPXMrIC0xO2lmKChzfDApPT0wKXtsY1tjWyhjW3E+PjJdfDApKzg+PjJdJjI1NV0ocSl9cD1sPDwyND4+MjQ7Y1tvPj4yXT1wO2JyZWFrfXM9WGEoNCl8MDtjW3M+PjJdPTIxMzA0O3diKHN8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtzPXAmMjU1O3I9Y1soY1tlPj4yXXwwKSsxNj4+Ml18MDtjW2o+PjJdPW07Y1trKzA+PjJdPWNbaiswPj4yXTt3Y1tyJjYzXShmLGUsayxuLHMsZCk7aWYoKGNbZj4+Ml18MCkhPTApe2JyZWFrfXM9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO3FnKGIrc3wwLGNbYisocysxNik+PjJdfDUpO2JyZWFrfXM9WGEoNCl8MDtjW3M+PjJdPTIxMzA0O3diKHN8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtnaChnKTtpPWg7cmV0dXJuIGJ8MH1mdW5jdGlvbiBqaChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2g9aTtpPWkrMzJ8MDtrPWg7aj1oKzI0fDA7Zz1oKzE2fDA7Zj1oKzEyfDA7YVtnPj4wXT0wO2NbZys0Pj4yXT1iO249Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2IrKG4rMTYpPj4yXXwwKT09MCl7bT1jW2IrKG4rNzIpPj4yXXwwO2lmKChtfDApIT0wKXtZZyhtKTtuPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MH1hW2c+PjBdPTE7bz1jW2IrKG4rMjgpPj4yXXwwO3A9bys0fDA7Y1twPj4yXT0oY1twPj4yXXwwKSsxO2lmKCEoKGNbMzA0OF18MCk9PS0xKSl7Y1trPj4yXT0xMjE5MjtjW2srND4+Ml09MjA4O2Nbays4Pj4yXT0wO2NnKDEyMTkyLGspfW49KGNbMTIxOTY+PjJdfDApKyAtMXwwO209Y1tvKzg+PjJdfDA7aWYoKGNbbysxMj4+Ml18MCktbT4+Mj4+PjA+bj4+PjA/KGU9Y1ttKyhuPDwyKT4+Ml18MCwoZXwwKSE9MCk6MCl7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfXE9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO209Y1tiKyhxKzI0KT4+Ml18MDtuPWIrcXwwO289YisocSs3Nil8MDtwPWNbbz4+Ml18MDtkb3tpZigocHwwKT09LTEpe3E9Y1tiKyhxKzI4KT4+Ml18MDtwPXErNHwwO2NbcD4+Ml09KGNbcD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NTY7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ1NixrKX1yPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtzPWNbcSs4Pj4yXXwwO2lmKChjW3ErMTI+PjJdfDApLXM+PjI+Pj4wPnI+Pj4wPyhsPWNbcysocjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe2w9eGNbY1soY1tsPj4yXXwwKSsyOD4+Ml0mNjNdKGwsMzIpfDA7cz1jW3A+PjJdfDA7Y1twPj4yXT1zKyAtMTtpZigoc3wwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfXA9bDw8MjQ+PjI0O2Nbbz4+Ml09cDticmVha31zPVhhKDQpfDA7Y1tzPj4yXT0yMTMwNDt3YihzfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7cz1wJjI1NTtyPWNbKGNbZT4+Ml18MCkrMjQ+PjJdfDA7Y1tqPj4yXT1tO2NbayswPj4yXT1jW2orMD4+Ml07d2NbciY2M10oZixlLGssbixzLGQpO2lmKChjW2Y+PjJdfDApIT0wKXticmVha31zPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MDtxZyhiK3N8MCxjW2IrKHMrMTYpPj4yXXw1KTticmVha31zPVhhKDQpfDA7Y1tzPj4yXT0yMTMwNDt3YihzfDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7Z2goZyk7aT1oO3JldHVybiBifDB9ZnVuY3Rpb24ga2goYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wO2g9aTtpPWkrMzJ8MDtsPWg7aj1oKzI0fDA7Zz1oKzE2fDA7Zj1oKzEyfDA7YVtnPj4wXT0wO2NbZys0Pj4yXT1iO289Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO2Rve2lmKChjW2IrKG8rMTYpPj4yXXwwKT09MCl7bj1jW2IrKG8rNzIpPj4yXXwwO2lmKChufDApIT0wKXtZZyhuKTtvPWNbKGNbYj4+Ml18MCkrIC0xMj4+Ml18MH1hW2c+PjBdPTE7cD1jW2IrKG8rMjgpPj4yXXwwO3E9cCs0fDA7Y1txPj4yXT0oY1txPj4yXXwwKSsxO2lmKCEoKGNbMzA0OF18MCk9PS0xKSl7Y1tsPj4yXT0xMjE5MjtjW2wrND4+Ml09MjA4O2NbbCs4Pj4yXT0wO2NnKDEyMTkyLGwpfW89KGNbMTIxOTY+PjJdfDApKyAtMXwwO249Y1twKzg+PjJdfDA7aWYoKGNbcCsxMj4+Ml18MCktbj4+Mj4+PjA+bz4+PjA/KGs9Y1tuKyhvPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7dD1jW3E+PjJdfDA7Y1txPj4yXT10KyAtMTtpZigodHwwKT09MCl7bGNbY1soY1twPj4yXXwwKSs4Pj4yXSYyNTVdKHApfXI9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO249Y1tiKyhyKzI0KT4+Ml18MDtvPWIrcnwwO3A9Yisocis3Nil8MDtxPWNbcD4+Ml18MDtkb3tpZigocXwwKT09LTEpe3I9Y1tiKyhyKzI4KT4+Ml18MDtxPXIrNHwwO2NbcT4+Ml09KGNbcT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1zPShjWzEzNDYwPj4yXXwwKSsgLTF8MDt0PWNbcis4Pj4yXXwwO2lmKChjW3IrMTI+PjJdfDApLXQ+PjI+Pj4wPnM+Pj4wPyhtPWNbdCsoczw8Mik+PjJdfDAsKG18MCkhPTApOjApe209eGNbY1soY1ttPj4yXXwwKSsyOD4+Ml0mNjNdKG0sMzIpfDA7dD1jW3E+PjJdfDA7Y1txPj4yXT10KyAtMTtpZigodHwwKT09MCl7bGNbY1soY1tyPj4yXXwwKSs4Pj4yXSYyNTVdKHIpfXE9bTw8MjQ+PjI0O2NbcD4+Ml09cTticmVha310PVhhKDQpfDA7Y1t0Pj4yXT0yMTMwNDt3Yih0fDAsMjEzNzYsMTk2KX19d2hpbGUoMCk7dD1xJjI1NTtzPWNbKGNbaz4+Ml18MCkrMjg+PjJdfDA7Y1tqPj4yXT1uO2NbbCswPj4yXT1jW2orMD4+Ml07aWNbcyY2M10oZixrLGwsbyx0LGQsZSk7aWYoKGNbZj4+Ml18MCkhPTApe2JyZWFrfXQ9Y1soY1tiPj4yXXwwKSsgLTEyPj4yXXwwO3FnKGIrdHwwLGNbYisodCsxNik+PjJdfDUpO2JyZWFrfXQ9WGEoNCl8MDtjW3Q+PjJdPTIxMzA0O3diKHR8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtnaChnKTtpPWg7cmV0dXJuIGJ8MH1mdW5jdGlvbiBsaChiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2U9aTtpPWkrMTZ8MDtmPWU7YVtmPj4wXT0wO2NbZis0Pj4yXT1iO2g9Y1tiPj4yXXwwO2c9Y1toKyAtMTI+PjJdfDA7ZG97aWYoKGNbYisoZysxNik+PjJdfDApPT0wKXtqPWNbYisoZys3Mik+PjJdfDA7aWYoKGp8MCkhPTApe1lnKGopO2c9Y1tiPj4yXXwwO2g9ZztnPWNbZysgLTEyPj4yXXwwfWFbZj4+MF09MTtnPWNbYisoZysyNCk+PjJdfDA7aWYoKGd8MCkhPTApe2o9ZysyNHwwO2g9Y1tqPj4yXXwwO2lmKChofDApIT0oY1tnKzI4Pj4yXXwwKSl7Y1tqPj4yXT1oKzE7YVtoPj4wXT1kO2JyZWFrfWlmKCEoKHhjW2NbKGNbZz4+Ml18MCkrNTI+PjJdJjYzXShnLGQmMjU1KXwwKT09LTEpKXticmVha31oPWNbYj4+Ml18MH1qPWNbaCsgLTEyPj4yXXwwO3FnKGIranwwLGNbYisoaisxNik+PjJdfDEpfX13aGlsZSgwKTtnaChmKTtpPWU7cmV0dXJufWZ1bmN0aW9uIG1oKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErNHwwKTtpZigoYXwwKT09MCl7aT1iO3JldHVybn12bihhKTtpPWI7cmV0dXJufWZ1bmN0aW9uIG5oKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO3JnKGErNHwwKTtpPWI7cmV0dXJufWZ1bmN0aW9uIG9oKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MDtiPWk7ZT1jWyhjW2E+PjJdfDApKyAtMTI+PjJdfDA7ZD1hK2V8MDtyZyhhKyhlKzQpfDApO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gcGgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7cmcoYSsoKGNbKGNbYT4+Ml18MCkrIC0xMj4+Ml18MCkrNCl8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBxaChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTA7Yj1pO2E9YSs0fDA7ZD1jW2E+PjJdfDA7ZT1jWyhjW2Q+PjJdfDApKyAtMTI+PjJdfDA7aWYoKGNbZCsoZSsyNCk+PjJdfDApPT0wKXtpPWI7cmV0dXJufWlmKChjW2QrKGUrMTYpPj4yXXwwKSE9MCl7aT1iO3JldHVybn1pZigoY1tkKyhlKzQpPj4yXSY4MTkyfDApPT0wKXtpPWI7cmV0dXJufWlmKFlhKCl8MCl7aT1iO3JldHVybn1lPWNbYT4+Ml18MDtlPWNbZSsoKGNbKGNbZT4+Ml18MCkrIC0xMj4+Ml18MCkrMjQpPj4yXXwwO2lmKCEoKG9jW2NbKGNbZT4+Ml18MCkrMjQ+PjJdJjEyN10oZSl8MCk9PS0xKSl7aT1iO3JldHVybn1kPWNbYT4+Ml18MDtlPWNbKGNbZD4+Ml18MCkrIC0xMj4+Ml18MDtxZyhkK2V8MCxjW2QrKGUrMTYpPj4yXXwxKTtpPWI7cmV0dXJufWZ1bmN0aW9uIHJoKGEpe2E9YXwwO3JldHVybiAxMDk0NH1mdW5jdGlvbiBzaChiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTA7ZD1pO2lmKChlfDApPT0xKXtlZyhiLDEwOTYwLDM1KTtpPWQ7cmV0dXJufWc9TmIoZXwwKXwwO2U9Sm4oZ3wwKXwwO2lmKGU+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9ZG97aWYoZT4+PjA8MTEpe2FbYj4+MF09ZTw8MTtrPWIrMXwwfWVsc2V7aD1lKzE2Ji0xNjtqPShofDApPT0wPzE6aDt3aGlsZSgxKXtrPXVuKGopfDA7aWYoKGt8MCkhPTApe2Y9MTI7YnJlYWt9az1jWzU2NjZdfDA7Y1s1NjY2XT1rKzA7aWYoKGt8MCk9PTApe2JyZWFrfXNjW2smMzFdKCl9aWYoKGZ8MCk9PTEyKXtjW2IrOD4+Ml09aztjW2I+PjJdPWh8MTtjW2IrND4+Ml09ZTticmVha31rPVhhKDQpfDA7Y1trPj4yXT0yMjY4MDt3YihrfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7TG4oa3wwLGd8MCxlfDApfDA7YVtrK2U+PjBdPTA7aT1kO3JldHVybn1mdW5jdGlvbiB0aChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gdWgoYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MDtiPWk7Y1thPj4yXT05OTI4O2Q9YSs0fDA7Zj0oY1tkPj4yXXwwKSsgLTR8MDtlPWNbZj4+Ml18MDtjW2Y+PjJdPWUrIC0xO2lmKChlKyAtMXwwKTwwKXt2bigoY1tkPj4yXXwwKSsgLTEyfDApfVJiKGF8MCk7dm4oYSk7aT1iO3JldHVybn1mdW5jdGlvbiB2aChhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wO2I9aTtjW2E+PjJdPTk5Mjg7ZD1hKzR8MDtmPShjW2Q+PjJdfDApKyAtNHwwO2U9Y1tmPj4yXXwwO2NbZj4+Ml09ZSsgLTE7aWYoKGUrIC0xfDApPj0wKXtSYihhfDApO2k9YjtyZXR1cm59dm4oKGNbZD4+Ml18MCkrIC0xMnwwKTtSYihhfDApO2k9YjtyZXR1cm59ZnVuY3Rpb24gd2goYSl7YT1hfDA7dmFyIGI9MDtiPWk7cmcoYSk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geGgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geWgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gemgoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEFoKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBCaChiLGMsZCxlLGYpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MDtiPWk7YTpkb3tpZigoZXwwKT09KGZ8MCkpe2c9Nn1lbHNle3doaWxlKDEpe2lmKChjfDApPT0oZHwwKSl7ZD0tMTticmVhayBhfWg9YVtjPj4wXXwwO2o9YVtlPj4wXXwwO2lmKGg8PDI0Pj4yNDxqPDwyND4+MjQpe2Q9LTE7YnJlYWsgYX1pZihqPDwyND4+MjQ8aDw8MjQ+PjI0KXtkPTE7YnJlYWsgYX1jPWMrMXwwO2U9ZSsxfDA7aWYoKGV8MCk9PShmfDApKXtnPTY7YnJlYWt9fX19d2hpbGUoMCk7aWYoKGd8MCk9PTYpe2Q9KGN8MCkhPShkfDApJjF9aT1iO3JldHVybiBkfDB9ZnVuY3Rpb24gQ2goYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wO2Q9aTtnPWU7aj1mLWd8MDtpZihqPj4+MD40Mjk0OTY3Mjc5KXtkZygpfWRve2lmKGo+Pj4wPDExKXthW2I+PjBdPWo8PDE7bT1iKzF8MH1lbHNle2s9aisxNiYtMTY7bD0oa3wwKT09MD8xOms7d2hpbGUoMSl7bT11bihsKXwwO2lmKChtfDApIT0wKXtoPTExO2JyZWFrfW09Y1s1NjY2XXwwO2NbNTY2Nl09bSswO2lmKChtfDApPT0wKXticmVha31zY1ttJjMxXSgpfWlmKChofDApPT0xMSl7Y1tiKzg+PjJdPW07Y1tiPj4yXT1rfDE7Y1tiKzQ+PjJdPWo7YnJlYWt9bT1YYSg0KXwwO2NbbT4+Ml09MjI2ODA7d2IobXwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKChlfDApPT0oZnwwKSl7YVttPj4wXT0wO2k9ZDtyZXR1cm59ZWxzZXtiPW19d2hpbGUoMSl7YVtiPj4wXT1hW2U+PjBdfDA7ZT1lKzF8MDtpZigoZXwwKT09KGZ8MCkpe2JyZWFrfWVsc2V7Yj1iKzF8MH19bT1tKyhmKygwLWcpKXwwO2FbbT4+MF09MDtpPWQ7cmV0dXJufWZ1bmN0aW9uIERoKGIsYyxkKXtiPWJ8MDtjPWN8MDtkPWR8MDt2YXIgZT0wLGY9MDtiPWk7aWYoKGN8MCk9PShkfDApKXtlPTA7aT1iO3JldHVybiBlfDB9ZWxzZXtlPTB9ZG97ZT0oYVtjPj4wXXwwKSsoZTw8NCl8MDtmPWUmLTI2ODQzNTQ1NjtlPShmPj4+MjR8ZileZTtjPWMrMXwwfXdoaWxlKChjfDApIT0oZHwwKSk7aT1iO3JldHVybiBlfDB9ZnVuY3Rpb24gRWgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gRmgoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEdoKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wO2E9aTthOmRve2lmKChlfDApPT0oZnwwKSl7Zz02fWVsc2V7d2hpbGUoMSl7aWYoKGJ8MCk9PShkfDApKXtkPS0xO2JyZWFrIGF9aD1jW2I+PjJdfDA7aj1jW2U+PjJdfDA7aWYoKGh8MCk8KGp8MCkpe2Q9LTE7YnJlYWsgYX1pZigoanwwKTwoaHwwKSl7ZD0xO2JyZWFrIGF9Yj1iKzR8MDtlPWUrNHwwO2lmKChlfDApPT0oZnwwKSl7Zz02O2JyZWFrfX19fXdoaWxlKDApO2lmKChnfDApPT02KXtkPShifDApIT0oZHwwKSYxfWk9YTtyZXR1cm4gZHwwfWZ1bmN0aW9uIEhoKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MDtkPWk7aD1lO2s9Zi1ofDA7aj1rPj4yO2lmKGo+Pj4wPjEwNzM3NDE4MDcpe2RnKCl9ZG97aWYoaj4+PjA8Mil7YVtiPj4wXT1rPj4+MTttPWIrNHwwfWVsc2V7az1qKzQmLTQ7bD1rPDwyO2w9KGx8MCk9PTA/MTpsO3doaWxlKDEpe209dW4obCl8MDtpZigobXwwKSE9MCl7Zz0xMTticmVha31tPWNbNTY2Nl18MDtjWzU2NjZdPW0rMDtpZigobXwwKT09MCl7YnJlYWt9c2NbbSYzMV0oKX1pZigoZ3wwKT09MTEpe2NbYis4Pj4yXT1tO2NbYj4+Ml09a3wxO2NbYis0Pj4yXT1qO2JyZWFrfW09WGEoNCl8MDtjW20+PjJdPTIyNjgwO3diKG18MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtpZigoZXwwKT09KGZ8MCkpe2NbbT4+Ml09MDtpPWQ7cmV0dXJufWI9ZisgLTQrKDAtaCl8MDtnPW07d2hpbGUoMSl7Y1tnPj4yXT1jW2U+PjJdO2U9ZSs0fDA7aWYoKGV8MCk9PShmfDApKXticmVha31lbHNle2c9Zys0fDB9fW09bSsoKGI+Pj4yKSsxPDwyKXwwO2NbbT4+Ml09MDtpPWQ7cmV0dXJufWZ1bmN0aW9uIEloKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MDthPWk7aWYoKGJ8MCk9PShkfDApKXtlPTA7aT1hO3JldHVybiBlfDB9ZWxzZXtlPTB9ZG97ZT0oY1tiPj4yXXwwKSsoZTw8NCl8MDtmPWUmLTI2ODQzNTQ1NjtlPShmPj4+MjR8ZileZTtiPWIrNHwwfXdoaWxlKChifDApIT0oZHwwKSk7aT1hO3JldHVybiBlfDB9ZnVuY3Rpb24gSmgoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gS2goYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIExoKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2s9aTtpPWkrNjR8MDtwPWs7dT1rKzQ4fDA7cT1rKzUyfDA7dD1rKzU2fDA7cz1rKzE2fDA7cj1rKzEyfDA7bD1rKzI0fDA7aWYoKGNbZys0Pj4yXSYxfDApPT0wKXtjW3E+PjJdPS0xO2w9Y1soY1tkPj4yXXwwKSsxNj4+Ml18MDtjW3M+PjJdPWNbZT4+Ml07Y1tyPj4yXT1jW2Y+PjJdO2NbdSswPj4yXT1jW3MrMD4+Ml07Y1twKzA+PjJdPWNbciswPj4yXTtpY1tsJjYzXSh0LGQsdSxwLGcsaCxxKTtsPWNbdD4+Ml18MDtjW2U+PjJdPWw7ZT1jW3E+PjJdfDA7aWYoKGV8MCk9PTApe2Fbaj4+MF09MH1lbHNlIGlmKChlfDApPT0xKXthW2o+PjBdPTF9ZWxzZXthW2o+PjBdPTE7Y1toPj4yXT00fWNbYj4+Ml09bDtpPWs7cmV0dXJufXE9ZysyOHwwO3I9Y1txPj4yXXwwO2Q9cis0fDA7Y1tkPj4yXT0oY1tkPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1twPj4yXT0xMzQ1NjtjW3ArND4+Ml09MjA4O2NbcCs4Pj4yXT0wO2NnKDEzNDU2LHApfXM9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3Q9Y1tyKzg+PjJdfDA7aWYoKGNbcisxMj4+Ml18MCktdD4+Mj4+PjA+cz4+PjA/KG89Y1t0KyhzPDwyKT4+Ml18MCwob3wwKSE9MCk6MCl7dT1yKzR8MDtkPWNbdT4+Ml18MDtjW3U+PjJdPWQrIC0xO2lmKChkfDApPT0wKXtsY1tjWyhjW3I+PjJdfDApKzg+PjJdJjI1NV0ocil9cT1jW3E+PjJdfDA7ZD1xKzR8MDtjW2Q+PjJdPShjW2Q+PjJdfDApKzE7aWYoISgoY1szNDAwXXwwKT09LTEpKXtjW3A+PjJdPTEzNjAwO2NbcCs0Pj4yXT0yMDg7Y1twKzg+PjJdPTA7Y2coMTM2MDAscCl9cD0oY1sxMzYwND4+Ml18MCkrIC0xfDA7cj1jW3ErOD4+Ml18MDtpZigoY1txKzEyPj4yXXwwKS1yPj4yPj4+MD5wPj4+MD8obj1jW3IrKHA8PDIpPj4yXXwwLChufDApIT0wKTowKXt1PXErNHwwO2Q9Y1t1Pj4yXXwwO2NbdT4+Ml09ZCsgLTE7aWYoKGR8MCk9PTApe2xjW2NbKGNbcT4+Ml18MCkrOD4+Ml0mMjU1XShxKX1tY1tjWyhjW24+PjJdfDApKzI0Pj4yXSYxMjddKGwsbik7ZD1sKzEyfDA7bWNbY1soY1tuPj4yXXwwKSsyOD4+Ml0mMTI3XShkLG4pO2Fbaj4+MF09KE1oKGUsY1tmPj4yXXwwLGwsbCsyNHwwLG8saCwxKXwwKT09KGx8MCkmMTtjW2I+PjJdPWNbZT4+Ml07aWYoISgoYVtkPj4wXSYxKT09MCk/KG09Y1tsKzIwPj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZigoYVtsPj4wXSYxKT09MCl7aT1rO3JldHVybn1iPWNbbCs4Pj4yXXwwO2lmKChifDApPT0wKXtpPWs7cmV0dXJufXZuKGIpO2k9aztyZXR1cm59ZD1YYSg0KXwwO2NbZD4+Ml09MjEzMDQ7d2IoZHwwLDIxMzc2LDE5Nil9ZD1YYSg0KXwwO2NbZD4+Ml09MjEzMDQ7d2IoZHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gTWgoYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MDttPWk7aT1pKzExMnwwO289bTt0PShnLWZ8MCkvMTJ8MDtpZih0Pj4+MD4xMDApe289dW4odCl8MDtpZigob3wwKT09MCl7QT1YYSg0KXwwO2NbQT4+Ml09MjI2ODA7d2IoQXwwLDIyNzI4LDIwNil9ZWxzZXtsPW99fWVsc2V7bD0wfXA9KGZ8MCk9PShnfDApO2lmKHApe3U9MH1lbHNle3E9Zjt1PTA7cj1vO3doaWxlKDEpe3M9YVtxPj4wXXwwO2lmKChzJjEpPT0wKXtzPShzJjI1NSk+Pj4xfWVsc2V7cz1jW3ErND4+Ml18MH1pZigoc3wwKT09MCl7YVtyPj4wXT0yO3U9dSsxfDA7dD10KyAtMXwwfWVsc2V7YVtyPj4wXT0xfXE9cSsxMnwwO2lmKChxfDApPT0oZ3wwKSl7YnJlYWt9ZWxzZXtyPXIrMXwwfX19cT0wO2E6d2hpbGUoMSl7dj0odHwwKSE9MDtyPXE7d2hpbGUoMSl7cT1jW2I+PjJdfDA7ZG97aWYoKHF8MCkhPTApe2lmKChjW3ErMTI+PjJdfDApPT0oY1txKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbcT4+Ml18MCkrMzY+PjJdJjEyN10ocSl8MCk9PS0xKXtjW2I+PjJdPTA7cT0wO2JyZWFrfWVsc2V7cT1jW2I+PjJdfDA7YnJlYWt9fX1lbHNle3E9MH19d2hpbGUoMCk7dz0ocXwwKT09MDtpZigoZXwwKSE9MCl7aWYoKGNbZSsxMj4+Ml18MCk9PShjW2UrMTY+PjJdfDApKXtBPShvY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDApPT0tMTtxPUE/MDplO2U9QT8wOmV9ZWxzZXtxPWV9fWVsc2V7cT0wO2U9MH1zPShxfDApPT0wO3g9Y1tiPj4yXXwwO2lmKCEoKHdecykmdikpe2JyZWFrIGF9cT1jW3grMTI+PjJdfDA7aWYoKHF8MCk9PShjW3grMTY+PjJdfDApKXtxPW9jW2NbKGNbeD4+Ml18MCkrMzY+PjJdJjEyN10oeCl8MH1lbHNle3E9ZFtxPj4wXXwwfXM9cSYyNTU7aWYoIWspe3M9eGNbY1soY1toPj4yXXwwKSsxMj4+Ml0mNjNdKGgscyl8MH1xPXIrMXwwO2lmKHApe3I9cX1lbHNle2JyZWFrfX1iOmRve2lmKGspe3g9MDt2PWY7dz1vO3doaWxlKDEpe2Rve2lmKChhW3c+PjBdfDApPT0xKXt5PWFbdj4+MF18MDt6PSh5JjEpPT0wO2lmKHope0E9disxfDB9ZWxzZXtBPWNbdis4Pj4yXXwwfWlmKCEoczw8MjQ+PjI0PT0oYVtBK3I+PjBdfDApKSl7YVt3Pj4wXT0wO3Q9dCsgLTF8MDticmVha31pZih6KXt4PSh5JjI1NSk+Pj4xfWVsc2V7eD1jW3YrND4+Ml18MH1pZigoeHwwKT09KHF8MCkpe2Fbdz4+MF09Mjt4PTE7dT11KzF8MDt0PXQrIC0xfDB9ZWxzZXt4PTF9fX13aGlsZSgwKTt2PXYrMTJ8MDtpZigodnwwKT09KGd8MCkpe2JyZWFrIGJ9dz13KzF8MH19ZWxzZXt4PTA7dj1mO3c9bzt3aGlsZSgxKXtkb3tpZigoYVt3Pj4wXXwwKT09MSl7aWYoKGFbdj4+MF0mMSk9PTApe3k9disxfDB9ZWxzZXt5PWNbdis4Pj4yXXwwfWlmKCEoczw8MjQ+PjI0PT0oeGNbY1soY1toPj4yXXwwKSsxMj4+Ml0mNjNdKGgsYVt5K3I+PjBdfDApfDApPDwyND4+MjQpKXthW3c+PjBdPTA7dD10KyAtMXwwO2JyZWFrfXg9YVt2Pj4wXXwwO2lmKCh4JjEpPT0wKXt4PSh4JjI1NSk+Pj4xfWVsc2V7eD1jW3YrND4+Ml18MH1pZigoeHwwKT09KHF8MCkpe2Fbdz4+MF09Mjt4PTE7dT11KzF8MDt0PXQrIC0xfDB9ZWxzZXt4PTF9fX13aGlsZSgwKTt2PXYrMTJ8MDtpZigodnwwKT09KGd8MCkpe2JyZWFrIGJ9dz13KzF8MH19fXdoaWxlKDApO2lmKCF4KXtjb250aW51ZX12PWNbYj4+Ml18MDtzPXYrMTJ8MDtyPWNbcz4+Ml18MDtpZigocnwwKT09KGNbdisxNj4+Ml18MCkpe29jW2NbKGNbdj4+Ml18MCkrNDA+PjJdJjEyN10odil8MH1lbHNle2Nbcz4+Ml09cisxfWlmKCh0K3V8MCk+Pj4wPDIpe2NvbnRpbnVlfWVsc2V7cz1mO3I9b313aGlsZSgxKXtpZigoYVtyPj4wXXwwKT09Mil7dj1hW3M+PjBdfDA7aWYoKHYmMSk9PTApe3Y9KHYmMjU1KT4+PjF9ZWxzZXt2PWNbcys0Pj4yXXwwfWlmKCh2fDApIT0ocXwwKSl7YVtyPj4wXT0wO3U9dSsgLTF8MH19cz1zKzEyfDA7aWYoKHN8MCk9PShnfDApKXtjb250aW51ZSBhfWVsc2V7cj1yKzF8MH19fWRve2lmKCh4fDApIT0wKXtpZigoY1t4KzEyPj4yXXwwKT09KGNbeCsxNj4+Ml18MCkpe2lmKChvY1tjWyhjW3g+PjJdfDApKzM2Pj4yXSYxMjddKHgpfDApPT0tMSl7Y1tiPj4yXT0wO3g9MDticmVha31lbHNle3g9Y1tiPj4yXXwwO2JyZWFrfX19ZWxzZXt4PTB9fXdoaWxlKDApO2g9KHh8MCk9PTA7ZG97aWYoIXMpe2lmKChjW3ErMTI+PjJdfDApIT0oY1txKzE2Pj4yXXwwKSl7aWYoaCl7YnJlYWt9ZWxzZXtuPTg1O2JyZWFrfX1pZighKChvY1tjWyhjW3E+PjJdfDApKzM2Pj4yXSYxMjddKHEpfDApPT0tMSkpe2lmKCFoKXtuPTg1fX1lbHNle249ODN9fWVsc2V7bj04M319d2hpbGUoMCk7aWYoKG58MCk9PTgzP2g6MCl7bj04NX1pZigobnwwKT09ODUpe2Nbaj4+Ml09Y1tqPj4yXXwyfWM6ZG97aWYoIXApe2lmKChhW28+PjBdfDApPT0yKXtnPWZ9ZWxzZXt3aGlsZSgxKXtmPWYrMTJ8MDtvPW8rMXwwO2lmKChmfDApPT0oZ3wwKSl7bj05MDticmVhayBjfWlmKChhW28+PjBdfDApPT0yKXtnPWY7YnJlYWt9fX19ZWxzZXtuPTkwfX13aGlsZSgwKTtpZigobnwwKT09OTApe2Nbaj4+Ml09Y1tqPj4yXXw0fWlmKChsfDApPT0wKXtpPW07cmV0dXJuIGd8MH12bihsKTtpPW07cmV0dXJuIGd8MH1mdW5jdGlvbiBOaChiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MDtlPWk7aT1pKzIyNHwwO3Y9ZSsxOTh8MDt1PWUrMTk2fDA7bj1lKzE2fDA7bz1lKzR8MDtxPWUrMTkyfDA7cz1lKzMyfDA7cj1lO3Q9ZSsyOHwwO3k9Y1tmPj4yXXwwO0E9Y1tnPj4yXXwwO2c9Y1toKzQ+PjJdJjc0O2lmKChnfDApPT04KXtnPTE2fWVsc2UgaWYoKGd8MCk9PTApe2c9MH1lbHNlIGlmKChnfDApPT02NCl7Zz04fWVsc2V7Zz0xMH1taShuLGgsdix1KTtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtoZyhvLDEwKTtpZigoYVtvPj4wXSYxKT09MCl7Qj1vKzF8MDt3PUI7Zj1vKzh8MH1lbHNle0I9bys4fDA7dz1vKzF8MDtmPUI7Qj1jW0I+PjJdfDB9Y1txPj4yXT1CO2Nbcj4+Ml09cztjW3Q+PjJdPTA7aD1vKzR8MDt4PWFbdT4+MF18MDt1PW8rOHwwO2E6d2hpbGUoMSl7aWYoKHl8MCkhPTApe2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RT0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7eT1FPzA6eX19ZWxzZXt5PTB9ej0oeXwwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZih6KXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xKSl7aWYoIXope2JyZWFrIGF9fWVsc2V7bD0xOX19ZWxzZXtsPTE5fX13aGlsZSgwKTtpZigobHwwKT09MTkpe2w9MDtpZih6KXtBPTA7YnJlYWt9ZWxzZXtBPTB9fUQ9YVtvPj4wXXwwO0M9KEQmMSk9PTA7aWYoQyl7RT0oRCYyNTUpPj4+MX1lbHNle0U9Y1toPj4yXXwwfWlmKCgoY1txPj4yXXwwKS1CfDApPT0oRXwwKSl7aWYoQyl7Qj0oRCYyNTUpPj4+MTtFPShEJjI1NSk+Pj4xO0Q9Qjw8MX1lbHNle0I9Y1toPj4yXXwwO0U9Y1toPj4yXXwwO0Q9Qjw8MX1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUI8PDI7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtFPWFbbz4+MF18MDtpZigoRSYxKT09MCl7RD0xMH1lbHNle0Q9Y1tvPj4yXXwwO0U9RCYyNTU7RD0oRCYtMikrIC0xfDB9Qz0oRSYxKT09MDtpZihDKXtFPShFJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9ZG97aWYoIShFPj4+MDxEPj4+MCkpe2lmKEMpe2FbbytEKzE+PjBdPTA7YVtvPj4wXT1EPDwxO2JyZWFrfWVsc2V7YVsoY1t1Pj4yXXwwKStEPj4wXT0wO2NbaD4+Ml09RDticmVha319ZWxzZXtoZyhvLEQtRXwwKX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9d31lbHNle0M9Y1tmPj4yXXwwfWNbcT4+Ml09QytCO0I9Q31EPXkrMTJ8MDtFPWNbRD4+Ml18MDtDPXkrMTZ8MDtpZigoRXwwKT09KGNbQz4+Ml18MCkpe0U9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7RT1kW0U+PjBdfDB9aWYoKFhoKEUmMjU1LGcsQixxLHQseCxuLHMscix2KXwwKSE9MCl7YnJlYWt9ej1jW0Q+PjJdfDA7aWYoKHp8MCk9PShjW0M+PjJdfDApKXtvY1tjWyhjW3k+PjJdfDApKzQwPj4yXSYxMjddKHkpfDA7Y29udGludWV9ZWxzZXtjW0Q+PjJdPXorMTtjb250aW51ZX19dj1hW24+PjBdfDA7aWYoKHYmMSk9PTApe3Y9KHYmMjU1KT4+PjF9ZWxzZXt2PWNbbis0Pj4yXXwwfWlmKCh2fDApIT0wPyhwPWNbcj4+Ml18MCwocC1zfDApPDE2MCk6MCl7RT1jW3Q+PjJdfDA7Y1tyPj4yXT1wKzQ7Y1twPj4yXT1FfWNbaz4+Ml09Tm0oQixjW3E+PjJdfDAsaixnKXwwO3FrKG4scyxjW3I+PjJdfDAsaik7aWYoIXope2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RT0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7eT1FPzA6eX19ZWxzZXt5PTB9cD0oeXwwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZihwKXticmVha31lbHNle2w9NzE7YnJlYWt9fWlmKCEoKG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xKSl7aWYoIXApe2w9NzF9fWVsc2V7bD02OX19ZWxzZXtsPTY5fX13aGlsZSgwKTtpZigobHwwKT09Njk/cDowKXtsPTcxfWlmKChsfDApPT03MSl7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT15O2lmKCEoKGFbbz4+MF0mMSk9PTApPyhtPWNbdT4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoKGFbbj4+MF0mMSk9PTApe2k9ZTtyZXR1cm59bD1jW24rOD4+Ml18MDtpZigobHwwKT09MCl7aT1lO3JldHVybn12bihsKTtpPWU7cmV0dXJufWZ1bmN0aW9uIE9oKGIsZSxmLGcsaCxqLGspe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wO2U9aTtpPWkrMjI0fDA7dj1lKzE5OHwwO3U9ZSsxOTZ8MDtuPWUrMTZ8MDtvPWUrNHwwO3E9ZSsxOTJ8MDtzPWUrMzJ8MDtyPWU7dD1lKzI4fDA7eT1jW2Y+PjJdfDA7QT1jW2c+PjJdfDA7Zz1jW2grND4+Ml0mNzQ7aWYoKGd8MCk9PTApe2c9MH1lbHNlIGlmKChnfDApPT04KXtnPTE2fWVsc2UgaWYoKGd8MCk9PTY0KXtnPTh9ZWxzZXtnPTEwfW1pKG4saCx2LHUpO2NbbyswPj4yXT0wO2Nbbys0Pj4yXT0wO2Nbbys4Pj4yXT0wO2hnKG8sMTApO2lmKChhW28+PjBdJjEpPT0wKXtCPW8rMXwwO3c9QjtmPW8rOHwwfWVsc2V7Qj1vKzh8MDt3PW8rMXwwO2Y9QjtCPWNbQj4+Ml18MH1jW3E+PjJdPUI7Y1tyPj4yXT1zO2NbdD4+Ml09MDtoPW8rNHwwO3g9YVt1Pj4wXXwwO3U9bys4fDA7YTp3aGlsZSgxKXtpZigoeXwwKSE9MCl7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH16PSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHope2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZigheil7YnJlYWsgYX19ZWxzZXtsPTE5fX1lbHNle2w9MTl9fXdoaWxlKDApO2lmKChsfDApPT0xOSl7bD0wO2lmKHope0E9MDticmVha31lbHNle0E9MH19RD1hW28+PjBdfDA7Qz0oRCYxKT09MDtpZihDKXtFPShEJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9aWYoKChjW3E+PjJdfDApLUJ8MCk9PShFfDApKXtpZihDKXtCPShEJjI1NSk+Pj4xO0U9KEQmMjU1KT4+PjE7RD1CPDwxfWVsc2V7Qj1jW2g+PjJdfDA7RT1jW2g+PjJdfDA7RD1CPDwxfWRve2lmKCEoRT4+PjA8RD4+PjApKXtpZihDKXthW28rRCsxPj4wXT0wO2Fbbz4+MF09Qjw8MjticmVha31lbHNle2FbKGNbdT4+Ml18MCkrRD4+MF09MDtjW2g+PjJdPUQ7YnJlYWt9fWVsc2V7aGcobyxELUV8MCl9fXdoaWxlKDApO0U9YVtvPj4wXXwwO2lmKChFJjEpPT0wKXtEPTEwfWVsc2V7RD1jW28+PjJdfDA7RT1EJjI1NTtEPShEJi0yKSsgLTF8MH1DPShFJjEpPT0wO2lmKEMpe0U9KEUmMjU1KT4+PjF9ZWxzZXtFPWNbaD4+Ml18MH1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUQ8PDE7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz13fWVsc2V7Qz1jW2Y+PjJdfDB9Y1txPj4yXT1DK0I7Qj1DfUQ9eSsxMnwwO0U9Y1tEPj4yXXwwO0M9eSsxNnwwO2lmKChFfDApPT0oY1tDPj4yXXwwKSl7RT1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXtFPWRbRT4+MF18MH1pZigoWGgoRSYyNTUsZyxCLHEsdCx4LG4scyxyLHYpfDApIT0wKXticmVha316PWNbRD4+Ml18MDtpZigoenwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbeT4+Ml18MCkrNDA+PjJdJjEyN10oeSl8MDtjb250aW51ZX1lbHNle2NbRD4+Ml09eisxO2NvbnRpbnVlfX12PWFbbj4+MF18MDtpZigodiYxKT09MCl7dj0odiYyNTUpPj4+MX1lbHNle3Y9Y1tuKzQ+PjJdfDB9aWYoKHZ8MCkhPTA/KHA9Y1tyPj4yXXwwLChwLXN8MCk8MTYwKTowKXtFPWNbdD4+Ml18MDtjW3I+PjJdPXArNDtjW3A+PjJdPUV9RD1NbShCLGNbcT4+Ml18MCxqLGcpfDA7RT1rO2NbRT4+Ml09RDtjW0UrND4+Ml09STtxayhuLHMsY1tyPj4yXXwwLGopO2lmKCF6KXtpZigoY1t5KzEyPj4yXXwwKT09KGNbeSsxNj4+Ml18MCkpe0U9KG9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MCk9PS0xO3k9RT8wOnl9fWVsc2V7eT0wfXA9KHl8MCk9PTA7ZG97aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApIT0oY1tBKzE2Pj4yXXwwKSl7aWYocCl7YnJlYWt9ZWxzZXtsPTcxO2JyZWFrfX1pZighKChvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMSkpe2lmKCFwKXtsPTcxfX1lbHNle2w9Njl9fWVsc2V7bD02OX19d2hpbGUoMCk7aWYoKGx8MCk9PTY5P3A6MCl7bD03MX1pZigobHwwKT09NzEpe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09eTtpZighKChhW28+PjBdJjEpPT0wKT8obT1jW3U+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKChhW24+PjBdJjEpPT0wKXtpPWU7cmV0dXJufWw9Y1tuKzg+PjJdfDA7aWYoKGx8MCk9PTApe2k9ZTtyZXR1cm59dm4obCk7aT1lO3JldHVybn1mdW5jdGlvbiBQaChlLGYsZyxoLGosayxsKXtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MDtmPWk7aT1pKzIyNHwwO3c9ZisxOTh8MDt2PWYrMTk2fDA7bz1mKzE2fDA7cD1mKzR8MDtyPWYrMTkyfDA7dD1mKzMyfDA7cz1mO3U9ZisyOHwwO3o9Y1tnPj4yXXwwO0I9Y1toPj4yXXwwO2g9Y1tqKzQ+PjJdJjc0O2lmKChofDApPT04KXtoPTE2fWVsc2UgaWYoKGh8MCk9PTY0KXtoPTh9ZWxzZSBpZigoaHwwKT09MCl7aD0wfWVsc2V7aD0xMH1taShvLGosdyx2KTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDtoZyhwLDEwKTtpZigoYVtwPj4wXSYxKT09MCl7Qz1wKzF8MDt4PUM7Zz1wKzh8MH1lbHNle0M9cCs4fDA7eD1wKzF8MDtnPUM7Qz1jW0M+PjJdfDB9Y1tyPj4yXT1DO2Nbcz4+Ml09dDtjW3U+PjJdPTA7aj1wKzR8MDt5PWFbdj4+MF18MDt2PXArOHwwO2E6d2hpbGUoMSl7aWYoKHp8MCkhPTApe2lmKChjW3orMTI+PjJdfDApPT0oY1t6KzE2Pj4yXXwwKSl7Rj0ob2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwKT09LTE7ej1GPzA6en19ZWxzZXt6PTB9QT0oenwwKT09MDtkb3tpZigoQnwwKSE9MCl7aWYoKGNbQisxMj4+Ml18MCkhPShjW0IrMTY+PjJdfDApKXtpZihBKXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MCk9PS0xKSl7aWYoIUEpe2JyZWFrIGF9fWVsc2V7bT0xOX19ZWxzZXttPTE5fX13aGlsZSgwKTtpZigobXwwKT09MTkpe209MDtpZihBKXtCPTA7YnJlYWt9ZWxzZXtCPTB9fUU9YVtwPj4wXXwwO0Q9KEUmMSk9PTA7aWYoRCl7Rj0oRSYyNTUpPj4+MX1lbHNle0Y9Y1tqPj4yXXwwfWlmKCgoY1tyPj4yXXwwKS1DfDApPT0oRnwwKSl7aWYoRCl7Qz0oRSYyNTUpPj4+MTtGPShFJjI1NSk+Pj4xO0U9Qzw8MX1lbHNle0M9Y1tqPj4yXXwwO0Y9Y1tqPj4yXXwwO0U9Qzw8MX1kb3tpZighKEY+Pj4wPEU+Pj4wKSl7aWYoRCl7YVtwK0UrMT4+MF09MDthW3A+PjBdPUM8PDI7YnJlYWt9ZWxzZXthWyhjW3Y+PjJdfDApK0U+PjBdPTA7Y1tqPj4yXT1FO2JyZWFrfX1lbHNle2hnKHAsRS1GfDApfX13aGlsZSgwKTtGPWFbcD4+MF18MDtpZigoRiYxKT09MCl7RT0xMH1lbHNle0U9Y1twPj4yXXwwO0Y9RSYyNTU7RT0oRSYtMikrIC0xfDB9RD0oRiYxKT09MDtpZihEKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW2o+PjJdfDB9ZG97aWYoIShGPj4+MDxFPj4+MCkpe2lmKEQpe2FbcCtFKzE+PjBdPTA7YVtwPj4wXT1FPDwxO2JyZWFrfWVsc2V7YVsoY1t2Pj4yXXwwKStFPj4wXT0wO2Nbaj4+Ml09RTticmVha319ZWxzZXtoZyhwLEUtRnwwKX19d2hpbGUoMCk7aWYoKGFbcD4+MF0mMSk9PTApe0Q9eH1lbHNle0Q9Y1tnPj4yXXwwfWNbcj4+Ml09RCtDO0M9RH1FPXorMTJ8MDtGPWNbRT4+Ml18MDtEPXorMTZ8MDtpZigoRnwwKT09KGNbRD4+Ml18MCkpe0Y9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7Rj1kW0Y+PjBdfDB9aWYoKFhoKEYmMjU1LGgsQyxyLHUseSxvLHQscyx3KXwwKSE9MCl7YnJlYWt9QT1jW0U+PjJdfDA7aWYoKEF8MCk9PShjW0Q+PjJdfDApKXtvY1tjWyhjW3o+PjJdfDApKzQwPj4yXSYxMjddKHopfDA7Y29udGludWV9ZWxzZXtjW0U+PjJdPUErMTtjb250aW51ZX19dz1hW28+PjBdfDA7aWYoKHcmMSk9PTApe3c9KHcmMjU1KT4+PjF9ZWxzZXt3PWNbbys0Pj4yXXwwfWlmKCh3fDApIT0wPyhxPWNbcz4+Ml18MCwocS10fDApPDE2MCk6MCl7Rj1jW3U+PjJdfDA7Y1tzPj4yXT1xKzQ7Y1txPj4yXT1GfWJbbD4+MV09TG0oQyxjW3I+PjJdfDAsayxoKXwwO3FrKG8sdCxjW3M+PjJdfDAsayk7aWYoIUEpe2lmKChjW3orMTI+PjJdfDApPT0oY1t6KzE2Pj4yXXwwKSl7Rj0ob2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwKT09LTE7ej1GPzA6en19ZWxzZXt6PTB9cT0oenwwKT09MDtkb3tpZigoQnwwKSE9MCl7aWYoKGNbQisxMj4+Ml18MCkhPShjW0IrMTY+PjJdfDApKXtpZihxKXticmVha31lbHNle209NzE7YnJlYWt9fWlmKCEoKG9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MCk9PS0xKSl7aWYoIXEpe209NzF9fWVsc2V7bT02OX19ZWxzZXttPTY5fX13aGlsZSgwKTtpZigobXwwKT09Njk/cTowKXttPTcxfWlmKChtfDApPT03MSl7Y1trPj4yXT1jW2s+PjJdfDJ9Y1tlPj4yXT16O2lmKCEoKGFbcD4+MF0mMSk9PTApPyhuPWNbdj4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoKGFbbz4+MF0mMSk9PTApe2k9ZjtyZXR1cm59bT1jW28rOD4+Ml18MDtpZigobXwwKT09MCl7aT1mO3JldHVybn12bihtKTtpPWY7cmV0dXJufWZ1bmN0aW9uIFFoKGIsZSxmLGcsaCxqLGspe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wO2U9aTtpPWkrMjI0fDA7dj1lKzE5OHwwO3U9ZSsxOTZ8MDtuPWUrMTZ8MDtvPWUrNHwwO3E9ZSsxOTJ8MDtzPWUrMzJ8MDtyPWU7dD1lKzI4fDA7eT1jW2Y+PjJdfDA7QT1jW2c+PjJdfDA7Zz1jW2grND4+Ml0mNzQ7aWYoKGd8MCk9PTY0KXtnPTh9ZWxzZSBpZigoZ3wwKT09OCl7Zz0xNn1lbHNlIGlmKChnfDApPT0wKXtnPTB9ZWxzZXtnPTEwfW1pKG4saCx2LHUpO2NbbyswPj4yXT0wO2Nbbys0Pj4yXT0wO2Nbbys4Pj4yXT0wO2hnKG8sMTApO2lmKChhW28+PjBdJjEpPT0wKXtCPW8rMXwwO3c9QjtmPW8rOHwwfWVsc2V7Qj1vKzh8MDt3PW8rMXwwO2Y9QjtCPWNbQj4+Ml18MH1jW3E+PjJdPUI7Y1tyPj4yXT1zO2NbdD4+Ml09MDtoPW8rNHwwO3g9YVt1Pj4wXXwwO3U9bys4fDA7YTp3aGlsZSgxKXtpZigoeXwwKSE9MCl7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH16PSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHope2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZigheil7YnJlYWsgYX19ZWxzZXtsPTE5fX1lbHNle2w9MTl9fXdoaWxlKDApO2lmKChsfDApPT0xOSl7bD0wO2lmKHope0E9MDticmVha31lbHNle0E9MH19RD1hW28+PjBdfDA7Qz0oRCYxKT09MDtpZihDKXtFPShEJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9aWYoKChjW3E+PjJdfDApLUJ8MCk9PShFfDApKXtpZihDKXtCPShEJjI1NSk+Pj4xO0U9KEQmMjU1KT4+PjE7RD1CPDwxfWVsc2V7Qj1jW2g+PjJdfDA7RT1jW2g+PjJdfDA7RD1CPDwxfWRve2lmKCEoRT4+PjA8RD4+PjApKXtpZihDKXthW28rRCsxPj4wXT0wO2Fbbz4+MF09Qjw8MjticmVha31lbHNle2FbKGNbdT4+Ml18MCkrRD4+MF09MDtjW2g+PjJdPUQ7YnJlYWt9fWVsc2V7aGcobyxELUV8MCl9fXdoaWxlKDApO0U9YVtvPj4wXXwwO2lmKChFJjEpPT0wKXtEPTEwfWVsc2V7RD1jW28+PjJdfDA7RT1EJjI1NTtEPShEJi0yKSsgLTF8MH1DPShFJjEpPT0wO2lmKEMpe0U9KEUmMjU1KT4+PjF9ZWxzZXtFPWNbaD4+Ml18MH1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUQ8PDE7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz13fWVsc2V7Qz1jW2Y+PjJdfDB9Y1txPj4yXT1DK0I7Qj1DfUQ9eSsxMnwwO0U9Y1tEPj4yXXwwO0M9eSsxNnwwO2lmKChFfDApPT0oY1tDPj4yXXwwKSl7RT1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXtFPWRbRT4+MF18MH1pZigoWGgoRSYyNTUsZyxCLHEsdCx4LG4scyxyLHYpfDApIT0wKXticmVha316PWNbRD4+Ml18MDtpZigoenwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbeT4+Ml18MCkrNDA+PjJdJjEyN10oeSl8MDtjb250aW51ZX1lbHNle2NbRD4+Ml09eisxO2NvbnRpbnVlfX12PWFbbj4+MF18MDtpZigodiYxKT09MCl7dj0odiYyNTUpPj4+MX1lbHNle3Y9Y1tuKzQ+PjJdfDB9aWYoKHZ8MCkhPTA/KHA9Y1tyPj4yXXwwLChwLXN8MCk8MTYwKTowKXtFPWNbdD4+Ml18MDtjW3I+PjJdPXArNDtjW3A+PjJdPUV9Y1trPj4yXT1LbShCLGNbcT4+Ml18MCxqLGcpfDA7cWsobixzLGNbcj4+Ml18MCxqKTtpZigheil7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH1wPSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHApe2JyZWFrfWVsc2V7bD03MTticmVha319aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZighcCl7bD03MX19ZWxzZXtsPTY5fX1lbHNle2w9Njl9fXdoaWxlKDApO2lmKChsfDApPT02OT9wOjApe2w9NzF9aWYoKGx8MCk9PTcxKXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPXk7aWYoISgoYVtvPj4wXSYxKT09MCk/KG09Y1t1Pj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZigoYVtuPj4wXSYxKT09MCl7aT1lO3JldHVybn1sPWNbbis4Pj4yXXwwO2lmKChsfDApPT0wKXtpPWU7cmV0dXJufXZuKGwpO2k9ZTtyZXR1cm59ZnVuY3Rpb24gUmgoYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTA7ZT1pO2k9aSsyMjR8MDt2PWUrMTk4fDA7dT1lKzE5NnwwO249ZSsxNnwwO289ZSs0fDA7cT1lKzE5MnwwO3M9ZSszMnwwO3I9ZTt0PWUrMjh8MDt5PWNbZj4+Ml18MDtBPWNbZz4+Ml18MDtnPWNbaCs0Pj4yXSY3NDtpZigoZ3wwKT09OCl7Zz0xNn1lbHNlIGlmKChnfDApPT0wKXtnPTB9ZWxzZSBpZigoZ3wwKT09NjQpe2c9OH1lbHNle2c9MTB9bWkobixoLHYsdSk7Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTA7aGcobywxMCk7aWYoKGFbbz4+MF0mMSk9PTApe0I9bysxfDA7dz1CO2Y9bys4fDB9ZWxzZXtCPW8rOHwwO3c9bysxfDA7Zj1CO0I9Y1tCPj4yXXwwfWNbcT4+Ml09QjtjW3I+PjJdPXM7Y1t0Pj4yXT0wO2g9bys0fDA7eD1hW3U+PjBdfDA7dT1vKzh8MDthOndoaWxlKDEpe2lmKCh5fDApIT0wKXtpZigoY1t5KzEyPj4yXXwwKT09KGNbeSsxNj4+Ml18MCkpe0U9KG9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MCk9PS0xO3k9RT8wOnl9fWVsc2V7eT0wfXo9KHl8MCk9PTA7ZG97aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApIT0oY1tBKzE2Pj4yXXwwKSl7aWYoeil7YnJlYWt9ZWxzZXticmVhayBhfX1pZighKChvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMSkpe2lmKCF6KXticmVhayBhfX1lbHNle2w9MTl9fWVsc2V7bD0xOX19d2hpbGUoMCk7aWYoKGx8MCk9PTE5KXtsPTA7aWYoeil7QT0wO2JyZWFrfWVsc2V7QT0wfX1EPWFbbz4+MF18MDtDPShEJjEpPT0wO2lmKEMpe0U9KEQmMjU1KT4+PjF9ZWxzZXtFPWNbaD4+Ml18MH1pZigoKGNbcT4+Ml18MCktQnwwKT09KEV8MCkpe2lmKEMpe0I9KEQmMjU1KT4+PjE7RT0oRCYyNTUpPj4+MTtEPUI8PDF9ZWxzZXtCPWNbaD4+Ml18MDtFPWNbaD4+Ml18MDtEPUI8PDF9ZG97aWYoIShFPj4+MDxEPj4+MCkpe2lmKEMpe2FbbytEKzE+PjBdPTA7YVtvPj4wXT1CPDwyO2JyZWFrfWVsc2V7YVsoY1t1Pj4yXXwwKStEPj4wXT0wO2NbaD4+Ml09RDticmVha319ZWxzZXtoZyhvLEQtRXwwKX19d2hpbGUoMCk7RT1hW28+PjBdfDA7aWYoKEUmMSk9PTApe0Q9MTB9ZWxzZXtEPWNbbz4+Ml18MDtFPUQmMjU1O0Q9KEQmLTIpKyAtMXwwfUM9KEUmMSk9PTA7aWYoQyl7RT0oRSYyNTUpPj4+MX1lbHNle0U9Y1toPj4yXXwwfWRve2lmKCEoRT4+PjA8RD4+PjApKXtpZihDKXthW28rRCsxPj4wXT0wO2Fbbz4+MF09RDw8MTticmVha31lbHNle2FbKGNbdT4+Ml18MCkrRD4+MF09MDtjW2g+PjJdPUQ7YnJlYWt9fWVsc2V7aGcobyxELUV8MCl9fXdoaWxlKDApO2lmKChhW28+PjBdJjEpPT0wKXtDPXd9ZWxzZXtDPWNbZj4+Ml18MH1jW3E+PjJdPUMrQjtCPUN9RD15KzEyfDA7RT1jW0Q+PjJdfDA7Qz15KzE2fDA7aWYoKEV8MCk9PShjW0M+PjJdfDApKXtFPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle0U9ZFtFPj4wXXwwfWlmKChYaChFJjI1NSxnLEIscSx0LHgsbixzLHIsdil8MCkhPTApe2JyZWFrfXo9Y1tEPj4yXXwwO2lmKCh6fDApPT0oY1tDPj4yXXwwKSl7b2NbY1soY1t5Pj4yXXwwKSs0MD4+Ml0mMTI3XSh5KXwwO2NvbnRpbnVlfWVsc2V7Y1tEPj4yXT16KzE7Y29udGludWV9fXY9YVtuPj4wXXwwO2lmKCh2JjEpPT0wKXt2PSh2JjI1NSk+Pj4xfWVsc2V7dj1jW24rND4+Ml18MH1pZigodnwwKSE9MD8ocD1jW3I+PjJdfDAsKHAtc3wwKTwxNjApOjApe0U9Y1t0Pj4yXXwwO2Nbcj4+Ml09cCs0O2NbcD4+Ml09RX1jW2s+PjJdPUptKEIsY1txPj4yXXwwLGosZyl8MDtxayhuLHMsY1tyPj4yXXwwLGopO2lmKCF6KXtpZigoY1t5KzEyPj4yXXwwKT09KGNbeSsxNj4+Ml18MCkpe0U9KG9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MCk9PS0xO3k9RT8wOnl9fWVsc2V7eT0wfXA9KHl8MCk9PTA7ZG97aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApIT0oY1tBKzE2Pj4yXXwwKSl7aWYocCl7YnJlYWt9ZWxzZXtsPTcxO2JyZWFrfX1pZighKChvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMSkpe2lmKCFwKXtsPTcxfX1lbHNle2w9Njl9fWVsc2V7bD02OX19d2hpbGUoMCk7aWYoKGx8MCk9PTY5P3A6MCl7bD03MX1pZigobHwwKT09NzEpe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09eTtpZighKChhW28+PjBdJjEpPT0wKT8obT1jW3U+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKChhW24+PjBdJjEpPT0wKXtpPWU7cmV0dXJufWw9Y1tuKzg+PjJdfDA7aWYoKGx8MCk9PTApe2k9ZTtyZXR1cm59dm4obCk7aT1lO3JldHVybn1mdW5jdGlvbiBTaChiLGUsZixnLGgsaixrKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MDtlPWk7aT1pKzIyNHwwO3Y9ZSsxOTh8MDt1PWUrMTk2fDA7bj1lKzE2fDA7bz1lKzR8MDtxPWUrMTkyfDA7cz1lKzMyfDA7cj1lO3Q9ZSsyOHwwO3k9Y1tmPj4yXXwwO0E9Y1tnPj4yXXwwO2c9Y1toKzQ+PjJdJjc0O2lmKChnfDApPT0wKXtnPTB9ZWxzZSBpZigoZ3wwKT09OCl7Zz0xNn1lbHNlIGlmKChnfDApPT02NCl7Zz04fWVsc2V7Zz0xMH1taShuLGgsdix1KTtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtoZyhvLDEwKTtpZigoYVtvPj4wXSYxKT09MCl7Qj1vKzF8MDt3PUI7Zj1vKzh8MH1lbHNle0I9bys4fDA7dz1vKzF8MDtmPUI7Qj1jW0I+PjJdfDB9Y1txPj4yXT1CO2Nbcj4+Ml09cztjW3Q+PjJdPTA7aD1vKzR8MDt4PWFbdT4+MF18MDt1PW8rOHwwO2E6d2hpbGUoMSl7aWYoKHl8MCkhPTApe2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RT0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7eT1FPzA6eX19ZWxzZXt5PTB9ej0oeXwwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZih6KXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xKSl7aWYoIXope2JyZWFrIGF9fWVsc2V7bD0xOX19ZWxzZXtsPTE5fX13aGlsZSgwKTtpZigobHwwKT09MTkpe2w9MDtpZih6KXtBPTA7YnJlYWt9ZWxzZXtBPTB9fUQ9YVtvPj4wXXwwO0M9KEQmMSk9PTA7aWYoQyl7RT0oRCYyNTUpPj4+MX1lbHNle0U9Y1toPj4yXXwwfWlmKCgoY1txPj4yXXwwKS1CfDApPT0oRXwwKSl7aWYoQyl7Qj0oRCYyNTUpPj4+MTtFPShEJjI1NSk+Pj4xO0Q9Qjw8MX1lbHNle0I9Y1toPj4yXXwwO0U9Y1toPj4yXXwwO0Q9Qjw8MX1kb3tpZighKEU+Pj4wPEQ+Pj4wKSl7aWYoQyl7YVtvK0QrMT4+MF09MDthW28+PjBdPUI8PDI7YnJlYWt9ZWxzZXthWyhjW3U+PjJdfDApK0Q+PjBdPTA7Y1toPj4yXT1EO2JyZWFrfX1lbHNle2hnKG8sRC1FfDApfX13aGlsZSgwKTtFPWFbbz4+MF18MDtpZigoRSYxKT09MCl7RD0xMH1lbHNle0Q9Y1tvPj4yXXwwO0U9RCYyNTU7RD0oRCYtMikrIC0xfDB9Qz0oRSYxKT09MDtpZihDKXtFPShFJjI1NSk+Pj4xfWVsc2V7RT1jW2g+PjJdfDB9ZG97aWYoIShFPj4+MDxEPj4+MCkpe2lmKEMpe2FbbytEKzE+PjBdPTA7YVtvPj4wXT1EPDwxO2JyZWFrfWVsc2V7YVsoY1t1Pj4yXXwwKStEPj4wXT0wO2NbaD4+Ml09RDticmVha319ZWxzZXtoZyhvLEQtRXwwKX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9d31lbHNle0M9Y1tmPj4yXXwwfWNbcT4+Ml09QytCO0I9Q31EPXkrMTJ8MDtFPWNbRD4+Ml18MDtDPXkrMTZ8MDtpZigoRXwwKT09KGNbQz4+Ml18MCkpe0U9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7RT1kW0U+PjBdfDB9aWYoKFhoKEUmMjU1LGcsQixxLHQseCxuLHMscix2KXwwKSE9MCl7YnJlYWt9ej1jW0Q+PjJdfDA7aWYoKHp8MCk9PShjW0M+PjJdfDApKXtvY1tjWyhjW3k+PjJdfDApKzQwPj4yXSYxMjddKHkpfDA7Y29udGludWV9ZWxzZXtjW0Q+PjJdPXorMTtjb250aW51ZX19dj1hW24+PjBdfDA7aWYoKHYmMSk9PTApe3Y9KHYmMjU1KT4+PjF9ZWxzZXt2PWNbbis0Pj4yXXwwfWlmKCh2fDApIT0wPyhwPWNbcj4+Ml18MCwocC1zfDApPDE2MCk6MCl7RT1jW3Q+PjJdfDA7Y1tyPj4yXT1wKzQ7Y1twPj4yXT1FfUQ9SW0oQixjW3E+PjJdfDAsaixnKXwwO0U9aztjW0U+PjJdPUQ7Y1tFKzQ+PjJdPUk7cWsobixzLGNbcj4+Ml18MCxqKTtpZigheil7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApKXtFPShvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTt5PUU/MDp5fX1lbHNle3k9MH1wPSh5fDApPT0wO2Rve2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKSE9KGNbQSsxNj4+Ml18MCkpe2lmKHApe2JyZWFrfWVsc2V7bD03MTticmVha319aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZighcCl7bD03MX19ZWxzZXtsPTY5fX1lbHNle2w9Njl9fXdoaWxlKDApO2lmKChsfDApPT02OT9wOjApe2w9NzF9aWYoKGx8MCk9PTcxKXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPXk7aWYoISgoYVtvPj4wXSYxKT09MCk/KG09Y1t1Pj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZigoYVtuPj4wXSYxKT09MCl7aT1lO3JldHVybn1sPWNbbis4Pj4yXXwwO2lmKChsfDApPT0wKXtpPWU7cmV0dXJufXZuKGwpO2k9ZTtyZXR1cm59ZnVuY3Rpb24gVGgoYixlLGYsaCxqLGssbCl7Yj1ifDA7ZT1lfDA7Zj1mfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7dmFyIG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MDtlPWk7aT1pKzI1NnwwO3g9ZSsyMDh8MDt6PWUrMjAwfDA7dz1lKzI0MHwwO289ZTtwPWUrMTg4fDA7dj1lKzE4NHwwO3Q9ZSsxNnwwO3M9ZSsxNzZ8MDtyPWUrMTgwfDA7dT1lKzI0MXwwO3k9ZSsyNDJ8MDtBPWNbZj4+Ml18MDtEPWNbaD4+Ml18MDtuaShvLGoseCx6LHcpO2NbcCswPj4yXT0wO2NbcCs0Pj4yXT0wO2NbcCs4Pj4yXT0wO2hnKHAsMTApO2lmKChhW3A+PjBdJjEpPT0wKXtFPXArMXwwO2g9RTtmPXArOHwwfWVsc2V7RT1wKzh8MDtoPXArMXwwO2Y9RTtFPWNbRT4+Ml18MH1jW3Y+PjJdPUU7Y1tzPj4yXT10O2Nbcj4+Ml09MDthW3U+PjBdPTE7YVt5Pj4wXT02OTtqPXArNHwwO3o9YVt6Pj4wXXwwO0I9YVt3Pj4wXXwwO3c9cCs4fDA7YTp3aGlsZSgxKXtpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCk9PShjW0ErMTY+PjJdfDApKXtIPShvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMTtBPUg/MDpBfX1lbHNle0E9MH1DPShBfDApPT0wO2Rve2lmKChEfDApIT0wKXtpZigoY1tEKzEyPj4yXXwwKSE9KGNbRCsxNj4+Ml18MCkpe2lmKEMpe2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tEPj4yXXwwKSszNj4+Ml0mMTI3XShEKXwwKT09LTEpKXtpZighQyl7YnJlYWsgYX19ZWxzZXttPTE1fX1lbHNle209MTV9fXdoaWxlKDApO2lmKChtfDApPT0xNSl7bT0wO2lmKEMpe0Q9MDticmVha31lbHNle0Q9MH19Rz1hW3A+PjBdfDA7Rj0oRyYxKT09MDtpZihGKXtIPShHJjI1NSk+Pj4xfWVsc2V7SD1jW2o+PjJdfDB9aWYoKChjW3Y+PjJdfDApLUV8MCk9PShIfDApKXtpZihGKXtFPShHJjI1NSk+Pj4xO0c9KEcmMjU1KT4+PjE7SD1FPDwxfWVsc2V7RT1jW2o+PjJdfDA7Rz1jW2o+PjJdfDA7SD1FPDwxfWRve2lmKCEoRz4+PjA8SD4+PjApKXtpZihGKXthW3ArSCsxPj4wXT0wO2FbcD4+MF09RTw8MjticmVha31lbHNle2FbKGNbdz4+Ml18MCkrSD4+MF09MDtjW2o+PjJdPUg7YnJlYWt9fWVsc2V7aGcocCxILUd8MCl9fXdoaWxlKDApO0g9YVtwPj4wXXwwO2lmKChIJjEpPT0wKXtHPTEwfWVsc2V7Rz1jW3A+PjJdfDA7SD1HJjI1NTtHPShHJi0yKSsgLTF8MH1GPShIJjEpPT0wO2lmKEYpe0g9KEgmMjU1KT4+PjF9ZWxzZXtIPWNbaj4+Ml18MH1kb3tpZighKEg+Pj4wPEc+Pj4wKSl7aWYoRil7YVtwK0crMT4+MF09MDthW3A+PjBdPUc8PDE7YnJlYWt9ZWxzZXthWyhjW3c+PjJdfDApK0c+PjBdPTA7Y1tqPj4yXT1HO2JyZWFrfX1lbHNle2hnKHAsRy1IfDApfX13aGlsZSgwKTtpZigoYVtwPj4wXSYxKT09MCl7Rj1ofWVsc2V7Rj1jW2Y+PjJdfDB9Y1t2Pj4yXT1GK0U7RT1GfUc9QSsxMnwwO0g9Y1tHPj4yXXwwO0Y9QSsxNnwwO2lmKChIfDApPT0oY1tGPj4yXXwwKSl7SD1vY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDB9ZWxzZXtIPWRbSD4+MF18MH1pZigob2koSCYyNTUsdSx5LEUsdix6LEIsbyx0LHMscix4KXwwKSE9MCl7YnJlYWt9Qz1jW0c+PjJdfDA7aWYoKEN8MCk9PShjW0Y+PjJdfDApKXtvY1tjWyhjW0E+PjJdfDApKzQwPj4yXSYxMjddKEEpfDA7Y29udGludWV9ZWxzZXtjW0c+PjJdPUMrMTtjb250aW51ZX19eD1hW28+PjBdfDA7aWYoKHgmMSk9PTApe3g9KHgmMjU1KT4+PjF9ZWxzZXt4PWNbbys0Pj4yXXwwfWlmKCgoeHwwKSE9MD8oYVt1Pj4wXXwwKSE9MDowKT8ocT1jW3M+PjJdfDAsKHEtdHwwKTwxNjApOjApe0g9Y1tyPj4yXXwwO2Nbcz4+Ml09cSs0O2NbcT4+Ml09SH1nW2w+PjJdPStIbShFLGNbdj4+Ml18MCxrKTtxayhvLHQsY1tzPj4yXXwwLGspO2lmKCFDKXtpZigoY1tBKzEyPj4yXXwwKT09KGNbQSsxNj4+Ml18MCkpe0g9KG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xO0E9SD8wOkF9fWVsc2V7QT0wfWw9KEF8MCk9PTA7ZG97aWYoKER8MCkhPTApe2lmKChjW0QrMTI+PjJdfDApIT0oY1tEKzE2Pj4yXXwwKSl7aWYobCl7YnJlYWt9ZWxzZXttPTY4O2JyZWFrfX1pZighKChvY1tjWyhjW0Q+PjJdfDApKzM2Pj4yXSYxMjddKEQpfDApPT0tMSkpe2lmKCFsKXttPTY4fX1lbHNle209NjZ9fWVsc2V7bT02Nn19d2hpbGUoMCk7aWYoKG18MCk9PTY2P2w6MCl7bT02OH1pZigobXwwKT09Njgpe2Nbaz4+Ml09Y1trPj4yXXwyfWNbYj4+Ml09QTtpZighKChhW3A+PjBdJjEpPT0wKT8obj1jW3c+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKChhW28+PjBdJjEpPT0wKXtpPWU7cmV0dXJufW09Y1tvKzg+PjJdfDA7aWYoKG18MCk9PTApe2k9ZTtyZXR1cm59dm4obSk7aT1lO3JldHVybn1mdW5jdGlvbiBVaChiLGUsZixnLGosayxsKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wO2U9aTtpPWkrMjU2fDA7eD1lKzIwOHwwO3o9ZSsyMDB8MDt3PWUrMjQwfDA7bz1lO3A9ZSsxODh8MDt2PWUrMTg0fDA7dD1lKzE2fDA7cz1lKzE3NnwwO3I9ZSsxODB8MDt1PWUrMjQxfDA7eT1lKzI0MnwwO0E9Y1tmPj4yXXwwO0Q9Y1tnPj4yXXwwO25pKG8saix4LHosdyk7Y1twKzA+PjJdPTA7Y1twKzQ+PjJdPTA7Y1twKzg+PjJdPTA7aGcocCwxMCk7aWYoKGFbcD4+MF0mMSk9PTApe0U9cCsxfDA7Zz1FO2Y9cCs4fDB9ZWxzZXtFPXArOHwwO2c9cCsxfDA7Zj1FO0U9Y1tFPj4yXXwwfWNbdj4+Ml09RTtjW3M+PjJdPXQ7Y1tyPj4yXT0wO2FbdT4+MF09MTthW3k+PjBdPTY5O2o9cCs0fDA7ej1hW3o+PjBdfDA7Qj1hW3c+PjBdfDA7dz1wKzh8MDthOndoaWxlKDEpe2lmKChBfDApIT0wKXtpZigoY1tBKzEyPj4yXXwwKT09KGNbQSsxNj4+Ml18MCkpe0g9KG9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MCk9PS0xO0E9SD8wOkF9fWVsc2V7QT0wfUM9KEF8MCk9PTA7ZG97aWYoKER8MCkhPTApe2lmKChjW0QrMTI+PjJdfDApIT0oY1tEKzE2Pj4yXXwwKSl7aWYoQyl7YnJlYWt9ZWxzZXticmVhayBhfX1pZighKChvY1tjWyhjW0Q+PjJdfDApKzM2Pj4yXSYxMjddKEQpfDApPT0tMSkpe2lmKCFDKXticmVhayBhfX1lbHNle209MTV9fWVsc2V7bT0xNX19d2hpbGUoMCk7aWYoKG18MCk9PTE1KXttPTA7aWYoQyl7RD0wO2JyZWFrfWVsc2V7RD0wfX1HPWFbcD4+MF18MDtGPShHJjEpPT0wO2lmKEYpe0g9KEcmMjU1KT4+PjF9ZWxzZXtIPWNbaj4+Ml18MH1pZigoKGNbdj4+Ml18MCktRXwwKT09KEh8MCkpe2lmKEYpe0U9KEcmMjU1KT4+PjE7Rz0oRyYyNTUpPj4+MTtIPUU8PDF9ZWxzZXtFPWNbaj4+Ml18MDtHPWNbaj4+Ml18MDtIPUU8PDF9ZG97aWYoIShHPj4+MDxIPj4+MCkpe2lmKEYpe2FbcCtIKzE+PjBdPTA7YVtwPj4wXT1FPDwyO2JyZWFrfWVsc2V7YVsoY1t3Pj4yXXwwKStIPj4wXT0wO2Nbaj4+Ml09SDticmVha319ZWxzZXtoZyhwLEgtR3wwKX19d2hpbGUoMCk7SD1hW3A+PjBdfDA7aWYoKEgmMSk9PTApe0c9MTB9ZWxzZXtHPWNbcD4+Ml18MDtIPUcmMjU1O0c9KEcmLTIpKyAtMXwwfUY9KEgmMSk9PTA7aWYoRil7SD0oSCYyNTUpPj4+MX1lbHNle0g9Y1tqPj4yXXwwfWRve2lmKCEoSD4+PjA8Rz4+PjApKXtpZihGKXthW3ArRysxPj4wXT0wO2FbcD4+MF09Rzw8MTticmVha31lbHNle2FbKGNbdz4+Ml18MCkrRz4+MF09MDtjW2o+PjJdPUc7YnJlYWt9fWVsc2V7aGcocCxHLUh8MCl9fXdoaWxlKDApO2lmKChhW3A+PjBdJjEpPT0wKXtGPWd9ZWxzZXtGPWNbZj4+Ml18MH1jW3Y+PjJdPUYrRTtFPUZ9Rz1BKzEyfDA7SD1jW0c+PjJdfDA7Rj1BKzE2fDA7aWYoKEh8MCk9PShjW0Y+PjJdfDApKXtIPW9jW2NbKGNbQT4+Ml18MCkrMzY+PjJdJjEyN10oQSl8MH1lbHNle0g9ZFtIPj4wXXwwfWlmKChvaShIJjI1NSx1LHksRSx2LHosQixvLHQscyxyLHgpfDApIT0wKXticmVha31DPWNbRz4+Ml18MDtpZigoQ3wwKT09KGNbRj4+Ml18MCkpe29jW2NbKGNbQT4+Ml18MCkrNDA+PjJdJjEyN10oQSl8MDtjb250aW51ZX1lbHNle2NbRz4+Ml09QysxO2NvbnRpbnVlfX14PWFbbz4+MF18MDtpZigoeCYxKT09MCl7eD0oeCYyNTUpPj4+MX1lbHNle3g9Y1tvKzQ+PjJdfDB9aWYoKCh4fDApIT0wPyhhW3U+PjBdfDApIT0wOjApPyhxPWNbcz4+Ml18MCwocS10fDApPDE2MCk6MCl7SD1jW3I+PjJdfDA7Y1tzPj4yXT1xKzQ7Y1txPj4yXT1IfWhbbD4+M109K0dtKEUsY1t2Pj4yXXwwLGspO3FrKG8sdCxjW3M+PjJdfDAsayk7aWYoIUMpe2lmKChjW0ErMTI+PjJdfDApPT0oY1tBKzE2Pj4yXXwwKSl7SD0ob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTE7QT1IPzA6QX19ZWxzZXtBPTB9bD0oQXwwKT09MDtkb3tpZigoRHwwKSE9MCl7aWYoKGNbRCsxMj4+Ml18MCkhPShjW0QrMTY+PjJdfDApKXtpZihsKXticmVha31lbHNle209Njg7YnJlYWt9fWlmKCEoKG9jW2NbKGNbRD4+Ml18MCkrMzY+PjJdJjEyN10oRCl8MCk9PS0xKSl7aWYoIWwpe209Njh9fWVsc2V7bT02Nn19ZWxzZXttPTY2fX13aGlsZSgwKTtpZigobXwwKT09NjY/bDowKXttPTY4fWlmKChtfDApPT02OCl7Y1trPj4yXT1jW2s+PjJdfDJ9Y1tiPj4yXT1BO2lmKCEoKGFbcD4+MF0mMSk9PTApPyhuPWNbdz4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoKGFbbz4+MF0mMSk9PTApe2k9ZTtyZXR1cm59bT1jW28rOD4+Ml18MDtpZigobXwwKT09MCl7aT1lO3JldHVybn12bihtKTtpPWU7cmV0dXJufWZ1bmN0aW9uIFZoKGIsZSxmLGcsaixrLGwpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9anwwO2s9a3wwO2w9bHwwO3ZhciBtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTA7ZT1pO2k9aSsyNTZ8MDt4PWUrMjA4fDA7ej1lKzIwMHwwO3c9ZSsyNDB8MDtvPWU7cD1lKzE4OHwwO3Y9ZSsxODR8MDt0PWUrMTZ8MDtzPWUrMTc2fDA7cj1lKzE4MHwwO3U9ZSsyNDF8MDt5PWUrMjQyfDA7QT1jW2Y+PjJdfDA7RD1jW2c+PjJdfDA7bmkobyxqLHgseix3KTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDtoZyhwLDEwKTtpZigoYVtwPj4wXSYxKT09MCl7RT1wKzF8MDtnPUU7Zj1wKzh8MH1lbHNle0U9cCs4fDA7Zz1wKzF8MDtmPUU7RT1jW0U+PjJdfDB9Y1t2Pj4yXT1FO2Nbcz4+Ml09dDtjW3I+PjJdPTA7YVt1Pj4wXT0xO2FbeT4+MF09Njk7aj1wKzR8MDt6PWFbej4+MF18MDtCPWFbdz4+MF18MDt3PXArOHwwO2E6d2hpbGUoMSl7aWYoKEF8MCkhPTApe2lmKChjW0ErMTI+PjJdfDApPT0oY1tBKzE2Pj4yXXwwKSl7SD0ob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTE7QT1IPzA6QX19ZWxzZXtBPTB9Qz0oQXwwKT09MDtkb3tpZigoRHwwKSE9MCl7aWYoKGNbRCsxMj4+Ml18MCkhPShjW0QrMTY+PjJdfDApKXtpZihDKXticmVha31lbHNle2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbRD4+Ml18MCkrMzY+PjJdJjEyN10oRCl8MCk9PS0xKSl7aWYoIUMpe2JyZWFrIGF9fWVsc2V7bT0xNX19ZWxzZXttPTE1fX13aGlsZSgwKTtpZigobXwwKT09MTUpe209MDtpZihDKXtEPTA7YnJlYWt9ZWxzZXtEPTB9fUc9YVtwPj4wXXwwO0Y9KEcmMSk9PTA7aWYoRil7SD0oRyYyNTUpPj4+MX1lbHNle0g9Y1tqPj4yXXwwfWlmKCgoY1t2Pj4yXXwwKS1FfDApPT0oSHwwKSl7aWYoRil7RT0oRyYyNTUpPj4+MTtHPShHJjI1NSk+Pj4xO0g9RTw8MX1lbHNle0U9Y1tqPj4yXXwwO0c9Y1tqPj4yXXwwO0g9RTw8MX1kb3tpZighKEc+Pj4wPEg+Pj4wKSl7aWYoRil7YVtwK0grMT4+MF09MDthW3A+PjBdPUU8PDI7YnJlYWt9ZWxzZXthWyhjW3c+PjJdfDApK0g+PjBdPTA7Y1tqPj4yXT1IO2JyZWFrfX1lbHNle2hnKHAsSC1HfDApfX13aGlsZSgwKTtIPWFbcD4+MF18MDtpZigoSCYxKT09MCl7Rz0xMH1lbHNle0c9Y1twPj4yXXwwO0g9RyYyNTU7Rz0oRyYtMikrIC0xfDB9Rj0oSCYxKT09MDtpZihGKXtIPShIJjI1NSk+Pj4xfWVsc2V7SD1jW2o+PjJdfDB9ZG97aWYoIShIPj4+MDxHPj4+MCkpe2lmKEYpe2FbcCtHKzE+PjBdPTA7YVtwPj4wXT1HPDwxO2JyZWFrfWVsc2V7YVsoY1t3Pj4yXXwwKStHPj4wXT0wO2Nbaj4+Ml09RzticmVha319ZWxzZXtoZyhwLEctSHwwKX19d2hpbGUoMCk7aWYoKGFbcD4+MF0mMSk9PTApe0Y9Z31lbHNle0Y9Y1tmPj4yXXwwfWNbdj4+Ml09RitFO0U9Rn1HPUErMTJ8MDtIPWNbRz4+Ml18MDtGPUErMTZ8MDtpZigoSHwwKT09KGNbRj4+Ml18MCkpe0g9b2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwfWVsc2V7SD1kW0g+PjBdfDB9aWYoKG9pKEgmMjU1LHUseSxFLHYseixCLG8sdCxzLHIseCl8MCkhPTApe2JyZWFrfUM9Y1tHPj4yXXwwO2lmKChDfDApPT0oY1tGPj4yXXwwKSl7b2NbY1soY1tBPj4yXXwwKSs0MD4+Ml0mMTI3XShBKXwwO2NvbnRpbnVlfWVsc2V7Y1tHPj4yXT1DKzE7Y29udGludWV9fXg9YVtvPj4wXXwwO2lmKCh4JjEpPT0wKXt4PSh4JjI1NSk+Pj4xfWVsc2V7eD1jW28rND4+Ml18MH1pZigoKHh8MCkhPTA/KGFbdT4+MF18MCkhPTA6MCk/KHE9Y1tzPj4yXXwwLChxLXR8MCk8MTYwKTowKXtIPWNbcj4+Ml18MDtjW3M+PjJdPXErNDtjW3E+PjJdPUh9aFtsPj4zXT0rRm0oRSxjW3Y+PjJdfDAsayk7cWsobyx0LGNbcz4+Ml18MCxrKTtpZighQyl7aWYoKGNbQSsxMj4+Ml18MCk9PShjW0ErMTY+PjJdfDApKXtIPShvY1tjWyhjW0E+PjJdfDApKzM2Pj4yXSYxMjddKEEpfDApPT0tMTtBPUg/MDpBfX1lbHNle0E9MH1sPShBfDApPT0wO2Rve2lmKChEfDApIT0wKXtpZigoY1tEKzEyPj4yXXwwKSE9KGNbRCsxNj4+Ml18MCkpe2lmKGwpe2JyZWFrfWVsc2V7bT02ODticmVha319aWYoISgob2NbY1soY1tEPj4yXXwwKSszNj4+Ml0mMTI3XShEKXwwKT09LTEpKXtpZighbCl7bT02OH19ZWxzZXttPTY2fX1lbHNle209NjZ9fXdoaWxlKDApO2lmKChtfDApPT02Nj9sOjApe209Njh9aWYoKG18MCk9PTY4KXtjW2s+PjJdPWNbaz4+Ml18Mn1jW2I+PjJdPUE7aWYoISgoYVtwPj4wXSYxKT09MCk/KG49Y1t3Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZigoYVtvPj4wXSYxKT09MCl7aT1lO3JldHVybn1tPWNbbys4Pj4yXXwwO2lmKChtfDApPT0wKXtpPWU7cmV0dXJufXZuKG0pO2k9ZTtyZXR1cm59ZnVuY3Rpb24gV2goYixlLGYsZyxoLGosayl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtlPWk7aT1pKzIyNHwwO249ZTtvPWUrMTg4fDA7bT1lKzE3NnwwO3c9ZSsxNnwwO3E9Y1toKzI4Pj4yXXwwO0Q9cSs0fDA7Y1tEPj4yXT0oY1tEPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tuPj4yXT0xMzQ1NjtjW24rND4+Ml09MjA4O2Nbbis4Pj4yXT0wO2NnKDEzNDU2LG4pfWg9KGNbMTM0NjA+PjJdfDApKyAtMXwwO3I9Y1txKzg+PjJdfDA7aWYoKGNbcSsxMj4+Ml18MCktcj4+Mj4+PjA+aD4+PjA/KHA9Y1tyKyhoPDwyKT4+Ml18MCwocHwwKSE9MCk6MCl7dWNbY1soY1twPj4yXXwwKSszMj4+Ml0mMzFdKHAsMTIwMTYsMTIwNDJ8MCxvKXwwO0M9cSs0fDA7RD1jW0M+PjJdfDA7Y1tDPj4yXT1EKyAtMTtpZigoRHwwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfWNbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2hnKG0sMTApO2lmKChhW20+PjBdJjEpPT0wKXt6PW0rMXwwO2g9ejtxPW0rOHwwfWVsc2V7ej1tKzh8MDtoPW0rMXwwO3E9ejt6PWNbej4+Ml18MH11PW0rNHwwO3Y9bysyNHwwO3M9bysyNXwwO3Q9bysyNnwwO3I9bztwPW0rOHwwO3k9Y1tmPj4yXXwwO3g9MDtBPXo7YTp3aGlsZSgxKXtpZigoeXwwKSE9MCl7aWYoKGNbeSsxMj4+Ml18MCk9PShjW3krMTY+PjJdfDApPyhvY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDApPT0tMTowKXtjW2Y+PjJdPTA7eT0wfX1lbHNle3k9MH1DPSh5fDApPT0wO0I9Y1tnPj4yXXwwO2Rve2lmKChCfDApIT0wKXtpZigoY1tCKzEyPj4yXXwwKSE9KGNbQisxNj4+Ml18MCkpe2lmKEMpe2JyZWFrfWVsc2V7YnJlYWsgYX19aWYoISgob2NbY1soY1tCPj4yXXwwKSszNj4+Ml0mMTI3XShCKXwwKT09LTEpKXtpZihDKXticmVha31lbHNle2JyZWFrIGF9fWVsc2V7Y1tnPj4yXT0wO2w9MjY7YnJlYWt9fWVsc2V7bD0yNn19d2hpbGUoMCk7aWYoKGx8MCk9PTI2PyhsPTAsQyk6MCl7YnJlYWt9RD1hW20+PjBdfDA7Qj0oRCYxKT09MDtpZihCKXtDPShEJjI1NSk+Pj4xfWVsc2V7Qz1jW3U+PjJdfDB9aWYoKEEtenwwKT09KEN8MCkpe2lmKEIpe0E9KEQmMjU1KT4+PjE7Qz0oRCYyNTUpPj4+MTt6PUE8PDF9ZWxzZXtBPWNbdT4+Ml18MDtDPWNbdT4+Ml18MDt6PUE8PDF9ZG97aWYoIShDPj4+MDx6Pj4+MCkpe2lmKEIpe2FbbSt6KzE+PjBdPTA7YVttPj4wXT1BPDwyO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKSt6Pj4wXT0wO2NbdT4+Ml09ejticmVha319ZWxzZXtoZyhtLHotQ3wwKX19d2hpbGUoMCk7Qz1hW20+PjBdfDA7aWYoKEMmMSk9PTApe3o9MTB9ZWxzZXt6PWNbbT4+Ml18MDtDPXomMjU1O3o9KHomLTIpKyAtMXwwfUI9KEMmMSk9PTA7aWYoQil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1t1Pj4yXXwwfWRve2lmKCEoQz4+PjA8ej4+PjApKXtpZihCKXthW20reisxPj4wXT0wO2FbbT4+MF09ejw8MTticmVha31lbHNle2FbKGNbcD4+Ml18MCkrej4+MF09MDtjW3U+PjJdPXo7YnJlYWt9fWVsc2V7aGcobSx6LUN8MCl9fXdoaWxlKDApO2lmKChhW20+PjBdJjEpPT0wKXt6PWh9ZWxzZXt6PWNbcT4+Ml18MH1BPXorQXwwfUI9Y1t5KzEyPj4yXXwwO2lmKChCfDApPT0oY1t5KzE2Pj4yXXwwKSl7eT1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXt5PWRbQj4+MF18MH1CPXkmMjU1O3k9KEF8MCk9PSh6fDApO2Rve2lmKHkpe0M9KGFbdj4+MF18MCk9PUI8PDI0Pj4yNDtpZighQz8hKChhW3M+PjBdfDApPT1CPDwyND4+MjQpOjApe0M9bztsPTYxO2JyZWFrfWFbQT4+MF09Qz80Mzo0NTtBPUErMXwwO3g9MH1lbHNle0M9bztsPTYxfX13aGlsZSgwKTtkb3tpZigobHwwKT09NjEpe3doaWxlKDEpe2w9MDtpZigoYVtDPj4wXXwwKT09Qjw8MjQ+PjI0KXticmVha31DPUMrMXwwO2lmKChDfDApPT0odHwwKSl7Qz10O2JyZWFrfWVsc2V7bD02MX19Qj1DLXJ8MDtpZigoQnwwKT4yMyl7YnJlYWsgYX1pZigoQnwwKTwyMil7YVtBPj4wXT1hWzEyMDE2K0I+PjBdfDA7QT1BKzF8MDt4PXgrMXwwO2JyZWFrfWlmKHkpe3o9QTticmVhayBhfWlmKChBLXp8MCk+PTMpe2JyZWFrIGF9aWYoKGFbQSsgLTE+PjBdfDApIT00OCl7YnJlYWsgYX1hW0E+PjBdPWFbMTIwMTYrQj4+MF18MDtBPUErMXwwO3g9MH19d2hpbGUoMCk7eT1jW2Y+PjJdfDA7Qj15KzEyfDA7Qz1jW0I+PjJdfDA7aWYoKEN8MCk9PShjW3krMTY+PjJdfDApKXtvY1tjWyhjW3k+PjJdfDApKzQwPj4yXSYxMjddKHkpfDA7RD13O3c9RDtjb250aW51ZX1lbHNle2NbQj4+Ml09QysxO0Q9dzt3PUQ7Y29udGludWV9fWFbeiszPj4wXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1EPWNbMzM0MF18MDtjW24+PjJdPWs7aWYoKFloKHosRCxuKXwwKSE9MSl7Y1tqPj4yXT00fWs9Y1tmPj4yXXwwO2lmKChrfDApIT0wKXtpZigoY1trKzEyPj4yXXwwKT09KGNbaysxNj4+Ml18MCk/KG9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MCk9PS0xOjApe2NbZj4+Ml09MDtmPTB9ZWxzZXtmPWt9fWVsc2V7Zj0wfWs9KGZ8MCk9PTA7bj1jW2c+PjJdfDA7ZG97aWYoKG58MCkhPTApe2lmKChjW24rMTI+PjJdfDApIT0oY1tuKzE2Pj4yXXwwKSl7aWYoayl7YnJlYWt9ZWxzZXtsPTkyO2JyZWFrfX1pZighKChvY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDApPT0tMSkpe2lmKGspe2JyZWFrfWVsc2V7bD05MjticmVha319ZWxzZXtjW2c+PjJdPTA7bD05MDticmVha319ZWxzZXtsPTkwfX13aGlsZSgwKTtpZigobHwwKT09OTA/azowKXtsPTkyfWlmKChsfDApPT05Mil7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT1mO2lmKChhW20+PjBdJjEpPT0wKXtpPWU7cmV0dXJufWo9Y1twPj4yXXwwO2lmKChqfDApPT0wKXtpPWU7cmV0dXJufXZuKGopO2k9ZTtyZXR1cm59RD1YYSg0KXwwO2NbRD4+Ml09MjEzMDQ7d2IoRHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gWGgoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MDtuPWk7cD1jW2Y+PjJdfDA7bz0ocHwwKT09KGV8MCk7ZG97aWYobyl7cT0oYVttKzI0Pj4wXXwwKT09Yjw8MjQ+PjI0O2lmKCFxPyEoKGFbbSsyNT4+MF18MCk9PWI8PDI0Pj4yNCk6MCl7YnJlYWt9Y1tmPj4yXT1lKzE7YVtlPj4wXT1xPzQzOjQ1O2NbZz4+Ml09MDtxPTA7aT1uO3JldHVybiBxfDB9fXdoaWxlKDApO3E9YVtqPj4wXXwwO2lmKChxJjEpPT0wKXtqPShxJjI1NSk+Pj4xfWVsc2V7aj1jW2orND4+Ml18MH1pZigoanwwKSE9MD9iPDwyND4+MjQ9PWg8PDI0Pj4yNDowKXtvPWNbbD4+Ml18MDtpZigoby1rfDApPj0xNjApe3E9MDtpPW47cmV0dXJuIHF8MH1xPWNbZz4+Ml18MDtjW2w+PjJdPW8rNDtjW28+PjJdPXE7Y1tnPj4yXT0wO3E9MDtpPW47cmV0dXJuIHF8MH1sPW0rMjZ8MDtrPW07d2hpbGUoMSl7aWYoKGFbaz4+MF18MCk9PWI8PDI0Pj4yNCl7YnJlYWt9az1rKzF8MDtpZigoa3wwKT09KGx8MCkpe2s9bDticmVha319bT1rLW18MDtpZigobXwwKT4yMyl7cT0tMTtpPW47cmV0dXJuIHF8MH1pZigoZHwwKT09MTB8KGR8MCk9PTgpe2lmKChtfDApPj0oZHwwKSl7cT0tMTtpPW47cmV0dXJuIHF8MH19ZWxzZSBpZigoZHwwKT09MTY/KG18MCk+PTIyOjApe2lmKG8pe3E9LTE7aT1uO3JldHVybiBxfDB9aWYoKHAtZXwwKT49Myl7cT0tMTtpPW47cmV0dXJuIHF8MH1pZigoYVtwKyAtMT4+MF18MCkhPTQ4KXtxPS0xO2k9bjtyZXR1cm4gcXwwfWNbZz4+Ml09MDtxPWFbMTIwMTYrbT4+MF18MDtjW2Y+PjJdPXArMTthW3A+PjBdPXE7cT0wO2k9bjtyZXR1cm4gcXwwfXE9YVsxMjAxNittPj4wXXwwO2NbZj4+Ml09cCsxO2FbcD4+MF09cTtjW2c+PjJdPShjW2c+PjJdfDApKzE7cT0wO2k9bjtyZXR1cm4gcXwwfWZ1bmN0aW9uIFloKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MDtlPWk7aT1pKzE2fDA7Zj1lO2NbZj4+Ml09ZDtiPWliKGJ8MCl8MDthPU1hKGF8MCwxMjA1NixmfDApfDA7aWYoKGJ8MCk9PTApe2k9ZTtyZXR1cm4gYXwwfWliKGJ8MCl8MDtpPWU7cmV0dXJuIGF8MH1mdW5jdGlvbiBaaChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBfaChhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gJGgoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7az1pO2k9aSs2NHwwO3A9azt1PWsrNDh8MDtxPWsrNTJ8MDt0PWsrNTZ8MDtzPWsrMTZ8MDtyPWsrMTJ8MDtsPWsrMjR8MDtpZigoY1tnKzQ+PjJdJjF8MCk9PTApe2NbcT4+Ml09LTE7bD1jWyhjW2Q+PjJdfDApKzE2Pj4yXXwwO2Nbcz4+Ml09Y1tlPj4yXTtjW3I+PjJdPWNbZj4+Ml07Y1t1KzA+PjJdPWNbcyswPj4yXTtjW3ArMD4+Ml09Y1tyKzA+PjJdO2ljW2wmNjNdKHQsZCx1LHAsZyxoLHEpO2w9Y1t0Pj4yXXwwO2NbZT4+Ml09bDtlPWNbcT4+Ml18MDtpZigoZXwwKT09MSl7YVtqPj4wXT0xfWVsc2UgaWYoKGV8MCk9PTApe2Fbaj4+MF09MH1lbHNle2Fbaj4+MF09MTtjW2g+PjJdPTR9Y1tiPj4yXT1sO2k9aztyZXR1cm59cT1nKzI4fDA7cj1jW3E+PjJdfDA7ZD1yKzR8MDtjW2Q+PjJdPShjW2Q+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW3A+PjJdPTEzNDQ4O2NbcCs0Pj4yXT0yMDg7Y1twKzg+PjJdPTA7Y2coMTM0NDgscCl9cz0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dD1jW3IrOD4+Ml18MDtpZigoY1tyKzEyPj4yXXwwKS10Pj4yPj4+MD5zPj4+MD8obz1jW3QrKHM8PDIpPj4yXXwwLChvfDApIT0wKTowKXt1PXIrNHwwO2Q9Y1t1Pj4yXXwwO2NbdT4+Ml09ZCsgLTE7aWYoKGR8MCk9PTApe2xjW2NbKGNbcj4+Ml18MCkrOD4+Ml0mMjU1XShyKX1xPWNbcT4+Ml18MDtkPXErNHwwO2NbZD4+Ml09KGNbZD4+Ml18MCkrMTtpZighKChjWzM0MDJdfDApPT0tMSkpe2NbcD4+Ml09MTM2MDg7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzYwOCxwKX1wPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtyPWNbcSs4Pj4yXXwwO2lmKChjW3ErMTI+PjJdfDApLXI+PjI+Pj4wPnA+Pj4wPyhuPWNbcisocDw8Mik+PjJdfDAsKG58MCkhPTApOjApe3U9cSs0fDA7ZD1jW3U+PjJdfDA7Y1t1Pj4yXT1kKyAtMTtpZigoZHwwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfW1jW2NbKGNbbj4+Ml18MCkrMjQ+PjJdJjEyN10obCxuKTtkPWwrMTJ8MDttY1tjWyhjW24+PjJdfDApKzI4Pj4yXSYxMjddKGQsbik7YVtqPj4wXT0oYWkoZSxjW2Y+PjJdfDAsbCxsKzI0fDAsbyxoLDEpfDApPT0obHwwKSYxO2NbYj4+Ml09Y1tlPj4yXTtpZighKChhW2Q+PjBdJjEpPT0wKT8obT1jW2wrMjA+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKChhW2w+PjBdJjEpPT0wKXtpPWs7cmV0dXJufWI9Y1tsKzg+PjJdfDA7aWYoKGJ8MCk9PTApe2k9aztyZXR1cm59dm4oYik7aT1rO3JldHVybn1kPVhhKDQpfDA7Y1tkPj4yXT0yMTMwNDt3YihkfDAsMjEzNzYsMTk2KX1kPVhhKDQpfDA7Y1tkPj4yXT0yMTMwNDt3YihkfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBhaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO2w9aTtpPWkrMTEyfDA7bj1sO3M9KGYtZXwwKS8xMnwwO2lmKHM+Pj4wPjEwMCl7bj11bihzKXwwO2lmKChufDApPT0wKXt6PVhhKDQpfDA7Y1t6Pj4yXT0yMjY4MDt3Yih6fDAsMjI3MjgsMjA2KX1lbHNle2s9bn19ZWxzZXtrPTB9bz0oZXwwKT09KGZ8MCk7aWYobyl7dD0wfWVsc2V7cD1lO3Q9MDtxPW47d2hpbGUoMSl7cj1hW3A+PjBdfDA7aWYoKHImMSk9PTApe3I9KHImMjU1KT4+PjF9ZWxzZXtyPWNbcCs0Pj4yXXwwfWlmKChyfDApPT0wKXthW3E+PjBdPTI7dD10KzF8MDtzPXMrIC0xfDB9ZWxzZXthW3E+PjBdPTF9cD1wKzEyfDA7aWYoKHB8MCk9PShmfDApKXticmVha31lbHNle3E9cSsxfDB9fX1wPTA7YTp3aGlsZSgxKXt1PShzfDApIT0wO3E9cDt3aGlsZSgxKXtyPWNbYj4+Ml18MDtkb3tpZigocnwwKSE9MCl7cD1jW3IrMTI+PjJdfDA7aWYoKHB8MCk9PShjW3IrMTY+PjJdfDApKXtwPW9jW2NbKGNbcj4+Ml18MCkrMzY+PjJdJjEyN10ocil8MH1lbHNle3A9Y1twPj4yXXwwfWlmKChwfDApPT0tMSl7Y1tiPj4yXT0wO3I9MTticmVha31lbHNle3I9KGNbYj4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7cj0xfX13aGlsZSgwKTtpZigoZHwwKT09MCl7cD0wO3c9MTtkPTB9ZWxzZXtwPWNbZCsxMj4+Ml18MDtpZigocHwwKT09KGNbZCsxNj4+Ml18MCkpe3A9b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7cD1jW3A+PjJdfDB9ej0ocHwwKT09LTE7cD16PzA6ZDt3PXo/MTowO2Q9ej8wOmR9dj1jW2I+PjJdfDA7aWYoISgocl53KSZ1KSl7YnJlYWsgYX1wPWNbdisxMj4+Ml18MDtpZigocHwwKT09KGNbdisxNj4+Ml18MCkpe3I9b2NbY1soY1t2Pj4yXXwwKSszNj4+Ml0mMTI3XSh2KXwwfWVsc2V7cj1jW3A+PjJdfDB9aWYoIWope3I9eGNbY1soY1tnPj4yXXwwKSsyOD4+Ml0mNjNdKGcscil8MH1wPXErMXwwO2lmKG8pe3E9cH1lbHNle2JyZWFrfX1iOmRve2lmKGope3c9MDt1PWU7dj1uO3doaWxlKDEpe2Rve2lmKChhW3Y+PjBdfDApPT0xKXt4PWFbdT4+MF18MDt5PSh4JjEpPT0wO2lmKHkpe3o9dSs0fDB9ZWxzZXt6PWNbdSs4Pj4yXXwwfWlmKChyfDApIT0oY1t6KyhxPDwyKT4+Ml18MCkpe2Fbdj4+MF09MDtzPXMrIC0xfDA7YnJlYWt9aWYoeSl7dz0oeCYyNTUpPj4+MX1lbHNle3c9Y1t1KzQ+PjJdfDB9aWYoKHd8MCk9PShwfDApKXthW3Y+PjBdPTI7dz0xO3Q9dCsxfDA7cz1zKyAtMXwwfWVsc2V7dz0xfX19d2hpbGUoMCk7dT11KzEyfDA7aWYoKHV8MCk9PShmfDApKXticmVhayBifXY9disxfDB9fWVsc2V7dz0wO3U9ZTt2PW47d2hpbGUoMSl7ZG97aWYoKGFbdj4+MF18MCk9PTEpe2lmKChhW3U+PjBdJjEpPT0wKXt4PXUrNHwwfWVsc2V7eD1jW3UrOD4+Ml18MH1pZigocnwwKSE9KHhjW2NbKGNbZz4+Ml18MCkrMjg+PjJdJjYzXShnLGNbeCsocTw8Mik+PjJdfDApfDApKXthW3Y+PjBdPTA7cz1zKyAtMXwwO2JyZWFrfXc9YVt1Pj4wXXwwO2lmKCh3JjEpPT0wKXt3PSh3JjI1NSk+Pj4xfWVsc2V7dz1jW3UrND4+Ml18MH1pZigod3wwKT09KHB8MCkpe2Fbdj4+MF09Mjt3PTE7dD10KzF8MDtzPXMrIC0xfDB9ZWxzZXt3PTF9fX13aGlsZSgwKTt1PXUrMTJ8MDtpZigodXwwKT09KGZ8MCkpe2JyZWFrIGJ9dj12KzF8MH19fXdoaWxlKDApO2lmKCF3KXtjb250aW51ZX11PWNbYj4+Ml18MDtyPXUrMTJ8MDtxPWNbcj4+Ml18MDtpZigocXwwKT09KGNbdSsxNj4+Ml18MCkpe29jW2NbKGNbdT4+Ml18MCkrNDA+PjJdJjEyN10odSl8MH1lbHNle2Nbcj4+Ml09cSs0fWlmKChzK3R8MCk+Pj4wPDIpe2NvbnRpbnVlfWVsc2V7cj1lO3E9bn13aGlsZSgxKXtpZigoYVtxPj4wXXwwKT09Mil7dT1hW3I+PjBdfDA7aWYoKHUmMSk9PTApe3U9KHUmMjU1KT4+PjF9ZWxzZXt1PWNbcis0Pj4yXXwwfWlmKCh1fDApIT0ocHwwKSl7YVtxPj4wXT0wO3Q9dCsgLTF8MH19cj1yKzEyfDA7aWYoKHJ8MCk9PShmfDApKXtjb250aW51ZSBhfWVsc2V7cT1xKzF8MH19fWRve2lmKCh2fDApIT0wKXtqPWNbdisxMj4+Ml18MDtpZigoanwwKT09KGNbdisxNj4+Ml18MCkpe2o9b2NbY1soY1t2Pj4yXXwwKSszNj4+Ml0mMTI3XSh2KXwwfWVsc2V7aj1jW2o+PjJdfDB9aWYoKGp8MCk9PS0xKXtjW2I+PjJdPTA7Yj0xO2JyZWFrfWVsc2V7Yj0oY1tiPj4yXXwwKT09MDticmVha319ZWxzZXtiPTF9fXdoaWxlKDApO2lmKChwfDApIT0wKXtqPWNbcCsxMj4+Ml18MDtpZigoanwwKT09KGNbcCsxNj4+Ml18MCkpe2o9b2NbY1soY1twPj4yXXwwKSszNj4+Ml0mMTI3XShwKXwwfWVsc2V7aj1jW2o+PjJdfDB9aWYoISgoanwwKT09LTEpKXtpZighYil7bT04OH19ZWxzZXttPTg2fX1lbHNle209ODZ9aWYoKG18MCk9PTg2P2I6MCl7bT04OH1pZigobXwwKT09ODgpe2NbaD4+Ml09Y1toPj4yXXwyfWM6ZG97aWYoIW8pe2lmKChhW24+PjBdfDApPT0yKXtmPWV9ZWxzZXt3aGlsZSgxKXtlPWUrMTJ8MDtuPW4rMXwwO2lmKChlfDApPT0oZnwwKSl7bT05MzticmVhayBjfWlmKChhW24+PjBdfDApPT0yKXtmPWU7YnJlYWt9fX19ZWxzZXttPTkzfX13aGlsZSgwKTtpZigobXwwKT09OTMpe2NbaD4+Ml09Y1toPj4yXXw0fWlmKChrfDApPT0wKXtpPWw7cmV0dXJuIGZ8MH12bihrKTtpPWw7cmV0dXJuIGZ8MH1mdW5jdGlvbiBiaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtkPWk7aT1pKzMwNHwwO3U9ZCsxNjB8MDtvPWQrMjgwfDA7bj1kKzI2NHwwO209ZCsyODR8MDt0PWQrMzAwfDA7cj1kO3M9ZCsyNzZ8MDtxPWQrMjk2fDA7dz1jW2U+PjJdfDA7eT1jW2Y+PjJdfDA7Zj1jW2crND4+Ml0mNzQ7aWYoKGZ8MCk9PTY0KXtmPTh9ZWxzZSBpZigoZnwwKT09MCl7Zj0wfWVsc2UgaWYoKGZ8MCk9PTgpe2Y9MTZ9ZWxzZXtmPTEwfXBpKG4sZyx1LG8pO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2hnKG0sMTApO2lmKChhW20+PjBdJjEpPT0wKXt6PW0rMXwwO2U9ejtnPW0rOHwwfWVsc2V7ej1tKzh8MDtlPW0rMXwwO2c9ejt6PWNbej4+Ml18MH1jW3Q+PjJdPXo7Y1tzPj4yXT1yO2NbcT4+Ml09MDt2PW0rNHwwO3g9Y1tvPj4yXXwwO289bSs4fDA7d2hpbGUoMSl7aWYoKHd8MCk9PTApe0E9MTt3PTB9ZWxzZXtBPWNbdysxMj4+Ml18MDtpZigoQXwwKT09KGNbdysxNj4+Ml18MCkpe0E9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7QT1jW0E+PjJdfDB9Qz0oQXwwKT09LTE7QT1DPzE6MDt3PUM/MDp3fWlmKCh5fDApIT0wKXtCPWNbeSsxMj4+Ml18MDtpZigoQnwwKT09KGNbeSsxNj4+Ml18MCkpe0I9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7Qj1jW0I+PjJdfDB9aWYoISgoQnwwKT09LTEpKXtpZighQSl7YnJlYWt9fWVsc2V7az0yMH19ZWxzZXtrPTIwfWlmKChrfDApPT0yMCl7az0wO2lmKEEpe3k9MDticmVha31lbHNle3k9MH19QT1hW20+PjBdfDA7Qj0oQSYxKT09MDtpZihCKXtDPShBJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9aWYoKChjW3Q+PjJdfDApLXp8MCk9PShDfDApKXtpZihCKXtEPShBJjI1NSk+Pj4xO3o9KEEmMjU1KT4+PjE7Qz1EPDwxO0E9RH1lbHNle0E9Y1t2Pj4yXXwwO3o9Y1t2Pj4yXXwwO0M9QTw8MX1kb3tpZighKHo+Pj4wPEM+Pj4wKSl7aWYoQil7YVttK0MrMT4+MF09MDthW20+PjBdPUE8PDI7YnJlYWt9ZWxzZXthWyhjW28+PjJdfDApK0M+PjBdPTA7Y1t2Pj4yXT1DO2JyZWFrfX1lbHNle2hnKG0sQy16fDApfX13aGlsZSgwKTtDPWFbbT4+MF18MDtpZigoQyYxKT09MCl7Qj0xMH1lbHNle0I9Y1ttPj4yXXwwO0M9QiYyNTU7Qj0oQiYtMikrIC0xfDB9ej0oQyYxKT09MDtpZih6KXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9ZG97aWYoIShDPj4+MDxCPj4+MCkpe2lmKHope2FbbStCKzE+PjBdPTA7YVttPj4wXT1CPDwxO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStCPj4wXT0wO2Nbdj4+Ml09QjticmVha319ZWxzZXtoZyhtLEItQ3wwKX19d2hpbGUoMCk7aWYoKGFbbT4+MF0mMSk9PTApe3o9ZX1lbHNle3o9Y1tnPj4yXXwwfWNbdD4+Ml09eitBfUE9dysxMnwwO0M9Y1tBPj4yXXwwO0I9dysxNnwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7Qz1vY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSYxMjddKHcpfDB9ZWxzZXtDPWNbQz4+Ml18MH1pZigobGkoQyxmLHosdCxxLHgsbixyLHMsdSl8MCkhPTApe2JyZWFrfUM9Y1tBPj4yXXwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7b2NbY1soY1t3Pj4yXXwwKSs0MD4+Ml0mMTI3XSh3KXwwO2NvbnRpbnVlfWVsc2V7Y1tBPj4yXT1DKzQ7Y29udGludWV9fXU9YVtuPj4wXXwwO2lmKCh1JjEpPT0wKXt1PSh1JjI1NSk+Pj4xfWVsc2V7dT1jW24rND4+Ml18MH1pZigodXwwKSE9MD8ocD1jW3M+PjJdfDAsKHAtcnwwKTwxNjApOjApe0Q9Y1txPj4yXXwwO2Nbcz4+Ml09cCs0O2NbcD4+Ml09RH1jW2o+PjJdPU5tKHosY1t0Pj4yXXwwLGgsZil8MDtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gY2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTA7ZD1pO2k9aSszMDR8MDt1PWQrMTYwfDA7bz1kKzI4MHwwO249ZCsyNjR8MDttPWQrMjg0fDA7dD1kKzMwMHwwO3I9ZDtzPWQrMjc2fDA7cT1kKzI5NnwwO3c9Y1tlPj4yXXwwO3k9Y1tmPj4yXXwwO2Y9Y1tnKzQ+PjJdJjc0O2lmKChmfDApPT04KXtmPTE2fWVsc2UgaWYoKGZ8MCk9PTY0KXtmPTh9ZWxzZSBpZigoZnwwKT09MCl7Zj0wfWVsc2V7Zj0xMH1waShuLGcsdSxvKTtjW20rMD4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtoZyhtLDEwKTtpZigoYVttPj4wXSYxKT09MCl7ej1tKzF8MDtlPXo7Zz1tKzh8MH1lbHNle3o9bSs4fDA7ZT1tKzF8MDtnPXo7ej1jW3o+PjJdfDB9Y1t0Pj4yXT16O2Nbcz4+Ml09cjtjW3E+PjJdPTA7dj1tKzR8MDt4PWNbbz4+Ml18MDtvPW0rOHwwO3doaWxlKDEpe2lmKCh3fDApPT0wKXtBPTE7dz0wfWVsc2V7QT1jW3crMTI+PjJdfDA7aWYoKEF8MCk9PShjW3crMTY+PjJdfDApKXtBPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle0E9Y1tBPj4yXXwwfUM9KEF8MCk9PS0xO0E9Qz8xOjA7dz1DPzA6d31pZigoeXwwKSE9MCl7Qj1jW3krMTI+PjJdfDA7aWYoKEJ8MCk9PShjW3krMTY+PjJdfDApKXtCPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle0I9Y1tCPj4yXXwwfWlmKCEoKEJ8MCk9PS0xKSl7aWYoIUEpe2JyZWFrfX1lbHNle2s9MjB9fWVsc2V7az0yMH1pZigoa3wwKT09MjApe2s9MDtpZihBKXt5PTA7YnJlYWt9ZWxzZXt5PTB9fUE9YVttPj4wXXwwO0I9KEEmMSk9PTA7aWYoQil7Qz0oQSYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWlmKCgoY1t0Pj4yXXwwKS16fDApPT0oQ3wwKSl7aWYoQil7RD0oQSYyNTUpPj4+MTt6PShBJjI1NSk+Pj4xO0M9RDw8MTtBPUR9ZWxzZXtBPWNbdj4+Ml18MDt6PWNbdj4+Ml18MDtDPUE8PDF9ZG97aWYoISh6Pj4+MDxDPj4+MCkpe2lmKEIpe2FbbStDKzE+PjBdPTA7YVttPj4wXT1BPDwyO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStDPj4wXT0wO2Nbdj4+Ml09QzticmVha319ZWxzZXtoZyhtLEMtenwwKX19d2hpbGUoMCk7Qz1hW20+PjBdfDA7aWYoKEMmMSk9PTApe0I9MTB9ZWxzZXtCPWNbbT4+Ml18MDtDPUImMjU1O0I9KEImLTIpKyAtMXwwfXo9KEMmMSk9PTA7aWYoeil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWRve2lmKCEoQz4+PjA8Qj4+PjApKXtpZih6KXthW20rQisxPj4wXT0wO2FbbT4+MF09Qjw8MTticmVha31lbHNle2FbKGNbbz4+Ml18MCkrQj4+MF09MDtjW3Y+PjJdPUI7YnJlYWt9fWVsc2V7aGcobSxCLUN8MCl9fXdoaWxlKDApO2lmKChhW20+PjBdJjEpPT0wKXt6PWV9ZWxzZXt6PWNbZz4+Ml18MH1jW3Q+PjJdPXorQX1BPXcrMTJ8MDtDPWNbQT4+Ml18MDtCPXcrMTZ8MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe0M9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7Qz1jW0M+PjJdfDB9aWYoKGxpKEMsZix6LHQscSx4LG4scixzLHUpfDApIT0wKXticmVha31DPWNbQT4+Ml18MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe29jW2NbKGNbdz4+Ml18MCkrNDA+PjJdJjEyN10odyl8MDtjb250aW51ZX1lbHNle2NbQT4+Ml09Qys0O2NvbnRpbnVlfX11PWFbbj4+MF18MDtpZigodSYxKT09MCl7dT0odSYyNTUpPj4+MX1lbHNle3U9Y1tuKzQ+PjJdfDB9aWYoKHV8MCkhPTA/KHA9Y1tzPj4yXXwwLChwLXJ8MCk8MTYwKTowKXtEPWNbcT4+Ml18MDtjW3M+PjJdPXArNDtjW3A+PjJdPUR9Qz1NbSh6LGNbdD4+Ml18MCxoLGYpfDA7RD1qO2NbRD4+Ml09QztjW0QrND4+Ml09STtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZGkoZCxlLGYsZyxoLGosayl7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTA7ZT1pO2k9aSszMDR8MDt2PWUrMTYwfDA7cD1lKzI4MHwwO289ZSsyNjR8MDtuPWUrMjg0fDA7dT1lKzMwMHwwO3M9ZTt0PWUrMjc2fDA7cj1lKzI5NnwwO3g9Y1tmPj4yXXwwO3o9Y1tnPj4yXXwwO2c9Y1toKzQ+PjJdJjc0O2lmKChnfDApPT0wKXtnPTB9ZWxzZSBpZigoZ3wwKT09NjQpe2c9OH1lbHNlIGlmKChnfDApPT04KXtnPTE2fWVsc2V7Zz0xMH1waShvLGgsdixwKTtjW24rMD4+Ml09MDtjW24rND4+Ml09MDtjW24rOD4+Ml09MDtoZyhuLDEwKTtpZigoYVtuPj4wXSYxKT09MCl7QT1uKzF8MDtmPUE7aD1uKzh8MH1lbHNle0E9bis4fDA7Zj1uKzF8MDtoPUE7QT1jW0E+PjJdfDB9Y1t1Pj4yXT1BO2NbdD4+Ml09cztjW3I+PjJdPTA7dz1uKzR8MDt5PWNbcD4+Ml18MDtwPW4rOHwwO3doaWxlKDEpe2lmKCh4fDApPT0wKXtCPTE7eD0wfWVsc2V7Qj1jW3grMTI+PjJdfDA7aWYoKEJ8MCk9PShjW3grMTY+PjJdfDApKXtCPW9jW2NbKGNbeD4+Ml18MCkrMzY+PjJdJjEyN10oeCl8MH1lbHNle0I9Y1tCPj4yXXwwfUQ9KEJ8MCk9PS0xO0I9RD8xOjA7eD1EPzA6eH1pZigoenwwKSE9MCl7Qz1jW3orMTI+PjJdfDA7aWYoKEN8MCk9PShjW3orMTY+PjJdfDApKXtDPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle0M9Y1tDPj4yXXwwfWlmKCEoKEN8MCk9PS0xKSl7aWYoIUIpe2JyZWFrfX1lbHNle2w9MjB9fWVsc2V7bD0yMH1pZigobHwwKT09MjApe2w9MDtpZihCKXt6PTA7YnJlYWt9ZWxzZXt6PTB9fUI9YVtuPj4wXXwwO0M9KEImMSk9PTA7aWYoQyl7RD0oQiYyNTUpPj4+MX1lbHNle0Q9Y1t3Pj4yXXwwfWlmKCgoY1t1Pj4yXXwwKS1BfDApPT0oRHwwKSl7aWYoQyl7RT0oQiYyNTUpPj4+MTtBPShCJjI1NSk+Pj4xO0Q9RTw8MTtCPUV9ZWxzZXtCPWNbdz4+Ml18MDtBPWNbdz4+Ml18MDtEPUI8PDF9ZG97aWYoIShBPj4+MDxEPj4+MCkpe2lmKEMpe2FbbitEKzE+PjBdPTA7YVtuPj4wXT1CPDwyO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKStEPj4wXT0wO2Nbdz4+Ml09RDticmVha319ZWxzZXtoZyhuLEQtQXwwKX19d2hpbGUoMCk7RD1hW24+PjBdfDA7aWYoKEQmMSk9PTApe0M9MTB9ZWxzZXtDPWNbbj4+Ml18MDtEPUMmMjU1O0M9KEMmLTIpKyAtMXwwfUE9KEQmMSk9PTA7aWYoQSl7RD0oRCYyNTUpPj4+MX1lbHNle0Q9Y1t3Pj4yXXwwfWRve2lmKCEoRD4+PjA8Qz4+PjApKXtpZihBKXthW24rQysxPj4wXT0wO2Fbbj4+MF09Qzw8MTticmVha31lbHNle2FbKGNbcD4+Ml18MCkrQz4+MF09MDtjW3c+PjJdPUM7YnJlYWt9fWVsc2V7aGcobixDLUR8MCl9fXdoaWxlKDApO2lmKChhW24+PjBdJjEpPT0wKXtBPWZ9ZWxzZXtBPWNbaD4+Ml18MH1jW3U+PjJdPUErQn1CPXgrMTJ8MDtEPWNbQj4+Ml18MDtDPXgrMTZ8MDtpZigoRHwwKT09KGNbQz4+Ml18MCkpe0Q9b2NbY1soY1t4Pj4yXXwwKSszNj4+Ml0mMTI3XSh4KXwwfWVsc2V7RD1jW0Q+PjJdfDB9aWYoKGxpKEQsZyxBLHUscix5LG8scyx0LHYpfDApIT0wKXticmVha31EPWNbQj4+Ml18MDtpZigoRHwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbeD4+Ml18MCkrNDA+PjJdJjEyN10oeCl8MDtjb250aW51ZX1lbHNle2NbQj4+Ml09RCs0O2NvbnRpbnVlfX12PWFbbz4+MF18MDtpZigodiYxKT09MCl7dj0odiYyNTUpPj4+MX1lbHNle3Y9Y1tvKzQ+PjJdfDB9aWYoKHZ8MCkhPTA/KHE9Y1t0Pj4yXXwwLChxLXN8MCk8MTYwKTowKXtFPWNbcj4+Ml18MDtjW3Q+PjJdPXErNDtjW3E+PjJdPUV9YltrPj4xXT1MbShBLGNbdT4+Ml18MCxqLGcpfDA7cWsobyxzLGNbdD4+Ml18MCxqKTtpZigoeHwwKT09MCl7az0wO3E9MX1lbHNle2s9Y1t4KzEyPj4yXXwwO2lmKChrfDApPT0oY1t4KzE2Pj4yXXwwKSl7az1vY1tjWyhjW3g+PjJdfDApKzM2Pj4yXSYxMjddKHgpfDB9ZWxzZXtrPWNbaz4+Ml18MH1xPShrfDApPT0tMTtrPXE/MDp4O3E9cT8xOjB9aWYoKHp8MCkhPTApe3I9Y1t6KzEyPj4yXXwwO2lmKChyfDApPT0oY1t6KzE2Pj4yXXwwKSl7cj1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtyPWNbcj4+Ml18MH1pZighKChyfDApPT0tMSkpe2lmKCFxKXtsPTczfX1lbHNle2w9NzF9fWVsc2V7bD03MX1pZigobHwwKT09NzE/cTowKXtsPTczfWlmKChsfDApPT03Myl7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tkPj4yXT1rO2lmKCEoKGFbbj4+MF0mMSk9PTApPyhtPWNbcD4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoKGFbbz4+MF0mMSk9PTApe2k9ZTtyZXR1cm59aj1jW28rOD4+Ml18MDtpZigoanwwKT09MCl7aT1lO3JldHVybn12bihqKTtpPWU7cmV0dXJufWZ1bmN0aW9uIGVpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wO2Q9aTtpPWkrMzA0fDA7dT1kKzE2MHwwO289ZCsyODB8MDtuPWQrMjY0fDA7bT1kKzI4NHwwO3Q9ZCszMDB8MDtyPWQ7cz1kKzI3NnwwO3E9ZCsyOTZ8MDt3PWNbZT4+Ml18MDt5PWNbZj4+Ml18MDtmPWNbZys0Pj4yXSY3NDtpZigoZnwwKT09OCl7Zj0xNn1lbHNlIGlmKChmfDApPT02NCl7Zj04fWVsc2UgaWYoKGZ8MCk9PTApe2Y9MH1lbHNle2Y9MTB9cGkobixnLHUsbyk7Y1ttKzA+PjJdPTA7Y1ttKzQ+PjJdPTA7Y1ttKzg+PjJdPTA7aGcobSwxMCk7aWYoKGFbbT4+MF0mMSk9PTApe3o9bSsxfDA7ZT16O2c9bSs4fDB9ZWxzZXt6PW0rOHwwO2U9bSsxfDA7Zz16O3o9Y1t6Pj4yXXwwfWNbdD4+Ml09ejtjW3M+PjJdPXI7Y1txPj4yXT0wO3Y9bSs0fDA7eD1jW28+PjJdfDA7bz1tKzh8MDt3aGlsZSgxKXtpZigod3wwKT09MCl7QT0xO3c9MH1lbHNle0E9Y1t3KzEyPj4yXXwwO2lmKChBfDApPT0oY1t3KzE2Pj4yXXwwKSl7QT1vY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSYxMjddKHcpfDB9ZWxzZXtBPWNbQT4+Ml18MH1DPShBfDApPT0tMTtBPUM/MTowO3c9Qz8wOnd9aWYoKHl8MCkhPTApe0I9Y1t5KzEyPj4yXXwwO2lmKChCfDApPT0oY1t5KzE2Pj4yXXwwKSl7Qj1vY1tjWyhjW3k+PjJdfDApKzM2Pj4yXSYxMjddKHkpfDB9ZWxzZXtCPWNbQj4+Ml18MH1pZighKChCfDApPT0tMSkpe2lmKCFBKXticmVha319ZWxzZXtrPTIwfX1lbHNle2s9MjB9aWYoKGt8MCk9PTIwKXtrPTA7aWYoQSl7eT0wO2JyZWFrfWVsc2V7eT0wfX1BPWFbbT4+MF18MDtCPShBJjEpPT0wO2lmKEIpe0M9KEEmMjU1KT4+PjF9ZWxzZXtDPWNbdj4+Ml18MH1pZigoKGNbdD4+Ml18MCktenwwKT09KEN8MCkpe2lmKEIpe0Q9KEEmMjU1KT4+PjE7ej0oQSYyNTUpPj4+MTtDPUQ8PDE7QT1EfWVsc2V7QT1jW3Y+PjJdfDA7ej1jW3Y+PjJdfDA7Qz1BPDwxfWRve2lmKCEoej4+PjA8Qz4+PjApKXtpZihCKXthW20rQysxPj4wXT0wO2FbbT4+MF09QTw8MjticmVha31lbHNle2FbKGNbbz4+Ml18MCkrQz4+MF09MDtjW3Y+PjJdPUM7YnJlYWt9fWVsc2V7aGcobSxDLXp8MCl9fXdoaWxlKDApO0M9YVttPj4wXXwwO2lmKChDJjEpPT0wKXtCPTEwfWVsc2V7Qj1jW20+PjJdfDA7Qz1CJjI1NTtCPShCJi0yKSsgLTF8MH16PShDJjEpPT0wO2lmKHope0M9KEMmMjU1KT4+PjF9ZWxzZXtDPWNbdj4+Ml18MH1kb3tpZighKEM+Pj4wPEI+Pj4wKSl7aWYoeil7YVttK0IrMT4+MF09MDthW20+PjBdPUI8PDE7YnJlYWt9ZWxzZXthWyhjW28+PjJdfDApK0I+PjBdPTA7Y1t2Pj4yXT1CO2JyZWFrfX1lbHNle2hnKG0sQi1DfDApfX13aGlsZSgwKTtpZigoYVttPj4wXSYxKT09MCl7ej1lfWVsc2V7ej1jW2c+PjJdfDB9Y1t0Pj4yXT16K0F9QT13KzEyfDA7Qz1jW0E+PjJdfDA7Qj13KzE2fDA7aWYoKEN8MCk9PShjW0I+PjJdfDApKXtDPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle0M9Y1tDPj4yXXwwfWlmKChsaShDLGYseix0LHEseCxuLHIscyx1KXwwKSE9MCl7YnJlYWt9Qz1jW0E+PjJdfDA7aWYoKEN8MCk9PShjW0I+PjJdfDApKXtvY1tjWyhjW3c+PjJdfDApKzQwPj4yXSYxMjddKHcpfDA7Y29udGludWV9ZWxzZXtjW0E+PjJdPUMrNDtjb250aW51ZX19dT1hW24+PjBdfDA7aWYoKHUmMSk9PTApe3U9KHUmMjU1KT4+PjF9ZWxzZXt1PWNbbis0Pj4yXXwwfWlmKCh1fDApIT0wPyhwPWNbcz4+Ml18MCwocC1yfDApPDE2MCk6MCl7RD1jW3E+PjJdfDA7Y1tzPj4yXT1wKzQ7Y1twPj4yXT1EfWNbaj4+Ml09S20oeixjW3Q+PjJdfDAsaCxmKXwwO3FrKG4scixjW3M+PjJdfDAsaCk7aWYoKHd8MCk9PTApe2o9MDtwPTF9ZWxzZXtqPWNbdysxMj4+Ml18MDtpZigoanwwKT09KGNbdysxNj4+Ml18MCkpe2o9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7aj1jW2o+PjJdfDB9cD0oanwwKT09LTE7aj1wPzA6dztwPXA/MTowfWlmKCh5fDApIT0wKXtxPWNbeSsxMj4+Ml18MDtpZigocXwwKT09KGNbeSsxNj4+Ml18MCkpe3E9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7cT1jW3E+PjJdfDB9aWYoISgocXwwKT09LTEpKXtpZighcCl7az03M319ZWxzZXtrPTcxfX1lbHNle2s9NzF9aWYoKGt8MCk9PTcxP3A6MCl7az03M31pZigoa3wwKT09NzMpe2NbaD4+Ml09Y1toPj4yXXwyfWNbYj4+Ml09ajtpZighKChhW20+PjBdJjEpPT0wKT8obD1jW28+PjJdfDAsKGx8MCkhPTApOjApe3ZuKGwpfWlmKChhW24+PjBdJjEpPT0wKXtpPWQ7cmV0dXJufWg9Y1tuKzg+PjJdfDA7aWYoKGh8MCk9PTApe2k9ZDtyZXR1cm59dm4oaCk7aT1kO3JldHVybn1mdW5jdGlvbiBmaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtkPWk7aT1pKzMwNHwwO3U9ZCsxNjB8MDtvPWQrMjgwfDA7bj1kKzI2NHwwO209ZCsyODR8MDt0PWQrMzAwfDA7cj1kO3M9ZCsyNzZ8MDtxPWQrMjk2fDA7dz1jW2U+PjJdfDA7eT1jW2Y+PjJdfDA7Zj1jW2crND4+Ml0mNzQ7aWYoKGZ8MCk9PTApe2Y9MH1lbHNlIGlmKChmfDApPT02NCl7Zj04fWVsc2UgaWYoKGZ8MCk9PTgpe2Y9MTZ9ZWxzZXtmPTEwfXBpKG4sZyx1LG8pO2NbbSswPj4yXT0wO2NbbSs0Pj4yXT0wO2NbbSs4Pj4yXT0wO2hnKG0sMTApO2lmKChhW20+PjBdJjEpPT0wKXt6PW0rMXwwO2U9ejtnPW0rOHwwfWVsc2V7ej1tKzh8MDtlPW0rMXwwO2c9ejt6PWNbej4+Ml18MH1jW3Q+PjJdPXo7Y1tzPj4yXT1yO2NbcT4+Ml09MDt2PW0rNHwwO3g9Y1tvPj4yXXwwO289bSs4fDA7d2hpbGUoMSl7aWYoKHd8MCk9PTApe0E9MTt3PTB9ZWxzZXtBPWNbdysxMj4+Ml18MDtpZigoQXwwKT09KGNbdysxNj4+Ml18MCkpe0E9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7QT1jW0E+PjJdfDB9Qz0oQXwwKT09LTE7QT1DPzE6MDt3PUM/MDp3fWlmKCh5fDApIT0wKXtCPWNbeSsxMj4+Ml18MDtpZigoQnwwKT09KGNbeSsxNj4+Ml18MCkpe0I9b2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwfWVsc2V7Qj1jW0I+PjJdfDB9aWYoISgoQnwwKT09LTEpKXtpZighQSl7YnJlYWt9fWVsc2V7az0yMH19ZWxzZXtrPTIwfWlmKChrfDApPT0yMCl7az0wO2lmKEEpe3k9MDticmVha31lbHNle3k9MH19QT1hW20+PjBdfDA7Qj0oQSYxKT09MDtpZihCKXtDPShBJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9aWYoKChjW3Q+PjJdfDApLXp8MCk9PShDfDApKXtpZihCKXtEPShBJjI1NSk+Pj4xO3o9KEEmMjU1KT4+PjE7Qz1EPDwxO0E9RH1lbHNle0E9Y1t2Pj4yXXwwO3o9Y1t2Pj4yXXwwO0M9QTw8MX1kb3tpZighKHo+Pj4wPEM+Pj4wKSl7aWYoQil7YVttK0MrMT4+MF09MDthW20+PjBdPUE8PDI7YnJlYWt9ZWxzZXthWyhjW28+PjJdfDApK0M+PjBdPTA7Y1t2Pj4yXT1DO2JyZWFrfX1lbHNle2hnKG0sQy16fDApfX13aGlsZSgwKTtDPWFbbT4+MF18MDtpZigoQyYxKT09MCl7Qj0xMH1lbHNle0I9Y1ttPj4yXXwwO0M9QiYyNTU7Qj0oQiYtMikrIC0xfDB9ej0oQyYxKT09MDtpZih6KXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW3Y+PjJdfDB9ZG97aWYoIShDPj4+MDxCPj4+MCkpe2lmKHope2FbbStCKzE+PjBdPTA7YVttPj4wXT1CPDwxO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStCPj4wXT0wO2Nbdj4+Ml09QjticmVha319ZWxzZXtoZyhtLEItQ3wwKX19d2hpbGUoMCk7aWYoKGFbbT4+MF0mMSk9PTApe3o9ZX1lbHNle3o9Y1tnPj4yXXwwfWNbdD4+Ml09eitBfUE9dysxMnwwO0M9Y1tBPj4yXXwwO0I9dysxNnwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7Qz1vY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSYxMjddKHcpfDB9ZWxzZXtDPWNbQz4+Ml18MH1pZigobGkoQyxmLHosdCxxLHgsbixyLHMsdSl8MCkhPTApe2JyZWFrfUM9Y1tBPj4yXXwwO2lmKChDfDApPT0oY1tCPj4yXXwwKSl7b2NbY1soY1t3Pj4yXXwwKSs0MD4+Ml0mMTI3XSh3KXwwO2NvbnRpbnVlfWVsc2V7Y1tBPj4yXT1DKzQ7Y29udGludWV9fXU9YVtuPj4wXXwwO2lmKCh1JjEpPT0wKXt1PSh1JjI1NSk+Pj4xfWVsc2V7dT1jW24rND4+Ml18MH1pZigodXwwKSE9MD8ocD1jW3M+PjJdfDAsKHAtcnwwKTwxNjApOjApe0Q9Y1txPj4yXXwwO2Nbcz4+Ml09cCs0O2NbcD4+Ml09RH1jW2o+PjJdPUptKHosY1t0Pj4yXXwwLGgsZil8MDtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZ2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTA7ZD1pO2k9aSszMDR8MDt1PWQrMTYwfDA7bz1kKzI4MHwwO249ZCsyNjR8MDttPWQrMjg0fDA7dD1kKzMwMHwwO3I9ZDtzPWQrMjc2fDA7cT1kKzI5NnwwO3c9Y1tlPj4yXXwwO3k9Y1tmPj4yXXwwO2Y9Y1tnKzQ+PjJdJjc0O2lmKChmfDApPT04KXtmPTE2fWVsc2UgaWYoKGZ8MCk9PTApe2Y9MH1lbHNlIGlmKChmfDApPT02NCl7Zj04fWVsc2V7Zj0xMH1waShuLGcsdSxvKTtjW20rMD4+Ml09MDtjW20rND4+Ml09MDtjW20rOD4+Ml09MDtoZyhtLDEwKTtpZigoYVttPj4wXSYxKT09MCl7ej1tKzF8MDtlPXo7Zz1tKzh8MH1lbHNle3o9bSs4fDA7ZT1tKzF8MDtnPXo7ej1jW3o+PjJdfDB9Y1t0Pj4yXT16O2Nbcz4+Ml09cjtjW3E+PjJdPTA7dj1tKzR8MDt4PWNbbz4+Ml18MDtvPW0rOHwwO3doaWxlKDEpe2lmKCh3fDApPT0wKXtBPTE7dz0wfWVsc2V7QT1jW3crMTI+PjJdfDA7aWYoKEF8MCk9PShjW3crMTY+PjJdfDApKXtBPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle0E9Y1tBPj4yXXwwfUM9KEF8MCk9PS0xO0E9Qz8xOjA7dz1DPzA6d31pZigoeXwwKSE9MCl7Qj1jW3krMTI+PjJdfDA7aWYoKEJ8MCk9PShjW3krMTY+PjJdfDApKXtCPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle0I9Y1tCPj4yXXwwfWlmKCEoKEJ8MCk9PS0xKSl7aWYoIUEpe2JyZWFrfX1lbHNle2s9MjB9fWVsc2V7az0yMH1pZigoa3wwKT09MjApe2s9MDtpZihBKXt5PTA7YnJlYWt9ZWxzZXt5PTB9fUE9YVttPj4wXXwwO0I9KEEmMSk9PTA7aWYoQil7Qz0oQSYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWlmKCgoY1t0Pj4yXXwwKS16fDApPT0oQ3wwKSl7aWYoQil7RD0oQSYyNTUpPj4+MTt6PShBJjI1NSk+Pj4xO0M9RDw8MTtBPUR9ZWxzZXtBPWNbdj4+Ml18MDt6PWNbdj4+Ml18MDtDPUE8PDF9ZG97aWYoISh6Pj4+MDxDPj4+MCkpe2lmKEIpe2FbbStDKzE+PjBdPTA7YVttPj4wXT1BPDwyO2JyZWFrfWVsc2V7YVsoY1tvPj4yXXwwKStDPj4wXT0wO2Nbdj4+Ml09QzticmVha319ZWxzZXtoZyhtLEMtenwwKX19d2hpbGUoMCk7Qz1hW20+PjBdfDA7aWYoKEMmMSk9PTApe0I9MTB9ZWxzZXtCPWNbbT4+Ml18MDtDPUImMjU1O0I9KEImLTIpKyAtMXwwfXo9KEMmMSk9PTA7aWYoeil7Qz0oQyYyNTUpPj4+MX1lbHNle0M9Y1t2Pj4yXXwwfWRve2lmKCEoQz4+PjA8Qj4+PjApKXtpZih6KXthW20rQisxPj4wXT0wO2FbbT4+MF09Qjw8MTticmVha31lbHNle2FbKGNbbz4+Ml18MCkrQj4+MF09MDtjW3Y+PjJdPUI7YnJlYWt9fWVsc2V7aGcobSxCLUN8MCl9fXdoaWxlKDApO2lmKChhW20+PjBdJjEpPT0wKXt6PWV9ZWxzZXt6PWNbZz4+Ml18MH1jW3Q+PjJdPXorQX1BPXcrMTJ8MDtDPWNbQT4+Ml18MDtCPXcrMTZ8MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe0M9b2NbY1soY1t3Pj4yXXwwKSszNj4+Ml0mMTI3XSh3KXwwfWVsc2V7Qz1jW0M+PjJdfDB9aWYoKGxpKEMsZix6LHQscSx4LG4scixzLHUpfDApIT0wKXticmVha31DPWNbQT4+Ml18MDtpZigoQ3wwKT09KGNbQj4+Ml18MCkpe29jW2NbKGNbdz4+Ml18MCkrNDA+PjJdJjEyN10odyl8MDtjb250aW51ZX1lbHNle2NbQT4+Ml09Qys0O2NvbnRpbnVlfX11PWFbbj4+MF18MDtpZigodSYxKT09MCl7dT0odSYyNTUpPj4+MX1lbHNle3U9Y1tuKzQ+PjJdfDB9aWYoKHV8MCkhPTA/KHA9Y1tzPj4yXXwwLChwLXJ8MCk8MTYwKTowKXtEPWNbcT4+Ml18MDtjW3M+PjJdPXArNDtjW3A+PjJdPUR9Qz1JbSh6LGNbdD4+Ml18MCxoLGYpfDA7RD1qO2NbRD4+Ml09QztjW0QrND4+Ml09STtxayhuLHIsY1tzPj4yXXwwLGgpO2lmKCh3fDApPT0wKXtqPTA7cD0xfWVsc2V7aj1jW3crMTI+PjJdfDA7aWYoKGp8MCk9PShjW3crMTY+PjJdfDApKXtqPW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle2o9Y1tqPj4yXXwwfXA9KGp8MCk9PS0xO2o9cD8wOnc7cD1wPzE6MH1pZigoeXwwKSE9MCl7cT1jW3krMTI+PjJdfDA7aWYoKHF8MCk9PShjW3krMTY+PjJdfDApKXtxPW9jW2NbKGNbeT4+Ml18MCkrMzY+PjJdJjEyN10oeSl8MH1lbHNle3E9Y1txPj4yXXwwfWlmKCEoKHF8MCk9PS0xKSl7aWYoIXApe2s9NzN9fWVsc2V7az03MX19ZWxzZXtrPTcxfWlmKChrfDApPT03MT9wOjApe2s9NzN9aWYoKGt8MCk9PTczKXtjW2g+PjJdPWNbaD4+Ml18Mn1jW2I+PjJdPWo7aWYoISgoYVttPj4wXSYxKT09MCk/KGw9Y1tvPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1oPWNbbis4Pj4yXXwwO2lmKChofDApPT0wKXtpPWQ7cmV0dXJufXZuKGgpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gaGkoYixkLGUsZixoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MDtkPWk7aT1pKzM1MnwwO3c9ZCsyMDh8MDt5PWQrMTg0fDA7cD1kKzR8MDtuPWQrOHwwO289ZCsxOTZ8MDt1PWQ7dD1kKzI0fDA7cz1kKzE5MnwwO3Y9ZCsxODh8MDtyPWQrMzM3fDA7eD1kKzMzNnwwO3o9Y1tlPj4yXXwwO0I9Y1tmPj4yXXwwO3FpKG4saCx3LHkscCk7Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTA7aGcobywxMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9bysxfDA7ZT1DO2Y9bys4fDB9ZWxzZXtDPW8rOHwwO2U9bysxfDA7Zj1DO0M9Y1tDPj4yXXwwfWNbdT4+Ml09QztjW3M+PjJdPXQ7Y1t2Pj4yXT0wO2Fbcj4+MF09MTthW3g+PjBdPTY5O2g9bys0fDA7eT1jW3k+PjJdfDA7QT1jW3A+PjJdfDA7cD1vKzh8MDt3aGlsZSgxKXtpZigoenwwKT09MCl7RD0xO3o9MH1lbHNle0Q9Y1t6KzEyPj4yXXwwO2lmKChEfDApPT0oY1t6KzE2Pj4yXXwwKSl7RD1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtEPWNbRD4+Ml18MH1GPShEfDApPT0tMTtEPUY/MTowO3o9Rj8wOnp9aWYoKEJ8MCkhPTApe0U9Y1tCKzEyPj4yXXwwO2lmKChFfDApPT0oY1tCKzE2Pj4yXXwwKSl7RT1vY1tjWyhjW0I+PjJdfDApKzM2Pj4yXSYxMjddKEIpfDB9ZWxzZXtFPWNbRT4+Ml18MH1pZighKChFfDApPT0tMSkpe2lmKCFEKXticmVha319ZWxzZXttPTE2fX1lbHNle209MTZ9aWYoKG18MCk9PTE2KXttPTA7aWYoRCl7Qj0wO2JyZWFrfWVsc2V7Qj0wfX1EPWFbbz4+MF18MDtFPShEJjEpPT0wO2lmKEUpe0Y9KEQmMjU1KT4+PjF9ZWxzZXtGPWNbaD4+Ml18MH1pZigoKGNbdT4+Ml18MCktQ3wwKT09KEZ8MCkpe2lmKEUpe0c9KEQmMjU1KT4+PjE7Rj0oRCYyNTUpPj4+MTtDPUc8PDE7RD1HfWVsc2V7RD1jW2g+PjJdfDA7Rj1jW2g+PjJdfDA7Qz1EPDwxfWRve2lmKCEoRj4+PjA8Qz4+PjApKXtpZihFKXthW28rQysxPj4wXT0wO2Fbbz4+MF09RDw8MjticmVha31lbHNle2FbKGNbcD4+Ml18MCkrQz4+MF09MDtjW2g+PjJdPUM7YnJlYWt9fWVsc2V7aGcobyxDLUZ8MCl9fXdoaWxlKDApO0Y9YVtvPj4wXXwwO2lmKChGJjEpPT0wKXtFPTEwfWVsc2V7RT1jW28+PjJdfDA7Rj1FJjI1NTtFPShFJi0yKSsgLTF8MH1DPShGJjEpPT0wO2lmKEMpe0Y9KEYmMjU1KT4+PjF9ZWxzZXtGPWNbaD4+Ml18MH1kb3tpZighKEY+Pj4wPEU+Pj4wKSl7aWYoQyl7YVtvK0UrMT4+MF09MDthW28+PjBdPUU8PDE7YnJlYWt9ZWxzZXthWyhjW3A+PjJdfDApK0U+PjBdPTA7Y1toPj4yXT1FO2JyZWFrfX1lbHNle2hnKG8sRS1GfDApfX13aGlsZSgwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz1lfWVsc2V7Qz1jW2Y+PjJdfDB9Y1t1Pj4yXT1DK0R9RT16KzEyfDA7Rj1jW0U+PjJdfDA7RD16KzE2fDA7aWYoKEZ8MCk9PShjW0Q+PjJdfDApKXtGPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle0Y9Y1tGPj4yXXwwfWlmKChyaShGLHIseCxDLHUseSxBLG4sdCxzLHYsdyl8MCkhPTApe2JyZWFrfUY9Y1tFPj4yXXwwO2lmKChGfDApPT0oY1tEPj4yXXwwKSl7b2NbY1soY1t6Pj4yXXwwKSs0MD4+Ml0mMTI3XSh6KXwwO2NvbnRpbnVlfWVsc2V7Y1tFPj4yXT1GKzQ7Y29udGludWV9fXc9YVtuPj4wXXwwO2lmKCh3JjEpPT0wKXt3PSh3JjI1NSk+Pj4xfWVsc2V7dz1jW24rND4+Ml18MH1pZigoKHd8MCkhPTA/KGFbcj4+MF18MCkhPTA6MCk/KHE9Y1tzPj4yXXwwLChxLXR8MCk8MTYwKTowKXtHPWNbdj4+Ml18MDtjW3M+PjJdPXErNDtjW3E+PjJdPUd9Z1trPj4yXT0rSG0oQyxjW3U+PjJdfDAsaik7cWsobix0LGNbcz4+Ml18MCxqKTtpZigoenwwKT09MCl7az0wO3E9MX1lbHNle2s9Y1t6KzEyPj4yXXwwO2lmKChrfDApPT0oY1t6KzE2Pj4yXXwwKSl7az1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtrPWNbaz4+Ml18MH1xPShrfDApPT0tMTtrPXE/MDp6O3E9cT8xOjB9aWYoKEJ8MCkhPTApe3I9Y1tCKzEyPj4yXXwwO2lmKChyfDApPT0oY1tCKzE2Pj4yXXwwKSl7cj1vY1tjWyhjW0I+PjJdfDApKzM2Pj4yXSYxMjddKEIpfDB9ZWxzZXtyPWNbcj4+Ml18MH1pZighKChyfDApPT0tMSkpe2lmKCFxKXttPTcwfX1lbHNle209Njh9fWVsc2V7bT02OH1pZigobXwwKT09Njg/cTowKXttPTcwfWlmKChtfDApPT03MCl7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT1rO2lmKCEoKGFbbz4+MF0mMSk9PTApPyhsPWNbcD4+Ml18MCwobHwwKSE9MCk6MCl7dm4obCl9aWYoKGFbbj4+MF0mMSk9PTApe2k9ZDtyZXR1cm59aj1jW24rOD4+Ml18MDtpZigoanwwKT09MCl7aT1kO3JldHVybn12bihqKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIGlpKGIsZCxlLGYsZyxqLGspe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTA7ZD1pO2k9aSszNTJ8MDt3PWQrMjA4fDA7eT1kKzE4NHwwO3A9ZCs0fDA7bj1kKzh8MDtvPWQrMTk2fDA7dT1kO3Q9ZCsyNHwwO3M9ZCsxOTJ8MDt2PWQrMTg4fDA7cj1kKzMzN3wwO3g9ZCszMzZ8MDt6PWNbZT4+Ml18MDtCPWNbZj4+Ml18MDtxaShuLGcsdyx5LHApO2NbbyswPj4yXT0wO2Nbbys0Pj4yXT0wO2Nbbys4Pj4yXT0wO2hnKG8sMTApO2lmKChhW28+PjBdJjEpPT0wKXtDPW8rMXwwO2U9QztmPW8rOHwwfWVsc2V7Qz1vKzh8MDtlPW8rMXwwO2Y9QztDPWNbQz4+Ml18MH1jW3U+PjJdPUM7Y1tzPj4yXT10O2Nbdj4+Ml09MDthW3I+PjBdPTE7YVt4Pj4wXT02OTtnPW8rNHwwO3k9Y1t5Pj4yXXwwO0E9Y1twPj4yXXwwO3A9bys4fDA7d2hpbGUoMSl7aWYoKHp8MCk9PTApe0Q9MTt6PTB9ZWxzZXtEPWNbeisxMj4+Ml18MDtpZigoRHwwKT09KGNbeisxNj4+Ml18MCkpe0Q9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7RD1jW0Q+PjJdfDB9Rj0oRHwwKT09LTE7RD1GPzE6MDt6PUY/MDp6fWlmKChCfDApIT0wKXtFPWNbQisxMj4+Ml18MDtpZigoRXwwKT09KGNbQisxNj4+Ml18MCkpe0U9b2NbY1soY1tCPj4yXXwwKSszNj4+Ml0mMTI3XShCKXwwfWVsc2V7RT1jW0U+PjJdfDB9aWYoISgoRXwwKT09LTEpKXtpZighRCl7YnJlYWt9fWVsc2V7bT0xNn19ZWxzZXttPTE2fWlmKChtfDApPT0xNil7bT0wO2lmKEQpe0I9MDticmVha31lbHNle0I9MH19RD1hW28+PjBdfDA7RT0oRCYxKT09MDtpZihFKXtGPShEJjI1NSk+Pj4xfWVsc2V7Rj1jW2c+PjJdfDB9aWYoKChjW3U+PjJdfDApLUN8MCk9PShGfDApKXtpZihFKXtHPShEJjI1NSk+Pj4xO0Y9KEQmMjU1KT4+PjE7Qz1HPDwxO0Q9R31lbHNle0Q9Y1tnPj4yXXwwO0Y9Y1tnPj4yXXwwO0M9RDw8MX1kb3tpZighKEY+Pj4wPEM+Pj4wKSl7aWYoRSl7YVtvK0MrMT4+MF09MDthW28+PjBdPUQ8PDI7YnJlYWt9ZWxzZXthWyhjW3A+PjJdfDApK0M+PjBdPTA7Y1tnPj4yXT1DO2JyZWFrfX1lbHNle2hnKG8sQy1GfDApfX13aGlsZSgwKTtGPWFbbz4+MF18MDtpZigoRiYxKT09MCl7RT0xMH1lbHNle0U9Y1tvPj4yXXwwO0Y9RSYyNTU7RT0oRSYtMikrIC0xfDB9Qz0oRiYxKT09MDtpZihDKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW2c+PjJdfDB9ZG97aWYoIShGPj4+MDxFPj4+MCkpe2lmKEMpe2FbbytFKzE+PjBdPTA7YVtvPj4wXT1FPDwxO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKStFPj4wXT0wO2NbZz4+Ml09RTticmVha319ZWxzZXtoZyhvLEUtRnwwKX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe0M9ZX1lbHNle0M9Y1tmPj4yXXwwfWNbdT4+Ml09QytEfUU9eisxMnwwO0Y9Y1tFPj4yXXwwO0Q9eisxNnwwO2lmKChGfDApPT0oY1tEPj4yXXwwKSl7Rj1vY1tjWyhjW3o+PjJdfDApKzM2Pj4yXSYxMjddKHopfDB9ZWxzZXtGPWNbRj4+Ml18MH1pZigocmkoRixyLHgsQyx1LHksQSxuLHQscyx2LHcpfDApIT0wKXticmVha31GPWNbRT4+Ml18MDtpZigoRnwwKT09KGNbRD4+Ml18MCkpe29jW2NbKGNbej4+Ml18MCkrNDA+PjJdJjEyN10oeil8MDtjb250aW51ZX1lbHNle2NbRT4+Ml09Ris0O2NvbnRpbnVlfX13PWFbbj4+MF18MDtpZigodyYxKT09MCl7dz0odyYyNTUpPj4+MX1lbHNle3c9Y1tuKzQ+PjJdfDB9aWYoKCh3fDApIT0wPyhhW3I+PjBdfDApIT0wOjApPyhxPWNbcz4+Ml18MCwocS10fDApPDE2MCk6MCl7Rz1jW3Y+PjJdfDA7Y1tzPj4yXT1xKzQ7Y1txPj4yXT1HfWhbaz4+M109K0dtKEMsY1t1Pj4yXXwwLGopO3FrKG4sdCxjW3M+PjJdfDAsaik7aWYoKHp8MCk9PTApe2s9MDtxPTF9ZWxzZXtrPWNbeisxMj4+Ml18MDtpZigoa3wwKT09KGNbeisxNj4+Ml18MCkpe2s9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7az1jW2s+PjJdfDB9cT0oa3wwKT09LTE7az1xPzA6ejtxPXE/MTowfWlmKChCfDApIT0wKXtyPWNbQisxMj4+Ml18MDtpZigocnwwKT09KGNbQisxNj4+Ml18MCkpe3I9b2NbY1soY1tCPj4yXXwwKSszNj4+Ml0mMTI3XShCKXwwfWVsc2V7cj1jW3I+PjJdfDB9aWYoISgocnwwKT09LTEpKXtpZighcSl7bT03MH19ZWxzZXttPTY4fX1lbHNle209Njh9aWYoKG18MCk9PTY4P3E6MCl7bT03MH1pZigobXwwKT09NzApe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09aztpZighKChhW28+PjBdJjEpPT0wKT8obD1jW3A+PjJdfDAsKGx8MCkhPTApOjApe3ZuKGwpfWlmKChhW24+PjBdJjEpPT0wKXtpPWQ7cmV0dXJufWo9Y1tuKzg+PjJdfDA7aWYoKGp8MCk9PTApe2k9ZDtyZXR1cm59dm4oaik7aT1kO3JldHVybn1mdW5jdGlvbiBqaShiLGQsZSxmLGcsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wO2Q9aTtpPWkrMzUyfDA7dz1kKzIwOHwwO3k9ZCsxODR8MDtwPWQrNHwwO249ZCs4fDA7bz1kKzE5NnwwO3U9ZDt0PWQrMjR8MDtzPWQrMTkyfDA7dj1kKzE4OHwwO3I9ZCszMzd8MDt4PWQrMzM2fDA7ej1jW2U+PjJdfDA7Qj1jW2Y+PjJdfDA7cWkobixnLHcseSxwKTtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtoZyhvLDEwKTtpZigoYVtvPj4wXSYxKT09MCl7Qz1vKzF8MDtlPUM7Zj1vKzh8MH1lbHNle0M9bys4fDA7ZT1vKzF8MDtmPUM7Qz1jW0M+PjJdfDB9Y1t1Pj4yXT1DO2Nbcz4+Ml09dDtjW3Y+PjJdPTA7YVtyPj4wXT0xO2FbeD4+MF09Njk7Zz1vKzR8MDt5PWNbeT4+Ml18MDtBPWNbcD4+Ml18MDtwPW8rOHwwO3doaWxlKDEpe2lmKCh6fDApPT0wKXtEPTE7ej0wfWVsc2V7RD1jW3orMTI+PjJdfDA7aWYoKER8MCk9PShjW3orMTY+PjJdfDApKXtEPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle0Q9Y1tEPj4yXXwwfUY9KER8MCk9PS0xO0Q9Rj8xOjA7ej1GPzA6en1pZigoQnwwKSE9MCl7RT1jW0IrMTI+PjJdfDA7aWYoKEV8MCk9PShjW0IrMTY+PjJdfDApKXtFPW9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MH1lbHNle0U9Y1tFPj4yXXwwfWlmKCEoKEV8MCk9PS0xKSl7aWYoIUQpe2JyZWFrfX1lbHNle209MTZ9fWVsc2V7bT0xNn1pZigobXwwKT09MTYpe209MDtpZihEKXtCPTA7YnJlYWt9ZWxzZXtCPTB9fUQ9YVtvPj4wXXwwO0U9KEQmMSk9PTA7aWYoRSl7Rj0oRCYyNTUpPj4+MX1lbHNle0Y9Y1tnPj4yXXwwfWlmKCgoY1t1Pj4yXXwwKS1DfDApPT0oRnwwKSl7aWYoRSl7Rz0oRCYyNTUpPj4+MTtGPShEJjI1NSk+Pj4xO0M9Rzw8MTtEPUd9ZWxzZXtEPWNbZz4+Ml18MDtGPWNbZz4+Ml18MDtDPUQ8PDF9ZG97aWYoIShGPj4+MDxDPj4+MCkpe2lmKEUpe2FbbytDKzE+PjBdPTA7YVtvPj4wXT1EPDwyO2JyZWFrfWVsc2V7YVsoY1twPj4yXXwwKStDPj4wXT0wO2NbZz4+Ml09QzticmVha319ZWxzZXtoZyhvLEMtRnwwKX19d2hpbGUoMCk7Rj1hW28+PjBdfDA7aWYoKEYmMSk9PTApe0U9MTB9ZWxzZXtFPWNbbz4+Ml18MDtGPUUmMjU1O0U9KEUmLTIpKyAtMXwwfUM9KEYmMSk9PTA7aWYoQyl7Rj0oRiYyNTUpPj4+MX1lbHNle0Y9Y1tnPj4yXXwwfWRve2lmKCEoRj4+PjA8RT4+PjApKXtpZihDKXthW28rRSsxPj4wXT0wO2Fbbz4+MF09RTw8MTticmVha31lbHNle2FbKGNbcD4+Ml18MCkrRT4+MF09MDtjW2c+PjJdPUU7YnJlYWt9fWVsc2V7aGcobyxFLUZ8MCl9fXdoaWxlKDApO2lmKChhW28+PjBdJjEpPT0wKXtDPWV9ZWxzZXtDPWNbZj4+Ml18MH1jW3U+PjJdPUMrRH1FPXorMTJ8MDtGPWNbRT4+Ml18MDtEPXorMTZ8MDtpZigoRnwwKT09KGNbRD4+Ml18MCkpe0Y9b2NbY1soY1t6Pj4yXXwwKSszNj4+Ml0mMTI3XSh6KXwwfWVsc2V7Rj1jW0Y+PjJdfDB9aWYoKHJpKEYscix4LEMsdSx5LEEsbix0LHMsdix3KXwwKSE9MCl7YnJlYWt9Rj1jW0U+PjJdfDA7aWYoKEZ8MCk9PShjW0Q+PjJdfDApKXtvY1tjWyhjW3o+PjJdfDApKzQwPj4yXSYxMjddKHopfDA7Y29udGludWV9ZWxzZXtjW0U+PjJdPUYrNDtjb250aW51ZX19dz1hW24+PjBdfDA7aWYoKHcmMSk9PTApe3c9KHcmMjU1KT4+PjF9ZWxzZXt3PWNbbis0Pj4yXXwwfWlmKCgod3wwKSE9MD8oYVtyPj4wXXwwKSE9MDowKT8ocT1jW3M+PjJdfDAsKHEtdHwwKTwxNjApOjApe0c9Y1t2Pj4yXXwwO2Nbcz4+Ml09cSs0O2NbcT4+Ml09R31oW2s+PjNdPStGbShDLGNbdT4+Ml18MCxqKTtxayhuLHQsY1tzPj4yXXwwLGopO2lmKCh6fDApPT0wKXtrPTA7cT0xfWVsc2V7az1jW3orMTI+PjJdfDA7aWYoKGt8MCk9PShjW3orMTY+PjJdfDApKXtrPW9jW2NbKGNbej4+Ml18MCkrMzY+PjJdJjEyN10oeil8MH1lbHNle2s9Y1trPj4yXXwwfXE9KGt8MCk9PS0xO2s9cT8wOno7cT1xPzE6MH1pZigoQnwwKSE9MCl7cj1jW0IrMTI+PjJdfDA7aWYoKHJ8MCk9PShjW0IrMTY+PjJdfDApKXtyPW9jW2NbKGNbQj4+Ml18MCkrMzY+PjJdJjEyN10oQil8MH1lbHNle3I9Y1tyPj4yXXwwfWlmKCEoKHJ8MCk9PS0xKSl7aWYoIXEpe209NzB9fWVsc2V7bT02OH19ZWxzZXttPTY4fWlmKChtfDApPT02OD9xOjApe209NzB9aWYoKG18MCk9PTcwKXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPWs7aWYoISgoYVtvPj4wXSYxKT09MCk/KGw9Y1twPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZigoYVtuPj4wXSYxKT09MCl7aT1kO3JldHVybn1qPWNbbis4Pj4yXXwwO2lmKChqfDApPT0wKXtpPWQ7cmV0dXJufXZuKGopO2k9ZDtyZXR1cm59ZnVuY3Rpb24ga2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MDtkPWk7aT1pKzMwNHwwO249ZDtvPWQrMTkyfDA7bD1kKzE3NnwwO3Y9ZCsxNnwwO3E9Y1tnKzI4Pj4yXXwwO0M9cSs0fDA7Y1tDPj4yXT0oY1tDPj4yXXwwKSsxO2lmKCEoKGNbMzM2Ml18MCk9PS0xKSl7Y1tuPj4yXT0xMzQ0ODtjW24rND4+Ml09MjA4O2Nbbis4Pj4yXT0wO2NnKDEzNDQ4LG4pfWc9KGNbMTM0NTI+PjJdfDApKyAtMXwwO3A9Y1txKzg+PjJdfDA7aWYoKGNbcSsxMj4+Ml18MCktcD4+Mj4+PjA+Zz4+PjA/KG09Y1twKyhnPDwyKT4+Ml18MCwobXwwKSE9MCk6MCl7dWNbY1soY1ttPj4yXXwwKSs0OD4+Ml0mMzFdKG0sMTIwMTYsMTIwNDJ8MCxvKXwwO0I9cSs0fDA7Qz1jW0I+PjJdfDA7Y1tCPj4yXT1DKyAtMTtpZigoQ3wwKT09MCl7bGNbY1soY1txPj4yXXwwKSs4Pj4yXSYyNTVdKHEpfWNbbCswPj4yXT0wO2NbbCs0Pj4yXT0wO2NbbCs4Pj4yXT0wO2hnKGwsMTApO2lmKChhW2w+PjBdJjEpPT0wKXt5PWwrMXwwO3A9eTtxPWwrOHwwfWVsc2V7eT1sKzh8MDtwPWwrMXwwO3E9eTt5PWNbeT4+Ml18MH1yPWwrNHwwO3Q9bys5NnwwO3U9bysxMDB8MDtzPW8rMTA0fDA7Zz1vO209bCs4fDA7eD1jW2U+PjJdfDA7dz0wO3o9eTthOndoaWxlKDEpe2lmKCh4fDApIT0wKXtBPWNbeCsxMj4+Ml18MDtpZigoQXwwKT09KGNbeCsxNj4+Ml18MCkpe0E9b2NbY1soY1t4Pj4yXXwwKSszNj4+Ml0mMTI3XSh4KXwwfWVsc2V7QT1jW0E+PjJdfDB9aWYoKEF8MCk9PS0xKXtjW2U+PjJdPTA7eD0wO0E9MX1lbHNle0E9MH19ZWxzZXt4PTA7QT0xfUM9Y1tmPj4yXXwwO2Rve2lmKChDfDApIT0wKXtCPWNbQysxMj4+Ml18MDtpZigoQnwwKT09KGNbQysxNj4+Ml18MCkpe0I9b2NbY1soY1tDPj4yXXwwKSszNj4+Ml0mMTI3XShDKXwwfWVsc2V7Qj1jW0I+PjJdfDB9aWYoISgoQnwwKT09LTEpKXtpZihBKXticmVha31lbHNle2JyZWFrIGF9fWVsc2V7Y1tmPj4yXT0wO2s9Mjc7YnJlYWt9fWVsc2V7az0yN319d2hpbGUoMCk7aWYoKGt8MCk9PTI3PyhrPTAsQSk6MCl7YnJlYWt9Qz1hW2w+PjBdfDA7QT0oQyYxKT09MDtpZihBKXtCPShDJjI1NSk+Pj4xfWVsc2V7Qj1jW3I+PjJdfDB9aWYoKHoteXwwKT09KEJ8MCkpe2lmKEEpe3o9KEMmMjU1KT4+PjE7Qj0oQyYyNTUpPj4+MTt5PXo8PDF9ZWxzZXt6PWNbcj4+Ml18MDtCPWNbcj4+Ml18MDt5PXo8PDF9ZG97aWYoIShCPj4+MDx5Pj4+MCkpe2lmKEEpe2FbbCt5KzE+PjBdPTA7YVtsPj4wXT16PDwyO2JyZWFrfWVsc2V7YVsoY1ttPj4yXXwwKSt5Pj4wXT0wO2Nbcj4+Ml09eTticmVha319ZWxzZXtoZyhsLHktQnwwKX19d2hpbGUoMCk7Qj1hW2w+PjBdfDA7aWYoKEImMSk9PTApe0E9MTB9ZWxzZXtBPWNbbD4+Ml18MDtCPUEmMjU1O0E9KEEmLTIpKyAtMXwwfXk9KEImMSk9PTA7aWYoeSl7Qj0oQiYyNTUpPj4+MX1lbHNle0I9Y1tyPj4yXXwwfWRve2lmKCEoQj4+PjA8QT4+PjApKXtpZih5KXthW2wrQSsxPj4wXT0wO2FbbD4+MF09QTw8MTticmVha31lbHNle2FbKGNbbT4+Ml18MCkrQT4+MF09MDtjW3I+PjJdPUE7YnJlYWt9fWVsc2V7aGcobCxBLUJ8MCl9fXdoaWxlKDApO2lmKChhW2w+PjBdJjEpPT0wKXt5PXB9ZWxzZXt5PWNbcT4+Ml18MH16PXkrenwwfUE9Y1t4KzEyPj4yXXwwO2lmKChBfDApPT0oY1t4KzE2Pj4yXXwwKSl7QT1vY1tjWyhjW3g+PjJdfDApKzM2Pj4yXSYxMjddKHgpfDB9ZWxzZXtBPWNbQT4+Ml18MH14PSh6fDApPT0oeXwwKTtkb3tpZih4KXtCPShjW3Q+PjJdfDApPT0oQXwwKTtpZighQj8oY1t1Pj4yXXwwKSE9KEF8MCk6MCl7Qj1vO2s9NjI7YnJlYWt9YVt6Pj4wXT1CPzQzOjQ1O3o9eisxfDA7dz0wfWVsc2V7Qj1vO2s9NjJ9fXdoaWxlKDApO2Rve2lmKChrfDApPT02Mil7d2hpbGUoMSl7az0wO2lmKChjW0I+PjJdfDApPT0oQXwwKSl7YnJlYWt9Qj1CKzR8MDtpZigoQnwwKT09KHN8MCkpe0I9czticmVha31lbHNle2s9NjJ9fUI9Qi1nfDA7QT1CPj4yO2lmKChCfDApPjkyKXticmVhayBhfWlmKChCfDApPDg4KXthW3o+PjBdPWFbMTIwMTYrQT4+MF18MDt6PXorMXwwO3c9dysxfDA7YnJlYWt9aWYoeCl7eT16O2JyZWFrIGF9aWYoKHoteXwwKT49Myl7YnJlYWsgYX1pZigoYVt6KyAtMT4+MF18MCkhPTQ4KXticmVhayBhfWFbej4+MF09YVsxMjAxNitBPj4wXXwwO3o9eisxfDA7dz0wfX13aGlsZSgwKTt4PWNbZT4+Ml18MDtCPXgrMTJ8MDtBPWNbQj4+Ml18MDtpZigoQXwwKT09KGNbeCsxNj4+Ml18MCkpe29jW2NbKGNbeD4+Ml18MCkrNDA+PjJdJjEyN10oeCl8MDtDPXY7dj1DO2NvbnRpbnVlfWVsc2V7Y1tCPj4yXT1BKzQ7Qz12O3Y9Qztjb250aW51ZX19YVt5KzM+PjBdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfUM9Y1szMzQwXXwwO2Nbbj4+Ml09ajtpZigoWWgoeSxDLG4pfDApIT0xKXtjW2g+PjJdPTR9aj1jW2U+PjJdfDA7aWYoKGp8MCkhPTApe249Y1tqKzEyPj4yXXwwO2lmKChufDApPT0oY1tqKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW2o+PjJdfDApKzM2Pj4yXSYxMjddKGopfDB9ZWxzZXtuPWNbbj4+Ml18MH1pZigobnwwKT09LTEpe2NbZT4+Ml09MDtqPTA7ZT0xfWVsc2V7ZT0wfX1lbHNle2o9MDtlPTF9bj1jW2Y+PjJdfDA7ZG97aWYoKG58MCkhPTApe289Y1tuKzEyPj4yXXwwO2lmKChvfDApPT0oY1tuKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDB9ZWxzZXtuPWNbbz4+Ml18MH1pZighKChufDApPT0tMSkpe2lmKGUpe2JyZWFrfWVsc2V7az05NDticmVha319ZWxzZXtjW2Y+PjJdPTA7az05MjticmVha319ZWxzZXtrPTkyfX13aGlsZSgwKTtpZigoa3wwKT09OTI/ZTowKXtrPTk0fWlmKChrfDApPT05NCl7Y1toPj4yXT1jW2g+PjJdfDJ9Y1tiPj4yXT1qO2lmKChhW2w+PjBdJjEpPT0wKXtpPWQ7cmV0dXJufWY9Y1ttPj4yXXwwO2lmKChmfDApPT0wKXtpPWQ7cmV0dXJufXZuKGYpO2k9ZDtyZXR1cm59Qz1YYSg0KXwwO2NbQz4+Ml09MjEzMDQ7d2IoQ3wwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gbGkoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MDtuPWk7cD1jW2Y+PjJdfDA7bz0ocHwwKT09KGV8MCk7ZG97aWYobyl7cT0oY1ttKzk2Pj4yXXwwKT09KGJ8MCk7aWYoIXE/KGNbbSsxMDA+PjJdfDApIT0oYnwwKTowKXticmVha31jW2Y+PjJdPWUrMTthW2U+PjBdPXE/NDM6NDU7Y1tnPj4yXT0wO3E9MDtpPW47cmV0dXJuIHF8MH19d2hpbGUoMCk7cT1hW2o+PjBdfDA7aWYoKHEmMSk9PTApe2o9KHEmMjU1KT4+PjF9ZWxzZXtqPWNbais0Pj4yXXwwfWlmKChqfDApIT0wJihifDApPT0oaHwwKSl7bz1jW2w+PjJdfDA7aWYoKG8ta3wwKT49MTYwKXtxPTA7aT1uO3JldHVybiBxfDB9cT1jW2c+PjJdfDA7Y1tsPj4yXT1vKzQ7Y1tvPj4yXT1xO2NbZz4+Ml09MDtxPTA7aT1uO3JldHVybiBxfDB9bD1tKzEwNHwwO2s9bTt3aGlsZSgxKXtpZigoY1trPj4yXXwwKT09KGJ8MCkpe2JyZWFrfWs9ays0fDA7aWYoKGt8MCk9PShsfDApKXtrPWw7YnJlYWt9fWI9ay1tfDA7bT1iPj4yO2lmKChifDApPjkyKXtxPS0xO2k9bjtyZXR1cm4gcXwwfWlmKChkfDApPT0xMHwoZHwwKT09OCl7aWYoKG18MCk+PShkfDApKXtxPS0xO2k9bjtyZXR1cm4gcXwwfX1lbHNlIGlmKChkfDApPT0xNj8oYnwwKT49ODg6MCl7aWYobyl7cT0tMTtpPW47cmV0dXJuIHF8MH1pZigocC1lfDApPj0zKXtxPS0xO2k9bjtyZXR1cm4gcXwwfWlmKChhW3ArIC0xPj4wXXwwKSE9NDgpe3E9LTE7aT1uO3JldHVybiBxfDB9Y1tnPj4yXT0wO3E9YVsxMjAxNittPj4wXXwwO2NbZj4+Ml09cCsxO2FbcD4+MF09cTtxPTA7aT1uO3JldHVybiBxfDB9cT1hWzEyMDE2K20+PjBdfDA7Y1tmPj4yXT1wKzE7YVtwPj4wXT1xO2NbZz4+Ml09KGNbZz4+Ml18MCkrMTtxPTA7aT1uO3JldHVybiBxfDB9ZnVuY3Rpb24gbWkoYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7aD1pO2k9aSsxNnwwO2w9aDtkPWNbZCsyOD4+Ml18MDtvPWQrNHwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1uPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtqPWQrMTJ8MDttPWQrOHwwO289Y1ttPj4yXXwwO2lmKChjW2o+PjJdfDApLW8+PjI+Pj4wPm4+Pj4wPyhrPWNbbysobjw8Mik+PjJdfDAsKGt8MCkhPTApOjApe3VjW2NbKGNbaz4+Ml18MCkrMzI+PjJdJjMxXShrLDEyMDE2LDEyMDQyfDAsZSl8MDtpZighKChjWzM0MDBdfDApPT0tMSkpe2NbbD4+Ml09MTM2MDA7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzYwMCxsKX1lPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDtrPWNbbT4+Ml18MDtpZigoY1tqPj4yXXwwKS1rPj4yPj4+MD5lPj4+MD8oZz1jW2srKGU8PDIpPj4yXXwwLChnfDApIT0wKTowKXthW2Y+PjBdPW9jW2NbKGNbZz4+Ml18MCkrMTY+PjJdJjEyN10oZyl8MDttY1tjWyhjW2c+PjJdfDApKzIwPj4yXSYxMjddKGIsZyk7bj1kKzR8MDtvPWNbbj4+Ml18MDtjW24+PjJdPW8rIC0xO2lmKChvfDApIT0wKXtpPWg7cmV0dXJufWxjW2NbKGNbZD4+Ml18MCkrOD4+Ml0mMjU1XShkKTtpPWg7cmV0dXJufW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIG5pKGIsZCxlLGYsZyl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTA7aj1pO2k9aSsxNnwwO2w9ajtkPWNbZCsyOD4+Ml18MDtwPWQrNHwwO2NbcD4+Ml09KGNbcD4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1vPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtrPWQrMTJ8MDtuPWQrOHwwO3A9Y1tuPj4yXXwwO2lmKChjW2s+PjJdfDApLXA+PjI+Pj4wPm8+Pj4wPyhtPWNbcCsobzw8Mik+PjJdfDAsKG18MCkhPTApOjApe3VjW2NbKGNbbT4+Ml18MCkrMzI+PjJdJjMxXShtLDEyMDE2LDEyMDQ4fDAsZSl8MDtpZighKChjWzM0MDBdfDApPT0tMSkpe2NbbD4+Ml09MTM2MDA7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzYwMCxsKX1lPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDtsPWNbbj4+Ml18MDtpZigoY1trPj4yXXwwKS1sPj4yPj4+MD5lPj4+MD8oaD1jW2wrKGU8PDIpPj4yXXwwLChofDApIT0wKTowKXthW2Y+PjBdPW9jW2NbKGNbaD4+Ml18MCkrMTI+PjJdJjEyN10oaCl8MDthW2c+PjBdPW9jW2NbKGNbaD4+Ml18MCkrMTY+PjJdJjEyN10oaCl8MDttY1tjWyhjW2g+PjJdfDApKzIwPj4yXSYxMjddKGIsaCk7bz1kKzR8MDtwPWNbbz4+Ml18MDtjW28+PjJdPXArIC0xO2lmKChwfDApIT0wKXtpPWo7cmV0dXJufWxjW2NbKGNbZD4+Ml18MCkrOD4+Ml0mMjU1XShkKTtpPWo7cmV0dXJufXA9WGEoNCl8MDtjW3A+PjJdPTIxMzA0O3diKHB8MCwyMTM3NiwxOTYpfXA9WGEoNCl8MDtjW3A+PjJdPTIxMzA0O3diKHB8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIG9pKGIsZCxlLGYsZyxoLGosayxsLG0sbixvKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDtvPW98MDt2YXIgcD0wLHE9MDtwPWk7aWYoYjw8MjQ+PjI0PT1oPDwyND4+MjQpe2lmKChhW2Q+PjBdfDApPT0wKXtqPS0xO2k9cDtyZXR1cm4ganwwfWFbZD4+MF09MDtqPWNbZz4+Ml18MDtjW2c+PjJdPWorMTthW2o+PjBdPTQ2O2c9YVtrPj4wXXwwO2lmKChnJjEpPT0wKXtnPShnJjI1NSk+Pj4xfWVsc2V7Zz1jW2srND4+Ml18MH1pZigoZ3wwKT09MCl7aj0wO2k9cDtyZXR1cm4ganwwfWc9Y1ttPj4yXXwwO2lmKChnLWx8MCk+PTE2MCl7aj0wO2k9cDtyZXR1cm4ganwwfWo9Y1tuPj4yXXwwO2NbbT4+Ml09Zys0O2NbZz4+Ml09ajtqPTA7aT1wO3JldHVybiBqfDB9aWYoYjw8MjQ+PjI0PT1qPDwyND4+MjQpe2g9YVtrPj4wXXwwO2lmKChoJjEpPT0wKXtoPShoJjI1NSk+Pj4xfWVsc2V7aD1jW2srND4+Ml18MH1pZigoaHwwKSE9MCl7aWYoKGFbZD4+MF18MCk9PTApe2o9LTE7aT1wO3JldHVybiBqfDB9Zz1jW20+PjJdfDA7aWYoKGctbHwwKT49MTYwKXtqPTA7aT1wO3JldHVybiBqfDB9aj1jW24+PjJdfDA7Y1ttPj4yXT1nKzQ7Y1tnPj4yXT1qO2Nbbj4+Ml09MDtqPTA7aT1wO3JldHVybiBqfDB9fWg9byszMnwwO2o9bztkb3tpZigoYVtqPj4wXXwwKT09Yjw8MjQ+PjI0KXtoPWo7YnJlYWt9aj1qKzF8MH13aGlsZSgoanwwKSE9KGh8MCkpO2I9aC1vfDA7aWYoKGJ8MCk+MzEpe2o9LTE7aT1wO3JldHVybiBqfDB9bz1hWzEyMDE2K2I+PjBdfDA7aWYoKGJ8MCk9PTIzfChifDApPT0yMil7YVtlPj4wXT04MDtqPWNbZz4+Ml18MDtjW2c+PjJdPWorMTthW2o+PjBdPW87aj0wO2k9cDtyZXR1cm4ganwwfWVsc2UgaWYoKGJ8MCk9PTI0fChifDApPT0yNSl7bj1jW2c+PjJdfDA7aWYoKG58MCkhPShmfDApPyhhW24rIC0xPj4wXSY5NXwwKSE9KGFbZT4+MF0mMTI3fDApOjApe2o9LTE7aT1wO3JldHVybiBqfDB9Y1tnPj4yXT1uKzE7YVtuPj4wXT1vO2o9MDtpPXA7cmV0dXJuIGp8MH1lbHNle2Y9byY5NTtpZigoZnwwKT09KGFbZT4+MF18MCk/KGFbZT4+MF09ZnwxMjgsKGFbZD4+MF18MCkhPTApOjApe2FbZD4+MF09MDtlPWFbaz4+MF18MDtpZigoZSYxKT09MCl7az0oZSYyNTUpPj4+MX1lbHNle2s9Y1trKzQ+PjJdfDB9aWYoKGt8MCkhPTA/KHE9Y1ttPj4yXXwwLChxLWx8MCk8MTYwKTowKXtqPWNbbj4+Ml18MDtjW20+PjJdPXErNDtjW3E+PjJdPWp9fWo9Y1tnPj4yXXwwO2NbZz4+Ml09aisxO2Fbaj4+MF09bztpZigoYnwwKT4yMSl7aj0wO2k9cDtyZXR1cm4ganwwfWNbbj4+Ml09KGNbbj4+Ml18MCkrMTtqPTA7aT1wO3JldHVybiBqfDB9cmV0dXJuIDB9ZnVuY3Rpb24gcGkoYSxiLGQsZSl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Zz1pO2k9aSsxNnwwO2s9ZztiPWNbYisyOD4+Ml18MDtuPWIrNHwwO2Nbbj4+Ml09KGNbbj4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ0OCxrKX1tPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtoPWIrMTJ8MDtsPWIrOHwwO249Y1tsPj4yXXwwO2lmKChjW2g+PjJdfDApLW4+PjI+Pj4wPm0+Pj4wPyhqPWNbbisobTw8Mik+PjJdfDAsKGp8MCkhPTApOjApe3VjW2NbKGNbaj4+Ml18MCkrNDg+PjJdJjMxXShqLDEyMDE2LDEyMDQyfDAsZCl8MDtpZighKChjWzM0MDJdfDApPT0tMSkpe2Nbaz4+Ml09MTM2MDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzYwOCxrKX1kPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtqPWNbbD4+Ml18MDtpZigoY1toPj4yXXwwKS1qPj4yPj4+MD5kPj4+MD8oZj1jW2orKGQ8PDIpPj4yXXwwLChmfDApIT0wKTowKXtjW2U+PjJdPW9jW2NbKGNbZj4+Ml18MCkrMTY+PjJdJjEyN10oZil8MDttY1tjWyhjW2Y+PjJdfDApKzIwPj4yXSYxMjddKGEsZik7bT1iKzR8MDtuPWNbbT4+Ml18MDtjW20+PjJdPW4rIC0xO2lmKChufDApIT0wKXtpPWc7cmV0dXJufWxjW2NbKGNbYj4+Ml18MCkrOD4+Ml0mMjU1XShiKTtpPWc7cmV0dXJufW49WGEoNCl8MDtjW24+PjJdPTIxMzA0O3diKG58MCwyMTM3NiwxOTYpfW49WGEoNCl8MDtjW24+PjJdPTIxMzA0O3diKG58MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHFpKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7aD1pO2k9aSsxNnwwO2s9aDtiPWNbYisyOD4+Ml18MDtvPWIrNHwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ0OCxrKX1uPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtqPWIrMTJ8MDttPWIrOHwwO289Y1ttPj4yXXwwO2lmKChjW2o+PjJdfDApLW8+PjI+Pj4wPm4+Pj4wPyhsPWNbbysobjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe3VjW2NbKGNbbD4+Ml18MCkrNDg+PjJdJjMxXShsLDEyMDE2LDEyMDQ4fDAsZCl8MDtpZighKChjWzM0MDJdfDApPT0tMSkpe2Nbaz4+Ml09MTM2MDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzYwOCxrKX1kPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtrPWNbbT4+Ml18MDtpZigoY1tqPj4yXXwwKS1rPj4yPj4+MD5kPj4+MD8oZz1jW2srKGQ8PDIpPj4yXXwwLChnfDApIT0wKTowKXtjW2U+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMTI+PjJdJjEyN10oZyl8MDtjW2Y+PjJdPW9jW2NbKGNbZz4+Ml18MCkrMTY+PjJdJjEyN10oZyl8MDttY1tjWyhjW2c+PjJdfDApKzIwPj4yXSYxMjddKGEsZyk7bj1iKzR8MDtvPWNbbj4+Ml18MDtjW24+PjJdPW8rIC0xO2lmKChvfDApIT0wKXtpPWg7cmV0dXJufWxjW2NbKGNbYj4+Ml18MCkrOD4+Ml0mMjU1XShiKTtpPWg7cmV0dXJufW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfW89WGEoNCl8MDtjW28+PjJdPTIxMzA0O3diKG98MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHJpKGIsZCxlLGYsZyxoLGosayxsLG0sbixvKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDtvPW98MDt2YXIgcD0wLHE9MDtwPWk7aWYoKGJ8MCk9PShofDApKXtpZigoYVtkPj4wXXwwKT09MCl7aj0tMTtpPXA7cmV0dXJuIGp8MH1hW2Q+PjBdPTA7aj1jW2c+PjJdfDA7Y1tnPj4yXT1qKzE7YVtqPj4wXT00NjtnPWFbaz4+MF18MDtpZigoZyYxKT09MCl7Zz0oZyYyNTUpPj4+MX1lbHNle2c9Y1trKzQ+PjJdfDB9aWYoKGd8MCk9PTApe2o9MDtpPXA7cmV0dXJuIGp8MH1nPWNbbT4+Ml18MDtpZigoZy1sfDApPj0xNjApe2o9MDtpPXA7cmV0dXJuIGp8MH1qPWNbbj4+Ml18MDtjW20+PjJdPWcrNDtjW2c+PjJdPWo7aj0wO2k9cDtyZXR1cm4ganwwfWlmKChifDApPT0oanwwKSl7aD1hW2s+PjBdfDA7aWYoKGgmMSk9PTApe2g9KGgmMjU1KT4+PjF9ZWxzZXtoPWNbays0Pj4yXXwwfWlmKChofDApIT0wKXtpZigoYVtkPj4wXXwwKT09MCl7aj0tMTtpPXA7cmV0dXJuIGp8MH1nPWNbbT4+Ml18MDtpZigoZy1sfDApPj0xNjApe2o9MDtpPXA7cmV0dXJuIGp8MH1qPWNbbj4+Ml18MDtjW20+PjJdPWcrNDtjW2c+PjJdPWo7Y1tuPj4yXT0wO2o9MDtpPXA7cmV0dXJuIGp8MH19aD1vKzEyOHwwO2o9bztkb3tpZigoY1tqPj4yXXwwKT09KGJ8MCkpe2g9ajticmVha31qPWorNHwwfXdoaWxlKChqfDApIT0oaHwwKSk7Yj1oLW98MDtoPWI+PjI7aWYoKGJ8MCk+MTI0KXtqPS0xO2k9cDtyZXR1cm4ganwwfW89YVsxMjAxNitoPj4wXXwwO2lmKChofDApPT0yNHwoaHwwKT09MjUpe249Y1tnPj4yXXwwO2lmKChufDApIT0oZnwwKT8oYVtuKyAtMT4+MF0mOTV8MCkhPShhW2U+PjBdJjEyN3wwKTowKXtqPS0xO2k9cDtyZXR1cm4ganwwfWNbZz4+Ml09bisxO2Fbbj4+MF09bztqPTA7aT1wO3JldHVybiBqfDB9ZWxzZSBpZighKChofDApPT0yM3woaHwwKT09MjIpKXtmPW8mOTU7aWYoKGZ8MCk9PShhW2U+PjBdfDApPyhhW2U+PjBdPWZ8MTI4LChhW2Q+PjBdfDApIT0wKTowKXthW2Q+PjBdPTA7ZT1hW2s+PjBdfDA7aWYoKGUmMSk9PTApe2s9KGUmMjU1KT4+PjF9ZWxzZXtrPWNbays0Pj4yXXwwfWlmKChrfDApIT0wPyhxPWNbbT4+Ml18MCwocS1sfDApPDE2MCk6MCl7aj1jW24+PjJdfDA7Y1ttPj4yXT1xKzQ7Y1txPj4yXT1qfX19ZWxzZXthW2U+PjBdPTgwfWo9Y1tnPj4yXXwwO2NbZz4+Ml09aisxO2Fbaj4+MF09bztpZigoYnwwKT44NCl7aj0wO2k9cDtyZXR1cm4ganwwfWNbbj4+Ml09KGNbbj4+Ml18MCkrMTtqPTA7aT1wO3JldHVybiBqfDB9ZnVuY3Rpb24gc2koYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gdGkoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIHVpKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTA7aj1pO2k9aSszMnwwO209ajtuPWorMjR8MDtrPWorMTJ8MDtpZigoY1tmKzQ+PjJdJjF8MCk9PTApe2w9Y1soY1tkPj4yXXwwKSsyND4+Ml18MDtjW24+PjJdPWNbZT4+Ml07bz1oJjE7Y1ttKzA+PjJdPWNbbiswPj4yXTt3Y1tsJjYzXShiLGQsbSxmLGcsbyk7aT1qO3JldHVybn1kPWNbZisyOD4+Ml18MDtvPWQrNHwwO2Nbbz4+Ml09KGNbbz4+Ml18MCkrMTtpZighKChjWzM0MDBdfDApPT0tMSkpe2NbbT4+Ml09MTM2MDA7Y1ttKzQ+PjJdPTIwODtjW20rOD4+Ml09MDtjZygxMzYwMCxtKX1mPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDttPWNbZCs4Pj4yXXwwO2lmKChjW2QrMTI+PjJdfDApLW0+PjI+Pj4wPmY+Pj4wPyhsPWNbbSsoZjw8Mik+PjJdfDAsKGx8MCkhPTApOjApe2c9ZCs0fDA7bz1jW2c+PjJdfDA7Y1tnPj4yXT1vKyAtMTtpZigob3wwKT09MCl7bGNbY1soY1tkPj4yXXwwKSs4Pj4yXSYyNTVdKGQpfW09Y1tsPj4yXXwwO2lmKGgpe21jW2NbbSsyND4+Ml0mMTI3XShrLGwpfWVsc2V7bWNbY1ttKzI4Pj4yXSYxMjddKGssbCl9bj1hW2s+PjBdfDA7aWYoKG4mMSk9PTApe2g9aysxfDA7ZD1oO2w9ays4fDB9ZWxzZXtsPWsrOHwwO2Q9Y1tsPj4yXXwwO2g9aysxfDB9bT1rKzR8MDt3aGlsZSgxKXtmPShuJjEpPT0wO2lmKGYpe2c9aDtuPShuJjI1NSk+Pj4xfWVsc2V7Zz1jW2w+PjJdfDA7bj1jW20+PjJdfDB9aWYoKGR8MCk9PShnK258MCkpe2JyZWFrfW89YVtkPj4wXXwwO249Y1tlPj4yXXwwO2Rve2lmKChufDApIT0wKXtmPW4rMjR8MDtnPWNbZj4+Ml18MDtpZigoZ3wwKSE9KGNbbisyOD4+Ml18MCkpe2NbZj4+Ml09ZysxO2FbZz4+MF09bzticmVha31pZigoeGNbY1soY1tuPj4yXXwwKSs1Mj4+Ml0mNjNdKG4sbyYyNTUpfDApPT0tMSl7Y1tlPj4yXT0wfX19d2hpbGUoMCk7bj1hW2s+PjBdfDA7ZD1kKzF8MH1jW2I+PjJdPWNbZT4+Ml07aWYoZil7aT1qO3JldHVybn1rPWNbays4Pj4yXXwwO2lmKChrfDApPT0wKXtpPWo7cmV0dXJufXZuKGspO2k9ajtyZXR1cm59bz1YYSg0KXwwO2Nbbz4+Ml09MjEzMDQ7d2Iob3wwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gdmkoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtkPWk7aT1pKzY0fDA7cj1kO3E9ZCsxNnwwO249ZCsyNHwwO209ZCszNnwwO2s9ZCs4fDA7bD1kKzR8MDtvPWQrMTJ8MDthW3ErMD4+MF09YVsxMjI2ND4+MF18MDthW3ErMT4+MF09YVsxMjI2NT4+MF18MDthW3ErMj4+MF09YVsxMjI2Nj4+MF18MDthW3ErMz4+MF09YVsxMjI2Nz4+MF18MDthW3ErND4+MF09YVsxMjI2OD4+MF18MDthW3ErNT4+MF09YVsxMjI2OT4+MF18MDt0PXErMXwwO3A9Zis0fDA7cz1jW3A+PjJdfDA7aWYoKHMmMjA0OHwwKSE9MCl7YVt0Pj4wXT00Mzt0PXErMnwwfWlmKChzJjUxMnwwKSE9MCl7YVt0Pj4wXT0zNTt0PXQrMXwwfWFbdD4+MF09MTA4O3Q9dCsxfDA7dT1zJjc0O2Rve2lmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZSBpZigodXwwKT09OCl7aWYoKHMmMTYzODR8MCk9PTApe2FbdD4+MF09MTIwO2JyZWFrfWVsc2V7YVt0Pj4wXT04ODticmVha319ZWxzZXthW3Q+PjBdPTEwMH19d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO2Nbcj4+Ml09aDtxPXdpKG4sMTIsdSxxLHIpfDA7aD1uK3F8MDtwPWNbcD4+Ml0mMTc2O2Rve2lmKChwfDApPT0zMil7cD1ofWVsc2UgaWYoKHB8MCk9PTE2KXtwPWFbbj4+MF18MDtpZihwPDwyND4+MjQ9PTQzfHA8PDI0Pj4yND09NDUpe3A9bisxfDA7YnJlYWt9aWYoKHF8MCk+MSZwPDwyND4+MjQ9PTQ4Pyh1PWFbbisxPj4wXXwwLHU8PDI0Pj4yND09ODh8dTw8MjQ+PjI0PT0xMjApOjApe3A9bisyfDB9ZWxzZXtqPTIxfX1lbHNle2o9MjF9fXdoaWxlKDApO2lmKChqfDApPT0yMSl7cD1ufWo9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09ajtqPWorNHwwO2Nbaj4+Ml09KGNbaj4+Ml18MCkrMTt4aShuLHAsaCxtLGssbCxvKTtqPWNbbz4+Ml18MDt0PWorNHwwO3U9Y1t0Pj4yXXwwO2NbdD4+Ml09dSsgLTE7aWYoKHV8MCkhPTApe3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1tsPj4yXXwwO1djKGIscyxtLHQsdSxmLGcpO2k9ZDtyZXR1cm59bGNbY1soY1tqPj4yXXwwKSs4Pj4yXSYyNTVdKGopO3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1tsPj4yXXwwO1djKGIscyxtLHQsdSxmLGcpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gd2koYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MDtnPWk7aT1pKzE2fDA7aD1nO2NbaD4+Ml09ZjtkPWliKGR8MCl8MDtlPVFiKGF8MCxifDAsZXwwLGh8MCl8MDtpZigoZHwwKT09MCl7aT1nO3JldHVybiBlfDB9aWIoZHwwKXwwO2k9ZztyZXR1cm4gZXwwfWZ1bmN0aW9uIHhpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTA7az1pO2k9aSszMnwwO3A9aztsPWsrMTJ8MDtuPWNbaj4+Ml18MDtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbcD4+Ml09MTM0NTY7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzQ1NixwKX1yPShjWzEzNDYwPj4yXXwwKSsgLTF8MDtzPWNbbis4Pj4yXXwwO2lmKCEoKGNbbisxMj4+Ml18MCktcz4+Mj4+PjA+cj4+PjApKXt2PVhhKDQpfDA7Y1t2Pj4yXT0yMTMwNDt3Yih2fDAsMjEzNzYsMTk2KX1uPWNbcysocjw8Mik+PjJdfDA7aWYoKG58MCk9PTApe3Y9WGEoNCl8MDtjW3Y+PjJdPTIxMzA0O3diKHZ8MCwyMTM3NiwxOTYpfWo9Y1tqPj4yXXwwO2lmKCEoKGNbMzQwMF18MCk9PS0xKSl7Y1twPj4yXT0xMzYwMDtjW3ArND4+Ml09MjA4O2NbcCs4Pj4yXT0wO2NnKDEzNjAwLHApfXA9KGNbMTM2MDQ+PjJdfDApKyAtMXwwO3I9Y1tqKzg+PjJdfDA7aWYoISgoY1tqKzEyPj4yXXwwKS1yPj4yPj4+MD5wPj4+MCkpe3Y9WGEoNCl8MDtjW3Y+PjJdPTIxMzA0O3diKHZ8MCwyMTM3NiwxOTYpfWo9Y1tyKyhwPDwyKT4+Ml18MDtpZigoanwwKT09MCl7dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9bWNbY1soY1tqPj4yXXwwKSsyMD4+Ml0mMTI3XShsLGopO3A9YVtsPj4wXXwwO2lmKChwJjEpPT0wKXtwPShwJjI1NSk+Pj4xfWVsc2V7cD1jW2wrND4+Ml18MH1pZigocHwwKSE9MCl7Y1toPj4yXT1mO3A9YVtiPj4wXXwwO2lmKHA8PDI0Pj4yND09NDN8cDw8MjQ+PjI0PT00NSl7dj14Y1tjWyhjW24+PjJdfDApKzI4Pj4yXSY2M10obixwKXwwO3A9Y1toPj4yXXwwO2NbaD4+Ml09cCsxO2FbcD4+MF09djtwPWIrMXwwfWVsc2V7cD1ifWlmKCgoZS1wfDApPjE/KGFbcD4+MF18MCk9PTQ4OjApPyhxPXArMXwwLHY9YVtxPj4wXXwwLHY8PDI0Pj4yND09ODh8djw8MjQ+PjI0PT0xMjApOjApe3Y9eGNbY1soY1tuPj4yXXwwKSsyOD4+Ml0mNjNdKG4sNDgpfDA7dT1jW2g+PjJdfDA7Y1toPj4yXT11KzE7YVt1Pj4wXT12O3U9eGNbY1soY1tuPj4yXXwwKSsyOD4+Ml0mNjNdKG4sYVtxPj4wXXwwKXwwO3Y9Y1toPj4yXXwwO2NbaD4+Ml09disxO2Fbdj4+MF09dTtwPXArMnwwfWlmKChwfDApIT0oZXwwKT8obz1lKyAtMXwwLG8+Pj4wPnA+Pj4wKTowKXtxPXA7ZG97dj1hW3E+PjBdfDA7YVtxPj4wXT1hW28+PjBdfDA7YVtvPj4wXT12O3E9cSsxfDA7bz1vKyAtMXwwfXdoaWxlKHE+Pj4wPG8+Pj4wKX1qPW9jW2NbKGNbaj4+Ml18MCkrMTY+PjJdJjEyN10oail8MDtpZihwPj4+MDxlPj4+MCl7cT1sKzF8MDtzPWwrNHwwO289bCs4fDA7dT0wO3Q9MDtyPXA7d2hpbGUoMSl7dj1hWygoYVtsPj4wXSYxKT09MD9xOmNbbz4+Ml18MCkrdD4+MF18MDtpZih2PDwyND4+MjQhPTAmKHV8MCk9PSh2PDwyND4+MjR8MCkpe3U9Y1toPj4yXXwwO2NbaD4+Ml09dSsxO2FbdT4+MF09ajt1PWFbbD4+MF18MDtpZigodSYxKT09MCl7dj0odSYyNTUpPj4+MX1lbHNle3Y9Y1tzPj4yXXwwfXU9MDt0PSh0Pj4+MDwodisgLTF8MCk+Pj4wJjEpK3R8MH13PXhjW2NbKGNbbj4+Ml18MCkrMjg+PjJdJjYzXShuLGFbcj4+MF18MCl8MDt2PWNbaD4+Ml18MDtjW2g+PjJdPXYrMTthW3Y+PjBdPXc7cj1yKzF8MDtpZighKHI+Pj4wPGU+Pj4wKSl7YnJlYWt9ZWxzZXt1PXUrMXwwfX19bz1mKyhwLWIpfDA7bj1jW2g+PjJdfDA7aWYoKG98MCkhPShufDApPyhtPW4rIC0xfDAsbT4+PjA+bz4+PjApOjApe2Rve3c9YVtvPj4wXXwwO2Fbbz4+MF09YVttPj4wXXwwO2FbbT4+MF09dztvPW8rMXwwO209bSsgLTF8MH13aGlsZShvPj4+MDxtPj4+MCl9fWVsc2V7dWNbY1soY1tuPj4yXXwwKSszMj4+Ml0mMzFdKG4sYixlLGYpfDA7Y1toPj4yXT1mKyhlLWIpfWlmKChkfDApPT0oZXwwKSl7Yj1jW2g+PjJdfDB9ZWxzZXtiPWYrKGQtYil8MH1jW2c+PjJdPWI7aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59bD1jW2wrOD4+Ml18MDtpZigobHwwKT09MCl7aT1rO3JldHVybn12bihsKTtpPWs7cmV0dXJufWZ1bmN0aW9uIHlpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2Q9aTtpPWkrOTZ8MDtuPWQrOHwwO3M9ZDtvPWQrNjR8MDtrPWQrNjB8MDttPWQrNTZ8MDtwPWQrNTJ8MDt1PXM7Y1t1Pj4yXT0zNztjW3UrND4+Ml09MDt1PXMrMXwwO3E9Zis0fDA7cj1jW3E+PjJdfDA7aWYoKHImMjA0OHwwKSE9MCl7YVt1Pj4wXT00Mzt1PXMrMnwwfWlmKChyJjUxMnwwKSE9MCl7YVt1Pj4wXT0zNTt1PXUrMXwwfXQ9dSsyfDA7YVt1Pj4wXT0xMDg7YVt1KzE+PjBdPTEwODt1PXImNzQ7ZG97aWYoKHV8MCk9PTY0KXthW3Q+PjBdPTExMX1lbHNlIGlmKCh1fDApPT04KXtpZigociYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNle2FbdD4+MF09MTAwfX13aGlsZSgwKTtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dT1jWzMzNDBdfDA7dD1uO2NbdD4+Ml09aDtjW3QrND4+Ml09ajtqPXdpKG8sMjIsdSxzLG4pfDA7aD1vK2p8MDtxPWNbcT4+Ml0mMTc2O2Rve2lmKChxfDApPT0zMil7cT1ofWVsc2UgaWYoKHF8MCk9PTE2KXtxPWFbbz4+MF18MDtpZihxPDwyND4+MjQ9PTQzfHE8PDI0Pj4yND09NDUpe3E9bysxfDA7YnJlYWt9aWYoKGp8MCk+MSZxPDwyND4+MjQ9PTQ4Pyh1PWFbbysxPj4wXXwwLHU8PDI0Pj4yND09ODh8dTw8MjQ+PjI0PT0xMjApOjApe3E9bysyfDB9ZWxzZXtsPTIxfX1lbHNle2w9MjF9fXdoaWxlKDApO2lmKChsfDApPT0yMSl7cT1vfWw9Y1tmKzI4Pj4yXXwwO2NbcD4+Ml09bDtsPWwrNHwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTt4aShvLHEsaCxuLGssbSxwKTtsPWNbcD4+Ml18MDt0PWwrNHwwO3U9Y1t0Pj4yXXwwO2NbdD4+Ml09dSsgLTE7aWYoKHV8MCkhPTApe3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1ttPj4yXXwwO1djKGIscyxuLHQsdSxmLGcpO2k9ZDtyZXR1cm59bGNbY1soY1tsPj4yXXwwKSs4Pj4yXSYyNTVdKGwpO3M9Y1tlPj4yXXwwO3Q9Y1trPj4yXXwwO3U9Y1ttPj4yXXwwO1djKGIscyxuLHQsdSxmLGcpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gemkoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDttPWk7aT1pKzY0fDA7cj1tO3E9bSsxNnwwO249bSsyNHwwO2s9bSszNnwwO2Q9bSs4fDA7aj1tKzR8MDtvPW0rMTJ8MDthW3ErMD4+MF09YVsxMjI2ND4+MF18MDthW3ErMT4+MF09YVsxMjI2NT4+MF18MDthW3ErMj4+MF09YVsxMjI2Nj4+MF18MDthW3ErMz4+MF09YVsxMjI2Nz4+MF18MDthW3ErND4+MF09YVsxMjI2OD4+MF18MDthW3ErNT4+MF09YVsxMjI2OT4+MF18MDt0PXErMXwwO3A9Zis0fDA7cz1jW3A+PjJdfDA7aWYoKHMmMjA0OHwwKSE9MCl7YVt0Pj4wXT00Mzt0PXErMnwwfWlmKChzJjUxMnwwKSE9MCl7YVt0Pj4wXT0zNTt0PXQrMXwwfWFbdD4+MF09MTA4O3Q9dCsxfDA7dT1zJjc0O2Rve2lmKCh1fDApPT04KXtpZigocyYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNlIGlmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZXthW3Q+PjBdPTExN319d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO2Nbcj4+Ml09aDtxPXdpKG4sMTIsdSxxLHIpfDA7aD1uK3F8MDtwPWNbcD4+Ml0mMTc2O2Rve2lmKChwfDApPT0zMil7cD1ofWVsc2UgaWYoKHB8MCk9PTE2KXtwPWFbbj4+MF18MDtpZihwPDwyND4+MjQ9PTQzfHA8PDI0Pj4yND09NDUpe3A9bisxfDA7YnJlYWt9aWYoKHF8MCk+MSZwPDwyND4+MjQ9PTQ4Pyh1PWFbbisxPj4wXXwwLHU8PDI0Pj4yND09ODh8dTw8MjQ+PjI0PT0xMjApOjApe3A9bisyfDB9ZWxzZXtsPTIxfX1lbHNle2w9MjF9fXdoaWxlKDApO2lmKChsfDApPT0yMSl7cD1ufWw9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09bDtsPWwrNHwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTt4aShuLHAsaCxrLGQsaixvKTtsPWNbbz4+Ml18MDt0PWwrNHwwO3U9Y1t0Pj4yXXwwO2NbdD4+Ml09dSsgLTE7aWYoKHV8MCkhPTApe3M9Y1tlPj4yXXwwO3Q9Y1tkPj4yXXwwO3U9Y1tqPj4yXXwwO1djKGIscyxrLHQsdSxmLGcpO2k9bTtyZXR1cm59bGNbY1soY1tsPj4yXXwwKSs4Pj4yXSYyNTVdKGwpO3M9Y1tlPj4yXXwwO3Q9Y1tkPj4yXXwwO3U9Y1tqPj4yXXwwO1djKGIscyxrLHQsdSxmLGcpO2k9bTtyZXR1cm59ZnVuY3Rpb24gQWkoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7ZD1pO2k9aSs5NnwwO249ZCs4fDA7cz1kO289ZCs2NHwwO2s9ZCs2MHwwO209ZCs1NnwwO3A9ZCs1MnwwO3U9cztjW3U+PjJdPTM3O2NbdSs0Pj4yXT0wO3U9cysxfDA7cT1mKzR8MDtyPWNbcT4+Ml18MDtpZigociYyMDQ4fDApIT0wKXthW3U+PjBdPTQzO3U9cysyfDB9aWYoKHImNTEyfDApIT0wKXthW3U+PjBdPTM1O3U9dSsxfDB9dD11KzJ8MDthW3U+PjBdPTEwODthW3UrMT4+MF09MTA4O3U9ciY3NDtkb3tpZigodXwwKT09NjQpe2FbdD4+MF09MTExfWVsc2UgaWYoKHV8MCk9PTgpe2lmKChyJjE2Mzg0fDApPT0wKXthW3Q+PjBdPTEyMDticmVha31lbHNle2FbdD4+MF09ODg7YnJlYWt9fWVsc2V7YVt0Pj4wXT0xMTd9fXdoaWxlKDApO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX11PWNbMzM0MF18MDt0PW47Y1t0Pj4yXT1oO2NbdCs0Pj4yXT1qO2o9d2kobywyMyx1LHMsbil8MDtoPW8ranwwO3E9Y1txPj4yXSYxNzY7ZG97aWYoKHF8MCk9PTMyKXtxPWh9ZWxzZSBpZigocXwwKT09MTYpe3E9YVtvPj4wXXwwO2lmKHE8PDI0Pj4yND09NDN8cTw8MjQ+PjI0PT00NSl7cT1vKzF8MDticmVha31pZigoanwwKT4xJnE8PDI0Pj4yND09NDg/KHU9YVtvKzE+PjBdfDAsdTw8MjQ+PjI0PT04OHx1PDwyND4+MjQ9PTEyMCk6MCl7cT1vKzJ8MH1lbHNle2w9MjF9fWVsc2V7bD0yMX19d2hpbGUoMCk7aWYoKGx8MCk9PTIxKXtxPW99bD1jW2YrMjg+PjJdfDA7Y1twPj4yXT1sO2w9bCs0fDA7Y1tsPj4yXT0oY1tsPj4yXXwwKSsxO3hpKG8scSxoLG4sayxtLHApO2w9Y1twPj4yXXwwO3Q9bCs0fDA7dT1jW3Q+PjJdfDA7Y1t0Pj4yXT11KyAtMTtpZigodXwwKSE9MCl7cz1jW2U+PjJdfDA7dD1jW2s+PjJdfDA7dT1jW20+PjJdfDA7V2MoYixzLG4sdCx1LGYsZyk7aT1kO3JldHVybn1sY1tjWyhjW2w+PjJdfDApKzg+PjJdJjI1NV0obCk7cz1jW2U+PjJdfDA7dD1jW2s+PjJdfDA7dT1jW20+PjJdfDA7V2MoYixzLG4sdCx1LGYsZyk7aT1kO3JldHVybn1mdW5jdGlvbiBCaShiLGQsZSxmLGcsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aj0rajt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MDtkPWk7aT1pKzEyOHwwO3A9ZDt1PWQrNjR8MDtyPWQrOTJ8MDt0PWQrODB8MDtsPWQrNzZ8MDtuPWQrNzJ8MDtvPWQrODR8MDttPWQrODh8MDt2PXU7Y1t2Pj4yXT0zNztjW3YrND4+Ml09MDt2PXUrMXwwO3M9Zis0fDA7dz1jW3M+PjJdfDA7aWYoKHcmMjA0OHwwKSE9MCl7YVt2Pj4wXT00Mzt2PXUrMnwwfWlmKCh3JjEwMjR8MCkhPTApe2Fbdj4+MF09MzU7dj12KzF8MH14PXcmMjYwO3k9dz4+PjE0O2Rve2lmKCh4fDApPT0yNjApe2lmKCh5JjF8MCk9PTApe2Fbdj4+MF09OTc7dj0wO2JyZWFrfWVsc2V7YVt2Pj4wXT02NTt2PTA7YnJlYWt9fWVsc2V7YVt2Pj4wXT00Njt3PXYrMnwwO2FbdisxPj4wXT00MjtpZigoeHwwKT09NCl7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDI7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MDt2PTE7YnJlYWt9fWVsc2UgaWYoKHh8MCk9PTI1Nil7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDE7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT02OTt2PTE7YnJlYWt9fWVsc2V7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDM7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MTt2PTE7YnJlYWt9fX19d2hpbGUoMCk7Y1t0Pj4yXT1yO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtpZih2KXtjW3A+PjJdPWNbZis4Pj4yXTt5PXArNHwwO2hbaz4+M109ajtjW3k+PjJdPWNbaz4+Ml07Y1t5KzQ+PjJdPWNbays0Pj4yXTt3PXdpKHIsMzAsdyx1LHApfDB9ZWxzZXtoW2s+PjNdPWo7Y1twPj4yXT1jW2s+PjJdO2NbcCs0Pj4yXT1jW2srND4+Ml07dz13aShyLDMwLHcsdSxwKXwwfWlmKCh3fDApPjI5KXt3PShhWzEzMzY4XXwwKT09MDtpZih2KXtpZih3PyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2NbcD4+Ml09Y1tmKzg+PjJdO3k9cCs0fDA7aFtrPj4zXT1qO2NbeT4+Ml09Y1trPj4yXTtjW3krND4+Ml09Y1trKzQ+PjJdO3c9Q2kodCx3LHUscCl8MH1lbHNle2lmKHc/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7Y1twPj4yXT1jW2YrOD4+Ml07eT1wKzR8MDtoW2s+PjNdPWo7Y1t5Pj4yXT1jW2s+PjJdO2NbeSs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfXQ9Y1t0Pj4yXXwwO2lmKCh0fDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3Y9dH19ZWxzZXt2PWNbdD4+Ml18MDt0PTB9dT12K3d8MDtzPWNbcz4+Ml0mMTc2O2Rve2lmKChzfDApPT0xNil7cz1hW3Y+PjBdfDA7aWYoczw8MjQ+PjI0PT00M3xzPDwyND4+MjQ9PTQ1KXtzPXYrMXwwO2JyZWFrfWlmKCh3fDApPjEmczw8MjQ+PjI0PT00OD8oeT1hW3YrMT4+MF18MCx5PDwyND4+MjQ9PTg4fHk8PDI0Pj4yND09MTIwKTowKXtzPXYrMnwwfWVsc2V7cT00OH19ZWxzZSBpZigoc3wwKT09MzIpe3M9dX1lbHNle3E9NDh9fXdoaWxlKDApO2lmKChxfDApPT00OCl7cz12fWlmKCh2fDApIT0ocnwwKSl7cD11bih3PDwxKXwwO2lmKChwfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3I9djtxPXB9fWVsc2V7cT0wfXg9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09eDt4PXgrNHwwO2NbeD4+Ml09KGNbeD4+Ml18MCkrMTtEaShyLHMsdSxwLGwsbixvKTtvPWNbbz4+Ml18MDt4PW8rNHwwO3k9Y1t4Pj4yXXwwO2NbeD4+Ml09eSsgLTE7aWYoKHl8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1XYyhtLGNbZT4+Ml18MCxwLGNbbD4+Ml18MCxjW24+PjJdfDAsZixnKTt5PWNbbT4+Ml18MDtjW2U+PjJdPXk7Y1tiPj4yXT15O2lmKChxfDApIT0wKXt2bihxKX1pZigodHwwKT09MCl7aT1kO3JldHVybn12bih0KTtpPWQ7cmV0dXJufWZ1bmN0aW9uIENpKGEsYixkLGUpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wO2Y9aTtpPWkrMTZ8MDtnPWY7Y1tnPj4yXT1lO2I9aWIoYnwwKXwwO2Q9SWIoYXwwLGR8MCxnfDApfDA7aWYoKGJ8MCk9PTApe2k9ZjtyZXR1cm4gZHwwfWliKGJ8MCl8MDtpPWY7cmV0dXJuIGR8MH1mdW5jdGlvbiBEaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wO2s9aTtpPWkrMzJ8MDtvPWs7bD1rKzEyfDA7bT1jW2o+PjJdfDA7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW28+PjJdPTEzNDU2O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM0NTYsbyl9dD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7cj1jW20rOD4+Ml18MDtpZighKChjW20rMTI+PjJdfDApLXI+PjI+Pj4wPnQ+Pj4wKSl7eT1YYSg0KXwwO2NbeT4+Ml09MjEzMDQ7d2IoeXwwLDIxMzc2LDE5Nil9bT1jW3IrKHQ8PDIpPj4yXXwwO2lmKChtfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1qPWNbaj4+Ml18MDtpZighKChjWzM0MDBdfDApPT0tMSkpe2Nbbz4+Ml09MTM2MDA7Y1tvKzQ+PjJdPTIwODtjW28rOD4+Ml09MDtjZygxMzYwMCxvKX1vPShjWzEzNjA0Pj4yXXwwKSsgLTF8MDtyPWNbais4Pj4yXXwwO2lmKCEoKGNbaisxMj4+Ml18MCktcj4+Mj4+PjA+bz4+PjApKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1vPWNbcisobzw8Mik+PjJdfDA7aWYoKG98MCk9PTApe3k9WGEoNCl8MDtjW3k+PjJdPTIxMzA0O3diKHl8MCwyMTM3NiwxOTYpfW1jW2NbKGNbbz4+Ml18MCkrMjA+PjJdJjEyN10obCxvKTtjW2g+PjJdPWY7aj1hW2I+PjBdfDA7aWYoajw8MjQ+PjI0PT00M3xqPDwyND4+MjQ9PTQ1KXt5PXhjW2NbKGNbbT4+Ml18MCkrMjg+PjJdJjYzXShtLGopfDA7dD1jW2g+PjJdfDA7Y1toPj4yXT10KzE7YVt0Pj4wXT15O3Q9YisxfDB9ZWxzZXt0PWJ9aj1lO2E6ZG97aWYoKChqLXR8MCk+MT8oYVt0Pj4wXXwwKT09NDg6MCk/KHA9dCsxfDAseT1hW3A+PjBdfDAseTw8MjQ+PjI0PT04OHx5PDwyND4+MjQ9PTEyMCk6MCl7eT14Y1tjWyhjW20+PjJdfDApKzI4Pj4yXSY2M10obSw0OCl8MDt4PWNbaD4+Ml18MDtjW2g+PjJdPXgrMTthW3g+PjBdPXk7dD10KzJ8MDt4PXhjW2NbKGNbbT4+Ml18MCkrMjg+PjJdJjYzXShtLGFbcD4+MF18MCl8MDt5PWNbaD4+Ml18MDtjW2g+PjJdPXkrMTthW3k+PjBdPXg7aWYodD4+PjA8ZT4+PjApe3I9dDt3aGlsZSgxKXtwPWFbcj4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9eT1wPDwyND4+MjQ7aWYoISgoeSsgLTQ4fDApPj4+MDwxMCk/ISgoKHl8MzIpKyAtOTd8MCk+Pj4wPDYpOjApe3A9dDticmVhayBhfXI9cisxfDA7aWYoIShyPj4+MDxlPj4+MCkpe3A9dDticmVha319fWVsc2V7cD10O3I9dH19ZWxzZXtzPTE1fX13aGlsZSgwKTtiOmRve2lmKChzfDApPT0xNSl7aWYodD4+PjA8ZT4+PjApe3I9dDt3aGlsZSgxKXtwPWFbcj4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9cz1yKzF8MDtpZighKCgocDw8MjQ+PjI0KSsgLTQ4fDApPj4+MDwxMCkpe3A9dDticmVhayBifWlmKHM+Pj4wPGU+Pj4wKXtyPXN9ZWxzZXtwPXQ7cj1zO2JyZWFrfX19ZWxzZXtwPXQ7cj10fX19d2hpbGUoMCk7cz1hW2w+PjBdfDA7aWYoKHMmMSk9PTApe3M9KHMmMjU1KT4+PjF9ZWxzZXtzPWNbbCs0Pj4yXXwwfWlmKChzfDApIT0wKXtpZigocHwwKSE9KHJ8MCk/KHE9cisgLTF8MCxxPj4+MD5wPj4+MCk6MCl7cz1wO2Rve3k9YVtzPj4wXXwwO2Fbcz4+MF09YVtxPj4wXXwwO2FbcT4+MF09eTtzPXMrMXwwO3E9cSsgLTF8MH13aGlsZShzPj4+MDxxPj4+MCl9dT1vY1tjWyhjW28+PjJdfDApKzE2Pj4yXSYxMjddKG8pfDA7aWYocD4+PjA8cj4+PjApe3E9bCsxfDA7dD1sKzR8MDtzPWwrOHwwO3g9MDt3PTA7dj1wO3doaWxlKDEpe3k9YVsoKGFbbD4+MF0mMSk9PTA/cTpjW3M+PjJdfDApK3c+PjBdfDA7aWYoeTw8MjQ+PjI0PjAmKHh8MCk9PSh5PDwyND4+MjR8MCkpe3g9Y1toPj4yXXwwO2NbaD4+Ml09eCsxO2FbeD4+MF09dTt4PWFbbD4+MF18MDtpZigoeCYxKT09MCl7eT0oeCYyNTUpPj4+MX1lbHNle3k9Y1t0Pj4yXXwwfXg9MDt3PSh3Pj4+MDwoeSsgLTF8MCk+Pj4wJjEpK3d8MH16PXhjW2NbKGNbbT4+Ml18MCkrMjg+PjJdJjYzXShtLGFbdj4+MF18MCl8MDt5PWNbaD4+Ml18MDtjW2g+PjJdPXkrMTthW3k+PjBdPXo7dj12KzF8MDtpZighKHY+Pj4wPHI+Pj4wKSl7YnJlYWt9ZWxzZXt4PXgrMXwwfX19cD1mKyhwLWIpfDA7cT1jW2g+PjJdfDA7aWYoKHB8MCkhPShxfDApPyhuPXErIC0xfDAsbj4+PjA+cD4+PjApOjApe2Rve3o9YVtwPj4wXXwwO2FbcD4+MF09YVtuPj4wXXwwO2Fbbj4+MF09ejtwPXArMXwwO249bisgLTF8MH13aGlsZShwPj4+MDxuPj4+MCl9fWVsc2V7dWNbY1soY1ttPj4yXXwwKSszMj4+Ml0mMzFdKG0scCxyLGNbaD4+Ml18MCl8MDtjW2g+PjJdPShjW2g+PjJdfDApKyhyLXApfWM6ZG97aWYocj4+PjA8ZT4+PjApe3doaWxlKDEpe249YVtyPj4wXXwwO2lmKG48PDI0Pj4yND09NDYpe2JyZWFrfXk9eGNbY1soY1ttPj4yXXwwKSsyOD4+Ml0mNjNdKG0sbil8MDt6PWNbaD4+Ml18MDtjW2g+PjJdPXorMTthW3o+PjBdPXk7cj1yKzF8MDtpZighKHI+Pj4wPGU+Pj4wKSl7YnJlYWsgY319eT1vY1tjWyhjW28+PjJdfDApKzEyPj4yXSYxMjddKG8pfDA7ej1jW2g+PjJdfDA7Y1toPj4yXT16KzE7YVt6Pj4wXT15O3I9cisxfDB9fXdoaWxlKDApO3VjW2NbKGNbbT4+Ml18MCkrMzI+PjJdJjMxXShtLHIsZSxjW2g+PjJdfDApfDA7bT0oY1toPj4yXXwwKSsoai1yKXwwO2NbaD4+Ml09bTtpZigoZHwwKSE9KGV8MCkpe209ZisoZC1iKXwwfWNbZz4+Ml09bTtpZigoYVtsPj4wXSYxKT09MCl7aT1rO3JldHVybn1sPWNbbCs4Pj4yXXwwO2lmKChsfDApPT0wKXtpPWs7cmV0dXJufXZuKGwpO2k9aztyZXR1cm59ZnVuY3Rpb24gRWkoYixkLGUsZixnLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9K2o7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MDtkPWk7aT1pKzEyOHwwO3A9ZDt1PWQrNjR8MDtyPWQrOTJ8MDt0PWQrODB8MDtsPWQrNzZ8MDttPWQrNzJ8MDtvPWQrODR8MDtuPWQrODh8MDt4PXU7Y1t4Pj4yXT0zNztjW3grND4+Ml09MDt4PXUrMXwwO3M9Zis0fDA7dj1jW3M+PjJdfDA7aWYoKHYmMjA0OHwwKSE9MCl7YVt4Pj4wXT00Mzt4PXUrMnwwfWlmKCh2JjEwMjR8MCkhPTApe2FbeD4+MF09MzU7eD14KzF8MH13PXYmMjYwO3Y9dj4+PjE0O2Rve2lmKCh3fDApPT0yNjApe2FbeD4+MF09NzY7dz14KzF8MDtpZigodiYxfDApPT0wKXthW3c+PjBdPTk3O3Y9MDticmVha31lbHNle2Fbdz4+MF09NjU7dj0wO2JyZWFrfX1lbHNle2FbeD4+MF09NDY7YVt4KzE+PjBdPTQyO2FbeCsyPj4wXT03Njt4PXgrM3wwO2lmKCh3fDApPT0yNTYpe2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAxO3Y9MTticmVha31lbHNle2FbeD4+MF09Njk7dj0xO2JyZWFrfX1lbHNlIGlmKCh3fDApPT00KXtpZigodiYxfDApPT0wKXthW3g+PjBdPTEwMjt2PTE7YnJlYWt9ZWxzZXthW3g+PjBdPTcwO3Y9MTticmVha319ZWxzZXtpZigodiYxfDApPT0wKXthW3g+PjBdPTEwMzt2PTE7YnJlYWt9ZWxzZXthW3g+PjBdPTcxO3Y9MTticmVha319fX13aGlsZSgwKTtjW3Q+PjJdPXI7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2lmKHYpe2NbcD4+Ml09Y1tmKzg+PjJdO3g9cCs0fDA7aFtrPj4zXT1qO2NbeD4+Ml09Y1trPj4yXTtjW3grND4+Ml09Y1trKzQ+PjJdO3c9d2kociwzMCx3LHUscCl8MH1lbHNle2hbaz4+M109ajtjW3A+PjJdPWNbaz4+Ml07Y1twKzQ+PjJdPWNbays0Pj4yXTt3PXdpKHIsMzAsdyx1LHApfDB9aWYoKHd8MCk+Mjkpe3c9KGFbMTMzNjhdfDApPT0wO2lmKHYpe2lmKHc/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7Y1twPj4yXT1jW2YrOD4+Ml07eD1wKzR8MDtoW2s+PjNdPWo7Y1t4Pj4yXT1jW2s+PjJdO2NbeCs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfWVsc2V7aWYodz8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtoW2s+PjNdPWo7Y1twPj4yXT1jW2s+PjJdO2NbcCs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfXQ9Y1t0Pj4yXXwwO2lmKCh0fDApPT0wKXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNle3Y9dH19ZWxzZXt2PWNbdD4+Ml18MDt0PTB9dT12K3d8MDtzPWNbcz4+Ml0mMTc2O2Rve2lmKChzfDApPT0xNil7cz1hW3Y+PjBdfDA7aWYoczw8MjQ+PjI0PT00M3xzPDwyND4+MjQ9PTQ1KXtzPXYrMXwwO2JyZWFrfWlmKCh3fDApPjEmczw8MjQ+PjI0PT00OD8oeD1hW3YrMT4+MF18MCx4PDwyND4+MjQ9PTg4fHg8PDI0Pj4yND09MTIwKTowKXtzPXYrMnwwfWVsc2V7cT00OH19ZWxzZSBpZigoc3wwKT09MzIpe3M9dX1lbHNle3E9NDh9fXdoaWxlKDApO2lmKChxfDApPT00OCl7cz12fWlmKCh2fDApIT0ocnwwKSl7cD11bih3PDwxKXwwO2lmKChwfDApPT0wKXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNle3I9djtxPXB9fWVsc2V7cT0wfXc9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09dzt3PXcrNHwwO2Nbdz4+Ml09KGNbdz4+Ml18MCkrMTtEaShyLHMsdSxwLGwsbSxvKTtvPWNbbz4+Ml18MDt3PW8rNHwwO3g9Y1t3Pj4yXXwwO2Nbdz4+Ml09eCsgLTE7aWYoKHh8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1XYyhuLGNbZT4+Ml18MCxwLGNbbD4+Ml18MCxjW20+PjJdfDAsZixnKTt4PWNbbj4+Ml18MDtjW2U+PjJdPXg7Y1tiPj4yXT14O2lmKChxfDApIT0wKXt2bihxKX1pZigodHwwKT09MCl7aT1kO3JldHVybn12bih0KTtpPWQ7cmV0dXJufWZ1bmN0aW9uIEZpKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MDtsPWk7aT1pKzgwfDA7bj1sO289bCs3MnwwO2Q9bCs1MnwwO2s9bCsxMnwwO2FbbyswPj4wXT1hWzEyMjcyPj4wXXwwO2FbbysxPj4wXT1hWzEyMjczPj4wXXwwO2FbbysyPj4wXT1hWzEyMjc0Pj4wXXwwO2FbbyszPj4wXT1hWzEyMjc1Pj4wXXwwO2Fbbys0Pj4wXT1hWzEyMjc2Pj4wXXwwO2Fbbys1Pj4wXT1hWzEyMjc3Pj4wXXwwO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1wPWNbMzM0MF18MDtjW24+PjJdPWg7bz13aShkLDIwLHAsbyxuKXwwO2g9ZCtvfDA7cD1jW2YrND4+Ml0mMTc2O2Rve2lmKChwfDApPT0xNil7cD1hW2Q+PjBdfDA7aWYocDw8MjQ+PjI0PT00M3xwPDwyND4+MjQ9PTQ1KXtwPWQrMXwwO2JyZWFrfWlmKChvfDApPjEmcDw8MjQ+PjI0PT00OD8ocT1hW2QrMT4+MF18MCxxPDwyND4+MjQ9PTg4fHE8PDI0Pj4yND09MTIwKTowKXtwPWQrMnwwfWVsc2V7bT0xMX19ZWxzZSBpZigocHwwKT09MzIpe3A9aH1lbHNle209MTF9fXdoaWxlKDApO2lmKChtfDApPT0xMSl7cD1kfW09Y1tmKzI4Pj4yXXwwO3E9bSs0fDA7Y1txPj4yXT0oY1txPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tuPj4yXT0xMzQ1NjtjW24rND4+Ml09MjA4O2Nbbis4Pj4yXT0wO2NnKDEzNDU2LG4pfXE9KGNbMTM0NjA+PjJdfDApKyAtMXwwO249Y1ttKzg+PjJdfDA7aWYoKGNbbSsxMj4+Ml18MCktbj4+Mj4+PjA+cT4+PjA/KGo9Y1tuKyhxPDwyKT4+Ml18MCwoanwwKSE9MCk6MCl7bj1tKzR8MDtxPWNbbj4+Ml18MDtjW24+PjJdPXErIC0xO2lmKChxfDApPT0wKXtsY1tjWyhjW20+PjJdfDApKzg+PjJdJjI1NV0obSl9dWNbY1soY1tqPj4yXXwwKSszMj4+Ml0mMzFdKGosZCxoLGspfDA7aj1rK298MDtpZigocHwwKT09KGh8MCkpe3E9ajtwPWNbZT4+Ml18MDtXYyhiLHAsayxxLGosZixnKTtpPWw7cmV0dXJufXE9aysocC1kKXwwO3A9Y1tlPj4yXXwwO1djKGIscCxrLHEsaixmLGcpO2k9bDtyZXR1cm59cT1YYSg0KXwwO2NbcT4+Ml09MjEzMDQ7d2IocXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gR2koYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gSGkoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIElpKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MDtqPWk7aT1pKzMyfDA7bT1qO249aisyNHwwO2s9aisxMnwwO2lmKChjW2YrND4+Ml0mMXwwKT09MCl7az1jWyhjW2Q+PjJdfDApKzI0Pj4yXXwwO2Nbbj4+Ml09Y1tlPj4yXTtsPWgmMTtjW20rMD4+Ml09Y1tuKzA+PjJdO3djW2smNjNdKGIsZCxtLGYsZyxsKTtpPWo7cmV0dXJufW49Y1tmKzI4Pj4yXXwwO2Q9bis0fDA7Y1tkPj4yXT0oY1tkPj4yXXwwKSsxO2lmKCEoKGNbMzQwMl18MCk9PS0xKSl7Y1ttPj4yXT0xMzYwODtjW20rND4+Ml09MjA4O2NbbSs4Pj4yXT0wO2NnKDEzNjA4LG0pfWc9KGNbMTM2MTI+PjJdfDApKyAtMXwwO209Y1tuKzg+PjJdfDA7aWYoKGNbbisxMj4+Ml18MCktbT4+Mj4+PjA+Zz4+PjA/KGw9Y1ttKyhnPDwyKT4+Ml18MCwobHwwKSE9MCk6MCl7Zj1uKzR8MDtkPWNbZj4+Ml18MDtjW2Y+PjJdPWQrIC0xO2lmKChkfDApPT0wKXtsY1tjWyhjW24+PjJdfDApKzg+PjJdJjI1NV0obil9bT1jW2w+PjJdfDA7aWYoaCl7bWNbY1ttKzI0Pj4yXSYxMjddKGssbCl9ZWxzZXttY1tjW20rMjg+PjJdJjEyN10oayxsKX1nPWFbaz4+MF18MDtpZigoZyYxKT09MCl7aD1rKzR8MDttPWg7bD1rKzh8MH1lbHNle2w9ays4fDA7bT1jW2w+PjJdfDA7aD1rKzR8MH13aGlsZSgxKXtmPShnJjEpPT0wO2lmKGYpe249aDtnPShnJjI1NSk+Pj4xfWVsc2V7bj1jW2w+PjJdfDA7Zz1jW2g+PjJdfDB9aWYoKG18MCk9PShuKyhnPDwyKXwwKSl7YnJlYWt9Zz1jW20+PjJdfDA7Zj1jW2U+PjJdfDA7aWYoKGZ8MCkhPTApe2Q9ZisyNHwwO249Y1tkPj4yXXwwO2lmKChufDApPT0oY1tmKzI4Pj4yXXwwKSl7Zz14Y1tjWyhjW2Y+PjJdfDApKzUyPj4yXSY2M10oZixnKXwwfWVsc2V7Y1tkPj4yXT1uKzQ7Y1tuPj4yXT1nfWlmKChnfDApPT0tMSl7Y1tlPj4yXT0wfX1nPWFbaz4+MF18MDttPW0rNHwwfWNbYj4+Ml09Y1tlPj4yXTtpZihmKXtpPWo7cmV0dXJufWs9Y1trKzg+PjJdfDA7aWYoKGt8MCk9PTApe2k9ajtyZXR1cm59dm4oayk7aT1qO3JldHVybn1kPVhhKDQpfDA7Y1tkPj4yXT0yMTMwNDt3YihkfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBKaShiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTA7bT1pO2k9aSsxMjh8MDtsPW07cj1tKzEwOHwwO249bSs5NnwwO2Q9bSs5MnwwO2o9bSs4OHwwO289bSs4NHwwO2FbciswPj4wXT1hWzEyMjY0Pj4wXXwwO2FbcisxPj4wXT1hWzEyMjY1Pj4wXXwwO2FbcisyPj4wXT1hWzEyMjY2Pj4wXXwwO2FbciszPj4wXT1hWzEyMjY3Pj4wXXwwO2Fbcis0Pj4wXT1hWzEyMjY4Pj4wXXwwO2Fbcis1Pj4wXT1hWzEyMjY5Pj4wXXwwO3M9cisxfDA7cD1mKzR8MDtxPWNbcD4+Ml18MDtpZigocSYyMDQ4fDApIT0wKXthW3M+PjBdPTQzO3M9cisyfDB9aWYoKHEmNTEyfDApIT0wKXthW3M+PjBdPTM1O3M9cysxfDB9YVtzPj4wXT0xMDg7cz1zKzF8MDt0PXEmNzQ7ZG97aWYoKHR8MCk9PTgpe2lmKChxJjE2Mzg0fDApPT0wKXthW3M+PjBdPTEyMDticmVha31lbHNle2Fbcz4+MF09ODg7YnJlYWt9fWVsc2UgaWYoKHR8MCk9PTY0KXthW3M+PjBdPTExMX1lbHNle2Fbcz4+MF09MTAwfX13aGlsZSgwKTtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9cT1jWzMzNDBdfDA7Y1tsPj4yXT1oO3E9d2kobiwxMixxLHIsbCl8MDtoPW4rcXwwO3A9Y1twPj4yXSYxNzY7ZG97aWYoKHB8MCk9PTE2KXtwPWFbbj4+MF18MDtpZihwPDwyND4+MjQ9PTQzfHA8PDI0Pj4yND09NDUpe3A9bisxfDA7YnJlYWt9aWYoKHF8MCk+MSZwPDwyND4+MjQ9PTQ4Pyh0PWFbbisxPj4wXXwwLHQ8PDI0Pj4yND09ODh8dDw8MjQ+PjI0PT0xMjApOjApe3A9bisyfDB9ZWxzZXtrPTIxfX1lbHNlIGlmKChwfDApPT0zMil7cD1ofWVsc2V7az0yMX19d2hpbGUoMCk7aWYoKGt8MCk9PTIxKXtwPW59az1jW2YrMjg+PjJdfDA7Y1tvPj4yXT1rO2s9ays0fDA7Y1trPj4yXT0oY1trPj4yXXwwKSsxO0tpKG4scCxoLGwsZCxqLG8pO2s9Y1tvPj4yXXwwO3M9ays0fDA7dD1jW3M+PjJdfDA7Y1tzPj4yXT10KyAtMTtpZigodHwwKSE9MCl7cj1jW2U+PjJdfDA7cz1jW2Q+PjJdfDA7dD1jW2o+PjJdfDA7TGkoYixyLGwscyx0LGYsZyk7aT1tO3JldHVybn1sY1tjWyhjW2s+PjJdfDApKzg+PjJdJjI1NV0oayk7cj1jW2U+PjJdfDA7cz1jW2Q+PjJdfDA7dD1jW2o+PjJdfDA7TGkoYixyLGwscyx0LGYsZyk7aT1tO3JldHVybn1mdW5jdGlvbiBLaShiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MDtrPWk7aT1pKzMyfDA7bz1rO2w9aysxMnwwO249Y1tqPj4yXXwwO2lmKCEoKGNbMzM2Ml18MCk9PS0xKSl7Y1tvPj4yXT0xMzQ0ODtjW28rND4+Ml09MjA4O2Nbbys4Pj4yXT0wO2NnKDEzNDQ4LG8pfXM9KGNbMTM0NTI+PjJdfDApKyAtMXwwO3I9Y1tuKzg+PjJdfDA7aWYoISgoY1tuKzEyPj4yXXwwKS1yPj4yPj4+MD5zPj4+MCkpe3Y9WGEoNCl8MDtjW3Y+PjJdPTIxMzA0O3diKHZ8MCwyMTM3NiwxOTYpfW49Y1tyKyhzPDwyKT4+Ml18MDtpZigobnwwKT09MCl7dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9aj1jW2o+PjJdfDA7aWYoISgoY1szNDAyXXwwKT09LTEpKXtjW28+PjJdPTEzNjA4O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM2MDgsbyl9bz0oY1sxMzYxMj4+Ml18MCkrIC0xfDA7cj1jW2orOD4+Ml18MDtpZighKChjW2orMTI+PjJdfDApLXI+PjI+Pj4wPm8+Pj4wKSl7dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9aj1jW3IrKG88PDIpPj4yXXwwO2lmKChqfDApPT0wKXt2PVhhKDQpfDA7Y1t2Pj4yXT0yMTMwNDt3Yih2fDAsMjEzNzYsMTk2KX1tY1tjWyhjW2o+PjJdfDApKzIwPj4yXSYxMjddKGwsaik7bz1hW2w+PjBdfDA7aWYoKG8mMSk9PTApe289KG8mMjU1KT4+PjF9ZWxzZXtvPWNbbCs0Pj4yXXwwfWlmKChvfDApIT0wKXtjW2g+PjJdPWY7bz1hW2I+PjBdfDA7aWYobzw8MjQ+PjI0PT00M3xvPDwyND4+MjQ9PTQ1KXt2PXhjW2NbKGNbbj4+Ml18MCkrNDQ+PjJdJjYzXShuLG8pfDA7bz1jW2g+PjJdfDA7Y1toPj4yXT1vKzQ7Y1tvPj4yXT12O289YisxfDB9ZWxzZXtvPWJ9aWYoKChlLW98MCk+MT8oYVtvPj4wXXwwKT09NDg6MCk/KHE9bysxfDAsdj1hW3E+PjBdfDAsdjw8MjQ+PjI0PT04OHx2PDwyND4+MjQ9PTEyMCk6MCl7dj14Y1tjWyhjW24+PjJdfDApKzQ0Pj4yXSY2M10obiw0OCl8MDt1PWNbaD4+Ml18MDtjW2g+PjJdPXUrNDtjW3U+PjJdPXY7dT14Y1tjWyhjW24+PjJdfDApKzQ0Pj4yXSY2M10obixhW3E+PjBdfDApfDA7dj1jW2g+PjJdfDA7Y1toPj4yXT12KzQ7Y1t2Pj4yXT11O289bysyfDB9aWYoKG98MCkhPShlfDApPyhwPWUrIC0xfDAscD4+PjA+bz4+PjApOjApe3E9bztkb3t2PWFbcT4+MF18MDthW3E+PjBdPWFbcD4+MF18MDthW3A+PjBdPXY7cT1xKzF8MDtwPXArIC0xfDB9d2hpbGUocT4+PjA8cD4+PjApfXE9b2NbY1soY1tqPj4yXXwwKSsxNj4+Ml0mMTI3XShqKXwwO2lmKG8+Pj4wPGU+Pj4wKXtwPWwrMXwwO3M9bCs0fDA7aj1sKzh8MDt1PTA7dD0wO3I9bzt3aGlsZSgxKXt2PWFbKChhW2w+PjBdJjEpPT0wP3A6Y1tqPj4yXXwwKSt0Pj4wXXwwO2lmKHY8PDI0Pj4yNCE9MCYodXwwKT09KHY8PDI0Pj4yNHwwKSl7dT1jW2g+PjJdfDA7Y1toPj4yXT11KzQ7Y1t1Pj4yXT1xO3U9YVtsPj4wXXwwO2lmKCh1JjEpPT0wKXt2PSh1JjI1NSk+Pj4xfWVsc2V7dj1jW3M+PjJdfDB9dT0wO3Q9KHQ+Pj4wPCh2KyAtMXwwKT4+PjAmMSkrdHwwfXg9eGNbY1soY1tuPj4yXXwwKSs0ND4+Ml0mNjNdKG4sYVtyPj4wXXwwKXwwO3c9Y1toPj4yXXwwO3Y9dys0fDA7Y1toPj4yXT12O2Nbdz4+Ml09eDtyPXIrMXwwO2lmKCEocj4+PjA8ZT4+PjApKXticmVha31lbHNle3U9dSsxfDB9fX1lbHNle3Y9Y1toPj4yXXwwfWg9Zisoby1iPDwyKXwwO2lmKChofDApIT0odnwwKT8obT12KyAtNHwwLG0+Pj4wPmg+Pj4wKTowKXtkb3t4PWNbaD4+Ml18MDtjW2g+PjJdPWNbbT4+Ml07Y1ttPj4yXT14O2g9aCs0fDA7bT1tKyAtNHwwfXdoaWxlKGg+Pj4wPG0+Pj4wKX19ZWxzZXt1Y1tjWyhjW24+PjJdfDApKzQ4Pj4yXSYzMV0obixiLGUsZil8MDt2PWYrKGUtYjw8Mil8MDtjW2g+PjJdPXZ9aWYoKGR8MCkhPShlfDApKXt2PWYrKGQtYjw8Mil8MH1jW2c+PjJdPXY7aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59bD1jW2wrOD4+Ml18MDtpZigobHwwKT09MCl7aT1rO3JldHVybn12bihsKTtpPWs7cmV0dXJufWZ1bmN0aW9uIExpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7az1pO2k9aSsxNnwwO2w9aztpZigoZHwwKT09MCl7Y1tiPj4yXT0wO2k9aztyZXR1cm59cT1lO249Zy1xPj4yO2g9aCsxMnwwO209Y1toPj4yXXwwO249KG18MCk+KG58MCk/bS1ufDA6MDttPWY7cT1tLXF8MDtwPXE+PjI7aWYoKHF8MCk+MD8oaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsZSxwKXwwKSE9KHB8MCk6MCl7Y1tiPj4yXT0wO2k9aztyZXR1cm59ZG97aWYoKG58MCk+MCl7aWYobj4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihuPj4+MDwyKXthW2w+PjBdPW48PDE7ZT1sKzR8MDtvPTE4fWVsc2V7ZT1uKzQmLTQ7cD1lPDwyO3A9KHB8MCk9PTA/MTpwO3doaWxlKDEpe3E9dW4ocCl8MDtpZigocXwwKSE9MCl7bz0xNzticmVha31xPWNbNTY2Nl18MDtjWzU2NjZdPXErMDtpZigocXwwKT09MCl7YnJlYWt9c2NbcSYzMV0oKX1pZigob3wwKT09MTcpe2NbbCs4Pj4yXT1xO2NbbD4+Ml09ZXwxO2NbbCs0Pj4yXT1uO2lmKChufDApPT0wKXtlPXE7YnJlYWt9ZWxzZXtlPXE7bz0xODticmVha319cT1YYSg0KXwwO2NbcT4+Ml09MjI2ODA7d2IocXwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKChvfDApPT0xOCl7bz1uO3A9ZTt3aGlsZSgxKXtvPW8rIC0xfDA7Y1twPj4yXT1qO2lmKChvfDApPT0wKXticmVha31lbHNle3A9cCs0fDB9fX1jW2UrKG48PDIpPj4yXT0wO2lmKChhW2w+PjBdJjEpPT0wKXtqPWwrNHwwfWVsc2V7aj1jW2wrOD4+Ml18MH1pZigoaGNbY1soY1tkPj4yXXwwKSs0OD4+Ml0mNjNdKGQsaixuKXwwKT09KG58MCkpe2lmKChhW2w+PjBdJjEpPT0wKXticmVha31sPWNbbCs4Pj4yXXwwO2lmKChsfDApPT0wKXticmVha312bihsKTticmVha31jW2I+PjJdPTA7aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59Yj1jW2wrOD4+Ml18MDtpZigoYnwwKT09MCl7aT1rO3JldHVybn12bihiKTtpPWs7cmV0dXJufX13aGlsZSgwKTtxPWctbXwwO2w9cT4+MjtpZigocXwwKT4wPyhoY1tjWyhjW2Q+PjJdfDApKzQ4Pj4yXSY2M10oZCxmLGwpfDApIT0obHwwKTowKXtjW2I+PjJdPTA7aT1rO3JldHVybn1jW2g+PjJdPTA7Y1tiPj4yXT1kO2k9aztyZXR1cm59ZnVuY3Rpb24gTWkoYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7bT1pO2k9aSsyMDh8MDtsPW0rOHwwO3M9bTtvPW0rMTg0fDA7ZD1tKzE4MHwwO2s9bSsxNzZ8MDtwPW0rMTcyfDA7dT1zO2NbdT4+Ml09Mzc7Y1t1KzQ+PjJdPTA7dT1zKzF8MDtxPWYrNHwwO3I9Y1txPj4yXXwwO2lmKChyJjIwNDh8MCkhPTApe2FbdT4+MF09NDM7dT1zKzJ8MH1pZigociY1MTJ8MCkhPTApe2FbdT4+MF09MzU7dT11KzF8MH10PXUrMnwwO2FbdT4+MF09MTA4O2FbdSsxPj4wXT0xMDg7dT1yJjc0O2Rve2lmKCh1fDApPT04KXtpZigociYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNlIGlmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZXthW3Q+PjBdPTEwMH19d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO3Q9bDtjW3Q+PjJdPWg7Y1t0KzQ+PjJdPWo7aD13aShvLDIyLHUscyxsKXwwO2o9bytofDA7cT1jW3E+PjJdJjE3Njtkb3tpZigocXwwKT09MzIpe3E9an1lbHNlIGlmKChxfDApPT0xNil7cT1hW28+PjBdfDA7aWYocTw8MjQ+PjI0PT00M3xxPDwyND4+MjQ9PTQ1KXtxPW8rMXwwO2JyZWFrfWlmKChofDApPjEmcTw8MjQ+PjI0PT00OD8odT1hW28rMT4+MF18MCx1PDwyND4+MjQ9PTg4fHU8PDI0Pj4yND09MTIwKTowKXtxPW8rMnwwfWVsc2V7bj0yMX19ZWxzZXtuPTIxfX13aGlsZSgwKTtpZigobnwwKT09MjEpe3E9b31uPWNbZisyOD4+Ml18MDtjW3A+PjJdPW47bj1uKzR8MDtjW24+PjJdPShjW24+PjJdfDApKzE7S2kobyxxLGosbCxkLGsscCk7bj1jW3A+PjJdfDA7dD1uKzR8MDt1PWNbdD4+Ml18MDtjW3Q+PjJdPXUrIC0xO2lmKCh1fDApIT0wKXtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWxjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKTtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWZ1bmN0aW9uIE5pKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MDtkPWk7aT1pKzEyOHwwO2w9ZDtxPWQrMTA4fDA7bj1kKzk2fDA7az1kKzkyfDA7bT1kKzg4fDA7bz1kKzg0fDA7YVtxKzA+PjBdPWFbMTIyNjQ+PjBdfDA7YVtxKzE+PjBdPWFbMTIyNjU+PjBdfDA7YVtxKzI+PjBdPWFbMTIyNjY+PjBdfDA7YVtxKzM+PjBdPWFbMTIyNjc+PjBdfDA7YVtxKzQ+PjBdPWFbMTIyNjg+PjBdfDA7YVtxKzU+PjBdPWFbMTIyNjk+PjBdfDA7cz1xKzF8MDtwPWYrNHwwO3I9Y1twPj4yXXwwO2lmKChyJjIwNDh8MCkhPTApe2Fbcz4+MF09NDM7cz1xKzJ8MH1pZigociY1MTJ8MCkhPTApe2Fbcz4+MF09MzU7cz1zKzF8MH1hW3M+PjBdPTEwODt0PXMrMXwwO3M9ciY3NDtkb3tpZigoc3wwKT09NjQpe2FbdD4+MF09MTExfWVsc2UgaWYoKHN8MCk9PTgpe2lmKChyJjE2Mzg0fDApPT0wKXthW3Q+PjBdPTEyMDticmVha31lbHNle2FbdD4+MF09ODg7YnJlYWt9fWVsc2V7YVt0Pj4wXT0xMTd9fXdoaWxlKDApO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX10PWNbMzM0MF18MDtjW2w+PjJdPWg7cT13aShuLDEyLHQscSxsKXwwO2g9bitxfDA7cD1jW3A+PjJdJjE3Njtkb3tpZigocHwwKT09MzIpe3A9aH1lbHNlIGlmKChwfDApPT0xNil7cD1hW24+PjBdfDA7aWYocDw8MjQ+PjI0PT00M3xwPDwyND4+MjQ9PTQ1KXtwPW4rMXwwO2JyZWFrfWlmKChxfDApPjEmcDw8MjQ+PjI0PT00OD8odD1hW24rMT4+MF18MCx0PDwyND4+MjQ9PTg4fHQ8PDI0Pj4yND09MTIwKTowKXtwPW4rMnwwfWVsc2V7aj0yMX19ZWxzZXtqPTIxfX13aGlsZSgwKTtpZigoanwwKT09MjEpe3A9bn1qPWNbZisyOD4+Ml18MDtjW28+PjJdPWo7aj1qKzR8MDtjW2o+PjJdPShjW2o+PjJdfDApKzE7S2kobixwLGgsbCxrLG0sbyk7aj1jW28+PjJdfDA7cz1qKzR8MDt0PWNbcz4+Ml18MDtjW3M+PjJdPXQrIC0xO2lmKCh0fDApIT0wKXtyPWNbZT4+Ml18MDtzPWNbaz4+Ml18MDt0PWNbbT4+Ml18MDtMaShiLHIsbCxzLHQsZixnKTtpPWQ7cmV0dXJufWxjW2NbKGNbaj4+Ml18MCkrOD4+Ml0mMjU1XShqKTtyPWNbZT4+Ml18MDtzPWNbaz4+Ml18MDt0PWNbbT4+Ml18MDtMaShiLHIsbCxzLHQsZixnKTtpPWQ7cmV0dXJufQoKCgpmdW5jdGlvbiBYayhiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MDtkPWk7aT1pKzE2fDA7ZT1kO2lmKChhWzEzNDMyXXwwKSE9MCl7aD1jWzMzNTZdfDA7Y1tiPj4yXT1oO2g9aCs0fDA7Zz1jW2g+PjJdfDA7Y1toPj4yXT1nKzE7aT1kO3JldHVybn1pZigoUWEoMTM0MzIpfDApPT0wKXtoPWNbMzM1Nl18MDtjW2I+PjJdPWg7aD1oKzR8MDtnPWNbaD4+Ml18MDtjW2g+PjJdPWcrMTtpPWQ7cmV0dXJufWlmKChhWzEzNDE2XXwwKT09MD8oUWEoMTM0MTYpfDApIT0wOjApe2NbMTc3NjQ+PjJdPTA7Y1s0NDQwXT0xMzM5MjthWzE3ODk2Pj4wXT0xO2NbMTc3NzI+PjJdPTE3Nzg0O2NbMTc3Njg+PjJdPTE3Nzg0O2NbMTc3NzY+PjJdPTE3ODk2O2g9Mjg7Zj0xNzc4NHwwO2Rve2NbZj4+Ml09MDtnPWNbMTc3NzI+PjJdfDA7Zj1nKzR8MDtjWzE3NzcyPj4yXT1mO2g9aCsgLTF8MH13aGlsZSgoaHwwKSE9MCk7YVsxNzkwND4+MF09MjthWzE3OTA1Pj4wXT02NzthWzE3OTA2Pj4wXT0wO2g9Y1sxNzc2OD4+Ml18MDtpZigoZnwwKSE9KGh8MCkpe2NbMTc3NzI+PjJdPWcrKDAtKChnKygwLWgpfDApPj4+Mik8PDIpfWNbMTgyMjg+PjJdPTA7Y1s0NTU2XT0xMTg3MjtpZighKChjWzI5NzRdfDApPT0tMSkpe2NbZT4+Ml09MTE4OTY7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMTg5NixlKX1VaygxNzc2MCwxODIyNCwoY1sxMTkwMD4+Ml18MCkrIC0xfDApO2NbMTgyMjA+PjJdPTA7Y1s0NTU0XT0xMTkxMjtpZighKChjWzI5ODRdfDApPT0tMSkpe2NbZT4+Ml09MTE5MzY7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMTkzNixlKX1VaygxNzc2MCwxODIxNiwoY1sxMTk0MD4+Ml18MCkrIC0xfDApO2NbMTgyMDQ+PjJdPTA7Y1s0NTUwXT0xMzQ3MjtjWzE4MjA4Pj4yXT0wO2FbMTgyMTI+PjBdPTA7Y1sxODIwOD4+Ml09Y1soTmEoKXwwKT4+Ml07aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2U+PjJdPTEzNDU2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM0NTYsZSl9VWsoMTc3NjAsMTgyMDAsKGNbMTM0NjA+PjJdfDApKyAtMXwwKTtjWzE4MTk2Pj4yXT0wO2NbNDU0OF09MTQzOTI7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW2U+PjJdPTEzNDQ4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM0NDgsZSl9VWsoMTc3NjAsMTgxOTIsKGNbMTM0NTI+PjJdfDApKyAtMXwwKTtjWzE4MTg4Pj4yXT0wO2NbNDU0Nl09MTQ2MDg7aWYoISgoY1szMzgwXXwwKT09LTEpKXtjW2U+PjJdPTEzNTIwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1MjAsZSl9VWsoMTc3NjAsMTgxODQsKGNbMTM1MjQ+PjJdfDApKyAtMXwwKTtjWzE4MTcyPj4yXT0wO2NbNDU0Ml09MTM1NDQ7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWNbMTgxNzY+PjJdPWNbMzM0MF07aWYoISgoY1szMzgyXXwwKT09LTEpKXtjW2U+PjJdPTEzNTI4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1MjgsZSl9VWsoMTc3NjAsMTgxNjgsKGNbMTM1MzI+PjJdfDApKyAtMXwwKTtjWzE4MTY0Pj4yXT0wO2NbNDU0MF09MTQ4MzI7aWYoISgoY1szMzk2XXwwKT09LTEpKXtjW2U+PjJdPTEzNTg0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1ODQsZSl9VWsoMTc3NjAsMTgxNjAsKGNbMTM1ODg+PjJdfDApKyAtMXwwKTtjWzE4MTU2Pj4yXT0wO2NbNDUzOF09MTQ5NTI7aWYoISgoY1szMzk4XXwwKT09LTEpKXtjW2U+PjJdPTEzNTkyO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM1OTIsZSl9VWsoMTc3NjAsMTgxNTIsKGNbMTM1OTY+PjJdfDApKyAtMXwwKTtjWzE4MTMyPj4yXT0wO2NbNDUzMl09MTM2MjQ7YVsxODEzNj4+MF09NDY7YVsxODEzNz4+MF09NDQ7Y1sxODE0MD4+Ml09MDtjWzE4MTQ0Pj4yXT0wO2NbMTgxNDg+PjJdPTA7aWYoISgoY1szNDAwXXwwKT09LTEpKXtjW2U+PjJdPTEzNjAwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM2MDAsZSl9VWsoMTc3NjAsMTgxMjgsKGNbMTM2MDQ+PjJdfDApKyAtMXwwKTtjWzE4MTAwPj4yXT0wO2NbNDUyNF09MTM2NjQ7Y1sxODEwND4+Ml09NDY7Y1sxODEwOD4+Ml09NDQ7Y1sxODExMj4+Ml09MDtjWzE4MTE2Pj4yXT0wO2NbMTgxMjA+PjJdPTA7aWYoISgoY1szNDAyXXwwKT09LTEpKXtjW2U+PjJdPTEzNjA4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTM2MDgsZSl9VWsoMTc3NjAsMTgwOTYsKGNbMTM2MTI+PjJdfDApKyAtMXwwKTtjWzE4MDkyPj4yXT0wO2NbNDUyMl09MTE5NTI7aWYoISgoY1szMDAyXXwwKT09LTEpKXtjW2U+PjJdPTEyMDA4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIwMDgsZSl9VWsoMTc3NjAsMTgwODgsKGNbMTIwMTI+PjJdfDApKyAtMXwwKTtjWzE4MDg0Pj4yXT0wO2NbNDUyMF09MTIwNzI7aWYoISgoY1szMDMyXXwwKT09LTEpKXtjW2U+PjJdPTEyMTI4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIxMjgsZSl9VWsoMTc3NjAsMTgwODAsKGNbMTIxMzI+PjJdfDApKyAtMXwwKTtjWzE4MDc2Pj4yXT0wO2NbNDUxOF09MTIxNDQ7aWYoISgoY1szMDQ4XXwwKT09LTEpKXtjW2U+PjJdPTEyMTkyO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIxOTIsZSl9VWsoMTc3NjAsMTgwNzIsKGNbMTIxOTY+PjJdfDApKyAtMXwwKTtjWzE4MDY4Pj4yXT0wO2NbNDUxNl09MTIyMDg7aWYoISgoY1szMDY0XXwwKT09LTEpKXtjW2U+PjJdPTEyMjU2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTIyNTYsZSl9VWsoMTc3NjAsMTgwNjQsKGNbMTIyNjA+PjJdfDApKyAtMXwwKTtjWzE4MDYwPj4yXT0wO2NbNDUxNF09MTI4MDA7aWYoISgoY1szMjEyXXwwKT09LTEpKXtjW2U+PjJdPTEyODQ4O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI4NDgsZSl9VWsoMTc3NjAsMTgwNTYsKGNbMTI4NTI+PjJdfDApKyAtMXwwKTtjWzE4MDUyPj4yXT0wO2NbNDUxMl09MTI4NjQ7aWYoISgoY1szMjI4XXwwKT09LTEpKXtjW2U+PjJdPTEyOTEyO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI5MTIsZSl9VWsoMTc3NjAsMTgwNDgsKGNbMTI5MTY+PjJdfDApKyAtMXwwKTtjWzE4MDQ0Pj4yXT0wO2NbNDUxMF09MTI5Mjg7aWYoISgoY1szMjQ0XXwwKT09LTEpKXtjW2U+PjJdPTEyOTc2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI5NzYsZSl9VWsoMTc3NjAsMTgwNDAsKGNbMTI5ODA+PjJdfDApKyAtMXwwKTtjWzE4MDM2Pj4yXT0wO2NbNDUwOF09MTI5OTI7aWYoISgoY1szMjYwXXwwKT09LTEpKXtjW2U+PjJdPTEzMDQwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMwNDAsZSl9VWsoMTc3NjAsMTgwMzIsKGNbMTMwNDQ+PjJdfDApKyAtMXwwKTtjWzE4MDI4Pj4yXT0wO2NbNDUwNl09MTMwNTY7aWYoISgoY1szMjcwXXwwKT09LTEpKXtjW2U+PjJdPTEzMDgwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMwODAsZSl9VWsoMTc3NjAsMTgwMjQsKGNbMTMwODQ+PjJdfDApKyAtMXwwKTtjWzE4MDIwPj4yXT0wO2NbNDUwNF09MTMxMzY7aWYoISgoY1szMjkwXXwwKT09LTEpKXtjW2U+PjJdPTEzMTYwO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMxNjAsZSl9VWsoMTc3NjAsMTgwMTYsKGNbMTMxNjQ+PjJdfDApKyAtMXwwKTtjWzE4MDEyPj4yXT0wO2NbNDUwMl09MTMxOTI7aWYoISgoY1szMzA0XXwwKT09LTEpKXtjW2U+PjJdPTEzMjE2O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMyMTYsZSl9VWsoMTc3NjAsMTgwMDgsKGNbMTMyMjA+PjJdfDApKyAtMXwwKTtjWzE4MDA0Pj4yXT0wO2NbNDUwMF09MTMyNDA7aWYoISgoY1szMzE2XXwwKT09LTEpKXtjW2U+PjJdPTEzMjY0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMyNjQsZSl9VWsoMTc3NjAsMThlMywoY1sxMzI2OD4+Ml18MCkrIC0xfDApO2NbMTc5ODg+PjJdPTA7Y1s0NDk2XT0xMjI4ODtjWzE3OTkyPj4yXT0xMjMzNjtpZighKChjWzMwOTJdfDApPT0tMSkpe2NbZT4+Ml09MTIzNjg7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMjM2OCxlKX1VaygxNzc2MCwxNzk4NCwoY1sxMjM3Mj4+Ml18MCkrIC0xfDApO2NbMTc5NzI+PjJdPTA7Y1s0NDkyXT0xMjQ0MDtjWzE3OTc2Pj4yXT0xMjQ4ODtpZighKChjWzMxMzBdfDApPT0tMSkpe2NbZT4+Ml09MTI1MjA7Y1tlKzQ+PjJdPTIwODtjW2UrOD4+Ml09MDtjZygxMjUyMCxlKX1VaygxNzc2MCwxNzk2OCwoY1sxMjUyND4+Ml18MCkrIC0xfDApO2NbMTc5NTY+PjJdPTA7Y1s0NDg4XT0xNDMyODtkb3tpZigoYVsxMzM2OF18MCk9PTApe2lmKChRYSgxMzM2OCl8MCk9PTApe2JyZWFrfWNbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX19d2hpbGUoMCk7Y1sxNzk2MD4+Ml09Y1szMzQwXTtjWzQ0ODhdPTEyNzM2O2lmKCEoKGNbMzE4OF18MCk9PS0xKSl7Y1tlPj4yXT0xMjc1MjtjW2UrND4+Ml09MjA4O2NbZSs4Pj4yXT0wO2NnKDEyNzUyLGUpfVVrKDE3NzYwLDE3OTUyLChjWzEyNzU2Pj4yXXwwKSsgLTF8MCk7Y1sxNzk0MD4+Ml09MDtjWzQ0ODRdPTE0MzI4O2Rve2lmKChhWzEzMzY4XXwwKT09MCl7aWYoKFFhKDEzMzY4KXwwKT09MCl7YnJlYWt9Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfX13aGlsZSgwKTtjWzE3OTQ0Pj4yXT1jWzMzNDBdO2NbNDQ4NF09MTI3Njg7aWYoISgoY1szMTk2XXwwKT09LTEpKXtjW2U+PjJdPTEyNzg0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTI3ODQsZSl9VWsoMTc3NjAsMTc5MzYsKGNbMTI3ODg+PjJdfDApKyAtMXwwKTtjWzE3OTMyPj4yXT0wO2NbNDQ4Ml09MTMyODA7aWYoISgoY1szMzI2XXwwKT09LTEpKXtjW2U+PjJdPTEzMzA0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMzMDQsZSl9VWsoMTc3NjAsMTc5MjgsKGNbMTMzMDg+PjJdfDApKyAtMXwwKTtjWzE3OTI0Pj4yXT0wO2NbNDQ4MF09MTMzMjA7aWYoISgoY1szMzM2XXwwKT09LTEpKXtjW2U+PjJdPTEzMzQ0O2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coMTMzNDQsZSl9VWsoMTc3NjAsMTc5MjAsKGNbMTMzNDg+PjJdfDApKyAtMXwwKTtjWzMzNTJdPTE3NzYwOyRhKDEzNDE2KX1oPWNbMzM1Ml18MDtjWzMzNTZdPWg7aD1oKzR8MDtjW2g+PjJdPShjW2g+PjJdfDApKzE7JGEoMTM0MzIpO2g9Y1szMzU2XXwwO2NbYj4+Ml09aDtoPWgrNHwwO2c9Y1toPj4yXXwwO2NbaD4+Ml09ZysxO2k9ZDtyZXR1cm59ZnVuY3Rpb24gWWsoYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MDtkPWk7aT1pKzE2fDA7ZT1kO2lmKCEoKGNbYj4+Ml18MCk9PS0xKSl7Y1tlPj4yXT1iO2NbZSs0Pj4yXT0yMDg7Y1tlKzg+PjJdPTA7Y2coYixlKX1lPShjW2IrND4+Ml18MCkrIC0xfDA7Yj1jW2ErOD4+Ml18MDtpZighKChjW2ErMTI+PjJdfDApLWI+PjI+Pj4wPmU+Pj4wKSl7ZT1YYSg0KXwwO2NbZT4+Ml09MjEzMDQ7d2IoZXwwLDIxMzc2LDE5Nil9YT1jW2IrKGU8PDIpPj4yXXwwO2lmKChhfDApPT0wKXtlPVhhKDQpfDA7Y1tlPj4yXT0yMTMwNDt3YihlfDAsMjEzNzYsMTk2KX1lbHNle2k9ZDtyZXR1cm4gYXwwfXJldHVybiAwfWZ1bmN0aW9uIFprKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIF9rKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApPT0wKXtpPWI7cmV0dXJufWxjW2NbKGNbYT4+Ml18MCkrND4+Ml0mMjU1XShhKTtpPWI7cmV0dXJufWZ1bmN0aW9uICRrKGEpe2E9YXwwO3ZhciBiPTA7Yj1jWzMzNjBdfDA7Y1szMzYwXT1iKzE7Y1thKzQ+PjJdPWIrMTtyZXR1cm59ZnVuY3Rpb24gYWwoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gYmwoYSxkLGUpe2E9YXwwO2Q9ZHwwO2U9ZXwwO2E9aTtpZighKGU+Pj4wPDEyOCkpe2Q9MDtpPWE7cmV0dXJuIGR8MH1kPShiWyhjWyhOYSgpfDApPj4yXXwwKSsoZTw8MSk+PjFdJmQpPDwxNj4+MTYhPTA7aT1hO3JldHVybiBkfDB9ZnVuY3Rpb24gY2woYSxkLGUsZil7YT1hfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MDthPWk7aWYoKGR8MCk9PShlfDApKXtnPWQ7aT1hO3JldHVybiBnfDB9d2hpbGUoMSl7Zz1jW2Q+PjJdfDA7aWYoZz4+PjA8MTI4KXtnPWJbKGNbKE5hKCl8MCk+PjJdfDApKyhnPDwxKT4+MV18MH1lbHNle2c9MH1iW2Y+PjFdPWc7ZD1kKzR8MDtpZigoZHwwKT09KGV8MCkpe2JyZWFrfWVsc2V7Zj1mKzJ8MH19aT1hO3JldHVybiBlfDB9ZnVuY3Rpb24gZGwoYSxkLGUsZil7YT1hfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MDthPWk7YTpkb3tpZigoZXwwKT09KGZ8MCkpe2Y9ZX1lbHNle2Rve2c9Y1tlPj4yXXwwO2lmKGc+Pj4wPDEyOD8hKChiWyhjWyhOYSgpfDApPj4yXXwwKSsoZzw8MSk+PjFdJmQpPDwxNj4+MTY9PTApOjApe2Y9ZTticmVhayBhfWU9ZSs0fDB9d2hpbGUoKGV8MCkhPShmfDApKX19d2hpbGUoMCk7aT1hO3JldHVybiBmfDB9ZnVuY3Rpb24gZWwoYSxkLGUsZil7YT1hfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MDthPWk7YTpkb3tpZigoZXwwKT09KGZ8MCkpe2Y9ZX1lbHNle2Rve2c9Y1tlPj4yXXwwO2lmKCEoZz4+PjA8MTI4KSl7Zj1lO2JyZWFrIGF9aWYoKGJbKGNbKE5hKCl8MCk+PjJdfDApKyhnPDwxKT4+MV0mZCk8PDE2Pj4xNj09MCl7Zj1lO2JyZWFrIGF9ZT1lKzR8MH13aGlsZSgoZXwwKSE9KGZ8MCkpfX13aGlsZSgwKTtpPWE7cmV0dXJuIGZ8MH1mdW5jdGlvbiBmbChhLGIpe2E9YXwwO2I9YnwwO2E9aTtpZighKGI+Pj4wPDEyOCkpe2k9YTtyZXR1cm4gYnwwfWI9Y1soY1soWmEoKXwwKT4+Ml18MCkrKGI8PDIpPj4yXXwwO2k9YTtyZXR1cm4gYnwwfWZ1bmN0aW9uIGdsKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wO2E9aTtpZigoYnwwKT09KGR8MCkpe2U9YjtpPWE7cmV0dXJuIGV8MH1kb3tlPWNbYj4+Ml18MDtpZihlPj4+MDwxMjgpe2U9Y1soY1soWmEoKXwwKT4+Ml18MCkrKGU8PDIpPj4yXXwwfWNbYj4+Ml09ZTtiPWIrNHwwfXdoaWxlKChifDApIT0oZHwwKSk7aT1hO3JldHVybiBkfDB9ZnVuY3Rpb24gaGwoYSxiKXthPWF8MDtiPWJ8MDthPWk7aWYoIShiPj4+MDwxMjgpKXtpPWE7cmV0dXJuIGJ8MH1iPWNbKGNbKEhhKCl8MCk+PjJdfDApKyhiPDwyKT4+Ml18MDtpPWE7cmV0dXJuIGJ8MH1mdW5jdGlvbiBpbChhLGIsZCl7YT1hfDA7Yj1ifDA7ZD1kfDA7dmFyIGU9MDthPWk7aWYoKGJ8MCk9PShkfDApKXtlPWI7aT1hO3JldHVybiBlfDB9ZG97ZT1jW2I+PjJdfDA7aWYoZT4+PjA8MTI4KXtlPWNbKGNbKEhhKCl8MCk+PjJdfDApKyhlPDwyKT4+Ml18MH1jW2I+PjJdPWU7Yj1iKzR8MH13aGlsZSgoYnwwKSE9KGR8MCkpO2k9YTtyZXR1cm4gZHwwfWZ1bmN0aW9uIGpsKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGI8PDI0Pj4yNHwwfWZ1bmN0aW9uIGtsKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2I9aTtpZigoZHwwKT09KGV8MCkpe2k9YjtyZXR1cm4gZHwwfXdoaWxlKDEpe2NbZj4+Ml09YVtkPj4wXXwwO2Q9ZCsxfDA7aWYoKGR8MCk9PShlfDApKXticmVha31lbHNle2Y9Zis0fDB9fWk9YjtyZXR1cm4gZXwwfWZ1bmN0aW9uIGxsKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4oYj4+PjA8MTI4P2ImMjU1OmMpfDB9ZnVuY3Rpb24gbWwoYixkLGUsZixnKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wLGo9MCxrPTA7Yj1pO2lmKChkfDApPT0oZXwwKSl7aj1kO2k9YjtyZXR1cm4ganwwfWg9KChlKyAtNCsoMC1kKXwwKT4+PjIpKzF8MDtqPWQ7d2hpbGUoMSl7az1jW2o+PjJdfDA7YVtnPj4wXT1rPj4+MDwxMjg/ayYyNTU6ZjtqPWorNHwwO2lmKChqfDApPT0oZXwwKSl7YnJlYWt9ZWxzZXtnPWcrMXwwfX1rPWQrKGg8PDIpfDA7aT1iO3JldHVybiBrfDB9ZnVuY3Rpb24gbmwoYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2NbYj4+Ml09MTM0NzI7ZT1jW2IrOD4+Ml18MDtpZigoZXwwKSE9MCl7aWYoKGFbYisxMj4+MF18MCkhPTApe3ZuKGUpfWlmKChifDApPT0wKXtpPWQ7cmV0dXJufX12bihiKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIG9sKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNDcyO2U9Y1tiKzg+PjJdfDA7aWYoKGV8MCkhPTA/KGFbYisxMj4+MF18MCkhPTA6MCl7dm4oZSl9aT1kO3JldHVybn1mdW5jdGlvbiBwbChhLGIpe2E9YXwwO2I9YnwwO2E9aTtpZighKGI8PDI0Pj4yND4tMSkpe2k9YTtyZXR1cm4gYnwwfWI9Y1soY1soWmEoKXwwKT4+Ml18MCkrKChiJjI1NSk8PDIpPj4yXSYyNTU7aT1hO3JldHVybiBifDB9ZnVuY3Rpb24gcWwoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTA7Yj1pO2lmKChkfDApPT0oZXwwKSl7Zj1kO2k9YjtyZXR1cm4gZnwwfWRve2Y9YVtkPj4wXXwwO2lmKGY8PDI0Pj4yND4tMSl7Zj1jWyhjWyhaYSgpfDApPj4yXXwwKSsoZjw8MjQ+PjI0PDwyKT4+Ml0mMjU1fWFbZD4+MF09ZjtkPWQrMXwwfXdoaWxlKChkfDApIT0oZXwwKSk7aT1iO3JldHVybiBlfDB9ZnVuY3Rpb24gcmwoYSxiKXthPWF8MDtiPWJ8MDthPWk7aWYoIShiPDwyND4+MjQ+LTEpKXtpPWE7cmV0dXJuIGJ8MH1iPWNbKGNbKEhhKCl8MCk+PjJdfDApKyhiPDwyND4+MjQ8PDIpPj4yXSYyNTU7aT1hO3JldHVybiBifDB9ZnVuY3Rpb24gc2woYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTA7Yj1pO2lmKChkfDApPT0oZXwwKSl7Zj1kO2k9YjtyZXR1cm4gZnwwfWRve2Y9YVtkPj4wXXwwO2lmKGY8PDI0Pj4yND4tMSl7Zj1jWyhjWyhIYSgpfDApPj4yXXwwKSsoZjw8MjQ+PjI0PDwyKT4+Ml0mMjU1fWFbZD4+MF09ZjtkPWQrMXwwfXdoaWxlKChkfDApIT0oZXwwKSk7aT1iO3JldHVybiBlfDB9ZnVuY3Rpb24gdGwoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4gYnwwfWZ1bmN0aW9uIHVsKGIsYyxkLGUpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2I9aTtpZigoY3wwKT09KGR8MCkpe2Q9Y31lbHNle3doaWxlKDEpe2FbZT4+MF09YVtjPj4wXXwwO2M9YysxfDA7aWYoKGN8MCk9PShkfDApKXticmVha31lbHNle2U9ZSsxfDB9fX1pPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB2bChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuKGI8PDI0Pj4yND4tMT9iOmMpfDB9ZnVuY3Rpb24gd2woYixjLGQsZSxmKXtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wO2I9aTtpZigoY3wwKT09KGR8MCkpe2k9YjtyZXR1cm4gY3wwfXdoaWxlKDEpe2c9YVtjPj4wXXwwO2FbZj4+MF09Zzw8MjQ+PjI0Pi0xP2c6ZTtjPWMrMXwwO2lmKChjfDApPT0oZHwwKSl7YnJlYWt9ZWxzZXtmPWYrMXwwfX1pPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB4bChhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiB5bChhLGIsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2NbZj4+Ml09ZDtjW2k+PjJdPWc7cmV0dXJuIDN9ZnVuY3Rpb24gemwoYSxiLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtjW2Y+PjJdPWQ7Y1tpPj4yXT1nO3JldHVybiAzfWZ1bmN0aW9uIEFsKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Y1tmPj4yXT1kO3JldHVybiAzfWZ1bmN0aW9uIEJsKGEpe2E9YXwwO3JldHVybiAxfWZ1bmN0aW9uIENsKGEpe2E9YXwwO3JldHVybiAxfWZ1bmN0aW9uIERsKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Yj1kLWN8MDtyZXR1cm4oYj4+PjA8ZT4+PjA/YjplKXwwfWZ1bmN0aW9uIEVsKGEpe2E9YXwwO3JldHVybiAxfWZ1bmN0aW9uIEZsKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1NrKGEpO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEdsKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTA7ZD1pO2k9aSsyNzJ8MDtsPWQrMjY0fDA7bj1kKzh8MDtvPWQ7YTpkb3tpZigoZXwwKSE9KGZ8MCkpe3E9ZTt3aGlsZSgxKXtpZigoY1txPj4yXXwwKT09MCl7YnJlYWt9cT1xKzR8MDtpZigocXwwKT09KGZ8MCkpe3E9ZjticmVha319Y1trPj4yXT1oO2NbZz4+Ml09ZTtpZigoaHwwKSE9KGp8MCkpe3A9ajtiPWIrOHwwO3doaWxlKDEpe3c9cS1lPj4yO3M9aWIoY1tiPj4yXXwwKXwwO3k9Y1tnPj4yXXwwO3I9KGh8MCkhPTA7dj1yP3AtaHwwOjI1Njt1PXI/aDpuO2I6ZG97aWYoKHl8MCk9PTB8KHZ8MCk9PTApe3Q9MH1lbHNle3Q9MDtkb3t4PXc+Pj4wPj12Pj4+MDtpZighKHh8dz4+PjA+MzIpKXticmVhayBifXg9eD92Onc7dz13LXh8MDtjOmRve2lmKCh1fDApPT0wKXtBPWNbeT4+Ml18MDtpZigoQXwwKT09MCl7ej0wfWVsc2V7ej0wO3g9eTt3aGlsZSgxKXtpZihBPj4+MD4xMjcpe0E9V20obCxBKXwwO2lmKChBfDApPT0tMSl7dj0wO3Q9LTE7YnJlYWsgYn19ZWxzZXtBPTF9ej1BK3p8MDt4PXgrNHwwO0E9Y1t4Pj4yXXwwO2lmKChBfDApPT0wKXttPTMyO2JyZWFrfX19fWVsc2V7ZDpkb3tpZih4Pj4+MD4zKXt6PXU7QT14O3doaWxlKDEpe0I9Y1t5Pj4yXXwwO2lmKChCfDApPT0wKXttPTIyO2JyZWFrIGR9aWYoQj4+PjA+MTI3KXtCPVdtKHosQil8MDtpZigoQnwwKT09LTEpe3Y9MDt0PS0xO2JyZWFrIGJ9ej16K0J8MDtBPUEtQnwwfWVsc2V7YVt6Pj4wXT1CO3o9eisxfDA7QT1BKyAtMXwwfXk9eSs0fDA7aWYoIShBPj4+MD4zKSl7bT0xNjticmVha319fWVsc2V7ej11O0E9eDttPTE2fX13aGlsZSgwKTtpZigobXwwKT09MTYpe209MDtpZigoQXwwKT09MCl7QT0wfWVsc2V7bT0yMn19ZTpkb3tpZigobXwwKT09MjIpe3doaWxlKDEpe209MDtCPWNbeT4+Ml18MDtpZigoQnwwKT09MCl7bT0zMDticmVha31pZihCPj4+MD4xMjcpe0I9V20obCxCKXwwO2lmKChCfDApPT0tMSl7dj0wO3Q9LTE7YnJlYWsgYn1pZihCPj4+MD5BPj4+MCl7bT0yNjticmVha31XbSh6LGNbeT4+Ml18MCl8MDt6PXorQnwwO0E9QS1CfDB9ZWxzZXthW3o+PjBdPUI7ej16KzF8MDtBPUErIC0xfDB9aWYoKEF8MCk9PTApe0E9MDticmVhayBlfWVsc2V7eT15KzR8MDttPTIyfX1pZigobXwwKT09MjYpe3o9eC1BfDA7bT0zMjticmVhayBjfWVsc2UgaWYoKG18MCk9PTMwKXthW3o+PjBdPTA7YnJlYWt9fX13aGlsZSgwKTt6PXgtQXwwO3k9MDttPTMyfX13aGlsZSgwKTtpZigobXwwKT09MzIpe209MDtpZigoenwwKT09LTEpe3Y9MDt0PS0xO2JyZWFrIGJ9fWlmKCh1fDApPT0obnwwKSl7dT1ufWVsc2V7dj12LXp8MDt1PXUrenwwfXQ9eit0fDB9d2hpbGUoISgoeXwwKT09MHwodnwwKT09MCkpfX13aGlsZSgwKTtmOmRve2lmKCh5fDApIT0wPyEoKHZ8MCk9PTB8KHd8MCk9PTApOjApe3doaWxlKDEpe3g9V20odSxjW3k+PjJdfDApfDA7aWYoKHgrMXwwKT4+PjA8Mil7YnJlYWt9eT15KzR8MDt3PXcrIC0xfDA7dD10KzF8MDtpZigodnwwKT09KHh8MCl8KHd8MCk9PTApe2JyZWFrIGZ9ZWxzZXt2PXYteHwwO3U9dSt4fDB9fUI9KHh8MCk9PTA7dD1CP3Q6LTE7eT1CPzA6eX19d2hpbGUoMCk7aWYocil7Y1tnPj4yXT15fWlmKChzfDApIT0wKXtpYihzfDApfDB9aWYoKHR8MCk9PTApe2c9MTttPTY3O2JyZWFrfWVsc2UgaWYoKHR8MCk9PS0xKXttPTQ2O2JyZWFrfWg9KGNbaz4+Ml18MCkrdHwwO2Nbaz4+Ml09aDtpZigoaHwwKT09KGp8MCkpe209NjU7YnJlYWt9aWYoKHF8MCk9PShmfDApKXtlPWNbZz4+Ml18MDtxPWZ9ZWxzZXtlPWliKGNbYj4+Ml18MCl8MDthW28+PjBdPTA7aWYoKGV8MCkhPTApe2liKGV8MCl8MH1oPWNbaz4+Ml18MDtpZigoaHwwKT09KGp8MCkpe2c9MTttPTY3O2JyZWFrfWVsc2V7ZT0wO3E9MDtyPW99d2hpbGUoMSl7Y1trPj4yXT1oKzE7YVtoPj4wXT1lO2lmKChxfDApPT0wKXticmVha31CPXIrMXwwO2g9Y1trPj4yXXwwO2U9YVtCPj4wXXwwO3E9cSsgLTF8MDtyPUJ9ZT0oY1tnPj4yXXwwKSs0fDA7Y1tnPj4yXT1lO2c6ZG97aWYoKGV8MCk9PShmfDApKXtxPWZ9ZWxzZXtxPWU7d2hpbGUoMSl7aWYoKGNbcT4+Ml18MCk9PTApe2JyZWFrIGd9cT1xKzR8MDtpZigocXwwKT09KGZ8MCkpe3E9ZjticmVha319fX13aGlsZSgwKTtoPWNbaz4+Ml18MH1pZigoZXwwKT09KGZ8MCl8KGh8MCk9PShqfDApKXticmVhayBhfX1pZigobXwwKT09NDYpe2Nbaz4+Ml09aDtoOmRve2lmKChlfDApIT0oY1tnPj4yXXwwKSl7ZG97aj1jW2U+PjJdfDA7Zj1pYihjW2I+PjJdfDApfDA7aj1XbShoLGopfDA7aWYoKGZ8MCkhPTApe2liKGZ8MCl8MH1pZigoanwwKT09LTEpe2JyZWFrIGh9aD0oY1trPj4yXXwwKStqfDA7Y1trPj4yXT1oO2U9ZSs0fDB9d2hpbGUoKGV8MCkhPShjW2c+PjJdfDApKX19d2hpbGUoMCk7Y1tnPj4yXT1lO0I9MjtpPWQ7cmV0dXJuIEJ8MH1lbHNlIGlmKChtfDApPT02NSl7ZT1jW2c+PjJdfDA7YnJlYWt9ZWxzZSBpZigobXwwKT09Njcpe2k9ZDtyZXR1cm4gZ3wwfX19ZWxzZXtjW2s+PjJdPWg7Y1tnPj4yXT1lfX13aGlsZSgwKTtCPShlfDApIT0oZnwwKSYxO2k9ZDtyZXR1cm4gQnwwfWZ1bmN0aW9uIEhsKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MDtsPWk7aT1pKzEwNDB8MDtuPWwrMTZ8MDtvPWwrOHwwO209bDthOmRve2lmKChlfDApIT0oZnwwKSl7cj1lO3doaWxlKDEpe2lmKChhW3I+PjBdfDApPT0wKXticmVha31yPXIrMXwwO2lmKChyfDApPT0oZnwwKSl7cj1mO2JyZWFrfX1jW2s+PjJdPWg7Y1tnPj4yXT1lO2lmKChofDApIT0oanwwKSl7cD1qO2I9Yis4fDA7d2hpbGUoMSl7dD1kO3U9Y1t0KzQ+PjJdfDA7cT1tO2NbcT4+Ml09Y1t0Pj4yXTtjW3ErND4+Ml09dTtxPXI7dT1xLWV8MDt0PWliKGNbYj4+Ml18MCl8MDt5PWNbZz4+Ml18MDtjW28+PjJdPXk7cz0oaHwwKSE9MDt3PXM/cC1oPj4yOjI1Njt4PXM/aDpuO2I6ZG97aWYoKHl8MCk9PTB8KHd8MCk9PTApe3Y9MH1lbHNle3Y9MDt3aGlsZSgxKXt6PXU+Pj4yO0E9ej4+PjA+PXc+Pj4wO2lmKCEoQXx1Pj4+MD4xMzEpKXticmVhayBifXk9QT93Ono7dT11LXl8MDt5PVZtKHgsbyx5LGQpfDA7aWYoKHl8MCk9PS0xKXticmVha31pZigoeHwwKT09KG58MCkpe3g9bn1lbHNle3c9dy15fDA7eD14Kyh5PDwyKXwwfXY9eSt2fDA7eT1jW28+PjJdfDA7aWYoKHl8MCk9PTB8KHd8MCk9PTApe2JyZWFrIGJ9fXc9MDt5PWNbbz4+Ml18MDt2PS0xfX13aGlsZSgwKTtjOmRve2lmKCh5fDApIT0wKXtpZighKCh3fDApPT0wfCh1fDApPT0wKSl7d2hpbGUoMSl7ej1VbSh4LHksdSxkKXwwO2lmKCh6KzJ8MCk+Pj4wPDMpe2JyZWFrfXk9eSt6fDA7Y1tvPj4yXT15O3c9dysgLTF8MDt2PXYrMXwwO2lmKCh3fDApPT0wfCh1fDApPT0oenwwKSl7YnJlYWsgY31lbHNle3U9dS16fDA7eD14KzR8MH19aWYoKHp8MCk9PS0xKXt2PS0xO2JyZWFrfWVsc2UgaWYoKHp8MCk9PTApe2Nbbz4+Ml09MDt5PTA7YnJlYWt9ZWxzZXtjW2Q+PjJdPTA7YnJlYWt9fX1lbHNle3k9MH19d2hpbGUoMCk7aWYocyl7Y1tnPj4yXT15fWlmKCh0fDApIT0wKXtpYih0fDApfDB9aWYoKHZ8MCk9PTApe2Y9MjtkPTQ4O2JyZWFrfWVsc2UgaWYoKHZ8MCk9PS0xKXtkPTI2O2JyZWFrfWg9KGNbaz4+Ml18MCkrKHY8PDIpfDA7Y1trPj4yXT1oO2lmKChofDApPT0oanwwKSl7ZD00NjticmVha31lPWNbZz4+Ml18MDtpZigocnwwKT09KGZ8MCkpe3I9Zn1lbHNle3E9aWIoY1tiPj4yXXwwKXwwO2U9VW0oaCxlLDEsZCl8MDtpZigocXwwKSE9MCl7aWIocXwwKXwwfWlmKChlfDApIT0wKXtmPTI7ZD00ODticmVha31jW2s+PjJdPShjW2s+PjJdfDApKzQ7ZT0oY1tnPj4yXXwwKSsxfDA7Y1tnPj4yXT1lO2Q6ZG97aWYoKGV8MCk9PShmfDApKXtyPWZ9ZWxzZXtyPWU7d2hpbGUoMSl7aWYoKGFbcj4+MF18MCk9PTApe2JyZWFrIGR9cj1yKzF8MDtpZigocnwwKT09KGZ8MCkpe3I9ZjticmVha319fX13aGlsZSgwKTtoPWNbaz4+Ml18MH1pZigoZXwwKT09KGZ8MCl8KGh8MCk9PShqfDApKXticmVhayBhfX1pZigoZHwwKT09MjYpe2Nbaz4+Ml09aDtlOmRve2lmKChlfDApIT0oY1tnPj4yXXwwKSl7d2hpbGUoMSl7ZD1pYihjW2I+PjJdfDApfDA7bj1VbShoLGUscS1lfDAsbSl8MDtpZigoZHwwKSE9MCl7aWIoZHwwKXwwfWlmKChufDApPT0tMSl7ZD0zMTticmVha31lbHNlIGlmKChufDApPT0tMil7ZD0zMjticmVha31lbHNlIGlmKChufDApPT0wKXtlPWUrMXwwfWVsc2V7ZT1lK258MH1oPShjW2s+PjJdfDApKzR8MDtjW2s+PjJdPWg7aWYoKGV8MCk9PShjW2c+PjJdfDApKXticmVhayBlfX1pZigoZHwwKT09MzEpe2NbZz4+Ml09ZTtBPTI7aT1sO3JldHVybiBBfDB9ZWxzZSBpZigoZHwwKT09MzIpe2NbZz4+Ml09ZTtBPTE7aT1sO3JldHVybiBBfDB9fX13aGlsZSgwKTtjW2c+PjJdPWU7QT0oZXwwKSE9KGZ8MCkmMTtpPWw7cmV0dXJuIEF8MH1lbHNlIGlmKChkfDApPT00Nil7ZT1jW2c+PjJdfDA7YnJlYWt9ZWxzZSBpZigoZHwwKT09NDgpe2k9bDtyZXR1cm4gZnwwfX19ZWxzZXtjW2s+PjJdPWg7Y1tnPj4yXT1lfX13aGlsZSgwKTtBPShlfDApIT0oZnwwKSYxO2k9bDtyZXR1cm4gQXwwfWZ1bmN0aW9uIElsKGEsYixkLGUsZil7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Yj1pO2NbZj4+Ml09ZDthPWliKGNbYSs4Pj4yXXwwKXwwO2lmKChhfDApPT0wKXtpPWI7cmV0dXJuIDB9aWIoYXwwKXwwO2k9YjtyZXR1cm4gMH1mdW5jdGlvbiBKbChhKXthPWF8MDt2YXIgYj0wLGQ9MDtiPWk7YT1hKzh8MDtkPWliKGNbYT4+Ml18MCl8MDtpZigoZHwwKSE9MCl7aWIoZHwwKXwwfWE9Y1thPj4yXXwwO2lmKChhfDApIT0wKXthPWliKGF8MCl8MDtpZigoYXwwKT09MCl7YT0wfWVsc2V7aWIoYXwwKXwwO2E9MH19ZWxzZXthPTF9aT1iO3JldHVybiBhfDB9ZnVuY3Rpb24gS2woYSl7YT1hfDA7cmV0dXJuIDB9ZnVuY3Rpb24gTGwoYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7Zz1pO2lmKChmfDApPT0wfChkfDApPT0oZXwwKSl7bT0wO2k9ZztyZXR1cm4gbXwwfWg9ZTthPWErOHwwO2I9KGJ8MCkhPTA/YjoyMTI4MDtrPTA7aj0wO3doaWxlKDEpe209aWIoY1thPj4yXXwwKXwwO2w9VW0oMCxkLGgtZHwwLGIpfDA7aWYoKG18MCkhPTApe2liKG18MCl8MH1pZigobHwwKT09MCl7ZD1kKzF8MDtsPTF9ZWxzZSBpZigobHwwKT09LTJ8KGx8MCk9PS0xKXtmPTk7YnJlYWt9ZWxzZXtkPWQrbHwwfWs9bCtrfDA7aj1qKzF8MDtpZihqPj4+MD49Zj4+PjB8KGR8MCk9PShlfDApKXtmPTk7YnJlYWt9fWlmKChmfDApPT05KXtpPWc7cmV0dXJuIGt8MH1yZXR1cm4gMH1mdW5jdGlvbiBNbChhKXthPWF8MDt2YXIgYj0wO2I9aTthPWNbYSs4Pj4yXXwwO2lmKChhfDApIT0wKXthPWliKGF8MCl8MDtpZigoYXwwKT09MCl7YT00fWVsc2V7aWIoYXwwKXwwO2E9NH19ZWxzZXthPTF9aT1iO3JldHVybiBhfDB9ZnVuY3Rpb24gTmwoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gT2woZCxmLGcsaCxqLGssbCxtKXtkPWR8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDt2YXIgbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7Zj1pO2Q9aDthOmRve2lmKGc+Pj4wPGg+Pj4wKXtvPWc7bj1rO3doaWxlKDEpe3E9YltvPj4xXXwwO3A9cSY2NTUzNTtkb3tpZigocSY2NTUzNSk8MTI4KXtpZigobC1ufDApPDEpe2g9MTticmVhayBhfWFbbj4+MF09cTtuPW4rMXwwfWVsc2V7aWYoKHEmNjU1MzUpPDIwNDgpe2lmKChsLW58MCk8Mil7aD0xO2JyZWFrIGF9YVtuPj4wXT1wPj4+NnwxOTI7YVtuKzE+PjBdPXAmNjN8MTI4O249bisyfDA7YnJlYWt9aWYoKHEmNjU1MzUpPDU1Mjk2KXtpZigobC1ufDApPDMpe2g9MTticmVhayBhfWFbbj4+MF09cD4+PjEyfDIyNDthW24rMT4+MF09cD4+PjYmNjN8MTI4O2FbbisyPj4wXT1wJjYzfDEyODtuPW4rM3wwO2JyZWFrfWlmKCEoKHEmNjU1MzUpPDU2MzIwKSl7aWYoKHEmNjU1MzUpPDU3MzQ0KXtoPTI7YnJlYWsgYX1pZigobC1ufDApPDMpe2g9MTticmVhayBhfWFbbj4+MF09cD4+PjEyfDIyNDthW24rMT4+MF09cD4+PjYmNjN8MTI4O2FbbisyPj4wXT1wJjYzfDEyODtuPW4rM3wwO2JyZWFrfWlmKChkLW98MCk8NCl7aD0xO2JyZWFrIGF9cT1vKzJ8MDtyPWVbcT4+MV18MDtpZigociY2NDUxMnwwKSE9NTYzMjApe2g9MjticmVhayBhfWlmKChsLW58MCk8NCl7aD0xO2JyZWFrIGF9cz1wJjk2MDtpZigoKHM8PDEwKSs2NTUzNnwwKT4+PjA+MTExNDExMSl7aD0yO2JyZWFrIGF9bz0ocz4+PjYpKzF8MDthW24+PjBdPW8+Pj4yfDI0MDthW24rMT4+MF09cD4+PjImMTV8bzw8NCY0OHwxMjg7YVtuKzI+PjBdPXA8PDQmNDh8cj4+PjYmMTV8MTI4O2FbbiszPj4wXT1yJjYzfDEyODtvPXE7bj1uKzR8MH19d2hpbGUoMCk7bz1vKzJ8MDtpZighKG8+Pj4wPGg+Pj4wKSl7aD0wO2JyZWFrfX19ZWxzZXtoPTA7bz1nO249a319d2hpbGUoMCk7Y1tqPj4yXT1nKyhvLWc+PjE8PDEpO2NbbT4+Ml09aysobi1rKTtpPWY7cmV0dXJuIGh8MH1mdW5jdGlvbiBQbChlLGYsZyxoLGosayxsLG0pe2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO2w9bHwwO209bXwwO3ZhciBuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wO2Y9aTthOmRve2lmKGc+Pj4wPGg+Pj4wKXtvPWg7cD1sO3E9ZztlPWs7d2hpbGUoMSl7aWYoIShlPj4+MDxsPj4+MCkpe249MzE7YnJlYWsgYX1zPWFbcT4+MF18MDtyPXMmMjU1O2Rve2lmKHM8PDI0Pj4yND4tMSl7YltlPj4xXT1zJjI1NTtxPXErMXwwfWVsc2V7aWYoKHMmMjU1KTwxOTQpe2g9MjticmVhayBhfWlmKChzJjI1NSk8MjI0KXtpZigoby1xfDApPDIpe2g9MTticmVhayBhfXM9ZFtxKzE+PjBdfDA7aWYoKHMmMTkyfDApIT0xMjgpe2g9MjticmVhayBhfWJbZT4+MV09cyY2M3xyPDw2JjE5ODQ7cT1xKzJ8MDticmVha31pZigocyYyNTUpPDI0MCl7aWYoKG8tcXwwKTwzKXtoPTE7YnJlYWsgYX1zPWFbcSsxPj4wXXwwO3Q9YVtxKzI+PjBdfDA7aWYoKHJ8MCk9PTIzNyl7aWYoISgocyYtMzIpPDwyND4+MjQ9PS0xMjgpKXtoPTI7YnJlYWsgYX19ZWxzZSBpZigocnwwKT09MjI0KXtpZighKChzJi0zMik8PDI0Pj4yND09LTk2KSl7aD0yO2JyZWFrIGF9fWVsc2V7aWYoISgocyYtNjQpPDwyND4+MjQ9PS0xMjgpKXtoPTI7YnJlYWsgYX19dD10JjI1NTtpZigodCYxOTJ8MCkhPTEyOCl7aD0yO2JyZWFrIGF9YltlPj4xXT0ocyYyNTUpPDw2JjQwMzJ8cjw8MTJ8dCY2MztxPXErM3wwO2JyZWFrfWlmKCEoKHMmMjU1KTwyNDUpKXtoPTI7YnJlYWsgYX1pZigoby1xfDApPDQpe2g9MTticmVhayBhfXM9YVtxKzE+PjBdfDA7dD1hW3ErMj4+MF18MDt1PWFbcSszPj4wXXwwO2lmKChyfDApPT0yNDApe2lmKCEoKHMrMTEyPDwyND4+MjQmMjU1KTw0OCkpe2g9MjticmVhayBhfX1lbHNlIGlmKChyfDApPT0yNDQpe2lmKCEoKHMmLTE2KTw8MjQ+PjI0PT0tMTI4KSl7aD0yO2JyZWFrIGF9fWVsc2V7aWYoISgocyYtNjQpPDwyND4+MjQ9PS0xMjgpKXtoPTI7YnJlYWsgYX19dD10JjI1NTtpZigodCYxOTJ8MCkhPTEyOCl7aD0yO2JyZWFrIGF9dT11JjI1NTtpZigodSYxOTJ8MCkhPTEyOCl7aD0yO2JyZWFrIGF9aWYoKHAtZXwwKTw0KXtoPTE7YnJlYWsgYX1yPXImNztzPXMmMjU1O2lmKChzPDwxMiYxOTY2MDh8cjw8MTgpPj4+MD4xMTE0MTExKXtoPTI7YnJlYWsgYX1iW2U+PjFdPXM8PDImNjB8dD4+PjQmM3woKHM+Pj40JjN8cjw8Mik8PDYpKzE2MzIwfDU1Mjk2O2U9ZSsyfDA7YltlPj4xXT11JjYzfHQ8PDYmOTYwfDU2MzIwO3E9cSs0fDB9fXdoaWxlKDApO2U9ZSsyfDA7aWYoIShxPj4+MDxoPj4+MCkpe249MzE7YnJlYWt9fX1lbHNle3E9ZztlPWs7bj0zMX19d2hpbGUoMCk7aWYoKG58MCk9PTMxKXtoPXE+Pj4wPGg+Pj4wJjF9Y1tqPj4yXT1nKyhxLWcpO2NbbT4+Ml09aysoZS1rPj4xPDwxKTtpPWY7cmV0dXJuIGh8MH1mdW5jdGlvbiBRbChhLGIsZCxlLGYpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2NbZj4+Ml09ZDtyZXR1cm4gM31mdW5jdGlvbiBSbChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBTbChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBUbChiLGMsZCxlLGYpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Yz1pO2E6ZG97aWYoZD4+PjA8ZT4+PjAmKGZ8MCkhPTApe2I9ZTtoPWQ7Zz0wO2I6d2hpbGUoMSl7az1hW2g+PjBdfDA7aj1rJjI1NTtkb3tpZihrPDwyND4+MjQ+LTEpe2g9aCsxfDB9ZWxzZXtpZigoayYyNTUpPDE5NCl7YnJlYWsgYX1pZigoayYyNTUpPDIyNCl7aWYoKGItaHwwKTwyKXticmVhayBhfWlmKCEoKGFbaCsxPj4wXSYtNjQpPDwyND4+MjQ9PS0xMjgpKXticmVhayBhfWg9aCsyfDA7YnJlYWt9aWYoKGsmMjU1KTwyNDApe2s9aDtpZigoYi1rfDApPDMpe2JyZWFrIGF9bT1hW2grMT4+MF18MDtsPWFbaCsyPj4wXXwwO2lmKChqfDApPT0yMjQpe2lmKCEoKG0mLTMyKTw8MjQ+PjI0PT0tOTYpKXtlPTE0O2JyZWFrIGJ9fWVsc2UgaWYoKGp8MCk9PTIzNyl7aWYoISgobSYtMzIpPDwyND4+MjQ9PS0xMjgpKXtlPTE2O2JyZWFrIGJ9fWVsc2V7aWYoISgobSYtNjQpPDwyND4+MjQ9PS0xMjgpKXtlPTE4O2JyZWFrIGJ9fWlmKCEoKGwmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7YnJlYWsgYX1oPWgrM3wwO2JyZWFrfWlmKCEoKGsmMjU1KTwyNDUpKXticmVhayBhfWs9aDtpZigoYi1rfDApPDQpe2JyZWFrIGF9aWYoKGYtZ3wwKT4+PjA8Mil7YnJlYWsgYX1uPWFbaCsxPj4wXXwwO2w9YVtoKzI+PjBdfDA7bT1hW2grMz4+MF18MDtpZigoanwwKT09MjQ0KXtpZighKChuJi0xNik8PDI0Pj4yND09LTEyOCkpe2U9Mjg7YnJlYWsgYn19ZWxzZSBpZigoanwwKT09MjQwKXtpZighKChuKzExMjw8MjQ+PjI0JjI1NSk8NDgpKXtlPTI2O2JyZWFrIGJ9fWVsc2V7aWYoISgobiYtNjQpPDwyND4+MjQ9PS0xMjgpKXtlPTMwO2JyZWFrIGJ9fWlmKCEoKGwmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7YnJlYWsgYX1pZighKChtJi02NCk8PDI0Pj4yND09LTEyOCkpe2JyZWFrIGF9aWYoKChuJjI1NSk8PDEyJjE5NjYwOHxqPDwxOCYxODM1MDA4KT4+PjA+MTExNDExMSl7YnJlYWsgYX1oPWgrNHwwO2c9ZysxfDB9fXdoaWxlKDApO2c9ZysxfDA7aWYoIShoPj4+MDxlPj4+MCZnPj4+MDxmPj4+MCkpe2JyZWFrIGF9fWlmKChlfDApPT0xNCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0xNil7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0xOCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0yNil7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0yOCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH1lbHNlIGlmKChlfDApPT0zMCl7bj1rLWR8MDtpPWM7cmV0dXJuIG58MH19ZWxzZXtoPWR9fXdoaWxlKDApO249aC1kfDA7aT1jO3JldHVybiBufDB9ZnVuY3Rpb24gVWwoYSl7YT1hfDA7cmV0dXJuIDR9ZnVuY3Rpb24gVmwoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gV2woYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTA7ZD1pO2E6ZG97aWYoZT4+PjA8Zj4+PjApe2I9ZTtsPWg7d2hpbGUoMSl7bT1jW2I+PjJdfDA7aWYoKG0mLTIwNDh8MCk9PTU1Mjk2fG0+Pj4wPjExMTQxMTEpe2Y9MjticmVhayBhfWRve2lmKCEobT4+PjA8MTI4KSl7aWYobT4+PjA8MjA0OCl7aWYoKGotbHwwKTwyKXtmPTE7YnJlYWsgYX1hW2w+PjBdPW0+Pj42fDE5MjthW2wrMT4+MF09bSY2M3wxMjg7bD1sKzJ8MDticmVha31uPWotbHwwO2lmKG0+Pj4wPDY1NTM2KXtpZigobnwwKTwzKXtmPTE7YnJlYWsgYX1hW2w+PjBdPW0+Pj4xMnwyMjQ7YVtsKzE+PjBdPW0+Pj42JjYzfDEyODthW2wrMj4+MF09bSY2M3wxMjg7bD1sKzN8MDticmVha31lbHNle2lmKChufDApPDQpe2Y9MTticmVhayBhfWFbbD4+MF09bT4+PjE4fDI0MDthW2wrMT4+MF09bT4+PjEyJjYzfDEyODthW2wrMj4+MF09bT4+PjYmNjN8MTI4O2FbbCszPj4wXT1tJjYzfDEyODtsPWwrNHwwO2JyZWFrfX1lbHNle2lmKChqLWx8MCk8MSl7Zj0xO2JyZWFrIGF9YVtsPj4wXT1tO2w9bCsxfDB9fXdoaWxlKDApO2I9Yis0fDA7aWYoIShiPj4+MDxmPj4+MCkpe2Y9MDticmVha319fWVsc2V7Zj0wO2I9ZTtsPWh9fXdoaWxlKDApO2NbZz4+Ml09ZSsoYi1lPj4yPDwyKTtjW2s+PjJdPWgrKGwtaCk7aT1kO3JldHVybiBmfDB9ZnVuY3Rpb24gWGwoYixlLGYsZyxoLGosayxsKXtiPWJ8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wO2U9aTthOmRve2lmKGY+Pj4wPGc+Pj4wKXtvPWc7bj1mO2I9ajt3aGlsZSgxKXtpZighKGI+Pj4wPGs+Pj4wKSl7bT0zMDticmVhayBhfXE9YVtuPj4wXXwwO3A9cSYyNTU7ZG97aWYocTw8MjQ+PjI0Pi0xKXtjW2I+PjJdPXA7bj1uKzF8MH1lbHNle2lmKChxJjI1NSk8MTk0KXtnPTI7YnJlYWsgYX1pZigocSYyNTUpPDIyNCl7aWYoKG8tbnwwKTwyKXtnPTE7YnJlYWsgYX1xPWRbbisxPj4wXXwwO2lmKChxJjE5MnwwKSE9MTI4KXtnPTI7YnJlYWsgYX1jW2I+PjJdPXEmNjN8cDw8NiYxOTg0O249bisyfDA7YnJlYWt9aWYoKHEmMjU1KTwyNDApe2lmKChvLW58MCk8Myl7Zz0xO2JyZWFrIGF9cT1hW24rMT4+MF18MDtyPWFbbisyPj4wXXwwO2lmKChwfDApPT0yMjQpe2lmKCEoKHEmLTMyKTw8MjQ+PjI0PT0tOTYpKXtnPTI7YnJlYWsgYX19ZWxzZSBpZigocHwwKT09MjM3KXtpZighKChxJi0zMik8PDI0Pj4yND09LTEyOCkpe2c9MjticmVhayBhfX1lbHNle2lmKCEoKHEmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7Zz0yO2JyZWFrIGF9fXI9ciYyNTU7aWYoKHImMTkyfDApIT0xMjgpe2c9MjticmVhayBhfWNbYj4+Ml09KHEmMjU1KTw8NiY0MDMyfHA8PDEyJjYxNDQwfHImNjM7bj1uKzN8MDticmVha31pZighKChxJjI1NSk8MjQ1KSl7Zz0yO2JyZWFrIGF9aWYoKG8tbnwwKTw0KXtnPTE7YnJlYWsgYX1xPWFbbisxPj4wXXwwO3I9YVtuKzI+PjBdfDA7cz1hW24rMz4+MF18MDtpZigocHwwKT09MjQ0KXtpZighKChxJi0xNik8PDI0Pj4yND09LTEyOCkpe2c9MjticmVhayBhfX1lbHNlIGlmKChwfDApPT0yNDApe2lmKCEoKHErMTEyPDwyND4+MjQmMjU1KTw0OCkpe2c9MjticmVhayBhfX1lbHNle2lmKCEoKHEmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7Zz0yO2JyZWFrIGF9fXI9ciYyNTU7aWYoKHImMTkyfDApIT0xMjgpe2c9MjticmVhayBhfXM9cyYyNTU7aWYoKHMmMTkyfDApIT0xMjgpe2c9MjticmVhayBhfXA9KHEmMjU1KTw8MTImMjU4MDQ4fHA8PDE4JjE4MzUwMDh8cjw8NiY0MDMyfHMmNjM7aWYocD4+PjA+MTExNDExMSl7Zz0yO2JyZWFrIGF9Y1tiPj4yXT1wO249bis0fDB9fXdoaWxlKDApO2I9Yis0fDA7aWYoIShuPj4+MDxnPj4+MCkpe209MzA7YnJlYWt9fX1lbHNle249ZjtiPWo7bT0zMH19d2hpbGUoMCk7aWYoKG18MCk9PTMwKXtnPW4+Pj4wPGc+Pj4wJjF9Y1toPj4yXT1mKyhuLWYpO2NbbD4+Ml09aisoYi1qPj4yPDwyKTtpPWU7cmV0dXJuIGd8MH1mdW5jdGlvbiBZbChhLGIsZCxlLGYpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2NbZj4+Ml09ZDtyZXR1cm4gM31mdW5jdGlvbiBabChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBfbChhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiAkbChiLGMsZCxlLGYpe2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7Yz1pO2E6ZG97aWYoZD4+PjA8ZT4+PjAmKGZ8MCkhPTApe2c9ZTtqPWQ7Yj0xO2I6d2hpbGUoMSl7az1hW2o+PjBdfDA7aD1rJjI1NTtkb3tpZihrPDwyND4+MjQ+LTEpe2o9aisxfDB9ZWxzZXtpZigoayYyNTUpPDE5NCl7YnJlYWsgYX1pZigoayYyNTUpPDIyNCl7aWYoKGctanwwKTwyKXticmVhayBhfWlmKCEoKGFbaisxPj4wXSYtNjQpPDwyND4+MjQ9PS0xMjgpKXticmVhayBhfWo9aisyfDA7YnJlYWt9aWYoKGsmMjU1KTwyNDApe2s9ajtpZigoZy1rfDApPDMpe2JyZWFrIGF9bT1hW2orMT4+MF18MDtsPWFbaisyPj4wXXwwO2lmKChofDApPT0yMjQpe2lmKCEoKG0mLTMyKTw8MjQ+PjI0PT0tOTYpKXtlPTE0O2JyZWFrIGJ9fWVsc2UgaWYoKGh8MCk9PTIzNyl7aWYoISgobSYtMzIpPDwyND4+MjQ9PS0xMjgpKXtlPTE2O2JyZWFrIGJ9fWVsc2V7aWYoISgobSYtNjQpPDwyND4+MjQ9PS0xMjgpKXtlPTE4O2JyZWFrIGJ9fWlmKCEoKGwmLTY0KTw8MjQ+PjI0PT0tMTI4KSl7YnJlYWsgYX1qPWorM3wwO2JyZWFrfWlmKCEoKGsmMjU1KTwyNDUpKXticmVhayBhfWs9ajtpZigoZy1rfDApPDQpe2JyZWFrIGF9bT1hW2orMT4+MF18MDtuPWFbaisyPj4wXXwwO2w9YVtqKzM+PjBdfDA7aWYoKGh8MCk9PTI0MCl7aWYoISgobSsxMTI8PDI0Pj4yNCYyNTUpPDQ4KSl7ZT0yNTticmVhayBifX1lbHNlIGlmKChofDApPT0yNDQpe2lmKCEoKG0mLTE2KTw8MjQ+PjI0PT0tMTI4KSl7ZT0yNzticmVhayBifX1lbHNle2lmKCEoKG0mLTY0KTw8MjQ+PjI0PT0tMTI4KSl7ZT0yOTticmVhayBifX1pZighKChuJi02NCk8PDI0Pj4yND09LTEyOCkpe2JyZWFrIGF9aWYoISgobCYtNjQpPDwyND4+MjQ9PS0xMjgpKXticmVhayBhfWlmKCgobSYyNTUpPDwxMiYxOTY2MDh8aDw8MTgmMTgzNTAwOCk+Pj4wPjExMTQxMTEpe2JyZWFrIGF9aj1qKzR8MH19d2hpbGUoMCk7aWYoIShqPj4+MDxlPj4+MCZiPj4+MDxmPj4+MCkpe2JyZWFrIGF9Yj1iKzF8MH1pZigoZXwwKT09MTQpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09MTYpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09MTgpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09MjUpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09Mjcpe249ay1kfDA7aT1jO3JldHVybiBufDB9ZWxzZSBpZigoZXwwKT09Mjkpe249ay1kfDA7aT1jO3JldHVybiBufDB9fWVsc2V7aj1kfX13aGlsZSgwKTtuPWotZHwwO2k9YztyZXR1cm4gbnwwfWZ1bmN0aW9uIGFtKGEpe2E9YXwwO3JldHVybiA0fWZ1bmN0aW9uIGJtKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIGNtKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIGRtKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNjI0O2lmKCEoKGFbYisxMj4+MF0mMSk9PTApKXtlPWNbYisyMD4+Ml18MDtpZigoZXwwKSE9MCl7dm4oZSl9aWYoKGJ8MCk9PTApe2k9ZDtyZXR1cm59fXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2NbYj4+Ml09MTM2MjQ7aWYoISgoYVtiKzEyPj4wXSYxKT09MCk/KGU9Y1tiKzIwPj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pPWQ7cmV0dXJufWZ1bmN0aW9uIGZtKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNjY0O2lmKCEoKGFbYisxNj4+MF0mMSk9PTApKXtlPWNbYisyND4+Ml18MDtpZigoZXwwKSE9MCl7dm4oZSl9aWYoKGJ8MCk9PTApe2k9ZDtyZXR1cm59fXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZ20oYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2NbYj4+Ml09MTM2NjQ7aWYoISgoYVtiKzE2Pj4wXSYxKT09MCk/KGU9Y1tiKzI0Pj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pPWQ7cmV0dXJufWZ1bmN0aW9uIGhtKGIpe2I9YnwwO3JldHVybiBhW2IrOD4+MF18MH1mdW5jdGlvbiBpbShhKXthPWF8MDtyZXR1cm4gY1thKzg+PjJdfDB9ZnVuY3Rpb24gam0oYil7Yj1ifDA7cmV0dXJuIGFbYis5Pj4wXXwwfWZ1bmN0aW9uIGttKGEpe2E9YXwwO3JldHVybiBjW2ErMTI+PjJdfDB9ZnVuY3Rpb24gbG0oYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTA7ZT1pO2c9ZCsxMnwwO2lmKChhW2c+PjBdJjEpPT0wKXtjW2IrMD4+Ml09Y1tnKzA+PjJdO2NbYis0Pj4yXT1jW2crND4+Ml07Y1tiKzg+PjJdPWNbZys4Pj4yXTtpPWU7cmV0dXJufWc9Y1tkKzIwPj4yXXwwO2Q9Y1tkKzE2Pj4yXXwwO2lmKGQ+Pj4wPjQyOTQ5NjcyNzkpe2RnKCl9ZG97aWYoZD4+PjA8MTEpe2FbYj4+MF09ZDw8MTtrPWIrMXwwfWVsc2V7aD1kKzE2Ji0xNjtqPShofDApPT0wPzE6aDt3aGlsZSgxKXtrPXVuKGopfDA7aWYoKGt8MCkhPTApe2Y9MTM7YnJlYWt9az1jWzU2NjZdfDA7Y1s1NjY2XT1rKzA7aWYoKGt8MCk9PTApe2JyZWFrfXNjW2smMzFdKCl9aWYoKGZ8MCk9PTEzKXtjW2IrOD4+Ml09aztjW2I+PjJdPWh8MTtjW2IrND4+Ml09ZDticmVha31rPVhhKDQpfDA7Y1trPj4yXT0yMjY4MDt3YihrfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7TG4oa3wwLGd8MCxkfDApfDA7YVtrK2Q+PjBdPTA7aT1lO3JldHVybn1mdW5jdGlvbiBtbShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MDtlPWk7Zz1kKzE2fDA7aWYoKGFbZz4+MF0mMSk9PTApe2NbYiswPj4yXT1jW2crMD4+Ml07Y1tiKzQ+PjJdPWNbZys0Pj4yXTtjW2IrOD4+Ml09Y1tnKzg+PjJdO2k9ZTtyZXR1cm59Zz1jW2QrMjQ+PjJdfDA7ZD1jW2QrMjA+PjJdfDA7aWYoZD4+PjA+NDI5NDk2NzI3OSl7ZGcoKX1kb3tpZihkPj4+MDwxMSl7YVtiPj4wXT1kPDwxO2s9YisxfDB9ZWxzZXtoPWQrMTYmLTE2O2o9KGh8MCk9PTA/MTpoO3doaWxlKDEpe2s9dW4oail8MDtpZigoa3wwKSE9MCl7Zj0xMzticmVha31rPWNbNTY2Nl18MDtjWzU2NjZdPWsrMDtpZigoa3wwKT09MCl7YnJlYWt9c2NbayYzMV0oKX1pZigoZnwwKT09MTMpe2NbYis4Pj4yXT1rO2NbYj4+Ml09aHwxO2NbYis0Pj4yXT1kO2JyZWFrfWs9WGEoNCl8MDtjW2s+PjJdPTIyNjgwO3diKGt8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTtMbihrfDAsZ3wwLGR8MCl8MDthW2srZD4+MF09MDtpPWU7cmV0dXJufWZ1bmN0aW9uIG5tKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT04O2M9YisxfDA7YVtjPj4wXT0xNzAyMTk1ODI4O2FbYysxPj4wXT02NjQ5MjAyO2FbYysyPj4wXT0yNTk3MzthW2MrMz4+MF09MTAxO2FbYis1Pj4wXT0wO3JldHVybn1mdW5jdGlvbiBvbShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2Q9aTtlPTEzNjk2O3doaWxlKDEpe2lmKChjW2U+PjJdfDApPT0wKXticmVha31lbHNle2U9ZSs0fDB9fWc9ZS0xMzY5NnwwO2U9Zz4+MjtpZihlPj4+MD4xMDczNzQxODA3KXtkZygpfWRve2lmKGU+Pj4wPDIpe2FbYj4+MF09Zz4+PjE7aj1iKzR8MH1lbHNle2c9ZSs0Ji00O2g9Zzw8MjtoPShofDApPT0wPzE6aDt3aGlsZSgxKXtqPXVuKGgpfDA7aWYoKGp8MCkhPTApe2Y9MTM7YnJlYWt9aj1jWzU2NjZdfDA7Y1s1NjY2XT1qKzA7aWYoKGp8MCk9PTApe2JyZWFrfXNjW2omMzFdKCl9aWYoKGZ8MCk9PTEzKXtjW2IrOD4+Ml09ajtjW2I+PjJdPWd8MTtjW2IrND4+Ml09ZTticmVha31qPVhhKDQpfDA7Y1tqPj4yXT0yMjY4MDt3YihqfDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGV8MCk9PTApe2o9aisoZTw8Mil8MDtjW2o+PjJdPTA7aT1kO3JldHVybn1lbHNle2Y9ZTtnPTEzNjk2O2I9an13aGlsZSgxKXtmPWYrIC0xfDA7Y1tiPj4yXT1jW2c+PjJdO2lmKChmfDApPT0wKXticmVha31lbHNle2c9Zys0fDA7Yj1iKzR8MH19aj1qKyhlPDwyKXwwO2Nbaj4+Ml09MDtpPWQ7cmV0dXJufWZ1bmN0aW9uIHBtKGIsYyl7Yj1ifDA7Yz1jfDA7dmFyIGQ9MDtjPWk7YVtiPj4wXT0xMDtkPWIrMXwwO2FbZCswPj4wXT1hWzEzNzIwPj4wXXwwO2FbZCsxPj4wXT1hWzEzNzIxPj4wXXwwO2FbZCsyPj4wXT1hWzEzNzIyPj4wXXwwO2FbZCszPj4wXT1hWzEzNzIzPj4wXXwwO2FbZCs0Pj4wXT1hWzEzNzI0Pj4wXXwwO2FbYis2Pj4wXT0wO2k9YztyZXR1cm59ZnVuY3Rpb24gcW0oYixkKXtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MDtkPWk7ZT0xMzcyODt3aGlsZSgxKXtpZigoY1tlPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtlPWUrNHwwfX1nPWUtMTM3Mjh8MDtlPWc+PjI7aWYoZT4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihlPj4+MDwyKXthW2I+PjBdPWc+Pj4xO2o9Yis0fDB9ZWxzZXtnPWUrNCYtNDtoPWc8PDI7aD0oaHwwKT09MD8xOmg7d2hpbGUoMSl7aj11bihoKXwwO2lmKChqfDApIT0wKXtmPTEzO2JyZWFrfWo9Y1s1NjY2XXwwO2NbNTY2Nl09aiswO2lmKChqfDApPT0wKXticmVha31zY1tqJjMxXSgpfWlmKChmfDApPT0xMyl7Y1tiKzg+PjJdPWo7Y1tiPj4yXT1nfDE7Y1tiKzQ+PjJdPWU7YnJlYWt9aj1YYSg0KXwwO2Nbaj4+Ml09MjI2ODA7d2IoanwwLDIyNzI4LDIwNil9fXdoaWxlKDApO2lmKChlfDApPT0wKXtqPWorKGU8PDIpfDA7Y1tqPj4yXT0wO2k9ZDtyZXR1cm59ZWxzZXtmPWU7Zz0xMzcyODtiPWp9d2hpbGUoMSl7Zj1mKyAtMXwwO2NbYj4+Ml09Y1tnPj4yXTtpZigoZnwwKT09MCl7YnJlYWt9ZWxzZXtnPWcrNHwwO2I9Yis0fDB9fWo9aisoZTw8Mil8MDtjW2o+PjJdPTA7aT1kO3JldHVybn1mdW5jdGlvbiBybShiKXtiPWJ8MDt2YXIgZD0wO2I9aTtpZigoYVsxMzc2MF18MCkhPTApe2Q9Y1szNDM4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChRYSgxMzc2MCl8MCk9PTApe2Q9Y1szNDM4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChhWzIwOTI4XXwwKT09MD8oUWEoMjA5MjgpfDApIT0wOjApe05uKDIwNzYwLDAsMTY4KXwwO2NjKDIxNSwwLHB8MCl8MDskYSgyMDkyOCl9Z2coMjA3NjAsMjA5MzYpO2dnKDIwNzcyfDAsMjA5NDQpO2dnKDIwNzg0fDAsMjA5NTIpO2dnKDIwNzk2fDAsMjA5NjApO2dnKDIwODA4fDAsMjA5NzYpO2dnKDIwODIwfDAsMjA5OTIpO2dnKDIwODMyfDAsMjFlMyk7Z2coMjA4NDR8MCwyMTAxNik7Z2coMjA4NTZ8MCwyMTAyNCk7Z2coMjA4Njh8MCwyMTAzMik7Z2coMjA4ODB8MCwyMTA0MCk7Z2coMjA4OTJ8MCwyMTA0OCk7Z2coMjA5MDR8MCwyMTA1Nik7Z2coMjA5MTZ8MCwyMTA2NCk7Y1szNDM4XT0yMDc2MDskYSgxMzc2MCk7ZD1jWzM0MzhdfDA7aT1iO3JldHVybiBkfDB9ZnVuY3Rpb24gc20oYil7Yj1ifDA7dmFyIGQ9MDtiPWk7aWYoKGFbMTM3NzZdfDApIT0wKXtkPWNbMzQ0Ml18MDtpPWI7cmV0dXJuIGR8MH1pZigoUWEoMTM3NzYpfDApPT0wKXtkPWNbMzQ0Ml18MDtpPWI7cmV0dXJuIGR8MH1pZigoYVsyMDM5Ml18MCk9PTA/KFFhKDIwMzkyKXwwKSE9MDowKXtObigyMDIyNCwwLDE2OCl8MDtjYygyMTYsMCxwfDApfDA7JGEoMjAzOTIpfW5nKDIwMjI0LDIwNDAwKTtuZygyMDIzNnwwLDIwNDMyKTtuZygyMDI0OHwwLDIwNDY0KTtuZygyMDI2MHwwLDIwNDk2KTtuZygyMDI3MnwwLDIwNTM2KTtuZygyMDI4NHwwLDIwNTc2KTtuZygyMDI5NnwwLDIwNjA4KTtuZygyMDMwOHwwLDIwNjQ4KTtuZygyMDMyMHwwLDIwNjY0KTtuZygyMDMzMnwwLDIwNjgwKTtuZygyMDM0NHwwLDIwNjk2KTtuZygyMDM1NnwwLDIwNzEyKTtuZygyMDM2OHwwLDIwNzI4KTtuZygyMDM4MHwwLDIwNzQ0KTtjWzM0NDJdPTIwMjI0OyRhKDEzNzc2KTtkPWNbMzQ0Ml18MDtpPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB0bShiKXtiPWJ8MDt2YXIgZD0wO2I9aTtpZigoYVsxMzc5Ml18MCkhPTApe2Q9Y1szNDQ2XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChRYSgxMzc5Mil8MCk9PTApe2Q9Y1szNDQ2XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChhWzJlNF18MCk9PTA/KFFhKDJlNCl8MCkhPTA6MCl7Tm4oMTk3MTIsMCwyODgpfDA7Y2MoMjE3LDAscHwwKXwwOyRhKDJlNCl9Z2coMTk3MTIsMjAwMDgpO2dnKDE5NzI0fDAsMjAwMTYpO2dnKDE5NzM2fDAsMjAwMzIpO2dnKDE5NzQ4fDAsMjAwNDApO2dnKDE5NzYwfDAsMjAwNDgpO2dnKDE5NzcyfDAsMjAwNTYpO2dnKDE5Nzg0fDAsMjAwNjQpO2dnKDE5Nzk2fDAsMjAwNzIpO2dnKDE5ODA4fDAsMjAwODApO2dnKDE5ODIwfDAsMjAwOTYpO2dnKDE5ODMyfDAsMjAxMDQpO2dnKDE5ODQ0fDAsMjAxMjApO2dnKDE5ODU2fDAsMjAxMzYpO2dnKDE5ODY4fDAsMjAxNDQpO2dnKDE5ODgwfDAsMjAxNTIpO2dnKDE5ODkyfDAsMjAxNjApO2dnKDE5OTA0fDAsMjAwNDgpO2dnKDE5OTE2fDAsMjAxNjgpO2dnKDE5OTI4fDAsMjAxNzYpO2dnKDE5OTQwfDAsMjAxODQpO2dnKDE5OTUyfDAsMjAxOTIpO2dnKDE5OTY0fDAsMjAyMDApO2dnKDE5OTc2fDAsMjAyMDgpO2dnKDE5OTg4fDAsMjAyMTYpO2NbMzQ0Nl09MTk3MTI7JGEoMTM3OTIpO2Q9Y1szNDQ2XXwwO2k9YjtyZXR1cm4gZHwwfWZ1bmN0aW9uIHVtKGIpe2I9YnwwO3ZhciBkPTA7Yj1pO2lmKChhWzEzODA4XXwwKSE9MCl7ZD1jWzM0NTBdfDA7aT1iO3JldHVybiBkfDB9aWYoKFFhKDEzODA4KXwwKT09MCl7ZD1jWzM0NTBdfDA7aT1iO3JldHVybiBkfDB9aWYoKGFbMTkxNjBdfDApPT0wPyhRYSgxOTE2MCl8MCkhPTA6MCl7Tm4oMTg4NzIsMCwyODgpfDA7Y2MoMjE4LDAscHwwKXwwOyRhKDE5MTYwKX1uZygxODg3MiwxOTE2OCk7bmcoMTg4ODR8MCwxOTIwMCk7bmcoMTg4OTZ8MCwxOTI0MCk7bmcoMTg5MDh8MCwxOTI2NCk7bmcoMTg5MjB8MCwxOTU4NCk7bmcoMTg5MzJ8MCwxOTI4OCk7bmcoMTg5NDR8MCwxOTMxMik7bmcoMTg5NTZ8MCwxOTMzNik7bmcoMTg5Njh8MCwxOTM2OCk7bmcoMTg5ODB8MCwxOTQwOCk7bmcoMTg5OTJ8MCwxOTQ0MCk7bmcoMTkwMDR8MCwxOTQ4MCk7bmcoMTkwMTZ8MCwxOTUyMCk7bmcoMTkwMjh8MCwxOTUzNik7bmcoMTkwNDB8MCwxOTU1Mik7bmcoMTkwNTJ8MCwxOTU2OCk7bmcoMTkwNjR8MCwxOTU4NCk7bmcoMTkwNzZ8MCwxOTYwMCk7bmcoMTkwODh8MCwxOTYxNik7bmcoMTkxMDB8MCwxOTYzMik7bmcoMTkxMTJ8MCwxOTY0OCk7bmcoMTkxMjR8MCwxOTY2NCk7bmcoMTkxMzZ8MCwxOTY4MCk7bmcoMTkxNDh8MCwxOTY5Nik7Y1szNDUwXT0xODg3MjskYSgxMzgwOCk7ZD1jWzM0NTBdfDA7aT1iO3JldHVybiBkfDB9ZnVuY3Rpb24gdm0oYil7Yj1ifDA7dmFyIGQ9MDtiPWk7aWYoKGFbMTM4MjRdfDApIT0wKXtkPWNbMzQ1NF18MDtpPWI7cmV0dXJuIGR8MH1pZigoUWEoMTM4MjQpfDApPT0wKXtkPWNbMzQ1NF18MDtpPWI7cmV0dXJuIGR8MH1pZigoYVsxODg0OF18MCk9PTA/KFFhKDE4ODQ4KXwwKSE9MDowKXtObigxODU2MCwwLDI4OCl8MDtjYygyMTksMCxwfDApfDA7JGEoMTg4NDgpfWdnKDE4NTYwLDE4ODU2KTtnZygxODU3MnwwLDE4ODY0KTtjWzM0NTRdPTE4NTYwOyRhKDEzODI0KTtkPWNbMzQ1NF18MDtpPWI7cmV0dXJuIGR8MH1mdW5jdGlvbiB3bShiKXtiPWJ8MDt2YXIgZD0wO2I9aTtpZigoYVsxMzg0MF18MCkhPTApe2Q9Y1szNDU4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChRYSgxMzg0MCl8MCk9PTApe2Q9Y1szNDU4XXwwO2k9YjtyZXR1cm4gZHwwfWlmKChhWzE4NTIwXXwwKT09MD8oUWEoMTg1MjApfDApIT0wOjApe05uKDE4MjMyLDAsMjg4KXwwO2NjKDIyMCwwLHB8MCl8MDskYSgxODUyMCl9bmcoMTgyMzIsMTg1MjgpO25nKDE4MjQ0fDAsMTg1NDQpO2NbMzQ1OF09MTgyMzI7JGEoMTM4NDApO2Q9Y1szNDU4XXwwO2k9YjtyZXR1cm4gZHwwfWZ1bmN0aW9uIHhtKGIpe2I9YnwwO3ZhciBjPTAsZD0wO2I9aTtpZigoYVsxMzg2NF18MCkhPTApe2k9YjtyZXR1cm4gMTM4NDh9aWYoKFFhKDEzODY0KXwwKT09MCl7aT1iO3JldHVybiAxMzg0OH1hWzEzODQ4XT0xNjtjPTEzODQ5fDA7ZD1jO2FbZD4+MF09NjIzODY1MTI1O2FbZCsxPj4wXT0yNDM2OTczO2FbZCsyPj4wXT05NTE5O2FbZCszPj4wXT0zNztjPWMrNHwwO2FbYz4+MF09MjAzMjQ4MDEwMDthW2MrMT4+MF09NzkzOTM3NTthW2MrMj4+MF09MzEwMTM7YVtjKzM+PjBdPTEyMTthWzEzODU3Pj4wXT0wO2NjKDIyMSwxMzg0OCxwfDApfDA7JGEoMTM4NjQpO2k9YjtyZXR1cm4gMTM4NDh9ZnVuY3Rpb24geW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzEzODg4XXwwKSE9MCl7aT1iO3JldHVybiAxMzg3Mn1pZigoUWEoMTM4ODgpfDApPT0wKXtpPWI7cmV0dXJuIDEzODcyfWVsc2V7ZD0xMzg5Nn13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTM4OTZ8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzEzODcyXT1mPj4+MTtlPTEzODc2fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxMzg4MD4+Ml09aDtjWzM0NjhdPWZ8MTtjWzEzODc2Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTEzODk2O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDEzODcyLHB8MCl8MDskYSgxMzg4OCk7aT1iO3JldHVybiAxMzg3Mn1mdW5jdGlvbiB6bShiKXtiPWJ8MDt2YXIgYz0wLGQ9MDtiPWk7aWYoKGFbMTM5NTJdfDApIT0wKXtpPWI7cmV0dXJuIDEzOTM2fWlmKChRYSgxMzk1Mil8MCk9PTApe2k9YjtyZXR1cm4gMTM5MzZ9YVsxMzkzNl09MTY7Yz0xMzkzN3wwO2Q9YzthW2Q+PjBdPTYyNDU3NjU0OTthW2QrMT4+MF09MjQzOTc1MjthW2QrMj4+MF09OTUzMDthW2QrMz4+MF09Mzc7Yz1jKzR8MDthW2M+PjBdPTEzOTQ5NDg2ODU7YVtjKzE+PjBdPTU0NDkwMTg7YVtjKzI+PjBdPTIxMjg1O2FbYyszPj4wXT04MzthWzEzOTQ1Pj4wXT0wO2NjKDIyMSwxMzkzNixwfDApfDA7JGEoMTM5NTIpO2k9YjtyZXR1cm4gMTM5MzZ9ZnVuY3Rpb24gQW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzEzOTc2XXwwKSE9MCl7aT1iO3JldHVybiAxMzk2MH1pZigoUWEoMTM5NzYpfDApPT0wKXtpPWI7cmV0dXJuIDEzOTYwfWVsc2V7ZD0xMzk4NH13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTM5ODR8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzEzOTYwXT1mPj4+MTtlPTEzOTY0fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxMzk2OD4+Ml09aDtjWzM0OTBdPWZ8MTtjWzEzOTY0Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTEzOTg0O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDEzOTYwLHB8MCl8MDskYSgxMzk3Nik7aT1iO3JldHVybiAxMzk2MH1mdW5jdGlvbiBCbShiKXtiPWJ8MDtiPWk7aWYoKGFbMTQwNDBdfDApPT0wPyhRYSgxNDA0MCl8MCkhPTA6MCl7ZWcoMTQwMjQsMTQwNDgsMjApO2NjKDIyMSwxNDAyNCxwfDApfDA7JGEoMTQwNDApfWk9YjtyZXR1cm4gMTQwMjR9ZnVuY3Rpb24gQ20oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzE0MDg4XXwwKSE9MCl7aT1iO3JldHVybiAxNDA3Mn1pZigoUWEoMTQwODgpfDApPT0wKXtpPWI7cmV0dXJuIDE0MDcyfWVsc2V7ZD0xNDA5Nn13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTQwOTZ8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzE0MDcyXT1mPj4+MTtlPTE0MDc2fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxNDA4MD4+Ml09aDtjWzM1MThdPWZ8MTtjWzE0MDc2Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTE0MDk2O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDE0MDcyLHB8MCl8MDskYSgxNDA4OCk7aT1iO3JldHVybiAxNDA3Mn1mdW5jdGlvbiBEbShiKXtiPWJ8MDtiPWk7aWYoKGFbMTQyMDBdfDApPT0wPyhRYSgxNDIwMCl8MCkhPTA6MCl7ZWcoMTQxODQsMTQyMDgsMTEpO2NjKDIyMSwxNDE4NCxwfDApfDA7JGEoMTQyMDApfWk9YjtyZXR1cm4gMTQxODR9ZnVuY3Rpb24gRW0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTA7Yj1pO2lmKChhWzE0MjQwXXwwKSE9MCl7aT1iO3JldHVybiAxNDIyNH1pZigoUWEoMTQyNDApfDApPT0wKXtpPWI7cmV0dXJuIDE0MjI0fWVsc2V7ZD0xNDI0OH13aGlsZSgxKXtpZigoY1tkPj4yXXwwKT09MCl7YnJlYWt9ZWxzZXtkPWQrNHwwfX1mPWQtMTQyNDh8MDtkPWY+PjI7aWYoZD4+PjA+MTA3Mzc0MTgwNyl7ZGcoKX1kb3tpZihkPj4+MDwyKXthWzE0MjI0XT1mPj4+MTtlPTE0MjI4fDB9ZWxzZXtmPWQrNCYtNDtnPWY8PDI7Zz0oZ3wwKT09MD8xOmc7d2hpbGUoMSl7aD11bihnKXwwO2lmKChofDApIT0wKXtlPTE1O2JyZWFrfWg9Y1s1NjY2XXwwO2NbNTY2Nl09aCswO2lmKChofDApPT0wKXticmVha31zY1toJjMxXSgpfWlmKChlfDApPT0xNSl7Y1sxNDIzMj4+Ml09aDtjWzM1NTZdPWZ8MTtjWzE0MjI4Pj4yXT1kO2U9aDticmVha31oPVhhKDQpfDA7Y1toPj4yXT0yMjY4MDt3YihofDAsMjI3MjgsMjA2KX19d2hpbGUoMCk7aWYoKGR8MCkhPTApe2g9ZDtmPTE0MjQ4O2c9ZTt3aGlsZSgxKXtoPWgrIC0xfDA7Y1tnPj4yXT1jW2Y+PjJdO2lmKChofDApPT0wKXticmVha31lbHNle2Y9Zis0fDA7Zz1nKzR8MH19fWNbZSsoZDw8Mik+PjJdPTA7Y2MoMjIyLDE0MjI0LHB8MCl8MDskYSgxNDI0MCk7aT1iO3JldHVybiAxNDIyNH1mdW5jdGlvbiBGbShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAuMDtmPWk7aT1pKzE2fDA7Zz1mO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O2s9MC4wO2k9ZjtyZXR1cm4ra31qPWJiKCl8MDtoPWNbaj4+Ml18MDtjW2o+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWs9K0ZuKGIsZyk7Yj1jW2o+PjJdfDA7aWYoKGJ8MCk9PTApe2Nbaj4+Ml09aH1pZigoY1tnPj4yXXwwKSE9KGR8MCkpe2NbZT4+Ml09NDtrPTAuMDtpPWY7cmV0dXJuK2t9aWYoKGJ8MCkhPTM0KXtpPWY7cmV0dXJuK2t9Y1tlPj4yXT00O2k9ZjtyZXR1cm4ra31mdW5jdGlvbiBHbShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAuMDtmPWk7aT1pKzE2fDA7Zz1mO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O2s9MC4wO2k9ZjtyZXR1cm4ra31qPWJiKCl8MDtoPWNbaj4+Ml18MDtjW2o+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWs9K0ZuKGIsZyk7Yj1jW2o+PjJdfDA7aWYoKGJ8MCk9PTApe2Nbaj4+Ml09aH1pZigoY1tnPj4yXXwwKSE9KGR8MCkpe2NbZT4+Ml09NDtrPTAuMDtpPWY7cmV0dXJuK2t9aWYoKGJ8MCkhPTM0KXtpPWY7cmV0dXJuK2t9Y1tlPj4yXT00O2k9ZjtyZXR1cm4ra31mdW5jdGlvbiBIbShiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAuMDtmPWk7aT1pKzE2fDA7Zz1mO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O2s9MC4wO2k9ZjtyZXR1cm4ra31qPWJiKCl8MDtoPWNbaj4+Ml18MDtjW2o+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWs9K0ZuKGIsZyk7Yj1jW2o+PjJdfDA7aWYoKGJ8MCk9PTApe2Nbaj4+Ml09aH1pZigoY1tnPj4yXXwwKSE9KGR8MCkpe2NbZT4+Ml09NDtrPTAuMDtpPWY7cmV0dXJuK2t9aWYoKGJ8MCk9PTM0KXtjW2U+PjJdPTR9aT1mO3JldHVybitrfWZ1bmN0aW9uIEltKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7aD1pO2k9aSsxMTJ8MDtrPWg7aWYoKGJ8MCk9PShkfDApKXtjW2U+PjJdPTQ7Zj0wO209MDtJPWY7aT1oO3JldHVybiBtfDB9aWYoKGFbYj4+MF18MCk9PTQ1KXtjW2U+PjJdPTQ7Zj0wO209MDtJPWY7aT1oO3JldHVybiBtfDB9Zz1iYigpfDA7aj1jW2c+PjJdfDA7Y1tnPj4yXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1jW2s+PjJdPTA7bD1rKzR8MDtjW2w+PjJdPWI7Y1trKzQ0Pj4yXT1iO2lmKChifDApPDApe2Nbays4Pj4yXT0tMTttPS0xfWVsc2V7bT1iKzIxNDc0ODM2NDd8MDtjW2srOD4+Ml09bX1jW2srNzY+PjJdPS0xO2NbaysxMDQ+PjJdPTA7bj1rKzEwOHwwO2Nbbj4+Ml09bS1iO2NbaysxMDA+PjJdPW07bT1CbihrLGYsLTEsLTEpfDA7Zj1JO2s9YisoKGNbbD4+Ml18MCkrKGNbbj4+Ml18MCktKGNbays4Pj4yXXwwKSl8MDtiPWNbZz4+Ml18MDtpZigoYnwwKT09MCl7Y1tnPj4yXT1qfWlmKChrfDApIT0oZHwwKSl7Y1tlPj4yXT00O209MDtuPTA7ST1tO2k9aDtyZXR1cm4gbnwwfWlmKChifDApIT0zNCl7bj1tO0k9ZjtpPWg7cmV0dXJuIG58MH1jW2U+PjJdPTQ7bT0tMTtuPS0xO0k9bTtpPWg7cmV0dXJuIG58MH1mdW5jdGlvbiBKbShiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2g9aTtpPWkrMTEyfDA7az1oO2lmKChifDApPT0oZHwwKSl7Y1tlPj4yXT00O209MDtpPWg7cmV0dXJuIG18MH1pZigoYVtiPj4wXXwwKT09NDUpe2NbZT4+Ml09NDttPTA7aT1oO3JldHVybiBtfDB9Zz1iYigpfDA7aj1jW2c+PjJdfDA7Y1tnPj4yXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1jW2s+PjJdPTA7bD1rKzR8MDtjW2w+PjJdPWI7Y1trKzQ0Pj4yXT1iO2lmKChifDApPDApe2Nbays4Pj4yXT0tMTttPS0xfWVsc2V7bT1iKzIxNDc0ODM2NDd8MDtjW2srOD4+Ml09bX1jW2srNzY+PjJdPS0xO2NbaysxMDQ+PjJdPTA7bj1rKzEwOHwwO2Nbbj4+Ml09bS1iO2NbaysxMDA+PjJdPW07bT1CbihrLGYsLTEsLTEpfDA7Zj1JO2s9YisoKGNbbD4+Ml18MCkrKGNbbj4+Ml18MCktKGNbays4Pj4yXXwwKSl8MDtiPWNbZz4+Ml18MDtpZigoYnwwKT09MCl7Y1tnPj4yXT1qfWlmKChrfDApIT0oZHwwKSl7Y1tlPj4yXT00O249MDtpPWg7cmV0dXJuIG58MH1pZigoYnwwKT09MzR8KGY+Pj4wPjB8KGZ8MCk9PTAmbT4+PjA+NDI5NDk2NzI5NSkpe2NbZT4+Ml09NDtuPS0xO2k9aDtyZXR1cm4gbnwwfWVsc2V7bj1tO2k9aDtyZXR1cm4gbnwwfXJldHVybiAwfWZ1bmN0aW9uIEttKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTA7aD1pO2k9aSsxMTJ8MDtrPWg7aWYoKGJ8MCk9PShkfDApKXtjW2U+PjJdPTQ7bT0wO2k9aDtyZXR1cm4gbXwwfWlmKChhW2I+PjBdfDApPT00NSl7Y1tlPj4yXT00O209MDtpPWg7cmV0dXJuIG18MH1nPWJiKCl8MDtqPWNbZz4+Ml18MDtjW2c+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWNbaz4+Ml09MDtsPWsrNHwwO2NbbD4+Ml09YjtjW2srNDQ+PjJdPWI7aWYoKGJ8MCk8MCl7Y1trKzg+PjJdPS0xO209LTF9ZWxzZXttPWIrMjE0NzQ4MzY0N3wwO2Nbays4Pj4yXT1tfWNbays3Nj4+Ml09LTE7Y1trKzEwND4+Ml09MDtuPWsrMTA4fDA7Y1tuPj4yXT1tLWI7Y1trKzEwMD4+Ml09bTttPUJuKGssZiwtMSwtMSl8MDtmPUk7az1iKygoY1tsPj4yXXwwKSsoY1tuPj4yXXwwKS0oY1trKzg+PjJdfDApKXwwO2I9Y1tnPj4yXXwwO2lmKChifDApPT0wKXtjW2c+PjJdPWp9aWYoKGt8MCkhPShkfDApKXtjW2U+PjJdPTQ7bj0wO2k9aDtyZXR1cm4gbnwwfWlmKChifDApPT0zNHwoZj4+PjA+MHwoZnwwKT09MCZtPj4+MD40Mjk0OTY3Mjk1KSl7Y1tlPj4yXT00O249LTE7aT1oO3JldHVybiBufDB9ZWxzZXtuPW07aT1oO3JldHVybiBufDB9cmV0dXJuIDB9ZnVuY3Rpb24gTG0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtoPWk7aT1pKzExMnwwO2s9aDtpZigoYnwwKT09KGR8MCkpe2NbZT4+Ml09NDttPTA7aT1oO3JldHVybiBtfDB9aWYoKGFbYj4+MF18MCk9PTQ1KXtjW2U+PjJdPTQ7bT0wO2k9aDtyZXR1cm4gbXwwfWc9YmIoKXwwO2o9Y1tnPj4yXXwwO2NbZz4+Ml09MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9Y1trPj4yXT0wO2w9ays0fDA7Y1tsPj4yXT1iO2Nbays0ND4+Ml09YjtpZigoYnwwKTwwKXtjW2srOD4+Ml09LTE7bT0tMX1lbHNle209YisyMTQ3NDgzNjQ3fDA7Y1trKzg+PjJdPW19Y1trKzc2Pj4yXT0tMTtjW2srMTA0Pj4yXT0wO249aysxMDh8MDtjW24+PjJdPW0tYjtjW2srMTAwPj4yXT1tO209Qm4oayxmLC0xLC0xKXwwO2Y9STtrPWIrKChjW2w+PjJdfDApKyhjW24+PjJdfDApLShjW2srOD4+Ml18MCkpfDA7Yj1jW2c+PjJdfDA7aWYoKGJ8MCk9PTApe2NbZz4+Ml09an1pZigoa3wwKSE9KGR8MCkpe2NbZT4+Ml09NDtuPTA7aT1oO3JldHVybiBufDB9aWYoKGJ8MCk9PTM0fChmPj4+MD4wfChmfDApPT0wJm0+Pj4wPjY1NTM1KSl7Y1tlPj4yXT00O249LTE7aT1oO3JldHVybiBufDB9ZWxzZXtuPW0mNjU1MzU7aT1oO3JldHVybiBufDB9cmV0dXJuIDB9ZnVuY3Rpb24gTW0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtoPWk7aT1pKzExMnwwO2s9aDtpZigoYnwwKT09KGR8MCkpe2NbZT4+Ml09NDtmPTA7bT0wO0k9ZjtpPWg7cmV0dXJuIG18MH1nPWJiKCl8MDtqPWNbZz4+Ml18MDtjW2c+PjJdPTA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWNbaz4+Ml09MDtsPWsrNHwwO2NbbD4+Ml09YjtjW2srNDQ+PjJdPWI7aWYoKGJ8MCk8MCl7Y1trKzg+PjJdPS0xO209LTF9ZWxzZXttPWIrMjE0NzQ4MzY0N3wwO2Nbays4Pj4yXT1tfWNbays3Nj4+Ml09LTE7Y1trKzEwND4+Ml09MDtuPWsrMTA4fDA7Y1tuPj4yXT1tLWI7Y1trKzEwMD4+Ml09bTttPUJuKGssZiwwLC0yMTQ3NDgzNjQ4KXwwO2Y9STtrPWIrKChjW2w+PjJdfDApKyhjW24+PjJdfDApLShjW2srOD4+Ml18MCkpfDA7Yj1jW2c+PjJdfDA7aWYoKGJ8MCk9PTApe2NbZz4+Ml09an1pZigoa3wwKSE9KGR8MCkpe2NbZT4+Ml09NDttPTA7bj0wO0k9bTtpPWg7cmV0dXJuIG58MH1pZigoYnwwKT09MzQpe2NbZT4+Ml09NDtuPShmfDApPjB8KGZ8MCk9PTAmbT4+PjA+MDtJPW4/MjE0NzQ4MzY0NzotMjE0NzQ4MzY0ODtpPWg7cmV0dXJuKG4/LTE6MCl8MH1lbHNle249bTtJPWY7aT1oO3JldHVybiBufDB9cmV0dXJuIDB9ZnVuY3Rpb24gTm0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MDtoPWk7aT1pKzExMnwwO2s9aDtpZigoYnwwKT09KGR8MCkpe2NbZT4+Ml09NDttPTA7aT1oO3JldHVybiBtfDB9Zz1iYigpfDA7aj1jW2c+PjJdfDA7Y1tnPj4yXT0wO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1jW2s+PjJdPTA7bD1rKzR8MDtjW2w+PjJdPWI7Y1trKzQ0Pj4yXT1iO2lmKChifDApPDApe2Nbays4Pj4yXT0tMTttPS0xfWVsc2V7bT1iKzIxNDc0ODM2NDd8MDtjW2srOD4+Ml09bX1jW2srNzY+PjJdPS0xO2NbaysxMDQ+PjJdPTA7bj1rKzEwOHwwO2Nbbj4+Ml09bS1iO2NbaysxMDA+PjJdPW07bT1CbihrLGYsMCwtMjE0NzQ4MzY0OCl8MDtmPUk7az1iKygoY1tsPj4yXXwwKSsoY1tuPj4yXXwwKS0oY1trKzg+PjJdfDApKXwwO2I9Y1tnPj4yXXwwO2lmKChifDApPT0wKXtjW2c+PjJdPWp9aWYoKGt8MCkhPShkfDApKXtjW2U+PjJdPTQ7bj0wO2k9aDtyZXR1cm4gbnwwfWRve2lmKChifDApPT0zNCl7Y1tlPj4yXT00O2lmKChmfDApPjB8KGZ8MCk9PTAmbT4+PjA+MCl7bj0yMTQ3NDgzNjQ3O2k9aDtyZXR1cm4gbnwwfX1lbHNle2lmKChmfDApPC0xfChmfDApPT0tMSZtPj4+MDwyMTQ3NDgzNjQ4KXtjW2U+PjJdPTQ7YnJlYWt9aWYoKGZ8MCk+MHwoZnwwKT09MCZtPj4+MD4yMTQ3NDgzNjQ3KXtjW2U+PjJdPTQ7bj0yMTQ3NDgzNjQ3O2k9aDtyZXR1cm4gbnwwfWVsc2V7bj1tO2k9aDtyZXR1cm4gbnwwfX19d2hpbGUoMCk7bj0tMjE0NzQ4MzY0ODtpPWg7cmV0dXJuIG58MH1mdW5jdGlvbiBPbShiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTA7Yj1pO2lmKCEoKGFbMTg1MDg+PjBdJjEpPT0wKT8odj1jWzE4NTE2Pj4yXXwwLCh2fDApIT0wKTowKXt2bih2KX1pZighKChhWzE4NDk2Pj4wXSYxKT09MCk/KHU9Y1sxODUwND4+Ml18MCwodXwwKSE9MCk6MCl7dm4odSl9aWYoISgoYVsxODQ4ND4+MF0mMSk9PTApPyh0PWNbMTg0OTI+PjJdfDAsKHR8MCkhPTApOjApe3ZuKHQpfWlmKCEoKGFbMTg0NzI+PjBdJjEpPT0wKT8ocz1jWzE4NDgwPj4yXXwwLChzfDApIT0wKTowKXt2bihzKX1pZighKChhWzE4NDYwPj4wXSYxKT09MCk/KHI9Y1sxODQ2OD4+Ml18MCwocnwwKSE9MCk6MCl7dm4ocil9aWYoISgoYVsxODQ0OD4+MF0mMSk9PTApPyhkPWNbMTg0NTY+PjJdfDAsKGR8MCkhPTApOjApe3ZuKGQpfWlmKCEoKGFbMTg0MzY+PjBdJjEpPT0wKT8ocD1jWzE4NDQ0Pj4yXXwwLChwfDApIT0wKTowKXt2bihwKX1pZighKChhWzE4NDI0Pj4wXSYxKT09MCk/KG89Y1sxODQzMj4+Ml18MCwob3wwKSE9MCk6MCl7dm4obyl9aWYoISgoYVsxODQxMj4+MF0mMSk9PTApPyhuPWNbMTg0MjA+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKCEoKGFbMTg0MDA+PjBdJjEpPT0wKT8obT1jWzE4NDA4Pj4yXXwwLChtfDApIT0wKTowKXt2bihtKX1pZighKChhWzE4Mzg4Pj4wXSYxKT09MCk/KGw9Y1sxODM5Nj4+Ml18MCwobHwwKSE9MCk6MCl7dm4obCl9aWYoISgoYVsxODM3Nj4+MF0mMSk9PTApPyhrPWNbMTgzODQ+PjJdfDAsKGt8MCkhPTApOjApe3ZuKGspfWlmKCEoKGFbMTgzNjQ+PjBdJjEpPT0wKT8oaj1jWzE4MzcyPj4yXXwwLChqfDApIT0wKTowKXt2bihqKX1pZighKChhWzE4MzUyPj4wXSYxKT09MCk/KGg9Y1sxODM2MD4+Ml18MCwoaHwwKSE9MCk6MCl7dm4oaCl9aWYoISgoYVsxODM0MD4+MF0mMSk9PTApPyhnPWNbMTgzNDg+PjJdfDAsKGd8MCkhPTApOjApe3ZuKGcpfWlmKCEoKGFbMTgzMjg+PjBdJjEpPT0wKT8oZj1jWzE4MzM2Pj4yXXwwLChmfDApIT0wKTowKXt2bihmKX1pZighKChhWzE4MzE2Pj4wXSYxKT09MCk/KGU9Y1sxODMyND4+Ml18MCwoZXwwKSE9MCk6MCl7dm4oZSl9aWYoISgoYVsxODMwND4+MF0mMSk9PTApPyhxPWNbMTgzMTI+PjJdfDAsKHF8MCkhPTApOjApe3ZuKHEpfWRve2lmKCEoKGFbMTgyOTI+PjBdJjEpPT0wKSl7ZD1jWzE4MzAwPj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODI4MD4+MF0mMSk9PTApKXtkPWNbMTgyODg+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE4MjY4Pj4wXSYxKT09MCkpe2Q9Y1sxODI3Nj4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTgyNTY+PjBdJjEpPT0wKSl7ZD1jWzE4MjY0Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODI0ND4+MF0mMSk9PTApKXtkPWNbMTgyNTI+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtpZigoYVsxODIzMl0mMSk9PTApe2k9YjtyZXR1cm59ZD1jWzE4MjQwPj4yXXwwO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gUG0oYil7Yj1ifDA7dmFyIGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wO2I9aTtpZighKChhWzE4ODM2Pj4wXSYxKT09MCk/KHY9Y1sxODg0ND4+Ml18MCwodnwwKSE9MCk6MCl7dm4odil9aWYoISgoYVsxODgyND4+MF0mMSk9PTApPyh1PWNbMTg4MzI+PjJdfDAsKHV8MCkhPTApOjApe3ZuKHUpfWlmKCEoKGFbMTg4MTI+PjBdJjEpPT0wKT8odD1jWzE4ODIwPj4yXXwwLCh0fDApIT0wKTowKXt2bih0KX1pZighKChhWzE4ODAwPj4wXSYxKT09MCk/KHM9Y1sxODgwOD4+Ml18MCwoc3wwKSE9MCk6MCl7dm4ocyl9aWYoISgoYVsxODc4OD4+MF0mMSk9PTApPyhyPWNbMTg3OTY+PjJdfDAsKHJ8MCkhPTApOjApe3ZuKHIpfWlmKCEoKGFbMTg3NzY+PjBdJjEpPT0wKT8oZD1jWzE4Nzg0Pj4yXXwwLChkfDApIT0wKTowKXt2bihkKX1pZighKChhWzE4NzY0Pj4wXSYxKT09MCk/KHA9Y1sxODc3Mj4+Ml18MCwocHwwKSE9MCk6MCl7dm4ocCl9aWYoISgoYVsxODc1Mj4+MF0mMSk9PTApPyhvPWNbMTg3NjA+PjJdfDAsKG98MCkhPTApOjApe3ZuKG8pfWlmKCEoKGFbMTg3NDA+PjBdJjEpPT0wKT8obj1jWzE4NzQ4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhWzE4NzI4Pj4wXSYxKT09MCk/KG09Y1sxODczNj4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoISgoYVsxODcxNj4+MF0mMSk9PTApPyhsPWNbMTg3MjQ+PjJdfDAsKGx8MCkhPTApOjApe3ZuKGwpfWlmKCEoKGFbMTg3MDQ+PjBdJjEpPT0wKT8oaz1jWzE4NzEyPj4yXXwwLChrfDApIT0wKTowKXt2bihrKX1pZighKChhWzE4NjkyPj4wXSYxKT09MCk/KGo9Y1sxODcwMD4+Ml18MCwoanwwKSE9MCk6MCl7dm4oail9aWYoISgoYVsxODY4MD4+MF0mMSk9PTApPyhoPWNbMTg2ODg+PjJdfDAsKGh8MCkhPTApOjApe3ZuKGgpfWlmKCEoKGFbMTg2Njg+PjBdJjEpPT0wKT8oZz1jWzE4Njc2Pj4yXXwwLChnfDApIT0wKTowKXt2bihnKX1pZighKChhWzE4NjU2Pj4wXSYxKT09MCk/KGY9Y1sxODY2ND4+Ml18MCwoZnwwKSE9MCk6MCl7dm4oZil9aWYoISgoYVsxODY0ND4+MF0mMSk9PTApPyhlPWNbMTg2NTI+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWlmKCEoKGFbMTg2MzI+PjBdJjEpPT0wKT8ocT1jWzE4NjQwPj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1kb3tpZighKChhWzE4NjIwPj4wXSYxKT09MCkpe2Q9Y1sxODYyOD4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg2MDg+PjBdJjEpPT0wKSl7ZD1jWzE4NjE2Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODU5Nj4+MF0mMSk9PTApKXtkPWNbMTg2MDQ+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE4NTg0Pj4wXSYxKT09MCkpe2Q9Y1sxODU5Mj4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg1NzI+PjBdJjEpPT0wKSl7ZD1jWzE4NTgwPj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7aWYoKGFbMTg1NjBdJjEpPT0wKXtpPWI7cmV0dXJufWQ9Y1sxODU2OD4+Ml18MDtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFFtKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MDtiPWk7aWYoISgoYVsxOTE0OD4+MF0mMSk9PTApPyh2PWNbMTkxNTY+PjJdfDAsKHZ8MCkhPTApOjApe3ZuKHYpfWlmKCEoKGFbMTkxMzY+PjBdJjEpPT0wKT8odT1jWzE5MTQ0Pj4yXXwwLCh1fDApIT0wKTowKXt2bih1KX1pZighKChhWzE5MTI0Pj4wXSYxKT09MCk/KHQ9Y1sxOTEzMj4+Ml18MCwodHwwKSE9MCk6MCl7dm4odCl9aWYoISgoYVsxOTExMj4+MF0mMSk9PTApPyhzPWNbMTkxMjA+PjJdfDAsKHN8MCkhPTApOjApe3ZuKHMpfWlmKCEoKGFbMTkxMDA+PjBdJjEpPT0wKT8ocj1jWzE5MTA4Pj4yXXwwLChyfDApIT0wKTowKXt2bihyKX1pZighKChhWzE5MDg4Pj4wXSYxKT09MCk/KGQ9Y1sxOTA5Nj4+Ml18MCwoZHwwKSE9MCk6MCl7dm4oZCl9aWYoISgoYVsxOTA3Nj4+MF0mMSk9PTApPyhwPWNbMTkwODQ+PjJdfDAsKHB8MCkhPTApOjApe3ZuKHApfWlmKCEoKGFbMTkwNjQ+PjBdJjEpPT0wKT8obz1jWzE5MDcyPj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhWzE5MDUyPj4wXSYxKT09MCk/KG49Y1sxOTA2MD4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoISgoYVsxOTA0MD4+MF0mMSk9PTApPyhtPWNbMTkwNDg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbMTkwMjg+PjBdJjEpPT0wKT8obD1jWzE5MDM2Pj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZighKChhWzE5MDE2Pj4wXSYxKT09MCk/KGs9Y1sxOTAyND4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9aWYoISgoYVsxOTAwND4+MF0mMSk9PTApPyhqPWNbMTkwMTI+PjJdfDAsKGp8MCkhPTApOjApe3ZuKGopfWlmKCEoKGFbMTg5OTI+PjBdJjEpPT0wKT8oaD1jWzE5ZTM+PjJdfDAsKGh8MCkhPTApOjApe3ZuKGgpfWlmKCEoKGFbMTg5ODA+PjBdJjEpPT0wKT8oZz1jWzE4OTg4Pj4yXXwwLChnfDApIT0wKTowKXt2bihnKX1pZighKChhWzE4OTY4Pj4wXSYxKT09MCk/KGY9Y1sxODk3Nj4+Ml18MCwoZnwwKSE9MCk6MCl7dm4oZil9aWYoISgoYVsxODk1Nj4+MF0mMSk9PTApPyhlPWNbMTg5NjQ+PjJdfDAsKGV8MCkhPTApOjApe3ZuKGUpfWlmKCEoKGFbMTg5NDQ+PjBdJjEpPT0wKT8ocT1jWzE4OTUyPj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1kb3tpZighKChhWzE4OTMyPj4wXSYxKT09MCkpe2Q9Y1sxODk0MD4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg5MjA+PjBdJjEpPT0wKSl7ZD1jWzE4OTI4Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxODkwOD4+MF0mMSk9PTApKXtkPWNbMTg5MTY+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE4ODk2Pj4wXSYxKT09MCkpe2Q9Y1sxODkwND4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTg4ODQ+PjBdJjEpPT0wKSl7ZD1jWzE4ODkyPj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7aWYoKGFbMTg4NzJdJjEpPT0wKXtpPWI7cmV0dXJufWQ9Y1sxODg4MD4+Ml18MDtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFJtKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MDtiPWk7aWYoISgoYVsxOTk4OD4+MF0mMSk9PTApPyh2PWNbMTk5OTY+PjJdfDAsKHZ8MCkhPTApOjApe3ZuKHYpfWlmKCEoKGFbMTk5NzY+PjBdJjEpPT0wKT8odT1jWzE5OTg0Pj4yXXwwLCh1fDApIT0wKTowKXt2bih1KX1pZighKChhWzE5OTY0Pj4wXSYxKT09MCk/KHQ9Y1sxOTk3Mj4+Ml18MCwodHwwKSE9MCk6MCl7dm4odCl9aWYoISgoYVsxOTk1Mj4+MF0mMSk9PTApPyhzPWNbMTk5NjA+PjJdfDAsKHN8MCkhPTApOjApe3ZuKHMpfWlmKCEoKGFbMTk5NDA+PjBdJjEpPT0wKT8ocj1jWzE5OTQ4Pj4yXXwwLChyfDApIT0wKTowKXt2bihyKX1pZighKChhWzE5OTI4Pj4wXSYxKT09MCk/KGQ9Y1sxOTkzNj4+Ml18MCwoZHwwKSE9MCk6MCl7dm4oZCl9aWYoISgoYVsxOTkxNj4+MF0mMSk9PTApPyhwPWNbMTk5MjQ+PjJdfDAsKHB8MCkhPTApOjApe3ZuKHApfWlmKCEoKGFbMTk5MDQ+PjBdJjEpPT0wKT8obz1jWzE5OTEyPj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhWzE5ODkyPj4wXSYxKT09MCk/KG49Y1sxOTkwMD4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoISgoYVsxOTg4MD4+MF0mMSk9PTApPyhtPWNbMTk4ODg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbMTk4Njg+PjBdJjEpPT0wKT8obD1jWzE5ODc2Pj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZighKChhWzE5ODU2Pj4wXSYxKT09MCk/KGs9Y1sxOTg2ND4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9aWYoISgoYVsxOTg0ND4+MF0mMSk9PTApPyhqPWNbMTk4NTI+PjJdfDAsKGp8MCkhPTApOjApe3ZuKGopfWlmKCEoKGFbMTk4MzI+PjBdJjEpPT0wKT8oaD1jWzE5ODQwPj4yXXwwLChofDApIT0wKTowKXt2bihoKX1pZighKChhWzE5ODIwPj4wXSYxKT09MCk/KGc9Y1sxOTgyOD4+Ml18MCwoZ3wwKSE9MCk6MCl7dm4oZyl9aWYoISgoYVsxOTgwOD4+MF0mMSk9PTApPyhmPWNbMTk4MTY+PjJdfDAsKGZ8MCkhPTApOjApe3ZuKGYpfWlmKCEoKGFbMTk3OTY+PjBdJjEpPT0wKT8oZT1jWzE5ODA0Pj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pZighKChhWzE5Nzg0Pj4wXSYxKT09MCk/KHE9Y1sxOTc5Mj4+Ml18MCwocXwwKSE9MCk6MCl7dm4ocSl9ZG97aWYoISgoYVsxOTc3Mj4+MF0mMSk9PTApKXtkPWNbMTk3ODA+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE5NzYwPj4wXSYxKT09MCkpe2Q9Y1sxOTc2OD4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2Rve2lmKCEoKGFbMTk3NDg+PjBdJjEpPT0wKSl7ZD1jWzE5NzU2Pj4yXXwwO2lmKChkfDApPT0wKXticmVha312bihkKX19d2hpbGUoMCk7ZG97aWYoISgoYVsxOTczNj4+MF0mMSk9PTApKXtkPWNbMTk3NDQ+PjJdfDA7aWYoKGR8MCk9PTApe2JyZWFrfXZuKGQpfX13aGlsZSgwKTtkb3tpZighKChhWzE5NzI0Pj4wXSYxKT09MCkpe2Q9Y1sxOTczMj4+Ml18MDtpZigoZHwwKT09MCl7YnJlYWt9dm4oZCl9fXdoaWxlKDApO2lmKChhWzE5NzEyXSYxKT09MCl7aT1iO3JldHVybn1kPWNbMTk3MjA+PjJdfDA7aWYoKGR8MCk9PTApe2k9YjtyZXR1cm59dm4oZCk7aT1iO3JldHVybn1mdW5jdGlvbiBTbShiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wO2I9aTtpZighKChhWzIwMzgwPj4wXSYxKT09MCk/KHE9Y1syMDM4OD4+Ml18MCwocXwwKSE9MCk6MCl7dm4ocSl9aWYoISgoYVsyMDM2OD4+MF0mMSk9PTApPyhwPWNbMjAzNzY+PjJdfDAsKHB8MCkhPTApOjApe3ZuKHApfWlmKCEoKGFbMjAzNTY+PjBdJjEpPT0wKT8obz1jWzIwMzY0Pj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhWzIwMzQ0Pj4wXSYxKT09MCk/KG49Y1syMDM1Mj4+Ml18MCwobnwwKSE9MCk6MCl7dm4obil9aWYoISgoYVsyMDMzMj4+MF0mMSk9PTApPyhtPWNbMjAzNDA+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbMjAzMjA+PjBdJjEpPT0wKT8oZD1jWzIwMzI4Pj4yXXwwLChkfDApIT0wKTowKXt2bihkKX1pZighKChhWzIwMzA4Pj4wXSYxKT09MCk/KGw9Y1syMDMxNj4+Ml18MCwobHwwKSE9MCk6MCl7dm4obCl9aWYoISgoYVsyMDI5Nj4+MF0mMSk9PTApPyhrPWNbMjAzMDQ+PjJdfDAsKGt8MCkhPTApOjApe3ZuKGspfWlmKCEoKGFbMjAyODQ+PjBdJjEpPT0wKT8oaj1jWzIwMjkyPj4yXXwwLChqfDApIT0wKTowKXt2bihqKX1pZighKChhWzIwMjcyPj4wXSYxKT09MCk/KGg9Y1syMDI4MD4+Ml18MCwoaHwwKSE9MCk6MCl7dm4oaCl9aWYoISgoYVsyMDI2MD4+MF0mMSk9PTApPyhnPWNbMjAyNjg+PjJdfDAsKGd8MCkhPTApOjApe3ZuKGcpfWlmKCEoKGFbMjAyNDg+PjBdJjEpPT0wKT8oZj1jWzIwMjU2Pj4yXXwwLChmfDApIT0wKTowKXt2bihmKX1pZighKChhWzIwMjM2Pj4wXSYxKT09MCk/KGU9Y1syMDI0ND4+Ml18MCwoZXwwKSE9MCk6MCl7dm4oZSl9aWYoKGFbMjAyMjRdJjEpPT0wKXtpPWI7cmV0dXJufWQ9Y1syMDIzMj4+Ml18MDtpZigoZHwwKT09MCl7aT1iO3JldHVybn12bihkKTtpPWI7cmV0dXJufWZ1bmN0aW9uIFRtKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7Yj1pO2lmKCEoKGFbMjA5MTY+PjBdJjEpPT0wKT8ocT1jWzIwOTI0Pj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1pZighKChhWzIwOTA0Pj4wXSYxKT09MCk/KHA9Y1syMDkxMj4+Ml18MCwocHwwKSE9MCk6MCl7dm4ocCl9aWYoISgoYVsyMDg5Mj4+MF0mMSk9PTApPyhvPWNbMjA5MDA+PjJdfDAsKG98MCkhPTApOjApe3ZuKG8pfWlmKCEoKGFbMjA4ODA+PjBdJjEpPT0wKT8obj1jWzIwODg4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhWzIwODY4Pj4wXSYxKT09MCk/KG09Y1syMDg3Nj4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9aWYoISgoYVsyMDg1Nj4+MF0mMSk9PTApPyhkPWNbMjA4NjQ+PjJdfDAsKGR8MCkhPTApOjApe3ZuKGQpfWlmKCEoKGFbMjA4NDQ+PjBdJjEpPT0wKT8obD1jWzIwODUyPj4yXXwwLChsfDApIT0wKTowKXt2bihsKX1pZighKChhWzIwODMyPj4wXSYxKT09MCk/KGs9Y1syMDg0MD4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9aWYoISgoYVsyMDgyMD4+MF0mMSk9PTApPyhqPWNbMjA4Mjg+PjJdfDAsKGp8MCkhPTApOjApe3ZuKGopfWlmKCEoKGFbMjA4MDg+PjBdJjEpPT0wKT8oaD1jWzIwODE2Pj4yXXwwLChofDApIT0wKTowKXt2bihoKX1pZighKChhWzIwNzk2Pj4wXSYxKT09MCk/KGc9Y1syMDgwND4+Ml18MCwoZ3wwKSE9MCk6MCl7dm4oZyl9aWYoISgoYVsyMDc4ND4+MF0mMSk9PTApPyhmPWNbMjA3OTI+PjJdfDAsKGZ8MCkhPTApOjApe3ZuKGYpfWlmKCEoKGFbMjA3NzI+PjBdJjEpPT0wKT8oZT1jWzIwNzgwPj4yXXwwLChlfDApIT0wKTowKXt2bihlKX1pZigoYVsyMDc2MF0mMSk9PTApe2k9YjtyZXR1cm59ZD1jWzIwNzY4Pj4yXXwwO2lmKChkfDApPT0wKXtpPWI7cmV0dXJufXZuKGQpO2k9YjtyZXR1cm59ZnVuY3Rpb24gVW0oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTAsaj0wLGs9MCxsPTA7Zz1pO2k9aSsxNnwwO2g9ZztjW2g+PjJdPWI7Zj0oZnwwKT09MD8yMTI4ODpmO2o9Y1tmPj4yXXwwO2E6ZG97aWYoKGR8MCk9PTApe2lmKChqfDApPT0wKXtrPTA7aT1nO3JldHVybiBrfDB9fWVsc2V7aWYoKGJ8MCk9PTApe2NbaD4+Ml09aH1lbHNle2g9Yn1pZigoZXwwKT09MCl7az0tMjtpPWc7cmV0dXJuIGt8MH1kb3tpZigoanwwKT09MCl7Yj1hW2Q+PjBdfDA7aj1iJjI1NTtpZihiPDwyND4+MjQ+LTEpe2NbaD4+Ml09ajtrPWI8PDI0Pj4yNCE9MCYxO2k9ZztyZXR1cm4ga3wwfWVsc2V7aj1qKyAtMTk0fDA7aWYoaj4+PjA+NTApe2JyZWFrIGF9Yj1lKyAtMXwwO2o9Y1syMTA3Misoajw8Mik+PjJdfDA7ZD1kKzF8MDticmVha319ZWxzZXtiPWV9fXdoaWxlKDApO2I6ZG97aWYoKGJ8MCkhPTApe2s9YVtkPj4wXXwwO2w9KGsmMjU1KT4+PjM7aWYoKGwrIC0xNnxsKyhqPj4yNikpPj4+MD43KXticmVhayBhfXdoaWxlKDEpe2Q9ZCsxfDA7aj0oayYyNTUpKyAtMTI4fGo8PDY7Yj1iKyAtMXwwO2lmKChqfDApPj0wKXticmVha31pZigoYnwwKT09MCl7YnJlYWsgYn1rPWFbZD4+MF18MDtpZigoKGsmMjU1KSsgLTEyOHwwKT4+PjA+NjMpe2JyZWFrIGF9fWNbZj4+Ml09MDtjW2g+PjJdPWo7bD1lLWJ8MDtpPWc7cmV0dXJuIGx8MH19d2hpbGUoMCk7Y1tmPj4yXT1qO2w9LTI7aT1nO3JldHVybiBsfDB9fXdoaWxlKDApO2NbZj4+Ml09MDtjWyhiYigpfDApPj4yXT04NDtsPS0xO2k9ZztyZXR1cm4gbHwwfWZ1bmN0aW9uIFZtKGIsZSxmLGcpe2I9YnwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MCxsPTAsbT0wO2g9aTtrPWNbZT4+Ml18MDtpZigoZ3wwKSE9MD8obD1jW2c+PjJdfDAsKGx8MCkhPTApOjApe2lmKChifDApPT0wKXtqPWY7Zz0xNn1lbHNle2NbZz4+Ml09MDtqPWY7Zz0zNX19ZWxzZXtpZigoYnwwKT09MCl7aj1mO2c9N31lbHNle2o9ZjtnPTZ9fWE6d2hpbGUoMSl7aWYoKGd8MCk9PTYpe2lmKChqfDApPT0wKXtnPTUzO2JyZWFrfXdoaWxlKDEpe2c9YVtrPj4wXXwwO2I6ZG97aWYoKChnJjI1NSkrIC0xfDApPj4+MDwxMjc/KGsmM3wwKT09MCZqPj4+MD4zOjApe2Rve2c9Y1trPj4yXXwwO2lmKCgoZysgLTE2ODQzMDA5fGcpJi0yMTM5MDYyMTQ0fDApIT0wKXtnPWcmMjU1O2JyZWFrIGJ9Y1tiPj4yXT1nJjI1NTtjW2IrND4+Ml09ZFtrKzE+PjBdfDA7Y1tiKzg+PjJdPWRbaysyPj4wXXwwO2w9aztrPWsrNHwwO209YjtiPWIrMTZ8MDtjW20rMTI+PjJdPWRbbCszPj4wXXwwO2o9aisgLTR8MH13aGlsZShqPj4+MD4zKTtnPWFbaz4+MF18MH19d2hpbGUoMCk7bD1nJjI1NTtpZighKChsKyAtMXwwKT4+PjA8MTI3KSl7YnJlYWt9Y1tiPj4yXT1sO2o9aisgLTF8MDtpZigoanwwKT09MCl7Zz01MzticmVhayBhfWVsc2V7Yj1iKzR8MDtrPWsrMXwwfX1sPWwrIC0xOTR8MDtpZihsPj4+MD41MCl7bD1nO2c9NDc7YnJlYWt9bD1jWzIxMDcyKyhsPDwyKT4+Ml18MDtrPWsrMXwwO2c9MzU7Y29udGludWV9ZWxzZSBpZigoZ3wwKT09Nyl7bD1hW2s+PjBdfDA7aWYoKChsJjI1NSkrIC0xfDApPj4+MDwxMjc/KGsmM3wwKT09MDowKXtsPWNbaz4+Ml18MDtpZigoKGwrIC0xNjg0MzAwOXxsKSYtMjEzOTA2MjE0NHwwKT09MCl7ZG97az1rKzR8MDtqPWorIC00fDA7bD1jW2s+PjJdfDB9d2hpbGUoKChsKyAtMTY4NDMwMDl8bCkmLTIxMzkwNjIxNDR8MCk9PTApfWc9bCYyNTU7bD1sJjI1NX1lbHNle2c9bH1sPWwmMjU1O2lmKChsKyAtMXwwKT4+PjA8MTI3KXtqPWorIC0xfDA7az1rKzF8MDtnPTc7Y29udGludWV9bD1sKyAtMTk0fDA7aWYobD4+PjA+NTApe2w9ZztnPTQ3O2JyZWFrfWw9Y1syMTA3MisobDw8Mik+PjJdfDA7az1rKzF8MDtnPTE2O2NvbnRpbnVlfWVsc2UgaWYoKGd8MCk9PTE2KXttPShkW2s+PjBdfDApPj4+MztpZigobSsgLTE2fG0rKGw+PjI2KSk+Pj4wPjcpe2c9MTc7YnJlYWt9Zz1rKzF8MDtpZigobCYzMzU1NDQzMnwwKSE9MCl7aWYoKChkW2c+PjBdfDApKyAtMTI4fDApPj4+MD42Myl7Zz0yMDticmVha31nPWsrMnwwO2lmKChsJjUyNDI4OHwwKT09MCl7az1nfWVsc2V7aWYoKChkW2c+PjBdfDApKyAtMTI4fDApPj4+MD42Myl7Zz0yMzticmVha31rPWsrM3wwfX1lbHNle2s9Z31qPWorIC0xfDA7Zz03O2NvbnRpbnVlfWVsc2UgaWYoKGd8MCk9PTM1KXttPWRbaz4+MF18MDtnPW0+Pj4zO2lmKChnKyAtMTZ8ZysobD4+MjYpKT4+PjA+Nyl7Zz0zNjticmVha31nPWsrMXwwO2w9bSsgLTEyOHxsPDw2O2lmKChsfDApPDApe209KGRbZz4+MF18MCkrIC0xMjh8MDtpZihtPj4+MD42Myl7Zz0zOTticmVha31nPWsrMnwwO2w9bXxsPDw2O2lmKChsfDApPDApe2c9KGRbZz4+MF18MCkrIC0xMjh8MDtpZihnPj4+MD42Myl7Zz00MjticmVha31sPWd8bDw8NjtrPWsrM3wwfWVsc2V7az1nfX1lbHNle2s9Z31jW2I+PjJdPWw7Yj1iKzR8MDtqPWorIC0xfDA7Zz02O2NvbnRpbnVlfX1pZigoZ3wwKT09MTcpe2s9aysgLTF8MDtnPTQ1fWVsc2UgaWYoKGd8MCk9PTIwKXtrPWsrIC0xfDA7Zz00NX1lbHNlIGlmKChnfDApPT0yMyl7az1rKyAtMXwwO2c9NDV9ZWxzZSBpZigoZ3wwKT09MzYpe2s9aysgLTF8MDtnPTQ1fWVsc2UgaWYoKGd8MCk9PTM5KXtrPWsrIC0xfDA7Zz00NX1lbHNlIGlmKChnfDApPT00Mil7az1rKyAtMXwwO2c9NDV9ZWxzZSBpZigoZ3wwKT09NTMpe2k9aDtyZXR1cm4gZnwwfWlmKChnfDApPT00NSl7aWYoKGx8MCk9PTApe2w9YVtrPj4wXXwwO2c9NDd9fWlmKChnfDApPT00Nyl7aWYobDw8MjQ+PjI0PT0wKXtpZigoYnwwKSE9MCl7Y1tiPj4yXT0wO2NbZT4+Ml09MH1tPWYtanwwO2k9aDtyZXR1cm4gbXwwfX1jWyhiYigpfDApPj4yXT04NDtpZigoYnwwKT09MCl7bT0tMTtpPWg7cmV0dXJuIG18MH1jW2U+PjJdPWs7bT0tMTtpPWg7cmV0dXJuIG18MH1mdW5jdGlvbiBXbShiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTA7ZT1pO2lmKChifDApPT0wKXtiPTE7aT1lO3JldHVybiBifDB9aWYoZD4+PjA8MTI4KXthW2I+PjBdPWQ7Yj0xO2k9ZTtyZXR1cm4gYnwwfWlmKGQ+Pj4wPDIwNDgpe2FbYj4+MF09ZD4+PjZ8MTkyO2FbYisxPj4wXT1kJjYzfDEyODtiPTI7aT1lO3JldHVybiBifDB9aWYoZD4+PjA8NTUyOTZ8KGQrIC01NzM0NHwwKT4+PjA8ODE5Mil7YVtiPj4wXT1kPj4+MTJ8MjI0O2FbYisxPj4wXT1kPj4+NiY2M3wxMjg7YVtiKzI+PjBdPWQmNjN8MTI4O2I9MztpPWU7cmV0dXJuIGJ8MH1pZigoZCsgLTY1NTM2fDApPj4+MDwxMDQ4NTc2KXthW2I+PjBdPWQ+Pj4xOHwyNDA7YVtiKzE+PjBdPWQ+Pj4xMiY2M3wxMjg7YVtiKzI+PjBdPWQ+Pj42JjYzfDEyODthW2IrMz4+MF09ZCY2M3wxMjg7Yj00O2k9ZTtyZXR1cm4gYnwwfWVsc2V7Y1soYmIoKXwwKT4+Ml09ODQ7Yj0tMTtpPWU7cmV0dXJuIGJ8MH1yZXR1cm4gMH1mdW5jdGlvbiBYbShhKXthPWF8MDt2YXIgYj0wO2I9aTtSYihhfDApO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFltKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBabShhKXthPWF8MDtyZXR1cm4gMjEzMjB9ZnVuY3Rpb24gX20oYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uICRtKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBhbihhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gYm4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gY24oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZG4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZW4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZm4oYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gZ24oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybihhfDApPT0oYnwwKXwwfWZ1bmN0aW9uIGhuKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wO2U9aTtpPWkrNjR8MDtmPWU7aWYoKGF8MCk9PShifDApKXtoPTE7aT1lO3JldHVybiBofDB9aWYoKGJ8MCk9PTApe2g9MDtpPWU7cmV0dXJuIGh8MH1iPW5uKGIsMjE0ODgpfDA7aWYoKGJ8MCk9PTApe2g9MDtpPWU7cmV0dXJuIGh8MH1oPWYrMHwwO2c9aCs1NnwwO2Rve2NbaD4+Ml09MDtoPWgrNHwwfXdoaWxlKChofDApPChnfDApKTtjW2Y+PjJdPWI7Y1tmKzg+PjJdPWE7Y1tmKzEyPj4yXT0tMTtjW2YrNDg+PjJdPTE7emNbY1soY1tiPj4yXXwwKSsyOD4+Ml0mMzFdKGIsZixjW2Q+PjJdfDAsMSk7aWYoKGNbZisyND4+Ml18MCkhPTEpe2g9MDtpPWU7cmV0dXJuIGh8MH1jW2Q+PjJdPWNbZisxNj4+Ml07aD0xO2k9ZTtyZXR1cm4gaHwwfWZ1bmN0aW9uIGpuKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wO2c9aTtpZigoY1tkKzg+PjJdfDApIT0oYnwwKSl7aT1nO3JldHVybn1iPWQrMTZ8MDtoPWNbYj4+Ml18MDtpZigoaHwwKT09MCl7Y1tiPj4yXT1lO2NbZCsyND4+Ml09ZjtjW2QrMzY+PjJdPTE7aT1nO3JldHVybn1pZigoaHwwKSE9KGV8MCkpe2g9ZCszNnwwO2NbaD4+Ml09KGNbaD4+Ml18MCkrMTtjW2QrMjQ+PjJdPTI7YVtkKzU0Pj4wXT0xO2k9ZztyZXR1cm59ZT1kKzI0fDA7aWYoKGNbZT4+Ml18MCkhPTIpe2k9ZztyZXR1cm59Y1tlPj4yXT1mO2k9ZztyZXR1cm59ZnVuY3Rpb24ga24oYixkLGUsZil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7dmFyIGc9MCxoPTA7Zz1pO2lmKChifDApIT0oY1tkKzg+PjJdfDApKXtoPWNbYis4Pj4yXXwwO3pjW2NbKGNbaD4+Ml18MCkrMjg+PjJdJjMxXShoLGQsZSxmKTtpPWc7cmV0dXJufWI9ZCsxNnwwO2g9Y1tiPj4yXXwwO2lmKChofDApPT0wKXtjW2I+PjJdPWU7Y1tkKzI0Pj4yXT1mO2NbZCszNj4+Ml09MTtpPWc7cmV0dXJufWlmKChofDApIT0oZXwwKSl7aD1kKzM2fDA7Y1toPj4yXT0oY1toPj4yXXwwKSsxO2NbZCsyND4+Ml09MjthW2QrNTQ+PjBdPTE7aT1nO3JldHVybn1lPWQrMjR8MDtpZigoY1tlPj4yXXwwKSE9Mil7aT1nO3JldHVybn1jW2U+PjJdPWY7aT1nO3JldHVybn1mdW5jdGlvbiBsbihiLGQsZSxmKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTA7Zz1pO2lmKChifDApPT0oY1tkKzg+PjJdfDApKXtiPWQrMTZ8MDtoPWNbYj4+Ml18MDtpZigoaHwwKT09MCl7Y1tiPj4yXT1lO2NbZCsyND4+Ml09ZjtjW2QrMzY+PjJdPTE7aT1nO3JldHVybn1pZigoaHwwKSE9KGV8MCkpe2w9ZCszNnwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTtjW2QrMjQ+PjJdPTI7YVtkKzU0Pj4wXT0xO2k9ZztyZXR1cm59ZT1kKzI0fDA7aWYoKGNbZT4+Ml18MCkhPTIpe2k9ZztyZXR1cm59Y1tlPj4yXT1mO2k9ZztyZXR1cm59aj1jW2IrMTI+PjJdfDA7aD1iKyhqPDwzKSsxNnwwO2s9Y1tiKzIwPj4yXXwwO2w9az4+ODtpZigoayYxfDApIT0wKXtsPWNbKGNbZT4+Ml18MCkrbD4+Ml18MH1tPWNbYisxNj4+Ml18MDt6Y1tjWyhjW20+PjJdfDApKzI4Pj4yXSYzMV0obSxkLGUrbHwwLChrJjJ8MCkhPTA/ZjoyKTtpZigoanwwKTw9MSl7aT1nO3JldHVybn1qPWQrNTR8MDtrPWIrMjR8MDt3aGlsZSgxKXtiPWNbays0Pj4yXXwwO2w9Yj4+ODtpZigoYiYxfDApIT0wKXtsPWNbKGNbZT4+Ml18MCkrbD4+Ml18MH1tPWNbaz4+Ml18MDt6Y1tjWyhjW20+PjJdfDApKzI4Pj4yXSYzMV0obSxkLGUrbHwwLChiJjJ8MCkhPTA/ZjoyKTtpZigoYVtqPj4wXXwwKSE9MCl7Zj0xNjticmVha31rPWsrOHwwO2lmKCEoaz4+PjA8aD4+PjApKXtmPTE2O2JyZWFrfX1pZigoZnwwKT09MTYpe2k9ZztyZXR1cm59fWZ1bmN0aW9uIG1uKGEsYixkKXthPWF8MDtiPWJ8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTA7ZT1pO2k9aSs2NHwwO2g9ZTtjW2Q+PjJdPWNbY1tkPj4yXT4+Ml07aWYoISgoYXwwKT09KGJ8MCl8KGJ8MCk9PTIxNzkyKSl7aWYoKChifDApIT0wPyhrPW5uKGIsMjE2MDApfDAsKGt8MCkhPTApOjApPyhjW2srOD4+Ml0mfmNbYSs4Pj4yXXwwKT09MDowKXtiPWNbYSsxMj4+Ml18MDtrPWsrMTJ8MDtpZighKChifDApPT0yMTc3Nj8xOihifDApPT0oY1trPj4yXXwwKSkpe2lmKCgoKGJ8MCkhPTA/KGc9bm4oYiwyMTQ4OCl8MCwoZ3wwKSE9MCk6MCk/KGo9Y1trPj4yXXwwLChqfDApIT0wKTowKT8oZj1ubihqLDIxNDg4KXwwLChmfDApIT0wKTowKXtrPWgrMHwwO2o9ays1NnwwO2Rve2Nbaz4+Ml09MDtrPWsrNHwwfXdoaWxlKChrfDApPChqfDApKTtjW2g+PjJdPWY7Y1toKzg+PjJdPWc7Y1toKzEyPj4yXT0tMTtjW2grNDg+PjJdPTE7emNbY1soY1tmPj4yXXwwKSsyOD4+Ml0mMzFdKGYsaCxjW2Q+PjJdfDAsMSk7aWYoKGNbaCsyND4+Ml18MCk9PTEpe2NbZD4+Ml09Y1toKzE2Pj4yXTtkPTF9ZWxzZXtkPTB9fWVsc2V7ZD0wfX1lbHNle2Q9MX19ZWxzZXtkPTB9fWVsc2V7ZD0xfWk9ZTtyZXR1cm4gZHwwfWZ1bmN0aW9uIG5uKGQsZSl7ZD1kfDA7ZT1lfDA7dmFyIGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wO2Y9aTtpPWkrNjR8MDttPWY7Zz1jW2Q+PjJdfDA7aD1kKyhjW2crIC04Pj4yXXwwKXwwO2c9Y1tnKyAtND4+Ml18MDtjW20+PjJdPWU7Y1ttKzQ+PjJdPWQ7Y1ttKzg+PjJdPTIxNDMyO3A9bSsxMnwwO249bSsxNnwwO289bSsyMHwwO2o9bSsyNHwwO2Q9bSsyOHwwO2s9bSszMnwwO2w9bSs0MHwwO3I9KGd8MCk9PShlfDApO2U9cCswfDA7cT1lKzQwfDA7ZG97Y1tlPj4yXT0wO2U9ZSs0fDB9d2hpbGUoKGV8MCk8KHF8MCkpO2JbcCs0MD4+MV09MDthW3ArNDI+PjBdPTA7ZG97aWYocil7Y1ttKzQ4Pj4yXT0xO3djW2NbKGNbZz4+Ml18MCkrMjA+PjJdJjYzXShnLG0saCxoLDEsMCk7ZD0oY1tqPj4yXXwwKT09MT9oOjB9ZWxzZXtqY1tjWyhjW2c+PjJdfDApKzI0Pj4yXSYzMV0oZyxtLGgsMSwwKTtnPWNbbSszNj4+Ml18MDtpZigoZ3wwKT09MCl7aWYoKGNbbD4+Ml18MCkhPTEpe2Q9MDticmVha31pZigoY1tkPj4yXXwwKSE9MSl7ZD0wO2JyZWFrfWQ9KGNbaz4+Ml18MCk9PTE/Y1tvPj4yXXwwOjA7YnJlYWt9ZWxzZSBpZigoZ3wwKSE9MSl7ZD0wO2JyZWFrfWlmKChjW2o+PjJdfDApIT0xKXtpZigoY1tsPj4yXXwwKSE9MCl7ZD0wO2JyZWFrfWlmKChjW2Q+PjJdfDApIT0xKXtkPTA7YnJlYWt9aWYoKGNbaz4+Ml18MCkhPTEpe2Q9MDticmVha319ZD1jW24+PjJdfDB9fXdoaWxlKDApO2k9ZjtyZXR1cm4gZHwwfWZ1bmN0aW9uIG9uKGIsZCxlLGYsZyl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MDtoPWk7aWYoKGJ8MCk9PShjW2QrOD4+Ml18MCkpe2lmKChjW2QrND4+Ml18MCkhPShlfDApKXtpPWg7cmV0dXJufWU9ZCsyOHwwO2lmKChjW2U+PjJdfDApPT0xKXtpPWg7cmV0dXJufWNbZT4+Ml09ZjtpPWg7cmV0dXJufWlmKChifDApPT0oY1tkPj4yXXwwKSl7aWYoKGNbZCsxNj4+Ml18MCkhPShlfDApPyhsPWQrMjB8MCwoY1tsPj4yXXwwKSE9KGV8MCkpOjApe2NbZCszMj4+Ml09ZjtrPWQrNDR8MDtpZigoY1trPj4yXXwwKT09NCl7aT1oO3JldHVybn13PWNbYisxMj4+Ml18MDtwPWIrKHc8PDMpKzE2fDA7YTpkb3tpZigod3wwKT4wKXtuPWQrNTJ8MDtxPWQrNTN8MDtvPWQrNTR8MDt0PWIrOHwwO3I9ZCsyNHwwO3U9MDtzPTA7Yj1iKzE2fDA7Yjpkb3thW24+PjBdPTA7YVtxPj4wXT0wO3Y9Y1tiKzQ+PjJdfDA7dz12Pj44O2lmKCh2JjF8MCkhPTApe3c9Y1soY1tlPj4yXXwwKSt3Pj4yXXwwfXg9Y1tiPj4yXXwwO3djW2NbKGNbeD4+Ml18MCkrMjA+PjJdJjYzXSh4LGQsZSxlK3d8MCwyLSh2Pj4+MSYxKXwwLGcpO2lmKChhW28+PjBdfDApIT0wKXticmVha31kb3tpZigoYVtxPj4wXXwwKSE9MCl7aWYoKGFbbj4+MF18MCk9PTApe2lmKChjW3Q+PjJdJjF8MCk9PTApe3M9MTticmVhayBifWVsc2V7cz0xO2JyZWFrfX1pZigoY1tyPj4yXXwwKT09MSl7Yj0yNzticmVhayBhfWlmKChjW3Q+PjJdJjJ8MCk9PTApe2I9Mjc7YnJlYWsgYX1lbHNle3U9MTtzPTF9fX13aGlsZSgwKTtiPWIrOHwwfXdoaWxlKGI+Pj4wPHA+Pj4wKTtpZih1KXtqPXM7Yj0yNn1lbHNle209cztiPTIzfX1lbHNle209MDtiPTIzfX13aGlsZSgwKTtpZigoYnwwKT09MjMpe2NbbD4+Ml09ZTt4PWQrNDB8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoKGNbZCszNj4+Ml18MCk9PTE/KGNbZCsyND4+Ml18MCk9PTI6MCl7YVtkKzU0Pj4wXT0xO2lmKG0pe2I9Mjd9ZWxzZXtiPTI4fX1lbHNle2o9bTtiPTI2fX1pZigoYnwwKT09MjYpe2lmKGope2I9Mjd9ZWxzZXtiPTI4fX1pZigoYnwwKT09Mjcpe2Nbaz4+Ml09MztpPWg7cmV0dXJufWVsc2UgaWYoKGJ8MCk9PTI4KXtjW2s+PjJdPTQ7aT1oO3JldHVybn19aWYoKGZ8MCkhPTEpe2k9aDtyZXR1cm59Y1tkKzMyPj4yXT0xO2k9aDtyZXR1cm59bT1jW2IrMTI+PjJdfDA7aj1iKyhtPDwzKSsxNnwwO2w9Y1tiKzIwPj4yXXwwO249bD4+ODtpZigobCYxfDApIT0wKXtuPWNbKGNbZT4+Ml18MCkrbj4+Ml18MH14PWNbYisxNj4+Ml18MDtqY1tjWyhjW3g+PjJdfDApKzI0Pj4yXSYzMV0oeCxkLGUrbnwwLChsJjJ8MCkhPTA/ZjoyLGcpO2w9YisyNHwwO2lmKChtfDApPD0xKXtpPWg7cmV0dXJufW09Y1tiKzg+PjJdfDA7aWYoKG0mMnwwKT09MD8oaz1kKzM2fDAsKGNbaz4+Ml18MCkhPTEpOjApe2lmKChtJjF8MCk9PTApe209ZCs1NHwwO2I9bDt3aGlsZSgxKXtpZigoYVttPj4wXXwwKSE9MCl7Yj01MzticmVha31pZigoY1trPj4yXXwwKT09MSl7Yj01MzticmVha31uPWNbYis0Pj4yXXwwO289bj4+ODtpZigobiYxfDApIT0wKXtvPWNbKGNbZT4+Ml18MCkrbz4+Ml18MH14PWNbYj4+Ml18MDtqY1tjWyhjW3g+PjJdfDApKzI0Pj4yXSYzMV0oeCxkLGUrb3wwLChuJjJ8MCkhPTA/ZjoyLGcpO2I9Yis4fDA7aWYoIShiPj4+MDxqPj4+MCkpe2I9NTM7YnJlYWt9fWlmKChifDApPT01Myl7aT1oO3JldHVybn19bj1kKzI0fDA7bz1kKzU0fDA7Yj1sO3doaWxlKDEpe2lmKChhW28+PjBdfDApIT0wKXtiPTUzO2JyZWFrfWlmKChjW2s+PjJdfDApPT0xPyhjW24+PjJdfDApPT0xOjApe2I9NTM7YnJlYWt9bT1jW2IrND4+Ml18MDtwPW0+Pjg7aWYoKG0mMXwwKSE9MCl7cD1jWyhjW2U+PjJdfDApK3A+PjJdfDB9eD1jW2I+PjJdfDA7amNbY1soY1t4Pj4yXXwwKSsyND4+Ml0mMzFdKHgsZCxlK3B8MCwobSYyfDApIT0wP2Y6MixnKTtiPWIrOHwwO2lmKCEoYj4+PjA8aj4+PjApKXtiPTUzO2JyZWFrfX1pZigoYnwwKT09NTMpe2k9aDtyZXR1cm59fWs9ZCs1NHwwO3doaWxlKDEpe2lmKChhW2s+PjBdfDApIT0wKXtiPTUzO2JyZWFrfW09Y1tsKzQ+PjJdfDA7Yj1tPj44O2lmKChtJjF8MCkhPTApe2I9Y1soY1tlPj4yXXwwKStiPj4yXXwwfXg9Y1tsPj4yXXwwO2pjW2NbKGNbeD4+Ml18MCkrMjQ+PjJdJjMxXSh4LGQsZStifDAsKG0mMnwwKSE9MD9mOjIsZyk7bD1sKzh8MDtpZighKGw+Pj4wPGo+Pj4wKSl7Yj01MzticmVha319aWYoKGJ8MCk9PTUzKXtpPWg7cmV0dXJufX1mdW5jdGlvbiBwbihiLGQsZSxmLGcpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO3ZhciBoPTAsaj0wLGs9MCxsPTAsbT0wO2g9aTtpZigoYnwwKT09KGNbZCs4Pj4yXXwwKSl7aWYoKGNbZCs0Pj4yXXwwKSE9KGV8MCkpe2k9aDtyZXR1cm59aj1kKzI4fDA7aWYoKGNbaj4+Ml18MCk9PTEpe2k9aDtyZXR1cm59Y1tqPj4yXT1mO2k9aDtyZXR1cm59aWYoKGJ8MCkhPShjW2Q+PjJdfDApKXtsPWNbYis4Pj4yXXwwO2pjW2NbKGNbbD4+Ml18MCkrMjQ+PjJdJjMxXShsLGQsZSxmLGcpO2k9aDtyZXR1cm59aWYoKGNbZCsxNj4+Ml18MCkhPShlfDApPyhrPWQrMjB8MCwoY1trPj4yXXwwKSE9KGV8MCkpOjApe2NbZCszMj4+Ml09ZjtmPWQrNDR8MDtpZigoY1tmPj4yXXwwKT09NCl7aT1oO3JldHVybn1sPWQrNTJ8MDthW2w+PjBdPTA7bT1kKzUzfDA7YVttPj4wXT0wO2I9Y1tiKzg+PjJdfDA7d2NbY1soY1tiPj4yXXwwKSsyMD4+Ml0mNjNdKGIsZCxlLGUsMSxnKTtpZigoYVttPj4wXXwwKSE9MCl7aWYoKGFbbD4+MF18MCk9PTApe2I9MTtqPTEzfX1lbHNle2I9MDtqPTEzfWRve2lmKChqfDApPT0xMyl7Y1trPj4yXT1lO209ZCs0MHwwO2NbbT4+Ml09KGNbbT4+Ml18MCkrMTtpZigoY1tkKzM2Pj4yXXwwKT09MT8oY1tkKzI0Pj4yXXwwKT09MjowKXthW2QrNTQ+PjBdPTE7aWYoYil7YnJlYWt9fWVsc2V7aj0xNn1pZigoanwwKT09MTY/YjowKXticmVha31jW2Y+PjJdPTQ7aT1oO3JldHVybn19d2hpbGUoMCk7Y1tmPj4yXT0zO2k9aDtyZXR1cm59aWYoKGZ8MCkhPTEpe2k9aDtyZXR1cm59Y1tkKzMyPj4yXT0xO2k9aDtyZXR1cm59ZnVuY3Rpb24gcW4oYixkLGUsZixnKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt2YXIgaD0wO2c9aTtpZigoY1tkKzg+PjJdfDApPT0oYnwwKSl7aWYoKGNbZCs0Pj4yXXwwKSE9KGV8MCkpe2k9ZztyZXR1cm59ZD1kKzI4fDA7aWYoKGNbZD4+Ml18MCk9PTEpe2k9ZztyZXR1cm59Y1tkPj4yXT1mO2k9ZztyZXR1cm59aWYoKGNbZD4+Ml18MCkhPShifDApKXtpPWc7cmV0dXJufWlmKChjW2QrMTY+PjJdfDApIT0oZXwwKT8oaD1kKzIwfDAsKGNbaD4+Ml18MCkhPShlfDApKTowKXtjW2QrMzI+PjJdPWY7Y1toPj4yXT1lO2I9ZCs0MHwwO2NbYj4+Ml09KGNbYj4+Ml18MCkrMTtpZigoY1tkKzM2Pj4yXXwwKT09MT8oY1tkKzI0Pj4yXXwwKT09MjowKXthW2QrNTQ+PjBdPTF9Y1tkKzQ0Pj4yXT00O2k9ZztyZXR1cm59aWYoKGZ8MCkhPTEpe2k9ZztyZXR1cm59Y1tkKzMyPj4yXT0xO2k9ZztyZXR1cm59ZnVuY3Rpb24gcm4oYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDtqPWk7aWYoKGJ8MCkhPShjW2QrOD4+Ml18MCkpe209ZCs1MnwwO2w9YVttPj4wXXwwO289ZCs1M3wwO249YVtvPj4wXXwwO3E9Y1tiKzEyPj4yXXwwO2s9YisocTw8MykrMTZ8MDthW20+PjBdPTA7YVtvPj4wXT0wO3A9Y1tiKzIwPj4yXXwwO3I9cD4+ODtpZigocCYxfDApIT0wKXtyPWNbKGNbZj4+Ml18MCkrcj4+Ml18MH10PWNbYisxNj4+Ml18MDt3Y1tjWyhjW3Q+PjJdfDApKzIwPj4yXSY2M10odCxkLGUsZityfDAsKHAmMnwwKSE9MD9nOjIsaCk7YTpkb3tpZigocXwwKT4xKXtxPWQrMjR8MDtwPWIrOHwwO3I9ZCs1NHwwO2I9YisyNHwwO2Rve2lmKChhW3I+PjBdfDApIT0wKXticmVhayBhfWlmKChhW20+PjBdfDApPT0wKXtpZigoYVtvPj4wXXwwKSE9MD8oY1twPj4yXSYxfDApPT0wOjApe2JyZWFrIGF9fWVsc2V7aWYoKGNbcT4+Ml18MCk9PTEpe2JyZWFrIGF9aWYoKGNbcD4+Ml0mMnwwKT09MCl7YnJlYWsgYX19YVttPj4wXT0wO2Fbbz4+MF09MDtzPWNbYis0Pj4yXXwwO3Q9cz4+ODtpZigocyYxfDApIT0wKXt0PWNbKGNbZj4+Ml18MCkrdD4+Ml18MH11PWNbYj4+Ml18MDt3Y1tjWyhjW3U+PjJdfDApKzIwPj4yXSY2M10odSxkLGUsZit0fDAsKHMmMnwwKSE9MD9nOjIsaCk7Yj1iKzh8MH13aGlsZShiPj4+MDxrPj4+MCl9fXdoaWxlKDApO2FbbT4+MF09bDthW28+PjBdPW47aT1qO3JldHVybn1hW2QrNTM+PjBdPTE7aWYoKGNbZCs0Pj4yXXwwKSE9KGZ8MCkpe2k9ajtyZXR1cm59YVtkKzUyPj4wXT0xO2s9ZCsxNnwwO2Y9Y1trPj4yXXwwO2lmKChmfDApPT0wKXtjW2s+PjJdPWU7Y1tkKzI0Pj4yXT1nO2NbZCszNj4+Ml09MTtpZighKChnfDApPT0xPyhjW2QrNDg+PjJdfDApPT0xOjApKXtpPWo7cmV0dXJufWFbZCs1ND4+MF09MTtpPWo7cmV0dXJufWlmKChmfDApIT0oZXwwKSl7dT1kKzM2fDA7Y1t1Pj4yXT0oY1t1Pj4yXXwwKSsxO2FbZCs1ND4+MF09MTtpPWo7cmV0dXJufWU9ZCsyNHwwO2s9Y1tlPj4yXXwwO2lmKChrfDApPT0yKXtjW2U+PjJdPWd9ZWxzZXtnPWt9aWYoISgoZ3wwKT09MT8oY1tkKzQ4Pj4yXXwwKT09MTowKSl7aT1qO3JldHVybn1hW2QrNTQ+PjBdPTE7aT1qO3JldHVybn1mdW5jdGlvbiBzbihiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MDtqPWk7aWYoKGJ8MCkhPShjW2QrOD4+Ml18MCkpe2I9Y1tiKzg+PjJdfDA7d2NbY1soY1tiPj4yXXwwKSsyMD4+Ml0mNjNdKGIsZCxlLGYsZyxoKTtpPWo7cmV0dXJufWFbZCs1Mz4+MF09MTtpZigoY1tkKzQ+PjJdfDApIT0oZnwwKSl7aT1qO3JldHVybn1hW2QrNTI+PjBdPTE7Yj1kKzE2fDA7Zj1jW2I+PjJdfDA7aWYoKGZ8MCk9PTApe2NbYj4+Ml09ZTtjW2QrMjQ+PjJdPWc7Y1tkKzM2Pj4yXT0xO2lmKCEoKGd8MCk9PTE/KGNbZCs0OD4+Ml18MCk9PTE6MCkpe2k9ajtyZXR1cm59YVtkKzU0Pj4wXT0xO2k9ajtyZXR1cm59aWYoKGZ8MCkhPShlfDApKXtoPWQrMzZ8MDtjW2g+PjJdPShjW2g+PjJdfDApKzE7YVtkKzU0Pj4wXT0xO2k9ajtyZXR1cm59ZT1kKzI0fDA7Yj1jW2U+PjJdfDA7aWYoKGJ8MCk9PTIpe2NbZT4+Ml09Z31lbHNle2c9Yn1pZighKChnfDApPT0xPyhjW2QrNDg+PjJdfDApPT0xOjApKXtpPWo7cmV0dXJufWFbZCs1ND4+MF09MTtpPWo7cmV0dXJufWZ1bmN0aW9uIHRuKGIsZCxlLGYsZyxoKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtoPWk7aWYoKGNbZCs4Pj4yXXwwKSE9KGJ8MCkpe2k9aDtyZXR1cm59YVtkKzUzPj4wXT0xO2lmKChjW2QrND4+Ml18MCkhPShmfDApKXtpPWg7cmV0dXJufWFbZCs1Mj4+MF09MTtmPWQrMTZ8MDtiPWNbZj4+Ml18MDtpZigoYnwwKT09MCl7Y1tmPj4yXT1lO2NbZCsyND4+Ml09ZztjW2QrMzY+PjJdPTE7aWYoISgoZ3wwKT09MT8oY1tkKzQ4Pj4yXXwwKT09MTowKSl7aT1oO3JldHVybn1hW2QrNTQ+PjBdPTE7aT1oO3JldHVybn1pZigoYnwwKSE9KGV8MCkpe2I9ZCszNnwwO2NbYj4+Ml09KGNbYj4+Ml18MCkrMTthW2QrNTQ+PjBdPTE7aT1oO3JldHVybn1lPWQrMjR8MDtmPWNbZT4+Ml18MDtpZigoZnwwKT09Mil7Y1tlPj4yXT1nfWVsc2V7Zz1mfWlmKCEoKGd8MCk9PTE/KGNbZCs0OD4+Ml18MCk9PTE6MCkpe2k9aDtyZXR1cm59YVtkKzU0Pj4wXT0xO2k9aDtyZXR1cm59ZnVuY3Rpb24gdW4oYSl7YT1hfDA7dmFyIGI9MCxkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MDtiPWk7ZG97aWYoYT4+PjA8MjQ1KXtpZihhPj4+MDwxMSl7YT0xNn1lbHNle2E9YSsxMSYtOH12PWE+Pj4zO3A9Y1s1NTQyXXwwO3c9cD4+PnY7aWYoKHcmM3wwKSE9MCl7aD0odyYxXjEpK3Z8MDtnPWg8PDE7ZT0yMjIwOCsoZzw8Mil8MDtnPTIyMjA4KyhnKzI8PDIpfDA7aj1jW2c+PjJdfDA7ZD1qKzh8MDtmPWNbZD4+Ml18MDtkb3tpZigoZXwwKSE9KGZ8MCkpe2lmKGY+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9az1mKzEyfDA7aWYoKGNbaz4+Ml18MCk9PShqfDApKXtjW2s+PjJdPWU7Y1tnPj4yXT1mO2JyZWFrfWVsc2V7WGIoKX19ZWxzZXtjWzU1NDJdPXAmfigxPDxoKX19d2hpbGUoMCk7SD1oPDwzO2Nbais0Pj4yXT1IfDM7SD1qKyhIfDQpfDA7Y1tIPj4yXT1jW0g+PjJdfDE7SD1kO2k9YjtyZXR1cm4gSHwwfWlmKGE+Pj4wPihjWzIyMTc2Pj4yXXwwKT4+PjApe2lmKCh3fDApIT0wKXtoPTI8PHY7aD13PDx2JihofDAtaCk7aD0oaCYwLWgpKyAtMXwwO2Q9aD4+PjEyJjE2O2g9aD4+PmQ7Zj1oPj4+NSY4O2g9aD4+PmY7Zz1oPj4+MiY0O2g9aD4+Pmc7ZT1oPj4+MSYyO2g9aD4+PmU7aj1oPj4+MSYxO2o9KGZ8ZHxnfGV8aikrKGg+Pj5qKXwwO2g9ajw8MTtlPTIyMjA4KyhoPDwyKXwwO2g9MjIyMDgrKGgrMjw8Mil8MDtnPWNbaD4+Ml18MDtkPWcrOHwwO2Y9Y1tkPj4yXXwwO2Rve2lmKChlfDApIT0oZnwwKSl7aWYoZj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1rPWYrMTJ8MDtpZigoY1trPj4yXXwwKT09KGd8MCkpe2Nbaz4+Ml09ZTtjW2g+PjJdPWY7YnJlYWt9ZWxzZXtYYigpfX1lbHNle2NbNTU0Ml09cCZ+KDE8PGopfX13aGlsZSgwKTtoPWo8PDM7Zj1oLWF8MDtjW2crND4+Ml09YXwzO2U9ZythfDA7Y1tnKyhhfDQpPj4yXT1mfDE7Y1tnK2g+PjJdPWY7aD1jWzIyMTc2Pj4yXXwwO2lmKChofDApIT0wKXtnPWNbMjIxODg+PjJdfDA7az1oPj4+MztqPWs8PDE7aD0yMjIwOCsoajw8Mil8MDtsPWNbNTU0Ml18MDtrPTE8PGs7aWYoKGwma3wwKSE9MCl7aj0yMjIwOCsoaisyPDwyKXwwO2s9Y1tqPj4yXXwwO2lmKGs+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtEPWo7Qz1rfX1lbHNle2NbNTU0Ml09bHxrO0Q9MjIyMDgrKGorMjw8Mil8MDtDPWh9Y1tEPj4yXT1nO2NbQysxMj4+Ml09ZztjW2crOD4+Ml09QztjW2crMTI+PjJdPWh9Y1syMjE3Nj4+Ml09ZjtjWzIyMTg4Pj4yXT1lO0g9ZDtpPWI7cmV0dXJuIEh8MH1wPWNbMjIxNzI+PjJdfDA7aWYoKHB8MCkhPTApe2U9KHAmMC1wKSsgLTF8MDtHPWU+Pj4xMiYxNjtlPWU+Pj5HO0Y9ZT4+PjUmODtlPWU+Pj5GO0g9ZT4+PjImNDtlPWU+Pj5IO2Y9ZT4+PjEmMjtlPWU+Pj5mO2Q9ZT4+PjEmMTtkPWNbMjI0NzIrKChGfEd8SHxmfGQpKyhlPj4+ZCk8PDIpPj4yXXwwO2U9KGNbZCs0Pj4yXSYtOCktYXwwO2Y9ZDt3aGlsZSgxKXtnPWNbZisxNj4+Ml18MDtpZigoZ3wwKT09MCl7Zz1jW2YrMjA+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfX1mPShjW2crND4+Ml0mLTgpLWF8MDtIPWY+Pj4wPGU+Pj4wO2U9SD9mOmU7Zj1nO2Q9SD9nOmR9aD1jWzIyMTg0Pj4yXXwwO2lmKGQ+Pj4wPGg+Pj4wKXtYYigpfWY9ZCthfDA7aWYoIShkPj4+MDxmPj4+MCkpe1hiKCl9Zz1jW2QrMjQ+PjJdfDA7az1jW2QrMTI+PjJdfDA7ZG97aWYoKGt8MCk9PShkfDApKXtrPWQrMjB8MDtqPWNbaz4+Ml18MDtpZigoanwwKT09MCl7az1kKzE2fDA7aj1jW2s+PjJdfDA7aWYoKGp8MCk9PTApe0I9MDticmVha319d2hpbGUoMSl7bD1qKzIwfDA7bT1jW2w+PjJdfDA7aWYoKG18MCkhPTApe2o9bTtrPWw7Y29udGludWV9bT1qKzE2fDA7bD1jW20+PjJdfDA7aWYoKGx8MCk9PTApe2JyZWFrfWVsc2V7aj1sO2s9bX19aWYoaz4+PjA8aD4+PjApe1hiKCl9ZWxzZXtjW2s+PjJdPTA7Qj1qO2JyZWFrfX1lbHNle2o9Y1tkKzg+PjJdfDA7aWYoaj4+PjA8aD4+PjApe1hiKCl9aD1qKzEyfDA7aWYoKGNbaD4+Ml18MCkhPShkfDApKXtYYigpfWw9ays4fDA7aWYoKGNbbD4+Ml18MCk9PShkfDApKXtjW2g+PjJdPWs7Y1tsPj4yXT1qO0I9azticmVha31lbHNle1hiKCl9fX13aGlsZSgwKTtkb3tpZigoZ3wwKSE9MCl7aD1jW2QrMjg+PjJdfDA7aj0yMjQ3MisoaDw8Mil8MDtpZigoZHwwKT09KGNbaj4+Ml18MCkpe2Nbaj4+Ml09QjtpZigoQnwwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxoKTticmVha319ZWxzZXtpZihnPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWg9ZysxNnwwO2lmKChjW2g+PjJdfDApPT0oZHwwKSl7Y1toPj4yXT1CfWVsc2V7Y1tnKzIwPj4yXT1CfWlmKChCfDApPT0wKXticmVha319aWYoQj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW0IrMjQ+PjJdPWc7Zz1jW2QrMTY+PjJdfDA7ZG97aWYoKGd8MCkhPTApe2lmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW0IrMTY+PjJdPWc7Y1tnKzI0Pj4yXT1CO2JyZWFrfX19d2hpbGUoMCk7Zz1jW2QrMjA+PjJdfDA7aWYoKGd8MCkhPTApe2lmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW0IrMjA+PjJdPWc7Y1tnKzI0Pj4yXT1CO2JyZWFrfX19fXdoaWxlKDApO2lmKGU+Pj4wPDE2KXtIPWUrYXwwO2NbZCs0Pj4yXT1IfDM7SD1kKyhIKzQpfDA7Y1tIPj4yXT1jW0g+PjJdfDF9ZWxzZXtjW2QrND4+Ml09YXwzO2NbZCsoYXw0KT4+Ml09ZXwxO2NbZCsoZSthKT4+Ml09ZTtoPWNbMjIxNzY+PjJdfDA7aWYoKGh8MCkhPTApe2c9Y1syMjE4OD4+Ml18MDtsPWg+Pj4zO2o9bDw8MTtoPTIyMjA4KyhqPDwyKXwwO2s9Y1s1NTQyXXwwO2w9MTw8bDtpZigoayZsfDApIT0wKXtqPTIyMjA4KyhqKzI8PDIpfDA7az1jW2o+PjJdfDA7aWYoaz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle0E9ajt6PWt9fWVsc2V7Y1s1NTQyXT1rfGw7QT0yMjIwOCsoaisyPDwyKXwwO3o9aH1jW0E+PjJdPWc7Y1t6KzEyPj4yXT1nO2NbZys4Pj4yXT16O2NbZysxMj4+Ml09aH1jWzIyMTc2Pj4yXT1lO2NbMjIxODg+PjJdPWZ9SD1kKzh8MDtpPWI7cmV0dXJuIEh8MH19fWVsc2V7aWYoIShhPj4+MD40Mjk0OTY3MjMxKSl7ej1hKzExfDA7YT16Ji04O0I9Y1syMjE3Mj4+Ml18MDtpZigoQnwwKSE9MCl7QT0wLWF8MDt6PXo+Pj44O2lmKCh6fDApIT0wKXtpZihhPj4+MD4xNjc3NzIxNSl7Qz0zMX1lbHNle0c9KHorMTA0ODMyMHwwKT4+PjE2Jjg7SD16PDxHO0Y9KEgrNTIwMTkyfDApPj4+MTYmNDtIPUg8PEY7Qz0oSCsyNDU3NjB8MCk+Pj4xNiYyO0M9MTQtKEZ8R3xDKSsoSDw8Qz4+PjE1KXwwO0M9YT4+PihDKzd8MCkmMXxDPDwxfX1lbHNle0M9MH1EPWNbMjI0NzIrKEM8PDIpPj4yXXwwO2E6ZG97aWYoKER8MCk9PTApe0Y9MDt6PTB9ZWxzZXtpZigoQ3wwKT09MzEpe3o9MH1lbHNle3o9MjUtKEM+Pj4xKXwwfUY9MDtFPWE8PHo7ej0wO3doaWxlKDEpe0g9Y1tEKzQ+PjJdJi04O0c9SC1hfDA7aWYoRz4+PjA8QT4+PjApe2lmKChIfDApPT0oYXwwKSl7QT1HO0Y9RDt6PUQ7YnJlYWsgYX1lbHNle0E9Rzt6PUR9fUg9Y1tEKzIwPj4yXXwwO0Q9Y1tEKyhFPj4+MzE8PDIpKzE2Pj4yXXwwO0Y9KEh8MCk9PTB8KEh8MCk9PShEfDApP0Y6SDtpZigoRHwwKT09MCl7YnJlYWt9ZWxzZXtFPUU8PDF9fX19d2hpbGUoMCk7aWYoKEZ8MCk9PTAmKHp8MCk9PTApe0g9Mjw8QztCPUImKEh8MC1IKTtpZigoQnwwKT09MCl7YnJlYWt9SD0oQiYwLUIpKyAtMXwwO0Q9SD4+PjEyJjE2O0g9SD4+PkQ7Qz1IPj4+NSY4O0g9SD4+PkM7RT1IPj4+MiY0O0g9SD4+PkU7Rz1IPj4+MSYyO0g9SD4+Pkc7Rj1IPj4+MSYxO0Y9Y1syMjQ3MisoKEN8RHxFfEd8RikrKEg+Pj5GKTw8Mik+PjJdfDB9aWYoKEZ8MCkhPTApe3doaWxlKDEpe0g9KGNbRis0Pj4yXSYtOCktYXwwO0I9SD4+PjA8QT4+PjA7QT1CP0g6QTt6PUI/Rjp6O0I9Y1tGKzE2Pj4yXXwwO2lmKChCfDApIT0wKXtGPUI7Y29udGludWV9Rj1jW0YrMjA+PjJdfDA7aWYoKEZ8MCk9PTApe2JyZWFrfX19aWYoKHp8MCkhPTA/QT4+PjA8KChjWzIyMTc2Pj4yXXwwKS1hfDApPj4+MDowKXtmPWNbMjIxODQ+PjJdfDA7aWYoej4+PjA8Zj4+PjApe1hiKCl9ZD16K2F8MDtpZighKHo+Pj4wPGQ+Pj4wKSl7WGIoKX1lPWNbeisyND4+Ml18MDtoPWNbeisxMj4+Ml18MDtkb3tpZigoaHwwKT09KHp8MCkpe2g9eisyMHwwO2c9Y1toPj4yXXwwO2lmKChnfDApPT0wKXtoPXorMTZ8MDtnPWNbaD4+Ml18MDtpZigoZ3wwKT09MCl7eD0wO2JyZWFrfX13aGlsZSgxKXtqPWcrMjB8MDtrPWNbaj4+Ml18MDtpZigoa3wwKSE9MCl7Zz1rO2g9ajtjb250aW51ZX1qPWcrMTZ8MDtrPWNbaj4+Ml18MDtpZigoa3wwKT09MCl7YnJlYWt9ZWxzZXtnPWs7aD1qfX1pZihoPj4+MDxmPj4+MCl7WGIoKX1lbHNle2NbaD4+Ml09MDt4PWc7YnJlYWt9fWVsc2V7Zz1jW3orOD4+Ml18MDtpZihnPj4+MDxmPj4+MCl7WGIoKX1mPWcrMTJ8MDtpZigoY1tmPj4yXXwwKSE9KHp8MCkpe1hiKCl9aj1oKzh8MDtpZigoY1tqPj4yXXwwKT09KHp8MCkpe2NbZj4+Ml09aDtjW2o+PjJdPWc7eD1oO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2Rve2lmKChlfDApIT0wKXtnPWNbeisyOD4+Ml18MDtmPTIyNDcyKyhnPDwyKXwwO2lmKCh6fDApPT0oY1tmPj4yXXwwKSl7Y1tmPj4yXT14O2lmKCh4fDApPT0wKXtjWzIyMTcyPj4yXT1jWzIyMTcyPj4yXSZ+KDE8PGcpO2JyZWFrfX1lbHNle2lmKGU+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9Zj1lKzE2fDA7aWYoKGNbZj4+Ml18MCk9PSh6fDApKXtjW2Y+PjJdPXh9ZWxzZXtjW2UrMjA+PjJdPXh9aWYoKHh8MCk9PTApe2JyZWFrfX1pZih4Pj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWNbeCsyND4+Ml09ZTtlPWNbeisxNj4+Ml18MDtkb3tpZigoZXwwKSE9MCl7aWYoZT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbeCsxNj4+Ml09ZTtjW2UrMjQ+PjJdPXg7YnJlYWt9fX13aGlsZSgwKTtlPWNbeisyMD4+Ml18MDtpZigoZXwwKSE9MCl7aWYoZT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbeCsyMD4+Ml09ZTtjW2UrMjQ+PjJdPXg7YnJlYWt9fX19d2hpbGUoMCk7Yjpkb3tpZighKEE+Pj4wPDE2KSl7Y1t6KzQ+PjJdPWF8MztjW3orKGF8NCk+PjJdPUF8MTtjW3orKEErYSk+PjJdPUE7Zj1BPj4+MztpZihBPj4+MDwyNTYpe2g9Zjw8MTtlPTIyMjA4KyhoPDwyKXwwO2c9Y1s1NTQyXXwwO2Y9MTw8Zjtkb3tpZigoZyZmfDApPT0wKXtjWzU1NDJdPWd8Zjt3PTIyMjA4KyhoKzI8PDIpfDA7dj1lfWVsc2V7Zj0yMjIwOCsoaCsyPDwyKXwwO2c9Y1tmPj4yXXwwO2lmKCEoZz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCkpe3c9Zjt2PWc7YnJlYWt9WGIoKX19d2hpbGUoMCk7Y1t3Pj4yXT1kO2NbdisxMj4+Ml09ZDtjW3orKGErOCk+PjJdPXY7Y1t6KyhhKzEyKT4+Ml09ZTticmVha31lPUE+Pj44O2lmKChlfDApIT0wKXtpZihBPj4+MD4xNjc3NzIxNSl7ZT0zMX1lbHNle0c9KGUrMTA0ODMyMHwwKT4+PjE2Jjg7SD1lPDxHO0Y9KEgrNTIwMTkyfDApPj4+MTYmNDtIPUg8PEY7ZT0oSCsyNDU3NjB8MCk+Pj4xNiYyO2U9MTQtKEZ8R3xlKSsoSDw8ZT4+PjE1KXwwO2U9QT4+PihlKzd8MCkmMXxlPDwxfX1lbHNle2U9MH1mPTIyNDcyKyhlPDwyKXwwO2NbeisoYSsyOCk+PjJdPWU7Y1t6KyhhKzIwKT4+Ml09MDtjW3orKGErMTYpPj4yXT0wO2g9Y1syMjE3Mj4+Ml18MDtnPTE8PGU7aWYoKGgmZ3wwKT09MCl7Y1syMjE3Mj4+Ml09aHxnO2NbZj4+Ml09ZDtjW3orKGErMjQpPj4yXT1mO2NbeisoYSsxMik+PjJdPWQ7Y1t6KyhhKzgpPj4yXT1kO2JyZWFrfWY9Y1tmPj4yXXwwO2lmKChlfDApPT0zMSl7ZT0wfWVsc2V7ZT0yNS0oZT4+PjEpfDB9Yzpkb3tpZigoY1tmKzQ+PjJdJi04fDApIT0oQXwwKSl7ZT1BPDxlO3doaWxlKDEpe2c9ZisoZT4+PjMxPDwyKSsxNnwwO2g9Y1tnPj4yXXwwO2lmKChofDApPT0wKXticmVha31pZigoY1toKzQ+PjJdJi04fDApPT0oQXwwKSl7cD1oO2JyZWFrIGN9ZWxzZXtlPWU8PDE7Zj1ofX1pZihnPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1tnPj4yXT1kO2NbeisoYSsyNCk+PjJdPWY7Y1t6KyhhKzEyKT4+Ml09ZDtjW3orKGErOCk+PjJdPWQ7YnJlYWsgYn19ZWxzZXtwPWZ9fXdoaWxlKDApO2Y9cCs4fDA7ZT1jW2Y+PjJdfDA7Zz1jWzIyMTg0Pj4yXXwwO2lmKHA+Pj4wPGc+Pj4wKXtYYigpfWlmKGU+Pj4wPGc+Pj4wKXtYYigpfWVsc2V7Y1tlKzEyPj4yXT1kO2NbZj4+Ml09ZDtjW3orKGErOCk+PjJdPWU7Y1t6KyhhKzEyKT4+Ml09cDtjW3orKGErMjQpPj4yXT0wO2JyZWFrfX1lbHNle0g9QSthfDA7Y1t6KzQ+PjJdPUh8MztIPXorKEgrNCl8MDtjW0g+PjJdPWNbSD4+Ml18MX19d2hpbGUoMCk7SD16Kzh8MDtpPWI7cmV0dXJuIEh8MH19fWVsc2V7YT0tMX19fXdoaWxlKDApO3A9Y1syMjE3Nj4+Ml18MDtpZighKGE+Pj4wPnA+Pj4wKSl7ZT1wLWF8MDtkPWNbMjIxODg+PjJdfDA7aWYoZT4+PjA+MTUpe2NbMjIxODg+PjJdPWQrYTtjWzIyMTc2Pj4yXT1lO2NbZCsoYSs0KT4+Ml09ZXwxO2NbZCtwPj4yXT1lO2NbZCs0Pj4yXT1hfDN9ZWxzZXtjWzIyMTc2Pj4yXT0wO2NbMjIxODg+PjJdPTA7Y1tkKzQ+PjJdPXB8MztIPWQrKHArNCl8MDtjW0g+PjJdPWNbSD4+Ml18MX1IPWQrOHwwO2k9YjtyZXR1cm4gSHwwfXA9Y1syMjE4MD4+Ml18MDtpZihhPj4+MDxwPj4+MCl7Rz1wLWF8MDtjWzIyMTgwPj4yXT1HO0g9Y1syMjE5Mj4+Ml18MDtjWzIyMTkyPj4yXT1IK2E7Y1tIKyhhKzQpPj4yXT1HfDE7Y1tIKzQ+PjJdPWF8MztIPUgrOHwwO2k9YjtyZXR1cm4gSHwwfWRve2lmKChjWzU2NjBdfDApPT0wKXtwPXNiKDMwKXwwO2lmKChwKyAtMSZwfDApPT0wKXtjWzIyNjQ4Pj4yXT1wO2NbMjI2NDQ+PjJdPXA7Y1syMjY1Mj4+Ml09LTE7Y1syMjY1Nj4+Ml09LTE7Y1syMjY2MD4+Ml09MDtjWzIyNjEyPj4yXT0wO2NbNTY2MF09KF9iKDApfDApJi0xNl4xNDMxNjU1NzY4O2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO3c9YSs0OHwwO3A9Y1syMjY0OD4+Ml18MDt4PWErNDd8MDt6PXAreHwwO3A9MC1wfDA7dj16JnA7aWYoISh2Pj4+MD5hPj4+MCkpe0g9MDtpPWI7cmV0dXJuIEh8MH1BPWNbMjI2MDg+PjJdfDA7aWYoKEF8MCkhPTA/KEc9Y1syMjYwMD4+Ml18MCxIPUcrdnwwLEg+Pj4wPD1HPj4+MHxIPj4+MD5BPj4+MCk6MCl7SD0wO2k9YjtyZXR1cm4gSHwwfWQ6ZG97aWYoKGNbMjI2MTI+PjJdJjR8MCk9PTApe0I9Y1syMjE5Mj4+Ml18MDtlOmRve2lmKChCfDApIT0wKXtBPTIyNjE2fDA7d2hpbGUoMSl7Qz1jW0E+PjJdfDA7aWYoIShDPj4+MD5CPj4+MCk/KHk9QSs0fDAsKEMrKGNbeT4+Ml18MCl8MCk+Pj4wPkI+Pj4wKTowKXticmVha31BPWNbQSs4Pj4yXXwwO2lmKChBfDApPT0wKXtvPTE4MjticmVhayBlfX1pZigoQXwwKSE9MCl7Qj16LShjWzIyMTgwPj4yXXwwKSZwO2lmKEI+Pj4wPDIxNDc0ODM2NDcpe3A9aGIoQnwwKXwwO0E9KHB8MCk9PSgoY1tBPj4yXXwwKSsoY1t5Pj4yXXwwKXwwKTt5PXA7ej1CO3A9QT9wOi0xO0E9QT9COjA7bz0xOTF9ZWxzZXtBPTB9fWVsc2V7bz0xODJ9fWVsc2V7bz0xODJ9fXdoaWxlKDApO2Rve2lmKChvfDApPT0xODIpe3A9aGIoMCl8MDtpZigocHwwKSE9KC0xfDApKXt6PXA7QT1jWzIyNjQ0Pj4yXXwwO3k9QSsgLTF8MDtpZigoeSZ6fDApPT0wKXtBPXZ9ZWxzZXtBPXYteisoeSt6JjAtQSl8MH15PWNbMjI2MDA+PjJdfDA7ej15K0F8MDtpZihBPj4+MD5hPj4+MCZBPj4+MDwyMTQ3NDgzNjQ3KXtIPWNbMjI2MDg+PjJdfDA7aWYoKEh8MCkhPTA/ej4+PjA8PXk+Pj4wfHo+Pj4wPkg+Pj4wOjApe0E9MDticmVha315PWhiKEF8MCl8MDtvPSh5fDApPT0ocHwwKTt6PUE7cD1vP3A6LTE7QT1vP0E6MDtvPTE5MX1lbHNle0E9MH19ZWxzZXtBPTB9fX13aGlsZSgwKTtmOmRve2lmKChvfDApPT0xOTEpe289MC16fDA7aWYoKHB8MCkhPSgtMXwwKSl7cT1BO289MjAyO2JyZWFrIGR9ZG97aWYoKHl8MCkhPSgtMXwwKSZ6Pj4+MDwyMTQ3NDgzNjQ3Jno+Pj4wPHc+Pj4wPyh1PWNbMjI2NDg+PjJdfDAsdT14LXordSYwLXUsdT4+PjA8MjE0NzQ4MzY0Nyk6MCl7aWYoKGhiKHV8MCl8MCk9PSgtMXwwKSl7aGIob3wwKXwwO2JyZWFrIGZ9ZWxzZXt6PXUrenwwO2JyZWFrfX19d2hpbGUoMCk7aWYoKHl8MCkhPSgtMXwwKSl7cD15O3E9ejtvPTIwMjticmVhayBkfX19d2hpbGUoMCk7Y1syMjYxMj4+Ml09Y1syMjYxMj4+Ml18NDtvPTE5OX1lbHNle0E9MDtvPTE5OX19d2hpbGUoMCk7aWYoKCgob3wwKT09MTk5P3Y+Pj4wPDIxNDc0ODM2NDc6MCk/KHQ9aGIodnwwKXwwLHM9aGIoMCl8MCwoc3wwKSE9KC0xfDApJih0fDApIT0oLTF8MCkmdD4+PjA8cz4+PjApOjApPyhyPXMtdHwwLHE9cj4+PjA+KGErNDB8MCk+Pj4wLHEpOjApe3A9dDtxPXE/cjpBO289MjAyfWlmKChvfDApPT0yMDIpe3I9KGNbMjI2MDA+PjJdfDApK3F8MDtjWzIyNjAwPj4yXT1yO2lmKHI+Pj4wPihjWzIyNjA0Pj4yXXwwKT4+PjApe2NbMjI2MDQ+PjJdPXJ9cj1jWzIyMTkyPj4yXXwwO2c6ZG97aWYoKHJ8MCkhPTApe3Y9MjI2MTZ8MDt3aGlsZSgxKXt0PWNbdj4+Ml18MDt1PXYrNHwwO3M9Y1t1Pj4yXXwwO2lmKChwfDApPT0odCtzfDApKXtvPTIxNDticmVha313PWNbdis4Pj4yXXwwO2lmKCh3fDApPT0wKXticmVha31lbHNle3Y9d319aWYoKChvfDApPT0yMTQ/KGNbdisxMj4+Ml0mOHwwKT09MDowKT9yPj4+MD49dD4+PjAmcj4+PjA8cD4+PjA6MCl7Y1t1Pj4yXT1zK3E7ZD0oY1syMjE4MD4+Ml18MCkrcXwwO2U9cis4fDA7aWYoKGUmN3wwKT09MCl7ZT0wfWVsc2V7ZT0wLWUmN31IPWQtZXwwO2NbMjIxOTI+PjJdPXIrZTtjWzIyMTgwPj4yXT1IO2NbcisoZSs0KT4+Ml09SHwxO2NbcisoZCs0KT4+Ml09NDA7Y1syMjE5Nj4+Ml09Y1syMjY1Nj4+Ml07YnJlYWt9aWYocD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7Y1syMjE4ND4+Ml09cH10PXArcXwwO3M9MjI2MTZ8MDt3aGlsZSgxKXtpZigoY1tzPj4yXXwwKT09KHR8MCkpe289MjI0O2JyZWFrfXU9Y1tzKzg+PjJdfDA7aWYoKHV8MCk9PTApe2JyZWFrfWVsc2V7cz11fX1pZigob3wwKT09MjI0PyhjW3MrMTI+PjJdJjh8MCk9PTA6MCl7Y1tzPj4yXT1wO2g9cys0fDA7Y1toPj4yXT0oY1toPj4yXXwwKStxO2g9cCs4fDA7aWYoKGgmN3wwKT09MCl7aD0wfWVsc2V7aD0wLWgmN31qPXArKHErOCl8MDtpZigoaiY3fDApPT0wKXtuPTB9ZWxzZXtuPTAtaiY3fW89cCsobitxKXwwO2o9aCthfDA7az1wK2p8MDttPW8tKHAraCktYXwwO2NbcCsoaCs0KT4+Ml09YXwzO2g6ZG97aWYoKG98MCkhPShjWzIyMTkyPj4yXXwwKSl7aWYoKG98MCk9PShjWzIyMTg4Pj4yXXwwKSl7SD0oY1syMjE3Nj4+Ml18MCkrbXwwO2NbMjIxNzY+PjJdPUg7Y1syMjE4OD4+Ml09aztjW3ArKGorNCk+PjJdPUh8MTtjW3ArKEgraik+PjJdPUg7YnJlYWt9cj1xKzR8MDt0PWNbcCsocituKT4+Ml18MDtpZigodCYzfDApPT0xKXthPXQmLTg7cz10Pj4+MztpOmRve2lmKCEodD4+PjA8MjU2KSl7bD1jW3ArKChufDI0KStxKT4+Ml18MDt1PWNbcCsocSsxMituKT4+Ml18MDtkb3tpZigodXwwKT09KG98MCkpe3U9bnwxNjt0PXArKHIrdSl8MDtzPWNbdD4+Ml18MDtpZigoc3wwKT09MCl7dD1wKyh1K3EpfDA7cz1jW3Q+PjJdfDA7aWYoKHN8MCk9PTApe2c9MDticmVha319d2hpbGUoMSl7dT1zKzIwfDA7dj1jW3U+PjJdfDA7aWYoKHZ8MCkhPTApe3M9djt0PXU7Y29udGludWV9dT1zKzE2fDA7dj1jW3U+PjJdfDA7aWYoKHZ8MCk9PTApe2JyZWFrfWVsc2V7cz12O3Q9dX19aWYodD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbdD4+Ml09MDtnPXM7YnJlYWt9fWVsc2V7dD1jW3ArKChufDgpK3EpPj4yXXwwO2lmKHQ+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9dj10KzEyfDA7aWYoKGNbdj4+Ml18MCkhPShvfDApKXtYYigpfXM9dSs4fDA7aWYoKGNbcz4+Ml18MCk9PShvfDApKXtjW3Y+PjJdPXU7Y1tzPj4yXT10O2c9dTticmVha31lbHNle1hiKCl9fX13aGlsZSgwKTtpZigobHwwKT09MCl7YnJlYWt9dD1jW3ArKHErMjgrbik+PjJdfDA7cz0yMjQ3MisodDw8Mil8MDtkb3tpZigob3wwKSE9KGNbcz4+Ml18MCkpe2lmKGw+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9cz1sKzE2fDA7aWYoKGNbcz4+Ml18MCk9PShvfDApKXtjW3M+PjJdPWd9ZWxzZXtjW2wrMjA+PjJdPWd9aWYoKGd8MCk9PTApe2JyZWFrIGl9fWVsc2V7Y1tzPj4yXT1nO2lmKChnfDApIT0wKXticmVha31jWzIyMTcyPj4yXT1jWzIyMTcyPj4yXSZ+KDE8PHQpO2JyZWFrIGl9fXdoaWxlKDApO2lmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9Y1tnKzI0Pj4yXT1sO2w9bnwxNjtvPWNbcCsobCtxKT4+Ml18MDtkb3tpZigob3wwKSE9MCl7aWYobz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbZysxNj4+Ml09bztjW28rMjQ+PjJdPWc7YnJlYWt9fX13aGlsZSgwKTtsPWNbcCsocitsKT4+Ml18MDtpZigobHwwKT09MCl7YnJlYWt9aWYobD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbZysyMD4+Ml09bDtjW2wrMjQ+PjJdPWc7YnJlYWt9fWVsc2V7cj1jW3ArKChufDgpK3EpPj4yXXwwO2c9Y1twKyhxKzEyK24pPj4yXXwwO3Q9MjIyMDgrKHM8PDE8PDIpfDA7ZG97aWYoKHJ8MCkhPSh0fDApKXtpZihyPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWlmKChjW3IrMTI+PjJdfDApPT0ob3wwKSl7YnJlYWt9WGIoKX19d2hpbGUoMCk7aWYoKGd8MCk9PShyfDApKXtjWzU1NDJdPWNbNTU0Ml0mfigxPDxzKTticmVha31kb3tpZigoZ3wwKT09KHR8MCkpe2w9Zys4fDB9ZWxzZXtpZihnPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfXM9Zys4fDA7aWYoKGNbcz4+Ml18MCk9PShvfDApKXtsPXM7YnJlYWt9WGIoKX19d2hpbGUoMCk7Y1tyKzEyPj4yXT1nO2NbbD4+Ml09cn19d2hpbGUoMCk7bz1wKygoYXxuKStxKXwwO209YSttfDB9Zz1vKzR8MDtjW2c+PjJdPWNbZz4+Ml0mLTI7Y1twKyhqKzQpPj4yXT1tfDE7Y1twKyhtK2opPj4yXT1tO2c9bT4+PjM7aWYobT4+PjA8MjU2KXttPWc8PDE7ZD0yMjIwOCsobTw8Mil8MDtsPWNbNTU0Ml18MDtnPTE8PGc7ZG97aWYoKGwmZ3wwKT09MCl7Y1s1NTQyXT1sfGc7Zj0yMjIwOCsobSsyPDwyKXwwO2U9ZH1lbHNle2w9MjIyMDgrKG0rMjw8Mil8MDtnPWNbbD4+Ml18MDtpZighKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApKXtmPWw7ZT1nO2JyZWFrfVhiKCl9fXdoaWxlKDApO2NbZj4+Ml09aztjW2UrMTI+PjJdPWs7Y1twKyhqKzgpPj4yXT1lO2NbcCsoaisxMik+PjJdPWQ7YnJlYWt9ZT1tPj4+ODtkb3tpZigoZXwwKT09MCl7ZT0wfWVsc2V7aWYobT4+PjA+MTY3NzcyMTUpe2U9MzE7YnJlYWt9Rz0oZSsxMDQ4MzIwfDApPj4+MTYmODtIPWU8PEc7Rj0oSCs1MjAxOTJ8MCk+Pj4xNiY0O0g9SDw8RjtlPShIKzI0NTc2MHwwKT4+PjE2JjI7ZT0xNC0oRnxHfGUpKyhIPDxlPj4+MTUpfDA7ZT1tPj4+KGUrN3wwKSYxfGU8PDF9fXdoaWxlKDApO2w9MjI0NzIrKGU8PDIpfDA7Y1twKyhqKzI4KT4+Ml09ZTtjW3ArKGorMjApPj4yXT0wO2NbcCsoaisxNik+PjJdPTA7Zj1jWzIyMTcyPj4yXXwwO2c9MTw8ZTtpZigoZiZnfDApPT0wKXtjWzIyMTcyPj4yXT1mfGc7Y1tsPj4yXT1rO2NbcCsoaisyNCk+PjJdPWw7Y1twKyhqKzEyKT4+Ml09aztjW3ArKGorOCk+PjJdPWs7YnJlYWt9bD1jW2w+PjJdfDA7aWYoKGV8MCk9PTMxKXtlPTB9ZWxzZXtlPTI1LShlPj4+MSl8MH1qOmRve2lmKChjW2wrND4+Ml0mLTh8MCkhPShtfDApKXtlPW08PGU7d2hpbGUoMSl7Zz1sKyhlPj4+MzE8PDIpKzE2fDA7Zj1jW2c+PjJdfDA7aWYoKGZ8MCk9PTApe2JyZWFrfWlmKChjW2YrND4+Ml0mLTh8MCk9PShtfDApKXtkPWY7YnJlYWsgan1lbHNle2U9ZTw8MTtsPWZ9fWlmKGc+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2c+PjJdPWs7Y1twKyhqKzI0KT4+Ml09bDtjW3ArKGorMTIpPj4yXT1rO2NbcCsoais4KT4+Ml09azticmVhayBofX1lbHNle2Q9bH19d2hpbGUoMCk7Zj1kKzh8MDtlPWNbZj4+Ml18MDtnPWNbMjIxODQ+PjJdfDA7aWYoZD4+PjA8Zz4+PjApe1hiKCl9aWYoZT4+PjA8Zz4+PjApe1hiKCl9ZWxzZXtjW2UrMTI+PjJdPWs7Y1tmPj4yXT1rO2NbcCsoais4KT4+Ml09ZTtjW3ArKGorMTIpPj4yXT1kO2NbcCsoaisyNCk+PjJdPTA7YnJlYWt9fWVsc2V7SD0oY1syMjE4MD4+Ml18MCkrbXwwO2NbMjIxODA+PjJdPUg7Y1syMjE5Mj4+Ml09aztjW3ArKGorNCk+PjJdPUh8MX19d2hpbGUoMCk7SD1wKyhofDgpfDA7aT1iO3JldHVybiBIfDB9ZT0yMjYxNnwwO3doaWxlKDEpe2Q9Y1tlPj4yXXwwO2lmKCEoZD4+PjA+cj4+PjApPyhuPWNbZSs0Pj4yXXwwLG09ZCtufDAsbT4+PjA+cj4+PjApOjApe2JyZWFrfWU9Y1tlKzg+PjJdfDB9ZT1kKyhuKyAtMzkpfDA7aWYoKGUmN3wwKT09MCl7ZT0wfWVsc2V7ZT0wLWUmN31kPWQrKG4rIC00NytlKXwwO2Q9ZD4+PjA8KHIrMTZ8MCk+Pj4wP3I6ZDtlPWQrOHwwO2Y9cCs4fDA7aWYoKGYmN3wwKT09MCl7Zj0wfWVsc2V7Zj0wLWYmN31IPXErIC00MC1mfDA7Y1syMjE5Mj4+Ml09cCtmO2NbMjIxODA+PjJdPUg7Y1twKyhmKzQpPj4yXT1IfDE7Y1twKyhxKyAtMzYpPj4yXT00MDtjWzIyMTk2Pj4yXT1jWzIyNjU2Pj4yXTtjW2QrND4+Ml09Mjc7Y1tlKzA+PjJdPWNbMjI2MTY+PjJdO2NbZSs0Pj4yXT1jWzIyNjIwPj4yXTtjW2UrOD4+Ml09Y1syMjYyND4+Ml07Y1tlKzEyPj4yXT1jWzIyNjI4Pj4yXTtjWzIyNjE2Pj4yXT1wO2NbMjI2MjA+PjJdPXE7Y1syMjYyOD4+Ml09MDtjWzIyNjI0Pj4yXT1lO2U9ZCsyOHwwO2NbZT4+Ml09NztpZigoZCszMnwwKT4+PjA8bT4+PjApe2Rve0g9ZTtlPWUrNHwwO2NbZT4+Ml09N313aGlsZSgoSCs4fDApPj4+MDxtPj4+MCl9aWYoKGR8MCkhPShyfDApKXtkPWQtcnwwO2U9cisoZCs0KXwwO2NbZT4+Ml09Y1tlPj4yXSYtMjtjW3IrND4+Ml09ZHwxO2NbcitkPj4yXT1kO2U9ZD4+PjM7aWYoZD4+PjA8MjU2KXtnPWU8PDE7ZD0yMjIwOCsoZzw8Mil8MDtmPWNbNTU0Ml18MDtlPTE8PGU7ZG97aWYoKGYmZXwwKT09MCl7Y1s1NTQyXT1mfGU7az0yMjIwOCsoZysyPDwyKXwwO2o9ZH1lbHNle2Y9MjIyMDgrKGcrMjw8Mil8MDtlPWNbZj4+Ml18MDtpZighKGU+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApKXtrPWY7aj1lO2JyZWFrfVhiKCl9fXdoaWxlKDApO2Nbaz4+Ml09cjtjW2orMTI+PjJdPXI7Y1tyKzg+PjJdPWo7Y1tyKzEyPj4yXT1kO2JyZWFrfWU9ZD4+Pjg7aWYoKGV8MCkhPTApe2lmKGQ+Pj4wPjE2Nzc3MjE1KXtlPTMxfWVsc2V7Rz0oZSsxMDQ4MzIwfDApPj4+MTYmODtIPWU8PEc7Rj0oSCs1MjAxOTJ8MCk+Pj4xNiY0O0g9SDw8RjtlPShIKzI0NTc2MHwwKT4+PjE2JjI7ZT0xNC0oRnxHfGUpKyhIPDxlPj4+MTUpfDA7ZT1kPj4+KGUrN3wwKSYxfGU8PDF9fWVsc2V7ZT0wfWo9MjI0NzIrKGU8PDIpfDA7Y1tyKzI4Pj4yXT1lO2NbcisyMD4+Ml09MDtjW3IrMTY+PjJdPTA7Zj1jWzIyMTcyPj4yXXwwO2c9MTw8ZTtpZigoZiZnfDApPT0wKXtjWzIyMTcyPj4yXT1mfGc7Y1tqPj4yXT1yO2NbcisyND4+Ml09ajtjW3IrMTI+PjJdPXI7Y1tyKzg+PjJdPXI7YnJlYWt9Zj1jW2o+PjJdfDA7aWYoKGV8MCk9PTMxKXtlPTB9ZWxzZXtlPTI1LShlPj4+MSl8MH1rOmRve2lmKChjW2YrND4+Ml0mLTh8MCkhPShkfDApKXtlPWQ8PGU7d2hpbGUoMSl7aj1mKyhlPj4+MzE8PDIpKzE2fDA7Zz1jW2o+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWlmKChjW2crND4+Ml0mLTh8MCk9PShkfDApKXtoPWc7YnJlYWsga31lbHNle2U9ZTw8MTtmPWd9fWlmKGo+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2o+PjJdPXI7Y1tyKzI0Pj4yXT1mO2NbcisxMj4+Ml09cjtjW3IrOD4+Ml09cjticmVhayBnfX1lbHNle2g9Zn19d2hpbGUoMCk7Zj1oKzh8MDtlPWNbZj4+Ml18MDtkPWNbMjIxODQ+PjJdfDA7aWYoaD4+PjA8ZD4+PjApe1hiKCl9aWYoZT4+PjA8ZD4+PjApe1hiKCl9ZWxzZXtjW2UrMTI+PjJdPXI7Y1tmPj4yXT1yO2Nbcis4Pj4yXT1lO2NbcisxMj4+Ml09aDtjW3IrMjQ+PjJdPTA7YnJlYWt9fX1lbHNle0g9Y1syMjE4ND4+Ml18MDtpZigoSHwwKT09MHxwPj4+MDxIPj4+MCl7Y1syMjE4ND4+Ml09cH1jWzIyNjE2Pj4yXT1wO2NbMjI2MjA+PjJdPXE7Y1syMjYyOD4+Ml09MDtjWzIyMjA0Pj4yXT1jWzU2NjBdO2NbMjIyMDA+PjJdPS0xO2Q9MDtkb3tIPWQ8PDE7Rz0yMjIwOCsoSDw8Mil8MDtjWzIyMjA4KyhIKzM8PDIpPj4yXT1HO2NbMjIyMDgrKEgrMjw8Mik+PjJdPUc7ZD1kKzF8MH13aGlsZSgoZHwwKSE9MzIpO2Q9cCs4fDA7aWYoKGQmN3wwKT09MCl7ZD0wfWVsc2V7ZD0wLWQmN31IPXErIC00MC1kfDA7Y1syMjE5Mj4+Ml09cCtkO2NbMjIxODA+PjJdPUg7Y1twKyhkKzQpPj4yXT1IfDE7Y1twKyhxKyAtMzYpPj4yXT00MDtjWzIyMTk2Pj4yXT1jWzIyNjU2Pj4yXX19d2hpbGUoMCk7ZD1jWzIyMTgwPj4yXXwwO2lmKGQ+Pj4wPmE+Pj4wKXtHPWQtYXwwO2NbMjIxODA+PjJdPUc7SD1jWzIyMTkyPj4yXXwwO2NbMjIxOTI+PjJdPUgrYTtjW0grKGErNCk+PjJdPUd8MTtjW0grND4+Ml09YXwzO0g9SCs4fDA7aT1iO3JldHVybiBIfDB9fWNbKGJiKCl8MCk+PjJdPTEyO0g9MDtpPWI7cmV0dXJuIEh8MH1mdW5jdGlvbiB2bihhKXthPWF8MDt2YXIgYj0wLGQ9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MDtiPWk7aWYoKGF8MCk9PTApe2k9YjtyZXR1cm59cT1hKyAtOHwwO3I9Y1syMjE4ND4+Ml18MDtpZihxPj4+MDxyPj4+MCl7WGIoKX1vPWNbYSsgLTQ+PjJdfDA7bj1vJjM7aWYoKG58MCk9PTEpe1hiKCl9aj1vJi04O2g9YSsoaisgLTgpfDA7ZG97aWYoKG8mMXwwKT09MCl7dT1jW3E+PjJdfDA7aWYoKG58MCk9PTApe2k9YjtyZXR1cm59cT0tOC11fDA7bz1hK3F8MDtuPXUranwwO2lmKG8+Pj4wPHI+Pj4wKXtYYigpfWlmKChvfDApPT0oY1syMjE4OD4+Ml18MCkpe2Q9YSsoaisgLTQpfDA7aWYoKGNbZD4+Ml0mM3wwKSE9Myl7ZD1vO209bjticmVha31jWzIyMTc2Pj4yXT1uO2NbZD4+Ml09Y1tkPj4yXSYtMjtjW2ErKHErNCk+PjJdPW58MTtjW2g+PjJdPW47aT1iO3JldHVybn10PXU+Pj4zO2lmKHU+Pj4wPDI1Nil7ZD1jW2ErKHErOCk+PjJdfDA7bT1jW2ErKHErMTIpPj4yXXwwO3A9MjIyMDgrKHQ8PDE8PDIpfDA7aWYoKGR8MCkhPShwfDApKXtpZihkPj4+MDxyPj4+MCl7WGIoKX1pZigoY1tkKzEyPj4yXXwwKSE9KG98MCkpe1hiKCl9fWlmKChtfDApPT0oZHwwKSl7Y1s1NTQyXT1jWzU1NDJdJn4oMTw8dCk7ZD1vO209bjticmVha31pZigobXwwKSE9KHB8MCkpe2lmKG0+Pj4wPHI+Pj4wKXtYYigpfXA9bSs4fDA7aWYoKGNbcD4+Ml18MCk9PShvfDApKXtzPXB9ZWxzZXtYYigpfX1lbHNle3M9bSs4fDB9Y1tkKzEyPj4yXT1tO2Nbcz4+Ml09ZDtkPW87bT1uO2JyZWFrfXM9Y1thKyhxKzI0KT4+Ml18MDt0PWNbYSsocSsxMik+PjJdfDA7ZG97aWYoKHR8MCk9PShvfDApKXt1PWErKHErMjApfDA7dD1jW3U+PjJdfDA7aWYoKHR8MCk9PTApe3U9YSsocSsxNil8MDt0PWNbdT4+Ml18MDtpZigodHwwKT09MCl7cD0wO2JyZWFrfX13aGlsZSgxKXt3PXQrMjB8MDt2PWNbdz4+Ml18MDtpZigodnwwKSE9MCl7dD12O3U9dztjb250aW51ZX12PXQrMTZ8MDt3PWNbdj4+Ml18MDtpZigod3wwKT09MCl7YnJlYWt9ZWxzZXt0PXc7dT12fX1pZih1Pj4+MDxyPj4+MCl7WGIoKX1lbHNle2NbdT4+Ml09MDtwPXQ7YnJlYWt9fWVsc2V7dT1jW2ErKHErOCk+PjJdfDA7aWYodT4+PjA8cj4+PjApe1hiKCl9cj11KzEyfDA7aWYoKGNbcj4+Ml18MCkhPShvfDApKXtYYigpfXY9dCs4fDA7aWYoKGNbdj4+Ml18MCk9PShvfDApKXtjW3I+PjJdPXQ7Y1t2Pj4yXT11O3A9dDticmVha31lbHNle1hiKCl9fX13aGlsZSgwKTtpZigoc3wwKSE9MCl7dD1jW2ErKHErMjgpPj4yXXwwO3I9MjI0NzIrKHQ8PDIpfDA7aWYoKG98MCk9PShjW3I+PjJdfDApKXtjW3I+PjJdPXA7aWYoKHB8MCk9PTApe2NbMjIxNzI+PjJdPWNbMjIxNzI+PjJdJn4oMTw8dCk7ZD1vO209bjticmVha319ZWxzZXtpZihzPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfXI9cysxNnwwO2lmKChjW3I+PjJdfDApPT0ob3wwKSl7Y1tyPj4yXT1wfWVsc2V7Y1tzKzIwPj4yXT1wfWlmKChwfDApPT0wKXtkPW87bT1uO2JyZWFrfX1pZihwPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWNbcCsyND4+Ml09cztyPWNbYSsocSsxNik+PjJdfDA7ZG97aWYoKHJ8MCkhPTApe2lmKHI+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW3ArMTY+PjJdPXI7Y1tyKzI0Pj4yXT1wO2JyZWFrfX19d2hpbGUoMCk7cT1jW2ErKHErMjApPj4yXXwwO2lmKChxfDApIT0wKXtpZihxPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1twKzIwPj4yXT1xO2NbcSsyND4+Ml09cDtkPW87bT1uO2JyZWFrfX1lbHNle2Q9bzttPW59fWVsc2V7ZD1vO209bn19ZWxzZXtkPXE7bT1qfX13aGlsZSgwKTtpZighKGQ+Pj4wPGg+Pj4wKSl7WGIoKX1uPWErKGorIC00KXwwO289Y1tuPj4yXXwwO2lmKChvJjF8MCk9PTApe1hiKCl9aWYoKG8mMnwwKT09MCl7aWYoKGh8MCk9PShjWzIyMTkyPj4yXXwwKSl7dz0oY1syMjE4MD4+Ml18MCkrbXwwO2NbMjIxODA+PjJdPXc7Y1syMjE5Mj4+Ml09ZDtjW2QrND4+Ml09d3wxO2lmKChkfDApIT0oY1syMjE4OD4+Ml18MCkpe2k9YjtyZXR1cm59Y1syMjE4OD4+Ml09MDtjWzIyMTc2Pj4yXT0wO2k9YjtyZXR1cm59aWYoKGh8MCk9PShjWzIyMTg4Pj4yXXwwKSl7dz0oY1syMjE3Nj4+Ml18MCkrbXwwO2NbMjIxNzY+PjJdPXc7Y1syMjE4OD4+Ml09ZDtjW2QrND4+Ml09d3wxO2NbZCt3Pj4yXT13O2k9YjtyZXR1cm59bT0obyYtOCkrbXwwO249bz4+PjM7ZG97aWYoIShvPj4+MDwyNTYpKXtsPWNbYSsoaisxNik+PjJdfDA7cT1jW2ErKGp8NCk+PjJdfDA7ZG97aWYoKHF8MCk9PShofDApKXtvPWErKGorMTIpfDA7bj1jW28+PjJdfDA7aWYoKG58MCk9PTApe289YSsoais4KXwwO249Y1tvPj4yXXwwO2lmKChufDApPT0wKXtrPTA7YnJlYWt9fXdoaWxlKDEpe3A9bisyMHwwO3E9Y1twPj4yXXwwO2lmKChxfDApIT0wKXtuPXE7bz1wO2NvbnRpbnVlfXA9bisxNnwwO3E9Y1twPj4yXXwwO2lmKChxfDApPT0wKXticmVha31lbHNle249cTtvPXB9fWlmKG8+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW28+PjJdPTA7az1uO2JyZWFrfX1lbHNle289Y1thK2o+PjJdfDA7aWYobz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1wPW8rMTJ8MDtpZigoY1twPj4yXXwwKSE9KGh8MCkpe1hiKCl9bj1xKzh8MDtpZigoY1tuPj4yXXwwKT09KGh8MCkpe2NbcD4+Ml09cTtjW24+PjJdPW87az1xO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2lmKChsfDApIT0wKXtuPWNbYSsoaisyMCk+PjJdfDA7bz0yMjQ3Misobjw8Mil8MDtpZigoaHwwKT09KGNbbz4+Ml18MCkpe2Nbbz4+Ml09aztpZigoa3wwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxuKTticmVha319ZWxzZXtpZihsPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfW49bCsxNnwwO2lmKChjW24+PjJdfDApPT0oaHwwKSl7Y1tuPj4yXT1rfWVsc2V7Y1tsKzIwPj4yXT1rfWlmKChrfDApPT0wKXticmVha319aWYoaz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2srMjQ+PjJdPWw7aD1jW2ErKGorOCk+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKGg+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2srMTY+PjJdPWg7Y1toKzI0Pj4yXT1rO2JyZWFrfX19d2hpbGUoMCk7aD1jW2ErKGorMTIpPj4yXXwwO2lmKChofDApIT0wKXtpZihoPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1trKzIwPj4yXT1oO2NbaCsyND4+Ml09azticmVha319fX1lbHNle2s9Y1thK2o+PjJdfDA7YT1jW2ErKGp8NCk+PjJdfDA7aj0yMjIwOCsobjw8MTw8Mil8MDtpZigoa3wwKSE9KGp8MCkpe2lmKGs+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9aWYoKGNbaysxMj4+Ml18MCkhPShofDApKXtYYigpfX1pZigoYXwwKT09KGt8MCkpe2NbNTU0Ml09Y1s1NTQyXSZ+KDE8PG4pO2JyZWFrfWlmKChhfDApIT0oanwwKSl7aWYoYT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1qPWErOHwwO2lmKChjW2o+PjJdfDApPT0oaHwwKSl7bD1qfWVsc2V7WGIoKX19ZWxzZXtsPWErOHwwfWNbaysxMj4+Ml09YTtjW2w+PjJdPWt9fXdoaWxlKDApO2NbZCs0Pj4yXT1tfDE7Y1tkK20+PjJdPW07aWYoKGR8MCk9PShjWzIyMTg4Pj4yXXwwKSl7Y1syMjE3Nj4+Ml09bTtpPWI7cmV0dXJufX1lbHNle2Nbbj4+Ml09byYtMjtjW2QrND4+Ml09bXwxO2NbZCttPj4yXT1tfWg9bT4+PjM7aWYobT4+PjA8MjU2KXthPWg8PDE7ZT0yMjIwOCsoYTw8Mil8MDtqPWNbNTU0Ml18MDtoPTE8PGg7aWYoKGomaHwwKSE9MCl7aD0yMjIwOCsoYSsyPDwyKXwwO2E9Y1toPj4yXXwwO2lmKGE+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtmPWg7Zz1hfX1lbHNle2NbNTU0Ml09anxoO2Y9MjIyMDgrKGErMjw8Mil8MDtnPWV9Y1tmPj4yXT1kO2NbZysxMj4+Ml09ZDtjW2QrOD4+Ml09ZztjW2QrMTI+PjJdPWU7aT1iO3JldHVybn1mPW0+Pj44O2lmKChmfDApIT0wKXtpZihtPj4+MD4xNjc3NzIxNSl7Zj0zMX1lbHNle3Y9KGYrMTA0ODMyMHwwKT4+PjE2Jjg7dz1mPDx2O3U9KHcrNTIwMTkyfDApPj4+MTYmNDt3PXc8PHU7Zj0odysyNDU3NjB8MCk+Pj4xNiYyO2Y9MTQtKHV8dnxmKSsodzw8Zj4+PjE1KXwwO2Y9bT4+PihmKzd8MCkmMXxmPDwxfX1lbHNle2Y9MH1nPTIyNDcyKyhmPDwyKXwwO2NbZCsyOD4+Ml09ZjtjW2QrMjA+PjJdPTA7Y1tkKzE2Pj4yXT0wO2E9Y1syMjE3Mj4+Ml18MDtoPTE8PGY7YTpkb3tpZigoYSZofDApIT0wKXtnPWNbZz4+Ml18MDtpZigoZnwwKT09MzEpe2Y9MH1lbHNle2Y9MjUtKGY+Pj4xKXwwfWI6ZG97aWYoKGNbZys0Pj4yXSYtOHwwKSE9KG18MCkpe2Y9bTw8ZjthPWc7d2hpbGUoMSl7aD1hKyhmPj4+MzE8PDIpKzE2fDA7Zz1jW2g+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWlmKChjW2crND4+Ml0mLTh8MCk9PShtfDApKXtlPWc7YnJlYWsgYn1lbHNle2Y9Zjw8MTthPWd9fWlmKGg+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2g+PjJdPWQ7Y1tkKzI0Pj4yXT1hO2NbZCsxMj4+Ml09ZDtjW2QrOD4+Ml09ZDticmVhayBhfX1lbHNle2U9Z319d2hpbGUoMCk7Zz1lKzh8MDtmPWNbZz4+Ml18MDtoPWNbMjIxODQ+PjJdfDA7aWYoZT4+PjA8aD4+PjApe1hiKCl9aWYoZj4+PjA8aD4+PjApe1hiKCl9ZWxzZXtjW2YrMTI+PjJdPWQ7Y1tnPj4yXT1kO2NbZCs4Pj4yXT1mO2NbZCsxMj4+Ml09ZTtjW2QrMjQ+PjJdPTA7YnJlYWt9fWVsc2V7Y1syMjE3Mj4+Ml09YXxoO2NbZz4+Ml09ZDtjW2QrMjQ+PjJdPWc7Y1tkKzEyPj4yXT1kO2NbZCs4Pj4yXT1kfX13aGlsZSgwKTt3PShjWzIyMjAwPj4yXXwwKSsgLTF8MDtjWzIyMjAwPj4yXT13O2lmKCh3fDApPT0wKXtkPTIyNjI0fDB9ZWxzZXtpPWI7cmV0dXJufXdoaWxlKDEpe2Q9Y1tkPj4yXXwwO2lmKChkfDApPT0wKXticmVha31lbHNle2Q9ZCs4fDB9fWNbMjIyMDA+PjJdPS0xO2k9YjtyZXR1cm59ZnVuY3Rpb24gd24oYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtkPWk7aWYoKGF8MCk9PTApe3I9dW4oYil8MDtpPWQ7cmV0dXJuIHJ8MH1pZihiPj4+MD40Mjk0OTY3MjMxKXtjWyhiYigpfDApPj4yXT0xMjtyPTA7aT1kO3JldHVybiByfDB9aWYoYj4+PjA8MTEpe2Y9MTZ9ZWxzZXtmPWIrMTEmLTh9ZT1hKyAtNHwwO2s9Y1tlPj4yXXwwO2w9ayYtODtvPWwrIC04fDA7aD1hK298MDttPWNbMjIxODQ+PjJdfDA7aWYoKGErIC04fDApPj4+MDxtPj4+MCl7WGIoKX1yPWsmMztpZighKChyfDApIT0xJihvfDApPi04KSl7WGIoKX1vPWx8NDtxPWErKG8rIC04KXwwO3A9Y1txPj4yXXwwO2lmKChwJjF8MCk9PTApe1hiKCl9ZG97aWYoKHJ8MCk9PTApe2lmKCEoZj4+PjA8MjU2fGw+Pj4wPChmfDQpPj4+MCk/ISgobC1mfDApPj4+MD5jWzIyNjQ4Pj4yXTw8MT4+PjApOjApe3I9YTtpPWQ7cmV0dXJuIHJ8MH19ZWxzZXtpZighKGw+Pj4wPGY+Pj4wKSl7Zz1sLWZ8MDtpZighKGc+Pj4wPjE1KSl7cj1hO2k9ZDtyZXR1cm4gcnwwfWNbZT4+Ml09ayYxfGZ8MjtjW2ErKChmfDQpKyAtOCk+PjJdPWd8MztjW3E+PjJdPWNbcT4+Ml18MTt4bihhKyhmKyAtOCl8MCxnKTtyPWE7aT1kO3JldHVybiByfDB9aWYoKGh8MCk9PShjWzIyMTkyPj4yXXwwKSl7Zz0oY1syMjE4MD4+Ml18MCkrbHwwO2lmKCEoZz4+PjA+Zj4+PjApKXticmVha31yPWctZnwwO2NbZT4+Ml09ayYxfGZ8MjtjW2ErKChmfDQpKyAtOCk+PjJdPXJ8MTtjWzIyMTkyPj4yXT1hKyhmKyAtOCk7Y1syMjE4MD4+Ml09cjtyPWE7aT1kO3JldHVybiByfDB9aWYoKGh8MCk9PShjWzIyMTg4Pj4yXXwwKSl7Zz0oY1syMjE3Nj4+Ml18MCkrbHwwO2lmKGc+Pj4wPGY+Pj4wKXticmVha31oPWctZnwwO2lmKGg+Pj4wPjE1KXtjW2U+PjJdPWsmMXxmfDI7Y1thKygoZnw0KSsgLTgpPj4yXT1ofDE7Y1thKyhnKyAtOCk+PjJdPWg7ZT1hKyhnKyAtNCl8MDtjW2U+PjJdPWNbZT4+Ml0mLTI7ZT1hKyhmKyAtOCl8MH1lbHNle2NbZT4+Ml09ayYxfGd8MjtlPWErKGcrIC00KXwwO2NbZT4+Ml09Y1tlPj4yXXwxO2U9MDtoPTB9Y1syMjE3Nj4+Ml09aDtjWzIyMTg4Pj4yXT1lO3I9YTtpPWQ7cmV0dXJuIHJ8MH1pZigocCYyfDApPT0wPyhnPShwJi04KStsfDAsIShnPj4+MDxmPj4+MCkpOjApe2s9Zy1mfDA7Yj1wPj4+Mztkb3tpZighKHA+Pj4wPDI1Nikpe249Y1thKyhsKzE2KT4+Ml18MDtvPWNbYStvPj4yXXwwO2Rve2lmKChvfDApPT0oaHwwKSl7Yj1hKyhsKzEyKXwwO289Y1tiPj4yXXwwO2lmKChvfDApPT0wKXtiPWErKGwrOCl8MDtvPWNbYj4+Ml18MDtpZigob3wwKT09MCl7aj0wO2JyZWFrfX13aGlsZSgxKXtxPW8rMjB8MDtwPWNbcT4+Ml18MDtpZigocHwwKSE9MCl7bz1wO2I9cTtjb250aW51ZX1wPW8rMTZ8MDtxPWNbcD4+Ml18MDtpZigocXwwKT09MCl7YnJlYWt9ZWxzZXtvPXE7Yj1wfX1pZihiPj4+MDxtPj4+MCl7WGIoKX1lbHNle2NbYj4+Ml09MDtqPW87YnJlYWt9fWVsc2V7Yj1jW2ErbD4+Ml18MDtpZihiPj4+MDxtPj4+MCl7WGIoKX1wPWIrMTJ8MDtpZigoY1twPj4yXXwwKSE9KGh8MCkpe1hiKCl9bT1vKzh8MDtpZigoY1ttPj4yXXwwKT09KGh8MCkpe2NbcD4+Ml09bztjW20+PjJdPWI7aj1vO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2lmKChufDApIT0wKXtvPWNbYSsobCsyMCk+PjJdfDA7bT0yMjQ3Misobzw8Mil8MDtpZigoaHwwKT09KGNbbT4+Ml18MCkpe2NbbT4+Ml09ajtpZigoanwwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxvKTticmVha319ZWxzZXtpZihuPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfW09bisxNnwwO2lmKChjW20+PjJdfDApPT0oaHwwKSl7Y1ttPj4yXT1qfWVsc2V7Y1tuKzIwPj4yXT1qfWlmKChqfDApPT0wKXticmVha319aWYoaj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2orMjQ+PjJdPW47aD1jW2ErKGwrOCk+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKGg+Pj4wPChjWzIyMTg0Pj4yXXwwKT4+PjApe1hiKCl9ZWxzZXtjW2orMTY+PjJdPWg7Y1toKzI0Pj4yXT1qO2JyZWFrfX19d2hpbGUoMCk7aD1jW2ErKGwrMTIpPj4yXXwwO2lmKChofDApPT0wKXticmVha31pZihoPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1tqKzIwPj4yXT1oO2NbaCsyND4+Ml09ajticmVha319fWVsc2V7aj1jW2ErbD4+Ml18MDtsPWNbYStvPj4yXXwwO289MjIyMDgrKGI8PDE8PDIpfDA7aWYoKGp8MCkhPShvfDApKXtpZihqPj4+MDxtPj4+MCl7WGIoKX1pZigoY1tqKzEyPj4yXXwwKSE9KGh8MCkpe1hiKCl9fWlmKChsfDApPT0oanwwKSl7Y1s1NTQyXT1jWzU1NDJdJn4oMTw8Yik7YnJlYWt9ZG97aWYoKGx8MCk9PShvfDApKXtuPWwrOHwwfWVsc2V7aWYobD4+PjA8bT4+PjApe1hiKCl9bT1sKzh8MDtpZigoY1ttPj4yXXwwKT09KGh8MCkpe249bTticmVha31YYigpfX13aGlsZSgwKTtjW2orMTI+PjJdPWw7Y1tuPj4yXT1qfX13aGlsZSgwKTtpZihrPj4+MDwxNil7Y1tlPj4yXT1nfGNbZT4+Ml0mMXwyO3I9YSsoKGd8NCkrIC04KXwwO2Nbcj4+Ml09Y1tyPj4yXXwxO3I9YTtpPWQ7cmV0dXJuIHJ8MH1lbHNle2NbZT4+Ml09Y1tlPj4yXSYxfGZ8MjtjW2ErKChmfDQpKyAtOCk+PjJdPWt8MztyPWErKChnfDQpKyAtOCl8MDtjW3I+PjJdPWNbcj4+Ml18MTt4bihhKyhmKyAtOCl8MCxrKTtyPWE7aT1kO3JldHVybiByfDB9fX19d2hpbGUoMCk7Zj11bihiKXwwO2lmKChmfDApPT0wKXtyPTA7aT1kO3JldHVybiByfDB9cj1jW2U+PjJdfDA7cj0ociYtOCktKChyJjN8MCk9PTA/ODo0KXwwO0xuKGZ8MCxhfDAsKHI+Pj4wPGI+Pj4wP3I6Yil8MCl8MDt2bihhKTtyPWY7aT1kO3JldHVybiByfDB9ZnVuY3Rpb24geG4oYSxiKXthPWF8MDtiPWJ8MDt2YXIgZD0wLGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTA7ZD1pO2g9YStifDA7bD1jW2ErND4+Ml18MDtkb3tpZigobCYxfDApPT0wKXtwPWNbYT4+Ml18MDtpZigobCYzfDApPT0wKXtpPWQ7cmV0dXJufWw9YSsoMC1wKXwwO209cCtifDA7cT1jWzIyMTg0Pj4yXXwwO2lmKGw+Pj4wPHE+Pj4wKXtYYigpfWlmKChsfDApPT0oY1syMjE4OD4+Ml18MCkpe2U9YSsoYis0KXwwO2lmKChjW2U+PjJdJjN8MCkhPTMpe2U9bDtuPW07YnJlYWt9Y1syMjE3Nj4+Ml09bTtjW2U+PjJdPWNbZT4+Ml0mLTI7Y1thKyg0LXApPj4yXT1tfDE7Y1toPj4yXT1tO2k9ZDtyZXR1cm59cz1wPj4+MztpZihwPj4+MDwyNTYpe2U9Y1thKyg4LXApPj4yXXwwO249Y1thKygxMi1wKT4+Ml18MDtvPTIyMjA4KyhzPDwxPDwyKXwwO2lmKChlfDApIT0ob3wwKSl7aWYoZT4+PjA8cT4+PjApe1hiKCl9aWYoKGNbZSsxMj4+Ml18MCkhPShsfDApKXtYYigpfX1pZigobnwwKT09KGV8MCkpe2NbNTU0Ml09Y1s1NTQyXSZ+KDE8PHMpO2U9bDtuPW07YnJlYWt9aWYoKG58MCkhPShvfDApKXtpZihuPj4+MDxxPj4+MCl7WGIoKX1vPW4rOHwwO2lmKChjW28+PjJdfDApPT0obHwwKSl7cj1vfWVsc2V7WGIoKX19ZWxzZXtyPW4rOHwwfWNbZSsxMj4+Ml09bjtjW3I+PjJdPWU7ZT1sO249bTticmVha31yPWNbYSsoMjQtcCk+PjJdfDA7dD1jW2ErKDEyLXApPj4yXXwwO2Rve2lmKCh0fDApPT0obHwwKSl7dT0xNi1wfDA7dD1hKyh1KzQpfDA7cz1jW3Q+PjJdfDA7aWYoKHN8MCk9PTApe3Q9YSt1fDA7cz1jW3Q+PjJdfDA7aWYoKHN8MCk9PTApe289MDticmVha319d2hpbGUoMSl7dT1zKzIwfDA7dj1jW3U+PjJdfDA7aWYoKHZ8MCkhPTApe3M9djt0PXU7Y29udGludWV9dj1zKzE2fDA7dT1jW3Y+PjJdfDA7aWYoKHV8MCk9PTApe2JyZWFrfWVsc2V7cz11O3Q9dn19aWYodD4+PjA8cT4+PjApe1hiKCl9ZWxzZXtjW3Q+PjJdPTA7bz1zO2JyZWFrfX1lbHNle3M9Y1thKyg4LXApPj4yXXwwO2lmKHM+Pj4wPHE+Pj4wKXtYYigpfXU9cysxMnwwO2lmKChjW3U+PjJdfDApIT0obHwwKSl7WGIoKX1xPXQrOHwwO2lmKChjW3E+PjJdfDApPT0obHwwKSl7Y1t1Pj4yXT10O2NbcT4+Ml09cztvPXQ7YnJlYWt9ZWxzZXtYYigpfX19d2hpbGUoMCk7aWYoKHJ8MCkhPTApe3E9Y1thKygyOC1wKT4+Ml18MDtzPTIyNDcyKyhxPDwyKXwwO2lmKChsfDApPT0oY1tzPj4yXXwwKSl7Y1tzPj4yXT1vO2lmKChvfDApPT0wKXtjWzIyMTcyPj4yXT1jWzIyMTcyPj4yXSZ+KDE8PHEpO2U9bDtuPW07YnJlYWt9fWVsc2V7aWYocj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1xPXIrMTZ8MDtpZigoY1txPj4yXXwwKT09KGx8MCkpe2NbcT4+Ml09b31lbHNle2NbcisyMD4+Ml09b31pZigob3wwKT09MCl7ZT1sO249bTticmVha319aWYobz4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW28rMjQ+PjJdPXI7cD0xNi1wfDA7cT1jW2ErcD4+Ml18MDtkb3tpZigocXwwKSE9MCl7aWYocT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbbysxNj4+Ml09cTtjW3ErMjQ+PjJdPW87YnJlYWt9fX13aGlsZSgwKTtwPWNbYSsocCs0KT4+Ml18MDtpZigocHwwKSE9MCl7aWYocD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbbysyMD4+Ml09cDtjW3ArMjQ+PjJdPW87ZT1sO249bTticmVha319ZWxzZXtlPWw7bj1tfX1lbHNle2U9bDtuPW19fWVsc2V7ZT1hO249Yn19d2hpbGUoMCk7bD1jWzIyMTg0Pj4yXXwwO2lmKGg+Pj4wPGw+Pj4wKXtYYigpfW09YSsoYis0KXwwO289Y1ttPj4yXXwwO2lmKChvJjJ8MCk9PTApe2lmKChofDApPT0oY1syMjE5Mj4+Ml18MCkpe3Y9KGNbMjIxODA+PjJdfDApK258MDtjWzIyMTgwPj4yXT12O2NbMjIxOTI+PjJdPWU7Y1tlKzQ+PjJdPXZ8MTtpZigoZXwwKSE9KGNbMjIxODg+PjJdfDApKXtpPWQ7cmV0dXJufWNbMjIxODg+PjJdPTA7Y1syMjE3Nj4+Ml09MDtpPWQ7cmV0dXJufWlmKChofDApPT0oY1syMjE4OD4+Ml18MCkpe3Y9KGNbMjIxNzY+PjJdfDApK258MDtjWzIyMTc2Pj4yXT12O2NbMjIxODg+PjJdPWU7Y1tlKzQ+PjJdPXZ8MTtjW2Urdj4+Ml09djtpPWQ7cmV0dXJufW49KG8mLTgpK258MDttPW8+Pj4zO2Rve2lmKCEobz4+PjA8MjU2KSl7az1jW2ErKGIrMjQpPj4yXXwwO209Y1thKyhiKzEyKT4+Ml18MDtkb3tpZigobXwwKT09KGh8MCkpe289YSsoYisyMCl8MDttPWNbbz4+Ml18MDtpZigobXwwKT09MCl7bz1hKyhiKzE2KXwwO209Y1tvPj4yXXwwO2lmKChtfDApPT0wKXtqPTA7YnJlYWt9fXdoaWxlKDEpe3E9bSsyMHwwO3A9Y1txPj4yXXwwO2lmKChwfDApIT0wKXttPXA7bz1xO2NvbnRpbnVlfXA9bSsxNnwwO3E9Y1twPj4yXXwwO2lmKChxfDApPT0wKXticmVha31lbHNle209cTtvPXB9fWlmKG8+Pj4wPGw+Pj4wKXtYYigpfWVsc2V7Y1tvPj4yXT0wO2o9bTticmVha319ZWxzZXtvPWNbYSsoYis4KT4+Ml18MDtpZihvPj4+MDxsPj4+MCl7WGIoKX1sPW8rMTJ8MDtpZigoY1tsPj4yXXwwKSE9KGh8MCkpe1hiKCl9cD1tKzh8MDtpZigoY1twPj4yXXwwKT09KGh8MCkpe2NbbD4+Ml09bTtjW3A+PjJdPW87aj1tO2JyZWFrfWVsc2V7WGIoKX19fXdoaWxlKDApO2lmKChrfDApIT0wKXtsPWNbYSsoYisyOCk+PjJdfDA7bT0yMjQ3MisobDw8Mil8MDtpZigoaHwwKT09KGNbbT4+Ml18MCkpe2NbbT4+Ml09ajtpZigoanwwKT09MCl7Y1syMjE3Mj4+Ml09Y1syMjE3Mj4+Ml0mfigxPDxsKTticmVha319ZWxzZXtpZihrPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWw9aysxNnwwO2lmKChjW2w+PjJdfDApPT0oaHwwKSl7Y1tsPj4yXT1qfWVsc2V7Y1trKzIwPj4yXT1qfWlmKChqfDApPT0wKXticmVha319aWYoaj4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2orMjQ+PjJdPWs7aD1jW2ErKGIrMTYpPj4yXXwwO2Rve2lmKChofDApIT0wKXtpZihoPj4+MDwoY1syMjE4ND4+Ml18MCk+Pj4wKXtYYigpfWVsc2V7Y1tqKzE2Pj4yXT1oO2NbaCsyND4+Ml09ajticmVha319fXdoaWxlKDApO2g9Y1thKyhiKzIwKT4+Ml18MDtpZigoaHwwKSE9MCl7aWYoaD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2NbaisyMD4+Ml09aDtjW2grMjQ+PjJdPWo7YnJlYWt9fX19ZWxzZXtqPWNbYSsoYis4KT4+Ml18MDthPWNbYSsoYisxMik+PjJdfDA7Yj0yMjIwOCsobTw8MTw8Mil8MDtpZigoanwwKSE9KGJ8MCkpe2lmKGo+Pj4wPGw+Pj4wKXtYYigpfWlmKChjW2orMTI+PjJdfDApIT0oaHwwKSl7WGIoKX19aWYoKGF8MCk9PShqfDApKXtjWzU1NDJdPWNbNTU0Ml0mfigxPDxtKTticmVha31pZigoYXwwKSE9KGJ8MCkpe2lmKGE+Pj4wPGw+Pj4wKXtYYigpfWI9YSs4fDA7aWYoKGNbYj4+Ml18MCk9PShofDApKXtrPWJ9ZWxzZXtYYigpfX1lbHNle2s9YSs4fDB9Y1tqKzEyPj4yXT1hO2Nbaz4+Ml09an19d2hpbGUoMCk7Y1tlKzQ+PjJdPW58MTtjW2Urbj4+Ml09bjtpZigoZXwwKT09KGNbMjIxODg+PjJdfDApKXtjWzIyMTc2Pj4yXT1uO2k9ZDtyZXR1cm59fWVsc2V7Y1ttPj4yXT1vJi0yO2NbZSs0Pj4yXT1ufDE7Y1tlK24+PjJdPW59YT1uPj4+MztpZihuPj4+MDwyNTYpe2I9YTw8MTtoPTIyMjA4KyhiPDwyKXwwO2o9Y1s1NTQyXXwwO2E9MTw8YTtpZigoaiZhfDApIT0wKXtiPTIyMjA4KyhiKzI8PDIpfDA7YT1jW2I+PjJdfDA7aWYoYT4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1lbHNle2c9YjtmPWF9fWVsc2V7Y1s1NTQyXT1qfGE7Zz0yMjIwOCsoYisyPDwyKXwwO2Y9aH1jW2c+PjJdPWU7Y1tmKzEyPj4yXT1lO2NbZSs4Pj4yXT1mO2NbZSsxMj4+Ml09aDtpPWQ7cmV0dXJufWY9bj4+Pjg7aWYoKGZ8MCkhPTApe2lmKG4+Pj4wPjE2Nzc3MjE1KXtmPTMxfWVsc2V7dT0oZisxMDQ4MzIwfDApPj4+MTYmODt2PWY8PHU7dD0odis1MjAxOTJ8MCk+Pj4xNiY0O3Y9djw8dDtmPSh2KzI0NTc2MHwwKT4+PjE2JjI7Zj0xNC0odHx1fGYpKyh2PDxmPj4+MTUpfDA7Zj1uPj4+KGYrN3wwKSYxfGY8PDF9fWVsc2V7Zj0wfWE9MjI0NzIrKGY8PDIpfDA7Y1tlKzI4Pj4yXT1mO2NbZSsyMD4+Ml09MDtjW2UrMTY+PjJdPTA7aD1jWzIyMTcyPj4yXXwwO2c9MTw8ZjtpZigoaCZnfDApPT0wKXtjWzIyMTcyPj4yXT1ofGc7Y1thPj4yXT1lO2NbZSsyND4+Ml09YTtjW2UrMTI+PjJdPWU7Y1tlKzg+PjJdPWU7aT1kO3JldHVybn1nPWNbYT4+Ml18MDtpZigoZnwwKT09MzEpe2Y9MH1lbHNle2Y9MjUtKGY+Pj4xKXwwfWE6ZG97aWYoKGNbZys0Pj4yXSYtOHwwKSE9KG58MCkpe2Y9bjw8ZjthPWc7d2hpbGUoMSl7aD1hKyhmPj4+MzE8PDIpKzE2fDA7Zz1jW2g+PjJdfDA7aWYoKGd8MCk9PTApe2JyZWFrfWlmKChjW2crND4+Ml0mLTh8MCk9PShufDApKXticmVhayBhfWVsc2V7Zj1mPDwxO2E9Z319aWYoaD4+PjA8KGNbMjIxODQ+PjJdfDApPj4+MCl7WGIoKX1jW2g+PjJdPWU7Y1tlKzI0Pj4yXT1hO2NbZSsxMj4+Ml09ZTtjW2UrOD4+Ml09ZTtpPWQ7cmV0dXJufX13aGlsZSgwKTtmPWcrOHwwO2E9Y1tmPj4yXXwwO2g9Y1syMjE4ND4+Ml18MDtpZihnPj4+MDxoPj4+MCl7WGIoKX1pZihhPj4+MDxoPj4+MCl7WGIoKX1jW2ErMTI+PjJdPWU7Y1tmPj4yXT1lO2NbZSs4Pj4yXT1hO2NbZSsxMj4+Ml09ZztjW2UrMjQ+PjJdPTA7aT1kO3JldHVybn1mdW5jdGlvbiB5bihhKXthPWF8MDt2YXIgYj0wO2I9aTtSYihhfDApO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIHpuKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1JiKGF8MCk7aT1iO3JldHVybn1mdW5jdGlvbiBBbihhKXthPWF8MDtyZXR1cm4gMjI2OTZ9ZnVuY3Rpb24gQm4oYixlLGYsZyl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7dmFyIGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wO2g9aTtpZihlPj4+MD4zNil7Y1soYmIoKXwwKT4+Ml09MjI7cz0wO3Q9MDtJPXM7aT1oO3JldHVybiB0fDB9az1iKzR8MDtqPWIrMTAwfDA7ZG97bD1jW2s+PjJdfDA7aWYobD4+PjA8KGNbaj4+Ml18MCk+Pj4wKXtjW2s+PjJdPWwrMTtvPWRbbD4+MF18MH1lbHNle289RG4oYil8MH19d2hpbGUoKG98MCk9PTMyfChvKyAtOXwwKT4+PjA8NSk7ZG97aWYoKG98MCk9PTQzfChvfDApPT00NSl7bD0oKG98MCk9PTQ1KTw8MzE+PjMxO209Y1trPj4yXXwwO2lmKG0+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1tKzE7bz1kW20+PjBdfDA7YnJlYWt9ZWxzZXtvPURuKGIpfDA7YnJlYWt9fWVsc2V7bD0wfX13aGlsZSgwKTttPShlfDApPT0wO2Rve2lmKChlJi0xN3wwKT09MCYob3wwKT09NDgpe249Y1trPj4yXXwwO2lmKG4+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1uKzE7bz1kW24+PjBdfDB9ZWxzZXtvPURuKGIpfDB9aWYoKG98MzJ8MCkhPTEyMCl7ZT1tPzg6ZTttPTI4O2JyZWFrfWU9Y1trPj4yXXwwO2lmKGU+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1lKzE7bz1kW2U+PjBdfDB9ZWxzZXtvPURuKGIpfDB9aWYoKGRbbysyMjc0NT4+MF18MCk+MTUpe2lmKChjW2o+PjJdfDApPT0wKXtzPTA7dD0wO0k9cztpPWg7cmV0dXJuIHR8MH1jW2s+PjJdPShjW2s+PjJdfDApKyAtMjtzPTA7dD0wO0k9cztpPWg7cmV0dXJuIHR8MH1lbHNle2U9MTY7bT00M319ZWxzZXtlPW0/MTA6ZTtpZigoZFtvKzIyNzQ1Pj4wXXwwKT4+PjA8ZT4+PjApe209Mjh9ZWxzZXtmPWNbaz4+Ml18MDtpZigoY1tqPj4yXXwwKSE9MCl7Zj1mKyAtMXwwO2Nbaz4+Ml09Zn1jW2IrMTA0Pj4yXT0wO3M9Y1tiKzg+PjJdfDA7Y1tiKzEwOD4+Ml09cy1mO2Nbaj4+Ml09cztjWyhiYigpfDApPj4yXT0yMjtzPTA7dD0wO0k9cztpPWg7cmV0dXJuIHR8MH19fXdoaWxlKDApO2lmKChtfDApPT0yOCl7aWYoKGV8MCk9PTEwKXtlPW8rIC00OHwwO2lmKGU+Pj4wPDEwKXtuPTA7d2hpbGUoMSl7bj1uK2V8MDtlPWNbaz4+Ml18MDtpZihlPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09ZSsxO289ZFtlPj4wXXwwfWVsc2V7bz1EbihiKXwwfWU9bysgLTQ4fDA7aWYoIShlPj4+MDwxMCZuPj4+MDw0Mjk0OTY3MjkpKXticmVha31uPW4qMTB8MH1wPTB9ZWxzZXtuPTA7cD0wfWU9bysgLTQ4fDA7aWYoZT4+PjA8MTApe2Rve3M9Vm4obnwwLHB8MCwxMCwwKXwwO3I9STtxPSgoZXwwKTwwKTw8MzE+PjMxO3Q9fnE7aWYocj4+PjA+dD4+PjB8KHJ8MCk9PSh0fDApJnM+Pj4wPn5lPj4+MCl7YnJlYWt9bj1JbihzfDAscnwwLGV8MCxxfDApfDA7cD1JO2U9Y1trPj4yXXwwO2lmKGU+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1lKzE7bz1kW2U+PjBdfDB9ZWxzZXtvPURuKGIpfDB9ZT1vKyAtNDh8MH13aGlsZShlPj4+MDwxMCYocD4+PjA8NDI5NDk2NzI5fChwfDApPT00Mjk0OTY3Mjkmbj4+PjA8MjU3Njk4MDM3OCkpO2lmKCEoZT4+PjA+OSkpe2U9MTA7bT02OX19fWVsc2V7bT00M319YTpkb3tpZigobXwwKT09NDMpe2lmKChlKyAtMSZlfDApPT0wKXttPWFbMjMwMDgrKChlKjIzfDApPj4+NSY3KT4+MF18MDtyPWFbbysyMjc0NT4+MF18MDtuPXImMjU1O2lmKG4+Pj4wPGU+Pj4wKXtvPW47bj0wO2Rve249b3xuPDxtO289Y1trPj4yXXwwO2lmKG8+Pj4wPChjW2o+PjJdfDApPj4+MCl7Y1trPj4yXT1vKzE7cz1kW28+PjBdfDB9ZWxzZXtzPURuKGIpfDB9cj1hW3MrMjI3NDU+PjBdfDA7bz1yJjI1NX13aGlsZShvPj4+MDxlPj4+MCZuPj4+MDwxMzQyMTc3MjgpO3A9MH1lbHNle3A9MDtuPTA7cz1vfXE9S24oLTEsLTEsbXwwKXwwO289STtpZigociYyNTUpPj4+MD49ZT4+PjB8KHA+Pj4wPm8+Pj4wfChwfDApPT0ob3wwKSZuPj4+MD5xPj4+MCkpe289czttPTY5O2JyZWFrfXdoaWxlKDEpe249T24obnwwLHB8MCxtfDApfDA7cD1JO249ciYyNTV8bjtyPWNbaz4+Ml18MDtpZihyPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09cisxO3M9ZFtyPj4wXXwwfWVsc2V7cz1EbihiKXwwfXI9YVtzKzIyNzQ1Pj4wXXwwO2lmKChyJjI1NSk+Pj4wPj1lPj4+MHwocD4+PjA+bz4+PjB8KHB8MCk9PShvfDApJm4+Pj4wPnE+Pj4wKSl7bz1zO209Njk7YnJlYWsgYX19fXE9YVtvKzIyNzQ1Pj4wXXwwO209cSYyNTU7aWYobT4+PjA8ZT4+PjApe249MDtkb3tuPW0rKGVhKG4sZSl8MCl8MDttPWNbaz4+Ml18MDtpZihtPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09bSsxO3I9ZFttPj4wXXwwfWVsc2V7cj1EbihiKXwwfXE9YVtyKzIyNzQ1Pj4wXXwwO209cSYyNTV9d2hpbGUobT4+PjA8ZT4+PjAmbj4+PjA8MTE5MzA0NjQ3KTtwPTB9ZWxzZXtuPTA7cD0wO3I9b31pZigocSYyNTUpPj4+MDxlPj4+MCl7bT1XbigtMSwtMSxlfDAsMCl8MDtvPUk7d2hpbGUoMSl7aWYocD4+PjA+bz4+PjB8KHB8MCk9PShvfDApJm4+Pj4wPm0+Pj4wKXtvPXI7bT02OTticmVhayBhfXM9Vm4obnwwLHB8MCxlfDAsMCl8MDt0PUk7cT1xJjI1NTtpZih0Pj4+MD40Mjk0OTY3Mjk1fCh0fDApPT0tMSZzPj4+MD5+cT4+PjApe289cjttPTY5O2JyZWFrIGF9bj1JbihxfDAsMCxzfDAsdHwwKXwwO3A9STtxPWNbaz4+Ml18MDtpZihxPj4+MDwoY1tqPj4yXXwwKT4+PjApe2Nbaz4+Ml09cSsxO3I9ZFtxPj4wXXwwfWVsc2V7cj1EbihiKXwwfXE9YVtyKzIyNzQ1Pj4wXXwwO2lmKCEoKHEmMjU1KT4+PjA8ZT4+PjApKXtvPXI7bT02OTticmVha319fWVsc2V7bz1yO209Njl9fX13aGlsZSgwKTtpZigobXwwKT09Njkpe2lmKChkW28rMjI3NDU+PjBdfDApPj4+MDxlPj4+MCl7ZG97bT1jW2s+PjJdfDA7aWYobT4+PjA8KGNbaj4+Ml18MCk+Pj4wKXtjW2s+PjJdPW0rMTttPWRbbT4+MF18MH1lbHNle209RG4oYil8MH19d2hpbGUoKGRbbSsyMjc0NT4+MF18MCk+Pj4wPGU+Pj4wKTtjWyhiYigpfDApPj4yXT0zNDtwPWc7bj1mfX1pZigoY1tqPj4yXXwwKSE9MCl7Y1trPj4yXT0oY1trPj4yXXwwKSsgLTF9aWYoIShwPj4+MDxnPj4+MHwocHwwKT09KGd8MCkmbj4+PjA8Zj4+PjApKXtpZigoZiYxfDApPT0wJjA9PTAmKGx8MCk9PTApe2NbKGJiKCl8MCk+PjJdPTM0O3Q9SW4oZnwwLGd8MCwtMSwtMSl8MDtzPUk7ST1zO2k9aDtyZXR1cm4gdHwwfWlmKHA+Pj4wPmc+Pj4wfChwfDApPT0oZ3wwKSZuPj4+MD5mPj4+MCl7Y1soYmIoKXwwKT4+Ml09MzQ7cz1nO3Q9ZjtJPXM7aT1oO3JldHVybiB0fDB9fXQ9KChsfDApPDApPDwzMT4+MzE7dD1IbihuXmx8MCxwXnR8MCxsfDAsdHwwKXwwO3M9STtJPXM7aT1oO3JldHVybiB0fDB9ZnVuY3Rpb24gQ24oYSl7YT1hfDA7dmFyIGI9MCxlPTAsZj0wLGc9MCxoPTAsaj0wLGs9MCxsPTA7ZT1pO2Y9YSs0fDA7Zz1jW2Y+PjJdfDA7Yj1hKzEwMHwwO2lmKGc+Pj4wPChjW2I+PjJdfDApPj4+MCl7Y1tmPj4yXT1nKzE7aj1kW2c+PjBdfDB9ZWxzZXtqPURuKGEpfDB9aWYoKGp8MCk9PTQzfChqfDApPT00NSl7Zz0oanwwKT09NDUmMTtoPWNbZj4+Ml18MDtpZihoPj4+MDwoY1tiPj4yXXwwKT4+PjApe2NbZj4+Ml09aCsxO2o9ZFtoPj4wXXwwfWVsc2V7aj1EbihhKXwwfWlmKCEoKGorIC00OHwwKT4+PjA8MTApPyhjW2I+PjJdfDApIT0wOjApe2NbZj4+Ml09KGNbZj4+Ml18MCkrIC0xfX1lbHNle2c9MH1pZigoaisgLTQ4fDApPj4+MD45KXtpZigoY1tiPj4yXXwwKT09MCl7az0tMjE0NzQ4MzY0ODtsPTA7ST1rO2k9ZTtyZXR1cm4gbHwwfWNbZj4+Ml09KGNbZj4+Ml18MCkrIC0xO2s9LTIxNDc0ODM2NDg7bD0wO0k9aztpPWU7cmV0dXJuIGx8MH1lbHNle2g9MH13aGlsZSgxKXtoPWorIC00OCtofDA7aj1jW2Y+PjJdfDA7aWYoaj4+PjA8KGNbYj4+Ml18MCk+Pj4wKXtjW2Y+PjJdPWorMTtqPWRbaj4+MF18MH1lbHNle2o9RG4oYSl8MH1sPShqKyAtNDh8MCk+Pj4wPDEwO2lmKCEobCYoaHwwKTwyMTQ3NDgzNjQpKXticmVha31oPWgqMTB8MH1rPSgoaHwwKTwwKTw8MzE+PjMxO2lmKGwpe2Rve2s9Vm4oaHwwLGt8MCwxMCwwKXwwO2g9STtqPUluKGp8MCwoKGp8MCk8MCk8PDMxPj4zMXwwLC00OCwtMSl8MDtoPUluKGp8MCxJfDAsa3wwLGh8MCl8MDtrPUk7aj1jW2Y+PjJdfDA7aWYoaj4+PjA8KGNbYj4+Ml18MCk+Pj4wKXtjW2Y+PjJdPWorMTtqPWRbaj4+MF18MH1lbHNle2o9RG4oYSl8MH19d2hpbGUoKGorIC00OHwwKT4+PjA8MTAmKChrfDApPDIxNDc0ODM2fChrfDApPT0yMTQ3NDgzNiZoPj4+MDwyMDYxNTg0MzAyKSl9aWYoKGorIC00OHwwKT4+PjA8MTApe2Rve2o9Y1tmPj4yXXwwO2lmKGo+Pj4wPChjW2I+PjJdfDApPj4+MCl7Y1tmPj4yXT1qKzE7aj1kW2o+PjBdfDB9ZWxzZXtqPURuKGEpfDB9fXdoaWxlKChqKyAtNDh8MCk+Pj4wPDEwKX1pZigoY1tiPj4yXXwwKSE9MCl7Y1tmPj4yXT0oY1tmPj4yXXwwKSsgLTF9aj0oZ3wwKSE9MDtsPUhuKDAsMCxofDAsa3wwKXwwO2s9aj9JOms7bD1qP2w6aDtJPWs7aT1lO3JldHVybiBsfDB9ZnVuY3Rpb24gRG4oYil7Yj1ifDA7dmFyIGU9MCxmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtlPWk7aD1iKzEwNHwwO2w9Y1toPj4yXXwwO2lmKCEoKGx8MCkhPTA/KGNbYisxMDg+PjJdfDApPj0obHwwKTowKSl7Zz0zfWlmKChnfDApPT0zPyhmPUVuKGIpfDAsKGZ8MCk+PTApOjApe2w9Y1toPj4yXXwwO2g9Y1tiKzg+PjJdfDA7az1jW2IrND4+Ml18MDtpZigobHwwKSE9MD8oaj1sLShjW2IrMTA4Pj4yXXwwKSsgLTF8MCwoaC1rfDApPihqfDApKTowKXtjW2IrMTAwPj4yXT1rK2p9ZWxzZXtnPTh9aWYoKGd8MCk9PTgpe2NbYisxMDA+PjJdPWh9aWYoKGh8MCkhPTApe2w9YisxMDh8MDtjW2w+PjJdPWgrMS1rKyhjW2w+PjJdfDApfWI9aysgLTF8MDtpZigoZFtiPj4wXXwwfDApPT0oZnwwKSl7bD1mO2k9ZTtyZXR1cm4gbHwwfWFbYj4+MF09ZjtsPWY7aT1lO3JldHVybiBsfDB9Y1tiKzEwMD4+Ml09MDtsPS0xO2k9ZTtyZXR1cm4gbHwwfWZ1bmN0aW9uIEVuKGIpe2I9YnwwO3ZhciBlPTAsZj0wLGc9MCxoPTAsaj0wO2c9aTtpPWkrMTZ8MDtlPWc7Zj1iKzh8MDtkb3tpZigoY1tmPj4yXXwwKT09MCl7aj1iKzc0fDA7aD1hW2o+PjBdfDA7YVtqPj4wXT1oKzI1NXxoO2o9YisyMHwwO2g9Yis0NHwwO2lmKChjW2o+PjJdfDApPj4+MD4oY1toPj4yXXwwKT4+PjApe2hjW2NbYiszNj4+Ml0mNjNdKGIsMCwwKXwwfWNbYisxNj4+Ml09MDtjW2IrMjg+PjJdPTA7Y1tqPj4yXT0wO2o9Y1tiPj4yXXwwO2lmKChqJjIwfDApPT0wKXtqPWNbaD4+Ml18MDtjW2Y+PjJdPWo7Y1tiKzQ+PjJdPWo7YnJlYWt9aWYoKGomNHwwKT09MCl7aj0tMTtpPWc7cmV0dXJuIGp8MH1jW2I+PjJdPWp8MzI7aj0tMTtpPWc7cmV0dXJuIGp8MH19d2hpbGUoMCk7aWYoKGhjW2NbYiszMj4+Ml0mNjNdKGIsZSwxKXwwKSE9MSl7aj0tMTtpPWc7cmV0dXJuIGp8MH1qPWRbZT4+MF18MDtpPWc7cmV0dXJuIGp8MH1mdW5jdGlvbiBGbihiLGUpe2I9YnwwO2U9ZXwwO3ZhciBmPTAsZz0wLGo9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MC4wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLjAsSj0wLEs9MCxMPTAuMCxNPTAuMCxOPTAuMCxPPTAuMDtmPWk7aT1pKzYyNHwwO289ZisxMTJ8MDtxPWY7bD1xKzB8MDtqPWwrMTA4fDA7ZG97Y1tsPj4yXT0wO2w9bCs0fDB9d2hpbGUoKGx8MCk8KGp8MCkpO209cSs0fDA7Y1ttPj4yXT1iO2w9cSs4fDA7Y1tsPj4yXT0tMTtjW3ErNDQ+PjJdPWI7Y1txKzc2Pj4yXT0tMTtzPXErMTA0fDA7Y1tzPj4yXT0wO2o9cSsxMDh8MDtjW2o+PjJdPX5iO3A9cSsxMDB8MDtjW3A+PjJdPS0xO249Yjt6PS0xO3doaWxlKDEpe2lmKG4+Pj4wPHo+Pj4wKXtjW20+PjJdPW4rMTt6PWRbbj4+MF18MH1lbHNle3o9RG4ocSl8MH1pZighKCh6fDApPT0zMnwoeisgLTl8MCk+Pj4wPDUpKXticmVha31uPWNbbT4+Ml18MDt6PWNbcD4+Ml18MH1kb3tpZigoenwwKT09NDN8KHp8MCk9PTQ1KXtuPTEtKCgoenwwKT09NDUmMSk8PDEpfDA7ej1jW20+PjJdfDA7aWYoej4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPXorMTt6PWRbej4+MF18MDticmVha31lbHNle3o9RG4ocSl8MDticmVha319ZWxzZXtuPTF9fXdoaWxlKDApO0I9MDtkb3tpZigoenwzMnwwKSE9KGFbMjMwMjQrQj4+MF18MCkpe2JyZWFrfWRve2lmKEI+Pj4wPDcpe3o9Y1ttPj4yXXwwO2lmKHo+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT16KzE7ej1kW3o+PjBdfDA7YnJlYWt9ZWxzZXt6PURuKHEpfDA7YnJlYWt9fX13aGlsZSgwKTtCPUIrMXwwfXdoaWxlKEI+Pj4wPDgpO2E6ZG97aWYoKEJ8MCk9PTMpe2c9MjF9ZWxzZSBpZigoQnwwKSE9OCl7aWYoIShCPj4+MDw0KSl7aWYoKEJ8MCk9PTgpe2c9MjU7YnJlYWt9ZWxzZXtnPTIxO2JyZWFrfX1iOmRve2lmKChCfDApPT0wKXtCPTA7ZG97aWYoKHp8MzJ8MCkhPShhWzIzMDQwK0I+PjBdfDApKXticmVhayBifWRve2lmKEI+Pj4wPDIpe3o9Y1ttPj4yXXwwO2lmKHo+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT16KzE7ej1kW3o+PjBdfDA7YnJlYWt9ZWxzZXt6PURuKHEpfDA7YnJlYWt9fX13aGlsZSgwKTtCPUIrMXwwfXdoaWxlKEI+Pj4wPDMpfX13aGlsZSgwKTtpZigoQnwwKT09MCl7ZG97aWYoKHp8MCk9PTQ4KXt6PWNbbT4+Ml18MDtpZih6Pj4+MDwoY1twPj4yXXwwKT4+PjApe2NbbT4+Ml09eisxO3o9ZFt6Pj4wXXwwfWVsc2V7ej1EbihxKXwwfWlmKCh6fDMyfDApIT0xMjApe2lmKChjW3A+PjJdfDApPT0wKXt6PTQ4O2JyZWFrfWNbbT4+Ml09KGNbbT4+Ml18MCkrIC0xO3o9NDg7YnJlYWt9bz1jW20+PjJdfDA7aWYobz4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPW8rMTtGPWRbbz4+MF18MDtEPTB9ZWxzZXtGPURuKHEpfDA7RD0wfXdoaWxlKDEpe2lmKChGfDApPT00Nil7Zz02NTticmVha31lbHNlIGlmKChGfDApIT00OCl7bz0wO3M9MDtBPTA7ej0wO0M9MDtFPTA7SD0xLjA7Qj0wO3c9MC4wO2JyZWFrfW89Y1ttPj4yXXwwO2lmKG8+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT1vKzE7Rj1kW28+PjBdfDA7RD0xO2NvbnRpbnVlfWVsc2V7Rj1EbihxKXwwO0Q9MTtjb250aW51ZX19Yzpkb3tpZigoZ3wwKT09NjUpe289Y1ttPj4yXXwwO2lmKG8+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT1vKzE7Rj1kW28+PjBdfDB9ZWxzZXtGPURuKHEpfDB9aWYoKEZ8MCk9PTQ4KXtBPS0xO3o9LTE7d2hpbGUoMSl7bz1jW20+PjJdfDA7aWYobz4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPW8rMTtGPWRbbz4+MF18MH1lbHNle0Y9RG4ocSl8MH1pZigoRnwwKSE9NDgpe289MDtzPTA7RD0xO0M9MTtFPTA7SD0xLjA7Qj0wO3c9MC4wO2JyZWFrIGN9Sz1JbihBfDAsenwwLC0xLC0xKXwwO0E9Szt6PUl9fWVsc2V7bz0wO3M9MDtBPTA7ej0wO0M9MTtFPTA7SD0xLjA7Qj0wO3c9MC4wfX19d2hpbGUoMCk7ZDp3aGlsZSgxKXtLPUYrIC00OHwwO2Rve2lmKCEoSz4+PjA8MTApKXtHPUZ8MzI7Sj0oRnwwKT09NDY7aWYoISgoRysgLTk3fDApPj4+MDw2fEopKXticmVhayBkfWlmKEope2lmKChDfDApPT0wKXtBPXM7ej1vO0M9MTticmVha31lbHNle0Y9NDY7YnJlYWsgZH19ZWxzZXtLPShGfDApPjU3P0crIC04N3wwOks7Zz03OTticmVha319ZWxzZXtnPTc5fX13aGlsZSgwKTtpZigoZ3wwKT09Nzkpe2c9MDtkb3tpZighKChvfDApPDB8KG98MCk9PTAmcz4+PjA8OCkpe2lmKChvfDApPDB8KG98MCk9PTAmcz4+PjA8MTQpe049SCouMDYyNTtMPU47dz13K04qKyhLfDApO2JyZWFrfWlmKChLfDApIT0wJihFfDApPT0wKXtFPTE7TD1IO3c9dytIKi41fWVsc2V7TD1IfX1lbHNle0w9SDtCPUsrKEI8PDQpfDB9fXdoaWxlKDApO3M9SW4oc3wwLG98MCwxLDApfDA7bz1JO0Q9MTtIPUx9Rj1jW20+PjJdfDA7aWYoRj4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPUYrMTtGPWRbRj4+MF18MDtjb250aW51ZX1lbHNle0Y9RG4ocSl8MDtjb250aW51ZX19aWYoKER8MCk9PTApe2lmKChjW3A+PjJdfDApIT0wPyh2PWNbbT4+Ml18MCxjW20+PjJdPXYrIC0yLChDfDApIT0wKTowKXtjW20+PjJdPXYrIC0zfXc9KyhufDApKjAuMDticmVhayBhfUs9KEN8MCk9PTA7dj1LP3M6QTt6PUs/bzp6O2lmKChvfDApPDB8KG98MCk9PTAmcz4+PjA8OCl7ZG97Qj1CPDw0O3M9SW4oc3wwLG98MCwxLDApfDA7bz1JfXdoaWxlKChvfDApPDB8KG98MCk9PTAmcz4+PjA8OCl9aWYoISgoRnwzMnwwKT09MTEyPyh1PUNuKHEpfDAsdD1JLCEoKHV8MCk9PTAmKHR8MCk9PS0yMTQ3NDgzNjQ4KSk6MCkpe2lmKChjW3A+PjJdfDApPT0wKXt1PTA7dD0wfWVsc2V7Y1ttPj4yXT0oY1ttPj4yXXwwKSsgLTE7dT0wO3Q9MH19bz1Pbih2fDAsenwwLDIpfDA7bz1JbihvfDAsSXwwLC0zMiwtMSl8MDtvPUluKG98MCxJfDAsdXwwLHR8MCl8MDtwPUk7aWYoKEJ8MCk9PTApe3c9KyhufDApKjAuMDticmVhayBhfWlmKChwfDApPjB8KHB8MCk9PTAmbz4+PjA+MTA3NCl7Y1soYmIoKXwwKT4+Ml09MzQ7dz0rKG58MCkqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7YnJlYWsgYX1pZigocHwwKTwtMXwocHwwKT09LTEmbz4+PjA8NDI5NDk2NjExNil7Y1soYmIoKXwwKT4+Ml09MzQ7dz0rKG58MCkqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7YnJlYWsgYX1pZigoQnwwKT4tMSl7ZG97Qj1CPDwxO2lmKCEodz49LjUpKXtIPXd9ZWxzZXtIPXcrLTEuMDtCPUJ8MX13PXcrSDtvPUluKG98MCxwfDAsLTEsLTEpfDA7cD1JfXdoaWxlKChCfDApPi0xKX1wPUluKG98MCxwfDAsMTEwNiwwKXwwO0s9STtkb3tpZigoS3wwKTwwfChLfDApPT0wJnA+Pj4wPDUzPyhyPShwfDApPDA/MDpwLChyfDApPDUzKTowKXtwPTg0LXJ8MDtkb3tpZigocHwwKT4xMDIzKXtxPXArIC0xMDIzfDA7aWYoKHF8MCk8PTEwMjMpe3A9cTtIPTguOTg4NDY1Njc0MzExNThlKzMwNzticmVha31wPXArIC0yMDQ2fDA7cD0ocHwwKT4xMDIzPzEwMjM6cDtIPXl9ZWxzZXtpZighKChwfDApPC0xMDIyKSl7SD0xLjA7YnJlYWt9cT1wKzEwMjJ8MDtpZighKChxfDApPC0xMDIyKSl7cD1xO0g9Mi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7YnJlYWt9cD1wKzIwNDR8MDtwPShwfDApPC0xMDIyPy0xMDIyOnA7SD0wLjB9fXdoaWxlKDApO0o9T24ocCsxMDIzfDAsMCw1Mil8MDtLPUk7Y1trPj4yXT1KO2Nbays0Pj4yXT1LO009KyhufDApO0w9K1NiKCsoSCoraFtrPj4zXSksK00pO2lmKCEoKHJ8MCk8MzImdyE9MC4wKSl7SD1NO2JyZWFrfUs9QiYxO0g9TTtCPShLXjEpK0J8MDt3PShLfDApPT0wPzAuMDp3fWVsc2V7Zz0xMTR9fXdoaWxlKDApO2lmKChnfDApPT0xMTQpe0g9KyhufDApO0w9MC4wfXc9SCp3KyhMK0gqKyhCPj4+MCkpLUw7aWYoISh3IT0wLjApKXtjWyhiYigpfDApPj4yXT0zNH1kb3tpZigob3wwKT4xMDIzKXt3PXcqOC45ODg0NjU2NzQzMTE1OGUrMzA3O249bysgLTEwMjN8MDtpZigobnwwKTw9MTAyMyl7bz1uO2JyZWFrfW89bysgLTIwNDZ8MDtvPShvfDApPjEwMjM/MTAyMzpvO3c9dyo4Ljk4ODQ2NTY3NDMxMTU4ZSszMDd9ZWxzZXtpZighKChvfDApPC0xMDIyKSl7YnJlYWt9dz13KjIuMjI1MDczODU4NTA3MjAxNGUtMzA4O249bysxMDIyfDA7aWYoISgobnwwKTwtMTAyMikpe289bjticmVha31vPW8rMjA0NHwwO289KG98MCk8LTEwMjI/LTEwMjI6bzt3PXcqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDh9fXdoaWxlKDApO0o9T24obysxMDIzfDAsMCw1Mil8MDtLPUk7Y1trPj4yXT1KO2Nbays0Pj4yXT1LO3c9dyoraFtrPj4zXTticmVhayBhfX13aGlsZSgwKTtHPTA7d2hpbGUoMSl7aWYoKHp8MCk9PTQ2KXtnPTEzOTticmVha31lbHNlIGlmKCh6fDApIT00OCl7cj0wO0Y9MDtDPTA7YnJlYWt9cj1jW20+PjJdfDA7aWYocj4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPXIrMTt6PWRbcj4+MF18MDtHPTE7Y29udGludWV9ZWxzZXt6PURuKHEpfDA7Rz0xO2NvbnRpbnVlfX1lOmRve2lmKChnfDApPT0xMzkpe3I9Y1ttPj4yXXwwO2lmKHI+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT1yKzE7ej1kW3I+PjBdfDB9ZWxzZXt6PURuKHEpfDB9aWYoKHp8MCk9PTQ4KXtyPS0xO0Y9LTE7d2hpbGUoMSl7dD1jW20+PjJdfDA7aWYodD4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPXQrMTt6PWRbdD4+MF18MH1lbHNle3o9RG4ocSl8MH1pZigoenwwKSE9NDgpe0c9MTtDPTE7YnJlYWsgZX1LPUluKHJ8MCxGfDAsLTEsLTEpfDA7cj1LO0Y9SX19ZWxzZXtyPTA7Rj0wO0M9MX19fXdoaWxlKDApO2Nbbz4+Ml09MDtEPXorIC00OHwwO0o9KHp8MCk9PTQ2O2Y6ZG97aWYoRD4+PjA8MTB8Sil7dD1vKzQ5NnwwO0U9MDtCPTA7QT0wO3Y9MDt1PTA7d2hpbGUoMSl7ZG97aWYoSil7aWYoKEN8MCk9PTApe3I9RTtGPUI7Qz0xfWVsc2V7YnJlYWsgZn19ZWxzZXtKPUluKEV8MCxCfDAsMSwwKXwwO0I9STtLPSh6fDApIT00ODtpZigodnwwKT49MTI1KXtpZighSyl7RT1KO2JyZWFrfWNbdD4+Ml09Y1t0Pj4yXXwxO0U9SjticmVha31FPW8rKHY8PDIpfDA7aWYoKEF8MCkhPTApe0Q9eisgLTQ4KygoY1tFPj4yXXwwKSoxMHwwKXwwfWNbRT4+Ml09RDtBPUErMXwwO0Q9KEF8MCk9PTk7RT1KO0c9MTtBPUQ/MDpBO3Y9KEQmMSkrdnwwO3U9Sz9KOnV9fXdoaWxlKDApO3o9Y1ttPj4yXXwwO2lmKHo+Pj4wPChjW3A+PjJdfDApPj4+MCl7Y1ttPj4yXT16KzE7ej1kW3o+PjBdfDB9ZWxzZXt6PURuKHEpfDB9RD16KyAtNDh8MDtKPSh6fDApPT00NjtpZighKEQ+Pj4wPDEwfEopKXtnPTE2MjticmVha319fWVsc2V7RT0wO0I9MDtBPTA7dj0wO3U9MDtnPTE2Mn19d2hpbGUoMCk7aWYoKGd8MCk9PTE2Mil7Sz0oQ3wwKT09MDtyPUs/RTpyO0Y9Sz9COkZ9dD0oR3wwKSE9MDtpZih0Pyh6fDMyfDApPT0xMDE6MCl7ej1DbihxKXwwO3E9STtpZigoenwwKT09MCYocXwwKT09LTIxNDc0ODM2NDgpe2lmKChjW3A+PjJdfDApPT0wKXt6PTA7cT0wfWVsc2V7Y1ttPj4yXT0oY1ttPj4yXXwwKSsgLTE7ej0wO3E9MH19cj1Jbih6fDAscXwwLHJ8MCxGfDApfDA7Rj1JfWVsc2V7aWYoKHp8MCk+LTE/KGNbcD4+Ml18MCkhPTA6MCl7Y1ttPj4yXT0oY1ttPj4yXXwwKSsgLTF9fWlmKCF0KXtjWyhiYigpfDApPj4yXT0yMjtjW3M+PjJdPTA7Sz1jW2w+PjJdfDA7Y1tqPj4yXT1LLShjW20+PjJdfDApO2NbcD4+Ml09Szt3PTAuMDticmVha31wPWNbbz4+Ml18MDtpZigocHwwKT09MCl7dz0rKG58MCkqMC4wO2JyZWFrfWlmKChyfDApPT0oRXwwKSYoRnwwKT09KEJ8MCkmKChCfDApPDB8KEJ8MCk9PTAmRT4+PjA8MTApKXt3PSsobnwwKSorKHA+Pj4wKTticmVha31pZigoRnwwKT4wfChGfDApPT0wJnI+Pj4wPjUzNyl7Y1soYmIoKXwwKT4+Ml09MzQ7dz0rKG58MCkqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgqMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7YnJlYWt9aWYoKEZ8MCk8LTF8KEZ8MCk9PS0xJnI+Pj4wPDQyOTQ5NjYxMTYpe2NbKGJiKCl8MCk+PjJdPTM0O3c9KyhufDApKjIuMjI1MDczODU4NTA3MjAxNGUtMzA4KjIuMjI1MDczODU4NTA3MjAxNGUtMzA4O2JyZWFrfWlmKChBfDApIT0wKXtpZigoQXwwKTw5KXtxPW8rKHY8PDIpfDA7cD1jW3E+PjJdfDA7ZG97cD1wKjEwfDA7QT1BKzF8MH13aGlsZSgoQXwwKSE9OSk7Y1txPj4yXT1wfXY9disxfDB9ZG97aWYoKHV8MCk8OT8odXwwKTw9KHJ8MCkmKHJ8MCk8MTg6MCl7aWYoKHJ8MCk9PTkpe3c9KyhufDApKisoKGNbbz4+Ml18MCk+Pj4wKTticmVhayBhfWlmKChyfDApPDkpe3c9KyhufDApKisoKGNbbz4+Ml18MCk+Pj4wKS8rKGNbMjMwNTYrKDgtcjw8Mik+PjJdfDApO2JyZWFrIGF9Sz0oZWEociwtMyl8MCkrODB8MDtwPWNbbz4+Ml18MDtpZigoS3wwKTw9MzA/KHA+Pj5LfDApIT0wOjApe2JyZWFrfXc9KyhufDApKisocD4+PjApKisoY1syMzA1NisocisgLTEwPDwyKT4+Ml18MCk7YnJlYWsgYX19d2hpbGUoMCk7cD0ocnwwKSU5fDA7aWYoKHB8MCk9PTApe3A9MDtxPTB9ZWxzZXtzPShyfDApPi0xP3A6cCs5fDA7cT1jWzIzMDU2Kyg4LXM8PDIpPj4yXXwwO2lmKCh2fDApIT0wKXt0PTFlOS8ocXwwKXwwO3A9MDt6PTA7dT0wO2Rve0c9bysodTw8Mil8MDtKPWNbRz4+Ml18MDtLPSgoSj4+PjApLyhxPj4+MCl8MCkrenwwO2NbRz4+Ml09Szt6PWVhKChKPj4+MCklKHE+Pj4wKXwwLHQpfDA7Sj11O3U9dSsxfDA7aWYoKEp8MCk9PShwfDApJihLfDApPT0wKXtwPXUmMTI3O3I9cisgLTl8MH19d2hpbGUoKHV8MCkhPSh2fDApKTtpZigoenwwKSE9MCl7Y1tvKyh2PDwyKT4+Ml09ejt2PXYrMXwwfX1lbHNle3A9MDt2PTB9cT0wO3I9OS1zK3J8MH1nOndoaWxlKDEpe3M9bysocDw8Mil8MDtpZigocnwwKTwxOCl7ZG97dT0wO3M9disxMjd8MDt3aGlsZSgxKXtzPXMmMTI3O3Q9bysoczw8Mil8MDt6PU9uKGNbdD4+Ml18MCwwLDI5KXwwO3o9SW4oenwwLEl8MCx1fDAsMCl8MDt1PUk7aWYodT4+PjA+MHwodXwwKT09MCZ6Pj4+MD4xZTkpe0s9V24oenwwLHV8MCwxZTksMCl8MDt6PVhuKHp8MCx1fDAsMWU5LDApfDA7dT1LfWVsc2V7dT0wfWNbdD4+Ml09ejt0PShzfDApPT0ocHwwKTtpZighKChzfDApIT0odisxMjcmMTI3fDApfHQpKXt2PSh6fDApPT0wP3M6dn1pZih0KXticmVha31lbHNle3M9cysgLTF8MH19cT1xKyAtMjl8MH13aGlsZSgodXwwKT09MCl9ZWxzZXtpZigocnwwKSE9MTgpe2JyZWFrfWRve2lmKCEoKGNbcz4+Ml18MCk+Pj4wPDkwMDcxOTkpKXtyPTE4O2JyZWFrIGd9dT0wO3Q9disxMjd8MDt3aGlsZSgxKXt0PXQmMTI3O3o9bysodDw8Mil8MDtBPU9uKGNbej4+Ml18MCwwLDI5KXwwO0E9SW4oQXwwLEl8MCx1fDAsMCl8MDt1PUk7aWYodT4+PjA+MHwodXwwKT09MCZBPj4+MD4xZTkpe0s9V24oQXwwLHV8MCwxZTksMCl8MDtBPVhuKEF8MCx1fDAsMWU5LDApfDA7dT1LfWVsc2V7dT0wfWNbej4+Ml09QTt6PSh0fDApPT0ocHwwKTtpZighKCh0fDApIT0odisxMjcmMTI3fDApfHopKXt2PShBfDApPT0wP3Q6dn1pZih6KXticmVha31lbHNle3Q9dCsgLTF8MH19cT1xKyAtMjl8MH13aGlsZSgodXwwKT09MCl9cD1wKzEyNyYxMjc7aWYoKHB8MCk9PSh2fDApKXtLPXYrMTI3JjEyNzt2PW8rKCh2KzEyNiYxMjcpPDwyKXwwO2Nbdj4+Ml09Y1t2Pj4yXXxjW28rKEs8PDIpPj4yXTt2PUt9Y1tvKyhwPDwyKT4+Ml09dTtyPXIrOXwwfWg6d2hpbGUoMSl7cz12KzEmMTI3O3Q9bysoKHYrMTI3JjEyNyk8PDIpfDA7d2hpbGUoMSl7ej0ocnwwKT09MTg7dT0ocnwwKT4yNz85OjE7d2hpbGUoMSl7QT0wO3doaWxlKDEpe0I9QStwJjEyNztpZigoQnwwKT09KHZ8MCkpe0E9MjticmVha31CPWNbbysoQjw8Mik+PjJdfDA7RD1jWzIzMDQ4KyhBPDwyKT4+Ml18MDtpZihCPj4+MDxEPj4+MCl7QT0yO2JyZWFrfUM9QSsxfDA7aWYoQj4+PjA+RD4+PjApe2JyZWFrfWlmKChDfDApPDIpe0E9Q31lbHNle0E9QzticmVha319aWYoKEF8MCk9PTImeil7YnJlYWsgaH1xPXUrcXwwO2lmKChwfDApPT0odnwwKSl7cD12fWVsc2V7YnJlYWt9fXo9KDE8PHUpKyAtMXwwO0E9MWU5Pj4+dTtCPXA7Qz0wO2Rve0c9bysocDw8Mil8MDtKPWNbRz4+Ml18MDtLPShKPj4+dSkrQ3wwO2NbRz4+Ml09SztDPWVhKEomeixBKXwwO0s9KHB8MCk9PShCfDApJihLfDApPT0wO3A9cCsxJjEyNztyPUs/cisgLTl8MDpyO0I9Sz9wOkJ9d2hpbGUoKHB8MCkhPSh2fDApKTtpZigoQ3wwKT09MCl7cD1CO2NvbnRpbnVlfWlmKChzfDApIT0oQnwwKSl7YnJlYWt9Y1t0Pj4yXT1jW3Q+PjJdfDE7cD1CfWNbbysodjw8Mik+PjJdPUM7cD1CO3Y9c31yPXAmMTI3O2lmKChyfDApPT0odnwwKSl7Y1tvKyhzKyAtMTw8Mik+PjJdPTA7dj1zfUg9KygoY1tvKyhyPDwyKT4+Ml18MCk+Pj4wKTtyPXArMSYxMjc7aWYoKHJ8MCk9PSh2fDApKXt2PXYrMSYxMjc7Y1tvKyh2KyAtMTw8Mik+PjJdPTB9dz0rKG58MCk7SD13KihIKjEuMGU5KyArKChjW28rKHI8PDIpPj4yXXwwKT4+PjApKTtuPXErNTN8MDtyPXErMTEyN3wwO2Rve2lmKChyfDApPDUzKXtzPShyfDApPDA/MDpyO2lmKChzfDApPj01Myl7TT0wLjA7dD0xO049MC4wO2JyZWFrfXQ9MTA1LXN8MDtkb3tpZigodHwwKT4xMDIzKXt1PXQrIC0xMDIzfDA7aWYoKHV8MCk8PTEwMjMpe3Q9dTtMPTguOTg4NDY1Njc0MzExNThlKzMwNzticmVha310PXQrIC0yMDQ2fDA7dD0odHwwKT4xMDIzPzEwMjM6dDtMPXl9ZWxzZXtpZighKCh0fDApPC0xMDIyKSl7TD0xLjA7YnJlYWt9dT10KzEwMjJ8MDtpZighKCh1fDApPC0xMDIyKSl7dD11O0w9Mi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7YnJlYWt9dD10KzIwNDR8MDt0PSh0fDApPC0xMDIyPy0xMDIyOnQ7TD0wLjB9fXdoaWxlKDApO0s9T24odCsxMDIzfDAsMCw1Mil8MDt0PUk7Y1trPj4yXT1LO2Nbays0Pj4yXT10O0w9K1NiKCsoTCoraFtrPj4zXSksK0gpO3Q9NTMtc3wwO2Rve2lmKCh0fDApPjEwMjMpe3U9dCsgLTEwMjN8MDtpZigodXwwKTw9MTAyMyl7dD11O009OC45ODg0NjU2NzQzMTE1OGUrMzA3O2JyZWFrfXQ9dCsgLTIwNDZ8MDt0PSh0fDApPjEwMjM/MTAyMzp0O009eX1lbHNle2lmKCEoKHR8MCk8LTEwMjIpKXtNPTEuMDticmVha311PXQrMTAyMnwwO2lmKCEoKHV8MCk8LTEwMjIpKXt0PXU7TT0yLjIyNTA3Mzg1ODUwNzIwMTRlLTMwODticmVha310PXQrMjA0NHwwO3Q9KHR8MCk8LTEwMjI/LTEwMjI6dDtNPTAuMH19d2hpbGUoMCk7Sz1Pbih0KzEwMjN8MCwwLDUyKXwwO3Q9STtjW2s+PjJdPUs7Y1trKzQ+PjJdPXQ7Tz0rUGEoK0gsKyhNKitoW2s+PjNdKSk7TT1MO3Q9MTtOPU87SD1MKyhILU8pfWVsc2V7cz01MztNPTAuMDt0PTA7Tj0wLjB9fXdoaWxlKDApO3U9cCsyJjEyNztkb3tpZigodXwwKSE9KHZ8MCkpe289Y1tvKyh1PDwyKT4+Ml18MDtkb3tpZighKG8+Pj4wPDVlOCkpe2lmKG8+Pj4wPjVlOCl7Tj13Ki43NStOO2JyZWFrfWlmKChwKzMmMTI3fDApPT0odnwwKSl7Tj13Ki41K047YnJlYWt9ZWxzZXtOPXcqLjc1K047YnJlYWt9fWVsc2V7aWYoKG98MCk9PTA/KHArMyYxMjd8MCk9PSh2fDApOjApe2JyZWFrfU49dyouMjUrTn19d2hpbGUoMCk7aWYoKDUzLXN8MCk8PTEpe2JyZWFrfWlmKCtQYSgrTiwxLjApIT0wLjApe2JyZWFrfU49TisxLjB9fXdoaWxlKDApO3c9SCtOLU07ZG97aWYoKG4mMjE0NzQ4MzY0NCk+Pj4wPjEwMTkpe2lmKCtUKCt3KT49OTAwNzE5OTI1NDc0MDk5Mi4wKXt0PSh0fDApIT0wJihzfDApPT0ocnwwKT8wOnQ7cT1xKzF8MDt3PXcqLjV9aWYoKHErNTB8MCk8PTEwMjE/ISgodHwwKSE9MCZOIT0wLjApOjApe2JyZWFrfWNbKGJiKCl8MCk+PjJdPTM0fX13aGlsZSgwKTtkb3tpZigocXwwKT4xMDIzKXt3PXcqOC45ODg0NjU2NzQzMTE1OGUrMzA3O249cSsgLTEwMjN8MDtpZigobnwwKTw9MTAyMyl7cT1uO2JyZWFrfXE9cSsgLTIwNDZ8MDtxPShxfDApPjEwMjM/MTAyMzpxO3c9dyo4Ljk4ODQ2NTY3NDMxMTU4ZSszMDd9ZWxzZXtpZighKChxfDApPC0xMDIyKSl7YnJlYWt9dz13KjIuMjI1MDczODU4NTA3MjAxNGUtMzA4O249cSsxMDIyfDA7aWYoISgobnwwKTwtMTAyMikpe3E9bjticmVha31xPXErMjA0NHwwO3E9KHF8MCk8LTEwMjI/LTEwMjI6cTt3PXcqMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDh9fXdoaWxlKDApO0o9T24ocSsxMDIzfDAsMCw1Mil8MDtLPUk7Y1trPj4yXT1KO2Nbays0Pj4yXT1LO3c9dyoraFtrPj4zXTticmVha31lbHNlIGlmKChCfDApPT0zKXtuPWNbbT4+Ml18MDtpZihuPj4+MDwoY1twPj4yXXwwKT4+PjApe2NbbT4+Ml09bisxO249ZFtuPj4wXXwwfWVsc2V7bj1EbihxKXwwfWlmKChufDApPT00MCl7bj0xfWVsc2V7aWYoKGNbcD4+Ml18MCk9PTApe3c9eDticmVha31jW20+PjJdPShjW20+PjJdfDApKyAtMTt3PXg7YnJlYWt9d2hpbGUoMSl7bz1jW20+PjJdfDA7aWYobz4+PjA8KGNbcD4+Ml18MCk+Pj4wKXtjW20+PjJdPW8rMTtvPWRbbz4+MF18MH1lbHNle289RG4ocSl8MH1pZighKChvKyAtNDh8MCk+Pj4wPDEwfChvKyAtNjV8MCk+Pj4wPDI2KT8hKChvKyAtOTd8MCk+Pj4wPDI2fChvfDApPT05NSk6MCl7YnJlYWt9bj1uKzF8MH1pZigob3wwKT09NDEpe3c9eDticmVha31pZigoY1twPj4yXXwwKT09MCl7dz14O2JyZWFrfW89KGNbbT4+Ml18MCkrIC0xfDA7Y1ttPj4yXT1vO2lmKChufDApPT0wKXt3PXg7YnJlYWt9ZG97bj1uKyAtMXwwO289bysgLTF8MH13aGlsZSgobnwwKSE9MCk7Y1ttPj4yXT1vO3c9eDticmVha31lbHNle249Y1ttPj4yXXwwO2lmKChjW3A+PjJdfDApIT0wKXtuPW4rIC0xfDA7Y1ttPj4yXT1ufWNbKGJiKCl8MCk+PjJdPTIyO2Nbcz4+Ml09MDtLPWNbbD4+Ml18MDtjW2o+PjJdPUstbjtjW3A+PjJdPUs7dz0wLjA7YnJlYWt9fWVsc2V7Zz0yNX19d2hpbGUoMCk7aWYoKGd8MCk9PTIxKXtpZigoY1twPj4yXXwwKSE9MD8oQT0oY1ttPj4yXXwwKSsgLTF8MCxjW20+PjJdPUEsIShCPj4+MDw0KSk6MCl7ZG97QT1BKyAtMXwwO0I9QisgLTF8MH13aGlsZShCPj4+MD4zKTtjW20+PjJdPUE7Zz0yNX1lbHNle2c9MjV9fWlmKChnfDApPT0yNSl7dz0rKG58MCkqeX1nPShjW20+PjJdfDApLShjW2w+PjJdfDApKyhjW2o+PjJdfDApfDA7aWYoKGV8MCk9PTApe2k9ZjtyZXR1cm4rd31pZigoZ3wwKSE9MCl7Yj1iK2d8MH1jW2U+PjJdPWI7aT1mO3JldHVybit3fWZ1bmN0aW9uIEduKCl7Y1sxNTgwXT1vO2NbMjQ5Ml09bztjWzI1MThdPW87Y1s1MzQ2XT1vO2NbNTY4NF09b31mdW5jdGlvbiBIbihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtiPWItZC0oYz4+PjA+YT4+PjB8MCk+Pj4wO3JldHVybihJPWIsYS1jPj4+MHwwKXwwfWZ1bmN0aW9uIEluKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2M9YStjPj4+MDtyZXR1cm4oST1iK2QrKGM+Pj4wPGE+Pj4wfDApPj4+MCxjfDApfDB9ZnVuY3Rpb24gSm4oYil7Yj1ifDA7dmFyIGM9MDtjPWI7d2hpbGUoYVtjPj4wXXwwKXtjPWMrMXwwfXJldHVybiBjLWJ8MH1mdW5jdGlvbiBLbihhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7aWYoKGN8MCk8MzIpe0k9Yj4+PmM7cmV0dXJuIGE+Pj5jfChiJigxPDxjKS0xKTw8MzItY31JPTA7cmV0dXJuIGI+Pj5jLTMyfDB9ZnVuY3Rpb24gTG4oYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTA7aWYoKGV8MCk+PTQwOTYpcmV0dXJuIG5iKGJ8MCxkfDAsZXwwKXwwO2Y9YnwwO2lmKChiJjMpPT0oZCYzKSl7d2hpbGUoYiYzKXtpZigoZXwwKT09MClyZXR1cm4gZnwwO2FbYj4+MF09YVtkPj4wXXwwO2I9YisxfDA7ZD1kKzF8MDtlPWUtMXwwfXdoaWxlKChlfDApPj00KXtjW2I+PjJdPWNbZD4+Ml07Yj1iKzR8MDtkPWQrNHwwO2U9ZS00fDB9fXdoaWxlKChlfDApPjApe2FbYj4+MF09YVtkPj4wXXwwO2I9YisxfDA7ZD1kKzF8MDtlPWUtMXwwfXJldHVybiBmfDB9ZnVuY3Rpb24gTW4oYixjLGQpe2I9YnwwO2M9Y3wwO2Q9ZHwwO3ZhciBlPTA7aWYoKGN8MCk8KGJ8MCkmKGJ8MCk8KGMrZHwwKSl7ZT1iO2M9YytkfDA7Yj1iK2R8MDt3aGlsZSgoZHwwKT4wKXtiPWItMXwwO2M9Yy0xfDA7ZD1kLTF8MDthW2I+PjBdPWFbYz4+MF18MH1iPWV9ZWxzZXtMbihiLGMsZCl8MH1yZXR1cm4gYnwwfWZ1bmN0aW9uIE5uKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MCxoPTAsaT0wO2Y9YitlfDA7aWYoKGV8MCk+PTIwKXtkPWQmMjU1O2k9YiYzO2g9ZHxkPDw4fGQ8PDE2fGQ8PDI0O2c9ZiZ+MztpZihpKXtpPWIrNC1pfDA7d2hpbGUoKGJ8MCk8KGl8MCkpe2FbYj4+MF09ZDtiPWIrMXwwfX13aGlsZSgoYnwwKTwoZ3wwKSl7Y1tiPj4yXT1oO2I9Yis0fDB9fXdoaWxlKChifDApPChmfDApKXthW2I+PjBdPWQ7Yj1iKzF8MH1yZXR1cm4gYi1lfDB9ZnVuY3Rpb24gT24oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtJPWI8PGN8KGEmKDE8PGMpLTE8PDMyLWMpPj4+MzItYztyZXR1cm4gYTw8Y31JPWE8PGMtMzI7cmV0dXJuIDB9ZnVuY3Rpb24gUG4oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2lmKChjfDApPDMyKXtJPWI+PmM7cmV0dXJuIGE+Pj5jfChiJigxPDxjKS0xKTw8MzItY31JPShifDApPDA/LTE6MDtyZXR1cm4gYj4+Yy0zMnwwfWZ1bmN0aW9uIFFuKGIpe2I9YnwwO3ZhciBjPTA7Yz1hW24rKGI+Pj4yNCk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gY3wwO2M9YVtuKyhiPj4xNiYyNTUpPj4wXXwwO2lmKChjfDApPDgpcmV0dXJuIGMrOHwwO2M9YVtuKyhiPj44JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYysxNnwwO3JldHVybihhW24rKGImMjU1KT4+MF18MCkrMjR8MH1mdW5jdGlvbiBSbihiKXtiPWJ8MDt2YXIgYz0wO2M9YVttKyhiJjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gY3wwO2M9YVttKyhiPj44JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYys4fDA7Yz1hW20rKGI+PjE2JjI1NSk+PjBdfDA7aWYoKGN8MCk8OClyZXR1cm4gYysxNnwwO3JldHVybihhW20rKGI+Pj4yNCk+PjBdfDApKzI0fDB9ZnVuY3Rpb24gU24oYSxiKXthPWF8MDtiPWJ8MDt2YXIgYz0wLGQ9MCxlPTAsZj0wO2Y9YSY2NTUzNTtkPWImNjU1MzU7Yz1lYShkLGYpfDA7ZT1hPj4+MTY7ZD0oYz4+PjE2KSsoZWEoZCxlKXwwKXwwO2I9Yj4+PjE2O2E9ZWEoYixmKXwwO3JldHVybihJPShkPj4+MTYpKyhlYShiLGUpfDApKygoKGQmNjU1MzUpK2F8MCk+Pj4xNil8MCxkK2E8PDE2fGMmNjU1MzV8MCl8MH1mdW5jdGlvbiBUbihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDt2YXIgZT0wLGY9MCxnPTAsaD0wLGk9MCxqPTA7aj1iPj4zMXwoKGJ8MCk8MD8tMTowKTw8MTtpPSgoYnwwKTwwPy0xOjApPj4zMXwoKGJ8MCk8MD8tMTowKTw8MTtmPWQ+PjMxfCgoZHwwKTwwPy0xOjApPDwxO2U9KChkfDApPDA/LTE6MCk+PjMxfCgoZHwwKTwwPy0xOjApPDwxO2g9SG4oal5hLGleYixqLGkpfDA7Zz1JO2I9Zl5qO2E9ZV5pO2E9SG4oKFluKGgsZyxIbihmXmMsZV5kLGYsZSl8MCxJLDApfDApXmIsSV5hLGIsYSl8MDtyZXR1cm4gYXwwfWZ1bmN0aW9uIFVuKGEsYixkLGUpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MDtmPWk7aT1pKzh8MDtqPWZ8MDtoPWI+PjMxfCgoYnwwKTwwPy0xOjApPDwxO2c9KChifDApPDA/LTE6MCk+PjMxfCgoYnwwKTwwPy0xOjApPDwxO2w9ZT4+MzF8KChlfDApPDA/LTE6MCk8PDE7az0oKGV8MCk8MD8tMTowKT4+MzF8KChlfDApPDA/LTE6MCk8PDE7Yj1IbihoXmEsZ15iLGgsZyl8MDthPUk7WW4oYixhLEhuKGxeZCxrXmUsbCxrKXwwLEksail8MDthPUhuKGNbaj4+Ml1eaCxjW2orND4+Ml1eZyxoLGcpfDA7Yj1JO2k9ZjtyZXR1cm4oST1iLGEpfDB9ZnVuY3Rpb24gVm4oYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7dmFyIGU9MCxmPTA7ZT1hO2Y9YzthPVNuKGUsZil8MDtjPUk7cmV0dXJuKEk9KGVhKGIsZil8MCkrKGVhKGQsZSl8MCkrY3xjJjAsYXwwfDApfDB9ZnVuY3Rpb24gV24oYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7YT1ZbihhLGIsYyxkLDApfDA7cmV0dXJuIGF8MH1mdW5jdGlvbiBYbihhLGIsZCxlKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDt2YXIgZj0wLGc9MDtnPWk7aT1pKzh8MDtmPWd8MDtZbihhLGIsZCxlLGYpfDA7aT1nO3JldHVybihJPWNbZis0Pj4yXXwwLGNbZj4+Ml18MCl8MH1mdW5jdGlvbiBZbihhLGIsZCxlLGYpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGk9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTA7aD1hO2o9YjtpPWo7bD1kO2c9ZTtrPWc7aWYoKGl8MCk9PTApe2c9KGZ8MCkhPTA7aWYoKGt8MCk9PTApe2lmKGcpe2NbZj4+Ml09KGg+Pj4wKSUobD4+PjApO2NbZis0Pj4yXT0wfWs9MDttPShoPj4+MCkvKGw+Pj4wKT4+PjA7cmV0dXJuKEk9ayxtKXwwfWVsc2V7aWYoIWcpe2w9MDttPTA7cmV0dXJuKEk9bCxtKXwwfWNbZj4+Ml09YXwwO2NbZis0Pj4yXT1iJjA7bD0wO209MDtyZXR1cm4oST1sLG0pfDB9fW09KGt8MCk9PTA7ZG97aWYoKGx8MCkhPTApe2lmKCFtKXtrPShRbihrfDApfDApLShRbihpfDApfDApfDA7aWYoaz4+PjA8PTMxKXttPWsrMXwwO2w9MzEta3wwO2E9ay0zMT4+MzE7aj1tO2I9aD4+PihtPj4+MCkmYXxpPDxsO2E9aT4+PihtPj4+MCkmYTtrPTA7bD1oPDxsO2JyZWFrfWlmKChmfDApPT0wKXtsPTA7bT0wO3JldHVybihJPWwsbSl8MH1jW2Y+PjJdPWF8MDtjW2YrND4+Ml09anxiJjA7bD0wO209MDtyZXR1cm4oST1sLG0pfDB9az1sLTF8MDtpZigoayZsfDApIT0wKXtsPShRbihsfDApfDApKzMzLShRbihpfDApfDApfDA7cD02NC1sfDA7bT0zMi1sfDA7bj1tPj4zMTtvPWwtMzJ8MDthPW8+PjMxO2o9bDtiPW0tMT4+MzEmaT4+PihvPj4+MCl8KGk8PG18aD4+PihsPj4+MCkpJmE7YT1hJmk+Pj4obD4+PjApO2s9aDw8cCZuO2w9KGk8PHB8aD4+PihvPj4+MCkpJm58aDw8bSZsLTMzPj4zMTticmVha31pZigoZnwwKSE9MCl7Y1tmPj4yXT1rJmg7Y1tmKzQ+PjJdPTB9aWYoKGx8MCk9PTEpe289anxiJjA7cD1hfDB8MDtyZXR1cm4oST1vLHApfDB9ZWxzZXtwPVJuKGx8MCl8MDtvPWk+Pj4ocD4+PjApfDA7cD1pPDwzMi1wfGg+Pj4ocD4+PjApfDA7cmV0dXJuKEk9byxwKXwwfX1lbHNle2lmKG0pe2lmKChmfDApIT0wKXtjW2Y+PjJdPShpPj4+MCklKGw+Pj4wKTtjW2YrND4+Ml09MH1vPTA7cD0oaT4+PjApLyhsPj4+MCk+Pj4wO3JldHVybihJPW8scCl8MH1pZigoaHwwKT09MCl7aWYoKGZ8MCkhPTApe2NbZj4+Ml09MDtjW2YrND4+Ml09KGk+Pj4wKSUoaz4+PjApfW89MDtwPShpPj4+MCkvKGs+Pj4wKT4+PjA7cmV0dXJuKEk9byxwKXwwfWw9ay0xfDA7aWYoKGwma3wwKT09MCl7aWYoKGZ8MCkhPTApe2NbZj4+Ml09YXwwO2NbZis0Pj4yXT1sJml8YiYwfW89MDtwPWk+Pj4oKFJuKGt8MCl8MCk+Pj4wKTtyZXR1cm4oST1vLHApfDB9az0oUW4oa3wwKXwwKS0oUW4oaXwwKXwwKXwwO2lmKGs+Pj4wPD0zMCl7YT1rKzF8MDtsPTMxLWt8MDtqPWE7Yj1pPDxsfGg+Pj4oYT4+PjApO2E9aT4+PihhPj4+MCk7az0wO2w9aDw8bDticmVha31pZigoZnwwKT09MCl7bz0wO3A9MDtyZXR1cm4oST1vLHApfDB9Y1tmPj4yXT1hfDA7Y1tmKzQ+PjJdPWp8YiYwO289MDtwPTA7cmV0dXJuKEk9byxwKXwwfX13aGlsZSgwKTtpZigoanwwKT09MCl7Zz1sO2U9MDtpPTB9ZWxzZXtoPWR8MHwwO2c9Z3xlJjA7ZT1JbihoLGcsLTEsLTEpfDA7ZD1JO2k9MDtkb3ttPWw7bD1rPj4+MzF8bDw8MTtrPWl8azw8MTttPWI8PDF8bT4+PjMxfDA7bj1iPj4+MzF8YTw8MXwwO0huKGUsZCxtLG4pfDA7cD1JO289cD4+MzF8KChwfDApPDA/LTE6MCk8PDE7aT1vJjE7Yj1IbihtLG4sbyZoLCgoKHB8MCk8MD8tMTowKT4+MzF8KChwfDApPDA/LTE6MCk8PDEpJmcpfDA7YT1JO2o9ai0xfDB9d2hpbGUoKGp8MCkhPTApO2c9bDtlPTB9aD0wO2lmKChmfDApIT0wKXtjW2Y+PjJdPWI7Y1tmKzQ+PjJdPWF9bz0oa3wwKT4+PjMxfChnfGgpPDwxfChoPDwxfGs+Pj4zMSkmMHxlO3A9KGs8PDF8MD4+PjMxKSYtMnxpO3JldHVybihJPW8scCl8MH0KCgoKZnVuY3Rpb24gT2koYixkLGUsZixnLGgsail7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7dmFyIGs9MCxsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTA7bT1pO2k9aSsyMjR8MDtsPW0rOHwwO3M9bTtvPW0rMTkyfDA7ZD1tKzE4OHwwO2s9bSsxODR8MDtwPW0rMTgwfDA7dT1zO2NbdT4+Ml09Mzc7Y1t1KzQ+PjJdPTA7dT1zKzF8MDtxPWYrNHwwO3I9Y1txPj4yXXwwO2lmKChyJjIwNDh8MCkhPTApe2FbdT4+MF09NDM7dT1zKzJ8MH1pZigociY1MTJ8MCkhPTApe2FbdT4+MF09MzU7dT11KzF8MH10PXUrMnwwO2FbdT4+MF09MTA4O2FbdSsxPj4wXT0xMDg7dT1yJjc0O2Rve2lmKCh1fDApPT04KXtpZigociYxNjM4NHwwKT09MCl7YVt0Pj4wXT0xMjA7YnJlYWt9ZWxzZXthW3Q+PjBdPTg4O2JyZWFrfX1lbHNlIGlmKCh1fDApPT02NCl7YVt0Pj4wXT0xMTF9ZWxzZXthW3Q+PjBdPTExN319d2hpbGUoMCk7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXU9Y1szMzQwXXwwO3Q9bDtjW3Q+PjJdPWg7Y1t0KzQ+PjJdPWo7aD13aShvLDIzLHUscyxsKXwwO2o9bytofDA7cT1jW3E+PjJdJjE3Njtkb3tpZigocXwwKT09MzIpe3E9an1lbHNlIGlmKChxfDApPT0xNil7cT1hW28+PjBdfDA7aWYocTw8MjQ+PjI0PT00M3xxPDwyND4+MjQ9PTQ1KXtxPW8rMXwwO2JyZWFrfWlmKChofDApPjEmcTw8MjQ+PjI0PT00OD8odT1hW28rMT4+MF18MCx1PDwyND4+MjQ9PTg4fHU8PDI0Pj4yND09MTIwKTowKXtxPW8rMnwwfWVsc2V7bj0yMX19ZWxzZXtuPTIxfX13aGlsZSgwKTtpZigobnwwKT09MjEpe3E9b31uPWNbZisyOD4+Ml18MDtjW3A+PjJdPW47bj1uKzR8MDtjW24+PjJdPShjW24+PjJdfDApKzE7S2kobyxxLGosbCxkLGsscCk7bj1jW3A+PjJdfDA7dD1uKzR8MDt1PWNbdD4+Ml18MDtjW3Q+PjJdPXUrIC0xO2lmKCh1fDApIT0wKXtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWxjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKTtzPWNbZT4+Ml18MDt0PWNbZD4+Ml18MDt1PWNbaz4+Ml18MDtMaShiLHMsbCx0LHUsZixnKTtpPW07cmV0dXJufWZ1bmN0aW9uIFBpKGIsZCxlLGYsZyxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPStqO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wO2w9aTtpPWkrMzA0fDA7cD1sO3U9bCsyMzJ8MDtyPWwrMjYwfDA7dD1sKzI0OHwwO2Q9bCsyNDR8MDtuPWwrMjQwfDA7bz1sKzI1MnwwO209bCsyNTZ8MDt2PXU7Y1t2Pj4yXT0zNztjW3YrND4+Ml09MDt2PXUrMXwwO3M9Zis0fDA7dz1jW3M+PjJdfDA7aWYoKHcmMjA0OHwwKSE9MCl7YVt2Pj4wXT00Mzt2PXUrMnwwfWlmKCh3JjEwMjR8MCkhPTApe2Fbdj4+MF09MzU7dj12KzF8MH14PXcmMjYwO3k9dz4+PjE0O2Rve2lmKCh4fDApPT0yNjApe2lmKCh5JjF8MCk9PTApe2Fbdj4+MF09OTc7dj0wO2JyZWFrfWVsc2V7YVt2Pj4wXT02NTt2PTA7YnJlYWt9fWVsc2V7YVt2Pj4wXT00Njt3PXYrMnwwO2FbdisxPj4wXT00MjtpZigoeHwwKT09MjU2KXtpZigoeSYxfDApPT0wKXthW3c+PjBdPTEwMTt2PTE7YnJlYWt9ZWxzZXthW3c+PjBdPTY5O3Y9MTticmVha319ZWxzZSBpZigoeHwwKT09NCl7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDI7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MDt2PTE7YnJlYWt9fWVsc2V7aWYoKHkmMXwwKT09MCl7YVt3Pj4wXT0xMDM7dj0xO2JyZWFrfWVsc2V7YVt3Pj4wXT03MTt2PTE7YnJlYWt9fX19d2hpbGUoMCk7Y1t0Pj4yXT1yO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtpZih2KXtjW3A+PjJdPWNbZis4Pj4yXTt5PXArNHwwO2hbaz4+M109ajtjW3k+PjJdPWNbaz4+Ml07Y1t5KzQ+PjJdPWNbays0Pj4yXTt3PXdpKHIsMzAsdyx1LHApfDB9ZWxzZXtoW2s+PjNdPWo7Y1twPj4yXT1jW2s+PjJdO2NbcCs0Pj4yXT1jW2srND4+Ml07dz13aShyLDMwLHcsdSxwKXwwfWlmKCh3fDApPjI5KXt3PShhWzEzMzY4XXwwKT09MDtpZih2KXtpZih3PyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2NbcD4+Ml09Y1tmKzg+PjJdO3k9cCs0fDA7aFtrPj4zXT1qO2NbeT4+Ml09Y1trPj4yXTtjW3krND4+Ml09Y1trKzQ+PjJdO3c9Q2kodCx3LHUscCl8MH1lbHNle2lmKHc/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7Y1twPj4yXT1jW2YrOD4+Ml07eT1wKzR8MDtoW2s+PjNdPWo7Y1t5Pj4yXT1jW2s+PjJdO2NbeSs0Pj4yXT1jW2srND4+Ml07dz1DaSh0LHcsdSxwKXwwfXQ9Y1t0Pj4yXXwwO2lmKCh0fDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3Y9dH19ZWxzZXt2PWNbdD4+Ml18MDt0PTB9dT12K3d8MDtzPWNbcz4+Ml0mMTc2O2Rve2lmKChzfDApPT0zMil7cz11fWVsc2UgaWYoKHN8MCk9PTE2KXtzPWFbdj4+MF18MDtpZihzPDwyND4+MjQ9PTQzfHM8PDI0Pj4yND09NDUpe3M9disxfDA7YnJlYWt9aWYoKHd8MCk+MSZzPDwyND4+MjQ9PTQ4Pyh5PWFbdisxPj4wXXwwLHk8PDI0Pj4yND09ODh8eTw8MjQ+PjI0PT0xMjApOjApe3M9disyfDB9ZWxzZXtxPTQ4fX1lbHNle3E9NDh9fXdoaWxlKDApO2lmKChxfDApPT00OCl7cz12fWlmKCh2fDApIT0ocnwwKSl7cD11bih3PDwzKXwwO2lmKChwfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMjY4MDt3Yih5fDAsMjI3MjgsMjA2KX1lbHNle3I9djtxPXB9fWVsc2V7cT0wfXg9Y1tmKzI4Pj4yXXwwO2Nbbz4+Ml09eDt4PXgrNHwwO2NbeD4+Ml09KGNbeD4+Ml18MCkrMTtRaShyLHMsdSxwLGQsbixvKTtvPWNbbz4+Ml18MDt4PW8rNHwwO3k9Y1t4Pj4yXXwwO2NbeD4+Ml09eSsgLTE7aWYoKHl8MCk9PTApe2xjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKX1MaShtLGNbZT4+Ml18MCxwLGNbZD4+Ml18MCxjW24+PjJdfDAsZixnKTt5PWNbbT4+Ml18MDtjW2U+PjJdPXk7Y1tiPj4yXT15O2lmKChxfDApIT0wKXt2bihxKX1pZigodHwwKT09MCl7aT1sO3JldHVybn12bih0KTtpPWw7cmV0dXJufWZ1bmN0aW9uIFFpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wO2s9aTtpPWkrMzJ8MDtvPWs7bD1rKzEyfDA7cT1jW2o+PjJdfDA7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW28+PjJdPTEzNDQ4O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM0NDgsbyl9bT0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dD1jW3ErOD4+Ml18MDtpZighKChjW3ErMTI+PjJdfDApLXQ+PjI+Pj4wPm0+Pj4wKSl7eT1YYSg0KXwwO2NbeT4+Ml09MjEzMDQ7d2IoeXwwLDIxMzc2LDE5Nil9bT1jW3QrKG08PDIpPj4yXXwwO2lmKChtfDApPT0wKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1qPWNbaj4+Ml18MDtpZighKChjWzM0MDJdfDApPT0tMSkpe2Nbbz4+Ml09MTM2MDg7Y1tvKzQ+PjJdPTIwODtjW28rOD4+Ml09MDtjZygxMzYwOCxvKX1vPShjWzEzNjEyPj4yXXwwKSsgLTF8MDtxPWNbais4Pj4yXXwwO2lmKCEoKGNbaisxMj4+Ml18MCktcT4+Mj4+PjA+bz4+PjApKXt5PVhhKDQpfDA7Y1t5Pj4yXT0yMTMwNDt3Yih5fDAsMjEzNzYsMTk2KX1qPWNbcSsobzw8Mik+PjJdfDA7aWYoKGp8MCk9PTApe3k9WGEoNCl8MDtjW3k+PjJdPTIxMzA0O3diKHl8MCwyMTM3NiwxOTYpfW1jW2NbKGNbaj4+Ml18MCkrMjA+PjJdJjEyN10obCxqKTtjW2g+PjJdPWY7bz1hW2I+PjBdfDA7aWYobzw8MjQ+PjI0PT00M3xvPDwyND4+MjQ9PTQ1KXt5PXhjW2NbKGNbbT4+Ml18MCkrNDQ+PjJdJjYzXShtLG8pfDA7dD1jW2g+PjJdfDA7Y1toPj4yXT10KzQ7Y1t0Pj4yXT15O3Q9YisxfDB9ZWxzZXt0PWJ9bz1lO2E6ZG97aWYoKChvLXR8MCk+MT8oYVt0Pj4wXXwwKT09NDg6MCk/KHA9dCsxfDAseT1hW3A+PjBdfDAseTw8MjQ+PjI0PT04OHx5PDwyND4+MjQ9PTEyMCk6MCl7eT14Y1tjWyhjW20+PjJdfDApKzQ0Pj4yXSY2M10obSw0OCl8MDt4PWNbaD4+Ml18MDtjW2g+PjJdPXgrNDtjW3g+PjJdPXk7dD10KzJ8MDt4PXhjW2NbKGNbbT4+Ml18MCkrNDQ+PjJdJjYzXShtLGFbcD4+MF18MCl8MDt5PWNbaD4+Ml18MDtjW2g+PjJdPXkrNDtjW3k+PjJdPXg7aWYodD4+PjA8ZT4+PjApe3E9dDt3aGlsZSgxKXtwPWFbcT4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9eT1wPDwyND4+MjQ7aWYoISgoeSsgLTQ4fDApPj4+MDwxMCk/ISgoKHl8MzIpKyAtOTd8MCk+Pj4wPDYpOjApe3A9dDticmVhayBhfXE9cSsxfDA7aWYoIShxPj4+MDxlPj4+MCkpe3A9dDticmVha319fWVsc2V7cD10O3E9dH19ZWxzZXtzPTE1fX13aGlsZSgwKTtiOmRve2lmKChzfDApPT0xNSl7aWYodD4+PjA8ZT4+PjApe3E9dDt3aGlsZSgxKXtwPWFbcT4+MF18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9cz1xKzF8MDtpZighKCgocDw8MjQ+PjI0KSsgLTQ4fDApPj4+MDwxMCkpe3A9dDticmVhayBifWlmKHM+Pj4wPGU+Pj4wKXtxPXN9ZWxzZXtwPXQ7cT1zO2JyZWFrfX19ZWxzZXtwPXQ7cT10fX19d2hpbGUoMCk7cz1hW2w+PjBdfDA7aWYoKHMmMSk9PTApe3M9KHMmMjU1KT4+PjF9ZWxzZXtzPWNbbCs0Pj4yXXwwfWlmKChzfDApIT0wKXtpZigocHwwKSE9KHF8MCk/KHI9cSsgLTF8MCxyPj4+MD5wPj4+MCk6MCl7cz1wO2Rve3k9YVtzPj4wXXwwO2Fbcz4+MF09YVtyPj4wXXwwO2Fbcj4+MF09eTtzPXMrMXwwO3I9cisgLTF8MH13aGlsZShzPj4+MDxyPj4+MCl9dj1vY1tjWyhjW2o+PjJdfDApKzE2Pj4yXSYxMjddKGopfDA7aWYocD4+PjA8cT4+PjApe3Q9bCsxfDA7cj1sKzR8MDt1PWwrOHwwO3g9MDt3PTA7cz1wO3doaWxlKDEpe3k9YVsoKGFbbD4+MF0mMSk9PTA/dDpjW3U+PjJdfDApK3c+PjBdfDA7aWYoeTw8MjQ+PjI0PjAmKHh8MCk9PSh5PDwyND4+MjR8MCkpe3g9Y1toPj4yXXwwO2NbaD4+Ml09eCs0O2NbeD4+Ml09djt4PWFbbD4+MF18MDtpZigoeCYxKT09MCl7eT0oeCYyNTUpPj4+MX1lbHNle3k9Y1tyPj4yXXwwfXg9MDt3PSh3Pj4+MDwoeSsgLTF8MCk+Pj4wJjEpK3d8MH1BPXhjW2NbKGNbbT4+Ml18MCkrNDQ+PjJdJjYzXShtLGFbcz4+MF18MCl8MDt6PWNbaD4+Ml18MDt5PXorNHwwO2NbaD4+Ml09eTtjW3o+PjJdPUE7cz1zKzF8MDtpZighKHM+Pj4wPHE+Pj4wKSl7YnJlYWt9ZWxzZXt4PXgrMXwwfX19ZWxzZXt5PWNbaD4+Ml18MH1wPWYrKHAtYjw8Mil8MDtpZigocHwwKSE9KHl8MCk/KG49eSsgLTR8MCxuPj4+MD5wPj4+MCk6MCl7ZG97QT1jW3A+PjJdfDA7Y1twPj4yXT1jW24+PjJdO2Nbbj4+Ml09QTtwPXArNHwwO249bisgLTR8MH13aGlsZShwPj4+MDxuPj4+MCl9fWVsc2V7dWNbY1soY1ttPj4yXXwwKSs0OD4+Ml0mMzFdKG0scCxxLGNbaD4+Ml18MCl8MDt5PShjW2g+PjJdfDApKyhxLXA8PDIpfDA7Y1toPj4yXT15fWM6ZG97aWYocT4+PjA8ZT4+PjApe3doaWxlKDEpe249YVtxPj4wXXwwO2lmKG48PDI0Pj4yND09NDYpe2JyZWFrfXo9eGNbY1soY1ttPj4yXXwwKSs0ND4+Ml0mNjNdKG0sbil8MDtBPWNbaD4+Ml18MDt5PUErNHwwO2NbaD4+Ml09eTtjW0E+PjJdPXo7cT1xKzF8MDtpZighKHE+Pj4wPGU+Pj4wKSl7YnJlYWsgY319ej1vY1tjWyhjW2o+PjJdfDApKzEyPj4yXSYxMjddKGopfDA7QT1jW2g+PjJdfDA7eT1BKzR8MDtjW2g+PjJdPXk7Y1tBPj4yXT16O3E9cSsxfDB9fXdoaWxlKDApO3VjW2NbKGNbbT4+Ml18MCkrNDg+PjJdJjMxXShtLHEsZSx5KXwwO209KGNbaD4+Ml18MCkrKG8tcTw8Mil8MDtjW2g+PjJdPW07aWYoKGR8MCkhPShlfDApKXttPWYrKGQtYjw8Mil8MH1jW2c+PjJdPW07aWYoKGFbbD4+MF0mMSk9PTApe2k9aztyZXR1cm59Zz1jW2wrOD4+Ml18MDtpZigoZ3wwKT09MCl7aT1rO3JldHVybn12bihnKTtpPWs7cmV0dXJufWZ1bmN0aW9uIFJpKGIsZCxlLGYsZyxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPStqO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTA7bD1pO2k9aSszMDR8MDtwPWw7dT1sKzIzMnwwO3I9bCsyNjB8MDt0PWwrMjQ4fDA7bT1sKzI0NHwwO2Q9bCsyNDB8MDtvPWwrMjUyfDA7bj1sKzI1NnwwO3g9dTtjW3g+PjJdPTM3O2NbeCs0Pj4yXT0wO3g9dSsxfDA7cz1mKzR8MDt2PWNbcz4+Ml18MDtpZigodiYyMDQ4fDApIT0wKXthW3g+PjBdPTQzO3g9dSsyfDB9aWYoKHYmMTAyNHwwKSE9MCl7YVt4Pj4wXT0zNTt4PXgrMXwwfXc9diYyNjA7dj12Pj4+MTQ7ZG97aWYoKHd8MCk9PTI2MCl7YVt4Pj4wXT03Njt3PXgrMXwwO2lmKCh2JjF8MCk9PTApe2Fbdz4+MF09OTc7dj0wO2JyZWFrfWVsc2V7YVt3Pj4wXT02NTt2PTA7YnJlYWt9fWVsc2V7YVt4Pj4wXT00NjthW3grMT4+MF09NDI7YVt4KzI+PjBdPTc2O3g9eCszfDA7aWYoKHd8MCk9PTQpe2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAyO3Y9MTticmVha31lbHNle2FbeD4+MF09NzA7dj0xO2JyZWFrfX1lbHNlIGlmKCh3fDApPT0yNTYpe2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAxO3Y9MTticmVha31lbHNle2FbeD4+MF09Njk7dj0xO2JyZWFrfX1lbHNle2lmKCh2JjF8MCk9PTApe2FbeD4+MF09MTAzO3Y9MTticmVha31lbHNle2FbeD4+MF09NzE7dj0xO2JyZWFrfX19fXdoaWxlKDApO2NbdD4+Ml09cjtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9dz1jWzMzNDBdfDA7aWYodil7Y1twPj4yXT1jW2YrOD4+Ml07eD1wKzR8MDtoW2s+PjNdPWo7Y1t4Pj4yXT1jW2s+PjJdO2NbeCs0Pj4yXT1jW2srND4+Ml07dz13aShyLDMwLHcsdSxwKXwwfWVsc2V7aFtrPj4zXT1qO2NbcD4+Ml09Y1trPj4yXTtjW3ArND4+Ml09Y1trKzQ+PjJdO3c9d2kociwzMCx3LHUscCl8MH1pZigod3wwKT4yOSl7dz0oYVsxMzM2OF18MCk9PTA7aWYodil7aWYodz8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX13PWNbMzM0MF18MDtjW3A+PjJdPWNbZis4Pj4yXTt4PXArNHwwO2hbaz4+M109ajtjW3g+PjJdPWNbaz4+Ml07Y1t4KzQ+PjJdPWNbays0Pj4yXTt3PUNpKHQsdyx1LHApfDB9ZWxzZXtpZih3PyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXc9Y1szMzQwXXwwO2hbaz4+M109ajtjW3A+PjJdPWNbaz4+Ml07Y1twKzQ+PjJdPWNbays0Pj4yXTt3PUNpKHQsdyx1LHApfDB9dD1jW3Q+PjJdfDA7aWYoKHR8MCk9PTApe3g9WGEoNCl8MDtjW3g+PjJdPTIyNjgwO3diKHh8MCwyMjcyOCwyMDYpfWVsc2V7dj10fX1lbHNle3Y9Y1t0Pj4yXXwwO3Q9MH11PXYrd3wwO3M9Y1tzPj4yXSYxNzY7ZG97aWYoKHN8MCk9PTMyKXtzPXV9ZWxzZSBpZigoc3wwKT09MTYpe3M9YVt2Pj4wXXwwO2lmKHM8PDI0Pj4yND09NDN8czw8MjQ+PjI0PT00NSl7cz12KzF8MDticmVha31pZigod3wwKT4xJnM8PDI0Pj4yND09NDg/KHg9YVt2KzE+PjBdfDAseDw8MjQ+PjI0PT04OHx4PDwyND4+MjQ9PTEyMCk6MCl7cz12KzJ8MH1lbHNle3E9NDh9fWVsc2V7cT00OH19d2hpbGUoMCk7aWYoKHF8MCk9PTQ4KXtzPXZ9aWYoKHZ8MCkhPShyfDApKXtwPXVuKHc8PDMpfDA7aWYoKHB8MCk9PTApe3g9WGEoNCl8MDtjW3g+PjJdPTIyNjgwO3diKHh8MCwyMjcyOCwyMDYpfWVsc2V7cj12O3E9cH19ZWxzZXtxPTB9dz1jW2YrMjg+PjJdfDA7Y1tvPj4yXT13O3c9dys0fDA7Y1t3Pj4yXT0oY1t3Pj4yXXwwKSsxO1FpKHIscyx1LHAsbSxkLG8pO289Y1tvPj4yXXwwO3c9bys0fDA7eD1jW3c+PjJdfDA7Y1t3Pj4yXT14KyAtMTtpZigoeHwwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfUxpKG4sY1tlPj4yXXwwLHAsY1ttPj4yXXwwLGNbZD4+Ml18MCxmLGcpO3g9Y1tuPj4yXXwwO2NbZT4+Ml09eDtjW2I+PjJdPXg7aWYoKHF8MCkhPTApe3ZuKHEpfWlmKCh0fDApPT0wKXtpPWw7cmV0dXJufXZuKHQpO2k9bDtyZXR1cm59ZnVuY3Rpb24gU2koYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wO2Q9aTtpPWkrMTkyfDA7bj1kO289ZCsxODB8MDtrPWQrMTYwfDA7bD1kKzEyfDA7YVtvKzA+PjBdPWFbMTIyNzI+PjBdfDA7YVtvKzE+PjBdPWFbMTIyNzM+PjBdfDA7YVtvKzI+PjBdPWFbMTIyNzQ+PjBdfDA7YVtvKzM+PjBdPWFbMTIyNzU+PjBdfDA7YVtvKzQ+PjBdPWFbMTIyNzY+PjBdfDA7YVtvKzU+PjBdPWFbMTIyNzc+PjBdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfXA9Y1szMzQwXXwwO2Nbbj4+Ml09aDtvPXdpKGssMjAscCxvLG4pfDA7aD1rK298MDtwPWNbZis0Pj4yXSYxNzY7ZG97aWYoKHB8MCk9PTMyKXtwPWh9ZWxzZSBpZigocHwwKT09MTYpe3A9YVtrPj4wXXwwO2lmKHA8PDI0Pj4yND09NDN8cDw8MjQ+PjI0PT00NSl7cD1rKzF8MDticmVha31pZigob3wwKT4xJnA8PDI0Pj4yND09NDg/KHE9YVtrKzE+PjBdfDAscTw8MjQ+PjI0PT04OHxxPDwyND4+MjQ9PTEyMCk6MCl7cD1rKzJ8MH1lbHNle209MTF9fWVsc2V7bT0xMX19d2hpbGUoMCk7aWYoKG18MCk9PTExKXtwPWt9bT1jW2YrMjg+PjJdfDA7cT1tKzR8MDtjW3E+PjJdPShjW3E+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW24+PjJdPTEzNDQ4O2Nbbis0Pj4yXT0yMDg7Y1tuKzg+PjJdPTA7Y2coMTM0NDgsbil9cT0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7bj1jW20rOD4+Ml18MDtpZigoY1ttKzEyPj4yXXwwKS1uPj4yPj4+MD5xPj4+MD8oaj1jW24rKHE8PDIpPj4yXXwwLChqfDApIT0wKTowKXtuPW0rNHwwO3E9Y1tuPj4yXXwwO2Nbbj4+Ml09cSsgLTE7aWYoKHF8MCk9PTApe2xjW2NbKGNbbT4+Ml18MCkrOD4+Ml0mMjU1XShtKX11Y1tjWyhjW2o+PjJdfDApKzQ4Pj4yXSYzMV0oaixrLGgsbCl8MDtqPWwrKG88PDIpfDA7aWYoKHB8MCk9PShofDApKXtxPWo7cD1jW2U+PjJdfDA7TGkoYixwLGwscSxqLGYsZyk7aT1kO3JldHVybn1xPWwrKHAtazw8Mil8MDtwPWNbZT4+Ml18MDtMaShiLHAsbCxxLGosZixnKTtpPWQ7cmV0dXJufXE9WGEoNCl8MDtjW3E+PjJdPTIxMzA0O3diKHF8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIFRpKGUsZixnLGgsaixrLGwsbSxuKXtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDt2YXIgbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wO3A9aTtpPWkrMzJ8MDtxPXA7cj1wKzI0fDA7dT1wKzIwfDA7dD1wKzE2fDA7cz1wKzEyfDA7eT1jW2orMjg+PjJdfDA7RD15KzR8MDtjW0Q+PjJdPShjW0Q+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW3E+PjJdPTEzNDU2O2NbcSs0Pj4yXT0yMDg7Y1txKzg+PjJdPTA7Y2coMTM0NTYscSl9eD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7ej1jW3krOD4+Ml18MDtpZigoY1t5KzEyPj4yXXwwKS16Pj4yPj4+MD54Pj4+MD8odz1jW3orKHg8PDIpPj4yXXwwLCh3fDApIT0wKTowKXtDPXkrNHwwO0Q9Y1tDPj4yXXwwO2NbQz4+Ml09RCsgLTE7aWYoKER8MCk9PTApe2xjW2NbKGNbeT4+Ml18MCkrOD4+Ml0mMjU1XSh5KX1jW2s+PjJdPTA7YTpkb3tpZigobXwwKSE9KG58MCkpe3g9dys4fDA7eT0wO2I6d2hpbGUoMSl7ej15O3k9Zzt3aGlsZSgxKXtpZigoenwwKSE9MCl7Zz15O2JyZWFrIGF9aWYoKHl8MCkhPTApe2lmKChjW3krMTI+PjJdfDApPT0oY1t5KzE2Pj4yXXwwKSl7RD0ob2NbY1soY1t5Pj4yXXwwKSszNj4+Ml0mMTI3XSh5KXwwKT09LTE7Zz1EPzA6eTt5PUQ/MDp5fWVsc2V7Zz15fX1lbHNle2c9MDt5PTB9ej0oZ3wwKT09MDtkb3tpZigoaHwwKSE9MCl7aWYoKGNbaCsxMj4+Ml18MCk9PShjW2grMTY+PjJdfDApPyhvY1tjWyhjW2g+PjJdfDApKzM2Pj4yXSYxMjddKGgpfDApPT0tMTowKXtvPTIwO2JyZWFrfWlmKCF6KXtvPTIxO2JyZWFrIGJ9fWVsc2V7bz0yMH19d2hpbGUoMCk7aWYoKG98MCk9PTIwKXtvPTA7aWYoeil7aD0wO289MjE7YnJlYWsgYn1lbHNle2g9MH19aWYoKGhjW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjYzXSh3LGFbbT4+MF18MCwwKXwwKTw8MjQ+PjI0PT0zNyl7bz0yMzticmVha316PWFbbT4+MF18MDtpZih6PDwyND4+MjQ+LTE/KHY9Y1t4Pj4yXXwwLCEoKGJbdisoejw8MjQ+PjI0PDwxKT4+MV0mODE5Mik9PTApKTowKXtvPTM0O2JyZWFrfXo9ZysxMnwwO0I9Y1t6Pj4yXXwwO0E9ZysxNnwwO2lmKChCfDApPT0oY1tBPj4yXXwwKSl7Qj1vY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSYxMjddKGcpfDB9ZWxzZXtCPWRbQj4+MF18MH1EPXhjW2NbKGNbdz4+Ml18MCkrMTI+PjJdJjYzXSh3LEImMjU1KXwwO2lmKEQ8PDI0Pj4yND09KHhjW2NbKGNbdz4+Ml18MCkrMTI+PjJdJjYzXSh3LGFbbT4+MF18MCl8MCk8PDI0Pj4yNCl7bz01OTticmVha31jW2s+PjJdPTQ7ej00fWM6ZG97aWYoKG98MCk9PTIzKXtvPTA7ej1tKzF8MDtpZigoenwwKT09KG58MCkpe289MjQ7YnJlYWsgYn15PWhjW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjYzXSh3LGFbej4+MF18MCwwKXwwO2lmKHk8PDI0Pj4yND09NDh8eTw8MjQ+PjI0PT02OSl7ej1tKzJ8MDtpZigoenwwKT09KG58MCkpe289Mjc7YnJlYWsgYn1tPXo7ej1oY1tjWyhjW3c+PjJdfDApKzM2Pj4yXSY2M10odyxhW3o+PjBdfDAsMCl8MH1lbHNle209ejt6PXk7eT0wfUQ9Y1soY1tmPj4yXXwwKSszNj4+Ml18MDtjW3Q+PjJdPWc7Y1tzPj4yXT1oO2NbciswPj4yXT1jW3QrMD4+Ml07Y1txKzA+PjJdPWNbcyswPj4yXTtuY1tEJjMxXSh1LGYscixxLGosayxsLHoseSk7bT1tKzF8MDtnPWNbdT4+Ml18MH1lbHNlIGlmKChvfDApPT0zNCl7d2hpbGUoMSl7bz0wO209bSsxfDA7aWYoKG18MCk9PShufDApKXttPW47YnJlYWt9ej1hW20+PjBdfDA7aWYoISh6PDwyND4+MjQ+LTEpKXticmVha31pZigoYlt2Kyh6PDwyND4+MjQ8PDEpPj4xXSY4MTkyKT09MCl7YnJlYWt9ZWxzZXtvPTM0fX1CPWg7QT1oO3doaWxlKDEpe2lmKChnfDApIT0wKXtpZigoY1tnKzEyPj4yXXwwKT09KGNbZysxNj4+Ml18MCkpe0Q9KG9jW2NbKGNbZz4+Ml18MCkrMzY+PjJdJjEyN10oZyl8MCk9PS0xO2c9RD8wOmc7eT1EPzA6eX19ZWxzZXtnPTB9Qz0oZ3wwKT09MDtkb3tpZigoQXwwKSE9MCl7aWYoKGNbQSsxMj4+Ml18MCkhPShjW0ErMTY+PjJdfDApKXtpZihDKXt6PUI7YnJlYWt9ZWxzZXtnPXk7YnJlYWsgY319aWYoISgob2NbY1soY1tBPj4yXXwwKSszNj4+Ml0mMTI3XShBKXwwKT09LTEpKXtpZihDXihCfDApPT0wKXt6PUI7QT1CfWVsc2V7Zz15O2JyZWFrIGN9fWVsc2V7ej0wO2g9MDtvPTQ1fX1lbHNle3o9QjtvPTQ1fX13aGlsZSgwKTtpZigob3wwKT09NDUpe289MDtpZihDKXtnPXk7YnJlYWsgY31lbHNle0E9MH19Qj1nKzEyfDA7RD1jW0I+PjJdfDA7Qz1nKzE2fDA7aWYoKER8MCk9PShjW0M+PjJdfDApKXtEPW9jW2NbKGNbZz4+Ml18MCkrMzY+PjJdJjEyN10oZyl8MH1lbHNle0Q9ZFtEPj4wXXwwfWlmKCEoKEQmMjU1KTw8MjQ+PjI0Pi0xKSl7Zz15O2JyZWFrIGN9aWYoKGJbKGNbeD4+Ml18MCkrKEQ8PDI0Pj4yNDw8MSk+PjFdJjgxOTIpPT0wKXtnPXk7YnJlYWsgY31EPWNbQj4+Ml18MDtpZigoRHwwKT09KGNbQz4+Ml18MCkpe29jW2NbKGNbZz4+Ml18MCkrNDA+PjJdJjEyN10oZyl8MDtCPXo7Y29udGludWV9ZWxzZXtjW0I+PjJdPUQrMTtCPXo7Y29udGludWV9fX1lbHNlIGlmKChvfDApPT01OSl7bz0wO0I9Y1t6Pj4yXXwwO2lmKChCfDApPT0oY1tBPj4yXXwwKSl7b2NbY1soY1tnPj4yXXwwKSs0MD4+Ml0mMTI3XShnKXwwfWVsc2V7Y1t6Pj4yXT1CKzF9bT1tKzF8MDtnPXl9fXdoaWxlKDApO2lmKChtfDApPT0obnwwKSl7YnJlYWsgYX15PWNbaz4+Ml18MH1pZigob3wwKT09MjEpe2Nbaz4+Ml09NDticmVha31lbHNlIGlmKChvfDApPT0yNCl7Y1trPj4yXT00O2JyZWFrfWVsc2UgaWYoKG98MCk9PTI3KXtjW2s+PjJdPTQ7YnJlYWt9fX13aGlsZSgwKTtpZigoZ3wwKSE9MCl7aWYoKGNbZysxMj4+Ml18MCk9PShjW2crMTY+PjJdfDApKXtEPShvY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSYxMjddKGcpfDApPT0tMTtnPUQ/MDpnfX1lbHNle2c9MH1mPShnfDApPT0wO2Rve2lmKChofDApIT0wKXtpZigoY1toKzEyPj4yXXwwKT09KGNbaCsxNj4+Ml18MCk/KG9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MCk9PS0xOjApe289NzE7YnJlYWt9aWYoZil7Y1tlPj4yXT1nO2k9cDtyZXR1cm59fWVsc2V7bz03MX19d2hpbGUoMCk7aWYoKG98MCk9PTcxPyFmOjApe2NbZT4+Ml09ZztpPXA7cmV0dXJufWNbaz4+Ml09Y1trPj4yXXwyO2NbZT4+Ml09ZztpPXA7cmV0dXJufUQ9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIFVpKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFZpKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBXaShhKXthPWF8MDtyZXR1cm4gMn1mdW5jdGlvbiBYaShhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wO2o9aTtUaShhLGIsY1tkPj4yXXwwLGNbZT4+Ml18MCxmLGcsaCwxMjM3NiwxMjM4NHwwKTtpPWo7cmV0dXJufWZ1bmN0aW9uIFlpKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTA7az1pO209ZCs4fDA7bT1vY1tjWyhjW20+PjJdfDApKzIwPj4yXSYxMjddKG0pfDA7bj1hW20+PjBdfDA7aWYoKG4mMSk9PTApe2w9bSsxfDA7bT0obiYyNTUpPj4+MX1lbHNle2w9Y1ttKzg+PjJdfDA7bT1jW20rND4+Ml18MH1UaShiLGQsY1tlPj4yXXwwLGNbZj4+Ml18MCxnLGgsaixsLGwrbXwwKTtpPWs7cmV0dXJufWZ1bmN0aW9uIFppKGEsYixkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTA7aj1pO2k9aSsxNnwwO2w9ajtmPWNbZisyOD4+Ml18MDttPWYrNHwwO2NbbT4+Ml09KGNbbT4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbbD4+Ml09MTM0NTY7Y1tsKzQ+PjJdPTIwODtjW2wrOD4+Ml09MDtjZygxMzQ1NixsKX1sPShjWzEzNDYwPj4yXXwwKSsgLTF8MDttPWNbZis4Pj4yXXwwO2lmKChjW2YrMTI+PjJdfDApLW0+PjI+Pj4wPmw+Pj4wPyhrPWNbbSsobDw8Mik+PjJdfDAsKGt8MCkhPTApOjApe2w9Zis0fDA7bT1jW2w+PjJdfDA7Y1tsPj4yXT1tKyAtMTtpZigobXwwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfW09Y1tlPj4yXXwwO2I9Yis4fDA7Yj1vY1tjW2NbYj4+Ml0+PjJdJjEyN10oYil8MDtiPShNaChkLG0sYixiKzE2OHwwLGssZywwKXwwKS1ifDA7aWYoKGJ8MCk+PTE2OCl7bT1jW2Q+PjJdfDA7Y1thPj4yXT1tO2k9ajtyZXR1cm59Y1toKzI0Pj4yXT0oKGJ8MCkvMTJ8MHwwKSU3fDA7bT1jW2Q+PjJdfDA7Y1thPj4yXT1tO2k9ajtyZXR1cm59bT1YYSg0KXwwO2NbbT4+Ml09MjEzMDQ7d2IobXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gX2koYSxiLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MDtqPWk7aT1pKzE2fDA7bD1qO2Y9Y1tmKzI4Pj4yXXwwO209Zis0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tsPj4yXT0xMzQ1NjtjW2wrND4+Ml09MjA4O2NbbCs4Pj4yXT0wO2NnKDEzNDU2LGwpfWw9KGNbMTM0NjA+PjJdfDApKyAtMXwwO209Y1tmKzg+PjJdfDA7aWYoKGNbZisxMj4+Ml18MCktbT4+Mj4+PjA+bD4+PjA/KGs9Y1ttKyhsPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7bD1mKzR8MDttPWNbbD4+Ml18MDtjW2w+PjJdPW0rIC0xO2lmKChtfDApPT0wKXtsY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZil9bT1jW2U+PjJdfDA7Yj1iKzh8MDtiPW9jW2NbKGNbYj4+Ml18MCkrND4+Ml0mMTI3XShiKXwwO2I9KE1oKGQsbSxiLGIrMjg4fDAsayxnLDApfDApLWJ8MDtpZigoYnwwKT49Mjg4KXttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1jW2grMTY+PjJdPSgoYnwwKS8xMnwwfDApJTEyfDA7bT1jW2Q+PjJdfDA7Y1thPj4yXT1tO2k9ajtyZXR1cm59bT1YYSg0KXwwO2NbbT4+Ml09MjEzMDQ7d2IobXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gJGkoYSxiLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wO2I9aTtpPWkrMTZ8MDtrPWI7Zj1jW2YrMjg+PjJdfDA7bD1mKzR8MDtjW2w+PjJdPShjW2w+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW2s+PjJdPTEzNDU2O2Nbays0Pj4yXT0yMDg7Y1trKzg+PjJdPTA7Y2coMTM0NTYsayl9az0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7bD1jW2YrOD4+Ml18MDtpZigoY1tmKzEyPj4yXXwwKS1sPj4yPj4+MD5rPj4+MD8oaj1jW2wrKGs8PDIpPj4yXXwwLChqfDApIT0wKTowKXtrPWYrNHwwO2w9Y1trPj4yXXwwO2Nbaz4+Ml09bCsgLTE7aWYoKGx8MCk9PTApe2xjW2NbKGNbZj4+Ml18MCkrOD4+Ml0mMjU1XShmKX1lPWJqKGQsY1tlPj4yXXwwLGcsaiw0KXwwO2lmKChjW2c+PjJdJjR8MCkhPTApe2w9Y1tkPj4yXXwwO2NbYT4+Ml09bDtpPWI7cmV0dXJufWlmKChlfDApPDY5KXtnPWUrMmUzfDB9ZWxzZXtnPShlKyAtNjl8MCk+Pj4wPDMxP2UrMTkwMHwwOmV9Y1toKzIwPj4yXT1nKyAtMTkwMDtsPWNbZD4+Ml18MDtjW2E+PjJdPWw7aT1iO3JldHVybn1sPVhhKDQpfDA7Y1tsPj4yXT0yMTMwNDt3YihsfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBhaihlLGYsZyxoLGosayxsLG0sbil7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7dmFyIG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTA7bj1pO2k9aSs2NHwwO3c9bjtFPW4rMTZ8MDtyPW4rMjh8MDt1PW4rMjR8MDt2PW4rMzJ8MDt5PW4rMTJ8MDt6PW4rMjB8MDt4PW4rMzZ8MDtCPW4rNDB8MDt0PW4rNDR8MDtzPW4rNDh8MDtjW2s+PjJdPTA7QT1jW2orMjg+PjJdfDA7RD1BKzR8MDtjW0Q+PjJdPShjW0Q+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW3c+PjJdPTEzNDU2O2Nbdys0Pj4yXT0yMDg7Y1t3Kzg+PjJdPTA7Y2coMTM0NTYsdyl9Qz0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7RD1jW0ErOD4+Ml18MDtpZigoY1tBKzEyPj4yXXwwKS1EPj4yPj4+MD5DPj4+MD8ocD1jW0QrKEM8PDIpPj4yXXwwLChwfDApIT0wKTowKXtDPUErNHwwO0Q9Y1tDPj4yXXwwO2NbQz4+Ml09RCsgLTE7aWYoKER8MCk9PTApe2xjW2NbKGNbQT4+Ml18MCkrOD4+Ml0mMjU1XShBKX1hOmRve3N3aXRjaChtPDwyND4+MjR8MCl7Y2FzZSAxMTI6e289bCs4fDA7bD1jW2g+PjJdfDA7aD1mKzh8MDtoPW9jW2NbKGNbaD4+Ml18MCkrOD4+Ml0mMTI3XShoKXwwO2Y9YVtoPj4wXXwwO2lmKChmJjEpPT0wKXtmPShmJjI1NSk+Pj4xfWVsc2V7Zj1jW2grND4+Ml18MH1qPWFbaCsxMj4+MF18MDtpZigoaiYxKT09MCl7aj0oaiYyNTUpPj4+MX1lbHNle2o9Y1toKzE2Pj4yXXwwfWlmKChmfDApPT0oMC1qfDApKXtjW2s+PjJdPWNbaz4+Ml18NDticmVhayBhfUU9TWgoZyxsLGgsaCsyNHwwLHAsaywwKXwwO2s9RS1ofDA7aWYoKEV8MCk9PShofDApPyhjW28+PjJdfDApPT0xMjowKXtjW28+PjJdPTA7YnJlYWsgYX1pZigoa3wwKT09MTI/KHE9Y1tvPj4yXXwwLChxfDApPDEyKTowKXtjW28+PjJdPXErMTJ9YnJlYWt9O2Nhc2UgMTIwOntEPWNbKGNbZj4+Ml18MCkrMjA+PjJdfDA7Y1tCPj4yXT1jW2c+PjJdO2NbdD4+Ml09Y1toPj4yXTtjW0UrMD4+Ml09Y1tCKzA+PjJdO2NbdyswPj4yXT1jW3QrMD4+Ml07aWNbRCY2M10oZSxmLEUsdyxqLGssbCk7aT1uO3JldHVybn07Y2FzZSA4ODp7cT1mKzh8MDtxPW9jW2NbKGNbcT4+Ml18MCkrMjQ+PjJdJjEyN10ocSl8MDtwPWFbcT4+MF18MDtpZigocCYxKT09MCl7bz1xKzF8MDtwPShwJjI1NSk+Pj4xfWVsc2V7bz1jW3ErOD4+Ml18MDtwPWNbcSs0Pj4yXXwwfVRpKHMsZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLG8sbytwfDApO2NbZz4+Ml09Y1tzPj4yXTticmVha307Y2FzZSAxMjE6e289bCsyMHwwO2w9YmooZyxjW2g+PjJdfDAsayxwLDQpfDA7aWYoKGNbaz4+Ml0mNHwwKT09MCl7aWYoKGx8MCk8Njkpe2s9bCsyZTN8MH1lbHNle2s9KGwrIC02OXwwKT4+PjA8MzE/bCsxOTAwfDA6bH1jW28+PjJdPWsrIC0xOTAwfWJyZWFrfTtjYXNlIDgzOntvPWJqKGcsY1toPj4yXXwwLGsscCwyKXwwO3A9Y1trPj4yXXwwO2lmKChwJjR8MCk9PTAmKG98MCk8NjEpe2NbbD4+Ml09bzticmVhayBhfWVsc2V7Y1trPj4yXT1wfDQ7YnJlYWsgYX19O2Nhc2UgODI6e1RpKHosZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLDEyNDE2LDEyNDIxfDApO2NbZz4+Ml09Y1t6Pj4yXTticmVha307Y2FzZSAxMTQ6e1RpKHksZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLDEyNDAwLDEyNDExfDApO2NbZz4+Ml09Y1t5Pj4yXTticmVha307Y2FzZSA4OTp7bz1iaihnLGNbaD4+Ml18MCxrLHAsNCl8MDtpZigoY1trPj4yXSY0fDApPT0wKXtjW2wrMjA+PjJdPW8rIC0xOTAwfWJyZWFrfTtjYXNlIDM3OntsPWNbaD4+Ml18MDtoPWNbZz4+Ml18MDtkb3tpZigoaHwwKSE9MCl7aWYoKGNbaCsxMj4+Ml18MCk9PShjW2grMTY+PjJdfDApKXtpZigob2NbY1soY1toPj4yXXwwKSszNj4+Ml0mMTI3XShoKXwwKT09LTEpe2NbZz4+Ml09MDtoPTA7YnJlYWt9ZWxzZXtoPWNbZz4+Ml18MDticmVha319fWVsc2V7aD0wfX13aGlsZSgwKTtoPShofDApPT0wO2Rve2lmKChsfDApIT0wKXtpZigoY1tsKzEyPj4yXXwwKT09KGNbbCsxNj4+Ml18MCk/KG9jW2NbKGNbbD4+Ml18MCkrMzY+PjJdJjEyN10obCl8MCk9PS0xOjApe289MTE1O2JyZWFrfWlmKCFoKXtvPTExNn19ZWxzZXtvPTExNX19d2hpbGUoMCk7aWYoKG98MCk9PTExNSl7aWYoaCl7bz0xMTZ9ZWxzZXtsPTB9fWlmKChvfDApPT0xMTYpe2Nbaz4+Ml09Y1trPj4yXXw2O2JyZWFrIGF9aD1jW2c+PjJdfDA7Zj1jW2grMTI+PjJdfDA7aWYoKGZ8MCk9PShjW2grMTY+PjJdfDApKXtoPW9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MH1lbHNle2g9ZFtmPj4wXXwwfWlmKCEoKGhjW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjYzXShwLGgmMjU1LDApfDApPDwyND4+MjQ9PTM3KSl7Y1trPj4yXT1jW2s+PjJdfDQ7YnJlYWsgYX1wPWNbZz4+Ml18MDtoPXArMTJ8MDtmPWNbaD4+Ml18MDtpZigoZnwwKT09KGNbcCsxNj4+Ml18MCkpe29jW2NbKGNbcD4+Ml18MCkrNDA+PjJdJjEyN10ocCl8MH1lbHNle2NbaD4+Ml09ZisxfXA9Y1tnPj4yXXwwO2Rve2lmKChwfDApIT0wKXtpZigoY1twKzEyPj4yXXwwKT09KGNbcCsxNj4+Ml18MCkpe2lmKChvY1tjWyhjW3A+PjJdfDApKzM2Pj4yXSYxMjddKHApfDApPT0tMSl7Y1tnPj4yXT0wO3A9MDticmVha31lbHNle3A9Y1tnPj4yXXwwO2JyZWFrfX19ZWxzZXtwPTB9fXdoaWxlKDApO3A9KHB8MCk9PTA7ZG97aWYoKGx8MCkhPTApe2lmKChjW2wrMTI+PjJdfDApPT0oY1tsKzE2Pj4yXXwwKT8ob2NbY1soY1tsPj4yXXwwKSszNj4+Ml0mMTI3XShsKXwwKT09LTE6MCl7bz0xMzQ7YnJlYWt9aWYocCl7YnJlYWsgYX19ZWxzZXtvPTEzNH19d2hpbGUoMCk7aWYoKG98MCk9PTEzND8hcDowKXticmVhayBhfWNbaz4+Ml09Y1trPj4yXXwyO2JyZWFrfTtjYXNlIDg0OntUaSh4LGYsY1tnPj4yXXwwLGNbaD4+Ml18MCxqLGssbCwxMjQyNCwxMjQzMnwwKTtjW2c+PjJdPWNbeD4+Ml07YnJlYWt9O2Nhc2UgMTE5OntvPWJqKGcsY1toPj4yXXwwLGsscCwxKXwwO3A9Y1trPj4yXXwwO2lmKChwJjR8MCk9PTAmKG98MCk8Nyl7Y1tsKzI0Pj4yXT1vO2JyZWFrIGF9ZWxzZXtjW2s+PjJdPXB8NDticmVhayBhfX07Y2FzZSAxMDk6e289YmooZyxjW2g+PjJdfDAsayxwLDIpfDA7cD1jW2s+PjJdfDA7aWYoKHAmNHwwKT09MCYob3wwKTwxMyl7Y1tsKzE2Pj4yXT1vKyAtMTticmVhayBhfWVsc2V7Y1trPj4yXT1wfDQ7YnJlYWsgYX19O2Nhc2UgNzc6e289YmooZyxjW2g+PjJdfDAsayxwLDIpfDA7cD1jW2s+PjJdfDA7aWYoKHAmNHwwKT09MCYob3wwKTw2MCl7Y1tsKzQ+PjJdPW87YnJlYWsgYX1lbHNle2Nbaz4+Ml09cHw0O2JyZWFrIGF9fTtjYXNlIDEwNjp7bz1iaihnLGNbaD4+Ml18MCxrLHAsMyl8MDtwPWNbaz4+Ml18MDtpZigocCY0fDApPT0wJihvfDApPDM2Nil7Y1tsKzI4Pj4yXT1vO2JyZWFrIGF9ZWxzZXtjW2s+PjJdPXB8NDticmVhayBhfX07Y2FzZSA3Mjp7cD1iaihnLGNbaD4+Ml18MCxrLHAsMil8MDtvPWNbaz4+Ml18MDtpZigobyY0fDApPT0wJihwfDApPDI0KXtjW2wrOD4+Ml09cDticmVhayBhfWVsc2V7Y1trPj4yXT1vfDQ7YnJlYWsgYX19O2Nhc2UgNzA6e1RpKHYsZixjW2c+PjJdfDAsY1toPj4yXXwwLGosayxsLDEyMzkyLDEyNDAwfDApO2NbZz4+Ml09Y1t2Pj4yXTticmVha307Y2FzZSA2ODp7VGkodSxmLGNbZz4+Ml18MCxjW2g+PjJdfDAsaixrLGwsMTIzODQsMTIzOTJ8MCk7Y1tnPj4yXT1jW3U+PjJdO2JyZWFrfTtjYXNlIDEwNDpjYXNlIDY2OmNhc2UgOTg6e0Q9Y1toPj4yXXwwO0U9Zis4fDA7RT1vY1tjWyhjW0U+PjJdfDApKzQ+PjJdJjEyN10oRSl8MDtrPShNaChnLEQsRSxFKzI4OHwwLHAsaywwKXwwKS1FfDA7aWYoKGt8MCk8Mjg4KXtjW2wrMTY+PjJdPSgoa3wwKS8xMnwwfDApJTEyfDB9YnJlYWt9O2Nhc2UgNzM6e289bCs4fDA7bD1iaihnLGNbaD4+Ml18MCxrLHAsMil8MDtwPWNbaz4+Ml18MDtpZigocCY0fDApPT0wPyhsKyAtMXwwKT4+PjA8MTI6MCl7Y1tvPj4yXT1sO2JyZWFrIGF9Y1trPj4yXT1wfDQ7YnJlYWt9O2Nhc2UgNjU6Y2FzZSA5Nzp7RD1jW2g+PjJdfDA7RT1mKzh8MDtFPW9jW2NbY1tFPj4yXT4+Ml0mMTI3XShFKXwwO2s9KE1oKGcsRCxFLEUrMTY4fDAscCxrLDApfDApLUV8MDtpZigoa3wwKTwxNjgpe2NbbCsyND4+Ml09KChrfDApLzEyfDB8MCklN3wwfWJyZWFrfTtjYXNlIDEwMTpjYXNlIDEwMDp7bz1sKzEyfDA7bD1iaihnLGNbaD4+Ml18MCxrLHAsMil8MDtwPWNbaz4+Ml18MDtpZigocCY0fDApPT0wPyhsKyAtMXwwKT4+PjA8MzE6MCl7Y1tvPj4yXT1sO2JyZWFrIGF9Y1trPj4yXT1wfDQ7YnJlYWt9O2Nhc2UgMTE2OmNhc2UgMTEwOntsPXArOHwwO3A9Y1toPj4yXXwwO2I6d2hpbGUoMSl7aD1jW2c+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKChjW2grMTI+PjJdfDApPT0oY1toKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MCk9PS0xKXtjW2c+PjJdPTA7aD0wO2JyZWFrfWVsc2V7aD1jW2c+PjJdfDA7YnJlYWt9fX1lbHNle2g9MH19d2hpbGUoMCk7aD0oaHwwKT09MDtkb3tpZigocHwwKSE9MCl7aWYoKGNbcCsxMj4+Ml18MCkhPShjW3ArMTY+PjJdfDApKXtpZihoKXticmVha31lbHNle2JyZWFrIGJ9fWlmKCEoKG9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MCk9PS0xKSl7aWYoIWgpe2JyZWFrIGJ9fWVsc2V7bz01MH19ZWxzZXtvPTUwfX13aGlsZSgwKTtpZigob3wwKT09NTApe289MDtpZihoKXtwPTA7YnJlYWt9ZWxzZXtwPTB9fWg9Y1tnPj4yXXwwO2Y9Y1toKzEyPj4yXXwwO2lmKChmfDApPT0oY1toKzE2Pj4yXXwwKSl7aD1vY1tjWyhjW2g+PjJdfDApKzM2Pj4yXSYxMjddKGgpfDB9ZWxzZXtoPWRbZj4+MF18MH1pZighKChoJjI1NSk8PDI0Pj4yND4tMSkpe2JyZWFrfWlmKChiWyhjW2w+PjJdfDApKyhoPDwyND4+MjQ8PDEpPj4xXSY4MTkyKT09MCl7YnJlYWt9aj1jW2c+PjJdfDA7aD1qKzEyfDA7Zj1jW2g+PjJdfDA7aWYoKGZ8MCk9PShjW2orMTY+PjJdfDApKXtvY1tjWyhjW2o+PjJdfDApKzQwPj4yXSYxMjddKGopfDA7Y29udGludWV9ZWxzZXtjW2g+PjJdPWYrMTtjb250aW51ZX19bD1jW2c+PjJdfDA7ZG97aWYoKGx8MCkhPTApe2lmKChjW2wrMTI+PjJdfDApPT0oY1tsKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbbD4+Ml18MCkrMzY+PjJdJjEyN10obCl8MCk9PS0xKXtjW2c+PjJdPTA7bD0wO2JyZWFrfWVsc2V7bD1jW2c+PjJdfDA7YnJlYWt9fX1lbHNle2w9MH19d2hpbGUoMCk7bD0obHwwKT09MDtkb3tpZigocHwwKSE9MCl7aWYoKGNbcCsxMj4+Ml18MCk9PShjW3ArMTY+PjJdfDApPyhvY1tjWyhjW3A+PjJdfDApKzM2Pj4yXSYxMjddKHApfDApPT0tMTowKXtvPTY5O2JyZWFrfWlmKGwpe2JyZWFrIGF9fWVsc2V7bz02OX19d2hpbGUoMCk7aWYoKG98MCk9PTY5PyFsOjApe2JyZWFrIGF9Y1trPj4yXT1jW2s+PjJdfDI7YnJlYWt9O2Nhc2UgOTk6e3E9Zis4fDA7cT1vY1tjWyhjW3E+PjJdfDApKzEyPj4yXSYxMjddKHEpfDA7cD1hW3E+PjBdfDA7aWYoKHAmMSk9PTApe289cSsxfDA7cD0ocCYyNTUpPj4+MX1lbHNle289Y1txKzg+PjJdfDA7cD1jW3ErND4+Ml18MH1UaShyLGYsY1tnPj4yXXwwLGNbaD4+Ml18MCxqLGssbCxvLG8rcHwwKTtjW2c+PjJdPWNbcj4+Ml07YnJlYWt9O2RlZmF1bHQ6e2Nbaz4+Ml09Y1trPj4yXXw0fX19d2hpbGUoMCk7Y1tlPj4yXT1jW2c+PjJdO2k9bjtyZXR1cm59RT1YYSg0KXwwO2NbRT4+Ml09MjEzMDQ7d2IoRXwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gYmooYSxlLGYsZyxoKXthPWF8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wLG49MCxvPTAscD0wO2o9aTtsPWNbYT4+Ml18MDtkb3tpZigobHwwKSE9MCl7aWYoKGNbbCsxMj4+Ml18MCk9PShjW2wrMTY+PjJdfDApKXtpZigob2NbY1soY1tsPj4yXXwwKSszNj4+Ml0mMTI3XShsKXwwKT09LTEpe2NbYT4+Ml09MDtsPTA7YnJlYWt9ZWxzZXtsPWNbYT4+Ml18MDticmVha319fWVsc2V7bD0wfX13aGlsZSgwKTtsPShsfDApPT0wO2Rve2lmKChlfDApIT0wKXtpZigoY1tlKzEyPj4yXXwwKT09KGNbZSsxNj4+Ml18MCk/KG9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MCk9PS0xOjApe209MTA7YnJlYWt9aWYoIWwpe209MTF9fWVsc2V7bT0xMH19d2hpbGUoMCk7aWYoKG18MCk9PTEwKXtpZihsKXttPTExfWVsc2V7ZT0wfX1pZigobXwwKT09MTEpe2NbZj4+Ml09Y1tmPj4yXXw2O3A9MDtpPWo7cmV0dXJuIHB8MH1tPWNbYT4+Ml18MDtsPWNbbSsxMj4+Ml18MDtpZigobHwwKT09KGNbbSsxNj4+Ml18MCkpe209b2NbY1soY1ttPj4yXXwwKSszNj4+Ml0mMTI3XShtKXwwfWVsc2V7bT1kW2w+PjBdfDB9bD1tJjI1NTtpZihsPDwyND4+MjQ+LTE/KGs9Zys4fDAsISgoYlsoY1trPj4yXXwwKSsobTw8MjQ+PjI0PDwxKT4+MV0mMjA0OCk9PTApKTowKXtsPShoY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSY2M10oZyxsLDApfDApPDwyND4+MjQ7bz1jW2E+PjJdfDA7bT1vKzEyfDA7bj1jW20+PjJdfDA7aWYoKG58MCk9PShjW28rMTY+PjJdfDApKXtvY1tjWyhjW28+PjJdfDApKzQwPj4yXSYxMjddKG8pfDA7bj1lO209ZX1lbHNle2NbbT4+Ml09bisxO249ZTttPWV9d2hpbGUoMSl7bD1sKyAtNDh8MDtoPWgrIC0xfDA7ZT1jW2E+PjJdfDA7ZG97aWYoKGV8MCkhPTApe2lmKChjW2UrMTI+PjJdfDApPT0oY1tlKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MCk9PS0xKXtjW2E+PjJdPTA7ZT0wO2JyZWFrfWVsc2V7ZT1jW2E+PjJdfDA7YnJlYWt9fX1lbHNle2U9MH19d2hpbGUoMCk7bz0oZXwwKT09MDtpZigobXwwKSE9MCl7aWYoKGNbbSsxMj4+Ml18MCk9PShjW20rMTY+PjJdfDApKXttPShvY1tjWyhjW20+PjJdfDApKzM2Pj4yXSYxMjddKG0pfDApPT0tMTtlPW0/MDpuO209bT8wOm59ZWxzZXtlPW59fWVsc2V7ZT1uO209MH1uPWNbYT4+Ml18MDtpZighKChvXihtfDApPT0wKSYoaHwwKT4wKSl7bT0zODticmVha31vPWNbbisxMj4+Ml18MDtpZigob3wwKT09KGNbbisxNj4+Ml18MCkpe249b2NbY1soY1tuPj4yXXwwKSszNj4+Ml0mMTI3XShuKXwwfWVsc2V7bj1kW28+PjBdfDB9bz1uJjI1NTtpZighKG88PDI0Pj4yND4tMSkpe209NDk7YnJlYWt9aWYoKGJbKGNbaz4+Ml18MCkrKG48PDI0Pj4yNDw8MSk+PjFdJjIwNDgpPT0wKXttPTQ5O2JyZWFrfWw9KChoY1tjWyhjW2c+PjJdfDApKzM2Pj4yXSY2M10oZyxvLDApfDApPDwyND4+MjQpKyhsKjEwfDApfDA7bj1jW2E+PjJdfDA7cD1uKzEyfDA7bz1jW3A+PjJdfDA7aWYoKG98MCk9PShjW24rMTY+PjJdfDApKXtvY1tjWyhjW24+PjJdfDApKzQwPj4yXSYxMjddKG4pfDA7bj1lO2NvbnRpbnVlfWVsc2V7Y1twPj4yXT1vKzE7bj1lO2NvbnRpbnVlfX1pZigobXwwKT09Mzgpe2Rve2lmKChufDApIT0wKXtpZigoY1tuKzEyPj4yXXwwKT09KGNbbisxNj4+Ml18MCkpe2lmKChvY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDApPT0tMSl7Y1thPj4yXT0wO249MDticmVha31lbHNle249Y1thPj4yXXwwO2JyZWFrfX19ZWxzZXtuPTB9fXdoaWxlKDApO2c9KG58MCk9PTA7ZG97aWYoKGV8MCkhPTApe2lmKChjW2UrMTI+PjJdfDApPT0oY1tlKzE2Pj4yXXwwKT8ob2NbY1soY1tlPj4yXXwwKSszNj4+Ml0mMTI3XShlKXwwKT09LTE6MCl7bT00NzticmVha31pZihnKXtwPWw7aT1qO3JldHVybiBwfDB9fWVsc2V7bT00N319d2hpbGUoMCk7aWYoKG18MCk9PTQ3PyFnOjApe3A9bDtpPWo7cmV0dXJuIHB8MH1jW2Y+PjJdPWNbZj4+Ml18MjtwPWw7aT1qO3JldHVybiBwfDB9ZWxzZSBpZigobXwwKT09NDkpe2k9ajtyZXR1cm4gbHwwfX1jW2Y+PjJdPWNbZj4+Ml18NDtwPTA7aT1qO3JldHVybiBwfDB9ZnVuY3Rpb24gY2ooYSxiLGQsZSxmLGcsaCxqLGspe2E9YXwwO2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO2s9a3wwO3ZhciBsPTAsbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wO209aTtpPWkrMzJ8MDtvPW07cD1tKzI0fDA7bj1tKzIwfDA7cj1tKzE2fDA7cT1tKzEyfDA7dD1jW2YrMjg+PjJdfDA7eT10KzR8MDtjW3k+PjJdPShjW3k+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW28+PjJdPTEzNDQ4O2Nbbys0Pj4yXT0yMDg7Y1tvKzg+PjJdPTA7Y2coMTM0NDgsbyl9dT0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dj1jW3QrOD4+Ml18MDtpZigoY1t0KzEyPj4yXXwwKS12Pj4yPj4+MD51Pj4+MD8ocz1jW3YrKHU8PDIpPj4yXXwwLChzfDApIT0wKTowKXt4PXQrNHwwO3k9Y1t4Pj4yXXwwO2NbeD4+Ml09eSsgLTE7aWYoKHl8MCk9PTApe2xjW2NbKGNbdD4+Ml18MCkrOD4+Ml0mMjU1XSh0KX1jW2c+PjJdPTA7YTpkb3tpZigoanwwKSE9KGt8MCkpe3Q9MDtiOndoaWxlKDEpe3U9dDt0PWQ7d2hpbGUoMSl7aWYoKHV8MCkhPTApe2Q9dDticmVhayBhfWlmKCh0fDApPT0wKXt1PTE7ZD0wO3Q9MH1lbHNle2Q9Y1t0KzEyPj4yXXwwO2lmKChkfDApPT0oY1t0KzE2Pj4yXXwwKSl7ZD1vY1tjWyhjW3Q+PjJdfDApKzM2Pj4yXSYxMjddKHQpfDB9ZWxzZXtkPWNbZD4+Ml18MH15PShkfDApPT0tMTt1PXk/MTowO2Q9eT8wOnQ7dD15PzA6dH1pZigoZXwwKSE9MCl7dj1jW2UrMTI+PjJdfDA7aWYoKHZ8MCk9PShjW2UrMTY+PjJdfDApKXt2PW9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MH1lbHNle3Y9Y1t2Pj4yXXwwfWlmKCEoKHZ8MCk9PS0xKSl7aWYoIXUpe2w9MjU7YnJlYWsgYn19ZWxzZXtsPTIzfX1lbHNle2w9MjN9aWYoKGx8MCk9PTIzKXtsPTA7aWYodSl7ZT0wO2w9MjU7YnJlYWsgYn1lbHNle2U9MH19aWYoKGhjW2NbKGNbcz4+Ml18MCkrNTI+PjJdJjYzXShzLGNbaj4+Ml18MCwwKXwwKTw8MjQ+PjI0PT0zNyl7bD0yNzticmVha31pZihoY1tjWyhjW3M+PjJdfDApKzEyPj4yXSY2M10ocyw4MTkyLGNbaj4+Ml18MCl8MCl7bD0zNzticmVha311PWQrMTJ8MDt3PWNbdT4+Ml18MDt2PWQrMTZ8MDtpZigod3wwKT09KGNbdj4+Ml18MCkpe3c9b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7dz1jW3c+PjJdfDB9eT14Y1tjWyhjW3M+PjJdfDApKzI4Pj4yXSY2M10ocyx3KXwwO2lmKCh5fDApPT0oeGNbY1soY1tzPj4yXXwwKSsyOD4+Ml0mNjNdKHMsY1tqPj4yXXwwKXwwKSl7bD02MzticmVha31jW2c+PjJdPTQ7dT00fWM6ZG97aWYoKGx8MCk9PTI3KXtsPTA7dT1qKzR8MDtpZigodXwwKT09KGt8MCkpe2w9Mjg7YnJlYWsgYn10PWhjW2NbKGNbcz4+Ml18MCkrNTI+PjJdJjYzXShzLGNbdT4+Ml18MCwwKXwwO2lmKHQ8PDI0Pj4yND09NDh8dDw8MjQ+PjI0PT02OSl7dT1qKzh8MDtpZigodXwwKT09KGt8MCkpe2w9MzE7YnJlYWsgYn1qPXU7dT1oY1tjWyhjW3M+PjJdfDApKzUyPj4yXSY2M10ocyxjW3U+PjJdfDAsMCl8MH1lbHNle2o9dTt1PXQ7dD0wfXk9Y1soY1tiPj4yXXwwKSszNj4+Ml18MDtjW3I+PjJdPWQ7Y1txPj4yXT1lO2NbcCswPj4yXT1jW3IrMD4+Ml07Y1tvKzA+PjJdPWNbcSswPj4yXTtuY1t5JjMxXShuLGIscCxvLGYsZyxoLHUsdCk7aj1qKzR8MDtkPWNbbj4+Ml18MH1lbHNlIGlmKChsfDApPT0zNyl7d2hpbGUoMSl7bD0wO2o9ais0fDA7aWYoKGp8MCk9PShrfDApKXtqPWs7YnJlYWt9aWYoaGNbY1soY1tzPj4yXXwwKSsxMj4+Ml0mNjNdKHMsODE5MixjW2o+PjJdfDApfDApe2w9Mzd9ZWxzZXticmVha319dT1lO3c9ZTt3aGlsZSgxKXtpZigoZHwwKT09MCl7dj0xO2Q9MH1lbHNle3Y9Y1tkKzEyPj4yXXwwO2lmKCh2fDApPT0oY1tkKzE2Pj4yXXwwKSl7dj1vY1tjWyhjW2Q+PjJdfDApKzM2Pj4yXSYxMjddKGQpfDB9ZWxzZXt2PWNbdj4+Ml18MH15PSh2fDApPT0tMTt2PXk/MTowO2Q9eT8wOmQ7dD15PzA6dH1pZigod3wwKSE9MCl7eD1jW3crMTI+PjJdfDA7aWYoKHh8MCk9PShjW3crMTY+PjJdfDApKXt3PW9jW2NbKGNbdz4+Ml18MCkrMzY+PjJdJjEyN10odyl8MH1lbHNle3c9Y1t4Pj4yXXwwfWlmKCEoKHd8MCk9PS0xKSl7aWYodl4odXwwKT09MCl7dj11O3c9dX1lbHNle2Q9dDticmVhayBjfX1lbHNle3U9MDtlPTA7bD01MH19ZWxzZXtsPTUwfWlmKChsfDApPT01MCl7bD0wO2lmKHYpe2Q9dDticmVhayBjfWVsc2V7dj11O3c9MH19eD1kKzEyfDA7eT1jW3g+PjJdfDA7dT1kKzE2fDA7aWYoKHl8MCk9PShjW3U+PjJdfDApKXt5PW9jW2NbKGNbZD4+Ml18MCkrMzY+PjJdJjEyN10oZCl8MH1lbHNle3k9Y1t5Pj4yXXwwfWlmKCEoaGNbY1soY1tzPj4yXXwwKSsxMj4+Ml0mNjNdKHMsODE5Mix5KXwwKSl7ZD10O2JyZWFrIGN9eT1jW3g+PjJdfDA7aWYoKHl8MCk9PShjW3U+PjJdfDApKXtvY1tjWyhjW2Q+PjJdfDApKzQwPj4yXSYxMjddKGQpfDA7dT12O2NvbnRpbnVlfWVsc2V7Y1t4Pj4yXT15KzQ7dT12O2NvbnRpbnVlfX19ZWxzZSBpZigobHwwKT09NjMpe2w9MDt3PWNbdT4+Ml18MDtpZigod3wwKT09KGNbdj4+Ml18MCkpe29jW2NbKGNbZD4+Ml18MCkrNDA+PjJdJjEyN10oZCl8MH1lbHNle2NbdT4+Ml09dys0fWo9ais0fDA7ZD10fX13aGlsZSgwKTtpZigoanwwKT09KGt8MCkpe2JyZWFrIGF9dD1jW2c+PjJdfDB9aWYoKGx8MCk9PTI1KXtjW2c+PjJdPTQ7YnJlYWt9ZWxzZSBpZigobHwwKT09Mjgpe2NbZz4+Ml09NDticmVha31lbHNlIGlmKChsfDApPT0zMSl7Y1tnPj4yXT00O2JyZWFrfX19d2hpbGUoMCk7aWYoKGR8MCk9PTApe249MDtvPTF9ZWxzZXtuPWNbZCsxMj4+Ml18MDtpZigobnwwKT09KGNbZCsxNj4+Ml18MCkpe249b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7bj1jW24+PjJdfDB9bz0obnwwKT09LTE7bj1vPzA6ZDtvPW8/MTowfWlmKChlfDApIT0wKXtwPWNbZSsxMj4+Ml18MDtpZigocHwwKT09KGNbZSsxNj4+Ml18MCkpe3A9b2NbY1soY1tlPj4yXXwwKSszNj4+Ml0mMTI3XShlKXwwfWVsc2V7cD1jW3A+PjJdfDB9aWYoISgocHwwKT09LTEpKXtpZihvKXtjW2E+PjJdPW47aT1tO3JldHVybn19ZWxzZXtsPTc4fX1lbHNle2w9Nzh9aWYoKGx8MCk9PTc4PyFvOjApe2NbYT4+Ml09bjtpPW07cmV0dXJufWNbZz4+Ml09Y1tnPj4yXXwyO2NbYT4+Ml09bjtpPW07cmV0dXJufXk9WGEoNCl8MDtjW3k+PjJdPTIxMzA0O3diKHl8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIGRqKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIGVqKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBmaihhKXthPWF8MDtyZXR1cm4gMn1mdW5jdGlvbiBnaihhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wO2o9aTtjaihhLGIsY1tkPj4yXXwwLGNbZT4+Ml18MCxmLGcsaCwxMjUyOCwxMjU2MHwwKTtpPWo7cmV0dXJufWZ1bmN0aW9uIGhqKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTA7az1pO209ZCs4fDA7bT1vY1tjWyhjW20+PjJdfDApKzIwPj4yXSYxMjddKG0pfDA7bj1hW20+PjBdfDA7aWYoKG4mMSk9PTApe2w9bSs0fDA7bT0obiYyNTUpPj4+MX1lbHNle2w9Y1ttKzg+PjJdfDA7bT1jW20rND4+Ml18MH1jaihiLGQsY1tlPj4yXXwwLGNbZj4+Ml18MCxnLGgsaixsLGwrKG08PDIpfDApO2k9aztyZXR1cm59ZnVuY3Rpb24gaWooYSxiLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MDtqPWk7aT1pKzE2fDA7bD1qO2Y9Y1tmKzI4Pj4yXXwwO209Zis0fDA7Y1ttPj4yXT0oY1ttPj4yXXwwKSsxO2lmKCEoKGNbMzM2Ml18MCk9PS0xKSl7Y1tsPj4yXT0xMzQ0ODtjW2wrND4+Ml09MjA4O2NbbCs4Pj4yXT0wO2NnKDEzNDQ4LGwpfWw9KGNbMTM0NTI+PjJdfDApKyAtMXwwO209Y1tmKzg+PjJdfDA7aWYoKGNbZisxMj4+Ml18MCktbT4+Mj4+PjA+bD4+PjA/KGs9Y1ttKyhsPDwyKT4+Ml18MCwoa3wwKSE9MCk6MCl7bD1mKzR8MDttPWNbbD4+Ml18MDtjW2w+PjJdPW0rIC0xO2lmKChtfDApPT0wKXtsY1tjWyhjW2Y+PjJdfDApKzg+PjJdJjI1NV0oZil9bT1jW2U+PjJdfDA7Yj1iKzh8MDtiPW9jW2NbY1tiPj4yXT4+Ml0mMTI3XShiKXwwO2I9KGFpKGQsbSxiLGIrMTY4fDAsayxnLDApfDApLWJ8MDtpZigoYnwwKT49MTY4KXttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1jW2grMjQ+PjJdPSgoYnwwKS8xMnwwfDApJTd8MDttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBqaihhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTAsbT0wO2o9aTtpPWkrMTZ8MDtsPWo7Zj1jW2YrMjg+PjJdfDA7bT1mKzR8MDtjW20+PjJdPShjW20+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW2w+PjJdPTEzNDQ4O2NbbCs0Pj4yXT0yMDg7Y1tsKzg+PjJdPTA7Y2coMTM0NDgsbCl9bD0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7bT1jW2YrOD4+Ml18MDtpZigoY1tmKzEyPj4yXXwwKS1tPj4yPj4+MD5sPj4+MD8oaz1jW20rKGw8PDIpPj4yXXwwLChrfDApIT0wKTowKXtsPWYrNHwwO209Y1tsPj4yXXwwO2NbbD4+Ml09bSsgLTE7aWYoKG18MCk9PTApe2xjW2NbKGNbZj4+Ml18MCkrOD4+Ml0mMjU1XShmKX1tPWNbZT4+Ml18MDtiPWIrOHwwO2I9b2NbY1soY1tiPj4yXXwwKSs0Pj4yXSYxMjddKGIpfDA7Yj0oYWkoZCxtLGIsYisyODh8MCxrLGcsMCl8MCktYnwwO2lmKChifDApPj0yODgpe209Y1tkPj4yXXwwO2NbYT4+Ml09bTtpPWo7cmV0dXJufWNbaCsxNj4+Ml09KChifDApLzEyfDB8MCklMTJ8MDttPWNbZD4+Ml18MDtjW2E+PjJdPW07aT1qO3JldHVybn1tPVhhKDQpfDA7Y1ttPj4yXT0yMTMwNDt3YihtfDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBraihhLGIsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDt2YXIgaj0wLGs9MCxsPTA7Yj1pO2k9aSsxNnwwO2s9YjtmPWNbZisyOD4+Ml18MDtsPWYrNHwwO2NbbD4+Ml09KGNbbD4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2Nbaz4+Ml09MTM0NDg7Y1trKzQ+PjJdPTIwODtjW2srOD4+Ml09MDtjZygxMzQ0OCxrKX1rPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtsPWNbZis4Pj4yXXwwO2lmKChjW2YrMTI+PjJdfDApLWw+PjI+Pj4wPms+Pj4wPyhqPWNbbCsoazw8Mik+PjJdfDAsKGp8MCkhPTApOjApe2s9Zis0fDA7bD1jW2s+PjJdfDA7Y1trPj4yXT1sKyAtMTtpZigobHwwKT09MCl7bGNbY1soY1tmPj4yXXwwKSs4Pj4yXSYyNTVdKGYpfWU9bWooZCxjW2U+PjJdfDAsZyxqLDQpfDA7aWYoKGNbZz4+Ml0mNHwwKSE9MCl7bD1jW2Q+PjJdfDA7Y1thPj4yXT1sO2k9YjtyZXR1cm59aWYoKGV8MCk8Njkpe2c9ZSsyZTN8MH1lbHNle2c9KGUrIC02OXwwKT4+PjA8MzE/ZSsxOTAwfDA6ZX1jW2grMjA+PjJdPWcrIC0xOTAwO2w9Y1tkPj4yXXwwO2NbYT4+Ml09bDtpPWI7cmV0dXJufWw9WGEoNCl8MDtjW2w+PjJdPTIxMzA0O3diKGx8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIGxqKGIsZCxlLGYsZyxoLGosayxsKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDt2YXIgbT0wLG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MDtsPWk7aT1pKzY0fDA7eT1sO3g9bCsxNnwwO3A9bCsyOHwwO3Y9bCsyNHwwO3c9bCszMnwwO0M9bCsxMnwwO3I9bCsyMHwwO3M9bCszNnwwO3Q9bCs0MHwwO3o9bCs0NHwwO3E9bCs0OHwwO2NbaD4+Ml09MDt1PWNbZysyOD4+Ml18MDtCPXUrNHwwO2NbQj4+Ml09KGNbQj4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbeT4+Ml09MTM0NDg7Y1t5KzQ+PjJdPTIwODtjW3krOD4+Ml09MDtjZygxMzQ0OCx5KX1BPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtCPWNbdSs4Pj4yXXwwO2lmKChjW3UrMTI+PjJdfDApLUI+PjI+Pj4wPkE+Pj4wPyhuPWNbQisoQTw8Mik+PjJdfDAsKG58MCkhPTApOjApe0E9dSs0fDA7Qj1jW0E+PjJdfDA7Y1tBPj4yXT1CKyAtMTtpZigoQnwwKT09MCl7bGNbY1soY1t1Pj4yXXwwKSs4Pj4yXSYyNTVdKHUpfWE6ZG97c3dpdGNoKGs8PDI0Pj4yNHwwKXtjYXNlIDgzOntuPW1qKGUsY1tmPj4yXXwwLGgsbiwyKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8NjEpe2Nbaj4+Ml09bjticmVhayBhfWVsc2V7Y1toPj4yXT1tfDQ7YnJlYWsgYX19O2Nhc2UgODQ6e2NqKHMsZCxjW2U+PjJdfDAsY1tmPj4yXXwwLGcsaCxqLDEyNjk2LDEyNzI4fDApO2NbZT4+Ml09Y1tzPj4yXTticmVha307Y2FzZSA4Mjp7Y2oocixkLGNbZT4+Ml18MCxjW2Y+PjJdfDAsZyxoLGosMTI2NzIsMTI2OTJ8MCk7Y1tlPj4yXT1jW3I+PjJdO2JyZWFrfTtjYXNlIDExMjp7bT1qKzh8MDtqPWNbZj4+Ml18MDtmPWQrOHwwO2Y9b2NbY1soY1tmPj4yXXwwKSs4Pj4yXSYxMjddKGYpfDA7ZD1hW2Y+PjBdfDA7aWYoKGQmMSk9PTApe2Q9KGQmMjU1KT4+PjF9ZWxzZXtkPWNbZis0Pj4yXXwwfWc9YVtmKzEyPj4wXXwwO2lmKChnJjEpPT0wKXtnPShnJjI1NSk+Pj4xfWVsc2V7Zz1jW2YrMTY+PjJdfDB9aWYoKGR8MCk9PSgwLWd8MCkpe2NbaD4+Ml09Y1toPj4yXXw0O2JyZWFrIGF9Qz1haShlLGosZixmKzI0fDAsbixoLDApfDA7aD1DLWZ8MDtpZigoQ3wwKT09KGZ8MCk/KGNbbT4+Ml18MCk9PTEyOjApe2NbbT4+Ml09MDticmVhayBhfWlmKChofDApPT0xMj8obz1jW20+PjJdfDAsKG98MCk8MTIpOjApe2NbbT4+Ml09bysxMn1icmVha307Y2FzZSAxMTQ6e2NqKEMsZCxjW2U+PjJdfDAsY1tmPj4yXXwwLGcsaCxqLDEyNjI0LDEyNjY4fDApO2NbZT4+Ml09Y1tDPj4yXTticmVha307Y2FzZSAxMjA6e0M9Y1soY1tkPj4yXXwwKSsyMD4+Ml18MDtjW3Q+PjJdPWNbZT4+Ml07Y1t6Pj4yXT1jW2Y+PjJdO2NbeCswPj4yXT1jW3QrMD4+Ml07Y1t5KzA+PjJdPWNbeiswPj4yXTtpY1tDJjYzXShiLGQseCx5LGcsaCxqKTtpPWw7cmV0dXJufTtjYXNlIDg4OntvPWQrOHwwO289b2NbY1soY1tvPj4yXXwwKSsyND4+Ml0mMTI3XShvKXwwO249YVtvPj4wXXwwO2lmKChuJjEpPT0wKXttPW8rNHwwO249KG4mMjU1KT4+PjF9ZWxzZXttPWNbbys4Pj4yXXwwO249Y1tvKzQ+PjJdfDB9Y2oocSxkLGNbZT4+Ml18MCxjW2Y+PjJdfDAsZyxoLGosbSxtKyhuPDwyKXwwKTtjW2U+PjJdPWNbcT4+Ml07YnJlYWt9O2Nhc2UgMTE5OntuPW1qKGUsY1tmPj4yXXwwLGgsbiwxKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8Nyl7Y1tqKzI0Pj4yXT1uO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSAxMjE6e209aisyMHwwO249bWooZSxjW2Y+PjJdfDAsaCxuLDQpfDA7aWYoKGNbaD4+Ml0mNHwwKT09MCl7aWYoKG58MCk8Njkpe2g9bisyZTN8MH1lbHNle2g9KG4rIC02OXwwKT4+PjA8MzE/bisxOTAwfDA6bn1jW20+PjJdPWgrIC0xOTAwfWJyZWFrfTtjYXNlIDg5OnttPW1qKGUsY1tmPj4yXXwwLGgsbiw0KXwwO2lmKChjW2g+PjJdJjR8MCk9PTApe2NbaisyMD4+Ml09bSsgLTE5MDB9YnJlYWt9O2Nhc2UgMzc6e2o9Y1tmPj4yXXwwO2Y9Y1tlPj4yXXwwO2Rve2lmKChmfDApIT0wKXtkPWNbZisxMj4+Ml18MDtpZigoZHwwKT09KGNbZisxNj4+Ml18MCkpe2Y9b2NbY1soY1tmPj4yXXwwKSszNj4+Ml0mMTI3XShmKXwwfWVsc2V7Zj1jW2Q+PjJdfDB9aWYoKGZ8MCk9PS0xKXtjW2U+PjJdPTA7Zj0xO2JyZWFrfWVsc2V7Zj0oY1tlPj4yXXwwKT09MDticmVha319ZWxzZXtmPTF9fXdoaWxlKDApO2lmKChqfDApIT0wKXtkPWNbaisxMj4+Ml18MDtpZigoZHwwKT09KGNbaisxNj4+Ml18MCkpe2Q9b2NbY1soY1tqPj4yXXwwKSszNj4+Ml0mMTI3XShqKXwwfWVsc2V7ZD1jW2Q+PjJdfDB9aWYoISgoZHwwKT09LTEpKXtpZighZil7bT0xMjZ9fWVsc2V7bT0xMjR9fWVsc2V7bT0xMjR9aWYoKG18MCk9PTEyNCl7aWYoZil7bT0xMjZ9ZWxzZXtqPTB9fWlmKChtfDApPT0xMjYpe2NbaD4+Ml09Y1toPj4yXXw2O2JyZWFrIGF9ZD1jW2U+PjJdfDA7Zj1jW2QrMTI+PjJdfDA7aWYoKGZ8MCk9PShjW2QrMTY+PjJdfDApKXtmPW9jW2NbKGNbZD4+Ml18MCkrMzY+PjJdJjEyN10oZCl8MH1lbHNle2Y9Y1tmPj4yXXwwfWlmKCEoKGhjW2NbKGNbbj4+Ml18MCkrNTI+PjJdJjYzXShuLGYsMCl8MCk8PDI0Pj4yND09MzcpKXtjW2g+PjJdPWNbaD4+Ml18NDticmVhayBhfWQ9Y1tlPj4yXXwwO2Y9ZCsxMnwwO249Y1tmPj4yXXwwO2lmKChufDApPT0oY1tkKzE2Pj4yXXwwKSl7b2NbY1soY1tkPj4yXXwwKSs0MD4+Ml0mMTI3XShkKXwwfWVsc2V7Y1tmPj4yXT1uKzR9bj1jW2U+PjJdfDA7ZG97aWYoKG58MCkhPTApe2Y9Y1tuKzEyPj4yXXwwO2lmKChmfDApPT0oY1tuKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDB9ZWxzZXtuPWNbZj4+Ml18MH1pZigobnwwKT09LTEpe2NbZT4+Ml09MDtuPTE7YnJlYWt9ZWxzZXtuPShjW2U+PjJdfDApPT0wO2JyZWFrfX1lbHNle249MX19d2hpbGUoMCk7aWYoKGp8MCkhPTApe2Y9Y1tqKzEyPj4yXXwwO2lmKChmfDApPT0oY1tqKzE2Pj4yXXwwKSl7aj1vY1tjWyhjW2o+PjJdfDApKzM2Pj4yXSYxMjddKGopfDB9ZWxzZXtqPWNbZj4+Ml18MH1pZighKChqfDApPT0tMSkpe2lmKG4pe2JyZWFrIGF9fWVsc2V7bT0xNDd9fWVsc2V7bT0xNDd9aWYoKG18MCk9PTE0Nz8hbjowKXticmVhayBhfWNbaD4+Ml09Y1toPj4yXXwyO2JyZWFrfTtjYXNlIDEwOTp7bj1taihlLGNbZj4+Ml18MCxoLG4sMil8MDttPWNbaD4+Ml18MDtpZigobSY0fDApPT0wJihufDApPDEzKXtjW2orMTY+PjJdPW4rIC0xO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSA3MDp7Y2oodyxkLGNbZT4+Ml18MCxjW2Y+PjJdfDAsZyxoLGosMTI1OTIsMTI2MjR8MCk7Y1tlPj4yXT1jW3c+PjJdO2JyZWFrfTtjYXNlIDY4Ontjaih2LGQsY1tlPj4yXXwwLGNbZj4+Ml18MCxnLGgsaiwxMjU2MCwxMjU5MnwwKTtjW2U+PjJdPWNbdj4+Ml07YnJlYWt9O2Nhc2UgMTA0OmNhc2UgNjY6Y2FzZSA5ODp7Qj1jW2Y+PjJdfDA7Qz1kKzh8MDtDPW9jW2NbKGNbQz4+Ml18MCkrND4+Ml0mMTI3XShDKXwwO2g9KGFpKGUsQixDLEMrMjg4fDAsbixoLDApfDApLUN8MDtpZigoaHwwKTwyODgpe2NbaisxNj4+Ml09KChofDApLzEyfDB8MCklMTJ8MH1icmVha307Y2FzZSAxMTY6Y2FzZSAxMTA6e2o9Y1tmPj4yXXwwO3doaWxlKDEpe2Q9Y1tlPj4yXXwwO2Rve2lmKChkfDApIT0wKXtmPWNbZCsxMj4+Ml18MDtpZigoZnwwKT09KGNbZCsxNj4+Ml18MCkpe2Y9b2NbY1soY1tkPj4yXXwwKSszNj4+Ml0mMTI3XShkKXwwfWVsc2V7Zj1jW2Y+PjJdfDB9aWYoKGZ8MCk9PS0xKXtjW2U+PjJdPTA7Zj0xO2JyZWFrfWVsc2V7Zj0oY1tlPj4yXXwwKT09MDticmVha319ZWxzZXtmPTF9fXdoaWxlKDApO2lmKChqfDApIT0wKXtkPWNbaisxMj4+Ml18MDtpZigoZHwwKT09KGNbaisxNj4+Ml18MCkpe2Q9b2NbY1soY1tqPj4yXXwwKSszNj4+Ml0mMTI3XShqKXwwfWVsc2V7ZD1jW2Q+PjJdfDB9aWYoISgoZHwwKT09LTEpKXtpZighZil7YnJlYWt9fWVsc2V7bT01M319ZWxzZXttPTUzfWlmKChtfDApPT01Myl7bT0wO2lmKGYpe2o9MDticmVha31lbHNle2o9MH19ZD1jW2U+PjJdfDA7Zj1jW2QrMTI+PjJdfDA7aWYoKGZ8MCk9PShjW2QrMTY+PjJdfDApKXtmPW9jW2NbKGNbZD4+Ml18MCkrMzY+PjJdJjEyN10oZCl8MH1lbHNle2Y9Y1tmPj4yXXwwfWlmKCEoaGNbY1soY1tuPj4yXXwwKSsxMj4+Ml0mNjNdKG4sODE5MixmKXwwKSl7YnJlYWt9bz1jW2U+PjJdfDA7ZD1vKzEyfDA7Zj1jW2Q+PjJdfDA7aWYoKGZ8MCk9PShjW28rMTY+PjJdfDApKXtvY1tjWyhjW28+PjJdfDApKzQwPj4yXSYxMjddKG8pfDA7Y29udGludWV9ZWxzZXtjW2Q+PjJdPWYrNDtjb250aW51ZX19Zj1jW2U+PjJdfDA7ZG97aWYoKGZ8MCkhPTApe249Y1tmKzEyPj4yXXwwO2lmKChufDApPT0oY1tmKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW2Y+PjJdfDApKzM2Pj4yXSYxMjddKGYpfDB9ZWxzZXtuPWNbbj4+Ml18MH1pZigobnwwKT09LTEpe2NbZT4+Ml09MDtuPTE7YnJlYWt9ZWxzZXtuPShjW2U+PjJdfDApPT0wO2JyZWFrfX1lbHNle249MX19d2hpbGUoMCk7aWYoKGp8MCkhPTApe2Y9Y1tqKzEyPj4yXXwwO2lmKChmfDApPT0oY1tqKzE2Pj4yXXwwKSl7aj1vY1tjWyhjW2o+PjJdfDApKzM2Pj4yXSYxMjddKGopfDB9ZWxzZXtqPWNbZj4+Ml18MH1pZighKChqfDApPT0tMSkpe2lmKG4pe2JyZWFrIGF9fWVsc2V7bT03NH19ZWxzZXttPTc0fWlmKChtfDApPT03ND8hbjowKXticmVhayBhfWNbaD4+Ml09Y1toPj4yXXwyO2JyZWFrfTtjYXNlIDY1OmNhc2UgOTc6e0I9Y1tmPj4yXXwwO0M9ZCs4fDA7Qz1vY1tjW2NbQz4+Ml0+PjJdJjEyN10oQyl8MDtoPShhaShlLEIsQyxDKzE2OHwwLG4saCwwKXwwKS1DfDA7aWYoKGh8MCk8MTY4KXtjW2orMjQ+PjJdPSgoaHwwKS8xMnwwfDApJTd8MH1icmVha307Y2FzZSA5OTp7bz1kKzh8MDtvPW9jW2NbKGNbbz4+Ml18MCkrMTI+PjJdJjEyN10obyl8MDtuPWFbbz4+MF18MDtpZigobiYxKT09MCl7bT1vKzR8MDtuPShuJjI1NSk+Pj4xfWVsc2V7bT1jW28rOD4+Ml18MDtuPWNbbys0Pj4yXXwwfWNqKHAsZCxjW2U+PjJdfDAsY1tmPj4yXXwwLGcsaCxqLG0sbSsobjw8Mil8MCk7Y1tlPj4yXT1jW3A+PjJdO2JyZWFrfTtjYXNlIDcyOntuPW1qKGUsY1tmPj4yXXwwLGgsbiwyKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8MjQpe2Nbais4Pj4yXT1uO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSAxMDE6Y2FzZSAxMDA6e209aisxMnwwO2o9bWooZSxjW2Y+PjJdfDAsaCxuLDIpfDA7bj1jW2g+PjJdfDA7aWYoKG4mNHwwKT09MD8oaisgLTF8MCk+Pj4wPDMxOjApe2NbbT4+Ml09ajticmVhayBhfWNbaD4+Ml09bnw0O2JyZWFrfTtjYXNlIDczOnttPWorOHwwO249bWooZSxjW2Y+PjJdfDAsaCxuLDIpfDA7aj1jW2g+PjJdfDA7aWYoKGomNHwwKT09MD8obisgLTF8MCk+Pj4wPDEyOjApe2NbbT4+Ml09bjticmVhayBhfWNbaD4+Ml09anw0O2JyZWFrfTtjYXNlIDc3OntuPW1qKGUsY1tmPj4yXXwwLGgsbiwyKXwwO209Y1toPj4yXXwwO2lmKChtJjR8MCk9PTAmKG58MCk8NjApe2Nbais0Pj4yXT1uO2JyZWFrIGF9ZWxzZXtjW2g+PjJdPW18NDticmVhayBhfX07Y2FzZSAxMDY6e249bWooZSxjW2Y+PjJdfDAsaCxuLDMpfDA7bT1jW2g+PjJdfDA7aWYoKG0mNHwwKT09MCYobnwwKTwzNjYpe2NbaisyOD4+Ml09bjticmVhayBhfWVsc2V7Y1toPj4yXT1tfDQ7YnJlYWsgYX19O2RlZmF1bHQ6e2NbaD4+Ml09Y1toPj4yXXw0fX19d2hpbGUoMCk7Y1tiPj4yXT1jW2U+PjJdO2k9bDtyZXR1cm59Qz1YYSg0KXwwO2NbQz4+Ml09MjEzMDQ7d2IoQ3wwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gbWooYSxiLGQsZSxmKXthPWF8MDtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDt2YXIgZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wO2g9aTtrPWNbYT4+Ml18MDtkb3tpZigoa3wwKSE9MCl7aj1jW2srMTI+PjJdfDA7aWYoKGp8MCk9PShjW2srMTY+PjJdfDApKXtqPW9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MH1lbHNle2o9Y1tqPj4yXXwwfWlmKChqfDApPT0tMSl7Y1thPj4yXT0wO2o9MTticmVha31lbHNle2o9KGNbYT4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7aj0xfX13aGlsZSgwKTtpZigoYnwwKSE9MCl7az1jW2IrMTI+PjJdfDA7aWYoKGt8MCk9PShjW2IrMTY+PjJdfDApKXtrPW9jW2NbKGNbYj4+Ml18MCkrMzY+PjJdJjEyN10oYil8MH1lbHNle2s9Y1trPj4yXXwwfWlmKCEoKGt8MCk9PS0xKSl7aWYoIWope2c9MTV9fWVsc2V7Zz0xM319ZWxzZXtnPTEzfWlmKChnfDApPT0xMyl7aWYoail7Zz0xNX1lbHNle2I9MH19aWYoKGd8MCk9PTE1KXtjW2Q+PjJdPWNbZD4+Ml18NjtuPTA7aT1oO3JldHVybiBufDB9aj1jW2E+PjJdfDA7az1jW2orMTI+PjJdfDA7aWYoKGt8MCk9PShjW2orMTY+PjJdfDApKXtqPW9jW2NbKGNbaj4+Ml18MCkrMzY+PjJdJjEyN10oail8MH1lbHNle2o9Y1trPj4yXXwwfWlmKCEoaGNbY1soY1tlPj4yXXwwKSsxMj4+Ml0mNjNdKGUsMjA0OCxqKXwwKSl7Y1tkPj4yXT1jW2Q+PjJdfDQ7bj0wO2k9aDtyZXR1cm4gbnwwfWo9KGhjW2NbKGNbZT4+Ml18MCkrNTI+PjJdJjYzXShlLGosMCl8MCk8PDI0Pj4yNDtsPWNbYT4+Ml18MDtrPWwrMTJ8MDttPWNbaz4+Ml18MDtpZigobXwwKT09KGNbbCsxNj4+Ml18MCkpe29jW2NbKGNbbD4+Ml18MCkrNDA+PjJdJjEyN10obCl8MDtrPWI7bD1iO2I9an1lbHNle2Nbaz4+Ml09bSs0O2s9YjtsPWI7Yj1qfXdoaWxlKDEpe2I9YisgLTQ4fDA7Zj1mKyAtMXwwO2o9Y1thPj4yXXwwO2Rve2lmKChqfDApIT0wKXttPWNbaisxMj4+Ml18MDtpZigobXwwKT09KGNbaisxNj4+Ml18MCkpe2o9b2NbY1soY1tqPj4yXXwwKSszNj4+Ml0mMTI3XShqKXwwfWVsc2V7aj1jW20+PjJdfDB9aWYoKGp8MCk9PS0xKXtjW2E+PjJdPTA7bT0xO2JyZWFrfWVsc2V7bT0oY1thPj4yXXwwKT09MDticmVha319ZWxzZXttPTF9fXdoaWxlKDApO2lmKChsfDApPT0wKXtqPWs7bD0wO249MX1lbHNle2o9Y1tsKzEyPj4yXXwwO2lmKChqfDApPT0oY1tsKzE2Pj4yXXwwKSl7aj1vY1tjWyhjW2w+PjJdfDApKzM2Pj4yXSYxMjddKGwpfDB9ZWxzZXtqPWNbaj4+Ml18MH1uPShqfDApPT0tMTtqPW4/MDprO2w9bj8wOms7bj1uPzE6KGt8MCk9PTB9az1jW2E+PjJdfDA7aWYoISgobV5uKSYoZnwwKT4wKSl7YnJlYWt9bT1jW2srMTI+PjJdfDA7aWYoKG18MCk9PShjW2srMTY+PjJdfDApKXtrPW9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MH1lbHNle2s9Y1ttPj4yXXwwfWlmKCEoaGNbY1soY1tlPj4yXXwwKSsxMj4+Ml0mNjNdKGUsMjA0OCxrKXwwKSl7Zz01OTticmVha31iPSgoaGNbY1soY1tlPj4yXXwwKSs1Mj4+Ml0mNjNdKGUsaywwKXwwKTw8MjQ+PjI0KSsoYioxMHwwKXwwO209Y1thPj4yXXwwO249bSsxMnwwO2s9Y1tuPj4yXXwwO2lmKChrfDApPT0oY1ttKzE2Pj4yXXwwKSl7b2NbY1soY1ttPj4yXXwwKSs0MD4+Ml0mMTI3XShtKXwwO2s9ajtjb250aW51ZX1lbHNle2Nbbj4+Ml09ays0O2s9ajtjb250aW51ZX19aWYoKGd8MCk9PTU5KXtpPWg7cmV0dXJuIGJ8MH1kb3tpZigoa3wwKSE9MCl7ZT1jW2srMTI+PjJdfDA7aWYoKGV8MCk9PShjW2srMTY+PjJdfDApKXtlPW9jW2NbKGNbaz4+Ml18MCkrMzY+PjJdJjEyN10oayl8MH1lbHNle2U9Y1tlPj4yXXwwfWlmKChlfDApPT0tMSl7Y1thPj4yXT0wO2E9MTticmVha31lbHNle2E9KGNbYT4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7YT0xfX13aGlsZSgwKTtpZigoanwwKSE9MCl7ZT1jW2orMTI+PjJdfDA7aWYoKGV8MCk9PShjW2orMTY+PjJdfDApKXtlPW9jW2NbKGNbaj4+Ml18MCkrMzY+PjJdJjEyN10oail8MH1lbHNle2U9Y1tlPj4yXXwwfWlmKCEoKGV8MCk9PS0xKSl7aWYoYSl7bj1iO2k9aDtyZXR1cm4gbnwwfX1lbHNle2c9NTZ9fWVsc2V7Zz01Nn1pZigoZ3wwKT09NTY/IWE6MCl7bj1iO2k9aDtyZXR1cm4gbnwwfWNbZD4+Ml09Y1tkPj4yXXwyO249YjtpPWg7cmV0dXJuIG58MH1mdW5jdGlvbiBuaihiKXtiPWJ8MDt2YXIgZD0wLGU9MCxmPTA7ZD1pO2U9Yis4fDA7Zj1jW2U+PjJdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWlmKChmfDApIT0oY1szMzQwXXwwKSl7VmIoY1tlPj4yXXwwKX1pZigoYnwwKT09MCl7aT1kO3JldHVybn12bihiKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIG9qKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtiPWIrOHwwO2U9Y1tiPj4yXXwwO2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1pZigoZXwwKT09KGNbMzM0MF18MCkpe2k9ZDtyZXR1cm59VmIoY1tiPj4yXXwwKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIHBqKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wO2Y9aTtpPWkrMTEyfDA7bj1mKzEwMHwwO2c9ZjthW24+PjBdPTM3O2w9bisxfDA7YVtsPj4wXT1qO209bisyfDA7YVttPj4wXT1rO2FbbiszPj4wXT0wO2lmKCEoazw8MjQ+PjI0PT0wKSl7YVtsPj4wXT1rO2FbbT4+MF09an1uPWViKGd8MCwxMDAsbnwwLGh8MCxjW2QrOD4+Ml18MCl8MDtoPWcrbnwwO2Q9Y1tlPj4yXXwwO2lmKChufDApPT0wKXtuPWQ7Y1tiPj4yXT1uO2k9ZjtyZXR1cm59ZWxzZXtlPWQ7bD1kfWRve2o9YVtnPj4wXXwwO2Rve2lmKChlfDApIT0wKXtrPWUrMjR8MDtkPWNbaz4+Ml18MDtpZigoZHwwKT09KGNbZSsyOD4+Ml18MCkpe249KHhjW2NbKGNbZT4+Ml18MCkrNTI+PjJdJjYzXShlLGomMjU1KXwwKT09LTE7bD1uPzA6bDtlPW4/MDplO2JyZWFrfWVsc2V7Y1trPj4yXT1kKzE7YVtkPj4wXT1qO2JyZWFrfX1lbHNle2U9MH19d2hpbGUoMCk7Zz1nKzF8MH13aGlsZSgoZ3wwKSE9KGh8MCkpO2NbYj4+Ml09bDtpPWY7cmV0dXJufWZ1bmN0aW9uIHFqKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MDtkPWk7ZT1iKzh8MDtmPWNbZT4+Ml18MDtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9aWYoKGZ8MCkhPShjWzMzNDBdfDApKXtWYihjW2U+PjJdfDApfWlmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gcmooYil7Yj1ifDA7dmFyIGQ9MCxlPTA7ZD1pO2I9Yis4fDA7ZT1jW2I+PjJdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWlmKChlfDApPT0oY1szMzQwXXwwKSl7aT1kO3JldHVybn1WYihjW2I+PjJdfDApO2k9ZDtyZXR1cm59ZnVuY3Rpb24gc2ooYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTA7Zj1pO2k9aSs1Mjh8MDtvPWYrNTEyfDA7cD1mKzQxMnwwO209ZjtsPWYrNDA4fDA7Zz1mKzh8MDthW28+PjBdPTM3O249bysxfDA7YVtuPj4wXT1qO3E9bysyfDA7YVtxPj4wXT1rO2FbbyszPj4wXT0wO2lmKCEoazw8MjQ+PjI0PT0wKSl7YVtuPj4wXT1rO2FbcT4+MF09an1qPWQrOHwwO2ViKHB8MCwxMDAsb3wwLGh8MCxjW2o+PjJdfDApfDA7az1tO2Nbaz4+Ml09MDtjW2srND4+Ml09MDtjW2w+PjJdPXA7aj1pYihjW2o+PjJdfDApfDA7az1WbShnLGwsMTAwLG0pfDA7aWYoKGp8MCkhPTApe2liKGp8MCl8MH1pZigoa3wwKT09LTEpe29rKDE0Mjk2KX1qPWcrKGs8PDIpfDA7ZD1jW2U+PjJdfDA7aWYoKGt8MCk9PTApe3E9ZDtjW2I+PjJdPXE7aT1mO3JldHVybn1lbHNle2U9ZDtrPWR9ZG97ZD1jW2c+PjJdfDA7aWYoKGV8MCk9PTApe2U9MH1lbHNle2g9ZSsyNHwwO2w9Y1toPj4yXXwwO2lmKChsfDApPT0oY1tlKzI4Pj4yXXwwKSl7ZD14Y1tjWyhjW2U+PjJdfDApKzUyPj4yXSY2M10oZSxkKXwwfWVsc2V7Y1toPj4yXT1sKzQ7Y1tsPj4yXT1kfXE9KGR8MCk9PS0xO2s9cT8wOms7ZT1xPzA6ZX1nPWcrNHwwfXdoaWxlKChnfDApIT0oanwwKSk7Y1tiPj4yXT1rO2k9ZjtyZXR1cm59ZnVuY3Rpb24gdGooYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gdWooYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIHZqKGEpe2E9YXwwO3JldHVybiAxMjd9ZnVuY3Rpb24gd2ooYSl7YT1hfDA7cmV0dXJuIDEyN31mdW5jdGlvbiB4aihhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIHlqKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gemooYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBBaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09MjthW2IrMT4+MF09NDU7YVtiKzI+PjBdPTA7cmV0dXJufWZ1bmN0aW9uIEJqKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIENqKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT02NzEwOTYzNDthW2IrMT4+MF09MjYyMTQ3O2FbYisyPj4wXT0xMDI0O2FbYiszPj4wXT00O3JldHVybn1mdW5jdGlvbiBEaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09NjcxMDk2MzQ7YVtiKzE+PjBdPTI2MjE0NzthW2IrMj4+MF09MTAyNDthW2IrMz4+MF09NDtyZXR1cm59ZnVuY3Rpb24gRWooYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gRmooYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIEdqKGEpe2E9YXwwO3JldHVybiAxMjd9ZnVuY3Rpb24gSGooYSl7YT1hfDA7cmV0dXJuIDEyN31mdW5jdGlvbiBJaihhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIEpqKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gS2ooYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBMaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09MjthW2IrMT4+MF09NDU7YVtiKzI+PjBdPTA7cmV0dXJufWZ1bmN0aW9uIE1qKGEpe2E9YXwwO3JldHVybiAwfWZ1bmN0aW9uIE5qKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT02NzEwOTYzNDthW2IrMT4+MF09MjYyMTQ3O2FbYisyPj4wXT0xMDI0O2FbYiszPj4wXT00O3JldHVybn1mdW5jdGlvbiBPaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09NjcxMDk2MzQ7YVtiKzE+PjBdPTI2MjE0NzthW2IrMj4+MF09MTAyNDthW2IrMz4+MF09NDtyZXR1cm59ZnVuY3Rpb24gUGooYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gUWooYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFJqKGEpe2E9YXwwO3JldHVybiAyMTQ3NDgzNjQ3fWZ1bmN0aW9uIFNqKGEpe2E9YXwwO3JldHVybiAyMTQ3NDgzNjQ3fWZ1bmN0aW9uIFRqKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gVWooYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBWaihhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIFdqKGIsZCl7Yj1ifDA7ZD1kfDA7dmFyIGU9MCxmPTA7ZD1pO2FbYj4+MF09MjtiPWIrNHwwO2Y9MTtlPWI7d2hpbGUoMSl7Zj1mKyAtMXwwO2NbZT4+Ml09NDU7aWYoKGZ8MCk9PTApe2JyZWFrfWVsc2V7ZT1lKzR8MH19Y1tiKzQ+PjJdPTA7aT1kO3JldHVybn1mdW5jdGlvbiBYaihhKXthPWF8MDtyZXR1cm4gMH1mdW5jdGlvbiBZaihiLGMpe2I9YnwwO2M9Y3wwO2FbYj4+MF09NjcxMDk2MzQ7YVtiKzE+PjBdPTI2MjE0NzthW2IrMj4+MF09MTAyNDthW2IrMz4+MF09NDtyZXR1cm59ZnVuY3Rpb24gWmooYixjKXtiPWJ8MDtjPWN8MDthW2I+PjBdPTY3MTA5NjM0O2FbYisxPj4wXT0yNjIxNDc7YVtiKzI+PjBdPTEwMjQ7YVtiKzM+PjBdPTQ7cmV0dXJufWZ1bmN0aW9uIF9qKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uICRqKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBhayhhKXthPWF8MDtyZXR1cm4gMjE0NzQ4MzY0N31mdW5jdGlvbiBiayhhKXthPWF8MDtyZXR1cm4gMjE0NzQ4MzY0N31mdW5jdGlvbiBjayhhLGIpe2E9YXwwO2I9YnwwO2I9aTtjW2ErMD4+Ml09MDtjW2ErND4+Ml09MDtjW2ErOD4+Ml09MDtpPWI7cmV0dXJufWZ1bmN0aW9uIGRrKGEsYil7YT1hfDA7Yj1ifDA7Yj1pO2NbYSswPj4yXT0wO2NbYSs0Pj4yXT0wO2NbYSs4Pj4yXT0wO2k9YjtyZXR1cm59ZnVuY3Rpb24gZWsoYSxiKXthPWF8MDtiPWJ8MDtiPWk7Y1thKzA+PjJdPTA7Y1thKzQ+PjJdPTA7Y1thKzg+PjJdPTA7aT1iO3JldHVybn1mdW5jdGlvbiBmayhiLGQpe2I9YnwwO2Q9ZHwwO3ZhciBlPTAsZj0wO2Q9aTthW2I+PjBdPTI7Yj1iKzR8MDtmPTE7ZT1iO3doaWxlKDEpe2Y9ZisgLTF8MDtjW2U+PjJdPTQ1O2lmKChmfDApPT0wKXticmVha31lbHNle2U9ZSs0fDB9fWNbYis0Pj4yXT0wO2k9ZDtyZXR1cm59ZnVuY3Rpb24gZ2soYSl7YT1hfDA7cmV0dXJuIDB9ZnVuY3Rpb24gaGsoYixjKXtiPWJ8MDtjPWN8MDthW2I+PjBdPTY3MTA5NjM0O2FbYisxPj4wXT0yNjIxNDc7YVtiKzI+PjBdPTEwMjQ7YVtiKzM+PjBdPTQ7cmV0dXJufWZ1bmN0aW9uIGlrKGIsYyl7Yj1ifDA7Yz1jfDA7YVtiPj4wXT02NzEwOTYzNDthW2IrMT4+MF09MjYyMTQ3O2FbYisyPj4wXT0xMDI0O2FbYiszPj4wXT00O3JldHVybn1mdW5jdGlvbiBqayhhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBrayhhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gbGsoYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wO249aTtpPWkrMjQwfDA7cD1uO3g9bisxNDB8MDtkPW4rMTZ8MDtyPW4rMjR8MDt1PW4rMTM4fDA7cz1uKzEyOHwwO3E9bisyOHwwO2NbZD4+Ml09eDttPWQrNHwwO2NbbT4+Ml09MjEzO3g9eCsxMDB8MDtvPWNbaCsyOD4+Ml18MDt3PW8rNHwwO2Nbdz4+Ml09KGNbdz4+Ml18MCkrMTtpZighKChjWzMzNjRdfDApPT0tMSkpe2NbcD4+Ml09MTM0NTY7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzQ1NixwKX13PShjWzEzNDYwPj4yXXwwKSsgLTF8MDt2PWNbbys4Pj4yXXwwO2lmKChjW28rMTI+PjJdfDApLXY+PjI+Pj4wPnc+Pj4wPyh0PWNbdisodzw8Mik+PjJdfDAsKHR8MCkhPTApOjApe2FbdT4+MF09MDtkb3tpZihuayhlLGNbZj4+Ml18MCxnLG8sY1toKzQ+PjJdfDAsaix1LHQsZCxyLHgpfDApe3VjW2NbKGNbdD4+Ml18MCkrMzI+PjJdJjMxXSh0LDEzMDg4LDEzMDk4fDAscyl8MDtnPWNbcj4+Ml18MDtoPWNbZD4+Ml18MDt0PWctaHwwO2lmKCh0fDApPjk4KXt2PXVuKHQrMnwwKXwwO2lmKCh2fDApPT0wKXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNle3Q9dn19ZWxzZXt0PTA7dj1xfWlmKChhW3U+PjBdfDApIT0wKXthW3Y+PjBdPTQ1O3Y9disxfDB9aWYoaD4+PjA8Zz4+PjApe3U9cysxMHwwO2c9cztkb3t3PWFbaD4+MF18MDt4PXM7d2hpbGUoMSl7aWYoKGFbeD4+MF18MCk9PXc8PDI0Pj4yNCl7YnJlYWt9eD14KzF8MDtpZigoeHwwKT09KHV8MCkpe3g9dTticmVha319YVt2Pj4wXT1hWzEzMDg4Kyh4LWcpPj4wXXwwO2g9aCsxfDA7dj12KzF8MH13aGlsZShoPj4+MDwoY1tyPj4yXXwwKT4+PjApfWFbdj4+MF09MDtjW3A+PjJdPWs7aWYoKEZhKHF8MCwxMzEwNCxwfDApfDApPT0xKXtpZigodHwwKT09MCl7YnJlYWt9dm4odCk7YnJlYWt9Zj1YYSg4KXwwO2NbZj4+Ml09OTkyODt3aGlsZSgxKXtqPXVuKDI4KXwwO2lmKChqfDApIT0wKXtsPTI5O2JyZWFrfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXtsPTI3O2JyZWFrfXNjW2wmMzFdKCl9aWYoKGx8MCk9PTI3KXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNlIGlmKChsfDApPT0yOSl7Y1tqKzQ+PjJdPTE1O2Nbaj4+Ml09MTU7bD1qKzEyfDA7Y1tmKzQ+PjJdPWw7Y1tqKzg+PjJdPTA7aj1sKzB8MDtsPTEzMTEyfDA7Yj1qKzE2fDA7ZG97YVtqPj4wXT1hW2w+PjBdfDA7aj1qKzF8MDtsPWwrMXwwfXdoaWxlKChqfDApPChifDApKTt3YihmfDAsMTAwNjQsMTA2KX19fXdoaWxlKDApO3A9Y1tlPj4yXXwwO2lmKChwfDApIT0wKXtpZigoY1twKzEyPj4yXXwwKT09KGNbcCsxNj4+Ml18MCk/KG9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MCk9PS0xOjApe2NbZT4+Ml09MDtwPTB9fWVsc2V7cD0wfWs9KHB8MCk9PTA7ZT1jW2Y+PjJdfDA7ZG97aWYoKGV8MCkhPTApe2lmKChjW2UrMTI+PjJdfDApIT0oY1tlKzE2Pj4yXXwwKSl7aWYoayl7YnJlYWt9ZWxzZXtsPTQ2O2JyZWFrfX1pZighKChvY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDApPT0tMSkpe2lmKGspe2JyZWFrfWVsc2V7bD00NjticmVha319ZWxzZXtjW2Y+PjJdPTA7bD00NDticmVha319ZWxzZXtsPTQ0fX13aGlsZSgwKTtpZigobHwwKT09NDQ/azowKXtsPTQ2fWlmKChsfDApPT00Nil7Y1tqPj4yXT1jW2o+PjJdfDJ9Y1tiPj4yXT1wO3c9bys0fDA7eD1jW3c+PjJdfDA7Y1t3Pj4yXT14KyAtMTtpZigoeHwwKT09MCl7bGNbY1soY1tvPj4yXXwwKSs4Pj4yXSYyNTVdKG8pfWw9Y1tkPj4yXXwwO2NbZD4+Ml09MDtpZigobHwwKT09MCl7aT1uO3JldHVybn1sY1tjW20+PjJdJjI1NV0obCk7aT1uO3JldHVybn14PVhhKDQpfDA7Y1t4Pj4yXT0yMTMwNDt3Yih4fDAsMjEzNzYsMTk2KX1mdW5jdGlvbiBtayhhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gbmsoZSxmLGcsaCxqLGssbCxtLG4sbyxwKXtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDtsPWx8MDttPW18MDtuPW58MDtvPW98MDtwPXB8MDt2YXIgcT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPTAsTz0wLFA9MCxRPTAsUj0wLFM9MCxUPTAsVT0wLFY9MCxXPTAsWD0wLFk9MCxaPTAsXz0wLCQ9MCxhYT0wLGJhPTAsY2E9MCxkYT0wLGVhPTAsZmE9MDt1PWk7aT1pKzU5MnwwO1E9dTtPPXUrMTEyfDA7Rz11KzEyfDA7TT11KzEwMHwwO0o9dSs0MHwwO0s9dSsyNHwwO0w9dSszNnwwO1A9dSs4OHwwO049dSs3NnwwO0g9dSs1MnwwO0k9dSs2NHwwO1Q9dSsxMjB8MDtGPXUrNTIwfDA7dD11KzUyNHwwO3k9dSs1MzZ8MDt4PXUrNTQ4fDA7cz11KzU2MHwwO3c9dSs1NzJ8MDtCPXUrNTg0fDA7Y1tGPj4yXT0wO2NbdCswPj4yXT0wO2NbdCs0Pj4yXT0wO2NbdCs4Pj4yXT0wO2NbeSswPj4yXT0wO2NbeSs0Pj4yXT0wO2NbeSs4Pj4yXT0wO2NbeCswPj4yXT0wO2NbeCs0Pj4yXT0wO2NbeCs4Pj4yXT0wO2NbcyswPj4yXT0wO2Nbcys0Pj4yXT0wO2Nbcys4Pj4yXT0wO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wO2Rve2lmKGcpe2lmKCEoKGNbMzIyOF18MCk9PS0xKSl7Y1tRPj4yXT0xMjkxMjtjW1ErND4+Ml09MjA4O2NbUSs4Pj4yXT0wO2NnKDEyOTEyLFEpfUg9KGNbMTI5MTY+PjJdfDApKyAtMXwwO0U9Y1toKzg+PjJdfDA7aWYoKGNbaCsxMj4+Ml18MCktRT4+Mj4+PjA+SD4+PjA/KEQ9Y1tFKyhIPDwyKT4+Ml18MCwoRHwwKSE9MCk6MCl7bWNbY1soY1tEPj4yXXwwKSs0ND4+Ml0mMTI3XShPLEQpO2NbRj4+Ml09Y1tPPj4yXTttY1tjWyhjW0Q+PjJdfDApKzMyPj4yXSYxMjddKEcsRCk7aWYoKGFbcz4+MF0mMSk9PTApe2FbcysxPj4wXT0wO2Fbcz4+MF09MH1lbHNle2FbY1tzKzg+PjJdPj4wXT0wO2Nbcys0Pj4yXT0wfWlnKHMpO2NbcyswPj4yXT1jW0crMD4+Ml07Y1tzKzQ+PjJdPWNbRys0Pj4yXTtjW3MrOD4+Ml09Y1tHKzg+PjJdO2NbRyswPj4yXT0wO2NbRys0Pj4yXT0wO2NbRys4Pj4yXT0wO21jW2NbKGNbRD4+Ml18MCkrMjg+PjJdJjEyN10oTSxEKTtpZigoYVt4Pj4wXSYxKT09MCl7YVt4KzE+PjBdPTA7YVt4Pj4wXT0wfWVsc2V7YVtjW3grOD4+Ml0+PjBdPTA7Y1t4KzQ+PjJdPTB9aWcoeCk7Y1t4KzA+PjJdPWNbTSswPj4yXTtjW3grND4+Ml09Y1tNKzQ+PjJdO2NbeCs4Pj4yXT1jW00rOD4+Ml07Y1tNKzA+PjJdPTA7Y1tNKzQ+PjJdPTA7Y1tNKzg+PjJdPTA7aD1vY1tjWyhjW0Q+PjJdfDApKzEyPj4yXSYxMjddKEQpfDA7Rz1vY1tjWyhjW0Q+PjJdfDApKzE2Pj4yXSYxMjddKEQpfDA7bWNbY1soY1tEPj4yXXwwKSsyMD4+Ml0mMTI3XShKLEQpO2lmKChhW3Q+PjBdJjEpPT0wKXthW3QrMT4+MF09MDthW3Q+PjBdPTB9ZWxzZXthW2NbdCs4Pj4yXT4+MF09MDtjW3QrND4+Ml09MH1pZyh0KTtjW3QrMD4+Ml09Y1tKKzA+PjJdO2NbdCs0Pj4yXT1jW0orND4+Ml07Y1t0Kzg+PjJdPWNbSis4Pj4yXTtjW0orMD4+Ml09MDtjW0orND4+Ml09MDtjW0orOD4+Ml09MDttY1tjWyhjW0Q+PjJdfDApKzI0Pj4yXSYxMjddKEssRCk7aWYoKGFbeT4+MF0mMSk9PTApe2FbeSsxPj4wXT0wO2FbeT4+MF09MH1lbHNle2FbY1t5Kzg+PjJdPj4wXT0wO2NbeSs0Pj4yXT0wfWlnKHkpO2NbeSswPj4yXT1jW0srMD4+Ml07Y1t5KzQ+PjJdPWNbSys0Pj4yXTtjW3krOD4+Ml09Y1tLKzg+PjJdO2NbSyswPj4yXT0wO2NbSys0Pj4yXT0wO2NbSys4Pj4yXT0wO1Y9b2NbY1soY1tEPj4yXXwwKSszNj4+Ml0mMTI3XShEKXwwO2JyZWFrfWVhPVhhKDQpfDA7Y1tlYT4+Ml09MjEzMDQ7d2IoZWF8MCwyMTM3NiwxOTYpfWVsc2V7aWYoISgoY1szMjEyXXwwKT09LTEpKXtjW1E+PjJdPTEyODQ4O2NbUSs0Pj4yXT0yMDg7Y1tRKzg+PjJdPTA7Y2coMTI4NDgsUSl9Rz0oY1sxMjg1Mj4+Ml18MCkrIC0xfDA7RD1jW2grOD4+Ml18MDtpZigoY1toKzEyPj4yXXwwKS1EPj4yPj4+MD5HPj4+MD8oRT1jW0QrKEc8PDIpPj4yXXwwLChFfDApIT0wKTowKXttY1tjWyhjW0U+PjJdfDApKzQ0Pj4yXSYxMjddKEwsRSk7Y1tGPj4yXT1jW0w+PjJdO21jW2NbKGNbRT4+Ml18MCkrMzI+PjJdJjEyN10oUCxFKTtpZigoYVtzPj4wXSYxKT09MCl7YVtzKzE+PjBdPTA7YVtzPj4wXT0wfWVsc2V7YVtjW3MrOD4+Ml0+PjBdPTA7Y1tzKzQ+PjJdPTB9aWcocyk7Y1tzKzA+PjJdPWNbUCswPj4yXTtjW3MrND4+Ml09Y1tQKzQ+PjJdO2Nbcys4Pj4yXT1jW1ArOD4+Ml07Y1tQKzA+PjJdPTA7Y1tQKzQ+PjJdPTA7Y1tQKzg+PjJdPTA7bWNbY1soY1tFPj4yXXwwKSsyOD4+Ml0mMTI3XShOLEUpO2lmKChhW3g+PjBdJjEpPT0wKXthW3grMT4+MF09MDthW3g+PjBdPTB9ZWxzZXthW2NbeCs4Pj4yXT4+MF09MDtjW3grND4+Ml09MH1pZyh4KTtjW3grMD4+Ml09Y1tOKzA+PjJdO2NbeCs0Pj4yXT1jW04rND4+Ml07Y1t4Kzg+PjJdPWNbTis4Pj4yXTtjW04rMD4+Ml09MDtjW04rND4+Ml09MDtjW04rOD4+Ml09MDtoPW9jW2NbKGNbRT4+Ml18MCkrMTI+PjJdJjEyN10oRSl8MDtHPW9jW2NbKGNbRT4+Ml18MCkrMTY+PjJdJjEyN10oRSl8MDttY1tjWyhjW0U+PjJdfDApKzIwPj4yXSYxMjddKEgsRSk7aWYoKGFbdD4+MF0mMSk9PTApe2FbdCsxPj4wXT0wO2FbdD4+MF09MH1lbHNle2FbY1t0Kzg+PjJdPj4wXT0wO2NbdCs0Pj4yXT0wfWlnKHQpO2NbdCswPj4yXT1jW0grMD4+Ml07Y1t0KzQ+PjJdPWNbSCs0Pj4yXTtjW3QrOD4+Ml09Y1tIKzg+PjJdO2NbSCswPj4yXT0wO2NbSCs0Pj4yXT0wO2NbSCs4Pj4yXT0wO21jW2NbKGNbRT4+Ml18MCkrMjQ+PjJdJjEyN10oSSxFKTtpZigoYVt5Pj4wXSYxKT09MCl7YVt5KzE+PjBdPTA7YVt5Pj4wXT0wfWVsc2V7YVtjW3krOD4+Ml0+PjBdPTA7Y1t5KzQ+PjJdPTB9aWcoeSk7Y1t5KzA+PjJdPWNbSSswPj4yXTtjW3krND4+Ml09Y1tJKzQ+PjJdO2NbeSs4Pj4yXT1jW0krOD4+Ml07Y1tJKzA+PjJdPTA7Y1tJKzQ+PjJdPTA7Y1tJKzg+PjJdPTA7Vj1vY1tjWyhjW0U+PjJdfDApKzM2Pj4yXSYxMjddKEUpfDA7YnJlYWt9ZWE9WGEoNCl8MDtjW2VhPj4yXT0yMTMwNDt3YihlYXwwLDIxMzc2LDE5Nil9fXdoaWxlKDApO2Nbbz4+Ml09Y1tuPj4yXTtKPW0rOHwwO0k9cysxfDA7TD1zKzR8MDttPXMrOHwwO0s9eCsxfDA7SD14KzR8MDtEPXgrOHwwO009KGomNTEyfDApIT0wO1M9eSsxfDA7aj15Kzh8MDtRPXkrNHwwO2c9dysxfDA7RT13Kzh8MDtPPXcrNHwwO049RiszfDA7Uj1uKzR8MDtQPXQrNHwwO1g9VCs0MDB8MDtZPVQ7Wj1UO1U9MDtUPTA7Vz0yMTM7YTp3aGlsZSgxKXtfPWNbZT4+Ml18MDtkb3tpZigoX3wwKSE9MCl7aWYoKGNbXysxMj4+Ml18MCk9PShjW18rMTY+PjJdfDApKXtpZigob2NbY1soY1tfPj4yXXwwKSszNj4+Ml0mMTI3XShfKXwwKT09LTEpe2NbZT4+Ml09MDtfPTA7YnJlYWt9ZWxzZXtfPWNbZT4+Ml18MDticmVha319fWVsc2V7Xz0wfX13aGlsZSgwKTtfPShffDApPT0wO2Rve2lmKChmfDApIT0wKXtpZigoY1tmKzEyPj4yXXwwKSE9KGNbZisxNj4+Ml18MCkpe2lmKF8pe2JyZWFrfWVsc2V7Qz0zNjM7YnJlYWsgYX19aWYoISgob2NbY1soY1tmPj4yXXwwKSszNj4+Ml0mMTI3XShmKXwwKT09LTEpKXtpZighXyl7Qz0zNjM7YnJlYWsgYX19ZWxzZXtDPTc0fX1lbHNle0M9NzR9fXdoaWxlKDApO2lmKChDfDApPT03NCl7Qz0wO2lmKF8pe2Y9MDtDPTM2MzticmVha31lbHNle2Y9MH19Yjpkb3tzd2l0Y2goYVtGK1U+PjBdfDApe2Nhc2UgMjp7aWYoISgoVHwwKSE9MHxVPj4+MDwyKSl7aWYoKFV8MCk9PTIpe189KGFbTj4+MF18MCkhPTB9ZWxzZXtfPTB9aWYoIShNfF8pKXtUPTA7YnJlYWsgYn19JD1hW3k+PjBdfDA7YWE9KCQmMSk9PTA7Xz1hYT9TOmNbaj4+Ml18MDtjOmRve2lmKChVfDApIT0wPyhkW0YrKFUrIC0xKT4+MF18MCk8MjowKXtiYT1fKyhhYT8oJCYyNTUpPj4+MTpjW1E+PjJdfDApfDA7Y2E9Xzt3aGlsZSgxKXtpZigoY2F8MCk9PShiYXwwKSl7YnJlYWt9YWE9YVtjYT4+MF18MDtpZighKGFhPDwyND4+MjQ+LTEpKXtiYT1jYTticmVha31pZigoYlsoY1tKPj4yXXwwKSsoYWE8PDI0Pj4yNDw8MSk+PjFdJjgxOTIpPT0wKXtiYT1jYTticmVha31lbHNle2NhPWNhKzF8MH19YWE9YmEtX3wwO2NhPWFbdz4+MF18MDtkYT0oY2EmMSk9PTA7aWYoZGEpe2VhPShjYSYyNTUpPj4+MX1lbHNle2VhPWNbTz4+Ml18MH1pZighKGFhPj4+MD5lYT4+PjApKXtpZihkYSl7ZGE9KGNhJjI1NSk+Pj4xO2NhPWc7ZWE9ZGE7ZGE9dysoZGEtYWEpKzF8MH1lbHNle2ZhPWNbRT4+Ml18MDtkYT1jW08+PjJdfDA7Y2E9ZmE7ZWE9ZGE7ZGE9ZmErKGRhLWFhKXwwfWFhPWNhK2VhfDA7aWYoKGRhfDApPT0oYWF8MCkpe2FhPWY7Xz1iYTtiYT1mfWVsc2V7Y2E9Xzt3aGlsZSgxKXtpZigoYVtkYT4+MF18MCkhPShhW2NhPj4wXXwwKSl7YWE9ZjtiYT1mO2JyZWFrIGN9ZGE9ZGErMXwwO2lmKChkYXwwKT09KGFhfDApKXthYT1mO189YmE7YmE9ZjticmVha31lbHNle2NhPWNhKzF8MH19fX1lbHNle2FhPWY7YmE9Zn19ZWxzZXthYT1mO2JhPWZ9fXdoaWxlKDApO2Q6d2hpbGUoMSl7aWYoKCQmMSk9PTApe2NhPVM7JD0oJCYyNTUpPj4+MX1lbHNle2NhPWNbaj4+Ml18MDskPWNbUT4+Ml18MH1pZigoX3wwKT09KGNhKyR8MCkpe2JyZWFrfSQ9Y1tlPj4yXXwwO2Rve2lmKCgkfDApIT0wKXtpZigoY1skKzEyPj4yXXwwKT09KGNbJCsxNj4+Ml18MCkpe2lmKChvY1tjWyhjWyQ+PjJdfDApKzM2Pj4yXSYxMjddKCQpfDApPT0tMSl7Y1tlPj4yXT0wOyQ9MDticmVha31lbHNleyQ9Y1tlPj4yXXwwO2JyZWFrfX19ZWxzZXskPTB9fXdoaWxlKDApOyQ9KCR8MCk9PTA7ZG97aWYoKGJhfDApIT0wKXtpZigoY1tiYSsxMj4+Ml18MCkhPShjW2JhKzE2Pj4yXXwwKSl7aWYoJCl7JD1hYTticmVha31lbHNle2JyZWFrIGR9fWlmKCEoKG9jW2NbKGNbYmE+PjJdfDApKzM2Pj4yXSYxMjddKGJhKXwwKT09LTEpKXtpZigkXihhYXwwKT09MCl7JD1hYTtiYT1hYX1lbHNle2JyZWFrIGR9fWVsc2V7YWE9MDtmPTA7Qz0yMzJ9fWVsc2V7Qz0yMzJ9fXdoaWxlKDApO2lmKChDfDApPT0yMzIpe0M9MDtpZigkKXticmVha31lbHNleyQ9YWE7YmE9MH19YWE9Y1tlPj4yXXwwO2NhPWNbYWErMTI+PjJdfDA7aWYoKGNhfDApPT0oY1thYSsxNj4+Ml18MCkpe2FhPW9jW2NbKGNbYWE+PjJdfDApKzM2Pj4yXSYxMjddKGFhKXwwfWVsc2V7YWE9ZFtjYT4+MF18MH1pZighKChhYSYyNTUpPDwyND4+MjQ9PShhW18+PjBdfDApKSl7YnJlYWt9ZGE9Y1tlPj4yXXwwO2NhPWRhKzEyfDA7YWE9Y1tjYT4+Ml18MDtpZigoYWF8MCk9PShjW2RhKzE2Pj4yXXwwKSl7b2NbY1soY1tkYT4+Ml18MCkrNDA+PjJdJjEyN10oZGEpfDB9ZWxzZXtjW2NhPj4yXT1hYSsxfWFhPSQ7JD1hW3k+PjBdfDA7Xz1fKzF8MH1pZihNKXthYT1hW3k+PjBdfDA7aWYoKGFhJjEpPT0wKXskPVM7YWE9KGFhJjI1NSk+Pj4xfWVsc2V7JD1jW2o+PjJdfDA7YWE9Y1tRPj4yXXwwfWlmKChffDApIT0oJCthYXwwKSl7Qz0yNDc7YnJlYWsgYX19YnJlYWt9O2Nhc2UgMDp7Qz05NzticmVha307Y2FzZSAzOntfPWFbeD4+MF18MDthYT0oXyYxKT09MDtpZihhYSl7ZGE9KF8mMjU1KT4+PjF9ZWxzZXtkYT1jW0g+PjJdfDB9JD1hW3M+PjBdfDA7YmE9KCQmMSk9PTA7aWYoYmEpe2NhPSgkJjI1NSk+Pj4xfWVsc2V7Y2E9Y1tMPj4yXXwwfWlmKChkYXwwKSE9KDAtY2F8MCkpe2lmKGFhKXtjYT0oXyYyNTUpPj4+MX1lbHNle2NhPWNbSD4+Ml18MH1pZigoY2F8MCkhPTApe2lmKGJhKXtiYT0oJCYyNTUpPj4+MX1lbHNle2JhPWNbTD4+Ml18MH1pZigoYmF8MCkhPTApe2FhPWNbZT4+Ml18MDtiYT1jW2FhKzEyPj4yXXwwO2NhPWNbYWErMTY+PjJdfDA7aWYoKGJhfDApPT0oY2F8MCkpeyQ9b2NbY1soY1thYT4+Ml18MCkrMzY+PjJdJjEyN10oYWEpfDA7Y2E9Y1tlPj4yXXwwO189YVt4Pj4wXXwwO2FhPWNhO2JhPWNbY2ErMTI+PjJdfDA7Y2E9Y1tjYSsxNj4+Ml18MH1lbHNleyQ9ZFtiYT4+MF18MH1kYT1hYSsxMnwwO2NhPShiYXwwKT09KGNhfDApO2lmKCgkJjI1NSk8PDI0Pj4yND09KGFbKChfJjEpPT0wP0s6Y1tEPj4yXXwwKT4+MF18MCkpe2lmKGNhKXtvY1tjWyhjW2FhPj4yXXwwKSs0MD4+Ml0mMTI3XShhYSl8MH1lbHNle2NbZGE+PjJdPWJhKzF9Xz1hW3g+PjBdfDA7aWYoKF8mMSk9PTApe189KF8mMjU1KT4+PjF9ZWxzZXtfPWNbSD4+Ml18MH1UPV8+Pj4wPjE/eDpUO2JyZWFrIGJ9aWYoY2Epe189b2NbY1soY1thYT4+Ml18MCkrMzY+PjJdJjEyN10oYWEpfDB9ZWxzZXtfPWRbYmE+PjBdfDB9aWYoISgoXyYyNTUpPDwyND4+MjQ9PShhWygoYVtzPj4wXSYxKT09MD9JOmNbbT4+Ml18MCk+PjBdfDApKSl7Qz0xOTY7YnJlYWsgYX1hYT1jW2U+PjJdfDA7Xz1hYSsxMnwwOyQ9Y1tfPj4yXXwwO2lmKCgkfDApPT0oY1thYSsxNj4+Ml18MCkpe29jW2NbKGNbYWE+PjJdfDApKzQwPj4yXSYxMjddKGFhKXwwfWVsc2V7Y1tfPj4yXT0kKzF9YVtsPj4wXT0xO189YVtzPj4wXXwwO2lmKChfJjEpPT0wKXtfPShfJjI1NSk+Pj4xfWVsc2V7Xz1jW0w+PjJdfDB9VD1fPj4+MD4xP3M6VDticmVhayBifX1pZihhYSl7YWE9KF8mMjU1KT4+PjF9ZWxzZXthYT1jW0g+PjJdfDB9YmE9Y1tlPj4yXXwwO2NhPWNbYmErMTI+PjJdfDA7ZGE9KGNhfDApPT0oY1tiYSsxNj4+Ml18MCk7aWYoKGFhfDApPT0wKXtpZihkYSl7Xz1vY1tjWyhjW2JhPj4yXXwwKSszNj4+Ml0mMTI3XShiYSl8MDskPWFbcz4+MF18MH1lbHNle189ZFtjYT4+MF18MH1pZighKChfJjI1NSk8PDI0Pj4yND09KGFbKCgkJjEpPT0wP0k6Y1ttPj4yXXwwKT4+MF18MCkpKXticmVhayBifWFhPWNbZT4+Ml18MDtfPWFhKzEyfDA7JD1jW18+PjJdfDA7aWYoKCR8MCk9PShjW2FhKzE2Pj4yXXwwKSl7b2NbY1soY1thYT4+Ml18MCkrNDA+PjJdJjEyN10oYWEpfDB9ZWxzZXtjW18+PjJdPSQrMX1hW2w+PjBdPTE7Xz1hW3M+PjBdfDA7aWYoKF8mMSk9PTApe189KF8mMjU1KT4+PjF9ZWxzZXtfPWNbTD4+Ml18MH1UPV8+Pj4wPjE/czpUO2JyZWFrIGJ9aWYoZGEpeyQ9b2NbY1soY1tiYT4+Ml18MCkrMzY+PjJdJjEyN10oYmEpfDA7Xz1hW3g+PjBdfDB9ZWxzZXskPWRbY2E+PjBdfDB9aWYoISgoJCYyNTUpPDwyND4+MjQ9PShhWygoXyYxKT09MD9LOmNbRD4+Ml18MCk+PjBdfDApKSl7YVtsPj4wXT0xO2JyZWFrIGJ9Xz1jW2U+PjJdfDA7JD1fKzEyfDA7YWE9Y1skPj4yXXwwO2lmKChhYXwwKT09KGNbXysxNj4+Ml18MCkpe29jW2NbKGNbXz4+Ml18MCkrNDA+PjJdJjEyN10oXyl8MH1lbHNle2NbJD4+Ml09YWErMX1fPWFbeD4+MF18MDtpZigoXyYxKT09MCl7Xz0oXyYyNTUpPj4+MX1lbHNle189Y1tIPj4yXXwwfVQ9Xz4+PjA+MT94OlR9YnJlYWt9O2Nhc2UgNDp7Xz0wO2U6d2hpbGUoMSl7JD1jW2U+PjJdfDA7ZG97aWYoKCR8MCkhPTApe2lmKChjWyQrMTI+PjJdfDApPT0oY1skKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbJD4+Ml18MCkrMzY+PjJdJjEyN10oJCl8MCk9PS0xKXtjW2U+PjJdPTA7JD0wO2JyZWFrfWVsc2V7JD1jW2U+PjJdfDA7YnJlYWt9fX1lbHNleyQ9MH19d2hpbGUoMCk7JD0oJHwwKT09MDtkb3tpZigoZnwwKSE9MCl7aWYoKGNbZisxMj4+Ml18MCkhPShjW2YrMTY+PjJdfDApKXtpZigkKXticmVha31lbHNle2JyZWFrIGV9fWlmKCEoKG9jW2NbKGNbZj4+Ml18MCkrMzY+PjJdJjEyN10oZil8MCk9PS0xKSl7aWYoISQpe2JyZWFrIGV9fWVsc2V7Qz0yNTl9fWVsc2V7Qz0yNTl9fXdoaWxlKDApO2lmKChDfDApPT0yNTkpe0M9MDtpZigkKXtmPTA7YnJlYWt9ZWxzZXtmPTB9fSQ9Y1tlPj4yXXwwO2FhPWNbJCsxMj4+Ml18MDtpZigoYWF8MCk9PShjWyQrMTY+PjJdfDApKXthYT1vY1tjWyhjWyQ+PjJdfDApKzM2Pj4yXSYxMjddKCQpfDB9ZWxzZXthYT1kW2FhPj4wXXwwfSQ9YWEmMjU1O2lmKCQ8PDI0Pj4yND4tMT8hKChiWyhjW0o+PjJdfDApKyhhYTw8MjQ+PjI0PDwxKT4+MV0mMjA0OCk9PTApOjApe2FhPWNbbz4+Ml18MDtpZigoYWF8MCk9PShwfDApKXtiYT0oY1tSPj4yXXwwKSE9MjEzO2NhPWNbbj4+Ml18MDthYT1wLWNhfDA7cD1hYT4+PjA8MjE0NzQ4MzY0Nz9hYTw8MTotMTtjYT13bihiYT9jYTowLHApfDA7aWYoKGNhfDApPT0wKXtDPTI2ODticmVhayBhfWlmKCFiYSl7YmE9Y1tuPj4yXXwwO2Nbbj4+Ml09Y2E7aWYoKGJhfDApIT0wKXtsY1tjW1I+PjJdJjI1NV0oYmEpO2NhPWNbbj4+Ml18MH19ZWxzZXtjW24+PjJdPWNhfWNbUj4+Ml09MjE0O2FhPWNhK2FhfDA7Y1tvPj4yXT1hYTtwPShjW24+PjJdfDApK3B8MH1jW28+PjJdPWFhKzE7YVthYT4+MF09JDtfPV8rMXwwfWVsc2V7YWE9YVt0Pj4wXXwwO2lmKChhYSYxKT09MCl7YWE9KGFhJjI1NSk+Pj4xfWVsc2V7YWE9Y1tQPj4yXXwwfWlmKCEoKCgoYWF8MCk9PTB8KF98MCk9PTApXjEpJiQ8PDI0Pj4yND09Rzw8MjQ+PjI0KSl7YnJlYWt9aWYoKFl8MCk9PShYfDApKXtZPVktWnwwO1g9WT4+PjA8MjE0NzQ4MzY0Nz9ZPDwxOi0xO2lmKChXfDApPT0yMTMpe1o9MH1XPXduKFosWCl8MDtpZigoV3wwKT09MCl7Qz0yODU7YnJlYWsgYX1aPVc7WD1XKyhYPj4+Mjw8Mil8MDtZPVcrKFk+PjI8PDIpfDA7Vz0yMTR9Y1tZPj4yXT1fO1k9WSs0fDA7Xz0wfSQ9Y1tlPj4yXXwwO2FhPSQrMTJ8MDtiYT1jW2FhPj4yXXwwO2lmKChiYXwwKT09KGNbJCsxNj4+Ml18MCkpe29jW2NbKGNbJD4+Ml18MCkrNDA+PjJdJjEyN10oJCl8MDtjb250aW51ZX1lbHNle2NbYWE+PjJdPWJhKzE7Y29udGludWV9fWlmKCEoKFp8MCk9PShZfDApfChffDApPT0wKSl7aWYoKFl8MCk9PShYfDApKXtZPVktWnwwO1g9WT4+PjA8MjE0NzQ4MzY0Nz9ZPDwxOi0xO2lmKChXfDApPT0yMTMpe1o9MH1XPXduKFosWCl8MDtpZigoV3wwKT09MCl7Qz0yOTc7YnJlYWsgYX1aPVc7WD1XKyhYPj4+Mjw8Mil8MDtZPVcrKFk+PjI8PDIpfDA7Vz0yMTR9Y1tZPj4yXT1fO1k9WSs0fDB9aWYoKFZ8MCk+MCl7Xz1jW2U+PjJdfDA7ZG97aWYoKF98MCkhPTApe2lmKChjW18rMTI+PjJdfDApPT0oY1tfKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbXz4+Ml18MCkrMzY+PjJdJjEyN10oXyl8MCk9PS0xKXtjW2U+PjJdPTA7Xz0wO2JyZWFrfWVsc2V7Xz1jW2U+PjJdfDA7YnJlYWt9fX1lbHNle189MH19d2hpbGUoMCk7Xz0oX3wwKT09MDtkb3tpZigoZnwwKSE9MCl7aWYoKGNbZisxMj4+Ml18MCkhPShjW2YrMTY+PjJdfDApKXtpZihfKXticmVha31lbHNle0M9MzE5O2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbZj4+Ml18MCkrMzY+PjJdJjEyN10oZil8MCk9PS0xKSl7aWYoIV8pe0M9MzE5O2JyZWFrIGF9fWVsc2V7Qz0zMTN9fWVsc2V7Qz0zMTN9fXdoaWxlKDApO2lmKChDfDApPT0zMTMpe0M9MDtpZihfKXtDPTMxOTticmVhayBhfWVsc2V7Zj0wfX1fPWNbZT4+Ml18MDskPWNbXysxMj4+Ml18MDtpZigoJHwwKT09KGNbXysxNj4+Ml18MCkpe189b2NbY1soY1tfPj4yXXwwKSszNj4+Ml0mMTI3XShfKXwwfWVsc2V7Xz1kWyQ+PjBdfDB9aWYoISgoXyYyNTUpPDwyND4+MjQ9PWg8PDI0Pj4yNCkpe0M9MzE5O2JyZWFrIGF9Xz1jW2U+PjJdfDA7JD1fKzEyfDA7YWE9Y1skPj4yXXwwO2lmKChhYXwwKT09KGNbXysxNj4+Ml18MCkpe29jW2NbKGNbXz4+Ml18MCkrNDA+PjJdJjEyN10oXyl8MDthYT1mOyQ9Zn1lbHNle2NbJD4+Ml09YWErMTthYT1mOyQ9Zn13aGlsZSgxKXtfPWNbZT4+Ml18MDtkb3tpZigoX3wwKSE9MCl7aWYoKGNbXysxMj4+Ml18MCk9PShjW18rMTY+PjJdfDApKXtpZigob2NbY1soY1tfPj4yXXwwKSszNj4+Ml0mMTI3XShfKXwwKT09LTEpe2NbZT4+Ml09MDtfPTA7YnJlYWt9ZWxzZXtfPWNbZT4+Ml18MDticmVha319fWVsc2V7Xz0wfX13aGlsZSgwKTtiYT0oX3wwKT09MDtkb3tpZigoJHwwKSE9MCl7aWYoKGNbJCsxMj4+Ml18MCkhPShjWyQrMTY+PjJdfDApKXtpZihiYSl7Xz1hYTticmVha31lbHNle0M9MzQxO2JyZWFrIGF9fWlmKCEoKG9jW2NbKGNbJD4+Ml18MCkrMzY+PjJdJjEyN10oJCl8MCk9PS0xKSl7aWYoYmFeKGFhfDApPT0wKXtfPWFhOyQ9YWF9ZWxzZXtDPTM0MTticmVhayBhfX1lbHNle189MDtmPTA7Qz0zMzR9fWVsc2V7Xz1hYTtDPTMzNH19d2hpbGUoMCk7aWYoKEN8MCk9PTMzNCl7Qz0wO2lmKGJhKXtDPTM0MTticmVhayBhfWVsc2V7JD0wfX1hYT1jW2U+PjJdfDA7YmE9Y1thYSsxMj4+Ml18MDtpZigoYmF8MCk9PShjW2FhKzE2Pj4yXXwwKSl7YWE9b2NbY1soY1thYT4+Ml18MCkrMzY+PjJdJjEyN10oYWEpfDB9ZWxzZXthYT1kW2JhPj4wXXwwfWlmKCEoKGFhJjI1NSk8PDI0Pj4yND4tMSkpe0M9MzQxO2JyZWFrIGF9aWYoKGJbKGNbSj4+Ml18MCkrKGFhPDwyND4+MjQ8PDEpPj4xXSYyMDQ4KT09MCl7Qz0zNDE7YnJlYWsgYX1hYT1jW28+PjJdfDA7aWYoKGFhfDApPT0ocHwwKSl7YmE9KGNbUj4+Ml18MCkhPTIxMztjYT1jW24+PjJdfDA7YWE9cC1jYXwwO3A9YWE+Pj4wPDIxNDc0ODM2NDc/YWE8PDE6LTE7Y2E9d24oYmE/Y2E6MCxwKXwwO2lmKChjYXwwKT09MCl7Qz0zNDQ7YnJlYWsgYX1kb3tpZihiYSl7Y1tuPj4yXT1jYX1lbHNle2JhPWNbbj4+Ml18MDtjW24+PjJdPWNhO2lmKChiYXwwKT09MCl7YnJlYWt9bGNbY1tSPj4yXSYyNTVdKGJhKTtjYT1jW24+PjJdfDB9fXdoaWxlKDApO2NbUj4+Ml09MjE0O2FhPWNhK2FhfDA7Y1tvPj4yXT1hYTtwPShjW24+PjJdfDApK3B8MH1jYT1jW2U+PjJdfDA7YmE9Y1tjYSsxMj4+Ml18MDtpZigoYmF8MCk9PShjW2NhKzE2Pj4yXXwwKSl7YmE9b2NbY1soY1tjYT4+Ml18MCkrMzY+PjJdJjEyN10oY2EpfDA7YWE9Y1tvPj4yXXwwfWVsc2V7YmE9ZFtiYT4+MF18MH1jW28+PjJdPWFhKzE7YVthYT4+MF09YmE7Vj1WKyAtMXwwO2NhPWNbZT4+Ml18MDthYT1jYSsxMnwwO2JhPWNbYWE+PjJdfDA7aWYoKGJhfDApPT0oY1tjYSsxNj4+Ml18MCkpe29jW2NbKGNbY2E+PjJdfDApKzQwPj4yXSYxMjddKGNhKXwwfWVsc2V7Y1thYT4+Ml09YmErMX1pZigoVnwwKT4wKXthYT1ffWVsc2V7YnJlYWt9fX1pZigoY1tvPj4yXXwwKT09KGNbbj4+Ml18MCkpe0M9MzYxO2JyZWFrIGF9YnJlYWt9O2Nhc2UgMTp7aWYoKFV8MCk9PTMpe0M9MzYzO2JyZWFrIGF9Qz1jW2U+PjJdfDA7Xz1jW0MrMTI+PjJdfDA7aWYoKF98MCk9PShjW0MrMTY+PjJdfDApKXtDPW9jW2NbKGNbQz4+Ml18MCkrMzY+PjJdJjEyN10oQyl8MH1lbHNle0M9ZFtfPj4wXXwwfWlmKCEoKEMmMjU1KTw8MjQ+PjI0Pi0xKSl7Qz05NjticmVhayBhfWlmKChiWyhjW0o+PjJdfDApKyhDPDwyND4+MjQ8PDEpPj4xXSY4MTkyKT09MCl7Qz05NjticmVhayBhfUM9Y1tlPj4yXXwwOyQ9QysxMnwwO189Y1skPj4yXXwwO2lmKChffDApPT0oY1tDKzE2Pj4yXXwwKSl7Qz1vY1tjWyhjW0M+PjJdfDApKzQwPj4yXSYxMjddKEMpfDB9ZWxzZXtjWyQ+PjJdPV8rMTtDPWRbXz4+MF18MH1fPUMmMjU1OyQ9YVt3Pj4wXXwwO0M9KCQmMSkhPTA7aWYoQyl7YWE9KGNbdz4+Ml0mLTIpKyAtMXwwOyQ9Y1tPPj4yXXwwfWVsc2V7YWE9MTA7JD0oJCYyNTUpPj4+MX1pZigoJHwwKT09KGFhfDApKXtsZyh3LGFhLDEsYWEsYWEsMCk7aWYoKGFbdz4+MF0mMSk9PTApe0M9OTN9ZWxzZXtDPTk0fX1lbHNle2lmKEMpe0M9OTR9ZWxzZXtDPTkzfX1pZigoQ3wwKT09OTMpe2Fbdz4+MF09KCQ8PDEpKzI7YmE9ZzthYT0kKzF8MH1lbHNlIGlmKChDfDApPT05NCl7YmE9Y1tFPj4yXXwwO2FhPSQrMXwwO2NbTz4+Ml09YWF9YVtiYSskPj4wXT1fO2FbYmErYWE+PjBdPTA7Qz05NzticmVha307ZGVmYXVsdDp7fX19d2hpbGUoMCk7Zjpkb3tpZigoQ3wwKT09OTcpe0M9MDtpZigoVXwwKT09Myl7Qz0zNjM7YnJlYWsgYX1lbHNle2FhPWY7JD1mfXdoaWxlKDEpe189Y1tlPj4yXXwwO2Rve2lmKChffDApIT0wKXtpZigoY1tfKzEyPj4yXXwwKT09KGNbXysxNj4+Ml18MCkpe2lmKChvY1tjWyhjW18+PjJdfDApKzM2Pj4yXSYxMjddKF8pfDApPT0tMSl7Y1tlPj4yXT0wO189MDticmVha31lbHNle189Y1tlPj4yXXwwO2JyZWFrfX19ZWxzZXtfPTB9fXdoaWxlKDApO2JhPShffDApPT0wO2Rve2lmKCgkfDApIT0wKXtpZigoY1skKzEyPj4yXXwwKSE9KGNbJCsxNj4+Ml18MCkpe2lmKGJhKXtfPWFhO2JyZWFrfWVsc2V7YnJlYWsgZn19aWYoISgob2NbY1soY1skPj4yXXwwKSszNj4+Ml0mMTI3XSgkKXwwKT09LTEpKXtpZihiYV4oYWF8MCk9PTApe189YWE7JD1hYX1lbHNle2JyZWFrIGZ9fWVsc2V7Xz0wO2Y9MDtDPTEwOX19ZWxzZXtfPWFhO0M9MTA5fX13aGlsZSgwKTtpZigoQ3wwKT09MTA5KXtDPTA7aWYoYmEpe2JyZWFrIGZ9ZWxzZXskPTB9fWJhPWNbZT4+Ml18MDthYT1jW2JhKzEyPj4yXXwwO2lmKChhYXwwKT09KGNbYmErMTY+PjJdfDApKXthYT1vY1tjWyhjW2JhPj4yXXwwKSszNj4+Ml0mMTI3XShiYSl8MH1lbHNle2FhPWRbYWE+PjBdfDB9aWYoISgoYWEmMjU1KTw8MjQ+PjI0Pi0xKSl7YnJlYWsgZn1pZigoYlsoY1tKPj4yXXwwKSsoYWE8PDI0Pj4yNDw8MSk+PjFdJjgxOTIpPT0wKXticmVhayBmfWJhPWNbZT4+Ml18MDtDPWJhKzEyfDA7YWE9Y1tDPj4yXXwwO2lmKChhYXwwKT09KGNbYmErMTY+PjJdfDApKXtDPW9jW2NbKGNbYmE+PjJdfDApKzQwPj4yXSYxMjddKGJhKXwwfWVsc2V7Y1tDPj4yXT1hYSsxO0M9ZFthYT4+MF18MH1hYT1DJjI1NTtiYT1hW3c+PjBdfDA7Y2E9KGJhJjEpIT0wO2lmKGNhKXtDPShjW3c+PjJdJi0yKSsgLTF8MDtiYT1jW08+PjJdfDB9ZWxzZXtDPTEwO2JhPShiYSYyNTUpPj4+MX1pZigoYmF8MCk9PShDfDApKXtsZyh3LEMsMSxDLEMsMCk7aWYoKGFbdz4+MF0mMSk9PTApe0M9MTI2fWVsc2V7Qz0xMjd9fWVsc2V7aWYoY2Epe0M9MTI3fWVsc2V7Qz0xMjZ9fWlmKChDfDApPT0xMjYpe0M9MDthW3c+PjBdPShiYTw8MSkrMjtjYT1nO2RhPWJhKzF8MH1lbHNlIGlmKChDfDApPT0xMjcpe0M9MDtjYT1jW0U+PjJdfDA7ZGE9YmErMXwwO2NbTz4+Ml09ZGF9YVtjYStiYT4+MF09YWE7YVtjYStkYT4+MF09MDthYT1ffX19d2hpbGUoMCk7VT1VKzF8MDtpZighKFU+Pj4wPDQpKXtDPTM2MzticmVha319Zzpzd2l0Y2goQ3wwKXtjYXNlIDk2OntjW2s+PjJdPWNbaz4+Ml18NDtlPTA7WT1aO2JyZWFrfTtjYXNlIDE5Njp7Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVha307Y2FzZSAyNDc6e2Nbaz4+Ml09Y1trPj4yXXw0O2U9MDtZPVo7YnJlYWt9O2Nhc2UgMjY4OntmYT1YYSg0KXwwO2NbZmE+PjJdPTIyNjgwO3diKGZhfDAsMjI3MjgsMjA2KX07Y2FzZSAyODU6e2ZhPVhhKDQpfDA7Y1tmYT4+Ml09MjI2ODA7d2IoZmF8MCwyMjcyOCwyMDYpfTtjYXNlIDI5Nzp7ZmE9WGEoNCl8MDtjW2ZhPj4yXT0yMjY4MDt3YihmYXwwLDIyNzI4LDIwNil9O2Nhc2UgMzE5OntjW2s+PjJdPWNbaz4+Ml18NDtlPTA7WT1aO2JyZWFrfTtjYXNlIDM0MTp7Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVha307Y2FzZSAzNDQ6e2ZhPVhhKDQpfDA7Y1tmYT4+Ml09MjI2ODA7d2IoZmF8MCwyMjcyOCwyMDYpfTtjYXNlIDM2MTp7Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVha307Y2FzZSAzNjM6e2g6ZG97aWYoKFR8MCkhPTApe0Y9VCsxfDA7bj1UKzh8MDtsPVQrNHwwO289MTtpOndoaWxlKDEpe2g9YVtUPj4wXXwwO2lmKChoJjEpPT0wKXtoPShoJjI1NSk+Pj4xfWVsc2V7aD1jW2w+PjJdfDB9aWYoIShvPj4+MDxoPj4+MCkpe2JyZWFrIGh9aD1jW2U+PjJdfDA7ZG97aWYoKGh8MCkhPTApe2lmKChjW2grMTI+PjJdfDApPT0oY1toKzE2Pj4yXXwwKSl7aWYoKG9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MCk9PS0xKXtjW2U+PjJdPTA7aD0wO2JyZWFrfWVsc2V7aD1jW2U+PjJdfDA7YnJlYWt9fX1lbHNle2g9MH19d2hpbGUoMCk7aD0oaHwwKT09MDtkb3tpZigoZnwwKSE9MCl7aWYoKGNbZisxMj4+Ml18MCkhPShjW2YrMTY+PjJdfDApKXtpZihoKXticmVha31lbHNle2JyZWFrIGl9fWlmKCEoKG9jW2NbKGNbZj4+Ml18MCkrMzY+PjJdJjEyN10oZil8MCk9PS0xKSl7aWYoIWgpe2JyZWFrIGl9fWVsc2V7Qz0zODB9fWVsc2V7Qz0zODB9fXdoaWxlKDApO2lmKChDfDApPT0zODApe0M9MDtpZihoKXticmVha31lbHNle2Y9MH19aD1jW2U+PjJdfDA7Rz1jW2grMTI+PjJdfDA7aWYoKEd8MCk9PShjW2grMTY+PjJdfDApKXtoPW9jW2NbKGNbaD4+Ml18MCkrMzY+PjJdJjEyN10oaCl8MH1lbHNle2g9ZFtHPj4wXXwwfWlmKChhW1Q+PjBdJjEpPT0wKXtHPUZ9ZWxzZXtHPWNbbj4+Ml18MH1pZighKChoJjI1NSk8PDI0Pj4yND09KGFbRytvPj4wXXwwKSkpe2JyZWFrfW89bysxfDA7aD1jW2U+PjJdfDA7Rz1oKzEyfDA7SD1jW0c+PjJdfDA7aWYoKEh8MCk9PShjW2grMTY+PjJdfDApKXtvY1tjWyhjW2g+PjJdfDApKzQwPj4yXSYxMjddKGgpfDA7Y29udGludWV9ZWxzZXtjW0c+PjJdPUgrMTtjb250aW51ZX19Y1trPj4yXT1jW2s+PjJdfDQ7ZT0wO1k9WjticmVhayBnfX13aGlsZSgwKTtpZigoWnwwKSE9KFl8MCkpe2NbQj4+Ml09MDtxayh0LFosWSxCKTtpZigoY1tCPj4yXXwwKT09MCl7ZT0xO1k9Wn1lbHNle2Nbaz4+Ml09Y1trPj4yXXw0O2U9MDtZPVp9fWVsc2V7ZT0xfWJyZWFrfX1pZighKChhW3c+PjBdJjEpPT0wKT8odj1jW0U+PjJdfDAsKHZ8MCkhPTApOjApe3ZuKHYpfWlmKCEoKGFbcz4+MF0mMSk9PTApPyh6PWNbbT4+Ml18MCwoenwwKSE9MCk6MCl7dm4oeil9aWYoISgoYVt4Pj4wXSYxKT09MCk/KEE9Y1tEPj4yXXwwLChBfDApIT0wKTowKXt2bihBKX1pZighKChhW3k+PjBdJjEpPT0wKT8ocj1jW2o+PjJdfDAsKHJ8MCkhPTApOjApe3ZuKHIpfWlmKCEoKGFbdD4+MF0mMSk9PTApPyhxPWNbdCs4Pj4yXXwwLChxfDApIT0wKTowKXt2bihxKX1pZigoWXwwKT09MCl7aT11O3JldHVybiBlfDB9bGNbVyYyNTVdKFkpO2k9dTtyZXR1cm4gZXwwfWZ1bmN0aW9uIG9rKGEpe2E9YXwwO3ZhciBiPTAsZD0wLGU9MCxmPTAsZz0wO2Q9WGEoOCl8MDtjW2Q+PjJdPTk5Mjg7Yj1KbihhfDApfDA7ZT1iKzEzfDA7ZT0oZXwwKT09MD8xOmU7d2hpbGUoMSl7Zz11bihlKXwwO2lmKChnfDApIT0wKXtmPTc7YnJlYWt9Zz1jWzU2NjZdfDA7Y1s1NjY2XT1nKzA7aWYoKGd8MCk9PTApe2JyZWFrfXNjW2cmMzFdKCl9aWYoKGZ8MCk9PTcpe2NbZys0Pj4yXT1iO2NbZz4+Ml09YjtmPWcrMTJ8MDtjW2QrND4+Ml09ZjtjW2crOD4+Ml09MDtMbihmfDAsYXwwLGIrMXwwKXwwO3diKGR8MCwxMDA2NCwxMDYpfWc9WGEoNCl8MDtjW2c+PjJdPTIyNjgwO3diKGd8MCwyMjcyOCwyMDYpfWZ1bmN0aW9uIHBrKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MDttPWk7aT1pKzEyOHwwO3A9bTtzPW0rMjh8MDtkPW0rMTZ8MDtxPW0rMTJ8MDt0PW0rMjR8MDtjW2Q+PjJdPXM7bD1kKzR8MDtjW2w+PjJdPTIxMztzPXMrMTAwfDA7bj1jW2grMjg+PjJdfDA7dT1uKzR8MDtjW3U+PjJdPShjW3U+PjJdfDApKzE7aWYoISgoY1szMzY0XXwwKT09LTEpKXtjW3A+PjJdPTEzNDU2O2NbcCs0Pj4yXT0yMDg7Y1twKzg+PjJdPTA7Y2coMTM0NTYscCl9cD0oY1sxMzQ2MD4+Ml18MCkrIC0xfDA7dT1jW24rOD4+Ml18MDtpZigoY1tuKzEyPj4yXXwwKS11Pj4yPj4+MD5wPj4+MD8ocj1jW3UrKHA8PDIpPj4yXXwwLChyfDApIT0wKTowKXthW3Q+PjBdPTA7cD1jW2Y+PjJdfDA7ZG97aWYobmsoZSxwLGcsbixjW2grND4+Ml18MCxqLHQscixkLHEscyl8MCl7aWYoKGFbaz4+MF0mMSk9PTApe2FbaysxPj4wXT0wO2Fbaz4+MF09MH1lbHNle2FbY1trKzg+PjJdPj4wXT0wO2Nbays0Pj4yXT0wfWlmKChhW3Q+PjBdfDApIT0wKXtnPXhjW2NbKGNbcj4+Ml18MCkrMjg+PjJdJjYzXShyLDQ1KXwwO2g9YVtrPj4wXXwwO289KGgmMSkhPTA7aWYobyl7cz0oY1trPj4yXSYtMikrIC0xfDA7aD1jW2srND4+Ml18MH1lbHNle3M9MTA7aD0oaCYyNTUpPj4+MX1pZigoaHwwKT09KHN8MCkpe2xnKGsscywxLHMscywwKTtpZigoYVtrPj4wXSYxKT09MCl7bz0yMX1lbHNle289MjJ9fWVsc2V7aWYobyl7bz0yMn1lbHNle289MjF9fWlmKChvfDApPT0yMSl7YVtrPj4wXT0oaDw8MSkrMjtzPWsrMXwwO3Q9aCsxfDB9ZWxzZSBpZigob3wwKT09MjIpe3M9Y1trKzg+PjJdfDA7dD1oKzF8MDtjW2srND4+Ml09dH1hW3MraD4+MF09ZzthW3MrdD4+MF09MH1yPXhjW2NbKGNbcj4+Ml18MCkrMjg+PjJdJjYzXShyLDQ4KXwwO2g9Y1tkPj4yXXwwO3E9Y1txPj4yXXwwO2c9cSsgLTF8MDthOmRve2lmKGg+Pj4wPGc+Pj4wKXt3aGlsZSgxKXtzPWgrMXwwO2lmKCEoKGFbaD4+MF18MCk9PXI8PDI0Pj4yNCkpe2JyZWFrIGF9aWYocz4+PjA8Zz4+PjApe2g9c31lbHNle2g9czticmVha319fX13aGlsZSgwKTtzPWg7cj1hW2s+PjBdfDA7aWYoKHImMSk9PTApe3Q9cjt1PTEwO3I9KHImMjU1KT4+PjF9ZWxzZXt1PWNbaz4+Ml18MDt0PXUmMjU1O3U9KHUmLTIpKyAtMXwwO3I9Y1trKzQ+PjJdfDB9Zz1xLXN8MDtpZigocXwwKSE9KGh8MCkpe2lmKCh1LXJ8MCk+Pj4wPGc+Pj4wKXtsZyhrLHUscitnLXV8MCxyLHIsMCk7dD1hW2s+PjBdfDB9aWYoKHQmMSk9PTApe3Q9aysxfDB9ZWxzZXt0PWNbays4Pj4yXXwwfXM9cSsoci1zKXwwO3U9dCtyfDA7d2hpbGUoMSl7YVt1Pj4wXT1hW2g+PjBdfDA7aD1oKzF8MDtpZigoaHwwKT09KHF8MCkpe2JyZWFrfXU9dSsxfDB9YVt0K3M+PjBdPTA7cT1yK2d8MDtpZigoYVtrPj4wXSYxKT09MCl7YVtrPj4wXT1xPDwxO2JyZWFrfWVsc2V7Y1trKzQ+PjJdPXE7YnJlYWt9fX19d2hpbGUoMCk7az1jW2U+PjJdfDA7aWYoKGt8MCkhPTApe2lmKChjW2srMTI+PjJdfDApPT0oY1trKzE2Pj4yXXwwKT8ob2NbY1soY1trPj4yXXwwKSszNj4+Ml0mMTI3XShrKXwwKT09LTE6MCl7Y1tlPj4yXT0wO2s9MH19ZWxzZXtrPTB9ZT0oa3wwKT09MDtkb3tpZigocHwwKSE9MCl7aWYoKGNbcCsxMj4+Ml18MCkhPShjW3ArMTY+PjJdfDApKXtpZihlKXticmVha31lbHNle289NTc7YnJlYWt9fWlmKCEoKG9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MCk9PS0xKSl7aWYoZSl7YnJlYWt9ZWxzZXtvPTU3O2JyZWFrfX1lbHNle2NbZj4+Ml09MDtvPTU1O2JyZWFrfX1lbHNle289NTV9fXdoaWxlKDApO2lmKChvfDApPT01NT9lOjApe289NTd9aWYoKG98MCk9PTU3KXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPWs7dD1uKzR8MDt1PWNbdD4+Ml18MDtjW3Q+PjJdPXUrIC0xO2lmKCh1fDApPT0wKXtsY1tjWyhjW24+PjJdfDApKzg+PjJdJjI1NV0obil9aj1jW2Q+PjJdfDA7Y1tkPj4yXT0wO2lmKChqfDApPT0wKXtpPW07cmV0dXJufWxjW2NbbD4+Ml0mMjU1XShqKTtpPW07cmV0dXJufXU9WGEoNCl8MDtjW3U+PjJdPTIxMzA0O3diKHV8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHFrKGIsZCxlLGYpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3ZhciBnPTAsaD0wLGo9MCxrPTA7Zz1pO2s9YVtiPj4wXXwwO2lmKChrJjEpPT0wKXtqPShrJjI1NSk+Pj4xfWVsc2V7aj1jW2IrND4+Ml18MH1pZigoanwwKT09MCl7aT1nO3JldHVybn1pZigoZHwwKSE9KGV8MCk/KGg9ZSsgLTR8MCxoPj4+MD5kPj4+MCk6MCl7aj1kO2Rve2s9Y1tqPj4yXXwwO2Nbaj4+Ml09Y1toPj4yXTtjW2g+PjJdPWs7aj1qKzR8MDtoPWgrIC00fDB9d2hpbGUoaj4+PjA8aD4+PjApO2s9YVtiPj4wXXwwfWlmKChrJjEpPT0wKXtoPWIrMXwwO2I9KGsmMjU1KT4+PjF9ZWxzZXtoPWNbYis4Pj4yXXwwO2I9Y1tiKzQ+PjJdfDB9ZT1lKyAtNHwwO2s9YVtoPj4wXXwwO2o9azw8MjQ+PjI0PDF8azw8MjQ+PjI0PT0xMjc7YTpkb3tpZihlPj4+MD5kPj4+MCl7Yj1oK2J8MDt3aGlsZSgxKXtpZighaj8oazw8MjQ+PjI0fDApIT0oY1tkPj4yXXwwKTowKXticmVha31oPShiLWh8MCk+MT9oKzF8MDpoO2Q9ZCs0fDA7az1hW2g+PjBdfDA7aj1rPDwyND4+MjQ8MXxrPDwyND4+MjQ9PTEyNztpZighKGQ+Pj4wPGU+Pj4wKSl7YnJlYWsgYX19Y1tmPj4yXT00O2k9ZztyZXR1cm59fXdoaWxlKDApO2lmKGope2k9ZztyZXR1cm59aj1jW2U+PjJdfDA7aWYoIShrPDwyND4+MjQ+Pj4wPGo+Pj4wfChqfDApPT0wKSl7aT1nO3JldHVybn1jW2Y+PjJdPTQ7aT1nO3JldHVybn1mdW5jdGlvbiByayhhKXthPWF8MDt2YXIgYj0wO2I9aTtpZigoYXwwKSE9MCl7dm4oYSl9aT1iO3JldHVybn1mdW5jdGlvbiBzayhhKXthPWF8MDtyZXR1cm59ZnVuY3Rpb24gdGsoYixkLGUsZixnLGgsaixrKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDtrPWt8MDt2YXIgbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wO249aTtpPWkrNTc2fDA7cT1uO3Y9bisyNHwwO2Q9bisxNnwwO3I9bis0NjR8MDt1PW4rNTY4fDA7cz1uKzQyNHwwO3A9bis0Njh8MDtjW2Q+PjJdPXY7bT1kKzR8MDtjW20+PjJdPTIxMzt2PXYrNDAwfDA7bz1jW2grMjg+PjJdfDA7eD1vKzR8MDtjW3g+PjJdPShjW3g+PjJdfDApKzE7aWYoISgoY1szMzYyXXwwKT09LTEpKXtjW3E+PjJdPTEzNDQ4O2NbcSs0Pj4yXT0yMDg7Y1txKzg+PjJdPTA7Y2coMTM0NDgscSl9eD0oY1sxMzQ1Mj4+Ml18MCkrIC0xfDA7dz1jW28rOD4+Ml18MDtpZigoY1tvKzEyPj4yXXwwKS13Pj4yPj4+MD54Pj4+MD8odD1jW3crKHg8PDIpPj4yXXwwLCh0fDApIT0wKTowKXthW3U+PjBdPTA7ZG97aWYodWsoZSxjW2Y+PjJdfDAsZyxvLGNbaCs0Pj4yXXwwLGosdSx0LGQscix2KXwwKXt1Y1tjWyhjW3Q+PjJdfDApKzQ4Pj4yXSYzMV0odCwxMzE2OCwxMzE3OHwwLHMpfDA7aD1jW3I+PjJdfDA7Zz1jW2Q+PjJdfDA7dD1oLWd8MDtpZigodHwwKT4zOTIpe3Y9dW4oKHQ+PjIpKzJ8MCl8MDtpZigodnwwKT09MCl7eD1YYSg0KXwwO2NbeD4+Ml09MjI2ODA7d2IoeHwwLDIyNzI4LDIwNil9ZWxzZXt0PXZ9fWVsc2V7dD0wO3Y9cH1pZigoYVt1Pj4wXXwwKSE9MCl7YVt2Pj4wXT00NTt2PXYrMXwwfWlmKGc+Pj4wPGg+Pj4wKXtoPXMrNDB8MDt1PXM7ZG97eD1jW2c+PjJdfDA7dz1zO3doaWxlKDEpe2lmKChjW3c+PjJdfDApPT0oeHwwKSl7YnJlYWt9dz13KzR8MDtpZigod3wwKT09KGh8MCkpe3c9aDticmVha319YVt2Pj4wXT1hWzEzMTY4Kyh3LXU+PjIpPj4wXXwwO2c9Zys0fDA7dj12KzF8MH13aGlsZShnPj4+MDwoY1tyPj4yXXwwKT4+PjApfWFbdj4+MF09MDtjW3E+PjJdPWs7aWYoKEZhKHB8MCwxMzEwNCxxfDApfDApPT0xKXtpZigodHwwKT09MCl7YnJlYWt9dm4odCk7YnJlYWt9aj1YYSg4KXwwO2Nbaj4+Ml09OTkyODt3aGlsZSgxKXtkPXVuKDI4KXwwO2lmKChkfDApIT0wKXtsPTI5O2JyZWFrfWw9Y1s1NjY2XXwwO2NbNTY2Nl09bCswO2lmKChsfDApPT0wKXtsPTI3O2JyZWFrfXNjW2wmMzFdKCl9aWYoKGx8MCk9PTI3KXt4PVhhKDQpfDA7Y1t4Pj4yXT0yMjY4MDt3Yih4fDAsMjI3MjgsMjA2KX1lbHNlIGlmKChsfDApPT0yOSl7Y1tkKzQ+PjJdPTE1O2NbZD4+Ml09MTU7Yj1kKzEyfDA7Y1tqKzQ+PjJdPWI7Y1tkKzg+PjJdPTA7Yj1iKzB8MDtkPTEzMTEyfDA7bD1iKzE2fDA7ZG97YVtiPj4wXT1hW2Q+PjBdfDA7Yj1iKzF8MDtkPWQrMXwwfXdoaWxlKChifDApPChsfDApKTt3YihqfDAsMTAwNjQsMTA2KX19fXdoaWxlKDApO2s9Y1tlPj4yXXwwO2lmKChrfDApIT0wKXtwPWNbaysxMj4+Ml18MDtpZigocHwwKT09KGNbaysxNj4+Ml18MCkpe3A9b2NbY1soY1trPj4yXXwwKSszNj4+Ml0mMTI3XShrKXwwfWVsc2V7cD1jW3A+PjJdfDB9aWYoKHB8MCk9PS0xKXtjW2U+PjJdPTA7ZT0wO2s9MX1lbHNle2U9aztrPTB9fWVsc2V7ZT0wO2s9MX1xPWNbZj4+Ml18MDtkb3tpZigocXwwKSE9MCl7cD1jW3ErMTI+PjJdfDA7aWYoKHB8MCk9PShjW3ErMTY+PjJdfDApKXtwPW9jW2NbKGNbcT4+Ml18MCkrMzY+PjJdJjEyN10ocSl8MH1lbHNle3A9Y1twPj4yXXwwfWlmKCEoKHB8MCk9PS0xKSl7aWYoayl7YnJlYWt9ZWxzZXtsPTQ3O2JyZWFrfX1lbHNle2NbZj4+Ml09MDtsPTQ1O2JyZWFrfX1lbHNle2w9NDV9fXdoaWxlKDApO2lmKChsfDApPT00NT9rOjApe2w9NDd9aWYoKGx8MCk9PTQ3KXtjW2o+PjJdPWNbaj4+Ml18Mn1jW2I+PjJdPWU7dz1vKzR8MDt4PWNbdz4+Ml18MDtjW3c+PjJdPXgrIC0xO2lmKCh4fDApPT0wKXtsY1tjWyhjW28+PjJdfDApKzg+PjJdJjI1NV0obyl9bD1jW2Q+PjJdfDA7Y1tkPj4yXT0wO2lmKChsfDApPT0wKXtpPW47cmV0dXJufWxjW2NbbT4+Ml0mMjU1XShsKTtpPW47cmV0dXJufXg9WGEoNCl8MDtjW3g+PjJdPTIxMzA0O3diKHh8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIHVrKGIsZSxmLGcsaCxqLGssbCxtLG4sbyl7Yj1ifDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7bz1vfDA7dmFyIHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wLE49MCxPPTAsUD0wLFE9MCxSPTAsUz0wLFQ9MCxVPTAsVj0wLFc9MCxYPTAsWT0wLFo9MCxfPTAsJD0wLGFhPTA7dj1pO2k9aSs1OTJ8MDtRPXY7Tz12KzExMnwwO0s9disxMnwwO0c9disxMDB8MDtIPXYrNDB8MDtFPXYrMjR8MDtOPXYrMzZ8MDtNPXYrODh8MDtMPXYrNzZ8MDtKPXYrNTJ8MDtJPXYrNjR8MDtQPXYrMTIwfDA7Rj12KzUyMHwwO3Q9dis1MjR8MDt3PXYrNTM2fDA7eD12KzU0OHwwO3I9dis1NjB8MDtzPXYrNTcyfDA7QT12KzU4NHwwO2NbRj4+Ml09MDtjW3QrMD4+Ml09MDtjW3QrND4+Ml09MDtjW3QrOD4+Ml09MDtjW3crMD4+Ml09MDtjW3crND4+Ml09MDtjW3crOD4+Ml09MDtjW3grMD4+Ml09MDtjW3grND4+Ml09MDtjW3grOD4+Ml09MDtjW3IrMD4+Ml09MDtjW3IrND4+Ml09MDtjW3IrOD4+Ml09MDtjW3MrMD4+Ml09MDtjW3MrND4+Ml09MDtjW3MrOD4+Ml09MDtkb3tpZihmKXtpZighKChjWzMyNjBdfDApPT0tMSkpe2NbUT4+Ml09MTMwNDA7Y1tRKzQ+PjJdPTIwODtjW1ErOD4+Ml09MDtjZygxMzA0MCxRKX1DPShjWzEzMDQ0Pj4yXXwwKSsgLTF8MDtJPWNbZys4Pj4yXXwwO2lmKChjW2crMTI+PjJdfDApLUk+PjI+Pj4wPkM+Pj4wPyhEPWNbSSsoQzw8Mik+PjJdfDAsKER8MCkhPTApOjApe21jW2NbKGNbRD4+Ml18MCkrNDQ+PjJdJjEyN10oTyxEKTtjW0Y+PjJdPWNbTz4+Ml07bWNbY1soY1tEPj4yXXwwKSszMj4+Ml0mMTI3XShLLEQpO2lmKChhW3I+PjBdJjEpPT0wKXtjW3IrND4+Ml09MDthW3I+PjBdPTB9ZWxzZXtjW2Nbcis4Pj4yXT4+Ml09MDtjW3IrND4+Ml09MH1vZyhyKTtjW3IrMD4+Ml09Y1tLKzA+PjJdO2Nbcis0Pj4yXT1jW0srND4+Ml07Y1tyKzg+PjJdPWNbSys4Pj4yXTtjW0srMD4+Ml09MDtjW0srND4+Ml09MDtjW0srOD4+Ml09MDttY1tjWyhjW0Q+PjJdfDApKzI4Pj4yXSYxMjddKEcsRCk7aWYoKGFbeD4+MF0mMSk9PTApe2NbeCs0Pj4yXT0wO2FbeD4+MF09MH1lbHNle2NbY1t4Kzg+PjJdPj4yXT0wO2NbeCs0Pj4yXT0wfW9nKHgpO2NbeCswPj4yXT1jW0crMD4+Ml07Y1t4KzQ+PjJdPWNbRys0Pj4yXTtjW3grOD4+Ml09Y1tHKzg+PjJdO2NbRyswPj4yXT0wO2NbRys0Pj4yXT0wO2NbRys4Pj4yXT0wO2c9b2NbY1soY1tEPj4yXXwwKSsxMj4+Ml0mMTI3XShEKXwwO0c9b2NbY1soY1tEPj4yXXwwKSsxNj4+Ml0mMTI3XShEKXwwO21jW2NbKGNbRD4+Ml18MCkrMjA+PjJdJjEyN10oSCxEKTtpZigoYVt0Pj4wXSYxKT09MCl7YVt0KzE+PjBdPTA7YVt0Pj4wXT0wfWVsc2V7YVtjW3QrOD4+Ml0+PjBdPTA7Y1t0KzQ+PjJdPTB9aWcodCk7Y1t0KzA+PjJdPWNbSCswPj4yXTtjW3QrND4+Ml09Y1tIKzQ+PjJdO2NbdCs4Pj4yXT1jW0grOD4+Ml07Y1tIKzA+PjJdPTA7Y1tIKzQ+PjJdPTA7Y1tIKzg+PjJdPTA7bWNbY1soY1tEPj4yXXwwKSsyND4+Ml0mMTI3XShFLEQpO2lmKChhW3c+PjBdJjEpPT0wKXtjW3crND4+Ml09MDthW3c+PjBdPTB9ZWxzZXtjW2Nbdys4Pj4yXT4+Ml09MDtjW3crND4+Ml09MH1vZyh3KTtjW3crMD4+Ml09Y1tFKzA+PjJdO2Nbdys0Pj4yXT1jW0UrND4+Ml07Y1t3Kzg+PjJdPWNbRSs4Pj4yXTtjW0UrMD4+Ml09MDtjW0UrND4+Ml09MDtjW0UrOD4+Ml09MDtmPW9jW2NbKGNbRD4+Ml18MCkrMzY+PjJdJjEyN10oRCl8MDticmVha30kPVhhKDQpfDA7Y1skPj4yXT0yMTMwNDt3YigkfDAsMjEzNzYsMTk2KX1lbHNle2lmKCEoKGNbMzI0NF18MCk9PS0xKSl7Y1tRPj4yXT0xMjk3NjtjW1ErND4+Ml09MjA4O2NbUSs4Pj4yXT0wO2NnKDEyOTc2LFEpfUQ9KGNbMTI5ODA+PjJdfDApKyAtMXwwO0U9Y1tnKzg+PjJdfDA7aWYoKGNbZysxMj4+Ml18MCktRT4+Mj4+PjA+RD4+PjA/KEM9Y1tFKyhEPDwyKT4+Ml18MCwoQ3wwKSE9MCk6MCl7bWNbY1soY1tDPj4yXXwwKSs0ND4+Ml0mMTI3XShOLEMpO2NbRj4+Ml09Y1tOPj4yXTttY1tjWyhjW0M+PjJdfDApKzMyPj4yXSYxMjddKE0sQyk7aWYoKGFbcj4+MF0mMSk9PTApe2Nbcis0Pj4yXT0wO2Fbcj4+MF09MH1lbHNle2NbY1tyKzg+PjJdPj4yXT0wO2Nbcis0Pj4yXT0wfW9nKHIpO2NbciswPj4yXT1jW00rMD4+Ml07Y1tyKzQ+PjJdPWNbTSs0Pj4yXTtjW3IrOD4+Ml09Y1tNKzg+PjJdO2NbTSswPj4yXT0wO2NbTSs0Pj4yXT0wO2NbTSs4Pj4yXT0wO21jW2NbKGNbQz4+Ml18MCkrMjg+PjJdJjEyN10oTCxDKTtpZigoYVt4Pj4wXSYxKT09MCl7Y1t4KzQ+PjJdPTA7YVt4Pj4wXT0wfWVsc2V7Y1tjW3grOD4+Ml0+PjJdPTA7Y1t4KzQ+PjJdPTB9b2coeCk7Y1t4KzA+PjJdPWNbTCswPj4yXTtjW3grND4+Ml09Y1tMKzQ+PjJdO2NbeCs4Pj4yXT1jW0wrOD4+Ml07Y1tMKzA+PjJdPTA7Y1tMKzQ+PjJdPTA7Y1tMKzg+PjJdPTA7Zz1vY1tjWyhjW0M+PjJdfDApKzEyPj4yXSYxMjddKEMpfDA7Rz1vY1tjWyhjW0M+PjJdfDApKzE2Pj4yXSYxMjddKEMpfDA7bWNbY1soY1tDPj4yXXwwKSsyMD4+Ml0mMTI3XShKLEMpO2lmKChhW3Q+PjBdJjEpPT0wKXthW3QrMT4+MF09MDthW3Q+PjBdPTB9ZWxzZXthW2NbdCs4Pj4yXT4+MF09MDtjW3QrND4+Ml09MH1pZyh0KTtjW3QrMD4+Ml09Y1tKKzA+PjJdO2NbdCs0Pj4yXT1jW0orND4+Ml07Y1t0Kzg+PjJdPWNbSis4Pj4yXTtjW0orMD4+Ml09MDtjW0orND4+Ml09MDtjW0orOD4+Ml09MDttY1tjWyhjW0M+PjJdfDApKzI0Pj4yXSYxMjddKEksQyk7aWYoKGFbdz4+MF0mMSk9PTApe2Nbdys0Pj4yXT0wO2Fbdz4+MF09MH1lbHNle2NbY1t3Kzg+PjJdPj4yXT0wO2Nbdys0Pj4yXT0wfW9nKHcpO2NbdyswPj4yXT1jW0krMD4+Ml07Y1t3KzQ+PjJdPWNbSSs0Pj4yXTtjW3crOD4+Ml09Y1tJKzg+PjJdO2NbSSswPj4yXT0wO2NbSSs0Pj4yXT0wO2NbSSs4Pj4yXT0wO2Y9b2NbY1soY1tDPj4yXXwwKSszNj4+Ml0mMTI3XShDKXwwO2JyZWFrfSQ9WGEoNCl8MDtjWyQ+PjJdPTIxMzA0O3diKCR8MCwyMTM3NiwxOTYpfX13aGlsZSgwKTtjW24+PjJdPWNbbT4+Ml07ST1yKzR8MDtEPXIrOHwwO0g9eCs0fDA7Qz14Kzh8MDtMPShoJjUxMnwwKSE9MDtKPXcrNHwwO2g9dys4fDA7TT1zKzR8MDtFPXMrOHwwO049RiszfDA7Sz1tKzR8MDtPPXQrNHwwO1M9UCs0MDB8MDtVPVA7VD1QO1E9MDtQPTA7Uj0yMTM7YTp3aGlsZSgxKXtWPWNbYj4+Ml18MDtkb3tpZigoVnwwKSE9MCl7Vz1jW1YrMTI+PjJdfDA7aWYoKFd8MCk9PShjW1YrMTY+PjJdfDApKXtWPW9jW2NbKGNbVj4+Ml18MCkrMzY+PjJdJjEyN10oVil8MH1lbHNle1Y9Y1tXPj4yXXwwfWlmKChWfDApPT0tMSl7Y1tiPj4yXT0wO1Y9MTticmVha31lbHNle1Y9KGNbYj4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7Vj0xfX13aGlsZSgwKTtpZigoZXwwKSE9MCl7Vz1jW2UrMTI+PjJdfDA7aWYoKFd8MCk9PShjW2UrMTY+PjJdfDApKXtXPW9jW2NbKGNbZT4+Ml18MCkrMzY+PjJdJjEyN10oZSl8MH1lbHNle1c9Y1tXPj4yXXwwfWlmKCEoKFd8MCk9PS0xKSl7aWYoIVYpe0I9Mzc4O2JyZWFrfX1lbHNle0I9NzV9fWVsc2V7Qj03NX1pZigoQnwwKT09NzUpe0I9MDtpZihWKXtlPTA7Qj0zNzg7YnJlYWt9ZWxzZXtlPTB9fWI6ZG97c3dpdGNoKGFbRitRPj4wXXwwKXtjYXNlIDE6e2lmKChRfDApPT0zKXtCPTM3ODticmVhayBhfUI9Y1tiPj4yXXwwO1Y9Y1tCKzEyPj4yXXwwO2lmKChWfDApPT0oY1tCKzE2Pj4yXXwwKSl7Qj1vY1tjWyhjW0I+PjJdfDApKzM2Pj4yXSYxMjddKEIpfDB9ZWxzZXtCPWNbVj4+Ml18MH1pZighKGhjW2NbKGNbbD4+Ml18MCkrMTI+PjJdJjYzXShsLDgxOTIsQil8MCkpe0I9OTc7YnJlYWsgYX1XPWNbYj4+Ml18MDtCPVcrMTJ8MDtWPWNbQj4+Ml18MDtpZigoVnwwKT09KGNbVysxNj4+Ml18MCkpe1Y9b2NbY1soY1tXPj4yXXwwKSs0MD4+Ml0mMTI3XShXKXwwfWVsc2V7Y1tCPj4yXT1WKzQ7Vj1jW1Y+PjJdfDB9Vz1hW3M+PjBdfDA7Qj0oVyYxKSE9MDtpZihCKXtYPShjW3M+PjJdJi0yKSsgLTF8MDtXPWNbTT4+Ml18MH1lbHNle1g9MTtXPShXJjI1NSk+Pj4xfWlmKChXfDApPT0oWHwwKSl7cGcocyxYLDEsWCxYLDAsMCk7aWYoKGFbcz4+MF0mMSk9PTApe0I9OTR9ZWxzZXtCPTk1fX1lbHNle2lmKEIpe0I9OTV9ZWxzZXtCPTk0fX1pZigoQnwwKT09OTQpe2Fbcz4+MF09KFc8PDEpKzI7WD1NO1k9VysxfDB9ZWxzZSBpZigoQnwwKT09OTUpe1g9Y1tFPj4yXXwwO1k9VysxfDA7Y1tNPj4yXT1ZfWNbWCsoVzw8Mik+PjJdPVY7Y1tYKyhZPDwyKT4+Ml09MDtCPTk4O2JyZWFrfTtjYXNlIDI6e2lmKCEoKFB8MCkhPTB8UT4+PjA8Mikpe2lmKChRfDApPT0yKXtWPShhW04+PjBdfDApIT0wfWVsc2V7Vj0wfWlmKCEoTHxWKSl7UD0wO2JyZWFrIGJ9fVk9YVt3Pj4wXXwwO1Y9KFkmMSk9PTA/SjpjW2g+PjJdfDA7Yzpkb3tpZigoUXwwKSE9MD8oZFtGKyhRKyAtMSk+PjBdfDApPDI6MCl7d2hpbGUoMSl7aWYoKFkmMSk9PTApe1g9SjtXPShZJjI1NSk+Pj4xfWVsc2V7WD1jW2g+PjJdfDA7Vz1jW0o+PjJdfDB9aWYoKFZ8MCk9PShYKyhXPDwyKXwwKSl7YnJlYWt9aWYoIShoY1tjWyhjW2w+PjJdfDApKzEyPj4yXSY2M10obCw4MTkyLGNbVj4+Ml18MCl8MCkpe0I9MjEyO2JyZWFrfVk9YVt3Pj4wXXwwO1Y9Vis0fDB9aWYoKEJ8MCk9PTIxMil7Qj0wO1k9YVt3Pj4wXXwwfVg9KFkmMSk9PTA/SjpjW2g+PjJdfDA7Vz1WLVg+PjI7Wj1hW3M+PjBdfDA7JD0oWiYxKT09MDtpZigkKXtfPShaJjI1NSk+Pj4xfWVsc2V7Xz1jW00+PjJdfDB9aWYoIShXPj4+MD5fPj4+MCkpe2lmKCQpe189KFomMjU1KT4+PjE7JD1NO1o9XztfPU0rKF8tVzw8Mil8MH1lbHNle2FhPWNbRT4+Ml18MDtfPWNbTT4+Ml18MDskPWFhO1o9XztfPWFhKyhfLVc8PDIpfDB9Vz0kKyhaPDwyKXwwO2lmKChffDApPT0oV3wwKSl7Vz1lO1g9ZX1lbHNle1o9WDt3aGlsZSgxKXtpZigoY1tfPj4yXXwwKSE9KGNbWj4+Ml18MCkpe1c9ZTtWPVg7WD1lO2JyZWFrIGN9Xz1fKzR8MDtpZigoX3wwKT09KFd8MCkpe1c9ZTtYPWU7YnJlYWsgY31aPVorNHwwfX19ZWxzZXtXPWU7Vj1YO1g9ZX19ZWxzZXtXPWU7WD1lfX13aGlsZSgwKTt3aGlsZSgxKXtpZigoWSYxKT09MCl7Wj1KO1k9KFkmMjU1KT4+PjF9ZWxzZXtaPWNbaD4+Ml18MDtZPWNbSj4+Ml18MH1pZigoVnwwKT09KForKFk8PDIpfDApKXticmVha31ZPWNbYj4+Ml18MDtkb3tpZigoWXwwKSE9MCl7Wj1jW1krMTI+PjJdfDA7aWYoKFp8MCk9PShjW1krMTY+PjJdfDApKXtZPW9jW2NbKGNbWT4+Ml18MCkrMzY+PjJdJjEyN10oWSl8MH1lbHNle1k9Y1taPj4yXXwwfWlmKChZfDApPT0tMSl7Y1tiPj4yXT0wO1k9MTticmVha31lbHNle1k9KGNbYj4+Ml18MCk9PTA7YnJlYWt9fWVsc2V7WT0xfX13aGlsZSgwKTtpZigoWHwwKSE9MCl7Wj1jW1grMTI+PjJdfDA7aWYoKFp8MCk9PShjW1grMTY+PjJdfDApKXtYPW9jW2NbKGNbWD4+Ml18MCkrMzY+PjJdJjEyN10oWCl8MH1lbHNle1g9Y1taPj4yXXwwfWlmKCEoKFh8MCk9PS0xKSl7aWYoWV4oV3wwKT09MCl7WT1XO1g9V31lbHNle2JyZWFrfX1lbHNle1c9MDtlPTA7Qj0yNDB9fWVsc2V7Qj0yNDB9aWYoKEJ8MCk9PTI0MCl7Qj0wO2lmKFkpe2JyZWFrfWVsc2V7WT1XO1g9MH19Wj1jW2I+PjJdfDA7Vz1jW1orMTI+PjJdfDA7aWYoKFd8MCk9PShjW1orMTY+PjJdfDApKXtXPW9jW2NbKGNbWj4+Ml18MCkrMzY+PjJdJjEyN10oWil8MH1lbHNle1c9Y1tXPj4yXXwwfWlmKChXfDApIT0oY1tWPj4yXXwwKSl7YnJlYWt9Xz1jW2I+PjJdfDA7Vz1fKzEyfDA7Wj1jW1c+PjJdfDA7aWYoKFp8MCk9PShjW18rMTY+PjJdfDApKXtvY1tjWyhjW18+PjJdfDApKzQwPj4yXSYxMjddKF8pfDB9ZWxzZXtjW1c+PjJdPVorNH1XPVk7WT1hW3c+PjBdfDA7Vj1WKzR8MH1pZihMKXtYPWFbdz4+MF18MDtpZigoWCYxKT09MCl7Vz1KO1g9KFgmMjU1KT4+PjF9ZWxzZXtXPWNbaD4+Ml18MDtYPWNbSj4+Ml18MH1pZigoVnwwKSE9KFcrKFg8PDIpfDApKXtCPTI1NTticmVhayBhfX1icmVha307Y2FzZSAwOntCPTk4O2JyZWFrfTtjYXNlIDM6e1Y9YVt4Pj4wXXwwO1g9KFYmMSk9PTA7aWYoWCl7Wj0oViYyNTUpPj4+MX1lbHNle1o9Y1tIPj4yXXwwfVc9YVtyPj4wXXwwO1k9KFcmMSk9PTA7aWYoWSl7Xz0oVyYyNTUpPj4+MX1lbHNle189Y1tJPj4yXXwwfWlmKChafDApIT0oMC1ffDApKXtpZihYKXtaPShWJjI1NSk+Pj4xfWVsc2V7Wj1jW0g+PjJdfDB9aWYoKFp8MCkhPTApe2lmKFkpe1k9KFcmMjU1KT4+PjF9ZWxzZXtZPWNbST4+Ml18MH1pZigoWXwwKSE9MCl7WD1jW2I+PjJdfDA7WT1jW1grMTI+PjJdfDA7Wj1jW1grMTY+PjJdfDA7aWYoKFl8MCk9PShafDApKXtXPW9jW2NbKGNbWD4+Ml18MCkrMzY+PjJdJjEyN10oWCl8MDtaPWNbYj4+Ml18MDtWPWFbeD4+MF18MDtYPVo7WT1jW1orMTI+PjJdfDA7Wj1jW1orMTY+PjJdfDB9ZWxzZXtXPWNbWT4+Ml18MH1fPVgrMTJ8MDtaPShZfDApPT0oWnwwKTtpZigoV3wwKT09KGNbKChWJjEpPT0wP0g6Y1tDPj4yXXwwKT4+Ml18MCkpe2lmKFope29jW2NbKGNbWD4+Ml18MCkrNDA+PjJdJjEyN10oWCl8MH1lbHNle2NbXz4+Ml09WSs0fVY9YVt4Pj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0g+PjJdfDB9UD1WPj4+MD4xP3g6UDticmVhayBifWlmKFope1Y9b2NbY1soY1tYPj4yXXwwKSszNj4+Ml0mMTI3XShYKXwwfWVsc2V7Vj1jW1k+PjJdfDB9aWYoKFZ8MCkhPShjWygoYVtyPj4wXSYxKT09MD9JOmNbRD4+Ml18MCk+PjJdfDApKXtCPTE5ODticmVhayBhfVY9Y1tiPj4yXXwwO1c9VisxMnwwO1g9Y1tXPj4yXXwwO2lmKChYfDApPT0oY1tWKzE2Pj4yXXwwKSl7b2NbY1soY1tWPj4yXXwwKSs0MD4+Ml0mMTI3XShWKXwwfWVsc2V7Y1tXPj4yXT1YKzR9YVtrPj4wXT0xO1Y9YVtyPj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0k+PjJdfDB9UD1WPj4+MD4xP3I6UDticmVhayBifX1pZihYKXtYPShWJjI1NSk+Pj4xfWVsc2V7WD1jW0g+PjJdfDB9WT1jW2I+PjJdfDA7Wj1jW1krMTI+PjJdfDA7Xz0oWnwwKT09KGNbWSsxNj4+Ml18MCk7aWYoKFh8MCk9PTApe2lmKF8pe1Y9b2NbY1soY1tZPj4yXXwwKSszNj4+Ml0mMTI3XShZKXwwO1c9YVtyPj4wXXwwfWVsc2V7Vj1jW1o+PjJdfDB9aWYoKFZ8MCkhPShjWygoVyYxKT09MD9JOmNbRD4+Ml18MCk+PjJdfDApKXticmVhayBifVg9Y1tiPj4yXXwwO1c9WCsxMnwwO1Y9Y1tXPj4yXXwwO2lmKChWfDApPT0oY1tYKzE2Pj4yXXwwKSl7b2NbY1soY1tYPj4yXXwwKSs0MD4+Ml0mMTI3XShYKXwwfWVsc2V7Y1tXPj4yXT1WKzR9YVtrPj4wXT0xO1Y9YVtyPj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0k+PjJdfDB9UD1WPj4+MD4xP3I6UDticmVhayBifWlmKF8pe1c9b2NbY1soY1tZPj4yXXwwKSszNj4+Ml0mMTI3XShZKXwwO1Y9YVt4Pj4wXXwwfWVsc2V7Vz1jW1o+PjJdfDB9aWYoKFd8MCkhPShjWygoViYxKT09MD9IOmNbQz4+Ml18MCk+PjJdfDApKXthW2s+PjBdPTE7YnJlYWsgYn1YPWNbYj4+Ml18MDtXPVgrMTJ8MDtWPWNbVz4+Ml18MDtpZigoVnwwKT09KGNbWCsxNj4+Ml18MCkpe29jW2NbKGNbWD4+Ml18MCkrNDA+PjJdJjEyN10oWCl8MH1lbHNle2NbVz4+Ml09Vis0fVY9YVt4Pj4wXXwwO2lmKChWJjEpPT0wKXtWPShWJjI1NSk+Pj4xfWVsc2V7Vj1jW0g+PjJdfDB9UD1WPj4+MD4xP3g6UH1icmVha307Y2FzZSA0OntWPTA7d2hpbGUoMSl7WD1jW2I+PjJdfDA7ZG97aWYoKFh8MCkhPTApe1c9Y1tYKzEyPj4yXXwwO2lmKChXfDApPT0oY1tYKzE2Pj4yXXwwKSl7Vz1vY1tjWyhjW1g+PjJdfDApKzM2Pj4yXSYxMjddKFgpfDB9ZWxzZXtXPWNbVz4+Ml18MH1pZigoV3wwKT09LTEpe2NbYj4+Ml09MDtXPTE7YnJlYWt9ZWxzZXtXPShjW2I+PjJdfDApPT0wO2JyZWFrfX1lbHNle1c9MX19d2hpbGUoMCk7aWYoKGV8MCkhPTApe1g9Y1tlKzEyPj4yXXwwO2lmKChYfDApPT0oY1tlKzE2Pj4yXXwwKSl7WD1vY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDB9ZWxzZXtYPWNbWD4+Ml18MH1pZighKChYfDApPT0tMSkpe2lmKCFXKXticmVha319ZWxzZXtCPTI2OH19ZWxzZXtCPTI2OH1pZigoQnwwKT09MjY4KXtCPTA7aWYoVyl7ZT0wO2JyZWFrfWVsc2V7ZT0wfX1YPWNbYj4+Ml18MDtXPWNbWCsxMj4+Ml18MDtpZigoV3wwKT09KGNbWCsxNj4+Ml18MCkpe1c9b2NbY1soY1tYPj4yXXwwKSszNj4+Ml0mMTI3XShYKXwwfWVsc2V7Vz1jW1c+PjJdfDB9aWYoaGNbY1soY1tsPj4yXXwwKSsxMj4+Ml0mNjNdKGwsMjA0OCxXKXwwKXtYPWNbbj4+Ml18MDtpZigoWHwwKT09KG98MCkpe1k9KGNbSz4+Ml18MCkhPTIxMztaPWNbbT4+Ml18MDtvPW8tWnwwO1g9bz4+PjA8MjE0NzQ4MzY0Nz9vPDwxOi0xO289bz4+MjtpZighWSl7Wj0wfVo9d24oWixYKXwwO2lmKChafDApPT0wKXtCPTI3OTticmVhayBhfWlmKCFZKXtZPWNbbT4+Ml18MDtjW20+PjJdPVo7aWYoKFl8MCkhPTApe2xjW2NbSz4+Ml0mMjU1XShZKTtaPWNbbT4+Ml18MH19ZWxzZXtjW20+PjJdPVp9Y1tLPj4yXT0yMTQ7YWE9Wisobzw8Mil8MDtjW24+PjJdPWFhO289KGNbbT4+Ml18MCkrKFg+Pj4yPDwyKXwwO1g9YWF9Y1tuPj4yXT1YKzQ7Y1tYPj4yXT1XO1Y9VisxfDB9ZWxzZXtYPWFbdD4+MF18MDtpZigoWCYxKT09MCl7WD0oWCYyNTUpPj4+MX1lbHNle1g9Y1tPPj4yXXwwfWlmKCEoKCgoWHwwKT09MHwoVnwwKT09MCleMSkmKFd8MCk9PShHfDApKSl7YnJlYWt9aWYoKFV8MCk9PShTfDApKXtVPVUtVHwwO1M9VT4+PjA8MjE0NzQ4MzY0Nz9VPDwxOi0xO2lmKChSfDApPT0yMTMpe1Q9MH1SPXduKFQsUyl8MDtpZigoUnwwKT09MCl7Qj0yOTY7YnJlYWsgYX1UPVI7Uz1SKyhTPj4+Mjw8Mil8MDtVPVIrKFU+PjI8PDIpfDA7Uj0yMTR9Y1tVPj4yXT1WO1U9VSs0fDA7Vj0wfVc9Y1tiPj4yXXwwO1g9VysxMnwwO1k9Y1tYPj4yXXwwO2lmKChZfDApPT0oY1tXKzE2Pj4yXXwwKSl7b2NbY1soY1tXPj4yXXwwKSs0MD4+Ml0mMTI3XShXKXwwO2NvbnRpbnVlfWVsc2V7Y1tYPj4yXT1ZKzQ7Y29udGludWV9fWlmKCEoKFR8MCk9PShVfDApfChWfDApPT0wKSl7aWYoKFV8MCk9PShTfDApKXtVPVUtVHwwO1M9VT4+PjA8MjE0NzQ4MzY0Nz9VPDwxOi0xO2lmKChSfDApPT0yMTMpe1Q9MH1SPXduKFQsUyl8MDtpZigoUnwwKT09MCl7Qj0zMDg7YnJlYWsgYX1UPVI7Uz1SKyhTPj4+Mjw8Mil8MDtVPVIrKFU+PjI8PDIpfDA7Uj0yMTR9Y1tVPj4yXT1WO1U9VSs0fDB9aWYoKGZ8MCk+MCl7Vz1jW2I+PjJdfDA7ZG97aWYoKFd8MCkhPTApe1Y9Y1tXKzEyPj4yXXwwO2lmKChWfDApPT0oY1tXKzE2Pj4yXXwwKSl7Vj1vY1tjWyhjW1c+PjJdfDApKzM2Pj4yXSYxMjddKFcpfDB9ZWxzZXtWPWNbVj4+Ml18MH1pZigoVnwwKT09LTEpe2NbYj4+Ml09MDtWPTE7YnJlYWt9ZWxzZXtWPShjW2I+PjJdfDApPT0wO2JyZWFrfX1lbHNle1Y9MX19d2hpbGUoMCk7aWYoKGV8MCkhPTApe1c9Y1tlKzEyPj4yXXwwO2lmKChXfDApPT0oY1tlKzE2Pj4yXXwwKSl7Vz1vY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDB9ZWxzZXtXPWNbVz4+Ml18MH1pZighKChXfDApPT0tMSkpe2lmKCFWKXtCPTMzMTticmVhayBhfX1lbHNle0I9MzI1fX1lbHNle0I9MzI1fWlmKChCfDApPT0zMjUpe0I9MDtpZihWKXtCPTMzMTticmVhayBhfWVsc2V7ZT0wfX1XPWNbYj4+Ml18MDtWPWNbVysxMj4+Ml18MDtpZigoVnwwKT09KGNbVysxNj4+Ml18MCkpe1Y9b2NbY1soY1tXPj4yXXwwKSszNj4+Ml0mMTI3XShXKXwwfWVsc2V7Vj1jW1Y+PjJdfDB9aWYoKFZ8MCkhPShnfDApKXtCPTMzMTticmVhayBhfVY9Y1tiPj4yXXwwO1c9VisxMnwwO1g9Y1tXPj4yXXwwO2lmKChYfDApPT0oY1tWKzE2Pj4yXXwwKSl7b2NbY1soY1tWPj4yXXwwKSs0MD4+Ml0mMTI3XShWKXwwO1g9ZTtXPWV9ZWxzZXtjW1c+PjJdPVgrNDtYPWU7Vz1lfXdoaWxlKDEpe1k9Y1tiPj4yXXwwO2Rve2lmKChZfDApIT0wKXtWPWNbWSsxMj4+Ml18MDtpZigoVnwwKT09KGNbWSsxNj4+Ml18MCkpe1Y9b2NbY1soY1tZPj4yXXwwKSszNj4+Ml0mMTI3XShZKXwwfWVsc2V7Vj1jW1Y+PjJdfDB9aWYoKFZ8MCk9PS0xKXtjW2I+PjJdPTA7WT0xO2JyZWFrfWVsc2V7WT0oY1tiPj4yXXwwKT09MDticmVha319ZWxzZXtZPTF9fXdoaWxlKDApO2lmKChXfDApIT0wKXtWPWNbVysxMj4+Ml18MDtpZigoVnwwKT09KGNbVysxNj4+Ml18MCkpe1Y9b2NbY1soY1tXPj4yXXwwKSszNj4+Ml0mMTI3XShXKXwwfWVsc2V7Vj1jW1Y+PjJdfDB9aWYoISgoVnwwKT09LTEpKXtpZihZXihYfDApPT0wKXtWPVg7Vz1YfWVsc2V7Qj0zNTQ7YnJlYWsgYX19ZWxzZXtWPTA7ZT0wO0I9MzQ3fX1lbHNle1Y9WDtCPTM0N31pZigoQnwwKT09MzQ3KXtCPTA7aWYoWSl7Qj0zNTQ7YnJlYWsgYX1lbHNle1c9MH19WT1jW2I+PjJdfDA7WD1jW1krMTI+PjJdfDA7aWYoKFh8MCk9PShjW1krMTY+PjJdfDApKXtYPW9jW2NbKGNbWT4+Ml18MCkrMzY+PjJdJjEyN10oWSl8MH1lbHNle1g9Y1tYPj4yXXwwfWlmKCEoaGNbY1soY1tsPj4yXXwwKSsxMj4+Ml0mNjNdKGwsMjA0OCxYKXwwKSl7Qj0zNTQ7YnJlYWsgYX1YPWNbbj4+Ml18MDtpZigoWHwwKT09KG98MCkpe1k9KGNbSz4+Ml18MCkhPTIxMztaPWNbbT4+Ml18MDtYPW8tWnwwO289WD4+PjA8MjE0NzQ4MzY0Nz9YPDwxOi0xO1g9WD4+MjtpZighWSl7Wj0wfVo9d24oWixvKXwwO2lmKChafDApPT0wKXtCPTM1OTticmVhayBhfWRve2lmKFkpe2NbbT4+Ml09Wn1lbHNle1k9Y1ttPj4yXXwwO2NbbT4+Ml09WjtpZigoWXwwKT09MCl7YnJlYWt9bGNbY1tLPj4yXSYyNTVdKFkpO1o9Y1ttPj4yXXwwfX13aGlsZSgwKTtjW0s+PjJdPTIxNDtYPVorKFg8PDIpfDA7Y1tuPj4yXT1YO289KGNbbT4+Ml18MCkrKG8+Pj4yPDwyKXwwfVk9Y1tiPj4yXXwwO1o9Y1tZKzEyPj4yXXwwO2lmKChafDApPT0oY1tZKzE2Pj4yXXwwKSl7WT1vY1tjWyhjW1k+PjJdfDApKzM2Pj4yXSYxMjddKFkpfDA7WD1jW24+PjJdfDB9ZWxzZXtZPWNbWj4+Ml18MH1jW24+PjJdPVgrNDtjW1g+PjJdPVk7Zj1mKyAtMXwwO1g9Y1tiPj4yXXwwO1k9WCsxMnwwO1o9Y1tZPj4yXXwwO2lmKChafDApPT0oY1tYKzE2Pj4yXXwwKSl7b2NbY1soY1tYPj4yXXwwKSs0MD4+Ml0mMTI3XShYKXwwfWVsc2V7Y1tZPj4yXT1aKzR9aWYoKGZ8MCk+MCl7WD1WfWVsc2V7YnJlYWt9fX1pZigoY1tuPj4yXXwwKT09KGNbbT4+Ml18MCkpe0I9Mzc2O2JyZWFrIGF9YnJlYWt9O2RlZmF1bHQ6e319fXdoaWxlKDApO2Q6ZG97aWYoKEJ8MCk9PTk4KXtCPTA7aWYoKFF8MCk9PTMpe0I9Mzc4O2JyZWFrIGF9ZWxzZXtYPWU7Vj1lfXdoaWxlKDEpe1c9Y1tiPj4yXXwwO2Rve2lmKChXfDApIT0wKXtZPWNbVysxMj4+Ml18MDtpZigoWXwwKT09KGNbVysxNj4+Ml18MCkpe1c9b2NbY1soY1tXPj4yXXwwKSszNj4+Ml0mMTI3XShXKXwwfWVsc2V7Vz1jW1k+PjJdfDB9aWYoKFd8MCk9PS0xKXtjW2I+PjJdPTA7WT0xO2JyZWFrfWVsc2V7WT0oY1tiPj4yXXwwKT09MDticmVha319ZWxzZXtZPTF9fXdoaWxlKDApO2lmKChWfDApIT0wKXtXPWNbVisxMj4+Ml18MDtpZigoV3wwKT09KGNbVisxNj4+Ml18MCkpe1Y9b2NbY1soY1tWPj4yXXwwKSszNj4+Ml0mMTI3XShWKXwwfWVsc2V7Vj1jW1c+PjJdfDB9aWYoISgoVnwwKT09LTEpKXtpZihZXihYfDApPT0wKXtXPVg7Vj1YfWVsc2V7YnJlYWsgZH19ZWxzZXtXPTA7ZT0wO0I9MTExfX1lbHNle1c9WDtCPTExMX1pZigoQnwwKT09MTExKXtCPTA7aWYoWSl7YnJlYWsgZH1lbHNle1Y9MH19WT1jW2I+PjJdfDA7WD1jW1krMTI+PjJdfDA7aWYoKFh8MCk9PShjW1krMTY+PjJdfDApKXtYPW9jW2NbKGNbWT4+Ml18MCkrMzY+PjJdJjEyN10oWSl8MH1lbHNle1g9Y1tYPj4yXXwwfWlmKCEoaGNbY1soY1tsPj4yXXwwKSsxMj4+Ml0mNjNdKGwsODE5MixYKXwwKSl7YnJlYWsgZH1CPWNbYj4+Ml18MDtYPUIrMTJ8MDtZPWNbWD4+Ml18MDtpZigoWXwwKT09KGNbQisxNj4+Ml18MCkpe1g9b2NbY1soY1tCPj4yXXwwKSs0MD4+Ml0mMTI3XShCKXwwfWVsc2V7Y1tYPj4yXT1ZKzQ7WD1jW1k+PjJdfDB9WT1hW3M+PjBdfDA7Wj0oWSYxKSE9MDtpZihaKXtCPShjW3M+PjJdJi0yKSsgLTF8MDtZPWNbTT4+Ml18MH1lbHNle0I9MTtZPShZJjI1NSk+Pj4xfWlmKChZfDApPT0oQnwwKSl7cGcocyxCLDEsQixCLDAsMCk7aWYoKGFbcz4+MF0mMSk9PTApe0I9MTI4fWVsc2V7Qj0xMjl9fWVsc2V7aWYoWil7Qj0xMjl9ZWxzZXtCPTEyOH19aWYoKEJ8MCk9PTEyOCl7Qj0wO2Fbcz4+MF09KFk8PDEpKzI7Wj1NO189WSsxfDB9ZWxzZSBpZigoQnwwKT09MTI5KXtCPTA7Wj1jW0U+PjJdfDA7Xz1ZKzF8MDtjW00+PjJdPV99Y1taKyhZPDwyKT4+Ml09WDtjW1orKF88PDIpPj4yXT0wO1g9V319fXdoaWxlKDApO1E9USsxfDA7aWYoIShRPj4+MDw0KSl7Qj0zNzg7YnJlYWt9fWU6c3dpdGNoKEJ8MCl7Y2FzZSA5Nzp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDE5ODp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDI1NTp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDI3OTp7YWE9WGEoNCl8MDtjW2FhPj4yXT0yMjY4MDt3YihhYXwwLDIyNzI4LDIwNil9O2Nhc2UgMjk2OnthYT1YYSg0KXwwO2NbYWE+PjJdPTIyNjgwO3diKGFhfDAsMjI3MjgsMjA2KX07Y2FzZSAzMDg6e2FhPVhhKDQpfDA7Y1thYT4+Ml09MjI2ODA7d2IoYWF8MCwyMjcyOCwyMDYpfTtjYXNlIDMzMTp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDM1NDp7Y1tqPj4yXT1jW2o+PjJdfDQ7Yj0wO2JyZWFrfTtjYXNlIDM1OTp7YWE9WGEoNCl8MDtjW2FhPj4yXT0yMjY4MDt3YihhYXwwLDIyNzI4LDIwNil9O2Nhc2UgMzc2OntjW2o+PjJdPWNbaj4+Ml18NDtiPTA7YnJlYWt9O2Nhc2UgMzc4OntmOmRve2lmKChQfDApIT0wKXtsPVArNHwwO0Y9UCs4fDA7az0xO3doaWxlKDEpe209YVtQPj4wXXwwO2lmKChtJjEpPT0wKXttPShtJjI1NSk+Pj4xfWVsc2V7bT1jW2w+PjJdfDB9aWYoIShrPj4+MDxtPj4+MCkpe2JyZWFrIGZ9bj1jW2I+PjJdfDA7ZG97aWYoKG58MCkhPTApe209Y1tuKzEyPj4yXXwwO2lmKChtfDApPT0oY1tuKzE2Pj4yXXwwKSl7bT1vY1tjWyhjW24+PjJdfDApKzM2Pj4yXSYxMjddKG4pfDB9ZWxzZXttPWNbbT4+Ml18MH1pZigobXwwKT09LTEpe2NbYj4+Ml09MDttPTE7YnJlYWt9ZWxzZXttPShjW2I+PjJdfDApPT0wO2JyZWFrfX1lbHNle209MX19d2hpbGUoMCk7aWYoKGV8MCkhPTApe249Y1tlKzEyPj4yXXwwO2lmKChufDApPT0oY1tlKzE2Pj4yXXwwKSl7bj1vY1tjWyhjW2U+PjJdfDApKzM2Pj4yXSYxMjddKGUpfDB9ZWxzZXtuPWNbbj4+Ml18MH1pZighKChufDApPT0tMSkpe2lmKCFtKXticmVha319ZWxzZXtCPTM5Nn19ZWxzZXtCPTM5Nn1pZigoQnwwKT09Mzk2KXtCPTA7aWYobSl7YnJlYWt9ZWxzZXtlPTB9fW09Y1tiPj4yXXwwO249Y1ttKzEyPj4yXXwwO2lmKChufDApPT0oY1ttKzE2Pj4yXXwwKSl7bT1vY1tjWyhjW20+PjJdfDApKzM2Pj4yXSYxMjddKG0pfDB9ZWxzZXttPWNbbj4+Ml18MH1pZigoYVtQPj4wXSYxKT09MCl7bj1sfWVsc2V7bj1jW0Y+PjJdfDB9aWYoKG18MCkhPShjW24rKGs8PDIpPj4yXXwwKSl7YnJlYWt9az1rKzF8MDtnPWNbYj4+Ml18MDtuPWcrMTJ8MDttPWNbbj4+Ml18MDtpZigobXwwKT09KGNbZysxNj4+Ml18MCkpe29jW2NbKGNbZz4+Ml18MCkrNDA+PjJdJjEyN10oZyl8MDtjb250aW51ZX1lbHNle2Nbbj4+Ml09bSs0O2NvbnRpbnVlfX1jW2o+PjJdPWNbaj4+Ml18NDtiPTA7YnJlYWsgZX19d2hpbGUoMCk7aWYoKFR8MCkhPShVfDApKXtjW0E+PjJdPTA7cWsodCxULFUsQSk7aWYoKGNbQT4+Ml18MCk9PTApe2I9MX1lbHNle2Nbaj4+Ml09Y1tqPj4yXXw0O2I9MH19ZWxzZXtiPTE7VD1VfWJyZWFrfX1pZighKChhW3M+PjBdJjEpPT0wKT8oej1jW0U+PjJdfDAsKHp8MCkhPTApOjApe3ZuKHopfWlmKCEoKGFbcj4+MF0mMSk9PTApPyh5PWNbRD4+Ml18MCwoeXwwKSE9MCk6MCl7dm4oeSl9aWYoISgoYVt4Pj4wXSYxKT09MCk/KHU9Y1tDPj4yXXwwLCh1fDApIT0wKTowKXt2bih1KX1pZighKChhW3c+PjBdJjEpPT0wKT8ocT1jW2g+PjJdfDAsKHF8MCkhPTApOjApe3ZuKHEpfWlmKCEoKGFbdD4+MF0mMSk9PTApPyhwPWNbdCs4Pj4yXXwwLChwfDApIT0wKTowKXt2bihwKX1pZigoVHwwKT09MCl7aT12O3JldHVybiBifDB9bGNbUiYyNTVdKFQpO2k9djtyZXR1cm4gYnwwfWZ1bmN0aW9uIHZrKGIsZCxlLGYsZyxoLGosayl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7dmFyIGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTA7bT1pO2k9aSs0MzJ8MDtwPW07cz1tKzI0fDA7ZD1tKzE2fDA7cT1tKzEyfDA7dD1tKzQyNHwwO2NbZD4+Ml09cztsPWQrNHwwO2NbbD4+Ml09MjEzO3M9cys0MDB8MDtuPWNbaCsyOD4+Ml18MDt2PW4rNHwwO2Nbdj4+Ml09KGNbdj4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbcD4+Ml09MTM0NDg7Y1twKzQ+PjJdPTIwODtjW3ArOD4+Ml09MDtjZygxMzQ0OCxwKX1wPShjWzEzNDUyPj4yXXwwKSsgLTF8MDt1PWNbbis4Pj4yXXwwO2lmKChjW24rMTI+PjJdfDApLXU+PjI+Pj4wPnA+Pj4wPyhyPWNbdSsocDw8Mik+PjJdfDAsKHJ8MCkhPTApOjApe2FbdD4+MF09MDtwPWNbZj4+Ml18MDtkb3tpZih1ayhlLHAsZyxuLGNbaCs0Pj4yXXwwLGosdCxyLGQscSxzKXwwKXtpZigoYVtrPj4wXSYxKT09MCl7Y1trKzQ+PjJdPTA7YVtrPj4wXT0wfWVsc2V7Y1tjW2srOD4+Ml0+PjJdPTA7Y1trKzQ+PjJdPTB9aWYoKGFbdD4+MF18MCkhPTApe2c9eGNbY1soY1tyPj4yXXwwKSs0ND4+Ml0mNjNdKHIsNDUpfDA7aD1hW2s+PjBdfDA7bz0oaCYxKSE9MDtpZihvKXtzPShjW2s+PjJdJi0yKSsgLTF8MDtoPWNbays0Pj4yXXwwfWVsc2V7cz0xO2g9KGgmMjU1KT4+PjF9aWYoKGh8MCk9PShzfDApKXtwZyhrLHMsMSxzLHMsMCwwKTtpZigoYVtrPj4wXSYxKT09MCl7bz0yMX1lbHNle289MjJ9fWVsc2V7aWYobyl7bz0yMn1lbHNle289MjF9fWlmKChvfDApPT0yMSl7YVtrPj4wXT0oaDw8MSkrMjt0PWsrNHwwO3M9aCsxfDB9ZWxzZSBpZigob3wwKT09MjIpe3Q9Y1trKzg+PjJdfDA7cz1oKzF8MDtjW2srND4+Ml09c31jW3QrKGg8PDIpPj4yXT1nO2NbdCsoczw8Mik+PjJdPTB9cj14Y1tjWyhjW3I+PjJdfDApKzQ0Pj4yXSY2M10ociw0OCl8MDtzPWNbZD4+Ml18MDtxPWNbcT4+Ml18MDtoPXErIC00fDA7YTpkb3tpZihzPj4+MDxoPj4+MCl7d2hpbGUoMSl7Zz1zKzR8MDtpZigoY1tzPj4yXXwwKSE9KHJ8MCkpe2JyZWFrIGF9aWYoZz4+PjA8aD4+PjApe3M9Z31lbHNle3M9ZzticmVha319fX13aGlsZSgwKTt0PXM7cj1hW2s+PjBdfDA7aWYoKHImMSk9PTApe3Y9cjt1PTE7Zz0ociYyNTUpPj4+MX1lbHNle3U9Y1trPj4yXXwwO3Y9dSYyNTU7dT0odSYtMikrIC0xfDA7Zz1jW2srND4+Ml18MH1yPXEtdD4+MjtpZigocnwwKSE9MCl7aWYoKHUtZ3wwKT4+PjA8cj4+PjApe3BnKGssdSxnK3ItdXwwLGcsZywwLDApO3Y9YVtrPj4wXXwwfWlmKCh2JjEpPT0wKXt1PWsrNHwwfWVsc2V7dT1jW2srOD4+Ml18MH12PXUrKGc8PDIpfDA7aWYoKHN8MCkhPShxfDApKXtoPWcrKChoKygwLXQpfDApPj4+MikrMXwwO3doaWxlKDEpe2Nbdj4+Ml09Y1tzPj4yXTtzPXMrNHwwO2lmKChzfDApPT0ocXwwKSl7YnJlYWt9dj12KzR8MH12PXUrKGg8PDIpfDB9Y1t2Pj4yXT0wO3E9ZytyfDA7aWYoKGFbaz4+MF0mMSk9PTApe2Fbaz4+MF09cTw8MTticmVha31lbHNle2Nbays0Pj4yXT1xO2JyZWFrfX19fXdoaWxlKDApO2s9Y1tlPj4yXXwwO2lmKChrfDApIT0wKXtxPWNbaysxMj4+Ml18MDtpZigocXwwKT09KGNbaysxNj4+Ml18MCkpe3E9b2NbY1soY1trPj4yXXwwKSszNj4+Ml0mMTI3XShrKXwwfWVsc2V7cT1jW3E+PjJdfDB9aWYoKHF8MCk9PS0xKXtjW2U+PjJdPTA7az0wO2U9MX1lbHNle2U9MH19ZWxzZXtrPTA7ZT0xfWRve2lmKChwfDApIT0wKXtxPWNbcCsxMj4+Ml18MDtpZigocXwwKT09KGNbcCsxNj4+Ml18MCkpe3A9b2NbY1soY1twPj4yXXwwKSszNj4+Ml0mMTI3XShwKXwwfWVsc2V7cD1jW3E+PjJdfDB9aWYoISgocHwwKT09LTEpKXtpZihlKXticmVha31lbHNle289NjA7YnJlYWt9fWVsc2V7Y1tmPj4yXT0wO289NTg7YnJlYWt9fWVsc2V7bz01OH19d2hpbGUoMCk7aWYoKG98MCk9PTU4P2U6MCl7bz02MH1pZigob3wwKT09NjApe2Nbaj4+Ml09Y1tqPj4yXXwyfWNbYj4+Ml09azt1PW4rNHwwO3Y9Y1t1Pj4yXXwwO2NbdT4+Ml09disgLTE7aWYoKHZ8MCk9PTApe2xjW2NbKGNbbj4+Ml18MCkrOD4+Ml0mMjU1XShuKX1qPWNbZD4+Ml18MDtjW2Q+PjJdPTA7aWYoKGp8MCk9PTApe2k9bTtyZXR1cm59bGNbY1tsPj4yXSYyNTVdKGopO2k9bTtyZXR1cm59dj1YYSg0KXwwO2Nbdj4+Ml09MjEzMDQ7d2IodnwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gd2soYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24geGsoYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIHlrKGIsZCxlLGYsZyxqLGwpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2o9anwwO2w9K2w7dmFyIG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MDtxPWk7aT1pKzM2OHwwO0E9cTtDPXErMTU2fDA7RT1xKzEzMnwwO0I9cSsyNTZ8MDt0PXErMTQ4fDA7cz1xKzM1NnwwO3I9cSszNTd8MDt4PXErMTM2fDA7ZD1xKzEwNHwwO3c9cSsxMTZ8MDtGPXErMTAwfDA7dj1xKzEyOHwwO3U9cSsxNTJ8MDtjW0U+PjJdPUM7aFtrPj4zXT1sO2NbQT4+Ml09Y1trPj4yXTtjW0ErND4+Ml09Y1trKzQ+PjJdO0M9bGIoQ3wwLDEwMCwxMzIyNCxBfDApfDA7aWYoQz4+PjA+OTkpe2lmKChhWzEzMzY4XXwwKT09MD8oUWEoMTMzNjgpfDApIT0wOjApe2NbMzM0MF09a2IoMjE0NzQ4MzY0NywxMzM3NiwwKXwwOyRhKDEzMzY4KX1DPWNbMzM0MF18MDtoW2s+PjNdPWw7Y1tBPj4yXT1jW2s+PjJdO2NbQSs0Pj4yXT1jW2srND4+Ml07Qz1DaShFLEMsMTMyMjQsQSl8MDt6PWNbRT4+Ml18MDtpZigoenwwKT09MCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9Qj11bihDKXwwO2lmKChCfDApPT0wKXtIPVhhKDQpfDA7Y1tIPj4yXT0yMjY4MDt3YihIfDAsMjI3MjgsMjA2KX1lbHNle3k9Qn19ZWxzZXt5PTA7ej0wfUQ9Y1tnKzI4Pj4yXXwwO0g9RCs0fDA7Y1tIPj4yXT0oY1tIPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1tBPj4yXT0xMzQ1NjtjW0ErND4+Ml09MjA4O2NbQSs4Pj4yXT0wO2NnKDEzNDU2LEEpfUc9KGNbMTM0NjA+PjJdfDApKyAtMXwwO0g9Y1tEKzg+PjJdfDA7aWYoKGNbRCsxMj4+Ml18MCktSD4+Mj4+PjA+Rz4+PjA/KHA9Y1tIKyhHPDwyKT4+Ml18MCwocHwwKSE9MCk6MCl7SD1jW0U+PjJdfDA7dWNbY1soY1twPj4yXXwwKSszMj4+Ml0mMzFdKHAsSCxIK0N8MCxCKXwwO2lmKChDfDApPT0wKXtFPTB9ZWxzZXtFPShhW2NbRT4+Ml0+PjBdfDApPT00NX1jW3Q+PjJdPTA7Y1t4KzA+PjJdPTA7Y1t4KzQ+PjJdPTA7Y1t4Kzg+PjJdPTA7Y1tkKzA+PjJdPTA7Y1tkKzQ+PjJdPTA7Y1tkKzg+PjJdPTA7Y1t3KzA+PjJdPTA7Y1t3KzQ+PjJdPTA7Y1t3Kzg+PjJdPTA7emsoZixFLEQsdCxzLHIseCxkLHcsRik7Zj1jW0Y+PjJdfDA7aWYoKEN8MCk+KGZ8MCkpe0Y9YVt3Pj4wXXwwO2lmKChGJjEpPT0wKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW3crND4+Ml18MH1HPWFbZD4+MF18MDtpZigoRyYxKT09MCl7Rz0oRyYyNTUpPj4+MX1lbHNle0c9Y1tkKzQ+PjJdfDB9Rj1GKyhDLWY8PDF8MSkrR3wwfWVsc2V7Rj1hW3c+PjBdfDA7aWYoKEYmMSk9PTApe0Y9KEYmMjU1KT4+PjF9ZWxzZXtGPWNbdys0Pj4yXXwwfUc9YVtkPj4wXXwwO2lmKChHJjEpPT0wKXtHPShHJjI1NSk+Pj4xfWVsc2V7Rz1jW2QrND4+Ml18MH1GPUYrMitHfDB9Rj1GK2Z8MDtpZihGPj4+MD4xMDApe0E9dW4oRil8MDtpZigoQXwwKT09MCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9ZWxzZXtGPUF9fWVsc2V7Rj0wfUFrKEEsdix1LGNbZys0Pj4yXXwwLEIsQitDfDAscCxFLHQsYVtzPj4wXXwwLGFbcj4+MF18MCx4LGQsdyxmKTtXYyhiLGNbZT4+Ml18MCxBLGNbdj4+Ml18MCxjW3U+PjJdfDAsZyxqKTtpZigoRnwwKSE9MCl7dm4oRil9aWYoISgoYVt3Pj4wXSYxKT09MCk/KG49Y1t3Kzg+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKCEoKGFbZD4+MF0mMSk9PTApPyhvPWNbZCs4Pj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhW3g+PjBdJjEpPT0wKT8obT1jW3grOD4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9Rz1EKzR8MDtIPWNbRz4+Ml18MDtjW0c+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW0Q+PjJdfDApKzg+PjJdJjI1NV0oRCl9aWYoKHl8MCkhPTApe3ZuKHkpfWlmKCh6fDApPT0wKXtpPXE7cmV0dXJufXZuKHopO2k9cTtyZXR1cm59SD1YYSg0KXwwO2NbSD4+Ml09MjEzMDQ7d2IoSHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gemsoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTA7bj1pO2k9aSsxMjh8MDtBPW47eD1uKzEyfDA7bz1uKzQwfDA7dj1uKzUyfDA7dz1uKzU2fDA7dT1uKzE2fDA7ej1uKzI4fDA7cj1uKzY4fDA7cT1uKzcyfDA7dD1uKzg0fDA7cz1uKzg4fDA7cD1uKzEwMHwwO3k9bisxMTJ8MDtpZihiKXtpZighKChjWzMyMjhdfDApPT0tMSkpe2NbQT4+Ml09MTI5MTI7Y1tBKzQ+PjJdPTIwODtjW0ErOD4+Ml09MDtjZygxMjkxMixBKX1xPShjWzEyOTE2Pj4yXXwwKSsgLTF8MDtwPWNbZSs4Pj4yXXwwO2lmKCEoKGNbZSsxMj4+Ml18MCktcD4+Mj4+PjA+cT4+PjApKXtiPVhhKDQpfDA7Y1tiPj4yXT0yMTMwNDt3YihifDAsMjEzNzYsMTk2KX1wPWNbcCsocTw8Mik+PjJdfDA7aWYoKHB8MCk9PTApe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfXE9Y1twPj4yXXwwO2lmKGQpe21jW2NbcSs0ND4+Ml0mMTI3XSh4LHApO2I9Y1t4Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbcD4+Ml18MCkrMzI+PjJdJjEyN10obyxwKTtpZigoYVtsPj4wXSYxKT09MCl7YVtsKzE+PjBdPTA7YVtsPj4wXT0wfWVsc2V7YVtjW2wrOD4+Ml0+PjBdPTA7Y1tsKzQ+PjJdPTB9aWcobCk7Y1tsKzA+PjJdPWNbbyswPj4yXTtjW2wrND4+Ml09Y1tvKzQ+PjJdO2NbbCs4Pj4yXT1jW28rOD4+Ml07Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTB9ZWxzZXttY1tjW3ErNDA+PjJdJjEyN10odixwKTtiPWNbdj4+Ml18MDthW2Y+PjBdPWI7YVtmKzE+PjBdPWI+Pjg7YVtmKzI+PjBdPWI+PjE2O2FbZiszPj4wXT1iPj4yNDttY1tjWyhjW3A+PjJdfDApKzI4Pj4yXSYxMjddKHcscCk7aWYoKGFbbD4+MF0mMSk9PTApe2FbbCsxPj4wXT0wO2FbbD4+MF09MH1lbHNle2FbY1tsKzg+PjJdPj4wXT0wO2NbbCs0Pj4yXT0wfWlnKGwpO2NbbCswPj4yXT1jW3crMD4+Ml07Y1tsKzQ+PjJdPWNbdys0Pj4yXTtjW2wrOD4+Ml09Y1t3Kzg+PjJdO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wfWFbZz4+MF09b2NbY1soY1twPj4yXXwwKSsxMj4+Ml0mMTI3XShwKXwwO2FbaD4+MF09b2NbY1soY1twPj4yXXwwKSsxNj4+Ml0mMTI3XShwKXwwO21jW2NbKGNbcD4+Ml18MCkrMjA+PjJdJjEyN10odSxwKTtpZigoYVtqPj4wXSYxKT09MCl7YVtqKzE+PjBdPTA7YVtqPj4wXT0wfWVsc2V7YVtjW2orOD4+Ml0+PjBdPTA7Y1tqKzQ+PjJdPTB9aWcoaik7Y1tqKzA+PjJdPWNbdSswPj4yXTtjW2orND4+Ml09Y1t1KzQ+PjJdO2Nbais4Pj4yXT1jW3UrOD4+Ml07Y1t1KzA+PjJdPTA7Y1t1KzQ+PjJdPTA7Y1t1Kzg+PjJdPTA7bWNbY1soY1twPj4yXXwwKSsyND4+Ml0mMTI3XSh6LHApO2lmKChhW2s+PjBdJjEpPT0wKXthW2srMT4+MF09MDthW2s+PjBdPTB9ZWxzZXthW2Nbays4Pj4yXT4+MF09MDtjW2srND4+Ml09MH1pZyhrKTtjW2srMD4+Ml09Y1t6KzA+PjJdO2Nbays0Pj4yXT1jW3orND4+Ml07Y1trKzg+PjJdPWNbeis4Pj4yXTtjW3orMD4+Ml09MDtjW3orND4+Ml09MDtjW3orOD4+Ml09MDtiPW9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MDtjW20+PjJdPWI7aT1uO3JldHVybn1lbHNle2lmKCEoKGNbMzIxMl18MCk9PS0xKSl7Y1tBPj4yXT0xMjg0ODtjW0ErND4+Ml09MjA4O2NbQSs4Pj4yXT0wO2NnKDEyODQ4LEEpfXU9KGNbMTI4NTI+PjJdfDApKyAtMXwwO289Y1tlKzg+PjJdfDA7aWYoISgoY1tlKzEyPj4yXXwwKS1vPj4yPj4+MD51Pj4+MCkpe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfW89Y1tvKyh1PDwyKT4+Ml18MDtpZigob3wwKT09MCl7Yj1YYSg0KXwwO2NbYj4+Ml09MjEzMDQ7d2IoYnwwLDIxMzc2LDE5Nil9ZT1jW28+PjJdfDA7aWYoZCl7bWNbY1tlKzQ0Pj4yXSYxMjddKHIsbyk7Yj1jW3I+PjJdfDA7YVtmPj4wXT1iO2FbZisxPj4wXT1iPj44O2FbZisyPj4wXT1iPj4xNjthW2YrMz4+MF09Yj4+MjQ7bWNbY1soY1tvPj4yXXwwKSszMj4+Ml0mMTI3XShxLG8pO2lmKChhW2w+PjBdJjEpPT0wKXthW2wrMT4+MF09MDthW2w+PjBdPTB9ZWxzZXthW2NbbCs4Pj4yXT4+MF09MDtjW2wrND4+Ml09MH1pZyhsKTtjW2wrMD4+Ml09Y1txKzA+PjJdO2NbbCs0Pj4yXT1jW3ErND4+Ml07Y1tsKzg+PjJdPWNbcSs4Pj4yXTtjW3ErMD4+Ml09MDtjW3ErND4+Ml09MDtjW3ErOD4+Ml09MH1lbHNle21jW2NbZSs0MD4+Ml0mMTI3XSh0LG8pO2I9Y1t0Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbbz4+Ml18MCkrMjg+PjJdJjEyN10ocyxvKTtpZigoYVtsPj4wXSYxKT09MCl7YVtsKzE+PjBdPTA7YVtsPj4wXT0wfWVsc2V7YVtjW2wrOD4+Ml0+PjBdPTA7Y1tsKzQ+PjJdPTB9aWcobCk7Y1tsKzA+PjJdPWNbcyswPj4yXTtjW2wrND4+Ml09Y1tzKzQ+PjJdO2NbbCs4Pj4yXT1jW3MrOD4+Ml07Y1tzKzA+PjJdPTA7Y1tzKzQ+PjJdPTA7Y1tzKzg+PjJdPTB9YVtnPj4wXT1vY1tjWyhjW28+PjJdfDApKzEyPj4yXSYxMjddKG8pfDA7YVtoPj4wXT1vY1tjWyhjW28+PjJdfDApKzE2Pj4yXSYxMjddKG8pfDA7bWNbY1soY1tvPj4yXXwwKSsyMD4+Ml0mMTI3XShwLG8pO2lmKChhW2o+PjBdJjEpPT0wKXthW2orMT4+MF09MDthW2o+PjBdPTB9ZWxzZXthW2Nbais4Pj4yXT4+MF09MDtjW2orND4+Ml09MH1pZyhqKTtjW2orMD4+Ml09Y1twKzA+PjJdO2Nbais0Pj4yXT1jW3ArND4+Ml07Y1tqKzg+PjJdPWNbcCs4Pj4yXTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDttY1tjWyhjW28+PjJdfDApKzI0Pj4yXSYxMjddKHksbyk7aWYoKGFbaz4+MF0mMSk9PTApe2FbaysxPj4wXT0wO2Fbaz4+MF09MH1lbHNle2FbY1trKzg+PjJdPj4wXT0wO2Nbays0Pj4yXT0wfWlnKGspO2NbayswPj4yXT1jW3krMD4+Ml07Y1trKzQ+PjJdPWNbeSs0Pj4yXTtjW2srOD4+Ml09Y1t5Kzg+PjJdO2NbeSswPj4yXT0wO2NbeSs0Pj4yXT0wO2NbeSs4Pj4yXT0wO2I9b2NbY1soY1tvPj4yXXwwKSszNj4+Ml0mMTI3XShvKXwwO2NbbT4+Ml09YjtpPW47cmV0dXJufX1mdW5jdGlvbiBBayhkLGUsZixnLGgsaixrLGwsbSxuLG8scCxxLHIscyl7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7bz1vfDA7cD1wfDA7cT1xfDA7cj1yfDA7cz1zfDA7dmFyIHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTAsQj0wLEM9MCxEPTAsRT0wLEY9MCxHPTAsSD0wLEk9MCxKPTAsSz0wLEw9MCxNPTAsTj0wLE89MCxQPTAsUT0wLFI9MDt0PWk7Y1tmPj4yXT1kO3Y9cisxfDA7dz1yKzh8MDt1PXIrNHwwO3g9KGcmNTEyfDApPT0wO0Q9cSsxfDA7SD1xKzh8MDtJPXErNHwwO0E9KHN8MCk+MDtCPXArMXwwO0U9cCs4fDA7eT1wKzR8MDtDPWsrOHwwO3o9MC1zfDA7Sj0wO2Rve3N3aXRjaChhW20rSj4+MF18MCl7Y2FzZSAwOntjW2U+PjJdPWNbZj4+Ml07YnJlYWt9O2Nhc2UgNDp7Sz1jW2Y+PjJdfDA7aD1sP2grMXwwOmg7YTpkb3tpZihoPj4+MDxqPj4+MCl7TD1oO3doaWxlKDEpe049YVtMPj4wXXwwO2lmKCEoTjw8MjQ+PjI0Pi0xKSl7YnJlYWsgYX1NPUwrMXwwO2lmKChiWyhjW0M+PjJdfDApKyhOPDwyND4+MjQ8PDEpPj4xXSYyMDQ4KT09MCl7YnJlYWsgYX1pZihNPj4+MDxqPj4+MCl7TD1NfWVsc2V7TD1NO2JyZWFrfX19ZWxzZXtMPWh9fXdoaWxlKDApO009TDtpZihBKXtpZihMPj4+MD5oPj4+MCl7Tj1oKygwLU0pfDA7Tj1OPj4+MDx6Pj4+MD96Ok47TT1OK3N8MDtRPUs7UD1MO089czt3aGlsZSgxKXtQPVArIC0xfDA7Uj1hW1A+PjBdfDA7Y1tmPj4yXT1RKzE7YVtRPj4wXT1SO089TysgLTF8MDtRPShPfDApPjA7aWYoIShQPj4+MD5oPj4+MCZRKSl7YnJlYWt9UT1jW2Y+PjJdfDB9TD1MK058MDtpZihRKXtHPTMyfWVsc2V7Tj0wfX1lbHNle009cztHPTMyfWlmKChHfDApPT0zMil7Rz0wO049eGNbY1soY1trPj4yXXwwKSsyOD4+Ml0mNjNdKGssNDgpfDB9Tz1jW2Y+PjJdfDA7Y1tmPj4yXT1PKzE7aWYoKE18MCk+MCl7ZG97YVtPPj4wXT1OO009TSsgLTF8MDtPPWNbZj4+Ml18MDtjW2Y+PjJdPU8rMX13aGlsZSgoTXwwKT4wKX1hW08+PjBdPW59aWYoKEx8MCk9PShofDApKXtRPXhjW2NbKGNbaz4+Ml18MCkrMjg+PjJdJjYzXShrLDQ4KXwwO1I9Y1tmPj4yXXwwO2NbZj4+Ml09UisxO2FbUj4+MF09UX1lbHNle049YVtwPj4wXXwwO009KE4mMSk9PTA7aWYoTSl7Tj0oTiYyNTUpPj4+MX1lbHNle049Y1t5Pj4yXXwwfWlmKChOfDApPT0wKXtNPS0xO049MDtPPTB9ZWxzZXtpZihNKXtNPUJ9ZWxzZXtNPWNbRT4+Ml18MH1NPWFbTT4+MF18MDtOPTA7Tz0wfXdoaWxlKDEpe2lmKChPfDApPT0oTXwwKSl7UD1jW2Y+PjJdfDA7Y1tmPj4yXT1QKzE7YVtQPj4wXT1vO049TisxfDA7UD1hW3A+PjBdfDA7Tz0oUCYxKT09MDtpZihPKXtQPShQJjI1NSk+Pj4xfWVsc2V7UD1jW3k+PjJdfDB9aWYoTj4+PjA8UD4+PjApe2lmKE8pe009Qn1lbHNle009Y1tFPj4yXXwwfWlmKChhW00rTj4+MF18MCk9PTEyNyl7TT0tMTtPPTB9ZWxzZXtpZihPKXtNPUJ9ZWxzZXtNPWNbRT4+Ml18MH1NPWFbTStOPj4wXXwwO089MH19ZWxzZXtPPTB9fUw9TCsgLTF8MDtRPWFbTD4+MF18MDtSPWNbZj4+Ml18MDtjW2Y+PjJdPVIrMTthW1I+PjBdPVE7aWYoKEx8MCk9PShofDApKXticmVha31lbHNle089TysxfDB9fX1MPWNbZj4+Ml18MDtpZigoS3wwKSE9KEx8MCk/KEY9TCsgLTF8MCxGPj4+MD5LPj4+MCk6MCl7TD1GO2Rve1I9YVtLPj4wXXwwO2FbSz4+MF09YVtMPj4wXXwwO2FbTD4+MF09UjtLPUsrMXwwO0w9TCsgLTF8MH13aGlsZShLPj4+MDxMPj4+MCl9YnJlYWt9O2Nhc2UgMjp7TD1hW3E+PjBdfDA7TT0oTCYxKT09MDtpZihNKXtLPShMJjI1NSk+Pj4xfWVsc2V7Sz1jW0k+PjJdfDB9aWYoISgoS3wwKT09MHx4KSl7aWYoTSl7Sz1EO0w9KEwmMjU1KT4+PjF9ZWxzZXtLPWNbSD4+Ml18MDtMPWNbST4+Ml18MH1MPUsrTHwwO009Y1tmPj4yXXwwO2lmKChLfDApIT0oTHwwKSl7ZG97YVtNPj4wXT1hW0s+PjBdfDA7Sz1LKzF8MDtNPU0rMXwwfXdoaWxlKChLfDApIT0oTHwwKSl9Y1tmPj4yXT1NfWJyZWFrfTtjYXNlIDM6e0w9YVtyPj4wXXwwO0s9KEwmMSk9PTA7aWYoSyl7TD0oTCYyNTUpPj4+MX1lbHNle0w9Y1t1Pj4yXXwwfWlmKChMfDApIT0wKXtpZihLKXtLPXZ9ZWxzZXtLPWNbdz4+Ml18MH1RPWFbSz4+MF18MDtSPWNbZj4+Ml18MDtjW2Y+PjJdPVIrMTthW1I+PjBdPVF9YnJlYWt9O2Nhc2UgMTp7Y1tlPj4yXT1jW2Y+PjJdO1E9eGNbY1soY1trPj4yXXwwKSsyOD4+Ml0mNjNdKGssMzIpfDA7Uj1jW2Y+PjJdfDA7Y1tmPj4yXT1SKzE7YVtSPj4wXT1RO2JyZWFrfTtkZWZhdWx0Ont9fUo9SisxfDB9d2hpbGUoKEp8MCkhPTQpO2s9YVtyPj4wXXwwO3g9KGsmMSk9PTA7aWYoeCl7cj0oayYyNTUpPj4+MX1lbHNle3I9Y1t1Pj4yXXwwfWlmKHI+Pj4wPjEpe2lmKHgpe3U9KGsmMjU1KT4+PjF9ZWxzZXt2PWNbdz4+Ml18MDt1PWNbdT4+Ml18MH13PXYrMXwwO3U9dit1fDA7dj1jW2Y+PjJdfDA7aWYoKHd8MCkhPSh1fDApKXtkb3thW3Y+PjBdPWFbdz4+MF18MDt3PXcrMXwwO3Y9disxfDB9d2hpbGUoKHd8MCkhPSh1fDApKX1jW2Y+PjJdPXZ9Zz1nJjE3NjtpZigoZ3wwKT09MTYpe2k9dDtyZXR1cm59ZWxzZSBpZigoZ3wwKT09MzIpe2NbZT4+Ml09Y1tmPj4yXTtpPXQ7cmV0dXJufWVsc2V7Y1tlPj4yXT1kO2k9dDtyZXR1cm59fWZ1bmN0aW9uIEJrKGIsZCxlLGYsZyxoLGope2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2o9anwwO3ZhciBrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wO3A9aTtpPWkrMTYwfDA7eD1wO3Q9cCsxNDB8MDtzPXArMTUyfDA7cj1wKzE1M3wwO3E9cCsxMTJ8MDt2PXArMTAwfDA7ZD1wKzEyOHwwO3o9cCsxMjR8MDt3PXArMTQ0fDA7dT1wKzE0OHwwO289Y1tnKzI4Pj4yXXwwO0Q9bys0fDA7Y1tEPj4yXT0oY1tEPj4yXXwwKSsxO2lmKCEoKGNbMzM2NF18MCk9PS0xKSl7Y1t4Pj4yXT0xMzQ1NjtjW3grND4+Ml09MjA4O2NbeCs4Pj4yXT0wO2NnKDEzNDU2LHgpfXk9KGNbMTM0NjA+PjJdfDApKyAtMXwwO0E9Y1tvKzg+PjJdfDA7aWYoKGNbbysxMj4+Ml18MCktQT4+Mj4+PjA+eT4+PjA/KGw9Y1tBKyh5PDwyKT4+Ml18MCwobHwwKSE9MCk6MCl7QT1hW2o+PjBdfDA7eT0oQSYxKT09MDtpZih5KXtBPShBJjI1NSk+Pj4xfWVsc2V7QT1jW2orND4+Ml18MH1pZigoQXwwKT09MCl7eT0wfWVsc2V7aWYoeSl7eT1qKzF8MH1lbHNle3k9Y1tqKzg+PjJdfDB9eT1hW3k+PjBdfDA7eT15PDwyND4+MjQ9PSh4Y1tjWyhjW2w+PjJdfDApKzI4Pj4yXSY2M10obCw0NSl8MCk8PDI0Pj4yNH1jW3Q+PjJdPTA7Y1txKzA+PjJdPTA7Y1txKzQ+PjJdPTA7Y1txKzg+PjJdPTA7Y1t2KzA+PjJdPTA7Y1t2KzQ+PjJdPTA7Y1t2Kzg+PjJdPTA7Y1tkKzA+PjJdPTA7Y1tkKzQ+PjJdPTA7Y1tkKzg+PjJdPTA7emsoZix5LG8sdCxzLHIscSx2LGQseik7Zj1hW2o+PjBdfDA7QT0oZiYxKT09MDtpZihBKXtCPShmJjI1NSk+Pj4xfWVsc2V7Qj1jW2orND4+Ml18MH16PWNbej4+Ml18MDtpZigoQnwwKT4oenwwKSl7aWYoQSl7Qj0oZiYyNTUpPj4+MX1lbHNle0I9Y1tqKzQ+PjJdfDB9Qz1hW2Q+PjBdfDA7aWYoKEMmMSk9PTApe0M9KEMmMjU1KT4+PjF9ZWxzZXtDPWNbZCs0Pj4yXXwwfUQ9YVt2Pj4wXXwwO2lmKChEJjEpPT0wKXtEPShEJjI1NSk+Pj4xfWVsc2V7RD1jW3YrND4+Ml18MH1CPUMrKEItejw8MXwxKStEfDB9ZWxzZXtCPWFbZD4+MF18MDtpZigoQiYxKT09MCl7Qj0oQiYyNTUpPj4+MX1lbHNle0I9Y1tkKzQ+PjJdfDB9Qz1hW3Y+PjBdfDA7aWYoKEMmMSk9PTApe0M9KEMmMjU1KT4+PjF9ZWxzZXtDPWNbdis0Pj4yXXwwfUI9QisyK0N8MH1CPUIrenwwO2lmKEI+Pj4wPjEwMCl7eD11bihCKXwwO2lmKCh4fDApPT0wKXtEPVhhKDQpfDA7Y1tEPj4yXT0yMjY4MDt3YihEfDAsMjI3MjgsMjA2KX1lbHNle0I9eH19ZWxzZXtCPTB9aWYoQSl7QT1qKzF8MDtqPShmJjI1NSk+Pj4xfWVsc2V7QT1jW2orOD4+Ml18MDtqPWNbais0Pj4yXXwwfUFrKHgsdyx1LGNbZys0Pj4yXXwwLEEsQStqfDAsbCx5LHQsYVtzPj4wXXwwLGFbcj4+MF18MCxxLHYsZCx6KTtXYyhiLGNbZT4+Ml18MCx4LGNbdz4+Ml18MCxjW3U+PjJdfDAsZyxoKTtpZigoQnwwKSE9MCl7dm4oQil9aWYoISgoYVtkPj4wXSYxKT09MCk/KG09Y1tkKzg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbdj4+MF0mMSk9PTApPyhuPWNbdis4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhW3E+PjBdJjEpPT0wKT8oaz1jW3ErOD4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9Qz1vKzR8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXtpPXA7cmV0dXJufWxjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKTtpPXA7cmV0dXJufUQ9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIENrKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIERrKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBFayhiLGQsZSxmLGcsaixsKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtqPWp8MDtsPStsO3ZhciBtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MCxFPTAsRj0wLEc9MCxIPTA7cT1pO2k9aSs5NzZ8MDtBPXE7Qz1xKzg2OHwwO0U9cSs4MTZ8MDtCPXErNDE2fDA7dD1xKzQwOHwwO3M9cSs4NjB8MDtyPXErNDAwfDA7eD1xKzgyNHwwO2Q9cSs4MzZ8MDt3PXErODQ4fDA7Rj1xKzgyMHwwO3Y9cSs0MDR8MDt1PXErODY0fDA7Y1tFPj4yXT1DO2hbaz4+M109bDtjW0E+PjJdPWNbaz4+Ml07Y1tBKzQ+PjJdPWNbays0Pj4yXTtDPWxiKEN8MCwxMDAsMTMyMjQsQXwwKXwwO2lmKEM+Pj4wPjk5KXtpZigoYVsxMzM2OF18MCk9PTA/KFFhKDEzMzY4KXwwKSE9MDowKXtjWzMzNDBdPWtiKDIxNDc0ODM2NDcsMTMzNzYsMCl8MDskYSgxMzM2OCl9Qz1jWzMzNDBdfDA7aFtrPj4zXT1sO2NbQT4+Ml09Y1trPj4yXTtjW0ErND4+Ml09Y1trKzQ+PjJdO0M9Q2koRSxDLDEzMjI0LEEpfDA7ej1jW0U+PjJdfDA7aWYoKHp8MCk9PTApe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfUI9dW4oQzw8Mil8MDtpZigoQnwwKT09MCl7SD1YYSg0KXwwO2NbSD4+Ml09MjI2ODA7d2IoSHwwLDIyNzI4LDIwNil9ZWxzZXt5PUJ9fWVsc2V7eT0wO3o9MH1EPWNbZysyOD4+Ml18MDtIPUQrNHwwO2NbSD4+Ml09KGNbSD4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbQT4+Ml09MTM0NDg7Y1tBKzQ+PjJdPTIwODtjW0ErOD4+Ml09MDtjZygxMzQ0OCxBKX1HPShjWzEzNDUyPj4yXXwwKSsgLTF8MDtIPWNbRCs4Pj4yXXwwO2lmKChjW0QrMTI+PjJdfDApLUg+PjI+Pj4wPkc+Pj4wPyhwPWNbSCsoRzw8Mik+PjJdfDAsKHB8MCkhPTApOjApe0g9Y1tFPj4yXXwwO3VjW2NbKGNbcD4+Ml18MCkrNDg+PjJdJjMxXShwLEgsSCtDfDAsQil8MDtpZigoQ3wwKT09MCl7RT0wfWVsc2V7RT0oYVtjW0U+PjJdPj4wXXwwKT09NDV9Y1t0Pj4yXT0wO2NbeCswPj4yXT0wO2NbeCs0Pj4yXT0wO2NbeCs4Pj4yXT0wO2NbZCswPj4yXT0wO2NbZCs0Pj4yXT0wO2NbZCs4Pj4yXT0wO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wO0ZrKGYsRSxELHQscyxyLHgsZCx3LEYpO2Y9Y1tGPj4yXXwwO2lmKChDfDApPihmfDApKXtGPWFbdz4+MF18MDtpZigoRiYxKT09MCl7Rj0oRiYyNTUpPj4+MX1lbHNle0Y9Y1t3KzQ+PjJdfDB9Rz1hW2Q+PjBdfDA7aWYoKEcmMSk9PTApe0c9KEcmMjU1KT4+PjF9ZWxzZXtHPWNbZCs0Pj4yXXwwfUY9RisoQy1mPDwxfDEpK0d8MH1lbHNle0Y9YVt3Pj4wXXwwO2lmKChGJjEpPT0wKXtGPShGJjI1NSk+Pj4xfWVsc2V7Rj1jW3crND4+Ml18MH1HPWFbZD4+MF18MDtpZigoRyYxKT09MCl7Rz0oRyYyNTUpPj4+MX1lbHNle0c9Y1tkKzQ+PjJdfDB9Rj1GKzIrR3wwfUY9RitmfDA7aWYoRj4+PjA+MTAwKXtBPXVuKEY8PDIpfDA7aWYoKEF8MCk9PTApe0g9WGEoNCl8MDtjW0g+PjJdPTIyNjgwO3diKEh8MCwyMjcyOCwyMDYpfWVsc2V7Rj1BfX1lbHNle0Y9MH1HayhBLHYsdSxjW2crND4+Ml18MCxCLEIrKEM8PDIpfDAscCxFLHQsY1tzPj4yXXwwLGNbcj4+Ml18MCx4LGQsdyxmKTtMaShiLGNbZT4+Ml18MCxBLGNbdj4+Ml18MCxjW3U+PjJdfDAsZyxqKTtpZigoRnwwKSE9MCl7dm4oRil9aWYoISgoYVt3Pj4wXSYxKT09MCk/KG49Y1t3Kzg+PjJdfDAsKG58MCkhPTApOjApe3ZuKG4pfWlmKCEoKGFbZD4+MF0mMSk9PTApPyhvPWNbZCs4Pj4yXXwwLChvfDApIT0wKTowKXt2bihvKX1pZighKChhW3g+PjBdJjEpPT0wKT8obT1jW3grOD4+Ml18MCwobXwwKSE9MCk6MCl7dm4obSl9Rz1EKzR8MDtIPWNbRz4+Ml18MDtjW0c+PjJdPUgrIC0xO2lmKChIfDApPT0wKXtsY1tjWyhjW0Q+PjJdfDApKzg+PjJdJjI1NV0oRCl9aWYoKHl8MCkhPTApe3ZuKHkpfWlmKCh6fDApPT0wKXtpPXE7cmV0dXJufXZuKHopO2k9cTtyZXR1cm59SD1YYSg0KXwwO2NbSD4+Ml09MjEzMDQ7d2IoSHwwLDIxMzc2LDE5Nil9ZnVuY3Rpb24gRmsoYixkLGUsZixnLGgsaixrLGwsbSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7dmFyIG49MCxvPTAscD0wLHE9MCxyPTAscz0wLHQ9MCx1PTAsdj0wLHc9MCx4PTAseT0wLHo9MCxBPTA7bj1pO2k9aSsxMjh8MDtBPW47eD1uKzEyfDA7bz1uKzQwfDA7dj1uKzUyfDA7dz1uKzU2fDA7dT1uKzE2fDA7ej1uKzI4fDA7cj1uKzY4fDA7cT1uKzcyfDA7dD1uKzg0fDA7cz1uKzg4fDA7cD1uKzEwMHwwO3k9bisxMTJ8MDtpZihiKXtpZighKChjWzMyNjBdfDApPT0tMSkpe2NbQT4+Ml09MTMwNDA7Y1tBKzQ+PjJdPTIwODtjW0ErOD4+Ml09MDtjZygxMzA0MCxBKX1xPShjWzEzMDQ0Pj4yXXwwKSsgLTF8MDtwPWNbZSs4Pj4yXXwwO2lmKCEoKGNbZSsxMj4+Ml18MCktcD4+Mj4+PjA+cT4+PjApKXtiPVhhKDQpfDA7Y1tiPj4yXT0yMTMwNDt3YihifDAsMjEzNzYsMTk2KX1wPWNbcCsocTw8Mik+PjJdfDA7aWYoKHB8MCk9PTApe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfXE9Y1twPj4yXXwwO2lmKGQpe21jW2NbcSs0ND4+Ml0mMTI3XSh4LHApO2I9Y1t4Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbcD4+Ml18MCkrMzI+PjJdJjEyN10obyxwKTtpZigoYVtsPj4wXSYxKT09MCl7Y1tsKzQ+PjJdPTA7YVtsPj4wXT0wfWVsc2V7Y1tjW2wrOD4+Ml0+PjJdPTA7Y1tsKzQ+PjJdPTB9b2cobCk7Y1tsKzA+PjJdPWNbbyswPj4yXTtjW2wrND4+Ml09Y1tvKzQ+PjJdO2NbbCs4Pj4yXT1jW28rOD4+Ml07Y1tvKzA+PjJdPTA7Y1tvKzQ+PjJdPTA7Y1tvKzg+PjJdPTB9ZWxzZXttY1tjW3ErNDA+PjJdJjEyN10odixwKTtiPWNbdj4+Ml18MDthW2Y+PjBdPWI7YVtmKzE+PjBdPWI+Pjg7YVtmKzI+PjBdPWI+PjE2O2FbZiszPj4wXT1iPj4yNDttY1tjWyhjW3A+PjJdfDApKzI4Pj4yXSYxMjddKHcscCk7aWYoKGFbbD4+MF0mMSk9PTApe2NbbCs0Pj4yXT0wO2FbbD4+MF09MH1lbHNle2NbY1tsKzg+PjJdPj4yXT0wO2NbbCs0Pj4yXT0wfW9nKGwpO2NbbCswPj4yXT1jW3crMD4+Ml07Y1tsKzQ+PjJdPWNbdys0Pj4yXTtjW2wrOD4+Ml09Y1t3Kzg+PjJdO2NbdyswPj4yXT0wO2Nbdys0Pj4yXT0wO2Nbdys4Pj4yXT0wfWNbZz4+Ml09b2NbY1soY1twPj4yXXwwKSsxMj4+Ml0mMTI3XShwKXwwO2NbaD4+Ml09b2NbY1soY1twPj4yXXwwKSsxNj4+Ml0mMTI3XShwKXwwO21jW2NbKGNbcD4+Ml18MCkrMjA+PjJdJjEyN10odSxwKTtpZigoYVtqPj4wXSYxKT09MCl7YVtqKzE+PjBdPTA7YVtqPj4wXT0wfWVsc2V7YVtjW2orOD4+Ml0+PjBdPTA7Y1tqKzQ+PjJdPTB9aWcoaik7Y1tqKzA+PjJdPWNbdSswPj4yXTtjW2orND4+Ml09Y1t1KzQ+PjJdO2Nbais4Pj4yXT1jW3UrOD4+Ml07Y1t1KzA+PjJdPTA7Y1t1KzQ+PjJdPTA7Y1t1Kzg+PjJdPTA7bWNbY1soY1twPj4yXXwwKSsyND4+Ml0mMTI3XSh6LHApO2lmKChhW2s+PjBdJjEpPT0wKXtjW2srND4+Ml09MDthW2s+PjBdPTB9ZWxzZXtjW2Nbays4Pj4yXT4+Ml09MDtjW2srND4+Ml09MH1vZyhrKTtjW2srMD4+Ml09Y1t6KzA+PjJdO2Nbays0Pj4yXT1jW3orND4+Ml07Y1trKzg+PjJdPWNbeis4Pj4yXTtjW3orMD4+Ml09MDtjW3orND4+Ml09MDtjW3orOD4+Ml09MDtiPW9jW2NbKGNbcD4+Ml18MCkrMzY+PjJdJjEyN10ocCl8MDtjW20+PjJdPWI7aT1uO3JldHVybn1lbHNle2lmKCEoKGNbMzI0NF18MCk9PS0xKSl7Y1tBPj4yXT0xMjk3NjtjW0ErND4+Ml09MjA4O2NbQSs4Pj4yXT0wO2NnKDEyOTc2LEEpfXU9KGNbMTI5ODA+PjJdfDApKyAtMXwwO289Y1tlKzg+PjJdfDA7aWYoISgoY1tlKzEyPj4yXXwwKS1vPj4yPj4+MD51Pj4+MCkpe2I9WGEoNCl8MDtjW2I+PjJdPTIxMzA0O3diKGJ8MCwyMTM3NiwxOTYpfW89Y1tvKyh1PDwyKT4+Ml18MDtpZigob3wwKT09MCl7Yj1YYSg0KXwwO2NbYj4+Ml09MjEzMDQ7d2IoYnwwLDIxMzc2LDE5Nil9ZT1jW28+PjJdfDA7aWYoZCl7bWNbY1tlKzQ0Pj4yXSYxMjddKHIsbyk7Yj1jW3I+PjJdfDA7YVtmPj4wXT1iO2FbZisxPj4wXT1iPj44O2FbZisyPj4wXT1iPj4xNjthW2YrMz4+MF09Yj4+MjQ7bWNbY1soY1tvPj4yXXwwKSszMj4+Ml0mMTI3XShxLG8pO2lmKChhW2w+PjBdJjEpPT0wKXtjW2wrND4+Ml09MDthW2w+PjBdPTB9ZWxzZXtjW2NbbCs4Pj4yXT4+Ml09MDtjW2wrND4+Ml09MH1vZyhsKTtjW2wrMD4+Ml09Y1txKzA+PjJdO2NbbCs0Pj4yXT1jW3ErND4+Ml07Y1tsKzg+PjJdPWNbcSs4Pj4yXTtjW3ErMD4+Ml09MDtjW3ErND4+Ml09MDtjW3ErOD4+Ml09MH1lbHNle21jW2NbZSs0MD4+Ml0mMTI3XSh0LG8pO2I9Y1t0Pj4yXXwwO2FbZj4+MF09YjthW2YrMT4+MF09Yj4+ODthW2YrMj4+MF09Yj4+MTY7YVtmKzM+PjBdPWI+PjI0O21jW2NbKGNbbz4+Ml18MCkrMjg+PjJdJjEyN10ocyxvKTtpZigoYVtsPj4wXSYxKT09MCl7Y1tsKzQ+PjJdPTA7YVtsPj4wXT0wfWVsc2V7Y1tjW2wrOD4+Ml0+PjJdPTA7Y1tsKzQ+PjJdPTB9b2cobCk7Y1tsKzA+PjJdPWNbcyswPj4yXTtjW2wrND4+Ml09Y1tzKzQ+PjJdO2NbbCs4Pj4yXT1jW3MrOD4+Ml07Y1tzKzA+PjJdPTA7Y1tzKzQ+PjJdPTA7Y1tzKzg+PjJdPTB9Y1tnPj4yXT1vY1tjWyhjW28+PjJdfDApKzEyPj4yXSYxMjddKG8pfDA7Y1toPj4yXT1vY1tjWyhjW28+PjJdfDApKzE2Pj4yXSYxMjddKG8pfDA7bWNbY1soY1tvPj4yXXwwKSsyMD4+Ml0mMTI3XShwLG8pO2lmKChhW2o+PjBdJjEpPT0wKXthW2orMT4+MF09MDthW2o+PjBdPTB9ZWxzZXthW2Nbais4Pj4yXT4+MF09MDtjW2orND4+Ml09MH1pZyhqKTtjW2orMD4+Ml09Y1twKzA+PjJdO2Nbais0Pj4yXT1jW3ArND4+Ml07Y1tqKzg+PjJdPWNbcCs4Pj4yXTtjW3ArMD4+Ml09MDtjW3ArND4+Ml09MDtjW3ArOD4+Ml09MDttY1tjWyhjW28+PjJdfDApKzI0Pj4yXSYxMjddKHksbyk7aWYoKGFbaz4+MF0mMSk9PTApe2Nbays0Pj4yXT0wO2Fbaz4+MF09MH1lbHNle2NbY1trKzg+PjJdPj4yXT0wO2Nbays0Pj4yXT0wfW9nKGspO2NbayswPj4yXT1jW3krMD4+Ml07Y1trKzQ+PjJdPWNbeSs0Pj4yXTtjW2srOD4+Ml09Y1t5Kzg+PjJdO2NbeSswPj4yXT0wO2NbeSs0Pj4yXT0wO2NbeSs4Pj4yXT0wO2I9b2NbY1soY1tvPj4yXXwwKSszNj4+Ml0mMTI3XShvKXwwO2NbbT4+Ml09YjtpPW47cmV0dXJufX1mdW5jdGlvbiBHayhiLGQsZSxmLGcsaCxqLGssbCxtLG4sbyxwLHEscil7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aj1qfDA7az1rfDA7bD1sfDA7bT1tfDA7bj1ufDA7bz1vfDA7cD1wfDA7cT1xfDA7cj1yfDA7dmFyIHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wLEI9MCxDPTAsRD0wLEU9MCxGPTAsRz0wLEg9MCxJPTAsSj0wLEs9MCxMPTAsTT0wO3M9aTtjW2U+PjJdPWI7dD1xKzR8MDt1PXErOHwwO3k9KGYmNTEyfDApPT0wO3g9cCs0fDA7QT1wKzh8MDt3PShyfDApPjA7Qj1vKzF8MDtDPW8rOHwwO0Q9bys0fDA7RT0wO2Rve3N3aXRjaChhW2wrRT4+MF18MCl7Y2FzZSAyOntGPWFbcD4+MF18MDtIPShGJjEpPT0wO2lmKEgpe0c9KEYmMjU1KT4+PjF9ZWxzZXtHPWNbeD4+Ml18MH1pZighKChHfDApPT0wfHkpKXtpZihIKXtIPXg7ST0oRiYyNTUpPj4+MX1lbHNle0g9Y1tBPj4yXXwwO0k9Y1t4Pj4yXXwwfUc9SCsoSTw8Mil8MDtGPWNbZT4+Ml18MDtpZigoSHwwKSE9KEd8MCkpe0o9KEgrKEkrIC0xPDwyKSsoMC1IKXwwKT4+PjI7ST1GO3doaWxlKDEpe2NbST4+Ml09Y1tIPj4yXTtIPUgrNHwwO2lmKChIfDApPT0oR3wwKSl7YnJlYWt9ST1JKzR8MH1GPUYrKEorMTw8Mil8MH1jW2U+PjJdPUZ9YnJlYWt9O2Nhc2UgMzp7Rz1hW3E+PjBdfDA7Rj0oRyYxKT09MDtpZihGKXtHPShHJjI1NSk+Pj4xfWVsc2V7Rz1jW3Q+PjJdfDB9aWYoKEd8MCkhPTApe2lmKEYpe0Y9dH1lbHNle0Y9Y1t1Pj4yXXwwfUw9Y1tGPj4yXXwwO009Y1tlPj4yXXwwO2NbZT4+Ml09TSs0O2NbTT4+Ml09TH1icmVha307Y2FzZSA0OntGPWNbZT4+Ml18MDtnPWs/Zys0fDA6ZzthOmRve2lmKGc+Pj4wPGg+Pj4wKXtHPWc7d2hpbGUoMSl7SD1HKzR8MDtpZighKGhjW2NbKGNbaj4+Ml18MCkrMTI+PjJdJjYzXShqLDIwNDgsY1tHPj4yXXwwKXwwKSl7YnJlYWsgYX1pZihIPj4+MDxoPj4+MCl7Rz1IfWVsc2V7Rz1IO2JyZWFrfX19ZWxzZXtHPWd9fXdoaWxlKDApO2lmKHcpe2lmKEc+Pj4wPmc+Pj4wKXtIPWNbZT4+Ml18MDtJPXI7d2hpbGUoMSl7Rz1HKyAtNHwwO0s9SCs0fDA7Y1tIPj4yXT1jW0c+PjJdO0k9SSsgLTF8MDtKPShJfDApPjA7aWYoIShHPj4+MD5nPj4+MCZKKSl7YnJlYWt9ZWxzZXtIPUt9fWNbZT4+Ml09SztpZihKKXt6PTM0fWVsc2V7Y1tlPj4yXT1IKzh9fWVsc2V7ST1yO3o9MzR9aWYoKHp8MCk9PTM0KXt6PTA7Sj14Y1tjWyhjW2o+PjJdfDApKzQ0Pj4yXSY2M10oaiw0OCl8MDtLPWNbZT4+Ml18MDtNPUsrNHwwO2NbZT4+Ml09TTtpZigoSXwwKT4wKXtIPUs7TD1JO3doaWxlKDEpe2NbSD4+Ml09SjtMPUwrIC0xfDA7aWYoKEx8MCk8PTApe2JyZWFrfWVsc2V7SD1NO009TSs0fDB9fWNbZT4+Ml09SysoSSsxPDwyKTtLPUsrKEk8PDIpfDB9fWNbSz4+Ml09bX1pZigoR3wwKT09KGd8MCkpe0s9eGNbY1soY1tqPj4yXXwwKSs0ND4+Ml0mNjNdKGosNDgpfDA7TT1jW2U+PjJdfDA7TD1NKzR8MDtjW2U+PjJdPUw7Y1tNPj4yXT1LfWVsc2V7ST1hW28+PjBdfDA7SD0oSSYxKT09MDtpZihIKXtJPShJJjI1NSk+Pj4xfWVsc2V7ST1jW0Q+PjJdfDB9aWYoKEl8MCk9PTApe0g9LTF9ZWxzZXtpZihIKXtIPUJ9ZWxzZXtIPWNbQz4+Ml18MH1IPWFbSD4+MF18MH1JPWNbZT4+Ml18MDtLPTA7Sj0wO3doaWxlKDEpe2lmKChKfDApPT0oSHwwKSl7Sj1JKzR8MDtjW2U+PjJdPUo7Y1tJPj4yXT1uO0s9SysxfDA7TD1hW28+PjBdfDA7ST0oTCYxKT09MDtpZihJKXtMPShMJjI1NSk+Pj4xfWVsc2V7TD1jW0Q+PjJdfDB9aWYoSz4+PjA8TD4+PjApe2lmKEkpe0g9Qn1lbHNle0g9Y1tDPj4yXXwwfWlmKChhW0grSz4+MF18MCk9PTEyNyl7ST1KO0g9LTE7Sj0wfWVsc2V7aWYoSSl7SD1CfWVsc2V7SD1jW0M+PjJdfDB9ST1KO0g9YVtIK0s+PjBdfDA7Sj0wfX1lbHNle0k9SjtKPTB9fUc9RysgLTR8MDtNPWNbRz4+Ml18MDtMPUkrNHwwO2NbZT4+Ml09TDtjW0k+PjJdPU07aWYoKEd8MCk9PShnfDApKXticmVha31lbHNle0k9TDtKPUorMXwwfX19aWYoKEZ8MCkhPShMfDApPyh2PUwrIC00fDAsdj4+PjA+Rj4+PjApOjApe0c9djtkb3tNPWNbRj4+Ml18MDtjW0Y+PjJdPWNbRz4+Ml07Y1tHPj4yXT1NO0Y9Ris0fDA7Rz1HKyAtNHwwfXdoaWxlKEY+Pj4wPEc+Pj4wKX1icmVha307Y2FzZSAxOntjW2Q+PjJdPWNbZT4+Ml07TD14Y1tjWyhjW2o+PjJdfDApKzQ0Pj4yXSY2M10oaiwzMil8MDtNPWNbZT4+Ml18MDtjW2U+PjJdPU0rNDtjW00+PjJdPUw7YnJlYWt9O2Nhc2UgMDp7Y1tkPj4yXT1jW2U+PjJdO2JyZWFrfTtkZWZhdWx0Ont9fUU9RSsxfDB9d2hpbGUoKEV8MCkhPTQpO3c9YVtxPj4wXXwwO3Y9KHcmMSk9PTA7aWYodil7cT0odyYyNTUpPj4+MX1lbHNle3E9Y1t0Pj4yXXwwfWlmKHE+Pj4wPjEpe2lmKHYpe3Y9dDtxPSh3JjI1NSk+Pj4xfWVsc2V7dj1jW3U+PjJdfDA7cT1jW3Q+PjJdfDB9dz12KzR8MDt1PXYrKHE8PDIpfDA7dD1jW2U+PjJdfDA7aWYoKHd8MCkhPSh1fDApKXtxPSh2KyhxKyAtMTw8MikrKDAtdyl8MCk+Pj4yO3Y9dDt3aGlsZSgxKXtjW3Y+PjJdPWNbdz4+Ml07dz13KzR8MDtpZigod3wwKT09KHV8MCkpe2JyZWFrfWVsc2V7dj12KzR8MH19dD10KyhxKzE8PDIpfDB9Y1tlPj4yXT10fWY9ZiYxNzY7aWYoKGZ8MCk9PTE2KXtpPXM7cmV0dXJufWVsc2UgaWYoKGZ8MCk9PTMyKXtjW2Q+PjJdPWNbZT4+Ml07aT1zO3JldHVybn1lbHNle2NbZD4+Ml09YjtpPXM7cmV0dXJufX1mdW5jdGlvbiBIayhiLGQsZSxmLGcsaCxqKXtiPWJ8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtqPWp8MDt2YXIgaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTAsdD0wLHU9MCx2PTAsdz0wLHg9MCx5PTAsej0wLEE9MCxCPTAsQz0wLEQ9MDtwPWk7aT1pKzQ2NHwwO3g9cDt0PXArNDM2fDA7cz1wKzQ0MHwwO3I9cCs0NDR8MDtxPXArNDEyfDA7dj1wKzQwMHwwO2Q9cCs0MjR8MDt6PXArNDQ4fDA7dz1wKzQ1MnwwO3U9cCs0NTZ8MDtvPWNbZysyOD4+Ml18MDtEPW8rNHwwO2NbRD4+Ml09KGNbRD4+Ml18MCkrMTtpZighKChjWzMzNjJdfDApPT0tMSkpe2NbeD4+Ml09MTM0NDg7Y1t4KzQ+PjJdPTIwODtjW3grOD4+Ml09MDtjZygxMzQ0OCx4KX15PShjWzEzNDUyPj4yXXwwKSsgLTF8MDtBPWNbbys4Pj4yXXwwO2lmKChjW28rMTI+PjJdfDApLUE+PjI+Pj4wPnk+Pj4wPyhsPWNbQSsoeTw8Mik+PjJdfDAsKGx8MCkhPTApOjApe0E9YVtqPj4wXXwwO3k9KEEmMSk9PTA7aWYoeSl7QT0oQSYyNTUpPj4+MX1lbHNle0E9Y1tqKzQ+PjJdfDB9aWYoKEF8MCk9PTApe3k9MH1lbHNle2lmKHkpe3k9ais0fDB9ZWxzZXt5PWNbais4Pj4yXXwwfXk9Y1t5Pj4yXXwwO3k9KHl8MCk9PSh4Y1tjWyhjW2w+PjJdfDApKzQ0Pj4yXSY2M10obCw0NSl8MCl9Y1t0Pj4yXT0wO2NbcSswPj4yXT0wO2NbcSs0Pj4yXT0wO2NbcSs4Pj4yXT0wO2NbdiswPj4yXT0wO2Nbdis0Pj4yXT0wO2Nbdis4Pj4yXT0wO2NbZCswPj4yXT0wO2NbZCs0Pj4yXT0wO2NbZCs4Pj4yXT0wO0ZrKGYseSxvLHQscyxyLHEsdixkLHopO2Y9YVtqPj4wXXwwO0E9KGYmMSk9PTA7aWYoQSl7Qj0oZiYyNTUpPj4+MX1lbHNle0I9Y1tqKzQ+PjJdfDB9ej1jW3o+PjJdfDA7aWYoKEJ8MCk+KHp8MCkpe2lmKEEpe0I9KGYmMjU1KT4+PjF9ZWxzZXtCPWNbais0Pj4yXXwwfUM9YVtkPj4wXXwwO2lmKChDJjEpPT0wKXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW2QrND4+Ml18MH1EPWFbdj4+MF18MDtpZigoRCYxKT09MCl7RD0oRCYyNTUpPj4+MX1lbHNle0Q9Y1t2KzQ+PjJdfDB9Qj1DKyhCLXo8PDF8MSkrRHwwfWVsc2V7Qj1hW2Q+PjBdfDA7aWYoKEImMSk9PTApe0I9KEImMjU1KT4+PjF9ZWxzZXtCPWNbZCs0Pj4yXXwwfUM9YVt2Pj4wXXwwO2lmKChDJjEpPT0wKXtDPShDJjI1NSk+Pj4xfWVsc2V7Qz1jW3YrND4+Ml18MH1CPUIrMitDfDB9Qj1CK3p8MDtpZihCPj4+MD4xMDApe3g9dW4oQjw8Mil8MDtpZigoeHwwKT09MCl7RD1YYSg0KXwwO2NbRD4+Ml09MjI2ODA7d2IoRHwwLDIyNzI4LDIwNil9ZWxzZXtCPXh9fWVsc2V7Qj0wfWlmKEEpe0E9ais0fDA7aj0oZiYyNTUpPj4+MX1lbHNle0E9Y1tqKzg+PjJdfDA7aj1jW2orND4+Ml18MH1Hayh4LHcsdSxjW2crND4+Ml18MCxBLEErKGo8PDIpfDAsbCx5LHQsY1tzPj4yXXwwLGNbcj4+Ml18MCxxLHYsZCx6KTtMaShiLGNbZT4+Ml18MCx4LGNbdz4+Ml18MCxjW3U+PjJdfDAsZyxoKTtpZigoQnwwKSE9MCl7dm4oQil9aWYoISgoYVtkPj4wXSYxKT09MCk/KG09Y1tkKzg+PjJdfDAsKG18MCkhPTApOjApe3ZuKG0pfWlmKCEoKGFbdj4+MF0mMSk9PTApPyhuPWNbdis4Pj4yXXwwLChufDApIT0wKTowKXt2bihuKX1pZighKChhW3E+PjBdJjEpPT0wKT8oaz1jW3ErOD4+Ml18MCwoa3wwKSE9MCk6MCl7dm4oayl9Qz1vKzR8MDtEPWNbQz4+Ml18MDtjW0M+PjJdPUQrIC0xO2lmKChEfDApIT0wKXtpPXA7cmV0dXJufWxjW2NbKGNbbz4+Ml18MCkrOD4+Ml0mMjU1XShvKTtpPXA7cmV0dXJufUQ9WGEoNCl8MDtjW0Q+PjJdPTIxMzA0O3diKER8MCwyMTM3NiwxOTYpfWZ1bmN0aW9uIElrKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIEprKGEpe2E9YXwwO3JldHVybn1mdW5jdGlvbiBLayhiLGQsZSl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Yj1pO2lmKChhW2Q+PjBdJjEpPT0wKXtkPWQrMXwwfWVsc2V7ZD1jW2QrOD4+Ml18MH1lPWRjKGR8MCwxKXwwO2k9YjtyZXR1cm4gZT4+PigoZXwwKSE9KC0xfDApJjEpfDB9ZnVuY3Rpb24gTGsoYixkLGUsZixnLGgpe2I9YnwwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3ZhciBqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MCxzPTA7ZD1pO2k9aSsxNnwwO2o9ZDtjW2orMD4+Ml09MDtjW2orND4+Ml09MDtjW2orOD4+Ml09MDtrPWFbaD4+MF18MDtpZigoayYxKT09MCl7cD1oKzF8MDtoPShrJjI1NSk+Pj4xfWVsc2V7cD1jW2grOD4+Ml18MDtoPWNbaCs0Pj4yXXwwfW09cCtofDA7aWYocD4+PjA8bT4+PjApe249ais0fDA7bD1qKzF8MDtrPWorOHwwO3E9MDtkb3tvPWFbcD4+MF18MDtoPShxJjEpIT0wO2lmKGgpe3I9KGNbaj4+Ml0mLTIpKyAtMXwwO3E9Y1tuPj4yXXwwfWVsc2V7cj0xMDtxPShxJjI1NSk+Pj4xfWlmKChxfDApPT0ocnwwKSl7bGcoaixyLDEscixyLDApO2lmKChhW2o+PjBdJjEpPT0wKXtoPTE0fWVsc2V7aD0xNX19ZWxzZXtpZihoKXtoPTE1fWVsc2V7aD0xNH19aWYoKGh8MCk9PTE0KXthW2o+PjBdPShxPDwxKSsyO3I9bDtzPXErMXwwfWVsc2UgaWYoKGh8MCk9PTE1KXtyPWNbaz4+Ml18MDtzPXErMXwwO2Nbbj4+Ml09c31hW3IrcT4+MF09bzthW3Ircz4+MF09MDtwPXArMXwwO3E9YVtqPj4wXXwwfXdoaWxlKChwfDApIT0obXwwKSk7aD0oZXwwKT09LTE/LTE6ZTw8MTtlPShxJjEpPT0wP2w6Y1trPj4yXXwwfWVsc2V7aD0oZXwwKT09LTE/LTE6ZTw8MTtlPWorMXwwfWw9amIoaHwwLGZ8MCxnfDAsZXwwKXwwO2NbYiswPj4yXT0wO2NbYis0Pj4yXT0wO2NbYis4Pj4yXT0wO3M9Sm4obHwwKXwwO2s9bCtzfDA7YTpkb3tpZigoc3wwKT4wKXtmPWIrNHwwO2c9YisxfDA7ZT1iKzh8MDtuPTA7d2hpbGUoMSl7bT1hW2w+PjBdfDA7aD0obiYxKSE9MDtpZihoKXtvPShjW2I+PjJdJi0yKSsgLTF8MDtuPWNbZj4+Ml18MH1lbHNle289MTA7bj0obiYyNTUpPj4+MX1pZigobnwwKT09KG98MCkpe2xnKGIsbywxLG8sbywwKTtpZigoYVtiPj4wXSYxKT09MCl7aD0yOH1lbHNle2g9Mjl9fWVsc2V7aWYoaCl7aD0yOX1lbHNle2g9Mjh9fWlmKChofDApPT0yOCl7YVtiPj4wXT0objw8MSkrMjtwPWc7bz1uKzF8MH1lbHNlIGlmKChofDApPT0yOSl7cD1jW2U+PjJdfDA7bz1uKzF8MDtjW2Y+PjJdPW99YVtwK24+PjBdPW07YVtwK28+PjBdPTA7bD1sKzF8MDtpZigobHwwKT09KGt8MCkpe2JyZWFrIGF9bj1hW2I+PjBdfDB9fX13aGlsZSgwKTtpZigoYVtqPj4wXSYxKT09MCl7aT1kO3JldHVybn1iPWNbais4Pj4yXXwwO2lmKChifDApPT0wKXtpPWQ7cmV0dXJufXZuKGIpO2k9ZDtyZXR1cm59ZnVuY3Rpb24gTWsoYSxiKXthPWF8MDtiPWJ8MDthPWk7WWIoKChifDApPT0tMT8tMTpiPDwxKXwwKXwwO2k9YTtyZXR1cm59ZnVuY3Rpb24gTmsoYSl7YT1hfDA7dmFyIGI9MDtiPWk7aWYoKGF8MCkhPTApe3ZuKGEpfWk9YjtyZXR1cm59ZnVuY3Rpb24gT2soYSl7YT1hfDA7cmV0dXJufWZ1bmN0aW9uIFBrKGIsZCxlKXtiPWJ8MDtkPWR8MDtlPWV8MDtiPWk7aWYoKGFbZD4+MF0mMSk9PTApe2Q9ZCsxfDB9ZWxzZXtkPWNbZCs4Pj4yXXwwfWU9ZGMoZHwwLDEpfDA7aT1iO3JldHVybiBlPj4+KChlfDApIT0oLTF8MCkmMSl8MH1mdW5jdGlvbiBRayhiLGQsZSxmLGcsaCl7Yj1ifDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7dmFyIGo9MCxrPTAsbD0wLG09MCxuPTAsbz0wLHA9MCxxPTAscj0wLHM9MCx0PTAsdT0wLHY9MCx3PTAseD0wLHk9MCx6PTAsQT0wO2Q9aTtpPWkrMTc2fDA7bT1kO249ZCs0MHwwO2s9ZCsxNjh8MDtsPWQrMTcyfDA7bz1kKzE2fDA7cj1kKzh8MDtqPWQrMzJ8MDtjW28rMD4+Ml09MDtjW28rND4+Ml09MDtjW28rOD4+Ml09MDtjW3IrND4+Ml09MDtjW3I+PjJdPTE1MDcyO3M9YVtoPj4wXXwwO2lmKChzJjEpPT0wKXt3PWgrNHwwO2g9KHMmMjU1KT4+PjF9ZWxzZXt3PWNbaCs4Pj4yXXwwO2g9Y1toKzQ+PjJdfDB9dj13KyhoPDwyKXwwO0E9bTtjW0E+PjJdPTA7Y1tBKzQ+PjJdPTA7ZG97aWYodz4+PjA8dj4+PjApe3Q9biszMnwwO3U9bys0fDA7cz1vKzF8MDtoPW8rOHwwO3g9MTUwNzJ8MDt3aGlsZSgxKXtjW2w+PjJdPXc7QT0odGNbY1t4KzEyPj4yXSYzMV0ocixtLHcsdixsLG4sdCxrKXwwKT09Mjt4PWNbbD4+Ml18MDtpZihBfCh4fDApPT0od3wwKSl7YnJlYWt9aWYobj4+PjA8KGNbaz4+Ml18MCk+Pj4wKXt4PW47ZG97dz1hW3g+PjBdfDA7eT1hW28+PjBdfDA7ej0oeSYxKSE9MDtpZih6KXtwPShjW28+PjJdJi0yKSsgLTF8MDt5PWNbdT4+Ml18MH1lbHNle3A9MTA7eT0oeSYyNTUpPj4+MX1pZigoeXwwKT09KHB8MCkpe2xnKG8scCwxLHAscCwwKTtpZigoYVtvPj4wXSYxKT09MCl7cD0xOH1lbHNle3A9MTl9fWVsc2V7aWYoeil7cD0xOX1lbHNle3A9MTh9fWlmKChwfDApPT0xOCl7cD0wO2Fbbz4+MF09KHk8PDEpKzI7QT1zO3o9eSsxfDB9ZWxzZSBpZigocHwwKT09MTkpe3A9MDtBPWNbaD4+Ml18MDt6PXkrMXwwO2NbdT4+Ml09en1hW0EreT4+MF09dzthW0Erej4+MF09MDt4PXgrMXwwfXdoaWxlKHg+Pj4wPChjW2s+PjJdfDApPj4+MCk7dz1jW2w+PjJdfDB9ZWxzZXt3PXh9aWYoISh3Pj4+MDx2Pj4+MCkpe3A9MjQ7YnJlYWt9eD1jW3I+PjJdfDB9aWYoKHB8MCk9PTI0KXtxPShhW28+PjBdJjEpPT0wO2JyZWFrfW9rKDE0Mjk2KX1lbHNle3E9MX19d2hpbGUoMCk7aWYocSl7cD1vKzF8MH1lbHNle3A9Y1tvKzg+PjJdfDB9cD1qYigoKGV8MCk9PS0xPy0xOmU8PDEpfDAsZnwwLGd8MCxwfDApfDA7Y1tiKzA+PjJdPTA7Y1tiKzQ+PjJdPTA7Y1tiKzg+PjJdPTA7Y1tqKzQ+PjJdPTA7Y1tqPj4yXT0xNTE3NjtBPUpuKHB8MCl8MDtxPXArQXwwO3o9bTtjW3o+PjJdPTA7Y1t6KzQ+PjJdPTA7YTpkb3tpZigoQXwwKT4wKXtlPXE7cj1uKzEyOHwwO2c9Yis0fDA7Zj1iKzh8MDtoPTE1MTc2fDA7d2hpbGUoMSl7Y1tsPj4yXT1wO0E9KHRjW2NbaCsxNj4+Ml0mMzFdKGosbSxwLChlLXB8MCk+MzI/cCszMnwwOnEsbCxuLHIsayl8MCk9PTI7aD1jW2w+PjJdfDA7aWYoQXwoaHwwKT09KHB8MCkpe2JyZWFrfWlmKG4+Pj4wPChjW2s+PjJdfDApPj4+MCl7cz1uO2Rve2g9Y1tzPj4yXXwwO3Q9YVtiPj4wXXwwO3U9KHQmMSkhPTA7aWYodSl7cD0oY1tiPj4yXSYtMikrIC0xfDA7dD1jW2c+PjJdfDB9ZWxzZXtwPTE7dD0odCYyNTUpPj4+MX1pZigodHwwKT09KHB8MCkpe3BnKGIscCwxLHAscCwwLDApO2lmKChhW2I+PjBdJjEpPT0wKXtwPTQzfWVsc2V7cD00NH19ZWxzZXtpZih1KXtwPTQ0fWVsc2V7cD00M319aWYoKHB8MCk9PTQzKXthW2I+PjBdPSh0PDwxKSsyO3Y9Zzt1PXQrMXwwfWVsc2UgaWYoKHB8MCk9PTQ0KXt2PWNbZj4+Ml18MDt1PXQrMXwwO2NbZz4+Ml09dX1jW3YrKHQ8PDIpPj4yXT1oO2NbdisodTw8Mik+PjJdPTA7cz1zKzR8MH13aGlsZShzPj4+MDwoY1trPj4yXXwwKT4+PjApO3A9Y1tsPj4yXXwwfWVsc2V7cD1ofWlmKCEocD4+PjA8cT4+PjApKXticmVhayBhfWg9Y1tqPj4yXXwwfW9rKDE0Mjk2KX19d2hpbGUoMCk7aWYoKGFbbz4+MF0mMSk9PTApe2k9ZDtyZXR1cm59Yj1jW28rOD4+Ml18MDtpZigoYnwwKT09MCl7aT1kO3JldHVybn12bihiKTtpPWQ7cmV0dXJufWZ1bmN0aW9uIFJrKGEsYil7YT1hfDA7Yj1ifDA7YT1pO1liKCgoYnwwKT09LTE/LTE6Yjw8MSl8MCl8MDtpPWE7cmV0dXJufWZ1bmN0aW9uIFNrKGIpe2I9YnwwO3ZhciBkPTAsZT0wO2Q9aTtjW2I+PjJdPTEzNTQ0O2I9Yis4fDA7ZT1jW2I+PjJdfDA7aWYoKGFbMTMzNjhdfDApPT0wPyhRYSgxMzM2OCl8MCkhPTA6MCl7Y1szMzQwXT1rYigyMTQ3NDgzNjQ3LDEzMzc2LDApfDA7JGEoMTMzNjgpfWlmKChlfDApPT0oY1szMzQwXXwwKSl7aT1kO3JldHVybn1WYihjW2I+PjJdfDApO2k9ZDtyZXR1cm59ZnVuY3Rpb24gVGsoKXt2YXIgYj0wLGQ9MCxlPTA7ZD1YYSg4KXwwO2NbZD4+Ml09OTkwNDt3aGlsZSgxKXtlPXVuKDE5KXwwO2lmKChlfDApIT0wKXtiPTc7YnJlYWt9ZT1jWzU2NjZdfDA7Y1s1NjY2XT1lKzA7aWYoKGV8MCk9PTApe2JyZWFrfXNjW2UmMzFdKCl9aWYoKGJ8MCk9PTcpe2NbZSs0Pj4yXT02O2NbZT4+Ml09NjtiPWUrMTJ8MDtjW2QrND4+Ml09YjtjW2UrOD4+Ml09MDthW2IrMD4+MF09YVsxMzM1Mj4+MF18MDthW2IrMT4+MF09YVsxMzM1Mz4+MF18MDthW2IrMj4+MF09YVsxMzM1ND4+MF18MDthW2IrMz4+MF09YVsxMzM1NT4+MF18MDthW2IrND4+MF09YVsxMzM1Nj4+MF18MDthW2IrNT4+MF09YVsxMzM1Nz4+MF18MDthW2IrNj4+MF09YVsxMzM1OD4+MF18MDtjW2Q+PjJdPTk5ODQ7d2IoZHwwLDEwMDI0LDEwNCl9ZT1YYSg0KXwwO2NbZT4+Ml09MjI2ODA7d2IoZXwwLDIyNzI4LDIwNil9ZnVuY3Rpb24gVWsoYixkLGUpe2I9YnwwO2Q9ZHwwO2U9ZXwwO3ZhciBmPTAsZz0wLGg9MCxqPTAsaz0wLGw9MCxtPTAsbj0wLG89MCxwPTAscT0wLHI9MDtmPWk7aD1kKzR8MDtjW2g+PjJdPShjW2g+PjJdfDApKzE7aD1iKzEyfDA7bD1jW2g+PjJdfDA7Zz1iKzh8MDtrPWNbZz4+Ml18MDtxPWw7cD1rO2o9cS1wPj4yO2Rve2lmKCEoaj4+PjA+ZT4+PjApKXtvPWUrMXwwO2lmKCEoaj4+PjA8bz4+PjApKXtpZighKGo+Pj4wPm8+Pj4wKSl7YnJlYWt9aj1rKyhvPDwyKXwwO2lmKChsfDApPT0oanwwKSl7YnJlYWt9Y1toPj4yXT1sKyh+KChsKyAtNCsoMC1qKXwwKT4+PjIpPDwyKTticmVha31uPW8tanwwO2s9YisxNnwwO3I9Y1trPj4yXXwwO2Rve2lmKHItcT4+Mj4+PjA8bj4+PjApe2w9YisyNHwwO2lmKG8+Pj4wPjEwNzM3NDE4MjMpe1RrKCl9cD1yLXB8MDtpZihwPj4yPj4+MDw1MzY4NzA5MTEpe3I9cD4+MTtvPXI+Pj4wPG8+Pj4wP286cjtpZigob3wwKSE9MCl7cD1iKzEzNnwwO2lmKChhW3A+PjBdfDApPT0wJm8+Pj4wPDI5KXthW3A+PjBdPTE7cD1sfWVsc2V7bT0xNH19ZWxzZXtvPTA7cD0wfX1lbHNle289MTA3Mzc0MTgyMzttPTE0fWRve2lmKChtfDApPT0xNCl7cT1vPDwyO3E9KHF8MCk9PTA/MTpxO3doaWxlKDEpe3A9dW4ocSl8MDtpZigocHwwKSE9MCl7bT0yMDticmVha31wPWNbNTY2Nl18MDtjWzU2NjZdPXArMDtpZigocHwwKT09MCl7YnJlYWt9c2NbcCYzMV0oKX1pZigobXwwKT09MjApe2JyZWFrfXI9WGEoNCl8MDtjW3I+PjJdPTIyNjgwO3diKHJ8MCwyMjcyOCwyMDYpfX13aGlsZSgwKTttPXArKGo8PDIpfDA7ZG97aWYoKG18MCk9PTApe209MH1lbHNle2NbbT4+Ml09MH1tPW0rNHwwO249bisgLTF8MH13aGlsZSgobnwwKSE9MCk7bj1jW2c+PjJdfDA7cT0oY1toPj4yXXwwKS1ufDA7cj1wKyhqLShxPj4yKTw8Mil8MDtMbihyfDAsbnwwLHF8MCl8MDtjW2c+PjJdPXI7Y1toPj4yXT1tO2Nbaz4+Ml09cCsobzw8Mik7aWYoKG58MCkhPTApe2lmKChsfDApPT0obnwwKSl7YVtiKzEzNj4+MF09MDticmVha31lbHNle3ZuKG4pO2JyZWFrfX19ZWxzZXtkb3tpZigobHwwKT09MCl7aj0wfWVsc2V7Y1tsPj4yXT0wO2o9Y1toPj4yXXwwfWw9ais0fDA7Y1toPj4yXT1sO249bisgLTF8MH13aGlsZSgobnwwKSE9MCl9fXdoaWxlKDApO2s9Y1tnPj4yXXwwfX13aGlsZSgwKTtoPWNbaysoZTw8Mik+PjJdfDA7aWYoKGh8MCk9PTApe3I9aztyPXIrKGU8PDIpfDA7Y1tyPj4yXT1kO2k9ZjtyZXR1cm59cT1oKzR8MDtyPWNbcT4+Ml18MDtjW3E+PjJdPXIrIC0xO2lmKChyfDApPT0wKXtsY1tjWyhjW2g+PjJdfDApKzg+PjJdJjI1NV0oaCl9cj1jW2c+PjJdfDA7cj1yKyhlPDwyKXwwO2Nbcj4+Ml09ZDtpPWY7cmV0dXJufWZ1bmN0aW9uIFZrKGEpe2E9YXwwO3ZhciBiPTA7Yj1pO1drKGEpO2lmKChhfDApIT0wKXt2bihhKX1pPWI7cmV0dXJufWZ1bmN0aW9uIFdrKGIpe2I9YnwwO3ZhciBkPTAsZT0wLGY9MCxnPTAsaD0wLGo9MCxrPTAsbD0wO2U9aTtjW2I+PjJdPTEzMzkyO2Q9YisxMnwwO2o9Y1tkPj4yXXwwO2Y9Yis4fDA7az1jW2Y+PjJdfDA7aWYoKGp8MCkhPShrfDApKXtoPTA7d2hpbGUoMSl7bD1jW2srKGg8PDIpPj4yXXwwO2lmKChsfDApIT0wKXtqPWwrNHwwO2s9Y1tqPj4yXXwwO2Nbaj4+Ml09aysgLTE7aWYoKGt8MCk9PTApe2xjW2NbKGNbbD4+Ml18MCkrOD4+Ml0mMjU1XShsKX1qPWNbZD4+Ml18MDtrPWNbZj4+Ml18MH1oPWgrMXwwO2lmKCEoaD4+PjA8ai1rPj4yPj4+MCkpe2o9azticmVha319fWlmKCEoKGFbYisxNDQ+PjBdJjEpPT0wKT8oZz1jW2IrMTUyPj4yXXwwLChnfDApIT0wKTowKXt2bihnKTtqPWNbZj4+Ml18MH1pZigoanwwKT09MCl7aT1lO3JldHVybn1mPWNbZD4+Ml18MDtpZigoZnwwKSE9KGp8MCkpe2NbZD4+Ml09ZisofigoZisgLTQrKDAtail8MCk+Pj4yKTw8Mil9aWYoKGIrMjR8MCk9PShqfDApKXthW2IrMTM2Pj4wXT0wO2k9ZTtyZXR1cm59ZWxzZXt2bihqKTtpPWU7cmV0dXJufX0KCgoKZnVuY3Rpb24gWm4oYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGhjW2EmNjNdKGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIF9uKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoMCxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiAkbihhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGthKDEsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gYW8oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBrYSgyLGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIGJvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoMyxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBjbyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGthKDQsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gZW8oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBrYSg1LGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIGZvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoNixhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBnbyhhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7cmV0dXJuIGthKDcsYXwwLGJ8MCxjfDApfDB9ZnVuY3Rpb24gaG8oYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO3JldHVybiBrYSg4LGF8MCxifDAsY3wwKXwwfWZ1bmN0aW9uIGlvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4ga2EoOSxhfDAsYnwwLGN8MCl8MH1mdW5jdGlvbiBqbyhhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2ljW2EmNjNdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24ga28oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIGxvKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwKX1mdW5jdGlvbiBtbyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gbm8oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIG9vKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwKX1mdW5jdGlvbiBwbyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gcW8oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIHJvKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwKX1mdW5jdGlvbiBzbyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gdG8oYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7a2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDApfWZ1bmN0aW9uIHVvKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtqY1thJjMxXShifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiB2byhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gd28oYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtrYSgxLGF8MCxifDAsY3wwLGR8MCxlfDApfWZ1bmN0aW9uIHhvKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7a2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwKX1mdW5jdGlvbiB5byhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gem8oYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtrYSg0LGF8MCxifDAsY3wwLGR8MCxlfDApfWZ1bmN0aW9uIEFvKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7a2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwKX1mdW5jdGlvbiBCbyhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gQ28oYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtrYSg3LGF8MCxifDAsY3wwLGR8MCxlfDApfWZ1bmN0aW9uIERvKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7a2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwKX1mdW5jdGlvbiBFbyhhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2thKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gRm8oYSl7YT1hfDA7cmV0dXJuIGtjW2EmMzFdKCl8MH1mdW5jdGlvbiBHbygpe3JldHVybiBrYSgwKXwwfWZ1bmN0aW9uIEhvKCl7cmV0dXJuIGthKDEpfDB9ZnVuY3Rpb24gSW8oKXtyZXR1cm4ga2EoMil8MH1mdW5jdGlvbiBKbygpe3JldHVybiBrYSgzKXwwfWZ1bmN0aW9uIEtvKCl7cmV0dXJuIGthKDQpfDB9ZnVuY3Rpb24gTG8oKXtyZXR1cm4ga2EoNSl8MH1mdW5jdGlvbiBNbygpe3JldHVybiBrYSg2KXwwfWZ1bmN0aW9uIE5vKCl7cmV0dXJuIGthKDcpfDB9ZnVuY3Rpb24gT28oKXtyZXR1cm4ga2EoOCl8MH1mdW5jdGlvbiBQbygpe3JldHVybiBrYSg5KXwwfWZ1bmN0aW9uIFFvKGEsYil7YT1hfDA7Yj1ifDA7bGNbYSYyNTVdKGJ8MCl9ZnVuY3Rpb24gUm8oYSl7YT1hfDA7a2EoMCxhfDApfWZ1bmN0aW9uIFNvKGEpe2E9YXwwO2thKDEsYXwwKX1mdW5jdGlvbiBUbyhhKXthPWF8MDtrYSgyLGF8MCl9ZnVuY3Rpb24gVW8oYSl7YT1hfDA7a2EoMyxhfDApfWZ1bmN0aW9uIFZvKGEpe2E9YXwwO2thKDQsYXwwKX1mdW5jdGlvbiBXbyhhKXthPWF8MDtrYSg1LGF8MCl9ZnVuY3Rpb24gWG8oYSl7YT1hfDA7a2EoNixhfDApfWZ1bmN0aW9uIFlvKGEpe2E9YXwwO2thKDcsYXwwKX1mdW5jdGlvbiBabyhhKXthPWF8MDtrYSg4LGF8MCl9ZnVuY3Rpb24gX28oYSl7YT1hfDA7a2EoOSxhfDApfWZ1bmN0aW9uICRvKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDttY1thJjEyN10oYnwwLGN8MCl9ZnVuY3Rpb24gYXAoYSxiKXthPWF8MDtiPWJ8MDtrYSgwLGF8MCxifDApfWZ1bmN0aW9uIGJwKGEsYil7YT1hfDA7Yj1ifDA7a2EoMSxhfDAsYnwwKX1mdW5jdGlvbiBjcChhLGIpe2E9YXwwO2I9YnwwO2thKDIsYXwwLGJ8MCl9ZnVuY3Rpb24gZHAoYSxiKXthPWF8MDtiPWJ8MDtrYSgzLGF8MCxifDApfWZ1bmN0aW9uIGVwKGEsYil7YT1hfDA7Yj1ifDA7a2EoNCxhfDAsYnwwKX1mdW5jdGlvbiBmcChhLGIpe2E9YXwwO2I9YnwwO2thKDUsYXwwLGJ8MCl9ZnVuY3Rpb24gZ3AoYSxiKXthPWF8MDtiPWJ8MDtrYSg2LGF8MCxifDApfWZ1bmN0aW9uIGhwKGEsYil7YT1hfDA7Yj1ifDA7a2EoNyxhfDAsYnwwKX1mdW5jdGlvbiBpcChhLGIpe2E9YXwwO2I9YnwwO2thKDgsYXwwLGJ8MCl9ZnVuY3Rpb24ganAoYSxiKXthPWF8MDtiPWJ8MDtrYSg5LGF8MCxifDApfWZ1bmN0aW9uIGtwKGEsYixjLGQsZSxmLGcsaCxpLGope2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2o9anwwO25jW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDAsanwwKX1mdW5jdGlvbiBscChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gbXAoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIG5wKGEsYixjLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDAsaXwwKX1mdW5jdGlvbiBvcChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gcHAoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIHFwKGEsYixjLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDAsaXwwKX1mdW5jdGlvbiBycChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gc3AoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIHRwKGEsYixjLGQsZSxmLGcsaCxpKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtpPWl8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDAsaXwwKX1mdW5jdGlvbiB1cChhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7a2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwLGl8MCl9ZnVuY3Rpb24gdnAoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4gb2NbYSYxMjddKGJ8MCl8MH1mdW5jdGlvbiB3cChhKXthPWF8MDtyZXR1cm4ga2EoMCxhfDApfDB9ZnVuY3Rpb24geHAoYSl7YT1hfDA7cmV0dXJuIGthKDEsYXwwKXwwfWZ1bmN0aW9uIHlwKGEpe2E9YXwwO3JldHVybiBrYSgyLGF8MCl8MH1mdW5jdGlvbiB6cChhKXthPWF8MDtyZXR1cm4ga2EoMyxhfDApfDB9ZnVuY3Rpb24gQXAoYSl7YT1hfDA7cmV0dXJuIGthKDQsYXwwKXwwfWZ1bmN0aW9uIEJwKGEpe2E9YXwwO3JldHVybiBrYSg1LGF8MCl8MH1mdW5jdGlvbiBDcChhKXthPWF8MDtyZXR1cm4ga2EoNixhfDApfDB9ZnVuY3Rpb24gRHAoYSl7YT1hfDA7cmV0dXJuIGthKDcsYXwwKXwwfWZ1bmN0aW9uIEVwKGEpe2E9YXwwO3JldHVybiBrYSg4LGF8MCl8MH1mdW5jdGlvbiBGcChhKXthPWF8MDtyZXR1cm4ga2EoOSxhfDApfDB9ZnVuY3Rpb24gR3AoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPStoO3BjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLCtoKX1mdW5jdGlvbiBIcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIElwKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9K2c7a2EoMSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCwrZyl9ZnVuY3Rpb24gSnAoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBLcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIExwKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9K2c7a2EoNCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCwrZyl9ZnVuY3Rpb24gTXAoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBOcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIE9wKGEsYixjLGQsZSxmLGcpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9K2c7a2EoNyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCwrZyl9ZnVuY3Rpb24gUHAoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBRcChhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2thKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsK2cpfWZ1bmN0aW9uIFJwKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3FjW2EmMzFdKGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBTcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoMCxhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gVHAoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2thKDEsYXwwLGJ8MCxjfDApfWZ1bmN0aW9uIFVwKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtrYSgyLGF8MCxifDAsY3wwKX1mdW5jdGlvbiBWcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoMyxhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gV3AoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2thKDQsYXwwLGJ8MCxjfDApfWZ1bmN0aW9uIFhwKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtrYSg1LGF8MCxifDAsY3wwKX1mdW5jdGlvbiBZcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoNixhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gWnAoYSxiLGMpe2E9YXwwO2I9YnwwO2M9Y3wwO2thKDcsYXwwLGJ8MCxjfDApfWZ1bmN0aW9uIF9wKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtrYSg4LGF8MCxifDAsY3wwKX1mdW5jdGlvbiAkcChhLGIsYyl7YT1hfDA7Yj1ifDA7Yz1jfDA7a2EoOSxhfDAsYnwwLGN8MCl9ZnVuY3Rpb24gYXEoYSxiLGMsZCxlLGYsZyl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz0rZztyY1thJjMxXShifDAsY3wwLGR8MCxlfDAsZnwwLCtnKX1mdW5jdGlvbiBicShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSgwLGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGNxKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPStmO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCwrZil9ZnVuY3Rpb24gZHEoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9K2Y7a2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwLCtmKX1mdW5jdGlvbiBlcShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSgzLGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGZxKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPStmO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCwrZil9ZnVuY3Rpb24gZ3EoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9K2Y7a2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwLCtmKX1mdW5jdGlvbiBocShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSg2LGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGlxKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPStmO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCwrZil9ZnVuY3Rpb24ganEoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9K2Y7a2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwLCtmKX1mdW5jdGlvbiBrcShhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtrYSg5LGF8MCxifDAsY3wwLGR8MCxlfDAsK2YpfWZ1bmN0aW9uIGxxKGEpe2E9YXwwO3NjW2EmMzFdKCl9ZnVuY3Rpb24gbXEoKXtrYSgwKX1mdW5jdGlvbiBucSgpe2thKDEpfWZ1bmN0aW9uIG9xKCl7a2EoMil9ZnVuY3Rpb24gcHEoKXtrYSgzKX1mdW5jdGlvbiBxcSgpe2thKDQpfWZ1bmN0aW9uIHJxKCl7a2EoNSl9ZnVuY3Rpb24gc3EoKXtrYSg2KX1mdW5jdGlvbiB0cSgpe2thKDcpfWZ1bmN0aW9uIHVxKCl7a2EoOCl9ZnVuY3Rpb24gdnEoKXtrYSg5KX1mdW5jdGlvbiB3cShhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7cmV0dXJuIHRjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfDB9ZnVuY3Rpb24geHEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIHlxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7cmV0dXJuIGthKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl8MH1mdW5jdGlvbiB6cShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3JldHVybiBrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfDB9ZnVuY3Rpb24gQXEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIEJxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7cmV0dXJuIGthKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl8MH1mdW5jdGlvbiBDcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3JldHVybiBrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfDB9ZnVuY3Rpb24gRHEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIEVxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7cmV0dXJuIGthKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl8MH1mdW5jdGlvbiBGcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO3JldHVybiBrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfDB9ZnVuY3Rpb24gR3EoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtyZXR1cm4ga2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKXwwfWZ1bmN0aW9uIEhxKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIHVjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBJcShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoMCxhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gSnEoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGthKDEsYXwwLGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIEtxKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3JldHVybiBrYSgyLGF8MCxifDAsY3wwLGR8MCl8MH1mdW5jdGlvbiBMcShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoMyxhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gTXEoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGthKDQsYXwwLGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIE5xKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3JldHVybiBrYSg1LGF8MCxifDAsY3wwLGR8MCl8MH1mdW5jdGlvbiBPcShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoNixhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gUHEoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7cmV0dXJuIGthKDcsYXwwLGJ8MCxjfDAsZHwwKXwwfWZ1bmN0aW9uIFFxKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO3JldHVybiBrYSg4LGF8MCxifDAsY3wwLGR8MCl8MH1mdW5jdGlvbiBScShhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtyZXR1cm4ga2EoOSxhfDAsYnwwLGN8MCxkfDApfDB9ZnVuY3Rpb24gU3EoYSxiLGMsZCxlLGYsZyxoLGkpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2k9aXwwO3ZjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCxpfDApfWZ1bmN0aW9uIFRxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoMCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBVcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2thKDEsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24gVnEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfWZ1bmN0aW9uIFdxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoMyxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBYcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2thKDQsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24gWXEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfWZ1bmN0aW9uIFpxKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoNixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBfcShhLGIsYyxkLGUsZixnLGgpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2c9Z3wwO2g9aHwwO2thKDcsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDAsZ3wwLGh8MCl9ZnVuY3Rpb24gJHEoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCxofDApfWZ1bmN0aW9uIGFyKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7a2EoOSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCxnfDAsaHwwKX1mdW5jdGlvbiBicihhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDt3Y1thJjYzXShifDAsY3wwLGR8MCxlfDAsZnwwLGd8MCl9ZnVuY3Rpb24gY3IoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIGRyKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtrYSgxLGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiBlcihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7a2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCl9ZnVuY3Rpb24gZnIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIGdyKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtrYSg0LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiBocihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7a2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCl9ZnVuY3Rpb24gaXIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIGpyKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtrYSg3LGF8MCxifDAsY3wwLGR8MCxlfDAsZnwwKX1mdW5jdGlvbiBrcihhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7a2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwLGZ8MCl9ZnVuY3Rpb24gbHIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO2thKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCxmfDApfWZ1bmN0aW9uIG1yKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtyZXR1cm4geGNbYSY2M10oYnwwLGN8MCl8MH1mdW5jdGlvbiBucihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSgwLGF8MCxifDApfDB9ZnVuY3Rpb24gb3IoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4ga2EoMSxhfDAsYnwwKXwwfWZ1bmN0aW9uIHByKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGthKDIsYXwwLGJ8MCl8MH1mdW5jdGlvbiBxcihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSgzLGF8MCxifDApfDB9ZnVuY3Rpb24gcnIoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4ga2EoNCxhfDAsYnwwKXwwfWZ1bmN0aW9uIHNyKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGthKDUsYXwwLGJ8MCl8MH1mdW5jdGlvbiB0cihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSg2LGF8MCxifDApfDB9ZnVuY3Rpb24gdXIoYSxiKXthPWF8MDtiPWJ8MDtyZXR1cm4ga2EoNyxhfDAsYnwwKXwwfWZ1bmN0aW9uIHZyKGEsYil7YT1hfDA7Yj1ifDA7cmV0dXJuIGthKDgsYXwwLGJ8MCl8MH1mdW5jdGlvbiB3cihhLGIpe2E9YXwwO2I9YnwwO3JldHVybiBrYSg5LGF8MCxifDApfDB9ZnVuY3Rpb24geHIoYSxiLGMsZCxlLGYpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2Y9ZnwwO3JldHVybiB5Y1thJjYzXShifDAsY3wwLGR8MCxlfDAsZnwwKXwwfWZ1bmN0aW9uIHlyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDAsYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiB6cihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBrYSgxLGF8MCxifDAsY3wwLGR8MCxlfDApfDB9ZnVuY3Rpb24gQXIoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4ga2EoMixhfDAsYnwwLGN8MCxkfDAsZXwwKXwwfWZ1bmN0aW9uIEJyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDMsYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBDcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBrYSg0LGF8MCxifDAsY3wwLGR8MCxlfDApfDB9ZnVuY3Rpb24gRHIoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4ga2EoNSxhfDAsYnwwLGN8MCxkfDAsZXwwKXwwfWZ1bmN0aW9uIEVyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDYsYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBGcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3JldHVybiBrYSg3LGF8MCxifDAsY3wwLGR8MCxlfDApfDB9ZnVuY3Rpb24gR3IoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtyZXR1cm4ga2EoOCxhfDAsYnwwLGN8MCxkfDAsZXwwKXwwfWZ1bmN0aW9uIEhyKGEsYixjLGQsZSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7cmV0dXJuIGthKDksYXwwLGJ8MCxjfDAsZHwwLGV8MCl8MH1mdW5jdGlvbiBJcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO3pjW2EmMzFdKGJ8MCxjfDAsZHwwLGV8MCl9ZnVuY3Rpb24gSnIoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoMCxhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIEtyKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2thKDEsYXwwLGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBMcihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtrYSgyLGF8MCxifDAsY3wwLGR8MCl9ZnVuY3Rpb24gTXIoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoMyxhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIE5yKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2thKDQsYXwwLGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBPcihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtrYSg1LGF8MCxifDAsY3wwLGR8MCl9ZnVuY3Rpb24gUHIoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoNixhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIFFyKGEsYixjLGQpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2thKDcsYXwwLGJ8MCxjfDAsZHwwKX1mdW5jdGlvbiBScihhLGIsYyxkKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtrYSg4LGF8MCxifDAsY3wwLGR8MCl9ZnVuY3Rpb24gU3IoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7a2EoOSxhfDAsYnwwLGN8MCxkfDApfWZ1bmN0aW9uIFRyKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtmYSgwKTtyZXR1cm4gMH1mdW5jdGlvbiBVcihhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtmYSgxKX1mdW5jdGlvbiBWcihhLGIsYyxkLGUpe2E9YXwwO2I9YnwwO2M9Y3wwO2Q9ZHwwO2U9ZXwwO2ZhKDIpfWZ1bmN0aW9uIFdyKCl7ZmEoMyk7cmV0dXJuIDB9ZnVuY3Rpb24gWHIoYSl7YT1hfDA7ZmEoNCl9ZnVuY3Rpb24gWXIoYSxiKXthPWF8MDtiPWJ8MDtmYSg1KX1mdW5jdGlvbiBacihhLGIsYyxkLGUsZixnLGgsaSl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7aT1pfDA7ZmEoNil9ZnVuY3Rpb24gX3IoYSl7YT1hfDA7ZmEoNyk7cmV0dXJuIDB9ZnVuY3Rpb24gJHIoYSl7YT1hfDA7cmV0dXJuIEFiKGF8MCl8MH1mdW5jdGlvbiBhcyhhLGIsYyxkLGUsZixnKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPStnO2ZhKDgpfWZ1bmN0aW9uIGJzKGEsYixjKXthPWF8MDtiPWJ8MDtjPWN8MDtmYSg5KX1mdW5jdGlvbiBjcyhhLGIsYyxkLGUsZil7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj0rZjtmYSgxMCl9ZnVuY3Rpb24gZHMoKXtmYSgxMSl9ZnVuY3Rpb24gZXMoYSxiLGMsZCxlLGYsZyxoKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtnPWd8MDtoPWh8MDtmYSgxMik7cmV0dXJuIDB9ZnVuY3Rpb24gZnMoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZmEoMTMpO3JldHVybiAwfWZ1bmN0aW9uIGdzKGEsYixjLGQsZSxmLGcsaCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZT1lfDA7Zj1mfDA7Zz1nfDA7aD1ofDA7ZmEoMTQpfWZ1bmN0aW9uIGhzKGEsYixjLGQsZSxmKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmPWZ8MDtmYSgxNSl9ZnVuY3Rpb24gaXMoYSxiKXthPWF8MDtiPWJ8MDtmYSgxNik7cmV0dXJuIDB9ZnVuY3Rpb24ganMoYSxiLGMsZCxlKXthPWF8MDtiPWJ8MDtjPWN8MDtkPWR8MDtlPWV8MDtmYSgxNyk7cmV0dXJuIDB9ZnVuY3Rpb24ga3MoYSxiLGMsZCl7YT1hfDA7Yj1ifDA7Yz1jfDA7ZD1kfDA7ZmEoMTgpfQoKCgoKLy8gRU1TQ1JJUFRFTl9FTkRfRlVOQ1MKdmFyIGhjPVtUcixUcixfbixUciwkbixUcixhbyxUcixibyxUcixjbyxUcixlbyxUcixmbyxUcixnbyxUcixobyxUcixpbyxUcix2ZyxBZyxFZyxKZyxPZyxrZixTZyx4ZixQZixRZixEaCxJaCxLayxQayxxbCxzbCx2bCxibCxnbCxpbCxsbCxobixtbixnbixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcixUcl07dmFyIGljPVtVcixVcixrbyxVcixsbyxVcixtbyxVcixubyxVcixvbyxVcixwbyxVcixxbyxVcixybyxVcixzbyxVcix0byxVcixMaCxOaCxPaCxQaCxRaCxSaCxTaCxUaCxVaCxWaCxXaCwkaCxiaSxjaSxkaSxlaSxmaSxnaSxoaSxpaSxqaSxraSx5aSxBaSxNaSxPaSxYaSxZaSxaaSxfaSwkaSxnaixoaixpaixqaixraixCayxIayxVcixVcixVcixVcl07dmFyIGpjPVtWcixWcix2byxWcix3byxWcix4byxWcix5byxWcix6byxWcixBbyxWcixCbyxWcixDbyxWcixEbyxWcixFbyxWcixxbixwbixvbixWcixWcixWcixWcixWcixWcixWcl07dmFyIGtjPVtXcixXcixHbyxXcixIbyxXcixJbyxXcixKbyxXcixLbyxXcixMbyxXcixNbyxXcixObyxXcixPbyxXcixQbyxXcixPYyxXcixXcixXcixXcixXcixXcixXcixXcixXcl07dmFyIGxjPVtYcixYcixSbyxYcixTbyxYcixUbyxYcixVbyxYcixWbyxYcixXbyxYcixYbyxYcixZbyxYcixabyxYcixfbyxYcixUYyxVYyxoZCxpZCxuZCxvZCx2ZCx3ZCx4ZCx6ZCxCZCxDZCxEZCxFZCxGZCxIZCxKZCxLZCxMZCxNZCxOZCxQZCxSZCxTZCxUZCxVZCxWZCxYZCxZZCwkZCxaZCxhZSxfZCxiZSxWZyxVZyxYZyxXZyxjZSxkZSxqZSxrZSxsZSxuZSx0ZSx1ZSxzZSx2ZSxyZSx3ZSx4ZSx5ZSx6ZSxBZSxCZSxDZSxFZSxGZSxJZSxKZSxPZSxQZSxOZSxRZSxxZSxSZSxUZSxVZSxWZSxYZSxZZSxaZSxfZSxhZixmZixnZixtZixuZix0Zix1Zix6ZixBZixJZixIZixMZixLZixOZixfZixaZixUZiwkZixYZixhZyx0ZyxzZyxIZyxHZyxfZyxaZyxhaCwkZyxkaCxjaCxmaCxlaCxuaCxtaCxwaCxvaCx2aCx1aCxyZyx3aCx0aCx4aCx6aCx5aCxfayxGaCxFaCxLaCxKaCxfaCxaaCx0aSxzaSxIaSxHaSxWaSxVaSxlaixkaixvaixuaixyaixxaix1aix0aixGaixFaixRaixQaiwkaixfaixrayxqayxzayxyayx4ayx3ayxEayxDayxKayxJayxPayxOayxXayxWayxvbCxubCxTayxGbCxlbSxkbSxnbSxmbSxBaCxaayxhbCx4bCxObCxWbCxibSxjbSxZbSxYbSxfbSxjbiwkbSxhbixmbixibixkbixlbix6bix5biwkayxEZSxiZyxSYyxlZixtayx2bixUbSxTbSxSbSxRbSxQbSxPbSxmZyxtZyxYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcixYcl07dmFyIG1jPVtZcixZcixhcCxZcixicCxZcixjcCxZcixkcCxZcixlcCxZcixmcCxZcixncCxZcixocCxZcixpcCxZcixqcCxZcixnZCxBZCxJZCxRZCx1ZyxIZSxLZSxoZixvZix2ZixCZixJZyx4aix5aix6aixBaixDaixEaixJaixKaixLaixMaixOaixPaixUaixVaixWaixXaixZaixaaixjayxkayxlayxmayxoayxpayxNayxSayxsbSxubSxwbSxtbSxvbSxxbSxKYyxZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcixZcl07dmFyIG5jPVtacixacixscCxacixtcCxacixucCxacixvcCxacixwcCxacixxcCxacixycCxacixzcCxacix0cCxacix1cCxacixhaixsaixacixacixacixacixacixacixacixacl07dmFyIG9jPVtfcixfcix3cCxfcix4cCxfcix5cCxfcix6cCxfcixBcCxfcixCcCxfcixDcCxfcixEcCxfcixFcCxfcixGcCxfcixNZix5Zyx6ZyxnZSxDZywkcixHZSxNZSxqZixOZyxQZyxRZyxNZyxwZixxZix3ZixCZyxDZixEZixKZixSZixVZixyaCxXaSxybSx0bSx2bSxCbSxEbSx4bSx6bSxmaixzbSx1bSx3bSxDbSxFbSx5bSxBbSx2aix3aixCaixHaixIaixNaixSaixTaixYaixhayxiayxnayxKbCxLbCxNbCxobSxqbSxpbSxrbSxCbCxDbCxFbCxSbCxTbCxVbCxabCxfbCxhbSxabSxBbixRYyxQYyxLYyxfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcixfcl07dmFyIHBjPVthcyxhcyxIcCxhcyxJcCxhcyxKcCxhcyxLcCxhcyxMcCxhcyxNcCxhcyxOcCxhcyxPcCxhcyxQcCxhcyxRcCxhcyx5ayxFayxhcyxhcyxhcyxhcyxhcyxhcyxhcyxhc107dmFyIHFjPVticyxicyxTcCxicyxUcCxicyxVcCxicyxWcCxicyxXcCxicyxYcCxicyxZcCxicyxacCxicyxfcCxicywkcCxicyxPZixTZixXZixWZixzaCxJYyxNYyxicyxicyxic107dmFyIHJjPVtjcyxjcyxicSxjcyxjcSxjcyxkcSxjcyxlcSxjcyxmcSxjcyxncSxjcyxocSxjcyxpcSxjcyxqcSxjcyxrcSxjcyxCaSxFaSxQaSxSaSxjcyxjcyxjcyxjcyxjcyxjc107dmFyIHNjPVtkcyxkcyxtcSxkcyxucSxkcyxvcSxkcyxwcSxkcyxxcSxkcyxycSxkcyxzcSxkcyx0cSxkcyx1cSxkcyx2cSxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkcyxkc107dmFyIHRjPVtlcyxlcyx4cSxlcyx5cSxlcyx6cSxlcyxBcSxlcyxCcSxlcyxDcSxlcyxEcSxlcyxFcSxlcyxGcSxlcyxHcSxlcyxHbCxIbCx5bCx6bCxPbCxQbCxXbCxYbCxlcyxlc107dmFyIHVjPVtmcyxmcyxJcSxmcyxKcSxmcyxLcSxmcyxMcSxmcyxNcSxmcyxOcSxmcyxPcSxmcyxQcSxmcyxRcSxmcyxScSxmcyx1bCxjbCxkbCxlbCxrbCxmcyxmcyxmcyxmcyxmc107dmFyIHZjPVtncyxncyxUcSxncyxVcSxncyxWcSxncyxXcSxncyxYcSxncyxZcSxncyxacSxncyxfcSxncywkcSxncyxhcixncyxwaixzaixsayxwayx0ayx2ayxncyxncyxncyxnc107dmFyIHdjPVtocyxocyxjcixocyxkcixocyxlcixocyxmcixocyxncixocyxocixocyxpcixocyxqcixocyxrcixocyxscixocyxlZSxLZyx3Zyx1aSx2aSx6aSxGaSxJaSxKaSxOaSxTaSxMayxRayx0bixzbixybixocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxocyxoc107dmFyIHhjPVtpcyxpcyxucixpcyxvcixpcyxwcixpcyxxcixpcyxycixpcyxzcixpcyx0cixpcyx1cixpcyx2cixpcyx3cixpcyx5ZCxHZCxPZCxXZCxoZSxpZSxtZSxMZSxXZSwkZSxSZyxsZixyZixUZyxEZyx5ZixFZixGZyxwbCxybCx0bCxmbCxobCxqbCxMYyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpcyxpc107dmFyIHljPVtqcyxqcyx5cixqcyx6cixqcyxBcixqcyxCcixqcyxDcixqcyxEcixqcyxFcixqcyxGcixqcyxHcixqcyxIcixqcyxCaCxHaCx3bCxJbCxMbCxtbCxBbCxEbCxRbCxUbCxZbCwkbCxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqcyxqc107dmFyIHpjPVtrcyxrcyxKcixrcyxLcixrcyxMcixrcyxNcixrcyxOcixrcyxPcixrcyxQcixrcyxRcixrcyxScixrcyxTcixrcyxmZSxMZyx4ZyxDaCxIaCxqbixrbixsbixOYyxrc107cmV0dXJue19pNjRTdWJ0cmFjdDpIbixfZnJlZTp2bixfcmVhbGxvYzp3bixfaTY0QWRkOkluLF9tZW1tb3ZlOk1uLF9zdHJsZW46Sm4sX21lbXNldDpObixfbWFsbG9jOnVuLF9tZW1jcHk6TG4sX19fZ2V0VHlwZU5hbWU6Y2YsX2JpdHNoaWZ0NjRMc2hyOktuLF9iaXRzaGlmdDY0U2hsOk9uLF9fR0xPQkFMX19JX2E6YmYsX19HTE9CQUxfX0lfYTY1OmRmLF9fR0xPQkFMX19JX2ExNTM6R2YscnVuUG9zdFNldHM6R24sc3RhY2tBbGxvYzpBYyxzdGFja1NhdmU6QmMsc3RhY2tSZXN0b3JlOkNjLHNldFRocmV3OkRjLHNldFRlbXBSZXQwOkdjLGdldFRlbXBSZXQwOkhjLGR5bkNhbGxfaWlpaTpabixkeW5DYWxsX3ZpaWlpaWlpOmpvLGR5bkNhbGxfdmlpaWlpOnVvLGR5bkNhbGxfaTpGbyxkeW5DYWxsX3ZpOlFvLGR5bkNhbGxfdmlpOiRvLGR5bkNhbGxfdmlpaWlpaWlpaTprcCxkeW5DYWxsX2lpOnZwLGR5bkNhbGxfdmlpaWlpaWQ6R3AsZHluQ2FsbF92aWlpOlJwLGR5bkNhbGxfdmlpaWlpZDphcSxkeW5DYWxsX3Y6bHEsZHluQ2FsbF9paWlpaWlpaWk6d3EsZHluQ2FsbF9paWlpaTpIcSxkeW5DYWxsX3ZpaWlpaWlpaTpTcSxkeW5DYWxsX3ZpaWlpaWk6YnIsZHluQ2FsbF9paWk6bXIsZHluQ2FsbF9paWlpaWk6eHIsZHluQ2FsbF92aWlpaTpJcn0KLy8gRU1TQ1JJUFRFTl9FTkRfQVNNCgp9KSh7Ik1hdGgiOk1hdGgsIkludDhBcnJheSI6SW50OEFycmF5LCJJbnQxNkFycmF5IjpJbnQxNkFycmF5LCJJbnQzMkFycmF5IjpJbnQzMkFycmF5LCJVaW50OEFycmF5IjpVaW50OEFycmF5LCJVaW50MTZBcnJheSI6VWludDE2QXJyYXksIlVpbnQzMkFycmF5IjpVaW50MzJBcnJheSwiRmxvYXQzMkFycmF5IjpGbG9hdDMyQXJyYXksIkZsb2F0NjRBcnJheSI6RmxvYXQ2NEFycmF5fSx7ImFib3J0IjphYm9ydCwiYXNzZXJ0Ijphc3NlcnQsImFzbVByaW50SW50Ijphc21QcmludEludCwiYXNtUHJpbnRGbG9hdCI6YXNtUHJpbnRGbG9hdCwibWluIjpNYXRoX21pbiwianNDYWxsIjpqc0NhbGwsImludm9rZV9paWlpIjppbnZva2VfaWlpaSwiaW52b2tlX3ZpaWlpaWlpIjppbnZva2VfdmlpaWlpaWksImludm9rZV92aWlpaWkiOmludm9rZV92aWlpaWksImludm9rZV9pIjppbnZva2VfaSwiaW52b2tlX3ZpIjppbnZva2VfdmksImludm9rZV92aWkiOmludm9rZV92aWksImludm9rZV92aWlpaWlpaWlpIjppbnZva2VfdmlpaWlpaWlpaSwiaW52b2tlX2lpIjppbnZva2VfaWksImludm9rZV92aWlpaWlpZCI6aW52b2tlX3ZpaWlpaWlkLCJpbnZva2VfdmlpaSI6aW52b2tlX3ZpaWksImludm9rZV92aWlpaWlkIjppbnZva2VfdmlpaWlpZCwiaW52b2tlX3YiOmludm9rZV92LCJpbnZva2VfaWlpaWlpaWlpIjppbnZva2VfaWlpaWlpaWlpLCJpbnZva2VfaWlpaWkiOmludm9rZV9paWlpaSwiaW52b2tlX3ZpaWlpaWlpaSI6aW52b2tlX3ZpaWlpaWlpaSwiaW52b2tlX3ZpaWlpaWkiOmludm9rZV92aWlpaWlpLCJpbnZva2VfaWlpIjppbnZva2VfaWlpLCJpbnZva2VfaWlpaWlpIjppbnZva2VfaWlpaWlpLCJpbnZva2VfdmlpaWkiOmludm9rZV92aWlpaSwiX2ZhYnMiOl9mYWJzLCJfc3NjYW5mIjpfc3NjYW5mLCJfcHRocmVhZF9jb25kX3dhaXQiOl9wdGhyZWFkX2NvbmRfd2FpdCwiX19fY3R5cGVfdG9sb3dlcl9sb2MiOl9fX2N0eXBlX3RvbG93ZXJfbG9jLCJfYXNwcmludGYiOl9hc3ByaW50ZiwiX19lbWJpbmRfcmVnaXN0ZXJfdm9pZCI6X19lbWJpbmRfcmVnaXN0ZXJfdm9pZCwiX3NlbmQiOl9zZW5kLCJfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldyI6X19lbWJpbmRfcmVnaXN0ZXJfbWVtb3J5X3ZpZXcsIl92c3NjYW5mIjpfdnNzY2FuZiwiX19fY3R5cGVfYl9sb2MiOl9fX2N0eXBlX2JfbG9jLCJfX1pTdDl0ZXJtaW5hdGV2IjpfX1pTdDl0ZXJtaW5hdGV2LCJfZm1vZCI6X2Ztb2QsIl9fX2N4YV9ndWFyZF9hY3F1aXJlIjpfX19jeGFfZ3VhcmRfYWNxdWlyZSwiX19fc2V0RXJyTm8iOl9fX3NldEVyck5vLCJfX19jeGFfaXNfbnVtYmVyX3R5cGUiOl9fX2N4YV9pc19udW1iZXJfdHlwZSwiX19fZ3h4X3BlcnNvbmFsaXR5X3YwIjpfX19neHhfcGVyc29uYWxpdHlfdjAsIl9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIiOl9fZW1iaW5kX3JlZ2lzdGVyX2ludGVnZXIsIl91bmdldGMiOl91bmdldGMsIl9fX2Fzc2VydF9mYWlsIjpfX19hc3NlcnRfZmFpbCwiX19fY3hhX2FsbG9jYXRlX2V4Y2VwdGlvbiI6X19fY3hhX2FsbG9jYXRlX2V4Y2VwdGlvbiwiX19aU3QxOHVuY2F1Z2h0X2V4Y2VwdGlvbnYiOl9fWlN0MTh1bmNhdWdodF9leGNlcHRpb252LCJfX19jdHlwZV90b3VwcGVyX2xvYyI6X19fY3R5cGVfdG91cHBlcl9sb2MsIl9mZmx1c2giOl9mZmx1c2gsIl9fX2N4YV9ndWFyZF9yZWxlYXNlIjpfX19jeGFfZ3VhcmRfcmVsZWFzZSwiX19hZGREYXlzIjpfX2FkZERheXMsIl9fX2Vycm5vX2xvY2F0aW9uIjpfX19lcnJub19sb2NhdGlvbiwiX3B3cml0ZSI6X3B3cml0ZSwiX3N0cmVycm9yX3IiOl9zdHJlcnJvcl9yLCJfc3RyZnRpbWVfbCI6X3N0cmZ0aW1lX2wsIl9fZm9ybWF0U3RyaW5nIjpfX2Zvcm1hdFN0cmluZywiX19yZWFsbHlOZWdhdGl2ZSI6X19yZWFsbHlOZWdhdGl2ZSwiX3NicmsiOl9zYnJrLCJfdXNlbG9jYWxlIjpfdXNlbG9jYWxlLCJfY2F0Z2V0cyI6X2NhdGdldHMsIl9uZXdsb2NhbGUiOl9uZXdsb2NhbGUsIl9zbnByaW50ZiI6X3NucHJpbnRmLCJfX19jeGFfYmVnaW5fY2F0Y2giOl9fX2N4YV9iZWdpbl9jYXRjaCwiX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyI6X2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZywiX2ZpbGVubyI6X2ZpbGVubywiX19lbWJpbmRfcmVnaXN0ZXJfYm9vbCI6X19lbWJpbmRfcmVnaXN0ZXJfYm9vbCwiX19fcmVzdW1lRXhjZXB0aW9uIjpfX19yZXN1bWVFeGNlcHRpb24sIl9fX2N4YV9maW5kX21hdGNoaW5nX2NhdGNoIjpfX19jeGFfZmluZF9tYXRjaGluZ19jYXRjaCwiX3N5c2NvbmYiOl9zeXNjb25mLCJfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nIjpfX2VtYmluZF9yZWdpc3Rlcl9zdGRfc3RyaW5nLCJfc3RyZnRpbWUiOl9zdHJmdGltZSwiX19hcnJheVN1bSI6X19hcnJheVN1bSwiX19fY3hhX3Rocm93IjpfX19jeGFfdGhyb3csIl9fZW1iaW5kX3JlZ2lzdGVyX2VtdmFsIjpfX2VtYmluZF9yZWdpc3Rlcl9lbXZhbCwiX19leGl0IjpfX2V4aXQsIl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uIjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzc19mdW5jdGlvbiwiX19aTktTdDlleGNlcHRpb240d2hhdEV2IjpfX1pOS1N0OWV4Y2VwdGlvbjR3aGF0RXYsIl9wdGhyZWFkX211dGV4X2Rlc3Ryb3kiOl9wdGhyZWFkX211dGV4X2Rlc3Ryb3ksIl9wdGhyZWFkX211dGV4X3VubG9jayI6X3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCJfZnJlYWQiOl9mcmVhZCwiX3B0aHJlYWRfY29uZF9icm9hZGNhc3QiOl9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0LCJfbWtwb3J0IjpfbWtwb3J0LCJfc3ByaW50ZiI6X3NwcmludGYsIl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzIjpfX2VtYmluZF9yZWdpc3Rlcl9jbGFzcywiX3Zhc3ByaW50ZiI6X3Zhc3ByaW50ZiwiX19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmciOl9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF93c3RyaW5nLCJfd3JpdGUiOl93cml0ZSwiX19pc0xlYXBZZWFyIjpfX2lzTGVhcFllYXIsIl9fc2NhblN0cmluZyI6X19zY2FuU3RyaW5nLCJfc3RyZXJyb3IiOl9zdHJlcnJvciwiX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IiOl9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2NvbnN0cnVjdG9yLCJfcmVjdiI6X3JlY3YsIl92c25wcmludGYiOl92c25wcmludGYsIl9fWk5TdDlleGNlcHRpb25EMkV2IjpfX1pOU3Q5ZXhjZXB0aW9uRDJFdiwiX2NvcHlzaWduIjpfY29weXNpZ24sIl9mZ2V0YyI6X2ZnZXRjLCJfX19jeGFfZG9lc19pbmhlcml0IjpfX19jeGFfZG9lc19pbmhlcml0LCJfZnJlZWxvY2FsZSI6X2ZyZWVsb2NhbGUsIl9yZWFkIjpfcmVhZCwiX2Fib3J0IjpfYWJvcnQsIl9jYXRjbG9zZSI6X2NhdGNsb3NlLCJfZndyaXRlIjpfZndyaXRlLCJfdGltZSI6X3RpbWUsIl9wdGhyZWFkX211dGV4X2xvY2siOl9wdGhyZWFkX211dGV4X2xvY2ssIl9fZW1iaW5kX3JlZ2lzdGVyX2Zsb2F0IjpfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdCwiX3ByZWFkIjpfcHJlYWQsIl9hdGV4aXQiOl9hdGV4aXQsIl9jYXRvcGVuIjpfY2F0b3BlbiwiX2V4aXQiOl9leGl0LCJfX2dldEZsb2F0IjpfX2dldEZsb2F0LCJTVEFDS1RPUCI6U1RBQ0tUT1AsIlNUQUNLX01BWCI6U1RBQ0tfTUFYLCJ0ZW1wRG91YmxlUHRyIjp0ZW1wRG91YmxlUHRyLCJBQk9SVCI6QUJPUlQsImN0dHpfaTgiOmN0dHpfaTgsImN0bHpfaTgiOmN0bHpfaTgsIk5hTiI6TmFOLCJJbmZpbml0eSI6SW5maW5pdHksIl9fWlRJU3Q5ZXhjZXB0aW9uIjpfX1pUSVN0OWV4Y2VwdGlvbiwiX19fZHNvX2hhbmRsZSI6X19fZHNvX2hhbmRsZSwiX3N0ZGVyciI6X3N0ZGVyciwiX3N0ZGluIjpfc3RkaW4sIl9zdGRvdXQiOl9zdGRvdXR9LGJ1ZmZlcik7dmFyIF9pNjRTdWJ0cmFjdD1Nb2R1bGVbIl9pNjRTdWJ0cmFjdCJdPWFzbVsiX2k2NFN1YnRyYWN0Il07dmFyIF9mcmVlPU1vZHVsZVsiX2ZyZWUiXT1hc21bIl9mcmVlIl07dmFyIF9yZWFsbG9jPU1vZHVsZVsiX3JlYWxsb2MiXT1hc21bIl9yZWFsbG9jIl07dmFyIF9pNjRBZGQ9TW9kdWxlWyJfaTY0QWRkIl09YXNtWyJfaTY0QWRkIl07dmFyIF9tZW1tb3ZlPU1vZHVsZVsiX21lbW1vdmUiXT1hc21bIl9tZW1tb3ZlIl07dmFyIF9zdHJsZW49TW9kdWxlWyJfc3RybGVuIl09YXNtWyJfc3RybGVuIl07dmFyIF9tZW1zZXQ9TW9kdWxlWyJfbWVtc2V0Il09YXNtWyJfbWVtc2V0Il07dmFyIF9tYWxsb2M9TW9kdWxlWyJfbWFsbG9jIl09YXNtWyJfbWFsbG9jIl07dmFyIF9tZW1jcHk9TW9kdWxlWyJfbWVtY3B5Il09YXNtWyJfbWVtY3B5Il07dmFyIF9fX2dldFR5cGVOYW1lPU1vZHVsZVsiX19fZ2V0VHlwZU5hbWUiXT1hc21bIl9fX2dldFR5cGVOYW1lIl07dmFyIF9iaXRzaGlmdDY0THNocj1Nb2R1bGVbIl9iaXRzaGlmdDY0THNociJdPWFzbVsiX2JpdHNoaWZ0NjRMc2hyIl07dmFyIF9iaXRzaGlmdDY0U2hsPU1vZHVsZVsiX2JpdHNoaWZ0NjRTaGwiXT1hc21bIl9iaXRzaGlmdDY0U2hsIl07dmFyIF9fR0xPQkFMX19JX2E9TW9kdWxlWyJfX0dMT0JBTF9fSV9hIl09YXNtWyJfX0dMT0JBTF9fSV9hIl07dmFyIF9fR0xPQkFMX19JX2E2NT1Nb2R1bGVbIl9fR0xPQkFMX19JX2E2NSJdPWFzbVsiX19HTE9CQUxfX0lfYTY1Il07dmFyIF9fR0xPQkFMX19JX2ExNTM9TW9kdWxlWyJfX0dMT0JBTF9fSV9hMTUzIl09YXNtWyJfX0dMT0JBTF9fSV9hMTUzIl07dmFyIHJ1blBvc3RTZXRzPU1vZHVsZVsicnVuUG9zdFNldHMiXT1hc21bInJ1blBvc3RTZXRzIl07dmFyIGR5bkNhbGxfaWlpaT1Nb2R1bGVbImR5bkNhbGxfaWlpaSJdPWFzbVsiZHluQ2FsbF9paWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaWlpIl09YXNtWyJkeW5DYWxsX3ZpaWlpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWkiXT1hc21bImR5bkNhbGxfdmlpaWlpIl07dmFyIGR5bkNhbGxfaT1Nb2R1bGVbImR5bkNhbGxfaSJdPWFzbVsiZHluQ2FsbF9pIl07dmFyIGR5bkNhbGxfdmk9TW9kdWxlWyJkeW5DYWxsX3ZpIl09YXNtWyJkeW5DYWxsX3ZpIl07dmFyIGR5bkNhbGxfdmlpPU1vZHVsZVsiZHluQ2FsbF92aWkiXT1hc21bImR5bkNhbGxfdmlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpaWlpaSJdPWFzbVsiZHluQ2FsbF92aWlpaWlpaWlpIl07dmFyIGR5bkNhbGxfaWk9TW9kdWxlWyJkeW5DYWxsX2lpIl09YXNtWyJkeW5DYWxsX2lpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWQ9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpaWlkIl09YXNtWyJkeW5DYWxsX3ZpaWlpaWlkIl07dmFyIGR5bkNhbGxfdmlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaSJdPWFzbVsiZHluQ2FsbF92aWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpZD1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpZCJdPWFzbVsiZHluQ2FsbF92aWlpaWlkIl07dmFyIGR5bkNhbGxfdj1Nb2R1bGVbImR5bkNhbGxfdiJdPWFzbVsiZHluQ2FsbF92Il07dmFyIGR5bkNhbGxfaWlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWlpaWkiXT1hc21bImR5bkNhbGxfaWlpaWlpaWlpIl07dmFyIGR5bkNhbGxfaWlpaWk9TW9kdWxlWyJkeW5DYWxsX2lpaWlpIl09YXNtWyJkeW5DYWxsX2lpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF92aWlpaWlpaWkiXT1hc21bImR5bkNhbGxfdmlpaWlpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWlpaT1Nb2R1bGVbImR5bkNhbGxfdmlpaWlpaSJdPWFzbVsiZHluQ2FsbF92aWlpaWlpIl07dmFyIGR5bkNhbGxfaWlpPU1vZHVsZVsiZHluQ2FsbF9paWkiXT1hc21bImR5bkNhbGxfaWlpIl07dmFyIGR5bkNhbGxfaWlpaWlpPU1vZHVsZVsiZHluQ2FsbF9paWlpaWkiXT1hc21bImR5bkNhbGxfaWlpaWlpIl07dmFyIGR5bkNhbGxfdmlpaWk9TW9kdWxlWyJkeW5DYWxsX3ZpaWlpIl09YXNtWyJkeW5DYWxsX3ZpaWlpIl07UnVudGltZS5zdGFja0FsbG9jPWFzbVsic3RhY2tBbGxvYyJdO1J1bnRpbWUuc3RhY2tTYXZlPWFzbVsic3RhY2tTYXZlIl07UnVudGltZS5zdGFja1Jlc3RvcmU9YXNtWyJzdGFja1Jlc3RvcmUiXTtSdW50aW1lLnNldFRlbXBSZXQwPWFzbVsic2V0VGVtcFJldDAiXTtSdW50aW1lLmdldFRlbXBSZXQwPWFzbVsiZ2V0VGVtcFJldDAiXTt2YXIgaTY0TWF0aD0oZnVuY3Rpb24oKXt2YXIgZ29vZz17bWF0aDp7fX07Z29vZy5tYXRoLkxvbmc9KGZ1bmN0aW9uKGxvdyxoaWdoKXt0aGlzLmxvd189bG93fDA7dGhpcy5oaWdoXz1oaWdofDB9KTtnb29nLm1hdGguTG9uZy5JbnRDYWNoZV89e307Z29vZy5tYXRoLkxvbmcuZnJvbUludD0oZnVuY3Rpb24odmFsdWUpe2lmKC0xMjg8PXZhbHVlJiZ2YWx1ZTwxMjgpe3ZhciBjYWNoZWRPYmo9Z29vZy5tYXRoLkxvbmcuSW50Q2FjaGVfW3ZhbHVlXTtpZihjYWNoZWRPYmope3JldHVybiBjYWNoZWRPYmp9fXZhciBvYmo9bmV3IGdvb2cubWF0aC5Mb25nKHZhbHVlfDAsdmFsdWU8MD8tMTowKTtpZigtMTI4PD12YWx1ZSYmdmFsdWU8MTI4KXtnb29nLm1hdGguTG9uZy5JbnRDYWNoZV9bdmFsdWVdPW9ian1yZXR1cm4gb2JqfSk7Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcj0oZnVuY3Rpb24odmFsdWUpe2lmKGlzTmFOKHZhbHVlKXx8IWlzRmluaXRlKHZhbHVlKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk99ZWxzZSBpZih2YWx1ZTw9LWdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjNfREJMXyl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRX1lbHNlIGlmKHZhbHVlKzE+PWdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjNfREJMXyl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLk1BWF9WQUxVRX1lbHNlIGlmKHZhbHVlPDApe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKC12YWx1ZSkubmVnYXRlKCl9ZWxzZXtyZXR1cm4gbmV3IGdvb2cubWF0aC5Mb25nKHZhbHVlJWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMX3wwLHZhbHVlL2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMX3wwKX19KTtnb29nLm1hdGguTG9uZy5mcm9tQml0cz0oZnVuY3Rpb24obG93Qml0cyxoaWdoQml0cyl7cmV0dXJuIG5ldyBnb29nLm1hdGguTG9uZyhsb3dCaXRzLGhpZ2hCaXRzKX0pO2dvb2cubWF0aC5Mb25nLmZyb21TdHJpbmc9KGZ1bmN0aW9uKHN0cixvcHRfcmFkaXgpe2lmKHN0ci5sZW5ndGg9PTApe3Rocm93IEVycm9yKCJudW1iZXIgZm9ybWF0IGVycm9yOiBlbXB0eSBzdHJpbmciKX12YXIgcmFkaXg9b3B0X3JhZGl4fHwxMDtpZihyYWRpeDwyfHwzNjxyYWRpeCl7dGhyb3cgRXJyb3IoInJhZGl4IG91dCBvZiByYW5nZTogIityYWRpeCl9aWYoc3RyLmNoYXJBdCgwKT09Ii0iKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLHJhZGl4KS5uZWdhdGUoKX1lbHNlIGlmKHN0ci5pbmRleE9mKCItIik+PTApe3Rocm93IEVycm9yKCdudW1iZXIgZm9ybWF0IGVycm9yOiBpbnRlcmlvciAiLSIgY2hhcmFjdGVyOiAnK3N0cil9dmFyIHJhZGl4VG9Qb3dlcj1nb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKE1hdGgucG93KHJhZGl4LDgpKTt2YXIgcmVzdWx0PWdvb2cubWF0aC5Mb25nLlpFUk87Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoO2krPTgpe3ZhciBzaXplPU1hdGgubWluKDgsc3RyLmxlbmd0aC1pKTt2YXIgdmFsdWU9cGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpLGkrc2l6ZSkscmFkaXgpO2lmKHNpemU8OCl7dmFyIHBvd2VyPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoTWF0aC5wb3cocmFkaXgsc2l6ZSkpO3Jlc3VsdD1yZXN1bHQubXVsdGlwbHkocG93ZXIpLmFkZChnb29nLm1hdGguTG9uZy5mcm9tTnVtYmVyKHZhbHVlKSl9ZWxzZXtyZXN1bHQ9cmVzdWx0Lm11bHRpcGx5KHJhZGl4VG9Qb3dlcik7cmVzdWx0PXJlc3VsdC5hZGQoZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcih2YWx1ZSkpfX1yZXR1cm4gcmVzdWx0fSk7Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl8xNl9EQkxfPTE8PDE2O2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfREJMXz0xPDwyNDtnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF89Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl8xNl9EQkxfKmdvb2cubWF0aC5Mb25nLlRXT19QV1JfMTZfREJMXztnb29nLm1hdGguTG9uZy5UV09fUFdSXzMxX0RCTF89Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl8zMl9EQkxfLzI7Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl80OF9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXypnb29nLm1hdGguTG9uZy5UV09fUFdSXzE2X0RCTF87Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl82NF9EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXypnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF87Z29vZy5tYXRoLkxvbmcuVFdPX1BXUl82M19EQkxfPWdvb2cubWF0aC5Mb25nLlRXT19QV1JfNjRfREJMXy8yO2dvb2cubWF0aC5Mb25nLlpFUk89Z29vZy5tYXRoLkxvbmcuZnJvbUludCgwKTtnb29nLm1hdGguTG9uZy5PTkU9Z29vZy5tYXRoLkxvbmcuZnJvbUludCgxKTtnb29nLm1hdGguTG9uZy5ORUdfT05FPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoLTEpO2dvb2cubWF0aC5Mb25nLk1BWF9WQUxVRT1nb29nLm1hdGguTG9uZy5mcm9tQml0cyg0Mjk0OTY3Mjk1fDAsMjE0NzQ4MzY0N3wwKTtnb29nLm1hdGguTG9uZy5NSU5fVkFMVUU9Z29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoMCwyMTQ3NDgzNjQ4fDApO2dvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfPWdvb2cubWF0aC5Mb25nLmZyb21JbnQoMTw8MjQpO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS50b0ludD0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dffSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnRvTnVtYmVyPShmdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hfKmdvb2cubWF0aC5Mb25nLlRXT19QV1JfMzJfREJMXyt0aGlzLmdldExvd0JpdHNVbnNpZ25lZCgpfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nPShmdW5jdGlvbihvcHRfcmFkaXgpe3ZhciByYWRpeD1vcHRfcmFkaXh8fDEwO2lmKHJhZGl4PDJ8fDM2PHJhZGl4KXt0aHJvdyBFcnJvcigicmFkaXggb3V0IG9mIHJhbmdlOiAiK3JhZGl4KX1pZih0aGlzLmlzWmVybygpKXtyZXR1cm4iMCJ9aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpe3ZhciByYWRpeExvbmc9Z29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcihyYWRpeCk7dmFyIGRpdj10aGlzLmRpdihyYWRpeExvbmcpO3ZhciByZW09ZGl2Lm11bHRpcGx5KHJhZGl4TG9uZykuc3VidHJhY3QodGhpcyk7cmV0dXJuIGRpdi50b1N0cmluZyhyYWRpeCkrcmVtLnRvSW50KCkudG9TdHJpbmcocmFkaXgpfWVsc2V7cmV0dXJuIi0iK3RoaXMubmVnYXRlKCkudG9TdHJpbmcocmFkaXgpfX12YXIgcmFkaXhUb1Bvd2VyPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoTWF0aC5wb3cocmFkaXgsNikpO3ZhciByZW09dGhpczt2YXIgcmVzdWx0PSIiO3doaWxlKHRydWUpe3ZhciByZW1EaXY9cmVtLmRpdihyYWRpeFRvUG93ZXIpO3ZhciBpbnR2YWw9cmVtLnN1YnRyYWN0KHJlbURpdi5tdWx0aXBseShyYWRpeFRvUG93ZXIpKS50b0ludCgpO3ZhciBkaWdpdHM9aW50dmFsLnRvU3RyaW5nKHJhZGl4KTtyZW09cmVtRGl2O2lmKHJlbS5pc1plcm8oKSl7cmV0dXJuIGRpZ2l0cytyZXN1bHR9ZWxzZXt3aGlsZShkaWdpdHMubGVuZ3RoPDYpe2RpZ2l0cz0iMCIrZGlnaXRzfXJlc3VsdD0iIitkaWdpdHMrcmVzdWx0fX19KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0SGlnaEJpdHM9KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGlnaF99KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZ2V0TG93Qml0cz0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dffSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmdldExvd0JpdHNVbnNpZ25lZD0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3dfPj0wP3RoaXMubG93Xzpnb29nLm1hdGguTG9uZy5UV09fUFdSXzMyX0RCTF8rdGhpcy5sb3dffSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmdldE51bUJpdHNBYnM9KGZ1bmN0aW9uKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRSkpe3JldHVybiA2NH1lbHNle3JldHVybiB0aGlzLm5lZ2F0ZSgpLmdldE51bUJpdHNBYnMoKX19ZWxzZXt2YXIgdmFsPXRoaXMuaGlnaF8hPTA/dGhpcy5oaWdoXzp0aGlzLmxvd187Zm9yKHZhciBiaXQ9MzE7Yml0PjA7Yml0LS0pe2lmKCh2YWwmMTw8Yml0KSE9MCl7YnJlYWt9fXJldHVybiB0aGlzLmhpZ2hfIT0wP2JpdCszMzpiaXQrMX19KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNaZXJvPShmdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2hfPT0wJiZ0aGlzLmxvd189PTB9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuaXNOZWdhdGl2ZT0oZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoXzwwfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmlzT2RkPShmdW5jdGlvbigpe3JldHVybih0aGlzLmxvd18mMSk9PTF9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuZXF1YWxzPShmdW5jdGlvbihvdGhlcil7cmV0dXJuIHRoaXMuaGlnaF89PW90aGVyLmhpZ2hfJiZ0aGlzLmxvd189PW90aGVyLmxvd199KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubm90RXF1YWxzPShmdW5jdGlvbihvdGhlcil7cmV0dXJuIHRoaXMuaGlnaF8hPW90aGVyLmhpZ2hffHx0aGlzLmxvd18hPW90aGVyLmxvd199KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubGVzc1RoYW49KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gdGhpcy5jb21wYXJlKG90aGVyKTwwfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbD0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiB0aGlzLmNvbXBhcmUob3RoZXIpPD0wfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmdyZWF0ZXJUaGFuPShmdW5jdGlvbihvdGhlcil7cmV0dXJuIHRoaXMuY29tcGFyZShvdGhlcik+MH0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw9KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gdGhpcy5jb21wYXJlKG90aGVyKT49MH0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5jb21wYXJlPShmdW5jdGlvbihvdGhlcil7aWYodGhpcy5lcXVhbHMob3RoZXIpKXtyZXR1cm4gMH12YXIgdGhpc05lZz10aGlzLmlzTmVnYXRpdmUoKTt2YXIgb3RoZXJOZWc9b3RoZXIuaXNOZWdhdGl2ZSgpO2lmKHRoaXNOZWcmJiFvdGhlck5lZyl7cmV0dXJuLTF9aWYoIXRoaXNOZWcmJm90aGVyTmVnKXtyZXR1cm4gMX1pZih0aGlzLnN1YnRyYWN0KG90aGVyKS5pc05lZ2F0aXZlKCkpe3JldHVybi0xfWVsc2V7cmV0dXJuIDF9fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLm5lZ2F0ZT0oZnVuY3Rpb24oKXtpZih0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFfWVsc2V7cmV0dXJuIHRoaXMubm90KCkuYWRkKGdvb2cubWF0aC5Mb25nLk9ORSl9fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmFkZD0oZnVuY3Rpb24ob3RoZXIpe3ZhciBhNDg9dGhpcy5oaWdoXz4+PjE2O3ZhciBhMzI9dGhpcy5oaWdoXyY2NTUzNTt2YXIgYTE2PXRoaXMubG93Xz4+PjE2O3ZhciBhMDA9dGhpcy5sb3dfJjY1NTM1O3ZhciBiNDg9b3RoZXIuaGlnaF8+Pj4xNjt2YXIgYjMyPW90aGVyLmhpZ2hfJjY1NTM1O3ZhciBiMTY9b3RoZXIubG93Xz4+PjE2O3ZhciBiMDA9b3RoZXIubG93XyY2NTUzNTt2YXIgYzQ4PTAsYzMyPTAsYzE2PTAsYzAwPTA7YzAwKz1hMDArYjAwO2MxNis9YzAwPj4+MTY7YzAwJj02NTUzNTtjMTYrPWExNitiMTY7YzMyKz1jMTY+Pj4xNjtjMTYmPTY1NTM1O2MzMis9YTMyK2IzMjtjNDgrPWMzMj4+PjE2O2MzMiY9NjU1MzU7YzQ4Kz1hNDgrYjQ4O2M0OCY9NjU1MzU7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGMxNjw8MTZ8YzAwLGM0ODw8MTZ8YzMyKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5zdWJ0cmFjdD0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiB0aGlzLmFkZChvdGhlci5uZWdhdGUoKSl9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUubXVsdGlwbHk9KGZ1bmN0aW9uKG90aGVyKXtpZih0aGlzLmlzWmVybygpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuWkVST31lbHNlIGlmKG90aGVyLmlzWmVybygpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuWkVST31pZih0aGlzLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gb3RoZXIuaXNPZGQoKT9nb29nLm1hdGguTG9uZy5NSU5fVkFMVUU6Z29vZy5tYXRoLkxvbmcuWkVST31lbHNlIGlmKG90aGVyLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gdGhpcy5pc09kZCgpP2dvb2cubWF0aC5Mb25nLk1JTl9WQUxVRTpnb29nLm1hdGguTG9uZy5aRVJPfWlmKHRoaXMuaXNOZWdhdGl2ZSgpKXtpZihvdGhlci5pc05lZ2F0aXZlKCkpe3JldHVybiB0aGlzLm5lZ2F0ZSgpLm11bHRpcGx5KG90aGVyLm5lZ2F0ZSgpKX1lbHNle3JldHVybiB0aGlzLm5lZ2F0ZSgpLm11bHRpcGx5KG90aGVyKS5uZWdhdGUoKX19ZWxzZSBpZihvdGhlci5pc05lZ2F0aXZlKCkpe3JldHVybiB0aGlzLm11bHRpcGx5KG90aGVyLm5lZ2F0ZSgpKS5uZWdhdGUoKX1pZih0aGlzLmxlc3NUaGFuKGdvb2cubWF0aC5Mb25nLlRXT19QV1JfMjRfKSYmb3RoZXIubGVzc1RoYW4oZ29vZy5tYXRoLkxvbmcuVFdPX1BXUl8yNF8pKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbU51bWJlcih0aGlzLnRvTnVtYmVyKCkqb3RoZXIudG9OdW1iZXIoKSl9dmFyIGE0OD10aGlzLmhpZ2hfPj4+MTY7dmFyIGEzMj10aGlzLmhpZ2hfJjY1NTM1O3ZhciBhMTY9dGhpcy5sb3dfPj4+MTY7dmFyIGEwMD10aGlzLmxvd18mNjU1MzU7dmFyIGI0OD1vdGhlci5oaWdoXz4+PjE2O3ZhciBiMzI9b3RoZXIuaGlnaF8mNjU1MzU7dmFyIGIxNj1vdGhlci5sb3dfPj4+MTY7dmFyIGIwMD1vdGhlci5sb3dfJjY1NTM1O3ZhciBjNDg9MCxjMzI9MCxjMTY9MCxjMDA9MDtjMDArPWEwMCpiMDA7YzE2Kz1jMDA+Pj4xNjtjMDAmPTY1NTM1O2MxNis9YTE2KmIwMDtjMzIrPWMxNj4+PjE2O2MxNiY9NjU1MzU7YzE2Kz1hMDAqYjE2O2MzMis9YzE2Pj4+MTY7YzE2Jj02NTUzNTtjMzIrPWEzMipiMDA7YzQ4Kz1jMzI+Pj4xNjtjMzImPTY1NTM1O2MzMis9YTE2KmIxNjtjNDgrPWMzMj4+PjE2O2MzMiY9NjU1MzU7YzMyKz1hMDAqYjMyO2M0OCs9YzMyPj4+MTY7YzMyJj02NTUzNTtjNDgrPWE0OCpiMDArYTMyKmIxNithMTYqYjMyK2EwMCpiNDg7YzQ4Jj02NTUzNTtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHMoYzE2PDwxNnxjMDAsYzQ4PDwxNnxjMzIpfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmRpdj0oZnVuY3Rpb24ob3RoZXIpe2lmKG90aGVyLmlzWmVybygpKXt0aHJvdyBFcnJvcigiZGl2aXNpb24gYnkgemVybyIpfWVsc2UgaWYodGhpcy5pc1plcm8oKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk99aWYodGhpcy5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSl7aWYob3RoZXIuZXF1YWxzKGdvb2cubWF0aC5Mb25nLk9ORSl8fG90aGVyLmVxdWFscyhnb29nLm1hdGguTG9uZy5ORUdfT05FKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLk1JTl9WQUxVRX1lbHNlIGlmKG90aGVyLmVxdWFscyhnb29nLm1hdGguTG9uZy5NSU5fVkFMVUUpKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuT05FfWVsc2V7dmFyIGhhbGZUaGlzPXRoaXMuc2hpZnRSaWdodCgxKTt2YXIgYXBwcm94PWhhbGZUaGlzLmRpdihvdGhlcikuc2hpZnRMZWZ0KDEpO2lmKGFwcHJveC5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuWkVSTykpe3JldHVybiBvdGhlci5pc05lZ2F0aXZlKCk/Z29vZy5tYXRoLkxvbmcuT05FOmdvb2cubWF0aC5Mb25nLk5FR19PTkV9ZWxzZXt2YXIgcmVtPXRoaXMuc3VidHJhY3Qob3RoZXIubXVsdGlwbHkoYXBwcm94KSk7dmFyIHJlc3VsdD1hcHByb3guYWRkKHJlbS5kaXYob3RoZXIpKTtyZXR1cm4gcmVzdWx0fX19ZWxzZSBpZihvdGhlci5lcXVhbHMoZ29vZy5tYXRoLkxvbmcuTUlOX1ZBTFVFKSl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLlpFUk99aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKG90aGVyLmlzTmVnYXRpdmUoKSl7cmV0dXJuIHRoaXMubmVnYXRlKCkuZGl2KG90aGVyLm5lZ2F0ZSgpKX1lbHNle3JldHVybiB0aGlzLm5lZ2F0ZSgpLmRpdihvdGhlcikubmVnYXRlKCl9fWVsc2UgaWYob3RoZXIuaXNOZWdhdGl2ZSgpKXtyZXR1cm4gdGhpcy5kaXYob3RoZXIubmVnYXRlKCkpLm5lZ2F0ZSgpfXZhciByZXM9Z29vZy5tYXRoLkxvbmcuWkVSTzt2YXIgcmVtPXRoaXM7d2hpbGUocmVtLmdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikpe3ZhciBhcHByb3g9TWF0aC5tYXgoMSxNYXRoLmZsb29yKHJlbS50b051bWJlcigpL290aGVyLnRvTnVtYmVyKCkpKTt2YXIgbG9nMj1NYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KS9NYXRoLkxOMik7dmFyIGRlbHRhPWxvZzI8PTQ4PzE6TWF0aC5wb3coMixsb2cyLTQ4KTt2YXIgYXBwcm94UmVzPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoYXBwcm94KTt2YXIgYXBwcm94UmVtPWFwcHJveFJlcy5tdWx0aXBseShvdGhlcik7d2hpbGUoYXBwcm94UmVtLmlzTmVnYXRpdmUoKXx8YXBwcm94UmVtLmdyZWF0ZXJUaGFuKHJlbSkpe2FwcHJveC09ZGVsdGE7YXBwcm94UmVzPWdvb2cubWF0aC5Mb25nLmZyb21OdW1iZXIoYXBwcm94KTthcHByb3hSZW09YXBwcm94UmVzLm11bHRpcGx5KG90aGVyKX1pZihhcHByb3hSZXMuaXNaZXJvKCkpe2FwcHJveFJlcz1nb29nLm1hdGguTG9uZy5PTkV9cmVzPXJlcy5hZGQoYXBwcm94UmVzKTtyZW09cmVtLnN1YnRyYWN0KGFwcHJveFJlbSl9cmV0dXJuIHJlc30pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5tb2R1bG89KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gdGhpcy5zdWJ0cmFjdCh0aGlzLmRpdihvdGhlcikubXVsdGlwbHkob3RoZXIpKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5ub3Q9KGZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKH50aGlzLmxvd18sfnRoaXMuaGlnaF8pfSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLmFuZD0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyh0aGlzLmxvd18mb3RoZXIubG93Xyx0aGlzLmhpZ2hfJm90aGVyLmhpZ2hfKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS5vcj0oZnVuY3Rpb24ob3RoZXIpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyh0aGlzLmxvd198b3RoZXIubG93Xyx0aGlzLmhpZ2hffG90aGVyLmhpZ2hfKX0pO2dvb2cubWF0aC5Mb25nLnByb3RvdHlwZS54b3I9KGZ1bmN0aW9uKG90aGVyKXtyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHModGhpcy5sb3dfXm90aGVyLmxvd18sdGhpcy5oaWdoX15vdGhlci5oaWdoXyl9KTtnb29nLm1hdGguTG9uZy5wcm90b3R5cGUuc2hpZnRMZWZ0PShmdW5jdGlvbihudW1CaXRzKXtudW1CaXRzJj02MztpZihudW1CaXRzPT0wKXtyZXR1cm4gdGhpc31lbHNle3ZhciBsb3c9dGhpcy5sb3dfO2lmKG51bUJpdHM8MzIpe3ZhciBoaWdoPXRoaXMuaGlnaF87cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGxvdzw8bnVtQml0cyxoaWdoPDxudW1CaXRzfGxvdz4+PjMyLW51bUJpdHMpfWVsc2V7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKDAsbG93PDxudW1CaXRzLTMyKX19fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnNoaWZ0UmlnaHQ9KGZ1bmN0aW9uKG51bUJpdHMpe251bUJpdHMmPTYzO2lmKG51bUJpdHM9PTApe3JldHVybiB0aGlzfWVsc2V7dmFyIGhpZ2g9dGhpcy5oaWdoXztpZihudW1CaXRzPDMyKXt2YXIgbG93PXRoaXMubG93XztyZXR1cm4gZ29vZy5tYXRoLkxvbmcuZnJvbUJpdHMobG93Pj4+bnVtQml0c3xoaWdoPDwzMi1udW1CaXRzLGhpZ2g+Pm51bUJpdHMpfWVsc2V7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGhpZ2g+Pm51bUJpdHMtMzIsaGlnaD49MD8wOi0xKX19fSk7Z29vZy5tYXRoLkxvbmcucHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZD0oZnVuY3Rpb24obnVtQml0cyl7bnVtQml0cyY9NjM7aWYobnVtQml0cz09MCl7cmV0dXJuIHRoaXN9ZWxzZXt2YXIgaGlnaD10aGlzLmhpZ2hfO2lmKG51bUJpdHM8MzIpe3ZhciBsb3c9dGhpcy5sb3dfO3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyhsb3c+Pj5udW1CaXRzfGhpZ2g8PDMyLW51bUJpdHMsaGlnaD4+Pm51bUJpdHMpfWVsc2UgaWYobnVtQml0cz09MzIpe3JldHVybiBnb29nLm1hdGguTG9uZy5mcm9tQml0cyhoaWdoLDApfWVsc2V7cmV0dXJuIGdvb2cubWF0aC5Mb25nLmZyb21CaXRzKGhpZ2g+Pj5udW1CaXRzLTMyLDApfX19KTt2YXIgbmF2aWdhdG9yPXthcHBOYW1lOiJNb2Rlcm4gQnJvd3NlciJ9O3ZhciBkYml0czt2YXIgY2FuYXJ5PTB4ZGVhZGJlZWZjYWZlO3ZhciBqX2xtPShjYW5hcnkmMTY3NzcyMTUpPT0xNTcxNTA3MDtmdW5jdGlvbiBCaWdJbnRlZ2VyKGEsYixjKXtpZihhIT1udWxsKWlmKCJudW1iZXIiPT10eXBlb2YgYSl0aGlzLmZyb21OdW1iZXIoYSxiLGMpO2Vsc2UgaWYoYj09bnVsbCYmInN0cmluZyIhPXR5cGVvZiBhKXRoaXMuZnJvbVN0cmluZyhhLDI1Nik7ZWxzZSB0aGlzLmZyb21TdHJpbmcoYSxiKX1mdW5jdGlvbiBuYmkoKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCl9ZnVuY3Rpb24gYW0xKGkseCx3LGosYyxuKXt3aGlsZSgtLW4+PTApe3ZhciB2PXgqdGhpc1tpKytdK3dbal0rYztjPU1hdGguZmxvb3Iodi82NzEwODg2NCk7d1tqKytdPXYmNjcxMDg4NjN9cmV0dXJuIGN9ZnVuY3Rpb24gYW0yKGkseCx3LGosYyxuKXt2YXIgeGw9eCYzMjc2Nyx4aD14Pj4xNTt3aGlsZSgtLW4+PTApe3ZhciBsPXRoaXNbaV0mMzI3Njc7dmFyIGg9dGhpc1tpKytdPj4xNTt2YXIgbT14aCpsK2gqeGw7bD14bCpsKygobSYzMjc2Nyk8PDE1KSt3W2pdKyhjJjEwNzM3NDE4MjMpO2M9KGw+Pj4zMCkrKG0+Pj4xNSkreGgqaCsoYz4+PjMwKTt3W2orK109bCYxMDczNzQxODIzfXJldHVybiBjfWZ1bmN0aW9uIGFtMyhpLHgsdyxqLGMsbil7dmFyIHhsPXgmMTYzODMseGg9eD4+MTQ7d2hpbGUoLS1uPj0wKXt2YXIgbD10aGlzW2ldJjE2MzgzO3ZhciBoPXRoaXNbaSsrXT4+MTQ7dmFyIG09eGgqbCtoKnhsO2w9eGwqbCsoKG0mMTYzODMpPDwxNCkrd1tqXStjO2M9KGw+PjI4KSsobT4+MTQpK3hoKmg7d1tqKytdPWwmMjY4NDM1NDU1fXJldHVybiBjfWlmKGpfbG0mJm5hdmlnYXRvci5hcHBOYW1lPT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIil7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0yO2RiaXRzPTMwfWVsc2UgaWYoal9sbSYmbmF2aWdhdG9yLmFwcE5hbWUhPSJOZXRzY2FwZSIpe0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMTtkYml0cz0yNn1lbHNle0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMztkYml0cz0yOH1CaWdJbnRlZ2VyLnByb3RvdHlwZS5EQj1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5ETT0oMTw8ZGJpdHMpLTE7QmlnSW50ZWdlci5wcm90b3R5cGUuRFY9MTw8ZGJpdHM7dmFyIEJJX0ZQPTUyO0JpZ0ludGVnZXIucHJvdG90eXBlLkZWPU1hdGgucG93KDIsQklfRlApO0JpZ0ludGVnZXIucHJvdG90eXBlLkYxPUJJX0ZQLWRiaXRzO0JpZ0ludGVnZXIucHJvdG90eXBlLkYyPTIqZGJpdHMtQklfRlA7dmFyIEJJX1JNPSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiO3ZhciBCSV9SQz1uZXcgQXJyYXk7dmFyIHJyLHZ2O3JyPSIwIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0wO3Z2PD05OysrdnYpQklfUkNbcnIrK109dnY7cnI9ImEiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpQklfUkNbcnIrK109dnY7cnI9IkEiLmNoYXJDb2RlQXQoMCk7Zm9yKHZ2PTEwO3Z2PDM2OysrdnYpQklfUkNbcnIrK109dnY7ZnVuY3Rpb24gaW50MmNoYXIobil7cmV0dXJuIEJJX1JNLmNoYXJBdChuKX1mdW5jdGlvbiBpbnRBdChzLGkpe3ZhciBjPUJJX1JDW3MuY2hhckNvZGVBdChpKV07cmV0dXJuIGM9PW51bGw/LTE6Y31mdW5jdGlvbiBibnBDb3B5VG8ocil7Zm9yKHZhciBpPXRoaXMudC0xO2k+PTA7LS1pKXJbaV09dGhpc1tpXTtyLnQ9dGhpcy50O3Iucz10aGlzLnN9ZnVuY3Rpb24gYm5wRnJvbUludCh4KXt0aGlzLnQ9MTt0aGlzLnM9eDwwPy0xOjA7aWYoeD4wKXRoaXNbMF09eDtlbHNlIGlmKHg8LTEpdGhpc1swXT14K0RWO2Vsc2UgdGhpcy50PTB9ZnVuY3Rpb24gbmJ2KGkpe3ZhciByPW5iaSgpO3IuZnJvbUludChpKTtyZXR1cm4gcn1mdW5jdGlvbiBibnBGcm9tU3RyaW5nKHMsYil7dmFyIGs7aWYoYj09MTYpaz00O2Vsc2UgaWYoYj09OClrPTM7ZWxzZSBpZihiPT0yNTYpaz04O2Vsc2UgaWYoYj09MilrPTE7ZWxzZSBpZihiPT0zMilrPTU7ZWxzZSBpZihiPT00KWs9MjtlbHNle3RoaXMuZnJvbVJhZGl4KHMsYik7cmV0dXJufXRoaXMudD0wO3RoaXMucz0wO3ZhciBpPXMubGVuZ3RoLG1pPWZhbHNlLHNoPTA7d2hpbGUoLS1pPj0wKXt2YXIgeD1rPT04P3NbaV0mMjU1OmludEF0KHMsaSk7aWYoeDwwKXtpZihzLmNoYXJBdChpKT09Ii0iKW1pPXRydWU7Y29udGludWV9bWk9ZmFsc2U7aWYoc2g9PTApdGhpc1t0aGlzLnQrK109eDtlbHNlIGlmKHNoK2s+dGhpcy5EQil7dGhpc1t0aGlzLnQtMV18PSh4JigxPDx0aGlzLkRCLXNoKS0xKTw8c2g7dGhpc1t0aGlzLnQrK109eD4+dGhpcy5EQi1zaH1lbHNlIHRoaXNbdGhpcy50LTFdfD14PDxzaDtzaCs9aztpZihzaD49dGhpcy5EQilzaC09dGhpcy5EQn1pZihrPT04JiYoc1swXSYxMjgpIT0wKXt0aGlzLnM9LTE7aWYoc2g+MCl0aGlzW3RoaXMudC0xXXw9KDE8PHRoaXMuREItc2gpLTE8PHNofXRoaXMuY2xhbXAoKTtpZihtaSlCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX1mdW5jdGlvbiBibnBDbGFtcCgpe3ZhciBjPXRoaXMucyZ0aGlzLkRNO3doaWxlKHRoaXMudD4wJiZ0aGlzW3RoaXMudC0xXT09YyktLXRoaXMudH1mdW5jdGlvbiBiblRvU3RyaW5nKGIpe2lmKHRoaXMuczwwKXJldHVybiItIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGIpO3ZhciBrO2lmKGI9PTE2KWs9NDtlbHNlIGlmKGI9PTgpaz0zO2Vsc2UgaWYoYj09MilrPTE7ZWxzZSBpZihiPT0zMilrPTU7ZWxzZSBpZihiPT00KWs9MjtlbHNlIHJldHVybiB0aGlzLnRvUmFkaXgoYik7dmFyIGttPSgxPDxrKS0xLGQsbT1mYWxzZSxyPSIiLGk9dGhpcy50O3ZhciBwPXRoaXMuREItaSp0aGlzLkRCJWs7aWYoaS0tPjApe2lmKHA8dGhpcy5EQiYmKGQ9dGhpc1tpXT4+cCk+MCl7bT10cnVlO3I9aW50MmNoYXIoZCl9d2hpbGUoaT49MCl7aWYocDxrKXtkPSh0aGlzW2ldJigxPDxwKS0xKTw8ay1wO2R8PXRoaXNbLS1pXT4+KHArPXRoaXMuREItayl9ZWxzZXtkPXRoaXNbaV0+PihwLT1rKSZrbTtpZihwPD0wKXtwKz10aGlzLkRCOy0taX19aWYoZD4wKW09dHJ1ZTtpZihtKXIrPWludDJjaGFyKGQpfX1yZXR1cm4gbT9yOiIwIn1mdW5jdGlvbiBibk5lZ2F0ZSgpe3ZhciByPW5iaSgpO0JpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHIpO3JldHVybiByfWZ1bmN0aW9uIGJuQWJzKCl7cmV0dXJuIHRoaXMuczwwP3RoaXMubmVnYXRlKCk6dGhpc31mdW5jdGlvbiBibkNvbXBhcmVUbyhhKXt2YXIgcj10aGlzLnMtYS5zO2lmKHIhPTApcmV0dXJuIHI7dmFyIGk9dGhpcy50O3I9aS1hLnQ7aWYociE9MClyZXR1cm4gdGhpcy5zPDA/LXI6cjt3aGlsZSgtLWk+PTApaWYoKHI9dGhpc1tpXS1hW2ldKSE9MClyZXR1cm4gcjtyZXR1cm4gMH1mdW5jdGlvbiBuYml0cyh4KXt2YXIgcj0xLHQ7aWYoKHQ9eD4+PjE2KSE9MCl7eD10O3IrPTE2fWlmKCh0PXg+PjgpIT0wKXt4PXQ7cis9OH1pZigodD14Pj40KSE9MCl7eD10O3IrPTR9aWYoKHQ9eD4+MikhPTApe3g9dDtyKz0yfWlmKCh0PXg+PjEpIT0wKXt4PXQ7cis9MX1yZXR1cm4gcn1mdW5jdGlvbiBibkJpdExlbmd0aCgpe2lmKHRoaXMudDw9MClyZXR1cm4gMDtyZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXnRoaXMucyZ0aGlzLkRNKX1mdW5jdGlvbiBibnBETFNoaWZ0VG8obixyKXt2YXIgaTtmb3IoaT10aGlzLnQtMTtpPj0wOy0taSlyW2krbl09dGhpc1tpXTtmb3IoaT1uLTE7aT49MDstLWkpcltpXT0wO3IudD10aGlzLnQrbjtyLnM9dGhpcy5zfWZ1bmN0aW9uIGJucERSU2hpZnRUbyhuLHIpe2Zvcih2YXIgaT1uO2k8dGhpcy50OysraSlyW2ktbl09dGhpc1tpXTtyLnQ9TWF0aC5tYXgodGhpcy50LW4sMCk7ci5zPXRoaXMuc31mdW5jdGlvbiBibnBMU2hpZnRUbyhuLHIpe3ZhciBicz1uJXRoaXMuREI7dmFyIGNicz10aGlzLkRCLWJzO3ZhciBibT0oMTw8Y2JzKS0xO3ZhciBkcz1NYXRoLmZsb29yKG4vdGhpcy5EQiksYz10aGlzLnM8PGJzJnRoaXMuRE0saTtmb3IoaT10aGlzLnQtMTtpPj0wOy0taSl7cltpK2RzKzFdPXRoaXNbaV0+PmNic3xjO2M9KHRoaXNbaV0mYm0pPDxic31mb3IoaT1kcy0xO2k+PTA7LS1pKXJbaV09MDtyW2RzXT1jO3IudD10aGlzLnQrZHMrMTtyLnM9dGhpcy5zO3IuY2xhbXAoKX1mdW5jdGlvbiBibnBSU2hpZnRUbyhuLHIpe3Iucz10aGlzLnM7dmFyIGRzPU1hdGguZmxvb3Iobi90aGlzLkRCKTtpZihkcz49dGhpcy50KXtyLnQ9MDtyZXR1cm59dmFyIGJzPW4ldGhpcy5EQjt2YXIgY2JzPXRoaXMuREItYnM7dmFyIGJtPSgxPDxicyktMTtyWzBdPXRoaXNbZHNdPj5icztmb3IodmFyIGk9ZHMrMTtpPHRoaXMudDsrK2kpe3JbaS1kcy0xXXw9KHRoaXNbaV0mYm0pPDxjYnM7cltpLWRzXT10aGlzW2ldPj5ic31pZihicz4wKXJbdGhpcy50LWRzLTFdfD0odGhpcy5zJmJtKTw8Y2JzO3IudD10aGlzLnQtZHM7ci5jbGFtcCgpfWZ1bmN0aW9uIGJucFN1YlRvKGEscil7dmFyIGk9MCxjPTAsbT1NYXRoLm1pbihhLnQsdGhpcy50KTt3aGlsZShpPG0pe2MrPXRoaXNbaV0tYVtpXTtyW2krK109YyZ0aGlzLkRNO2M+Pj10aGlzLkRCfWlmKGEudDx0aGlzLnQpe2MtPWEuczt3aGlsZShpPHRoaXMudCl7Yys9dGhpc1tpXTtyW2krK109YyZ0aGlzLkRNO2M+Pj10aGlzLkRCfWMrPXRoaXMuc31lbHNle2MrPXRoaXMuczt3aGlsZShpPGEudCl7Yy09YVtpXTtyW2krK109YyZ0aGlzLkRNO2M+Pj10aGlzLkRCfWMtPWEuc31yLnM9YzwwPy0xOjA7aWYoYzwtMSlyW2krK109dGhpcy5EVitjO2Vsc2UgaWYoYz4wKXJbaSsrXT1jO3IudD1pO3IuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVRvKGEscil7dmFyIHg9dGhpcy5hYnMoKSx5PWEuYWJzKCk7dmFyIGk9eC50O3IudD1pK3kudDt3aGlsZSgtLWk+PTApcltpXT0wO2ZvcihpPTA7aTx5LnQ7KytpKXJbaSt4LnRdPXguYW0oMCx5W2ldLHIsaSwwLHgudCk7ci5zPTA7ci5jbGFtcCgpO2lmKHRoaXMucyE9YS5zKUJpZ0ludGVnZXIuWkVSTy5zdWJUbyhyLHIpfWZ1bmN0aW9uIGJucFNxdWFyZVRvKHIpe3ZhciB4PXRoaXMuYWJzKCk7dmFyIGk9ci50PTIqeC50O3doaWxlKC0taT49MClyW2ldPTA7Zm9yKGk9MDtpPHgudC0xOysraSl7dmFyIGM9eC5hbShpLHhbaV0sciwyKmksMCwxKTtpZigocltpK3gudF0rPXguYW0oaSsxLDIqeFtpXSxyLDIqaSsxLGMseC50LWktMSkpPj14LkRWKXtyW2kreC50XS09eC5EVjtyW2kreC50KzFdPTF9fWlmKHIudD4wKXJbci50LTFdKz14LmFtKGkseFtpXSxyLDIqaSwwLDEpO3Iucz0wO3IuY2xhbXAoKX1mdW5jdGlvbiBibnBEaXZSZW1UbyhtLHEscil7dmFyIHBtPW0uYWJzKCk7aWYocG0udDw9MClyZXR1cm47dmFyIHB0PXRoaXMuYWJzKCk7aWYocHQudDxwbS50KXtpZihxIT1udWxsKXEuZnJvbUludCgwKTtpZihyIT1udWxsKXRoaXMuY29weVRvKHIpO3JldHVybn1pZihyPT1udWxsKXI9bmJpKCk7dmFyIHk9bmJpKCksdHM9dGhpcy5zLG1zPW0uczt2YXIgbnNoPXRoaXMuREItbmJpdHMocG1bcG0udC0xXSk7aWYobnNoPjApe3BtLmxTaGlmdFRvKG5zaCx5KTtwdC5sU2hpZnRUbyhuc2gscil9ZWxzZXtwbS5jb3B5VG8oeSk7cHQuY29weVRvKHIpfXZhciB5cz15LnQ7dmFyIHkwPXlbeXMtMV07aWYoeTA9PTApcmV0dXJuO3ZhciB5dD15MCooMTw8dGhpcy5GMSkrKHlzPjE/eVt5cy0yXT4+dGhpcy5GMjowKTt2YXIgZDE9dGhpcy5GVi95dCxkMj0oMTw8dGhpcy5GMSkveXQsZT0xPDx0aGlzLkYyO3ZhciBpPXIudCxqPWkteXMsdD1xPT1udWxsP25iaSgpOnE7eS5kbFNoaWZ0VG8oaix0KTtpZihyLmNvbXBhcmVUbyh0KT49MCl7cltyLnQrK109MTtyLnN1YlRvKHQscil9QmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKHlzLHQpO3Quc3ViVG8oeSx5KTt3aGlsZSh5LnQ8eXMpeVt5LnQrK109MDt3aGlsZSgtLWo+PTApe3ZhciBxZD1yWy0taV09PXkwP3RoaXMuRE06TWF0aC5mbG9vcihyW2ldKmQxKyhyW2ktMV0rZSkqZDIpO2lmKChyW2ldKz15LmFtKDAscWQscixqLDAseXMpKTxxZCl7eS5kbFNoaWZ0VG8oaix0KTtyLnN1YlRvKHQscik7d2hpbGUocltpXTwtLXFkKXIuc3ViVG8odCxyKX19aWYocSE9bnVsbCl7ci5kclNoaWZ0VG8oeXMscSk7aWYodHMhPW1zKUJpZ0ludGVnZXIuWkVSTy5zdWJUbyhxLHEpfXIudD15cztyLmNsYW1wKCk7aWYobnNoPjApci5yU2hpZnRUbyhuc2gscik7aWYodHM8MClCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKX1mdW5jdGlvbiBibk1vZChhKXt2YXIgcj1uYmkoKTt0aGlzLmFicygpLmRpdlJlbVRvKGEsbnVsbCxyKTtpZih0aGlzLnM8MCYmci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKT4wKWEuc3ViVG8ocixyKTtyZXR1cm4gcn1mdW5jdGlvbiBDbGFzc2ljKG0pe3RoaXMubT1tfWZ1bmN0aW9uIGNDb252ZXJ0KHgpe2lmKHguczwwfHx4LmNvbXBhcmVUbyh0aGlzLm0pPj0wKXJldHVybiB4Lm1vZCh0aGlzLm0pO2Vsc2UgcmV0dXJuIHh9ZnVuY3Rpb24gY1JldmVydCh4KXtyZXR1cm4geH1mdW5jdGlvbiBjUmVkdWNlKHgpe3guZGl2UmVtVG8odGhpcy5tLG51bGwseCl9ZnVuY3Rpb24gY011bFRvKHgseSxyKXt4Lm11bHRpcGx5VG8oeSxyKTt0aGlzLnJlZHVjZShyKX1mdW5jdGlvbiBjU3FyVG8oeCxyKXt4LnNxdWFyZVRvKHIpO3RoaXMucmVkdWNlKHIpfUNsYXNzaWMucHJvdG90eXBlLmNvbnZlcnQ9Y0NvbnZlcnQ7Q2xhc3NpYy5wcm90b3R5cGUucmV2ZXJ0PWNSZXZlcnQ7Q2xhc3NpYy5wcm90b3R5cGUucmVkdWNlPWNSZWR1Y2U7Q2xhc3NpYy5wcm90b3R5cGUubXVsVG89Y011bFRvO0NsYXNzaWMucHJvdG90eXBlLnNxclRvPWNTcXJUbztmdW5jdGlvbiBibnBJbnZEaWdpdCgpe2lmKHRoaXMudDwxKXJldHVybiAwO3ZhciB4PXRoaXNbMF07aWYoKHgmMSk9PTApcmV0dXJuIDA7dmFyIHk9eCYzO3k9eSooMi0oeCYxNSkqeSkmMTU7eT15KigyLSh4JjI1NSkqeSkmMjU1O3k9eSooMi0oKHgmNjU1MzUpKnkmNjU1MzUpKSY2NTUzNTt5PXkqKDIteCp5JXRoaXMuRFYpJXRoaXMuRFY7cmV0dXJuIHk+MD90aGlzLkRWLXk6LXl9ZnVuY3Rpb24gTW9udGdvbWVyeShtKXt0aGlzLm09bTt0aGlzLm1wPW0uaW52RGlnaXQoKTt0aGlzLm1wbD10aGlzLm1wJjMyNzY3O3RoaXMubXBoPXRoaXMubXA+PjE1O3RoaXMudW09KDE8PG0uREItMTUpLTE7dGhpcy5tdDI9MiptLnR9ZnVuY3Rpb24gbW9udENvbnZlcnQoeCl7dmFyIHI9bmJpKCk7eC5hYnMoKS5kbFNoaWZ0VG8odGhpcy5tLnQscik7ci5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxyKTtpZih4LnM8MCYmci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKT4wKXRoaXMubS5zdWJUbyhyLHIpO3JldHVybiByfWZ1bmN0aW9uIG1vbnRSZXZlcnQoeCl7dmFyIHI9bmJpKCk7eC5jb3B5VG8ocik7dGhpcy5yZWR1Y2Uocik7cmV0dXJuIHJ9ZnVuY3Rpb24gbW9udFJlZHVjZSh4KXt3aGlsZSh4LnQ8PXRoaXMubXQyKXhbeC50KytdPTA7Zm9yKHZhciBpPTA7aTx0aGlzLm0udDsrK2kpe3ZhciBqPXhbaV0mMzI3Njc7dmFyIHUwPWoqdGhpcy5tcGwrKChqKnRoaXMubXBoKyh4W2ldPj4xNSkqdGhpcy5tcGwmdGhpcy51bSk8PDE1KSZ4LkRNO2o9aSt0aGlzLm0udDt4W2pdKz10aGlzLm0uYW0oMCx1MCx4LGksMCx0aGlzLm0udCk7d2hpbGUoeFtqXT49eC5EVil7eFtqXS09eC5EVjt4Wysral0rK319eC5jbGFtcCgpO3guZHJTaGlmdFRvKHRoaXMubS50LHgpO2lmKHguY29tcGFyZVRvKHRoaXMubSk+PTApeC5zdWJUbyh0aGlzLm0seCl9ZnVuY3Rpb24gbW9udFNxclRvKHgscil7eC5zcXVhcmVUbyhyKTt0aGlzLnJlZHVjZShyKX1mdW5jdGlvbiBtb250TXVsVG8oeCx5LHIpe3gubXVsdGlwbHlUbyh5LHIpO3RoaXMucmVkdWNlKHIpfU1vbnRnb21lcnkucHJvdG90eXBlLmNvbnZlcnQ9bW9udENvbnZlcnQ7TW9udGdvbWVyeS5wcm90b3R5cGUucmV2ZXJ0PW1vbnRSZXZlcnQ7TW9udGdvbWVyeS5wcm90b3R5cGUucmVkdWNlPW1vbnRSZWR1Y2U7TW9udGdvbWVyeS5wcm90b3R5cGUubXVsVG89bW9udE11bFRvO01vbnRnb21lcnkucHJvdG90eXBlLnNxclRvPW1vbnRTcXJUbztmdW5jdGlvbiBibnBJc0V2ZW4oKXtyZXR1cm4odGhpcy50PjA/dGhpc1swXSYxOnRoaXMucyk9PTB9ZnVuY3Rpb24gYm5wRXhwKGUseil7aWYoZT40Mjk0OTY3Mjk1fHxlPDEpcmV0dXJuIEJpZ0ludGVnZXIuT05FO3ZhciByPW5iaSgpLHIyPW5iaSgpLGc9ei5jb252ZXJ0KHRoaXMpLGk9bmJpdHMoZSktMTtnLmNvcHlUbyhyKTt3aGlsZSgtLWk+PTApe3ouc3FyVG8ocixyMik7aWYoKGUmMTw8aSk+MCl6Lm11bFRvKHIyLGcscik7ZWxzZXt2YXIgdD1yO3I9cjI7cjI9dH19cmV0dXJuIHoucmV2ZXJ0KHIpfWZ1bmN0aW9uIGJuTW9kUG93SW50KGUsbSl7dmFyIHo7aWYoZTwyNTZ8fG0uaXNFdmVuKCkpej1uZXcgQ2xhc3NpYyhtKTtlbHNlIHo9bmV3IE1vbnRnb21lcnkobSk7cmV0dXJuIHRoaXMuZXhwKGUseil9QmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvPWJucENvcHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50PWJucEZyb21JbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZz1ibnBGcm9tU3RyaW5nO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wPWJucENsYW1wO0JpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbz1ibnBETFNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvPWJucERSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbz1ibnBMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbz1ibnBSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbz1ibnBTdWJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvPWJucE11bHRpcGx5VG87QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG89Ym5wU3F1YXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG89Ym5wRGl2UmVtVG87QmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQ9Ym5wSW52RGlnaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuPWJucElzRXZlbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHA9Ym5wRXhwO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nPWJuVG9TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlPWJuTmVnYXRlO0JpZ0ludGVnZXIucHJvdG90eXBlLmFicz1ibkFicztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG89Ym5Db21wYXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoPWJuQml0TGVuZ3RoO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZD1ibk1vZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQ9Ym5Nb2RQb3dJbnQ7QmlnSW50ZWdlci5aRVJPPW5idigwKTtCaWdJbnRlZ2VyLk9ORT1uYnYoMSk7ZnVuY3Rpb24gYm5wRnJvbVJhZGl4KHMsYil7dGhpcy5mcm9tSW50KDApO2lmKGI9PW51bGwpYj0xMDt2YXIgY3M9dGhpcy5jaHVua1NpemUoYik7dmFyIGQ9TWF0aC5wb3coYixjcyksbWk9ZmFsc2Usaj0wLHc9MDtmb3IodmFyIGk9MDtpPHMubGVuZ3RoOysraSl7dmFyIHg9aW50QXQocyxpKTtpZih4PDApe2lmKHMuY2hhckF0KGkpPT0iLSImJnRoaXMuc2lnbnVtKCk9PTApbWk9dHJ1ZTtjb250aW51ZX13PWIqdyt4O2lmKCsraj49Y3Mpe3RoaXMuZE11bHRpcGx5KGQpO3RoaXMuZEFkZE9mZnNldCh3LDApO2o9MDt3PTB9fWlmKGo+MCl7dGhpcy5kTXVsdGlwbHkoTWF0aC5wb3coYixqKSk7dGhpcy5kQWRkT2Zmc2V0KHcsMCl9aWYobWkpQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyl9ZnVuY3Rpb24gYm5wQ2h1bmtTaXplKHIpe3JldHVybiBNYXRoLmZsb29yKE1hdGguTE4yKnRoaXMuREIvTWF0aC5sb2cocikpfWZ1bmN0aW9uIGJuU2lnTnVtKCl7aWYodGhpcy5zPDApcmV0dXJuLTE7ZWxzZSBpZih0aGlzLnQ8PTB8fHRoaXMudD09MSYmdGhpc1swXTw9MClyZXR1cm4gMDtlbHNlIHJldHVybiAxfWZ1bmN0aW9uIGJucERNdWx0aXBseShuKXt0aGlzW3RoaXMudF09dGhpcy5hbSgwLG4tMSx0aGlzLDAsMCx0aGlzLnQpOysrdGhpcy50O3RoaXMuY2xhbXAoKX1mdW5jdGlvbiBibnBEQWRkT2Zmc2V0KG4sdyl7aWYobj09MClyZXR1cm47d2hpbGUodGhpcy50PD13KXRoaXNbdGhpcy50KytdPTA7dGhpc1t3XSs9bjt3aGlsZSh0aGlzW3ddPj10aGlzLkRWKXt0aGlzW3ddLT10aGlzLkRWO2lmKCsrdz49dGhpcy50KXRoaXNbdGhpcy50KytdPTA7Kyt0aGlzW3ddfX1mdW5jdGlvbiBibnBUb1JhZGl4KGIpe2lmKGI9PW51bGwpYj0xMDtpZih0aGlzLnNpZ251bSgpPT0wfHxiPDJ8fGI+MzYpcmV0dXJuIjAiO3ZhciBjcz10aGlzLmNodW5rU2l6ZShiKTt2YXIgYT1NYXRoLnBvdyhiLGNzKTt2YXIgZD1uYnYoYSkseT1uYmkoKSx6PW5iaSgpLHI9IiI7dGhpcy5kaXZSZW1UbyhkLHkseik7d2hpbGUoeS5zaWdudW0oKT4wKXtyPShhK3ouaW50VmFsdWUoKSkudG9TdHJpbmcoYikuc3Vic3RyKDEpK3I7eS5kaXZSZW1UbyhkLHkseil9cmV0dXJuIHouaW50VmFsdWUoKS50b1N0cmluZyhiKStyfWZ1bmN0aW9uIGJuSW50VmFsdWUoKXtpZih0aGlzLnM8MCl7aWYodGhpcy50PT0xKXJldHVybiB0aGlzWzBdLXRoaXMuRFY7ZWxzZSBpZih0aGlzLnQ9PTApcmV0dXJuLTF9ZWxzZSBpZih0aGlzLnQ9PTEpcmV0dXJuIHRoaXNbMF07ZWxzZSBpZih0aGlzLnQ9PTApcmV0dXJuIDA7cmV0dXJuKHRoaXNbMV0mKDE8PDMyLXRoaXMuREIpLTEpPDx0aGlzLkRCfHRoaXNbMF19ZnVuY3Rpb24gYm5wQWRkVG8oYSxyKXt2YXIgaT0wLGM9MCxtPU1hdGgubWluKGEudCx0aGlzLnQpO3doaWxlKGk8bSl7Yys9dGhpc1tpXSthW2ldO3JbaSsrXT1jJnRoaXMuRE07Yz4+PXRoaXMuREJ9aWYoYS50PHRoaXMudCl7Yys9YS5zO3doaWxlKGk8dGhpcy50KXtjKz10aGlzW2ldO3JbaSsrXT1jJnRoaXMuRE07Yz4+PXRoaXMuREJ9Yys9dGhpcy5zfWVsc2V7Yys9dGhpcy5zO3doaWxlKGk8YS50KXtjKz1hW2ldO3JbaSsrXT1jJnRoaXMuRE07Yz4+PXRoaXMuREJ9Yys9YS5zfXIucz1jPDA/LTE6MDtpZihjPjApcltpKytdPWM7ZWxzZSBpZihjPC0xKXJbaSsrXT10aGlzLkRWK2M7ci50PWk7ci5jbGFtcCgpfUJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeD1ibnBGcm9tUmFkaXg7QmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplPWJucENodW5rU2l6ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaWdudW09Ym5TaWdOdW07QmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5PWJucERNdWx0aXBseTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kQWRkT2Zmc2V0PWJucERBZGRPZmZzZXQ7QmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeD1ibnBUb1JhZGl4O0JpZ0ludGVnZXIucHJvdG90eXBlLmludFZhbHVlPWJuSW50VmFsdWU7QmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG89Ym5wQWRkVG87dmFyIFdyYXBwZXI9e2FiczooZnVuY3Rpb24obCxoKXt2YXIgeD1uZXcgZ29vZy5tYXRoLkxvbmcobCxoKTt2YXIgcmV0O2lmKHguaXNOZWdhdGl2ZSgpKXtyZXQ9eC5uZWdhdGUoKX1lbHNle3JldD14fUhFQVAzMlt0ZW1wRG91YmxlUHRyPj4yXT1yZXQubG93XztIRUFQMzJbdGVtcERvdWJsZVB0cis0Pj4yXT1yZXQuaGlnaF99KSxlbnN1cmVUZW1wczooZnVuY3Rpb24oKXtpZihXcmFwcGVyLmVuc3VyZWRUZW1wcylyZXR1cm47V3JhcHBlci5lbnN1cmVkVGVtcHM9dHJ1ZTtXcmFwcGVyLnR3bzMyPW5ldyBCaWdJbnRlZ2VyO1dyYXBwZXIudHdvMzIuZnJvbVN0cmluZygiNDI5NDk2NzI5NiIsMTApO1dyYXBwZXIudHdvNjQ9bmV3IEJpZ0ludGVnZXI7V3JhcHBlci50d282NC5mcm9tU3RyaW5nKCIxODQ0Njc0NDA3MzcwOTU1MTYxNiIsMTApO1dyYXBwZXIudGVtcDE9bmV3IEJpZ0ludGVnZXI7V3JhcHBlci50ZW1wMj1uZXcgQmlnSW50ZWdlcn0pLGxoMmJpZ251bTooZnVuY3Rpb24obCxoKXt2YXIgYT1uZXcgQmlnSW50ZWdlcjthLmZyb21TdHJpbmcoaC50b1N0cmluZygpLDEwKTt2YXIgYj1uZXcgQmlnSW50ZWdlcjthLm11bHRpcGx5VG8oV3JhcHBlci50d28zMixiKTt2YXIgYz1uZXcgQmlnSW50ZWdlcjtjLmZyb21TdHJpbmcobC50b1N0cmluZygpLDEwKTt2YXIgZD1uZXcgQmlnSW50ZWdlcjtjLmFkZFRvKGIsZCk7cmV0dXJuIGR9KSxzdHJpbmdpZnk6KGZ1bmN0aW9uKGwsaCx1bnNpZ25lZCl7dmFyIHJldD0obmV3IGdvb2cubWF0aC5Mb25nKGwsaCkpLnRvU3RyaW5nKCk7aWYodW5zaWduZWQmJnJldFswXT09Ii0iKXtXcmFwcGVyLmVuc3VyZVRlbXBzKCk7dmFyIGJpZ251bT1uZXcgQmlnSW50ZWdlcjtiaWdudW0uZnJvbVN0cmluZyhyZXQsMTApO3JldD1uZXcgQmlnSW50ZWdlcjtXcmFwcGVyLnR3bzY0LmFkZFRvKGJpZ251bSxyZXQpO3JldD1yZXQudG9TdHJpbmcoMTApfXJldHVybiByZXR9KSxmcm9tU3RyaW5nOihmdW5jdGlvbihzdHIsYmFzZSxtaW4sbWF4LHVuc2lnbmVkKXtXcmFwcGVyLmVuc3VyZVRlbXBzKCk7dmFyIGJpZ251bT1uZXcgQmlnSW50ZWdlcjtiaWdudW0uZnJvbVN0cmluZyhzdHIsYmFzZSk7dmFyIGJpZ21pbj1uZXcgQmlnSW50ZWdlcjtiaWdtaW4uZnJvbVN0cmluZyhtaW4sMTApO3ZhciBiaWdtYXg9bmV3IEJpZ0ludGVnZXI7YmlnbWF4LmZyb21TdHJpbmcobWF4LDEwKTtpZih1bnNpZ25lZCYmYmlnbnVtLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPDApe3ZhciB0ZW1wPW5ldyBCaWdJbnRlZ2VyO2JpZ251bS5hZGRUbyhXcmFwcGVyLnR3bzY0LHRlbXApO2JpZ251bT10ZW1wfXZhciBlcnJvcj1mYWxzZTtpZihiaWdudW0uY29tcGFyZVRvKGJpZ21pbik8MCl7YmlnbnVtPWJpZ21pbjtlcnJvcj10cnVlfWVsc2UgaWYoYmlnbnVtLmNvbXBhcmVUbyhiaWdtYXgpPjApe2JpZ251bT1iaWdtYXg7ZXJyb3I9dHJ1ZX12YXIgcmV0PWdvb2cubWF0aC5Mb25nLmZyb21TdHJpbmcoYmlnbnVtLnRvU3RyaW5nKCkpO0hFQVAzMlt0ZW1wRG91YmxlUHRyPj4yXT1yZXQubG93XztIRUFQMzJbdGVtcERvdWJsZVB0cis0Pj4yXT1yZXQuaGlnaF87aWYoZXJyb3IpdGhyb3cicmFuZ2UgZXJyb3IifSl9O3JldHVybiBXcmFwcGVyfSkoKTtpZihtZW1vcnlJbml0aWFsaXplcil7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERXx8RU5WSVJPTk1FTlRfSVNfU0hFTEwpe3ZhciBkYXRhPU1vZHVsZVsicmVhZEJpbmFyeSJdKG1lbW9yeUluaXRpYWxpemVyKTtIRUFQVTguc2V0KGRhdGEsU1RBVElDX0JBU0UpfWVsc2V7YWRkUnVuRGVwZW5kZW5jeSgibWVtb3J5IGluaXRpYWxpemVyIik7QnJvd3Nlci5hc3luY0xvYWQobWVtb3J5SW5pdGlhbGl6ZXIsKGZ1bmN0aW9uKGRhdGEpe0hFQVBVOC5zZXQoZGF0YSxTVEFUSUNfQkFTRSk7cmVtb3ZlUnVuRGVwZW5kZW5jeSgibWVtb3J5IGluaXRpYWxpemVyIil9KSwoZnVuY3Rpb24oZGF0YSl7dGhyb3ciY291bGQgbm90IGxvYWQgbWVtb3J5IGluaXRpYWxpemVyICIrbWVtb3J5SW5pdGlhbGl6ZXJ9KSl9fWZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiO3RoaXMubWVzc2FnZT0iUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiK3N0YXR1cysiKSI7dGhpcy5zdGF0dXM9c3RhdHVzfUV4aXRTdGF0dXMucHJvdG90eXBlPW5ldyBFcnJvcjtFeGl0U3RhdHVzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FeGl0U3RhdHVzO3ZhciBpbml0aWFsU3RhY2tUb3A7dmFyIHByZWxvYWRTdGFydFRpbWU9bnVsbDt2YXIgY2FsbGVkTWFpbj1mYWxzZTtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9ZnVuY3Rpb24gcnVuQ2FsbGVyKCl7aWYoIU1vZHVsZVsiY2FsbGVkUnVuIl0mJnNob3VsZFJ1bk5vdylydW4oKTtpZighTW9kdWxlWyJjYWxsZWRSdW4iXSlkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9cnVuQ2FsbGVyfTtNb2R1bGVbImNhbGxNYWluIl09TW9kdWxlLmNhbGxNYWluPWZ1bmN0aW9uIGNhbGxNYWluKGFyZ3Mpe2Fzc2VydChydW5EZXBlbmRlbmNpZXM9PTAsImNhbm5vdCBjYWxsIG1haW4gd2hlbiBhc3luYyBkZXBlbmRlbmNpZXMgcmVtYWluISAobGlzdGVuIG9uIF9fQVRNQUlOX18pIik7YXNzZXJ0KF9fQVRQUkVSVU5fXy5sZW5ndGg9PTAsImNhbm5vdCBjYWxsIG1haW4gd2hlbiBwcmVSdW4gZnVuY3Rpb25zIHJlbWFpbiB0byBiZSBjYWxsZWQiKTthcmdzPWFyZ3N8fFtdO2Vuc3VyZUluaXRSdW50aW1lKCk7dmFyIGFyZ2M9YXJncy5sZW5ndGgrMTtmdW5jdGlvbiBwYWQoKXtmb3IodmFyIGk9MDtpPDQtMTtpKyspe2FyZ3YucHVzaCgwKX19dmFyIGFyZ3Y9W2FsbG9jYXRlKGludEFycmF5RnJvbVN0cmluZygiL2Jpbi90aGlzLnByb2dyYW0iKSwiaTgiLEFMTE9DX05PUk1BTCldO3BhZCgpO2Zvcih2YXIgaT0wO2k8YXJnYy0xO2k9aSsxKXthcmd2LnB1c2goYWxsb2NhdGUoaW50QXJyYXlGcm9tU3RyaW5nKGFyZ3NbaV0pLCJpOCIsQUxMT0NfTk9STUFMKSk7cGFkKCl9YXJndi5wdXNoKDApO2FyZ3Y9YWxsb2NhdGUoYXJndiwiaTMyIixBTExPQ19OT1JNQUwpO2luaXRpYWxTdGFja1RvcD1TVEFDS1RPUDt0cnl7dmFyIHJldD1Nb2R1bGVbIl9tYWluIl0oYXJnYyxhcmd2LDApO2lmKCFNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSl7ZXhpdChyZXQpfX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgRXhpdFN0YXR1cyl7cmV0dXJufWVsc2UgaWYoZT09IlNpbXVsYXRlSW5maW5pdGVMb29wIil7TW9kdWxlWyJub0V4aXRSdW50aW1lIl09dHJ1ZTtyZXR1cm59ZWxzZXtpZihlJiZ0eXBlb2YgZT09PSJvYmplY3QiJiZlLnN0YWNrKU1vZHVsZS5wcmludEVycigiZXhjZXB0aW9uIHRocm93bjogIitbZSxlLnN0YWNrXSk7dGhyb3cgZX19ZmluYWxseXtjYWxsZWRNYWluPXRydWV9fTtmdW5jdGlvbiBydW4oYXJncyl7YXJncz1hcmdzfHxNb2R1bGVbImFyZ3VtZW50cyJdO2lmKHByZWxvYWRTdGFydFRpbWU9PT1udWxsKXByZWxvYWRTdGFydFRpbWU9RGF0ZS5ub3coKTtpZihydW5EZXBlbmRlbmNpZXM+MCl7TW9kdWxlLnByaW50RXJyKCJydW4oKSBjYWxsZWQsIGJ1dCBkZXBlbmRlbmNpZXMgcmVtYWluLCBzbyBub3QgcnVubmluZyIpO3JldHVybn1wcmVSdW4oKTtpZihydW5EZXBlbmRlbmNpZXM+MClyZXR1cm47aWYoTW9kdWxlWyJjYWxsZWRSdW4iXSlyZXR1cm47ZnVuY3Rpb24gZG9SdW4oKXtpZihNb2R1bGVbImNhbGxlZFJ1biJdKXJldHVybjtNb2R1bGVbImNhbGxlZFJ1biJdPXRydWU7ZW5zdXJlSW5pdFJ1bnRpbWUoKTtwcmVNYWluKCk7aWYoRU5WSVJPTk1FTlRfSVNfV0VCJiZwcmVsb2FkU3RhcnRUaW1lIT09bnVsbCl7TW9kdWxlLnByaW50RXJyKCJwcmUtbWFpbiBwcmVwIHRpbWU6ICIrKERhdGUubm93KCktcHJlbG9hZFN0YXJ0VGltZSkrIiBtcyIpfWlmKE1vZHVsZVsiX21haW4iXSYmc2hvdWxkUnVuTm93KXtNb2R1bGVbImNhbGxNYWluIl0oYXJncyl9cG9zdFJ1bigpfWlmKE1vZHVsZVsic2V0U3RhdHVzIl0pe01vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7TW9kdWxlWyJzZXRTdGF0dXMiXSgiIil9KSwxKTtpZighQUJPUlQpZG9SdW4oKX0pLDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlWyJydW4iXT1Nb2R1bGUucnVuPXJ1bjtmdW5jdGlvbiBleGl0KHN0YXR1cyl7QUJPUlQ9dHJ1ZTtFWElUU1RBVFVTPXN0YXR1cztTVEFDS1RPUD1pbml0aWFsU3RhY2tUb3A7ZXhpdFJ1bnRpbWUoKTt0aHJvdyBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpfU1vZHVsZVsiZXhpdCJdPU1vZHVsZS5leGl0PWV4aXQ7ZnVuY3Rpb24gYWJvcnQodGV4dCl7aWYodGV4dCl7TW9kdWxlLnByaW50KHRleHQpO01vZHVsZS5wcmludEVycih0ZXh0KX1BQk9SVD10cnVlO0VYSVRTVEFUVVM9MTt2YXIgZXh0cmE9IlxuSWYgdGhpcyBhYm9ydCgpIGlzIHVuZXhwZWN0ZWQsIGJ1aWxkIHdpdGggLXMgQVNTRVJUSU9OUz0xIHdoaWNoIGNhbiBnaXZlIG1vcmUgaW5mb3JtYXRpb24uIjt0aHJvdyJhYm9ydCgpIGF0ICIrc3RhY2tUcmFjZSgpK2V4dHJhfU1vZHVsZVsiYWJvcnQiXT1Nb2R1bGUuYWJvcnQ9YWJvcnQ7dmFyIEludGVybmFsRXJyb3I9TW9kdWxlWyJJbnRlcm5hbEVycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIkludGVybmFsRXJyb3IiKTt2YXIgQmluZGluZ0Vycm9yPU1vZHVsZVsiQmluZGluZ0Vycm9yIl09ZXh0ZW5kRXJyb3IoRXJyb3IsIkJpbmRpbmdFcnJvciIpO3ZhciBVbmJvdW5kVHlwZUVycm9yPU1vZHVsZVsiVW5ib3VuZFR5cGVFcnJvciJdPWV4dGVuZEVycm9yKEJpbmRpbmdFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpO3ZhciBQdXJlVmlydHVhbEVycm9yPU1vZHVsZVsiUHVyZVZpcnR1YWxFcnJvciJdPWV4dGVuZEVycm9yKEJpbmRpbmdFcnJvciwiUHVyZVZpcnR1YWxFcnJvciIpO2Z1bmN0aW9uIHRocm93SW50ZXJuYWxFcnJvcihtZXNzYWdlKXt0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihtZXNzYWdlKX1mdW5jdGlvbiB0aHJvd0JpbmRpbmdFcnJvcihtZXNzYWdlKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKG1lc3NhZ2UpfWZ1bmN0aW9uIHRocm93VW5ib3VuZFR5cGVFcnJvcihtZXNzYWdlLHR5cGVzKXt2YXIgdW5ib3VuZFR5cGVzPVtdO3ZhciBzZWVuPXt9O2Z1bmN0aW9uIHZpc2l0KHR5cGUpe2lmKHNlZW5bdHlwZV0pe3JldHVybn1pZihyZWdpc3RlcmVkVHlwZXNbdHlwZV0pe3JldHVybn1pZih0eXBlRGVwZW5kZW5jaWVzW3R5cGVdKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdLmZvckVhY2godmlzaXQpO3JldHVybn11bmJvdW5kVHlwZXMucHVzaCh0eXBlKTtzZWVuW3R5cGVdPXRydWV9dHlwZXMuZm9yRWFjaCh2aXNpdCk7dGhyb3cgbmV3IFVuYm91bmRUeXBlRXJyb3IobWVzc2FnZSsiOiAiK3VuYm91bmRUeXBlcy5tYXAoZ2V0VHlwZU5hbWUpLmpvaW4oWyIsICJdKSl9ZnVuY3Rpb24gZW5zdXJlT3ZlcmxvYWRUYWJsZShwcm90byxtZXRob2ROYW1lLGh1bWFuTmFtZSl7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7dmFyIHByZXZGdW5jPXByb3RvW21ldGhvZE5hbWVdO3Byb3RvW21ldGhvZE5hbWVdPShmdW5jdGlvbigpe2lmKCFwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGFyZ3VtZW50cy5sZW5ndGgpKXt0aHJvd0JpbmRpbmdFcnJvcigiRnVuY3Rpb24gJyIraHVtYW5OYW1lKyInIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoIithcmd1bWVudHMubGVuZ3RoKyIpIC0gZXhwZWN0cyBvbmUgb2YgKCIrcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSsiKSEiKX1yZXR1cm4gcHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZVthcmd1bWVudHMubGVuZ3RoXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KTtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlPVtdO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbcHJldkZ1bmMuYXJnQ291bnRdPXByZXZGdW5jfX1mdW5jdGlvbiBleHBvc2VQdWJsaWNTeW1ib2wobmFtZSx2YWx1ZSxudW1Bcmd1bWVudHMpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSl7aWYodW5kZWZpbmVkPT09bnVtQXJndW1lbnRzfHx1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZSYmdW5kZWZpbmVkIT09TW9kdWxlW25hbWVdLm92ZXJsb2FkVGFibGVbbnVtQXJndW1lbnRzXSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBwdWJsaWMgbmFtZSAnIituYW1lKyInIHR3aWNlIil9ZW5zdXJlT3ZlcmxvYWRUYWJsZShNb2R1bGUsbmFtZSxuYW1lKTtpZihNb2R1bGUuaGFzT3duUHJvcGVydHkobnVtQXJndW1lbnRzKSl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCByZWdpc3RlciBtdWx0aXBsZSBvdmVybG9hZHMgb2YgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgKCIrbnVtQXJndW1lbnRzKyIpISIpfU1vZHVsZVtuYW1lXS5vdmVybG9hZFRhYmxlW251bUFyZ3VtZW50c109dmFsdWV9ZWxzZXtNb2R1bGVbbmFtZV09dmFsdWU7aWYodW5kZWZpbmVkIT09bnVtQXJndW1lbnRzKXtNb2R1bGVbbmFtZV0ubnVtQXJndW1lbnRzPW51bUFyZ3VtZW50c319fWZ1bmN0aW9uIHJlcGxhY2VQdWJsaWNTeW1ib2wobmFtZSx2YWx1ZSxudW1Bcmd1bWVudHMpe2lmKCFNb2R1bGUuaGFzT3duUHJvcGVydHkobmFtZSkpe3Rocm93SW50ZXJuYWxFcnJvcigiUmVwbGFjaW5nIG5vbmV4aXN0YW50IHB1YmxpYyBzeW1ib2wiKX1pZih1bmRlZmluZWQhPT1Nb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZSYmdW5kZWZpbmVkIT09bnVtQXJndW1lbnRzKXtNb2R1bGVbbmFtZV0ub3ZlcmxvYWRUYWJsZVtudW1Bcmd1bWVudHNdPXZhbHVlfWVsc2V7TW9kdWxlW25hbWVdPXZhbHVlfX1mdW5jdGlvbiBleHRlbmRFcnJvcihiYXNlRXJyb3JUeXBlLGVycm9yTmFtZSl7dmFyIGVycm9yQ2xhc3M9Y3JlYXRlTmFtZWRGdW5jdGlvbihlcnJvck5hbWUsKGZ1bmN0aW9uKG1lc3NhZ2Upe3RoaXMubmFtZT1lcnJvck5hbWU7dGhpcy5tZXNzYWdlPW1lc3NhZ2U7dmFyIHN0YWNrPShuZXcgRXJyb3IobWVzc2FnZSkpLnN0YWNrO2lmKHN0YWNrIT09dW5kZWZpbmVkKXt0aGlzLnN0YWNrPXRoaXMudG9TdHJpbmcoKSsiXG4iK3N0YWNrLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpfX0pKTtlcnJvckNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGJhc2VFcnJvclR5cGUucHJvdG90eXBlKTtlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lcnJvckNsYXNzO2Vycm9yQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPShmdW5jdGlvbigpe2lmKHRoaXMubWVzc2FnZT09PXVuZGVmaW5lZCl7cmV0dXJuIHRoaXMubmFtZX1lbHNle3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9fSk7cmV0dXJuIGVycm9yQ2xhc3N9ZnVuY3Rpb24gY3JlYXRlTmFtZWRGdW5jdGlvbihuYW1lLGJvZHkpe25hbWU9bWFrZUxlZ2FsRnVuY3Rpb25OYW1lKG5hbWUpO3JldHVybihuZXcgRnVuY3Rpb24oImJvZHkiLCJyZXR1cm4gZnVuY3Rpb24gIituYW1lKyIoKSB7XG4iKycgICAgInVzZSBzdHJpY3QiOycrIiAgICByZXR1cm4gYm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuIisifTtcbiIpKShib2R5KX1mdW5jdGlvbiBfZW1iaW5kX3JlcHIodil7dmFyIHQ9dHlwZW9mIHY7aWYodD09PSJvYmplY3QifHx0PT09ImFycmF5Inx8dD09PSJmdW5jdGlvbiIpe3JldHVybiB2LnRvU3RyaW5nKCl9ZWxzZXtyZXR1cm4iIit2fX12YXIgcmVnaXN0ZXJlZEluc3RhbmNlcz17fTtmdW5jdGlvbiBnZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpe2lmKHB0cj09PXVuZGVmaW5lZCl7dGhyb3dCaW5kaW5nRXJyb3IoInB0ciBzaG91bGQgbm90IGJlIHVuZGVmaW5lZCIpfXdoaWxlKGNsYXNzXy5iYXNlQ2xhc3Mpe3B0cj1jbGFzc18udXBjYXN0KHB0cik7Y2xhc3NfPWNsYXNzXy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiByZWdpc3RlckluaGVyaXRlZEluc3RhbmNlKGNsYXNzXyxwdHIsaW5zdGFuY2Upe3B0cj1nZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpO2lmKHJlZ2lzdGVyZWRJbnN0YW5jZXMuaGFzT3duUHJvcGVydHkocHRyKSl7dGhyb3dCaW5kaW5nRXJyb3IoIlRyaWVkIHRvIHJlZ2lzdGVyIHJlZ2lzdGVyZWQgaW5zdGFuY2U6ICIrcHRyKX1lbHNle3JlZ2lzdGVyZWRJbnN0YW5jZXNbcHRyXT1pbnN0YW5jZX19ZnVuY3Rpb24gdW5yZWdpc3RlckluaGVyaXRlZEluc3RhbmNlKGNsYXNzXyxwdHIpe3B0cj1nZXRCYXNlc3RQb2ludGVyKGNsYXNzXyxwdHIpO2lmKHJlZ2lzdGVyZWRJbnN0YW5jZXMuaGFzT3duUHJvcGVydHkocHRyKSl7ZGVsZXRlIHJlZ2lzdGVyZWRJbnN0YW5jZXNbcHRyXX1lbHNle3Rocm93QmluZGluZ0Vycm9yKCJUcmllZCB0byB1bnJlZ2lzdGVyIHVucmVnaXN0ZXJlZCBpbnN0YW5jZTogIitwdHIpfX1mdW5jdGlvbiBnZXRJbmhlcml0ZWRJbnN0YW5jZShjbGFzc18scHRyKXtwdHI9Z2V0QmFzZXN0UG9pbnRlcihjbGFzc18scHRyKTtyZXR1cm4gcmVnaXN0ZXJlZEluc3RhbmNlc1twdHJdfWZ1bmN0aW9uIGdldEluaGVyaXRlZEluc3RhbmNlQ291bnQoKXtyZXR1cm4gT2JqZWN0LmtleXMocmVnaXN0ZXJlZEluc3RhbmNlcykubGVuZ3RofU1vZHVsZVsiZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudCJdPWdldEluaGVyaXRlZEluc3RhbmNlQ291bnQ7ZnVuY3Rpb24gZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcygpe3ZhciBydj1bXTtmb3IodmFyIGsgaW4gcmVnaXN0ZXJlZEluc3RhbmNlcyl7aWYocmVnaXN0ZXJlZEluc3RhbmNlcy5oYXNPd25Qcm9wZXJ0eShrKSl7cnYucHVzaChyZWdpc3RlcmVkSW5zdGFuY2VzW2tdKX19cmV0dXJuIHJ2fU1vZHVsZVsiZ2V0TGl2ZUluaGVyaXRlZEluc3RhbmNlcyJdPWdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM7dmFyIHJlZ2lzdGVyZWRUeXBlcz17fTt2YXIgYXdhaXRpbmdEZXBlbmRlbmNpZXM9e307dmFyIHR5cGVEZXBlbmRlbmNpZXM9e307dmFyIHJlZ2lzdGVyZWRQb2ludGVycz17fTtmdW5jdGlvbiByZWdpc3RlclR5cGUocmF3VHlwZSxyZWdpc3RlcmVkSW5zdGFuY2Upe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHJlZ2lzdGVyZWRJbnN0YW5jZSkpe3Rocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKX12YXIgbmFtZT1yZWdpc3RlcmVkSW5zdGFuY2UubmFtZTtpZighcmF3VHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoJ3R5cGUgIicrbmFtZSsnIiBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHR5cGVpZCBwb2ludGVyJyl9aWYocmVnaXN0ZXJlZFR5cGVzLmhhc093blByb3BlcnR5KHJhd1R5cGUpKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIHR5cGUgJyIrbmFtZSsiJyB0d2ljZSIpfXJlZ2lzdGVyZWRUeXBlc1tyYXdUeXBlXT1yZWdpc3RlcmVkSW5zdGFuY2U7ZGVsZXRlIHR5cGVEZXBlbmRlbmNpZXNbcmF3VHlwZV07aWYoYXdhaXRpbmdEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocmF3VHlwZSkpe3ZhciBjYWxsYmFja3M9YXdhaXRpbmdEZXBlbmRlbmNpZXNbcmF3VHlwZV07ZGVsZXRlIGF3YWl0aW5nRGVwZW5kZW5jaWVzW3Jhd1R5cGVdO2NhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbihjYil7Y2IoKX0pKX19ZnVuY3Rpb24gd2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQobXlUeXBlcyxkZXBlbmRlbnRUeXBlcyxnZXRUeXBlQ29udmVydGVycyl7bXlUeXBlcy5mb3JFYWNoKChmdW5jdGlvbih0eXBlKXt0eXBlRGVwZW5kZW5jaWVzW3R5cGVdPWRlcGVuZGVudFR5cGVzfSkpO2Z1bmN0aW9uIG9uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpe3ZhciBteVR5cGVDb252ZXJ0ZXJzPWdldFR5cGVDb252ZXJ0ZXJzKHR5cGVDb252ZXJ0ZXJzKTtpZihteVR5cGVDb252ZXJ0ZXJzLmxlbmd0aCE9PW15VHlwZXMubGVuZ3RoKXt0aHJvd0ludGVybmFsRXJyb3IoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKX1mb3IodmFyIGk9MDtpPG15VHlwZXMubGVuZ3RoOysraSl7cmVnaXN0ZXJUeXBlKG15VHlwZXNbaV0sbXlUeXBlQ29udmVydGVyc1tpXSl9fXZhciB0eXBlQ29udmVydGVycz1uZXcgQXJyYXkoZGVwZW5kZW50VHlwZXMubGVuZ3RoKTt2YXIgdW5yZWdpc3RlcmVkVHlwZXM9W107dmFyIHJlZ2lzdGVyZWQ9MDtkZXBlbmRlbnRUeXBlcy5mb3JFYWNoKChmdW5jdGlvbihkdCxpKXtpZihyZWdpc3RlcmVkVHlwZXMuaGFzT3duUHJvcGVydHkoZHQpKXt0eXBlQ29udmVydGVyc1tpXT1yZWdpc3RlcmVkVHlwZXNbZHRdfWVsc2V7dW5yZWdpc3RlcmVkVHlwZXMucHVzaChkdCk7aWYoIWF3YWl0aW5nRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KGR0KSl7YXdhaXRpbmdEZXBlbmRlbmNpZXNbZHRdPVtdfWF3YWl0aW5nRGVwZW5kZW5jaWVzW2R0XS5wdXNoKChmdW5jdGlvbigpe3R5cGVDb252ZXJ0ZXJzW2ldPXJlZ2lzdGVyZWRUeXBlc1tkdF07KytyZWdpc3RlcmVkO2lmKHJlZ2lzdGVyZWQ9PT11bnJlZ2lzdGVyZWRUeXBlcy5sZW5ndGgpe29uQ29tcGxldGUodHlwZUNvbnZlcnRlcnMpfX0pKX19KSk7aWYoMD09PXVucmVnaXN0ZXJlZFR5cGVzLmxlbmd0aCl7b25Db21wbGV0ZSh0eXBlQ29udmVydGVycyl9fXZhciBfX2NoYXJDb2Rlcz0oZnVuY3Rpb24oKXt2YXIgY29kZXM9bmV3IEFycmF5KDI1Nik7Zm9yKHZhciBpPTA7aTwyNTY7KytpKXtjb2Rlc1tpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfXJldHVybiBjb2Rlc30pKCk7ZnVuY3Rpb24gcmVhZExhdGluMVN0cmluZyhwdHIpe3ZhciByZXQ9IiI7dmFyIGM9cHRyO3doaWxlKEhFQVBVOFtjXSl7cmV0Kz1fX2NoYXJDb2Rlc1tIRUFQVThbYysrXV19cmV0dXJuIHJldH1mdW5jdGlvbiBnZXRUeXBlTmFtZSh0eXBlKXt2YXIgcHRyPV9fX2dldFR5cGVOYW1lKHR5cGUpO3ZhciBydj1yZWFkTGF0aW4xU3RyaW5nKHB0cik7X2ZyZWUocHRyKTtyZXR1cm4gcnZ9ZnVuY3Rpb24gaGVhcDMyVmVjdG9yVG9BcnJheShjb3VudCxmaXJzdEVsZW1lbnQpe3ZhciBhcnJheT1bXTtmb3IodmFyIGk9MDtpPGNvdW50O2krKyl7YXJyYXkucHVzaChIRUFQMzJbKGZpcnN0RWxlbWVudD4+MikraV0pfXJldHVybiBhcnJheX1mdW5jdGlvbiByZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmF3VHlwZSxodW1hbk5hbWUpe3ZhciBpbXBsPXJlZ2lzdGVyZWRUeXBlc1tyYXdUeXBlXTtpZih1bmRlZmluZWQ9PT1pbXBsKXt0aHJvd0JpbmRpbmdFcnJvcihodW1hbk5hbWUrIiBoYXMgdW5rbm93biB0eXBlICIrZ2V0VHlwZU5hbWUocmF3VHlwZSkpfXJldHVybiBpbXBsfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3ZvaWQocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiYXJnUGFja0FkdmFuY2UiOjAsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKCl7cmV0dXJuIHVuZGVmaW5lZH0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7cmV0dXJuIHVuZGVmaW5lZH0pfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfYm9vbChyYXdUeXBlLG5hbWUsc2l6ZSx0cnVlVmFsdWUsZmFsc2VWYWx1ZSl7dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKHd0KXtyZXR1cm4hIXd0fSksInRvV2lyZVR5cGUiOihmdW5jdGlvbihkZXN0cnVjdG9ycyxvKXtyZXR1cm4gbz90cnVlVmFsdWU6ZmFsc2VWYWx1ZX0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOihmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcDtpZihzaXplPT09MSl7aGVhcD1IRUFQOH1lbHNlIGlmKHNpemU9PT0yKXtoZWFwPUhFQVAxNn1lbHNlIGlmKHNpemU9PT00KXtoZWFwPUhFQVAzMn1lbHNle3Rocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gYm9vbGVhbiB0eXBlIHNpemU6ICIrbmFtZSl9cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+c2hpZnRdKX0pLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gZ2V0U2hpZnRGcm9tU2l6ZShzaXplKXtzd2l0Y2goc2l6ZSl7Y2FzZSAxOnJldHVybiAwO2Nhc2UgMjpyZXR1cm4gMTtjYXNlIDQ6cmV0dXJuIDI7Y2FzZSA4OnJldHVybiAzO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB0eXBlIHNpemU6ICIrc2l6ZSl9fWZ1bmN0aW9uIGludGVnZXJSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LHNpZ25lZCl7c3dpdGNoKHNoaWZ0KXtjYXNlIDA6cmV0dXJuKGZ1bmN0aW9uKHBvaW50ZXIpe3ZhciBoZWFwPXNpZ25lZD9IRUFQODpIRUFQVTg7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcl0pfSk7Y2FzZSAxOnJldHVybihmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDE2OkhFQVBVMTY7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+MV0pfSk7Y2FzZSAyOnJldHVybihmdW5jdGlvbihwb2ludGVyKXt2YXIgaGVhcD1zaWduZWQ/SEVBUDMyOkhFQVBVMzI7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKGhlYXBbcG9pbnRlcj4+Ml0pfSk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGludGVnZXIgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gZmxvYXRSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0KXtzd2l0Y2goc2hpZnQpe2Nhc2UgMjpyZXR1cm4oZnVuY3Rpb24ocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBGMzJbcG9pbnRlcj4+Ml0pfSk7Y2FzZSAzOnJldHVybihmdW5jdGlvbihwb2ludGVyKXtyZXR1cm4gdGhpc1siZnJvbVdpcmVUeXBlIl0oSEVBUEY2NFtwb2ludGVyPj4zXSl9KTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZmxvYXQgdHlwZTogIituYW1lKX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfaW50ZWdlcihwcmltaXRpdmVUeXBlLG5hbWUsc2l6ZSxtaW5SYW5nZSxtYXhSYW5nZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO2lmKG1heFJhbmdlPT09LTEpe21heFJhbmdlPTQyOTQ5NjcyOTV9dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7cmVnaXN0ZXJUeXBlKHByaW1pdGl2ZVR5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZX0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe2lmKHR5cGVvZiB2YWx1ZSE9PSJudW1iZXIiJiZ0eXBlb2YgdmFsdWUhPT0iYm9vbGVhbiIpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK19lbWJpbmRfcmVwcih2YWx1ZSkrJyIgdG8gJyt0aGlzLm5hbWUpfWlmKHZhbHVlPG1pblJhbmdlfHx2YWx1ZT5tYXhSYW5nZSl7dGhyb3cgbmV3IFR5cGVFcnJvcignUGFzc2luZyBhIG51bWJlciAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIGZyb20gSlMgc2lkZSB0byBDL0MrKyBzaWRlIHRvIGFuIGFyZ3VtZW50IG9mIHR5cGUgIicrbmFtZSsnIiwgd2hpY2ggaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UgWycrbWluUmFuZ2UrIiwgIittYXhSYW5nZSsiXSEiKX1yZXR1cm4gdmFsdWV8MH0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmludGVnZXJSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LG1pblJhbmdlIT09MCksZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mbG9hdChyYXdUeXBlLG5hbWUsc2l6ZSl7dmFyIHNoaWZ0PWdldFNoaWZ0RnJvbVNpemUoc2l6ZSk7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3JlZ2lzdGVyVHlwZShyYXdUeXBlLHtuYW1lOm5hbWUsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWV9KSwidG9XaXJlVHlwZSI6KGZ1bmN0aW9uKGRlc3RydWN0b3JzLHZhbHVlKXtpZih0eXBlb2YgdmFsdWUhPT0ibnVtYmVyIiYmdHlwZW9mIHZhbHVlIT09ImJvb2xlYW4iKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCAiJytfZW1iaW5kX3JlcHIodmFsdWUpKyciIHRvICcrdGhpcy5uYW1lKX1yZXR1cm4gdmFsdWV9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpmbG9hdFJlYWRWYWx1ZUZyb21Qb2ludGVyKG5hbWUsc2hpZnQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9ZnVuY3Rpb24gc2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIocG9pbnRlcil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKEhFQVBVMzJbcG9pbnRlcj4+Ml0pfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3N0ZF9zdHJpbmcocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24odmFsdWUpe3ZhciBsZW5ndGg9SEVBUFUzMlt2YWx1ZT4+Ml07dmFyIGE9bmV3IEFycmF5KGxlbmd0aCk7Zm9yKHZhciBpPTA7aTxsZW5ndGg7KytpKXthW2ldPVN0cmluZy5mcm9tQ2hhckNvZGUoSEVBUFU4W3ZhbHVlKzQraV0pfV9mcmVlKHZhbHVlKTtyZXR1cm4gYS5qb2luKCIiKX0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe2lmKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe3ZhbHVlPW5ldyBVaW50OEFycmF5KHZhbHVlKX1mdW5jdGlvbiBnZXRUQUVsZW1lbnQodGEsaW5kZXgpe3JldHVybiB0YVtpbmRleF19ZnVuY3Rpb24gZ2V0U3RyaW5nRWxlbWVudChzdHJpbmcsaW5kZXgpe3JldHVybiBzdHJpbmcuY2hhckNvZGVBdChpbmRleCl9dmFyIGdldEVsZW1lbnQ7aWYodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtnZXRFbGVtZW50PWdldFRBRWxlbWVudH1lbHNlIGlmKHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5KXtnZXRFbGVtZW50PWdldFRBRWxlbWVudH1lbHNlIGlmKHR5cGVvZiB2YWx1ZT09PSJzdHJpbmciKXtnZXRFbGVtZW50PWdldFN0cmluZ0VsZW1lbnR9ZWxzZXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBzdGQ6OnN0cmluZyIpfXZhciBsZW5ndGg9dmFsdWUubGVuZ3RoO3ZhciBwdHI9X21hbGxvYyg0K2xlbmd0aCk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aDtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe3ZhciBjaGFyQ29kZT1nZXRFbGVtZW50KHZhbHVlLGkpO2lmKGNoYXJDb2RlPjI1NSl7X2ZyZWUocHRyKTt0aHJvd0JpbmRpbmdFcnJvcigiU3RyaW5nIGhhcyBVVEYtMTYgY29kZSB1bml0cyB0aGF0IGRvIG5vdCBmaXQgaW4gOCBiaXRzIil9SEVBUFU4W3B0cis0K2ldPWNoYXJDb2RlfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpzaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcixkZXN0cnVjdG9yRnVuY3Rpb246KGZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX0pfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfc3RkX3dzdHJpbmcocmF3VHlwZSxjaGFyU2l6ZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7dmFyIEhFQVAsc2hpZnQ7aWYoY2hhclNpemU9PT0yKXtIRUFQPUhFQVBVMTY7c2hpZnQ9MX1lbHNlIGlmKGNoYXJTaXplPT09NCl7SEVBUD1IRUFQVTMyO3NoaWZ0PTJ9cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24odmFsdWUpe3ZhciBsZW5ndGg9SEVBUFUzMlt2YWx1ZT4+Ml07dmFyIGE9bmV3IEFycmF5KGxlbmd0aCk7dmFyIHN0YXJ0PXZhbHVlKzQ+PnNoaWZ0O2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7YVtpXT1TdHJpbmcuZnJvbUNoYXJDb2RlKEhFQVBbc3RhcnQraV0pfV9mcmVlKHZhbHVlKTtyZXR1cm4gYS5qb2luKCIiKX0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsdmFsdWUpe3ZhciBsZW5ndGg9dmFsdWUubGVuZ3RoO3ZhciBwdHI9X21hbGxvYyg0K2xlbmd0aCpjaGFyU2l6ZSk7SEVBUFUzMltwdHI+PjJdPWxlbmd0aDt2YXIgc3RhcnQ9cHRyKzQ+PnNoaWZ0O2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7SEVBUFtzdGFydCtpXT12YWx1ZS5jaGFyQ29kZUF0KGkpfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChfZnJlZSxwdHIpfXJldHVybiBwdHJ9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpzaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcixkZXN0cnVjdG9yRnVuY3Rpb246KGZ1bmN0aW9uKHB0cil7X2ZyZWUocHRyKX0pfSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfZW12YWwocmF3VHlwZSxuYW1lKXtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24oaGFuZGxlKXt2YXIgcnY9X2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnZhbHVlO19fZW12YWxfZGVjcmVmKGhhbmRsZSk7cmV0dXJuIHJ2fSksInRvV2lyZVR5cGUiOihmdW5jdGlvbihkZXN0cnVjdG9ycyx2YWx1ZSl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIodmFsdWUpfSksImFyZ1BhY2tBZHZhbmNlIjo4LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXIsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9KX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9tZW1vcnlfdmlldyhyYXdUeXBlLG5hbWUpe3ZhciB0eXBlTWFwcGluZz1bSW50OEFycmF5LFVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXldO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyZWdpc3RlclR5cGUocmF3VHlwZSx7bmFtZTpuYW1lLCJmcm9tV2lyZVR5cGUiOihmdW5jdGlvbihoYW5kbGUpe3ZhciB0eXBlPUhFQVBVMzJbaGFuZGxlPj4yXTt2YXIgc2l6ZT1IRUFQVTMyWyhoYW5kbGU+PjIpKzFdO3ZhciBkYXRhPUhFQVBVMzJbKGhhbmRsZT4+MikrMl07dmFyIFRBPXR5cGVNYXBwaW5nW3R5cGVdO3JldHVybiBuZXcgVEEoSEVBUDguYnVmZmVyLGRhdGEsc2l6ZSl9KSwiYXJnUGFja0FkdmFuY2UiOjE2LCJyZWFkVmFsdWVGcm9tUG9pbnRlciI6KGZ1bmN0aW9uKHB0cil7cmV0dXJuIHRoaXNbImZyb21XaXJlVHlwZSJdKHB0cil9KX0pfWZ1bmN0aW9uIHJ1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKXt3aGlsZShkZXN0cnVjdG9ycy5sZW5ndGgpe3ZhciBwdHI9ZGVzdHJ1Y3RvcnMucG9wKCk7dmFyIGRlbD1kZXN0cnVjdG9ycy5wb3AoKTtkZWwocHRyKX19ZnVuY3Rpb24gbmV3Xyhjb25zdHJ1Y3Rvcixhcmd1bWVudExpc3Qpe2lmKCEoY29uc3RydWN0b3IgaW5zdGFuY2VvZiBGdW5jdGlvbikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIm5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAiK3R5cGVvZiBjb25zdHJ1Y3RvcisiIHdoaWNoIGlzIG5vdCBhIGZ1bmN0aW9uIil9dmFyIGR1bW15PWNyZWF0ZU5hbWVkRnVuY3Rpb24oY29uc3RydWN0b3IubmFtZSwoZnVuY3Rpb24oKXt9KSk7ZHVtbXkucHJvdG90eXBlPWNvbnN0cnVjdG9yLnByb3RvdHlwZTt2YXIgb2JqPW5ldyBkdW1teTt2YXIgcj1jb25zdHJ1Y3Rvci5hcHBseShvYmosYXJndW1lbnRMaXN0KTtyZXR1cm4gciBpbnN0YW5jZW9mIE9iamVjdD9yOm9ian1mdW5jdGlvbiBjcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLGNwcEludm9rZXJGdW5jLGNwcFRhcmdldEZ1bmMpe3ZhciBhcmdDb3VudD1hcmdUeXBlcy5sZW5ndGg7aWYoYXJnQ291bnQ8Mil7dGhyb3dCaW5kaW5nRXJyb3IoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpfXZhciBpc0NsYXNzTWV0aG9kRnVuYz1hcmdUeXBlc1sxXSE9PW51bGwmJmNsYXNzVHlwZSE9PW51bGw7dmFyIGFyZ3NMaXN0PSIiO3ZhciBhcmdzTGlzdFdpcmVkPSIiO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMjsrK2kpe2FyZ3NMaXN0Kz0oaSE9PTA/IiwgIjoiIikrImFyZyIraTthcmdzTGlzdFdpcmVkKz0oaSE9PTA/IiwgIjoiIikrImFyZyIraSsiV2lyZWQifXZhciBpbnZva2VyRm5Cb2R5PSJyZXR1cm4gZnVuY3Rpb24gIittYWtlTGVnYWxGdW5jdGlvbk5hbWUoaHVtYW5OYW1lKSsiKCIrYXJnc0xpc3QrIikge1xuIisiaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09ICIrKGFyZ0NvdW50LTIpKyIpIHtcbiIrInRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAiK2h1bWFuTmFtZSsiIGNhbGxlZCB3aXRoICcgKyBhcmd1bWVudHMubGVuZ3RoICsgJyBhcmd1bWVudHMsIGV4cGVjdGVkICIrKGFyZ0NvdW50LTIpKyIgYXJncyEnKTtcbiIrIn1cbiI7dmFyIG5lZWRzRGVzdHJ1Y3RvclN0YWNrPWZhbHNlO2Zvcih2YXIgaT0xO2k8YXJnVHlwZXMubGVuZ3RoOysraSl7aWYoYXJnVHlwZXNbaV0hPT1udWxsJiZhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb249PT11bmRlZmluZWQpe25lZWRzRGVzdHJ1Y3RvclN0YWNrPXRydWU7YnJlYWt9fWlmKG5lZWRzRGVzdHJ1Y3RvclN0YWNrKXtpbnZva2VyRm5Cb2R5Kz0idmFyIGRlc3RydWN0b3JzID0gW107XG4ifXZhciBkdG9yU3RhY2s9bmVlZHNEZXN0cnVjdG9yU3RhY2s/ImRlc3RydWN0b3JzIjoibnVsbCI7dmFyIGFyZ3MxPVsidGhyb3dCaW5kaW5nRXJyb3IiLCJpbnZva2VyIiwiZm4iLCJydW5EZXN0cnVjdG9ycyIsInJldFR5cGUiLCJjbGFzc1BhcmFtIl07dmFyIGFyZ3MyPVt0aHJvd0JpbmRpbmdFcnJvcixjcHBJbnZva2VyRnVuYyxjcHBUYXJnZXRGdW5jLHJ1bkRlc3RydWN0b3JzLGFyZ1R5cGVzWzBdLGFyZ1R5cGVzWzFdXTtpZihpc0NsYXNzTWV0aG9kRnVuYyl7aW52b2tlckZuQm9keSs9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtLnRvV2lyZVR5cGUoIitkdG9yU3RhY2srIiwgdGhpcyk7XG4ifWZvcih2YXIgaT0wO2k8YXJnQ291bnQtMjsrK2kpe2ludm9rZXJGbkJvZHkrPSJ2YXIgYXJnIitpKyJXaXJlZCA9IGFyZ1R5cGUiK2krIi50b1dpcmVUeXBlKCIrZHRvclN0YWNrKyIsIGFyZyIraSsiKTsgLy8gIithcmdUeXBlc1tpKzJdLm5hbWUrIlxuIjthcmdzMS5wdXNoKCJhcmdUeXBlIitpKTthcmdzMi5wdXNoKGFyZ1R5cGVzW2krMl0pfWlmKGlzQ2xhc3NNZXRob2RGdW5jKXthcmdzTGlzdFdpcmVkPSJ0aGlzV2lyZWQiKyhhcmdzTGlzdFdpcmVkLmxlbmd0aD4wPyIsICI6IiIpK2FyZ3NMaXN0V2lyZWR9dmFyIHJldHVybnM9YXJnVHlwZXNbMF0ubmFtZSE9PSJ2b2lkIjtpbnZva2VyRm5Cb2R5Kz0ocmV0dXJucz8idmFyIHJ2ID0gIjoiIikrImludm9rZXIoZm4iKyhhcmdzTGlzdFdpcmVkLmxlbmd0aD4wPyIsICI6IiIpK2FyZ3NMaXN0V2lyZWQrIik7XG4iO2lmKG5lZWRzRGVzdHJ1Y3RvclN0YWNrKXtpbnZva2VyRm5Cb2R5Kz0icnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO1xuIn1lbHNle2Zvcih2YXIgaT1pc0NsYXNzTWV0aG9kRnVuYz8xOjI7aTxhcmdUeXBlcy5sZW5ndGg7KytpKXt2YXIgcGFyYW1OYW1lPWk9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyhpLTIpKyJXaXJlZCI7aWYoYXJnVHlwZXNbaV0uZGVzdHJ1Y3RvckZ1bmN0aW9uIT09bnVsbCl7aW52b2tlckZuQm9keSs9cGFyYW1OYW1lKyJfZHRvcigiK3BhcmFtTmFtZSsiKTsgLy8gIithcmdUeXBlc1tpXS5uYW1lKyJcbiI7YXJnczEucHVzaChwYXJhbU5hbWUrIl9kdG9yIik7YXJnczIucHVzaChhcmdUeXBlc1tpXS5kZXN0cnVjdG9yRnVuY3Rpb24pfX19aWYocmV0dXJucyl7aW52b2tlckZuQm9keSs9InJldHVybiByZXRUeXBlLmZyb21XaXJlVHlwZShydik7XG4ifWludm9rZXJGbkJvZHkrPSJ9XG4iO2FyZ3MxLnB1c2goaW52b2tlckZuQm9keSk7dmFyIGludm9rZXJGdW5jdGlvbj1uZXdfKEZ1bmN0aW9uLGFyZ3MxKS5hcHBseShudWxsLGFyZ3MyKTtyZXR1cm4gaW52b2tlckZ1bmN0aW9ufWZ1bmN0aW9uIHJlcXVpcmVGdW5jdGlvbihzaWduYXR1cmUscmF3RnVuY3Rpb24pe3NpZ25hdHVyZT1yZWFkTGF0aW4xU3RyaW5nKHNpZ25hdHVyZSk7dmFyIGZwO2lmKHR5cGVvZiBGVU5DVElPTl9UQUJMRT09PSJ1bmRlZmluZWQiKXt2YXIgZGM9YXNtWyJkeW5DYWxsXyIrc2lnbmF0dXJlXTtpZihkYz09PXVuZGVmaW5lZCl7ZGM9YXNtWyJkeW5DYWxsXyIrc2lnbmF0dXJlLnJlcGxhY2UoL2YvZywiZCIpXTtpZihkYz09PXVuZGVmaW5lZCl7dGhyb3dCaW5kaW5nRXJyb3IoIk5vIGR5bkNhbGwgaW52b2tlciBmb3Igc2lnbmF0dXJlOiAiK3NpZ25hdHVyZSl9fWZwPWRjLmJpbmQodW5kZWZpbmVkLHJhd0Z1bmN0aW9uKX1lbHNle2ZwPUZVTkNUSU9OX1RBQkxFW3Jhd0Z1bmN0aW9uXX1pZih0eXBlb2YgZnAhPT0iZnVuY3Rpb24iKXt0aHJvd0JpbmRpbmdFcnJvcigidW5rbm93biBmdW5jdGlvbiBwb2ludGVyIHdpdGggc2lnbmF0dXJlICIrc2lnbmF0dXJlKyI6ICIrcmF3RnVuY3Rpb24pfXJldHVybiBmcH1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9mdW5jdGlvbihuYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixzaWduYXR1cmUscmF3SW52b2tlcixmbil7dmFyIGFyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTtuYW1lPXJlYWRMYXRpbjFTdHJpbmcobmFtZSk7cmF3SW52b2tlcj1yZXF1aXJlRnVuY3Rpb24oc2lnbmF0dXJlLHJhd0ludm9rZXIpO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLChmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgIituYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLGFyZ1R5cGVzKX0pLGFyZ0NvdW50LTEpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLGFyZ1R5cGVzLChmdW5jdGlvbihhcmdUeXBlcyl7dmFyIGludm9rZXJBcmdzQXJyYXk9W2FyZ1R5cGVzWzBdLG51bGxdLmNvbmNhdChhcmdUeXBlcy5zbGljZSgxKSk7cmVwbGFjZVB1YmxpY1N5bWJvbChuYW1lLGNyYWZ0SW52b2tlckZ1bmN0aW9uKG5hbWUsaW52b2tlckFyZ3NBcnJheSxudWxsLHJhd0ludm9rZXIsZm4pLGFyZ0NvdW50LTEpO3JldHVybltdfSkpfXZhciB0dXBsZVJlZ2lzdHJhdGlvbnM9e307ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfYXJyYXkocmF3VHlwZSxuYW1lLGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yLGRlc3RydWN0b3JTaWduYXR1cmUscmF3RGVzdHJ1Y3Rvcil7dHVwbGVSZWdpc3RyYXRpb25zW3Jhd1R5cGVdPXtuYW1lOnJlYWRMYXRpbjFTdHJpbmcobmFtZSkscmF3Q29uc3RydWN0b3I6cmVxdWlyZUZ1bmN0aW9uKGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yKSxyYXdEZXN0cnVjdG9yOnJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpLGVsZW1lbnRzOltdfX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl92YWx1ZV9hcnJheV9lbGVtZW50KHJhd1R1cGxlVHlwZSxnZXR0ZXJSZXR1cm5UeXBlLGdldHRlclNpZ25hdHVyZSxnZXR0ZXIsZ2V0dGVyQ29udGV4dCxzZXR0ZXJBcmd1bWVudFR5cGUsc2V0dGVyU2lnbmF0dXJlLHNldHRlcixzZXR0ZXJDb250ZXh0KXt0dXBsZVJlZ2lzdHJhdGlvbnNbcmF3VHVwbGVUeXBlXS5lbGVtZW50cy5wdXNoKHtnZXR0ZXJSZXR1cm5UeXBlOmdldHRlclJldHVyblR5cGUsZ2V0dGVyOnJlcXVpcmVGdW5jdGlvbihnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyKSxnZXR0ZXJDb250ZXh0OmdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlOnNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXI6cmVxdWlyZUZ1bmN0aW9uKHNldHRlclNpZ25hdHVyZSxzZXR0ZXIpLHNldHRlckNvbnRleHQ6c2V0dGVyQ29udGV4dH0pfWZ1bmN0aW9uIF9fZW1iaW5kX2ZpbmFsaXplX3ZhbHVlX2FycmF5KHJhd1R1cGxlVHlwZSl7dmFyIHJlZz10dXBsZVJlZ2lzdHJhdGlvbnNbcmF3VHVwbGVUeXBlXTtkZWxldGUgdHVwbGVSZWdpc3RyYXRpb25zW3Jhd1R1cGxlVHlwZV07dmFyIGVsZW1lbnRzPXJlZy5lbGVtZW50czt2YXIgZWxlbWVudHNMZW5ndGg9ZWxlbWVudHMubGVuZ3RoO3ZhciBlbGVtZW50VHlwZXM9ZWxlbWVudHMubWFwKChmdW5jdGlvbihlbHQpe3JldHVybiBlbHQuZ2V0dGVyUmV0dXJuVHlwZX0pKS5jb25jYXQoZWxlbWVudHMubWFwKChmdW5jdGlvbihlbHQpe3JldHVybiBlbHQuc2V0dGVyQXJndW1lbnRUeXBlfSkpKTt2YXIgcmF3Q29uc3RydWN0b3I9cmVnLnJhd0NvbnN0cnVjdG9yO3ZhciByYXdEZXN0cnVjdG9yPXJlZy5yYXdEZXN0cnVjdG9yO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtyYXdUdXBsZVR5cGVdLGVsZW1lbnRUeXBlcywoZnVuY3Rpb24oZWxlbWVudFR5cGVzKXtlbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbihlbHQsaSl7dmFyIGdldHRlclJldHVyblR5cGU9ZWxlbWVudFR5cGVzW2ldO3ZhciBnZXR0ZXI9ZWx0LmdldHRlcjt2YXIgZ2V0dGVyQ29udGV4dD1lbHQuZ2V0dGVyQ29udGV4dDt2YXIgc2V0dGVyQXJndW1lbnRUeXBlPWVsZW1lbnRUeXBlc1tpK2VsZW1lbnRzTGVuZ3RoXTt2YXIgc2V0dGVyPWVsdC5zZXR0ZXI7dmFyIHNldHRlckNvbnRleHQ9ZWx0LnNldHRlckNvbnRleHQ7ZWx0LnJlYWQ9KGZ1bmN0aW9uKHB0cil7cmV0dXJuIGdldHRlclJldHVyblR5cGVbImZyb21XaXJlVHlwZSJdKGdldHRlcihnZXR0ZXJDb250ZXh0LHB0cikpfSk7ZWx0LndyaXRlPShmdW5jdGlvbihwdHIsbyl7dmFyIGRlc3RydWN0b3JzPVtdO3NldHRlcihzZXR0ZXJDb250ZXh0LHB0cixzZXR0ZXJBcmd1bWVudFR5cGVbInRvV2lyZVR5cGUiXShkZXN0cnVjdG9ycyxvKSk7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpfSl9KSk7cmV0dXJuW3tuYW1lOnJlZy5uYW1lLCJmcm9tV2lyZVR5cGUiOihmdW5jdGlvbihwdHIpe3ZhciBydj1uZXcgQXJyYXkoZWxlbWVudHNMZW5ndGgpO2Zvcih2YXIgaT0wO2k8ZWxlbWVudHNMZW5ndGg7KytpKXtydltpXT1lbGVtZW50c1tpXS5yZWFkKHB0cil9cmF3RGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7aWYoZWxlbWVudHNMZW5ndGghPT1vLmxlbmd0aCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW5jb3JyZWN0IG51bWJlciBvZiB0dXBsZSBlbGVtZW50cyBmb3IgIityZWcubmFtZSsiOiBleHBlY3RlZD0iK2VsZW1lbnRzTGVuZ3RoKyIsIGFjdHVhbD0iK28ubGVuZ3RoKX12YXIgcHRyPXJhd0NvbnN0cnVjdG9yKCk7Zm9yKHZhciBpPTA7aTxlbGVtZW50c0xlbmd0aDsrK2kpe2VsZW1lbnRzW2ldLndyaXRlKHB0cixvW2ldKX1pZihkZXN0cnVjdG9ycyE9PW51bGwpe2Rlc3RydWN0b3JzLnB1c2gocmF3RGVzdHJ1Y3RvcixwdHIpfXJldHVybiBwdHJ9KSwiYXJnUGFja0FkdmFuY2UiOjgsInJlYWRWYWx1ZUZyb21Qb2ludGVyIjpzaW1wbGVSZWFkVmFsdWVGcm9tUG9pbnRlcixkZXN0cnVjdG9yRnVuY3Rpb246cmF3RGVzdHJ1Y3Rvcn1dfSkpfXZhciBzdHJ1Y3RSZWdpc3RyYXRpb25zPXt9O2Z1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX3ZhbHVlX29iamVjdChyYXdUeXBlLG5hbWUsY29uc3RydWN0b3JTaWduYXR1cmUscmF3Q29uc3RydWN0b3IsZGVzdHJ1Y3RvclNpZ25hdHVyZSxyYXdEZXN0cnVjdG9yKXtzdHJ1Y3RSZWdpc3RyYXRpb25zW3Jhd1R5cGVdPXtuYW1lOnJlYWRMYXRpbjFTdHJpbmcobmFtZSkscmF3Q29uc3RydWN0b3I6cmVxdWlyZUZ1bmN0aW9uKGNvbnN0cnVjdG9yU2lnbmF0dXJlLHJhd0NvbnN0cnVjdG9yKSxyYXdEZXN0cnVjdG9yOnJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpLGZpZWxkczpbXX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfdmFsdWVfb2JqZWN0X2ZpZWxkKHN0cnVjdFR5cGUsZmllbGROYW1lLGdldHRlclJldHVyblR5cGUsZ2V0dGVyU2lnbmF0dXJlLGdldHRlcixnZXR0ZXJDb250ZXh0LHNldHRlckFyZ3VtZW50VHlwZSxzZXR0ZXJTaWduYXR1cmUsc2V0dGVyLHNldHRlckNvbnRleHQpe3N0cnVjdFJlZ2lzdHJhdGlvbnNbc3RydWN0VHlwZV0uZmllbGRzLnB1c2goe2ZpZWxkTmFtZTpyZWFkTGF0aW4xU3RyaW5nKGZpZWxkTmFtZSksZ2V0dGVyUmV0dXJuVHlwZTpnZXR0ZXJSZXR1cm5UeXBlLGdldHRlcjpyZXF1aXJlRnVuY3Rpb24oZ2V0dGVyU2lnbmF0dXJlLGdldHRlciksZ2V0dGVyQ29udGV4dDpnZXR0ZXJDb250ZXh0LHNldHRlckFyZ3VtZW50VHlwZTpzZXR0ZXJBcmd1bWVudFR5cGUsc2V0dGVyOnJlcXVpcmVGdW5jdGlvbihzZXR0ZXJTaWduYXR1cmUsc2V0dGVyKSxzZXR0ZXJDb250ZXh0OnNldHRlckNvbnRleHR9KX1mdW5jdGlvbiBfX2VtYmluZF9maW5hbGl6ZV92YWx1ZV9vYmplY3Qoc3RydWN0VHlwZSl7dmFyIHJlZz1zdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO2RlbGV0ZSBzdHJ1Y3RSZWdpc3RyYXRpb25zW3N0cnVjdFR5cGVdO3ZhciByYXdDb25zdHJ1Y3Rvcj1yZWcucmF3Q29uc3RydWN0b3I7dmFyIHJhd0Rlc3RydWN0b3I9cmVnLnJhd0Rlc3RydWN0b3I7dmFyIGZpZWxkUmVjb3Jkcz1yZWcuZmllbGRzO3ZhciBmaWVsZFR5cGVzPWZpZWxkUmVjb3Jkcy5tYXAoKGZ1bmN0aW9uKGZpZWxkKXtyZXR1cm4gZmllbGQuZ2V0dGVyUmV0dXJuVHlwZX0pKS5jb25jYXQoZmllbGRSZWNvcmRzLm1hcCgoZnVuY3Rpb24oZmllbGQpe3JldHVybiBmaWVsZC5zZXR0ZXJBcmd1bWVudFR5cGV9KSkpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtzdHJ1Y3RUeXBlXSxmaWVsZFR5cGVzLChmdW5jdGlvbihmaWVsZFR5cGVzKXt2YXIgZmllbGRzPXt9O2ZpZWxkUmVjb3Jkcy5mb3JFYWNoKChmdW5jdGlvbihmaWVsZCxpKXt2YXIgZmllbGROYW1lPWZpZWxkLmZpZWxkTmFtZTt2YXIgZ2V0dGVyUmV0dXJuVHlwZT1maWVsZFR5cGVzW2ldO3ZhciBnZXR0ZXI9ZmllbGQuZ2V0dGVyO3ZhciBnZXR0ZXJDb250ZXh0PWZpZWxkLmdldHRlckNvbnRleHQ7dmFyIHNldHRlckFyZ3VtZW50VHlwZT1maWVsZFR5cGVzW2krZmllbGRSZWNvcmRzLmxlbmd0aF07dmFyIHNldHRlcj1maWVsZC5zZXR0ZXI7dmFyIHNldHRlckNvbnRleHQ9ZmllbGQuc2V0dGVyQ29udGV4dDtmaWVsZHNbZmllbGROYW1lXT17cmVhZDooZnVuY3Rpb24ocHRyKXtyZXR1cm4gZ2V0dGVyUmV0dXJuVHlwZVsiZnJvbVdpcmVUeXBlIl0oZ2V0dGVyKGdldHRlckNvbnRleHQscHRyKSl9KSx3cml0ZTooZnVuY3Rpb24ocHRyLG8pe3ZhciBkZXN0cnVjdG9ycz1bXTtzZXR0ZXIoc2V0dGVyQ29udGV4dCxwdHIsc2V0dGVyQXJndW1lbnRUeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsbykpO3J1bkRlc3RydWN0b3JzKGRlc3RydWN0b3JzKX0pfX0pKTtyZXR1cm5be25hbWU6cmVnLm5hbWUsImZyb21XaXJlVHlwZSI6KGZ1bmN0aW9uKHB0cil7dmFyIHJ2PXt9O2Zvcih2YXIgaSBpbiBmaWVsZHMpe3J2W2ldPWZpZWxkc1tpXS5yZWFkKHB0cil9cmF3RGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn0pLCJ0b1dpcmVUeXBlIjooZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsbyl7Zm9yKHZhciBmaWVsZE5hbWUgaW4gZmllbGRzKXtpZighKGZpZWxkTmFtZSBpbiBvKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBmaWVsZCIpfX12YXIgcHRyPXJhd0NvbnN0cnVjdG9yKCk7Zm9yKGZpZWxkTmFtZSBpbiBmaWVsZHMpe2ZpZWxkc1tmaWVsZE5hbWVdLndyaXRlKHB0cixvW2ZpZWxkTmFtZV0pfWlmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaChyYXdEZXN0cnVjdG9yLHB0cil9cmV0dXJuIHB0cn0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOnNpbXBsZVJlYWRWYWx1ZUZyb21Qb2ludGVyLGRlc3RydWN0b3JGdW5jdGlvbjpyYXdEZXN0cnVjdG9yfV19KSl9dmFyIGdlbmVyaWNQb2ludGVyVG9XaXJlVHlwZT0oZnVuY3Rpb24oZGVzdHJ1Y3RvcnMsaGFuZGxlKXtpZihoYW5kbGU9PT1udWxsKXtpZih0aGlzLmlzUmVmZXJlbmNlKXt0aHJvd0JpbmRpbmdFcnJvcigibnVsbCBpcyBub3QgYSB2YWxpZCAiK3RoaXMubmFtZSl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7dmFyIHB0cj10aGlzLnJhd0NvbnN0cnVjdG9yKCk7aWYoZGVzdHJ1Y3RvcnMhPT1udWxsKXtkZXN0cnVjdG9ycy5wdXNoKHRoaXMucmF3RGVzdHJ1Y3RvcixwdHIpfXJldHVybiBwdHJ9ZWxzZXtyZXR1cm4gMH19aWYoIWhhbmRsZS4kJCl7dGhyb3dCaW5kaW5nRXJyb3IoJ0Nhbm5vdCBwYXNzICInK19lbWJpbmRfcmVwcihoYW5kbGUpKyciIGFzIGEgJyt0aGlzLm5hbWUpfWlmKCFoYW5kbGUuJCQucHRyKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgIit0aGlzLm5hbWUpfWlmKCF0aGlzLmlzQ29uc3QmJmhhbmRsZS4kJC5wdHJUeXBlLmlzQ29uc3Qpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlICIrKGhhbmRsZS4kJC5zbWFydFB0clR5cGU/aGFuZGxlLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOmhhbmRsZS4kJC5wdHJUeXBlLm5hbWUpKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO2lmKHRoaXMuaXNTbWFydFBvaW50ZXIpe2lmKHVuZGVmaW5lZD09PWhhbmRsZS4kJC5zbWFydFB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3NpbmcgcmF3IHBvaW50ZXIgdG8gc21hcnQgcG9pbnRlciBpcyBpbGxlZ2FsIil9c3dpdGNoKHRoaXMuc2hhcmluZ1BvbGljeSl7Y2FzZSAwOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIisoaGFuZGxlLiQkLnNtYXJ0UHRyVHlwZT9oYW5kbGUuJCQuc21hcnRQdHJUeXBlLm5hbWU6aGFuZGxlLiQkLnB0clR5cGUubmFtZSkrIiB0byBwYXJhbWV0ZXIgdHlwZSAiK3RoaXMubmFtZSl9YnJlYWs7Y2FzZSAxOnB0cj1oYW5kbGUuJCQuc21hcnRQdHI7YnJlYWs7Y2FzZSAyOmlmKGhhbmRsZS4kJC5zbWFydFB0clR5cGU9PT10aGlzKXtwdHI9aGFuZGxlLiQkLnNtYXJ0UHRyfWVsc2V7dmFyIGNsb25lZEhhbmRsZT1oYW5kbGVbImNsb25lIl0oKTtwdHI9dGhpcy5yYXdTaGFyZShwdHIsX19lbXZhbF9yZWdpc3RlcigoZnVuY3Rpb24oKXtjbG9uZWRIYW5kbGVbImRlbGV0ZSJdKCl9KSkpO2lmKGRlc3RydWN0b3JzIT09bnVsbCl7ZGVzdHJ1Y3RvcnMucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IscHRyKX19YnJlYWs7ZGVmYXVsdDp0aHJvd0JpbmRpbmdFcnJvcigiVW5zdXBwb3J0aW5nIHNoYXJpbmcgcG9saWN5Iil9fXJldHVybiBwdHJ9KTt2YXIgY29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGU9KGZ1bmN0aW9uKGRlc3RydWN0b3JzLGhhbmRsZSl7aWYoaGFuZGxlPT09bnVsbCl7aWYodGhpcy5pc1JlZmVyZW5jZSl7dGhyb3dCaW5kaW5nRXJyb3IoIm51bGwgaXMgbm90IGEgdmFsaWQgIit0aGlzLm5hbWUpfXJldHVybiAwfWlmKCFoYW5kbGUuJCQpe3Rocm93QmluZGluZ0Vycm9yKCdDYW5ub3QgcGFzcyAiJytfZW1iaW5kX3JlcHIoaGFuZGxlKSsnIiBhcyBhICcrdGhpcy5uYW1lKX1pZighaGFuZGxlLiQkLnB0cil7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICIrdGhpcy5uYW1lKX12YXIgaGFuZGxlQ2xhc3M9aGFuZGxlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3ZhciBwdHI9dXBjYXN0UG9pbnRlcihoYW5kbGUuJCQucHRyLGhhbmRsZUNsYXNzLHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gcHRyfSk7dmFyIG5vbkNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlPShmdW5jdGlvbihkZXN0cnVjdG9ycyxoYW5kbGUpe2lmKGhhbmRsZT09PW51bGwpe2lmKHRoaXMuaXNSZWZlcmVuY2Upe3Rocm93QmluZGluZ0Vycm9yKCJudWxsIGlzIG5vdCBhIHZhbGlkICIrdGhpcy5uYW1lKX1yZXR1cm4gMH1pZighaGFuZGxlLiQkKXt0aHJvd0JpbmRpbmdFcnJvcignQ2Fubm90IHBhc3MgIicrX2VtYmluZF9yZXByKGhhbmRsZSkrJyIgYXMgYSAnK3RoaXMubmFtZSl9aWYoIWhhbmRsZS4kJC5wdHIpe3Rocm93QmluZGluZ0Vycm9yKCJDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAiK3RoaXMubmFtZSl9aWYoaGFuZGxlLiQkLnB0clR5cGUuaXNDb25zdCl7dGhyb3dCaW5kaW5nRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgIitoYW5kbGUuJCQucHRyVHlwZS5uYW1lKyIgdG8gcGFyYW1ldGVyIHR5cGUgIit0aGlzLm5hbWUpfXZhciBoYW5kbGVDbGFzcz1oYW5kbGUuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHB0cj11cGNhc3RQb2ludGVyKGhhbmRsZS4kJC5wdHIsaGFuZGxlQ2xhc3MsdGhpcy5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiBwdHJ9KTtmdW5jdGlvbiBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHJlZ2lzdGVyZWRDbGFzcyxpc1JlZmVyZW5jZSxpc0NvbnN0LGlzU21hcnRQb2ludGVyLHBvaW50ZWVUeXBlLHNoYXJpbmdQb2xpY3kscmF3R2V0UG9pbnRlZSxyYXdDb25zdHJ1Y3RvcixyYXdTaGFyZSxyYXdEZXN0cnVjdG9yKXt0aGlzLm5hbWU9bmFtZTt0aGlzLnJlZ2lzdGVyZWRDbGFzcz1yZWdpc3RlcmVkQ2xhc3M7dGhpcy5pc1JlZmVyZW5jZT1pc1JlZmVyZW5jZTt0aGlzLmlzQ29uc3Q9aXNDb25zdDt0aGlzLmlzU21hcnRQb2ludGVyPWlzU21hcnRQb2ludGVyO3RoaXMucG9pbnRlZVR5cGU9cG9pbnRlZVR5cGU7dGhpcy5zaGFyaW5nUG9saWN5PXNoYXJpbmdQb2xpY3k7dGhpcy5yYXdHZXRQb2ludGVlPXJhd0dldFBvaW50ZWU7dGhpcy5yYXdDb25zdHJ1Y3Rvcj1yYXdDb25zdHJ1Y3Rvcjt0aGlzLnJhd1NoYXJlPXJhd1NoYXJlO3RoaXMucmF3RGVzdHJ1Y3Rvcj1yYXdEZXN0cnVjdG9yO2lmKCFpc1NtYXJ0UG9pbnRlciYmcmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzcz09PXVuZGVmaW5lZCl7aWYoaXNDb25zdCl7dGhpc1sidG9XaXJlVHlwZSJdPWNvbnN0Tm9TbWFydFB0clJhd1BvaW50ZXJUb1dpcmVUeXBlO3RoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGx9ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09bm9uQ29uc3ROb1NtYXJ0UHRyUmF3UG9pbnRlclRvV2lyZVR5cGU7dGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbH19ZWxzZXt0aGlzWyJ0b1dpcmVUeXBlIl09Z2VuZXJpY1BvaW50ZXJUb1dpcmVUeXBlfX1SZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGUuZ2V0UG9pbnRlZT1mdW5jdGlvbiBnZXRQb2ludGVlKHB0cil7aWYodGhpcy5yYXdHZXRQb2ludGVlKXtwdHI9dGhpcy5yYXdHZXRQb2ludGVlKHB0cil9cmV0dXJuIHB0cn07UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlLmRlc3RydWN0b3I9ZnVuY3Rpb24gZGVzdHJ1Y3RvcihwdHIpe2lmKHRoaXMucmF3RGVzdHJ1Y3Rvcil7dGhpcy5yYXdEZXN0cnVjdG9yKHB0cil9fTtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImFyZ1BhY2tBZHZhbmNlIl09ODtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl09c2ltcGxlUmVhZFZhbHVlRnJvbVBvaW50ZXI7UmVnaXN0ZXJlZFBvaW50ZXIucHJvdG90eXBlWyJkZWxldGVPYmplY3QiXT1mdW5jdGlvbiBkZWxldGVPYmplY3QoaGFuZGxlKXtpZihoYW5kbGUhPT1udWxsKXtoYW5kbGVbImRlbGV0ZSJdKCl9fTtSZWdpc3RlcmVkUG9pbnRlci5wcm90b3R5cGVbImZyb21XaXJlVHlwZSJdPWZ1bmN0aW9uIGZyb21XaXJlVHlwZShwdHIpe3ZhciByYXdQb2ludGVyPXRoaXMuZ2V0UG9pbnRlZShwdHIpO2lmKCFyYXdQb2ludGVyKXt0aGlzLmRlc3RydWN0b3IocHRyKTtyZXR1cm4gbnVsbH12YXIgcmVnaXN0ZXJlZEluc3RhbmNlPWdldEluaGVyaXRlZEluc3RhbmNlKHRoaXMucmVnaXN0ZXJlZENsYXNzLHJhd1BvaW50ZXIpO2lmKHVuZGVmaW5lZCE9PXJlZ2lzdGVyZWRJbnN0YW5jZSl7aWYoMD09PXJlZ2lzdGVyZWRJbnN0YW5jZS4kJC5jb3VudC52YWx1ZSl7cmVnaXN0ZXJlZEluc3RhbmNlLiQkLnB0cj1yYXdQb2ludGVyO3JlZ2lzdGVyZWRJbnN0YW5jZS4kJC5zbWFydFB0cj1wdHI7cmV0dXJuIHJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpfWVsc2V7dmFyIHJ2PXJlZ2lzdGVyZWRJbnN0YW5jZVsiY2xvbmUiXSgpO3RoaXMuZGVzdHJ1Y3RvcihwdHIpO3JldHVybiBydn19ZnVuY3Rpb24gbWFrZURlZmF1bHRIYW5kbGUoKXtpZih0aGlzLmlzU21hcnRQb2ludGVyKXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnJhd1BvaW50ZXIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOnB0cn0pfX12YXIgYWN0dWFsVHlwZT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHJhd1BvaW50ZXIpO3ZhciByZWdpc3RlcmVkUG9pbnRlclJlY29yZD1yZWdpc3RlcmVkUG9pbnRlcnNbYWN0dWFsVHlwZV07aWYoIXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkKXtyZXR1cm4gbWFrZURlZmF1bHRIYW5kbGUuY2FsbCh0aGlzKX12YXIgdG9UeXBlO2lmKHRoaXMuaXNDb25zdCl7dG9UeXBlPXJlZ2lzdGVyZWRQb2ludGVyUmVjb3JkLmNvbnN0UG9pbnRlclR5cGV9ZWxzZXt0b1R5cGU9cmVnaXN0ZXJlZFBvaW50ZXJSZWNvcmQucG9pbnRlclR5cGV9dmFyIGRwPWRvd25jYXN0UG9pbnRlcihyYXdQb2ludGVyLHRoaXMucmVnaXN0ZXJlZENsYXNzLHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MpO2lmKGRwPT09bnVsbCl7cmV0dXJuIG1ha2VEZWZhdWx0SGFuZGxlLmNhbGwodGhpcyl9aWYodGhpcy5pc1NtYXJ0UG9pbnRlcil7cmV0dXJuIG1ha2VDbGFzc0hhbmRsZSh0b1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRvVHlwZSxwdHI6ZHAsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6cHRyfSl9ZWxzZXtyZXR1cm4gbWFrZUNsYXNzSGFuZGxlKHRvVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUse3B0clR5cGU6dG9UeXBlLHB0cjpkcH0pfX07ZnVuY3Rpb24gbWFrZUNsYXNzSGFuZGxlKHByb3RvdHlwZSxyZWNvcmQpe2lmKCFyZWNvcmQucHRyVHlwZXx8IXJlY29yZC5wdHIpe3Rocm93SW50ZXJuYWxFcnJvcigibWFrZUNsYXNzSGFuZGxlIHJlcXVpcmVzIHB0ciBhbmQgcHRyVHlwZSIpfXZhciBoYXNTbWFydFB0clR5cGU9ISFyZWNvcmQuc21hcnRQdHJUeXBlO3ZhciBoYXNTbWFydFB0cj0hIXJlY29yZC5zbWFydFB0cjtpZihoYXNTbWFydFB0clR5cGUhPT1oYXNTbWFydFB0cil7dGhyb3dJbnRlcm5hbEVycm9yKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKX1yZWNvcmQuY291bnQ9e3ZhbHVlOjF9O3JldHVybiBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSx7JCQ6e3ZhbHVlOnJlY29yZH19KX1mdW5jdGlvbiBDbGFzc0hhbmRsZSgpe31mdW5jdGlvbiBnZXRJbnN0YW5jZVR5cGVOYW1lKGhhbmRsZSl7cmV0dXJuIGhhbmRsZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcy5uYW1lfUNsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNBbGlhc09mIl09ZnVuY3Rpb24gaXNBbGlhc09mKG90aGVyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBDbGFzc0hhbmRsZSkpe3JldHVybiBmYWxzZX1pZighKG90aGVyIGluc3RhbmNlb2YgQ2xhc3NIYW5kbGUpKXtyZXR1cm4gZmFsc2V9dmFyIGxlZnRDbGFzcz10aGlzLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3ZhciBsZWZ0PXRoaXMuJCQucHRyO3ZhciByaWdodENsYXNzPW90aGVyLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO3ZhciByaWdodD1vdGhlci4kJC5wdHI7d2hpbGUobGVmdENsYXNzLmJhc2VDbGFzcyl7bGVmdD1sZWZ0Q2xhc3MudXBjYXN0KGxlZnQpO2xlZnRDbGFzcz1sZWZ0Q2xhc3MuYmFzZUNsYXNzfXdoaWxlKHJpZ2h0Q2xhc3MuYmFzZUNsYXNzKXtyaWdodD1yaWdodENsYXNzLnVwY2FzdChyaWdodCk7cmlnaHRDbGFzcz1yaWdodENsYXNzLmJhc2VDbGFzc31yZXR1cm4gbGVmdENsYXNzPT09cmlnaHRDbGFzcyYmbGVmdD09PXJpZ2h0fTtmdW5jdGlvbiB0aHJvd0luc3RhbmNlQWxyZWFkeURlbGV0ZWQob2JqKXt0aHJvd0JpbmRpbmdFcnJvcihnZXRJbnN0YW5jZVR5cGVOYW1lKG9iaikrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX1DbGFzc0hhbmRsZS5wcm90b3R5cGVbImNsb25lIl09ZnVuY3Rpb24gY2xvbmUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlKXt0aGlzLiQkLmNvdW50LnZhbHVlKz0xO3JldHVybiB0aGlzfWVsc2V7dmFyIGNsb25lPU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLHskJDp7dmFsdWU6c2hhbGxvd0NvcHkodGhpcy4kJCl9fSk7Y2xvbmUuJCQuY291bnQudmFsdWUrPTE7cmV0dXJuIGNsb25lfX07ZnVuY3Rpb24gcnVuRGVzdHJ1Y3RvcihoYW5kbGUpe3ZhciAkJD1oYW5kbGUuJCQ7aWYoJCQuc21hcnRQdHIpeyQkLnNtYXJ0UHRyVHlwZS5yYXdEZXN0cnVjdG9yKCQkLnNtYXJ0UHRyKX1lbHNleyQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoJCQucHRyKX19Q2xhc3NIYW5kbGUucHJvdG90eXBlWyJkZWxldGUiXT1mdW5jdGlvbiBDbGFzc0hhbmRsZV9kZWxldGUoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCYmIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3Rocm93QmluZGluZ0Vycm9yKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIil9dGhpcy4kJC5jb3VudC52YWx1ZS09MTt2YXIgdG9EZWxldGU9MD09PXRoaXMuJCQuY291bnQudmFsdWU7aWYodG9EZWxldGUpe3J1bkRlc3RydWN0b3IodGhpcyl9aWYoIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3RoaXMuJCQuc21hcnRQdHI9dW5kZWZpbmVkO3RoaXMuJCQucHRyPXVuZGVmaW5lZH19O3ZhciBkZWxldGlvblF1ZXVlPVtdO0NsYXNzSGFuZGxlLnByb3RvdHlwZVsiaXNEZWxldGVkIl09ZnVuY3Rpb24gaXNEZWxldGVkKCl7cmV0dXJuIXRoaXMuJCQucHRyfTtDbGFzc0hhbmRsZS5wcm90b3R5cGVbImRlbGV0ZUxhdGVyIl09ZnVuY3Rpb24gZGVsZXRlTGF0ZXIoKXtpZighdGhpcy4kJC5wdHIpe3Rocm93SW5zdGFuY2VBbHJlYWR5RGVsZXRlZCh0aGlzKX1pZih0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZCYmIXRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpe3Rocm93QmluZGluZ0Vycm9yKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIil9ZGVsZXRpb25RdWV1ZS5wdXNoKHRoaXMpO2lmKGRlbGV0aW9uUXVldWUubGVuZ3RoPT09MSYmZGVsYXlGdW5jdGlvbil7ZGVsYXlGdW5jdGlvbihmbHVzaFBlbmRpbmdEZWxldGVzKX10aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD10cnVlO3JldHVybiB0aGlzfTtmdW5jdGlvbiBmbHVzaFBlbmRpbmdEZWxldGVzKCl7d2hpbGUoZGVsZXRpb25RdWV1ZS5sZW5ndGgpe3ZhciBvYmo9ZGVsZXRpb25RdWV1ZS5wb3AoKTtvYmouJCQuZGVsZXRlU2NoZWR1bGVkPWZhbHNlO29ialsiZGVsZXRlIl0oKX19TW9kdWxlWyJmbHVzaFBlbmRpbmdEZWxldGVzIl09Zmx1c2hQZW5kaW5nRGVsZXRlczt2YXIgZGVsYXlGdW5jdGlvbjtNb2R1bGVbInNldERlbGF5RnVuY3Rpb24iXT1mdW5jdGlvbiBzZXREZWxheUZ1bmN0aW9uKGZuKXtkZWxheUZ1bmN0aW9uPWZuO2lmKGRlbGV0aW9uUXVldWUubGVuZ3RoJiZkZWxheUZ1bmN0aW9uKXtkZWxheUZ1bmN0aW9uKGZsdXNoUGVuZGluZ0RlbGV0ZXMpfX07ZnVuY3Rpb24gUmVnaXN0ZXJlZENsYXNzKG5hbWUsY29uc3RydWN0b3IsaW5zdGFuY2VQcm90b3R5cGUscmF3RGVzdHJ1Y3RvcixiYXNlQ2xhc3MsZ2V0QWN0dWFsVHlwZSx1cGNhc3QsZG93bmNhc3Qpe3RoaXMubmFtZT1uYW1lO3RoaXMuY29uc3RydWN0b3I9Y29uc3RydWN0b3I7dGhpcy5pbnN0YW5jZVByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt0aGlzLnJhd0Rlc3RydWN0b3I9cmF3RGVzdHJ1Y3Rvcjt0aGlzLmJhc2VDbGFzcz1iYXNlQ2xhc3M7dGhpcy5nZXRBY3R1YWxUeXBlPWdldEFjdHVhbFR5cGU7dGhpcy51cGNhc3Q9dXBjYXN0O3RoaXMuZG93bmNhc3Q9ZG93bmNhc3Q7dGhpcy5wdXJlVmlydHVhbEZ1bmN0aW9ucz1bXX1mdW5jdGlvbiBzaGFsbG93Q29weShvKXt2YXIgcnY9e307Zm9yKHZhciBrIGluIG8pe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLGspKXtydltrXT1vW2tdfX1yZXR1cm4gcnZ9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3MocmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlLGJhc2VDbGFzc1Jhd1R5cGUsZ2V0QWN0dWFsVHlwZVNpZ25hdHVyZSxnZXRBY3R1YWxUeXBlLHVwY2FzdFNpZ25hdHVyZSx1cGNhc3QsZG93bmNhc3RTaWduYXR1cmUsZG93bmNhc3QsbmFtZSxkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtnZXRBY3R1YWxUeXBlPXJlcXVpcmVGdW5jdGlvbihnZXRBY3R1YWxUeXBlU2lnbmF0dXJlLGdldEFjdHVhbFR5cGUpO2lmKHVwY2FzdCl7dXBjYXN0PXJlcXVpcmVGdW5jdGlvbih1cGNhc3RTaWduYXR1cmUsdXBjYXN0KX1pZihkb3duY2FzdCl7ZG93bmNhc3Q9cmVxdWlyZUZ1bmN0aW9uKGRvd25jYXN0U2lnbmF0dXJlLGRvd25jYXN0KX1yYXdEZXN0cnVjdG9yPXJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpO3ZhciBsZWdhbEZ1bmN0aW9uTmFtZT1tYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSk7ZXhwb3NlUHVibGljU3ltYm9sKGxlZ2FsRnVuY3Rpb25OYW1lLChmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNvbnN0cnVjdCAiK25hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIsW2Jhc2VDbGFzc1Jhd1R5cGVdKX0pKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbcmF3VHlwZSxyYXdQb2ludGVyVHlwZSxyYXdDb25zdFBvaW50ZXJUeXBlXSxiYXNlQ2xhc3NSYXdUeXBlP1tiYXNlQ2xhc3NSYXdUeXBlXTpbXSwoZnVuY3Rpb24oYmFzZSl7YmFzZT1iYXNlWzBdO3ZhciBiYXNlQ2xhc3M7dmFyIGJhc2VQcm90b3R5cGU7aWYoYmFzZUNsYXNzUmF3VHlwZSl7YmFzZUNsYXNzPWJhc2UucmVnaXN0ZXJlZENsYXNzO2Jhc2VQcm90b3R5cGU9YmFzZUNsYXNzLmluc3RhbmNlUHJvdG90eXBlfWVsc2V7YmFzZVByb3RvdHlwZT1DbGFzc0hhbmRsZS5wcm90b3R5cGV9dmFyIGNvbnN0cnVjdG9yPWNyZWF0ZU5hbWVkRnVuY3Rpb24obGVnYWxGdW5jdGlvbk5hbWUsKGZ1bmN0aW9uKCl7aWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpIT09aW5zdGFuY2VQcm90b3R5cGUpe3Rocm93IG5ldyBCaW5kaW5nRXJyb3IoIlVzZSAnbmV3JyB0byBjb25zdHJ1Y3QgIituYW1lKX1pZih1bmRlZmluZWQ9PT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keSl7dGhyb3cgbmV3IEJpbmRpbmdFcnJvcihuYW1lKyIgaGFzIG5vIGFjY2Vzc2libGUgY29uc3RydWN0b3IiKX12YXIgYm9keT1yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmd1bWVudHMubGVuZ3RoXTtpZih1bmRlZmluZWQ9PT1ib2R5KXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJUcmllZCB0byBpbnZva2UgY3RvciBvZiAiK25hbWUrIiB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCIrYXJndW1lbnRzLmxlbmd0aCsiKSAtIGV4cGVjdGVkICgiK09iamVjdC5rZXlzKHJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KS50b1N0cmluZygpKyIpIHBhcmFtZXRlcnMgaW5zdGVhZCEiKX1yZXR1cm4gYm9keS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSk7dmFyIGluc3RhbmNlUHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYmFzZVByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmNvbnN0cnVjdG9yfX0pO2NvbnN0cnVjdG9yLnByb3RvdHlwZT1pbnN0YW5jZVByb3RvdHlwZTt2YXIgcmVnaXN0ZXJlZENsYXNzPW5ldyBSZWdpc3RlcmVkQ2xhc3MobmFtZSxjb25zdHJ1Y3RvcixpbnN0YW5jZVByb3RvdHlwZSxyYXdEZXN0cnVjdG9yLGJhc2VDbGFzcyxnZXRBY3R1YWxUeXBlLHVwY2FzdCxkb3duY2FzdCk7dmFyIHJlZmVyZW5jZUNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSxyZWdpc3RlcmVkQ2xhc3MsdHJ1ZSxmYWxzZSxmYWxzZSk7dmFyIHBvaW50ZXJDb252ZXJ0ZXI9bmV3IFJlZ2lzdGVyZWRQb2ludGVyKG5hbWUrIioiLHJlZ2lzdGVyZWRDbGFzcyxmYWxzZSxmYWxzZSxmYWxzZSk7dmFyIGNvbnN0UG9pbnRlckNvbnZlcnRlcj1uZXcgUmVnaXN0ZXJlZFBvaW50ZXIobmFtZSsiIGNvbnN0KiIscmVnaXN0ZXJlZENsYXNzLGZhbHNlLHRydWUsZmFsc2UpO3JlZ2lzdGVyZWRQb2ludGVyc1tyYXdUeXBlXT17cG9pbnRlclR5cGU6cG9pbnRlckNvbnZlcnRlcixjb25zdFBvaW50ZXJUeXBlOmNvbnN0UG9pbnRlckNvbnZlcnRlcn07cmVwbGFjZVB1YmxpY1N5bWJvbChsZWdhbEZ1bmN0aW9uTmFtZSxjb25zdHJ1Y3Rvcik7cmV0dXJuW3JlZmVyZW5jZUNvbnZlcnRlcixwb2ludGVyQ29udmVydGVyLGNvbnN0UG9pbnRlckNvbnZlcnRlcl19KSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY29uc3RydWN0b3IocmF3Q2xhc3NUeXBlLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLGludm9rZXIscmF3Q29uc3RydWN0b3Ipe3ZhciByYXdBcmdUeXBlcz1oZWFwMzJWZWN0b3JUb0FycmF5KGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcik7aW52b2tlcj1yZXF1aXJlRnVuY3Rpb24oaW52b2tlclNpZ25hdHVyZSxpbnZva2VyKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbcmF3Q2xhc3NUeXBlXSwoZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9ImNvbnN0cnVjdG9yICIrY2xhc3NUeXBlLm5hbWU7aWYodW5kZWZpbmVkPT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5KXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9W119aWYodW5kZWZpbmVkIT09Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdKXt0aHJvdyBuZXcgQmluZGluZ0Vycm9yKCJDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgiKyhhcmdDb3VudC0xKSsiKSBmb3IgY2xhc3MgJyIrY2xhc3NUeXBlLm5hbWUrIichIE92ZXJsb2FkIHJlc29sdXRpb24gaXMgY3VycmVudGx5IG9ubHkgcGVyZm9ybWVkIHVzaW5nIHRoZSBwYXJhbWV0ZXIgY291bnQsIG5vdCBhY3R1YWwgdHlwZSBpbmZvISIpfWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3JfYm9keVthcmdDb3VudC0xXT1mdW5jdGlvbiB1bmJvdW5kVHlwZUhhbmRsZXIoKXt0aHJvd1VuYm91bmRUeXBlRXJyb3IoIkNhbm5vdCBjb25zdHJ1Y3QgIitjbGFzc1R5cGUubmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixyYXdBcmdUeXBlcyl9O3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLHJhd0FyZ1R5cGVzLChmdW5jdGlvbihhcmdUeXBlcyl7Y2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W2FyZ0NvdW50LTFdPWZ1bmN0aW9uIGNvbnN0cnVjdG9yX2JvZHkoKXtpZihhcmd1bWVudHMubGVuZ3RoIT09YXJnQ291bnQtMSl7dGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lKyIgY2FsbGVkIHdpdGggIithcmd1bWVudHMubGVuZ3RoKyIgYXJndW1lbnRzLCBleHBlY3RlZCAiKyhhcmdDb3VudC0xKSl9dmFyIGRlc3RydWN0b3JzPVtdO3ZhciBhcmdzPW5ldyBBcnJheShhcmdDb3VudCk7YXJnc1swXT1yYXdDb25zdHJ1Y3Rvcjtmb3IodmFyIGk9MTtpPGFyZ0NvdW50OysraSl7YXJnc1tpXT1hcmdUeXBlc1tpXVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLGFyZ3VtZW50c1tpLTFdKX12YXIgcHRyPWludm9rZXIuYXBwbHkobnVsbCxhcmdzKTtydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7cmV0dXJuIGFyZ1R5cGVzWzBdWyJmcm9tV2lyZVR5cGUiXShwdHIpfTtyZXR1cm5bXX0pKTtyZXR1cm5bXX0pKX1mdW5jdGlvbiBkb3duY2FzdFBvaW50ZXIocHRyLHB0ckNsYXNzLGRlc2lyZWRDbGFzcyl7aWYocHRyQ2xhc3M9PT1kZXNpcmVkQ2xhc3Mpe3JldHVybiBwdHJ9aWYodW5kZWZpbmVkPT09ZGVzaXJlZENsYXNzLmJhc2VDbGFzcyl7cmV0dXJuIG51bGx9dmFyIHJ2PWRvd25jYXN0UG9pbnRlcihwdHIscHRyQ2xhc3MsZGVzaXJlZENsYXNzLmJhc2VDbGFzcyk7aWYocnY9PT1udWxsKXtyZXR1cm4gbnVsbH1yZXR1cm4gZGVzaXJlZENsYXNzLmRvd25jYXN0KHJ2KX1mdW5jdGlvbiB1cGNhc3RQb2ludGVyKHB0cixwdHJDbGFzcyxkZXNpcmVkQ2xhc3Mpe3doaWxlKHB0ckNsYXNzIT09ZGVzaXJlZENsYXNzKXtpZighcHRyQ2xhc3MudXBjYXN0KXt0aHJvd0JpbmRpbmdFcnJvcigiRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAiK2Rlc2lyZWRDbGFzcy5uYW1lKyIsIGdvdCBhbiBpbnN0YW5jZSBvZiAiK3B0ckNsYXNzLm5hbWUpfXB0cj1wdHJDbGFzcy51cGNhc3QocHRyKTtwdHJDbGFzcz1wdHJDbGFzcy5iYXNlQ2xhc3N9cmV0dXJuIHB0cn1mdW5jdGlvbiB2YWxpZGF0ZVRoaXModGhpc18sY2xhc3NUeXBlLGh1bWFuTmFtZSl7aWYoISh0aGlzXyBpbnN0YW5jZW9mIE9iamVjdCkpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsnIHdpdGggaW52YWxpZCAidGhpcyI6ICcrdGhpc18pfWlmKCEodGhpc18gaW5zdGFuY2VvZiBjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yKSl7dGhyb3dCaW5kaW5nRXJyb3IoaHVtYW5OYW1lKycgaW5jb21wYXRpYmxlIHdpdGggInRoaXMiIG9mIHR5cGUgJyt0aGlzXy5jb25zdHJ1Y3Rvci5uYW1lKX1pZighdGhpc18uJCQucHRyKXt0aHJvd0JpbmRpbmdFcnJvcigiY2Fubm90IGNhbGwgZW1zY3JpcHRlbiBiaW5kaW5nIG1ldGhvZCAiK2h1bWFuTmFtZSsiIG9uIGRlbGV0ZWQgb2JqZWN0Iil9cmV0dXJuIHVwY2FzdFBvaW50ZXIodGhpc18uJCQucHRyLHRoaXNfLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLGNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX2Z1bmN0aW9uKHJhd0NsYXNzVHlwZSxtZXRob2ROYW1lLGFyZ0NvdW50LHJhd0FyZ1R5cGVzQWRkcixpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIsY29udGV4dCxpc1B1cmVWaXJ0dWFsKXt2YXIgcmF3QXJnVHlwZXM9aGVhcDMyVmVjdG9yVG9BcnJheShhcmdDb3VudCxyYXdBcmdUeXBlc0FkZHIpO21ldGhvZE5hbWU9cmVhZExhdGluMVN0cmluZyhtZXRob2ROYW1lKTtyYXdJbnZva2VyPXJlcXVpcmVGdW5jdGlvbihpbnZva2VyU2lnbmF0dXJlLHJhd0ludm9rZXIpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFtyYXdDbGFzc1R5cGVdLChmdW5jdGlvbihjbGFzc1R5cGUpe2NsYXNzVHlwZT1jbGFzc1R5cGVbMF07dmFyIGh1bWFuTmFtZT1jbGFzc1R5cGUubmFtZSsiLiIrbWV0aG9kTmFtZTtpZihpc1B1cmVWaXJ0dWFsKXtjbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLnB1cmVWaXJ0dWFsRnVuY3Rpb25zLnB1c2gobWV0aG9kTmFtZSl9ZnVuY3Rpb24gdW5ib3VuZFR5cGVzSGFuZGxlcigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgIitodW1hbk5hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIscmF3QXJnVHlwZXMpfXZhciBwcm90bz1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlO3ZhciBtZXRob2Q9cHJvdG9bbWV0aG9kTmFtZV07aWYodW5kZWZpbmVkPT09bWV0aG9kfHx1bmRlZmluZWQ9PT1tZXRob2Qub3ZlcmxvYWRUYWJsZSYmbWV0aG9kLmNsYXNzTmFtZSE9PWNsYXNzVHlwZS5uYW1lJiZtZXRob2QuYXJnQ291bnQ9PT1hcmdDb3VudC0yKXt1bmJvdW5kVHlwZXNIYW5kbGVyLmFyZ0NvdW50PWFyZ0NvdW50LTI7dW5ib3VuZFR5cGVzSGFuZGxlci5jbGFzc05hbWU9Y2xhc3NUeXBlLm5hbWU7cHJvdG9bbWV0aG9kTmFtZV09dW5ib3VuZFR5cGVzSGFuZGxlcn1lbHNle2Vuc3VyZU92ZXJsb2FkVGFibGUocHJvdG8sbWV0aG9kTmFtZSxodW1hbk5hbWUpO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMl09dW5ib3VuZFR5cGVzSGFuZGxlcn13aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxyYXdBcmdUeXBlcywoZnVuY3Rpb24oYXJnVHlwZXMpe3ZhciBtZW1iZXJGdW5jdGlvbj1jcmFmdEludm9rZXJGdW5jdGlvbihodW1hbk5hbWUsYXJnVHlwZXMsY2xhc3NUeXBlLHJhd0ludm9rZXIsY29udGV4dCk7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7cHJvdG9bbWV0aG9kTmFtZV09bWVtYmVyRnVuY3Rpb259ZWxzZXtwcm90b1ttZXRob2ROYW1lXS5vdmVybG9hZFRhYmxlW2FyZ0NvdW50LTJdPW1lbWJlckZ1bmN0aW9ufXJldHVybltdfSkpO3JldHVybltdfSkpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NsYXNzX3Byb3BlcnR5KGNsYXNzVHlwZSxmaWVsZE5hbWUsZ2V0dGVyUmV0dXJuVHlwZSxnZXR0ZXJTaWduYXR1cmUsZ2V0dGVyLGdldHRlckNvbnRleHQsc2V0dGVyQXJndW1lbnRUeXBlLHNldHRlclNpZ25hdHVyZSxzZXR0ZXIsc2V0dGVyQ29udGV4dCl7ZmllbGROYW1lPXJlYWRMYXRpbjFTdHJpbmcoZmllbGROYW1lKTtnZXR0ZXI9cmVxdWlyZUZ1bmN0aW9uKGdldHRlclNpZ25hdHVyZSxnZXR0ZXIpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFtjbGFzc1R5cGVdLChmdW5jdGlvbihjbGFzc1R5cGUpe2NsYXNzVHlwZT1jbGFzc1R5cGVbMF07dmFyIGh1bWFuTmFtZT1jbGFzc1R5cGUubmFtZSsiLiIrZmllbGROYW1lO3ZhciBkZXNjPXtnZXQ6KGZ1bmN0aW9uKCl7dGhyb3dVbmJvdW5kVHlwZUVycm9yKCJDYW5ub3QgYWNjZXNzICIraHVtYW5OYW1lKyIgZHVlIHRvIHVuYm91bmQgdHlwZXMiLFtnZXR0ZXJSZXR1cm5UeXBlLHNldHRlckFyZ3VtZW50VHlwZV0pfSksZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfTtpZihzZXR0ZXIpe2Rlc2Muc2V0PShmdW5jdGlvbigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGFjY2VzcyAiK2h1bWFuTmFtZSsiIGR1ZSB0byB1bmJvdW5kIHR5cGVzIixbZ2V0dGVyUmV0dXJuVHlwZSxzZXR0ZXJBcmd1bWVudFR5cGVdKX0pfWVsc2V7ZGVzYy5zZXQ9KGZ1bmN0aW9uKHYpe3Rocm93QmluZGluZ0Vycm9yKGh1bWFuTmFtZSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5Iil9KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSxmaWVsZE5hbWUsZGVzYyk7d2hlbkRlcGVuZGVudFR5cGVzQXJlUmVzb2x2ZWQoW10sc2V0dGVyP1tnZXR0ZXJSZXR1cm5UeXBlLHNldHRlckFyZ3VtZW50VHlwZV06W2dldHRlclJldHVyblR5cGVdLChmdW5jdGlvbih0eXBlcyl7dmFyIGdldHRlclJldHVyblR5cGU9dHlwZXNbMF07dmFyIGRlc2M9e2dldDooZnVuY3Rpb24oKXt2YXIgcHRyPXZhbGlkYXRlVGhpcyh0aGlzLGNsYXNzVHlwZSxodW1hbk5hbWUrIiBnZXR0ZXIiKTtyZXR1cm4gZ2V0dGVyUmV0dXJuVHlwZVsiZnJvbVdpcmVUeXBlIl0oZ2V0dGVyKGdldHRlckNvbnRleHQscHRyKSl9KSxlbnVtZXJhYmxlOnRydWV9O2lmKHNldHRlcil7c2V0dGVyPXJlcXVpcmVGdW5jdGlvbihzZXR0ZXJTaWduYXR1cmUsc2V0dGVyKTt2YXIgc2V0dGVyQXJndW1lbnRUeXBlPXR5cGVzWzFdO2Rlc2Muc2V0PShmdW5jdGlvbih2KXt2YXIgcHRyPXZhbGlkYXRlVGhpcyh0aGlzLGNsYXNzVHlwZSxodW1hbk5hbWUrIiBzZXR0ZXIiKTt2YXIgZGVzdHJ1Y3RvcnM9W107c2V0dGVyKHNldHRlckNvbnRleHQscHRyLHNldHRlckFyZ3VtZW50VHlwZVsidG9XaXJlVHlwZSJdKGRlc3RydWN0b3JzLHYpKTtydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyl9KX1PYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhc3NUeXBlLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSxmaWVsZE5hbWUsZGVzYyk7cmV0dXJuW119KSk7cmV0dXJuW119KSl9ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfY2xhc3NfY2xhc3NfZnVuY3Rpb24ocmF3Q2xhc3NUeXBlLG1ldGhvZE5hbWUsYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyLGludm9rZXJTaWduYXR1cmUscmF3SW52b2tlcixmbil7dmFyIHJhd0FyZ1R5cGVzPWhlYXAzMlZlY3RvclRvQXJyYXkoYXJnQ291bnQscmF3QXJnVHlwZXNBZGRyKTttZXRob2ROYW1lPXJlYWRMYXRpbjFTdHJpbmcobWV0aG9kTmFtZSk7cmF3SW52b2tlcj1yZXF1aXJlRnVuY3Rpb24oaW52b2tlclNpZ25hdHVyZSxyYXdJbnZva2VyKTt3aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxbcmF3Q2xhc3NUeXBlXSwoZnVuY3Rpb24oY2xhc3NUeXBlKXtjbGFzc1R5cGU9Y2xhc3NUeXBlWzBdO3ZhciBodW1hbk5hbWU9Y2xhc3NUeXBlLm5hbWUrIi4iK21ldGhvZE5hbWU7ZnVuY3Rpb24gdW5ib3VuZFR5cGVzSGFuZGxlcigpe3Rocm93VW5ib3VuZFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgIitodW1hbk5hbWUrIiBkdWUgdG8gdW5ib3VuZCB0eXBlcyIscmF3QXJnVHlwZXMpfXZhciBwcm90bz1jbGFzc1R5cGUucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yO2lmKHVuZGVmaW5lZD09PXByb3RvW21ldGhvZE5hbWVdKXt1bmJvdW5kVHlwZXNIYW5kbGVyLmFyZ0NvdW50PWFyZ0NvdW50LTE7cHJvdG9bbWV0aG9kTmFtZV09dW5ib3VuZFR5cGVzSGFuZGxlcn1lbHNle2Vuc3VyZU92ZXJsb2FkVGFibGUocHJvdG8sbWV0aG9kTmFtZSxodW1hbk5hbWUpO3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMV09dW5ib3VuZFR5cGVzSGFuZGxlcn13aGVuRGVwZW5kZW50VHlwZXNBcmVSZXNvbHZlZChbXSxyYXdBcmdUeXBlcywoZnVuY3Rpb24oYXJnVHlwZXMpe3ZhciBpbnZva2VyQXJnc0FycmF5PVthcmdUeXBlc1swXSxudWxsXS5jb25jYXQoYXJnVHlwZXMuc2xpY2UoMSkpO3ZhciBmdW5jPWNyYWZ0SW52b2tlckZ1bmN0aW9uKGh1bWFuTmFtZSxpbnZva2VyQXJnc0FycmF5LG51bGwscmF3SW52b2tlcixmbik7aWYodW5kZWZpbmVkPT09cHJvdG9bbWV0aG9kTmFtZV0ub3ZlcmxvYWRUYWJsZSl7cHJvdG9bbWV0aG9kTmFtZV09ZnVuY31lbHNle3Byb3RvW21ldGhvZE5hbWVdLm92ZXJsb2FkVGFibGVbYXJnQ291bnQtMV09ZnVuY31yZXR1cm5bXX0pKTtyZXR1cm5bXX0pKX1mdW5jdGlvbiBfX2VtYmluZF9jcmVhdGVfaW5oZXJpdGluZ19jb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvck5hbWUsd3JhcHBlclR5cGUscHJvcGVydGllcyl7Y29uc3RydWN0b3JOYW1lPXJlYWRMYXRpbjFTdHJpbmcoY29uc3RydWN0b3JOYW1lKTt3cmFwcGVyVHlwZT1yZXF1aXJlUmVnaXN0ZXJlZFR5cGUod3JhcHBlclR5cGUsIndyYXBwZXIiKTtwcm9wZXJ0aWVzPXJlcXVpcmVIYW5kbGUocHJvcGVydGllcyk7dmFyIGFycmF5U2xpY2U9W10uc2xpY2U7dmFyIHJlZ2lzdGVyZWRDbGFzcz13cmFwcGVyVHlwZS5yZWdpc3RlcmVkQ2xhc3M7dmFyIHdyYXBwZXJQcm90b3R5cGU9cmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlO3ZhciBiYXNlQ2xhc3M9cmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzczt2YXIgYmFzZUNsYXNzUHJvdG90eXBlPWJhc2VDbGFzcy5pbnN0YW5jZVByb3RvdHlwZTt2YXIgYmFzZUNvbnN0cnVjdG9yPXJlZ2lzdGVyZWRDbGFzcy5iYXNlQ2xhc3MuY29uc3RydWN0b3I7dmFyIGN0b3I9Y3JlYXRlTmFtZWRGdW5jdGlvbihjb25zdHJ1Y3Rvck5hbWUsKGZ1bmN0aW9uKCl7cmVnaXN0ZXJlZENsYXNzLmJhc2VDbGFzcy5wdXJlVmlydHVhbEZ1bmN0aW9ucy5mb3JFYWNoKChmdW5jdGlvbihuYW1lKXtpZih0aGlzW25hbWVdPT09YmFzZUNsYXNzUHJvdG90eXBlW25hbWVdKXt0aHJvdyBuZXcgUHVyZVZpcnR1YWxFcnJvcigiUHVyZSB2aXJ0dWFsIGZ1bmN0aW9uICIrbmFtZSsiIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCIpfX0pLmJpbmQodGhpcykpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfX3BhcmVudCIse3ZhbHVlOndyYXBwZXJQcm90b3R5cGV9KTt0aGlzLl9fY29uc3RydWN0LmFwcGx5KHRoaXMsYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpfSkpO3dyYXBwZXJQcm90b3R5cGUuX19jb25zdHJ1Y3Q9ZnVuY3Rpb24gX19jb25zdHJ1Y3QoKXtpZih0aGlzPT09d3JhcHBlclByb3RvdHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3MgY29ycmVjdCAndGhpcycgdG8gX19jb25zdHJ1Y3QiKX12YXIgaW5uZXI9YmFzZUNvbnN0cnVjdG9yLmltcGxlbWVudC5hcHBseSh1bmRlZmluZWQsW3RoaXNdLmNvbmNhdChhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO3ZhciAkJD1pbm5lci4kJDtpbm5lci5ub3RpZnlPbkRlc3RydWN0aW9uKCk7JCQucHJlc2VydmVQb2ludGVyT25EZWxldGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJCQiLHt2YWx1ZTokJH0pO3JlZ2lzdGVySW5oZXJpdGVkSW5zdGFuY2UocmVnaXN0ZXJlZENsYXNzLCQkLnB0cix0aGlzKX07d3JhcHBlclByb3RvdHlwZS5fX2Rlc3RydWN0PWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKXtpZih0aGlzPT09d3JhcHBlclByb3RvdHlwZSl7dGhyb3dCaW5kaW5nRXJyb3IoIlBhc3MgY29ycmVjdCAndGhpcycgdG8gX19kZXN0cnVjdCIpfXVucmVnaXN0ZXJJbmhlcml0ZWRJbnN0YW5jZShyZWdpc3RlcmVkQ2xhc3MsdGhpcy4kJC5wdHIpfTtjdG9yLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHdyYXBwZXJQcm90b3R5cGUpO2Zvcih2YXIgcCBpbiBwcm9wZXJ0aWVzKXtjdG9yLnByb3RvdHlwZVtwXT1wcm9wZXJ0aWVzW3BdfXJldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGN0b3IpfXZhciBjaGFyXzA9IjAiLmNoYXJDb2RlQXQoMCk7dmFyIGNoYXJfOT0iOSIuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiBtYWtlTGVnYWxGdW5jdGlvbk5hbWUobmFtZSl7bmFtZT1uYW1lLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywiJCIpO3ZhciBmPW5hbWUuY2hhckNvZGVBdCgwKTtpZihmPj1jaGFyXzAmJmY8PWNoYXJfOSl7cmV0dXJuIl8iK25hbWV9ZWxzZXtyZXR1cm4gbmFtZX19ZnVuY3Rpb24gX19lbWJpbmRfcmVnaXN0ZXJfc21hcnRfcHRyKHJhd1R5cGUscmF3UG9pbnRlZVR5cGUsbmFtZSxzaGFyaW5nUG9saWN5LGdldFBvaW50ZWVTaWduYXR1cmUscmF3R2V0UG9pbnRlZSxjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3RvcixzaGFyZVNpZ25hdHVyZSxyYXdTaGFyZSxkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3Ipe25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtyYXdHZXRQb2ludGVlPXJlcXVpcmVGdW5jdGlvbihnZXRQb2ludGVlU2lnbmF0dXJlLHJhd0dldFBvaW50ZWUpO3Jhd0NvbnN0cnVjdG9yPXJlcXVpcmVGdW5jdGlvbihjb25zdHJ1Y3RvclNpZ25hdHVyZSxyYXdDb25zdHJ1Y3Rvcik7cmF3U2hhcmU9cmVxdWlyZUZ1bmN0aW9uKHNoYXJlU2lnbmF0dXJlLHJhd1NoYXJlKTtyYXdEZXN0cnVjdG9yPXJlcXVpcmVGdW5jdGlvbihkZXN0cnVjdG9yU2lnbmF0dXJlLHJhd0Rlc3RydWN0b3IpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtyYXdUeXBlXSxbcmF3UG9pbnRlZVR5cGVdLChmdW5jdGlvbihwb2ludGVlVHlwZSl7cG9pbnRlZVR5cGU9cG9pbnRlZVR5cGVbMF07dmFyIHJlZ2lzdGVyZWRQb2ludGVyPW5ldyBSZWdpc3RlcmVkUG9pbnRlcihuYW1lLHBvaW50ZWVUeXBlLnJlZ2lzdGVyZWRDbGFzcyxmYWxzZSxmYWxzZSx0cnVlLHBvaW50ZWVUeXBlLHNoYXJpbmdQb2xpY3kscmF3R2V0UG9pbnRlZSxyYXdDb25zdHJ1Y3RvcixyYXdTaGFyZSxyYXdEZXN0cnVjdG9yKTtyZXR1cm5bcmVnaXN0ZXJlZFBvaW50ZXJdfSkpfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2VudW0ocmF3VHlwZSxuYW1lLHNpemUsaXNTaWduZWQpe3ZhciBzaGlmdD1nZXRTaGlmdEZyb21TaXplKHNpemUpO25hbWU9cmVhZExhdGluMVN0cmluZyhuYW1lKTtmdW5jdGlvbiBjb25zdHJ1Y3Rvcigpe31jb25zdHJ1Y3Rvci52YWx1ZXM9e307cmVnaXN0ZXJUeXBlKHJhd1R5cGUse25hbWU6bmFtZSxjb25zdHJ1Y3Rvcjpjb25zdHJ1Y3RvciwiZnJvbVdpcmVUeXBlIjooZnVuY3Rpb24oYyl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudmFsdWVzW2NdfSksInRvV2lyZVR5cGUiOihmdW5jdGlvbihkZXN0cnVjdG9ycyxjKXtyZXR1cm4gYy52YWx1ZX0pLCJhcmdQYWNrQWR2YW5jZSI6OCwicmVhZFZhbHVlRnJvbVBvaW50ZXIiOmludGVnZXJSZWFkVmFsdWVGcm9tUG9pbnRlcihuYW1lLHNoaWZ0LGlzU2lnbmVkKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pO2V4cG9zZVB1YmxpY1N5bWJvbChuYW1lLGNvbnN0cnVjdG9yKX1mdW5jdGlvbiBfX2VtYmluZF9yZWdpc3Rlcl9lbnVtX3ZhbHVlKHJhd0VudW1UeXBlLG5hbWUsZW51bVZhbHVlKXt2YXIgZW51bVR5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKHJhd0VudW1UeXBlLCJlbnVtIik7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3ZhciBFbnVtPWVudW1UeXBlLmNvbnN0cnVjdG9yO3ZhciBWYWx1ZT1PYmplY3QuY3JlYXRlKGVudW1UeXBlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx7dmFsdWU6e3ZhbHVlOmVudW1WYWx1ZX0sY29uc3RydWN0b3I6e3ZhbHVlOmNyZWF0ZU5hbWVkRnVuY3Rpb24oZW51bVR5cGUubmFtZSsiXyIrbmFtZSwoZnVuY3Rpb24oKXt9KSl9fSk7RW51bS52YWx1ZXNbZW51bVZhbHVlXT1WYWx1ZTtFbnVtW25hbWVdPVZhbHVlfWZ1bmN0aW9uIF9fZW1iaW5kX3JlZ2lzdGVyX2NvbnN0YW50KG5hbWUsdHlwZSx2YWx1ZSl7bmFtZT1yZWFkTGF0aW4xU3RyaW5nKG5hbWUpO3doZW5EZXBlbmRlbnRUeXBlc0FyZVJlc29sdmVkKFtdLFt0eXBlXSwoZnVuY3Rpb24odHlwZSl7dHlwZT10eXBlWzBdO01vZHVsZVtuYW1lXT10eXBlWyJmcm9tV2lyZVR5cGUiXSh2YWx1ZSk7cmV0dXJuW119KSl9dmFyIE1vZHVsZT1Nb2R1bGV8fHt9O3ZhciBfZW12YWxfaGFuZGxlX2FycmF5PVt7fV07dmFyIF9lbXZhbF9mcmVlX2xpc3Q9W107TW9kdWxlLmNvdW50X2VtdmFsX2hhbmRsZXM9KGZ1bmN0aW9uKCl7dmFyIGNvdW50PTA7Zm9yKHZhciBpPTE7aTxfZW12YWxfaGFuZGxlX2FycmF5Lmxlbmd0aDsrK2kpe2lmKF9lbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpeysrY291bnR9fXJldHVybiBjb3VudH0pO01vZHVsZS5nZXRfZmlyc3RfZW12YWw9KGZ1bmN0aW9uKCl7Zm9yKHZhciBpPTE7aTxfZW12YWxfaGFuZGxlX2FycmF5Lmxlbmd0aDsrK2kpe2lmKF9lbXZhbF9oYW5kbGVfYXJyYXlbaV0hPT11bmRlZmluZWQpe3JldHVybiBfZW12YWxfaGFuZGxlX2FycmF5W2ldfX1yZXR1cm4gbnVsbH0pO3ZhciBfZW12YWxfc3ltYm9scz17fTtmdW5jdGlvbiBfX2VtdmFsX3JlZ2lzdGVyX3N5bWJvbChhZGRyZXNzKXtfZW12YWxfc3ltYm9sc1thZGRyZXNzXT1yZWFkTGF0aW4xU3RyaW5nKGFkZHJlc3MpfWZ1bmN0aW9uIGdldFN0cmluZ09yU3ltYm9sKGFkZHJlc3Mpe3ZhciBzeW1ib2w9X2VtdmFsX3N5bWJvbHNbYWRkcmVzc107aWYoc3ltYm9sPT09dW5kZWZpbmVkKXtyZXR1cm4gcmVhZExhdGluMVN0cmluZyhhZGRyZXNzKX1lbHNle3JldHVybiBzeW1ib2x9fWZ1bmN0aW9uIHJlcXVpcmVIYW5kbGUoaGFuZGxlKXtpZighaGFuZGxlKXt0aHJvd0JpbmRpbmdFcnJvcigiQ2Fubm90IHVzZSBkZWxldGVkIHZhbC4gaGFuZGxlID0gIitoYW5kbGUpfXJldHVybiBfZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0udmFsdWV9ZnVuY3Rpb24gX19lbXZhbF9yZWdpc3Rlcih2YWx1ZSl7dmFyIGhhbmRsZT1fZW12YWxfZnJlZV9saXN0Lmxlbmd0aD9fZW12YWxfZnJlZV9saXN0LnBvcCgpOl9lbXZhbF9oYW5kbGVfYXJyYXkubGVuZ3RoO19lbXZhbF9oYW5kbGVfYXJyYXlbaGFuZGxlXT17cmVmY291bnQ6MSx2YWx1ZTp2YWx1ZX07cmV0dXJuIGhhbmRsZX1mdW5jdGlvbiBfX2VtdmFsX2luY3JlZihoYW5kbGUpe2lmKGhhbmRsZSl7X2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnJlZmNvdW50Kz0xfX1mdW5jdGlvbiBfX2VtdmFsX2RlY3JlZihoYW5kbGUpe2lmKGhhbmRsZSYmMD09PS0tX2VtdmFsX2hhbmRsZV9hcnJheVtoYW5kbGVdLnJlZmNvdW50KXtfZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV09dW5kZWZpbmVkO19lbXZhbF9mcmVlX2xpc3QucHVzaChoYW5kbGUpfX1mdW5jdGlvbiBfX2VtdmFsX3J1bl9kZXN0cnVjdG9ycyhoYW5kbGUpe3ZhciBkZXN0cnVjdG9ycz1fZW12YWxfaGFuZGxlX2FycmF5W2hhbmRsZV0udmFsdWU7cnVuRGVzdHJ1Y3RvcnMoZGVzdHJ1Y3RvcnMpO19fZW12YWxfZGVjcmVmKGhhbmRsZSl9ZnVuY3Rpb24gX19lbXZhbF9uZXdfYXJyYXkoKXtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihbXSl9ZnVuY3Rpb24gX19lbXZhbF9uZXdfb2JqZWN0KCl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoe30pfWZ1bmN0aW9uIF9fZW12YWxfdW5kZWZpbmVkKCl7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIodW5kZWZpbmVkKX1mdW5jdGlvbiBfX2VtdmFsX251bGwoKXtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihudWxsKX1mdW5jdGlvbiBfX2VtdmFsX25ld19jc3RyaW5nKHYpe3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKGdldFN0cmluZ09yU3ltYm9sKHYpKX1mdW5jdGlvbiBfX2VtdmFsX3Rha2VfdmFsdWUodHlwZSxhcmd2KXt0eXBlPXJlcXVpcmVSZWdpc3RlcmVkVHlwZSh0eXBlLCJfZW12YWxfdGFrZV92YWx1ZSIpO3ZhciB2PXR5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl0oYXJndik7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIodil9dmFyIF9fbmV3ZXJzPXt9O2Z1bmN0aW9uIGNyYWZ0RW12YWxBbGxvY2F0b3IoYXJnQ291bnQpe3ZhciBhcmdzTGlzdD0iIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50OysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpfXZhciBmdW5jdGlvbkJvZHk9InJldHVybiBmdW5jdGlvbiBlbXZhbF9hbGxvY2F0b3JfIithcmdDb3VudCsiKGNvbnN0cnVjdG9yLCBhcmdUeXBlcywgYXJncykge1xuIjtmb3IodmFyIGk9MDtpPGFyZ0NvdW50OysraSl7ZnVuY3Rpb25Cb2R5Kz0idmFyIGFyZ1R5cGUiK2krIiA9IHJlcXVpcmVSZWdpc3RlcmVkVHlwZShIRUFQMzJbKGFyZ1R5cGVzID4+IDIpICsgIitpKyddLCAicGFyYW1ldGVyICcraSsnIik7XG4nKyJ2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7XG4iKyJhcmdzICs9IGFyZ1R5cGUiK2krIi5hcmdQYWNrQWR2YW5jZTtcbiJ9ZnVuY3Rpb25Cb2R5Kz0idmFyIG9iaiA9IG5ldyBjb25zdHJ1Y3RvcigiK2FyZ3NMaXN0KyIpO1xuIisicmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIob2JqKTtcbiIrIn1cbiI7cmV0dXJuKG5ldyBGdW5jdGlvbigicmVxdWlyZVJlZ2lzdGVyZWRUeXBlIiwiSEVBUDMyIiwiX19lbXZhbF9yZWdpc3RlciIsZnVuY3Rpb25Cb2R5KSkocmVxdWlyZVJlZ2lzdGVyZWRUeXBlLEhFQVAzMixfX2VtdmFsX3JlZ2lzdGVyKX1mdW5jdGlvbiBfX2VtdmFsX25ldyhoYW5kbGUsYXJnQ291bnQsYXJnVHlwZXMsYXJncyl7aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTt2YXIgbmV3ZXI9X19uZXdlcnNbYXJnQ291bnRdO2lmKCFuZXdlcil7bmV3ZXI9Y3JhZnRFbXZhbEFsbG9jYXRvcihhcmdDb3VudCk7X19uZXdlcnNbYXJnQ291bnRdPW5ld2VyfXJldHVybiBuZXdlcihoYW5kbGUsYXJnVHlwZXMsYXJncyl9dmFyIGdsb2JhbD0oZnVuY3Rpb24oKXtyZXR1cm4gRnVuY3Rpb259KSgpKCJyZXR1cm4gdGhpcyIpKCk7ZnVuY3Rpb24gX19lbXZhbF9nZXRfZ2xvYmFsKG5hbWUpe25hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobmFtZSk7cmV0dXJuIF9fZW12YWxfcmVnaXN0ZXIoZ2xvYmFsW25hbWVdKX1mdW5jdGlvbiBfX2VtdmFsX2dldF9tb2R1bGVfcHJvcGVydHkobmFtZSl7bmFtZT1nZXRTdHJpbmdPclN5bWJvbChuYW1lKTtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihNb2R1bGVbbmFtZV0pfWZ1bmN0aW9uIF9fZW12YWxfZ2V0X3Byb3BlcnR5KGhhbmRsZSxrZXkpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7a2V5PXJlcXVpcmVIYW5kbGUoa2V5KTtyZXR1cm4gX19lbXZhbF9yZWdpc3RlcihoYW5kbGVba2V5XSl9ZnVuY3Rpb24gX19lbXZhbF9zZXRfcHJvcGVydHkoaGFuZGxlLGtleSx2YWx1ZSl7aGFuZGxlPXJlcXVpcmVIYW5kbGUoaGFuZGxlKTtrZXk9cmVxdWlyZUhhbmRsZShrZXkpO3ZhbHVlPXJlcXVpcmVIYW5kbGUodmFsdWUpO2hhbmRsZVtrZXldPXZhbHVlfWZ1bmN0aW9uIF9fZW12YWxfYXMoaGFuZGxlLHJldHVyblR5cGUsZGVzdHJ1Y3RvcnNSZWYpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7cmV0dXJuVHlwZT1yZXF1aXJlUmVnaXN0ZXJlZFR5cGUocmV0dXJuVHlwZSwiZW12YWw6OmFzIik7dmFyIGRlc3RydWN0b3JzPVtdO3ZhciByZD1fX2VtdmFsX3JlZ2lzdGVyKGRlc3RydWN0b3JzKTtIRUFQMzJbZGVzdHJ1Y3RvcnNSZWY+PjJdPXJkO3JldHVybiByZXR1cm5UeXBlWyJ0b1dpcmVUeXBlIl0oZGVzdHJ1Y3RvcnMsaGFuZGxlKX1mdW5jdGlvbiBfX2VtdmFsX2NhbGwoaGFuZGxlLGFyZ0NvdW50LGFyZ1R5cGVzLGFyZ3Ype2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7dmFyIHR5cGVzPWxvb2t1cFR5cGVzKGFyZ0NvdW50LGFyZ1R5cGVzKTt2YXIgYXJncz1uZXcgQXJyYXkoYXJnQ291bnQpO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXt2YXIgdHlwZT10eXBlc1tpXTthcmdzW2ldPXR5cGVbInJlYWRWYWx1ZUZyb21Qb2ludGVyIl0oYXJndik7YXJndis9dHlwZS5hcmdQYWNrQWR2YW5jZX12YXIgcnY9aGFuZGxlLmFwcGx5KHVuZGVmaW5lZCxhcmdzKTtyZXR1cm4gX19lbXZhbF9yZWdpc3Rlcihydil9ZnVuY3Rpb24gbG9va3VwVHlwZXMoYXJnQ291bnQsYXJnVHlwZXMsYXJnV2lyZVR5cGVzKXt2YXIgYT1uZXcgQXJyYXkoYXJnQ291bnQpO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQ7KytpKXthW2ldPXJlcXVpcmVSZWdpc3RlcmVkVHlwZShIRUFQMzJbKGFyZ1R5cGVzPj4yKStpXSwicGFyYW1ldGVyICIraSl9cmV0dXJuIGF9ZnVuY3Rpb24gYWxsb2NhdGVEZXN0cnVjdG9ycyhkZXN0cnVjdG9yc1JlZil7dmFyIGRlc3RydWN0b3JzPVtdO0hFQVAzMltkZXN0cnVjdG9yc1JlZj4+Ml09X19lbXZhbF9yZWdpc3RlcihkZXN0cnVjdG9ycyk7cmV0dXJuIGRlc3RydWN0b3JzfXZhciBtZXRob2RDYWxsZXJzPVt1bmRlZmluZWRdO2Z1bmN0aW9uIGFkZE1ldGhvZENhbGxlcihjYWxsZXIpe3ZhciBpZD1tZXRob2RDYWxsZXJzLmxlbmd0aDttZXRob2RDYWxsZXJzLnB1c2goY2FsbGVyKTtyZXR1cm4gaWR9ZnVuY3Rpb24gX19lbXZhbF9nZXRfbWV0aG9kX2NhbGxlcihhcmdDb3VudCxhcmdUeXBlcyl7dmFyIHR5cGVzPWxvb2t1cFR5cGVzKGFyZ0NvdW50LGFyZ1R5cGVzKTt2YXIgcmV0VHlwZT10eXBlc1swXTt2YXIgc2lnbmF0dXJlTmFtZT1yZXRUeXBlLm5hbWUrIl8kIit0eXBlcy5zbGljZSgxKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWV9KSkuam9pbigiXyIpKyIkIjt2YXIgcGFyYW1zPVsicmV0VHlwZSJdO3ZhciBhcmdzPVtyZXRUeXBlXTt2YXIgYXJnc0xpc3Q9IiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7YXJnc0xpc3QrPShpIT09MD8iLCAiOiIiKSsiYXJnIitpO3BhcmFtcy5wdXNoKCJhcmdUeXBlIitpKTthcmdzLnB1c2godHlwZXNbMStpXSl9dmFyIGZ1bmN0aW9uQm9keT0icmV0dXJuIGZ1bmN0aW9uIChoYW5kbGUsIG5hbWUsIGRlc3RydWN0b3JzLCBhcmdzKSB7XG4iO2Zvcih2YXIgaT0wO2k8YXJnQ291bnQtMTsrK2kpe2Z1bmN0aW9uQm9keSs9IiAgICB2YXIgYXJnIitpKyIgPSBhcmdUeXBlIitpKyIucmVhZFZhbHVlRnJvbVBvaW50ZXIoYXJncyk7XG4iKyIgICAgYXJncyArPSBhcmdUeXBlIitpKyIuYXJnUGFja0FkdmFuY2U7XG4ifWZ1bmN0aW9uQm9keSs9IiAgICB2YXIgcnYgPSBoYW5kbGVbbmFtZV0oIithcmdzTGlzdCsiKTtcbiI7Zm9yKHZhciBpPTA7aTxhcmdDb3VudC0xOysraSl7aWYodHlwZXNbaSsxXVsiZGVsZXRlT2JqZWN0Il0pe2Z1bmN0aW9uQm9keSs9IiAgICBhcmdUeXBlIitpKyIuZGVsZXRlT2JqZWN0KGFyZyIraSsiKTtcbiJ9fWZ1bmN0aW9uQm9keSs9IiAgICByZXR1cm4gcmV0VHlwZS50b1dpcmVUeXBlKGRlc3RydWN0b3JzLCBydik7XG4iKyJ9O1xuIjtwYXJhbXMucHVzaChmdW5jdGlvbkJvZHkpO3ZhciBpbnZva2VyRnVuY3Rpb249bmV3XyhGdW5jdGlvbixwYXJhbXMpLmFwcGx5KG51bGwsYXJncyk7cmV0dXJuIGFkZE1ldGhvZENhbGxlcihjcmVhdGVOYW1lZEZ1bmN0aW9uKHNpZ25hdHVyZU5hbWUsaW52b2tlckZ1bmN0aW9uKSl9ZnVuY3Rpb24gX19lbXZhbF9jYWxsX21ldGhvZChjYWxsZXIsaGFuZGxlLG1ldGhvZE5hbWUsZGVzdHJ1Y3RvcnNSZWYsYXJncyl7Y2FsbGVyPW1ldGhvZENhbGxlcnNbY2FsbGVyXTtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO21ldGhvZE5hbWU9Z2V0U3RyaW5nT3JTeW1ib2wobWV0aG9kTmFtZSk7cmV0dXJuIGNhbGxlcihoYW5kbGUsbWV0aG9kTmFtZSxhbGxvY2F0ZURlc3RydWN0b3JzKGRlc3RydWN0b3JzUmVmKSxhcmdzKX1mdW5jdGlvbiBfX2VtdmFsX2hhc19mdW5jdGlvbihoYW5kbGUsbmFtZSxjbGFzc1R5cGUpe2hhbmRsZT1yZXF1aXJlSGFuZGxlKGhhbmRsZSk7bmFtZT1nZXRTdHJpbmdPclN5bWJvbChuYW1lKTtjbGFzc1R5cGU9cmVxdWlyZVJlZ2lzdGVyZWRUeXBlKGNsYXNzVHlwZSwiY2xhc3Mgd3JhcHBlciBmaWx0ZXIiKTt2YXIgZmlsdGVyPWNsYXNzVHlwZS5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGVbbmFtZV07cmV0dXJuIGhhbmRsZVtuYW1lXWluc3RhbmNlb2YgRnVuY3Rpb24mJihmaWx0ZXI9PT11bmRlZmluZWR8fGhhbmRsZVtuYW1lXSE9PWZpbHRlcil9ZnVuY3Rpb24gX19lbXZhbF90eXBlb2YoaGFuZGxlKXtoYW5kbGU9cmVxdWlyZUhhbmRsZShoYW5kbGUpO3JldHVybiBfX2VtdmFsX3JlZ2lzdGVyKHR5cGVvZiBoYW5kbGUpfWlmKE1vZHVsZVsicHJlSW5pdCJdKXtpZih0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il09PSJmdW5jdGlvbiIpTW9kdWxlWyJwcmVJbml0Il09W01vZHVsZVsicHJlSW5pdCJdXTt3aGlsZShNb2R1bGVbInByZUluaXQiXS5sZW5ndGg+MCl7TW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKX19dmFyIHNob3VsZFJ1bk5vdz10cnVlO2lmKE1vZHVsZVsibm9Jbml0aWFsUnVuIl0pe3Nob3VsZFJ1bk5vdz1mYWxzZX1ydW4oKQoKCgoKLy8gbGF6LWxvYWRlci13b3JrZXIuanMKLy8KCi8vaW1wb3J0U2NyaXB0cygnbGF6LXBlcmYuanMnKTsKCnZhciBpbnN0YW5jZSA9IG51bGw7IC8vIGxhei1wZXJmIGluc3RhbmNlCgpmdW5jdGlvbiByZWFkQXMoYnVmLCBUeXBlLCBvZmZzZXQsIGNvdW50KSB7Cgljb3VudCA9IChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IGNvdW50ID09PSAwID8gMSA6IGNvdW50KTsKCXZhciBzdWIgPSBidWYuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBUeXBlLkJZVEVTX1BFUl9FTEVNRU5UICogY291bnQpOwoKCXZhciByID0gbmV3IFR5cGUoc3ViKTsKCWlmIChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IGNvdW50ID09PSAxKQoJCXJldHVybiByWzBdOwoKCXZhciByZXQgPSBbXTsKCWZvciAodmFyIGkgPSAwIDsgaSA8IGNvdW50IDsgaSArKykgewoJCXJldC5wdXNoKHJbaV0pOwoJfQoKCXJldHVybiByZXQ7Cn0KCmZ1bmN0aW9uIHBhcnNlTEFTSGVhZGVyKGFycmF5YnVmZmVyKSB7Cgl2YXIgbyA9IHt9OwoKCW8ucG9pbnRzT2Zmc2V0ID0gcmVhZEFzKGFycmF5YnVmZmVyLCBVaW50MzJBcnJheSwgMzIqMyk7CglvLnBvaW50c0Zvcm1hdElkID0gcmVhZEFzKGFycmF5YnVmZmVyLCBVaW50OEFycmF5LCAzMiozKzgpOwoJby5wb2ludHNTdHJ1Y3RTaXplID0gcmVhZEFzKGFycmF5YnVmZmVyLCBVaW50MTZBcnJheSwgMzIqMys4KzEpOwoJby5wb2ludHNDb3VudCA9IHJlYWRBcyhhcnJheWJ1ZmZlciwgVWludDMyQXJyYXksIDMyKjMgKyAxMSk7CgoKCXZhciBzdGFydCA9IDMyKjMgKyAzNTsKCW8uc2NhbGUgPSByZWFkQXMoYXJyYXlidWZmZXIsIEZsb2F0NjRBcnJheSwgc3RhcnQsIDMpOyBzdGFydCArPSAyNDsgLy8gOCozCglvLm9mZnNldCA9IHJlYWRBcyhhcnJheWJ1ZmZlciwgRmxvYXQ2NEFycmF5LCBzdGFydCwgMyk7IHN0YXJ0ICs9IDI0OwoKCXZhciBib3VuZHMgPSByZWFkQXMoYXJyYXlidWZmZXIsIEZsb2F0NjRBcnJheSwgc3RhcnQsIDYpOyBzdGFydCArPSA0ODsgLy8gOCo2OwoJby5tYXhzID0gW2JvdW5kc1swXSwgYm91bmRzWzJdLCBib3VuZHNbNF1dOwoJby5taW5zID0gW2JvdW5kc1sxXSwgYm91bmRzWzNdLCBib3VuZHNbNV1dOwoKCXJldHVybiBvOwp9CgpmdW5jdGlvbiBoYW5kbGVFdmVudChtc2cpIHsKCXN3aXRjaChtc2cudHlwZSkgewoJCWNhc2UgIm9wZW4iOgoJCQl0cnkgewoJCQkJaW5zdGFuY2UgPSBuZXcgTW9kdWxlLkxBU1ppcCgpOwoJCQkJdmFyIGFiSW50ID0gbmV3IFVpbnQ4QXJyYXkobXNnLmFycmF5YnVmZmVyKTsKCQkJCXZhciBidWYgPSBNb2R1bGUuX21hbGxvYyhtc2cuYXJyYXlidWZmZXIuYnl0ZUxlbmd0aCk7CgoJCQkJaW5zdGFuY2UuYXJyYXlidWZmZXIgPSBtc2cuYXJyYXlidWZmZXI7CgkJCQlpbnN0YW5jZS5idWYgPSBidWY7CgkJCQlNb2R1bGUuSEVBUFU4LnNldChhYkludCwgYnVmKTsKCQkJCWluc3RhbmNlLm9wZW4oYnVmLCBtc2cuYXJyYXlidWZmZXIuYnl0ZUxlbmd0aCk7CgoJCQkJaW5zdGFuY2UucmVhZE9mZnNldCA9IDA7CgoJCQkJcG9zdE1lc3NhZ2UoeyB0eXBlOiAib3BlbiIsIHN0YXR1czogMX0pOwoJCQl9CgkJCWNhdGNoKGUpIHsKCQkJCXBvc3RNZXNzYWdlKHsgdHlwZTogIm9wZW4iLCBzdGF0dXM6IDAsIGRldGFpbHM6IGUgfSk7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgImhlYWRlciI6CgkJCWlmICghaW5zdGFuY2UpCgkJCQl0aHJvdyBuZXcgRXJyb3IoIllvdSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgYmVmb3JlIHRyeWluZyB0byByZWFkIGhlYWRlciIpOwoKCgoJCQl2YXIgaGVhZGVyID0gcGFyc2VMQVNIZWFkZXIoaW5zdGFuY2UuYXJyYXlidWZmZXIpOwoJCQloZWFkZXIucG9pbnRzRm9ybWF0SWQgJj0gMHgzZjsKCQkJaW5zdGFuY2UuaGVhZGVyID0gaGVhZGVyOwoJCQlwb3N0TWVzc2FnZSh7dHlwZTogImhlYWRlciIsIHN0YXR1czogMSwgaGVhZGVyOiBoZWFkZXJ9KTsKCQkJYnJlYWs7CgoJCWNhc2UgInJlYWQiOgoJCQlpZiAoIWluc3RhbmNlKQoJCQkJdGhyb3cgbmV3IEVycm9yKCJZb3UgbmVlZCB0byBvcGVuIHRoZSBmaWxlIGJlZm9yZSB0cnlpbmcgdG8gcmVhZCBzdHVmZiIpOwoKCQkJdmFyIHN0YXJ0ID0gbXNnLnN0YXJ0LCBjb3VudCA9IG1zZy5jb3VudCwgc2tpcCA9IG1zZy5za2lwOwoJCQl2YXIgbyA9IGluc3RhbmNlOwoKCQkJaWYgKCFvLmhlYWRlcikKCQkJCXRocm93IG5ldyBFcnJvcigiWW91IG5lZWQgdG8gcXVlcnkgaGVhZGVyIGJlZm9yZSByZWFkaW5nLCBJIG1haW50YWluIHN0YXRlIHRoYXQgd2F5LCBzb3JyeSA6KCIpOwoKCQkJdmFyIHBvaW50c1RvUmVhZCA9IE1hdGgubWluKGNvdW50ICogc2tpcCwgby5oZWFkZXIucG9pbnRzQ291bnQgLSBvLnJlYWRPZmZzZXQpOwoJCQl2YXIgYnVmZmVyU2l6ZSA9IE1hdGguY2VpbChwb2ludHNUb1JlYWQgLyBza2lwKTsKCQkJdmFyIHBvaW50c1JlYWQgPSAwOwoKCQkJdmFyIHRoaXNfYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyU2l6ZSAqIG8uaGVhZGVyLnBvaW50c1N0cnVjdFNpemUpOwoJCQl2YXIgYnVmX3JlYWQgPSBNb2R1bGUuX21hbGxvYyhvLmhlYWRlci5wb2ludHNTdHJ1Y3RTaXplKTsKCQkJZm9yICh2YXIgaSA9IDAgOyBpIDwgcG9pbnRzVG9SZWFkIDsgaSArKykgewoJCQkJby5nZXRQb2ludChidWZfcmVhZCk7CgoJCQkJaWYgKGkgJSBza2lwID09PSAwKSB7CgkJCQkJdmFyIGEgPSBuZXcgVWludDhBcnJheShNb2R1bGUuSEVBUFU4LmJ1ZmZlciwgYnVmX3JlYWQsIG8uaGVhZGVyLnBvaW50c1N0cnVjdFNpemUpOwoJCQkJCXRoaXNfYnVmLnNldChhLCBwb2ludHNSZWFkICogby5oZWFkZXIucG9pbnRzU3RydWN0U2l6ZSwgby5oZWFkZXIucG9pbnRzU3RydWN0U2l6ZSk7CgkJCQkJcG9pbnRzUmVhZCArKzsKCQkJCX0KCgkJCQlvLnJlYWRPZmZzZXQgKys7CgkJCX0KCgkJCXBvc3RNZXNzYWdlKHsKCQkJCXR5cGU6ICdoZWFkZXInLAoJCQkJc3RhdHVzOiAxLAoJCQkJYnVmZmVyOiB0aGlzX2J1Zi5idWZmZXIsCgkJCQljb3VudDogcG9pbnRzUmVhZCwKCQkJCWhhc01vcmVEYXRhOiBvLnJlYWRPZmZzZXQgPCBvLmhlYWRlci5wb2ludHNDb3VudAoJCQl9KTsKCgkJCWJyZWFrOwoKCgkJY2FzZSAiY2xvc2UiOgoJCQlpZiAoaW5zdGFuY2UgIT09IG51bGwpIHsKCQkJCWluc3RhbmNlLmRlbGV0ZSgpOwoJCQkJaW5zdGFuY2UgPSBudWxsOwoJCQl9CgkJCXBvc3RNZXNzYWdlKHsgdHlwZTogImNsb3NlIiwgc3RhdHVzOiAxfSk7CgkJCWJyZWFrOwoJfQp9Cgpvbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkgewoJdHJ5IHsKCQloYW5kbGVFdmVudChldmVudC5kYXRhKTsKCX0gY2F0Y2goZSkgewoJCXBvc3RNZXNzYWdlKHt0eXBlOiBldmVudC5kYXRhLnR5cGUsIHN0YXR1czogMCwgZGV0YWlsczogZX0pOwoJfQp9OwoKCg==")); \ No newline at end of file diff --git a/PotreeConverter/resources/page_template/docs/build.md b/PotreeConverter/resources/page_template/docs/build.md deleted file mode 100644 index baa8b216..00000000 --- a/PotreeConverter/resources/page_template/docs/build.md +++ /dev/null @@ -1,18 +0,0 @@ - -# How to build the library - -## Installation - -Make sure you have [node.js](http://nodejs.org/) installed - -Setting up gulp: - - cd potree_directory - npm install -g gulp - npm install --save-dev - -## Usage - - gulp build - -This will create a single build/js/potree.js file \ No newline at end of file diff --git a/PotreeConverter/resources/page_template/docs/changelog.md b/PotreeConverter/resources/page_template/docs/changelog.md deleted file mode 100644 index d03ce2b8..00000000 --- a/PotreeConverter/resources/page_template/docs/changelog.md +++ /dev/null @@ -1,98 +0,0 @@ - - -## 2015.03.17 - -### features - -* Update file format to 1.6. (see [Potree File Format](https://github.com/potree/potree/blob/master/docs/file_format.md) ) - * Removed hierarchy from cloud.js and store it in smaller chunks. - * Node-files in ./data are now grouped into a directory hierarchy. - * RGB, INTENSITY and CLASSIFICATION can be written to the binary format in any order and combination. -* Added EarthControls. This navigation mode provides faster and more precise -navigation in large but flat 3d models such as landscapes from LIDAR data. -* Point picking and height profile queries return all available point attributes, -instead of positions only. (see https://github.com/potree/potree/issues/124) -* Height profile queries return a project() helper function that unrolls the -queried points along the x-axis. Can be used to draw 2D height profile images. -(see https://github.com/potree/potree/issues/124) -* Added an angle measurement tool. (Thanks to @Maartenvm ) - -### changes - -* Update to three.js r70. -* Load bin files in a WebWorker to take off work from the main thread. - -### bugfixes - -* Lots of bugfixes, most importantly regarding point picking and canvas resizing. - - -## 2014.30.12 - -### features -* Rebuild the profile tool to behave more like the distant measure tool. -Visible points inside the profile can be retrieved with -``` -var points = pointcloud.getPointsInProfile(profileTool.profiles[0], maxOctreeDepth); -``` - -* Added clip modes: DISABLED, CLIP_OUTSIDE, HIGHLIGHT_INSIDE. Clip mode can be set with -``` -pointcloud.material.clipMode = Potree.ClipMode.CLIP_OUTSIDE; -``` - -* Added support for potree format 1.4. This format stores coordinates as integers instead of floats (for uniform precision). Additionaly, the *.bin extension has been added to all data/* files in order to avoid problems that occur with files witout extensions. - -* Added [High Quality Splatting](http://graphics.ucsd.edu/~matthias/Papers/HighQualitySplattingOnGPUs.pdf) for screen aligned quads. See examples/viewer.html with quality set to "Splats". - - - - -## 2014.12.17 - -### features -* Added Area and Volume measurement tools. -* Made tool markers draggable. -* See examples/viewer.js for a demo of all measurement tools. In this demo, the volume can be translated, scaled and rotated by pressing e, r and t. -* Attenuated point sizes are differently scaled. Now, the point size specifies the radius of the point in scene coordinates. -* Adaptive point sizes are differently scaled. A size of 1 means that the point size is choosen to optimaly cover holes. Due to this it is now necessary to pass the renderer to the pointcloud.update() function: - - ``` - pointcloud.update(camera, renderer); - ``` - - - -### bugfixes -* LAS and LAZ format now support point picking, too. -* Using mediump precision instead of highp. Highp is not supported on all devices and it seems like it's generaly adviced not to use it. - - -## 2014.12.03 - -* Made measurement tool independant of scale. Spheres and Labels are displayed at the same size regardless of the distance to the camera. - MeasurementTool now has to be rendered using - ``` - // render scene first, then measuring tool over the scene - renderer.render(scene, camera); - measuringTool.render(); - ``` - -* Support for binary files with .bin extension. Files without extension have shown to cause problems with FTP Uploaders and some WebServers. -* Added classification, return number and point source ID to Potree.PointColorType. These color modes only work with LAS and LAZ files. -* Replaced synchronous requests in favour of async requests. - You must now provide a callback method in order to add a pointcloud to the scene: - - ``` - var pco = POCLoader.load(pointcloudPath, function(geometry){ - pointcloud = new Potree.PointCloudOctree(geometry); - ... - scene.add(pointcloud); - }); - ``` - You must also make sure that the pointcloud has been loaded before operating on it: - ``` - if(pointcloud){ - // now you can safely use the pointcloud object - } - ``` diff --git a/PotreeConverter/resources/page_template/docs/documentation.md b/PotreeConverter/resources/page_template/docs/documentation.md deleted file mode 100644 index 13e5dd35..00000000 --- a/PotreeConverter/resources/page_template/docs/documentation.md +++ /dev/null @@ -1,50 +0,0 @@ - -# Documentation - -* [Getting Started](getting_started.md) -* [Changelog](changelog.md) -* [User Interface](user_interface.md) -* [Converting Point Clouds](converting.md) -* [FAQ](faq.md) -* [Measuring](measuring.md) -* [File Format](file_format.md) - -## About - -Potree is a free open-source WebGL based point cloud renderer for large point clouds. -Similar to map software like Google Maps or OpenStreeMap, only data inside the visible area and up to a certain level of detail are loaded. - -![](./images/potree_screens.png) - -At the moment, this project is continued as master thesis under the [Harvest4D Project](https://harvest4d.org/) - -Newest information and work in progress is usually available on [twitter](https://twitter.com/m_schuetz) - -General infos, downloads, showcase, etc. at [potree.org](http://potree.org/) - -## Downloads - -* [PotreeConverter windows binary (2014.12.30)](http://potree.org/downloads/PotreeConverter/PotreeConverter_2014.12.30.zip) - -## Showcase - -Take a look at the [potree showcase](http://potree.org/wp/demo/) for some live examples. - -## Compatibility - -| Browser | OS | Result | -| -------------------- |:-------:|:-------------:| -| Chrome 39 | Win7 | works | -| Firefox 34 | Win7 | works | -| Internet Explorer 11 | Win7 | partially works; performance issues | -| Firefox | Android | partially works, GUI and stability issues | -| Opera | Android | partially works, GUI and stabilty issues and slow | - - -## Credits - -* The multi-res-octree algorithms used by this viewer were developed at the Vienna University of Technology by Michael Wimmer and Claus Scheiblauer as part of the [Scanopy Project](http://www.cg.tuwien.ac.at/research/projects/Scanopy/). -* [Three.js](https://github.com/mrdoob/three.js), the WebGL 3D rendering library on which potree is built. -* [plas.io](http://plas.io/) point cloud viewer. LAS and LAZ support have been taken from the laslaz.js implementation of plas.io. Thanks to [Uday Verma](https://twitter.com/udaykverma) and [Howard Butler](https://twitter.com/howardbutler) for this! -* [Harvest4D](https://harvest4d.org/) Potree currently runs as Master Thesis under the Harvest4D Project -* [Martin Isenburg](http://rapidlasso.com/), [Georepublic](http://georepublic.de/en/), [Sigeom Sa](http://www.sigeom.ch/), [SITN](http://www.ne.ch/sitn), [Pix4D](http://pix4d.com/) as well as all the contributers to potree and PotreeConverter and many more for their support. diff --git a/PotreeConverter/resources/page_template/docs/faq.md b/PotreeConverter/resources/page_template/docs/faq.md deleted file mode 100644 index 6f958d0c..00000000 --- a/PotreeConverter/resources/page_template/docs/faq.md +++ /dev/null @@ -1,46 +0,0 @@ - -# FAQ - -If you encounter any problem in the browser, try to open the developer console (ctrl + shift + i in firefox and chrome) and look for error messages. Some of the messages are covered in this FAQ. - -If your problem is not covered in this FAQ, either create a new issue at the [github -repository](https://github.com/potree/potree) or send an email to -mschuetz@potree.org. - - -## I've uploaded the point cloud to a web server but it is not visible. - -### Did it work on a local web server? -If yes and the error console shows the following error, then it is likely that your uploader altered the data/r* files: -``` -Uncaught RangeError: byte length of Float32Array should be a multiple of 4 -``` - -To solve this, tell your uploader to treat files as BINARY rather than ASCII. -In Filezilla you can do this here: -Edit -> Settings -> Transfers -> File Types -> Default Transfer Type - -Another option is to pack all your data into a zip file, upload it and unpack it on the server. - -### Are you using IIS? - -IIS may cause problems with files that have no extension, such as the data/r* files for potree format up to 1.3. - -In this case, you can try to configure IIS: -http://www.serverintellect.com/support/iis/enable-no-extensions/ - -## The converted point cloud is black - -As of now, the PotreeConvert expects rgb colors in LAS or LAZ files in a range of 0-65536. -If you have colors in a 0-255 range, you will have to upscale them before conversion. -You can use the [lastools](http://rapidlasso.com/lastools/) to do this: - -``` -las2las -i pointcloud.las -scale_rgb_up -``` - - - -## Can I use potree for commercial projects? - -Yes, the license allows you to do this free of charge. If you do use potree, please consider supporting this project with a donation. diff --git a/PotreeConverter/resources/page_template/docs/file_format.md b/PotreeConverter/resources/page_template/docs/file_format.md deleted file mode 100644 index eb67092d..00000000 --- a/PotreeConverter/resources/page_template/docs/file_format.md +++ /dev/null @@ -1,144 +0,0 @@ -# File Format - -Version 1.6 - -The potree file format partitions points into an octree. All octree nodes, -intermediate as well as leaves, contain a sparse subsample of points. - -The spacing defines the minimum distance between points in the root node. -With each level, the spacing is halved, e.g. if spacing in the root is 1.0, -then the spacing in its children is 0.5. -Rendering lower level nodes results in a coarse representation of the pointcloud. -The more nodes you load and render, the better the quality. - -The following table shows what the content of the root and its children could -look like and how the level of detail increases when they're rendered together. - -| ![](./images/r.png "") | ![](./images/r1.png "") | ![](./images/r_and_r1.png "") | ![](./images/r_and_rx.png "") | -| ------------- |:-------------:| -----:| --- | -| r - root | r0 - first child of root | root and r0 combined | root and all its children combined | - -## Directory Hierarchy - -The potree file format is actually a collection of files: -* ./cloud.js - A JSON file that contains meta data such as bounding box, spacing, etc. -* ./data/ - This directory contains node and hierarchy files. - -For each octree node, there is one file in the data directory called r, -followed by a number that indicates its position in the hierarchy. -* r is the root node -* r0 is the first child of the root node -* r03 is the fourth child of the first child of the root node - -Each node may have up to 8 child nodes. The numbers from 0 to 7 inside the node name -indicate which child it is. - -Files inside the data directory are grouped into a hierarchical directory structure. -Each directory contains nodes for up to _X_ levels of the octree -and a hrc file that contains _(X + 1)_ levels of hierarchy for a given node, -where _X_ is the _hierarchyStepSize_. -Subsequent nodes are stored in sub directories. - -This image shows the contents of data/r for a step size of 5. It contains nodes for octree levels 0 to 4 and r.hrc which contains the hierarchy for octree levels 0 to 5. -Contents for level 5 to 9 and 10 to 12 are stored in subsequent directories. - -![](./images/directoy_hierarchy.png) - -## Hierarchy Chunks -The hierarchy of a node is stored in .hrc files, in packets of 5 bytes. This list of 5-byte packets is a breadth-first traversal of the tree, starting in itself. -* 1 byte with a mask of this node's children. E.g: 00000011 in the file r.hrc refers to the nodes r0 and r1 -* 4 bytes (unsigned long int) storing the number of points in that node. - -For example, consider the following output of PotreeConverter: -* ./data/r -* ./data/r.bin -* ./data/r.hrc -* ./data/r/r0.bin -* ./data/r/r1.bin - -The file ./data/r.hrc will contain 2 packs of 5-bytes with the following data: -* (3,$number_of_points_in_r.bin) -* (0,$number_of_points_in_r0.bin) -* (0,$number_of_points_in_r1.bin) - -* The byte containing the value 3 (00000011 in binary) shows that the root contains the nodes r0 and r1. The tree is traversed breadth-first, so the following two lines correspond to r0 and r1, respectively: -* r0 has a value 0 for the mask (so no more children) -* r1 has a value 0 for the mask (so no more children) - -The depth of the hierarchy in a .hrc file depends on the hierarchyStepSize which -is set to 5 as of now. This means that at every 5th level there are .hrc files -that contain 6 levels of hierarchy (the node itself and the next 5 levels of descendants). - - -## Octree Hierarchy - -Child nodes are arranged like this: - -![](./images/child_indices.png) - -This means that node 0 is at the origin, node 1 is translated along the -z axis, -node 2 is on top of node 0 and so on. - -## cloud.js - -Stores information about the pointcloud in JSON format. - -* __version__ - The cloud.js format may change over time. The version number is -necessary so that parsers know how to interpret the data. -* __octreeDir__ - Directory or URL where node data is stored. Usually points to -"data". -* __boundingBox__ - Contains the minimum and maximum of the axis aligned bounding box. This bounding box is cubic and aligned to fit to the octree root. -* __tightBoundingBox__ - This bounding box thightly fits the point data. -* __pointAttributes__ - Declares the point data format. May be "LAS", "LAZ" or in -case if the BINARY format an array of attributes like ["POSITION_CARTESIAN", "COLOR_PACKED", "INTENSITY"] - * __POSITION_CARTESIAN__ - 3 x 32bit signed integers for x/y/z coordinates - * __COLOR_PACKED__ - 4 x unsigned byte for r,g,b,a colors. -* __spacing__ - The minimum distance between points at root level. - -``` -{ - "version": "1.6", - "octreeDir": "data", - "boundingBox": { - "lx": -4.9854, - "ly": 1.0366, - "lz": -3.4494, - "ux": 0.702300000000001, - "uy": 6.7243, - "uz": 2.2383 - }, - "tightBoundingBox": { - "lx": -4.9854, - "ly": 1.0375, - "lz": -3.4494, - "ux": -0.7889, - "uy": 6.7243, - "uz": 1.1245 - }, - "pointAttributes": [ - "POSITION_CARTESIAN", - "COLOR_PACKED" - ], - "spacing": 0.03, - "scale": 0.001, - "hierarchyStepSize": 5 -} -``` - -## Node-Files - -The node files in the data directory contain the point data. -Node files can be BINARY, LAS, LAZ or anything else. This section will describe -the contents of the BINARY format. - -The pointAttributes property in cloud.js describes the contents and the -order of each attribute in the BINARY format. - -| Attribute Name | Format | Description | -| ------------- |:-------------:| -----: | -| POSITION_CARTESIAN | 3 x 4 byte unsigned integer | decode with: (xyz * scale) + boundingBox.min | -| COLOR_PACKED | 4 x 1 byte unsigned char | RGBA in range 0 - 255 | -| INTENSITY | 1 x 2 byte unsigned short | Intensity in range 0 - 65536 | -| CLASSIFICATION | 1 x 1 byte unsigned char | - | - -All data is stored in little endian order. diff --git a/PotreeConverter/resources/page_template/docs/getting_started.md b/PotreeConverter/resources/page_template/docs/getting_started.md deleted file mode 100644 index 60c5c622..00000000 --- a/PotreeConverter/resources/page_template/docs/getting_started.md +++ /dev/null @@ -1,39 +0,0 @@ - -# Getting Started - -Read the [FAQ](faq.md) if you encounter any problems. - -### Download PotreeConverter - -* [PotreeConverter](https://github.com/potree/PotreeConverter) - -### Setup a Web-Server - -Due to strict security policies in browsers, -it is not possible to open potree html files directly on your pc because -potree needs permission to load files. -You have to put all necessary source files and the pointcloud on a webserver -to view the result. You can, however, install a local webserver on your pc. -I use XAMPP, which contains Apache Webserver as well as PHP and MySQL but Apache -alone should work fine: -* [Apache](http://httpd.apache.org/) -* [XAMPP](https://www.apachefriends.org/de/index.html) - -After you've installed and started Apache/XAMPP, you can access files in your htdocs -directory through a localhost URL: - -Assuming your htdocs directory is ```C:\xampp\htdocs```, you can access it in your -browser with ```http://localhost``` - - -### Converting & Generating a Web Page - -Try this for your first point cloud and then take a look at the [PotreeConverter page](https://github.com/potree/PotreeConverter) to learn more about the converter options: - -``` -./PotreeConverter.exe C:/pointcloud.las -o C:/xampp/htdocs/potree --generate-page pageName -``` - -You should now be able to open the generated potree page at this URL: ```http://localhost/potree/examples/pageName.html``` - -![](images/lion_demo_screenshot.jpg) diff --git a/PotreeConverter/resources/page_template/docs/images/child_indices.png b/PotreeConverter/resources/page_template/docs/images/child_indices.png deleted file mode 100644 index 89856542..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/child_indices.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/directoy_hierarchy.png b/PotreeConverter/resources/page_template/docs/images/directoy_hierarchy.png deleted file mode 100644 index 56f41e80..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/directoy_hierarchy.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/filtered_spats_sum_of_weights.png b/PotreeConverter/resources/page_template/docs/images/filtered_spats_sum_of_weights.png deleted file mode 100644 index 899cfa6a..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/filtered_spats_sum_of_weights.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/filtered_splats_normalized.png b/PotreeConverter/resources/page_template/docs/images/filtered_splats_normalized.png deleted file mode 100644 index a523f0d2..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/filtered_splats_normalized.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/filtered_splats_overlapping.png b/PotreeConverter/resources/page_template/docs/images/filtered_splats_overlapping.png deleted file mode 100644 index b6c19dc4..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/filtered_splats_overlapping.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/filtered_splats_weighted_sum.png b/PotreeConverter/resources/page_template/docs/images/filtered_splats_weighted_sum.png deleted file mode 100644 index 991ecbbf..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/filtered_splats_weighted_sum.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/lion_demo_screenshot.jpg b/PotreeConverter/resources/page_template/docs/images/lion_demo_screenshot.jpg deleted file mode 100644 index 197b869a..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/lion_demo_screenshot.jpg and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/lion_filtered_splats.jpg b/PotreeConverter/resources/page_template/docs/images/lion_filtered_splats.jpg deleted file mode 100644 index 0a9cee3b..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/lion_filtered_splats.jpg and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/lion_fixed_circles.jpg b/PotreeConverter/resources/page_template/docs/images/lion_fixed_circles.jpg deleted file mode 100644 index 98371d91..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/lion_fixed_circles.jpg and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/lion_weighted_circles.jpg b/PotreeConverter/resources/page_template/docs/images/lion_weighted_circles.jpg deleted file mode 100644 index 5e5eb000..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/lion_weighted_circles.jpg and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/pompei.jpg b/PotreeConverter/resources/page_template/docs/images/pompei.jpg deleted file mode 100644 index 3332331d..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/pompei.jpg and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/potree_screens.png b/PotreeConverter/resources/page_template/docs/images/potree_screens.png deleted file mode 100644 index e21fd379..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/potree_screens.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/procedural_patch.png b/PotreeConverter/resources/page_template/docs/images/procedural_patch.png deleted file mode 100644 index 770dc2fc..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/procedural_patch.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/r.png b/PotreeConverter/resources/page_template/docs/images/r.png deleted file mode 100644 index 7e6bad0c..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/r.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/r1.png b/PotreeConverter/resources/page_template/docs/images/r1.png deleted file mode 100644 index 41a025cb..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/r1.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/r_and_r1.png b/PotreeConverter/resources/page_template/docs/images/r_and_r1.png deleted file mode 100644 index c26f89c3..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/r_and_r1.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/r_and_rx.png b/PotreeConverter/resources/page_template/docs/images/r_and_rx.png deleted file mode 100644 index e24d8e49..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/r_and_rx.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/rx.png b/PotreeConverter/resources/page_template/docs/images/rx.png deleted file mode 100644 index f7fcd60d..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/rx.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/scripting_profile_spheres.png b/PotreeConverter/resources/page_template/docs/images/scripting_profile_spheres.png deleted file mode 100644 index 68f45e84..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/scripting_profile_spheres.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/images/scripting_profile_width.png b/PotreeConverter/resources/page_template/docs/images/scripting_profile_width.png deleted file mode 100644 index af31a65c..00000000 Binary files a/PotreeConverter/resources/page_template/docs/images/scripting_profile_width.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/docs/scripting.md b/PotreeConverter/resources/page_template/docs/scripting.md deleted file mode 100644 index 5f1aba07..00000000 --- a/PotreeConverter/resources/page_template/docs/scripting.md +++ /dev/null @@ -1,113 +0,0 @@ - -# Scripting - -If you're missing some functionality in the interface, you can still achieve certain things by using your browsers developer tools as a scripting console. Open the developer tools with ctrl + shift + i, paste code into the console and execute it. - -## Creating a height profile - -A height profile can be created with code as follows: - -``` -var p = new Potree.HeightProfile(); -p.addMarker(new THREE.Vector3(-100,0,0)); -p.addMarker(new THREE.Vector3(100,0,0)); -p.addMarker(new THREE.Vector3(100,0,100)); -p.addMarker(new THREE.Vector3(-100,0,100)); -p.setWidth(5); -profileTool.addProfile(p); -``` - -This will create a profile with 4 points / 3 segments. - -With this method, the height of the markers is not necessarly aligned with the point -cloud. Height markers can be removed with - -``` -p.modifiable = false; -``` - -The positions can still be modified programmatically through - -``` -var markerIndex = 0; -var position = new THREE.Vector3(10, 10, 0); -p.setPosition(markerIndex, position); -``` - -In order to remove a marker, call - -``` -p.removeMarker(index); -``` - - -## Get points inside height profile - -Use this to get a list of points inside the profile. -Points are grouped in segments. - -``` -var maxOctreeDepth = 2; -var segments = pointcloud.getPointsInProfile(profileTool.profiles[0], maxOctreeDepth); -``` - -The following code will create a sphere at each point location in the profile: - -``` -var maxOctreeDepth = 2; -var segments = pointcloud.getPointsInProfile(profileTool.profiles[0], maxOctreeDepth); - -var sg = new THREE.SphereGeometry(1, 8, 8); -for(var i = 0; i < segments.length; i++){ - var segment = segments[i]; - for(var j = 0; j < segment.points.numPoints; j++){ - var position = segment.points.position[j]; - var sphere = new THREE.Mesh(sg); - sphere.position.copy(position); - scene.add(sphere); - } -} -``` - -![](./images/scripting_profile_spheres.png) - -### Projecting a profile to 2D - -Each segment also contains a project() function which aligns the points along the x-axis. -This can be used, for example, to generate 2D height profile images. - -``` -position = segment.project(position); -``` - -Consecutive segments are placed next to each other. The following code -creates spheres on the x-axis projected point coordinates: - -``` -var maxOctreeDepth = 1; -var segments = pointcloud.getPointsInProfile(profileTool.profiles[0], maxOctreeDepth); - -var sg = new THREE.SphereGeometry(1, 8, 8); -for(var i = 0; i < segments.length; i++){ - var segment = segments[i]; - for(var j = 0; j < segment.points.numPoints; j++){ - var position = segment.points.position[j]; - position = segment.project(position); - var sphere = new THREE.Mesh(sg); - sphere.position.copy(position); - scene.add(sphere); - } -} -``` - - -## Set width of height profile - -The profile width can be changed either by holding ctrl while dragging one of the -endpoints up and down or using this code: - -``` -profileTool.profiles[0].setWidth(2); -``` - -![](./images/scripting_profile_width.png) diff --git a/PotreeConverter/resources/page_template/docs/user_interface.md b/PotreeConverter/resources/page_template/docs/user_interface.md deleted file mode 100644 index 90c7ddda..00000000 --- a/PotreeConverter/resources/page_template/docs/user_interface.md +++ /dev/null @@ -1,82 +0,0 @@ - -# User Interface - - - - - -![](../resources/icons/fps_controls.png) __Fly-Navigation__ - -ASDW or Arrow Keys: Move through scene - -Left Mouse: Rotate camera - - -![](../resources/icons/orbit_controls.png) __Orbit-Navigation__ - -Left Mouse: Rotate camera around pivot. - -Right Mouse: Pan camera & pivot. - -![](../resources/icons/focus.png) __Zoom to Point Cloud__ - -Moves camera so that the whole point cloud is within the view area. - -![](../resources/icons/flip_y_z.png) __Flip Y and Z__ - -Flips y and -z coordinates. Some software uses y as the up vector(WebGL, three.js, potree), others use z. - -![](../resources/icons/distance.png) __Distance Measurement__ - -Left Mouse: Insert Measurement Point - -Right Mouse: Finish insertion - -Drag&Drop: Move Measurement Points - -Distance between measurement points will be displayed on the edge. - -![](../resources/icons/area.png) __Area Measurement__ - -Left Mouse: Insert Measurement Point - -Right Mouse: Finish insertion - -Drag&Drop: Move Measurement Points - -Distance between measurement points will be displayed on the edge and the -total area on the centroid. -The area is calculated on the ground plane. The height does not affect the result. -Crossings should be avoided. - -![](../resources/icons/volume.png) __Volume Measurement__ - -Left Mouse: Insert Volume or Select Inserted Volume - -E, R, T: Switch between translation, scale and rotation mode. - -Volume will be displayed on the objects centroid. - -![](../resources/icons/profile.png) __Height Profile__ - -Left Mouse: Insert Profile Marker - -Right Mouse: Finish insertion - -Drag&Drop: Move Profile Marker - -ctrl + Drag&Drop: Drag upwards to increase or downwards to decrease the profile width - -Depending on the Clip Mode, points inside the profile will be highlighted or points outside the profile will be clipped. - - -![](../resources/icons/clip_volume.png) __Clip Volume__ - -Left Mouse: Insert Volume or Select Inserted Volume - -E, R, T: Switch between translation, scale and rotation mode. - -Depending on the Clip Mode, points inside the volume will be highlighted or points outside the volume will be clipped. - - -![](images/lion_demo_screenshot.jpg) diff --git a/PotreeConverter/resources/page_template/examples/css/potree.css b/PotreeConverter/resources/page_template/examples/css/potree.css index bb823355..12c28ed4 100644 --- a/PotreeConverter/resources/page_template/examples/css/potree.css +++ b/PotreeConverter/resources/page_template/examples/css/potree.css @@ -12,6 +12,7 @@ #renderArea{ width: 100%; height: 100%; + overflow: hidden; } .info{ diff --git a/PotreeConverter/resources/page_template/examples/js/viewer.js b/PotreeConverter/resources/page_template/examples/js/viewer.js index 7ec76bbf..d1f74e2b 100644 --- a/PotreeConverter/resources/page_template/examples/js/viewer.js +++ b/PotreeConverter/resources/page_template/examples/js/viewer.js @@ -1,1188 +1,1588 @@ -if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { - sceneProperties.navigation = "Orbit"; -} +Potree.Viewer = function(domElement, settings, args){ + var scope = this; + var defaultSettings = settings; + var arguments = args || {}; + + this.renderArea = domElement; + + { // create stats fields + var createField = function(id, top){ + var field = document.createElement("div"); + field.id = id; + field.classList.add("info"); + field.style.position = "absolute"; + field.style.left = "10px"; + field.style.top = top + "px"; + field.style.width = "400px"; + field.style.color = "white"; + + return field; + }; + + var elNumVisibleNodes = createField("lblNumVisibleNodes", 80); + var elNumVisiblePoints = createField("lblNumVisiblePoints", 100); + + scope.renderArea.appendChild(elNumVisibleNodes); + scope.renderArea.appendChild(elNumVisiblePoints); + } + + { // infos + scope.infos = new function(){ + + var _this = this; + + this.elements = {}; + + this.domElement = document.createElement("div"); + this.domElement.id = "infos"; + this.domElement.classList.add("info"); + this.domElement.style.position = "fixed"; + this.domElement.style.left = "10px"; + this.domElement.style.top = "120px"; + this.domElement.style.pointerEvents = "none"; + + scope.renderArea.appendChild(this.domElement); + + this.set = function(key, value){ + var element = this.elements[key]; + if(typeof element === "undefined"){ + element = document.createElement("div"); + _this.domElement.appendChild(element); + this.elements[key] = element; + + } + + element.innerHTML = value; + }; + + }; + } + + { // create toolbar + var elToolbar = document.createElement("div"); + elToolbar.style.position = "absolute"; + elToolbar.style.width = "400px"; + elToolbar.style.bottom = "10px"; + elToolbar.style.right = "10px"; + this.renderArea.appendChild(elToolbar); + + var createToolIcon = function(icon, title, callback){ + var tool = document.createElement("img"); + tool.src = icon; + tool.title = title; + tool.onclick = callback; + + return tool; + }; + + elToolbar.appendChild(createToolIcon( + "../resources/icons/earth_controls_1.png", + "Earth Controls", + function(){scope.useEarthControls()} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/fps_controls.png", + "Flight Controls", + function(){scope.useFPSControls()} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/orbit_controls.png", + "Orbit Controls", + function(){scope.useOrbitControls()} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/focus.png", + "focus on pointcloud", + function(){scope.zoomTo(viewer.pointcloud)} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/flip_y_z.png", + "flip y and z coordinates", + function(){scope.flipYZ()} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/angle.png", + "angle measurements", + function(){scope.measuringTool.startInsertion({showDistances: false, showAngles: true, showArea: false, closed: true, maxMarkers: 3})} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/distance.png", + "distance measurements", + function(){scope.measuringTool.startInsertion({showDistances: true, showArea: false, closed: false})} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/area.png", + "area measurements", + function(){scope.measuringTool.startInsertion({showDistances: true, showArea: true, closed: true})} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/volume.png", + "volume measurements", + function(){scope.volumeTool.startInsertion()} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/profile.png", + "height profiles", + function(){scope.profileTool.startInsertion({width: viewer.pointcloud.boundingSphere.radius / 100})} + )); + + elToolbar.appendChild(createToolIcon( + "../resources/icons/clip_volume.png", + "clipping volumes", + function(){scope.volumeTool.startInsertion({clip: true})} + )); + + + } + + + + + + + + + -if(sceneProperties.useEDL && !Potree.Features.SHADER_EDL.isSupported()){ - sceneProperties.useEDL = false; -} + if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { + defaultSettings.navigation = "Orbit"; + } -if(sceneProperties.quality === null){ - sceneProperties.quality = "Squares"; -} + if(defaultSettings.useEDL && !Potree.Features.SHADER_EDL.isSupported()){ + defaultSettings.useEDL = false; + } -var fov = sceneProperties.fov; -var pointSize = sceneProperties.pointSize; -var pointCountTarget = sceneProperties.pointLimit; -var opacity = 1; -var pointSizeType = null; -var pointColorType = null; -var pointShape = Potree.PointShape.SQUARE; -var clipMode = Potree.ClipMode.HIGHLIGHT_INSIDE; -var quality = null; -var isFlipYZ = false; -var useDEMCollisions = false; -var minNodeSize = 100; -var directionalLight; + if(typeof arguments.onPointCloudLoaded !== "undefined"){ + this.addEventListener("pointcloud_loaded", arguments.onPointCloudLoaded); + } + + this.annotations = []; + this.fov = defaultSettings.fov || 60; + this.pointSize = defaultSettings.pointSize || 1; + this.pointCountTarget = defaultSettings.pointLimit || 1; + this.opacity = 1; + this.pointSizeType = null; + this.pointColorType = null; + this.clipMode = Potree.ClipMode.HIGHLIGHT_INSIDE; + this.quality = defaultSettings.quality || "Squares"; + this.isFlipYZ = false; + this.useDEMCollisions = false; + this.minNodeSize = 100; + this.directionalLight; + this.edlScale = defaultSettings.edlScale || 1; + this.edlRadius = defaultSettings.edlRadius || 3; + this.useEDL = defaultSettings.useEDL || false; -var showStats = false; -var showBoundingBox = false; -var freeze = false; + this.showDebugInfos = false; + this.showStats = false; + this.showBoundingBox = false; + this.freeze = false; -var fpControls; -var orbitControls; -var earthControls; -var controls; + this.fpControls; + this.orbitControls; + this.earthControls; + this.controls; -var progressBar = new ProgressBar(); + var progressBar = new ProgressBar(); -var pointcloudPath = sceneProperties.path; + var pointcloudPath = defaultSettings.path; -var elRenderArea = document.getElementById("renderArea"); + var gui; + + this.renderer; + this.camera; + this.scene; + this.scenePointCloud; + this.sceneBG; + this.cameraBG; + this.pointcloud = null; + this.measuringTool; + this.volumeTool; + this.transformationTool; + + var skybox; + var stats; + var clock = new THREE.Clock(); + var showSkybox = false; + var referenceFrame; -var gui; -var renderer; -var camera; -var scene; -var scenePointCloud; -var sceneBG, cameraBG; -var pointcloud; -var skybox; -var stats; -var clock = new THREE.Clock(); -var showSkybox = false; -var measuringTool; -var volumeTool; -var transformationTool; -var referenceFrame; + this.setPointSizeType = function(value){ + if(value === "Fixed"){ + scope.pointSizeType = Potree.PointSizeType.FIXED; + }else if(value === "Attenuated"){ + scope.pointSizeType = Potree.PointSizeType.ATTENUATED; + }else if(value === "Adaptive"){ + scope.pointSizeType = Potree.PointSizeType.ADAPTIVE; + } + }; -function setPointSizeType(value){ - if(value === "Fixed"){ - pointSizeType = Potree.PointSizeType.FIXED; - }else if(value === "Attenuated"){ - pointSizeType = Potree.PointSizeType.ATTENUATED; - }else if(value === "Adaptive"){ - pointSizeType = Potree.PointSizeType.ADAPTIVE; - } -}; + this.setQuality = function(value){ + if(value == "Interpolation" && !Potree.Features.SHADER_INTERPOLATION.isSupported()){ + scope.quality = "Squares"; + }else if(value == "Splats" && !Potree.Features.SHADER_SPLATS.isSupported()){ + scope.quality = "Squares"; + }else{ + scope.quality = value; + } + }; -function setQuality(value){ + this.setMaterial = function(value){ + if(value === "RGB"){ + scope.pointColorType = Potree.PointColorType.RGB; + }else if(value === "Color"){ + scope.pointColorType = Potree.PointColorType.COLOR; + }else if(value === "Elevation"){ + scope.pointColorType = Potree.PointColorType.HEIGHT; + }else if(value === "Intensity"){ + scope.pointColorType = Potree.PointColorType.INTENSITY; + }else if(value === "Intensity Gradient"){ + scope.pointColorType = Potree.PointColorType.INTENSITY_GRADIENT; + }else if(value === "Classification"){ + scope.pointColorType = Potree.PointColorType.CLASSIFICATION; + }else if(value === "Return Number"){ + scope.pointColorType = Potree.PointColorType.RETURN_NUMBER; + }else if(value === "Source"){ + scope.pointColorType = Potree.PointColorType.SOURCE; + }else if(value === "Tree Depth"){ + scope.pointColorType = Potree.PointColorType.TREE_DEPTH; + }else if(value === "Point Index"){ + scope.pointColorType = Potree.PointColorType.POINT_INDEX; + }else if(value === "Normal"){ + scope.pointColorType = Potree.PointColorType.NORMAL; + }else if(value === "Phong"){ + scope.pointColorType = Potree.PointColorType.PHONG; + } + }; + this.zoomTo = function(node, factor){ + scope.camera.zoomTo(node, factor); + + var bs; + if(node.boundingSphere){ + bs = node.boundingSphere; + }else if(node.geometry && node.geometry.boundingSphere){ + bs = node.geometry.boundingSphere; + }else{ + bs = node.boundingBox.getBoundingSphere(); + } + + bs = bs.clone().applyMatrix4(node.matrixWorld); + + scope.orbitControls.target.copy(bs.center); + }; - if(value == "Interpolation" && !Potree.Features.SHADER_INTERPOLATION.isSupported()){ - quality = "Squares"; - }else if(value == "Splats" && !Potree.Features.SHADER_SPLATS.isSupported()){ - quality = "Squares"; - }else{ - quality = value; - } -}; - -function setMaterial(value){ - if(value === "RGB"){ - pointColorType = Potree.PointColorType.RGB; - }else if(value === "Color"){ - pointColorType = Potree.PointColorType.COLOR; - }else if(value === "Elevation"){ - pointColorType = Potree.PointColorType.HEIGHT; - }else if(value === "Intensity"){ - pointColorType = Potree.PointColorType.INTENSITY; - }else if(value === "Intensity Gradient"){ - pointColorType = Potree.PointColorType.INTENSITY_GRADIENT; - }else if(value === "Classification"){ - pointColorType = Potree.PointColorType.CLASSIFICATION; - }else if(value === "Return Number"){ - pointColorType = Potree.PointColorType.RETURN_NUMBER; - }else if(value === "Source"){ - pointColorType = Potree.PointColorType.SOURCE; - }else if(value === "Tree Depth"){ - pointColorType = Potree.PointColorType.TREE_DEPTH; - }else if(value === "Point Index"){ - pointColorType = Potree.PointColorType.POINT_INDEX; - }else if(value === "Normal"){ - pointColorType = Potree.PointColorType.NORMAL; - }else if(value === "Phong"){ - pointColorType = Potree.PointColorType.PHONG; - } -}; - -function initGUI(){ + this.initGUI = function(){ - setPointSizeType(sceneProperties.sizeType); - setQuality(sceneProperties.quality); - setMaterial(sceneProperties.material); + scope.setPointSizeType(defaultSettings.sizeType); + scope.setQuality(defaultSettings.quality); + scope.setMaterial(defaultSettings.material); - // dat.gui - gui = new dat.GUI({ - //height : 5 * 32 - 1 - }); - - params = { - "points(m)": pointCountTarget, - PointSize: pointSize, - "FOV": sceneProperties.fov, - "opacity": opacity, - "SizeType" : sceneProperties.sizeType, - "show octree" : false, - "Materials" : sceneProperties.material, - "Clip Mode": "Highlight Inside", - "quality": sceneProperties.quality, - "EDL": sceneProperties.useEDL, - "skybox": false, - "stats": showStats, - "BoundingBox": showBoundingBox, - "DEM Collisions": useDEMCollisions, - "MinNodeSize": minNodeSize, - "freeze": freeze - }; - - var pPoints = gui.add(params, 'points(m)', 0, 4); - pPoints.onChange(function(value){ - pointCountTarget = value ; - }); - - var fAppearance = gui.addFolder('Appearance'); - - var pPointSize = fAppearance.add(params, 'PointSize', 0, 3); - pPointSize.onChange(function(value){ - pointSize = value; - }); - - var fFOV = fAppearance.add(params, 'FOV', 20, 100); - fFOV.onChange(function(value){ - fov = value; - }); - - var pOpacity = fAppearance.add(params, 'opacity', 0, 1); - pOpacity.onChange(function(value){ - opacity = value; - }); - - var pSizeType = fAppearance.add(params, 'SizeType', [ "Fixed", "Attenuated", "Adaptive"]); - pSizeType.onChange(function(value){ - setPointSizeType(value); - }); - - var options = []; - var attributes = pointcloud.pcoGeometry.pointAttributes - if(attributes === "LAS" || attributes === "LAZ"){ - options = [ - "RGB", "Color", "Elevation", "Intensity", "Intensity Gradient", - "Classification", "Return Number", "Source", - "Tree Depth"]; - }else{ - for(var i = 0; i < attributes.attributes.length; i++){ - var attribute = attributes.attributes[i]; - - if(attribute === Potree.PointAttribute.COLOR_PACKED){ - options.push("RGB"); - }else if(attribute === Potree.PointAttribute.INTENSITY){ - options.push("Intensity"); - options.push("Intensity Gradient"); - }else if(attribute === Potree.PointAttribute.CLASSIFICATION){ - options.push("Classification"); + // dat.gui + gui = new dat.GUI({ + autoPlace: false + //height : 5 * 32 - 1 + }); + gui.domElement.style.position = "absolute"; + gui.domElement.style.top = "5px"; + gui.domElement.style.right = "5px"; + this.renderArea.appendChild(gui.domElement); + + params = { + "max. points(m)": scope.pointCountTarget, + PointSize: scope.pointSize, + "FOV": scope.fov, + "opacity": scope.opacity, + "SizeType" : defaultSettings.sizeType, + "show octree" : false, + "Materials" : defaultSettings.material, + "Clip Mode": "Highlight Inside", + "quality": defaultSettings.quality, + "EDL": defaultSettings.useEDL, + "EDLScale": scope.edlScale, + "skybox": false, + "stats": scope.showStats, + "debugInfos": scope.showDebugInfos, + "BoundingBox": scope.showBoundingBox, + "DEM Collisions": scope.useDEMCollisions, + "MinNodeSize": scope.minNodeSize, + "freeze": scope.freeze + }; + + var pPoints = gui.add(params, 'max. points(m)', 0, 4); + pPoints.onChange(function(value){ + scope.pointCountTarget = value ; + }); + + var fAppearance = gui.addFolder('Appearance'); + + var pPointSize = fAppearance.add(params, 'PointSize', 0, 3); + pPointSize.onChange(function(value){ + scope.pointSize = value; + }); + + var fFOV = fAppearance.add(params, 'FOV', 20, 100); + fFOV.onChange(function(value){ + scope.fov = value; + }); + + var pOpacity = fAppearance.add(params, 'opacity', 0, 1); + pOpacity.onChange(function(value){ + scope.opacity = value; + }); + + var pSizeType = fAppearance.add(params, 'SizeType', [ "Fixed", "Attenuated", "Adaptive"]); + pSizeType.onChange(function(value){ + scope.setPointSizeType(value); + }); + + var options = []; + var attributes = scope.pointcloud.pcoGeometry.pointAttributes + if(attributes === "LAS" || attributes === "LAZ"){ + options = [ + "RGB", "Color", "Elevation", "Intensity", "Intensity Gradient", + "Classification", "Return Number", "Source", + "Tree Depth"]; + }else{ + for(var i = 0; i < attributes.attributes.length; i++){ + var attribute = attributes.attributes[i]; + + if(attribute === Potree.PointAttribute.COLOR_PACKED){ + options.push("RGB"); + }else if(attribute === Potree.PointAttribute.INTENSITY){ + options.push("Intensity"); + options.push("Intensity Gradient"); + }else if(attribute === Potree.PointAttribute.CLASSIFICATION){ + options.push("Classification"); + } + } + if(attributes.hasNormals()){ + options.push("Phong"); + options.push("Normal"); } + + options.push("Elevation"); + options.push("Color"); + options.push("Tree Depth"); } - if(attributes.hasNormals()){ - options.push("Phong"); - options.push("Normal"); + + // default material is not available. set material to Elevation + if(options.indexOf(params.Materials) < 0){ + console.error("Default Material '" + params.Material + "' is not available. Using Elevation instead"); + scope.setMaterial("Elevation"); + params.Materials = "Elevation"; } - options.push("Elevation"); - options.push("Color"); - options.push("Tree Depth"); - } - - // default material is not available. set material to Elevation - if(options.indexOf(params.Materials) < 0){ - console.error("Default Material '" + params.Material + "' is not available. Using Elevation instead"); - setMaterial("Elevation"); - params.Materials = "Elevation"; - } - - - pMaterial = fAppearance.add(params, 'Materials',options); - pMaterial.onChange(function(value){ - setMaterial(value); - }); - - var qualityOptions = ["Squares", "Circles"]; - if(Potree.Features.SHADER_INTERPOLATION.isSupported()){ - qualityOptions.push("Interpolation"); - } - if(Potree.Features.SHADER_SPLATS.isSupported()){ - qualityOptions.push("Splats"); - } - var pQuality = fAppearance.add(params, 'quality', qualityOptions); - pQuality.onChange(function(value){ - quality = value; - }); - - if(Potree.Features.SHADER_EDL.isSupported()){ - var pEDL = fAppearance.add(params, 'EDL'); - pEDL.onChange(function(value){ - sceneProperties.useEDL = value; + + pMaterial = fAppearance.add(params, 'Materials',options); + pMaterial.onChange(function(value){ + scope.setMaterial(value); }); - } - - var pSykbox = fAppearance.add(params, 'skybox'); - pSykbox.onChange(function(value){ - showSkybox = value; - }); - - var fSettings = gui.addFolder('Settings'); - - var pClipMode = fSettings.add(params, 'Clip Mode', [ "No Clipping", "Clip Outside", "Highlight Inside"]); - pClipMode.onChange(function(value){ - if(value === "No Clipping"){ - clipMode = Potree.ClipMode.DISABLED; - }else if(value === "Clip Outside"){ - clipMode = Potree.ClipMode.CLIP_OUTSIDE; - }else if(value === "Highlight Inside"){ - clipMode = Potree.ClipMode.HIGHLIGHT_INSIDE; + + var qualityOptions = ["Squares", "Circles"]; + if(Potree.Features.SHADER_INTERPOLATION.isSupported()){ + qualityOptions.push("Interpolation"); } - }); - - var pDEMCollisions = fSettings.add(params, 'DEM Collisions'); - pDEMCollisions.onChange(function(value){ - useDEMCollisions = value; - }); - - var pMinNodeSize = fSettings.add(params, 'MinNodeSize', 0, 1500); - pMinNodeSize.onChange(function(value){ - minNodeSize = value; - }); - - - - - var fDebug = gui.addFolder('Debug'); - - - var pStats = fDebug.add(params, 'stats'); - pStats.onChange(function(value){ - showStats = value; - }); - - var pBoundingBox = fDebug.add(params, 'BoundingBox'); - pBoundingBox.onChange(function(value){ - showBoundingBox = value; - }); - - var pFreeze = fDebug.add(params, 'freeze'); - pFreeze.onChange(function(value){ - freeze = value; - }); + if(Potree.Features.SHADER_SPLATS.isSupported()){ + qualityOptions.push("Splats"); + } + var pQuality = fAppearance.add(params, 'quality', qualityOptions); + pQuality.onChange(function(value){ + scope.quality = value; + }); + + { // Eye-Dome-Lighting + if(Potree.Features.SHADER_EDL.isSupported()){ + + var edlParams = { + "enable": scope.useEDL, + "strength": scope.edlScale, + "radius": scope.edlRadius + }; + + var fEDL = fAppearance.addFolder('Eye-Dome-Lighting'); + var pEDL = fEDL.add(edlParams, 'enable'); + pEDL.onChange(function(value){ + scope.useEDL = value; + }); + + var pEDLScale = fEDL.add(edlParams, 'strength', 0, 3, 0.01); + pEDLScale.onChange(function(value){ + scope.edlScale = value; + }); + + var pRadius = fEDL.add(edlParams, 'radius', 1, 5); + pRadius.onChange(function(value){ + scope.edlRadius = value; + }); + } + } + + { // Classification + var classificationParams = { + "never classified": true, + "unclassified": true, + "ground": true, + "low vegetation": true, + "medium vegetation": true, + "high vegetation": true, + "building": true, + "low point(noise)": true, + "key-point": true, + "water": true, + "overlap": true + }; + + var setClassificationVisibility = function(key, value){ + if(!scope.pointcloud){ + return; + } + var newClass = scope.pointcloud.material.classification; + newClass[key].w = value ? 1 : 0; + + scope.pointcloud.material.classification = newClass; + }; + + var fClassification = fAppearance.addFolder('Classification'); + + var pNeverClassified = fClassification.add(classificationParams, 'never classified'); + pNeverClassified.onChange(function(value){ + setClassificationVisibility(0, value); + }); + + var pUnclassified = fClassification.add(classificationParams, 'unclassified'); + pUnclassified.onChange(function(value){ + setClassificationVisibility(1, value); + }); + + var pGround = fClassification.add(classificationParams, 'ground'); + pGround.onChange(function(value){ + setClassificationVisibility(2, value); + }); + + var pLowVeg = fClassification.add(classificationParams, 'low vegetation'); + pLowVeg.onChange(function(value){ + setClassificationVisibility(3, value); + }); + + var pMedVeg = fClassification.add(classificationParams, 'medium vegetation'); + pMedVeg.onChange(function(value){ + setClassificationVisibility(4, value); + }); + + var pHighVeg = fClassification.add(classificationParams, 'high vegetation'); + pHighVeg.onChange(function(value){ + setClassificationVisibility(5, value); + }); + + var pBuilding = fClassification.add(classificationParams, 'building'); + pBuilding.onChange(function(value){ + setClassificationVisibility(6, value); + }); + + var pNoise = fClassification.add(classificationParams, 'low point(noise)'); + pNoise.onChange(function(value){ + setClassificationVisibility(7, value); + }); + + var pKeyPoint = fClassification.add(classificationParams, 'key-point'); + pKeyPoint.onChange(function(value){ + setClassificationVisibility(8, value); + }); + + var pWater = fClassification.add(classificationParams, 'water'); + pWater.onChange(function(value){ + setClassificationVisibility(9, value); + }); + + var pOverlap = fClassification.add(classificationParams, 'overlap'); + pOverlap.onChange(function(value){ + setClassificationVisibility(12, value); + }); + + - // stats - stats = new Stats(); - stats.domElement.style.position = 'absolute'; - stats.domElement.style.top = '0px'; - stats.domElement.style.margin = '5px'; - document.body.appendChild( stats.domElement ); -} + } + + var pSykbox = fAppearance.add(params, 'skybox'); + pSykbox.onChange(function(value){ + showSkybox = value; + }); + + var fSettings = gui.addFolder('Settings'); + + var pClipMode = fSettings.add(params, 'Clip Mode', [ "No Clipping", "Clip Outside", "Highlight Inside"]); + pClipMode.onChange(function(value){ + if(value === "No Clipping"){ + scope.clipMode = Potree.ClipMode.DISABLED; + }else if(value === "Clip Outside"){ + scope.clipMode = Potree.ClipMode.CLIP_OUTSIDE; + }else if(value === "Highlight Inside"){ + scope.clipMode = Potree.ClipMode.HIGHLIGHT_INSIDE; + } + }); + + var pDEMCollisions = fSettings.add(params, 'DEM Collisions'); + pDEMCollisions.onChange(function(value){ + scope.useDEMCollisions = value; + }); + + var pMinNodeSize = fSettings.add(params, 'MinNodeSize', 0, 1500); + pMinNodeSize.onChange(function(value){ + scope.minNodeSize = value; + }); + + + + + var fDebug = gui.addFolder('Debug'); -function initThree(){ - var width = elRenderArea.clientWidth; - var height = elRenderArea.clientHeight; - var aspect = width / height; - var near = 0.1; - var far = 1000*1000; + + var pStats = fDebug.add(params, 'stats'); + pStats.onChange(function(value){ + scope.showStats = value; + }); + + var pShowDebugInfos = fDebug.add(params, "debugInfos"); + pShowDebugInfos.onChange(function(value){ + scope.showDebugInfos = value; + scope.infos.domElement.style.display = scope.showDebugInfos ? "block" : "none"; + }); + + var pBoundingBox = fDebug.add(params, 'BoundingBox'); + pBoundingBox.onChange(function(value){ + scope.showBoundingBox = value; + }); + + var pFreeze = fDebug.add(params, 'freeze'); + pFreeze.onChange(function(value){ + scope.freeze = value; + }); - scene = new THREE.Scene(); - scenePointCloud = new THREE.Scene(); - sceneBG = new THREE.Scene(); - - camera = new THREE.PerspectiveCamera(fov, aspect, near, far); - //camera = new THREE.OrthographicCamera(-50, 50, 50, -50, 1, 100000); - cameraBG = new THREE.Camera(); - camera.rotation.order = 'ZYX'; + // stats + stats = new Stats(); + stats.domElement.style.position = 'absolute'; + stats.domElement.style.top = '0px'; + stats.domElement.style.margin = '5px'; + document.body.appendChild( stats.domElement ); + } - referenceFrame = new THREE.Object3D(); - scenePointCloud.add(referenceFrame); - - renderer = new THREE.WebGLRenderer(); - renderer.setSize(width, height); - renderer.autoClear = false; - elRenderArea.appendChild(renderer.domElement); + this.createControls = function(){ + { // create FIRST PERSON CONTROLS + scope.fpControls = new THREE.FirstPersonControls(scope.camera, scope.renderer.domElement); + scope.fpControls.addEventListener("proposeTransform", function(event){ + if(!scope.pointcloud || !scope.useDEMCollisions){ + return; + } + + var demHeight = scope.pointcloud.getDEMHeight(event.newPosition); + if(event.newPosition.y < demHeight){ + event.objections++; + + var counterProposal = event.newPosition.clone(); + counterProposal.y = demHeight; + + event.counterProposals.push(counterProposal); + } + }); + } - skybox = Potree.utils.loadSkybox("../resources/textures/skybox/"); + { // create ORBIT CONTROLS + scope.orbitControls = new Potree.OrbitControls(scope.camera, scope.renderer.domElement); + scope.orbitControls.addEventListener("proposeTransform", function(event){ + if(!scope.pointcloud || !scope.useDEMCollisions){ + return; + } + + var demHeight = scope.pointcloud.getDEMHeight(event.newPosition); + if(event.newPosition.y < demHeight){ + event.objections++; + + var counterProposal = event.newPosition.clone(); + counterProposal.y = demHeight; + + event.counterProposals.push(counterProposal); + } + }); + scope.renderArea.addEventListener("dblclick", function(event){ + if(!scope.pointcloud){ + return; + } + + event.preventDefault(); + + var rect = scope.renderArea.getBoundingClientRect(); + + var mouse = { + x: ( (event.clientX - rect.left) / scope.renderArea.clientWidth ) * 2 - 1, + y: - ( (event.clientY - rect.top) / scope.renderArea.clientHeight ) * 2 + 1 + }; + + + var I = getMousePointCloudIntersection(mouse, scope.camera, scope.renderer, [scope.pointcloud]); + if(I != null){ + + var camTargetDistance = scope.camera.position.distanceTo(scope.orbitControls.target); + + var vector = new THREE.Vector3( mouse.x, mouse.y, 0.5 ); + vector.unproject(scope.camera); - // camera and controls - camera.position.set(-304, 372, 318); - camera.rotation.y = -Math.PI / 4; - camera.rotation.x = -Math.PI / 6; - //useOrbitControls(); - earthControls = new THREE.EarthControls(camera, renderer, scenePointCloud); - earthControls.addEventListener("proposeTransform", function(event){ - if(!pointcloud || !useDEMCollisions){ - return; + var direction = vector.sub(scope.camera.position).normalize(); + var ray = new THREE.Ray(scope.camera.position, direction); + + var nodes = scope.pointcloud.nodesOnRay(scope.pointcloud.visibleNodes, ray); + var lastNode = nodes[nodes.length - 1]; + var radius = lastNode.boundingSphere.radius; + var targetRadius = Math.min(camTargetDistance, radius); + + var d = scope.camera.getWorldDirection().multiplyScalar(-1); + var cameraTargetPosition = new THREE.Vector3().addVectors(I, d.multiplyScalar(targetRadius)); + var controlsTargetPosition = I; + + var animationDuration = 600; + + var easing = TWEEN.Easing.Quartic.Out; + + scope.controls.enabled = false; + + // animate position + var tween = new TWEEN.Tween(scope.camera.position).to(cameraTargetPosition, animationDuration); + tween.easing(easing); + tween.start(); + + // animate target + var tween = new TWEEN.Tween(scope.orbitControls.target).to(I, animationDuration); + tween.easing(easing); + tween.onComplete(function(){ + scope.controls.enabled = true; + scope.fpControls.moveSpeed = radius / 2; + }); + tween.start(); + } + }); } - var demHeight = pointcloud.getDEMHeight(event.newPosition); - if(event.newPosition.y < demHeight){ - event.objections++; + { // create EARTH CONTROLS + scope.earthControls = new THREE.EarthControls(scope.camera, scope.renderer, scope.scenePointCloud); + scope.earthControls.addEventListener("proposeTransform", function(event){ + if(!scope.pointcloud || !scope.useDEMCollisions){ + return; + } + + var demHeight = scope.pointcloud.getDEMHeight(event.newPosition); + if(event.newPosition.y < demHeight){ + event.objections++; + } + }); } - }); - useEarthControls(); - - // enable frag_depth extension for the interpolation shader, if available - renderer.context.getExtension("EXT_frag_depth"); + }; - // load pointcloud - if(!pointcloudPath){ + this.initThree = function(){ + var width = renderArea.clientWidth; + var height = renderArea.clientHeight; + var aspect = width / height; + var near = 0.1; + var far = 1000*1000; + + scope.scene = new THREE.Scene(); + scope.scenePointCloud = new THREE.Scene(); + scope.sceneBG = new THREE.Scene(); + + scope.camera = new THREE.PerspectiveCamera(scope.fov, aspect, near, far); + //camera = new THREE.OrthographicCamera(-50, 50, 50, -50, 1, 100000); + scope.cameraBG = new THREE.Camera(); + scope.camera.rotation.order = 'ZYX'; - }else if(pointcloudPath.indexOf("cloud.js") > 0){ - Potree.POCLoader.load(pointcloudPath, function(geometry){ - pointcloud = new Potree.PointCloudOctree(geometry); + referenceFrame = new THREE.Object3D(); + scope.scenePointCloud.add(referenceFrame); + + scope.renderer = new THREE.WebGLRenderer(); + scope.renderer.setSize(width, height); + scope.renderer.autoClear = false; + renderArea.appendChild(scope.renderer.domElement); + + skybox = Potree.utils.loadSkybox("../resources/textures/skybox/"); + + // camera and controls + scope.camera.position.set(-304, 372, 318); + scope.camera.rotation.y = -Math.PI / 4; + scope.camera.rotation.x = -Math.PI / 6; + + this.createControls(); + + scope.useEarthControls(); + + // enable frag_depth extension for the interpolation shader, if available + scope.renderer.context.getExtension("EXT_frag_depth"); + + // load pointcloud + if(!pointcloudPath){ + + }else if(pointcloudPath.indexOf("cloud.js") > 0){ + Potree.POCLoader.load(pointcloudPath, function(geometry){ + scope.pointcloud = new Potree.PointCloudOctree(geometry); + + scope.pointcloud.material.pointSizeType = Potree.PointSizeType.ADAPTIVE; + scope.pointcloud.material.size = scope.pointSize; + scope.pointcloud.visiblePointsTarget = scope.pointCountTarget * 1000 * 1000; + + referenceFrame.add(scope.pointcloud); + + referenceFrame.updateMatrixWorld(true); + var sg = scope.pointcloud.boundingSphere.clone().applyMatrix4(scope.pointcloud.matrixWorld); + + referenceFrame.position.copy(sg.center).multiplyScalar(-1); + referenceFrame.updateMatrixWorld(true); + + if(sg.radius > 50*1000){ + scope.camera.near = 10; + }else if(sg.radius > 10*1000){ + scope.camera.near = 2; + }else if(sg.radius > 1000){ + scope.camera.near = 1; + }else if(sg.radius > 100){ + scope.camera.near = 0.5; + }else{ + scope.camera.near = 0.1; + } + + + scope.flipYZ(); + scope.zoomTo(scope.pointcloud, 1); + + scope.initGUI(); - pointcloud.material.pointSizeType = Potree.PointSizeType.ADAPTIVE; - pointcloud.material.size = pointSize; - pointcloud.visiblePointsTarget = pointCountTarget * 1000 * 1000; + scope.earthControls.pointclouds.push(scope.pointcloud); + + + + if(defaultSettings.navigation === "Earth"){ + scope.useEarthControls(); + }else if(defaultSettings.navigation === "Orbit"){ + scope.useOrbitControls(); + }else if(defaultSettings.navigation === "Flight"){ + scope.useFPSControls(); + }else{ + console.warning("No navigation mode specified. Using OrbitControls"); + scope.useOrbitControls(); + } + + if(defaultSettings.cameraPosition != null){ + var cp = new THREE.Vector3(defaultSettings.cameraPosition[0], defaultSettings.cameraPosition[1], defaultSettings.cameraPosition[2]); + scope.camera.position.copy(cp); + } + + if(defaultSettings.cameraTarget != null){ + var ct = new THREE.Vector3(defaultSettings.cameraTarget[0], defaultSettings.cameraTarget[1], defaultSettings.cameraTarget[2]); + scope.camera.lookAt(ct); + + if(defaultSettings.navigation === "Orbit"){ + scope.controls.target.copy(ct); + } + } + + scope.dispatchEvent({ + "type": "pointcloud_loaded", + "pointcloud": scope.pointcloud + }); + + }); + }else if(pointcloudPath.indexOf(".vpc") > 0){ + Potree.PointCloudArena4DGeometry.load(pointcloudPath, function(geometry){ + scope.pointcloud = new Potree.PointCloudArena4D(geometry); + scope.pointcloud.visiblePointsTarget = 500*1000; + + //scope.pointcloud.applyMatrix(new THREE.Matrix4().set( + // 1,0,0,0, + // 0,0,1,0, + // 0,-1,0,0, + // 0,0,0,1 + //)); + + referenceFrame.add(scope.pointcloud); + + flipYZ(); + + referenceFrame.updateMatrixWorld(true); + var sg = scope.pointcloud.boundingSphere.clone().applyMatrix4(scope.pointcloud.matrixWorld); + + referenceFrame.position.sub(sg.center); + referenceFrame.position.y += sg.radius / 2; + referenceFrame.updateMatrixWorld(true); + + scope.zoomTo(scope.pointcloud, 1); + + initGUI(); + scope.pointcloud.material.interpolation = false; + scope.pointcloud.material.pointSizeType = Potree.PointSizeType.ATTENUATED; + scope.earthControls.pointclouds.push(scope.pointcloud); + + + if(defaultSettings.navigation === "Earth"){ + scope.useEarthControls(); + }else if(defaultSettings.navigation === "Orbit"){ + scope.useOrbitControls(); + }else if(defaultSettings.navigation === "Flight"){ + scope.useFPSControls(); + }else{ + console.warning("No navigation mode specivied. Using OrbitControls"); + scope.useOrbitControls(); + } + + if(defaultSettings.cameraPosition != null){ + var cp = new THREE.Vector3(defaultSettings.cameraPosition[0], defaultSettings.cameraPosition[1], defaultSettings.cameraPosition[2]); + scope.camera.position.copy(cp); + } + + if(defaultSettings.cameraTarget != null){ + var ct = new THREE.Vector3(defaultSettings.cameraTarget[0], defaultSettings.cameraTarget[1], defaultSettings.cameraTarget[2]); + scope.camera.lookAt(ct); + } + + }); + } + + var grid = Potree.utils.createGrid(5, 5, 2); + scope.scene.add(grid); + + scope.measuringTool = new Potree.MeasuringTool(scope.scenePointCloud, scope.camera, scope.renderer); + scope.profileTool = new Potree.ProfileTool(scope.scenePointCloud, scope.camera, scope.renderer); + scope.transformationTool = new Potree.TransformationTool(scope.scenePointCloud, scope.camera, scope.renderer); + scope.volumeTool = new Potree.VolumeTool(scope.scenePointCloud, scope.camera, scope.renderer, scope.transformationTool); + + + // background + // var texture = THREE.ImageUtils.loadTexture( '../resources/textures/background.gif' ); + var texture = Potree.utils.createBackgroundTexture(512, 512); + + texture.minFilter = texture.magFilter = THREE.NearestFilter; + texture.minFilter = texture.magFilter = THREE.LinearFilter; + + var bg = new THREE.Mesh( + new THREE.PlaneBufferGeometry(2, 2, 0), + new THREE.MeshBasicMaterial({ + map: texture + }) + ); + //bg.position.z = -1; + bg.material.depthTest = false; + bg.material.depthWrite = false; + scope.sceneBG.add(bg); + + window.addEventListener( 'keydown', onKeyDown, false ); + + scope.directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 ); + scope.directionalLight.position.set( 10, 10, 10 ); + scope.directionalLight.lookAt( new THREE.Vector3(0, 0, 0)); + scope.scenePointCloud.add( scope.directionalLight ); + + var light = new THREE.AmbientLight( 0x555555 ); // soft white light + scope.scenePointCloud.add( light ); + + } + + this.flipYZ = function(){ + scope.isFlipYZ = !scope.isFlipYZ; + + if(scope.isFlipYZ){ + referenceFrame.matrix.copy(new THREE.Matrix4()); + referenceFrame.applyMatrix(new THREE.Matrix4().set( + 1,0,0,0, + 0,0,1,0, + 0,-1,0,0, + 0,0,0,1 + )); - referenceFrame.add(pointcloud); + }else{ + referenceFrame.matrix.copy(new THREE.Matrix4()); + referenceFrame.applyMatrix(new THREE.Matrix4().set( + 1,0,0,0, + 0,1,0,0, + 0,0,1,0, + 0,0,0,1 + )); + } + + referenceFrame.updateMatrixWorld(true); + scope.pointcloud.updateMatrixWorld(); + var sg = scope.pointcloud.boundingSphere.clone().applyMatrix4(scope.pointcloud.matrixWorld); + referenceFrame.position.copy(sg.center).multiplyScalar(-1); + referenceFrame.updateMatrixWorld(true); + referenceFrame.position.y -= scope.pointcloud.getWorldPosition().y; + referenceFrame.updateMatrixWorld(true); + } + + function onKeyDown(event){ + //console.log(event.keyCode); + + if(event.keyCode === 69){ + // e pressed - referenceFrame.updateMatrixWorld(true); - var sg = pointcloud.boundingSphere.clone().applyMatrix4(pointcloud.matrixWorld); + scope.transformationTool.translate(); + }else if(event.keyCode === 82){ + // r pressed - referenceFrame.position.copy(sg.center).multiplyScalar(-1); - referenceFrame.updateMatrixWorld(true); + scope.transformationTool.scale(); + }else if(event.keyCode === 84){ + // r pressed - if(sg.radius > 50*1000){ - camera.near = 10; - }else if(sg.radius > 10*1000){ - camera.near = 2; - }else if(sg.radius > 1000){ - camera.near = 1; - }else if(sg.radius > 100){ - camera.near = 0.5; - }else{ - camera.near = 0.1; + scope.transformationTool.rotate(); + } + }; + + var intensityMax = null; + var heightMin = null; + var heightMax = null; + + this.update = function(delta, timestamp){ + Potree.pointLoadLimit = scope.pointCountTarget * 2 * 1000 * 1000; + + scope.directionalLight.position.copy(scope.camera.position); + scope.directionalLight.lookAt(new THREE.Vector3().addVectors(scope.camera.position, scope.camera.getWorldDirection())); + + if(scope.pointcloud){ + + var bbWorld = Potree.utils.computeTransformedBoundingBox(scope.pointcloud.boundingBox, scope.pointcloud.matrixWorld); + + if(!intensityMax){ + var root = scope.pointcloud.pcoGeometry.root; + if(root != null && root.loaded){ + var attributes = scope.pointcloud.pcoGeometry.root.geometry.attributes; + if(attributes.intensity){ + var array = attributes.intensity.array; + var max = 0; + for(var i = 0; i < array.length; i++){ + max = Math.max(array[i]); + } + + if(max <= 1){ + intensityMax = 1; + }else if(max <= 256){ + intensityMax = 255; + }else{ + intensityMax = max; + } + } + } } + if(heightMin === null){ + heightMin = bbWorld.min.y; + heightMax = bbWorld.max.y; + } + + scope.pointcloud.material.clipMode = scope.clipMode; + scope.pointcloud.material.heightMin = heightMin; + scope.pointcloud.material.heightMax = heightMax; + scope.pointcloud.material.intensityMin = 0; + scope.pointcloud.material.intensityMax = intensityMax; + scope.pointcloud.showBoundingBox = scope.showBoundingBox; + scope.pointcloud.generateDEM = scope.useDEMCollisions; + scope.pointcloud.minimumNodePixelSize = scope.minNodeSize; - flipYZ(); - camera.zoomTo(pointcloud, 1); - - initGUI(); + if(!scope.freeze){ + scope.pointcloud.update(scope.camera, scope.renderer); + } + } + + if(stats && scope.showStats){ + document.getElementById("lblNumVisibleNodes").style.display = ""; + document.getElementById("lblNumVisiblePoints").style.display = ""; + stats.domElement.style.display = ""; + + stats.update(); + + if(scope.pointcloud){ + document.getElementById("lblNumVisibleNodes").innerHTML = "visible nodes: " + scope.pointcloud.numVisibleNodes; + document.getElementById("lblNumVisiblePoints").innerHTML = "visible points: " + Potree.utils.addCommas(scope.pointcloud.numVisiblePoints); + } + }else if(stats){ + document.getElementById("lblNumVisibleNodes").style.display = "none"; + document.getElementById("lblNumVisiblePoints").style.display = "none"; + stats.domElement.style.display = "none"; + } + + scope.camera.fov = scope.fov; - earthControls.pointclouds.push(pointcloud); - + if(scope.controls){ + scope.controls.update(delta); + } + + // update progress bar + if(scope.pointcloud){ + var progress = scope.pointcloud.progress; + progressBar.progress = progress; - if(sceneProperties.navigation === "Earth"){ - useEarthControls(); - }else if(sceneProperties.navigation === "Orbit"){ - useOrbitControls(); - }else if(sceneProperties.navigation === "Flight"){ - useFPSControls(); + var message; + if(progress === 0 || scope.pointcloud instanceof Potree.PointCloudArena4D){ + message = "loading"; }else{ - console.warning("No navigation mode specified. Using OrbitControls"); - useOrbitControls(); - } - - if(sceneProperties.cameraPosition != null){ - var cp = new THREE.Vector3(sceneProperties.cameraPosition[0], sceneProperties.cameraPosition[1], sceneProperties.cameraPosition[2]); - camera.position.copy(cp); + message = "loading: " + parseInt(progress*100) + "%"; } + progressBar.message = message; - if(sceneProperties.cameraTarget != null){ - var ct = new THREE.Vector3(sceneProperties.cameraTarget[0], sceneProperties.cameraTarget[1], sceneProperties.cameraTarget[2]); - camera.lookAt(ct); - - if(sceneProperties.navigation === "Orbit"){ - controls.target.copy(ct); - } + if(progress === 1){ + progressBar.hide(); + }else if(progress < 1){ + progressBar.show(); } + } + + scope.volumeTool.update(); + scope.transformationTool.update(); + scope.profileTool.update(); + + + var clipBoxes = []; + + for(var i = 0; i < scope.profileTool.profiles.length; i++){ + var profile = scope.profileTool.profiles[i]; - }); - }else if(pointcloudPath.indexOf(".vpc") > 0){ - Potree.PointCloudArena4DGeometry.load(pointcloudPath, function(geometry){ - pointcloud = new Potree.PointCloudArena4D(geometry); - pointcloud.visiblePointsTarget = 500*1000; - - //pointcloud.applyMatrix(new THREE.Matrix4().set( - // 1,0,0,0, - // 0,0,1,0, - // 0,-1,0,0, - // 0,0,0,1 - //)); - - referenceFrame.add(pointcloud); - - flipYZ(); - - referenceFrame.updateMatrixWorld(true); - var sg = pointcloud.boundingSphere.clone().applyMatrix4(pointcloud.matrixWorld); - - referenceFrame.position.sub(sg.center); - referenceFrame.position.y += sg.radius / 2; - referenceFrame.updateMatrixWorld(true); - - camera.zoomTo(pointcloud, 1); - - initGUI(); - pointcloud.material.interpolation = false; - pointcloud.material.pointSizeType = Potree.PointSizeType.ATTENUATED; - earthControls.pointclouds.push(pointcloud); - - - if(sceneProperties.navigation === "Earth"){ - useEarthControls(); - }else if(sceneProperties.navigation === "Orbit"){ - useOrbitControls(); - }else if(sceneProperties.navigation === "Flight"){ - useFPSControls(); - }else{ - console.warning("No navigation mode specivied. Using OrbitControls"); - useOrbitControls(); + for(var j = 0; j < profile.boxes.length; j++){ + var box = profile.boxes[j]; + box.updateMatrixWorld(); + var boxInverse = new THREE.Matrix4().getInverse(box.matrixWorld); + clipBoxes.push(boxInverse); } + } + + for(var i = 0; i < scope.volumeTool.volumes.length; i++){ + var volume = scope.volumeTool.volumes[i]; - if(sceneProperties.cameraPosition != null){ - var cp = new THREE.Vector3(sceneProperties.cameraPosition[0], sceneProperties.cameraPosition[1], sceneProperties.cameraPosition[2]); - camera.position.copy(cp); - } + if(volume.clip){ + volume.updateMatrixWorld(); + var boxInverse = new THREE.Matrix4().getInverse(volume.matrixWorld); - if(sceneProperties.cameraTarget != null){ - var ct = new THREE.Vector3(sceneProperties.cameraTarget[0], sceneProperties.cameraTarget[1], sceneProperties.cameraTarget[2]); - camera.lookAt(ct); + clipBoxes.push(boxInverse); } - - }); - } - - var grid = Potree.utils.createGrid(5, 5, 2); - scene.add(grid); - - measuringTool = new Potree.MeasuringTool(scenePointCloud, camera, renderer); - profileTool = new Potree.ProfileTool(scenePointCloud, camera, renderer); - volumeTool = new Potree.VolumeTool(scenePointCloud, camera, renderer); - transformationTool = new Potree.TransformationTool(scenePointCloud, camera, renderer); - - - // background - // var texture = THREE.ImageUtils.loadTexture( '../resources/textures/background.gif' ); - var texture = Potree.utils.createBackgroundTexture(512, 512); - - texture.minFilter = texture.magFilter = THREE.NearestFilter; - texture.minFilter = texture.magFilter = THREE.LinearFilter; - - var bg = new THREE.Mesh( - new THREE.PlaneBufferGeometry(2, 2, 0), - new THREE.MeshBasicMaterial({ - map: texture - }) - ); - //bg.position.z = -1; - bg.material.depthTest = false; - bg.material.depthWrite = false; - sceneBG.add(bg); - - window.addEventListener( 'keydown', onKeyDown, false ); - - directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 ); - directionalLight.position.set( 10, 10, 10 ); - directionalLight.lookAt( new THREE.Vector3(0, 0, 0)); - scenePointCloud.add( directionalLight ); - - var light = new THREE.AmbientLight( 0x555555 ); // soft white light - scenePointCloud.add( light ); - -} - -function flipYZ(){ - isFlipYZ = !isFlipYZ; - - if(isFlipYZ){ - referenceFrame.matrix.copy(new THREE.Matrix4()); - referenceFrame.applyMatrix(new THREE.Matrix4().set( - 1,0,0,0, - 0,0,1,0, - 0,-1,0,0, - 0,0,0,1 - )); - - }else{ - referenceFrame.matrix.copy(new THREE.Matrix4()); - referenceFrame.applyMatrix(new THREE.Matrix4().set( - 1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1 - )); - } - - referenceFrame.updateMatrixWorld(true); - pointcloud.updateMatrixWorld(); - var sg = pointcloud.boundingSphere.clone().applyMatrix4(pointcloud.matrixWorld); - referenceFrame.position.copy(sg.center).multiplyScalar(-1); - referenceFrame.updateMatrixWorld(true); - referenceFrame.position.y -= pointcloud.getWorldPosition().y; - referenceFrame.updateMatrixWorld(true); -} - -function onKeyDown(event){ - //console.log(event.keyCode); - - if(event.keyCode === 69){ - // e pressed - - transformationTool.translate(); - }else if(event.keyCode === 82){ - // r pressed + } - transformationTool.scale(); - }else if(event.keyCode === 84){ - // r pressed + if(scope.pointcloud){ + scope.pointcloud.material.setClipBoxes(clipBoxes); + } - transformationTool.rotate(); - } -}; - -var intensityMax = null; -var heightMin = null; -var heightMax = null; + {// update annotations + var distances = []; + for(var i = 0; i < scope.annotations.length; i++){ + var ann = scope.annotations[i]; + var screenPos = ann.position.clone().project(scope.camera); + + screenPos.x = scope.renderArea.clientWidth * (screenPos.x + 1) / 2; + screenPos.y = scope.renderArea.clientHeight * (1 - (screenPos.y + 1) / 2); + + ann.domElement.style.left = screenPos.x - ann.domElement.clientWidth / 2; + ann.domElement.style.top = screenPos.y; -function update(){ - Potree.pointLoadLimit = pointCountTarget * 2 * 1000 * 1000; - - directionalLight.position.copy(camera.position); - directionalLight.lookAt(new THREE.Vector3().addVectors(camera.position, camera.getWorldDirection())); - - if(pointcloud){ - - var bbWorld = Potree.utils.computeTransformedBoundingBox(pointcloud.boundingBox, pointcloud.matrixWorld); - - if(!intensityMax){ - var root = pointcloud.pcoGeometry.root; - if(root != null && root.loaded){ - var attributes = pointcloud.pcoGeometry.root.geometry.attributes; - if(attributes.intensity){ - var array = attributes.intensity.array; - var max = 0; - for(var i = 0; i < array.length; i++){ - max = Math.max(array[i]); - } - - if(max <= 1){ - intensityMax = 1; - }else if(max <= 256){ - intensityMax = 255; - }else{ - intensityMax = max; - } + distances.push({annotation: ann, distance: screenPos.z}); + + if(-1 > screenPos.z || screenPos.z > 1){ + ann.domElement.style.display = "none"; + }else{ + ann.domElement.style.display = "initial"; } } + distances.sort(function(a,b){return b.distance - a.distance}); + for(var i = 0; i < distances.length; i++){ + var ann = distances[i].annotation; + ann.domElement.style.zIndex = "" + i; + } } - if(heightMin === null){ - heightMin = bbWorld.min.y; - heightMax = bbWorld.max.y; + if(scope.showDebugInfos){ + scope.infos.set("camera.position", "camera.position: " + + viewer.camera.position.x.toFixed(2) + + ", " + viewer.camera.position.y.toFixed(2) + + ", " + viewer.camera.position.z.toFixed(2) + ); } - - pointcloud.material.clipMode = clipMode; - pointcloud.material.heightMin = heightMin; - pointcloud.material.heightMax = heightMax; - pointcloud.material.intensityMin = 0; - pointcloud.material.intensityMax = intensityMax; - pointcloud.showBoundingBox = showBoundingBox; - pointcloud.generateDEM = useDEMCollisions; - pointcloud.minimumNodePixelSize = minNodeSize; - - if(!freeze){ - pointcloud.update(camera, renderer); - } - } - - if(stats && showStats){ - document.getElementById("lblNumVisibleNodes").style.display = ""; - document.getElementById("lblNumVisiblePoints").style.display = ""; - stats.domElement.style.display = ""; - - stats.update(); - - if(pointcloud){ - document.getElementById("lblNumVisibleNodes").innerHTML = "visible nodes: " + pointcloud.numVisibleNodes; - document.getElementById("lblNumVisiblePoints").innerHTML = "visible points: " + Potree.utils.addCommas(pointcloud.numVisiblePoints); - } - }else if(stats){ - document.getElementById("lblNumVisibleNodes").style.display = "none"; - document.getElementById("lblNumVisiblePoints").style.display = "none"; - stats.domElement.style.display = "none"; + + TWEEN.update(timestamp); } - - camera.fov = fov; - - if(controls){ - controls.update(clock.getDelta()); + + this.useEarthControls = function(){ + if(scope.controls){ + scope.controls.enabled = false; + } + + scope.controls = scope.earthControls; + scope.controls.enabled = true; } - // update progress bar - if(pointcloud){ - var progress = pointcloud.progress; - - progressBar.progress = progress; - - var message; - if(progress === 0 || pointcloud instanceof Potree.PointCloudArena4D){ - message = "loading"; - }else{ - message = "loading: " + parseInt(progress*100) + "%"; + this.useFPSControls = function(){ + if(scope.controls){ + scope.controls.enabled = false; } - progressBar.message = message; + + scope.controls = scope.fpControls; + scope.controls.enabled = true; - if(progress === 1){ - progressBar.hide(); - }else if(progress < 1){ - progressBar.show(); - } + scope.controls.moveSpeed = scope.pointcloud.boundingSphere.radius / 6; } - - volumeTool.update(); - transformationTool.update(); - profileTool.update(); - - - var clipBoxes = []; - - for(var i = 0; i < profileTool.profiles.length; i++){ - var profile = profileTool.profiles[i]; - - for(var j = 0; j < profile.boxes.length; j++){ - var box = profile.boxes[j]; - box.updateMatrixWorld(); - var boxInverse = new THREE.Matrix4().getInverse(box.matrixWorld); - clipBoxes.push(boxInverse); + + this.useOrbitControls = function(){ + if(scope.controls){ + scope.controls.enabled = false; } - } - - for(var i = 0; i < volumeTool.volumes.length; i++){ - var volume = volumeTool.volumes[i]; - if(volume.clip){ - volume.updateMatrixWorld(); - var boxInverse = new THREE.Matrix4().getInverse(volume.matrixWorld); + scope.controls = scope.orbitControls; + scope.controls.enabled = true; - clipBoxes.push(boxInverse); + if(scope.pointcloud){ + scope.controls.target.copy(scope.pointcloud.boundingSphere.center.clone().applyMatrix4(scope.pointcloud.matrixWorld)); } - } + }; - if(pointcloud){ - pointcloud.material.setClipBoxes(clipBoxes); + this.addAnnotation = function(position, args){ + var cameraPosition = args.cameraPosition; + var cameraTarget = args.cameraTarget || position; + + var annotation = new Potree.Annotation(scope, { + "position": position, + "cameraPosition": cameraPosition, + "cameraTarget": cameraTarget + }); + + scope.annotations.push(annotation); + scope.renderArea.appendChild(annotation.domElement); } - - //if(pointcloud){ - // - // var levels = new Uint32Array(20); - // - // var vn = pointcloud.visibleNodes; - // for(var i = 0; i < vn.length; i++){ - // var node = vn[i].node; - // var level = node.level; - // - // levels[level]++; - // } - // - // var a; - //} - -} - -function useEarthControls(){ - if(controls){ - controls.enabled = false; - } - controls = earthControls; - controls.enabled = true; -} + var PotreeRenderer = function(){ -function useFPSControls(){ - if(controls){ - controls.enabled = false; - } - if(!fpControls){ - fpControls = new THREE.FirstPersonControls(camera, renderer.domElement); - fpControls.addEventListener("proposeTransform", function(event){ - if(!pointcloud || !useDEMCollisions){ - return; - } - - var demHeight = pointcloud.getDEMHeight(event.newPosition); - if(event.newPosition.y < demHeight){ - event.objections++; + this.render = function(){ + {// resize + var width = renderArea.clientWidth; + var height = renderArea.clientHeight; + var aspect = width / height; - var counterProposal = event.newPosition.clone(); - counterProposal.y = demHeight; + scope.camera.aspect = aspect; + scope.camera.updateProjectionMatrix(); - event.counterProposals.push(counterProposal); + scope.renderer.setSize(width, height); } - }); - } - - controls = fpControls; - controls.enabled = true; - - controls.moveSpeed = pointcloud.boundingSphere.radius / 6; -} + -function useOrbitControls(){ - if(controls){ - controls.enabled = false; - } - if(!orbitControls){ - orbitControls = new Potree.OrbitControls(camera, renderer.domElement); - orbitControls.addEventListener("proposeTransform", function(event){ - if(!pointcloud || !useDEMCollisions){ - return; + // render skybox + if(showSkybox){ + scope.camera.rotation.copy(scope.camera.rotation); + scope.renderer.render(skybox.scene, skybox.camera); + }else{ + scope.renderer.render(scope.sceneBG, scope.cameraBG); } - var demHeight = pointcloud.getDEMHeight(event.newPosition); - if(event.newPosition.y < demHeight){ - event.objections++; + if(scope.pointcloud){ + if(scope.pointcloud.originalMaterial){ + scope.pointcloud.material = scope.pointcloud.originalMaterial; + } - var counterProposal = event.newPosition.clone(); - counterProposal.y = demHeight; + var bbWorld = Potree.utils.computeTransformedBoundingBox(scope.pointcloud.boundingBox, scope.pointcloud.matrixWorld); - event.counterProposals.push(counterProposal); + scope.pointcloud.visiblePointsTarget = scope.pointCountTarget * 1000 * 1000; + scope.pointcloud.material.size = scope.pointSize; + scope.pointcloud.material.opacity = scope.opacity; + scope.pointcloud.material.pointColorType = scope.pointColorType; + scope.pointcloud.material.pointSizeType = scope.pointSizeType; + scope.pointcloud.material.pointShape = (scope.quality === "Circles") ? Potree.PointShape.CIRCLE : Potree.PointShape.SQUARE; + scope.pointcloud.material.interpolate = (scope.quality === "Interpolation"); + scope.pointcloud.material.weighted = false; } - }); - } - - controls = orbitControls; - controls.enabled = true; - - if(pointcloud){ - controls.target.copy(pointcloud.boundingSphere.center.clone().applyMatrix4(pointcloud.matrixWorld)); - } -} - -var PotreeRenderer = function(){ - - this.render = function(){ - {// resize - var width = elRenderArea.clientWidth; - var height = elRenderArea.clientHeight; - var aspect = width / height; - - camera.aspect = aspect; - camera.updateProjectionMatrix(); - renderer.setSize(width, height); - } - - - // render skybox - if(showSkybox){ - skybox.camera.rotation.copy(camera.rotation); - renderer.render(skybox.scene, skybox.camera); - }else{ - renderer.render(sceneBG, cameraBG); - } - - if(pointcloud){ - if(pointcloud.originalMaterial){ - pointcloud.material = pointcloud.originalMaterial; - } + // render scene + scope.renderer.render(scope.scene, scope.camera); + scope.renderer.render(scope.scenePointCloud, scope.camera); - var bbWorld = Potree.utils.computeTransformedBoundingBox(pointcloud.boundingBox, pointcloud.matrixWorld); + scope.profileTool.render(); + scope.volumeTool.render(); - pointcloud.visiblePointsTarget = pointCountTarget * 1000 * 1000; - pointcloud.material.size = pointSize; - pointcloud.material.opacity = opacity; - pointcloud.material.pointColorType = pointColorType; - pointcloud.material.pointSizeType = pointSizeType; - pointcloud.material.pointShape = (quality === "Circles") ? Potree.PointShape.CIRCLE : Potree.PointShape.SQUARE; - pointcloud.material.interpolate = (quality === "Interpolation"); - pointcloud.material.weighted = false; - } - - // render scene - renderer.render(scene, camera); - renderer.render(scenePointCloud, camera); - - profileTool.render(); - volumeTool.render(); - - renderer.clearDepth(); - measuringTool.render(); - transformationTool.render(); + scope.renderer.clearDepth(); + scope.measuringTool.render(); + scope.transformationTool.render(); + }; }; -}; -var potreeRenderer = new PotreeRenderer(); - -// high quality rendering using splats -var highQualityRenderer = null; -var HighQualityRenderer = function(){ - - var depthMaterial = null; - var attributeMaterial = null; - var normalizationMaterial = null; - - var rtDepth; - var rtNormalize; - - var initHQSPlats = function(){ - if(depthMaterial != null){ - return; - } - - depthMaterial = new Potree.PointCloudMaterial(); - attributeMaterial = new Potree.PointCloudMaterial(); - - depthMaterial.pointColorType = Potree.PointColorType.DEPTH; - depthMaterial.pointShape = Potree.PointShape.CIRCLE; - depthMaterial.interpolate = false; - depthMaterial.weighted = false; - depthMaterial.minSize = 2; - - attributeMaterial.pointShape = Potree.PointShape.CIRCLE; - attributeMaterial.interpolate = false; - attributeMaterial.weighted = true; - attributeMaterial.minSize = 2; + var potreeRenderer = new PotreeRenderer(); - rtDepth = new THREE.WebGLRenderTarget( 1024, 1024, { - minFilter: THREE.NearestFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat, - type: THREE.FloatType - } ); + // high quality rendering using splats + var highQualityRenderer = null; + var HighQualityRenderer = function(){ - rtNormalize = new THREE.WebGLRenderTarget( 1024, 1024, { - minFilter: THREE.LinearFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat, - type: THREE.FloatType - } ); - - var uniformsNormalize = { - depthMap: { type: "t", value: rtDepth }, - texture: { type: "t", value: rtNormalize } - }; + var depthMaterial = null; + var attributeMaterial = null; + var normalizationMaterial = null; - normalizationMaterial = new THREE.ShaderMaterial({ - uniforms: uniformsNormalize, - vertexShader: Potree.Shaders["normalize.vs"], - fragmentShader: Potree.Shaders["normalize.fs"] - }); - } - - var resize = function(width, height){ - if(rtDepth.width == width && rtDepth.height == height){ - return; - } + var rtDepth; + var rtNormalize; - rtDepth.dispose(); - rtNormalize.dispose(); + var initHQSPlats = function(){ + if(depthMaterial != null){ + return; + } - camera.aspect = width / height; - camera.updateProjectionMatrix(); + depthMaterial = new Potree.PointCloudMaterial(); + attributeMaterial = new Potree.PointCloudMaterial(); - renderer.setSize(width, height); - rtDepth.setSize(width, height); - rtNormalize.setSize(width, height); - }; + depthMaterial.pointColorType = Potree.PointColorType.DEPTH; + depthMaterial.pointShape = Potree.PointShape.CIRCLE; + depthMaterial.interpolate = false; + depthMaterial.weighted = false; + depthMaterial.minSize = 2; + + attributeMaterial.pointShape = Potree.PointShape.CIRCLE; + attributeMaterial.interpolate = false; + attributeMaterial.weighted = true; + attributeMaterial.minSize = 2; - // render with splats - this.render = function(renderer){ - - var width = elRenderArea.clientWidth; - var height = elRenderArea.clientHeight; - - initHQSPlats(); + rtDepth = new THREE.WebGLRenderTarget( 1024, 1024, { + minFilter: THREE.NearestFilter, + magFilter: THREE.NearestFilter, + format: THREE.RGBAFormat, + type: THREE.FloatType + } ); + + rtNormalize = new THREE.WebGLRenderTarget( 1024, 1024, { + minFilter: THREE.LinearFilter, + magFilter: THREE.NearestFilter, + format: THREE.RGBAFormat, + type: THREE.FloatType + } ); + + var uniformsNormalize = { + depthMap: { type: "t", value: rtDepth }, + texture: { type: "t", value: rtNormalize } + }; + + normalizationMaterial = new THREE.ShaderMaterial({ + uniforms: uniformsNormalize, + vertexShader: Potree.Shaders["normalize.vs"], + fragmentShader: Potree.Shaders["normalize.fs"] + }); + } - resize(width, height); + var resize = function(width, height){ + if(rtDepth.width == width && rtDepth.height == height){ + return; + } + + rtDepth.dispose(); + rtNormalize.dispose(); + + scope.camera.aspect = width / height; + scope.camera.updateProjectionMatrix(); + + scope.renderer.setSize(width, height); + rtDepth.setSize(width, height); + rtNormalize.setSize(width, height); + }; + + // render with splats + this.render = function(renderer){ + var width = renderArea.clientWidth; + var height = renderArea.clientHeight; - renderer.clear(); - if(showSkybox){ - skybox.camera.rotation.copy(camera.rotation); - renderer.render(skybox.scene, skybox.camera); - }else{ - renderer.render(sceneBG, cameraBG); - } - renderer.render(scene, camera); - - if(pointcloud){ - - depthMaterial.uniforms.octreeSize.value = pointcloud.pcoGeometry.boundingBox.size().x; - attributeMaterial.uniforms.octreeSize.value = pointcloud.pcoGeometry.boundingBox.size().x; - - pointcloud.visiblePointsTarget = pointCountTarget * 1000 * 1000; - var originalMaterial = pointcloud.material; - - {// DEPTH PASS - depthMaterial.size = pointSize; - depthMaterial.pointSizeType = pointSizeType; - depthMaterial.screenWidth = width; - depthMaterial.screenHeight = height; - depthMaterial.uniforms.visibleNodes.value = pointcloud.material.visibleNodesTexture; - depthMaterial.uniforms.octreeSize.value = pointcloud.pcoGeometry.boundingBox.size().x; - depthMaterial.fov = camera.fov * (Math.PI / 180); - depthMaterial.spacing = pointcloud.pcoGeometry.spacing; - depthMaterial.near = camera.near; - depthMaterial.far = camera.far; - depthMaterial.heightMin = heightMin; - depthMaterial.heightMax = heightMax; - depthMaterial.uniforms.visibleNodes.value = pointcloud.material.visibleNodesTexture; - depthMaterial.uniforms.octreeSize.value = pointcloud.pcoGeometry.boundingBox.size().x; - depthMaterial.bbSize = pointcloud.material.bbSize; - depthMaterial.treeType = pointcloud.material.treeType; - - scenePointCloud.overrideMaterial = depthMaterial; - renderer.clearTarget( rtDepth, true, true, true ); - renderer.render(scenePointCloud, camera, rtDepth); - scenePointCloud.overrideMaterial = null; - } + initHQSPlats(); - {// ATTRIBUTE PASS - attributeMaterial.size = pointSize; - attributeMaterial.pointSizeType = pointSizeType; - attributeMaterial.screenWidth = width; - attributeMaterial.screenHeight = height; - attributeMaterial.pointColorType = pointColorType; - attributeMaterial.depthMap = rtDepth; - attributeMaterial.uniforms.visibleNodes.value = pointcloud.material.visibleNodesTexture; - attributeMaterial.uniforms.octreeSize.value = pointcloud.pcoGeometry.boundingBox.size().x; - attributeMaterial.fov = camera.fov * (Math.PI / 180); - attributeMaterial.spacing = pointcloud.pcoGeometry.spacing; - attributeMaterial.near = camera.near; - attributeMaterial.far = camera.far; - attributeMaterial.heightMin = heightMin; - attributeMaterial.heightMax = heightMax; - attributeMaterial.intensityMin = pointcloud.material.intensityMin; - attributeMaterial.intensityMax = pointcloud.material.intensityMax; - attributeMaterial.setClipBoxes(pointcloud.material.clipBoxes); - attributeMaterial.clipMode = pointcloud.material.clipMode; - attributeMaterial.bbSize = pointcloud.material.bbSize; - attributeMaterial.treeType = pointcloud.material.treeType; - - scenePointCloud.overrideMaterial = attributeMaterial; - renderer.clearTarget( rtNormalize, true, true, true ); - renderer.render(scenePointCloud, camera, rtNormalize); - scenePointCloud.overrideMaterial = null; - } + resize(width, height); - {// NORMALIZATION PASS - normalizationMaterial.uniforms.depthMap.value = rtDepth; - normalizationMaterial.uniforms.texture.value = rtNormalize; - Potree.utils.screenPass.render(renderer, normalizationMaterial); + + scope.renderer.clear(); + if(showSkybox){ + skybox.camera.rotation.copy(scope.camera.rotation); + scope.renderer.render(skybox.scene, skybox.camera); + }else{ + scope.renderer.render(scope.sceneBG, scope.cameraBG); } + scope.renderer.render(scope.scene, scope.camera); - pointcloud.material = originalMaterial; - - volumeTool.render(); - renderer.clearDepth(); - profileTool.render(); - measuringTool.render(); - transformationTool.render(); - } + if(scope.pointcloud){ + + depthMaterial.uniforms.octreeSize.value = scope.pointcloud.pcoGeometry.boundingBox.size().x; + attributeMaterial.uniforms.octreeSize.value = scope.pointcloud.pcoGeometry.boundingBox.size().x; + + scope.pointcloud.visiblePointsTarget = scope.pointCountTarget * 1000 * 1000; + var originalMaterial = scope.pointcloud.material; + + {// DEPTH PASS + depthMaterial.size = scope.pointSize; + depthMaterial.pointSizeType = scope.pointSizeType; + depthMaterial.screenWidth = width; + depthMaterial.screenHeight = height; + depthMaterial.uniforms.visibleNodes.value = scope.pointcloud.material.visibleNodesTexture; + depthMaterial.uniforms.octreeSize.value = scope.pointcloud.pcoGeometry.boundingBox.size().x; + depthMaterial.fov = scope.camera.fov * (Math.PI / 180); + depthMaterial.spacing = scope.pointcloud.pcoGeometry.spacing; + depthMaterial.near = scope.camera.near; + depthMaterial.far = scope.camera.far; + depthMaterial.heightMin = heightMin; + depthMaterial.heightMax = heightMax; + depthMaterial.uniforms.visibleNodes.value = scope.pointcloud.material.visibleNodesTexture; + depthMaterial.uniforms.octreeSize.value = scope.pointcloud.pcoGeometry.boundingBox.size().x; + depthMaterial.bbSize = scope.pointcloud.material.bbSize; + depthMaterial.treeType = scope.pointcloud.material.treeType; + depthMaterial.uniforms.classificationLUT.value = scope.pointcloud.material.uniforms.classificationLUT.value; + + scope.scenePointCloud.overrideMaterial = depthMaterial; + scope.renderer.clearTarget( rtDepth, true, true, true ); + scope.renderer.render(scope.scenePointCloud, scope.camera, rtDepth); + scope.scenePointCloud.overrideMaterial = null; + } + + {// ATTRIBUTE PASS + attributeMaterial.size = scope.pointSize; + attributeMaterial.pointSizeType = scope.pointSizeType; + attributeMaterial.screenWidth = width; + attributeMaterial.screenHeight = height; + attributeMaterial.pointColorType = scope.pointColorType; + attributeMaterial.depthMap = rtDepth; + attributeMaterial.uniforms.visibleNodes.value = scope.pointcloud.material.visibleNodesTexture; + attributeMaterial.uniforms.octreeSize.value = scope.pointcloud.pcoGeometry.boundingBox.size().x; + attributeMaterial.fov = scope.camera.fov * (Math.PI / 180); + attributeMaterial.spacing = scope.pointcloud.pcoGeometry.spacing; + attributeMaterial.near = scope.camera.near; + attributeMaterial.far = scope.camera.far; + attributeMaterial.heightMin = heightMin; + attributeMaterial.heightMax = heightMax; + attributeMaterial.intensityMin = scope.pointcloud.material.intensityMin; + attributeMaterial.intensityMax = scope.pointcloud.material.intensityMax; + attributeMaterial.setClipBoxes(scope.pointcloud.material.clipBoxes); + attributeMaterial.clipMode = scope.pointcloud.material.clipMode; + attributeMaterial.bbSize = scope.pointcloud.material.bbSize; + attributeMaterial.treeType = scope.pointcloud.material.treeType; + attributeMaterial.uniforms.classificationLUT.value = scope.pointcloud.material.uniforms.classificationLUT.value; + + scope.scenePointCloud.overrideMaterial = attributeMaterial; + scope.renderer.clearTarget( rtNormalize, true, true, true ); + scope.renderer.render(scope.scenePointCloud, scope.camera, rtNormalize); + scope.scenePointCloud.overrideMaterial = null; + } + + {// NORMALIZATION PASS + normalizationMaterial.uniforms.depthMap.value = rtDepth; + normalizationMaterial.uniforms.texture.value = rtNormalize; + Potree.utils.screenPass.render(scope.renderer, normalizationMaterial); + } + + scope.pointcloud.material = originalMaterial; + + scope.volumeTool.render(); + scope.renderer.clearDepth(); + scope.profileTool.render(); + scope.measuringTool.render(); + scope.transformationTool.render(); + } - } -}; + } + }; -var edlRenderer = null; -var EDLRenderer = function(){ + var edlRenderer = null; + var EDLRenderer = function(){ - var edlMaterial = null; - var attributeMaterial = null; - - //var depthTexture = null; - - var rtColor = null; - var gl = renderer.context; - - var initEDL = function(){ - if(edlMaterial != null){ - return; - } + var edlMaterial = null; + var attributeMaterial = null; - //var depthTextureExt = gl.getExtension("WEBGL_depth_texture"); - - edlMaterial = new Potree.EyeDomeLightingMaterial(); - attributeMaterial = new Potree.PointCloudMaterial(); - - attributeMaterial.pointShape = Potree.PointShape.CIRCLE; - attributeMaterial.interpolate = false; - attributeMaterial.weighted = false; - attributeMaterial.minSize = 2; - attributeMaterial.useLogarithmicDepthBuffer = false; - attributeMaterial.useEDL = true; - - rtColor = new THREE.WebGLRenderTarget( 1024, 1024, { - minFilter: THREE.LinearFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat, - type: THREE.FloatType, - //type: THREE.UnsignedByteType, - //depthBuffer: false, - //stencilBuffer: false - } ); - - //depthTexture = new THREE.Texture(); - //depthTexture.__webglInit = true; - //depthTexture.__webglTexture = gl.createTexture();; - //gl.bindTexture(gl.TEXTURE_2D, depthTexture.__webglTexture); - //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - //gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, 1024, 1024, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null); - }; - - var resize = function(){ - var width = elRenderArea.clientWidth; - var height = elRenderArea.clientHeight; - var aspect = width / height; + //var depthTexture = null; - var needsResize = (rtColor.width != width || rtColor.height != height); - - // disposal will be unnecessary once this fix made it into three.js master: - // https://github.com/mrdoob/three.js/pull/6355 - if(needsResize){ - rtColor.dispose(); - } + var rtColor = null; + var gl = scope.renderer.context; - camera.aspect = aspect; - camera.updateProjectionMatrix(); - - renderer.setSize(width, height); - rtColor.setSize(width, height); - - //if(needsResize){ - // renderer.setRenderTarget(rtColor); - // var framebuffer = rtColor.__webglFramebuffer; - // gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); - // - // - // gl.bindRenderbuffer( gl.RENDERBUFFER, rtColor.__webglRenderbuffer ); - // gl.renderbufferStorage( gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, rtColor.width, rtColor.height ); - // gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null ); - // - // gl.bindTexture(gl.TEXTURE_2D, depthTexture.__webglTexture); - // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - // gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, width, height, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null); - // - // gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture.__webglTexture, 0); - // - // renderer.setRenderTarget(null); - //} - } + var initEDL = function(){ + if(edlMaterial != null){ + return; + } + + //var depthTextureExt = gl.getExtension("WEBGL_depth_texture"); + + edlMaterial = new Potree.EyeDomeLightingMaterial(); + attributeMaterial = new Potree.PointCloudMaterial(); + + attributeMaterial.pointShape = Potree.PointShape.CIRCLE; + attributeMaterial.interpolate = false; + attributeMaterial.weighted = false; + attributeMaterial.minSize = 2; + attributeMaterial.useLogarithmicDepthBuffer = false; + attributeMaterial.useEDL = true; - this.render = function(){ - - initEDL(); + rtColor = new THREE.WebGLRenderTarget( 1024, 1024, { + minFilter: THREE.LinearFilter, + magFilter: THREE.NearestFilter, + format: THREE.RGBAFormat, + type: THREE.FloatType, + //type: THREE.UnsignedByteType, + //depthBuffer: false, + //stencilBuffer: false + } ); + + }; - resize(); + var resize = function(){ + var width = renderArea.clientWidth; + var height = renderArea.clientHeight; + var aspect = width / height; + + var needsResize = (rtColor.width != width || rtColor.height != height); - renderer.clear(); - if(showSkybox){ - skybox.camera.rotation.copy(camera.rotation); - renderer.render(skybox.scene, skybox.camera); - }else{ - renderer.render(sceneBG, cameraBG); - } - renderer.render(scene, camera); - - if(pointcloud){ - var width = elRenderArea.clientWidth; - var height = elRenderArea.clientHeight; - - var octreeSize = pointcloud.pcoGeometry.boundingBox.size().x; - - pointcloud.visiblePointsTarget = pointCountTarget * 1000 * 1000; - var originalMaterial = pointcloud.material; - - {// COLOR & DEPTH PASS - attributeMaterial.size = pointSize; - attributeMaterial.pointSizeType = pointSizeType; - attributeMaterial.screenWidth = width; - attributeMaterial.screenHeight = height; - attributeMaterial.pointColorType = pointColorType; - attributeMaterial.uniforms.visibleNodes.value = pointcloud.material.visibleNodesTexture; - attributeMaterial.uniforms.octreeSize.value = octreeSize; - attributeMaterial.fov = camera.fov * (Math.PI / 180); - attributeMaterial.spacing = pointcloud.pcoGeometry.spacing; - attributeMaterial.near = camera.near; - attributeMaterial.far = camera.far; - attributeMaterial.heightMin = heightMin; - attributeMaterial.heightMax = heightMax; - attributeMaterial.intensityMin = pointcloud.material.intensityMin; - attributeMaterial.intensityMax = pointcloud.material.intensityMax; - attributeMaterial.setClipBoxes(pointcloud.material.clipBoxes); - attributeMaterial.clipMode = pointcloud.material.clipMode; - attributeMaterial.bbSize = pointcloud.material.bbSize; - attributeMaterial.treeType = pointcloud.material.treeType; - - scenePointCloud.overrideMaterial = attributeMaterial; - renderer.clearTarget( rtColor, true, true, true ); - renderer.render(scenePointCloud, camera, rtColor); - scenePointCloud.overrideMaterial = null; + // disposal will be unnecessary once this fix made it into three.js master: + // https://github.com/mrdoob/three.js/pull/6355 + if(needsResize){ + rtColor.dispose(); } - { // EDL OCCLUSION PASS - edlMaterial.uniforms.screenWidth.value = width; - edlMaterial.uniforms.screenHeight.value = height; - edlMaterial.uniforms.near.value = camera.near; - edlMaterial.uniforms.far.value = camera.far; - edlMaterial.uniforms.colorMap.value = rtColor; - edlMaterial.uniforms.expScale.value = camera.far; - - //edlMaterial.uniforms.depthMap.value = depthTexture; + scope.camera.aspect = aspect; + scope.camera.updateProjectionMatrix(); + + scope.renderer.setSize(width, height); + rtColor.setSize(width, height); + } + + this.render = function(){ + + initEDL(); - Potree.utils.screenPass.render(renderer, edlMaterial); - } + resize(); - renderer.render(scene, camera); + scope.renderer.clear(); + if(showSkybox){ + scope.camera.rotation.copy(scope.camera.rotation); + scope.renderer.render(skybox.scene, skybox.camera); + }else{ + scope.renderer.render(scope.sceneBG, scope.cameraBG); + } + scope.renderer.render(scope.scene, scope.camera); - profileTool.render(); - volumeTool.render(); - renderer.clearDepth(); - measuringTool.render(); - transformationTool.render(); - } + if(scope.pointcloud){ + var width = renderArea.clientWidth; + var height = renderArea.clientHeight; + + var octreeSize = scope.pointcloud.pcoGeometry.boundingBox.size().x; + + scope.pointcloud.visiblePointsTarget = scope.pointCountTarget * 1000 * 1000; + var originalMaterial = scope.pointcloud.material; + + {// COLOR & DEPTH PASS + attributeMaterial = scope.pointcloud.material; + attributeMaterial.pointShape = Potree.PointShape.CIRCLE; + attributeMaterial.interpolate = false; + attributeMaterial.weighted = false; + attributeMaterial.minSize = 2; + attributeMaterial.useLogarithmicDepthBuffer = false; + attributeMaterial.useEDL = true; + + attributeMaterial.size = scope.pointSize; + attributeMaterial.pointSizeType = scope.pointSizeType; + attributeMaterial.screenWidth = width; + attributeMaterial.screenHeight = height; + attributeMaterial.pointColorType = scope.pointColorType; + attributeMaterial.uniforms.visibleNodes.value = scope.pointcloud.material.visibleNodesTexture; + attributeMaterial.uniforms.octreeSize.value = octreeSize; + attributeMaterial.fov = scope.camera.fov * (Math.PI / 180); + attributeMaterial.spacing = scope.pointcloud.pcoGeometry.spacing; + attributeMaterial.near = scope.camera.near; + attributeMaterial.far = scope.camera.far; + attributeMaterial.heightMin = heightMin; + attributeMaterial.heightMax = heightMax; + attributeMaterial.intensityMin = scope.pointcloud.material.intensityMin; + attributeMaterial.intensityMax = scope.pointcloud.material.intensityMax; + attributeMaterial.setClipBoxes(scope.pointcloud.material.clipBoxes); + attributeMaterial.clipMode = scope.pointcloud.material.clipMode; + attributeMaterial.bbSize = scope.pointcloud.material.bbSize; + attributeMaterial.treeType = scope.pointcloud.material.treeType; + attributeMaterial.uniforms.classificationLUT.value = scope.pointcloud.material.uniforms.classificationLUT.value; + + scope.pointcloud.material = attributeMaterial; + for(var i = 0; i < scope.pointcloud.visibleNodes.length; i++){ + var node = scope.pointcloud.visibleNodes[i]; + node.sceneNode.material = attributeMaterial; + } + + scope.renderer.clearTarget( rtColor, true, true, true ); + scope.renderer.render(scope.scenePointCloud, scope.camera, rtColor); + + + scope.pointcloud.material = originalMaterial; + for(var i = 0; i < scope.pointcloud.visibleNodes.length; i++){ + var node = scope.pointcloud.visibleNodes[i]; + node.sceneNode.material = originalMaterial; + } + } + + // bit of a hack here. The EDL pass will mess up the text of the volume tool + // so volume tool is rendered again afterwards + scope.volumeTool.render(rtColor); + + { // EDL OCCLUSION PASS + edlMaterial.uniforms.screenWidth.value = width; + edlMaterial.uniforms.screenHeight.value = height; + edlMaterial.uniforms.near.value = scope.camera.near; + edlMaterial.uniforms.far.value = scope.camera.far; + edlMaterial.uniforms.colorMap.value = rtColor; + edlMaterial.uniforms.expScale.value = scope.camera.far; + edlMaterial.uniforms.edlScale.value = scope.edlScale; + edlMaterial.uniforms.radius.value = scope.edlRadius; + edlMaterial.uniforms.opacity.value = scope.opacity; + edlMaterial.depthTest = true; + edlMaterial.depthWrite = true; + edlMaterial.transparent = true; + + Potree.utils.screenPass.render(scope.renderer, edlMaterial); + } + + scope.renderer.render(scope.scene, scope.camera); + + scope.profileTool.render(); + scope.volumeTool.render(); + scope.renderer.clearDepth(); + scope.measuringTool.render(); + scope.transformationTool.render(); + } - } -}; + } + }; -//var toggleMessage = 0; + //var toggleMessage = 0; -function loop() { - requestAnimationFrame(loop); - - //var start = new Date().getTime(); - update(); - //var end = new Date().getTime(); - //var duration = end - start; - //toggleMessage++; - //if(toggleMessage > 30){ - // document.getElementById("lblMessage").innerHTML = "update: " + duration + "ms"; - // toggleMessage = 0; - //} - - if(sceneProperties.useEDL){ - if(!edlRenderer){ - edlRenderer = new EDLRenderer(); - } - edlRenderer.render(renderer); - }else if(quality === "Splats"){ - if(!highQualityRenderer){ - highQualityRenderer = new HighQualityRenderer(); + function loop(timestamp) { + requestAnimationFrame(loop); + + //var start = new Date().getTime(); + scope.update(clock.getDelta(), timestamp); + //var end = new Date().getTime(); + //var duration = end - start; + //toggleMessage++; + //if(toggleMessage > 30){ + // document.getElementById("lblMessage").innerHTML = "update: " + duration + "ms"; + // toggleMessage = 0; + //} + + if(scope.useEDL){ + if(!edlRenderer){ + edlRenderer = new EDLRenderer(); + } + edlRenderer.render(scope.renderer); + }else if(scope.quality === "Splats"){ + if(!highQualityRenderer){ + highQualityRenderer = new HighQualityRenderer(); + } + highQualityRenderer.render(scope.renderer); + }else{ + potreeRenderer.render(); } - highQualityRenderer.render(renderer); - }else{ - potreeRenderer.render(); - } -}; + }; + scope.initThree(); + requestAnimationFrame(loop); +}; -initThree(); -loop(); \ No newline at end of file +Potree.Viewer.prototype = Object.create( THREE.EventDispatcher.prototype ); \ No newline at end of file diff --git a/PotreeConverter/resources/page_template/examples/viewer_template.html b/PotreeConverter/resources/page_template/examples/viewer_template.html index 1c24ae3e..5e9b6508 100644 --- a/PotreeConverter/resources/page_template/examples/viewer_template.html +++ b/PotreeConverter/resources/page_template/examples/viewer_template.html @@ -11,69 +11,50 @@ + + - - - - - - - -
-
-
- - -
- - - - - - - - - - - +
+ + +
-
+ + viewer = new Potree.Viewer(document.getElementById("renderArea"), sceneProperties, { + "onPointCloudLoaded": onPointCloudLoaded + }); + + + + + + + + + + + + + + + diff --git a/PotreeConverter/resources/page_template/libs/plasio/vendor/three.js b/PotreeConverter/resources/page_template/libs/plasio/vendor/three.js deleted file mode 100644 index 80a5354a..00000000 --- a/PotreeConverter/resources/page_template/libs/plasio/vendor/three.js +++ /dev/null @@ -1,37760 +0,0 @@ -/** - * @author mrdoob / http://mrdoob.com/ - * @author Larry Battle / http://bateru.com/news - * @author bhouston / http://exocortex.com - */ - -var THREE = { REVISION: '66' }; - -self.console = self.console || { - - info: function () {}, - log: function () {}, - debug: function () {}, - warn: function () {}, - error: function () {} - -}; - -// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ -// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating - -// requestAnimationFrame polyfill by Erik Möller -// fixes from Paul Irish and Tino Zijdel -// using 'self' instead of 'window' for compatibility with both NodeJS and IE10. -( function () { - - var lastTime = 0; - var vendors = [ 'ms', 'moz', 'webkit', 'o' ]; - - for ( var x = 0; x < vendors.length && !self.requestAnimationFrame; ++ x ) { - - self.requestAnimationFrame = self[ vendors[ x ] + 'RequestAnimationFrame' ]; - self.cancelAnimationFrame = self[ vendors[ x ] + 'CancelAnimationFrame' ] || self[ vendors[ x ] + 'CancelRequestAnimationFrame' ]; - - } - - if ( self.requestAnimationFrame === undefined && self['setTimeout'] !== undefined ) { - - self.requestAnimationFrame = function ( callback ) { - - var currTime = Date.now(), timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) ); - var id = self.setTimeout( function() { callback( currTime + timeToCall ); }, timeToCall ); - lastTime = currTime + timeToCall; - return id; - - }; - - } - - if( self.cancelAnimationFrame === undefined && self['clearTimeout'] !== undefined ) { - - self.cancelAnimationFrame = function ( id ) { self.clearTimeout( id ) }; - - } - -}() ); - -// GL STATE CONSTANTS - -THREE.CullFaceNone = 0; -THREE.CullFaceBack = 1; -THREE.CullFaceFront = 2; -THREE.CullFaceFrontBack = 3; - -THREE.FrontFaceDirectionCW = 0; -THREE.FrontFaceDirectionCCW = 1; - -// SHADOWING TYPES - -THREE.BasicShadowMap = 0; -THREE.PCFShadowMap = 1; -THREE.PCFSoftShadowMap = 2; - -// MATERIAL CONSTANTS - -// side - -THREE.FrontSide = 0; -THREE.BackSide = 1; -THREE.DoubleSide = 2; - -// shading - -THREE.NoShading = 0; -THREE.FlatShading = 1; -THREE.SmoothShading = 2; - -// colors - -THREE.NoColors = 0; -THREE.FaceColors = 1; -THREE.VertexColors = 2; - -// blending modes - -THREE.NoBlending = 0; -THREE.NormalBlending = 1; -THREE.AdditiveBlending = 2; -THREE.SubtractiveBlending = 3; -THREE.MultiplyBlending = 4; -THREE.CustomBlending = 5; - -// custom blending equations -// (numbers start from 100 not to clash with other -// mappings to OpenGL constants defined in Texture.js) - -THREE.AddEquation = 100; -THREE.SubtractEquation = 101; -THREE.ReverseSubtractEquation = 102; - -// custom blending destination factors - -THREE.ZeroFactor = 200; -THREE.OneFactor = 201; -THREE.SrcColorFactor = 202; -THREE.OneMinusSrcColorFactor = 203; -THREE.SrcAlphaFactor = 204; -THREE.OneMinusSrcAlphaFactor = 205; -THREE.DstAlphaFactor = 206; -THREE.OneMinusDstAlphaFactor = 207; - -// custom blending source factors - -//THREE.ZeroFactor = 200; -//THREE.OneFactor = 201; -//THREE.SrcAlphaFactor = 204; -//THREE.OneMinusSrcAlphaFactor = 205; -//THREE.DstAlphaFactor = 206; -//THREE.OneMinusDstAlphaFactor = 207; -THREE.DstColorFactor = 208; -THREE.OneMinusDstColorFactor = 209; -THREE.SrcAlphaSaturateFactor = 210; - - -// TEXTURE CONSTANTS - -THREE.MultiplyOperation = 0; -THREE.MixOperation = 1; -THREE.AddOperation = 2; - -// Mapping modes - -THREE.UVMapping = function () {}; - -THREE.CubeReflectionMapping = function () {}; -THREE.CubeRefractionMapping = function () {}; - -THREE.SphericalReflectionMapping = function () {}; -THREE.SphericalRefractionMapping = function () {}; - -// Wrapping modes - -THREE.RepeatWrapping = 1000; -THREE.ClampToEdgeWrapping = 1001; -THREE.MirroredRepeatWrapping = 1002; - -// Filters - -THREE.NearestFilter = 1003; -THREE.NearestMipMapNearestFilter = 1004; -THREE.NearestMipMapLinearFilter = 1005; -THREE.LinearFilter = 1006; -THREE.LinearMipMapNearestFilter = 1007; -THREE.LinearMipMapLinearFilter = 1008; - -// Data types - -THREE.UnsignedByteType = 1009; -THREE.ByteType = 1010; -THREE.ShortType = 1011; -THREE.UnsignedShortType = 1012; -THREE.IntType = 1013; -THREE.UnsignedIntType = 1014; -THREE.FloatType = 1015; - -// Pixel types - -//THREE.UnsignedByteType = 1009; -THREE.UnsignedShort4444Type = 1016; -THREE.UnsignedShort5551Type = 1017; -THREE.UnsignedShort565Type = 1018; - -// Pixel formats - -THREE.AlphaFormat = 1019; -THREE.RGBFormat = 1020; -THREE.RGBAFormat = 1021; -THREE.LuminanceFormat = 1022; -THREE.LuminanceAlphaFormat = 1023; - -// Compressed texture formats - -THREE.RGB_S3TC_DXT1_Format = 2001; -THREE.RGBA_S3TC_DXT1_Format = 2002; -THREE.RGBA_S3TC_DXT3_Format = 2003; -THREE.RGBA_S3TC_DXT5_Format = 2004; - -/* -// Potential future PVRTC compressed texture formats -THREE.RGB_PVRTC_4BPPV1_Format = 2100; -THREE.RGB_PVRTC_2BPPV1_Format = 2101; -THREE.RGBA_PVRTC_4BPPV1_Format = 2102; -THREE.RGBA_PVRTC_2BPPV1_Format = 2103; -*/ - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Color = function ( color ) { - - if ( arguments.length === 3 ) { - - return this.setRGB( arguments[ 0 ], arguments[ 1 ], arguments[ 2 ] ); - - } - - return this.set( color ) - -}; - -THREE.Color.prototype = { - - constructor: THREE.Color, - - r: 1, g: 1, b: 1, - - set: function ( value ) { - - if ( value instanceof THREE.Color ) { - - this.copy( value ); - - } else if ( typeof value === 'number' ) { - - this.setHex( value ); - - } else if ( typeof value === 'string' ) { - - this.setStyle( value ); - - } - - return this; - - }, - - setHex: function ( hex ) { - - hex = Math.floor( hex ); - - this.r = ( hex >> 16 & 255 ) / 255; - this.g = ( hex >> 8 & 255 ) / 255; - this.b = ( hex & 255 ) / 255; - - return this; - - }, - - setRGB: function ( r, g, b ) { - - this.r = r; - this.g = g; - this.b = b; - - return this; - - }, - - setHSL: function ( h, s, l ) { - - // h,s,l ranges are in 0.0 - 1.0 - - if ( s === 0 ) { - - this.r = this.g = this.b = l; - - } else { - - var hue2rgb = function ( p, q, t ) { - - if ( t < 0 ) t += 1; - if ( t > 1 ) t -= 1; - if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; - if ( t < 1 / 2 ) return q; - if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); - return p; - - }; - - var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); - var q = ( 2 * l ) - p; - - this.r = hue2rgb( q, p, h + 1 / 3 ); - this.g = hue2rgb( q, p, h ); - this.b = hue2rgb( q, p, h - 1 / 3 ); - - } - - return this; - - }, - - setStyle: function ( style ) { - - // rgb(255,0,0) - - if ( /^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.test( style ) ) { - - var color = /^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.exec( style ); - - this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; - this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; - this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; - - return this; - - } - - // rgb(100%,0%,0%) - - if ( /^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.test( style ) ) { - - var color = /^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.exec( style ); - - this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; - this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; - this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; - - return this; - - } - - // #ff0000 - - if ( /^\#([0-9a-f]{6})$/i.test( style ) ) { - - var color = /^\#([0-9a-f]{6})$/i.exec( style ); - - this.setHex( parseInt( color[ 1 ], 16 ) ); - - return this; - - } - - // #f00 - - if ( /^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test( style ) ) { - - var color = /^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec( style ); - - this.setHex( parseInt( color[ 1 ] + color[ 1 ] + color[ 2 ] + color[ 2 ] + color[ 3 ] + color[ 3 ], 16 ) ); - - return this; - - } - - // red - - if ( /^(\w+)$/i.test( style ) ) { - - this.setHex( THREE.ColorKeywords[ style ] ); - - return this; - - } - - - }, - - copy: function ( color ) { - - this.r = color.r; - this.g = color.g; - this.b = color.b; - - return this; - - }, - - copyGammaToLinear: function ( color ) { - - this.r = color.r * color.r; - this.g = color.g * color.g; - this.b = color.b * color.b; - - return this; - - }, - - copyLinearToGamma: function ( color ) { - - this.r = Math.sqrt( color.r ); - this.g = Math.sqrt( color.g ); - this.b = Math.sqrt( color.b ); - - return this; - - }, - - convertGammaToLinear: function () { - - var r = this.r, g = this.g, b = this.b; - - this.r = r * r; - this.g = g * g; - this.b = b * b; - - return this; - - }, - - convertLinearToGamma: function () { - - this.r = Math.sqrt( this.r ); - this.g = Math.sqrt( this.g ); - this.b = Math.sqrt( this.b ); - - return this; - - }, - - getHex: function () { - - return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; - - }, - - getHexString: function () { - - return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); - - }, - - getHSL: function ( optionalTarget ) { - - // h,s,l ranges are in 0.0 - 1.0 - - var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; - - var r = this.r, g = this.g, b = this.b; - - var max = Math.max( r, g, b ); - var min = Math.min( r, g, b ); - - var hue, saturation; - var lightness = ( min + max ) / 2.0; - - if ( min === max ) { - - hue = 0; - saturation = 0; - - } else { - - var delta = max - min; - - saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); - - switch ( max ) { - - case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; - case g: hue = ( b - r ) / delta + 2; break; - case b: hue = ( r - g ) / delta + 4; break; - - } - - hue /= 6; - - } - - hsl.h = hue; - hsl.s = saturation; - hsl.l = lightness; - - return hsl; - - }, - - getStyle: function () { - - return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; - - }, - - offsetHSL: function ( h, s, l ) { - - var hsl = this.getHSL(); - - hsl.h += h; hsl.s += s; hsl.l += l; - - this.setHSL( hsl.h, hsl.s, hsl.l ); - - return this; - - }, - - add: function ( color ) { - - this.r += color.r; - this.g += color.g; - this.b += color.b; - - return this; - - }, - - addColors: function ( color1, color2 ) { - - this.r = color1.r + color2.r; - this.g = color1.g + color2.g; - this.b = color1.b + color2.b; - - return this; - - }, - - addScalar: function ( s ) { - - this.r += s; - this.g += s; - this.b += s; - - return this; - - }, - - multiply: function ( color ) { - - this.r *= color.r; - this.g *= color.g; - this.b *= color.b; - - return this; - - }, - - multiplyScalar: function ( s ) { - - this.r *= s; - this.g *= s; - this.b *= s; - - return this; - - }, - - lerp: function ( color, alpha ) { - - this.r += ( color.r - this.r ) * alpha; - this.g += ( color.g - this.g ) * alpha; - this.b += ( color.b - this.b ) * alpha; - - return this; - - }, - - equals: function ( c ) { - - return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); - - }, - - fromArray: function ( array ) { - - this.r = array[ 0 ]; - this.g = array[ 1 ]; - this.b = array[ 2 ]; - - return this; - - }, - - toArray: function () { - - return [ this.r, this.g, this.b ]; - - }, - - clone: function () { - - return new THREE.Color().setRGB( this.r, this.g, this.b ); - - } - -}; - -THREE.ColorKeywords = { "aliceblue": 0xF0F8FF, "antiquewhite": 0xFAEBD7, "aqua": 0x00FFFF, "aquamarine": 0x7FFFD4, "azure": 0xF0FFFF, -"beige": 0xF5F5DC, "bisque": 0xFFE4C4, "black": 0x000000, "blanchedalmond": 0xFFEBCD, "blue": 0x0000FF, "blueviolet": 0x8A2BE2, -"brown": 0xA52A2A, "burlywood": 0xDEB887, "cadetblue": 0x5F9EA0, "chartreuse": 0x7FFF00, "chocolate": 0xD2691E, "coral": 0xFF7F50, -"cornflowerblue": 0x6495ED, "cornsilk": 0xFFF8DC, "crimson": 0xDC143C, "cyan": 0x00FFFF, "darkblue": 0x00008B, "darkcyan": 0x008B8B, -"darkgoldenrod": 0xB8860B, "darkgray": 0xA9A9A9, "darkgreen": 0x006400, "darkgrey": 0xA9A9A9, "darkkhaki": 0xBDB76B, "darkmagenta": 0x8B008B, -"darkolivegreen": 0x556B2F, "darkorange": 0xFF8C00, "darkorchid": 0x9932CC, "darkred": 0x8B0000, "darksalmon": 0xE9967A, "darkseagreen": 0x8FBC8F, -"darkslateblue": 0x483D8B, "darkslategray": 0x2F4F4F, "darkslategrey": 0x2F4F4F, "darkturquoise": 0x00CED1, "darkviolet": 0x9400D3, -"deeppink": 0xFF1493, "deepskyblue": 0x00BFFF, "dimgray": 0x696969, "dimgrey": 0x696969, "dodgerblue": 0x1E90FF, "firebrick": 0xB22222, -"floralwhite": 0xFFFAF0, "forestgreen": 0x228B22, "fuchsia": 0xFF00FF, "gainsboro": 0xDCDCDC, "ghostwhite": 0xF8F8FF, "gold": 0xFFD700, -"goldenrod": 0xDAA520, "gray": 0x808080, "green": 0x008000, "greenyellow": 0xADFF2F, "grey": 0x808080, "honeydew": 0xF0FFF0, "hotpink": 0xFF69B4, -"indianred": 0xCD5C5C, "indigo": 0x4B0082, "ivory": 0xFFFFF0, "khaki": 0xF0E68C, "lavender": 0xE6E6FA, "lavenderblush": 0xFFF0F5, "lawngreen": 0x7CFC00, -"lemonchiffon": 0xFFFACD, "lightblue": 0xADD8E6, "lightcoral": 0xF08080, "lightcyan": 0xE0FFFF, "lightgoldenrodyellow": 0xFAFAD2, "lightgray": 0xD3D3D3, -"lightgreen": 0x90EE90, "lightgrey": 0xD3D3D3, "lightpink": 0xFFB6C1, "lightsalmon": 0xFFA07A, "lightseagreen": 0x20B2AA, "lightskyblue": 0x87CEFA, -"lightslategray": 0x778899, "lightslategrey": 0x778899, "lightsteelblue": 0xB0C4DE, "lightyellow": 0xFFFFE0, "lime": 0x00FF00, "limegreen": 0x32CD32, -"linen": 0xFAF0E6, "magenta": 0xFF00FF, "maroon": 0x800000, "mediumaquamarine": 0x66CDAA, "mediumblue": 0x0000CD, "mediumorchid": 0xBA55D3, -"mediumpurple": 0x9370DB, "mediumseagreen": 0x3CB371, "mediumslateblue": 0x7B68EE, "mediumspringgreen": 0x00FA9A, "mediumturquoise": 0x48D1CC, -"mediumvioletred": 0xC71585, "midnightblue": 0x191970, "mintcream": 0xF5FFFA, "mistyrose": 0xFFE4E1, "moccasin": 0xFFE4B5, "navajowhite": 0xFFDEAD, -"navy": 0x000080, "oldlace": 0xFDF5E6, "olive": 0x808000, "olivedrab": 0x6B8E23, "orange": 0xFFA500, "orangered": 0xFF4500, "orchid": 0xDA70D6, -"palegoldenrod": 0xEEE8AA, "palegreen": 0x98FB98, "paleturquoise": 0xAFEEEE, "palevioletred": 0xDB7093, "papayawhip": 0xFFEFD5, "peachpuff": 0xFFDAB9, -"peru": 0xCD853F, "pink": 0xFFC0CB, "plum": 0xDDA0DD, "powderblue": 0xB0E0E6, "purple": 0x800080, "red": 0xFF0000, "rosybrown": 0xBC8F8F, -"royalblue": 0x4169E1, "saddlebrown": 0x8B4513, "salmon": 0xFA8072, "sandybrown": 0xF4A460, "seagreen": 0x2E8B57, "seashell": 0xFFF5EE, -"sienna": 0xA0522D, "silver": 0xC0C0C0, "skyblue": 0x87CEEB, "slateblue": 0x6A5ACD, "slategray": 0x708090, "slategrey": 0x708090, "snow": 0xFFFAFA, -"springgreen": 0x00FF7F, "steelblue": 0x4682B4, "tan": 0xD2B48C, "teal": 0x008080, "thistle": 0xD8BFD8, "tomato": 0xFF6347, "turquoise": 0x40E0D0, -"violet": 0xEE82EE, "wheat": 0xF5DEB3, "white": 0xFFFFFF, "whitesmoke": 0xF5F5F5, "yellow": 0xFFFF00, "yellowgreen": 0x9ACD32 }; - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author bhouston / http://exocortex.com - */ - -THREE.Quaternion = function ( x, y, z, w ) { - - this._x = x || 0; - this._y = y || 0; - this._z = z || 0; - this._w = ( w !== undefined ) ? w : 1; - -}; - -THREE.Quaternion.prototype = { - - constructor: THREE.Quaternion, - - _x: 0,_y: 0, _z: 0, _w: 0, - - _euler: undefined, - - _updateEuler: function ( callback ) { - - if ( this._euler !== undefined ) { - - this._euler.setFromQuaternion( this, undefined, false ); - - } - - }, - - get x () { - - return this._x; - - }, - - set x ( value ) { - - this._x = value; - this._updateEuler(); - - }, - - get y () { - - return this._y; - - }, - - set y ( value ) { - - this._y = value; - this._updateEuler(); - - }, - - get z () { - - return this._z; - - }, - - set z ( value ) { - - this._z = value; - this._updateEuler(); - - }, - - get w () { - - return this._w; - - }, - - set w ( value ) { - - this._w = value; - this._updateEuler(); - - }, - - set: function ( x, y, z, w ) { - - this._x = x; - this._y = y; - this._z = z; - this._w = w; - - this._updateEuler(); - - return this; - - }, - - copy: function ( quaternion ) { - - this._x = quaternion._x; - this._y = quaternion._y; - this._z = quaternion._z; - this._w = quaternion._w; - - this._updateEuler(); - - return this; - - }, - - setFromEuler: function ( euler, update ) { - - if ( euler instanceof THREE.Euler === false ) { - - throw new Error( 'ERROR: Quaternion\'s .setFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.' ); - } - - // http://www.mathworks.com/matlabcentral/fileexchange/ - // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ - // content/SpinCalc.m - - var c1 = Math.cos( euler._x / 2 ); - var c2 = Math.cos( euler._y / 2 ); - var c3 = Math.cos( euler._z / 2 ); - var s1 = Math.sin( euler._x / 2 ); - var s2 = Math.sin( euler._y / 2 ); - var s3 = Math.sin( euler._z / 2 ); - - if ( euler.order === 'XYZ' ) { - - this._x = s1 * c2 * c3 + c1 * s2 * s3; - this._y = c1 * s2 * c3 - s1 * c2 * s3; - this._z = c1 * c2 * s3 + s1 * s2 * c3; - this._w = c1 * c2 * c3 - s1 * s2 * s3; - - } else if ( euler.order === 'YXZ' ) { - - this._x = s1 * c2 * c3 + c1 * s2 * s3; - this._y = c1 * s2 * c3 - s1 * c2 * s3; - this._z = c1 * c2 * s3 - s1 * s2 * c3; - this._w = c1 * c2 * c3 + s1 * s2 * s3; - - } else if ( euler.order === 'ZXY' ) { - - this._x = s1 * c2 * c3 - c1 * s2 * s3; - this._y = c1 * s2 * c3 + s1 * c2 * s3; - this._z = c1 * c2 * s3 + s1 * s2 * c3; - this._w = c1 * c2 * c3 - s1 * s2 * s3; - - } else if ( euler.order === 'ZYX' ) { - - this._x = s1 * c2 * c3 - c1 * s2 * s3; - this._y = c1 * s2 * c3 + s1 * c2 * s3; - this._z = c1 * c2 * s3 - s1 * s2 * c3; - this._w = c1 * c2 * c3 + s1 * s2 * s3; - - } else if ( euler.order === 'YZX' ) { - - this._x = s1 * c2 * c3 + c1 * s2 * s3; - this._y = c1 * s2 * c3 + s1 * c2 * s3; - this._z = c1 * c2 * s3 - s1 * s2 * c3; - this._w = c1 * c2 * c3 - s1 * s2 * s3; - - } else if ( euler.order === 'XZY' ) { - - this._x = s1 * c2 * c3 - c1 * s2 * s3; - this._y = c1 * s2 * c3 - s1 * c2 * s3; - this._z = c1 * c2 * s3 + s1 * s2 * c3; - this._w = c1 * c2 * c3 + s1 * s2 * s3; - - } - - if ( update !== false ) this._updateEuler(); - - return this; - - }, - - setFromAxisAngle: function ( axis, angle ) { - - // from http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm - // axis have to be normalized - - var halfAngle = angle / 2, s = Math.sin( halfAngle ); - - this._x = axis.x * s; - this._y = axis.y * s; - this._z = axis.z * s; - this._w = Math.cos( halfAngle ); - - this._updateEuler(); - - return this; - - }, - - setFromRotationMatrix: function ( m ) { - - // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm - - // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) - - var te = m.elements, - - m11 = te[0], m12 = te[4], m13 = te[8], - m21 = te[1], m22 = te[5], m23 = te[9], - m31 = te[2], m32 = te[6], m33 = te[10], - - trace = m11 + m22 + m33, - s; - - if ( trace > 0 ) { - - s = 0.5 / Math.sqrt( trace + 1.0 ); - - this._w = 0.25 / s; - this._x = ( m32 - m23 ) * s; - this._y = ( m13 - m31 ) * s; - this._z = ( m21 - m12 ) * s; - - } else if ( m11 > m22 && m11 > m33 ) { - - s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); - - this._w = (m32 - m23 ) / s; - this._x = 0.25 * s; - this._y = (m12 + m21 ) / s; - this._z = (m13 + m31 ) / s; - - } else if ( m22 > m33 ) { - - s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); - - this._w = (m13 - m31 ) / s; - this._x = (m12 + m21 ) / s; - this._y = 0.25 * s; - this._z = (m23 + m32 ) / s; - - } else { - - s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); - - this._w = ( m21 - m12 ) / s; - this._x = ( m13 + m31 ) / s; - this._y = ( m23 + m32 ) / s; - this._z = 0.25 * s; - - } - - this._updateEuler(); - - return this; - - }, - - inverse: function () { - - this.conjugate().normalize(); - - return this; - - }, - - conjugate: function () { - - this._x *= -1; - this._y *= -1; - this._z *= -1; - - this._updateEuler(); - - return this; - - }, - - lengthSq: function () { - - return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; - - }, - - length: function () { - - return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); - - }, - - normalize: function () { - - var l = this.length(); - - if ( l === 0 ) { - - this._x = 0; - this._y = 0; - this._z = 0; - this._w = 1; - - } else { - - l = 1 / l; - - this._x = this._x * l; - this._y = this._y * l; - this._z = this._z * l; - this._w = this._w * l; - - } - - return this; - - }, - - multiply: function ( q, p ) { - - if ( p !== undefined ) { - - console.warn( 'DEPRECATED: Quaternion\'s .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); - return this.multiplyQuaternions( q, p ); - - } - - return this.multiplyQuaternions( this, q ); - - }, - - multiplyQuaternions: function ( a, b ) { - - // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm - - var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; - var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; - - this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; - this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; - this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; - this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; - - this._updateEuler(); - - return this; - - }, - - multiplyVector3: function ( vector ) { - - console.warn( 'DEPRECATED: Quaternion\'s .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); - return vector.applyQuaternion( this ); - - }, - - slerp: function ( qb, t ) { - - var x = this._x, y = this._y, z = this._z, w = this._w; - - // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ - - var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; - - if ( cosHalfTheta < 0 ) { - - this._w = -qb._w; - this._x = -qb._x; - this._y = -qb._y; - this._z = -qb._z; - - cosHalfTheta = -cosHalfTheta; - - } else { - - this.copy( qb ); - - } - - if ( cosHalfTheta >= 1.0 ) { - - this._w = w; - this._x = x; - this._y = y; - this._z = z; - - return this; - - } - - var halfTheta = Math.acos( cosHalfTheta ); - var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); - - if ( Math.abs( sinHalfTheta ) < 0.001 ) { - - this._w = 0.5 * ( w + this._w ); - this._x = 0.5 * ( x + this._x ); - this._y = 0.5 * ( y + this._y ); - this._z = 0.5 * ( z + this._z ); - - return this; - - } - - var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, - ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; - - this._w = ( w * ratioA + this._w * ratioB ); - this._x = ( x * ratioA + this._x * ratioB ); - this._y = ( y * ratioA + this._y * ratioB ); - this._z = ( z * ratioA + this._z * ratioB ); - - this._updateEuler(); - - return this; - - }, - - equals: function ( quaternion ) { - - return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); - - }, - - fromArray: function ( array ) { - - this._x = array[ 0 ]; - this._y = array[ 1 ]; - this._z = array[ 2 ]; - this._w = array[ 3 ]; - - this._updateEuler(); - - return this; - - }, - - toArray: function () { - - return [ this._x, this._y, this._z, this._w ]; - - }, - - clone: function () { - - return new THREE.Quaternion( this._x, this._y, this._z, this._w ); - - } - -}; - -THREE.Quaternion.slerp = function ( qa, qb, qm, t ) { - - return qm.copy( qa ).slerp( qb, t ); - -} - -/** - * @author mrdoob / http://mrdoob.com/ - * @author philogb / http://blog.thejit.org/ - * @author egraether / http://egraether.com/ - * @author zz85 / http://www.lab4games.net/zz85/blog - */ - -THREE.Vector2 = function ( x, y ) { - - this.x = x || 0; - this.y = y || 0; - -}; - -THREE.Vector2.prototype = { - - constructor: THREE.Vector2, - - set: function ( x, y ) { - - this.x = x; - this.y = y; - - return this; - - }, - - setX: function ( x ) { - - this.x = x; - - return this; - - }, - - setY: function ( y ) { - - this.y = y; - - return this; - - }, - - - setComponent: function ( index, value ) { - - switch ( index ) { - - case 0: this.x = value; break; - case 1: this.y = value; break; - default: throw new Error( "index is out of range: " + index ); - - } - - }, - - getComponent: function ( index ) { - - switch ( index ) { - - case 0: return this.x; - case 1: return this.y; - default: throw new Error( "index is out of range: " + index ); - - } - - }, - - copy: function ( v ) { - - this.x = v.x; - this.y = v.y; - - return this; - - }, - - add: function ( v, w ) { - - if ( w !== undefined ) { - - console.warn( 'DEPRECATED: Vector2\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); - return this.addVectors( v, w ); - - } - - this.x += v.x; - this.y += v.y; - - return this; - - }, - - addVectors: function ( a, b ) { - - this.x = a.x + b.x; - this.y = a.y + b.y; - - return this; - - }, - - addScalar: function ( s ) { - - this.x += s; - this.y += s; - - return this; - - }, - - sub: function ( v, w ) { - - if ( w !== undefined ) { - - console.warn( 'DEPRECATED: Vector2\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); - return this.subVectors( v, w ); - - } - - this.x -= v.x; - this.y -= v.y; - - return this; - - }, - - subVectors: function ( a, b ) { - - this.x = a.x - b.x; - this.y = a.y - b.y; - - return this; - - }, - - multiplyScalar: function ( s ) { - - this.x *= s; - this.y *= s; - - return this; - - }, - - divideScalar: function ( scalar ) { - - if ( scalar !== 0 ) { - - var invScalar = 1 / scalar; - - this.x *= invScalar; - this.y *= invScalar; - - } else { - - this.x = 0; - this.y = 0; - - } - - return this; - - }, - - min: function ( v ) { - - if ( this.x > v.x ) { - - this.x = v.x; - - } - - if ( this.y > v.y ) { - - this.y = v.y; - - } - - return this; - - }, - - max: function ( v ) { - - if ( this.x < v.x ) { - - this.x = v.x; - - } - - if ( this.y < v.y ) { - - this.y = v.y; - - } - - return this; - - }, - - clamp: function ( min, max ) { - - // This function assumes min < max, if this assumption isn't true it will not operate correctly - - if ( this.x < min.x ) { - - this.x = min.x; - - } else if ( this.x > max.x ) { - - this.x = max.x; - - } - - if ( this.y < min.y ) { - - this.y = min.y; - - } else if ( this.y > max.y ) { - - this.y = max.y; - - } - - return this; - }, - - clampScalar: ( function () { - - var min, max; - - return function ( minVal, maxVal ) { - - if ( min === undefined ) { - - min = new THREE.Vector2(); - max = new THREE.Vector2(); - - } - - min.set( minVal, minVal ); - max.set( maxVal, maxVal ); - - return this.clamp( min, max ); - - }; - - } )(), - - floor: function () { - - this.x = Math.floor( this.x ); - this.y = Math.floor( this.y ); - - return this; - - }, - - ceil: function () { - - this.x = Math.ceil( this.x ); - this.y = Math.ceil( this.y ); - - return this; - - }, - - round: function () { - - this.x = Math.round( this.x ); - this.y = Math.round( this.y ); - - return this; - - }, - - roundToZero: function () { - - this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); - this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); - - return this; - - }, - - negate: function () { - - return this.multiplyScalar( - 1 ); - - }, - - dot: function ( v ) { - - return this.x * v.x + this.y * v.y; - - }, - - lengthSq: function () { - - return this.x * this.x + this.y * this.y; - - }, - - length: function () { - - return Math.sqrt( this.x * this.x + this.y * this.y ); - - }, - - normalize: function () { - - return this.divideScalar( this.length() ); - - }, - - distanceTo: function ( v ) { - - return Math.sqrt( this.distanceToSquared( v ) ); - - }, - - distanceToSquared: function ( v ) { - - var dx = this.x - v.x, dy = this.y - v.y; - return dx * dx + dy * dy; - - }, - - setLength: function ( l ) { - - var oldLength = this.length(); - - if ( oldLength !== 0 && l !== oldLength ) { - - this.multiplyScalar( l / oldLength ); - } - - return this; - - }, - - lerp: function ( v, alpha ) { - - this.x += ( v.x - this.x ) * alpha; - this.y += ( v.y - this.y ) * alpha; - - return this; - - }, - - equals: function( v ) { - - return ( ( v.x === this.x ) && ( v.y === this.y ) ); - - }, - - fromArray: function ( array ) { - - this.x = array[ 0 ]; - this.y = array[ 1 ]; - - return this; - - }, - - toArray: function () { - - return [ this.x, this.y ]; - - }, - - clone: function () { - - return new THREE.Vector2( this.x, this.y ); - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author *kile / http://kile.stravaganza.org/ - * @author philogb / http://blog.thejit.org/ - * @author mikael emtinger / http://gomo.se/ - * @author egraether / http://egraether.com/ - * @author WestLangley / http://github.com/WestLangley - */ - -THREE.Vector3 = function ( x, y, z ) { - - this.x = x || 0; - this.y = y || 0; - this.z = z || 0; - -}; - -THREE.Vector3.prototype = { - - constructor: THREE.Vector3, - - set: function ( x, y, z ) { - - this.x = x; - this.y = y; - this.z = z; - - return this; - - }, - - setX: function ( x ) { - - this.x = x; - - return this; - - }, - - setY: function ( y ) { - - this.y = y; - - return this; - - }, - - setZ: function ( z ) { - - this.z = z; - - return this; - - }, - - setComponent: function ( index, value ) { - - switch ( index ) { - - case 0: this.x = value; break; - case 1: this.y = value; break; - case 2: this.z = value; break; - default: throw new Error( "index is out of range: " + index ); - - } - - }, - - getComponent: function ( index ) { - - switch ( index ) { - - case 0: return this.x; - case 1: return this.y; - case 2: return this.z; - default: throw new Error( "index is out of range: " + index ); - - } - - }, - - copy: function ( v ) { - - this.x = v.x; - this.y = v.y; - this.z = v.z; - - return this; - - }, - - add: function ( v, w ) { - - if ( w !== undefined ) { - - console.warn( 'DEPRECATED: Vector3\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); - return this.addVectors( v, w ); - - } - - this.x += v.x; - this.y += v.y; - this.z += v.z; - - return this; - - }, - - addScalar: function ( s ) { - - this.x += s; - this.y += s; - this.z += s; - - return this; - - }, - - addVectors: function ( a, b ) { - - this.x = a.x + b.x; - this.y = a.y + b.y; - this.z = a.z + b.z; - - return this; - - }, - - sub: function ( v, w ) { - - if ( w !== undefined ) { - - console.warn( 'DEPRECATED: Vector3\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); - return this.subVectors( v, w ); - - } - - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - - return this; - - }, - - subVectors: function ( a, b ) { - - this.x = a.x - b.x; - this.y = a.y - b.y; - this.z = a.z - b.z; - - return this; - - }, - - multiply: function ( v, w ) { - - if ( w !== undefined ) { - - console.warn( 'DEPRECATED: Vector3\'s .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); - return this.multiplyVectors( v, w ); - - } - - this.x *= v.x; - this.y *= v.y; - this.z *= v.z; - - return this; - - }, - - multiplyScalar: function ( scalar ) { - - this.x *= scalar; - this.y *= scalar; - this.z *= scalar; - - return this; - - }, - - multiplyVectors: function ( a, b ) { - - this.x = a.x * b.x; - this.y = a.y * b.y; - this.z = a.z * b.z; - - return this; - - }, - - applyEuler: function () { - - var quaternion; - - return function ( euler ) { - - if ( euler instanceof THREE.Euler === false ) { - - console.error( 'ERROR: Vector3\'s .applyEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.' ); - - } - - if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); - - this.applyQuaternion( quaternion.setFromEuler( euler ) ); - - return this; - - }; - - }(), - - applyAxisAngle: function () { - - var quaternion; - - return function ( axis, angle ) { - - if ( quaternion === undefined ) quaternion = new THREE.Quaternion(); - - this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); - - return this; - - }; - - }(), - - applyMatrix3: function ( m ) { - - var x = this.x; - var y = this.y; - var z = this.z; - - var e = m.elements; - - this.x = e[0] * x + e[3] * y + e[6] * z; - this.y = e[1] * x + e[4] * y + e[7] * z; - this.z = e[2] * x + e[5] * y + e[8] * z; - - return this; - - }, - - applyMatrix4: function ( m ) { - - // input: THREE.Matrix4 affine matrix - - var x = this.x, y = this.y, z = this.z; - - var e = m.elements; - - this.x = e[0] * x + e[4] * y + e[8] * z + e[12]; - this.y = e[1] * x + e[5] * y + e[9] * z + e[13]; - this.z = e[2] * x + e[6] * y + e[10] * z + e[14]; - - return this; - - }, - - applyProjection: function ( m ) { - - // input: THREE.Matrix4 projection matrix - - var x = this.x, y = this.y, z = this.z; - - var e = m.elements; - var d = 1 / ( e[3] * x + e[7] * y + e[11] * z + e[15] ); // perspective divide - - this.x = ( e[0] * x + e[4] * y + e[8] * z + e[12] ) * d; - this.y = ( e[1] * x + e[5] * y + e[9] * z + e[13] ) * d; - this.z = ( e[2] * x + e[6] * y + e[10] * z + e[14] ) * d; - - return this; - - }, - - applyQuaternion: function ( q ) { - - var x = this.x; - var y = this.y; - var z = this.z; - - var qx = q.x; - var qy = q.y; - var qz = q.z; - var qw = q.w; - - // calculate quat * vector - - var ix = qw * x + qy * z - qz * y; - var iy = qw * y + qz * x - qx * z; - var iz = qw * z + qx * y - qy * x; - var iw = -qx * x - qy * y - qz * z; - - // calculate result * inverse quat - - this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; - this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; - this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; - - return this; - - }, - - transformDirection: function ( m ) { - - // input: THREE.Matrix4 affine matrix - // vector interpreted as a direction - - var x = this.x, y = this.y, z = this.z; - - var e = m.elements; - - this.x = e[0] * x + e[4] * y + e[8] * z; - this.y = e[1] * x + e[5] * y + e[9] * z; - this.z = e[2] * x + e[6] * y + e[10] * z; - - this.normalize(); - - return this; - - }, - - divide: function ( v ) { - - this.x /= v.x; - this.y /= v.y; - this.z /= v.z; - - return this; - - }, - - divideScalar: function ( scalar ) { - - if ( scalar !== 0 ) { - - var invScalar = 1 / scalar; - - this.x *= invScalar; - this.y *= invScalar; - this.z *= invScalar; - - } else { - - this.x = 0; - this.y = 0; - this.z = 0; - - } - - return this; - - }, - - min: function ( v ) { - - if ( this.x > v.x ) { - - this.x = v.x; - - } - - if ( this.y > v.y ) { - - this.y = v.y; - - } - - if ( this.z > v.z ) { - - this.z = v.z; - - } - - return this; - - }, - - max: function ( v ) { - - if ( this.x < v.x ) { - - this.x = v.x; - - } - - if ( this.y < v.y ) { - - this.y = v.y; - - } - - if ( this.z < v.z ) { - - this.z = v.z; - - } - - return this; - - }, - - clamp: function ( min, max ) { - - // This function assumes min < max, if this assumption isn't true it will not operate correctly - - if ( this.x < min.x ) { - - this.x = min.x; - - } else if ( this.x > max.x ) { - - this.x = max.x; - - } - - if ( this.y < min.y ) { - - this.y = min.y; - - } else if ( this.y > max.y ) { - - this.y = max.y; - - } - - if ( this.z < min.z ) { - - this.z = min.z; - - } else if ( this.z > max.z ) { - - this.z = max.z; - - } - - return this; - - }, - - clampScalar: ( function () { - - var min, max; - - return function ( minVal, maxVal ) { - - if ( min === undefined ) { - - min = new THREE.Vector3(); - max = new THREE.Vector3(); - - } - - min.set( minVal, minVal, minVal ); - max.set( maxVal, maxVal, maxVal ); - - return this.clamp( min, max ); - - }; - - } )(), - - floor: function () { - - this.x = Math.floor( this.x ); - this.y = Math.floor( this.y ); - this.z = Math.floor( this.z ); - - return this; - - }, - - ceil: function () { - - this.x = Math.ceil( this.x ); - this.y = Math.ceil( this.y ); - this.z = Math.ceil( this.z ); - - return this; - - }, - - round: function () { - - this.x = Math.round( this.x ); - this.y = Math.round( this.y ); - this.z = Math.round( this.z ); - - return this; - - }, - - roundToZero: function () { - - this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); - this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); - this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); - - return this; - - }, - - negate: function () { - - return this.multiplyScalar( - 1 ); - - }, - - dot: function ( v ) { - - return this.x * v.x + this.y * v.y + this.z * v.z; - - }, - - lengthSq: function () { - - return this.x * this.x + this.y * this.y + this.z * this.z; - - }, - - length: function () { - - return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); - - }, - - lengthManhattan: function () { - - return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); - - }, - - normalize: function () { - - return this.divideScalar( this.length() ); - - }, - - setLength: function ( l ) { - - var oldLength = this.length(); - - if ( oldLength !== 0 && l !== oldLength ) { - - this.multiplyScalar( l / oldLength ); - } - - return this; - - }, - - lerp: function ( v, alpha ) { - - this.x += ( v.x - this.x ) * alpha; - this.y += ( v.y - this.y ) * alpha; - this.z += ( v.z - this.z ) * alpha; - - return this; - - }, - - cross: function ( v, w ) { - - if ( w !== undefined ) { - - console.warn( 'DEPRECATED: Vector3\'s .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); - return this.crossVectors( v, w ); - - } - - var x = this.x, y = this.y, z = this.z; - - this.x = y * v.z - z * v.y; - this.y = z * v.x - x * v.z; - this.z = x * v.y - y * v.x; - - return this; - - }, - - crossVectors: function ( a, b ) { - - var ax = a.x, ay = a.y, az = a.z; - var bx = b.x, by = b.y, bz = b.z; - - this.x = ay * bz - az * by; - this.y = az * bx - ax * bz; - this.z = ax * by - ay * bx; - - return this; - - }, - - projectOnVector: function () { - - var v1, dot; - - return function ( vector ) { - - if ( v1 === undefined ) v1 = new THREE.Vector3(); - - v1.copy( vector ).normalize(); - - dot = this.dot( v1 ); - - return this.copy( v1 ).multiplyScalar( dot ); - - }; - - }(), - - projectOnPlane: function () { - - var v1; - - return function ( planeNormal ) { - - if ( v1 === undefined ) v1 = new THREE.Vector3(); - - v1.copy( this ).projectOnVector( planeNormal ); - - return this.sub( v1 ); - - } - - }(), - - reflect: function () { - - // reflect incident vector off plane orthogonal to normal - // normal is assumed to have unit length - - var v1; - - return function ( normal ) { - - if ( v1 === undefined ) v1 = new THREE.Vector3(); - - return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); - - } - - }(), - - angleTo: function ( v ) { - - var theta = this.dot( v ) / ( this.length() * v.length() ); - - // clamp, to handle numerical problems - - return Math.acos( THREE.Math.clamp( theta, -1, 1 ) ); - - }, - - distanceTo: function ( v ) { - - return Math.sqrt( this.distanceToSquared( v ) ); - - }, - - distanceToSquared: function ( v ) { - - var dx = this.x - v.x; - var dy = this.y - v.y; - var dz = this.z - v.z; - - return dx * dx + dy * dy + dz * dz; - - }, - - setEulerFromRotationMatrix: function ( m, order ) { - - console.error( "REMOVED: Vector3\'s setEulerFromRotationMatrix has been removed in favor of Euler.setFromRotationMatrix(), please update your code."); - - }, - - setEulerFromQuaternion: function ( q, order ) { - - console.error( "REMOVED: Vector3\'s setEulerFromQuaternion: has been removed in favor of Euler.setFromQuaternion(), please update your code."); - - }, - - getPositionFromMatrix: function ( m ) { - - console.warn( "DEPRECATED: Vector3\'s .getPositionFromMatrix() has been renamed to .setFromMatrixPosition(). Please update your code." ); - - return this.setFromMatrixPosition( m ); - - }, - - getScaleFromMatrix: function ( m ) { - - console.warn( "DEPRECATED: Vector3\'s .getScaleFromMatrix() has been renamed to .setFromMatrixScale(). Please update your code." ); - - return this.setFromMatrixScale( m ); - }, - - getColumnFromMatrix: function ( index, matrix ) { - - console.warn( "DEPRECATED: Vector3\'s .getColumnFromMatrix() has been renamed to .setFromMatrixColumn(). Please update your code." ); - - return this.setFromMatrixColumn( index, matrix ); - - }, - - setFromMatrixPosition: function ( m ) { - - this.x = m.elements[ 12 ]; - this.y = m.elements[ 13 ]; - this.z = m.elements[ 14 ]; - - return this; - - }, - - setFromMatrixScale: function ( m ) { - - var sx = this.set( m.elements[ 0 ], m.elements[ 1 ], m.elements[ 2 ] ).length(); - var sy = this.set( m.elements[ 4 ], m.elements[ 5 ], m.elements[ 6 ] ).length(); - var sz = this.set( m.elements[ 8 ], m.elements[ 9 ], m.elements[ 10 ] ).length(); - - this.x = sx; - this.y = sy; - this.z = sz; - - return this; - }, - - setFromMatrixColumn: function ( index, matrix ) { - - var offset = index * 4; - - var me = matrix.elements; - - this.x = me[ offset ]; - this.y = me[ offset + 1 ]; - this.z = me[ offset + 2 ]; - - return this; - - }, - - equals: function ( v ) { - - return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); - - }, - - fromArray: function ( array ) { - - this.x = array[ 0 ]; - this.y = array[ 1 ]; - this.z = array[ 2 ]; - - return this; - - }, - - toArray: function () { - - return [ this.x, this.y, this.z ]; - - }, - - clone: function () { - - return new THREE.Vector3( this.x, this.y, this.z ); - - } - -}; -/** - * @author supereggbert / http://www.paulbrunt.co.uk/ - * @author philogb / http://blog.thejit.org/ - * @author mikael emtinger / http://gomo.se/ - * @author egraether / http://egraether.com/ - * @author WestLangley / http://github.com/WestLangley - */ - -THREE.Vector4 = function ( x, y, z, w ) { - - this.x = x || 0; - this.y = y || 0; - this.z = z || 0; - this.w = ( w !== undefined ) ? w : 1; - -}; - -THREE.Vector4.prototype = { - - constructor: THREE.Vector4, - - set: function ( x, y, z, w ) { - - this.x = x; - this.y = y; - this.z = z; - this.w = w; - - return this; - - }, - - setX: function ( x ) { - - this.x = x; - - return this; - - }, - - setY: function ( y ) { - - this.y = y; - - return this; - - }, - - setZ: function ( z ) { - - this.z = z; - - return this; - - }, - - setW: function ( w ) { - - this.w = w; - - return this; - - }, - - setComponent: function ( index, value ) { - - switch ( index ) { - - case 0: this.x = value; break; - case 1: this.y = value; break; - case 2: this.z = value; break; - case 3: this.w = value; break; - default: throw new Error( "index is out of range: " + index ); - - } - - }, - - getComponent: function ( index ) { - - switch ( index ) { - - case 0: return this.x; - case 1: return this.y; - case 2: return this.z; - case 3: return this.w; - default: throw new Error( "index is out of range: " + index ); - - } - - }, - - copy: function ( v ) { - - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.w = ( v.w !== undefined ) ? v.w : 1; - - return this; - - }, - - add: function ( v, w ) { - - if ( w !== undefined ) { - - console.warn( 'DEPRECATED: Vector4\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); - return this.addVectors( v, w ); - - } - - this.x += v.x; - this.y += v.y; - this.z += v.z; - this.w += v.w; - - return this; - - }, - - addScalar: function ( s ) { - - this.x += s; - this.y += s; - this.z += s; - this.w += s; - - return this; - - }, - - addVectors: function ( a, b ) { - - this.x = a.x + b.x; - this.y = a.y + b.y; - this.z = a.z + b.z; - this.w = a.w + b.w; - - return this; - - }, - - sub: function ( v, w ) { - - if ( w !== undefined ) { - - console.warn( 'DEPRECATED: Vector4\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); - return this.subVectors( v, w ); - - } - - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - this.w -= v.w; - - return this; - - }, - - subVectors: function ( a, b ) { - - this.x = a.x - b.x; - this.y = a.y - b.y; - this.z = a.z - b.z; - this.w = a.w - b.w; - - return this; - - }, - - multiplyScalar: function ( scalar ) { - - this.x *= scalar; - this.y *= scalar; - this.z *= scalar; - this.w *= scalar; - - return this; - - }, - - applyMatrix4: function ( m ) { - - var x = this.x; - var y = this.y; - var z = this.z; - var w = this.w; - - var e = m.elements; - - this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w; - this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w; - this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w; - this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w; - - return this; - - }, - - divideScalar: function ( scalar ) { - - if ( scalar !== 0 ) { - - var invScalar = 1 / scalar; - - this.x *= invScalar; - this.y *= invScalar; - this.z *= invScalar; - this.w *= invScalar; - - } else { - - this.x = 0; - this.y = 0; - this.z = 0; - this.w = 1; - - } - - return this; - - }, - - setAxisAngleFromQuaternion: function ( q ) { - - // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm - - // q is assumed to be normalized - - this.w = 2 * Math.acos( q.w ); - - var s = Math.sqrt( 1 - q.w * q.w ); - - if ( s < 0.0001 ) { - - this.x = 1; - this.y = 0; - this.z = 0; - - } else { - - this.x = q.x / s; - this.y = q.y / s; - this.z = q.z / s; - - } - - return this; - - }, - - setAxisAngleFromRotationMatrix: function ( m ) { - - // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm - - // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) - - var angle, x, y, z, // variables for result - epsilon = 0.01, // margin to allow for rounding errors - epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees - - te = m.elements, - - m11 = te[0], m12 = te[4], m13 = te[8], - m21 = te[1], m22 = te[5], m23 = te[9], - m31 = te[2], m32 = te[6], m33 = te[10]; - - if ( ( Math.abs( m12 - m21 ) < epsilon ) - && ( Math.abs( m13 - m31 ) < epsilon ) - && ( Math.abs( m23 - m32 ) < epsilon ) ) { - - // singularity found - // first check for identity matrix which must have +1 for all terms - // in leading diagonal and zero in other terms - - if ( ( Math.abs( m12 + m21 ) < epsilon2 ) - && ( Math.abs( m13 + m31 ) < epsilon2 ) - && ( Math.abs( m23 + m32 ) < epsilon2 ) - && ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { - - // this singularity is identity matrix so angle = 0 - - this.set( 1, 0, 0, 0 ); - - return this; // zero angle, arbitrary axis - - } - - // otherwise this singularity is angle = 180 - - angle = Math.PI; - - var xx = ( m11 + 1 ) / 2; - var yy = ( m22 + 1 ) / 2; - var zz = ( m33 + 1 ) / 2; - var xy = ( m12 + m21 ) / 4; - var xz = ( m13 + m31 ) / 4; - var yz = ( m23 + m32 ) / 4; - - if ( ( xx > yy ) && ( xx > zz ) ) { // m11 is the largest diagonal term - - if ( xx < epsilon ) { - - x = 0; - y = 0.707106781; - z = 0.707106781; - - } else { - - x = Math.sqrt( xx ); - y = xy / x; - z = xz / x; - - } - - } else if ( yy > zz ) { // m22 is the largest diagonal term - - if ( yy < epsilon ) { - - x = 0.707106781; - y = 0; - z = 0.707106781; - - } else { - - y = Math.sqrt( yy ); - x = xy / y; - z = yz / y; - - } - - } else { // m33 is the largest diagonal term so base result on this - - if ( zz < epsilon ) { - - x = 0.707106781; - y = 0.707106781; - z = 0; - - } else { - - z = Math.sqrt( zz ); - x = xz / z; - y = yz / z; - - } - - } - - this.set( x, y, z, angle ); - - return this; // return 180 deg rotation - - } - - // as we have reached here there are no singularities so we can handle normally - - var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) - + ( m13 - m31 ) * ( m13 - m31 ) - + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize - - if ( Math.abs( s ) < 0.001 ) s = 1; - - // prevent divide by zero, should not happen if matrix is orthogonal and should be - // caught by singularity test above, but I've left it in just in case - - this.x = ( m32 - m23 ) / s; - this.y = ( m13 - m31 ) / s; - this.z = ( m21 - m12 ) / s; - this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); - - return this; - - }, - - min: function ( v ) { - - if ( this.x > v.x ) { - - this.x = v.x; - - } - - if ( this.y > v.y ) { - - this.y = v.y; - - } - - if ( this.z > v.z ) { - - this.z = v.z; - - } - - if ( this.w > v.w ) { - - this.w = v.w; - - } - - return this; - - }, - - max: function ( v ) { - - if ( this.x < v.x ) { - - this.x = v.x; - - } - - if ( this.y < v.y ) { - - this.y = v.y; - - } - - if ( this.z < v.z ) { - - this.z = v.z; - - } - - if ( this.w < v.w ) { - - this.w = v.w; - - } - - return this; - - }, - - clamp: function ( min, max ) { - - // This function assumes min < max, if this assumption isn't true it will not operate correctly - - if ( this.x < min.x ) { - - this.x = min.x; - - } else if ( this.x > max.x ) { - - this.x = max.x; - - } - - if ( this.y < min.y ) { - - this.y = min.y; - - } else if ( this.y > max.y ) { - - this.y = max.y; - - } - - if ( this.z < min.z ) { - - this.z = min.z; - - } else if ( this.z > max.z ) { - - this.z = max.z; - - } - - if ( this.w < min.w ) { - - this.w = min.w; - - } else if ( this.w > max.w ) { - - this.w = max.w; - - } - - return this; - - }, - - clampScalar: ( function () { - - var min, max; - - return function ( minVal, maxVal ) { - - if ( min === undefined ) { - - min = new THREE.Vector4(); - max = new THREE.Vector4(); - - } - - min.set( minVal, minVal, minVal, minVal ); - max.set( maxVal, maxVal, maxVal, maxVal ); - - return this.clamp( min, max ); - - }; - - } )(), - - floor: function () { - - this.x = Math.floor( this.x ); - this.y = Math.floor( this.y ); - this.z = Math.floor( this.z ); - this.w = Math.floor( this.w ); - - return this; - - }, - - ceil: function () { - - this.x = Math.ceil( this.x ); - this.y = Math.ceil( this.y ); - this.z = Math.ceil( this.z ); - this.w = Math.ceil( this.w ); - - return this; - - }, - - round: function () { - - this.x = Math.round( this.x ); - this.y = Math.round( this.y ); - this.z = Math.round( this.z ); - this.w = Math.round( this.w ); - - return this; - - }, - - roundToZero: function () { - - this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); - this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); - this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); - this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); - - return this; - - }, - - negate: function () { - - return this.multiplyScalar( -1 ); - - }, - - dot: function ( v ) { - - return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; - - }, - - lengthSq: function () { - - return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; - - }, - - length: function () { - - return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); - - }, - - lengthManhattan: function () { - - return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); - - }, - - normalize: function () { - - return this.divideScalar( this.length() ); - - }, - - setLength: function ( l ) { - - var oldLength = this.length(); - - if ( oldLength !== 0 && l !== oldLength ) { - - this.multiplyScalar( l / oldLength ); - - } - - return this; - - }, - - lerp: function ( v, alpha ) { - - this.x += ( v.x - this.x ) * alpha; - this.y += ( v.y - this.y ) * alpha; - this.z += ( v.z - this.z ) * alpha; - this.w += ( v.w - this.w ) * alpha; - - return this; - - }, - - equals: function ( v ) { - - return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); - - }, - - fromArray: function ( array ) { - - this.x = array[ 0 ]; - this.y = array[ 1 ]; - this.z = array[ 2 ]; - this.w = array[ 3 ]; - - return this; - - }, - - toArray: function () { - - return [ this.x, this.y, this.z, this.w ]; - - }, - - clone: function () { - - return new THREE.Vector4( this.x, this.y, this.z, this.w ); - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author WestLangley / http://github.com/WestLangley - * @author bhouston / http://exocortex.com - */ - -THREE.Euler = function ( x, y, z, order ) { - - this._x = x || 0; - this._y = y || 0; - this._z = z || 0; - this._order = order || THREE.Euler.DefaultOrder; - -}; - -THREE.Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; - -THREE.Euler.DefaultOrder = 'XYZ'; - -THREE.Euler.prototype = { - - constructor: THREE.Euler, - - _x: 0, _y: 0, _z: 0, _order: THREE.Euler.DefaultOrder, - - _quaternion: undefined, - - _updateQuaternion: function () { - - if ( this._quaternion !== undefined ) { - - this._quaternion.setFromEuler( this, false ); - - } - - }, - - get x () { - - return this._x; - - }, - - set x ( value ) { - - this._x = value; - this._updateQuaternion(); - - }, - - get y () { - - return this._y; - - }, - - set y ( value ) { - - this._y = value; - this._updateQuaternion(); - - }, - - get z () { - - return this._z; - - }, - - set z ( value ) { - - this._z = value; - this._updateQuaternion(); - - }, - - get order () { - - return this._order; - - }, - - set order ( value ) { - - this._order = value; - this._updateQuaternion(); - - }, - - set: function ( x, y, z, order ) { - - this._x = x; - this._y = y; - this._z = z; - this._order = order || this._order; - - this._updateQuaternion(); - - return this; - - }, - - copy: function ( euler ) { - - this._x = euler._x; - this._y = euler._y; - this._z = euler._z; - this._order = euler._order; - - this._updateQuaternion(); - - return this; - - }, - - setFromRotationMatrix: function ( m, order ) { - - // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) - - // clamp, to handle numerical problems - - function clamp( x ) { - - return Math.min( Math.max( x, -1 ), 1 ); - - } - - var te = m.elements; - var m11 = te[0], m12 = te[4], m13 = te[8]; - var m21 = te[1], m22 = te[5], m23 = te[9]; - var m31 = te[2], m32 = te[6], m33 = te[10]; - - order = order || this._order; - - if ( order === 'XYZ' ) { - - this._y = Math.asin( clamp( m13 ) ); - - if ( Math.abs( m13 ) < 0.99999 ) { - - this._x = Math.atan2( - m23, m33 ); - this._z = Math.atan2( - m12, m11 ); - - } else { - - this._x = Math.atan2( m32, m22 ); - this._z = 0; - - } - - } else if ( order === 'YXZ' ) { - - this._x = Math.asin( - clamp( m23 ) ); - - if ( Math.abs( m23 ) < 0.99999 ) { - - this._y = Math.atan2( m13, m33 ); - this._z = Math.atan2( m21, m22 ); - - } else { - - this._y = Math.atan2( - m31, m11 ); - this._z = 0; - - } - - } else if ( order === 'ZXY' ) { - - this._x = Math.asin( clamp( m32 ) ); - - if ( Math.abs( m32 ) < 0.99999 ) { - - this._y = Math.atan2( - m31, m33 ); - this._z = Math.atan2( - m12, m22 ); - - } else { - - this._y = 0; - this._z = Math.atan2( m21, m11 ); - - } - - } else if ( order === 'ZYX' ) { - - this._y = Math.asin( - clamp( m31 ) ); - - if ( Math.abs( m31 ) < 0.99999 ) { - - this._x = Math.atan2( m32, m33 ); - this._z = Math.atan2( m21, m11 ); - - } else { - - this._x = 0; - this._z = Math.atan2( - m12, m22 ); - - } - - } else if ( order === 'YZX' ) { - - this._z = Math.asin( clamp( m21 ) ); - - if ( Math.abs( m21 ) < 0.99999 ) { - - this._x = Math.atan2( - m23, m22 ); - this._y = Math.atan2( - m31, m11 ); - - } else { - - this._x = 0; - this._y = Math.atan2( m13, m33 ); - - } - - } else if ( order === 'XZY' ) { - - this._z = Math.asin( - clamp( m12 ) ); - - if ( Math.abs( m12 ) < 0.99999 ) { - - this._x = Math.atan2( m32, m22 ); - this._y = Math.atan2( m13, m11 ); - - } else { - - this._x = Math.atan2( - m23, m33 ); - this._y = 0; - - } - - } else { - - console.warn( 'WARNING: Euler.setFromRotationMatrix() given unsupported order: ' + order ) - - } - - this._order = order; - - this._updateQuaternion(); - - return this; - - }, - - setFromQuaternion: function ( q, order, update ) { - - // q is assumed to be normalized - - // clamp, to handle numerical problems - - function clamp( x ) { - - return Math.min( Math.max( x, -1 ), 1 ); - - } - - // http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m - - var sqx = q.x * q.x; - var sqy = q.y * q.y; - var sqz = q.z * q.z; - var sqw = q.w * q.w; - - order = order || this._order; - - if ( order === 'XYZ' ) { - - this._x = Math.atan2( 2 * ( q.x * q.w - q.y * q.z ), ( sqw - sqx - sqy + sqz ) ); - this._y = Math.asin( clamp( 2 * ( q.x * q.z + q.y * q.w ) ) ); - this._z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw + sqx - sqy - sqz ) ); - - } else if ( order === 'YXZ' ) { - - this._x = Math.asin( clamp( 2 * ( q.x * q.w - q.y * q.z ) ) ); - this._y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw - sqx - sqy + sqz ) ); - this._z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw - sqx + sqy - sqz ) ); - - } else if ( order === 'ZXY' ) { - - this._x = Math.asin( clamp( 2 * ( q.x * q.w + q.y * q.z ) ) ); - this._y = Math.atan2( 2 * ( q.y * q.w - q.z * q.x ), ( sqw - sqx - sqy + sqz ) ); - this._z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw - sqx + sqy - sqz ) ); - - } else if ( order === 'ZYX' ) { - - this._x = Math.atan2( 2 * ( q.x * q.w + q.z * q.y ), ( sqw - sqx - sqy + sqz ) ); - this._y = Math.asin( clamp( 2 * ( q.y * q.w - q.x * q.z ) ) ); - this._z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw + sqx - sqy - sqz ) ); - - } else if ( order === 'YZX' ) { - - this._x = Math.atan2( 2 * ( q.x * q.w - q.z * q.y ), ( sqw - sqx + sqy - sqz ) ); - this._y = Math.atan2( 2 * ( q.y * q.w - q.x * q.z ), ( sqw + sqx - sqy - sqz ) ); - this._z = Math.asin( clamp( 2 * ( q.x * q.y + q.z * q.w ) ) ); - - } else if ( order === 'XZY' ) { - - this._x = Math.atan2( 2 * ( q.x * q.w + q.y * q.z ), ( sqw - sqx + sqy - sqz ) ); - this._y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw + sqx - sqy - sqz ) ); - this._z = Math.asin( clamp( 2 * ( q.z * q.w - q.x * q.y ) ) ); - - } else { - - console.warn( 'WARNING: Euler.setFromQuaternion() given unsupported order: ' + order ) - - } - - this._order = order; - - if ( update !== false ) this._updateQuaternion(); - - return this; - - }, - - reorder: function () { - - // WARNING: this discards revolution information -bhouston - - var q = new THREE.Quaternion(); - - return function ( newOrder ) { - - q.setFromEuler( this ); - this.setFromQuaternion( q, newOrder ); - - }; - - - }(), - - fromArray: function ( array ) { - - this._x = array[ 0 ]; - this._y = array[ 1 ]; - this._z = array[ 2 ]; - if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; - - this._updateQuaternion(); - - return this; - - }, - - toArray: function () { - - return [ this._x, this._y, this._z, this._order ]; - - }, - - equals: function ( euler ) { - - return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); - - }, - - clone: function () { - - return new THREE.Euler( this._x, this._y, this._z, this._order ); - - } - -}; - -/** - * @author bhouston / http://exocortex.com - */ - -THREE.Line3 = function ( start, end ) { - - this.start = ( start !== undefined ) ? start : new THREE.Vector3(); - this.end = ( end !== undefined ) ? end : new THREE.Vector3(); - -}; - -THREE.Line3.prototype = { - - constructor: THREE.Line3, - - set: function ( start, end ) { - - this.start.copy( start ); - this.end.copy( end ); - - return this; - - }, - - copy: function ( line ) { - - this.start.copy( line.start ); - this.end.copy( line.end ); - - return this; - - }, - - center: function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); - - }, - - delta: function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - return result.subVectors( this.end, this.start ); - - }, - - distanceSq: function () { - - return this.start.distanceToSquared( this.end ); - - }, - - distance: function () { - - return this.start.distanceTo( this.end ); - - }, - - at: function ( t, optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - - return this.delta( result ).multiplyScalar( t ).add( this.start ); - - }, - - closestPointToPointParameter: function() { - - var startP = new THREE.Vector3(); - var startEnd = new THREE.Vector3(); - - return function ( point, clampToLine ) { - - startP.subVectors( point, this.start ); - startEnd.subVectors( this.end, this.start ); - - var startEnd2 = startEnd.dot( startEnd ); - var startEnd_startP = startEnd.dot( startP ); - - var t = startEnd_startP / startEnd2; - - if ( clampToLine ) { - - t = THREE.Math.clamp( t, 0, 1 ); - - } - - return t; - - }; - - }(), - - closestPointToPoint: function ( point, clampToLine, optionalTarget ) { - - var t = this.closestPointToPointParameter( point, clampToLine ); - - var result = optionalTarget || new THREE.Vector3(); - - return this.delta( result ).multiplyScalar( t ).add( this.start ); - - }, - - applyMatrix4: function ( matrix ) { - - this.start.applyMatrix4( matrix ); - this.end.applyMatrix4( matrix ); - - return this; - - }, - - equals: function ( line ) { - - return line.start.equals( this.start ) && line.end.equals( this.end ); - - }, - - clone: function () { - - return new THREE.Line3().copy( this ); - - } - -}; - -/** - * @author bhouston / http://exocortex.com - */ - -THREE.Box2 = function ( min, max ) { - - this.min = ( min !== undefined ) ? min : new THREE.Vector2( Infinity, Infinity ); - this.max = ( max !== undefined ) ? max : new THREE.Vector2( -Infinity, -Infinity ); - -}; - -THREE.Box2.prototype = { - - constructor: THREE.Box2, - - set: function ( min, max ) { - - this.min.copy( min ); - this.max.copy( max ); - - return this; - - }, - - setFromPoints: function ( points ) { - - if ( points.length > 0 ) { - - var point = points[ 0 ]; - - this.min.copy( point ); - this.max.copy( point ); - - for ( var i = 1, il = points.length; i < il; i ++ ) { - - point = points[ i ]; - - if ( point.x < this.min.x ) { - - this.min.x = point.x; - - } else if ( point.x > this.max.x ) { - - this.max.x = point.x; - - } - - if ( point.y < this.min.y ) { - - this.min.y = point.y; - - } else if ( point.y > this.max.y ) { - - this.max.y = point.y; - - } - - } - - } else { - - this.makeEmpty(); - - } - - return this; - - }, - - setFromCenterAndSize: function () { - - var v1 = new THREE.Vector2(); - - return function ( center, size ) { - - var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); - this.min.copy( center ).sub( halfSize ); - this.max.copy( center ).add( halfSize ); - - return this; - - }; - - }(), - - copy: function ( box ) { - - this.min.copy( box.min ); - this.max.copy( box.max ); - - return this; - - }, - - makeEmpty: function () { - - this.min.x = this.min.y = Infinity; - this.max.x = this.max.y = -Infinity; - - return this; - - }, - - empty: function () { - - // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes - - return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); - - }, - - center: function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Vector2(); - return result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); - - }, - - size: function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Vector2(); - return result.subVectors( this.max, this.min ); - - }, - - expandByPoint: function ( point ) { - - this.min.min( point ); - this.max.max( point ); - - return this; - }, - - expandByVector: function ( vector ) { - - this.min.sub( vector ); - this.max.add( vector ); - - return this; - }, - - expandByScalar: function ( scalar ) { - - this.min.addScalar( -scalar ); - this.max.addScalar( scalar ); - - return this; - }, - - containsPoint: function ( point ) { - - if ( point.x < this.min.x || point.x > this.max.x || - point.y < this.min.y || point.y > this.max.y ) { - - return false; - - } - - return true; - - }, - - containsBox: function ( box ) { - - if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && - ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) { - - return true; - - } - - return false; - - }, - - getParameter: function ( point, optionalTarget ) { - - // This can potentially have a divide by zero if the box - // has a size dimension of 0. - - var result = optionalTarget || new THREE.Vector2(); - - return result.set( - ( point.x - this.min.x ) / ( this.max.x - this.min.x ), - ( point.y - this.min.y ) / ( this.max.y - this.min.y ) - ); - - }, - - isIntersectionBox: function ( box ) { - - // using 6 splitting planes to rule out intersections. - - if ( box.max.x < this.min.x || box.min.x > this.max.x || - box.max.y < this.min.y || box.min.y > this.max.y ) { - - return false; - - } - - return true; - - }, - - clampPoint: function ( point, optionalTarget ) { - - var result = optionalTarget || new THREE.Vector2(); - return result.copy( point ).clamp( this.min, this.max ); - - }, - - distanceToPoint: function () { - - var v1 = new THREE.Vector2(); - - return function ( point ) { - - var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); - return clampedPoint.sub( point ).length(); - - }; - - }(), - - intersect: function ( box ) { - - this.min.max( box.min ); - this.max.min( box.max ); - - return this; - - }, - - union: function ( box ) { - - this.min.min( box.min ); - this.max.max( box.max ); - - return this; - - }, - - translate: function ( offset ) { - - this.min.add( offset ); - this.max.add( offset ); - - return this; - - }, - - equals: function ( box ) { - - return box.min.equals( this.min ) && box.max.equals( this.max ); - - }, - - clone: function () { - - return new THREE.Box2().copy( this ); - - } - -}; - -/** - * @author bhouston / http://exocortex.com - * @author WestLangley / http://github.com/WestLangley - */ - -THREE.Box3 = function ( min, max ) { - - this.min = ( min !== undefined ) ? min : new THREE.Vector3( Infinity, Infinity, Infinity ); - this.max = ( max !== undefined ) ? max : new THREE.Vector3( -Infinity, -Infinity, -Infinity ); - -}; - -THREE.Box3.prototype = { - - constructor: THREE.Box3, - - set: function ( min, max ) { - - this.min.copy( min ); - this.max.copy( max ); - - return this; - - }, - - addPoint: function ( point ) { - - if ( point.x < this.min.x ) { - - this.min.x = point.x; - - } else if ( point.x > this.max.x ) { - - this.max.x = point.x; - - } - - if ( point.y < this.min.y ) { - - this.min.y = point.y; - - } else if ( point.y > this.max.y ) { - - this.max.y = point.y; - - } - - if ( point.z < this.min.z ) { - - this.min.z = point.z; - - } else if ( point.z > this.max.z ) { - - this.max.z = point.z; - - } - - }, - - setFromPoints: function ( points ) { - - if ( points.length > 0 ) { - - var point = points[ 0 ]; - - this.min.copy( point ); - this.max.copy( point ); - - for ( var i = 1, il = points.length; i < il; i ++ ) { - - this.addPoint( points[ i ] ) - - } - - } else { - - this.makeEmpty(); - - } - - return this; - - }, - - setFromCenterAndSize: function() { - - var v1 = new THREE.Vector3(); - - return function ( center, size ) { - - var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); - - this.min.copy( center ).sub( halfSize ); - this.max.copy( center ).add( halfSize ); - - return this; - - }; - - }(), - - setFromObject: function() { - - // Computes the world-axis-aligned bounding box of an object (including its children), - // accounting for both the object's, and childrens', world transforms - - var v1 = new THREE.Vector3(); - - return function( object ) { - - var scope = this; - - object.updateMatrixWorld( true ); - - this.makeEmpty(); - - object.traverse( function ( node ) { - - if ( node.geometry !== undefined && node.geometry.vertices !== undefined ) { - - var vertices = node.geometry.vertices; - - for ( var i = 0, il = vertices.length; i < il; i++ ) { - - v1.copy( vertices[ i ] ); - - v1.applyMatrix4( node.matrixWorld ); - - scope.expandByPoint( v1 ); - - } - - } - - } ); - - return this; - - }; - - }(), - - copy: function ( box ) { - - this.min.copy( box.min ); - this.max.copy( box.max ); - - return this; - - }, - - makeEmpty: function () { - - this.min.x = this.min.y = this.min.z = Infinity; - this.max.x = this.max.y = this.max.z = -Infinity; - - return this; - - }, - - empty: function () { - - // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes - - return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); - - }, - - center: function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - return result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); - - }, - - size: function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - return result.subVectors( this.max, this.min ); - - }, - - expandByPoint: function ( point ) { - - this.min.min( point ); - this.max.max( point ); - - return this; - - }, - - expandByVector: function ( vector ) { - - this.min.sub( vector ); - this.max.add( vector ); - - return this; - - }, - - expandByScalar: function ( scalar ) { - - this.min.addScalar( -scalar ); - this.max.addScalar( scalar ); - - return this; - - }, - - containsPoint: function ( point ) { - - if ( point.x < this.min.x || point.x > this.max.x || - point.y < this.min.y || point.y > this.max.y || - point.z < this.min.z || point.z > this.max.z ) { - - return false; - - } - - return true; - - }, - - containsBox: function ( box ) { - - if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && - ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) && - ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) { - - return true; - - } - - return false; - - }, - - getParameter: function ( point, optionalTarget ) { - - // This can potentially have a divide by zero if the box - // has a size dimension of 0. - - var result = optionalTarget || new THREE.Vector3(); - - return result.set( - ( point.x - this.min.x ) / ( this.max.x - this.min.x ), - ( point.y - this.min.y ) / ( this.max.y - this.min.y ), - ( point.z - this.min.z ) / ( this.max.z - this.min.z ) - ); - - }, - - isIntersectionBox: function ( box ) { - - // using 6 splitting planes to rule out intersections. - - if ( box.max.x < this.min.x || box.min.x > this.max.x || - box.max.y < this.min.y || box.min.y > this.max.y || - box.max.z < this.min.z || box.min.z > this.max.z ) { - - return false; - - } - - return true; - - }, - - clampPoint: function ( point, optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - return result.copy( point ).clamp( this.min, this.max ); - - }, - - distanceToPoint: function() { - - var v1 = new THREE.Vector3(); - - return function ( point ) { - - var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); - return clampedPoint.sub( point ).length(); - - }; - - }(), - - getBoundingSphere: function() { - - var v1 = new THREE.Vector3(); - - return function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Sphere(); - - result.center = this.center(); - result.radius = this.size( v1 ).length() * 0.5; - - return result; - - }; - - }(), - - intersect: function ( box ) { - - this.min.max( box.min ); - this.max.min( box.max ); - - return this; - - }, - - union: function ( box ) { - - this.min.min( box.min ); - this.max.max( box.max ); - - return this; - - }, - - applyMatrix4: function() { - - var points = [ - new THREE.Vector3(), - new THREE.Vector3(), - new THREE.Vector3(), - new THREE.Vector3(), - new THREE.Vector3(), - new THREE.Vector3(), - new THREE.Vector3(), - new THREE.Vector3() - ]; - - return function ( matrix ) { - - // NOTE: I am using a binary pattern to specify all 2^3 combinations below - points[0].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 - points[1].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 - points[2].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 - points[3].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 - points[4].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 - points[5].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 - points[6].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 - points[7].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 - - this.makeEmpty(); - this.setFromPoints( points ); - - return this; - - }; - - }(), - - translate: function ( offset ) { - - this.min.add( offset ); - this.max.add( offset ); - - return this; - - }, - - equals: function ( box ) { - - return box.min.equals( this.min ) && box.max.equals( this.max ); - - }, - - clone: function () { - - return new THREE.Box3().copy( this ); - - } - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - * @author bhouston / http://exocortex.com - */ - -THREE.Matrix3 = function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { - - this.elements = new Float32Array(9); - - this.set( - - ( n11 !== undefined ) ? n11 : 1, n12 || 0, n13 || 0, - n21 || 0, ( n22 !== undefined ) ? n22 : 1, n23 || 0, - n31 || 0, n32 || 0, ( n33 !== undefined ) ? n33 : 1 - - ); -}; - -THREE.Matrix3.prototype = { - - constructor: THREE.Matrix3, - - set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { - - var te = this.elements; - - te[0] = n11; te[3] = n12; te[6] = n13; - te[1] = n21; te[4] = n22; te[7] = n23; - te[2] = n31; te[5] = n32; te[8] = n33; - - return this; - - }, - - identity: function () { - - this.set( - - 1, 0, 0, - 0, 1, 0, - 0, 0, 1 - - ); - - return this; - - }, - - copy: function ( m ) { - - var me = m.elements; - - this.set( - - me[0], me[3], me[6], - me[1], me[4], me[7], - me[2], me[5], me[8] - - ); - - return this; - - }, - - multiplyVector3: function ( vector ) { - - console.warn( 'DEPRECATED: Matrix3\'s .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); - return vector.applyMatrix3( this ); - - }, - - multiplyVector3Array: function() { - - var v1 = new THREE.Vector3(); - - return function ( a ) { - - for ( var i = 0, il = a.length; i < il; i += 3 ) { - - v1.x = a[ i ]; - v1.y = a[ i + 1 ]; - v1.z = a[ i + 2 ]; - - v1.applyMatrix3(this); - - a[ i ] = v1.x; - a[ i + 1 ] = v1.y; - a[ i + 2 ] = v1.z; - - } - - return a; - - }; - - }(), - - multiplyScalar: function ( s ) { - - var te = this.elements; - - te[0] *= s; te[3] *= s; te[6] *= s; - te[1] *= s; te[4] *= s; te[7] *= s; - te[2] *= s; te[5] *= s; te[8] *= s; - - return this; - - }, - - determinant: function () { - - var te = this.elements; - - var a = te[0], b = te[1], c = te[2], - d = te[3], e = te[4], f = te[5], - g = te[6], h = te[7], i = te[8]; - - return a*e*i - a*f*h - b*d*i + b*f*g + c*d*h - c*e*g; - - }, - - getInverse: function ( matrix, throwOnInvertible ) { - - // input: THREE.Matrix4 - // ( based on http://code.google.com/p/webgl-mjs/ ) - - var me = matrix.elements; - var te = this.elements; - - te[ 0 ] = me[10] * me[5] - me[6] * me[9]; - te[ 1 ] = - me[10] * me[1] + me[2] * me[9]; - te[ 2 ] = me[6] * me[1] - me[2] * me[5]; - te[ 3 ] = - me[10] * me[4] + me[6] * me[8]; - te[ 4 ] = me[10] * me[0] - me[2] * me[8]; - te[ 5 ] = - me[6] * me[0] + me[2] * me[4]; - te[ 6 ] = me[9] * me[4] - me[5] * me[8]; - te[ 7 ] = - me[9] * me[0] + me[1] * me[8]; - te[ 8 ] = me[5] * me[0] - me[1] * me[4]; - - var det = me[ 0 ] * te[ 0 ] + me[ 1 ] * te[ 3 ] + me[ 2 ] * te[ 6 ]; - - // no inverse - - if ( det === 0 ) { - - var msg = "Matrix3.getInverse(): can't invert matrix, determinant is 0"; - - if ( throwOnInvertible || false ) { - - throw new Error( msg ); - - } else { - - console.warn( msg ); - - } - - this.identity(); - - return this; - - } - - this.multiplyScalar( 1.0 / det ); - - return this; - - }, - - transpose: function () { - - var tmp, m = this.elements; - - tmp = m[1]; m[1] = m[3]; m[3] = tmp; - tmp = m[2]; m[2] = m[6]; m[6] = tmp; - tmp = m[5]; m[5] = m[7]; m[7] = tmp; - - return this; - - }, - - getNormalMatrix: function ( m ) { - - // input: THREE.Matrix4 - - this.getInverse( m ).transpose(); - - return this; - - }, - - transposeIntoArray: function ( r ) { - - var m = this.elements; - - r[ 0 ] = m[ 0 ]; - r[ 1 ] = m[ 3 ]; - r[ 2 ] = m[ 6 ]; - r[ 3 ] = m[ 1 ]; - r[ 4 ] = m[ 4 ]; - r[ 5 ] = m[ 7 ]; - r[ 6 ] = m[ 2 ]; - r[ 7 ] = m[ 5 ]; - r[ 8 ] = m[ 8 ]; - - return this; - - }, - - fromArray: function ( array ) { - - this.elements.set( array ); - - return this; - - }, - - toArray: function () { - - var te = this.elements; - - return [ - te[ 0 ], te[ 1 ], te[ 2 ], - te[ 3 ], te[ 4 ], te[ 5 ], - te[ 6 ], te[ 7 ], te[ 8 ] - ]; - - }, - - clone: function () { - - var te = this.elements; - - return new THREE.Matrix3( - - te[0], te[3], te[6], - te[1], te[4], te[7], - te[2], te[5], te[8] - - ); - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author supereggbert / http://www.paulbrunt.co.uk/ - * @author philogb / http://blog.thejit.org/ - * @author jordi_ros / http://plattsoft.com - * @author D1plo1d / http://github.com/D1plo1d - * @author alteredq / http://alteredqualia.com/ - * @author mikael emtinger / http://gomo.se/ - * @author timknip / http://www.floorplanner.com/ - * @author bhouston / http://exocortex.com - * @author WestLangley / http://github.com/WestLangley - */ - - -THREE.Matrix4 = function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { - - this.elements = new Float32Array( 16 ); - - // TODO: if n11 is undefined, then just set to identity, otherwise copy all other values into matrix - // we should not support semi specification of Matrix4, it is just weird. - - var te = this.elements; - - te[0] = ( n11 !== undefined ) ? n11 : 1; te[4] = n12 || 0; te[8] = n13 || 0; te[12] = n14 || 0; - te[1] = n21 || 0; te[5] = ( n22 !== undefined ) ? n22 : 1; te[9] = n23 || 0; te[13] = n24 || 0; - te[2] = n31 || 0; te[6] = n32 || 0; te[10] = ( n33 !== undefined ) ? n33 : 1; te[14] = n34 || 0; - te[3] = n41 || 0; te[7] = n42 || 0; te[11] = n43 || 0; te[15] = ( n44 !== undefined ) ? n44 : 1; - -}; - -THREE.Matrix4.prototype = { - - constructor: THREE.Matrix4, - - set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { - - var te = this.elements; - - te[0] = n11; te[4] = n12; te[8] = n13; te[12] = n14; - te[1] = n21; te[5] = n22; te[9] = n23; te[13] = n24; - te[2] = n31; te[6] = n32; te[10] = n33; te[14] = n34; - te[3] = n41; te[7] = n42; te[11] = n43; te[15] = n44; - - return this; - - }, - - identity: function () { - - this.set( - - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 - - ); - - return this; - - }, - - copy: function ( m ) { - - this.elements.set( m.elements ); - - return this; - - }, - - extractPosition: function ( m ) { - - console.warn( 'DEPRECATED: Matrix4\'s .extractPosition() has been renamed to .copyPosition().' ); - return this.copyPosition( m ); - - }, - - copyPosition: function ( m ) { - - var te = this.elements; - var me = m.elements; - - te[12] = me[12]; - te[13] = me[13]; - te[14] = me[14]; - - return this; - - }, - - extractRotation: function () { - - var v1 = new THREE.Vector3(); - - return function ( m ) { - - var te = this.elements; - var me = m.elements; - - var scaleX = 1 / v1.set( me[0], me[1], me[2] ).length(); - var scaleY = 1 / v1.set( me[4], me[5], me[6] ).length(); - var scaleZ = 1 / v1.set( me[8], me[9], me[10] ).length(); - - te[0] = me[0] * scaleX; - te[1] = me[1] * scaleX; - te[2] = me[2] * scaleX; - - te[4] = me[4] * scaleY; - te[5] = me[5] * scaleY; - te[6] = me[6] * scaleY; - - te[8] = me[8] * scaleZ; - te[9] = me[9] * scaleZ; - te[10] = me[10] * scaleZ; - - return this; - - }; - - }(), - - makeRotationFromEuler: function ( euler ) { - - if ( euler instanceof THREE.Euler === false ) { - - console.error( 'ERROR: Matrix\'s .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.' ); - - } - - var te = this.elements; - - var x = euler.x, y = euler.y, z = euler.z; - var a = Math.cos( x ), b = Math.sin( x ); - var c = Math.cos( y ), d = Math.sin( y ); - var e = Math.cos( z ), f = Math.sin( z ); - - if ( euler.order === 'XYZ' ) { - - var ae = a * e, af = a * f, be = b * e, bf = b * f; - - te[0] = c * e; - te[4] = - c * f; - te[8] = d; - - te[1] = af + be * d; - te[5] = ae - bf * d; - te[9] = - b * c; - - te[2] = bf - ae * d; - te[6] = be + af * d; - te[10] = a * c; - - } else if ( euler.order === 'YXZ' ) { - - var ce = c * e, cf = c * f, de = d * e, df = d * f; - - te[0] = ce + df * b; - te[4] = de * b - cf; - te[8] = a * d; - - te[1] = a * f; - te[5] = a * e; - te[9] = - b; - - te[2] = cf * b - de; - te[6] = df + ce * b; - te[10] = a * c; - - } else if ( euler.order === 'ZXY' ) { - - var ce = c * e, cf = c * f, de = d * e, df = d * f; - - te[0] = ce - df * b; - te[4] = - a * f; - te[8] = de + cf * b; - - te[1] = cf + de * b; - te[5] = a * e; - te[9] = df - ce * b; - - te[2] = - a * d; - te[6] = b; - te[10] = a * c; - - } else if ( euler.order === 'ZYX' ) { - - var ae = a * e, af = a * f, be = b * e, bf = b * f; - - te[0] = c * e; - te[4] = be * d - af; - te[8] = ae * d + bf; - - te[1] = c * f; - te[5] = bf * d + ae; - te[9] = af * d - be; - - te[2] = - d; - te[6] = b * c; - te[10] = a * c; - - } else if ( euler.order === 'YZX' ) { - - var ac = a * c, ad = a * d, bc = b * c, bd = b * d; - - te[0] = c * e; - te[4] = bd - ac * f; - te[8] = bc * f + ad; - - te[1] = f; - te[5] = a * e; - te[9] = - b * e; - - te[2] = - d * e; - te[6] = ad * f + bc; - te[10] = ac - bd * f; - - } else if ( euler.order === 'XZY' ) { - - var ac = a * c, ad = a * d, bc = b * c, bd = b * d; - - te[0] = c * e; - te[4] = - f; - te[8] = d * e; - - te[1] = ac * f + bd; - te[5] = a * e; - te[9] = ad * f - bc; - - te[2] = bc * f - ad; - te[6] = b * e; - te[10] = bd * f + ac; - - } - - // last column - te[3] = 0; - te[7] = 0; - te[11] = 0; - - // bottom row - te[12] = 0; - te[13] = 0; - te[14] = 0; - te[15] = 1; - - return this; - - }, - - setRotationFromQuaternion: function ( q ) { - - console.warn( 'DEPRECATED: Matrix4\'s .setRotationFromQuaternion() has been deprecated in favor of makeRotationFromQuaternion. Please update your code.' ); - - return this.makeRotationFromQuaternion( q ); - - }, - - makeRotationFromQuaternion: function ( q ) { - - var te = this.elements; - - var x = q.x, y = q.y, z = q.z, w = q.w; - var x2 = x + x, y2 = y + y, z2 = z + z; - var xx = x * x2, xy = x * y2, xz = x * z2; - var yy = y * y2, yz = y * z2, zz = z * z2; - var wx = w * x2, wy = w * y2, wz = w * z2; - - te[0] = 1 - ( yy + zz ); - te[4] = xy - wz; - te[8] = xz + wy; - - te[1] = xy + wz; - te[5] = 1 - ( xx + zz ); - te[9] = yz - wx; - - te[2] = xz - wy; - te[6] = yz + wx; - te[10] = 1 - ( xx + yy ); - - // last column - te[3] = 0; - te[7] = 0; - te[11] = 0; - - // bottom row - te[12] = 0; - te[13] = 0; - te[14] = 0; - te[15] = 1; - - return this; - - }, - - lookAt: function() { - - var x = new THREE.Vector3(); - var y = new THREE.Vector3(); - var z = new THREE.Vector3(); - - return function ( eye, target, up ) { - - var te = this.elements; - - z.subVectors( eye, target ).normalize(); - - if ( z.length() === 0 ) { - - z.z = 1; - - } - - x.crossVectors( up, z ).normalize(); - - if ( x.length() === 0 ) { - - z.x += 0.0001; - x.crossVectors( up, z ).normalize(); - - } - - y.crossVectors( z, x ); - - - te[0] = x.x; te[4] = y.x; te[8] = z.x; - te[1] = x.y; te[5] = y.y; te[9] = z.y; - te[2] = x.z; te[6] = y.z; te[10] = z.z; - - return this; - - }; - - }(), - - multiply: function ( m, n ) { - - if ( n !== undefined ) { - - console.warn( 'DEPRECATED: Matrix4\'s .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); - return this.multiplyMatrices( m, n ); - - } - - return this.multiplyMatrices( this, m ); - - }, - - multiplyMatrices: function ( a, b ) { - - var ae = a.elements; - var be = b.elements; - var te = this.elements; - - var a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12]; - var a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13]; - var a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14]; - var a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15]; - - var b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12]; - var b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13]; - var b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14]; - var b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15]; - - te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; - te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; - te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; - te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; - - te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; - te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; - te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; - te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; - - te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; - te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; - te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; - te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; - - te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; - te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; - te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; - te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; - - return this; - - }, - - multiplyToArray: function ( a, b, r ) { - - var te = this.elements; - - this.multiplyMatrices( a, b ); - - r[ 0 ] = te[0]; r[ 1 ] = te[1]; r[ 2 ] = te[2]; r[ 3 ] = te[3]; - r[ 4 ] = te[4]; r[ 5 ] = te[5]; r[ 6 ] = te[6]; r[ 7 ] = te[7]; - r[ 8 ] = te[8]; r[ 9 ] = te[9]; r[ 10 ] = te[10]; r[ 11 ] = te[11]; - r[ 12 ] = te[12]; r[ 13 ] = te[13]; r[ 14 ] = te[14]; r[ 15 ] = te[15]; - - return this; - - }, - - multiplyScalar: function ( s ) { - - var te = this.elements; - - te[0] *= s; te[4] *= s; te[8] *= s; te[12] *= s; - te[1] *= s; te[5] *= s; te[9] *= s; te[13] *= s; - te[2] *= s; te[6] *= s; te[10] *= s; te[14] *= s; - te[3] *= s; te[7] *= s; te[11] *= s; te[15] *= s; - - return this; - - }, - - multiplyVector3: function ( vector ) { - - console.warn( 'DEPRECATED: Matrix4\'s .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' ); - return vector.applyProjection( this ); - - }, - - multiplyVector4: function ( vector ) { - - console.warn( 'DEPRECATED: Matrix4\'s .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); - return vector.applyMatrix4( this ); - - }, - - multiplyVector3Array: function() { - - var v1 = new THREE.Vector3(); - - return function ( a ) { - - for ( var i = 0, il = a.length; i < il; i += 3 ) { - - v1.x = a[ i ]; - v1.y = a[ i + 1 ]; - v1.z = a[ i + 2 ]; - - v1.applyProjection( this ); - - a[ i ] = v1.x; - a[ i + 1 ] = v1.y; - a[ i + 2 ] = v1.z; - - } - - return a; - - }; - - }(), - - rotateAxis: function ( v ) { - - console.warn( 'DEPRECATED: Matrix4\'s .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); - - v.transformDirection( this ); - - }, - - crossVector: function ( vector ) { - - console.warn( 'DEPRECATED: Matrix4\'s .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); - return vector.applyMatrix4( this ); - - }, - - determinant: function () { - - var te = this.elements; - - var n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12]; - var n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13]; - var n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14]; - var n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15]; - - //TODO: make this more efficient - //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) - - return ( - n41 * ( - +n14 * n23 * n32 - -n13 * n24 * n32 - -n14 * n22 * n33 - +n12 * n24 * n33 - +n13 * n22 * n34 - -n12 * n23 * n34 - ) + - n42 * ( - +n11 * n23 * n34 - -n11 * n24 * n33 - +n14 * n21 * n33 - -n13 * n21 * n34 - +n13 * n24 * n31 - -n14 * n23 * n31 - ) + - n43 * ( - +n11 * n24 * n32 - -n11 * n22 * n34 - -n14 * n21 * n32 - +n12 * n21 * n34 - +n14 * n22 * n31 - -n12 * n24 * n31 - ) + - n44 * ( - -n13 * n22 * n31 - -n11 * n23 * n32 - +n11 * n22 * n33 - +n13 * n21 * n32 - -n12 * n21 * n33 - +n12 * n23 * n31 - ) - - ); - - }, - - transpose: function () { - - var te = this.elements; - var tmp; - - tmp = te[1]; te[1] = te[4]; te[4] = tmp; - tmp = te[2]; te[2] = te[8]; te[8] = tmp; - tmp = te[6]; te[6] = te[9]; te[9] = tmp; - - tmp = te[3]; te[3] = te[12]; te[12] = tmp; - tmp = te[7]; te[7] = te[13]; te[13] = tmp; - tmp = te[11]; te[11] = te[14]; te[14] = tmp; - - return this; - - }, - - flattenToArray: function ( flat ) { - - var te = this.elements; - flat[ 0 ] = te[0]; flat[ 1 ] = te[1]; flat[ 2 ] = te[2]; flat[ 3 ] = te[3]; - flat[ 4 ] = te[4]; flat[ 5 ] = te[5]; flat[ 6 ] = te[6]; flat[ 7 ] = te[7]; - flat[ 8 ] = te[8]; flat[ 9 ] = te[9]; flat[ 10 ] = te[10]; flat[ 11 ] = te[11]; - flat[ 12 ] = te[12]; flat[ 13 ] = te[13]; flat[ 14 ] = te[14]; flat[ 15 ] = te[15]; - - return flat; - - }, - - flattenToArrayOffset: function( flat, offset ) { - - var te = this.elements; - flat[ offset ] = te[0]; - flat[ offset + 1 ] = te[1]; - flat[ offset + 2 ] = te[2]; - flat[ offset + 3 ] = te[3]; - - flat[ offset + 4 ] = te[4]; - flat[ offset + 5 ] = te[5]; - flat[ offset + 6 ] = te[6]; - flat[ offset + 7 ] = te[7]; - - flat[ offset + 8 ] = te[8]; - flat[ offset + 9 ] = te[9]; - flat[ offset + 10 ] = te[10]; - flat[ offset + 11 ] = te[11]; - - flat[ offset + 12 ] = te[12]; - flat[ offset + 13 ] = te[13]; - flat[ offset + 14 ] = te[14]; - flat[ offset + 15 ] = te[15]; - - return flat; - - }, - - getPosition: function() { - - var v1 = new THREE.Vector3(); - - return function () { - - console.warn( 'DEPRECATED: Matrix4\'s .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); - - var te = this.elements; - return v1.set( te[12], te[13], te[14] ); - - }; - - }(), - - setPosition: function ( v ) { - - var te = this.elements; - - te[12] = v.x; - te[13] = v.y; - te[14] = v.z; - - return this; - - }, - - getInverse: function ( m, throwOnInvertible ) { - - // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm - var te = this.elements; - var me = m.elements; - - var n11 = me[0], n12 = me[4], n13 = me[8], n14 = me[12]; - var n21 = me[1], n22 = me[5], n23 = me[9], n24 = me[13]; - var n31 = me[2], n32 = me[6], n33 = me[10], n34 = me[14]; - var n41 = me[3], n42 = me[7], n43 = me[11], n44 = me[15]; - - te[0] = n23*n34*n42 - n24*n33*n42 + n24*n32*n43 - n22*n34*n43 - n23*n32*n44 + n22*n33*n44; - te[4] = n14*n33*n42 - n13*n34*n42 - n14*n32*n43 + n12*n34*n43 + n13*n32*n44 - n12*n33*n44; - te[8] = n13*n24*n42 - n14*n23*n42 + n14*n22*n43 - n12*n24*n43 - n13*n22*n44 + n12*n23*n44; - te[12] = n14*n23*n32 - n13*n24*n32 - n14*n22*n33 + n12*n24*n33 + n13*n22*n34 - n12*n23*n34; - te[1] = n24*n33*n41 - n23*n34*n41 - n24*n31*n43 + n21*n34*n43 + n23*n31*n44 - n21*n33*n44; - te[5] = n13*n34*n41 - n14*n33*n41 + n14*n31*n43 - n11*n34*n43 - n13*n31*n44 + n11*n33*n44; - te[9] = n14*n23*n41 - n13*n24*n41 - n14*n21*n43 + n11*n24*n43 + n13*n21*n44 - n11*n23*n44; - te[13] = n13*n24*n31 - n14*n23*n31 + n14*n21*n33 - n11*n24*n33 - n13*n21*n34 + n11*n23*n34; - te[2] = n22*n34*n41 - n24*n32*n41 + n24*n31*n42 - n21*n34*n42 - n22*n31*n44 + n21*n32*n44; - te[6] = n14*n32*n41 - n12*n34*n41 - n14*n31*n42 + n11*n34*n42 + n12*n31*n44 - n11*n32*n44; - te[10] = n12*n24*n41 - n14*n22*n41 + n14*n21*n42 - n11*n24*n42 - n12*n21*n44 + n11*n22*n44; - te[14] = n14*n22*n31 - n12*n24*n31 - n14*n21*n32 + n11*n24*n32 + n12*n21*n34 - n11*n22*n34; - te[3] = n23*n32*n41 - n22*n33*n41 - n23*n31*n42 + n21*n33*n42 + n22*n31*n43 - n21*n32*n43; - te[7] = n12*n33*n41 - n13*n32*n41 + n13*n31*n42 - n11*n33*n42 - n12*n31*n43 + n11*n32*n43; - te[11] = n13*n22*n41 - n12*n23*n41 - n13*n21*n42 + n11*n23*n42 + n12*n21*n43 - n11*n22*n43; - te[15] = n12*n23*n31 - n13*n22*n31 + n13*n21*n32 - n11*n23*n32 - n12*n21*n33 + n11*n22*n33; - - var det = n11 * te[ 0 ] + n21 * te[ 4 ] + n31 * te[ 8 ] + n41 * te[ 12 ]; - - if ( det == 0 ) { - - var msg = "Matrix4.getInverse(): can't invert matrix, determinant is 0"; - - if ( throwOnInvertible || false ) { - - throw new Error( msg ); - - } else { - - console.warn( msg ); - - } - - this.identity(); - - return this; - } - - this.multiplyScalar( 1 / det ); - - return this; - - }, - - translate: function ( v ) { - - console.warn( 'DEPRECATED: Matrix4\'s .translate() has been removed.'); - - }, - - rotateX: function ( angle ) { - - console.warn( 'DEPRECATED: Matrix4\'s .rotateX() has been removed.'); - - }, - - rotateY: function ( angle ) { - - console.warn( 'DEPRECATED: Matrix4\'s .rotateY() has been removed.'); - - }, - - rotateZ: function ( angle ) { - - console.warn( 'DEPRECATED: Matrix4\'s .rotateZ() has been removed.'); - - }, - - rotateByAxis: function ( axis, angle ) { - - console.warn( 'DEPRECATED: Matrix4\'s .rotateByAxis() has been removed.'); - - }, - - scale: function ( v ) { - - var te = this.elements; - var x = v.x, y = v.y, z = v.z; - - te[0] *= x; te[4] *= y; te[8] *= z; - te[1] *= x; te[5] *= y; te[9] *= z; - te[2] *= x; te[6] *= y; te[10] *= z; - te[3] *= x; te[7] *= y; te[11] *= z; - - return this; - - }, - - getMaxScaleOnAxis: function () { - - var te = this.elements; - - var scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2]; - var scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6]; - var scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10]; - - return Math.sqrt( Math.max( scaleXSq, Math.max( scaleYSq, scaleZSq ) ) ); - - }, - - makeTranslation: function ( x, y, z ) { - - this.set( - - 1, 0, 0, x, - 0, 1, 0, y, - 0, 0, 1, z, - 0, 0, 0, 1 - - ); - - return this; - - }, - - makeRotationX: function ( theta ) { - - var c = Math.cos( theta ), s = Math.sin( theta ); - - this.set( - - 1, 0, 0, 0, - 0, c, -s, 0, - 0, s, c, 0, - 0, 0, 0, 1 - - ); - - return this; - - }, - - makeRotationY: function ( theta ) { - - var c = Math.cos( theta ), s = Math.sin( theta ); - - this.set( - - c, 0, s, 0, - 0, 1, 0, 0, - -s, 0, c, 0, - 0, 0, 0, 1 - - ); - - return this; - - }, - - makeRotationZ: function ( theta ) { - - var c = Math.cos( theta ), s = Math.sin( theta ); - - this.set( - - c, -s, 0, 0, - s, c, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 - - ); - - return this; - - }, - - makeRotationAxis: function ( axis, angle ) { - - // Based on http://www.gamedev.net/reference/articles/article1199.asp - - var c = Math.cos( angle ); - var s = Math.sin( angle ); - var t = 1 - c; - var x = axis.x, y = axis.y, z = axis.z; - var tx = t * x, ty = t * y; - - this.set( - - tx * x + c, tx * y - s * z, tx * z + s * y, 0, - tx * y + s * z, ty * y + c, ty * z - s * x, 0, - tx * z - s * y, ty * z + s * x, t * z * z + c, 0, - 0, 0, 0, 1 - - ); - - return this; - - }, - - makeScale: function ( x, y, z ) { - - this.set( - - x, 0, 0, 0, - 0, y, 0, 0, - 0, 0, z, 0, - 0, 0, 0, 1 - - ); - - return this; - - }, - - compose: function ( position, quaternion, scale ) { - - this.makeRotationFromQuaternion( quaternion ); - this.scale( scale ); - this.setPosition( position ); - - return this; - - }, - - decompose: function () { - - var vector = new THREE.Vector3(); - var matrix = new THREE.Matrix4(); - - return function ( position, quaternion, scale ) { - - var te = this.elements; - - var sx = vector.set( te[0], te[1], te[2] ).length(); - var sy = vector.set( te[4], te[5], te[6] ).length(); - var sz = vector.set( te[8], te[9], te[10] ).length(); - - // if determine is negative, we need to invert one scale - var det = this.determinant(); - if( det < 0 ) { - sx = -sx; - } - - position.x = te[12]; - position.y = te[13]; - position.z = te[14]; - - // scale the rotation part - - matrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy() - - var invSX = 1 / sx; - var invSY = 1 / sy; - var invSZ = 1 / sz; - - matrix.elements[0] *= invSX; - matrix.elements[1] *= invSX; - matrix.elements[2] *= invSX; - - matrix.elements[4] *= invSY; - matrix.elements[5] *= invSY; - matrix.elements[6] *= invSY; - - matrix.elements[8] *= invSZ; - matrix.elements[9] *= invSZ; - matrix.elements[10] *= invSZ; - - quaternion.setFromRotationMatrix( matrix ); - - scale.x = sx; - scale.y = sy; - scale.z = sz; - - return this; - - }; - - }(), - - makeFrustum: function ( left, right, bottom, top, near, far ) { - - var te = this.elements; - var x = 2 * near / ( right - left ); - var y = 2 * near / ( top - bottom ); - - var a = ( right + left ) / ( right - left ); - var b = ( top + bottom ) / ( top - bottom ); - var c = - ( far + near ) / ( far - near ); - var d = - 2 * far * near / ( far - near ); - - te[0] = x; te[4] = 0; te[8] = a; te[12] = 0; - te[1] = 0; te[5] = y; te[9] = b; te[13] = 0; - te[2] = 0; te[6] = 0; te[10] = c; te[14] = d; - te[3] = 0; te[7] = 0; te[11] = - 1; te[15] = 0; - - return this; - - }, - - makePerspective: function ( fov, aspect, near, far ) { - - var ymax = near * Math.tan( THREE.Math.degToRad( fov * 0.5 ) ); - var ymin = - ymax; - var xmin = ymin * aspect; - var xmax = ymax * aspect; - - return this.makeFrustum( xmin, xmax, ymin, ymax, near, far ); - - }, - - makeOrthographic: function ( left, right, top, bottom, near, far ) { - - var te = this.elements; - var w = right - left; - var h = top - bottom; - var p = far - near; - - var x = ( right + left ) / w; - var y = ( top + bottom ) / h; - var z = ( far + near ) / p; - - te[0] = 2 / w; te[4] = 0; te[8] = 0; te[12] = -x; - te[1] = 0; te[5] = 2 / h; te[9] = 0; te[13] = -y; - te[2] = 0; te[6] = 0; te[10] = -2/p; te[14] = -z; - te[3] = 0; te[7] = 0; te[11] = 0; te[15] = 1; - - return this; - - }, - - fromArray: function ( array ) { - - this.elements.set( array ); - - return this; - - }, - - toArray: function () { - - var te = this.elements; - - return [ - te[ 0 ], te[ 1 ], te[ 2 ], te[ 3 ], - te[ 4 ], te[ 5 ], te[ 6 ], te[ 7 ], - te[ 8 ], te[ 9 ], te[ 10 ], te[ 11 ], - te[ 12 ], te[ 13 ], te[ 14 ], te[ 15 ] - ]; - - }, - - clone: function () { - - var te = this.elements; - - return new THREE.Matrix4( - - te[0], te[4], te[8], te[12], - te[1], te[5], te[9], te[13], - te[2], te[6], te[10], te[14], - te[3], te[7], te[11], te[15] - - ); - - } - -}; - -/** - * @author bhouston / http://exocortex.com - */ - -THREE.Ray = function ( origin, direction ) { - - this.origin = ( origin !== undefined ) ? origin : new THREE.Vector3(); - this.direction = ( direction !== undefined ) ? direction : new THREE.Vector3(); - -}; - -THREE.Ray.prototype = { - - constructor: THREE.Ray, - - set: function ( origin, direction ) { - - this.origin.copy( origin ); - this.direction.copy( direction ); - - return this; - - }, - - copy: function ( ray ) { - - this.origin.copy( ray.origin ); - this.direction.copy( ray.direction ); - - return this; - - }, - - at: function ( t, optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - - return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); - - }, - - recast: function () { - - var v1 = new THREE.Vector3(); - - return function ( t ) { - - this.origin.copy( this.at( t, v1 ) ); - - return this; - - }; - - }(), - - closestPointToPoint: function ( point, optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - result.subVectors( point, this.origin ); - var directionDistance = result.dot( this.direction ); - - if ( directionDistance < 0 ) { - - return result.copy( this.origin ); - - } - - return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); - - }, - - distanceToPoint: function () { - - var v1 = new THREE.Vector3(); - - return function ( point ) { - - var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); - - // point behind the ray - - if ( directionDistance < 0 ) { - - return this.origin.distanceTo( point ); - - } - - v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); - - return v1.distanceTo( point ); - - }; - - }(), - - distanceSqToSegment: function( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { - - // from http://www.geometrictools.com/LibMathematics/Distance/Wm5DistRay3Segment3.cpp - // It returns the min distance between the ray and the segment - // defined by v0 and v1 - // It can also set two optional targets : - // - The closest point on the ray - // - The closest point on the segment - - var segCenter = v0.clone().add( v1 ).multiplyScalar( 0.5 ); - var segDir = v1.clone().sub( v0 ).normalize(); - var segExtent = v0.distanceTo( v1 ) * 0.5; - var diff = this.origin.clone().sub( segCenter ); - var a01 = - this.direction.dot( segDir ); - var b0 = diff.dot( this.direction ); - var b1 = - diff.dot( segDir ); - var c = diff.lengthSq(); - var det = Math.abs( 1 - a01 * a01 ); - var s0, s1, sqrDist, extDet; - - if ( det >= 0 ) { - - // The ray and segment are not parallel. - - s0 = a01 * b1 - b0; - s1 = a01 * b0 - b1; - extDet = segExtent * det; - - if ( s0 >= 0 ) { - - if ( s1 >= - extDet ) { - - if ( s1 <= extDet ) { - - // region 0 - // Minimum at interior points of ray and segment. - - var invDet = 1 / det; - s0 *= invDet; - s1 *= invDet; - sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; - - } else { - - // region 1 - - s1 = segExtent; - s0 = Math.max( 0, - ( a01 * s1 + b0) ); - sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - - } - - } else { - - // region 5 - - s1 = - segExtent; - s0 = Math.max( 0, - ( a01 * s1 + b0) ); - sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - - } - - } else { - - if ( s1 <= - extDet) { - - // region 4 - - s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); - s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); - sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - - } else if ( s1 <= extDet ) { - - // region 3 - - s0 = 0; - s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); - sqrDist = s1 * ( s1 + 2 * b1 ) + c; - - } else { - - // region 2 - - s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); - s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); - sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - - } - - } - - } else { - - // Ray and segment are parallel. - - s1 = ( a01 > 0 ) ? - segExtent : segExtent; - s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); - sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; - - } - - if ( optionalPointOnRay ) { - - optionalPointOnRay.copy( this.direction.clone().multiplyScalar( s0 ).add( this.origin ) ); - - } - - if ( optionalPointOnSegment ) { - - optionalPointOnSegment.copy( segDir.clone().multiplyScalar( s1 ).add( segCenter ) ); - - } - - return sqrDist; - - }, - - isIntersectionSphere: function ( sphere ) { - - return this.distanceToPoint( sphere.center ) <= sphere.radius; - - }, - - isIntersectionPlane: function ( plane ) { - - // check if the ray lies on the plane first - - var distToPoint = plane.distanceToPoint( this.origin ); - - if ( distToPoint === 0 ) { - - return true; - - } - - var denominator = plane.normal.dot( this.direction ); - - if ( denominator * distToPoint < 0 ) { - - return true - - } - - // ray origin is behind the plane (and is pointing behind it) - - return false; - - }, - - distanceToPlane: function ( plane ) { - - var denominator = plane.normal.dot( this.direction ); - if ( denominator == 0 ) { - - // line is coplanar, return origin - if( plane.distanceToPoint( this.origin ) == 0 ) { - - return 0; - - } - - // Null is preferable to undefined since undefined means.... it is undefined - - return null; - - } - - var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; - - // Return if the ray never intersects the plane - - return t >= 0 ? t : null; - - }, - - intersectPlane: function ( plane, optionalTarget ) { - - var t = this.distanceToPlane( plane ); - - if ( t === null ) { - - return null; - } - - return this.at( t, optionalTarget ); - - }, - - isIntersectionBox: function () { - - var v = new THREE.Vector3(); - - return function ( box ) { - - return this.intersectBox( box, v ) !== null; - - } - - }(), - - intersectBox: function ( box , optionalTarget ) { - - // http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-7-intersecting-simple-shapes/ray-box-intersection/ - - var tmin,tmax,tymin,tymax,tzmin,tzmax; - - var invdirx = 1/this.direction.x, - invdiry = 1/this.direction.y, - invdirz = 1/this.direction.z; - - var origin = this.origin; - - if (invdirx >= 0) { - - tmin = (box.min.x - origin.x) * invdirx; - tmax = (box.max.x - origin.x) * invdirx; - - } else { - - tmin = (box.max.x - origin.x) * invdirx; - tmax = (box.min.x - origin.x) * invdirx; - } - - if (invdiry >= 0) { - - tymin = (box.min.y - origin.y) * invdiry; - tymax = (box.max.y - origin.y) * invdiry; - - } else { - - tymin = (box.max.y - origin.y) * invdiry; - tymax = (box.min.y - origin.y) * invdiry; - } - - if ((tmin > tymax) || (tymin > tmax)) return null; - - // These lines also handle the case where tmin or tmax is NaN - // (result of 0 * Infinity). x !== x returns true if x is NaN - - if (tymin > tmin || tmin !== tmin ) tmin = tymin; - - if (tymax < tmax || tmax !== tmax ) tmax = tymax; - - if (invdirz >= 0) { - - tzmin = (box.min.z - origin.z) * invdirz; - tzmax = (box.max.z - origin.z) * invdirz; - - } else { - - tzmin = (box.max.z - origin.z) * invdirz; - tzmax = (box.min.z - origin.z) * invdirz; - } - - if ((tmin > tzmax) || (tzmin > tmax)) return null; - - if (tzmin > tmin || tmin !== tmin ) tmin = tzmin; - - if (tzmax < tmax || tmax !== tmax ) tmax = tzmax; - - //return point closest to the ray (positive side) - - if ( tmax < 0 ) return null; - - return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); - - }, - - intersectTriangle: function() { - - // Compute the offset origin, edges, and normal. - var diff = new THREE.Vector3(); - var edge1 = new THREE.Vector3(); - var edge2 = new THREE.Vector3(); - var normal = new THREE.Vector3(); - - return function ( a, b, c, backfaceCulling, optionalTarget ) { - - // from http://www.geometrictools.com/LibMathematics/Intersection/Wm5IntrRay3Triangle3.cpp - - edge1.subVectors( b, a ); - edge2.subVectors( c, a ); - normal.crossVectors( edge1, edge2 ); - - // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, - // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by - // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) - // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) - // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) - var DdN = this.direction.dot( normal ); - var sign; - - if ( DdN > 0 ) { - - if ( backfaceCulling ) return null; - sign = 1; - - } else if ( DdN < 0 ) { - - sign = - 1; - DdN = - DdN; - - } else { - - return null; - - } - - diff.subVectors( this.origin, a ); - var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); - - // b1 < 0, no intersection - if ( DdQxE2 < 0 ) { - - return null; - - } - - var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); - - // b2 < 0, no intersection - if ( DdE1xQ < 0 ) { - - return null; - - } - - // b1+b2 > 1, no intersection - if ( DdQxE2 + DdE1xQ > DdN ) { - - return null; - - } - - // Line intersects triangle, check if ray does. - var QdN = - sign * diff.dot( normal ); - - // t < 0, no intersection - if ( QdN < 0 ) { - - return null; - - } - - // Ray intersects triangle. - return this.at( QdN / DdN, optionalTarget ); - - } - - }(), - - applyMatrix4: function ( matrix4 ) { - - this.direction.add( this.origin ).applyMatrix4( matrix4 ); - this.origin.applyMatrix4( matrix4 ); - this.direction.sub( this.origin ); - this.direction.normalize(); - - return this; - }, - - equals: function ( ray ) { - - return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); - - }, - - clone: function () { - - return new THREE.Ray().copy( this ); - - } - -}; - -/** - * @author bhouston / http://exocortex.com - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Sphere = function ( center, radius ) { - - this.center = ( center !== undefined ) ? center : new THREE.Vector3(); - this.radius = ( radius !== undefined ) ? radius : 0; - -}; - -THREE.Sphere.prototype = { - - constructor: THREE.Sphere, - - set: function ( center, radius ) { - - this.center.copy( center ); - this.radius = radius; - - return this; - }, - - - setFromPoints: function () { - - var box = new THREE.Box3(); - - return function ( points, optionalCenter ) { - - var center = this.center; - - if ( optionalCenter !== undefined ) { - - center.copy( optionalCenter ); - - } else { - - box.setFromPoints( points ).center( center ); - - } - - var maxRadiusSq = 0; - - for ( var i = 0, il = points.length; i < il; i ++ ) { - - maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); - - } - - this.radius = Math.sqrt( maxRadiusSq ); - - return this; - - }; - - }(), - - copy: function ( sphere ) { - - this.center.copy( sphere.center ); - this.radius = sphere.radius; - - return this; - - }, - - empty: function () { - - return ( this.radius <= 0 ); - - }, - - containsPoint: function ( point ) { - - return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); - - }, - - distanceToPoint: function ( point ) { - - return ( point.distanceTo( this.center ) - this.radius ); - - }, - - intersectsSphere: function ( sphere ) { - - var radiusSum = this.radius + sphere.radius; - - return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); - - }, - - clampPoint: function ( point, optionalTarget ) { - - var deltaLengthSq = this.center.distanceToSquared( point ); - - var result = optionalTarget || new THREE.Vector3(); - result.copy( point ); - - if ( deltaLengthSq > ( this.radius * this.radius ) ) { - - result.sub( this.center ).normalize(); - result.multiplyScalar( this.radius ).add( this.center ); - - } - - return result; - - }, - - getBoundingBox: function ( optionalTarget ) { - - var box = optionalTarget || new THREE.Box3(); - - box.set( this.center, this.center ); - box.expandByScalar( this.radius ); - - return box; - - }, - - applyMatrix4: function ( matrix ) { - - this.center.applyMatrix4( matrix ); - this.radius = this.radius * matrix.getMaxScaleOnAxis(); - - return this; - - }, - - translate: function ( offset ) { - - this.center.add( offset ); - - return this; - - }, - - equals: function ( sphere ) { - - return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); - - }, - - clone: function () { - - return new THREE.Sphere().copy( this ); - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author bhouston / http://exocortex.com - */ - -THREE.Frustum = function ( p0, p1, p2, p3, p4, p5 ) { - - this.planes = [ - - ( p0 !== undefined ) ? p0 : new THREE.Plane(), - ( p1 !== undefined ) ? p1 : new THREE.Plane(), - ( p2 !== undefined ) ? p2 : new THREE.Plane(), - ( p3 !== undefined ) ? p3 : new THREE.Plane(), - ( p4 !== undefined ) ? p4 : new THREE.Plane(), - ( p5 !== undefined ) ? p5 : new THREE.Plane() - - ]; - -}; - -THREE.Frustum.prototype = { - - constructor: THREE.Frustum, - - set: function ( p0, p1, p2, p3, p4, p5 ) { - - var planes = this.planes; - - planes[0].copy( p0 ); - planes[1].copy( p1 ); - planes[2].copy( p2 ); - planes[3].copy( p3 ); - planes[4].copy( p4 ); - planes[5].copy( p5 ); - - return this; - - }, - - copy: function ( frustum ) { - - var planes = this.planes; - - for( var i = 0; i < 6; i ++ ) { - - planes[i].copy( frustum.planes[i] ); - - } - - return this; - - }, - - setFromMatrix: function ( m ) { - - var planes = this.planes; - var me = m.elements; - var me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3]; - var me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7]; - var me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11]; - var me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15]; - - planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); - planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); - planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); - planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); - planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); - planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); - - return this; - - }, - - intersectsObject: function () { - - var sphere = new THREE.Sphere(); - - return function ( object ) { - - var geometry = object.geometry; - - if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); - - sphere.copy( geometry.boundingSphere ); - sphere.applyMatrix4( object.matrixWorld ); - - return this.intersectsSphere( sphere ); - - }; - - }(), - - intersectsSphere: function ( sphere ) { - - var planes = this.planes; - var center = sphere.center; - var negRadius = -sphere.radius; - - for ( var i = 0; i < 6; i ++ ) { - - var distance = planes[ i ].distanceToPoint( center ); - - if ( distance < negRadius ) { - - return false; - - } - - } - - return true; - - }, - - intersectsBox : function() { - - var p1 = new THREE.Vector3(), - p2 = new THREE.Vector3(); - - return function( box ) { - - var planes = this.planes; - - for ( var i = 0; i < 6 ; i ++ ) { - - var plane = planes[i]; - - p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; - p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; - p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; - p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; - p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; - p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; - - var d1 = plane.distanceToPoint( p1 ); - var d2 = plane.distanceToPoint( p2 ); - - // if both outside plane, no intersection - - if ( d1 < 0 && d2 < 0 ) { - - return false; - - } - } - - return true; - }; - - }(), - - - containsPoint: function ( point ) { - - var planes = this.planes; - - for ( var i = 0; i < 6; i ++ ) { - - if ( planes[ i ].distanceToPoint( point ) < 0 ) { - - return false; - - } - - } - - return true; - - }, - - clone: function () { - - return new THREE.Frustum().copy( this ); - - } - -}; - -/** - * @author bhouston / http://exocortex.com - */ - -THREE.Plane = function ( normal, constant ) { - - this.normal = ( normal !== undefined ) ? normal : new THREE.Vector3( 1, 0, 0 ); - this.constant = ( constant !== undefined ) ? constant : 0; - -}; - -THREE.Plane.prototype = { - - constructor: THREE.Plane, - - set: function ( normal, constant ) { - - this.normal.copy( normal ); - this.constant = constant; - - return this; - - }, - - setComponents: function ( x, y, z, w ) { - - this.normal.set( x, y, z ); - this.constant = w; - - return this; - - }, - - setFromNormalAndCoplanarPoint: function ( normal, point ) { - - this.normal.copy( normal ); - this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized - - return this; - - }, - - setFromCoplanarPoints: function() { - - var v1 = new THREE.Vector3(); - var v2 = new THREE.Vector3(); - - return function ( a, b, c ) { - - var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); - - // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? - - this.setFromNormalAndCoplanarPoint( normal, a ); - - return this; - - }; - - }(), - - - copy: function ( plane ) { - - this.normal.copy( plane.normal ); - this.constant = plane.constant; - - return this; - - }, - - normalize: function () { - - // Note: will lead to a divide by zero if the plane is invalid. - - var inverseNormalLength = 1.0 / this.normal.length(); - this.normal.multiplyScalar( inverseNormalLength ); - this.constant *= inverseNormalLength; - - return this; - - }, - - negate: function () { - - this.constant *= -1; - this.normal.negate(); - - return this; - - }, - - distanceToPoint: function ( point ) { - - return this.normal.dot( point ) + this.constant; - - }, - - distanceToSphere: function ( sphere ) { - - return this.distanceToPoint( sphere.center ) - sphere.radius; - - }, - - projectPoint: function ( point, optionalTarget ) { - - return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); - - }, - - orthoPoint: function ( point, optionalTarget ) { - - var perpendicularMagnitude = this.distanceToPoint( point ); - - var result = optionalTarget || new THREE.Vector3(); - return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); - - }, - - isIntersectionLine: function ( line ) { - - // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. - - var startSign = this.distanceToPoint( line.start ); - var endSign = this.distanceToPoint( line.end ); - - return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); - - }, - - intersectLine: function() { - - var v1 = new THREE.Vector3(); - - return function ( line, optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - - var direction = line.delta( v1 ); - - var denominator = this.normal.dot( direction ); - - if ( denominator == 0 ) { - - // line is coplanar, return origin - if( this.distanceToPoint( line.start ) == 0 ) { - - return result.copy( line.start ); - - } - - // Unsure if this is the correct method to handle this case. - return undefined; - - } - - var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; - - if( t < 0 || t > 1 ) { - - return undefined; - - } - - return result.copy( direction ).multiplyScalar( t ).add( line.start ); - - }; - - }(), - - - coplanarPoint: function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - return result.copy( this.normal ).multiplyScalar( - this.constant ); - - }, - - applyMatrix4: function() { - - var v1 = new THREE.Vector3(); - var v2 = new THREE.Vector3(); - var m1 = new THREE.Matrix3(); - - return function ( matrix, optionalNormalMatrix ) { - - // compute new normal based on theory here: - // http://www.songho.ca/opengl/gl_normaltransform.html - var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); - var newNormal = v1.copy( this.normal ).applyMatrix3( normalMatrix ); - - var newCoplanarPoint = this.coplanarPoint( v2 ); - newCoplanarPoint.applyMatrix4( matrix ); - - this.setFromNormalAndCoplanarPoint( newNormal, newCoplanarPoint ); - - return this; - - }; - - }(), - - translate: function ( offset ) { - - this.constant = this.constant - offset.dot( this.normal ); - - return this; - - }, - - equals: function ( plane ) { - - return plane.normal.equals( this.normal ) && ( plane.constant == this.constant ); - - }, - - clone: function () { - - return new THREE.Plane().copy( this ); - - } - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Math = { - - PI2: Math.PI * 2, - - generateUUID: function () { - - // http://www.broofa.com/Tools/Math.uuid.htm - - var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); - var uuid = new Array(36); - var rnd = 0, r; - - return function () { - - for ( var i = 0; i < 36; i ++ ) { - - if ( i == 8 || i == 13 || i == 18 || i == 23 ) { - - uuid[ i ] = '-'; - - } else if ( i == 14 ) { - - uuid[ i ] = '4'; - - } else { - - if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0; - r = rnd & 0xf; - rnd = rnd >> 4; - uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; - - } - } - - return uuid.join(''); - - }; - - }(), - - // Clamp value to range - - clamp: function ( x, a, b ) { - - return ( x < a ) ? a : ( ( x > b ) ? b : x ); - - }, - - // Clamp value to range to range - - mapLinear: function ( x, a1, a2, b1, b2 ) { - - return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); - - }, - - // http://en.wikipedia.org/wiki/Smoothstep - - smoothstep: function ( x, min, max ) { - - if ( x <= min ) return 0; - if ( x >= max ) return 1; - - x = ( x - min )/( max - min ); - - return x*x*(3 - 2*x); - - }, - - smootherstep: function ( x, min, max ) { - - if ( x <= min ) return 0; - if ( x >= max ) return 1; - - x = ( x - min )/( max - min ); - - return x*x*x*(x*(x*6 - 15) + 10); - - }, - - // Random float from <0, 1> with 16 bits of randomness - // (standard Math.random() creates repetitive patterns when applied over larger space) - - random16: function () { - - return ( 65280 * Math.random() + 255 * Math.random() ) / 65535; - - }, - - // Random integer from interval - - randInt: function ( low, high ) { - - return low + Math.floor( Math.random() * ( high - low + 1 ) ); - - }, - - // Random float from interval - - randFloat: function ( low, high ) { - - return low + Math.random() * ( high - low ); - - }, - - // Random float from <-range/2, range/2> interval - - randFloatSpread: function ( range ) { - - return range * ( 0.5 - Math.random() ); - - }, - - sign: function ( x ) { - - return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : 0; - - }, - - degToRad: function() { - - var degreeToRadiansFactor = Math.PI / 180; - - return function ( degrees ) { - - return degrees * degreeToRadiansFactor; - - }; - - }(), - - radToDeg: function() { - - var radianToDegreesFactor = 180 / Math.PI; - - return function ( radians ) { - - return radians * radianToDegreesFactor; - - }; - - }(), - - isPowerOfTwo: function ( value ) { - return ( value & ( value - 1 ) ) === 0 && value !== 0; - } - -}; - -/** - * Spline from Tween.js, slightly optimized (and trashed) - * http://sole.github.com/tween.js/examples/05_spline.html - * - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Spline = function ( points ) { - - this.points = points; - - var c = [], v3 = { x: 0, y: 0, z: 0 }, - point, intPoint, weight, w2, w3, - pa, pb, pc, pd; - - this.initFromArray = function( a ) { - - this.points = []; - - for ( var i = 0; i < a.length; i++ ) { - - this.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] }; - - } - - }; - - this.getPoint = function ( k ) { - - point = ( this.points.length - 1 ) * k; - intPoint = Math.floor( point ); - weight = point - intPoint; - - c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1; - c[ 1 ] = intPoint; - c[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1; - c[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2; - - pa = this.points[ c[ 0 ] ]; - pb = this.points[ c[ 1 ] ]; - pc = this.points[ c[ 2 ] ]; - pd = this.points[ c[ 3 ] ]; - - w2 = weight * weight; - w3 = weight * w2; - - v3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 ); - v3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 ); - v3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 ); - - return v3; - - }; - - this.getControlPointsArray = function () { - - var i, p, l = this.points.length, - coords = []; - - for ( i = 0; i < l; i ++ ) { - - p = this.points[ i ]; - coords[ i ] = [ p.x, p.y, p.z ]; - - } - - return coords; - - }; - - // approximate length by summing linear segments - - this.getLength = function ( nSubDivisions ) { - - var i, index, nSamples, position, - point = 0, intPoint = 0, oldIntPoint = 0, - oldPosition = new THREE.Vector3(), - tmpVec = new THREE.Vector3(), - chunkLengths = [], - totalLength = 0; - - // first point has 0 length - - chunkLengths[ 0 ] = 0; - - if ( !nSubDivisions ) nSubDivisions = 100; - - nSamples = this.points.length * nSubDivisions; - - oldPosition.copy( this.points[ 0 ] ); - - for ( i = 1; i < nSamples; i ++ ) { - - index = i / nSamples; - - position = this.getPoint( index ); - tmpVec.copy( position ); - - totalLength += tmpVec.distanceTo( oldPosition ); - - oldPosition.copy( position ); - - point = ( this.points.length - 1 ) * index; - intPoint = Math.floor( point ); - - if ( intPoint != oldIntPoint ) { - - chunkLengths[ intPoint ] = totalLength; - oldIntPoint = intPoint; - - } - - } - - // last point ends with total length - - chunkLengths[ chunkLengths.length ] = totalLength; - - return { chunks: chunkLengths, total: totalLength }; - - }; - - this.reparametrizeByArcLength = function ( samplingCoef ) { - - var i, j, - index, indexCurrent, indexNext, - linearDistance, realDistance, - sampling, position, - newpoints = [], - tmpVec = new THREE.Vector3(), - sl = this.getLength(); - - newpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() ); - - for ( i = 1; i < this.points.length; i++ ) { - - //tmpVec.copy( this.points[ i - 1 ] ); - //linearDistance = tmpVec.distanceTo( this.points[ i ] ); - - realDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ]; - - sampling = Math.ceil( samplingCoef * realDistance / sl.total ); - - indexCurrent = ( i - 1 ) / ( this.points.length - 1 ); - indexNext = i / ( this.points.length - 1 ); - - for ( j = 1; j < sampling - 1; j++ ) { - - index = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent ); - - position = this.getPoint( index ); - newpoints.push( tmpVec.copy( position ).clone() ); - - } - - newpoints.push( tmpVec.copy( this.points[ i ] ).clone() ); - - } - - this.points = newpoints; - - }; - - // Catmull-Rom - - function interpolate( p0, p1, p2, p3, t, t2, t3 ) { - - var v0 = ( p2 - p0 ) * 0.5, - v1 = ( p3 - p1 ) * 0.5; - - return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1; - - }; - -}; - -/** - * @author bhouston / http://exocortex.com - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Triangle = function ( a, b, c ) { - - this.a = ( a !== undefined ) ? a : new THREE.Vector3(); - this.b = ( b !== undefined ) ? b : new THREE.Vector3(); - this.c = ( c !== undefined ) ? c : new THREE.Vector3(); - -}; - -THREE.Triangle.normal = function() { - - var v0 = new THREE.Vector3(); - - return function ( a, b, c, optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - - result.subVectors( c, b ); - v0.subVectors( a, b ); - result.cross( v0 ); - - var resultLengthSq = result.lengthSq(); - if( resultLengthSq > 0 ) { - - return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); - - } - - return result.set( 0, 0, 0 ); - - }; - -}(); - -// static/instance method to calculate barycoordinates -// based on: http://www.blackpawn.com/texts/pointinpoly/default.html -THREE.Triangle.barycoordFromPoint = function() { - - var v0 = new THREE.Vector3(); - var v1 = new THREE.Vector3(); - var v2 = new THREE.Vector3(); - - return function ( point, a, b, c, optionalTarget ) { - - v0.subVectors( c, a ); - v1.subVectors( b, a ); - v2.subVectors( point, a ); - - var dot00 = v0.dot( v0 ); - var dot01 = v0.dot( v1 ); - var dot02 = v0.dot( v2 ); - var dot11 = v1.dot( v1 ); - var dot12 = v1.dot( v2 ); - - var denom = ( dot00 * dot11 - dot01 * dot01 ); - - var result = optionalTarget || new THREE.Vector3(); - - // colinear or singular triangle - if( denom == 0 ) { - // arbitrary location outside of triangle? - // not sure if this is the best idea, maybe should be returning undefined - return result.set( -2, -1, -1 ); - } - - var invDenom = 1 / denom; - var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; - var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; - - // barycoordinates must always sum to 1 - return result.set( 1 - u - v, v, u ); - - }; - -}(); - -THREE.Triangle.containsPoint = function() { - - var v1 = new THREE.Vector3(); - - return function ( point, a, b, c ) { - - var result = THREE.Triangle.barycoordFromPoint( point, a, b, c, v1 ); - - return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); - - }; - -}(); - -THREE.Triangle.prototype = { - - constructor: THREE.Triangle, - - set: function ( a, b, c ) { - - this.a.copy( a ); - this.b.copy( b ); - this.c.copy( c ); - - return this; - - }, - - setFromPointsAndIndices: function ( points, i0, i1, i2 ) { - - this.a.copy( points[i0] ); - this.b.copy( points[i1] ); - this.c.copy( points[i2] ); - - return this; - - }, - - copy: function ( triangle ) { - - this.a.copy( triangle.a ); - this.b.copy( triangle.b ); - this.c.copy( triangle.c ); - - return this; - - }, - - area: function() { - - var v0 = new THREE.Vector3(); - var v1 = new THREE.Vector3(); - - return function () { - - v0.subVectors( this.c, this.b ); - v1.subVectors( this.a, this.b ); - - return v0.cross( v1 ).length() * 0.5; - - }; - - }(), - - midpoint: function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Vector3(); - return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); - - }, - - normal: function ( optionalTarget ) { - - return THREE.Triangle.normal( this.a, this.b, this.c, optionalTarget ); - - }, - - plane: function ( optionalTarget ) { - - var result = optionalTarget || new THREE.Plane(); - - return result.setFromCoplanarPoints( this.a, this.b, this.c ); - - }, - - barycoordFromPoint: function ( point, optionalTarget ) { - - return THREE.Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); - - }, - - containsPoint: function ( point ) { - - return THREE.Triangle.containsPoint( point, this.a, this.b, this.c ); - - }, - - equals: function ( triangle ) { - - return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); - - }, - - clone: function () { - - return new THREE.Triangle().copy( this ); - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Vertex = function ( v ) { - - console.warn( 'THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.') - return v; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.UV = function ( u, v ) { - - console.warn( 'THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.') - return new THREE.Vector2( u, v ); - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Clock = function ( autoStart ) { - - this.autoStart = ( autoStart !== undefined ) ? autoStart : true; - - this.startTime = 0; - this.oldTime = 0; - this.elapsedTime = 0; - - this.running = false; - -}; - -THREE.Clock.prototype = { - - constructor: THREE.Clock, - - start: function () { - - this.startTime = self.performance !== undefined && self.performance.now !== undefined - ? self.performance.now() - : Date.now(); - - this.oldTime = this.startTime; - this.running = true; - }, - - stop: function () { - - this.getElapsedTime(); - this.running = false; - - }, - - getElapsedTime: function () { - - this.getDelta(); - return this.elapsedTime; - - }, - - getDelta: function () { - - var diff = 0; - - if ( this.autoStart && ! this.running ) { - - this.start(); - - } - - if ( this.running ) { - - var newTime = self.performance !== undefined && self.performance.now !== undefined - ? self.performance.now() - : Date.now(); - - diff = 0.001 * ( newTime - this.oldTime ); - this.oldTime = newTime; - - this.elapsedTime += diff; - - } - - return diff; - - } - -}; - -/** - * https://github.com/mrdoob/eventdispatcher.js/ - */ - -THREE.EventDispatcher = function () {} - -THREE.EventDispatcher.prototype = { - - constructor: THREE.EventDispatcher, - - apply: function ( object ) { - - object.addEventListener = THREE.EventDispatcher.prototype.addEventListener; - object.hasEventListener = THREE.EventDispatcher.prototype.hasEventListener; - object.removeEventListener = THREE.EventDispatcher.prototype.removeEventListener; - object.dispatchEvent = THREE.EventDispatcher.prototype.dispatchEvent; - - }, - - addEventListener: function ( type, listener ) { - - if ( this._listeners === undefined ) this._listeners = {}; - - var listeners = this._listeners; - - if ( listeners[ type ] === undefined ) { - - listeners[ type ] = []; - - } - - if ( listeners[ type ].indexOf( listener ) === - 1 ) { - - listeners[ type ].push( listener ); - - } - - }, - - hasEventListener: function ( type, listener ) { - - if ( this._listeners === undefined ) return false; - - var listeners = this._listeners; - - if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) { - - return true; - - } - - return false; - - }, - - removeEventListener: function ( type, listener ) { - - if ( this._listeners === undefined ) return; - - var listeners = this._listeners; - var listenerArray = listeners[ type ]; - - if ( listenerArray !== undefined ) { - - var index = listenerArray.indexOf( listener ); - - if ( index !== - 1 ) { - - listenerArray.splice( index, 1 ); - - } - - } - - }, - - dispatchEvent: function () { - - var array = []; - - return function ( event ) { - - if ( this._listeners === undefined ) return; - - var listeners = this._listeners; - var listenerArray = listeners[ event.type ]; - - if ( listenerArray !== undefined ) { - - event.target = this; - - var length = listenerArray.length; - - for ( var i = 0; i < length; i ++ ) { - - array[ i ] = listenerArray[ i ]; - - } - - for ( var i = 0; i < length; i ++ ) { - - array[ i ].call( this, event ); - - } - - } - - }; - - }() - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author bhouston / http://exocortex.com/ - * @author stephomi / http://stephaneginier.com/ - */ - -( function ( THREE ) { - - THREE.Raycaster = function ( origin, direction, near, far ) { - - this.ray = new THREE.Ray( origin, direction ); - // direction is assumed to be normalized (for accurate distance calculations) - - this.near = near || 0; - this.far = far || Infinity; - - }; - - var sphere = new THREE.Sphere(); - var localRay = new THREE.Ray(); - var facePlane = new THREE.Plane(); - var intersectPoint = new THREE.Vector3(); - var matrixPosition = new THREE.Vector3(); - - var inverseMatrix = new THREE.Matrix4(); - - var descSort = function ( a, b ) { - - return a.distance - b.distance; - - }; - - var vA = new THREE.Vector3(); - var vB = new THREE.Vector3(); - var vC = new THREE.Vector3(); - - var intersectObject = function ( object, raycaster, intersects ) { - - if ( object instanceof THREE.Sprite ) { - - matrixPosition.setFromMatrixPosition( object.matrixWorld ); - - var distance = raycaster.ray.distanceToPoint( matrixPosition ); - - if ( distance > object.scale.x ) { - - return intersects; - - } - - intersects.push( { - - distance: distance, - point: object.position, - face: null, - object: object - - } ); - - } else if ( object instanceof THREE.LOD ) { - - matrixPosition.setFromMatrixPosition( object.matrixWorld ); - var distance = raycaster.ray.origin.distanceTo( matrixPosition ); - - intersectObject( object.getObjectForDistance( distance ), raycaster, intersects ); - - } else if ( object instanceof THREE.Mesh ) { - - var geometry = object.geometry; - - // Checking boundingSphere distance to ray - - if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); - - sphere.copy( geometry.boundingSphere ); - sphere.applyMatrix4( object.matrixWorld ); - - if ( raycaster.ray.isIntersectionSphere( sphere ) === false ) { - - return intersects; - - } - - // Check boundingBox before continuing - - inverseMatrix.getInverse( object.matrixWorld ); - localRay.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); - - if ( geometry.boundingBox !== null ) { - - if ( localRay.isIntersectionBox( geometry.boundingBox ) === false ) { - - return intersects; - - } - - } - - if ( geometry instanceof THREE.BufferGeometry ) { - - var material = object.material; - - if ( material === undefined ) return intersects; - - var attributes = geometry.attributes; - - var a, b, c; - var precision = raycaster.precision; - - if ( attributes.index !== undefined ) { - - var offsets = geometry.offsets; - var indices = attributes.index.array; - var positions = attributes.position.array; - - for ( var oi = 0, ol = offsets.length; oi < ol; ++oi ) { - - var start = offsets[ oi ].start; - var count = offsets[ oi ].count; - var index = offsets[ oi ].index; - - for ( var i = start, il = start + count; i < il; i += 3 ) { - - a = index + indices[ i ]; - b = index + indices[ i + 1 ]; - c = index + indices[ i + 2 ]; - - vA.set( - positions[ a * 3 ], - positions[ a * 3 + 1 ], - positions[ a * 3 + 2 ] - ); - vB.set( - positions[ b * 3 ], - positions[ b * 3 + 1 ], - positions[ b * 3 + 2 ] - ); - vC.set( - positions[ c * 3 ], - positions[ c * 3 + 1 ], - positions[ c * 3 + 2 ] - ); - - - if ( material.side === THREE.BackSide ) { - - var intersectionPoint = localRay.intersectTriangle( vC, vB, vA, true ); - - } else { - - var intersectionPoint = localRay.intersectTriangle( vA, vB, vC, material.side !== THREE.DoubleSide ); - - } - - if ( intersectionPoint === null ) continue; - - intersectionPoint.applyMatrix4( object.matrixWorld ); - - var distance = raycaster.ray.origin.distanceTo( intersectionPoint ); - - if ( distance < precision || distance < raycaster.near || distance > raycaster.far ) continue; - - intersects.push( { - - distance: distance, - point: intersectionPoint, - indices: [a, b, c], - face: null, - faceIndex: null, - object: object - - } ); - - } - - } - - } else { - - var offsets = geometry.offsets; - var positions = attributes.position.array; - - for ( var i = 0, il = attributes.position.array.length; i < il; i += 3 ) { - - a = i; - b = i + 1; - c = i + 2; - - vA.set( - positions[ a * 3 ], - positions[ a * 3 + 1 ], - positions[ a * 3 + 2 ] - ); - vB.set( - positions[ b * 3 ], - positions[ b * 3 + 1 ], - positions[ b * 3 + 2 ] - ); - vC.set( - positions[ c * 3 ], - positions[ c * 3 + 1 ], - positions[ c * 3 + 2 ] - ); - - - if ( material.side === THREE.BackSide ) { - - var intersectionPoint = localRay.intersectTriangle( vC, vB, vA, true ); - - } else { - - var intersectionPoint = localRay.intersectTriangle( vA, vB, vC, material.side !== THREE.DoubleSide ); - - } - - if ( intersectionPoint === null ) continue; - - intersectionPoint.applyMatrix4( object.matrixWorld ); - - var distance = raycaster.ray.origin.distanceTo( intersectionPoint ); - - if ( distance < precision || distance < raycaster.near || distance > raycaster.far ) continue; - - intersects.push( { - - distance: distance, - point: intersectionPoint, - indices: [a, b, c], - face: null, - faceIndex: null, - object: object - - } ); - - } - - } - - } else if ( geometry instanceof THREE.Geometry ) { - - var isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial; - var objectMaterials = isFaceMaterial === true ? object.material.materials : null; - - var a, b, c, d; - var precision = raycaster.precision; - - var vertices = geometry.vertices; - - for ( var f = 0, fl = geometry.faces.length; f < fl; f ++ ) { - - var face = geometry.faces[ f ]; - - var material = isFaceMaterial === true ? objectMaterials[ face.materialIndex ] : object.material; - - if ( material === undefined ) continue; - - a = vertices[ face.a ]; - b = vertices[ face.b ]; - c = vertices[ face.c ]; - - if ( material.morphTargets === true ) { - - var morphTargets = geometry.morphTargets; - var morphInfluences = object.morphTargetInfluences; - - vA.set( 0, 0, 0 ); - vB.set( 0, 0, 0 ); - vC.set( 0, 0, 0 ); - - for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { - - var influence = morphInfluences[ t ]; - - if ( influence === 0 ) continue; - - var targets = morphTargets[ t ].vertices; - - vA.x += ( targets[ face.a ].x - a.x ) * influence; - vA.y += ( targets[ face.a ].y - a.y ) * influence; - vA.z += ( targets[ face.a ].z - a.z ) * influence; - - vB.x += ( targets[ face.b ].x - b.x ) * influence; - vB.y += ( targets[ face.b ].y - b.y ) * influence; - vB.z += ( targets[ face.b ].z - b.z ) * influence; - - vC.x += ( targets[ face.c ].x - c.x ) * influence; - vC.y += ( targets[ face.c ].y - c.y ) * influence; - vC.z += ( targets[ face.c ].z - c.z ) * influence; - - } - - vA.add( a ); - vB.add( b ); - vC.add( c ); - - a = vA; - b = vB; - c = vC; - - } - - if ( material.side === THREE.BackSide ) { - - var intersectionPoint = localRay.intersectTriangle( c, b, a, true ); - - } else { - - var intersectionPoint = localRay.intersectTriangle( a, b, c, material.side !== THREE.DoubleSide ); - - } - - if ( intersectionPoint === null ) continue; - - intersectionPoint.applyMatrix4( object.matrixWorld ); - - var distance = raycaster.ray.origin.distanceTo( intersectionPoint ); - - if ( distance < precision || distance < raycaster.near || distance > raycaster.far ) continue; - - intersects.push( { - - distance: distance, - point: intersectionPoint, - face: face, - faceIndex: f, - object: object - - } ); - - } - - } - - } else if ( object instanceof THREE.Line ) { - - var precision = raycaster.linePrecision; - var precisionSq = precision * precision; - - var geometry = object.geometry; - - if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); - - // Checking boundingSphere distance to ray - - sphere.copy( geometry.boundingSphere ); - sphere.applyMatrix4( object.matrixWorld ); - - if ( raycaster.ray.isIntersectionSphere( sphere ) === false ) { - - return intersects; - - } - - inverseMatrix.getInverse( object.matrixWorld ); - localRay.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); - - /* if ( geometry instanceof THREE.BufferGeometry ) { - - } else */ if ( geometry instanceof THREE.Geometry ) { - - var vertices = geometry.vertices; - var nbVertices = vertices.length; - var interSegment = new THREE.Vector3(); - var interRay = new THREE.Vector3(); - var step = object.type === THREE.LineStrip ? 1 : 2; - - for ( var i = 0; i < nbVertices - 1; i = i + step ) { - - var distSq = localRay.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); - - if ( distSq > precisionSq ) continue; - - var distance = localRay.origin.distanceTo( interRay ); - - if ( distance < raycaster.near || distance > raycaster.far ) continue; - - intersects.push( { - - distance: distance, - // What do we want? intersection point on the ray or on the segment?? - // point: raycaster.ray.at( distance ), - point: interSegment.clone().applyMatrix4( object.matrixWorld ), - face: null, - faceIndex: null, - object: object - - } ); - - } - - } - - } - - }; - - var intersectDescendants = function ( object, raycaster, intersects ) { - - var descendants = object.getDescendants(); - - for ( var i = 0, l = descendants.length; i < l; i ++ ) { - - intersectObject( descendants[ i ], raycaster, intersects ); - - } - }; - - // - - THREE.Raycaster.prototype.precision = 0.0001; - THREE.Raycaster.prototype.linePrecision = 1; - - THREE.Raycaster.prototype.set = function ( origin, direction ) { - - this.ray.set( origin, direction ); - // direction is assumed to be normalized (for accurate distance calculations) - - }; - - THREE.Raycaster.prototype.intersectObject = function ( object, recursive ) { - - var intersects = []; - - if ( recursive === true ) { - - intersectDescendants( object, this, intersects ); - - } - - intersectObject( object, this, intersects ); - - intersects.sort( descSort ); - - return intersects; - - }; - - THREE.Raycaster.prototype.intersectObjects = function ( objects, recursive ) { - - var intersects = []; - - for ( var i = 0, l = objects.length; i < l; i ++ ) { - - intersectObject( objects[ i ], this, intersects ); - - if ( recursive === true ) { - - intersectDescendants( objects[ i ], this, intersects ); - - } - - } - - intersects.sort( descSort ); - - return intersects; - - }; - -}( THREE ) ); - -/** - * @author mrdoob / http://mrdoob.com/ - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - * @author WestLangley / http://github.com/WestLangley - */ - -THREE.Object3D = function () { - - this.id = THREE.Object3DIdCount ++; - this.uuid = THREE.Math.generateUUID(); - - this.name = ''; - - this.parent = undefined; - this.children = []; - - this.up = new THREE.Vector3( 0, 1, 0 ); - - this.position = new THREE.Vector3(); - this._rotation = new THREE.Euler(); - this._quaternion = new THREE.Quaternion(); - this.scale = new THREE.Vector3( 1, 1, 1 ); - - // keep rotation and quaternion in sync - - this._rotation._quaternion = this.quaternion; - this._quaternion._euler = this.rotation; - - this.renderDepth = null; - - this.rotationAutoUpdate = true; - - this.matrix = new THREE.Matrix4(); - this.matrixWorld = new THREE.Matrix4(); - - this.matrixAutoUpdate = true; - this.matrixWorldNeedsUpdate = true; - - this.visible = true; - - this.castShadow = false; - this.receiveShadow = false; - - this.frustumCulled = true; - - this.userData = {}; - -}; - - -THREE.Object3D.prototype = { - - constructor: THREE.Object3D, - - get rotation () { - return this._rotation; - }, - - set rotation ( value ) { - - this._rotation = value; - this._rotation._quaternion = this._quaternion; - this._quaternion._euler = this._rotation; - this._rotation._updateQuaternion(); - - }, - - get quaternion () { - return this._quaternion; - }, - - set quaternion ( value ) { - - this._quaternion = value; - this._quaternion._euler = this._rotation; - this._rotation._quaternion = this._quaternion; - this._quaternion._updateEuler(); - - }, - - get eulerOrder () { - - console.warn( 'DEPRECATED: Object3D\'s .eulerOrder has been moved to Object3D\'s .rotation.order.' ); - - return this.rotation.order; - - }, - - set eulerOrder ( value ) { - - console.warn( 'DEPRECATED: Object3D\'s .eulerOrder has been moved to Object3D\'s .rotation.order.' ); - - this.rotation.order = value; - - }, - - get useQuaternion () { - - console.warn( 'DEPRECATED: Object3D\'s .useQuaternion has been removed. The library now uses quaternions by default.' ); - - }, - - set useQuaternion ( value ) { - - console.warn( 'DEPRECATED: Object3D\'s .useQuaternion has been removed. The library now uses quaternions by default.' ); - - }, - - applyMatrix: function ( matrix ) { - - this.matrix.multiplyMatrices( matrix, this.matrix ); - - this.matrix.decompose( this.position, this.quaternion, this.scale ); - - }, - - setRotationFromAxisAngle: function ( axis, angle ) { - - // assumes axis is normalized - - this.quaternion.setFromAxisAngle( axis, angle ); - - }, - - setRotationFromEuler: function ( euler ) { - - this.quaternion.setFromEuler( euler, true ); - - }, - - setRotationFromMatrix: function ( m ) { - - // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) - - this.quaternion.setFromRotationMatrix( m ); - - }, - - setRotationFromQuaternion: function ( q ) { - - // assumes q is normalized - - this.quaternion.copy( q ); - - }, - - rotateOnAxis: function() { - - // rotate object on axis in object space - // axis is assumed to be normalized - - var q1 = new THREE.Quaternion(); - - return function ( axis, angle ) { - - q1.setFromAxisAngle( axis, angle ); - - this.quaternion.multiply( q1 ); - - return this; - - } - - }(), - - rotateX: function () { - - var v1 = new THREE.Vector3( 1, 0, 0 ); - - return function ( angle ) { - - return this.rotateOnAxis( v1, angle ); - - }; - - }(), - - rotateY: function () { - - var v1 = new THREE.Vector3( 0, 1, 0 ); - - return function ( angle ) { - - return this.rotateOnAxis( v1, angle ); - - }; - - }(), - - rotateZ: function () { - - var v1 = new THREE.Vector3( 0, 0, 1 ); - - return function ( angle ) { - - return this.rotateOnAxis( v1, angle ); - - }; - - }(), - - translateOnAxis: function () { - - // translate object by distance along axis in object space - // axis is assumed to be normalized - - var v1 = new THREE.Vector3(); - - return function ( axis, distance ) { - - v1.copy( axis ); - - v1.applyQuaternion( this.quaternion ); - - this.position.add( v1.multiplyScalar( distance ) ); - - return this; - - } - - }(), - - translate: function ( distance, axis ) { - - console.warn( 'DEPRECATED: Object3D\'s .translate() has been removed. Use .translateOnAxis( axis, distance ) instead. Note args have been changed.' ); - return this.translateOnAxis( axis, distance ); - - }, - - translateX: function () { - - var v1 = new THREE.Vector3( 1, 0, 0 ); - - return function ( distance ) { - - return this.translateOnAxis( v1, distance ); - - }; - - }(), - - translateY: function () { - - var v1 = new THREE.Vector3( 0, 1, 0 ); - - return function ( distance ) { - - return this.translateOnAxis( v1, distance ); - - }; - - }(), - - translateZ: function () { - - var v1 = new THREE.Vector3( 0, 0, 1 ); - - return function ( distance ) { - - return this.translateOnAxis( v1, distance ); - - }; - - }(), - - localToWorld: function ( vector ) { - - return vector.applyMatrix4( this.matrixWorld ); - - }, - - worldToLocal: function () { - - var m1 = new THREE.Matrix4(); - - return function ( vector ) { - - return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); - - }; - - }(), - - lookAt: function () { - - // This routine does not support objects with rotated and/or translated parent(s) - - var m1 = new THREE.Matrix4(); - - return function ( vector ) { - - m1.lookAt( vector, this.position, this.up ); - - this.quaternion.setFromRotationMatrix( m1 ); - - }; - - }(), - - add: function ( object ) { - - if ( object === this ) { - - console.warn( 'THREE.Object3D.add: An object can\'t be added as a child of itself.' ); - return; - - } - - if ( object instanceof THREE.Object3D ) { - - if ( object.parent !== undefined ) { - - object.parent.remove( object ); - - } - - object.parent = this; - object.dispatchEvent( { type: 'added' } ); - - this.children.push( object ); - - // add to scene - - var scene = this; - - while ( scene.parent !== undefined ) { - - scene = scene.parent; - - } - - if ( scene !== undefined && scene instanceof THREE.Scene ) { - - scene.__addObject( object ); - - } - - } - - }, - - remove: function ( object ) { - - var index = this.children.indexOf( object ); - - if ( index !== - 1 ) { - - object.parent = undefined; - object.dispatchEvent( { type: 'removed' } ); - - this.children.splice( index, 1 ); - - // remove from scene - - var scene = this; - - while ( scene.parent !== undefined ) { - - scene = scene.parent; - - } - - if ( scene !== undefined && scene instanceof THREE.Scene ) { - - scene.__removeObject( object ); - - } - - } - - }, - - traverse: function ( callback ) { - - callback( this ); - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - this.children[ i ].traverse( callback ); - - } - - }, - - getObjectById: function ( id, recursive ) { - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - var child = this.children[ i ]; - - if ( child.id === id ) { - - return child; - - } - - if ( recursive === true ) { - - child = child.getObjectById( id, recursive ); - - if ( child !== undefined ) { - - return child; - - } - - } - - } - - return undefined; - - }, - - getObjectByName: function ( name, recursive ) { - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - var child = this.children[ i ]; - - if ( child.name === name ) { - - return child; - - } - - if ( recursive === true ) { - - child = child.getObjectByName( name, recursive ); - - if ( child !== undefined ) { - - return child; - - } - - } - - } - - return undefined; - - }, - - getChildByName: function ( name, recursive ) { - - console.warn( 'DEPRECATED: Object3D\'s .getChildByName() has been renamed to .getObjectByName().' ); - return this.getObjectByName( name, recursive ); - - }, - - getDescendants: function ( array ) { - - if ( array === undefined ) array = []; - - Array.prototype.push.apply( array, this.children ); - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - this.children[ i ].getDescendants( array ); - - } - - return array; - - }, - - updateMatrix: function () { - - this.matrix.compose( this.position, this.quaternion, this.scale ); - - this.matrixWorldNeedsUpdate = true; - - }, - - updateMatrixWorld: function ( force ) { - - if ( this.matrixAutoUpdate === true ) this.updateMatrix(); - - if ( this.matrixWorldNeedsUpdate === true || force === true ) { - - if ( this.parent === undefined ) { - - this.matrixWorld.copy( this.matrix ); - - } else { - - this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); - - } - - this.matrixWorldNeedsUpdate = false; - - force = true; - - } - - // update children - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - this.children[ i ].updateMatrixWorld( force ); - - } - - }, - - clone: function ( object, recursive ) { - - if ( object === undefined ) object = new THREE.Object3D(); - if ( recursive === undefined ) recursive = true; - - object.name = this.name; - - object.up.copy( this.up ); - - object.position.copy( this.position ); - object.quaternion.copy( this.quaternion ); - object.scale.copy( this.scale ); - - object.renderDepth = this.renderDepth; - - object.rotationAutoUpdate = this.rotationAutoUpdate; - - object.matrix.copy( this.matrix ); - object.matrixWorld.copy( this.matrixWorld ); - - object.matrixAutoUpdate = this.matrixAutoUpdate; - object.matrixWorldNeedsUpdate = this.matrixWorldNeedsUpdate; - - object.visible = this.visible; - - object.castShadow = this.castShadow; - object.receiveShadow = this.receiveShadow; - - object.frustumCulled = this.frustumCulled; - - object.userData = JSON.parse( JSON.stringify( this.userData ) ); - - if ( recursive === true ) { - - for ( var i = 0; i < this.children.length; i ++ ) { - - var child = this.children[ i ]; - object.add( child.clone() ); - - } - - } - - return object; - - } - -}; - -THREE.EventDispatcher.prototype.apply( THREE.Object3D.prototype ); - -THREE.Object3DIdCount = 0; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author supereggbert / http://www.paulbrunt.co.uk/ - * @author julianwa / https://github.com/julianwa - */ - -THREE.Projector = function () { - - var _object, _objectCount, _objectPool = [], _objectPoolLength = 0, - _vertex, _vertexCount, _vertexPool = [], _vertexPoolLength = 0, - _face, _faceCount, _facePool = [], _facePoolLength = 0, - _line, _lineCount, _linePool = [], _linePoolLength = 0, - _sprite, _spriteCount, _spritePool = [], _spritePoolLength = 0, - - _renderData = { objects: [], lights: [], elements: [] }, - - _vA = new THREE.Vector3(), - _vB = new THREE.Vector3(), - _vC = new THREE.Vector3(), - - _vector3 = new THREE.Vector3(), - _vector4 = new THREE.Vector4(), - - _clipBox = new THREE.Box3( new THREE.Vector3( -1, -1, -1 ), new THREE.Vector3( 1, 1, 1 ) ), - _boundingBox = new THREE.Box3(), - _points3 = new Array( 3 ), - _points4 = new Array( 4 ), - - _viewMatrix = new THREE.Matrix4(), - _viewProjectionMatrix = new THREE.Matrix4(), - - _modelMatrix, - _modelViewProjectionMatrix = new THREE.Matrix4(), - - _normalMatrix = new THREE.Matrix3(), - - _frustum = new THREE.Frustum(), - - _clippedVertex1PositionScreen = new THREE.Vector4(), - _clippedVertex2PositionScreen = new THREE.Vector4(); - - this.projectVector = function ( vector, camera ) { - - camera.matrixWorldInverse.getInverse( camera.matrixWorld ); - - _viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); - - return vector.applyProjection( _viewProjectionMatrix ); - - }; - - this.unprojectVector = function () { - - var projectionMatrixInverse = new THREE.Matrix4(); - - return function ( vector, camera ) { - - projectionMatrixInverse.getInverse( camera.projectionMatrix ); - _viewProjectionMatrix.multiplyMatrices( camera.matrixWorld, projectionMatrixInverse ); - - return vector.applyProjection( _viewProjectionMatrix ); - - }; - - }(); - - this.pickingRay = function ( vector, camera ) { - - // set two vectors with opposing z values - vector.z = -1.0; - var end = new THREE.Vector3( vector.x, vector.y, 1.0 ); - - this.unprojectVector( vector, camera ); - this.unprojectVector( end, camera ); - - // find direction from vector to end - end.sub( vector ).normalize(); - - return new THREE.Raycaster( vector, end ); - - }; - - var projectObject = function ( object ) { - - if ( object.visible === false ) return; - - if ( object instanceof THREE.Light ) { - - _renderData.lights.push( object ); - - } else if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Sprite ) { - - if ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) { - - _object = getNextObjectInPool(); - _object.id = object.id; - _object.object = object; - - if ( object.renderDepth !== null ) { - - _object.z = object.renderDepth; - - } else { - - _vector3.setFromMatrixPosition( object.matrixWorld ); - _vector3.applyProjection( _viewProjectionMatrix ); - _object.z = _vector3.z; - - } - - _renderData.objects.push( _object ); - - } - - } - - for ( var i = 0, l = object.children.length; i < l; i ++ ) { - - projectObject( object.children[ i ] ); - - } - - }; - - var projectGraph = function ( root, sortObjects ) { - - _objectCount = 0; - - _renderData.objects.length = 0; - _renderData.lights.length = 0; - - projectObject( root ); - - if ( sortObjects === true ) { - - _renderData.objects.sort( painterSort ); - - } - - }; - - var RenderList = function () { - - var normals = []; - - var object = null; - var normalMatrix = new THREE.Matrix3(); - - var setObject = function ( value ) { - - object = value; - normalMatrix.getNormalMatrix( object.matrixWorld ); - - normals.length = 0; - - }; - - var projectVertex = function ( vertex ) { - - var position = vertex.position; - var positionWorld = vertex.positionWorld; - var positionScreen = vertex.positionScreen; - - positionWorld.copy( position ).applyMatrix4( _modelMatrix ); - positionScreen.copy( positionWorld ).applyMatrix4( _viewProjectionMatrix ); - - var invW = 1 / positionScreen.w; - - positionScreen.x *= invW; - positionScreen.y *= invW; - positionScreen.z *= invW; - - vertex.visible = positionScreen.x >= -1 && positionScreen.x <= 1 && - positionScreen.y >= -1 && positionScreen.y <= 1 && - positionScreen.z >= -1 && positionScreen.z <= 1; - - }; - - var pushVertex = function ( x, y, z ) { - - _vertex = getNextVertexInPool(); - _vertex.position.set( x, y, z ); - - projectVertex( _vertex ); - - }; - - var pushNormal = function ( x, y, z ) { - - normals.push( x, y, z ); - - }; - - var checkTriangleVisibility = function ( v1, v2, v3 ) { - - _points3[ 0 ] = v1.positionScreen; - _points3[ 1 ] = v2.positionScreen; - _points3[ 2 ] = v3.positionScreen; - - if ( v1.visible === true || v2.visible === true || v3.visible === true || - _clipBox.isIntersectionBox( _boundingBox.setFromPoints( _points3 ) ) ) { - - return ( ( v3.positionScreen.x - v1.positionScreen.x ) * - ( v2.positionScreen.y - v1.positionScreen.y ) - - ( v3.positionScreen.y - v1.positionScreen.y ) * - ( v2.positionScreen.x - v1.positionScreen.x ) ) < 0; - - } - - return false; - - }; - - var pushLine = function ( a, b ) { - - var v1 = _vertexPool[ a ]; - var v2 = _vertexPool[ b ]; - - _line = getNextLineInPool(); - - _line.id = object.id; - _line.v1.copy( v1 ); - _line.v2.copy( v2 ); - _line.z = ( v1.positionScreen.z + v2.positionScreen.z ) / 2; - - _line.material = object.material; - - _renderData.elements.push( _line ); - - }; - - var pushTriangle = function ( a, b, c ) { - - var v1 = _vertexPool[ a ]; - var v2 = _vertexPool[ b ]; - var v3 = _vertexPool[ c ]; - - if ( checkTriangleVisibility( v1, v2, v3 ) === true ) { - - _face = getNextFaceInPool(); - - _face.id = object.id; - _face.v1.copy( v1 ); - _face.v2.copy( v2 ); - _face.v3.copy( v3 ); - _face.z = ( v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z ) / 3; - - for ( var i = 0; i < 3; i ++ ) { - - var offset = arguments[ i ] * 3; - var normal = _face.vertexNormalsModel[ i ]; - - normal.set( normals[ offset + 0 ], normals[ offset + 1 ], normals[ offset + 2 ] ); - normal.applyMatrix3( normalMatrix ).normalize(); - - } - - _face.vertexNormalsLength = 3; - - _face.material = object.material; - - _renderData.elements.push( _face ); - - } - - }; - - return { - setObject: setObject, - projectVertex: projectVertex, - checkTriangleVisibility: checkTriangleVisibility, - pushVertex: pushVertex, - pushNormal: pushNormal, - pushLine: pushLine, - pushTriangle: pushTriangle - } - - }; - - var renderList = new RenderList(); - - this.projectScene = function ( scene, camera, sortObjects, sortElements ) { - - var object, geometry, vertices, faces, face, faceVertexNormals, faceVertexUvs, uvs, - isFaceMaterial, objectMaterials; - - _faceCount = 0; - _lineCount = 0; - _spriteCount = 0; - - _renderData.elements.length = 0; - - if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); - if ( camera.parent === undefined ) camera.updateMatrixWorld(); - - _viewMatrix.copy( camera.matrixWorldInverse.getInverse( camera.matrixWorld ) ); - _viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix ); - - _frustum.setFromMatrix( _viewProjectionMatrix ); - - projectGraph( scene, sortObjects ); - - for ( var o = 0, ol = _renderData.objects.length; o < ol; o ++ ) { - - object = _renderData.objects[ o ].object; - geometry = object.geometry; - - renderList.setObject( object ); - - _modelMatrix = object.matrixWorld; - - _vertexCount = 0; - - if ( object instanceof THREE.Mesh ) { - - if ( geometry instanceof THREE.BufferGeometry ) { - - var attributes = geometry.attributes; - var offsets = geometry.offsets; - - if ( attributes.position === undefined ) continue; - - var positions = attributes.position.array; - - for ( var i = 0, l = positions.length; i < l; i += 3 ) { - - renderList.pushVertex( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ); - - } - - var normals = attributes.normal.array; - - for ( var i = 0, l = normals.length; i < l; i += 3 ) { - - renderList.pushNormal( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ); - - } - - if ( attributes.index !== undefined ) { - - var indices = attributes.index.array; - - if ( offsets.length > 0 ) { - - for ( var o = 0; o < offsets.length; o ++ ) { - - var offset = offsets[ o ]; - var index = offset.index; - - for ( var i = offset.start, l = offset.start + offset.count; i < l; i += 3 ) { - - renderList.pushTriangle( indices[ i ] + index, indices[ i + 1 ] + index, indices[ i + 2 ] + index ); - - } - - } - - } else { - - for ( var i = 0, l = indices.length; i < l; i += 3 ) { - - renderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); - - } - - } - - } else { - - for ( var i = 0, l = positions.length / 3; i < l; i += 3 ) { - - renderList.pushTriangle( i, i + 1, i + 2 ); - - } - - } - - } else if ( geometry instanceof THREE.Geometry ) { - - vertices = geometry.vertices; - faces = geometry.faces; - faceVertexUvs = geometry.faceVertexUvs; - - _normalMatrix.getNormalMatrix( _modelMatrix ); - - isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial; - objectMaterials = isFaceMaterial === true ? object.material : null; - - for ( var v = 0, vl = vertices.length; v < vl; v ++ ) { - - var vertex = vertices[ v ]; - renderList.pushVertex( vertex.x, vertex.y, vertex.z ); - - } - - for ( var f = 0, fl = faces.length; f < fl; f ++ ) { - - face = faces[ f ]; - - var material = isFaceMaterial === true - ? objectMaterials.materials[ face.materialIndex ] - : object.material; - - if ( material === undefined ) continue; - - var side = material.side; - - var v1 = _vertexPool[ face.a ]; - var v2 = _vertexPool[ face.b ]; - var v3 = _vertexPool[ face.c ]; - - if ( material.morphTargets === true ) { - - var morphTargets = geometry.morphTargets; - var morphInfluences = object.morphTargetInfluences; - - var v1p = v1.position; - var v2p = v2.position; - var v3p = v3.position; - - _vA.set( 0, 0, 0 ); - _vB.set( 0, 0, 0 ); - _vC.set( 0, 0, 0 ); - - for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { - - var influence = morphInfluences[ t ]; - - if ( influence === 0 ) continue; - - var targets = morphTargets[ t ].vertices; - - _vA.x += ( targets[ face.a ].x - v1p.x ) * influence; - _vA.y += ( targets[ face.a ].y - v1p.y ) * influence; - _vA.z += ( targets[ face.a ].z - v1p.z ) * influence; - - _vB.x += ( targets[ face.b ].x - v2p.x ) * influence; - _vB.y += ( targets[ face.b ].y - v2p.y ) * influence; - _vB.z += ( targets[ face.b ].z - v2p.z ) * influence; - - _vC.x += ( targets[ face.c ].x - v3p.x ) * influence; - _vC.y += ( targets[ face.c ].y - v3p.y ) * influence; - _vC.z += ( targets[ face.c ].z - v3p.z ) * influence; - - } - - v1.position.add( _vA ); - v2.position.add( _vB ); - v3.position.add( _vC ); - - renderList.projectVertex( v1 ); - renderList.projectVertex( v2 ); - renderList.projectVertex( v3 ); - - } - - var visible = renderList.checkTriangleVisibility( v1, v2, v3 ); - - if ( ( visible === false && side === THREE.FrontSide ) || - ( visible === true && side === THREE.BackSide ) ) continue; - - _face = getNextFaceInPool(); - - _face.id = object.id; - _face.v1.copy( v1 ); - _face.v2.copy( v2 ); - _face.v3.copy( v3 ); - - _face.normalModel.copy( face.normal ); - - if ( visible === false && ( side === THREE.BackSide || side === THREE.DoubleSide ) ) { - - _face.normalModel.negate(); - - } - - _face.normalModel.applyMatrix3( _normalMatrix ).normalize(); - - _face.centroidModel.copy( face.centroid ).applyMatrix4( _modelMatrix ); - - faceVertexNormals = face.vertexNormals; - - for ( var n = 0, nl = Math.min( faceVertexNormals.length, 3 ); n < nl; n ++ ) { - - var normalModel = _face.vertexNormalsModel[ n ]; - normalModel.copy( faceVertexNormals[ n ] ); - - if ( visible === false && ( side === THREE.BackSide || side === THREE.DoubleSide ) ) { - - normalModel.negate(); - - } - - normalModel.applyMatrix3( _normalMatrix ).normalize(); - - } - - _face.vertexNormalsLength = faceVertexNormals.length; - - for ( var c = 0, cl = Math.min( faceVertexUvs.length, 3 ); c < cl; c ++ ) { - - uvs = faceVertexUvs[ c ][ f ]; - - if ( uvs === undefined ) continue; - - for ( var u = 0, ul = uvs.length; u < ul; u ++ ) { - - _face.uvs[ c ][ u ] = uvs[ u ]; - - } - - } - - _face.color = face.color; - _face.material = material; - - _face.z = ( v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z ) / 3; - - _renderData.elements.push( _face ); - - } - - } - - } else if ( object instanceof THREE.Line ) { - - if ( geometry instanceof THREE.BufferGeometry ) { - - var attributes = geometry.attributes; - - if ( attributes.position !== undefined ) { - - var positions = attributes.position.array; - - for ( var i = 0, l = positions.length; i < l; i += 3 ) { - - renderList.pushVertex( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ); - - } - - if ( attributes.index !== undefined ) { - - var indices = attributes.index.array; - - for ( var i = 0, l = indices.length; i < l; i += 2 ) { - - renderList.pushLine( indices[ i ], indices[ i + 1 ] ); - - } - - } else { - - for ( var i = 0, l = ( positions.length / 3 ) - 1; i < l; i ++ ) { - - renderList.pushLine( i, i + 1 ); - - } - - } - - } - - } else if ( geometry instanceof THREE.Geometry ) { - - _modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix ); - - vertices = object.geometry.vertices; - - if ( vertices.length === 0 ) continue; - - v1 = getNextVertexInPool(); - v1.positionScreen.copy( vertices[ 0 ] ).applyMatrix4( _modelViewProjectionMatrix ); - - // Handle LineStrip and LinePieces - var step = object.type === THREE.LinePieces ? 2 : 1; - - for ( var v = 1, vl = vertices.length; v < vl; v ++ ) { - - v1 = getNextVertexInPool(); - v1.positionScreen.copy( vertices[ v ] ).applyMatrix4( _modelViewProjectionMatrix ); - - if ( ( v + 1 ) % step > 0 ) continue; - - v2 = _vertexPool[ _vertexCount - 2 ]; - - _clippedVertex1PositionScreen.copy( v1.positionScreen ); - _clippedVertex2PositionScreen.copy( v2.positionScreen ); - - if ( clipLine( _clippedVertex1PositionScreen, _clippedVertex2PositionScreen ) === true ) { - - // Perform the perspective divide - _clippedVertex1PositionScreen.multiplyScalar( 1 / _clippedVertex1PositionScreen.w ); - _clippedVertex2PositionScreen.multiplyScalar( 1 / _clippedVertex2PositionScreen.w ); - - _line = getNextLineInPool(); - - _line.id = object.id; - _line.v1.positionScreen.copy( _clippedVertex1PositionScreen ); - _line.v2.positionScreen.copy( _clippedVertex2PositionScreen ); - - _line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z ); - - _line.material = object.material; - - if ( object.material.vertexColors === THREE.VertexColors ) { - - _line.vertexColors[ 0 ].copy( object.geometry.colors[ v ] ); - _line.vertexColors[ 1 ].copy( object.geometry.colors[ v - 1 ] ); - - } - - _renderData.elements.push( _line ); - - } - - } - - } - - } else if ( object instanceof THREE.Sprite ) { - - _vector4.set( _modelMatrix.elements[12], _modelMatrix.elements[13], _modelMatrix.elements[14], 1 ); - _vector4.applyMatrix4( _viewProjectionMatrix ); - - var invW = 1 / _vector4.w; - - _vector4.z *= invW; - - if ( _vector4.z >= -1 && _vector4.z <= 1 ) { - - _sprite = getNextSpriteInPool(); - _sprite.id = object.id; - _sprite.x = _vector4.x * invW; - _sprite.y = _vector4.y * invW; - _sprite.z = _vector4.z; - _sprite.object = object; - - _sprite.rotation = object.rotation; - - _sprite.scale.x = object.scale.x * Math.abs( _sprite.x - ( _vector4.x + camera.projectionMatrix.elements[0] ) / ( _vector4.w + camera.projectionMatrix.elements[12] ) ); - _sprite.scale.y = object.scale.y * Math.abs( _sprite.y - ( _vector4.y + camera.projectionMatrix.elements[5] ) / ( _vector4.w + camera.projectionMatrix.elements[13] ) ); - - _sprite.material = object.material; - - _renderData.elements.push( _sprite ); - - } - - } - - } - - if ( sortElements === true ) _renderData.elements.sort( painterSort ); - - return _renderData; - - }; - - // Pools - - function getNextObjectInPool() { - - if ( _objectCount === _objectPoolLength ) { - - var object = new THREE.RenderableObject(); - _objectPool.push( object ); - _objectPoolLength ++; - _objectCount ++; - return object; - - } - - return _objectPool[ _objectCount ++ ]; - - } - - function getNextVertexInPool() { - - if ( _vertexCount === _vertexPoolLength ) { - - var vertex = new THREE.RenderableVertex(); - _vertexPool.push( vertex ); - _vertexPoolLength ++; - _vertexCount ++; - return vertex; - - } - - return _vertexPool[ _vertexCount ++ ]; - - } - - function getNextFaceInPool() { - - if ( _faceCount === _facePoolLength ) { - - var face = new THREE.RenderableFace(); - _facePool.push( face ); - _facePoolLength ++; - _faceCount ++; - return face; - - } - - return _facePool[ _faceCount ++ ]; - - - } - - function getNextLineInPool() { - - if ( _lineCount === _linePoolLength ) { - - var line = new THREE.RenderableLine(); - _linePool.push( line ); - _linePoolLength ++; - _lineCount ++ - return line; - - } - - return _linePool[ _lineCount ++ ]; - - } - - function getNextSpriteInPool() { - - if ( _spriteCount === _spritePoolLength ) { - - var sprite = new THREE.RenderableSprite(); - _spritePool.push( sprite ); - _spritePoolLength ++; - _spriteCount ++ - return sprite; - - } - - return _spritePool[ _spriteCount ++ ]; - - } - - // - - function painterSort( a, b ) { - - if ( a.z !== b.z ) { - - return b.z - a.z; - - } else if ( a.id !== b.id ) { - - return a.id - b.id; - - } else { - - return 0; - - } - - } - - function clipLine( s1, s2 ) { - - var alpha1 = 0, alpha2 = 1, - - // Calculate the boundary coordinate of each vertex for the near and far clip planes, - // Z = -1 and Z = +1, respectively. - bc1near = s1.z + s1.w, - bc2near = s2.z + s2.w, - bc1far = - s1.z + s1.w, - bc2far = - s2.z + s2.w; - - if ( bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0 ) { - - // Both vertices lie entirely within all clip planes. - return true; - - } else if ( ( bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0 ) ) { - - // Both vertices lie entirely outside one of the clip planes. - return false; - - } else { - - // The line segment spans at least one clip plane. - - if ( bc1near < 0 ) { - - // v1 lies outside the near plane, v2 inside - alpha1 = Math.max( alpha1, bc1near / ( bc1near - bc2near ) ); - - } else if ( bc2near < 0 ) { - - // v2 lies outside the near plane, v1 inside - alpha2 = Math.min( alpha2, bc1near / ( bc1near - bc2near ) ); - - } - - if ( bc1far < 0 ) { - - // v1 lies outside the far plane, v2 inside - alpha1 = Math.max( alpha1, bc1far / ( bc1far - bc2far ) ); - - } else if ( bc2far < 0 ) { - - // v2 lies outside the far plane, v2 inside - alpha2 = Math.min( alpha2, bc1far / ( bc1far - bc2far ) ); - - } - - if ( alpha2 < alpha1 ) { - - // The line segment spans two boundaries, but is outside both of them. - // (This can't happen when we're only clipping against just near/far but good - // to leave the check here for future usage if other clip planes are added.) - return false; - - } else { - - // Update the s1 and s2 vertices to match the clipped line segment. - s1.lerp( s2, alpha1 ); - s2.lerp( s1, 1 - alpha2 ); - - return true; - - } - - } - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Face3 = function ( a, b, c, normal, color, materialIndex ) { - - this.a = a; - this.b = b; - this.c = c; - - this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3(); - this.vertexNormals = normal instanceof Array ? normal : [ ]; - - this.color = color instanceof THREE.Color ? color : new THREE.Color(); - this.vertexColors = color instanceof Array ? color : []; - - this.vertexTangents = []; - - this.materialIndex = materialIndex !== undefined ? materialIndex : 0; - - this.centroid = new THREE.Vector3(); - -}; - -THREE.Face3.prototype = { - - constructor: THREE.Face3, - - clone: function () { - - var face = new THREE.Face3( this.a, this.b, this.c ); - - face.normal.copy( this.normal ); - face.color.copy( this.color ); - face.centroid.copy( this.centroid ); - - face.materialIndex = this.materialIndex; - - var i, il; - for ( i = 0, il = this.vertexNormals.length; i < il; i ++ ) face.vertexNormals[ i ] = this.vertexNormals[ i ].clone(); - for ( i = 0, il = this.vertexColors.length; i < il; i ++ ) face.vertexColors[ i ] = this.vertexColors[ i ].clone(); - for ( i = 0, il = this.vertexTangents.length; i < il; i ++ ) face.vertexTangents[ i ] = this.vertexTangents[ i ].clone(); - - return face; - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) { - - console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.') - - return new THREE.Face3( a, b, c, normal, color, materialIndex ); - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.BufferGeometry = function () { - - this.id = THREE.GeometryIdCount ++; - this.uuid = THREE.Math.generateUUID(); - - this.name = ''; - - // attributes - - this.attributes = {}; - - // offsets for chunks when using indexed elements - - this.offsets = []; - - // boundings - - this.boundingBox = null; - this.boundingSphere = null; - -}; - -THREE.BufferGeometry.prototype = { - - constructor: THREE.BufferGeometry, - - addAttribute: function ( name, type, numItems, itemSize ) { - - this.attributes[ name ] = { - - array: new type( numItems * itemSize ), - itemSize: itemSize - - }; - - return this.attributes[ name ]; - - }, - - applyMatrix: function ( matrix ) { - - var position = this.attributes.position; - - if ( position !== undefined ) { - - matrix.multiplyVector3Array( position.array ); - position.needsUpdate = true; - - } - - var normal = this.attributes.normal; - - if ( normal !== undefined ) { - - var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); - - normalMatrix.multiplyVector3Array( normal.array ); - normal.needsUpdate = true; - - } - - }, - - computeBoundingBox: function () { - - if ( this.boundingBox === null ) { - - this.boundingBox = new THREE.Box3(); - - } - - var positions = this.attributes[ "position" ].array; - - if ( positions ) { - - var bb = this.boundingBox; - - if( positions.length >= 3 ) { - bb.min.x = bb.max.x = positions[ 0 ]; - bb.min.y = bb.max.y = positions[ 1 ]; - bb.min.z = bb.max.z = positions[ 2 ]; - } - - for ( var i = 3, il = positions.length; i < il; i += 3 ) { - - var x = positions[ i ]; - var y = positions[ i + 1 ]; - var z = positions[ i + 2 ]; - - // bounding box - - if ( x < bb.min.x ) { - - bb.min.x = x; - - } else if ( x > bb.max.x ) { - - bb.max.x = x; - - } - - if ( y < bb.min.y ) { - - bb.min.y = y; - - } else if ( y > bb.max.y ) { - - bb.max.y = y; - - } - - if ( z < bb.min.z ) { - - bb.min.z = z; - - } else if ( z > bb.max.z ) { - - bb.max.z = z; - - } - - } - - } - - if ( positions === undefined || positions.length === 0 ) { - - this.boundingBox.min.set( 0, 0, 0 ); - this.boundingBox.max.set( 0, 0, 0 ); - - } - - }, - - computeBoundingSphere: function () { - - var box = new THREE.Box3(); - var vector = new THREE.Vector3(); - - return function () { - - if ( this.boundingSphere === null ) { - - this.boundingSphere = new THREE.Sphere(); - - } - - var positions = this.attributes[ "position" ].array; - - if ( positions ) { - - box.makeEmpty(); - - var center = this.boundingSphere.center; - - for ( var i = 0, il = positions.length; i < il; i += 3 ) { - - vector.set( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ); - box.addPoint( vector ); - - } - - box.center( center ); - - var maxRadiusSq = 0; - - for ( var i = 0, il = positions.length; i < il; i += 3 ) { - - vector.set( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ); - maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); - - } - - this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); - - } - - } - - }(), - - computeVertexNormals: function () { - - if ( this.attributes[ "position" ] ) { - - var i, il; - var j, jl; - - var nVertexElements = this.attributes[ "position" ].array.length; - - if ( this.attributes[ "normal" ] === undefined ) { - - this.attributes[ "normal" ] = { - - itemSize: 3, - array: new Float32Array( nVertexElements ) - - }; - - } else { - - // reset existing normals to zero - - for ( i = 0, il = this.attributes[ "normal" ].array.length; i < il; i ++ ) { - - this.attributes[ "normal" ].array[ i ] = 0; - - } - - } - - var positions = this.attributes[ "position" ].array; - var normals = this.attributes[ "normal" ].array; - - var vA, vB, vC, x, y, z, - - pA = new THREE.Vector3(), - pB = new THREE.Vector3(), - pC = new THREE.Vector3(), - - cb = new THREE.Vector3(), - ab = new THREE.Vector3(); - - // indexed elements - - if ( this.attributes[ "index" ] ) { - - var indices = this.attributes[ "index" ].array; - - var offsets = this.offsets; - - for ( j = 0, jl = offsets.length; j < jl; ++ j ) { - - var start = offsets[ j ].start; - var count = offsets[ j ].count; - var index = offsets[ j ].index; - - for ( i = start, il = start + count; i < il; i += 3 ) { - - vA = index + indices[ i ]; - vB = index + indices[ i + 1 ]; - vC = index + indices[ i + 2 ]; - - x = positions[ vA * 3 ]; - y = positions[ vA * 3 + 1 ]; - z = positions[ vA * 3 + 2 ]; - pA.set( x, y, z ); - - x = positions[ vB * 3 ]; - y = positions[ vB * 3 + 1 ]; - z = positions[ vB * 3 + 2 ]; - pB.set( x, y, z ); - - x = positions[ vC * 3 ]; - y = positions[ vC * 3 + 1 ]; - z = positions[ vC * 3 + 2 ]; - pC.set( x, y, z ); - - cb.subVectors( pC, pB ); - ab.subVectors( pA, pB ); - cb.cross( ab ); - - normals[ vA * 3 ] += cb.x; - normals[ vA * 3 + 1 ] += cb.y; - normals[ vA * 3 + 2 ] += cb.z; - - normals[ vB * 3 ] += cb.x; - normals[ vB * 3 + 1 ] += cb.y; - normals[ vB * 3 + 2 ] += cb.z; - - normals[ vC * 3 ] += cb.x; - normals[ vC * 3 + 1 ] += cb.y; - normals[ vC * 3 + 2 ] += cb.z; - - } - - } - - // non-indexed elements (unconnected triangle soup) - - } else { - - for ( i = 0, il = positions.length; i < il; i += 9 ) { - - x = positions[ i ]; - y = positions[ i + 1 ]; - z = positions[ i + 2 ]; - pA.set( x, y, z ); - - x = positions[ i + 3 ]; - y = positions[ i + 4 ]; - z = positions[ i + 5 ]; - pB.set( x, y, z ); - - x = positions[ i + 6 ]; - y = positions[ i + 7 ]; - z = positions[ i + 8 ]; - pC.set( x, y, z ); - - cb.subVectors( pC, pB ); - ab.subVectors( pA, pB ); - cb.cross( ab ); - - normals[ i ] = cb.x; - normals[ i + 1 ] = cb.y; - normals[ i + 2 ] = cb.z; - - normals[ i + 3 ] = cb.x; - normals[ i + 4 ] = cb.y; - normals[ i + 5 ] = cb.z; - - normals[ i + 6 ] = cb.x; - normals[ i + 7 ] = cb.y; - normals[ i + 8 ] = cb.z; - - } - - } - - this.normalizeNormals(); - - this.normalsNeedUpdate = true; - - } - - }, - - normalizeNormals: function () { - - var normals = this.attributes[ "normal" ].array; - - var x, y, z, n; - - for ( var i = 0, il = normals.length; i < il; i += 3 ) { - - x = normals[ i ]; - y = normals[ i + 1 ]; - z = normals[ i + 2 ]; - - n = 1.0 / Math.sqrt( x * x + y * y + z * z ); - - normals[ i ] *= n; - normals[ i + 1 ] *= n; - normals[ i + 2 ] *= n; - - } - - }, - - computeTangents: function () { - - // based on http://www.terathon.com/code/tangent.html - // (per vertex tangents) - - if ( this.attributes[ "index" ] === undefined || - this.attributes[ "position" ] === undefined || - this.attributes[ "normal" ] === undefined || - this.attributes[ "uv" ] === undefined ) { - - console.warn( "Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()" ); - return; - - } - - var indices = this.attributes[ "index" ].array; - var positions = this.attributes[ "position" ].array; - var normals = this.attributes[ "normal" ].array; - var uvs = this.attributes[ "uv" ].array; - - var nVertices = positions.length / 3; - - if ( this.attributes[ "tangent" ] === undefined ) { - - var nTangentElements = 4 * nVertices; - - this.attributes[ "tangent" ] = { - - itemSize: 4, - array: new Float32Array( nTangentElements ) - - }; - - } - - var tangents = this.attributes[ "tangent" ].array; - - var tan1 = [], tan2 = []; - - for ( var k = 0; k < nVertices; k ++ ) { - - tan1[ k ] = new THREE.Vector3(); - tan2[ k ] = new THREE.Vector3(); - - } - - var xA, yA, zA, - xB, yB, zB, - xC, yC, zC, - - uA, vA, - uB, vB, - uC, vC, - - x1, x2, y1, y2, z1, z2, - s1, s2, t1, t2, r; - - var sdir = new THREE.Vector3(), tdir = new THREE.Vector3(); - - function handleTriangle( a, b, c ) { - - xA = positions[ a * 3 ]; - yA = positions[ a * 3 + 1 ]; - zA = positions[ a * 3 + 2 ]; - - xB = positions[ b * 3 ]; - yB = positions[ b * 3 + 1 ]; - zB = positions[ b * 3 + 2 ]; - - xC = positions[ c * 3 ]; - yC = positions[ c * 3 + 1 ]; - zC = positions[ c * 3 + 2 ]; - - uA = uvs[ a * 2 ]; - vA = uvs[ a * 2 + 1 ]; - - uB = uvs[ b * 2 ]; - vB = uvs[ b * 2 + 1 ]; - - uC = uvs[ c * 2 ]; - vC = uvs[ c * 2 + 1 ]; - - x1 = xB - xA; - x2 = xC - xA; - - y1 = yB - yA; - y2 = yC - yA; - - z1 = zB - zA; - z2 = zC - zA; - - s1 = uB - uA; - s2 = uC - uA; - - t1 = vB - vA; - t2 = vC - vA; - - r = 1.0 / ( s1 * t2 - s2 * t1 ); - - sdir.set( - ( t2 * x1 - t1 * x2 ) * r, - ( t2 * y1 - t1 * y2 ) * r, - ( t2 * z1 - t1 * z2 ) * r - ); - - tdir.set( - ( s1 * x2 - s2 * x1 ) * r, - ( s1 * y2 - s2 * y1 ) * r, - ( s1 * z2 - s2 * z1 ) * r - ); - - tan1[ a ].add( sdir ); - tan1[ b ].add( sdir ); - tan1[ c ].add( sdir ); - - tan2[ a ].add( tdir ); - tan2[ b ].add( tdir ); - tan2[ c ].add( tdir ); - - } - - var i, il; - var j, jl; - var iA, iB, iC; - - var offsets = this.offsets; - - for ( j = 0, jl = offsets.length; j < jl; ++ j ) { - - var start = offsets[ j ].start; - var count = offsets[ j ].count; - var index = offsets[ j ].index; - - for ( i = start, il = start + count; i < il; i += 3 ) { - - iA = index + indices[ i ]; - iB = index + indices[ i + 1 ]; - iC = index + indices[ i + 2 ]; - - handleTriangle( iA, iB, iC ); - - } - - } - - var tmp = new THREE.Vector3(), tmp2 = new THREE.Vector3(); - var n = new THREE.Vector3(), n2 = new THREE.Vector3(); - var w, t, test; - - function handleVertex( v ) { - - n.x = normals[ v * 3 ]; - n.y = normals[ v * 3 + 1 ]; - n.z = normals[ v * 3 + 2 ]; - - n2.copy( n ); - - t = tan1[ v ]; - - // Gram-Schmidt orthogonalize - - tmp.copy( t ); - tmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize(); - - // Calculate handedness - - tmp2.crossVectors( n2, t ); - test = tmp2.dot( tan2[ v ] ); - w = ( test < 0.0 ) ? -1.0 : 1.0; - - tangents[ v * 4 ] = tmp.x; - tangents[ v * 4 + 1 ] = tmp.y; - tangents[ v * 4 + 2 ] = tmp.z; - tangents[ v * 4 + 3 ] = w; - - } - - for ( j = 0, jl = offsets.length; j < jl; ++ j ) { - - var start = offsets[ j ].start; - var count = offsets[ j ].count; - var index = offsets[ j ].index; - - for ( i = start, il = start + count; i < il; i += 3 ) { - - iA = index + indices[ i ]; - iB = index + indices[ i + 1 ]; - iC = index + indices[ i + 2 ]; - - handleVertex( iA ); - handleVertex( iB ); - handleVertex( iC ); - - } - - } - - }, - - /* - computeOffsets - Compute the draw offset for large models by chunking the index buffer into chunks of 65k addressable vertices. - This method will effectively rewrite the index buffer and remap all attributes to match the new indices. - WARNING: This method will also expand the vertex count to prevent sprawled triangles across draw offsets. - indexBufferSize - Defaults to 65535, but allows for larger or smaller chunks. - */ - computeOffsets: function(indexBufferSize) { - - var size = indexBufferSize; - if(indexBufferSize === undefined) - size = 65535; //WebGL limits type of index buffer values to 16-bit. - - var s = Date.now(); - - var indices = this.attributes['index'].array; - var vertices = this.attributes['position'].array; - - var verticesCount = (vertices.length/3); - var facesCount = (indices.length/3); - - /* - console.log("Computing buffers in offsets of "+size+" -> indices:"+indices.length+" vertices:"+vertices.length); - console.log("Faces to process: "+(indices.length/3)); - console.log("Reordering "+verticesCount+" vertices."); - */ - - var sortedIndices = new Uint16Array( indices.length ); //16-bit buffers - var indexPtr = 0; - var vertexPtr = 0; - - var offsets = [ { start:0, count:0, index:0 } ]; - var offset = offsets[0]; - - var duplicatedVertices = 0; - var newVerticeMaps = 0; - var faceVertices = new Int32Array(6); - var vertexMap = new Int32Array( vertices.length ); - var revVertexMap = new Int32Array( vertices.length ); - for(var j = 0; j < vertices.length; j++) { vertexMap[j] = -1; revVertexMap[j] = -1; } - - /* - Traverse every face and reorder vertices in the proper offsets of 65k. - We can have more than 65k entries in the index buffer per offset, but only reference 65k values. - */ - for(var findex = 0; findex < facesCount; findex++) { - newVerticeMaps = 0; - - for(var vo = 0; vo < 3; vo++) { - var vid = indices[ findex*3 + vo ]; - if(vertexMap[vid] == -1) { - //Unmapped vertice - faceVertices[vo*2] = vid; - faceVertices[vo*2+1] = -1; - newVerticeMaps++; - } else if(vertexMap[vid] < offset.index) { - //Reused vertices from previous block (duplicate) - faceVertices[vo*2] = vid; - faceVertices[vo*2+1] = -1; - duplicatedVertices++; - } else { - //Reused vertice in the current block - faceVertices[vo*2] = vid; - faceVertices[vo*2+1] = vertexMap[vid]; - } - } - - var faceMax = vertexPtr + newVerticeMaps; - if(faceMax > (offset.index + size)) { - var new_offset = { start:indexPtr, count:0, index:vertexPtr }; - offsets.push(new_offset); - offset = new_offset; - - //Re-evaluate reused vertices in light of new offset. - for(var v = 0; v < 6; v+=2) { - var new_vid = faceVertices[v+1]; - if(new_vid > -1 && new_vid < offset.index) - faceVertices[v+1] = -1; - } - } - - //Reindex the face. - for(var v = 0; v < 6; v+=2) { - var vid = faceVertices[v]; - var new_vid = faceVertices[v+1]; - - if(new_vid === -1) - new_vid = vertexPtr++; - - vertexMap[vid] = new_vid; - revVertexMap[new_vid] = vid; - sortedIndices[indexPtr++] = new_vid - offset.index; //XXX overflows at 16bit - offset.count++; - } - } - - /* Move all attribute values to map to the new computed indices , also expand the vertice stack to match our new vertexPtr. */ - this.reorderBuffers(sortedIndices, revVertexMap, vertexPtr); - this.offsets = offsets; - - /* - var orderTime = Date.now(); - console.log("Reorder time: "+(orderTime-s)+"ms"); - console.log("Duplicated "+duplicatedVertices+" vertices."); - console.log("Compute Buffers time: "+(Date.now()-s)+"ms"); - console.log("Draw offsets: "+offsets.length); - */ - - return offsets; - }, - - /* - reoderBuffers: - Reorder attributes based on a new indexBuffer and indexMap. - indexBuffer - Uint16Array of the new ordered indices. - indexMap - Int32Array where the position is the new vertex ID and the value the old vertex ID for each vertex. - vertexCount - Amount of total vertices considered in this reordering (in case you want to grow the vertice stack). - */ - reorderBuffers: function(indexBuffer, indexMap, vertexCount) { - - /* Create a copy of all attributes for reordering. */ - var sortedAttributes = {}; - var types = [ Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array ]; - for( var attr in this.attributes ) { - if(attr == 'index') - continue; - var sourceArray = this.attributes[attr].array; - for ( var i = 0, il = types.length; i < il; i++ ) { - var type = types[i]; - if (sourceArray instanceof type) { - sortedAttributes[attr] = new type( this.attributes[attr].itemSize * vertexCount ); - break; - } - } - } - - /* Move attribute positions based on the new index map */ - for(var new_vid = 0; new_vid < vertexCount; new_vid++) { - var vid = indexMap[new_vid]; - for ( var attr in this.attributes ) { - if(attr == 'index') - continue; - var attrArray = this.attributes[attr].array; - var attrSize = this.attributes[attr].itemSize; - var sortedAttr = sortedAttributes[attr]; - for(var k = 0; k < attrSize; k++) - sortedAttr[ new_vid * attrSize + k ] = attrArray[ vid * attrSize + k ]; - } - } - - /* Carry the new sorted buffers locally */ - this.attributes['index'].array = indexBuffer; - for ( var attr in this.attributes ) { - if(attr == 'index') - continue; - this.attributes[attr].array = sortedAttributes[attr]; - this.attributes[attr].numItems = this.attributes[attr].itemSize * vertexCount; - } - }, - - clone: function () { - - var geometry = new THREE.BufferGeometry(); - - var types = [ Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array ]; - - for ( var attr in this.attributes ) { - - var sourceAttr = this.attributes[ attr ]; - var sourceArray = sourceAttr.array; - - var attribute = { - - itemSize: sourceAttr.itemSize, - array: null - - }; - - for ( var i = 0, il = types.length; i < il; i ++ ) { - - var type = types[ i ]; - - if ( sourceArray instanceof type ) { - - attribute.array = new type( sourceArray ); - break; - - } - - } - - geometry.attributes[ attr ] = attribute; - - } - - for ( var i = 0, il = this.offsets.length; i < il; i ++ ) { - - var offset = this.offsets[ i ]; - - geometry.offsets.push( { - - start: offset.start, - index: offset.index, - count: offset.count - - } ); - - } - - return geometry; - - }, - - dispose: function () { - - this.dispatchEvent( { type: 'dispose' } ); - - } - -}; - -THREE.EventDispatcher.prototype.apply( THREE.BufferGeometry.prototype ); - -/** - * @author mrdoob / http://mrdoob.com/ - * @author kile / http://kile.stravaganza.org/ - * @author alteredq / http://alteredqualia.com/ - * @author mikael emtinger / http://gomo.se/ - * @author zz85 / http://www.lab4games.net/zz85/blog - * @author bhouston / http://exocortex.com - */ - -THREE.Geometry = function () { - - this.id = THREE.GeometryIdCount ++; - this.uuid = THREE.Math.generateUUID(); - - this.name = ''; - - this.vertices = []; - this.colors = []; // one-to-one vertex colors, used in ParticleSystem and Line - - this.faces = []; - - this.faceVertexUvs = [[]]; - - this.morphTargets = []; - this.morphColors = []; - this.morphNormals = []; - - this.skinWeights = []; - this.skinIndices = []; - - this.lineDistances = []; - - this.boundingBox = null; - this.boundingSphere = null; - - this.hasTangents = false; - - this.dynamic = true; // the intermediate typed arrays will be deleted when set to false - - // update flags - - this.verticesNeedUpdate = false; - this.elementsNeedUpdate = false; - this.uvsNeedUpdate = false; - this.normalsNeedUpdate = false; - this.tangentsNeedUpdate = false; - this.colorsNeedUpdate = false; - this.lineDistancesNeedUpdate = false; - - this.buffersNeedUpdate = false; - -}; - -THREE.Geometry.prototype = { - - constructor: THREE.Geometry, - - applyMatrix: function ( matrix ) { - - var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); - - for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { - - var vertex = this.vertices[ i ]; - vertex.applyMatrix4( matrix ); - - } - - for ( var i = 0, il = this.faces.length; i < il; i ++ ) { - - var face = this.faces[ i ]; - face.normal.applyMatrix3( normalMatrix ).normalize(); - - for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { - - face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); - - } - - face.centroid.applyMatrix4( matrix ); - - } - - if ( this.boundingBox instanceof THREE.Box3 ) { - - this.computeBoundingBox(); - - } - - if ( this.boundingSphere instanceof THREE.Sphere ) { - - this.computeBoundingSphere(); - - } - - }, - - computeCentroids: function () { - - var f, fl, face; - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - face.centroid.set( 0, 0, 0 ); - - face.centroid.add( this.vertices[ face.a ] ); - face.centroid.add( this.vertices[ face.b ] ); - face.centroid.add( this.vertices[ face.c ] ); - face.centroid.divideScalar( 3 ); - - } - - }, - - computeFaceNormals: function () { - - var cb = new THREE.Vector3(), ab = new THREE.Vector3(); - - for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { - - var face = this.faces[ f ]; - - var vA = this.vertices[ face.a ]; - var vB = this.vertices[ face.b ]; - var vC = this.vertices[ face.c ]; - - cb.subVectors( vC, vB ); - ab.subVectors( vA, vB ); - cb.cross( ab ); - - cb.normalize(); - - face.normal.copy( cb ); - - } - - }, - - computeVertexNormals: function ( areaWeighted ) { - - var v, vl, f, fl, face, vertices; - - vertices = new Array( this.vertices.length ); - - for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { - - vertices[ v ] = new THREE.Vector3(); - - } - - if ( areaWeighted ) { - - // vertex normals weighted by triangle areas - // http://www.iquilezles.org/www/articles/normals/normals.htm - - var vA, vB, vC, vD; - var cb = new THREE.Vector3(), ab = new THREE.Vector3(), - db = new THREE.Vector3(), dc = new THREE.Vector3(), bc = new THREE.Vector3(); - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - vA = this.vertices[ face.a ]; - vB = this.vertices[ face.b ]; - vC = this.vertices[ face.c ]; - - cb.subVectors( vC, vB ); - ab.subVectors( vA, vB ); - cb.cross( ab ); - - vertices[ face.a ].add( cb ); - vertices[ face.b ].add( cb ); - vertices[ face.c ].add( cb ); - - } - - } else { - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - vertices[ face.a ].add( face.normal ); - vertices[ face.b ].add( face.normal ); - vertices[ face.c ].add( face.normal ); - - } - - } - - for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { - - vertices[ v ].normalize(); - - } - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - face.vertexNormals[ 0 ] = vertices[ face.a ].clone(); - face.vertexNormals[ 1 ] = vertices[ face.b ].clone(); - face.vertexNormals[ 2 ] = vertices[ face.c ].clone(); - - } - - }, - - computeMorphNormals: function () { - - var i, il, f, fl, face; - - // save original normals - // - create temp variables on first access - // otherwise just copy (for faster repeated calls) - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - if ( ! face.__originalFaceNormal ) { - - face.__originalFaceNormal = face.normal.clone(); - - } else { - - face.__originalFaceNormal.copy( face.normal ); - - } - - if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; - - for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { - - if ( ! face.__originalVertexNormals[ i ] ) { - - face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); - - } else { - - face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); - - } - - } - - } - - // use temp geometry to compute face and vertex normals for each morph - - var tmpGeo = new THREE.Geometry(); - tmpGeo.faces = this.faces; - - for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { - - // create on first access - - if ( ! this.morphNormals[ i ] ) { - - this.morphNormals[ i ] = {}; - this.morphNormals[ i ].faceNormals = []; - this.morphNormals[ i ].vertexNormals = []; - - var dstNormalsFace = this.morphNormals[ i ].faceNormals; - var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; - - var faceNormal, vertexNormals; - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - faceNormal = new THREE.Vector3(); - vertexNormals = { a: new THREE.Vector3(), b: new THREE.Vector3(), c: new THREE.Vector3() }; - - dstNormalsFace.push( faceNormal ); - dstNormalsVertex.push( vertexNormals ); - - } - - } - - var morphNormals = this.morphNormals[ i ]; - - // set vertices to morph target - - tmpGeo.vertices = this.morphTargets[ i ].vertices; - - // compute morph normals - - tmpGeo.computeFaceNormals(); - tmpGeo.computeVertexNormals(); - - // store morph normals - - var faceNormal, vertexNormals; - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - faceNormal = morphNormals.faceNormals[ f ]; - vertexNormals = morphNormals.vertexNormals[ f ]; - - faceNormal.copy( face.normal ); - - vertexNormals.a.copy( face.vertexNormals[ 0 ] ); - vertexNormals.b.copy( face.vertexNormals[ 1 ] ); - vertexNormals.c.copy( face.vertexNormals[ 2 ] ); - - } - - } - - // restore original normals - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - face.normal = face.__originalFaceNormal; - face.vertexNormals = face.__originalVertexNormals; - - } - - }, - - computeTangents: function () { - - // based on http://www.terathon.com/code/tangent.html - // tangents go to vertices - - var f, fl, v, vl, i, il, vertexIndex, - face, uv, vA, vB, vC, uvA, uvB, uvC, - x1, x2, y1, y2, z1, z2, - s1, s2, t1, t2, r, t, test, - tan1 = [], tan2 = [], - sdir = new THREE.Vector3(), tdir = new THREE.Vector3(), - tmp = new THREE.Vector3(), tmp2 = new THREE.Vector3(), - n = new THREE.Vector3(), w; - - for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { - - tan1[ v ] = new THREE.Vector3(); - tan2[ v ] = new THREE.Vector3(); - - } - - function handleTriangle( context, a, b, c, ua, ub, uc ) { - - vA = context.vertices[ a ]; - vB = context.vertices[ b ]; - vC = context.vertices[ c ]; - - uvA = uv[ ua ]; - uvB = uv[ ub ]; - uvC = uv[ uc ]; - - x1 = vB.x - vA.x; - x2 = vC.x - vA.x; - y1 = vB.y - vA.y; - y2 = vC.y - vA.y; - z1 = vB.z - vA.z; - z2 = vC.z - vA.z; - - s1 = uvB.x - uvA.x; - s2 = uvC.x - uvA.x; - t1 = uvB.y - uvA.y; - t2 = uvC.y - uvA.y; - - r = 1.0 / ( s1 * t2 - s2 * t1 ); - sdir.set( ( t2 * x1 - t1 * x2 ) * r, - ( t2 * y1 - t1 * y2 ) * r, - ( t2 * z1 - t1 * z2 ) * r ); - tdir.set( ( s1 * x2 - s2 * x1 ) * r, - ( s1 * y2 - s2 * y1 ) * r, - ( s1 * z2 - s2 * z1 ) * r ); - - tan1[ a ].add( sdir ); - tan1[ b ].add( sdir ); - tan1[ c ].add( sdir ); - - tan2[ a ].add( tdir ); - tan2[ b ].add( tdir ); - tan2[ c ].add( tdir ); - - } - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - uv = this.faceVertexUvs[ 0 ][ f ]; // use UV layer 0 for tangents - - handleTriangle( this, face.a, face.b, face.c, 0, 1, 2 ); - - } - - var faceIndex = [ 'a', 'b', 'c', 'd' ]; - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - for ( i = 0; i < Math.min( face.vertexNormals.length, 3 ); i++ ) { - - n.copy( face.vertexNormals[ i ] ); - - vertexIndex = face[ faceIndex[ i ] ]; - - t = tan1[ vertexIndex ]; - - // Gram-Schmidt orthogonalize - - tmp.copy( t ); - tmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize(); - - // Calculate handedness - - tmp2.crossVectors( face.vertexNormals[ i ], t ); - test = tmp2.dot( tan2[ vertexIndex ] ); - w = (test < 0.0) ? -1.0 : 1.0; - - face.vertexTangents[ i ] = new THREE.Vector4( tmp.x, tmp.y, tmp.z, w ); - - } - - } - - this.hasTangents = true; - - }, - - computeLineDistances: function ( ) { - - var d = 0; - var vertices = this.vertices; - - for ( var i = 0, il = vertices.length; i < il; i ++ ) { - - if ( i > 0 ) { - - d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); - - } - - this.lineDistances[ i ] = d; - - } - - }, - - computeBoundingBox: function () { - - if ( this.boundingBox === null ) { - - this.boundingBox = new THREE.Box3(); - - } - - this.boundingBox.setFromPoints( this.vertices ); - - }, - - computeBoundingSphere: function () { - - if ( this.boundingSphere === null ) { - - this.boundingSphere = new THREE.Sphere(); - - } - - this.boundingSphere.setFromPoints( this.vertices ); - - }, - - /* - * Checks for duplicate vertices with hashmap. - * Duplicated vertices are removed - * and faces' vertices are updated. - */ - - mergeVertices: function () { - - var verticesMap = {}; // Hashmap for looking up vertice by position coordinates (and making sure they are unique) - var unique = [], changes = []; - - var v, key; - var precisionPoints = 4; // number of decimal points, eg. 4 for epsilon of 0.0001 - var precision = Math.pow( 10, precisionPoints ); - var i,il, face; - var indices, k, j, jl, u; - - for ( i = 0, il = this.vertices.length; i < il; i ++ ) { - - v = this.vertices[ i ]; - key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); - - if ( verticesMap[ key ] === undefined ) { - - verticesMap[ key ] = i; - unique.push( this.vertices[ i ] ); - changes[ i ] = unique.length - 1; - - } else { - - //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); - changes[ i ] = changes[ verticesMap[ key ] ]; - - } - - }; - - - // if faces are completely degenerate after merging vertices, we - // have to remove them from the geometry. - var faceIndicesToRemove = []; - - for( i = 0, il = this.faces.length; i < il; i ++ ) { - - face = this.faces[ i ]; - - face.a = changes[ face.a ]; - face.b = changes[ face.b ]; - face.c = changes[ face.c ]; - - indices = [ face.a, face.b, face.c ]; - - var dupIndex = -1; - - // if any duplicate vertices are found in a Face3 - // we have to remove the face as nothing can be saved - for ( var n = 0; n < 3; n ++ ) { - if ( indices[ n ] == indices[ ( n + 1 ) % 3 ] ) { - - dupIndex = n; - faceIndicesToRemove.push( i ); - break; - - } - } - - } - - for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { - var idx = faceIndicesToRemove[ i ]; - - this.faces.splice( idx, 1 ); - - for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { - - this.faceVertexUvs[ j ].splice( idx, 1 ); - - } - - } - - // Use unique set of vertices - - var diff = this.vertices.length - unique.length; - this.vertices = unique; - return diff; - - }, - - // Geometry splitting - - makeGroups: ( function () { - - var geometryGroupCounter = 0; - - return function ( usesFaceMaterial ) { - - var f, fl, face, materialIndex, - groupHash, hash_map = {}; - - var numMorphTargets = this.morphTargets.length; - var numMorphNormals = this.morphNormals.length; - - this.geometryGroups = {}; - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - materialIndex = usesFaceMaterial ? face.materialIndex : 0; - - if ( ! ( materialIndex in hash_map ) ) { - - hash_map[ materialIndex ] = { 'hash': materialIndex, 'counter': 0 }; - - } - - groupHash = hash_map[ materialIndex ].hash + '_' + hash_map[ materialIndex ].counter; - - if ( ! ( groupHash in this.geometryGroups ) ) { - - this.geometryGroups[ groupHash ] = { 'faces3': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals }; - - } - - if ( this.geometryGroups[ groupHash ].vertices + 3 > 65535 ) { - - hash_map[ materialIndex ].counter += 1; - groupHash = hash_map[ materialIndex ].hash + '_' + hash_map[ materialIndex ].counter; - - if ( ! ( groupHash in this.geometryGroups ) ) { - - this.geometryGroups[ groupHash ] = { 'faces3': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals }; - - } - - } - - this.geometryGroups[ groupHash ].faces3.push( f ); - this.geometryGroups[ groupHash ].vertices += 3; - - } - - this.geometryGroupsList = []; - - for ( var g in this.geometryGroups ) { - - this.geometryGroups[ g ].id = geometryGroupCounter ++; - - this.geometryGroupsList.push( this.geometryGroups[ g ] ); - - } - - }; - - } )(), - - clone: function () { - - var geometry = new THREE.Geometry(); - - var vertices = this.vertices; - - for ( var i = 0, il = vertices.length; i < il; i ++ ) { - - geometry.vertices.push( vertices[ i ].clone() ); - - } - - var faces = this.faces; - - for ( var i = 0, il = faces.length; i < il; i ++ ) { - - geometry.faces.push( faces[ i ].clone() ); - - } - - var uvs = this.faceVertexUvs[ 0 ]; - - for ( var i = 0, il = uvs.length; i < il; i ++ ) { - - var uv = uvs[ i ], uvCopy = []; - - for ( var j = 0, jl = uv.length; j < jl; j ++ ) { - - uvCopy.push( new THREE.Vector2( uv[ j ].x, uv[ j ].y ) ); - - } - - geometry.faceVertexUvs[ 0 ].push( uvCopy ); - - } - - return geometry; - - }, - - dispose: function () { - - this.dispatchEvent( { type: 'dispose' } ); - - } - -}; - -THREE.EventDispatcher.prototype.apply( THREE.Geometry.prototype ); - -THREE.GeometryIdCount = 0; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Geometry2 = function ( size ) { - - THREE.BufferGeometry.call( this ); - - this.vertices = this.addAttribute( 'position', Float32Array, size, 3 ).array; - this.normals = this.addAttribute( 'normal', Float32Array, size, 3 ).array; - this.uvs = this.addAttribute( 'uv', Float32Array, size, 2 ).array; - - this.boundingBox = null; - this.boundingSphere = null; - -}; - -THREE.Geometry2.prototype = Object.create( THREE.BufferGeometry.prototype ); -/** - * @author mrdoob / http://mrdoob.com/ - * @author mikael emtinger / http://gomo.se/ - * @author WestLangley / http://github.com/WestLangley -*/ - -THREE.Camera = function () { - - THREE.Object3D.call( this ); - - this.matrixWorldInverse = new THREE.Matrix4(); - this.projectionMatrix = new THREE.Matrix4(); - -}; - -THREE.Camera.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.Camera.prototype.lookAt = function () { - - // This routine does not support cameras with rotated and/or translated parent(s) - - var m1 = new THREE.Matrix4(); - - return function ( vector ) { - - m1.lookAt( this.position, vector, this.up ); - - this.quaternion.setFromRotationMatrix( m1 ); - - }; - -}(); - -THREE.Camera.prototype.clone = function (camera) { - - if ( camera === undefined ) camera = new THREE.Camera(); - - THREE.Object3D.prototype.clone.call( this, camera ); - - camera.matrixWorldInverse.copy( this.matrixWorldInverse ); - camera.projectionMatrix.copy( this.projectionMatrix ); - - return camera; -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.OrthographicCamera = function ( left, right, top, bottom, near, far ) { - - THREE.Camera.call( this ); - - this.left = left; - this.right = right; - this.top = top; - this.bottom = bottom; - - this.near = ( near !== undefined ) ? near : 0.1; - this.far = ( far !== undefined ) ? far : 2000; - - this.updateProjectionMatrix(); - -}; - -THREE.OrthographicCamera.prototype = Object.create( THREE.Camera.prototype ); - -THREE.OrthographicCamera.prototype.updateProjectionMatrix = function () { - - this.projectionMatrix.makeOrthographic( this.left, this.right, this.top, this.bottom, this.near, this.far ); - -}; - -THREE.OrthographicCamera.prototype.clone = function () { - - var camera = new THREE.OrthographicCamera(); - - THREE.Camera.prototype.clone.call( this, camera ); - - camera.left = this.left; - camera.right = this.right; - camera.top = this.top; - camera.bottom = this.bottom; - - camera.near = this.near; - camera.far = this.far; - - return camera; -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author greggman / http://games.greggman.com/ - * @author zz85 / http://www.lab4games.net/zz85/blog - */ - -THREE.PerspectiveCamera = function ( fov, aspect, near, far ) { - - THREE.Camera.call( this ); - - this.fov = fov !== undefined ? fov : 50; - this.aspect = aspect !== undefined ? aspect : 1; - this.near = near !== undefined ? near : 0.1; - this.far = far !== undefined ? far : 2000; - - this.updateProjectionMatrix(); - -}; - -THREE.PerspectiveCamera.prototype = Object.create( THREE.Camera.prototype ); - - -/** - * Uses Focal Length (in mm) to estimate and set FOV - * 35mm (fullframe) camera is used if frame size is not specified; - * Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html - */ - -THREE.PerspectiveCamera.prototype.setLens = function ( focalLength, frameHeight ) { - - if ( frameHeight === undefined ) frameHeight = 24; - - this.fov = 2 * THREE.Math.radToDeg( Math.atan( frameHeight / ( focalLength * 2 ) ) ); - this.updateProjectionMatrix(); - -} - - -/** - * Sets an offset in a larger frustum. This is useful for multi-window or - * multi-monitor/multi-machine setups. - * - * For example, if you have 3x2 monitors and each monitor is 1920x1080 and - * the monitors are in grid like this - * - * +---+---+---+ - * | A | B | C | - * +---+---+---+ - * | D | E | F | - * +---+---+---+ - * - * then for each monitor you would call it like this - * - * var w = 1920; - * var h = 1080; - * var fullWidth = w * 3; - * var fullHeight = h * 2; - * - * --A-- - * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); - * --B-- - * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); - * --C-- - * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); - * --D-- - * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); - * --E-- - * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); - * --F-- - * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); - * - * Note there is no reason monitors have to be the same size or in a grid. - */ - -THREE.PerspectiveCamera.prototype.setViewOffset = function ( fullWidth, fullHeight, x, y, width, height ) { - - this.fullWidth = fullWidth; - this.fullHeight = fullHeight; - this.x = x; - this.y = y; - this.width = width; - this.height = height; - - this.updateProjectionMatrix(); - -}; - - -THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function () { - - if ( this.fullWidth ) { - - var aspect = this.fullWidth / this.fullHeight; - var top = Math.tan( THREE.Math.degToRad( this.fov * 0.5 ) ) * this.near; - var bottom = -top; - var left = aspect * bottom; - var right = aspect * top; - var width = Math.abs( right - left ); - var height = Math.abs( top - bottom ); - - this.projectionMatrix.makeFrustum( - left + this.x * width / this.fullWidth, - left + ( this.x + this.width ) * width / this.fullWidth, - top - ( this.y + this.height ) * height / this.fullHeight, - top - this.y * height / this.fullHeight, - this.near, - this.far - ); - - } else { - - this.projectionMatrix.makePerspective( this.fov, this.aspect, this.near, this.far ); - - } - -}; - -THREE.PerspectiveCamera.prototype.clone = function () { - - var camera = new THREE.PerspectiveCamera(); - - THREE.Camera.prototype.clone.call( this, camera ); - - camera.fov = this.fov; - camera.aspect = this.aspect; - camera.near = this.near; - camera.far = this.far; - - return camera; -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Light = function ( color ) { - - THREE.Object3D.call( this ); - - this.color = new THREE.Color( color ); - -}; - -THREE.Light.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.Light.prototype.clone = function ( light ) { - - if ( light === undefined ) light = new THREE.Light(); - - THREE.Object3D.prototype.clone.call( this, light ); - - light.color.copy( this.color ); - - return light; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.AmbientLight = function ( color ) { - - THREE.Light.call( this, color ); - -}; - -THREE.AmbientLight.prototype = Object.create( THREE.Light.prototype ); - -THREE.AmbientLight.prototype.clone = function () { - - var light = new THREE.AmbientLight(); - - THREE.Light.prototype.clone.call( this, light ); - - return light; - -}; - -/** - * @author MPanknin / http://www.redplant.de/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.AreaLight = function ( color, intensity ) { - - THREE.Light.call( this, color ); - - this.normal = new THREE.Vector3( 0, -1, 0 ); - this.right = new THREE.Vector3( 1, 0, 0 ); - - this.intensity = ( intensity !== undefined ) ? intensity : 1; - - this.width = 1.0; - this.height = 1.0; - - this.constantAttenuation = 1.5; - this.linearAttenuation = 0.5; - this.quadraticAttenuation = 0.1; - -}; - -THREE.AreaLight.prototype = Object.create( THREE.Light.prototype ); - - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.DirectionalLight = function ( color, intensity ) { - - THREE.Light.call( this, color ); - - this.position.set( 0, 1, 0 ); - this.target = new THREE.Object3D(); - - this.intensity = ( intensity !== undefined ) ? intensity : 1; - - this.castShadow = false; - this.onlyShadow = false; - - // - - this.shadowCameraNear = 50; - this.shadowCameraFar = 5000; - - this.shadowCameraLeft = -500; - this.shadowCameraRight = 500; - this.shadowCameraTop = 500; - this.shadowCameraBottom = -500; - - this.shadowCameraVisible = false; - - this.shadowBias = 0; - this.shadowDarkness = 0.5; - - this.shadowMapWidth = 512; - this.shadowMapHeight = 512; - - // - - this.shadowCascade = false; - - this.shadowCascadeOffset = new THREE.Vector3( 0, 0, -1000 ); - this.shadowCascadeCount = 2; - - this.shadowCascadeBias = [ 0, 0, 0 ]; - this.shadowCascadeWidth = [ 512, 512, 512 ]; - this.shadowCascadeHeight = [ 512, 512, 512 ]; - - this.shadowCascadeNearZ = [ -1.000, 0.990, 0.998 ]; - this.shadowCascadeFarZ = [ 0.990, 0.998, 1.000 ]; - - this.shadowCascadeArray = []; - - // - - this.shadowMap = null; - this.shadowMapSize = null; - this.shadowCamera = null; - this.shadowMatrix = null; - -}; - -THREE.DirectionalLight.prototype = Object.create( THREE.Light.prototype ); - -THREE.DirectionalLight.prototype.clone = function () { - - var light = new THREE.DirectionalLight(); - - THREE.Light.prototype.clone.call( this, light ); - - light.target = this.target.clone(); - - light.intensity = this.intensity; - - light.castShadow = this.castShadow; - light.onlyShadow = this.onlyShadow; - - return light; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.HemisphereLight = function ( skyColor, groundColor, intensity ) { - - THREE.Light.call( this, skyColor ); - - this.position.set( 0, 100, 0 ); - - this.groundColor = new THREE.Color( groundColor ); - this.intensity = ( intensity !== undefined ) ? intensity : 1; - -}; - -THREE.HemisphereLight.prototype = Object.create( THREE.Light.prototype ); - -THREE.HemisphereLight.prototype.clone = function () { - - var light = new THREE.HemisphereLight(); - - THREE.Light.prototype.clone.call( this, light ); - - light.groundColor.copy( this.groundColor ); - light.intensity = this.intensity; - - return light; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.PointLight = function ( color, intensity, distance ) { - - THREE.Light.call( this, color ); - - this.intensity = ( intensity !== undefined ) ? intensity : 1; - this.distance = ( distance !== undefined ) ? distance : 0; - -}; - -THREE.PointLight.prototype = Object.create( THREE.Light.prototype ); - -THREE.PointLight.prototype.clone = function () { - - var light = new THREE.PointLight(); - - THREE.Light.prototype.clone.call( this, light ); - - light.intensity = this.intensity; - light.distance = this.distance; - - return light; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SpotLight = function ( color, intensity, distance, angle, exponent ) { - - THREE.Light.call( this, color ); - - this.position.set( 0, 1, 0 ); - this.target = new THREE.Object3D(); - - this.intensity = ( intensity !== undefined ) ? intensity : 1; - this.distance = ( distance !== undefined ) ? distance : 0; - this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; - this.exponent = ( exponent !== undefined ) ? exponent : 10; - - this.castShadow = false; - this.onlyShadow = false; - - // - - this.shadowCameraNear = 50; - this.shadowCameraFar = 5000; - this.shadowCameraFov = 50; - - this.shadowCameraVisible = false; - - this.shadowBias = 0; - this.shadowDarkness = 0.5; - - this.shadowMapWidth = 512; - this.shadowMapHeight = 512; - - // - - this.shadowMap = null; - this.shadowMapSize = null; - this.shadowCamera = null; - this.shadowMatrix = null; - -}; - -THREE.SpotLight.prototype = Object.create( THREE.Light.prototype ); - -THREE.SpotLight.prototype.clone = function () { - - var light = new THREE.SpotLight(); - - THREE.Light.prototype.clone.call( this, light ); - - light.target = this.target.clone(); - - light.intensity = this.intensity; - light.distance = this.distance; - light.angle = this.angle; - light.exponent = this.exponent; - - light.castShadow = this.castShadow; - light.onlyShadow = this.onlyShadow; - - return light; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Loader = function ( showStatus ) { - - this.showStatus = showStatus; - this.statusDomElement = showStatus ? THREE.Loader.prototype.addStatusElement() : null; - - this.onLoadStart = function () {}; - this.onLoadProgress = function () {}; - this.onLoadComplete = function () {}; - -}; - -THREE.Loader.prototype = { - - constructor: THREE.Loader, - - crossOrigin: undefined, - - addStatusElement: function () { - - var e = document.createElement( "div" ); - - e.style.position = "absolute"; - e.style.right = "0px"; - e.style.top = "0px"; - e.style.fontSize = "0.8em"; - e.style.textAlign = "left"; - e.style.background = "rgba(0,0,0,0.25)"; - e.style.color = "#fff"; - e.style.width = "120px"; - e.style.padding = "0.5em 0.5em 0.5em 0.5em"; - e.style.zIndex = 1000; - - e.innerHTML = "Loading ..."; - - return e; - - }, - - updateProgress: function ( progress ) { - - var message = "Loaded "; - - if ( progress.total ) { - - message += ( 100 * progress.loaded / progress.total ).toFixed(0) + "%"; - - - } else { - - message += ( progress.loaded / 1000 ).toFixed(2) + " KB"; - - } - - this.statusDomElement.innerHTML = message; - - }, - - extractUrlBase: function ( url ) { - - var parts = url.split( '/' ); - - if ( parts.length === 1 ) return './'; - - parts.pop(); - - return parts.join( '/' ) + '/'; - - }, - - initMaterials: function ( materials, texturePath ) { - - var array = []; - - for ( var i = 0; i < materials.length; ++ i ) { - - array[ i ] = THREE.Loader.prototype.createMaterial( materials[ i ], texturePath ); - - } - - return array; - - }, - - needsTangents: function ( materials ) { - - for( var i = 0, il = materials.length; i < il; i ++ ) { - - var m = materials[ i ]; - - if ( m instanceof THREE.ShaderMaterial ) return true; - - } - - return false; - - }, - - createMaterial: function ( m, texturePath ) { - - var _this = this; - - function is_pow2( n ) { - - var l = Math.log( n ) / Math.LN2; - return Math.floor( l ) == l; - - } - - function nearest_pow2( n ) { - - var l = Math.log( n ) / Math.LN2; - return Math.pow( 2, Math.round( l ) ); - - } - - function load_image( where, url ) { - - var image = new Image(); - - image.onload = function () { - - if ( !is_pow2( this.width ) || !is_pow2( this.height ) ) { - - var width = nearest_pow2( this.width ); - var height = nearest_pow2( this.height ); - - where.image.width = width; - where.image.height = height; - where.image.getContext( '2d' ).drawImage( this, 0, 0, width, height ); - - } else { - - where.image = this; - - } - - where.needsUpdate = true; - - }; - - if ( _this.crossOrigin !== undefined ) image.crossOrigin = _this.crossOrigin; - image.src = url; - - } - - function create_texture( where, name, sourceFile, repeat, offset, wrap, anisotropy ) { - - var isCompressed = /\.dds$/i.test( sourceFile ); - - var fullPath = texturePath + sourceFile; - - if ( isCompressed ) { - - var texture = THREE.ImageUtils.loadCompressedTexture( fullPath ); - - where[ name ] = texture; - - } else { - - var texture = document.createElement( 'canvas' ); - - where[ name ] = new THREE.Texture( texture ); - - } - - where[ name ].sourceFile = sourceFile; - - if( repeat ) { - - where[ name ].repeat.set( repeat[ 0 ], repeat[ 1 ] ); - - if ( repeat[ 0 ] !== 1 ) where[ name ].wrapS = THREE.RepeatWrapping; - if ( repeat[ 1 ] !== 1 ) where[ name ].wrapT = THREE.RepeatWrapping; - - } - - if ( offset ) { - - where[ name ].offset.set( offset[ 0 ], offset[ 1 ] ); - - } - - if ( wrap ) { - - var wrapMap = { - "repeat": THREE.RepeatWrapping, - "mirror": THREE.MirroredRepeatWrapping - } - - if ( wrapMap[ wrap[ 0 ] ] !== undefined ) where[ name ].wrapS = wrapMap[ wrap[ 0 ] ]; - if ( wrapMap[ wrap[ 1 ] ] !== undefined ) where[ name ].wrapT = wrapMap[ wrap[ 1 ] ]; - - } - - if ( anisotropy ) { - - where[ name ].anisotropy = anisotropy; - - } - - if ( ! isCompressed ) { - - load_image( where[ name ], fullPath ); - - } - - } - - function rgb2hex( rgb ) { - - return ( rgb[ 0 ] * 255 << 16 ) + ( rgb[ 1 ] * 255 << 8 ) + rgb[ 2 ] * 255; - - } - - // defaults - - var mtype = "MeshLambertMaterial"; - var mpars = { color: 0xeeeeee, opacity: 1.0, map: null, lightMap: null, normalMap: null, bumpMap: null, wireframe: false }; - - // parameters from model file - - if ( m.shading ) { - - var shading = m.shading.toLowerCase(); - - if ( shading === "phong" ) mtype = "MeshPhongMaterial"; - else if ( shading === "basic" ) mtype = "MeshBasicMaterial"; - - } - - if ( m.blending !== undefined && THREE[ m.blending ] !== undefined ) { - - mpars.blending = THREE[ m.blending ]; - - } - - if ( m.transparent !== undefined || m.opacity < 1.0 ) { - - mpars.transparent = m.transparent; - - } - - if ( m.depthTest !== undefined ) { - - mpars.depthTest = m.depthTest; - - } - - if ( m.depthWrite !== undefined ) { - - mpars.depthWrite = m.depthWrite; - - } - - if ( m.visible !== undefined ) { - - mpars.visible = m.visible; - - } - - if ( m.flipSided !== undefined ) { - - mpars.side = THREE.BackSide; - - } - - if ( m.doubleSided !== undefined ) { - - mpars.side = THREE.DoubleSide; - - } - - if ( m.wireframe !== undefined ) { - - mpars.wireframe = m.wireframe; - - } - - if ( m.vertexColors !== undefined ) { - - if ( m.vertexColors === "face" ) { - - mpars.vertexColors = THREE.FaceColors; - - } else if ( m.vertexColors ) { - - mpars.vertexColors = THREE.VertexColors; - - } - - } - - // colors - - if ( m.colorDiffuse ) { - - mpars.color = rgb2hex( m.colorDiffuse ); - - } else if ( m.DbgColor ) { - - mpars.color = m.DbgColor; - - } - - if ( m.colorSpecular ) { - - mpars.specular = rgb2hex( m.colorSpecular ); - - } - - if ( m.colorAmbient ) { - - mpars.ambient = rgb2hex( m.colorAmbient ); - - } - - // modifiers - - if ( m.transparency ) { - - mpars.opacity = m.transparency; - - } - - if ( m.specularCoef ) { - - mpars.shininess = m.specularCoef; - - } - - // textures - - if ( m.mapDiffuse && texturePath ) { - - create_texture( mpars, "map", m.mapDiffuse, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); - - } - - if ( m.mapLight && texturePath ) { - - create_texture( mpars, "lightMap", m.mapLight, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); - - } - - if ( m.mapBump && texturePath ) { - - create_texture( mpars, "bumpMap", m.mapBump, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); - - } - - if ( m.mapNormal && texturePath ) { - - create_texture( mpars, "normalMap", m.mapNormal, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); - - } - - if ( m.mapSpecular && texturePath ) { - - create_texture( mpars, "specularMap", m.mapSpecular, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); - - } - - // - - if ( m.mapBumpScale ) { - - mpars.bumpScale = m.mapBumpScale; - - } - - // special case for normal mapped material - - if ( m.mapNormal ) { - - var shader = THREE.ShaderLib[ "normalmap" ]; - var uniforms = THREE.UniformsUtils.clone( shader.uniforms ); - - uniforms[ "tNormal" ].value = mpars.normalMap; - - if ( m.mapNormalFactor ) { - - uniforms[ "uNormalScale" ].value.set( m.mapNormalFactor, m.mapNormalFactor ); - - } - - if ( mpars.map ) { - - uniforms[ "tDiffuse" ].value = mpars.map; - uniforms[ "enableDiffuse" ].value = true; - - } - - if ( mpars.specularMap ) { - - uniforms[ "tSpecular" ].value = mpars.specularMap; - uniforms[ "enableSpecular" ].value = true; - - } - - if ( mpars.lightMap ) { - - uniforms[ "tAO" ].value = mpars.lightMap; - uniforms[ "enableAO" ].value = true; - - } - - // for the moment don't handle displacement texture - - uniforms[ "diffuse" ].value.setHex( mpars.color ); - uniforms[ "specular" ].value.setHex( mpars.specular ); - uniforms[ "ambient" ].value.setHex( mpars.ambient ); - - uniforms[ "shininess" ].value = mpars.shininess; - - if ( mpars.opacity !== undefined ) { - - uniforms[ "opacity" ].value = mpars.opacity; - - } - - var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true }; - var material = new THREE.ShaderMaterial( parameters ); - - if ( mpars.transparent ) { - - material.transparent = true; - - } - - } else { - - var material = new THREE[ mtype ]( mpars ); - - } - - if ( m.DbgName !== undefined ) material.name = m.DbgName; - - return material; - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.XHRLoader = function ( manager ) { - - this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; - -}; - -THREE.XHRLoader.prototype = { - - constructor: THREE.XHRLoader, - - load: function ( url, onLoad, onProgress, onError ) { - - var scope = this; - var request = new XMLHttpRequest(); - - if ( onLoad !== undefined ) { - - request.addEventListener( 'load', function ( event ) { - - onLoad( event.target.responseText ); - scope.manager.itemEnd( url ); - - }, false ); - - } - - if ( onProgress !== undefined ) { - - request.addEventListener( 'progress', function ( event ) { - - onProgress( event ); - - }, false ); - - } - - if ( onError !== undefined ) { - - request.addEventListener( 'error', function ( event ) { - - onError( event ); - - }, false ); - - } - - if ( this.crossOrigin !== undefined ) request.crossOrigin = this.crossOrigin; - - request.open( 'GET', url, true ); - request.send( null ); - - scope.manager.itemStart( url ); - - }, - - setCrossOrigin: function ( value ) { - - this.crossOrigin = value; - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.ImageLoader = function ( manager ) { - - this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; - -}; - -THREE.ImageLoader.prototype = { - - constructor: THREE.ImageLoader, - - load: function ( url, onLoad, onProgress, onError ) { - - var scope = this; - var image = document.createElement( 'img' ); - - if ( onLoad !== undefined ) { - - image.addEventListener( 'load', function ( event ) { - - scope.manager.itemEnd( url ); - onLoad( this ); - - }, false ); - - } - - if ( onProgress !== undefined ) { - - image.addEventListener( 'progress', function ( event ) { - - onProgress( event ); - - }, false ); - - } - - if ( onError !== undefined ) { - - image.addEventListener( 'error', function ( event ) { - - onError( event ); - - }, false ); - - } - - if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; - - image.src = url; - - scope.manager.itemStart( url ); - - return image; - - }, - - setCrossOrigin: function ( value ) { - - this.crossOrigin = value; - - } - -} - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.JSONLoader = function ( showStatus ) { - - THREE.Loader.call( this, showStatus ); - - this.withCredentials = false; - -}; - -THREE.JSONLoader.prototype = Object.create( THREE.Loader.prototype ); - -THREE.JSONLoader.prototype.load = function ( url, callback, texturePath ) { - - var scope = this; - - // todo: unify load API to for easier SceneLoader use - - texturePath = texturePath && ( typeof texturePath === "string" ) ? texturePath : this.extractUrlBase( url ); - - this.onLoadStart(); - this.loadAjaxJSON( this, url, callback, texturePath ); - -}; - -THREE.JSONLoader.prototype.loadAjaxJSON = function ( context, url, callback, texturePath, callbackProgress ) { - - var xhr = new XMLHttpRequest(); - - var length = 0; - - xhr.onreadystatechange = function () { - - if ( xhr.readyState === xhr.DONE ) { - - if ( xhr.status === 200 || xhr.status === 0 ) { - - if ( xhr.responseText ) { - - var json = JSON.parse( xhr.responseText ); - - if ( json.metadata.type === 'scene' ) { - - console.error( 'THREE.JSONLoader: "' + url + '" seems to be a Scene. Use THREE.SceneLoader instead.' ); - return; - - } - - var result = context.parse( json, texturePath ); - callback( result.geometry, result.materials ); - - } else { - - console.error( 'THREE.JSONLoader: "' + url + '" seems to be unreachable or the file is empty.' ); - - } - - // in context of more complex asset initialization - // do not block on single failed file - // maybe should go even one more level up - - context.onLoadComplete(); - - } else { - - console.error( 'THREE.JSONLoader: Couldn\'t load "' + url + '" (' + xhr.status + ')' ); - - } - - } else if ( xhr.readyState === xhr.LOADING ) { - - if ( callbackProgress ) { - - if ( length === 0 ) { - - length = xhr.getResponseHeader( 'Content-Length' ); - - } - - callbackProgress( { total: length, loaded: xhr.responseText.length } ); - - } - - } else if ( xhr.readyState === xhr.HEADERS_RECEIVED ) { - - if ( callbackProgress !== undefined ) { - - length = xhr.getResponseHeader( "Content-Length" ); - - } - - } - - }; - - xhr.open( "GET", url, true ); - xhr.withCredentials = this.withCredentials; - xhr.send( null ); - -}; - -THREE.JSONLoader.prototype.parse = function ( json, texturePath ) { - - var scope = this, - geometry = new THREE.Geometry(), - scale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0; - - parseModel( scale ); - - parseSkin(); - parseMorphing( scale ); - - geometry.computeCentroids(); - geometry.computeFaceNormals(); - geometry.computeBoundingSphere(); - - function parseModel( scale ) { - - function isBitSet( value, position ) { - - return value & ( 1 << position ); - - } - - var i, j, fi, - - offset, zLength, - - colorIndex, normalIndex, uvIndex, materialIndex, - - type, - isQuad, - hasMaterial, - hasFaceVertexUv, - hasFaceNormal, hasFaceVertexNormal, - hasFaceColor, hasFaceVertexColor, - - vertex, face, faceA, faceB, color, hex, normal, - - uvLayer, uv, u, v, - - faces = json.faces, - vertices = json.vertices, - normals = json.normals, - colors = json.colors, - - nUvLayers = 0; - - if ( json.uvs !== undefined ) { - - // disregard empty arrays - - for ( i = 0; i < json.uvs.length; i++ ) { - - if ( json.uvs[ i ].length ) nUvLayers ++; - - } - - for ( i = 0; i < nUvLayers; i++ ) { - - geometry.faceVertexUvs[ i ] = []; - - } - - } - - offset = 0; - zLength = vertices.length; - - while ( offset < zLength ) { - - vertex = new THREE.Vector3(); - - vertex.x = vertices[ offset ++ ] * scale; - vertex.y = vertices[ offset ++ ] * scale; - vertex.z = vertices[ offset ++ ] * scale; - - geometry.vertices.push( vertex ); - - } - - offset = 0; - zLength = faces.length; - - while ( offset < zLength ) { - - type = faces[ offset ++ ]; - - - isQuad = isBitSet( type, 0 ); - hasMaterial = isBitSet( type, 1 ); - hasFaceVertexUv = isBitSet( type, 3 ); - hasFaceNormal = isBitSet( type, 4 ); - hasFaceVertexNormal = isBitSet( type, 5 ); - hasFaceColor = isBitSet( type, 6 ); - hasFaceVertexColor = isBitSet( type, 7 ); - - // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); - - if ( isQuad ) { - - faceA = new THREE.Face3(); - faceA.a = faces[ offset ]; - faceA.b = faces[ offset + 1 ]; - faceA.c = faces[ offset + 3 ]; - - faceB = new THREE.Face3(); - faceB.a = faces[ offset + 1 ]; - faceB.b = faces[ offset + 2 ]; - faceB.c = faces[ offset + 3 ]; - - offset += 4; - - if ( hasMaterial ) { - - materialIndex = faces[ offset ++ ]; - faceA.materialIndex = materialIndex; - faceB.materialIndex = materialIndex; - - } - - // to get face <=> uv index correspondence - - fi = geometry.faces.length; - - if ( hasFaceVertexUv ) { - - for ( i = 0; i < nUvLayers; i++ ) { - - uvLayer = json.uvs[ i ]; - - geometry.faceVertexUvs[ i ][ fi ] = []; - geometry.faceVertexUvs[ i ][ fi + 1 ] = [] - - for ( j = 0; j < 4; j ++ ) { - - uvIndex = faces[ offset ++ ]; - - u = uvLayer[ uvIndex * 2 ]; - v = uvLayer[ uvIndex * 2 + 1 ]; - - uv = new THREE.Vector2( u, v ); - - if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); - if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); - - } - - } - - } - - if ( hasFaceNormal ) { - - normalIndex = faces[ offset ++ ] * 3; - - faceA.normal.set( - normals[ normalIndex ++ ], - normals[ normalIndex ++ ], - normals[ normalIndex ] - ); - - faceB.normal.copy( faceA.normal ); - - } - - if ( hasFaceVertexNormal ) { - - for ( i = 0; i < 4; i++ ) { - - normalIndex = faces[ offset ++ ] * 3; - - normal = new THREE.Vector3( - normals[ normalIndex ++ ], - normals[ normalIndex ++ ], - normals[ normalIndex ] - ); - - - if ( i !== 2 ) faceA.vertexNormals.push( normal ); - if ( i !== 0 ) faceB.vertexNormals.push( normal ); - - } - - } - - - if ( hasFaceColor ) { - - colorIndex = faces[ offset ++ ]; - hex = colors[ colorIndex ]; - - faceA.color.setHex( hex ); - faceB.color.setHex( hex ); - - } - - - if ( hasFaceVertexColor ) { - - for ( i = 0; i < 4; i++ ) { - - colorIndex = faces[ offset ++ ]; - hex = colors[ colorIndex ]; - - if ( i !== 2 ) faceA.vertexColors.push( new THREE.Color( hex ) ); - if ( i !== 0 ) faceB.vertexColors.push( new THREE.Color( hex ) ); - - } - - } - - geometry.faces.push( faceA ); - geometry.faces.push( faceB ); - - } else { - - face = new THREE.Face3(); - face.a = faces[ offset ++ ]; - face.b = faces[ offset ++ ]; - face.c = faces[ offset ++ ]; - - if ( hasMaterial ) { - - materialIndex = faces[ offset ++ ]; - face.materialIndex = materialIndex; - - } - - // to get face <=> uv index correspondence - - fi = geometry.faces.length; - - if ( hasFaceVertexUv ) { - - for ( i = 0; i < nUvLayers; i++ ) { - - uvLayer = json.uvs[ i ]; - - geometry.faceVertexUvs[ i ][ fi ] = []; - - for ( j = 0; j < 3; j ++ ) { - - uvIndex = faces[ offset ++ ]; - - u = uvLayer[ uvIndex * 2 ]; - v = uvLayer[ uvIndex * 2 + 1 ]; - - uv = new THREE.Vector2( u, v ); - - geometry.faceVertexUvs[ i ][ fi ].push( uv ); - - } - - } - - } - - if ( hasFaceNormal ) { - - normalIndex = faces[ offset ++ ] * 3; - - face.normal.set( - normals[ normalIndex ++ ], - normals[ normalIndex ++ ], - normals[ normalIndex ] - ); - - } - - if ( hasFaceVertexNormal ) { - - for ( i = 0; i < 3; i++ ) { - - normalIndex = faces[ offset ++ ] * 3; - - normal = new THREE.Vector3( - normals[ normalIndex ++ ], - normals[ normalIndex ++ ], - normals[ normalIndex ] - ); - - face.vertexNormals.push( normal ); - - } - - } - - - if ( hasFaceColor ) { - - colorIndex = faces[ offset ++ ]; - face.color.setHex( colors[ colorIndex ] ); - - } - - - if ( hasFaceVertexColor ) { - - for ( i = 0; i < 3; i++ ) { - - colorIndex = faces[ offset ++ ]; - face.vertexColors.push( new THREE.Color( colors[ colorIndex ] ) ); - - } - - } - - geometry.faces.push( face ); - - } - - } - - }; - - function parseSkin() { - - if ( json.skinWeights ) { - - for ( var i = 0, l = json.skinWeights.length; i < l; i += 2 ) { - - var x = json.skinWeights[ i ]; - var y = json.skinWeights[ i + 1 ]; - var z = 0; - var w = 0; - - geometry.skinWeights.push( new THREE.Vector4( x, y, z, w ) ); - - } - - } - - if ( json.skinIndices ) { - - for ( var i = 0, l = json.skinIndices.length; i < l; i += 2 ) { - - var a = json.skinIndices[ i ]; - var b = json.skinIndices[ i + 1 ]; - var c = 0; - var d = 0; - - geometry.skinIndices.push( new THREE.Vector4( a, b, c, d ) ); - - } - - } - - geometry.bones = json.bones; - - if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { - - console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + - geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); - - } - - - // could change this to json.animations[0] or remove completely - - geometry.animation = json.animation; - geometry.animations = json.animations; - - }; - - function parseMorphing( scale ) { - - if ( json.morphTargets !== undefined ) { - - var i, l, v, vl, dstVertices, srcVertices; - - for ( i = 0, l = json.morphTargets.length; i < l; i ++ ) { - - geometry.morphTargets[ i ] = {}; - geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; - geometry.morphTargets[ i ].vertices = []; - - dstVertices = geometry.morphTargets[ i ].vertices; - srcVertices = json.morphTargets [ i ].vertices; - - for( v = 0, vl = srcVertices.length; v < vl; v += 3 ) { - - var vertex = new THREE.Vector3(); - vertex.x = srcVertices[ v ] * scale; - vertex.y = srcVertices[ v + 1 ] * scale; - vertex.z = srcVertices[ v + 2 ] * scale; - - dstVertices.push( vertex ); - - } - - } - - } - - if ( json.morphColors !== undefined ) { - - var i, l, c, cl, dstColors, srcColors, color; - - for ( i = 0, l = json.morphColors.length; i < l; i++ ) { - - geometry.morphColors[ i ] = {}; - geometry.morphColors[ i ].name = json.morphColors[ i ].name; - geometry.morphColors[ i ].colors = []; - - dstColors = geometry.morphColors[ i ].colors; - srcColors = json.morphColors [ i ].colors; - - for ( c = 0, cl = srcColors.length; c < cl; c += 3 ) { - - color = new THREE.Color( 0xffaa00 ); - color.setRGB( srcColors[ c ], srcColors[ c + 1 ], srcColors[ c + 2 ] ); - dstColors.push( color ); - - } - - } - - } - - }; - - if ( json.materials === undefined ) { - - return { geometry: geometry }; - - } else { - - var materials = this.initMaterials( json.materials, texturePath ); - - if ( this.needsTangents( materials ) ) { - - geometry.computeTangents(); - - } - - return { geometry: geometry, materials: materials }; - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.LoadingManager = function ( onLoad, onProgress, onError ) { - - var scope = this; - - var loaded = 0, total = 0; - - this.onLoad = onLoad; - this.onProgress = onProgress; - this.onError = onError; - - this.itemStart = function ( url ) { - - total ++; - - }; - - this.itemEnd = function ( url ) { - - loaded ++; - - if ( scope.onProgress !== undefined ) { - - scope.onProgress( url, loaded, total ); - - } - - if ( loaded === total && scope.onLoad !== undefined ) { - - scope.onLoad(); - - } - - }; - -}; - -THREE.DefaultLoadingManager = new THREE.LoadingManager(); - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.BufferGeometryLoader = function ( manager ) { - - this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; - -}; - -THREE.BufferGeometryLoader.prototype = { - - constructor: THREE.BufferGeometryLoader, - - load: function ( url, onLoad, onProgress, onError ) { - - var scope = this; - - var loader = new THREE.XHRLoader(); - loader.setCrossOrigin( this.crossOrigin ); - loader.load( url, function ( text ) { - - onLoad( scope.parse( JSON.parse( text ) ) ); - - } ); - - }, - - setCrossOrigin: function ( value ) { - - this.crossOrigin = value; - - }, - - parse: function ( json ) { - - var geometry = new THREE.BufferGeometry(); - - var attributes = json.attributes; - var offsets = json.offsets; - var boundingSphere = json.boundingSphere; - - for ( var key in attributes ) { - - var attribute = attributes[ key ]; - - geometry.attributes[ key ] = { - itemSize: attribute.itemSize, - array: new self[ attribute.type ]( attribute.array ) - } - - } - - if ( offsets !== undefined ) { - - geometry.offsets = JSON.parse( JSON.stringify( offsets ) ); - - } - - if ( boundingSphere !== undefined ) { - - geometry.boundingSphere = new THREE.Sphere( - new THREE.Vector3().fromArray( boundingSphere.center !== undefined ? boundingSphere.center : [ 0, 0, 0 ] ), - boundingSphere.radius - ); - - } - - return geometry; - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Geometry2Loader = function ( manager ) { - - this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; - -}; - -THREE.Geometry2Loader.prototype = { - - constructor: THREE.Geometry2Loader, - - load: function ( url, onLoad, onProgress, onError ) { - - var scope = this; - - var loader = new THREE.XHRLoader(); - loader.setCrossOrigin( this.crossOrigin ); - loader.load( url, function ( text ) { - - onLoad( scope.parse( JSON.parse( text ) ) ); - - } ); - - }, - - setCrossOrigin: function ( value ) { - - this.crossOrigin = value; - - }, - - parse: function ( json ) { - - var geometry = new THREE.Geometry2( json.vertices.length / 3 ); - - var attributes = [ 'vertices', 'normals', 'uvs' ]; - var boundingSphere = json.boundingSphere; - - for ( var key in attributes ) { - - var attribute = attributes[ key ]; - geometry[ attribute ].set( json[ attribute ] ); - - } - - if ( boundingSphere !== undefined ) { - - geometry.boundingSphere = new THREE.Sphere( - new THREE.Vector3().fromArray( boundingSphere.center !== undefined ? boundingSphere.center : [ 0, 0, 0 ] ), - boundingSphere.radius - ); - - } - - return geometry; - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.MaterialLoader = function ( manager ) { - - this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; - -}; - -THREE.MaterialLoader.prototype = { - - constructor: THREE.MaterialLoader, - - load: function ( url, onLoad, onProgress, onError ) { - - var scope = this; - - var loader = new THREE.XHRLoader(); - loader.setCrossOrigin( this.crossOrigin ); - loader.load( url, function ( text ) { - - onLoad( scope.parse( JSON.parse( text ) ) ); - - } ); - - }, - - setCrossOrigin: function ( value ) { - - this.crossOrigin = value; - - }, - - parse: function ( json ) { - - var material = new THREE[ json.type ]; - - if ( json.color !== undefined ) material.color.setHex( json.color ); - if ( json.ambient !== undefined ) material.ambient.setHex( json.ambient ); - if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); - if ( json.specular !== undefined ) material.specular.setHex( json.specular ); - if ( json.shininess !== undefined ) material.shininess = json.shininess; - if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; - if ( json.blending !== undefined ) material.blending = json.blending; - if ( json.side !== undefined ) material.side = json.side; - if ( json.opacity !== undefined ) material.opacity = json.opacity; - if ( json.transparent !== undefined ) material.transparent = json.transparent; - if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; - - if ( json.materials !== undefined ) { - - for ( var i = 0, l = json.materials.length; i < l; i ++ ) { - - material.materials.push( this.parse( json.materials[ i ] ) ); - - } - - } - - return material; - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.ObjectLoader = function ( manager ) { - - this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; - -}; - -THREE.ObjectLoader.prototype = { - - constructor: THREE.ObjectLoader, - - load: function ( url, onLoad, onProgress, onError ) { - - var scope = this; - - var loader = new THREE.XHRLoader( scope.manager ); - loader.setCrossOrigin( this.crossOrigin ); - loader.load( url, function ( text ) { - - onLoad( scope.parse( JSON.parse( text ) ) ); - - } ); - - }, - - setCrossOrigin: function ( value ) { - - this.crossOrigin = value; - - }, - - parse: function ( json ) { - - var geometries = this.parseGeometries( json.geometries ); - var materials = this.parseMaterials( json.materials ); - var object = this.parseObject( json.object, geometries, materials ); - - return object; - - }, - - parseGeometries: function ( json ) { - - var geometries = {}; - - if ( json !== undefined ) { - - var geometryLoader = new THREE.JSONLoader(); - var geometry2Loader = new THREE.Geometry2Loader(); - var bufferGeometryLoader = new THREE.BufferGeometryLoader(); - - for ( var i = 0, l = json.length; i < l; i ++ ) { - - var geometry; - var data = json[ i ]; - - switch ( data.type ) { - - case 'PlaneGeometry': - - geometry = new THREE.PlaneGeometry( - data.width, - data.height, - data.widthSegments, - data.heightSegments - ); - - break; - - case 'BoxGeometry': - case 'CubeGeometry': // DEPRECATED - - geometry = new THREE.BoxGeometry( - data.width, - data.height, - data.depth, - data.widthSegments, - data.heightSegments, - data.depthSegments - ); - - break; - - case 'CircleGeometry': - - geometry = new THREE.CircleGeometry( - data.radius, - data.segments - ); - - break; - - case 'CylinderGeometry': - - geometry = new THREE.CylinderGeometry( - data.radiusTop, - data.radiusBottom, - data.height, - data.radialSegments, - data.heightSegments, - data.openEnded - ); - - break; - - case 'SphereGeometry': - - geometry = new THREE.SphereGeometry( - data.radius, - data.widthSegments, - data.heightSegments, - data.phiStart, - data.phiLength, - data.thetaStart, - data.thetaLength - ); - - break; - - case 'IcosahedronGeometry': - - geometry = new THREE.IcosahedronGeometry( - data.radius, - data.detail - ); - - break; - - case 'TorusGeometry': - - geometry = new THREE.TorusGeometry( - data.radius, - data.tube, - data.radialSegments, - data.tubularSegments, - data.arc - ); - - break; - - case 'TorusKnotGeometry': - - geometry = new THREE.TorusKnotGeometry( - data.radius, - data.tube, - data.radialSegments, - data.tubularSegments, - data.p, - data.q, - data.heightScale - ); - - break; - - case 'BufferGeometry': - - geometry = bufferGeometryLoader.parse( data.data ); - - break; - - case 'Geometry2': - - geometry = geometry2Loader.parse( data.data ); - - break; - - case 'Geometry': - - geometry = geometryLoader.parse( data.data ).geometry; - - break; - - } - - geometry.uuid = data.uuid; - - if ( data.name !== undefined ) geometry.name = data.name; - - geometries[ data.uuid ] = geometry; - - } - - } - - return geometries; - - }, - - parseMaterials: function ( json ) { - - var materials = {}; - - if ( json !== undefined ) { - - var loader = new THREE.MaterialLoader(); - - for ( var i = 0, l = json.length; i < l; i ++ ) { - - var data = json[ i ]; - var material = loader.parse( data ); - - material.uuid = data.uuid; - - if ( data.name !== undefined ) material.name = data.name; - - materials[ data.uuid ] = material; - - } - - } - - return materials; - - }, - - parseObject: function () { - - var matrix = new THREE.Matrix4(); - - return function ( data, geometries, materials ) { - - var object; - - switch ( data.type ) { - - case 'Scene': - - object = new THREE.Scene(); - - break; - - case 'PerspectiveCamera': - - object = new THREE.PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); - - break; - - case 'OrthographicCamera': - - object = new THREE.OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); - - break; - - case 'AmbientLight': - - object = new THREE.AmbientLight( data.color ); - - break; - - case 'DirectionalLight': - - object = new THREE.DirectionalLight( data.color, data.intensity ); - - break; - - case 'PointLight': - - object = new THREE.PointLight( data.color, data.intensity, data.distance ); - - break; - - case 'SpotLight': - - object = new THREE.SpotLight( data.color, data.intensity, data.distance, data.angle, data.exponent ); - - break; - - case 'HemisphereLight': - - object = new THREE.HemisphereLight( data.color, data.groundColor, data.intensity ); - - break; - - case 'Mesh': - - var geometry = geometries[ data.geometry ]; - var material = materials[ data.material ]; - - if ( geometry === undefined ) { - - console.error( 'THREE.ObjectLoader: Undefined geometry ' + data.geometry ); - - } - - if ( material === undefined ) { - - console.error( 'THREE.ObjectLoader: Undefined material ' + data.material ); - - } - - object = new THREE.Mesh( geometry, material ); - - break; - - case 'Sprite': - - var material = materials[ data.material ]; - - if ( material === undefined ) { - - console.error( 'THREE.ObjectLoader: Undefined material ' + data.material ); - - } - - object = new THREE.Sprite( material ); - - break; - - default: - - object = new THREE.Object3D(); - - } - - object.uuid = data.uuid; - - if ( data.name !== undefined ) object.name = data.name; - if ( data.matrix !== undefined ) { - - matrix.fromArray( data.matrix ); - matrix.decompose( object.position, object.quaternion, object.scale ); - - } else { - - if ( data.position !== undefined ) object.position.fromArray( data.position ); - if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); - if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); - - } - - if ( data.visible !== undefined ) object.visible = data.visible; - if ( data.userData !== undefined ) object.userData = data.userData; - - if ( data.children !== undefined ) { - - for ( var child in data.children ) { - - object.add( this.parseObject( data.children[ child ], geometries, materials ) ); - - } - - } - - return object; - - } - - }() - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SceneLoader = function () { - - this.onLoadStart = function () {}; - this.onLoadProgress = function() {}; - this.onLoadComplete = function () {}; - - this.callbackSync = function () {}; - this.callbackProgress = function () {}; - - this.geometryHandlers = {}; - this.hierarchyHandlers = {}; - - this.addGeometryHandler( "ascii", THREE.JSONLoader ); - -}; - -THREE.SceneLoader.prototype = { - - constructor: THREE.SceneLoader, - - load: function ( url, onLoad, onProgress, onError ) { - - var scope = this; - - var loader = new THREE.XHRLoader( scope.manager ); - loader.setCrossOrigin( this.crossOrigin ); - loader.load( url, function ( text ) { - - scope.parse( JSON.parse( text ), onLoad, url ); - - } ); - - }, - - setCrossOrigin: function ( value ) { - - this.crossOrigin = value; - - }, - - addGeometryHandler: function ( typeID, loaderClass ) { - - this.geometryHandlers[ typeID ] = { "loaderClass": loaderClass }; - - }, - - addHierarchyHandler: function ( typeID, loaderClass ) { - - this.hierarchyHandlers[ typeID ] = { "loaderClass": loaderClass }; - - }, - - parse: function ( json, callbackFinished, url ) { - - var scope = this; - - var urlBase = THREE.Loader.prototype.extractUrlBase( url ); - - var geometry, material, camera, fog, - texture, images, color, - light, hex, intensity, - counter_models, counter_textures, - total_models, total_textures, - result; - - var target_array = []; - - var data = json; - - // async geometry loaders - - for ( var typeID in this.geometryHandlers ) { - - var loaderClass = this.geometryHandlers[ typeID ][ "loaderClass" ]; - this.geometryHandlers[ typeID ][ "loaderObject" ] = new loaderClass(); - - } - - // async hierachy loaders - - for ( var typeID in this.hierarchyHandlers ) { - - var loaderClass = this.hierarchyHandlers[ typeID ][ "loaderClass" ]; - this.hierarchyHandlers[ typeID ][ "loaderObject" ] = new loaderClass(); - - } - - counter_models = 0; - counter_textures = 0; - - result = { - - scene: new THREE.Scene(), - geometries: {}, - face_materials: {}, - materials: {}, - textures: {}, - objects: {}, - cameras: {}, - lights: {}, - fogs: {}, - empties: {}, - groups: {} - - }; - - if ( data.transform ) { - - var position = data.transform.position, - rotation = data.transform.rotation, - scale = data.transform.scale; - - if ( position ) { - - result.scene.position.fromArray( position ); - - } - - if ( rotation ) { - - result.scene.rotation.fromArray( rotation ); - - } - - if ( scale ) { - - result.scene.scale.fromArray( scale ); - - } - - if ( position || rotation || scale ) { - - result.scene.updateMatrix(); - result.scene.updateMatrixWorld(); - - } - - } - - function get_url( source_url, url_type ) { - - if ( url_type == "relativeToHTML" ) { - - return source_url; - - } else { - - return urlBase + source_url; - - } - - }; - - // toplevel loader function, delegates to handle_children - - function handle_objects() { - - handle_children( result.scene, data.objects ); - - } - - // handle all the children from the loaded json and attach them to given parent - - function handle_children( parent, children ) { - - var mat, dst, pos, rot, scl, quat; - - for ( var objID in children ) { - - // check by id if child has already been handled, - // if not, create new object - - var object = result.objects[ objID ]; - var objJSON = children[ objID ]; - - if ( object === undefined ) { - - // meshes - - if ( objJSON.type && ( objJSON.type in scope.hierarchyHandlers ) ) { - - if ( objJSON.loading === undefined ) { - - var reservedTypes = { - "type": 1, "url": 1, "material": 1, - "position": 1, "rotation": 1, "scale" : 1, - "visible": 1, "children": 1, "userData": 1, - "skin": 1, "morph": 1, "mirroredLoop": 1, "duration": 1 - }; - - var loaderParameters = {}; - - for ( var parType in objJSON ) { - - if ( ! ( parType in reservedTypes ) ) { - - loaderParameters[ parType ] = objJSON[ parType ]; - - } - - } - - material = result.materials[ objJSON.material ]; - - objJSON.loading = true; - - var loader = scope.hierarchyHandlers[ objJSON.type ][ "loaderObject" ]; - - // ColladaLoader - - if ( loader.options ) { - - loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ) ); - - // UTF8Loader - // OBJLoader - - } else { - - loader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ), loaderParameters ); - - } - - } - - } else if ( objJSON.geometry !== undefined ) { - - geometry = result.geometries[ objJSON.geometry ]; - - // geometry already loaded - - if ( geometry ) { - - var needsTangents = false; - - material = result.materials[ objJSON.material ]; - needsTangents = material instanceof THREE.ShaderMaterial; - - pos = objJSON.position; - rot = objJSON.rotation; - scl = objJSON.scale; - mat = objJSON.matrix; - quat = objJSON.quaternion; - - // use materials from the model file - // if there is no material specified in the object - - if ( ! objJSON.material ) { - - material = new THREE.MeshFaceMaterial( result.face_materials[ objJSON.geometry ] ); - - } - - // use materials from the model file - // if there is just empty face material - // (must create new material as each model has its own face material) - - if ( ( material instanceof THREE.MeshFaceMaterial ) && material.materials.length === 0 ) { - - material = new THREE.MeshFaceMaterial( result.face_materials[ objJSON.geometry ] ); - - } - - if ( material instanceof THREE.MeshFaceMaterial ) { - - for ( var i = 0; i < material.materials.length; i ++ ) { - - needsTangents = needsTangents || ( material.materials[ i ] instanceof THREE.ShaderMaterial ); - - } - - } - - if ( needsTangents ) { - - geometry.computeTangents(); - - } - - if ( objJSON.skin ) { - - object = new THREE.SkinnedMesh( geometry, material ); - - } else if ( objJSON.morph ) { - - object = new THREE.MorphAnimMesh( geometry, material ); - - if ( objJSON.duration !== undefined ) { - - object.duration = objJSON.duration; - - } - - if ( objJSON.time !== undefined ) { - - object.time = objJSON.time; - - } - - if ( objJSON.mirroredLoop !== undefined ) { - - object.mirroredLoop = objJSON.mirroredLoop; - - } - - if ( material.morphNormals ) { - - geometry.computeMorphNormals(); - - } - - } else { - - object = new THREE.Mesh( geometry, material ); - - } - - object.name = objID; - - if ( mat ) { - - object.matrixAutoUpdate = false; - object.matrix.set( - mat[0], mat[1], mat[2], mat[3], - mat[4], mat[5], mat[6], mat[7], - mat[8], mat[9], mat[10], mat[11], - mat[12], mat[13], mat[14], mat[15] - ); - - } else { - - object.position.fromArray( pos ); - - if ( quat ) { - - object.quaternion.fromArray( quat ); - - } else { - - object.rotation.fromArray( rot ); - - } - - object.scale.fromArray( scl ); - - } - - object.visible = objJSON.visible; - object.castShadow = objJSON.castShadow; - object.receiveShadow = objJSON.receiveShadow; - - parent.add( object ); - - result.objects[ objID ] = object; - - } - - // lights - - } else if ( objJSON.type === "AmbientLight" || objJSON.type === "PointLight" || - objJSON.type === "DirectionalLight" || objJSON.type === "SpotLight" || - objJSON.type === "HemisphereLight" || objJSON.type === "AreaLight" ) { - - var color = objJSON.color; - var intensity = objJSON.intensity; - var distance = objJSON.distance; - var position = objJSON.position; - var rotation = objJSON.rotation; - - switch ( objJSON.type ) { - - case 'AmbientLight': - light = new THREE.AmbientLight( color ); - break; - - case 'PointLight': - light = new THREE.PointLight( color, intensity, distance ); - light.position.fromArray( position ); - break; - - case 'DirectionalLight': - light = new THREE.DirectionalLight( color, intensity ); - light.position.fromArray( objJSON.direction ); - break; - - case 'SpotLight': - light = new THREE.SpotLight( color, intensity, distance, 1 ); - light.angle = objJSON.angle; - light.position.fromArray( position ); - light.target.set( position[ 0 ], position[ 1 ] - distance, position[ 2 ] ); - light.target.applyEuler( new THREE.Euler( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ], 'XYZ' ) ); - break; - - case 'HemisphereLight': - light = new THREE.DirectionalLight( color, intensity, distance ); - light.target.set( position[ 0 ], position[ 1 ] - distance, position[ 2 ] ); - light.target.applyEuler( new THREE.Euler( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ], 'XYZ' ) ); - break; - - case 'AreaLight': - light = new THREE.AreaLight(color, intensity); - light.position.fromArray( position ); - light.width = objJSON.size; - light.height = objJSON.size_y; - break; - - } - - parent.add( light ); - - light.name = objID; - result.lights[ objID ] = light; - result.objects[ objID ] = light; - - // cameras - - } else if ( objJSON.type === "PerspectiveCamera" || objJSON.type === "OrthographicCamera" ) { - - pos = objJSON.position; - rot = objJSON.rotation; - quat = objJSON.quaternion; - - if ( objJSON.type === "PerspectiveCamera" ) { - - camera = new THREE.PerspectiveCamera( objJSON.fov, objJSON.aspect, objJSON.near, objJSON.far ); - - } else if ( objJSON.type === "OrthographicCamera" ) { - - camera = new THREE.OrthographicCamera( objJSON.left, objJSON.right, objJSON.top, objJSON.bottom, objJSON.near, objJSON.far ); - - } - - camera.name = objID; - camera.position.fromArray( pos ); - - if ( quat !== undefined ) { - - camera.quaternion.fromArray( quat ); - - } else if ( rot !== undefined ) { - - camera.rotation.fromArray( rot ); - - } - - parent.add( camera ); - - result.cameras[ objID ] = camera; - result.objects[ objID ] = camera; - - // pure Object3D - - } else { - - pos = objJSON.position; - rot = objJSON.rotation; - scl = objJSON.scale; - quat = objJSON.quaternion; - - object = new THREE.Object3D(); - object.name = objID; - object.position.fromArray( pos ); - - if ( quat ) { - - object.quaternion.fromArray( quat ); - - } else { - - object.rotation.fromArray( rot ); - - } - - object.scale.fromArray( scl ); - object.visible = ( objJSON.visible !== undefined ) ? objJSON.visible : false; - - parent.add( object ); - - result.objects[ objID ] = object; - result.empties[ objID ] = object; - - } - - if ( object ) { - - if ( objJSON.userData !== undefined ) { - - for ( var key in objJSON.userData ) { - - var value = objJSON.userData[ key ]; - object.userData[ key ] = value; - - } - - } - - if ( objJSON.groups !== undefined ) { - - for ( var i = 0; i < objJSON.groups.length; i ++ ) { - - var groupID = objJSON.groups[ i ]; - - if ( result.groups[ groupID ] === undefined ) { - - result.groups[ groupID ] = []; - - } - - result.groups[ groupID ].push( objID ); - - } - - } - - } - - } - - if ( object !== undefined && objJSON.children !== undefined ) { - - handle_children( object, objJSON.children ); - - } - - } - - }; - - function handle_mesh( geo, mat, id ) { - - result.geometries[ id ] = geo; - result.face_materials[ id ] = mat; - handle_objects(); - - }; - - function handle_hierarchy( node, id, parent, material, obj ) { - - var p = obj.position; - var r = obj.rotation; - var q = obj.quaternion; - var s = obj.scale; - - node.position.fromArray( p ); - - if ( q ) { - - node.quaternion.fromArray( q ); - - } else { - - node.rotation.fromArray( r ); - - } - - node.scale.fromArray( s ); - - // override children materials - // if object material was specified in JSON explicitly - - if ( material ) { - - node.traverse( function ( child ) { - - child.material = material; - - } ); - - } - - // override children visibility - // with root node visibility as specified in JSON - - var visible = ( obj.visible !== undefined ) ? obj.visible : true; - - node.traverse( function ( child ) { - - child.visible = visible; - - } ); - - parent.add( node ); - - node.name = id; - - result.objects[ id ] = node; - handle_objects(); - - }; - - function create_callback_geometry( id ) { - - return function ( geo, mat ) { - - geo.name = id; - - handle_mesh( geo, mat, id ); - - counter_models -= 1; - - scope.onLoadComplete(); - - async_callback_gate(); - - } - - }; - - function create_callback_hierachy( id, parent, material, obj ) { - - return function ( event ) { - - var result; - - // loaders which use EventDispatcher - - if ( event.content ) { - - result = event.content; - - // ColladaLoader - - } else if ( event.dae ) { - - result = event.scene; - - - // UTF8Loader - - } else { - - result = event; - - } - - handle_hierarchy( result, id, parent, material, obj ); - - counter_models -= 1; - - scope.onLoadComplete(); - - async_callback_gate(); - - } - - }; - - function create_callback_embed( id ) { - - return function ( geo, mat ) { - - geo.name = id; - - result.geometries[ id ] = geo; - result.face_materials[ id ] = mat; - - } - - }; - - function async_callback_gate() { - - var progress = { - - totalModels : total_models, - totalTextures : total_textures, - loadedModels : total_models - counter_models, - loadedTextures : total_textures - counter_textures - - }; - - scope.callbackProgress( progress, result ); - - scope.onLoadProgress(); - - if ( counter_models === 0 && counter_textures === 0 ) { - - finalize(); - callbackFinished( result ); - - } - - }; - - function finalize() { - - // take care of targets which could be asynchronously loaded objects - - for ( var i = 0; i < target_array.length; i ++ ) { - - var ta = target_array[ i ]; - - var target = result.objects[ ta.targetName ]; - - if ( target ) { - - ta.object.target = target; - - } else { - - // if there was error and target of specified name doesn't exist in the scene file - // create instead dummy target - // (target must be added to scene explicitly as parent is already added) - - ta.object.target = new THREE.Object3D(); - result.scene.add( ta.object.target ); - - } - - ta.object.target.userData.targetInverse = ta.object; - - } - - }; - - var callbackTexture = function ( count ) { - - counter_textures -= count; - async_callback_gate(); - - scope.onLoadComplete(); - - }; - - // must use this instead of just directly calling callbackTexture - // because of closure in the calling context loop - - var generateTextureCallback = function ( count ) { - - return function () { - - callbackTexture( count ); - - }; - - }; - - function traverse_json_hierarchy( objJSON, callback ) { - - callback( objJSON ); - - if ( objJSON.children !== undefined ) { - - for ( var objChildID in objJSON.children ) { - - traverse_json_hierarchy( objJSON.children[ objChildID ], callback ); - - } - - } - - }; - - // first go synchronous elements - - // fogs - - var fogID, fogJSON; - - for ( fogID in data.fogs ) { - - fogJSON = data.fogs[ fogID ]; - - if ( fogJSON.type === "linear" ) { - - fog = new THREE.Fog( 0x000000, fogJSON.near, fogJSON.far ); - - } else if ( fogJSON.type === "exp2" ) { - - fog = new THREE.FogExp2( 0x000000, fogJSON.density ); - - } - - color = fogJSON.color; - fog.color.setRGB( color[0], color[1], color[2] ); - - result.fogs[ fogID ] = fog; - - } - - // now come potentially asynchronous elements - - // geometries - - // count how many geometries will be loaded asynchronously - - var geoID, geoJSON; - - for ( geoID in data.geometries ) { - - geoJSON = data.geometries[ geoID ]; - - if ( geoJSON.type in this.geometryHandlers ) { - - counter_models += 1; - - scope.onLoadStart(); - - } - - } - - // count how many hierarchies will be loaded asynchronously - - for ( var objID in data.objects ) { - - traverse_json_hierarchy( data.objects[ objID ], function ( objJSON ) { - - if ( objJSON.type && ( objJSON.type in scope.hierarchyHandlers ) ) { - - counter_models += 1; - - scope.onLoadStart(); - - } - - }); - - } - - total_models = counter_models; - - for ( geoID in data.geometries ) { - - geoJSON = data.geometries[ geoID ]; - - if ( geoJSON.type === "cube" ) { - - geometry = new THREE.BoxGeometry( geoJSON.width, geoJSON.height, geoJSON.depth, geoJSON.widthSegments, geoJSON.heightSegments, geoJSON.depthSegments ); - geometry.name = geoID; - result.geometries[ geoID ] = geometry; - - } else if ( geoJSON.type === "plane" ) { - - geometry = new THREE.PlaneGeometry( geoJSON.width, geoJSON.height, geoJSON.widthSegments, geoJSON.heightSegments ); - geometry.name = geoID; - result.geometries[ geoID ] = geometry; - - } else if ( geoJSON.type === "sphere" ) { - - geometry = new THREE.SphereGeometry( geoJSON.radius, geoJSON.widthSegments, geoJSON.heightSegments ); - geometry.name = geoID; - result.geometries[ geoID ] = geometry; - - } else if ( geoJSON.type === "cylinder" ) { - - geometry = new THREE.CylinderGeometry( geoJSON.topRad, geoJSON.botRad, geoJSON.height, geoJSON.radSegs, geoJSON.heightSegs ); - geometry.name = geoID; - result.geometries[ geoID ] = geometry; - - } else if ( geoJSON.type === "torus" ) { - - geometry = new THREE.TorusGeometry( geoJSON.radius, geoJSON.tube, geoJSON.segmentsR, geoJSON.segmentsT ); - geometry.name = geoID; - result.geometries[ geoID ] = geometry; - - } else if ( geoJSON.type === "icosahedron" ) { - - geometry = new THREE.IcosahedronGeometry( geoJSON.radius, geoJSON.subdivisions ); - geometry.name = geoID; - result.geometries[ geoID ] = geometry; - - } else if ( geoJSON.type in this.geometryHandlers ) { - - var loaderParameters = {}; - - for ( var parType in geoJSON ) { - - if ( parType !== "type" && parType !== "url" ) { - - loaderParameters[ parType ] = geoJSON[ parType ]; - - } - - } - - var loader = this.geometryHandlers[ geoJSON.type ][ "loaderObject" ]; - loader.load( get_url( geoJSON.url, data.urlBaseType ), create_callback_geometry( geoID ), loaderParameters ); - - } else if ( geoJSON.type === "embedded" ) { - - var modelJson = data.embeds[ geoJSON.id ], - texture_path = ""; - - // pass metadata along to jsonLoader so it knows the format version - - modelJson.metadata = data.metadata; - - if ( modelJson ) { - - var jsonLoader = this.geometryHandlers[ "ascii" ][ "loaderObject" ]; - var model = jsonLoader.parse( modelJson, texture_path ); - create_callback_embed( geoID )( model.geometry, model.materials ); - - } - - } - - } - - // textures - - // count how many textures will be loaded asynchronously - - var textureID, textureJSON; - - for ( textureID in data.textures ) { - - textureJSON = data.textures[ textureID ]; - - if ( textureJSON.url instanceof Array ) { - - counter_textures += textureJSON.url.length; - - for( var n = 0; n < textureJSON.url.length; n ++ ) { - - scope.onLoadStart(); - - } - - } else { - - counter_textures += 1; - - scope.onLoadStart(); - - } - - } - - total_textures = counter_textures; - - for ( textureID in data.textures ) { - - textureJSON = data.textures[ textureID ]; - - if ( textureJSON.mapping !== undefined && THREE[ textureJSON.mapping ] !== undefined ) { - - textureJSON.mapping = new THREE[ textureJSON.mapping ](); - - } - - if ( textureJSON.url instanceof Array ) { - - var count = textureJSON.url.length; - var url_array = []; - - for( var i = 0; i < count; i ++ ) { - - url_array[ i ] = get_url( textureJSON.url[ i ], data.urlBaseType ); - - } - - var isCompressed = /\.dds$/i.test( url_array[ 0 ] ); - - if ( isCompressed ) { - - texture = THREE.ImageUtils.loadCompressedTextureCube( url_array, textureJSON.mapping, generateTextureCallback( count ) ); - - } else { - - texture = THREE.ImageUtils.loadTextureCube( url_array, textureJSON.mapping, generateTextureCallback( count ) ); - - } - - } else { - - var isCompressed = /\.dds$/i.test( textureJSON.url ); - var fullUrl = get_url( textureJSON.url, data.urlBaseType ); - var textureCallback = generateTextureCallback( 1 ); - - if ( isCompressed ) { - - texture = THREE.ImageUtils.loadCompressedTexture( fullUrl, textureJSON.mapping, textureCallback ); - - } else { - - texture = THREE.ImageUtils.loadTexture( fullUrl, textureJSON.mapping, textureCallback ); - - } - - if ( THREE[ textureJSON.minFilter ] !== undefined ) - texture.minFilter = THREE[ textureJSON.minFilter ]; - - if ( THREE[ textureJSON.magFilter ] !== undefined ) - texture.magFilter = THREE[ textureJSON.magFilter ]; - - if ( textureJSON.anisotropy ) texture.anisotropy = textureJSON.anisotropy; - - if ( textureJSON.repeat ) { - - texture.repeat.set( textureJSON.repeat[ 0 ], textureJSON.repeat[ 1 ] ); - - if ( textureJSON.repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping; - if ( textureJSON.repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping; - - } - - if ( textureJSON.offset ) { - - texture.offset.set( textureJSON.offset[ 0 ], textureJSON.offset[ 1 ] ); - - } - - // handle wrap after repeat so that default repeat can be overriden - - if ( textureJSON.wrap ) { - - var wrapMap = { - "repeat": THREE.RepeatWrapping, - "mirror": THREE.MirroredRepeatWrapping - } - - if ( wrapMap[ textureJSON.wrap[ 0 ] ] !== undefined ) texture.wrapS = wrapMap[ textureJSON.wrap[ 0 ] ]; - if ( wrapMap[ textureJSON.wrap[ 1 ] ] !== undefined ) texture.wrapT = wrapMap[ textureJSON.wrap[ 1 ] ]; - - } - - } - - result.textures[ textureID ] = texture; - - } - - // materials - - var matID, matJSON; - var parID; - - for ( matID in data.materials ) { - - matJSON = data.materials[ matID ]; - - for ( parID in matJSON.parameters ) { - - if ( parID === "envMap" || parID === "map" || parID === "lightMap" || parID === "bumpMap" ) { - - matJSON.parameters[ parID ] = result.textures[ matJSON.parameters[ parID ] ]; - - } else if ( parID === "shading" ) { - - matJSON.parameters[ parID ] = ( matJSON.parameters[ parID ] === "flat" ) ? THREE.FlatShading : THREE.SmoothShading; - - } else if ( parID === "side" ) { - - if ( matJSON.parameters[ parID ] == "double" ) { - - matJSON.parameters[ parID ] = THREE.DoubleSide; - - } else if ( matJSON.parameters[ parID ] == "back" ) { - - matJSON.parameters[ parID ] = THREE.BackSide; - - } else { - - matJSON.parameters[ parID ] = THREE.FrontSide; - - } - - } else if ( parID === "blending" ) { - - matJSON.parameters[ parID ] = matJSON.parameters[ parID ] in THREE ? THREE[ matJSON.parameters[ parID ] ] : THREE.NormalBlending; - - } else if ( parID === "combine" ) { - - matJSON.parameters[ parID ] = matJSON.parameters[ parID ] in THREE ? THREE[ matJSON.parameters[ parID ] ] : THREE.MultiplyOperation; - - } else if ( parID === "vertexColors" ) { - - if ( matJSON.parameters[ parID ] == "face" ) { - - matJSON.parameters[ parID ] = THREE.FaceColors; - - // default to vertex colors if "vertexColors" is anything else face colors or 0 / null / false - - } else if ( matJSON.parameters[ parID ] ) { - - matJSON.parameters[ parID ] = THREE.VertexColors; - - } - - } else if ( parID === "wrapRGB" ) { - - var v3 = matJSON.parameters[ parID ]; - matJSON.parameters[ parID ] = new THREE.Vector3( v3[ 0 ], v3[ 1 ], v3[ 2 ] ); - - } - - } - - if ( matJSON.parameters.opacity !== undefined && matJSON.parameters.opacity < 1.0 ) { - - matJSON.parameters.transparent = true; - - } - - if ( matJSON.parameters.normalMap ) { - - var shader = THREE.ShaderLib[ "normalmap" ]; - var uniforms = THREE.UniformsUtils.clone( shader.uniforms ); - - var diffuse = matJSON.parameters.color; - var specular = matJSON.parameters.specular; - var ambient = matJSON.parameters.ambient; - var shininess = matJSON.parameters.shininess; - - uniforms[ "tNormal" ].value = result.textures[ matJSON.parameters.normalMap ]; - - if ( matJSON.parameters.normalScale ) { - - uniforms[ "uNormalScale" ].value.set( matJSON.parameters.normalScale[ 0 ], matJSON.parameters.normalScale[ 1 ] ); - - } - - if ( matJSON.parameters.map ) { - - uniforms[ "tDiffuse" ].value = matJSON.parameters.map; - uniforms[ "enableDiffuse" ].value = true; - - } - - if ( matJSON.parameters.envMap ) { - - uniforms[ "tCube" ].value = matJSON.parameters.envMap; - uniforms[ "enableReflection" ].value = true; - uniforms[ "reflectivity" ].value = matJSON.parameters.reflectivity; - - } - - if ( matJSON.parameters.lightMap ) { - - uniforms[ "tAO" ].value = matJSON.parameters.lightMap; - uniforms[ "enableAO" ].value = true; - - } - - if ( matJSON.parameters.specularMap ) { - - uniforms[ "tSpecular" ].value = result.textures[ matJSON.parameters.specularMap ]; - uniforms[ "enableSpecular" ].value = true; - - } - - if ( matJSON.parameters.displacementMap ) { - - uniforms[ "tDisplacement" ].value = result.textures[ matJSON.parameters.displacementMap ]; - uniforms[ "enableDisplacement" ].value = true; - - uniforms[ "uDisplacementBias" ].value = matJSON.parameters.displacementBias; - uniforms[ "uDisplacementScale" ].value = matJSON.parameters.displacementScale; - - } - - uniforms[ "diffuse" ].value.setHex( diffuse ); - uniforms[ "specular" ].value.setHex( specular ); - uniforms[ "ambient" ].value.setHex( ambient ); - - uniforms[ "shininess" ].value = shininess; - - if ( matJSON.parameters.opacity ) { - - uniforms[ "opacity" ].value = matJSON.parameters.opacity; - - } - - var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true }; - - material = new THREE.ShaderMaterial( parameters ); - - } else { - - material = new THREE[ matJSON.type ]( matJSON.parameters ); - - } - - material.name = matID; - - result.materials[ matID ] = material; - - } - - // second pass through all materials to initialize MeshFaceMaterials - // that could be referring to other materials out of order - - for ( matID in data.materials ) { - - matJSON = data.materials[ matID ]; - - if ( matJSON.parameters.materials ) { - - var materialArray = []; - - for ( var i = 0; i < matJSON.parameters.materials.length; i ++ ) { - - var label = matJSON.parameters.materials[ i ]; - materialArray.push( result.materials[ label ] ); - - } - - result.materials[ matID ].materials = materialArray; - - } - - } - - // objects ( synchronous init of procedural primitives ) - - handle_objects(); - - // defaults - - if ( result.cameras && data.defaults.camera ) { - - result.currentCamera = result.cameras[ data.defaults.camera ]; - - } - - if ( result.fogs && data.defaults.fog ) { - - result.scene.fog = result.fogs[ data.defaults.fog ]; - - } - - // synchronous callback - - scope.callbackSync( result ); - - // just in case there are no async elements - - async_callback_gate(); - - } - -} - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.TextureLoader = function ( manager ) { - - this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; - -}; - -THREE.TextureLoader.prototype = { - - constructor: THREE.TextureLoader, - - load: function ( url, onLoad, onProgress, onError ) { - - var scope = this; - - var loader = new THREE.ImageLoader( scope.manager ); - loader.setCrossOrigin( this.crossOrigin ); - loader.load( url, function ( image ) { - - var texture = new THREE.Texture( image ); - texture.needsUpdate = true; - - if ( onLoad !== undefined ) { - - onLoad( texture ); - - } - - } ); - - }, - - setCrossOrigin: function ( value ) { - - this.crossOrigin = value; - - } - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Material = function () { - - this.id = THREE.MaterialIdCount ++; - this.uuid = THREE.Math.generateUUID(); - - this.name = ''; - - this.side = THREE.FrontSide; - - this.opacity = 1; - this.transparent = false; - - this.blending = THREE.NormalBlending; - - this.blendSrc = THREE.SrcAlphaFactor; - this.blendDst = THREE.OneMinusSrcAlphaFactor; - this.blendEquation = THREE.AddEquation; - - this.depthTest = true; - this.depthWrite = true; - - this.polygonOffset = false; - this.polygonOffsetFactor = 0; - this.polygonOffsetUnits = 0; - - this.alphaTest = 0; - - this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer - - this.visible = true; - - this.needsUpdate = true; - -}; - -THREE.Material.prototype = { - - constructor: THREE.Material, - - setValues: function ( values ) { - - if ( values === undefined ) return; - - for ( var key in values ) { - - var newValue = values[ key ]; - - if ( newValue === undefined ) { - - console.warn( 'THREE.Material: \'' + key + '\' parameter is undefined.' ); - continue; - - } - - if ( key in this ) { - - var currentValue = this[ key ]; - - if ( currentValue instanceof THREE.Color ) { - - currentValue.set( newValue ); - - } else if ( currentValue instanceof THREE.Vector3 && newValue instanceof THREE.Vector3 ) { - - currentValue.copy( newValue ); - - } else if ( key == 'overdraw') { - - // ensure overdraw is backwards-compatable with legacy boolean type - this[ key ] = Number(newValue); - - } else { - - this[ key ] = newValue; - - } - - } - - } - - }, - - clone: function ( material ) { - - if ( material === undefined ) material = new THREE.Material(); - - material.name = this.name; - - material.side = this.side; - - material.opacity = this.opacity; - material.transparent = this.transparent; - - material.blending = this.blending; - - material.blendSrc = this.blendSrc; - material.blendDst = this.blendDst; - material.blendEquation = this.blendEquation; - - material.depthTest = this.depthTest; - material.depthWrite = this.depthWrite; - - material.polygonOffset = this.polygonOffset; - material.polygonOffsetFactor = this.polygonOffsetFactor; - material.polygonOffsetUnits = this.polygonOffsetUnits; - - material.alphaTest = this.alphaTest; - - material.overdraw = this.overdraw; - - material.visible = this.visible; - - return material; - - }, - - dispose: function () { - - this.dispatchEvent( { type: 'dispose' } ); - - } - -}; - -THREE.EventDispatcher.prototype.apply( THREE.Material.prototype ); - -THREE.MaterialIdCount = 0; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * opacity: , - * - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * linewidth: , - * linecap: "round", - * linejoin: "round", - * - * vertexColors: - * - * fog: - * } - */ - -THREE.LineBasicMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.color = new THREE.Color( 0xffffff ); - - this.linewidth = 1; - this.linecap = 'round'; - this.linejoin = 'round'; - - this.vertexColors = false; - - this.fog = true; - - this.setValues( parameters ); - -}; - -THREE.LineBasicMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.LineBasicMaterial.prototype.clone = function () { - - var material = new THREE.LineBasicMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.color.copy( this.color ); - - material.linewidth = this.linewidth; - material.linecap = this.linecap; - material.linejoin = this.linejoin; - - material.vertexColors = this.vertexColors; - - material.fog = this.fog; - - return material; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * opacity: , - * - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * linewidth: , - * - * scale: , - * dashSize: , - * gapSize: , - * - * vertexColors: - * - * fog: - * } - */ - -THREE.LineDashedMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.color = new THREE.Color( 0xffffff ); - - this.linewidth = 1; - - this.scale = 1; - this.dashSize = 3; - this.gapSize = 1; - - this.vertexColors = false; - - this.fog = true; - - this.setValues( parameters ); - -}; - -THREE.LineDashedMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.LineDashedMaterial.prototype.clone = function () { - - var material = new THREE.LineDashedMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.color.copy( this.color ); - - material.linewidth = this.linewidth; - - material.scale = this.scale; - material.dashSize = this.dashSize; - material.gapSize = this.gapSize; - - material.vertexColors = this.vertexColors; - - material.fog = this.fog; - - return material; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * opacity: , - * map: new THREE.Texture( ), - * - * lightMap: new THREE.Texture( ), - * - * specularMap: new THREE.Texture( ), - * - * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), - * combine: THREE.Multiply, - * reflectivity: , - * refractionRatio: , - * - * shading: THREE.SmoothShading, - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * wireframe: , - * wireframeLinewidth: , - * - * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, - * - * skinning: , - * morphTargets: , - * - * fog: - * } - */ - -THREE.MeshBasicMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.color = new THREE.Color( 0xffffff ); // emissive - - this.map = null; - - this.lightMap = null; - - this.specularMap = null; - - this.envMap = null; - this.combine = THREE.MultiplyOperation; - this.reflectivity = 1; - this.refractionRatio = 0.98; - - this.fog = true; - - this.shading = THREE.SmoothShading; - - this.wireframe = false; - this.wireframeLinewidth = 1; - this.wireframeLinecap = 'round'; - this.wireframeLinejoin = 'round'; - - this.vertexColors = THREE.NoColors; - - this.skinning = false; - this.morphTargets = false; - - this.setValues( parameters ); - -}; - -THREE.MeshBasicMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.MeshBasicMaterial.prototype.clone = function () { - - var material = new THREE.MeshBasicMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.color.copy( this.color ); - - material.map = this.map; - - material.lightMap = this.lightMap; - - material.specularMap = this.specularMap; - - material.envMap = this.envMap; - material.combine = this.combine; - material.reflectivity = this.reflectivity; - material.refractionRatio = this.refractionRatio; - - material.fog = this.fog; - - material.shading = this.shading; - - material.wireframe = this.wireframe; - material.wireframeLinewidth = this.wireframeLinewidth; - material.wireframeLinecap = this.wireframeLinecap; - material.wireframeLinejoin = this.wireframeLinejoin; - - material.vertexColors = this.vertexColors; - - material.skinning = this.skinning; - material.morphTargets = this.morphTargets; - - return material; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * ambient: , - * emissive: , - * opacity: , - * - * map: new THREE.Texture( ), - * - * lightMap: new THREE.Texture( ), - * - * specularMap: new THREE.Texture( ), - * - * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), - * combine: THREE.Multiply, - * reflectivity: , - * refractionRatio: , - * - * shading: THREE.SmoothShading, - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * wireframe: , - * wireframeLinewidth: , - * - * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, - * - * skinning: , - * morphTargets: , - * morphNormals: , - * - * fog: - * } - */ - -THREE.MeshLambertMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.color = new THREE.Color( 0xffffff ); // diffuse - this.ambient = new THREE.Color( 0xffffff ); - this.emissive = new THREE.Color( 0x000000 ); - - this.wrapAround = false; - this.wrapRGB = new THREE.Vector3( 1, 1, 1 ); - - this.map = null; - - this.lightMap = null; - - this.specularMap = null; - - this.envMap = null; - this.combine = THREE.MultiplyOperation; - this.reflectivity = 1; - this.refractionRatio = 0.98; - - this.fog = true; - - this.shading = THREE.SmoothShading; - - this.wireframe = false; - this.wireframeLinewidth = 1; - this.wireframeLinecap = 'round'; - this.wireframeLinejoin = 'round'; - - this.vertexColors = THREE.NoColors; - - this.skinning = false; - this.morphTargets = false; - this.morphNormals = false; - - this.setValues( parameters ); - -}; - -THREE.MeshLambertMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.MeshLambertMaterial.prototype.clone = function () { - - var material = new THREE.MeshLambertMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.color.copy( this.color ); - material.ambient.copy( this.ambient ); - material.emissive.copy( this.emissive ); - - material.wrapAround = this.wrapAround; - material.wrapRGB.copy( this.wrapRGB ); - - material.map = this.map; - - material.lightMap = this.lightMap; - - material.specularMap = this.specularMap; - - material.envMap = this.envMap; - material.combine = this.combine; - material.reflectivity = this.reflectivity; - material.refractionRatio = this.refractionRatio; - - material.fog = this.fog; - - material.shading = this.shading; - - material.wireframe = this.wireframe; - material.wireframeLinewidth = this.wireframeLinewidth; - material.wireframeLinecap = this.wireframeLinecap; - material.wireframeLinejoin = this.wireframeLinejoin; - - material.vertexColors = this.vertexColors; - - material.skinning = this.skinning; - material.morphTargets = this.morphTargets; - material.morphNormals = this.morphNormals; - - return material; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * ambient: , - * emissive: , - * specular: , - * shininess: , - * opacity: , - * - * map: new THREE.Texture( ), - * - * lightMap: new THREE.Texture( ), - * - * bumpMap: new THREE.Texture( ), - * bumpScale: , - * - * normalMap: new THREE.Texture( ), - * normalScale: , - * - * specularMap: new THREE.Texture( ), - * - * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), - * combine: THREE.Multiply, - * reflectivity: , - * refractionRatio: , - * - * shading: THREE.SmoothShading, - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * wireframe: , - * wireframeLinewidth: , - * - * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, - * - * skinning: , - * morphTargets: , - * morphNormals: , - * - * fog: - * } - */ - -THREE.MeshPhongMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.color = new THREE.Color( 0xffffff ); // diffuse - this.ambient = new THREE.Color( 0xffffff ); - this.emissive = new THREE.Color( 0x000000 ); - this.specular = new THREE.Color( 0x111111 ); - this.shininess = 30; - - this.metal = false; - - this.wrapAround = false; - this.wrapRGB = new THREE.Vector3( 1, 1, 1 ); - - this.map = null; - - this.lightMap = null; - - this.bumpMap = null; - this.bumpScale = 1; - - this.normalMap = null; - this.normalScale = new THREE.Vector2( 1, 1 ); - - this.specularMap = null; - - this.envMap = null; - this.combine = THREE.MultiplyOperation; - this.reflectivity = 1; - this.refractionRatio = 0.98; - - this.fog = true; - - this.shading = THREE.SmoothShading; - - this.wireframe = false; - this.wireframeLinewidth = 1; - this.wireframeLinecap = 'round'; - this.wireframeLinejoin = 'round'; - - this.vertexColors = THREE.NoColors; - - this.skinning = false; - this.morphTargets = false; - this.morphNormals = false; - - this.setValues( parameters ); - -}; - -THREE.MeshPhongMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.MeshPhongMaterial.prototype.clone = function () { - - var material = new THREE.MeshPhongMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.color.copy( this.color ); - material.ambient.copy( this.ambient ); - material.emissive.copy( this.emissive ); - material.specular.copy( this.specular ); - material.shininess = this.shininess; - - material.metal = this.metal; - - material.wrapAround = this.wrapAround; - material.wrapRGB.copy( this.wrapRGB ); - - material.map = this.map; - - material.lightMap = this.lightMap; - - material.bumpMap = this.bumpMap; - material.bumpScale = this.bumpScale; - - material.normalMap = this.normalMap; - material.normalScale.copy( this.normalScale ); - - material.specularMap = this.specularMap; - - material.envMap = this.envMap; - material.combine = this.combine; - material.reflectivity = this.reflectivity; - material.refractionRatio = this.refractionRatio; - - material.fog = this.fog; - - material.shading = this.shading; - - material.wireframe = this.wireframe; - material.wireframeLinewidth = this.wireframeLinewidth; - material.wireframeLinecap = this.wireframeLinecap; - material.wireframeLinejoin = this.wireframeLinejoin; - - material.vertexColors = this.vertexColors; - - material.skinning = this.skinning; - material.morphTargets = this.morphTargets; - material.morphNormals = this.morphNormals; - - return material; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * opacity: , - * - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * wireframe: , - * wireframeLinewidth: - * } - */ - -THREE.MeshDepthMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.wireframe = false; - this.wireframeLinewidth = 1; - - this.setValues( parameters ); - -}; - -THREE.MeshDepthMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.MeshDepthMaterial.prototype.clone = function () { - - var material = new THREE.MeshDepthMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.wireframe = this.wireframe; - material.wireframeLinewidth = this.wireframeLinewidth; - - return material; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * - * parameters = { - * opacity: , - * - * shading: THREE.FlatShading, - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * wireframe: , - * wireframeLinewidth: - * } - */ - -THREE.MeshNormalMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - this.shading = THREE.FlatShading; - - this.wireframe = false; - this.wireframeLinewidth = 1; - - this.morphTargets = false; - - this.setValues( parameters ); - -}; - -THREE.MeshNormalMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.MeshNormalMaterial.prototype.clone = function () { - - var material = new THREE.MeshNormalMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.shading = this.shading; - - material.wireframe = this.wireframe; - material.wireframeLinewidth = this.wireframeLinewidth; - - return material; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.MeshFaceMaterial = function ( materials ) { - - this.materials = materials instanceof Array ? materials : []; - -}; - -THREE.MeshFaceMaterial.prototype.clone = function () { - - var material = new THREE.MeshFaceMaterial(); - - for ( var i = 0; i < this.materials.length; i ++ ) { - - material.materials.push( this.materials[ i ].clone() ); - - } - - return material; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * opacity: , - * map: new THREE.Texture( ), - * - * size: , - * - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * vertexColors: , - * - * fog: - * } - */ - -THREE.ParticleSystemMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.color = new THREE.Color( 0xffffff ); - - this.map = null; - - this.size = 1; - this.sizeAttenuation = true; - - this.vertexColors = false; - - this.fog = true; - - this.setValues( parameters ); - -}; - -THREE.ParticleSystemMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.ParticleSystemMaterial.prototype.clone = function () { - - var material = new THREE.ParticleSystemMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.color.copy( this.color ); - - material.map = this.map; - - material.size = this.size; - material.sizeAttenuation = this.sizeAttenuation; - - material.vertexColors = this.vertexColors; - - material.fog = this.fog; - - return material; - -}; - -// backwards compatibility - -THREE.ParticleBasicMaterial = THREE.ParticleSystemMaterial; - -/** - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * fragmentShader: , - * vertexShader: , - * - * uniforms: { "parameter1": { type: "f", value: 1.0 }, "parameter2": { type: "i" value2: 2 } }, - * - * defines: { "label" : "value" }, - * - * shading: THREE.SmoothShading, - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * wireframe: , - * wireframeLinewidth: , - * - * lights: , - * - * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors, - * - * skinning: , - * morphTargets: , - * morphNormals: , - * - * fog: - * } - */ - -THREE.ShaderMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.fragmentShader = "void main() {}"; - this.vertexShader = "void main() {}"; - this.uniforms = {}; - this.defines = {}; - this.attributes = null; - - this.shading = THREE.SmoothShading; - - this.linewidth = 1; - - this.wireframe = false; - this.wireframeLinewidth = 1; - - this.fog = false; // set to use scene fog - - this.lights = false; // set to use scene lights - - this.vertexColors = THREE.NoColors; // set to use "color" attribute stream - - this.skinning = false; // set to use skinning attribute streams - - this.morphTargets = false; // set to use morph targets - this.morphNormals = false; // set to use morph normals - - // When rendered geometry doesn't include these attributes but the material does, - // use these default values in WebGL. This avoids errors when buffer data is missing. - this.defaultAttributeValues = { - "color" : [ 1, 1, 1], - "uv" : [ 0, 0 ], - "uv2" : [ 0, 0 ] - }; - - // By default, bind position to attribute index 0. In WebGL, attribute 0 - // should always be used to avoid potentially expensive emulation. - this.index0AttributeName = "position"; - - this.setValues( parameters ); - -}; - -THREE.ShaderMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.ShaderMaterial.prototype.clone = function () { - - var material = new THREE.ShaderMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.fragmentShader = this.fragmentShader; - material.vertexShader = this.vertexShader; - - material.uniforms = THREE.UniformsUtils.clone( this.uniforms ); - - material.attributes = this.attributes; - material.defines = this.defines; - - material.shading = this.shading; - - material.wireframe = this.wireframe; - material.wireframeLinewidth = this.wireframeLinewidth; - - material.fog = this.fog; - - material.lights = this.lights; - - material.vertexColors = this.vertexColors; - - material.skinning = this.skinning; - - material.morphTargets = this.morphTargets; - material.morphNormals = this.morphNormals; - - return material; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * opacity: , - * map: new THREE.Texture( ), - * - * blending: THREE.NormalBlending, - * depthTest: , - * depthWrite: , - * - * uvOffset: new THREE.Vector2(), - * uvScale: new THREE.Vector2(), - * - * fog: - * } - */ - -THREE.SpriteMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - // defaults - - this.color = new THREE.Color( 0xffffff ); - this.map = null; - - this.rotation = 0; - - this.fog = false; - - // set parameters - - this.setValues( parameters ); - -}; - -THREE.SpriteMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.SpriteMaterial.prototype.clone = function () { - - var material = new THREE.SpriteMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.color.copy( this.color ); - material.map = this.map; - - material.rotation = this.rotation; - - material.fog = this.fog; - - return material; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * - * parameters = { - * color: , - * program: , - * opacity: , - * blending: THREE.NormalBlending - * } - */ - -THREE.SpriteCanvasMaterial = function ( parameters ) { - - THREE.Material.call( this ); - - this.color = new THREE.Color( 0xffffff ); - this.program = function ( context, color ) {}; - - this.setValues( parameters ); - -}; - -THREE.SpriteCanvasMaterial.prototype = Object.create( THREE.Material.prototype ); - -THREE.SpriteCanvasMaterial.prototype.clone = function () { - - var material = new THREE.SpriteCanvasMaterial(); - - THREE.Material.prototype.clone.call( this, material ); - - material.color.copy( this.color ); - material.program = this.program; - - return material; - -}; - -// backwards compatibility - -THREE.ParticleCanvasMaterial = THREE.SpriteCanvasMaterial; -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author szimek / https://github.com/szimek/ - */ - -THREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { - - this.id = THREE.TextureIdCount ++; - this.uuid = THREE.Math.generateUUID(); - - this.name = ''; - - this.image = image; - this.mipmaps = []; - - this.mapping = mapping !== undefined ? mapping : new THREE.UVMapping(); - - this.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping; - this.wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping; - - this.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter; - this.minFilter = minFilter !== undefined ? minFilter : THREE.LinearMipMapLinearFilter; - - this.anisotropy = anisotropy !== undefined ? anisotropy : 1; - - this.format = format !== undefined ? format : THREE.RGBAFormat; - this.type = type !== undefined ? type : THREE.UnsignedByteType; - - this.offset = new THREE.Vector2( 0, 0 ); - this.repeat = new THREE.Vector2( 1, 1 ); - - this.generateMipmaps = true; - this.premultiplyAlpha = false; - this.flipY = true; - this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) - - this._needsUpdate = false; - this.onUpdate = null; - -}; - -THREE.Texture.prototype = { - - constructor: THREE.Texture, - - get needsUpdate () { - - return this._needsUpdate; - - }, - - set needsUpdate ( value ) { - - if ( value === true ) this.update(); - - this._needsUpdate = value; - - }, - - clone: function ( texture ) { - - if ( texture === undefined ) texture = new THREE.Texture(); - - texture.image = this.image; - texture.mipmaps = this.mipmaps.slice(0); - - texture.mapping = this.mapping; - - texture.wrapS = this.wrapS; - texture.wrapT = this.wrapT; - - texture.magFilter = this.magFilter; - texture.minFilter = this.minFilter; - - texture.anisotropy = this.anisotropy; - - texture.format = this.format; - texture.type = this.type; - - texture.offset.copy( this.offset ); - texture.repeat.copy( this.repeat ); - - texture.generateMipmaps = this.generateMipmaps; - texture.premultiplyAlpha = this.premultiplyAlpha; - texture.flipY = this.flipY; - texture.unpackAlignment = this.unpackAlignment; - - return texture; - - }, - - update: function () { - - this.dispatchEvent( { type: 'update' } ); - - }, - - dispose: function () { - - this.dispatchEvent( { type: 'dispose' } ); - - } - -}; - -THREE.EventDispatcher.prototype.apply( THREE.Texture.prototype ); - -THREE.TextureIdCount = 0; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.CompressedTexture = function ( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) { - - THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); - - this.image = { width: width, height: height }; - this.mipmaps = mipmaps; - - this.generateMipmaps = false; // WebGL currently can't generate mipmaps for compressed textures, they must be embedded in DDS file - -}; - -THREE.CompressedTexture.prototype = Object.create( THREE.Texture.prototype ); - -THREE.CompressedTexture.prototype.clone = function () { - - var texture = new THREE.CompressedTexture(); - - THREE.Texture.prototype.clone.call( this, texture ); - - return texture; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.DataTexture = function ( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) { - - THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); - - this.image = { data: data, width: width, height: height }; - -}; - -THREE.DataTexture.prototype = Object.create( THREE.Texture.prototype ); - -THREE.DataTexture.prototype.clone = function () { - - var texture = new THREE.DataTexture(); - - THREE.Texture.prototype.clone.call( this, texture ); - - return texture; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.ParticleSystem = function ( geometry, material ) { - - THREE.Object3D.call( this ); - - this.geometry = geometry !== undefined ? geometry : new THREE.Geometry(); - this.material = material !== undefined ? material : new THREE.ParticleSystemMaterial( { color: Math.random() * 0xffffff } ); - - this.sortParticles = false; - this.frustumCulled = false; - -}; - -THREE.ParticleSystem.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.ParticleSystem.prototype.clone = function ( object ) { - - if ( object === undefined ) object = new THREE.ParticleSystem( this.geometry, this.material ); - - object.sortParticles = this.sortParticles; - - THREE.Object3D.prototype.clone.call( this, object ); - - return object; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Line = function ( geometry, material, type ) { - - THREE.Object3D.call( this ); - - this.geometry = geometry !== undefined ? geometry : new THREE.Geometry(); - this.material = material !== undefined ? material : new THREE.LineBasicMaterial( { color: Math.random() * 0xffffff } ); - - this.type = ( type !== undefined ) ? type : THREE.LineStrip; - -}; - -THREE.LineStrip = 0; -THREE.LinePieces = 1; - -THREE.Line.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.Line.prototype.clone = function ( object ) { - - if ( object === undefined ) object = new THREE.Line( this.geometry, this.material, this.type ); - - THREE.Object3D.prototype.clone.call( this, object ); - - return object; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author mikael emtinger / http://gomo.se/ - * @author jonobr1 / http://jonobr1.com/ - */ - -THREE.Mesh = function ( geometry, material ) { - - THREE.Object3D.call( this ); - - this.geometry = geometry !== undefined ? geometry : new THREE.Geometry(); - this.material = material !== undefined ? material : new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff } ); - - this.updateMorphTargets(); - -}; - -THREE.Mesh.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.Mesh.prototype.updateMorphTargets = function () { - - if ( this.geometry.morphTargets !== undefined && this.geometry.morphTargets.length > 0 ) { - - this.morphTargetBase = -1; - this.morphTargetForcedOrder = []; - this.morphTargetInfluences = []; - this.morphTargetDictionary = {}; - - for ( var m = 0, ml = this.geometry.morphTargets.length; m < ml; m ++ ) { - - this.morphTargetInfluences.push( 0 ); - this.morphTargetDictionary[ this.geometry.morphTargets[ m ].name ] = m; - - } - - } - -}; - -THREE.Mesh.prototype.getMorphTargetIndexByName = function ( name ) { - - if ( this.morphTargetDictionary[ name ] !== undefined ) { - - return this.morphTargetDictionary[ name ]; - - } - - console.log( "THREE.Mesh.getMorphTargetIndexByName: morph target " + name + " does not exist. Returning 0." ); - - return 0; - -}; - -THREE.Mesh.prototype.clone = function ( object ) { - - if ( object === undefined ) object = new THREE.Mesh( this.geometry, this.material ); - - THREE.Object3D.prototype.clone.call( this, object ); - - return object; - -}; - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Bone = function( belongsToSkin ) { - - THREE.Object3D.call( this ); - - this.skin = belongsToSkin; - this.skinMatrix = new THREE.Matrix4(); - -}; - -THREE.Bone.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.Bone.prototype.update = function ( parentSkinMatrix, forceUpdate ) { - - // update local - - if ( this.matrixAutoUpdate ) { - - forceUpdate |= this.updateMatrix(); - - } - - // update skin matrix - - if ( forceUpdate || this.matrixWorldNeedsUpdate ) { - - if( parentSkinMatrix ) { - - this.skinMatrix.multiplyMatrices( parentSkinMatrix, this.matrix ); - - } else { - - this.skinMatrix.copy( this.matrix ); - - } - - this.matrixWorldNeedsUpdate = false; - forceUpdate = true; - - } - - // update children - - var child, i, l = this.children.length; - - for ( i = 0; i < l; i ++ ) { - - this.children[ i ].update( this.skinMatrix, forceUpdate ); - - } - -}; - - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SkinnedMesh = function ( geometry, material, useVertexTexture ) { - - THREE.Mesh.call( this, geometry, material ); - - // - - this.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true; - - // init bones - - this.identityMatrix = new THREE.Matrix4(); - - this.bones = []; - this.boneMatrices = []; - - var b, bone, gbone, p, q, s; - - if ( this.geometry && this.geometry.bones !== undefined ) { - - for ( b = 0; b < this.geometry.bones.length; b ++ ) { - - gbone = this.geometry.bones[ b ]; - - p = gbone.pos; - q = gbone.rotq; - s = gbone.scl; - - bone = this.addBone(); - - bone.name = gbone.name; - bone.position.set( p[0], p[1], p[2] ); - bone.quaternion.set( q[0], q[1], q[2], q[3] ); - - if ( s !== undefined ) { - - bone.scale.set( s[0], s[1], s[2] ); - - } else { - - bone.scale.set( 1, 1, 1 ); - - } - - } - - for ( b = 0; b < this.bones.length; b ++ ) { - - gbone = this.geometry.bones[ b ]; - bone = this.bones[ b ]; - - if ( gbone.parent === -1 ) { - - this.add( bone ); - - } else { - - this.bones[ gbone.parent ].add( bone ); - - } - - } - - // - - var nBones = this.bones.length; - - if ( this.useVertexTexture ) { - - // layout (1 matrix = 4 pixels) - // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) - // with 8x8 pixel texture max 16 bones (8 * 8 / 4) - // 16x16 pixel texture max 64 bones (16 * 16 / 4) - // 32x32 pixel texture max 256 bones (32 * 32 / 4) - // 64x64 pixel texture max 1024 bones (64 * 64 / 4) - - var size; - - if ( nBones > 256 ) - size = 64; - else if ( nBones > 64 ) - size = 32; - else if ( nBones > 16 ) - size = 16; - else - size = 8; - - this.boneTextureWidth = size; - this.boneTextureHeight = size; - - this.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel - this.boneTexture = new THREE.DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType ); - this.boneTexture.minFilter = THREE.NearestFilter; - this.boneTexture.magFilter = THREE.NearestFilter; - this.boneTexture.generateMipmaps = false; - this.boneTexture.flipY = false; - - } else { - - this.boneMatrices = new Float32Array( 16 * nBones ); - - } - - this.pose(); - - } - -}; - -THREE.SkinnedMesh.prototype = Object.create( THREE.Mesh.prototype ); - -THREE.SkinnedMesh.prototype.addBone = function( bone ) { - - if ( bone === undefined ) { - - bone = new THREE.Bone( this ); - - } - - this.bones.push( bone ); - - return bone; - -}; - -THREE.SkinnedMesh.prototype.updateMatrixWorld = function () { - - var offsetMatrix = new THREE.Matrix4(); - - return function ( force ) { - - this.matrixAutoUpdate && this.updateMatrix(); - - // update matrixWorld - - if ( this.matrixWorldNeedsUpdate || force ) { - - if ( this.parent ) { - - this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); - - } else { - - this.matrixWorld.copy( this.matrix ); - - } - - this.matrixWorldNeedsUpdate = false; - - force = true; - - } - - // update children - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - var child = this.children[ i ]; - - if ( child instanceof THREE.Bone ) { - - child.update( this.identityMatrix, false ); - - } else { - - child.updateMatrixWorld( true ); - - } - - } - - // make a snapshot of the bones' rest position - - if ( this.boneInverses == undefined ) { - - this.boneInverses = []; - - for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { - - var inverse = new THREE.Matrix4(); - - inverse.getInverse( this.bones[ b ].skinMatrix ); - - this.boneInverses.push( inverse ); - - } - - } - - // flatten bone matrices to array - - for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { - - // compute the offset between the current and the original transform; - - // TODO: we could get rid of this multiplication step if the skinMatrix - // was already representing the offset; however, this requires some - // major changes to the animation system - - offsetMatrix.multiplyMatrices( this.bones[ b ].skinMatrix, this.boneInverses[ b ] ); - offsetMatrix.flattenToArrayOffset( this.boneMatrices, b * 16 ); - - } - - if ( this.useVertexTexture ) { - - this.boneTexture.needsUpdate = true; - - } - - }; - -}(); - -THREE.SkinnedMesh.prototype.pose = function () { - - this.updateMatrixWorld( true ); - - this.normalizeSkinWeights(); - -}; - -THREE.SkinnedMesh.prototype.normalizeSkinWeights = function () { - - if ( this.geometry instanceof THREE.Geometry ) { - - for ( var i = 0; i < this.geometry.skinIndices.length; i ++ ) { - - var sw = this.geometry.skinWeights[ i ]; - - var scale = 1.0 / sw.lengthManhattan(); - - if ( scale !== Infinity ) { - - sw.multiplyScalar( scale ); - - } else { - - sw.set( 1 ); // this will be normalized by the shader anyway - - } - - } - - } else { - - // skinning weights assumed to be normalized for THREE.BufferGeometry - - } - -}; - -THREE.SkinnedMesh.prototype.clone = function ( object ) { - - if ( object === undefined ) { - - object = new THREE.SkinnedMesh( this.geometry, this.material, this.useVertexTexture ); - - } - - THREE.Mesh.prototype.clone.call( this, object ); - - return object; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.MorphAnimMesh = function ( geometry, material ) { - - THREE.Mesh.call( this, geometry, material ); - - // API - - this.duration = 1000; // milliseconds - this.mirroredLoop = false; - this.time = 0; - - // internals - - this.lastKeyframe = 0; - this.currentKeyframe = 0; - - this.direction = 1; - this.directionBackwards = false; - - this.setFrameRange( 0, this.geometry.morphTargets.length - 1 ); - -}; - -THREE.MorphAnimMesh.prototype = Object.create( THREE.Mesh.prototype ); - -THREE.MorphAnimMesh.prototype.setFrameRange = function ( start, end ) { - - this.startKeyframe = start; - this.endKeyframe = end; - - this.length = this.endKeyframe - this.startKeyframe + 1; - -}; - -THREE.MorphAnimMesh.prototype.setDirectionForward = function () { - - this.direction = 1; - this.directionBackwards = false; - -}; - -THREE.MorphAnimMesh.prototype.setDirectionBackward = function () { - - this.direction = -1; - this.directionBackwards = true; - -}; - -THREE.MorphAnimMesh.prototype.parseAnimations = function () { - - var geometry = this.geometry; - - if ( ! geometry.animations ) geometry.animations = {}; - - var firstAnimation, animations = geometry.animations; - - var pattern = /([a-z]+)(\d+)/; - - for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { - - var morph = geometry.morphTargets[ i ]; - var parts = morph.name.match( pattern ); - - if ( parts && parts.length > 1 ) { - - var label = parts[ 1 ]; - var num = parts[ 2 ]; - - if ( ! animations[ label ] ) animations[ label ] = { start: Infinity, end: -Infinity }; - - var animation = animations[ label ]; - - if ( i < animation.start ) animation.start = i; - if ( i > animation.end ) animation.end = i; - - if ( ! firstAnimation ) firstAnimation = label; - - } - - } - - geometry.firstAnimation = firstAnimation; - -}; - -THREE.MorphAnimMesh.prototype.setAnimationLabel = function ( label, start, end ) { - - if ( ! this.geometry.animations ) this.geometry.animations = {}; - - this.geometry.animations[ label ] = { start: start, end: end }; - -}; - -THREE.MorphAnimMesh.prototype.playAnimation = function ( label, fps ) { - - var animation = this.geometry.animations[ label ]; - - if ( animation ) { - - this.setFrameRange( animation.start, animation.end ); - this.duration = 1000 * ( ( animation.end - animation.start ) / fps ); - this.time = 0; - - } else { - - console.warn( "animation[" + label + "] undefined" ); - - } - -}; - -THREE.MorphAnimMesh.prototype.updateAnimation = function ( delta ) { - - var frameTime = this.duration / this.length; - - this.time += this.direction * delta; - - if ( this.mirroredLoop ) { - - if ( this.time > this.duration || this.time < 0 ) { - - this.direction *= -1; - - if ( this.time > this.duration ) { - - this.time = this.duration; - this.directionBackwards = true; - - } - - if ( this.time < 0 ) { - - this.time = 0; - this.directionBackwards = false; - - } - - } - - } else { - - this.time = this.time % this.duration; - - if ( this.time < 0 ) this.time += this.duration; - - } - - var keyframe = this.startKeyframe + THREE.Math.clamp( Math.floor( this.time / frameTime ), 0, this.length - 1 ); - - if ( keyframe !== this.currentKeyframe ) { - - this.morphTargetInfluences[ this.lastKeyframe ] = 0; - this.morphTargetInfluences[ this.currentKeyframe ] = 1; - - this.morphTargetInfluences[ keyframe ] = 0; - - this.lastKeyframe = this.currentKeyframe; - this.currentKeyframe = keyframe; - - } - - var mix = ( this.time % frameTime ) / frameTime; - - if ( this.directionBackwards ) { - - mix = 1 - mix; - - } - - this.morphTargetInfluences[ this.currentKeyframe ] = mix; - this.morphTargetInfluences[ this.lastKeyframe ] = 1 - mix; - -}; - -THREE.MorphAnimMesh.prototype.clone = function ( object ) { - - if ( object === undefined ) object = new THREE.MorphAnimMesh( this.geometry, this.material ); - - object.duration = this.duration; - object.mirroredLoop = this.mirroredLoop; - object.time = this.time; - - object.lastKeyframe = this.lastKeyframe; - object.currentKeyframe = this.currentKeyframe; - - object.direction = this.direction; - object.directionBackwards = this.directionBackwards; - - THREE.Mesh.prototype.clone.call( this, object ); - - return object; - -}; - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.LOD = function () { - - THREE.Object3D.call( this ); - - this.objects = []; - -}; - - -THREE.LOD.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.LOD.prototype.addLevel = function ( object, distance ) { - - if ( distance === undefined ) distance = 0; - - distance = Math.abs( distance ); - - for ( var l = 0; l < this.objects.length; l ++ ) { - - if ( distance < this.objects[ l ].distance ) { - - break; - - } - - } - - this.objects.splice( l, 0, { distance: distance, object: object } ); - this.add( object ); - -}; - -THREE.LOD.prototype.getObjectForDistance = function ( distance ) { - - for ( var i = 1, l = this.objects.length; i < l; i ++ ) { - - if ( distance < this.objects[ i ].distance ) { - - break; - - } - - } - - return this.objects[ i - 1 ].object; - -}; - -THREE.LOD.prototype.update = function () { - - var v1 = new THREE.Vector3(); - var v2 = new THREE.Vector3(); - - return function ( camera ) { - - if ( this.objects.length > 1 ) { - - v1.setFromMatrixPosition( camera.matrixWorld ); - v2.setFromMatrixPosition( this.matrixWorld ); - - var distance = v1.distanceTo( v2 ); - - this.objects[ 0 ].object.visible = true; - - for ( var i = 1, l = this.objects.length; i < l; i ++ ) { - - if ( distance >= this.objects[ i ].distance ) { - - this.objects[ i - 1 ].object.visible = false; - this.objects[ i ].object.visible = true; - - } else { - - break; - - } - - } - - for( ; i < l; i ++ ) { - - this.objects[ i ].object.visible = false; - - } - - } - - }; - -}(); - -THREE.LOD.prototype.clone = function ( object ) { - - if ( object === undefined ) object = new THREE.LOD(); - - THREE.Object3D.prototype.clone.call( this, object ); - - for ( var i = 0, l = this.objects.length; i < l; i ++ ) { - var x = this.objects[i].object.clone(); - x.visible = i === 0; - object.addLevel( x, this.objects[i].distance ); - } - - return object; - -}; - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Sprite = ( function () { - - var geometry = new THREE.Geometry2( 3 ); - geometry.vertices.set( [ - 0.5, - 0.5, 0, 0.5, - 0.5, 0, 0.5, 0.5, 0 ] ); - - return function ( material ) { - - THREE.Object3D.call( this ); - - this.geometry = geometry; - this.material = ( material !== undefined ) ? material : new THREE.SpriteMaterial(); - - }; - -} )(); - -THREE.Sprite.prototype = Object.create( THREE.Object3D.prototype ); - -/* - * Custom update matrix - */ - -THREE.Sprite.prototype.updateMatrix = function () { - - this.matrix.compose( this.position, this.quaternion, this.scale ); - - this.matrixWorldNeedsUpdate = true; - -}; - -THREE.Sprite.prototype.clone = function ( object ) { - - if ( object === undefined ) object = new THREE.Sprite( this.material ); - - THREE.Object3D.prototype.clone.call( this, object ); - - return object; - -}; - -// Backwards compatibility - -THREE.Particle = THREE.Sprite; -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.Scene = function () { - - THREE.Object3D.call( this ); - - this.fog = null; - this.overrideMaterial = null; - - this.autoUpdate = true; // checked by the renderer - this.matrixAutoUpdate = false; - - this.__lights = []; - - this.__objectsAdded = []; - this.__objectsRemoved = []; - -}; - -THREE.Scene.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.Scene.prototype.__addObject = function ( object ) { - - if ( object instanceof THREE.Light ) { - - if ( this.__lights.indexOf( object ) === - 1 ) { - - this.__lights.push( object ); - - } - - if ( object.target && object.target.parent === undefined ) { - - this.add( object.target ); - - } - - } else if ( !( object instanceof THREE.Camera || object instanceof THREE.Bone ) ) { - - this.__objectsAdded.push( object ); - - // check if previously removed - - var i = this.__objectsRemoved.indexOf( object ); - - if ( i !== -1 ) { - - this.__objectsRemoved.splice( i, 1 ); - - } - - } - - this.dispatchEvent( { type: 'objectAdded', object: object } ); - object.dispatchEvent( { type: 'addedToScene', scene: this } ); - - for ( var c = 0; c < object.children.length; c ++ ) { - - this.__addObject( object.children[ c ] ); - - } - -}; - -THREE.Scene.prototype.__removeObject = function ( object ) { - - if ( object instanceof THREE.Light ) { - - var i = this.__lights.indexOf( object ); - - if ( i !== -1 ) { - - this.__lights.splice( i, 1 ); - - } - - if ( object.shadowCascadeArray ) { - - for ( var x = 0; x < object.shadowCascadeArray.length; x ++ ) { - - this.__removeObject( object.shadowCascadeArray[ x ] ); - - } - - } - - } else if ( !( object instanceof THREE.Camera ) ) { - - this.__objectsRemoved.push( object ); - - // check if previously added - - var i = this.__objectsAdded.indexOf( object ); - - if ( i !== -1 ) { - - this.__objectsAdded.splice( i, 1 ); - - } - - } - - this.dispatchEvent( { type: 'objectRemoved', object: object } ); - object.dispatchEvent( { type: 'removedFromScene', scene: this } ); - - for ( var c = 0; c < object.children.length; c ++ ) { - - this.__removeObject( object.children[ c ] ); - - } - -}; - -THREE.Scene.prototype.clone = function ( object ) { - - if ( object === undefined ) object = new THREE.Scene(); - - THREE.Object3D.prototype.clone.call(this, object); - - if ( this.fog !== null ) object.fog = this.fog.clone(); - if ( this.overrideMaterial !== null ) object.overrideMaterial = this.overrideMaterial.clone(); - - object.autoUpdate = this.autoUpdate; - object.matrixAutoUpdate = this.matrixAutoUpdate; - - return object; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Fog = function ( color, near, far ) { - - this.name = ''; - - this.color = new THREE.Color( color ); - - this.near = ( near !== undefined ) ? near : 1; - this.far = ( far !== undefined ) ? far : 1000; - -}; - -THREE.Fog.prototype.clone = function () { - - return new THREE.Fog( this.color.getHex(), this.near, this.far ); - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.FogExp2 = function ( color, density ) { - - this.name = ''; - - this.color = new THREE.Color( color ); - this.density = ( density !== undefined ) ? density : 0.00025; - -}; - -THREE.FogExp2.prototype.clone = function () { - - return new THREE.FogExp2( this.color.getHex(), this.density ); - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.CanvasRenderer = function ( parameters ) { - - console.log( 'THREE.CanvasRenderer', THREE.REVISION ); - - var smoothstep = THREE.Math.smoothstep; - - parameters = parameters || {}; - - var _this = this, - _renderData, _elements, _lights, - _projector = new THREE.Projector(), - - _canvas = parameters.canvas !== undefined - ? parameters.canvas - : document.createElement( 'canvas' ), - - _canvasWidth = _canvas.width, - _canvasHeight = _canvas.height, - _canvasWidthHalf = Math.floor( _canvasWidth / 2 ), - _canvasHeightHalf = Math.floor( _canvasHeight / 2 ), - - _context = _canvas.getContext( '2d', { - alpha: parameters.alpha === true - } ), - - _clearColor = new THREE.Color( 0x000000 ), - _clearAlpha = 0, - - _contextGlobalAlpha = 1, - _contextGlobalCompositeOperation = 0, - _contextStrokeStyle = null, - _contextFillStyle = null, - _contextLineWidth = null, - _contextLineCap = null, - _contextLineJoin = null, - _contextDashSize = null, - _contextGapSize = 0, - - _camera, - - _v1, _v2, _v3, _v4, - _v5 = new THREE.RenderableVertex(), - _v6 = new THREE.RenderableVertex(), - - _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, - _v4x, _v4y, _v5x, _v5y, _v6x, _v6y, - - _color = new THREE.Color(), - _color1 = new THREE.Color(), - _color2 = new THREE.Color(), - _color3 = new THREE.Color(), - _color4 = new THREE.Color(), - - _diffuseColor = new THREE.Color(), - _emissiveColor = new THREE.Color(), - - _lightColor = new THREE.Color(), - - _patterns = {}, - - _near, _far, - - _image, _uvs, - _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, - - _clipBox = new THREE.Box2(), - _clearBox = new THREE.Box2(), - _elemBox = new THREE.Box2(), - - _ambientLight = new THREE.Color(), - _directionalLights = new THREE.Color(), - _pointLights = new THREE.Color(), - - _vector3 = new THREE.Vector3(), // Needed for PointLight - _normal = new THREE.Vector3(), - _normalViewMatrix = new THREE.Matrix3(), - - _pixelMap, _pixelMapContext, _pixelMapImage, _pixelMapData, - _gradientMap, _gradientMapContext, _gradientMapQuality = 16; - - _pixelMap = document.createElement( 'canvas' ); - _pixelMap.width = _pixelMap.height = 2; - - _pixelMapContext = _pixelMap.getContext( '2d' ); - _pixelMapContext.fillStyle = 'rgba(0,0,0,1)'; - _pixelMapContext.fillRect( 0, 0, 2, 2 ); - - _pixelMapImage = _pixelMapContext.getImageData( 0, 0, 2, 2 ); - _pixelMapData = _pixelMapImage.data; - - _gradientMap = document.createElement( 'canvas' ); - _gradientMap.width = _gradientMap.height = _gradientMapQuality; - - _gradientMapContext = _gradientMap.getContext( '2d' ); - _gradientMapContext.translate( - _gradientMapQuality / 2, - _gradientMapQuality / 2 ); - _gradientMapContext.scale( _gradientMapQuality, _gradientMapQuality ); - - _gradientMapQuality --; // Fix UVs - - // dash+gap fallbacks for Firefox and everything else - - if ( _context.setLineDash === undefined ) { - - if ( _context.mozDash !== undefined ) { - - _context.setLineDash = function ( values ) { - - _context.mozDash = values[ 0 ] !== null ? values : null; - - } - - } else { - - _context.setLineDash = function () {} - - } - - } - - this.domElement = _canvas; - - this.devicePixelRatio = parameters.devicePixelRatio !== undefined - ? parameters.devicePixelRatio - : self.devicePixelRatio !== undefined - ? self.devicePixelRatio - : 1; - - this.autoClear = true; - this.sortObjects = true; - this.sortElements = true; - - this.info = { - - render: { - - vertices: 0, - faces: 0 - - } - - } - - // WebGLRenderer compatibility - - this.supportsVertexTextures = function () {}; - this.setFaceCulling = function () {}; - - this.setSize = function ( width, height, updateStyle ) { - - _canvasWidth = width * this.devicePixelRatio; - _canvasHeight = height * this.devicePixelRatio; - - _canvasWidthHalf = Math.floor( _canvasWidth / 2 ); - _canvasHeightHalf = Math.floor( _canvasHeight / 2 ); - - _canvas.width = _canvasWidth; - _canvas.height = _canvasHeight; - - if ( this.devicePixelRatio !== 1 && updateStyle !== false ) { - - _canvas.style.width = width + 'px'; - _canvas.style.height = height + 'px'; - - } - - _clipBox.min.set( - _canvasWidthHalf, - _canvasHeightHalf ), - _clipBox.max.set( _canvasWidthHalf, _canvasHeightHalf ); - - _clearBox.min.set( - _canvasWidthHalf, - _canvasHeightHalf ); - _clearBox.max.set( _canvasWidthHalf, _canvasHeightHalf ); - - _contextGlobalAlpha = 1; - _contextGlobalCompositeOperation = 0; - _contextStrokeStyle = null; - _contextFillStyle = null; - _contextLineWidth = null; - _contextLineCap = null; - _contextLineJoin = null; - - }; - - this.setClearColor = function ( color, alpha ) { - - _clearColor.set( color ); - _clearAlpha = alpha !== undefined ? alpha : 1; - - _clearBox.min.set( - _canvasWidthHalf, - _canvasHeightHalf ); - _clearBox.max.set( _canvasWidthHalf, _canvasHeightHalf ); - - }; - - this.setClearColorHex = function ( hex, alpha ) { - - console.warn( 'DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.' ); - this.setClearColor( hex, alpha ); - - }; - - this.getMaxAnisotropy = function () { - - return 0; - - }; - - this.clear = function () { - - _context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf ); - - if ( _clearBox.empty() === false ) { - - _clearBox.intersect( _clipBox ); - _clearBox.expandByScalar( 2 ); - - if ( _clearAlpha < 1 ) { - - _context.clearRect( - _clearBox.min.x | 0, - _clearBox.min.y | 0, - ( _clearBox.max.x - _clearBox.min.x ) | 0, - ( _clearBox.max.y - _clearBox.min.y ) | 0 - ); - - } - - if ( _clearAlpha > 0 ) { - - setBlending( THREE.NormalBlending ); - setOpacity( 1 ); - - setFillStyle( 'rgba(' + Math.floor( _clearColor.r * 255 ) + ',' + Math.floor( _clearColor.g * 255 ) + ',' + Math.floor( _clearColor.b * 255 ) + ',' + _clearAlpha + ')' ); - - _context.fillRect( - _clearBox.min.x | 0, - _clearBox.min.y | 0, - ( _clearBox.max.x - _clearBox.min.x ) | 0, - ( _clearBox.max.y - _clearBox.min.y ) | 0 - ); - - } - - _clearBox.makeEmpty(); - - } - - }; - - // compatibility - - this.clearColor = function () {}; - this.clearDepth = function () {}; - this.clearStencil = function () {}; - - this.render = function ( scene, camera ) { - - if ( camera instanceof THREE.Camera === false ) { - - console.error( 'THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.' ); - return; - - } - - if ( this.autoClear === true ) this.clear(); - - _context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf ); - - _this.info.render.vertices = 0; - _this.info.render.faces = 0; - - _renderData = _projector.projectScene( scene, camera, this.sortObjects, this.sortElements ); - _elements = _renderData.elements; - _lights = _renderData.lights; - _camera = camera; - - _normalViewMatrix.getNormalMatrix( camera.matrixWorldInverse ); - - /* DEBUG - setFillStyle( 'rgba( 0, 255, 255, 0.5 )' ); - _context.fillRect( _clipBox.min.x, _clipBox.min.y, _clipBox.max.x - _clipBox.min.x, _clipBox.max.y - _clipBox.min.y ); - */ - - calculateLights(); - - for ( var e = 0, el = _elements.length; e < el; e ++ ) { - - var element = _elements[ e ]; - - var material = element.material; - - if ( material === undefined || material.visible === false ) continue; - - _elemBox.makeEmpty(); - - if ( element instanceof THREE.RenderableSprite ) { - - _v1 = element; - _v1.x *= _canvasWidthHalf; _v1.y *= _canvasHeightHalf; - - renderSprite( _v1, element, material ); - - } else if ( element instanceof THREE.RenderableLine ) { - - _v1 = element.v1; _v2 = element.v2; - - _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf; - _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf; - - _elemBox.setFromPoints( [ - _v1.positionScreen, - _v2.positionScreen - ] ); - - if ( _clipBox.isIntersectionBox( _elemBox ) === true ) { - - renderLine( _v1, _v2, element, material ); - - } - - } else if ( element instanceof THREE.RenderableFace ) { - - _v1 = element.v1; _v2 = element.v2; _v3 = element.v3; - - if ( _v1.positionScreen.z < -1 || _v1.positionScreen.z > 1 ) continue; - if ( _v2.positionScreen.z < -1 || _v2.positionScreen.z > 1 ) continue; - if ( _v3.positionScreen.z < -1 || _v3.positionScreen.z > 1 ) continue; - - _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf; - _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf; - _v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf; - - if ( material.overdraw > 0 ) { - - expand( _v1.positionScreen, _v2.positionScreen, material.overdraw ); - expand( _v2.positionScreen, _v3.positionScreen, material.overdraw ); - expand( _v3.positionScreen, _v1.positionScreen, material.overdraw ); - - } - - _elemBox.setFromPoints( [ - _v1.positionScreen, - _v2.positionScreen, - _v3.positionScreen - ] ); - - if ( _clipBox.isIntersectionBox( _elemBox ) === true ) { - - renderFace3( _v1, _v2, _v3, 0, 1, 2, element, material ); - - } - - } - - /* DEBUG - setLineWidth( 1 ); - setStrokeStyle( 'rgba( 0, 255, 0, 0.5 )' ); - _context.strokeRect( _elemBox.min.x, _elemBox.min.y, _elemBox.max.x - _elemBox.min.x, _elemBox.max.y - _elemBox.min.y ); - */ - - _clearBox.union( _elemBox ); - - } - - /* DEBUG - setLineWidth( 1 ); - setStrokeStyle( 'rgba( 255, 0, 0, 0.5 )' ); - _context.strokeRect( _clearBox.min.x, _clearBox.min.y, _clearBox.max.x - _clearBox.min.x, _clearBox.max.y - _clearBox.min.y ); - */ - - _context.setTransform( 1, 0, 0, 1, 0, 0 ); - - }; - - // - - function calculateLights() { - - _ambientLight.setRGB( 0, 0, 0 ); - _directionalLights.setRGB( 0, 0, 0 ); - _pointLights.setRGB( 0, 0, 0 ); - - for ( var l = 0, ll = _lights.length; l < ll; l ++ ) { - - var light = _lights[ l ]; - var lightColor = light.color; - - if ( light instanceof THREE.AmbientLight ) { - - _ambientLight.add( lightColor ); - - } else if ( light instanceof THREE.DirectionalLight ) { - - // for sprites - - _directionalLights.add( lightColor ); - - } else if ( light instanceof THREE.PointLight ) { - - // for sprites - - _pointLights.add( lightColor ); - - } - - } - - } - - function calculateLight( position, normal, color ) { - - for ( var l = 0, ll = _lights.length; l < ll; l ++ ) { - - var light = _lights[ l ]; - - _lightColor.copy( light.color ); - - if ( light instanceof THREE.DirectionalLight ) { - - var lightPosition = _vector3.setFromMatrixPosition( light.matrixWorld ).normalize(); - - var amount = normal.dot( lightPosition ); - - if ( amount <= 0 ) continue; - - amount *= light.intensity; - - color.add( _lightColor.multiplyScalar( amount ) ); - - } else if ( light instanceof THREE.PointLight ) { - - var lightPosition = _vector3.setFromMatrixPosition( light.matrixWorld ); - - var amount = normal.dot( _vector3.subVectors( lightPosition, position ).normalize() ); - - if ( amount <= 0 ) continue; - - amount *= light.distance == 0 ? 1 : 1 - Math.min( position.distanceTo( lightPosition ) / light.distance, 1 ); - - if ( amount == 0 ) continue; - - amount *= light.intensity; - - color.add( _lightColor.multiplyScalar( amount ) ); - - } - - } - - } - - function renderSprite( v1, element, material ) { - - setOpacity( material.opacity ); - setBlending( material.blending ); - - var scaleX = element.scale.x * _canvasWidthHalf; - var scaleY = element.scale.y * _canvasHeightHalf; - - var dist = 0.5 * Math.sqrt( scaleX * scaleX + scaleY * scaleY ); // allow for rotated sprite - _elemBox.min.set( v1.x - dist, v1.y - dist ); - _elemBox.max.set( v1.x + dist, v1.y + dist ); - - if ( material instanceof THREE.SpriteMaterial || - material instanceof THREE.ParticleSystemMaterial ) { // Backwards compatibility - - var texture = material.map; - - if ( texture !== null ) { - - if ( texture.hasEventListener( 'update', onTextureUpdate ) === false ) { - - if ( texture.image !== undefined && texture.image.width > 0 ) { - - textureToPattern( texture ); - - } - - texture.addEventListener( 'update', onTextureUpdate ); - - } - - var pattern = _patterns[ texture.id ]; - - if ( pattern !== undefined ) { - - setFillStyle( pattern ); - - } else { - - setFillStyle( 'rgba( 0, 0, 0, 1 )' ); - - } - - // - - var bitmap = texture.image; - - var ox = bitmap.width * texture.offset.x; - var oy = bitmap.height * texture.offset.y; - - var sx = bitmap.width * texture.repeat.x; - var sy = bitmap.height * texture.repeat.y; - - var cx = scaleX / sx; - var cy = scaleY / sy; - - _context.save(); - _context.translate( v1.x, v1.y ); - if ( material.rotation !== 0 ) _context.rotate( material.rotation ); - _context.translate( - scaleX / 2, - scaleY / 2 ); - _context.scale( cx, cy ); - _context.translate( - ox, - oy ); - _context.fillRect( ox, oy, sx, sy ); - _context.restore(); - - } else { // no texture - - setFillStyle( material.color.getStyle() ); - - _context.save(); - _context.translate( v1.x, v1.y ); - if ( material.rotation !== 0 ) _context.rotate( material.rotation ); - _context.scale( scaleX, - scaleY ); - _context.fillRect( - 0.5, - 0.5, 1, 1 ); - _context.restore(); - - } - - } else if ( material instanceof THREE.SpriteCanvasMaterial ) { - - setStrokeStyle( material.color.getStyle() ); - setFillStyle( material.color.getStyle() ); - - _context.save(); - _context.translate( v1.x, v1.y ); - if ( material.rotation !== 0 ) _context.rotate( material.rotation ); - _context.scale( scaleX, scaleY ); - - material.program( _context ); - - _context.restore(); - - } - - /* DEBUG - setStrokeStyle( 'rgb(255,255,0)' ); - _context.beginPath(); - _context.moveTo( v1.x - 10, v1.y ); - _context.lineTo( v1.x + 10, v1.y ); - _context.moveTo( v1.x, v1.y - 10 ); - _context.lineTo( v1.x, v1.y + 10 ); - _context.stroke(); - */ - - } - - function renderLine( v1, v2, element, material ) { - - setOpacity( material.opacity ); - setBlending( material.blending ); - - _context.beginPath(); - _context.moveTo( v1.positionScreen.x, v1.positionScreen.y ); - _context.lineTo( v2.positionScreen.x, v2.positionScreen.y ); - - if ( material instanceof THREE.LineBasicMaterial ) { - - setLineWidth( material.linewidth ); - setLineCap( material.linecap ); - setLineJoin( material.linejoin ); - - if ( material.vertexColors !== THREE.VertexColors ) { - - setStrokeStyle( material.color.getStyle() ); - - } else { - - var colorStyle1 = element.vertexColors[0].getStyle(); - var colorStyle2 = element.vertexColors[1].getStyle(); - - if ( colorStyle1 === colorStyle2 ) { - - setStrokeStyle( colorStyle1 ); - - } else { - - try { - - var grad = _context.createLinearGradient( - v1.positionScreen.x, - v1.positionScreen.y, - v2.positionScreen.x, - v2.positionScreen.y - ); - grad.addColorStop( 0, colorStyle1 ); - grad.addColorStop( 1, colorStyle2 ); - - } catch ( exception ) { - - grad = colorStyle1; - - } - - setStrokeStyle( grad ); - - } - - } - - _context.stroke(); - _elemBox.expandByScalar( material.linewidth * 2 ); - - } else if ( material instanceof THREE.LineDashedMaterial ) { - - setLineWidth( material.linewidth ); - setLineCap( material.linecap ); - setLineJoin( material.linejoin ); - setStrokeStyle( material.color.getStyle() ); - setDashAndGap( material.dashSize, material.gapSize ); - - _context.stroke(); - - _elemBox.expandByScalar( material.linewidth * 2 ); - - setDashAndGap( null, null ); - - } - - } - - function renderFace3( v1, v2, v3, uv1, uv2, uv3, element, material ) { - - _this.info.render.vertices += 3; - _this.info.render.faces ++; - - setOpacity( material.opacity ); - setBlending( material.blending ); - - _v1x = v1.positionScreen.x; _v1y = v1.positionScreen.y; - _v2x = v2.positionScreen.x; _v2y = v2.positionScreen.y; - _v3x = v3.positionScreen.x; _v3y = v3.positionScreen.y; - - drawTriangle( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y ); - - if ( ( material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) && material.map === null ) { - - _diffuseColor.copy( material.color ); - _emissiveColor.copy( material.emissive ); - - if ( material.vertexColors === THREE.FaceColors ) { - - _diffuseColor.multiply( element.color ); - - } - - if ( material.wireframe === false && material.shading === THREE.SmoothShading && element.vertexNormalsLength === 3 ) { - - _color1.copy( _ambientLight ); - _color2.copy( _ambientLight ); - _color3.copy( _ambientLight ); - - calculateLight( element.v1.positionWorld, element.vertexNormalsModel[ 0 ], _color1 ); - calculateLight( element.v2.positionWorld, element.vertexNormalsModel[ 1 ], _color2 ); - calculateLight( element.v3.positionWorld, element.vertexNormalsModel[ 2 ], _color3 ); - - _color1.multiply( _diffuseColor ).add( _emissiveColor ); - _color2.multiply( _diffuseColor ).add( _emissiveColor ); - _color3.multiply( _diffuseColor ).add( _emissiveColor ); - _color4.addColors( _color2, _color3 ).multiplyScalar( 0.5 ); - - _image = getGradientTexture( _color1, _color2, _color3, _color4 ); - - clipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image ); - - } else { - - _color.copy( _ambientLight ); - - calculateLight( element.centroidModel, element.normalModel, _color ); - - _color.multiply( _diffuseColor ).add( _emissiveColor ); - - material.wireframe === true - ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) - : fillPath( _color ); - - } - - } else if ( material instanceof THREE.MeshBasicMaterial || material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) { - - if ( material.map !== null ) { - - if ( material.map.mapping instanceof THREE.UVMapping ) { - - _uvs = element.uvs[ 0 ]; - patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uvs[ uv1 ].x, _uvs[ uv1 ].y, _uvs[ uv2 ].x, _uvs[ uv2 ].y, _uvs[ uv3 ].x, _uvs[ uv3 ].y, material.map ); - - } - - - } else if ( material.envMap !== null ) { - - if ( material.envMap.mapping instanceof THREE.SphericalReflectionMapping ) { - - _normal.copy( element.vertexNormalsModel[ uv1 ] ).applyMatrix3( _normalViewMatrix ); - _uv1x = 0.5 * _normal.x + 0.5; - _uv1y = 0.5 * _normal.y + 0.5; - - _normal.copy( element.vertexNormalsModel[ uv2 ] ).applyMatrix3( _normalViewMatrix ); - _uv2x = 0.5 * _normal.x + 0.5; - _uv2y = 0.5 * _normal.y + 0.5; - - _normal.copy( element.vertexNormalsModel[ uv3 ] ).applyMatrix3( _normalViewMatrix ); - _uv3x = 0.5 * _normal.x + 0.5; - _uv3y = 0.5 * _normal.y + 0.5; - - patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, material.envMap ); - - }/* else if ( material.envMap.mapping === THREE.SphericalRefractionMapping ) { - - - - }*/ - - - } else { - - _color.copy( material.color ); - - if ( material.vertexColors === THREE.FaceColors ) { - - _color.multiply( element.color ); - - } - - material.wireframe === true - ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) - : fillPath( _color ); - - } - - } else if ( material instanceof THREE.MeshDepthMaterial ) { - - _near = _camera.near; - _far = _camera.far; - - _color1.r = _color1.g = _color1.b = 1 - smoothstep( v1.positionScreen.z * v1.positionScreen.w, _near, _far ); - _color2.r = _color2.g = _color2.b = 1 - smoothstep( v2.positionScreen.z * v2.positionScreen.w, _near, _far ); - _color3.r = _color3.g = _color3.b = 1 - smoothstep( v3.positionScreen.z * v3.positionScreen.w, _near, _far ); - _color4.addColors( _color2, _color3 ).multiplyScalar( 0.5 ); - - _image = getGradientTexture( _color1, _color2, _color3, _color4 ); - - clipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image ); - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - if ( material.shading === THREE.FlatShading ) { - - _normal.copy( element.normalModel ).applyMatrix3( _normalViewMatrix ); - - _color.setRGB( _normal.x, _normal.y, _normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 ); - - material.wireframe === true - ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) - : fillPath( _color ); - - } else if ( material.shading === THREE.SmoothShading ) { - - _normal.copy( element.vertexNormalsModel[ uv1 ] ).applyMatrix3( _normalViewMatrix ); - _color1.setRGB( _normal.x, _normal.y, _normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 ); - - _normal.copy( element.vertexNormalsModel[ uv2 ] ).applyMatrix3( _normalViewMatrix ); - _color2.setRGB( _normal.x, _normal.y, _normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 ); - - _normal.copy( element.vertexNormalsModel[ uv3 ] ).applyMatrix3( _normalViewMatrix ); - _color3.setRGB( _normal.x, _normal.y, _normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 ); - - _color4.addColors( _color2, _color3 ).multiplyScalar( 0.5 ); - - _image = getGradientTexture( _color1, _color2, _color3, _color4 ); - - clipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image ); - - } - - } - - } - - // - - function drawTriangle( x0, y0, x1, y1, x2, y2 ) { - - _context.beginPath(); - _context.moveTo( x0, y0 ); - _context.lineTo( x1, y1 ); - _context.lineTo( x2, y2 ); - _context.closePath(); - - } - - function strokePath( color, linewidth, linecap, linejoin ) { - - setLineWidth( linewidth ); - setLineCap( linecap ); - setLineJoin( linejoin ); - setStrokeStyle( color.getStyle() ); - - _context.stroke(); - - _elemBox.expandByScalar( linewidth * 2 ); - - } - - function fillPath( color ) { - - setFillStyle( color.getStyle() ); - _context.fill(); - - } - - function onTextureUpdate ( event ) { - - textureToPattern( event.target ); - - } - - function textureToPattern( texture ) { - - var repeatX = texture.wrapS === THREE.RepeatWrapping; - var repeatY = texture.wrapT === THREE.RepeatWrapping; - - var image = texture.image; - - var canvas = document.createElement( 'canvas' ); - canvas.width = image.width; - canvas.height = image.height; - - var context = canvas.getContext( '2d' ); - context.setTransform( 1, 0, 0, - 1, 0, image.height ); - context.drawImage( image, 0, 0 ); - - _patterns[ texture.id ] = _context.createPattern( - canvas, repeatX === true && repeatY === true - ? 'repeat' - : repeatX === true && repeatY === false - ? 'repeat-x' - : repeatX === false && repeatY === true - ? 'repeat-y' - : 'no-repeat' - ); - - } - - function patternPath( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, texture ) { - - if ( texture instanceof THREE.DataTexture ) return; - - if ( texture.hasEventListener( 'update', onTextureUpdate ) === false ) { - - if ( texture.image !== undefined && texture.image.width > 0 ) { - - textureToPattern( texture ); - - } - - texture.addEventListener( 'update', onTextureUpdate ); - - } - - var pattern = _patterns[ texture.id ]; - - if ( pattern !== undefined ) { - - setFillStyle( pattern ); - - } else { - - setFillStyle( 'rgba(0,0,0,1)' ); - _context.fill(); - - return; - - } - - // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120 - - var a, b, c, d, e, f, det, idet, - offsetX = texture.offset.x / texture.repeat.x, - offsetY = texture.offset.y / texture.repeat.y, - width = texture.image.width * texture.repeat.x, - height = texture.image.height * texture.repeat.y; - - u0 = ( u0 + offsetX ) * width; - v0 = ( v0 + offsetY ) * height; - - u1 = ( u1 + offsetX ) * width; - v1 = ( v1 + offsetY ) * height; - - u2 = ( u2 + offsetX ) * width; - v2 = ( v2 + offsetY ) * height; - - x1 -= x0; y1 -= y0; - x2 -= x0; y2 -= y0; - - u1 -= u0; v1 -= v0; - u2 -= u0; v2 -= v0; - - det = u1 * v2 - u2 * v1; - - if ( det === 0 ) return; - - idet = 1 / det; - - a = ( v2 * x1 - v1 * x2 ) * idet; - b = ( v2 * y1 - v1 * y2 ) * idet; - c = ( u1 * x2 - u2 * x1 ) * idet; - d = ( u1 * y2 - u2 * y1 ) * idet; - - e = x0 - a * u0 - c * v0; - f = y0 - b * u0 - d * v0; - - _context.save(); - _context.transform( a, b, c, d, e, f ); - _context.fill(); - _context.restore(); - - } - - function clipImage( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, image ) { - - // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120 - - var a, b, c, d, e, f, det, idet, - width = image.width - 1, - height = image.height - 1; - - u0 *= width; v0 *= height; - u1 *= width; v1 *= height; - u2 *= width; v2 *= height; - - x1 -= x0; y1 -= y0; - x2 -= x0; y2 -= y0; - - u1 -= u0; v1 -= v0; - u2 -= u0; v2 -= v0; - - det = u1 * v2 - u2 * v1; - - idet = 1 / det; - - a = ( v2 * x1 - v1 * x2 ) * idet; - b = ( v2 * y1 - v1 * y2 ) * idet; - c = ( u1 * x2 - u2 * x1 ) * idet; - d = ( u1 * y2 - u2 * y1 ) * idet; - - e = x0 - a * u0 - c * v0; - f = y0 - b * u0 - d * v0; - - _context.save(); - _context.transform( a, b, c, d, e, f ); - _context.clip(); - _context.drawImage( image, 0, 0 ); - _context.restore(); - - } - - function getGradientTexture( color1, color2, color3, color4 ) { - - // http://mrdoob.com/blog/post/710 - - _pixelMapData[ 0 ] = ( color1.r * 255 ) | 0; - _pixelMapData[ 1 ] = ( color1.g * 255 ) | 0; - _pixelMapData[ 2 ] = ( color1.b * 255 ) | 0; - - _pixelMapData[ 4 ] = ( color2.r * 255 ) | 0; - _pixelMapData[ 5 ] = ( color2.g * 255 ) | 0; - _pixelMapData[ 6 ] = ( color2.b * 255 ) | 0; - - _pixelMapData[ 8 ] = ( color3.r * 255 ) | 0; - _pixelMapData[ 9 ] = ( color3.g * 255 ) | 0; - _pixelMapData[ 10 ] = ( color3.b * 255 ) | 0; - - _pixelMapData[ 12 ] = ( color4.r * 255 ) | 0; - _pixelMapData[ 13 ] = ( color4.g * 255 ) | 0; - _pixelMapData[ 14 ] = ( color4.b * 255 ) | 0; - - _pixelMapContext.putImageData( _pixelMapImage, 0, 0 ); - _gradientMapContext.drawImage( _pixelMap, 0, 0 ); - - return _gradientMap; - - } - - // Hide anti-alias gaps - - function expand( v1, v2, pixels ) { - - var x = v2.x - v1.x, y = v2.y - v1.y, - det = x * x + y * y, idet; - - if ( det === 0 ) return; - - idet = pixels / Math.sqrt( det ); - - x *= idet; y *= idet; - - v2.x += x; v2.y += y; - v1.x -= x; v1.y -= y; - - } - - // Context cached methods. - - function setOpacity( value ) { - - if ( _contextGlobalAlpha !== value ) { - - _context.globalAlpha = value; - _contextGlobalAlpha = value; - - } - - } - - function setBlending( value ) { - - if ( _contextGlobalCompositeOperation !== value ) { - - if ( value === THREE.NormalBlending ) { - - _context.globalCompositeOperation = 'source-over'; - - } else if ( value === THREE.AdditiveBlending ) { - - _context.globalCompositeOperation = 'lighter'; - - } else if ( value === THREE.SubtractiveBlending ) { - - _context.globalCompositeOperation = 'darker'; - - } - - _contextGlobalCompositeOperation = value; - - } - - } - - function setLineWidth( value ) { - - if ( _contextLineWidth !== value ) { - - _context.lineWidth = value; - _contextLineWidth = value; - - } - - } - - function setLineCap( value ) { - - // "butt", "round", "square" - - if ( _contextLineCap !== value ) { - - _context.lineCap = value; - _contextLineCap = value; - - } - - } - - function setLineJoin( value ) { - - // "round", "bevel", "miter" - - if ( _contextLineJoin !== value ) { - - _context.lineJoin = value; - _contextLineJoin = value; - - } - - } - - function setStrokeStyle( value ) { - - if ( _contextStrokeStyle !== value ) { - - _context.strokeStyle = value; - _contextStrokeStyle = value; - - } - - } - - function setFillStyle( value ) { - - if ( _contextFillStyle !== value ) { - - _context.fillStyle = value; - _contextFillStyle = value; - - } - - } - - function setDashAndGap( dashSizeValue, gapSizeValue ) { - - if ( _contextDashSize !== dashSizeValue || _contextGapSize !== gapSizeValue ) { - - _context.setLineDash( [ dashSizeValue, gapSizeValue ] ); - _contextDashSize = dashSizeValue; - _contextGapSize = gapSizeValue; - - } - - } - -}; - -/** - * Shader chunks for WebLG Shader library - * - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - * @author mikael emtinger / http://gomo.se/ - */ - -THREE.ShaderChunk = { - - // FOG - - fog_pars_fragment: [ - - "#ifdef USE_FOG", - - "uniform vec3 fogColor;", - - "#ifdef FOG_EXP2", - - "uniform float fogDensity;", - - "#else", - - "uniform float fogNear;", - "uniform float fogFar;", - - "#endif", - - "#endif" - - ].join("\n"), - - fog_fragment: [ - - "#ifdef USE_FOG", - - "float depth = gl_FragCoord.z / gl_FragCoord.w;", - - "#ifdef FOG_EXP2", - - "const float LOG2 = 1.442695;", - "float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );", - "fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );", - - "#else", - - "float fogFactor = smoothstep( fogNear, fogFar, depth );", - - "#endif", - - "gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );", - - "#endif" - - ].join("\n"), - - // ENVIRONMENT MAP - - envmap_pars_fragment: [ - - "#ifdef USE_ENVMAP", - - "uniform float reflectivity;", - "uniform samplerCube envMap;", - "uniform float flipEnvMap;", - "uniform int combine;", - - "#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )", - - "uniform bool useRefract;", - "uniform float refractionRatio;", - - "#else", - - "varying vec3 vReflect;", - - "#endif", - - "#endif" - - ].join("\n"), - - envmap_fragment: [ - - "#ifdef USE_ENVMAP", - - "vec3 reflectVec;", - - "#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )", - - "vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );", - - "if ( useRefract ) {", - - "reflectVec = refract( cameraToVertex, normal, refractionRatio );", - - "} else { ", - - "reflectVec = reflect( cameraToVertex, normal );", - - "}", - - "#else", - - "reflectVec = vReflect;", - - "#endif", - - "#ifdef DOUBLE_SIDED", - - "float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );", - "vec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );", - - "#else", - - "vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );", - - "#endif", - - "#ifdef GAMMA_INPUT", - - "cubeColor.xyz *= cubeColor.xyz;", - - "#endif", - - "if ( combine == 1 ) {", - - "gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );", - - "} else if ( combine == 2 ) {", - - "gl_FragColor.xyz += cubeColor.xyz * specularStrength * reflectivity;", - - "} else {", - - "gl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );", - - "}", - - "#endif" - - ].join("\n"), - - envmap_pars_vertex: [ - - "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )", - - "varying vec3 vReflect;", - - "uniform float refractionRatio;", - "uniform bool useRefract;", - - "#endif" - - ].join("\n"), - - worldpos_vertex : [ - - "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )", - - "#ifdef USE_SKINNING", - - "vec4 worldPosition = modelMatrix * skinned;", - - "#endif", - - "#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )", - - "vec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );", - - "#endif", - - "#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )", - - "vec4 worldPosition = modelMatrix * vec4( position, 1.0 );", - - "#endif", - - "#endif" - - ].join("\n"), - - envmap_vertex : [ - - "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )", - - "vec3 worldNormal = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;", - "worldNormal = normalize( worldNormal );", - - "vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );", - - "if ( useRefract ) {", - - "vReflect = refract( cameraToVertex, worldNormal, refractionRatio );", - - "} else {", - - "vReflect = reflect( cameraToVertex, worldNormal );", - - "}", - - "#endif" - - ].join("\n"), - - // COLOR MAP (particles) - - map_particle_pars_fragment: [ - - "#ifdef USE_MAP", - - "uniform sampler2D map;", - - "#endif" - - ].join("\n"), - - - map_particle_fragment: [ - - "#ifdef USE_MAP", - - "gl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );", - - "#endif" - - ].join("\n"), - - // COLOR MAP (triangles) - - map_pars_vertex: [ - - "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )", - - "varying vec2 vUv;", - "uniform vec4 offsetRepeat;", - - "#endif" - - ].join("\n"), - - map_pars_fragment: [ - - "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )", - - "varying vec2 vUv;", - - "#endif", - - "#ifdef USE_MAP", - - "uniform sampler2D map;", - - "#endif" - - ].join("\n"), - - map_vertex: [ - - "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )", - - "vUv = uv * offsetRepeat.zw + offsetRepeat.xy;", - - "#endif" - - ].join("\n"), - - map_fragment: [ - - "#ifdef USE_MAP", - - "vec4 texelColor = texture2D( map, vUv );", - - "#ifdef GAMMA_INPUT", - - "texelColor.xyz *= texelColor.xyz;", - - "#endif", - - "gl_FragColor = gl_FragColor * texelColor;", - - "#endif" - - ].join("\n"), - - // LIGHT MAP - - lightmap_pars_fragment: [ - - "#ifdef USE_LIGHTMAP", - - "varying vec2 vUv2;", - "uniform sampler2D lightMap;", - - "#endif" - - ].join("\n"), - - lightmap_pars_vertex: [ - - "#ifdef USE_LIGHTMAP", - - "varying vec2 vUv2;", - - "#endif" - - ].join("\n"), - - lightmap_fragment: [ - - "#ifdef USE_LIGHTMAP", - - "gl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );", - - "#endif" - - ].join("\n"), - - lightmap_vertex: [ - - "#ifdef USE_LIGHTMAP", - - "vUv2 = uv2;", - - "#endif" - - ].join("\n"), - - // BUMP MAP - - bumpmap_pars_fragment: [ - - "#ifdef USE_BUMPMAP", - - "uniform sampler2D bumpMap;", - "uniform float bumpScale;", - - // Derivative maps - bump mapping unparametrized surfaces by Morten Mikkelsen - // http://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html - - // Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2) - - "vec2 dHdxy_fwd() {", - - "vec2 dSTdx = dFdx( vUv );", - "vec2 dSTdy = dFdy( vUv );", - - "float Hll = bumpScale * texture2D( bumpMap, vUv ).x;", - "float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;", - "float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;", - - "return vec2( dBx, dBy );", - - "}", - - "vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {", - - "vec3 vSigmaX = dFdx( surf_pos );", - "vec3 vSigmaY = dFdy( surf_pos );", - "vec3 vN = surf_norm;", // normalized - - "vec3 R1 = cross( vSigmaY, vN );", - "vec3 R2 = cross( vN, vSigmaX );", - - "float fDet = dot( vSigmaX, R1 );", - - "vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );", - "return normalize( abs( fDet ) * surf_norm - vGrad );", - - "}", - - "#endif" - - ].join("\n"), - - // NORMAL MAP - - normalmap_pars_fragment: [ - - "#ifdef USE_NORMALMAP", - - "uniform sampler2D normalMap;", - "uniform vec2 normalScale;", - - // Per-Pixel Tangent Space Normal Mapping - // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html - - "vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {", - - "vec3 q0 = dFdx( eye_pos.xyz );", - "vec3 q1 = dFdy( eye_pos.xyz );", - "vec2 st0 = dFdx( vUv.st );", - "vec2 st1 = dFdy( vUv.st );", - - "vec3 S = normalize( q0 * st1.t - q1 * st0.t );", - "vec3 T = normalize( -q0 * st1.s + q1 * st0.s );", - "vec3 N = normalize( surf_norm );", - - "vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;", - "mapN.xy = normalScale * mapN.xy;", - "mat3 tsn = mat3( S, T, N );", - "return normalize( tsn * mapN );", - - "}", - - "#endif" - - ].join("\n"), - - // SPECULAR MAP - - specularmap_pars_fragment: [ - - "#ifdef USE_SPECULARMAP", - - "uniform sampler2D specularMap;", - - "#endif" - - ].join("\n"), - - specularmap_fragment: [ - - "float specularStrength;", - - "#ifdef USE_SPECULARMAP", - - "vec4 texelSpecular = texture2D( specularMap, vUv );", - "specularStrength = texelSpecular.r;", - - "#else", - - "specularStrength = 1.0;", - - "#endif" - - ].join("\n"), - - // LIGHTS LAMBERT - - lights_lambert_pars_vertex: [ - - "uniform vec3 ambient;", - "uniform vec3 diffuse;", - "uniform vec3 emissive;", - - "uniform vec3 ambientLightColor;", - - "#if MAX_DIR_LIGHTS > 0", - - "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];", - "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];", - - "#endif", - - "#if MAX_HEMI_LIGHTS > 0", - - "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];", - "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];", - "uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];", - "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];", - "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];", - - "#endif", - - "#if MAX_SPOT_LIGHTS > 0", - - "uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];", - "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];", - "uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];", - "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];", - "uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];", - "uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];", - - "#endif", - - "#ifdef WRAP_AROUND", - - "uniform vec3 wrapRGB;", - - "#endif" - - ].join("\n"), - - lights_lambert_vertex: [ - - "vLightFront = vec3( 0.0 );", - - "#ifdef DOUBLE_SIDED", - - "vLightBack = vec3( 0.0 );", - - "#endif", - - "transformedNormal = normalize( transformedNormal );", - - "#if MAX_DIR_LIGHTS > 0", - - "for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {", - - "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );", - "vec3 dirVector = normalize( lDirection.xyz );", - - "float dotProduct = dot( transformedNormal, dirVector );", - "vec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );", - - "#ifdef DOUBLE_SIDED", - - "vec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );", - - "#ifdef WRAP_AROUND", - - "vec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );", - - "#endif", - - "#endif", - - "#ifdef WRAP_AROUND", - - "vec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );", - "directionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );", - - "#ifdef DOUBLE_SIDED", - - "directionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );", - - "#endif", - - "#endif", - - "vLightFront += directionalLightColor[ i ] * directionalLightWeighting;", - - "#ifdef DOUBLE_SIDED", - - "vLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;", - - "#endif", - - "}", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {", - - "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );", - "vec3 lVector = lPosition.xyz - mvPosition.xyz;", - - "float lDistance = 1.0;", - "if ( pointLightDistance[ i ] > 0.0 )", - "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );", - - "lVector = normalize( lVector );", - "float dotProduct = dot( transformedNormal, lVector );", - - "vec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );", - - "#ifdef DOUBLE_SIDED", - - "vec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );", - - "#ifdef WRAP_AROUND", - - "vec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );", - - "#endif", - - "#endif", - - "#ifdef WRAP_AROUND", - - "vec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );", - "pointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );", - - "#ifdef DOUBLE_SIDED", - - "pointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );", - - "#endif", - - "#endif", - - "vLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;", - - "#ifdef DOUBLE_SIDED", - - "vLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;", - - "#endif", - - "}", - - "#endif", - - "#if MAX_SPOT_LIGHTS > 0", - - "for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {", - - "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );", - "vec3 lVector = lPosition.xyz - mvPosition.xyz;", - - "float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );", - - "if ( spotEffect > spotLightAngleCos[ i ] ) {", - - "spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );", - - "float lDistance = 1.0;", - "if ( spotLightDistance[ i ] > 0.0 )", - "lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );", - - "lVector = normalize( lVector );", - - "float dotProduct = dot( transformedNormal, lVector );", - "vec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );", - - "#ifdef DOUBLE_SIDED", - - "vec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );", - - "#ifdef WRAP_AROUND", - - "vec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );", - - "#endif", - - "#endif", - - "#ifdef WRAP_AROUND", - - "vec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );", - "spotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );", - - "#ifdef DOUBLE_SIDED", - - "spotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );", - - "#endif", - - "#endif", - - "vLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;", - - "#ifdef DOUBLE_SIDED", - - "vLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;", - - "#endif", - - "}", - - "}", - - "#endif", - - "#if MAX_HEMI_LIGHTS > 0", - - "for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {", - - "vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );", - "vec3 lVector = normalize( lDirection.xyz );", - - "float dotProduct = dot( transformedNormal, lVector );", - - "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;", - "float hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;", - - "vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );", - - "#ifdef DOUBLE_SIDED", - - "vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );", - - "#endif", - - "}", - - "#endif", - - "vLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;", - - "#ifdef DOUBLE_SIDED", - - "vLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;", - - "#endif" - - ].join("\n"), - - // LIGHTS PHONG - - lights_phong_pars_vertex: [ - - "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )", - - "varying vec3 vWorldPosition;", - - "#endif" - - ].join("\n"), - - - lights_phong_vertex: [ - - "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )", - - "vWorldPosition = worldPosition.xyz;", - - "#endif" - - ].join("\n"), - - lights_phong_pars_fragment: [ - - "uniform vec3 ambientLightColor;", - - "#if MAX_DIR_LIGHTS > 0", - - "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];", - "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];", - - "#endif", - - "#if MAX_HEMI_LIGHTS > 0", - - "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];", - "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];", - "uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];", - - "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];", - "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];", - - "#endif", - - "#if MAX_SPOT_LIGHTS > 0", - - "uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];", - "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];", - "uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];", - "uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];", - "uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];", - - "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];", - - "#endif", - - "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )", - - "varying vec3 vWorldPosition;", - - "#endif", - - "#ifdef WRAP_AROUND", - - "uniform vec3 wrapRGB;", - - "#endif", - - "varying vec3 vViewPosition;", - "varying vec3 vNormal;" - - ].join("\n"), - - lights_phong_fragment: [ - - "vec3 normal = normalize( vNormal );", - "vec3 viewPosition = normalize( vViewPosition );", - - "#ifdef DOUBLE_SIDED", - - "normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );", - - "#endif", - - "#ifdef USE_NORMALMAP", - - "normal = perturbNormal2Arb( -vViewPosition, normal );", - - "#elif defined( USE_BUMPMAP )", - - "normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "vec3 pointDiffuse = vec3( 0.0 );", - "vec3 pointSpecular = vec3( 0.0 );", - - "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {", - - "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );", - "vec3 lVector = lPosition.xyz + vViewPosition.xyz;", - - "float lDistance = 1.0;", - "if ( pointLightDistance[ i ] > 0.0 )", - "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );", - - "lVector = normalize( lVector );", - - // diffuse - - "float dotProduct = dot( normal, lVector );", - - "#ifdef WRAP_AROUND", - - "float pointDiffuseWeightFull = max( dotProduct, 0.0 );", - "float pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );", - - "vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );", - - "#else", - - "float pointDiffuseWeight = max( dotProduct, 0.0 );", - - "#endif", - - "pointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;", - - // specular - - "vec3 pointHalfVector = normalize( lVector + viewPosition );", - "float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );", - "float pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );", - - // 2.0 => 2.0001 is hack to work around ANGLE bug - - "float specularNormalization = ( shininess + 2.0001 ) / 8.0;", - - "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, pointHalfVector ), 0.0 ), 5.0 );", - "pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;", - - "}", - - "#endif", - - "#if MAX_SPOT_LIGHTS > 0", - - "vec3 spotDiffuse = vec3( 0.0 );", - "vec3 spotSpecular = vec3( 0.0 );", - - "for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {", - - "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );", - "vec3 lVector = lPosition.xyz + vViewPosition.xyz;", - - "float lDistance = 1.0;", - "if ( spotLightDistance[ i ] > 0.0 )", - "lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );", - - "lVector = normalize( lVector );", - - "float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );", - - "if ( spotEffect > spotLightAngleCos[ i ] ) {", - - "spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );", - - // diffuse - - "float dotProduct = dot( normal, lVector );", - - "#ifdef WRAP_AROUND", - - "float spotDiffuseWeightFull = max( dotProduct, 0.0 );", - "float spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );", - - "vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );", - - "#else", - - "float spotDiffuseWeight = max( dotProduct, 0.0 );", - - "#endif", - - "spotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;", - - // specular - - "vec3 spotHalfVector = normalize( lVector + viewPosition );", - "float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );", - "float spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );", - - // 2.0 => 2.0001 is hack to work around ANGLE bug - - "float specularNormalization = ( shininess + 2.0001 ) / 8.0;", - - "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, spotHalfVector ), 0.0 ), 5.0 );", - "spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;", - - "}", - - "}", - - "#endif", - - "#if MAX_DIR_LIGHTS > 0", - - "vec3 dirDiffuse = vec3( 0.0 );", - "vec3 dirSpecular = vec3( 0.0 );" , - - "for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {", - - "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );", - "vec3 dirVector = normalize( lDirection.xyz );", - - // diffuse - - "float dotProduct = dot( normal, dirVector );", - - "#ifdef WRAP_AROUND", - - "float dirDiffuseWeightFull = max( dotProduct, 0.0 );", - "float dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );", - - "vec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );", - - "#else", - - "float dirDiffuseWeight = max( dotProduct, 0.0 );", - - "#endif", - - "dirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;", - - // specular - - "vec3 dirHalfVector = normalize( dirVector + viewPosition );", - "float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );", - "float dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );", - - /* - // fresnel term from skin shader - "const float F0 = 0.128;", - - "float base = 1.0 - dot( viewPosition, dirHalfVector );", - "float exponential = pow( base, 5.0 );", - - "float fresnel = exponential + F0 * ( 1.0 - exponential );", - */ - - /* - // fresnel term from fresnel shader - "const float mFresnelBias = 0.08;", - "const float mFresnelScale = 0.3;", - "const float mFresnelPower = 5.0;", - - "float fresnel = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( -viewPosition ), normal ), mFresnelPower );", - */ - - // 2.0 => 2.0001 is hack to work around ANGLE bug - - "float specularNormalization = ( shininess + 2.0001 ) / 8.0;", - - //"dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization * fresnel;", - - "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( dirVector, dirHalfVector ), 0.0 ), 5.0 );", - "dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;", - - - "}", - - "#endif", - - "#if MAX_HEMI_LIGHTS > 0", - - "vec3 hemiDiffuse = vec3( 0.0 );", - "vec3 hemiSpecular = vec3( 0.0 );" , - - "for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {", - - "vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );", - "vec3 lVector = normalize( lDirection.xyz );", - - // diffuse - - "float dotProduct = dot( normal, lVector );", - "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;", - - "vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );", - - "hemiDiffuse += diffuse * hemiColor;", - - // specular (sky light) - - "vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );", - "float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;", - "float hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );", - - // specular (ground light) - - "vec3 lVectorGround = -lVector;", - - "vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );", - "float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;", - "float hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );", - - "float dotProductGround = dot( normal, lVectorGround );", - - // 2.0 => 2.0001 is hack to work around ANGLE bug - - "float specularNormalization = ( shininess + 2.0001 ) / 8.0;", - - "vec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, hemiHalfVectorSky ), 0.0 ), 5.0 );", - "vec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 0.0 ), 5.0 );", - "hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );", - - "}", - - "#endif", - - "vec3 totalDiffuse = vec3( 0.0 );", - "vec3 totalSpecular = vec3( 0.0 );", - - "#if MAX_DIR_LIGHTS > 0", - - "totalDiffuse += dirDiffuse;", - "totalSpecular += dirSpecular;", - - "#endif", - - "#if MAX_HEMI_LIGHTS > 0", - - "totalDiffuse += hemiDiffuse;", - "totalSpecular += hemiSpecular;", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "totalDiffuse += pointDiffuse;", - "totalSpecular += pointSpecular;", - - "#endif", - - "#if MAX_SPOT_LIGHTS > 0", - - "totalDiffuse += spotDiffuse;", - "totalSpecular += spotSpecular;", - - "#endif", - - "#ifdef METAL", - - "gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );", - - "#else", - - "gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;", - - "#endif" - - ].join("\n"), - - // VERTEX COLORS - - color_pars_fragment: [ - - "#ifdef USE_COLOR", - - "varying vec3 vColor;", - - "#endif" - - ].join("\n"), - - - color_fragment: [ - - "#ifdef USE_COLOR", - - "gl_FragColor = gl_FragColor * vec4( vColor, 1.0 );", - - "#endif" - - ].join("\n"), - - color_pars_vertex: [ - - "#ifdef USE_COLOR", - - "varying vec3 vColor;", - - "#endif" - - ].join("\n"), - - - color_vertex: [ - - "#ifdef USE_COLOR", - - "#ifdef GAMMA_INPUT", - - "vColor = color * color;", - - "#else", - - "vColor = color;", - - "#endif", - - "#endif" - - ].join("\n"), - - // SKINNING - - skinning_pars_vertex: [ - - "#ifdef USE_SKINNING", - - "#ifdef BONE_TEXTURE", - - "uniform sampler2D boneTexture;", - "uniform int boneTextureWidth;", - "uniform int boneTextureHeight;", - - "mat4 getBoneMatrix( const in float i ) {", - - "float j = i * 4.0;", - "float x = mod( j, float( boneTextureWidth ) );", - "float y = floor( j / float( boneTextureWidth ) );", - - "float dx = 1.0 / float( boneTextureWidth );", - "float dy = 1.0 / float( boneTextureHeight );", - - "y = dy * ( y + 0.5 );", - - "vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );", - "vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );", - "vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );", - "vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );", - - "mat4 bone = mat4( v1, v2, v3, v4 );", - - "return bone;", - - "}", - - "#else", - - "uniform mat4 boneGlobalMatrices[ MAX_BONES ];", - - "mat4 getBoneMatrix( const in float i ) {", - - "mat4 bone = boneGlobalMatrices[ int(i) ];", - "return bone;", - - "}", - - "#endif", - - "#endif" - - ].join("\n"), - - skinbase_vertex: [ - - "#ifdef USE_SKINNING", - - "mat4 boneMatX = getBoneMatrix( skinIndex.x );", - "mat4 boneMatY = getBoneMatrix( skinIndex.y );", - "mat4 boneMatZ = getBoneMatrix( skinIndex.z );", - "mat4 boneMatW = getBoneMatrix( skinIndex.w );", - - "#endif" - - ].join("\n"), - - skinning_vertex: [ - - "#ifdef USE_SKINNING", - - "#ifdef USE_MORPHTARGETS", - - "vec4 skinVertex = vec4( morphed, 1.0 );", - - "#else", - - "vec4 skinVertex = vec4( position, 1.0 );", - - "#endif", - - "vec4 skinned = boneMatX * skinVertex * skinWeight.x;", - "skinned += boneMatY * skinVertex * skinWeight.y;", - "skinned += boneMatZ * skinVertex * skinWeight.z;", - "skinned += boneMatW * skinVertex * skinWeight.w;", - - "#endif" - - ].join("\n"), - - // MORPHING - - morphtarget_pars_vertex: [ - - "#ifdef USE_MORPHTARGETS", - - "#ifndef USE_MORPHNORMALS", - - "uniform float morphTargetInfluences[ 8 ];", - - "#else", - - "uniform float morphTargetInfluences[ 4 ];", - - "#endif", - - "#endif" - - ].join("\n"), - - morphtarget_vertex: [ - - "#ifdef USE_MORPHTARGETS", - - "vec3 morphed = vec3( 0.0 );", - "morphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];", - "morphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];", - "morphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];", - "morphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];", - - "#ifndef USE_MORPHNORMALS", - - "morphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];", - "morphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];", - "morphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];", - "morphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];", - - "#endif", - - "morphed += position;", - - "#endif" - - ].join("\n"), - - default_vertex : [ - - "vec4 mvPosition;", - - "#ifdef USE_SKINNING", - - "mvPosition = modelViewMatrix * skinned;", - - "#endif", - - "#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )", - - "mvPosition = modelViewMatrix * vec4( morphed, 1.0 );", - - "#endif", - - "#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )", - - "mvPosition = modelViewMatrix * vec4( position, 1.0 );", - - "#endif", - - "gl_Position = projectionMatrix * mvPosition;" - - ].join("\n"), - - morphnormal_vertex: [ - - "#ifdef USE_MORPHNORMALS", - - "vec3 morphedNormal = vec3( 0.0 );", - - "morphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];", - "morphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];", - "morphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];", - "morphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];", - - "morphedNormal += normal;", - - "#endif" - - ].join("\n"), - - skinnormal_vertex: [ - - "#ifdef USE_SKINNING", - - "mat4 skinMatrix = skinWeight.x * boneMatX;", - "skinMatrix += skinWeight.y * boneMatY;", - - "#ifdef USE_MORPHNORMALS", - - "vec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );", - - "#else", - - "vec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );", - - "#endif", - - "#endif" - - ].join("\n"), - - defaultnormal_vertex: [ - - "vec3 objectNormal;", - - "#ifdef USE_SKINNING", - - "objectNormal = skinnedNormal.xyz;", - - "#endif", - - "#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )", - - "objectNormal = morphedNormal;", - - "#endif", - - "#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )", - - "objectNormal = normal;", - - "#endif", - - "#ifdef FLIP_SIDED", - - "objectNormal = -objectNormal;", - - "#endif", - - "vec3 transformedNormal = normalMatrix * objectNormal;" - - ].join("\n"), - - // SHADOW MAP - - // based on SpiderGL shadow map and Fabien Sanglard's GLSL shadow mapping examples - // http://spidergl.org/example.php?id=6 - // http://fabiensanglard.net/shadowmapping - - shadowmap_pars_fragment: [ - - "#ifdef USE_SHADOWMAP", - - "uniform sampler2D shadowMap[ MAX_SHADOWS ];", - "uniform vec2 shadowMapSize[ MAX_SHADOWS ];", - - "uniform float shadowDarkness[ MAX_SHADOWS ];", - "uniform float shadowBias[ MAX_SHADOWS ];", - - "varying vec4 vShadowCoord[ MAX_SHADOWS ];", - - "float unpackDepth( const in vec4 rgba_depth ) {", - - "const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );", - "float depth = dot( rgba_depth, bit_shift );", - "return depth;", - - "}", - - "#endif" - - ].join("\n"), - - shadowmap_fragment: [ - - "#ifdef USE_SHADOWMAP", - - "#ifdef SHADOWMAP_DEBUG", - - "vec3 frustumColors[3];", - "frustumColors[0] = vec3( 1.0, 0.5, 0.0 );", - "frustumColors[1] = vec3( 0.0, 1.0, 0.8 );", - "frustumColors[2] = vec3( 0.0, 0.5, 1.0 );", - - "#endif", - - "#ifdef SHADOWMAP_CASCADE", - - "int inFrustumCount = 0;", - - "#endif", - - "float fDepth;", - "vec3 shadowColor = vec3( 1.0 );", - - "for( int i = 0; i < MAX_SHADOWS; i ++ ) {", - - "vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;", - - // "if ( something && something )" breaks ATI OpenGL shader compiler - // "if ( all( something, something ) )" using this instead - - "bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );", - "bool inFrustum = all( inFrustumVec );", - - // don't shadow pixels outside of light frustum - // use just first frustum (for cascades) - // don't shadow pixels behind far plane of light frustum - - "#ifdef SHADOWMAP_CASCADE", - - "inFrustumCount += int( inFrustum );", - "bvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );", - - "#else", - - "bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );", - - "#endif", - - "bool frustumTest = all( frustumTestVec );", - - "if ( frustumTest ) {", - - "shadowCoord.z += shadowBias[ i ];", - - "#if defined( SHADOWMAP_TYPE_PCF )", - - // Percentage-close filtering - // (9 pixel kernel) - // http://fabiensanglard.net/shadowmappingPCF/ - - "float shadow = 0.0;", - - /* - // nested loops breaks shader compiler / validator on some ATI cards when using OpenGL - // must enroll loop manually - - "for ( float y = -1.25; y <= 1.25; y += 1.25 )", - "for ( float x = -1.25; x <= 1.25; x += 1.25 ) {", - - "vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );", - - // doesn't seem to produce any noticeable visual difference compared to simple "texture2D" lookup - //"vec4 rgbaDepth = texture2DProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );", - - "float fDepth = unpackDepth( rgbaDepth );", - - "if ( fDepth < shadowCoord.z )", - "shadow += 1.0;", - - "}", - - "shadow /= 9.0;", - - */ - - "const float shadowDelta = 1.0 / 9.0;", - - "float xPixelOffset = 1.0 / shadowMapSize[ i ].x;", - "float yPixelOffset = 1.0 / shadowMapSize[ i ].y;", - - "float dx0 = -1.25 * xPixelOffset;", - "float dy0 = -1.25 * yPixelOffset;", - "float dx1 = 1.25 * xPixelOffset;", - "float dy1 = 1.25 * yPixelOffset;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );", - - "#elif defined( SHADOWMAP_TYPE_PCF_SOFT )", - - // Percentage-close filtering - // (9 pixel kernel) - // http://fabiensanglard.net/shadowmappingPCF/ - - "float shadow = 0.0;", - - "float xPixelOffset = 1.0 / shadowMapSize[ i ].x;", - "float yPixelOffset = 1.0 / shadowMapSize[ i ].y;", - - "float dx0 = -1.0 * xPixelOffset;", - "float dy0 = -1.0 * yPixelOffset;", - "float dx1 = 1.0 * xPixelOffset;", - "float dy1 = 1.0 * yPixelOffset;", - - "mat3 shadowKernel;", - "mat3 depthKernel;", - - "depthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );", - "depthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );", - "depthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );", - "depthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );", - "depthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );", - "depthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );", - "depthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );", - "depthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );", - "depthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );", - - "vec3 shadowZ = vec3( shadowCoord.z );", - "shadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));", - "shadowKernel[0] *= vec3(0.25);", - - "shadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));", - "shadowKernel[1] *= vec3(0.25);", - - "shadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));", - "shadowKernel[2] *= vec3(0.25);", - - "vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );", - - "shadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );", - "shadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );", - - "vec4 shadowValues;", - "shadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );", - "shadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );", - "shadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );", - "shadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );", - - "shadow = dot( shadowValues, vec4( 1.0 ) );", - - "shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );", - - "#else", - - "vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );", - "float fDepth = unpackDepth( rgbaDepth );", - - "if ( fDepth < shadowCoord.z )", - - // spot with multiple shadows is darker - - "shadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );", - - // spot with multiple shadows has the same color as single shadow spot - - //"shadowColor = min( shadowColor, vec3( shadowDarkness[ i ] ) );", - - "#endif", - - "}", - - - "#ifdef SHADOWMAP_DEBUG", - - "#ifdef SHADOWMAP_CASCADE", - - "if ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];", - - "#else", - - "if ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];", - - "#endif", - - "#endif", - - "}", - - "#ifdef GAMMA_OUTPUT", - - "shadowColor *= shadowColor;", - - "#endif", - - "gl_FragColor.xyz = gl_FragColor.xyz * shadowColor;", - - "#endif" - - ].join("\n"), - - shadowmap_pars_vertex: [ - - "#ifdef USE_SHADOWMAP", - - "varying vec4 vShadowCoord[ MAX_SHADOWS ];", - "uniform mat4 shadowMatrix[ MAX_SHADOWS ];", - - "#endif" - - ].join("\n"), - - shadowmap_vertex: [ - - "#ifdef USE_SHADOWMAP", - - "for( int i = 0; i < MAX_SHADOWS; i ++ ) {", - - "vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;", - - "}", - - "#endif" - - ].join("\n"), - - // ALPHATEST - - alphatest_fragment: [ - - "#ifdef ALPHATEST", - - "if ( gl_FragColor.a < ALPHATEST ) discard;", - - "#endif" - - ].join("\n"), - - // LINEAR SPACE - - linear_to_gamma_fragment: [ - - "#ifdef GAMMA_OUTPUT", - - "gl_FragColor.xyz = sqrt( gl_FragColor.xyz );", - - "#endif" - - ].join("\n") - - -}; -/** - * Uniform Utilities - */ - -THREE.UniformsUtils = { - - merge: function ( uniforms ) { - - var u, p, tmp, merged = {}; - - for ( u = 0; u < uniforms.length; u ++ ) { - - tmp = this.clone( uniforms[ u ] ); - - for ( p in tmp ) { - - merged[ p ] = tmp[ p ]; - - } - - } - - return merged; - - }, - - clone: function ( uniforms_src ) { - - var u, p, parameter, parameter_src, uniforms_dst = {}; - - for ( u in uniforms_src ) { - - uniforms_dst[ u ] = {}; - - for ( p in uniforms_src[ u ] ) { - - parameter_src = uniforms_src[ u ][ p ]; - - if ( parameter_src instanceof THREE.Color || - parameter_src instanceof THREE.Vector2 || - parameter_src instanceof THREE.Vector3 || - parameter_src instanceof THREE.Vector4 || - parameter_src instanceof THREE.Matrix4 || - parameter_src instanceof THREE.Texture ) { - - uniforms_dst[ u ][ p ] = parameter_src.clone(); - - } else if ( parameter_src instanceof Array ) { - - uniforms_dst[ u ][ p ] = parameter_src.slice(); - - } else { - - uniforms_dst[ u ][ p ] = parameter_src; - - } - - } - - } - - return uniforms_dst; - - } - -}; -/** - * Uniforms library for shared webgl shaders - */ - -THREE.UniformsLib = { - - common: { - - "diffuse" : { type: "c", value: new THREE.Color( 0xeeeeee ) }, - "opacity" : { type: "f", value: 1.0 }, - - "map" : { type: "t", value: null }, - "offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) }, - - "lightMap" : { type: "t", value: null }, - "specularMap" : { type: "t", value: null }, - - "envMap" : { type: "t", value: null }, - "flipEnvMap" : { type: "f", value: -1 }, - "useRefract" : { type: "i", value: 0 }, - "reflectivity" : { type: "f", value: 1.0 }, - "refractionRatio" : { type: "f", value: 0.98 }, - "combine" : { type: "i", value: 0 }, - - "morphTargetInfluences" : { type: "f", value: 0 } - - }, - - bump: { - - "bumpMap" : { type: "t", value: null }, - "bumpScale" : { type: "f", value: 1 } - - }, - - normalmap: { - - "normalMap" : { type: "t", value: null }, - "normalScale" : { type: "v2", value: new THREE.Vector2( 1, 1 ) } - }, - - fog : { - - "fogDensity" : { type: "f", value: 0.00025 }, - "fogNear" : { type: "f", value: 1 }, - "fogFar" : { type: "f", value: 2000 }, - "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) } - - }, - - lights: { - - "ambientLightColor" : { type: "fv", value: [] }, - - "directionalLightDirection" : { type: "fv", value: [] }, - "directionalLightColor" : { type: "fv", value: [] }, - - "hemisphereLightDirection" : { type: "fv", value: [] }, - "hemisphereLightSkyColor" : { type: "fv", value: [] }, - "hemisphereLightGroundColor" : { type: "fv", value: [] }, - - "pointLightColor" : { type: "fv", value: [] }, - "pointLightPosition" : { type: "fv", value: [] }, - "pointLightDistance" : { type: "fv1", value: [] }, - - "spotLightColor" : { type: "fv", value: [] }, - "spotLightPosition" : { type: "fv", value: [] }, - "spotLightDirection" : { type: "fv", value: [] }, - "spotLightDistance" : { type: "fv1", value: [] }, - "spotLightAngleCos" : { type: "fv1", value: [] }, - "spotLightExponent" : { type: "fv1", value: [] } - - }, - - particle: { - - "psColor" : { type: "c", value: new THREE.Color( 0xeeeeee ) }, - "opacity" : { type: "f", value: 1.0 }, - "size" : { type: "f", value: 1.0 }, - "scale" : { type: "f", value: 1.0 }, - "map" : { type: "t", value: null }, - - "fogDensity" : { type: "f", value: 0.00025 }, - "fogNear" : { type: "f", value: 1 }, - "fogFar" : { type: "f", value: 2000 }, - "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) } - - }, - - shadowmap: { - - "shadowMap": { type: "tv", value: [] }, - "shadowMapSize": { type: "v2v", value: [] }, - - "shadowBias" : { type: "fv1", value: [] }, - "shadowDarkness": { type: "fv1", value: [] }, - - "shadowMatrix" : { type: "m4v", value: [] } - - } - -}; -/** - * Webgl Shader Library for three.js - * - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - * @author mikael emtinger / http://gomo.se/ - */ - - -THREE.ShaderLib = { - - 'basic': { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "common" ], - THREE.UniformsLib[ "fog" ], - THREE.UniformsLib[ "shadowmap" ] - - ] ), - - vertexShader: [ - - THREE.ShaderChunk[ "map_pars_vertex" ], - THREE.ShaderChunk[ "lightmap_pars_vertex" ], - THREE.ShaderChunk[ "envmap_pars_vertex" ], - THREE.ShaderChunk[ "color_pars_vertex" ], - THREE.ShaderChunk[ "morphtarget_pars_vertex" ], - THREE.ShaderChunk[ "skinning_pars_vertex" ], - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - THREE.ShaderChunk[ "map_vertex" ], - THREE.ShaderChunk[ "lightmap_vertex" ], - THREE.ShaderChunk[ "color_vertex" ], - THREE.ShaderChunk[ "skinbase_vertex" ], - - "#ifdef USE_ENVMAP", - - THREE.ShaderChunk[ "morphnormal_vertex" ], - THREE.ShaderChunk[ "skinnormal_vertex" ], - THREE.ShaderChunk[ "defaultnormal_vertex" ], - - "#endif", - - THREE.ShaderChunk[ "morphtarget_vertex" ], - THREE.ShaderChunk[ "skinning_vertex" ], - THREE.ShaderChunk[ "default_vertex" ], - - THREE.ShaderChunk[ "worldpos_vertex" ], - THREE.ShaderChunk[ "envmap_vertex" ], - THREE.ShaderChunk[ "shadowmap_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform vec3 diffuse;", - "uniform float opacity;", - - THREE.ShaderChunk[ "color_pars_fragment" ], - THREE.ShaderChunk[ "map_pars_fragment" ], - THREE.ShaderChunk[ "lightmap_pars_fragment" ], - THREE.ShaderChunk[ "envmap_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - THREE.ShaderChunk[ "specularmap_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( diffuse, opacity );", - - THREE.ShaderChunk[ "map_fragment" ], - THREE.ShaderChunk[ "alphatest_fragment" ], - THREE.ShaderChunk[ "specularmap_fragment" ], - THREE.ShaderChunk[ "lightmap_fragment" ], - THREE.ShaderChunk[ "color_fragment" ], - THREE.ShaderChunk[ "envmap_fragment" ], - THREE.ShaderChunk[ "shadowmap_fragment" ], - - THREE.ShaderChunk[ "linear_to_gamma_fragment" ], - - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n") - - }, - - 'lambert': { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "common" ], - THREE.UniformsLib[ "fog" ], - THREE.UniformsLib[ "lights" ], - THREE.UniformsLib[ "shadowmap" ], - - { - "ambient" : { type: "c", value: new THREE.Color( 0xffffff ) }, - "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) }, - "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) } - } - - ] ), - - vertexShader: [ - - "#define LAMBERT", - - "varying vec3 vLightFront;", - - "#ifdef DOUBLE_SIDED", - - "varying vec3 vLightBack;", - - "#endif", - - THREE.ShaderChunk[ "map_pars_vertex" ], - THREE.ShaderChunk[ "lightmap_pars_vertex" ], - THREE.ShaderChunk[ "envmap_pars_vertex" ], - THREE.ShaderChunk[ "lights_lambert_pars_vertex" ], - THREE.ShaderChunk[ "color_pars_vertex" ], - THREE.ShaderChunk[ "morphtarget_pars_vertex" ], - THREE.ShaderChunk[ "skinning_pars_vertex" ], - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - THREE.ShaderChunk[ "map_vertex" ], - THREE.ShaderChunk[ "lightmap_vertex" ], - THREE.ShaderChunk[ "color_vertex" ], - - THREE.ShaderChunk[ "morphnormal_vertex" ], - THREE.ShaderChunk[ "skinbase_vertex" ], - THREE.ShaderChunk[ "skinnormal_vertex" ], - THREE.ShaderChunk[ "defaultnormal_vertex" ], - - THREE.ShaderChunk[ "morphtarget_vertex" ], - THREE.ShaderChunk[ "skinning_vertex" ], - THREE.ShaderChunk[ "default_vertex" ], - - THREE.ShaderChunk[ "worldpos_vertex" ], - THREE.ShaderChunk[ "envmap_vertex" ], - THREE.ShaderChunk[ "lights_lambert_vertex" ], - THREE.ShaderChunk[ "shadowmap_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float opacity;", - - "varying vec3 vLightFront;", - - "#ifdef DOUBLE_SIDED", - - "varying vec3 vLightBack;", - - "#endif", - - THREE.ShaderChunk[ "color_pars_fragment" ], - THREE.ShaderChunk[ "map_pars_fragment" ], - THREE.ShaderChunk[ "lightmap_pars_fragment" ], - THREE.ShaderChunk[ "envmap_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - THREE.ShaderChunk[ "specularmap_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( vec3 ( 1.0 ), opacity );", - - THREE.ShaderChunk[ "map_fragment" ], - THREE.ShaderChunk[ "alphatest_fragment" ], - THREE.ShaderChunk[ "specularmap_fragment" ], - - "#ifdef DOUBLE_SIDED", - - //"float isFront = float( gl_FrontFacing );", - //"gl_FragColor.xyz *= isFront * vLightFront + ( 1.0 - isFront ) * vLightBack;", - - "if ( gl_FrontFacing )", - "gl_FragColor.xyz *= vLightFront;", - "else", - "gl_FragColor.xyz *= vLightBack;", - - "#else", - - "gl_FragColor.xyz *= vLightFront;", - - "#endif", - - THREE.ShaderChunk[ "lightmap_fragment" ], - THREE.ShaderChunk[ "color_fragment" ], - THREE.ShaderChunk[ "envmap_fragment" ], - THREE.ShaderChunk[ "shadowmap_fragment" ], - - THREE.ShaderChunk[ "linear_to_gamma_fragment" ], - - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n") - - }, - - 'phong': { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "common" ], - THREE.UniformsLib[ "bump" ], - THREE.UniformsLib[ "normalmap" ], - THREE.UniformsLib[ "fog" ], - THREE.UniformsLib[ "lights" ], - THREE.UniformsLib[ "shadowmap" ], - - { - "ambient" : { type: "c", value: new THREE.Color( 0xffffff ) }, - "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) }, - "specular" : { type: "c", value: new THREE.Color( 0x111111 ) }, - "shininess": { type: "f", value: 30 }, - "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) } - } - - ] ), - - vertexShader: [ - - "#define PHONG", - - "varying vec3 vViewPosition;", - "varying vec3 vNormal;", - - THREE.ShaderChunk[ "map_pars_vertex" ], - THREE.ShaderChunk[ "lightmap_pars_vertex" ], - THREE.ShaderChunk[ "envmap_pars_vertex" ], - THREE.ShaderChunk[ "lights_phong_pars_vertex" ], - THREE.ShaderChunk[ "color_pars_vertex" ], - THREE.ShaderChunk[ "morphtarget_pars_vertex" ], - THREE.ShaderChunk[ "skinning_pars_vertex" ], - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - THREE.ShaderChunk[ "map_vertex" ], - THREE.ShaderChunk[ "lightmap_vertex" ], - THREE.ShaderChunk[ "color_vertex" ], - - THREE.ShaderChunk[ "morphnormal_vertex" ], - THREE.ShaderChunk[ "skinbase_vertex" ], - THREE.ShaderChunk[ "skinnormal_vertex" ], - THREE.ShaderChunk[ "defaultnormal_vertex" ], - - "vNormal = normalize( transformedNormal );", - - THREE.ShaderChunk[ "morphtarget_vertex" ], - THREE.ShaderChunk[ "skinning_vertex" ], - THREE.ShaderChunk[ "default_vertex" ], - - "vViewPosition = -mvPosition.xyz;", - - THREE.ShaderChunk[ "worldpos_vertex" ], - THREE.ShaderChunk[ "envmap_vertex" ], - THREE.ShaderChunk[ "lights_phong_vertex" ], - THREE.ShaderChunk[ "shadowmap_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform vec3 diffuse;", - "uniform float opacity;", - - "uniform vec3 ambient;", - "uniform vec3 emissive;", - "uniform vec3 specular;", - "uniform float shininess;", - - THREE.ShaderChunk[ "color_pars_fragment" ], - THREE.ShaderChunk[ "map_pars_fragment" ], - THREE.ShaderChunk[ "lightmap_pars_fragment" ], - THREE.ShaderChunk[ "envmap_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - THREE.ShaderChunk[ "lights_phong_pars_fragment" ], - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - THREE.ShaderChunk[ "bumpmap_pars_fragment" ], - THREE.ShaderChunk[ "normalmap_pars_fragment" ], - THREE.ShaderChunk[ "specularmap_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( vec3 ( 1.0 ), opacity );", - - THREE.ShaderChunk[ "map_fragment" ], - THREE.ShaderChunk[ "alphatest_fragment" ], - THREE.ShaderChunk[ "specularmap_fragment" ], - - THREE.ShaderChunk[ "lights_phong_fragment" ], - - THREE.ShaderChunk[ "lightmap_fragment" ], - THREE.ShaderChunk[ "color_fragment" ], - THREE.ShaderChunk[ "envmap_fragment" ], - THREE.ShaderChunk[ "shadowmap_fragment" ], - - THREE.ShaderChunk[ "linear_to_gamma_fragment" ], - - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n") - - }, - - 'particle_basic': { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "particle" ], - THREE.UniformsLib[ "shadowmap" ] - - ] ), - - vertexShader: [ - - "uniform float size;", - "uniform float scale;", - - THREE.ShaderChunk[ "color_pars_vertex" ], - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - THREE.ShaderChunk[ "color_vertex" ], - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - - "#ifdef USE_SIZEATTENUATION", - "gl_PointSize = size * ( scale / length( mvPosition.xyz ) );", - "#else", - "gl_PointSize = size;", - "#endif", - - "gl_Position = projectionMatrix * mvPosition;", - - THREE.ShaderChunk[ "worldpos_vertex" ], - THREE.ShaderChunk[ "shadowmap_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform vec3 psColor;", - "uniform float opacity;", - - THREE.ShaderChunk[ "color_pars_fragment" ], - THREE.ShaderChunk[ "map_particle_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( psColor, opacity );", - - THREE.ShaderChunk[ "map_particle_fragment" ], - THREE.ShaderChunk[ "alphatest_fragment" ], - THREE.ShaderChunk[ "color_fragment" ], - THREE.ShaderChunk[ "shadowmap_fragment" ], - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n") - - }, - - 'dashed': { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "common" ], - THREE.UniformsLib[ "fog" ], - - { - "scale": { type: "f", value: 1 }, - "dashSize": { type: "f", value: 1 }, - "totalSize": { type: "f", value: 2 } - } - - ] ), - - vertexShader: [ - - "uniform float scale;", - "attribute float lineDistance;", - - "varying float vLineDistance;", - - THREE.ShaderChunk[ "color_pars_vertex" ], - - "void main() {", - - THREE.ShaderChunk[ "color_vertex" ], - - "vLineDistance = scale * lineDistance;", - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - "gl_Position = projectionMatrix * mvPosition;", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform vec3 diffuse;", - "uniform float opacity;", - - "uniform float dashSize;", - "uniform float totalSize;", - - "varying float vLineDistance;", - - THREE.ShaderChunk[ "color_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - - "void main() {", - - "if ( mod( vLineDistance, totalSize ) > dashSize ) {", - - "discard;", - - "}", - - "gl_FragColor = vec4( diffuse, opacity );", - - THREE.ShaderChunk[ "color_fragment" ], - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n") - - }, - - 'depth': { - - uniforms: { - - "mNear": { type: "f", value: 1.0 }, - "mFar" : { type: "f", value: 2000.0 }, - "opacity" : { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "void main() {", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float mNear;", - "uniform float mFar;", - "uniform float opacity;", - - "void main() {", - - "float depth = gl_FragCoord.z / gl_FragCoord.w;", - "float color = 1.0 - smoothstep( mNear, mFar, depth );", - "gl_FragColor = vec4( vec3( color ), opacity );", - - "}" - - ].join("\n") - - }, - - 'normal': { - - uniforms: { - - "opacity" : { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec3 vNormal;", - - THREE.ShaderChunk[ "morphtarget_pars_vertex" ], - - "void main() {", - - "vNormal = normalize( normalMatrix * normal );", - - THREE.ShaderChunk[ "morphtarget_vertex" ], - THREE.ShaderChunk[ "default_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float opacity;", - "varying vec3 vNormal;", - - "void main() {", - - "gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Normal map shader - // - Blinn-Phong - // - normal + diffuse + specular + AO + displacement + reflection + shadow maps - // - point and directional lights (use with "lights: true" material option) - ------------------------------------------------------------------------- */ - - 'normalmap' : { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "fog" ], - THREE.UniformsLib[ "lights" ], - THREE.UniformsLib[ "shadowmap" ], - - { - - "enableAO" : { type: "i", value: 0 }, - "enableDiffuse" : { type: "i", value: 0 }, - "enableSpecular" : { type: "i", value: 0 }, - "enableReflection": { type: "i", value: 0 }, - "enableDisplacement": { type: "i", value: 0 }, - - "tDisplacement": { type: "t", value: null }, // must go first as this is vertex texture - "tDiffuse" : { type: "t", value: null }, - "tCube" : { type: "t", value: null }, - "tNormal" : { type: "t", value: null }, - "tSpecular" : { type: "t", value: null }, - "tAO" : { type: "t", value: null }, - - "uNormalScale": { type: "v2", value: new THREE.Vector2( 1, 1 ) }, - - "uDisplacementBias": { type: "f", value: 0.0 }, - "uDisplacementScale": { type: "f", value: 1.0 }, - - "diffuse": { type: "c", value: new THREE.Color( 0xffffff ) }, - "specular": { type: "c", value: new THREE.Color( 0x111111 ) }, - "ambient": { type: "c", value: new THREE.Color( 0xffffff ) }, - "shininess": { type: "f", value: 30 }, - "opacity": { type: "f", value: 1 }, - - "useRefract": { type: "i", value: 0 }, - "refractionRatio": { type: "f", value: 0.98 }, - "reflectivity": { type: "f", value: 0.5 }, - - "uOffset" : { type: "v2", value: new THREE.Vector2( 0, 0 ) }, - "uRepeat" : { type: "v2", value: new THREE.Vector2( 1, 1 ) }, - - "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) } - - } - - ] ), - - fragmentShader: [ - - "uniform vec3 ambient;", - "uniform vec3 diffuse;", - "uniform vec3 specular;", - "uniform float shininess;", - "uniform float opacity;", - - "uniform bool enableDiffuse;", - "uniform bool enableSpecular;", - "uniform bool enableAO;", - "uniform bool enableReflection;", - - "uniform sampler2D tDiffuse;", - "uniform sampler2D tNormal;", - "uniform sampler2D tSpecular;", - "uniform sampler2D tAO;", - - "uniform samplerCube tCube;", - - "uniform vec2 uNormalScale;", - - "uniform bool useRefract;", - "uniform float refractionRatio;", - "uniform float reflectivity;", - - "varying vec3 vTangent;", - "varying vec3 vBinormal;", - "varying vec3 vNormal;", - "varying vec2 vUv;", - - "uniform vec3 ambientLightColor;", - - "#if MAX_DIR_LIGHTS > 0", - - "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];", - "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];", - - "#endif", - - "#if MAX_HEMI_LIGHTS > 0", - - "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];", - "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];", - "uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];", - "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];", - "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];", - - "#endif", - - "#if MAX_SPOT_LIGHTS > 0", - - "uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];", - "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];", - "uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];", - "uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];", - "uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];", - "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];", - - "#endif", - - "#ifdef WRAP_AROUND", - - "uniform vec3 wrapRGB;", - - "#endif", - - "varying vec3 vWorldPosition;", - "varying vec3 vViewPosition;", - - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( vec3( 1.0 ), opacity );", - - "vec3 specularTex = vec3( 1.0 );", - - "vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;", - "normalTex.xy *= uNormalScale;", - "normalTex = normalize( normalTex );", - - "if( enableDiffuse ) {", - - "#ifdef GAMMA_INPUT", - - "vec4 texelColor = texture2D( tDiffuse, vUv );", - "texelColor.xyz *= texelColor.xyz;", - - "gl_FragColor = gl_FragColor * texelColor;", - - "#else", - - "gl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );", - - "#endif", - - "}", - - "if( enableAO ) {", - - "#ifdef GAMMA_INPUT", - - "vec4 aoColor = texture2D( tAO, vUv );", - "aoColor.xyz *= aoColor.xyz;", - - "gl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;", - - "#else", - - "gl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;", - - "#endif", - - "}", - - "if( enableSpecular )", - "specularTex = texture2D( tSpecular, vUv ).xyz;", - - "mat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );", - "vec3 finalNormal = tsb * normalTex;", - - "#ifdef FLIP_SIDED", - - "finalNormal = -finalNormal;", - - "#endif", - - "vec3 normal = normalize( finalNormal );", - "vec3 viewPosition = normalize( vViewPosition );", - - // point lights - - "#if MAX_POINT_LIGHTS > 0", - - "vec3 pointDiffuse = vec3( 0.0 );", - "vec3 pointSpecular = vec3( 0.0 );", - - "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {", - - "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );", - "vec3 pointVector = lPosition.xyz + vViewPosition.xyz;", - - "float pointDistance = 1.0;", - "if ( pointLightDistance[ i ] > 0.0 )", - "pointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );", - - "pointVector = normalize( pointVector );", - - // diffuse - - "#ifdef WRAP_AROUND", - - "float pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );", - "float pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );", - - "vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );", - - "#else", - - "float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );", - - "#endif", - - "pointDiffuse += pointDistance * pointLightColor[ i ] * diffuse * pointDiffuseWeight;", - - // specular - - "vec3 pointHalfVector = normalize( pointVector + viewPosition );", - "float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );", - "float pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, shininess ), 0.0 );", - - // 2.0 => 2.0001 is hack to work around ANGLE bug - - "float specularNormalization = ( shininess + 2.0001 ) / 8.0;", - - "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );", - "pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;", - - "}", - - "#endif", - - // spot lights - - "#if MAX_SPOT_LIGHTS > 0", - - "vec3 spotDiffuse = vec3( 0.0 );", - "vec3 spotSpecular = vec3( 0.0 );", - - "for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {", - - "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );", - "vec3 spotVector = lPosition.xyz + vViewPosition.xyz;", - - "float spotDistance = 1.0;", - "if ( spotLightDistance[ i ] > 0.0 )", - "spotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );", - - "spotVector = normalize( spotVector );", - - "float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );", - - "if ( spotEffect > spotLightAngleCos[ i ] ) {", - - "spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );", - - // diffuse - - "#ifdef WRAP_AROUND", - - "float spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );", - "float spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );", - - "vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );", - - "#else", - - "float spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );", - - "#endif", - - "spotDiffuse += spotDistance * spotLightColor[ i ] * diffuse * spotDiffuseWeight * spotEffect;", - - // specular - - "vec3 spotHalfVector = normalize( spotVector + viewPosition );", - "float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );", - "float spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, shininess ), 0.0 );", - - // 2.0 => 2.0001 is hack to work around ANGLE bug - - "float specularNormalization = ( shininess + 2.0001 ) / 8.0;", - - "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );", - "spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;", - - "}", - - "}", - - "#endif", - - // directional lights - - "#if MAX_DIR_LIGHTS > 0", - - "vec3 dirDiffuse = vec3( 0.0 );", - "vec3 dirSpecular = vec3( 0.0 );", - - "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {", - - "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );", - "vec3 dirVector = normalize( lDirection.xyz );", - - // diffuse - - "#ifdef WRAP_AROUND", - - "float directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );", - "float directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );", - - "vec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );", - - "#else", - - "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );", - - "#endif", - - "dirDiffuse += directionalLightColor[ i ] * diffuse * dirDiffuseWeight;", - - // specular - - "vec3 dirHalfVector = normalize( dirVector + viewPosition );", - "float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );", - "float dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, shininess ), 0.0 );", - - // 2.0 => 2.0001 is hack to work around ANGLE bug - - "float specularNormalization = ( shininess + 2.0001 ) / 8.0;", - - "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );", - "dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;", - - "}", - - "#endif", - - // hemisphere lights - - "#if MAX_HEMI_LIGHTS > 0", - - "vec3 hemiDiffuse = vec3( 0.0 );", - "vec3 hemiSpecular = vec3( 0.0 );" , - - "for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {", - - "vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );", - "vec3 lVector = normalize( lDirection.xyz );", - - // diffuse - - "float dotProduct = dot( normal, lVector );", - "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;", - - "vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );", - - "hemiDiffuse += diffuse * hemiColor;", - - // specular (sky light) - - - "vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );", - "float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;", - "float hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );", - - // specular (ground light) - - "vec3 lVectorGround = -lVector;", - - "vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );", - "float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;", - "float hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );", - - "float dotProductGround = dot( normal, lVectorGround );", - - // 2.0 => 2.0001 is hack to work around ANGLE bug - - "float specularNormalization = ( shininess + 2.0001 ) / 8.0;", - - "vec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );", - "vec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );", - "hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );", - - "}", - - "#endif", - - // all lights contribution summation - - "vec3 totalDiffuse = vec3( 0.0 );", - "vec3 totalSpecular = vec3( 0.0 );", - - "#if MAX_DIR_LIGHTS > 0", - - "totalDiffuse += dirDiffuse;", - "totalSpecular += dirSpecular;", - - "#endif", - - "#if MAX_HEMI_LIGHTS > 0", - - "totalDiffuse += hemiDiffuse;", - "totalSpecular += hemiSpecular;", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "totalDiffuse += pointDiffuse;", - "totalSpecular += pointSpecular;", - - "#endif", - - "#if MAX_SPOT_LIGHTS > 0", - - "totalDiffuse += spotDiffuse;", - "totalSpecular += spotSpecular;", - - "#endif", - - "#ifdef METAL", - - "gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient + totalSpecular );", - - "#else", - - "gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient ) + totalSpecular;", - - "#endif", - - "if ( enableReflection ) {", - - "vec3 vReflect;", - "vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );", - - "if ( useRefract ) {", - - "vReflect = refract( cameraToVertex, normal, refractionRatio );", - - "} else {", - - "vReflect = reflect( cameraToVertex, normal );", - - "}", - - "vec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );", - - "#ifdef GAMMA_INPUT", - - "cubeColor.xyz *= cubeColor.xyz;", - - "#endif", - - "gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * reflectivity );", - - "}", - - THREE.ShaderChunk[ "shadowmap_fragment" ], - THREE.ShaderChunk[ "linear_to_gamma_fragment" ], - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n"), - - vertexShader: [ - - "attribute vec4 tangent;", - - "uniform vec2 uOffset;", - "uniform vec2 uRepeat;", - - "uniform bool enableDisplacement;", - - "#ifdef VERTEX_TEXTURES", - - "uniform sampler2D tDisplacement;", - "uniform float uDisplacementScale;", - "uniform float uDisplacementBias;", - - "#endif", - - "varying vec3 vTangent;", - "varying vec3 vBinormal;", - "varying vec3 vNormal;", - "varying vec2 vUv;", - - "varying vec3 vWorldPosition;", - "varying vec3 vViewPosition;", - - THREE.ShaderChunk[ "skinning_pars_vertex" ], - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - THREE.ShaderChunk[ "skinbase_vertex" ], - THREE.ShaderChunk[ "skinnormal_vertex" ], - - // normal, tangent and binormal vectors - - "#ifdef USE_SKINNING", - - "vNormal = normalize( normalMatrix * skinnedNormal.xyz );", - - "vec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );", - "vTangent = normalize( normalMatrix * skinnedTangent.xyz );", - - "#else", - - "vNormal = normalize( normalMatrix * normal );", - "vTangent = normalize( normalMatrix * tangent.xyz );", - - "#endif", - - "vBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );", - - "vUv = uv * uRepeat + uOffset;", - - // displacement mapping - - "vec3 displacedPosition;", - - "#ifdef VERTEX_TEXTURES", - - "if ( enableDisplacement ) {", - - "vec3 dv = texture2D( tDisplacement, uv ).xyz;", - "float df = uDisplacementScale * dv.x + uDisplacementBias;", - "displacedPosition = position + normalize( normal ) * df;", - - "} else {", - - "#ifdef USE_SKINNING", - - "vec4 skinVertex = vec4( position, 1.0 );", - - "vec4 skinned = boneMatX * skinVertex * skinWeight.x;", - "skinned += boneMatY * skinVertex * skinWeight.y;", - - "displacedPosition = skinned.xyz;", - - "#else", - - "displacedPosition = position;", - - "#endif", - - "}", - - "#else", - - "#ifdef USE_SKINNING", - - "vec4 skinVertex = vec4( position, 1.0 );", - - "vec4 skinned = boneMatX * skinVertex * skinWeight.x;", - "skinned += boneMatY * skinVertex * skinWeight.y;", - - "displacedPosition = skinned.xyz;", - - "#else", - - "displacedPosition = position;", - - "#endif", - - "#endif", - - // - - "vec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );", - "vec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );", - - "gl_Position = projectionMatrix * mvPosition;", - - // - - "vWorldPosition = worldPosition.xyz;", - "vViewPosition = -mvPosition.xyz;", - - // shadows - - "#ifdef USE_SHADOWMAP", - - "for( int i = 0; i < MAX_SHADOWS; i ++ ) {", - - "vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;", - - "}", - - "#endif", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Cube map shader - ------------------------------------------------------------------------- */ - - 'cube': { - - uniforms: { "tCube": { type: "t", value: null }, - "tFlip": { type: "f", value: -1 } }, - - vertexShader: [ - - "varying vec3 vWorldPosition;", - - "void main() {", - - "vec4 worldPosition = modelMatrix * vec4( position, 1.0 );", - "vWorldPosition = worldPosition.xyz;", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform samplerCube tCube;", - "uniform float tFlip;", - - "varying vec3 vWorldPosition;", - - "void main() {", - - "gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );", - - "}" - - ].join("\n") - - }, - - // Depth encoding into RGBA texture - // based on SpiderGL shadow map example - // http://spidergl.org/example.php?id=6 - // originally from - // http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD - // see also here: - // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ - - 'depthRGBA': { - - uniforms: {}, - - vertexShader: [ - - THREE.ShaderChunk[ "morphtarget_pars_vertex" ], - THREE.ShaderChunk[ "skinning_pars_vertex" ], - - "void main() {", - - THREE.ShaderChunk[ "skinbase_vertex" ], - THREE.ShaderChunk[ "morphtarget_vertex" ], - THREE.ShaderChunk[ "skinning_vertex" ], - THREE.ShaderChunk[ "default_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "vec4 pack_depth( const in float depth ) {", - - "const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );", - "const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );", - "vec4 res = fract( depth * bit_shift );", - "res -= res.xxyz * bit_mask;", - "return res;", - - "}", - - "void main() {", - - "gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );", - - //"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );", - //"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );", - //"gl_FragData[ 0 ] = pack_depth( z );", - //"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );", - - "}" - - ].join("\n") - - } - -}; - -/** - * @author supereggbert / http://www.paulbrunt.co.uk/ - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author szimek / https://github.com/szimek/ - */ - -THREE.WebGLRenderer = function ( parameters ) { - - console.log( 'THREE.WebGLRenderer', THREE.REVISION ); - - parameters = parameters || {}; - - var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ), - _context = parameters.context !== undefined ? parameters.context : null, - - _precision = parameters.precision !== undefined ? parameters.precision : 'highp', - - _buffers = {}, - - _alpha = parameters.alpha !== undefined ? parameters.alpha : false, - _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, - _antialias = parameters.antialias !== undefined ? parameters.antialias : false, - _stencil = parameters.stencil !== undefined ? parameters.stencil : true, - _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, - - _clearColor = new THREE.Color( 0x000000 ), - _clearAlpha = 0; - - // public properties - - this.domElement = _canvas; - this.context = null; - this.devicePixelRatio = parameters.devicePixelRatio !== undefined - ? parameters.devicePixelRatio - : self.devicePixelRatio !== undefined - ? self.devicePixelRatio - : 1; - - // clearing - - this.autoClear = true; - this.autoClearColor = true; - this.autoClearDepth = true; - this.autoClearStencil = true; - - // scene graph - - this.sortObjects = true; - this.autoUpdateObjects = true; - - // physically based shading - - this.gammaInput = false; - this.gammaOutput = false; - - // shadow map - - this.shadowMapEnabled = false; - this.shadowMapAutoUpdate = true; - this.shadowMapType = THREE.PCFShadowMap; - this.shadowMapCullFace = THREE.CullFaceFront; - this.shadowMapDebug = false; - this.shadowMapCascade = false; - - // morphs - - this.maxMorphTargets = 8; - this.maxMorphNormals = 4; - - // flags - - this.autoScaleCubemaps = true; - - // custom render plugins - - this.renderPluginsPre = []; - this.renderPluginsPost = []; - - // info - - this.info = { - - memory: { - - programs: 0, - geometries: 0, - textures: 0 - - }, - - render: { - - calls: 0, - vertices: 0, - faces: 0, - points: 0 - - } - - }; - - // internal properties - - var _this = this, - - _programs = [], - _programs_counter = 0, - - // internal state cache - - _currentProgram = null, - _currentFramebuffer = null, - _currentMaterialId = -1, - _currentGeometryGroupHash = null, - _currentCamera = null, - - _usedTextureUnits = 0, - - // GL state cache - - _oldDoubleSided = -1, - _oldFlipSided = -1, - - _oldBlending = -1, - - _oldBlendEquation = -1, - _oldBlendSrc = -1, - _oldBlendDst = -1, - - _oldDepthTest = -1, - _oldDepthWrite = -1, - - _oldPolygonOffset = null, - _oldPolygonOffsetFactor = null, - _oldPolygonOffsetUnits = null, - - _oldLineWidth = null, - - _viewportX = 0, - _viewportY = 0, - _viewportWidth = _canvas.width, - _viewportHeight = _canvas.height, - _currentWidth = 0, - _currentHeight = 0, - - _enabledAttributes = new Uint8Array( 16 ), - - // frustum - - _frustum = new THREE.Frustum(), - - // camera matrices cache - - _projScreenMatrix = new THREE.Matrix4(), - _projScreenMatrixPS = new THREE.Matrix4(), - - _vector3 = new THREE.Vector3(), - - // light arrays cache - - _direction = new THREE.Vector3(), - - _lightsNeedUpdate = true, - - _lights = { - - ambient: [ 0, 0, 0 ], - directional: { length: 0, colors: new Array(), positions: new Array() }, - point: { length: 0, colors: new Array(), positions: new Array(), distances: new Array() }, - spot: { length: 0, colors: new Array(), positions: new Array(), distances: new Array(), directions: new Array(), anglesCos: new Array(), exponents: new Array() }, - hemi: { length: 0, skyColors: new Array(), groundColors: new Array(), positions: new Array() } - - }; - - // initialize - - var _gl; - - var _glExtensionTextureFloat; - var _glExtensionTextureFloatLinear; - var _glExtensionStandardDerivatives; - var _glExtensionTextureFilterAnisotropic; - var _glExtensionCompressedTextureS3TC; - - initGL(); - - setDefaultGLState(); - - this.context = _gl; - - // GPU capabilities - - var _maxTextures = _gl.getParameter( _gl.MAX_TEXTURE_IMAGE_UNITS ); - var _maxVertexTextures = _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); - var _maxTextureSize = _gl.getParameter( _gl.MAX_TEXTURE_SIZE ); - var _maxCubemapSize = _gl.getParameter( _gl.MAX_CUBE_MAP_TEXTURE_SIZE ); - - var _maxAnisotropy = _glExtensionTextureFilterAnisotropic ? _gl.getParameter( _glExtensionTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT ) : 0; - - var _supportsVertexTextures = ( _maxVertexTextures > 0 ); - var _supportsBoneTextures = _supportsVertexTextures && _glExtensionTextureFloat; - - var _compressedTextureFormats = _glExtensionCompressedTextureS3TC ? _gl.getParameter( _gl.COMPRESSED_TEXTURE_FORMATS ) : []; - - // - - var _vertexShaderPrecisionHighpFloat = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.HIGH_FLOAT ); - var _vertexShaderPrecisionMediumpFloat = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.MEDIUM_FLOAT ); - var _vertexShaderPrecisionLowpFloat = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.LOW_FLOAT ); - - var _fragmentShaderPrecisionHighpFloat = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.HIGH_FLOAT ); - var _fragmentShaderPrecisionMediumpFloat = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.MEDIUM_FLOAT ); - var _fragmentShaderPrecisionLowpFloat = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.LOW_FLOAT ); - - var _vertexShaderPrecisionHighpInt = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.HIGH_INT ); - var _vertexShaderPrecisionMediumpInt = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.MEDIUM_INT ); - var _vertexShaderPrecisionLowpInt = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.LOW_INT ); - - var _fragmentShaderPrecisionHighpInt = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.HIGH_INT ); - var _fragmentShaderPrecisionMediumpInt = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.MEDIUM_INT ); - var _fragmentShaderPrecisionLowpInt = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.LOW_INT ); - - // clamp precision to maximum available - - var highpAvailable = _vertexShaderPrecisionHighpFloat.precision > 0 && _fragmentShaderPrecisionHighpFloat.precision > 0; - var mediumpAvailable = _vertexShaderPrecisionMediumpFloat.precision > 0 && _fragmentShaderPrecisionMediumpFloat.precision > 0; - - if ( _precision === "highp" && ! highpAvailable ) { - - if ( mediumpAvailable ) { - - _precision = "mediump"; - console.warn( "WebGLRenderer: highp not supported, using mediump" ); - - } else { - - _precision = "lowp"; - console.warn( "WebGLRenderer: highp and mediump not supported, using lowp" ); - - } - - } - - if ( _precision === "mediump" && ! mediumpAvailable ) { - - _precision = "lowp"; - console.warn( "WebGLRenderer: mediump not supported, using lowp" ); - - } - - // API - - this.getContext = function () { - - return _gl; - - }; - - this.supportsVertexTextures = function () { - - return _supportsVertexTextures; - - }; - - this.supportsFloatTextures = function () { - - return _glExtensionTextureFloat; - - }; - - this.supportsStandardDerivatives = function () { - - return _glExtensionStandardDerivatives; - - }; - - this.supportsCompressedTextureS3TC = function () { - - return _glExtensionCompressedTextureS3TC; - - }; - - this.getMaxAnisotropy = function () { - - return _maxAnisotropy; - - }; - - this.getPrecision = function () { - - return _precision; - - }; - - this.setSize = function ( width, height, updateStyle ) { - - _canvas.width = width * this.devicePixelRatio; - _canvas.height = height * this.devicePixelRatio; - - if ( this.devicePixelRatio !== 1 && updateStyle !== false ) { - - _canvas.style.width = width + 'px'; - _canvas.style.height = height + 'px'; - - } - - this.setViewport( 0, 0, width, height ); - - }; - - this.setViewport = function ( x, y, width, height ) { - - _viewportX = x * this.devicePixelRatio; - _viewportY = y * this.devicePixelRatio; - - _viewportWidth = width * this.devicePixelRatio; - _viewportHeight = height * this.devicePixelRatio; - - _gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight ); - - }; - - this.setScissor = function ( x, y, width, height ) { - - _gl.scissor( - x * this.devicePixelRatio, - y * this.devicePixelRatio, - width * this.devicePixelRatio, - height * this.devicePixelRatio - ); - - }; - - this.enableScissorTest = function ( enable ) { - - enable ? _gl.enable( _gl.SCISSOR_TEST ) : _gl.disable( _gl.SCISSOR_TEST ); - - }; - - // Clearing - - this.setClearColor = function ( color, alpha ) { - - _clearColor.set( color ); - _clearAlpha = alpha !== undefined ? alpha : 1; - - _gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); - - }; - - this.setClearColorHex = function ( hex, alpha ) { - - console.warn( 'DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.' ); - this.setClearColor( hex, alpha ); - - }; - - this.getClearColor = function () { - - return _clearColor; - - }; - - this.getClearAlpha = function () { - - return _clearAlpha; - - }; - - this.clear = function ( color, depth, stencil ) { - - var bits = 0; - - if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; - if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; - if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; - - _gl.clear( bits ); - - }; - - this.clearColor = function () { - - _gl.clear( _gl.COLOR_BUFFER_BIT ); - - }; - - this.clearDepth = function () { - - _gl.clear( _gl.DEPTH_BUFFER_BIT ); - - }; - - this.clearStencil = function () { - - _gl.clear( _gl.STENCIL_BUFFER_BIT ); - - }; - - this.clearTarget = function ( renderTarget, color, depth, stencil ) { - - this.setRenderTarget( renderTarget ); - this.clear( color, depth, stencil ); - - }; - - // Plugins - - this.addPostPlugin = function ( plugin ) { - - plugin.init( this ); - this.renderPluginsPost.push( plugin ); - - }; - - this.addPrePlugin = function ( plugin ) { - - plugin.init( this ); - this.renderPluginsPre.push( plugin ); - - }; - - // Rendering - - this.updateShadowMap = function ( scene, camera ) { - - _currentProgram = null; - _oldBlending = -1; - _oldDepthTest = -1; - _oldDepthWrite = -1; - _currentGeometryGroupHash = -1; - _currentMaterialId = -1; - _lightsNeedUpdate = true; - _oldDoubleSided = -1; - _oldFlipSided = -1; - - this.shadowMapPlugin.update( scene, camera ); - - }; - - // Internal functions - - // Buffer allocation - - function createParticleBuffers ( geometry ) { - - geometry.__webglVertexBuffer = _gl.createBuffer(); - geometry.__webglColorBuffer = _gl.createBuffer(); - - _this.info.memory.geometries ++; - - }; - - function createLineBuffers ( geometry ) { - - geometry.__webglVertexBuffer = _gl.createBuffer(); - geometry.__webglColorBuffer = _gl.createBuffer(); - geometry.__webglLineDistanceBuffer = _gl.createBuffer(); - - _this.info.memory.geometries ++; - - }; - - function createMeshBuffers ( geometryGroup ) { - - geometryGroup.__webglVertexBuffer = _gl.createBuffer(); - geometryGroup.__webglNormalBuffer = _gl.createBuffer(); - geometryGroup.__webglTangentBuffer = _gl.createBuffer(); - geometryGroup.__webglColorBuffer = _gl.createBuffer(); - geometryGroup.__webglUVBuffer = _gl.createBuffer(); - geometryGroup.__webglUV2Buffer = _gl.createBuffer(); - - geometryGroup.__webglSkinIndicesBuffer = _gl.createBuffer(); - geometryGroup.__webglSkinWeightsBuffer = _gl.createBuffer(); - - geometryGroup.__webglFaceBuffer = _gl.createBuffer(); - geometryGroup.__webglLineBuffer = _gl.createBuffer(); - - var m, ml; - - if ( geometryGroup.numMorphTargets ) { - - geometryGroup.__webglMorphTargetsBuffers = []; - - for ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) { - - geometryGroup.__webglMorphTargetsBuffers.push( _gl.createBuffer() ); - - } - - } - - if ( geometryGroup.numMorphNormals ) { - - geometryGroup.__webglMorphNormalsBuffers = []; - - for ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) { - - geometryGroup.__webglMorphNormalsBuffers.push( _gl.createBuffer() ); - - } - - } - - _this.info.memory.geometries ++; - - }; - - // Events - - var onGeometryDispose = function ( event ) { - - var geometry = event.target; - - geometry.removeEventListener( 'dispose', onGeometryDispose ); - - deallocateGeometry( geometry ); - - }; - - var onTextureDispose = function ( event ) { - - var texture = event.target; - - texture.removeEventListener( 'dispose', onTextureDispose ); - - deallocateTexture( texture ); - - _this.info.memory.textures --; - - - }; - - var onRenderTargetDispose = function ( event ) { - - var renderTarget = event.target; - - renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); - - deallocateRenderTarget( renderTarget ); - - _this.info.memory.textures --; - - }; - - var onMaterialDispose = function ( event ) { - - var material = event.target; - - material.removeEventListener( 'dispose', onMaterialDispose ); - - deallocateMaterial( material ); - - }; - - // Buffer deallocation - - var deleteBuffers = function ( geometry ) { - - if ( geometry.__webglVertexBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglVertexBuffer ); - if ( geometry.__webglNormalBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglNormalBuffer ); - if ( geometry.__webglTangentBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglTangentBuffer ); - if ( geometry.__webglColorBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglColorBuffer ); - if ( geometry.__webglUVBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglUVBuffer ); - if ( geometry.__webglUV2Buffer !== undefined ) _gl.deleteBuffer( geometry.__webglUV2Buffer ); - - if ( geometry.__webglSkinIndicesBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglSkinIndicesBuffer ); - if ( geometry.__webglSkinWeightsBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglSkinWeightsBuffer ); - - if ( geometry.__webglFaceBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglFaceBuffer ); - if ( geometry.__webglLineBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglLineBuffer ); - - if ( geometry.__webglLineDistanceBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglLineDistanceBuffer ); - // custom attributes - - if ( geometry.__webglCustomAttributesList !== undefined ) { - - for ( var id in geometry.__webglCustomAttributesList ) { - - _gl.deleteBuffer( geometry.__webglCustomAttributesList[ id ].buffer ); - - } - - } - - _this.info.memory.geometries --; - - }; - - var deallocateGeometry = function ( geometry ) { - - geometry.__webglInit = undefined; - - if ( geometry instanceof THREE.BufferGeometry ) { - - var attributes = geometry.attributes; - - for ( var key in attributes ) { - - if ( attributes[ key ].buffer !== undefined ) { - - _gl.deleteBuffer( attributes[ key ].buffer ); - - } - - } - - _this.info.memory.geometries --; - - } else { - - if ( geometry.geometryGroups !== undefined ) { - - for ( var g in geometry.geometryGroups ) { - - var geometryGroup = geometry.geometryGroups[ g ]; - - if ( geometryGroup.numMorphTargets !== undefined ) { - - for ( var m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) { - - _gl.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] ); - - } - - } - - if ( geometryGroup.numMorphNormals !== undefined ) { - - for ( var m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) { - - _gl.deleteBuffer( geometryGroup.__webglMorphNormalsBuffers[ m ] ); - - } - - } - - deleteBuffers( geometryGroup ); - - } - - } else { - - deleteBuffers( geometry ); - - } - - } - - }; - - var deallocateTexture = function ( texture ) { - - if ( texture.image && texture.image.__webglTextureCube ) { - - // cube texture - - _gl.deleteTexture( texture.image.__webglTextureCube ); - - } else { - - // 2D texture - - if ( ! texture.__webglInit ) return; - - texture.__webglInit = false; - _gl.deleteTexture( texture.__webglTexture ); - - } - - }; - - var deallocateRenderTarget = function ( renderTarget ) { - - if ( !renderTarget || ! renderTarget.__webglTexture ) return; - - _gl.deleteTexture( renderTarget.__webglTexture ); - - if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) { - - for ( var i = 0; i < 6; i ++ ) { - - _gl.deleteFramebuffer( renderTarget.__webglFramebuffer[ i ] ); - _gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer[ i ] ); - - } - - } else { - - _gl.deleteFramebuffer( renderTarget.__webglFramebuffer ); - _gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer ); - - } - - }; - - var deallocateMaterial = function ( material ) { - - var program = material.program; - - if ( program === undefined ) return; - - material.program = undefined; - - // only deallocate GL program if this was the last use of shared program - // assumed there is only single copy of any program in the _programs list - // (that's how it's constructed) - - var i, il, programInfo; - var deleteProgram = false; - - for ( i = 0, il = _programs.length; i < il; i ++ ) { - - programInfo = _programs[ i ]; - - if ( programInfo.program === program ) { - - programInfo.usedTimes --; - - if ( programInfo.usedTimes === 0 ) { - - deleteProgram = true; - - } - - break; - - } - - } - - if ( deleteProgram === true ) { - - // avoid using array.splice, this is costlier than creating new array from scratch - - var newPrograms = []; - - for ( i = 0, il = _programs.length; i < il; i ++ ) { - - programInfo = _programs[ i ]; - - if ( programInfo.program !== program ) { - - newPrograms.push( programInfo ); - - } - - } - - _programs = newPrograms; - - _gl.deleteProgram( program ); - - _this.info.memory.programs --; - - } - - }; - - // Buffer initialization - - function initCustomAttributes ( geometry, object ) { - - var nvertices = geometry.vertices.length; - - var material = object.material; - - if ( material.attributes ) { - - if ( geometry.__webglCustomAttributesList === undefined ) { - - geometry.__webglCustomAttributesList = []; - - } - - for ( var a in material.attributes ) { - - var attribute = material.attributes[ a ]; - - if ( !attribute.__webglInitialized || attribute.createUniqueBuffers ) { - - attribute.__webglInitialized = true; - - var size = 1; // "f" and "i" - - if ( attribute.type === "v2" ) size = 2; - else if ( attribute.type === "v3" ) size = 3; - else if ( attribute.type === "v4" ) size = 4; - else if ( attribute.type === "c" ) size = 3; - - attribute.size = size; - - attribute.array = new Float32Array( nvertices * size ); - - attribute.buffer = _gl.createBuffer(); - attribute.buffer.belongsToAttribute = a; - - attribute.needsUpdate = true; - - } - - geometry.__webglCustomAttributesList.push( attribute ); - - } - - } - - }; - - function initParticleBuffers ( geometry, object ) { - - var nvertices = geometry.vertices.length; - - geometry.__vertexArray = new Float32Array( nvertices * 3 ); - geometry.__colorArray = new Float32Array( nvertices * 3 ); - - geometry.__sortArray = []; - - geometry.__webglParticleCount = nvertices; - - initCustomAttributes ( geometry, object ); - - }; - - function initLineBuffers ( geometry, object ) { - - var nvertices = geometry.vertices.length; - - geometry.__vertexArray = new Float32Array( nvertices * 3 ); - geometry.__colorArray = new Float32Array( nvertices * 3 ); - geometry.__lineDistanceArray = new Float32Array( nvertices * 1 ); - - geometry.__webglLineCount = nvertices; - - initCustomAttributes ( geometry, object ); - - }; - - function initMeshBuffers ( geometryGroup, object ) { - - var geometry = object.geometry, - faces3 = geometryGroup.faces3, - - nvertices = faces3.length * 3, - ntris = faces3.length * 1, - nlines = faces3.length * 3, - - material = getBufferMaterial( object, geometryGroup ), - - uvType = bufferGuessUVType( material ), - normalType = bufferGuessNormalType( material ), - vertexColorType = bufferGuessVertexColorType( material ); - - // console.log( "uvType", uvType, "normalType", normalType, "vertexColorType", vertexColorType, object, geometryGroup, material ); - - geometryGroup.__vertexArray = new Float32Array( nvertices * 3 ); - - if ( normalType ) { - - geometryGroup.__normalArray = new Float32Array( nvertices * 3 ); - - } - - if ( geometry.hasTangents ) { - - geometryGroup.__tangentArray = new Float32Array( nvertices * 4 ); - - } - - if ( vertexColorType ) { - - geometryGroup.__colorArray = new Float32Array( nvertices * 3 ); - - } - - if ( uvType ) { - - if ( geometry.faceVertexUvs.length > 0 ) { - - geometryGroup.__uvArray = new Float32Array( nvertices * 2 ); - - } - - if ( geometry.faceVertexUvs.length > 1 ) { - - geometryGroup.__uv2Array = new Float32Array( nvertices * 2 ); - - } - - } - - if ( object.geometry.skinWeights.length && object.geometry.skinIndices.length ) { - - geometryGroup.__skinIndexArray = new Float32Array( nvertices * 4 ); - geometryGroup.__skinWeightArray = new Float32Array( nvertices * 4 ); - - } - - geometryGroup.__faceArray = new Uint16Array( ntris * 3 ); - geometryGroup.__lineArray = new Uint16Array( nlines * 2 ); - - var m, ml; - - if ( geometryGroup.numMorphTargets ) { - - geometryGroup.__morphTargetsArrays = []; - - for ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) { - - geometryGroup.__morphTargetsArrays.push( new Float32Array( nvertices * 3 ) ); - - } - - } - - if ( geometryGroup.numMorphNormals ) { - - geometryGroup.__morphNormalsArrays = []; - - for ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) { - - geometryGroup.__morphNormalsArrays.push( new Float32Array( nvertices * 3 ) ); - - } - - } - - geometryGroup.__webglFaceCount = ntris * 3; - geometryGroup.__webglLineCount = nlines * 2; - - - // custom attributes - - if ( material.attributes ) { - - if ( geometryGroup.__webglCustomAttributesList === undefined ) { - - geometryGroup.__webglCustomAttributesList = []; - - } - - for ( var a in material.attributes ) { - - // Do a shallow copy of the attribute object so different geometryGroup chunks use different - // attribute buffers which are correctly indexed in the setMeshBuffers function - - var originalAttribute = material.attributes[ a ]; - - var attribute = {}; - - for ( var property in originalAttribute ) { - - attribute[ property ] = originalAttribute[ property ]; - - } - - if ( !attribute.__webglInitialized || attribute.createUniqueBuffers ) { - - attribute.__webglInitialized = true; - - var size = 1; // "f" and "i" - - if( attribute.type === "v2" ) size = 2; - else if( attribute.type === "v3" ) size = 3; - else if( attribute.type === "v4" ) size = 4; - else if( attribute.type === "c" ) size = 3; - - attribute.size = size; - - attribute.array = new Float32Array( nvertices * size ); - - attribute.buffer = _gl.createBuffer(); - attribute.buffer.belongsToAttribute = a; - - originalAttribute.needsUpdate = true; - attribute.__original = originalAttribute; - - } - - geometryGroup.__webglCustomAttributesList.push( attribute ); - - } - - } - - geometryGroup.__inittedArrays = true; - - }; - - function getBufferMaterial( object, geometryGroup ) { - - return object.material instanceof THREE.MeshFaceMaterial - ? object.material.materials[ geometryGroup.materialIndex ] - : object.material; - - }; - - function materialNeedsSmoothNormals ( material ) { - - return material && material.shading !== undefined && material.shading === THREE.SmoothShading; - - }; - - function bufferGuessNormalType ( material ) { - - // only MeshBasicMaterial and MeshDepthMaterial don't need normals - - if ( ( material instanceof THREE.MeshBasicMaterial && !material.envMap ) || material instanceof THREE.MeshDepthMaterial ) { - - return false; - - } - - if ( materialNeedsSmoothNormals( material ) ) { - - return THREE.SmoothShading; - - } else { - - return THREE.FlatShading; - - } - - }; - - function bufferGuessVertexColorType( material ) { - - if ( material.vertexColors ) { - - return material.vertexColors; - - } - - return false; - - }; - - function bufferGuessUVType( material ) { - - // material must use some texture to require uvs - - if ( material.map || - material.lightMap || - material.bumpMap || - material.normalMap || - material.specularMap || - material instanceof THREE.ShaderMaterial ) { - - return true; - - } - - return false; - - }; - - // - - function initDirectBuffers( geometry ) { - - var a, attribute, type; - - for ( a in geometry.attributes ) { - - if ( a === "index" ) { - - type = _gl.ELEMENT_ARRAY_BUFFER; - - } else { - - type = _gl.ARRAY_BUFFER; - - } - - attribute = geometry.attributes[ a ]; - - attribute.buffer = _gl.createBuffer(); - - _gl.bindBuffer( type, attribute.buffer ); - _gl.bufferData( type, attribute.array, _gl.STATIC_DRAW ); - - } - - }; - - // Buffer setting - - function setParticleBuffers ( geometry, hint, object ) { - - var v, c, vertex, offset, index, color, - - vertices = geometry.vertices, - vl = vertices.length, - - colors = geometry.colors, - cl = colors.length, - - vertexArray = geometry.__vertexArray, - colorArray = geometry.__colorArray, - - sortArray = geometry.__sortArray, - - dirtyVertices = geometry.verticesNeedUpdate, - dirtyElements = geometry.elementsNeedUpdate, - dirtyColors = geometry.colorsNeedUpdate, - - customAttributes = geometry.__webglCustomAttributesList, - i, il, - a, ca, cal, value, - customAttribute; - - if ( object.sortParticles ) { - - _projScreenMatrixPS.copy( _projScreenMatrix ); - _projScreenMatrixPS.multiply( object.matrixWorld ); - - for ( v = 0; v < vl; v ++ ) { - - vertex = vertices[ v ]; - - _vector3.copy( vertex ); - _vector3.applyProjection( _projScreenMatrixPS ); - - sortArray[ v ] = [ _vector3.z, v ]; - - } - - sortArray.sort( numericalSort ); - - for ( v = 0; v < vl; v ++ ) { - - vertex = vertices[ sortArray[v][1] ]; - - offset = v * 3; - - vertexArray[ offset ] = vertex.x; - vertexArray[ offset + 1 ] = vertex.y; - vertexArray[ offset + 2 ] = vertex.z; - - } - - for ( c = 0; c < cl; c ++ ) { - - offset = c * 3; - - color = colors[ sortArray[c][1] ]; - - colorArray[ offset ] = color.r; - colorArray[ offset + 1 ] = color.g; - colorArray[ offset + 2 ] = color.b; - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( ! ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) ) continue; - - offset = 0; - - cal = customAttribute.value.length; - - if ( customAttribute.size === 1 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - customAttribute.array[ ca ] = customAttribute.value[ index ]; - - } - - } else if ( customAttribute.size === 2 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - value = customAttribute.value[ index ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - - offset += 2; - - } - - } else if ( customAttribute.size === 3 ) { - - if ( customAttribute.type === "c" ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - value = customAttribute.value[ index ]; - - customAttribute.array[ offset ] = value.r; - customAttribute.array[ offset + 1 ] = value.g; - customAttribute.array[ offset + 2 ] = value.b; - - offset += 3; - - } - - } else { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - value = customAttribute.value[ index ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - - offset += 3; - - } - - } - - } else if ( customAttribute.size === 4 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - value = customAttribute.value[ index ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - customAttribute.array[ offset + 3 ] = value.w; - - offset += 4; - - } - - } - - } - - } - - } else { - - if ( dirtyVertices ) { - - for ( v = 0; v < vl; v ++ ) { - - vertex = vertices[ v ]; - - offset = v * 3; - - vertexArray[ offset ] = vertex.x; - vertexArray[ offset + 1 ] = vertex.y; - vertexArray[ offset + 2 ] = vertex.z; - - } - - } - - if ( dirtyColors ) { - - for ( c = 0; c < cl; c ++ ) { - - color = colors[ c ]; - - offset = c * 3; - - colorArray[ offset ] = color.r; - colorArray[ offset + 1 ] = color.g; - colorArray[ offset + 2 ] = color.b; - - } - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( customAttribute.needsUpdate && - ( customAttribute.boundTo === undefined || - customAttribute.boundTo === "vertices") ) { - - cal = customAttribute.value.length; - - offset = 0; - - if ( customAttribute.size === 1 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - customAttribute.array[ ca ] = customAttribute.value[ ca ]; - - } - - } else if ( customAttribute.size === 2 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - - offset += 2; - - } - - } else if ( customAttribute.size === 3 ) { - - if ( customAttribute.type === "c" ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.r; - customAttribute.array[ offset + 1 ] = value.g; - customAttribute.array[ offset + 2 ] = value.b; - - offset += 3; - - } - - } else { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - - offset += 3; - - } - - } - - } else if ( customAttribute.size === 4 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - customAttribute.array[ offset + 3 ] = value.w; - - offset += 4; - - } - - } - - } - - } - - } - - } - - if ( dirtyVertices || object.sortParticles ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint ); - - } - - if ( dirtyColors || object.sortParticles ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint ); - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( customAttribute.needsUpdate || object.sortParticles ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint ); - - } - - } - - } - - - }; - - function setLineBuffers ( geometry, hint ) { - - var v, c, d, vertex, offset, color, - - vertices = geometry.vertices, - colors = geometry.colors, - lineDistances = geometry.lineDistances, - - vl = vertices.length, - cl = colors.length, - dl = lineDistances.length, - - vertexArray = geometry.__vertexArray, - colorArray = geometry.__colorArray, - lineDistanceArray = geometry.__lineDistanceArray, - - dirtyVertices = geometry.verticesNeedUpdate, - dirtyColors = geometry.colorsNeedUpdate, - dirtyLineDistances = geometry.lineDistancesNeedUpdate, - - customAttributes = geometry.__webglCustomAttributesList, - - i, il, - a, ca, cal, value, - customAttribute; - - if ( dirtyVertices ) { - - for ( v = 0; v < vl; v ++ ) { - - vertex = vertices[ v ]; - - offset = v * 3; - - vertexArray[ offset ] = vertex.x; - vertexArray[ offset + 1 ] = vertex.y; - vertexArray[ offset + 2 ] = vertex.z; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint ); - - } - - if ( dirtyColors ) { - - for ( c = 0; c < cl; c ++ ) { - - color = colors[ c ]; - - offset = c * 3; - - colorArray[ offset ] = color.r; - colorArray[ offset + 1 ] = color.g; - colorArray[ offset + 2 ] = color.b; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint ); - - } - - if ( dirtyLineDistances ) { - - for ( d = 0; d < dl; d ++ ) { - - lineDistanceArray[ d ] = lineDistances[ d ]; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglLineDistanceBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, lineDistanceArray, hint ); - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( customAttribute.needsUpdate && - ( customAttribute.boundTo === undefined || - customAttribute.boundTo === "vertices" ) ) { - - offset = 0; - - cal = customAttribute.value.length; - - if ( customAttribute.size === 1 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - customAttribute.array[ ca ] = customAttribute.value[ ca ]; - - } - - } else if ( customAttribute.size === 2 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - - offset += 2; - - } - - } else if ( customAttribute.size === 3 ) { - - if ( customAttribute.type === "c" ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.r; - customAttribute.array[ offset + 1 ] = value.g; - customAttribute.array[ offset + 2 ] = value.b; - - offset += 3; - - } - - } else { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - - offset += 3; - - } - - } - - } else if ( customAttribute.size === 4 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - customAttribute.array[ offset + 3 ] = value.w; - - offset += 4; - - } - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint ); - - } - - } - - } - - }; - - function setMeshBuffers( geometryGroup, object, hint, dispose, material ) { - - if ( ! geometryGroup.__inittedArrays ) { - - return; - - } - - var normalType = bufferGuessNormalType( material ), - vertexColorType = bufferGuessVertexColorType( material ), - uvType = bufferGuessUVType( material ), - - needsSmoothNormals = ( normalType === THREE.SmoothShading ); - - var f, fl, fi, face, - vertexNormals, faceNormal, normal, - vertexColors, faceColor, - vertexTangents, - uv, uv2, v1, v2, v3, v4, t1, t2, t3, t4, n1, n2, n3, n4, - c1, c2, c3, c4, - sw1, sw2, sw3, sw4, - si1, si2, si3, si4, - sa1, sa2, sa3, sa4, - sb1, sb2, sb3, sb4, - m, ml, i, il, - vn, uvi, uv2i, - vk, vkl, vka, - nka, chf, faceVertexNormals, - a, - - vertexIndex = 0, - - offset = 0, - offset_uv = 0, - offset_uv2 = 0, - offset_face = 0, - offset_normal = 0, - offset_tangent = 0, - offset_line = 0, - offset_color = 0, - offset_skin = 0, - offset_morphTarget = 0, - offset_custom = 0, - offset_customSrc = 0, - - value, - - vertexArray = geometryGroup.__vertexArray, - uvArray = geometryGroup.__uvArray, - uv2Array = geometryGroup.__uv2Array, - normalArray = geometryGroup.__normalArray, - tangentArray = geometryGroup.__tangentArray, - colorArray = geometryGroup.__colorArray, - - skinIndexArray = geometryGroup.__skinIndexArray, - skinWeightArray = geometryGroup.__skinWeightArray, - - morphTargetsArrays = geometryGroup.__morphTargetsArrays, - morphNormalsArrays = geometryGroup.__morphNormalsArrays, - - customAttributes = geometryGroup.__webglCustomAttributesList, - customAttribute, - - faceArray = geometryGroup.__faceArray, - lineArray = geometryGroup.__lineArray, - - geometry = object.geometry, // this is shared for all chunks - - dirtyVertices = geometry.verticesNeedUpdate, - dirtyElements = geometry.elementsNeedUpdate, - dirtyUvs = geometry.uvsNeedUpdate, - dirtyNormals = geometry.normalsNeedUpdate, - dirtyTangents = geometry.tangentsNeedUpdate, - dirtyColors = geometry.colorsNeedUpdate, - dirtyMorphTargets = geometry.morphTargetsNeedUpdate, - - vertices = geometry.vertices, - chunk_faces3 = geometryGroup.faces3, - obj_faces = geometry.faces, - - obj_uvs = geometry.faceVertexUvs[ 0 ], - obj_uvs2 = geometry.faceVertexUvs[ 1 ], - - obj_colors = geometry.colors, - - obj_skinIndices = geometry.skinIndices, - obj_skinWeights = geometry.skinWeights, - - morphTargets = geometry.morphTargets, - morphNormals = geometry.morphNormals; - - if ( dirtyVertices ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - v1 = vertices[ face.a ]; - v2 = vertices[ face.b ]; - v3 = vertices[ face.c ]; - - vertexArray[ offset ] = v1.x; - vertexArray[ offset + 1 ] = v1.y; - vertexArray[ offset + 2 ] = v1.z; - - vertexArray[ offset + 3 ] = v2.x; - vertexArray[ offset + 4 ] = v2.y; - vertexArray[ offset + 5 ] = v2.z; - - vertexArray[ offset + 6 ] = v3.x; - vertexArray[ offset + 7 ] = v3.y; - vertexArray[ offset + 8 ] = v3.z; - - offset += 9; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint ); - - } - - if ( dirtyMorphTargets ) { - - for ( vk = 0, vkl = morphTargets.length; vk < vkl; vk ++ ) { - - offset_morphTarget = 0; - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - chf = chunk_faces3[ f ]; - face = obj_faces[ chf ]; - - // morph positions - - v1 = morphTargets[ vk ].vertices[ face.a ]; - v2 = morphTargets[ vk ].vertices[ face.b ]; - v3 = morphTargets[ vk ].vertices[ face.c ]; - - vka = morphTargetsArrays[ vk ]; - - vka[ offset_morphTarget ] = v1.x; - vka[ offset_morphTarget + 1 ] = v1.y; - vka[ offset_morphTarget + 2 ] = v1.z; - - vka[ offset_morphTarget + 3 ] = v2.x; - vka[ offset_morphTarget + 4 ] = v2.y; - vka[ offset_morphTarget + 5 ] = v2.z; - - vka[ offset_morphTarget + 6 ] = v3.x; - vka[ offset_morphTarget + 7 ] = v3.y; - vka[ offset_morphTarget + 8 ] = v3.z; - - // morph normals - - if ( material.morphNormals ) { - - if ( needsSmoothNormals ) { - - faceVertexNormals = morphNormals[ vk ].vertexNormals[ chf ]; - - n1 = faceVertexNormals.a; - n2 = faceVertexNormals.b; - n3 = faceVertexNormals.c; - - } else { - - n1 = morphNormals[ vk ].faceNormals[ chf ]; - n2 = n1; - n3 = n1; - - } - - nka = morphNormalsArrays[ vk ]; - - nka[ offset_morphTarget ] = n1.x; - nka[ offset_morphTarget + 1 ] = n1.y; - nka[ offset_morphTarget + 2 ] = n1.z; - - nka[ offset_morphTarget + 3 ] = n2.x; - nka[ offset_morphTarget + 4 ] = n2.y; - nka[ offset_morphTarget + 5 ] = n2.z; - - nka[ offset_morphTarget + 6 ] = n3.x; - nka[ offset_morphTarget + 7 ] = n3.y; - nka[ offset_morphTarget + 8 ] = n3.z; - - } - - // - - offset_morphTarget += 9; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ vk ] ); - _gl.bufferData( _gl.ARRAY_BUFFER, morphTargetsArrays[ vk ], hint ); - - if ( material.morphNormals ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ vk ] ); - _gl.bufferData( _gl.ARRAY_BUFFER, morphNormalsArrays[ vk ], hint ); - - } - - } - - } - - if ( obj_skinWeights.length ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - // weights - - sw1 = obj_skinWeights[ face.a ]; - sw2 = obj_skinWeights[ face.b ]; - sw3 = obj_skinWeights[ face.c ]; - - skinWeightArray[ offset_skin ] = sw1.x; - skinWeightArray[ offset_skin + 1 ] = sw1.y; - skinWeightArray[ offset_skin + 2 ] = sw1.z; - skinWeightArray[ offset_skin + 3 ] = sw1.w; - - skinWeightArray[ offset_skin + 4 ] = sw2.x; - skinWeightArray[ offset_skin + 5 ] = sw2.y; - skinWeightArray[ offset_skin + 6 ] = sw2.z; - skinWeightArray[ offset_skin + 7 ] = sw2.w; - - skinWeightArray[ offset_skin + 8 ] = sw3.x; - skinWeightArray[ offset_skin + 9 ] = sw3.y; - skinWeightArray[ offset_skin + 10 ] = sw3.z; - skinWeightArray[ offset_skin + 11 ] = sw3.w; - - // indices - - si1 = obj_skinIndices[ face.a ]; - si2 = obj_skinIndices[ face.b ]; - si3 = obj_skinIndices[ face.c ]; - - skinIndexArray[ offset_skin ] = si1.x; - skinIndexArray[ offset_skin + 1 ] = si1.y; - skinIndexArray[ offset_skin + 2 ] = si1.z; - skinIndexArray[ offset_skin + 3 ] = si1.w; - - skinIndexArray[ offset_skin + 4 ] = si2.x; - skinIndexArray[ offset_skin + 5 ] = si2.y; - skinIndexArray[ offset_skin + 6 ] = si2.z; - skinIndexArray[ offset_skin + 7 ] = si2.w; - - skinIndexArray[ offset_skin + 8 ] = si3.x; - skinIndexArray[ offset_skin + 9 ] = si3.y; - skinIndexArray[ offset_skin + 10 ] = si3.z; - skinIndexArray[ offset_skin + 11 ] = si3.w; - - offset_skin += 12; - - } - - if ( offset_skin > 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, skinIndexArray, hint ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, skinWeightArray, hint ); - - } - - } - - if ( dirtyColors && vertexColorType ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - vertexColors = face.vertexColors; - faceColor = face.color; - - if ( vertexColors.length === 3 && vertexColorType === THREE.VertexColors ) { - - c1 = vertexColors[ 0 ]; - c2 = vertexColors[ 1 ]; - c3 = vertexColors[ 2 ]; - - } else { - - c1 = faceColor; - c2 = faceColor; - c3 = faceColor; - - } - - colorArray[ offset_color ] = c1.r; - colorArray[ offset_color + 1 ] = c1.g; - colorArray[ offset_color + 2 ] = c1.b; - - colorArray[ offset_color + 3 ] = c2.r; - colorArray[ offset_color + 4 ] = c2.g; - colorArray[ offset_color + 5 ] = c2.b; - - colorArray[ offset_color + 6 ] = c3.r; - colorArray[ offset_color + 7 ] = c3.g; - colorArray[ offset_color + 8 ] = c3.b; - - offset_color += 9; - - } - - if ( offset_color > 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint ); - - } - - } - - if ( dirtyTangents && geometry.hasTangents ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - vertexTangents = face.vertexTangents; - - t1 = vertexTangents[ 0 ]; - t2 = vertexTangents[ 1 ]; - t3 = vertexTangents[ 2 ]; - - tangentArray[ offset_tangent ] = t1.x; - tangentArray[ offset_tangent + 1 ] = t1.y; - tangentArray[ offset_tangent + 2 ] = t1.z; - tangentArray[ offset_tangent + 3 ] = t1.w; - - tangentArray[ offset_tangent + 4 ] = t2.x; - tangentArray[ offset_tangent + 5 ] = t2.y; - tangentArray[ offset_tangent + 6 ] = t2.z; - tangentArray[ offset_tangent + 7 ] = t2.w; - - tangentArray[ offset_tangent + 8 ] = t3.x; - tangentArray[ offset_tangent + 9 ] = t3.y; - tangentArray[ offset_tangent + 10 ] = t3.z; - tangentArray[ offset_tangent + 11 ] = t3.w; - - offset_tangent += 12; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint ); - - } - - if ( dirtyNormals && normalType ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - vertexNormals = face.vertexNormals; - faceNormal = face.normal; - - if ( vertexNormals.length === 3 && needsSmoothNormals ) { - - for ( i = 0; i < 3; i ++ ) { - - vn = vertexNormals[ i ]; - - normalArray[ offset_normal ] = vn.x; - normalArray[ offset_normal + 1 ] = vn.y; - normalArray[ offset_normal + 2 ] = vn.z; - - offset_normal += 3; - - } - - } else { - - for ( i = 0; i < 3; i ++ ) { - - normalArray[ offset_normal ] = faceNormal.x; - normalArray[ offset_normal + 1 ] = faceNormal.y; - normalArray[ offset_normal + 2 ] = faceNormal.z; - - offset_normal += 3; - - } - - } - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint ); - - } - - if ( dirtyUvs && obj_uvs && uvType ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - fi = chunk_faces3[ f ]; - - uv = obj_uvs[ fi ]; - - if ( uv === undefined ) continue; - - for ( i = 0; i < 3; i ++ ) { - - uvi = uv[ i ]; - - uvArray[ offset_uv ] = uvi.x; - uvArray[ offset_uv + 1 ] = uvi.y; - - offset_uv += 2; - - } - - } - - if ( offset_uv > 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint ); - - } - - } - - if ( dirtyUvs && obj_uvs2 && uvType ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - fi = chunk_faces3[ f ]; - - uv2 = obj_uvs2[ fi ]; - - if ( uv2 === undefined ) continue; - - for ( i = 0; i < 3; i ++ ) { - - uv2i = uv2[ i ]; - - uv2Array[ offset_uv2 ] = uv2i.x; - uv2Array[ offset_uv2 + 1 ] = uv2i.y; - - offset_uv2 += 2; - - } - - } - - if ( offset_uv2 > 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, uv2Array, hint ); - - } - - } - - if ( dirtyElements ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - faceArray[ offset_face ] = vertexIndex; - faceArray[ offset_face + 1 ] = vertexIndex + 1; - faceArray[ offset_face + 2 ] = vertexIndex + 2; - - offset_face += 3; - - lineArray[ offset_line ] = vertexIndex; - lineArray[ offset_line + 1 ] = vertexIndex + 1; - - lineArray[ offset_line + 2 ] = vertexIndex; - lineArray[ offset_line + 3 ] = vertexIndex + 2; - - lineArray[ offset_line + 4 ] = vertexIndex + 1; - lineArray[ offset_line + 5 ] = vertexIndex + 2; - - offset_line += 6; - - vertexIndex += 3; - - } - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint ); - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( ! customAttribute.__original.needsUpdate ) continue; - - offset_custom = 0; - offset_customSrc = 0; - - if ( customAttribute.size === 1 ) { - - if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - customAttribute.array[ offset_custom ] = customAttribute.value[ face.a ]; - customAttribute.array[ offset_custom + 1 ] = customAttribute.value[ face.b ]; - customAttribute.array[ offset_custom + 2 ] = customAttribute.value[ face.c ]; - - offset_custom += 3; - - } - - } else if ( customAttribute.boundTo === "faces" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - customAttribute.array[ offset_custom ] = value; - customAttribute.array[ offset_custom + 1 ] = value; - customAttribute.array[ offset_custom + 2 ] = value; - - offset_custom += 3; - - } - - } - - } else if ( customAttribute.size === 2 ) { - - if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - v1 = customAttribute.value[ face.a ]; - v2 = customAttribute.value[ face.b ]; - v3 = customAttribute.value[ face.c ]; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - - customAttribute.array[ offset_custom + 2 ] = v2.x; - customAttribute.array[ offset_custom + 3 ] = v2.y; - - customAttribute.array[ offset_custom + 4 ] = v3.x; - customAttribute.array[ offset_custom + 5 ] = v3.y; - - offset_custom += 6; - - } - - } else if ( customAttribute.boundTo === "faces" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - v1 = value; - v2 = value; - v3 = value; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - - customAttribute.array[ offset_custom + 2 ] = v2.x; - customAttribute.array[ offset_custom + 3 ] = v2.y; - - customAttribute.array[ offset_custom + 4 ] = v3.x; - customAttribute.array[ offset_custom + 5 ] = v3.y; - - offset_custom += 6; - - } - - } - - } else if ( customAttribute.size === 3 ) { - - var pp; - - if ( customAttribute.type === "c" ) { - - pp = [ "r", "g", "b" ]; - - } else { - - pp = [ "x", "y", "z" ]; - - } - - if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - v1 = customAttribute.value[ face.a ]; - v2 = customAttribute.value[ face.b ]; - v3 = customAttribute.value[ face.c ]; - - customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ]; - - offset_custom += 9; - - } - - } else if ( customAttribute.boundTo === "faces" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - v1 = value; - v2 = value; - v3 = value; - - customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ]; - - offset_custom += 9; - - } - - } else if ( customAttribute.boundTo === "faceVertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - v1 = value[ 0 ]; - v2 = value[ 1 ]; - v3 = value[ 2 ]; - - customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ]; - - offset_custom += 9; - - } - - } - - } else if ( customAttribute.size === 4 ) { - - if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - v1 = customAttribute.value[ face.a ]; - v2 = customAttribute.value[ face.b ]; - v3 = customAttribute.value[ face.c ]; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - customAttribute.array[ offset_custom + 2 ] = v1.z; - customAttribute.array[ offset_custom + 3 ] = v1.w; - - customAttribute.array[ offset_custom + 4 ] = v2.x; - customAttribute.array[ offset_custom + 5 ] = v2.y; - customAttribute.array[ offset_custom + 6 ] = v2.z; - customAttribute.array[ offset_custom + 7 ] = v2.w; - - customAttribute.array[ offset_custom + 8 ] = v3.x; - customAttribute.array[ offset_custom + 9 ] = v3.y; - customAttribute.array[ offset_custom + 10 ] = v3.z; - customAttribute.array[ offset_custom + 11 ] = v3.w; - - offset_custom += 12; - - } - - } else if ( customAttribute.boundTo === "faces" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - v1 = value; - v2 = value; - v3 = value; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - customAttribute.array[ offset_custom + 2 ] = v1.z; - customAttribute.array[ offset_custom + 3 ] = v1.w; - - customAttribute.array[ offset_custom + 4 ] = v2.x; - customAttribute.array[ offset_custom + 5 ] = v2.y; - customAttribute.array[ offset_custom + 6 ] = v2.z; - customAttribute.array[ offset_custom + 7 ] = v2.w; - - customAttribute.array[ offset_custom + 8 ] = v3.x; - customAttribute.array[ offset_custom + 9 ] = v3.y; - customAttribute.array[ offset_custom + 10 ] = v3.z; - customAttribute.array[ offset_custom + 11 ] = v3.w; - - offset_custom += 12; - - } - - } else if ( customAttribute.boundTo === "faceVertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - v1 = value[ 0 ]; - v2 = value[ 1 ]; - v3 = value[ 2 ]; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - customAttribute.array[ offset_custom + 2 ] = v1.z; - customAttribute.array[ offset_custom + 3 ] = v1.w; - - customAttribute.array[ offset_custom + 4 ] = v2.x; - customAttribute.array[ offset_custom + 5 ] = v2.y; - customAttribute.array[ offset_custom + 6 ] = v2.z; - customAttribute.array[ offset_custom + 7 ] = v2.w; - - customAttribute.array[ offset_custom + 8 ] = v3.x; - customAttribute.array[ offset_custom + 9 ] = v3.y; - customAttribute.array[ offset_custom + 10 ] = v3.z; - customAttribute.array[ offset_custom + 11 ] = v3.w; - - offset_custom += 12; - - } - - } - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint ); - - } - - } - - if ( dispose ) { - - delete geometryGroup.__inittedArrays; - delete geometryGroup.__colorArray; - delete geometryGroup.__normalArray; - delete geometryGroup.__tangentArray; - delete geometryGroup.__uvArray; - delete geometryGroup.__uv2Array; - delete geometryGroup.__faceArray; - delete geometryGroup.__vertexArray; - delete geometryGroup.__lineArray; - delete geometryGroup.__skinIndexArray; - delete geometryGroup.__skinWeightArray; - - } - - }; - - // used by renderBufferDirect for THREE.Line - function setupLinesVertexAttributes( material, programAttributes, geometryAttributes, startIndex ) { - - var attributeItem, attributeName, attributePointer, attributeSize; - - for ( attributeName in programAttributes ) { - - attributePointer = programAttributes[ attributeName ]; - attributeItem = geometryAttributes[ attributeName ]; - - if ( attributePointer >= 0 ) { - - if ( attributeItem ) { - - attributeSize = attributeItem.itemSize; - _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer ); - enableAttribute( attributePointer ); - _gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, startIndex * attributeSize * 4 ); // 4 bytes per Float32 - - } else if ( material.defaultAttributeValues ) { - - if ( material.defaultAttributeValues[ attributeName ].length === 2 ) { - - _gl.vertexAttrib2fv( attributePointer, material.defaultAttributeValues[ attributeName ] ); - - } else if ( material.defaultAttributeValues[ attributeName ].length === 3 ) { - - _gl.vertexAttrib3fv( attributePointer, material.defaultAttributeValues[ attributeName ] ); - - } - - } - - } - - } - - } - - function setDirectBuffers( geometry, hint ) { - - var attributes = geometry.attributes; - - var attributeName, attributeItem; - - for ( attributeName in attributes ) { - - attributeItem = attributes[ attributeName ]; - - if ( attributeItem.needsUpdate ) { - - if ( attributeName === 'index' ) { - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.buffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.array, hint ); - - } else { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, attributeItem.array, hint ); - - } - - attributeItem.needsUpdate = false; - - } - - } - - } - - // Buffer rendering - - this.renderBufferImmediate = function ( object, program, material ) { - - if ( object.hasPositions && ! object.__webglVertexBuffer ) object.__webglVertexBuffer = _gl.createBuffer(); - if ( object.hasNormals && ! object.__webglNormalBuffer ) object.__webglNormalBuffer = _gl.createBuffer(); - if ( object.hasUvs && ! object.__webglUvBuffer ) object.__webglUvBuffer = _gl.createBuffer(); - if ( object.hasColors && ! object.__webglColorBuffer ) object.__webglColorBuffer = _gl.createBuffer(); - - if ( object.hasPositions ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); - _gl.enableVertexAttribArray( program.attributes.position ); - _gl.vertexAttribPointer( program.attributes.position, 3, _gl.FLOAT, false, 0, 0 ); - - } - - if ( object.hasNormals ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglNormalBuffer ); - - if ( material.shading === THREE.FlatShading ) { - - var nx, ny, nz, - nax, nbx, ncx, nay, nby, ncy, naz, nbz, ncz, - normalArray, - i, il = object.count * 3; - - for( i = 0; i < il; i += 9 ) { - - normalArray = object.normalArray; - - nax = normalArray[ i ]; - nay = normalArray[ i + 1 ]; - naz = normalArray[ i + 2 ]; - - nbx = normalArray[ i + 3 ]; - nby = normalArray[ i + 4 ]; - nbz = normalArray[ i + 5 ]; - - ncx = normalArray[ i + 6 ]; - ncy = normalArray[ i + 7 ]; - ncz = normalArray[ i + 8 ]; - - nx = ( nax + nbx + ncx ) / 3; - ny = ( nay + nby + ncy ) / 3; - nz = ( naz + nbz + ncz ) / 3; - - normalArray[ i ] = nx; - normalArray[ i + 1 ] = ny; - normalArray[ i + 2 ] = nz; - - normalArray[ i + 3 ] = nx; - normalArray[ i + 4 ] = ny; - normalArray[ i + 5 ] = nz; - - normalArray[ i + 6 ] = nx; - normalArray[ i + 7 ] = ny; - normalArray[ i + 8 ] = nz; - - } - - } - - _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); - _gl.enableVertexAttribArray( program.attributes.normal ); - _gl.vertexAttribPointer( program.attributes.normal, 3, _gl.FLOAT, false, 0, 0 ); - - } - - if ( object.hasUvs && material.map ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglUvBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); - _gl.enableVertexAttribArray( program.attributes.uv ); - _gl.vertexAttribPointer( program.attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); - - } - - if ( object.hasColors && material.vertexColors !== THREE.NoColors ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglColorBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); - _gl.enableVertexAttribArray( program.attributes.color ); - _gl.vertexAttribPointer( program.attributes.color, 3, _gl.FLOAT, false, 0, 0 ); - - } - - _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); - - object.count = 0; - - }; - - this.renderBufferDirect = function ( camera, lights, fog, material, geometry, object ) { - - if ( material.visible === false ) return; - - var linewidth, a, attribute; - var attributeItem, attributeName, attributePointer, attributeSize; - - var program = setProgram( camera, lights, fog, material, object ); - - var programAttributes = program.attributes; - var geometryAttributes = geometry.attributes; - - var updateBuffers = false, - wireframeBit = material.wireframe ? 1 : 0, - geometryHash = ( geometry.id * 0xffffff ) + ( program.id * 2 ) + wireframeBit; - - if ( geometryHash !== _currentGeometryGroupHash ) { - - _currentGeometryGroupHash = geometryHash; - updateBuffers = true; - - } - - if ( updateBuffers ) { - - disableAttributes(); - - } - - // render mesh - - if ( object instanceof THREE.Mesh ) { - - var index = geometryAttributes[ "index" ]; - - // indexed triangles - - if ( index ) { - - var offsets = geometry.offsets; - - // if there is more than 1 chunk - // must set attribute pointers to use new offsets for each chunk - // even if geometry and materials didn't change - - if ( offsets.length > 1 ) updateBuffers = true; - - for ( var i = 0, il = offsets.length; i < il; i ++ ) { - - var startIndex = offsets[ i ].index; - - if ( updateBuffers ) { - - for ( attributeName in programAttributes ) { - - attributePointer = programAttributes[ attributeName ]; - attributeItem = geometryAttributes[ attributeName ]; - - if ( attributePointer >= 0 ) { - - if ( attributeItem ) { - - attributeSize = attributeItem.itemSize; - _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer ); - enableAttribute( attributePointer ); - _gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, startIndex * attributeSize * 4 ); // 4 bytes per Float32 - - } else if ( material.defaultAttributeValues ) { - - if ( material.defaultAttributeValues[ attributeName ].length === 2 ) { - - _gl.vertexAttrib2fv( attributePointer, material.defaultAttributeValues[ attributeName ] ); - - } else if ( material.defaultAttributeValues[ attributeName ].length === 3 ) { - - _gl.vertexAttrib3fv( attributePointer, material.defaultAttributeValues[ attributeName ] ); - - } - - } - - } - - } - - // indices - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer ); - - } - - // render indexed triangles - - _gl.drawElements( _gl.TRIANGLES, offsets[ i ].count, _gl.UNSIGNED_SHORT, offsets[ i ].start * 2 ); // 2 bytes per Uint16 - - _this.info.render.calls ++; - _this.info.render.vertices += offsets[ i ].count; // not really true, here vertices can be shared - _this.info.render.faces += offsets[ i ].count / 3; - - } - - // non-indexed triangles - - } else { - - if ( updateBuffers ) { - - for ( attributeName in programAttributes ) { - - if ( attributeName === 'index') continue; - - attributePointer = programAttributes[ attributeName ]; - attributeItem = geometryAttributes[ attributeName ]; - - if ( attributePointer >= 0 ) { - - if ( attributeItem ) { - - attributeSize = attributeItem.itemSize; - _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer ); - enableAttribute( attributePointer ); - _gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, 0 ); - - } else if ( material.defaultAttributeValues && material.defaultAttributeValues[ attributeName ] ) { - - if ( material.defaultAttributeValues[ attributeName ].length === 2 ) { - - _gl.vertexAttrib2fv( attributePointer, material.defaultAttributeValues[ attributeName ] ); - - } else if ( material.defaultAttributeValues[ attributeName ].length === 3 ) { - - _gl.vertexAttrib3fv( attributePointer, material.defaultAttributeValues[ attributeName ] ); - - } - - } - - } - - } - - } - - var position = geometry.attributes[ "position" ]; - - // render non-indexed triangles - - _gl.drawArrays( _gl.TRIANGLES, 0, position.array.length / 3 ); - - _this.info.render.calls ++; - _this.info.render.vertices += position.array.length / 3; - _this.info.render.faces += position.array.length / 3 / 3; - - } - - // render particles - - } else if ( object instanceof THREE.ParticleSystem ) { - - if ( updateBuffers ) { - - for ( attributeName in programAttributes ) { - - attributePointer = programAttributes[ attributeName ]; - attributeItem = geometryAttributes[ attributeName ]; - - if ( attributePointer >= 0 ) { - - if ( attributeItem ) { - - attributeSize = attributeItem.itemSize; - _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer ); - enableAttribute( attributePointer ); - _gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, 0 ); - - } else if ( material.defaultAttributeValues && material.defaultAttributeValues[ attributeName ] ) { - - if ( material.defaultAttributeValues[ attributeName ].length === 2 ) { - - _gl.vertexAttrib2fv( attributePointer, material.defaultAttributeValues[ attributeName ] ); - - } else if ( material.defaultAttributeValues[ attributeName ].length === 3 ) { - - _gl.vertexAttrib3fv( attributePointer, material.defaultAttributeValues[ attributeName ] ); - - } - - } - - } - - } - - } - - var position = geometryAttributes[ "position" ]; - - // render particles - - _gl.drawArrays( _gl.POINTS, 0, position.array.length / 3 ); - - _this.info.render.calls ++; - _this.info.render.points += position.array.length / 3; - - } else if ( object instanceof THREE.Line ) { - - var primitives = ( object.type === THREE.LineStrip ) ? _gl.LINE_STRIP : _gl.LINES; - - setLineWidth( material.linewidth ); - - var index = geometryAttributes[ "index" ]; - - // indexed lines - - if ( index ) { - - var offsets = geometry.offsets; - - // if there is more than 1 chunk - // must set attribute pointers to use new offsets for each chunk - // even if geometry and materials didn't change - - if ( offsets.length > 1 ) updateBuffers = true; - - for ( var i = 0, il = offsets.length; i < il; i ++ ) { - - var startIndex = offsets[ i ].index; - - if ( updateBuffers ) { - - setupLinesVertexAttributes(material, programAttributes, geometryAttributes, startIndex); - - // indices - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer ); - - } - - // render indexed lines - - _gl.drawElements( _gl.LINES, offsets[ i ].count, _gl.UNSIGNED_SHORT, offsets[ i ].start * 2 ); // 2 bytes per Uint16Array - - _this.info.render.calls ++; - _this.info.render.vertices += offsets[ i ].count; // not really true, here vertices can be shared - - } - - } - - // non-indexed lines - - else { - - if ( updateBuffers ) { - - setupLinesVertexAttributes(material, programAttributes, geometryAttributes, 0); - } - - var position = geometryAttributes[ "position" ]; - - _gl.drawArrays( primitives, 0, position.array.length / 3 ); - _this.info.render.calls ++; - _this.info.render.points += position.array.length; - } - - - - } - - }; - - this.renderBuffer = function ( camera, lights, fog, material, geometryGroup, object ) { - - if ( material.visible === false ) return; - - var linewidth, a, attribute, i, il; - - var program = setProgram( camera, lights, fog, material, object ); - - var attributes = program.attributes; - - var updateBuffers = false, - wireframeBit = material.wireframe ? 1 : 0, - geometryGroupHash = ( geometryGroup.id * 0xffffff ) + ( program.id * 2 ) + wireframeBit; - - if ( geometryGroupHash !== _currentGeometryGroupHash ) { - - _currentGeometryGroupHash = geometryGroupHash; - updateBuffers = true; - - } - - if ( updateBuffers ) { - - disableAttributes(); - - } - - // vertices - - if ( !material.morphTargets && attributes.position >= 0 ) { - - if ( updateBuffers ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer ); - enableAttribute( attributes.position ); - _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); - - } - - } else { - - if ( object.morphTargetBase ) { - - setupMorphTargets( material, geometryGroup, object ); - - } - - } - - - if ( updateBuffers ) { - - // custom attributes - - // Use the per-geometryGroup custom attribute arrays which are setup in initMeshBuffers - - if ( geometryGroup.__webglCustomAttributesList ) { - - for ( i = 0, il = geometryGroup.__webglCustomAttributesList.length; i < il; i ++ ) { - - attribute = geometryGroup.__webglCustomAttributesList[ i ]; - - if ( attributes[ attribute.buffer.belongsToAttribute ] >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, attribute.buffer ); - enableAttribute( attributes[ attribute.buffer.belongsToAttribute ] ); - _gl.vertexAttribPointer( attributes[ attribute.buffer.belongsToAttribute ], attribute.size, _gl.FLOAT, false, 0, 0 ); - - } - - } - - } - - - // colors - - if ( attributes.color >= 0 ) { - - if ( object.geometry.colors.length > 0 || object.geometry.faces.length > 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer ); - enableAttribute( attributes.color ); - _gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 ); - - } else if ( material.defaultAttributeValues ) { - - - _gl.vertexAttrib3fv( attributes.color, material.defaultAttributeValues.color ); - - } - - } - - // normals - - if ( attributes.normal >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer ); - enableAttribute( attributes.normal ); - _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 ); - - } - - // tangents - - if ( attributes.tangent >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer ); - enableAttribute( attributes.tangent ); - _gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 ); - - } - - // uvs - - if ( attributes.uv >= 0 ) { - - if ( object.geometry.faceVertexUvs[0] ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer ); - enableAttribute( attributes.uv ); - _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); - - } else if ( material.defaultAttributeValues ) { - - - _gl.vertexAttrib2fv( attributes.uv, material.defaultAttributeValues.uv ); - - } - - } - - if ( attributes.uv2 >= 0 ) { - - if ( object.geometry.faceVertexUvs[1] ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer ); - enableAttribute( attributes.uv2 ); - _gl.vertexAttribPointer( attributes.uv2, 2, _gl.FLOAT, false, 0, 0 ); - - } else if ( material.defaultAttributeValues ) { - - - _gl.vertexAttrib2fv( attributes.uv2, material.defaultAttributeValues.uv2 ); - - } - - } - - if ( material.skinning && - attributes.skinIndex >= 0 && attributes.skinWeight >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer ); - enableAttribute( attributes.skinIndex ); - _gl.vertexAttribPointer( attributes.skinIndex, 4, _gl.FLOAT, false, 0, 0 ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer ); - enableAttribute( attributes.skinWeight ); - _gl.vertexAttribPointer( attributes.skinWeight, 4, _gl.FLOAT, false, 0, 0 ); - - } - - // line distances - - if ( attributes.lineDistance >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglLineDistanceBuffer ); - enableAttribute( attributes.lineDistance ); - _gl.vertexAttribPointer( attributes.lineDistance, 1, _gl.FLOAT, false, 0, 0 ); - - } - - } - - // render mesh - - if ( object instanceof THREE.Mesh ) { - - // wireframe - - if ( material.wireframe ) { - - setLineWidth( material.wireframeLinewidth ); - - if ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer ); - _gl.drawElements( _gl.LINES, geometryGroup.__webglLineCount, _gl.UNSIGNED_SHORT, 0 ); - - // triangles - - } else { - - if ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer ); - _gl.drawElements( _gl.TRIANGLES, geometryGroup.__webglFaceCount, _gl.UNSIGNED_SHORT, 0 ); - - } - - _this.info.render.calls ++; - _this.info.render.vertices += geometryGroup.__webglFaceCount; - _this.info.render.faces += geometryGroup.__webglFaceCount / 3; - - // render lines - - } else if ( object instanceof THREE.Line ) { - - var primitives = ( object.type === THREE.LineStrip ) ? _gl.LINE_STRIP : _gl.LINES; - - setLineWidth( material.linewidth ); - - _gl.drawArrays( primitives, 0, geometryGroup.__webglLineCount ); - - _this.info.render.calls ++; - - // render particles - - } else if ( object instanceof THREE.ParticleSystem ) { - - _gl.drawArrays( _gl.POINTS, 0, geometryGroup.__webglParticleCount ); - - _this.info.render.calls ++; - _this.info.render.points += geometryGroup.__webglParticleCount; - - } - - }; - - function enableAttribute( attribute ) { - - if ( _enabledAttributes[ attribute ] === 0 ) { - - _gl.enableVertexAttribArray( attribute ); - _enabledAttributes[ attribute ] = 1; - - } - - }; - - function disableAttributes() { - - for ( var attribute in _enabledAttributes ) { - - if ( _enabledAttributes[ attribute ] === 1 ) { - - _gl.disableVertexAttribArray( attribute ); - _enabledAttributes[ attribute ] = 0; - - } - - } - - }; - - function setupMorphTargets ( material, geometryGroup, object ) { - - // set base - - var attributes = material.program.attributes; - - if ( object.morphTargetBase !== -1 && attributes.position >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ object.morphTargetBase ] ); - enableAttribute( attributes.position ); - _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); - - } else if ( attributes.position >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer ); - enableAttribute( attributes.position ); - _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); - - } - - if ( object.morphTargetForcedOrder.length ) { - - // set forced order - - var m = 0; - var order = object.morphTargetForcedOrder; - var influences = object.morphTargetInfluences; - - while ( m < material.numSupportedMorphTargets && m < order.length ) { - - if ( attributes[ "morphTarget" + m ] >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ order[ m ] ] ); - enableAttribute( attributes[ "morphTarget" + m ] ); - _gl.vertexAttribPointer( attributes[ "morphTarget" + m ], 3, _gl.FLOAT, false, 0, 0 ); - - } - - if ( attributes[ "morphNormal" + m ] >= 0 && material.morphNormals ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ order[ m ] ] ); - enableAttribute( attributes[ "morphNormal" + m ] ); - _gl.vertexAttribPointer( attributes[ "morphNormal" + m ], 3, _gl.FLOAT, false, 0, 0 ); - - } - - object.__webglMorphTargetInfluences[ m ] = influences[ order[ m ] ]; - - m ++; - } - - } else { - - // find the most influencing - - var influence, activeInfluenceIndices = []; - var influences = object.morphTargetInfluences; - var i, il = influences.length; - - for ( i = 0; i < il; i ++ ) { - - influence = influences[ i ]; - - if ( influence > 0 ) { - - activeInfluenceIndices.push( [ influence, i ] ); - - } - - } - - if ( activeInfluenceIndices.length > material.numSupportedMorphTargets ) { - - activeInfluenceIndices.sort( numericalSort ); - activeInfluenceIndices.length = material.numSupportedMorphTargets; - - } else if ( activeInfluenceIndices.length > material.numSupportedMorphNormals ) { - - activeInfluenceIndices.sort( numericalSort ); - - } else if ( activeInfluenceIndices.length === 0 ) { - - activeInfluenceIndices.push( [ 0, 0 ] ); - - }; - - var influenceIndex, m = 0; - - while ( m < material.numSupportedMorphTargets ) { - - if ( activeInfluenceIndices[ m ] ) { - - influenceIndex = activeInfluenceIndices[ m ][ 1 ]; - - if ( attributes[ "morphTarget" + m ] >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ influenceIndex ] ); - enableAttribute( attributes[ "morphTarget" + m ] ); - _gl.vertexAttribPointer( attributes[ "morphTarget" + m ], 3, _gl.FLOAT, false, 0, 0 ); - - } - - if ( attributes[ "morphNormal" + m ] >= 0 && material.morphNormals ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ influenceIndex ] ); - enableAttribute( attributes[ "morphNormal" + m ] ); - _gl.vertexAttribPointer( attributes[ "morphNormal" + m ], 3, _gl.FLOAT, false, 0, 0 ); - - - } - - object.__webglMorphTargetInfluences[ m ] = influences[ influenceIndex ]; - - } else { - - /* - _gl.vertexAttribPointer( attributes[ "morphTarget" + m ], 3, _gl.FLOAT, false, 0, 0 ); - - if ( material.morphNormals ) { - - _gl.vertexAttribPointer( attributes[ "morphNormal" + m ], 3, _gl.FLOAT, false, 0, 0 ); - - } - */ - - object.__webglMorphTargetInfluences[ m ] = 0; - - } - - m ++; - - } - - } - - // load updated influences uniform - - if ( material.program.uniforms.morphTargetInfluences !== null ) { - - _gl.uniform1fv( material.program.uniforms.morphTargetInfluences, object.__webglMorphTargetInfluences ); - - } - - }; - - // Sorting - - function painterSortStable ( a, b ) { - - if ( a.z !== b.z ) { - - return b.z - a.z; - - } else { - - return a.id - b.id; - - } - - }; - - function numericalSort ( a, b ) { - - return b[ 0 ] - a[ 0 ]; - - }; - - - // Rendering - - this.render = function ( scene, camera, renderTarget, forceClear ) { - - if ( camera instanceof THREE.Camera === false ) { - - console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); - return; - - } - - var i, il, - - webglObject, object, - renderList, - - lights = scene.__lights, - fog = scene.fog; - - // reset caching for this frame - - _currentMaterialId = -1; - _lightsNeedUpdate = true; - - // update scene graph - - if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); - - // update camera matrices and frustum - - if ( camera.parent === undefined ) camera.updateMatrixWorld(); - - camera.matrixWorldInverse.getInverse( camera.matrixWorld ); - - _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); - _frustum.setFromMatrix( _projScreenMatrix ); - - // update WebGL objects - - if ( this.autoUpdateObjects ) this.initWebGLObjects( scene ); - - // custom render plugins (pre pass) - - renderPlugins( this.renderPluginsPre, scene, camera ); - - // - - _this.info.render.calls = 0; - _this.info.render.vertices = 0; - _this.info.render.faces = 0; - _this.info.render.points = 0; - - this.setRenderTarget( renderTarget ); - - if ( this.autoClear || forceClear ) { - - this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); - - } - - // set matrices for regular objects (frustum culled) - - renderList = scene.__webglObjects; - - for ( i = 0, il = renderList.length; i < il; i ++ ) { - - webglObject = renderList[ i ]; - object = webglObject.object; - - webglObject.id = i; - webglObject.render = false; - - if ( object.visible ) { - - if ( ! ( object instanceof THREE.Mesh || object instanceof THREE.ParticleSystem ) || ! ( object.frustumCulled ) || _frustum.intersectsObject( object ) ) { - - setupMatrices( object, camera ); - - unrollBufferMaterial( webglObject ); - - webglObject.render = true; - - if ( this.sortObjects === true ) { - - if ( object.renderDepth !== null ) { - - webglObject.z = object.renderDepth; - - } else { - - _vector3.setFromMatrixPosition( object.matrixWorld ); - _vector3.applyProjection( _projScreenMatrix ); - - webglObject.z = _vector3.z; - - } - - } - - } - - } - - } - - if ( this.sortObjects ) { - - renderList.sort( painterSortStable ); - - } - - // set matrices for immediate objects - - renderList = scene.__webglObjectsImmediate; - - for ( i = 0, il = renderList.length; i < il; i ++ ) { - - webglObject = renderList[ i ]; - object = webglObject.object; - - if ( object.visible ) { - - setupMatrices( object, camera ); - - unrollImmediateBufferMaterial( webglObject ); - - } - - } - - if ( scene.overrideMaterial ) { - - var material = scene.overrideMaterial; - - this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); - this.setDepthTest( material.depthTest ); - this.setDepthWrite( material.depthWrite ); - setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); - - renderObjects( scene.__webglObjects, false, "", camera, lights, fog, true, material ); - renderObjectsImmediate( scene.__webglObjectsImmediate, "", camera, lights, fog, false, material ); - - } else { - - var material = null; - - // opaque pass (front-to-back order) - - this.setBlending( THREE.NoBlending ); - - renderObjects( scene.__webglObjects, true, "opaque", camera, lights, fog, false, material ); - renderObjectsImmediate( scene.__webglObjectsImmediate, "opaque", camera, lights, fog, false, material ); - - // transparent pass (back-to-front order) - - renderObjects( scene.__webglObjects, false, "transparent", camera, lights, fog, true, material ); - renderObjectsImmediate( scene.__webglObjectsImmediate, "transparent", camera, lights, fog, true, material ); - - } - - // custom render plugins (post pass) - - renderPlugins( this.renderPluginsPost, scene, camera ); - - - // Generate mipmap if we're using any kind of mipmap filtering - - if ( renderTarget && renderTarget.generateMipmaps && renderTarget.minFilter !== THREE.NearestFilter && renderTarget.minFilter !== THREE.LinearFilter ) { - - updateRenderTargetMipmap( renderTarget ); - - } - - // Ensure depth buffer writing is enabled so it can be cleared on next render - - this.setDepthTest( true ); - this.setDepthWrite( true ); - - // _gl.finish(); - - }; - - function renderPlugins( plugins, scene, camera ) { - - if ( ! plugins.length ) return; - - for ( var i = 0, il = plugins.length; i < il; i ++ ) { - - // reset state for plugin (to start from clean slate) - - _currentProgram = null; - _currentCamera = null; - - _oldBlending = -1; - _oldDepthTest = -1; - _oldDepthWrite = -1; - _oldDoubleSided = -1; - _oldFlipSided = -1; - _currentGeometryGroupHash = -1; - _currentMaterialId = -1; - - _lightsNeedUpdate = true; - - plugins[ i ].render( scene, camera, _currentWidth, _currentHeight ); - - // reset state after plugin (anything could have changed) - - _currentProgram = null; - _currentCamera = null; - - _oldBlending = -1; - _oldDepthTest = -1; - _oldDepthWrite = -1; - _oldDoubleSided = -1; - _oldFlipSided = -1; - _currentGeometryGroupHash = -1; - _currentMaterialId = -1; - - _lightsNeedUpdate = true; - - } - - }; - - function renderObjects( renderList, reverse, materialType, camera, lights, fog, useBlending, overrideMaterial ) { - - var webglObject, object, buffer, material, start, end, delta; - - if ( reverse ) { - - start = renderList.length - 1; - end = -1; - delta = -1; - - } else { - - start = 0; - end = renderList.length; - delta = 1; - } - - for ( var i = start; i !== end; i += delta ) { - - webglObject = renderList[ i ]; - - if ( webglObject.render ) { - - object = webglObject.object; - buffer = webglObject.buffer; - - if ( overrideMaterial ) { - - material = overrideMaterial; - - } else { - - material = webglObject[ materialType ]; - - if ( ! material ) continue; - - if ( useBlending ) _this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); - - _this.setDepthTest( material.depthTest ); - _this.setDepthWrite( material.depthWrite ); - setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); - - } - - _this.setMaterialFaces( material ); - - if ( buffer instanceof THREE.BufferGeometry ) { - - _this.renderBufferDirect( camera, lights, fog, material, buffer, object ); - - } else { - - _this.renderBuffer( camera, lights, fog, material, buffer, object ); - - } - - } - - } - - }; - - function renderObjectsImmediate ( renderList, materialType, camera, lights, fog, useBlending, overrideMaterial ) { - - var webglObject, object, material, program; - - for ( var i = 0, il = renderList.length; i < il; i ++ ) { - - webglObject = renderList[ i ]; - object = webglObject.object; - - if ( object.visible ) { - - if ( overrideMaterial ) { - - material = overrideMaterial; - - } else { - - material = webglObject[ materialType ]; - - if ( ! material ) continue; - - if ( useBlending ) _this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); - - _this.setDepthTest( material.depthTest ); - _this.setDepthWrite( material.depthWrite ); - setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); - - } - - _this.renderImmediateObject( camera, lights, fog, material, object ); - - } - - } - - }; - - this.renderImmediateObject = function ( camera, lights, fog, material, object ) { - - var program = setProgram( camera, lights, fog, material, object ); - - _currentGeometryGroupHash = -1; - - _this.setMaterialFaces( material ); - - if ( object.immediateRenderCallback ) { - - object.immediateRenderCallback( program, _gl, _frustum ); - - } else { - - object.render( function( object ) { _this.renderBufferImmediate( object, program, material ); } ); - - } - - }; - - function unrollImmediateBufferMaterial ( globject ) { - - var object = globject.object, - material = object.material; - - if ( material.transparent ) { - - globject.transparent = material; - globject.opaque = null; - - } else { - - globject.opaque = material; - globject.transparent = null; - - } - - }; - - function unrollBufferMaterial ( globject ) { - - var object = globject.object; - var buffer = globject.buffer; - - var geometry = object.geometry; - var material = object.material; - - if ( material instanceof THREE.MeshFaceMaterial ) { - - var materialIndex = geometry instanceof THREE.BufferGeometry ? 0 : buffer.materialIndex; - - material = material.materials[ materialIndex ]; - - if ( material.transparent ) { - - globject.transparent = material; - globject.opaque = null; - - } else { - - globject.opaque = material; - globject.transparent = null; - - } - - } else { - - if ( material ) { - - if ( material.transparent ) { - - globject.transparent = material; - globject.opaque = null; - - } else { - - globject.opaque = material; - globject.transparent = null; - - } - - } - - } - - }; - - // Objects refresh - - this.initWebGLObjects = function ( scene ) { - - if ( !scene.__webglObjects ) { - - scene.__webglObjects = []; - scene.__webglObjectsImmediate = []; - scene.__webglSprites = []; - scene.__webglFlares = []; - - } - - while ( scene.__objectsAdded.length ) { - - addObject( scene.__objectsAdded[ 0 ], scene ); - scene.__objectsAdded.splice( 0, 1 ); - - } - - while ( scene.__objectsRemoved.length ) { - - removeObject( scene.__objectsRemoved[ 0 ], scene ); - scene.__objectsRemoved.splice( 0, 1 ); - - } - - // update must be called after objects adding / removal - - for ( var o = 0, ol = scene.__webglObjects.length; o < ol; o ++ ) { - - var object = scene.__webglObjects[ o ].object; - - // TODO: Remove this hack (WebGLRenderer refactoring) - - if ( object.__webglInit === undefined ) { - - if ( object.__webglActive !== undefined ) { - - removeObject( object, scene ); - - } - - addObject( object, scene ); - - } - - updateObject( object ); - - } - - }; - - // Objects adding - - function addObject( object, scene ) { - - var g, geometry, material, geometryGroup; - - if ( object.__webglInit === undefined ) { - - object.__webglInit = true; - - object._modelViewMatrix = new THREE.Matrix4(); - object._normalMatrix = new THREE.Matrix3(); - - if ( object.geometry !== undefined && object.geometry.__webglInit === undefined ) { - - object.geometry.__webglInit = true; - object.geometry.addEventListener( 'dispose', onGeometryDispose ); - - } - - geometry = object.geometry; - - if ( geometry === undefined ) { - - // fail silently for now - - } else if ( geometry instanceof THREE.BufferGeometry ) { - - initDirectBuffers( geometry ); - - } else if ( object instanceof THREE.Mesh ) { - - material = object.material; - - if ( geometry.geometryGroups === undefined ) { - - geometry.makeGroups( material instanceof THREE.MeshFaceMaterial ); - - } - - // create separate VBOs per geometry chunk - - for ( g in geometry.geometryGroups ) { - - geometryGroup = geometry.geometryGroups[ g ]; - - // initialise VBO on the first access - - if ( ! geometryGroup.__webglVertexBuffer ) { - - createMeshBuffers( geometryGroup ); - initMeshBuffers( geometryGroup, object ); - - geometry.verticesNeedUpdate = true; - geometry.morphTargetsNeedUpdate = true; - geometry.elementsNeedUpdate = true; - geometry.uvsNeedUpdate = true; - geometry.normalsNeedUpdate = true; - geometry.tangentsNeedUpdate = true; - geometry.colorsNeedUpdate = true; - - } - - } - - } else if ( object instanceof THREE.Line ) { - - if ( ! geometry.__webglVertexBuffer ) { - - createLineBuffers( geometry ); - initLineBuffers( geometry, object ); - - geometry.verticesNeedUpdate = true; - geometry.colorsNeedUpdate = true; - geometry.lineDistancesNeedUpdate = true; - - } - - } else if ( object instanceof THREE.ParticleSystem ) { - - if ( ! geometry.__webglVertexBuffer ) { - - createParticleBuffers( geometry ); - initParticleBuffers( geometry, object ); - - geometry.verticesNeedUpdate = true; - geometry.colorsNeedUpdate = true; - - } - - } - - } - - if ( object.__webglActive === undefined ) { - - if ( object instanceof THREE.Mesh ) { - - geometry = object.geometry; - - if ( geometry instanceof THREE.BufferGeometry ) { - - addBuffer( scene.__webglObjects, geometry, object ); - - } else if ( geometry instanceof THREE.Geometry ) { - - for ( g in geometry.geometryGroups ) { - - geometryGroup = geometry.geometryGroups[ g ]; - - addBuffer( scene.__webglObjects, geometryGroup, object ); - - } - - } - - } else if ( object instanceof THREE.Line || - object instanceof THREE.ParticleSystem ) { - - geometry = object.geometry; - addBuffer( scene.__webglObjects, geometry, object ); - - } else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) { - - addBufferImmediate( scene.__webglObjectsImmediate, object ); - - } else if ( object instanceof THREE.Sprite ) { - - scene.__webglSprites.push( object ); - - } else if ( object instanceof THREE.LensFlare ) { - - scene.__webglFlares.push( object ); - - } - - object.__webglActive = true; - - } - - }; - - function addBuffer( objlist, buffer, object ) { - - objlist.push( - { - id: null, - buffer: buffer, - object: object, - opaque: null, - transparent: null, - z: 0 - } - ); - - }; - - function addBufferImmediate( objlist, object ) { - - objlist.push( - { - id: null, - object: object, - opaque: null, - transparent: null, - z: 0 - } - ); - - }; - - // Objects updates - - function updateObject( object ) { - - var geometry = object.geometry, - geometryGroup, customAttributesDirty, material; - - if ( geometry instanceof THREE.BufferGeometry ) { - - setDirectBuffers( geometry, _gl.DYNAMIC_DRAW ); - - } else if ( object instanceof THREE.Mesh ) { - - // check all geometry groups - - for( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) { - - geometryGroup = geometry.geometryGroupsList[ i ]; - - material = getBufferMaterial( object, geometryGroup ); - - if ( geometry.buffersNeedUpdate ) { - - initMeshBuffers( geometryGroup, object ); - - } - - customAttributesDirty = material.attributes && areCustomAttributesDirty( material ); - - if ( geometry.verticesNeedUpdate || geometry.morphTargetsNeedUpdate || geometry.elementsNeedUpdate || - geometry.uvsNeedUpdate || geometry.normalsNeedUpdate || - geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate || customAttributesDirty ) { - - setMeshBuffers( geometryGroup, object, _gl.DYNAMIC_DRAW, !geometry.dynamic, material ); - - } - - } - - geometry.verticesNeedUpdate = false; - geometry.morphTargetsNeedUpdate = false; - geometry.elementsNeedUpdate = false; - geometry.uvsNeedUpdate = false; - geometry.normalsNeedUpdate = false; - geometry.colorsNeedUpdate = false; - geometry.tangentsNeedUpdate = false; - - geometry.buffersNeedUpdate = false; - - material.attributes && clearCustomAttributes( material ); - - } else if ( object instanceof THREE.Line ) { - - material = getBufferMaterial( object, geometry ); - - customAttributesDirty = material.attributes && areCustomAttributesDirty( material ); - - if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || geometry.lineDistancesNeedUpdate || customAttributesDirty ) { - - setLineBuffers( geometry, _gl.DYNAMIC_DRAW ); - - } - - geometry.verticesNeedUpdate = false; - geometry.colorsNeedUpdate = false; - geometry.lineDistancesNeedUpdate = false; - - material.attributes && clearCustomAttributes( material ); - - - } else if ( object instanceof THREE.ParticleSystem ) { - - material = getBufferMaterial( object, geometry ); - - customAttributesDirty = material.attributes && areCustomAttributesDirty( material ); - - if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || object.sortParticles || customAttributesDirty ) { - - setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object ); - - } - - geometry.verticesNeedUpdate = false; - geometry.colorsNeedUpdate = false; - - material.attributes && clearCustomAttributes( material ); - - } - - }; - - // Objects updates - custom attributes check - - function areCustomAttributesDirty( material ) { - - for ( var a in material.attributes ) { - - if ( material.attributes[ a ].needsUpdate ) return true; - - } - - return false; - - }; - - function clearCustomAttributes( material ) { - - for ( var a in material.attributes ) { - - material.attributes[ a ].needsUpdate = false; - - } - - }; - - // Objects removal - - function removeObject( object, scene ) { - - if ( object instanceof THREE.Mesh || - object instanceof THREE.ParticleSystem || - object instanceof THREE.Line ) { - - removeInstances( scene.__webglObjects, object ); - - } else if ( object instanceof THREE.Sprite ) { - - removeInstancesDirect( scene.__webglSprites, object ); - - } else if ( object instanceof THREE.LensFlare ) { - - removeInstancesDirect( scene.__webglFlares, object ); - - } else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) { - - removeInstances( scene.__webglObjectsImmediate, object ); - - } - - delete object.__webglActive; - - }; - - function removeInstances( objlist, object ) { - - for ( var o = objlist.length - 1; o >= 0; o -- ) { - - if ( objlist[ o ].object === object ) { - - objlist.splice( o, 1 ); - - } - - } - - }; - - function removeInstancesDirect( objlist, object ) { - - for ( var o = objlist.length - 1; o >= 0; o -- ) { - - if ( objlist[ o ] === object ) { - - objlist.splice( o, 1 ); - - } - - } - - }; - - // Materials - - this.initMaterial = function ( material, lights, fog, object ) { - - material.addEventListener( 'dispose', onMaterialDispose ); - - var u, a, identifiers, i, parameters, maxLightCount, maxBones, maxShadows, shaderID; - - if ( material instanceof THREE.MeshDepthMaterial ) { - - shaderID = 'depth'; - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - shaderID = 'normal'; - - } else if ( material instanceof THREE.MeshBasicMaterial ) { - - shaderID = 'basic'; - - } else if ( material instanceof THREE.MeshLambertMaterial ) { - - shaderID = 'lambert'; - - } else if ( material instanceof THREE.MeshPhongMaterial ) { - - shaderID = 'phong'; - - } else if ( material instanceof THREE.LineBasicMaterial ) { - - shaderID = 'basic'; - - } else if ( material instanceof THREE.LineDashedMaterial ) { - - shaderID = 'dashed'; - - } else if ( material instanceof THREE.ParticleSystemMaterial ) { - - shaderID = 'particle_basic'; - - } - - if ( shaderID ) { - - setMaterialShaders( material, THREE.ShaderLib[ shaderID ] ); - - } - - // heuristics to create shader parameters according to lights in the scene - // (not to blow over maxLights budget) - - maxLightCount = allocateLights( lights ); - - maxShadows = allocateShadows( lights ); - - maxBones = allocateBones( object ); - - parameters = { - - map: !!material.map, - envMap: !!material.envMap, - lightMap: !!material.lightMap, - bumpMap: !!material.bumpMap, - normalMap: !!material.normalMap, - specularMap: !!material.specularMap, - - vertexColors: material.vertexColors, - - fog: fog, - useFog: material.fog, - fogExp: fog instanceof THREE.FogExp2, - - sizeAttenuation: material.sizeAttenuation, - - skinning: material.skinning, - maxBones: maxBones, - useVertexTexture: _supportsBoneTextures && object && object.useVertexTexture, - - morphTargets: material.morphTargets, - morphNormals: material.morphNormals, - maxMorphTargets: this.maxMorphTargets, - maxMorphNormals: this.maxMorphNormals, - - maxDirLights: maxLightCount.directional, - maxPointLights: maxLightCount.point, - maxSpotLights: maxLightCount.spot, - maxHemiLights: maxLightCount.hemi, - - maxShadows: maxShadows, - shadowMapEnabled: this.shadowMapEnabled && object.receiveShadow && maxShadows > 0, - shadowMapType: this.shadowMapType, - shadowMapDebug: this.shadowMapDebug, - shadowMapCascade: this.shadowMapCascade, - - alphaTest: material.alphaTest, - metal: material.metal, - wrapAround: material.wrapAround, - doubleSided: material.side === THREE.DoubleSide, - flipSided: material.side === THREE.BackSide - - }; - - material.program = buildProgram( shaderID, material.fragmentShader, material.vertexShader, material.uniforms, material.attributes, material.defines, parameters, material.index0AttributeName ); - - var attributes = material.program.attributes; - - if ( material.morphTargets ) { - - material.numSupportedMorphTargets = 0; - - var id, base = "morphTarget"; - - for ( i = 0; i < this.maxMorphTargets; i ++ ) { - - id = base + i; - - if ( attributes[ id ] >= 0 ) { - - material.numSupportedMorphTargets ++; - - } - - } - - } - - if ( material.morphNormals ) { - - material.numSupportedMorphNormals = 0; - - var id, base = "morphNormal"; - - for ( i = 0; i < this.maxMorphNormals; i ++ ) { - - id = base + i; - - if ( attributes[ id ] >= 0 ) { - - material.numSupportedMorphNormals ++; - - } - - } - - } - - material.uniformsList = []; - - for ( u in material.uniforms ) { - - material.uniformsList.push( [ material.uniforms[ u ], u ] ); - - } - - }; - - function setMaterialShaders( material, shaders ) { - - material.uniforms = THREE.UniformsUtils.clone( shaders.uniforms ); - material.vertexShader = shaders.vertexShader; - material.fragmentShader = shaders.fragmentShader; - - }; - - function setProgram( camera, lights, fog, material, object ) { - - _usedTextureUnits = 0; - - if ( material.needsUpdate ) { - - if ( material.program ) deallocateMaterial( material ); - - _this.initMaterial( material, lights, fog, object ); - material.needsUpdate = false; - - } - - if ( material.morphTargets ) { - - if ( ! object.__webglMorphTargetInfluences ) { - - object.__webglMorphTargetInfluences = new Float32Array( _this.maxMorphTargets ); - - } - - } - - var refreshMaterial = false; - - var program = material.program, - p_uniforms = program.uniforms, - m_uniforms = material.uniforms; - - if ( program !== _currentProgram ) { - - _gl.useProgram( program ); - _currentProgram = program; - - refreshMaterial = true; - - } - - if ( material.id !== _currentMaterialId ) { - - _currentMaterialId = material.id; - refreshMaterial = true; - - } - - if ( refreshMaterial || camera !== _currentCamera ) { - - _gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); - - if ( camera !== _currentCamera ) _currentCamera = camera; - - } - - // skinning uniforms must be set even if material didn't change - // auto-setting of texture unit for bone texture must go before other textures - // not sure why, but otherwise weird things happen - - if ( material.skinning ) { - - if ( _supportsBoneTextures && object.useVertexTexture ) { - - if ( p_uniforms.boneTexture !== null ) { - - var textureUnit = getTextureUnit(); - - _gl.uniform1i( p_uniforms.boneTexture, textureUnit ); - _this.setTexture( object.boneTexture, textureUnit ); - - } - - if ( p_uniforms.boneTextureWidth !== null ) { - - _gl.uniform1i( p_uniforms.boneTextureWidth, object.boneTextureWidth ); - - } - - if ( p_uniforms.boneTextureHeight !== null ) { - - _gl.uniform1i( p_uniforms.boneTextureHeight, object.boneTextureHeight ); - - } - - } else { - - if ( p_uniforms.boneGlobalMatrices !== null ) { - - _gl.uniformMatrix4fv( p_uniforms.boneGlobalMatrices, false, object.boneMatrices ); - - } - - } - - } - - if ( refreshMaterial ) { - - // refresh uniforms common to several materials - - if ( fog && material.fog ) { - - refreshUniformsFog( m_uniforms, fog ); - - } - - if ( material instanceof THREE.MeshPhongMaterial || - material instanceof THREE.MeshLambertMaterial || - material.lights ) { - - if ( _lightsNeedUpdate ) { - - setupLights( program, lights ); - _lightsNeedUpdate = false; - - } - - refreshUniformsLights( m_uniforms, _lights ); - - } - - if ( material instanceof THREE.MeshBasicMaterial || - material instanceof THREE.MeshLambertMaterial || - material instanceof THREE.MeshPhongMaterial ) { - - refreshUniformsCommon( m_uniforms, material ); - - } - - // refresh single material specific uniforms - - if ( material instanceof THREE.LineBasicMaterial ) { - - refreshUniformsLine( m_uniforms, material ); - - } else if ( material instanceof THREE.LineDashedMaterial ) { - - refreshUniformsLine( m_uniforms, material ); - refreshUniformsDash( m_uniforms, material ); - - } else if ( material instanceof THREE.ParticleSystemMaterial ) { - - refreshUniformsParticle( m_uniforms, material ); - - } else if ( material instanceof THREE.MeshPhongMaterial ) { - - refreshUniformsPhong( m_uniforms, material ); - - } else if ( material instanceof THREE.MeshLambertMaterial ) { - - refreshUniformsLambert( m_uniforms, material ); - - } else if ( material instanceof THREE.MeshDepthMaterial ) { - - m_uniforms.mNear.value = camera.near; - m_uniforms.mFar.value = camera.far; - m_uniforms.opacity.value = material.opacity; - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - m_uniforms.opacity.value = material.opacity; - - } - - if ( object.receiveShadow && ! material._shadowPass ) { - - refreshUniformsShadow( m_uniforms, lights ); - - } - - // load common uniforms - - loadUniformsGeneric( program, material.uniformsList ); - - // load material specific uniforms - // (shader material also gets them for the sake of genericity) - - if ( material instanceof THREE.ShaderMaterial || - material instanceof THREE.MeshPhongMaterial || - material.envMap ) { - - if ( p_uniforms.cameraPosition !== null ) { - - _vector3.setFromMatrixPosition( camera.matrixWorld ); - _gl.uniform3f( p_uniforms.cameraPosition, _vector3.x, _vector3.y, _vector3.z ); - - } - - } - - if ( material instanceof THREE.MeshPhongMaterial || - material instanceof THREE.MeshLambertMaterial || - material instanceof THREE.ShaderMaterial || - material.skinning ) { - - if ( p_uniforms.viewMatrix !== null ) { - - _gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera.matrixWorldInverse.elements ); - - } - - } - - } - - loadUniformsMatrices( p_uniforms, object ); - - if ( p_uniforms.modelMatrix !== null ) { - - _gl.uniformMatrix4fv( p_uniforms.modelMatrix, false, object.matrixWorld.elements ); - - } - - return program; - - }; - - // Uniforms (refresh uniforms objects) - - function refreshUniformsCommon ( uniforms, material ) { - - uniforms.opacity.value = material.opacity; - - if ( _this.gammaInput ) { - - uniforms.diffuse.value.copyGammaToLinear( material.color ); - - } else { - - uniforms.diffuse.value = material.color; - - } - - uniforms.map.value = material.map; - uniforms.lightMap.value = material.lightMap; - uniforms.specularMap.value = material.specularMap; - - if ( material.bumpMap ) { - - uniforms.bumpMap.value = material.bumpMap; - uniforms.bumpScale.value = material.bumpScale; - - } - - if ( material.normalMap ) { - - uniforms.normalMap.value = material.normalMap; - uniforms.normalScale.value.copy( material.normalScale ); - - } - - // uv repeat and offset setting priorities - // 1. color map - // 2. specular map - // 3. normal map - // 4. bump map - - var uvScaleMap; - - if ( material.map ) { - - uvScaleMap = material.map; - - } else if ( material.specularMap ) { - - uvScaleMap = material.specularMap; - - } else if ( material.normalMap ) { - - uvScaleMap = material.normalMap; - - } else if ( material.bumpMap ) { - - uvScaleMap = material.bumpMap; - - } - - if ( uvScaleMap !== undefined ) { - - var offset = uvScaleMap.offset; - var repeat = uvScaleMap.repeat; - - uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); - - } - - uniforms.envMap.value = material.envMap; - uniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : -1; - - if ( _this.gammaInput ) { - - //uniforms.reflectivity.value = material.reflectivity * material.reflectivity; - uniforms.reflectivity.value = material.reflectivity; - - } else { - - uniforms.reflectivity.value = material.reflectivity; - - } - - uniforms.refractionRatio.value = material.refractionRatio; - uniforms.combine.value = material.combine; - uniforms.useRefract.value = material.envMap && material.envMap.mapping instanceof THREE.CubeRefractionMapping; - - }; - - function refreshUniformsLine ( uniforms, material ) { - - uniforms.diffuse.value = material.color; - uniforms.opacity.value = material.opacity; - - }; - - function refreshUniformsDash ( uniforms, material ) { - - uniforms.dashSize.value = material.dashSize; - uniforms.totalSize.value = material.dashSize + material.gapSize; - uniforms.scale.value = material.scale; - - }; - - function refreshUniformsParticle ( uniforms, material ) { - - uniforms.psColor.value = material.color; - uniforms.opacity.value = material.opacity; - uniforms.size.value = material.size; - uniforms.scale.value = _canvas.height / 2.0; // TODO: Cache this. - - uniforms.map.value = material.map; - - }; - - function refreshUniformsFog ( uniforms, fog ) { - - uniforms.fogColor.value = fog.color; - - if ( fog instanceof THREE.Fog ) { - - uniforms.fogNear.value = fog.near; - uniforms.fogFar.value = fog.far; - - } else if ( fog instanceof THREE.FogExp2 ) { - - uniforms.fogDensity.value = fog.density; - - } - - }; - - function refreshUniformsPhong ( uniforms, material ) { - - uniforms.shininess.value = material.shininess; - - if ( _this.gammaInput ) { - - uniforms.ambient.value.copyGammaToLinear( material.ambient ); - uniforms.emissive.value.copyGammaToLinear( material.emissive ); - uniforms.specular.value.copyGammaToLinear( material.specular ); - - } else { - - uniforms.ambient.value = material.ambient; - uniforms.emissive.value = material.emissive; - uniforms.specular.value = material.specular; - - } - - if ( material.wrapAround ) { - - uniforms.wrapRGB.value.copy( material.wrapRGB ); - - } - - }; - - function refreshUniformsLambert ( uniforms, material ) { - - if ( _this.gammaInput ) { - - uniforms.ambient.value.copyGammaToLinear( material.ambient ); - uniforms.emissive.value.copyGammaToLinear( material.emissive ); - - } else { - - uniforms.ambient.value = material.ambient; - uniforms.emissive.value = material.emissive; - - } - - if ( material.wrapAround ) { - - uniforms.wrapRGB.value.copy( material.wrapRGB ); - - } - - }; - - function refreshUniformsLights ( uniforms, lights ) { - - uniforms.ambientLightColor.value = lights.ambient; - - uniforms.directionalLightColor.value = lights.directional.colors; - uniforms.directionalLightDirection.value = lights.directional.positions; - - uniforms.pointLightColor.value = lights.point.colors; - uniforms.pointLightPosition.value = lights.point.positions; - uniforms.pointLightDistance.value = lights.point.distances; - - uniforms.spotLightColor.value = lights.spot.colors; - uniforms.spotLightPosition.value = lights.spot.positions; - uniforms.spotLightDistance.value = lights.spot.distances; - uniforms.spotLightDirection.value = lights.spot.directions; - uniforms.spotLightAngleCos.value = lights.spot.anglesCos; - uniforms.spotLightExponent.value = lights.spot.exponents; - - uniforms.hemisphereLightSkyColor.value = lights.hemi.skyColors; - uniforms.hemisphereLightGroundColor.value = lights.hemi.groundColors; - uniforms.hemisphereLightDirection.value = lights.hemi.positions; - - }; - - function refreshUniformsShadow ( uniforms, lights ) { - - if ( uniforms.shadowMatrix ) { - - var j = 0; - - for ( var i = 0, il = lights.length; i < il; i ++ ) { - - var light = lights[ i ]; - - if ( ! light.castShadow ) continue; - - if ( light instanceof THREE.SpotLight || ( light instanceof THREE.DirectionalLight && ! light.shadowCascade ) ) { - - uniforms.shadowMap.value[ j ] = light.shadowMap; - uniforms.shadowMapSize.value[ j ] = light.shadowMapSize; - - uniforms.shadowMatrix.value[ j ] = light.shadowMatrix; - - uniforms.shadowDarkness.value[ j ] = light.shadowDarkness; - uniforms.shadowBias.value[ j ] = light.shadowBias; - - j ++; - - } - - } - - } - - }; - - // Uniforms (load to GPU) - - function loadUniformsMatrices ( uniforms, object ) { - - _gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object._modelViewMatrix.elements ); - - if ( uniforms.normalMatrix ) { - - _gl.uniformMatrix3fv( uniforms.normalMatrix, false, object._normalMatrix.elements ); - - } - - }; - - function getTextureUnit() { - - var textureUnit = _usedTextureUnits; - - if ( textureUnit >= _maxTextures ) { - - console.warn( "WebGLRenderer: trying to use " + textureUnit + " texture units while this GPU supports only " + _maxTextures ); - - } - - _usedTextureUnits += 1; - - return textureUnit; - - }; - - function loadUniformsGeneric ( program, uniforms ) { - - var uniform, value, type, location, texture, textureUnit, i, il, j, jl, offset; - - for ( j = 0, jl = uniforms.length; j < jl; j ++ ) { - - location = program.uniforms[ uniforms[ j ][ 1 ] ]; - if ( !location ) continue; - - uniform = uniforms[ j ][ 0 ]; - - type = uniform.type; - value = uniform.value; - - if ( type === "i" ) { // single integer - - _gl.uniform1i( location, value ); - - } else if ( type === "f" ) { // single float - - _gl.uniform1f( location, value ); - - } else if ( type === "v2" ) { // single THREE.Vector2 - - _gl.uniform2f( location, value.x, value.y ); - - } else if ( type === "v3" ) { // single THREE.Vector3 - - _gl.uniform3f( location, value.x, value.y, value.z ); - - } else if ( type === "v4" ) { // single THREE.Vector4 - - _gl.uniform4f( location, value.x, value.y, value.z, value.w ); - - } else if ( type === "c" ) { // single THREE.Color - - _gl.uniform3f( location, value.r, value.g, value.b ); - - } else if ( type === "iv1" ) { // flat array of integers (JS or typed array) - - _gl.uniform1iv( location, value ); - - } else if ( type === "iv" ) { // flat array of integers with 3 x N size (JS or typed array) - - _gl.uniform3iv( location, value ); - - } else if ( type === "fv1" ) { // flat array of floats (JS or typed array) - - _gl.uniform1fv( location, value ); - - } else if ( type === "fv" ) { // flat array of floats with 3 x N size (JS or typed array) - - _gl.uniform3fv( location, value ); - - } else if ( type === "v2v" ) { // array of THREE.Vector2 - - if ( uniform._array === undefined ) { - - uniform._array = new Float32Array( 2 * value.length ); - - } - - for ( i = 0, il = value.length; i < il; i ++ ) { - - offset = i * 2; - - uniform._array[ offset ] = value[ i ].x; - uniform._array[ offset + 1 ] = value[ i ].y; - - } - - _gl.uniform2fv( location, uniform._array ); - - } else if ( type === "v3v" ) { // array of THREE.Vector3 - - if ( uniform._array === undefined ) { - - uniform._array = new Float32Array( 3 * value.length ); - - } - - for ( i = 0, il = value.length; i < il; i ++ ) { - - offset = i * 3; - - uniform._array[ offset ] = value[ i ].x; - uniform._array[ offset + 1 ] = value[ i ].y; - uniform._array[ offset + 2 ] = value[ i ].z; - - } - - _gl.uniform3fv( location, uniform._array ); - - } else if ( type === "v4v" ) { // array of THREE.Vector4 - - if ( uniform._array === undefined ) { - - uniform._array = new Float32Array( 4 * value.length ); - - } - - for ( i = 0, il = value.length; i < il; i ++ ) { - - offset = i * 4; - - uniform._array[ offset ] = value[ i ].x; - uniform._array[ offset + 1 ] = value[ i ].y; - uniform._array[ offset + 2 ] = value[ i ].z; - uniform._array[ offset + 3 ] = value[ i ].w; - - } - - _gl.uniform4fv( location, uniform._array ); - - } else if ( type === "m4") { // single THREE.Matrix4 - - if ( uniform._array === undefined ) { - - uniform._array = new Float32Array( 16 ); - - } - - value.flattenToArray( uniform._array ); - _gl.uniformMatrix4fv( location, false, uniform._array ); - - } else if ( type === "m4v" ) { // array of THREE.Matrix4 - - if ( uniform._array === undefined ) { - - uniform._array = new Float32Array( 16 * value.length ); - - } - - for ( i = 0, il = value.length; i < il; i ++ ) { - - value[ i ].flattenToArrayOffset( uniform._array, i * 16 ); - - } - - _gl.uniformMatrix4fv( location, false, uniform._array ); - - } else if ( type === "t" ) { // single THREE.Texture (2d or cube) - - texture = value; - textureUnit = getTextureUnit(); - - _gl.uniform1i( location, textureUnit ); - - if ( !texture ) continue; - - if ( texture.image instanceof Array && texture.image.length === 6 ) { - - setCubeTexture( texture, textureUnit ); - - } else if ( texture instanceof THREE.WebGLRenderTargetCube ) { - - setCubeTextureDynamic( texture, textureUnit ); - - } else { - - _this.setTexture( texture, textureUnit ); - - } - - } else if ( type === "tv" ) { // array of THREE.Texture (2d) - - if ( uniform._array === undefined ) { - - uniform._array = []; - - } - - for( i = 0, il = uniform.value.length; i < il; i ++ ) { - - uniform._array[ i ] = getTextureUnit(); - - } - - _gl.uniform1iv( location, uniform._array ); - - for( i = 0, il = uniform.value.length; i < il; i ++ ) { - - texture = uniform.value[ i ]; - textureUnit = uniform._array[ i ]; - - if ( !texture ) continue; - - _this.setTexture( texture, textureUnit ); - - } - - } else { - - console.warn( 'THREE.WebGLRenderer: Unknown uniform type: ' + type ); - - } - - } - - }; - - function setupMatrices ( object, camera ) { - - object._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); - object._normalMatrix.getNormalMatrix( object._modelViewMatrix ); - - }; - - // - - function setColorGamma( array, offset, color, intensitySq ) { - - array[ offset ] = color.r * color.r * intensitySq; - array[ offset + 1 ] = color.g * color.g * intensitySq; - array[ offset + 2 ] = color.b * color.b * intensitySq; - - }; - - function setColorLinear( array, offset, color, intensity ) { - - array[ offset ] = color.r * intensity; - array[ offset + 1 ] = color.g * intensity; - array[ offset + 2 ] = color.b * intensity; - - }; - - function setupLights ( program, lights ) { - - var l, ll, light, n, - r = 0, g = 0, b = 0, - color, skyColor, groundColor, - intensity, intensitySq, - position, - distance, - - zlights = _lights, - - dirColors = zlights.directional.colors, - dirPositions = zlights.directional.positions, - - pointColors = zlights.point.colors, - pointPositions = zlights.point.positions, - pointDistances = zlights.point.distances, - - spotColors = zlights.spot.colors, - spotPositions = zlights.spot.positions, - spotDistances = zlights.spot.distances, - spotDirections = zlights.spot.directions, - spotAnglesCos = zlights.spot.anglesCos, - spotExponents = zlights.spot.exponents, - - hemiSkyColors = zlights.hemi.skyColors, - hemiGroundColors = zlights.hemi.groundColors, - hemiPositions = zlights.hemi.positions, - - dirLength = 0, - pointLength = 0, - spotLength = 0, - hemiLength = 0, - - dirCount = 0, - pointCount = 0, - spotCount = 0, - hemiCount = 0, - - dirOffset = 0, - pointOffset = 0, - spotOffset = 0, - hemiOffset = 0; - - for ( l = 0, ll = lights.length; l < ll; l ++ ) { - - light = lights[ l ]; - - if ( light.onlyShadow ) continue; - - color = light.color; - intensity = light.intensity; - distance = light.distance; - - if ( light instanceof THREE.AmbientLight ) { - - if ( ! light.visible ) continue; - - if ( _this.gammaInput ) { - - r += color.r * color.r; - g += color.g * color.g; - b += color.b * color.b; - - } else { - - r += color.r; - g += color.g; - b += color.b; - - } - - } else if ( light instanceof THREE.DirectionalLight ) { - - dirCount += 1; - - if ( ! light.visible ) continue; - - _direction.setFromMatrixPosition( light.matrixWorld ); - _vector3.setFromMatrixPosition( light.target.matrixWorld ); - _direction.sub( _vector3 ); - _direction.normalize(); - - // skip lights with undefined direction - // these create troubles in OpenGL (making pixel black) - - if ( _direction.x === 0 && _direction.y === 0 && _direction.z === 0 ) continue; - - dirOffset = dirLength * 3; - - dirPositions[ dirOffset ] = _direction.x; - dirPositions[ dirOffset + 1 ] = _direction.y; - dirPositions[ dirOffset + 2 ] = _direction.z; - - if ( _this.gammaInput ) { - - setColorGamma( dirColors, dirOffset, color, intensity * intensity ); - - } else { - - setColorLinear( dirColors, dirOffset, color, intensity ); - - } - - dirLength += 1; - - } else if ( light instanceof THREE.PointLight ) { - - pointCount += 1; - - if ( ! light.visible ) continue; - - pointOffset = pointLength * 3; - - if ( _this.gammaInput ) { - - setColorGamma( pointColors, pointOffset, color, intensity * intensity ); - - } else { - - setColorLinear( pointColors, pointOffset, color, intensity ); - - } - - _vector3.setFromMatrixPosition( light.matrixWorld ); - - pointPositions[ pointOffset ] = _vector3.x; - pointPositions[ pointOffset + 1 ] = _vector3.y; - pointPositions[ pointOffset + 2 ] = _vector3.z; - - pointDistances[ pointLength ] = distance; - - pointLength += 1; - - } else if ( light instanceof THREE.SpotLight ) { - - spotCount += 1; - - if ( ! light.visible ) continue; - - spotOffset = spotLength * 3; - - if ( _this.gammaInput ) { - - setColorGamma( spotColors, spotOffset, color, intensity * intensity ); - - } else { - - setColorLinear( spotColors, spotOffset, color, intensity ); - - } - - _vector3.setFromMatrixPosition( light.matrixWorld ); - - spotPositions[ spotOffset ] = _vector3.x; - spotPositions[ spotOffset + 1 ] = _vector3.y; - spotPositions[ spotOffset + 2 ] = _vector3.z; - - spotDistances[ spotLength ] = distance; - - _direction.copy( _vector3 ); - _vector3.setFromMatrixPosition( light.target.matrixWorld ); - _direction.sub( _vector3 ); - _direction.normalize(); - - spotDirections[ spotOffset ] = _direction.x; - spotDirections[ spotOffset + 1 ] = _direction.y; - spotDirections[ spotOffset + 2 ] = _direction.z; - - spotAnglesCos[ spotLength ] = Math.cos( light.angle ); - spotExponents[ spotLength ] = light.exponent; - - spotLength += 1; - - } else if ( light instanceof THREE.HemisphereLight ) { - - hemiCount += 1; - - if ( ! light.visible ) continue; - - _direction.setFromMatrixPosition( light.matrixWorld ); - _direction.normalize(); - - // skip lights with undefined direction - // these create troubles in OpenGL (making pixel black) - - if ( _direction.x === 0 && _direction.y === 0 && _direction.z === 0 ) continue; - - hemiOffset = hemiLength * 3; - - hemiPositions[ hemiOffset ] = _direction.x; - hemiPositions[ hemiOffset + 1 ] = _direction.y; - hemiPositions[ hemiOffset + 2 ] = _direction.z; - - skyColor = light.color; - groundColor = light.groundColor; - - if ( _this.gammaInput ) { - - intensitySq = intensity * intensity; - - setColorGamma( hemiSkyColors, hemiOffset, skyColor, intensitySq ); - setColorGamma( hemiGroundColors, hemiOffset, groundColor, intensitySq ); - - } else { - - setColorLinear( hemiSkyColors, hemiOffset, skyColor, intensity ); - setColorLinear( hemiGroundColors, hemiOffset, groundColor, intensity ); - - } - - hemiLength += 1; - - } - - } - - // null eventual remains from removed lights - // (this is to avoid if in shader) - - for ( l = dirLength * 3, ll = Math.max( dirColors.length, dirCount * 3 ); l < ll; l ++ ) dirColors[ l ] = 0.0; - for ( l = pointLength * 3, ll = Math.max( pointColors.length, pointCount * 3 ); l < ll; l ++ ) pointColors[ l ] = 0.0; - for ( l = spotLength * 3, ll = Math.max( spotColors.length, spotCount * 3 ); l < ll; l ++ ) spotColors[ l ] = 0.0; - for ( l = hemiLength * 3, ll = Math.max( hemiSkyColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiSkyColors[ l ] = 0.0; - for ( l = hemiLength * 3, ll = Math.max( hemiGroundColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiGroundColors[ l ] = 0.0; - - zlights.directional.length = dirLength; - zlights.point.length = pointLength; - zlights.spot.length = spotLength; - zlights.hemi.length = hemiLength; - - zlights.ambient[ 0 ] = r; - zlights.ambient[ 1 ] = g; - zlights.ambient[ 2 ] = b; - - }; - - // GL state setting - - this.setFaceCulling = function ( cullFace, frontFaceDirection ) { - - if ( cullFace === THREE.CullFaceNone ) { - - _gl.disable( _gl.CULL_FACE ); - - } else { - - if ( frontFaceDirection === THREE.FrontFaceDirectionCW ) { - - _gl.frontFace( _gl.CW ); - - } else { - - _gl.frontFace( _gl.CCW ); - - } - - if ( cullFace === THREE.CullFaceBack ) { - - _gl.cullFace( _gl.BACK ); - - } else if ( cullFace === THREE.CullFaceFront ) { - - _gl.cullFace( _gl.FRONT ); - - } else { - - _gl.cullFace( _gl.FRONT_AND_BACK ); - - } - - _gl.enable( _gl.CULL_FACE ); - - } - - }; - - this.setMaterialFaces = function ( material ) { - - var doubleSided = material.side === THREE.DoubleSide; - var flipSided = material.side === THREE.BackSide; - - if ( _oldDoubleSided !== doubleSided ) { - - if ( doubleSided ) { - - _gl.disable( _gl.CULL_FACE ); - - } else { - - _gl.enable( _gl.CULL_FACE ); - - } - - _oldDoubleSided = doubleSided; - - } - - if ( _oldFlipSided !== flipSided ) { - - if ( flipSided ) { - - _gl.frontFace( _gl.CW ); - - } else { - - _gl.frontFace( _gl.CCW ); - - } - - _oldFlipSided = flipSided; - - } - - }; - - this.setDepthTest = function ( depthTest ) { - - if ( _oldDepthTest !== depthTest ) { - - if ( depthTest ) { - - _gl.enable( _gl.DEPTH_TEST ); - - } else { - - _gl.disable( _gl.DEPTH_TEST ); - - } - - _oldDepthTest = depthTest; - - } - - }; - - this.setDepthWrite = function ( depthWrite ) { - - if ( _oldDepthWrite !== depthWrite ) { - - _gl.depthMask( depthWrite ); - _oldDepthWrite = depthWrite; - - } - - }; - - function setLineWidth ( width ) { - - if ( width !== _oldLineWidth ) { - - _gl.lineWidth( width ); - - _oldLineWidth = width; - - } - - }; - - function setPolygonOffset ( polygonoffset, factor, units ) { - - if ( _oldPolygonOffset !== polygonoffset ) { - - if ( polygonoffset ) { - - _gl.enable( _gl.POLYGON_OFFSET_FILL ); - - } else { - - _gl.disable( _gl.POLYGON_OFFSET_FILL ); - - } - - _oldPolygonOffset = polygonoffset; - - } - - if ( polygonoffset && ( _oldPolygonOffsetFactor !== factor || _oldPolygonOffsetUnits !== units ) ) { - - _gl.polygonOffset( factor, units ); - - _oldPolygonOffsetFactor = factor; - _oldPolygonOffsetUnits = units; - - } - - }; - - this.setBlending = function ( blending, blendEquation, blendSrc, blendDst ) { - - if ( blending !== _oldBlending ) { - - if ( blending === THREE.NoBlending ) { - - _gl.disable( _gl.BLEND ); - - } else if ( blending === THREE.AdditiveBlending ) { - - _gl.enable( _gl.BLEND ); - _gl.blendEquation( _gl.FUNC_ADD ); - _gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE ); - - } else if ( blending === THREE.SubtractiveBlending ) { - - // TODO: Find blendFuncSeparate() combination - _gl.enable( _gl.BLEND ); - _gl.blendEquation( _gl.FUNC_ADD ); - _gl.blendFunc( _gl.ZERO, _gl.ONE_MINUS_SRC_COLOR ); - - } else if ( blending === THREE.MultiplyBlending ) { - - // TODO: Find blendFuncSeparate() combination - _gl.enable( _gl.BLEND ); - _gl.blendEquation( _gl.FUNC_ADD ); - _gl.blendFunc( _gl.ZERO, _gl.SRC_COLOR ); - - } else if ( blending === THREE.CustomBlending ) { - - _gl.enable( _gl.BLEND ); - - } else { - - _gl.enable( _gl.BLEND ); - _gl.blendEquationSeparate( _gl.FUNC_ADD, _gl.FUNC_ADD ); - _gl.blendFuncSeparate( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA, _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA ); - - } - - _oldBlending = blending; - - } - - if ( blending === THREE.CustomBlending ) { - - if ( blendEquation !== _oldBlendEquation ) { - - _gl.blendEquation( paramThreeToGL( blendEquation ) ); - - _oldBlendEquation = blendEquation; - - } - - if ( blendSrc !== _oldBlendSrc || blendDst !== _oldBlendDst ) { - - _gl.blendFunc( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ) ); - - _oldBlendSrc = blendSrc; - _oldBlendDst = blendDst; - - } - - } else { - - _oldBlendEquation = null; - _oldBlendSrc = null; - _oldBlendDst = null; - - } - - }; - - // Defines - - function generateDefines ( defines ) { - - var value, chunk, chunks = []; - - for ( var d in defines ) { - - value = defines[ d ]; - if ( value === false ) continue; - - chunk = "#define " + d + " " + value; - chunks.push( chunk ); - - } - - return chunks.join( "\n" ); - - }; - - // Shaders - - function buildProgram( shaderID, fragmentShader, vertexShader, uniforms, attributes, defines, parameters, index0AttributeName ) { - - var p, pl, d, program, code; - var chunks = []; - - // Generate code - - if ( shaderID ) { - - chunks.push( shaderID ); - - } else { - - chunks.push( fragmentShader ); - chunks.push( vertexShader ); - - } - - for ( d in defines ) { - - chunks.push( d ); - chunks.push( defines[ d ] ); - - } - - for ( p in parameters ) { - - chunks.push( p ); - chunks.push( parameters[ p ] ); - - } - - code = chunks.join(); - - // Check if code has been already compiled - - for ( p = 0, pl = _programs.length; p < pl; p ++ ) { - - var programInfo = _programs[ p ]; - - if ( programInfo.code === code ) { - - // console.log( "Code already compiled." /*: \n\n" + code*/ ); - - programInfo.usedTimes ++; - - return programInfo.program; - - } - - } - - var shadowMapTypeDefine = "SHADOWMAP_TYPE_BASIC"; - - if ( parameters.shadowMapType === THREE.PCFShadowMap ) { - - shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF"; - - } else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) { - - shadowMapTypeDefine = "SHADOWMAP_TYPE_PCF_SOFT"; - - } - - // console.log( "building new program " ); - - // - - var customDefines = generateDefines( defines ); - - // - - program = _gl.createProgram(); - - var prefix_vertex = [ - - "precision " + _precision + " float;", - "precision " + _precision + " int;", - - customDefines, - - _supportsVertexTextures ? "#define VERTEX_TEXTURES" : "", - - _this.gammaInput ? "#define GAMMA_INPUT" : "", - _this.gammaOutput ? "#define GAMMA_OUTPUT" : "", - - "#define MAX_DIR_LIGHTS " + parameters.maxDirLights, - "#define MAX_POINT_LIGHTS " + parameters.maxPointLights, - "#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights, - "#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights, - - "#define MAX_SHADOWS " + parameters.maxShadows, - - "#define MAX_BONES " + parameters.maxBones, - - parameters.map ? "#define USE_MAP" : "", - parameters.envMap ? "#define USE_ENVMAP" : "", - parameters.lightMap ? "#define USE_LIGHTMAP" : "", - parameters.bumpMap ? "#define USE_BUMPMAP" : "", - parameters.normalMap ? "#define USE_NORMALMAP" : "", - parameters.specularMap ? "#define USE_SPECULARMAP" : "", - parameters.vertexColors ? "#define USE_COLOR" : "", - - parameters.skinning ? "#define USE_SKINNING" : "", - parameters.useVertexTexture ? "#define BONE_TEXTURE" : "", - - parameters.morphTargets ? "#define USE_MORPHTARGETS" : "", - parameters.morphNormals ? "#define USE_MORPHNORMALS" : "", - parameters.wrapAround ? "#define WRAP_AROUND" : "", - parameters.doubleSided ? "#define DOUBLE_SIDED" : "", - parameters.flipSided ? "#define FLIP_SIDED" : "", - - parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", - parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "", - parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "", - parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "", - - parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", - - "uniform mat4 modelMatrix;", - "uniform mat4 modelViewMatrix;", - "uniform mat4 projectionMatrix;", - "uniform mat4 viewMatrix;", - "uniform mat3 normalMatrix;", - "uniform vec3 cameraPosition;", - - "attribute vec3 position;", - "attribute vec3 normal;", - "attribute vec2 uv;", - "attribute vec2 uv2;", - - "#ifdef USE_COLOR", - - "attribute vec3 color;", - - "#endif", - - "#ifdef USE_MORPHTARGETS", - - "attribute vec3 morphTarget0;", - "attribute vec3 morphTarget1;", - "attribute vec3 morphTarget2;", - "attribute vec3 morphTarget3;", - - "#ifdef USE_MORPHNORMALS", - - "attribute vec3 morphNormal0;", - "attribute vec3 morphNormal1;", - "attribute vec3 morphNormal2;", - "attribute vec3 morphNormal3;", - - "#else", - - "attribute vec3 morphTarget4;", - "attribute vec3 morphTarget5;", - "attribute vec3 morphTarget6;", - "attribute vec3 morphTarget7;", - - "#endif", - - "#endif", - - "#ifdef USE_SKINNING", - - "attribute vec4 skinIndex;", - "attribute vec4 skinWeight;", - - "#endif", - - "" - - ].join("\n"); - - var prefix_fragment = [ - - "precision " + _precision + " float;", - "precision " + _precision + " int;", - - ( parameters.bumpMap || parameters.normalMap ) ? "#extension GL_OES_standard_derivatives : enable" : "", - - customDefines, - - "#define MAX_DIR_LIGHTS " + parameters.maxDirLights, - "#define MAX_POINT_LIGHTS " + parameters.maxPointLights, - "#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights, - "#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights, - - "#define MAX_SHADOWS " + parameters.maxShadows, - - parameters.alphaTest ? "#define ALPHATEST " + parameters.alphaTest: "", - - _this.gammaInput ? "#define GAMMA_INPUT" : "", - _this.gammaOutput ? "#define GAMMA_OUTPUT" : "", - - ( parameters.useFog && parameters.fog ) ? "#define USE_FOG" : "", - ( parameters.useFog && parameters.fogExp ) ? "#define FOG_EXP2" : "", - - parameters.map ? "#define USE_MAP" : "", - parameters.envMap ? "#define USE_ENVMAP" : "", - parameters.lightMap ? "#define USE_LIGHTMAP" : "", - parameters.bumpMap ? "#define USE_BUMPMAP" : "", - parameters.normalMap ? "#define USE_NORMALMAP" : "", - parameters.specularMap ? "#define USE_SPECULARMAP" : "", - parameters.vertexColors ? "#define USE_COLOR" : "", - - parameters.metal ? "#define METAL" : "", - parameters.wrapAround ? "#define WRAP_AROUND" : "", - parameters.doubleSided ? "#define DOUBLE_SIDED" : "", - parameters.flipSided ? "#define FLIP_SIDED" : "", - - parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", - parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "", - parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "", - parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "", - - "uniform mat4 viewMatrix;", - "uniform vec3 cameraPosition;", - "" - - ].join("\n"); - - var glVertexShader = getShader( "vertex", prefix_vertex + vertexShader ); - var glFragmentShader = getShader( "fragment", prefix_fragment + fragmentShader ); - - _gl.attachShader( program, glVertexShader ); - _gl.attachShader( program, glFragmentShader ); - - // Force a particular attribute to index 0. - // because potentially expensive emulation is done by browser if attribute 0 is disabled. - // And, color, for example is often automatically bound to index 0 so disabling it - if ( index0AttributeName !== undefined ) { - - _gl.bindAttribLocation( program, 0, index0AttributeName ); - - } - - _gl.linkProgram( program ); - - if ( _gl.getProgramParameter( program, _gl.LINK_STATUS ) === false ) { - - console.error( 'Could not initialise shader' ); - console.error( 'gl.VALIDATE_STATUS', _gl.getProgramParameter( program, _gl.VALIDATE_STATUS ) ); - console.error( 'gl.getError()', _gl.getError() ); - - } - - if ( _gl.getProgramInfoLog( program ) !== '' ) { - - console.error( 'gl.getProgramInfoLog()', _gl.getProgramInfoLog( program ) ); - - } - - // clean up - - _gl.deleteShader( glFragmentShader ); - _gl.deleteShader( glVertexShader ); - - // console.log( prefix_fragment + fragmentShader ); - // console.log( prefix_vertex + vertexShader ); - - program.uniforms = {}; - program.attributes = {}; - - var identifiers, u, a, i; - - // cache uniform locations - - identifiers = [ - - 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'modelMatrix', 'cameraPosition', - 'morphTargetInfluences' - - ]; - - if ( parameters.useVertexTexture ) { - - identifiers.push( 'boneTexture' ); - identifiers.push( 'boneTextureWidth' ); - identifiers.push( 'boneTextureHeight' ); - - } else { - - identifiers.push( 'boneGlobalMatrices' ); - - } - - for ( u in uniforms ) { - - identifiers.push( u ); - - } - - cacheUniformLocations( program, identifiers ); - - // cache attributes locations - - identifiers = [ - - "position", "normal", "uv", "uv2", "tangent", "color", - "skinIndex", "skinWeight", "lineDistance" - - ]; - - for ( i = 0; i < parameters.maxMorphTargets; i ++ ) { - - identifiers.push( "morphTarget" + i ); - - } - - for ( i = 0; i < parameters.maxMorphNormals; i ++ ) { - - identifiers.push( "morphNormal" + i ); - - } - - for ( a in attributes ) { - - identifiers.push( a ); - - } - - cacheAttributeLocations( program, identifiers ); - - program.id = _programs_counter ++; - - _programs.push( { program: program, code: code, usedTimes: 1 } ); - - _this.info.memory.programs = _programs.length; - - return program; - - }; - - // Shader parameters cache - - function cacheUniformLocations ( program, identifiers ) { - - var i, l, id; - - for( i = 0, l = identifiers.length; i < l; i ++ ) { - - id = identifiers[ i ]; - program.uniforms[ id ] = _gl.getUniformLocation( program, id ); - - } - - }; - - function cacheAttributeLocations ( program, identifiers ) { - - var i, l, id; - - for( i = 0, l = identifiers.length; i < l; i ++ ) { - - id = identifiers[ i ]; - program.attributes[ id ] = _gl.getAttribLocation( program, id ); - - } - - }; - - function addLineNumbers ( string ) { - - var chunks = string.split( "\n" ); - - for ( var i = 0, il = chunks.length; i < il; i ++ ) { - - // Chrome reports shader errors on lines - // starting counting from 1 - - chunks[ i ] = ( i + 1 ) + ": " + chunks[ i ]; - - } - - return chunks.join( "\n" ); - - }; - - function getShader ( type, string ) { - - var shader; - - if ( type === "fragment" ) { - - shader = _gl.createShader( _gl.FRAGMENT_SHADER ); - - } else if ( type === "vertex" ) { - - shader = _gl.createShader( _gl.VERTEX_SHADER ); - - } - - _gl.shaderSource( shader, string ); - _gl.compileShader( shader ); - - if ( !_gl.getShaderParameter( shader, _gl.COMPILE_STATUS ) ) { - - console.error( _gl.getShaderInfoLog( shader ) ); - console.error( addLineNumbers( string ) ); - return null; - - } - - return shader; - - }; - - // Textures - - function setTextureParameters ( textureType, texture, isImagePowerOfTwo ) { - - if ( isImagePowerOfTwo ) { - - _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); - _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); - - _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); - _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); - - } else { - - _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); - - _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); - _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); - - } - - if ( _glExtensionTextureFilterAnisotropic && texture.type !== THREE.FloatType ) { - - if ( texture.anisotropy > 1 || texture.__oldAnisotropy ) { - - _gl.texParameterf( textureType, _glExtensionTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, _maxAnisotropy ) ); - texture.__oldAnisotropy = texture.anisotropy; - - } - - } - - }; - - this.setTexture = function ( texture, slot ) { - - if ( texture.needsUpdate ) { - - if ( ! texture.__webglInit ) { - - texture.__webglInit = true; - - texture.addEventListener( 'dispose', onTextureDispose ); - - texture.__webglTexture = _gl.createTexture(); - - _this.info.memory.textures ++; - - } - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture ); - - _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); - _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); - _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); - - var image = texture.image, - isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ), - glFormat = paramThreeToGL( texture.format ), - glType = paramThreeToGL( texture.type ); - - setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo ); - - var mipmap, mipmaps = texture.mipmaps; - - if ( texture instanceof THREE.DataTexture ) { - - // use manually created mipmaps if available - // if there are no manual mipmaps - // set 0 level mipmap and then use GL to generate other mipmap levels - - if ( mipmaps.length > 0 && isImagePowerOfTwo ) { - - for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { - - mipmap = mipmaps[ i ]; - _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); - - } - - texture.generateMipmaps = false; - - } else { - - _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); - - } - - } else if ( texture instanceof THREE.CompressedTexture ) { - - for( var i = 0, il = mipmaps.length; i < il; i ++ ) { - - mipmap = mipmaps[ i ]; - if ( texture.format!==THREE.RGBAFormat ) { - _gl.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); - } else { - _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); - } - - } - - } else { // regular Texture (image, video, canvas) - - // use manually created mipmaps if available - // if there are no manual mipmaps - // set 0 level mipmap and then use GL to generate other mipmap levels - - if ( mipmaps.length > 0 && isImagePowerOfTwo ) { - - for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { - - mipmap = mipmaps[ i ]; - _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); - - } - - texture.generateMipmaps = false; - - } else { - - _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image ); - - } - - } - - if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); - - texture.needsUpdate = false; - - if ( texture.onUpdate ) texture.onUpdate(); - - } else { - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture ); - - } - - }; - - function clampToMaxSize ( image, maxSize ) { - - if ( image.width <= maxSize && image.height <= maxSize ) { - - return image; - - } - - // Warning: Scaling through the canvas will only work with images that use - // premultiplied alpha. - - var maxDimension = Math.max( image.width, image.height ); - var newWidth = Math.floor( image.width * maxSize / maxDimension ); - var newHeight = Math.floor( image.height * maxSize / maxDimension ); - - var canvas = document.createElement( 'canvas' ); - canvas.width = newWidth; - canvas.height = newHeight; - - var ctx = canvas.getContext( "2d" ); - ctx.drawImage( image, 0, 0, image.width, image.height, 0, 0, newWidth, newHeight ); - - return canvas; - - } - - function setCubeTexture ( texture, slot ) { - - if ( texture.image.length === 6 ) { - - if ( texture.needsUpdate ) { - - if ( ! texture.image.__webglTextureCube ) { - - texture.addEventListener( 'dispose', onTextureDispose ); - - texture.image.__webglTextureCube = _gl.createTexture(); - - _this.info.memory.textures ++; - - } - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube ); - - _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); - - var isCompressed = texture instanceof THREE.CompressedTexture; - - var cubeImage = []; - - for ( var i = 0; i < 6; i ++ ) { - - if ( _this.autoScaleCubemaps && ! isCompressed ) { - - cubeImage[ i ] = clampToMaxSize( texture.image[ i ], _maxCubemapSize ); - - } else { - - cubeImage[ i ] = texture.image[ i ]; - - } - - } - - var image = cubeImage[ 0 ], - isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ), - glFormat = paramThreeToGL( texture.format ), - glType = paramThreeToGL( texture.type ); - - setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isImagePowerOfTwo ); - - for ( var i = 0; i < 6; i ++ ) { - - if( !isCompressed ) { - - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); - - } else { - - var mipmap, mipmaps = cubeImage[ i ].mipmaps; - - for( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { - - mipmap = mipmaps[ j ]; - if ( texture.format!==THREE.RGBAFormat ) { - - _gl.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); - - } else { - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); - } - - } - } - } - - if ( texture.generateMipmaps && isImagePowerOfTwo ) { - - _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); - - } - - texture.needsUpdate = false; - - if ( texture.onUpdate ) texture.onUpdate(); - - } else { - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube ); - - } - - } - - }; - - function setCubeTextureDynamic ( texture, slot ) { - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.__webglTexture ); - - }; - - // Render targets - - function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) { - - _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); - _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, renderTarget.__webglTexture, 0 ); - - }; - - function setupRenderBuffer ( renderbuffer, renderTarget ) { - - _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); - - if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { - - _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); - _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); - - /* For some reason this is not working. Defaulting to RGBA4. - } else if( ! renderTarget.depthBuffer && renderTarget.stencilBuffer ) { - - _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.STENCIL_INDEX8, renderTarget.width, renderTarget.height ); - _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); - */ - } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { - - _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); - _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); - - } else { - - _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); - - } - - }; - - this.setRenderTarget = function ( renderTarget ) { - - var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube ); - - if ( renderTarget && ! renderTarget.__webglFramebuffer ) { - - if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true; - if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true; - - renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); - - renderTarget.__webglTexture = _gl.createTexture(); - - _this.info.memory.textures ++; - - // Setup texture, create render and frame buffers - - var isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height ), - glFormat = paramThreeToGL( renderTarget.format ), - glType = paramThreeToGL( renderTarget.type ); - - if ( isCube ) { - - renderTarget.__webglFramebuffer = []; - renderTarget.__webglRenderbuffer = []; - - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture ); - setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget, isTargetPowerOfTwo ); - - for ( var i = 0; i < 6; i ++ ) { - - renderTarget.__webglFramebuffer[ i ] = _gl.createFramebuffer(); - renderTarget.__webglRenderbuffer[ i ] = _gl.createRenderbuffer(); - - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); - - setupFrameBuffer( renderTarget.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); - setupRenderBuffer( renderTarget.__webglRenderbuffer[ i ], renderTarget ); - - } - - if ( isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); - - } else { - - renderTarget.__webglFramebuffer = _gl.createFramebuffer(); - - if ( renderTarget.shareDepthFrom ) { - - renderTarget.__webglRenderbuffer = renderTarget.shareDepthFrom.__webglRenderbuffer; - - } else { - - renderTarget.__webglRenderbuffer = _gl.createRenderbuffer(); - - } - - _gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture ); - setTextureParameters( _gl.TEXTURE_2D, renderTarget, isTargetPowerOfTwo ); - - _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); - - setupFrameBuffer( renderTarget.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D ); - - if ( renderTarget.shareDepthFrom ) { - - if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { - - _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTarget.__webglRenderbuffer ); - - } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { - - _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTarget.__webglRenderbuffer ); - - } - - } else { - - setupRenderBuffer( renderTarget.__webglRenderbuffer, renderTarget ); - - } - - if ( isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); - - } - - // Release everything - - if ( isCube ) { - - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); - - } else { - - _gl.bindTexture( _gl.TEXTURE_2D, null ); - - } - - _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); - _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); - - } - - var framebuffer, width, height, vx, vy; - - if ( renderTarget ) { - - if ( isCube ) { - - framebuffer = renderTarget.__webglFramebuffer[ renderTarget.activeCubeFace ]; - - } else { - - framebuffer = renderTarget.__webglFramebuffer; - - } - - width = renderTarget.width; - height = renderTarget.height; - - vx = 0; - vy = 0; - - } else { - - framebuffer = null; - - width = _viewportWidth; - height = _viewportHeight; - - vx = _viewportX; - vy = _viewportY; - - } - - if ( framebuffer !== _currentFramebuffer ) { - - _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); - _gl.viewport( vx, vy, width, height ); - - _currentFramebuffer = framebuffer; - - } - - _currentWidth = width; - _currentHeight = height; - - }; - - function updateRenderTargetMipmap ( renderTarget ) { - - if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) { - - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture ); - _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); - - } else { - - _gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture ); - _gl.generateMipmap( _gl.TEXTURE_2D ); - _gl.bindTexture( _gl.TEXTURE_2D, null ); - - } - - }; - - // Fallback filters for non-power-of-2 textures - - function filterFallback ( f ) { - - if ( f === THREE.NearestFilter || f === THREE.NearestMipMapNearestFilter || f === THREE.NearestMipMapLinearFilter ) { - - return _gl.NEAREST; - - } - - return _gl.LINEAR; - - }; - - // Map three.js constants to WebGL constants - - function paramThreeToGL ( p ) { - - if ( p === THREE.RepeatWrapping ) return _gl.REPEAT; - if ( p === THREE.ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE; - if ( p === THREE.MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT; - - if ( p === THREE.NearestFilter ) return _gl.NEAREST; - if ( p === THREE.NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST; - if ( p === THREE.NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR; - - if ( p === THREE.LinearFilter ) return _gl.LINEAR; - if ( p === THREE.LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST; - if ( p === THREE.LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR; - - if ( p === THREE.UnsignedByteType ) return _gl.UNSIGNED_BYTE; - if ( p === THREE.UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4; - if ( p === THREE.UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1; - if ( p === THREE.UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5; - - if ( p === THREE.ByteType ) return _gl.BYTE; - if ( p === THREE.ShortType ) return _gl.SHORT; - if ( p === THREE.UnsignedShortType ) return _gl.UNSIGNED_SHORT; - if ( p === THREE.IntType ) return _gl.INT; - if ( p === THREE.UnsignedIntType ) return _gl.UNSIGNED_INT; - if ( p === THREE.FloatType ) return _gl.FLOAT; - - if ( p === THREE.AlphaFormat ) return _gl.ALPHA; - if ( p === THREE.RGBFormat ) return _gl.RGB; - if ( p === THREE.RGBAFormat ) return _gl.RGBA; - if ( p === THREE.LuminanceFormat ) return _gl.LUMINANCE; - if ( p === THREE.LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA; - - if ( p === THREE.AddEquation ) return _gl.FUNC_ADD; - if ( p === THREE.SubtractEquation ) return _gl.FUNC_SUBTRACT; - if ( p === THREE.ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT; - - if ( p === THREE.ZeroFactor ) return _gl.ZERO; - if ( p === THREE.OneFactor ) return _gl.ONE; - if ( p === THREE.SrcColorFactor ) return _gl.SRC_COLOR; - if ( p === THREE.OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR; - if ( p === THREE.SrcAlphaFactor ) return _gl.SRC_ALPHA; - if ( p === THREE.OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA; - if ( p === THREE.DstAlphaFactor ) return _gl.DST_ALPHA; - if ( p === THREE.OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA; - - if ( p === THREE.DstColorFactor ) return _gl.DST_COLOR; - if ( p === THREE.OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR; - if ( p === THREE.SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE; - - if ( _glExtensionCompressedTextureS3TC !== undefined ) { - - if ( p === THREE.RGB_S3TC_DXT1_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT; - if ( p === THREE.RGBA_S3TC_DXT1_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT; - if ( p === THREE.RGBA_S3TC_DXT3_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT; - if ( p === THREE.RGBA_S3TC_DXT5_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT; - - } - - return 0; - - }; - - // Allocations - - function allocateBones ( object ) { - - if ( _supportsBoneTextures && object && object.useVertexTexture ) { - - return 1024; - - } else { - - // default for when object is not specified - // ( for example when prebuilding shader - // to be used with multiple objects ) - // - // - leave some extra space for other uniforms - // - limit here is ANGLE's 254 max uniform vectors - // (up to 54 should be safe) - - var nVertexUniforms = _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS ); - var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); - - var maxBones = nVertexMatrices; - - if ( object !== undefined && object instanceof THREE.SkinnedMesh ) { - - maxBones = Math.min( object.bones.length, maxBones ); - - if ( maxBones < object.bones.length ) { - - console.warn( "WebGLRenderer: too many bones - " + object.bones.length + ", this GPU supports just " + maxBones + " (try OpenGL instead of ANGLE)" ); - - } - - } - - return maxBones; - - } - - }; - - function allocateLights( lights ) { - - var dirLights = 0; - var pointLights = 0; - var spotLights = 0; - var hemiLights = 0; - - for ( var l = 0, ll = lights.length; l < ll; l ++ ) { - - var light = lights[ l ]; - - if ( light.onlyShadow || light.visible === false ) continue; - - if ( light instanceof THREE.DirectionalLight ) dirLights ++; - if ( light instanceof THREE.PointLight ) pointLights ++; - if ( light instanceof THREE.SpotLight ) spotLights ++; - if ( light instanceof THREE.HemisphereLight ) hemiLights ++; - - } - - return { 'directional' : dirLights, 'point' : pointLights, 'spot': spotLights, 'hemi': hemiLights }; - - }; - - function allocateShadows( lights ) { - - var maxShadows = 0; - - for ( var l = 0, ll = lights.length; l < ll; l++ ) { - - var light = lights[ l ]; - - if ( ! light.castShadow ) continue; - - if ( light instanceof THREE.SpotLight ) maxShadows ++; - if ( light instanceof THREE.DirectionalLight && ! light.shadowCascade ) maxShadows ++; - - } - - return maxShadows; - - }; - - // Initialization - - function initGL() { - - try { - - var attributes = { - alpha: _alpha, - premultipliedAlpha: _premultipliedAlpha, - antialias: _antialias, - stencil: _stencil, - preserveDrawingBuffer: _preserveDrawingBuffer - }; - - _gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes ); - - if ( _gl === null ) { - - throw 'Error creating WebGL context.'; - - } - - } catch ( error ) { - - console.error( error ); - - } - - _glExtensionTextureFloat = _gl.getExtension( 'OES_texture_float' ); - _glExtensionTextureFloatLinear = _gl.getExtension( 'OES_texture_float_linear' ); - _glExtensionStandardDerivatives = _gl.getExtension( 'OES_standard_derivatives' ); - - _glExtensionTextureFilterAnisotropic = _gl.getExtension( 'EXT_texture_filter_anisotropic' ) || _gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || _gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); - - _glExtensionCompressedTextureS3TC = _gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || _gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || _gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); - - if ( ! _glExtensionTextureFloat ) { - - console.log( 'THREE.WebGLRenderer: Float textures not supported.' ); - - } - - if ( ! _glExtensionStandardDerivatives ) { - - console.log( 'THREE.WebGLRenderer: Standard derivatives not supported.' ); - - } - - if ( ! _glExtensionTextureFilterAnisotropic ) { - - console.log( 'THREE.WebGLRenderer: Anisotropic texture filtering not supported.' ); - - } - - if ( ! _glExtensionCompressedTextureS3TC ) { - - console.log( 'THREE.WebGLRenderer: S3TC compressed textures not supported.' ); - - } - - if ( _gl.getShaderPrecisionFormat === undefined ) { - - _gl.getShaderPrecisionFormat = function() { - - return { - "rangeMin" : 1, - "rangeMax" : 1, - "precision" : 1 - }; - - } - } - - }; - - function setDefaultGLState () { - - _gl.clearColor( 0, 0, 0, 1 ); - _gl.clearDepth( 1 ); - _gl.clearStencil( 0 ); - - _gl.enable( _gl.DEPTH_TEST ); - _gl.depthFunc( _gl.LEQUAL ); - - _gl.frontFace( _gl.CCW ); - _gl.cullFace( _gl.BACK ); - _gl.enable( _gl.CULL_FACE ); - - _gl.enable( _gl.BLEND ); - _gl.blendEquation( _gl.FUNC_ADD ); - _gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA ); - - _gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight ); - - _gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); - - }; - - // default plugins (order is important) - - this.shadowMapPlugin = new THREE.ShadowMapPlugin(); - this.addPrePlugin( this.shadowMapPlugin ); - - this.addPostPlugin( new THREE.SpritePlugin() ); - this.addPostPlugin( new THREE.LensFlarePlugin() ); - -}; - -/** - * @author szimek / https://github.com/szimek/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.WebGLRenderTarget = function ( width, height, options ) { - - this.width = width; - this.height = height; - - options = options || {}; - - this.wrapS = options.wrapS !== undefined ? options.wrapS : THREE.ClampToEdgeWrapping; - this.wrapT = options.wrapT !== undefined ? options.wrapT : THREE.ClampToEdgeWrapping; - - this.magFilter = options.magFilter !== undefined ? options.magFilter : THREE.LinearFilter; - this.minFilter = options.minFilter !== undefined ? options.minFilter : THREE.LinearMipMapLinearFilter; - - this.anisotropy = options.anisotropy !== undefined ? options.anisotropy : 1; - - this.offset = new THREE.Vector2( 0, 0 ); - this.repeat = new THREE.Vector2( 1, 1 ); - - this.format = options.format !== undefined ? options.format : THREE.RGBAFormat; - this.type = options.type !== undefined ? options.type : THREE.UnsignedByteType; - - this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; - this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; - - this.generateMipmaps = true; - - this.shareDepthFrom = null; - -}; - -THREE.WebGLRenderTarget.prototype = { - - constructor: THREE.WebGLRenderTarget, - - clone: function () { - - var tmp = new THREE.WebGLRenderTarget( this.width, this.height ); - - tmp.wrapS = this.wrapS; - tmp.wrapT = this.wrapT; - - tmp.magFilter = this.magFilter; - tmp.minFilter = this.minFilter; - - tmp.anisotropy = this.anisotropy; - - tmp.offset.copy( this.offset ); - tmp.repeat.copy( this.repeat ); - - tmp.format = this.format; - tmp.type = this.type; - - tmp.depthBuffer = this.depthBuffer; - tmp.stencilBuffer = this.stencilBuffer; - - tmp.generateMipmaps = this.generateMipmaps; - - tmp.shareDepthFrom = this.shareDepthFrom; - - return tmp; - - }, - - dispose: function () { - - this.dispatchEvent( { type: 'dispose' } ); - - } - -}; - -THREE.EventDispatcher.prototype.apply( THREE.WebGLRenderTarget.prototype ); - -/** - * @author alteredq / http://alteredqualia.com - */ - -THREE.WebGLRenderTargetCube = function ( width, height, options ) { - - THREE.WebGLRenderTarget.call( this, width, height, options ); - - this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 - -}; - -THREE.WebGLRenderTargetCube.prototype = Object.create( THREE.WebGLRenderTarget.prototype ); - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.RenderableVertex = function () { - - this.position = new THREE.Vector3(); - this.positionWorld = new THREE.Vector3(); - this.positionScreen = new THREE.Vector4(); - - this.visible = true; - -}; - -THREE.RenderableVertex.prototype.copy = function ( vertex ) { - - this.positionWorld.copy( vertex.positionWorld ); - this.positionScreen.copy( vertex.positionScreen ); - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.RenderableFace = function () { - - this.id = 0; - - this.v1 = new THREE.RenderableVertex(); - this.v2 = new THREE.RenderableVertex(); - this.v3 = new THREE.RenderableVertex(); - - this.centroidModel = new THREE.Vector3(); - - this.normalModel = new THREE.Vector3(); - - this.vertexNormalsModel = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ]; - this.vertexNormalsLength = 0; - - this.color = null; - this.material = null; - this.uvs = [[]]; - - this.z = 0; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.RenderableObject = function () { - - this.id = 0; - - this.object = null; - this.z = 0; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.RenderableSprite = function () { - - this.id = 0; - - this.object = null; - - this.x = 0; - this.y = 0; - this.z = 0; - - this.rotation = 0; - this.scale = new THREE.Vector2(); - - this.material = null; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.RenderableLine = function () { - - this.id = 0; - - this.v1 = new THREE.RenderableVertex(); - this.v2 = new THREE.RenderableVertex(); - - this.vertexColors = [ new THREE.Color(), new THREE.Color() ]; - this.material = null; - - this.z = 0; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.GeometryUtils = { - - // Merge two geometries or geometry and geometry from object (using object's transform) - - merge: function ( geometry1, object2 /* mesh | geometry */, materialIndexOffset ) { - - var matrix, normalMatrix, - vertexOffset = geometry1.vertices.length, - uvPosition = geometry1.faceVertexUvs[ 0 ].length, - geometry2 = object2 instanceof THREE.Mesh ? object2.geometry : object2, - vertices1 = geometry1.vertices, - vertices2 = geometry2.vertices, - faces1 = geometry1.faces, - faces2 = geometry2.faces, - uvs1 = geometry1.faceVertexUvs[ 0 ], - uvs2 = geometry2.faceVertexUvs[ 0 ]; - - if ( materialIndexOffset === undefined ) materialIndexOffset = 0; - - if ( object2 instanceof THREE.Mesh ) { - - object2.matrixAutoUpdate && object2.updateMatrix(); - - matrix = object2.matrix; - - normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); - - } - - // vertices - - for ( var i = 0, il = vertices2.length; i < il; i ++ ) { - - var vertex = vertices2[ i ]; - - var vertexCopy = vertex.clone(); - - if ( matrix ) vertexCopy.applyMatrix4( matrix ); - - vertices1.push( vertexCopy ); - - } - - // faces - - for ( i = 0, il = faces2.length; i < il; i ++ ) { - - var face = faces2[ i ], faceCopy, normal, color, - faceVertexNormals = face.vertexNormals, - faceVertexColors = face.vertexColors; - - faceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); - faceCopy.normal.copy( face.normal ); - - if ( normalMatrix ) { - - faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); - - } - - for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { - - normal = faceVertexNormals[ j ].clone(); - - if ( normalMatrix ) { - - normal.applyMatrix3( normalMatrix ).normalize(); - - } - - faceCopy.vertexNormals.push( normal ); - - } - - faceCopy.color.copy( face.color ); - - for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { - - color = faceVertexColors[ j ]; - faceCopy.vertexColors.push( color.clone() ); - - } - - faceCopy.materialIndex = face.materialIndex + materialIndexOffset; - - faceCopy.centroid.copy( face.centroid ); - - if ( matrix ) { - - faceCopy.centroid.applyMatrix4( matrix ); - - } - - faces1.push( faceCopy ); - - } - - // uvs - - for ( i = 0, il = uvs2.length; i < il; i ++ ) { - - var uv = uvs2[ i ], uvCopy = []; - - for ( var j = 0, jl = uv.length; j < jl; j ++ ) { - - uvCopy.push( new THREE.Vector2( uv[ j ].x, uv[ j ].y ) ); - - } - - uvs1.push( uvCopy ); - - } - - }, - - // Get random point in triangle (via barycentric coordinates) - // (uniform distribution) - // http://www.cgafaq.info/wiki/Random_Point_In_Triangle - - randomPointInTriangle: function () { - - var vector = new THREE.Vector3(); - - return function ( vectorA, vectorB, vectorC ) { - - var point = new THREE.Vector3(); - - var a = THREE.Math.random16(); - var b = THREE.Math.random16(); - - if ( ( a + b ) > 1 ) { - - a = 1 - a; - b = 1 - b; - - } - - var c = 1 - a - b; - - point.copy( vectorA ); - point.multiplyScalar( a ); - - vector.copy( vectorB ); - vector.multiplyScalar( b ); - - point.add( vector ); - - vector.copy( vectorC ); - vector.multiplyScalar( c ); - - point.add( vector ); - - return point; - - }; - - }(), - - // Get random point in face (triangle / quad) - // (uniform distribution) - - randomPointInFace: function ( face, geometry, useCachedAreas ) { - - var vA, vB, vC, vD; - - vA = geometry.vertices[ face.a ]; - vB = geometry.vertices[ face.b ]; - vC = geometry.vertices[ face.c ]; - - return THREE.GeometryUtils.randomPointInTriangle( vA, vB, vC ); - - }, - - // Get uniformly distributed random points in mesh - // - create array with cumulative sums of face areas - // - pick random number from 0 to total area - // - find corresponding place in area array by binary search - // - get random point in face - - randomPointsInGeometry: function ( geometry, n ) { - - var face, i, - faces = geometry.faces, - vertices = geometry.vertices, - il = faces.length, - totalArea = 0, - cumulativeAreas = [], - vA, vB, vC, vD; - - // precompute face areas - - for ( i = 0; i < il; i ++ ) { - - face = faces[ i ]; - - vA = vertices[ face.a ]; - vB = vertices[ face.b ]; - vC = vertices[ face.c ]; - - face._area = THREE.GeometryUtils.triangleArea( vA, vB, vC ); - - totalArea += face._area; - - cumulativeAreas[ i ] = totalArea; - - } - - // binary search cumulative areas array - - function binarySearchIndices( value ) { - - function binarySearch( start, end ) { - - // return closest larger index - // if exact number is not found - - if ( end < start ) - return start; - - var mid = start + Math.floor( ( end - start ) / 2 ); - - if ( cumulativeAreas[ mid ] > value ) { - - return binarySearch( start, mid - 1 ); - - } else if ( cumulativeAreas[ mid ] < value ) { - - return binarySearch( mid + 1, end ); - - } else { - - return mid; - - } - - } - - var result = binarySearch( 0, cumulativeAreas.length - 1 ) - return result; - - } - - // pick random face weighted by face area - - var r, index, - result = []; - - var stats = {}; - - for ( i = 0; i < n; i ++ ) { - - r = THREE.Math.random16() * totalArea; - - index = binarySearchIndices( r ); - - result[ i ] = THREE.GeometryUtils.randomPointInFace( faces[ index ], geometry, true ); - - if ( ! stats[ index ] ) { - - stats[ index ] = 1; - - } else { - - stats[ index ] += 1; - - } - - } - - return result; - - }, - - // Get triangle area (half of parallelogram) - // http://mathworld.wolfram.com/TriangleArea.html - - triangleArea: function () { - - var vector1 = new THREE.Vector3(); - var vector2 = new THREE.Vector3(); - - return function ( vectorA, vectorB, vectorC ) { - - vector1.subVectors( vectorB, vectorA ); - vector2.subVectors( vectorC, vectorA ); - vector1.cross( vector2 ); - - return 0.5 * vector1.length(); - - }; - - }(), - - // Center geometry so that 0,0,0 is in center of bounding box - - center: function ( geometry ) { - - geometry.computeBoundingBox(); - - var bb = geometry.boundingBox; - - var offset = new THREE.Vector3(); - - offset.addVectors( bb.min, bb.max ); - offset.multiplyScalar( -0.5 ); - - geometry.applyMatrix( new THREE.Matrix4().makeTranslation( offset.x, offset.y, offset.z ) ); - geometry.computeBoundingBox(); - - return offset; - - }, - - triangulateQuads: function ( geometry ) { - - var i, il, j, jl; - - var faces = []; - var faceVertexUvs = []; - - for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) { - - faceVertexUvs[ i ] = []; - - } - - for ( i = 0, il = geometry.faces.length; i < il; i ++ ) { - - var face = geometry.faces[ i ]; - - faces.push( face ); - - for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) { - - faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] ); - - } - - } - - geometry.faces = faces; - geometry.faceVertexUvs = faceVertexUvs; - - geometry.computeCentroids(); - geometry.computeFaceNormals(); - geometry.computeVertexNormals(); - - if ( geometry.hasTangents ) geometry.computeTangents(); - - } - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.ImageUtils = { - - crossOrigin: undefined, - - loadTexture: function ( url, mapping, onLoad, onError ) { - - var loader = new THREE.ImageLoader(); - loader.crossOrigin = this.crossOrigin; - - var texture = new THREE.Texture( undefined, mapping ); - - var image = loader.load( url, function () { - - texture.needsUpdate = true; - - if ( onLoad ) onLoad( texture ); - - } ); - - texture.image = image; - texture.sourceFile = url; - - return texture; - - }, - - loadCompressedTexture: function ( url, mapping, onLoad, onError ) { - - var texture = new THREE.CompressedTexture(); - texture.mapping = mapping; - - var request = new XMLHttpRequest(); - - request.onload = function () { - - var buffer = request.response; - var dds = THREE.ImageUtils.parseDDS( buffer, true ); - - texture.format = dds.format; - - texture.mipmaps = dds.mipmaps; - texture.image.width = dds.width; - texture.image.height = dds.height; - - // gl.generateMipmap fails for compressed textures - // mipmaps must be embedded in the DDS file - // or texture filters must not use mipmapping - - texture.generateMipmaps = false; - - texture.needsUpdate = true; - - if ( onLoad ) onLoad( texture ); - - } - - request.onerror = onError; - - request.open( 'GET', url, true ); - request.responseType = "arraybuffer"; - request.send( null ); - - return texture; - - }, - - loadTextureCube: function ( array, mapping, onLoad, onError ) { - - var images = []; - images.loadCount = 0; - - var texture = new THREE.Texture(); - texture.image = images; - if ( mapping !== undefined ) texture.mapping = mapping; - - // no flipping needed for cube textures - - texture.flipY = false; - - for ( var i = 0, il = array.length; i < il; ++ i ) { - - var cubeImage = new Image(); - images[ i ] = cubeImage; - - cubeImage.onload = function () { - - images.loadCount += 1; - - if ( images.loadCount === 6 ) { - - texture.needsUpdate = true; - if ( onLoad ) onLoad( texture ); - - } - - }; - - cubeImage.onerror = onError; - - cubeImage.crossOrigin = this.crossOrigin; - cubeImage.src = array[ i ]; - - } - - return texture; - - }, - - loadCompressedTextureCube: function ( array, mapping, onLoad, onError ) { - - var images = []; - images.loadCount = 0; - - var texture = new THREE.CompressedTexture(); - texture.image = images; - if ( mapping !== undefined ) texture.mapping = mapping; - - // no flipping for cube textures - // (also flipping doesn't work for compressed textures ) - - texture.flipY = false; - - // can't generate mipmaps for compressed textures - // mips must be embedded in DDS files - - texture.generateMipmaps = false; - - var generateCubeFaceCallback = function ( rq, img ) { - - return function () { - - var buffer = rq.response; - var dds = THREE.ImageUtils.parseDDS( buffer, true ); - - img.format = dds.format; - - img.mipmaps = dds.mipmaps; - img.width = dds.width; - img.height = dds.height; - - images.loadCount += 1; - - if ( images.loadCount === 6 ) { - - texture.format = dds.format; - texture.needsUpdate = true; - if ( onLoad ) onLoad( texture ); - - } - - } - - } - - // compressed cubemap textures as 6 separate DDS files - - if ( array instanceof Array ) { - - for ( var i = 0, il = array.length; i < il; ++ i ) { - - var cubeImage = {}; - images[ i ] = cubeImage; - - var request = new XMLHttpRequest(); - - request.onload = generateCubeFaceCallback( request, cubeImage ); - request.onerror = onError; - - var url = array[ i ]; - - request.open( 'GET', url, true ); - request.responseType = "arraybuffer"; - request.send( null ); - - } - - // compressed cubemap texture stored in a single DDS file - - } else { - - var url = array; - var request = new XMLHttpRequest(); - - request.onload = function( ) { - - var buffer = request.response; - var dds = THREE.ImageUtils.parseDDS( buffer, true ); - - if ( dds.isCubemap ) { - - var faces = dds.mipmaps.length / dds.mipmapCount; - - for ( var f = 0; f < faces; f ++ ) { - - images[ f ] = { mipmaps : [] }; - - for ( var i = 0; i < dds.mipmapCount; i ++ ) { - - images[ f ].mipmaps.push( dds.mipmaps[ f * dds.mipmapCount + i ] ); - images[ f ].format = dds.format; - images[ f ].width = dds.width; - images[ f ].height = dds.height; - - } - - } - - texture.format = dds.format; - texture.needsUpdate = true; - if ( onLoad ) onLoad( texture ); - - } - - } - - request.onerror = onError; - - request.open( 'GET', url, true ); - request.responseType = "arraybuffer"; - request.send( null ); - - } - - return texture; - - }, - - loadDDSTexture: function ( url, mapping, onLoad, onError ) { - - var images = []; - images.loadCount = 0; - - var texture = new THREE.CompressedTexture(); - texture.image = images; - if ( mapping !== undefined ) texture.mapping = mapping; - - // no flipping for cube textures - // (also flipping doesn't work for compressed textures ) - - texture.flipY = false; - - // can't generate mipmaps for compressed textures - // mips must be embedded in DDS files - - texture.generateMipmaps = false; - - { - var request = new XMLHttpRequest(); - - request.onload = function( ) { - - var buffer = request.response; - var dds = THREE.ImageUtils.parseDDS( buffer, true ); - - if ( dds.isCubemap ) { - - var faces = dds.mipmaps.length / dds.mipmapCount; - - for ( var f = 0; f < faces; f ++ ) { - - images[ f ] = { mipmaps : [] }; - - for ( var i = 0; i < dds.mipmapCount; i ++ ) { - - images[ f ].mipmaps.push( dds.mipmaps[ f * dds.mipmapCount + i ] ); - images[ f ].format = dds.format; - images[ f ].width = dds.width; - images[ f ].height = dds.height; - - } - - } - - - } else { - texture.image.width = dds.width; - texture.image.height = dds.height; - texture.mipmaps = dds.mipmaps; - } - - texture.format = dds.format; - texture.needsUpdate = true; - if ( onLoad ) onLoad( texture ); - - } - - request.onerror = onError; - - request.open( 'GET', url, true ); - request.responseType = "arraybuffer"; - request.send( null ); - - } - - return texture; - - }, - - parseDDS: function ( buffer, loadMipmaps ) { - - var dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1 }; - - // Adapted from @toji's DDS utils - // https://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js - - // All values and structures referenced from: - // http://msdn.microsoft.com/en-us/library/bb943991.aspx/ - - var DDS_MAGIC = 0x20534444; - - var DDSD_CAPS = 0x1, - DDSD_HEIGHT = 0x2, - DDSD_WIDTH = 0x4, - DDSD_PITCH = 0x8, - DDSD_PIXELFORMAT = 0x1000, - DDSD_MIPMAPCOUNT = 0x20000, - DDSD_LINEARSIZE = 0x80000, - DDSD_DEPTH = 0x800000; - - var DDSCAPS_COMPLEX = 0x8, - DDSCAPS_MIPMAP = 0x400000, - DDSCAPS_TEXTURE = 0x1000; - - var DDSCAPS2_CUBEMAP = 0x200, - DDSCAPS2_CUBEMAP_POSITIVEX = 0x400, - DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800, - DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000, - DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000, - DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000, - DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000, - DDSCAPS2_VOLUME = 0x200000; - - var DDPF_ALPHAPIXELS = 0x1, - DDPF_ALPHA = 0x2, - DDPF_FOURCC = 0x4, - DDPF_RGB = 0x40, - DDPF_YUV = 0x200, - DDPF_LUMINANCE = 0x20000; - - function fourCCToInt32( value ) { - - return value.charCodeAt(0) + - (value.charCodeAt(1) << 8) + - (value.charCodeAt(2) << 16) + - (value.charCodeAt(3) << 24); - - } - - function int32ToFourCC( value ) { - - return String.fromCharCode( - value & 0xff, - (value >> 8) & 0xff, - (value >> 16) & 0xff, - (value >> 24) & 0xff - ); - } - - function loadARGBMip( buffer, dataOffset, width, height ) { - var dataLength = width*height*4; - var srcBuffer = new Uint8Array( buffer, dataOffset, dataLength ); - var byteArray = new Uint8Array( dataLength ); - var dst = 0; - var src = 0; - for ( var y = 0; y < height; y++ ) { - for ( var x = 0; x < width; x++ ) { - var b = srcBuffer[src]; src++; - var g = srcBuffer[src]; src++; - var r = srcBuffer[src]; src++; - var a = srcBuffer[src]; src++; - byteArray[dst] = r; dst++; //r - byteArray[dst] = g; dst++; //g - byteArray[dst] = b; dst++; //b - byteArray[dst] = a; dst++; //a - } - } - return byteArray; - } - - var FOURCC_DXT1 = fourCCToInt32("DXT1"); - var FOURCC_DXT3 = fourCCToInt32("DXT3"); - var FOURCC_DXT5 = fourCCToInt32("DXT5"); - - var headerLengthInt = 31; // The header length in 32 bit ints - - // Offsets into the header array - - var off_magic = 0; - - var off_size = 1; - var off_flags = 2; - var off_height = 3; - var off_width = 4; - - var off_mipmapCount = 7; - - var off_pfFlags = 20; - var off_pfFourCC = 21; - var off_RGBBitCount = 22; - var off_RBitMask = 23; - var off_GBitMask = 24; - var off_BBitMask = 25; - var off_ABitMask = 26; - - var off_caps = 27; - var off_caps2 = 28; - var off_caps3 = 29; - var off_caps4 = 30; - - // Parse header - - var header = new Int32Array( buffer, 0, headerLengthInt ); - - if ( header[ off_magic ] !== DDS_MAGIC ) { - - console.error( "ImageUtils.parseDDS(): Invalid magic number in DDS header" ); - return dds; - - } - - if ( ! header[ off_pfFlags ] & DDPF_FOURCC ) { - - console.error( "ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code" ); - return dds; - - } - - var blockBytes; - - var fourCC = header[ off_pfFourCC ]; - - var isRGBAUncompressed = false; - - switch ( fourCC ) { - - case FOURCC_DXT1: - - blockBytes = 8; - dds.format = THREE.RGB_S3TC_DXT1_Format; - break; - - case FOURCC_DXT3: - - blockBytes = 16; - dds.format = THREE.RGBA_S3TC_DXT3_Format; - break; - - case FOURCC_DXT5: - - blockBytes = 16; - dds.format = THREE.RGBA_S3TC_DXT5_Format; - break; - - default: - - if( header[off_RGBBitCount] ==32 - && header[off_RBitMask]&0xff0000 - && header[off_GBitMask]&0xff00 - && header[off_BBitMask]&0xff - && header[off_ABitMask]&0xff000000 ) { - isRGBAUncompressed = true; - blockBytes = 64; - dds.format = THREE.RGBAFormat; - } else { - console.error( "ImageUtils.parseDDS(): Unsupported FourCC code: ", int32ToFourCC( fourCC ) ); - return dds; - } - } - - dds.mipmapCount = 1; - - if ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) { - - dds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] ); - - } - - //TODO: Verify that all faces of the cubemap are present with DDSCAPS2_CUBEMAP_POSITIVEX, etc. - - dds.isCubemap = header[ off_caps2 ] & DDSCAPS2_CUBEMAP ? true : false; - - dds.width = header[ off_width ]; - dds.height = header[ off_height ]; - - var dataOffset = header[ off_size ] + 4; - - // Extract mipmaps buffers - - var width = dds.width; - var height = dds.height; - - var faces = dds.isCubemap ? 6 : 1; - - for ( var face = 0; face < faces; face ++ ) { - - for ( var i = 0; i < dds.mipmapCount; i ++ ) { - - if( isRGBAUncompressed ) { - var byteArray = loadARGBMip( buffer, dataOffset, width, height ); - var dataLength = byteArray.length; - } else { - var dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes; - var byteArray = new Uint8Array( buffer, dataOffset, dataLength ); - } - - var mipmap = { "data": byteArray, "width": width, "height": height }; - dds.mipmaps.push( mipmap ); - - dataOffset += dataLength; - - width = Math.max( width * 0.5, 1 ); - height = Math.max( height * 0.5, 1 ); - - } - - width = dds.width; - height = dds.height; - - } - - return dds; - - }, - - getNormalMap: function ( image, depth ) { - - // Adapted from http://www.paulbrunt.co.uk/lab/heightnormal/ - - var cross = function ( a, b ) { - - return [ a[ 1 ] * b[ 2 ] - a[ 2 ] * b[ 1 ], a[ 2 ] * b[ 0 ] - a[ 0 ] * b[ 2 ], a[ 0 ] * b[ 1 ] - a[ 1 ] * b[ 0 ] ]; - - } - - var subtract = function ( a, b ) { - - return [ a[ 0 ] - b[ 0 ], a[ 1 ] - b[ 1 ], a[ 2 ] - b[ 2 ] ]; - - } - - var normalize = function ( a ) { - - var l = Math.sqrt( a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ] ); - return [ a[ 0 ] / l, a[ 1 ] / l, a[ 2 ] / l ]; - - } - - depth = depth | 1; - - var width = image.width; - var height = image.height; - - var canvas = document.createElement( 'canvas' ); - canvas.width = width; - canvas.height = height; - - var context = canvas.getContext( '2d' ); - context.drawImage( image, 0, 0 ); - - var data = context.getImageData( 0, 0, width, height ).data; - var imageData = context.createImageData( width, height ); - var output = imageData.data; - - for ( var x = 0; x < width; x ++ ) { - - for ( var y = 0; y < height; y ++ ) { - - var ly = y - 1 < 0 ? 0 : y - 1; - var uy = y + 1 > height - 1 ? height - 1 : y + 1; - var lx = x - 1 < 0 ? 0 : x - 1; - var ux = x + 1 > width - 1 ? width - 1 : x + 1; - - var points = []; - var origin = [ 0, 0, data[ ( y * width + x ) * 4 ] / 255 * depth ]; - points.push( [ - 1, 0, data[ ( y * width + lx ) * 4 ] / 255 * depth ] ); - points.push( [ - 1, - 1, data[ ( ly * width + lx ) * 4 ] / 255 * depth ] ); - points.push( [ 0, - 1, data[ ( ly * width + x ) * 4 ] / 255 * depth ] ); - points.push( [ 1, - 1, data[ ( ly * width + ux ) * 4 ] / 255 * depth ] ); - points.push( [ 1, 0, data[ ( y * width + ux ) * 4 ] / 255 * depth ] ); - points.push( [ 1, 1, data[ ( uy * width + ux ) * 4 ] / 255 * depth ] ); - points.push( [ 0, 1, data[ ( uy * width + x ) * 4 ] / 255 * depth ] ); - points.push( [ - 1, 1, data[ ( uy * width + lx ) * 4 ] / 255 * depth ] ); - - var normals = []; - var num_points = points.length; - - for ( var i = 0; i < num_points; i ++ ) { - - var v1 = points[ i ]; - var v2 = points[ ( i + 1 ) % num_points ]; - v1 = subtract( v1, origin ); - v2 = subtract( v2, origin ); - normals.push( normalize( cross( v1, v2 ) ) ); - - } - - var normal = [ 0, 0, 0 ]; - - for ( var i = 0; i < normals.length; i ++ ) { - - normal[ 0 ] += normals[ i ][ 0 ]; - normal[ 1 ] += normals[ i ][ 1 ]; - normal[ 2 ] += normals[ i ][ 2 ]; - - } - - normal[ 0 ] /= normals.length; - normal[ 1 ] /= normals.length; - normal[ 2 ] /= normals.length; - - var idx = ( y * width + x ) * 4; - - output[ idx ] = ( ( normal[ 0 ] + 1.0 ) / 2.0 * 255 ) | 0; - output[ idx + 1 ] = ( ( normal[ 1 ] + 1.0 ) / 2.0 * 255 ) | 0; - output[ idx + 2 ] = ( normal[ 2 ] * 255 ) | 0; - output[ idx + 3 ] = 255; - - } - - } - - context.putImageData( imageData, 0, 0 ); - - return canvas; - - }, - - generateDataTexture: function ( width, height, color ) { - - var size = width * height; - var data = new Uint8Array( 3 * size ); - - var r = Math.floor( color.r * 255 ); - var g = Math.floor( color.g * 255 ); - var b = Math.floor( color.b * 255 ); - - for ( var i = 0; i < size; i ++ ) { - - data[ i * 3 ] = r; - data[ i * 3 + 1 ] = g; - data[ i * 3 + 2 ] = b; - - } - - var texture = new THREE.DataTexture( data, width, height, THREE.RGBFormat ); - texture.needsUpdate = true; - - return texture; - - } - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SceneUtils = { - - createMultiMaterialObject: function ( geometry, materials ) { - - var group = new THREE.Object3D(); - - for ( var i = 0, l = materials.length; i < l; i ++ ) { - - group.add( new THREE.Mesh( geometry, materials[ i ] ) ); - - } - - return group; - - }, - - detach : function ( child, parent, scene ) { - - child.applyMatrix( parent.matrixWorld ); - parent.remove( child ); - scene.add( child ); - - }, - - attach: function ( child, scene, parent ) { - - var matrixWorldInverse = new THREE.Matrix4(); - matrixWorldInverse.getInverse( parent.matrixWorld ); - child.applyMatrix( matrixWorldInverse ); - - scene.remove( child ); - parent.add( child ); - - } - -}; - -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * @author alteredq / http://alteredqualia.com/ - * - * For Text operations in three.js (See TextGeometry) - * - * It uses techniques used in: - * - * typeface.js and canvastext - * For converting fonts and rendering with javascript - * http://typeface.neocracy.org - * - * Triangulation ported from AS3 - * Simple Polygon Triangulation - * http://actionsnippet.com/?p=1462 - * - * A Method to triangulate shapes with holes - * http://www.sakri.net/blog/2009/06/12/an-approach-to-triangulating-polygons-with-holes/ - * - */ - -THREE.FontUtils = { - - faces : {}, - - // Just for now. face[weight][style] - - face : "helvetiker", - weight: "normal", - style : "normal", - size : 150, - divisions : 10, - - getFace : function() { - - return this.faces[ this.face ][ this.weight ][ this.style ]; - - }, - - loadFace : function( data ) { - - var family = data.familyName.toLowerCase(); - - var ThreeFont = this; - - ThreeFont.faces[ family ] = ThreeFont.faces[ family ] || {}; - - ThreeFont.faces[ family ][ data.cssFontWeight ] = ThreeFont.faces[ family ][ data.cssFontWeight ] || {}; - ThreeFont.faces[ family ][ data.cssFontWeight ][ data.cssFontStyle ] = data; - - var face = ThreeFont.faces[ family ][ data.cssFontWeight ][ data.cssFontStyle ] = data; - - return data; - - }, - - drawText : function( text ) { - - var characterPts = [], allPts = []; - - // RenderText - - var i, p, - face = this.getFace(), - scale = this.size / face.resolution, - offset = 0, - chars = String( text ).split( '' ), - length = chars.length; - - var fontPaths = []; - - for ( i = 0; i < length; i ++ ) { - - var path = new THREE.Path(); - - var ret = this.extractGlyphPoints( chars[ i ], face, scale, offset, path ); - offset += ret.offset; - - fontPaths.push( ret.path ); - - } - - // get the width - - var width = offset / 2; - // - // for ( p = 0; p < allPts.length; p++ ) { - // - // allPts[ p ].x -= width; - // - // } - - //var extract = this.extractPoints( allPts, characterPts ); - //extract.contour = allPts; - - //extract.paths = fontPaths; - //extract.offset = width; - - return { paths : fontPaths, offset : width }; - - }, - - - - - extractGlyphPoints : function( c, face, scale, offset, path ) { - - var pts = []; - - var i, i2, divisions, - outline, action, length, - scaleX, scaleY, - x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, - laste, - glyph = face.glyphs[ c ] || face.glyphs[ '?' ]; - - if ( !glyph ) return; - - if ( glyph.o ) { - - outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); - length = outline.length; - - scaleX = scale; - scaleY = scale; - - for ( i = 0; i < length; ) { - - action = outline[ i ++ ]; - - //console.log( action ); - - switch( action ) { - - case 'm': - - // Move To - - x = outline[ i++ ] * scaleX + offset; - y = outline[ i++ ] * scaleY; - - path.moveTo( x, y ); - break; - - case 'l': - - // Line To - - x = outline[ i++ ] * scaleX + offset; - y = outline[ i++ ] * scaleY; - path.lineTo(x,y); - break; - - case 'q': - - // QuadraticCurveTo - - cpx = outline[ i++ ] * scaleX + offset; - cpy = outline[ i++ ] * scaleY; - cpx1 = outline[ i++ ] * scaleX + offset; - cpy1 = outline[ i++ ] * scaleY; - - path.quadraticCurveTo(cpx1, cpy1, cpx, cpy); - - laste = pts[ pts.length - 1 ]; - - if ( laste ) { - - cpx0 = laste.x; - cpy0 = laste.y; - - for ( i2 = 1, divisions = this.divisions; i2 <= divisions; i2 ++ ) { - - var t = i2 / divisions; - var tx = THREE.Shape.Utils.b2( t, cpx0, cpx1, cpx ); - var ty = THREE.Shape.Utils.b2( t, cpy0, cpy1, cpy ); - } - - } - - break; - - case 'b': - - // Cubic Bezier Curve - - cpx = outline[ i++ ] * scaleX + offset; - cpy = outline[ i++ ] * scaleY; - cpx1 = outline[ i++ ] * scaleX + offset; - cpy1 = outline[ i++ ] * -scaleY; - cpx2 = outline[ i++ ] * scaleX + offset; - cpy2 = outline[ i++ ] * -scaleY; - - path.bezierCurveTo( cpx, cpy, cpx1, cpy1, cpx2, cpy2 ); - - laste = pts[ pts.length - 1 ]; - - if ( laste ) { - - cpx0 = laste.x; - cpy0 = laste.y; - - for ( i2 = 1, divisions = this.divisions; i2 <= divisions; i2 ++ ) { - - var t = i2 / divisions; - var tx = THREE.Shape.Utils.b3( t, cpx0, cpx1, cpx2, cpx ); - var ty = THREE.Shape.Utils.b3( t, cpy0, cpy1, cpy2, cpy ); - - } - - } - - break; - - } - - } - } - - - - return { offset: glyph.ha*scale, path:path}; - } - -}; - - -THREE.FontUtils.generateShapes = function( text, parameters ) { - - // Parameters - - parameters = parameters || {}; - - var size = parameters.size !== undefined ? parameters.size : 100; - var curveSegments = parameters.curveSegments !== undefined ? parameters.curveSegments: 4; - - var font = parameters.font !== undefined ? parameters.font : "helvetiker"; - var weight = parameters.weight !== undefined ? parameters.weight : "normal"; - var style = parameters.style !== undefined ? parameters.style : "normal"; - - THREE.FontUtils.size = size; - THREE.FontUtils.divisions = curveSegments; - - THREE.FontUtils.face = font; - THREE.FontUtils.weight = weight; - THREE.FontUtils.style = style; - - // Get a Font data json object - - var data = THREE.FontUtils.drawText( text ); - - var paths = data.paths; - var shapes = []; - - for ( var p = 0, pl = paths.length; p < pl; p ++ ) { - - Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); - - } - - return shapes; - -}; - - -/** - * This code is a quick port of code written in C++ which was submitted to - * flipcode.com by John W. Ratcliff // July 22, 2000 - * See original code and more information here: - * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml - * - * ported to actionscript by Zevan Rosser - * www.actionsnippet.com - * - * ported to javascript by Joshua Koo - * http://www.lab4games.net/zz85/blog - * - */ - - -( function( namespace ) { - - var EPSILON = 0.0000000001; - - // takes in an contour array and returns - - var process = function( contour, indices ) { - - var n = contour.length; - - if ( n < 3 ) return null; - - var result = [], - verts = [], - vertIndices = []; - - /* we want a counter-clockwise polygon in verts */ - - var u, v, w; - - if ( area( contour ) > 0.0 ) { - - for ( v = 0; v < n; v++ ) verts[ v ] = v; - - } else { - - for ( v = 0; v < n; v++ ) verts[ v ] = ( n - 1 ) - v; - - } - - var nv = n; - - /* remove nv - 2 vertices, creating 1 triangle every time */ - - var count = 2 * nv; /* error detection */ - - for( v = nv - 1; nv > 2; ) { - - /* if we loop, it is probably a non-simple polygon */ - - if ( ( count-- ) <= 0 ) { - - //** Triangulate: ERROR - probable bad polygon! - - //throw ( "Warning, unable to triangulate polygon!" ); - //return null; - // Sometimes warning is fine, especially polygons are triangulated in reverse. - console.log( "Warning, unable to triangulate polygon!" ); - - if ( indices ) return vertIndices; - return result; - - } - - /* three consecutive vertices in current polygon, */ - - u = v; if ( nv <= u ) u = 0; /* previous */ - v = u + 1; if ( nv <= v ) v = 0; /* new v */ - w = v + 1; if ( nv <= w ) w = 0; /* next */ - - if ( snip( contour, u, v, w, nv, verts ) ) { - - var a, b, c, s, t; - - /* true names of the vertices */ - - a = verts[ u ]; - b = verts[ v ]; - c = verts[ w ]; - - /* output Triangle */ - - result.push( [ contour[ a ], - contour[ b ], - contour[ c ] ] ); - - - vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); - - /* remove v from the remaining polygon */ - - for( s = v, t = v + 1; t < nv; s++, t++ ) { - - verts[ s ] = verts[ t ]; - - } - - nv--; - - /* reset error detection counter */ - - count = 2 * nv; - - } - - } - - if ( indices ) return vertIndices; - return result; - - }; - - // calculate area of the contour polygon - - var area = function ( contour ) { - - var n = contour.length; - var a = 0.0; - - for( var p = n - 1, q = 0; q < n; p = q++ ) { - - a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; - - } - - return a * 0.5; - - }; - - var snip = function ( contour, u, v, w, n, verts ) { - - var p; - var ax, ay, bx, by; - var cx, cy, px, py; - - ax = contour[ verts[ u ] ].x; - ay = contour[ verts[ u ] ].y; - - bx = contour[ verts[ v ] ].x; - by = contour[ verts[ v ] ].y; - - cx = contour[ verts[ w ] ].x; - cy = contour[ verts[ w ] ].y; - - if ( EPSILON > (((bx-ax)*(cy-ay)) - ((by-ay)*(cx-ax))) ) return false; - - var aX, aY, bX, bY, cX, cY; - var apx, apy, bpx, bpy, cpx, cpy; - var cCROSSap, bCROSScp, aCROSSbp; - - aX = cx - bx; aY = cy - by; - bX = ax - cx; bY = ay - cy; - cX = bx - ax; cY = by - ay; - - for ( p = 0; p < n; p++ ) { - - px = contour[ verts[ p ] ].x - py = contour[ verts[ p ] ].y - - if ( ( (px === ax) && (py === ay) ) || - ( (px === bx) && (py === by) ) || - ( (px === cx) && (py === cy) ) ) continue; - - apx = px - ax; apy = py - ay; - bpx = px - bx; bpy = py - by; - cpx = px - cx; cpy = py - cy; - - // see if p is inside triangle abc - - aCROSSbp = aX*bpy - aY*bpx; - cCROSSap = cX*apy - cY*apx; - bCROSScp = bX*cpy - bY*cpx; - - if ( (aCROSSbp >= -EPSILON) && (bCROSScp >= -EPSILON) && (cCROSSap >= -EPSILON) ) return false; - - } - - return true; - - }; - - - namespace.Triangulate = process; - namespace.Triangulate.area = area; - - return namespace; - -})(THREE.FontUtils); - -// To use the typeface.js face files, hook up the API -self._typeface_js = { faces: THREE.FontUtils.faces, loadFace: THREE.FontUtils.loadFace }; -THREE.typeface_js = self._typeface_js; - -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * Extensible curve object - * - * Some common of Curve methods - * .getPoint(t), getTangent(t) - * .getPointAt(u), getTagentAt(u) - * .getPoints(), .getSpacedPoints() - * .getLength() - * .updateArcLengths() - * - * This following classes subclasses THREE.Curve: - * - * -- 2d classes -- - * THREE.LineCurve - * THREE.QuadraticBezierCurve - * THREE.CubicBezierCurve - * THREE.SplineCurve - * THREE.ArcCurve - * THREE.EllipseCurve - * - * -- 3d classes -- - * THREE.LineCurve3 - * THREE.QuadraticBezierCurve3 - * THREE.CubicBezierCurve3 - * THREE.SplineCurve3 - * THREE.ClosedSplineCurve3 - * - * A series of curves can be represented as a THREE.CurvePath - * - **/ - -/************************************************************** - * Abstract Curve base class - **************************************************************/ - -THREE.Curve = function () { - -}; - -// Virtual base class method to overwrite and implement in subclasses -// - t [0 .. 1] - -THREE.Curve.prototype.getPoint = function ( t ) { - - console.log( "Warning, getPoint() not implemented!" ); - return null; - -}; - -// Get point at relative position in curve according to arc length -// - u [0 .. 1] - -THREE.Curve.prototype.getPointAt = function ( u ) { - - var t = this.getUtoTmapping( u ); - return this.getPoint( t ); - -}; - -// Get sequence of points using getPoint( t ) - -THREE.Curve.prototype.getPoints = function ( divisions ) { - - if ( !divisions ) divisions = 5; - - var d, pts = []; - - for ( d = 0; d <= divisions; d ++ ) { - - pts.push( this.getPoint( d / divisions ) ); - - } - - return pts; - -}; - -// Get sequence of points using getPointAt( u ) - -THREE.Curve.prototype.getSpacedPoints = function ( divisions ) { - - if ( !divisions ) divisions = 5; - - var d, pts = []; - - for ( d = 0; d <= divisions; d ++ ) { - - pts.push( this.getPointAt( d / divisions ) ); - - } - - return pts; - -}; - -// Get total curve arc length - -THREE.Curve.prototype.getLength = function () { - - var lengths = this.getLengths(); - return lengths[ lengths.length - 1 ]; - -}; - -// Get list of cumulative segment lengths - -THREE.Curve.prototype.getLengths = function ( divisions ) { - - if ( !divisions ) divisions = (this.__arcLengthDivisions) ? (this.__arcLengthDivisions): 200; - - if ( this.cacheArcLengths - && ( this.cacheArcLengths.length == divisions + 1 ) - && !this.needsUpdate) { - - //console.log( "cached", this.cacheArcLengths ); - return this.cacheArcLengths; - - } - - this.needsUpdate = false; - - var cache = []; - var current, last = this.getPoint( 0 ); - var p, sum = 0; - - cache.push( 0 ); - - for ( p = 1; p <= divisions; p ++ ) { - - current = this.getPoint ( p / divisions ); - sum += current.distanceTo( last ); - cache.push( sum ); - last = current; - - } - - this.cacheArcLengths = cache; - - return cache; // { sums: cache, sum:sum }; Sum is in the last element. - -}; - - -THREE.Curve.prototype.updateArcLengths = function() { - this.needsUpdate = true; - this.getLengths(); -}; - -// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equi distance - -THREE.Curve.prototype.getUtoTmapping = function ( u, distance ) { - - var arcLengths = this.getLengths(); - - var i = 0, il = arcLengths.length; - - var targetArcLength; // The targeted u distance value to get - - if ( distance ) { - - targetArcLength = distance; - - } else { - - targetArcLength = u * arcLengths[ il - 1 ]; - - } - - //var time = Date.now(); - - // binary search for the index with largest value smaller than target u distance - - var low = 0, high = il - 1, comparison; - - while ( low <= high ) { - - i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats - - comparison = arcLengths[ i ] - targetArcLength; - - if ( comparison < 0 ) { - - low = i + 1; - continue; - - } else if ( comparison > 0 ) { - - high = i - 1; - continue; - - } else { - - high = i; - break; - - // DONE - - } - - } - - i = high; - - //console.log('b' , i, low, high, Date.now()- time); - - if ( arcLengths[ i ] == targetArcLength ) { - - var t = i / ( il - 1 ); - return t; - - } - - // we could get finer grain at lengths, or use simple interpolatation between two points - - var lengthBefore = arcLengths[ i ]; - var lengthAfter = arcLengths[ i + 1 ]; - - var segmentLength = lengthAfter - lengthBefore; - - // determine where we are between the 'before' and 'after' points - - var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; - - // add that fractional amount to t - - var t = ( i + segmentFraction ) / ( il -1 ); - - return t; - -}; - -// Returns a unit vector tangent at t -// In case any sub curve does not implement its tangent derivation, -// 2 points a small delta apart will be used to find its gradient -// which seems to give a reasonable approximation - -THREE.Curve.prototype.getTangent = function( t ) { - - var delta = 0.0001; - var t1 = t - delta; - var t2 = t + delta; - - // Capping in case of danger - - if ( t1 < 0 ) t1 = 0; - if ( t2 > 1 ) t2 = 1; - - var pt1 = this.getPoint( t1 ); - var pt2 = this.getPoint( t2 ); - - var vec = pt2.clone().sub(pt1); - return vec.normalize(); - -}; - - -THREE.Curve.prototype.getTangentAt = function ( u ) { - - var t = this.getUtoTmapping( u ); - return this.getTangent( t ); - -}; - - - - - -/************************************************************** - * Utils - **************************************************************/ - -THREE.Curve.Utils = { - - tangentQuadraticBezier: function ( t, p0, p1, p2 ) { - - return 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 ); - - }, - - // Puay Bing, thanks for helping with this derivative! - - tangentCubicBezier: function (t, p0, p1, p2, p3 ) { - - return -3 * p0 * (1 - t) * (1 - t) + - 3 * p1 * (1 - t) * (1-t) - 6 *t *p1 * (1-t) + - 6 * t * p2 * (1-t) - 3 * t * t * p2 + - 3 * t * t * p3; - }, - - - tangentSpline: function ( t, p0, p1, p2, p3 ) { - - // To check if my formulas are correct - - var h00 = 6 * t * t - 6 * t; // derived from 2t^3 − 3t^2 + 1 - var h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t - var h01 = -6 * t * t + 6 * t; // − 2t3 + 3t2 - var h11 = 3 * t * t - 2 * t; // t3 − t2 - - return h00 + h10 + h01 + h11; - - }, - - // Catmull-Rom - - interpolate: function( p0, p1, p2, p3, t ) { - - var v0 = ( p2 - p0 ) * 0.5; - var v1 = ( p3 - p1 ) * 0.5; - var t2 = t * t; - var t3 = t * t2; - return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; - - } - -}; - - -// TODO: Transformation for Curves? - -/************************************************************** - * 3D Curves - **************************************************************/ - -// A Factory method for creating new curve subclasses - -THREE.Curve.create = function ( constructor, getPointFunc ) { - - constructor.prototype = Object.create( THREE.Curve.prototype ); - constructor.prototype.getPoint = getPointFunc; - - return constructor; - -}; - -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * - **/ - -/************************************************************** - * Curved Path - a curve path is simply a array of connected - * curves, but retains the api of a curve - **************************************************************/ - -THREE.CurvePath = function () { - - this.curves = []; - this.bends = []; - - this.autoClose = false; // Automatically closes the path -}; - -THREE.CurvePath.prototype = Object.create( THREE.Curve.prototype ); - -THREE.CurvePath.prototype.add = function ( curve ) { - - this.curves.push( curve ); - -}; - -THREE.CurvePath.prototype.checkConnection = function() { - // TODO - // If the ending of curve is not connected to the starting - // or the next curve, then, this is not a real path -}; - -THREE.CurvePath.prototype.closePath = function() { - // TODO Test - // and verify for vector3 (needs to implement equals) - // Add a line curve if start and end of lines are not connected - var startPoint = this.curves[0].getPoint(0); - var endPoint = this.curves[this.curves.length-1].getPoint(1); - - if (!startPoint.equals(endPoint)) { - this.curves.push( new THREE.LineCurve(endPoint, startPoint) ); - } - -}; - -// To get accurate point with reference to -// entire path distance at time t, -// following has to be done: - -// 1. Length of each sub path have to be known -// 2. Locate and identify type of curve -// 3. Get t for the curve -// 4. Return curve.getPointAt(t') - -THREE.CurvePath.prototype.getPoint = function( t ) { - - var d = t * this.getLength(); - var curveLengths = this.getCurveLengths(); - var i = 0, diff, curve; - - // To think about boundaries points. - - while ( i < curveLengths.length ) { - - if ( curveLengths[ i ] >= d ) { - - diff = curveLengths[ i ] - d; - curve = this.curves[ i ]; - - var u = 1 - diff / curve.getLength(); - - return curve.getPointAt( u ); - - break; - } - - i ++; - - } - - return null; - - // loop where sum != 0, sum > d , sum+1 maxX ) maxX = p.x; - else if ( p.x < minX ) minX = p.x; - - if ( p.y > maxY ) maxY = p.y; - else if ( p.y < minY ) minY = p.y; - - if ( v3 ) { - - if ( p.z > maxZ ) maxZ = p.z; - else if ( p.z < minZ ) minZ = p.z; - - } - - sum.add( p ); - - } - - var ret = { - - minX: minX, - minY: minY, - maxX: maxX, - maxY: maxY, - centroid: sum.divideScalar( il ) - - }; - - if ( v3 ) { - - ret.maxZ = maxZ; - ret.minZ = minZ; - - } - - return ret; - -}; - -/************************************************************** - * Create Geometries Helpers - **************************************************************/ - -/// Generate geometry from path points (for Line or ParticleSystem objects) - -THREE.CurvePath.prototype.createPointsGeometry = function( divisions ) { - - var pts = this.getPoints( divisions, true ); - return this.createGeometry( pts ); - -}; - -// Generate geometry from equidistance sampling along the path - -THREE.CurvePath.prototype.createSpacedPointsGeometry = function( divisions ) { - - var pts = this.getSpacedPoints( divisions, true ); - return this.createGeometry( pts ); - -}; - -THREE.CurvePath.prototype.createGeometry = function( points ) { - - var geometry = new THREE.Geometry(); - - for ( var i = 0; i < points.length; i ++ ) { - - geometry.vertices.push( new THREE.Vector3( points[ i ].x, points[ i ].y, points[ i ].z || 0) ); - - } - - return geometry; - -}; - - -/************************************************************** - * Bend / Wrap Helper Methods - **************************************************************/ - -// Wrap path / Bend modifiers? - -THREE.CurvePath.prototype.addWrapPath = function ( bendpath ) { - - this.bends.push( bendpath ); - -}; - -THREE.CurvePath.prototype.getTransformedPoints = function( segments, bends ) { - - var oldPts = this.getPoints( segments ); // getPoints getSpacedPoints - var i, il; - - if ( !bends ) { - - bends = this.bends; - - } - - for ( i = 0, il = bends.length; i < il; i ++ ) { - - oldPts = this.getWrapPoints( oldPts, bends[ i ] ); - - } - - return oldPts; - -}; - -THREE.CurvePath.prototype.getTransformedSpacedPoints = function( segments, bends ) { - - var oldPts = this.getSpacedPoints( segments ); - - var i, il; - - if ( !bends ) { - - bends = this.bends; - - } - - for ( i = 0, il = bends.length; i < il; i ++ ) { - - oldPts = this.getWrapPoints( oldPts, bends[ i ] ); - - } - - return oldPts; - -}; - -// This returns getPoints() bend/wrapped around the contour of a path. -// Read http://www.planetclegg.com/projects/WarpingTextToSplines.html - -THREE.CurvePath.prototype.getWrapPoints = function ( oldPts, path ) { - - var bounds = this.getBoundingBox(); - - var i, il, p, oldX, oldY, xNorm; - - for ( i = 0, il = oldPts.length; i < il; i ++ ) { - - p = oldPts[ i ]; - - oldX = p.x; - oldY = p.y; - - xNorm = oldX / bounds.maxX; - - // If using actual distance, for length > path, requires line extrusions - //xNorm = path.getUtoTmapping(xNorm, oldX); // 3 styles. 1) wrap stretched. 2) wrap stretch by arc length 3) warp by actual distance - - xNorm = path.getUtoTmapping( xNorm, oldX ); - - // check for out of bounds? - - var pathPt = path.getPoint( xNorm ); - var normal = path.getTangent( xNorm ); - normal.set( -normal.y, normal.x ).multiplyScalar( oldY ); - - p.x = pathPt.x + normal.x; - p.y = pathPt.y + normal.y; - - } - - return oldPts; - -}; - - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Gyroscope = function () { - - THREE.Object3D.call( this ); - -}; - -THREE.Gyroscope.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.Gyroscope.prototype.updateMatrixWorld = function ( force ) { - - this.matrixAutoUpdate && this.updateMatrix(); - - // update matrixWorld - - if ( this.matrixWorldNeedsUpdate || force ) { - - if ( this.parent ) { - - this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); - - this.matrixWorld.decompose( this.translationWorld, this.quaternionWorld, this.scaleWorld ); - this.matrix.decompose( this.translationObject, this.quaternionObject, this.scaleObject ); - - this.matrixWorld.compose( this.translationWorld, this.quaternionObject, this.scaleWorld ); - - - } else { - - this.matrixWorld.copy( this.matrix ); - - } - - - this.matrixWorldNeedsUpdate = false; - - force = true; - - } - - // update children - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - this.children[ i ].updateMatrixWorld( force ); - - } - -}; - -THREE.Gyroscope.prototype.translationWorld = new THREE.Vector3(); -THREE.Gyroscope.prototype.translationObject = new THREE.Vector3(); -THREE.Gyroscope.prototype.quaternionWorld = new THREE.Quaternion(); -THREE.Gyroscope.prototype.quaternionObject = new THREE.Quaternion(); -THREE.Gyroscope.prototype.scaleWorld = new THREE.Vector3(); -THREE.Gyroscope.prototype.scaleObject = new THREE.Vector3(); - - -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * Creates free form 2d path using series of points, lines or curves. - * - **/ - -THREE.Path = function ( points ) { - - THREE.CurvePath.call(this); - - this.actions = []; - - if ( points ) { - - this.fromPoints( points ); - - } - -}; - -THREE.Path.prototype = Object.create( THREE.CurvePath.prototype ); - -THREE.PathActions = { - - MOVE_TO: 'moveTo', - LINE_TO: 'lineTo', - QUADRATIC_CURVE_TO: 'quadraticCurveTo', // Bezier quadratic curve - BEZIER_CURVE_TO: 'bezierCurveTo', // Bezier cubic curve - CSPLINE_THRU: 'splineThru', // Catmull-rom spline - ARC: 'arc', // Circle - ELLIPSE: 'ellipse' -}; - -// TODO Clean up PATH API - -// Create path using straight lines to connect all points -// - vectors: array of Vector2 - -THREE.Path.prototype.fromPoints = function ( vectors ) { - - this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); - - for ( var v = 1, vlen = vectors.length; v < vlen; v ++ ) { - - this.lineTo( vectors[ v ].x, vectors[ v ].y ); - - }; - -}; - -// startPath() endPath()? - -THREE.Path.prototype.moveTo = function ( x, y ) { - - var args = Array.prototype.slice.call( arguments ); - this.actions.push( { action: THREE.PathActions.MOVE_TO, args: args } ); - -}; - -THREE.Path.prototype.lineTo = function ( x, y ) { - - var args = Array.prototype.slice.call( arguments ); - - var lastargs = this.actions[ this.actions.length - 1 ].args; - - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; - - var curve = new THREE.LineCurve( new THREE.Vector2( x0, y0 ), new THREE.Vector2( x, y ) ); - this.curves.push( curve ); - - this.actions.push( { action: THREE.PathActions.LINE_TO, args: args } ); - -}; - -THREE.Path.prototype.quadraticCurveTo = function( aCPx, aCPy, aX, aY ) { - - var args = Array.prototype.slice.call( arguments ); - - var lastargs = this.actions[ this.actions.length - 1 ].args; - - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; - - var curve = new THREE.QuadraticBezierCurve( new THREE.Vector2( x0, y0 ), - new THREE.Vector2( aCPx, aCPy ), - new THREE.Vector2( aX, aY ) ); - this.curves.push( curve ); - - this.actions.push( { action: THREE.PathActions.QUADRATIC_CURVE_TO, args: args } ); - -}; - -THREE.Path.prototype.bezierCurveTo = function( aCP1x, aCP1y, - aCP2x, aCP2y, - aX, aY ) { - - var args = Array.prototype.slice.call( arguments ); - - var lastargs = this.actions[ this.actions.length - 1 ].args; - - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; - - var curve = new THREE.CubicBezierCurve( new THREE.Vector2( x0, y0 ), - new THREE.Vector2( aCP1x, aCP1y ), - new THREE.Vector2( aCP2x, aCP2y ), - new THREE.Vector2( aX, aY ) ); - this.curves.push( curve ); - - this.actions.push( { action: THREE.PathActions.BEZIER_CURVE_TO, args: args } ); - -}; - -THREE.Path.prototype.splineThru = function( pts /*Array of Vector*/ ) { - - var args = Array.prototype.slice.call( arguments ); - var lastargs = this.actions[ this.actions.length - 1 ].args; - - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; -//--- - var npts = [ new THREE.Vector2( x0, y0 ) ]; - Array.prototype.push.apply( npts, pts ); - - var curve = new THREE.SplineCurve( npts ); - this.curves.push( curve ); - - this.actions.push( { action: THREE.PathActions.CSPLINE_THRU, args: args } ); - -}; - -// FUTURE: Change the API or follow canvas API? - -THREE.Path.prototype.arc = function ( aX, aY, aRadius, - aStartAngle, aEndAngle, aClockwise ) { - - var lastargs = this.actions[ this.actions.length - 1].args; - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; - - this.absarc(aX + x0, aY + y0, aRadius, - aStartAngle, aEndAngle, aClockwise ); - - }; - - THREE.Path.prototype.absarc = function ( aX, aY, aRadius, - aStartAngle, aEndAngle, aClockwise ) { - this.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise); - }; - -THREE.Path.prototype.ellipse = function ( aX, aY, xRadius, yRadius, - aStartAngle, aEndAngle, aClockwise ) { - - var lastargs = this.actions[ this.actions.length - 1].args; - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; - - this.absellipse(aX + x0, aY + y0, xRadius, yRadius, - aStartAngle, aEndAngle, aClockwise ); - - }; - - -THREE.Path.prototype.absellipse = function ( aX, aY, xRadius, yRadius, - aStartAngle, aEndAngle, aClockwise ) { - - var args = Array.prototype.slice.call( arguments ); - var curve = new THREE.EllipseCurve( aX, aY, xRadius, yRadius, - aStartAngle, aEndAngle, aClockwise ); - this.curves.push( curve ); - - var lastPoint = curve.getPoint(1); - args.push(lastPoint.x); - args.push(lastPoint.y); - - this.actions.push( { action: THREE.PathActions.ELLIPSE, args: args } ); - - }; - -THREE.Path.prototype.getSpacedPoints = function ( divisions, closedPath ) { - - if ( ! divisions ) divisions = 40; - - var points = []; - - for ( var i = 0; i < divisions; i ++ ) { - - points.push( this.getPoint( i / divisions ) ); - - //if( !this.getPoint( i / divisions ) ) throw "DIE"; - - } - - // if ( closedPath ) { - // - // points.push( points[ 0 ] ); - // - // } - - return points; - -}; - -/* Return an array of vectors based on contour of the path */ - -THREE.Path.prototype.getPoints = function( divisions, closedPath ) { - - if (this.useSpacedPoints) { - console.log('tata'); - return this.getSpacedPoints( divisions, closedPath ); - } - - divisions = divisions || 12; - - var points = []; - - var i, il, item, action, args; - var cpx, cpy, cpx2, cpy2, cpx1, cpy1, cpx0, cpy0, - laste, j, - t, tx, ty; - - for ( i = 0, il = this.actions.length; i < il; i ++ ) { - - item = this.actions[ i ]; - - action = item.action; - args = item.args; - - switch( action ) { - - case THREE.PathActions.MOVE_TO: - - points.push( new THREE.Vector2( args[ 0 ], args[ 1 ] ) ); - - break; - - case THREE.PathActions.LINE_TO: - - points.push( new THREE.Vector2( args[ 0 ], args[ 1 ] ) ); - - break; - - case THREE.PathActions.QUADRATIC_CURVE_TO: - - cpx = args[ 2 ]; - cpy = args[ 3 ]; - - cpx1 = args[ 0 ]; - cpy1 = args[ 1 ]; - - if ( points.length > 0 ) { - - laste = points[ points.length - 1 ]; - - cpx0 = laste.x; - cpy0 = laste.y; - - } else { - - laste = this.actions[ i - 1 ].args; - - cpx0 = laste[ laste.length - 2 ]; - cpy0 = laste[ laste.length - 1 ]; - - } - - for ( j = 1; j <= divisions; j ++ ) { - - t = j / divisions; - - tx = THREE.Shape.Utils.b2( t, cpx0, cpx1, cpx ); - ty = THREE.Shape.Utils.b2( t, cpy0, cpy1, cpy ); - - points.push( new THREE.Vector2( tx, ty ) ); - - } - - break; - - case THREE.PathActions.BEZIER_CURVE_TO: - - cpx = args[ 4 ]; - cpy = args[ 5 ]; - - cpx1 = args[ 0 ]; - cpy1 = args[ 1 ]; - - cpx2 = args[ 2 ]; - cpy2 = args[ 3 ]; - - if ( points.length > 0 ) { - - laste = points[ points.length - 1 ]; - - cpx0 = laste.x; - cpy0 = laste.y; - - } else { - - laste = this.actions[ i - 1 ].args; - - cpx0 = laste[ laste.length - 2 ]; - cpy0 = laste[ laste.length - 1 ]; - - } - - - for ( j = 1; j <= divisions; j ++ ) { - - t = j / divisions; - - tx = THREE.Shape.Utils.b3( t, cpx0, cpx1, cpx2, cpx ); - ty = THREE.Shape.Utils.b3( t, cpy0, cpy1, cpy2, cpy ); - - points.push( new THREE.Vector2( tx, ty ) ); - - } - - break; - - case THREE.PathActions.CSPLINE_THRU: - - laste = this.actions[ i - 1 ].args; - - var last = new THREE.Vector2( laste[ laste.length - 2 ], laste[ laste.length - 1 ] ); - var spts = [ last ]; - - var n = divisions * args[ 0 ].length; - - spts = spts.concat( args[ 0 ] ); - - var spline = new THREE.SplineCurve( spts ); - - for ( j = 1; j <= n; j ++ ) { - - points.push( spline.getPointAt( j / n ) ) ; - - } - - break; - - case THREE.PathActions.ARC: - - var aX = args[ 0 ], aY = args[ 1 ], - aRadius = args[ 2 ], - aStartAngle = args[ 3 ], aEndAngle = args[ 4 ], - aClockwise = !!args[ 5 ]; - - var deltaAngle = aEndAngle - aStartAngle; - var angle; - var tdivisions = divisions * 2; - - for ( j = 1; j <= tdivisions; j ++ ) { - - t = j / tdivisions; - - if ( ! aClockwise ) { - - t = 1 - t; - - } - - angle = aStartAngle + t * deltaAngle; - - tx = aX + aRadius * Math.cos( angle ); - ty = aY + aRadius * Math.sin( angle ); - - //console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty); - - points.push( new THREE.Vector2( tx, ty ) ); - - } - - //console.log(points); - - break; - - case THREE.PathActions.ELLIPSE: - - var aX = args[ 0 ], aY = args[ 1 ], - xRadius = args[ 2 ], - yRadius = args[ 3 ], - aStartAngle = args[ 4 ], aEndAngle = args[ 5 ], - aClockwise = !!args[ 6 ]; - - - var deltaAngle = aEndAngle - aStartAngle; - var angle; - var tdivisions = divisions * 2; - - for ( j = 1; j <= tdivisions; j ++ ) { - - t = j / tdivisions; - - if ( ! aClockwise ) { - - t = 1 - t; - - } - - angle = aStartAngle + t * deltaAngle; - - tx = aX + xRadius * Math.cos( angle ); - ty = aY + yRadius * Math.sin( angle ); - - //console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty); - - points.push( new THREE.Vector2( tx, ty ) ); - - } - - //console.log(points); - - break; - - } // end switch - - } - - - - // Normalize to remove the closing point by default. - var lastPoint = points[ points.length - 1]; - var EPSILON = 0.0000000001; - if ( Math.abs(lastPoint.x - points[ 0 ].x) < EPSILON && - Math.abs(lastPoint.y - points[ 0 ].y) < EPSILON) - points.splice( points.length - 1, 1); - if ( closedPath ) { - - points.push( points[ 0 ] ); - - } - - return points; - -}; - -// Breaks path into shapes - -THREE.Path.prototype.toShapes = function( isCCW ) { - - function isPointInsidePolygon( inPt, inPolygon ) { - var EPSILON = 0.0000000001; - - var polyLen = inPolygon.length; - - // inPt on polygon contour => immediate success or - // toggling of inside/outside at every single! intersection point of an edge - // with the horizontal line through inPt, left of inPt - // not counting lowerY endpoints of edges and whole edges on that line - var inside = false; - for( var p = polyLen - 1, q = 0; q < polyLen; p = q++ ) { - var edgeLowPt = inPolygon[ p ]; - var edgeHighPt = inPolygon[ q ]; - - var edgeDx = edgeHighPt.x - edgeLowPt.x; - var edgeDy = edgeHighPt.y - edgeLowPt.y; - - if ( Math.abs(edgeDy) > EPSILON ) { // not parallel - if ( edgeDy < 0 ) { - edgeLowPt = inPolygon[ q ]; edgeDx = -edgeDx; - edgeHighPt = inPolygon[ p ]; edgeDy = -edgeDy; - } - if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; - - if ( inPt.y == edgeLowPt.y ) { - if ( inPt.x == edgeLowPt.x ) return true; // inPt is on contour ? - // continue; // no intersection or edgeLowPt => doesn't count !!! - } else { - var perpEdge = edgeDy * (inPt.x - edgeLowPt.x) - edgeDx * (inPt.y - edgeLowPt.y); - if ( perpEdge == 0 ) return true; // inPt is on contour ? - if ( perpEdge < 0 ) continue; - inside = !inside; // true intersection left of inPt - } - } else { // parallel or colinear - if ( inPt.y != edgeLowPt.y ) continue; // parallel - // egde lies on the same horizontal line as inPt - if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || - ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! - // continue; - } - } - - return inside; - } - - var i, il, item, action, args; - - var subPaths = [], lastPath = new THREE.Path(); - - for ( i = 0, il = this.actions.length; i < il; i ++ ) { - - item = this.actions[ i ]; - - args = item.args; - action = item.action; - - if ( action == THREE.PathActions.MOVE_TO ) { - - if ( lastPath.actions.length != 0 ) { - - subPaths.push( lastPath ); - lastPath = new THREE.Path(); - - } - - } - - lastPath[ action ].apply( lastPath, args ); - - } - - if ( lastPath.actions.length != 0 ) { - - subPaths.push( lastPath ); - - } - - // console.log(subPaths); - - if ( subPaths.length == 0 ) return []; - - var solid, tmpPath, tmpShape, shapes = []; - - if ( subPaths.length == 1) { - - tmpPath = subPaths[0]; - tmpShape = new THREE.Shape(); - tmpShape.actions = tmpPath.actions; - tmpShape.curves = tmpPath.curves; - shapes.push( tmpShape ); - return shapes; - - } - - var holesFirst = !THREE.Shape.Utils.isClockWise( subPaths[ 0 ].getPoints() ); - holesFirst = isCCW ? !holesFirst : holesFirst; - - // console.log("Holes first", holesFirst); - - var betterShapeHoles = []; - var newShapes = []; - var newShapeHoles = []; - var mainIdx = 0; - var tmpPoints; - - newShapes[mainIdx] = undefined; - newShapeHoles[mainIdx] = []; - - for ( i = 0, il = subPaths.length; i < il; i ++ ) { - - tmpPath = subPaths[ i ]; - tmpPoints = tmpPath.getPoints(); - solid = THREE.Shape.Utils.isClockWise( tmpPoints ); - solid = isCCW ? !solid : solid; - - if ( solid ) { - - if ( (! holesFirst ) && ( newShapes[mainIdx] ) ) mainIdx++; - - newShapes[mainIdx] = { s: new THREE.Shape(), p: tmpPoints }; - newShapes[mainIdx].s.actions = tmpPath.actions; - newShapes[mainIdx].s.curves = tmpPath.curves; - - if ( holesFirst ) mainIdx++; - newShapeHoles[mainIdx] = []; - - //console.log('cw', i); - - } else { - - newShapeHoles[mainIdx].push( { h: tmpPath, p: tmpPoints[0] } ); - - //console.log('ccw', i); - - } - - } - - if ( newShapes.length > 1 ) { - var ambigious = false; - var toChange = []; - - for (var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++ ) { - betterShapeHoles[sIdx] = []; - } - for (var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++ ) { - var sh = newShapes[sIdx]; - var sho = newShapeHoles[sIdx]; - for (var hIdx = 0; hIdx < sho.length; hIdx++ ) { - var ho = sho[hIdx]; - var hole_unassigned = true; - for (var s2Idx = 0; s2Idx < newShapes.length; s2Idx++ ) { - if ( isPointInsidePolygon( ho.p, newShapes[s2Idx].p ) ) { - if ( sIdx != s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); - if ( hole_unassigned ) { - hole_unassigned = false; - betterShapeHoles[s2Idx].push( ho ); - } else { - ambigious = true; - } - } - } - if ( hole_unassigned ) { betterShapeHoles[sIdx].push( ho ); } - } - } - // console.log("ambigious: ", ambigious); - if ( toChange.length > 0 ) { - // console.log("to change: ", toChange); - if (! ambigious) newShapeHoles = betterShapeHoles; - } - } - - var tmpHoles, j, jl; - for ( i = 0, il = newShapes.length; i < il; i ++ ) { - tmpShape = newShapes[i].s; - shapes.push( tmpShape ); - tmpHoles = newShapeHoles[i]; - for ( j = 0, jl = tmpHoles.length; j < jl; j ++ ) { - tmpShape.holes.push( tmpHoles[j].h ); - } - } - - //console.log("shape", shapes); - - return shapes; - -}; - -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * Defines a 2d shape plane using paths. - **/ - -// STEP 1 Create a path. -// STEP 2 Turn path into shape. -// STEP 3 ExtrudeGeometry takes in Shape/Shapes -// STEP 3a - Extract points from each shape, turn to vertices -// STEP 3b - Triangulate each shape, add faces. - -THREE.Shape = function () { - - THREE.Path.apply( this, arguments ); - this.holes = []; - -}; - -THREE.Shape.prototype = Object.create( THREE.Path.prototype ); - -// Convenience method to return ExtrudeGeometry - -THREE.Shape.prototype.extrude = function ( options ) { - - var extruded = new THREE.ExtrudeGeometry( this, options ); - return extruded; - -}; - -// Convenience method to return ShapeGeometry - -THREE.Shape.prototype.makeGeometry = function ( options ) { - - var geometry = new THREE.ShapeGeometry( this, options ); - return geometry; - -}; - -// Get points of holes - -THREE.Shape.prototype.getPointsHoles = function ( divisions ) { - - var i, il = this.holes.length, holesPts = []; - - for ( i = 0; i < il; i ++ ) { - - holesPts[ i ] = this.holes[ i ].getTransformedPoints( divisions, this.bends ); - - } - - return holesPts; - -}; - -// Get points of holes (spaced by regular distance) - -THREE.Shape.prototype.getSpacedPointsHoles = function ( divisions ) { - - var i, il = this.holes.length, holesPts = []; - - for ( i = 0; i < il; i ++ ) { - - holesPts[ i ] = this.holes[ i ].getTransformedSpacedPoints( divisions, this.bends ); - - } - - return holesPts; - -}; - - -// Get points of shape and holes (keypoints based on segments parameter) - -THREE.Shape.prototype.extractAllPoints = function ( divisions ) { - - return { - - shape: this.getTransformedPoints( divisions ), - holes: this.getPointsHoles( divisions ) - - }; - -}; - -THREE.Shape.prototype.extractPoints = function ( divisions ) { - - if (this.useSpacedPoints) { - return this.extractAllSpacedPoints(divisions); - } - - return this.extractAllPoints(divisions); - -}; - -// -// THREE.Shape.prototype.extractAllPointsWithBend = function ( divisions, bend ) { -// -// return { -// -// shape: this.transform( bend, divisions ), -// holes: this.getPointsHoles( divisions, bend ) -// -// }; -// -// }; - -// Get points of shape and holes (spaced by regular distance) - -THREE.Shape.prototype.extractAllSpacedPoints = function ( divisions ) { - - return { - - shape: this.getTransformedSpacedPoints( divisions ), - holes: this.getSpacedPointsHoles( divisions ) - - }; - -}; - -/************************************************************** - * Utils - **************************************************************/ - -THREE.Shape.Utils = { - - triangulateShape: function ( contour, holes ) { - - function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { - // inOtherPt needs to be colinear to the inSegment - if ( inSegPt1.x != inSegPt2.x ) { - if ( inSegPt1.x < inSegPt2.x ) { - return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); - } else { - return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); - } - } else { - if ( inSegPt1.y < inSegPt2.y ) { - return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); - } else { - return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); - } - } - } - - function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { - var EPSILON = 0.0000000001; - - var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; - var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; - - var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; - var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; - - var limit = seg1dy * seg2dx - seg1dx * seg2dy; - var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; - - if ( Math.abs(limit) > EPSILON ) { // not parallel - - var perpSeg2; - if ( limit > 0 ) { - if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; - perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; - if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; - } else { - if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; - perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; - if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; - } - - // i.e. to reduce rounding errors - // intersection at endpoint of segment#1? - if ( perpSeg2 == 0 ) { - if ( ( inExcludeAdjacentSegs ) && - ( ( perpSeg1 == 0 ) || ( perpSeg1 == limit ) ) ) return []; - return [ inSeg1Pt1 ]; - } - if ( perpSeg2 == limit ) { - if ( ( inExcludeAdjacentSegs ) && - ( ( perpSeg1 == 0 ) || ( perpSeg1 == limit ) ) ) return []; - return [ inSeg1Pt2 ]; - } - // intersection at endpoint of segment#2? - if ( perpSeg1 == 0 ) return [ inSeg2Pt1 ]; - if ( perpSeg1 == limit ) return [ inSeg2Pt2 ]; - - // return real intersection point - var factorSeg1 = perpSeg2 / limit; - return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, - y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; - - } else { // parallel or colinear - if ( ( perpSeg1 != 0 ) || - ( seg2dy * seg1seg2dx != seg2dx * seg1seg2dy ) ) return []; - - // they are collinear or degenerate - var seg1Pt = ( (seg1dx == 0) && (seg1dy == 0) ); // segment1 ist just a point? - var seg2Pt = ( (seg2dx == 0) && (seg2dy == 0) ); // segment2 ist just a point? - // both segments are points - if ( seg1Pt && seg2Pt ) { - if ( (inSeg1Pt1.x != inSeg2Pt1.x) || - (inSeg1Pt1.y != inSeg2Pt1.y) ) return []; // they are distinct points - return [ inSeg1Pt1 ]; // they are the same point - } - // segment#1 is a single point - if ( seg1Pt ) { - if (! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 - return [ inSeg1Pt1 ]; - } - // segment#2 is a single point - if ( seg2Pt ) { - if (! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 - return [ inSeg2Pt1 ]; - } - - // they are collinear segments, which might overlap - var seg1min, seg1max, seg1minVal, seg1maxVal; - var seg2min, seg2max, seg2minVal, seg2maxVal; - if (seg1dx != 0) { // the segments are NOT on a vertical line - if ( inSeg1Pt1.x < inSeg1Pt2.x ) { - seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; - seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; - } else { - seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; - seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; - } - if ( inSeg2Pt1.x < inSeg2Pt2.x ) { - seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; - seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; - } else { - seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; - seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; - } - } else { // the segments are on a vertical line - if ( inSeg1Pt1.y < inSeg1Pt2.y ) { - seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; - seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; - } else { - seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; - seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; - } - if ( inSeg2Pt1.y < inSeg2Pt2.y ) { - seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; - seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; - } else { - seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; - seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; - } - } - if ( seg1minVal <= seg2minVal ) { - if ( seg1maxVal < seg2minVal ) return []; - if ( seg1maxVal == seg2minVal ) { - if ( inExcludeAdjacentSegs ) return []; - return [ seg2min ]; - } - if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; - return [ seg2min, seg2max ]; - } else { - if ( seg1minVal > seg2maxVal ) return []; - if ( seg1minVal == seg2maxVal ) { - if ( inExcludeAdjacentSegs ) return []; - return [ seg1min ]; - } - if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; - return [ seg1min, seg2max ]; - } - } - } - - function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { - // The order of legs is important - - var EPSILON = 0.0000000001; - - // translation of all points, so that Vertex is at (0,0) - var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; - var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; - var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; - - // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. - var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; - var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; - - if ( Math.abs(from2toAngle) > EPSILON ) { // angle != 180 deg. - - var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; - // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); - - if ( from2toAngle > 0 ) { // main angle < 180 deg. - return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); - } else { // main angle > 180 deg. - return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); - } - } else { // angle == 180 deg. - // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); - return ( from2otherAngle > 0 ); - } - } - - - function removeHoles( contour, holes ) { - - var shape = contour.concat(); // work on this shape - var hole; - - function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { - // Check if hole point lies within angle around shape point - var lastShapeIdx = shape.length - 1; - - var prevShapeIdx = inShapeIdx - 1; - if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; - - var nextShapeIdx = inShapeIdx + 1; - if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; - - var insideAngle = isPointInsideAngle( shape[inShapeIdx], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[inHoleIdx] ); - if (! insideAngle ) { - // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); - return false; - } - - // Check if shape point lies within angle around hole point - var lastHoleIdx = hole.length - 1; - - var prevHoleIdx = inHoleIdx - 1; - if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; - - var nextHoleIdx = inHoleIdx + 1; - if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; - - insideAngle = isPointInsideAngle( hole[inHoleIdx], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[inShapeIdx] ); - if (! insideAngle ) { - // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); - return false; - } - - return true; - } - - function intersectsShapeEdge( inShapePt, inHolePt ) { - // checks for intersections with shape edges - var sIdx, nextIdx, intersection; - for ( sIdx = 0; sIdx < shape.length; sIdx++ ) { - nextIdx = sIdx+1; nextIdx %= shape.length; - intersection = intersect_segments_2D( inShapePt, inHolePt, shape[sIdx], shape[nextIdx], true ); - if ( intersection.length > 0 ) return true; - } - - return false; - } - - var indepHoles = []; - - function intersectsHoleEdge( inShapePt, inHolePt ) { - // checks for intersections with hole edges - var ihIdx, chkHole, - hIdx, nextIdx, intersection; - for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx++ ) { - chkHole = holes[indepHoles[ihIdx]]; - for ( hIdx = 0; hIdx < chkHole.length; hIdx++ ) { - nextIdx = hIdx+1; nextIdx %= chkHole.length; - intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[hIdx], chkHole[nextIdx], true ); - if ( intersection.length > 0 ) return true; - } - } - return false; - } - - var holeIndex, shapeIndex, - shapePt, holePt, - holeIdx, cutKey, failedCuts = [], - tmpShape1, tmpShape2, - tmpHole1, tmpHole2; - - for ( var h = 0, hl = holes.length; h < hl; h ++ ) { - - indepHoles.push( h ); - - } - - var counter = indepHoles.length * 2; - while ( indepHoles.length > 0 ) { - counter --; - if ( counter < 0 ) { - console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); - break; - } - - // search for shape-vertex and hole-vertex, - // which can be connected without intersections - for ( shapeIndex = 0; shapeIndex < shape.length; shapeIndex++ ) { - - shapePt = shape[ shapeIndex ]; - holeIndex = -1; - - // search for hole which can be reached without intersections - for ( var h = 0; h < indepHoles.length; h ++ ) { - holeIdx = indepHoles[h]; - - // prevent multiple checks - cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; - if ( failedCuts[cutKey] !== undefined ) continue; - - hole = holes[holeIdx]; - for ( var h2 = 0; h2 < hole.length; h2 ++ ) { - holePt = hole[ h2 ]; - if (! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; - if ( intersectsShapeEdge( shapePt, holePt ) ) continue; - if ( intersectsHoleEdge( shapePt, holePt ) ) continue; - - holeIndex = h2; - indepHoles.splice(h,1); - - tmpShape1 = shape.slice( 0, shapeIndex+1 ); - tmpShape2 = shape.slice( shapeIndex ); - tmpHole1 = hole.slice( holeIndex ); - tmpHole2 = hole.slice( 0, holeIndex+1 ); - - shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); - - // Debug only, to show the selected cuts - // glob_CutLines.push( [ shapePt, holePt ] ); - - break; - } - if ( holeIndex >= 0 ) break; // hole-vertex found - - failedCuts[cutKey] = true; // remember failure - } - if ( holeIndex >= 0 ) break; // hole-vertex found - } - } - - return shape; /* shape with no holes */ - } - - - var i, il, f, face, - key, index, - allPointsMap = {}; - - // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. - - var allpoints = contour.concat(); - - for ( var h = 0, hl = holes.length; h < hl; h ++ ) { - - Array.prototype.push.apply( allpoints, holes[h] ); - - } - - //console.log( "allpoints",allpoints, allpoints.length ); - - // prepare all points map - - for ( i = 0, il = allpoints.length; i < il; i ++ ) { - - key = allpoints[ i ].x + ":" + allpoints[ i ].y; - - if ( allPointsMap[ key ] !== undefined ) { - - console.log( "Duplicate point", key ); - - } - - allPointsMap[ key ] = i; - - } - - // remove holes by cutting paths to holes and adding them to the shape - var shapeWithoutHoles = removeHoles( contour, holes ); - - var triangles = THREE.FontUtils.Triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape - //console.log( "triangles",triangles, triangles.length ); - - // check all face vertices against all points map - - for ( i = 0, il = triangles.length; i < il; i ++ ) { - - face = triangles[ i ]; - - for ( f = 0; f < 3; f ++ ) { - - key = face[ f ].x + ":" + face[ f ].y; - - index = allPointsMap[ key ]; - - if ( index !== undefined ) { - - face[ f ] = index; - - } - - } - - } - - return triangles.concat(); - - }, - - isClockWise: function ( pts ) { - - return THREE.FontUtils.Triangulate.area( pts ) < 0; - - }, - - // Bezier Curves formulas obtained from - // http://en.wikipedia.org/wiki/B%C3%A9zier_curve - - // Quad Bezier Functions - - b2p0: function ( t, p ) { - - var k = 1 - t; - return k * k * p; - - }, - - b2p1: function ( t, p ) { - - return 2 * ( 1 - t ) * t * p; - - }, - - b2p2: function ( t, p ) { - - return t * t * p; - - }, - - b2: function ( t, p0, p1, p2 ) { - - return this.b2p0( t, p0 ) + this.b2p1( t, p1 ) + this.b2p2( t, p2 ); - - }, - - // Cubic Bezier Functions - - b3p0: function ( t, p ) { - - var k = 1 - t; - return k * k * k * p; - - }, - - b3p1: function ( t, p ) { - - var k = 1 - t; - return 3 * k * k * t * p; - - }, - - b3p2: function ( t, p ) { - - var k = 1 - t; - return 3 * k * t * t * p; - - }, - - b3p3: function ( t, p ) { - - return t * t * t * p; - - }, - - b3: function ( t, p0, p1, p2, p3 ) { - - return this.b3p0( t, p0 ) + this.b3p1( t, p1 ) + this.b3p2( t, p2 ) + this.b3p3( t, p3 ); - - } - -}; - - -/************************************************************** - * Line - **************************************************************/ - -THREE.LineCurve = function ( v1, v2 ) { - - this.v1 = v1; - this.v2 = v2; - -}; - -THREE.LineCurve.prototype = Object.create( THREE.Curve.prototype ); - -THREE.LineCurve.prototype.getPoint = function ( t ) { - - var point = this.v2.clone().sub(this.v1); - point.multiplyScalar( t ).add( this.v1 ); - - return point; - -}; - -// Line curve is linear, so we can overwrite default getPointAt - -THREE.LineCurve.prototype.getPointAt = function ( u ) { - - return this.getPoint( u ); - -}; - -THREE.LineCurve.prototype.getTangent = function( t ) { - - var tangent = this.v2.clone().sub(this.v1); - - return tangent.normalize(); - -}; -/************************************************************** - * Quadratic Bezier curve - **************************************************************/ - - -THREE.QuadraticBezierCurve = function ( v0, v1, v2 ) { - - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - -}; - -THREE.QuadraticBezierCurve.prototype = Object.create( THREE.Curve.prototype ); - - -THREE.QuadraticBezierCurve.prototype.getPoint = function ( t ) { - - var tx, ty; - - tx = THREE.Shape.Utils.b2( t, this.v0.x, this.v1.x, this.v2.x ); - ty = THREE.Shape.Utils.b2( t, this.v0.y, this.v1.y, this.v2.y ); - - return new THREE.Vector2( tx, ty ); - -}; - - -THREE.QuadraticBezierCurve.prototype.getTangent = function( t ) { - - var tx, ty; - - tx = THREE.Curve.Utils.tangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ); - ty = THREE.Curve.Utils.tangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y ); - - // returns unit vector - - var tangent = new THREE.Vector2( tx, ty ); - tangent.normalize(); - - return tangent; - -}; -/************************************************************** - * Cubic Bezier curve - **************************************************************/ - -THREE.CubicBezierCurve = function ( v0, v1, v2, v3 ) { - - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - this.v3 = v3; - -}; - -THREE.CubicBezierCurve.prototype = Object.create( THREE.Curve.prototype ); - -THREE.CubicBezierCurve.prototype.getPoint = function ( t ) { - - var tx, ty; - - tx = THREE.Shape.Utils.b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ); - ty = THREE.Shape.Utils.b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ); - - return new THREE.Vector2( tx, ty ); - -}; - -THREE.CubicBezierCurve.prototype.getTangent = function( t ) { - - var tx, ty; - - tx = THREE.Curve.Utils.tangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ); - ty = THREE.Curve.Utils.tangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ); - - var tangent = new THREE.Vector2( tx, ty ); - tangent.normalize(); - - return tangent; - -}; -/************************************************************** - * Spline curve - **************************************************************/ - -THREE.SplineCurve = function ( points /* array of Vector2 */ ) { - - this.points = (points == undefined) ? [] : points; - -}; - -THREE.SplineCurve.prototype = Object.create( THREE.Curve.prototype ); - -THREE.SplineCurve.prototype.getPoint = function ( t ) { - - var v = new THREE.Vector2(); - var c = []; - var points = this.points, point, intPoint, weight; - point = ( points.length - 1 ) * t; - - intPoint = Math.floor( point ); - weight = point - intPoint; - - c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1; - c[ 1 ] = intPoint; - c[ 2 ] = intPoint > points.length - 2 ? points.length -1 : intPoint + 1; - c[ 3 ] = intPoint > points.length - 3 ? points.length -1 : intPoint + 2; - - v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight ); - v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight ); - - return v; - -}; -/************************************************************** - * Ellipse curve - **************************************************************/ - -THREE.EllipseCurve = function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise ) { - - this.aX = aX; - this.aY = aY; - - this.xRadius = xRadius; - this.yRadius = yRadius; - - this.aStartAngle = aStartAngle; - this.aEndAngle = aEndAngle; - - this.aClockwise = aClockwise; - -}; - -THREE.EllipseCurve.prototype = Object.create( THREE.Curve.prototype ); - -THREE.EllipseCurve.prototype.getPoint = function ( t ) { - - var angle; - var deltaAngle = this.aEndAngle - this.aStartAngle; - - if ( deltaAngle < 0 ) deltaAngle += Math.PI * 2; - if ( deltaAngle > Math.PI * 2 ) deltaAngle -= Math.PI * 2; - - if ( this.aClockwise === true ) { - - angle = this.aEndAngle + ( 1 - t ) * ( Math.PI * 2 - deltaAngle ); - - } else { - - angle = this.aStartAngle + t * deltaAngle; - - } - - var tx = this.aX + this.xRadius * Math.cos( angle ); - var ty = this.aY + this.yRadius * Math.sin( angle ); - - return new THREE.Vector2( tx, ty ); - -}; - -/************************************************************** - * Arc curve - **************************************************************/ - -THREE.ArcCurve = function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { - - THREE.EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); -}; - -THREE.ArcCurve.prototype = Object.create( THREE.EllipseCurve.prototype ); -/************************************************************** - * Line3D - **************************************************************/ - -THREE.LineCurve3 = THREE.Curve.create( - - function ( v1, v2 ) { - - this.v1 = v1; - this.v2 = v2; - - }, - - function ( t ) { - - var r = new THREE.Vector3(); - - - r.subVectors( this.v2, this.v1 ); // diff - r.multiplyScalar( t ); - r.add( this.v1 ); - - return r; - - } - -); - -/************************************************************** - * Quadratic Bezier 3D curve - **************************************************************/ - -THREE.QuadraticBezierCurve3 = THREE.Curve.create( - - function ( v0, v1, v2 ) { - - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - - }, - - function ( t ) { - - var tx, ty, tz; - - tx = THREE.Shape.Utils.b2( t, this.v0.x, this.v1.x, this.v2.x ); - ty = THREE.Shape.Utils.b2( t, this.v0.y, this.v1.y, this.v2.y ); - tz = THREE.Shape.Utils.b2( t, this.v0.z, this.v1.z, this.v2.z ); - - return new THREE.Vector3( tx, ty, tz ); - - } - -); -/************************************************************** - * Cubic Bezier 3D curve - **************************************************************/ - -THREE.CubicBezierCurve3 = THREE.Curve.create( - - function ( v0, v1, v2, v3 ) { - - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - this.v3 = v3; - - }, - - function ( t ) { - - var tx, ty, tz; - - tx = THREE.Shape.Utils.b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ); - ty = THREE.Shape.Utils.b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ); - tz = THREE.Shape.Utils.b3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z ); - - return new THREE.Vector3( tx, ty, tz ); - - } - -); -/************************************************************** - * Spline 3D curve - **************************************************************/ - - -THREE.SplineCurve3 = THREE.Curve.create( - - function ( points /* array of Vector3 */) { - - this.points = (points == undefined) ? [] : points; - - }, - - function ( t ) { - - var v = new THREE.Vector3(); - var c = []; - var points = this.points, point, intPoint, weight; - point = ( points.length - 1 ) * t; - - intPoint = Math.floor( point ); - weight = point - intPoint; - - c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1; - c[ 1 ] = intPoint; - c[ 2 ] = intPoint > points.length - 2 ? points.length - 1 : intPoint + 1; - c[ 3 ] = intPoint > points.length - 3 ? points.length - 1 : intPoint + 2; - - var pt0 = points[ c[0] ], - pt1 = points[ c[1] ], - pt2 = points[ c[2] ], - pt3 = points[ c[3] ]; - - v.x = THREE.Curve.Utils.interpolate(pt0.x, pt1.x, pt2.x, pt3.x, weight); - v.y = THREE.Curve.Utils.interpolate(pt0.y, pt1.y, pt2.y, pt3.y, weight); - v.z = THREE.Curve.Utils.interpolate(pt0.z, pt1.z, pt2.z, pt3.z, weight); - - return v; - - } - -); - - -// THREE.SplineCurve3.prototype.getTangent = function(t) { -// var v = new THREE.Vector3(); -// var c = []; -// var points = this.points, point, intPoint, weight; -// point = ( points.length - 1 ) * t; - -// intPoint = Math.floor( point ); -// weight = point - intPoint; - -// c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1; -// c[ 1 ] = intPoint; -// c[ 2 ] = intPoint > points.length - 2 ? points.length - 1 : intPoint + 1; -// c[ 3 ] = intPoint > points.length - 3 ? points.length - 1 : intPoint + 2; - -// var pt0 = points[ c[0] ], -// pt1 = points[ c[1] ], -// pt2 = points[ c[2] ], -// pt3 = points[ c[3] ]; - -// // t = weight; -// v.x = THREE.Curve.Utils.tangentSpline( t, pt0.x, pt1.x, pt2.x, pt3.x ); -// v.y = THREE.Curve.Utils.tangentSpline( t, pt0.y, pt1.y, pt2.y, pt3.y ); -// v.z = THREE.Curve.Utils.tangentSpline( t, pt0.z, pt1.z, pt2.z, pt3.z ); - -// return v; - -// } -/************************************************************** - * Closed Spline 3D curve - **************************************************************/ - - -THREE.ClosedSplineCurve3 = THREE.Curve.create( - - function ( points /* array of Vector3 */) { - - this.points = (points == undefined) ? [] : points; - - }, - - function ( t ) { - - var v = new THREE.Vector3(); - var c = []; - var points = this.points, point, intPoint, weight; - point = ( points.length - 0 ) * t; - // This needs to be from 0-length +1 - - intPoint = Math.floor( point ); - weight = point - intPoint; - - intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; - c[ 0 ] = ( intPoint - 1 ) % points.length; - c[ 1 ] = ( intPoint ) % points.length; - c[ 2 ] = ( intPoint + 1 ) % points.length; - c[ 3 ] = ( intPoint + 2 ) % points.length; - - v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight ); - v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight ); - v.z = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].z, points[ c[ 1 ] ].z, points[ c[ 2 ] ].z, points[ c[ 3 ] ].z, weight ); - - return v; - - } - -); -/** - * @author mikael emtinger / http://gomo.se/ - */ - -THREE.AnimationHandler = (function() { - - var playing = []; - var library = {}; - var that = {}; - - - //--- update --- - - that.update = function( deltaTimeMS ) { - - for( var i = 0; i < playing.length; i ++ ) - playing[ i ].update( deltaTimeMS ); - - }; - - - //--- add --- - - that.addToUpdate = function( animation ) { - - if ( playing.indexOf( animation ) === -1 ) - playing.push( animation ); - - }; - - - //--- remove --- - - that.removeFromUpdate = function( animation ) { - - var index = playing.indexOf( animation ); - - if( index !== -1 ) - playing.splice( index, 1 ); - - }; - - - //--- add --- - - that.add = function( data ) { - - if ( library[ data.name ] !== undefined ) - console.log( "THREE.AnimationHandler.add: Warning! " + data.name + " already exists in library. Overwriting." ); - - library[ data.name ] = data; - initData( data ); - - }; - - - //--- get --- - - that.get = function( name ) { - - if ( typeof name === "string" ) { - - if ( library[ name ] ) { - - return library[ name ]; - - } else { - - console.log( "THREE.AnimationHandler.get: Couldn't find animation " + name ); - return null; - - } - - } else { - - // todo: add simple tween library - - } - - }; - - //--- parse --- - - that.parse = function( root ) { - - // setup hierarchy - - var hierarchy = []; - - if ( root instanceof THREE.SkinnedMesh ) { - - for( var b = 0; b < root.bones.length; b++ ) { - - hierarchy.push( root.bones[ b ] ); - - } - - } else { - - parseRecurseHierarchy( root, hierarchy ); - - } - - return hierarchy; - - }; - - var parseRecurseHierarchy = function( root, hierarchy ) { - - hierarchy.push( root ); - - for( var c = 0; c < root.children.length; c++ ) - parseRecurseHierarchy( root.children[ c ], hierarchy ); - - } - - - //--- init data --- - - var initData = function( data ) { - - if( data.initialized === true ) - return; - - - // loop through all keys - - for( var h = 0; h < data.hierarchy.length; h ++ ) { - - for( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) { - - // remove minus times - - if( data.hierarchy[ h ].keys[ k ].time < 0 ) - data.hierarchy[ h ].keys[ k ].time = 0; - - - // create quaternions - - if( data.hierarchy[ h ].keys[ k ].rot !== undefined && - !( data.hierarchy[ h ].keys[ k ].rot instanceof THREE.Quaternion ) ) { - - var quat = data.hierarchy[ h ].keys[ k ].rot; - data.hierarchy[ h ].keys[ k ].rot = new THREE.Quaternion( quat[0], quat[1], quat[2], quat[3] ); - - } - - } - - - // prepare morph target keys - - if( data.hierarchy[ h ].keys.length && data.hierarchy[ h ].keys[ 0 ].morphTargets !== undefined ) { - - // get all used - - var usedMorphTargets = {}; - - for ( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) { - - for ( var m = 0; m < data.hierarchy[ h ].keys[ k ].morphTargets.length; m ++ ) { - - var morphTargetName = data.hierarchy[ h ].keys[ k ].morphTargets[ m ]; - usedMorphTargets[ morphTargetName ] = -1; - - } - - } - - data.hierarchy[ h ].usedMorphTargets = usedMorphTargets; - - - // set all used on all frames - - for ( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) { - - var influences = {}; - - for ( var morphTargetName in usedMorphTargets ) { - - for ( var m = 0; m < data.hierarchy[ h ].keys[ k ].morphTargets.length; m ++ ) { - - if ( data.hierarchy[ h ].keys[ k ].morphTargets[ m ] === morphTargetName ) { - - influences[ morphTargetName ] = data.hierarchy[ h ].keys[ k ].morphTargetsInfluences[ m ]; - break; - - } - - } - - if ( m === data.hierarchy[ h ].keys[ k ].morphTargets.length ) { - - influences[ morphTargetName ] = 0; - - } - - } - - data.hierarchy[ h ].keys[ k ].morphTargetsInfluences = influences; - - } - - } - - - // remove all keys that are on the same time - - for ( var k = 1; k < data.hierarchy[ h ].keys.length; k ++ ) { - - if ( data.hierarchy[ h ].keys[ k ].time === data.hierarchy[ h ].keys[ k - 1 ].time ) { - - data.hierarchy[ h ].keys.splice( k, 1 ); - k --; - - } - - } - - - // set index - - for ( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) { - - data.hierarchy[ h ].keys[ k ].index = k; - - } - - } - - // done - - data.initialized = true; - - }; - - - // interpolation types - - that.LINEAR = 0; - that.CATMULLROM = 1; - that.CATMULLROM_FORWARD = 2; - - return that; - -}()); - -/** - * @author mikael emtinger / http://gomo.se/ - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Animation = function ( root, name ) { - - this.root = root; - this.data = THREE.AnimationHandler.get( name ); - this.hierarchy = THREE.AnimationHandler.parse( root ); - - this.currentTime = 0; - this.timeScale = 1; - - this.isPlaying = false; - this.isPaused = true; - this.loop = true; - - this.interpolationType = THREE.AnimationHandler.LINEAR; - -}; - -THREE.Animation.prototype.play = function ( startTime ) { - - this.currentTime = startTime !== undefined ? startTime : 0; - - if ( this.isPlaying === false ) { - - this.isPlaying = true; - - this.reset(); - this.update( 0 ); - - } - - this.isPaused = false; - - THREE.AnimationHandler.addToUpdate( this ); - -}; - - -THREE.Animation.prototype.pause = function() { - - if ( this.isPaused === true ) { - - THREE.AnimationHandler.addToUpdate( this ); - - } else { - - THREE.AnimationHandler.removeFromUpdate( this ); - - } - - this.isPaused = !this.isPaused; - -}; - - -THREE.Animation.prototype.stop = function() { - - this.isPlaying = false; - this.isPaused = false; - THREE.AnimationHandler.removeFromUpdate( this ); - -}; - -THREE.Animation.prototype.reset = function () { - - for ( var h = 0, hl = this.hierarchy.length; h < hl; h ++ ) { - - var object = this.hierarchy[ h ]; - - object.matrixAutoUpdate = true; - - if ( object.animationCache === undefined ) { - - object.animationCache = {}; - object.animationCache.prevKey = { pos: 0, rot: 0, scl: 0 }; - object.animationCache.nextKey = { pos: 0, rot: 0, scl: 0 }; - object.animationCache.originalMatrix = object instanceof THREE.Bone ? object.skinMatrix : object.matrix; - - } - - var prevKey = object.animationCache.prevKey; - var nextKey = object.animationCache.nextKey; - - prevKey.pos = this.data.hierarchy[ h ].keys[ 0 ]; - prevKey.rot = this.data.hierarchy[ h ].keys[ 0 ]; - prevKey.scl = this.data.hierarchy[ h ].keys[ 0 ]; - - nextKey.pos = this.getNextKeyWith( "pos", h, 1 ); - nextKey.rot = this.getNextKeyWith( "rot", h, 1 ); - nextKey.scl = this.getNextKeyWith( "scl", h, 1 ); - - } - -}; - - -THREE.Animation.prototype.update = (function(){ - - var points = []; - var target = new THREE.Vector3(); - - // Catmull-Rom spline - - var interpolateCatmullRom = function ( points, scale ) { - - var c = [], v3 = [], - point, intPoint, weight, w2, w3, - pa, pb, pc, pd; - - point = ( points.length - 1 ) * scale; - intPoint = Math.floor( point ); - weight = point - intPoint; - - c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1; - c[ 1 ] = intPoint; - c[ 2 ] = intPoint > points.length - 2 ? intPoint : intPoint + 1; - c[ 3 ] = intPoint > points.length - 3 ? intPoint : intPoint + 2; - - pa = points[ c[ 0 ] ]; - pb = points[ c[ 1 ] ]; - pc = points[ c[ 2 ] ]; - pd = points[ c[ 3 ] ]; - - w2 = weight * weight; - w3 = weight * w2; - - v3[ 0 ] = interpolate( pa[ 0 ], pb[ 0 ], pc[ 0 ], pd[ 0 ], weight, w2, w3 ); - v3[ 1 ] = interpolate( pa[ 1 ], pb[ 1 ], pc[ 1 ], pd[ 1 ], weight, w2, w3 ); - v3[ 2 ] = interpolate( pa[ 2 ], pb[ 2 ], pc[ 2 ], pd[ 2 ], weight, w2, w3 ); - - return v3; - - }; - - var interpolate = function ( p0, p1, p2, p3, t, t2, t3 ) { - - var v0 = ( p2 - p0 ) * 0.5, - v1 = ( p3 - p1 ) * 0.5; - - return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1; - - }; - - return function ( delta ) { - if ( this.isPlaying === false ) return; - - this.currentTime += delta * this.timeScale; - - // - - var vector; - var types = [ "pos", "rot", "scl" ]; - - var duration = this.data.length; - - if ( this.loop === true && this.currentTime > duration ) { - - this.currentTime %= duration; - this.reset(); - - } else if ( this.loop === false && this.currentTime > duration ) { - - this.stop(); - return; - - } - - this.currentTime = Math.min( this.currentTime, duration ); - - for ( var h = 0, hl = this.hierarchy.length; h < hl; h ++ ) { - - var object = this.hierarchy[ h ]; - var animationCache = object.animationCache; - - // loop through pos/rot/scl - - for ( var t = 0; t < 3; t ++ ) { - - // get keys - - var type = types[ t ]; - var prevKey = animationCache.prevKey[ type ]; - var nextKey = animationCache.nextKey[ type ]; - - if ( nextKey.time <= this.currentTime ) { - - prevKey = this.data.hierarchy[ h ].keys[ 0 ]; - nextKey = this.getNextKeyWith( type, h, 1 ); - - while ( nextKey.time < this.currentTime && nextKey.index > prevKey.index ) { - - prevKey = nextKey; - nextKey = this.getNextKeyWith( type, h, nextKey.index + 1 ); - - } - - animationCache.prevKey[ type ] = prevKey; - animationCache.nextKey[ type ] = nextKey; - - } - - object.matrixAutoUpdate = true; - object.matrixWorldNeedsUpdate = true; - - var scale = ( this.currentTime - prevKey.time ) / ( nextKey.time - prevKey.time ); - - var prevXYZ = prevKey[ type ]; - var nextXYZ = nextKey[ type ]; - - if ( scale < 0 ) scale = 0; - if ( scale > 1 ) scale = 1; - - // interpolate - - if ( type === "pos" ) { - - vector = object.position; - - if ( this.interpolationType === THREE.AnimationHandler.LINEAR ) { - - vector.x = prevXYZ[ 0 ] + ( nextXYZ[ 0 ] - prevXYZ[ 0 ] ) * scale; - vector.y = prevXYZ[ 1 ] + ( nextXYZ[ 1 ] - prevXYZ[ 1 ] ) * scale; - vector.z = prevXYZ[ 2 ] + ( nextXYZ[ 2 ] - prevXYZ[ 2 ] ) * scale; - - } else if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM || - this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) { - - points[ 0 ] = this.getPrevKeyWith( "pos", h, prevKey.index - 1 )[ "pos" ]; - points[ 1 ] = prevXYZ; - points[ 2 ] = nextXYZ; - points[ 3 ] = this.getNextKeyWith( "pos", h, nextKey.index + 1 )[ "pos" ]; - - scale = scale * 0.33 + 0.33; - - var currentPoint = interpolateCatmullRom( points, scale ); - - vector.x = currentPoint[ 0 ]; - vector.y = currentPoint[ 1 ]; - vector.z = currentPoint[ 2 ]; - - if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) { - - var forwardPoint = interpolateCatmullRom( points, scale * 1.01 ); - - target.set( forwardPoint[ 0 ], forwardPoint[ 1 ], forwardPoint[ 2 ] ); - target.sub( vector ); - target.y = 0; - target.normalize(); - - var angle = Math.atan2( target.x, target.z ); - object.rotation.set( 0, angle, 0 ); - - } - - } - - } else if ( type === "rot" ) { - - THREE.Quaternion.slerp( prevXYZ, nextXYZ, object.quaternion, scale ); - - } else if ( type === "scl" ) { - - vector = object.scale; - - vector.x = prevXYZ[ 0 ] + ( nextXYZ[ 0 ] - prevXYZ[ 0 ] ) * scale; - vector.y = prevXYZ[ 1 ] + ( nextXYZ[ 1 ] - prevXYZ[ 1 ] ) * scale; - vector.z = prevXYZ[ 2 ] + ( nextXYZ[ 2 ] - prevXYZ[ 2 ] ) * scale; - - } - - } - - } - - }; - -})(); - - - - - -// Get next key with - -THREE.Animation.prototype.getNextKeyWith = function ( type, h, key ) { - - var keys = this.data.hierarchy[ h ].keys; - - if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM || - this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) { - - key = key < keys.length - 1 ? key : keys.length - 1; - - } else { - - key = key % keys.length; - - } - - for ( ; key < keys.length; key++ ) { - - if ( keys[ key ][ type ] !== undefined ) { - - return keys[ key ]; - - } - - } - - return this.data.hierarchy[ h ].keys[ 0 ]; - -}; - -// Get previous key with - -THREE.Animation.prototype.getPrevKeyWith = function ( type, h, key ) { - - var keys = this.data.hierarchy[ h ].keys; - - if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM || - this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) { - - key = key > 0 ? key : 0; - - } else { - - key = key >= 0 ? key : key + keys.length; - - } - - - for ( ; key >= 0; key -- ) { - - if ( keys[ key ][ type ] !== undefined ) { - - return keys[ key ]; - - } - - } - - return this.data.hierarchy[ h ].keys[ keys.length - 1 ]; - -}; - -/** - * @author mikael emtinger / http://gomo.se/ - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author khang duong - * @author erik kitson - */ - -THREE.KeyFrameAnimation = function ( root, data ) { - - this.root = root; - this.data = THREE.AnimationHandler.get( data ); - this.hierarchy = THREE.AnimationHandler.parse( root ); - this.currentTime = 0; - this.timeScale = 0.001; - this.isPlaying = false; - this.isPaused = true; - this.loop = true; - - // initialize to first keyframes - - for ( var h = 0, hl = this.hierarchy.length; h < hl; h ++ ) { - - var keys = this.data.hierarchy[h].keys, - sids = this.data.hierarchy[h].sids, - obj = this.hierarchy[h]; - - if ( keys.length && sids ) { - - for ( var s = 0; s < sids.length; s++ ) { - - var sid = sids[ s ], - next = this.getNextKeyWith( sid, h, 0 ); - - if ( next ) { - - next.apply( sid ); - - } - - } - - obj.matrixAutoUpdate = false; - this.data.hierarchy[h].node.updateMatrix(); - obj.matrixWorldNeedsUpdate = true; - - } - - } - -}; - -// Play - -THREE.KeyFrameAnimation.prototype.play = function ( startTime ) { - - this.currentTime = startTime !== undefined ? startTime : 0; - - if ( this.isPlaying === false ) { - - this.isPlaying = true; - - // reset key cache - - var h, hl = this.hierarchy.length, - object, - node; - - for ( h = 0; h < hl; h++ ) { - - object = this.hierarchy[ h ]; - node = this.data.hierarchy[ h ]; - - if ( node.animationCache === undefined ) { - - node.animationCache = {}; - node.animationCache.prevKey = null; - node.animationCache.nextKey = null; - node.animationCache.originalMatrix = object instanceof THREE.Bone ? object.skinMatrix : object.matrix; - - } - - var keys = this.data.hierarchy[h].keys; - - if (keys.length) { - - node.animationCache.prevKey = keys[ 0 ]; - node.animationCache.nextKey = keys[ 1 ]; - - this.startTime = Math.min( keys[0].time, this.startTime ); - this.endTime = Math.max( keys[keys.length - 1].time, this.endTime ); - - } - - } - - this.update( 0 ); - - } - - this.isPaused = false; - - THREE.AnimationHandler.addToUpdate( this ); - -}; - - - -// Pause - -THREE.KeyFrameAnimation.prototype.pause = function() { - - if( this.isPaused ) { - - THREE.AnimationHandler.addToUpdate( this ); - - } else { - - THREE.AnimationHandler.removeFromUpdate( this ); - - } - - this.isPaused = !this.isPaused; - -}; - - -// Stop - -THREE.KeyFrameAnimation.prototype.stop = function() { - - this.isPlaying = false; - this.isPaused = false; - - THREE.AnimationHandler.removeFromUpdate( this ); - - // reset JIT matrix and remove cache - - for ( var h = 0; h < this.data.hierarchy.length; h++ ) { - - var obj = this.hierarchy[ h ]; - var node = this.data.hierarchy[ h ]; - - if ( node.animationCache !== undefined ) { - - var original = node.animationCache.originalMatrix; - - if( obj instanceof THREE.Bone ) { - - original.copy( obj.skinMatrix ); - obj.skinMatrix = original; - - } else { - - original.copy( obj.matrix ); - obj.matrix = original; - - } - - delete node.animationCache; - - } - - } - -}; - - -// Update - -THREE.KeyFrameAnimation.prototype.update = function ( delta ) { - - if ( this.isPlaying === false ) return; - - this.currentTime += delta * this.timeScale; - - // - - var duration = this.data.length; - - if ( this.loop === true && this.currentTime > duration ) { - - this.currentTime %= duration; - - } - - this.currentTime = Math.min( this.currentTime, duration ); - - for ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) { - - var object = this.hierarchy[ h ]; - var node = this.data.hierarchy[ h ]; - - var keys = node.keys, - animationCache = node.animationCache; - - - if ( keys.length ) { - - var prevKey = animationCache.prevKey; - var nextKey = animationCache.nextKey; - - if ( nextKey.time <= this.currentTime ) { - - while ( nextKey.time < this.currentTime && nextKey.index > prevKey.index ) { - - prevKey = nextKey; - nextKey = keys[ prevKey.index + 1 ]; - - } - - animationCache.prevKey = prevKey; - animationCache.nextKey = nextKey; - - } - - if ( nextKey.time >= this.currentTime ) { - - prevKey.interpolate( nextKey, this.currentTime ); - - } else { - - prevKey.interpolate( nextKey, nextKey.time ); - - } - - this.data.hierarchy[ h ].node.updateMatrix(); - object.matrixWorldNeedsUpdate = true; - - } - - } - -}; - -// Get next key with - -THREE.KeyFrameAnimation.prototype.getNextKeyWith = function( sid, h, key ) { - - var keys = this.data.hierarchy[ h ].keys; - key = key % keys.length; - - for ( ; key < keys.length; key++ ) { - - if ( keys[ key ].hasTarget( sid ) ) { - - return keys[ key ]; - - } - - } - - return keys[ 0 ]; - -}; - -// Get previous key with - -THREE.KeyFrameAnimation.prototype.getPrevKeyWith = function( sid, h, key ) { - - var keys = this.data.hierarchy[ h ].keys; - key = key >= 0 ? key : key + keys.length; - - for ( ; key >= 0; key-- ) { - - if ( keys[ key ].hasTarget( sid ) ) { - - return keys[ key ]; - - } - - } - - return keys[ keys.length - 1 ]; - -}; - -/** - * @author mrdoob / http://mrdoob.com - */ - -THREE.MorphAnimation = function ( mesh ) { - - this.mesh = mesh; - this.frames = mesh.morphTargetInfluences.length; - this.currentTime = 0; - this.duration = 1000; - this.loop = true; - - this.isPlaying = false; - -}; - -THREE.MorphAnimation.prototype = { - - play: function () { - - this.isPlaying = true; - - }, - - pause: function () { - - this.isPlaying = false; - }, - - update: ( function () { - - var lastFrame = 0; - var currentFrame = 0; - - return function ( delta ) { - - if ( this.isPlaying === false ) return; - - this.currentTime += delta; - - if ( this.loop === true && this.currentTime > this.duration ) { - - this.currentTime %= this.duration; - - } - - this.currentTime = Math.min( this.currentTime, this.duration ); - - var interpolation = this.duration / this.frames; - var frame = Math.floor( this.currentTime / interpolation ); - - if ( frame != currentFrame ) { - - this.mesh.morphTargetInfluences[ lastFrame ] = 0; - this.mesh.morphTargetInfluences[ currentFrame ] = 1; - this.mesh.morphTargetInfluences[ frame ] = 0; - - lastFrame = currentFrame; - currentFrame = frame; - - } - - this.mesh.morphTargetInfluences[ frame ] = ( this.currentTime % interpolation ) / interpolation; - this.mesh.morphTargetInfluences[ lastFrame ] = 1 - this.mesh.morphTargetInfluences[ frame ]; - - } - - } )() - -}; - -/** - * Camera for rendering cube maps - * - renders scene into axis-aligned cube - * - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.CubeCamera = function ( near, far, cubeResolution ) { - - THREE.Object3D.call( this ); - - var fov = 90, aspect = 1; - - var cameraPX = new THREE.PerspectiveCamera( fov, aspect, near, far ); - cameraPX.up.set( 0, -1, 0 ); - cameraPX.lookAt( new THREE.Vector3( 1, 0, 0 ) ); - this.add( cameraPX ); - - var cameraNX = new THREE.PerspectiveCamera( fov, aspect, near, far ); - cameraNX.up.set( 0, -1, 0 ); - cameraNX.lookAt( new THREE.Vector3( -1, 0, 0 ) ); - this.add( cameraNX ); - - var cameraPY = new THREE.PerspectiveCamera( fov, aspect, near, far ); - cameraPY.up.set( 0, 0, 1 ); - cameraPY.lookAt( new THREE.Vector3( 0, 1, 0 ) ); - this.add( cameraPY ); - - var cameraNY = new THREE.PerspectiveCamera( fov, aspect, near, far ); - cameraNY.up.set( 0, 0, -1 ); - cameraNY.lookAt( new THREE.Vector3( 0, -1, 0 ) ); - this.add( cameraNY ); - - var cameraPZ = new THREE.PerspectiveCamera( fov, aspect, near, far ); - cameraPZ.up.set( 0, -1, 0 ); - cameraPZ.lookAt( new THREE.Vector3( 0, 0, 1 ) ); - this.add( cameraPZ ); - - var cameraNZ = new THREE.PerspectiveCamera( fov, aspect, near, far ); - cameraNZ.up.set( 0, -1, 0 ); - cameraNZ.lookAt( new THREE.Vector3( 0, 0, -1 ) ); - this.add( cameraNZ ); - - this.renderTarget = new THREE.WebGLRenderTargetCube( cubeResolution, cubeResolution, { format: THREE.RGBFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter } ); - - this.updateCubeMap = function ( renderer, scene ) { - - var renderTarget = this.renderTarget; - var generateMipmaps = renderTarget.generateMipmaps; - - renderTarget.generateMipmaps = false; - - renderTarget.activeCubeFace = 0; - renderer.render( scene, cameraPX, renderTarget ); - - renderTarget.activeCubeFace = 1; - renderer.render( scene, cameraNX, renderTarget ); - - renderTarget.activeCubeFace = 2; - renderer.render( scene, cameraPY, renderTarget ); - - renderTarget.activeCubeFace = 3; - renderer.render( scene, cameraNY, renderTarget ); - - renderTarget.activeCubeFace = 4; - renderer.render( scene, cameraPZ, renderTarget ); - - renderTarget.generateMipmaps = generateMipmaps; - - renderTarget.activeCubeFace = 5; - renderer.render( scene, cameraNZ, renderTarget ); - - }; - -}; - -THREE.CubeCamera.prototype = Object.create( THREE.Object3D.prototype ); - -/** - * @author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog - * - * A general perpose camera, for setting FOV, Lens Focal Length, - * and switching between perspective and orthographic views easily. - * Use this only if you do not wish to manage - * both a Orthographic and Perspective Camera - * - */ - - -THREE.CombinedCamera = function ( width, height, fov, near, far, orthoNear, orthoFar ) { - - THREE.Camera.call( this ); - - this.fov = fov; - - this.left = -width / 2; - this.right = width / 2 - this.top = height / 2; - this.bottom = -height / 2; - - // We could also handle the projectionMatrix internally, but just wanted to test nested camera objects - - this.cameraO = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, orthoNear, orthoFar ); - this.cameraP = new THREE.PerspectiveCamera( fov, width / height, near, far ); - - this.zoom = 1; - - this.toPerspective(); - - var aspect = width/height; - -}; - -THREE.CombinedCamera.prototype = Object.create( THREE.Camera.prototype ); - -THREE.CombinedCamera.prototype.toPerspective = function () { - - // Switches to the Perspective Camera - - this.near = this.cameraP.near; - this.far = this.cameraP.far; - - this.cameraP.fov = this.fov / this.zoom ; - - this.cameraP.updateProjectionMatrix(); - - this.projectionMatrix = this.cameraP.projectionMatrix; - - this.inPerspectiveMode = true; - this.inOrthographicMode = false; - -}; - -THREE.CombinedCamera.prototype.toOrthographic = function () { - - // Switches to the Orthographic camera estimating viewport from Perspective - - var fov = this.fov; - var aspect = this.cameraP.aspect; - var near = this.cameraP.near; - var far = this.cameraP.far; - - // The size that we set is the mid plane of the viewing frustum - - var hyperfocus = ( near + far ) / 2; - - var halfHeight = Math.tan( fov / 2 ) * hyperfocus; - var planeHeight = 2 * halfHeight; - var planeWidth = planeHeight * aspect; - var halfWidth = planeWidth / 2; - - halfHeight /= this.zoom; - halfWidth /= this.zoom; - - this.cameraO.left = -halfWidth; - this.cameraO.right = halfWidth; - this.cameraO.top = halfHeight; - this.cameraO.bottom = -halfHeight; - - // this.cameraO.left = -farHalfWidth; - // this.cameraO.right = farHalfWidth; - // this.cameraO.top = farHalfHeight; - // this.cameraO.bottom = -farHalfHeight; - - // this.cameraO.left = this.left / this.zoom; - // this.cameraO.right = this.right / this.zoom; - // this.cameraO.top = this.top / this.zoom; - // this.cameraO.bottom = this.bottom / this.zoom; - - this.cameraO.updateProjectionMatrix(); - - this.near = this.cameraO.near; - this.far = this.cameraO.far; - this.projectionMatrix = this.cameraO.projectionMatrix; - - this.inPerspectiveMode = false; - this.inOrthographicMode = true; - -}; - - -THREE.CombinedCamera.prototype.setSize = function( width, height ) { - - this.cameraP.aspect = width / height; - this.left = -width / 2; - this.right = width / 2 - this.top = height / 2; - this.bottom = -height / 2; - -}; - - -THREE.CombinedCamera.prototype.setFov = function( fov ) { - - this.fov = fov; - - if ( this.inPerspectiveMode ) { - - this.toPerspective(); - - } else { - - this.toOrthographic(); - - } - -}; - -// For mantaining similar API with PerspectiveCamera - -THREE.CombinedCamera.prototype.updateProjectionMatrix = function() { - - if ( this.inPerspectiveMode ) { - - this.toPerspective(); - - } else { - - this.toPerspective(); - this.toOrthographic(); - - } - -}; - -/* -* Uses Focal Length (in mm) to estimate and set FOV -* 35mm (fullframe) camera is used if frame size is not specified; -* Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html -*/ -THREE.CombinedCamera.prototype.setLens = function ( focalLength, frameHeight ) { - - if ( frameHeight === undefined ) frameHeight = 24; - - var fov = 2 * THREE.Math.radToDeg( Math.atan( frameHeight / ( focalLength * 2 ) ) ); - - this.setFov( fov ); - - return fov; -}; - - -THREE.CombinedCamera.prototype.setZoom = function( zoom ) { - - this.zoom = zoom; - - if ( this.inPerspectiveMode ) { - - this.toPerspective(); - - } else { - - this.toOrthographic(); - - } - -}; - -THREE.CombinedCamera.prototype.toFrontView = function() { - - this.rotation.x = 0; - this.rotation.y = 0; - this.rotation.z = 0; - - // should we be modifing the matrix instead? - - this.rotationAutoUpdate = false; - -}; - -THREE.CombinedCamera.prototype.toBackView = function() { - - this.rotation.x = 0; - this.rotation.y = Math.PI; - this.rotation.z = 0; - this.rotationAutoUpdate = false; - -}; - -THREE.CombinedCamera.prototype.toLeftView = function() { - - this.rotation.x = 0; - this.rotation.y = - Math.PI / 2; - this.rotation.z = 0; - this.rotationAutoUpdate = false; - -}; - -THREE.CombinedCamera.prototype.toRightView = function() { - - this.rotation.x = 0; - this.rotation.y = Math.PI / 2; - this.rotation.z = 0; - this.rotationAutoUpdate = false; - -}; - -THREE.CombinedCamera.prototype.toTopView = function() { - - this.rotation.x = - Math.PI / 2; - this.rotation.y = 0; - this.rotation.z = 0; - this.rotationAutoUpdate = false; - -}; - -THREE.CombinedCamera.prototype.toBottomView = function() { - - this.rotation.x = Math.PI / 2; - this.rotation.y = 0; - this.rotation.z = 0; - this.rotationAutoUpdate = false; - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as - */ - -THREE.BoxGeometry = function ( width, height, depth, widthSegments, heightSegments, depthSegments ) { - - THREE.Geometry.call( this ); - - var scope = this; - - this.width = width; - this.height = height; - this.depth = depth; - - this.widthSegments = widthSegments || 1; - this.heightSegments = heightSegments || 1; - this.depthSegments = depthSegments || 1; - - var width_half = this.width / 2; - var height_half = this.height / 2; - var depth_half = this.depth / 2; - - buildPlane( 'z', 'y', - 1, - 1, this.depth, this.height, width_half, 0 ); // px - buildPlane( 'z', 'y', 1, - 1, this.depth, this.height, - width_half, 1 ); // nx - buildPlane( 'x', 'z', 1, 1, this.width, this.depth, height_half, 2 ); // py - buildPlane( 'x', 'z', 1, - 1, this.width, this.depth, - height_half, 3 ); // ny - buildPlane( 'x', 'y', 1, - 1, this.width, this.height, depth_half, 4 ); // pz - buildPlane( 'x', 'y', - 1, - 1, this.width, this.height, - depth_half, 5 ); // nz - - function buildPlane( u, v, udir, vdir, width, height, depth, materialIndex ) { - - var w, ix, iy, - gridX = scope.widthSegments, - gridY = scope.heightSegments, - width_half = width / 2, - height_half = height / 2, - offset = scope.vertices.length; - - if ( ( u === 'x' && v === 'y' ) || ( u === 'y' && v === 'x' ) ) { - - w = 'z'; - - } else if ( ( u === 'x' && v === 'z' ) || ( u === 'z' && v === 'x' ) ) { - - w = 'y'; - gridY = scope.depthSegments; - - } else if ( ( u === 'z' && v === 'y' ) || ( u === 'y' && v === 'z' ) ) { - - w = 'x'; - gridX = scope.depthSegments; - - } - - var gridX1 = gridX + 1, - gridY1 = gridY + 1, - segment_width = width / gridX, - segment_height = height / gridY, - normal = new THREE.Vector3(); - - normal[ w ] = depth > 0 ? 1 : - 1; - - for ( iy = 0; iy < gridY1; iy ++ ) { - - for ( ix = 0; ix < gridX1; ix ++ ) { - - var vector = new THREE.Vector3(); - vector[ u ] = ( ix * segment_width - width_half ) * udir; - vector[ v ] = ( iy * segment_height - height_half ) * vdir; - vector[ w ] = depth; - - scope.vertices.push( vector ); - - } - - } - - for ( iy = 0; iy < gridY; iy++ ) { - - for ( ix = 0; ix < gridX; ix++ ) { - - var a = ix + gridX1 * iy; - var b = ix + gridX1 * ( iy + 1 ); - var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); - var d = ( ix + 1 ) + gridX1 * iy; - - var uva = new THREE.Vector2( ix / gridX, 1 - iy / gridY ); - var uvb = new THREE.Vector2( ix / gridX, 1 - ( iy + 1 ) / gridY ); - var uvc = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - ( iy + 1 ) / gridY ); - var uvd = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - iy / gridY ); - - var face = new THREE.Face3( a + offset, b + offset, d + offset ); - face.normal.copy( normal ); - face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() ); - face.materialIndex = materialIndex; - - scope.faces.push( face ); - scope.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); - - face = new THREE.Face3( b + offset, c + offset, d + offset ); - face.normal.copy( normal ); - face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() ); - face.materialIndex = materialIndex; - - scope.faces.push( face ); - scope.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); - - } - - } - - } - - this.computeCentroids(); - this.mergeVertices(); - -}; - -THREE.BoxGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author hughes - */ - -THREE.CircleGeometry = function ( radius, segments, thetaStart, thetaLength ) { - - THREE.Geometry.call( this ); - - this.radius = radius = radius || 50; - this.segments = segments = segments !== undefined ? Math.max( 3, segments ) : 8; - - this.thetaStart = thetaStart = thetaStart !== undefined ? thetaStart : 0; - this.thetaLength = thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; - - var i, uvs = [], - center = new THREE.Vector3(), centerUV = new THREE.Vector2( 0.5, 0.5 ); - - this.vertices.push(center); - uvs.push( centerUV ); - - for ( i = 0; i <= segments; i ++ ) { - - var vertex = new THREE.Vector3(); - var segment = thetaStart + i / segments * thetaLength; - - vertex.x = radius * Math.cos( segment ); - vertex.y = radius * Math.sin( segment ); - - this.vertices.push( vertex ); - uvs.push( new THREE.Vector2( ( vertex.x / radius + 1 ) / 2, ( vertex.y / radius + 1 ) / 2 ) ); - - } - - var n = new THREE.Vector3( 0, 0, 1 ); - - for ( i = 1; i <= segments; i ++ ) { - - var v1 = i; - var v2 = i + 1 ; - var v3 = 0; - - this.faces.push( new THREE.Face3( v1, v2, v3, [ n.clone(), n.clone(), n.clone() ] ) ); - this.faceVertexUvs[ 0 ].push( [ uvs[ i ].clone(), uvs[ i + 1 ].clone(), centerUV.clone() ] ); - - } - - this.computeCentroids(); - this.computeFaceNormals(); - - this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); - -}; - -THREE.CircleGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -// DEPRECATED - -THREE.CubeGeometry = THREE.BoxGeometry; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.CylinderGeometry = function ( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded ) { - - THREE.Geometry.call( this ); - - this.radiusTop = radiusTop = radiusTop !== undefined ? radiusTop : 20; - this.radiusBottom = radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; - this.height = height = height !== undefined ? height : 100; - - this.radialSegments = radialSegments = radialSegments || 8; - this.heightSegments = heightSegments = heightSegments || 1; - - this.openEnded = openEnded = openEnded !== undefined ? openEnded : false; - - var heightHalf = height / 2; - - var x, y, vertices = [], uvs = []; - - for ( y = 0; y <= heightSegments; y ++ ) { - - var verticesRow = []; - var uvsRow = []; - - var v = y / heightSegments; - var radius = v * ( radiusBottom - radiusTop ) + radiusTop; - - for ( x = 0; x <= radialSegments; x ++ ) { - - var u = x / radialSegments; - - var vertex = new THREE.Vector3(); - vertex.x = radius * Math.sin( u * Math.PI * 2 ); - vertex.y = - v * height + heightHalf; - vertex.z = radius * Math.cos( u * Math.PI * 2 ); - - this.vertices.push( vertex ); - - verticesRow.push( this.vertices.length - 1 ); - uvsRow.push( new THREE.Vector2( u, 1 - v ) ); - - } - - vertices.push( verticesRow ); - uvs.push( uvsRow ); - - } - - var tanTheta = ( radiusBottom - radiusTop ) / height; - var na, nb; - - for ( x = 0; x < radialSegments; x ++ ) { - - if ( radiusTop !== 0 ) { - - na = this.vertices[ vertices[ 0 ][ x ] ].clone(); - nb = this.vertices[ vertices[ 0 ][ x + 1 ] ].clone(); - - } else { - - na = this.vertices[ vertices[ 1 ][ x ] ].clone(); - nb = this.vertices[ vertices[ 1 ][ x + 1 ] ].clone(); - - } - - na.setY( Math.sqrt( na.x * na.x + na.z * na.z ) * tanTheta ).normalize(); - nb.setY( Math.sqrt( nb.x * nb.x + nb.z * nb.z ) * tanTheta ).normalize(); - - for ( y = 0; y < heightSegments; y ++ ) { - - var v1 = vertices[ y ][ x ]; - var v2 = vertices[ y + 1 ][ x ]; - var v3 = vertices[ y + 1 ][ x + 1 ]; - var v4 = vertices[ y ][ x + 1 ]; - - var n1 = na.clone(); - var n2 = na.clone(); - var n3 = nb.clone(); - var n4 = nb.clone(); - - var uv1 = uvs[ y ][ x ].clone(); - var uv2 = uvs[ y + 1 ][ x ].clone(); - var uv3 = uvs[ y + 1 ][ x + 1 ].clone(); - var uv4 = uvs[ y ][ x + 1 ].clone(); - - this.faces.push( new THREE.Face3( v1, v2, v4, [ n1, n2, n4 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv4 ] ); - - this.faces.push( new THREE.Face3( v2, v3, v4, [ n2.clone(), n3, n4.clone() ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv2.clone(), uv3, uv4.clone() ] ); - - } - - } - - // top cap - - if ( openEnded === false && radiusTop > 0 ) { - - this.vertices.push( new THREE.Vector3( 0, heightHalf, 0 ) ); - - for ( x = 0; x < radialSegments; x ++ ) { - - var v1 = vertices[ 0 ][ x ]; - var v2 = vertices[ 0 ][ x + 1 ]; - var v3 = this.vertices.length - 1; - - var n1 = new THREE.Vector3( 0, 1, 0 ); - var n2 = new THREE.Vector3( 0, 1, 0 ); - var n3 = new THREE.Vector3( 0, 1, 0 ); - - var uv1 = uvs[ 0 ][ x ].clone(); - var uv2 = uvs[ 0 ][ x + 1 ].clone(); - var uv3 = new THREE.Vector2( uv2.x, 0 ); - - this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); - - } - - } - - // bottom cap - - if ( openEnded === false && radiusBottom > 0 ) { - - this.vertices.push( new THREE.Vector3( 0, - heightHalf, 0 ) ); - - for ( x = 0; x < radialSegments; x ++ ) { - - var v1 = vertices[ y ][ x + 1 ]; - var v2 = vertices[ y ][ x ]; - var v3 = this.vertices.length - 1; - - var n1 = new THREE.Vector3( 0, - 1, 0 ); - var n2 = new THREE.Vector3( 0, - 1, 0 ); - var n3 = new THREE.Vector3( 0, - 1, 0 ); - - var uv1 = uvs[ y ][ x + 1 ].clone(); - var uv2 = uvs[ y ][ x ].clone(); - var uv3 = new THREE.Vector2( uv2.x, 1 ); - - this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); - - } - - } - - this.computeCentroids(); - this.computeFaceNormals(); - -} - -THREE.CylinderGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * - * Creates extruded geometry from a path shape. - * - * parameters = { - * - * curveSegments: , // number of points on the curves - * steps: , // number of points for z-side extrusions / used for subdividing segements of extrude spline too - * amount: , // Depth to extrude the shape - * - * bevelEnabled: , // turn on bevel - * bevelThickness: , // how deep into the original shape bevel goes - * bevelSize: , // how far from shape outline is bevel - * bevelSegments: , // number of bevel layers - * - * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined) - * frames: // containing arrays of tangents, normals, binormals - * - * material: // material index for front and back faces - * extrudeMaterial: // material index for extrusion and beveled faces - * uvGenerator: // object that provides UV generator functions - * - * } - **/ - -THREE.ExtrudeGeometry = function ( shapes, options ) { - - if ( typeof( shapes ) === "undefined" ) { - shapes = []; - return; - } - - THREE.Geometry.call( this ); - - shapes = shapes instanceof Array ? shapes : [ shapes ]; - - this.shapebb = shapes[ shapes.length - 1 ].getBoundingBox(); - - this.addShapeList( shapes, options ); - - this.computeCentroids(); - this.computeFaceNormals(); - - // can't really use automatic vertex normals - // as then front and back sides get smoothed too - // should do separate smoothing just for sides - - //this.computeVertexNormals(); - - //console.log( "took", ( Date.now() - startTime ) ); - -}; - -THREE.ExtrudeGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -THREE.ExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) { - var sl = shapes.length; - - for ( var s = 0; s < sl; s ++ ) { - var shape = shapes[ s ]; - this.addShape( shape, options ); - } -}; - -THREE.ExtrudeGeometry.prototype.addShape = function ( shape, options ) { - - var amount = options.amount !== undefined ? options.amount : 100; - - var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 - var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 - var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; - - var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false - - var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; - - var steps = options.steps !== undefined ? options.steps : 1; - - var extrudePath = options.extrudePath; - var extrudePts, extrudeByPath = false; - - var material = options.material; - var extrudeMaterial = options.extrudeMaterial; - - // Use default WorldUVGenerator if no UV generators are specified. - var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : THREE.ExtrudeGeometry.WorldUVGenerator; - - var shapebb = this.shapebb; - //shapebb = shape.getBoundingBox(); - - - - var splineTube, binormal, normal, position2; - if ( extrudePath ) { - - extrudePts = extrudePath.getSpacedPoints( steps ); - - extrudeByPath = true; - bevelEnabled = false; // bevels not supported for path extrusion - - // SETUP TNB variables - - // Reuse TNB from TubeGeomtry for now. - // TODO1 - have a .isClosed in spline? - - splineTube = options.frames !== undefined ? options.frames : new THREE.TubeGeometry.FrenetFrames(extrudePath, steps, false); - - // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); - - binormal = new THREE.Vector3(); - normal = new THREE.Vector3(); - position2 = new THREE.Vector3(); - - } - - // Safeguards if bevels are not enabled - - if ( ! bevelEnabled ) { - - bevelSegments = 0; - bevelThickness = 0; - bevelSize = 0; - - } - - // Variables initalization - - var ahole, h, hl; // looping of holes - var scope = this; - var bevelPoints = []; - - var shapesOffset = this.vertices.length; - - var shapePoints = shape.extractPoints( curveSegments ); - - var vertices = shapePoints.shape; - var holes = shapePoints.holes; - - var reverse = !THREE.Shape.Utils.isClockWise( vertices ) ; - - if ( reverse ) { - - vertices = vertices.reverse(); - - // Maybe we should also check if holes are in the opposite direction, just to be safe ... - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - - if ( THREE.Shape.Utils.isClockWise( ahole ) ) { - - holes[ h ] = ahole.reverse(); - - } - - } - - reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! - - } - - - var faces = THREE.Shape.Utils.triangulateShape ( vertices, holes ); - - /* Vertices */ - - var contour = vertices; // vertices has all points but contour has only points of circumference - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - - vertices = vertices.concat( ahole ); - - } - - - function scalePt2 ( pt, vec, size ) { - - if ( !vec ) console.log( "die" ); - - return vec.clone().multiplyScalar( size ).add( pt ); - - } - - var b, bs, t, z, - vert, vlen = vertices.length, - face, flen = faces.length, - cont, clen = contour.length; - - - // Find directions for point movement - - var RAD_TO_DEGREES = 180 / Math.PI; - - - function getBevelVec( inPt, inPrev, inNext ) { - - var EPSILON = 0.0000000001; - var sign = THREE.Math.sign; - - // computes for inPt the corresponding point inPt' on a new contour - // shiftet by 1 unit (length of normalized vector) to the left - // if we walk along contour clockwise, this new contour is outside the old one - // - // inPt' is the intersection of the two lines parallel to the two - // adjacent edges of inPt at a distance of 1 unit on the left side. - - var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt - - // good reading for geometry algorithms (here: line-line intersection) - // http://geomalgorithms.com/a05-_intersect-1.html - - var v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; - var v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; - - var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); - - // check for colinear edges - var colinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); - - if ( Math.abs( colinear0 ) > EPSILON ) { // not colinear - - // length of vectors for normalizing - - var v_prev_len = Math.sqrt( v_prev_lensq ); - var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); - - // shift adjacent points by unit vectors to the left - - var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); - var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); - - var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); - var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); - - // scaling factor for v_prev to intersection point - - var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - - ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / - ( v_prev_x * v_next_y - v_prev_y * v_next_x ); - - // vector from inPt to intersection point - - v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); - v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); - - // Don't normalize!, otherwise sharp corners become ugly - // but prevent crazy spikes - var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ) - if ( v_trans_lensq <= 2 ) { - return new THREE.Vector2( v_trans_x, v_trans_y ); - } else { - shrink_by = Math.sqrt( v_trans_lensq / 2 ); - } - - } else { // handle special case of colinear edges - - var direction_eq = false; // assumes: opposite - if ( v_prev_x > EPSILON ) { - if ( v_next_x > EPSILON ) { direction_eq = true; } - } else { - if ( v_prev_x < -EPSILON ) { - if ( v_next_x < -EPSILON ) { direction_eq = true; } - } else { - if ( sign(v_prev_y) == sign(v_next_y) ) { direction_eq = true; } - } - } - - if ( direction_eq ) { - // console.log("Warning: lines are a straight sequence"); - v_trans_x = -v_prev_y; - v_trans_y = v_prev_x; - shrink_by = Math.sqrt( v_prev_lensq ); - } else { - // console.log("Warning: lines are a straight spike"); - v_trans_x = v_prev_x; - v_trans_y = v_prev_y; - shrink_by = Math.sqrt( v_prev_lensq / 2 ); - } - - } - - return new THREE.Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); - - } - - - var contourMovements = []; - - for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { - - if ( j === il ) j = 0; - if ( k === il ) k = 0; - - // (j)---(i)---(k) - // console.log('i,j,k', i, j , k) - - var pt_i = contour[ i ]; - var pt_j = contour[ j ]; - var pt_k = contour[ k ]; - - contourMovements[ i ]= getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); - - } - - var holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat(); - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - - oneHoleMovements = []; - - for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { - - if ( j === il ) j = 0; - if ( k === il ) k = 0; - - // (j)---(i)---(k) - oneHoleMovements[ i ]= getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); - - } - - holesMovements.push( oneHoleMovements ); - verticesMovements = verticesMovements.concat( oneHoleMovements ); - - } - - - // Loop bevelSegments, 1 for the front, 1 for the back - - for ( b = 0; b < bevelSegments; b ++ ) { - //for ( b = bevelSegments; b > 0; b -- ) { - - t = b / bevelSegments; - z = bevelThickness * ( 1 - t ); - - //z = bevelThickness * t; - bs = bevelSize * ( Math.sin ( t * Math.PI/2 ) ) ; // curved - //bs = bevelSize * t ; // linear - - // contract shape - - for ( i = 0, il = contour.length; i < il; i ++ ) { - - vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); - //vert = scalePt( contour[ i ], contourCentroid, bs, false ); - v( vert.x, vert.y, - z ); - - } - - // expand holes - - for ( h = 0, hl = holes.length; h < hl; h++ ) { - - ahole = holes[ h ]; - oneHoleMovements = holesMovements[ h ]; - - for ( i = 0, il = ahole.length; i < il; i++ ) { - - vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); - //vert = scalePt( ahole[ i ], holesCentroids[ h ], bs, true ); - - v( vert.x, vert.y, -z ); - - } - - } - - } - - bs = bevelSize; - - // Back facing vertices - - for ( i = 0; i < vlen; i ++ ) { - - vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; - - if ( !extrudeByPath ) { - - v( vert.x, vert.y, 0 ); - - } else { - - // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); - - normal.copy( splineTube.normals[0] ).multiplyScalar(vert.x); - binormal.copy( splineTube.binormals[0] ).multiplyScalar(vert.y); - - position2.copy( extrudePts[0] ).add(normal).add(binormal); - - v( position2.x, position2.y, position2.z ); - - } - - } - - // Add stepped vertices... - // Including front facing vertices - - var s; - - for ( s = 1; s <= steps; s ++ ) { - - for ( i = 0; i < vlen; i ++ ) { - - vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; - - if ( !extrudeByPath ) { - - v( vert.x, vert.y, amount / steps * s ); - - } else { - - // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); - - normal.copy( splineTube.normals[s] ).multiplyScalar( vert.x ); - binormal.copy( splineTube.binormals[s] ).multiplyScalar( vert.y ); - - position2.copy( extrudePts[s] ).add( normal ).add( binormal ); - - v( position2.x, position2.y, position2.z ); - - } - - } - - } - - - // Add bevel segments planes - - //for ( b = 1; b <= bevelSegments; b ++ ) { - for ( b = bevelSegments - 1; b >= 0; b -- ) { - - t = b / bevelSegments; - z = bevelThickness * ( 1 - t ); - //bs = bevelSize * ( 1-Math.sin ( ( 1 - t ) * Math.PI/2 ) ); - bs = bevelSize * Math.sin ( t * Math.PI/2 ) ; - - // contract shape - - for ( i = 0, il = contour.length; i < il; i ++ ) { - - vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); - v( vert.x, vert.y, amount + z ); - - } - - // expand holes - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - oneHoleMovements = holesMovements[ h ]; - - for ( i = 0, il = ahole.length; i < il; i ++ ) { - - vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); - - if ( !extrudeByPath ) { - - v( vert.x, vert.y, amount + z ); - - } else { - - v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); - - } - - } - - } - - } - - /* Faces */ - - // Top and bottom faces - - buildLidFaces(); - - // Sides faces - - buildSideFaces(); - - - ///// Internal functions - - function buildLidFaces() { - - if ( bevelEnabled ) { - - var layer = 0 ; // steps + 1 - var offset = vlen * layer; - - // Bottom faces - - for ( i = 0; i < flen; i ++ ) { - - face = faces[ i ]; - f3( face[ 2 ]+ offset, face[ 1 ]+ offset, face[ 0 ] + offset, true ); - - } - - layer = steps + bevelSegments * 2; - offset = vlen * layer; - - // Top faces - - for ( i = 0; i < flen; i ++ ) { - - face = faces[ i ]; - f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset, false ); - - } - - } else { - - // Bottom faces - - for ( i = 0; i < flen; i++ ) { - - face = faces[ i ]; - f3( face[ 2 ], face[ 1 ], face[ 0 ], true ); - - } - - // Top faces - - for ( i = 0; i < flen; i ++ ) { - - face = faces[ i ]; - f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps, false ); - - } - } - - } - - // Create faces for the z-sides of the shape - - function buildSideFaces() { - - var layeroffset = 0; - sidewalls( contour, layeroffset ); - layeroffset += contour.length; - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - sidewalls( ahole, layeroffset ); - - //, true - layeroffset += ahole.length; - - } - - } - - function sidewalls( contour, layeroffset ) { - - var j, k; - i = contour.length; - - while ( --i >= 0 ) { - - j = i; - k = i - 1; - if ( k < 0 ) k = contour.length - 1; - - //console.log('b', i,j, i-1, k,vertices.length); - - var s = 0, sl = steps + bevelSegments * 2; - - for ( s = 0; s < sl; s ++ ) { - - var slen1 = vlen * s; - var slen2 = vlen * ( s + 1 ); - - var a = layeroffset + j + slen1, - b = layeroffset + k + slen1, - c = layeroffset + k + slen2, - d = layeroffset + j + slen2; - - f4( a, b, c, d, contour, s, sl, j, k ); - - } - } - - } - - - function v( x, y, z ) { - - scope.vertices.push( new THREE.Vector3( x, y, z ) ); - - } - - function f3( a, b, c, isBottom ) { - - a += shapesOffset; - b += shapesOffset; - c += shapesOffset; - - // normal, color, material - scope.faces.push( new THREE.Face3( a, b, c, null, null, material ) ); - - var uvs = isBottom ? uvgen.generateBottomUV( scope, shape, options, a, b, c ) : uvgen.generateTopUV( scope, shape, options, a, b, c ); - - scope.faceVertexUvs[ 0 ].push( uvs ); - - } - - function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { - - a += shapesOffset; - b += shapesOffset; - c += shapesOffset; - d += shapesOffset; - - scope.faces.push( new THREE.Face3( a, b, d, null, null, extrudeMaterial ) ); - scope.faces.push( new THREE.Face3( b, c, d, null, null, extrudeMaterial ) ); - - var uvs = uvgen.generateSideWallUV( scope, shape, wallContour, options, a, b, c, d, - stepIndex, stepsLength, contourIndex1, contourIndex2 ); - - scope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] ); - scope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] ); - - } - -}; - -THREE.ExtrudeGeometry.WorldUVGenerator = { - - generateTopUV: function( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC ) { - var ax = geometry.vertices[ indexA ].x, - ay = geometry.vertices[ indexA ].y, - - bx = geometry.vertices[ indexB ].x, - by = geometry.vertices[ indexB ].y, - - cx = geometry.vertices[ indexC ].x, - cy = geometry.vertices[ indexC ].y; - - return [ - new THREE.Vector2( ax, ay ), - new THREE.Vector2( bx, by ), - new THREE.Vector2( cx, cy ) - ]; - - }, - - generateBottomUV: function( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC ) { - - return this.generateTopUV( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC ); - - }, - - generateSideWallUV: function( geometry, extrudedShape, wallContour, extrudeOptions, - indexA, indexB, indexC, indexD, stepIndex, stepsLength, - contourIndex1, contourIndex2 ) { - - var ax = geometry.vertices[ indexA ].x, - ay = geometry.vertices[ indexA ].y, - az = geometry.vertices[ indexA ].z, - - bx = geometry.vertices[ indexB ].x, - by = geometry.vertices[ indexB ].y, - bz = geometry.vertices[ indexB ].z, - - cx = geometry.vertices[ indexC ].x, - cy = geometry.vertices[ indexC ].y, - cz = geometry.vertices[ indexC ].z, - - dx = geometry.vertices[ indexD ].x, - dy = geometry.vertices[ indexD ].y, - dz = geometry.vertices[ indexD ].z; - - if ( Math.abs( ay - by ) < 0.01 ) { - return [ - new THREE.Vector2( ax, 1 - az ), - new THREE.Vector2( bx, 1 - bz ), - new THREE.Vector2( cx, 1 - cz ), - new THREE.Vector2( dx, 1 - dz ) - ]; - } else { - return [ - new THREE.Vector2( ay, 1 - az ), - new THREE.Vector2( by, 1 - bz ), - new THREE.Vector2( cy, 1 - cz ), - new THREE.Vector2( dy, 1 - dz ) - ]; - } - } -}; - -THREE.ExtrudeGeometry.__v1 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v2 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v3 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v4 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v5 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v6 = new THREE.Vector2(); - -/** - * @author jonobr1 / http://jonobr1.com - * - * Creates a one-sided polygonal geometry from a path shape. Similar to - * ExtrudeGeometry. - * - * parameters = { - * - * curveSegments: , // number of points on the curves. NOT USED AT THE MOMENT. - * - * material: // material index for front and back faces - * uvGenerator: // object that provides UV generator functions - * - * } - **/ - -THREE.ShapeGeometry = function ( shapes, options ) { - - THREE.Geometry.call( this ); - - if ( shapes instanceof Array === false ) shapes = [ shapes ]; - - this.shapebb = shapes[ shapes.length - 1 ].getBoundingBox(); - - this.addShapeList( shapes, options ); - - this.computeCentroids(); - this.computeFaceNormals(); - -}; - -THREE.ShapeGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * Add an array of shapes to THREE.ShapeGeometry. - */ -THREE.ShapeGeometry.prototype.addShapeList = function ( shapes, options ) { - - for ( var i = 0, l = shapes.length; i < l; i++ ) { - - this.addShape( shapes[ i ], options ); - - } - - return this; - -}; - -/** - * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry. - */ -THREE.ShapeGeometry.prototype.addShape = function ( shape, options ) { - - if ( options === undefined ) options = {}; - var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; - - var material = options.material; - var uvgen = options.UVGenerator === undefined ? THREE.ExtrudeGeometry.WorldUVGenerator : options.UVGenerator; - - var shapebb = this.shapebb; - - // - - var i, l, hole, s; - - var shapesOffset = this.vertices.length; - var shapePoints = shape.extractPoints( curveSegments ); - - var vertices = shapePoints.shape; - var holes = shapePoints.holes; - - var reverse = !THREE.Shape.Utils.isClockWise( vertices ); - - if ( reverse ) { - - vertices = vertices.reverse(); - - // Maybe we should also check if holes are in the opposite direction, just to be safe... - - for ( i = 0, l = holes.length; i < l; i++ ) { - - hole = holes[ i ]; - - if ( THREE.Shape.Utils.isClockWise( hole ) ) { - - holes[ i ] = hole.reverse(); - - } - - } - - reverse = false; - - } - - var faces = THREE.Shape.Utils.triangulateShape( vertices, holes ); - - // Vertices - - var contour = vertices; - - for ( i = 0, l = holes.length; i < l; i++ ) { - - hole = holes[ i ]; - vertices = vertices.concat( hole ); - - } - - // - - var vert, vlen = vertices.length; - var face, flen = faces.length; - var cont, clen = contour.length; - - for ( i = 0; i < vlen; i++ ) { - - vert = vertices[ i ]; - - this.vertices.push( new THREE.Vector3( vert.x, vert.y, 0 ) ); - - } - - for ( i = 0; i < flen; i++ ) { - - face = faces[ i ]; - - var a = face[ 0 ] + shapesOffset; - var b = face[ 1 ] + shapesOffset; - var c = face[ 2 ] + shapesOffset; - - this.faces.push( new THREE.Face3( a, b, c, null, null, material ) ); - this.faceVertexUvs[ 0 ].push( uvgen.generateBottomUV( this, shape, options, a, b, c ) ); - - } - -}; - -/** - * @author astrodud / http://astrodud.isgreat.org/ - * @author zz85 / https://github.com/zz85 - * @author bhouston / http://exocortex.com - */ - -// points - to create a closed torus, one must use a set of points -// like so: [ a, b, c, d, a ], see first is the same as last. -// segments - the number of circumference segments to create -// phiStart - the starting radian -// phiLength - the radian (0 to 2*PI) range of the lathed section -// 2*pi is a closed lathe, less than 2PI is a portion. -THREE.LatheGeometry = function ( points, segments, phiStart, phiLength ) { - - THREE.Geometry.call( this ); - - segments = segments || 12; - phiStart = phiStart || 0; - phiLength = phiLength || 2 * Math.PI; - - var inversePointLength = 1.0 / ( points.length - 1 ); - var inverseSegments = 1.0 / segments; - - for ( var i = 0, il = segments; i <= il; i ++ ) { - - var phi = phiStart + i * inverseSegments * phiLength; - - var c = Math.cos( phi ), - s = Math.sin( phi ); - - for ( var j = 0, jl = points.length; j < jl; j ++ ) { - - var pt = points[ j ]; - - var vertex = new THREE.Vector3(); - - vertex.x = c * pt.x - s * pt.y; - vertex.y = s * pt.x + c * pt.y; - vertex.z = pt.z; - - this.vertices.push( vertex ); - - } - - } - - var np = points.length; - - for ( var i = 0, il = segments; i < il; i ++ ) { - - for ( var j = 0, jl = points.length - 1; j < jl; j ++ ) { - - var base = j + np * i; - var a = base; - var b = base + np; - var c = base + 1 + np; - var d = base + 1; - - var u0 = i * inverseSegments; - var v0 = j * inversePointLength; - var u1 = u0 + inverseSegments; - var v1 = v0 + inversePointLength; - - this.faces.push( new THREE.Face3( a, b, d ) ); - - this.faceVertexUvs[ 0 ].push( [ - - new THREE.Vector2( u0, v0 ), - new THREE.Vector2( u1, v0 ), - new THREE.Vector2( u0, v1 ) - - ] ); - - this.faces.push( new THREE.Face3( b, c, d ) ); - - this.faceVertexUvs[ 0 ].push( [ - - new THREE.Vector2( u1, v0 ), - new THREE.Vector2( u1, v1 ), - new THREE.Vector2( u0, v1 ) - - ] ); - - - } - - } - - this.mergeVertices(); - this.computeCentroids(); - this.computeFaceNormals(); - this.computeVertexNormals(); - -}; - -THREE.LatheGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author mrdoob / http://mrdoob.com/ - * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as - */ - -THREE.PlaneGeometry = function ( width, height, widthSegments, heightSegments ) { - - THREE.Geometry.call( this ); - - this.width = width; - this.height = height; - - this.widthSegments = widthSegments || 1; - this.heightSegments = heightSegments || 1; - - var ix, iz; - var width_half = width / 2; - var height_half = height / 2; - - var gridX = this.widthSegments; - var gridZ = this.heightSegments; - - var gridX1 = gridX + 1; - var gridZ1 = gridZ + 1; - - var segment_width = this.width / gridX; - var segment_height = this.height / gridZ; - - var normal = new THREE.Vector3( 0, 0, 1 ); - - for ( iz = 0; iz < gridZ1; iz ++ ) { - - for ( ix = 0; ix < gridX1; ix ++ ) { - - var x = ix * segment_width - width_half; - var y = iz * segment_height - height_half; - - this.vertices.push( new THREE.Vector3( x, - y, 0 ) ); - - } - - } - - for ( iz = 0; iz < gridZ; iz ++ ) { - - for ( ix = 0; ix < gridX; ix ++ ) { - - var a = ix + gridX1 * iz; - var b = ix + gridX1 * ( iz + 1 ); - var c = ( ix + 1 ) + gridX1 * ( iz + 1 ); - var d = ( ix + 1 ) + gridX1 * iz; - - var uva = new THREE.Vector2( ix / gridX, 1 - iz / gridZ ); - var uvb = new THREE.Vector2( ix / gridX, 1 - ( iz + 1 ) / gridZ ); - var uvc = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - ( iz + 1 ) / gridZ ); - var uvd = new THREE.Vector2( ( ix + 1 ) / gridX, 1 - iz / gridZ ); - - var face = new THREE.Face3( a, b, d ); - face.normal.copy( normal ); - face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() ); - - this.faces.push( face ); - this.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); - - face = new THREE.Face3( b, c, d ); - face.normal.copy( normal ); - face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone() ); - - this.faces.push( face ); - this.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); - - } - - } - - this.computeCentroids(); - -}; - -THREE.PlaneGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author Kaleb Murphy - */ - -THREE.RingGeometry = function ( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { - - THREE.Geometry.call( this ); - - innerRadius = innerRadius || 0; - outerRadius = outerRadius || 50; - - thetaStart = thetaStart !== undefined ? thetaStart : 0; - thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; - - thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; - phiSegments = phiSegments !== undefined ? Math.max( 3, phiSegments ) : 8; - - var i, o, uvs = [], radius = innerRadius, radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); - - for ( i = 0; i <= phiSegments; i ++ ) { // concentric circles inside ring - - for ( o = 0; o <= thetaSegments; o ++ ) { // number of segments per circle - - var vertex = new THREE.Vector3(); - var segment = thetaStart + o / thetaSegments * thetaLength; - - vertex.x = radius * Math.cos( segment ); - vertex.y = radius * Math.sin( segment ); - - this.vertices.push( vertex ); - uvs.push( new THREE.Vector2( ( vertex.x / outerRadius + 1 ) / 2, ( vertex.y / outerRadius + 1 ) / 2 ) ); - } - - radius += radiusStep; - - } - - var n = new THREE.Vector3( 0, 0, 1 ); - - for ( i = 0; i < phiSegments; i ++ ) { // concentric circles inside ring - - var thetaSegment = i * thetaSegments; - - for ( o = 0; o <= thetaSegments; o ++ ) { // number of segments per circle - - var segment = o + thetaSegment; - - var v1 = segment + i; - var v2 = segment + thetaSegments + i; - var v3 = segment + thetaSegments + 1 + i; - - this.faces.push( new THREE.Face3( v1, v2, v3, [ n.clone(), n.clone(), n.clone() ] ) ); - this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ].clone(), uvs[ v2 ].clone(), uvs[ v3 ].clone() ]); - - v1 = segment + i; - v2 = segment + thetaSegments + 1 + i; - v3 = segment + 1 + i; - - this.faces.push( new THREE.Face3( v1, v2, v3, [ n.clone(), n.clone(), n.clone() ] ) ); - this.faceVertexUvs[ 0 ].push( [ uvs[ v1 ].clone(), uvs[ v2 ].clone(), uvs[ v3 ].clone() ]); - - } - } - - this.computeCentroids(); - this.computeFaceNormals(); - - this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); - -}; - -THREE.RingGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.SphereGeometry = function ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { - - THREE.Geometry.call( this ); - - this.radius = radius = radius || 50; - - this.widthSegments = widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); - this.heightSegments = heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); - - this.phiStart = phiStart = phiStart !== undefined ? phiStart : 0; - this.phiLength = phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; - - this.thetaStart = thetaStart = thetaStart !== undefined ? thetaStart : 0; - this.thetaLength = thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; - - var x, y, vertices = [], uvs = []; - - for ( y = 0; y <= heightSegments; y ++ ) { - - var verticesRow = []; - var uvsRow = []; - - for ( x = 0; x <= widthSegments; x ++ ) { - - var u = x / widthSegments; - var v = y / heightSegments; - - var vertex = new THREE.Vector3(); - vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); - vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); - vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); - - this.vertices.push( vertex ); - - verticesRow.push( this.vertices.length - 1 ); - uvsRow.push( new THREE.Vector2( u, 1 - v ) ); - - } - - vertices.push( verticesRow ); - uvs.push( uvsRow ); - - } - - for ( y = 0; y < this.heightSegments; y ++ ) { - - for ( x = 0; x < this.widthSegments; x ++ ) { - - var v1 = vertices[ y ][ x + 1 ]; - var v2 = vertices[ y ][ x ]; - var v3 = vertices[ y + 1 ][ x ]; - var v4 = vertices[ y + 1 ][ x + 1 ]; - - var n1 = this.vertices[ v1 ].clone().normalize(); - var n2 = this.vertices[ v2 ].clone().normalize(); - var n3 = this.vertices[ v3 ].clone().normalize(); - var n4 = this.vertices[ v4 ].clone().normalize(); - - var uv1 = uvs[ y ][ x + 1 ].clone(); - var uv2 = uvs[ y ][ x ].clone(); - var uv3 = uvs[ y + 1 ][ x ].clone(); - var uv4 = uvs[ y + 1 ][ x + 1 ].clone(); - - if ( Math.abs( this.vertices[ v1 ].y ) === this.radius ) { - - uv1.x = ( uv1.x + uv2.x ) / 2; - this.faces.push( new THREE.Face3( v1, v3, v4, [ n1, n3, n4 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv3, uv4 ] ); - - } else if ( Math.abs( this.vertices[ v3 ].y ) === this.radius ) { - - uv3.x = ( uv3.x + uv4.x ) / 2; - this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); - - } else { - - this.faces.push( new THREE.Face3( v1, v2, v4, [ n1, n2, n4 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv4 ] ); - - this.faces.push( new THREE.Face3( v2, v3, v4, [ n2.clone(), n3, n4.clone() ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv2.clone(), uv3, uv4.clone() ] ); - - } - - } - - } - - this.computeCentroids(); - this.computeFaceNormals(); - - this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); - -}; - -THREE.SphereGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * @author alteredq / http://alteredqualia.com/ - * - * For creating 3D text geometry in three.js - * - * Text = 3D Text - * - * parameters = { - * size: , // size of the text - * height: , // thickness to extrude text - * curveSegments: , // number of points on the curves - * - * font: , // font name - * weight: , // font weight (normal, bold) - * style: , // font style (normal, italics) - * - * bevelEnabled: , // turn on bevel - * bevelThickness: , // how deep into text bevel goes - * bevelSize: , // how far from text outline is bevel - * } - * - */ - -/* Usage Examples - - // TextGeometry wrapper - - var text3d = new TextGeometry( text, options ); - - // Complete manner - - var textShapes = THREE.FontUtils.generateShapes( text, options ); - var text3d = new ExtrudeGeometry( textShapes, options ); - -*/ - - -THREE.TextGeometry = function ( text, parameters ) { - - parameters = parameters || {}; - - var textShapes = THREE.FontUtils.generateShapes( text, parameters ); - - // translate parameters to ExtrudeGeometry API - - parameters.amount = parameters.height !== undefined ? parameters.height : 50; - - // defaults - - if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; - if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; - if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; - - THREE.ExtrudeGeometry.call( this, textShapes, parameters ); - -}; - -THREE.TextGeometry.prototype = Object.create( THREE.ExtrudeGeometry.prototype ); - -/** - * @author oosmoxiecode - * @author mrdoob / http://mrdoob.com/ - * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888 - */ - -THREE.TorusGeometry = function ( radius, tube, radialSegments, tubularSegments, arc ) { - - THREE.Geometry.call( this ); - - var scope = this; - - this.radius = radius || 100; - this.tube = tube || 40; - this.radialSegments = radialSegments || 8; - this.tubularSegments = tubularSegments || 6; - this.arc = arc || Math.PI * 2; - - var center = new THREE.Vector3(), uvs = [], normals = []; - - for ( var j = 0; j <= this.radialSegments; j ++ ) { - - for ( var i = 0; i <= this.tubularSegments; i ++ ) { - - var u = i / this.tubularSegments * this.arc; - var v = j / this.radialSegments * Math.PI * 2; - - center.x = this.radius * Math.cos( u ); - center.y = this.radius * Math.sin( u ); - - var vertex = new THREE.Vector3(); - vertex.x = ( this.radius + this.tube * Math.cos( v ) ) * Math.cos( u ); - vertex.y = ( this.radius + this.tube * Math.cos( v ) ) * Math.sin( u ); - vertex.z = this.tube * Math.sin( v ); - - this.vertices.push( vertex ); - - uvs.push( new THREE.Vector2( i / this.tubularSegments, j / this.radialSegments ) ); - normals.push( vertex.clone().sub( center ).normalize() ); - - } - - } - - - for ( var j = 1; j <= this.radialSegments; j ++ ) { - - for ( var i = 1; i <= this.tubularSegments; i ++ ) { - - var a = ( this.tubularSegments + 1 ) * j + i - 1; - var b = ( this.tubularSegments + 1 ) * ( j - 1 ) + i - 1; - var c = ( this.tubularSegments + 1 ) * ( j - 1 ) + i; - var d = ( this.tubularSegments + 1 ) * j + i; - - var face = new THREE.Face3( a, b, d, [ normals[ a ].clone(), normals[ b ].clone(), normals[ d ].clone() ] ); - this.faces.push( face ); - this.faceVertexUvs[ 0 ].push( [ uvs[ a ].clone(), uvs[ b ].clone(), uvs[ d ].clone() ] ); - - face = new THREE.Face3( b, c, d, [ normals[ b ].clone(), normals[ c ].clone(), normals[ d ].clone() ] ); - this.faces.push( face ); - this.faceVertexUvs[ 0 ].push( [ uvs[ b ].clone(), uvs[ c ].clone(), uvs[ d ].clone() ] ); - - } - - } - - this.computeCentroids(); - this.computeFaceNormals(); - -}; - -THREE.TorusGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author oosmoxiecode - * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473 - */ - -THREE.TorusKnotGeometry = function ( radius, tube, radialSegments, tubularSegments, p, q, heightScale ) { - - THREE.Geometry.call( this ); - - var scope = this; - - this.radius = radius || 100; - this.tube = tube || 40; - this.radialSegments = radialSegments || 64; - this.tubularSegments = tubularSegments || 8; - this.p = p || 2; - this.q = q || 3; - this.heightScale = heightScale || 1; - this.grid = new Array( this.radialSegments ); - - var tang = new THREE.Vector3(); - var n = new THREE.Vector3(); - var bitan = new THREE.Vector3(); - - for ( var i = 0; i < this.radialSegments; ++ i ) { - - this.grid[ i ] = new Array( this.tubularSegments ); - var u = i / this.radialSegments * 2 * this.p * Math.PI; - var p1 = getPos( u, this.q, this.p, this.radius, this.heightScale ); - var p2 = getPos( u + 0.01, this.q, this.p, this.radius, this.heightScale ); - tang.subVectors( p2, p1 ); - n.addVectors( p2, p1 ); - - bitan.crossVectors( tang, n ); - n.crossVectors( bitan, tang ); - bitan.normalize(); - n.normalize(); - - for ( var j = 0; j < this.tubularSegments; ++ j ) { - - var v = j / this.tubularSegments * 2 * Math.PI; - var cx = - this.tube * Math.cos( v ); // TODO: Hack: Negating it so it faces outside. - var cy = this.tube * Math.sin( v ); - - var pos = new THREE.Vector3(); - pos.x = p1.x + cx * n.x + cy * bitan.x; - pos.y = p1.y + cx * n.y + cy * bitan.y; - pos.z = p1.z + cx * n.z + cy * bitan.z; - - this.grid[ i ][ j ] = scope.vertices.push( pos ) - 1; - - } - - } - - for ( var i = 0; i < this.radialSegments; ++ i ) { - - for ( var j = 0; j < this.tubularSegments; ++ j ) { - - var ip = ( i + 1 ) % this.radialSegments; - var jp = ( j + 1 ) % this.tubularSegments; - - var a = this.grid[ i ][ j ]; - var b = this.grid[ ip ][ j ]; - var c = this.grid[ ip ][ jp ]; - var d = this.grid[ i ][ jp ]; - - var uva = new THREE.Vector2( i / this.radialSegments, j / this.tubularSegments ); - var uvb = new THREE.Vector2( ( i + 1 ) / this.radialSegments, j / this.tubularSegments ); - var uvc = new THREE.Vector2( ( i + 1 ) / this.radialSegments, ( j + 1 ) / this.tubularSegments ); - var uvd = new THREE.Vector2( i / this.radialSegments, ( j + 1 ) / this.tubularSegments ); - - this.faces.push( new THREE.Face3( a, b, d ) ); - this.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); - - this.faces.push( new THREE.Face3( b, c, d ) ); - this.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); - - } - } - - this.computeCentroids(); - this.computeFaceNormals(); - this.computeVertexNormals(); - - function getPos( u, in_q, in_p, radius, heightScale ) { - - var cu = Math.cos( u ); - var su = Math.sin( u ); - var quOverP = in_q / in_p * u; - var cs = Math.cos( quOverP ); - - var tx = radius * ( 2 + cs ) * 0.5 * cu; - var ty = radius * ( 2 + cs ) * su * 0.5; - var tz = heightScale * radius * Math.sin( quOverP ) * 0.5; - - return new THREE.Vector3( tx, ty, tz ); - - } - -}; - -THREE.TorusKnotGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author WestLangley / https://github.com/WestLangley - * @author zz85 / https://github.com/zz85 - * @author miningold / https://github.com/miningold - * - * Modified from the TorusKnotGeometry by @oosmoxiecode - * - * Creates a tube which extrudes along a 3d spline - * - * Uses parallel transport frames as described in - * http://www.cs.indiana.edu/pub/techreports/TR425.pdf - */ - -THREE.TubeGeometry = function( path, segments, radius, radialSegments, closed ) { - - THREE.Geometry.call( this ); - - this.path = path; - this.segments = segments || 64; - this.radius = radius || 1; - this.radialSegments = radialSegments || 8; - this.closed = closed || false; - - this.grid = []; - - var scope = this, - - tangent, - normal, - binormal, - - numpoints = this.segments + 1, - - x, y, z, - tx, ty, tz, - u, v, - - cx, cy, - pos, pos2 = new THREE.Vector3(), - i, j, - ip, jp, - a, b, c, d, - uva, uvb, uvc, uvd; - - var frames = new THREE.TubeGeometry.FrenetFrames( this.path, this.segments, this.closed ), - tangents = frames.tangents, - normals = frames.normals, - binormals = frames.binormals; - - // proxy internals - this.tangents = tangents; - this.normals = normals; - this.binormals = binormals; - - function vert( x, y, z ) { - - return scope.vertices.push( new THREE.Vector3( x, y, z ) ) - 1; - - } - - - // consruct the grid - - for ( i = 0; i < numpoints; i++ ) { - - this.grid[ i ] = []; - - u = i / ( numpoints - 1 ); - - pos = path.getPointAt( u ); - - tangent = tangents[ i ]; - normal = normals[ i ]; - binormal = binormals[ i ]; - - for ( j = 0; j < this.radialSegments; j++ ) { - - v = j / this.radialSegments * 2 * Math.PI; - - cx = -this.radius * Math.cos( v ); // TODO: Hack: Negating it so it faces outside. - cy = this.radius * Math.sin( v ); - - pos2.copy( pos ); - pos2.x += cx * normal.x + cy * binormal.x; - pos2.y += cx * normal.y + cy * binormal.y; - pos2.z += cx * normal.z + cy * binormal.z; - - this.grid[ i ][ j ] = vert( pos2.x, pos2.y, pos2.z ); - - } - } - - - // construct the mesh - - for ( i = 0; i < this.segments; i++ ) { - - for ( j = 0; j < this.radialSegments; j++ ) { - - ip = ( this.closed ) ? (i + 1) % this.segments : i + 1; - jp = (j + 1) % this.radialSegments; - - a = this.grid[ i ][ j ]; // *** NOT NECESSARILY PLANAR ! *** - b = this.grid[ ip ][ j ]; - c = this.grid[ ip ][ jp ]; - d = this.grid[ i ][ jp ]; - - uva = new THREE.Vector2( i / this.segments, j / this.radialSegments ); - uvb = new THREE.Vector2( ( i + 1 ) / this.segments, j / this.radialSegments ); - uvc = new THREE.Vector2( ( i + 1 ) / this.segments, ( j + 1 ) / this.radialSegments ); - uvd = new THREE.Vector2( i / this.segments, ( j + 1 ) / this.radialSegments ); - - this.faces.push( new THREE.Face3( a, b, d ) ); - this.faceVertexUvs[ 0 ].push( [ uva, uvb, uvd ] ); - - this.faces.push( new THREE.Face3( b, c, d ) ); - this.faceVertexUvs[ 0 ].push( [ uvb.clone(), uvc, uvd.clone() ] ); - - } - } - - this.computeCentroids(); - this.computeFaceNormals(); - this.computeVertexNormals(); - -}; - -THREE.TubeGeometry.prototype = Object.create( THREE.Geometry.prototype ); - - -// For computing of Frenet frames, exposing the tangents, normals and binormals the spline -THREE.TubeGeometry.FrenetFrames = function(path, segments, closed) { - - var tangent = new THREE.Vector3(), - normal = new THREE.Vector3(), - binormal = new THREE.Vector3(), - - tangents = [], - normals = [], - binormals = [], - - vec = new THREE.Vector3(), - mat = new THREE.Matrix4(), - - numpoints = segments + 1, - theta, - epsilon = 0.0001, - smallest, - - tx, ty, tz, - i, u, v; - - - // expose internals - this.tangents = tangents; - this.normals = normals; - this.binormals = binormals; - - // compute the tangent vectors for each segment on the path - - for ( i = 0; i < numpoints; i++ ) { - - u = i / ( numpoints - 1 ); - - tangents[ i ] = path.getTangentAt( u ); - tangents[ i ].normalize(); - - } - - initialNormal3(); - - function initialNormal1(lastBinormal) { - // fixed start binormal. Has dangers of 0 vectors - normals[ 0 ] = new THREE.Vector3(); - binormals[ 0 ] = new THREE.Vector3(); - if (lastBinormal===undefined) lastBinormal = new THREE.Vector3( 0, 0, 1 ); - normals[ 0 ].crossVectors( lastBinormal, tangents[ 0 ] ).normalize(); - binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize(); - } - - function initialNormal2() { - - // This uses the Frenet-Serret formula for deriving binormal - var t2 = path.getTangentAt( epsilon ); - - normals[ 0 ] = new THREE.Vector3().subVectors( t2, tangents[ 0 ] ).normalize(); - binormals[ 0 ] = new THREE.Vector3().crossVectors( tangents[ 0 ], normals[ 0 ] ); - - normals[ 0 ].crossVectors( binormals[ 0 ], tangents[ 0 ] ).normalize(); // last binormal x tangent - binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize(); - - } - - function initialNormal3() { - // select an initial normal vector perpenicular to the first tangent vector, - // and in the direction of the smallest tangent xyz component - - normals[ 0 ] = new THREE.Vector3(); - binormals[ 0 ] = new THREE.Vector3(); - smallest = Number.MAX_VALUE; - tx = Math.abs( tangents[ 0 ].x ); - ty = Math.abs( tangents[ 0 ].y ); - tz = Math.abs( tangents[ 0 ].z ); - - if ( tx <= smallest ) { - smallest = tx; - normal.set( 1, 0, 0 ); - } - - if ( ty <= smallest ) { - smallest = ty; - normal.set( 0, 1, 0 ); - } - - if ( tz <= smallest ) { - normal.set( 0, 0, 1 ); - } - - vec.crossVectors( tangents[ 0 ], normal ).normalize(); - - normals[ 0 ].crossVectors( tangents[ 0 ], vec ); - binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); - } - - - // compute the slowly-varying normal and binormal vectors for each segment on the path - - for ( i = 1; i < numpoints; i++ ) { - - normals[ i ] = normals[ i-1 ].clone(); - - binormals[ i ] = binormals[ i-1 ].clone(); - - vec.crossVectors( tangents[ i-1 ], tangents[ i ] ); - - if ( vec.length() > epsilon ) { - - vec.normalize(); - - theta = Math.acos( THREE.Math.clamp( tangents[ i-1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors - - normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); - - } - - binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); - - } - - - // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same - - if ( closed ) { - - theta = Math.acos( THREE.Math.clamp( normals[ 0 ].dot( normals[ numpoints-1 ] ), -1, 1 ) ); - theta /= ( numpoints - 1 ); - - if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ numpoints-1 ] ) ) > 0 ) { - - theta = -theta; - - } - - for ( i = 1; i < numpoints; i++ ) { - - // twist a little... - normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); - binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); - - } - - } -}; - -/** - * @author clockworkgeek / https://github.com/clockworkgeek - * @author timothypratley / https://github.com/timothypratley - * @author WestLangley / http://github.com/WestLangley -*/ - -THREE.PolyhedronGeometry = function ( vertices, faces, radius, detail ) { - - THREE.Geometry.call( this ); - - radius = radius || 1; - detail = detail || 0; - - var that = this; - - for ( var i = 0, l = vertices.length; i < l; i ++ ) { - - prepare( new THREE.Vector3( vertices[ i ][ 0 ], vertices[ i ][ 1 ], vertices[ i ][ 2 ] ) ); - - } - - var midpoints = [], p = this.vertices; - - var f = []; - for ( var i = 0, l = faces.length; i < l; i ++ ) { - - var v1 = p[ faces[ i ][ 0 ] ]; - var v2 = p[ faces[ i ][ 1 ] ]; - var v3 = p[ faces[ i ][ 2 ] ]; - - f[ i ] = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ] ); - - } - - for ( var i = 0, l = f.length; i < l; i ++ ) { - - subdivide(f[ i ], detail); - - } - - - // Handle case when face straddles the seam - - for ( var i = 0, l = this.faceVertexUvs[ 0 ].length; i < l; i ++ ) { - - var uvs = this.faceVertexUvs[ 0 ][ i ]; - - var x0 = uvs[ 0 ].x; - var x1 = uvs[ 1 ].x; - var x2 = uvs[ 2 ].x; - - var max = Math.max( x0, Math.max( x1, x2 ) ); - var min = Math.min( x0, Math.min( x1, x2 ) ); - - if ( max > 0.9 && min < 0.1 ) { // 0.9 is somewhat arbitrary - - if ( x0 < 0.2 ) uvs[ 0 ].x += 1; - if ( x1 < 0.2 ) uvs[ 1 ].x += 1; - if ( x2 < 0.2 ) uvs[ 2 ].x += 1; - - } - - } - - - // Apply radius - - for ( var i = 0, l = this.vertices.length; i < l; i ++ ) { - - this.vertices[ i ].multiplyScalar( radius ); - - } - - - // Merge vertices - - this.mergeVertices(); - - this.computeCentroids(); - - this.computeFaceNormals(); - - this.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius ); - - - // Project vector onto sphere's surface - - function prepare( vector ) { - - var vertex = vector.normalize().clone(); - vertex.index = that.vertices.push( vertex ) - 1; - - // Texture coords are equivalent to map coords, calculate angle and convert to fraction of a circle. - - var u = azimuth( vector ) / 2 / Math.PI + 0.5; - var v = inclination( vector ) / Math.PI + 0.5; - vertex.uv = new THREE.Vector2( u, 1 - v ); - - return vertex; - - } - - - // Approximate a curved face with recursively sub-divided triangles. - - function make( v1, v2, v3 ) { - - var face = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ] ); - face.centroid.add( v1 ).add( v2 ).add( v3 ).divideScalar( 3 ); - that.faces.push( face ); - - var azi = azimuth( face.centroid ); - - that.faceVertexUvs[ 0 ].push( [ - correctUV( v1.uv, v1, azi ), - correctUV( v2.uv, v2, azi ), - correctUV( v3.uv, v3, azi ) - ] ); - - } - - - // Analytically subdivide a face to the required detail level. - - function subdivide(face, detail ) { - - var cols = Math.pow(2, detail); - var cells = Math.pow(4, detail); - var a = prepare( that.vertices[ face.a ] ); - var b = prepare( that.vertices[ face.b ] ); - var c = prepare( that.vertices[ face.c ] ); - var v = []; - - // Construct all of the vertices for this subdivision. - - for ( var i = 0 ; i <= cols; i ++ ) { - - v[ i ] = []; - - var aj = prepare( a.clone().lerp( c, i / cols ) ); - var bj = prepare( b.clone().lerp( c, i / cols ) ); - var rows = cols - i; - - for ( var j = 0; j <= rows; j ++) { - - if ( j == 0 && i == cols ) { - - v[ i ][ j ] = aj; - - } else { - - v[ i ][ j ] = prepare( aj.clone().lerp( bj, j / rows ) ); - - } - - } - - } - - // Construct all of the faces. - - for ( var i = 0; i < cols ; i ++ ) { - - for ( var j = 0; j < 2 * (cols - i) - 1; j ++ ) { - - var k = Math.floor( j / 2 ); - - if ( j % 2 == 0 ) { - - make( - v[ i ][ k + 1], - v[ i + 1 ][ k ], - v[ i ][ k ] - ); - - } else { - - make( - v[ i ][ k + 1 ], - v[ i + 1][ k + 1], - v[ i + 1 ][ k ] - ); - - } - - } - - } - - } - - - // Angle around the Y axis, counter-clockwise when looking from above. - - function azimuth( vector ) { - - return Math.atan2( vector.z, -vector.x ); - - } - - - // Angle above the XZ plane. - - function inclination( vector ) { - - return Math.atan2( -vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); - - } - - - // Texture fixing helper. Spheres have some odd behaviours. - - function correctUV( uv, vector, azimuth ) { - - if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) uv = new THREE.Vector2( uv.x - 1, uv.y ); - if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) uv = new THREE.Vector2( azimuth / 2 / Math.PI + 0.5, uv.y ); - return uv.clone(); - - } - - -}; - -THREE.PolyhedronGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author timothypratley / https://github.com/timothypratley - */ - -THREE.IcosahedronGeometry = function ( radius, detail ) { - - this.radius = radius; - this.detail = detail; - - var t = ( 1 + Math.sqrt( 5 ) ) / 2; - - var vertices = [ - [ -1, t, 0 ], [ 1, t, 0 ], [ -1, -t, 0 ], [ 1, -t, 0 ], - [ 0, -1, t ], [ 0, 1, t ], [ 0, -1, -t ], [ 0, 1, -t ], - [ t, 0, -1 ], [ t, 0, 1 ], [ -t, 0, -1 ], [ -t, 0, 1 ] - ]; - - var faces = [ - [ 0, 11, 5 ], [ 0, 5, 1 ], [ 0, 1, 7 ], [ 0, 7, 10 ], [ 0, 10, 11 ], - [ 1, 5, 9 ], [ 5, 11, 4 ], [ 11, 10, 2 ], [ 10, 7, 6 ], [ 7, 1, 8 ], - [ 3, 9, 4 ], [ 3, 4, 2 ], [ 3, 2, 6 ], [ 3, 6, 8 ], [ 3, 8, 9 ], - [ 4, 9, 5 ], [ 2, 4, 11 ], [ 6, 2, 10 ], [ 8, 6, 7 ], [ 9, 8, 1 ] - ]; - - THREE.PolyhedronGeometry.call( this, vertices, faces, radius, detail ); - -}; - -THREE.IcosahedronGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author timothypratley / https://github.com/timothypratley - */ - -THREE.OctahedronGeometry = function ( radius, detail ) { - - var vertices = [ - [ 1, 0, 0 ], [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, -1, 0 ], [ 0, 0, 1 ], [ 0, 0, -1 ] - ]; - - var faces = [ - [ 0, 2, 4 ], [ 0, 4, 3 ], [ 0, 3, 5 ], [ 0, 5, 2 ], [ 1, 2, 5 ], [ 1, 5, 3 ], [ 1, 3, 4 ], [ 1, 4, 2 ] - ]; - - THREE.PolyhedronGeometry.call( this, vertices, faces, radius, detail ); -}; - -THREE.OctahedronGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author timothypratley / https://github.com/timothypratley - */ - -THREE.TetrahedronGeometry = function ( radius, detail ) { - - var vertices = [ - [ 1, 1, 1 ], [ -1, -1, 1 ], [ -1, 1, -1 ], [ 1, -1, -1 ] - ]; - - var faces = [ - [ 2, 1, 0 ], [ 0, 3, 2 ], [ 1, 3, 0 ], [ 2, 3, 1 ] - ]; - - THREE.PolyhedronGeometry.call( this, vertices, faces, radius, detail ); - -}; - -THREE.TetrahedronGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author zz85 / https://github.com/zz85 - * Parametric Surfaces Geometry - * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 - * - * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements ); - * - */ - -THREE.ParametricGeometry = function ( func, slices, stacks ) { - - THREE.Geometry.call( this ); - - var verts = this.vertices; - var faces = this.faces; - var uvs = this.faceVertexUvs[ 0 ]; - - var i, il, j, p; - var u, v; - - var stackCount = stacks + 1; - var sliceCount = slices + 1; - - for ( i = 0; i <= stacks; i ++ ) { - - v = i / stacks; - - for ( j = 0; j <= slices; j ++ ) { - - u = j / slices; - - p = func( u, v ); - verts.push( p ); - - } - } - - var a, b, c, d; - var uva, uvb, uvc, uvd; - - for ( i = 0; i < stacks; i ++ ) { - - for ( j = 0; j < slices; j ++ ) { - - a = i * sliceCount + j; - b = i * sliceCount + j + 1; - c = (i + 1) * sliceCount + j + 1; - d = (i + 1) * sliceCount + j; - - uva = new THREE.Vector2( j / slices, i / stacks ); - uvb = new THREE.Vector2( ( j + 1 ) / slices, i / stacks ); - uvc = new THREE.Vector2( ( j + 1 ) / slices, ( i + 1 ) / stacks ); - uvd = new THREE.Vector2( j / slices, ( i + 1 ) / stacks ); - - faces.push( new THREE.Face3( a, b, d ) ); - uvs.push( [ uva, uvb, uvd ] ); - - faces.push( new THREE.Face3( b, c, d ) ); - uvs.push( [ uvb.clone(), uvc, uvd.clone() ] ); - - } - - } - - // console.log(this); - - // magic bullet - // var diff = this.mergeVertices(); - // console.log('removed ', diff, ' vertices by merging'); - - this.computeCentroids(); - this.computeFaceNormals(); - this.computeVertexNormals(); - -}; - -THREE.ParametricGeometry.prototype = Object.create( THREE.Geometry.prototype ); - -/** - * @author sroucheray / http://sroucheray.org/ - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.AxisHelper = function ( size ) { - - size = size || 1; - - var geometry = new THREE.Geometry(); - - geometry.vertices.push( - new THREE.Vector3(), new THREE.Vector3( size, 0, 0 ), - new THREE.Vector3(), new THREE.Vector3( 0, size, 0 ), - new THREE.Vector3(), new THREE.Vector3( 0, 0, size ) - ); - - geometry.colors.push( - new THREE.Color( 0xff0000 ), new THREE.Color( 0xffaa00 ), - new THREE.Color( 0x00ff00 ), new THREE.Color( 0xaaff00 ), - new THREE.Color( 0x0000ff ), new THREE.Color( 0x00aaff ) - ); - - var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } ); - - THREE.Line.call( this, geometry, material, THREE.LinePieces ); - -}; - -THREE.AxisHelper.prototype = Object.create( THREE.Line.prototype ); - -/** - * @author WestLangley / http://github.com/WestLangley - * @author zz85 / http://github.com/zz85 - * @author bhouston / http://exocortex.com - * - * Creates an arrow for visualizing directions - * - * Parameters: - * dir - Vector3 - * origin - Vector3 - * length - Number - * hex - color in hex value - * headLength - Number - * headWidth - Number - */ - -THREE.ArrowHelper = function ( dir, origin, length, hex, headLength, headWidth ) { - - // dir is assumed to be normalized - - THREE.Object3D.call( this ); - - if ( hex === undefined ) hex = 0xffff00; - if ( length === undefined ) length = 1; - if ( headLength === undefined ) headLength = 0.2 * length; - if ( headWidth === undefined ) headWidth = 0.2 * headLength; - - this.position = origin; - - var lineGeometry = new THREE.Geometry(); - lineGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ) ); - lineGeometry.vertices.push( new THREE.Vector3( 0, 1, 0 ) ); - - this.line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color: hex } ) ); - this.line.matrixAutoUpdate = false; - this.add( this.line ); - - var coneGeometry = new THREE.CylinderGeometry( 0, 0.5, 1, 5, 1 ); - coneGeometry.applyMatrix( new THREE.Matrix4().makeTranslation( 0, - 0.5, 0 ) ); - - this.cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color: hex } ) ); - this.cone.matrixAutoUpdate = false; - this.add( this.cone ); - - this.setDirection( dir ); - this.setLength( length, headLength, headWidth ); - -}; - -THREE.ArrowHelper.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.ArrowHelper.prototype.setDirection = function () { - - var axis = new THREE.Vector3(); - var radians; - - return function ( dir ) { - - // dir is assumed to be normalized - - if ( dir.y > 0.99999 ) { - - this.quaternion.set( 0, 0, 0, 1 ); - - } else if ( dir.y < - 0.99999 ) { - - this.quaternion.set( 1, 0, 0, 0 ); - - } else { - - axis.set( dir.z, 0, - dir.x ).normalize(); - - radians = Math.acos( dir.y ); - - this.quaternion.setFromAxisAngle( axis, radians ); - - } - - }; - -}(); - -THREE.ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { - - if ( headLength === undefined ) headLength = 0.2 * length; - if ( headWidth === undefined ) headWidth = 0.2 * headLength; - - this.line.scale.set( 1, length, 1 ); - this.line.updateMatrix(); - - this.cone.scale.set( headWidth, headLength, headWidth ); - this.cone.position.y = length; - this.cone.updateMatrix(); - -}; - -THREE.ArrowHelper.prototype.setColor = function ( hex ) { - - this.line.material.color.setHex( hex ); - this.cone.material.color.setHex( hex ); - -}; - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.BoxHelper = function ( object ) { - - // 5____4 - // 1/___0/| - // | 6__|_7 - // 2/___3/ - - var vertices = [ - new THREE.Vector3( 1, 1, 1 ), - new THREE.Vector3( - 1, 1, 1 ), - new THREE.Vector3( - 1, - 1, 1 ), - new THREE.Vector3( 1, - 1, 1 ), - - new THREE.Vector3( 1, 1, - 1 ), - new THREE.Vector3( - 1, 1, - 1 ), - new THREE.Vector3( - 1, - 1, - 1 ), - new THREE.Vector3( 1, - 1, - 1 ) - ]; - - this.vertices = vertices; - - // TODO: Wouldn't be nice if Line had .segments? - - var geometry = new THREE.Geometry(); - geometry.vertices.push( - vertices[ 0 ], vertices[ 1 ], - vertices[ 1 ], vertices[ 2 ], - vertices[ 2 ], vertices[ 3 ], - vertices[ 3 ], vertices[ 0 ], - - vertices[ 4 ], vertices[ 5 ], - vertices[ 5 ], vertices[ 6 ], - vertices[ 6 ], vertices[ 7 ], - vertices[ 7 ], vertices[ 4 ], - - vertices[ 0 ], vertices[ 4 ], - vertices[ 1 ], vertices[ 5 ], - vertices[ 2 ], vertices[ 6 ], - vertices[ 3 ], vertices[ 7 ] - ); - - THREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: 0xffff00 } ), THREE.LinePieces ); - - if ( object !== undefined ) { - - this.update( object ); - - } - -}; - -THREE.BoxHelper.prototype = Object.create( THREE.Line.prototype ); - -THREE.BoxHelper.prototype.update = function ( object ) { - - var geometry = object.geometry; - - if ( geometry.boundingBox === null ) { - - geometry.computeBoundingBox(); - - } - - var min = geometry.boundingBox.min; - var max = geometry.boundingBox.max; - var vertices = this.vertices; - - vertices[ 0 ].set( max.x, max.y, max.z ); - vertices[ 1 ].set( min.x, max.y, max.z ); - vertices[ 2 ].set( min.x, min.y, max.z ); - vertices[ 3 ].set( max.x, min.y, max.z ); - vertices[ 4 ].set( max.x, max.y, min.z ); - vertices[ 5 ].set( min.x, max.y, min.z ); - vertices[ 6 ].set( min.x, min.y, min.z ); - vertices[ 7 ].set( max.x, min.y, min.z ); - - this.geometry.computeBoundingSphere(); - this.geometry.verticesNeedUpdate = true; - - this.matrixAutoUpdate = false; - this.matrixWorld = object.matrixWorld; - -}; - -/** - * @author WestLangley / http://github.com/WestLangley - */ - -// a helper to show the world-axis-aligned bounding box for an object - -THREE.BoundingBoxHelper = function ( object, hex ) { - - var color = ( hex !== undefined ) ? hex : 0x888888; - - this.object = object; - - this.box = new THREE.Box3(); - - THREE.Mesh.call( this, new THREE.BoxGeometry( 1, 1, 1 ), new THREE.MeshBasicMaterial( { color: color, wireframe: true } ) ); - -}; - -THREE.BoundingBoxHelper.prototype = Object.create( THREE.Mesh.prototype ); - -THREE.BoundingBoxHelper.prototype.update = function () { - - this.box.setFromObject( this.object ); - - this.box.size( this.scale ); - - this.box.center( this.position ); - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - * - * - shows frustum, line of sight and up of the camera - * - suitable for fast updates - * - based on frustum visualization in lightgl.js shadowmap example - * http://evanw.github.com/lightgl.js/tests/shadowmap.html - */ - -THREE.CameraHelper = function ( camera ) { - - var geometry = new THREE.Geometry(); - var material = new THREE.LineBasicMaterial( { color: 0xffffff, vertexColors: THREE.FaceColors } ); - - var pointMap = {}; - - // colors - - var hexFrustum = 0xffaa00; - var hexCone = 0xff0000; - var hexUp = 0x00aaff; - var hexTarget = 0xffffff; - var hexCross = 0x333333; - - // near - - addLine( "n1", "n2", hexFrustum ); - addLine( "n2", "n4", hexFrustum ); - addLine( "n4", "n3", hexFrustum ); - addLine( "n3", "n1", hexFrustum ); - - // far - - addLine( "f1", "f2", hexFrustum ); - addLine( "f2", "f4", hexFrustum ); - addLine( "f4", "f3", hexFrustum ); - addLine( "f3", "f1", hexFrustum ); - - // sides - - addLine( "n1", "f1", hexFrustum ); - addLine( "n2", "f2", hexFrustum ); - addLine( "n3", "f3", hexFrustum ); - addLine( "n4", "f4", hexFrustum ); - - // cone - - addLine( "p", "n1", hexCone ); - addLine( "p", "n2", hexCone ); - addLine( "p", "n3", hexCone ); - addLine( "p", "n4", hexCone ); - - // up - - addLine( "u1", "u2", hexUp ); - addLine( "u2", "u3", hexUp ); - addLine( "u3", "u1", hexUp ); - - // target - - addLine( "c", "t", hexTarget ); - addLine( "p", "c", hexCross ); - - // cross - - addLine( "cn1", "cn2", hexCross ); - addLine( "cn3", "cn4", hexCross ); - - addLine( "cf1", "cf2", hexCross ); - addLine( "cf3", "cf4", hexCross ); - - function addLine( a, b, hex ) { - - addPoint( a, hex ); - addPoint( b, hex ); - - } - - function addPoint( id, hex ) { - - geometry.vertices.push( new THREE.Vector3() ); - geometry.colors.push( new THREE.Color( hex ) ); - - if ( pointMap[ id ] === undefined ) { - - pointMap[ id ] = []; - - } - - pointMap[ id ].push( geometry.vertices.length - 1 ); - - } - - THREE.Line.call( this, geometry, material, THREE.LinePieces ); - - this.camera = camera; - this.matrixWorld = camera.matrixWorld; - this.matrixAutoUpdate = false; - - this.pointMap = pointMap; - - this.update(); - -}; - -THREE.CameraHelper.prototype = Object.create( THREE.Line.prototype ); - -THREE.CameraHelper.prototype.update = function () { - - var vector = new THREE.Vector3(); - var camera = new THREE.Camera(); - var projector = new THREE.Projector(); - - return function () { - - var scope = this; - - var w = 1, h = 1; - - // we need just camera projection matrix - // world matrix must be identity - - camera.projectionMatrix.copy( this.camera.projectionMatrix ); - - // center / target - - setPoint( "c", 0, 0, -1 ); - setPoint( "t", 0, 0, 1 ); - - // near - - setPoint( "n1", -w, -h, -1 ); - setPoint( "n2", w, -h, -1 ); - setPoint( "n3", -w, h, -1 ); - setPoint( "n4", w, h, -1 ); - - // far - - setPoint( "f1", -w, -h, 1 ); - setPoint( "f2", w, -h, 1 ); - setPoint( "f3", -w, h, 1 ); - setPoint( "f4", w, h, 1 ); - - // up - - setPoint( "u1", w * 0.7, h * 1.1, -1 ); - setPoint( "u2", -w * 0.7, h * 1.1, -1 ); - setPoint( "u3", 0, h * 2, -1 ); - - // cross - - setPoint( "cf1", -w, 0, 1 ); - setPoint( "cf2", w, 0, 1 ); - setPoint( "cf3", 0, -h, 1 ); - setPoint( "cf4", 0, h, 1 ); - - setPoint( "cn1", -w, 0, -1 ); - setPoint( "cn2", w, 0, -1 ); - setPoint( "cn3", 0, -h, -1 ); - setPoint( "cn4", 0, h, -1 ); - - function setPoint( point, x, y, z ) { - - vector.set( x, y, z ); - projector.unprojectVector( vector, camera ); - - var points = scope.pointMap[ point ]; - - if ( points !== undefined ) { - - for ( var i = 0, il = points.length; i < il; i ++ ) { - - scope.geometry.vertices[ points[ i ] ].copy( vector ); - - } - - } - - } - - this.geometry.verticesNeedUpdate = true; - - }; - -}(); - -/** - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - * @author WestLangley / http://github.com/WestLangley - */ - -THREE.DirectionalLightHelper = function ( light, size ) { - - THREE.Object3D.call( this ); - - this.light = light; - this.light.updateMatrixWorld(); - - this.matrixWorld = light.matrixWorld; - this.matrixAutoUpdate = false; - - size = size || 1; - var geometry = new THREE.PlaneGeometry( size, size ); - var material = new THREE.MeshBasicMaterial( { wireframe: true, fog: false } ); - material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); - - this.lightPlane = new THREE.Mesh( geometry, material ); - this.add( this.lightPlane ); - - geometry = new THREE.Geometry(); - geometry.vertices.push( new THREE.Vector3() ); - geometry.vertices.push( new THREE.Vector3() ); - - material = new THREE.LineBasicMaterial( { fog: false } ); - material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); - - this.targetLine = new THREE.Line( geometry, material ); - this.add( this.targetLine ); - - this.update(); - -}; - -THREE.DirectionalLightHelper.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.DirectionalLightHelper.prototype.dispose = function () { - - this.lightPlane.geometry.dispose(); - this.lightPlane.material.dispose(); - this.targetLine.geometry.dispose(); - this.targetLine.material.dispose(); -}; - -THREE.DirectionalLightHelper.prototype.update = function () { - - var v1 = new THREE.Vector3(); - var v2 = new THREE.Vector3(); - var v3 = new THREE.Vector3(); - - return function () { - - v1.setFromMatrixPosition( this.light.matrixWorld ); - v2.setFromMatrixPosition( this.light.target.matrixWorld ); - v3.subVectors( v2, v1 ); - - this.lightPlane.lookAt( v3 ); - this.lightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); - - this.targetLine.geometry.vertices[ 1 ].copy( v3 ); - this.targetLine.geometry.verticesNeedUpdate = true; - this.targetLine.material.color.copy( this.lightPlane.material.color ); - - } - -}(); - - -/** - * @author WestLangley / http://github.com/WestLangley - */ - -THREE.EdgesHelper = function ( object, hex ) { - - var color = ( hex !== undefined ) ? hex : 0xffffff; - - var edge = [ 0, 0 ], hash = {}; - var sortFunction = function ( a, b ) { return a - b }; - - var keys = [ 'a', 'b', 'c' ]; - var geometry = new THREE.BufferGeometry(); - - var geometry2 = object.geometry.clone(); - - geometry2.mergeVertices(); - geometry2.computeFaceNormals(); - - var vertices = geometry2.vertices; - var faces = geometry2.faces; - var numEdges = 0; - - for ( var i = 0, l = faces.length; i < l; i ++ ) { - - var face = faces[ i ]; - - for ( var j = 0; j < 3; j ++ ) { - - edge[ 0 ] = face[ keys[ j ] ]; - edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; - edge.sort( sortFunction ); - - var key = edge.toString(); - - if ( hash[ key ] === undefined ) { - - hash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined }; - numEdges ++; - - } else { - - hash[ key ].face2 = i; - - } - - } - - } - - geometry.addAttribute( 'position', Float32Array, 2 * numEdges, 3 ); - - var coords = geometry.attributes.position.array; - - var index = 0; - - for ( var key in hash ) { - - var h = hash[ key ]; - - if ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) < 0.9999 ) { // hardwired const OK - - var vertex = vertices[ h.vert1 ]; - coords[ index ++ ] = vertex.x; - coords[ index ++ ] = vertex.y; - coords[ index ++ ] = vertex.z; - - vertex = vertices[ h.vert2 ]; - coords[ index ++ ] = vertex.x; - coords[ index ++ ] = vertex.y; - coords[ index ++ ] = vertex.z; - - } - - } - - THREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: color } ), THREE.LinePieces ); - - this.matrixAutoUpdate = false; - this.matrixWorld = object.matrixWorld; - -}; - -THREE.EdgesHelper.prototype = Object.create( THREE.Line.prototype ); - -/** - * @author mrdoob / http://mrdoob.com/ - * @author WestLangley / http://github.com/WestLangley -*/ - -THREE.FaceNormalsHelper = function ( object, size, hex, linewidth ) { - - this.object = object; - - this.size = ( size !== undefined ) ? size : 1; - - var color = ( hex !== undefined ) ? hex : 0xffff00; - - var width = ( linewidth !== undefined ) ? linewidth : 1; - - var geometry = new THREE.Geometry(); - - var faces = this.object.geometry.faces; - - for ( var i = 0, l = faces.length; i < l; i ++ ) { - - geometry.vertices.push( new THREE.Vector3() ); - geometry.vertices.push( new THREE.Vector3() ); - - } - - THREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ), THREE.LinePieces ); - - this.matrixAutoUpdate = false; - - this.normalMatrix = new THREE.Matrix3(); - - this.update(); - -}; - -THREE.FaceNormalsHelper.prototype = Object.create( THREE.Line.prototype ); - -THREE.FaceNormalsHelper.prototype.update = ( function ( object ) { - - var v1 = new THREE.Vector3(); - - return function ( object ) { - - this.object.updateMatrixWorld( true ); - - this.normalMatrix.getNormalMatrix( this.object.matrixWorld ); - - var vertices = this.geometry.vertices; - - var faces = this.object.geometry.faces; - - var worldMatrix = this.object.matrixWorld; - - for ( var i = 0, l = faces.length; i < l; i ++ ) { - - var face = faces[ i ]; - - v1.copy( face.normal ).applyMatrix3( this.normalMatrix ).normalize().multiplyScalar( this.size ); - - var idx = 2 * i; - - vertices[ idx ].copy( face.centroid ).applyMatrix4( worldMatrix ); - - vertices[ idx + 1 ].addVectors( vertices[ idx ], v1 ); - - } - - this.geometry.verticesNeedUpdate = true; - - return this; - - } - -}()); - - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.GridHelper = function ( size, step ) { - - var geometry = new THREE.Geometry(); - var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } ); - - this.color1 = new THREE.Color( 0x444444 ); - this.color2 = new THREE.Color( 0x888888 ); - - for ( var i = - size; i <= size; i += step ) { - - geometry.vertices.push( - new THREE.Vector3( - size, 0, i ), new THREE.Vector3( size, 0, i ), - new THREE.Vector3( i, 0, - size ), new THREE.Vector3( i, 0, size ) - ); - - var color = i === 0 ? this.color1 : this.color2; - - geometry.colors.push( color, color, color, color ); - - } - - THREE.Line.call( this, geometry, material, THREE.LinePieces ); - -}; - -THREE.GridHelper.prototype = Object.create( THREE.Line.prototype ); - -THREE.GridHelper.prototype.setColors = function( colorCenterLine, colorGrid ) { - - this.color1.set( colorCenterLine ); - this.color2.set( colorGrid ); - - this.geometry.colorsNeedUpdate = true; - -} - -/** - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.HemisphereLightHelper = function ( light, sphereSize, arrowLength, domeSize ) { - - THREE.Object3D.call( this ); - - this.light = light; - this.light.updateMatrixWorld(); - - this.matrixWorld = light.matrixWorld; - this.matrixAutoUpdate = false; - - this.colors = [ new THREE.Color(), new THREE.Color() ]; - - var geometry = new THREE.SphereGeometry( sphereSize, 4, 2 ); - geometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) ); - - for ( var i = 0, il = 8; i < il; i ++ ) { - - geometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ]; - - } - - var material = new THREE.MeshBasicMaterial( { vertexColors: THREE.FaceColors, wireframe: true } ); - - this.lightSphere = new THREE.Mesh( geometry, material ); - this.add( this.lightSphere ); - - this.update(); - -}; - -THREE.HemisphereLightHelper.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.HemisphereLightHelper.prototype.dispose = function () { - this.lightSphere.geometry.dispose(); - this.lightSphere.material.dispose(); -}; - -THREE.HemisphereLightHelper.prototype.update = function () { - - var vector = new THREE.Vector3(); - - return function () { - - this.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity ); - this.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity ); - - this.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); - this.lightSphere.geometry.colorsNeedUpdate = true; - - } - -}(); - - -/** - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.PointLightHelper = function ( light, sphereSize ) { - - this.light = light; - this.light.updateMatrixWorld(); - - var geometry = new THREE.SphereGeometry( sphereSize, 4, 2 ); - var material = new THREE.MeshBasicMaterial( { wireframe: true, fog: false } ); - material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); - - THREE.Mesh.call( this, geometry, material ); - - this.matrixWorld = this.light.matrixWorld; - this.matrixAutoUpdate = false; - - /* - var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); - var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); - - this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); - this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); - - var d = light.distance; - - if ( d === 0.0 ) { - - this.lightDistance.visible = false; - - } else { - - this.lightDistance.scale.set( d, d, d ); - - } - - this.add( this.lightDistance ); - */ - -}; - -THREE.PointLightHelper.prototype = Object.create( THREE.Mesh.prototype ); - -THREE.PointLightHelper.prototype.dispose = function () { - - this.geometry.dispose(); - this.material.dispose(); -}; - -THREE.PointLightHelper.prototype.update = function () { - - this.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); - - /* - var d = this.light.distance; - - if ( d === 0.0 ) { - - this.lightDistance.visible = false; - - } else { - - this.lightDistance.visible = true; - this.lightDistance.scale.set( d, d, d ); - - } - */ - -}; - - -/** - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - * @author WestLangley / http://github.com/WestLangley -*/ - -THREE.SpotLightHelper = function ( light ) { - - THREE.Object3D.call( this ); - - this.light = light; - this.light.updateMatrixWorld(); - - this.matrixWorld = light.matrixWorld; - this.matrixAutoUpdate = false; - - var geometry = new THREE.CylinderGeometry( 0, 1, 1, 8, 1, true ); - - geometry.applyMatrix( new THREE.Matrix4().makeTranslation( 0, -0.5, 0 ) ); - geometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) ); - - var material = new THREE.MeshBasicMaterial( { wireframe: true, fog: false } ); - - this.cone = new THREE.Mesh( geometry, material ); - this.add( this.cone ); - - this.update(); - -}; - -THREE.SpotLightHelper.prototype = Object.create( THREE.Object3D.prototype ); - -THREE.SpotLightHelper.prototype.dispose = function () { - this.cone.geometry.dispose(); - this.cone.material.dispose(); -}; - -THREE.SpotLightHelper.prototype.update = function () { - - var vector = new THREE.Vector3(); - var vector2 = new THREE.Vector3(); - - return function () { - - var coneLength = this.light.distance ? this.light.distance : 10000; - var coneWidth = coneLength * Math.tan( this.light.angle ); - - this.cone.scale.set( coneWidth, coneWidth, coneLength ); - - vector.setFromMatrixPosition( this.light.matrixWorld ); - vector2.setFromMatrixPosition( this.light.target.matrixWorld ); - - this.cone.lookAt( vector2.sub( vector ) ); - - this.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); - - }; - -}(); - -/** - * @author mrdoob / http://mrdoob.com/ - * @author WestLangley / http://github.com/WestLangley -*/ - -THREE.VertexNormalsHelper = function ( object, size, hex, linewidth ) { - - this.object = object; - - this.size = ( size !== undefined ) ? size : 1; - - var color = ( hex !== undefined ) ? hex : 0xff0000; - - var width = ( linewidth !== undefined ) ? linewidth : 1; - - var geometry = new THREE.Geometry(); - - var vertices = object.geometry.vertices; - - var faces = object.geometry.faces; - - for ( var i = 0, l = faces.length; i < l; i ++ ) { - - var face = faces[ i ]; - - for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { - - geometry.vertices.push( new THREE.Vector3() ); - geometry.vertices.push( new THREE.Vector3() ); - - } - - } - - THREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ), THREE.LinePieces ); - - this.matrixAutoUpdate = false; - - this.normalMatrix = new THREE.Matrix3(); - - this.update(); - -}; - -THREE.VertexNormalsHelper.prototype = Object.create( THREE.Line.prototype ); - -THREE.VertexNormalsHelper.prototype.update = ( function ( object ) { - - var v1 = new THREE.Vector3(); - - return function( object ) { - - var keys = [ 'a', 'b', 'c', 'd' ]; - - this.object.updateMatrixWorld( true ); - - this.normalMatrix.getNormalMatrix( this.object.matrixWorld ); - - var vertices = this.geometry.vertices; - - var verts = this.object.geometry.vertices; - - var faces = this.object.geometry.faces; - - var worldMatrix = this.object.matrixWorld; - - var idx = 0; - - for ( var i = 0, l = faces.length; i < l; i ++ ) { - - var face = faces[ i ]; - - for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { - - var vertexId = face[ keys[ j ] ]; - var vertex = verts[ vertexId ]; - - var normal = face.vertexNormals[ j ]; - - vertices[ idx ].copy( vertex ).applyMatrix4( worldMatrix ); - - v1.copy( normal ).applyMatrix3( this.normalMatrix ).normalize().multiplyScalar( this.size ); - - v1.add( vertices[ idx ] ); - idx = idx + 1; - - vertices[ idx ].copy( v1 ); - idx = idx + 1; - - } - - } - - this.geometry.verticesNeedUpdate = true; - - return this; - - } - -}()); - -/** - * @author mrdoob / http://mrdoob.com/ - * @author WestLangley / http://github.com/WestLangley -*/ - -THREE.VertexTangentsHelper = function ( object, size, hex, linewidth ) { - - this.object = object; - - this.size = ( size !== undefined ) ? size : 1; - - var color = ( hex !== undefined ) ? hex : 0x0000ff; - - var width = ( linewidth !== undefined ) ? linewidth : 1; - - var geometry = new THREE.Geometry(); - - var vertices = object.geometry.vertices; - - var faces = object.geometry.faces; - - for ( var i = 0, l = faces.length; i < l; i ++ ) { - - var face = faces[ i ]; - - for ( var j = 0, jl = face.vertexTangents.length; j < jl; j ++ ) { - - geometry.vertices.push( new THREE.Vector3() ); - geometry.vertices.push( new THREE.Vector3() ); - - } - - } - - THREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: color, linewidth: width } ), THREE.LinePieces ); - - this.matrixAutoUpdate = false; - - this.update(); - -}; - -THREE.VertexTangentsHelper.prototype = Object.create( THREE.Line.prototype ); - -THREE.VertexTangentsHelper.prototype.update = ( function ( object ) { - - var v1 = new THREE.Vector3(); - - return function( object ) { - - var keys = [ 'a', 'b', 'c', 'd' ]; - - this.object.updateMatrixWorld( true ); - - var vertices = this.geometry.vertices; - - var verts = this.object.geometry.vertices; - - var faces = this.object.geometry.faces; - - var worldMatrix = this.object.matrixWorld; - - var idx = 0; - - for ( var i = 0, l = faces.length; i < l; i ++ ) { - - var face = faces[ i ]; - - for ( var j = 0, jl = face.vertexTangents.length; j < jl; j ++ ) { - - var vertexId = face[ keys[ j ] ]; - var vertex = verts[ vertexId ]; - - var tangent = face.vertexTangents[ j ]; - - vertices[ idx ].copy( vertex ).applyMatrix4( worldMatrix ); - - v1.copy( tangent ).transformDirection( worldMatrix ).multiplyScalar( this.size ); - - v1.add( vertices[ idx ] ); - idx = idx + 1; - - vertices[ idx ].copy( v1 ); - idx = idx + 1; - - } - - } - - this.geometry.verticesNeedUpdate = true; - - return this; - - } - -}()); - -/** - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.WireframeHelper = function ( object, hex ) { - - var color = ( hex !== undefined ) ? hex : 0xffffff; - - var edge = [ 0, 0 ], hash = {}; - var sortFunction = function ( a, b ) { return a - b }; - - var keys = [ 'a', 'b', 'c' ]; - var geometry = new THREE.BufferGeometry(); - - if ( object.geometry instanceof THREE.Geometry ) { - - var vertices = object.geometry.vertices; - var faces = object.geometry.faces; - var numEdges = 0; - - // allocate maximal size - var edges = new Uint32Array( 6 * faces.length ); - - for ( var i = 0, l = faces.length; i < l; i ++ ) { - - var face = faces[ i ]; - - for ( var j = 0; j < 3; j ++ ) { - - edge[ 0 ] = face[ keys[ j ] ]; - edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; - edge.sort( sortFunction ); - - var key = edge.toString(); - - if ( hash[ key ] === undefined ) { - - edges[ 2 * numEdges ] = edge[ 0 ]; - edges[ 2 * numEdges + 1 ] = edge[ 1 ]; - hash[ key ] = true; - numEdges ++; - - } - - } - - } - - geometry.addAttribute( 'position', Float32Array, 2 * numEdges, 3 ); - - var coords = geometry.attributes.position.array; - - for ( var i = 0, l = numEdges; i < l; i ++ ) { - - for ( var j = 0; j < 2; j ++ ) { - - var vertex = vertices[ edges [ 2 * i + j] ]; - - var index = 6 * i + 3 * j; - coords[ index + 0 ] = vertex.x; - coords[ index + 1 ] = vertex.y; - coords[ index + 2 ] = vertex.z; - - } - - } - - } else if ( object.geometry instanceof THREE.BufferGeometry && object.geometry.attributes.index !== undefined ) { // indexed BufferGeometry - - var vertices = object.geometry.attributes.position.array; - var indices = object.geometry.attributes.index.array; - var offsets = object.geometry.offsets; - var numEdges = 0; - - // allocate maximal size - var edges = new Uint32Array( 2 * indices.length ); - - for ( var o = 0, ol = offsets.length; o < ol; ++ o ) { - - var start = offsets[ o ].start; - var count = offsets[ o ].count; - var index = offsets[ o ].index; - - for ( var i = start, il = start + count; i < il; i += 3 ) { - - for ( var j = 0; j < 3; j ++ ) { - - edge[ 0 ] = index + indices[ i + j ]; - edge[ 1 ] = index + indices[ i + ( j + 1 ) % 3 ]; - edge.sort( sortFunction ); - - var key = edge.toString(); - - if ( hash[ key ] === undefined ) { - - edges[ 2 * numEdges ] = edge[ 0 ]; - edges[ 2 * numEdges + 1 ] = edge[ 1 ]; - hash[ key ] = true; - numEdges ++; - - } - - } - - } - - } - - geometry.addAttribute( 'position', Float32Array, 2 * numEdges, 3 ); - - var coords = geometry.attributes.position.array; - - for ( var i = 0, l = numEdges; i < l; i ++ ) { - - for ( var j = 0; j < 2; j ++ ) { - - var index = 6 * i + 3 * j; - var index2 = 3 * edges[ 2 * i + j]; - coords[ index + 0 ] = vertices[ index2 ]; - coords[ index + 1 ] = vertices[ index2 + 1 ]; - coords[ index + 2 ] = vertices[ index2 + 2 ]; - - } - - } - - } else if ( object.geometry instanceof THREE.BufferGeometry ) { // non-indexed BufferGeometry - - var vertices = object.geometry.attributes.position.array; - var numEdges = vertices.length / 3; - var numTris = numEdges / 3; - - geometry.addAttribute( 'position', Float32Array, 2 * numEdges, 3 ); - - var coords = geometry.attributes.position.array; - - for ( var i = 0, l = numTris; i < l; i ++ ) { - - for ( var j = 0; j < 3; j ++ ) { - - var index = 18 * i + 6 * j; - - var index1 = 9 * i + 3 * j; - coords[ index + 0 ] = vertices[ index1 ]; - coords[ index + 1 ] = vertices[ index1 + 1 ]; - coords[ index + 2 ] = vertices[ index1 + 2 ]; - - var index2 = 9 * i + 3 * ( ( j + 1 ) % 3 ); - coords[ index + 3 ] = vertices[ index2 ]; - coords[ index + 4 ] = vertices[ index2 + 1 ]; - coords[ index + 5 ] = vertices[ index2 + 2 ]; - - } - - } - - } - - THREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: color } ), THREE.LinePieces ); - - this.matrixAutoUpdate = false; - this.matrixWorld = object.matrixWorld; - -}; - -THREE.WireframeHelper.prototype = Object.create( THREE.Line.prototype ); - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.ImmediateRenderObject = function () { - - THREE.Object3D.call( this ); - - this.render = function ( renderCallback ) { }; - -}; - -THREE.ImmediateRenderObject.prototype = Object.create( THREE.Object3D.prototype ); - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.LensFlare = function ( texture, size, distance, blending, color ) { - - THREE.Object3D.call( this ); - - this.lensFlares = []; - - this.positionScreen = new THREE.Vector3(); - this.customUpdateCallback = undefined; - - if( texture !== undefined ) { - - this.add( texture, size, distance, blending, color ); - - } - -}; - -THREE.LensFlare.prototype = Object.create( THREE.Object3D.prototype ); - - -/* - * Add: adds another flare - */ - -THREE.LensFlare.prototype.add = function ( texture, size, distance, blending, color, opacity ) { - - if( size === undefined ) size = -1; - if( distance === undefined ) distance = 0; - if( opacity === undefined ) opacity = 1; - if( color === undefined ) color = new THREE.Color( 0xffffff ); - if( blending === undefined ) blending = THREE.NormalBlending; - - distance = Math.min( distance, Math.max( 0, distance ) ); - - this.lensFlares.push( { texture: texture, // THREE.Texture - size: size, // size in pixels (-1 = use texture.width) - distance: distance, // distance (0-1) from light source (0=at light source) - x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is ontop z = 1 is back - scale: 1, // scale - rotation: 1, // rotation - opacity: opacity, // opacity - color: color, // color - blending: blending } ); // blending - -}; - - -/* - * Update lens flares update positions on all flares based on the screen position - * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. - */ - -THREE.LensFlare.prototype.updateLensFlares = function () { - - var f, fl = this.lensFlares.length; - var flare; - var vecX = -this.positionScreen.x * 2; - var vecY = -this.positionScreen.y * 2; - - for( f = 0; f < fl; f ++ ) { - - flare = this.lensFlares[ f ]; - - flare.x = this.positionScreen.x + vecX * flare.distance; - flare.y = this.positionScreen.y + vecY * flare.distance; - - flare.wantedRotation = flare.x * Math.PI * 0.25; - flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; - - } - -}; - - - - - - - - - - - - - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.MorphBlendMesh = function( geometry, material ) { - - THREE.Mesh.call( this, geometry, material ); - - this.animationsMap = {}; - this.animationsList = []; - - // prepare default animation - // (all frames played together in 1 second) - - var numFrames = this.geometry.morphTargets.length; - - var name = "__default"; - - var startFrame = 0; - var endFrame = numFrames - 1; - - var fps = numFrames / 1; - - this.createAnimation( name, startFrame, endFrame, fps ); - this.setAnimationWeight( name, 1 ); - -}; - -THREE.MorphBlendMesh.prototype = Object.create( THREE.Mesh.prototype ); - -THREE.MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { - - var animation = { - - startFrame: start, - endFrame: end, - - length: end - start + 1, - - fps: fps, - duration: ( end - start ) / fps, - - lastFrame: 0, - currentFrame: 0, - - active: false, - - time: 0, - direction: 1, - weight: 1, - - directionBackwards: false, - mirroredLoop: false - - }; - - this.animationsMap[ name ] = animation; - this.animationsList.push( animation ); - -}; - -THREE.MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { - - var pattern = /([a-z]+)(\d+)/; - - var firstAnimation, frameRanges = {}; - - var geometry = this.geometry; - - for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { - - var morph = geometry.morphTargets[ i ]; - var chunks = morph.name.match( pattern ); - - if ( chunks && chunks.length > 1 ) { - - var name = chunks[ 1 ]; - var num = chunks[ 2 ]; - - if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: -Infinity }; - - var range = frameRanges[ name ]; - - if ( i < range.start ) range.start = i; - if ( i > range.end ) range.end = i; - - if ( ! firstAnimation ) firstAnimation = name; - - } - - } - - for ( var name in frameRanges ) { - - var range = frameRanges[ name ]; - this.createAnimation( name, range.start, range.end, fps ); - - } - - this.firstAnimation = firstAnimation; - -}; - -THREE.MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - animation.direction = 1; - animation.directionBackwards = false; - - } - -}; - -THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - animation.direction = -1; - animation.directionBackwards = true; - - } - -}; - -THREE.MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - animation.fps = fps; - animation.duration = ( animation.end - animation.start ) / animation.fps; - - } - -}; - -THREE.MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - animation.duration = duration; - animation.fps = ( animation.end - animation.start ) / animation.duration; - - } - -}; - -THREE.MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - animation.weight = weight; - - } - -}; - -THREE.MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - animation.time = time; - - } - -}; - -THREE.MorphBlendMesh.prototype.getAnimationTime = function ( name ) { - - var time = 0; - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - time = animation.time; - - } - - return time; - -}; - -THREE.MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { - - var duration = -1; - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - duration = animation.duration; - - } - - return duration; - -}; - -THREE.MorphBlendMesh.prototype.playAnimation = function ( name ) { - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - animation.time = 0; - animation.active = true; - - } else { - - console.warn( "animation[" + name + "] undefined" ); - - } - -}; - -THREE.MorphBlendMesh.prototype.stopAnimation = function ( name ) { - - var animation = this.animationsMap[ name ]; - - if ( animation ) { - - animation.active = false; - - } - -}; - -THREE.MorphBlendMesh.prototype.update = function ( delta ) { - - for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { - - var animation = this.animationsList[ i ]; - - if ( ! animation.active ) continue; - - var frameTime = animation.duration / animation.length; - - animation.time += animation.direction * delta; - - if ( animation.mirroredLoop ) { - - if ( animation.time > animation.duration || animation.time < 0 ) { - - animation.direction *= -1; - - if ( animation.time > animation.duration ) { - - animation.time = animation.duration; - animation.directionBackwards = true; - - } - - if ( animation.time < 0 ) { - - animation.time = 0; - animation.directionBackwards = false; - - } - - } - - } else { - - animation.time = animation.time % animation.duration; - - if ( animation.time < 0 ) animation.time += animation.duration; - - } - - var keyframe = animation.startFrame + THREE.Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); - var weight = animation.weight; - - if ( keyframe !== animation.currentFrame ) { - - this.morphTargetInfluences[ animation.lastFrame ] = 0; - this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; - - this.morphTargetInfluences[ keyframe ] = 0; - - animation.lastFrame = animation.currentFrame; - animation.currentFrame = keyframe; - - } - - var mix = ( animation.time % frameTime ) / frameTime; - - if ( animation.directionBackwards ) mix = 1 - mix; - - this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; - this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; - - } - -}; - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.LensFlarePlugin = function () { - - var _gl, _renderer, _precision, _lensFlare = {}; - - this.init = function ( renderer ) { - - _gl = renderer.context; - _renderer = renderer; - - _precision = renderer.getPrecision(); - - _lensFlare.vertices = new Float32Array( 8 + 8 ); - _lensFlare.faces = new Uint16Array( 6 ); - - var i = 0; - _lensFlare.vertices[ i++ ] = -1; _lensFlare.vertices[ i++ ] = -1; // vertex - _lensFlare.vertices[ i++ ] = 0; _lensFlare.vertices[ i++ ] = 0; // uv... etc. - - _lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = -1; - _lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = 0; - - _lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = 1; - _lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = 1; - - _lensFlare.vertices[ i++ ] = -1; _lensFlare.vertices[ i++ ] = 1; - _lensFlare.vertices[ i++ ] = 0; _lensFlare.vertices[ i++ ] = 1; - - i = 0; - _lensFlare.faces[ i++ ] = 0; _lensFlare.faces[ i++ ] = 1; _lensFlare.faces[ i++ ] = 2; - _lensFlare.faces[ i++ ] = 0; _lensFlare.faces[ i++ ] = 2; _lensFlare.faces[ i++ ] = 3; - - // buffers - - _lensFlare.vertexBuffer = _gl.createBuffer(); - _lensFlare.elementBuffer = _gl.createBuffer(); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, _lensFlare.vertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, _lensFlare.vertices, _gl.STATIC_DRAW ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.elementBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.faces, _gl.STATIC_DRAW ); - - // textures - - _lensFlare.tempTexture = _gl.createTexture(); - _lensFlare.occlusionTexture = _gl.createTexture(); - - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); - _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, 16, 16, 0, _gl.RGB, _gl.UNSIGNED_BYTE, null ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST ); - - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture ); - _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, 16, 16, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, null ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST ); - - if ( _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ) <= 0 ) { - - _lensFlare.hasVertexTexture = false; - _lensFlare.program = createProgram( THREE.ShaderFlares[ "lensFlare" ], _precision ); - - } else { - - _lensFlare.hasVertexTexture = true; - _lensFlare.program = createProgram( THREE.ShaderFlares[ "lensFlareVertexTexture" ], _precision ); - - } - - _lensFlare.attributes = {}; - _lensFlare.uniforms = {}; - - _lensFlare.attributes.vertex = _gl.getAttribLocation ( _lensFlare.program, "position" ); - _lensFlare.attributes.uv = _gl.getAttribLocation ( _lensFlare.program, "uv" ); - - _lensFlare.uniforms.renderType = _gl.getUniformLocation( _lensFlare.program, "renderType" ); - _lensFlare.uniforms.map = _gl.getUniformLocation( _lensFlare.program, "map" ); - _lensFlare.uniforms.occlusionMap = _gl.getUniformLocation( _lensFlare.program, "occlusionMap" ); - _lensFlare.uniforms.opacity = _gl.getUniformLocation( _lensFlare.program, "opacity" ); - _lensFlare.uniforms.color = _gl.getUniformLocation( _lensFlare.program, "color" ); - _lensFlare.uniforms.scale = _gl.getUniformLocation( _lensFlare.program, "scale" ); - _lensFlare.uniforms.rotation = _gl.getUniformLocation( _lensFlare.program, "rotation" ); - _lensFlare.uniforms.screenPosition = _gl.getUniformLocation( _lensFlare.program, "screenPosition" ); - - }; - - - /* - * Render lens flares - * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, - * reads these back and calculates occlusion. - * Then _lensFlare.update_lensFlares() is called to re-position and - * update transparency of flares. Then they are rendered. - * - */ - - this.render = function ( scene, camera, viewportWidth, viewportHeight ) { - - var flares = scene.__webglFlares, - nFlares = flares.length; - - if ( ! nFlares ) return; - - var tempPosition = new THREE.Vector3(); - - var invAspect = viewportHeight / viewportWidth, - halfViewportWidth = viewportWidth * 0.5, - halfViewportHeight = viewportHeight * 0.5; - - var size = 16 / viewportHeight, - scale = new THREE.Vector2( size * invAspect, size ); - - var screenPosition = new THREE.Vector3( 1, 1, 0 ), - screenPositionPixels = new THREE.Vector2( 1, 1 ); - - var uniforms = _lensFlare.uniforms, - attributes = _lensFlare.attributes; - - // set _lensFlare program and reset blending - - _gl.useProgram( _lensFlare.program ); - - _gl.enableVertexAttribArray( _lensFlare.attributes.vertex ); - _gl.enableVertexAttribArray( _lensFlare.attributes.uv ); - - // loop through all lens flares to update their occlusion and positions - // setup gl and common used attribs/unforms - - _gl.uniform1i( uniforms.occlusionMap, 0 ); - _gl.uniform1i( uniforms.map, 1 ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, _lensFlare.vertexBuffer ); - _gl.vertexAttribPointer( attributes.vertex, 2, _gl.FLOAT, false, 2 * 8, 0 ); - _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.elementBuffer ); - - _gl.disable( _gl.CULL_FACE ); - _gl.depthMask( false ); - - var i, j, jl, flare, sprite; - - for ( i = 0; i < nFlares; i ++ ) { - - size = 16 / viewportHeight; - scale.set( size * invAspect, size ); - - // calc object screen position - - flare = flares[ i ]; - - tempPosition.set( flare.matrixWorld.elements[12], flare.matrixWorld.elements[13], flare.matrixWorld.elements[14] ); - - tempPosition.applyMatrix4( camera.matrixWorldInverse ); - tempPosition.applyProjection( camera.projectionMatrix ); - - // setup arrays for gl programs - - screenPosition.copy( tempPosition ) - - screenPositionPixels.x = screenPosition.x * halfViewportWidth + halfViewportWidth; - screenPositionPixels.y = screenPosition.y * halfViewportHeight + halfViewportHeight; - - // screen cull - - if ( _lensFlare.hasVertexTexture || ( - screenPositionPixels.x > 0 && - screenPositionPixels.x < viewportWidth && - screenPositionPixels.y > 0 && - screenPositionPixels.y < viewportHeight ) ) { - - // save current RGB to temp texture - - _gl.activeTexture( _gl.TEXTURE1 ); - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); - _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 ); - - - // render pink quad - - _gl.uniform1i( uniforms.renderType, 0 ); - _gl.uniform2f( uniforms.scale, scale.x, scale.y ); - _gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); - - _gl.disable( _gl.BLEND ); - _gl.enable( _gl.DEPTH_TEST ); - - _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 ); - - - // copy result to occlusionMap - - _gl.activeTexture( _gl.TEXTURE0 ); - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture ); - _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 ); - - - // restore graphics - - _gl.uniform1i( uniforms.renderType, 1 ); - _gl.disable( _gl.DEPTH_TEST ); - - _gl.activeTexture( _gl.TEXTURE1 ); - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); - _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 ); - - - // update object positions - - flare.positionScreen.copy( screenPosition ) - - if ( flare.customUpdateCallback ) { - - flare.customUpdateCallback( flare ); - - } else { - - flare.updateLensFlares(); - - } - - // render flares - - _gl.uniform1i( uniforms.renderType, 2 ); - _gl.enable( _gl.BLEND ); - - for ( j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { - - sprite = flare.lensFlares[ j ]; - - if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { - - screenPosition.x = sprite.x; - screenPosition.y = sprite.y; - screenPosition.z = sprite.z; - - size = sprite.size * sprite.scale / viewportHeight; - - scale.x = size * invAspect; - scale.y = size; - - _gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); - _gl.uniform2f( uniforms.scale, scale.x, scale.y ); - _gl.uniform1f( uniforms.rotation, sprite.rotation ); - - _gl.uniform1f( uniforms.opacity, sprite.opacity ); - _gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); - - _renderer.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); - _renderer.setTexture( sprite.texture, 1 ); - - _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 ); - - } - - } - - } - - } - - // restore gl - - _gl.enable( _gl.CULL_FACE ); - _gl.enable( _gl.DEPTH_TEST ); - _gl.depthMask( true ); - - }; - - function createProgram ( shader, precision ) { - - var program = _gl.createProgram(); - - var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER ); - var vertexShader = _gl.createShader( _gl.VERTEX_SHADER ); - - var prefix = "precision " + precision + " float;\n"; - - _gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); - _gl.shaderSource( vertexShader, prefix + shader.vertexShader ); - - _gl.compileShader( fragmentShader ); - _gl.compileShader( vertexShader ); - - _gl.attachShader( program, fragmentShader ); - _gl.attachShader( program, vertexShader ); - - _gl.linkProgram( program ); - - return program; - - }; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.ShadowMapPlugin = function () { - - var _gl, - _renderer, - _depthMaterial, _depthMaterialMorph, _depthMaterialSkin, _depthMaterialMorphSkin, - - _frustum = new THREE.Frustum(), - _projScreenMatrix = new THREE.Matrix4(), - - _min = new THREE.Vector3(), - _max = new THREE.Vector3(), - - _matrixPosition = new THREE.Vector3(); - - this.init = function ( renderer ) { - - _gl = renderer.context; - _renderer = renderer; - - var depthShader = THREE.ShaderLib[ "depthRGBA" ]; - var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms ); - - _depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } ); - _depthMaterialMorph = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true } ); - _depthMaterialSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, skinning: true } ); - _depthMaterialMorphSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true, skinning: true } ); - - _depthMaterial._shadowPass = true; - _depthMaterialMorph._shadowPass = true; - _depthMaterialSkin._shadowPass = true; - _depthMaterialMorphSkin._shadowPass = true; - - }; - - this.render = function ( scene, camera ) { - - if ( ! ( _renderer.shadowMapEnabled && _renderer.shadowMapAutoUpdate ) ) return; - - this.update( scene, camera ); - - }; - - this.update = function ( scene, camera ) { - - var i, il, j, jl, n, - - shadowMap, shadowMatrix, shadowCamera, - program, buffer, material, - webglObject, object, light, - renderList, - - lights = [], - k = 0, - - fog = null; - - // set GL state for depth map - - _gl.clearColor( 1, 1, 1, 1 ); - _gl.disable( _gl.BLEND ); - - _gl.enable( _gl.CULL_FACE ); - _gl.frontFace( _gl.CCW ); - - if ( _renderer.shadowMapCullFace === THREE.CullFaceFront ) { - - _gl.cullFace( _gl.FRONT ); - - } else { - - _gl.cullFace( _gl.BACK ); - - } - - _renderer.setDepthTest( true ); - - // preprocess lights - // - skip lights that are not casting shadows - // - create virtual lights for cascaded shadow maps - - for ( i = 0, il = scene.__lights.length; i < il; i ++ ) { - - light = scene.__lights[ i ]; - - if ( ! light.castShadow ) continue; - - if ( ( light instanceof THREE.DirectionalLight ) && light.shadowCascade ) { - - for ( n = 0; n < light.shadowCascadeCount; n ++ ) { - - var virtualLight; - - if ( ! light.shadowCascadeArray[ n ] ) { - - virtualLight = createVirtualLight( light, n ); - virtualLight.originalCamera = camera; - - var gyro = new THREE.Gyroscope(); - gyro.position = light.shadowCascadeOffset; - - gyro.add( virtualLight ); - gyro.add( virtualLight.target ); - - camera.add( gyro ); - - light.shadowCascadeArray[ n ] = virtualLight; - - console.log( "Created virtualLight", virtualLight ); - - } else { - - virtualLight = light.shadowCascadeArray[ n ]; - - } - - updateVirtualLight( light, n ); - - lights[ k ] = virtualLight; - k ++; - - } - - } else { - - lights[ k ] = light; - k ++; - - } - - } - - // render depth map - - for ( i = 0, il = lights.length; i < il; i ++ ) { - - light = lights[ i ]; - - if ( ! light.shadowMap ) { - - var shadowFilter = THREE.LinearFilter; - - if ( _renderer.shadowMapType === THREE.PCFSoftShadowMap ) { - - shadowFilter = THREE.NearestFilter; - - } - - var pars = { minFilter: shadowFilter, magFilter: shadowFilter, format: THREE.RGBAFormat }; - - light.shadowMap = new THREE.WebGLRenderTarget( light.shadowMapWidth, light.shadowMapHeight, pars ); - light.shadowMapSize = new THREE.Vector2( light.shadowMapWidth, light.shadowMapHeight ); - - light.shadowMatrix = new THREE.Matrix4(); - - } - - if ( ! light.shadowCamera ) { - - if ( light instanceof THREE.SpotLight ) { - - light.shadowCamera = new THREE.PerspectiveCamera( light.shadowCameraFov, light.shadowMapWidth / light.shadowMapHeight, light.shadowCameraNear, light.shadowCameraFar ); - - } else if ( light instanceof THREE.DirectionalLight ) { - - light.shadowCamera = new THREE.OrthographicCamera( light.shadowCameraLeft, light.shadowCameraRight, light.shadowCameraTop, light.shadowCameraBottom, light.shadowCameraNear, light.shadowCameraFar ); - - } else { - - console.error( "Unsupported light type for shadow" ); - continue; - - } - - scene.add( light.shadowCamera ); - - if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); - - } - - if ( light.shadowCameraVisible && ! light.cameraHelper ) { - - light.cameraHelper = new THREE.CameraHelper( light.shadowCamera ); - light.shadowCamera.add( light.cameraHelper ); - - } - - if ( light.isVirtual && virtualLight.originalCamera == camera ) { - - updateShadowCamera( camera, light ); - - } - - shadowMap = light.shadowMap; - shadowMatrix = light.shadowMatrix; - shadowCamera = light.shadowCamera; - - shadowCamera.position.setFromMatrixPosition( light.matrixWorld ); - _matrixPosition.setFromMatrixPosition( light.target.matrixWorld ); - shadowCamera.lookAt( _matrixPosition ); - shadowCamera.updateMatrixWorld(); - - shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); - - if ( light.cameraHelper ) light.cameraHelper.visible = light.shadowCameraVisible; - if ( light.shadowCameraVisible ) light.cameraHelper.update(); - - // compute shadow matrix - - shadowMatrix.set( 0.5, 0.0, 0.0, 0.5, - 0.0, 0.5, 0.0, 0.5, - 0.0, 0.0, 0.5, 0.5, - 0.0, 0.0, 0.0, 1.0 ); - - shadowMatrix.multiply( shadowCamera.projectionMatrix ); - shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); - - // update camera matrices and frustum - - _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); - _frustum.setFromMatrix( _projScreenMatrix ); - - // render shadow map - - _renderer.setRenderTarget( shadowMap ); - _renderer.clear(); - - // set object matrices & frustum culling - - renderList = scene.__webglObjects; - - for ( j = 0, jl = renderList.length; j < jl; j ++ ) { - - webglObject = renderList[ j ]; - object = webglObject.object; - - webglObject.render = false; - - if ( object.visible && object.castShadow ) { - - if ( ! ( object instanceof THREE.Mesh || object instanceof THREE.ParticleSystem ) || ! ( object.frustumCulled ) || _frustum.intersectsObject( object ) ) { - - object._modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); - - webglObject.render = true; - - } - - } - - } - - // render regular objects - - var objectMaterial, useMorphing, useSkinning; - - for ( j = 0, jl = renderList.length; j < jl; j ++ ) { - - webglObject = renderList[ j ]; - - if ( webglObject.render ) { - - object = webglObject.object; - buffer = webglObject.buffer; - - // culling is overriden globally for all objects - // while rendering depth map - - // need to deal with MeshFaceMaterial somehow - // in that case just use the first of material.materials for now - // (proper solution would require to break objects by materials - // similarly to regular rendering and then set corresponding - // depth materials per each chunk instead of just once per object) - - objectMaterial = getObjectMaterial( object ); - - useMorphing = object.geometry.morphTargets !== undefined && object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets; - useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning; - - if ( object.customDepthMaterial ) { - - material = object.customDepthMaterial; - - } else if ( useSkinning ) { - - material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin; - - } else if ( useMorphing ) { - - material = _depthMaterialMorph; - - } else { - - material = _depthMaterial; - - } - - if ( buffer instanceof THREE.BufferGeometry ) { - - _renderer.renderBufferDirect( shadowCamera, scene.__lights, fog, material, buffer, object ); - - } else { - - _renderer.renderBuffer( shadowCamera, scene.__lights, fog, material, buffer, object ); - - } - - } - - } - - // set matrices and render immediate objects - - renderList = scene.__webglObjectsImmediate; - - for ( j = 0, jl = renderList.length; j < jl; j ++ ) { - - webglObject = renderList[ j ]; - object = webglObject.object; - - if ( object.visible && object.castShadow ) { - - object._modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); - - _renderer.renderImmediateObject( shadowCamera, scene.__lights, fog, _depthMaterial, object ); - - } - - } - - } - - // restore GL state - - var clearColor = _renderer.getClearColor(), - clearAlpha = _renderer.getClearAlpha(); - - _gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha ); - _gl.enable( _gl.BLEND ); - - if ( _renderer.shadowMapCullFace === THREE.CullFaceFront ) { - - _gl.cullFace( _gl.BACK ); - - } - - }; - - function createVirtualLight( light, cascade ) { - - var virtualLight = new THREE.DirectionalLight(); - - virtualLight.isVirtual = true; - - virtualLight.onlyShadow = true; - virtualLight.castShadow = true; - - virtualLight.shadowCameraNear = light.shadowCameraNear; - virtualLight.shadowCameraFar = light.shadowCameraFar; - - virtualLight.shadowCameraLeft = light.shadowCameraLeft; - virtualLight.shadowCameraRight = light.shadowCameraRight; - virtualLight.shadowCameraBottom = light.shadowCameraBottom; - virtualLight.shadowCameraTop = light.shadowCameraTop; - - virtualLight.shadowCameraVisible = light.shadowCameraVisible; - - virtualLight.shadowDarkness = light.shadowDarkness; - - virtualLight.shadowBias = light.shadowCascadeBias[ cascade ]; - virtualLight.shadowMapWidth = light.shadowCascadeWidth[ cascade ]; - virtualLight.shadowMapHeight = light.shadowCascadeHeight[ cascade ]; - - virtualLight.pointsWorld = []; - virtualLight.pointsFrustum = []; - - var pointsWorld = virtualLight.pointsWorld, - pointsFrustum = virtualLight.pointsFrustum; - - for ( var i = 0; i < 8; i ++ ) { - - pointsWorld[ i ] = new THREE.Vector3(); - pointsFrustum[ i ] = new THREE.Vector3(); - - } - - var nearZ = light.shadowCascadeNearZ[ cascade ]; - var farZ = light.shadowCascadeFarZ[ cascade ]; - - pointsFrustum[ 0 ].set( -1, -1, nearZ ); - pointsFrustum[ 1 ].set( 1, -1, nearZ ); - pointsFrustum[ 2 ].set( -1, 1, nearZ ); - pointsFrustum[ 3 ].set( 1, 1, nearZ ); - - pointsFrustum[ 4 ].set( -1, -1, farZ ); - pointsFrustum[ 5 ].set( 1, -1, farZ ); - pointsFrustum[ 6 ].set( -1, 1, farZ ); - pointsFrustum[ 7 ].set( 1, 1, farZ ); - - return virtualLight; - - } - - // Synchronize virtual light with the original light - - function updateVirtualLight( light, cascade ) { - - var virtualLight = light.shadowCascadeArray[ cascade ]; - - virtualLight.position.copy( light.position ); - virtualLight.target.position.copy( light.target.position ); - virtualLight.lookAt( virtualLight.target ); - - virtualLight.shadowCameraVisible = light.shadowCameraVisible; - virtualLight.shadowDarkness = light.shadowDarkness; - - virtualLight.shadowBias = light.shadowCascadeBias[ cascade ]; - - var nearZ = light.shadowCascadeNearZ[ cascade ]; - var farZ = light.shadowCascadeFarZ[ cascade ]; - - var pointsFrustum = virtualLight.pointsFrustum; - - pointsFrustum[ 0 ].z = nearZ; - pointsFrustum[ 1 ].z = nearZ; - pointsFrustum[ 2 ].z = nearZ; - pointsFrustum[ 3 ].z = nearZ; - - pointsFrustum[ 4 ].z = farZ; - pointsFrustum[ 5 ].z = farZ; - pointsFrustum[ 6 ].z = farZ; - pointsFrustum[ 7 ].z = farZ; - - } - - // Fit shadow camera's ortho frustum to camera frustum - - function updateShadowCamera( camera, light ) { - - var shadowCamera = light.shadowCamera, - pointsFrustum = light.pointsFrustum, - pointsWorld = light.pointsWorld; - - _min.set( Infinity, Infinity, Infinity ); - _max.set( -Infinity, -Infinity, -Infinity ); - - for ( var i = 0; i < 8; i ++ ) { - - var p = pointsWorld[ i ]; - - p.copy( pointsFrustum[ i ] ); - THREE.ShadowMapPlugin.__projector.unprojectVector( p, camera ); - - p.applyMatrix4( shadowCamera.matrixWorldInverse ); - - if ( p.x < _min.x ) _min.x = p.x; - if ( p.x > _max.x ) _max.x = p.x; - - if ( p.y < _min.y ) _min.y = p.y; - if ( p.y > _max.y ) _max.y = p.y; - - if ( p.z < _min.z ) _min.z = p.z; - if ( p.z > _max.z ) _max.z = p.z; - - } - - shadowCamera.left = _min.x; - shadowCamera.right = _max.x; - shadowCamera.top = _max.y; - shadowCamera.bottom = _min.y; - - // can't really fit near/far - //shadowCamera.near = _min.z; - //shadowCamera.far = _max.z; - - shadowCamera.updateProjectionMatrix(); - - } - - // For the moment just ignore objects that have multiple materials with different animation methods - // Only the first material will be taken into account for deciding which depth material to use for shadow maps - - function getObjectMaterial( object ) { - - return object.material instanceof THREE.MeshFaceMaterial - ? object.material.materials[ 0 ] - : object.material; - - }; - -}; - -THREE.ShadowMapPlugin.__projector = new THREE.Projector(); - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SpritePlugin = function () { - - var _gl, _renderer, _texture; - - var vertices, faces, vertexBuffer, elementBuffer; - var program, attributes, uniforms; - - this.init = function ( renderer ) { - - _gl = renderer.context; - _renderer = renderer; - - vertices = new Float32Array( [ - - 0.5, - 0.5, 0, 0, - 0.5, - 0.5, 1, 0, - 0.5, 0.5, 1, 1, - - 0.5, 0.5, 0, 1 - ] ); - - faces = new Uint16Array( [ - 0, 1, 2, - 0, 2, 3 - ] ); - - vertexBuffer = _gl.createBuffer(); - elementBuffer = _gl.createBuffer(); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, vertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, vertices, _gl.STATIC_DRAW ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faces, _gl.STATIC_DRAW ); - - program = createProgram(); - - attributes = { - position: _gl.getAttribLocation ( program, 'position' ), - uv: _gl.getAttribLocation ( program, 'uv' ) - }; - - uniforms = { - uvOffset: _gl.getUniformLocation( program, 'uvOffset' ), - uvScale: _gl.getUniformLocation( program, 'uvScale' ), - - rotation: _gl.getUniformLocation( program, 'rotation' ), - scale: _gl.getUniformLocation( program, 'scale' ), - - color: _gl.getUniformLocation( program, 'color' ), - map: _gl.getUniformLocation( program, 'map' ), - opacity: _gl.getUniformLocation( program, 'opacity' ), - - modelViewMatrix: _gl.getUniformLocation( program, 'modelViewMatrix' ), - projectionMatrix: _gl.getUniformLocation( program, 'projectionMatrix' ), - - fogType: _gl.getUniformLocation( program, 'fogType' ), - fogDensity: _gl.getUniformLocation( program, 'fogDensity' ), - fogNear: _gl.getUniformLocation( program, 'fogNear' ), - fogFar: _gl.getUniformLocation( program, 'fogFar' ), - fogColor: _gl.getUniformLocation( program, 'fogColor' ), - - alphaTest: _gl.getUniformLocation( program, 'alphaTest' ) - }; - - var canvas = document.createElement( 'canvas' ); - canvas.width = 8; - canvas.height = 8; - - var context = canvas.getContext( '2d' ); - context.fillStyle = '#ffffff'; - context.fillRect( 0, 0, canvas.width, canvas.height ); - - _texture = new THREE.Texture( canvas ); - _texture.needsUpdate = true; - - }; - - this.render = function ( scene, camera, viewportWidth, viewportHeight ) { - - var sprites = scene.__webglSprites, - nSprites = sprites.length; - - if ( ! nSprites ) return; - - // setup gl - - _gl.useProgram( program ); - - _gl.enableVertexAttribArray( attributes.position ); - _gl.enableVertexAttribArray( attributes.uv ); - - _gl.disable( _gl.CULL_FACE ); - _gl.enable( _gl.BLEND ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, vertexBuffer ); - _gl.vertexAttribPointer( attributes.position, 2, _gl.FLOAT, false, 2 * 8, 0 ); - _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); - - _gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); - - _gl.activeTexture( _gl.TEXTURE0 ); - _gl.uniform1i( uniforms.map, 0 ); - - var oldFogType = 0; - var sceneFogType = 0; - var fog = scene.fog; - - if ( fog ) { - - _gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); - - if ( fog instanceof THREE.Fog ) { - - _gl.uniform1f( uniforms.fogNear, fog.near ); - _gl.uniform1f( uniforms.fogFar, fog.far ); - - _gl.uniform1i( uniforms.fogType, 1 ); - oldFogType = 1; - sceneFogType = 1; - - } else if ( fog instanceof THREE.FogExp2 ) { - - _gl.uniform1f( uniforms.fogDensity, fog.density ); - - _gl.uniform1i( uniforms.fogType, 2 ); - oldFogType = 2; - sceneFogType = 2; - - } - - } else { - - _gl.uniform1i( uniforms.fogType, 0 ); - oldFogType = 0; - sceneFogType = 0; - - } - - - // update positions and sort - - var i, sprite, material, fogType, scale = []; - - for( i = 0; i < nSprites; i ++ ) { - - sprite = sprites[ i ]; - material = sprite.material; - - if ( sprite.visible === false ) continue; - - sprite._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); - sprite.z = - sprite._modelViewMatrix.elements[ 14 ]; - - } - - sprites.sort( painterSortStable ); - - // render all sprites - - for( i = 0; i < nSprites; i ++ ) { - - sprite = sprites[ i ]; - - if ( sprite.visible === false ) continue; - - material = sprite.material; - - _gl.uniform1f( uniforms.alphaTest, material.alphaTest ); - _gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite._modelViewMatrix.elements ); - - scale[ 0 ] = sprite.scale.x; - scale[ 1 ] = sprite.scale.y; - - if ( scene.fog && material.fog ) { - - fogType = sceneFogType; - - } else { - - fogType = 0; - - } - - if ( oldFogType !== fogType ) { - - _gl.uniform1i( uniforms.fogType, fogType ); - oldFogType = fogType; - - } - - if ( material.map !== null ) { - - _gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); - _gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); - - } else { - - _gl.uniform2f( uniforms.uvOffset, 0, 0 ); - _gl.uniform2f( uniforms.uvScale, 1, 1 ); - - } - - _gl.uniform1f( uniforms.opacity, material.opacity ); - _gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); - - _gl.uniform1f( uniforms.rotation, material.rotation ); - _gl.uniform2fv( uniforms.scale, scale ); - - _renderer.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); - _renderer.setDepthTest( material.depthTest ); - _renderer.setDepthWrite( material.depthWrite ); - - if ( material.map && material.map.image && material.map.image.width ) { - - _renderer.setTexture( material.map, 0 ); - - } else { - - _renderer.setTexture( _texture, 0 ); - - } - - _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 ); - - } - - // restore gl - - _gl.enable( _gl.CULL_FACE ); - - }; - - function createProgram () { - - var program = _gl.createProgram(); - - var vertexShader = _gl.createShader( _gl.VERTEX_SHADER ); - var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER ); - - _gl.shaderSource( vertexShader, [ - - 'precision ' + _renderer.getPrecision() + ' float;', - - 'uniform mat4 modelViewMatrix;', - 'uniform mat4 projectionMatrix;', - 'uniform float rotation;', - 'uniform vec2 scale;', - 'uniform vec2 uvOffset;', - 'uniform vec2 uvScale;', - - 'attribute vec2 position;', - 'attribute vec2 uv;', - - 'varying vec2 vUV;', - - 'void main() {', - - 'vUV = uvOffset + uv * uvScale;', - - 'vec2 alignedPosition = position * scale;', - - 'vec2 rotatedPosition;', - 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', - 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', - - 'vec4 finalPosition;', - - 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', - 'finalPosition.xy += rotatedPosition;', - 'finalPosition = projectionMatrix * finalPosition;', - - 'gl_Position = finalPosition;', - - '}' - - ].join( '\n' ) ); - - _gl.shaderSource( fragmentShader, [ - - 'precision ' + _renderer.getPrecision() + ' float;', - - 'uniform vec3 color;', - 'uniform sampler2D map;', - 'uniform float opacity;', - - 'uniform int fogType;', - 'uniform vec3 fogColor;', - 'uniform float fogDensity;', - 'uniform float fogNear;', - 'uniform float fogFar;', - 'uniform float alphaTest;', - - 'varying vec2 vUV;', - - 'void main() {', - - 'vec4 texture = texture2D( map, vUV );', - - 'if ( texture.a < alphaTest ) discard;', - - 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', - - 'if ( fogType > 0 ) {', - - 'float depth = gl_FragCoord.z / gl_FragCoord.w;', - 'float fogFactor = 0.0;', - - 'if ( fogType == 1 ) {', - - 'fogFactor = smoothstep( fogNear, fogFar, depth );', - - '} else {', - - 'const float LOG2 = 1.442695;', - 'float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', - 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', - - '}', - - 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', - - '}', - - '}' - - ].join( '\n' ) ); - - _gl.compileShader( vertexShader ); - _gl.compileShader( fragmentShader ); - - _gl.attachShader( program, vertexShader ); - _gl.attachShader( program, fragmentShader ); - - _gl.linkProgram( program ); - - return program; - - }; - - function painterSortStable ( a, b ) { - - if ( a.z !== b.z ) { - - return b.z - a.z; - - } else { - - return b.id - a.id; - - } - - }; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.DepthPassPlugin = function () { - - this.enabled = false; - this.renderTarget = null; - - var _gl, - _renderer, - _depthMaterial, _depthMaterialMorph, _depthMaterialSkin, _depthMaterialMorphSkin, - - _frustum = new THREE.Frustum(), - _projScreenMatrix = new THREE.Matrix4(); - - this.init = function ( renderer ) { - - _gl = renderer.context; - _renderer = renderer; - - var depthShader = THREE.ShaderLib[ "depthRGBA" ]; - var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms ); - - _depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } ); - _depthMaterialMorph = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true } ); - _depthMaterialSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, skinning: true } ); - _depthMaterialMorphSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true, skinning: true } ); - - _depthMaterial._shadowPass = true; - _depthMaterialMorph._shadowPass = true; - _depthMaterialSkin._shadowPass = true; - _depthMaterialMorphSkin._shadowPass = true; - - }; - - this.render = function ( scene, camera ) { - - if ( ! this.enabled ) return; - - this.update( scene, camera ); - - }; - - this.update = function ( scene, camera ) { - - var i, il, j, jl, n, - - program, buffer, material, - webglObject, object, light, - renderList, - - fog = null; - - // set GL state for depth map - - _gl.clearColor( 1, 1, 1, 1 ); - _gl.disable( _gl.BLEND ); - - _renderer.setDepthTest( true ); - - // update scene - - if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); - - // update camera matrices and frustum - - camera.matrixWorldInverse.getInverse( camera.matrixWorld ); - - _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); - _frustum.setFromMatrix( _projScreenMatrix ); - - // render depth map - - _renderer.setRenderTarget( this.renderTarget ); - _renderer.clear(); - - // set object matrices & frustum culling - - renderList = scene.__webglObjects; - - for ( j = 0, jl = renderList.length; j < jl; j ++ ) { - - webglObject = renderList[ j ]; - object = webglObject.object; - - webglObject.render = false; - - if ( object.visible ) { - - if ( ! ( object instanceof THREE.Mesh || object instanceof THREE.ParticleSystem ) || ! ( object.frustumCulled ) || _frustum.intersectsObject( object ) ) { - - object._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); - - webglObject.render = true; - - } - - } - - } - - // render regular objects - - var objectMaterial, useMorphing, useSkinning; - - for ( j = 0, jl = renderList.length; j < jl; j ++ ) { - - webglObject = renderList[ j ]; - - if ( webglObject.render ) { - - object = webglObject.object; - buffer = webglObject.buffer; - - // todo: create proper depth material for particles - - if ( object instanceof THREE.ParticleSystem && !object.customDepthMaterial ) continue; - - objectMaterial = getObjectMaterial( object ); - - if ( objectMaterial ) _renderer.setMaterialFaces( object.material ); - - useMorphing = object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets; - useSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning; - - if ( object.customDepthMaterial ) { - - material = object.customDepthMaterial; - - } else if ( useSkinning ) { - - material = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin; - - } else if ( useMorphing ) { - - material = _depthMaterialMorph; - - } else { - - material = _depthMaterial; - - } - - if ( buffer instanceof THREE.BufferGeometry ) { - - _renderer.renderBufferDirect( camera, scene.__lights, fog, material, buffer, object ); - - } else { - - _renderer.renderBuffer( camera, scene.__lights, fog, material, buffer, object ); - - } - - } - - } - - // set matrices and render immediate objects - - renderList = scene.__webglObjectsImmediate; - - for ( j = 0, jl = renderList.length; j < jl; j ++ ) { - - webglObject = renderList[ j ]; - object = webglObject.object; - - if ( object.visible ) { - - object._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); - - _renderer.renderImmediateObject( camera, scene.__lights, fog, _depthMaterial, object ); - - } - - } - - // restore GL state - - var clearColor = _renderer.getClearColor(), - clearAlpha = _renderer.getClearAlpha(); - - _gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha ); - _gl.enable( _gl.BLEND ); - - }; - - // For the moment just ignore objects that have multiple materials with different animation methods - // Only the first material will be taken into account for deciding which depth material to use - - function getObjectMaterial( object ) { - - return object.material instanceof THREE.MeshFaceMaterial - ? object.material.materials[ 0 ] - : object.material; - - }; - -}; - - -/** - * @author mikael emtinger / http://gomo.se/ - */ - -THREE.ShaderFlares = { - - 'lensFlareVertexTexture': { - - vertexShader: [ - - "uniform lowp int renderType;", - - "uniform vec3 screenPosition;", - "uniform vec2 scale;", - "uniform float rotation;", - - "uniform sampler2D occlusionMap;", - - "attribute vec2 position;", - "attribute vec2 uv;", - - "varying vec2 vUV;", - "varying float vVisibility;", - - "void main() {", - - "vUV = uv;", - - "vec2 pos = position;", - - "if( renderType == 2 ) {", - - "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", - "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", - "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", - "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", - "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", - "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", - "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", - "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", - "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", - - "vVisibility = visibility.r / 9.0;", - "vVisibility *= 1.0 - visibility.g / 9.0;", - "vVisibility *= visibility.b / 9.0;", - "vVisibility *= 1.0 - visibility.a / 9.0;", - - "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", - "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", - - "}", - - "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", - - "}" - - ].join( "\n" ), - - fragmentShader: [ - - "uniform lowp int renderType;", - - "uniform sampler2D map;", - "uniform float opacity;", - "uniform vec3 color;", - - "varying vec2 vUV;", - "varying float vVisibility;", - - "void main() {", - - // pink square - - "if( renderType == 0 ) {", - - "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", - - // restore - - "} else if( renderType == 1 ) {", - - "gl_FragColor = texture2D( map, vUV );", - - // flare - - "} else {", - - "vec4 texture = texture2D( map, vUV );", - "texture.a *= opacity * vVisibility;", - "gl_FragColor = texture;", - "gl_FragColor.rgb *= color;", - - "}", - - "}" - ].join( "\n" ) - - }, - - - 'lensFlare': { - - vertexShader: [ - - "uniform lowp int renderType;", - - "uniform vec3 screenPosition;", - "uniform vec2 scale;", - "uniform float rotation;", - - "attribute vec2 position;", - "attribute vec2 uv;", - - "varying vec2 vUV;", - - "void main() {", - - "vUV = uv;", - - "vec2 pos = position;", - - "if( renderType == 2 ) {", - - "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", - "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", - - "}", - - "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", - - "}" - - ].join( "\n" ), - - fragmentShader: [ - - "precision mediump float;", - - "uniform lowp int renderType;", - - "uniform sampler2D map;", - "uniform sampler2D occlusionMap;", - "uniform float opacity;", - "uniform vec3 color;", - - "varying vec2 vUV;", - - "void main() {", - - // pink square - - "if( renderType == 0 ) {", - - "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", - - // restore - - "} else if( renderType == 1 ) {", - - "gl_FragColor = texture2D( map, vUV );", - - // flare - - "} else {", - - "float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;", - "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;", - "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;", - "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;", - "visibility = ( 1.0 - visibility / 4.0 );", - - "vec4 texture = texture2D( map, vUV );", - "texture.a *= opacity * visibility;", - "gl_FragColor = texture;", - "gl_FragColor.rgb *= color;", - - "}", - - "}" - - ].join( "\n" ) - - } - -}; - diff --git a/PotreeConverter/resources/page_template/libs/tween/LICENSE.txt b/PotreeConverter/resources/page_template/libs/tween/LICENSE.txt new file mode 100644 index 00000000..268787f6 --- /dev/null +++ b/PotreeConverter/resources/page_template/libs/tween/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 gskinner.com, inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PotreeConverter/resources/page_template/libs/tween/README.txt b/PotreeConverter/resources/page_template/libs/tween/README.txt new file mode 100644 index 00000000..1b0aef6a --- /dev/null +++ b/PotreeConverter/resources/page_template/libs/tween/README.txt @@ -0,0 +1,9 @@ +This directory contains a compressed version of the TweenJS library. + +It also includes a minified version of EaselJS, and is included for the Ticker class, which TweenJS uses by default. If you don't wish to use EaselJS, you can implement your own ticking mechanism, or download the Ticker class on its own from http://github.com/createjs/easeljs/ + +It is recommended that you use this version in almost all cases, unless you need to modify the original code. It is much smaller, results in less http requests, and you don't have to worry about the order in which you include the js files. + +tween.js is a single file that contains compacted versions of all of the TweenJS classes (comments and white space stripped). + +You can also gzip the file to further reduce its size (by about 75%). Many servers do this automatically. diff --git a/PotreeConverter/resources/page_template/libs/tween/tween.min.js b/PotreeConverter/resources/page_template/libs/tween/tween.min.js new file mode 100644 index 00000000..2f2a9645 --- /dev/null +++ b/PotreeConverter/resources/page_template/libs/tween/tween.min.js @@ -0,0 +1,2 @@ +// tween.js v.0.15.0 https://github.com/sole/tween.js +void 0===Date.now&&(Date.now=function(){return(new Date).valueOf()});var TWEEN=TWEEN||function(){var n=[];return{REVISION:"14",getAll:function(){return n},removeAll:function(){n=[]},add:function(t){n.push(t)},remove:function(t){var r=n.indexOf(t);-1!==r&&n.splice(r,1)},update:function(t){if(0===n.length)return!1;var r=0;for(t=void 0!==t?t:"undefined"!=typeof window&&void 0!==window.performance&&void 0!==window.performance.now?window.performance.now():Date.now();rn;n++)E[n].stop()},this.delay=function(n){return s=n,this},this.repeat=function(n){return e=n,this},this.yoyo=function(n){return a=n,this},this.easing=function(n){return l=n,this},this.interpolation=function(n){return p=n,this},this.chain=function(){return E=arguments,this},this.onStart=function(n){return d=n,this},this.onUpdate=function(n){return I=n,this},this.onComplete=function(n){return w=n,this},this.onStop=function(n){return M=n,this},this.update=function(n){var f;if(h>n)return!0;v===!1&&(null!==d&&d.call(t),v=!0);var M=(n-h)/o;M=M>1?1:M;var O=l(M);for(f in i){var m=r[f]||0,N=i[f];N instanceof Array?t[f]=p(N,O):("string"==typeof N&&(N=m+parseFloat(N,10)),"number"==typeof N&&(t[f]=m+(N-m)*O))}if(null!==I&&I.call(t,O),1==M){if(e>0){isFinite(e)&&e--;for(f in u){if("string"==typeof i[f]&&(u[f]=u[f]+parseFloat(i[f],10)),a){var T=u[f];u[f]=i[f],i[f]=T}r[f]=u[f]}return a&&(c=!c),h=n+s,!0}null!==w&&w.call(t);for(var g=0,W=E.length;W>g;g++)E[g].start(n);return!1}return!0}},TWEEN.Easing={Linear:{None:function(n){return n}},Quadratic:{In:function(n){return n*n},Out:function(n){return n*(2-n)},InOut:function(n){return(n*=2)<1?.5*n*n:-.5*(--n*(n-2)-1)}},Cubic:{In:function(n){return n*n*n},Out:function(n){return--n*n*n+1},InOut:function(n){return(n*=2)<1?.5*n*n*n:.5*((n-=2)*n*n+2)}},Quartic:{In:function(n){return n*n*n*n},Out:function(n){return 1- --n*n*n*n},InOut:function(n){return(n*=2)<1?.5*n*n*n*n:-.5*((n-=2)*n*n*n-2)}},Quintic:{In:function(n){return n*n*n*n*n},Out:function(n){return--n*n*n*n*n+1},InOut:function(n){return(n*=2)<1?.5*n*n*n*n*n:.5*((n-=2)*n*n*n*n+2)}},Sinusoidal:{In:function(n){return 1-Math.cos(n*Math.PI/2)},Out:function(n){return Math.sin(n*Math.PI/2)},InOut:function(n){return.5*(1-Math.cos(Math.PI*n))}},Exponential:{In:function(n){return 0===n?0:Math.pow(1024,n-1)},Out:function(n){return 1===n?1:1-Math.pow(2,-10*n)},InOut:function(n){return 0===n?0:1===n?1:(n*=2)<1?.5*Math.pow(1024,n-1):.5*(-Math.pow(2,-10*(n-1))+2)}},Circular:{In:function(n){return 1-Math.sqrt(1-n*n)},Out:function(n){return Math.sqrt(1- --n*n)},InOut:function(n){return(n*=2)<1?-.5*(Math.sqrt(1-n*n)-1):.5*(Math.sqrt(1-(n-=2)*n)+1)}},Elastic:{In:function(n){var t,r=.1,i=.4;return 0===n?0:1===n?1:(!r||1>r?(r=1,t=i/4):t=i*Math.asin(1/r)/(2*Math.PI),-(r*Math.pow(2,10*(n-=1))*Math.sin(2*(n-t)*Math.PI/i)))},Out:function(n){var t,r=.1,i=.4;return 0===n?0:1===n?1:(!r||1>r?(r=1,t=i/4):t=i*Math.asin(1/r)/(2*Math.PI),r*Math.pow(2,-10*n)*Math.sin(2*(n-t)*Math.PI/i)+1)},InOut:function(n){var t,r=.1,i=.4;return 0===n?0:1===n?1:(!r||1>r?(r=1,t=i/4):t=i*Math.asin(1/r)/(2*Math.PI),(n*=2)<1?-.5*r*Math.pow(2,10*(n-=1))*Math.sin(2*(n-t)*Math.PI/i):r*Math.pow(2,-10*(n-=1))*Math.sin(2*(n-t)*Math.PI/i)*.5+1)}},Back:{In:function(n){var t=1.70158;return n*n*((t+1)*n-t)},Out:function(n){var t=1.70158;return--n*n*((t+1)*n+t)+1},InOut:function(n){var t=2.5949095;return(n*=2)<1?.5*n*n*((t+1)*n-t):.5*((n-=2)*n*((t+1)*n+t)+2)}},Bounce:{In:function(n){return 1-TWEEN.Easing.Bounce.Out(1-n)},Out:function(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375},InOut:function(n){return.5>n?.5*TWEEN.Easing.Bounce.In(2*n):.5*TWEEN.Easing.Bounce.Out(2*n-1)+.5}}},TWEEN.Interpolation={Linear:function(n,t){var r=n.length-1,i=r*t,u=Math.floor(i),o=TWEEN.Interpolation.Utils.Linear;return 0>t?o(n[0],n[1],i):t>1?o(n[r],n[r-1],r-i):o(n[u],n[u+1>r?r:u+1],i-u)},Bezier:function(n,t){var r,i=0,u=n.length-1,o=Math.pow,e=TWEEN.Interpolation.Utils.Bernstein;for(r=0;u>=r;r++)i+=o(1-t,u-r)*o(t,r)*n[r]*e(u,r);return i},CatmullRom:function(n,t){var r=n.length-1,i=r*t,u=Math.floor(i),o=TWEEN.Interpolation.Utils.CatmullRom;return n[0]===n[r]?(0>t&&(u=Math.floor(i=r*(1+t))),o(n[(u-1+r)%r],n[u],n[(u+1)%r],n[(u+2)%r],i-u)):0>t?n[0]-(o(n[0],n[0],n[1],n[1],-i)-n[0]):t>1?n[r]-(o(n[r],n[r],n[r-1],n[r-1],i-r)-n[r]):o(n[u?u-1:0],n[u],n[u+1>r?r:u+1],n[u+2>r?r:u+2],i-u)},Utils:{Linear:function(n,t,r){return(t-n)*r+n},Bernstein:function(n,t){var r=TWEEN.Interpolation.Utils.Factorial;return r(n)/r(t)/r(n-t)},Factorial:function(){var n=[1];return function(t){var r,i=1;if(n[t])return n[t];for(r=t;r>1;r--)i*=r;return n[t]=i}}(),CatmullRom:function(n,t,r,i,u){var o=.5*(r-n),e=.5*(i-t),a=u*u,f=u*a;return(2*t-2*r+o+e)*f+(-3*t+3*r-2*o-e)*a+o*u+t}}},"undefined"!=typeof module&&module.exports&&(module.exports=TWEEN); \ No newline at end of file diff --git a/PotreeConverter/resources/page_template/resources/textures/skyboxsun25degtest.png b/PotreeConverter/resources/page_template/resources/textures/skyboxsun25degtest.png deleted file mode 100644 index 7846fe55..00000000 Binary files a/PotreeConverter/resources/page_template/resources/textures/skyboxsun25degtest.png and /dev/null differ diff --git a/PotreeConverter/resources/page_template/resources/textures/skyboxsun25degtest.txt b/PotreeConverter/resources/page_template/resources/textures/skyboxsun25degtest.txt deleted file mode 100644 index 9e47547a..00000000 --- a/PotreeConverter/resources/page_template/resources/textures/skyboxsun25degtest.txt +++ /dev/null @@ -1 +0,0 @@ -http://reije081.home.xs4all.nl/skyboxes/