@jumio/websdk 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +0,0 @@
1
- const I = "data:text/javascript;base64,dmFyIE1vZHVsZSA9ICgoKSA9PiB7CiAgdmFyIF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDsKCiAgcmV0dXJuIGZ1bmN0aW9uIChtb2R1bGVBcmcgPSB7fSkgewogICAgdmFyIE1vZHVsZSA9IG1vZHVsZUFyZzsKICAgIHZhciByZWFkeVByb21pc2VSZXNvbHZlLCByZWFkeVByb21pc2VSZWplY3Q7CiAgICBNb2R1bGVbJ3JlYWR5J10gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUgPSByZXNvbHZlOwogICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICB9KTsKICAgIHZhciBtb2R1bGVPdmVycmlkZXMgPSBPYmplY3QuYXNzaWduKHt9LCBNb2R1bGUpOwogICAgdmFyIGFyZ3VtZW50c18gPSBbXTsKICAgIHZhciB0aGlzUHJvZ3JhbSA9ICcuL3RoaXMucHJvZ3JhbSc7CiAgICB2YXIgcXVpdF8gPSAoc3RhdHVzLCB0b1Rocm93KSA9PiB7CiAgICAgIHRocm93IHRvVGhyb3c7CiAgICB9OwogICAgdmFyIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCc7CiAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSID0gdHlwZW9mIGltcG9ydFNjcmlwdHMgPT0gJ2Z1bmN0aW9uJzsKICAgIHZhciBFTlZJUk9OTUVOVF9JU19OT0RFID0KICAgICAgdHlwZW9mIHByb2Nlc3MgPT0gJ29iamVjdCcgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMgPT0gJ29iamVjdCcgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PSAnc3RyaW5nJzsKICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAnJzsKICAgIGZ1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCkgewogICAgICBpZiAoTW9kdWxlWydsb2NhdGVGaWxlJ10pIHsKICAgICAgICByZXR1cm4gTW9kdWxlWydsb2NhdGVGaWxlJ10ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgfQogICAgICByZXR1cm4gc2NyaXB0RGlyZWN0b3J5ICsgcGF0aDsKICAgIH0KICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgaWYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNlbGYubG9jYXRpb24uaHJlZjsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCkgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOwogICAgICB9CiAgICAgIGlmIChfc2NyaXB0RGlyKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdERpcjsKICAgICAgfQogICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LnN0YXJ0c1dpdGgoJ2Jsb2I6JykpIHsKICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAnJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5yZXBsYWNlKC9bPyNdLiovLCAnJykubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgICB9CiAgICAgIHsKICAgICAgICByZWFkXyA9ICh1cmwpID0+IHsKICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIGZhbHNlKTsKICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVRleHQ7CiAgICAgICAgfTsKICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICByZWFkQmluYXJ5ID0gKHVybCkgPT4gewogICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7CiAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJlYWRBc3luYyA9ICh1cmwsIG9ubG9hZCwgb25lcnJvcikgPT4gewogICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7CiAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJzsKICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCB8fCAoeGhyLnN0YXR1cyA9PSAwICYmIHhoci5yZXNwb25zZSkpIHsKICAgICAgICAgICAgICBvbmxvYWQoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb25lcnJvcigpOwogICAgICAgICAgfTsKICAgICAgICAgIHhoci5vbmVycm9yID0gb25lcnJvcjsKICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgIH07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICB9CiAgICB2YXIgb3V0ID0gTW9kdWxlWydwcmludCddIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICB2YXIgZXJyID0gTW9kdWxlWydwcmludEVyciddIHx8IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTsKICAgIE9iamVjdC5hc3NpZ24oTW9kdWxlLCBtb2R1bGVPdmVycmlkZXMpOwogICAgbW9kdWxlT3ZlcnJpZGVzID0gbnVsbDsKICAgIGlmIChNb2R1bGVbJ2FyZ3VtZW50cyddKSB7CiAgICAgIGFyZ3VtZW50c18gPSBNb2R1bGVbJ2FyZ3VtZW50cyddOwogICAgfQogICAgaWYgKE1vZHVsZVsndGhpc1Byb2dyYW0nXSkgewogICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsndGhpc1Byb2dyYW0nXTsKICAgIH0KICAgIGlmIChNb2R1bGVbJ3F1aXQnXSkgewogICAgICBxdWl0XyA9IE1vZHVsZVsncXVpdCddOwogICAgfQogICAgdmFyIHdhc21CaW5hcnk7CiAgICBpZiAoTW9kdWxlWyd3YXNtQmluYXJ5J10pIHsKICAgICAgd2FzbUJpbmFyeSA9IE1vZHVsZVsnd2FzbUJpbmFyeSddOwogICAgfQogICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPSAnb2JqZWN0JykgewogICAgICBhYm9ydCgnbm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCcpOwogICAgfQogICAgdmFyIHdhc21NZW1vcnk7CiAgICB2YXIgQUJPUlQgPSBmYWxzZTsKICAgIHZhciBFWElUU1RBVFVTOwogICAgdmFyIEhFQVA4LCBIRUFQVTgsIEhFQVAxNiwgSEVBUFUxNiwgSEVBUDMyLCBIRUFQVTMyLCBIRUFQRjMyLCBIRUFQRjY0OwogICAgZnVuY3Rpb24gdXBkYXRlTWVtb3J5Vmlld3MoKSB7CiAgICAgIHZhciBiID0gd2FzbU1lbW9yeS5idWZmZXI7CiAgICAgIE1vZHVsZVsnSEVBUDgnXSA9IEhFQVA4ID0gbmV3IEludDhBcnJheShiKTsKICAgICAgTW9kdWxlWydIRUFQMTYnXSA9IEhFQVAxNiA9IG5ldyBJbnQxNkFycmF5KGIpOwogICAgICBNb2R1bGVbJ0hFQVBVOCddID0gSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkoYik7CiAgICAgIE1vZHVsZVsnSEVBUFUxNiddID0gSEVBUFUxNiA9IG5ldyBVaW50MTZBcnJheShiKTsKICAgICAgTW9kdWxlWydIRUFQMzInXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGIpOwogICAgICBNb2R1bGVbJ0hFQVBVMzInXSA9IEhFQVBVMzIgPSBuZXcgVWludDMyQXJyYXkoYik7CiAgICAgIE1vZHVsZVsnSEVBUEYzMiddID0gSEVBUEYzMiA9IG5ldyBGbG9hdDMyQXJyYXkoYik7CiAgICAgIE1vZHVsZVsnSEVBUEY2NCddID0gSEVBUEY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoYik7CiAgICB9CiAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICB2YXIgX19BVElOSVRfXyA9IFtdOwogICAgdmFyIF9fQVRNQUlOX18gPSBbXTsKICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICB2YXIgcnVudGltZUluaXRpYWxpemVkID0gZmFsc2U7CiAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbJ3ByZVJ1biddKSB7CiAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbJ3ByZVJ1biddID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIE1vZHVsZVsncHJlUnVuJ10gPSBbTW9kdWxlWydwcmVSdW4nXV07CiAgICAgICAgfQogICAgICAgIHdoaWxlIChNb2R1bGVbJ3ByZVJ1biddLmxlbmd0aCkgewogICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWydwcmVSdW4nXS5zaGlmdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKTsKICAgIH0KICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICBydW50aW1lSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICBpZiAoIU1vZHVsZVsnbm9GU0luaXQnXSAmJiAhRlMuaW5pdC5pbml0aWFsaXplZCkgewogICAgICAgIEZTLmluaXQoKTsKICAgICAgfQogICAgICBGUy5pZ25vcmVQZXJtaXNzaW9ucyA9IGZhbHNlOwogICAgICBUVFkuaW5pdCgpOwogICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTsKICAgIH0KICAgIGZ1bmN0aW9uIHByZU1haW4oKSB7CiAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgfQogICAgZnVuY3Rpb24gcG9zdFJ1bigpIHsKICAgICAgaWYgKE1vZHVsZVsncG9zdFJ1biddKSB7CiAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbJ3Bvc3RSdW4nXSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBNb2R1bGVbJ3Bvc3RSdW4nXSA9IFtNb2R1bGVbJ3Bvc3RSdW4nXV07CiAgICAgICAgfQogICAgICAgIHdoaWxlIChNb2R1bGVbJ3Bvc3RSdW4nXS5sZW5ndGgpIHsKICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbJ3Bvc3RSdW4nXS5zaGlmdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyk7CiAgICB9CiAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICB9CiAgICBmdW5jdGlvbiBhZGRPbkluaXQoY2IpIHsKICAgICAgX19BVElOSVRfXy51bnNoaWZ0KGNiKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgfQogICAgdmFyIHJ1bkRlcGVuZGVuY2llcyA9IDA7CiAgICB2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXIgPSBudWxsOwogICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICBmdW5jdGlvbiBnZXRVbmlxdWVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgIHJldHVybiBpZDsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgcnVuRGVwZW5kZW5jaWVzKys7CiAgICAgIE1vZHVsZVsnbW9uaXRvclJ1bkRlcGVuZGVuY2llcyddPy4ocnVuRGVwZW5kZW5jaWVzKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgcnVuRGVwZW5kZW5jaWVzLS07CiAgICAgIE1vZHVsZVsnbW9uaXRvclJ1bkRlcGVuZGVuY2llcyddPy4ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA9PSAwKSB7CiAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY3lXYXRjaGVyICE9PSBudWxsKSB7CiAgICAgICAgICBjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTsKICAgICAgICAgIHJ1bkRlcGVuZGVuY3lXYXRjaGVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCkgewogICAgICAgICAgdmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkOwogICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBhYm9ydCh3aGF0KSB7CiAgICAgIE1vZHVsZVsnb25BYm9ydCddPy4od2hhdCk7CiAgICAgIHdoYXQgPSAnQWJvcnRlZCgnICsgd2hhdCArICcpJzsKICAgICAgZXJyKHdoYXQpOwogICAgICBBQk9SVCA9IHRydWU7CiAgICAgIEVYSVRTVEFUVVMgPSAxOwogICAgICB3aGF0ICs9ICcuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uJzsKICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgIHRocm93IGU7CiAgICB9CiAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICdkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsJzsKICAgIHZhciBpc0RhdGFVUkkgPSAoZmlsZW5hbWUpID0+IGZpbGVuYW1lLnN0YXJ0c1dpdGgoZGF0YVVSSVByZWZpeCk7CiAgICB2YXIgd2FzbUJpbmFyeUZpbGU7CiAgICB3YXNtQmluYXJ5RmlsZSA9ICdkYWNfc2ltZC53YXNtJzsKICAgIGlmICghaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICB3YXNtQmluYXJ5RmlsZSA9IGxvY2F0ZUZpbGUod2FzbUJpbmFyeUZpbGUpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QmluYXJ5U3luYyhmaWxlKSB7CiAgICAgIGlmIChmaWxlID09IHdhc21CaW5hcnlGaWxlICYmIHdhc21CaW5hcnkpIHsKICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSk7CiAgICAgIH0KICAgICAgaWYgKHJlYWRCaW5hcnkpIHsKICAgICAgICByZXR1cm4gcmVhZEJpbmFyeShmaWxlKTsKICAgICAgfQogICAgICB0aHJvdyAnc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQ6IHlvdSBjYW4gcHJlbG9hZCBpdCB0byBNb2R1bGVbIndhc21CaW5hcnkiXSBtYW51YWxseSwgb3IgZW1jYy5weSB3aWxsIGRvIHRoYXQgZm9yIHlvdSB3aGVuIGdlbmVyYXRpbmcgSFRNTCAoYnV0IG5vdCBKUyknOwogICAgfQogICAgZnVuY3Rpb24gaW5zdGFudGlhdGVTeW5jKGZpbGUsIGluZm8pIHsKICAgICAgdmFyIG1vZHVsZTsKICAgICAgdmFyIGJpbmFyeSA9IGdldEJpbmFyeVN5bmMoZmlsZSk7CiAgICAgIG1vZHVsZSA9IG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUoYmluYXJ5KTsKICAgICAgdmFyIGluc3RhbmNlID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG1vZHVsZSwgaW5mbyk7CiAgICAgIHJldHVybiBbaW5zdGFuY2UsIG1vZHVsZV07CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVXYXNtKCkgewogICAgICB2YXIgaW5mbyA9IHsgZW52OiB3YXNtSW1wb3J0cywgd2FzaV9zbmFwc2hvdF9wcmV2aWV3MTogd2FzbUltcG9ydHMgfTsKICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLCBtb2R1bGUpIHsKICAgICAgICB3YXNtRXhwb3J0cyA9IGluc3RhbmNlLmV4cG9ydHM7CiAgICAgICAgd2FzbU1lbW9yeSA9IHdhc21FeHBvcnRzWydtZW1vcnknXTsKICAgICAgICB1cGRhdGVNZW1vcnlWaWV3cygpOwogICAgICAgIHdhc21UYWJsZSA9IHdhc21FeHBvcnRzWydfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlJ107CiAgICAgICAgYWRkT25Jbml0KHdhc21FeHBvcnRzWydfX3dhc21fY2FsbF9jdG9ycyddKTsKICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KCd3YXNtLWluc3RhbnRpYXRlJyk7CiAgICAgICAgcmV0dXJuIHdhc21FeHBvcnRzOwogICAgICB9CiAgICAgIGFkZFJ1bkRlcGVuZGVuY3koJ3dhc20taW5zdGFudGlhdGUnKTsKICAgICAgaWYgKE1vZHVsZVsnaW5zdGFudGlhdGVXYXNtJ10pIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIE1vZHVsZVsnaW5zdGFudGlhdGVXYXNtJ10oaW5mbywgcmVjZWl2ZUluc3RhbmNlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBlcnIoYE1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZX1gKTsKICAgICAgICAgIHJlYWR5UHJvbWlzZVJlamVjdChlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdCA9IGluc3RhbnRpYXRlU3luYyh3YXNtQmluYXJ5RmlsZSwgaW5mbyk7CiAgICAgIHJldHVybiByZWNlaXZlSW5zdGFuY2UocmVzdWx0WzBdKTsKICAgIH0KICAgIHZhciB0ZW1wRG91YmxlOwogICAgdmFyIHRlbXBJNjQ7CiAgICBmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cykgewogICAgICB0aGlzLm5hbWUgPSAnRXhpdFN0YXR1cyc7CiAgICAgIHRoaXMubWVzc2FnZSA9IGBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7c3RhdHVzfSlgOwogICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgIH0KICAgIHZhciBjYWxsUnVudGltZUNhbGxiYWNrcyA9IChjYWxsYmFja3MpID0+IHsKICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgY2FsbGJhY2tzLnNoaWZ0KCkoTW9kdWxlKTsKICAgICAgfQogICAgfTsKICAgIHZhciBub0V4aXRSdW50aW1lID0gTW9kdWxlWydub0V4aXRSdW50aW1lJ10gfHwgdHJ1ZTsKICAgIGNsYXNzIEV4Y2VwdGlvbkluZm8gewogICAgICBjb25zdHJ1Y3RvcihleGNQdHIpIHsKICAgICAgICB0aGlzLmV4Y1B0ciA9IGV4Y1B0cjsKICAgICAgICB0aGlzLnB0ciA9IGV4Y1B0ciAtIDI0OwogICAgICB9CiAgICAgIHNldF90eXBlKHR5cGUpIHsKICAgICAgICBIRUFQVTMyWyh0aGlzLnB0ciArIDQpID4+IDJdID0gdHlwZTsKICAgICAgfQogICAgICBnZXRfdHlwZSgpIHsKICAgICAgICByZXR1cm4gSEVBUFUzMlsodGhpcy5wdHIgKyA0KSA+PiAyXTsKICAgICAgfQogICAgICBzZXRfZGVzdHJ1Y3RvcihkZXN0cnVjdG9yKSB7CiAgICAgICAgSEVBUFUzMlsodGhpcy5wdHIgKyA4KSA+PiAyXSA9IGRlc3RydWN0b3I7CiAgICAgIH0KICAgICAgZ2V0X2Rlc3RydWN0b3IoKSB7CiAgICAgICAgcmV0dXJuIEhFQVBVMzJbKHRoaXMucHRyICsgOCkgPj4gMl07CiAgICAgIH0KICAgICAgc2V0X2NhdWdodChjYXVnaHQpIHsKICAgICAgICBjYXVnaHQgPSBjYXVnaHQgPyAxIDogMDsKICAgICAgICBIRUFQOFsodGhpcy5wdHIgKyAxMikgPj4gMF0gPSBjYXVnaHQ7CiAgICAgIH0KICAgICAgZ2V0X2NhdWdodCgpIHsKICAgICAgICByZXR1cm4gSEVBUDhbKHRoaXMucHRyICsgMTIpID4+IDBdICE9IDA7CiAgICAgIH0KICAgICAgc2V0X3JldGhyb3duKHJldGhyb3duKSB7CiAgICAgICAgcmV0aHJvd24gPSByZXRocm93biA/IDEgOiAwOwogICAgICAgIEhFQVA4Wyh0aGlzLnB0ciArIDEzKSA+PiAwXSA9IHJldGhyb3duOwogICAgICB9CiAgICAgIGdldF9yZXRocm93bigpIHsKICAgICAgICByZXR1cm4gSEVBUDhbKHRoaXMucHRyICsgMTMpID4+IDBdICE9IDA7CiAgICAgIH0KICAgICAgaW5pdCh0eXBlLCBkZXN0cnVjdG9yKSB7CiAgICAgICAgdGhpcy5zZXRfYWRqdXN0ZWRfcHRyKDApOwogICAgICAgIHRoaXMuc2V0X3R5cGUodHlwZSk7CiAgICAgICAgdGhpcy5zZXRfZGVzdHJ1Y3RvcihkZXN0cnVjdG9yKTsKICAgICAgfQogICAgICBzZXRfYWRqdXN0ZWRfcHRyKGFkanVzdGVkUHRyKSB7CiAgICAgICAgSEVBUFUzMlsodGhpcy5wdHIgKyAxNikgPj4gMl0gPSBhZGp1c3RlZFB0cjsKICAgICAgfQogICAgICBnZXRfYWRqdXN0ZWRfcHRyKCkgewogICAgICAgIHJldHVybiBIRUFQVTMyWyh0aGlzLnB0ciArIDE2KSA+PiAyXTsKICAgICAgfQogICAgICBnZXRfZXhjZXB0aW9uX3B0cigpIHsKICAgICAgICB2YXIgaXNQb2ludGVyID0gX19fY3hhX2lzX3BvaW50ZXJfdHlwZSh0aGlzLmdldF90eXBlKCkpOwogICAgICAgIGlmIChpc1BvaW50ZXIpIHsKICAgICAgICAgIHJldHVybiBIRUFQVTMyW3RoaXMuZXhjUHRyID4+IDJdOwogICAgICAgIH0KICAgICAgICB2YXIgYWRqdXN0ZWQgPSB0aGlzLmdldF9hZGp1c3RlZF9wdHIoKTsKICAgICAgICBpZiAoYWRqdXN0ZWQgIT09IDApIHsKICAgICAgICAgIHJldHVybiBhZGp1c3RlZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuZXhjUHRyOwogICAgICB9CiAgICB9CiAgICB2YXIgZXhjZXB0aW9uTGFzdCA9IDA7CiAgICB2YXIgdW5jYXVnaHRFeGNlcHRpb25Db3VudCA9IDA7CiAgICB2YXIgX19fY3hhX3Rocm93ID0gKHB0ciwgdHlwZSwgZGVzdHJ1Y3RvcikgPT4gewogICAgICB2YXIgaW5mbyA9IG5ldyBFeGNlcHRpb25JbmZvKHB0cik7CiAgICAgIGluZm8uaW5pdCh0eXBlLCBkZXN0cnVjdG9yKTsKICAgICAgZXhjZXB0aW9uTGFzdCA9IHB0cjsKICAgICAgdW5jYXVnaHRFeGNlcHRpb25Db3VudCsrOwogICAgICB0aHJvdyBleGNlcHRpb25MYXN0OwogICAgfTsKICAgIHZhciBQQVRIID0gewogICAgICBpc0FiczogKHBhdGgpID0+IHBhdGguY2hhckF0KDApID09PSAnLycsCiAgICAgIHNwbGl0UGF0aDogKGZpbGVuYW1lKSA9PiB7CiAgICAgICAgdmFyIHNwbGl0UGF0aFJlID0gL14oXC8/fCkoW1xzXFNdKj8pKCg/OlwuezEsMn18W15cL10rP3wpKFwuW14uXC9dKnwpKSg/OltcL10qKSQvOwogICAgICAgIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTsKICAgICAgfSwKICAgICAgbm9ybWFsaXplQXJyYXk6IChwYXJ0cywgYWxsb3dBYm92ZVJvb3QpID0+IHsKICAgICAgICB2YXIgdXAgPSAwOwogICAgICAgIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTsKICAgICAgICAgIGlmIChsYXN0ID09PSAnLicpIHsKICAgICAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpOwogICAgICAgICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7CiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgdXArKzsKICAgICAgICAgIH0gZWxzZSBpZiAodXApIHsKICAgICAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpOwogICAgICAgICAgICB1cC0tOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYWxsb3dBYm92ZVJvb3QpIHsKICAgICAgICAgIGZvciAoOyB1cDsgdXAtLSkgewogICAgICAgICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgIH0sCiAgICAgIG5vcm1hbGl6ZTogKHBhdGgpID0+IHsKICAgICAgICB2YXIgaXNBYnNvbHV0ZSA9IFBBVEguaXNBYnMocGF0aCksCiAgICAgICAgICB0cmFpbGluZ1NsYXNoID0gcGF0aC5zdWJzdHIoLTEpID09PSAnLyc7CiAgICAgICAgcGF0aCA9IFBBVEgubm9ybWFsaXplQXJyYXkoCiAgICAgICAgICBwYXRoLnNwbGl0KCcvJykuZmlsdGVyKChwKSA9PiAhIXApLAogICAgICAgICAgIWlzQWJzb2x1dGUKICAgICAgICApLmpvaW4oJy8nKTsKICAgICAgICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHsKICAgICAgICAgIHBhdGggPSAnLic7CiAgICAgICAgfQogICAgICAgIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHsKICAgICAgICAgIHBhdGggKz0gJy8nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKGlzQWJzb2x1dGUgPyAnLycgOiAnJykgKyBwYXRoOwogICAgICB9LAogICAgICBkaXJuYW1lOiAocGF0aCkgPT4gewogICAgICAgIHZhciByZXN1bHQgPSBQQVRILnNwbGl0UGF0aChwYXRoKSwKICAgICAgICAgIHJvb3QgPSByZXN1bHRbMF0sCiAgICAgICAgICBkaXIgPSByZXN1bHRbMV07CiAgICAgICAgaWYgKCFyb290ICYmICFkaXIpIHsKICAgICAgICAgIHJldHVybiAnLic7CiAgICAgICAgfQogICAgICAgIGlmIChkaXIpIHsKICAgICAgICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcm9vdCArIGRpcjsKICAgICAgfSwKICAgICAgYmFzZW5hbWU6IChwYXRoKSA9PiB7CiAgICAgICAgaWYgKHBhdGggPT09ICcvJykgewogICAgICAgICAgcmV0dXJuICcvJzsKICAgICAgICB9CiAgICAgICAgcGF0aCA9IFBBVEgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1wvJC8sICcnKTsKICAgICAgICB2YXIgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpOwogICAgICAgIGlmIChsYXN0U2xhc2ggPT09IC0xKSB7CiAgICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGxhc3RTbGFzaCArIDEpOwogICAgICB9LAogICAgICBqb2luOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICByZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aHMuam9pbignLycpKTsKICAgICAgfSwKICAgICAgam9pbjI6IChsLCByKSA9PiBQQVRILm5vcm1hbGl6ZShsICsgJy8nICsgcikKICAgIH07CiAgICB2YXIgaW5pdFJhbmRvbUZpbGwgPSAoKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgY3J5cHRvID09ICdvYmplY3QnICYmIHR5cGVvZiBjcnlwdG9bJ2dldFJhbmRvbVZhbHVlcyddID09ICdmdW5jdGlvbicpIHsKICAgICAgICByZXR1cm4gKHZpZXcpID0+IGNyeXB0by5nZXRSYW5kb21WYWx1ZXModmlldyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWJvcnQoJ2luaXRSYW5kb21EZXZpY2UnKTsKICAgICAgfQogICAgfTsKICAgIHZhciByYW5kb21GaWxsID0gKHZpZXcpID0+IChyYW5kb21GaWxsID0gaW5pdFJhbmRvbUZpbGwoKSkodmlldyk7CiAgICB2YXIgUEFUSF9GUyA9IHsKICAgICAgcmVzb2x2ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciByZXNvbHZlZFBhdGggPSAnJywKICAgICAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkgewogICAgICAgICAgdmFyIHBhdGggPSBpID49IDAgPyBhcmd1bWVudHNbaV0gOiBGUy5jd2QoKTsKICAgICAgICAgIGlmICh0eXBlb2YgcGF0aCAhPSAnc3RyaW5nJykgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpOwogICAgICAgICAgfSBlbHNlIGlmICghcGF0aCkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICB9CiAgICAgICAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoOwogICAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IFBBVEguaXNBYnMocGF0aCk7CiAgICAgICAgfQogICAgICAgIHJlc29sdmVkUGF0aCA9IFBBVEgubm9ybWFsaXplQXJyYXkoCiAgICAgICAgICByZXNvbHZlZFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoKHApID0+ICEhcCksCiAgICAgICAgICAhcmVzb2x2ZWRBYnNvbHV0ZQogICAgICAgICkuam9pbignLycpOwogICAgICAgIHJldHVybiAocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCB8fCAnLic7CiAgICAgIH0sCiAgICAgIHJlbGF0aXZlOiAoZnJvbSwgdG8pID0+IHsKICAgICAgICBmcm9tID0gUEFUSF9GUy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTsKICAgICAgICB0byA9IFBBVEhfRlMucmVzb2x2ZSh0bykuc3Vic3RyKDEpOwogICAgICAgIGZ1bmN0aW9uIHRyaW0oYXJyKSB7CiAgICAgICAgICB2YXIgc3RhcnQgPSAwOwogICAgICAgICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykgewogICAgICAgICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxOwogICAgICAgICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkgewogICAgICAgICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGFydCA+IGVuZCkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpOwogICAgICAgIH0KICAgICAgICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpOwogICAgICAgIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTsKICAgICAgICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpOwogICAgICAgIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkgewogICAgICAgICAgICBzYW1lUGFydHNMZW5ndGggPSBpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIG91dHB1dFBhcnRzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTsKICAgICAgICB9CiAgICAgICAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTsKICAgICAgICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignLycpOwogICAgICB9CiAgICB9OwogICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9ICd1bmRlZmluZWQnID8gbmV3IFRleHREZWNvZGVyKCd1dGY4JykgOiB1bmRlZmluZWQ7CiAgICB2YXIgVVRGOEFycmF5VG9TdHJpbmcgPSAoaGVhcE9yQXJyYXksIGlkeCwgbWF4Qnl0ZXNUb1JlYWQpID0+IHsKICAgICAgdmFyIGVuZElkeCA9IGlkeCArIG1heEJ5dGVzVG9SZWFkOwogICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICB3aGlsZSAoaGVhcE9yQXJyYXlbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKSB7CiAgICAgICAgKytlbmRQdHI7CiAgICAgIH0KICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXBPckFycmF5LmJ1ZmZlciAmJiBVVEY4RGVjb2RlcikgewogICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcE9yQXJyYXkuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgfQogICAgICB2YXIgc3RyID0gJyc7CiAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICB2YXIgdTAgPSBoZWFwT3JBcnJheVtpZHgrK107CiAgICAgICAgaWYgKCEodTAgJiAxMjgpKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdmFyIHUxID0gaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKHUwICYgMzEpIDw8IDYpIHwgdTEpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHZhciB1MiA9IGhlYXBPckFycmF5W2lkeCsrXSAmIDYzOwogICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1MCA9ICgodTAgJiA3KSA8PCAxOCkgfCAodTEgPDwgMTIpIHwgKHUyIDw8IDYpIHwgKGhlYXBPckFycmF5W2lkeCsrXSAmIDYzKTsKICAgICAgICB9CiAgICAgICAgaWYgKHUwIDwgNjU1MzYpIHsKICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdHI7CiAgICB9OwogICAgdmFyIEZTX3N0ZGluX2dldENoYXJfYnVmZmVyID0gW107CiAgICB2YXIgbGVuZ3RoQnl0ZXNVVEY4ID0gKHN0cikgPT4gewogICAgICB2YXIgbGVuID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmIChjIDw9IDEyNykgewogICAgICAgICAgbGVuKys7CiAgICAgICAgfSBlbHNlIGlmIChjIDw9IDIwNDcpIHsKICAgICAgICAgIGxlbiArPSAyOwogICAgICAgIH0gZWxzZSBpZiAoYyA+PSA1NTI5NiAmJiBjIDw9IDU3MzQzKSB7CiAgICAgICAgICBsZW4gKz0gNDsKICAgICAgICAgICsraTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGVuICs9IDM7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsZW47CiAgICB9OwogICAgdmFyIHN0cmluZ1RvVVRGOEFycmF5ID0gKHN0ciwgaGVhcCwgb3V0SWR4LCBtYXhCeXRlc1RvV3JpdGUpID0+IHsKICAgICAgaWYgKCEobWF4Qnl0ZXNUb1dyaXRlID4gMCkpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICB2YXIgc3RhcnRJZHggPSBvdXRJZHg7CiAgICAgIHZhciBlbmRJZHggPSBvdXRJZHggKyBtYXhCeXRlc1RvV3JpdGUgLSAxOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciB1ID0gc3RyLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgaWYgKHUgPj0gNTUyOTYgJiYgdSA8PSA1NzM0MykgewogICAgICAgICAgdmFyIHUxID0gc3RyLmNoYXJDb2RlQXQoKytpKTsKICAgICAgICAgIHUgPSAoNjU1MzYgKyAoKHUgJiAxMDIzKSA8PCAxMCkpIHwgKHUxICYgMTAyMyk7CiAgICAgICAgfQogICAgICAgIGlmICh1IDw9IDEyNykgewogICAgICAgICAgaWYgKG91dElkeCA+PSBlbmRJZHgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IHU7CiAgICAgICAgfSBlbHNlIGlmICh1IDw9IDIwNDcpIHsKICAgICAgICAgIGlmIChvdXRJZHggKyAxID49IGVuZElkeCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gMTkyIHwgKHUgPj4gNik7CiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDEyOCB8ICh1ICYgNjMpOwogICAgICAgIH0gZWxzZSBpZiAodSA8PSA2NTUzNSkgewogICAgICAgICAgaWYgKG91dElkeCArIDIgPj0gZW5kSWR4KSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAyMjQgfCAodSA+PiAxMik7CiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDEyOCB8ICgodSA+PiA2KSAmIDYzKTsKICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gMTI4IHwgKHUgJiA2Myk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChvdXRJZHggKyAzID49IGVuZElkeCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gMjQwIHwgKHUgPj4gMTgpOwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCAoKHUgPj4gMTIpICYgNjMpOwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCAoKHUgPj4gNikgJiA2Myk7CiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDEyOCB8ICh1ICYgNjMpOwogICAgICAgIH0KICAgICAgfQogICAgICBoZWFwW291dElkeF0gPSAwOwogICAgICByZXR1cm4gb3V0SWR4IC0gc3RhcnRJZHg7CiAgICB9OwogICAgZnVuY3Rpb24gaW50QXJyYXlGcm9tU3RyaW5nKHN0cmluZ3ksIGRvbnRBZGROdWxsLCBsZW5ndGgpIHsKICAgICAgdmFyIGxlbiA9IGxlbmd0aCA+IDAgPyBsZW5ndGggOiBsZW5ndGhCeXRlc1VURjgoc3RyaW5neSkgKyAxOwogICAgICB2YXIgdThhcnJheSA9IG5ldyBBcnJheShsZW4pOwogICAgICB2YXIgbnVtQnl0ZXNXcml0dGVuID0gc3RyaW5nVG9VVEY4QXJyYXkoc3RyaW5neSwgdThhcnJheSwgMCwgdThhcnJheS5sZW5ndGgpOwogICAgICBpZiAoZG9udEFkZE51bGwpIHsKICAgICAgICB1OGFycmF5Lmxlbmd0aCA9IG51bUJ5dGVzV3JpdHRlbjsKICAgICAgfQogICAgICByZXR1cm4gdThhcnJheTsKICAgIH0KICAgIHZhciBGU19zdGRpbl9nZXRDaGFyID0gKCkgPT4gewogICAgICBpZiAoIUZTX3N0ZGluX2dldENoYXJfYnVmZmVyLmxlbmd0aCkgewogICAgICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cucHJvbXB0ID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJlc3VsdCA9IHdpbmRvdy5wcm9tcHQoJ0lucHV0OiAnKTsKICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmVzdWx0ICs9ICdcbic7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVhZGxpbmUgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgcmVzdWx0ID0gcmVhZGxpbmUoKTsKICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmVzdWx0ICs9ICdcbic7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgRlNfc3RkaW5fZ2V0Q2hhcl9idWZmZXIgPSBpbnRBcnJheUZyb21TdHJpbmcocmVzdWx0LCB0cnVlKTsKICAgICAgfQogICAgICByZXR1cm4gRlNfc3RkaW5fZ2V0Q2hhcl9idWZmZXIuc2hpZnQoKTsKICAgIH07CiAgICB2YXIgVFRZID0gewogICAgICB0dHlzOiBbXSwKICAgICAgaW5pdCgpIHt9LAogICAgICBzaHV0ZG93bigpIHt9LAogICAgICByZWdpc3RlcihkZXYsIG9wcykgewogICAgICAgIFRUWS50dHlzW2Rldl0gPSB7IGlucHV0OiBbXSwgb3V0cHV0OiBbXSwgb3BzOiBvcHMgfTsKICAgICAgICBGUy5yZWdpc3RlckRldmljZShkZXYsIFRUWS5zdHJlYW1fb3BzKTsKICAgICAgfSwKICAgICAgc3RyZWFtX29wczogewogICAgICAgIG9wZW4oc3RyZWFtKSB7CiAgICAgICAgICB2YXIgdHR5ID0gVFRZLnR0eXNbc3RyZWFtLm5vZGUucmRldl07CiAgICAgICAgICBpZiAoIXR0eSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJlYW0udHR5ID0gdHR5OwogICAgICAgICAgc3RyZWFtLnNlZWthYmxlID0gZmFsc2U7CiAgICAgICAgfSwKICAgICAgICBjbG9zZShzdHJlYW0pIHsKICAgICAgICAgIHN0cmVhbS50dHkub3BzLmZzeW5jKHN0cmVhbS50dHkpOwogICAgICAgIH0sCiAgICAgICAgZnN5bmMoc3RyZWFtKSB7CiAgICAgICAgICBzdHJlYW0udHR5Lm9wcy5mc3luYyhzdHJlYW0udHR5KTsKICAgICAgICB9LAogICAgICAgIHJlYWQoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3MpIHsKICAgICAgICAgIGlmICghc3RyZWFtLnR0eSB8fCAhc3RyZWFtLnR0eS5vcHMuZ2V0X2NoYXIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjApOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGJ5dGVzUmVhZCA9IDA7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgcmVzdWx0ID0gc3RyZWFtLnR0eS5vcHMuZ2V0X2NoYXIoc3RyZWFtLnR0eSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkICYmIGJ5dGVzUmVhZCA9PT0gMCkgewogICAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBieXRlc1JlYWQrKzsKICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIGldID0gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJ5dGVzUmVhZCkgewogICAgICAgICAgICBzdHJlYW0ubm9kZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsKICAgICAgICB9LAogICAgICAgIHdyaXRlKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zKSB7CiAgICAgICAgICBpZiAoIXN0cmVhbS50dHkgfHwgIXN0cmVhbS50dHkub3BzLnB1dF9jaGFyKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYwKTsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcihzdHJlYW0udHR5LCBidWZmZXJbb2Zmc2V0ICsgaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI5KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChsZW5ndGgpIHsKICAgICAgICAgICAgc3RyZWFtLm5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGVmYXVsdF90dHlfb3BzOiB7CiAgICAgICAgZ2V0X2NoYXIodHR5KSB7CiAgICAgICAgICByZXR1cm4gRlNfc3RkaW5fZ2V0Q2hhcigpOwogICAgICAgIH0sCiAgICAgICAgcHV0X2NoYXIodHR5LCB2YWwpIHsKICAgICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSAxMCkgewogICAgICAgICAgICBvdXQoVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwgMCkpOwogICAgICAgICAgICB0dHkub3V0cHV0ID0gW107CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodmFsICE9IDApIHsKICAgICAgICAgICAgICB0dHkub3V0cHV0LnB1c2godmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZnN5bmModHR5KSB7CiAgICAgICAgICBpZiAodHR5Lm91dHB1dCAmJiB0dHkub3V0cHV0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgb3V0KFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsIDApKTsKICAgICAgICAgICAgdHR5Lm91dHB1dCA9IFtdOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgaW9jdGxfdGNnZXRzKHR0eSkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgY19pZmxhZzogMjU4NTYsCiAgICAgICAgICAgIGNfb2ZsYWc6IDUsCiAgICAgICAgICAgIGNfY2ZsYWc6IDE5MSwKICAgICAgICAgICAgY19sZmxhZzogMzUzODcsCiAgICAgICAgICAgIGNfY2M6IFsKICAgICAgICAgICAgICAzLCAyOCwgMTI3LCAyMSwgNCwgMCwgMSwgMCwgMTcsIDE5LCAyNiwgMCwgMTgsIDE1LCAyMywgMjIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKICAgICAgICAgICAgXQogICAgICAgICAgfTsKICAgICAgICB9LAogICAgICAgIGlvY3RsX3Rjc2V0cyh0dHksIG9wdGlvbmFsX2FjdGlvbnMsIGRhdGEpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0sCiAgICAgICAgaW9jdGxfdGlvY2d3aW5zeih0dHkpIHsKICAgICAgICAgIHJldHVybiBbMjQsIDgwXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlZmF1bHRfdHR5MV9vcHM6IHsKICAgICAgICBwdXRfY2hhcih0dHksIHZhbCkgewogICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IDEwKSB7CiAgICAgICAgICAgIGVycihVVEY4QXJyYXlUb1N0cmluZyh0dHkub3V0cHV0LCAwKSk7CiAgICAgICAgICAgIHR0eS5vdXRwdXQgPSBbXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh2YWwgIT0gMCkgewogICAgICAgICAgICAgIHR0eS5vdXRwdXQucHVzaCh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBmc3luYyh0dHkpIHsKICAgICAgICAgIGlmICh0dHkub3V0cHV0ICYmIHR0eS5vdXRwdXQubGVuZ3RoID4gMCkgewogICAgICAgICAgICBlcnIoVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwgMCkpOwogICAgICAgICAgICB0dHkub3V0cHV0ID0gW107CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgdmFyIHplcm9NZW1vcnkgPSAoYWRkcmVzcywgc2l6ZSkgPT4gewogICAgICBIRUFQVTguZmlsbCgwLCBhZGRyZXNzLCBhZGRyZXNzICsgc2l6ZSk7CiAgICAgIHJldHVybiBhZGRyZXNzOwogICAgfTsKICAgIHZhciBhbGlnbk1lbW9yeSA9IChzaXplLCBhbGlnbm1lbnQpID0+IE1hdGguY2VpbChzaXplIC8gYWxpZ25tZW50KSAqIGFsaWdubWVudDsKICAgIHZhciBtbWFwQWxsb2MgPSAoc2l6ZSkgPT4gewogICAgICBzaXplID0gYWxpZ25NZW1vcnkoc2l6ZSwgNjU1MzYpOwogICAgICB2YXIgcHRyID0gX2Vtc2NyaXB0ZW5fYnVpbHRpbl9tZW1hbGlnbig2NTUzNiwgc2l6ZSk7CiAgICAgIGlmICghcHRyKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHplcm9NZW1vcnkocHRyLCBzaXplKTsKICAgIH07CiAgICB2YXIgTUVNRlMgPSB7CiAgICAgIG9wc190YWJsZTogbnVsbCwKICAgICAgbW91bnQobW91bnQpIHsKICAgICAgICByZXR1cm4gTUVNRlMuY3JlYXRlTm9kZShudWxsLCAnLycsIDE2Mzg0IHwgNTExLCAwKTsKICAgICAgfSwKICAgICAgY3JlYXRlTm9kZShwYXJlbnQsIG5hbWUsIG1vZGUsIGRldikgewogICAgICAgIGlmIChGUy5pc0Jsa2Rldihtb2RlKSB8fCBGUy5pc0ZJRk8obW9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKTsKICAgICAgICB9CiAgICAgICAgTUVNRlMub3BzX3RhYmxlIHx8PSB7CiAgICAgICAgICBkaXI6IHsKICAgICAgICAgICAgbm9kZTogewogICAgICAgICAgICAgIGdldGF0dHI6IE1FTUZTLm5vZGVfb3BzLmdldGF0dHIsCiAgICAgICAgICAgICAgc2V0YXR0cjogTUVNRlMubm9kZV9vcHMuc2V0YXR0ciwKICAgICAgICAgICAgICBsb29rdXA6IE1FTUZTLm5vZGVfb3BzLmxvb2t1cCwKICAgICAgICAgICAgICBta25vZDogTUVNRlMubm9kZV9vcHMubWtub2QsCiAgICAgICAgICAgICAgcmVuYW1lOiBNRU1GUy5ub2RlX29wcy5yZW5hbWUsCiAgICAgICAgICAgICAgdW5saW5rOiBNRU1GUy5ub2RlX29wcy51bmxpbmssCiAgICAgICAgICAgICAgcm1kaXI6IE1FTUZTLm5vZGVfb3BzLnJtZGlyLAogICAgICAgICAgICAgIHJlYWRkaXI6IE1FTUZTLm5vZGVfb3BzLnJlYWRkaXIsCiAgICAgICAgICAgICAgc3ltbGluazogTUVNRlMubm9kZV9vcHMuc3ltbGluawogICAgICAgICAgICB9LAogICAgICAgICAgICBzdHJlYW06IHsgbGxzZWVrOiBNRU1GUy5zdHJlYW1fb3BzLmxsc2VlayB9CiAgICAgICAgICB9LAogICAgICAgICAgZmlsZTogewogICAgICAgICAgICBub2RlOiB7IGdldGF0dHI6IE1FTUZTLm5vZGVfb3BzLmdldGF0dHIsIHNldGF0dHI6IE1FTUZTLm5vZGVfb3BzLnNldGF0dHIgfSwKICAgICAgICAgICAgc3RyZWFtOiB7CiAgICAgICAgICAgICAgbGxzZWVrOiBNRU1GUy5zdHJlYW1fb3BzLmxsc2VlaywKICAgICAgICAgICAgICByZWFkOiBNRU1GUy5zdHJlYW1fb3BzLnJlYWQsCiAgICAgICAgICAgICAgd3JpdGU6IE1FTUZTLnN0cmVhbV9vcHMud3JpdGUsCiAgICAgICAgICAgICAgYWxsb2NhdGU6IE1FTUZTLnN0cmVhbV9vcHMuYWxsb2NhdGUsCiAgICAgICAgICAgICAgbW1hcDogTUVNRlMuc3RyZWFtX29wcy5tbWFwLAogICAgICAgICAgICAgIG1zeW5jOiBNRU1GUy5zdHJlYW1fb3BzLm1zeW5jCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBsaW5rOiB7CiAgICAgICAgICAgIG5vZGU6IHsKICAgICAgICAgICAgICBnZXRhdHRyOiBNRU1GUy5ub2RlX29wcy5nZXRhdHRyLAogICAgICAgICAgICAgIHNldGF0dHI6IE1FTUZTLm5vZGVfb3BzLnNldGF0dHIsCiAgICAgICAgICAgICAgcmVhZGxpbms6IE1FTUZTLm5vZGVfb3BzLnJlYWRsaW5rCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0cmVhbToge30KICAgICAgICAgIH0sCiAgICAgICAgICBjaHJkZXY6IHsKICAgICAgICAgICAgbm9kZTogeyBnZXRhdHRyOiBNRU1GUy5ub2RlX29wcy5nZXRhdHRyLCBzZXRhdHRyOiBNRU1GUy5ub2RlX29wcy5zZXRhdHRyIH0sCiAgICAgICAgICAgIHN0cmVhbTogRlMuY2hyZGV2X3N0cmVhbV9vcHMKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciBub2RlID0gRlMuY3JlYXRlTm9kZShwYXJlbnQsIG5hbWUsIG1vZGUsIGRldik7CiAgICAgICAgaWYgKEZTLmlzRGlyKG5vZGUubW9kZSkpIHsKICAgICAgICAgIG5vZGUubm9kZV9vcHMgPSBNRU1GUy5vcHNfdGFibGUuZGlyLm5vZGU7CiAgICAgICAgICBub2RlLnN0cmVhbV9vcHMgPSBNRU1GUy5vcHNfdGFibGUuZGlyLnN0cmVhbTsKICAgICAgICAgIG5vZGUuY29udGVudHMgPSB7fTsKICAgICAgICB9IGVsc2UgaWYgKEZTLmlzRmlsZShub2RlLm1vZGUpKSB7CiAgICAgICAgICBub2RlLm5vZGVfb3BzID0gTUVNRlMub3BzX3RhYmxlLmZpbGUubm9kZTsKICAgICAgICAgIG5vZGUuc3RyZWFtX29wcyA9IE1FTUZTLm9wc190YWJsZS5maWxlLnN0cmVhbTsKICAgICAgICAgIG5vZGUudXNlZEJ5dGVzID0gMDsKICAgICAgICAgIG5vZGUuY29udGVudHMgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAoRlMuaXNMaW5rKG5vZGUubW9kZSkpIHsKICAgICAgICAgIG5vZGUubm9kZV9vcHMgPSBNRU1GUy5vcHNfdGFibGUubGluay5ub2RlOwogICAgICAgICAgbm9kZS5zdHJlYW1fb3BzID0gTUVNRlMub3BzX3RhYmxlLmxpbmsuc3RyZWFtOwogICAgICAgIH0gZWxzZSBpZiAoRlMuaXNDaHJkZXYobm9kZS5tb2RlKSkgewogICAgICAgICAgbm9kZS5ub2RlX29wcyA9IE1FTUZTLm9wc190YWJsZS5jaHJkZXYubm9kZTsKICAgICAgICAgIG5vZGUuc3RyZWFtX29wcyA9IE1FTUZTLm9wc190YWJsZS5jaHJkZXYuc3RyZWFtOwogICAgICAgIH0KICAgICAgICBub2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgcGFyZW50LmNvbnRlbnRzW25hbWVdID0gbm9kZTsKICAgICAgICAgIHBhcmVudC50aW1lc3RhbXAgPSBub2RlLnRpbWVzdGFtcDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0sCiAgICAgIGdldEZpbGVEYXRhQXNUeXBlZEFycmF5KG5vZGUpIHsKICAgICAgICBpZiAoIW5vZGUuY29udGVudHMpIHsKICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUuY29udGVudHMuc3ViYXJyYXkpIHsKICAgICAgICAgIHJldHVybiBub2RlLmNvbnRlbnRzLnN1YmFycmF5KDAsIG5vZGUudXNlZEJ5dGVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5vZGUuY29udGVudHMpOwogICAgICB9LAogICAgICBleHBhbmRGaWxlU3RvcmFnZShub2RlLCBuZXdDYXBhY2l0eSkgewogICAgICAgIHZhciBwcmV2Q2FwYWNpdHkgPSBub2RlLmNvbnRlbnRzID8gbm9kZS5jb250ZW50cy5sZW5ndGggOiAwOwogICAgICAgIGlmIChwcmV2Q2FwYWNpdHkgPj0gbmV3Q2FwYWNpdHkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIENBUEFDSVRZX0RPVUJMSU5HX01BWCA9IDEwMjQgKiAxMDI0OwogICAgICAgIG5ld0NhcGFjaXR5ID0gTWF0aC5tYXgobmV3Q2FwYWNpdHksIChwcmV2Q2FwYWNpdHkgKiAocHJldkNhcGFjaXR5IDwgQ0FQQUNJVFlfRE9VQkxJTkdfTUFYID8gMiA6IDEuMTI1KSkgPj4+IDApOwogICAgICAgIGlmIChwcmV2Q2FwYWNpdHkgIT0gMCkgewogICAgICAgICAgbmV3Q2FwYWNpdHkgPSBNYXRoLm1heChuZXdDYXBhY2l0eSwgMjU2KTsKICAgICAgICB9CiAgICAgICAgdmFyIG9sZENvbnRlbnRzID0gbm9kZS5jb250ZW50czsKICAgICAgICBub2RlLmNvbnRlbnRzID0gbmV3IFVpbnQ4QXJyYXkobmV3Q2FwYWNpdHkpOwogICAgICAgIGlmIChub2RlLnVzZWRCeXRlcyA+IDApIHsKICAgICAgICAgIG5vZGUuY29udGVudHMuc2V0KG9sZENvbnRlbnRzLnN1YmFycmF5KDAsIG5vZGUudXNlZEJ5dGVzKSwgMCk7CiAgICAgICAgfQogICAgICB9LAogICAgICByZXNpemVGaWxlU3RvcmFnZShub2RlLCBuZXdTaXplKSB7CiAgICAgICAgaWYgKG5vZGUudXNlZEJ5dGVzID09IG5ld1NpemUpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKG5ld1NpemUgPT0gMCkgewogICAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7CiAgICAgICAgICBub2RlLnVzZWRCeXRlcyA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBvbGRDb250ZW50cyA9IG5vZGUuY29udGVudHM7CiAgICAgICAgICBub2RlLmNvbnRlbnRzID0gbmV3IFVpbnQ4QXJyYXkobmV3U2l6ZSk7CiAgICAgICAgICBpZiAob2xkQ29udGVudHMpIHsKICAgICAgICAgICAgbm9kZS5jb250ZW50cy5zZXQob2xkQ29udGVudHMuc3ViYXJyYXkoMCwgTWF0aC5taW4obmV3U2l6ZSwgbm9kZS51c2VkQnl0ZXMpKSk7CiAgICAgICAgICB9CiAgICAgICAgICBub2RlLnVzZWRCeXRlcyA9IG5ld1NpemU7CiAgICAgICAgfQogICAgICB9LAogICAgICBub2RlX29wczogewogICAgICAgIGdldGF0dHIobm9kZSkgewogICAgICAgICAgdmFyIGF0dHIgPSB7fTsKICAgICAgICAgIGF0dHIuZGV2ID0gRlMuaXNDaHJkZXYobm9kZS5tb2RlKSA/IG5vZGUuaWQgOiAxOwogICAgICAgICAgYXR0ci5pbm8gPSBub2RlLmlkOwogICAgICAgICAgYXR0ci5tb2RlID0gbm9kZS5tb2RlOwogICAgICAgICAgYXR0ci5ubGluayA9IDE7CiAgICAgICAgICBhdHRyLnVpZCA9IDA7CiAgICAgICAgICBhdHRyLmdpZCA9IDA7CiAgICAgICAgICBhdHRyLnJkZXYgPSBub2RlLnJkZXY7CiAgICAgICAgICBpZiAoRlMuaXNEaXIobm9kZS5tb2RlKSkgewogICAgICAgICAgICBhdHRyLnNpemUgPSA0MDk2OwogICAgICAgICAgfSBlbHNlIGlmIChGUy5pc0ZpbGUobm9kZS5tb2RlKSkgewogICAgICAgICAgICBhdHRyLnNpemUgPSBub2RlLnVzZWRCeXRlczsKICAgICAgICAgIH0gZWxzZSBpZiAoRlMuaXNMaW5rKG5vZGUubW9kZSkpIHsKICAgICAgICAgICAgYXR0ci5zaXplID0gbm9kZS5saW5rLmxlbmd0aDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF0dHIuc2l6ZSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBhdHRyLmF0aW1lID0gbmV3IERhdGUobm9kZS50aW1lc3RhbXApOwogICAgICAgICAgYXR0ci5tdGltZSA9IG5ldyBEYXRlKG5vZGUudGltZXN0YW1wKTsKICAgICAgICAgIGF0dHIuY3RpbWUgPSBuZXcgRGF0ZShub2RlLnRpbWVzdGFtcCk7CiAgICAgICAgICBhdHRyLmJsa3NpemUgPSA0MDk2OwogICAgICAgICAgYXR0ci5ibG9ja3MgPSBNYXRoLmNlaWwoYXR0ci5zaXplIC8gYXR0ci5ibGtzaXplKTsKICAgICAgICAgIHJldHVybiBhdHRyOwogICAgICAgIH0sCiAgICAgICAgc2V0YXR0cihub2RlLCBhdHRyKSB7CiAgICAgICAgICBpZiAoYXR0ci5tb2RlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbm9kZS5tb2RlID0gYXR0ci5tb2RlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGF0dHIudGltZXN0YW1wICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbm9kZS50aW1lc3RhbXAgPSBhdHRyLnRpbWVzdGFtcDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhdHRyLnNpemUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBNRU1GUy5yZXNpemVGaWxlU3RvcmFnZShub2RlLCBhdHRyLnNpemUpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgbG9va3VwKHBhcmVudCwgbmFtZSkgewogICAgICAgICAgdGhyb3cgRlMuZ2VuZXJpY0Vycm9yc1s0NF07CiAgICAgICAgfSwKICAgICAgICBta25vZChwYXJlbnQsIG5hbWUsIG1vZGUsIGRldikgewogICAgICAgICAgcmV0dXJuIE1FTUZTLmNyZWF0ZU5vZGUocGFyZW50LCBuYW1lLCBtb2RlLCBkZXYpOwogICAgICAgIH0sCiAgICAgICAgcmVuYW1lKG9sZF9ub2RlLCBuZXdfZGlyLCBuZXdfbmFtZSkgewogICAgICAgICAgaWYgKEZTLmlzRGlyKG9sZF9ub2RlLm1vZGUpKSB7CiAgICAgICAgICAgIHZhciBuZXdfbm9kZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBuZXdfbm9kZSA9IEZTLmxvb2t1cE5vZGUobmV3X2RpciwgbmV3X25hbWUpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICBpZiAobmV3X25vZGUpIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIG5ld19ub2RlLmNvbnRlbnRzKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBkZWxldGUgb2xkX25vZGUucGFyZW50LmNvbnRlbnRzW29sZF9ub2RlLm5hbWVdOwogICAgICAgICAgb2xkX25vZGUucGFyZW50LnRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICAgICAgICBvbGRfbm9kZS5uYW1lID0gbmV3X25hbWU7CiAgICAgICAgICBuZXdfZGlyLmNvbnRlbnRzW25ld19uYW1lXSA9IG9sZF9ub2RlOwogICAgICAgICAgbmV3X2Rpci50aW1lc3RhbXAgPSBvbGRfbm9kZS5wYXJlbnQudGltZXN0YW1wOwogICAgICAgICAgb2xkX25vZGUucGFyZW50ID0gbmV3X2RpcjsKICAgICAgICB9LAogICAgICAgIHVubGluayhwYXJlbnQsIG5hbWUpIHsKICAgICAgICAgIGRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV07CiAgICAgICAgICBwYXJlbnQudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgICB9LAogICAgICAgIHJtZGlyKHBhcmVudCwgbmFtZSkgewogICAgICAgICAgdmFyIG5vZGUgPSBGUy5sb29rdXBOb2RlKHBhcmVudCwgbmFtZSk7CiAgICAgICAgICBmb3IgKHZhciBpIGluIG5vZGUuY29udGVudHMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTUpOwogICAgICAgICAgfQogICAgICAgICAgZGVsZXRlIHBhcmVudC5jb250ZW50c1tuYW1lXTsKICAgICAgICAgIHBhcmVudC50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgICAgIH0sCiAgICAgICAgcmVhZGRpcihub2RlKSB7CiAgICAgICAgICB2YXIgZW50cmllcyA9IFsnLicsICcuLiddOwogICAgICAgICAgZm9yICh2YXIga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUuY29udGVudHMpKSB7CiAgICAgICAgICAgIGVudHJpZXMucHVzaChrZXkpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGVudHJpZXM7CiAgICAgICAgfSwKICAgICAgICBzeW1saW5rKHBhcmVudCwgbmV3bmFtZSwgb2xkcGF0aCkgewogICAgICAgICAgdmFyIG5vZGUgPSBNRU1GUy5jcmVhdGVOb2RlKHBhcmVudCwgbmV3bmFtZSwgNTExIHwgNDA5NjAsIDApOwogICAgICAgICAgbm9kZS5saW5rID0gb2xkcGF0aDsKICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgIH0sCiAgICAgICAgcmVhZGxpbmsobm9kZSkgewogICAgICAgICAgaWYgKCFGUy5pc0xpbmsobm9kZS5tb2RlKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZS5saW5rOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc3RyZWFtX29wczogewogICAgICAgIHJlYWQoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbikgewogICAgICAgICAgdmFyIGNvbnRlbnRzID0gc3RyZWFtLm5vZGUuY29udGVudHM7CiAgICAgICAgICBpZiAocG9zaXRpb24gPj0gc3RyZWFtLm5vZGUudXNlZEJ5dGVzKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHNpemUgPSBNYXRoLm1pbihzdHJlYW0ubm9kZS51c2VkQnl0ZXMgLSBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgICAgIGlmIChzaXplID4gOCAmJiBjb250ZW50cy5zdWJhcnJheSkgewogICAgICAgICAgICBidWZmZXIuc2V0KGNvbnRlbnRzLnN1YmFycmF5KHBvc2l0aW9uLCBwb3NpdGlvbiArIHNpemUpLCBvZmZzZXQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBjb250ZW50c1twb3NpdGlvbiArIGldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgICB9LAogICAgICAgIHdyaXRlKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbk93bikgewogICAgICAgICAgaWYgKGJ1ZmZlci5idWZmZXIgPT09IEhFQVA4LmJ1ZmZlcikgewogICAgICAgICAgICBjYW5Pd24gPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghbGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgdmFyIG5vZGUgPSBzdHJlYW0ubm9kZTsKICAgICAgICAgIG5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgICAgIGlmIChidWZmZXIuc3ViYXJyYXkgJiYgKCFub2RlLmNvbnRlbnRzIHx8IG5vZGUuY29udGVudHMuc3ViYXJyYXkpKSB7CiAgICAgICAgICAgIGlmIChjYW5Pd24pIHsKICAgICAgICAgICAgICBub2RlLmNvbnRlbnRzID0gYnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKICAgICAgICAgICAgICBub2RlLnVzZWRCeXRlcyA9IGxlbmd0aDsKICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUudXNlZEJ5dGVzID09PSAwICYmIHBvc2l0aW9uID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5jb250ZW50cyA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgICAgICAgbm9kZS51c2VkQnl0ZXMgPSBsZW5ndGg7CiAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiArIGxlbmd0aCA8PSBub2RlLnVzZWRCeXRlcykgewogICAgICAgICAgICAgIG5vZGUuY29udGVudHMuc2V0KGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCksIHBvc2l0aW9uKTsKICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBNRU1GUy5leHBhbmRGaWxlU3RvcmFnZShub2RlLCBwb3NpdGlvbiArIGxlbmd0aCk7CiAgICAgICAgICBpZiAobm9kZS5jb250ZW50cy5zdWJhcnJheSAmJiBidWZmZXIuc3ViYXJyYXkpIHsKICAgICAgICAgICAgbm9kZS5jb250ZW50cy5zZXQoYnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSwgcG9zaXRpb24pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIG5vZGUuY29udGVudHNbcG9zaXRpb24gKyBpXSA9IGJ1ZmZlcltvZmZzZXQgKyBpXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbm9kZS51c2VkQnl0ZXMgPSBNYXRoLm1heChub2RlLnVzZWRCeXRlcywgcG9zaXRpb24gKyBsZW5ndGgpOwogICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICB9LAogICAgICAgIGxsc2VlayhzdHJlYW0sIG9mZnNldCwgd2hlbmNlKSB7CiAgICAgICAgICB2YXIgcG9zaXRpb24gPSBvZmZzZXQ7CiAgICAgICAgICBpZiAod2hlbmNlID09PSAxKSB7CiAgICAgICAgICAgIHBvc2l0aW9uICs9IHN0cmVhbS5wb3NpdGlvbjsKICAgICAgICAgIH0gZWxzZSBpZiAod2hlbmNlID09PSAyKSB7CiAgICAgICAgICAgIGlmIChGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpIHsKICAgICAgICAgICAgICBwb3NpdGlvbiArPSBzdHJlYW0ubm9kZS51c2VkQnl0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgICAgIH0sCiAgICAgICAgYWxsb2NhdGUoc3RyZWFtLCBvZmZzZXQsIGxlbmd0aCkgewogICAgICAgICAgTUVNRlMuZXhwYW5kRmlsZVN0b3JhZ2Uoc3RyZWFtLm5vZGUsIG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgICBzdHJlYW0ubm9kZS51c2VkQnl0ZXMgPSBNYXRoLm1heChzdHJlYW0ubm9kZS51c2VkQnl0ZXMsIG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgfSwKICAgICAgICBtbWFwKHN0cmVhbSwgbGVuZ3RoLCBwb3NpdGlvbiwgcHJvdCwgZmxhZ3MpIHsKICAgICAgICAgIGlmICghRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQzKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBwdHI7CiAgICAgICAgICB2YXIgYWxsb2NhdGVkOwogICAgICAgICAgdmFyIGNvbnRlbnRzID0gc3RyZWFtLm5vZGUuY29udGVudHM7CiAgICAgICAgICBpZiAoIShmbGFncyAmIDIpICYmIGNvbnRlbnRzLmJ1ZmZlciA9PT0gSEVBUDguYnVmZmVyKSB7CiAgICAgICAgICAgIGFsbG9jYXRlZCA9IGZhbHNlOwogICAgICAgICAgICBwdHIgPSBjb250ZW50cy5ieXRlT2Zmc2V0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gMCB8fCBwb3NpdGlvbiArIGxlbmd0aCA8IGNvbnRlbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgIGlmIChjb250ZW50cy5zdWJhcnJheSkgewogICAgICAgICAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5zdWJhcnJheShwb3NpdGlvbiwgcG9zaXRpb24gKyBsZW5ndGgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb250ZW50cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGNvbnRlbnRzLCBwb3NpdGlvbiwgcG9zaXRpb24gKyBsZW5ndGgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhbGxvY2F0ZWQgPSB0cnVlOwogICAgICAgICAgICBwdHIgPSBtbWFwQWxsb2MobGVuZ3RoKTsKICAgICAgICAgICAgaWYgKCFwdHIpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0OCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgSEVBUDguc2V0KGNvbnRlbnRzLCBwdHIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHsgcHRyOiBwdHIsIGFsbG9jYXRlZDogYWxsb2NhdGVkIH07CiAgICAgICAgfSwKICAgICAgICBtc3luYyhzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIG1tYXBGbGFncykgewogICAgICAgICAgTUVNRlMuc3RyZWFtX29wcy53cml0ZShzdHJlYW0sIGJ1ZmZlciwgMCwgbGVuZ3RoLCBvZmZzZXQsIGZhbHNlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIHZhciBhc3luY0xvYWQgPSAodXJsLCBvbmxvYWQsIG9uZXJyb3IsIG5vUnVuRGVwKSA9PiB7CiAgICAgIHZhciBkZXAgPSAhbm9SdW5EZXAgPyBnZXRVbmlxdWVSdW5EZXBlbmRlbmN5KGBhbCAke3VybH1gKSA6ICcnOwogICAgICByZWFkQXN5bmMoCiAgICAgICAgdXJsLAogICAgICAgIChhcnJheUJ1ZmZlcikgPT4gewogICAgICAgICAgb25sb2FkKG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7CiAgICAgICAgICBpZiAoZGVwKSB7CiAgICAgICAgICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgaWYgKG9uZXJyb3IpIHsKICAgICAgICAgICAgb25lcnJvcigpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgYExvYWRpbmcgZGF0YSBmaWxlICIke3VybH0iIGZhaWxlZC5gOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgKTsKICAgICAgaWYgKGRlcCkgewogICAgICAgIGFkZFJ1bkRlcGVuZGVuY3koZGVwKTsKICAgICAgfQogICAgfTsKICAgIHZhciBGU19jcmVhdGVEYXRhRmlsZSA9IChwYXJlbnQsIG5hbWUsIGZpbGVEYXRhLCBjYW5SZWFkLCBjYW5Xcml0ZSwgY2FuT3duKSA9PiB7CiAgICAgIEZTLmNyZWF0ZURhdGFGaWxlKHBhcmVudCwgbmFtZSwgZmlsZURhdGEsIGNhblJlYWQsIGNhbldyaXRlLCBjYW5Pd24pOwogICAgfTsKICAgIHZhciBwcmVsb2FkUGx1Z2lucyA9IE1vZHVsZVsncHJlbG9hZFBsdWdpbnMnXSB8fCBbXTsKICAgIHZhciBGU19oYW5kbGVkQnlQcmVsb2FkUGx1Z2luID0gKGJ5dGVBcnJheSwgZnVsbG5hbWUsIGZpbmlzaCwgb25lcnJvcikgPT4gewogICAgICBpZiAodHlwZW9mIEJyb3dzZXIgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBCcm93c2VyLmluaXQoKTsKICAgICAgfQogICAgICB2YXIgaGFuZGxlZCA9IGZhbHNlOwogICAgICBwcmVsb2FkUGx1Z2lucy5mb3JFYWNoKChwbHVnaW4pID0+IHsKICAgICAgICBpZiAoaGFuZGxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAocGx1Z2luWydjYW5IYW5kbGUnXShmdWxsbmFtZSkpIHsKICAgICAgICAgIHBsdWdpblsnaGFuZGxlJ10oYnl0ZUFycmF5LCBmdWxsbmFtZSwgZmluaXNoLCBvbmVycm9yKTsKICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBoYW5kbGVkOwogICAgfTsKICAgIHZhciBGU19jcmVhdGVQcmVsb2FkZWRGaWxlID0gKAogICAgICBwYXJlbnQsCiAgICAgIG5hbWUsCiAgICAgIHVybCwKICAgICAgY2FuUmVhZCwKICAgICAgY2FuV3JpdGUsCiAgICAgIG9ubG9hZCwKICAgICAgb25lcnJvciwKICAgICAgZG9udENyZWF0ZUZpbGUsCiAgICAgIGNhbk93biwKICAgICAgcHJlRmluaXNoCiAgICApID0+IHsKICAgICAgdmFyIGZ1bGxuYW1lID0gbmFtZSA/IFBBVEhfRlMucmVzb2x2ZShQQVRILmpvaW4yKHBhcmVudCwgbmFtZSkpIDogcGFyZW50OwogICAgICB2YXIgZGVwID0gZ2V0VW5pcXVlUnVuRGVwZW5kZW5jeShgY3AgJHtmdWxsbmFtZX1gKTsKICAgICAgZnVuY3Rpb24gcHJvY2Vzc0RhdGEoYnl0ZUFycmF5KSB7CiAgICAgICAgZnVuY3Rpb24gZmluaXNoKGJ5dGVBcnJheSkgewogICAgICAgICAgcHJlRmluaXNoPy4oKTsKICAgICAgICAgIGlmICghZG9udENyZWF0ZUZpbGUpIHsKICAgICAgICAgICAgRlNfY3JlYXRlRGF0YUZpbGUocGFyZW50LCBuYW1lLCBieXRlQXJyYXksIGNhblJlYWQsIGNhbldyaXRlLCBjYW5Pd24pOwogICAgICAgICAgfQogICAgICAgICAgb25sb2FkPy4oKTsKICAgICAgICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKTsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgRlNfaGFuZGxlZEJ5UHJlbG9hZFBsdWdpbihieXRlQXJyYXksIGZ1bGxuYW1lLCBmaW5pc2gsICgpID0+IHsKICAgICAgICAgICAgb25lcnJvcj8uKCk7CiAgICAgICAgICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKTsKICAgICAgICAgIH0pCiAgICAgICAgKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZpbmlzaChieXRlQXJyYXkpOwogICAgICB9CiAgICAgIGFkZFJ1bkRlcGVuZGVuY3koZGVwKTsKICAgICAgaWYgKHR5cGVvZiB1cmwgPT0gJ3N0cmluZycpIHsKICAgICAgICBhc3luY0xvYWQodXJsLCBwcm9jZXNzRGF0YSwgb25lcnJvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJvY2Vzc0RhdGEodXJsKTsKICAgICAgfQogICAgfTsKICAgIHZhciBGU19tb2RlU3RyaW5nVG9GbGFncyA9IChzdHIpID0+IHsKICAgICAgdmFyIGZsYWdNb2RlcyA9IHsgcjogMCwgJ3IrJzogMiwgdzogNTEyIHwgNjQgfCAxLCAndysnOiA1MTIgfCA2NCB8IDIsIGE6IDEwMjQgfCA2NCB8IDEsICdhKyc6IDEwMjQgfCA2NCB8IDIgfTsKICAgICAgdmFyIGZsYWdzID0gZmxhZ01vZGVzW3N0cl07CiAgICAgIGlmICh0eXBlb2YgZmxhZ3MgPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmlsZSBvcGVuIG1vZGU6ICR7c3RyfWApOwogICAgICB9CiAgICAgIHJldHVybiBmbGFnczsKICAgIH07CiAgICB2YXIgRlNfZ2V0TW9kZSA9IChjYW5SZWFkLCBjYW5Xcml0ZSkgPT4gewogICAgICB2YXIgbW9kZSA9IDA7CiAgICAgIGlmIChjYW5SZWFkKSB7CiAgICAgICAgbW9kZSB8PSAyOTIgfCA3MzsKICAgICAgfQogICAgICBpZiAoY2FuV3JpdGUpIHsKICAgICAgICBtb2RlIHw9IDE0NjsKICAgICAgfQogICAgICByZXR1cm4gbW9kZTsKICAgIH07CiAgICB2YXIgRlMgPSB7CiAgICAgIHJvb3Q6IG51bGwsCiAgICAgIG1vdW50czogW10sCiAgICAgIGRldmljZXM6IHt9LAogICAgICBzdHJlYW1zOiBbXSwKICAgICAgbmV4dElub2RlOiAxLAogICAgICBuYW1lVGFibGU6IG51bGwsCiAgICAgIGN1cnJlbnRQYXRoOiAnLycsCiAgICAgIGluaXRpYWxpemVkOiBmYWxzZSwKICAgICAgaWdub3JlUGVybWlzc2lvbnM6IHRydWUsCiAgICAgIEVycm5vRXJyb3I6IGNsYXNzIHsKICAgICAgICBjb25zdHJ1Y3RvcihlcnJubykgewogICAgICAgICAgdGhpcy5uYW1lID0gJ0Vycm5vRXJyb3InOwogICAgICAgICAgdGhpcy5lcnJubyA9IGVycm5vOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZ2VuZXJpY0Vycm9yczoge30sCiAgICAgIGZpbGVzeXN0ZW1zOiBudWxsLAogICAgICBzeW5jRlNSZXF1ZXN0czogMCwKICAgICAgbG9va3VwUGF0aChwYXRoLCBvcHRzID0ge30pIHsKICAgICAgICBwYXRoID0gUEFUSF9GUy5yZXNvbHZlKHBhdGgpOwogICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgcmV0dXJuIHsgcGF0aDogJycsIG5vZGU6IG51bGwgfTsKICAgICAgICB9CiAgICAgICAgdmFyIGRlZmF1bHRzID0geyBmb2xsb3dfbW91bnQ6IHRydWUsIHJlY3Vyc2VfY291bnQ6IDAgfTsKICAgICAgICBvcHRzID0gT2JqZWN0LmFzc2lnbihkZWZhdWx0cywgb3B0cyk7CiAgICAgICAgaWYgKG9wdHMucmVjdXJzZV9jb3VudCA+IDgpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDMyKTsKICAgICAgICB9CiAgICAgICAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgnLycpLmZpbHRlcigocCkgPT4gISFwKTsKICAgICAgICB2YXIgY3VycmVudCA9IEZTLnJvb3Q7CiAgICAgICAgdmFyIGN1cnJlbnRfcGF0aCA9ICcvJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgaXNsYXN0ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTsKICAgICAgICAgIGlmIChpc2xhc3QgJiYgb3B0cy5wYXJlbnQpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50ID0gRlMubG9va3VwTm9kZShjdXJyZW50LCBwYXJ0c1tpXSk7CiAgICAgICAgICBjdXJyZW50X3BhdGggPSBQQVRILmpvaW4yKGN1cnJlbnRfcGF0aCwgcGFydHNbaV0pOwogICAgICAgICAgaWYgKEZTLmlzTW91bnRwb2ludChjdXJyZW50KSkgewogICAgICAgICAgICBpZiAoIWlzbGFzdCB8fCAoaXNsYXN0ICYmIG9wdHMuZm9sbG93X21vdW50KSkgewogICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm1vdW50ZWQucm9vdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFpc2xhc3QgfHwgb3B0cy5mb2xsb3cpIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gMDsKICAgICAgICAgICAgd2hpbGUgKEZTLmlzTGluayhjdXJyZW50Lm1vZGUpKSB7CiAgICAgICAgICAgICAgdmFyIGxpbmsgPSBGUy5yZWFkbGluayhjdXJyZW50X3BhdGgpOwogICAgICAgICAgICAgIGN1cnJlbnRfcGF0aCA9IFBBVEhfRlMucmVzb2x2ZShQQVRILmRpcm5hbWUoY3VycmVudF9wYXRoKSwgbGluayk7CiAgICAgICAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgoY3VycmVudF9wYXRoLCB7IHJlY3Vyc2VfY291bnQ6IG9wdHMucmVjdXJzZV9jb3VudCArIDEgfSk7CiAgICAgICAgICAgICAgY3VycmVudCA9IGxvb2t1cC5ub2RlOwogICAgICAgICAgICAgIGlmIChjb3VudCsrID4gNDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDMyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcGF0aDogY3VycmVudF9wYXRoLCBub2RlOiBjdXJyZW50IH07CiAgICAgIH0sCiAgICAgIGdldFBhdGgobm9kZSkgewogICAgICAgIHZhciBwYXRoOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBpZiAoRlMuaXNSb290KG5vZGUpKSB7CiAgICAgICAgICAgIHZhciBtb3VudCA9IG5vZGUubW91bnQubW91bnRwb2ludDsKICAgICAgICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG1vdW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtb3VudFttb3VudC5sZW5ndGggLSAxXSAhPT0gJy8nID8gYCR7bW91bnR9LyR7cGF0aH1gIDogbW91bnQgKyBwYXRoOwogICAgICAgICAgfQogICAgICAgICAgcGF0aCA9IHBhdGggPyBgJHtub2RlLm5hbWV9LyR7cGF0aH1gIDogbm9kZS5uYW1lOwogICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgICAgIH0KICAgICAgfSwKICAgICAgaGFzaE5hbWUocGFyZW50aWQsIG5hbWUpIHsKICAgICAgICB2YXIgaGFzaCA9IDA7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCArIG5hbWUuY2hhckNvZGVBdChpKSkgfCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKChwYXJlbnRpZCArIGhhc2gpID4+PiAwKSAlIEZTLm5hbWVUYWJsZS5sZW5ndGg7CiAgICAgIH0sCiAgICAgIGhhc2hBZGROb2RlKG5vZGUpIHsKICAgICAgICB2YXIgaGFzaCA9IEZTLmhhc2hOYW1lKG5vZGUucGFyZW50LmlkLCBub2RlLm5hbWUpOwogICAgICAgIG5vZGUubmFtZV9uZXh0ID0gRlMubmFtZVRhYmxlW2hhc2hdOwogICAgICAgIEZTLm5hbWVUYWJsZVtoYXNoXSA9IG5vZGU7CiAgICAgIH0sCiAgICAgIGhhc2hSZW1vdmVOb2RlKG5vZGUpIHsKICAgICAgICB2YXIgaGFzaCA9IEZTLmhhc2hOYW1lKG5vZGUucGFyZW50LmlkLCBub2RlLm5hbWUpOwogICAgICAgIGlmIChGUy5uYW1lVGFibGVbaGFzaF0gPT09IG5vZGUpIHsKICAgICAgICAgIEZTLm5hbWVUYWJsZVtoYXNoXSA9IG5vZGUubmFtZV9uZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgY3VycmVudCA9IEZTLm5hbWVUYWJsZVtoYXNoXTsKICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50Lm5hbWVfbmV4dCA9PT0gbm9kZSkgewogICAgICAgICAgICAgIGN1cnJlbnQubmFtZV9uZXh0ID0gbm9kZS5uYW1lX25leHQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmFtZV9uZXh0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgbG9va3VwTm9kZShwYXJlbnQsIG5hbWUpIHsKICAgICAgICB2YXIgZXJyQ29kZSA9IEZTLm1heUxvb2t1cChwYXJlbnQpOwogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICB9CiAgICAgICAgdmFyIGhhc2ggPSBGUy5oYXNoTmFtZShwYXJlbnQuaWQsIG5hbWUpOwogICAgICAgIGZvciAodmFyIG5vZGUgPSBGUy5uYW1lVGFibGVbaGFzaF07IG5vZGU7IG5vZGUgPSBub2RlLm5hbWVfbmV4dCkgewogICAgICAgICAgdmFyIG5vZGVOYW1lID0gbm9kZS5uYW1lOwogICAgICAgICAgaWYgKG5vZGUucGFyZW50LmlkID09PSBwYXJlbnQuaWQgJiYgbm9kZU5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBGUy5sb29rdXAocGFyZW50LCBuYW1lKTsKICAgICAgfSwKICAgICAgY3JlYXRlTm9kZShwYXJlbnQsIG5hbWUsIG1vZGUsIHJkZXYpIHsKICAgICAgICB2YXIgbm9kZSA9IG5ldyBGUy5GU05vZGUocGFyZW50LCBuYW1lLCBtb2RlLCByZGV2KTsKICAgICAgICBGUy5oYXNoQWRkTm9kZShub2RlKTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfSwKICAgICAgZGVzdHJveU5vZGUobm9kZSkgewogICAgICAgIEZTLmhhc2hSZW1vdmVOb2RlKG5vZGUpOwogICAgICB9LAogICAgICBpc1Jvb3Qobm9kZSkgewogICAgICAgIHJldHVybiBub2RlID09PSBub2RlLnBhcmVudDsKICAgICAgfSwKICAgICAgaXNNb3VudHBvaW50KG5vZGUpIHsKICAgICAgICByZXR1cm4gISFub2RlLm1vdW50ZWQ7CiAgICAgIH0sCiAgICAgIGlzRmlsZShtb2RlKSB7CiAgICAgICAgcmV0dXJuIChtb2RlICYgNjE0NDApID09PSAzMjc2ODsKICAgICAgfSwKICAgICAgaXNEaXIobW9kZSkgewogICAgICAgIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gMTYzODQ7CiAgICAgIH0sCiAgICAgIGlzTGluayhtb2RlKSB7CiAgICAgICAgcmV0dXJuIChtb2RlICYgNjE0NDApID09PSA0MDk2MDsKICAgICAgfSwKICAgICAgaXNDaHJkZXYobW9kZSkgewogICAgICAgIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gODE5MjsKICAgICAgfSwKICAgICAgaXNCbGtkZXYobW9kZSkgewogICAgICAgIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gMjQ1NzY7CiAgICAgIH0sCiAgICAgIGlzRklGTyhtb2RlKSB7CiAgICAgICAgcmV0dXJuIChtb2RlICYgNjE0NDApID09PSA0MDk2OwogICAgICB9LAogICAgICBpc1NvY2tldChtb2RlKSB7CiAgICAgICAgcmV0dXJuIChtb2RlICYgNDkxNTIpID09PSA0OTE1MjsKICAgICAgfSwKICAgICAgZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoZmxhZykgewogICAgICAgIHZhciBwZXJtcyA9IFsncicsICd3JywgJ3J3J11bZmxhZyAmIDNdOwogICAgICAgIGlmIChmbGFnICYgNTEyKSB7CiAgICAgICAgICBwZXJtcyArPSAndyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwZXJtczsKICAgICAgfSwKICAgICAgbm9kZVBlcm1pc3Npb25zKG5vZGUsIHBlcm1zKSB7CiAgICAgICAgaWYgKEZTLmlnbm9yZVBlcm1pc3Npb25zKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHBlcm1zLmluY2x1ZGVzKCdyJykgJiYgIShub2RlLm1vZGUgJiAyOTIpKSB7CiAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9IGVsc2UgaWYgKHBlcm1zLmluY2x1ZGVzKCd3JykgJiYgIShub2RlLm1vZGUgJiAxNDYpKSB7CiAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9IGVsc2UgaWYgKHBlcm1zLmluY2x1ZGVzKCd4JykgJiYgIShub2RlLm1vZGUgJiA3MykpIHsKICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgICAgfSwKICAgICAgbWF5TG9va3VwKGRpcikgewogICAgICAgIGlmICghRlMuaXNEaXIoZGlyLm1vZGUpKSB7CiAgICAgICAgICByZXR1cm4gNTQ7CiAgICAgICAgfQogICAgICAgIHZhciBlcnJDb2RlID0gRlMubm9kZVBlcm1pc3Npb25zKGRpciwgJ3gnKTsKICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgcmV0dXJuIGVyckNvZGU7CiAgICAgICAgfQogICAgICAgIGlmICghZGlyLm5vZGVfb3BzLmxvb2t1cCkgewogICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9LAogICAgICBtYXlDcmVhdGUoZGlyLCBuYW1lKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBub2RlID0gRlMubG9va3VwTm9kZShkaXIsIG5hbWUpOwogICAgICAgICAgcmV0dXJuIDIwOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgcmV0dXJuIEZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsICd3eCcpOwogICAgICB9LAogICAgICBtYXlEZWxldGUoZGlyLCBuYW1lLCBpc2RpcikgewogICAgICAgIHZhciBub2RlOwogICAgICAgIHRyeSB7CiAgICAgICAgICBub2RlID0gRlMubG9va3VwTm9kZShkaXIsIG5hbWUpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHJldHVybiBlLmVycm5vOwogICAgICAgIH0KICAgICAgICB2YXIgZXJyQ29kZSA9IEZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsICd3eCcpOwogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ29kZTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzZGlyKSB7CiAgICAgICAgICBpZiAoIUZTLmlzRGlyKG5vZGUubW9kZSkpIHsKICAgICAgICAgICAgcmV0dXJuIDU0OwogICAgICAgICAgfQogICAgICAgICAgaWYgKEZTLmlzUm9vdChub2RlKSB8fCBGUy5nZXRQYXRoKG5vZGUpID09PSBGUy5jd2QoKSkgewogICAgICAgICAgICByZXR1cm4gMTA7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgICAgIHJldHVybiAzMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0sCiAgICAgIG1heU9wZW4obm9kZSwgZmxhZ3MpIHsKICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIHJldHVybiA0NDsKICAgICAgICB9CiAgICAgICAgaWYgKEZTLmlzTGluayhub2RlLm1vZGUpKSB7CiAgICAgICAgICByZXR1cm4gMzI7CiAgICAgICAgfSBlbHNlIGlmIChGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgICBpZiAoRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoZmxhZ3MpICE9PSAncicgfHwgZmxhZ3MgJiA1MTIpIHsKICAgICAgICAgICAgcmV0dXJuIDMxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gRlMubm9kZVBlcm1pc3Npb25zKG5vZGUsIEZTLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWdzKSk7CiAgICAgIH0sCiAgICAgIE1BWF9PUEVOX0ZEUzogNDA5NiwKICAgICAgbmV4dGZkKCkgewogICAgICAgIGZvciAodmFyIGZkID0gMDsgZmQgPD0gRlMuTUFYX09QRU5fRkRTOyBmZCsrKSB7CiAgICAgICAgICBpZiAoIUZTLnN0cmVhbXNbZmRdKSB7CiAgICAgICAgICAgIHJldHVybiBmZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzMpOwogICAgICB9LAogICAgICBnZXRTdHJlYW1DaGVja2VkKGZkKSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbShmZCk7CiAgICAgICAgaWYgKCFzdHJlYW0pIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyZWFtOwogICAgICB9LAogICAgICBnZXRTdHJlYW06IChmZCkgPT4gRlMuc3RyZWFtc1tmZF0sCiAgICAgIGNyZWF0ZVN0cmVhbShzdHJlYW0sIGZkID0gLTEpIHsKICAgICAgICBpZiAoIUZTLkZTU3RyZWFtKSB7CiAgICAgICAgICBGUy5GU1N0cmVhbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5zaGFyZWQgPSB7fTsKICAgICAgICAgIH07CiAgICAgICAgICBGUy5GU1N0cmVhbS5wcm90b3R5cGUgPSB7fTsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZTLkZTU3RyZWFtLnByb3RvdHlwZSwgewogICAgICAgICAgICBvYmplY3Q6IHsKICAgICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgc2V0KHZhbCkgewogICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdmFsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgaXNSZWFkOiB7CiAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMjA5NzE1NSkgIT09IDE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBpc1dyaXRlOiB7CiAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMjA5NzE1NSkgIT09IDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBpc0FwcGVuZDogewogICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsYWdzICYgMTAyNDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZsYWdzOiB7CiAgICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgc2V0KHZhbCkgewogICAgICAgICAgICAgICAgdGhpcy5zaGFyZWQuZmxhZ3MgPSB2YWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBwb3NpdGlvbjogewogICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbjsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHNldCh2YWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkLnBvc2l0aW9uID0gdmFsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHN0cmVhbSA9IE9iamVjdC5hc3NpZ24obmV3IEZTLkZTU3RyZWFtKCksIHN0cmVhbSk7CiAgICAgICAgaWYgKGZkID09IC0xKSB7CiAgICAgICAgICBmZCA9IEZTLm5leHRmZCgpOwogICAgICAgIH0KICAgICAgICBzdHJlYW0uZmQgPSBmZDsKICAgICAgICBGUy5zdHJlYW1zW2ZkXSA9IHN0cmVhbTsKICAgICAgICByZXR1cm4gc3RyZWFtOwogICAgICB9LAogICAgICBjbG9zZVN0cmVhbShmZCkgewogICAgICAgIEZTLnN0cmVhbXNbZmRdID0gbnVsbDsKICAgICAgfSwKICAgICAgY2hyZGV2X3N0cmVhbV9vcHM6IHsKICAgICAgICBvcGVuKHN0cmVhbSkgewogICAgICAgICAgdmFyIGRldmljZSA9IEZTLmdldERldmljZShzdHJlYW0ubm9kZS5yZGV2KTsKICAgICAgICAgIHN0cmVhbS5zdHJlYW1fb3BzID0gZGV2aWNlLnN0cmVhbV9vcHM7CiAgICAgICAgICBzdHJlYW0uc3RyZWFtX29wcy5vcGVuPy4oc3RyZWFtKTsKICAgICAgICB9LAogICAgICAgIGxsc2VlaygpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1ham9yOiAoZGV2KSA9PiBkZXYgPj4gOCwKICAgICAgbWlub3I6IChkZXYpID0+IGRldiAmIDI1NSwKICAgICAgbWFrZWRldjogKG1hLCBtaSkgPT4gKG1hIDw8IDgpIHwgbWksCiAgICAgIHJlZ2lzdGVyRGV2aWNlKGRldiwgb3BzKSB7CiAgICAgICAgRlMuZGV2aWNlc1tkZXZdID0geyBzdHJlYW1fb3BzOiBvcHMgfTsKICAgICAgfSwKICAgICAgZ2V0RGV2aWNlOiAoZGV2KSA9PiBGUy5kZXZpY2VzW2Rldl0sCiAgICAgIGdldE1vdW50cyhtb3VudCkgewogICAgICAgIHZhciBtb3VudHMgPSBbXTsKICAgICAgICB2YXIgY2hlY2sgPSBbbW91bnRdOwogICAgICAgIHdoaWxlIChjaGVjay5sZW5ndGgpIHsKICAgICAgICAgIHZhciBtID0gY2hlY2sucG9wKCk7CiAgICAgICAgICBtb3VudHMucHVzaChtKTsKICAgICAgICAgIGNoZWNrLnB1c2guYXBwbHkoY2hlY2ssIG0ubW91bnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1vdW50czsKICAgICAgfSwKICAgICAgc3luY2ZzKHBvcHVsYXRlLCBjYWxsYmFjaykgewogICAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGUgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgY2FsbGJhY2sgPSBwb3B1bGF0ZTsKICAgICAgICAgIHBvcHVsYXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIEZTLnN5bmNGU1JlcXVlc3RzKys7CiAgICAgICAgaWYgKEZTLnN5bmNGU1JlcXVlc3RzID4gMSkgewogICAgICAgICAgZXJyKGB3YXJuaW5nOiAke0ZTLnN5bmNGU1JlcXVlc3RzfSBGUy5zeW5jZnMgb3BlcmF0aW9ucyBpbiBmbGlnaHQgYXQgb25jZSwgcHJvYmFibHkganVzdCBkb2luZyBleHRyYSB3b3JrYCk7CiAgICAgICAgfQogICAgICAgIHZhciBtb3VudHMgPSBGUy5nZXRNb3VudHMoRlMucm9vdC5tb3VudCk7CiAgICAgICAgdmFyIGNvbXBsZXRlZCA9IDA7CiAgICAgICAgZnVuY3Rpb24gZG9DYWxsYmFjayhlcnJDb2RlKSB7CiAgICAgICAgICBGUy5zeW5jRlNSZXF1ZXN0cy0tOwogICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyckNvZGUpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBkb25lKGVyckNvZGUpIHsKICAgICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICAgIGlmICghZG9uZS5lcnJvcmVkKSB7CiAgICAgICAgICAgICAgZG9uZS5lcnJvcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICByZXR1cm4gZG9DYWxsYmFjayhlcnJDb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoKytjb21wbGV0ZWQgPj0gbW91bnRzLmxlbmd0aCkgewogICAgICAgICAgICBkb0NhbGxiYWNrKG51bGwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBtb3VudHMuZm9yRWFjaCgobW91bnQpID0+IHsKICAgICAgICAgIGlmICghbW91bnQudHlwZS5zeW5jZnMpIHsKICAgICAgICAgICAgcmV0dXJuIGRvbmUobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICBtb3VudC50eXBlLnN5bmNmcyhtb3VudCwgcG9wdWxhdGUsIGRvbmUpOwogICAgICAgIH0pOwogICAgICB9LAogICAgICBtb3VudCh0eXBlLCBvcHRzLCBtb3VudHBvaW50KSB7CiAgICAgICAgdmFyIHJvb3QgPSBtb3VudHBvaW50ID09PSAnLyc7CiAgICAgICAgdmFyIHBzZXVkbyA9ICFtb3VudHBvaW50OwogICAgICAgIHZhciBub2RlOwogICAgICAgIGlmIChyb290ICYmIEZTLnJvb3QpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDEwKTsKICAgICAgICB9IGVsc2UgaWYgKCFyb290ICYmICFwc2V1ZG8pIHsKICAgICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKG1vdW50cG9pbnQsIHsgZm9sbG93X21vdW50OiBmYWxzZSB9KTsKICAgICAgICAgIG1vdW50cG9pbnQgPSBsb29rdXAucGF0aDsKICAgICAgICAgIG5vZGUgPSBsb29rdXAubm9kZTsKICAgICAgICAgIGlmIChGUy5pc01vdW50cG9pbnQobm9kZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDU0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIG1vdW50ID0geyB0eXBlOiB0eXBlLCBvcHRzOiBvcHRzLCBtb3VudHBvaW50OiBtb3VudHBvaW50LCBtb3VudHM6IFtdIH07CiAgICAgICAgdmFyIG1vdW50Um9vdCA9IHR5cGUubW91bnQobW91bnQpOwogICAgICAgIG1vdW50Um9vdC5tb3VudCA9IG1vdW50OwogICAgICAgIG1vdW50LnJvb3QgPSBtb3VudFJvb3Q7CiAgICAgICAgaWYgKHJvb3QpIHsKICAgICAgICAgIEZTLnJvb3QgPSBtb3VudFJvb3Q7CiAgICAgICAgfSBlbHNlIGlmIChub2RlKSB7CiAgICAgICAgICBub2RlLm1vdW50ZWQgPSBtb3VudDsKICAgICAgICAgIGlmIChub2RlLm1vdW50KSB7CiAgICAgICAgICAgIG5vZGUubW91bnQubW91bnRzLnB1c2gobW91bnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbW91bnRSb290OwogICAgICB9LAogICAgICB1bm1vdW50KG1vdW50cG9pbnQpIHsKICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChtb3VudHBvaW50LCB7IGZvbGxvd19tb3VudDogZmFsc2UgfSk7CiAgICAgICAgaWYgKCFGUy5pc01vdW50cG9pbnQobG9va3VwLm5vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIHZhciBub2RlID0gbG9va3VwLm5vZGU7CiAgICAgICAgdmFyIG1vdW50ID0gbm9kZS5tb3VudGVkOwogICAgICAgIHZhciBtb3VudHMgPSBGUy5nZXRNb3VudHMobW91bnQpOwogICAgICAgIE9iamVjdC5rZXlzKEZTLm5hbWVUYWJsZSkuZm9yRWFjaCgoaGFzaCkgPT4gewogICAgICAgICAgdmFyIGN1cnJlbnQgPSBGUy5uYW1lVGFibGVbaGFzaF07CiAgICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgICB2YXIgbmV4dCA9IGN1cnJlbnQubmFtZV9uZXh0OwogICAgICAgICAgICBpZiAobW91bnRzLmluY2x1ZGVzKGN1cnJlbnQubW91bnQpKSB7CiAgICAgICAgICAgICAgRlMuZGVzdHJveU5vZGUoY3VycmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgbm9kZS5tb3VudGVkID0gbnVsbDsKICAgICAgICB2YXIgaWR4ID0gbm9kZS5tb3VudC5tb3VudHMuaW5kZXhPZihtb3VudCk7CiAgICAgICAgbm9kZS5tb3VudC5tb3VudHMuc3BsaWNlKGlkeCwgMSk7CiAgICAgIH0sCiAgICAgIGxvb2t1cChwYXJlbnQsIG5hbWUpIHsKICAgICAgICByZXR1cm4gcGFyZW50Lm5vZGVfb3BzLmxvb2t1cChwYXJlbnQsIG5hbWUpOwogICAgICB9LAogICAgICBta25vZChwYXRoLCBtb2RlLCBkZXYpIHsKICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IHBhcmVudDogdHJ1ZSB9KTsKICAgICAgICB2YXIgcGFyZW50ID0gbG9va3VwLm5vZGU7CiAgICAgICAgdmFyIG5hbWUgPSBQQVRILmJhc2VuYW1lKHBhdGgpOwogICAgICAgIGlmICghbmFtZSB8fCBuYW1lID09PSAnLicgfHwgbmFtZSA9PT0gJy4uJykgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgIH0KICAgICAgICB2YXIgZXJyQ29kZSA9IEZTLm1heUNyZWF0ZShwYXJlbnQsIG5hbWUpOwogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwYXJlbnQubm9kZV9vcHMubWtub2QpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudC5ub2RlX29wcy5ta25vZChwYXJlbnQsIG5hbWUsIG1vZGUsIGRldik7CiAgICAgIH0sCiAgICAgIGNyZWF0ZShwYXRoLCBtb2RlKSB7CiAgICAgICAgbW9kZSA9IG1vZGUgIT09IHVuZGVmaW5lZCA/IG1vZGUgOiA0Mzg7CiAgICAgICAgbW9kZSAmPSA0MDk1OwogICAgICAgIG1vZGUgfD0gMzI3Njg7CiAgICAgICAgcmV0dXJuIEZTLm1rbm9kKHBhdGgsIG1vZGUsIDApOwogICAgICB9LAogICAgICBta2RpcihwYXRoLCBtb2RlKSB7CiAgICAgICAgbW9kZSA9IG1vZGUgIT09IHVuZGVmaW5lZCA/IG1vZGUgOiA1MTE7CiAgICAgICAgbW9kZSAmPSA1MTEgfCA1MTI7CiAgICAgICAgbW9kZSB8PSAxNjM4NDsKICAgICAgICByZXR1cm4gRlMubWtub2QocGF0aCwgbW9kZSwgMCk7CiAgICAgIH0sCiAgICAgIG1rZGlyVHJlZShwYXRoLCBtb2RlKSB7CiAgICAgICAgdmFyIGRpcnMgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgdmFyIGQgPSAnJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGlmICghZGlyc1tpXSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGQgKz0gJy8nICsgZGlyc1tpXTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIEZTLm1rZGlyKGQsIG1vZGUpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBpZiAoZS5lcnJubyAhPSAyMCkgewogICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1rZGV2KHBhdGgsIG1vZGUsIGRldikgewogICAgICAgIGlmICh0eXBlb2YgZGV2ID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICBkZXYgPSBtb2RlOwogICAgICAgICAgbW9kZSA9IDQzODsKICAgICAgICB9CiAgICAgICAgbW9kZSB8PSA4MTkyOwogICAgICAgIHJldHVybiBGUy5ta25vZChwYXRoLCBtb2RlLCBkZXYpOwogICAgICB9LAogICAgICBzeW1saW5rKG9sZHBhdGgsIG5ld3BhdGgpIHsKICAgICAgICBpZiAoIVBBVEhfRlMucmVzb2x2ZShvbGRwYXRoKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpOwogICAgICAgIH0KICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChuZXdwYXRoLCB7IHBhcmVudDogdHJ1ZSB9KTsKICAgICAgICB2YXIgcGFyZW50ID0gbG9va3VwLm5vZGU7CiAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld25hbWUgPSBQQVRILmJhc2VuYW1lKG5ld3BhdGgpOwogICAgICAgIHZhciBlcnJDb2RlID0gRlMubWF5Q3JlYXRlKHBhcmVudCwgbmV3bmFtZSk7CiAgICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpOwogICAgICAgIH0KICAgICAgICBpZiAoIXBhcmVudC5ub2RlX29wcy5zeW1saW5rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQubm9kZV9vcHMuc3ltbGluayhwYXJlbnQsIG5ld25hbWUsIG9sZHBhdGgpOwogICAgICB9LAogICAgICByZW5hbWUob2xkX3BhdGgsIG5ld19wYXRoKSB7CiAgICAgICAgdmFyIG9sZF9kaXJuYW1lID0gUEFUSC5kaXJuYW1lKG9sZF9wYXRoKTsKICAgICAgICB2YXIgbmV3X2Rpcm5hbWUgPSBQQVRILmRpcm5hbWUobmV3X3BhdGgpOwogICAgICAgIHZhciBvbGRfbmFtZSA9IFBBVEguYmFzZW5hbWUob2xkX3BhdGgpOwogICAgICAgIHZhciBuZXdfbmFtZSA9IFBBVEguYmFzZW5hbWUobmV3X3BhdGgpOwogICAgICAgIHZhciBsb29rdXAsIG9sZF9kaXIsIG5ld19kaXI7CiAgICAgICAgbG9va3VwID0gRlMubG9va3VwUGF0aChvbGRfcGF0aCwgeyBwYXJlbnQ6IHRydWUgfSk7CiAgICAgICAgb2xkX2RpciA9IGxvb2t1cC5ub2RlOwogICAgICAgIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgobmV3X3BhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICAgIG5ld19kaXIgPSBsb29rdXAubm9kZTsKICAgICAgICBpZiAoIW9sZF9kaXIgfHwgIW5ld19kaXIpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgICB9CiAgICAgICAgaWYgKG9sZF9kaXIubW91bnQgIT09IG5ld19kaXIubW91bnQpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDc1KTsKICAgICAgICB9CiAgICAgICAgdmFyIG9sZF9ub2RlID0gRlMubG9va3VwTm9kZShvbGRfZGlyLCBvbGRfbmFtZSk7CiAgICAgICAgdmFyIHJlbGF0aXZlID0gUEFUSF9GUy5yZWxhdGl2ZShvbGRfcGF0aCwgbmV3X2Rpcm5hbWUpOwogICAgICAgIGlmIChyZWxhdGl2ZS5jaGFyQXQoMCkgIT09ICcuJykgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgIH0KICAgICAgICByZWxhdGl2ZSA9IFBBVEhfRlMucmVsYXRpdmUobmV3X3BhdGgsIG9sZF9kaXJuYW1lKTsKICAgICAgICBpZiAocmVsYXRpdmUuY2hhckF0KDApICE9PSAnLicpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDU1KTsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld19ub2RlOwogICAgICAgIHRyeSB7CiAgICAgICAgICBuZXdfbm9kZSA9IEZTLmxvb2t1cE5vZGUobmV3X2RpciwgbmV3X25hbWUpOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgaWYgKG9sZF9ub2RlID09PSBuZXdfbm9kZSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgaXNkaXIgPSBGUy5pc0RpcihvbGRfbm9kZS5tb2RlKTsKICAgICAgICB2YXIgZXJyQ29kZSA9IEZTLm1heURlbGV0ZShvbGRfZGlyLCBvbGRfbmFtZSwgaXNkaXIpOwogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICB9CiAgICAgICAgZXJyQ29kZSA9IG5ld19ub2RlID8gRlMubWF5RGVsZXRlKG5ld19kaXIsIG5ld19uYW1lLCBpc2RpcikgOiBGUy5tYXlDcmVhdGUobmV3X2RpciwgbmV3X25hbWUpOwogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFvbGRfZGlyLm5vZGVfb3BzLnJlbmFtZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICAgIH0KICAgICAgICBpZiAoRlMuaXNNb3VudHBvaW50KG9sZF9ub2RlKSB8fCAobmV3X25vZGUgJiYgRlMuaXNNb3VudHBvaW50KG5ld19ub2RlKSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDEwKTsKICAgICAgICB9CiAgICAgICAgaWYgKG5ld19kaXIgIT09IG9sZF9kaXIpIHsKICAgICAgICAgIGVyckNvZGUgPSBGUy5ub2RlUGVybWlzc2lvbnMob2xkX2RpciwgJ3cnKTsKICAgICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBGUy5oYXNoUmVtb3ZlTm9kZShvbGRfbm9kZSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIG9sZF9kaXIubm9kZV9vcHMucmVuYW1lKG9sZF9ub2RlLCBuZXdfZGlyLCBuZXdfbmFtZSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgRlMuaGFzaEFkZE5vZGUob2xkX25vZGUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcm1kaXIocGF0aCkgewogICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICAgIHZhciBwYXJlbnQgPSBsb29rdXAubm9kZTsKICAgICAgICB2YXIgbmFtZSA9IFBBVEguYmFzZW5hbWUocGF0aCk7CiAgICAgICAgdmFyIG5vZGUgPSBGUy5sb29rdXBOb2RlKHBhcmVudCwgbmFtZSk7CiAgICAgICAgdmFyIGVyckNvZGUgPSBGUy5tYXlEZWxldGUocGFyZW50LCBuYW1lLCB0cnVlKTsKICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyZW50Lm5vZGVfb3BzLnJtZGlyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgICAgfQogICAgICAgIGlmIChGUy5pc01vdW50cG9pbnQobm9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDEwKTsKICAgICAgICB9CiAgICAgICAgcGFyZW50Lm5vZGVfb3BzLnJtZGlyKHBhcmVudCwgbmFtZSk7CiAgICAgICAgRlMuZGVzdHJveU5vZGUobm9kZSk7CiAgICAgIH0sCiAgICAgIHJlYWRkaXIocGF0aCkgewogICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgZm9sbG93OiB0cnVlIH0pOwogICAgICAgIHZhciBub2RlID0gbG9va3VwLm5vZGU7CiAgICAgICAgaWYgKCFub2RlLm5vZGVfb3BzLnJlYWRkaXIpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDU0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGUubm9kZV9vcHMucmVhZGRpcihub2RlKTsKICAgICAgfSwKICAgICAgdW5saW5rKHBhdGgpIHsKICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IHBhcmVudDogdHJ1ZSB9KTsKICAgICAgICB2YXIgcGFyZW50ID0gbG9va3VwLm5vZGU7CiAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgICB9CiAgICAgICAgdmFyIG5hbWUgPSBQQVRILmJhc2VuYW1lKHBhdGgpOwogICAgICAgIHZhciBub2RlID0gRlMubG9va3VwTm9kZShwYXJlbnQsIG5hbWUpOwogICAgICAgIHZhciBlcnJDb2RlID0gRlMubWF5RGVsZXRlKHBhcmVudCwgbmFtZSwgZmFsc2UpOwogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwYXJlbnQubm9kZV9vcHMudW5saW5rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgICAgfQogICAgICAgIGlmIChGUy5pc01vdW50cG9pbnQobm9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDEwKTsKICAgICAgICB9CiAgICAgICAgcGFyZW50Lm5vZGVfb3BzLnVubGluayhwYXJlbnQsIG5hbWUpOwogICAgICAgIEZTLmRlc3Ryb3lOb2RlKG5vZGUpOwogICAgICB9LAogICAgICByZWFkbGluayhwYXRoKSB7CiAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCk7CiAgICAgICAgdmFyIGxpbmsgPSBsb29rdXAubm9kZTsKICAgICAgICBpZiAoIWxpbmspIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgICB9CiAgICAgICAgaWYgKCFsaW5rLm5vZGVfb3BzLnJlYWRsaW5rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQQVRIX0ZTLnJlc29sdmUoRlMuZ2V0UGF0aChsaW5rLnBhcmVudCksIGxpbmsubm9kZV9vcHMucmVhZGxpbmsobGluaykpOwogICAgICB9LAogICAgICBzdGF0KHBhdGgsIGRvbnRGb2xsb3cpIHsKICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogIWRvbnRGb2xsb3cgfSk7CiAgICAgICAgdmFyIG5vZGUgPSBsb29rdXAubm9kZTsKICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgICB9CiAgICAgICAgaWYgKCFub2RlLm5vZGVfb3BzLmdldGF0dHIpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGUubm9kZV9vcHMuZ2V0YXR0cihub2RlKTsKICAgICAgfSwKICAgICAgbHN0YXQocGF0aCkgewogICAgICAgIHJldHVybiBGUy5zdGF0KHBhdGgsIHRydWUpOwogICAgICB9LAogICAgICBjaG1vZChwYXRoLCBtb2RlLCBkb250Rm9sbG93KSB7CiAgICAgICAgdmFyIG5vZGU7CiAgICAgICAgaWYgKHR5cGVvZiBwYXRoID09ICdzdHJpbmcnKSB7CiAgICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogIWRvbnRGb2xsb3cgfSk7CiAgICAgICAgICBub2RlID0gbG9va3VwLm5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vZGUgPSBwYXRoOwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUubm9kZV9vcHMuc2V0YXR0cikgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICAgIH0KICAgICAgICBub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSwgeyBtb2RlOiAobW9kZSAmIDQwOTUpIHwgKG5vZGUubW9kZSAmIH40MDk1KSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0pOwogICAgICB9LAogICAgICBsY2htb2QocGF0aCwgbW9kZSkgewogICAgICAgIEZTLmNobW9kKHBhdGgsIG1vZGUsIHRydWUpOwogICAgICB9LAogICAgICBmY2htb2QoZmQsIG1vZGUpIHsKICAgICAgICB2YXIgc3RyZWFtID0gRlMuZ2V0U3RyZWFtQ2hlY2tlZChmZCk7CiAgICAgICAgRlMuY2htb2Qoc3RyZWFtLm5vZGUsIG1vZGUpOwogICAgICB9LAogICAgICBjaG93bihwYXRoLCB1aWQsIGdpZCwgZG9udEZvbGxvdykgewogICAgICAgIHZhciBub2RlOwogICAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnc3RyaW5nJykgewogICAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6ICFkb250Rm9sbG93IH0pOwogICAgICAgICAgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlID0gcGF0aDsKICAgICAgICB9CiAgICAgICAgaWYgKCFub2RlLm5vZGVfb3BzLnNldGF0dHIpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKTsKICAgICAgICB9CiAgICAgICAgbm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUsIHsgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0pOwogICAgICB9LAogICAgICBsY2hvd24ocGF0aCwgdWlkLCBnaWQpIHsKICAgICAgICBGUy5jaG93bihwYXRoLCB1aWQsIGdpZCwgdHJ1ZSk7CiAgICAgIH0sCiAgICAgIGZjaG93bihmZCwgdWlkLCBnaWQpIHsKICAgICAgICB2YXIgc3RyZWFtID0gRlMuZ2V0U3RyZWFtQ2hlY2tlZChmZCk7CiAgICAgICAgRlMuY2hvd24oc3RyZWFtLm5vZGUsIHVpZCwgZ2lkKTsKICAgICAgfSwKICAgICAgdHJ1bmNhdGUocGF0aCwgbGVuKSB7CiAgICAgICAgaWYgKGxlbiA8IDApIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgICB9CiAgICAgICAgdmFyIG5vZGU7CiAgICAgICAgaWYgKHR5cGVvZiBwYXRoID09ICdzdHJpbmcnKSB7CiAgICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogdHJ1ZSB9KTsKICAgICAgICAgIG5vZGUgPSBsb29rdXAubm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZSA9IHBhdGg7CiAgICAgICAgfQogICAgICAgIGlmICghbm9kZS5ub2RlX29wcy5zZXRhdHRyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgICAgfQogICAgICAgIGlmIChGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzMSk7CiAgICAgICAgfQogICAgICAgIGlmICghRlMuaXNGaWxlKG5vZGUubW9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgICB9CiAgICAgICAgdmFyIGVyckNvZGUgPSBGUy5ub2RlUGVybWlzc2lvbnMobm9kZSwgJ3cnKTsKICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgICAgfQogICAgICAgIG5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLCB7IHNpemU6IGxlbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0pOwogICAgICB9LAogICAgICBmdHJ1bmNhdGUoZmQsIGxlbikgewogICAgICAgIHZhciBzdHJlYW0gPSBGUy5nZXRTdHJlYW1DaGVja2VkKGZkKTsKICAgICAgICBpZiAoKHN0cmVhbS5mbGFncyAmIDIwOTcxNTUpID09PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIEZTLnRydW5jYXRlKHN0cmVhbS5ub2RlLCBsZW4pOwogICAgICB9LAogICAgICB1dGltZShwYXRoLCBhdGltZSwgbXRpbWUpIHsKICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogdHJ1ZSB9KTsKICAgICAgICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICAgIG5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLCB7IHRpbWVzdGFtcDogTWF0aC5tYXgoYXRpbWUsIG10aW1lKSB9KTsKICAgICAgfSwKICAgICAgb3BlbihwYXRoLCBmbGFncywgbW9kZSkgewogICAgICAgIGlmIChwYXRoID09PSAnJykgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpOwogICAgICAgIH0KICAgICAgICBmbGFncyA9IHR5cGVvZiBmbGFncyA9PSAnc3RyaW5nJyA/IEZTX21vZGVTdHJpbmdUb0ZsYWdzKGZsYWdzKSA6IGZsYWdzOwogICAgICAgIG1vZGUgPSB0eXBlb2YgbW9kZSA9PSAndW5kZWZpbmVkJyA/IDQzOCA6IG1vZGU7CiAgICAgICAgaWYgKGZsYWdzICYgNjQpIHsKICAgICAgICAgIG1vZGUgPSAobW9kZSAmIDQwOTUpIHwgMzI3Njg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1vZGUgPSAwOwogICAgICAgIH0KICAgICAgICB2YXIgbm9kZTsKICAgICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ29iamVjdCcpIHsKICAgICAgICAgIG5vZGUgPSBwYXRoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYXRoID0gUEFUSC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogIShmbGFncyAmIDEzMTA3MikgfSk7CiAgICAgICAgICAgIG5vZGUgPSBsb29rdXAubm9kZTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgfQogICAgICAgIHZhciBjcmVhdGVkID0gZmFsc2U7CiAgICAgICAgaWYgKGZsYWdzICYgNjQpIHsKICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgIGlmIChmbGFncyAmIDEyOCkgewogICAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZSA9IEZTLm1rbm9kKHBhdGgsIG1vZGUsIDApOwogICAgICAgICAgICBjcmVhdGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgICAgfQogICAgICAgIGlmIChGUy5pc0NocmRldihub2RlLm1vZGUpKSB7CiAgICAgICAgICBmbGFncyAmPSB+NTEyOwogICAgICAgIH0KICAgICAgICBpZiAoZmxhZ3MgJiA2NTUzNiAmJiAhRlMuaXNEaXIobm9kZS5tb2RlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTQpOwogICAgICAgIH0KICAgICAgICBpZiAoIWNyZWF0ZWQpIHsKICAgICAgICAgIHZhciBlcnJDb2RlID0gRlMubWF5T3Blbihub2RlLCBmbGFncyk7CiAgICAgICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgNTEyICYmICFjcmVhdGVkKSB7CiAgICAgICAgICBGUy50cnVuY2F0ZShub2RlLCAwKTsKICAgICAgICB9CiAgICAgICAgZmxhZ3MgJj0gfigxMjggfCA1MTIgfCAxMzEwNzIpOwogICAgICAgIHZhciBzdHJlYW0gPSBGUy5jcmVhdGVTdHJlYW0oewogICAgICAgICAgbm9kZTogbm9kZSwKICAgICAgICAgIHBhdGg6IEZTLmdldFBhdGgobm9kZSksCiAgICAgICAgICBmbGFnczogZmxhZ3MsCiAgICAgICAgICBzZWVrYWJsZTogdHJ1ZSwKICAgICAgICAgIHBvc2l0aW9uOiAwLAogICAgICAgICAgc3RyZWFtX29wczogbm9kZS5zdHJlYW1fb3BzLAogICAgICAgICAgdW5nb3R0ZW46IFtdLAogICAgICAgICAgZXJyb3I6IGZhbHNlCiAgICAgICAgfSk7CiAgICAgICAgaWYgKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pIHsKICAgICAgICAgIHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKTsKICAgICAgICB9CiAgICAgICAgaWYgKE1vZHVsZVsnbG9nUmVhZEZpbGVzJ10gJiYgIShmbGFncyAmIDEpKSB7CiAgICAgICAgICBpZiAoIUZTLnJlYWRGaWxlcykgewogICAgICAgICAgICBGUy5yZWFkRmlsZXMgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghKHBhdGggaW4gRlMucmVhZEZpbGVzKSkgewogICAgICAgICAgICBGUy5yZWFkRmlsZXNbcGF0aF0gPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyZWFtOwogICAgICB9LAogICAgICBjbG9zZShzdHJlYW0pIHsKICAgICAgICBpZiAoRlMuaXNDbG9zZWQoc3RyZWFtKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0uZ2V0ZGVudHMpIHsKICAgICAgICAgIHN0cmVhbS5nZXRkZW50cyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAoc3RyZWFtLnN0cmVhbV9vcHMuY2xvc2UpIHsKICAgICAgICAgICAgc3RyZWFtLnN0cmVhbV9vcHMuY2xvc2Uoc3RyZWFtKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBGUy5jbG9zZVN0cmVhbShzdHJlYW0uZmQpOwogICAgICAgIH0KICAgICAgICBzdHJlYW0uZmQgPSBudWxsOwogICAgICB9LAogICAgICBpc0Nsb3NlZChzdHJlYW0pIHsKICAgICAgICByZXR1cm4gc3RyZWFtLmZkID09PSBudWxsOwogICAgICB9LAogICAgICBsbHNlZWsoc3RyZWFtLCBvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmIChGUy5pc0Nsb3NlZChzdHJlYW0pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdHJlYW0uc2Vla2FibGUgfHwgIXN0cmVhbS5zdHJlYW1fb3BzLmxsc2VlaykgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNzApOwogICAgICAgIH0KICAgICAgICBpZiAod2hlbmNlICE9IDAgJiYgd2hlbmNlICE9IDEgJiYgd2hlbmNlICE9IDIpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtLnBvc2l0aW9uID0gc3RyZWFtLnN0cmVhbV9vcHMubGxzZWVrKHN0cmVhbSwgb2Zmc2V0LCB3aGVuY2UpOwogICAgICAgIHN0cmVhbS51bmdvdHRlbiA9IFtdOwogICAgICAgIHJldHVybiBzdHJlYW0ucG9zaXRpb247CiAgICAgIH0sCiAgICAgIHJlYWQoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbikgewogICAgICAgIGlmIChsZW5ndGggPCAwIHx8IHBvc2l0aW9uIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICAgIH0KICAgICAgICBpZiAoRlMuaXNDbG9zZWQoc3RyZWFtKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgICAgfQogICAgICAgIGlmICgoc3RyZWFtLmZsYWdzICYgMjA5NzE1NSkgPT09IDEpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpOwogICAgICAgIH0KICAgICAgICBpZiAoRlMuaXNEaXIoc3RyZWFtLm5vZGUubW9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDMxKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdHJlYW0uc3RyZWFtX29wcy5yZWFkKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWVraW5nID0gdHlwZW9mIHBvc2l0aW9uICE9ICd1bmRlZmluZWQnOwogICAgICAgIGlmICghc2Vla2luZykgewogICAgICAgICAgcG9zaXRpb24gPSBzdHJlYW0ucG9zaXRpb247CiAgICAgICAgfSBlbHNlIGlmICghc3RyZWFtLnNlZWthYmxlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig3MCk7CiAgICAgICAgfQogICAgICAgIHZhciBieXRlc1JlYWQgPSBzdHJlYW0uc3RyZWFtX29wcy5yZWFkKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pOwogICAgICAgIGlmICghc2Vla2luZykgewogICAgICAgICAgc3RyZWFtLnBvc2l0aW9uICs9IGJ5dGVzUmVhZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsKICAgICAgfSwKICAgICAgd3JpdGUoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FuT3duKSB7CiAgICAgICAgaWYgKGxlbmd0aCA8IDAgfHwgcG9zaXRpb24gPCAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIGlmIChGUy5pc0Nsb3NlZChzdHJlYW0pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KTsKICAgICAgICB9CiAgICAgICAgaWYgKChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSA9PT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgICAgfQogICAgICAgIGlmIChGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzEpOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbS5zdHJlYW1fb3BzLndyaXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0uc2Vla2FibGUgJiYgc3RyZWFtLmZsYWdzICYgMTAyNCkgewogICAgICAgICAgRlMubGxzZWVrKHN0cmVhbSwgMCwgMik7CiAgICAgICAgfQogICAgICAgIHZhciBzZWVraW5nID0gdHlwZW9mIHBvc2l0aW9uICE9ICd1bmRlZmluZWQnOwogICAgICAgIGlmICghc2Vla2luZykgewogICAgICAgICAgcG9zaXRpb24gPSBzdHJlYW0ucG9zaXRpb247CiAgICAgICAgfSBlbHNlIGlmICghc3RyZWFtLnNlZWthYmxlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig3MCk7CiAgICAgICAgfQogICAgICAgIHZhciBieXRlc1dyaXR0ZW4gPSBzdHJlYW0uc3RyZWFtX29wcy53cml0ZShzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYW5Pd24pOwogICAgICAgIGlmICghc2Vla2luZykgewogICAgICAgICAgc3RyZWFtLnBvc2l0aW9uICs9IGJ5dGVzV3JpdHRlbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKICAgICAgfSwKICAgICAgYWxsb2NhdGUoc3RyZWFtLCBvZmZzZXQsIGxlbmd0aCkgewogICAgICAgIGlmIChGUy5pc0Nsb3NlZChzdHJlYW0pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgbGVuZ3RoIDw9IDApIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgICB9CiAgICAgICAgaWYgKChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSA9PT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgICAgfQogICAgICAgIGlmICghRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpICYmICFGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDMpOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMzgpOwogICAgICAgIH0KICAgICAgICBzdHJlYW0uc3RyZWFtX29wcy5hbGxvY2F0ZShzdHJlYW0sIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgfSwKICAgICAgbW1hcChzdHJlYW0sIGxlbmd0aCwgcG9zaXRpb24sIHByb3QsIGZsYWdzKSB7CiAgICAgICAgaWYgKChwcm90ICYgMikgIT09IDAgJiYgKGZsYWdzICYgMikgPT09IDAgJiYgKHN0cmVhbS5mbGFncyAmIDIwOTcxNTUpICE9PSAyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyKTsKICAgICAgICB9CiAgICAgICAgaWYgKChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSA9PT0gMSkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMik7CiAgICAgICAgfQogICAgICAgIGlmICghc3RyZWFtLnN0cmVhbV9vcHMubW1hcCkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMubW1hcChzdHJlYW0sIGxlbmd0aCwgcG9zaXRpb24sIHByb3QsIGZsYWdzKTsKICAgICAgfSwKICAgICAgbXN5bmMoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBtbWFwRmxhZ3MpIHsKICAgICAgICBpZiAoIXN0cmVhbS5zdHJlYW1fb3BzLm1zeW5jKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLm1zeW5jKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgbW1hcEZsYWdzKTsKICAgICAgfSwKICAgICAgbXVubWFwOiAoc3RyZWFtKSA9PiAwLAogICAgICBpb2N0bChzdHJlYW0sIGNtZCwgYXJnKSB7CiAgICAgICAgaWYgKCFzdHJlYW0uc3RyZWFtX29wcy5pb2N0bCkgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwoc3RyZWFtLCBjbWQsIGFyZyk7CiAgICAgIH0sCiAgICAgIHJlYWRGaWxlKHBhdGgsIG9wdHMgPSB7fSkgewogICAgICAgIG9wdHMuZmxhZ3MgPSBvcHRzLmZsYWdzIHx8IDA7CiAgICAgICAgb3B0cy5lbmNvZGluZyA9IG9wdHMuZW5jb2RpbmcgfHwgJ2JpbmFyeSc7CiAgICAgICAgaWYgKG9wdHMuZW5jb2RpbmcgIT09ICd1dGY4JyAmJiBvcHRzLmVuY29kaW5nICE9PSAnYmluYXJ5JykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVuY29kaW5nIHR5cGUgIiR7b3B0cy5lbmNvZGluZ30iYCk7CiAgICAgICAgfQogICAgICAgIHZhciByZXQ7CiAgICAgICAgdmFyIHN0cmVhbSA9IEZTLm9wZW4ocGF0aCwgb3B0cy5mbGFncyk7CiAgICAgICAgdmFyIHN0YXQgPSBGUy5zdGF0KHBhdGgpOwogICAgICAgIHZhciBsZW5ndGggPSBzdGF0LnNpemU7CiAgICAgICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgICAgICAgRlMucmVhZChzdHJlYW0sIGJ1ZiwgMCwgbGVuZ3RoLCAwKTsKICAgICAgICBpZiAob3B0cy5lbmNvZGluZyA9PT0gJ3V0ZjgnKSB7CiAgICAgICAgICByZXQgPSBVVEY4QXJyYXlUb1N0cmluZyhidWYsIDApOwogICAgICAgIH0gZWxzZSBpZiAob3B0cy5lbmNvZGluZyA9PT0gJ2JpbmFyeScpIHsKICAgICAgICAgIHJldCA9IGJ1ZjsKICAgICAgICB9CiAgICAgICAgRlMuY2xvc2Uoc3RyZWFtKTsKICAgICAgICByZXR1cm4gcmV0OwogICAgICB9LAogICAgICB3cml0ZUZpbGUocGF0aCwgZGF0YSwgb3B0cyA9IHt9KSB7CiAgICAgICAgb3B0cy5mbGFncyA9IG9wdHMuZmxhZ3MgfHwgNTc3OwogICAgICAgIHZhciBzdHJlYW0gPSBGUy5vcGVuKHBhdGgsIG9wdHMuZmxhZ3MsIG9wdHMubW9kZSk7CiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7CiAgICAgICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoQnl0ZXNVVEY4KGRhdGEpICsgMSk7CiAgICAgICAgICB2YXIgYWN0dWFsTnVtQnl0ZXMgPSBzdHJpbmdUb1VURjhBcnJheShkYXRhLCBidWYsIDAsIGJ1Zi5sZW5ndGgpOwogICAgICAgICAgRlMud3JpdGUoc3RyZWFtLCBidWYsIDAsIGFjdHVhbE51bUJ5dGVzLCB1bmRlZmluZWQsIG9wdHMuY2FuT3duKTsKICAgICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhkYXRhKSkgewogICAgICAgICAgRlMud3JpdGUoc3RyZWFtLCBkYXRhLCAwLCBkYXRhLmJ5dGVMZW5ndGgsIHVuZGVmaW5lZCwgb3B0cy5jYW5Pd24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGEgdHlwZScpOwogICAgICAgIH0KICAgICAgICBGUy5jbG9zZShzdHJlYW0pOwogICAgICB9LAogICAgICBjd2Q6ICgpID0+IEZTLmN1cnJlbnRQYXRoLAogICAgICBjaGRpcihwYXRoKSB7CiAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6IHRydWUgfSk7CiAgICAgICAgaWYgKGxvb2t1cC5ub2RlID09PSBudWxsKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgICAgfQogICAgICAgIGlmICghRlMuaXNEaXIobG9va3VwLm5vZGUubW9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDU0KTsKICAgICAgICB9CiAgICAgICAgdmFyIGVyckNvZGUgPSBGUy5ub2RlUGVybWlzc2lvbnMobG9va3VwLm5vZGUsICd4Jyk7CiAgICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpOwogICAgICAgIH0KICAgICAgICBGUy5jdXJyZW50UGF0aCA9IGxvb2t1cC5wYXRoOwogICAgICB9LAogICAgICBjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKSB7CiAgICAgICAgRlMubWtkaXIoJy90bXAnKTsKICAgICAgICBGUy5ta2RpcignL2hvbWUnKTsKICAgICAgICBGUy5ta2RpcignL2hvbWUvd2ViX3VzZXInKTsKICAgICAgfSwKICAgICAgY3JlYXRlRGVmYXVsdERldmljZXMoKSB7CiAgICAgICAgRlMubWtkaXIoJy9kZXYnKTsKICAgICAgICBGUy5yZWdpc3RlckRldmljZShGUy5tYWtlZGV2KDEsIDMpLCB7IHJlYWQ6ICgpID0+IDAsIHdyaXRlOiAoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3MpID0+IGxlbmd0aCB9KTsKICAgICAgICBGUy5ta2RldignL2Rldi9udWxsJywgRlMubWFrZWRldigxLCAzKSk7CiAgICAgICAgVFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNSwgMCksIFRUWS5kZWZhdWx0X3R0eV9vcHMpOwogICAgICAgIFRUWS5yZWdpc3RlcihGUy5tYWtlZGV2KDYsIDApLCBUVFkuZGVmYXVsdF90dHkxX29wcyk7CiAgICAgICAgRlMubWtkZXYoJy9kZXYvdHR5JywgRlMubWFrZWRldig1LCAwKSk7CiAgICAgICAgRlMubWtkZXYoJy9kZXYvdHR5MScsIEZTLm1ha2VkZXYoNiwgMCkpOwogICAgICAgIHZhciByYW5kb21CdWZmZXIgPSBuZXcgVWludDhBcnJheSgxMDI0KSwKICAgICAgICAgIHJhbmRvbUxlZnQgPSAwOwogICAgICAgIHZhciByYW5kb21CeXRlID0gKCkgPT4gewogICAgICAgICAgaWYgKHJhbmRvbUxlZnQgPT09IDApIHsKICAgICAgICAgICAgcmFuZG9tTGVmdCA9IHJhbmRvbUZpbGwocmFuZG9tQnVmZmVyKS5ieXRlTGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJhbmRvbUJ1ZmZlclstLXJhbmRvbUxlZnRdOwogICAgICAgIH07CiAgICAgICAgRlMuY3JlYXRlRGV2aWNlKCcvZGV2JywgJ3JhbmRvbScsIHJhbmRvbUJ5dGUpOwogICAgICAgIEZTLmNyZWF0ZURldmljZSgnL2RldicsICd1cmFuZG9tJywgcmFuZG9tQnl0ZSk7CiAgICAgICAgRlMubWtkaXIoJy9kZXYvc2htJyk7CiAgICAgICAgRlMubWtkaXIoJy9kZXYvc2htL3RtcCcpOwogICAgICB9LAogICAgICBjcmVhdGVTcGVjaWFsRGlyZWN0b3JpZXMoKSB7CiAgICAgICAgRlMubWtkaXIoJy9wcm9jJyk7CiAgICAgICAgdmFyIHByb2Nfc2VsZiA9IEZTLm1rZGlyKCcvcHJvYy9zZWxmJyk7CiAgICAgICAgRlMubWtkaXIoJy9wcm9jL3NlbGYvZmQnKTsKICAgICAgICBGUy5tb3VudCgKICAgICAgICAgIHsKICAgICAgICAgICAgbW91bnQoKSB7CiAgICAgICAgICAgICAgdmFyIG5vZGUgPSBGUy5jcmVhdGVOb2RlKHByb2Nfc2VsZiwgJ2ZkJywgMTYzODQgfCA1MTEsIDczKTsKICAgICAgICAgICAgICBub2RlLm5vZGVfb3BzID0gewogICAgICAgICAgICAgICAgbG9va3VwKHBhcmVudCwgbmFtZSkgewogICAgICAgICAgICAgICAgICB2YXIgZmQgPSArbmFtZTsKICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbUNoZWNrZWQoZmQpOwogICAgICAgICAgICAgICAgICB2YXIgcmV0ID0geyBwYXJlbnQ6IG51bGwsIG1vdW50OiB7IG1vdW50cG9pbnQ6ICdmYWtlJyB9LCBub2RlX29wczogeyByZWFkbGluazogKCkgPT4gc3RyZWFtLnBhdGggfSB9OwogICAgICAgICAgICAgICAgICByZXQucGFyZW50ID0gcmV0OwogICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICB7fSwKICAgICAgICAgICcvcHJvYy9zZWxmL2ZkJwogICAgICAgICk7CiAgICAgIH0sCiAgICAgIGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpIHsKICAgICAgICBpZiAoTW9kdWxlWydzdGRpbiddKSB7CiAgICAgICAgICBGUy5jcmVhdGVEZXZpY2UoJy9kZXYnLCAnc3RkaW4nLCBNb2R1bGVbJ3N0ZGluJ10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBGUy5zeW1saW5rKCcvZGV2L3R0eScsICcvZGV2L3N0ZGluJyk7CiAgICAgICAgfQogICAgICAgIGlmIChNb2R1bGVbJ3N0ZG91dCddKSB7CiAgICAgICAgICBGUy5jcmVhdGVEZXZpY2UoJy9kZXYnLCAnc3Rkb3V0JywgbnVsbCwgTW9kdWxlWydzdGRvdXQnXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEZTLnN5bWxpbmsoJy9kZXYvdHR5JywgJy9kZXYvc3Rkb3V0Jyk7CiAgICAgICAgfQogICAgICAgIGlmIChNb2R1bGVbJ3N0ZGVyciddKSB7CiAgICAgICAgICBGUy5jcmVhdGVEZXZpY2UoJy9kZXYnLCAnc3RkZXJyJywgbnVsbCwgTW9kdWxlWydzdGRlcnInXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEZTLnN5bWxpbmsoJy9kZXYvdHR5MScsICcvZGV2L3N0ZGVycicpOwogICAgICAgIH0KICAgICAgICB2YXIgc3RkaW4gPSBGUy5vcGVuKCcvZGV2L3N0ZGluJywgMCk7CiAgICAgICAgdmFyIHN0ZG91dCA9IEZTLm9wZW4oJy9kZXYvc3Rkb3V0JywgMSk7CiAgICAgICAgdmFyIHN0ZGVyciA9IEZTLm9wZW4oJy9kZXYvc3RkZXJyJywgMSk7CiAgICAgIH0sCiAgICAgIHN0YXRpY0luaXQoKSB7CiAgICAgICAgWzQ0XS5mb3JFYWNoKChjb2RlKSA9PiB7CiAgICAgICAgICBGUy5nZW5lcmljRXJyb3JzW2NvZGVdID0gbmV3IEZTLkVycm5vRXJyb3IoY29kZSk7CiAgICAgICAgICBGUy5nZW5lcmljRXJyb3JzW2NvZGVdLnN0YWNrID0gJzxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4nOwogICAgICAgIH0pOwogICAgICAgIEZTLm5hbWVUYWJsZSA9IG5ldyBBcnJheSg0MDk2KTsKICAgICAgICBGUy5tb3VudChNRU1GUywge30sICcvJyk7CiAgICAgICAgRlMuY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCk7CiAgICAgICAgRlMuY3JlYXRlRGVmYXVsdERldmljZXMoKTsKICAgICAgICBGUy5jcmVhdGVTcGVjaWFsRGlyZWN0b3JpZXMoKTsKICAgICAgICBGUy5maWxlc3lzdGVtcyA9IHsgTUVNRlM6IE1FTUZTIH07CiAgICAgIH0sCiAgICAgIGluaXQoaW5wdXQsIG91dHB1dCwgZXJyb3IpIHsKICAgICAgICBGUy5pbml0LmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICBNb2R1bGVbJ3N0ZGluJ10gPSBpbnB1dCB8fCBNb2R1bGVbJ3N0ZGluJ107CiAgICAgICAgTW9kdWxlWydzdGRvdXQnXSA9IG91dHB1dCB8fCBNb2R1bGVbJ3N0ZG91dCddOwogICAgICAgIE1vZHVsZVsnc3RkZXJyJ10gPSBlcnJvciB8fCBNb2R1bGVbJ3N0ZGVyciddOwogICAgICAgIEZTLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpOwogICAgICB9LAogICAgICBxdWl0KCkgewogICAgICAgIEZTLmluaXQuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IEZTLnN0cmVhbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBzdHJlYW0gPSBGUy5zdHJlYW1zW2ldOwogICAgICAgICAgaWYgKCFzdHJlYW0pIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBGUy5jbG9zZShzdHJlYW0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZmluZE9iamVjdChwYXRoLCBkb250UmVzb2x2ZUxhc3RMaW5rKSB7CiAgICAgICAgdmFyIHJldCA9IEZTLmFuYWx5emVQYXRoKHBhdGgsIGRvbnRSZXNvbHZlTGFzdExpbmspOwogICAgICAgIGlmICghcmV0LmV4aXN0cykgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQub2JqZWN0OwogICAgICB9LAogICAgICBhbmFseXplUGF0aChwYXRoLCBkb250UmVzb2x2ZUxhc3RMaW5rKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgZm9sbG93OiAhZG9udFJlc29sdmVMYXN0TGluayB9KTsKICAgICAgICAgIHBhdGggPSBsb29rdXAucGF0aDsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIHZhciByZXQgPSB7CiAgICAgICAgICBpc1Jvb3Q6IGZhbHNlLAogICAgICAgICAgZXhpc3RzOiBmYWxzZSwKICAgICAgICAgIGVycm9yOiAwLAogICAgICAgICAgbmFtZTogbnVsbCwKICAgICAgICAgIHBhdGg6IG51bGwsCiAgICAgICAgICBvYmplY3Q6IG51bGwsCiAgICAgICAgICBwYXJlbnRFeGlzdHM6IGZhbHNlLAogICAgICAgICAgcGFyZW50UGF0aDogbnVsbCwKICAgICAgICAgIHBhcmVudE9iamVjdDogbnVsbAogICAgICAgIH07CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICAgICAgcmV0LnBhcmVudEV4aXN0cyA9IHRydWU7CiAgICAgICAgICByZXQucGFyZW50UGF0aCA9IGxvb2t1cC5wYXRoOwogICAgICAgICAgcmV0LnBhcmVudE9iamVjdCA9IGxvb2t1cC5ub2RlOwogICAgICAgICAgcmV0Lm5hbWUgPSBQQVRILmJhc2VuYW1lKHBhdGgpOwogICAgICAgICAgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogIWRvbnRSZXNvbHZlTGFzdExpbmsgfSk7CiAgICAgICAgICByZXQuZXhpc3RzID0gdHJ1ZTsKICAgICAgICAgIHJldC5wYXRoID0gbG9va3VwLnBhdGg7CiAgICAgICAgICByZXQub2JqZWN0ID0gbG9va3VwLm5vZGU7CiAgICAgICAgICByZXQubmFtZSA9IGxvb2t1cC5ub2RlLm5hbWU7CiAgICAgICAgICByZXQuaXNSb290ID0gbG9va3VwLnBhdGggPT09ICcvJzsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICByZXQuZXJyb3IgPSBlLmVycm5vOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9LAogICAgICBjcmVhdGVQYXRoKHBhcmVudCwgcGF0aCwgY2FuUmVhZCwgY2FuV3JpdGUpIHsKICAgICAgICBwYXJlbnQgPSB0eXBlb2YgcGFyZW50ID09ICdzdHJpbmcnID8gcGFyZW50IDogRlMuZ2V0UGF0aChwYXJlbnQpOwogICAgICAgIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKS5yZXZlcnNlKCk7CiAgICAgICAgd2hpbGUgKHBhcnRzLmxlbmd0aCkgewogICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0cy5wb3AoKTsKICAgICAgICAgIGlmICghcGFydCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBjdXJyZW50ID0gUEFUSC5qb2luMihwYXJlbnQsIHBhcnQpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgRlMubWtkaXIoY3VycmVudCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgcGFyZW50ID0gY3VycmVudDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgIH0sCiAgICAgIGNyZWF0ZUZpbGUocGFyZW50LCBuYW1lLCBwcm9wZXJ0aWVzLCBjYW5SZWFkLCBjYW5Xcml0ZSkgewogICAgICAgIHZhciBwYXRoID0gUEFUSC5qb2luMih0eXBlb2YgcGFyZW50ID09ICdzdHJpbmcnID8gcGFyZW50IDogRlMuZ2V0UGF0aChwYXJlbnQpLCBuYW1lKTsKICAgICAgICB2YXIgbW9kZSA9IEZTX2dldE1vZGUoY2FuUmVhZCwgY2FuV3JpdGUpOwogICAgICAgIHJldHVybiBGUy5jcmVhdGUocGF0aCwgbW9kZSk7CiAgICAgIH0sCiAgICAgIGNyZWF0ZURhdGFGaWxlKHBhcmVudCwgbmFtZSwgZGF0YSwgY2FuUmVhZCwgY2FuV3JpdGUsIGNhbk93bikgewogICAgICAgIHZhciBwYXRoID0gbmFtZTsKICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICBwYXJlbnQgPSB0eXBlb2YgcGFyZW50ID09ICdzdHJpbmcnID8gcGFyZW50IDogRlMuZ2V0UGF0aChwYXJlbnQpOwogICAgICAgICAgcGF0aCA9IG5hbWUgPyBQQVRILmpvaW4yKHBhcmVudCwgbmFtZSkgOiBwYXJlbnQ7CiAgICAgICAgfQogICAgICAgIHZhciBtb2RlID0gRlNfZ2V0TW9kZShjYW5SZWFkLCBjYW5Xcml0ZSk7CiAgICAgICAgdmFyIG5vZGUgPSBGUy5jcmVhdGUocGF0aCwgbW9kZSk7CiAgICAgICAgaWYgKGRhdGEpIHsKICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB2YXIgYXJyID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICAgICAgICBhcnJbaV0gPSBkYXRhLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YSA9IGFycjsKICAgICAgICAgIH0KICAgICAgICAgIEZTLmNobW9kKG5vZGUsIG1vZGUgfCAxNDYpOwogICAgICAgICAgdmFyIHN0cmVhbSA9IEZTLm9wZW4obm9kZSwgNTc3KTsKICAgICAgICAgIEZTLndyaXRlKHN0cmVhbSwgZGF0YSwgMCwgZGF0YS5sZW5ndGgsIDAsIGNhbk93bik7CiAgICAgICAgICBGUy5jbG9zZShzdHJlYW0pOwogICAgICAgICAgRlMuY2htb2Qobm9kZSwgbW9kZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBjcmVhdGVEZXZpY2UocGFyZW50LCBuYW1lLCBpbnB1dCwgb3V0cHV0KSB7CiAgICAgICAgdmFyIHBhdGggPSBQQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQgPT0gJ3N0cmluZycgPyBwYXJlbnQgOiBGUy5nZXRQYXRoKHBhcmVudCksIG5hbWUpOwogICAgICAgIHZhciBtb2RlID0gRlNfZ2V0TW9kZSghIWlucHV0LCAhIW91dHB1dCk7CiAgICAgICAgaWYgKCFGUy5jcmVhdGVEZXZpY2UubWFqb3IpIHsKICAgICAgICAgIEZTLmNyZWF0ZURldmljZS5tYWpvciA9IDY0OwogICAgICAgIH0KICAgICAgICB2YXIgZGV2ID0gRlMubWFrZWRldihGUy5jcmVhdGVEZXZpY2UubWFqb3IrKywgMCk7CiAgICAgICAgRlMucmVnaXN0ZXJEZXZpY2UoZGV2LCB7CiAgICAgICAgICBvcGVuKHN0cmVhbSkgewogICAgICAgICAgICBzdHJlYW0uc2Vla2FibGUgPSBmYWxzZTsKICAgICAgICAgIH0sCiAgICAgICAgICBjbG9zZShzdHJlYW0pIHsKICAgICAgICAgICAgaWYgKG91dHB1dD8uYnVmZmVyPy5sZW5ndGgpIHsKICAgICAgICAgICAgICBvdXRwdXQoMTApOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgcmVhZChzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvcykgewogICAgICAgICAgICB2YXIgYnl0ZXNSZWFkID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlucHV0KCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgJiYgYnl0ZXNSZWFkID09PSAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJ5dGVzUmVhZCsrOwogICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnl0ZXNSZWFkKSB7CiAgICAgICAgICAgICAgc3RyZWFtLm5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYnl0ZXNSZWFkOwogICAgICAgICAgfSwKICAgICAgICAgIHdyaXRlKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgb3V0cHV0KGJ1ZmZlcltvZmZzZXQgKyBpXSk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGVuZ3RoKSB7CiAgICAgICAgICAgICAgc3RyZWFtLm5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gRlMubWtkZXYocGF0aCwgbW9kZSwgZGV2KTsKICAgICAgfSwKICAgICAgZm9yY2VMb2FkRmlsZShvYmopIHsKICAgICAgICBpZiAob2JqLmlzRGV2aWNlIHx8IG9iai5pc0ZvbGRlciB8fCBvYmoubGluayB8fCBvYmouY29udGVudHMpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICdMYXp5IGxvYWRpbmcgc2hvdWxkIGhhdmUgYmVlbiBwZXJmb3JtZWQgKGNvbnRlbnRzIHNldCkgaW4gY3JlYXRlTGF6eUZpbGUsIGJ1dCBpdCB3YXMgbm90LiBMYXp5IGxvYWRpbmcgb25seSB3b3JrcyBpbiB3ZWIgd29ya2Vycy4gVXNlIC0tZW1iZWQtZmlsZSBvciAtLXByZWxvYWQtZmlsZSBpbiBlbWNjIG9uIHRoZSBtYWluIHRocmVhZC4nCiAgICAgICAgICApOwogICAgICAgIH0gZWxzZSBpZiAocmVhZF8pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG9iai5jb250ZW50cyA9IGludEFycmF5RnJvbVN0cmluZyhyZWFkXyhvYmoudXJsKSwgdHJ1ZSk7CiAgICAgICAgICAgIG9iai51c2VkQnl0ZXMgPSBvYmouY29udGVudHMubGVuZ3RoOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxvYWQgd2l0aG91dCByZWFkKCkgb3IgWE1MSHR0cFJlcXVlc3QuJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBjcmVhdGVMYXp5RmlsZShwYXJlbnQsIG5hbWUsIHVybCwgY2FuUmVhZCwgY2FuV3JpdGUpIHsKICAgICAgICBmdW5jdGlvbiBMYXp5VWludDhBcnJheSgpIHsKICAgICAgICAgIHRoaXMubGVuZ3RoS25vd24gPSBmYWxzZTsKICAgICAgICAgIHRoaXMuY2h1bmtzID0gW107CiAgICAgICAgfQogICAgICAgIExhenlVaW50OEFycmF5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBMYXp5VWludDhBcnJheV9nZXQoaWR4KSB7CiAgICAgICAgICBpZiAoaWR4ID4gdGhpcy5sZW5ndGggLSAxIHx8IGlkeCA8IDApIHsKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBjaHVua09mZnNldCA9IGlkeCAlIHRoaXMuY2h1bmtTaXplOwogICAgICAgICAgdmFyIGNodW5rTnVtID0gKGlkeCAvIHRoaXMuY2h1bmtTaXplKSB8IDA7CiAgICAgICAgICByZXR1cm4gdGhpcy5nZXR0ZXIoY2h1bmtOdW0pW2NodW5rT2Zmc2V0XTsKICAgICAgICB9OwogICAgICAgIExhenlVaW50OEFycmF5LnByb3RvdHlwZS5zZXREYXRhR2V0dGVyID0gZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXlfc2V0RGF0YUdldHRlcihnZXR0ZXIpIHsKICAgICAgICAgIHRoaXMuZ2V0dGVyID0gZ2V0dGVyOwogICAgICAgIH07CiAgICAgICAgTGF6eVVpbnQ4QXJyYXkucHJvdG90eXBlLmNhY2hlTGVuZ3RoID0gZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXlfY2FjaGVMZW5ndGgoKSB7CiAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICB4aHIub3BlbignSEVBRCcsIHVybCwgZmFsc2UpOwogICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICBpZiAoISgoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkgfHwgeGhyLnN0YXR1cyA9PT0gMzA0KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGxvYWQgIiArIHVybCArICcuIFN0YXR1czogJyArIHhoci5zdGF0dXMpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGRhdGFsZW5ndGggPSBOdW1iZXIoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LWxlbmd0aCcpKTsKICAgICAgICAgIHZhciBoZWFkZXI7CiAgICAgICAgICB2YXIgaGFzQnl0ZVNlcnZpbmcgPSAoaGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdBY2NlcHQtUmFuZ2VzJykpICYmIGhlYWRlciA9PT0gJ2J5dGVzJzsKICAgICAgICAgIHZhciB1c2VzR3ppcCA9IChoZWFkZXIgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtRW5jb2RpbmcnKSkgJiYgaGVhZGVyID09PSAnZ3ppcCc7CiAgICAgICAgICB2YXIgY2h1bmtTaXplID0gMTAyNCAqIDEwMjQ7CiAgICAgICAgICBpZiAoIWhhc0J5dGVTZXJ2aW5nKSB7CiAgICAgICAgICAgIGNodW5rU2l6ZSA9IGRhdGFsZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgZG9YSFIgPSAoZnJvbSwgdG8pID0+IHsKICAgICAgICAgICAgaWYgKGZyb20gPiB0bykgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByYW5nZSAoJyArIGZyb20gKyAnLCAnICsgdG8gKyAnKSBvciBubyBieXRlcyByZXF1ZXN0ZWQhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRvID4gZGF0YWxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgJyArIGRhdGFsZW5ndGggKyAnIGJ5dGVzIGF2YWlsYWJsZSEgcHJvZ3JhbW1lciBlcnJvciEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKGRhdGFsZW5ndGggIT09IGNodW5rU2l6ZSkgewogICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdSYW5nZScsICdieXRlcz0nICsgZnJvbSArICctJyArIHRvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJzsKICAgICAgICAgICAgaWYgKHhoci5vdmVycmlkZU1pbWVUeXBlKSB7CiAgICAgICAgICAgICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgaWYgKCEoKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHx8IHhoci5zdGF0dXMgPT09IDMwNCkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGxvYWQgIiArIHVybCArICcuIFN0YXR1czogJyArIHhoci5zdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh4aHIucmVzcG9uc2UgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UgfHwgW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbnRBcnJheUZyb21TdHJpbmcoeGhyLnJlc3BvbnNlVGV4dCB8fCAnJywgdHJ1ZSk7CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIGxhenlBcnJheSA9IHRoaXM7CiAgICAgICAgICBsYXp5QXJyYXkuc2V0RGF0YUdldHRlcigoY2h1bmtOdW0pID0+IHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gY2h1bmtOdW0gKiBjaHVua1NpemU7CiAgICAgICAgICAgIHZhciBlbmQgPSAoY2h1bmtOdW0gKyAxKSAqIGNodW5rU2l6ZSAtIDE7CiAgICAgICAgICAgIGVuZCA9IE1hdGgubWluKGVuZCwgZGF0YWxlbmd0aCAtIDEpOwogICAgICAgICAgICBpZiAodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgbGF6eUFycmF5LmNodW5rc1tjaHVua051bV0gPSBkb1hIUihzdGFydCwgZW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb1hIUiBmYWlsZWQhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAodXNlc0d6aXAgfHwgIWRhdGFsZW5ndGgpIHsKICAgICAgICAgICAgY2h1bmtTaXplID0gZGF0YWxlbmd0aCA9IDE7CiAgICAgICAgICAgIGRhdGFsZW5ndGggPSB0aGlzLmdldHRlcigwKS5sZW5ndGg7CiAgICAgICAgICAgIGNodW5rU2l6ZSA9IGRhdGFsZW5ndGg7CiAgICAgICAgICAgIG91dCgnTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkJyk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9sZW5ndGggPSBkYXRhbGVuZ3RoOwogICAgICAgICAgdGhpcy5fY2h1bmtTaXplID0gY2h1bmtTaXplOwogICAgICAgICAgdGhpcy5sZW5ndGhLbm93biA9IHRydWU7CiAgICAgICAgfTsKICAgICAgICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICBpZiAoIUVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgICAgICB0aHJvdyAnQ2Fubm90IGRvIHN5bmNocm9ub3VzIGJpbmFyeSBYSFJzIG91dHNpZGUgd2Vid29ya2VycyBpbiBtb2Rlcm4gYnJvd3NlcnMuIFVzZSAtLWVtYmVkLWZpbGUgb3IgLS1wcmVsb2FkLWZpbGUgaW4gZW1jYyc7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbGF6eUFycmF5ID0gbmV3IExhenlVaW50OEFycmF5KCk7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5QXJyYXksIHsKICAgICAgICAgICAgbGVuZ3RoOiB7CiAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubGVuZ3RoS25vd24pIHsKICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZUxlbmd0aCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xlbmd0aDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNodW5rU2l6ZTogewogICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmxlbmd0aEtub3duKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVMZW5ndGgoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaHVua1NpemU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0geyBpc0RldmljZTogZmFsc2UsIGNvbnRlbnRzOiBsYXp5QXJyYXkgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7IGlzRGV2aWNlOiBmYWxzZSwgdXJsOiB1cmwgfTsKICAgICAgICB9CiAgICAgICAgdmFyIG5vZGUgPSBGUy5jcmVhdGVGaWxlKHBhcmVudCwgbmFtZSwgcHJvcGVydGllcywgY2FuUmVhZCwgY2FuV3JpdGUpOwogICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRlbnRzKSB7CiAgICAgICAgICBub2RlLmNvbnRlbnRzID0gcHJvcGVydGllcy5jb250ZW50czsKICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnRpZXMudXJsKSB7CiAgICAgICAgICBub2RlLmNvbnRlbnRzID0gbnVsbDsKICAgICAgICAgIG5vZGUudXJsID0gcHJvcGVydGllcy51cmw7CiAgICAgICAgfQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5vZGUsIHsKICAgICAgICAgIHVzZWRCeXRlczogewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50cy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB2YXIgc3RyZWFtX29wcyA9IHt9OwogICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMobm9kZS5zdHJlYW1fb3BzKTsKICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4gewogICAgICAgICAgdmFyIGZuID0gbm9kZS5zdHJlYW1fb3BzW2tleV07CiAgICAgICAgICBzdHJlYW1fb3BzW2tleV0gPSBmdW5jdGlvbiBmb3JjZUxvYWRMYXp5RmlsZSgpIHsKICAgICAgICAgICAgRlMuZm9yY2VMb2FkRmlsZShub2RlKTsKICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIGZ1bmN0aW9uIHdyaXRlQ2h1bmtzKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHsKICAgICAgICAgIHZhciBjb250ZW50cyA9IHN0cmVhbS5ub2RlLmNvbnRlbnRzOwogICAgICAgICAgaWYgKHBvc2l0aW9uID49IGNvbnRlbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBzaXplID0gTWF0aC5taW4oY29udGVudHMubGVuZ3RoIC0gcG9zaXRpb24sIGxlbmd0aCk7CiAgICAgICAgICBpZiAoY29udGVudHMuc2xpY2UpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBjb250ZW50c1twb3NpdGlvbiArIGldOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGNvbnRlbnRzLmdldChwb3NpdGlvbiArIGkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtX29wcy5yZWFkID0gKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pID0+IHsKICAgICAgICAgIEZTLmZvcmNlTG9hZEZpbGUobm9kZSk7CiAgICAgICAgICByZXR1cm4gd3JpdGVDaHVua3Moc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbik7CiAgICAgICAgfTsKICAgICAgICBzdHJlYW1fb3BzLm1tYXAgPSAoc3RyZWFtLCBsZW5ndGgsIHBvc2l0aW9uLCBwcm90LCBmbGFncykgPT4gewogICAgICAgICAgRlMuZm9yY2VMb2FkRmlsZShub2RlKTsKICAgICAgICAgIHZhciBwdHIgPSBtbWFwQWxsb2MobGVuZ3RoKTsKICAgICAgICAgIGlmICghcHRyKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ4KTsKICAgICAgICAgIH0KICAgICAgICAgIHdyaXRlQ2h1bmtzKHN0cmVhbSwgSEVBUDgsIHB0ciwgbGVuZ3RoLCBwb3NpdGlvbik7CiAgICAgICAgICByZXR1cm4geyBwdHI6IHB0ciwgYWxsb2NhdGVkOiB0cnVlIH07CiAgICAgICAgfTsKICAgICAgICBub2RlLnN0cmVhbV9vcHMgPSBzdHJlYW1fb3BzOwogICAgICAgIHJldHVybiBub2RlOwogICAgICB9CiAgICB9OwogICAgdmFyIFVURjhUb1N0cmluZyA9IChwdHIsIG1heEJ5dGVzVG9SZWFkKSA9PiAocHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICcnKTsKICAgIHZhciBTWVNDQUxMUyA9IHsKICAgICAgREVGQVVMVF9QT0xMTUFTSzogNSwKICAgICAgY2FsY3VsYXRlQXQoZGlyZmQsIHBhdGgsIGFsbG93RW1wdHkpIHsKICAgICAgICBpZiAoUEFUSC5pc0FicyhwYXRoKSkgewogICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgICAgfQogICAgICAgIHZhciBkaXI7CiAgICAgICAgaWYgKGRpcmZkID09PSAtMTAwKSB7CiAgICAgICAgICBkaXIgPSBGUy5jd2QoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGRpcnN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRChkaXJmZCk7CiAgICAgICAgICBkaXIgPSBkaXJzdHJlYW0ucGF0aDsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09IDApIHsKICAgICAgICAgIGlmICghYWxsb3dFbXB0eSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZGlyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUEFUSC5qb2luMihkaXIsIHBhdGgpOwogICAgICB9LAogICAgICBkb1N0YXQoZnVuYywgcGF0aCwgYnVmKSB7CiAgICAgICAgdmFyIHN0YXQgPSBmdW5jKHBhdGgpOwogICAgICAgIEhFQVAzMltidWYgPj4gMl0gPSBzdGF0LmRldjsKICAgICAgICBIRUFQMzJbKGJ1ZiArIDQpID4+IDJdID0gc3RhdC5tb2RlOwogICAgICAgIEhFQVBVMzJbKGJ1ZiArIDgpID4+IDJdID0gc3RhdC5ubGluazsKICAgICAgICBIRUFQMzJbKGJ1ZiArIDEyKSA+PiAyXSA9IHN0YXQudWlkOwogICAgICAgIEhFQVAzMlsoYnVmICsgMTYpID4+IDJdID0gc3RhdC5naWQ7CiAgICAgICAgSEVBUDMyWyhidWYgKyAyMCkgPj4gMl0gPSBzdGF0LnJkZXY7CiAgICAgICAgKHRlbXBJNjQgPSBbCiAgICAgICAgICBzdGF0LnNpemUgPj4+IDAsCiAgICAgICAgICAoKHRlbXBEb3VibGUgPSBzdGF0LnNpemUpLAogICAgICAgICAgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEKICAgICAgICAgICAgPyB0ZW1wRG91YmxlID4gMAogICAgICAgICAgICAgID8gK01hdGguZmxvb3IodGVtcERvdWJsZSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgICAgOiB+fitNYXRoLmNlaWwoKHRlbXBEb3VibGUgLSArKH5+dGVtcERvdWJsZSA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgOiAwKQogICAgICAgIF0pLAogICAgICAgICAgKEhFQVAzMlsoYnVmICsgMjQpID4+IDJdID0gdGVtcEk2NFswXSksCiAgICAgICAgICAoSEVBUDMyWyhidWYgKyAyOCkgPj4gMl0gPSB0ZW1wSTY0WzFdKTsKICAgICAgICBIRUFQMzJbKGJ1ZiArIDMyKSA+PiAyXSA9IDQwOTY7CiAgICAgICAgSEVBUDMyWyhidWYgKyAzNikgPj4gMl0gPSBzdGF0LmJsb2NrczsKICAgICAgICB2YXIgYXRpbWUgPSBzdGF0LmF0aW1lLmdldFRpbWUoKTsKICAgICAgICB2YXIgbXRpbWUgPSBzdGF0Lm10aW1lLmdldFRpbWUoKTsKICAgICAgICB2YXIgY3RpbWUgPSBzdGF0LmN0aW1lLmdldFRpbWUoKTsKICAgICAgICAodGVtcEk2NCA9IFsKICAgICAgICAgIE1hdGguZmxvb3IoYXRpbWUgLyAxZTMpID4+PiAwLAogICAgICAgICAgKCh0ZW1wRG91YmxlID0gTWF0aC5mbG9vcihhdGltZSAvIDFlMykpLAogICAgICAgICAgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEKICAgICAgICAgICAgPyB0ZW1wRG91YmxlID4gMAogICAgICAgICAgICAgID8gK01hdGguZmxvb3IodGVtcERvdWJsZSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgICAgOiB+fitNYXRoLmNlaWwoKHRlbXBEb3VibGUgLSArKH5+dGVtcERvdWJsZSA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgOiAwKQogICAgICAgIF0pLAogICAgICAgICAgKEhFQVAzMlsoYnVmICsgNDApID4+IDJdID0gdGVtcEk2NFswXSksCiAgICAgICAgICAoSEVBUDMyWyhidWYgKyA0NCkgPj4gMl0gPSB0ZW1wSTY0WzFdKTsKICAgICAgICBIRUFQVTMyWyhidWYgKyA0OCkgPj4gMl0gPSAoYXRpbWUgJSAxZTMpICogMWUzOwogICAgICAgICh0ZW1wSTY0ID0gWwogICAgICAgICAgTWF0aC5mbG9vcihtdGltZSAvIDFlMykgPj4+IDAsCiAgICAgICAgICAoKHRlbXBEb3VibGUgPSBNYXRoLmZsb29yKG10aW1lIC8gMWUzKSksCiAgICAgICAgICArTWF0aC5hYnModGVtcERvdWJsZSkgPj0gMQogICAgICAgICAgICA/IHRlbXBEb3VibGUgPiAwCiAgICAgICAgICAgICAgPyArTWF0aC5mbG9vcih0ZW1wRG91YmxlIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgICA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMAogICAgICAgICAgICA6IDApCiAgICAgICAgXSksCiAgICAgICAgICAoSEVBUDMyWyhidWYgKyA1NikgPj4gMl0gPSB0ZW1wSTY0WzBdKSwKICAgICAgICAgIChIRUFQMzJbKGJ1ZiArIDYwKSA+PiAyXSA9IHRlbXBJNjRbMV0pOwogICAgICAgIEhFQVBVMzJbKGJ1ZiArIDY0KSA+PiAyXSA9IChtdGltZSAlIDFlMykgKiAxZTM7CiAgICAgICAgKHRlbXBJNjQgPSBbCiAgICAgICAgICBNYXRoLmZsb29yKGN0aW1lIC8gMWUzKSA+Pj4gMCwKICAgICAgICAgICgodGVtcERvdWJsZSA9IE1hdGguZmxvb3IoY3RpbWUgLyAxZTMpKSwKICAgICAgICAgICtNYXRoLmFicyh0ZW1wRG91YmxlKSA+PSAxCiAgICAgICAgICAgID8gdGVtcERvdWJsZSA+IDAKICAgICAgICAgICAgICA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMAogICAgICAgICAgICAgIDogfn4rTWF0aC5jZWlsKCh0ZW1wRG91YmxlIC0gKyh+fnRlbXBEb3VibGUgPj4+IDApKSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgIDogMCkKICAgICAgICBdKSwKICAgICAgICAgIChIRUFQMzJbKGJ1ZiArIDcyKSA+PiAyXSA9IHRlbXBJNjRbMF0pLAogICAgICAgICAgKEhFQVAzMlsoYnVmICsgNzYpID4+IDJdID0gdGVtcEk2NFsxXSk7CiAgICAgICAgSEVBUFUzMlsoYnVmICsgODApID4+IDJdID0gKGN0aW1lICUgMWUzKSAqIDFlMzsKICAgICAgICAodGVtcEk2NCA9IFsKICAgICAgICAgIHN0YXQuaW5vID4+PiAwLAogICAgICAgICAgKCh0ZW1wRG91YmxlID0gc3RhdC5pbm8pLAogICAgICAgICAgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEKICAgICAgICAgICAgPyB0ZW1wRG91YmxlID4gMAogICAgICAgICAgICAgID8gK01hdGguZmxvb3IodGVtcERvdWJsZSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgICAgOiB+fitNYXRoLmNlaWwoKHRlbXBEb3VibGUgLSArKH5+dGVtcERvdWJsZSA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgOiAwKQogICAgICAgIF0pLAogICAgICAgICAgKEhFQVAzMlsoYnVmICsgODgpID4+IDJdID0gdGVtcEk2NFswXSksCiAgICAgICAgICAoSEVBUDMyWyhidWYgKyA5MikgPj4gMl0gPSB0ZW1wSTY0WzFdKTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfSwKICAgICAgZG9Nc3luYyhhZGRyLCBzdHJlYW0sIGxlbiwgZmxhZ3MsIG9mZnNldCkgewogICAgICAgIGlmICghRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myk7CiAgICAgICAgfQogICAgICAgIGlmIChmbGFncyAmIDIpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICB2YXIgYnVmZmVyID0gSEVBUFU4LnNsaWNlKGFkZHIsIGFkZHIgKyBsZW4pOwogICAgICAgIEZTLm1zeW5jKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbiwgZmxhZ3MpOwogICAgICB9LAogICAgICB2YXJhcmdzOiB1bmRlZmluZWQsCiAgICAgIGdldCgpIHsKICAgICAgICB2YXIgcmV0ID0gSEVBUDMyWytTWVNDQUxMUy52YXJhcmdzID4+IDJdOwogICAgICAgIFNZU0NBTExTLnZhcmFyZ3MgKz0gNDsKICAgICAgICByZXR1cm4gcmV0OwogICAgICB9LAogICAgICBnZXRwKCkgewogICAgICAgIHJldHVybiBTWVNDQUxMUy5nZXQoKTsKICAgICAgfSwKICAgICAgZ2V0U3RyKHB0cikgewogICAgICAgIHZhciByZXQgPSBVVEY4VG9TdHJpbmcocHRyKTsKICAgICAgICByZXR1cm4gcmV0OwogICAgICB9LAogICAgICBnZXRTdHJlYW1Gcm9tRkQoZmQpIHsKICAgICAgICB2YXIgc3RyZWFtID0gRlMuZ2V0U3RyZWFtQ2hlY2tlZChmZCk7CiAgICAgICAgcmV0dXJuIHN0cmVhbTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIF9fX3N5c2NhbGxfZmNudGw2NChmZCwgY21kLCB2YXJhcmdzKSB7CiAgICAgIFNZU0NBTExTLnZhcmFyZ3MgPSB2YXJhcmdzOwogICAgICB0cnkgewogICAgICAgIHZhciBzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZmQpOwogICAgICAgIHN3aXRjaCAoY21kKSB7CiAgICAgICAgICBjYXNlIDA6IHsKICAgICAgICAgICAgdmFyIGFyZyA9IFNZU0NBTExTLmdldCgpOwogICAgICAgICAgICBpZiAoYXJnIDwgMCkgewogICAgICAgICAgICAgIHJldHVybiAtMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKEZTLnN0cmVhbXNbYXJnXSkgewogICAgICAgICAgICAgIGFyZysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBuZXdTdHJlYW07CiAgICAgICAgICAgIG5ld1N0cmVhbSA9IEZTLmNyZWF0ZVN0cmVhbShzdHJlYW0sIGFyZyk7CiAgICAgICAgICAgIHJldHVybiBuZXdTdHJlYW0uZmQ7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICByZXR1cm4gc3RyZWFtLmZsYWdzOwogICAgICAgICAgY2FzZSA0OiB7CiAgICAgICAgICAgIHZhciBhcmcgPSBTWVNDQUxMUy5nZXQoKTsKICAgICAgICAgICAgc3RyZWFtLmZsYWdzIHw9IGFyZzsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDEyOiB7CiAgICAgICAgICAgIHZhciBhcmcgPSBTWVNDQUxMUy5nZXRwKCk7CiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOwogICAgICAgICAgICBIRUFQMTZbKGFyZyArIG9mZnNldCkgPj4gMV0gPSAyOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0yODsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gJ3VuZGVmaW5lZCcgfHwgIShlLm5hbWUgPT09ICdFcnJub0Vycm9yJykpIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX19fc3lzY2FsbF9mc3RhdDY0KGZkLCBidWYpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc3RyZWFtID0gU1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTsKICAgICAgICByZXR1cm4gU1lTQ0FMTFMuZG9TdGF0KEZTLnN0YXQsIHN0cmVhbS5wYXRoLCBidWYpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAndW5kZWZpbmVkJyB8fCAhKGUubmFtZSA9PT0gJ0Vycm5vRXJyb3InKSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC1lLmVycm5vOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfX19zeXNjYWxsX2lvY3RsKGZkLCBvcCwgdmFyYXJncykgewogICAgICBTWVNDQUxMUy52YXJhcmdzID0gdmFyYXJnczsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc3RyZWFtID0gU1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTsKICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICBjYXNlIDIxNTA5OiB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLnR0eSkgewogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTA1OiB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLnR0eSkgewogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmVhbS50dHkub3BzLmlvY3RsX3RjZ2V0cykgewogICAgICAgICAgICAgIHZhciB0ZXJtaW9zID0gc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGNnZXRzKHN0cmVhbSk7CiAgICAgICAgICAgICAgdmFyIGFyZ3AgPSBTWVNDQUxMUy5nZXRwKCk7CiAgICAgICAgICAgICAgSEVBUDMyW2FyZ3AgPj4gMl0gPSB0ZXJtaW9zLmNfaWZsYWcgfHwgMDsKICAgICAgICAgICAgICBIRUFQMzJbKGFyZ3AgKyA0KSA+PiAyXSA9IHRlcm1pb3MuY19vZmxhZyB8fCAwOwogICAgICAgICAgICAgIEhFQVAzMlsoYXJncCArIDgpID4+IDJdID0gdGVybWlvcy5jX2NmbGFnIHx8IDA7CiAgICAgICAgICAgICAgSEVBUDMyWyhhcmdwICsgMTIpID4+IDJdID0gdGVybWlvcy5jX2xmbGFnIHx8IDA7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CiAgICAgICAgICAgICAgICBIRUFQOFsoYXJncCArIGkgKyAxNykgPj4gMF0gPSB0ZXJtaW9zLmNfY2NbaV0gfHwgMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTEwOgogICAgICAgICAgY2FzZSAyMTUxMToKICAgICAgICAgIGNhc2UgMjE1MTI6IHsKICAgICAgICAgICAgaWYgKCFzdHJlYW0udHR5KSB7CiAgICAgICAgICAgICAgcmV0dXJuIC01OTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMjE1MDY6CiAgICAgICAgICBjYXNlIDIxNTA3OgogICAgICAgICAgY2FzZSAyMTUwODogewogICAgICAgICAgICBpZiAoIXN0cmVhbS50dHkpIHsKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW0udHR5Lm9wcy5pb2N0bF90Y3NldHMpIHsKICAgICAgICAgICAgICB2YXIgYXJncCA9IFNZU0NBTExTLmdldHAoKTsKICAgICAgICAgICAgICB2YXIgY19pZmxhZyA9IEhFQVAzMlthcmdwID4+IDJdOwogICAgICAgICAgICAgIHZhciBjX29mbGFnID0gSEVBUDMyWyhhcmdwICsgNCkgPj4gMl07CiAgICAgICAgICAgICAgdmFyIGNfY2ZsYWcgPSBIRUFQMzJbKGFyZ3AgKyA4KSA+PiAyXTsKICAgICAgICAgICAgICB2YXIgY19sZmxhZyA9IEhFQVAzMlsoYXJncCArIDEyKSA+PiAyXTsKICAgICAgICAgICAgICB2YXIgY19jYyA9IFtdOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKykgewogICAgICAgICAgICAgICAgY19jYy5wdXNoKEhFQVA4WyhhcmdwICsgaSArIDE3KSA+PiAwXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBzdHJlYW0udHR5Lm9wcy5pb2N0bF90Y3NldHMoc3RyZWFtLnR0eSwgb3AsIHsKICAgICAgICAgICAgICAgIGNfaWZsYWc6IGNfaWZsYWcsCiAgICAgICAgICAgICAgICBjX29mbGFnOiBjX29mbGFnLAogICAgICAgICAgICAgICAgY19jZmxhZzogY19jZmxhZywKICAgICAgICAgICAgICAgIGNfbGZsYWc6IGNfbGZsYWcsCiAgICAgICAgICAgICAgICBjX2NjOiBjX2NjCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTE5OiB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLnR0eSkgewogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFyZ3AgPSBTWVNDQUxMUy5nZXRwKCk7CiAgICAgICAgICAgIEhFQVAzMlthcmdwID4+IDJdID0gMDsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTIwOiB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLnR0eSkgewogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC0yODsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMjE1MzE6IHsKICAgICAgICAgICAgdmFyIGFyZ3AgPSBTWVNDQUxMUy5nZXRwKCk7CiAgICAgICAgICAgIHJldHVybiBGUy5pb2N0bChzdHJlYW0sIG9wLCBhcmdwKTsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMjE1MjM6IHsKICAgICAgICAgICAgaWYgKCFzdHJlYW0udHR5KSB7CiAgICAgICAgICAgICAgcmV0dXJuIC01OTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeikgewogICAgICAgICAgICAgIHZhciB3aW5zaXplID0gc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihzdHJlYW0udHR5KTsKICAgICAgICAgICAgICB2YXIgYXJncCA9IFNZU0NBTExTLmdldHAoKTsKICAgICAgICAgICAgICBIRUFQMTZbYXJncCA+PiAxXSA9IHdpbnNpemVbMF07CiAgICAgICAgICAgICAgSEVBUDE2WyhhcmdwICsgMikgPj4gMV0gPSB3aW5zaXplWzFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyMTUyNDogewogICAgICAgICAgICBpZiAoIXN0cmVhbS50dHkpIHsKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyMTUxNTogewogICAgICAgICAgICBpZiAoIXN0cmVhbS50dHkpIHsKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIC0yODsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAodHlwZW9mIEZTID09ICd1bmRlZmluZWQnIHx8ICEoZS5uYW1lID09PSAnRXJybm9FcnJvcicpKSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLWUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9fX3N5c2NhbGxfbHN0YXQ2NChwYXRoLCBidWYpIHsKICAgICAgdHJ5IHsKICAgICAgICBwYXRoID0gU1lTQ0FMTFMuZ2V0U3RyKHBhdGgpOwogICAgICAgIHJldHVybiBTWVNDQUxMUy5kb1N0YXQoRlMubHN0YXQsIHBhdGgsIGJ1Zik7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAodHlwZW9mIEZTID09ICd1bmRlZmluZWQnIHx8ICEoZS5uYW1lID09PSAnRXJybm9FcnJvcicpKSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLWUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9fX3N5c2NhbGxfbmV3ZnN0YXRhdChkaXJmZCwgcGF0aCwgYnVmLCBmbGFncykgewogICAgICB0cnkgewogICAgICAgIHBhdGggPSBTWVNDQUxMUy5nZXRTdHIocGF0aCk7CiAgICAgICAgdmFyIG5vZm9sbG93ID0gZmxhZ3MgJiAyNTY7CiAgICAgICAgdmFyIGFsbG93RW1wdHkgPSBmbGFncyAmIDQwOTY7CiAgICAgICAgZmxhZ3MgPSBmbGFncyAmIH42NDAwOwogICAgICAgIHBhdGggPSBTWVNDQUxMUy5jYWxjdWxhdGVBdChkaXJmZCwgcGF0aCwgYWxsb3dFbXB0eSk7CiAgICAgICAgcmV0dXJuIFNZU0NBTExTLmRvU3RhdChub2ZvbGxvdyA/IEZTLmxzdGF0IDogRlMuc3RhdCwgcGF0aCwgYnVmKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gJ3VuZGVmaW5lZCcgfHwgIShlLm5hbWUgPT09ICdFcnJub0Vycm9yJykpIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX19fc3lzY2FsbF9vcGVuYXQoZGlyZmQsIHBhdGgsIGZsYWdzLCB2YXJhcmdzKSB7CiAgICAgIFNZU0NBTExTLnZhcmFyZ3MgPSB2YXJhcmdzOwogICAgICB0cnkgewogICAgICAgIHBhdGggPSBTWVNDQUxMUy5nZXRTdHIocGF0aCk7CiAgICAgICAgcGF0aCA9IFNZU0NBTExTLmNhbGN1bGF0ZUF0KGRpcmZkLCBwYXRoKTsKICAgICAgICB2YXIgbW9kZSA9IHZhcmFyZ3MgPyBTWVNDQUxMUy5nZXQoKSA6IDA7CiAgICAgICAgcmV0dXJuIEZTLm9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUpLmZkOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAndW5kZWZpbmVkJyB8fCAhKGUubmFtZSA9PT0gJ0Vycm5vRXJyb3InKSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC1lLmVycm5vOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfX19zeXNjYWxsX3N0YXQ2NChwYXRoLCBidWYpIHsKICAgICAgdHJ5IHsKICAgICAgICBwYXRoID0gU1lTQ0FMTFMuZ2V0U3RyKHBhdGgpOwogICAgICAgIHJldHVybiBTWVNDQUxMUy5kb1N0YXQoRlMuc3RhdCwgcGF0aCwgYnVmKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gJ3VuZGVmaW5lZCcgfHwgIShlLm5hbWUgPT09ICdFcnJub0Vycm9yJykpIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgfQogICAgfQogICAgdmFyIG5vd0lzTW9ub3RvbmljID0gMTsKICAgIHZhciBfX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMgPSAoKSA9PiBub3dJc01vbm90b25pYzsKICAgIHZhciBfX2Vtc2NyaXB0ZW5fdGhyb3dfbG9uZ2ptcCA9ICgpID0+IHsKICAgICAgdGhyb3cgSW5maW5pdHk7CiAgICB9OwogICAgdmFyIF9hYm9ydCA9ICgpID0+IHsKICAgICAgYWJvcnQoJycpOwogICAgfTsKICAgIHZhciBfZW1zY3JpcHRlbl9kYXRlX25vdyA9ICgpID0+IERhdGUubm93KCk7CiAgICB2YXIgZ2V0SGVhcE1heCA9ICgpID0+IDIxNDc0ODM2NDg7CiAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfbWF4ID0gKCkgPT4gZ2V0SGVhcE1heCgpOwogICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3c7CiAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gKCkgPT4gcGVyZm9ybWFuY2Uubm93KCk7CiAgICB2YXIgX2Vtc2NyaXB0ZW5fbWVtY3B5X2pzID0gKGRlc3QsIHNyYywgbnVtKSA9PiBIRUFQVTguY29weVdpdGhpbihkZXN0LCBzcmMsIHNyYyArIG51bSk7CiAgICB2YXIgZ3Jvd01lbW9yeSA9IChzaXplKSA9PiB7CiAgICAgIHZhciBiID0gd2FzbU1lbW9yeS5idWZmZXI7CiAgICAgIHZhciBwYWdlcyA9IChzaXplIC0gYi5ieXRlTGVuZ3RoICsgNjU1MzUpIC8gNjU1MzY7CiAgICAgIHRyeSB7CiAgICAgICAgd2FzbU1lbW9yeS5ncm93KHBhZ2VzKTsKICAgICAgICB1cGRhdGVNZW1vcnlWaWV3cygpOwogICAgICAgIHJldHVybiAxOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfTsKICAgIHZhciBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCA9IChyZXF1ZXN0ZWRTaXplKSA9PiB7CiAgICAgIHZhciBvbGRTaXplID0gSEVBUFU4Lmxlbmd0aDsKICAgICAgcmVxdWVzdGVkU2l6ZSA+Pj49IDA7CiAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IGdldEhlYXBNYXgoKTsKICAgICAgaWYgKHJlcXVlc3RlZFNpemUgPiBtYXhIZWFwU2l6ZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB2YXIgYWxpZ25VcCA9ICh4LCBtdWx0aXBsZSkgPT4geCArICgobXVsdGlwbGUgLSAoeCAlIG11bHRpcGxlKSkgJSBtdWx0aXBsZSk7CiAgICAgIGZvciAodmFyIGN1dERvd24gPSAxOyBjdXREb3duIDw9IDQ7IGN1dERvd24gKj0gMikgewogICAgICAgIHZhciBvdmVyR3Jvd25IZWFwU2l6ZSA9IG9sZFNpemUgKyA0MTk0MzA0IC8gY3V0RG93bjsKICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBncm93TWVtb3J5KG5ld1NpemUpOwogICAgICAgIGlmIChyZXBsYWNlbWVudCkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CiAgICB2YXIgRU5WID0ge307CiAgICB2YXIgZ2V0RXhlY3V0YWJsZU5hbWUgPSAoKSA9PiB0aGlzUHJvZ3JhbSB8fCAnLi90aGlzLnByb2dyYW0nOwogICAgdmFyIGdldEVudlN0cmluZ3MgPSAoKSA9PiB7CiAgICAgIGlmICghZ2V0RW52U3RyaW5ncy5zdHJpbmdzKSB7CiAgICAgICAgdmFyIGxhbmcgPQogICAgICAgICAgKCh0eXBlb2YgbmF2aWdhdG9yID09ICdvYmplY3QnICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSkgfHwgJ0MnKS5yZXBsYWNlKCctJywgJ18nKSArCiAgICAgICAgICAnLlVURi04JzsKICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgVVNFUjogJ3dlYl91c2VyJywKICAgICAgICAgIExPR05BTUU6ICd3ZWJfdXNlcicsCiAgICAgICAgICBQQVRIOiAnLycsCiAgICAgICAgICBQV0Q6ICcvJywKICAgICAgICAgIEhPTUU6ICcvaG9tZS93ZWJfdXNlcicsCiAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKQogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgIGlmIChFTlZbeF0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBkZWxldGUgZW52W3hdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW52W3hdID0gRU5WW3hdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgc3RyaW5ncyA9IFtdOwogICAgICAgIGZvciAodmFyIHggaW4gZW52KSB7CiAgICAgICAgICBzdHJpbmdzLnB1c2goYCR7eH09JHtlbnZbeF19YCk7CiAgICAgICAgfQogICAgICAgIGdldEVudlN0cmluZ3Muc3RyaW5ncyA9IHN0cmluZ3M7CiAgICAgIH0KICAgICAgcmV0dXJuIGdldEVudlN0cmluZ3Muc3RyaW5nczsKICAgIH07CiAgICB2YXIgc3RyaW5nVG9Bc2NpaSA9IChzdHIsIGJ1ZmZlcikgPT4gewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkgewogICAgICAgIEhFQVA4W2J1ZmZlcisrID4+IDBdID0gc3RyLmNoYXJDb2RlQXQoaSk7CiAgICAgIH0KICAgICAgSEVBUDhbYnVmZmVyID4+IDBdID0gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fZ2V0ID0gKF9fZW52aXJvbiwgZW52aXJvbl9idWYpID0+IHsKICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaCgoc3RyaW5nLCBpKSA9PiB7CiAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICBIRUFQVTMyWyhfX2Vudmlyb24gKyBpICogNCkgPj4gMl0gPSBwdHI7CiAgICAgICAgc3RyaW5nVG9Bc2NpaShzdHJpbmcsIHB0cik7CiAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgfSk7CiAgICAgIHJldHVybiAwOwogICAgfTsKICAgIHZhciBfZW52aXJvbl9zaXplc19nZXQgPSAocGVudmlyb25fY291bnQsIHBlbnZpcm9uX2J1Zl9zaXplKSA9PiB7CiAgICAgIHZhciBzdHJpbmdzID0gZ2V0RW52U3RyaW5ncygpOwogICAgICBIRUFQVTMyW3BlbnZpcm9uX2NvdW50ID4+IDJdID0gc3RyaW5ncy5sZW5ndGg7CiAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgc3RyaW5ncy5mb3JFYWNoKChzdHJpbmcpID0+IChidWZTaXplICs9IHN0cmluZy5sZW5ndGggKyAxKSk7CiAgICAgIEhFQVBVMzJbcGVudmlyb25fYnVmX3NpemUgPj4gMl0gPSBidWZTaXplOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgcnVudGltZUtlZXBhbGl2ZUNvdW50ZXIgPSAwOwogICAgdmFyIGtlZXBSdW50aW1lQWxpdmUgPSAoKSA9PiBub0V4aXRSdW50aW1lIHx8IHJ1bnRpbWVLZWVwYWxpdmVDb3VudGVyID4gMDsKICAgIHZhciBfcHJvY19leGl0ID0gKGNvZGUpID0+IHsKICAgICAgRVhJVFNUQVRVUyA9IGNvZGU7CiAgICAgIGlmICgha2VlcFJ1bnRpbWVBbGl2ZSgpKSB7CiAgICAgICAgTW9kdWxlWydvbkV4aXQnXT8uKGNvZGUpOwogICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgfQogICAgICBxdWl0Xyhjb2RlLCBuZXcgRXhpdFN0YXR1cyhjb2RlKSk7CiAgICB9OwogICAgdmFyIGV4aXRKUyA9IChzdGF0dXMsIGltcGxpY2l0KSA9PiB7CiAgICAgIEVYSVRTVEFUVVMgPSBzdGF0dXM7CiAgICAgIF9wcm9jX2V4aXQoc3RhdHVzKTsKICAgIH07CiAgICB2YXIgX2V4aXQgPSBleGl0SlM7CiAgICBmdW5jdGlvbiBfZmRfY2xvc2UoZmQpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc3RyZWFtID0gU1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTsKICAgICAgICBGUy5jbG9zZShzdHJlYW0pOwogICAgICAgIHJldHVybiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAndW5kZWZpbmVkJyB8fCAhKGUubmFtZSA9PT0gJ0Vycm5vRXJyb3InKSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIHZhciBkb1JlYWR2ID0gKHN0cmVhbSwgaW92LCBpb3ZjbnQsIG9mZnNldCkgPT4gewogICAgICB2YXIgcmV0ID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgewogICAgICAgIHZhciBwdHIgPSBIRUFQVTMyW2lvdiA+PiAyXTsKICAgICAgICB2YXIgbGVuID0gSEVBUFUzMlsoaW92ICsgNCkgPj4gMl07CiAgICAgICAgaW92ICs9IDg7CiAgICAgICAgdmFyIGN1cnIgPSBGUy5yZWFkKHN0cmVhbSwgSEVBUDgsIHB0ciwgbGVuLCBvZmZzZXQpOwogICAgICAgIGlmIChjdXJyIDwgMCkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXQgKz0gY3VycjsKICAgICAgICBpZiAoY3VyciA8IGxlbikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgb2Zmc2V0ICs9IGN1cnI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9OwogICAgZnVuY3Rpb24gX2ZkX3JlYWQoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7CiAgICAgICAgdmFyIG51bSA9IGRvUmVhZHYoc3RyZWFtLCBpb3YsIGlvdmNudCk7CiAgICAgICAgSEVBUFUzMltwbnVtID4+IDJdID0gbnVtOwogICAgICAgIHJldHVybiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAndW5kZWZpbmVkJyB8fCAhKGUubmFtZSA9PT0gJ0Vycm5vRXJyb3InKSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIHZhciBjb252ZXJ0STMyUGFpclRvSTUzQ2hlY2tlZCA9IChsbywgaGkpID0+CiAgICAgIChoaSArIDIwOTcxNTIpID4+PiAwIDwgNDE5NDMwNSAtICEhbG8gPyAobG8gPj4+IDApICsgaGkgKiA0Mjk0OTY3Mjk2IDogTmFOOwogICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoLCB3aGVuY2UsIG5ld09mZnNldCkgewogICAgICB2YXIgb2Zmc2V0ID0gY29udmVydEkzMlBhaXJUb0k1M0NoZWNrZWQob2Zmc2V0X2xvdywgb2Zmc2V0X2hpZ2gpOwogICAgICB0cnkgewogICAgICAgIGlmIChpc05hTihvZmZzZXQpKSB7CiAgICAgICAgICByZXR1cm4gNjE7CiAgICAgICAgfQogICAgICAgIHZhciBzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZmQpOwogICAgICAgIEZTLmxsc2VlayhzdHJlYW0sIG9mZnNldCwgd2hlbmNlKTsKICAgICAgICAodGVtcEk2NCA9IFsKICAgICAgICAgIHN0cmVhbS5wb3NpdGlvbiA+Pj4gMCwKICAgICAgICAgICgodGVtcERvdWJsZSA9IHN0cmVhbS5wb3NpdGlvbiksCiAgICAgICAgICArTWF0aC5hYnModGVtcERvdWJsZSkgPj0gMQogICAgICAgICAgICA/IHRlbXBEb3VibGUgPiAwCiAgICAgICAgICAgICAgPyArTWF0aC5mbG9vcih0ZW1wRG91YmxlIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgICA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMAogICAgICAgICAgICA6IDApCiAgICAgICAgXSksCiAgICAgICAgICAoSEVBUDMyW25ld09mZnNldCA+PiAyXSA9IHRlbXBJNjRbMF0pLAogICAgICAgICAgKEhFQVAzMlsobmV3T2Zmc2V0ICsgNCkgPj4gMl0gPSB0ZW1wSTY0WzFdKTsKICAgICAgICBpZiAoc3RyZWFtLmdldGRlbnRzICYmIG9mZnNldCA9PT0gMCAmJiB3aGVuY2UgPT09IDApIHsKICAgICAgICAgIHN0cmVhbS5nZXRkZW50cyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAndW5kZWZpbmVkJyB8fCAhKGUubmFtZSA9PT0gJ0Vycm5vRXJyb3InKSkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIHZhciBkb1dyaXRldiA9IChzdHJlYW0sIGlvdiwgaW92Y250LCBvZmZzZXQpID0+IHsKICAgICAgdmFyIHJldCA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICB2YXIgcHRyID0gSEVBUFUzMltpb3YgPj4gMl07CiAgICAgICAgdmFyIGxlbiA9IEhFQVBVMzJbKGlvdiArIDQpID4+IDJdOwogICAgICAgIGlvdiArPSA4OwogICAgICAgIHZhciBjdXJyID0gRlMud3JpdGUoc3RyZWFtLCBIRUFQOCwgcHRyLCBsZW4sIG9mZnNldCk7CiAgICAgICAgaWYgKGN1cnIgPCAwKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHJldCArPSBjdXJyOwogICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgb2Zmc2V0ICs9IGN1cnI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9OwogICAgZnVuY3Rpb24gX2ZkX3dyaXRlKGZkLCBpb3YsIGlvdmNudCwgcG51bSkgewogICAgICB0cnkgewogICAgICAgIHZhciBzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZmQpOwogICAgICAgIHZhciBudW0gPSBkb1dyaXRldihzdHJlYW0sIGlvdiwgaW92Y250KTsKICAgICAgICBIRUFQVTMyW3BudW0gPj4gMl0gPSBudW07CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAodHlwZW9mIEZTID09ICd1bmRlZmluZWQnIHx8ICEoZS5uYW1lID09PSAnRXJybm9FcnJvcicpKSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZS5lcnJubzsKICAgICAgfQogICAgfQogICAgdmFyIGlzTGVhcFllYXIgPSAoeWVhcikgPT4geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7CiAgICB2YXIgYXJyYXlTdW0gPSAoYXJyYXksIGluZGV4KSA9PiB7CiAgICAgIHZhciBzdW0gPSAwOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBpbmRleDsgc3VtICs9IGFycmF5W2krK10pIHt9CiAgICAgIHJldHVybiBzdW07CiAgICB9OwogICAgdmFyIE1PTlRIX0RBWVNfTEVBUCA9IFszMSwgMjksIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTsKICAgIHZhciBNT05USF9EQVlTX1JFR1VMQVIgPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07CiAgICB2YXIgYWRkRGF5cyA9IChkYXRlLCBkYXlzKSA9PiB7CiAgICAgIHZhciBuZXdEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpOwogICAgICB3aGlsZSAoZGF5cyA+IDApIHsKICAgICAgICB2YXIgbGVhcCA9IGlzTGVhcFllYXIobmV3RGF0ZS5nZXRGdWxsWWVhcigpKTsKICAgICAgICB2YXIgY3VycmVudE1vbnRoID0gbmV3RGF0ZS5nZXRNb250aCgpOwogICAgICAgIHZhciBkYXlzSW5DdXJyZW50TW9udGggPSAobGVhcCA/IE1PTlRIX0RBWVNfTEVBUCA6IE1PTlRIX0RBWVNfUkVHVUxBUilbY3VycmVudE1vbnRoXTsKICAgICAgICBpZiAoZGF5cyA+IGRheXNJbkN1cnJlbnRNb250aCAtIG5ld0RhdGUuZ2V0RGF0ZSgpKSB7CiAgICAgICAgICBkYXlzIC09IGRheXNJbkN1cnJlbnRNb250aCAtIG5ld0RhdGUuZ2V0RGF0ZSgpICsgMTsKICAgICAgICAgIG5ld0RhdGUuc2V0RGF0ZSgxKTsKICAgICAgICAgIGlmIChjdXJyZW50TW9udGggPCAxMSkgewogICAgICAgICAgICBuZXdEYXRlLnNldE1vbnRoKGN1cnJlbnRNb250aCArIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV3RGF0ZS5zZXRNb250aCgwKTsKICAgICAgICAgICAgbmV3RGF0ZS5zZXRGdWxsWWVhcihuZXdEYXRlLmdldEZ1bGxZZWFyKCkgKyAxKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpICsgZGF5cyk7CiAgICAgICAgICByZXR1cm4gbmV3RGF0ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5ld0RhdGU7CiAgICB9OwogICAgdmFyIHdyaXRlQXJyYXlUb01lbW9yeSA9IChhcnJheSwgYnVmZmVyKSA9PiB7CiAgICAgIEhFQVA4LnNldChhcnJheSwgYnVmZmVyKTsKICAgIH07CiAgICB2YXIgX3N0cmZ0aW1lID0gKHMsIG1heHNpemUsIGZvcm1hdCwgdG0pID0+IHsKICAgICAgdmFyIHRtX3pvbmUgPSBIRUFQVTMyWyh0bSArIDQwKSA+PiAyXTsKICAgICAgdmFyIGRhdGUgPSB7CiAgICAgICAgdG1fc2VjOiBIRUFQMzJbdG0gPj4gMl0sCiAgICAgICAgdG1fbWluOiBIRUFQMzJbKHRtICsgNCkgPj4gMl0sCiAgICAgICAgdG1faG91cjogSEVBUDMyWyh0bSArIDgpID4+IDJdLAogICAgICAgIHRtX21kYXk6IEhFQVAzMlsodG0gKyAxMikgPj4gMl0sCiAgICAgICAgdG1fbW9uOiBIRUFQMzJbKHRtICsgMTYpID4+IDJdLAogICAgICAgIHRtX3llYXI6IEhFQVAzMlsodG0gKyAyMCkgPj4gMl0sCiAgICAgICAgdG1fd2RheTogSEVBUDMyWyh0bSArIDI0KSA+PiAyXSwKICAgICAgICB0bV95ZGF5OiBIRUFQMzJbKHRtICsgMjgpID4+IDJdLAogICAgICAgIHRtX2lzZHN0OiBIRUFQMzJbKHRtICsgMzIpID4+IDJdLAogICAgICAgIHRtX2dtdG9mZjogSEVBUDMyWyh0bSArIDM2KSA+PiAyXSwKICAgICAgICB0bV96b25lOiB0bV96b25lID8gVVRGOFRvU3RyaW5nKHRtX3pvbmUpIDogJycKICAgICAgfTsKICAgICAgdmFyIHBhdHRlcm4gPSBVVEY4VG9TdHJpbmcoZm9ybWF0KTsKICAgICAgdmFyIEVYUEFOU0lPTl9SVUxFU18xID0gewogICAgICAgICclYyc6ICclYSAlYiAlZCAlSDolTTolUyAlWScsCiAgICAgICAgJyVEJzogJyVtLyVkLyV5JywKICAgICAgICAnJUYnOiAnJVktJW0tJWQnLAogICAgICAgICclaCc6ICclYicsCiAgICAgICAgJyVyJzogJyVJOiVNOiVTICVwJywKICAgICAgICAnJVInOiAnJUg6JU0nLAogICAgICAgICclVCc6ICclSDolTTolUycsCiAgICAgICAgJyV4JzogJyVtLyVkLyV5JywKICAgICAgICAnJVgnOiAnJUg6JU06JVMnLAogICAgICAgICclRWMnOiAnJWMnLAogICAgICAgICclRUMnOiAnJUMnLAogICAgICAgICclRXgnOiAnJW0vJWQvJXknLAogICAgICAgICclRVgnOiAnJUg6JU06JVMnLAogICAgICAgICclRXknOiAnJXknLAogICAgICAgICclRVknOiAnJVknLAogICAgICAgICclT2QnOiAnJWQnLAogICAgICAgICclT2UnOiAnJWUnLAogICAgICAgICclT0gnOiAnJUgnLAogICAgICAgICclT0knOiAnJUknLAogICAgICAgICclT20nOiAnJW0nLAogICAgICAgICclT00nOiAnJU0nLAogICAgICAgICclT1MnOiAnJVMnLAogICAgICAgICclT3UnOiAnJXUnLAogICAgICAgICclT1UnOiAnJVUnLAogICAgICAgICclT1YnOiAnJVYnLAogICAgICAgICclT3cnOiAnJXcnLAogICAgICAgICclT1cnOiAnJVcnLAogICAgICAgICclT3knOiAnJXknCiAgICAgIH07CiAgICAgIGZvciAodmFyIHJ1bGUgaW4gRVhQQU5TSU9OX1JVTEVTXzEpIHsKICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwgJ2cnKSwgRVhQQU5TSU9OX1JVTEVTXzFbcnVsZV0pOwogICAgICB9CiAgICAgIHZhciBXRUVLREFZUyA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTsKICAgICAgdmFyIE1PTlRIUyA9IFsKICAgICAgICAnSmFudWFyeScsCiAgICAgICAgJ0ZlYnJ1YXJ5JywKICAgICAgICAnTWFyY2gnLAogICAgICAgICdBcHJpbCcsCiAgICAgICAgJ01heScsCiAgICAgICAgJ0p1bmUnLAogICAgICAgICdKdWx5JywKICAgICAgICAnQXVndXN0JywKICAgICAgICAnU2VwdGVtYmVyJywKICAgICAgICAnT2N0b2JlcicsCiAgICAgICAgJ05vdmVtYmVyJywKICAgICAgICAnRGVjZW1iZXInCiAgICAgIF07CiAgICAgIGZ1bmN0aW9uIGxlYWRpbmdTb21ldGhpbmcodmFsdWUsIGRpZ2l0cywgY2hhcmFjdGVyKSB7CiAgICAgICAgdmFyIHN0ciA9IHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2YWx1ZSB8fCAnJzsKICAgICAgICB3aGlsZSAoc3RyLmxlbmd0aCA8IGRpZ2l0cykgewogICAgICAgICAgc3RyID0gY2hhcmFjdGVyWzBdICsgc3RyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGxlYWRpbmdOdWxscyh2YWx1ZSwgZGlnaXRzKSB7CiAgICAgICAgcmV0dXJuIGxlYWRpbmdTb21ldGhpbmcodmFsdWUsIGRpZ2l0cywgJzAnKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBjb21wYXJlQnlEYXkoZGF0ZTEsIGRhdGUyKSB7CiAgICAgICAgZnVuY3Rpb24gc2duKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUgPCAwID8gLTEgOiB2YWx1ZSA+IDAgPyAxIDogMDsKICAgICAgICB9CiAgICAgICAgdmFyIGNvbXBhcmU7CiAgICAgICAgaWYgKChjb21wYXJlID0gc2duKGRhdGUxLmdldEZ1bGxZZWFyKCkgLSBkYXRlMi5nZXRGdWxsWWVhcigpKSkgPT09IDApIHsKICAgICAgICAgIGlmICgoY29tcGFyZSA9IHNnbihkYXRlMS5nZXRNb250aCgpIC0gZGF0ZTIuZ2V0TW9udGgoKSkpID09PSAwKSB7CiAgICAgICAgICAgIGNvbXBhcmUgPSBzZ24oZGF0ZTEuZ2V0RGF0ZSgpIC0gZGF0ZTIuZ2V0RGF0ZSgpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbXBhcmU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZ2V0Rmlyc3RXZWVrU3RhcnREYXRlKGphbkZvdXJ0aCkgewogICAgICAgIHN3aXRjaCAoamFuRm91cnRoLmdldERheSgpKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKSAtIDEsIDExLCAyOSk7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHJldHVybiBqYW5Gb3VydGg7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKSwgMCwgMyk7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKSwgMCwgMik7CiAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKSwgMCwgMSk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKSAtIDEsIDExLCAzMSk7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShqYW5Gb3VydGguZ2V0RnVsbFllYXIoKSAtIDEsIDExLCAzMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGdldFdlZWtCYXNlZFllYXIoZGF0ZSkgewogICAgICAgIHZhciB0aGlzRGF0ZSA9IGFkZERheXMobmV3IERhdGUoZGF0ZS50bV95ZWFyICsgMTkwMCwgMCwgMSksIGRhdGUudG1feWRheSk7CiAgICAgICAgdmFyIGphbkZvdXJ0aFRoaXNZZWFyID0gbmV3IERhdGUodGhpc0RhdGUuZ2V0RnVsbFllYXIoKSwgMCwgNCk7CiAgICAgICAgdmFyIGphbkZvdXJ0aE5leHRZZWFyID0gbmV3IERhdGUodGhpc0RhdGUuZ2V0RnVsbFllYXIoKSArIDEsIDAsIDQpOwogICAgICAgIHZhciBmaXJzdFdlZWtTdGFydFRoaXNZZWFyID0gZ2V0Rmlyc3RXZWVrU3RhcnREYXRlKGphbkZvdXJ0aFRoaXNZZWFyKTsKICAgICAgICB2YXIgZmlyc3RXZWVrU3RhcnROZXh0WWVhciA9IGdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGhOZXh0WWVhcik7CiAgICAgICAgaWYgKGNvbXBhcmVCeURheShmaXJzdFdlZWtTdGFydFRoaXNZZWFyLCB0aGlzRGF0ZSkgPD0gMCkgewogICAgICAgICAgaWYgKGNvbXBhcmVCeURheShmaXJzdFdlZWtTdGFydE5leHRZZWFyLCB0aGlzRGF0ZSkgPD0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpc0RhdGUuZ2V0RnVsbFllYXIoKSArIDE7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpc0RhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkgLSAxOwogICAgICB9CiAgICAgIHZhciBFWFBBTlNJT05fUlVMRVNfMiA9IHsKICAgICAgICAnJWEnOiAoZGF0ZSkgPT4gV0VFS0RBWVNbZGF0ZS50bV93ZGF5XS5zdWJzdHJpbmcoMCwgMyksCiAgICAgICAgJyVBJzogKGRhdGUpID0+IFdFRUtEQVlTW2RhdGUudG1fd2RheV0sCiAgICAgICAgJyViJzogKGRhdGUpID0+IE1PTlRIU1tkYXRlLnRtX21vbl0uc3Vic3RyaW5nKDAsIDMpLAogICAgICAgICclQic6IChkYXRlKSA9PiBNT05USFNbZGF0ZS50bV9tb25dLAogICAgICAgICclQyc6IChkYXRlKSA9PiB7CiAgICAgICAgICB2YXIgeWVhciA9IGRhdGUudG1feWVhciArIDE5MDA7CiAgICAgICAgICByZXR1cm4gbGVhZGluZ051bGxzKCh5ZWFyIC8gMTAwKSB8IDAsIDIpOwogICAgICAgIH0sCiAgICAgICAgJyVkJzogKGRhdGUpID0+IGxlYWRpbmdOdWxscyhkYXRlLnRtX21kYXksIDIpLAogICAgICAgICclZSc6IChkYXRlKSA9PiBsZWFkaW5nU29tZXRoaW5nKGRhdGUudG1fbWRheSwgMiwgJyAnKSwKICAgICAgICAnJWcnOiAoZGF0ZSkgPT4gZ2V0V2Vla0Jhc2VkWWVhcihkYXRlKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwKICAgICAgICAnJUcnOiBnZXRXZWVrQmFzZWRZZWFyLAogICAgICAgICclSCc6IChkYXRlKSA9PiBsZWFkaW5nTnVsbHMoZGF0ZS50bV9ob3VyLCAyKSwKICAgICAgICAnJUknOiAoZGF0ZSkgPT4gewogICAgICAgICAgdmFyIHR3ZWx2ZUhvdXIgPSBkYXRlLnRtX2hvdXI7CiAgICAgICAgICBpZiAodHdlbHZlSG91ciA9PSAwKSB7CiAgICAgICAgICAgIHR3ZWx2ZUhvdXIgPSAxMjsKICAgICAgICAgIH0gZWxzZSBpZiAodHdlbHZlSG91ciA+IDEyKSB7CiAgICAgICAgICAgIHR3ZWx2ZUhvdXIgLT0gMTI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbGVhZGluZ051bGxzKHR3ZWx2ZUhvdXIsIDIpOwogICAgICAgIH0sCiAgICAgICAgJyVqJzogKGRhdGUpID0+CiAgICAgICAgICBsZWFkaW5nTnVsbHMoCiAgICAgICAgICAgIGRhdGUudG1fbWRheSArCiAgICAgICAgICAgICAgYXJyYXlTdW0oaXNMZWFwWWVhcihkYXRlLnRtX3llYXIgKyAxOTAwKSA/IE1PTlRIX0RBWVNfTEVBUCA6IE1PTlRIX0RBWVNfUkVHVUxBUiwgZGF0ZS50bV9tb24gLSAxKSwKICAgICAgICAgICAgMwogICAgICAgICAgKSwKICAgICAgICAnJW0nOiAoZGF0ZSkgPT4gbGVhZGluZ051bGxzKGRhdGUudG1fbW9uICsgMSwgMiksCiAgICAgICAgJyVNJzogKGRhdGUpID0+IGxlYWRpbmdOdWxscyhkYXRlLnRtX21pbiwgMiksCiAgICAgICAgJyVuJzogKCkgPT4gJ1xuJywKICAgICAgICAnJXAnOiAoZGF0ZSkgPT4gewogICAgICAgICAgaWYgKGRhdGUudG1faG91ciA+PSAwICYmIGRhdGUudG1faG91ciA8IDEyKSB7CiAgICAgICAgICAgIHJldHVybiAnQU0nOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuICdQTSc7CiAgICAgICAgfSwKICAgICAgICAnJVMnOiAoZGF0ZSkgPT4gbGVhZGluZ051bGxzKGRhdGUudG1fc2VjLCAyKSwKICAgICAgICAnJXQnOiAoKSA9PiAnXHQnLAogICAgICAgICcldSc6IChkYXRlKSA9PiBkYXRlLnRtX3dkYXkgfHwgNywKICAgICAgICAnJVUnOiAoZGF0ZSkgPT4gewogICAgICAgICAgdmFyIGRheXMgPSBkYXRlLnRtX3lkYXkgKyA3IC0gZGF0ZS50bV93ZGF5OwogICAgICAgICAgcmV0dXJuIGxlYWRpbmdOdWxscyhNYXRoLmZsb29yKGRheXMgLyA3KSwgMik7CiAgICAgICAgfSwKICAgICAgICAnJVYnOiAoZGF0ZSkgPT4gewogICAgICAgICAgdmFyIHZhbCA9IE1hdGguZmxvb3IoKGRhdGUudG1feWRheSArIDcgLSAoKGRhdGUudG1fd2RheSArIDYpICUgNykpIC8gNyk7CiAgICAgICAgICBpZiAoKGRhdGUudG1fd2RheSArIDM3MSAtIGRhdGUudG1feWRheSAtIDIpICUgNyA8PSAyKSB7CiAgICAgICAgICAgIHZhbCsrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCF2YWwpIHsKICAgICAgICAgICAgdmFsID0gNTI7CiAgICAgICAgICAgIHZhciBkZWMzMSA9IChkYXRlLnRtX3dkYXkgKyA3IC0gZGF0ZS50bV95ZGF5IC0gMSkgJSA3OwogICAgICAgICAgICBpZiAoZGVjMzEgPT0gNCB8fCAoZGVjMzEgPT0gNSAmJiBpc0xlYXBZZWFyKChkYXRlLnRtX3llYXIgJSA0MDApIC0gMSkpKSB7CiAgICAgICAgICAgICAgdmFsKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodmFsID09IDUzKSB7CiAgICAgICAgICAgIHZhciBqYW4xID0gKGRhdGUudG1fd2RheSArIDM3MSAtIGRhdGUudG1feWRheSkgJSA3OwogICAgICAgICAgICBpZiAoamFuMSAhPSA0ICYmIChqYW4xICE9IDMgfHwgIWlzTGVhcFllYXIoZGF0ZS50bV95ZWFyKSkpIHsKICAgICAgICAgICAgICB2YWwgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbGVhZGluZ051bGxzKHZhbCwgMik7CiAgICAgICAgfSwKICAgICAgICAnJXcnOiAoZGF0ZSkgPT4gZGF0ZS50bV93ZGF5LAogICAgICAgICclVyc6IChkYXRlKSA9PiB7CiAgICAgICAgICB2YXIgZGF5cyA9IGRhdGUudG1feWRheSArIDcgLSAoKGRhdGUudG1fd2RheSArIDYpICUgNyk7CiAgICAgICAgICByZXR1cm4gbGVhZGluZ051bGxzKE1hdGguZmxvb3IoZGF5cyAvIDcpLCAyKTsKICAgICAgICB9LAogICAgICAgICcleSc6IChkYXRlKSA9PiAoZGF0ZS50bV95ZWFyICsgMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksCiAgICAgICAgJyVZJzogKGRhdGUpID0+IGRhdGUudG1feWVhciArIDE5MDAsCiAgICAgICAgJyV6JzogKGRhdGUpID0+IHsKICAgICAgICAgIHZhciBvZmYgPSBkYXRlLnRtX2dtdG9mZjsKICAgICAgICAgIHZhciBhaGVhZCA9IG9mZiA+PSAwOwogICAgICAgICAgb2ZmID0gTWF0aC5hYnMob2ZmKSAvIDYwOwogICAgICAgICAgb2ZmID0gKG9mZiAvIDYwKSAqIDEwMCArIChvZmYgJSA2MCk7CiAgICAgICAgICByZXR1cm4gKGFoZWFkID8gJysnIDogJy0nKSArIFN0cmluZygnMDAwMCcgKyBvZmYpLnNsaWNlKC00KTsKICAgICAgICB9LAogICAgICAgICclWic6IChkYXRlKSA9PiBkYXRlLnRtX3pvbmUsCiAgICAgICAgJyUlJzogKCkgPT4gJyUnCiAgICAgIH07CiAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoLyUlL2csICdcMFwwJyk7CiAgICAgIGZvciAodmFyIHJ1bGUgaW4gRVhQQU5TSU9OX1JVTEVTXzIpIHsKICAgICAgICBpZiAocGF0dGVybi5pbmNsdWRlcyhydWxlKSkgewogICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZShuZXcgUmVnRXhwKHJ1bGUsICdnJyksIEVYUEFOU0lPTl9SVUxFU18yW3J1bGVdKGRhdGUpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvXDBcMC9nLCAnJScpOwogICAgICB2YXIgYnl0ZXMgPSBpbnRBcnJheUZyb21TdHJpbmcocGF0dGVybiwgZmFsc2UpOwogICAgICBpZiAoYnl0ZXMubGVuZ3RoID4gbWF4c2l6ZSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHdyaXRlQXJyYXlUb01lbW9yeShieXRlcywgcyk7CiAgICAgIHJldHVybiBieXRlcy5sZW5ndGggLSAxOwogICAgfTsKICAgIHZhciBfc3RyZnRpbWVfbCA9IChzLCBtYXhzaXplLCBmb3JtYXQsIHRtLCBsb2MpID0+IF9zdHJmdGltZShzLCBtYXhzaXplLCBmb3JtYXQsIHRtKTsKICAgIHZhciBoYW5kbGVFeGNlcHRpb24gPSAoZSkgPT4gewogICAgICBpZiAoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMgfHwgZSA9PSAndW53aW5kJykgewogICAgICAgIHJldHVybiBFWElUU1RBVFVTOwogICAgICB9CiAgICAgIHF1aXRfKDEsIGUpOwogICAgfTsKICAgIHZhciB3YXNtVGFibGVNaXJyb3IgPSBbXTsKICAgIHZhciB3YXNtVGFibGU7CiAgICB2YXIgZ2V0V2FzbVRhYmxlRW50cnkgPSAoZnVuY1B0cikgPT4gewogICAgICB2YXIgZnVuYyA9IHdhc21UYWJsZU1pcnJvcltmdW5jUHRyXTsKICAgICAgaWYgKCFmdW5jKSB7CiAgICAgICAgaWYgKGZ1bmNQdHIgPj0gd2FzbVRhYmxlTWlycm9yLmxlbmd0aCkgewogICAgICAgICAgd2FzbVRhYmxlTWlycm9yLmxlbmd0aCA9IGZ1bmNQdHIgKyAxOwogICAgICAgIH0KICAgICAgICB3YXNtVGFibGVNaXJyb3JbZnVuY1B0cl0gPSBmdW5jID0gd2FzbVRhYmxlLmdldChmdW5jUHRyKTsKICAgICAgfQogICAgICByZXR1cm4gZnVuYzsKICAgIH07CiAgICB2YXIgRlNOb2RlID0gZnVuY3Rpb24gKHBhcmVudCwgbmFtZSwgbW9kZSwgcmRldikgewogICAgICBpZiAoIXBhcmVudCkgewogICAgICAgIHBhcmVudCA9IHRoaXM7CiAgICAgIH0KICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIHRoaXMubW91bnQgPSBwYXJlbnQubW91bnQ7CiAgICAgIHRoaXMubW91bnRlZCA9IG51bGw7CiAgICAgIHRoaXMuaWQgPSBGUy5uZXh0SW5vZGUrKzsKICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgdGhpcy5tb2RlID0gbW9kZTsKICAgICAgdGhpcy5ub2RlX29wcyA9IHt9OwogICAgICB0aGlzLnN0cmVhbV9vcHMgPSB7fTsKICAgICAgdGhpcy5yZGV2ID0gcmRldjsKICAgIH07CiAgICB2YXIgcmVhZE1vZGUgPSAyOTIgfCA3MzsKICAgIHZhciB3cml0ZU1vZGUgPSAxNDY7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGU05vZGUucHJvdG90eXBlLCB7CiAgICAgIHJlYWQ6IHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiAodGhpcy5tb2RlICYgcmVhZE1vZGUpID09PSByZWFkTW9kZTsKICAgICAgICB9LAogICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgdmFsID8gKHRoaXMubW9kZSB8PSByZWFkTW9kZSkgOiAodGhpcy5tb2RlICY9IH5yZWFkTW9kZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICB3cml0ZTogewogICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuICh0aGlzLm1vZGUgJiB3cml0ZU1vZGUpID09PSB3cml0ZU1vZGU7CiAgICAgICAgfSwKICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgIHZhbCA/ICh0aGlzLm1vZGUgfD0gd3JpdGVNb2RlKSA6ICh0aGlzLm1vZGUgJj0gfndyaXRlTW9kZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBpc0ZvbGRlcjogewogICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIEZTLmlzRGlyKHRoaXMubW9kZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBpc0RldmljZTogewogICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIEZTLmlzQ2hyZGV2KHRoaXMubW9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIEZTLkZTTm9kZSA9IEZTTm9kZTsKICAgIEZTLmNyZWF0ZVByZWxvYWRlZEZpbGUgPSBGU19jcmVhdGVQcmVsb2FkZWRGaWxlOwogICAgRlMuc3RhdGljSW5pdCgpOwogICAgdmFyIHdhc21JbXBvcnRzID0gewogICAgICBfX2N4YV90aHJvdzogX19fY3hhX3Rocm93LAogICAgICBfX3N5c2NhbGxfZmNudGw2NDogX19fc3lzY2FsbF9mY250bDY0LAogICAgICBfX3N5c2NhbGxfZnN0YXQ2NDogX19fc3lzY2FsbF9mc3RhdDY0LAogICAgICBfX3N5c2NhbGxfaW9jdGw6IF9fX3N5c2NhbGxfaW9jdGwsCiAgICAgIF9fc3lzY2FsbF9sc3RhdDY0OiBfX19zeXNjYWxsX2xzdGF0NjQsCiAgICAgIF9fc3lzY2FsbF9uZXdmc3RhdGF0OiBfX19zeXNjYWxsX25ld2ZzdGF0YXQsCiAgICAgIF9fc3lzY2FsbF9vcGVuYXQ6IF9fX3N5c2NhbGxfb3BlbmF0LAogICAgICBfX3N5c2NhbGxfc3RhdDY0OiBfX19zeXNjYWxsX3N0YXQ2NCwKICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWM6IF9fZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYywKICAgICAgX2Vtc2NyaXB0ZW5fdGhyb3dfbG9uZ2ptcDogX19lbXNjcmlwdGVuX3Rocm93X2xvbmdqbXAsCiAgICAgIGFib3J0OiBfYWJvcnQsCiAgICAgIGVtc2NyaXB0ZW5fZGF0ZV9ub3c6IF9lbXNjcmlwdGVuX2RhdGVfbm93LAogICAgICBlbXNjcmlwdGVuX2dldF9oZWFwX21heDogX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfbWF4LAogICAgICBlbXNjcmlwdGVuX2dldF9ub3c6IF9lbXNjcmlwdGVuX2dldF9ub3csCiAgICAgIGVtc2NyaXB0ZW5fbWVtY3B5X2pzOiBfZW1zY3JpcHRlbl9tZW1jcHlfanMsCiAgICAgIGVtc2NyaXB0ZW5fcmVzaXplX2hlYXA6IF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLAogICAgICBlbnZpcm9uX2dldDogX2Vudmlyb25fZ2V0LAogICAgICBlbnZpcm9uX3NpemVzX2dldDogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICBleGl0OiBfZXhpdCwKICAgICAgZmRfY2xvc2U6IF9mZF9jbG9zZSwKICAgICAgZmRfcmVhZDogX2ZkX3JlYWQsCiAgICAgIGZkX3NlZWs6IF9mZF9zZWVrLAogICAgICBmZF93cml0ZTogX2ZkX3dyaXRlLAogICAgICBpbnZva2VfdmlpOiBpbnZva2VfdmlpLAogICAgICBzdHJmdGltZV9sOiBfc3RyZnRpbWVfbAogICAgfTsKICAgIHZhciB3YXNtRXhwb3J0cyA9IGNyZWF0ZVdhc20oKTsKICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSB3YXNtRXhwb3J0c1snX193YXNtX2NhbGxfY3RvcnMnXTsKICAgIHZhciBfbmV3X21lbW9yeSA9IChNb2R1bGVbJ19uZXdfbWVtb3J5J10gPSB3YXNtRXhwb3J0c1snbmV3X21lbW9yeSddKTsKICAgIHZhciBfZnJlZV9tZW1vcnkgPSAoTW9kdWxlWydfZnJlZV9tZW1vcnknXSA9IHdhc21FeHBvcnRzWydmcmVlX21lbW9yeSddKTsKICAgIHZhciBfZ2V0X3JldHVybl9uX3BhY2tldHMgPSAoTW9kdWxlWydfZ2V0X3JldHVybl9uX3BhY2tldHMnXSA9IHdhc21FeHBvcnRzWydnZXRfcmV0dXJuX25fcGFja2V0cyddKTsKICAgIHZhciBfZ2V0X3JldHVybl9wYWNrZXRfbGVuID0gKE1vZHVsZVsnX2dldF9yZXR1cm5fcGFja2V0X2xlbiddID0gd2FzbUV4cG9ydHNbJ2dldF9yZXR1cm5fcGFja2V0X2xlbiddKTsKICAgIHZhciBfZ2V0X3JldHVybl9wYWNrZXQgPSAoTW9kdWxlWydfZ2V0X3JldHVybl9wYWNrZXQnXSA9IHdhc21FeHBvcnRzWydnZXRfcmV0dXJuX3BhY2tldCddKTsKICAgIHZhciBfY2xlYXJfcmV0dXJuX3BhY2tldHMgPSAoTW9kdWxlWydfY2xlYXJfcmV0dXJuX3BhY2tldHMnXSA9IHdhc21FeHBvcnRzWydjbGVhcl9yZXR1cm5fcGFja2V0cyddKTsKICAgIHZhciBfcHJvY2Vzc19ldmVudF9kYXRhID0gKE1vZHVsZVsnX3Byb2Nlc3NfZXZlbnRfZGF0YSddID0gd2FzbUV4cG9ydHNbJ3Byb2Nlc3NfZXZlbnRfZGF0YSddKTsKICAgIHZhciBfbWFpbiA9IChNb2R1bGVbJ19tYWluJ10gPSB3YXNtRXhwb3J0c1snbWFpbiddKTsKICAgIHZhciBfbWFsbG9jID0gd2FzbUV4cG9ydHNbJ21hbGxvYyddOwogICAgdmFyIF9lbXNjcmlwdGVuX2J1aWx0aW5fbWVtYWxpZ24gPSB3YXNtRXhwb3J0c1snZW1zY3JpcHRlbl9idWlsdGluX21lbWFsaWduJ107CiAgICB2YXIgX3NldFRocmV3ID0gd2FzbUV4cG9ydHNbJ3NldFRocmV3J107CiAgICB2YXIgc2V0VGVtcFJldDAgPSB3YXNtRXhwb3J0c1snc2V0VGVtcFJldDAnXTsKICAgIHZhciBzdGFja1NhdmUgPSB3YXNtRXhwb3J0c1snc3RhY2tTYXZlJ107CiAgICB2YXIgc3RhY2tSZXN0b3JlID0gd2FzbUV4cG9ydHNbJ3N0YWNrUmVzdG9yZSddOwogICAgdmFyIHN0YWNrQWxsb2MgPSB3YXNtRXhwb3J0c1snc3RhY2tBbGxvYyddOwogICAgdmFyIF9fX2N4YV9pbmNyZW1lbnRfZXhjZXB0aW9uX3JlZmNvdW50ID0gd2FzbUV4cG9ydHNbJ19fY3hhX2luY3JlbWVudF9leGNlcHRpb25fcmVmY291bnQnXTsKICAgIHZhciBfX19jeGFfaXNfcG9pbnRlcl90eXBlID0gd2FzbUV4cG9ydHNbJ19fY3hhX2lzX3BvaW50ZXJfdHlwZSddOwogICAgdmFyIGR5bkNhbGxfamlqaSA9IChNb2R1bGVbJ2R5bkNhbGxfamlqaSddID0gd2FzbUV4cG9ydHNbJ2R5bkNhbGxfamlqaSddKTsKICAgIHZhciBkeW5DYWxsX2lpaWogPSAoTW9kdWxlWydkeW5DYWxsX2lpaWonXSA9IHdhc21FeHBvcnRzWydkeW5DYWxsX2lpaWonXSk7CiAgICB2YXIgZHluQ2FsbF9paWlqaSA9IChNb2R1bGVbJ2R5bkNhbGxfaWlpamknXSA9IHdhc21FeHBvcnRzWydkeW5DYWxsX2lpaWppJ10pOwogICAgdmFyIGR5bkNhbGxfaWlpaWogPSAoTW9kdWxlWydkeW5DYWxsX2lpaWlqJ10gPSB3YXNtRXhwb3J0c1snZHluQ2FsbF9paWlpaiddKTsKICAgIHZhciBkeW5DYWxsX2lpaWlqaiA9IChNb2R1bGVbJ2R5bkNhbGxfaWlpaWpqJ10gPSB3YXNtRXhwb3J0c1snZHluQ2FsbF9paWlpamonXSk7CiAgICB2YXIgZHluQ2FsbF92aWlqaiA9IChNb2R1bGVbJ2R5bkNhbGxfdmlpamonXSA9IHdhc21FeHBvcnRzWydkeW5DYWxsX3ZpaWpqJ10pOwogICAgdmFyIGR5bkNhbGxfdmlpaWpqamogPSAoTW9kdWxlWydkeW5DYWxsX3ZpaWlqampqJ10gPSB3YXNtRXhwb3J0c1snZHluQ2FsbF92aWlpampqaiddKTsKICAgIHZhciBkeW5DYWxsX3ZpaWppaSA9IChNb2R1bGVbJ2R5bkNhbGxfdmlpamlpJ10gPSB3YXNtRXhwb3J0c1snZHluQ2FsbF92aWlqaWknXSk7CiAgICB2YXIgZHluQ2FsbF9paWlpaWogPSAoTW9kdWxlWydkeW5DYWxsX2lpaWlpaiddID0gd2FzbUV4cG9ydHNbJ2R5bkNhbGxfaWlpaWlqJ10pOwogICAgdmFyIGR5bkNhbGxfaWlpaWlqaiA9IChNb2R1bGVbJ2R5bkNhbGxfaWlpaWlqaiddID0gd2FzbUV4cG9ydHNbJ2R5bkNhbGxfaWlpaWlqaiddKTsKICAgIHZhciBkeW5DYWxsX2lpaWlpaWpqID0gKE1vZHVsZVsnZHluQ2FsbF9paWlpaWlqaiddID0gd2FzbUV4cG9ydHNbJ2R5bkNhbGxfaWlpaWlpamonXSk7CiAgICBmdW5jdGlvbiBpbnZva2VfdmlpKGluZGV4LCBhMSwgYTIpIHsKICAgICAgdmFyIHNwID0gc3RhY2tTYXZlKCk7CiAgICAgIHRyeSB7CiAgICAgICAgZ2V0V2FzbVRhYmxlRW50cnkoaW5kZXgpKGExLCBhMik7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBzdGFja1Jlc3RvcmUoc3ApOwogICAgICAgIGlmIChlICE9PSBlICsgMCkgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgX3NldFRocmV3KDEsIDApOwogICAgICB9CiAgICB9CiAgICB2YXIgY2FsbGVkUnVuOwogICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gZnVuY3Rpb24gcnVuQ2FsbGVyKCkgewogICAgICBpZiAoIWNhbGxlZFJ1bikgewogICAgICAgIHJ1bigpOwogICAgICB9CiAgICAgIGlmICghY2FsbGVkUnVuKSB7CiAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gcnVuQ2FsbGVyOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gY2FsbE1haW4oKSB7CiAgICAgIHZhciBlbnRyeUZ1bmN0aW9uID0gX21haW47CiAgICAgIHZhciBhcmdjID0gMDsKICAgICAgdmFyIGFyZ3YgPSAwOwogICAgICB0cnkgewogICAgICAgIHZhciByZXQgPSBlbnRyeUZ1bmN0aW9uKGFyZ2MsIGFyZ3YpOwogICAgICAgIGV4aXRKUyhyZXQsIHRydWUpOwogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gaGFuZGxlRXhjZXB0aW9uKGUpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBydW4oKSB7CiAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHByZVJ1bigpOwogICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmdW5jdGlvbiBkb1J1bigpIHsKICAgICAgICBpZiAoY2FsbGVkUnVuKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNhbGxlZFJ1biA9IHRydWU7CiAgICAgICAgTW9kdWxlWydjYWxsZWRSdW4nXSA9IHRydWU7CiAgICAgICAgaWYgKEFCT1JUKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGluaXRSdW50aW1lKCk7CiAgICAgICAgcHJlTWFpbigpOwogICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICBpZiAoTW9kdWxlWydvblJ1bnRpbWVJbml0aWFsaXplZCddKSB7CiAgICAgICAgICBNb2R1bGVbJ29uUnVudGltZUluaXRpYWxpemVkJ10oKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNob3VsZFJ1bk5vdykgewogICAgICAgICAgY2FsbE1haW4oKTsKICAgICAgICB9CiAgICAgICAgcG9zdFJ1bigpOwogICAgICB9CiAgICAgIGlmIChNb2R1bGVbJ3NldFN0YXR1cyddKSB7CiAgICAgICAgTW9kdWxlWydzZXRTdGF0dXMnXSgnUnVubmluZy4uLicpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIE1vZHVsZVsnc2V0U3RhdHVzJ10oJycpOwogICAgICAgICAgfSwgMSk7CiAgICAgICAgICBkb1J1bigpOwogICAgICAgIH0sIDEpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvUnVuKCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChNb2R1bGVbJ3ByZUluaXQnXSkgewogICAgICBpZiAodHlwZW9mIE1vZHVsZVsncHJlSW5pdCddID09ICdmdW5jdGlvbicpIHsKICAgICAgICBNb2R1bGVbJ3ByZUluaXQnXSA9IFtNb2R1bGVbJ3ByZUluaXQnXV07CiAgICAgIH0KICAgICAgd2hpbGUgKE1vZHVsZVsncHJlSW5pdCddLmxlbmd0aCA+IDApIHsKICAgICAgICBNb2R1bGVbJ3ByZUluaXQnXS5wb3AoKSgpOwogICAgICB9CiAgICB9CiAgICB2YXIgc2hvdWxkUnVuTm93ID0gdHJ1ZTsKICAgIGlmIChNb2R1bGVbJ25vSW5pdGlhbFJ1biddKSB7CiAgICAgIHNob3VsZFJ1bk5vdyA9IGZhbHNlOwogICAgfQogICAgcnVuKCk7CgogICAgcmV0dXJuIG1vZHVsZUFyZzsKICB9Owp9KSgpOwpleHBvcnQgZGVmYXVsdCBNb2R1bGU7Cg==";
2
- export {
3
- I as default
4
- };
5
- //# sourceMappingURL=dac_simd-6C-KoVW4.js.map